/* Built for whs v2.2.0-beta.0 */ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } /* WhitestormJS Framework v2.2.0-alpha.0 */function createCommonjsModule(fn,module){return module={exports:{}},fn(module,module.exports),module.exports;}var runtime=createCommonjsModule(function(module){/** * Copyright (c) 2014-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */!function(global){var Op=Object.prototype;var hasOwn=Op.hasOwnProperty;var undefined;// More compressible than void 0. var $Symbol=typeof Symbol==="function"?Symbol:{};var iteratorSymbol=$Symbol.iterator||"@@iterator";var asyncIteratorSymbol=$Symbol.asyncIterator||"@@asyncIterator";var toStringTagSymbol=$Symbol.toStringTag||"@@toStringTag";var runtime=global.regeneratorRuntime;if(runtime){{// If regeneratorRuntime is defined globally and we're in a module, // make the exports object identical to regeneratorRuntime. module.exports=runtime;}// Don't bother evaluating the rest of this file if the runtime was // already defined globally. return;}// Define the runtime globally (as expected by generated code) as either // module.exports (if we're in a module) or a new, empty object. runtime=global.regeneratorRuntime=module.exports;function wrap(innerFn,outerFn,self,tryLocsList){// If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator. var protoGenerator=outerFn&&outerFn.prototype instanceof Generator?outerFn:Generator;var generator=Object.create(protoGenerator.prototype);var context=new Context(tryLocsList||[]);// The ._invoke method unifies the implementations of the .next, // .throw, and .return methods. generator._invoke=makeInvokeMethod(innerFn,self,context);return generator;}runtime.wrap=wrap;// Try/catch helper to minimize deoptimizations. Returns a completion // record like context.tryEntries[i].completion. This interface could // have been (and was previously) designed to take a closure to be // invoked without arguments, but in all the cases we care about we // already have an existing method we want to call, so there's no need // to create a new function object. We can even get away with assuming // the method takes exactly one argument, since that happens to be true // in every case, so we don't have to touch the arguments object. The // only additional allocation required is the completion record, which // has a stable shape and so hopefully should be cheap to allocate. function tryCatch(fn,obj,arg){try{return {type:"normal",arg:fn.call(obj,arg)};}catch(err){return {type:"throw",arg:err};}}var GenStateSuspendedStart="suspendedStart";var GenStateSuspendedYield="suspendedYield";var GenStateExecuting="executing";var GenStateCompleted="completed";// Returning this object from the innerFn has the same effect as // breaking out of the dispatch switch statement. var ContinueSentinel={};// Dummy constructor functions that we use as the .constructor and // .constructor.prototype properties for functions that return Generator // objects. For full spec compliance, you may wish to configure your // minifier not to mangle the names of these two functions. function Generator(){}function GeneratorFunction(){}function GeneratorFunctionPrototype(){}// This is a polyfill for %IteratorPrototype% for environments that // don't natively support it. var IteratorPrototype={};IteratorPrototype[iteratorSymbol]=function(){return this;};var getProto=Object.getPrototypeOf;var NativeIteratorPrototype=getProto&&getProto(getProto(values([])));if(NativeIteratorPrototype&&NativeIteratorPrototype!==Op&&hasOwn.call(NativeIteratorPrototype,iteratorSymbol)){// This environment has a native %IteratorPrototype%; use it instead // of the polyfill. IteratorPrototype=NativeIteratorPrototype;}var Gp=GeneratorFunctionPrototype.prototype=Generator.prototype=Object.create(IteratorPrototype);GeneratorFunction.prototype=Gp.constructor=GeneratorFunctionPrototype;GeneratorFunctionPrototype.constructor=GeneratorFunction;GeneratorFunctionPrototype[toStringTagSymbol]=GeneratorFunction.displayName="GeneratorFunction";// Helper for defining the .next, .throw, and .return methods of the // Iterator interface in terms of a single ._invoke method. function defineIteratorMethods(prototype){["next","throw","return"].forEach(function(method){prototype[method]=function(arg){return this._invoke(method,arg);};});}runtime.isGeneratorFunction=function(genFun){var ctor=typeof genFun==="function"&&genFun.constructor;return ctor?ctor===GeneratorFunction||// For the native GeneratorFunction constructor, the best we can // do is to check its .name property. (ctor.displayName||ctor.name)==="GeneratorFunction":false;};runtime.mark=function(genFun){if(Object.setPrototypeOf){Object.setPrototypeOf(genFun,GeneratorFunctionPrototype);}else{genFun.__proto__=GeneratorFunctionPrototype;if(!(toStringTagSymbol in genFun)){genFun[toStringTagSymbol]="GeneratorFunction";}}genFun.prototype=Object.create(Gp);return genFun;};// Within the body of any async function, `await x` is transformed to // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test // `hasOwn.call(value, "__await")` to determine if the yielded value is // meant to be awaited. runtime.awrap=function(arg){return {__await:arg};};function AsyncIterator(generator){function invoke(method,arg,resolve,reject){var record=tryCatch(generator[method],generator,arg);if(record.type==="throw"){reject(record.arg);}else{var result=record.arg;var value=result.value;if(value&&typeof value==="object"&&hasOwn.call(value,"__await")){return Promise.resolve(value.__await).then(function(value){invoke("next",value,resolve,reject);},function(err){invoke("throw",err,resolve,reject);});}return Promise.resolve(value).then(function(unwrapped){// When a yielded Promise is resolved, its final value becomes // the .value of the Promise<{value,done}> result for the // current iteration. If the Promise is rejected, however, the // result for this iteration will be rejected with the same // reason. Note that rejections of yielded Promises are not // thrown back into the generator function, as is the case // when an awaited Promise is rejected. This difference in // behavior between yield and await is important, because it // allows the consumer to decide what to do with the yielded // rejection (swallow it and continue, manually .throw it back // into the generator, abandon iteration, whatever). With // await, by contrast, there is no opportunity to examine the // rejection reason outside the generator function, so the // only option is to throw it from the await expression, and // let the generator function handle the exception. result.value=unwrapped;resolve(result);},reject);}}var previousPromise;function enqueue(method,arg){function callInvokeWithMethodAndArg(){return new Promise(function(resolve,reject){invoke(method,arg,resolve,reject);});}return previousPromise=// If enqueue has been called before, then we want to wait until // all previous Promises have been resolved before calling invoke, // so that results are always delivered in the correct order. If // enqueue has not been called before, then it is important to // call invoke immediately, without waiting on a callback to fire, // so that the async generator function has the opportunity to do // any necessary setup in a predictable way. This predictability // is why the Promise constructor synchronously invokes its // executor callback, and why async functions synchronously // execute code before the first await. Since we implement simple // async functions in terms of async generators, it is especially // important to get this right, even though it requires care. previousPromise?previousPromise.then(callInvokeWithMethodAndArg,// Avoid propagating failures to Promises returned by later // invocations of the iterator. callInvokeWithMethodAndArg):callInvokeWithMethodAndArg();}// Define the unified helper method that is used to implement .next, // .throw, and .return (see defineIteratorMethods). this._invoke=enqueue;}defineIteratorMethods(AsyncIterator.prototype);AsyncIterator.prototype[asyncIteratorSymbol]=function(){return this;};runtime.AsyncIterator=AsyncIterator;// Note that simple async functions are implemented on top of // AsyncIterator objects; they just return a Promise for the value of // the final result produced by the iterator. runtime.async=function(innerFn,outerFn,self,tryLocsList){var iter=new AsyncIterator(wrap(innerFn,outerFn,self,tryLocsList));return runtime.isGeneratorFunction(outerFn)?iter// If outerFn is a generator, return the full iterator. :iter.next().then(function(result){return result.done?result.value:iter.next();});};function makeInvokeMethod(innerFn,self,context){var state=GenStateSuspendedStart;return function invoke(method,arg){if(state===GenStateExecuting){throw new Error("Generator is already running");}if(state===GenStateCompleted){if(method==="throw"){throw arg;}// Be forgiving, per 25.3.3.3.3 of the spec: // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume return doneResult();}context.method=method;context.arg=arg;while(true){var delegate=context.delegate;if(delegate){var delegateResult=maybeInvokeDelegate(delegate,context);if(delegateResult){if(delegateResult===ContinueSentinel)continue;return delegateResult;}}if(context.method==="next"){// Setting context._sent for legacy support of Babel's // function.sent implementation. context.sent=context._sent=context.arg;}else if(context.method==="throw"){if(state===GenStateSuspendedStart){state=GenStateCompleted;throw context.arg;}context.dispatchException(context.arg);}else if(context.method==="return"){context.abrupt("return",context.arg);}state=GenStateExecuting;var record=tryCatch(innerFn,self,context);if(record.type==="normal"){// If an exception is thrown from innerFn, we leave state === // GenStateExecuting and loop back for another invocation. state=context.done?GenStateCompleted:GenStateSuspendedYield;if(record.arg===ContinueSentinel){continue;}return {value:record.arg,done:context.done};}else if(record.type==="throw"){state=GenStateCompleted;// Dispatch the exception by looping back around to the // context.dispatchException(context.arg) call above. context.method="throw";context.arg=record.arg;}}};}// Call delegate.iterator[context.method](context.arg) and handle the // result, either by returning a { value, done } result from the // delegate iterator, or by modifying context.method and context.arg, // setting context.delegate to null, and returning the ContinueSentinel. function maybeInvokeDelegate(delegate,context){var method=delegate.iterator[context.method];if(method===undefined){// A .throw or .return when the delegate iterator has no .throw // method always terminates the yield* loop. context.delegate=null;if(context.method==="throw"){if(delegate.iterator.return){// If the delegate iterator has a return method, give it a // chance to clean up. context.method="return";context.arg=undefined;maybeInvokeDelegate(delegate,context);if(context.method==="throw"){// If maybeInvokeDelegate(context) changed context.method from // "return" to "throw", let that override the TypeError below. return ContinueSentinel;}}context.method="throw";context.arg=new TypeError("The iterator does not provide a 'throw' method");}return ContinueSentinel;}var record=tryCatch(method,delegate.iterator,context.arg);if(record.type==="throw"){context.method="throw";context.arg=record.arg;context.delegate=null;return ContinueSentinel;}var info=record.arg;if(!info){context.method="throw";context.arg=new TypeError("iterator result is not an object");context.delegate=null;return ContinueSentinel;}if(info.done){// Assign the result of the finished delegate to the temporary // variable specified by delegate.resultName (see delegateYield). context[delegate.resultName]=info.value;// Resume execution at the desired location (see delegateYield). context.next=delegate.nextLoc;// If context.method was "throw" but the delegate handled the // exception, let the outer generator proceed normally. If // context.method was "next", forget context.arg since it has been // "consumed" by the delegate iterator. If context.method was // "return", allow the original .return call to continue in the // outer generator. if(context.method!=="return"){context.method="next";context.arg=undefined;}}else{// Re-yield the result returned by the delegate method. return info;}// The delegate iterator is finished, so forget it and continue with // the outer generator. context.delegate=null;return ContinueSentinel;}// Define Generator.prototype.{next,throw,return} in terms of the // unified ._invoke helper method. defineIteratorMethods(Gp);Gp[toStringTagSymbol]="Generator";// A Generator should always return itself as the iterator object when the // @@iterator function is called on it. Some browsers' implementations of the // iterator prototype chain incorrectly implement this, causing the Generator // object to not be returned from this call. This ensures that doesn't happen. // See https://github.com/facebook/regenerator/issues/274 for more details. Gp[iteratorSymbol]=function(){return this;};Gp.toString=function(){return "[object Generator]";};function pushTryEntry(locs){var entry={tryLoc:locs[0]};if(1 in locs){entry.catchLoc=locs[1];}if(2 in locs){entry.finallyLoc=locs[2];entry.afterLoc=locs[3];}this.tryEntries.push(entry);}function resetTryEntry(entry){var record=entry.completion||{};record.type="normal";delete record.arg;entry.completion=record;}function Context(tryLocsList){// The root entry object (effectively a try statement without a catch // or a finally block) gives us a place to store values thrown from // locations where there is no enclosing try statement. this.tryEntries=[{tryLoc:"root"}];tryLocsList.forEach(pushTryEntry,this);this.reset(true);}runtime.keys=function(object){var keys=[];for(var key in object){keys.push(key);}keys.reverse();// Rather than returning an object with a next method, we keep // things simple and return the next function itself. return function next(){while(keys.length){var key=keys.pop();if(key in object){next.value=key;next.done=false;return next;}}// To avoid creating an additional object, we just hang the .value // and .done properties off the next function object itself. This // also ensures that the minifier will not anonymize the function. next.done=true;return next;};};function values(iterable){if(iterable){var iteratorMethod=iterable[iteratorSymbol];if(iteratorMethod){return iteratorMethod.call(iterable);}if(typeof iterable.next==="function"){return iterable;}if(!isNaN(iterable.length)){var i=-1,next=function next(){while(++i=0;--i){var entry=this.tryEntries[i];var record=entry.completion;if(entry.tryLoc==="root"){// Exception thrown outside of any try block that could handle // it, so set the completion value of the entire function to // throw the exception. return handle("end");}if(entry.tryLoc<=this.prev){var hasCatch=hasOwn.call(entry,"catchLoc");var hasFinally=hasOwn.call(entry,"finallyLoc");if(hasCatch&&hasFinally){if(this.prev=0;--i){var entry=this.tryEntries[i];if(entry.tryLoc<=this.prev&&hasOwn.call(entry,"finallyLoc")&&this.prev=0;--i){var entry=this.tryEntries[i];if(entry.finallyLoc===finallyLoc){this.complete(entry.completion,entry.afterLoc);resetTryEntry(entry);return ContinueSentinel;}}},"catch":function(tryLoc){for(var i=this.tryEntries.length-1;i>=0;--i){var entry=this.tryEntries[i];if(entry.tryLoc===tryLoc){var record=entry.completion;if(record.type==="throw"){var thrown=record.arg;resetTryEntry(entry);}return thrown;}}// The context.catch method must only be called with a location // argument that corresponds to a known catch block. throw new Error("illegal catch attempt");},delegateYield:function(iterable,resultName,nextLoc){this.delegate={iterator:values(iterable),resultName:resultName,nextLoc:nextLoc};if(this.method==="next"){// Deliberately forget the last sent value so that we don't // accidentally pass it on to the delegate. this.arg=undefined;}return ContinueSentinel;}};}(// In sloppy mode, unbound `this` refers to the global object, fallback to // Function constructor if we're in global strict mode. That is sadly a form // of indirect eval which violates Content Security Policy. function(){return this;}()||Function("return this")());});/** * Copyright (c) 2014-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // This method of obtaining a reference to the global object needs to be // kept identical to the way it is obtained in runtime.js var g=function(){return this;}()||Function("return this")();// Use `getOwnPropertyNames` because not all browsers support calling // `hasOwnProperty` on the global `self` object in a worker. See #183. var hadRuntime=g.regeneratorRuntime&&Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime")>=0;// Save the old regeneratorRuntime in case it needs to be restored later. var oldRuntime=hadRuntime&&g.regeneratorRuntime;// Force reevalutation of runtime.js. g.regeneratorRuntime=undefined;var runtimeModule=runtime;if(hadRuntime){// Restore the original runtime. g.regeneratorRuntime=oldRuntime;}else{// Remove the global property added by runtime.js. try{delete g.regeneratorRuntime;}catch(e){g.regeneratorRuntime=undefined;}}var regenerator=runtimeModule;// 7.1.4 ToInteger var ceil=Math.ceil;var floor=Math.floor;var _toInteger=function(it){return isNaN(it=+it)?0:(it>0?floor:ceil)(it);};// 7.2.1 RequireObjectCoercible(argument) var _defined=function(it){if(it==undefined)throw TypeError("Can't call method on "+it);return it;};// true -> String#at // false -> String#codePointAt var _stringAt=function(TO_STRING){return function(that,pos){var s=String(_defined(that));var i=_toInteger(pos);var l=s.length;var a,b;if(i<0||i>=l)return TO_STRING?'':undefined;a=s.charCodeAt(i);return a<0xd800||a>0xdbff||i+1===l||(b=s.charCodeAt(i+1))<0xdc00||b>0xdfff?TO_STRING?s.charAt(i):a:TO_STRING?s.slice(i,i+2):(a-0xd800<<10)+(b-0xdc00)+0x10000;};};var _library=true;var _global=createCommonjsModule(function(module){// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 var global=module.exports=typeof window!='undefined'&&window.Math==Math?window:typeof self!='undefined'&&self.Math==Math?self// eslint-disable-next-line no-new-func :Function('return this')();if(typeof __g=='number')__g=global;// eslint-disable-line no-undef });var _core=createCommonjsModule(function(module){var core=module.exports={version:'2.5.6'};if(typeof __e=='number')__e=core;// eslint-disable-line no-undef });var _core_1=_core.version;var _aFunction=function(it){if(typeof it!='function')throw TypeError(it+' is not a function!');return it;};// optional / simple context binding var _ctx=function(fn,that,length){_aFunction(fn);if(that===undefined)return fn;switch(length){case 1:return function(a){return fn.call(that,a);};case 2:return function(a,b){return fn.call(that,a,b);};case 3:return function(a,b,c){return fn.call(that,a,b,c);};}return function()/* ...args */{return fn.apply(that,arguments);};};var _isObject=function(it){return typeof it==='object'?it!==null:typeof it==='function';};var _anObject=function(it){if(!_isObject(it))throw TypeError(it+' is not an object!');return it;};var _fails=function(exec){try{return !!exec();}catch(e){return true;}};// Thank's IE8 for his funny defineProperty var _descriptors=!_fails(function(){return Object.defineProperty({},'a',{get:function(){return 7;}}).a!=7;});var document$1=_global.document;// typeof document.createElement is 'object' in old IE var is=_isObject(document$1)&&_isObject(document$1.createElement);var _domCreate=function(it){return is?document$1.createElement(it):{};};var _ie8DomDefine=!_descriptors&&!_fails(function(){return Object.defineProperty(_domCreate('div'),'a',{get:function(){return 7;}}).a!=7;});// 7.1.1 ToPrimitive(input [, PreferredType]) // instead of the ES6 spec version, we didn't implement @@toPrimitive case // and the second argument - flag - preferred type is a string var _toPrimitive=function(it,S){if(!_isObject(it))return it;var fn,val;if(S&&typeof(fn=it.toString)=='function'&&!_isObject(val=fn.call(it)))return val;if(typeof(fn=it.valueOf)=='function'&&!_isObject(val=fn.call(it)))return val;if(!S&&typeof(fn=it.toString)=='function'&&!_isObject(val=fn.call(it)))return val;throw TypeError("Can't convert object to primitive value");};var dP=Object.defineProperty;var f=_descriptors?Object.defineProperty:function defineProperty(O,P,Attributes){_anObject(O);P=_toPrimitive(P,true);_anObject(Attributes);if(_ie8DomDefine)try{return dP(O,P,Attributes);}catch(e){/* empty */}if('get'in Attributes||'set'in Attributes)throw TypeError('Accessors not supported!');if('value'in Attributes)O[P]=Attributes.value;return O;};var _objectDp={f:f};var _propertyDesc=function(bitmap,value){return {enumerable:!(bitmap&1),configurable:!(bitmap&2),writable:!(bitmap&4),value:value};};var _hide=_descriptors?function(object,key,value){return _objectDp.f(object,key,_propertyDesc(1,value));}:function(object,key,value){object[key]=value;return object;};var hasOwnProperty={}.hasOwnProperty;var _has=function(it,key){return hasOwnProperty.call(it,key);};var PROTOTYPE='prototype';var $export=function(type,name,source){var IS_FORCED=type&$export.F;var IS_GLOBAL=type&$export.G;var IS_STATIC=type&$export.S;var IS_PROTO=type&$export.P;var IS_BIND=type&$export.B;var IS_WRAP=type&$export.W;var exports=IS_GLOBAL?_core:_core[name]||(_core[name]={});var expProto=exports[PROTOTYPE];var target=IS_GLOBAL?_global:IS_STATIC?_global[name]:(_global[name]||{})[PROTOTYPE];var key,own,out;if(IS_GLOBAL)source=name;for(key in source){// contains in native own=!IS_FORCED&&target&&target[key]!==undefined;if(own&&_has(exports,key))continue;// export native or passed out=own?target[key]:source[key];// prevent global pollution for namespaces exports[key]=IS_GLOBAL&&typeof target[key]!='function'?source[key]// bind timers to global for call from export context :IS_BIND&&own?_ctx(out,_global)// wrap global constructors for prevent change them in library :IS_WRAP&&target[key]==out?function(C){var F=function(a,b,c){if(this instanceof C){switch(arguments.length){case 0:return new C();case 1:return new C(a);case 2:return new C(a,b);}return new C(a,b,c);}return C.apply(this,arguments);};F[PROTOTYPE]=C[PROTOTYPE];return F;// make static versions for prototype methods }(out):IS_PROTO&&typeof out=='function'?_ctx(Function.call,out):out;// export proto methods to core.%CONSTRUCTOR%.methods.%NAME% if(IS_PROTO){(exports.virtual||(exports.virtual={}))[key]=out;// export proto methods to core.%CONSTRUCTOR%.prototype.%NAME% if(type&$export.R&&expProto&&!expProto[key])_hide(expProto,key,out);}}};// type bitmap $export.F=1;// forced $export.G=2;// global $export.S=4;// static $export.P=8;// proto $export.B=16;// bind $export.W=32;// wrap $export.U=64;// safe $export.R=128;// real proto method for `library` var _export=$export;var _redefine=_hide;var _iterators={};var toString={}.toString;var _cof=function(it){return toString.call(it).slice(8,-1);};// fallback for non-array-like ES3 and non-enumerable old V8 strings // eslint-disable-next-line no-prototype-builtins var _iobject=Object('z').propertyIsEnumerable(0)?Object:function(it){return _cof(it)=='String'?it.split(''):Object(it);};// to indexed object, toObject with fallback for non-array-like ES3 strings var _toIobject=function(it){return _iobject(_defined(it));};// 7.1.15 ToLength var min=Math.min;var _toLength=function(it){return it>0?min(_toInteger(it),0x1fffffffffffff):0;// pow(2, 53) - 1 == 9007199254740991 };var max=Math.max;var min$1=Math.min;var _toAbsoluteIndex=function(index,length){index=_toInteger(index);return index<0?max(index+length,0):min$1(index,length);};// false -> Array#indexOf // true -> Array#includes var _arrayIncludes=function(IS_INCLUDES){return function($this,el,fromIndex){var O=_toIobject($this);var length=_toLength(O.length);var index=_toAbsoluteIndex(fromIndex,length);var value;// Array#includes uses SameValueZero equality algorithm // eslint-disable-next-line no-self-compare if(IS_INCLUDES&&el!=el)while(length>index){value=O[index++];// eslint-disable-next-line no-self-compare if(value!=value)return true;// Array#indexOf ignores holes, Array#includes - not }else for(;length>index;index++)if(IS_INCLUDES||index in O){if(O[index]===el)return IS_INCLUDES||index||0;}return !IS_INCLUDES&&-1;};};var _shared=createCommonjsModule(function(module){var SHARED='__core-js_shared__';var store=_global[SHARED]||(_global[SHARED]={});(module.exports=function(key,value){return store[key]||(store[key]=value!==undefined?value:{});})('versions',[]).push({version:_core.version,mode:'pure',copyright:'© 2018 Denis Pushkarev (zloirock.ru)'});});var id$1=0;var px=Math.random();var _uid=function(key){return 'Symbol('.concat(key===undefined?'':key,')_',(++id$1+px).toString(36));};var shared=_shared('keys');var _sharedKey=function(key){return shared[key]||(shared[key]=_uid(key));};var arrayIndexOf=_arrayIncludes(false);var IE_PROTO=_sharedKey('IE_PROTO');var _objectKeysInternal=function(object,names){var O=_toIobject(object);var i=0;var result=[];var key;for(key in O)if(key!=IE_PROTO)_has(O,key)&&result.push(key);// Don't enum bug & hidden keys while(names.length>i)if(_has(O,key=names[i++])){~arrayIndexOf(result,key)||result.push(key);}return result;};// IE 8- don't enum bug keys var _enumBugKeys='constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'.split(',');// 19.1.2.14 / 15.2.3.14 Object.keys(O) var _objectKeys=Object.keys||function keys(O){return _objectKeysInternal(O,_enumBugKeys);};var _objectDps=_descriptors?Object.defineProperties:function defineProperties(O,Properties){_anObject(O);var keys=_objectKeys(Properties);var length=keys.length;var i=0;var P;while(length>i)_objectDp.f(O,P=keys[i++],Properties[P]);return O;};var document$2=_global.document;var _html=document$2&&document$2.documentElement;// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) var IE_PROTO$1=_sharedKey('IE_PROTO');var Empty=function(){/* empty */};var PROTOTYPE$1='prototype';// Create object with fake `null` prototype: use iframe Object with cleared prototype var createDict=function(){// Thrash, waste and sodomy: IE GC bug var iframe=_domCreate('iframe');var i=_enumBugKeys.length;var lt='<';var gt='>';var iframeDocument;iframe.style.display='none';_html.appendChild(iframe);iframe.src='javascript:';// eslint-disable-line no-script-url // createDict = iframe.contentWindow.Object; // html.removeChild(iframe); iframeDocument=iframe.contentWindow.document;iframeDocument.open();iframeDocument.write(lt+'script'+gt+'document.F=Object'+lt+'/script'+gt);iframeDocument.close();createDict=iframeDocument.F;while(i--)delete createDict[PROTOTYPE$1][_enumBugKeys[i]];return createDict();};var _objectCreate=Object.create||function create(O,Properties){var result;if(O!==null){Empty[PROTOTYPE$1]=_anObject(O);result=new Empty();Empty[PROTOTYPE$1]=null;// add "__proto__" for Object.getPrototypeOf polyfill result[IE_PROTO$1]=O;}else result=createDict();return Properties===undefined?result:_objectDps(result,Properties);};var _wks=createCommonjsModule(function(module){var store=_shared('wks');var Symbol=_global.Symbol;var USE_SYMBOL=typeof Symbol=='function';var $exports=module.exports=function(name){return store[name]||(store[name]=USE_SYMBOL&&Symbol[name]||(USE_SYMBOL?Symbol:_uid)('Symbol.'+name));};$exports.store=store;});var def=_objectDp.f;var TAG=_wks('toStringTag');var _setToStringTag=function(it,tag,stat){if(it&&!_has(it=stat?it:it.prototype,TAG))def(it,TAG,{configurable:true,value:tag});};var IteratorPrototype={};// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() _hide(IteratorPrototype,_wks('iterator'),function(){return this;});var _iterCreate=function(Constructor,NAME,next){Constructor.prototype=_objectCreate(IteratorPrototype,{next:_propertyDesc(1,next)});_setToStringTag(Constructor,NAME+' Iterator');};// 7.1.13 ToObject(argument) var _toObject=function(it){return Object(_defined(it));};// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) var IE_PROTO$2=_sharedKey('IE_PROTO');var ObjectProto=Object.prototype;var _objectGpo=Object.getPrototypeOf||function(O){O=_toObject(O);if(_has(O,IE_PROTO$2))return O[IE_PROTO$2];if(typeof O.constructor=='function'&&O instanceof O.constructor){return O.constructor.prototype;}return O instanceof Object?ObjectProto:null;};var ITERATOR=_wks('iterator');var BUGGY=!([].keys&&'next'in[].keys());// Safari has buggy iterators w/o `next` var FF_ITERATOR='@@iterator';var KEYS='keys';var VALUES='values';var returnThis=function(){return this;};var _iterDefine=function(Base,NAME,Constructor,next,DEFAULT,IS_SET,FORCED){_iterCreate(Constructor,NAME,next);var getMethod=function(kind){if(!BUGGY&&kind in proto)return proto[kind];switch(kind){case KEYS:return function keys(){return new Constructor(this,kind);};case VALUES:return function values(){return new Constructor(this,kind);};}return function entries(){return new Constructor(this,kind);};};var TAG=NAME+' Iterator';var DEF_VALUES=DEFAULT==VALUES;var VALUES_BUG=false;var proto=Base.prototype;var $native=proto[ITERATOR]||proto[FF_ITERATOR]||DEFAULT&&proto[DEFAULT];var $default=$native||getMethod(DEFAULT);var $entries=DEFAULT?!DEF_VALUES?$default:getMethod('entries'):undefined;var $anyNative=NAME=='Array'?proto.entries||$native:$native;var methods,key,IteratorPrototype;// Fix native if($anyNative){IteratorPrototype=_objectGpo($anyNative.call(new Base()));if(IteratorPrototype!==Object.prototype&&IteratorPrototype.next){// Set @@toStringTag to native iterators _setToStringTag(IteratorPrototype,TAG,true);// fix for some old engines }}// fix Array#{values, @@iterator}.name in V8 / FF if(DEF_VALUES&&$native&&$native.name!==VALUES){VALUES_BUG=true;$default=function values(){return $native.call(this);};}// Define iterator if((FORCED)&&(BUGGY||VALUES_BUG||!proto[ITERATOR])){_hide(proto,ITERATOR,$default);}// Plug for library _iterators[NAME]=$default;_iterators[TAG]=returnThis;if(DEFAULT){methods={values:DEF_VALUES?$default:getMethod(VALUES),keys:IS_SET?$default:getMethod(KEYS),entries:$entries};if(FORCED)for(key in methods){if(!(key in proto))_redefine(proto,key,methods[key]);}else _export(_export.P+_export.F*(BUGGY||VALUES_BUG),NAME,methods);}return methods;};var $at=_stringAt(true);// 21.1.3.27 String.prototype[@@iterator]() _iterDefine(String,'String',function(iterated){this._t=String(iterated);// target this._i=0;// next index // 21.1.5.2.1 %StringIteratorPrototype%.next() },function(){var O=this._t;var index=this._i;var point;if(index>=O.length)return {value:undefined,done:true};point=$at(O,index);this._i+=point.length;return {value:point,done:false};});var _iterStep=function(done,value){return {value:value,done:!!done};};// 22.1.3.4 Array.prototype.entries() // 22.1.3.13 Array.prototype.keys() // 22.1.3.29 Array.prototype.values() // 22.1.3.30 Array.prototype[@@iterator]() var es6_array_iterator=_iterDefine(Array,'Array',function(iterated,kind){this._t=_toIobject(iterated);// target this._i=0;// next index this._k=kind;// kind // 22.1.5.2.1 %ArrayIteratorPrototype%.next() },function(){var O=this._t;var kind=this._k;var index=this._i++;if(!O||index>=O.length){this._t=undefined;return _iterStep(1);}if(kind=='keys')return _iterStep(0,index);if(kind=='values')return _iterStep(0,O[index]);return _iterStep(0,[index,O[index]]);},'values');// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) _iterators.Arguments=_iterators.Array;var TO_STRING_TAG=_wks('toStringTag');var DOMIterables=('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,'+'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,'+'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,'+'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,'+'TextTrackList,TouchList').split(',');for(var i=0;iindex;index++){result=entries?f(_anObject(step=iterable[index])[0],step[1]):f(iterable[index]);if(result===BREAK||result===RETURN)return result;}else for(iterator=iterFn.call(iterable);!(step=iterator.next()).done;){result=_iterCall(iterator,f,step.value,entries);if(result===BREAK||result===RETURN)return result;}};exports.BREAK=BREAK;exports.RETURN=RETURN;});// 7.3.20 SpeciesConstructor(O, defaultConstructor) var SPECIES=_wks('species');var _speciesConstructor=function(O,D){var C=_anObject(O).constructor;var S;return C===undefined||(S=_anObject(C)[SPECIES])==undefined?D:_aFunction(S);};// fast apply, http://jsperf.lnkit.com/fast-apply/5 var _invoke=function(fn,args,that){var un=that===undefined;switch(args.length){case 0:return un?fn():fn.call(that);case 1:return un?fn(args[0]):fn.call(that,args[0]);case 2:return un?fn(args[0],args[1]):fn.call(that,args[0],args[1]);case 3:return un?fn(args[0],args[1],args[2]):fn.call(that,args[0],args[1],args[2]);case 4:return un?fn(args[0],args[1],args[2],args[3]):fn.call(that,args[0],args[1],args[2],args[3]);}return fn.apply(that,args);};var process=_global.process;var setTask=_global.setImmediate;var clearTask=_global.clearImmediate;var MessageChannel=_global.MessageChannel;var Dispatch=_global.Dispatch;var counter=0;var queue={};var ONREADYSTATECHANGE='onreadystatechange';var defer,channel,port;var run=function(){var id=+this;// eslint-disable-next-line no-prototype-builtins if(queue.hasOwnProperty(id)){var fn=queue[id];delete queue[id];fn();}};var listener=function(event){run.call(event.data);};// Node.js 0.9+ & IE10+ has setImmediate, otherwise: if(!setTask||!clearTask){setTask=function setImmediate(fn){var args=[];var i=1;while(arguments.length>i)args.push(arguments[i++]);queue[++counter]=function(){// eslint-disable-next-line no-new-func _invoke(typeof fn=='function'?fn:Function(fn),args);};defer(counter);return counter;};clearTask=function clearImmediate(id){delete queue[id];};// Node.js 0.8- if(_cof(process)=='process'){defer=function(id){process.nextTick(_ctx(run,id,1));};// Sphere (JS game engine) Dispatch API }else if(Dispatch&&Dispatch.now){defer=function(id){Dispatch.now(_ctx(run,id,1));};// Browsers with MessageChannel, includes WebWorkers }else if(MessageChannel){channel=new MessageChannel();port=channel.port2;channel.port1.onmessage=listener;defer=_ctx(port.postMessage,port,1);// Browsers with postMessage, skip WebWorkers // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' }else if(_global.addEventListener&&typeof postMessage=='function'&&!_global.importScripts){defer=function(id){_global.postMessage(id+'','*');};_global.addEventListener('message',listener,false);// IE8- }else if(ONREADYSTATECHANGE in _domCreate('script')){defer=function(id){_html.appendChild(_domCreate('script'))[ONREADYSTATECHANGE]=function(){_html.removeChild(this);run.call(id);};};// Rest old browsers }else{defer=function(id){setTimeout(_ctx(run,id,1),0);};}}var _task={set:setTask,clear:clearTask};var macrotask=_task.set;var Observer=_global.MutationObserver||_global.WebKitMutationObserver;var process$1=_global.process;var Promise$1=_global.Promise;var isNode=_cof(process$1)=='process';var _microtask=function(){var head,last,notify;var flush=function(){var parent,fn;if(isNode&&(parent=process$1.domain))parent.exit();while(head){fn=head.fn;head=head.next;try{fn();}catch(e){if(head)notify();else last=undefined;throw e;}}last=undefined;if(parent)parent.enter();};// Node.js if(isNode){notify=function(){process$1.nextTick(flush);};// browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339 }else if(Observer&&!(_global.navigator&&_global.navigator.standalone)){var toggle=true;var node=document.createTextNode('');new Observer(flush).observe(node,{characterData:true});// eslint-disable-line no-new notify=function(){node.data=toggle=!toggle;};// environments with maybe non-completely correct, but existent Promise }else if(Promise$1&&Promise$1.resolve){// Promise.resolve without an argument throws an error in LG WebOS 2 var promise=Promise$1.resolve(undefined);notify=function(){promise.then(flush);};// for other environments - macrotask based on: // - setImmediate // - MessageChannel // - window.postMessag // - onreadystatechange // - setTimeout }else{notify=function(){// strange IE + webpack dev server bug - use .call(global) macrotask.call(_global,flush);};}return function(fn){var task={fn:fn,next:undefined};if(last)last.next=task;if(!head){head=task;notify();}last=task;};};// 25.4.1.5 NewPromiseCapability(C) function PromiseCapability(C){var resolve,reject;this.promise=new C(function($$resolve,$$reject){if(resolve!==undefined||reject!==undefined)throw TypeError('Bad Promise constructor');resolve=$$resolve;reject=$$reject;});this.resolve=_aFunction(resolve);this.reject=_aFunction(reject);}var f$1=function(C){return new PromiseCapability(C);};var _newPromiseCapability={f:f$1};var _perform=function(exec){try{return {e:false,v:exec()};}catch(e){return {e:true,v:e};}};var navigator$1=_global.navigator;var _userAgent=navigator$1&&navigator$1.userAgent||'';var _promiseResolve=function(C,x){_anObject(C);if(_isObject(x)&&x.constructor===C)return x;var promiseCapability=_newPromiseCapability.f(C);var resolve=promiseCapability.resolve;resolve(x);return promiseCapability.promise;};var _redefineAll=function(target,src,safe){for(var key in src){if(safe&&target[key])target[key]=src[key];else _hide(target,key,src[key]);}return target;};var SPECIES$1=_wks('species');var _setSpecies=function(KEY){var C=typeof _core[KEY]=='function'?_core[KEY]:_global[KEY];if(_descriptors&&C&&!C[SPECIES$1])_objectDp.f(C,SPECIES$1,{configurable:true,get:function(){return this;}});};var ITERATOR$3=_wks('iterator');var SAFE_CLOSING=false;try{var riter=[7][ITERATOR$3]();riter['return']=function(){SAFE_CLOSING=true;};}catch(e){/* empty */}var _iterDetect=function(exec,skipClosing){if(!skipClosing&&!SAFE_CLOSING)return false;var safe=false;try{var arr=[7];var iter=arr[ITERATOR$3]();iter.next=function(){return {done:safe=true};};arr[ITERATOR$3]=function(){return iter;};exec(arr);}catch(e){/* empty */}return safe;};var task=_task.set;var microtask=_microtask();var PROMISE='Promise';var TypeError$1=_global.TypeError;var process$2=_global.process;var versions=process$2&&process$2.versions;var v8=versions&&versions.v8||'';var $Promise=_global[PROMISE];var isNode$1=_classof(process$2)=='process';var empty=function(){/* empty */};var Internal,newGenericPromiseCapability,OwnPromiseCapability,Wrapper;var newPromiseCapability=newGenericPromiseCapability=_newPromiseCapability.f;var USE_NATIVE=!!function(){try{// correct subclassing with @@species support var promise=$Promise.resolve(1);var FakePromise=(promise.constructor={})[_wks('species')]=function(exec){exec(empty,empty);};// unhandled rejections tracking support, NodeJS Promise without it fails @@species test return (isNode$1||typeof PromiseRejectionEvent=='function')&&promise.then(empty)instanceof FakePromise// v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables // https://bugs.chromium.org/p/chromium/issues/detail?id=830565 // we can't detect it synchronously, so just check versions &&v8.indexOf('6.6')!==0&&_userAgent.indexOf('Chrome/66')===-1;}catch(e){/* empty */}}();// helpers var isThenable=function(it){var then;return _isObject(it)&&typeof(then=it.then)=='function'?then:false;};var notify=function(promise,isReject){if(promise._n)return;promise._n=true;var chain=promise._c;microtask(function(){var value=promise._v;var ok=promise._s==1;var i=0;var run=function(reaction){var handler=ok?reaction.ok:reaction.fail;var resolve=reaction.resolve;var reject=reaction.reject;var domain=reaction.domain;var result,then,exited;try{if(handler){if(!ok){if(promise._h==2)onHandleUnhandled(promise);promise._h=1;}if(handler===true)result=value;else{if(domain)domain.enter();result=handler(value);// may throw if(domain){domain.exit();exited=true;}}if(result===reaction.promise){reject(TypeError$1('Promise-chain cycle'));}else if(then=isThenable(result)){then.call(result,resolve,reject);}else resolve(result);}else reject(value);}catch(e){if(domain&&!exited)domain.exit();reject(e);}};while(chain.length>i)run(chain[i++]);// variable length - can't use forEach promise._c=[];promise._n=false;if(isReject&&!promise._h)onUnhandled(promise);});};var onUnhandled=function(promise){task.call(_global,function(){var value=promise._v;var unhandled=isUnhandled(promise);var result,handler,console;if(unhandled){result=_perform(function(){if(isNode$1){process$2.emit('unhandledRejection',value,promise);}else if(handler=_global.onunhandledrejection){handler({promise:promise,reason:value});}else if((console=_global.console)&&console.error){console.error('Unhandled promise rejection',value);}});// Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should promise._h=isNode$1||isUnhandled(promise)?2:1;}promise._a=undefined;if(unhandled&&result.e)throw result.v;});};var isUnhandled=function(promise){return promise._h!==1&&(promise._a||promise._c).length===0;};var onHandleUnhandled=function(promise){task.call(_global,function(){var handler;if(isNode$1){process$2.emit('rejectionHandled',promise);}else if(handler=_global.onrejectionhandled){handler({promise:promise,reason:promise._v});}});};var $reject=function(value){var promise=this;if(promise._d)return;promise._d=true;promise=promise._w||promise;// unwrap promise._v=value;promise._s=2;if(!promise._a)promise._a=promise._c.slice();notify(promise,true);};var $resolve=function(value){var promise=this;var then;if(promise._d)return;promise._d=true;promise=promise._w||promise;// unwrap try{if(promise===value)throw TypeError$1("Promise can't be resolved itself");if(then=isThenable(value)){microtask(function(){var wrapper={_w:promise,_d:false};// wrap try{then.call(value,_ctx($resolve,wrapper,1),_ctx($reject,wrapper,1));}catch(e){$reject.call(wrapper,e);}});}else{promise._v=value;promise._s=1;notify(promise,false);}}catch(e){$reject.call({_w:promise,_d:false},e);// wrap }};// constructor polyfill if(!USE_NATIVE){// 25.4.3.1 Promise(executor) $Promise=function Promise(executor){_anInstance(this,$Promise,PROMISE,'_h');_aFunction(executor);Internal.call(this);try{executor(_ctx($resolve,this,1),_ctx($reject,this,1));}catch(err){$reject.call(this,err);}};// eslint-disable-next-line no-unused-vars Internal=function Promise(executor){this._c=[];// <- awaiting reactions this._a=undefined;// <- checked in isUnhandled reactions this._s=0;// <- state this._d=false;// <- done this._v=undefined;// <- value this._h=0;// <- rejection state, 0 - default, 1 - handled, 2 - unhandled this._n=false;// <- notify };Internal.prototype=_redefineAll($Promise.prototype,{// 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected) then:function then(onFulfilled,onRejected){var reaction=newPromiseCapability(_speciesConstructor(this,$Promise));reaction.ok=typeof onFulfilled=='function'?onFulfilled:true;reaction.fail=typeof onRejected=='function'&&onRejected;reaction.domain=isNode$1?process$2.domain:undefined;this._c.push(reaction);if(this._a)this._a.push(reaction);if(this._s)notify(this,false);return reaction.promise;},// 25.4.5.1 Promise.prototype.catch(onRejected) 'catch':function(onRejected){return this.then(undefined,onRejected);}});OwnPromiseCapability=function(){var promise=new Internal();this.promise=promise;this.resolve=_ctx($resolve,promise,1);this.reject=_ctx($reject,promise,1);};_newPromiseCapability.f=newPromiseCapability=function(C){return C===$Promise||C===Wrapper?new OwnPromiseCapability(C):newGenericPromiseCapability(C);};}_export(_export.G+_export.W+_export.F*!USE_NATIVE,{Promise:$Promise});_setToStringTag($Promise,PROMISE);_setSpecies(PROMISE);Wrapper=_core[PROMISE];// statics _export(_export.S+_export.F*!USE_NATIVE,PROMISE,{// 25.4.4.5 Promise.reject(r) reject:function reject(r){var capability=newPromiseCapability(this);var $$reject=capability.reject;$$reject(r);return capability.promise;}});_export(_export.S+_export.F*(_library),PROMISE,{// 25.4.4.6 Promise.resolve(x) resolve:function resolve(x){return _promiseResolve(this===Wrapper?$Promise:this,x);}});_export(_export.S+_export.F*!(USE_NATIVE&&_iterDetect(function(iter){$Promise.all(iter)['catch'](empty);})),PROMISE,{// 25.4.4.1 Promise.all(iterable) all:function all(iterable){var C=this;var capability=newPromiseCapability(C);var resolve=capability.resolve;var reject=capability.reject;var result=_perform(function(){var values=[];var index=0;var remaining=1;_forOf(iterable,false,function(promise){var $index=index++;var alreadyCalled=false;values.push(undefined);remaining++;C.resolve(promise).then(function(value){if(alreadyCalled)return;alreadyCalled=true;values[$index]=value;--remaining||resolve(values);},reject);});--remaining||resolve(values);});if(result.e)reject(result.v);return capability.promise;},// 25.4.4.4 Promise.race(iterable) race:function race(iterable){var C=this;var capability=newPromiseCapability(C);var reject=capability.reject;var result=_perform(function(){_forOf(iterable,false,function(promise){C.resolve(promise).then(capability.resolve,reject);});});if(result.e)reject(result.v);return capability.promise;}});_export(_export.P+_export.R,'Promise',{'finally':function(onFinally){var C=_speciesConstructor(this,_core.Promise||_global.Promise);var isFunction=typeof onFinally=='function';return this.then(isFunction?function(x){return _promiseResolve(C,onFinally()).then(function(){return x;});}:onFinally,isFunction?function(e){return _promiseResolve(C,onFinally()).then(function(){throw e;});}:onFinally);}});// https://github.com/tc39/proposal-promise-try _export(_export.S,'Promise',{'try':function(callbackfn){var promiseCapability=_newPromiseCapability.f(this);var result=_perform(callbackfn);(result.e?promiseCapability.reject:promiseCapability.resolve)(result.v);return promiseCapability.promise;}});var promise=_core.Promise;var promise$1=promise;function _asyncToGenerator$1(fn){return function(){var self=this,args=arguments;return new promise$1(function(resolve,reject){var gen=fn.apply(self,args);function step(key,arg){try{var info=gen[key](arg);var value=info.value;}catch(error){reject(error);return;}if(info.done){resolve(value);}else{promise$1.resolve(value).then(_next,_throw);}}function _next(value){step("next",value);}function _throw(err){step("throw",err);}_next();});};}var asyncToGenerator=_asyncToGenerator$1;var f$2={}.propertyIsEnumerable;var _objectPie={f:f$2};var gOPD=Object.getOwnPropertyDescriptor;var f$3=_descriptors?gOPD:function getOwnPropertyDescriptor(O,P){O=_toIobject(O);P=_toPrimitive(P,true);if(_ie8DomDefine)try{return gOPD(O,P);}catch(e){/* empty */}if(_has(O,P))return _propertyDesc(!_objectPie.f.call(O,P),O[P]);};var _objectGopd={f:f$3};// most Object methods by ES6 should accept primitives var _objectSap=function(KEY,exec){var fn=(_core.Object||{})[KEY]||Object[KEY];var exp={};exp[KEY]=exec(fn);_export(_export.S+_export.F*_fails(function(){fn(1);}),'Object',exp);};// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) var $getOwnPropertyDescriptor=_objectGopd.f;_objectSap('getOwnPropertyDescriptor',function(){return function getOwnPropertyDescriptor(it,key){return $getOwnPropertyDescriptor(_toIobject(it),key);};});var $Object=_core.Object;var getOwnPropertyDescriptor=function getOwnPropertyDescriptor(it,key){return $Object.getOwnPropertyDescriptor(it,key);};var getOwnPropertyDescriptor$1=getOwnPropertyDescriptor;var _meta=createCommonjsModule(function(module){var META=_uid('meta');var setDesc=_objectDp.f;var id=0;var isExtensible=Object.isExtensible||function(){return true;};var FREEZE=!_fails(function(){return isExtensible(Object.preventExtensions({}));});var setMeta=function(it){setDesc(it,META,{value:{i:'O'+ ++id,// object ID w:{}// weak collections IDs }});};var fastKey=function(it,create){// return primitive with prefix if(!_isObject(it))return typeof it=='symbol'?it:(typeof it=='string'?'S':'P')+it;if(!_has(it,META)){// can't set metadata to uncaught frozen object if(!isExtensible(it))return 'F';// not necessary to add metadata if(!create)return 'E';// add missing metadata setMeta(it);// return object ID }return it[META].i;};var getWeak=function(it,create){if(!_has(it,META)){// can't set metadata to uncaught frozen object if(!isExtensible(it))return true;// not necessary to add metadata if(!create)return false;// add missing metadata setMeta(it);// return hash weak collections IDs }return it[META].w;};// add metadata on freeze-family methods calling var onFreeze=function(it){if(FREEZE&&meta.NEED&&isExtensible(it)&&!_has(it,META))setMeta(it);return it;};var meta=module.exports={KEY:META,NEED:false,fastKey:fastKey,getWeak:getWeak,onFreeze:onFreeze};});var _meta_1=_meta.KEY;var _meta_2=_meta.NEED;var _meta_3=_meta.fastKey;var _meta_4=_meta.getWeak;var _meta_5=_meta.onFreeze;var f$4=_wks;var _wksExt={f:f$4};var defineProperty=_objectDp.f;var _wksDefine=function(name){var $Symbol=_core.Symbol||(_core.Symbol={});if(name.charAt(0)!='_'&&!(name in $Symbol))defineProperty($Symbol,name,{value:_wksExt.f(name)});};var f$5=Object.getOwnPropertySymbols;var _objectGops={f:f$5};// all enumerable object keys, includes symbols var _enumKeys=function(it){var result=_objectKeys(it);var getSymbols=_objectGops.f;if(getSymbols){var symbols=getSymbols(it);var isEnum=_objectPie.f;var i=0;var key;while(symbols.length>i)if(isEnum.call(it,key=symbols[i++]))result.push(key);}return result;};// 7.2.2 IsArray(argument) var _isArray=Array.isArray||function isArray(arg){return _cof(arg)=='Array';};// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O) var hiddenKeys=_enumBugKeys.concat('length','prototype');var f$6=Object.getOwnPropertyNames||function getOwnPropertyNames(O){return _objectKeysInternal(O,hiddenKeys);};var _objectGopn={f:f$6};// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window var gOPN=_objectGopn.f;var toString$1={}.toString;var windowNames=typeof window=='object'&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];var getWindowNames=function(it){try{return gOPN(it);}catch(e){return windowNames.slice();}};var f$7=function getOwnPropertyNames(it){return windowNames&&toString$1.call(it)=='[object Window]'?getWindowNames(it):gOPN(_toIobject(it));};var _objectGopnExt={f:f$7};// ECMAScript 6 symbols shim var META=_meta.KEY;var gOPD$1=_objectGopd.f;var dP$1=_objectDp.f;var gOPN$1=_objectGopnExt.f;var $Symbol=_global.Symbol;var $JSON=_global.JSON;var _stringify=$JSON&&$JSON.stringify;var PROTOTYPE$2='prototype';var HIDDEN=_wks('_hidden');var TO_PRIMITIVE=_wks('toPrimitive');var isEnum={}.propertyIsEnumerable;var SymbolRegistry=_shared('symbol-registry');var AllSymbols=_shared('symbols');var OPSymbols=_shared('op-symbols');var ObjectProto$1=Object[PROTOTYPE$2];var USE_NATIVE$1=typeof $Symbol=='function';var QObject=_global.QObject;// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 var setter=!QObject||!QObject[PROTOTYPE$2]||!QObject[PROTOTYPE$2].findChild;// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 var setSymbolDesc=_descriptors&&_fails(function(){return _objectCreate(dP$1({},'a',{get:function(){return dP$1(this,'a',{value:7}).a;}})).a!=7;})?function(it,key,D){var protoDesc=gOPD$1(ObjectProto$1,key);if(protoDesc)delete ObjectProto$1[key];dP$1(it,key,D);if(protoDesc&&it!==ObjectProto$1)dP$1(ObjectProto$1,key,protoDesc);}:dP$1;var wrap=function(tag){var sym=AllSymbols[tag]=_objectCreate($Symbol[PROTOTYPE$2]);sym._k=tag;return sym;};var isSymbol=USE_NATIVE$1&&typeof $Symbol.iterator=='symbol'?function(it){return typeof it=='symbol';}:function(it){return it instanceof $Symbol;};var $defineProperty=function defineProperty(it,key,D){if(it===ObjectProto$1)$defineProperty(OPSymbols,key,D);_anObject(it);key=_toPrimitive(key,true);_anObject(D);if(_has(AllSymbols,key)){if(!D.enumerable){if(!_has(it,HIDDEN))dP$1(it,HIDDEN,_propertyDesc(1,{}));it[HIDDEN][key]=true;}else{if(_has(it,HIDDEN)&&it[HIDDEN][key])it[HIDDEN][key]=false;D=_objectCreate(D,{enumerable:_propertyDesc(0,false)});}return setSymbolDesc(it,key,D);}return dP$1(it,key,D);};var $defineProperties=function defineProperties(it,P){_anObject(it);var keys=_enumKeys(P=_toIobject(P));var i=0;var l=keys.length;var key;while(l>i)$defineProperty(it,key=keys[i++],P[key]);return it;};var $create=function create(it,P){return P===undefined?_objectCreate(it):$defineProperties(_objectCreate(it),P);};var $propertyIsEnumerable=function propertyIsEnumerable(key){var E=isEnum.call(this,key=_toPrimitive(key,true));if(this===ObjectProto$1&&_has(AllSymbols,key)&&!_has(OPSymbols,key))return false;return E||!_has(this,key)||!_has(AllSymbols,key)||_has(this,HIDDEN)&&this[HIDDEN][key]?E:true;};var $getOwnPropertyDescriptor$1=function getOwnPropertyDescriptor(it,key){it=_toIobject(it);key=_toPrimitive(key,true);if(it===ObjectProto$1&&_has(AllSymbols,key)&&!_has(OPSymbols,key))return;var D=gOPD$1(it,key);if(D&&_has(AllSymbols,key)&&!(_has(it,HIDDEN)&&it[HIDDEN][key]))D.enumerable=true;return D;};var $getOwnPropertyNames=function getOwnPropertyNames(it){var names=gOPN$1(_toIobject(it));var result=[];var i=0;var key;while(names.length>i){if(!_has(AllSymbols,key=names[i++])&&key!=HIDDEN&&key!=META)result.push(key);}return result;};var $getOwnPropertySymbols=function getOwnPropertySymbols(it){var IS_OP=it===ObjectProto$1;var names=gOPN$1(IS_OP?OPSymbols:_toIobject(it));var result=[];var i=0;var key;while(names.length>i){if(_has(AllSymbols,key=names[i++])&&(IS_OP?_has(ObjectProto$1,key):true))result.push(AllSymbols[key]);}return result;};// 19.4.1.1 Symbol([description]) if(!USE_NATIVE$1){$Symbol=function Symbol(){if(this instanceof $Symbol)throw TypeError('Symbol is not a constructor!');var tag=_uid(arguments.length>0?arguments[0]:undefined);var $set=function(value){if(this===ObjectProto$1)$set.call(OPSymbols,value);if(_has(this,HIDDEN)&&_has(this[HIDDEN],tag))this[HIDDEN][tag]=false;setSymbolDesc(this,tag,_propertyDesc(1,value));};if(_descriptors&&setter)setSymbolDesc(ObjectProto$1,tag,{configurable:true,set:$set});return wrap(tag);};_redefine($Symbol[PROTOTYPE$2],'toString',function toString(){return this._k;});_objectGopd.f=$getOwnPropertyDescriptor$1;_objectDp.f=$defineProperty;_objectGopn.f=_objectGopnExt.f=$getOwnPropertyNames;_objectPie.f=$propertyIsEnumerable;_objectGops.f=$getOwnPropertySymbols;if(_descriptors&&!_library){_redefine(ObjectProto$1,'propertyIsEnumerable',$propertyIsEnumerable,true);}_wksExt.f=function(name){return wrap(_wks(name));};}_export(_export.G+_export.W+_export.F*!USE_NATIVE$1,{Symbol:$Symbol});for(var es6Symbols=// 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'.split(','),j=0;es6Symbols.length>j;)_wks(es6Symbols[j++]);for(var wellKnownSymbols=_objectKeys(_wks.store),k=0;wellKnownSymbols.length>k;)_wksDefine(wellKnownSymbols[k++]);_export(_export.S+_export.F*!USE_NATIVE$1,'Symbol',{// 19.4.2.1 Symbol.for(key) 'for':function(key){return _has(SymbolRegistry,key+='')?SymbolRegistry[key]:SymbolRegistry[key]=$Symbol(key);},// 19.4.2.5 Symbol.keyFor(sym) keyFor:function keyFor(sym){if(!isSymbol(sym))throw TypeError(sym+' is not a symbol!');for(var key in SymbolRegistry)if(SymbolRegistry[key]===sym)return key;},useSetter:function(){setter=true;},useSimple:function(){setter=false;}});_export(_export.S+_export.F*!USE_NATIVE$1,'Object',{// 19.1.2.2 Object.create(O [, Properties]) create:$create,// 19.1.2.4 Object.defineProperty(O, P, Attributes) defineProperty:$defineProperty,// 19.1.2.3 Object.defineProperties(O, Properties) defineProperties:$defineProperties,// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) getOwnPropertyDescriptor:$getOwnPropertyDescriptor$1,// 19.1.2.7 Object.getOwnPropertyNames(O) getOwnPropertyNames:$getOwnPropertyNames,// 19.1.2.8 Object.getOwnPropertySymbols(O) getOwnPropertySymbols:$getOwnPropertySymbols});// 24.3.2 JSON.stringify(value [, replacer [, space]]) $JSON&&_export(_export.S+_export.F*(!USE_NATIVE$1||_fails(function(){var S=$Symbol();// MS Edge converts symbol values to JSON as {} // WebKit converts symbol values to JSON as null // V8 throws on boxed symbols return _stringify([S])!='[null]'||_stringify({a:S})!='{}'||_stringify(Object(S))!='{}';})),'JSON',{stringify:function stringify(it){var args=[it];var i=1;var replacer,$replacer;while(arguments.length>i)args.push(arguments[i++]);$replacer=replacer=args[1];if(!_isObject(replacer)&&it===undefined||isSymbol(it))return;// IE8 returns string on undefined if(!_isArray(replacer))replacer=function(key,value){if(typeof $replacer=='function')value=$replacer.call(this,key,value);if(!isSymbol(value))return value;};args[1]=replacer;return _stringify.apply($JSON,args);}});// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint) $Symbol[PROTOTYPE$2][TO_PRIMITIVE]||_hide($Symbol[PROTOTYPE$2],TO_PRIMITIVE,$Symbol[PROTOTYPE$2].valueOf);// 19.4.3.5 Symbol.prototype[@@toStringTag] _setToStringTag($Symbol,'Symbol');// 20.2.1.9 Math[@@toStringTag] _setToStringTag(Math,'Math',true);// 24.3.3 JSON[@@toStringTag] _setToStringTag(_global.JSON,'JSON',true);var getOwnPropertySymbols=_core.Object.getOwnPropertySymbols;var getOwnPropertySymbols$1=getOwnPropertySymbols;// 19.1.2.14 Object.keys(O) _objectSap('keys',function(){return function keys(it){return _objectKeys(_toObject(it));};});var keys=_core.Object.keys;var keys$1=keys;// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes) _export(_export.S+_export.F*!_descriptors,'Object',{defineProperty:_objectDp.f});var $Object$1=_core.Object;var defineProperty$1=function defineProperty(it,key,desc){return $Object$1.defineProperty(it,key,desc);};var defineProperty$2=defineProperty$1;function _defineProperty$1(obj,key,value){if(key in obj){defineProperty$2(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}var defineProperty$3=_defineProperty$1;function _objectSpread$1(target){for(var i=1;i1?_len-1:0),_key=1;_key<_len;_key++){extensions[_key-1]=arguments[_key];}// $.extend alternative, ... is the spread operator. for(var _i=0;_i0?1:+x;};}if('name'in Function.prototype===false){// Missing in IE // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name Object.defineProperty(Function.prototype,'name',{get:function(){return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1];}});}if(Object.assign===undefined){// Missing in IE // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign (function(){Object.assign=function(target){if(target===undefined||target===null){throw new TypeError('Cannot convert undefined or null to object');}var output=Object(target);for(var index=1;index>8&0xff]+lut[d0>>16&0xff]+lut[d0>>24&0xff]+'-'+lut[d1&0xff]+lut[d1>>8&0xff]+'-'+lut[d1>>16&0x0f|0x40]+lut[d1>>24&0xff]+'-'+lut[d2&0x3f|0x80]+lut[d2>>8&0xff]+'-'+lut[d2>>16&0xff]+lut[d2>>24&0xff]+lut[d3&0xff]+lut[d3>>8&0xff]+lut[d3>>16&0xff]+lut[d3>>24&0xff];// .toUpperCase() here flattens concatenated strings to save heap memory space. return uuid.toUpperCase();};}(),clamp:function(value,min,max){return Math.max(min,Math.min(max,value));},// compute euclidian modulo of m % n // https://en.wikipedia.org/wiki/Modulo_operation euclideanModulo:function(n,m){return (n%m+m)%m;},// Linear mapping from range to range mapLinear:function(x,a1,a2,b1,b2){return b1+(x-a1)*(b2-b1)/(a2-a1);},// https://en.wikipedia.org/wiki/Linear_interpolation lerp:function(x,y,t){return (1-t)*x+t*y;},// http://en.wikipedia.org/wiki/Smoothstep smoothstep:function(x,min,max){if(x<=min)return 0;if(x>=max)return 1;x=(x-min)/(max-min);return x*x*(3-2*x);},smootherstep:function(x,min,max){if(x<=min)return 0;if(x>=max)return 1;x=(x-min)/(max-min);return x*x*x*(x*(x*6-15)+10);},// Random integer from interval randInt:function(low,high){return low+Math.floor(Math.random()*(high-low+1));},// Random float from interval randFloat:function(low,high){return low+Math.random()*(high-low);},// Random float from <-range/2, range/2> interval randFloatSpread:function(range){return range*(0.5-Math.random());},degToRad:function(degrees){return degrees*_Math.DEG2RAD;},radToDeg:function(radians){return radians*_Math.RAD2DEG;},isPowerOfTwo:function(value){return (value&value-1)===0&&value!==0;},ceilPowerOfTwo:function(value){return Math.pow(2,Math.ceil(Math.log(value)/Math.LN2));},floorPowerOfTwo:function(value){return Math.pow(2,Math.floor(Math.log(value)/Math.LN2));}};/** * @author mrdoob / http://mrdoob.com/ * @author philogb / http://blog.thejit.org/ * @author egraether / http://egraether.com/ * @author zz85 / http://www.lab4games.net/zz85/blog */function Vector2(x,y){this.x=x||0;this.y=y||0;}Object.defineProperties(Vector2.prototype,{"width":{get:function(){return this.x;},set:function(value){this.x=value;}},"height":{get:function(){return this.y;},set:function(value){this.y=value;}}});Object.assign(Vector2.prototype,{isVector2:true,set:function(x,y){this.x=x;this.y=y;return this;},setScalar:function(scalar){this.x=scalar;this.y=scalar;return this;},setX:function(x){this.x=x;return this;},setY:function(y){this.y=y;return this;},setComponent:function(index,value){switch(index){case 0:this.x=value;break;case 1:this.y=value;break;default:throw new Error('index is out of range: '+index);}return this;},getComponent:function(index){switch(index){case 0:return this.x;case 1:return this.y;default:throw new Error('index is out of range: '+index);}},clone:function(){return new this.constructor(this.x,this.y);},copy:function(v){this.x=v.x;this.y=v.y;return this;},add:function(v,w){if(w!==undefined){console.warn('THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.');return this.addVectors(v,w);}this.x+=v.x;this.y+=v.y;return this;},addScalar:function(s){this.x+=s;this.y+=s;return this;},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this;},addScaledVector:function(v,s){this.x+=v.x*s;this.y+=v.y*s;return this;},sub:function(v,w){if(w!==undefined){console.warn('THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.');return this.subVectors(v,w);}this.x-=v.x;this.y-=v.y;return this;},subScalar:function(s){this.x-=s;this.y-=s;return this;},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this;},multiply:function(v){this.x*=v.x;this.y*=v.y;return this;},multiplyScalar:function(scalar){this.x*=scalar;this.y*=scalar;return this;},divide:function(v){this.x/=v.x;this.y/=v.y;return this;},divideScalar:function(scalar){return this.multiplyScalar(1/scalar);},applyMatrix3:function(m){var x=this.x,y=this.y;var e=m.elements;this.x=e[0]*x+e[3]*y+e[6];this.y=e[1]*x+e[4]*y+e[7];return this;},min:function(v){this.x=Math.min(this.x,v.x);this.y=Math.min(this.y,v.y);return this;},max:function(v){this.x=Math.max(this.x,v.x);this.y=Math.max(this.y,v.y);return this;},clamp:function(min,max){// assumes min < max, componentwise this.x=Math.max(min.x,Math.min(max.x,this.x));this.y=Math.max(min.y,Math.min(max.y,this.y));return this;},clampScalar:function(){var min=new Vector2();var max=new Vector2();return function clampScalar(minVal,maxVal){min.set(minVal,minVal);max.set(maxVal,maxVal);return this.clamp(min,max);};}(),clampLength:function(min,max){var length=this.length();return this.divideScalar(length||1).multiplyScalar(Math.max(min,Math.min(max,length)));},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this;},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this;},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this;},roundToZero:function(){this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x);this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y);return this;},negate:function(){this.x=-this.x;this.y=-this.y;return this;},dot:function(v){return this.x*v.x+this.y*v.y;},lengthSq:function(){return this.x*this.x+this.y*this.y;},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y);},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y);},normalize:function(){return this.divideScalar(this.length()||1);},angle:function(){// computes the angle in radians with respect to the positive x-axis var angle=Math.atan2(this.y,this.x);if(angle<0)angle+=2*Math.PI;return angle;},distanceTo:function(v){return Math.sqrt(this.distanceToSquared(v));},distanceToSquared:function(v){var dx=this.x-v.x,dy=this.y-v.y;return dx*dx+dy*dy;},manhattanDistanceTo:function(v){return Math.abs(this.x-v.x)+Math.abs(this.y-v.y);},setLength:function(length){return this.normalize().multiplyScalar(length);},lerp:function(v,alpha){this.x+=(v.x-this.x)*alpha;this.y+=(v.y-this.y)*alpha;return this;},lerpVectors:function(v1,v2,alpha){return this.subVectors(v2,v1).multiplyScalar(alpha).add(v1);},equals:function(v){return v.x===this.x&&v.y===this.y;},fromArray:function(array,offset){if(offset===undefined)offset=0;this.x=array[offset];this.y=array[offset+1];return this;},toArray:function(array,offset){if(array===undefined)array=[];if(offset===undefined)offset=0;array[offset]=this.x;array[offset+1]=this.y;return array;},fromBufferAttribute:function(attribute,index,offset){if(offset!==undefined){console.warn('THREE.Vector2: offset has been removed from .fromBufferAttribute().');}this.x=attribute.getX(index);this.y=attribute.getY(index);return this;},rotateAround:function(center,angle){var c=Math.cos(angle),s=Math.sin(angle);var x=this.x-center.x;var y=this.y-center.y;this.x=x*c-y*s+center.x;this.y=x*s+y*c+center.y;return this;}});/** * @author mrdoob / http://mrdoob.com/ * @author supereggbert / http://www.paulbrunt.co.uk/ * @author philogb / http://blog.thejit.org/ * @author jordi_ros / http://plattsoft.com * @author D1plo1d / http://github.com/D1plo1d * @author alteredq / http://alteredqualia.com/ * @author mikael emtinger / http://gomo.se/ * @author timknip / http://www.floorplanner.com/ * @author bhouston / http://clara.io * @author WestLangley / http://github.com/WestLangley */function Matrix4(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];if(arguments.length>0){console.error('THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.');}}Object.assign(Matrix4.prototype,{isMatrix4:true,set:function(n11,n12,n13,n14,n21,n22,n23,n24,n31,n32,n33,n34,n41,n42,n43,n44){var te=this.elements;te[0]=n11;te[4]=n12;te[8]=n13;te[12]=n14;te[1]=n21;te[5]=n22;te[9]=n23;te[13]=n24;te[2]=n31;te[6]=n32;te[10]=n33;te[14]=n34;te[3]=n41;te[7]=n42;te[11]=n43;te[15]=n44;return this;},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this;},clone:function(){return new Matrix4().fromArray(this.elements);},copy:function(m){var te=this.elements;var me=m.elements;te[0]=me[0];te[1]=me[1];te[2]=me[2];te[3]=me[3];te[4]=me[4];te[5]=me[5];te[6]=me[6];te[7]=me[7];te[8]=me[8];te[9]=me[9];te[10]=me[10];te[11]=me[11];te[12]=me[12];te[13]=me[13];te[14]=me[14];te[15]=me[15];return this;},copyPosition:function(m){var te=this.elements,me=m.elements;te[12]=me[12];te[13]=me[13];te[14]=me[14];return this;},extractBasis:function(xAxis,yAxis,zAxis){xAxis.setFromMatrixColumn(this,0);yAxis.setFromMatrixColumn(this,1);zAxis.setFromMatrixColumn(this,2);return this;},makeBasis:function(xAxis,yAxis,zAxis){this.set(xAxis.x,yAxis.x,zAxis.x,0,xAxis.y,yAxis.y,zAxis.y,0,xAxis.z,yAxis.z,zAxis.z,0,0,0,0,1);return this;},extractRotation:function(){var v1=new Vector3();return function extractRotation(m){var te=this.elements;var me=m.elements;var scaleX=1/v1.setFromMatrixColumn(m,0).length();var scaleY=1/v1.setFromMatrixColumn(m,1).length();var scaleZ=1/v1.setFromMatrixColumn(m,2).length();te[0]=me[0]*scaleX;te[1]=me[1]*scaleX;te[2]=me[2]*scaleX;te[4]=me[4]*scaleY;te[5]=me[5]*scaleY;te[6]=me[6]*scaleY;te[8]=me[8]*scaleZ;te[9]=me[9]*scaleZ;te[10]=me[10]*scaleZ;return this;};}(),makeRotationFromEuler:function(euler){if(!(euler&&euler.isEuler)){console.error('THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.');}var te=this.elements;var x=euler.x,y=euler.y,z=euler.z;var a=Math.cos(x),b=Math.sin(x);var c=Math.cos(y),d=Math.sin(y);var e=Math.cos(z),f=Math.sin(z);if(euler.order==='XYZ'){var ae=a*e,af=a*f,be=b*e,bf=b*f;te[0]=c*e;te[4]=-c*f;te[8]=d;te[1]=af+be*d;te[5]=ae-bf*d;te[9]=-b*c;te[2]=bf-ae*d;te[6]=be+af*d;te[10]=a*c;}else if(euler.order==='YXZ'){var ce=c*e,cf=c*f,de=d*e,df=d*f;te[0]=ce+df*b;te[4]=de*b-cf;te[8]=a*d;te[1]=a*f;te[5]=a*e;te[9]=-b;te[2]=cf*b-de;te[6]=df+ce*b;te[10]=a*c;}else if(euler.order==='ZXY'){var ce=c*e,cf=c*f,de=d*e,df=d*f;te[0]=ce-df*b;te[4]=-a*f;te[8]=de+cf*b;te[1]=cf+de*b;te[5]=a*e;te[9]=df-ce*b;te[2]=-a*d;te[6]=b;te[10]=a*c;}else if(euler.order==='ZYX'){var ae=a*e,af=a*f,be=b*e,bf=b*f;te[0]=c*e;te[4]=be*d-af;te[8]=ae*d+bf;te[1]=c*f;te[5]=bf*d+ae;te[9]=af*d-be;te[2]=-d;te[6]=b*c;te[10]=a*c;}else if(euler.order==='YZX'){var ac=a*c,ad=a*d,bc=b*c,bd=b*d;te[0]=c*e;te[4]=bd-ac*f;te[8]=bc*f+ad;te[1]=f;te[5]=a*e;te[9]=-b*e;te[2]=-d*e;te[6]=ad*f+bc;te[10]=ac-bd*f;}else if(euler.order==='XZY'){var ac=a*c,ad=a*d,bc=b*c,bd=b*d;te[0]=c*e;te[4]=-f;te[8]=d*e;te[1]=ac*f+bd;te[5]=a*e;te[9]=ad*f-bc;te[2]=bc*f-ad;te[6]=b*e;te[10]=bd*f+ac;}// last column te[3]=0;te[7]=0;te[11]=0;// bottom row te[12]=0;te[13]=0;te[14]=0;te[15]=1;return this;},makeRotationFromQuaternion:function(q){var te=this.elements;var x=q._x,y=q._y,z=q._z,w=q._w;var x2=x+x,y2=y+y,z2=z+z;var xx=x*x2,xy=x*y2,xz=x*z2;var yy=y*y2,yz=y*z2,zz=z*z2;var wx=w*x2,wy=w*y2,wz=w*z2;te[0]=1-(yy+zz);te[4]=xy-wz;te[8]=xz+wy;te[1]=xy+wz;te[5]=1-(xx+zz);te[9]=yz-wx;te[2]=xz-wy;te[6]=yz+wx;te[10]=1-(xx+yy);// last column te[3]=0;te[7]=0;te[11]=0;// bottom row te[12]=0;te[13]=0;te[14]=0;te[15]=1;return this;},lookAt:function(){var x=new Vector3();var y=new Vector3();var z=new Vector3();return function lookAt(eye,target,up){var te=this.elements;z.subVectors(eye,target);if(z.lengthSq()===0){// eye and target are in the same position z.z=1;}z.normalize();x.crossVectors(up,z);if(x.lengthSq()===0){// up and z are parallel if(Math.abs(up.z)===1){z.x+=0.0001;}else{z.z+=0.0001;}z.normalize();x.crossVectors(up,z);}x.normalize();y.crossVectors(z,x);te[0]=x.x;te[4]=y.x;te[8]=z.x;te[1]=x.y;te[5]=y.y;te[9]=z.y;te[2]=x.z;te[6]=y.z;te[10]=z.z;return this;};}(),multiply:function(m,n){if(n!==undefined){console.warn('THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.');return this.multiplyMatrices(m,n);}return this.multiplyMatrices(this,m);},premultiply:function(m){return this.multiplyMatrices(m,this);},multiplyMatrices:function(a,b){var ae=a.elements;var be=b.elements;var te=this.elements;var a11=ae[0],a12=ae[4],a13=ae[8],a14=ae[12];var a21=ae[1],a22=ae[5],a23=ae[9],a24=ae[13];var a31=ae[2],a32=ae[6],a33=ae[10],a34=ae[14];var a41=ae[3],a42=ae[7],a43=ae[11],a44=ae[15];var b11=be[0],b12=be[4],b13=be[8],b14=be[12];var b21=be[1],b22=be[5],b23=be[9],b24=be[13];var b31=be[2],b32=be[6],b33=be[10],b34=be[14];var b41=be[3],b42=be[7],b43=be[11],b44=be[15];te[0]=a11*b11+a12*b21+a13*b31+a14*b41;te[4]=a11*b12+a12*b22+a13*b32+a14*b42;te[8]=a11*b13+a12*b23+a13*b33+a14*b43;te[12]=a11*b14+a12*b24+a13*b34+a14*b44;te[1]=a21*b11+a22*b21+a23*b31+a24*b41;te[5]=a21*b12+a22*b22+a23*b32+a24*b42;te[9]=a21*b13+a22*b23+a23*b33+a24*b43;te[13]=a21*b14+a22*b24+a23*b34+a24*b44;te[2]=a31*b11+a32*b21+a33*b31+a34*b41;te[6]=a31*b12+a32*b22+a33*b32+a34*b42;te[10]=a31*b13+a32*b23+a33*b33+a34*b43;te[14]=a31*b14+a32*b24+a33*b34+a34*b44;te[3]=a41*b11+a42*b21+a43*b31+a44*b41;te[7]=a41*b12+a42*b22+a43*b32+a44*b42;te[11]=a41*b13+a42*b23+a43*b33+a44*b43;te[15]=a41*b14+a42*b24+a43*b34+a44*b44;return this;},multiplyScalar:function(s){var te=this.elements;te[0]*=s;te[4]*=s;te[8]*=s;te[12]*=s;te[1]*=s;te[5]*=s;te[9]*=s;te[13]*=s;te[2]*=s;te[6]*=s;te[10]*=s;te[14]*=s;te[3]*=s;te[7]*=s;te[11]*=s;te[15]*=s;return this;},applyToBufferAttribute:function(){var v1=new Vector3();return function applyToBufferAttribute(attribute){for(var i=0,l=attribute.count;i=0?1:-1,sqrSin=1-cos*cos;// Skip the Slerp for tiny steps to avoid numeric problems: if(sqrSin>Number.EPSILON){var sin=Math.sqrt(sqrSin),len=Math.atan2(sin,cos*dir);s=Math.sin(s*len)/sin;t=Math.sin(t*len)/sin;}var tDir=t*dir;x0=x0*s+x1*tDir;y0=y0*s+y1*tDir;z0=z0*s+z1*tDir;w0=w0*s+w1*tDir;// Normalize in case we just did a lerp: if(s===1-t){var f=1/Math.sqrt(x0*x0+y0*y0+z0*z0+w0*w0);x0*=f;y0*=f;z0*=f;w0*=f;}}dst[dstOffset]=x0;dst[dstOffset+1]=y0;dst[dstOffset+2]=z0;dst[dstOffset+3]=w0;}});Object.defineProperties(Quaternion.prototype,{x:{get:function(){return this._x;},set:function(value){this._x=value;this.onChangeCallback();}},y:{get:function(){return this._y;},set:function(value){this._y=value;this.onChangeCallback();}},z:{get:function(){return this._z;},set:function(value){this._z=value;this.onChangeCallback();}},w:{get:function(){return this._w;},set:function(value){this._w=value;this.onChangeCallback();}}});Object.assign(Quaternion.prototype,{set:function(x,y,z,w){this._x=x;this._y=y;this._z=z;this._w=w;this.onChangeCallback();return this;},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w);},copy:function(quaternion){this._x=quaternion.x;this._y=quaternion.y;this._z=quaternion.z;this._w=quaternion.w;this.onChangeCallback();return this;},setFromEuler:function(euler,update){if(!(euler&&euler.isEuler)){throw new Error('THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.');}var x=euler._x,y=euler._y,z=euler._z,order=euler.order;// http://www.mathworks.com/matlabcentral/fileexchange/ // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ // content/SpinCalc.m var cos=Math.cos;var sin=Math.sin;var c1=cos(x/2);var c2=cos(y/2);var c3=cos(z/2);var s1=sin(x/2);var s2=sin(y/2);var s3=sin(z/2);if(order==='XYZ'){this._x=s1*c2*c3+c1*s2*s3;this._y=c1*s2*c3-s1*c2*s3;this._z=c1*c2*s3+s1*s2*c3;this._w=c1*c2*c3-s1*s2*s3;}else if(order==='YXZ'){this._x=s1*c2*c3+c1*s2*s3;this._y=c1*s2*c3-s1*c2*s3;this._z=c1*c2*s3-s1*s2*c3;this._w=c1*c2*c3+s1*s2*s3;}else if(order==='ZXY'){this._x=s1*c2*c3-c1*s2*s3;this._y=c1*s2*c3+s1*c2*s3;this._z=c1*c2*s3+s1*s2*c3;this._w=c1*c2*c3-s1*s2*s3;}else if(order==='ZYX'){this._x=s1*c2*c3-c1*s2*s3;this._y=c1*s2*c3+s1*c2*s3;this._z=c1*c2*s3-s1*s2*c3;this._w=c1*c2*c3+s1*s2*s3;}else if(order==='YZX'){this._x=s1*c2*c3+c1*s2*s3;this._y=c1*s2*c3+s1*c2*s3;this._z=c1*c2*s3-s1*s2*c3;this._w=c1*c2*c3-s1*s2*s3;}else if(order==='XZY'){this._x=s1*c2*c3-c1*s2*s3;this._y=c1*s2*c3-s1*c2*s3;this._z=c1*c2*s3+s1*s2*c3;this._w=c1*c2*c3+s1*s2*s3;}if(update!==false)this.onChangeCallback();return this;},setFromAxisAngle:function(axis,angle){// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm // assumes axis is normalized var halfAngle=angle/2,s=Math.sin(halfAngle);this._x=axis.x*s;this._y=axis.y*s;this._z=axis.z*s;this._w=Math.cos(halfAngle);this.onChangeCallback();return this;},setFromRotationMatrix:function(m){// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) var te=m.elements,m11=te[0],m12=te[4],m13=te[8],m21=te[1],m22=te[5],m23=te[9],m31=te[2],m32=te[6],m33=te[10],trace=m11+m22+m33,s;if(trace>0){s=0.5/Math.sqrt(trace+1.0);this._w=0.25/s;this._x=(m32-m23)*s;this._y=(m13-m31)*s;this._z=(m21-m12)*s;}else if(m11>m22&&m11>m33){s=2.0*Math.sqrt(1.0+m11-m22-m33);this._w=(m32-m23)/s;this._x=0.25*s;this._y=(m12+m21)/s;this._z=(m13+m31)/s;}else if(m22>m33){s=2.0*Math.sqrt(1.0+m22-m11-m33);this._w=(m13-m31)/s;this._x=(m12+m21)/s;this._y=0.25*s;this._z=(m23+m32)/s;}else{s=2.0*Math.sqrt(1.0+m33-m11-m22);this._w=(m21-m12)/s;this._x=(m13+m31)/s;this._y=(m23+m32)/s;this._z=0.25*s;}this.onChangeCallback();return this;},setFromUnitVectors:function(){// assumes direction vectors vFrom and vTo are normalized var v1=new Vector3();var r;var EPS=0.000001;return function setFromUnitVectors(vFrom,vTo){if(v1===undefined)v1=new Vector3();r=vFrom.dot(vTo)+1;if(rMath.abs(vFrom.z)){v1.set(-vFrom.y,vFrom.x,0);}else{v1.set(0,-vFrom.z,vFrom.y);}}else{v1.crossVectors(vFrom,vTo);}this._x=v1.x;this._y=v1.y;this._z=v1.z;this._w=r;return this.normalize();};}(),inverse:function(){// quaternion is assumed to have unit length return this.conjugate();},conjugate:function(){this._x*=-1;this._y*=-1;this._z*=-1;this.onChangeCallback();return this;},dot:function(v){return this._x*v._x+this._y*v._y+this._z*v._z+this._w*v._w;},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w;},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w);},normalize:function(){var l=this.length();if(l===0){this._x=0;this._y=0;this._z=0;this._w=1;}else{l=1/l;this._x=this._x*l;this._y=this._y*l;this._z=this._z*l;this._w=this._w*l;}this.onChangeCallback();return this;},multiply:function(q,p){if(p!==undefined){console.warn('THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.');return this.multiplyQuaternions(q,p);}return this.multiplyQuaternions(this,q);},premultiply:function(q){return this.multiplyQuaternions(q,this);},multiplyQuaternions:function(a,b){// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm var qax=a._x,qay=a._y,qaz=a._z,qaw=a._w;var qbx=b._x,qby=b._y,qbz=b._z,qbw=b._w;this._x=qax*qbw+qaw*qbx+qay*qbz-qaz*qby;this._y=qay*qbw+qaw*qby+qaz*qbx-qax*qbz;this._z=qaz*qbw+qaw*qbz+qax*qby-qay*qbx;this._w=qaw*qbw-qax*qbx-qay*qby-qaz*qbz;this.onChangeCallback();return this;},slerp:function(qb,t){if(t===0)return this;if(t===1)return this.copy(qb);var x=this._x,y=this._y,z=this._z,w=this._w;// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ var cosHalfTheta=w*qb._w+x*qb._x+y*qb._y+z*qb._z;if(cosHalfTheta<0){this._w=-qb._w;this._x=-qb._x;this._y=-qb._y;this._z=-qb._z;cosHalfTheta=-cosHalfTheta;}else{this.copy(qb);}if(cosHalfTheta>=1.0){this._w=w;this._x=x;this._y=y;this._z=z;return this;}var sinHalfTheta=Math.sqrt(1.0-cosHalfTheta*cosHalfTheta);if(Math.abs(sinHalfTheta)<0.001){this._w=0.5*(w+this._w);this._x=0.5*(x+this._x);this._y=0.5*(y+this._y);this._z=0.5*(z+this._z);return this;}var halfTheta=Math.atan2(sinHalfTheta,cosHalfTheta);var ratioA=Math.sin((1-t)*halfTheta)/sinHalfTheta,ratioB=Math.sin(t*halfTheta)/sinHalfTheta;this._w=w*ratioA+this._w*ratioB;this._x=x*ratioA+this._x*ratioB;this._y=y*ratioA+this._y*ratioB;this._z=z*ratioA+this._z*ratioB;this.onChangeCallback();return this;},equals:function(quaternion){return quaternion._x===this._x&&quaternion._y===this._y&&quaternion._z===this._z&&quaternion._w===this._w;},fromArray:function(array,offset){if(offset===undefined)offset=0;this._x=array[offset];this._y=array[offset+1];this._z=array[offset+2];this._w=array[offset+3];this.onChangeCallback();return this;},toArray:function(array,offset){if(array===undefined)array=[];if(offset===undefined)offset=0;array[offset]=this._x;array[offset+1]=this._y;array[offset+2]=this._z;array[offset+3]=this._w;return array;},onChange:function(callback){this.onChangeCallback=callback;return this;},onChangeCallback:function(){}});/** * @author mrdoob / http://mrdoob.com/ * @author kile / http://kile.stravaganza.org/ * @author philogb / http://blog.thejit.org/ * @author mikael emtinger / http://gomo.se/ * @author egraether / http://egraether.com/ * @author WestLangley / http://github.com/WestLangley */function Vector3(x,y,z){this.x=x||0;this.y=y||0;this.z=z||0;}Object.assign(Vector3.prototype,{isVector3:true,set:function(x,y,z){this.x=x;this.y=y;this.z=z;return this;},setScalar:function(scalar){this.x=scalar;this.y=scalar;this.z=scalar;return this;},setX:function(x){this.x=x;return this;},setY:function(y){this.y=y;return this;},setZ:function(z){this.z=z;return this;},setComponent:function(index,value){switch(index){case 0:this.x=value;break;case 1:this.y=value;break;case 2:this.z=value;break;default:throw new Error('index is out of range: '+index);}return this;},getComponent:function(index){switch(index){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error('index is out of range: '+index);}},clone:function(){return new this.constructor(this.x,this.y,this.z);},copy:function(v){this.x=v.x;this.y=v.y;this.z=v.z;return this;},add:function(v,w){if(w!==undefined){console.warn('THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.');return this.addVectors(v,w);}this.x+=v.x;this.y+=v.y;this.z+=v.z;return this;},addScalar:function(s){this.x+=s;this.y+=s;this.z+=s;return this;},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this;},addScaledVector:function(v,s){this.x+=v.x*s;this.y+=v.y*s;this.z+=v.z*s;return this;},sub:function(v,w){if(w!==undefined){console.warn('THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.');return this.subVectors(v,w);}this.x-=v.x;this.y-=v.y;this.z-=v.z;return this;},subScalar:function(s){this.x-=s;this.y-=s;this.z-=s;return this;},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this;},multiply:function(v,w){if(w!==undefined){console.warn('THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.');return this.multiplyVectors(v,w);}this.x*=v.x;this.y*=v.y;this.z*=v.z;return this;},multiplyScalar:function(scalar){this.x*=scalar;this.y*=scalar;this.z*=scalar;return this;},multiplyVectors:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this;},applyEuler:function(){var quaternion=new Quaternion();return function applyEuler(euler){if(!(euler&&euler.isEuler)){console.error('THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.');}return this.applyQuaternion(quaternion.setFromEuler(euler));};}(),applyAxisAngle:function(){var quaternion=new Quaternion();return function applyAxisAngle(axis,angle){return this.applyQuaternion(quaternion.setFromAxisAngle(axis,angle));};}(),applyMatrix3:function(m){var x=this.x,y=this.y,z=this.z;var e=m.elements;this.x=e[0]*x+e[3]*y+e[6]*z;this.y=e[1]*x+e[4]*y+e[7]*z;this.z=e[2]*x+e[5]*y+e[8]*z;return this;},applyMatrix4:function(m){var x=this.x,y=this.y,z=this.z;var e=m.elements;var w=1/(e[3]*x+e[7]*y+e[11]*z+e[15]);this.x=(e[0]*x+e[4]*y+e[8]*z+e[12])*w;this.y=(e[1]*x+e[5]*y+e[9]*z+e[13])*w;this.z=(e[2]*x+e[6]*y+e[10]*z+e[14])*w;return this;},applyQuaternion:function(q){var x=this.x,y=this.y,z=this.z;var qx=q.x,qy=q.y,qz=q.z,qw=q.w;// calculate quat * vector var ix=qw*x+qy*z-qz*y;var iy=qw*y+qz*x-qx*z;var iz=qw*z+qx*y-qy*x;var iw=-qx*x-qy*y-qz*z;// calculate result * inverse quat this.x=ix*qw+iw*-qx+iy*-qz-iz*-qy;this.y=iy*qw+iw*-qy+iz*-qx-ix*-qz;this.z=iz*qw+iw*-qz+ix*-qy-iy*-qx;return this;},project:function(){var matrix=new Matrix4();return function project(camera){matrix.multiplyMatrices(camera.projectionMatrix,matrix.getInverse(camera.matrixWorld));return this.applyMatrix4(matrix);};}(),unproject:function(){var matrix=new Matrix4();return function unproject(camera){matrix.multiplyMatrices(camera.matrixWorld,matrix.getInverse(camera.projectionMatrix));return this.applyMatrix4(matrix);};}(),transformDirection:function(m){// input: THREE.Matrix4 affine matrix // vector interpreted as a direction var x=this.x,y=this.y,z=this.z;var e=m.elements;this.x=e[0]*x+e[4]*y+e[8]*z;this.y=e[1]*x+e[5]*y+e[9]*z;this.z=e[2]*x+e[6]*y+e[10]*z;return this.normalize();},divide:function(v){this.x/=v.x;this.y/=v.y;this.z/=v.z;return this;},divideScalar:function(scalar){return this.multiplyScalar(1/scalar);},min:function(v){this.x=Math.min(this.x,v.x);this.y=Math.min(this.y,v.y);this.z=Math.min(this.z,v.z);return this;},max:function(v){this.x=Math.max(this.x,v.x);this.y=Math.max(this.y,v.y);this.z=Math.max(this.z,v.z);return this;},clamp:function(min,max){// assumes min < max, componentwise this.x=Math.max(min.x,Math.min(max.x,this.x));this.y=Math.max(min.y,Math.min(max.y,this.y));this.z=Math.max(min.z,Math.min(max.z,this.z));return this;},clampScalar:function(){var min=new Vector3();var max=new Vector3();return function clampScalar(minVal,maxVal){min.set(minVal,minVal,minVal);max.set(maxVal,maxVal,maxVal);return this.clamp(min,max);};}(),clampLength:function(min,max){var length=this.length();return this.divideScalar(length||1).multiplyScalar(Math.max(min,Math.min(max,length)));},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);return this;},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);return this;},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);return this;},roundToZero:function(){this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x);this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y);this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z);return this;},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;return this;},dot:function(v){return this.x*v.x+this.y*v.y+this.z*v.z;},// TODO lengthSquared? lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z;},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z);},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z);},normalize:function(){return this.divideScalar(this.length()||1);},setLength:function(length){return this.normalize().multiplyScalar(length);},lerp:function(v,alpha){this.x+=(v.x-this.x)*alpha;this.y+=(v.y-this.y)*alpha;this.z+=(v.z-this.z)*alpha;return this;},lerpVectors:function(v1,v2,alpha){return this.subVectors(v2,v1).multiplyScalar(alpha).add(v1);},cross:function(v,w){if(w!==undefined){console.warn('THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.');return this.crossVectors(v,w);}return this.crossVectors(this,v);},crossVectors:function(a,b){var ax=a.x,ay=a.y,az=a.z;var bx=b.x,by=b.y,bz=b.z;this.x=ay*bz-az*by;this.y=az*bx-ax*bz;this.z=ax*by-ay*bx;return this;},projectOnVector:function(vector){var scalar=vector.dot(this)/vector.lengthSq();return this.copy(vector).multiplyScalar(scalar);},projectOnPlane:function(){var v1=new Vector3();return function projectOnPlane(planeNormal){v1.copy(this).projectOnVector(planeNormal);return this.sub(v1);};}(),reflect:function(){// reflect incident vector off plane orthogonal to normal // normal is assumed to have unit length var v1=new Vector3();return function reflect(normal){return this.sub(v1.copy(normal).multiplyScalar(2*this.dot(normal)));};}(),angleTo:function(v){var theta=this.dot(v)/Math.sqrt(this.lengthSq()*v.lengthSq());// clamp, to handle numerical problems return Math.acos(_Math.clamp(theta,-1,1));},distanceTo:function(v){return Math.sqrt(this.distanceToSquared(v));},distanceToSquared:function(v){var dx=this.x-v.x,dy=this.y-v.y,dz=this.z-v.z;return dx*dx+dy*dy+dz*dz;},manhattanDistanceTo:function(v){return Math.abs(this.x-v.x)+Math.abs(this.y-v.y)+Math.abs(this.z-v.z);},setFromSpherical:function(s){var sinPhiRadius=Math.sin(s.phi)*s.radius;this.x=sinPhiRadius*Math.sin(s.theta);this.y=Math.cos(s.phi)*s.radius;this.z=sinPhiRadius*Math.cos(s.theta);return this;},setFromCylindrical:function(c){this.x=c.radius*Math.sin(c.theta);this.y=c.y;this.z=c.radius*Math.cos(c.theta);return this;},setFromMatrixPosition:function(m){var e=m.elements;this.x=e[12];this.y=e[13];this.z=e[14];return this;},setFromMatrixScale:function(m){var sx=this.setFromMatrixColumn(m,0).length();var sy=this.setFromMatrixColumn(m,1).length();var sz=this.setFromMatrixColumn(m,2).length();this.x=sx;this.y=sy;this.z=sz;return this;},setFromMatrixColumn:function(m,index){return this.fromArray(m.elements,index*4);},equals:function(v){return v.x===this.x&&v.y===this.y&&v.z===this.z;},fromArray:function(array,offset){if(offset===undefined)offset=0;this.x=array[offset];this.y=array[offset+1];this.z=array[offset+2];return this;},toArray:function(array,offset){if(array===undefined)array=[];if(offset===undefined)offset=0;array[offset]=this.x;array[offset+1]=this.y;array[offset+2]=this.z;return array;},fromBufferAttribute:function(attribute,index,offset){if(offset!==undefined){console.warn('THREE.Vector3: offset has been removed from .fromBufferAttribute().');}this.x=attribute.getX(index);this.y=attribute.getY(index);this.z=attribute.getZ(index);return this;}});/** * @author alteredq / http://alteredqualia.com/ * @author WestLangley / http://github.com/WestLangley * @author bhouston / http://clara.io * @author tschw */function Matrix3(){this.elements=[1,0,0,0,1,0,0,0,1];if(arguments.length>0){console.error('THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.');}}Object.assign(Matrix3.prototype,{isMatrix3:true,set:function(n11,n12,n13,n21,n22,n23,n31,n32,n33){var te=this.elements;te[0]=n11;te[1]=n21;te[2]=n31;te[3]=n12;te[4]=n22;te[5]=n32;te[6]=n13;te[7]=n23;te[8]=n33;return this;},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this;},clone:function(){return new this.constructor().fromArray(this.elements);},copy:function(m){var te=this.elements;var me=m.elements;te[0]=me[0];te[1]=me[1];te[2]=me[2];te[3]=me[3];te[4]=me[4];te[5]=me[5];te[6]=me[6];te[7]=me[7];te[8]=me[8];return this;},setFromMatrix4:function(m){var me=m.elements;this.set(me[0],me[4],me[8],me[1],me[5],me[9],me[2],me[6],me[10]);return this;},applyToBufferAttribute:function(){var v1=new Vector3();return function applyToBufferAttribute(attribute){for(var i=0,l=attribute.count;i2048||canvas.height>2048){return canvas.toDataURL('image/jpeg',0.6);}else{return canvas.toDataURL('image/png');}}var output={metadata:{version:4.5,type:'Texture',generator:'Texture.toJSON'},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY};if(this.image!==undefined){// TODO: Move to THREE.Image var image=this.image;if(image.uuid===undefined){image.uuid=_Math.generateUUID();// UGH }if(!isRootObject&&meta.images[image.uuid]===undefined){meta.images[image.uuid]={uuid:image.uuid,url:getDataURL(image)};}output.image=image.uuid;}if(!isRootObject){meta.textures[this.uuid]=output;}return output;},dispose:function(){this.dispatchEvent({type:'dispose'});},transformUv:function(uv){if(this.mapping!==UVMapping)return;uv.applyMatrix3(this.matrix);if(uv.x<0||uv.x>1){switch(this.wrapS){case RepeatWrapping:uv.x=uv.x-Math.floor(uv.x);break;case ClampToEdgeWrapping:uv.x=uv.x<0?0:1;break;case MirroredRepeatWrapping:if(Math.abs(Math.floor(uv.x)%2)===1){uv.x=Math.ceil(uv.x)-uv.x;}else{uv.x=uv.x-Math.floor(uv.x);}break;}}if(uv.y<0||uv.y>1){switch(this.wrapT){case RepeatWrapping:uv.y=uv.y-Math.floor(uv.y);break;case ClampToEdgeWrapping:uv.y=uv.y<0?0:1;break;case MirroredRepeatWrapping:if(Math.abs(Math.floor(uv.y)%2)===1){uv.y=Math.ceil(uv.y)-uv.y;}else{uv.y=uv.y-Math.floor(uv.y);}break;}}if(this.flipY){uv.y=1-uv.y;}}});Object.defineProperty(Texture.prototype,"needsUpdate",{set:function(value){if(value===true)this.version++;}});/** * @author supereggbert / http://www.paulbrunt.co.uk/ * @author philogb / http://blog.thejit.org/ * @author mikael emtinger / http://gomo.se/ * @author egraether / http://egraether.com/ * @author WestLangley / http://github.com/WestLangley */function Vector4(x,y,z,w){this.x=x||0;this.y=y||0;this.z=z||0;this.w=w!==undefined?w:1;}Object.assign(Vector4.prototype,{isVector4:true,set:function(x,y,z,w){this.x=x;this.y=y;this.z=z;this.w=w;return this;},setScalar:function(scalar){this.x=scalar;this.y=scalar;this.z=scalar;this.w=scalar;return this;},setX:function(x){this.x=x;return this;},setY:function(y){this.y=y;return this;},setZ:function(z){this.z=z;return this;},setW:function(w){this.w=w;return this;},setComponent:function(index,value){switch(index){case 0:this.x=value;break;case 1:this.y=value;break;case 2:this.z=value;break;case 3:this.w=value;break;default:throw new Error('index is out of range: '+index);}return this;},getComponent:function(index){switch(index){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error('index is out of range: '+index);}},clone:function(){return new this.constructor(this.x,this.y,this.z,this.w);},copy:function(v){this.x=v.x;this.y=v.y;this.z=v.z;this.w=v.w!==undefined?v.w:1;return this;},add:function(v,w){if(w!==undefined){console.warn('THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.');return this.addVectors(v,w);}this.x+=v.x;this.y+=v.y;this.z+=v.z;this.w+=v.w;return this;},addScalar:function(s){this.x+=s;this.y+=s;this.z+=s;this.w+=s;return this;},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this;},addScaledVector:function(v,s){this.x+=v.x*s;this.y+=v.y*s;this.z+=v.z*s;this.w+=v.w*s;return this;},sub:function(v,w){if(w!==undefined){console.warn('THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.');return this.subVectors(v,w);}this.x-=v.x;this.y-=v.y;this.z-=v.z;this.w-=v.w;return this;},subScalar:function(s){this.x-=s;this.y-=s;this.z-=s;this.w-=s;return this;},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this;},multiplyScalar:function(scalar){this.x*=scalar;this.y*=scalar;this.z*=scalar;this.w*=scalar;return this;},applyMatrix4:function(m){var x=this.x,y=this.y,z=this.z,w=this.w;var e=m.elements;this.x=e[0]*x+e[4]*y+e[8]*z+e[12]*w;this.y=e[1]*x+e[5]*y+e[9]*z+e[13]*w;this.z=e[2]*x+e[6]*y+e[10]*z+e[14]*w;this.w=e[3]*x+e[7]*y+e[11]*z+e[15]*w;return this;},divideScalar:function(scalar){return this.multiplyScalar(1/scalar);},setAxisAngleFromQuaternion:function(q){// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm // q is assumed to be normalized this.w=2*Math.acos(q.w);var s=Math.sqrt(1-q.w*q.w);if(s<0.0001){this.x=1;this.y=0;this.z=0;}else{this.x=q.x/s;this.y=q.y/s;this.z=q.z/s;}return this;},setAxisAngleFromRotationMatrix:function(m){// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) var angle,x,y,z,// variables for result epsilon=0.01,// margin to allow for rounding errors epsilon2=0.1,// margin to distinguish between 0 and 180 degrees te=m.elements,m11=te[0],m12=te[4],m13=te[8],m21=te[1],m22=te[5],m23=te[9],m31=te[2],m32=te[6],m33=te[10];if(Math.abs(m12-m21)yy&&xx>zz){// m11 is the largest diagonal term if(xxzz){// m22 is the largest diagonal term if(yymaxX)maxX=x;if(y>maxY)maxY=y;if(z>maxZ)maxZ=z;}this.min.set(minX,minY,minZ);this.max.set(maxX,maxY,maxZ);return this;},setFromBufferAttribute:function(attribute){var minX=+Infinity;var minY=+Infinity;var minZ=+Infinity;var maxX=-Infinity;var maxY=-Infinity;var maxZ=-Infinity;for(var i=0,l=attribute.count;imaxX)maxX=x;if(y>maxY)maxY=y;if(z>maxZ)maxZ=z;}this.min.set(minX,minY,minZ);this.max.set(maxX,maxY,maxZ);return this;},setFromPoints:function(points){this.makeEmpty();for(var i=0,il=points.length;ithis.max.x||point.ythis.max.y||point.zthis.max.z?false:true;},containsBox:function(box){return this.min.x<=box.min.x&&box.max.x<=this.max.x&&this.min.y<=box.min.y&&box.max.y<=this.max.y&&this.min.z<=box.min.z&&box.max.z<=this.max.z;},getParameter:function(point,target){// This can potentially have a divide by zero if the box // has a size dimension of 0. if(target===undefined){console.warn('THREE.Box3: .getParameter() target is now required');target=new Vector3();}return target.set((point.x-this.min.x)/(this.max.x-this.min.x),(point.y-this.min.y)/(this.max.y-this.min.y),(point.z-this.min.z)/(this.max.z-this.min.z));},intersectsBox:function(box){// using 6 splitting planes to rule out intersections. return box.max.xthis.max.x||box.max.ythis.max.y||box.max.zthis.max.z?false:true;},intersectsSphere:function(){var closestPoint=new Vector3();return function intersectsSphere(sphere){// Find the point on the AABB closest to the sphere center. this.clampPoint(sphere.center,closestPoint);// If that point is inside the sphere, the AABB and sphere intersect. return closestPoint.distanceToSquared(sphere.center)<=sphere.radius*sphere.radius;};}(),intersectsPlane:function(plane){// We compute the minimum and maximum dot product values. If those values // are on the same side (back or front) of the plane, then there is no intersection. var min,max;if(plane.normal.x>0){min=plane.normal.x*this.min.x;max=plane.normal.x*this.max.x;}else{min=plane.normal.x*this.max.x;max=plane.normal.x*this.min.x;}if(plane.normal.y>0){min+=plane.normal.y*this.min.y;max+=plane.normal.y*this.max.y;}else{min+=plane.normal.y*this.max.y;max+=plane.normal.y*this.min.y;}if(plane.normal.z>0){min+=plane.normal.z*this.min.z;max+=plane.normal.z*this.max.z;}else{min+=plane.normal.z*this.max.z;max+=plane.normal.z*this.min.z;}return min<=plane.constant&&max>=plane.constant;},intersectsTriangle:function(){// triangle centered vertices var v0=new Vector3();var v1=new Vector3();var v2=new Vector3();// triangle edge vectors var f0=new Vector3();var f1=new Vector3();var f2=new Vector3();var testAxis=new Vector3();var center=new Vector3();var extents=new Vector3();var triangleNormal=new Vector3();function satForAxes(axes){var i,j;for(i=0,j=axes.length-3;i<=j;i+=3){testAxis.fromArray(axes,i);// project the aabb onto the seperating axis var r=extents.x*Math.abs(testAxis.x)+extents.y*Math.abs(testAxis.y)+extents.z*Math.abs(testAxis.z);// project all 3 vertices of the triangle onto the seperating axis var p0=v0.dot(testAxis);var p1=v1.dot(testAxis);var p2=v2.dot(testAxis);// actual test, basically see if either of the most extreme of the triangle points intersects r if(Math.max(-Math.max(p0,p1,p2),Math.min(p0,p1,p2))>r){// points of the projected triangle are outside the projected half-length of the aabb // the axis is seperating and we can exit return false;}}return true;}return function intersectsTriangle(triangle){if(this.isEmpty()){return false;}// compute box center and extents this.getCenter(center);extents.subVectors(this.max,center);// translate triangle to aabb origin v0.subVectors(triangle.a,center);v1.subVectors(triangle.b,center);v2.subVectors(triangle.c,center);// compute edge vectors for triangle f0.subVectors(v1,v0);f1.subVectors(v2,v1);f2.subVectors(v0,v2);// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb // make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation // axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned) var axes=[0,-f0.z,f0.y,0,-f1.z,f1.y,0,-f2.z,f2.y,f0.z,0,-f0.x,f1.z,0,-f1.x,f2.z,0,-f2.x,-f0.y,f0.x,0,-f1.y,f1.x,0,-f2.y,f2.x,0];if(!satForAxes(axes)){return false;}// test 3 face normals from the aabb axes=[1,0,0,0,1,0,0,0,1];if(!satForAxes(axes)){return false;}// finally testing the face normal of the triangle // use already existing triangle edge vectors here triangleNormal.crossVectors(f0,f1);axes=[triangleNormal.x,triangleNormal.y,triangleNormal.z];return satForAxes(axes);};}(),clampPoint:function(point,target){if(target===undefined){console.warn('THREE.Box3: .clampPoint() target is now required');target=new Vector3();}return target.copy(point).clamp(this.min,this.max);},distanceToPoint:function(){var v1=new Vector3();return function distanceToPoint(point){var clampedPoint=v1.copy(point).clamp(this.min,this.max);return clampedPoint.sub(point).length();};}(),getBoundingSphere:function(){var v1=new Vector3();return function getBoundingSphere(target){if(target===undefined){console.warn('THREE.Box3: .getBoundingSphere() target is now required');target=new Sphere();}this.getCenter(target.center);target.radius=this.getSize(v1).length()*0.5;return target;};}(),intersect:function(box){this.min.max(box.min);this.max.min(box.max);// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values. if(this.isEmpty())this.makeEmpty();return this;},union:function(box){this.min.min(box.min);this.max.max(box.max);return this;},applyMatrix4:function(){var points=[new Vector3(),new Vector3(),new Vector3(),new Vector3(),new Vector3(),new Vector3(),new Vector3(),new Vector3()];return function applyMatrix4(matrix){// transform of empty box is an empty box. if(this.isEmpty())return this;// NOTE: I am using a binary pattern to specify all 2^3 combinations below points[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(matrix);// 000 points[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(matrix);// 001 points[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(matrix);// 010 points[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(matrix);// 011 points[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(matrix);// 100 points[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(matrix);// 101 points[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(matrix);// 110 points[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(matrix);// 111 this.setFromPoints(points);return this;};}(),translate:function(offset){this.min.add(offset);this.max.add(offset);return this;},equals:function(box){return box.min.equals(this.min)&&box.max.equals(this.max);}});/** * @author bhouston / http://clara.io * @author mrdoob / http://mrdoob.com/ */function Sphere(center,radius){this.center=center!==undefined?center:new Vector3();this.radius=radius!==undefined?radius:0;}Object.assign(Sphere.prototype,{set:function(center,radius){this.center.copy(center);this.radius=radius;return this;},setFromPoints:function(){var box=new Box3();return function setFromPoints(points,optionalCenter){var center=this.center;if(optionalCenter!==undefined){center.copy(optionalCenter);}else{box.setFromPoints(points).getCenter(center);}var maxRadiusSq=0;for(var i=0,il=points.length;ithis.radius*this.radius){target.sub(this.center).normalize();target.multiplyScalar(this.radius).add(this.center);}return target;},getBoundingBox:function(target){if(target===undefined){console.warn('THREE.Sphere: .getBoundingBox() target is now required');target=new Box3();}target.set(this.center,this.center);target.expandByScalar(this.radius);return target;},applyMatrix4:function(matrix){this.center.applyMatrix4(matrix);this.radius=this.radius*matrix.getMaxScaleOnAxis();return this;},translate:function(offset){this.center.add(offset);return this;},equals:function(sphere){return sphere.center.equals(this.center)&&sphere.radius===this.radius;}});/** * @author bhouston / http://clara.io */function Plane(normal,constant){// normal is assumed to be normalized this.normal=normal!==undefined?normal:new Vector3(1,0,0);this.constant=constant!==undefined?constant:0;}Object.assign(Plane.prototype,{set:function(normal,constant){this.normal.copy(normal);this.constant=constant;return this;},setComponents:function(x,y,z,w){this.normal.set(x,y,z);this.constant=w;return this;},setFromNormalAndCoplanarPoint:function(normal,point){this.normal.copy(normal);this.constant=-point.dot(this.normal);return this;},setFromCoplanarPoints:function(){var v1=new Vector3();var v2=new Vector3();return function setFromCoplanarPoints(a,b,c){var normal=v1.subVectors(c,b).cross(v2.subVectors(a,b)).normalize();// Q: should an error be thrown if normal is zero (e.g. degenerate plane)? this.setFromNormalAndCoplanarPoint(normal,a);return this;};}(),clone:function(){return new this.constructor().copy(this);},copy:function(plane){this.normal.copy(plane.normal);this.constant=plane.constant;return this;},normalize:function(){// Note: will lead to a divide by zero if the plane is invalid. var inverseNormalLength=1.0/this.normal.length();this.normal.multiplyScalar(inverseNormalLength);this.constant*=inverseNormalLength;return this;},negate:function(){this.constant*=-1;this.normal.negate();return this;},distanceToPoint:function(point){return this.normal.dot(point)+this.constant;},distanceToSphere:function(sphere){return this.distanceToPoint(sphere.center)-sphere.radius;},projectPoint:function(point,target){if(target===undefined){console.warn('THREE.Plane: .projectPoint() target is now required');target=new Vector3();}return target.copy(this.normal).multiplyScalar(-this.distanceToPoint(point)).add(point);},intersectLine:function(){var v1=new Vector3();return function intersectLine(line,target){if(target===undefined){console.warn('THREE.Plane: .intersectLine() target is now required');target=new Vector3();}var direction=line.delta(v1);var denominator=this.normal.dot(direction);if(denominator===0){// line is coplanar, return origin if(this.distanceToPoint(line.start)===0){return target.copy(line.start);}// Unsure if this is the correct method to handle this case. return undefined;}var t=-(line.start.dot(this.normal)+this.constant)/denominator;if(t<0||t>1){return undefined;}return target.copy(direction).multiplyScalar(t).add(line.start);};}(),intersectsLine:function(line){// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it. var startSign=this.distanceToPoint(line.start);var endSign=this.distanceToPoint(line.end);return startSign<0&&endSign>0||endSign<0&&startSign>0;},intersectsBox:function(box){return box.intersectsPlane(this);},intersectsSphere:function(sphere){return sphere.intersectsPlane(this);},coplanarPoint:function(target){if(target===undefined){console.warn('THREE.Plane: .coplanarPoint() target is now required');target=new Vector3();}return target.copy(this.normal).multiplyScalar(-this.constant);},applyMatrix4:function(){var v1=new Vector3();var m1=new Matrix3();return function applyMatrix4(matrix,optionalNormalMatrix){var normalMatrix=optionalNormalMatrix||m1.getNormalMatrix(matrix);var referencePoint=this.coplanarPoint(v1).applyMatrix4(matrix);var normal=this.normal.applyMatrix3(normalMatrix).normalize();this.constant=-referencePoint.dot(normal);return this;};}(),translate:function(offset){this.constant-=offset.dot(this.normal);return this;},equals:function(plane){return plane.normal.equals(this.normal)&&plane.constant===this.constant;}});/** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ * @author bhouston / http://clara.io */function Frustum(p0,p1,p2,p3,p4,p5){this.planes=[p0!==undefined?p0:new Plane(),p1!==undefined?p1:new Plane(),p2!==undefined?p2:new Plane(),p3!==undefined?p3:new Plane(),p4!==undefined?p4:new Plane(),p5!==undefined?p5:new Plane()];}Object.assign(Frustum.prototype,{set:function(p0,p1,p2,p3,p4,p5){var planes=this.planes;planes[0].copy(p0);planes[1].copy(p1);planes[2].copy(p2);planes[3].copy(p3);planes[4].copy(p4);planes[5].copy(p5);return this;},clone:function(){return new this.constructor().copy(this);},copy:function(frustum){var planes=this.planes;for(var i=0;i<6;i++){planes[i].copy(frustum.planes[i]);}return this;},setFromMatrix:function(m){var planes=this.planes;var me=m.elements;var me0=me[0],me1=me[1],me2=me[2],me3=me[3];var me4=me[4],me5=me[5],me6=me[6],me7=me[7];var me8=me[8],me9=me[9],me10=me[10],me11=me[11];var me12=me[12],me13=me[13],me14=me[14],me15=me[15];planes[0].setComponents(me3-me0,me7-me4,me11-me8,me15-me12).normalize();planes[1].setComponents(me3+me0,me7+me4,me11+me8,me15+me12).normalize();planes[2].setComponents(me3+me1,me7+me5,me11+me9,me15+me13).normalize();planes[3].setComponents(me3-me1,me7-me5,me11-me9,me15-me13).normalize();planes[4].setComponents(me3-me2,me7-me6,me11-me10,me15-me14).normalize();planes[5].setComponents(me3+me2,me7+me6,me11+me10,me15+me14).normalize();return this;},intersectsObject:function(){var sphere=new Sphere();return function intersectsObject(object){var geometry=object.geometry;if(geometry.boundingSphere===null)geometry.computeBoundingSphere();sphere.copy(geometry.boundingSphere).applyMatrix4(object.matrixWorld);return this.intersectsSphere(sphere);};}(),intersectsSprite:function(){var sphere=new Sphere();return function intersectsSprite(sprite){sphere.center.set(0,0,0);sphere.radius=0.7071067811865476;sphere.applyMatrix4(sprite.matrixWorld);return this.intersectsSphere(sphere);};}(),intersectsSphere:function(sphere){var planes=this.planes;var center=sphere.center;var negRadius=-sphere.radius;for(var i=0;i<6;i++){var distance=planes[i].distanceToPoint(center);if(distance0?box.min.x:box.max.x;p2.x=plane.normal.x>0?box.max.x:box.min.x;p1.y=plane.normal.y>0?box.min.y:box.max.y;p2.y=plane.normal.y>0?box.max.y:box.min.y;p1.z=plane.normal.z>0?box.min.z:box.max.z;p2.z=plane.normal.z>0?box.max.z:box.min.z;var d1=plane.distanceToPoint(p1);var d2=plane.distanceToPoint(p2);// if both outside plane, no intersection if(d1<0&&d2<0){return false;}}return true;};}(),containsPoint:function(point){var planes=this.planes;for(var i=0;i<6;i++){if(planes[i].distanceToPoint(point)<0){return false;}}return true;}});var alphamap_fragment="#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n";var alphamap_pars_fragment="#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n";var alphatest_fragment="#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n";var aomap_fragment="#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n";var aomap_pars_fragment="#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif";var begin_vertex="\nvec3 transformed = vec3( position );\n";var beginnormal_vertex="\nvec3 objectNormal = vec3( normal );\n";var bsdfs="float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n";var bumpmap_pars_fragment="#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n";var clipping_planes_fragment="#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t#endif\n#endif\n";var clipping_planes_pars_fragment="#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n";var clipping_planes_pars_vertex="#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n";var clipping_planes_vertex="#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n";var color_fragment="#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif";var color_pars_fragment="#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n";var color_pars_vertex="#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif";var color_vertex="#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif";var common="#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\n";var cube_uv_reflection_fragment="#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale = bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n";var defaultnormal_vertex="vec3 transformedNormal = normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n";var displacementmap_pars_vertex="#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n";var displacementmap_vertex="#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n";var emissivemap_fragment="#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n";var emissivemap_pars_fragment="#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n";var encodings_fragment=" gl_FragColor = linearToOutputTexel( gl_FragColor );\n";var encodings_pars_fragment="\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract(Le);\n\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4( max(vRGB, 0.0), 1.0 );\n}\n";var envmap_fragment="#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n";var envmap_pars_fragment="#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n";var envmap_pars_vertex="#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n";var envmap_vertex="#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n";var fog_vertex="\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif";var fog_pars_vertex="#ifdef USE_FOG\n varying float fogDepth;\n#endif\n";var fog_fragment="#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n";var fog_pars_fragment="#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif\n";var gradientmap_pars_fragment="#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n";var lightmap_fragment="#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n";var lightmap_pars_fragment="#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif";var lights_lambert_vertex="vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n";var lights_pars_begin="uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t\tfloat shadowCameraNear;\n\t\tfloat shadowCameraFar;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n";var lights_pars_maps="#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n";var lights_phong_fragment="BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n";var lights_phong_pars_fragment="varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n";var lights_physical_fragment="PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n";var lights_physical_pars_fragment="struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n";var lights_fragment_begin="\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearCoatRadiance = vec3( 0.0 );\n#endif\n";var lights_fragment_maps="#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), maxMipLevel );\n\t#ifndef STANDARD\n\t\tclearCoatRadiance += getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), maxMipLevel );\n\t#endif\n#endif\n";var lights_fragment_end="#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n";var logdepthbuf_fragment="#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif";var logdepthbuf_pars_fragment="#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n";var logdepthbuf_pars_vertex="#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif";var logdepthbuf_vertex="#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\tgl_Position.z *= gl_Position.w;\n\t#endif\n#endif\n";var map_fragment="#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n";var map_pars_fragment="#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n";var map_particle_fragment="#ifdef USE_MAP\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n";var map_particle_pars_fragment="#ifdef USE_MAP\n\tuniform mat3 uvTransform;\n\tuniform sampler2D map;\n#endif\n";var metalnessmap_fragment="float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n";var metalnessmap_pars_fragment="#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif";var morphnormal_vertex="#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n";var morphtarget_pars_vertex="#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif";var morphtarget_vertex="#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n";var normal_fragment_begin="#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n#endif\n";var normal_fragment_maps="#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n";var normalmap_pars_fragment="#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\t\tscale *= float( gl_FrontFacing ) * 2.0 - 1.0;\n\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n";var packing="vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n";var premultiplied_alpha_fragment="#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n";var project_vertex="vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\n";var dithering_fragment="#if defined( DITHERING )\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n";var dithering_pars_fragment="#if defined( DITHERING )\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif\n";var roughnessmap_fragment="float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n";var roughnessmap_pars_fragment="#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif";var shadowmap_pars_fragment="#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n";var shadowmap_pars_vertex="#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n";var shadowmap_vertex="#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n";var shadowmask_pars_fragment="float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n";var skinbase_vertex="#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif";var skinning_pars_vertex="#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n";var skinning_vertex="#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif\n";var skinnormal_vertex="#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n";var specularmap_fragment="float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif";var specularmap_pars_fragment="#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif";var tonemapping_fragment="#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n";var tonemapping_pars_fragment="#ifndef saturate\n\t#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n";var uv_pars_fragment="#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif";var uv_pars_vertex="#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\n";var uv_vertex="#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif";var uv2_pars_fragment="#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif";var uv2_pars_vertex="#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif";var uv2_vertex="#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif";var worldpos_vertex="#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n";var cube_frag="uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n";var cube_vert="varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}\n";var depth_frag="#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n";var depth_vert="#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var distanceRGBA_frag="#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}\n";var distanceRGBA_vert="#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}\n";var equirect_frag="uniform sampler2D tEquirect;\nvarying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n";var equirect_vert="varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n";var linedashed_frag="uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var linedashed_vert="uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}\n";var meshbasic_frag="uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var meshbasic_vert="#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var meshlambert_frag="uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include \n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var meshlambert_vert="#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var meshphong_frag="#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var meshphong_vert="#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var meshphysical_frag="#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var meshphysical_vert="#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}\n";var normal_frag="#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n";var normal_vert="#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n";var points_frag="uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var points_vert="uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var shadow_frag="uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n}\n";var shadow_vert="#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var ShaderChunk={alphamap_fragment:alphamap_fragment,alphamap_pars_fragment:alphamap_pars_fragment,alphatest_fragment:alphatest_fragment,aomap_fragment:aomap_fragment,aomap_pars_fragment:aomap_pars_fragment,begin_vertex:begin_vertex,beginnormal_vertex:beginnormal_vertex,bsdfs:bsdfs,bumpmap_pars_fragment:bumpmap_pars_fragment,clipping_planes_fragment:clipping_planes_fragment,clipping_planes_pars_fragment:clipping_planes_pars_fragment,clipping_planes_pars_vertex:clipping_planes_pars_vertex,clipping_planes_vertex:clipping_planes_vertex,color_fragment:color_fragment,color_pars_fragment:color_pars_fragment,color_pars_vertex:color_pars_vertex,color_vertex:color_vertex,common:common,cube_uv_reflection_fragment:cube_uv_reflection_fragment,defaultnormal_vertex:defaultnormal_vertex,displacementmap_pars_vertex:displacementmap_pars_vertex,displacementmap_vertex:displacementmap_vertex,emissivemap_fragment:emissivemap_fragment,emissivemap_pars_fragment:emissivemap_pars_fragment,encodings_fragment:encodings_fragment,encodings_pars_fragment:encodings_pars_fragment,envmap_fragment:envmap_fragment,envmap_pars_fragment:envmap_pars_fragment,envmap_pars_vertex:envmap_pars_vertex,envmap_vertex:envmap_vertex,fog_vertex:fog_vertex,fog_pars_vertex:fog_pars_vertex,fog_fragment:fog_fragment,fog_pars_fragment:fog_pars_fragment,gradientmap_pars_fragment:gradientmap_pars_fragment,lightmap_fragment:lightmap_fragment,lightmap_pars_fragment:lightmap_pars_fragment,lights_lambert_vertex:lights_lambert_vertex,lights_pars_begin:lights_pars_begin,lights_pars_maps:lights_pars_maps,lights_phong_fragment:lights_phong_fragment,lights_phong_pars_fragment:lights_phong_pars_fragment,lights_physical_fragment:lights_physical_fragment,lights_physical_pars_fragment:lights_physical_pars_fragment,lights_fragment_begin:lights_fragment_begin,lights_fragment_maps:lights_fragment_maps,lights_fragment_end:lights_fragment_end,logdepthbuf_fragment:logdepthbuf_fragment,logdepthbuf_pars_fragment:logdepthbuf_pars_fragment,logdepthbuf_pars_vertex:logdepthbuf_pars_vertex,logdepthbuf_vertex:logdepthbuf_vertex,map_fragment:map_fragment,map_pars_fragment:map_pars_fragment,map_particle_fragment:map_particle_fragment,map_particle_pars_fragment:map_particle_pars_fragment,metalnessmap_fragment:metalnessmap_fragment,metalnessmap_pars_fragment:metalnessmap_pars_fragment,morphnormal_vertex:morphnormal_vertex,morphtarget_pars_vertex:morphtarget_pars_vertex,morphtarget_vertex:morphtarget_vertex,normal_fragment_begin:normal_fragment_begin,normal_fragment_maps:normal_fragment_maps,normalmap_pars_fragment:normalmap_pars_fragment,packing:packing,premultiplied_alpha_fragment:premultiplied_alpha_fragment,project_vertex:project_vertex,dithering_fragment:dithering_fragment,dithering_pars_fragment:dithering_pars_fragment,roughnessmap_fragment:roughnessmap_fragment,roughnessmap_pars_fragment:roughnessmap_pars_fragment,shadowmap_pars_fragment:shadowmap_pars_fragment,shadowmap_pars_vertex:shadowmap_pars_vertex,shadowmap_vertex:shadowmap_vertex,shadowmask_pars_fragment:shadowmask_pars_fragment,skinbase_vertex:skinbase_vertex,skinning_pars_vertex:skinning_pars_vertex,skinning_vertex:skinning_vertex,skinnormal_vertex:skinnormal_vertex,specularmap_fragment:specularmap_fragment,specularmap_pars_fragment:specularmap_pars_fragment,tonemapping_fragment:tonemapping_fragment,tonemapping_pars_fragment:tonemapping_pars_fragment,uv_pars_fragment:uv_pars_fragment,uv_pars_vertex:uv_pars_vertex,uv_vertex:uv_vertex,uv2_pars_fragment:uv2_pars_fragment,uv2_pars_vertex:uv2_pars_vertex,uv2_vertex:uv2_vertex,worldpos_vertex:worldpos_vertex,cube_frag:cube_frag,cube_vert:cube_vert,depth_frag:depth_frag,depth_vert:depth_vert,distanceRGBA_frag:distanceRGBA_frag,distanceRGBA_vert:distanceRGBA_vert,equirect_frag:equirect_frag,equirect_vert:equirect_vert,linedashed_frag:linedashed_frag,linedashed_vert:linedashed_vert,meshbasic_frag:meshbasic_frag,meshbasic_vert:meshbasic_vert,meshlambert_frag:meshlambert_frag,meshlambert_vert:meshlambert_vert,meshphong_frag:meshphong_frag,meshphong_vert:meshphong_vert,meshphysical_frag:meshphysical_frag,meshphysical_vert:meshphysical_vert,normal_frag:normal_frag,normal_vert:normal_vert,points_frag:points_frag,points_vert:points_vert,shadow_frag:shadow_frag,shadow_vert:shadow_vert};/** * Uniform Utilities */var UniformsUtils={merge:function(uniforms){var merged={};for(var u=0;u>16&255)/255;this.g=(hex>>8&255)/255;this.b=(hex&255)/255;return this;},setRGB:function(r,g,b){this.r=r;this.g=g;this.b=b;return this;},setHSL:function(){function hue2rgb(p,q,t){if(t<0)t+=1;if(t>1)t-=1;if(t<1/6)return p+(q-p)*6*t;if(t<1/2)return q;if(t<2/3)return p+(q-p)*6*(2/3-t);return p;}return function setHSL(h,s,l){// h,s,l ranges are in 0.0 - 1.0 h=_Math.euclideanModulo(h,1);s=_Math.clamp(s,0,1);l=_Math.clamp(l,0,1);if(s===0){this.r=this.g=this.b=l;}else{var p=l<=0.5?l*(1+s):l+s-l*s;var q=2*l-p;this.r=hue2rgb(q,p,h+1/3);this.g=hue2rgb(q,p,h);this.b=hue2rgb(q,p,h-1/3);}return this;};}(),setStyle:function(style){function handleAlpha(string){if(string===undefined)return;if(parseFloat(string)<1){console.warn('THREE.Color: Alpha component of '+style+' will be ignored.');}}var m;if(m=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(style)){// rgb / hsl var color;var name=m[1];var components=m[2];switch(name){case'rgb':case'rgba':if(color=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(components)){// rgb(255,0,0) rgba(255,0,0,0.5) this.r=Math.min(255,parseInt(color[1],10))/255;this.g=Math.min(255,parseInt(color[2],10))/255;this.b=Math.min(255,parseInt(color[3],10))/255;handleAlpha(color[5]);return this;}if(color=/^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(components)){// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5) this.r=Math.min(100,parseInt(color[1],10))/100;this.g=Math.min(100,parseInt(color[2],10))/100;this.b=Math.min(100,parseInt(color[3],10))/100;handleAlpha(color[5]);return this;}break;case'hsl':case'hsla':if(color=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(components)){// hsl(120,50%,50%) hsla(120,50%,50%,0.5) var h=parseFloat(color[1])/360;var s=parseInt(color[2],10)/100;var l=parseInt(color[3],10)/100;handleAlpha(color[5]);return this.setHSL(h,s,l);}break;}}else if(m=/^\#([A-Fa-f0-9]+)$/.exec(style)){// hex color var hex=m[1];var size=hex.length;if(size===3){// #ff0 this.r=parseInt(hex.charAt(0)+hex.charAt(0),16)/255;this.g=parseInt(hex.charAt(1)+hex.charAt(1),16)/255;this.b=parseInt(hex.charAt(2)+hex.charAt(2),16)/255;return this;}else if(size===6){// #ff0000 this.r=parseInt(hex.charAt(0)+hex.charAt(1),16)/255;this.g=parseInt(hex.charAt(2)+hex.charAt(3),16)/255;this.b=parseInt(hex.charAt(4)+hex.charAt(5),16)/255;return this;}}if(style&&style.length>0){// color keywords var hex=ColorKeywords[style];if(hex!==undefined){// red this.setHex(hex);}else{// unknown color console.warn('THREE.Color: Unknown color '+style);}}return this;},clone:function(){return new this.constructor(this.r,this.g,this.b);},copy:function(color){this.r=color.r;this.g=color.g;this.b=color.b;return this;},copyGammaToLinear:function(color,gammaFactor){if(gammaFactor===undefined)gammaFactor=2.0;this.r=Math.pow(color.r,gammaFactor);this.g=Math.pow(color.g,gammaFactor);this.b=Math.pow(color.b,gammaFactor);return this;},copyLinearToGamma:function(color,gammaFactor){if(gammaFactor===undefined)gammaFactor=2.0;var safeInverse=gammaFactor>0?1.0/gammaFactor:1.0;this.r=Math.pow(color.r,safeInverse);this.g=Math.pow(color.g,safeInverse);this.b=Math.pow(color.b,safeInverse);return this;},convertGammaToLinear:function(){var r=this.r,g=this.g,b=this.b;this.r=r*r;this.g=g*g;this.b=b*b;return this;},convertLinearToGamma:function(){this.r=Math.sqrt(this.r);this.g=Math.sqrt(this.g);this.b=Math.sqrt(this.b);return this;},getHex:function(){return this.r*255<<16^this.g*255<<8^this.b*255<<0;},getHexString:function(){return ('000000'+this.getHex().toString(16)).slice(-6);},getHSL:function(target){// h,s,l ranges are in 0.0 - 1.0 if(target===undefined){console.warn('THREE.Color: .getHSL() target is now required');target={h:0,s:0,l:0};}var r=this.r,g=this.g,b=this.b;var max=Math.max(r,g,b);var min=Math.min(r,g,b);var hue,saturation;var lightness=(min+max)/2.0;if(min===max){hue=0;saturation=0;}else{var delta=max-min;saturation=lightness<=0.5?delta/(max+min):delta/(2-max-min);switch(max){case r:hue=(g-b)/delta+(g1){for(var i=0;i1){for(var i=0;i0){object.children=[];for(var i=0;i0)output.geometries=geometries;if(materials.length>0)output.materials=materials;if(textures.length>0)output.textures=textures;if(images.length>0)output.images=images;if(shapes.length>0)output.shapes=shapes;}output.object=object;return output;// extract data from the cache hash // remove metadata on each item // and return as array function extractFromCache(cache){var values=[];for(var key in cache){var data=cache[key];delete data.metadata;values.push(data);}return values;}},clone:function(recursive){return new this.constructor().copy(this,recursive);},copy:function(source,recursive){if(recursive===undefined)recursive=true;this.name=source.name;this.up.copy(source.up);this.position.copy(source.position);this.quaternion.copy(source.quaternion);this.scale.copy(source.scale);this.matrix.copy(source.matrix);this.matrixWorld.copy(source.matrixWorld);this.matrixAutoUpdate=source.matrixAutoUpdate;this.matrixWorldNeedsUpdate=source.matrixWorldNeedsUpdate;this.layers.mask=source.layers.mask;this.visible=source.visible;this.castShadow=source.castShadow;this.receiveShadow=source.receiveShadow;this.frustumCulled=source.frustumCulled;this.renderOrder=source.renderOrder;this.userData=JSON.parse(JSON.stringify(source.userData));if(recursive===true){for(var i=0;i0){for(var i=0;i0){this.normalsNeedUpdate=true;}},computeFlatVertexNormals:function(){var f,fl,face;this.computeFaceNormals();for(f=0,fl=this.faces.length;f0){this.normalsNeedUpdate=true;}},computeMorphNormals:function(){var i,il,f,fl,face;// save original normals // - create temp variables on first access // otherwise just copy (for faster repeated calls) for(f=0,fl=this.faces.length;f=0;i--){var idx=faceIndicesToRemove[i];this.faces.splice(idx,1);for(j=0,jl=this.faceVertexUvs.length;j0;var hasFaceVertexNormal=face.vertexNormals.length>0;var hasFaceColor=face.color.r!==1||face.color.g!==1||face.color.b!==1;var hasFaceVertexColor=face.vertexColors.length>0;var faceType=0;faceType=setBit(faceType,0,0);// isQuad faceType=setBit(faceType,1,hasMaterial);faceType=setBit(faceType,2,hasFaceUv);faceType=setBit(faceType,3,hasFaceVertexUv);faceType=setBit(faceType,4,hasFaceNormal);faceType=setBit(faceType,5,hasFaceVertexNormal);faceType=setBit(faceType,6,hasFaceColor);faceType=setBit(faceType,7,hasFaceVertexColor);faces.push(faceType);faces.push(face.a,face.b,face.c);faces.push(face.materialIndex);if(hasFaceVertexUv){var faceVertexUvs=this.faceVertexUvs[0][i];faces.push(getUvIndex(faceVertexUvs[0]),getUvIndex(faceVertexUvs[1]),getUvIndex(faceVertexUvs[2]));}if(hasFaceNormal){faces.push(getNormalIndex(face.normal));}if(hasFaceVertexNormal){var vertexNormals=face.vertexNormals;faces.push(getNormalIndex(vertexNormals[0]),getNormalIndex(vertexNormals[1]),getNormalIndex(vertexNormals[2]));}if(hasFaceColor){faces.push(getColorIndex(face.color));}if(hasFaceVertexColor){var vertexColors=face.vertexColors;faces.push(getColorIndex(vertexColors[0]),getColorIndex(vertexColors[1]),getColorIndex(vertexColors[2]));}}function setBit(value,position,enabled){return enabled?value|1<0)data.data.colors=colors;if(uvs.length>0)data.data.uvs=[uvs];// temporal backward compatibility data.data.faces=faces;return data;},clone:function(){/* // Handle primitives var parameters = this.parameters; if ( parameters !== undefined ) { var values = []; for ( var key in parameters ) { values.push( parameters[ key ] ); } var geometry = Object.create( this.constructor.prototype ); this.constructor.apply( geometry, values ); return geometry; } return new this.constructor().copy( this ); */return new Geometry().copy(this);},copy:function(source){var i,il,j,jl,k,kl;// reset this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingBox=null;this.boundingSphere=null;// name this.name=source.name;// vertices var vertices=source.vertices;for(i=0,il=vertices.length;i0;var hasFaceVertexUv2=faceVertexUvs[1]&&faceVertexUvs[1].length>0;// morphs var morphTargets=geometry.morphTargets;var morphTargetsLength=morphTargets.length;var morphTargetsPosition;if(morphTargetsLength>0){morphTargetsPosition=[];for(var i=0;i0){morphTargetsNormal=[];for(var i=0;imax)max=array[i];}return max;}/** * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ */var bufferGeometryId=1;// BufferGeometry uses odd numbers as Id function BufferGeometry(){Object.defineProperty(this,'id',{value:bufferGeometryId+=2});this.uuid=_Math.generateUUID();this.name='';this.type='BufferGeometry';this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingBox=null;this.boundingSphere=null;this.drawRange={start:0,count:Infinity};}BufferGeometry.prototype=Object.assign(Object.create(EventDispatcher.prototype),{constructor:BufferGeometry,isBufferGeometry:true,getIndex:function(){return this.index;},setIndex:function(index){if(Array.isArray(index)){this.index=new(arrayMax(index)>65535?Uint32BufferAttribute:Uint16BufferAttribute)(index,1);}else{this.index=index;}},addAttribute:function(name,attribute){if(!(attribute&&attribute.isBufferAttribute)&&!(attribute&&attribute.isInterleavedBufferAttribute)){console.warn('THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).');this.addAttribute(name,new BufferAttribute(arguments[1],arguments[2]));return;}if(name==='index'){console.warn('THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.');this.setIndex(attribute);return;}this.attributes[name]=attribute;return this;},getAttribute:function(name){return this.attributes[name];},removeAttribute:function(name){delete this.attributes[name];return this;},addGroup:function(start,count,materialIndex){this.groups.push({start:start,count:count,materialIndex:materialIndex!==undefined?materialIndex:0});},clearGroups:function(){this.groups=[];},setDrawRange:function(start,count){this.drawRange.start=start;this.drawRange.count=count;},applyMatrix:function(matrix){var position=this.attributes.position;if(position!==undefined){matrix.applyToBufferAttribute(position);position.needsUpdate=true;}var normal=this.attributes.normal;if(normal!==undefined){var normalMatrix=new Matrix3().getNormalMatrix(matrix);normalMatrix.applyToBufferAttribute(normal);normal.needsUpdate=true;}if(this.boundingBox!==null){this.computeBoundingBox();}if(this.boundingSphere!==null){this.computeBoundingSphere();}return this;},rotateX:function(){// rotate geometry around world x-axis var m1=new Matrix4();return function rotateX(angle){m1.makeRotationX(angle);this.applyMatrix(m1);return this;};}(),rotateY:function(){// rotate geometry around world y-axis var m1=new Matrix4();return function rotateY(angle){m1.makeRotationY(angle);this.applyMatrix(m1);return this;};}(),rotateZ:function(){// rotate geometry around world z-axis var m1=new Matrix4();return function rotateZ(angle){m1.makeRotationZ(angle);this.applyMatrix(m1);return this;};}(),translate:function(){// translate geometry var m1=new Matrix4();return function translate(x,y,z){m1.makeTranslation(x,y,z);this.applyMatrix(m1);return this;};}(),scale:function(){// scale geometry var m1=new Matrix4();return function scale(x,y,z){m1.makeScale(x,y,z);this.applyMatrix(m1);return this;};}(),lookAt:function(){var obj=new Object3D();return function lookAt(vector){obj.lookAt(vector);obj.updateMatrix();this.applyMatrix(obj.matrix);};}(),center:function(){var offset=new Vector3();return function center(){this.computeBoundingBox();this.boundingBox.getCenter(offset).negate();this.translate(offset.x,offset.y,offset.z);return this;};}(),setFromObject:function(object){// console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this ); var geometry=object.geometry;if(object.isPoints||object.isLine){var positions=new Float32BufferAttribute(geometry.vertices.length*3,3);var colors=new Float32BufferAttribute(geometry.colors.length*3,3);this.addAttribute('position',positions.copyVector3sArray(geometry.vertices));this.addAttribute('color',colors.copyColorsArray(geometry.colors));if(geometry.lineDistances&&geometry.lineDistances.length===geometry.vertices.length){var lineDistances=new Float32BufferAttribute(geometry.lineDistances.length,1);this.addAttribute('lineDistance',lineDistances.copyArray(geometry.lineDistances));}if(geometry.boundingSphere!==null){this.boundingSphere=geometry.boundingSphere.clone();}if(geometry.boundingBox!==null){this.boundingBox=geometry.boundingBox.clone();}}else if(object.isMesh){if(geometry&&geometry.isGeometry){this.fromGeometry(geometry);}}return this;},setFromPoints:function(points){var position=[];for(var i=0,l=points.length;i0){var normals=new Float32Array(geometry.normals.length*3);this.addAttribute('normal',new BufferAttribute(normals,3).copyVector3sArray(geometry.normals));}if(geometry.colors.length>0){var colors=new Float32Array(geometry.colors.length*3);this.addAttribute('color',new BufferAttribute(colors,3).copyColorsArray(geometry.colors));}if(geometry.uvs.length>0){var uvs=new Float32Array(geometry.uvs.length*2);this.addAttribute('uv',new BufferAttribute(uvs,2).copyVector2sArray(geometry.uvs));}if(geometry.uvs2.length>0){var uvs2=new Float32Array(geometry.uvs2.length*2);this.addAttribute('uv2',new BufferAttribute(uvs2,2).copyVector2sArray(geometry.uvs2));}// groups this.groups=geometry.groups;// morphs for(var name in geometry.morphTargets){var array=[];var morphTargets=geometry.morphTargets[name];for(var i=0,l=morphTargets.length;i0){var skinIndices=new Float32BufferAttribute(geometry.skinIndices.length*4,4);this.addAttribute('skinIndex',skinIndices.copyVector4sArray(geometry.skinIndices));}if(geometry.skinWeights.length>0){var skinWeights=new Float32BufferAttribute(geometry.skinWeights.length*4,4);this.addAttribute('skinWeight',skinWeights.copyVector4sArray(geometry.skinWeights));}// if(geometry.boundingSphere!==null){this.boundingSphere=geometry.boundingSphere.clone();}if(geometry.boundingBox!==null){this.boundingBox=geometry.boundingBox.clone();}return this;},computeBoundingBox:function(){if(this.boundingBox===null){this.boundingBox=new Box3();}var position=this.attributes.position;if(position!==undefined){this.boundingBox.setFromBufferAttribute(position);}else{this.boundingBox.makeEmpty();}if(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z)){console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.',this);}},computeBoundingSphere:function(){var box=new Box3();var vector=new Vector3();return function computeBoundingSphere(){if(this.boundingSphere===null){this.boundingSphere=new Sphere();}var position=this.attributes.position;if(position){var center=this.boundingSphere.center;box.setFromBufferAttribute(position);box.getCenter(center);// hoping to find a boundingSphere with a radius smaller than the // boundingSphere of the boundingBox: sqrt(3) smaller in the best case var maxRadiusSq=0;for(var i=0,il=position.count;i0){data.data.groups=JSON.parse(JSON.stringify(groups));}var boundingSphere=this.boundingSphere;if(boundingSphere!==null){data.data.boundingSphere={center:boundingSphere.center.toArray(),radius:boundingSphere.radius};}return data;},clone:function(){/* // Handle primitives var parameters = this.parameters; if ( parameters !== undefined ) { var values = []; for ( var key in parameters ) { values.push( parameters[ key ] ); } var geometry = Object.create( this.constructor.prototype ); this.constructor.apply( geometry, values ); return geometry; } return new this.constructor().copy( this ); */return new BufferGeometry().copy(this);},copy:function(source){var name,i,l;// reset this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingBox=null;this.boundingSphere=null;// name this.name=source.name;// index var index=source.index;if(index!==null){this.setIndex(index.clone());}// attributes var attributes=source.attributes;for(name in attributes){var attribute=attributes[name];this.addAttribute(name,attribute.clone());}// morph attributes var morphAttributes=source.morphAttributes;for(name in morphAttributes){var array=[];var morphAttribute=morphAttributes[name];// morphAttribute: array of Float32BufferAttributes for(i=0,l=morphAttribute.length;i0?1:-1;// now apply vector to normal buffer normals.push(vector.x,vector.y,vector.z);// uvs uvs.push(ix/gridX);uvs.push(1-iy/gridY);// counters vertexCounter+=1;}}// indices // 1. you need three indices to draw a single face // 2. a single segment consists of two faces // 3. so we need to generate six (2*3) indices per segment for(iy=0;iy0)data.alphaTest=this.alphaTest;if(this.premultipliedAlpha===true)data.premultipliedAlpha=this.premultipliedAlpha;if(this.wireframe===true)data.wireframe=this.wireframe;if(this.wireframeLinewidth>1)data.wireframeLinewidth=this.wireframeLinewidth;if(this.wireframeLinecap!=='round')data.wireframeLinecap=this.wireframeLinecap;if(this.wireframeLinejoin!=='round')data.wireframeLinejoin=this.wireframeLinejoin;if(this.morphTargets===true)data.morphTargets=true;if(this.skinning===true)data.skinning=true;if(this.visible===false)data.visible=false;if(JSON.stringify(this.userData)!=='{}')data.userData=this.userData;// TODO: Copied from Object3D.toJSON function extractFromCache(cache){var values=[];for(var key in cache){var data=cache[key];delete data.metadata;values.push(data);}return values;}if(isRoot){var textures=extractFromCache(meta.textures);var images=extractFromCache(meta.images);if(textures.length>0)data.textures=textures;if(images.length>0)data.images=images;}return data;},clone:function(){return new this.constructor().copy(this);},copy:function(source){this.name=source.name;this.fog=source.fog;this.lights=source.lights;this.blending=source.blending;this.side=source.side;this.flatShading=source.flatShading;this.vertexColors=source.vertexColors;this.opacity=source.opacity;this.transparent=source.transparent;this.blendSrc=source.blendSrc;this.blendDst=source.blendDst;this.blendEquation=source.blendEquation;this.blendSrcAlpha=source.blendSrcAlpha;this.blendDstAlpha=source.blendDstAlpha;this.blendEquationAlpha=source.blendEquationAlpha;this.depthFunc=source.depthFunc;this.depthTest=source.depthTest;this.depthWrite=source.depthWrite;this.colorWrite=source.colorWrite;this.precision=source.precision;this.polygonOffset=source.polygonOffset;this.polygonOffsetFactor=source.polygonOffsetFactor;this.polygonOffsetUnits=source.polygonOffsetUnits;this.dithering=source.dithering;this.alphaTest=source.alphaTest;this.premultipliedAlpha=source.premultipliedAlpha;this.overdraw=source.overdraw;this.visible=source.visible;this.userData=JSON.parse(JSON.stringify(source.userData));this.clipShadows=source.clipShadows;this.clipIntersection=source.clipIntersection;var srcPlanes=source.clippingPlanes,dstPlanes=null;if(srcPlanes!==null){var n=srcPlanes.length;dstPlanes=new Array(n);for(var i=0;i!==n;++i)dstPlanes[i]=srcPlanes[i].clone();}this.clippingPlanes=dstPlanes;this.shadowSide=source.shadowSide;return this;},dispose:function(){this.dispatchEvent({type:'dispose'});}});/** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ * * parameters = { * color: , * opacity: , * map: new THREE.Texture( ), * * lightMap: new THREE.Texture( ), * lightMapIntensity: * * aoMap: new THREE.Texture( ), * aoMapIntensity: * * specularMap: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), * combine: THREE.Multiply, * reflectivity: , * refractionRatio: , * * depthTest: , * depthWrite: , * * wireframe: , * wireframeLinewidth: , * * skinning: , * morphTargets: * } */function MeshBasicMaterial(parameters){Material.call(this);this.type='MeshBasicMaterial';this.color=new Color(0xffffff);// emissive this.map=null;this.lightMap=null;this.lightMapIntensity=1.0;this.aoMap=null;this.aoMapIntensity=1.0;this.specularMap=null;this.alphaMap=null;this.envMap=null;this.combine=MultiplyOperation;this.reflectivity=1;this.refractionRatio=0.98;this.wireframe=false;this.wireframeLinewidth=1;this.wireframeLinecap='round';this.wireframeLinejoin='round';this.skinning=false;this.morphTargets=false;this.lights=false;this.setValues(parameters);}MeshBasicMaterial.prototype=Object.create(Material.prototype);MeshBasicMaterial.prototype.constructor=MeshBasicMaterial;MeshBasicMaterial.prototype.isMeshBasicMaterial=true;MeshBasicMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.color.copy(source.color);this.map=source.map;this.lightMap=source.lightMap;this.lightMapIntensity=source.lightMapIntensity;this.aoMap=source.aoMap;this.aoMapIntensity=source.aoMapIntensity;this.specularMap=source.specularMap;this.alphaMap=source.alphaMap;this.envMap=source.envMap;this.combine=source.combine;this.reflectivity=source.reflectivity;this.refractionRatio=source.refractionRatio;this.wireframe=source.wireframe;this.wireframeLinewidth=source.wireframeLinewidth;this.wireframeLinecap=source.wireframeLinecap;this.wireframeLinejoin=source.wireframeLinejoin;this.skinning=source.skinning;this.morphTargets=source.morphTargets;return this;};/** * @author alteredq / http://alteredqualia.com/ * * parameters = { * defines: { "label" : "value" }, * uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } }, * * fragmentShader: , * vertexShader: , * * wireframe: , * wireframeLinewidth: , * * lights: , * * skinning: , * morphTargets: , * morphNormals: * } */function ShaderMaterial(parameters){Material.call(this);this.type='ShaderMaterial';this.defines={};this.uniforms={};this.vertexShader='void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}';this.fragmentShader='void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}';this.linewidth=1;this.wireframe=false;this.wireframeLinewidth=1;this.fog=false;// set to use scene fog this.lights=false;// set to use scene lights this.clipping=false;// set to use user-defined clipping planes this.skinning=false;// set to use skinning attribute streams this.morphTargets=false;// set to use morph targets this.morphNormals=false;// set to use morph normals this.extensions={derivatives:false,// set to use derivatives fragDepth:false,// set to use fragment depth values drawBuffers:false,// set to use draw buffers shaderTextureLOD:false// set to use shader texture LOD };// When rendered geometry doesn't include these attributes but the material does, // use these default values in WebGL. This avoids errors when buffer data is missing. this.defaultAttributeValues={'color':[1,1,1],'uv':[0,0],'uv2':[0,0]};this.index0AttributeName=undefined;this.uniformsNeedUpdate=false;if(parameters!==undefined){if(parameters.attributes!==undefined){console.error('THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.');}this.setValues(parameters);}}ShaderMaterial.prototype=Object.create(Material.prototype);ShaderMaterial.prototype.constructor=ShaderMaterial;ShaderMaterial.prototype.isShaderMaterial=true;ShaderMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.fragmentShader=source.fragmentShader;this.vertexShader=source.vertexShader;this.uniforms=UniformsUtils.clone(source.uniforms);this.defines=Object.assign({},source.defines);this.wireframe=source.wireframe;this.wireframeLinewidth=source.wireframeLinewidth;this.lights=source.lights;this.clipping=source.clipping;this.skinning=source.skinning;this.morphTargets=source.morphTargets;this.morphNormals=source.morphNormals;this.extensions=source.extensions;return this;};ShaderMaterial.prototype.toJSON=function(meta){var data=Material.prototype.toJSON.call(this,meta);data.uniforms=this.uniforms;data.vertexShader=this.vertexShader;data.fragmentShader=this.fragmentShader;return data;};/** * @author bhouston / http://clara.io */function Ray(origin,direction){this.origin=origin!==undefined?origin:new Vector3();this.direction=direction!==undefined?direction:new Vector3();}Object.assign(Ray.prototype,{set:function(origin,direction){this.origin.copy(origin);this.direction.copy(direction);return this;},clone:function(){return new this.constructor().copy(this);},copy:function(ray){this.origin.copy(ray.origin);this.direction.copy(ray.direction);return this;},at:function(t,target){if(target===undefined){console.warn('THREE.Ray: .at() target is now required');target=new Vector3();}return target.copy(this.direction).multiplyScalar(t).add(this.origin);},lookAt:function(v){this.direction.copy(v).sub(this.origin).normalize();return this;},recast:function(){var v1=new Vector3();return function recast(t){this.origin.copy(this.at(t,v1));return this;};}(),closestPointToPoint:function(point,target){if(target===undefined){console.warn('THREE.Ray: .closestPointToPoint() target is now required');target=new Vector3();}target.subVectors(point,this.origin);var directionDistance=target.dot(this.direction);if(directionDistance<0){return target.copy(this.origin);}return target.copy(this.direction).multiplyScalar(directionDistance).add(this.origin);},distanceToPoint:function(point){return Math.sqrt(this.distanceSqToPoint(point));},distanceSqToPoint:function(){var v1=new Vector3();return function distanceSqToPoint(point){var directionDistance=v1.subVectors(point,this.origin).dot(this.direction);// point behind the ray if(directionDistance<0){return this.origin.distanceToSquared(point);}v1.copy(this.direction).multiplyScalar(directionDistance).add(this.origin);return v1.distanceToSquared(point);};}(),distanceSqToSegment:function(){var segCenter=new Vector3();var segDir=new Vector3();var diff=new Vector3();return function distanceSqToSegment(v0,v1,optionalPointOnRay,optionalPointOnSegment){// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h // It returns the min distance between the ray and the segment // defined by v0 and v1 // It can also set two optional targets : // - The closest point on the ray // - The closest point on the segment segCenter.copy(v0).add(v1).multiplyScalar(0.5);segDir.copy(v1).sub(v0).normalize();diff.copy(this.origin).sub(segCenter);var segExtent=v0.distanceTo(v1)*0.5;var a01=-this.direction.dot(segDir);var b0=diff.dot(this.direction);var b1=-diff.dot(segDir);var c=diff.lengthSq();var det=Math.abs(1-a01*a01);var s0,s1,sqrDist,extDet;if(det>0){// The ray and segment are not parallel. s0=a01*b1-b0;s1=a01*b0-b1;extDet=segExtent*det;if(s0>=0){if(s1>=-extDet){if(s1<=extDet){// region 0 // Minimum at interior points of ray and segment. var invDet=1/det;s0*=invDet;s1*=invDet;sqrDist=s0*(s0+a01*s1+2*b0)+s1*(a01*s0+s1+2*b1)+c;}else{// region 1 s1=segExtent;s0=Math.max(0,-(a01*s1+b0));sqrDist=-s0*s0+s1*(s1+2*b1)+c;}}else{// region 5 s1=-segExtent;s0=Math.max(0,-(a01*s1+b0));sqrDist=-s0*s0+s1*(s1+2*b1)+c;}}else{if(s1<=-extDet){// region 4 s0=Math.max(0,-(-a01*segExtent+b0));s1=s0>0?-segExtent:Math.min(Math.max(-segExtent,-b1),segExtent);sqrDist=-s0*s0+s1*(s1+2*b1)+c;}else if(s1<=extDet){// region 3 s0=0;s1=Math.min(Math.max(-segExtent,-b1),segExtent);sqrDist=s1*(s1+2*b1)+c;}else{// region 2 s0=Math.max(0,-(a01*segExtent+b0));s1=s0>0?segExtent:Math.min(Math.max(-segExtent,-b1),segExtent);sqrDist=-s0*s0+s1*(s1+2*b1)+c;}}}else{// Ray and segment are parallel. s1=a01>0?-segExtent:segExtent;s0=Math.max(0,-(a01*s1+b0));sqrDist=-s0*s0+s1*(s1+2*b1)+c;}if(optionalPointOnRay){optionalPointOnRay.copy(this.direction).multiplyScalar(s0).add(this.origin);}if(optionalPointOnSegment){optionalPointOnSegment.copy(segDir).multiplyScalar(s1).add(segCenter);}return sqrDist;};}(),intersectSphere:function(){var v1=new Vector3();return function intersectSphere(sphere,target){v1.subVectors(sphere.center,this.origin);var tca=v1.dot(this.direction);var d2=v1.dot(v1)-tca*tca;var radius2=sphere.radius*sphere.radius;if(d2>radius2)return null;var thc=Math.sqrt(radius2-d2);// t0 = first intersect point - entrance on front of sphere var t0=tca-thc;// t1 = second intersect point - exit point on back of sphere var t1=tca+thc;// test to see if both t0 and t1 are behind the ray - if so, return null if(t0<0&&t1<0)return null;// test to see if t0 is behind the ray: // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, // in order to always return an intersect point that is in front of the ray. if(t0<0)return this.at(t1,target);// else t0 is in front of the ray, so return the first collision point scaled by t0 return this.at(t0,target);};}(),intersectsSphere:function(sphere){return this.distanceToPoint(sphere.center)<=sphere.radius;},distanceToPlane:function(plane){var denominator=plane.normal.dot(this.direction);if(denominator===0){// line is coplanar, return origin if(plane.distanceToPoint(this.origin)===0){return 0;}// Null is preferable to undefined since undefined means.... it is undefined return null;}var t=-(this.origin.dot(plane.normal)+plane.constant)/denominator;// Return if the ray never intersects the plane return t>=0?t:null;},intersectPlane:function(plane,target){var t=this.distanceToPlane(plane);if(t===null){return null;}return this.at(t,target);},intersectsPlane:function(plane){// check if the ray lies on the plane first var distToPoint=plane.distanceToPoint(this.origin);if(distToPoint===0){return true;}var denominator=plane.normal.dot(this.direction);if(denominator*distToPoint<0){return true;}// ray origin is behind the plane (and is pointing behind it) return false;},intersectBox:function(box,target){var tmin,tmax,tymin,tymax,tzmin,tzmax;var invdirx=1/this.direction.x,invdiry=1/this.direction.y,invdirz=1/this.direction.z;var origin=this.origin;if(invdirx>=0){tmin=(box.min.x-origin.x)*invdirx;tmax=(box.max.x-origin.x)*invdirx;}else{tmin=(box.max.x-origin.x)*invdirx;tmax=(box.min.x-origin.x)*invdirx;}if(invdiry>=0){tymin=(box.min.y-origin.y)*invdiry;tymax=(box.max.y-origin.y)*invdiry;}else{tymin=(box.max.y-origin.y)*invdiry;tymax=(box.min.y-origin.y)*invdiry;}if(tmin>tymax||tymin>tmax)return null;// These lines also handle the case where tmin or tmax is NaN // (result of 0 * Infinity). x !== x returns true if x is NaN if(tymin>tmin||tmin!==tmin)tmin=tymin;if(tymax=0){tzmin=(box.min.z-origin.z)*invdirz;tzmax=(box.max.z-origin.z)*invdirz;}else{tzmin=(box.max.z-origin.z)*invdirz;tzmax=(box.min.z-origin.z)*invdirz;}if(tmin>tzmax||tzmin>tmax)return null;if(tzmin>tmin||tmin!==tmin)tmin=tzmin;if(tzmax=0?tmin:tmax,target);},intersectsBox:function(){var v=new Vector3();return function intersectsBox(box){return this.intersectBox(box,v)!==null;};}(),intersectTriangle:function(){// Compute the offset origin, edges, and normal. var diff=new Vector3();var edge1=new Vector3();var edge2=new Vector3();var normal=new Vector3();return function intersectTriangle(a,b,c,backfaceCulling,target){// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h edge1.subVectors(b,a);edge2.subVectors(c,a);normal.crossVectors(edge1,edge2);// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction, // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2)) // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q)) // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N) var DdN=this.direction.dot(normal);var sign;if(DdN>0){if(backfaceCulling)return null;sign=1;}else if(DdN<0){sign=-1;DdN=-DdN;}else{return null;}diff.subVectors(this.origin,a);var DdQxE2=sign*this.direction.dot(edge2.crossVectors(diff,edge2));// b1 < 0, no intersection if(DdQxE2<0){return null;}var DdE1xQ=sign*this.direction.dot(edge1.cross(diff));// b2 < 0, no intersection if(DdE1xQ<0){return null;}// b1+b2 > 1, no intersection if(DdQxE2+DdE1xQ>DdN){return null;}// Line intersects triangle, check if ray does. var QdN=-sign*diff.dot(normal);// t < 0, no intersection if(QdN<0){return null;}// Ray intersects triangle. return this.at(QdN/DdN,target);};}(),applyMatrix4:function(matrix4){this.origin.applyMatrix4(matrix4);this.direction.transformDirection(matrix4);return this;},equals:function(ray){return ray.origin.equals(this.origin)&&ray.direction.equals(this.direction);}});/** * @author bhouston / http://clara.io */function Line3(start,end){this.start=start!==undefined?start:new Vector3();this.end=end!==undefined?end:new Vector3();}Object.assign(Line3.prototype,{set:function(start,end){this.start.copy(start);this.end.copy(end);return this;},clone:function(){return new this.constructor().copy(this);},copy:function(line){this.start.copy(line.start);this.end.copy(line.end);return this;},getCenter:function(target){if(target===undefined){console.warn('THREE.Line3: .getCenter() target is now required');target=new Vector3();}return target.addVectors(this.start,this.end).multiplyScalar(0.5);},delta:function(target){if(target===undefined){console.warn('THREE.Line3: .delta() target is now required');target=new Vector3();}return target.subVectors(this.end,this.start);},distanceSq:function(){return this.start.distanceToSquared(this.end);},distance:function(){return this.start.distanceTo(this.end);},at:function(t,target){if(target===undefined){console.warn('THREE.Line3: .at() target is now required');target=new Vector3();}return this.delta(target).multiplyScalar(t).add(this.start);},closestPointToPointParameter:function(){var startP=new Vector3();var startEnd=new Vector3();return function closestPointToPointParameter(point,clampToLine){startP.subVectors(point,this.start);startEnd.subVectors(this.end,this.start);var startEnd2=startEnd.dot(startEnd);var startEnd_startP=startEnd.dot(startP);var t=startEnd_startP/startEnd2;if(clampToLine){t=_Math.clamp(t,0,1);}return t;};}(),closestPointToPoint:function(point,clampToLine,target){var t=this.closestPointToPointParameter(point,clampToLine);if(target===undefined){console.warn('THREE.Line3: .closestPointToPoint() target is now required');target=new Vector3();}return this.delta(target).multiplyScalar(t).add(this.start);},applyMatrix4:function(matrix){this.start.applyMatrix4(matrix);this.end.applyMatrix4(matrix);return this;},equals:function(line){return line.start.equals(this.start)&&line.end.equals(this.end);}});/** * @author bhouston / http://clara.io * @author mrdoob / http://mrdoob.com/ */function Triangle(a,b,c){this.a=a!==undefined?a:new Vector3();this.b=b!==undefined?b:new Vector3();this.c=c!==undefined?c:new Vector3();}Object.assign(Triangle,{getNormal:function(){var v0=new Vector3();return function getNormal(a,b,c,target){if(target===undefined){console.warn('THREE.Triangle: .getNormal() target is now required');target=new Vector3();}target.subVectors(c,b);v0.subVectors(a,b);target.cross(v0);var targetLengthSq=target.lengthSq();if(targetLengthSq>0){return target.multiplyScalar(1/Math.sqrt(targetLengthSq));}return target.set(0,0,0);};}(),// static/instance method to calculate barycentric coordinates // based on: http://www.blackpawn.com/texts/pointinpoly/default.html getBarycoord:function(){var v0=new Vector3();var v1=new Vector3();var v2=new Vector3();return function getBarycoord(point,a,b,c,target){v0.subVectors(c,a);v1.subVectors(b,a);v2.subVectors(point,a);var dot00=v0.dot(v0);var dot01=v0.dot(v1);var dot02=v0.dot(v2);var dot11=v1.dot(v1);var dot12=v1.dot(v2);var denom=dot00*dot11-dot01*dot01;if(target===undefined){console.warn('THREE.Triangle: .getBarycoord() target is now required');target=new Vector3();}// collinear or singular triangle if(denom===0){// arbitrary location outside of triangle? // not sure if this is the best idea, maybe should be returning undefined return target.set(-2,-1,-1);}var invDenom=1/denom;var u=(dot11*dot02-dot01*dot12)*invDenom;var v=(dot00*dot12-dot01*dot02)*invDenom;// barycentric coordinates must always sum to 1 return target.set(1-u-v,v,u);};}(),containsPoint:function(){var v1=new Vector3();return function containsPoint(point,a,b,c){Triangle.getBarycoord(point,a,b,c,v1);return v1.x>=0&&v1.y>=0&&v1.x+v1.y<=1;};}()});Object.assign(Triangle.prototype,{set:function(a,b,c){this.a.copy(a);this.b.copy(b);this.c.copy(c);return this;},setFromPointsAndIndices:function(points,i0,i1,i2){this.a.copy(points[i0]);this.b.copy(points[i1]);this.c.copy(points[i2]);return this;},clone:function(){return new this.constructor().copy(this);},copy:function(triangle){this.a.copy(triangle.a);this.b.copy(triangle.b);this.c.copy(triangle.c);return this;},getArea:function(){var v0=new Vector3();var v1=new Vector3();return function getArea(){v0.subVectors(this.c,this.b);v1.subVectors(this.a,this.b);return v0.cross(v1).length()*0.5;};}(),getMidpoint:function(target){if(target===undefined){console.warn('THREE.Triangle: .getMidpoint() target is now required');target=new Vector3();}return target.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3);},getNormal:function(target){return Triangle.getNormal(this.a,this.b,this.c,target);},getPlane:function(target){if(target===undefined){console.warn('THREE.Triangle: .getPlane() target is now required');target=new Vector3();}return target.setFromCoplanarPoints(this.a,this.b,this.c);},getBarycoord:function(point,target){return Triangle.getBarycoord(point,this.a,this.b,this.c,target);},containsPoint:function(point){return Triangle.containsPoint(point,this.a,this.b,this.c);},intersectsBox:function(box){return box.intersectsTriangle(this);},closestPointToPoint:function(){var plane=new Plane();var edgeList=[new Line3(),new Line3(),new Line3()];var projectedPoint=new Vector3();var closestPoint=new Vector3();return function closestPointToPoint(point,target){if(target===undefined){console.warn('THREE.Triangle: .closestPointToPoint() target is now required');target=new Vector3();}var minDistance=Infinity;// project the point onto the plane of the triangle plane.setFromCoplanarPoints(this.a,this.b,this.c);plane.projectPoint(point,projectedPoint);// check if the projection lies within the triangle if(this.containsPoint(projectedPoint)===true){// if so, this is the closest point target.copy(projectedPoint);}else{// if not, the point falls outside the triangle. the target is the closest point to the triangle's edges or vertices edgeList[0].set(this.a,this.b);edgeList[1].set(this.b,this.c);edgeList[2].set(this.c,this.a);for(var i=0;i0){var morphAttribute=morphAttributes[keys[0]];if(morphAttribute!==undefined){this.morphTargetInfluences=[];this.morphTargetDictionary={};for(m=0,ml=morphAttribute.length;m0){this.morphTargetInfluences=[];this.morphTargetDictionary={};for(m=0,ml=morphTargets.length;mraycaster.far)return null;return {distance:distance,point:intersectionPointWorld.clone(),object:object};}function checkBufferGeometryIntersection(object,raycaster,ray,position,uv,a,b,c){vA.fromBufferAttribute(position,a);vB.fromBufferAttribute(position,b);vC.fromBufferAttribute(position,c);var intersection=checkIntersection(object,object.material,raycaster,ray,vA,vB,vC,intersectionPoint);if(intersection){if(uv){uvA.fromBufferAttribute(uv,a);uvB.fromBufferAttribute(uv,b);uvC.fromBufferAttribute(uv,c);intersection.uv=uvIntersection(intersectionPoint,vA,vB,vC,uvA,uvB,uvC);}var face=new Face3(a,b,c);Triangle.getNormal(vA,vB,vC,face.normal);intersection.face=face;intersection.faceIndex=a;}return intersection;}return function raycast(raycaster,intersects){var geometry=this.geometry;var material=this.material;var matrixWorld=this.matrixWorld;if(material===undefined)return;// Checking boundingSphere distance to ray if(geometry.boundingSphere===null)geometry.computeBoundingSphere();sphere.copy(geometry.boundingSphere);sphere.applyMatrix4(matrixWorld);if(raycaster.ray.intersectsSphere(sphere)===false)return;// inverseMatrix.getInverse(matrixWorld);ray.copy(raycaster.ray).applyMatrix4(inverseMatrix);// Check boundingBox before continuing if(geometry.boundingBox!==null){if(ray.intersectsBox(geometry.boundingBox)===false)return;}var intersection;if(geometry.isBufferGeometry){var a,b,c;var index=geometry.index;var position=geometry.attributes.position;var uv=geometry.attributes.uv;var i,l;if(index!==null){// indexed buffer geometry for(i=0,l=index.count;i0)uvs=faceVertexUvs;for(var f=0,fl=faces.length;f0&&gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER,gl.HIGH_FLOAT).precision>0){return 'highp';}precision='mediump';}if(precision==='mediump'){if(gl.getShaderPrecisionFormat(gl.VERTEX_SHADER,gl.MEDIUM_FLOAT).precision>0&&gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER,gl.MEDIUM_FLOAT).precision>0){return 'mediump';}}return 'lowp';}var precision=parameters.precision!==undefined?parameters.precision:'highp';var maxPrecision=getMaxPrecision(precision);if(maxPrecision!==precision){console.warn('THREE.WebGLRenderer:',precision,'not supported, using',maxPrecision,'instead.');precision=maxPrecision;}var logarithmicDepthBuffer=parameters.logarithmicDepthBuffer===true;var maxTextures=gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);var maxVertexTextures=gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS);var maxTextureSize=gl.getParameter(gl.MAX_TEXTURE_SIZE);var maxCubemapSize=gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE);var maxAttributes=gl.getParameter(gl.MAX_VERTEX_ATTRIBS);var maxVertexUniforms=gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS);var maxVaryings=gl.getParameter(gl.MAX_VARYING_VECTORS);var maxFragmentUniforms=gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS);var vertexTextures=maxVertexTextures>0;var floatFragmentTextures=!!extensions.get('OES_texture_float');var floatVertexTextures=vertexTextures&&floatFragmentTextures;return {getMaxAnisotropy:getMaxAnisotropy,getMaxPrecision:getMaxPrecision,precision:precision,logarithmicDepthBuffer:logarithmicDepthBuffer,maxTextures:maxTextures,maxVertexTextures:maxVertexTextures,maxTextureSize:maxTextureSize,maxCubemapSize:maxCubemapSize,maxAttributes:maxAttributes,maxVertexUniforms:maxVertexUniforms,maxVaryings:maxVaryings,maxFragmentUniforms:maxFragmentUniforms,vertexTextures:vertexTextures,floatFragmentTextures:floatFragmentTextures,floatVertexTextures:floatVertexTextures};}/** * @author tschw */function WebGLClipping(){var scope=this,globalState=null,numGlobalPlanes=0,localClippingEnabled=false,renderingShadows=false,plane=new Plane(),viewNormalMatrix=new Matrix3(),uniform={value:null,needsUpdate:false};this.uniform=uniform;this.numPlanes=0;this.numIntersection=0;this.init=function(planes,enableLocalClipping,camera){var enabled=planes.length!==0||enableLocalClipping||// enable state of previous frame - the clipping code has to // run another frame in order to reset the state: numGlobalPlanes!==0||localClippingEnabled;localClippingEnabled=enableLocalClipping;globalState=projectPlanes(planes,camera,0);numGlobalPlanes=planes.length;return enabled;};this.beginShadows=function(){renderingShadows=true;projectPlanes(null);};this.endShadows=function(){renderingShadows=false;resetGlobalState();};this.setState=function(planes,clipIntersection,clipShadows,camera,cache,fromCache){if(!localClippingEnabled||planes===null||planes.length===0||renderingShadows&&!clipShadows){// there's no local clipping if(renderingShadows){// there's no global clipping projectPlanes(null);}else{resetGlobalState();}}else{var nGlobal=renderingShadows?0:numGlobalPlanes,lGlobal=nGlobal*4,dstArray=cache.clippingState||null;uniform.value=dstArray;// ensure unique state dstArray=projectPlanes(planes,camera,lGlobal,fromCache);for(var i=0;i!==lGlobal;++i){dstArray[i]=globalState[i];}cache.clippingState=dstArray;this.numIntersection=clipIntersection?this.numPlanes:0;this.numPlanes+=nGlobal;}};function resetGlobalState(){if(uniform.value!==globalState){uniform.value=globalState;uniform.needsUpdate=numGlobalPlanes>0;}scope.numPlanes=numGlobalPlanes;scope.numIntersection=0;}function projectPlanes(planes,camera,dstOffset,skipTransform){var nPlanes=planes!==null?planes.length:0,dstArray=null;if(nPlanes!==0){dstArray=uniform.value;if(skipTransform!==true||dstArray===null){var flatSize=dstOffset+nPlanes*4,viewMatrix=camera.matrixWorldInverse;viewNormalMatrix.getNormalMatrix(viewMatrix);if(dstArray===null||dstArray.length65535?Uint32BufferAttribute:Uint16BufferAttribute)(indices,1);attributes.update(attribute,gl.ELEMENT_ARRAY_BUFFER);wireframeAttributes[geometry.id]=attribute;return attribute;}return {get:get,update:update,getWireframeAttribute:getWireframeAttribute};}/** * @author mrdoob / http://mrdoob.com/ */function WebGLIndexedBufferRenderer(gl,extensions,info){var mode;function setMode(value){mode=value;}var type,bytesPerElement;function setIndex(value){type=value.type;bytesPerElement=value.bytesPerElement;}function render(start,count){gl.drawElements(mode,count,type,start*bytesPerElement);info.update(count,mode);}function renderInstances(geometry,start,count){var extension=extensions.get('ANGLE_instanced_arrays');if(extension===null){console.error('THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.');return;}extension.drawElementsInstancedANGLE(mode,count,type,start*bytesPerElement,geometry.maxInstancedCount);info.update(count,mode,geometry.maxInstancedCount);}// this.setMode=setMode;this.setIndex=setIndex;this.render=render;this.renderInstances=renderInstances;}/** * @author Mugen87 / https://github.com/Mugen87 */function WebGLInfo(gl){var memory={geometries:0,textures:0};var render={frame:0,calls:0,triangles:0,points:0,lines:0};function update(count,mode,instanceCount){instanceCount=instanceCount||1;render.calls++;switch(mode){case gl.TRIANGLES:render.triangles+=instanceCount*(count/3);break;case gl.TRIANGLE_STRIP:case gl.TRIANGLE_FAN:render.triangles+=instanceCount*(count-2);break;case gl.LINES:render.lines+=instanceCount*(count/2);break;case gl.LINE_STRIP:render.lines+=instanceCount*(count-1);break;case gl.LINE_LOOP:render.lines+=instanceCount*count;break;case gl.POINTS:render.points+=instanceCount*count;break;default:console.error('THREE.WebGLInfo: Unknown draw mode:',mode);break;}}function reset(){render.frame++;render.calls=0;render.triangles=0;render.points=0;render.lines=0;}return {memory:memory,render:render,programs:null,autoReset:true,reset:reset,update:update};}/** * @author mrdoob / http://mrdoob.com/ */function absNumericalSort(a,b){return Math.abs(b[1])-Math.abs(a[1]);}function WebGLMorphtargets(gl){var influencesList={};var morphInfluences=new Float32Array(8);function update(object,geometry,material,program){var objectInfluences=object.morphTargetInfluences;var length=objectInfluences.length;var influences=influencesList[geometry.id];if(influences===undefined){// initialise list influences=[];for(var i=0;i0)return array;// unoptimized: ! isNaN( firstElem ) // see http://jacksondunstan.com/articles/983 var n=nBlocks*blockSize,r=arrayCacheF32[n];if(r===undefined){r=new Float32Array(n);arrayCacheF32[n]=r;}if(nBlocks!==0){firstElem.toArray(r,0);for(var i=1,offset=0;i!==nBlocks;++i){offset+=blockSize;array[i].toArray(r,offset);}}return r;}// Texture unit allocation function allocTexUnits(renderer,n){var r=arrayCacheI32[n];if(r===undefined){r=new Int32Array(n);arrayCacheI32[n]=r;}for(var i=0;i!==n;++i)r[i]=renderer.allocTextureUnit();return r;}// --- Setters --- // Note: Defining these methods externally, because they come in a bunch // and this way their names minify. // Single scalar function setValue1f(gl,v){gl.uniform1f(this.addr,v);}function setValue1i(gl,v){gl.uniform1i(this.addr,v);}// Single float vector (from flat array or THREE.VectorN) function setValue2fv(gl,v){if(v.x===undefined){gl.uniform2fv(this.addr,v);}else{gl.uniform2f(this.addr,v.x,v.y);}}function setValue3fv(gl,v){if(v.x!==undefined){gl.uniform3f(this.addr,v.x,v.y,v.z);}else if(v.r!==undefined){gl.uniform3f(this.addr,v.r,v.g,v.b);}else{gl.uniform3fv(this.addr,v);}}function setValue4fv(gl,v){if(v.x===undefined){gl.uniform4fv(this.addr,v);}else{gl.uniform4f(this.addr,v.x,v.y,v.z,v.w);}}// Single matrix (from flat array or MatrixN) function setValue2fm(gl,v){gl.uniformMatrix2fv(this.addr,false,v.elements||v);}function setValue3fm(gl,v){if(v.elements===undefined){gl.uniformMatrix3fv(this.addr,false,v);}else{mat3array.set(v.elements);gl.uniformMatrix3fv(this.addr,false,mat3array);}}function setValue4fm(gl,v){if(v.elements===undefined){gl.uniformMatrix4fv(this.addr,false,v);}else{mat4array.set(v.elements);gl.uniformMatrix4fv(this.addr,false,mat4array);}}// Single texture (2D / Cube) function setValueT1(gl,v,renderer){var unit=renderer.allocTextureUnit();gl.uniform1i(this.addr,unit);renderer.setTexture2D(v||emptyTexture,unit);}function setValueT6(gl,v,renderer){var unit=renderer.allocTextureUnit();gl.uniform1i(this.addr,unit);renderer.setTextureCube(v||emptyCubeTexture,unit);}// Integer / Boolean vectors or arrays thereof (always flat arrays) function setValue2iv(gl,v){gl.uniform2iv(this.addr,v);}function setValue3iv(gl,v){gl.uniform3iv(this.addr,v);}function setValue4iv(gl,v){gl.uniform4iv(this.addr,v);}// Helper to pick the right setter for the singular case function getSingularSetter(type){switch(type){case 0x1406:return setValue1f;// FLOAT case 0x8b50:return setValue2fv;// _VEC2 case 0x8b51:return setValue3fv;// _VEC3 case 0x8b52:return setValue4fv;// _VEC4 case 0x8b5a:return setValue2fm;// _MAT2 case 0x8b5b:return setValue3fm;// _MAT3 case 0x8b5c:return setValue4fm;// _MAT4 case 0x8b5e:case 0x8d66:return setValueT1;// SAMPLER_2D, SAMPLER_EXTERNAL_OES case 0x8b60:return setValueT6;// SAMPLER_CUBE case 0x1404:case 0x8b56:return setValue1i;// INT, BOOL case 0x8b53:case 0x8b57:return setValue2iv;// _VEC2 case 0x8b54:case 0x8b58:return setValue3iv;// _VEC3 case 0x8b55:case 0x8b59:return setValue4iv;// _VEC4 }}// Array of scalars function setValue1fv(gl,v){gl.uniform1fv(this.addr,v);}function setValue1iv(gl,v){gl.uniform1iv(this.addr,v);}// Array of vectors (flat or from THREE classes) function setValueV2a(gl,v){gl.uniform2fv(this.addr,flatten(v,this.size,2));}function setValueV3a(gl,v){gl.uniform3fv(this.addr,flatten(v,this.size,3));}function setValueV4a(gl,v){gl.uniform4fv(this.addr,flatten(v,this.size,4));}// Array of matrices (flat or from THREE clases) function setValueM2a(gl,v){gl.uniformMatrix2fv(this.addr,false,flatten(v,this.size,4));}function setValueM3a(gl,v){gl.uniformMatrix3fv(this.addr,false,flatten(v,this.size,9));}function setValueM4a(gl,v){gl.uniformMatrix4fv(this.addr,false,flatten(v,this.size,16));}// Array of textures (2D / Cube) function setValueT1a(gl,v,renderer){var n=v.length,units=allocTexUnits(renderer,n);gl.uniform1iv(this.addr,units);for(var i=0;i!==n;++i){renderer.setTexture2D(v[i]||emptyTexture,units[i]);}}function setValueT6a(gl,v,renderer){var n=v.length,units=allocTexUnits(renderer,n);gl.uniform1iv(this.addr,units);for(var i=0;i!==n;++i){renderer.setTextureCube(v[i]||emptyCubeTexture,units[i]);}}// Helper to pick the right setter for a pure (bottom-level) array function getPureArraySetter(type){switch(type){case 0x1406:return setValue1fv;// FLOAT case 0x8b50:return setValueV2a;// _VEC2 case 0x8b51:return setValueV3a;// _VEC3 case 0x8b52:return setValueV4a;// _VEC4 case 0x8b5a:return setValueM2a;// _MAT2 case 0x8b5b:return setValueM3a;// _MAT3 case 0x8b5c:return setValueM4a;// _MAT4 case 0x8b5e:return setValueT1a;// SAMPLER_2D case 0x8b60:return setValueT6a;// SAMPLER_CUBE case 0x1404:case 0x8b56:return setValue1iv;// INT, BOOL case 0x8b53:case 0x8b57:return setValue2iv;// _VEC2 case 0x8b54:case 0x8b58:return setValue3iv;// _VEC3 case 0x8b55:case 0x8b59:return setValue4iv;// _VEC4 }}// --- Uniform Classes --- function SingleUniform(id,activeInfo,addr){this.id=id;this.addr=addr;this.setValue=getSingularSetter(activeInfo.type);// this.path = activeInfo.name; // DEBUG }function PureArrayUniform(id,activeInfo,addr){this.id=id;this.addr=addr;this.size=activeInfo.size;this.setValue=getPureArraySetter(activeInfo.type);// this.path = activeInfo.name; // DEBUG }function StructuredUniform(id){this.id=id;UniformContainer.call(this);// mix-in }StructuredUniform.prototype.setValue=function(gl,value){// Note: Don't need an extra 'renderer' parameter, since samplers // are not allowed in structured uniforms. var seq=this.seq;for(var i=0,n=seq.length;i!==n;++i){var u=seq[i];u.setValue(gl,value[u.id]);}};// --- Top-level --- // Parser - builds up the property tree from the path strings var RePathPart=/([\w\d_]+)(\])?(\[|\.)?/g;// extracts // - the identifier (member name or array index) // - followed by an optional right bracket (found when array index) // - followed by an optional left bracket or dot (type of subscript) // // Note: These portions can be read in a non-overlapping fashion and // allow straightforward parsing of the hierarchy that WebGL encodes // in the uniform names. function addUniform(container,uniformObject){container.seq.push(uniformObject);container.map[uniformObject.id]=uniformObject;}function parseUniform(activeInfo,addr,container){var path=activeInfo.name,pathLength=path.length;// reset RegExp object, because of the early exit of a previous run RePathPart.lastIndex=0;for(;;){var match=RePathPart.exec(path),matchEnd=RePathPart.lastIndex,id=match[1],idIsIndex=match[2]===']',subscript=match[3];if(idIsIndex)id=id|0;// convert to integer if(subscript===undefined||subscript==='['&&matchEnd+2===pathLength){// bare name or "pure" bottom-level array "[0]" suffix addUniform(container,subscript===undefined?new SingleUniform(id,activeInfo,addr):new PureArrayUniform(id,activeInfo,addr));break;}else{// step into inner node / create it in case it doesn't exist var map=container.map,next=map[id];if(next===undefined){next=new StructuredUniform(id);addUniform(container,next);}container=next;}}}// Root Container function WebGLUniforms(gl,program,renderer){UniformContainer.call(this);this.renderer=renderer;var n=gl.getProgramParameter(program,gl.ACTIVE_UNIFORMS);for(var i=0;i/gm;function replace(match,include){var replace=ShaderChunk[include];if(replace===undefined){throw new Error('Can not resolve #include <'+include+'>');}return parseIncludes(replace);}return string.replace(pattern,replace);}function unrollLoops(string){var pattern=/#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g;function replace(match,start,end,snippet){var unroll='';for(var i=parseInt(start);i0?renderer.gammaFactor:1.0;// console.log( 'building new program ' ); // var customExtensions=generateExtensions(material.extensions,parameters,extensions);var customDefines=generateDefines(defines);// var program=gl.createProgram();var prefixVertex,prefixFragment;if(material.isRawShaderMaterial){prefixVertex=[customDefines].filter(filterEmptyLine).join('\n');if(prefixVertex.length>0){prefixVertex+='\n';}prefixFragment=[customExtensions,customDefines].filter(filterEmptyLine).join('\n');if(prefixFragment.length>0){prefixFragment+='\n';}}else{prefixVertex=['precision '+parameters.precision+' float;','precision '+parameters.precision+' int;','#define SHADER_NAME '+shader.name,customDefines,parameters.supportsVertexTextures?'#define VERTEX_TEXTURES':'','#define GAMMA_FACTOR '+gammaFactorDefine,'#define MAX_BONES '+parameters.maxBones,parameters.useFog&¶meters.fog?'#define USE_FOG':'',parameters.useFog&¶meters.fogExp?'#define FOG_EXP2':'',parameters.map?'#define USE_MAP':'',parameters.envMap?'#define USE_ENVMAP':'',parameters.envMap?'#define '+envMapModeDefine:'',parameters.lightMap?'#define USE_LIGHTMAP':'',parameters.aoMap?'#define USE_AOMAP':'',parameters.emissiveMap?'#define USE_EMISSIVEMAP':'',parameters.bumpMap?'#define USE_BUMPMAP':'',parameters.normalMap?'#define USE_NORMALMAP':'',parameters.displacementMap&¶meters.supportsVertexTextures?'#define USE_DISPLACEMENTMAP':'',parameters.specularMap?'#define USE_SPECULARMAP':'',parameters.roughnessMap?'#define USE_ROUGHNESSMAP':'',parameters.metalnessMap?'#define USE_METALNESSMAP':'',parameters.alphaMap?'#define USE_ALPHAMAP':'',parameters.vertexColors?'#define USE_COLOR':'',parameters.flatShading?'#define FLAT_SHADED':'',parameters.skinning?'#define USE_SKINNING':'',parameters.useVertexTexture?'#define BONE_TEXTURE':'',parameters.morphTargets?'#define USE_MORPHTARGETS':'',parameters.morphNormals&¶meters.flatShading===false?'#define USE_MORPHNORMALS':'',parameters.doubleSided?'#define DOUBLE_SIDED':'',parameters.flipSided?'#define FLIP_SIDED':'',parameters.shadowMapEnabled?'#define USE_SHADOWMAP':'',parameters.shadowMapEnabled?'#define '+shadowMapTypeDefine:'',parameters.sizeAttenuation?'#define USE_SIZEATTENUATION':'',parameters.logarithmicDepthBuffer?'#define USE_LOGDEPTHBUF':'',parameters.logarithmicDepthBuffer&&extensions.get('EXT_frag_depth')?'#define USE_LOGDEPTHBUF_EXT':'','uniform mat4 modelMatrix;','uniform mat4 modelViewMatrix;','uniform mat4 projectionMatrix;','uniform mat4 viewMatrix;','uniform mat3 normalMatrix;','uniform vec3 cameraPosition;','attribute vec3 position;','attribute vec3 normal;','attribute vec2 uv;','#ifdef USE_COLOR',' attribute vec3 color;','#endif','#ifdef USE_MORPHTARGETS',' attribute vec3 morphTarget0;',' attribute vec3 morphTarget1;',' attribute vec3 morphTarget2;',' attribute vec3 morphTarget3;',' #ifdef USE_MORPHNORMALS',' attribute vec3 morphNormal0;',' attribute vec3 morphNormal1;',' attribute vec3 morphNormal2;',' attribute vec3 morphNormal3;',' #else',' attribute vec3 morphTarget4;',' attribute vec3 morphTarget5;',' attribute vec3 morphTarget6;',' attribute vec3 morphTarget7;',' #endif','#endif','#ifdef USE_SKINNING',' attribute vec4 skinIndex;',' attribute vec4 skinWeight;','#endif','\n'].filter(filterEmptyLine).join('\n');prefixFragment=[customExtensions,'precision '+parameters.precision+' float;','precision '+parameters.precision+' int;','#define SHADER_NAME '+shader.name,customDefines,parameters.alphaTest?'#define ALPHATEST '+parameters.alphaTest:'','#define GAMMA_FACTOR '+gammaFactorDefine,parameters.useFog&¶meters.fog?'#define USE_FOG':'',parameters.useFog&¶meters.fogExp?'#define FOG_EXP2':'',parameters.map?'#define USE_MAP':'',parameters.envMap?'#define USE_ENVMAP':'',parameters.envMap?'#define '+envMapTypeDefine:'',parameters.envMap?'#define '+envMapModeDefine:'',parameters.envMap?'#define '+envMapBlendingDefine:'',parameters.lightMap?'#define USE_LIGHTMAP':'',parameters.aoMap?'#define USE_AOMAP':'',parameters.emissiveMap?'#define USE_EMISSIVEMAP':'',parameters.bumpMap?'#define USE_BUMPMAP':'',parameters.normalMap?'#define USE_NORMALMAP':'',parameters.specularMap?'#define USE_SPECULARMAP':'',parameters.roughnessMap?'#define USE_ROUGHNESSMAP':'',parameters.metalnessMap?'#define USE_METALNESSMAP':'',parameters.alphaMap?'#define USE_ALPHAMAP':'',parameters.vertexColors?'#define USE_COLOR':'',parameters.gradientMap?'#define USE_GRADIENTMAP':'',parameters.flatShading?'#define FLAT_SHADED':'',parameters.doubleSided?'#define DOUBLE_SIDED':'',parameters.flipSided?'#define FLIP_SIDED':'',parameters.shadowMapEnabled?'#define USE_SHADOWMAP':'',parameters.shadowMapEnabled?'#define '+shadowMapTypeDefine:'',parameters.premultipliedAlpha?'#define PREMULTIPLIED_ALPHA':'',parameters.physicallyCorrectLights?'#define PHYSICALLY_CORRECT_LIGHTS':'',parameters.logarithmicDepthBuffer?'#define USE_LOGDEPTHBUF':'',parameters.logarithmicDepthBuffer&&extensions.get('EXT_frag_depth')?'#define USE_LOGDEPTHBUF_EXT':'',parameters.envMap&&extensions.get('EXT_shader_texture_lod')?'#define TEXTURE_LOD_EXT':'','uniform mat4 viewMatrix;','uniform vec3 cameraPosition;',parameters.toneMapping!==NoToneMapping?'#define TONE_MAPPING':'',parameters.toneMapping!==NoToneMapping?ShaderChunk['tonemapping_pars_fragment']:'',// this code is required here because it is used by the toneMapping() function defined below parameters.toneMapping!==NoToneMapping?getToneMappingFunction('toneMapping',parameters.toneMapping):'',parameters.dithering?'#define DITHERING':'',parameters.outputEncoding||parameters.mapEncoding||parameters.envMapEncoding||parameters.emissiveMapEncoding?ShaderChunk['encodings_pars_fragment']:'',// this code is required here because it is used by the various encoding/decoding function defined below parameters.mapEncoding?getTexelDecodingFunction('mapTexelToLinear',parameters.mapEncoding):'',parameters.envMapEncoding?getTexelDecodingFunction('envMapTexelToLinear',parameters.envMapEncoding):'',parameters.emissiveMapEncoding?getTexelDecodingFunction('emissiveMapTexelToLinear',parameters.emissiveMapEncoding):'',parameters.outputEncoding?getTexelEncodingFunction('linearToOutputTexel',parameters.outputEncoding):'',parameters.depthPacking?'#define DEPTH_PACKING '+material.depthPacking:'','\n'].filter(filterEmptyLine).join('\n');}vertexShader=parseIncludes(vertexShader);vertexShader=replaceLightNums(vertexShader,parameters);vertexShader=replaceClippingPlaneNums(vertexShader,parameters);fragmentShader=parseIncludes(fragmentShader);fragmentShader=replaceLightNums(fragmentShader,parameters);fragmentShader=replaceClippingPlaneNums(fragmentShader,parameters);vertexShader=unrollLoops(vertexShader);fragmentShader=unrollLoops(fragmentShader);var vertexGlsl=prefixVertex+vertexShader;var fragmentGlsl=prefixFragment+fragmentShader;// console.log( '*VERTEX*', vertexGlsl ); // console.log( '*FRAGMENT*', fragmentGlsl ); var glVertexShader=WebGLShader(gl,gl.VERTEX_SHADER,vertexGlsl);var glFragmentShader=WebGLShader(gl,gl.FRAGMENT_SHADER,fragmentGlsl);gl.attachShader(program,glVertexShader);gl.attachShader(program,glFragmentShader);// Force a particular attribute to index 0. if(material.index0AttributeName!==undefined){gl.bindAttribLocation(program,0,material.index0AttributeName);}else if(parameters.morphTargets===true){// programs with morphTargets displace position out of attribute 0 gl.bindAttribLocation(program,0,'position');}gl.linkProgram(program);var programLog=gl.getProgramInfoLog(program).trim();var vertexLog=gl.getShaderInfoLog(glVertexShader).trim();var fragmentLog=gl.getShaderInfoLog(glFragmentShader).trim();var runnable=true;var haveDiagnostics=true;// console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) ); // console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) ); if(gl.getProgramParameter(program,gl.LINK_STATUS)===false){runnable=false;console.error('THREE.WebGLProgram: shader error: ',gl.getError(),'gl.VALIDATE_STATUS',gl.getProgramParameter(program,gl.VALIDATE_STATUS),'gl.getProgramInfoLog',programLog,vertexLog,fragmentLog);}else if(programLog!==''){console.warn('THREE.WebGLProgram: gl.getProgramInfoLog()',programLog);}else if(vertexLog===''||fragmentLog===''){haveDiagnostics=false;}if(haveDiagnostics){this.diagnostics={runnable:runnable,material:material,programLog:programLog,vertexShader:{log:vertexLog,prefix:prefixVertex},fragmentShader:{log:fragmentLog,prefix:prefixFragment}};}// clean up gl.deleteShader(glVertexShader);gl.deleteShader(glFragmentShader);// set up caching for uniform locations var cachedUniforms;this.getUniforms=function(){if(cachedUniforms===undefined){cachedUniforms=new WebGLUniforms(gl,program,renderer);}return cachedUniforms;};// set up caching for attribute locations var cachedAttributes;this.getAttributes=function(){if(cachedAttributes===undefined){cachedAttributes=fetchAttributeLocations(gl,program);}return cachedAttributes;};// free resource this.destroy=function(){gl.deleteProgram(program);this.program=undefined;};// DEPRECATED Object.defineProperties(this,{uniforms:{get:function(){console.warn('THREE.WebGLProgram: .uniforms is now .getUniforms().');return this.getUniforms();}},attributes:{get:function(){console.warn('THREE.WebGLProgram: .attributes is now .getAttributes().');return this.getAttributes();}}});// this.name=shader.name;this.id=programIdCount++;this.code=code;this.usedTimes=1;this.program=program;this.vertexShader=glVertexShader;this.fragmentShader=glFragmentShader;return this;}/** * @author mrdoob / http://mrdoob.com/ */function WebGLPrograms(renderer,extensions,capabilities){var programs=[];var shaderIDs={MeshDepthMaterial:'depth',MeshDistanceMaterial:'distanceRGBA',MeshNormalMaterial:'normal',MeshBasicMaterial:'basic',MeshLambertMaterial:'lambert',MeshPhongMaterial:'phong',MeshToonMaterial:'phong',MeshStandardMaterial:'physical',MeshPhysicalMaterial:'physical',LineBasicMaterial:'basic',LineDashedMaterial:'dashed',PointsMaterial:'points',ShadowMaterial:'shadow'};var parameterNames=["precision","supportsVertexTextures","map","mapEncoding","envMap","envMapMode","envMapEncoding","lightMap","aoMap","emissiveMap","emissiveMapEncoding","bumpMap","normalMap","displacementMap","specularMap","roughnessMap","metalnessMap","gradientMap","alphaMap","combine","vertexColors","fog","useFog","fogExp","flatShading","sizeAttenuation","logarithmicDepthBuffer","skinning","maxBones","useVertexTexture","morphTargets","morphNormals","maxMorphTargets","maxMorphNormals","premultipliedAlpha","numDirLights","numPointLights","numSpotLights","numHemiLights","numRectAreaLights","shadowMapEnabled","shadowMapType","toneMapping",'physicallyCorrectLights',"alphaTest","doubleSided","flipSided","numClippingPlanes","numClipIntersection","depthPacking","dithering"];function allocateBones(object){var skeleton=object.skeleton;var bones=skeleton.bones;if(capabilities.floatVertexTextures){return 1024;}else{// default for when object is not specified // ( for example when prebuilding shader to be used with multiple objects ) // // - leave some extra space for other uniforms // - limit here is ANGLE's 254 max uniform vectors // (up to 54 should be safe) var nVertexUniforms=capabilities.maxVertexUniforms;var nVertexMatrices=Math.floor((nVertexUniforms-20)/4);var maxBones=Math.min(nVertexMatrices,bones.length);if(maxBones0,maxBones:maxBones,useVertexTexture:capabilities.floatVertexTextures,morphTargets:material.morphTargets,morphNormals:material.morphNormals,maxMorphTargets:renderer.maxMorphTargets,maxMorphNormals:renderer.maxMorphNormals,numDirLights:lights.directional.length,numPointLights:lights.point.length,numSpotLights:lights.spot.length,numRectAreaLights:lights.rectArea.length,numHemiLights:lights.hemi.length,numClippingPlanes:nClipPlanes,numClipIntersection:nClipIntersection,dithering:material.dithering,shadowMapEnabled:renderer.shadowMap.enabled&&object.receiveShadow&&shadows.length>0,shadowMapType:renderer.shadowMap.type,toneMapping:renderer.toneMapping,physicallyCorrectLights:renderer.physicallyCorrectLights,premultipliedAlpha:material.premultipliedAlpha,alphaTest:material.alphaTest,doubleSided:material.side===DoubleSide,flipSided:material.side===BackSide,depthPacking:material.depthPacking!==undefined?material.depthPacking:false};return parameters;};this.getProgramCode=function(material,parameters){var array=[];if(parameters.shaderID){array.push(parameters.shaderID);}else{array.push(material.fragmentShader);array.push(material.vertexShader);}if(material.defines!==undefined){for(var name in material.defines){array.push(name);array.push(material.defines[name]);}}for(var i=0;i1)opaque.sort(painterSortStable);if(transparent.length>1)transparent.sort(reversePainterSortStable);}return {opaque:opaque,transparent:transparent,init:init,push:push,sort:sort};}function WebGLRenderLists(){var lists={};function get(scene,camera){var hash=scene.id+','+camera.id;var list=lists[hash];if(list===undefined){// console.log( 'THREE.WebGLRenderLists:', hash ); list=new WebGLRenderList();lists[hash]=list;}return list;}function dispose(){lists={};}return {get:get,dispose:dispose};}/** * @author mrdoob / http://mrdoob.com/ */function UniformsCache(){var lights={};return {get:function(light){if(lights[light.id]!==undefined){return lights[light.id];}var uniforms;switch(light.type){case'DirectionalLight':uniforms={direction:new Vector3(),color:new Color(),shadow:false,shadowBias:0,shadowRadius:1,shadowMapSize:new Vector2()};break;case'SpotLight':uniforms={position:new Vector3(),direction:new Vector3(),color:new Color(),distance:0,coneCos:0,penumbraCos:0,decay:0,shadow:false,shadowBias:0,shadowRadius:1,shadowMapSize:new Vector2()};break;case'PointLight':uniforms={position:new Vector3(),color:new Color(),distance:0,decay:0,shadow:false,shadowBias:0,shadowRadius:1,shadowMapSize:new Vector2(),shadowCameraNear:1,shadowCameraFar:1000};break;case'HemisphereLight':uniforms={direction:new Vector3(),skyColor:new Color(),groundColor:new Color()};break;case'RectAreaLight':uniforms={color:new Color(),position:new Vector3(),halfWidth:new Vector3(),halfHeight:new Vector3()// TODO (abelnation): set RectAreaLight shadow uniforms };break;}lights[light.id]=uniforms;return uniforms;}};}var count=0;function WebGLLights(){var cache=new UniformsCache();var state={id:count++,hash:'',ambient:[0,0,0],directional:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],point:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]};var vector3=new Vector3();var matrix4=new Matrix4();var matrix42=new Matrix4();function setup(lights,shadows,camera){var r=0,g=0,b=0;var directionalLength=0;var pointLength=0;var spotLength=0;var rectAreaLength=0;var hemiLength=0;var viewMatrix=camera.matrixWorldInverse;for(var i=0,l=lights.length;i, * * map: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * displacementMap: new THREE.Texture( ), * displacementScale: , * displacementBias: , * * wireframe: , * wireframeLinewidth: * } */function MeshDepthMaterial(parameters){Material.call(this);this.type='MeshDepthMaterial';this.depthPacking=BasicDepthPacking;this.skinning=false;this.morphTargets=false;this.map=null;this.alphaMap=null;this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=false;this.wireframeLinewidth=1;this.fog=false;this.lights=false;this.setValues(parameters);}MeshDepthMaterial.prototype=Object.create(Material.prototype);MeshDepthMaterial.prototype.constructor=MeshDepthMaterial;MeshDepthMaterial.prototype.isMeshDepthMaterial=true;MeshDepthMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.depthPacking=source.depthPacking;this.skinning=source.skinning;this.morphTargets=source.morphTargets;this.map=source.map;this.alphaMap=source.alphaMap;this.displacementMap=source.displacementMap;this.displacementScale=source.displacementScale;this.displacementBias=source.displacementBias;this.wireframe=source.wireframe;this.wireframeLinewidth=source.wireframeLinewidth;return this;};/** * @author WestLangley / http://github.com/WestLangley * * parameters = { * * referencePosition: , * nearDistance: , * farDistance: , * * skinning: , * morphTargets: , * * map: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * displacementMap: new THREE.Texture( ), * displacementScale: , * displacementBias: * * } */function MeshDistanceMaterial(parameters){Material.call(this);this.type='MeshDistanceMaterial';this.referencePosition=new Vector3();this.nearDistance=1;this.farDistance=1000;this.skinning=false;this.morphTargets=false;this.map=null;this.alphaMap=null;this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.fog=false;this.lights=false;this.setValues(parameters);}MeshDistanceMaterial.prototype=Object.create(Material.prototype);MeshDistanceMaterial.prototype.constructor=MeshDistanceMaterial;MeshDistanceMaterial.prototype.isMeshDistanceMaterial=true;MeshDistanceMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.referencePosition.copy(source.referencePosition);this.nearDistance=source.nearDistance;this.farDistance=source.farDistance;this.skinning=source.skinning;this.morphTargets=source.morphTargets;this.map=source.map;this.alphaMap=source.alphaMap;this.displacementMap=source.displacementMap;this.displacementScale=source.displacementScale;this.displacementBias=source.displacementBias;return this;};/** * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ */function WebGLShadowMap(_renderer,_objects,maxTextureSize){var _frustum=new Frustum(),_projScreenMatrix=new Matrix4(),_shadowMapSize=new Vector2(),_maxShadowMapSize=new Vector2(maxTextureSize,maxTextureSize),_lookTarget=new Vector3(),_lightPositionWorld=new Vector3(),_MorphingFlag=1,_SkinningFlag=2,_NumberOfMaterialVariants=(_MorphingFlag|_SkinningFlag)+1,_depthMaterials=new Array(_NumberOfMaterialVariants),_distanceMaterials=new Array(_NumberOfMaterialVariants),_materialCache={};var shadowSide={0:BackSide,1:FrontSide,2:DoubleSide};var cubeDirections=[new Vector3(1,0,0),new Vector3(-1,0,0),new Vector3(0,0,1),new Vector3(0,0,-1),new Vector3(0,1,0),new Vector3(0,-1,0)];var cubeUps=[new Vector3(0,1,0),new Vector3(0,1,0),new Vector3(0,1,0),new Vector3(0,1,0),new Vector3(0,0,1),new Vector3(0,0,-1)];var cube2DViewPorts=[new Vector4(),new Vector4(),new Vector4(),new Vector4(),new Vector4(),new Vector4()];// init for(var i=0;i!==_NumberOfMaterialVariants;++i){var useMorphing=(i&_MorphingFlag)!==0;var useSkinning=(i&_SkinningFlag)!==0;var depthMaterial=new MeshDepthMaterial({depthPacking:RGBADepthPacking,morphTargets:useMorphing,skinning:useSkinning});_depthMaterials[i]=depthMaterial;// var distanceMaterial=new MeshDistanceMaterial({morphTargets:useMorphing,skinning:useSkinning});_distanceMaterials[i]=distanceMaterial;}// var scope=this;this.enabled=false;this.autoUpdate=true;this.needsUpdate=false;this.type=PCFShadowMap;this.render=function(lights,scene,camera){if(scope.enabled===false)return;if(scope.autoUpdate===false&&scope.needsUpdate===false)return;if(lights.length===0)return;// TODO Clean up (needed in case of contextlost) var _gl=_renderer.context;var _state=_renderer.state;// Set GL state for depth map. _state.disable(_gl.BLEND);_state.buffers.color.setClear(1,1,1,1);_state.buffers.depth.setTest(true);_state.setScissorTest(false);// render depth map var faceCount;for(var i=0,il=lights.length;i0;}else if(geometry&&geometry.isGeometry){useMorphing=geometry.morphTargets&&geometry.morphTargets.length>0;}}if(object.isSkinnedMesh&&material.skinning===false){console.warn('THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:',object);}var useSkinning=object.isSkinnedMesh&&material.skinning;var variantIndex=0;if(useMorphing)variantIndex|=_MorphingFlag;if(useSkinning)variantIndex|=_SkinningFlag;result=materialVariants[variantIndex];}else{result=customMaterial;}if(_renderer.localClippingEnabled&&material.clipShadows===true&&material.clippingPlanes.length!==0){// in this case we need a unique material instance reflecting the // appropriate state var keyA=result.uuid,keyB=material.uuid;var materialsForVariant=_materialCache[keyA];if(materialsForVariant===undefined){materialsForVariant={};_materialCache[keyA]=materialsForVariant;}var cachedMaterial=materialsForVariant[keyB];if(cachedMaterial===undefined){cachedMaterial=result.clone();materialsForVariant[keyB]=cachedMaterial;}result=cachedMaterial;}result.visible=material.visible;result.wireframe=material.wireframe;result.side=material.shadowSide!=null?material.shadowSide:shadowSide[material.side];result.clipShadows=material.clipShadows;result.clippingPlanes=material.clippingPlanes;result.clipIntersection=material.clipIntersection;result.wireframeLinewidth=material.wireframeLinewidth;result.linewidth=material.linewidth;if(isPointLight&&result.isMeshDistanceMaterial){result.referencePosition.copy(lightPositionWorld);result.nearDistance=shadowCameraNear;result.farDistance=shadowCameraFar;}return result;}function renderObject(object,camera,shadowCamera,isPointLight){if(object.visible===false)return;var visible=object.layers.test(camera.layers);if(visible&&(object.isMesh||object.isLine||object.isPoints)){if(object.castShadow&&(!object.frustumCulled||_frustum.intersectsObject(object))){object.modelViewMatrix.multiplyMatrices(shadowCamera.matrixWorldInverse,object.matrixWorld);var geometry=_objects.update(object);var material=object.material;if(Array.isArray(material)){var groups=geometry.groups;for(var k=0,kl=groups.length;k 0 ) {',' float fogFactor = 0.0;',' if ( fogType == 1 ) {',' fogFactor = smoothstep( fogNear, fogFar, fogDepth );',' } else {',' const float LOG2 = 1.442695;',' fogFactor = exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 );',' fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );',' }',' gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );',' }','}'].join('\n'));gl.compileShader(vertexShader);gl.compileShader(fragmentShader);gl.attachShader(program,vertexShader);gl.attachShader(program,fragmentShader);gl.linkProgram(program);return program;}function painterSortStable(a,b){if(a.renderOrder!==b.renderOrder){return a.renderOrder-b.renderOrder;}else if(a.z!==b.z){return b.z-a.z;}else{return b.id-a.id;}}}/** * @author mrdoob / http://mrdoob.com/ */function WebGLState(gl,extensions,utils){function ColorBuffer(){var locked=false;var color=new Vector4();var currentColorMask=null;var currentColorClear=new Vector4(0,0,0,0);return {setMask:function(colorMask){if(currentColorMask!==colorMask&&!locked){gl.colorMask(colorMask,colorMask,colorMask,colorMask);currentColorMask=colorMask;}},setLocked:function(lock){locked=lock;},setClear:function(r,g,b,a,premultipliedAlpha){if(premultipliedAlpha===true){r*=a;g*=a;b*=a;}color.set(r,g,b,a);if(currentColorClear.equals(color)===false){gl.clearColor(r,g,b,a);currentColorClear.copy(color);}},reset:function(){locked=false;currentColorMask=null;currentColorClear.set(-1,0,0,0);// set to invalid state }};}function DepthBuffer(){var locked=false;var currentDepthMask=null;var currentDepthFunc=null;var currentDepthClear=null;return {setTest:function(depthTest){if(depthTest){enable(gl.DEPTH_TEST);}else{disable(gl.DEPTH_TEST);}},setMask:function(depthMask){if(currentDepthMask!==depthMask&&!locked){gl.depthMask(depthMask);currentDepthMask=depthMask;}},setFunc:function(depthFunc){if(currentDepthFunc!==depthFunc){if(depthFunc){switch(depthFunc){case NeverDepth:gl.depthFunc(gl.NEVER);break;case AlwaysDepth:gl.depthFunc(gl.ALWAYS);break;case LessDepth:gl.depthFunc(gl.LESS);break;case LessEqualDepth:gl.depthFunc(gl.LEQUAL);break;case EqualDepth:gl.depthFunc(gl.EQUAL);break;case GreaterEqualDepth:gl.depthFunc(gl.GEQUAL);break;case GreaterDepth:gl.depthFunc(gl.GREATER);break;case NotEqualDepth:gl.depthFunc(gl.NOTEQUAL);break;default:gl.depthFunc(gl.LEQUAL);}}else{gl.depthFunc(gl.LEQUAL);}currentDepthFunc=depthFunc;}},setLocked:function(lock){locked=lock;},setClear:function(depth){if(currentDepthClear!==depth){gl.clearDepth(depth);currentDepthClear=depth;}},reset:function(){locked=false;currentDepthMask=null;currentDepthFunc=null;currentDepthClear=null;}};}function StencilBuffer(){var locked=false;var currentStencilMask=null;var currentStencilFunc=null;var currentStencilRef=null;var currentStencilFuncMask=null;var currentStencilFail=null;var currentStencilZFail=null;var currentStencilZPass=null;var currentStencilClear=null;return {setTest:function(stencilTest){if(stencilTest){enable(gl.STENCIL_TEST);}else{disable(gl.STENCIL_TEST);}},setMask:function(stencilMask){if(currentStencilMask!==stencilMask&&!locked){gl.stencilMask(stencilMask);currentStencilMask=stencilMask;}},setFunc:function(stencilFunc,stencilRef,stencilMask){if(currentStencilFunc!==stencilFunc||currentStencilRef!==stencilRef||currentStencilFuncMask!==stencilMask){gl.stencilFunc(stencilFunc,stencilRef,stencilMask);currentStencilFunc=stencilFunc;currentStencilRef=stencilRef;currentStencilFuncMask=stencilMask;}},setOp:function(stencilFail,stencilZFail,stencilZPass){if(currentStencilFail!==stencilFail||currentStencilZFail!==stencilZFail||currentStencilZPass!==stencilZPass){gl.stencilOp(stencilFail,stencilZFail,stencilZPass);currentStencilFail=stencilFail;currentStencilZFail=stencilZFail;currentStencilZPass=stencilZPass;}},setLocked:function(lock){locked=lock;},setClear:function(stencil){if(currentStencilClear!==stencil){gl.clearStencil(stencil);currentStencilClear=stencil;}},reset:function(){locked=false;currentStencilMask=null;currentStencilFunc=null;currentStencilRef=null;currentStencilFuncMask=null;currentStencilFail=null;currentStencilZFail=null;currentStencilZPass=null;currentStencilClear=null;}};}// var colorBuffer=new ColorBuffer();var depthBuffer=new DepthBuffer();var stencilBuffer=new StencilBuffer();var maxVertexAttributes=gl.getParameter(gl.MAX_VERTEX_ATTRIBS);var newAttributes=new Uint8Array(maxVertexAttributes);var enabledAttributes=new Uint8Array(maxVertexAttributes);var attributeDivisors=new Uint8Array(maxVertexAttributes);var capabilities={};var compressedTextureFormats=null;var currentProgram=null;var currentBlending=null;var currentBlendEquation=null;var currentBlendSrc=null;var currentBlendDst=null;var currentBlendEquationAlpha=null;var currentBlendSrcAlpha=null;var currentBlendDstAlpha=null;var currentPremultipledAlpha=false;var currentFlipSided=null;var currentCullFace=null;var currentLineWidth=null;var currentPolygonOffsetFactor=null;var currentPolygonOffsetUnits=null;var maxTextures=gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS);var lineWidthAvailable=false;var version=0;var glVersion=gl.getParameter(gl.VERSION);if(glVersion.indexOf('WebGL')!==-1){version=parseFloat(/^WebGL\ ([0-9])/.exec(glVersion)[1]);lineWidthAvailable=version>=1.0;}else if(glVersion.indexOf('OpenGL ES')!==-1){version=parseFloat(/^OpenGL\ ES\ ([0-9])/.exec(glVersion)[1]);lineWidthAvailable=version>=2.0;}var currentTextureSlot=null;var currentBoundTextures={};var currentScissor=new Vector4();var currentViewport=new Vector4();function createTexture(type,target,count){var data=new Uint8Array(4);// 4 is required to match default unpack alignment of 4. var texture=gl.createTexture();gl.bindTexture(type,texture);gl.texParameteri(type,gl.TEXTURE_MIN_FILTER,gl.NEAREST);gl.texParameteri(type,gl.TEXTURE_MAG_FILTER,gl.NEAREST);for(var i=0;imaxSize||image.height>maxSize){if('data'in image){console.warn('THREE.WebGLRenderer: image in DataTexture is too big ('+image.width+'x'+image.height+').');return;}// Warning: Scaling through the canvas will only work with images that use // premultiplied alpha. var scale=maxSize/Math.max(image.width,image.height);var canvas=document.createElementNS('http://www.w3.org/1999/xhtml','canvas');canvas.width=Math.floor(image.width*scale);canvas.height=Math.floor(image.height*scale);var context=canvas.getContext('2d');context.drawImage(image,0,0,image.width,image.height,0,0,canvas.width,canvas.height);console.warn('THREE.WebGLRenderer: image is too big ('+image.width+'x'+image.height+'). Resized to '+canvas.width+'x'+canvas.height,image);return canvas;}return image;}function isPowerOfTwo(image){return _Math.isPowerOfTwo(image.width)&&_Math.isPowerOfTwo(image.height);}function makePowerOfTwo(image){if(image instanceof HTMLImageElement||image instanceof HTMLCanvasElement||image instanceof ImageBitmap){if(_canvas===undefined)_canvas=document.createElementNS('http://www.w3.org/1999/xhtml','canvas');_canvas.width=_Math.floorPowerOfTwo(image.width);_canvas.height=_Math.floorPowerOfTwo(image.height);var context=_canvas.getContext('2d');context.drawImage(image,0,0,_canvas.width,_canvas.height);console.warn('THREE.WebGLRenderer: image is not power of two ('+image.width+'x'+image.height+'). Resized to '+_canvas.width+'x'+_canvas.height,image);return _canvas;}return image;}function textureNeedsPowerOfTwo(texture){return texture.wrapS!==ClampToEdgeWrapping||texture.wrapT!==ClampToEdgeWrapping||texture.minFilter!==NearestFilter&&texture.minFilter!==LinearFilter;}function textureNeedsGenerateMipmaps(texture,isPowerOfTwo){return texture.generateMipmaps&&isPowerOfTwo&&texture.minFilter!==NearestFilter&&texture.minFilter!==LinearFilter;}function generateMipmap(target,texture,width,height){_gl.generateMipmap(target);var textureProperties=properties.get(texture);// Note: Math.log( x ) * Math.LOG2E used instead of Math.log2( x ) which is not supported by IE11 textureProperties.__maxMipLevel=Math.log(Math.max(width,height))*Math.LOG2E;}// Fallback filters for non-power-of-2 textures function filterFallback(f){if(f===NearestFilter||f===NearestMipMapNearestFilter||f===NearestMipMapLinearFilter){return _gl.NEAREST;}return _gl.LINEAR;}// function onTextureDispose(event){var texture=event.target;texture.removeEventListener('dispose',onTextureDispose);deallocateTexture(texture);if(texture.isVideoTexture){delete _videoTextures[texture.id];}info.memory.textures--;}function onRenderTargetDispose(event){var renderTarget=event.target;renderTarget.removeEventListener('dispose',onRenderTargetDispose);deallocateRenderTarget(renderTarget);info.memory.textures--;}// function deallocateTexture(texture){var textureProperties=properties.get(texture);if(texture.image&&textureProperties.__image__webglTextureCube){// cube texture _gl.deleteTexture(textureProperties.__image__webglTextureCube);}else{// 2D texture if(textureProperties.__webglInit===undefined)return;_gl.deleteTexture(textureProperties.__webglTexture);}// remove all webgl properties properties.remove(texture);}function deallocateRenderTarget(renderTarget){var renderTargetProperties=properties.get(renderTarget);var textureProperties=properties.get(renderTarget.texture);if(!renderTarget)return;if(textureProperties.__webglTexture!==undefined){_gl.deleteTexture(textureProperties.__webglTexture);}if(renderTarget.depthTexture){renderTarget.depthTexture.dispose();}if(renderTarget.isWebGLRenderTargetCube){for(var i=0;i<6;i++){_gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer[i]);if(renderTargetProperties.__webglDepthbuffer)_gl.deleteRenderbuffer(renderTargetProperties.__webglDepthbuffer[i]);}}else{_gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer);if(renderTargetProperties.__webglDepthbuffer)_gl.deleteRenderbuffer(renderTargetProperties.__webglDepthbuffer);}properties.remove(renderTarget.texture);properties.remove(renderTarget);}// function setTexture2D(texture,slot){var textureProperties=properties.get(texture);if(texture.isVideoTexture)updateVideoTexture(texture);if(texture.version>0&&textureProperties.__version!==texture.version){var image=texture.image;if(image===undefined){console.warn('THREE.WebGLRenderer: Texture marked for update but image is undefined',texture);}else if(image.complete===false){console.warn('THREE.WebGLRenderer: Texture marked for update but image is incomplete',texture);}else{uploadTexture(textureProperties,texture,slot);return;}}state.activeTexture(_gl.TEXTURE0+slot);state.bindTexture(_gl.TEXTURE_2D,textureProperties.__webglTexture);}function setTextureCube(texture,slot){var textureProperties=properties.get(texture);if(texture.image.length===6){if(texture.version>0&&textureProperties.__version!==texture.version){if(!textureProperties.__image__webglTextureCube){texture.addEventListener('dispose',onTextureDispose);textureProperties.__image__webglTextureCube=_gl.createTexture();info.memory.textures++;}state.activeTexture(_gl.TEXTURE0+slot);state.bindTexture(_gl.TEXTURE_CUBE_MAP,textureProperties.__image__webglTextureCube);_gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL,texture.flipY);var isCompressed=texture&&texture.isCompressedTexture;var isDataTexture=texture.image[0]&&texture.image[0].isDataTexture;var cubeImage=[];for(var i=0;i<6;i++){if(!isCompressed&&!isDataTexture){cubeImage[i]=clampToMaxSize(texture.image[i],capabilities.maxCubemapSize);}else{cubeImage[i]=isDataTexture?texture.image[i].image:texture.image[i];}}var image=cubeImage[0],isPowerOfTwoImage=isPowerOfTwo(image),glFormat=utils.convert(texture.format),glType=utils.convert(texture.type);setTextureParameters(_gl.TEXTURE_CUBE_MAP,texture,isPowerOfTwoImage);for(var i=0;i<6;i++){if(!isCompressed){if(isDataTexture){state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,0,glFormat,cubeImage[i].width,cubeImage[i].height,0,glFormat,glType,cubeImage[i].data);}else{state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,0,glFormat,glFormat,glType,cubeImage[i]);}}else{var mipmap,mipmaps=cubeImage[i].mipmaps;for(var j=0,jl=mipmaps.length;j-1){state.compressedTexImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,j,glFormat,mipmap.width,mipmap.height,0,mipmap.data);}else{console.warn('THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()');}}else{state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,j,glFormat,mipmap.width,mipmap.height,0,glFormat,glType,mipmap.data);}}}}if(!isCompressed){textureProperties.__maxMipLevel=0;}else{textureProperties.__maxMipLevel=mipmaps.length-1;}if(textureNeedsGenerateMipmaps(texture,isPowerOfTwoImage)){// We assume images for cube map have the same size. generateMipmap(_gl.TEXTURE_CUBE_MAP,texture,image.width,image.height);}textureProperties.__version=texture.version;if(texture.onUpdate)texture.onUpdate(texture);}else{state.activeTexture(_gl.TEXTURE0+slot);state.bindTexture(_gl.TEXTURE_CUBE_MAP,textureProperties.__image__webglTextureCube);}}}function setTextureCubeDynamic(texture,slot){state.activeTexture(_gl.TEXTURE0+slot);state.bindTexture(_gl.TEXTURE_CUBE_MAP,properties.get(texture).__webglTexture);}function setTextureParameters(textureType,texture,isPowerOfTwoImage){var extension;if(isPowerOfTwoImage){_gl.texParameteri(textureType,_gl.TEXTURE_WRAP_S,utils.convert(texture.wrapS));_gl.texParameteri(textureType,_gl.TEXTURE_WRAP_T,utils.convert(texture.wrapT));_gl.texParameteri(textureType,_gl.TEXTURE_MAG_FILTER,utils.convert(texture.magFilter));_gl.texParameteri(textureType,_gl.TEXTURE_MIN_FILTER,utils.convert(texture.minFilter));}else{_gl.texParameteri(textureType,_gl.TEXTURE_WRAP_S,_gl.CLAMP_TO_EDGE);_gl.texParameteri(textureType,_gl.TEXTURE_WRAP_T,_gl.CLAMP_TO_EDGE);if(texture.wrapS!==ClampToEdgeWrapping||texture.wrapT!==ClampToEdgeWrapping){console.warn('THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.',texture);}_gl.texParameteri(textureType,_gl.TEXTURE_MAG_FILTER,filterFallback(texture.magFilter));_gl.texParameteri(textureType,_gl.TEXTURE_MIN_FILTER,filterFallback(texture.minFilter));if(texture.minFilter!==NearestFilter&&texture.minFilter!==LinearFilter){console.warn('THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.',texture);}}extension=extensions.get('EXT_texture_filter_anisotropic');if(extension){if(texture.type===FloatType&&extensions.get('OES_texture_float_linear')===null)return;if(texture.type===HalfFloatType&&extensions.get('OES_texture_half_float_linear')===null)return;if(texture.anisotropy>1||properties.get(texture).__currentAnisotropy){_gl.texParameterf(textureType,extension.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(texture.anisotropy,capabilities.getMaxAnisotropy()));properties.get(texture).__currentAnisotropy=texture.anisotropy;}}}function uploadTexture(textureProperties,texture,slot){if(textureProperties.__webglInit===undefined){textureProperties.__webglInit=true;texture.addEventListener('dispose',onTextureDispose);textureProperties.__webglTexture=_gl.createTexture();info.memory.textures++;}state.activeTexture(_gl.TEXTURE0+slot);state.bindTexture(_gl.TEXTURE_2D,textureProperties.__webglTexture);_gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL,texture.flipY);_gl.pixelStorei(_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL,texture.premultiplyAlpha);_gl.pixelStorei(_gl.UNPACK_ALIGNMENT,texture.unpackAlignment);var image=clampToMaxSize(texture.image,capabilities.maxTextureSize);if(textureNeedsPowerOfTwo(texture)&&isPowerOfTwo(image)===false){image=makePowerOfTwo(image);}var isPowerOfTwoImage=isPowerOfTwo(image),glFormat=utils.convert(texture.format),glType=utils.convert(texture.type);setTextureParameters(_gl.TEXTURE_2D,texture,isPowerOfTwoImage);var mipmap,mipmaps=texture.mipmaps;if(texture.isDepthTexture){// populate depth texture with dummy data var internalFormat=_gl.DEPTH_COMPONENT;if(texture.type===FloatType){if(!_isWebGL2)throw new Error('Float Depth Texture only supported in WebGL2.0');internalFormat=_gl.DEPTH_COMPONENT32F;}else if(_isWebGL2){// WebGL 2.0 requires signed internalformat for glTexImage2D internalFormat=_gl.DEPTH_COMPONENT16;}if(texture.format===DepthFormat&&internalFormat===_gl.DEPTH_COMPONENT){// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are // DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) if(texture.type!==UnsignedShortType&&texture.type!==UnsignedIntType){console.warn('THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.');texture.type=UnsignedShortType;glType=utils.convert(texture.type);}}// Depth stencil textures need the DEPTH_STENCIL internal format // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) if(texture.format===DepthStencilFormat){internalFormat=_gl.DEPTH_STENCIL;// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are // DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL. // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) if(texture.type!==UnsignedInt248Type){console.warn('THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.');texture.type=UnsignedInt248Type;glType=utils.convert(texture.type);}}state.texImage2D(_gl.TEXTURE_2D,0,internalFormat,image.width,image.height,0,glFormat,glType,null);}else if(texture.isDataTexture){// use manually created mipmaps if available // if there are no manual mipmaps // set 0 level mipmap and then use GL to generate other mipmap levels if(mipmaps.length>0&&isPowerOfTwoImage){for(var i=0,il=mipmaps.length;i-1){state.compressedTexImage2D(_gl.TEXTURE_2D,i,glFormat,mipmap.width,mipmap.height,0,mipmap.data);}else{console.warn('THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()');}}else{state.texImage2D(_gl.TEXTURE_2D,i,glFormat,mipmap.width,mipmap.height,0,glFormat,glType,mipmap.data);}}textureProperties.__maxMipLevel=mipmaps.length-1;}else{// regular Texture (image, video, canvas) // use manually created mipmaps if available // if there are no manual mipmaps // set 0 level mipmap and then use GL to generate other mipmap levels if(mipmaps.length>0&&isPowerOfTwoImage){for(var i=0,il=mipmaps.length;i 1) return this.filmGauge/Math.max(this.aspect,1);},/** * Sets an offset in a larger frustum. This is useful for multi-window or * multi-monitor/multi-machine setups. * * For example, if you have 3x2 monitors and each monitor is 1920x1080 and * the monitors are in grid like this * * +---+---+---+ * | A | B | C | * +---+---+---+ * | D | E | F | * +---+---+---+ * * then for each monitor you would call it like this * * var w = 1920; * var h = 1080; * var fullWidth = w * 3; * var fullHeight = h * 2; * * --A-- * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); * --B-- * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); * --C-- * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); * --D-- * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); * --E-- * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); * --F-- * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); * * Note there is no reason monitors have to be the same size or in a grid. */setViewOffset:function(fullWidth,fullHeight,x,y,width,height){this.aspect=fullWidth/fullHeight;if(this.view===null){this.view={enabled:true,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1};}this.view.enabled=true;this.view.fullWidth=fullWidth;this.view.fullHeight=fullHeight;this.view.offsetX=x;this.view.offsetY=y;this.view.width=width;this.view.height=height;this.updateProjectionMatrix();},clearViewOffset:function(){if(this.view!==null){this.view.enabled=false;}this.updateProjectionMatrix();},updateProjectionMatrix:function(){var near=this.near,top=near*Math.tan(_Math.DEG2RAD*0.5*this.fov)/this.zoom,height=2*top,width=this.aspect*height,left=-0.5*width,view=this.view;if(this.view!==null&&this.view.enabled){var fullWidth=view.fullWidth,fullHeight=view.fullHeight;left+=view.offsetX*width/fullWidth;top-=view.offsetY*height/fullHeight;width*=view.width/fullWidth;height*=view.height/fullHeight;}var skew=this.filmOffset;if(skew!==0)left+=near*skew/this.getFilmWidth();this.projectionMatrix.makePerspective(left,left+width,top,top-height,near,this.far);},toJSON:function(meta){var data=Object3D.prototype.toJSON.call(this,meta);data.object.fov=this.fov;data.object.zoom=this.zoom;data.object.near=this.near;data.object.far=this.far;data.object.focus=this.focus;data.object.aspect=this.aspect;if(this.view!==null)data.object.view=Object.assign({},this.view);data.object.filmGauge=this.filmGauge;data.object.filmOffset=this.filmOffset;return data;}});/** * @author mrdoob / http://mrdoob.com/ */function ArrayCamera(array){PerspectiveCamera.call(this);this.cameras=array||[];}ArrayCamera.prototype=Object.assign(Object.create(PerspectiveCamera.prototype),{constructor:ArrayCamera,isArrayCamera:true});/** * @author mrdoob / http://mrdoob.com/ */function WebVRManager(renderer){var scope=this;var device=null;var frameData=null;var poseTarget=null;var standingMatrix=new Matrix4();var standingMatrixInverse=new Matrix4();if(typeof window!=='undefined'&&'VRFrameData'in window){frameData=new window.VRFrameData();window.addEventListener('vrdisplaypresentchange',onVRDisplayPresentChange,false);}var matrixWorldInverse=new Matrix4();var tempQuaternion=new Quaternion();var tempPosition=new Vector3();var cameraL=new PerspectiveCamera();cameraL.bounds=new Vector4(0.0,0.0,0.5,1.0);cameraL.layers.enable(1);var cameraR=new PerspectiveCamera();cameraR.bounds=new Vector4(0.5,0.0,0.5,1.0);cameraR.layers.enable(2);var cameraVR=new ArrayCamera([cameraL,cameraR]);cameraVR.layers.enable(1);cameraVR.layers.enable(2);// function isPresenting(){return device!==null&&device.isPresenting===true;}var currentSize,currentPixelRatio;function onVRDisplayPresentChange(){if(isPresenting()){var eyeParameters=device.getEyeParameters('left');var renderWidth=eyeParameters.renderWidth;var renderHeight=eyeParameters.renderHeight;currentPixelRatio=renderer.getPixelRatio();currentSize=renderer.getSize();renderer.setDrawingBufferSize(renderWidth*2,renderHeight,1);}else if(scope.enabled){renderer.setDrawingBufferSize(currentSize.width,currentSize.height,currentPixelRatio);}}// this.enabled=false;this.userHeight=1.6;this.getDevice=function(){return device;};this.setDevice=function(value){if(value!==undefined)device=value;};this.setPoseTarget=function(object){if(object!==undefined)poseTarget=object;};this.getCamera=function(camera){if(device===null)return camera;device.depthNear=camera.near;device.depthFar=camera.far;device.getFrameData(frameData);// var stageParameters=device.stageParameters;if(stageParameters){standingMatrix.fromArray(stageParameters.sittingToStandingTransform);}else{standingMatrix.makeTranslation(0,scope.userHeight,0);}var pose=frameData.pose;var poseObject=poseTarget!==null?poseTarget:camera;// We want to manipulate poseObject by its position and quaternion components since users may rely on them. poseObject.matrix.copy(standingMatrix);poseObject.matrix.decompose(poseObject.position,poseObject.quaternion,poseObject.scale);if(pose.orientation!==null){tempQuaternion.fromArray(pose.orientation);poseObject.quaternion.multiply(tempQuaternion);}if(pose.position!==null){tempQuaternion.setFromRotationMatrix(standingMatrix);tempPosition.fromArray(pose.position);tempPosition.applyQuaternion(tempQuaternion);poseObject.position.add(tempPosition);}poseObject.updateMatrixWorld();if(device.isPresenting===false)return camera;// cameraL.near=camera.near;cameraR.near=camera.near;cameraL.far=camera.far;cameraR.far=camera.far;cameraVR.matrixWorld.copy(camera.matrixWorld);cameraVR.matrixWorldInverse.copy(camera.matrixWorldInverse);cameraL.matrixWorldInverse.fromArray(frameData.leftViewMatrix);cameraR.matrixWorldInverse.fromArray(frameData.rightViewMatrix);// TODO (mrdoob) Double check this code standingMatrixInverse.getInverse(standingMatrix);cameraL.matrixWorldInverse.multiply(standingMatrixInverse);cameraR.matrixWorldInverse.multiply(standingMatrixInverse);var parent=poseObject.parent;if(parent!==null){matrixWorldInverse.getInverse(parent.matrixWorld);cameraL.matrixWorldInverse.multiply(matrixWorldInverse);cameraR.matrixWorldInverse.multiply(matrixWorldInverse);}// envMap and Mirror needs camera.matrixWorld cameraL.matrixWorld.getInverse(cameraL.matrixWorldInverse);cameraR.matrixWorld.getInverse(cameraR.matrixWorldInverse);cameraL.projectionMatrix.fromArray(frameData.leftProjectionMatrix);cameraR.projectionMatrix.fromArray(frameData.rightProjectionMatrix);// HACK (mrdoob) // https://github.com/w3c/webvr/issues/203 cameraVR.projectionMatrix.copy(cameraL.projectionMatrix);// var layers=device.getLayers();if(layers.length){var layer=layers[0];if(layer.leftBounds!==null&&layer.leftBounds.length===4){cameraL.bounds.fromArray(layer.leftBounds);}if(layer.rightBounds!==null&&layer.rightBounds.length===4){cameraR.bounds.fromArray(layer.rightBounds);}}return cameraVR;};this.getStandingMatrix=function(){return standingMatrix;};this.submitFrame=function(){if(isPresenting())device.submitFrame();};this.dispose=function(){if(typeof window!=='undefined'){window.removeEventListener('vrdisplaypresentchange',onVRDisplayPresentChange);}};}/** * @author supereggbert / http://www.paulbrunt.co.uk/ * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ * @author szimek / https://github.com/szimek/ * @author tschw */function WebGLRenderer(parameters){console.log('THREE.WebGLRenderer',REVISION);parameters=parameters||{};var _canvas=parameters.canvas!==undefined?parameters.canvas:document.createElementNS('http://www.w3.org/1999/xhtml','canvas'),_context=parameters.context!==undefined?parameters.context:null,_alpha=parameters.alpha!==undefined?parameters.alpha:false,_depth=parameters.depth!==undefined?parameters.depth:true,_stencil=parameters.stencil!==undefined?parameters.stencil:true,_antialias=parameters.antialias!==undefined?parameters.antialias:false,_premultipliedAlpha=parameters.premultipliedAlpha!==undefined?parameters.premultipliedAlpha:true,_preserveDrawingBuffer=parameters.preserveDrawingBuffer!==undefined?parameters.preserveDrawingBuffer:false,_powerPreference=parameters.powerPreference!==undefined?parameters.powerPreference:'default';var currentRenderList=null;var currentRenderState=null;// public properties this.domElement=_canvas;this.context=null;// clearing this.autoClear=true;this.autoClearColor=true;this.autoClearDepth=true;this.autoClearStencil=true;// scene graph this.sortObjects=true;// user-defined clipping this.clippingPlanes=[];this.localClippingEnabled=false;// physically based shading this.gammaFactor=2.0;// for backwards compatibility this.gammaInput=false;this.gammaOutput=false;// physical lights this.physicallyCorrectLights=false;// tone mapping this.toneMapping=LinearToneMapping;this.toneMappingExposure=1.0;this.toneMappingWhitePoint=1.0;// morphs this.maxMorphTargets=8;this.maxMorphNormals=4;// internal properties var _this=this,_isContextLost=false,// internal state cache _currentRenderTarget=null,_currentFramebuffer=null,_currentMaterialId=-1,_currentGeometryProgram='',_currentCamera=null,_currentArrayCamera=null,_currentViewport=new Vector4(),_currentScissor=new Vector4(),_currentScissorTest=null,// _usedTextureUnits=0,// _width=_canvas.width,_height=_canvas.height,_pixelRatio=1,_viewport=new Vector4(0,0,_width,_height),_scissor=new Vector4(0,0,_width,_height),_scissorTest=false,// frustum _frustum=new Frustum(),// clipping _clipping=new WebGLClipping(),_clippingEnabled=false,_localClippingEnabled=false,// camera matrices cache _projScreenMatrix=new Matrix4(),_vector3=new Vector3();function getTargetPixelRatio(){return _currentRenderTarget===null?_pixelRatio:1;}// initialize var _gl;try{var contextAttributes={alpha:_alpha,depth:_depth,stencil:_stencil,antialias:_antialias,premultipliedAlpha:_premultipliedAlpha,preserveDrawingBuffer:_preserveDrawingBuffer,powerPreference:_powerPreference};// event listeners must be registered before WebGL context is created, see #12753 _canvas.addEventListener('webglcontextlost',onContextLost,false);_canvas.addEventListener('webglcontextrestored',onContextRestore,false);_gl=_context||_canvas.getContext('webgl',contextAttributes)||_canvas.getContext('experimental-webgl',contextAttributes);if(_gl===null){if(_canvas.getContext('webgl')!==null){throw new Error('Error creating WebGL context with your selected attributes.');}else{throw new Error('Error creating WebGL context.');}}// Some experimental-webgl implementations do not have getShaderPrecisionFormat if(_gl.getShaderPrecisionFormat===undefined){_gl.getShaderPrecisionFormat=function(){return {'rangeMin':1,'rangeMax':1,'precision':1};};}}catch(error){console.error('THREE.WebGLRenderer: '+error.message);}var extensions,capabilities,state,info;var properties,textures,attributes,geometries,objects;var programCache,renderLists,renderStates;var background,morphtargets,bufferRenderer,indexedBufferRenderer;var spriteRenderer;var utils;function initGLContext(){extensions=new WebGLExtensions(_gl);extensions.get('WEBGL_depth_texture');extensions.get('OES_texture_float');extensions.get('OES_texture_float_linear');extensions.get('OES_texture_half_float');extensions.get('OES_texture_half_float_linear');extensions.get('OES_standard_derivatives');extensions.get('OES_element_index_uint');extensions.get('ANGLE_instanced_arrays');utils=new WebGLUtils(_gl,extensions);capabilities=new WebGLCapabilities(_gl,extensions,parameters);state=new WebGLState(_gl,extensions,utils);state.scissor(_currentScissor.copy(_scissor).multiplyScalar(_pixelRatio));state.viewport(_currentViewport.copy(_viewport).multiplyScalar(_pixelRatio));info=new WebGLInfo(_gl);properties=new WebGLProperties();textures=new WebGLTextures(_gl,extensions,state,properties,capabilities,utils,info);attributes=new WebGLAttributes(_gl);geometries=new WebGLGeometries(_gl,attributes,info);objects=new WebGLObjects(geometries,info);morphtargets=new WebGLMorphtargets(_gl);programCache=new WebGLPrograms(_this,extensions,capabilities);renderLists=new WebGLRenderLists();renderStates=new WebGLRenderStates();background=new WebGLBackground(_this,state,geometries,_premultipliedAlpha);bufferRenderer=new WebGLBufferRenderer(_gl,extensions,info);indexedBufferRenderer=new WebGLIndexedBufferRenderer(_gl,extensions,info);spriteRenderer=new WebGLSpriteRenderer(_this,_gl,state,textures,capabilities);info.programs=programCache.programs;_this.context=_gl;_this.capabilities=capabilities;_this.extensions=extensions;_this.properties=properties;_this.renderLists=renderLists;_this.state=state;_this.info=info;}initGLContext();// vr var vr=new WebVRManager(_this);this.vr=vr;// shadow map var shadowMap=new WebGLShadowMap(_this,objects,capabilities.maxTextureSize);this.shadowMap=shadowMap;// API this.getContext=function(){return _gl;};this.getContextAttributes=function(){return _gl.getContextAttributes();};this.forceContextLoss=function(){var extension=extensions.get('WEBGL_lose_context');if(extension)extension.loseContext();};this.forceContextRestore=function(){var extension=extensions.get('WEBGL_lose_context');if(extension)extension.restoreContext();};this.getPixelRatio=function(){return _pixelRatio;};this.setPixelRatio=function(value){if(value===undefined)return;_pixelRatio=value;this.setSize(_width,_height,false);};this.getSize=function(){return {width:_width,height:_height};};this.setSize=function(width,height,updateStyle){var device=vr.getDevice();if(device&&device.isPresenting){console.warn('THREE.WebGLRenderer: Can\'t change size while VR device is presenting.');return;}_width=width;_height=height;_canvas.width=width*_pixelRatio;_canvas.height=height*_pixelRatio;if(updateStyle!==false){_canvas.style.width=width+'px';_canvas.style.height=height+'px';}this.setViewport(0,0,width,height);};this.getDrawingBufferSize=function(){return {width:_width*_pixelRatio,height:_height*_pixelRatio};};this.setDrawingBufferSize=function(width,height,pixelRatio){_width=width;_height=height;_pixelRatio=pixelRatio;_canvas.width=width*pixelRatio;_canvas.height=height*pixelRatio;this.setViewport(0,0,width,height);};this.getCurrentViewport=function(){return _currentViewport;};this.setViewport=function(x,y,width,height){_viewport.set(x,_height-y-height,width,height);state.viewport(_currentViewport.copy(_viewport).multiplyScalar(_pixelRatio));};this.setScissor=function(x,y,width,height){_scissor.set(x,_height-y-height,width,height);state.scissor(_currentScissor.copy(_scissor).multiplyScalar(_pixelRatio));};this.setScissorTest=function(boolean){state.setScissorTest(_scissorTest=boolean);};// Clearing this.getClearColor=function(){return background.getClearColor();};this.setClearColor=function(){background.setClearColor.apply(background,arguments);};this.getClearAlpha=function(){return background.getClearAlpha();};this.setClearAlpha=function(){background.setClearAlpha.apply(background,arguments);};this.clear=function(color,depth,stencil){var bits=0;if(color===undefined||color)bits|=_gl.COLOR_BUFFER_BIT;if(depth===undefined||depth)bits|=_gl.DEPTH_BUFFER_BIT;if(stencil===undefined||stencil)bits|=_gl.STENCIL_BUFFER_BIT;_gl.clear(bits);};this.clearColor=function(){this.clear(true,false,false);};this.clearDepth=function(){this.clear(false,true,false);};this.clearStencil=function(){this.clear(false,false,true);};this.clearTarget=function(renderTarget,color,depth,stencil){this.setRenderTarget(renderTarget);this.clear(color,depth,stencil);};// this.dispose=function(){_canvas.removeEventListener('webglcontextlost',onContextLost,false);_canvas.removeEventListener('webglcontextrestored',onContextRestore,false);renderLists.dispose();renderStates.dispose();properties.dispose();objects.dispose();vr.dispose();stopAnimation();};// Events function onContextLost(event){event.preventDefault();console.log('THREE.WebGLRenderer: Context Lost.');_isContextLost=true;}function onContextRestore()/* event */{console.log('THREE.WebGLRenderer: Context Restored.');_isContextLost=false;initGLContext();}function onMaterialDispose(event){var material=event.target;material.removeEventListener('dispose',onMaterialDispose);deallocateMaterial(material);}// Buffer deallocation function deallocateMaterial(material){releaseMaterialProgramReference(material);properties.remove(material);}function releaseMaterialProgramReference(material){var programInfo=properties.get(material).program;material.program=undefined;if(programInfo!==undefined){programCache.releaseProgram(programInfo);}}// Buffer rendering function renderObjectImmediate(object,program,material){object.render(function(object){_this.renderBufferImmediate(object,program,material);});}this.renderBufferImmediate=function(object,program,material){state.initAttributes();var buffers=properties.get(object);if(object.hasPositions&&!buffers.position)buffers.position=_gl.createBuffer();if(object.hasNormals&&!buffers.normal)buffers.normal=_gl.createBuffer();if(object.hasUvs&&!buffers.uv)buffers.uv=_gl.createBuffer();if(object.hasColors&&!buffers.color)buffers.color=_gl.createBuffer();var programAttributes=program.getAttributes();if(object.hasPositions){_gl.bindBuffer(_gl.ARRAY_BUFFER,buffers.position);_gl.bufferData(_gl.ARRAY_BUFFER,object.positionArray,_gl.DYNAMIC_DRAW);state.enableAttribute(programAttributes.position);_gl.vertexAttribPointer(programAttributes.position,3,_gl.FLOAT,false,0,0);}if(object.hasNormals){_gl.bindBuffer(_gl.ARRAY_BUFFER,buffers.normal);if(!material.isMeshPhongMaterial&&!material.isMeshStandardMaterial&&!material.isMeshNormalMaterial&&material.flatShading===true){for(var i=0,l=object.count*3;i0){renderer.renderInstances(geometry,drawStart,drawCount);}}else{renderer.render(drawStart,drawCount);}};function setupVertexAttributes(material,program,geometry){if(geometry&&geometry.isInstancedBufferGeometry){if(extensions.get('ANGLE_instanced_arrays')===null){console.error('THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.');return;}}state.initAttributes();var geometryAttributes=geometry.attributes;var programAttributes=program.getAttributes();var materialDefaultAttributeValues=material.defaultAttributeValues;for(var name in programAttributes){var programAttribute=programAttributes[name];if(programAttribute>=0){var geometryAttribute=geometryAttributes[name];if(geometryAttribute!==undefined){var normalized=geometryAttribute.normalized;var size=geometryAttribute.itemSize;var attribute=attributes.get(geometryAttribute);// TODO Attribute may not be available on context restore if(attribute===undefined)continue;var buffer=attribute.buffer;var type=attribute.type;var bytesPerElement=attribute.bytesPerElement;if(geometryAttribute.isInterleavedBufferAttribute){var data=geometryAttribute.data;var stride=data.stride;var offset=geometryAttribute.offset;if(data&&data.isInstancedInterleavedBuffer){state.enableAttributeAndDivisor(programAttribute,data.meshPerAttribute);if(geometry.maxInstancedCount===undefined){geometry.maxInstancedCount=data.meshPerAttribute*data.count;}}else{state.enableAttribute(programAttribute);}_gl.bindBuffer(_gl.ARRAY_BUFFER,buffer);_gl.vertexAttribPointer(programAttribute,size,type,normalized,stride*bytesPerElement,offset*bytesPerElement);}else{if(geometryAttribute.isInstancedBufferAttribute){state.enableAttributeAndDivisor(programAttribute,geometryAttribute.meshPerAttribute);if(geometry.maxInstancedCount===undefined){geometry.maxInstancedCount=geometryAttribute.meshPerAttribute*geometryAttribute.count;}}else{state.enableAttribute(programAttribute);}_gl.bindBuffer(_gl.ARRAY_BUFFER,buffer);_gl.vertexAttribPointer(programAttribute,size,type,normalized,0,0);}}else if(materialDefaultAttributeValues!==undefined){var value=materialDefaultAttributeValues[name];if(value!==undefined){switch(value.length){case 2:_gl.vertexAttrib2fv(programAttribute,value);break;case 3:_gl.vertexAttrib3fv(programAttribute,value);break;case 4:_gl.vertexAttrib4fv(programAttribute,value);break;default:_gl.vertexAttrib1fv(programAttribute,value);}}}}}state.disableUnusedAttributes();}// Compile this.compile=function(scene,camera){currentRenderState=renderStates.get(scene,camera);currentRenderState.init();scene.traverse(function(object){if(object.isLight){currentRenderState.pushLight(object);if(object.castShadow){currentRenderState.pushShadow(object);}}});currentRenderState.setupLights(camera);scene.traverse(function(object){if(object.material){if(Array.isArray(object.material)){for(var i=0;i=0){material.numSupportedMorphTargets++;}}}if(material.morphNormals){material.numSupportedMorphNormals=0;for(var i=0;i<_this.maxMorphNormals;i++){if(programAttributes['morphNormal'+i]>=0){material.numSupportedMorphNormals++;}}}var uniforms=materialProperties.shader.uniforms;if(!material.isShaderMaterial&&!material.isRawShaderMaterial||material.clipping===true){materialProperties.numClippingPlanes=_clipping.numPlanes;materialProperties.numIntersection=_clipping.numIntersection;uniforms.clippingPlanes=_clipping.uniform;}materialProperties.fog=fog;// store the light setup it was created for materialProperties.lightsHash=lights.state.hash;if(material.lights){// wire up the material to this renderer's lighting state uniforms.ambientLightColor.value=lights.state.ambient;uniforms.directionalLights.value=lights.state.directional;uniforms.spotLights.value=lights.state.spot;uniforms.rectAreaLights.value=lights.state.rectArea;uniforms.pointLights.value=lights.state.point;uniforms.hemisphereLights.value=lights.state.hemi;uniforms.directionalShadowMap.value=lights.state.directionalShadowMap;uniforms.directionalShadowMatrix.value=lights.state.directionalShadowMatrix;uniforms.spotShadowMap.value=lights.state.spotShadowMap;uniforms.spotShadowMatrix.value=lights.state.spotShadowMatrix;uniforms.pointShadowMap.value=lights.state.pointShadowMap;uniforms.pointShadowMatrix.value=lights.state.pointShadowMatrix;// TODO (abelnation): add area lights shadow info to uniforms }var progUniforms=materialProperties.program.getUniforms(),uniformsList=WebGLUniforms.seqWithValue(progUniforms.seq,uniforms);materialProperties.uniformsList=uniformsList;}function setProgram(camera,fog,material,object){_usedTextureUnits=0;var materialProperties=properties.get(material);var lights=currentRenderState.state.lights;if(_clippingEnabled){if(_localClippingEnabled||camera!==_currentCamera){var useCache=camera===_currentCamera&&material.id===_currentMaterialId;// we might want to call this function with some ClippingGroup // object instead of the material, once it becomes feasible // (#8465, #8379) _clipping.setState(material.clippingPlanes,material.clipIntersection,material.clipShadows,camera,materialProperties,useCache);}}if(material.needsUpdate===false){if(materialProperties.program===undefined){material.needsUpdate=true;}else if(material.fog&&materialProperties.fog!==fog){material.needsUpdate=true;}else if(material.lights&&materialProperties.lightsHash!==lights.state.hash){material.needsUpdate=true;}else if(materialProperties.numClippingPlanes!==undefined&&(materialProperties.numClippingPlanes!==_clipping.numPlanes||materialProperties.numIntersection!==_clipping.numIntersection)){material.needsUpdate=true;}}if(material.needsUpdate){initMaterial(material,fog,object);material.needsUpdate=false;}var refreshProgram=false;var refreshMaterial=false;var refreshLights=false;var program=materialProperties.program,p_uniforms=program.getUniforms(),m_uniforms=materialProperties.shader.uniforms;if(state.useProgram(program.program)){refreshProgram=true;refreshMaterial=true;refreshLights=true;}if(material.id!==_currentMaterialId){_currentMaterialId=material.id;refreshMaterial=true;}if(refreshProgram||camera!==_currentCamera){p_uniforms.setValue(_gl,'projectionMatrix',camera.projectionMatrix);if(capabilities.logarithmicDepthBuffer){p_uniforms.setValue(_gl,'logDepthBufFC',2.0/(Math.log(camera.far+1.0)/Math.LN2));}// Avoid unneeded uniform updates per ArrayCamera's sub-camera if(_currentCamera!==(_currentArrayCamera||camera)){_currentCamera=_currentArrayCamera||camera;// lighting uniforms depend on the camera so enforce an update // now, in case this material supports lights - or later, when // the next material that does gets activated: refreshMaterial=true;// set to true on material change refreshLights=true;// remains set until update done }// load material specific uniforms // (shader material also gets them for the sake of genericity) if(material.isShaderMaterial||material.isMeshPhongMaterial||material.isMeshStandardMaterial||material.envMap){var uCamPos=p_uniforms.map.cameraPosition;if(uCamPos!==undefined){uCamPos.setValue(_gl,_vector3.setFromMatrixPosition(camera.matrixWorld));}}if(material.isMeshPhongMaterial||material.isMeshLambertMaterial||material.isMeshBasicMaterial||material.isMeshStandardMaterial||material.isShaderMaterial||material.skinning){p_uniforms.setValue(_gl,'viewMatrix',camera.matrixWorldInverse);}}// skinning uniforms must be set even if material didn't change // auto-setting of texture unit for bone texture must go before other textures // not sure why, but otherwise weird things happen if(material.skinning){p_uniforms.setOptional(_gl,object,'bindMatrix');p_uniforms.setOptional(_gl,object,'bindMatrixInverse');var skeleton=object.skeleton;if(skeleton){var bones=skeleton.bones;if(capabilities.floatVertexTextures){if(skeleton.boneTexture===undefined){// layout (1 matrix = 4 pixels) // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4) // with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8) // 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16) // 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32) // 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64) var size=Math.sqrt(bones.length*4);// 4 pixels needed for 1 matrix size=_Math.ceilPowerOfTwo(size);size=Math.max(size,4);var boneMatrices=new Float32Array(size*size*4);// 4 floats per RGBA pixel boneMatrices.set(skeleton.boneMatrices);// copy current values var boneTexture=new DataTexture(boneMatrices,size,size,RGBAFormat,FloatType);boneTexture.needsUpdate=true;skeleton.boneMatrices=boneMatrices;skeleton.boneTexture=boneTexture;skeleton.boneTextureSize=size;}p_uniforms.setValue(_gl,'boneTexture',skeleton.boneTexture);p_uniforms.setValue(_gl,'boneTextureSize',skeleton.boneTextureSize);}else{p_uniforms.setOptional(_gl,skeleton,'boneMatrices');}}}if(refreshMaterial){p_uniforms.setValue(_gl,'toneMappingExposure',_this.toneMappingExposure);p_uniforms.setValue(_gl,'toneMappingWhitePoint',_this.toneMappingWhitePoint);if(material.lights){// the current material requires lighting info // note: all lighting uniforms are always set correctly // they simply reference the renderer's state for their // values // // use the current material's .needsUpdate flags to set // the GL state when required markUniformsLightsNeedsUpdate(m_uniforms,refreshLights);}// refresh uniforms common to several materials if(fog&&material.fog){refreshUniformsFog(m_uniforms,fog);}if(material.isMeshBasicMaterial){refreshUniformsCommon(m_uniforms,material);}else if(material.isMeshLambertMaterial){refreshUniformsCommon(m_uniforms,material);refreshUniformsLambert(m_uniforms,material);}else if(material.isMeshPhongMaterial){refreshUniformsCommon(m_uniforms,material);if(material.isMeshToonMaterial){refreshUniformsToon(m_uniforms,material);}else{refreshUniformsPhong(m_uniforms,material);}}else if(material.isMeshStandardMaterial){refreshUniformsCommon(m_uniforms,material);if(material.isMeshPhysicalMaterial){refreshUniformsPhysical(m_uniforms,material);}else{refreshUniformsStandard(m_uniforms,material);}}else if(material.isMeshDepthMaterial){refreshUniformsCommon(m_uniforms,material);refreshUniformsDepth(m_uniforms,material);}else if(material.isMeshDistanceMaterial){refreshUniformsCommon(m_uniforms,material);refreshUniformsDistance(m_uniforms,material);}else if(material.isMeshNormalMaterial){refreshUniformsCommon(m_uniforms,material);refreshUniformsNormal(m_uniforms,material);}else if(material.isLineBasicMaterial){refreshUniformsLine(m_uniforms,material);if(material.isLineDashedMaterial){refreshUniformsDash(m_uniforms,material);}}else if(material.isPointsMaterial){refreshUniformsPoints(m_uniforms,material);}else if(material.isShadowMaterial){m_uniforms.color.value=material.color;m_uniforms.opacity.value=material.opacity;}// RectAreaLight Texture // TODO (mrdoob): Find a nicer implementation if(m_uniforms.ltc_1!==undefined)m_uniforms.ltc_1.value=UniformsLib.LTC_1;if(m_uniforms.ltc_2!==undefined)m_uniforms.ltc_2.value=UniformsLib.LTC_2;WebGLUniforms.upload(_gl,materialProperties.uniformsList,m_uniforms,_this);}if(material.isShaderMaterial&&material.uniformsNeedUpdate===true){WebGLUniforms.upload(_gl,materialProperties.uniformsList,m_uniforms,_this);material.uniformsNeedUpdate=false;}// common matrices p_uniforms.setValue(_gl,'modelViewMatrix',object.modelViewMatrix);p_uniforms.setValue(_gl,'normalMatrix',object.normalMatrix);p_uniforms.setValue(_gl,'modelMatrix',object.matrixWorld);return program;}// Uniforms (refresh uniforms objects) function refreshUniformsCommon(uniforms,material){uniforms.opacity.value=material.opacity;if(material.color){uniforms.diffuse.value=material.color;}if(material.emissive){uniforms.emissive.value.copy(material.emissive).multiplyScalar(material.emissiveIntensity);}if(material.map){uniforms.map.value=material.map;}if(material.alphaMap){uniforms.alphaMap.value=material.alphaMap;}if(material.specularMap){uniforms.specularMap.value=material.specularMap;}if(material.envMap){uniforms.envMap.value=material.envMap;// don't flip CubeTexture envMaps, flip everything else: // WebGLRenderTargetCube will be flipped for backwards compatibility // WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture // this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future uniforms.flipEnvMap.value=!(material.envMap&&material.envMap.isCubeTexture)?1:-1;uniforms.reflectivity.value=material.reflectivity;uniforms.refractionRatio.value=material.refractionRatio;uniforms.maxMipLevel.value=properties.get(material.envMap).__maxMipLevel;}if(material.lightMap){uniforms.lightMap.value=material.lightMap;uniforms.lightMapIntensity.value=material.lightMapIntensity;}if(material.aoMap){uniforms.aoMap.value=material.aoMap;uniforms.aoMapIntensity.value=material.aoMapIntensity;}// uv repeat and offset setting priorities // 1. color map // 2. specular map // 3. normal map // 4. bump map // 5. alpha map // 6. emissive map var uvScaleMap;if(material.map){uvScaleMap=material.map;}else if(material.specularMap){uvScaleMap=material.specularMap;}else if(material.displacementMap){uvScaleMap=material.displacementMap;}else if(material.normalMap){uvScaleMap=material.normalMap;}else if(material.bumpMap){uvScaleMap=material.bumpMap;}else if(material.roughnessMap){uvScaleMap=material.roughnessMap;}else if(material.metalnessMap){uvScaleMap=material.metalnessMap;}else if(material.alphaMap){uvScaleMap=material.alphaMap;}else if(material.emissiveMap){uvScaleMap=material.emissiveMap;}if(uvScaleMap!==undefined){// backwards compatibility if(uvScaleMap.isWebGLRenderTarget){uvScaleMap=uvScaleMap.texture;}if(uvScaleMap.matrixAutoUpdate===true){uvScaleMap.updateMatrix();}uniforms.uvTransform.value.copy(uvScaleMap.matrix);}}function refreshUniformsLine(uniforms,material){uniforms.diffuse.value=material.color;uniforms.opacity.value=material.opacity;}function refreshUniformsDash(uniforms,material){uniforms.dashSize.value=material.dashSize;uniforms.totalSize.value=material.dashSize+material.gapSize;uniforms.scale.value=material.scale;}function refreshUniformsPoints(uniforms,material){uniforms.diffuse.value=material.color;uniforms.opacity.value=material.opacity;uniforms.size.value=material.size*_pixelRatio;uniforms.scale.value=_height*0.5;uniforms.map.value=material.map;if(material.map!==null){if(material.map.matrixAutoUpdate===true){material.map.updateMatrix();}uniforms.uvTransform.value.copy(material.map.matrix);}}function refreshUniformsFog(uniforms,fog){uniforms.fogColor.value=fog.color;if(fog.isFog){uniforms.fogNear.value=fog.near;uniforms.fogFar.value=fog.far;}else if(fog.isFogExp2){uniforms.fogDensity.value=fog.density;}}function refreshUniformsLambert(uniforms,material){if(material.emissiveMap){uniforms.emissiveMap.value=material.emissiveMap;}}function refreshUniformsPhong(uniforms,material){uniforms.specular.value=material.specular;uniforms.shininess.value=Math.max(material.shininess,1e-4);// to prevent pow( 0.0, 0.0 ) if(material.emissiveMap){uniforms.emissiveMap.value=material.emissiveMap;}if(material.bumpMap){uniforms.bumpMap.value=material.bumpMap;uniforms.bumpScale.value=material.bumpScale;}if(material.normalMap){uniforms.normalMap.value=material.normalMap;uniforms.normalScale.value.copy(material.normalScale);}if(material.displacementMap){uniforms.displacementMap.value=material.displacementMap;uniforms.displacementScale.value=material.displacementScale;uniforms.displacementBias.value=material.displacementBias;}}function refreshUniformsToon(uniforms,material){refreshUniformsPhong(uniforms,material);if(material.gradientMap){uniforms.gradientMap.value=material.gradientMap;}}function refreshUniformsStandard(uniforms,material){uniforms.roughness.value=material.roughness;uniforms.metalness.value=material.metalness;if(material.roughnessMap){uniforms.roughnessMap.value=material.roughnessMap;}if(material.metalnessMap){uniforms.metalnessMap.value=material.metalnessMap;}if(material.emissiveMap){uniforms.emissiveMap.value=material.emissiveMap;}if(material.bumpMap){uniforms.bumpMap.value=material.bumpMap;uniforms.bumpScale.value=material.bumpScale;}if(material.normalMap){uniforms.normalMap.value=material.normalMap;uniforms.normalScale.value.copy(material.normalScale);}if(material.displacementMap){uniforms.displacementMap.value=material.displacementMap;uniforms.displacementScale.value=material.displacementScale;uniforms.displacementBias.value=material.displacementBias;}if(material.envMap){//uniforms.envMap.value = material.envMap; // part of uniforms common uniforms.envMapIntensity.value=material.envMapIntensity;}}function refreshUniformsPhysical(uniforms,material){uniforms.clearCoat.value=material.clearCoat;uniforms.clearCoatRoughness.value=material.clearCoatRoughness;refreshUniformsStandard(uniforms,material);}function refreshUniformsDepth(uniforms,material){if(material.displacementMap){uniforms.displacementMap.value=material.displacementMap;uniforms.displacementScale.value=material.displacementScale;uniforms.displacementBias.value=material.displacementBias;}}function refreshUniformsDistance(uniforms,material){if(material.displacementMap){uniforms.displacementMap.value=material.displacementMap;uniforms.displacementScale.value=material.displacementScale;uniforms.displacementBias.value=material.displacementBias;}uniforms.referencePosition.value.copy(material.referencePosition);uniforms.nearDistance.value=material.nearDistance;uniforms.farDistance.value=material.farDistance;}function refreshUniformsNormal(uniforms,material){if(material.bumpMap){uniforms.bumpMap.value=material.bumpMap;uniforms.bumpScale.value=material.bumpScale;}if(material.normalMap){uniforms.normalMap.value=material.normalMap;uniforms.normalScale.value.copy(material.normalScale);}if(material.displacementMap){uniforms.displacementMap.value=material.displacementMap;uniforms.displacementScale.value=material.displacementScale;uniforms.displacementBias.value=material.displacementBias;}}// If uniforms are marked as clean, they don't need to be loaded to the GPU. function markUniformsLightsNeedsUpdate(uniforms,value){uniforms.ambientLightColor.needsUpdate=value;uniforms.directionalLights.needsUpdate=value;uniforms.pointLights.needsUpdate=value;uniforms.spotLights.needsUpdate=value;uniforms.rectAreaLights.needsUpdate=value;uniforms.hemisphereLights.needsUpdate=value;}// Textures function allocTextureUnit(){var textureUnit=_usedTextureUnits;if(textureUnit>=capabilities.maxTextures){console.warn('THREE.WebGLRenderer: Trying to use '+textureUnit+' texture units while this GPU supports only '+capabilities.maxTextures);}_usedTextureUnits+=1;return textureUnit;}this.allocTextureUnit=allocTextureUnit;// this.setTexture2D = setTexture2D; this.setTexture2D=function(){var warned=false;// backwards compatibility: peel texture.texture return function setTexture2D(texture,slot){if(texture&&texture.isWebGLRenderTarget){if(!warned){console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead.");warned=true;}texture=texture.texture;}textures.setTexture2D(texture,slot);};}();this.setTexture=function(){var warned=false;return function setTexture(texture,slot){if(!warned){console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead.");warned=true;}textures.setTexture2D(texture,slot);};}();this.setTextureCube=function(){var warned=false;return function setTextureCube(texture,slot){// backwards compatibility: peel texture.texture if(texture&&texture.isWebGLRenderTargetCube){if(!warned){console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead.");warned=true;}texture=texture.texture;}// currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture // TODO: unify these code paths if(texture&&texture.isCubeTexture||Array.isArray(texture.image)&&texture.image.length===6){// CompressedTexture can have Array in image :/ // this function alone should take care of cube textures textures.setTextureCube(texture,slot);}else{// assumed: texture property of THREE.WebGLRenderTargetCube textures.setTextureCubeDynamic(texture,slot);}};}();this.getRenderTarget=function(){return _currentRenderTarget;};this.setRenderTarget=function(renderTarget){_currentRenderTarget=renderTarget;if(renderTarget&&properties.get(renderTarget).__webglFramebuffer===undefined){textures.setupRenderTarget(renderTarget);}var framebuffer=null;var isCube=false;if(renderTarget){var __webglFramebuffer=properties.get(renderTarget).__webglFramebuffer;if(renderTarget.isWebGLRenderTargetCube){framebuffer=__webglFramebuffer[renderTarget.activeCubeFace];isCube=true;}else{framebuffer=__webglFramebuffer;}_currentViewport.copy(renderTarget.viewport);_currentScissor.copy(renderTarget.scissor);_currentScissorTest=renderTarget.scissorTest;}else{_currentViewport.copy(_viewport).multiplyScalar(_pixelRatio);_currentScissor.copy(_scissor).multiplyScalar(_pixelRatio);_currentScissorTest=_scissorTest;}if(_currentFramebuffer!==framebuffer){_gl.bindFramebuffer(_gl.FRAMEBUFFER,framebuffer);_currentFramebuffer=framebuffer;}state.viewport(_currentViewport);state.scissor(_currentScissor);state.setScissorTest(_currentScissorTest);if(isCube){var textureProperties=properties.get(renderTarget.texture);_gl.framebufferTexture2D(_gl.FRAMEBUFFER,_gl.COLOR_ATTACHMENT0,_gl.TEXTURE_CUBE_MAP_POSITIVE_X+renderTarget.activeCubeFace,textureProperties.__webglTexture,renderTarget.activeMipMapLevel);}};this.readRenderTargetPixels=function(renderTarget,x,y,width,height,buffer){if(!(renderTarget&&renderTarget.isWebGLRenderTarget)){console.error('THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.');return;}var framebuffer=properties.get(renderTarget).__webglFramebuffer;if(framebuffer){var restore=false;if(framebuffer!==_currentFramebuffer){_gl.bindFramebuffer(_gl.FRAMEBUFFER,framebuffer);restore=true;}try{var texture=renderTarget.texture;var textureFormat=texture.format;var textureType=texture.type;if(textureFormat!==RGBAFormat&&utils.convert(textureFormat)!==_gl.getParameter(_gl.IMPLEMENTATION_COLOR_READ_FORMAT)){console.error('THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.');return;}if(textureType!==UnsignedByteType&&utils.convert(textureType)!==_gl.getParameter(_gl.IMPLEMENTATION_COLOR_READ_TYPE)&&// IE11, Edge and Chrome Mac < 52 (#9513) !(textureType===FloatType&&(extensions.get('OES_texture_float')||extensions.get('WEBGL_color_buffer_float')))&&// Chrome Mac >= 52 and Firefox !(textureType===HalfFloatType&&extensions.get('EXT_color_buffer_half_float'))){console.error('THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.');return;}if(_gl.checkFramebufferStatus(_gl.FRAMEBUFFER)===_gl.FRAMEBUFFER_COMPLETE){// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604) if(x>=0&&x<=renderTarget.width-width&&y>=0&&y<=renderTarget.height-height){_gl.readPixels(x,y,width,height,utils.convert(textureFormat),utils.convert(textureType),buffer);}}else{console.error('THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.');}}finally{if(restore){_gl.bindFramebuffer(_gl.FRAMEBUFFER,_currentFramebuffer);}}}};this.copyFramebufferToTexture=function(position,texture,level){var width=texture.image.width;var height=texture.image.height;var glFormat=utils.convert(texture.format);this.setTexture2D(texture,0);_gl.copyTexImage2D(_gl.TEXTURE_2D,level||0,glFormat,position.x,position.y,width,height,0);};this.copyTextureToTexture=function(position,srcTexture,dstTexture,level){var width=srcTexture.image.width;var height=srcTexture.image.height;var glFormat=utils.convert(dstTexture.format);var glType=utils.convert(dstTexture.type);var pixels=srcTexture.isDataTexture?srcTexture.image.data:srcTexture.image;this.setTexture2D(dstTexture,0);_gl.texSubImage2D(_gl.TEXTURE_2D,level||0,position.x,position.y,width,height,glFormat,glType,pixels);};}/** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ */function FogExp2(color,density){this.name='';this.color=new Color(color);this.density=density!==undefined?density:0.00025;}FogExp2.prototype.isFogExp2=true;FogExp2.prototype.clone=function(){return new FogExp2(this.color.getHex(),this.density);};FogExp2.prototype.toJSON=function()/* meta */{return {type:'FogExp2',color:this.color.getHex(),density:this.density};};/** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ */function Fog(color,near,far){this.name='';this.color=new Color(color);this.near=near!==undefined?near:1;this.far=far!==undefined?far:1000;}Fog.prototype.isFog=true;Fog.prototype.clone=function(){return new Fog(this.color.getHex(),this.near,this.far);};Fog.prototype.toJSON=function()/* meta */{return {type:'Fog',color:this.color.getHex(),near:this.near,far:this.far};};/** * @author mrdoob / http://mrdoob.com/ */function Scene(){Object3D.call(this);this.type='Scene';this.background=null;this.fog=null;this.overrideMaterial=null;this.autoUpdate=true;// checked by the renderer }Scene.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:Scene,copy:function(source,recursive){Object3D.prototype.copy.call(this,source,recursive);if(source.background!==null)this.background=source.background.clone();if(source.fog!==null)this.fog=source.fog.clone();if(source.overrideMaterial!==null)this.overrideMaterial=source.overrideMaterial.clone();this.autoUpdate=source.autoUpdate;this.matrixAutoUpdate=source.matrixAutoUpdate;return this;},toJSON:function(meta){var data=Object3D.prototype.toJSON.call(this,meta);if(this.background!==null)data.object.background=this.background.toJSON(meta);if(this.fog!==null)data.object.fog=this.fog.toJSON();return data;}});/** * @author alteredq / http://alteredqualia.com/ * * parameters = { * color: , * opacity: , * map: new THREE.Texture( ), * * uvOffset: new THREE.Vector2(), * uvScale: new THREE.Vector2() * } */function SpriteMaterial(parameters){Material.call(this);this.type='SpriteMaterial';this.color=new Color(0xffffff);this.map=null;this.rotation=0;this.fog=false;this.lights=false;this.setValues(parameters);}SpriteMaterial.prototype=Object.create(Material.prototype);SpriteMaterial.prototype.constructor=SpriteMaterial;SpriteMaterial.prototype.isSpriteMaterial=true;SpriteMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.color.copy(source.color);this.map=source.map;this.rotation=source.rotation;return this;};/** * @author mikael emtinger / http://gomo.se/ * @author alteredq / http://alteredqualia.com/ */function Sprite(material){Object3D.call(this);this.type='Sprite';this.material=material!==undefined?material:new SpriteMaterial();this.center=new Vector2(0.5,0.5);}Sprite.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:Sprite,isSprite:true,raycast:function(){var intersectPoint=new Vector3();var worldPosition=new Vector3();var worldScale=new Vector3();return function raycast(raycaster,intersects){worldPosition.setFromMatrixPosition(this.matrixWorld);raycaster.ray.closestPointToPoint(worldPosition,intersectPoint);worldScale.setFromMatrixScale(this.matrixWorld);var guessSizeSq=worldScale.x*worldScale.y/4;if(worldPosition.distanceToSquared(intersectPoint)>guessSizeSq)return;var distance=raycaster.ray.origin.distanceTo(intersectPoint);if(distanceraycaster.far)return;intersects.push({distance:distance,point:intersectPoint.clone(),face:null,object:this});};}(),clone:function(){return new this.constructor(this.material).copy(this);},copy:function(source){Object3D.prototype.copy.call(this,source);if(source.center!==undefined)this.center.copy(source.center);return this;}});/** * @author mikael emtinger / http://gomo.se/ * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ */function LOD(){Object3D.call(this);this.type='LOD';Object.defineProperties(this,{levels:{enumerable:true,value:[]}});}LOD.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:LOD,copy:function(source){Object3D.prototype.copy.call(this,source,false);var levels=source.levels;for(var i=0,l=levels.length;i1){v1.setFromMatrixPosition(camera.matrixWorld);v2.setFromMatrixPosition(this.matrixWorld);var distance=v1.distanceTo(v2);levels[0].object.visible=true;for(var i=1,l=levels.length;i=levels[i].distance){levels[i-1].object.visible=false;levels[i].object.visible=true;}else{break;}}for(;i, * opacity: , * * linewidth: , * linecap: "round", * linejoin: "round" * } */function LineBasicMaterial(parameters){Material.call(this);this.type='LineBasicMaterial';this.color=new Color(0xffffff);this.linewidth=1;this.linecap='round';this.linejoin='round';this.lights=false;this.setValues(parameters);}LineBasicMaterial.prototype=Object.create(Material.prototype);LineBasicMaterial.prototype.constructor=LineBasicMaterial;LineBasicMaterial.prototype.isLineBasicMaterial=true;LineBasicMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.color.copy(source.color);this.linewidth=source.linewidth;this.linecap=source.linecap;this.linejoin=source.linejoin;return this;};/** * @author mrdoob / http://mrdoob.com/ */function Line(geometry,material,mode){if(mode===1){console.warn('THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.');return new LineSegments(geometry,material);}Object3D.call(this);this.type='Line';this.geometry=geometry!==undefined?geometry:new BufferGeometry();this.material=material!==undefined?material:new LineBasicMaterial({color:Math.random()*0xffffff});}Line.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:Line,isLine:true,computeLineDistances:function(){var start=new Vector3();var end=new Vector3();return function computeLineDistances(){var geometry=this.geometry;if(geometry.isBufferGeometry){// we assume non-indexed geometry if(geometry.index===null){var positionAttribute=geometry.attributes.position;var lineDistances=[0];for(var i=1,l=positionAttribute.count;iprecisionSq)continue;interRay.applyMatrix4(this.matrixWorld);//Move back to world space for distance calculation var distance=raycaster.ray.origin.distanceTo(interRay);if(distanceraycaster.far)continue;intersects.push({distance:distance,// What do we want? intersection point on the ray or on the segment?? // point: raycaster.ray.at( distance ), point:interSegment.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this});}}else{for(var i=0,l=positions.length/3-1;iprecisionSq)continue;interRay.applyMatrix4(this.matrixWorld);//Move back to world space for distance calculation var distance=raycaster.ray.origin.distanceTo(interRay);if(distanceraycaster.far)continue;intersects.push({distance:distance,// What do we want? intersection point on the ray or on the segment?? // point: raycaster.ray.at( distance ), point:interSegment.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this});}}}else if(geometry.isGeometry){var vertices=geometry.vertices;var nbVertices=vertices.length;for(var i=0;iprecisionSq)continue;interRay.applyMatrix4(this.matrixWorld);//Move back to world space for distance calculation var distance=raycaster.ray.origin.distanceTo(interRay);if(distanceraycaster.far)continue;intersects.push({distance:distance,// What do we want? intersection point on the ray or on the segment?? // point: raycaster.ray.at( distance ), point:interSegment.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this});}}};}(),clone:function(){return new this.constructor(this.geometry,this.material).copy(this);}});/** * @author mrdoob / http://mrdoob.com/ */function LineSegments(geometry,material){Line.call(this,geometry,material);this.type='LineSegments';}LineSegments.prototype=Object.assign(Object.create(Line.prototype),{constructor:LineSegments,isLineSegments:true,computeLineDistances:function(){var start=new Vector3();var end=new Vector3();return function computeLineDistances(){var geometry=this.geometry;if(geometry.isBufferGeometry){// we assume non-indexed geometry if(geometry.index===null){var positionAttribute=geometry.attributes.position;var lineDistances=[];for(var i=0,l=positionAttribute.count;i, * opacity: , * map: new THREE.Texture( ), * * size: , * sizeAttenuation: * } */function PointsMaterial(parameters){Material.call(this);this.type='PointsMaterial';this.color=new Color(0xffffff);this.map=null;this.size=1;this.sizeAttenuation=true;this.lights=false;this.setValues(parameters);}PointsMaterial.prototype=Object.create(Material.prototype);PointsMaterial.prototype.constructor=PointsMaterial;PointsMaterial.prototype.isPointsMaterial=true;PointsMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.color.copy(source.color);this.map=source.map;this.size=source.size;this.sizeAttenuation=source.sizeAttenuation;return this;};/** * @author alteredq / http://alteredqualia.com/ */function Points(geometry,material){Object3D.call(this);this.type='Points';this.geometry=geometry!==undefined?geometry:new BufferGeometry();this.material=material!==undefined?material:new PointsMaterial({color:Math.random()*0xffffff});}Points.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:Points,isPoints:true,raycast:function(){var inverseMatrix=new Matrix4();var ray=new Ray();var sphere=new Sphere();return function raycast(raycaster,intersects){var object=this;var geometry=this.geometry;var matrixWorld=this.matrixWorld;var threshold=raycaster.params.Points.threshold;// Checking boundingSphere distance to ray if(geometry.boundingSphere===null)geometry.computeBoundingSphere();sphere.copy(geometry.boundingSphere);sphere.applyMatrix4(matrixWorld);sphere.radius+=threshold;if(raycaster.ray.intersectsSphere(sphere)===false)return;// inverseMatrix.getInverse(matrixWorld);ray.copy(raycaster.ray).applyMatrix4(inverseMatrix);var localThreshold=threshold/((this.scale.x+this.scale.y+this.scale.z)/3);var localThresholdSq=localThreshold*localThreshold;var position=new Vector3();var intersectPoint=new Vector3();function testPoint(point,index){var rayPointDistanceSq=ray.distanceSqToPoint(point);if(rayPointDistanceSqraycaster.far)return;intersects.push({distance:distance,distanceToRay:Math.sqrt(rayPointDistanceSq),point:intersectPoint.clone(),index:index,face:null,object:object});}}if(geometry.isBufferGeometry){var index=geometry.index;var attributes=geometry.attributes;var positions=attributes.position.array;if(index!==null){var indices=index.array;for(var i=0,il=indices.length;i=video.HAVE_CURRENT_DATA){this.needsUpdate=true;}}});/** * @author alteredq / http://alteredqualia.com/ */function CompressedTexture(mipmaps,width,height,format,type,mapping,wrapS,wrapT,magFilter,minFilter,anisotropy,encoding){Texture.call(this,null,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy,encoding);this.image={width:width,height:height};this.mipmaps=mipmaps;// no flipping for cube textures // (also flipping doesn't work for compressed textures ) this.flipY=false;// can't generate mipmaps for compressed textures // mips must be embedded in DDS files this.generateMipmaps=false;}CompressedTexture.prototype=Object.create(Texture.prototype);CompressedTexture.prototype.constructor=CompressedTexture;CompressedTexture.prototype.isCompressedTexture=true;/** * @author Matt DesLauriers / @mattdesl * @author atix / arthursilber.de */function DepthTexture(width,height,type,mapping,wrapS,wrapT,magFilter,minFilter,anisotropy,format){format=format!==undefined?format:DepthFormat;if(format!==DepthFormat&&format!==DepthStencilFormat){throw new Error('DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat');}if(type===undefined&&format===DepthFormat)type=UnsignedShortType;if(type===undefined&&format===DepthStencilFormat)type=UnsignedInt248Type;Texture.call(this,null,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy);this.image={width:width,height:height};this.magFilter=magFilter!==undefined?magFilter:NearestFilter;this.minFilter=minFilter!==undefined?minFilter:NearestFilter;this.flipY=false;this.generateMipmaps=false;}DepthTexture.prototype=Object.create(Texture.prototype);DepthTexture.prototype.constructor=DepthTexture;DepthTexture.prototype.isDepthTexture=true;/** * @author mrdoob / http://mrdoob.com/ * @author Mugen87 / https://github.com/Mugen87 */function WireframeGeometry(geometry){BufferGeometry.call(this);this.type='WireframeGeometry';// buffer var vertices=[];// helper variables var i,j,l,o,ol;var edge=[0,0],edges={},e,edge1,edge2;var key,keys=['a','b','c'];var vertex;// different logic for Geometry and BufferGeometry if(geometry&&geometry.isGeometry){// create a data structure that contains all edges without duplicates var faces=geometry.faces;for(i=0,l=faces.length;i=0){func(u-EPS,v,p1);pu.subVectors(p0,p1);}else{func(u+EPS,v,p1);pu.subVectors(p1,p0);}if(v-EPS>=0){func(u,v-EPS,p1);pv.subVectors(p0,p1);}else{func(u,v+EPS,p1);pv.subVectors(p1,p0);}// cross product of tangent vectors returns surface normal normal.crossVectors(pu,pv).normalize();normals.push(normal.x,normal.y,normal.z);// uv uvs.push(u,v);}}// generate indices for(i=0;i0.9&&min<0.1){if(x0<0.2)uvBuffer[i+0]+=1;if(x1<0.2)uvBuffer[i+2]+=1;if(x2<0.2)uvBuffer[i+4]+=1;}}}function pushVertex(vertex){vertexBuffer.push(vertex.x,vertex.y,vertex.z);}function getVertexByIndex(index,vertex){var stride=index*3;vertex.x=vertices[stride+0];vertex.y=vertices[stride+1];vertex.z=vertices[stride+2];}function correctUVs(){var a=new Vector3();var b=new Vector3();var c=new Vector3();var centroid=new Vector3();var uvA=new Vector2();var uvB=new Vector2();var uvC=new Vector2();for(var i=0,j=0;i80*dim){minX=maxX=data[0];minY=maxY=data[1];for(var i=dim;imaxX)maxX=x;if(y>maxY)maxY=y;}// minX, minY and invSize are later used to transform coords into integers for z-order calculation invSize=Math.max(maxX-minX,maxY-minY);invSize=invSize!==0?1/invSize:0;}earcutLinked(outerNode,triangles,dim,minX,minY,invSize);return triangles;}};// create a circular doubly linked list from polygon points in the specified winding order function linkedList(data,start,end,dim,clockwise){var i,last;if(clockwise===signedArea(data,start,end,dim)>0){for(i=start;i=start;i-=dim)last=insertNode(i,data[i],data[i+1],last);}if(last&&equals(last,last.next)){removeNode(last);last=last.next;}return last;}// eliminate colinear or duplicate points function filterPoints(start,end){if(!start)return start;if(!end)end=start;var p=start,again;do{again=false;if(!p.steiner&&(equals(p,p.next)||area(p.prev,p,p.next)===0)){removeNode(p);p=end=p.prev;if(p===p.next)break;again=true;}else{p=p.next;}}while(again||p!==end);return end;}// main ear slicing loop which triangulates a polygon (given as a linked list) function earcutLinked(ear,triangles,dim,minX,minY,invSize,pass){if(!ear)return;// interlink polygon nodes in z-order if(!pass&&invSize)indexCurve(ear,minX,minY,invSize);var stop=ear,prev,next;// iterate through ears, slicing them one by one while(ear.prev!==ear.next){prev=ear.prev;next=ear.next;if(invSize?isEarHashed(ear,minX,minY,invSize):isEar(ear)){// cut off the triangle triangles.push(prev.i/dim);triangles.push(ear.i/dim);triangles.push(next.i/dim);removeNode(ear);// skipping the next vertice leads to less sliver triangles ear=next.next;stop=next.next;continue;}ear=next;// if we looped through the whole remaining polygon and can't find any more ears if(ear===stop){// try filtering points and slicing again if(!pass){earcutLinked(filterPoints(ear),triangles,dim,minX,minY,invSize,1);// if this didn't work, try curing all small self-intersections locally }else if(pass===1){ear=cureLocalIntersections(ear,triangles,dim);earcutLinked(ear,triangles,dim,minX,minY,invSize,2);// as a last resort, try splitting the remaining polygon into two }else if(pass===2){splitEarcut(ear,triangles,dim,minX,minY,invSize);}break;}}}// check whether a polygon node forms a valid ear with adjacent nodes function isEar(ear){var a=ear.prev,b=ear,c=ear.next;if(area(a,b,c)>=0)return false;// reflex, can't be an ear // now make sure we don't have other points inside the potential ear var p=ear.next.next;while(p!==ear.prev){if(pointInTriangle(a.x,a.y,b.x,b.y,c.x,c.y,p.x,p.y)&&area(p.prev,p,p.next)>=0){return false;}p=p.next;}return true;}function isEarHashed(ear,minX,minY,invSize){var a=ear.prev,b=ear,c=ear.next;if(area(a,b,c)>=0)return false;// reflex, can't be an ear // triangle bbox; min & max are calculated like this for speed var minTX=a.xb.x?a.x>c.x?a.x:c.x:b.x>c.x?b.x:c.x,maxTY=a.y>b.y?a.y>c.y?a.y:c.y:b.y>c.y?b.y:c.y;// z-order range for the current triangle bbox; var minZ=zOrder(minTX,minTY,minX,minY,invSize),maxZ=zOrder(maxTX,maxTY,minX,minY,invSize);// first look for points inside the triangle in increasing z-order var p=ear.nextZ;while(p&&p.z<=maxZ){if(p!==ear.prev&&p!==ear.next&&pointInTriangle(a.x,a.y,b.x,b.y,c.x,c.y,p.x,p.y)&&area(p.prev,p,p.next)>=0)return false;p=p.nextZ;}// then look for points in decreasing z-order p=ear.prevZ;while(p&&p.z>=minZ){if(p!==ear.prev&&p!==ear.next&&pointInTriangle(a.x,a.y,b.x,b.y,c.x,c.y,p.x,p.y)&&area(p.prev,p,p.next)>=0)return false;p=p.prevZ;}return true;}// go through all polygon nodes and cure small local self-intersections function cureLocalIntersections(start,triangles,dim){var p=start;do{var a=p.prev,b=p.next.next;if(!equals(a,b)&&intersects(a,p,p.next,b)&&locallyInside(a,b)&&locallyInside(b,a)){triangles.push(a.i/dim);triangles.push(p.i/dim);triangles.push(b.i/dim);// remove two nodes involved removeNode(p);removeNode(p.next);p=start=b;}p=p.next;}while(p!==start);return p;}// try splitting polygon into two and triangulate them independently function splitEarcut(start,triangles,dim,minX,minY,invSize){// look for a valid diagonal that divides the polygon into two var a=start;do{var b=a.next.next;while(b!==a.prev){if(a.i!==b.i&&isValidDiagonal(a,b)){// split the polygon in two by the diagonal var c=splitPolygon(a,b);// filter colinear points around the cuts a=filterPoints(a,a.next);c=filterPoints(c,c.next);// run earcut on each half earcutLinked(a,triangles,dim,minX,minY,invSize);earcutLinked(c,triangles,dim,minX,minY,invSize);return;}b=b.next;}a=a.next;}while(a!==start);}// link every hole into the outer loop, producing a single-ring polygon without holes function eliminateHoles(data,holeIndices,outerNode,dim){var queue=[],i,len,start,end,list;for(i=0,len=holeIndices.length;i=p.next.y&&p.next.y!==p.y){var x=p.x+(hy-p.y)*(p.next.x-p.x)/(p.next.y-p.y);if(x<=hx&&x>qx){qx=x;if(x===hx){if(hy===p.y)return p;if(hy===p.next.y)return p.next;}m=p.x=p.x&&p.x>=mx&&hx!==p.x&&pointInTriangle(hym.x)&&locallyInside(p,hole)){m=p;tanMin=tan;}}p=p.next;}return m;}// interlink polygon nodes in z-order function indexCurve(start,minX,minY,invSize){var p=start;do{if(p.z===null)p.z=zOrder(p.x,p.y,minX,minY,invSize);p.prevZ=p.prev;p.nextZ=p.next;p=p.next;}while(p!==start);p.prevZ.nextZ=null;p.prevZ=null;sortLinked(p);}// Simon Tatham's linked list merge sort algorithm // http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html function sortLinked(list){var i,p,q,e,tail,numMerges,pSize,qSize,inSize=1;do{p=list;list=null;tail=null;numMerges=0;while(p){numMerges++;q=p;pSize=0;for(i=0;i0||qSize>0&&q){if(pSize!==0&&(qSize===0||!q||p.z<=q.z)){e=p;p=p.nextZ;pSize--;}else{e=q;q=q.nextZ;qSize--;}if(tail)tail.nextZ=e;else list=e;e.prevZ=tail;tail=e;}p=q;}tail.nextZ=null;inSize*=2;}while(numMerges>1);return list;}// z-order of a point given coords and inverse of the longer side of data bbox function zOrder(x,y,minX,minY,invSize){// coords are transformed into non-negative 15-bit integer range x=32767*(x-minX)*invSize;y=32767*(y-minY)*invSize;x=(x|x<<8)&0x00FF00FF;x=(x|x<<4)&0x0F0F0F0F;x=(x|x<<2)&0x33333333;x=(x|x<<1)&0x55555555;y=(y|y<<8)&0x00FF00FF;y=(y|y<<4)&0x0F0F0F0F;y=(y|y<<2)&0x33333333;y=(y|y<<1)&0x55555555;return x|y<<1;}// find the leftmost node of a polygon ring function getLeftmost(start){var p=start,leftmost=start;do{if(p.x=0&&(ax-px)*(by-py)-(bx-px)*(ay-py)>=0&&(bx-px)*(cy-py)-(cx-px)*(by-py)>=0;}// check if a diagonal between two polygon nodes is valid (lies in polygon interior) function isValidDiagonal(a,b){return a.next.i!==b.i&&a.prev.i!==b.i&&!intersectsPolygon(a,b)&&locallyInside(a,b)&&locallyInside(b,a)&&middleInside(a,b);}// signed area of a triangle function area(p,q,r){return (q.y-p.y)*(r.x-q.x)-(q.x-p.x)*(r.y-q.y);}// check if two points are equal function equals(p1,p2){return p1.x===p2.x&&p1.y===p2.y;}// check if two segments intersect function intersects(p1,q1,p2,q2){if(equals(p1,q1)&&equals(p2,q2)||equals(p1,q2)&&equals(p2,q1))return true;return area(p1,q1,p2)>0!==area(p1,q1,q2)>0&&area(p2,q2,p1)>0!==area(p2,q2,q1)>0;}// check if a polygon diagonal intersects any polygon segments function intersectsPolygon(a,b){var p=a;do{if(p.i!==a.i&&p.next.i!==a.i&&p.i!==b.i&&p.next.i!==b.i&&intersects(p,p.next,a,b)){return true;}p=p.next;}while(p!==a);return false;}// check if a polygon diagonal is locally inside the polygon function locallyInside(a,b){return area(a.prev,a,a.next)<0?area(a,b,a.next)>=0&&area(a,a.prev,b)>=0:area(a,b,a.prev)<0||area(a,a.next,b)<0;}// check if the middle point of a polygon diagonal is inside the polygon function middleInside(a,b){var p=a,inside=false,px=(a.x+b.x)/2,py=(a.y+b.y)/2;do{if(p.y>py!==p.next.y>py&&p.next.y!==p.y&&px<(p.next.x-p.x)*(py-p.y)/(p.next.y-p.y)+p.x){inside=!inside;}p=p.next;}while(p!==a);return inside;}// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two; // if one belongs to the outer ring and another to a hole, it merges it into a single ring function splitPolygon(a,b){var a2=new Node(a.i,a.x,a.y),b2=new Node(b.i,b.x,b.y),an=a.next,bp=b.prev;a.next=b;b.prev=a;a2.next=an;an.prev=a2;b2.next=a2;a2.prev=b2;bp.next=b2;b2.prev=bp;return b2;}// create a node and optionally link it with previous one (in a circular doubly linked list) function insertNode(i,x,y,last){var p=new Node(i,x,y);if(!last){p.prev=p;p.next=p;}else{p.next=last.next;p.prev=last;last.next.prev=p;last.next=p;}return p;}function removeNode(p){p.next.prev=p.prev;p.prev.next=p.next;if(p.prevZ)p.prevZ.nextZ=p.nextZ;if(p.nextZ)p.nextZ.prevZ=p.prevZ;}function Node(i,x,y){// vertice index in coordinates array this.i=i;// vertex coordinates this.x=x;this.y=y;// previous and next vertice nodes in a polygon ring this.prev=null;this.next=null;// z-order curve value this.z=null;// previous and next nodes in z-order this.prevZ=null;this.nextZ=null;// indicates whether this is a steiner point this.steiner=false;}function signedArea(data,start,end,dim){var sum=0;for(var i=start,j=end-dim;i2&&points[l-1].equals(points[0])){points.pop();}}function addContour(vertices,contour){for(var i=0;i, // number of points on the curves * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too * amount: , // Depth to extrude the shape * * bevelEnabled: , // turn on bevel * bevelThickness: , // how deep into the original shape bevel goes * bevelSize: , // how far from shape outline is bevel * bevelSegments: , // number of bevel layers * * extrudePath: // curve to extrude shape along * * UVGenerator: // object that provides UV generator functions * * } */ // ExtrudeGeometry function ExtrudeGeometry(shapes,options){Geometry.call(this);this.type='ExtrudeGeometry';this.parameters={shapes:shapes,options:options};this.fromBufferGeometry(new ExtrudeBufferGeometry(shapes,options));this.mergeVertices();}ExtrudeGeometry.prototype=Object.create(Geometry.prototype);ExtrudeGeometry.prototype.constructor=ExtrudeGeometry;// ExtrudeBufferGeometry function ExtrudeBufferGeometry(shapes,options){BufferGeometry.call(this);this.type='ExtrudeBufferGeometry';this.parameters={shapes:shapes,options:options};shapes=Array.isArray(shapes)?shapes:[shapes];var scope=this;var verticesArray=[];var uvArray=[];for(var i=0,l=shapes.length;iNumber.EPSILON){// not collinear // length of vectors for normalizing var v_prev_len=Math.sqrt(v_prev_lensq);var v_next_len=Math.sqrt(v_next_x*v_next_x+v_next_y*v_next_y);// shift adjacent points by unit vectors to the left var ptPrevShift_x=inPrev.x-v_prev_y/v_prev_len;var ptPrevShift_y=inPrev.y+v_prev_x/v_prev_len;var ptNextShift_x=inNext.x-v_next_y/v_next_len;var ptNextShift_y=inNext.y+v_next_x/v_next_len;// scaling factor for v_prev to intersection point var sf=((ptNextShift_x-ptPrevShift_x)*v_next_y-(ptNextShift_y-ptPrevShift_y)*v_next_x)/(v_prev_x*v_next_y-v_prev_y*v_next_x);// vector from inPt to intersection point v_trans_x=ptPrevShift_x+v_prev_x*sf-inPt.x;v_trans_y=ptPrevShift_y+v_prev_y*sf-inPt.y;// Don't normalize!, otherwise sharp corners become ugly // but prevent crazy spikes var v_trans_lensq=v_trans_x*v_trans_x+v_trans_y*v_trans_y;if(v_trans_lensq<=2){return new Vector2(v_trans_x,v_trans_y);}else{shrink_by=Math.sqrt(v_trans_lensq/2);}}else{// handle special case of collinear edges var direction_eq=false;// assumes: opposite if(v_prev_x>Number.EPSILON){if(v_next_x>Number.EPSILON){direction_eq=true;}}else{if(v_prev_x<-Number.EPSILON){if(v_next_x<-Number.EPSILON){direction_eq=true;}}else{if(Math.sign(v_prev_y)===Math.sign(v_next_y)){direction_eq=true;}}}if(direction_eq){// console.log("Warning: lines are a straight sequence"); v_trans_x=-v_prev_y;v_trans_y=v_prev_x;shrink_by=Math.sqrt(v_prev_lensq);}else{// console.log("Warning: lines are a straight spike"); v_trans_x=v_prev_x;v_trans_y=v_prev_y;shrink_by=Math.sqrt(v_prev_lensq/2);}}return new Vector2(v_trans_x/shrink_by,v_trans_y/shrink_by);}var contourMovements=[];for(var i=0,il=contour.length,j=il-1,k=i+1;i 0; b -- ) { t=b/bevelSegments;z=bevelThickness*Math.cos(t*Math.PI/2);bs=bevelSize*Math.sin(t*Math.PI/2);// contract shape for(i=0,il=contour.length;i=0;b--){t=b/bevelSegments;z=bevelThickness*Math.cos(t*Math.PI/2);bs=bevelSize*Math.sin(t*Math.PI/2);// contract shape for(i=0,il=contour.length;i=0){j=i;k=i-1;if(k<0)k=contour.length-1;//console.log('b', i,j, i-1, k,vertices.length); var s=0,sl=steps+bevelSegments*2;for(s=0;s, // font * * size: , // size of the text * height: , // thickness to extrude text * curveSegments: , // number of points on the curves * * bevelEnabled: , // turn on bevel * bevelThickness: , // how deep into text bevel goes * bevelSize: // how far from text outline is bevel * } */ // TextGeometry function TextGeometry(text,parameters){Geometry.call(this);this.type='TextGeometry';this.parameters={text:text,parameters:parameters};this.fromBufferGeometry(new TextBufferGeometry(text,parameters));this.mergeVertices();}TextGeometry.prototype=Object.create(Geometry.prototype);TextGeometry.prototype.constructor=TextGeometry;// TextBufferGeometry function TextBufferGeometry(text,parameters){parameters=parameters||{};var font=parameters.font;if(!(font&&font.isFont)){console.error('THREE.TextGeometry: font parameter is not an instance of THREE.Font.');return new Geometry();}var shapes=font.generateShapes(text,parameters.size,parameters.curveSegments);// translate parameters to ExtrudeGeometry API parameters.amount=parameters.height!==undefined?parameters.height:50;// defaults if(parameters.bevelThickness===undefined)parameters.bevelThickness=10;if(parameters.bevelSize===undefined)parameters.bevelSize=8;if(parameters.bevelEnabled===undefined)parameters.bevelEnabled=false;ExtrudeBufferGeometry.call(this,shapes,parameters);this.type='TextBufferGeometry';}TextBufferGeometry.prototype=Object.create(ExtrudeBufferGeometry.prototype);TextBufferGeometry.prototype.constructor=TextBufferGeometry;/** * @author mrdoob / http://mrdoob.com/ * @author benaadams / https://twitter.com/ben_a_adams * @author Mugen87 / https://github.com/Mugen87 */ // SphereGeometry function SphereGeometry(radius,widthSegments,heightSegments,phiStart,phiLength,thetaStart,thetaLength){Geometry.call(this);this.type='SphereGeometry';this.parameters={radius:radius,widthSegments:widthSegments,heightSegments:heightSegments,phiStart:phiStart,phiLength:phiLength,thetaStart:thetaStart,thetaLength:thetaLength};this.fromBufferGeometry(new SphereBufferGeometry(radius,widthSegments,heightSegments,phiStart,phiLength,thetaStart,thetaLength));this.mergeVertices();}SphereGeometry.prototype=Object.create(Geometry.prototype);SphereGeometry.prototype.constructor=SphereGeometry;// SphereBufferGeometry function SphereBufferGeometry(radius,widthSegments,heightSegments,phiStart,phiLength,thetaStart,thetaLength){BufferGeometry.call(this);this.type='SphereBufferGeometry';this.parameters={radius:radius,widthSegments:widthSegments,heightSegments:heightSegments,phiStart:phiStart,phiLength:phiLength,thetaStart:thetaStart,thetaLength:thetaLength};radius=radius||1;widthSegments=Math.max(3,Math.floor(widthSegments)||8);heightSegments=Math.max(2,Math.floor(heightSegments)||6);phiStart=phiStart!==undefined?phiStart:0;phiLength=phiLength!==undefined?phiLength:Math.PI*2;thetaStart=thetaStart!==undefined?thetaStart:0;thetaLength=thetaLength!==undefined?thetaLength:Math.PI;var thetaEnd=thetaStart+thetaLength;var ix,iy;var index=0;var grid=[];var vertex=new Vector3();var normal=new Vector3();// buffers var indices=[];var vertices=[];var normals=[];var uvs=[];// generate vertices, normals and uvs for(iy=0;iy<=heightSegments;iy++){var verticesRow=[];var v=iy/heightSegments;for(ix=0;ix<=widthSegments;ix++){var u=ix/widthSegments;// vertex vertex.x=-radius*Math.cos(phiStart+u*phiLength)*Math.sin(thetaStart+v*thetaLength);vertex.y=radius*Math.cos(thetaStart+v*thetaLength);vertex.z=radius*Math.sin(phiStart+u*phiLength)*Math.sin(thetaStart+v*thetaLength);vertices.push(vertex.x,vertex.y,vertex.z);// normal normal.set(vertex.x,vertex.y,vertex.z).normalize();normals.push(normal.x,normal.y,normal.z);// uv uvs.push(u,1-v);verticesRow.push(index++);}grid.push(verticesRow);}// indices for(iy=0;iy0)indices.push(a,b,d);if(iy!==heightSegments-1||thetaEnd0)generateCap(true);if(radiusBottom>0)generateCap(false);}// build geometry this.setIndex(indices);this.addAttribute('position',new Float32BufferAttribute(vertices,3));this.addAttribute('normal',new Float32BufferAttribute(normals,3));this.addAttribute('uv',new Float32BufferAttribute(uvs,2));function generateTorso(){var x,y;var normal=new Vector3();var vertex=new Vector3();var groupCount=0;// this will be used to calculate the normal var slope=(radiusBottom-radiusTop)/height;// generate vertices, normals and uvs for(y=0;y<=heightSegments;y++){var indexRow=[];var v=y/heightSegments;// calculate the radius of the current row var radius=v*(radiusBottom-radiusTop)+radiusTop;for(x=0;x<=radialSegments;x++){var u=x/radialSegments;var theta=u*thetaLength+thetaStart;var sinTheta=Math.sin(theta);var cosTheta=Math.cos(theta);// vertex vertex.x=radius*sinTheta;vertex.y=-v*height+halfHeight;vertex.z=radius*cosTheta;vertices.push(vertex.x,vertex.y,vertex.z);// normal normal.set(sinTheta,slope,cosTheta).normalize();normals.push(normal.x,normal.y,normal.z);// uv uvs.push(u,1-v);// save index of vertex in respective row indexRow.push(index++);}// now save vertices of the row in our index array indexArray.push(indexRow);}// generate indices for(x=0;x * } */function ShadowMaterial(parameters){Material.call(this);this.type='ShadowMaterial';this.color=new Color(0x000000);this.transparent=true;this.setValues(parameters);}ShadowMaterial.prototype=Object.create(Material.prototype);ShadowMaterial.prototype.constructor=ShadowMaterial;ShadowMaterial.prototype.isShadowMaterial=true;ShadowMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.color.copy(source.color);return this;};/** * @author mrdoob / http://mrdoob.com/ */function RawShaderMaterial(parameters){ShaderMaterial.call(this,parameters);this.type='RawShaderMaterial';}RawShaderMaterial.prototype=Object.create(ShaderMaterial.prototype);RawShaderMaterial.prototype.constructor=RawShaderMaterial;RawShaderMaterial.prototype.isRawShaderMaterial=true;/** * @author WestLangley / http://github.com/WestLangley * * parameters = { * color: , * roughness: , * metalness: , * opacity: , * * map: new THREE.Texture( ), * * lightMap: new THREE.Texture( ), * lightMapIntensity: * * aoMap: new THREE.Texture( ), * aoMapIntensity: * * emissive: , * emissiveIntensity: * emissiveMap: new THREE.Texture( ), * * bumpMap: new THREE.Texture( ), * bumpScale: , * * normalMap: new THREE.Texture( ), * normalScale: , * * displacementMap: new THREE.Texture( ), * displacementScale: , * displacementBias: , * * roughnessMap: new THREE.Texture( ), * * metalnessMap: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), * envMapIntensity: * * refractionRatio: , * * wireframe: , * wireframeLinewidth: , * * skinning: , * morphTargets: , * morphNormals: * } */function MeshStandardMaterial(parameters){Material.call(this);this.defines={'STANDARD':''};this.type='MeshStandardMaterial';this.color=new Color(0xffffff);// diffuse this.roughness=0.5;this.metalness=0.5;this.map=null;this.lightMap=null;this.lightMapIntensity=1.0;this.aoMap=null;this.aoMapIntensity=1.0;this.emissive=new Color(0x000000);this.emissiveIntensity=1.0;this.emissiveMap=null;this.bumpMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new Vector2(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.roughnessMap=null;this.metalnessMap=null;this.alphaMap=null;this.envMap=null;this.envMapIntensity=1.0;this.refractionRatio=0.98;this.wireframe=false;this.wireframeLinewidth=1;this.wireframeLinecap='round';this.wireframeLinejoin='round';this.skinning=false;this.morphTargets=false;this.morphNormals=false;this.setValues(parameters);}MeshStandardMaterial.prototype=Object.create(Material.prototype);MeshStandardMaterial.prototype.constructor=MeshStandardMaterial;MeshStandardMaterial.prototype.isMeshStandardMaterial=true;MeshStandardMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.defines={'STANDARD':''};this.color.copy(source.color);this.roughness=source.roughness;this.metalness=source.metalness;this.map=source.map;this.lightMap=source.lightMap;this.lightMapIntensity=source.lightMapIntensity;this.aoMap=source.aoMap;this.aoMapIntensity=source.aoMapIntensity;this.emissive.copy(source.emissive);this.emissiveMap=source.emissiveMap;this.emissiveIntensity=source.emissiveIntensity;this.bumpMap=source.bumpMap;this.bumpScale=source.bumpScale;this.normalMap=source.normalMap;this.normalScale.copy(source.normalScale);this.displacementMap=source.displacementMap;this.displacementScale=source.displacementScale;this.displacementBias=source.displacementBias;this.roughnessMap=source.roughnessMap;this.metalnessMap=source.metalnessMap;this.alphaMap=source.alphaMap;this.envMap=source.envMap;this.envMapIntensity=source.envMapIntensity;this.refractionRatio=source.refractionRatio;this.wireframe=source.wireframe;this.wireframeLinewidth=source.wireframeLinewidth;this.wireframeLinecap=source.wireframeLinecap;this.wireframeLinejoin=source.wireframeLinejoin;this.skinning=source.skinning;this.morphTargets=source.morphTargets;this.morphNormals=source.morphNormals;return this;};/** * @author WestLangley / http://github.com/WestLangley * * parameters = { * reflectivity: * } */function MeshPhysicalMaterial(parameters){MeshStandardMaterial.call(this);this.defines={'PHYSICAL':''};this.type='MeshPhysicalMaterial';this.reflectivity=0.5;// maps to F0 = 0.04 this.clearCoat=0.0;this.clearCoatRoughness=0.0;this.setValues(parameters);}MeshPhysicalMaterial.prototype=Object.create(MeshStandardMaterial.prototype);MeshPhysicalMaterial.prototype.constructor=MeshPhysicalMaterial;MeshPhysicalMaterial.prototype.isMeshPhysicalMaterial=true;MeshPhysicalMaterial.prototype.copy=function(source){MeshStandardMaterial.prototype.copy.call(this,source);this.defines={'PHYSICAL':''};this.reflectivity=source.reflectivity;this.clearCoat=source.clearCoat;this.clearCoatRoughness=source.clearCoatRoughness;return this;};/** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ * * parameters = { * color: , * specular: , * shininess: , * opacity: , * * map: new THREE.Texture( ), * * lightMap: new THREE.Texture( ), * lightMapIntensity: * * aoMap: new THREE.Texture( ), * aoMapIntensity: * * emissive: , * emissiveIntensity: * emissiveMap: new THREE.Texture( ), * * bumpMap: new THREE.Texture( ), * bumpScale: , * * normalMap: new THREE.Texture( ), * normalScale: , * * displacementMap: new THREE.Texture( ), * displacementScale: , * displacementBias: , * * specularMap: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), * combine: THREE.Multiply, * reflectivity: , * refractionRatio: , * * wireframe: , * wireframeLinewidth: , * * skinning: , * morphTargets: , * morphNormals: * } */function MeshPhongMaterial(parameters){Material.call(this);this.type='MeshPhongMaterial';this.color=new Color(0xffffff);// diffuse this.specular=new Color(0x111111);this.shininess=30;this.map=null;this.lightMap=null;this.lightMapIntensity=1.0;this.aoMap=null;this.aoMapIntensity=1.0;this.emissive=new Color(0x000000);this.emissiveIntensity=1.0;this.emissiveMap=null;this.bumpMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new Vector2(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.specularMap=null;this.alphaMap=null;this.envMap=null;this.combine=MultiplyOperation;this.reflectivity=1;this.refractionRatio=0.98;this.wireframe=false;this.wireframeLinewidth=1;this.wireframeLinecap='round';this.wireframeLinejoin='round';this.skinning=false;this.morphTargets=false;this.morphNormals=false;this.setValues(parameters);}MeshPhongMaterial.prototype=Object.create(Material.prototype);MeshPhongMaterial.prototype.constructor=MeshPhongMaterial;MeshPhongMaterial.prototype.isMeshPhongMaterial=true;MeshPhongMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.color.copy(source.color);this.specular.copy(source.specular);this.shininess=source.shininess;this.map=source.map;this.lightMap=source.lightMap;this.lightMapIntensity=source.lightMapIntensity;this.aoMap=source.aoMap;this.aoMapIntensity=source.aoMapIntensity;this.emissive.copy(source.emissive);this.emissiveMap=source.emissiveMap;this.emissiveIntensity=source.emissiveIntensity;this.bumpMap=source.bumpMap;this.bumpScale=source.bumpScale;this.normalMap=source.normalMap;this.normalScale.copy(source.normalScale);this.displacementMap=source.displacementMap;this.displacementScale=source.displacementScale;this.displacementBias=source.displacementBias;this.specularMap=source.specularMap;this.alphaMap=source.alphaMap;this.envMap=source.envMap;this.combine=source.combine;this.reflectivity=source.reflectivity;this.refractionRatio=source.refractionRatio;this.wireframe=source.wireframe;this.wireframeLinewidth=source.wireframeLinewidth;this.wireframeLinecap=source.wireframeLinecap;this.wireframeLinejoin=source.wireframeLinejoin;this.skinning=source.skinning;this.morphTargets=source.morphTargets;this.morphNormals=source.morphNormals;return this;};/** * @author takahirox / http://github.com/takahirox * * parameters = { * gradientMap: new THREE.Texture( ) * } */function MeshToonMaterial(parameters){MeshPhongMaterial.call(this);this.defines={'TOON':''};this.type='MeshToonMaterial';this.gradientMap=null;this.setValues(parameters);}MeshToonMaterial.prototype=Object.create(MeshPhongMaterial.prototype);MeshToonMaterial.prototype.constructor=MeshToonMaterial;MeshToonMaterial.prototype.isMeshToonMaterial=true;MeshToonMaterial.prototype.copy=function(source){MeshPhongMaterial.prototype.copy.call(this,source);this.gradientMap=source.gradientMap;return this;};/** * @author mrdoob / http://mrdoob.com/ * @author WestLangley / http://github.com/WestLangley * * parameters = { * opacity: , * * bumpMap: new THREE.Texture( ), * bumpScale: , * * normalMap: new THREE.Texture( ), * normalScale: , * * displacementMap: new THREE.Texture( ), * displacementScale: , * displacementBias: , * * wireframe: , * wireframeLinewidth: * * skinning: , * morphTargets: , * morphNormals: * } */function MeshNormalMaterial(parameters){Material.call(this);this.type='MeshNormalMaterial';this.bumpMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new Vector2(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=false;this.wireframeLinewidth=1;this.fog=false;this.lights=false;this.skinning=false;this.morphTargets=false;this.morphNormals=false;this.setValues(parameters);}MeshNormalMaterial.prototype=Object.create(Material.prototype);MeshNormalMaterial.prototype.constructor=MeshNormalMaterial;MeshNormalMaterial.prototype.isMeshNormalMaterial=true;MeshNormalMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.bumpMap=source.bumpMap;this.bumpScale=source.bumpScale;this.normalMap=source.normalMap;this.normalScale.copy(source.normalScale);this.displacementMap=source.displacementMap;this.displacementScale=source.displacementScale;this.displacementBias=source.displacementBias;this.wireframe=source.wireframe;this.wireframeLinewidth=source.wireframeLinewidth;this.skinning=source.skinning;this.morphTargets=source.morphTargets;this.morphNormals=source.morphNormals;return this;};/** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ * * parameters = { * color: , * opacity: , * * map: new THREE.Texture( ), * * lightMap: new THREE.Texture( ), * lightMapIntensity: * * aoMap: new THREE.Texture( ), * aoMapIntensity: * * emissive: , * emissiveIntensity: * emissiveMap: new THREE.Texture( ), * * specularMap: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), * combine: THREE.Multiply, * reflectivity: , * refractionRatio: , * * wireframe: , * wireframeLinewidth: , * * skinning: , * morphTargets: , * morphNormals: * } */function MeshLambertMaterial(parameters){Material.call(this);this.type='MeshLambertMaterial';this.color=new Color(0xffffff);// diffuse this.map=null;this.lightMap=null;this.lightMapIntensity=1.0;this.aoMap=null;this.aoMapIntensity=1.0;this.emissive=new Color(0x000000);this.emissiveIntensity=1.0;this.emissiveMap=null;this.specularMap=null;this.alphaMap=null;this.envMap=null;this.combine=MultiplyOperation;this.reflectivity=1;this.refractionRatio=0.98;this.wireframe=false;this.wireframeLinewidth=1;this.wireframeLinecap='round';this.wireframeLinejoin='round';this.skinning=false;this.morphTargets=false;this.morphNormals=false;this.setValues(parameters);}MeshLambertMaterial.prototype=Object.create(Material.prototype);MeshLambertMaterial.prototype.constructor=MeshLambertMaterial;MeshLambertMaterial.prototype.isMeshLambertMaterial=true;MeshLambertMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.color.copy(source.color);this.map=source.map;this.lightMap=source.lightMap;this.lightMapIntensity=source.lightMapIntensity;this.aoMap=source.aoMap;this.aoMapIntensity=source.aoMapIntensity;this.emissive.copy(source.emissive);this.emissiveMap=source.emissiveMap;this.emissiveIntensity=source.emissiveIntensity;this.specularMap=source.specularMap;this.alphaMap=source.alphaMap;this.envMap=source.envMap;this.combine=source.combine;this.reflectivity=source.reflectivity;this.refractionRatio=source.refractionRatio;this.wireframe=source.wireframe;this.wireframeLinewidth=source.wireframeLinewidth;this.wireframeLinecap=source.wireframeLinecap;this.wireframeLinejoin=source.wireframeLinejoin;this.skinning=source.skinning;this.morphTargets=source.morphTargets;this.morphNormals=source.morphNormals;return this;};/** * @author alteredq / http://alteredqualia.com/ * * parameters = { * color: , * opacity: , * * linewidth: , * * scale: , * dashSize: , * gapSize: * } */function LineDashedMaterial(parameters){LineBasicMaterial.call(this);this.type='LineDashedMaterial';this.scale=1;this.dashSize=3;this.gapSize=1;this.setValues(parameters);}LineDashedMaterial.prototype=Object.create(LineBasicMaterial.prototype);LineDashedMaterial.prototype.constructor=LineDashedMaterial;LineDashedMaterial.prototype.isLineDashedMaterial=true;LineDashedMaterial.prototype.copy=function(source){LineBasicMaterial.prototype.copy.call(this,source);this.scale=source.scale;this.dashSize=source.dashSize;this.gapSize=source.gapSize;return this;};var Materials=Object.freeze({ShadowMaterial:ShadowMaterial,SpriteMaterial:SpriteMaterial,RawShaderMaterial:RawShaderMaterial,ShaderMaterial:ShaderMaterial,PointsMaterial:PointsMaterial,MeshPhysicalMaterial:MeshPhysicalMaterial,MeshStandardMaterial:MeshStandardMaterial,MeshPhongMaterial:MeshPhongMaterial,MeshToonMaterial:MeshToonMaterial,MeshNormalMaterial:MeshNormalMaterial,MeshLambertMaterial:MeshLambertMaterial,MeshDepthMaterial:MeshDepthMaterial,MeshDistanceMaterial:MeshDistanceMaterial,MeshBasicMaterial:MeshBasicMaterial,LineDashedMaterial:LineDashedMaterial,LineBasicMaterial:LineBasicMaterial,Material:Material});/** * @author mrdoob / http://mrdoob.com/ */var Cache={enabled:false,files:{},add:function(key,file){if(this.enabled===false)return;// console.log( 'THREE.Cache', 'Adding key:', key ); this.files[key]=file;},get:function(key){if(this.enabled===false)return;// console.log( 'THREE.Cache', 'Checking key:', key ); return this.files[key];},remove:function(key){delete this.files[key];},clear:function(){this.files={};}};/** * @author mrdoob / http://mrdoob.com/ */function LoadingManager(onLoad,onProgress,onError){var scope=this;var isLoading=false;var itemsLoaded=0;var itemsTotal=0;var urlModifier=undefined;this.onStart=undefined;this.onLoad=onLoad;this.onProgress=onProgress;this.onError=onError;this.itemStart=function(url){itemsTotal++;if(isLoading===false){if(scope.onStart!==undefined){scope.onStart(url,itemsLoaded,itemsTotal);}}isLoading=true;};this.itemEnd=function(url){itemsLoaded++;if(scope.onProgress!==undefined){scope.onProgress(url,itemsLoaded,itemsTotal);}if(itemsLoaded===itemsTotal){isLoading=false;if(scope.onLoad!==undefined){scope.onLoad();}}};this.itemError=function(url){if(scope.onError!==undefined){scope.onError(url);}};this.resolveURL=function(url){if(urlModifier){return urlModifier(url);}return url;};this.setURLModifier=function(transform){urlModifier=transform;return this;};}var DefaultLoadingManager=new LoadingManager();/** * @author mrdoob / http://mrdoob.com/ */var loading={};function FileLoader(manager){this.manager=manager!==undefined?manager:DefaultLoadingManager;}Object.assign(FileLoader.prototype,{load:function(url,onLoad,onProgress,onError){if(url===undefined)url='';if(this.path!==undefined)url=this.path+url;url=this.manager.resolveURL(url);var scope=this;var cached=Cache.get(url);if(cached!==undefined){scope.manager.itemStart(url);setTimeout(function(){if(onLoad)onLoad(cached);scope.manager.itemEnd(url);},0);return cached;}// Check if request is duplicate if(loading[url]!==undefined){loading[url].push({onLoad:onLoad,onProgress:onProgress,onError:onError});return;}// Check for data: URI var dataUriRegex=/^data:(.*?)(;base64)?,(.*)$/;var dataUriRegexResult=url.match(dataUriRegex);// Safari can not handle Data URIs through XMLHttpRequest so process manually if(dataUriRegexResult){var mimeType=dataUriRegexResult[1];var isBase64=!!dataUriRegexResult[2];var data=dataUriRegexResult[3];data=window.decodeURIComponent(data);if(isBase64)data=window.atob(data);try{var response;var responseType=(this.responseType||'').toLowerCase();switch(responseType){case'arraybuffer':case'blob':var view=new Uint8Array(data.length);for(var i=0;i0||url.search(/^data\:image\/jpeg/)===0;texture.format=isJPEG?RGBFormat:RGBAFormat;texture.needsUpdate=true;if(onLoad!==undefined){onLoad(texture);}},onProgress,onError);return texture;},setCrossOrigin:function(value){this.crossOrigin=value;return this;},setPath:function(value){this.path=value;return this;}});/** * @author zz85 / http://www.lab4games.net/zz85/blog * Extensible curve object * * Some common of curve methods: * .getPoint( t, optionalTarget ), .getTangent( t ) * .getPointAt( u, optionalTarget ), .getTangentAt( u ) * .getPoints(), .getSpacedPoints() * .getLength() * .updateArcLengths() * * This following curves inherit from THREE.Curve: * * -- 2D curves -- * THREE.ArcCurve * THREE.CubicBezierCurve * THREE.EllipseCurve * THREE.LineCurve * THREE.QuadraticBezierCurve * THREE.SplineCurve * * -- 3D curves -- * THREE.CatmullRomCurve3 * THREE.CubicBezierCurve3 * THREE.LineCurve3 * THREE.QuadraticBezierCurve3 * * A series of curves can be represented as a THREE.CurvePath. * **/ /************************************************************** * Abstract Curve base class **************************************************************/function Curve(){this.type='Curve';this.arcLengthDivisions=200;}Object.assign(Curve.prototype,{// Virtual base class method to overwrite and implement in subclasses // - t [0 .. 1] getPoint:function()/* t, optionalTarget */{console.warn('THREE.Curve: .getPoint() not implemented.');return null;},// Get point at relative position in curve according to arc length // - u [0 .. 1] getPointAt:function(u,optionalTarget){var t=this.getUtoTmapping(u);return this.getPoint(t,optionalTarget);},// Get sequence of points using getPoint( t ) getPoints:function(divisions){if(divisions===undefined)divisions=5;var points=[];for(var d=0;d<=divisions;d++){points.push(this.getPoint(d/divisions));}return points;},// Get sequence of points using getPointAt( u ) getSpacedPoints:function(divisions){if(divisions===undefined)divisions=5;var points=[];for(var d=0;d<=divisions;d++){points.push(this.getPointAt(d/divisions));}return points;},// Get total curve arc length getLength:function(){var lengths=this.getLengths();return lengths[lengths.length-1];},// Get list of cumulative segment lengths getLengths:function(divisions){if(divisions===undefined)divisions=this.arcLengthDivisions;if(this.cacheArcLengths&&this.cacheArcLengths.length===divisions+1&&!this.needsUpdate){return this.cacheArcLengths;}this.needsUpdate=false;var cache=[];var current,last=this.getPoint(0);var p,sum=0;cache.push(0);for(p=1;p<=divisions;p++){current=this.getPoint(p/divisions);sum+=current.distanceTo(last);cache.push(sum);last=current;}this.cacheArcLengths=cache;return cache;// { sums: cache, sum: sum }; Sum is in the last element. },updateArcLengths:function(){this.needsUpdate=true;this.getLengths();},// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant getUtoTmapping:function(u,distance){var arcLengths=this.getLengths();var i=0,il=arcLengths.length;var targetArcLength;// The targeted u distance value to get if(distance){targetArcLength=distance;}else{targetArcLength=u*arcLengths[il-1];}// binary search for the index with largest value smaller than target u distance var low=0,high=il-1,comparison;while(low<=high){i=Math.floor(low+(high-low)/2);// less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats comparison=arcLengths[i]-targetArcLength;if(comparison<0){low=i+1;}else if(comparison>0){high=i-1;}else{high=i;break;// DONE }}i=high;if(arcLengths[i]===targetArcLength){return i/(il-1);}// we could get finer grain at lengths, or use simple interpolation between two points var lengthBefore=arcLengths[i];var lengthAfter=arcLengths[i+1];var segmentLength=lengthAfter-lengthBefore;// determine where we are between the 'before' and 'after' points var segmentFraction=(targetArcLength-lengthBefore)/segmentLength;// add that fractional amount to t var t=(i+segmentFraction)/(il-1);return t;},// Returns a unit vector tangent at t // In case any sub curve does not implement its tangent derivation, // 2 points a small delta apart will be used to find its gradient // which seems to give a reasonable approximation getTangent:function(t){var delta=0.0001;var t1=t-delta;var t2=t+delta;// Capping in case of danger if(t1<0)t1=0;if(t2>1)t2=1;var pt1=this.getPoint(t1);var pt2=this.getPoint(t2);var vec=pt2.clone().sub(pt1);return vec.normalize();},getTangentAt:function(u){var t=this.getUtoTmapping(u);return this.getTangent(t);},computeFrenetFrames:function(segments,closed){// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf var normal=new Vector3();var tangents=[];var normals=[];var binormals=[];var vec=new Vector3();var mat=new Matrix4();var i,u,theta;// compute the tangent vectors for each segment on the curve for(i=0;i<=segments;i++){u=i/segments;tangents[i]=this.getTangentAt(u);tangents[i].normalize();}// select an initial normal vector perpendicular to the first tangent vector, // and in the direction of the minimum tangent xyz component normals[0]=new Vector3();binormals[0]=new Vector3();var min=Number.MAX_VALUE;var tx=Math.abs(tangents[0].x);var ty=Math.abs(tangents[0].y);var tz=Math.abs(tangents[0].z);if(tx<=min){min=tx;normal.set(1,0,0);}if(ty<=min){min=ty;normal.set(0,1,0);}if(tz<=min){normal.set(0,0,1);}vec.crossVectors(tangents[0],normal).normalize();normals[0].crossVectors(tangents[0],vec);binormals[0].crossVectors(tangents[0],normals[0]);// compute the slowly-varying normal and binormal vectors for each segment on the curve for(i=1;i<=segments;i++){normals[i]=normals[i-1].clone();binormals[i]=binormals[i-1].clone();vec.crossVectors(tangents[i-1],tangents[i]);if(vec.length()>Number.EPSILON){vec.normalize();theta=Math.acos(_Math.clamp(tangents[i-1].dot(tangents[i]),-1,1));// clamp for floating pt errors normals[i].applyMatrix4(mat.makeRotationAxis(vec,theta));}binormals[i].crossVectors(tangents[i],normals[i]);}// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same if(closed===true){theta=Math.acos(_Math.clamp(normals[0].dot(normals[segments]),-1,1));theta/=segments;if(tangents[0].dot(vec.crossVectors(normals[0],normals[segments]))>0){theta=-theta;}for(i=1;i<=segments;i++){// twist a little... normals[i].applyMatrix4(mat.makeRotationAxis(tangents[i],theta*i));binormals[i].crossVectors(tangents[i],normals[i]);}}return {tangents:tangents,normals:normals,binormals:binormals};},clone:function(){return new this.constructor().copy(this);},copy:function(source){this.arcLengthDivisions=source.arcLengthDivisions;return this;},toJSON:function(){var data={metadata:{version:4.5,type:'Curve',generator:'Curve.toJSON'}};data.arcLengthDivisions=this.arcLengthDivisions;data.type=this.type;return data;},fromJSON:function(json){this.arcLengthDivisions=json.arcLengthDivisions;return this;}});function EllipseCurve(aX,aY,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise,aRotation){Curve.call(this);this.type='EllipseCurve';this.aX=aX||0;this.aY=aY||0;this.xRadius=xRadius||1;this.yRadius=yRadius||1;this.aStartAngle=aStartAngle||0;this.aEndAngle=aEndAngle||2*Math.PI;this.aClockwise=aClockwise||false;this.aRotation=aRotation||0;}EllipseCurve.prototype=Object.create(Curve.prototype);EllipseCurve.prototype.constructor=EllipseCurve;EllipseCurve.prototype.isEllipseCurve=true;EllipseCurve.prototype.getPoint=function(t,optionalTarget){var point=optionalTarget||new Vector2();var twoPi=Math.PI*2;var deltaAngle=this.aEndAngle-this.aStartAngle;var samePoints=Math.abs(deltaAngle)twoPi)deltaAngle-=twoPi;if(deltaAngle0?0:(Math.floor(Math.abs(intPoint)/l)+1)*l;}else if(weight===0&&intPoint===l-1){intPoint=l-2;weight=1;}var p0,p1,p2,p3;// 4 points if(this.closed||intPoint>0){p0=points[(intPoint-1)%l];}else{// extrapolate first point tmp.subVectors(points[0],points[1]).add(points[0]);p0=tmp;}p1=points[intPoint%l];p2=points[(intPoint+1)%l];if(this.closed||intPoint+2points.length-2?points.length-1:intPoint+1];var p3=points[intPoint>points.length-3?points.length-1:intPoint+2];point.set(CatmullRom(weight,p0.x,p1.x,p2.x,p3.x),CatmullRom(weight,p0.y,p1.y,p2.y,p3.y));return point;};SplineCurve.prototype.copy=function(source){Curve.prototype.copy.call(this,source);this.points=[];for(var i=0,l=source.points.length;i=d){var diff=curveLengths[i]-d;var curve=this.curves[i];var segmentLength=curve.getLength();var u=segmentLength===0?0:1-diff/segmentLength;return curve.getPointAt(u);}i++;}return null;// loop where sum != 0, sum > d , sum+1 1&&!points[points.length-1].equals(points[0])){points.push(points[0]);}return points;},copy:function(source){Curve.prototype.copy.call(this,source);this.curves=[];for(var i=0,l=source.curves.length;i0){// if a previous curve is present, attempt to join var firstPoint=curve.getPoint(0);if(!firstPoint.equals(this.currentPoint)){this.lineTo(firstPoint.x,firstPoint.y);}}this.curves.push(curve);var lastPoint=curve.getPoint(1);this.currentPoint.copy(lastPoint);},copy:function(source){CurvePath.prototype.copy.call(this,source);this.currentPoint.copy(source.currentPoint);return this;},toJSON:function(){var data=CurvePath.prototype.toJSON.call(this);data.currentPoint=this.currentPoint.toArray();return data;},fromJSON:function(json){CurvePath.prototype.fromJSON.call(this,json);this.currentPoint.fromArray(json.currentPoint);return this;}});/** * @author zz85 / http://www.lab4games.net/zz85/blog * Defines a 2d shape plane using paths. **/ // STEP 1 Create a path. // STEP 2 Turn path into shape. // STEP 3 ExtrudeGeometry takes in Shape/Shapes // STEP 3a - Extract points from each shape, turn to vertices // STEP 3b - Triangulate each shape, add faces. function Shape(points){Path.call(this,points);this.uuid=_Math.generateUUID();this.type='Shape';this.holes=[];}Shape.prototype=Object.assign(Object.create(Path.prototype),{constructor:Shape,getPointsHoles:function(divisions){var holesPts=[];for(var i=0,l=this.holes.length;i= t1 || t1 === undefined ) { forward_scan:if(!(t=t0)){// looping? var t1global=pp[1];if(t=t0){// we have arrived at the sought interval break seek;}}// prepare binary search on the left side of the index right=i1;i1=0;break linear_scan;}// the interval is valid break validate_interval;}// linear scan // binary search while(i1>>1;if(t seconds conversions) scale:function(timeScale){if(timeScale!==1.0){var times=this.times;for(var i=0,n=times.length;i!==n;++i){times[i]*=timeScale;}}return this;},// removes keyframes before and after animation without changing any values within the range [startTime, endTime]. // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values trim:function(startTime,endTime){var times=this.times,nKeys=times.length,from=0,to=nKeys-1;while(from!==nKeys&×[from]endTime){--to;}++to;// inclusive -> exclusive bound if(from!==0||to!==nKeys){// empty tracks are forbidden, so keep at least one keyframe if(from>=to)to=Math.max(to,1),from=to-1;var stride=this.getValueSize();this.times=AnimationUtils.arraySlice(times,from,to);this.values=AnimationUtils.arraySlice(this.values,from*stride,to*stride);}return this;},// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable validate:function(){var valid=true;var valueSize=this.getValueSize();if(valueSize-Math.floor(valueSize)!==0){console.error('THREE.KeyframeTrack: Invalid value size in track.',this);valid=false;}var times=this.times,values=this.values,nKeys=times.length;if(nKeys===0){console.error('THREE.KeyframeTrack: Track is empty.',this);valid=false;}var prevTime=null;for(var i=0;i!==nKeys;i++){var currTime=times[i];if(typeof currTime==='number'&&isNaN(currTime)){console.error('THREE.KeyframeTrack: Time is not a valid number.',this,i,currTime);valid=false;break;}if(prevTime!==null&&prevTime>currTime){console.error('THREE.KeyframeTrack: Out of order keys.',this,i,currTime,prevTime);valid=false;break;}prevTime=currTime;}if(values!==undefined){if(AnimationUtils.isTypedArray(values)){for(var i=0,n=values.length;i!==n;++i){var value=values[i];if(isNaN(value)){console.error('THREE.KeyframeTrack: Value is not a valid number.',this,i,value);valid=false;break;}}}}return valid;},// removes equivalent sequential keys as common in morph target sequences // (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0) optimize:function(){var times=this.times,values=this.values,stride=this.getValueSize(),smoothInterpolation=this.getInterpolation()===InterpolateSmooth,writeIndex=1,lastIndex=times.length-1;for(var i=1;i0){times[writeIndex]=times[lastIndex];for(var readOffset=lastIndex*stride,writeOffset=writeIndex*stride,j=0;j!==stride;++j){values[writeOffset+j]=values[readOffset+j];}++writeIndex;}if(writeIndex!==times.length){this.times=AnimationUtils.arraySlice(times,0,writeIndex);this.values=AnimationUtils.arraySlice(values,0,writeIndex*stride);}return this;}});/** * * A Track of vectored keyframe values. * * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ * @author tschw */function VectorKeyframeTrack(name,times,values,interpolation){KeyframeTrack.call(this,name,times,values,interpolation);}VectorKeyframeTrack.prototype=Object.assign(Object.create(KeyframeTrack.prototype),{constructor:VectorKeyframeTrack,ValueTypeName:'vector'// ValueBufferType is inherited // DefaultInterpolation is inherited });/** * * Reusable set of Tracks that represent an animation. * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ */function AnimationClip(name,duration,tracks){this.name=name;this.tracks=tracks;this.duration=duration!==undefined?duration:-1;this.uuid=_Math.generateUUID();// this means it should figure out its duration by scanning the tracks if(this.duration<0){this.resetDuration();}this.optimize();}Object.assign(AnimationClip,{parse:function(json){var tracks=[],jsonTracks=json.tracks,frameTime=1.0/(json.fps||1.0);for(var i=0,n=jsonTracks.length;i!==n;++i){tracks.push(KeyframeTrack.parse(jsonTracks[i]).scale(frameTime));}return new AnimationClip(json.name,json.duration,tracks);},toJSON:function(clip){var tracks=[],clipTracks=clip.tracks;var json={'name':clip.name,'duration':clip.duration,'tracks':tracks};for(var i=0,n=clipTracks.length;i!==n;++i){tracks.push(KeyframeTrack.toJSON(clipTracks[i]));}return json;},CreateFromMorphTargetSequence:function(name,morphTargetSequence,fps,noLoop){var numMorphTargets=morphTargetSequence.length;var tracks=[];for(var i=0;i1){var name=parts[1];var animationMorphTargets=animationToMorphTargets[name];if(!animationMorphTargets){animationToMorphTargets[name]=animationMorphTargets=[];}animationMorphTargets.push(morphTarget);}}var clips=[];for(var name in animationToMorphTargets){clips.push(AnimationClip.CreateFromMorphTargetSequence(name,animationToMorphTargets[name],fps,noLoop));}return clips;},// parse the animation.hierarchy format parseAnimation:function(animation,bones){if(!animation){console.error('THREE.AnimationClip: No animation in JSONLoader data.');return null;}var addNonemptyTrack=function(trackType,trackName,animationKeys,propertyName,destTracks){// only return track if there are actually keys. if(animationKeys.length!==0){var times=[];var values=[];AnimationUtils.flattenJSON(animationKeys,times,values,propertyName);// empty keys are filtered out, so check again if(times.length!==0){destTracks.push(new trackType(trackName,times,values));}}};var tracks=[];var clipName=animation.name||'default';// automatic length determination in AnimationClip. var duration=animation.length||-1;var fps=animation.fps||30;var hierarchyTracks=animation.hierarchy||[];for(var h=0;h uv index correspondence fi=geometry.faces.length;if(hasFaceVertexUv){for(i=0;i uv index correspondence fi=geometry.faces.length;if(hasFaceVertexUv){for(i=0;i1?json.skinWeights[i+1]:0;var z=influencesPerVertex>2?json.skinWeights[i+2]:0;var w=influencesPerVertex>3?json.skinWeights[i+3]:0;geometry.skinWeights.push(new Vector4(x,y,z,w));}}if(json.skinIndices){for(var i=0,l=json.skinIndices.length;i1?json.skinIndices[i+1]:0;var c=influencesPerVertex>2?json.skinIndices[i+2]:0;var d=influencesPerVertex>3?json.skinIndices[i+3]:0;geometry.skinIndices.push(new Vector4(a,b,c,d));}}geometry.bones=json.bones;if(geometry.bones&&geometry.bones.length>0&&(geometry.skinWeights.length!==geometry.skinIndices.length||geometry.skinIndices.length!==geometry.vertices.length)){console.warn('When skinning, number of vertices ('+geometry.vertices.length+'), skinIndices ('+geometry.skinIndices.length+'), and skinWeights ('+geometry.skinWeights.length+') should match.');}}function parseMorphing(json,geometry){var scale=json.scale;if(json.morphTargets!==undefined){for(var i=0,l=json.morphTargets.length;i0){console.warn('THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.');var faces=geometry.faces;var morphColors=json.morphColors[0].colors;for(var i=0,l=faces.length;i0)geometry.animations=outputAnimations;}return function parse(json,texturePath){if(json.data!==undefined){// Geometry 4.0 spec json=json.data;}if(json.scale!==undefined){json.scale=1.0/json.scale;}else{json.scale=1.0;}var geometry=new Geometry();parseModel(json,geometry);parseSkin(json,geometry);parseMorphing(json,geometry);parseAnimations(json,geometry);geometry.computeFaceNormals();geometry.computeBoundingSphere();if(json.materials===undefined||json.materials.length===0){return {geometry:geometry};}else{var materials=Loader.prototype.initMaterials(json.materials,texturePath,this.crossOrigin);return {geometry:geometry,materials:materials};}};}()});/** * @author mrdoob / http://mrdoob.com/ */function ObjectLoader(manager){this.manager=manager!==undefined?manager:DefaultLoadingManager;this.texturePath='';}Object.assign(ObjectLoader.prototype,{load:function(url,onLoad,onProgress,onError){if(this.texturePath===''){this.texturePath=url.substring(0,url.lastIndexOf('/')+1);}var scope=this;var loader=new FileLoader(scope.manager);loader.load(url,function(text){var json=null;try{json=JSON.parse(text);}catch(error){if(onError!==undefined)onError(error);console.error('THREE:ObjectLoader: Can\'t parse '+url+'.',error.message);return;}var metadata=json.metadata;if(metadata===undefined||metadata.type===undefined||metadata.type.toLowerCase()==='geometry'){console.error('THREE.ObjectLoader: Can\'t load '+url+'. Use THREE.JSONLoader instead.');return;}scope.parse(json,onLoad);},onProgress,onError);},setTexturePath:function(value){this.texturePath=value;},setCrossOrigin:function(value){this.crossOrigin=value;},parse:function(json,onLoad){var shapes=this.parseShape(json.shapes);var geometries=this.parseGeometries(json.geometries,shapes);var images=this.parseImages(json.images,function(){if(onLoad!==undefined)onLoad(object);});var textures=this.parseTextures(json.textures,images);var materials=this.parseMaterials(json.materials,textures);var object=this.parseObject(json.object,geometries,materials);if(json.animations){object.animations=this.parseAnimations(json.animations);}if(json.images===undefined||json.images.length===0){if(onLoad!==undefined)onLoad(object);}return object;},parseShape:function(json){var shapes={};if(json!==undefined){for(var i=0,l=json.length;i0){var manager=new LoadingManager(onLoad);var loader=new ImageLoader(manager);loader.setCrossOrigin(this.crossOrigin);for(var i=0,l=json.length;i0){object=new SkinnedMesh(geometry,material);}else{object=new Mesh(geometry,material);}break;case'LOD':object=new LOD();break;case'Line':object=new Line(getGeometry(data.geometry),getMaterial(data.material),data.mode);break;case'LineLoop':object=new LineLoop(getGeometry(data.geometry),getMaterial(data.material));break;case'LineSegments':object=new LineSegments(getGeometry(data.geometry),getMaterial(data.material));break;case'PointCloud':case'Points':object=new Points(getGeometry(data.geometry),getMaterial(data.material));break;case'Sprite':object=new Sprite(getMaterial(data.material));break;case'Group':object=new Group();break;default:object=new Object3D();}object.uuid=data.uuid;if(data.name!==undefined)object.name=data.name;if(data.matrix!==undefined){object.matrix.fromArray(data.matrix);if(data.matrixAutoUpdate!==undefined)object.matrixAutoUpdate=data.matrixAutoUpdate;if(object.matrixAutoUpdate)object.matrix.decompose(object.position,object.quaternion,object.scale);}else{if(data.position!==undefined)object.position.fromArray(data.position);if(data.rotation!==undefined)object.rotation.fromArray(data.rotation);if(data.quaternion!==undefined)object.quaternion.fromArray(data.quaternion);if(data.scale!==undefined)object.scale.fromArray(data.scale);}if(data.castShadow!==undefined)object.castShadow=data.castShadow;if(data.receiveShadow!==undefined)object.receiveShadow=data.receiveShadow;if(data.shadow){if(data.shadow.bias!==undefined)object.shadow.bias=data.shadow.bias;if(data.shadow.radius!==undefined)object.shadow.radius=data.shadow.radius;if(data.shadow.mapSize!==undefined)object.shadow.mapSize.fromArray(data.shadow.mapSize);if(data.shadow.camera!==undefined)object.shadow.camera=this.parseObject(data.shadow.camera);}if(data.visible!==undefined)object.visible=data.visible;if(data.frustumCulled!==undefined)object.frustumCulled=data.frustumCulled;if(data.renderOrder!==undefined)object.renderOrder=data.renderOrder;if(data.userData!==undefined)object.userData=data.userData;if(data.children!==undefined){var children=data.children;for(var i=0;i immediate success or // toggling of inside/outside at every single! intersection point of an edge // with the horizontal line through inPt, left of inPt // not counting lowerY endpoints of edges and whole edges on that line var inside=false;for(var p=polyLen-1,q=0;qNumber.EPSILON){// not parallel if(edgeDy<0){edgeLowPt=inPolygon[q];edgeDx=-edgeDx;edgeHighPt=inPolygon[p];edgeDy=-edgeDy;}if(inPt.yedgeHighPt.y)continue;if(inPt.y===edgeLowPt.y){if(inPt.x===edgeLowPt.x)return true;// inPt is on contour ? // continue; // no intersection or edgeLowPt => doesn't count !!! }else{var perpEdge=edgeDy*(inPt.x-edgeLowPt.x)-edgeDx*(inPt.y-edgeLowPt.y);if(perpEdge===0)return true;// inPt is on contour ? if(perpEdge<0)continue;inside=!inside;// true intersection left of inPt }}else{// parallel or collinear if(inPt.y!==edgeLowPt.y)continue;// parallel // edge lies on the same horizontal line as inPt if(edgeHighPt.x<=inPt.x&&inPt.x<=edgeLowPt.x||edgeLowPt.x<=inPt.x&&inPt.x<=edgeHighPt.x)return true;// inPt: Point on contour ! // continue; }}return inside;}var isClockWise=ShapeUtils.isClockWise;var subPaths=this.subPaths;if(subPaths.length===0)return [];if(noHoles===true)return toShapesNoHoles(subPaths);var solid,tmpPath,tmpShape,shapes=[];if(subPaths.length===1){tmpPath=subPaths[0];tmpShape=new Shape();tmpShape.curves=tmpPath.curves;shapes.push(tmpShape);return shapes;}var holesFirst=!isClockWise(subPaths[0].getPoints());holesFirst=isCCW?!holesFirst:holesFirst;// console.log("Holes first", holesFirst); var betterShapeHoles=[];var newShapes=[];var newShapeHoles=[];var mainIdx=0;var tmpPoints;newShapes[mainIdx]=undefined;newShapeHoles[mainIdx]=[];for(var i=0,l=subPaths.length;i probably all Shapes with wrong orientation if(!newShapes[0])return toShapesNoHoles(subPaths);if(newShapes.length>1){var ambiguous=false;var toChange=[];for(var sIdx=0,sLen=newShapes.length;sIdx0){// console.log("to change: ", toChange); if(!ambiguous)newShapeHoles=betterShapeHoles;}}var tmpHoles;for(var i=0,il=newShapes.length;i0){this.source.connect(this.filters[0]);for(var i=1,l=this.filters.length;i0){this.source.disconnect(this.filters[0]);for(var i=1,l=this.filters.length;i' accumulate:function(accuIndex,weight){// note: happily accumulating nothing when weight = 0, the caller knows // the weight and shouldn't have made the call in the first place var buffer=this.buffer,stride=this.valueSize,offset=accuIndex*stride+stride,currentWeight=this.cumulativeWeight;if(currentWeight===0){// accuN := incoming * weight for(var i=0;i!==stride;++i){buffer[offset+i]=buffer[i];}currentWeight=weight;}else{// accuN := accuN + incoming * weight currentWeight+=weight;var mix=weight/currentWeight;this._mixBufferRegion(buffer,offset,0,mix,stride);}this.cumulativeWeight=currentWeight;},// apply the state of 'accu' to the binding when accus differ apply:function(accuIndex){var stride=this.valueSize,buffer=this.buffer,offset=accuIndex*stride+stride,weight=this.cumulativeWeight,binding=this.binding;this.cumulativeWeight=0;if(weight<1){// accuN := accuN + original * ( 1 - cumulativeWeight ) var originalValueOffset=stride*3;this._mixBufferRegion(buffer,offset,originalValueOffset,1-weight,stride);}for(var i=stride,e=stride+stride;i!==e;++i){if(buffer[i]!==buffer[i+stride]){// value has changed -> update scene graph binding.setValue(buffer,offset);break;}}},// remember the state of the bound property and copy it to both accus saveOriginalState:function(){var binding=this.binding;var buffer=this.buffer,stride=this.valueSize,originalValueOffset=stride*3;binding.getValue(buffer,originalValueOffset);// accu[0..1] := orig -- initially detect changes against the original for(var i=stride,e=originalValueOffset;i!==e;++i){buffer[i]=buffer[originalValueOffset+i%stride];}this.cumulativeWeight=0;},// apply the state previously taken via 'saveOriginalState' to the binding restoreOriginalState:function(){var originalValueOffset=this.valueSize*3;this.binding.setValue(this.buffer,originalValueOffset);},// mix functions _select:function(buffer,dstOffset,srcOffset,t,stride){if(t>=0.5){for(var i=0;i!==stride;++i){buffer[dstOffset+i]=buffer[srcOffset+i];}}},_slerp:function(buffer,dstOffset,srcOffset,t){Quaternion.slerpFlat(buffer,dstOffset,buffer,dstOffset,buffer,srcOffset,t);},_lerp:function(buffer,dstOffset,srcOffset,t,stride){var s=1-t;for(var i=0;i!==stride;++i){var j=dstOffset+i;buffer[j]=buffer[j]*s+buffer[srcOffset+i]*t;}}});/** * * A reference to a real property in the scene graph. * * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ * @author tschw */ // Characters [].:/ are reserved for track binding syntax. var RESERVED_CHARS_RE='\\[\\]\\.:\\/';function Composite(targetGroup,path,optionalParsedPath){var parsedPath=optionalParsedPath||PropertyBinding.parseTrackName(path);this._targetGroup=targetGroup;this._bindings=targetGroup.subscribe_(path,parsedPath);}Object.assign(Composite.prototype,{getValue:function(array,offset){this.bind();// bind all binding var firstValidIndex=this._targetGroup.nCachedObjects_,binding=this._bindings[firstValidIndex];// and only call .getValue on the first if(binding!==undefined)binding.getValue(array,offset);},setValue:function(array,offset){var bindings=this._bindings;for(var i=this._targetGroup.nCachedObjects_,n=bindings.length;i!==n;++i){bindings[i].setValue(array,offset);}},bind:function(){var bindings=this._bindings;for(var i=this._targetGroup.nCachedObjects_,n=bindings.length;i!==n;++i){bindings[i].bind();}},unbind:function(){var bindings=this._bindings;for(var i=this._targetGroup.nCachedObjects_,n=bindings.length;i!==n;++i){bindings[i].unbind();}}});function PropertyBinding(rootNode,path,parsedPath){this.path=path;this.parsedPath=parsedPath||PropertyBinding.parseTrackName(path);this.node=PropertyBinding.findNode(rootNode,this.parsedPath.nodeName)||rootNode;this.rootNode=rootNode;}Object.assign(PropertyBinding,{Composite:Composite,create:function(root,path,parsedPath){if(!(root&&root.isAnimationObjectGroup)){return new PropertyBinding(root,path,parsedPath);}else{return new PropertyBinding.Composite(root,path,parsedPath);}},/** * Replaces spaces with underscores and removes unsupported characters from * node names, to ensure compatibility with parseTrackName(). * * @param {string} name Node name to be sanitized. * @return {string} */sanitizeNodeName:function(){var reservedRe=new RegExp('['+RESERVED_CHARS_RE+']','g');return function sanitizeNodeName(name){return name.replace(/\s/g,'_').replace(reservedRe,'');};}(),parseTrackName:function(){// Attempts to allow node names from any language. ES5's `\w` regexp matches // only latin characters, and the unicode \p{L} is not yet supported. So // instead, we exclude reserved characters and match everything else. var wordChar='[^'+RESERVED_CHARS_RE+']';var wordCharOrDot='[^'+RESERVED_CHARS_RE.replace('\\.','')+']';// Parent directories, delimited by '/' or ':'. Currently unused, but must // be matched to parse the rest of the track name. var directoryRe=/((?:WC+[\/:])*)/.source.replace('WC',wordChar);// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'. var nodeRe=/(WCOD+)?/.source.replace('WCOD',wordCharOrDot);// Object on target node, and accessor. May not contain reserved // characters. Accessor may contain any character except closing bracket. var objectRe=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace('WC',wordChar);// Property and accessor. May not contain reserved characters. Accessor may // contain any non-bracket characters. var propertyRe=/\.(WC+)(?:\[(.+)\])?/.source.replace('WC',wordChar);var trackRe=new RegExp(''+'^'+directoryRe+nodeRe+objectRe+propertyRe+'$');var supportedObjectNames=['material','materials','bones'];return function parseTrackName(trackName){var matches=trackRe.exec(trackName);if(!matches){throw new Error('PropertyBinding: Cannot parse trackName: '+trackName);}var results={// directoryName: matches[ 1 ], // (tschw) currently unused nodeName:matches[2],objectName:matches[3],objectIndex:matches[4],propertyName:matches[5],// required propertyIndex:matches[6]};var lastDot=results.nodeName&&results.nodeName.lastIndexOf('.');if(lastDot!==undefined&&lastDot!==-1){var objectName=results.nodeName.substring(lastDot+1);// Object names must be checked against a whitelist. Otherwise, there // is no way to parse 'foo.bar.baz': 'baz' must be a property, but // 'bar' could be the objectName, or part of a nodeName (which can // include '.' characters). if(supportedObjectNames.indexOf(objectName)!==-1){results.nodeName=results.nodeName.substring(0,lastDot);results.objectName=objectName;}}if(results.propertyName===null||results.propertyName.length===0){throw new Error('PropertyBinding: can not parse propertyName from trackName: '+trackName);}return results;};}(),findNode:function(root,nodeName){if(!nodeName||nodeName===""||nodeName==="root"||nodeName==="."||nodeName===-1||nodeName===root.name||nodeName===root.uuid){return root;}// search into skeleton bones. if(root.skeleton){var bone=root.skeleton.getBoneByName(nodeName);if(bone!==undefined){return bone;}}// search into node subtree. if(root.children){var searchNodeSubtree=function(children){for(var i=0;i this._bindingsIndicesByPath={};// inside: indices in these arrays var scope=this;this.stats={objects:{get total(){return scope._objects.length;},get inUse(){return this.total-scope.nCachedObjects_;}},get bindingsPerObject(){return scope._bindings.length;}};}Object.assign(AnimationObjectGroup.prototype,{isAnimationObjectGroup:true,add:function(){var objects=this._objects,nObjects=objects.length,nCachedObjects=this.nCachedObjects_,indicesByUUID=this._indicesByUUID,paths=this._paths,parsedPaths=this._parsedPaths,bindings=this._bindings,nBindings=bindings.length,knownObject=undefined;for(var i=0,n=arguments.length;i!==n;++i){var object=arguments[i],uuid=object.uuid,index=indicesByUUID[uuid];if(index===undefined){// unknown object -> add it to the ACTIVE region index=nObjects++;indicesByUUID[uuid]=index;objects.push(object);// accounting is done, now do the same for all bindings for(var j=0,m=nBindings;j!==m;++j){bindings[j].push(new PropertyBinding(object,paths[j],parsedPaths[j]));}}else if(index=nCachedObjects){// move existing object into the CACHED region var lastCachedIndex=nCachedObjects++,firstActiveObject=objects[lastCachedIndex];indicesByUUID[firstActiveObject.uuid]=index;objects[index]=firstActiveObject;indicesByUUID[uuid]=lastCachedIndex;objects[lastCachedIndex]=object;// accounting is done, now do the same for all bindings for(var j=0,m=nBindings;j!==m;++j){var bindingsForPath=bindings[j],firstActive=bindingsForPath[lastCachedIndex],binding=bindingsForPath[index];bindingsForPath[index]=firstActive;bindingsForPath[lastCachedIndex]=binding;}}}// for arguments this.nCachedObjects_=nCachedObjects;},// remove & forget uncache:function(){var objects=this._objects,nObjects=objects.length,nCachedObjects=this.nCachedObjects_,indicesByUUID=this._indicesByUUID,bindings=this._bindings,nBindings=bindings.length;for(var i=0,n=arguments.length;i!==n;++i){var object=arguments[i],uuid=object.uuid,index=indicesByUUID[uuid];if(index!==undefined){delete indicesByUUID[uuid];if(index zero effective time scale this.enabled=true;// false -> zero effective weight this.clampWhenFinished=false;// keep feeding the last frame? this.zeroSlopeAtStart=true;// for smooth interpolation w/o separate this.zeroSlopeAtEnd=true;// clips for start, loop and end }Object.assign(AnimationAction.prototype,{// State & Scheduling play:function(){this._mixer._activateAction(this);return this;},stop:function(){this._mixer._deactivateAction(this);return this.reset();},reset:function(){this.paused=false;this.enabled=true;this.time=0;// restart clip this._loopCount=-1;// forget previous loops this._startTime=null;// forget scheduling return this.stopFading().stopWarping();},isRunning:function(){return this.enabled&&!this.paused&&this.timeScale!==0&&this._startTime===null&&this._mixer._isActiveAction(this);},// return true when play has been called isScheduled:function(){return this._mixer._isActiveAction(this);},startAt:function(time){this._startTime=time;return this;},setLoop:function(mode,repetitions){this.loop=mode;this.repetitions=repetitions;return this;},// Weight // set the weight stopping any scheduled fading // although .enabled = false yields an effective weight of zero, this // method does *not* change .enabled, because it would be confusing setEffectiveWeight:function(weight){this.weight=weight;// note: same logic as when updated at runtime this._effectiveWeight=this.enabled?weight:0;return this.stopFading();},// return the weight considering fading and .enabled getEffectiveWeight:function(){return this._effectiveWeight;},fadeIn:function(duration){return this._scheduleFading(duration,0,1);},fadeOut:function(duration){return this._scheduleFading(duration,1,0);},crossFadeFrom:function(fadeOutAction,duration,warp){fadeOutAction.fadeOut(duration);this.fadeIn(duration);if(warp){var fadeInDuration=this._clip.duration,fadeOutDuration=fadeOutAction._clip.duration,startEndRatio=fadeOutDuration/fadeInDuration,endStartRatio=fadeInDuration/fadeOutDuration;fadeOutAction.warp(1.0,startEndRatio,duration);this.warp(endStartRatio,1.0,duration);}return this;},crossFadeTo:function(fadeInAction,duration,warp){return fadeInAction.crossFadeFrom(this,duration,warp);},stopFading:function(){var weightInterpolant=this._weightInterpolant;if(weightInterpolant!==null){this._weightInterpolant=null;this._mixer._takeBackControlInterpolant(weightInterpolant);}return this;},// Time Scale Control // set the time scale stopping any scheduled warping // although .paused = true yields an effective time scale of zero, this // method does *not* change .paused, because it would be confusing setEffectiveTimeScale:function(timeScale){this.timeScale=timeScale;this._effectiveTimeScale=this.paused?0:timeScale;return this.stopWarping();},// return the time scale considering warping and .paused getEffectiveTimeScale:function(){return this._effectiveTimeScale;},setDuration:function(duration){this.timeScale=this._clip.duration/duration;return this.stopWarping();},syncWith:function(action){this.time=action.time;this.timeScale=action.timeScale;return this.stopWarping();},halt:function(duration){return this.warp(this._effectiveTimeScale,0,duration);},warp:function(startTimeScale,endTimeScale,duration){var mixer=this._mixer,now=mixer.time,interpolant=this._timeScaleInterpolant,timeScale=this.timeScale;if(interpolant===null){interpolant=mixer._lendControlInterpolant();this._timeScaleInterpolant=interpolant;}var times=interpolant.parameterPositions,values=interpolant.sampleValues;times[0]=now;times[1]=now+duration;values[0]=startTimeScale/timeScale;values[1]=endTimeScale/timeScale;return this;},stopWarping:function(){var timeScaleInterpolant=this._timeScaleInterpolant;if(timeScaleInterpolant!==null){this._timeScaleInterpolant=null;this._mixer._takeBackControlInterpolant(timeScaleInterpolant);}return this;},// Object Accessors getMixer:function(){return this._mixer;},getClip:function(){return this._clip;},getRoot:function(){return this._localRoot||this._mixer._root;},// Interna _update:function(time,deltaTime,timeDirection,accuIndex){// called by the mixer if(!this.enabled){// call ._updateWeight() to update ._effectiveWeight this._updateWeight(time);return;}var startTime=this._startTime;if(startTime!==null){// check for scheduled start of action var timeRunning=(time-startTime)*timeDirection;if(timeRunning<0||timeDirection===0){return;// yet to come / don't decide when delta = 0 }// start this._startTime=null;// unschedule deltaTime=timeDirection*timeRunning;}// apply time scale and advance time deltaTime*=this._updateTimeScale(time);var clipTime=this._updateTime(deltaTime);// note: _updateTime may disable the action resulting in // an effective weight of 0 var weight=this._updateWeight(time);if(weight>0){var interpolants=this._interpolants;var propertyMixers=this._propertyBindings;for(var j=0,m=interpolants.length;j!==m;++j){interpolants[j].evaluate(clipTime);propertyMixers[j].accumulate(accuIndex,weight);}}},_updateWeight:function(time){var weight=0;if(this.enabled){weight=this.weight;var interpolant=this._weightInterpolant;if(interpolant!==null){var interpolantValue=interpolant.evaluate(time)[0];weight*=interpolantValue;if(time>interpolant.parameterPositions[1]){this.stopFading();if(interpolantValue===0){// faded out, disable this.enabled=false;}}}}this._effectiveWeight=weight;return weight;},_updateTimeScale:function(time){var timeScale=0;if(!this.paused){timeScale=this.timeScale;var interpolant=this._timeScaleInterpolant;if(interpolant!==null){var interpolantValue=interpolant.evaluate(time)[0];timeScale*=interpolantValue;if(time>interpolant.parameterPositions[1]){this.stopWarping();if(timeScale===0){// motion has halted, pause this.paused=true;}else{// warp done - apply final time scale this.timeScale=timeScale;}}}}this._effectiveTimeScale=timeScale;return timeScale;},_updateTime:function(deltaTime){var time=this.time+deltaTime;if(deltaTime===0)return time;var duration=this._clip.duration,loop=this.loop,loopCount=this._loopCount;if(loop===LoopOnce){if(loopCount===-1){// just started this._loopCount=0;this._setEndings(true,true,false);}handle_stop:{if(time>=duration){time=duration;}else if(time<0){time=0;}else break handle_stop;if(this.clampWhenFinished)this.paused=true;else this.enabled=false;this._mixer.dispatchEvent({type:'finished',action:this,direction:deltaTime<0?-1:1});}}else{// repetitive Repeat or PingPong var pingPong=loop===LoopPingPong;if(loopCount===-1){// just started if(deltaTime>=0){loopCount=0;this._setEndings(true,this.repetitions===0,pingPong);}else{// when looping in reverse direction, the initial // transition through zero counts as a repetition, // so leave loopCount at -1 this._setEndings(this.repetitions===0,true,pingPong);}}if(time>=duration||time<0){// wrap around var loopDelta=Math.floor(time/duration);// signed time-=duration*loopDelta;loopCount+=Math.abs(loopDelta);var pending=this.repetitions-loopCount;if(pending<=0){// have to stop (switch state, clamp time, fire event) if(this.clampWhenFinished)this.paused=true;else this.enabled=false;time=deltaTime>0?duration:0;this._mixer.dispatchEvent({type:'finished',action:this,direction:deltaTime>0?1:-1});}else{// keep running if(pending===1){// entering the last round var atStart=deltaTime<0;this._setEndings(atStart,!atStart,pingPong);}else{this._setEndings(false,false,pingPong);}this._loopCount=loopCount;this._mixer.dispatchEvent({type:'loop',action:this,loopDelta:loopDelta});}}if(pingPong&&(loopCount&1)===1){// invert time for the "pong round" this.time=time;return duration-time;}}this.time=time;return time;},_setEndings:function(atStart,atEnd,pingPong){var settings=this._interpolantSettings;if(pingPong){settings.endingStart=ZeroSlopeEnding;settings.endingEnd=ZeroSlopeEnding;}else{// assuming for LoopOnce atStart == atEnd == true if(atStart){settings.endingStart=this.zeroSlopeAtStart?ZeroSlopeEnding:ZeroCurvatureEnding;}else{settings.endingStart=WrapAroundEnding;}if(atEnd){settings.endingEnd=this.zeroSlopeAtEnd?ZeroSlopeEnding:ZeroCurvatureEnding;}else{settings.endingEnd=WrapAroundEnding;}}},_scheduleFading:function(duration,weightNow,weightThen){var mixer=this._mixer,now=mixer.time,interpolant=this._weightInterpolant;if(interpolant===null){interpolant=mixer._lendControlInterpolant();this._weightInterpolant=interpolant;}var times=interpolant.parameterPositions,values=interpolant.sampleValues;times[0]=now;values[0]=weightNow;times[1]=now+duration;values[1]=weightThen;return this;}});/** * * Player for AnimationClips. * * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ * @author tschw */function AnimationMixer(root){this._root=root;this._initMemoryManager();this._accuIndex=0;this.time=0;this.timeScale=1.0;}AnimationMixer.prototype=Object.assign(Object.create(EventDispatcher.prototype),{constructor:AnimationMixer,_bindAction:function(action,prototypeAction){var root=action._localRoot||this._root,tracks=action._clip.tracks,nTracks=tracks.length,bindings=action._propertyBindings,interpolants=action._interpolants,rootUuid=root.uuid,bindingsByRoot=this._bindingsByRootAndName,bindingsByName=bindingsByRoot[rootUuid];if(bindingsByName===undefined){bindingsByName={};bindingsByRoot[rootUuid]=bindingsByName;}for(var i=0;i!==nTracks;++i){var track=tracks[i],trackName=track.name,binding=bindingsByName[trackName];if(binding!==undefined){bindings[i]=binding;}else{binding=bindings[i];if(binding!==undefined){// existing binding, make sure the cache knows if(binding._cacheIndex===null){++binding.referenceCount;this._addInactiveBinding(binding,rootUuid,trackName);}continue;}var path=prototypeAction&&prototypeAction._propertyBindings[i].binding.parsedPath;binding=new PropertyMixer(PropertyBinding.create(root,trackName,path),track.ValueTypeName,track.getValueSize());++binding.referenceCount;this._addInactiveBinding(binding,rootUuid,trackName);bindings[i]=binding;}interpolants[i].resultBuffer=binding.buffer;}},_activateAction:function(action){if(!this._isActiveAction(action)){if(action._cacheIndex===null){// this action has been forgotten by the cache, but the user // appears to be still using it -> rebind var rootUuid=(action._localRoot||this._root).uuid,clipUuid=action._clip.uuid,actionsForClip=this._actionsByClip[clipUuid];this._bindAction(action,actionsForClip&&actionsForClip.knownActions[0]);this._addInactiveAction(action,clipUuid,rootUuid);}var bindings=action._propertyBindings;// increment reference counts / sort out state for(var i=0,n=bindings.length;i!==n;++i){var binding=bindings[i];if(binding.useCount++===0){this._lendBinding(binding);binding.saveOriginalState();}}this._lendAction(action);}},_deactivateAction:function(action){if(this._isActiveAction(action)){var bindings=action._propertyBindings;// decrement reference counts / sort out state for(var i=0,n=bindings.length;i!==n;++i){var binding=bindings[i];if(--binding.useCount===0){binding.restoreOriginalState();this._takeBackBinding(binding);}}this._takeBackAction(action);}},// Memory manager _initMemoryManager:function(){this._actions=[];// 'nActiveActions' followed by inactive ones this._nActiveActions=0;this._actionsByClip={};// inside: // { // knownActions: Array< AnimationAction > - used as prototypes // actionByRoot: AnimationAction - lookup // } this._bindings=[];// 'nActiveBindings' followed by inactive ones this._nActiveBindings=0;this._bindingsByRootAndName={};// inside: Map< name, PropertyMixer > this._controlInterpolants=[];// same game as above this._nActiveControlInterpolants=0;var scope=this;this.stats={actions:{get total(){return scope._actions.length;},get inUse(){return scope._nActiveActions;}},bindings:{get total(){return scope._bindings.length;},get inUse(){return scope._nActiveBindings;}},controlInterpolants:{get total(){return scope._controlInterpolants.length;},get inUse(){return scope._nActiveControlInterpolants;}}};},// Memory management for AnimationAction objects _isActiveAction:function(action){var index=action._cacheIndex;return index!==null&&index| inactive actions ] // s a // <-swap-> // a s var actions=this._actions,prevIndex=action._cacheIndex,lastActiveIndex=this._nActiveActions++,firstInactiveAction=actions[lastActiveIndex];action._cacheIndex=lastActiveIndex;actions[lastActiveIndex]=action;firstInactiveAction._cacheIndex=prevIndex;actions[prevIndex]=firstInactiveAction;},_takeBackAction:function(action){// [ active actions | inactive actions ] // [ active actions |< inactive actions ] // a s // <-swap-> // s a var actions=this._actions,prevIndex=action._cacheIndex,firstInactiveIndex=--this._nActiveActions,lastActiveAction=actions[firstInactiveIndex];action._cacheIndex=firstInactiveIndex;actions[firstInactiveIndex]=action;lastActiveAction._cacheIndex=prevIndex;actions[prevIndex]=lastActiveAction;},// Memory management for PropertyMixer objects _addInactiveBinding:function(binding,rootUuid,trackName){var bindingsByRoot=this._bindingsByRootAndName,bindingByName=bindingsByRoot[rootUuid],bindings=this._bindings;if(bindingByName===undefined){bindingByName={};bindingsByRoot[rootUuid]=bindingByName;}bindingByName[trackName]=binding;binding._cacheIndex=bindings.length;bindings.push(binding);},_removeInactiveBinding:function(binding){var bindings=this._bindings,propBinding=binding.binding,rootUuid=propBinding.rootNode.uuid,trackName=propBinding.path,bindingsByRoot=this._bindingsByRootAndName,bindingByName=bindingsByRoot[rootUuid],lastInactiveBinding=bindings[bindings.length-1],cacheIndex=binding._cacheIndex;lastInactiveBinding._cacheIndex=cacheIndex;bindings[cacheIndex]=lastInactiveBinding;bindings.pop();delete bindingByName[trackName];remove_empty_map:{for(var _ in bindingByName)break remove_empty_map;// eslint-disable-line no-unused-vars delete bindingsByRoot[rootUuid];}},_lendBinding:function(binding){var bindings=this._bindings,prevIndex=binding._cacheIndex,lastActiveIndex=this._nActiveBindings++,firstInactiveBinding=bindings[lastActiveIndex];binding._cacheIndex=lastActiveIndex;bindings[lastActiveIndex]=binding;firstInactiveBinding._cacheIndex=prevIndex;bindings[prevIndex]=firstInactiveBinding;},_takeBackBinding:function(binding){var bindings=this._bindings,prevIndex=binding._cacheIndex,firstInactiveIndex=--this._nActiveBindings,lastActiveBinding=bindings[firstInactiveIndex];binding._cacheIndex=firstInactiveIndex;bindings[firstInactiveIndex]=binding;lastActiveBinding._cacheIndex=prevIndex;bindings[prevIndex]=lastActiveBinding;},// Memory management of Interpolants for weight and time scale _lendControlInterpolant:function(){var interpolants=this._controlInterpolants,lastActiveIndex=this._nActiveControlInterpolants++,interpolant=interpolants[lastActiveIndex];if(interpolant===undefined){interpolant=new LinearInterpolant(new Float32Array(2),new Float32Array(2),1,this._controlInterpolantsResultBuffer);interpolant.__cacheIndex=lastActiveIndex;interpolants[lastActiveIndex]=interpolant;}return interpolant;},_takeBackControlInterpolant:function(interpolant){var interpolants=this._controlInterpolants,prevIndex=interpolant.__cacheIndex,firstInactiveIndex=--this._nActiveControlInterpolants,lastActiveInterpolant=interpolants[firstInactiveIndex];interpolant.__cacheIndex=firstInactiveIndex;interpolants[firstInactiveIndex]=interpolant;lastActiveInterpolant.__cacheIndex=prevIndex;interpolants[prevIndex]=lastActiveInterpolant;},_controlInterpolantsResultBuffer:new Float32Array(1),// return an action for a clip optionally using a custom root target // object (this method allocates a lot of dynamic memory in case a // previously unknown clip/root combination is specified) clipAction:function(clip,optionalRoot){var root=optionalRoot||this._root,rootUuid=root.uuid,clipObject=typeof clip==='string'?AnimationClip.findByName(root,clip):clip,clipUuid=clipObject!==null?clipObject.uuid:clip,actionsForClip=this._actionsByClip[clipUuid],prototypeAction=null;if(actionsForClip!==undefined){var existingAction=actionsForClip.actionByRoot[rootUuid];if(existingAction!==undefined){return existingAction;}// we know the clip, so we don't have to parse all // the bindings again but can just copy prototypeAction=actionsForClip.knownActions[0];// also, take the clip from the prototype action if(clipObject===null)clipObject=prototypeAction._clip;}// clip must be known when specified via string if(clipObject===null)return null;// allocate all resources required to run it var newAction=new AnimationAction(this,clipObject,optionalRoot);this._bindAction(newAction,prototypeAction);// and make the action known to the memory manager this._addInactiveAction(newAction,clipUuid,rootUuid);return newAction;},// get an existing action existingAction:function(clip,optionalRoot){var root=optionalRoot||this._root,rootUuid=root.uuid,clipObject=typeof clip==='string'?AnimationClip.findByName(root,clip):clip,clipUuid=clipObject?clipObject.uuid:clip,actionsForClip=this._actionsByClip[clipUuid];if(actionsForClip!==undefined){return actionsForClip.actionByRoot[rootUuid]||null;}return null;},// deactivates all previously scheduled actions stopAllAction:function(){var actions=this._actions,nActions=this._nActiveActions,bindings=this._bindings,nBindings=this._nActiveBindings;this._nActiveActions=0;this._nActiveBindings=0;for(var i=0;i!==nActions;++i){actions[i].reset();}for(var i=0;i!==nBindings;++i){bindings[i].useCount=0;}return this;},// advance the time and update apply the animation update:function(deltaTime){deltaTime*=this.timeScale;var actions=this._actions,nActions=this._nActiveActions,time=this.time+=deltaTime,timeDirection=Math.sign(deltaTime),accuIndex=this._accuIndex^=1;// run active actions for(var i=0;i!==nActions;++i){var action=actions[i];action._update(time,deltaTime,timeDirection,accuIndex);}// update scene graph var bindings=this._bindings,nBindings=this._nActiveBindings;for(var i=0;i!==nBindings;++i){bindings[i].apply(accuIndex);}return this;},// return this mixer's root target object getRoot:function(){return this._root;},// free all resources specific to a particular clip uncacheClip:function(clip){var actions=this._actions,clipUuid=clip.uuid,actionsByClip=this._actionsByClip,actionsForClip=actionsByClip[clipUuid];if(actionsForClip!==undefined){// note: just calling _removeInactiveAction would mess up the // iteration state and also require updating the state we can // just throw away var actionsToRemove=actionsForClip.knownActions;for(var i=0,n=actionsToRemove.length;i!==n;++i){var action=actionsToRemove[i];this._deactivateAction(action);var cacheIndex=action._cacheIndex,lastInactiveAction=actions[actions.length-1];action._cacheIndex=null;action._byClipCacheIndex=null;lastInactiveAction._cacheIndex=cacheIndex;actions[cacheIndex]=lastInactiveAction;actions.pop();this._removeInactiveBindingsForAction(action);}delete actionsByClip[clipUuid];}},// free all resources specific to a particular root target object uncacheRoot:function(root){var rootUuid=root.uuid,actionsByClip=this._actionsByClip;for(var clipUuid in actionsByClip){var actionByRoot=actionsByClip[clipUuid].actionByRoot,action=actionByRoot[rootUuid];if(action!==undefined){this._deactivateAction(action);this._removeInactiveAction(action);}}var bindingsByRoot=this._bindingsByRootAndName,bindingByName=bindingsByRoot[rootUuid];if(bindingByName!==undefined){for(var trackName in bindingByName){var binding=bindingByName[trackName];binding.restoreOriginalState();this._removeInactiveBinding(binding);}}},// remove a targeted clip from the cache uncacheAction:function(clip,optionalRoot){var action=this.existingAction(clip,optionalRoot);if(action!==null){this._deactivateAction(action);this._removeInactiveAction(action);}}});/** * @author mrdoob / http://mrdoob.com/ */function Uniform(value){if(typeof value==='string'){console.warn('THREE.Uniform: Type parameter is no longer needed.');value=arguments[1];}this.value=value;}Uniform.prototype.clone=function(){return new Uniform(this.value.clone===undefined?this.value:this.value.clone());};/** * @author benaadams / https://twitter.com/ben_a_adams */function InstancedBufferGeometry(){BufferGeometry.call(this);this.type='InstancedBufferGeometry';this.maxInstancedCount=undefined;}InstancedBufferGeometry.prototype=Object.assign(Object.create(BufferGeometry.prototype),{constructor:InstancedBufferGeometry,isInstancedBufferGeometry:true,copy:function(source){BufferGeometry.prototype.copy.call(this,source);this.maxInstancedCount=source.maxInstancedCount;return this;},clone:function(){return new this.constructor().copy(this);}});/** * @author benaadams / https://twitter.com/ben_a_adams */function InterleavedBufferAttribute(interleavedBuffer,itemSize,offset,normalized){this.data=interleavedBuffer;this.itemSize=itemSize;this.offset=offset;this.normalized=normalized===true;}Object.defineProperties(InterleavedBufferAttribute.prototype,{count:{get:function(){return this.data.count;}},array:{get:function(){return this.data.array;}}});Object.assign(InterleavedBufferAttribute.prototype,{isInterleavedBufferAttribute:true,setX:function(index,x){this.data.array[index*this.data.stride+this.offset]=x;return this;},setY:function(index,y){this.data.array[index*this.data.stride+this.offset+1]=y;return this;},setZ:function(index,z){this.data.array[index*this.data.stride+this.offset+2]=z;return this;},setW:function(index,w){this.data.array[index*this.data.stride+this.offset+3]=w;return this;},getX:function(index){return this.data.array[index*this.data.stride+this.offset];},getY:function(index){return this.data.array[index*this.data.stride+this.offset+1];},getZ:function(index){return this.data.array[index*this.data.stride+this.offset+2];},getW:function(index){return this.data.array[index*this.data.stride+this.offset+3];},setXY:function(index,x,y){index=index*this.data.stride+this.offset;this.data.array[index+0]=x;this.data.array[index+1]=y;return this;},setXYZ:function(index,x,y,z){index=index*this.data.stride+this.offset;this.data.array[index+0]=x;this.data.array[index+1]=y;this.data.array[index+2]=z;return this;},setXYZW:function(index,x,y,z,w){index=index*this.data.stride+this.offset;this.data.array[index+0]=x;this.data.array[index+1]=y;this.data.array[index+2]=z;this.data.array[index+3]=w;return this;}});/** * @author benaadams / https://twitter.com/ben_a_adams */function InterleavedBuffer(array,stride){this.array=array;this.stride=stride;this.count=array!==undefined?array.length/stride:0;this.dynamic=false;this.updateRange={offset:0,count:-1};this.version=0;}Object.defineProperty(InterleavedBuffer.prototype,'needsUpdate',{set:function(value){if(value===true)this.version++;}});Object.assign(InterleavedBuffer.prototype,{isInterleavedBuffer:true,onUploadCallback:function(){},setArray:function(array){if(Array.isArray(array)){throw new TypeError('THREE.BufferAttribute: array should be a Typed Array.');}this.count=array!==undefined?array.length/this.stride:0;this.array=array;return this;},setDynamic:function(value){this.dynamic=value;return this;},copy:function(source){this.array=new source.array.constructor(source.array);this.count=source.count;this.stride=source.stride;this.dynamic=source.dynamic;return this;},copyAt:function(index1,attribute,index2){index1*=this.stride;index2*=attribute.stride;for(var i=0,l=this.stride;ithis.max.x||point.ythis.max.y?false:true;},containsBox:function(box){return this.min.x<=box.min.x&&box.max.x<=this.max.x&&this.min.y<=box.min.y&&box.max.y<=this.max.y;},getParameter:function(point,target){// This can potentially have a divide by zero if the box // has a size dimension of 0. if(target===undefined){console.warn('THREE.Box2: .getParameter() target is now required');target=new Vector2();}return target.set((point.x-this.min.x)/(this.max.x-this.min.x),(point.y-this.min.y)/(this.max.y-this.min.y));},intersectsBox:function(box){// using 4 splitting planes to rule out intersections return box.max.xthis.max.x||box.max.ythis.max.y?false:true;},clampPoint:function(point,target){if(target===undefined){console.warn('THREE.Box2: .clampPoint() target is now required');target=new Vector2();}return target.copy(point).clamp(this.min,this.max);},distanceToPoint:function(){var v1=new Vector2();return function distanceToPoint(point){var clampedPoint=v1.copy(point).clamp(this.min,this.max);return clampedPoint.sub(point).length();};}(),intersect:function(box){this.min.max(box.min);this.max.min(box.max);return this;},union:function(box){this.min.min(box.min);this.max.max(box.max);return this;},translate:function(offset){this.min.add(offset);this.max.add(offset);return this;},equals:function(box){return box.min.equals(this.min)&&box.max.equals(this.max);}});/** * @author alteredq / http://alteredqualia.com/ */function ImmediateRenderObject(material){Object3D.call(this);this.material=material;this.render=function()/* renderCallback */{};}ImmediateRenderObject.prototype=Object.create(Object3D.prototype);ImmediateRenderObject.prototype.constructor=ImmediateRenderObject;ImmediateRenderObject.prototype.isImmediateRenderObject=true;/** * @author mrdoob / http://mrdoob.com/ * @author WestLangley / http://github.com/WestLangley */function VertexNormalsHelper(object,size,hex,linewidth){this.object=object;this.size=size!==undefined?size:1;var color=hex!==undefined?hex:0xff0000;var width=linewidth!==undefined?linewidth:1;// var nNormals=0;var objGeometry=this.object.geometry;if(objGeometry&&objGeometry.isGeometry){nNormals=objGeometry.faces.length*3;}else if(objGeometry&&objGeometry.isBufferGeometry){nNormals=objGeometry.attributes.normal.count;}// var geometry=new BufferGeometry();var positions=new Float32BufferAttribute(nNormals*2*3,3);geometry.addAttribute('position',positions);LineSegments.call(this,geometry,new LineBasicMaterial({color:color,linewidth:width}));// this.matrixAutoUpdate=false;this.update();}VertexNormalsHelper.prototype=Object.create(LineSegments.prototype);VertexNormalsHelper.prototype.constructor=VertexNormalsHelper;VertexNormalsHelper.prototype.update=function(){var v1=new Vector3();var v2=new Vector3();var normalMatrix=new Matrix3();return function update(){var keys=['a','b','c'];this.object.updateMatrixWorld(true);normalMatrix.getNormalMatrix(this.object.matrixWorld);var matrixWorld=this.object.matrixWorld;var position=this.geometry.attributes.position;// var objGeometry=this.object.geometry;if(objGeometry&&objGeometry.isGeometry){var vertices=objGeometry.vertices;var faces=objGeometry.faces;var idx=0;for(var i=0,l=faces.length;i0.99999){this.quaternion.set(0,0,0,1);}else if(dir.y<-0.99999){this.quaternion.set(1,0,0,0);}else{axis.set(dir.z,0,-dir.x).normalize();radians=Math.acos(dir.y);this.quaternion.setFromAxisAngle(axis,radians);}};}();ArrowHelper.prototype.setLength=function(length,headLength,headWidth){if(headLength===undefined)headLength=0.2*length;if(headWidth===undefined)headWidth=0.2*headLength;this.line.scale.set(1,Math.max(0,length-headLength),1);this.line.updateMatrix();this.cone.scale.set(headWidth,headLength,headWidth);this.cone.position.y=length;this.cone.updateMatrix();};ArrowHelper.prototype.setColor=function(color){this.line.material.color.copy(color);this.cone.material.color.copy(color);};/** * @author sroucheray / http://sroucheray.org/ * @author mrdoob / http://mrdoob.com/ */function AxesHelper(size){size=size||1;var vertices=[0,0,0,size,0,0,0,0,0,0,size,0,0,0,0,0,0,size];var colors=[1,0,0,1,0.6,0,0,1,0,0.6,1,0,0,0,1,0,0.6,1];var geometry=new BufferGeometry();geometry.addAttribute('position',new Float32BufferAttribute(vertices,3));geometry.addAttribute('color',new Float32BufferAttribute(colors,3));var material=new LineBasicMaterial({vertexColors:VertexColors});LineSegments.call(this,geometry,material);}AxesHelper.prototype=Object.create(LineSegments.prototype);AxesHelper.prototype.constructor=AxesHelper;// Curve.create=function(construct,getPoint){console.log('THREE.Curve.create() has been deprecated');construct.prototype=Object.create(Curve.prototype);construct.prototype.constructor=construct;construct.prototype.getPoint=getPoint;return construct;};// Object.assign(CurvePath.prototype,{createPointsGeometry:function(divisions){console.warn('THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.');// generate geometry from path points (for Line or Points objects) var pts=this.getPoints(divisions);return this.createGeometry(pts);},createSpacedPointsGeometry:function(divisions){console.warn('THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.');// generate geometry from equidistant sampling along the path var pts=this.getSpacedPoints(divisions);return this.createGeometry(pts);},createGeometry:function(points){console.warn('THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.');var geometry=new Geometry();for(var i=0,l=points.length;i0?e.slice(0,e.length):e,i=0,j;while(j=list[i++])j[0].apply(j[1],empty.slice.call(arguments,1));return target;};};// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) _export(_export.S,'Object',{create:_objectCreate});var $Object$2=_core.Object;var create=function create(P,D){return $Object$2.create(P,D);};var create$1=create;var _validateCollection=function(it,TYPE){if(!_isObject(it)||it._t!==TYPE)throw TypeError('Incompatible receiver, '+TYPE+' required!');return it;};var dP$2=_objectDp.f;var fastKey=_meta.fastKey;var SIZE=_descriptors?'_s':'size';var getEntry=function(that,key){// fast case var index=fastKey(key);var entry;if(index!=='F')return that._i[index];// frozen object case for(entry=that._f;entry;entry=entry.n){if(entry.k==key)return entry;}};var _collectionStrong={getConstructor:function(wrapper,NAME,IS_MAP,ADDER){var C=wrapper(function(that,iterable){_anInstance(that,C,NAME,'_i');that._t=NAME;// collection type that._i=_objectCreate(null);// index that._f=undefined;// first entry that._l=undefined;// last entry that[SIZE]=0;// size if(iterable!=undefined)_forOf(iterable,IS_MAP,that[ADDER],that);});_redefineAll(C.prototype,{// 23.1.3.1 Map.prototype.clear() // 23.2.3.2 Set.prototype.clear() clear:function clear(){for(var that=_validateCollection(this,NAME),data=that._i,entry=that._f;entry;entry=entry.n){entry.r=true;if(entry.p)entry.p=entry.p.n=undefined;delete data[entry.i];}that._f=that._l=undefined;that[SIZE]=0;},// 23.1.3.3 Map.prototype.delete(key) // 23.2.3.4 Set.prototype.delete(value) 'delete':function(key){var that=_validateCollection(this,NAME);var entry=getEntry(that,key);if(entry){var next=entry.n;var prev=entry.p;delete that._i[entry.i];entry.r=true;if(prev)prev.n=next;if(next)next.p=prev;if(that._f==entry)that._f=next;if(that._l==entry)that._l=prev;that[SIZE]--;}return !!entry;},// 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined) // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined) forEach:function forEach(callbackfn/* , that = undefined */){_validateCollection(this,NAME);var f=_ctx(callbackfn,arguments.length>1?arguments[1]:undefined,3);var entry;while(entry=entry?entry.n:this._f){f(entry.v,entry.k,this);// revert to the last existing entry while(entry&&entry.r)entry=entry.p;}},// 23.1.3.7 Map.prototype.has(key) // 23.2.3.7 Set.prototype.has(value) has:function has(key){return !!getEntry(_validateCollection(this,NAME),key);}});if(_descriptors)dP$2(C.prototype,'size',{get:function(){return _validateCollection(this,NAME)[SIZE];}});return C;},def:function(that,key,value){var entry=getEntry(that,key);var prev,index;// change existing entry if(entry){entry.v=value;// create new entry }else{that._l=entry={i:index=fastKey(key,true),// <- index k:key,// <- key v:value,// <- value p:prev=that._l,// <- previous entry n:undefined,// <- next entry r:false// <- removed };if(!that._f)that._f=entry;if(prev)prev.n=entry;that[SIZE]++;// add to index if(index!=='F')that._i[index]=entry;}return that;},getEntry:getEntry,setStrong:function(C,NAME,IS_MAP){// add .keys, .values, .entries, [@@iterator] // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11 _iterDefine(C,NAME,function(iterated,kind){this._t=_validateCollection(iterated,NAME);// target this._k=kind;// kind this._l=undefined;// previous },function(){var that=this;var kind=that._k;var entry=that._l;// revert to the last existing entry while(entry&&entry.r)entry=entry.p;// get next entry if(!that._t||!(that._l=entry=entry?entry.n:that._t._f)){// or finish the iteration that._t=undefined;return _iterStep(1);}// return step by kind if(kind=='keys')return _iterStep(0,entry.k);if(kind=='values')return _iterStep(0,entry.v);return _iterStep(0,[entry.k,entry.v]);},IS_MAP?'entries':'values',!IS_MAP,true);// add [@@species], 23.1.2.2, 23.2.2.2 _setSpecies(NAME);}};var SPECIES$2=_wks('species');var _arraySpeciesConstructor=function(original){var C;if(_isArray(original)){C=original.constructor;// cross-realm fallback if(typeof C=='function'&&(C===Array||_isArray(C.prototype)))C=undefined;if(_isObject(C)){C=C[SPECIES$2];if(C===null)C=undefined;}}return C===undefined?Array:C;};// 9.4.2.3 ArraySpeciesCreate(originalArray, length) var _arraySpeciesCreate=function(original,length){return new(_arraySpeciesConstructor(original))(length);};// 0 -> Array#forEach // 1 -> Array#map // 2 -> Array#filter // 3 -> Array#some // 4 -> Array#every // 5 -> Array#find // 6 -> Array#findIndex var _arrayMethods=function(TYPE,$create){var IS_MAP=TYPE==1;var IS_FILTER=TYPE==2;var IS_SOME=TYPE==3;var IS_EVERY=TYPE==4;var IS_FIND_INDEX=TYPE==6;var NO_HOLES=TYPE==5||IS_FIND_INDEX;var create=$create||_arraySpeciesCreate;return function($this,callbackfn,that){var O=_toObject($this);var self=_iobject(O);var f=_ctx(callbackfn,that,3);var length=_toLength(self.length);var index=0;var result=IS_MAP?create($this,length):IS_FILTER?create($this,0):undefined;var val,res;for(;length>index;index++)if(NO_HOLES||index in self){val=self[index];res=f(val,index,O);if(TYPE){if(IS_MAP)result[index]=res;// map else if(res)switch(TYPE){case 3:return true;// some case 5:return val;// find case 6:return index;// findIndex case 2:result.push(val);// filter }else if(IS_EVERY)return false;// every }}return IS_FIND_INDEX?-1:IS_SOME||IS_EVERY?IS_EVERY:result;};};var dP$3=_objectDp.f;var each=_arrayMethods(0);var _collection=function(NAME,wrapper,methods,common,IS_MAP,IS_WEAK){var Base=_global[NAME];var C=Base;var ADDER=IS_MAP?'set':'add';var proto=C&&C.prototype;var O={};if(!_descriptors||typeof C!='function'||!(IS_WEAK||proto.forEach&&!_fails(function(){new C().entries().next();}))){// create collection constructor C=common.getConstructor(wrapper,NAME,IS_MAP,ADDER);_redefineAll(C.prototype,methods);_meta.NEED=true;}else{C=wrapper(function(target,iterable){_anInstance(target,C,NAME,'_c');target._c=new Base();if(iterable!=undefined)_forOf(iterable,IS_MAP,target[ADDER],target);});each('add,clear,delete,forEach,get,has,set,keys,values,entries,toJSON'.split(','),function(KEY){var IS_ADDER=KEY=='add'||KEY=='set';if(KEY in proto&&!(IS_WEAK&&KEY=='clear'))_hide(C.prototype,KEY,function(a,b){_anInstance(this,C,KEY);if(!IS_ADDER&&IS_WEAK&&!_isObject(a))return KEY=='get'?undefined:false;var result=this._c[KEY](a===0?0:a,b);return IS_ADDER?this:result;});});IS_WEAK||dP$3(C.prototype,'size',{get:function(){return this._c.size;}});}_setToStringTag(C,NAME);O[NAME]=C;_export(_export.G+_export.W+_export.F,O);if(!IS_WEAK)common.setStrong(C,NAME,IS_MAP);return C;};var MAP='Map';// 23.1 Map Objects var es6_map=_collection(MAP,function(get){return function Map(){return get(this,arguments.length>0?arguments[0]:undefined);};},{// 23.1.3.6 Map.prototype.get(key) get:function get(key){var entry=_collectionStrong.getEntry(_validateCollection(this,MAP),key);return entry&&entry.v;},// 23.1.3.9 Map.prototype.set(key, value) set:function set(key,value){return _collectionStrong.def(_validateCollection(this,MAP),key===0?0:key,value);}},_collectionStrong,true);var _arrayFromIterable=function(iter,ITERATOR){var result=[];_forOf(iter,false,result.push,result,ITERATOR);return result;};// https://github.com/DavidBruant/Map-Set.prototype.toJSON var _collectionToJson=function(NAME){return function toJSON(){if(_classof(this)!=NAME)throw TypeError(NAME+"#toJSON isn't generic");return _arrayFromIterable(this);};};// https://github.com/DavidBruant/Map-Set.prototype.toJSON _export(_export.P+_export.R,'Map',{toJSON:_collectionToJson('Map')});// https://tc39.github.io/proposal-setmap-offrom/ var _setCollectionOf=function(COLLECTION){_export(_export.S,COLLECTION,{of:function of(){var length=arguments.length;var A=new Array(length);while(length--)A[length]=arguments[length];return new this(A);}});};// https://tc39.github.io/proposal-setmap-offrom/#sec-map.of _setCollectionOf('Map');// https://tc39.github.io/proposal-setmap-offrom/ var _setCollectionFrom=function(COLLECTION){_export(_export.S,COLLECTION,{from:function from(source/* , mapFn, thisArg */){var mapFn=arguments[1];var mapping,A,n,cb;_aFunction(this);mapping=mapFn!==undefined;if(mapping)_aFunction(mapFn);if(source==undefined)return new this();A=[];if(mapping){n=0;cb=_ctx(mapFn,arguments[2],2);_forOf(source,false,function(nextItem){A.push(cb(nextItem,n++));});}else{_forOf(source,false,A.push,A);}return new this(A);}});};// https://tc39.github.io/proposal-setmap-offrom/#sec-map.from _setCollectionFrom('Map');var map=_core.Map;var map$1=map;var arraySlice=[].slice;var factories={};var construct=function(F,len,args){if(!(len in factories)){for(var n=[],i=0;i3&&arguments[3]!==undefined?arguments[3]:false;classCallCheck(this,DependencyError);_this2=possibleConstructorReturn(this,getPrototypeOf$2(DependencyError).call(this,"@".concat(classInstance,": ").concat(message)));var stackArray=_this2.stack.split('\n');stackArray.splice(1,2);_this2.stack=stackArray.join('\n');if(console)console.error('Active module:',activeModule);if(console&&dependencyModule)console.error('Dependency published by module:',dependencyModule);_this2.name='DependencyError';return _this2;}inherits(DependencyError,_Error2);return DependencyError;}(wrapNativeSuper(Error));var ManagerError=/*#__PURE__*/function(_Error3){function ManagerError(classInstance,message,component){var _this3;var activeModule=arguments.length>3&&arguments[3]!==undefined?arguments[3]:false;classCallCheck(this,ManagerError);_this3=possibleConstructorReturn(this,getPrototypeOf$2(ManagerError).call(this,"@".concat(classInstance,": ").concat(message)));var stackArray=_this3.stack.split('\n');stackArray.splice(1,2);_this3.stack=stackArray.join('\n');if(console)console.error('Component:',component);if(console&&activeModule)console.error('Active module:',activeModule);_this3.name='ManagerError';return _this3;}inherits(ManagerError,_Error3);return ManagerError;}(wrapNativeSuper(Error));var warnDeps=function warnDeps(){throw new Error('WhitestormJS Framework requ ires Three.js r92. https://threejs.org/');};try{}catch(err){warnDeps();}/** * @class ModuleSystem * @category core * @description Provides API for classes that will use Modules.
* This class includes basic event system with those supported methods: *
.on()
.off()
.emit()
* @extends Events * @memberof module:core */var ModuleSystem=/*#__PURE__*/function(_Events){function ModuleSystem(){classCallCheck(this,ModuleSystem);return possibleConstructorReturn(this,getPrototypeOf$2(ModuleSystem).apply(this,arguments));}createClass(ModuleSystem,[{key:"integrateModules",// INTEGRATING /** * @method integrateModules * @instance * @description This method applies all modules from .modules collection. * @param {Object} [source] If source (should be a component) is provided, will replace .modules with source's one before executing modules. * @memberof module:core.ModuleSystem */value:function integrateModules(source){if(!this.modules&&!source)return;if(source&&source.modules)this.modules=source.modules.slice(0);if(this.modules){for(var i=0,max=this.modules.length;i0&&arguments[0]!==undefined?arguments[0]:{};var modules=this.modules;if(!modules)return bridgeMap;for(var i=0,max=modules.length;i func.apply(this, [moduleScope])] How the function is wrapped/ * @memberof module:core.ModuleSystem */},{key:"applyCommand",value:function applyCommand(name){var _this=this;var cb=arguments.length>1&&arguments[1]!==undefined?arguments[1]:function(func,moduleScope){return func.apply(_this,[moduleScope]);};var modules=this.modules;if(!modules)return;for(var i=0,max=modules.length;i1&&arguments[1]!==undefined?arguments[1]:true;if(!module)return;if(push&&this.modules)this.modules.push(module);else if(push)this.modules=[module];if(this.manager)this.manager.active(module);if(module.manager&&this.manager)module.manager(this.manager);else if(module.manager){throw new ManagerError('Component',"Module requires ModuleManager that is turned off for this component",this,module);}if(module.integrate)module.integrate.bind(this)(module);return module;}/** * @method disposeModules * @instance * @description Disposes of all modules * @memberof module:core.ModuleSystem */},{key:"disposeModules",value:function disposeModules(){while(this.modules.length){this.disposeModule(this.modules[0]);}}/** * @method disposeModule * @instance * @description Disposes of the given module * @param {Object} module the module to dispose * @return {Module} Returns module that was removed. * @memberof module:core.ModuleSystem */},{key:"disposeModule",value:function disposeModule(module){if(!module)return;this.modules.splice(this.modules.indexOf(module),1);if(module.dispose)module.dispose.bind(this)(module);return module;}// PIPED METHOD /** * @method module * @instance * @description piped version of .applyModule(). * @param {Object} module the module to apply * @return {this} returns this - app/component * @throws {ManagerError} * @memberof module:core.ModuleSystem * @example Piped modules * component * .module(new Module1()) * .module(new Module2()) * .module(new Module3()) */},{key:"module",value:function module(_module){this.applyModule(_module);return this;}}]);inherits(ModuleSystem,_Events);return ModuleSystem;}(minivents_commonjs);function _arrayWithHoles$1(arr){if(Array.isArray(arr))return arr;}var arrayWithHoles=_arrayWithHoles$1;var core_getIterator=_core.getIterator=function(it){var iterFn=core_getIteratorMethod(it);if(typeof iterFn!='function')throw TypeError(it+' is not iterable!');return _anObject(iterFn.call(it));};var getIterator=core_getIterator;var getIterator$1=getIterator;function _iterableToArrayLimit$1(arr,i){var _arr=[];var _n=true;var _d=false;var _e=undefined;try{for(var _i=getIterator$1(arr),_s;!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break;}}catch(err){_d=true;_e=err;}finally{try{if(!_n&&_i["return"]!=null)_i["return"]();}finally{if(_d)throw _e;}}return _arr;}var iterableToArrayLimit=_iterableToArrayLimit$1;function _nonIterableRest$1(){throw new TypeError("Invalid attempt to destructure non-iterable instance");}var nonIterableRest=_nonIterableRest$1;function _slicedToArray$1(arr,i){return arrayWithHoles(arr)||iterableToArrayLimit(arr,i)||nonIterableRest();}var slicedToArray=_slicedToArray$1;function symbolObservablePonyfill(root){var result;var Symbol=root.Symbol;if(typeof Symbol==='function'){if(Symbol.observable){result=Symbol.observable;}else{result=Symbol('observable');Symbol.observable=result;}}else{result='@@observable';}return result;}/* global window */var root;if(typeof self!=='undefined'){root=self;}else if(typeof window!=='undefined'){root=window;}else if(typeof global!=='undefined'){root=global;}else if(typeof module!=='undefined'){root=module;}else{root=Function('return this')();}var result=symbolObservablePonyfill(root);/** * These are private action types reserved by Redux. * For any unknown actions, you must return the current state. * If the current state is undefined, you must return the initial state. * Do not reference these action types directly in your code. */var ActionTypes={INIT:'@@redux/INIT'+Math.random().toString(36).substring(7).split('').join('.'),REPLACE:'@@redux/REPLACE'+Math.random().toString(36).substring(7).split('').join('.')};var _typeof$1=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj;}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj;};/** * @param {any} obj The object to inspect. * @returns {boolean} True if the argument appears to be a plain object. */function isPlainObject(obj){if((typeof obj==='undefined'?'undefined':_typeof$1(obj))!=='object'||obj===null)return false;var proto=obj;while(Object.getPrototypeOf(proto)!==null){proto=Object.getPrototypeOf(proto);}return Object.getPrototypeOf(obj)===proto;}/** * Creates a Redux store that holds the state tree. * The only way to change the data in the store is to call `dispatch()` on it. * * There should only be a single store in your app. To specify how different * parts of the state tree respond to actions, you may combine several reducers * into a single reducer function by using `combineReducers`. * * @param {Function} reducer A function that returns the next state tree, given * the current state tree and the action to handle. * * @param {any} [preloadedState] The initial state. You may optionally specify it * to hydrate the state from the server in universal apps, or to restore a * previously serialized user session. * If you use `combineReducers` to produce the root reducer function, this must be * an object with the same shape as `combineReducers` keys. * * @param {Function} [enhancer] The store enhancer. You may optionally specify it * to enhance the store with third-party capabilities such as middleware, * time travel, persistence, etc. The only store enhancer that ships with Redux * is `applyMiddleware()`. * * @returns {Store} A Redux store that lets you read the state, dispatch actions * and subscribe to changes. */function createStore(reducer,preloadedState,enhancer){var _ref2;if(typeof preloadedState==='function'&&typeof enhancer==='undefined'){enhancer=preloadedState;preloadedState=undefined;}if(typeof enhancer!=='undefined'){if(typeof enhancer!=='function'){throw new Error('Expected the enhancer to be a function.');}return enhancer(createStore)(reducer,preloadedState);}if(typeof reducer!=='function'){throw new Error('Expected the reducer to be a function.');}var currentReducer=reducer;var currentState=preloadedState;var currentListeners=[];var nextListeners=currentListeners;var isDispatching=false;function ensureCanMutateNextListeners(){if(nextListeners===currentListeners){nextListeners=currentListeners.slice();}}/** * Reads the state tree managed by the store. * * @returns {any} The current state tree of your application. */function getState(){if(isDispatching){throw new Error('You may not call store.getState() while the reducer is executing. '+'The reducer has already received the state as an argument. '+'Pass it down from the top reducer instead of reading it from the store.');}return currentState;}/** * Adds a change listener. It will be called any time an action is dispatched, * and some part of the state tree may potentially have changed. You may then * call `getState()` to read the current state tree inside the callback. * * You may call `dispatch()` from a change listener, with the following * caveats: * * 1. The subscriptions are snapshotted just before every `dispatch()` call. * If you subscribe or unsubscribe while the listeners are being invoked, this * will not have any effect on the `dispatch()` that is currently in progress. * However, the next `dispatch()` call, whether nested or not, will use a more * recent snapshot of the subscription list. * * 2. The listener should not expect to see all state changes, as the state * might have been updated multiple times during a nested `dispatch()` before * the listener is called. It is, however, guaranteed that all subscribers * registered before the `dispatch()` started will be called with the latest * state by the time it exits. * * @param {Function} listener A callback to be invoked on every dispatch. * @returns {Function} A function to remove this change listener. */function subscribe(listener){if(typeof listener!=='function'){throw new Error('Expected the listener to be a function.');}if(isDispatching){throw new Error('You may not call store.subscribe() while the reducer is executing. '+'If you would like to be notified after the store has been updated, subscribe from a '+'component and invoke store.getState() in the callback to access the latest state. '+'See https://redux.js.org/api-reference/store#subscribe(listener) for more details.');}var isSubscribed=true;ensureCanMutateNextListeners();nextListeners.push(listener);return function unsubscribe(){if(!isSubscribed){return;}if(isDispatching){throw new Error('You may not unsubscribe from a store listener while the reducer is executing. '+'See https://redux.js.org/api-reference/store#subscribe(listener) for more details.');}isSubscribed=false;ensureCanMutateNextListeners();var index=nextListeners.indexOf(listener);nextListeners.splice(index,1);};}/** * Dispatches an action. It is the only way to trigger a state change. * * The `reducer` function, used to create the store, will be called with the * current state tree and the given `action`. Its return value will * be considered the **next** state of the tree, and the change listeners * will be notified. * * The base implementation only supports plain object actions. If you want to * dispatch a Promise, an Observable, a thunk, or something else, you need to * wrap your store creating function into the corresponding middleware. For * example, see the documentation for the `redux-thunk` package. Even the * middleware will eventually dispatch plain object actions using this method. * * @param {Object} action A plain object representing “what changed”. It is * a good idea to keep actions serializable so you can record and replay user * sessions, or use the time travelling `redux-devtools`. An action must have * a `type` property which may not be `undefined`. It is a good idea to use * string constants for action types. * * @returns {Object} For convenience, the same action object you dispatched. * * Note that, if you use a custom middleware, it may wrap `dispatch()` to * return something else (for example, a Promise you can await). */function dispatch(action){if(!isPlainObject(action)){throw new Error('Actions must be plain objects. '+'Use custom middleware for async actions.');}if(typeof action.type==='undefined'){throw new Error('Actions may not have an undefined "type" property. '+'Have you misspelled a constant?');}if(isDispatching){throw new Error('Reducers may not dispatch actions.');}try{isDispatching=true;currentState=currentReducer(currentState,action);}finally{isDispatching=false;}var listeners=currentListeners=nextListeners;for(var i=0;i0&&arguments[0]!==undefined?arguments[0]:[{},''];var action=arguments.length>1?arguments[1]:undefined;state[0][action.key]=action.data;state[1]=action.key;return state;});this.modules={};}/** * @method active * @instance * @description Sets .currentModule to provided module. * @param {Object} module the module to make current * @memberof module:core.ModuleManager */createClass(ModuleManager,[{key:"active",value:function active(module){this.currentModule=module;}/** * @method reset * @instance * @description Set's .currentModule to null. * @memberof module:core.ModuleManager */},{key:"reset",value:function reset(){this.currentModule=null;}/** * @method define * @instance * @description Define the module in manager * @param name The module name * @memberof module:core.ModuleManager */},{key:"define",value:function define(name){this.modules[name]=this.currentModule;}/** * @method use * @instance * @description Get the defined module from manager * @param name The module name * @memberof module:core.ModuleManager */},{key:"use",value:function use(name){return this.modules[name];}/** * @method set * @instance * @description An alias for .add()

* Use this method if you know that you will overwrite existing dependency.
* Use it in your app, but not in module that you provide to other people. * @param {String} key the key of the dependency * @param {Object} data the value of the dependency * @memberof module:core.ModuleManager */},{key:"set",value:function set(key,data){this.store.dispatch({type:'ADD',key:key,data:data});}/** * @method get * @instance * @description Returns dependency in store object, by key. * @param {String} key the key of the dependency * @memberof module:core.ModuleManager * @return {Object|Module} * @throws {DependencyError} if dependency is not in the store * @example Get the 'hello' dependency * manager.get('hello'); // -> {world: true} */},{key:"get",value:function get(key){if(!this.store.getState()[0][key]){throw new DependencyError('ModuleManager',"Module requires '".concat(key,"' dependency"),this.currentModule);}return this.store.getState()[0][key];}/** * @method has * @instance * @description Returns whether manager has a dependency with the given key * @param {String} key the key of the dependency * @memberof module:core.ModuleManager * @return {Boolean} Promise that is resolved when all promises completed. * @example Check whether the store has the 'hello' dependency * manager.has('hello'); // -> true */},{key:"has",value:function has(key){return Boolean(this.store.getState()[0][key]);}/** * @method update * @instance * @description Updates deps * @param {Object} [depsMap={}] * @memberof module:core.ModuleManager */},{key:"update",value:function update(){var _this=this;var depsMap=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};this.store.subscribe(function(){var _this$store$getState=_this.store.getState(),_this$store$getState2=slicedToArray(_this$store$getState,2),data=_this$store$getState2[0],changedKey=_this$store$getState2[1];var callback=depsMap[changedKey];if(callback)callback(data[changedKey]);});}/** * @method add * @alias module:core.ModuleManager#set * @memberof module:core.ModuleManager */},{key:"add",value:function add(){console.warn('.add() method is deprecated. Use .set() instead');return this.set.apply(this,arguments);}/** * @method require * @instance * @description Require module * @param {String} name Defined name * @param {Function} moduleExecutor Function that returns applied module * @memberof module:core.ModuleManager */},{key:"require",value:function require(name,moduleExecutor){if(this.use(name)===undefined)this.handler.applyModule(moduleExecutor());}}]);return ModuleManager;}();/** * @class Component * @category core * @param {Object} [params] - The parameters object. * @param {Object} [instructions] - The instructions object. * @extends ModuleSystem * @memberof module:core */var Component=/*#__PURE__*/function(_ModuleSystem){/** * Default values for parameters * @member {Object} module:core.Component#defaults * @static * @default { * modules: [], * manager: true * } */ /** * Static instructions * @member {Object} module:core.Component#instructions * @static * @default {} */ /** * Array of promises that should be resolved before Component is ready. * @member {Array} module:core.Component#_wait * @private */ // Collection of promises; /** * Collection of `modules`. * @member {Array} module:core.Component#modules * @public */ // Collection of modules; /** * Collection of `child` Components. * @member {Array} module:core.Component#children * @public */ // For keeping children components; function Component(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var defaults=arguments.length>1&&arguments[1]!==undefined?arguments[1]:Component.defaults;var instructions=arguments.length>2&&arguments[2]!==undefined?arguments[2]:Component.instructions;classCallCheck(this,Component);_this=possibleConstructorReturn(this,getPrototypeOf$2(Component).call(this));// Apply polyfilled parameters to .params; defineProperty$3(defineProperty$3(defineProperty$3(assertThisInitialized(assertThisInitialized(_this)),"_wait",[]),"modules",[]),"children",[]);_this.params=extend(transformData(params,instructions),defaults);if(_this.params.manager)_this.manager=new ModuleManager(assertThisInitialized(assertThisInitialized(_this)));_this.modules=_this.params.modules;_this.integrateModules();return _this;}/** * @method wait * @instance * @description Wait for a promise. * @param {Promise} [promise] - The promise that should be added to a queue. * @return {Promise} Promise that is resolved when all promises completed. * @memberof module:core.Component */createClass(Component,[{key:"wait",value:function wait(promise){if(promise)this._wait.push(promise);return Promise.all(this._wait);}/** * @method defer * @instance * @description Execute `func` (Callback) when Component is ready. * @param {Function} func - Callback. * @memberof module:core.Component */},{key:"defer",value:function defer(func){var _this2=this;if(this.isDeffered)this.wait().then(function(){return func(_this2);});else func(this);}// PARAMETERS /** * @method updateParams * @instance * @description Updates parameters of the Component. * @return {Object} Params of this Component * @memberof module:core.Component */},{key:"updateParams",value:function updateParams(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};this.params=extend(params,this.params);return this.params;}// COPYING & CLONING /** * @method clone * @instance * @description Clone this component * @return {object} a cloned component with all its source component' params copied. * @memberof module:core.Component */},{key:"clone",value:function clone(){return new this.constructor(this.params).copy(this);}/** * @method copy * @instance * @description Copy source native and integrate `modules` to it. * @param {Component} source - Source component that is used for `copy()` action. * @param {Function} [customize] - Callback executed before modules integration process. * @return {this} Component * @memberof module:core.Component */},{key:"copy",value:function copy(source,customize){this.params=objectSpread({},source.params);if(source.native)this.native=source.native.clone(source.params);if(customize)customize();this.integrateModules(source);return this;}/** * @method add * @instance * @description Add a child `Component`. * @param {Component} object - Component that should be added as a `child`. * @return {Promise} Resolved when action is done. * @memberof module:core.Component */},{key:"add",value:function(){var _add=asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee(object){return regenerator.wrap(function _callee$(_context){while(1){switch(_context.prev=_context.next){case 0:if(!object.parent){_context.next=3;break;}_context.next=3;return object.parent.remove(object);case 3:_context.next=5;return this.wait();case 5:_context.next=7;return object.wait();case 7:if(object.native){_context.next=9;break;}throw new CompositionError$1('Component','there is no object.native',this);case 9:object.parent=this;_context.next=12;return this.applyBridge({onAdd:object}).onAdd;case 12:this.native.add(object.native);this.children.push(object);return _context.abrupt("return",object);case 15:case"end":return _context.stop();}}},_callee,this);}));return function add(_x){return _add.apply(this,arguments);};}()/** * @method remove * @instance * @description Remove a child `Component`. * @param {Component} object - Component that should be a **child** of this Component. * @return {Promise} Resolved when action is done. * @memberof module:core.Component */},{key:"remove",value:function(){var _remove=asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee2(object){return regenerator.wrap(function _callee2$(_context2){while(1){switch(_context2.prev=_context2.next){case 0:if(!(object.parent!==this)){_context2.next=2;break;}return _context2.abrupt("return");case 2:_context2.next=4;return this.wait();case 4:_context2.next=6;return object.wait();case 6:object.parent=null;this.native.remove(object.native);this.children.splice(this.children.indexOf(object),1);case 9:case"end":return _context2.stop();}}},_callee2,this);}));return function remove(_x2){return _remove.apply(this,arguments);};}()/** * @method addTo * @instance * @description Adds `this` Component to specified `App`/`Component`. * @param {Component} object - Component that will be a parent of `this`. * @memberof module:core.Component */},{key:"addTo",value:function addTo(object){return object.add(this);}},{key:"get",value:function get(key){return this.manager.get(key);}},{key:"use",value:function use(key){return this.manager.use(key);}/** * Returns whether the object is `async` (`wait` promises are more than `0`). * @member {Boolean} module:core.Component#isDeffered */},{key:"isDeffered",get:function get(){return this._wait.length>0;}/** * Returns the `ModuleManager` used for this component. * @member {ModuleManager} module:core.Component#manager * @throws {ManagerError} */},{key:"manager",get:function get(){if(this._manager)return this._manager;throw new ManagerError('Component',"ModuleManager is not used in this component. 'manager' parameter should be set as 'true'",this);},set:function set(manager){this._manager=manager;}/** * Returns the `native` object used for this component. * @member {Object} module:core.Component#native */},{key:"native",get:function get(){return this._native;},set:function set(mesh){this._native=mesh;this._native.component=this;return this._native;}}]);inherits(Component,_ModuleSystem);return Component;}(ModuleSystem);defineProperty$3(defineProperty$3(Component,"defaults",{modules:null,manager:true}),"instructions",{});// 26.1.6 Reflect.get(target, propertyKey [, receiver]) function get(target,propertyKey/* , receiver */){var receiver=arguments.length<3?target:arguments[2];var desc,proto;if(_anObject(target)===receiver)return target[propertyKey];if(desc=_objectGopd.f(target,propertyKey))return _has(desc,'value')?desc.value:desc.get!==undefined?desc.get.call(receiver):undefined;if(_isObject(proto=_objectGpo(target)))return get(proto,propertyKey,receiver);}_export(_export.S,'Reflect',{get:get});var get$1=_core.Reflect.get;var get$2=get$1;function _superPropBase$1(object,property){while(!Object.prototype.hasOwnProperty.call(object,property)){object=getPrototypeOf$2(object);if(object===null)break;}return object;}var superPropBase=_superPropBase$1;var get$3=createCommonjsModule(function(module){function _get$$1(target,property,receiver){if(typeof Reflect!=="undefined"&&get$2){module.exports=_get$$1=get$2;}else{module.exports=_get$$1=function _get$$1(target,property,receiver){var base=superPropBase(target,property);if(!base)return;var desc=getOwnPropertyDescriptor$1(base,property);if(desc.get){return desc.get.call(receiver);}return desc.value;};}return _get$$1(target,property,receiver||target);}module.exports=_get$$1;});function attributes(){for(var _len=arguments.length,mappers=new Array(_len),_key=0;_key<_len;_key++){mappers[_key]=arguments[_key];}return function(target){for(var i=0;i1&&arguments[1]!==undefined?arguments[1]:Mesh;return(/*#__PURE__*/function(_MeshComponent){function _class2(){classCallCheck(this,_class2);return possibleConstructorReturn(this,getPrototypeOf$2(_class2).apply(this,arguments));}createClass(_class2,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:geom,material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new constructor(geometry,material)}).mesh;}}]);inherits(_class2,_MeshComponent);return _class2;}(MeshComponent));}},{key:"create",value:function create(geom,params,constructor){return new(MeshComponent.custom(geom,constructor))(params);}},{key:"from",value:function from(mesh){var params=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};params.build=false;var component=new MeshComponent(params);component.native=mesh;component.wrap();return component;}}]);function MeshComponent(params){var _this;var defaults=arguments.length>1&&arguments[1]!==undefined?arguments[1]:MeshComponent.defaults;var instructions=arguments.length>2&&arguments[2]!==undefined?arguments[2]:MeshComponent.instructions;classCallCheck(this,MeshComponent);_this=possibleConstructorReturn(this,getPrototypeOf$2(MeshComponent).call(this,params,defaults,instructions));if(_this.params.build){var build=_this.build(_this.params);if(!build){throw new CompositionError$1('MeshComponent','.build() method should return a THREE.Object3D or a Promise resolved with THREE.Object3D.',assertThisInitialized(assertThisInitialized(_this)));}if(build instanceof Promise){_this.wait(build);_this.wait(new Promise(function(resolve){build.then(function(native){_this.native=native;_this.wrap().then(resolve);});}));}else{_this.native=build;_this.wait(_this.wrap());}}_this.applyCommand('postIntegrate');return _this;}// BUILDING & WRAPPING /** * @method build * @description Build livecycle should return a native object. * @throws {CompositionError} * @memberof module:core.MeshComponent */createClass(MeshComponent,[{key:"build",value:function build(){throw new CompositionError$1('MeshComponent','Instance should have it\'s own .build().',this);}/** * @method wrap * @instance * @description Wraps transforms (`position` & `rotation`) * @return {Promise} Resolved when action is completed * @memberof module:core.MeshComponent */},{key:"wrap",value:function wrap(){var _this2=this;return new Promise(function(resolve){// TODO: Fix defer with physics // this.defer(() => { var _this2$params=_this2.params,position=_this2$params.position,rotation=_this2$params.rotation,scale=_this2$params.scale,shadow=_this2$params.shadow;_this2.position.set(position.x,position.y,position.z);_this2.rotation.set(rotation.x,rotation.y,rotation.z);_this2.scale.set(scale.x,scale.y,scale.z);_this2.native.castShadow=shadow.cast;_this2.native.receiveShadow=shadow.receive;_this2.applyBridge({onWrap:1});resolve(_this2);// }); });}// COPYING & CLONING /** * @method copy * @instance * @description Copy source transforms & execute `Component.copy()` * @return {this} MeshComponent * @memberof module:core.MeshComponent */},{key:"copy",value:function copy$$1(source){var _this3=this;return get$3(getPrototypeOf$2(MeshComponent.prototype),"copy",this).call(this,source,function(){_this3.position.copy(source.position);_this3.rotation.copy(source.rotation);_this3.quaternion.copy(source.quaternion);});}/** * @method clone * @instance * @description Make a clone of this MeshComponent using `.copy()` * @return {MeshComponent} clone of this object * @memberof module:core.MeshComponent */},{key:"clone",value:function clone(geometry,material){var dest=new this.constructor({build:false}).copy(this);if(geometry)dest.geometry=dest.geometry.clone();if(material)dest.material=dest.material.clone();return dest;}}]);inherits(MeshComponent,_Component);return MeshComponent;}(Component))||_class);defineProperty$3(defineProperty$3(MeshComponent,"defaults",objectSpread({},Component.defaults,{build:true,geometry:{},material:false,shadow:{cast:true,receive:true},position:{x:0,y:0,z:0},rotation:{x:0,y:0,z:0},scale:{x:1,y:1,z:1}})),"instructions",{position:['x','y','z'],rotation:['x','y','z'],scale:['x','y','z']});var _dec$1,_class$1;var/** * @class LightComponent * @category core * @param {Object} [params] - The parameters object. * @param {Object} [instructions] - The instructions object. * @extends module:core.Component * @memberof module:core */LightComponent=(_dec$1=attributes(copy('position','rotation','quaternion','target')),_dec$1(_class$1=/*#__PURE__*/function(_Component){createClass(LightComponent,null,[{key:"from",/** * Default values for parameters * @member {Object} module:core.LightComponent#defaults * @static * @default * { * build: true, * * shadow: { * cast: true, * * bias: 0, * radius: 1, * * mapSize: { * width: 1024, * height: 1024 * }, * * camera: { * near: true, * far: 400, * fov: 90, * * top: 200, * bottom: -200, * left: -200, * right: 200 * } * }, * * position: {x: 0, y: 0, z: 0}, * rotation: {x: 0, y: 0, z: 0} * } */ /** * Static instructions * @member {Object} module:core.LightComponent#instructions * @static * @default * { * position: ['x', 'y', 'z'], * rotation: ['x', 'y', 'z'] * } */value:function from(light){var params=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var wrapShadow=arguments.length>2&&arguments[2]!==undefined?arguments[2]:true;params.build=false;var component=new LightComponent(params);component.native=light;component.wrap();if(wrapShadow)component.wrapShadow();return component;}}]);function LightComponent(params){var _this;var defaults=arguments.length>1&&arguments[1]!==undefined?arguments[1]:LightComponent.defaults;var instructions=arguments.length>2&&arguments[2]!==undefined?arguments[2]:LightComponent.instructions;classCallCheck(this,LightComponent);_this=possibleConstructorReturn(this,getPrototypeOf$2(LightComponent).call(this,params,defaults,instructions));if(_this.params.build){var build=_this.build(_this.params);if(!build){throw new CompositionError$1('LightComponent','.build() method should return a THREE.Object3D or a Promise resolved with THREE.Object3D.',assertThisInitialized(assertThisInitialized(_this)));}if(build instanceof Promise){build.then(function(native){_this.native=native;});}else _this.native=build;_this.wait(_this.wrap());}_this.applyCommand('postIntegrate');return _this;}// BUILDING & WRAPPING /** * @method build * @instance * @description Build livecycle should return a native object. * @throws {CompositionError} * @memberof module:core.LightComponent */createClass(LightComponent,[{key:"build",value:function build(){throw new CompositionError$1('MeshComponent','Instance should have it\'s own .build().',this);}/** * @method wrap * @instance * @description Wraps transforms (`position` & `rotation`) * @return {Promise} Resolved when action is completed * @memberof module:core.LightComponent */},{key:"wrap",value:function wrap(){var _this2=this;return new Promise(function(resolve){_this2.defer(function(){var _this2$params=_this2.params,position=_this2$params.position,rotation=_this2$params.rotation;_this2.position.set(position.x,position.y,position.z);_this2.rotation.set(rotation.x,rotation.y,rotation.z);_this2.applyBridge({onWrap:1});resolve(_this2);});});}/** * @method wrapShadow * @instance * @description Wraps shadow properties * @memberof module:core.LightComponent */},{key:"wrapShadow",value:function wrapShadow(){var native=this.native,shadow=this.params.shadow;native.castShadow=shadow.cast;native.shadow.mapSize.width=shadow.mapSize.width;native.shadow.mapSize.height=shadow.mapSize.height;native.shadow.bias=shadow.bias;native.shadow.radius=shadow.radius;var shadowCamera=native.shadow.camera;var camera=shadow.camera;shadowCamera.near=camera.near;shadowCamera.far=camera.far;shadowCamera.fov=camera.fov;shadowCamera.left=camera.left;shadowCamera.right=camera.right;shadowCamera.top=camera.top;shadowCamera.bottom=camera.bottom;}// COPYING & CLONING /** * @method copy * @instance * @description Copy source transforms & execute `Component.copy()` * @return {this} LightComponent * @memberof module:core.LightComponent */},{key:"copy",value:function copy$$1(source){var _this3=this;return get$3(getPrototypeOf$2(LightComponent.prototype),"copy",this).call(this,source,function(){if(_this3.target)_this3.target.copy(source.target());_this3.position.copy(source.position);_this3.rotation.copy(source.rotation);_this3.quaternion.copy(source.quaternion);});}/** * @method clone * @instance * @description Make a clone of this LightComponent using `.copy()` * @return {LightComponent} clone of this object * @memberof module:core.LightComponent */},{key:"clone",value:function clone(){return new this.constructor({build:false}).copy(this);}}]);inherits(LightComponent,_Component);return LightComponent;}(Component))||_class$1);defineProperty$3(defineProperty$3(LightComponent,"defaults",objectSpread({},Component.defaults,{build:true,shadow:{cast:true,bias:0,radius:1,mapSize:{width:1024,height:1024},camera:{near:true,far:400,fov:90,top:200,bottom:-200,left:-200,right:200}},position:{x:0,y:0,z:0},rotation:{x:0,y:0,z:0}})),"instructions",{position:['x','y','z'],rotation:['x','y','z']});var _dec$2,_class$2;var/** * @class CameraComponent * @category core * @param {Object} [params] - The parameters object. * @param {Object} [instructions] - The instructions object. * @extends module:core.Component * @memberof module:core */CameraComponent=(_dec$2=attributes(copy('position','rotation','quaternion','target')),_dec$2(_class$2=/*#__PURE__*/function(_Component){createClass(CameraComponent,null,[{key:"from",/** * Default values for parameters * @member {Object} module:core.CameraComponent#defaults * @static * @default * { * build: true, * * position: {x: 0, y: 0, z: 0}, * rotation: {x: 0, y: 0, z: 0} * } */ /** * Static instructions * @member {Object} module:core.CameraComponent#instructions * @static * @default * { * position: ['x', 'y', 'z'], * rotation: ['x', 'y', 'z'], * scale: ['x', 'y', 'z'] * } */value:function from(camera){var params=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};params.build=false;var component=new CameraComponent(params);component.native=camera;component.wrap();return component;}}]);function CameraComponent(params){var _this;var defaults=arguments.length>1&&arguments[1]!==undefined?arguments[1]:CameraComponent.defaults;var instructions=arguments.length>2&&arguments[2]!==undefined?arguments[2]:CameraComponent.instructions;classCallCheck(this,CameraComponent);_this=possibleConstructorReturn(this,getPrototypeOf$2(CameraComponent).call(this,params,defaults,instructions));if(_this.params.build){var build=_this.build(_this.params);if(!build){throw new CompositionError$1('CameraComponent','.build() method should return a THREE.Object3D or a Promise resolved with THREE.Object3D.',assertThisInitialized(assertThisInitialized(_this)));}if(build instanceof Promise){build.then(function(native){_this.native=native;});}else _this.native=build;_this.wait(_this.wrap());}_this.applyCommand('postIntegrate');return _this;}// BUILDING & WRAPPING /** * @method build * @instance * @description Build livecycle should return a native object. * @throws {CompositionError} * @memberof module:core.CameraComponent */createClass(CameraComponent,[{key:"build",value:function build(){throw new CompositionError$1('CameraComponent','Instance should have it\'s own .build().',this);}/** * @method wrap * @instance * @description Wraps transforms (`position` & `rotation`) * @return {Promise} Resolved when action is completed * @memberof module:core.CameraComponent */},{key:"wrap",value:function wrap(){var _this2=this;return new Promise(function(resolve){_this2.defer(function(){_this2.position.set(_this2.params.position.x,_this2.params.position.y,_this2.params.position.z);_this2.rotation.set(_this2.params.rotation.x,_this2.params.rotation.y,_this2.params.rotation.z);_this2.applyBridge({onWrap:1});resolve(_this2);});});}/** * @method copy * @instance * @description Copy source transforms & execute `Component.copy()` * @return {this} CameraComponent * @memberof module:core.CameraComponent */},{key:"copy",value:function copy$$1(source){var _this3=this;return get$3(getPrototypeOf$2(CameraComponent.prototype),"copy",this).call(this,source,function(){if(_this3.target)_this3.target.copy(source.target());_this3.position.copy(source.position);_this3.rotation.copy(source.rotation);_this3.quaternion.copy(source.quaternion);});}/** * @method clone * @instance * @description Make a clone of this CameraComponent using `.copy()` * @return {CameraComponent} clone of this object * @memberof module:core.CameraComponent */},{key:"clone",value:function clone(){return new this.constructor({build:false}).copy(this);}}]);inherits(CameraComponent,_Component);return CameraComponent;}(Component))||_class$2);defineProperty$3(defineProperty$3(CameraComponent,"defaults",objectSpread({},Component.defaults,{build:true,position:{x:0,y:0,z:0},rotation:{x:0,y:0,z:0}})),"instructions",{position:['x','y','z'],rotation:['x','y','z'],scale:['x','y','z']});const version="2.2.0-alpha.0";var system={window:typeof window==='undefined'?global:window};/** * @class App * @category core * @description This component is used to prepare a world scene, setup physics, camera, renderer and all other things that you usually do before making meshes. * @param {Array} [modules=[]] - Array of Modules * @extends ModuleSystem * @memberof module:core */var App=/*#__PURE__*/function(_ModuleSystem){/** * @description Defines whether the scene should render or not * @member {Boolean} module:core.App#enabled * @public */ /** * Loops in this app * @description Array of loops that are executed by this app. * @member {Array} module:core.App#loops * @public */function App(){var _this;var modules=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[];classCallCheck(this,App);console.log("WHS.App ".concat(version));_this=possibleConstructorReturn(this,getPrototypeOf$2(App).call(this));defineProperty$3(defineProperty$3(assertThisInitialized(assertThisInitialized(_this)),"enabled",true),"loops",[]);_this.manager=new ModuleManager(assertThisInitialized(assertThisInitialized(_this)));_this.modules=modules;_this.integrateModules();return _this;}// CONTROLS & UPDATING /** * @method start * @description Start rendering loop and physics simulation (if you use version with physics). * @memberof module:core.App */createClass(App,[{key:"start",value:function start(){var requestAnimFrame=function(){return system.window.requestAnimationFrame||system.window.webkitRequestAnimationFrame||system.window.mozRequestAnimationFrame||function(callback){system.window.setTimeout(callback,1000/60);};}();var loops=this.loops,enabled=this.enabled;function process(){requestAnimFrame(process);if(!enabled)return;for(var i=0,ll=loops.length;iAdding a loop to an app * const loop = new Loop(() => { * // ... * }); * * const app = new App(); * * app.addLoop(loop); * loop.start(); */},{key:"addLoop",value:function addLoop(loop){var _this2=this;return new Promise(function(resolve){_this2.loops.push(loop);resolve(loop);});}/** * @method removeLoop * @description Removes loop from this app. * @param {Object} loop - the loop to remove * @return {Promise} Promise that is resolved when promises completed. * @memberof module:core.App */},{key:"removeLoop",value:function removeLoop(loop){var _this3=this;return new Promise(function(resolve){var index=_this3.loops.indexOf(loop);if(index!==-1)_this3.loops.splice(index,1);resolve(loop);});}},{key:"get",value:function get(key){return this.manager.get(key);}},{key:"use",value:function use(key){return this.manager.use(key);}}]);inherits(App,_ModuleSystem);return App;}(ModuleSystem);/** * @class Loop * @category core * @param {Function} func function to execute on each animation frame * @param {Boolean} [useClock=true] passes a Clock to the function when called, if true * @memberof module:core */var Loop=/*#__PURE__*/function(){function Loop(func){var useClock=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;classCallCheck(this,Loop);this.func=func;this.clock=useClock?new Clock():null;this.enabled=false;}// CONTROLS /** * @method start * @instance * @description Starts this loop, clock if it has one. Won't do anything if loop enabled already. * @param {Component} [world] app to add this loop to, if provided. * @memberof module:core.Loop */createClass(Loop,[{key:"start",value:function start(world){if(this.enabled)return;if(world)world.addLoop(this);if(this.clock)this.clock.start();this.enabled=true;}/** * @method stop * @instance * @description Stops this loop and its clock if it has one, won't do anything if this loop is not enabled) * @param {Component} [world] app to remove this loop from, if provided. * @memberof module:core.Loop */},{key:"stop",value:function stop(world){if(!this.enabled)return;if(this.clock)this.clock.stop();this.enabled=false;if(world)world.removeLoop(this);}// EXECUTION /** * @method execute * @instance * @description Executes the function of this loop * @memberof module:core.Loop * @returns {*} whatever the function of this loop returns */},{key:"execute",value:function execute(){return this.func(this.clock);}}]);return Loop;}();/** @module core */ /** * @class AmbientLight * @category components/lights * @description AmbientLight is a simple class, it extends Light and inherits all its methods. * AmbientLight creates basic light around all scene, so it doesn't need properties like pos or target. * It supports only color and intensity as parameters, which defines the color of the surrounded light and intensity of light. * @param {Object} [params={light: {color: 0xffffff, intensity: 1}}] - The params. * @extends module:core.LightComponent * @memberof module:components/lights * @example Creating an AmbientLight * new AmbientLight({ * color: 0xffffff, * intensity: 0.2 * }).addTo(world); */var AmbientLight$1=/*#__PURE__*/function(_LightComponent){function AmbientLight$$1(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,AmbientLight$$1);return possibleConstructorReturn(this,getPrototypeOf$2(AmbientLight$$1).call(this,params,AmbientLight$$1.defaults));}createClass(AmbientLight$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({light:new AmbientLight(params.color,params.intensity)}).light;}}]);inherits(AmbientLight$$1,_LightComponent);return AmbientLight$$1;}(LightComponent);defineProperty$3(AmbientLight$1,"defaults",objectSpread({},LightComponent.defaults,{color:0xffffff,intensity:1}));/** * @class DirectionalLight * @category components/lights * @description DirectinalLight creates a light that shines from a specific direction not from a specific position.

* This light will behave as though it is infinitely far away and the rays produced from it are all parallel.

* The best analogy would be a light source that acts like the sun: the sun is so far away that all sunlight hitting objects comes from the same angle.

* It has the same options as AmbientLight in light paramater, but it also supports pos and target paramaters. * @param {Object} [params={light: {color: 0xffffff, intensity: 1}}] - The params. * @extends module:core.LightComponent * @memberof module:components/lights * @example Creating a DirectionalLight to fall down from vec3(10, 20, 10) to vec3(0, 0, 0) * new DirectionalLight({ * color: 0xffffff, * intensity: 0.2, * * position: [10, 20, 10] * }).addTo(app); */var DirectionalLight$1=/*#__PURE__*/function(_LightComponent){function DirectionalLight$$1(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,DirectionalLight$$1);_this=possibleConstructorReturn(this,getPrototypeOf$2(DirectionalLight$$1).call(this,params,DirectionalLight$$1.defaults));_this.wrapShadow();return _this;}createClass(DirectionalLight$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({light:new DirectionalLight(params.color,params.intensity)}).light;}}]);inherits(DirectionalLight$$1,_LightComponent);return DirectionalLight$$1;}(LightComponent);defineProperty$3(DirectionalLight$1,"defaults",objectSpread({},LightComponent.defaults,{color:0xffffff,intensity:1}));/** * @class HemisphereLight * @category components/lights * @description HemisphereLight is a light source positioned directly above the scene.
* It also doesn't need position and target properties. * @classDesc * * @param {Object} [params={light: {skyColor: 0xffffff, groundColor: 0xffffff, intensity: 1}}] - The params. * @extends module:core.LightComponent * @memberof module:components/lights * @example Creating a HemisphereLight * new HemisphereLight({ * skyColor: 0xff0000, * groundColor: 0x0000ff, * intensity: 0.2 * }).addTo(app); */var HemisphereLight$1=/*#__PURE__*/function(_LightComponent){function HemisphereLight$$1(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,HemisphereLight$$1);return possibleConstructorReturn(this,getPrototypeOf$2(HemisphereLight$$1).call(this,params,HemisphereLight$$1.defaults));}createClass(HemisphereLight$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({light:new HemisphereLight(params.skyColor,params.groundColor,params.intensity)}).light;}}]);inherits(HemisphereLight$$1,_LightComponent);return HemisphereLight$$1;}(LightComponent);defineProperty$3(HemisphereLight$1,"defaults",objectSpread({},LightComponent.defaults,{skyColor:0xffffff,groundColor:0xffffff,intensity:1}));/** * @class PointLight * @category components/lights * @description PointLight creates a light at a specific position in the scene. The light shines in all directions (roughly similar to a light bulb.)

* It has the same options as AmbientLight in light paramater, but it also supports position, distance and decay.
* @param {Object} [params={light: {color: 0xffffff, intensity: 1, distance: 100, decay: 1}}] - The params. * @extends LightComponent * @memberof module:components/lights * @example Creating a PointLight * new PointLight( { * color: 0xff0000, * intensity: 2, * distance: 300 * * position: [10, 20, 10] * }).addTo(app); */var PointLight$1=/*#__PURE__*/function(_LightComponent){function PointLight$$1(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,PointLight$$1);_this=possibleConstructorReturn(this,getPrototypeOf$2(PointLight$$1).call(this,params,PointLight$$1.defaults));_this.wrapShadow();return _this;}createClass(PointLight$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({light:new PointLight(params.color,params.intensity,params.distance,params.decay)}).light;}}]);inherits(PointLight$$1,_LightComponent);return PointLight$$1;}(LightComponent);defineProperty$3(PointLight$1,"defaults",objectSpread({},LightComponent.defaults,{color:0xffffff,intensity:1,distance:100,decay:1}));/** * @class SpotLight * @category components/lights * @description SpotLight creates spot light that can cast shadow in one direction.

* It has the same parameters as AmbientLight in light, but it also supports pos and target.

* SpotLight affects meshes with lambert and phong material. * @classDesc * * @param {Object} [params={light: {color: 0xffffff, intensity: 1, distance: 100, angle: Math.PI / 3, exponent: 0, decay: 1}}] - The params. * @extends module:core.LightComponent * @memberof module:components/lights * @example Creating a SpotLight that falls down from vec3(10, 20, 10) to vec3(0, 0, 0) * new SpotLight({ * color: 0x00ff00, * intensity: 3, * distance: 1000 * * position: [10, 20, 10] * }).addTo(app); */var SpotLight$1=/*#__PURE__*/function(_LightComponent){function SpotLight$$1(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,SpotLight$$1);_this=possibleConstructorReturn(this,getPrototypeOf$2(SpotLight$$1).call(this,params,SpotLight$$1.defaults));_this.wrapShadow();return _this;}createClass(SpotLight$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({light:new SpotLight(params.color,params.intensity,params.distance,params.angle,params.exponent,params.decay)}).light;}}]);inherits(SpotLight$$1,_LightComponent);return SpotLight$$1;}(LightComponent);defineProperty$3(SpotLight$1,"defaults",objectSpread({},LightComponent.defaults,{color:0xffffff,intensity:1,distance:100,angle:Math.PI/3,exponent:0,decay:1}));var AreaLight=/*#__PURE__*/function(_LightComponent){function AreaLight(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,AreaLight);return possibleConstructorReturn(this,getPrototypeOf$2(AreaLight).call(this,params,AreaLight.defaults));}createClass(AreaLight,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({light:new RectAreaLight(params.color,params.intensity,params.width,params.height)}).light;}}]);inherits(AreaLight,_LightComponent);return AreaLight;}(LightComponent);defineProperty$3(AreaLight,"defaults",objectSpread({},LightComponent.defaults,{color:0xffffff,intensity:1,width:10,height:10}));/** @module components/lights */ /** * @class CubeCamera * @category components/cameras * @description Creates 6 cameras that render to a WebGLRenderTargetCube * @param {Object} [params] - The parameters object. * @memberof module:components/cameras * @extends module:core.CameraComponent * @example Creates a CubeCamera and set it as app's camera * const camera = new CubeCamera({ * camera: { * cubeResolution: 256 * }, * * position: { * x: 0, * y: 100, * z: 0 * } * }); * * app.camera = camera; */var CubeCamera$1=/*#__PURE__*/function(_CameraComponent){/** * Default values for parameters * @member {Object} module:components/cameras.CubeCamera#defaults * @static * @default
   * {
   *   camera: {
   *     near: 1,
   *     far: 1000,
   *     cubeResolution: 128
   *   }
   * }
*/function CubeCamera$$1(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,CubeCamera$$1);return possibleConstructorReturn(this,getPrototypeOf$2(CubeCamera$$1).call(this,params,CubeCamera$$1.defaults));}createClass(CubeCamera$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({camera:new CubeCamera(params.near,params.far,params.cubeResolution)}).camera;}}]);inherits(CubeCamera$$1,_CameraComponent);return CubeCamera$$1;}(CameraComponent);defineProperty$3(CubeCamera$1,"defaults",objectSpread({},CameraComponent.defaults,{near:1,far:1000,cubeResolution:128}));/** * @class OrthographicCamera * @category components/cameras * @description Camera with orthographic projection. * @param {Object} [params] - The parameters object. * @memberof module:components/cameras * @extends module:core.CameraComponent * @example Create an OrthographicCamera and set it as app's camera * const camera = new OrthographicCamera({ * camera: { * far: 10000 * }, * * position: { * y: 50 * } * }); * * app.camera = camera; */var OrthographicCamera$1=/*#__PURE__*/function(_CameraComponent){/** * Default values for parameters * @member {Object} module:components/cameras.OrthographicCamera#defaults * @static * @default
   * {
   *   near: 1,
   *   far: 1000,
   *   left: system.window.innerWidth / -2,
   *   right: system.window.innerWidth / 2,
   *   top: system.window.innerHeight / 2,
   *   bottom: system.window.innerHeight / -2
   * }
*/function OrthographicCamera$$1(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,OrthographicCamera$$1);return possibleConstructorReturn(this,getPrototypeOf$2(OrthographicCamera$$1).call(this,params,OrthographicCamera$$1.defaults));}createClass(OrthographicCamera$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({camera:new OrthographicCamera(params.left,params.right,params.top,params.bottom,params.near,params.far)}).camera;}}]);inherits(OrthographicCamera$$1,_CameraComponent);return OrthographicCamera$$1;}(CameraComponent);defineProperty$3(OrthographicCamera$1,"defaults",objectSpread({},CameraComponent.defaults,{near:1,far:1000,left:system.window.innerWidth/-2,right:system.window.innerWidth/2,top:system.window.innerHeight/2,bottom:system.window.innerHeight/-2}));/** * @class PerspectiveCamera * @description Camera with perspective projection. * @category components/cameras * @param {Object} [params] - The parameters object. * @memberof module:components/cameras * @extends module:core.CameraComponent * @example Create an PerspectiveCamera and set it as app's camera * const camera = new PerspectiveCamera({ * fov: 75, * aspect: window.innerWidth / window.innerHeight, * * position: { * x: 0, * y: 100, * z: 0 * } * }); * * app.camera = camera; */var PerspectiveCamera$1=/*#__PURE__*/function(_CameraComponent){/** * Default values for parameters * @member {Object} module:components/cameras.PerspectiveCamera#defaults * @static * @default
   * {
   *   near: 1,
   *   far: 1000,
   *   fov: 75,
   *   aspect: system.window.innerWidth / system.window.innerHeight
   * }
*/function PerspectiveCamera$$1(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,PerspectiveCamera$$1);return possibleConstructorReturn(this,getPrototypeOf$2(PerspectiveCamera$$1).call(this,params,PerspectiveCamera$$1.defaults));}createClass(PerspectiveCamera$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({camera:new PerspectiveCamera(params.fov,params.aspect,params.near,params.far)}).camera;}}]);inherits(PerspectiveCamera$$1,_CameraComponent);return PerspectiveCamera$$1;}(CameraComponent);defineProperty$3(PerspectiveCamera$1,"defaults",objectSpread({},CameraComponent.defaults,{near:1,far:1000,fov:75,aspect:system.window.innerWidth/system.window.innerHeight}));/** @module components/cameras */ /** * @class Box * @category components/meshes * @description As told on Component definition, while you can pass any of the inherited params for this component construction, you will need to * pass specific parameters to build this mesh as a geometry object. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Box, and adding to app * new Box({ * geometry: { * width: 2, * height: 2, * depth: 2 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * position: [50, 60, 70] * }).addTo(app); */var Box=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Box#defaults * @static * @default
   * {
   *   geometry: {
   *     width: 1,
   *     height: 1,
   *     depth: 1,
   *     widthSegments: 1,
   *     heightSegments: 1,
   *     depthSegments: 1
   *   }
   * }
*/ /** * Instructions * @member {Object} module:components/meshes.Box#instructions * @static * @default geometry: ['width', 'height', 'depth', 'widthSegments', 'heightSegments', 'depthSegements'] */function Box(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Box);return possibleConstructorReturn(this,getPrototypeOf$2(Box).call(this,params,Box.defaults,Box.instructions));}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Box */createClass(Box,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=new(params.buffer?BoxBufferGeometry:BoxGeometry)(params.geometry.width,params.geometry.height,params.geometry.depth,params.geometry.widthSegments,params.geometry.heightSegments,params.geometry.depthSegments);return geometry;}}]);inherits(Box,_MeshComponent);return Box;}(MeshComponent);defineProperty$3(defineProperty$3(Box,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{width:1,height:1,depth:1,widthSegments:1,heightSegments:1,depthSegments:1}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['width','height','depth','widthSegments','heightSegments','depthSegements']}));/** * @class Circle * @category components/meshes * @description As told on Component definition, while you can pass any of the inherited params for this component construction, you will need to * pass specific parameters to build this mesh as a geometry object. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Circle, and adding to app * new Circle({ * geometry: { * radius: 4, * segments: 16 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * position: [50, 60, 70] * }).addTo(app); */var Circle=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Circle#defaults * @static * @default
   * {
   *   geometry: {
   *     radius: 50,
   *     segments: 8,
   *     thetaStart: 0,
   *     thetaLength: Math.PI * 2
   *   }
   * }
*/ /** * Instructions * @member {Object} module:components/meshes.Circle#instructions * @static * @default geometry: ['radius', 'segments', 'thetaStart', 'thetaLength'] */function Circle(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Circle);return possibleConstructorReturn(this,getPrototypeOf$2(Circle).call(this,params,Circle.defaults,Circle.instructions));}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Circle */createClass(Circle,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=new(params.buffer?CircleBufferGeometry:CircleGeometry)(params.geometry.radius,params.geometry.segments,params.geometry.thetaStart,params.geometry.thetaLength);return geometry;}}]);inherits(Circle,_MeshComponent);return Circle;}(MeshComponent);defineProperty$3(defineProperty$3(Circle,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:50,segments:8,thetaStart:0,thetaLength:Math.PI*2}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radius','segments','thetaStart','thetaLength']}));/** * @class Cone * @category components/meshes * @description A cylinder is one of the most basic curvilinear geometric shapes, the surface formed by the points at a fixed distance from a given straight line, the axis of the cylinder.

* The solid enclosed by this surface and by two planes perpendicular to the axis is also called a cylinder.
* The surface area and the volume of a cylinder have been known since deep antiquity. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Cone, and adding to app * new Cone({ * geometry: { * radiusTop: 2, * radiusBottom: 4, * height: 5 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * pos: [0, 100, 0] * }).addTo(app); */var Cone=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Cone#defaults * @static * @default
   * {
   *   geometry: {
   *     radius: 20,
   *     height: 100,
   *     radiusSegments: 32,
   *     heightSegments: 1,
   *     openEnded: false,
   *     thetaStart: 0,
   *     thetaLength: Math.PI * 2
   *   }
   * }
*/ /** * Instructions * @member {Object} module:components/meshes.Cone#instructions * @static * @default
   * geometry: [
   *   'radius',
   *   'height',
   *   'radiusSegments',
   *   'heightSegments',
   *   'openEnded',
   *   'thetaStart',
   *   'thetaLength'
   * ]
   * 
*/function Cone(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Cone);_this=possibleConstructorReturn(this,getPrototypeOf$2(Cone).call(this,params,Cone.defaults,Cone.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Cone.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Cone */createClass(Cone,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=new(params.buffer?ConeBufferGeometry:ConeGeometry)(params.geometry.radius,params.geometry.height,params.geometry.radiusSegments,params.geometry.heightSegments,params.geometry.openEnded,params.geometry.thetaStart,params.geometry.thetaLength);return geometry;}}]);inherits(Cone,_MeshComponent);return Cone;}(MeshComponent);defineProperty$3(defineProperty$3(Cone,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:20,height:100,radiusSegments:32,heightSegments:1,openEnded:false,thetaStart:0,thetaLength:Math.PI*2}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radius','height','radiusSegments','heightSegments','openEnded','thetaStart','thetaLength']}));/** * @class Cylinder * @category components/meshes * @description A cylinder is one of the most basic curvilinear geometric shapes, the surface formed by the points at a fixed distance from a given straight line, the axis of the cylinder.

* The solid enclosed by this surface and by two planes perpendicular to the axis is also called a cylinder.
* The surface area and the volume of a cylinder have been known since deep antiquity. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Cylinder, and adding to app * new Cylinder({ * geometry: { * radiusTop: 2, * radiusBottom: 4, * height: 5 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * pos: [0, 100, 0] * }).addTo(app); */var Cylinder=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Cylinder#defaults * @static * @default
   * {
   *   geometry: {
   *     radiusTop: 20,
   *     radiusBottom: 20,
   *     height: 100,
   *     radiusSegments: 32,
   *     heightSegments: 1,
   *     openEnded: false,
   *     thetaStart: 0,
   *     thetaLength: Math.PI * 2
   *   }
   * }
*/ /** * Instructions * @member {Object} module:components/meshes.Cylinder#instructions * @static * @default
   * geometry: [
   *   'radiusTop',
   *   'radiusBottom',
   *   'height',
   *   'radiusSegments',
   *   'heightSegments',
   *   'openEnded',
   *   'thetaStart',
   *   'thetaLength'
   * ]
   * 
*/function Cylinder(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Cylinder);_this=possibleConstructorReturn(this,getPrototypeOf$2(Cylinder).call(this,params,Cylinder.defaults,Cylinder.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Cylinder.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Cylinder */createClass(Cylinder,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=new(params.buffer?CylinderBufferGeometry:CylinderGeometry)(params.geometry.radiusTop,params.geometry.radiusBottom,params.geometry.height,params.geometry.radiusSegments,params.geometry.heightSegments,params.geometry.openEnded,params.geometry.thetaStart,params.geometry.thetaLength);return geometry;}}]);inherits(Cylinder,_MeshComponent);return Cylinder;}(MeshComponent);defineProperty$3(defineProperty$3(Cylinder,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radiusTop:0,radiusBottom:1,height:1,radiusSegments:32,heightSegments:1,openEnded:false,thetaStart:0,thetaLength:Math.PI*2}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radiusTop','radiusBottom','height','radiusSegments','heightSegments','openEnded','thetaStart','thetaLength']}));/** * @class Dodecahedron * @category components/meshes * @description In geometry, a dodecahedron is any polyhedron with twelve flat faces.

* The most familiar dodecahedron is the regular dodecahedron, which is a Platonic solid.
* There are also three regular star dodecahedra, which are constructed as stellations of the convex form.
* All of these have icosahedral symmetry, order 120. * Dodecahedron creates Dodecahedron object by it's radius and detail. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Dodecahedron, and adding to app * new Dodecahedron({ * geometry: { * radius: 2 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * position: { * y: 10 * } * }).addTo(app); */var Dodecahedron=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Dodecahedron#defaults * @static * @default
   * geometry: {
   *   radius: 1,
   *   detail: 0
   * }
   * 
*/ /** * Instructions * @member {Object} module:components/meshes.Dodecahedron#instructions * @static * @default
   * geometry: ['radius', 'detail']
   * 
*/function Dodecahedron(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Dodecahedron);_this=possibleConstructorReturn(this,getPrototypeOf$2(Dodecahedron).call(this,params,Dodecahedron.defaults,Dodecahedron.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Dodecahedron.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Dodecahedron */createClass(Dodecahedron,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?DodecahedronBufferGeometry:DodecahedronGeometry)(params.geometry.radius,params.geometry.detail);}}]);inherits(Dodecahedron,_MeshComponent);return Dodecahedron;}(MeshComponent);defineProperty$3(defineProperty$3(Dodecahedron,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:1,detail:0}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radius','detail']}));/** * @class Extrude * @category components/meshes * @description Extrude geometry means that you can create a 3D mesh from any 2D shape using three.js geometry based on THREE.Vector2.
* Such implementation will help you to make volumed shapes that have their own depth and can be seen from all angels.

* You can also find some interesting examples made using three.js which is a core of whs.js, such as: * - Webgl geometry extrude * - Extrude shapes from geodata * - Extrude splines * * Such examples can be easily implemented using whitestorm.js or it's plugins. Use `Extrude` class with THREE.Shape to get extrude effect of shape defined by 2D vectors. * This class is similar to THREE.ExtrudeGeometry, * but it also contains all properties, applied by `Shape`, such as material, mass and vectors like position (pos) and rotation (rot). * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a shape, then an Extrude from it * const shape = new THREE.Shape([ * new THREE.Vector2(-4,-4), * new THREE.Vector2(-2,0), * new THREE.Vector2(-4,4), * new THREE.Vector2(0,2), * new THREE.Vector2(4,4), * new THREE.Vector2(2,0), * new THREE.Vector2(4,-4), * new THREE.Vector2(0,-2) * ]); * * const extrude = new Extrude({ * geometry: { * shapes: shape, * options: { * bevelEnabled: false, * bevelSize: 0, * amount: 2 * } * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * position: [0, 100, 0] * }); * * extrude.addTo(app); */var Extrude=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Extrude#defaults * @static * @default
   * {
   *   geometry: {
   *     shapes: [],
   *     options: {}
   *   }
   * }
   * 
*/ /** * Instructions * @member {Object} module:components/meshes.Extrude#instructions * @static * @default
   * {
   *   geometry: ['shapes', 'options']
   * }
   * 
*/function Extrude(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Extrude);_this=possibleConstructorReturn(this,getPrototypeOf$2(Extrude).call(this,params,Extrude.defaults,Extrude.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Extrude.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Extrude */createClass(Extrude,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=new ExtrudeGeometry(params.geometry.shapes,params.geometry.options);return params.buffer?new BufferGeometry().fromGeometry(geometry):geometry;}}]);inherits(Extrude,_MeshComponent);return Extrude;}(MeshComponent);defineProperty$3(defineProperty$3(Extrude,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{shapes:[],options:{}}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['shapes','options']}));/** * @class Icosahedron * @category components/meshes * @description In geometry, an icosahedron is a polyhedron with 20 faces.
* There are many kinds of icosahedra, with some being more symmetrical than others. The most well known is the Platonic, convex regular icosahedron.
* `Icosahedron` creates an Icosahedron object by its radius and detail. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Icosahedron, and adding to app * new Icosahedron({ * geometry: { * radius: 2, * detail: 1 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * position: [0, 100, 0] * }).addTo(app); */var Icosahedron=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Icosahedron#defaults * @static * @default
   * {
   *   geometry: {
   *     radius: 1,
   *     detail: 0
   *   }
   * }
*/ /** * Instructions * @member {Object} module:components/meshes.Icosahedron#instructions * @static * @default {geometry: ['radius', 'detail']} */function Icosahedron(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Icosahedron);_this=possibleConstructorReturn(this,getPrototypeOf$2(Icosahedron).call(this,params,Icosahedron.defaults,Icosahedron.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Icosahedron.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Icosahedron */createClass(Icosahedron,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?IcosahedronBufferGeometry:IcosahedronGeometry)(params.geometry.radius,params.geometry.detail);}}]);inherits(Icosahedron,_MeshComponent);return Icosahedron;}(MeshComponent);defineProperty$3(defineProperty$3(Icosahedron,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:1,detail:0}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radius','detail']}));/** * @class Lathe * @category components/meshes * @description A `LatheGeometry` allows you to create shapes from a smooth curve. * This curve is defined by a number of points (also called knots) and is most often called a spline. This spline is rotated around a fixed point and results in vase- and bell-like shapes.

* In 3D computer graphics, a lathed object is a 3D model whose vertex geometry is produced by rotating the points of a spline or other point set around a fixed axis. * The lathing may be partial; the amount of rotation is not necessarily a full 360 degrees. * The point set providing the initial source data can be thought of as a cross section through the object along a plane containing its axis of radial symmetry.

* The following example shows a geometry which can be generated using `Lathe` class. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Lath, and adding to app * const points = []; * * for (let i = 0; i < 10; i++) { * points.push( * new THREE.Vector2( * (Math.sin(i * 0.7) * 15 + 50) / 10, * (i - 5) * 0.2 * ) * ); * } * * const lathe = new Lathe({ * geometry: { * points: points * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * position: [0, 50, 10] * }).addTo(app); */var Lathe=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Lathe#defaults * @static * @default
   * {
   *   geometry: {
   *     points: []
   *   }
   * }
   * 
*/ /** * Instructions * @member {Object} module:components/meshes.Lathe#instructions * @static * @default
{
   *   geometry: ['points']
   * }
   * 
*/function Lathe(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Lathe);_this=possibleConstructorReturn(this,getPrototypeOf$2(Lathe).call(this,params,Lathe.defaults,Lathe.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Lathe.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Lathe */createClass(Lathe,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?LatheBufferGeometry:LatheGeometry)(params.geometry.points);}}]);inherits(Lathe,_MeshComponent);return Lathe;}(MeshComponent);defineProperty$3(defineProperty$3(Lathe,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{points:[]}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['points']}));/** * @class Line * @category components/meshes * @description Line component is generated from a curve/line and amount of vectors that should be used (points). * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Line, and adding to app * new Line({ * geometry: { * curve: new THREE.LineCurve3(new THREE.Vector3(10, 10, 0), new THREE.Vector3(10, 30, 0)) * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }) * }).addTo(app); */var Line$1=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Line#defaults * @static * @default
   * {
   *   curve: new LineCurve3(new Vector3(0, 0, 0), new Vector3(10, 0, 0)),
   *   points: 50
   * }
   * 
*/ /** * Instructions * @member {Object} module:components/meshes.Line#instructions * @static * @default
{
   *   geometry: ['curve', 'points']
   * }
   * 
*/function Line$$1(params){classCallCheck(this,Line$$1);return possibleConstructorReturn(this,getPrototypeOf$2(Line$$1).call(this,params,Line$$1.defaults,Line$$1.instructions));}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Line */createClass(Line$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Line(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=params.buffer?new BufferGeometry():new Geometry();if(params.buffer){var pp=params.curve.getPoints(params.points);var verts=new Float32Array(pp.length*3);for(var i=0,max=pp.length;iCreating a Importer, and adding to app * new Importer({ * loader: new THREE.OBJLoader(), * * parser(geometry, material) { // data from loader * return new THREE.Mesh(geometry, material); // should return your .native (mesh in this case) * }, * * position: [0, 100, 0] * }).addTo(app); */var Importer=/*#__PURE__*/function(_MeshComponent){createClass(Importer,null,[{key:"filter",/** * Default values for parameters * @member {Object} module:components/meshes.Importer#defaults * @static * @default
     * {
     *   url: '',
     *   loader: new JSONLoader(),
     *
     *   onLoad() {},
     *   onProgress() {},
     *   onError() {},
     *
     *   texturePath: null,
     *   useCustomMaterial: false,
     *
     *   parser(geometry, materials) {
     *     return new Mesh(geometry, materials);
     *   }
     * }
*/ /** * @method filter * @description Default values for filter * @static * @param {THREE.Mesh} object Instance for iterating through it's children. * @param {Function} filter Function with child as argument, should return a boolean whether include the child or not. * @return {THREE.Mesh} object with children * @memberof module:components/meshes.Importer * @example Removing unnecessary lights from children * new Importer({ * loader: new THREE.OBJLoader(), * * parse(group) { // data from loader * return Importer.filter(group, child => !child.isLight); // remove lights * }, * * position: [0, 100, 0] * }).addTo(app); */value:function filter(object,_filter){var processFilter=function processFilter(object){object.children.forEach(function(el,index){if(el.children)processFilter(el);if(!_filter(el))object.children.splice(index,1);});return object;};return processFilter(object);}}]);function Importer(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Importer);return possibleConstructorReturn(this,getPrototypeOf$2(Importer).call(this,params,Importer.defaults,Importer.instructions,false));}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Importer */createClass(Importer,[{key:"build",value:function build(){var _this=this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new Promise(function(resolve){if(params.texturePath)params.loader.setTexturePath(params.texturePath);params.loader.load(params.url,function(){for(var _len=arguments.length,data=new Array(_len),_key=0;_key<_len;_key++){data[_key]=arguments[_key];}// geometry, materials params.onLoad.apply(params,data);var object=params.parser.apply(_this,data);if(params.material)object.material=_this.applyBridge({material:params.material}).material;resolve(object);},params.onProgress,params.onError);});}}]);inherits(Importer,_MeshComponent);return Importer;}(MeshComponent);defineProperty$3(defineProperty$3(Importer,"defaults",objectSpread({},MeshComponent.defaults,{url:'',loader:new JSONLoader(),onLoad:function onLoad(){},onProgress:function onProgress(){},// TODO add onComplete? onError:function onError(){},texturePath:null,useCustomMaterial:false,parser:function parser(geometry,material){var _this$applyBridge=this.applyBridge({geometry:geometry,material:material}),geom=_this$applyBridge.geometry,mat=_this$applyBridge.material;return this.applyBridge({mesh:geom.bones?new SkinnedMesh(geom,mat):new Mesh(geom,mat)}).mesh;}})),"instructions",objectSpread({},MeshComponent.instructions));/** * @class Octahedron * @category components/meshes * @description In geometry, an octahedron is a polyhedron with eight faces. * A regular octahedron is a Platonic solid composed of eight equilateral triangles, four of which meet at each vertex. *

* `Octahedron` creates an Octahedron object by its `radius` and `detail`. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating an Octahedron, and adding to app * new Octahedron({ * geometry: { * radius: 2, * detail: 1 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * position: [0, 100, 0] * }).addTo(app); */var Octahedron=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Octahedron#defaults * @static * @default
   * {
   *   geometry: {
   *     radius: 1,
   *     detail: 0
   *   }
   * }
   * 
*/function Octahedron(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Octahedron);_this=possibleConstructorReturn(this,getPrototypeOf$2(Octahedron).call(this,params,Octahedron.defaults,Octahedron.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Octahedron.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Octahedron */createClass(Octahedron,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?OctahedronBufferGeometry:OctahedronGeometry)(params.geometry.radius,params.geometry.detail);}}]);inherits(Octahedron,_MeshComponent);return Octahedron;}(MeshComponent);defineProperty$3(Octahedron,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:1,detail:0}}));/** * @class Parametric * @category components/meshes * @description `Parametric` generates a geometry representing a Parametric surface *

* It is usually used to develop different kinds of highfields or visualize a math function. *
* - Parametric surface * - "Graphulus" *

* @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Example creating an heightfield-like geometry. `u` and `v` are like `x` and `y` in shape, but their values are always from `0` to `1`. * We use them in `THREE.Vector3` like `x` and `z` and `Math.random() * 5` for `y`. * const createParametric = (u, v) => { * return new THREE.Vector3(u * 30, Math.random() * 5, v * 30); * } * * new Parametric({ * geometry: { * func: createParametric * }, * * material: new THREE.MeshLambertMaterial({ * color: 0xffffff, * side: THREE.DoubleSide * }), * * position: [0, 100, -100] * }).addTo(app); */var Parametric=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Parametric#defaults * @static * @default
   * {
   *   geometry: {
   *     func: (u, v) => new Vector3(u, v, 0),
   *     slices: 10,
   *     tacks: 10
   *   }
   * }
   * 
*/function Parametric(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Parametric);return possibleConstructorReturn(this,getPrototypeOf$2(Parametric).call(this,params,Parametric.defaults,Parametric.instructions));}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Parametric */createClass(Parametric,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?ParametricBufferGeometry:ParametricGeometry)(params.geometry.func,params.geometry.slices,params.geometry.stacks);}}]);inherits(Parametric,_MeshComponent);return Parametric;}(MeshComponent);defineProperty$3(Parametric,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{func:function func(u,v){return new Vector3(u,v,0);},slices:10,stacks:10}}));/** * @class Plane * @category components/meshes * @description `Plane` is used for creating planes given some `width` and `height`. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Plane, and adding to app * new Plane({ * geometry: { * width: 20, * height: 30 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }) * }).addTo(app); */var Plane$1=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Plane#defaults * @static * @default
   * {
   *   geometry: {
   *     width: 10,
   *     height: 10,
   *     wSegments: 1,
   *     hSegments: 1
   *   }
   * }
   * 
*/ /** * Instructions * @member {Object} module:components/meshes.Plane#instructions * @static * @default
   * {
   *   geometry: ['width', 'height', 'wSegments', 'hSegments']
   * }
   * 
*/function Plane$$1(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Plane$$1);_this=possibleConstructorReturn(this,getPrototypeOf$2(Plane$$1).call(this,params,Plane$$1.defaults,Plane$$1.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Plane$$1.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Plane */createClass(Plane$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=new(params.buffer?PlaneBufferGeometry:PlaneGeometry)(params.geometry.width,params.geometry.height,params.geometry.wSegments,params.geometry.hSegments);return geometry;}}]);inherits(Plane$$1,_MeshComponent);return Plane$$1;}(MeshComponent);defineProperty$3(defineProperty$3(Plane$1,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{width:10,height:10,wSegments:1,hSegments:1}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['width','height','wSegments','hSegments']}));var verticesOfCube=[-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,1],indicesOfFaces=[2,1,0,0,3,2,0,4,7,7,3,0,0,1,5,5,4,0,1,2,6,6,5,1,2,3,7,7,6,2,4,5,6,6,7,4];/** * @class Polyhedron * @category components/meshes * @description In elementary geometry, a polyhedron is a solid in three dimensions with flat polygonal faces, straight edges and sharp corners or vertices. *

* `Polyhedron` creates a Polyhedron by its `radius` and `detail`. *

* @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating an Polyhedron, and adding to app * new Polyhedron({ * geometry: { * radius: 2, * detail: 1 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * position: [0, 100, 0] * }).addTo(app); */var Polyhedron=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Polyhedron#defaults * @static * @default
   * {
   *   geometry: {
   *     verticesOfCube: [
   *       -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1,
   *       -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1
   *     ],
   *
   *     indicesOfFaces: [
   *       2, 1, 0, 0, 3, 2,
   *       0, 4, 7, 7, 3, 0,
   *       0, 1, 5, 5, 4, 0,
   *       1, 2, 6, 6, 5, 1,
   *       2, 3, 7, 7, 6, 2,
   *       4, 5, 6, 6, 7, 4
   *     ],
   *
   *     radius: 6,
   *     detail: 2
   *   }
   * }
   * 
*/ /** * Instructions * @member {Object} module:components/meshes.Polyhedron#instructions * @static * @default
   * {
   *   geometry: ['verticesOfCube', 'indicesOfFaces', 'radius', 'detail']
   * }
   * 
*/function Polyhedron(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Polyhedron);_this=possibleConstructorReturn(this,getPrototypeOf$2(Polyhedron).call(this,params,Polyhedron.defaults,Polyhedron.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Polyhedron.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Polyhedron */createClass(Polyhedron,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?PolyhedronBufferGeometry:PolyhedronGeometry)(params.geometry.verticesOfCube,params.geometry.indicesOfFaces,params.geometry.radius,params.geometry.detail);}}]);inherits(Polyhedron,_MeshComponent);return Polyhedron;}(MeshComponent);defineProperty$3(defineProperty$3(defineProperty$3(defineProperty$3(Polyhedron,"verticesOfCube",verticesOfCube),"indicesOfFaces",indicesOfFaces),"defaults",objectSpread({},MeshComponent.defaults,{geometry:{verticesOfCube:verticesOfCube,indicesOfFaces:indicesOfFaces,radius:6,detail:2}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['verticesOfCube','indicesOfFaces','radius','detail']}));/** * @class Ring * @category components/meshes * @description Ring class creates a circle or just 2D Torus. Does not support physics. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Ring, and adding to app * new Ring({ * geometry: { * innerRadius: 5, * outerRadius: 2 * }, * * material: new THREE.MeshLambertMaterial({ * color: 0xffffff, * side THREE.DoubleSide * }), * * position: [0, 8, 0], * * rotation: { * x: Math.PI/4 * } * }).addTo(app); */var Ring=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Ring#defaults * @static * @default
   * {
   *   geometry: {
   *     innerRadius: 0,
   *     outerRadius: 50,
   *     thetaSegments: 8,
   *     phiSegments: 8,
   *     thetaStart: 0,
   *     thetaLength: Math.PI * 2
   *   }
   * }
   * 
*/ /** * Instructions * @member {Object} module:components/meshes.Ring#instructions * @static * @default
   * {
   *   geometry: [
   *     'innerRadius',
   *     'outerRadius',
   *     'thetaSegments',
   *     'phiSegments',
   *     'thetaStart',
   *     'thetaLength'
   *   ]
   * }
   * 
*/function Ring(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Ring);_this=possibleConstructorReturn(this,getPrototypeOf$2(Ring).call(this,params,Ring.defaults,Ring.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Ring.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Ring */createClass(Ring,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?RingBufferGeometry:RingGeometry)(params.geometry.innerRadius,params.geometry.outerRadius,params.geometry.thetaSegments,params.geometry.phiSegments,params.geometry.thetaStart,params.geometry.thetaLength);}}]);inherits(Ring,_MeshComponent);return Ring;}(MeshComponent);defineProperty$3(defineProperty$3(Ring,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{innerRadius:0,outerRadius:50,thetaSegments:8,phiSegments:8,thetaStart:0,thetaLength:Math.PI*2}})),"instructions",objectSpread({},MeshComponent.defaults,{geometry:['innerRadius','outerRadius','thetaSegments','phiSegments','thetaStart','thetaLength']}));/** * @class Shape * @category components/meshes * @description Shape is a universal class. It allows you to create different 2D shapes in 3D scene.
* Unfortunately, not all of them support physics, an alternative is to make a similar 3D object and scale its width down to near zero. *

* `Shape` consists of shapes that are in its shapes parameter. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a plane looking Shape from a THREE.Shape, and adding it to app * const rectWidth = 10, * rectLength = 5; * * const rectShape = new THREE.Shape(); * rectShape.moveTo(0,0); * rectShape.lineTo(0, rectWidth); * rectShape.lineTo(rectLength, rectWidth); * rectShape.lineTo(rectLength, 0); * rectShape.lineTo(0, 0); * * const plane = new Shape({ * geometry: { * shape: rectShape * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }) * }).addTo(app); */var Shape$1=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Shape#defaults * @static * @default
   * {
   *   geometry: {
   *     shapes: []
   * }
   * 
*/ /** * Instructions * @member {Object} module:components/meshes.Shape#instructions * @static * @default
   * {
   *   geometry: ['shapes']
   * }
   * 
*/function Shape$$1(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Shape$$1);_this=possibleConstructorReturn(this,getPrototypeOf$2(Shape$$1).call(this,params,Shape$$1.defaults,Shape$$1.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Shape$$1.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Shape */createClass(Shape$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?ShapeBufferGeometry:ShapeGeometry)(params.geometry.shapes);}}]);inherits(Shape$$1,_MeshComponent);return Shape$$1;}(MeshComponent);defineProperty$3(defineProperty$3(Shape$1,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{shapes:[]}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['shapes']}));/** * @class Sphere * @category components/meshes * @description Sphere class is used to create sphere objects by its radius property and other values that determines its detality. *

* It is similar to THREE.SphereGeometry, but it also contains all `Shape` properties, such as material, mass and vectors like position (pos) and rotation (rot). *

* Then it creates an `Three.js mesh` or a `Physijs mesh`, that is similar to `Three.js mesh`, but it also take into consideration collision calculations. * This mesh is a combination of `Three.js geometry` and `Physijs material` (The same as in three.js, but with friction and restitution). * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Sphere, and adding it to app * new Sphere({ * geometry: { * radius: 2 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * position: { * y: 100 * } * }).addTo(app); */var Sphere$1=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Sphere#defaults * @static * @default
   * {
   *   geometry: {
   *     radius: 1,
   *     widthSegments: 8,
   *     heightSegments: 6
   * }
   * 
*/ /** * Instructions * @member {Object} module:components/meshes.Sphere#instructions * @static * @default
   * {
   *   geometry: ['radius', 'widthSegments', 'heightSegments']
   * }
   * 
*/function Sphere$$1(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Sphere$$1);return possibleConstructorReturn(this,getPrototypeOf$2(Sphere$$1).call(this,params,Sphere$$1.defaults,Sphere$$1.instructions));}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Sphere */createClass(Sphere$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=new(params.buffer?SphereBufferGeometry:SphereGeometry)(params.geometry.radius,params.geometry.widthSegments,params.geometry.heightSegments);return geometry;}}]);inherits(Sphere$$1,_MeshComponent);return Sphere$$1;}(MeshComponent);defineProperty$3(defineProperty$3(Sphere$1,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:1,widthSegments:8,heightSegments:6}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radius','widthSegments','heightSegments']}));/** * @class Tetrahedron * @category components/meshes * @description In geometry, a tetrahedron is a polyhedron composed of four triangular faces, six straight edges, and four vertex corners. * The tetrahedron is the simplest of all the ordinary convex polyhedra and the only one that has fewer than 5 faces. *

* `Tetrahedron` creates a Tetrahedron object by its `radius` and `detail` * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Tetrahedron, and adding it to app * new Tetrahedron({ * geometry: { * radius: 2, * detail: 1 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * position: { * x: 0, * y: 100, * z: 0 * } * }).addTo(app); */var Tetrahedron=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Tetrahedron#defaults * @static * @default
   * {
   *   geometry: {
   *     radius: 1,
   *     detail: 0
   * }
   * 
*/ /** * Instructions * @member {Object} module:components/meshes.Tetrahedron#instructions * @static * @default
   * {
   *   geometry: ['radius', 'detail']
   * }
   * 
*/function Tetrahedron(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Tetrahedron);_this=possibleConstructorReturn(this,getPrototypeOf$2(Tetrahedron).call(this,params,Tetrahedron.defaults,Tetrahedron.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Tetrahedron.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Tetrahedron */createClass(Tetrahedron,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?TetrahedronBufferGeometry:TetrahedronGeometry)(params.geometry.radius,params.geometry.detail);}}]);inherits(Tetrahedron,_MeshComponent);return Tetrahedron;}(MeshComponent);defineProperty$3(defineProperty$3(Tetrahedron,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:1,detail:0}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radius','detail']}));/** * @class Text * @category components/meshes * @description Text class is made for creating 3D text objects. * @classDesc * *

* Physics text object can be convex or concave. By default it's convex but you can also switch to concave. * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Text, and adding it to app * new Text({ * text: 'Some text', * parameters: { * font: 'path/to/font.typeface.js', * size: 20, * height: 5, * curveSegments: 6 * } * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * position: { * x: -40, * y: 20, * z: 0 * } * }).addTo(app); */var Text=/*#__PURE__*/function(_MeshComponent){createClass(Text,null,[{key:"load",/** * Default values for parameters * @member {Object} module:components/meshes.Text#defaults * @static * @default
     * {
     *   text: 'Hello World!',
     *   font: null,
     *
     *   geometry: {
     *     size: 12,
     *     height: 50,
     *     curveSegments: 12,
     *     font: new Font(),
     *     bevelEnabled: false,
     *     bevelThickness: 10,
     *     bevelSize: 8
     *   }
     * }
     * 
*/ /** * Default FontLoader * @member {Object} module:components/meshes.Text#loader * @static * @default new FontLoader() */ /** * @method load * @static * @description load() preloads a Font object and returns a Promise with it. * @param {String} path Path to the font * @return {Promise} A promise resolved with a font * @memberof module:components/meshes.Text */value:function load(path){var loader=arguments.length>1&&arguments[1]!==undefined?arguments[1]:Text.loader;return new Promise(function(resolve){loader.load(path,resolve);});}}]);function Text(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Text);return possibleConstructorReturn(this,getPrototypeOf$2(Text).call(this,params,Text.defaults,Text.instructions));}/** * @method build * @description Build is called as part of the lifecycle to create a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Text */createClass(Text,[{key:"build",value:function build(){var _this=this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var promise=new Promise(function(resolve){(params.font instanceof Promise?params.font:Promise.resolve(params.font)).then(function(font){var _this$applyBridge=_this.applyBridge({geometry:new TextGeometry(params.text,Object.assign(params.geometry,{font:font})),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;resolve(_this.applyBridge({mesh:new Mesh(geometry,material)}).mesh);});});get$3(getPrototypeOf$2(Text.prototype),"wait",this).call(this,promise);return promise;}}]);inherits(Text,_MeshComponent);return Text;}(MeshComponent);defineProperty$3(defineProperty$3(defineProperty$3(Text,"defaults",objectSpread({},MeshComponent.defaults,{text:'Hello World!',font:null,geometry:{size:12,height:50,curveSegments:12,font:new Font(),bevelEnabled:false,bevelThickness:10,bevelSize:8}})),"instructions",objectSpread({},MeshComponent.instructions)),"loader",new FontLoader());/** * @class Torus * @category components/meshes * @description Torus class makes a torus figure. A donut is a torus. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Torus, and adding it to app * new Torus({ * geometry: { * radius: 5, * tube: 2 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * position: { * y: 35 * } * }).addTo(app); */var Torus=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Torus#defaults * @static * @default
   * {
   *   geometry: {
   *     radius: 100,
   *     tube: 40,
   *     radialSegments: 8,
   *     tubularSegments: 6,
   *     arc: Math.PI * 2
   *   }
   * }
   * 
*/ /** * Instructions * @member {Object} module:components/meshes.Torus#instructions * @static * @default
   * {
   *   geometry: [
   *     'radius',
   *     'tube',
   *     'radialSegments',
   *     'tubularSegments',
   *     'arc'
   *   ]
   * }
   * 
*/function Torus(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Torus);_this=possibleConstructorReturn(this,getPrototypeOf$2(Torus).call(this,params,Torus.defaults,Torus.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Torus.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Torus */createClass(Torus,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new TorusGeometry(params.geometry.radius,params.geometry.tube,params.geometry.radialSegments,params.geometry.tubularSegments,params.geometry.arc);}}]);inherits(Torus,_MeshComponent);return Torus;}(MeshComponent);defineProperty$3(defineProperty$3(Torus,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:100,tube:40,radialSegments:8,tubularSegments:6,arc:Math.PI*2}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radius','tube','radialSegments','tubularSegments','arc']}));/** * @class Torusknot * @category components/meshes * @description Torusknot class makes a torusknot figure. It's like a crooked donut, very crooked. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Torusknot, and adding it to app * new Torusknot({ * geometry: { * radius:5, * tube: 2 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * pos: { * y: 100 * } * }).addTo(app); */var Torusknot=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Torusknot#defaults * @static * @default
   * {
   *   geometry: {
   *     radius: 100,
   *     tube: 40,
   *     radialSegments: 64,
   *     tubularSegments: 8,
   *     p: 2,
   *     q: 3
   *   }
   * }
   * 
*/ /** * Instructions * @member {Object} module:components/meshes.Torusknot#instructions * @static * @default
   * {
   *   geometry: [
   *     'radius',
   *     'tube',
   *     'radialSegments',
   *     'tubularSegments',
   *     'p',
   *     'q'
   *   ]
   * }
   * 
*/function Torusknot(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Torusknot);_this=possibleConstructorReturn(this,getPrototypeOf$2(Torusknot).call(this,params,Torusknot.defaults,Torusknot.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Torusknot.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Torusknot */createClass(Torusknot,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var GConstruct=params.buffer?TorusKnotBufferGeometry:TorusKnotGeometry;return new GConstruct(params.geometry.radius,params.geometry.tube,params.geometry.radialSegments,params.geometry.tubularSegments,params.geometry.p,params.geometry.q);}}]);inherits(Torusknot,_MeshComponent);return Torusknot;}(MeshComponent);defineProperty$3(defineProperty$3(Torusknot,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:100,tube:40,radialSegments:64,tubularSegments:8,p:2,q:3}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radius','tube','radialSegments','tubularSegments','p','q']}));/** * @class Tube * @category components/meshes * @description Tube class makes a tube that extrudes along a 3d curve. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Tube from a three.js Curve, and adding it to app * const CustomSinCurve = THREE.Curve.create( * function (scale) { // custom curve constructor * this.scale = (scale === undefined) ? 1 : scale; * }, * * function (t) { // getPoint: t is between 0-1 * const tx = t * 3 - 1.5, * ty = Math.sin( 2 * Math.PI * t ), * tz = 0; * * return new THREE.Vector3(tx, ty, tz).multiplyScalar(this.scale); * } * ); * * const path = new CustomSinCurve(10); * * new Tube({ * geometry: { * path: path * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }) * }).addTo(app); */var Tube=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Tube#defaults * @static * @default
   * {
   *   geometry: {
   *     path: new THREE.LineCurve3(new Vector3(0, 0, 0), new Vector3(0, 0, 1)),
   *     segments: 20,
   *     radius: 2,
   *     radiusSegments: 8,
   *     closed: false
   *   }
   * }
   * 
*/ /** * Instructions * @member {Object} module:components/meshes.Tube#instructions * @static * @default
   * {
   *   geometry: [
   *     'path',
   *     'segments',
   *     'radius',
   *     'radiusSegments',
   *     'closed'
   *   ]
   * }
   * 
*/function Tube(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Tube);_this=possibleConstructorReturn(this,getPrototypeOf$2(Tube).call(this,params,Tube.defaults,Tube.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Tube.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Tube */createClass(Tube,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=new(params.buffer?TubeBufferGeometry:TubeGeometry)(params.geometry.path,params.geometry.segments,params.geometry.radius,params.geometry.radiusSegments,params.geometry.closed);return geometry;}}]);inherits(Tube,_MeshComponent);return Tube;}(MeshComponent);defineProperty$3(defineProperty$3(Tube,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{path:new LineCurve3(new Vector3(0,0,0),new Vector3(0,0,1)),segments:20,radius:2,radiusSegments:8,closed:false}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['path','segments','radius','radiusSegments','closed']}));/** * @class Group * @category components/meshes * @description Sometimes you need to make groups of objects (it's not conveniently to apply transforms to each object when can make just one to a group).
* In Three.js you make it using `THREE.Object3D` and it's children.

* In whs.js we have `Group` * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Approach 2 - Adding objects to an empty group * const sphere = new Sphere(); * const box = new Box(); * const group = new Group(); * * sphere.addTo(group); * box.addTo(group); * @example Approach 2 - Making a group from objects * const sphere = new Sphere(); * const box = new Box(); * const group = new Group(box, sphere); * // OR: const group = new Group([box, sphere]); */var Group$1=/*#__PURE__*/function(_MeshComponent){function Group$$1(){var _this;classCallCheck(this,Group$$1);_this=possibleConstructorReturn(this,getPrototypeOf$2(Group$$1).call(this,{}));for(var i=0;iCreating an element module, passing it to the App * new App([ * new ElementModule(document.getElementById('app')) * ]); */var ElementModule=/*#__PURE__*/function(){function ElementModule(){var container=arguments.length>0&&arguments[0]!==undefined?arguments[0]:document.body;classCallCheck(this,ElementModule);if(container.container){console.warn('ElementModule now accepts only argument which is a DOM object, not a params object.');this.container=container.container;}else this.container=container;this.createElement();}/** * @method createElement * @instance * @description Creates a canvas element. * @memberof module:modules/app.ElementModule */createClass(ElementModule,[{key:"createElement",value:function createElement(){this.element=window.document.createElement('div');this.element.className='whs-app';this.element.style.width='inherit';this.element.style.height='inherit';this.element.style.position='relative';}},{key:"manager",value:function manager(_manager){_manager.set('element',this.element);_manager.set('container',this.container);}},{key:"integrate",value:function integrate(self){self.container.appendChild(self.element);}}]);return ElementModule;}();/** * @class RenderingModule * @category modules/app * @param {Object} [params] * @memberof module:modules/app * @example Creating a rendering module and passing it to App's modules * new App([ * new ElementModule(), * new SceneModule(), * new DefineModule('camera', new PerspectiveCamera({ * position: new THREE.Vector3(0, 6, 18), * far: 10000 * })), * new RenderingModule({ * bgColor: 0x162129, * * renderer: { * antialias: true * } * }, {shadow: true}) * ]); */var RenderingModule=/*#__PURE__*/function(){/** * additional * @description collection of additional scripts * @static * @member {Object} module:core.App#additional * @public */ /** * enabled * @static * @member {Boolean} module:core.App#enabled * @public */function RenderingModule(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var additional=arguments.length>1?arguments[1]:undefined;classCallCheck(this,RenderingModule);defineProperty$3(this,"enabled",true);this.params=Object.assign({width:window.innerWidth,height:window.innerHeight,resolution:new Vector2(1,1),pixelRatio:window.devicePixelRatio,bgColor:0x000000,bgOpacity:1,renderer:{},fix:function fix(){}},params);var _this$params=this.params,bgColor=_this$params.bgColor,bgOpacity=_this$params.bgOpacity,_renderer=_this$params.renderer,pixelRatio=_this$params.pixelRatio,width=_this$params.width,height=_this$params.height,resolution=_this$params.resolution,fix=_this$params.fix;this.renderer=new WebGLRenderer(_renderer);this.effects=[];this.renderer.setClearColor(bgColor,bgOpacity);if(pixelRatio)this.renderer.setPixelRatio(pixelRatio);this.setSize(Number(width*resolution.x).toFixed(),Number(height*resolution.y).toFixed());for(var key in additional){if(additional[key])this.applyAdditional(key);}fix(this.renderer);}/** * @method applyAdditional * @description Apply additional script from RenderingModule.additional * @param {Stirng} name Script name * @return {this} * @memberof module:modules/app.RenderingModule */createClass(RenderingModule,[{key:"applyAdditional",value:function applyAdditional(name){RenderingModule.additional[name].apply(this,[this.renderer]);}/** * @method integrateRenderer * @description Integrate renderer * @param {NodeElement} element DOM object * @param {THREE.Scene} scene used scene * @param {THREE.Camera} camera used camera * @return {Loop} renderLoop * @memberof module:modules/app.RenderingModule */},{key:"integrateRenderer",value:function integrateRenderer(element,scene,camera){var _this=this;this.scene=scene;this.camera=camera;this.attachToCanvas(element);return new Loop(function(){return _this.renderer.render(_this.scene,_this.camera);});}/** * @method effect * @description Add three.js effect * @param {Object} effect three.js effect * @param {function} effectLoop update function for effect * @return {this} * @memberof module:modules/app.RenderingModule */},{key:"effect",value:function effect(_effect){var _this2=this;var effectLoop=arguments.length>1&&arguments[1]!==undefined?arguments[1]:function(){_effect.render(_this2.scene,_this2.camera);};this.renderLoop.stop();var size=this.renderer.getSize();_effect.setSize(size.width,size.height);var loop=new Loop(effectLoop);this.effects.push(loop);if(this.enabled)loop.start(this.app);return this;}/** * @method setSize * @description Update render target width and height. * @param {Number} width * @param {Number} height * @memberof module:modules/app.RenderingModule */},{key:"setSize",value:function setSize(width,height){if(this.renderer)this.renderer.setSize(width,height);}/** * @method attachToCanvas * @description Attach renderer.domElement to element * @param {NodeElement} element DOM object * @memberof module:modules/app.RenderingModule */},{key:"attachToCanvas",value:function attachToCanvas(element){var canvas=this.renderer.domElement;// attach to new parent world dom element.appendChild(canvas);canvas.style.width='100%';canvas.style.height='100%';}/** * @method stop * @description Stops renderLoop and effect loops * @memberof module:modules/app.RenderingModule */},{key:"stop",value:function stop(){this.enabled=false;this.renderLoop.stop();this.effects.forEach(function(loop){return loop.stop();});}/** * @method play * @description Resumes renderLoop and effect loops * @memberof module:modules/app.RenderingModule */},{key:"play",value:function play(){this.enabled=true;this.renderLoop.start();this.effects.forEach(function(loop){return loop.start();});}},{key:"manager",value:function manager(_manager){var _this3=this;_manager.define('rendering');_manager.set('renderer',this.renderer);this.app=_manager.handler;this.renderLoop=this.integrateRenderer(_manager.get('element'),_manager.get('scene'),_manager.get('camera').native);_manager.update({element:function element(_element){_this3.attachToCanvas(_element);},scene:function scene(_scene){_this3.scene=_scene;},camera:function camera(_camera){_this3.camera=_camera.native;}});}},{key:"integrate",value:function integrate(self){var _this4=this;self.renderLoop.start(this);self.effects.forEach(function(loop){return loop.start(_this4);});}/** * @method dispose * @description Dispose rendering context * @memberof module:modules/app.RenderingModule */},{key:"dispose",value:function dispose(){this.stop();this.renderer.forceContextLoss();}}]);return RenderingModule;}();defineProperty$3(RenderingModule,"additional",{shadow:function shadow(renderer){renderer.shadowMap.enabled=true;}});var SYMBOL_CHILDREN_FOR_SCENE=Symbol('SYMBOL_CHILDREN_FOR_SCENE');/** * @class SceneModule * @category modules/app * @param {Boolean} [willSceneBeReplaced=false] willSceneBeReplaced should be true only if you are going to overwrite scene dependency even without the use of default one. * @memberof module:modules/app */var SceneModule=/*#__PURE__*/function(){function SceneModule(){var willSceneBeReplaced=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;classCallCheck(this,SceneModule);this.scene=willSceneBeReplaced?null:new Scene();}createClass(SceneModule,[{key:"manager",value:function manager(_manager){_manager.set('scene',this.scene);}},{key:"integrate",value:function integrate(self){Object.assign(this,{add:function add(object){var _this=this;return asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee(){return regenerator.wrap(function _callee$(_context){while(1){switch(_context.prev=_context.next){case 0:if(!object.parent){_context.next=3;break;}_context.next=3;return object.parent.remove(object);case 3:_context.next=5;return object.wait();case 5:if(object.native){_context.next=7;break;}throw new CompositionError('SceneModule','there is no object.native',_this);case 7:object.parent=_this;_context.next=10;return _this.applyBridge({onAdd:object}).onAdd;case 10:self.scene.add(object.native);_this.children.push(object);return _context.abrupt("return",object);case 13:case"end":return _context.stop();}}},_callee,this);}))();},remove:function remove(object){var _this2=this;return asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee2(){return regenerator.wrap(function _callee2$(_context2){while(1){switch(_context2.prev=_context2.next){case 0:if(!(object.parent!==_this2)){_context2.next=2;break;}return _context2.abrupt("return");case 2:_context2.next=4;return object.wait();case 4:object.parent=null;self.scene.remove(object.native);_this2.children.splice(_this2.children.indexOf(object),1);case 7:case"end":return _context2.stop();}}},_callee2,this);}))();},_setScene:function _setScene(scene){this.children=scene[SYMBOL_CHILDREN_FOR_SCENE]=scene[SYMBOL_CHILDREN_FOR_SCENE]||[];self.scene=scene;},setScene:function setScene(scene){this._setScene(scene);this.manager.set('scene',scene);},getScene:function getScene(){return self.scene;}});if(self.scene)this._setScene(self.scene);}}]);return SceneModule;}();// import {addResizeListener} from 'detect-element-resize'; /** * @class ResizeModule * @category modules/app * @param {Object} [params={auto: true}] - If auto is set to true - resize will be triggered when container resizes * @memberof module:modules/app */var ResizeModule=/*#__PURE__*/function(){function ResizeModule(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,ResizeModule);this.params=Object.assign({auto:true},params);this.callbacks=[this.setSize.bind(this)];}/** * @function setSize * @instance * @description This function sets the provided width & height to the renderer object. * @param {Number} [width=1] - The promise that should be added to a queue. * @param {Number} [height=1] - that is resolved when all promises completed. * @memberof module:modules/app.ResizeModule */createClass(ResizeModule,[{key:"setSize",value:function setSize(){var width=arguments.length>0&&arguments[0]!==undefined?arguments[0]:1;var height=arguments.length>1&&arguments[1]!==undefined?arguments[1]:1;this.camera.native.aspect=width/height;this.camera.native.updateProjectionMatrix();if(this.rendering)this.rendering.setSize(width,height);}/** * @method trigger * @instance * @description Triggers resize when called. width & height are determined automatically * This invokes each callbacks with the new width and height as params * @memberof module:modules/app.ResizeModule */},{key:"trigger",value:function trigger(){var _this$container=this.container,offsetWidth=_this$container.offsetWidth,offsetHeight=_this$container.offsetHeight,resolution=this.resolution;var width=Number(offsetWidth*resolution.x).toFixed();var height=Number(offsetHeight*resolution.y).toFixed();this.callbacks.forEach(function(cb){cb(width,height);});}/** * @method addAutoresize * @instance * @description Sets module to autoresize, this adds an event listene on window resize to trigger the resize * @memberof module:modules/app.ResizeModule */},{key:"addAutoresize",value:function addAutoresize(){this.container=this.getContainer();this.resolution=this.getResolution();if(this.params.auto)window.addEventListener('resize',this.trigger.bind(this));}/** * @method addCallback * @instance * @description Adds a call back function to the existing callbacks list. * @param {Function} func - The callback function to add * @memberof module:modules/app.ResizeModule */},{key:"addCallback",value:function addCallback(func){this.callbacks.push(func);}},{key:"manager",value:function manager(_manager){var _this=this;_manager.define('resize');this.rendering=_manager.get('renderer');this.camera=_manager.get('camera');this.getResolution=function(){return _manager.use('rendering').params.resolution;};this.getContainer=function(){return _manager.get('container');};_manager.update({container:function container(_container){_this.container=_container;}});this.addAutoresize();}}]);return ResizeModule;}();var fragment="uniform sampler2D tPreviousLum;\r\nuniform sampler2D tCurrentLum;\r\nuniform float minLuminance;\r\nuniform float delta;\r\nuniform float tau;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tfloat previousLum = texture2D(tPreviousLum, vUv, MIP_LEVEL_1X1).r;\r\n\tfloat currentLum = texture2D(tCurrentLum, vUv, MIP_LEVEL_1X1).r;\r\n\r\n\tpreviousLum = max(minLuminance, previousLum);\r\n\tcurrentLum = max(minLuminance, currentLum);\r\n\r\n\t// Adapt the luminance using Pattanaik's technique.\r\n\tfloat adaptedLum = previousLum + (currentLum - previousLum) * (1.0 - exp(-delta * tau));\r\n\r\n\tgl_FragColor.r = adaptedLum;\r\n\r\n}\r\n";var vertex="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * An adaptive luminosity shader material. */var AdaptiveLuminosityMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new adaptive luminosity material. */function AdaptiveLuminosityMaterial(){classCallCheck(this,AdaptiveLuminosityMaterial);return possibleConstructorReturn(this,getPrototypeOf$2(AdaptiveLuminosityMaterial).call(this,{type:"AdaptiveLuminosityMaterial",defines:{MIP_LEVEL_1X1:"0.0"},uniforms:{tPreviousLum:new Uniform(null),tCurrentLum:new Uniform(null),minLuminance:new Uniform(0.01),delta:new Uniform(0.0),tau:new Uniform(1.0)},fragmentShader:fragment,vertexShader:vertex,depthWrite:false,depthTest:false}));}inherits(AdaptiveLuminosityMaterial,_ShaderMaterial);return AdaptiveLuminosityMaterial;}(ShaderMaterial);var fragment$1="uniform sampler2D tDiffuse;\r\nuniform sampler2D tDepth;\r\n\r\nuniform float focus;\r\nuniform float dof;\r\nuniform float aspect;\r\nuniform float aperture;\r\nuniform float maxBlur;\r\n\r\nvarying vec2 vUv;\r\n\r\n#ifndef USE_LOGDEPTHBUF\r\n\r\n\t#include \r\n\r\n\tuniform float cameraNear;\r\n\tuniform float cameraFar;\r\n\r\n\tfloat readDepth(sampler2D depthSampler, vec2 coord) {\r\n\r\n\t\tfloat fragCoordZ = texture2D(depthSampler, coord).x;\r\n\t\tfloat viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\r\n\r\n\t\treturn viewZToOrthographicDepth(viewZ, cameraNear, cameraFar);\r\n\r\n\t}\r\n\r\n#endif\r\n\r\nvoid main() {\r\n\r\n\tvec2 aspectCorrection = vec2(1.0, aspect);\r\n\r\n\t#ifdef USE_LOGDEPTHBUF\r\n\r\n\t\tfloat depth = texture2D(tDepth, vUv).x;\r\n\r\n\t#else\r\n\r\n\t\tfloat depth = readDepth(tDepth, vUv);\r\n\r\n\t#endif\r\n\r\n\tfloat focusNear = clamp(focus - dof, 0.0, 1.0);\r\n\tfloat focusFar = clamp(focus + dof, 0.0, 1.0);\r\n\r\n\t// Calculate a DoF mask.\r\n\tfloat low = step(depth, focusNear);\r\n\tfloat high = step(focusFar, depth);\r\n\r\n\tfloat factor = (depth - focusNear) * low + (depth - focusFar) * high;\r\n\r\n\tvec2 dofBlur = vec2(clamp(factor * aperture, -maxBlur, maxBlur));\r\n\r\n\tvec2 dofblur9 = dofBlur * 0.9;\r\n\tvec2 dofblur7 = dofBlur * 0.7;\r\n\tvec2 dofblur4 = dofBlur * 0.4;\r\n\r\n\tvec4 color = vec4(0.0);\r\n\r\n\tcolor += texture2D(tDiffuse, vUv);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, 0.4 ) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, 0.37) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, 0.29) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, 0.15) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.40, 0.0 ) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, -0.15) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, -0.29) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, -0.37) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, -0.4 ) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, 0.37) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, 0.29) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, 0.15) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.4, 0.0 ) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, -0.15) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, -0.29) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, -0.37) * aspectCorrection) * dofBlur);\r\n\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, 0.37) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, 0.15) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, -0.15) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, -0.37) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, 0.37) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, 0.15) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, -0.15) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, -0.37) * aspectCorrection) * dofblur9);\r\n\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, 0.29) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.40, 0.0 ) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, -0.29) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, -0.4 ) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, 0.29) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.4, 0.0 ) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, -0.29) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, 0.4 ) * aspectCorrection) * dofblur7);\r\n\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, 0.29) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.4, 0.0 ) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, -0.29) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, -0.4 ) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, 0.29) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.4, 0.0 ) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, -0.29) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, 0.4 ) * aspectCorrection) * dofblur4);\r\n\r\n\tgl_FragColor = color / 41.0;\r\n\r\n}\r\n";var vertex$1="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * Depth of Field shader (Bokeh). * * Original shader code by Martins Upitis: * http://artmartinsh.blogspot.com/2010/02/glsl-lens-blur-filter-with-bokeh.html */var BokehMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new bokeh material. * * @param {PerspectiveCamera} [camera] - A camera. * @param {Object} [options] - The options. * @param {Number} [options.focus=1.0] - The focus distance, corresponds directly with the scene depth. * @param {Number} [options.dof=0.02] - Depth of field. An area in front of and behind the focus point that still appears sharp. * @param {Number} [options.aperture=0.025] - Camera aperture scale. Bigger values for stronger blur and shallower depth of field. * @param {Number} [options.maxBlur=1.0] - Maximum blur strength. */function BokehMaterial(camera){var _this;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};classCallCheck(this,BokehMaterial);var settings=Object.assign({focus:1.0,dof:0.02,aperture:0.025,maxBlur:1.0},options);_this=possibleConstructorReturn(this,getPrototypeOf$2(BokehMaterial).call(this,{type:"BokehMaterial",uniforms:{cameraNear:new Uniform(0.1),cameraFar:new Uniform(2000),aspect:new Uniform(1.0),tDiffuse:new Uniform(null),tDepth:new Uniform(null),focus:new Uniform(settings.focus),dof:new Uniform(settings.dof),aperture:new Uniform(settings.aperture),maxBlur:new Uniform(settings.maxBlur)},fragmentShader:fragment$1,vertexShader:vertex$1,depthWrite:false,depthTest:false}));_this.adoptCameraSettings(camera);return _this;}/** * Adopts the settings of the given camera. * * @param {PerspectiveCamera} [camera=null] - A camera. */createClass(BokehMaterial,[{key:"adoptCameraSettings",value:function adoptCameraSettings(){var camera=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;if(camera!==null){this.uniforms.cameraNear.value=camera.near;this.uniforms.cameraFar.value=camera.far;this.uniforms.aspect.value=camera.aspect;}}}]);inherits(BokehMaterial,_ShaderMaterial);return BokehMaterial;}(ShaderMaterial);var fragment$2="uniform sampler2D tDiffuse;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset[3];\r\n\r\nvoid main() {\r\n\r\n\tconst vec2 threshold = vec2(EDGE_THRESHOLD);\r\n\r\n\t// Calculate color deltas.\r\n\tvec4 delta;\r\n\tvec3 c = texture2D(tDiffuse, vUv).rgb;\r\n\r\n\tvec3 cLeft = texture2D(tDiffuse, vOffset[0].xy).rgb;\r\n\tvec3 t = abs(c - cLeft);\r\n\tdelta.x = max(max(t.r, t.g), t.b);\r\n\r\n\tvec3 cTop = texture2D(tDiffuse, vOffset[0].zw).rgb;\r\n\tt = abs(c - cTop);\r\n\tdelta.y = max(max(t.r, t.g), t.b);\r\n\r\n\t// We do the usual threshold.\r\n\tvec2 edges = step(threshold, delta.xy);\r\n\r\n\t// Then discard if there is no edge.\r\n\tif(dot(edges, vec2(1.0)) == 0.0) {\r\n\r\n\t\tdiscard;\r\n\r\n\t}\r\n\r\n\t// Calculate right and bottom deltas.\r\n\tvec3 cRight = texture2D(tDiffuse, vOffset[1].xy).rgb;\r\n\tt = abs(c - cRight);\r\n\tdelta.z = max(max(t.r, t.g), t.b);\r\n\r\n\tvec3 cBottom = texture2D(tDiffuse, vOffset[1].zw).rgb;\r\n\tt = abs(c - cBottom);\r\n\tdelta.w = max(max(t.r, t.g), t.b);\r\n\r\n\t// Calculate the maximum delta in the direct neighborhood.\r\n\tfloat maxDelta = max(max(max(delta.x, delta.y), delta.z), delta.w);\r\n\r\n\t// Calculate left-left and top-top deltas.\r\n\tvec3 cLeftLeft = texture2D(tDiffuse, vOffset[2].xy).rgb;\r\n\tt = abs(c - cLeftLeft);\r\n\tdelta.z = max(max(t.r, t.g), t.b);\r\n\r\n\tvec3 cTopTop = texture2D(tDiffuse, vOffset[2].zw).rgb;\r\n\tt = abs(c - cTopTop);\r\n\tdelta.w = max(max(t.r, t.g), t.b);\r\n\r\n\t// Calculate the final maximum delta.\r\n\tmaxDelta = max(max(maxDelta, delta.z), delta.w);\r\n\r\n\t// Local contrast adaptation in action.\r\n\tedges.xy *= step(0.5 * maxDelta, delta.xy);\r\n\r\n\tgl_FragColor = vec4(edges, 0.0, 0.0);\r\n\r\n}\r\n";var vertex$2="uniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset[3];\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\r\n\tvOffset[0] = uv.xyxy + texelSize.xyxy * vec4(-1.0, 0.0, 0.0, 1.0); // Changed sign in W component.\r\n\tvOffset[1] = uv.xyxy + texelSize.xyxy * vec4(1.0, 0.0, 0.0, -1.0); // Changed sign in W component.\r\n\tvOffset[2] = uv.xyxy + texelSize.xyxy * vec4(-2.0, 0.0, 0.0, 2.0); // Changed sign in W component.\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * A material that detects edges in a color texture. * * Mainly used for Subpixel Morphological Antialiasing. */var ColorEdgesMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new color edges material. * * @param {Vector2} [texelSize] - The absolute screen texel size. */function ColorEdgesMaterial(){var texelSize=arguments.length>0&&arguments[0]!==undefined?arguments[0]:new Vector2();classCallCheck(this,ColorEdgesMaterial);return possibleConstructorReturn(this,getPrototypeOf$2(ColorEdgesMaterial).call(this,{type:"ColorEdgesMaterial",defines:{EDGE_THRESHOLD:"0.1"},uniforms:{tDiffuse:new Uniform(null),texelSize:new Uniform(texelSize)},fragmentShader:fragment$2,vertexShader:vertex$2,depthWrite:false,depthTest:false}));}/** * Sets the edge detection sensitivity. * * A lower value results in more edges being detected at the expense of * performance. * * 0.1 is a reasonable value, and allows to catch most visible edges. * 0.05 is a rather overkill value, that allows to catch 'em all. * * If temporal supersampling is used, 0.2 could be a reasonable value, * as low contrast edges are properly filtered by just 2x. * * @param {Number} threshold - The edge detection sensitivity. Range: [0, 0.5]. */createClass(ColorEdgesMaterial,[{key:"setEdgeDetectionThreshold",value:function setEdgeDetectionThreshold(threshold){this.defines.EDGE_THRESHOLD=threshold.toFixed("2");this.needsUpdate=true;}}]);inherits(ColorEdgesMaterial,_ShaderMaterial);return ColorEdgesMaterial;}(ShaderMaterial);var fragment$3="uniform sampler2D texture1;\r\nuniform sampler2D texture2;\r\n\r\nuniform float opacity1;\r\nuniform float opacity2;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel1 = opacity1 * texture2D(texture1, vUv);\r\n\tvec4 texel2 = opacity2 * texture2D(texture2, vUv);\r\n\r\n\t#ifdef SCREEN_MODE\r\n\r\n\t\tvec3 invTexel1 = vec3(1.0) - texel1.rgb;\r\n\t\tvec3 invTexel2 = vec3(1.0) - texel2.rgb;\r\n\r\n\t\tvec4 color = vec4(\r\n\t\t\tvec3(1.0) - invTexel1 * invTexel2,\r\n\t\t\ttexel1.a + texel2.a\r\n\t\t);\r\n\r\n\t#else\r\n\r\n\t\tvec4 color = texel1 + texel2;\r\n\r\n\t#endif\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n";var vertex$3="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * A material for combining two textures. * * This material supports the two blend modes Add and Screen. * * In Screen mode, the two textures are effectively projected on a white screen * simultaneously. In Add mode, the textures are simply added together which * often produces undesired, washed out results. */var CombineMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new combine material. * * @param {Boolean} [screenMode=false] - Whether the screen blend mode should be used. */function CombineMaterial(){var _this;var screenMode=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;classCallCheck(this,CombineMaterial);_this=possibleConstructorReturn(this,getPrototypeOf$2(CombineMaterial).call(this,{type:"CombineMaterial",uniforms:{texture1:new Uniform(null),texture2:new Uniform(null),opacity1:new Uniform(1.0),opacity2:new Uniform(1.0)},fragmentShader:fragment$3,vertexShader:vertex$3,depthWrite:false,depthTest:false}));_this.setScreenModeEnabled(screenMode);return _this;}/** * Enables or disables the Screen blend mode. * * @param {Boolean} enabled - Whether the Screen blend mode should be enabled. */createClass(CombineMaterial,[{key:"setScreenModeEnabled",value:function setScreenModeEnabled(enabled){if(enabled){this.defines.SCREEN_MODE="1";}else{delete this.defines.SCREEN_MODE;}this.needsUpdate=true;}}]);inherits(CombineMaterial,_ShaderMaterial);return CombineMaterial;}(ShaderMaterial);var fragment$4="#include \r\n#include \r\n\r\nuniform sampler2D tDiffuse;\r\n\r\nvarying vec2 vUv0;\r\nvarying vec2 vUv1;\r\nvarying vec2 vUv2;\r\nvarying vec2 vUv3;\r\n\r\nvoid main() {\r\n\r\n\t// Sample top left texel.\r\n\tvec4 sum = texture2D(tDiffuse, vUv0);\r\n\r\n\t// Sample top right texel.\r\n\tsum += texture2D(tDiffuse, vUv1);\r\n\r\n\t// Sample bottom right texel.\r\n\tsum += texture2D(tDiffuse, vUv2);\r\n\r\n\t// Sample bottom left texel.\r\n\tsum += texture2D(tDiffuse, vUv3);\r\n\r\n\t// Compute the average.\r\n\tgl_FragColor = sum * 0.25;\r\n\r\n\t#include \r\n\r\n}\r\n";var vertex$4="uniform vec2 texelSize;\r\nuniform vec2 halfTexelSize;\r\nuniform float kernel;\r\n\r\nvarying vec2 vUv0;\r\nvarying vec2 vUv1;\r\nvarying vec2 vUv2;\r\nvarying vec2 vUv3;\r\n\r\nvoid main() {\r\n\r\n\tvec2 dUv = (texelSize * vec2(kernel)) + halfTexelSize;\r\n\r\n\tvUv0 = vec2(uv.x - dUv.x, uv.y + dUv.y);\r\n\tvUv1 = vec2(uv.x + dUv.x, uv.y + dUv.y);\r\n\tvUv2 = vec2(uv.x + dUv.x, uv.y - dUv.y);\r\n\tvUv3 = vec2(uv.x - dUv.x, uv.y - dUv.y);\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * An optimised convolution shader material. * * This material supports dithering. * * Based on the GDC2003 Presentation by Masaki Kawase, Bunkasha Games: * Frame Buffer Postprocessing Effects in DOUBLE-S.T.E.A.L (Wreckless) * and an article by Filip Strugar, Intel: * An investigation of fast real-time GPU-based image blur algorithms * * Further modified according to Apple's * [Best Practices for Shaders](https://goo.gl/lmRoM5). */var ConvolutionMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new convolution material. * * @param {Vector2} [texelSize] - The absolute screen texel size. */function ConvolutionMaterial(){var _this;var texelSize=arguments.length>0&&arguments[0]!==undefined?arguments[0]:new Vector2();classCallCheck(this,ConvolutionMaterial);_this=possibleConstructorReturn(this,getPrototypeOf$2(ConvolutionMaterial).call(this,{type:"ConvolutionMaterial",uniforms:{tDiffuse:new Uniform(null),texelSize:new Uniform(new Vector2()),halfTexelSize:new Uniform(new Vector2()),kernel:new Uniform(0.0)},fragmentShader:fragment$4,vertexShader:vertex$4,depthWrite:false,depthTest:false}));_this.setTexelSize(texelSize.x,texelSize.y);/** * The current kernel size. * * @type {KernelSize} * @default KernelSize.LARGE */_this.kernelSize=KernelSize.LARGE;return _this;}/** * Returns the kernel. * * @return {Float32Array} The kernel. */createClass(ConvolutionMaterial,[{key:"getKernel",value:function getKernel(){return kernelPresets[this.kernelSize];}/** * Sets the texel size. * * @param {Number} x - The texel width. * @param {Number} y - The texel height. */},{key:"setTexelSize",value:function setTexelSize(x,y){this.uniforms.texelSize.value.set(x,y);this.uniforms.halfTexelSize.value.set(x,y).multiplyScalar(0.5);}}]);inherits(ConvolutionMaterial,_ShaderMaterial);return ConvolutionMaterial;}(ShaderMaterial);/** * The Kawase blur kernel presets. * * @type {Float32Array[]} * @private */var kernelPresets=[new Float32Array([0.0,0.0]),new Float32Array([0.0,1.0,1.0]),new Float32Array([0.0,1.0,1.0,2.0]),new Float32Array([0.0,1.0,2.0,2.0,3.0]),new Float32Array([0.0,1.0,2.0,3.0,4.0,4.0,5.0]),new Float32Array([0.0,1.0,2.0,3.0,4.0,5.0,7.0,8.0,9.0,10.0])];/** * A kernel size enumeration. * * @type {Object} * @property {Number} VERY_SMALL - A very small kernel that matches a 7x7 Gauss blur kernel. * @property {Number} SMALL - A small kernel that matches a 15x15 Gauss blur kernel. * @property {Number} MEDIUM - A medium sized kernel that matches a 23x23 Gauss blur kernel. * @property {Number} LARGE - A large kernel that matches a 35x35 Gauss blur kernel. * @property {Number} VERY_LARGE - A very large kernel that matches a 63x63 Gauss blur kernel. * @property {Number} HUGE - A huge kernel that matches a 127x127 Gauss blur kernel. */var KernelSize={VERY_SMALL:0,SMALL:1,MEDIUM:2,LARGE:3,VERY_LARGE:4,HUGE:5};var fragment$5="uniform sampler2D tDiffuse;\r\nuniform float opacity;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tgl_FragColor = opacity * texel;\r\n\r\n}\r\n";var vertex$5="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * A simple copy shader material. */var CopyMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new copy material. */function CopyMaterial(){classCallCheck(this,CopyMaterial);return possibleConstructorReturn(this,getPrototypeOf$2(CopyMaterial).call(this,{type:"CopyMaterial",uniforms:{tDiffuse:new Uniform(null),opacity:new Uniform(1.0)},fragmentShader:fragment$5,vertexShader:vertex$5,depthWrite:false,depthTest:false}));}inherits(CopyMaterial,_ShaderMaterial);return CopyMaterial;}(ShaderMaterial);var fragment$6="#include \r\n#include \r\n\r\nuniform sampler2D tDepth;\r\nuniform float cameraNear;\r\nuniform float cameraFar;\r\n\r\nvarying float vViewZ;\r\nvarying vec4 vProjTexCoord;\r\n\r\nvoid main() {\r\n\r\n\t#include \r\n\r\n\t// Transform into Cartesian coordinate (not mirrored).\r\n\tvec2 projTexCoord = (vProjTexCoord.xy / vProjTexCoord.w) * 0.5 + 0.5;\r\n\tprojTexCoord = clamp(projTexCoord, 0.002, 0.998);\r\n\r\n\tfloat fragCoordZ = unpackRGBAToDepth(texture2D(tDepth, projTexCoord));\r\n\r\n\t#ifdef PERSPECTIVE_CAMERA\r\n\r\n\t\tfloat viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\r\n\r\n\t#else\r\n\r\n\t\tfloat viewZ = orthographicDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\r\n\r\n\t#endif\r\n\r\n\tfloat depthTest = (-vViewZ > -viewZ) ? 1.0 : 0.0;\r\n\r\n\tgl_FragColor.rgb = vec3(0.0, depthTest, 1.0);\r\n\r\n}\r\n";var vertex$6="#include \r\n#include \r\n#include \r\n#include \r\n\r\nvarying float vViewZ;\r\nvarying vec4 vProjTexCoord;\r\n\r\nvoid main() {\r\n\r\n\t#include \r\n\r\n\t#include \r\n\t#include \r\n\t#include \r\n\t#include \r\n\r\n\tvViewZ = mvPosition.z;\r\n\tvProjTexCoord = gl_Position;\r\n\r\n\t#include \r\n\r\n}\r\n";/** * A depth comparison shader material. */var DepthComparisonMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new depth comparison material. * * @param {Texture} [depthTexture=null] - A depth texture. * @param {PerspectiveCamera} [camera] - A camera. */function DepthComparisonMaterial(){var _this;var depthTexture=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;var camera=arguments.length>1?arguments[1]:undefined;classCallCheck(this,DepthComparisonMaterial);_this=possibleConstructorReturn(this,getPrototypeOf$2(DepthComparisonMaterial).call(this,{type:"DepthComparisonMaterial",uniforms:{tDepth:new Uniform(depthTexture),cameraNear:new Uniform(0.1),cameraFar:new Uniform(2000)},fragmentShader:fragment$6,vertexShader:vertex$6,depthWrite:false,depthTest:false,morphTargets:true,skinning:true}));_this.adoptCameraSettings(camera);return _this;}/** * Adopts the settings of the given camera. * * @param {Camera} [camera=null] - A camera. */createClass(DepthComparisonMaterial,[{key:"adoptCameraSettings",value:function adoptCameraSettings(){var camera=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;if(camera!==null){this.uniforms.cameraNear.value=camera.near;this.uniforms.cameraFar.value=camera.far;if(camera instanceof PerspectiveCamera){this.defines.PERSPECTIVE_CAMERA="1";}else{delete this.defines.PERSPECTIVE_CAMERA;}}}}]);inherits(DepthComparisonMaterial,_ShaderMaterial);return DepthComparisonMaterial;}(ShaderMaterial);var fragment$7="uniform sampler2D tDiffuse;\r\n\r\nuniform float angle;\r\nuniform float scale;\r\nuniform float intensity;\r\n\r\nvarying vec2 vUv;\r\nvarying vec2 vUvPattern;\r\n\r\nfloat pattern() {\r\n\r\n\tfloat s = sin(angle);\r\n\tfloat c = cos(angle);\r\n\r\n\tvec2 point = vec2(c * vUvPattern.x - s * vUvPattern.y, s * vUvPattern.x + c * vUvPattern.y) * scale;\r\n\r\n\treturn (sin(point.x) * sin(point.y)) * 4.0;\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tvec3 color = texel.rgb;\r\n\r\n\t#ifdef AVERAGE\r\n\r\n\t\tcolor = vec3((color.r + color.g + color.b) / 3.0);\r\n\r\n\t#endif\r\n\r\n\tcolor = vec3(color * 10.0 - 5.0 + pattern());\r\n\tcolor = texel.rgb + (color - texel.rgb) * intensity;\r\n\r\n\tgl_FragColor = vec4(color, texel.a);\r\n\r\n}\r\n";var vertex$7="uniform vec4 offsetRepeat;\r\n\r\nvarying vec2 vUv;\r\nvarying vec2 vUvPattern;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tvUvPattern = uv * offsetRepeat.zw + offsetRepeat.xy;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * A dot screen shader material. */var DotScreenMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new dot screen material. * * @param {Boolean} [options] - The options. * @param {Boolean} [options.average=false] - Whether the shader should output the colour average (black and white). * @param {Boolean} [options.angle=1.57] - The angle of the dot pattern. * @param {Boolean} [options.scale=1.0] - The scale of the dot pattern. * @param {Boolean} [options.intensity=1.0] - The intensity of the effect. */function DotScreenMaterial(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,DotScreenMaterial);var settings=Object.assign({average:false,angle:1.57,scale:1.0,intensity:1.0},options);_this=possibleConstructorReturn(this,getPrototypeOf$2(DotScreenMaterial).call(this,{type:"DotScreenMaterial",uniforms:{tDiffuse:new Uniform(null),angle:new Uniform(settings.angle),scale:new Uniform(settings.scale),intensity:new Uniform(settings.intensity),offsetRepeat:new Uniform(new Vector4(0.5,0.5,1.0,1.0))},fragmentShader:fragment$7,vertexShader:vertex$7,depthWrite:false,depthTest:false}));_this.setAverageEnabled(settings.average);return _this;}/** * Enables or disables the Screen blend mode. * * @param {Boolean} enabled - Whether the Screen blend mode should be enabled. */createClass(DotScreenMaterial,[{key:"setAverageEnabled",value:function setAverageEnabled(enabled){if(enabled){this.defines.AVERAGE="1";}else{delete this.defines.AVERAGE;}this.needsUpdate=true;}}]);inherits(DotScreenMaterial,_ShaderMaterial);return DotScreenMaterial;}(ShaderMaterial);var fragment$8="uniform sampler2D tDiffuse;\r\nuniform float time;\r\n\r\nvarying vec2 vUv;\r\n\r\n#ifdef NOISE\r\n\r\n\tuniform float noiseIntensity;\r\n\r\n#endif\r\n\r\n#ifdef SCANLINES\r\n\r\n\tuniform float scanlineIntensity;\r\n\tuniform float scanlineCount;\r\n\r\n#endif\r\n\r\n#ifdef GRID\r\n\r\n\tuniform float gridIntensity;\r\n\tuniform vec2 gridScale;\r\n\tuniform float gridLineWidth;\r\n\r\n#endif\r\n\r\n#ifdef GREYSCALE\r\n\r\n\t#include \r\n\r\n\tuniform float greyscaleIntensity;\r\n\r\n#elif defined(SEPIA)\r\n\r\n\tuniform float sepiaIntensity;\r\n\r\n#endif\r\n\r\n#ifdef VIGNETTE\r\n\r\n\tuniform float vignetteOffset;\r\n\tuniform float vignetteDarkness;\r\n\r\n#endif\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tvec3 color = texel.rgb;\r\n\r\n\t#ifdef SCREEN_MODE\r\n\r\n\t\tvec3 invColor;\r\n\r\n\t#endif\r\n\r\n\t#ifdef NOISE\r\n\r\n\t\tfloat x = vUv.x * vUv.y * time * 1000.0;\r\n\t\tx = mod(x, 13.0) * mod(x, 123.0);\r\n\t\tx = mod(x, 0.01);\r\n\r\n\t\tvec3 noise = texel.rgb * clamp(0.1 + x * 100.0, 0.0, 1.0) * noiseIntensity;\r\n\r\n\t\t#ifdef SCREEN_MODE\r\n\r\n\t\t\tinvColor = vec3(1.0) - color;\r\n\t\t\tvec3 invNoise = vec3(1.0) - noise;\r\n\r\n\t\t\tcolor = vec3(1.0) - invColor * invNoise;\r\n\r\n\t\t#else\r\n\r\n\t\t\tcolor += noise;\r\n\r\n\t\t#endif\r\n\r\n\t#endif\r\n\r\n\t#ifdef SCANLINES\r\n\r\n\t\tvec2 sl = vec2(sin(vUv.y * scanlineCount), cos(vUv.y * scanlineCount));\r\n\t\tvec3 scanlines = texel.rgb * vec3(sl.x, sl.y, sl.x) * scanlineIntensity;\r\n\r\n\t\t#ifdef SCREEN_MODE\r\n\r\n\t\t\tinvColor = vec3(1.0) - color;\r\n\t\t\tvec3 invScanlines = vec3(1.0) - scanlines;\r\n\r\n\t\t\tcolor = vec3(1.0) - invColor * invScanlines;\r\n\r\n\t\t#else\r\n\r\n\t\t\tcolor += scanlines;\r\n\r\n\t\t#endif\r\n\r\n\t#endif\r\n\r\n\t#ifdef GRID\r\n\r\n\t\tfloat grid = 0.5 - max(abs(mod(vUv.x * gridScale.x, 1.0) - 0.5), abs(mod(vUv.y * gridScale.y, 1.0) - 0.5));\r\n\t\tcolor *= (1.0 - gridIntensity) + vec3(smoothstep(0.0, gridLineWidth, grid)) * gridIntensity;\r\n\r\n\t#endif\r\n\r\n\t#ifdef GREYSCALE\r\n\r\n\t\tcolor = mix(color, vec3(linearToRelativeLuminance(color)), greyscaleIntensity);\r\n\r\n\t#elif defined(SEPIA)\r\n\r\n\t\tvec3 c = color.rgb;\r\n\r\n\t\tcolor.r = dot(c, vec3(1.0 - 0.607 * sepiaIntensity, 0.769 * sepiaIntensity, 0.189 * sepiaIntensity));\r\n\t\tcolor.g = dot(c, vec3(0.349 * sepiaIntensity, 1.0 - 0.314 * sepiaIntensity, 0.168 * sepiaIntensity));\r\n\t\tcolor.b = dot(c, vec3(0.272 * sepiaIntensity, 0.534 * sepiaIntensity, 1.0 - 0.869 * sepiaIntensity));\r\n\r\n\t#endif\r\n\r\n\t#ifdef VIGNETTE\r\n\r\n\t\tconst vec2 center = vec2(0.5);\r\n\r\n\t\t#ifdef ESKIL\r\n\r\n\t\t\tvec2 uv = (vUv - center) * vec2(vignetteOffset);\r\n\t\t\tcolor = mix(color.rgb, vec3(1.0 - vignetteDarkness), dot(uv, uv));\r\n\r\n\t\t#else\r\n\r\n\t\t\tfloat dist = distance(vUv, center);\r\n\t\t\tcolor *= smoothstep(0.8, vignetteOffset * 0.799, dist * (vignetteDarkness + vignetteOffset));\r\n\r\n\t\t#endif\t\t\r\n\r\n\t#endif\r\n\r\n\tgl_FragColor = vec4(clamp(color, 0.0, 1.0), texel.a);\r\n\r\n}\r\n";var vertex$8="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * A cinematic shader that provides the following effects: * - Film Grain * - Scanlines * - Vignette * - Greyscale * - Sepia * * Original scanlines algorithm by Pat "Hawthorne" Shearon. * http://www.truevision3d.com/forums/showcase/staticnoise_colorblackwhite_scanline_shaders-t18698.0.html * * Optimised scanlines and noise with intensity scaling by Georg "Leviathan" * Steinrohder. This version was provided under a Creative Commons Attribution * 3.0 License: http://creativecommons.org/licenses/by/3.0. * * The sepia effect is based on: * https://github.com/evanw/glfx.js * * The vignette code is based on PaintEffect postprocess from ro.me: * http://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js */var FilmMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new film material. * * @param {Object} [options] - The options. Disabled effects will not be included in the final shader and have no negative impact on performance. * @param {Boolean} [options.greyscale=false] - Enable greyscale effect. Greyscale and sepia are mutually exclusive. * @param {Boolean} [options.sepia=false] - Enable sepia effect. Greyscale and sepia are mutually exclusive. * @param {Boolean} [options.vignette=false] - Apply vignette effect. * @param {Boolean} [options.eskil=false] - Use Eskil's vignette approach. The default looks dusty while Eskil looks burned out. * @param {Boolean} [options.screenMode=true] - Whether the screen blend mode should be used for noise and scanlines. Both of these effects are computed independently. * @param {Boolean} [options.noise=true] - Show noise-based film grain. * @param {Boolean} [options.scanlines=true] - Show scanlines. * @param {Boolean} [options.grid=true] - Show a grid. * @param {Number} [options.noiseIntensity=0.5] - The noise intensity. * @param {Number} [options.scanlineIntensity=0.05] - The scanline intensity. * @param {Number} [options.gridIntensity=1.0] - The grid strength. 0.0 to 1.0. * @param {Number} [options.greyscaleIntensity=1.0] - The intensity of the greyscale effect. 0.0 to 1.0. * @param {Number} [options.sepiaIntensity=1.0] - The intensity of the sepia effect. 0.0 to 1.0. * @param {Number} [options.vignetteOffset=1.0] - The offset of the vignette effect. 0.0 to 1.0. * @param {Number} [options.vignetteDarkness=1.0] - The darkness of the vignette effect. 0.0 to 1.0. */function FilmMaterial(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,FilmMaterial);var settings=Object.assign({screenMode:true,noise:true,scanlines:true,grid:false,greyscale:false,sepia:false,vignette:false,eskil:false,noiseIntensity:0.5,scanlineIntensity:0.05,gridIntensity:1.0,greyscaleIntensity:1.0,sepiaIntensity:1.0,vignetteOffset:1.0,vignetteDarkness:1.0},options);_this=possibleConstructorReturn(this,getPrototypeOf$2(FilmMaterial).call(this,{type:"FilmMaterial",uniforms:{tDiffuse:new Uniform(null),time:new Uniform(0.0),noiseIntensity:new Uniform(settings.noiseIntensity),scanlineIntensity:new Uniform(settings.scanlineIntensity),gridIntensity:new Uniform(settings.gridIntensity),scanlineCount:new Uniform(0.0),gridScale:new Uniform(new Vector2()),gridLineWidth:new Uniform(0.0),greyscaleIntensity:new Uniform(settings.greyscaleIntensity),sepiaIntensity:new Uniform(settings.sepiaIntensity),vignetteOffset:new Uniform(settings.vignetteOffset),vignetteDarkness:new Uniform(settings.vignetteDarkness)},fragmentShader:fragment$8,vertexShader:vertex$8,depthWrite:false,depthTest:false}));_this.setScreenModeEnabled(settings.screenMode);_this.setNoiseEnabled(settings.noise);_this.setScanlinesEnabled(settings.scanlines);_this.setGridEnabled(settings.grid);_this.setGreyscaleEnabled(settings.greyscale);_this.setSepiaEnabled(settings.sepia);_this.setVignetteEnabled(settings.vignette);_this.setEskilEnabled(settings.eskil);return _this;}/** * Enables or disables the Screen blend mode. * * @param {Boolean} enabled - Whether the Screen blend mode should be enabled. */createClass(FilmMaterial,[{key:"setScreenModeEnabled",value:function setScreenModeEnabled(enabled){if(enabled){this.defines.SCREEN_MODE="1";}else{delete this.defines.SCREEN_MODE;}this.needsUpdate=true;}/** * Enables or disables the noise effect. * * @param {Boolean} enabled - Whether the noise effect should be enabled. */},{key:"setNoiseEnabled",value:function setNoiseEnabled(enabled){if(enabled){this.defines.NOISE="1";}else{delete this.defines.NOISE;}this.needsUpdate=true;}/** * Enables or disables the scanlines effect. * * @param {Boolean} enabled - Whether the scanlines effect should be enabled. */},{key:"setScanlinesEnabled",value:function setScanlinesEnabled(enabled){if(enabled){this.defines.SCANLINES="1";}else{delete this.defines.SCANLINES;}this.needsUpdate=true;}/** * Enables or disables the grid effect. * * @param {Boolean} enabled - Whether the grid effect should be enabled. */},{key:"setGridEnabled",value:function setGridEnabled(enabled){if(enabled){this.defines.GRID="1";}else{delete this.defines.GRID;}this.needsUpdate=true;}/** * Enables or disables the greyscale effect. * * @param {Boolean} enabled - Whether the greyscale effect should be enabled. */},{key:"setGreyscaleEnabled",value:function setGreyscaleEnabled(enabled){if(enabled){this.defines.GREYSCALE="1";}else{delete this.defines.GREYSCALE;}this.needsUpdate=true;}/** * Enables or disables the sepia effect. * * @param {Boolean} enabled - Whether the sepia effect should be enabled. */},{key:"setSepiaEnabled",value:function setSepiaEnabled(enabled){if(enabled){this.defines.SEPIA="1";}else{delete this.defines.SEPIA;}this.needsUpdate=true;}/** * Enables or disables the Vignette effect. * * @param {Boolean} enabled - Whether the Vignette effect should be enabled. */},{key:"setVignetteEnabled",value:function setVignetteEnabled(enabled){if(enabled){this.defines.VIGNETTE="1";}else{delete this.defines.VIGNETTE;}this.needsUpdate=true;}/** * Enables or disables the Eskil Vignette effect. * * Has no effect if Vignette is disabled. * * @param {Boolean} enabled - Whether the Eskil Vignette effect should be enabled. */},{key:"setEskilEnabled",value:function setEskilEnabled(enabled){if(enabled){this.defines.ESKIL="1";}else{delete this.defines.ESKIL;}this.needsUpdate=true;}}]);inherits(FilmMaterial,_ShaderMaterial);return FilmMaterial;}(ShaderMaterial);var fragment$9="uniform sampler2D tDiffuse;\r\nuniform sampler2D tPerturb;\r\n\r\nuniform bool active;\r\n\r\nuniform float amount;\r\nuniform float angle;\r\nuniform float seed;\r\nuniform float seedX;\r\nuniform float seedY;\r\nuniform float distortionX;\r\nuniform float distortionY;\r\nuniform float colS;\r\n\r\nvarying vec2 vUv;\r\n\r\nfloat rand(vec2 tc) {\r\n\r\n\tconst float a = 12.9898;\r\n\tconst float b = 78.233;\r\n\tconst float c = 43758.5453;\r\n\r\n\tfloat dt = dot(tc, vec2(a, b));\r\n\tfloat sn = mod(dt, 3.14);\r\n\r\n\treturn fract(sin(sn) * c);\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\tvec2 coord = vUv;\r\n\r\n\tfloat xs, ys;\r\n\tvec4 normal;\r\n\r\n\tvec2 offset;\r\n\tvec4 cr, cga, cb;\r\n\tvec4 snow, color;\r\n\r\n\tfloat sx, sy;\r\n\r\n\tif(active) {\r\n\r\n\t\txs = floor(gl_FragCoord.x / 0.5);\r\n\t\tys = floor(gl_FragCoord.y / 0.5);\r\n\r\n\t\tnormal = texture2D(tPerturb, coord * seed * seed);\r\n\r\n\t\tif(coord.y < distortionX + colS && coord.y > distortionX - colS * seed) {\r\n\r\n\t\t\tsx = clamp(ceil(seedX), 0.0, 1.0);\r\n\t\t\tcoord.y = sx * (1.0 - (coord.y + distortionY)) + (1.0 - sx) * distortionY;\r\n\r\n\t\t}\r\n\r\n\t\tif(coord.x < distortionY + colS && coord.x > distortionY - colS * seed) {\r\n\r\n\t\t\tsy = clamp(ceil(seedY), 0.0, 1.0);\r\n\t\t\tcoord.x = sy * distortionX + (1.0 - sy) * (1.0 - (coord.x + distortionX));\r\n\r\n\t\t}\r\n\r\n\t\tcoord.x += normal.x * seedX * (seed / 5.0);\r\n\t\tcoord.y += normal.y * seedY * (seed / 5.0);\r\n\r\n\t\toffset = amount * vec2(cos(angle), sin(angle));\r\n\r\n\t\tcr = texture2D(tDiffuse, coord + offset);\r\n\t\tcga = texture2D(tDiffuse, coord);\r\n\t\tcb = texture2D(tDiffuse, coord - offset);\r\n\r\n\t\tcolor = vec4(cr.r, cga.g, cb.b, cga.a);\r\n\t\tsnow = 200.0 * amount * vec4(rand(vec2(xs * seed, ys * seed * 50.0)) * 0.2);\r\n\t\tcolor += snow;\r\n\r\n\t} else {\r\n\r\n\t\tcolor = texture2D(tDiffuse, vUv);\r\n\r\n\t}\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n";var vertex$9="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * A glitch shader material. * * Reference: * https://github.com/staffantan/unityglitch */var GlitchMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new glitch material. */function GlitchMaterial(){classCallCheck(this,GlitchMaterial);return possibleConstructorReturn(this,getPrototypeOf$2(GlitchMaterial).call(this,{type:"GlitchMaterial",uniforms:{tDiffuse:new Uniform(null),tPerturb:new Uniform(null),active:new Uniform(1),amount:new Uniform(0.8),angle:new Uniform(0.02),seed:new Uniform(0.02),seedX:new Uniform(0.02),seedY:new Uniform(0.02),distortionX:new Uniform(0.5),distortionY:new Uniform(0.6),colS:new Uniform(0.05)},fragmentShader:fragment$9,vertexShader:vertex$9,depthWrite:false,depthTest:false}));}inherits(GlitchMaterial,_ShaderMaterial);return GlitchMaterial;}(ShaderMaterial);var fragment$10="#include \r\n#include \r\n\r\nuniform sampler2D tDiffuse;\r\nuniform vec3 lightPosition;\r\n\r\nuniform float exposure;\r\nuniform float decay;\r\nuniform float density;\r\nuniform float weight;\r\nuniform float clampMax;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec2 texCoord = vUv;\r\n\r\n\t// Calculate vector from pixel to light source in screen space.\r\n\tvec2 deltaTexCoord = texCoord - lightPosition.st;\r\n\tdeltaTexCoord *= 1.0 / NUM_SAMPLES_FLOAT * density;\r\n\r\n\t// A decreasing illumination factor.\r\n\tfloat illuminationDecay = 1.0;\r\n\r\n\tvec4 sample;\r\n\tvec4 color = vec4(0.0);\r\n\r\n\t// Estimate the probability of occlusion at each pixel by summing samples along a ray to the light source.\r\n\tfor(int i = 0; i < NUM_SAMPLES_INT; ++i) {\r\n\r\n\t\ttexCoord -= deltaTexCoord;\r\n\t\tsample = texture2D(tDiffuse, texCoord);\r\n\r\n\t\t// Apply sample attenuation scale/decay factors.\r\n\t\tsample *= illuminationDecay * weight;\r\n\r\n\t\tcolor += sample;\r\n\r\n\t\t// Update exponential decay factor.\r\n\t\tilluminationDecay *= decay;\r\n\r\n\t}\r\n\r\n\tgl_FragColor = clamp(color * exposure, 0.0, clampMax);\r\n\r\n\t#include \r\n\r\n}\r\n";var vertex$10="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * A crepuscular rays shader material. * * This material supports dithering. * * References: * * Thibaut Despoulain, 2012: * [(WebGL) Volumetric Light Approximation in Three.js]( * http://bkcore.com/blog/3d/webgl-three-js-volumetric-light-godrays.html) * * Nvidia, GPU Gems 3, 2008: * [Chapter 13. Volumetric Light Scattering as a Post-Process]( * https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch13.html) */var GodRaysMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new god rays material. * * @param {Object} [options] - The options. * @param {Number} [options.density=0.96] - The density of the light rays. * @param {Number} [options.decay=0.93] - An illumination decay factor. * @param {Number} [options.weight=0.4] - A light ray weight factor. * @param {Number} [options.exposure=0.6] - A constant attenuation coefficient. * @param {Number} [options.clampMax=1.0] - An upper bound for the saturation of the overall effect. */function GodRaysMaterial(){var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,GodRaysMaterial);var settings=Object.assign({exposure:0.6,density:0.93,decay:0.96,weight:0.4,clampMax:1.0},options);return possibleConstructorReturn(this,getPrototypeOf$2(GodRaysMaterial).call(this,{type:"GodRaysMaterial",defines:{NUM_SAMPLES_FLOAT:"60.0",NUM_SAMPLES_INT:"60"},uniforms:{tDiffuse:new Uniform(null),lightPosition:new Uniform(null),exposure:new Uniform(settings.exposure),decay:new Uniform(settings.decay),density:new Uniform(settings.density),weight:new Uniform(settings.weight),clampMax:new Uniform(settings.clampMax)},fragmentShader:fragment$10,vertexShader:vertex$10,depthWrite:false,depthTest:false}));}inherits(GodRaysMaterial,_ShaderMaterial);return GodRaysMaterial;}(ShaderMaterial);var fragment$11="#include \r\n\r\nuniform sampler2D tDiffuse;\r\nuniform float distinction;\r\nuniform vec2 range;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tfloat l = linearToRelativeLuminance(texel.rgb);\r\n\r\n\t#ifdef RANGE\r\n\r\n\t\tfloat low = step(range.x, l);\r\n\t\tfloat high = step(l, range.y);\r\n\r\n\t\t// Apply the mask.\r\n\t\tl *= low * high;\r\n\r\n\t#endif\r\n\r\n\tl = pow(abs(l), distinction);\r\n\r\n\t#ifdef COLOR\r\n\r\n\t\tgl_FragColor = vec4(texel.rgb * l, texel.a);\r\n\r\n\t#else\r\n\r\n\t\tgl_FragColor = vec4(l, l, l, texel.a);\r\n\r\n\t#endif\r\n\r\n}\r\n";var vertex$11="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * A luminosity shader material. * * This shader produces a greyscale luminance map that describes the absolute * amount of light emitted by a scene. It can also be configured to output * colours that are scaled with their respective luminance value. Additionally, * a range may be provided to mask out undesired texels. * * The alpha channel will remain unaffected in all cases. * * On luminance coefficients: * http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC9 * * Coefficients for different colour spaces: * https://hsto.org/getpro/habr/post_images/2ab/69d/084/2ab69d084f9a597e032624bcd74d57a7.png * * Luminance range reference: * https://cycling74.com/2007/05/23/your-first-shader/#.Vty9FfkrL4Z */var LuminosityMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new luminosity material. * * @param {Boolean} [colorOutput=false] - Defines whether the shader should output colours scaled with their luminance value. * @param {Vector2} [luminanceRange] - If provided, the shader will mask out texels that aren't in the specified luminance range. */function LuminosityMaterial(){var _this;var colorOutput=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;var luminanceRange=arguments.length>1&&arguments[1]!==undefined?arguments[1]:null;classCallCheck(this,LuminosityMaterial);var maskLuminance=luminanceRange!==null;_this=possibleConstructorReturn(this,getPrototypeOf$2(LuminosityMaterial).call(this,{type:"LuminosityMaterial",uniforms:{tDiffuse:new Uniform(null),distinction:new Uniform(1.0),range:new Uniform(maskLuminance?luminanceRange:new Vector2())},fragmentShader:fragment$11,vertexShader:vertex$11}));_this.setColorOutputEnabled(colorOutput);_this.setLuminanceRangeEnabled(maskLuminance);return _this;}/** * Enables or disables color output. * * @param {Boolean} enabled - Whether color output should be enabled. */createClass(LuminosityMaterial,[{key:"setColorOutputEnabled",value:function setColorOutputEnabled(enabled){if(enabled){this.defines.COLOR="1";}else{delete this.defines.COLOR;}this.needsUpdate=true;}/** * Enables or disables the luminance mask. * * @param {Boolean} enabled - Whether the luminance mask should be enabled. */},{key:"setLuminanceRangeEnabled",value:function setLuminanceRangeEnabled(enabled){if(enabled){this.defines.RANGE="1";}else{delete this.defines.RANGE;}this.needsUpdate=true;}}]);inherits(LuminosityMaterial,_ShaderMaterial);return LuminosityMaterial;}(ShaderMaterial);var fragment$12="uniform sampler2D tDiffuse;\r\nuniform sampler2D tMask;\r\nuniform sampler2D tEdges;\r\n\r\nuniform vec3 visibleEdgeColor;\r\nuniform vec3 hiddenEdgeColor;\r\nuniform float pulse;\r\nuniform float edgeStrength;\r\n\r\n#ifdef USE_PATTERN\r\n\r\n\tuniform sampler2D tPattern;\r\n\tvarying vec2 vPatternCoord;\r\n\r\n#endif\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 color = texture2D(tDiffuse, vUv);\r\n\tvec2 edge = texture2D(tEdges, vUv).rg;\r\n\tvec2 mask = texture2D(tMask, vUv).rg;\r\n\r\n\t#ifndef X_RAY\r\n\r\n\t\tedge.y = 0.0;\r\n\r\n\t#endif\r\n\r\n\tedge *= (edgeStrength * mask.x * pulse);\r\n\tvec3 outlineColor = edge.x * visibleEdgeColor + edge.y * hiddenEdgeColor;\r\n\r\n\t#ifdef ALPHA_BLENDING\r\n\r\n\t\tcolor.rgb = mix(color.rgb, outlineColor, max(edge.x, edge.y));\r\n\r\n\t#else\r\n\r\n\t\tcolor.rgb += outlineColor;\r\n\r\n\t#endif\r\n\r\n\t#ifdef USE_PATTERN\r\n\r\n\t\tvec3 patternColor = texture2D(tPattern, vPatternCoord).rgb;\r\n\r\n\t\t#ifdef X_RAY\r\n\r\n\t\t\tfloat hiddenFactor = 0.5;\r\n\r\n\t\t#else\r\n\r\n\t\t\tfloat hiddenFactor = 0.0;\r\n\r\n\t\t#endif\r\n\r\n\t\tfloat visibilityFactor = (1.0 - mask.y > 0.0) ? 1.0 : hiddenFactor;\r\n\r\n\t\tcolor.rgb += visibilityFactor * (1.0 - mask.x) * (1.0 - patternColor);\r\n\r\n\t#endif\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n";var vertex$12="#ifdef USE_PATTERN\r\n\r\n\tuniform float aspect;\r\n\tuniform float patternScale;\r\n\tvarying vec2 vPatternCoord;\r\n\r\n#endif\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\t#ifdef USE_PATTERN\r\n\r\n\t\tvec2 aspectCorrection = vec2(aspect, 1.0);\r\n\t\tvPatternCoord = uv * aspectCorrection * patternScale;\r\n\r\n\t#endif\r\n\r\n\tvUv = uv;\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * An outline blend shader material. */var OutlineBlendMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new outline blend material. * * @param {Object} [options] - The options. * @param {Number} [options.edgeStrength=1.0] - The edge strength. * @param {Number} [options.patternScale=1.0] - The scale of the pattern texture. * @param {Number} [options.visibleEdgeColor=0xffffff] - The color of visible edges. * @param {Number} [options.hiddenEdgeColor=0x22090A] - The color of hidden edges. * @param {Boolean} [alphaBlending=false] - Whether the outline should be blended using alpha. * @param {Boolean} [xRay=true] - Whether hidden parts of selected objects should be visible. */function OutlineBlendMaterial(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,OutlineBlendMaterial);var settings=Object.assign({edgeStrength:1.0,patternScale:1.0,visibleEdgeColor:0xffffff,hiddenEdgeColor:0x22090A,alphaBlending:false,xRay:true},options);_this=possibleConstructorReturn(this,getPrototypeOf$2(OutlineBlendMaterial).call(this,{type:"OutlineBlendMaterial",uniforms:{pulse:new Uniform(1.0),aspect:new Uniform(1.0),tDiffuse:new Uniform(null),tMask:new Uniform(null),tEdges:new Uniform(null),tPattern:new Uniform(null),edgeStrength:new Uniform(settings.edgeStrength),patternScale:new Uniform(settings.patternScale),visibleEdgeColor:new Uniform(new Color(settings.visibleEdgeColor)),hiddenEdgeColor:new Uniform(new Color(settings.hiddenEdgeColor))},fragmentShader:fragment$12,vertexShader:vertex$12,depthWrite:false,depthTest:false}));_this.setAlphaBlendingEnabled(settings.alphaBlending);_this.setXRayEnabled(settings.xRay);return _this;}/** * Enables or disables the alpha blending. * * @param {Boolean} enabled - Whether the alpha blending should be enabled. */createClass(OutlineBlendMaterial,[{key:"setAlphaBlendingEnabled",value:function setAlphaBlendingEnabled(enabled){if(enabled){this.defines.ALPHA_BLENDING="1";}else{delete this.defines.ALPHA_BLENDING;}this.needsUpdate=true;}/** * Defines whether hidden parts of selected objects should be visible. * * @param {Boolean} enabled - Whether hidden parts of selected objects should be visible. */},{key:"setXRayEnabled",value:function setXRayEnabled(enabled){if(enabled){this.defines.X_RAY="1";}else{delete this.defines.X_RAY;}this.needsUpdate=true;}/** * Sets a pattern texture to use as overlay. * * @param {Texture} [texture=null] - A pattern texture. Set to null to disable the pattern. */},{key:"setPatternTexture",value:function setPatternTexture(){var texture=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;if(texture!==null){this.defines.USE_PATTERN="1";}else{delete this.defines.USE_PATTERN;}this.uniforms.tPattern.value=texture;this.needsUpdate=true;}}]);inherits(OutlineBlendMaterial,_ShaderMaterial);return OutlineBlendMaterial;}(ShaderMaterial);var fragment$13="uniform sampler2D tMask;\r\n\r\nvarying vec2 vUv0;\r\nvarying vec2 vUv1;\r\nvarying vec2 vUv2;\r\nvarying vec2 vUv3;\r\n\r\nvoid main() {\r\n\r\n\tvec2 c0 = texture2D(tMask, vUv0).rg;\r\n\tvec2 c1 = texture2D(tMask, vUv1).rg;\r\n\tvec2 c2 = texture2D(tMask, vUv2).rg;\r\n\tvec2 c3 = texture2D(tMask, vUv3).rg;\r\n\r\n\tfloat d0 = (c0.x - c1.x) * 0.5;\r\n\tfloat d1 = (c2.x - c3.x) * 0.5;\r\n\tfloat d = length(vec2(d0, d1));\r\n\r\n\tfloat a0 = min(c0.y, c1.y);\r\n\tfloat a1 = min(c2.y, c3.y);\r\n\tfloat visibilityFactor = min(a0, a1);\r\n\r\n\tgl_FragColor.rg = (1.0 - visibilityFactor > 0.001) ? vec2(d, 0.0) : vec2(0.0, d);\r\n\r\n}\r\n";var vertex$13="uniform vec2 texelSize;\r\n\r\nvarying vec2 vUv0;\r\nvarying vec2 vUv1;\r\nvarying vec2 vUv2;\r\nvarying vec2 vUv3;\r\n\r\nvoid main() {\r\n\r\n\tvUv0 = vec2(uv.x + texelSize.x, uv.y);\r\n\tvUv1 = vec2(uv.x - texelSize.x, uv.y);\r\n\tvUv2 = vec2(uv.x, uv.y + texelSize.y);\r\n\tvUv3 = vec2(uv.x, uv.y - texelSize.y);\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * An outline edge detection shader material. */var OutlineEdgesMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new outline edge detection material. * * @param {Vector2} [texelSize] - The absolute screen texel size. */function OutlineEdgesMaterial(){var _this;var texelSize=arguments.length>0&&arguments[0]!==undefined?arguments[0]:new Vector2();classCallCheck(this,OutlineEdgesMaterial);_this=possibleConstructorReturn(this,getPrototypeOf$2(OutlineEdgesMaterial).call(this,{type:"OutlineEdgesMaterial",uniforms:{tMask:new Uniform(null),texelSize:new Uniform(new Vector2())},fragmentShader:fragment$13,vertexShader:vertex$13,depthWrite:false,depthTest:false}));_this.setTexelSize(texelSize.x,texelSize.y);return _this;}/** * Sets the texel size. * * @param {Number} x - The texel width. * @param {Number} y - The texel height. */createClass(OutlineEdgesMaterial,[{key:"setTexelSize",value:function setTexelSize(x,y){this.uniforms.texelSize.value.set(x,y);}}]);inherits(OutlineEdgesMaterial,_ShaderMaterial);return OutlineEdgesMaterial;}(ShaderMaterial);var fragment$14="uniform sampler2D tDiffuse;\r\nuniform float granularity;\r\nuniform float dx;\r\nuniform float dy;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel;\r\n\r\n\tif(granularity > 0.0) {\r\n\r\n\t\tvec2 coord = vec2(\r\n\t\t\tdx * (floor(vUv.x / dx) + 0.5),\r\n\t\t\tdy * (floor(vUv.y / dy) + 0.5)\r\n\t\t);\r\n\r\n\t\ttexel = texture2D(tDiffuse, coord);\r\n\r\n\t} else {\r\n\r\n\t\ttexel = texture2D(tDiffuse, vUv);\r\n\r\n\t}\r\n\r\n\tgl_FragColor = texel;\r\n\r\n}\r\n";var vertex$14="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * A pixelation shader material. * * Original shader code by Robert Casanova: * https://github.com/robertcasanova/pixelate-shader */var PixelationMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new pixelation material. */function PixelationMaterial(){classCallCheck(this,PixelationMaterial);return possibleConstructorReturn(this,getPrototypeOf$2(PixelationMaterial).call(this,{type:"PixelationMaterial",uniforms:{tDiffuse:new Uniform(null),granularity:new Uniform(1.0),resolution:new Uniform(new Vector2(1.0,1.0)),dx:new Uniform(1.0),dy:new Uniform(1.0)},fragmentShader:fragment$14,vertexShader:vertex$14,depthWrite:false,depthTest:false}));}/** * The pixel granularity. * * @type {Number} */createClass(PixelationMaterial,[{key:"setResolution",/** * Sets the resolution. * * @param {Number} width - The width. * @param {Number} height - The height. */value:function setResolution(width,height){this.uniforms.resolution.value.set(width,height);this.granularity=this.granularity;}},{key:"granularity",get:function get(){return this.uniforms.granularity.value;}/** * A higher value yields coarser visuals. * * @type {Number} */,set:function set(x){var uniforms=this.uniforms;var resolution=uniforms.resolution.value;uniforms.granularity.value=x;uniforms.dx.value=x/resolution.x;uniforms.dy.value=x/resolution.y;}}]);inherits(PixelationMaterial,_ShaderMaterial);return PixelationMaterial;}(ShaderMaterial);var fragment$15="#include \r\n\r\nuniform sampler2D tDiffuse;\r\nuniform sampler2D tDepth;\r\n\r\nuniform vec2 texelSize;\r\nuniform vec2 halfTexelSize;\r\n\r\nuniform float cameraNear;\r\nuniform float cameraFar;\r\n\r\nuniform float focalLength;\r\nuniform float focalStop;\r\n\r\nuniform float maxBlur;\r\nuniform float luminanceThreshold;\r\nuniform float luminanceGain;\r\nuniform float bias;\r\nuniform float fringe;\r\nuniform float ditherStrength;\r\n\r\n#ifdef SHADER_FOCUS\r\n\r\n\tuniform vec2 focusCoords;\r\n\r\n#else\r\n\r\n\tuniform float focalDepth;\r\n\r\n#endif\r\n\r\nvarying vec2 vUv;\r\n\r\n#ifndef USE_LOGDEPTHBUF\r\n\r\n\t#include \r\n\r\n\tfloat readDepth(sampler2D depthSampler, vec2 coord) {\r\n\r\n\t\tfloat fragCoordZ = texture2D(depthSampler, coord).x;\r\n\t\tfloat viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\r\n\r\n\t\treturn viewZToOrthographicDepth(viewZ, cameraNear, cameraFar);\r\n\r\n\t}\r\n\r\n#endif\r\n\r\n#ifdef PENTAGON\r\n\r\n\tfloat penta(vec2 coords) {\r\n\r\n\t\tconst vec4 HS0 = vec4( 1.0, 0.0, 0.0, 1.0);\r\n\t\tconst vec4 HS1 = vec4( 0.309016994, 0.951056516, 0.0, 1.0);\r\n\t\tconst vec4 HS2 = vec4(-0.809016994, 0.587785252, 0.0, 1.0);\r\n\t\tconst vec4 HS3 = vec4(-0.809016994, -0.587785252, 0.0, 1.0);\r\n\t\tconst vec4 HS4 = vec4( 0.309016994, -0.951056516, 0.0, 1.0);\r\n\t\tconst vec4 HS5 = vec4( 0.0, 0.0, 1.0, 1.0);\r\n\r\n\t\tconst vec4 ONE = vec4(1.0);\r\n\r\n\t\tconst float P_FEATHER = 0.4;\r\n\t\tconst float N_FEATHER = -P_FEATHER;\r\n\r\n\t\tfloat inOrOut = -4.0;\r\n\r\n\t\tvec4 P = vec4(coords, vec2(RINGS_FLOAT - 1.3));\r\n\r\n\t\tvec4 dist = vec4(\r\n\t\t\tdot(P, HS0),\r\n\t\t\tdot(P, HS1),\r\n\t\t\tdot(P, HS2),\r\n\t\t\tdot(P, HS3)\r\n\t\t);\r\n\r\n\t\tdist = smoothstep(N_FEATHER, P_FEATHER, dist);\r\n\r\n\t\tinOrOut += dot(dist, ONE);\r\n\r\n\t\tdist.x = dot(P, HS4);\r\n\t\tdist.y = HS5.w - abs(P.z);\r\n\r\n\t\tdist = smoothstep(N_FEATHER, P_FEATHER, dist);\r\n\t\tinOrOut += dist.x;\r\n\r\n\t\treturn clamp(inOrOut, 0.0, 1.0);\r\n\r\n\t}\r\n\r\n#endif\r\n\r\n#ifdef SHOW_FOCUS\r\n\r\n\tvec3 debugFocus(vec3 c, float blur, float depth) {\r\n\r\n\t\tfloat edge = 0.002 * depth;\r\n\t\tfloat m = clamp(smoothstep(0.0, edge, blur), 0.0, 1.0);\r\n\t\tfloat e = clamp(smoothstep(1.0 - edge, 1.0, blur), 0.0, 1.0);\r\n\r\n\t\tc = mix(c, vec3(1.0, 0.5, 0.0), (1.0 - m) * 0.6);\r\n\t\tc = mix(c, vec3(0.0, 0.5, 1.0), ((1.0 - e) - (1.0 - m)) * 0.2);\r\n\r\n\t\treturn c;\r\n\r\n\t}\r\n\r\n#endif\r\n\r\n#ifdef VIGNETTE\r\n\r\n\tfloat vignette() {\r\n\r\n\t\tconst vec2 CENTER = vec2(0.5);\r\n\r\n\t\tconst float VIGNETTE_OUT = 1.3;\r\n\t\tconst float VIGNETTE_IN = 0.0;\r\n\t\tconst float VIGNETTE_FADE = 22.0; \r\n\r\n\t\tfloat d = distance(vUv, CENTER);\r\n\t\td = smoothstep(VIGNETTE_OUT + (focalStop / VIGNETTE_FADE), VIGNETTE_IN + (focalStop / VIGNETTE_FADE), d);\r\n\r\n\t\treturn clamp(d, 0.0, 1.0);\r\n\r\n\t}\r\n\r\n#endif\r\n\r\nvec2 rand2(vec2 coord) {\r\n\r\n\tvec2 noise;\r\n\r\n\t#ifdef NOISE\r\n\r\n\t\tconst float a = 12.9898;\r\n\t\tconst float b = 78.233;\r\n\t\tconst float c = 43758.5453;\r\n\r\n\t\tnoise.x = clamp(fract(sin(mod(dot(coord, vec2(a, b)), 3.14)) * c), 0.0, 1.0) * 2.0 - 1.0;\r\n\t\tnoise.y = clamp(fract(sin(mod(dot(coord, vec2(a, b) * 2.0), 3.14)) * c), 0.0, 1.0) * 2.0 - 1.0;\r\n\r\n\t#else\r\n\r\n\t\tnoise.x = ((fract(1.0 - coord.s * halfTexelSize.x) * 0.25) + (fract(coord.t * halfTexelSize.y) * 0.75)) * 2.0 - 1.0;\r\n\t\tnoise.y = ((fract(1.0 - coord.s * halfTexelSize.x) * 0.75) + (fract(coord.t * halfTexelSize.y) * 0.25)) * 2.0 - 1.0;\r\n\r\n\t#endif\r\n\r\n\treturn noise;\r\n\r\n}\r\n\r\nvec3 processTexel(vec2 coords, float blur) {\r\n\r\n\tvec3 c;\r\n\tc.r = texture2D(tDiffuse, coords + vec2(0.0, 1.0) * texelSize * fringe * blur).r;\r\n\tc.g = texture2D(tDiffuse, coords + vec2(-0.866, -0.5) * texelSize * fringe * blur).g;\r\n\tc.b = texture2D(tDiffuse, coords + vec2(0.866, -0.5) * texelSize * fringe * blur).b;\r\n\r\n\t// Calculate the luminance of the constructed colour.\r\n\tfloat luminance = linearToRelativeLuminance(c);\r\n\tfloat threshold = max((luminance - luminanceThreshold) * luminanceGain, 0.0);\r\n\r\n\treturn c + mix(vec3(0.0), c, threshold * blur);\r\n\r\n}\r\n\r\nfloat linearize(float depth) {\r\n\r\n\treturn -cameraFar * cameraNear / (depth * (cameraFar - cameraNear) - cameraFar);\r\n\r\n}\r\n\r\nfloat gather(float i, float j, float ringSamples, inout vec3 color, float w, float h, float blur) {\r\n\r\n\tconst float TWO_PI = 6.28318531;\r\n\r\n\tfloat step = TWO_PI / ringSamples;\r\n\tfloat pw = cos(j * step) * i;\r\n\tfloat ph = sin(j * step) * i;\r\n\r\n\t#ifdef PENTAGON\r\n\r\n\t\tfloat p = penta(vec2(pw, ph));\r\n\r\n\t#else\r\n\r\n\t\tfloat p = 1.0;\r\n\r\n\t#endif\r\n\r\n\tcolor += processTexel(vUv + vec2(pw * w, ph * h), blur) * mix(1.0, i / RINGS_FLOAT, bias) * p;\r\n\r\n\treturn mix(1.0, i / RINGS_FLOAT, bias) * p;\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\t#ifdef USE_LOGDEPTHBUF\r\n\r\n\t\tfloat depth = linearize(texture2D(tDepth, vUv).x);\r\n\r\n\t#else\r\n\r\n\t\tfloat depth = linearize(readDepth(tDepth, vUv));\r\n\r\n\t#endif\r\n\r\n\t#ifdef SHADER_FOCUS\r\n\r\n\t\t#ifdef USE_LOGDEPTHBUF\r\n\r\n\t\t\tfloat fDepth = linearize(texture2D(tDepth, focusCoords).x);\r\n\r\n\t\t#else\r\n\r\n\t\t\tfloat fDepth = linearize(readDepth(tDepth, focusCoords));\r\n\r\n\t\t#endif\r\n\r\n\t#else\r\n\r\n\t\tfloat fDepth = focalDepth;\r\n\r\n\t#endif\r\n\r\n\t#ifdef MANUAL_DOF\r\n\r\n\t\tconst float nDoFStart = 1.0; \r\n\t\tconst float nDoFDist = 2.0;\r\n\t\tconst float fDoFStart = 1.0;\r\n\t\tconst float fDoFDist = 3.0;\r\n\r\n\t\tfloat focalPlane = depth - fDepth;\r\n\t\tfloat farDoF = (focalPlane - fDoFStart) / fDoFDist;\r\n\t\tfloat nearDoF = (-focalPlane - nDoFStart) / nDoFDist;\r\n\r\n\t\tfloat blur = (focalPlane > 0.0) ? farDoF : nearDoF;\r\n\r\n\t#else\r\n\r\n\t\tconst float CIRCLE_OF_CONFUSION = 0.03; // 35mm film = 0.03mm CoC.\r\n\r\n\t\tfloat focalPlaneMM = fDepth * 1000.0;\r\n\t\tfloat depthMM = depth * 1000.0;\r\n\r\n\t\tfloat focalPlane = (depthMM * focalLength) / (depthMM - focalLength);\r\n\t\tfloat farDoF = (focalPlaneMM * focalLength) / (focalPlaneMM - focalLength);\r\n\t\tfloat nearDoF = (focalPlaneMM - focalLength) / (focalPlaneMM * focalStop * CIRCLE_OF_CONFUSION);\r\n\r\n\t\tfloat blur = abs(focalPlane - farDoF) * nearDoF;\r\n\r\n\t#endif\r\n\r\n\tblur = clamp(blur, 0.0, 1.0);\r\n\r\n\t// Dithering.\r\n\tvec2 noise = rand2(vUv) * ditherStrength * blur;\r\n\r\n\tfloat blurFactorX = texelSize.x * blur * maxBlur + noise.x;\r\n\tfloat blurFactorY = texelSize.y * blur * maxBlur + noise.y;\r\n\r\n\tconst int MAX_RING_SAMPLES = RINGS_INT * SAMPLES_INT;\r\n\r\n\t// Calculation of final color.\r\n\tvec4 color;\r\n\r\n\tif(blur < 0.05) {\r\n\r\n\t\tcolor = texture2D(tDiffuse, vUv);\r\n\r\n\t} else {\r\n\r\n\t\tcolor = texture2D(tDiffuse, vUv);\r\n\r\n\t\tfloat s = 1.0;\r\n\t\tint ringSamples;\r\n\r\n\t\tfor(int i = 1; i <= RINGS_INT; ++i) {\r\n\r\n\t\t\tringSamples = i * SAMPLES_INT;\r\n\r\n\t\t\t// Constant loop.\r\n\t\t\tfor(int j = 0; j < MAX_RING_SAMPLES; ++j) {\r\n\r\n\t\t\t\t// Break earlier.\r\n\t\t\t\tif(j >= ringSamples) { break; }\r\n\r\n\t\t\t\ts += gather(float(i), float(j), float(ringSamples), color.rgb, blurFactorX, blurFactorY, blur);\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tcolor.rgb /= s; // Divide by sample count.\r\n\r\n\t}\r\n\r\n\t#ifdef SHOW_FOCUS\r\n\r\n\t\tcolor.rgb = debugFocus(color.rgb, blur, depth);\r\n\r\n\t#endif\r\n\r\n\t#ifdef VIGNETTE\r\n\r\n\t\tcolor.rgb *= vignette();\r\n\r\n\t#endif\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n";var vertex$15="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * Depth of Field shader v2.4. * * Original shader code by Martins Upitis: * http://blenderartists.org/forum/showthread.php?237488-GLSL-depth-of-field-with-bokeh-v2-4-(update) */var RealisticBokehMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new bokeh2 material. * * @param {PerspectiveCamera} [camera] - The main camera. * @param {Object} [options] - Additional options. * @param {Vector2} [options.texelSize] - The absolute screen texel size. * @param {Boolean} [options.rings=3] - The number of blurring iterations. * @param {Boolean} [options.samples=2] - The amount of samples taken per ring. * @param {Boolean} [options.showFocus=false] - Whether the focus point should be highlighted. * @param {Boolean} [options.manualDoF=false] - Enables manual depth of field blur. * @param {Boolean} [options.vignette=false] - Enables a vignette effect. * @param {Boolean} [options.pentagon=false] - Enable to use a pentagonal shape to scale gathered texels. * @param {Boolean} [options.shaderFocus=true] - Disable if you compute your own focalDepth (in metres!). * @param {Boolean} [options.noise=true] - Disable if you don't want noise patterns for dithering. * @param {Number} [options.maxBlur=1.0] - The maximum blur strength. * @param {Number} [options.luminanceThreshold=0.5] - A luminance threshold. * @param {Number} [options.luminanceGain=2.0] - A luminance gain factor. * @param {Number} [options.bias=0.5] - A blur bias. * @param {Number} [options.fringe=0.7] - A blur offset. * @param {Number} [options.ditherStrength=0.0001] - The dither strength. */function RealisticBokehMaterial(){var _this;var camera=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};classCallCheck(this,RealisticBokehMaterial);var settings=Object.assign({texelSize:null,rings:3,samples:2,showFocus:false,manualDoF:false,vignette:false,pentagon:false,shaderFocus:true,noise:true,maxBlur:1.0,luminanceThreshold:0.5,luminanceGain:2.0,bias:0.5,fringe:0.7,ditherStrength:0.0001},options);_this=possibleConstructorReturn(this,getPrototypeOf$2(RealisticBokehMaterial).call(this,{type:"RealisticBokehMaterial",defines:{RINGS_INT:settings.rings.toFixed(0),RINGS_FLOAT:settings.rings.toFixed(1),SAMPLES_INT:settings.samples.toFixed(0),SAMPLES_FLOAT:settings.samples.toFixed(1)},uniforms:{tDiffuse:new Uniform(null),tDepth:new Uniform(null),texelSize:new Uniform(new Vector2()),halfTexelSize:new Uniform(new Vector2()),cameraNear:new Uniform(0.1),cameraFar:new Uniform(2000),focalLength:new Uniform(24.0),focalStop:new Uniform(0.9),maxBlur:new Uniform(settings.maxBlur),luminanceThreshold:new Uniform(settings.luminanceThreshold),luminanceGain:new Uniform(settings.luminanceGain),bias:new Uniform(settings.bias),fringe:new Uniform(settings.fringe),ditherStrength:new Uniform(settings.ditherStrength),focusCoords:new Uniform(new Vector2(0.5,0.5)),focalDepth:new Uniform(1.0)},fragmentShader:fragment$15,vertexShader:vertex$15,depthWrite:false,depthTest:false}));_this.setShowFocusEnabled(settings.showFocus);_this.setManualDepthOfFieldEnabled(settings.manualDoF);_this.setVignetteEnabled(settings.vignette);_this.setPentagonEnabled(settings.pentagon);_this.setShaderFocusEnabled(settings.shaderFocus);_this.setNoiseEnabled(settings.noise);if(settings.texelSize!==null){_this.setTexelSize(settings.texelSize.x,settings.texelSize.y);}_this.adoptCameraSettings(camera);return _this;}/** * Defines whether the focus should be shown. * * @param {Boolean} enabled - True if the focus should be shown, false otherwise. */createClass(RealisticBokehMaterial,[{key:"setShowFocusEnabled",value:function setShowFocusEnabled(enabled){if(enabled){this.defines.SHOW_FOCUS="1";}else{delete this.defines.SHOW_FOCUS;}this.needsUpdate=true;}/** * Defines whether manual Depth of Field should be enabled. * * @param {Boolean} enabled - Whether manual DoF should be enabled. */},{key:"setManualDepthOfFieldEnabled",value:function setManualDepthOfFieldEnabled(enabled){if(enabled){this.defines.MANUAL_DOF="1";}else{delete this.defines.MANUAL_DOF;}this.needsUpdate=true;}/** * Defines whether the Vignette effect should be enabled. * * @param {Boolean} enabled - Whether the Vignette effect should be enabled. */},{key:"setVignetteEnabled",value:function setVignetteEnabled(enabled){if(enabled){this.defines.VIGNETTE="1";}else{delete this.defines.VIGNETTE;}this.needsUpdate=true;}/** * Defines whether the pentagonal blur effect should be enabled. * * @param {Boolean} enabled - Whether the pentagonal blur effect should be enabled. */},{key:"setPentagonEnabled",value:function setPentagonEnabled(enabled){if(enabled){this.defines.PENTAGON="1";}else{delete this.defines.PENTAGON;}this.needsUpdate=true;}/** * Enables or disables the automatic shader focus. * * @param {Boolean} enabled - Whether the shader focus should be enabled. */},{key:"setShaderFocusEnabled",value:function setShaderFocusEnabled(enabled){if(enabled){this.defines.SHADER_FOCUS="1";}else{delete this.defines.SHADER_FOCUS;}this.needsUpdate=true;}/** * Defines whether the dithering should compute noise. * * @param {Boolean} enabled - Whether noise-based dithering should be enabled. */},{key:"setNoiseEnabled",value:function setNoiseEnabled(enabled){if(enabled){this.defines.NOISE="1";}else{delete this.defines.NOISE;}this.needsUpdate=true;}/** * Sets the texel size. * * @param {Number} x - The texel width. * @param {Number} y - The texel height. */},{key:"setTexelSize",value:function setTexelSize(x,y){this.uniforms.texelSize.value.set(x,y);this.uniforms.halfTexelSize.value.set(x,y).multiplyScalar(0.5);}/** * Adopts the near and far plane and the focal length of the given camera. * * @param {PerspectiveCamera} camera - The main camera. */},{key:"adoptCameraSettings",value:function adoptCameraSettings(camera){if(camera!==null){this.uniforms.cameraNear.value=camera.near;this.uniforms.cameraFar.value=camera.far;this.uniforms.focalLength.value=camera.getFocalLength();// unit: mm. }}}]);inherits(RealisticBokehMaterial,_ShaderMaterial);return RealisticBokehMaterial;}(ShaderMaterial);var fragment$16="#include \r\n\r\nuniform sampler2D tDiffuse;\r\nuniform vec2 center;\r\nuniform float aspect;\r\nuniform float waveSize;\r\nuniform float radius;\r\nuniform float maxRadius;\r\nuniform float amplitude;\r\n\r\nvarying vec2 vUv;\r\nvarying float vSize;\r\n\r\nvoid main() {\r\n\r\n\tvec2 aspectCorrection = vec2(aspect, 1.0);\r\n\r\n\tvec2 difference = vUv * aspectCorrection - center * aspectCorrection;\r\n\tfloat distance = sqrt(dot(difference, difference)) * vSize;\r\n\r\n\tvec2 displacement = vec2(0.0);\r\n\r\n\tif(distance > radius) {\r\n\r\n\t\tif(distance < radius + waveSize) {\r\n\r\n\t\t\tfloat angle = (distance - radius) * PI2 / waveSize;\r\n\t\t\tfloat cosSin = (1.0 - cos(angle)) * 0.5;\r\n\r\n\t\t\tfloat extent = maxRadius + waveSize;\r\n\t\t\tfloat decay = max(extent - distance * distance, 0.0) / extent;\r\n\r\n\t\t\tdisplacement = ((cosSin * amplitude * difference) / distance) * decay;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tgl_FragColor = texture2D(tDiffuse, vUv - displacement);\r\n\r\n}\r\n";var vertex$16="uniform float size;\r\nuniform float scale;\r\nuniform float cameraDistance;\r\n\r\nvarying vec2 vUv;\r\nvarying float vSize;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tvSize = (0.1 * cameraDistance) / size;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * A shock wave shader material. * * Based on a Gist by Jean-Philippe Sarda: * https://gist.github.com/jpsarda/33cea67a9f2ecb0a0eda */var ShockWaveMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new shock wave material. * * @param {Object} [options] - The options. * @param {Number} [options.waveSize=0.2] - The wave size. * @param {Number} [options.amplitude=0.05] - The distortion amplitude. */function ShockWaveMaterial(){var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,ShockWaveMaterial);var settings=Object.assign({maxRadius:1.0,waveSize:0.2,amplitude:0.05},options);return possibleConstructorReturn(this,getPrototypeOf$2(ShockWaveMaterial).call(this,{type:"ShockWaveMaterial",uniforms:{tDiffuse:new Uniform(null),center:new Uniform(new Vector2(0.5,0.5)),aspect:new Uniform(1.0),cameraDistance:new Uniform(1.0),size:new Uniform(1.0),radius:new Uniform(-settings.waveSize),maxRadius:new Uniform(settings.maxRadius),waveSize:new Uniform(settings.waveSize),amplitude:new Uniform(settings.amplitude)},fragmentShader:fragment$16,vertexShader:vertex$16,depthWrite:false,depthTest:false}));}inherits(ShockWaveMaterial,_ShaderMaterial);return ShockWaveMaterial;}(ShaderMaterial);var fragment$17="uniform sampler2D tDiffuse;\r\nuniform sampler2D tWeights;\r\n\r\nuniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset;\r\n\r\nvoid main() {\r\n\r\n\t// Fetch the blending weights for current pixel.\r\n\tvec4 a;\r\n\ta.xz = texture2D(tWeights, vUv).xz;\r\n\ta.y = texture2D(tWeights, vOffset.zw).g;\r\n\ta.w = texture2D(tWeights, vOffset.xy).a;\r\n\r\n\tvec4 color;\r\n\r\n\t// Check if there is any blending weight with a value greater than 0.0.\r\n\tif(dot(a, vec4(1.0)) < 1e-5) {\r\n\r\n\t\tcolor = texture2D(tDiffuse, vUv, 0.0);\r\n\r\n\t} else {\r\n\r\n\t\t/* Up to four lines can be crossing a pixel (one through each edge).\r\n\t\t * The line with the maximum weight for each direction is favoured.\r\n\t\t */\r\n\r\n\t\tvec2 offset;\r\n\t\toffset.x = a.a > a.b ? a.a : -a.b; // Left vs. right.\r\n\t\toffset.y = a.g > a.r ? -a.g : a.r; // Top vs. bottom (changed signs).\r\n\r\n\t\t// Go in the direction with the maximum weight (horizontal vs. vertical).\r\n\t\tif(abs(offset.x) > abs(offset.y)) {\r\n\r\n\t\t\toffset.y = 0.0;\r\n\r\n\t\t} else {\r\n\r\n\t\t\toffset.x = 0.0;\r\n\r\n\t\t}\r\n\r\n\t\t// Fetch the opposite color and lerp by hand.\r\n\t\tcolor = texture2D(tDiffuse, vUv, 0.0);\r\n\t\tvec2 coord = vUv + sign(offset) * texelSize;\r\n\t\tvec4 oppositeColor = texture2D(tDiffuse, coord, 0.0);\r\n\t\tfloat s = abs(offset.x) > abs(offset.y) ? abs(offset.x) : abs(offset.y);\r\n\r\n\t\t// Gamma correction.\r\n\t\tcolor.rgb = pow(abs(color.rgb), vec3(2.2));\r\n\t\toppositeColor.rgb = pow(abs(oppositeColor.rgb), vec3(2.2));\r\n\t\tcolor = mix(color, oppositeColor, s);\r\n\t\tcolor.rgb = pow(abs(color.rgb), vec3(1.0 / 2.2));\r\n\r\n\t}\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n";var vertex$17="uniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\r\n\tvOffset = uv.xyxy + texelSize.xyxy * vec4(1.0, 0.0, 0.0, -1.0); // Changed sign in W component.\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * Subpixel Morphological Antialiasing. * * This material is used to render the final antialiasing. */var SMAABlendMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new SMAA blend material. * * @param {Vector2} [texelSize] - The absolute screen texel size. */function SMAABlendMaterial(){var texelSize=arguments.length>0&&arguments[0]!==undefined?arguments[0]:new Vector2();classCallCheck(this,SMAABlendMaterial);return possibleConstructorReturn(this,getPrototypeOf$2(SMAABlendMaterial).call(this,{type:"SMAABlendMaterial",uniforms:{tDiffuse:new Uniform(null),tWeights:new Uniform(null),texelSize:new Uniform(texelSize)},fragmentShader:fragment$17,vertexShader:vertex$17,depthWrite:false,depthTest:false}));}inherits(SMAABlendMaterial,_ShaderMaterial);return SMAABlendMaterial;}(ShaderMaterial);var fragment$18="#define sampleLevelZeroOffset(t, coord, offset) texture2D(t, coord + float(offset) * texelSize, 0.0)\r\n\r\nuniform sampler2D tDiffuse;\r\nuniform sampler2D tArea;\r\nuniform sampler2D tSearch;\r\n\r\nuniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset[3];\r\nvarying vec2 vPixCoord;\r\n\r\nvec2 round(vec2 x) {\r\n\r\n\treturn sign(x) * floor(abs(x) + 0.5);\r\n\r\n}\r\n\r\nfloat searchLength(vec2 e, float bias, float scale) {\r\n\r\n\t// Not required if tSearch accesses are set to point.\r\n\t// const vec2 SEARCH_TEX_PIXEL_SIZE = 1.0 / vec2(66.0, 33.0);\r\n\t// e = vec2(bias, 0.0) + 0.5 * SEARCH_TEX_PIXEL_SIZE + e * vec2(scale, 1.0) * vec2(64.0, 32.0) * SEARCH_TEX_PIXEL_SIZE;\r\n\r\n\te.r = bias + e.r * scale;\r\n\r\n\treturn 255.0 * texture2D(tSearch, e, 0.0).r;\r\n\r\n}\r\n\r\nfloat searchXLeft(vec2 texCoord, float end) {\r\n\r\n\t/* @PSEUDO_GATHER4\r\n\t * This texCoord has been offset by (-0.25, -0.125) in the vertex shader to\r\n\t * sample between edge, thus fetching four edges in a row.\r\n\t * Sampling with different offsets in each direction allows to disambiguate\r\n\t * which edges are active from the four fetched ones.\r\n\t */\r\n\r\n\tvec2 e = vec2(0.0, 1.0);\r\n\r\n\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i) {\r\n\r\n\t\te = texture2D(tDiffuse, texCoord, 0.0).rg;\r\n\t\ttexCoord -= vec2(2.0, 0.0) * texelSize;\r\n\r\n\t\tif(!(texCoord.x > end && e.g > 0.8281 && e.r == 0.0)) { break; }\r\n\r\n\t}\r\n\r\n\t// Correct the previously applied offset (-0.25, -0.125).\r\n\ttexCoord.x += 0.25 * texelSize.x;\r\n\r\n\t// The searches are biased by 1, so adjust the coords accordingly.\r\n\ttexCoord.x += texelSize.x;\r\n\r\n\t// Disambiguate the length added by the last step.\r\n\ttexCoord.x += 2.0 * texelSize.x; // Undo last step.\r\n\ttexCoord.x -= texelSize.x * searchLength(e, 0.0, 0.5);\r\n\r\n\treturn texCoord.x;\r\n\r\n}\r\n\r\nfloat searchXRight(vec2 texCoord, float end) {\r\n\r\n\tvec2 e = vec2(0.0, 1.0);\r\n\r\n\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i) {\r\n\r\n\t\te = texture2D(tDiffuse, texCoord, 0.0).rg;\r\n\t\ttexCoord += vec2(2.0, 0.0) * texelSize;\r\n\r\n\t\tif(!(texCoord.x < end && e.g > 0.8281 && e.r == 0.0)) { break; }\r\n\r\n\t}\r\n\r\n\ttexCoord.x -= 0.25 * texelSize.x;\r\n\ttexCoord.x -= texelSize.x;\r\n\ttexCoord.x -= 2.0 * texelSize.x;\r\n\ttexCoord.x += texelSize.x * searchLength(e, 0.5, 0.5);\r\n\r\n\treturn texCoord.x;\r\n\r\n}\r\n\r\nfloat searchYUp(vec2 texCoord, float end) {\r\n\r\n\tvec2 e = vec2(1.0, 0.0);\r\n\r\n\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i) {\r\n\r\n\t\te = texture2D(tDiffuse, texCoord, 0.0).rg;\r\n\t\ttexCoord += vec2(0.0, 2.0) * texelSize; // Changed sign.\r\n\r\n\t\tif(!(texCoord.y > end && e.r > 0.8281 && e.g == 0.0)) { break; }\r\n\r\n\t}\r\n\r\n\ttexCoord.y -= 0.25 * texelSize.y; // Changed sign.\r\n\ttexCoord.y -= texelSize.y; // Changed sign.\r\n\ttexCoord.y -= 2.0 * texelSize.y; // Changed sign.\r\n\ttexCoord.y += texelSize.y * searchLength(e.gr, 0.0, 0.5); // Changed sign.\r\n\r\n\treturn texCoord.y;\r\n\r\n}\r\n\r\nfloat searchYDown(vec2 texCoord, float end) {\r\n\r\n\tvec2 e = vec2(1.0, 0.0);\r\n\r\n\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i ) {\r\n\r\n\t\te = texture2D(tDiffuse, texCoord, 0.0).rg;\r\n\t\ttexCoord -= vec2(0.0, 2.0) * texelSize; // Changed sign.\r\n\r\n\t\tif(!(texCoord.y < end && e.r > 0.8281 && e.g == 0.0)) { break; }\r\n\r\n\t}\r\n\r\n\ttexCoord.y += 0.25 * texelSize.y; // Changed sign.\r\n\ttexCoord.y += texelSize.y; // Changed sign.\r\n\ttexCoord.y += 2.0 * texelSize.y; // Changed sign.\r\n\ttexCoord.y -= texelSize.y * searchLength(e.gr, 0.5, 0.5); // Changed sign.\r\n\r\n\treturn texCoord.y;\r\n\r\n}\r\n\r\nvec2 area(vec2 dist, float e1, float e2, float offset) {\r\n\r\n\t// Rounding prevents precision errors of bilinear filtering.\r\n\tvec2 texCoord = AREATEX_MAX_DISTANCE * round(4.0 * vec2(e1, e2)) + dist;\r\n\r\n\t// Scale and bias for texel space translation.\r\n\ttexCoord = AREATEX_PIXEL_SIZE * texCoord + (0.5 * AREATEX_PIXEL_SIZE);\r\n\r\n\t// Move to proper place, according to the subpixel offset.\r\n\ttexCoord.y += AREATEX_SUBTEX_SIZE * offset;\r\n\r\n\treturn texture2D(tArea, texCoord, 0.0).rg;\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\tvec4 weights = vec4(0.0);\r\n\tvec4 subsampleIndices = vec4(0.0);\r\n\tvec2 e = texture2D(tDiffuse, vUv).rg;\r\n\r\n\tif(e.g > 0.0) {\r\n\r\n\t\t// Edge at north.\r\n\t\tvec2 d;\r\n\r\n\t\t// Find the distance to the left.\r\n\t\tvec2 coords;\r\n\t\tcoords.x = searchXLeft(vOffset[0].xy, vOffset[2].x);\r\n\t\tcoords.y = vOffset[1].y; // vOffset[1].y = vUv.y - 0.25 * texelSize.y (@CROSSING_OFFSET)\r\n\t\td.x = coords.x;\r\n\r\n\t\t/* Now fetch the left crossing edges, two at a time using bilinear\r\n\t\tfiltering. Sampling at -0.25 (see @CROSSING_OFFSET) enables to discern what\r\n\t\tvalue each edge has. */\r\n\t\tfloat e1 = texture2D(tDiffuse, coords, 0.0).r;\r\n\r\n\t\t// Find the distance to the right.\r\n\t\tcoords.x = searchXRight(vOffset[0].zw, vOffset[2].y);\r\n\t\td.y = coords.x;\r\n\r\n\t\t/* Translate distances to pixel units for better interleave arithmetic and\r\n\t\tmemory accesses. */\r\n\t\td = d / texelSize.x - vPixCoord.x;\r\n\r\n\t\t// The area texture is compressed quadratically.\r\n\t\tvec2 sqrtD = sqrt(abs(d));\r\n\r\n\t\t// Fetch the right crossing edges.\r\n\t\tcoords.y -= texelSize.y; // WebGL port note: Added.\r\n\t\tfloat e2 = sampleLevelZeroOffset(tDiffuse, coords, ivec2(1, 0)).r;\r\n\r\n\t\t// Pattern recognised, now get the actual area.\r\n\t\tweights.rg = area(sqrtD, e1, e2, subsampleIndices.y);\r\n\r\n\t}\r\n\r\n\tif(e.r > 0.0) {\r\n\r\n\t\t// Edge at west.\r\n\t\tvec2 d;\r\n\r\n\t\t// Find the distance to the top.\r\n\t\tvec2 coords;\r\n\t\tcoords.y = searchYUp(vOffset[1].xy, vOffset[2].z);\r\n\t\tcoords.x = vOffset[0].x; // vOffset[1].x = vUv.x - 0.25 * texelSize.x;\r\n\t\td.x = coords.y;\r\n\r\n\t\t// Fetch the top crossing edges.\r\n\t\tfloat e1 = texture2D(tDiffuse, coords, 0.0).g;\r\n\r\n\t\t// Find the distance to the bottom.\r\n\t\tcoords.y = searchYDown(vOffset[1].zw, vOffset[2].w);\r\n\t\td.y = coords.y;\r\n\r\n\t\t// Distances in pixel units.\r\n\t\td = d / texelSize.y - vPixCoord.y;\r\n\r\n\t\t// The area texture is compressed quadratically.\r\n\t\tvec2 sqrtD = sqrt(abs(d));\r\n\r\n\t\t// Fetch the bottom crossing edges.\r\n\t\tcoords.y -= texelSize.y; // WebGL port note: Added.\r\n\t\tfloat e2 = sampleLevelZeroOffset(tDiffuse, coords, ivec2(0, 1)).g;\r\n\r\n\t\t// Get the area for this direction.\r\n\t\tweights.ba = area(sqrtD, e1, e2, subsampleIndices.x);\r\n\r\n\t}\r\n\r\n\tgl_FragColor = weights;\r\n\r\n}\r\n";var vertex$18="uniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset[3];\r\nvarying vec2 vPixCoord;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\r\n\tvPixCoord = uv / texelSize;\r\n\r\n\t// Offsets for the searches (see @PSEUDO_GATHER4).\r\n\tvOffset[0] = uv.xyxy + texelSize.xyxy * vec4(-0.25, 0.125, 1.25, 0.125); // Changed sign in Y and W components.\r\n\tvOffset[1] = uv.xyxy + texelSize.xyxy * vec4(-0.125, 0.25, -0.125, -1.25); //Changed sign in Y and W components.\r\n\r\n\t// This indicates the ends of the loops.\r\n\tvOffset[2] = vec4(vOffset[0].xz, vOffset[1].yw) + vec4(-2.0, 2.0, -2.0, 2.0) * texelSize.xxyy * MAX_SEARCH_STEPS_FLOAT;\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * Subpixel Morphological Antialiasing. * * This material computes weights for detected edges. */var SMAAWeightsMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new SMAA weights material. * * @param {Vector2} [texelSize] - The absolute screen texel size. */function SMAAWeightsMaterial(){var texelSize=arguments.length>0&&arguments[0]!==undefined?arguments[0]:new Vector2();classCallCheck(this,SMAAWeightsMaterial);return possibleConstructorReturn(this,getPrototypeOf$2(SMAAWeightsMaterial).call(this,{type:"SMAAWeightsMaterial",defines:{// Configurable settings: MAX_SEARCH_STEPS_INT:"8",MAX_SEARCH_STEPS_FLOAT:"8.0",// Non-configurable settings: AREATEX_MAX_DISTANCE:"16.0",AREATEX_PIXEL_SIZE:"(1.0 / vec2(160.0, 560.0))",AREATEX_SUBTEX_SIZE:"(1.0 / 7.0)",SEARCHTEX_SIZE:"vec2(66.0, 33.0)",SEARCHTEX_PACKED_SIZE:"vec2(64.0, 16.0)"},uniforms:{tDiffuse:new Uniform(null),tArea:new Uniform(null),tSearch:new Uniform(null),texelSize:new Uniform(texelSize)},fragmentShader:fragment$18,vertexShader:vertex$18,depthWrite:false,depthTest:false}));}/** * Sets the maximum amount of steps performed in the horizontal/vertical * pattern searches, at each side of the pixel. * * In number of pixels, it's actually the double. So the maximum line length * perfectly handled by, for example 16, is 64 (perfectly means that longer * lines won't look as good, but are still antialiased). * * @param {Number} steps - The search steps. Range: [0, 112]. */createClass(SMAAWeightsMaterial,[{key:"setOrthogonalSearchSteps",value:function setOrthogonalSearchSteps(steps){this.defines.MAX_SEARCH_STEPS_INT=steps.toFixed("0");this.defines.MAX_SEARCH_STEPS_FLOAT=steps.toFixed("1");this.needsUpdate=true;}}]);inherits(SMAAWeightsMaterial,_ShaderMaterial);return SMAAWeightsMaterial;}(ShaderMaterial);var fragment$19="#include \r\n#include \r\n\r\nuniform sampler2D tDiffuse;\r\nuniform float middleGrey;\r\nuniform float maxLuminance;\r\n\r\n#ifdef ADAPTED_LUMINANCE\r\n\r\n\tuniform sampler2D luminanceMap;\r\n\r\n#else\r\n\r\n\tuniform float averageLuminance;\r\n\r\n#endif\r\n\r\nvarying vec2 vUv;\r\n\r\nvec3 toneMap(vec3 c) {\r\n\r\n\t#ifdef ADAPTED_LUMINANCE\r\n\r\n\t\t// Get the calculated average luminance by sampling the center.\r\n\t\tfloat lumAvg = texture2D(luminanceMap, vec2(0.5)).r;\r\n\r\n\t#else\r\n\r\n\t\tfloat lumAvg = averageLuminance;\r\n\r\n\t#endif\r\n\r\n\t// Calculate the luminance of the current pixel.\r\n\tfloat lumPixel = linearToRelativeLuminance(c);\r\n\r\n\t// Apply the modified operator (Reinhard Eq. 4).\r\n\tfloat lumScaled = (lumPixel * middleGrey) / lumAvg;\r\n\r\n\tfloat lumCompressed = (lumScaled * (1.0 + (lumScaled / (maxLuminance * maxLuminance)))) / (1.0 + lumScaled);\r\n\r\n\treturn lumCompressed * c;\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tgl_FragColor = vec4(toneMap(texel.rgb), texel.a);\r\n\r\n\t#include \r\n\r\n}\r\n";var vertex$19="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * Full-screen tone-mapping shader material. * * This material supports dithering. * * Reference: * http://www.cis.rit.edu/people/faculty/ferwerda/publications/sig02_paper.pdf */var ToneMappingMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new tone mapping material. */function ToneMappingMaterial(){classCallCheck(this,ToneMappingMaterial);return possibleConstructorReturn(this,getPrototypeOf$2(ToneMappingMaterial).call(this,{type:"ToneMappingMaterial",uniforms:{tDiffuse:new Uniform(null),luminanceMap:new Uniform(null),averageLuminance:new Uniform(1.0),maxLuminance:new Uniform(16.0),middleGrey:new Uniform(0.6)},fragmentShader:fragment$19,vertexShader:vertex$19,depthWrite:false,depthTest:false}));}inherits(ToneMappingMaterial,_ShaderMaterial);return ToneMappingMaterial;}(ShaderMaterial);/** * A collection of shader materials that are used in the post processing passes. * * @module postprocessing/materials */ /** * An abstract pass. * * Passes that do not rely on the depth buffer should explicitly disable the * depth test and depth write in their respective shader materials. * * @implements {Resizable} * @implements {Disposable} */var Pass=/*#__PURE__*/function(){/** * Constructs a new pass. * * @param {String} [name] - The name of this pass. * @param {Scene} [scene] - The scene to render. * @param {Camera} [camera] - The camera. * @param {Mesh} [quad] - A quad that fills the screen to render 2D filter effects. Set this to null, if you don't need it (see {@link RenderPass}). */function Pass(){var name=arguments.length>0&&arguments[0]!==undefined?arguments[0]:"Pass";var scene=arguments.length>1&&arguments[1]!==undefined?arguments[1]:new Scene();var camera=arguments.length>2&&arguments[2]!==undefined?arguments[2]:new OrthographicCamera(-1,1,1,-1,0,1);var quad=arguments.length>3&&arguments[3]!==undefined?arguments[3]:new Mesh(new PlaneBufferGeometry(2,2),null);classCallCheck(this,Pass);/** * The name of this pass. * * @type {String} */this.name=name;/** * The scene to render. * * @type {Scene} * @protected */this.scene=scene;/** * The camera. * * @type {Camera} * @protected */this.camera=camera;/** * A quad mesh that fills the screen. * * @type {Mesh} * @private */this.quad=quad;if(this.quad!==null){this.quad.frustumCulled=false;if(this.scene!==null){this.scene.add(this.quad);}}/** * Indicates whether this pass should render to screen. * * @type {Boolean} */this.renderToScreen=false;/** * Indicates whether this pass should be executed. * * @type {Boolean} */this.enabled=true;/** * Indicates whether the {@link EffectComposer} should swap the frame * buffers after this pass has finished rendering. * * Set this to `false` if this pass doesn't render to the output buffer or * the screen. Otherwise, the contents of the input buffer will be lost. * * @type {Boolean} */this.needsSwap=true;}/** * The fullscreen material. * * @type {Material} */createClass(Pass,[{key:"render",/** * Renders the effect. * * This is an abstract method that must be overridden. * * @abstract * @throws {Error} An error is thrown if the method is not overridden. * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){throw new Error("Render method not implemented!");}/** * Updates this pass with the renderer's size. * * You may override this method in case you want to be informed about the main * render size. * * The {@link EffectComposer} calls this method before this pass is * initialized and every time its own size is updated. * * @param {Number} width - The renderer's width. * @param {Number} height - The renderer's height. * @example this.myRenderTarget.setSize(width, height); */},{key:"setSize",value:function setSize(width,height){}/** * Performs initialization tasks. * * By overriding this method you gain access to the renderer. You'll also be * able to configure your custom render targets to use the appropriate format * (RGB or RGBA). * * The provided renderer can be used to warm up special off-screen render * targets by performing a preliminary render operation. * * The {@link EffectComposer} calls this method when this pass is added to its * queue, but not before its size has been set. * * @param {WebGLRenderer} renderer - The renderer. * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not. * @example if(!alpha) { this.myRenderTarget.texture.format = RGBFormat; } */},{key:"initialize",value:function initialize(renderer,alpha){}/** * Performs a shallow search for properties that define a dispose method and * deletes them. The pass will be inoperative after this method was called! * * Disposable objects: * - render targets * - materials * - textures * * The {@link EffectComposer} calls this method when it is being destroyed. * You may, however, use it independently to free memory when you are certain * that you don't need this pass anymore. */},{key:"dispose",value:function dispose(){var key;var _arr=Object.keys(this);for(var _i=0;_i<_arr.length;_i++){key=_arr[_i];if(this[key]!==null&&typeof this[key].dispose==="function"){this[key].dispose();this[key]=null;}}if(this.material!==null){this.material.dispose();}}},{key:"material",get:function get(){return this.quad!==null?this.quad.material:null;}/** * Sets the fullscreen material. * * The material will be assigned to the quad mesh that fills the screen. * * @type {Material} */,set:function set(value){if(this.quad!==null){this.quad.material=value;}}}]);return Pass;}();/** * An efficient, incremental blur pass. * * Note: This pass allows the input and output buffer to be the same. */var BlurPass=/*#__PURE__*/function(_Pass){/** * Constructs a new blur pass. * * @param {Object} [options] - The options. * @param {Number} [options.resolutionScale=0.5] - The render texture resolution scale, relative to the screen render size. * @param {Number} [options.kernelSize=KernelSize.LARGE] - The blur kernel size. */function BlurPass(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,BlurPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(BlurPass).call(this,"BlurPass"));/** * A render target. * * @type {WebGLRenderTarget} * @private */_this.renderTargetX=new WebGLRenderTarget(1,1,{minFilter:LinearFilter,magFilter:LinearFilter,stencilBuffer:false,depthBuffer:false});_this.renderTargetX.texture.name="Blur.TargetX";_this.renderTargetX.texture.generateMipmaps=false;/** * A second render target. * * @type {WebGLRenderTarget} * @private */_this.renderTargetY=_this.renderTargetX.clone();_this.renderTargetY.texture.name="Blur.TargetY";/** * The resolution scale. * * You need to call {@link EffectComposer#setSize} after changing this * value. * * @type {Number} */_this.resolutionScale=options.resolutionScale!==undefined?options.resolutionScale:0.5;/** * A convolution shader material. * * @type {ConvolutionMaterial} * @private */_this.convolutionMaterial=new ConvolutionMaterial();/** * A convolution shader material that uses dithering. * * @type {ConvolutionMaterial} * @private */_this.ditheredConvolutionMaterial=new ConvolutionMaterial();_this.ditheredConvolutionMaterial.dithering=true;/** * Whether the blurred result should also be dithered using noise. * * @type {Boolean} */_this.dithering=false;_this.kernelSize=options.kernelSize;return _this;}/** * The absolute width of the internal render targets. * * @type {Number} */createClass(BlurPass,[{key:"render",/** * Blurs the input buffer and writes the result to the output buffer. The * input buffer remains intact, unless its also the output buffer. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var scene=this.scene;var camera=this.camera;var renderTargetX=this.renderTargetX;var renderTargetY=this.renderTargetY;var material=this.convolutionMaterial;var uniforms=material.uniforms;var kernel=material.getKernel();var lastRT=inputBuffer;var destRT;var i,l;this.material=material;// Apply the multi-pass blur. for(i=0,l=kernel.length-1;i0&&arguments[0]!==undefined?arguments[0]:KernelSize.LARGE;this.convolutionMaterial.kernelSize=value;this.ditheredConvolutionMaterial.kernelSize=value;}}]);inherits(BlurPass,_Pass);return BlurPass;}(Pass);/** * A bloom pass. * * This pass renders a scene with superimposed blur by utilizing the fast Kawase * convolution approach. */var BloomPass=/*#__PURE__*/function(_Pass){/** * Constructs a new bloom pass. * * @param {Object} [options] - The options. * @param {Number} [options.resolutionScale=0.5] - The render texture resolution scale, relative to the screen render size. * @param {Number} [options.kernelSize=KernelSize.LARGE] - The blur kernel size. * @param {Number} [options.intensity=1.0] - The strength of the bloom effect. * @param {Number} [options.distinction=1.0] - The luminance distinction factor. Raise this value to bring out the brighter elements in the scene. * @param {Number} [options.screenMode=true] - Whether the screen blend mode should be used for combining the bloom texture with the scene colors. */function BloomPass(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,BloomPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(BloomPass).call(this,"BloomPass"));/** * A render target. * * @type {WebGLRenderTarget} * @private */_this.renderTarget=new WebGLRenderTarget(1,1,{minFilter:LinearFilter,magFilter:LinearFilter,stencilBuffer:false,depthBuffer:false});_this.renderTarget.texture.name="Bloom.Target";_this.renderTarget.texture.generateMipmaps=false;/** * A blur pass. * * @type {BlurPass} * @private */_this.blurPass=new BlurPass(options);/** * A combine shader material. * * @type {CombineMaterial} * @private */_this.combineMaterial=new CombineMaterial(options.screenMode!==undefined?options.screenMode:true);_this.intensity=options.intensity;/** * A luminosity shader material. * * @type {LuminosityMaterial} * @private */_this.luminosityMaterial=new LuminosityMaterial(true);_this.distinction=options.distinction;return _this;}/** * The resolution scale. * * @type {Number} */createClass(BloomPass,[{key:"render",/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var scene=this.scene;var camera=this.camera;var blurPass=this.blurPass;var luminosityMaterial=this.luminosityMaterial;var combineMaterial=this.combineMaterial;var renderTarget=this.renderTarget;// Luminance filter. this.material=luminosityMaterial;luminosityMaterial.uniforms.tDiffuse.value=inputBuffer.texture;renderer.render(scene,camera,renderTarget);// Convolution phase. blurPass.render(renderer,renderTarget,renderTarget);if(this.blend){// Render the original scene with superimposed blur. this.material=combineMaterial;combineMaterial.uniforms.texture1.value=inputBuffer.texture;combineMaterial.uniforms.texture2.value=renderTarget.texture;renderer.render(scene,camera,this.renderToScreen?null:outputBuffer);}}/** * Updates the size of this pass. * * @param {Number} width - The width. * @param {Number} height - The height. */},{key:"setSize",value:function setSize(width,height){this.blurPass.setSize(width,height);width=this.blurPass.width;height=this.blurPass.height;this.renderTarget.setSize(width,height);}/** * Performs initialization tasks. * * @param {WebGLRenderer} renderer - The renderer. * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not. */},{key:"initialize",value:function initialize(renderer,alpha){this.blurPass.initialize(renderer,alpha);if(!alpha){this.renderTarget.texture.format=RGBFormat;}}},{key:"resolutionScale",get:function get(){return this.blurPass.resolutionScale;}/** * You need to call {@link EffectComposer#setSize} after changing this value. * * @type {Number} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:0.5;this.blurPass.resolutionScale=value;}/** * The blur kernel size. * * @type {KernelSize} */},{key:"kernelSize",get:function get(){return this.blurPass.kernelSize;}/** * @type {KernelSize} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:KernelSize.LARGE;this.blurPass.kernelSize=value;}/** * The overall intensity of the effect. * * @type {Number} */},{key:"intensity",get:function get(){return this.combineMaterial.uniforms.opacity2.value;}/** * @type {Number} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:1.0;this.combineMaterial.uniforms.opacity2.value=value;}/** * The luminance distinction factor. * * @type {Number} */},{key:"distinction",get:function get(){return this.luminosityMaterial.uniforms.distinction.value;}/** * @type {Number} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:1.0;this.luminosityMaterial.uniforms.distinction.value=value;}/** * Indicates whether dithering is enabled. * * @type {Boolean} */},{key:"dithering",get:function get(){return this.blurPass.dithering;}/** * If enabled, the result will be dithered to remove banding artifacts. * * @type {Boolean} */,set:function set(value){this.blurPass.dithering=value;}/** * Indicates whether the effect should be applied to the input buffer. * * @type {Boolean} */},{key:"blend",get:function get(){return this.needsSwap;}/** * If disabled, the input buffer will remain unaffected. * * You may use the {@link BloomPass#overlay} texture to apply the effect to * your scene. * * @type {Boolean} */,set:function set(value){this.needsSwap=value;}/** * The effect overlay texture. * * @type {Texture} */},{key:"overlay",get:function get(){return this.renderTarget.texture;}}]);inherits(BloomPass,_Pass);return BloomPass;}(Pass);/** * A Depth of Field (DoF) pass using a bokeh shader. * * This pass requires a {@link EffectComposer#depthTexture}. */var BokehPass=/*#__PURE__*/function(_Pass){/** * Constructs a new bokeh pass. * * @param {PerspectiveCamera} camera - The main camera. Used to obtain the aspect ratio and the near and far plane settings. * @param {Object} [options] - Additional parameters. See {@link BokehMaterial} for details. */function BokehPass(camera){var _this;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};classCallCheck(this,BokehPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(BokehPass).call(this,"BokehPass"));_this.material=new BokehMaterial(camera,options);return _this;}/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */createClass(BokehPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){this.material.uniforms.tDiffuse.value=inputBuffer.texture;this.material.uniforms.tDepth.value=inputBuffer.depthTexture;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}/** * Updates the size of this pass. * * @param {Number} width - The width. * @param {Number} height - The height. */},{key:"setSize",value:function setSize(width,height){this.material.uniforms.aspect.value=width/height;}}]);inherits(BokehPass,_Pass);return BokehPass;}(Pass);/** * A pass that disables the stencil test. */var ClearMaskPass=/*#__PURE__*/function(_Pass){/** * Constructs a new clear mask pass. */function ClearMaskPass(){var _this;classCallCheck(this,ClearMaskPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(ClearMaskPass).call(this,"ClearMaskPass",null,null,null));_this.needsSwap=false;return _this;}/** * Disables the global stencil test. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */createClass(ClearMaskPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){renderer.state.buffers.stencil.setTest(false);}}]);inherits(ClearMaskPass,_Pass);return ClearMaskPass;}(Pass);/** * Used for saving the original clear color of the renderer. * * @type {Color} * @private */var color=new Color();/** * A pass that clears the input buffer or the screen. * * You can prevent specific bits from being cleared by setting either the * autoClearColor, autoClearStencil or autoClearDepth properties of the renderer * to false. */var ClearPass=/*#__PURE__*/function(_Pass){/** * Constructs a new clear pass. * * @param {Object} [options] - Additional options. * @param {Color} [options.clearColor=null] - An override clear color. * @param {Number} [options.clearAlpha=0.0] - An override clear alpha. */function ClearPass(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,ClearPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(ClearPass).call(this,"ClearPass",null,null,null));_this.needsSwap=false;/** * The clear color. * * @type {Color} */_this.clearColor=options.clearColor!==undefined?options.clearColor:null;/** * The clear alpha. * * @type {Number} */_this.clearAlpha=options.clearAlpha!==undefined?options.clearAlpha:0.0;return _this;}/** * Clears the input buffer or the screen. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */createClass(ClearPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var clearColor=this.clearColor;var clearAlpha;if(clearColor!==null){color.copy(renderer.getClearColor());clearAlpha=renderer.getClearAlpha();renderer.setClearColor(clearColor,this.clearAlpha);}renderer.setRenderTarget(this.renderToScreen?null:inputBuffer);renderer.clear();if(clearColor!==null){renderer.setClearColor(color,clearAlpha);}}}]);inherits(ClearPass,_Pass);return ClearPass;}(Pass);/** * A dot screen pass. */var DotScreenPass=/*#__PURE__*/function(_Pass){/** * Constructs a new dot screen pass. * * @param {Object} [options] - The options. * @param {Boolean} [options.average=false] - Whether the shader should output a colour average (black and white). * @param {Number} [options.angle=1.57] - The angle of the pattern. * @param {Number} [options.scale=1.0] - The scale of the overall effect. * @param {Number} [options.intensity=1.0] - The intensity of the effect. */function DotScreenPass(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,DotScreenPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(DotScreenPass).call(this,"DotScreenPass"));_this.material=new DotScreenMaterial(options);return _this;}/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */createClass(DotScreenPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){this.material.uniforms.tDiffuse.value=inputBuffer.texture;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}/** * Updates the size of this pass. * * @param {Number} width - The width. * @param {Number} height - The height. */},{key:"setSize",value:function setSize(width,height){width=Math.max(1,width);height=Math.max(1,height);this.material.uniforms.offsetRepeat.value.z=width;this.material.uniforms.offsetRepeat.value.w=height;}}]);inherits(DotScreenPass,_Pass);return DotScreenPass;}(Pass);/** * A film pass. * * Provides various cinematic effects. */var FilmPass=/*#__PURE__*/function(_Pass){/** * Constructs a new film pass. * * @param {Object} [options] - The options. See {@link FilmMaterial} for more options. * @param {Number} [options.scanlineDensity=1.25] - The scanline density, relative to the screen height. * @param {Number} [options.gridScale=1.0] - The grid scale, relative to the screen height. * @param {Number} [options.gridLineWidth=0.0] - The grid line width. This value will be added to the base line width. */function FilmPass(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,FilmPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(FilmPass).call(this,"FilmPass"));_this.material=new FilmMaterial(options);/** * The amount of scanlines, relative to the screen height. * * You need to call {@link EffectComposer#setSize} after changing this * value. * * @type {Number} */_this.scanlineDensity=options.scanlineDensity===undefined?1.25:options.scanlineDensity;/** * The grid scale, relative to the screen height. * * You need to call {@link EffectComposer#setSize} after changing this * value. * * @type {Number} */_this.gridScale=options.gridScale===undefined?1.0:Math.max(options.gridScale,1e-6);/** * The grid line width. * * You need to call {@link EffectComposer#setSize} after changing this * value. * * @type {Number} */_this.gridLineWidth=options.gridLineWidth===undefined?0.0:Math.max(options.gridLineWidth,0.0);return _this;}/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */createClass(FilmPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){this.material.uniforms.tDiffuse.value=inputBuffer.texture;this.material.uniforms.time.value+=delta;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}/** * Updates the size of this pass. * * @param {Number} width - The width. * @param {Number} height - The height. */},{key:"setSize",value:function setSize(width,height){var aspect=width/height;var gridScale=this.gridScale*(height*0.125);this.material.uniforms.scanlineCount.value=Math.round(height*this.scanlineDensity);this.material.uniforms.gridScale.value.set(aspect*gridScale,gridScale);this.material.uniforms.gridLineWidth.value=gridScale/height+this.gridLineWidth;}}]);inherits(FilmPass,_Pass);return FilmPass;}(Pass);/** * Returns a random integer in the specified range. * * @private * @param {Number} low - The lowest possible value. * @param {Number} high - The highest possible value. * @return {Number} The random value. */function randomInt(low,high){return low+Math.floor(Math.random()*(high-low+1));}/** * Returns a random float in the specified range. * * @private * @param {Number} low - The lowest possible value. * @param {Number} high - The highest possible value. * @return {Number} The random value. */function randomFloat(low,high){return low+Math.random()*(high-low);}/** * A glitch pass. */var GlitchPass=/*#__PURE__*/function(_Pass){/** * Constructs a new glitch pass. * * @param {Object} [options] - The options. * @param {Texture} [options.perturbMap] - A perturbation map. If none is provided, a noise texture will be created. * @param {Number} [options.dtSize=64] - The size of the generated noise map. Will be ignored if a perturbation map is provided. */function GlitchPass(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,GlitchPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(GlitchPass).call(this,"GlitchPass"));_this.material=new GlitchMaterial();/** * A perturbation map. * * @type {Texture} * @private */_this.texture=null;_this.perturbMap=options.perturbMap!==undefined?options.perturbMap:_this.generatePerturbMap(options.dtSize);_this.perturbMap.name="Glitch.Perturbation";_this.perturbMap.generateMipmaps=false;/** * The effect mode. * * @type {GlitchMode} */_this.mode=GlitchMode.SPORADIC;/** * A counter for the glitch activation and deactivation. * * @type {Number} * @private */_this.counter=0;/** * A random break point for the sporadic glitch activation. * * @type {Number} * @private */_this.breakPoint=randomInt(120,240);return _this;}/** * The current perturbation map. * * @type {Texture} */createClass(GlitchPass,[{key:"generatePerturbMap",/** * Destroys the current perturbation map and replaces it with a new one. * * @param {Number} [size=64] - The texture size. * @return {DataTexture} The perturbation texture. */value:function generatePerturbMap(){var size=arguments.length>0&&arguments[0]!==undefined?arguments[0]:64;var pixels=size*size;var data=new Float32Array(pixels*3);var dt=this.perturbMap;var i,x;for(i=0;i2&&arguments[2]!==undefined?arguments[2]:{};classCallCheck(this,RenderPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(RenderPass).call(this,"RenderPass",scene,camera,null));_this.needsSwap=false;/** * A clear pass. * * @type {ClearPass} */_this.clearPass=new ClearPass(options);/** * An override material. * * @type {Material} */_this.overrideMaterial=options.overrideMaterial!==undefined?options.overrideMaterial:null;/** * Indicates whether the depth buffer should be cleared explicitly. * * @type {Boolean} */_this.clearDepth=options.clearDepth!==undefined?options.clearDepth:false;/** * Indicates whether the color, depth and stencil buffers should be cleared. * * Even with clear set to true you can prevent specific buffers from being * cleared by setting either the autoClearColor, autoClearStencil or * autoClearDepth properties of the renderer to false. * * @type {Boolean} */_this.clear=options.clear!==undefined?options.clear:true;return _this;}/** * Renders the scene. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */createClass(RenderPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var scene=this.scene;var renderTarget=this.renderToScreen?null:inputBuffer;var overrideMaterial=scene.overrideMaterial;if(this.clear){this.clearPass.renderToScreen=this.renderToScreen;this.clearPass.render(renderer,inputBuffer);}else if(this.clearDepth){renderer.setRenderTarget(renderTarget);renderer.clearDepth();}scene.overrideMaterial=this.overrideMaterial;renderer.render(scene,this.camera,renderTarget);scene.overrideMaterial=overrideMaterial;}}]);inherits(RenderPass,_Pass);return RenderPass;}(Pass);/** * Clamps a given value. * * @private * @param {Number} value - The value to clamp. * @param {Number} min - The lowest possible value. * @param {Number} max - The highest possible value. * @return {Number} The clamped value. */function clamp(value,min,max){return Math.max(min,Math.min(max,value));}/** * A crepuscular rays pass. */var GodRaysPass=/*#__PURE__*/function(_Pass){/** * Constructs a new god rays pass. * * @param {Scene} scene - The main scene. * @param {Camera} camera - The main camera. * @param {Object3D} lightSource - The main light source. * @param {Object} [options] - The options. * @param {Number} [options.density=0.96] - The density of the light rays. * @param {Number} [options.decay=0.93] - An illumination decay factor. * @param {Number} [options.weight=0.4] - A light ray weight factor. * @param {Number} [options.exposure=0.6] - A constant attenuation coefficient. * @param {Number} [options.clampMax=1.0] - An upper bound for the saturation of the overall effect. * @param {Number} [options.intensity=1.0] - A constant factor for additive blending. * @param {Number} [options.resolutionScale=0.5] - The render texture resolution scale, relative to the screen render size. * @param {Number} [options.kernelSize=KernelSize.LARGE] - The blur kernel size. * @param {Number} [options.samples=60] - The number of samples per pixel. * @param {Number} [options.screenMode=true] - Whether the screen blend mode should be used for combining the god rays texture with the scene colors. */function GodRaysPass(scene,camera,lightSource){var _this;var options=arguments.length>3&&arguments[3]!==undefined?arguments[3]:{};classCallCheck(this,GodRaysPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(GodRaysPass).call(this,"GodRaysPass"));/** * A scene that only contains the light source. * * @type {Scene} * @private */_this.lightScene=new Scene();/** * The main scene. * * @type {Scene} * @private */_this.mainScene=scene;/** * The main camera. * * @type {Camera} * @private */_this.mainCamera=camera;/** * A render target. * * @type {WebGLRenderTarget} * @private */_this.renderTargetX=new WebGLRenderTarget(1,1,{minFilter:LinearFilter,magFilter:LinearFilter,stencilBuffer:false,depthBuffer:false});_this.renderTargetX.texture.name="GodRays.TargetX";_this.renderTargetX.texture.generateMipmaps=false;/** * A second render target. * * @type {WebGLRenderTarget} * @private */_this.renderTargetY=_this.renderTargetX.clone();_this.renderTargetY.texture.name="GodRays.TargetY";/** * A render target for the masked light scene. * * @type {WebGLRenderTarget} * @private */_this.renderTargetMask=new WebGLRenderTarget(1,1,{minFilter:LinearFilter,magFilter:LinearFilter});_this.renderTargetMask.texture.name="GodRays.Mask";_this.renderTargetMask.texture.generateMipmaps=false;/** * A pass that only renders the light source. * * @type {RenderPass} * @private */_this.renderPassLight=new RenderPass(_this.lightScene,_this.mainCamera,{clearColor:new Color(0x000000)});/** * A pass that renders the masked scene over the light. * * @type {RenderPass} * @private */_this.renderPassMask=new RenderPass(_this.mainScene,_this.mainCamera,{overrideMaterial:new MeshBasicMaterial({color:0x000000})});_this.renderPassMask.clear=false;/** * A blur pass. * * @type {BlurPass} * @private */_this.blurPass=new BlurPass(options);/** * The light source. * * @type {Object3D} */_this.lightSource=lightSource;/** * The light position in screen space. * * @type {Vector3} * @private */_this.screenPosition=new Vector3();/** * A god rays shader material. * * @type {GodRaysMaterial} * @private */_this.godRaysMaterial=new GodRaysMaterial(options);_this.godRaysMaterial.uniforms.lightPosition.value=_this.screenPosition;_this.samples=options.samples;/** * A combine shader material. * * @type {CombineMaterial} * @private */_this.combineMaterial=new CombineMaterial(options.screenMode!==undefined?options.screenMode:true);_this.intensity=options.intensity;return _this;}/** * The resolution scale. * * @type {Number} */createClass(GodRaysPass,[{key:"render",/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var scene=this.scene;var camera=this.camera;var mainScene=this.mainScene;var lightSource=this.lightSource;var screenPosition=this.screenPosition;var godRaysMaterial=this.godRaysMaterial;var combineMaterial=this.combineMaterial;var renderTargetMask=this.renderTargetMask;var renderTargetX=this.renderTargetX;var renderTargetY=this.renderTargetY;var background,parent;// Compute the screen light position and translate it to [0.0, 1.0]. screenPosition.copy(lightSource.position).project(this.mainCamera);screenPosition.x=clamp((screenPosition.x+1.0)*0.5,0.0,1.0);screenPosition.y=clamp((screenPosition.y+1.0)*0.5,0.0,1.0);parent=lightSource.parent;background=mainScene.background;mainScene.background=null;this.lightScene.add(lightSource);/* First, render the light source. Then render the scene into the same buffer using a mask override material with depth test enabled. */this.renderPassLight.render(renderer,renderTargetMask);this.renderPassMask.render(renderer,renderTargetMask);if(parent!==null){parent.add(lightSource);}mainScene.background=background;// Blur the masked scene to reduce artifacts. this.blurPass.render(renderer,this.renderTargetMask,renderTargetX);// Blur the masked scene along radial lines towards the light source. this.material=godRaysMaterial;godRaysMaterial.uniforms.tDiffuse.value=renderTargetX.texture;renderer.render(scene,camera,renderTargetY);if(this.blend){// Combine the god rays with the scene colors. this.material=combineMaterial;combineMaterial.uniforms.texture1.value=inputBuffer.texture;combineMaterial.uniforms.texture2.value=renderTargetY.texture;renderer.render(scene,camera,this.renderToScreen?null:outputBuffer);}}/** * Updates the size of this pass. * * @param {Number} width - The width. * @param {Number} height - The height. */},{key:"setSize",value:function setSize(width,height){this.renderPassLight.setSize(width,height);this.renderPassMask.setSize(width,height);this.blurPass.setSize(width,height);width=this.blurPass.width;height=this.blurPass.height;this.renderTargetMask.setSize(width,height);this.renderTargetX.setSize(width,height);this.renderTargetY.setSize(width,height);}/** * Performs initialization tasks. * * @param {WebGLRenderer} renderer - The renderer. * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not. */},{key:"initialize",value:function initialize(renderer,alpha){this.renderPassLight.initialize(renderer,alpha);this.renderPassMask.initialize(renderer,alpha);this.blurPass.initialize(renderer,alpha);if(!alpha){this.renderTargetMask.texture.format=RGBFormat;this.renderTargetX.texture.format=RGBFormat;this.renderTargetY.texture.format=RGBFormat;}}},{key:"resolutionScale",get:function get(){return this.blurPass.resolutionScale;}/** * You need to call {@link EffectComposer#setSize} after changing this value. * * @type {Number} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:0.5;this.blurPass.resolutionScale=value;}/** * The blur kernel size. * * @type {KernelSize} */},{key:"kernelSize",get:function get(){return this.blurPass.kernelSize;}/** * @type {KernelSize} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:KernelSize.LARGE;this.blurPass.kernelSize=value;}/** * The overall intensity of the effect. * * @type {Number} */},{key:"intensity",get:function get(){return this.combineMaterial.uniforms.opacity2.value;}/** * @type {Number} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:1.0;this.combineMaterial.uniforms.opacity2.value=value;}/** * The number of samples per pixel. * * @type {Number} */},{key:"samples",get:function get(){return Number.parseInt(this.godRaysMaterial.defines.NUM_SAMPLES_INT);}/** * This value must be carefully chosen. A higher value directly increases the * GPU load. * * @type {Number} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:60;value=Math.floor(value);this.godRaysMaterial.defines.NUM_SAMPLES_FLOAT=value.toFixed(1);this.godRaysMaterial.defines.NUM_SAMPLES_INT=value.toFixed(0);this.godRaysMaterial.needsUpdate=true;}/** * Indicates whether dithering is enabled. * * @type {Boolean} */},{key:"dithering",get:function get(){return this.godRaysMaterial.dithering;}/** * If enabled, the result will be dithered to remove banding artifacts. * * @type {Boolean} */,set:function set(value){if(this.dithering!==value){this.godRaysMaterial.dithering=value;this.godRaysMaterial.needsUpdate=true;}}/** * Indicates whether the effect should be applied to the input buffer. * * @type {Boolean} */},{key:"blend",get:function get(){return this.needsSwap;}/** * If disabled, the input buffer will remain unaffected. * * You may use the {@link BloomPass#overlay} texture to apply the effect to * your scene. * * @type {Boolean} */,set:function set(value){this.needsSwap=value;}/** * The effect overlay texture. * * @type {Texture} */},{key:"overlay",get:function get(){return this.renderTargetY.texture;}}]);inherits(GodRaysPass,_Pass);return GodRaysPass;}(Pass);/** * A mask pass. */var MaskPass=/*#__PURE__*/function(_Pass){/** * Constructs a new mask pass. * * @param {Scene} scene - The scene to render. * @param {Camera} camera - The camera to use. */function MaskPass(scene,camera){var _this;classCallCheck(this,MaskPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(MaskPass).call(this,"MaskPass",scene,camera,null));_this.needsSwap=false;/** * Inverse flag. * * @type {Boolean} */_this.inverse=false;/** * Stencil buffer clear flag. * * @type {Boolean} */_this.clearStencil=true;return _this;}/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */createClass(MaskPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var context=renderer.context;var state=renderer.state;var scene=this.scene;var camera=this.camera;var writeValue=this.inverse?0:1;var clearValue=1-writeValue;// Don't update color or depth. state.buffers.color.setMask(false);state.buffers.depth.setMask(false);// Lock the buffers. state.buffers.color.setLocked(true);state.buffers.depth.setLocked(true);// Configure the stencil. state.buffers.stencil.setTest(true);state.buffers.stencil.setOp(context.REPLACE,context.REPLACE,context.REPLACE);state.buffers.stencil.setFunc(context.ALWAYS,writeValue,0xffffffff);state.buffers.stencil.setClear(clearValue);// Clear the stencil. if(this.clearStencil){if(this.renderToScreen){renderer.setRenderTarget(null);renderer.clearStencil();}else{renderer.setRenderTarget(inputBuffer);renderer.clearStencil();renderer.setRenderTarget(outputBuffer);renderer.clearStencil();}}// Draw the mask. if(this.renderToScreen){renderer.render(scene,camera,null);}else{renderer.render(scene,camera,inputBuffer);renderer.render(scene,camera,outputBuffer);}// Unlock the buffers. state.buffers.color.setLocked(false);state.buffers.depth.setLocked(false);// Only render where the stencil is set to 1. state.buffers.stencil.setFunc(context.EQUAL,1,0xffffffff);state.buffers.stencil.setOp(context.KEEP,context.KEEP,context.KEEP);}}]);inherits(MaskPass,_Pass);return MaskPass;}(Pass);/** * A shader pass. * * Used to render any shader material as a 2D filter. */var ShaderPass=/*#__PURE__*/function(_Pass){/** * Constructs a new shader pass. * * @param {ShaderMaterial} material - The shader material to use. * @param {String} [textureID="tDiffuse"] - The texture uniform identifier. */function ShaderPass(material){var _this;var textureID=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"tDiffuse";classCallCheck(this,ShaderPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(ShaderPass).call(this,"ShaderPass"));_this.material=material;/** * The name of the color sampler uniform of the given material. * * @type {String} */_this.textureID=textureID;return _this;}/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */createClass(ShaderPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){if(this.material.uniforms[this.textureID]!==undefined){this.material.uniforms[this.textureID].value=inputBuffer.texture;}renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}}]);inherits(ShaderPass,_Pass);return ShaderPass;}(Pass);/** * An outline pass. */var OutlinePass=/*#__PURE__*/function(_Pass){/** * Constructs a new outline pass. * * @param {Scene} scene - The main scene. * @param {Camera} camera - The main camera. * @param {Object} [options] - Additional parameters. See {@link BlurPass}, {@link OutlineBlendMaterial} and {@link OutlineEdgesMaterial} for details. * @param {Number} [options.pulseSpeed=0.0] - The pulse speed. A value of zero disables the pulse effect. * @param {Boolean} [options.blur=true] - Whether the outline should be blurred. */function OutlinePass(scene,camera){var _this;var options=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};classCallCheck(this,OutlinePass);_this=possibleConstructorReturn(this,getPrototypeOf$2(OutlinePass).call(this,"OutlinePass"));/** * The main scene. * * @type {Scene} * @private */_this.mainScene=scene;/** * The main camera. * * @type {Camera} * @private */_this.mainCamera=camera;/** * A render target for depth information. * * @type {WebGLRenderTarget} * @private */_this.renderTargetDepth=new WebGLRenderTarget(1,1,{minFilter:LinearFilter,magFilter:LinearFilter});_this.renderTargetDepth.texture.name="Outline.Depth";_this.renderTargetDepth.texture.generateMipmaps=false;/** * A render target for the outline mask. * * @type {WebGLRenderTarget} * @private */_this.renderTargetMask=_this.renderTargetDepth.clone();_this.renderTargetMask.texture.format=RGBFormat;_this.renderTargetMask.texture.name="Outline.Mask";/** * A render target for the edge detection. * * @type {WebGLRenderTarget} * @private */_this.renderTargetEdges=new WebGLRenderTarget(1,1,{minFilter:LinearFilter,magFilter:LinearFilter,stencilBuffer:false,depthBuffer:false,format:RGBFormat});_this.renderTargetEdges.texture.name="Outline.Edges";_this.renderTargetEdges.texture.generateMipmaps=false;/** * A render target for the blurred outline overlay. * * @type {WebGLRenderTarget} * @private */_this.renderTargetBlurredEdges=_this.renderTargetEdges.clone();_this.renderTargetBlurredEdges.texture.name="Outline.BlurredEdges";/** * A depth pass. * * @type {RenderPass} * @private */_this.renderPassDepth=new RenderPass(_this.mainScene,_this.mainCamera,{overrideMaterial:new MeshDepthMaterial({depthPacking:RGBADepthPacking,morphTargets:true,skinning:true}),clearColor:new Color(0xffffff),clearAlpha:1.0});/** * A depth comparison mask pass. * * @type {RenderPass} * @private */_this.renderPassMask=new RenderPass(_this.mainScene,_this.mainCamera,{overrideMaterial:new DepthComparisonMaterial(_this.renderTargetDepth.texture,_this.mainCamera),clearColor:new Color(0xffffff),clearAlpha:1.0});/** * A blur pass. * * @type {BlurPass} * @private */_this.blurPass=new BlurPass(options);_this.kernelSize=options.kernelSize;/** * A copy pass that renders the read buffer to screen if needed. * * @type {ShaderPass} * @private */_this.copyPass=new ShaderPass(new CopyMaterial());_this.copyPass.renderToScreen=true;/** * An outline edge detection material. * * @type {OutlineEdgesMaterial} * @private */_this.outlineEdgesMaterial=new OutlineEdgesMaterial(options);_this.outlineEdgesMaterial.uniforms.tMask.value=_this.renderTargetMask.texture;/** * An outline blend material. * * @type {OutlineBlendMaterial} * @private */_this.outlineBlendMaterial=new OutlineBlendMaterial(options);_this.outlineBlendMaterial.uniforms.tMask.value=_this.renderTargetMask.texture;_this.blur=options.blur!==undefined?options.blur:true;/** * A list of objects to outline. * * @type {Object3D[]} * @private */_this.selection=[];/** * The current animation time. * * @type {Number} * @private */_this.time=0.0;/** * The pulse speed. A value of zero disables the pulse effect. * * @type {Number} */_this.pulseSpeed=options.pulseSpeed!==undefined?options.pulseSpeed:0.0;/** * A dedicated render layer for selected objects. * * This layer is set to 10 by default. If this collides with your own custom * layers, please change it to a free layer before rendering! * * @type {Number} */_this.selectionLayer=10;return _this;}/** * The resolution scale. * * @type {Number} */createClass(OutlinePass,[{key:"setPatternTexture",/** * Sets a pattern texture to use as an overlay for selected objects. * * @param {Texture} [texture=null] - A pattern texture. Set to null to disable the pattern. */value:function setPatternTexture(){var texture=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;this.outlineBlendMaterial.setPatternTexture(texture);}/** * Clears the current selection and selects a list of objects. * * @param {Object3D[]} objects - The objects that should be outlined. This array will be copied. * @return {OutlinePass} This pass. */},{key:"setSelection",value:function setSelection(objects){var selection=objects.slice(0);var selectionLayer=this.selectionLayer;var i,l;this.clearSelection();for(i=0,l=selection.length;i=0){selection[index].layers.disable(this.selectionLayer);selection.splice(index,1);if(selection.length===0){this.time=0.0;}}return this;}/** * Sets the visibility of all selected objects. * * @private * @param {Boolean} visible - Whether the selected objects should be visible. */},{key:"setSelectionVisible",value:function setSelectionVisible(visible){var selection=this.selection;var i,l;for(i=0,l=selection.length;i0){background=mainScene.background;mask=mainCamera.layers.mask;mainScene.background=null;pulse.value=1.0;if(this.pulseSpeed>0.0){pulse.value=0.625+Math.cos(this.time*this.pulseSpeed*10.0)*0.375;this.time+=delta;}// Render a custom depth texture and ignore selected objects. this.setSelectionVisible(false);this.renderPassDepth.render(renderer,this.renderTargetDepth);this.setSelectionVisible(true);// Create a mask for the selected objects using the depth information. mainCamera.layers.mask=1<0&&arguments[0]!==undefined?arguments[0]:0.5;this.blurPass.resolutionScale=value;}/** * The blur kernel size. * * @type {KernelSize} */},{key:"kernelSize",get:function get(){return this.blurPass.kernelSize;}/** * @type {KernelSize} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:KernelSize.VERY_SMALL;this.blurPass.kernelSize=value;}/** * Indicates whether the outline overlay should be blurred. * * @type {Boolean} */},{key:"blur",get:function get(){return this.blurPass.enabled;}/** * @type {Boolean} */,set:function set(value){this.blurPass.enabled=value;this.outlineBlendMaterial.uniforms.tEdges.value=value?this.renderTargetBlurredEdges.texture:this.renderTargetEdges.texture;}/** * Indicates whether dithering is enabled. * * @type {Boolean} */},{key:"dithering",get:function get(){return this.blurPass.dithering;}/** * If enabled, the result will be dithered to remove banding artifacts. * * @type {Boolean} */,set:function set(value){this.blurPass.dithering=value;}/** * Indicates whether the effect should be applied to the input buffer. * * @type {Boolean} */},{key:"blend",get:function get(){return this.needsSwap;}/** * If disabled, the input buffer will remain unaffected. * * You may use the {@link BloomPass#overlay} texture to apply the effect to * your scene. * * @type {Boolean} */,set:function set(value){this.needsSwap=value;}/** * The effect overlay texture. * * @type {Texture} */},{key:"overlay",get:function get(){return this.outlineBlendMaterial.uniforms.tEdges.value;}}]);inherits(OutlinePass,_Pass);return OutlinePass;}(Pass);/** * A pixelation pass. */var PixelationPass=/*#__PURE__*/function(_Pass){/** * Constructs a new pixelation pass. * * @param {Number} [granularity=30.0] - The intensity of the effect. */function PixelationPass(){var _this;var granularity=arguments.length>0&&arguments[0]!==undefined?arguments[0]:30.0;classCallCheck(this,PixelationPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(PixelationPass).call(this,"PixelationPass"));_this.material=new PixelationMaterial();_this.granularity=granularity;return _this;}/** * The pixel granularity. * * @type {Number} */createClass(PixelationPass,[{key:"render",/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){this.material.uniforms.tDiffuse.value=inputBuffer.texture;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}/** * Updates the size of this pass. * * @param {Number} width - The width. * @param {Number} height - The height. */},{key:"setSize",value:function setSize(width,height){this.material.setResolution(width,height);}},{key:"granularity",get:function get(){return this.material.granularity;}/** * A higher value yields coarser visuals. * * @type {Number} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:30;value=Math.floor(value);if(value%2>0){value+=1;}this.material.granularity=value;}}]);inherits(PixelationPass,_Pass);return PixelationPass;}(Pass);/** * An advanced Depth of Field (DoF) pass. * * Yields more realistic results but is also more demanding. * * This pass requires a {@link EffectComposer#depthTexture}. */var RealisticBokehPass=/*#__PURE__*/function(_Pass){/** * Constructs a new bokeh pass. * * @param {PerspectiveCamera} camera - The main camera. Used to obtain the focal length and the near and far plane settings. * @param {Object} [options] - Additional parameters. See {@link RealisticBokehMaterial} for details. */function RealisticBokehPass(camera){var _this;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};classCallCheck(this,RealisticBokehPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(RealisticBokehPass).call(this,"RealisticBokehPass"));_this.material=new RealisticBokehMaterial(camera,options);return _this;}/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */createClass(RealisticBokehPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){this.material.uniforms.tDiffuse.value=inputBuffer.texture;this.material.uniforms.tDepth.value=inputBuffer.depthTexture;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}/** * Updates the size of this pass. * * @param {Number} width - The width. * @param {Number} height - The height. */},{key:"setSize",value:function setSize(width,height){this.material.setTexelSize(1.0/width,1.0/height);}}]);inherits(RealisticBokehPass,_Pass);return RealisticBokehPass;}(Pass);/** * A pass that renders the result from a previous pass to another render target. */var SavePass=/*#__PURE__*/function(_Pass){/** * Constructs a new save pass. * * @param {WebGLRenderTarget} [renderTarget] - The render target to use for saving the input buffer. * @param {Boolean} [resize=true] - Whether the render target should adjust to the size of the input buffer. */function SavePass(renderTarget){var _this;var resize=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;classCallCheck(this,SavePass);_this=possibleConstructorReturn(this,getPrototypeOf$2(SavePass).call(this,"SavePass"));_this.material=new CopyMaterial();_this.needsSwap=false;/** * The render target. * * @type {WebGLRenderTarget} */_this.renderTarget=renderTarget!==undefined?renderTarget:new WebGLRenderTarget(1,1,{minFilter:LinearFilter,magFilter:LinearFilter,stencilBuffer:false,depthBuffer:false});_this.renderTarget.texture.name="Save.Target";_this.renderTarget.texture.generateMipmaps=false;/** * Indicates whether the render target should be resized when the size of * the composer's frame buffer changes. * * @type {Boolean} */_this.resize=resize;return _this;}/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */createClass(SavePass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){this.material.uniforms.tDiffuse.value=inputBuffer.texture;renderer.render(this.scene,this.camera,this.renderTarget);}/** * Updates the size of this pass. * * @param {Number} width - The width. * @param {Number} height - The height. */},{key:"setSize",value:function setSize(width,height){if(this.resize){width=Math.max(1,width);height=Math.max(1,height);this.renderTarget.setSize(width,height);}}/** * Performs initialization tasks. * * @param {WebGLRenderer} renderer - The renderer. * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not. */},{key:"initialize",value:function initialize(renderer,alpha){if(!alpha){this.renderTarget.texture.format=RGBFormat;}}}]);inherits(SavePass,_Pass);return SavePass;}(Pass);/** * Half PI. * * @type {Number} * @private */var HALF_PI=Math.PI*0.5;/** * A vector. * * @type {Vector3} * @private */var v=new Vector3();/** * A vector. * * @type {Vector3} * @private */var ab=new Vector3();/** * A shock wave pass. */var ShockWavePass=/*#__PURE__*/function(_Pass){/** * Constructs a new shock wave pass. * * @param {Camera} camera - The main camera. * @param {Vector3} [epicenter] - The world position of the shock wave epicenter. * @param {Object} [options] - The options. * @param {Number} [options.speed=1.0] - The animation speed. * @param {Number} [options.maxRadius=1.0] - The extent of the shock wave. * @param {Number} [options.waveSize=0.2] - The wave size. * @param {Number} [options.amplitude=0.05] - The distortion amplitude. */function ShockWavePass(camera){var _this;var epicenter=arguments.length>1&&arguments[1]!==undefined?arguments[1]:new Vector3();var options=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};classCallCheck(this,ShockWavePass);_this=possibleConstructorReturn(this,getPrototypeOf$2(ShockWavePass).call(this,"ShockWavePass"));/** * The main camera. * * @type {Object3D} */_this.mainCamera=camera;/** * The epicenter. * * @type {Vector3} * @example shockWavePass.epicenter = myMesh.position; */_this.epicenter=epicenter;/** * The object position in screen space. * * @type {Vector3} * @private */_this.screenPosition=new Vector3();/** * The speed of the shock wave animation. * * @type {Number} */_this.speed=options.speed!==undefined?options.speed:2.0;/** * A time accumulator. * * @type {Number} * @private */_this.time=0.0;/** * Indicates whether the shock wave animation is active. * * @type {Boolean} * @private */_this.active=false;/** * A shock wave shader material. * * @type {ShockWaveMaterial} * @private */_this.shockWaveMaterial=new ShockWaveMaterial(options);_this.shockWaveMaterial.uniforms.center.value=_this.screenPosition;/** * A copy shader material. * * @type {CopyMaterial} * @private */_this.copyMaterial=new CopyMaterial();return _this;}/** * Emits the shock wave. */createClass(ShockWavePass,[{key:"explode",value:function explode(){this.time=0.0;this.active=true;}/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */},{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var epicenter=this.epicenter;var mainCamera=this.mainCamera;var screenPosition=this.screenPosition;var shockWaveMaterial=this.shockWaveMaterial;var uniforms=shockWaveMaterial.uniforms;var center=uniforms.center;var radius=uniforms.radius;var maxRadius=uniforms.maxRadius;var waveSize=uniforms.waveSize;this.copyMaterial.uniforms.tDiffuse.value=inputBuffer.texture;this.material=this.copyMaterial;if(this.active){// Calculate direction vectors. mainCamera.getWorldDirection(v);ab.copy(mainCamera.position).sub(epicenter);// Don't render the effect if the object is behind the camera. if(v.angleTo(ab)>HALF_PI){// Scale the effect based on distance to the object. uniforms.cameraDistance.value=mainCamera.position.distanceTo(epicenter);// Calculate the screen position of the epicenter. screenPosition.copy(epicenter).project(mainCamera);center.value.x=(screenPosition.x+1.0)*0.5;center.value.y=(screenPosition.y+1.0)*0.5;uniforms.tDiffuse.value=inputBuffer.texture;this.material=shockWaveMaterial;}// Update the shock wave radius based on time. this.time+=delta*this.speed;radius.value=this.time-waveSize.value;if(radius.value>=(maxRadius.value+waveSize.value)*2){this.active=false;}}renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}/** * Updates the size of this pass. * * @param {Number} width - The width. * @param {Number} height - The height. */},{key:"setSize",value:function setSize(width,height){this.shockWaveMaterial.uniforms.aspect.value=width/height;}}]);inherits(ShockWavePass,_Pass);return ShockWavePass;}(Pass);// Generated with SMAASearchImageData.generate().toCanvas().toDataURL(), not cropped, low dynamic range. var searchImageDataURL="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAAAhCAAAAABIXyLAAAAAOElEQVRIx2NgGAWjYBSMglEwEICREYRgFBZBqDCSLA2MGPUIVQETE9iNUAqLR5gIeoQKRgwXjwAAGn4AtaFeYLEAAAAASUVORK5CYII";// Generated with SMAAAreaImageData.generate().toCanvas().toDataURL(). var areaImageDataURL="data:image/png;base64,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";/** * Subpixel Morphological Antialiasing (SMAA) v2.8. * * Preset: SMAA 1x Medium (with color edge detection). * https://github.com/iryoku/smaa/releases/tag/v2.8 */var SMAAPass=/*#__PURE__*/function(_Pass){/** * Constructs a new SMAA pass. * * @param {Image} searchImage - The SMAA search image. Preload this image using the {@link searchImageDataURL}. * @param {Image} areaImage - The SMAA area image. Preload this image using the {@link areaImageDataURL}. */function SMAAPass(searchImage,areaImage){var _this;classCallCheck(this,SMAAPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(SMAAPass).call(this,"SMAAPass"));/** * A clear pass for the color edges buffer. * * @type {ClearPass} * @private */_this.clearPass=new ClearPass({clearColor:new Color(0x000000),clearAlpha:1.0});/** * A render target for the color edge detection. * * @type {WebGLRenderTarget} * @private */_this.renderTargetColorEdges=new WebGLRenderTarget(1,1,{minFilter:LinearFilter,format:RGBFormat,stencilBuffer:false,depthBuffer:false});_this.renderTargetColorEdges.texture.name="SMAA.ColorEdges";_this.renderTargetColorEdges.texture.generateMipmaps=false;/** * A render target for the SMAA weights. * * @type {WebGLRenderTarget} * @private */_this.renderTargetWeights=_this.renderTargetColorEdges.clone();_this.renderTargetWeights.texture.name="SMAA.Weights";_this.renderTargetWeights.texture.format=RGBAFormat;/** * Color edge detection shader material. * * @type {ColorEdgesMaterial} * @private */_this.colorEdgesMaterial=new ColorEdgesMaterial();/** * SMAA weights shader material. * * @type {SMAAWeightsMaterial} * @private */_this.weightsMaterial=new SMAAWeightsMaterial();_this.weightsMaterial.uniforms.tDiffuse.value=_this.renderTargetColorEdges.texture;/** * The SMAA search texture. * * @type {Texture} * @private */_this.searchTexture=new Texture(searchImage);_this.searchTexture.name="SMAA.Search";_this.searchTexture.magFilter=NearestFilter;_this.searchTexture.minFilter=NearestFilter;_this.searchTexture.format=RGBAFormat;_this.searchTexture.generateMipmaps=false;_this.searchTexture.needsUpdate=true;_this.searchTexture.flipY=false;_this.weightsMaterial.uniforms.tSearch.value=_this.searchTexture;/** * The SMAA area texture. * * @type {Texture} * @private */_this.areaTexture=new Texture(areaImage);_this.areaTexture.name="SMAA.Area";_this.areaTexture.minFilter=LinearFilter;_this.areaTexture.format=RGBAFormat;_this.areaTexture.generateMipmaps=false;_this.areaTexture.needsUpdate=true;_this.areaTexture.flipY=false;_this.weightsMaterial.uniforms.tArea.value=_this.areaTexture;/** * SMAA blend shader material. * * @type {SMAABlendMaterial} * @private */_this.blendMaterial=new SMAABlendMaterial();_this.blendMaterial.uniforms.tWeights.value=_this.renderTargetWeights.texture;return _this;}/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */createClass(SMAAPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){// Detect color edges. this.material=this.colorEdgesMaterial;this.colorEdgesMaterial.uniforms.tDiffuse.value=inputBuffer.texture;this.clearPass.render(renderer,this.renderTargetColorEdges);renderer.render(this.scene,this.camera,this.renderTargetColorEdges);// Compute edge weights. this.material=this.weightsMaterial;renderer.render(this.scene,this.camera,this.renderTargetWeights);// Apply the antialiasing filter to the colors. this.material=this.blendMaterial;this.blendMaterial.uniforms.tDiffuse.value=inputBuffer.texture;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}/** * Updates the size of this pass. * * @param {Number} width - The width. * @param {Number} height - The height. */},{key:"setSize",value:function setSize(width,height){this.renderTargetColorEdges.setSize(width,height);this.renderTargetWeights.setSize(width,height);this.colorEdgesMaterial.uniforms.texelSize.value.copy(this.weightsMaterial.uniforms.texelSize.value.copy(this.blendMaterial.uniforms.texelSize.value.set(1.0/width,1.0/height)));}/** * The SMAA search image, encoded as a base64 data URL. * * Use this image data to create an Image instance and use it together with * the area image to create an SMAAPass. * * @type {String} * @example * const searchImage = new Image(); * searchImage.addEventListener("load", progress); * searchImage.src = SMAAPass.searchImageDataURL; */}],[{key:"searchImageDataURL",get:function get(){return searchImageDataURL;}/** * The SMAA area image, encoded as a base64 data URL. * * Use this image data to create an Image instance and use it together with * the search image to create an SMAAPass. * * @type {String} * @example * const areaImage = new Image(); * areaImage.addEventListener("load", progress); * areaImage.src = SMAAPass.areaImageDataURL; */},{key:"areaImageDataURL",get:function get(){return areaImageDataURL;}}]);inherits(SMAAPass,_Pass);return SMAAPass;}(Pass);/** * A pass that renders a given texture. */var TexturePass=/*#__PURE__*/function(_Pass){/** * Constructs a new texture pass. * * @param {Texture} texture - The texture. * @param {Number} [opacity=1.0] - The texture opacity. * @param {Boolean} [screenMode=true] - Whether the screen blend mode should be used for combining the texture with the scene colors. */function TexturePass(texture){var _this;var opacity=arguments.length>1&&arguments[1]!==undefined?arguments[1]:1.0;var screenMode=arguments.length>2&&arguments[2]!==undefined?arguments[2]:true;classCallCheck(this,TexturePass);_this=possibleConstructorReturn(this,getPrototypeOf$2(TexturePass).call(this,"TexturePass"));_this.material=new CombineMaterial(screenMode);_this.texture=texture;_this.opacitySource=opacity;return _this;}/** * The texture. * * @type {Texture} */createClass(TexturePass,[{key:"render",/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){this.material.uniforms.texture1.value=inputBuffer.texture;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}},{key:"texture",get:function get(){return this.material.uniforms.texture2.value;}/** * @type {Texture} */,set:function set(value){this.material.uniforms.texture2.value=value;}/** * The opacity of the input buffer. * * The destination color is the color from the image in the input buffer. * * @type {Number} */},{key:"opacityDestination",get:function get(){return this.material.uniforms.opacity1.value;}/** * @type {Number} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:1.0;this.material.uniforms.opacity1.value=value;}/** * The opacity of the texture. * * The source color is the color from the texture. * * @type {Number} */},{key:"opacitySource",get:function get(){return this.material.uniforms.opacity2.value;}/** * @type {Number} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:1.0;this.material.uniforms.opacity2.value=value;}}]);inherits(TexturePass,_Pass);return TexturePass;}(Pass);/** * A tone mapping pass that supports adaptive luminosity. * * If adaptivity is enabled, this pass generates a texture that represents the * luminosity of the current scene and adjusts it over time to simulate the * optic nerve responding to the amount of light it is receiving. * * Reference: * GDC2007 - Wolfgang Engel, Post-Processing Pipeline * http://perso.univ-lyon1.fr/jean-claude.iehl/Public/educ/GAMA/2007/gdc07/Post-Processing_Pipeline.pdf */var ToneMappingPass=/*#__PURE__*/function(_Pass){/** * Constructs a new tone mapping pass. * * @param {Object} [options] - The options. * @param {Boolean} [options.adaptive=true] - Whether the tone mapping should use an adaptive luminance map. * @param {Number} [options.resolution=256] - The render texture resolution. * @param {Number} [options.distinction=1.0] - A luminance distinction factor. */function ToneMappingPass(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,ToneMappingPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(ToneMappingPass).call(this,"ToneMappingPass"));/** * The render target for the current luminosity. * * @type {WebGLRenderTarget} * @private * @todo Use RED format in WebGL 2.0. */_this.renderTargetLuminosity=new WebGLRenderTarget(1,1,{minFilter:LinearMipMapLinearFilter,magFilter:LinearFilter,format:RGBFormat,stencilBuffer:false,depthBuffer:false});_this.renderTargetLuminosity.texture.name="ToneMapping.Luminosity";/** * The render target for adapted luminosity. * * @type {WebGLRenderTarget} * @private */_this.renderTargetAdapted=_this.renderTargetLuminosity.clone();_this.renderTargetAdapted.texture.name="ToneMapping.AdaptedLuminosity";_this.renderTargetAdapted.texture.generateMipmaps=false;_this.renderTargetAdapted.texture.minFilter=LinearFilter;/** * A render target that holds a copy of the adapted limonosity. * * @type {WebGLRenderTarget} * @private */_this.renderTargetPrevious=_this.renderTargetAdapted.clone();_this.renderTargetPrevious.texture.name="ToneMapping.PreviousLuminosity";/** * Copy shader material used for saving the luminance map. * * @type {CopyMaterial} * @private */_this.copyMaterial=new CopyMaterial();/** * A luminosity shader material. * * @type {LuminosityMaterial} * @private */_this.luminosityMaterial=new LuminosityMaterial();_this.luminosityMaterial.uniforms.distinction.value=options.distinction!==undefined?options.distinction:1.0;/** * An adaptive luminance shader material. * * @type {AdaptiveLuminosityMaterial} * @private */_this.adaptiveLuminosityMaterial=new AdaptiveLuminosityMaterial();_this.resolution=options.resolution;/** * A tone mapping shader material. * * @type {ToneMappingMaterial} * @private */_this.toneMappingMaterial=new ToneMappingMaterial();_this.adaptive=options.adaptive;return _this;}/** * The resolution of the render targets. * * @type {Number} */createClass(ToneMappingPass,[{key:"render",/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var scene=this.scene;var camera=this.camera;var adaptiveLuminosityMaterial=this.adaptiveLuminosityMaterial;var luminosityMaterial=this.luminosityMaterial;var toneMappingMaterial=this.toneMappingMaterial;var copyMaterial=this.copyMaterial;var renderTargetPrevious=this.renderTargetPrevious;var renderTargetLuminosity=this.renderTargetLuminosity;var renderTargetAdapted=this.renderTargetAdapted;if(this.adaptive){// Render the luminance of the current scene into a render target with mipmapping enabled. this.material=luminosityMaterial;luminosityMaterial.uniforms.tDiffuse.value=inputBuffer.texture;renderer.render(scene,camera,renderTargetLuminosity);// Use the new luminance values, the previous luminance and the frame delta to adapt the luminance over time. this.material=adaptiveLuminosityMaterial;adaptiveLuminosityMaterial.uniforms.delta.value=delta;adaptiveLuminosityMaterial.uniforms.tPreviousLum.value=renderTargetPrevious.texture;adaptiveLuminosityMaterial.uniforms.tCurrentLum.value=renderTargetLuminosity.texture;renderer.render(scene,camera,renderTargetAdapted);// Copy the new adapted luminance value so that it can be used by the next frame. this.material=copyMaterial;copyMaterial.uniforms.tDiffuse.value=renderTargetAdapted.texture;renderer.render(scene,camera,renderTargetPrevious);}// Apply the tone mapping to the colours. this.material=toneMappingMaterial;toneMappingMaterial.uniforms.tDiffuse.value=inputBuffer.texture;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}/** * Performs initialization tasks. * * @param {WebGLRenderer} renderer - The renderer. * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not. */},{key:"initialize",value:function initialize(renderer,alpha){this.material=new MeshBasicMaterial({color:0x7fffff});renderer.render(this.scene,this.camera,this.renderTargetPrevious);this.material.dispose();}},{key:"resolution",get:function get(){return this.renderTargetLuminosity.width;}/** * The resolution of the render targets. Must be a power of two for mipmaps. * * @type {Number} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:256;// Round the given value to the next power of two. var exponent=Math.max(0,Math.ceil(Math.log2(value)));value=Math.pow(2,exponent);this.renderTargetLuminosity.setSize(value,value);this.renderTargetPrevious.setSize(value,value);this.renderTargetAdapted.setSize(value,value);this.adaptiveLuminosityMaterial.defines.MIP_LEVEL_1X1=exponent.toFixed(1);this.adaptiveLuminosityMaterial.needsUpdate=true;}/** * Whether this pass uses adaptive luminosity. * * @type {Boolean} * @default true */},{key:"adaptive",get:function get(){return this.toneMappingMaterial.defines.ADAPTED_LUMINANCE!==undefined;}/** * Whether this pass should use adaptive luminosity. * * @type {Boolean} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:true;if(value){this.toneMappingMaterial.defines.ADAPTED_LUMINANCE="1";this.toneMappingMaterial.uniforms.luminanceMap.value=this.renderTargetAdapted.texture;}else{delete this.toneMappingMaterial.defines.ADAPTED_LUMINANCE;this.toneMappingMaterial.uniforms.luminanceMap.value=null;}this.toneMappingMaterial.needsUpdate=true;}/** * Indicates whether dithering is enabled. * * @type {Boolean} */},{key:"dithering",get:function get(){return this.toneMappingMaterial.dithering;}/** * If enabled, the result will be dithered to remove banding artifacts. * * @type {Boolean} */,set:function set(value){if(this.dithering!==value){this.toneMappingMaterial.dithering=value;this.toneMappingMaterial.needsUpdate=true;}}}]);inherits(ToneMappingPass,_Pass);return ToneMappingPass;}(Pass);/** * A compilation of the post processing passes. * * @module postprocessing/passes */ /** * The EffectComposer may be used in place of a normal WebGLRenderer. * * The auto clear behaviour of the provided renderer will be disabled to prevent * unnecessary clear operations. * * It is common practice to use a {@link RenderPass} as the first pass to * automatically clear the screen and render the scene to a texture for further * processing. * * @implements {Resizable} * @implements {Disposable} */var EffectComposer=/*#__PURE__*/function(){/** * Constructs a new effect composer. * * @param {WebGLRenderer} [renderer] - The renderer that should be used. * @param {Object} [options] - The options. * @param {Boolean} [options.depthBuffer=true] - Whether the main render targets should have a depth buffer. * @param {Boolean} [options.stencilBuffer=false] - Whether the main render targets should have a stencil buffer. * @param {Boolean} [options.depthTexture=false] - Set to true if one of your passes relies on a depth texture. */function EffectComposer(){var renderer=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};classCallCheck(this,EffectComposer);/** * The renderer. * * You may replace the renderer at any time by using * {@link EffectComposer#replaceRenderer}. * * @type {WebGLRenderer} */this.renderer=renderer;/** * The input buffer. * * Reading from and writing to the same render target should be avoided. * Therefore, two seperate yet identical buffers are used. * * @type {WebGLRenderTarget} * @private */this.inputBuffer=null;/** * The output buffer. * * @type {WebGLRenderTarget} * @private */this.outputBuffer=null;if(this.renderer!==null){this.renderer.autoClear=false;this.inputBuffer=this.createBuffer(options.depthBuffer!==undefined?options.depthBuffer:true,options.stencilBuffer!==undefined?options.stencilBuffer:false,options.depthTexture!==undefined?options.depthTexture:false);this.outputBuffer=this.inputBuffer.clone();}/** * A copy pass used for copying masked scenes. * * @type {ShaderPass} * @private */this.copyPass=new ShaderPass(new CopyMaterial());/** * The passes. * * @type {Pass[]} * @private */this.passes=[];}/** * The depth texture of the input and output buffers. * * @type {DepthTexture} */createClass(EffectComposer,[{key:"replaceRenderer",/** * Replaces the current renderer with the given one. The DOM element of the * current renderer will automatically be removed from its parent node and the * DOM element of the new renderer will take its place. * * The auto clear mechanism of the provided renderer will be disabled. * * Switching between renderers allows you to dynamically enable or disable * antialiasing. * * @param {WebGLRenderer} renderer - The new renderer. * @return {WebGLRenderer} The old renderer. */value:function replaceRenderer(renderer){var oldRenderer=this.renderer;var parent,oldSize,newSize;if(oldRenderer!==null&&oldRenderer!==renderer){this.renderer=renderer;this.renderer.autoClear=false;parent=oldRenderer.domElement.parentNode;oldSize=oldRenderer.getSize();newSize=renderer.getSize();if(parent!==null){parent.removeChild(oldRenderer.domElement);parent.appendChild(renderer.domElement);}if(oldSize.width!==newSize.width||oldSize.height!==newSize.height){this.setSize();}}return oldRenderer;}/** * Creates a new render target by replicating the renderer's canvas. * * The created render target uses a linear filter for texel minification and * magnification. Its render texture format depends on whether the renderer * uses the alpha channel. Mipmaps are disabled. * * @param {Boolean} depthBuffer - Whether the render target should have a depth buffer. * @param {Boolean} stencilBuffer - Whether the render target should have a stencil buffer. * @param {Boolean} depthTexture - Whether the render target should have a depth texture. * @return {WebGLRenderTarget} A new render target that equals the renderer's canvas. */},{key:"createBuffer",value:function createBuffer(depthBuffer,stencilBuffer,depthTexture){var drawingBufferSize=this.renderer.getDrawingBufferSize();var alpha=this.renderer.context.getContextAttributes().alpha;var renderTarget=new WebGLRenderTarget(drawingBufferSize.width,drawingBufferSize.height,{minFilter:LinearFilter,magFilter:LinearFilter,format:alpha?RGBAFormat:RGBFormat,depthBuffer:depthBuffer,stencilBuffer:stencilBuffer,depthTexture:depthTexture?new DepthTexture():null});if(depthTexture&&stencilBuffer){renderTarget.depthTexture.format=DepthStencilFormat;renderTarget.depthTexture.type=UnsignedInt248Type;}renderTarget.texture.name="EffectComposer.Buffer";renderTarget.texture.generateMipmaps=false;return renderTarget;}/** * Adds a pass, optionally at a specific index. * * @param {Pass} pass - A new pass. * @param {Number} [index] - An index at which the pass should be inserted. */},{key:"addPass",value:function addPass(pass,index){var renderer=this.renderer;var drawingBufferSize=renderer.getDrawingBufferSize();pass.setSize(drawingBufferSize.width,drawingBufferSize.height);pass.initialize(renderer,renderer.context.getContextAttributes().alpha);if(index!==undefined){this.passes.splice(index,0,pass);}else{this.passes.push(pass);}}/** * Removes a pass. * * @param {Pass} pass - The pass. */},{key:"removePass",value:function removePass(pass){this.passes.splice(this.passes.indexOf(pass),1);}/** * Renders all enabled passes in the order in which they were added. * * @param {Number} delta - The time between the last frame and the current one in seconds. */},{key:"render",value:function render(delta){var passes=this.passes;var copyPass=this.copyPass;var renderer=this.renderer;var inputBuffer=this.inputBuffer;var outputBuffer=this.outputBuffer;var stencilTest=false;var pass,context,state,buffer;var i,l;for(i=0,l=passes.length;i2&&arguments[2]!==undefined?arguments[2]:true;if(object[method])return;if(showWarn)console.warn("@PostProcessorModule: pass.".concat(method,"() was not found."),object);object[method]=function(){};};/** * @class PostProcessorModule * @category modules/app * @param {Object} [params] * @memberof module:modules/app * @example Creating a rendering module and passing it to App's modules * new App([ * new ElementModule(), * new SceneModule(), * new DefineModule('camera', new WHS.PerspectiveCamera({ * position: new THREE.Vector3(0, 6, 18), * far: 10000 * })), * new RenderingModule(), * new PostProcessorModule() * ]); * * const processor = app.use('postprocessor'); * * processor * .render() * .pass(new GlitchPass()) * .renderToScreen() */var PostProcessorModule=/*#__PURE__*/function(){function PostProcessorModule(){var _this=this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:PostProcessorModule.defaults;classCallCheck(this,PostProcessorModule);defineProperty$3(defineProperty$3(this,"currentPass",null),"defer",new Promise(function(resolve){_this.resolve=resolve;}));this.debug=params.debug;this.params=params;}createClass(PostProcessorModule,[{key:"manager",value:function manager(_manager){var _this2=this;_manager.define('postprocessor');this.effects=_manager.use('rendering').effects;this.renderer=_manager.get('renderer');this.scene=_manager.get('scene');this.camera=_manager.get('camera');this.composer=new EffectComposer(this.renderer,this.params);_manager.use('rendering').stop();var composer=this.composer;this.renderLoop=new Loop(function(clock){return composer.render(clock.getDelta());}).start(_manager.handler);_manager.update({renderer:function renderer(_renderer){_this2.composer.replaceRenderer(_renderer);},scene:function scene(_scene){_this2.scene=_scene;},camera:function camera(_camera){_this2.camera=_camera;}});this.resolve();}/** * @method render * @description Adds RenderPass * @return {this} * @memberof module:modules/app.PostProcessorModule */},{key:"render",value:function render(){var _this3=this;this.defer.then(function(){var pass=new RenderPass(_this3.scene,_this3.camera.native);// TODO: Support for effects. _this3.composer.addPass(pass);_this3.currentPass=pass;});return this;}/** * @method pass * @description Adds your custom pass * @param {Pass} pass A custom pass * @return {this} * @memberof module:modules/app.PostProcessorModule */},{key:"pass",value:function pass(_pass){var _this4=this;this.defer.then(function(){polyfill(_pass,'setSize',_this4.debug);polyfill(_pass,'initialise',_this4.debug);_this4.composer.addPass(_pass);_this4.currentPass=_pass;});return this;}/** * @method shader * @description Adds a pass made from shader material * @param {Material} material A ShaderMaterial * @param {String} textureID Name of the readBuffer uniform * @return {this} * @memberof module:modules/app.PostProcessorModule */},{key:"shader",value:function shader(material){var _this5=this;var textureID=arguments.length>1&&arguments[1]!==undefined?arguments[1]:'readBuffer';this.defer.then(function(){if(!material.uniforms[textureID])material.uniforms[textureID]={value:null};var pass=new ShaderPass(material,textureID);_this5.composer.addPass(pass);_this5.currentPass=pass;});return this;}/** * @method get * @description Returns a pass by the given name * @param {String} name The name of the pass * @return {this} * @memberof module:modules/app.PostProcessorModule */},{key:"get",value:function get(name){return name?this.composer.passes.filter(function(pass){return pass.name===name;})[0]:this.currentPass;}/** * @method renderToScreen * @description Sets the renderToScreen property of currentPass * @param {String} [name=true] The name of the pass * @return {this} * @memberof module:modules/app.PostProcessorModule */},{key:"renderToScreen",value:function renderToScreen(){var _this6=this;var bool=arguments.length>0&&arguments[0]!==undefined?arguments[0]:true;this.defer.then(function(){_this6.currentPass.renderToScreen=bool;});return this;}}]);return PostProcessorModule;}();defineProperty$3(PostProcessorModule,"defaults",{debug:true});/** * @class EventsPatchModule * @description This one is used in the core to handle events used by modules. If you want to make custom events - please make a similar one. * @category modules/app * @memberof module:modules/app */var EventsPatchModule=/*#__PURE__*/function(){function EventsPatchModule(){classCallCheck(this,EventsPatchModule);}createClass(EventsPatchModule,[{key:"manager",value:function manager(_manager){_manager.define('events');this.element=_manager.get('renderer').domElement;}/** * @function patchEvents * @description This methods patches the list of events on specific object. * @param {Number} originObject - The object that gives events. * @param {Number} [destObject=this] - The object that takes events. * @param {Array[Strings]} [events=[]] - The list of events by names. * @memberof module:modules/app.EventsPatchModule */},{key:"patchEvents",value:function patchEvents(originObject){var destObject=arguments.length>1&&arguments[1]!==undefined?arguments[1]:this;var events=arguments.length>2&&arguments[2]!==undefined?arguments[2]:[];events.forEach(function(event){return originObject.addEventListener(event,function(e){return destObject.emit(event,e);});});}},{key:"integrate",value:function integrate(self){var element=self.element,patchEvents=self.patchEvents;patchEvents(element,this,['mousemove','mouseup','contextmenu','mousedown','click','wheel','touchstart','touchend','touchmove','keydown','keyup','keypress']);}}]);return EventsPatchModule;}();/** * @class VirtualMouseModule * @category modules/app * @param {Boolean} [globalMovement=false] * @memberof module:modules/app * @extends Events */var VirtualMouseModule=/*#__PURE__*/function(_Events){function VirtualMouseModule(){var _this;var globalMovement=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;classCallCheck(this,VirtualMouseModule);_this=possibleConstructorReturn(this,getPrototypeOf$2(VirtualMouseModule).call(this));defineProperty$3(defineProperty$3(defineProperty$3(defineProperty$3(defineProperty$3(assertThisInitialized(assertThisInitialized(_this)),"mouse",new Vector2()),"raycaster",new Raycaster()),"world",null),"canvas",null),"projectionPlane",new Plane(new Vector3(0,0,1),0));_this.globalMovement=globalMovement;return _this;}createClass(VirtualMouseModule,[{key:"update",value:function update(e,customX,customY){var rect=this.canvas.getBoundingClientRect();var x=customX||e.clientX;var y=customY||e.clientY;this.mouse.x=(x-rect.left)/(rect.right-rect.left)*2-1;this.mouse.y=-((y-rect.top)/(rect.bottom-rect.top))*2+1;this.projectionPlane.normal.copy(this.camera.getWorldDirection());this.raycaster.setFromCamera(this.mouse,this.camera);this.emit('move');}},{key:"manager",value:function manager(_manager){_manager.define('mouse');_manager.require('events',function(){return new EventsPatchModule();});this.canvas=_manager.get('renderer').domElement;this.camera=_manager.get('camera').native;}},{key:"integrate",value:function integrate(self){var _this2=this;['click','mousedown','mouseup','mousemove'].forEach(function(ev){return _this2.on(ev,function(e){return self.emit(ev,e);});});self.globalX=0;self.globalY=0;this.on('mousemove',function(e){if(document.pointerLockElement!==null){self.globalX+=e.movementX;self.globalY+=e.movementY;self.update(e,self.globalX,self.globalY);}else self.update(e);});}/** * @method track * @description Starts tracking events on a component * @param {Component} component A component, that should be tracked by the mouse * @param {Boolean} nested Whether component's children should be tracked or not * @memberof module:modules/app.VirtualMouseModule */},{key:"track",value:function track(component){var _this3=this;var nested=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;var isHovered=false;this.on('move',function(){if(_this3.hovers(component,nested)){if(isHovered)component.emit('mousemove');else{component.emit('mouseover');isHovered=true;}}else if(isHovered){component.emit('mouseout');isHovered=false;}});this.on('click',function(){if(isHovered)component.emit('click');else component.emit('offClick');});this.on('mousedown',function(){if(isHovered)component.emit('mousedown');});this.on('mouseup',function(){if(isHovered)component.emit('mouseup');});}/** * @method intersection * @description Returns an intersection data * @param {Component} component A component that intersects with mouse ray (or doesn't) * @param {Boolean} nested Whether component's children should be tracked or not * @return {Array} intersection data. * @memberof module:modules/app.VirtualMouseModule */},{key:"intersection",value:function intersection(_ref){var native=_ref.native;var nested=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;if(native.children.length>0&&nested){var objects=[];native.traverse(function(child){return objects.push(child);});return this.raycaster.intersectObjects(objects);}return this.raycaster.intersectObject(native);}/** * @method project * @description Returns a vector based on mouse ray intersection with plane * @param {THREE.Plane} [plane=this.projectionPlane] Math plane that is used * @param {Vector3} [target] Optional target * @return {Vector3} An intersection point. * @memberof module:modules/app.VirtualMouseModule */},{key:"project",value:function project(){var plane=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.projectionPlane;var target=arguments.length>1?arguments[1]:undefined;return this.raycaster.ray.intersectPlane(plane,target);}/** * @method hovers * @description Returns a boolean based on intersection data (Whether mouse hovers the component) * @param {Component} component A component that intersects with mouse ray (or doesn't) * @param {Boolean} nested Whether component's children should be tracked or not * @return {Boolean} Whether the component is hovered. * @memberof module:modules/app.VirtualMouseModule */},{key:"hovers",value:function hovers(component){var nested=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;return this.intersection(component,nested).length>0;}/** * Mouse ray * @member {THREE.Ray} module:modules/app.VirtualMouseModule#ray * @public */},{key:"ray",get:function get(){return this.raycaster.ray;}/** * Mouse x [-1; 1] * @member {Number} module:modules/app.VirtualMouseModule#x * @public */},{key:"x",get:function get(){return this.mouse.x;}/** * Mouse y [-1; 1] * @member {Number} module:modules/app.VirtualMouseModule#y * @public */},{key:"y",get:function get(){return this.mouse.y;}}]);inherits(VirtualMouseModule,_Events);return VirtualMouseModule;}(minivents_commonjs);/** * @class ControlsModule * @category modules/app * @param {Object} [params] * @memberof module:modules/app * @example Creating a rendering module and passing it to App's modules * new App([ * new ElementModule(), * new SceneModule(), * new DefineModule('camera', new WHS.PerspectiveCamera({ * position: new THREE.Vector3(0, 6, 18), * far: 10000 * })), * new RenderingModule(), * new ControlsModule.from(new THREE.TrackballControls()) * ]); */var ControlsModule=/*#__PURE__*/function(){createClass(ControlsModule,null,[{key:"from",value:function from(controls){return new ControlsModule({controls:controls});}}]);function ControlsModule(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,ControlsModule);this.params=Object.assign({controls:false,fix:function fix(controls){return controls;},update:function update(c){this.controls.update(c.getDelta());}},params);this.controls=this.params.controls;this.update=this.params.update;}createClass(ControlsModule,[{key:"manager",value:function manager(_manager){_manager.define('controls');_manager.require('events',function(){return new EventsPatchModule();});}/** * @method setControls * @description Set working controls * @param {Object} controls Working three.js controls object. * @return {this} * @memberof module:modules/app.ControlsModule */},{key:"setControls",value:function setControls(controls){this.controls=controls;return this;}/** * @method setUpdate * @description Set controls update function * @param {Function} update Update function * @return {this} * @memberof module:modules/app.ControlsModule */},{key:"setUpdate",value:function setUpdate(update){this.update=update;return this;}},{key:"integrate",value:function integrate(self){self.updateLoop=new Loop(self.update.bind(self));self.updateLoop.start(this);}}]);return ControlsModule;}();/** * @class FogModule * @category modules/app * @param {Object} [params={color: 0xefd1b5, density: 0.020, near: 10, far: 1000}] - The parameters object. * @param {String} [type=exp2] - The type of fog - exp2 or linear * @memberof module:modules/app * @example How to create and apply a FogModule * const fogModule = new FogModule({ * color: 0xffffff, * density: 0.03, * near: 20, * far: 200 * }, 'exp2'); * * new App([ * ..., * fogModule * ]); */var FogModule=/*#__PURE__*/function(){function FogModule(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var type=arguments.length>1?arguments[1]:undefined;classCallCheck(this,FogModule);this.params=Object.assign({color:0xefd1b5,density:0.020,near:10,far:1000},params);if(!type||type==='exp2')this.fog=new FogExp2(this.params.color,this.params.density);else if(type==='linear')this.fog=new Fog(this.params.color,this.params.near,this.params.far);}createClass(FogModule,[{key:"manager",value:function manager(_manager){_manager.set('fog',this.fog);_manager.get('scene').fog=this.fog;}}]);return FogModule;}();var isEqualDefault=function isEqualDefault(a,b){if(a===b)return true;else if(a&&a.equals&&a.equals(b))return true;return false;};/** * @class StateModule * @description `StateModule` is useful for apps, where you need state manipulation. * This can be: _transitions between screens, games, development moments_. * You can check [basic/state](https://whs-dev.surge.sh/examples/?basic/state) example. * @category modules/app * @param {Object} [params] * @memberof module:modules/app * @example Creating a state module * new App([ * // ... * new StateModule().default({ * sphereColor: 0xff0000 * }) * ]); */var StateModule=/*#__PURE__*/function(){createClass(StateModule,null,[{key:"actionGenerate",value:function actionGenerate(isEqual){return function(){var state=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[{},''];var _ref=arguments.length>1?arguments[1]:undefined,key=_ref.key,data=_ref.data;if(isEqual(state[0][key],data))return state;state[0][key]=data;state[1]=key;return state;};}}]);function StateModule(){var equalCheck=arguments.length>0&&arguments[0]!==undefined?arguments[0]:isEqualDefault;classCallCheck(this,StateModule);this.store=createStore(StateModule.actionGenerate(equalCheck));this.configuration={};this.currentConfig='default';this.prevConfig='default';}/** * @method default * @description Add default configuration. * @param {Object} data Configuration setup * @memberof module:modules/app.StateModule * @example * new WHS.StateModule().default({ * sphereColor: UTILS.$colors.mesh, * planeColor: 0x447F8B * }) */createClass(StateModule,[{key:"default",value:function _default(data){this.config({default:data});return this;}/** * @method setEqualCheck * @description Sets an equalCheck function * @param {Function} func function to generate equal check * @memberof module:modules/app.StateModule */},{key:"setEqualCheck",value:function setEqualCheck(func){this.store.replaceReducer(StateModule.actionGenerate(func));}},{key:"manager",value:function manager(_manager){_manager.define('state');}/** * @method config * @description Load configurations from object. * @param {Object} configs Configuration data * @memberof module:modules/app.StateModule * @example Adding `green` configuration * state.config({ * green: { * sphereColor: 0x00ff00, * planeColor: 0x00ff00 * } * }); */},{key:"config",value:function config(configs){for(var key in configs){if(key){this.configuration[key]=key==='default'?configs[key]:Object.assign({},this.configuration.default,configs[key]);}}}/** * @method update * @description Load updates from object. * @param {Object} updates Updates data * @memberof module:modules/app.StateModule * @example Update callback for `sphereColor` * state.update({ * sphereColor: color => sphere.material.color.setHex(color) * }); */},{key:"update",value:function update(){var _this=this;var updates=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};this.store.subscribe(function(){var _this$store$getState=_this.store.getState(),_this$store$getState2=slicedToArray(_this$store$getState,2),data=_this$store$getState2[0],changedKey=_this$store$getState2[1];var callback=updates[changedKey];if(callback)callback(data[changedKey]);});}/** * @method to * @description Switch to configuration. * @param {String} configName Configuration name. * @memberof module:modules/app.StateModule * @example Changes configuration to `green` * state.to('green'); */},{key:"to",value:function to(configName){this.prevConfig=this.currentConfig;this.currentConfig=configName;var config=this.configuration[configName]?this.configuration[configName]:this.configuration.default;this.set(config);}/** * @method set * @description Set current parameters. * @param {Object} data Configuration parameters. * @memberof module:modules/app.StateModule * @example * state.set({ * sphereColor: 0x00ff00 * }); */},{key:"set",value:function set(data){for(var key in data){if(key)this.store.dispatch({type:'ADD',key:key,data:data[key]});}}/** * @method get * @description Return data of parameter. * @param {String} key Parameter name. * @memberof module:modules/app.StateModule * @example * state.get('sphereColor'); // 0x00ff00 */},{key:"get",value:function get(key){return this.store.getState()[0][key];}/** * @method prev * @description Return `trueVal` if `config` match previous configuration, in other case - return `falseVal`. * @param {String} config Configuration name. * @param {Any} trueVal Value returned if condition is truthy. * @param {Any} falseVal Value returned if condition is falsy. * @memberof module:modules/app.StateModule */},{key:"prev",value:function prev(config,trueVal,falseVal){return this.prevConfig===config?trueVal:falseVal;}/** * @method current * @description Return `trueVal` if `config` match current configuration, in other case - return `falseVal`. * @param {String} config Configuration name. * @param {Any} trueVal Value returned if condition is truthy. * @param {Any} falseVal Value returned if condition is falsy. * @memberof module:modules/app.StateModule */},{key:"current",value:function current(config,trueVal,falseVal){return this.currentConfig===config?trueVal:falseVal;}}]);return StateModule;}();// Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default). // // Orbit - left mouse / touch: one finger move // Zoom - middle mouse, or mousewheel / touch: two finger spread or squish // Pan - right mouse, or arrow keys / touch: three finter swipe var ThreeOrbitControls=/*#__PURE__*/function(_EventDispatcher){function ThreeOrbitControls(object,domElement,eventHandler){var _this;classCallCheck(this,ThreeOrbitControls);_this=possibleConstructorReturn(this,getPrototypeOf$2(ThreeOrbitControls).call(this));_this.object=object;_this.domElement=domElement===undefined?document:domElement;_this.eventHandler=eventHandler;// Set to false to disable this control _this.enabled=true;// "target" sets the location of focus, where the object orbits around _this.target=new Vector3();// How far you can dolly in and out ( PerspectiveCamera only ) _this.minDistance=0;_this.maxDistance=Infinity;// How far you can zoom in and out ( OrthographicCamera only ) _this.minZoom=0;_this.maxZoom=Infinity;// How far you can orbit vertically, upper and lower limits. // Range is 0 to Math.PI radians. _this.minPolarAngle=0;// radians _this.maxPolarAngle=Math.PI;// radians // How far you can orbit horizontally, upper and lower limits. // If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ]. _this.minAzimuthAngle=-Infinity;// radians _this.maxAzimuthAngle=Infinity;// radians // Set to true to enable damping (inertia) // If damping is enabled, you must call controls.update() in your animation loop _this.enableDamping=false;_this.dampingFactor=0.25;// This option actually enables dollying in and out; left as "zoom" for backwards compatibility. // Set to false to disable zooming _this.enableZoom=true;_this.zoomSpeed=1.0;// Set to false to disable rotating _this.enableRotate=true;_this.rotateSpeed=1.0;// Set to false to disable panning _this.enablePan=true;_this.keyPanSpeed=7.0;// pixels moved per arrow key push // Set to true to automatically rotate around the target // If auto-rotate is enabled, you must call controls.update() in your animation loop _this.autoRotate=false;_this.autoRotateSpeed=2.0;// 30 seconds per round when fps is 60 // Set to false to disable use of the keys _this.enableKeys=true;// The four arrow keys _this.keys={LEFT:37,UP:38,RIGHT:39,BOTTOM:40};// Mouse buttons _this.mouseButtons={ORBIT:MOUSE.LEFT,ZOOM:MOUSE.MIDDLE,PAN:MOUSE.RIGHT};// for reset _this.target0=_this.target.clone();_this.position0=_this.object.position.clone();_this.zoom0=_this.object.zoom;// // public methods // _this.getPolarAngle=function(){return spherical.phi;};_this.getAzimuthalAngle=function(){return spherical.theta;};_this.reset=function(){_this.target.copy(_this.target0);_this.object.position.copy(_this.position0);_this.object.zoom=_this.zoom0;_this.object.updateProjectionMatrix();_this.dispatchEvent(changeEvent);_this.update();state=STATE.NONE;};// this method is exposed, but perhaps it would be better if we can make it private... _this.update=function(){var offset=new Vector3();// so camera.up is the orbit axis var quat=new Quaternion().setFromUnitVectors(object.up,new Vector3(0,1,0));var quatInverse=quat.clone().inverse();var lastPosition=new Vector3();var lastQuaternion=new Quaternion();return function(){var position=_this.object.position;offset.copy(position).sub(_this.target);// rotate offset to "y-axis-is-up" space offset.applyQuaternion(quat);// angle from z-axis around y-axis spherical.setFromVector3(offset);if(_this.autoRotate&&state===STATE.NONE)rotateLeft(getAutoRotationAngle());spherical.theta+=sphericalDelta.theta;spherical.phi+=sphericalDelta.phi;// restrict theta to be between desired limits spherical.theta=Math.max(_this.minAzimuthAngle,Math.min(_this.maxAzimuthAngle,spherical.theta));// restrict phi to be between desired limits spherical.phi=Math.max(_this.minPolarAngle,Math.min(_this.maxPolarAngle,spherical.phi));spherical.makeSafe();spherical.radius*=scale;// restrict radius to be between desired limits spherical.radius=Math.max(_this.minDistance,Math.min(_this.maxDistance,spherical.radius));// move target to panned location _this.target.add(panOffset);offset.setFromSpherical(spherical);// rotate offset back to "camera-up-vector-is-up" space offset.applyQuaternion(quatInverse);position.copy(_this.target).add(offset);_this.object.lookAt(_this.target);if(_this.enableDamping===true){sphericalDelta.theta*=1-_this.dampingFactor;sphericalDelta.phi*=1-_this.dampingFactor;}else sphericalDelta.set(0,0,0);scale=1;panOffset.set(0,0,0);// update condition is: // min(camera displacement, camera rotation in radians)^2 > EPS // using small-angle approximation cos(x/2) = 1 - x^2 / 8 if(zoomChanged||lastPosition.distanceToSquared(_this.object.position)>EPS||8*(1-lastQuaternion.dot(_this.object.quaternion))>EPS){_this.dispatchEvent(changeEvent);lastPosition.copy(_this.object.position);lastQuaternion.copy(_this.object.quaternion);zoomChanged=false;return true;}return false;}();};_this.dispose=function(){_this.domElement.removeEventListener('contextmenu',onContextMenu,false);_this.domElement.removeEventListener('mousedown',onMouseDown,false);_this.domElement.removeEventListener('wheel',onMouseWheel,false);_this.domElement.removeEventListener('touchstart',onTouchStart,false);_this.domElement.removeEventListener('touchend',onTouchEnd,false);_this.domElement.removeEventListener('touchmove',onTouchMove,false);document.removeEventListener('mousemove',onMouseMove,false);document.removeEventListener('mouseup',onMouseUp,false);window.removeEventListener('keydown',onKeyDown,false);// this.dispatchEvent( { type: 'dispose' } ); // should this be added here? };// // internals // var changeEvent={type:'change'};var startEvent={type:'start'};var endEvent={type:'end'};var STATE={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_DOLLY:4,TOUCH_PAN:5};var state=STATE.NONE;var EPS=0.000001;// current position in spherical coordinates var spherical=new Spherical();var sphericalDelta=new Spherical();var scale=1;var panOffset=new Vector3();var zoomChanged=false;var rotateStart=new Vector2();var rotateEnd=new Vector2();var rotateDelta=new Vector2();var panStart=new Vector2();var panEnd=new Vector2();var panDelta=new Vector2();var dollyStart=new Vector2();var dollyEnd=new Vector2();var dollyDelta=new Vector2();var getAutoRotationAngle=function getAutoRotationAngle(){return 2*Math.PI/60/60*_this.autoRotateSpeed;};var getZoomScale=function getZoomScale(){return Math.pow(0.95,_this.zoomSpeed);};var rotateLeft=function rotateLeft(angle){sphericalDelta.theta-=angle;};var rotateUp=function rotateUp(angle){sphericalDelta.phi-=angle;};var panLeft=function(){var v=new Vector3();return function(distance,objectMatrix){v.setFromMatrixColumn(objectMatrix,0);// get X column of objectMatrix v.multiplyScalar(-distance);panOffset.add(v);};}();var panUp=function(){var v=new Vector3();return function(distance,objectMatrix){v.setFromMatrixColumn(objectMatrix,1);// get Y column of objectMatrix v.multiplyScalar(distance);panOffset.add(v);};}();// deltaX and deltaY are in pixels; right and down are positive var pan=function(){var offset=new Vector3();return function(deltaX,deltaY){var element=_this.domElement===document?_this.domElement.body:_this.domElement;if(_this.object instanceof PerspectiveCamera){// perspective var position=_this.object.position;offset.copy(position).sub(_this.target);var targetDistance=offset.length();// half of the fov is center to top of screen targetDistance*=Math.tan(_this.object.fov/2*Math.PI/180.0);// we actually don't use screenWidth, since perspective camera is fixed to screen height panLeft(2*deltaX*targetDistance/element.clientHeight,_this.object.matrix);panUp(2*deltaY*targetDistance/element.clientHeight,_this.object.matrix);}else if(_this.object instanceof OrthographicCamera){// orthographic panLeft(deltaX*(_this.object.right-_this.object.left)/_this.object.zoom/element.clientWidth,_this.object.matrix);panUp(deltaY*(_this.object.top-_this.object.bottom)/_this.object.zoom/element.clientHeight,_this.object.matrix);}else{// camera neither orthographic nor perspective console.warn('WARNING: OrbitControlsModule.js encountered an unknown camera type - pan disabled.');_this.enablePan=false;}};}();var dollyIn=function dollyIn(dollyScale){if(_this.object instanceof PerspectiveCamera)scale/=dollyScale;else if(_this.object instanceof OrthographicCamera){_this.object.zoom=Math.max(_this.minZoom,Math.min(_this.maxZoom,_this.object.zoom*dollyScale));_this.object.updateProjectionMatrix();zoomChanged=true;}else{console.warn('WARNING: OrbitControlsModule.js encountered an unknown camera type - dolly/zoom disabled.');_this.enableZoom=false;}};var dollyOut=function dollyOut(dollyScale){if(_this.object instanceof PerspectiveCamera)scale*=dollyScale;else if(_this.object instanceof OrthographicCamera){_this.object.zoom=Math.max(_this.minZoom,Math.min(_this.maxZoom,_this.object.zoom/dollyScale));_this.object.updateProjectionMatrix();zoomChanged=true;}else{console.warn('WARNING: OrbitControlsModule.js encountered an unknown camera type - dolly/zoom disabled.');_this.enableZoom=false;}};// // event callbacks - update the object state // var handleMouseDownRotate=function handleMouseDownRotate(event){// console.log( 'handleMouseDownRotate' ); rotateStart.set(event.clientX,event.clientY);};var handleMouseDownDolly=function handleMouseDownDolly(event){// console.log( 'handleMouseDownDolly' ); dollyStart.set(event.clientX,event.clientY);};var handleMouseDownPan=function handleMouseDownPan(event){// console.log( 'handleMouseDownPan' ); panStart.set(event.clientX,event.clientY);};var handleMouseMoveRotate=function handleMouseMoveRotate(event){// console.log( 'handleMouseMoveRotate' ); rotateEnd.set(event.clientX,event.clientY);rotateDelta.subVectors(rotateEnd,rotateStart);var element=_this.domElement===document?_this.domElement.body:_this.domElement;// rotating across whole screen goes 360 degrees around rotateLeft(2*Math.PI*rotateDelta.x/element.clientWidth*_this.rotateSpeed);// rotating up and down along whole screen attempts to go 360, but limited to 180 rotateUp(2*Math.PI*rotateDelta.y/element.clientHeight*_this.rotateSpeed);rotateStart.copy(rotateEnd);_this.update();};var handleMouseMoveDolly=function handleMouseMoveDolly(event){// console.log( 'handleMouseMoveDolly' ); dollyEnd.set(event.clientX,event.clientY);dollyDelta.subVectors(dollyEnd,dollyStart);if(dollyDelta.y>0)dollyIn(getZoomScale());else if(dollyDelta.y<0)dollyOut(getZoomScale());dollyStart.copy(dollyEnd);_this.update();};var handleMouseMovePan=function handleMouseMovePan(event){// console.log( 'handleMouseMovePan' ); panEnd.set(event.clientX,event.clientY);panDelta.subVectors(panEnd,panStart);pan(panDelta.x,panDelta.y);panStart.copy(panEnd);_this.update();};var handleMouseWheel=function handleMouseWheel(event){// console.log( 'handleMouseWheel' ); if(event.deltaY<0)dollyOut(getZoomScale());else if(event.deltaY>0)dollyIn(getZoomScale());_this.update();};var handleKeyDown=function handleKeyDown(event){// console.log( 'handleKeyDown' ); switch(event.keyCode){case _this.keys.UP:pan(0,_this.keyPanSpeed);_this.update();break;case _this.keys.BOTTOM:pan(0,-_this.keyPanSpeed);_this.update();break;case _this.keys.LEFT:pan(_this.keyPanSpeed,0);_this.update();break;case _this.keys.RIGHT:pan(-_this.keyPanSpeed,0);_this.update();break;}};var handleTouchStartRotate=function handleTouchStartRotate(event){// console.log( 'handleTouchStartRotate' ); rotateStart.set(event.touches[0].pageX,event.touches[0].pageY);};var handleTouchStartDolly=function handleTouchStartDolly(event){// console.log( 'handleTouchStartDolly' ); var dx=event.touches[0].pageX-event.touches[1].pageX;var dy=event.touches[0].pageY-event.touches[1].pageY;var distance=Math.sqrt(dx*dx+dy*dy);dollyStart.set(0,distance);};var handleTouchStartPan=function handleTouchStartPan(event){// console.log( 'handleTouchStartPan' ); panStart.set(event.touches[0].pageX,event.touches[0].pageY);};var handleTouchMoveRotate=function handleTouchMoveRotate(event){// console.log( 'handleTouchMoveRotate' ); rotateEnd.set(event.touches[0].pageX,event.touches[0].pageY);rotateDelta.subVectors(rotateEnd,rotateStart);var element=_this.domElement===document?_this.domElement.body:_this.domElement;// rotating across whole screen goes 360 degrees around rotateLeft(2*Math.PI*rotateDelta.x/element.clientWidth*_this.rotateSpeed);// rotating up and down along whole screen attempts to go 360, but limited to 180 rotateUp(2*Math.PI*rotateDelta.y/element.clientHeight*_this.rotateSpeed);rotateStart.copy(rotateEnd);_this.update();};var handleTouchMoveDolly=function handleTouchMoveDolly(event){// console.log( 'handleTouchMoveDolly' ); var dx=event.touches[0].pageX-event.touches[1].pageX;var dy=event.touches[0].pageY-event.touches[1].pageY;var distance=Math.sqrt(dx*dx+dy*dy);dollyEnd.set(0,distance);dollyDelta.subVectors(dollyEnd,dollyStart);if(dollyDelta.y>0)dollyOut(getZoomScale());else if(dollyDelta.y<0)dollyIn(getZoomScale());dollyStart.copy(dollyEnd);_this.update();};var handleTouchMovePan=function handleTouchMovePan(event){// console.log( 'handleTouchMovePan' ); panEnd.set(event.touches[0].pageX,event.touches[0].pageY);panDelta.subVectors(panEnd,panStart);pan(panDelta.x,panDelta.y);panStart.copy(panEnd);_this.update();};// event handlers - FSM: listen for events and reset state // var onMouseDown=function onMouseDown(event){if(_this.enabled===false)return;event.preventDefault();if(event.button===_this.mouseButtons.ORBIT){if(_this.enableRotate===false)return;handleMouseDownRotate(event);state=STATE.ROTATE;}else if(event.button===_this.mouseButtons.ZOOM){if(_this.enableZoom===false)return;handleMouseDownDolly(event);state=STATE.DOLLY;}else if(event.button===_this.mouseButtons.PAN){if(_this.enablePan===false)return;handleMouseDownPan(event);state=STATE.PAN;}if(state!==STATE.NONE){_this.eventHandler.on('mousemove',onMouseMove,false);_this.eventHandler.on('mouseup',onMouseUp,false);_this.dispatchEvent(startEvent);}};var onMouseMove=function onMouseMove(event){if(_this.enabled===false)return;event.preventDefault();if(state===STATE.ROTATE){if(_this.enableRotate===false)return;handleMouseMoveRotate(event);}else if(state===STATE.DOLLY){if(_this.enableZoom===false)return;handleMouseMoveDolly(event);}else if(state===STATE.PAN){if(_this.enablePan===false)return;handleMouseMovePan(event);}};var onMouseUp=function onMouseUp(event){if(_this.enabled===false)return;document.removeEventListener('mousemove',onMouseMove,false);document.removeEventListener('mouseup',onMouseUp,false);_this.dispatchEvent(endEvent);state=STATE.NONE;};var onMouseWheel=function onMouseWheel(event){if(_this.enabled===false||_this.enableZoom===false||state!==STATE.NONE&&state!==STATE.ROTATE)return;event.preventDefault();event.stopPropagation();handleMouseWheel(event);_this.dispatchEvent(startEvent);// not sure why these are here... _this.dispatchEvent(endEvent);};var onKeyDown=function onKeyDown(event){if(_this.enabled===false||_this.enableKeys===false||_this.enablePan===false)return;handleKeyDown(event);};var onTouchStart=function onTouchStart(event){if(_this.enabled===false)return;switch(event.touches.length){case 1:// one-fingered touch: rotate if(_this.enableRotate===false)return;handleTouchStartRotate(event);state=STATE.TOUCH_ROTATE;break;case 2:// two-fingered touch: dolly if(_this.enableZoom===false)return;handleTouchStartDolly(event);state=STATE.TOUCH_DOLLY;break;case 3:// three-fingered touch: pan if(_this.enablePan===false)return;handleTouchStartPan(event);state=STATE.TOUCH_PAN;break;default:state=STATE.NONE;}if(state!==STATE.NONE)_this.dispatchEvent(startEvent);};var onTouchMove=function onTouchMove(event){if(_this.enabled===false)return;event.preventDefault();event.stopPropagation();switch(event.touches.length){case 1:// one-fingered touch: rotate if(_this.enableRotate===false)return;if(state!==STATE.TOUCH_ROTATE)return;// is this needed?... handleTouchMoveRotate(event);break;case 2:// two-fingered touch: dolly if(_this.enableZoom===false)return;if(state!==STATE.TOUCH_DOLLY)return;// is this needed?... handleTouchMoveDolly(event);break;case 3:// three-fingered touch: pan if(_this.enablePan===false)return;if(state!==STATE.TOUCH_PAN)return;// is this needed?... handleTouchMovePan(event);break;default:state=STATE.NONE;}};var onTouchEnd=function onTouchEnd(event){if(_this.enabled===false)return;_this.dispatchEvent(endEvent);state=STATE.NONE;};var onContextMenu=function onContextMenu(event){event.preventDefault();};// _this.eventHandler.on('contextmenu',onContextMenu,false);_this.eventHandler.on('mousedown',onMouseDown,false);_this.eventHandler.on('wheel',onMouseWheel,false);_this.eventHandler.on('touchstart',onTouchStart,false);_this.eventHandler.on('touchend',onTouchEnd,false);_this.eventHandler.on('touchmove',onTouchMove,false);_this.eventHandler.on('keydown',onKeyDown,false);// force an update at start _this.update();return _this;}createClass(ThreeOrbitControls,[{key:"center",get:function get(){console.warn('OrbitControls: .center has been renamed to .target');return this.target;}},{key:"noZoom",get:function get(){console.warn('OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');return !this.enableZoom;},set:function set(value){console.warn('OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');this.enableZoom=!value;}},{key:"noRotate",get:function get(){console.warn('OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.');return !this.enableRotate;},set:function set(value){console.warn('OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.');this.enableRotate=!value;}},{key:"noPan",get:function get(){console.warn('OrbitControls: .noPan has been deprecated. Use .enablePan instead.');return !this.enablePan;},set:function set(value){console.warn('OrbitControls: .noPan has been deprecated. Use .enablePan instead.');this.enablePan=!value;}},{key:"noKeys",get:function get(){console.warn('OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');return !this.enableKeys;},set:function set(value){console.warn('OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');this.enableKeys=!value;}},{key:"staticMoving",get:function get(){console.warn('OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.');return !this.enableDamping;},set:function set(value){console.warn('OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.');this.enableDamping=!value;}},{key:"dynamicDampingFactor",get:function get(){console.warn('OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.');return this.dampingFactor;},set:function set(value){console.warn('OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.');this.dampingFactor=value;}}]);inherits(ThreeOrbitControls,_EventDispatcher);return ThreeOrbitControls;}(EventDispatcher);/** * @class OrbitControlsModule * @category modules/app * @param {Object} [params] * @param {Object} [params.object=camera] Object to which controls are applied. * @param {THREE.Vector3} [params.target=new Vector3()] Controls center vector. * @param {Boolean} [params.follow=false] Follow the target * @memberof module:modules/app * @example Creating a rendering module and passing it to App's modules * new App([ * new ElementModule(), * new SceneModule(), * new DefineModule('camera', new WHS.PerspectiveCamera({ * position: new THREE.Vector3(0, 6, 18), * far: 10000 * })), * new RenderingModule(), * new OrbitControlsModule() * ]); */var OrbitControlsModule=/*#__PURE__*/function(_ControlsModule){function OrbitControlsModule(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,OrbitControlsModule);_this=possibleConstructorReturn(this,getPrototypeOf$2(OrbitControlsModule).call(this,params));_this.params=Object.assign({follow:false,object:null,target:new Vector3()},params);return _this;}createClass(OrbitControlsModule,[{key:"manager",value:function manager(_manager){get$3(getPrototypeOf$2(OrbitControlsModule.prototype),"manager",this).call(this,_manager);var _this$params=this.params,obj=_this$params.object,follow=_this$params.follow,target=_this$params.target;var object=obj?obj.native:_manager.get('camera').native;var controls=new ThreeOrbitControls(object,_manager.get('element'),_manager.handler);var updateProcessor=follow?function(c){controls.update(c.getDelta());controls.target.copy(target);}:function(c){controls.update(c.getDelta());};this.setControls(controls);this.setUpdate(updateProcessor);_manager.update({camera:function camera(_camera){if(obj)return;controls.object=_camera.native;},element:function element(_element){controls.domElement=_element;}});controls.target.copy(target);}}]);inherits(OrbitControlsModule,_ControlsModule);return OrbitControlsModule;}(ControlsModule);/** @module modules/app/controls */ /** @module modules/app */ /** * @class DynamicGeometryModule * @category modules/mesh * @param {Object} [params={attributes: false}] - params * @param {Boolean} [patchEvents=true] * @memberof module:modules/mesh */var DynamicGeometryModule=/*#__PURE__*/function(){function DynamicGeometryModule(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,DynamicGeometryModule);this.params=Object.assign({attributes:false},params);}createClass(DynamicGeometryModule,[{key:"integrate",value:function integrate(self){var _this=this;var params=self.params;this.g_=function(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};if(this.buildGeometry){this.native.geometry=this.buildGeometry(this.updateParams({geometry:params}));}};if(params.attributes){var _loop=function _loop(key){if(key){Object.defineProperty(_this,"g_".concat(key),{get:function get(){return this.native.geometry.parameters[key];},set:function set(value){this.native.geometry=this.buildGeometry(this.updateParams({geometry:defineProperty$3({},key,value)}));},configurable:true,enumerable:true});}};for(var key in this.params.geometry){_loop(key);}}}}]);return DynamicGeometryModule;}();var loader=new TextureLoader();/** * @class TextureModule * @category modules/mesh * @description A TextureModule can be applied to any Mesh or Model. * @param {Array} [textures] - array of texture objects * @memberof module:modules/mesh * @example Creating an instance. url takes a path, or a data object. * var woodTexture = new TextureModule({ * url: `${process.assetsPath}/textures/wood.jpg` * }); * @example More comprehensive example, wood texture applied to a Box. * new Box({ * geometry: { * width: 2, * height: 2, * depth: 2 * }, * modules: [ * new TextureModule({ * url: `path/to/texture.jpg`, * repeat: new THREE.Vector2(1, 1) // optional * }) * ], * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * position: [50, 60, 70] * }).addTo(app); */var TextureModule=/*#__PURE__*/function(){createClass(TextureModule,null,[{key:"load",value:function load(url){return new TextureModule({url:url}).textures[0][1];}}]);function TextureModule(){var _this=this;classCallCheck(this,TextureModule);defineProperty$3(defineProperty$3(this,"textures",[]),"bridge",{material:function material(_material,self){self.textures.forEach(function(texture){_material[texture[0]]=texture[1];});_material.needsUpdate=true;return _material;}});for(var _len=arguments.length,textures=new Array(_len),_key=0;_key<_len;_key++){textures[_key]=arguments[_key];}textures.forEach(function(_ref){var url=_ref.url,_ref$type=_ref.type,type=_ref$type===void 0?'map':_ref$type,_ref$offset=_ref.offset,offset=_ref$offset===void 0?new Vector2(0,0):_ref$offset,_ref$repeat=_ref.repeat,repeat=_ref$repeat===void 0?new Vector2(1,1):_ref$repeat,_ref$wrap=_ref.wrap,wrap=_ref$wrap===void 0?RepeatWrapping:_ref$wrap,_ref$mapping=_ref.mapping,mapping=_ref$mapping===void 0?UVMapping:_ref$mapping,_ref$fix=_ref.fix,fix=_ref$fix===void 0?function(tex){return tex;}:_ref$fix;var texture=loader.load(url);if(wrap.length>0){texture.wrapS=wrap[0];texture.wrapT=wrap[1];}else texture.wrapS=texture.wrapT=wrap;texture.mapping=mapping;texture.offset.copy(offset);texture.repeat.copy(repeat);texture.magFilter=NearestFilter;texture.minFilter=LinearMipMapLinearFilter;_this.textures.push([type,fix(texture)]);});}return TextureModule;}();/** * @class AnimationModule * @category modules/mesh * @description Convenience module that wraps the three.js animation system * @param {App} app - the app * @param {Boolean} [isDeferred=false] - set to true if animation should not start automatically * @param {Object} [params={speed: 1}] - the params * @memberof module:modules/mesh * @example Create animation module and play a given clip of an imported model * const animationModule = new AnimationModule(app, false, { * speed: 1.2 // speed up animation by 20% * }); * * new Importer({ * parser(geometry, materials) { * // Override parse to generate a skinnedMesh, needed for skinned models * return new THREE.SkinnedMesh(geometry, materials); * }, * * url: `path/to/model.json`, * useCustomMaterial: true, * * material: new THREE.MeshStandardMaterial({ * skinning: true * }), * * modules: [animationModule] * }).addTo(app).then(() => { * // adding model to app returns a promise, so pipe the function to kick off the animation clip * animationModule.play('clipName'); * }); */var AnimationModule=/*#__PURE__*/function(){function AnimationModule(app,isDeferred){var params=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};classCallCheck(this,AnimationModule);defineProperty$3(this,"bridge",{mesh:function mesh(_mesh,self){_mesh.geometry.skeleton=_mesh.skeleton;self.mixer=new AnimationMixer(_mesh.geometry);self.clips=_mesh.geometry.animations;return _mesh;}});this.params=Object.assign({speed:1},params);this.clock=new Clock();this.app=app;this.isDeferred=isDeferred;}/** * @method play * @instance * @description Plays the given clip name * @param {String} clipName - the clip to play * @return {THREE.AnimationAction} Playing action * @memberof module:modules/mesh.AnimationModule */createClass(AnimationModule,[{key:"play",value:function play(clipName){var clip=AnimationClip.findByName(this.clips,clipName);return this.mixer.clipAction(clip).play();}/** * @method update * @instance * @description Update the mixer (being called on frame animation loop) * @memberof module:modules/mesh.AnimationModule */},{key:"update",value:function update(){if(this.mixer)this.mixer.update(this.clock.getDelta()*this.params.speed);}},{key:"integrate",value:function integrate(self){self.loop=new Loop(function(){self.update();});if(!self.isDeferred)self.loop.start(self.app);}},{key:"manager",value:function manager(_manager){_manager.define('animation');}}]);return AnimationModule;}();/** @module modules/mesh */ /** * @class DefineModule * @category modules * @param {String} name * @param {Object} data * @memberof module:modules * @example Creating a DefineModule with PerspectiveCamera as camera module and passing it to App's modules * new App([ * // ... * new DefineModule('camera', new PerspectiveCamera()) * ]); */var DefineModule=/*#__PURE__*/function(){function DefineModule(name,data){classCallCheck(this,DefineModule);this.name=name;this.data=data;}createClass(DefineModule,[{key:"manager",value:function manager(_manager){_manager.set(this.name,this.data);}}]);return DefineModule;}();/** @module modules */var Model=/*#__PURE__*/function(_Importer){function Model(params){var _getPrototypeOf2;classCallCheck(this,Model);console.warn('Model is deprecated. Use Importer instead.');if(params.geometry){params.url=params.geometry.path;params.loader=params.geometry.loader;}for(var _len=arguments.length,additional=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++){additional[_key-1]=arguments[_key];}return possibleConstructorReturn(this,(_getPrototypeOf2=getPrototypeOf$2(Model)).call.apply(_getPrototypeOf2,[this,params].concat(additional)));}inherits(Model,_Importer);return Model;}(Importer);var CameraModule=/*#__PURE__*/function(){function CameraModule(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,CameraModule);console.warn('CameraModule is deprecated. Use DefineModule instead.');this.camera=new PerspectiveCamera$1(params);}createClass(CameraModule,[{key:"integrate",value:function integrate(self){this.add(self.camera);}},{key:"manager",value:function manager(_manager){_manager.set('camera',this.camera);}}]);return CameraModule;}(); // Polyfills if ( Number.EPSILON === undefined ) { Number.EPSILON = Math.pow( 2, - 52 ); } if ( Number.isInteger === undefined ) { // Missing in IE // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger Number.isInteger = function ( value ) { return typeof value === 'number' && isFinite( value ) && Math.floor( value ) === value; }; } // if ( Math.sign === undefined ) { // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign Math.sign = function ( x ) { return ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x; }; } if ( Function.prototype.name === undefined ) { // Missing in IE // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name Object.defineProperty( Function.prototype, 'name', { get: function () { return this.toString().match( /^\s*function\s*([^\(\s]*)/ )[ 1 ]; } } ); } if ( Object.assign === undefined ) { // Missing in IE // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign ( function () { Object.assign = function ( target ) { if ( target === undefined || target === null ) { throw new TypeError( 'Cannot convert undefined or null to object' ); } var output = Object( target ); for ( var index = 1; index < arguments.length; index ++ ) { var source = arguments[ index ]; if ( source !== undefined && source !== null ) { for ( var nextKey in source ) { if ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) { output[ nextKey ] = source[ nextKey ]; } } } } return output; }; } )(); } /** * https://github.com/mrdoob/eventdispatcher.js/ */ function EventDispatcher$1() {} Object.assign( EventDispatcher$1.prototype, { addEventListener: function ( type, listener ) { if ( this._listeners === undefined ) this._listeners = {}; var listeners = this._listeners; if ( listeners[ type ] === undefined ) { listeners[ type ] = []; } if ( listeners[ type ].indexOf( listener ) === - 1 ) { listeners[ type ].push( listener ); } }, hasEventListener: function ( type, listener ) { if ( this._listeners === undefined ) return false; var listeners = this._listeners; return listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1; }, removeEventListener: function ( type, listener ) { if ( this._listeners === undefined ) return; var listeners = this._listeners; var listenerArray = listeners[ type ]; if ( listenerArray !== undefined ) { var index = listenerArray.indexOf( listener ); if ( index !== - 1 ) { listenerArray.splice( index, 1 ); } } }, dispatchEvent: function ( event ) { if ( this._listeners === undefined ) return; var listeners = this._listeners; var listenerArray = listeners[ event.type ]; if ( listenerArray !== undefined ) { event.target = this; var array = [], i = 0; var length = listenerArray.length; for ( i = 0; i < length; i ++ ) { array[ i ] = listenerArray[ i ]; } for ( i = 0; i < length; i ++ ) { array[ i ].call( this, event ); } } } } ); var REVISION$1 = '85'; var CullFaceNone$1 = 0; var CullFaceBack$1 = 1; var CullFaceFront$1 = 2; var FrontFaceDirectionCW = 0; var PCFShadowMap$1 = 1; var PCFSoftShadowMap$1 = 2; var FrontSide$1 = 0; var BackSide$1 = 1; var DoubleSide$1 = 2; var FlatShading$1 = 1; var SmoothShading = 2; var NoColors$1 = 0; var FaceColors$1 = 1; var VertexColors$1 = 2; var NoBlending$1 = 0; var NormalBlending$1 = 1; var AdditiveBlending$1 = 2; var SubtractiveBlending$1 = 3; var MultiplyBlending$1 = 4; var CustomBlending$1 = 5; var AddEquation$1 = 100; var SubtractEquation$1 = 101; var ReverseSubtractEquation$1 = 102; var MinEquation$1 = 103; var MaxEquation$1 = 104; var ZeroFactor$1 = 200; var OneFactor$1 = 201; var SrcColorFactor$1 = 202; var OneMinusSrcColorFactor$1 = 203; var SrcAlphaFactor$1 = 204; var OneMinusSrcAlphaFactor$1 = 205; var DstAlphaFactor$1 = 206; var OneMinusDstAlphaFactor$1 = 207; var DstColorFactor$1 = 208; var OneMinusDstColorFactor$1 = 209; var SrcAlphaSaturateFactor$1 = 210; var NeverDepth$1 = 0; var AlwaysDepth$1 = 1; var LessDepth$1 = 2; var LessEqualDepth$1 = 3; var EqualDepth$1 = 4; var GreaterEqualDepth$1 = 5; var GreaterDepth$1 = 6; var NotEqualDepth$1 = 7; var MultiplyOperation$1 = 0; var MixOperation$1 = 1; var AddOperation$1 = 2; var NoToneMapping$1 = 0; var LinearToneMapping$1 = 1; var ReinhardToneMapping$1 = 2; var Uncharted2ToneMapping$1 = 3; var CineonToneMapping$1 = 4; var UVMapping$1 = 300; var CubeReflectionMapping$1 = 301; var CubeRefractionMapping$1 = 302; var EquirectangularReflectionMapping$1 = 303; var EquirectangularRefractionMapping$1 = 304; var SphericalReflectionMapping$1 = 305; var CubeUVReflectionMapping$1 = 306; var CubeUVRefractionMapping$1 = 307; var RepeatWrapping$1 = 1000; var ClampToEdgeWrapping$1 = 1001; var MirroredRepeatWrapping$1 = 1002; var NearestFilter$1 = 1003; var NearestMipMapNearestFilter$1 = 1004; var NearestMipMapLinearFilter$1 = 1005; var LinearFilter$1 = 1006; var LinearMipMapNearestFilter$1 = 1007; var LinearMipMapLinearFilter$1 = 1008; var UnsignedByteType$1 = 1009; var ByteType$1 = 1010; var ShortType$1 = 1011; var UnsignedShortType$1 = 1012; var IntType$1 = 1013; var UnsignedIntType$1 = 1014; var FloatType$1 = 1015; var HalfFloatType$1 = 1016; var UnsignedShort4444Type$1 = 1017; var UnsignedShort5551Type$1 = 1018; var UnsignedShort565Type$1 = 1019; var UnsignedInt248Type$1 = 1020; var AlphaFormat$1 = 1021; var RGBFormat$1 = 1022; var RGBAFormat$1 = 1023; var LuminanceFormat$1 = 1024; var LuminanceAlphaFormat$1 = 1025; var DepthFormat$1 = 1026; var DepthStencilFormat$1 = 1027; var RGB_S3TC_DXT1_Format$1 = 2001; var RGBA_S3TC_DXT1_Format$1 = 2002; var RGBA_S3TC_DXT3_Format$1 = 2003; var RGBA_S3TC_DXT5_Format$1 = 2004; var RGB_PVRTC_4BPPV1_Format$1 = 2100; var RGB_PVRTC_2BPPV1_Format$1 = 2101; var RGBA_PVRTC_4BPPV1_Format$1 = 2102; var RGBA_PVRTC_2BPPV1_Format$1 = 2103; var RGB_ETC1_Format$1 = 2151; var LoopOnce$1 = 2200; var LoopRepeat$1 = 2201; var LoopPingPong$1 = 2202; var InterpolateDiscrete$1 = 2300; var InterpolateLinear$1 = 2301; var InterpolateSmooth$1 = 2302; var ZeroCurvatureEnding$1 = 2400; var ZeroSlopeEnding$1 = 2401; var WrapAroundEnding$1 = 2402; var TrianglesDrawMode$1 = 0; var TriangleStripDrawMode$1 = 1; var TriangleFanDrawMode$1 = 2; var LinearEncoding$1 = 3000; var sRGBEncoding$1 = 3001; var GammaEncoding$1 = 3007; var RGBEEncoding$1 = 3002; var RGBM7Encoding$1 = 3004; var RGBM16Encoding$1 = 3005; var RGBDEncoding$1 = 3006; var BasicDepthPacking$1 = 3200; var RGBADepthPacking$1 = 3201; /** * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ */ var _Math$1 = { DEG2RAD: Math.PI / 180, RAD2DEG: 180 / Math.PI, generateUUID: function () { // http://www.broofa.com/Tools/Math.uuid.htm var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' ); var uuid = new Array( 36 ); var rnd = 0, r; return function generateUUID() { for ( var i = 0; i < 36; i ++ ) { if ( i === 8 || i === 13 || i === 18 || i === 23 ) { uuid[ i ] = '-'; } else if ( i === 14 ) { uuid[ i ] = '4'; } else { if ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0; r = rnd & 0xf; rnd = rnd >> 4; uuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ]; } } return uuid.join( '' ); }; }(), clamp: function ( value, min, max ) { return Math.max( min, Math.min( max, value ) ); }, // compute euclidian modulo of m % n // https://en.wikipedia.org/wiki/Modulo_operation euclideanModulo: function ( n, m ) { return ( ( n % m ) + m ) % m; }, // Linear mapping from range to range mapLinear: function ( x, a1, a2, b1, b2 ) { return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 ); }, // https://en.wikipedia.org/wiki/Linear_interpolation lerp: function ( x, y, t ) { return ( 1 - t ) * x + t * y; }, // http://en.wikipedia.org/wiki/Smoothstep smoothstep: function ( x, min, max ) { if ( x <= min ) return 0; if ( x >= max ) return 1; x = ( x - min ) / ( max - min ); return x * x * ( 3 - 2 * x ); }, smootherstep: function ( x, min, max ) { if ( x <= min ) return 0; if ( x >= max ) return 1; x = ( x - min ) / ( max - min ); return x * x * x * ( x * ( x * 6 - 15 ) + 10 ); }, // Random integer from interval randInt: function ( low, high ) { return low + Math.floor( Math.random() * ( high - low + 1 ) ); }, // Random float from interval randFloat: function ( low, high ) { return low + Math.random() * ( high - low ); }, // Random float from <-range/2, range/2> interval randFloatSpread: function ( range ) { return range * ( 0.5 - Math.random() ); }, degToRad: function ( degrees ) { return degrees * _Math$1.DEG2RAD; }, radToDeg: function ( radians ) { return radians * _Math$1.RAD2DEG; }, isPowerOfTwo: function ( value ) { return ( value & ( value - 1 ) ) === 0 && value !== 0; }, nearestPowerOfTwo: function ( value ) { return Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) ); }, nextPowerOfTwo: function ( value ) { value --; value |= value >> 1; value |= value >> 2; value |= value >> 4; value |= value >> 8; value |= value >> 16; value ++; return value; } }; /** * @author mrdoob / http://mrdoob.com/ * @author philogb / http://blog.thejit.org/ * @author egraether / http://egraether.com/ * @author zz85 / http://www.lab4games.net/zz85/blog */ function Vector2$1( x, y ) { this.x = x || 0; this.y = y || 0; } Object.defineProperties( Vector2$1.prototype, { "width" : { get: function () { return this.x; }, set: function ( value ) { this.x = value; } }, "height" : { get: function () { return this.y; }, set: function ( value ) { this.y = value; } } } ); Object.assign( Vector2$1.prototype, { isVector2: true, set: function ( x, y ) { this.x = x; this.y = y; return this; }, setScalar: function ( scalar ) { this.x = scalar; this.y = scalar; return this; }, setX: function ( x ) { this.x = x; return this; }, setY: function ( y ) { this.y = y; return this; }, setComponent: function ( index, value ) { switch ( index ) { case 0: this.x = value; break; case 1: this.y = value; break; default: throw new Error( 'index is out of range: ' + index ); } return this; }, getComponent: function ( index ) { switch ( index ) { case 0: return this.x; case 1: return this.y; default: throw new Error( 'index is out of range: ' + index ); } }, clone: function () { return new this.constructor( this.x, this.y ); }, copy: function ( v ) { this.x = v.x; this.y = v.y; return this; }, add: function ( v, w ) { if ( w !== undefined ) { console.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); return this.addVectors( v, w ); } this.x += v.x; this.y += v.y; return this; }, addScalar: function ( s ) { this.x += s; this.y += s; return this; }, addVectors: function ( a, b ) { this.x = a.x + b.x; this.y = a.y + b.y; return this; }, addScaledVector: function ( v, s ) { this.x += v.x * s; this.y += v.y * s; return this; }, sub: function ( v, w ) { if ( w !== undefined ) { console.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); return this.subVectors( v, w ); } this.x -= v.x; this.y -= v.y; return this; }, subScalar: function ( s ) { this.x -= s; this.y -= s; return this; }, subVectors: function ( a, b ) { this.x = a.x - b.x; this.y = a.y - b.y; return this; }, multiply: function ( v ) { this.x *= v.x; this.y *= v.y; return this; }, multiplyScalar: function ( scalar ) { this.x *= scalar; this.y *= scalar; return this; }, divide: function ( v ) { this.x /= v.x; this.y /= v.y; return this; }, divideScalar: function ( scalar ) { return this.multiplyScalar( 1 / scalar ); }, min: function ( v ) { this.x = Math.min( this.x, v.x ); this.y = Math.min( this.y, v.y ); return this; }, max: function ( v ) { this.x = Math.max( this.x, v.x ); this.y = Math.max( this.y, v.y ); return this; }, clamp: function ( min, max ) { // This function assumes min < max, if this assumption isn't true it will not operate correctly this.x = Math.max( min.x, Math.min( max.x, this.x ) ); this.y = Math.max( min.y, Math.min( max.y, this.y ) ); return this; }, clampScalar: function () { var min = new Vector2$1(); var max = new Vector2$1(); return function clampScalar( minVal, maxVal ) { min.set( minVal, minVal ); max.set( maxVal, maxVal ); return this.clamp( min, max ); }; }(), clampLength: function ( min, max ) { var length = this.length(); return this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length ); }, floor: function () { this.x = Math.floor( this.x ); this.y = Math.floor( this.y ); return this; }, ceil: function () { this.x = Math.ceil( this.x ); this.y = Math.ceil( this.y ); return this; }, round: function () { this.x = Math.round( this.x ); this.y = Math.round( this.y ); return this; }, roundToZero: function () { this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); return this; }, negate: function () { this.x = - this.x; this.y = - this.y; return this; }, dot: function ( v ) { return this.x * v.x + this.y * v.y; }, lengthSq: function () { return this.x * this.x + this.y * this.y; }, length: function () { return Math.sqrt( this.x * this.x + this.y * this.y ); }, lengthManhattan: function() { return Math.abs( this.x ) + Math.abs( this.y ); }, normalize: function () { return this.divideScalar( this.length() ); }, angle: function () { // computes the angle in radians with respect to the positive x-axis var angle = Math.atan2( this.y, this.x ); if ( angle < 0 ) angle += 2 * Math.PI; return angle; }, distanceTo: function ( v ) { return Math.sqrt( this.distanceToSquared( v ) ); }, distanceToSquared: function ( v ) { var dx = this.x - v.x, dy = this.y - v.y; return dx * dx + dy * dy; }, distanceToManhattan: function ( v ) { return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ); }, setLength: function ( length ) { return this.multiplyScalar( length / this.length() ); }, lerp: function ( v, alpha ) { this.x += ( v.x - this.x ) * alpha; this.y += ( v.y - this.y ) * alpha; return this; }, lerpVectors: function ( v1, v2, alpha ) { return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); }, equals: function ( v ) { return ( ( v.x === this.x ) && ( v.y === this.y ) ); }, fromArray: function ( array, offset ) { if ( offset === undefined ) offset = 0; this.x = array[ offset ]; this.y = array[ offset + 1 ]; return this; }, toArray: function ( array, offset ) { if ( array === undefined ) array = []; if ( offset === undefined ) offset = 0; array[ offset ] = this.x; array[ offset + 1 ] = this.y; return array; }, fromBufferAttribute: function ( attribute, index, offset ) { if ( offset !== undefined ) { console.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' ); } this.x = attribute.getX( index ); this.y = attribute.getY( index ); return this; }, rotateAround: function ( center, angle ) { var c = Math.cos( angle ), s = Math.sin( angle ); var x = this.x - center.x; var y = this.y - center.y; this.x = x * c - y * s + center.x; this.y = x * s + y * c + center.y; return this; } } ); /** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ * @author szimek / https://github.com/szimek/ */ var textureId$1 = 0; function Texture$1( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { Object.defineProperty( this, 'id', { value: textureId$1 ++ } ); this.uuid = _Math$1.generateUUID(); this.name = ''; this.image = image !== undefined ? image : Texture$1.DEFAULT_IMAGE; this.mipmaps = []; this.mapping = mapping !== undefined ? mapping : Texture$1.DEFAULT_MAPPING; this.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping$1; this.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping$1; this.magFilter = magFilter !== undefined ? magFilter : LinearFilter$1; this.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter$1; this.anisotropy = anisotropy !== undefined ? anisotropy : 1; this.format = format !== undefined ? format : RGBAFormat$1; this.type = type !== undefined ? type : UnsignedByteType$1; this.offset = new Vector2$1( 0, 0 ); this.repeat = new Vector2$1( 1, 1 ); this.generateMipmaps = true; this.premultiplyAlpha = false; this.flipY = true; this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml) // Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap. // // Also changing the encoding after already used by a Material will not automatically make the Material // update. You need to explicitly call Material.needsUpdate to trigger it to recompile. this.encoding = encoding !== undefined ? encoding : LinearEncoding$1; this.version = 0; this.onUpdate = null; } Texture$1.DEFAULT_IMAGE = undefined; Texture$1.DEFAULT_MAPPING = UVMapping$1; Object.defineProperty( Texture$1.prototype, "needsUpdate", { set: function ( value ) { if ( value === true ) this.version ++; } } ); Object.assign( Texture$1.prototype, EventDispatcher$1.prototype, { constructor: Texture$1, isTexture: true, clone: function () { return new this.constructor().copy( this ); }, copy: function ( source ) { this.name = source.name; this.image = source.image; this.mipmaps = source.mipmaps.slice( 0 ); this.mapping = source.mapping; this.wrapS = source.wrapS; this.wrapT = source.wrapT; this.magFilter = source.magFilter; this.minFilter = source.minFilter; this.anisotropy = source.anisotropy; this.format = source.format; this.type = source.type; this.offset.copy( source.offset ); this.repeat.copy( source.repeat ); this.generateMipmaps = source.generateMipmaps; this.premultiplyAlpha = source.premultiplyAlpha; this.flipY = source.flipY; this.unpackAlignment = source.unpackAlignment; this.encoding = source.encoding; return this; }, toJSON: function ( meta ) { if ( meta.textures[ this.uuid ] !== undefined ) { return meta.textures[ this.uuid ]; } function getDataURL( image ) { var canvas; if ( image.toDataURL !== undefined ) { canvas = image; } else { canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); canvas.width = image.width; canvas.height = image.height; canvas.getContext( '2d' ).drawImage( image, 0, 0, image.width, image.height ); } if ( canvas.width > 2048 || canvas.height > 2048 ) { return canvas.toDataURL( 'image/jpeg', 0.6 ); } else { return canvas.toDataURL( 'image/png' ); } } var output = { metadata: { version: 4.5, type: 'Texture', generator: 'Texture.toJSON' }, uuid: this.uuid, name: this.name, mapping: this.mapping, repeat: [ this.repeat.x, this.repeat.y ], offset: [ this.offset.x, this.offset.y ], wrap: [ this.wrapS, this.wrapT ], minFilter: this.minFilter, magFilter: this.magFilter, anisotropy: this.anisotropy, flipY: this.flipY }; if ( this.image !== undefined ) { // TODO: Move to THREE.Image var image = this.image; if ( image.uuid === undefined ) { image.uuid = _Math$1.generateUUID(); // UGH } if ( meta.images[ image.uuid ] === undefined ) { meta.images[ image.uuid ] = { uuid: image.uuid, url: getDataURL( image ) }; } output.image = image.uuid; } meta.textures[ this.uuid ] = output; return output; }, dispose: function () { this.dispatchEvent( { type: 'dispose' } ); }, transformUv: function ( uv ) { if ( this.mapping !== UVMapping$1 ) return; uv.multiply( this.repeat ); uv.add( this.offset ); if ( uv.x < 0 || uv.x > 1 ) { switch ( this.wrapS ) { case RepeatWrapping$1: uv.x = uv.x - Math.floor( uv.x ); break; case ClampToEdgeWrapping$1: uv.x = uv.x < 0 ? 0 : 1; break; case MirroredRepeatWrapping$1: if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) { uv.x = Math.ceil( uv.x ) - uv.x; } else { uv.x = uv.x - Math.floor( uv.x ); } break; } } if ( uv.y < 0 || uv.y > 1 ) { switch ( this.wrapT ) { case RepeatWrapping$1: uv.y = uv.y - Math.floor( uv.y ); break; case ClampToEdgeWrapping$1: uv.y = uv.y < 0 ? 0 : 1; break; case MirroredRepeatWrapping$1: if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) { uv.y = Math.ceil( uv.y ) - uv.y; } else { uv.y = uv.y - Math.floor( uv.y ); } break; } } if ( this.flipY ) { uv.y = 1 - uv.y; } } } ); /** * @author supereggbert / http://www.paulbrunt.co.uk/ * @author philogb / http://blog.thejit.org/ * @author mikael emtinger / http://gomo.se/ * @author egraether / http://egraether.com/ * @author WestLangley / http://github.com/WestLangley */ function Vector4$1( x, y, z, w ) { this.x = x || 0; this.y = y || 0; this.z = z || 0; this.w = ( w !== undefined ) ? w : 1; } Object.assign( Vector4$1.prototype, { isVector4: true, set: function ( x, y, z, w ) { this.x = x; this.y = y; this.z = z; this.w = w; return this; }, setScalar: function ( scalar ) { this.x = scalar; this.y = scalar; this.z = scalar; this.w = scalar; return this; }, setX: function ( x ) { this.x = x; return this; }, setY: function ( y ) { this.y = y; return this; }, setZ: function ( z ) { this.z = z; return this; }, setW: function ( w ) { this.w = w; return this; }, setComponent: function ( index, value ) { switch ( index ) { case 0: this.x = value; break; case 1: this.y = value; break; case 2: this.z = value; break; case 3: this.w = value; break; default: throw new Error( 'index is out of range: ' + index ); } return this; }, getComponent: function ( index ) { switch ( index ) { case 0: return this.x; case 1: return this.y; case 2: return this.z; case 3: return this.w; default: throw new Error( 'index is out of range: ' + index ); } }, clone: function () { return new this.constructor( this.x, this.y, this.z, this.w ); }, copy: function ( v ) { this.x = v.x; this.y = v.y; this.z = v.z; this.w = ( v.w !== undefined ) ? v.w : 1; return this; }, add: function ( v, w ) { if ( w !== undefined ) { console.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); return this.addVectors( v, w ); } this.x += v.x; this.y += v.y; this.z += v.z; this.w += v.w; return this; }, addScalar: function ( s ) { this.x += s; this.y += s; this.z += s; this.w += s; return this; }, addVectors: function ( a, b ) { this.x = a.x + b.x; this.y = a.y + b.y; this.z = a.z + b.z; this.w = a.w + b.w; return this; }, addScaledVector: function ( v, s ) { this.x += v.x * s; this.y += v.y * s; this.z += v.z * s; this.w += v.w * s; return this; }, sub: function ( v, w ) { if ( w !== undefined ) { console.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); return this.subVectors( v, w ); } this.x -= v.x; this.y -= v.y; this.z -= v.z; this.w -= v.w; return this; }, subScalar: function ( s ) { this.x -= s; this.y -= s; this.z -= s; this.w -= s; return this; }, subVectors: function ( a, b ) { this.x = a.x - b.x; this.y = a.y - b.y; this.z = a.z - b.z; this.w = a.w - b.w; return this; }, multiplyScalar: function ( scalar ) { this.x *= scalar; this.y *= scalar; this.z *= scalar; this.w *= scalar; return this; }, applyMatrix4: function ( m ) { var x = this.x, y = this.y, z = this.z, w = this.w; var e = m.elements; this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w; this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w; this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w; this.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w; return this; }, divideScalar: function ( scalar ) { return this.multiplyScalar( 1 / scalar ); }, setAxisAngleFromQuaternion: function ( q ) { // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm // q is assumed to be normalized this.w = 2 * Math.acos( q.w ); var s = Math.sqrt( 1 - q.w * q.w ); if ( s < 0.0001 ) { this.x = 1; this.y = 0; this.z = 0; } else { this.x = q.x / s; this.y = q.y / s; this.z = q.z / s; } return this; }, setAxisAngleFromRotationMatrix: function ( m ) { // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) var angle, x, y, z, // variables for result epsilon = 0.01, // margin to allow for rounding errors epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees te = m.elements, m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; if ( ( Math.abs( m12 - m21 ) < epsilon ) && ( Math.abs( m13 - m31 ) < epsilon ) && ( Math.abs( m23 - m32 ) < epsilon ) ) { // singularity found // first check for identity matrix which must have +1 for all terms // in leading diagonal and zero in other terms if ( ( Math.abs( m12 + m21 ) < epsilon2 ) && ( Math.abs( m13 + m31 ) < epsilon2 ) && ( Math.abs( m23 + m32 ) < epsilon2 ) && ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) { // this singularity is identity matrix so angle = 0 this.set( 1, 0, 0, 0 ); return this; // zero angle, arbitrary axis } // otherwise this singularity is angle = 180 angle = Math.PI; var xx = ( m11 + 1 ) / 2; var yy = ( m22 + 1 ) / 2; var zz = ( m33 + 1 ) / 2; var xy = ( m12 + m21 ) / 4; var xz = ( m13 + m31 ) / 4; var yz = ( m23 + m32 ) / 4; if ( ( xx > yy ) && ( xx > zz ) ) { // m11 is the largest diagonal term if ( xx < epsilon ) { x = 0; y = 0.707106781; z = 0.707106781; } else { x = Math.sqrt( xx ); y = xy / x; z = xz / x; } } else if ( yy > zz ) { // m22 is the largest diagonal term if ( yy < epsilon ) { x = 0.707106781; y = 0; z = 0.707106781; } else { y = Math.sqrt( yy ); x = xy / y; z = yz / y; } } else { // m33 is the largest diagonal term so base result on this if ( zz < epsilon ) { x = 0.707106781; y = 0.707106781; z = 0; } else { z = Math.sqrt( zz ); x = xz / z; y = yz / z; } } this.set( x, y, z, angle ); return this; // return 180 deg rotation } // as we have reached here there are no singularities so we can handle normally var s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) + ( m13 - m31 ) * ( m13 - m31 ) + ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize if ( Math.abs( s ) < 0.001 ) s = 1; // prevent divide by zero, should not happen if matrix is orthogonal and should be // caught by singularity test above, but I've left it in just in case this.x = ( m32 - m23 ) / s; this.y = ( m13 - m31 ) / s; this.z = ( m21 - m12 ) / s; this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 ); return this; }, min: function ( v ) { this.x = Math.min( this.x, v.x ); this.y = Math.min( this.y, v.y ); this.z = Math.min( this.z, v.z ); this.w = Math.min( this.w, v.w ); return this; }, max: function ( v ) { this.x = Math.max( this.x, v.x ); this.y = Math.max( this.y, v.y ); this.z = Math.max( this.z, v.z ); this.w = Math.max( this.w, v.w ); return this; }, clamp: function ( min, max ) { // This function assumes min < max, if this assumption isn't true it will not operate correctly this.x = Math.max( min.x, Math.min( max.x, this.x ) ); this.y = Math.max( min.y, Math.min( max.y, this.y ) ); this.z = Math.max( min.z, Math.min( max.z, this.z ) ); this.w = Math.max( min.w, Math.min( max.w, this.w ) ); return this; }, clampScalar: function () { var min = new Vector4$1(); var max = new Vector4$1(); return function clampScalar( minVal, maxVal ) { min.set( minVal, minVal, minVal, minVal ); max.set( maxVal, maxVal, maxVal, maxVal ); return this.clamp( min, max ); }; }(), floor: function () { this.x = Math.floor( this.x ); this.y = Math.floor( this.y ); this.z = Math.floor( this.z ); this.w = Math.floor( this.w ); return this; }, ceil: function () { this.x = Math.ceil( this.x ); this.y = Math.ceil( this.y ); this.z = Math.ceil( this.z ); this.w = Math.ceil( this.w ); return this; }, round: function () { this.x = Math.round( this.x ); this.y = Math.round( this.y ); this.z = Math.round( this.z ); this.w = Math.round( this.w ); return this; }, roundToZero: function () { this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); this.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w ); return this; }, negate: function () { this.x = - this.x; this.y = - this.y; this.z = - this.z; this.w = - this.w; return this; }, dot: function ( v ) { return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; }, lengthSq: function () { return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; }, length: function () { return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w ); }, lengthManhattan: function () { return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w ); }, normalize: function () { return this.divideScalar( this.length() ); }, setLength: function ( length ) { return this.multiplyScalar( length / this.length() ); }, lerp: function ( v, alpha ) { this.x += ( v.x - this.x ) * alpha; this.y += ( v.y - this.y ) * alpha; this.z += ( v.z - this.z ) * alpha; this.w += ( v.w - this.w ) * alpha; return this; }, lerpVectors: function ( v1, v2, alpha ) { return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); }, equals: function ( v ) { return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) ); }, fromArray: function ( array, offset ) { if ( offset === undefined ) offset = 0; this.x = array[ offset ]; this.y = array[ offset + 1 ]; this.z = array[ offset + 2 ]; this.w = array[ offset + 3 ]; return this; }, toArray: function ( array, offset ) { if ( array === undefined ) array = []; if ( offset === undefined ) offset = 0; array[ offset ] = this.x; array[ offset + 1 ] = this.y; array[ offset + 2 ] = this.z; array[ offset + 3 ] = this.w; return array; }, fromBufferAttribute: function ( attribute, index, offset ) { if ( offset !== undefined ) { console.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' ); } this.x = attribute.getX( index ); this.y = attribute.getY( index ); this.z = attribute.getZ( index ); this.w = attribute.getW( index ); return this; } } ); /** * @author szimek / https://github.com/szimek/ * @author alteredq / http://alteredqualia.com/ * @author Marius Kintel / https://github.com/kintel */ /* In options, we can specify: * Texture parameters for an auto-generated target texture * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers */ function WebGLRenderTarget$1( width, height, options ) { this.uuid = _Math$1.generateUUID(); this.width = width; this.height = height; this.scissor = new Vector4$1( 0, 0, width, height ); this.scissorTest = false; this.viewport = new Vector4$1( 0, 0, width, height ); options = options || {}; if ( options.minFilter === undefined ) options.minFilter = LinearFilter$1; this.texture = new Texture$1( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding ); this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true; this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true; this.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null; } Object.assign( WebGLRenderTarget$1.prototype, EventDispatcher$1.prototype, { isWebGLRenderTarget: true, setSize: function ( width, height ) { if ( this.width !== width || this.height !== height ) { this.width = width; this.height = height; this.dispose(); } this.viewport.set( 0, 0, width, height ); this.scissor.set( 0, 0, width, height ); }, clone: function () { return new this.constructor().copy( this ); }, copy: function ( source ) { this.width = source.width; this.height = source.height; this.viewport.copy( source.viewport ); this.texture = source.texture.clone(); this.depthBuffer = source.depthBuffer; this.stencilBuffer = source.stencilBuffer; this.depthTexture = source.depthTexture; return this; }, dispose: function () { this.dispatchEvent( { type: 'dispose' } ); } } ); /** * @author alteredq / http://alteredqualia.com */ function WebGLRenderTargetCube$1( width, height, options ) { WebGLRenderTarget$1.call( this, width, height, options ); this.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5 this.activeMipMapLevel = 0; } WebGLRenderTargetCube$1.prototype = Object.create( WebGLRenderTarget$1.prototype ); WebGLRenderTargetCube$1.prototype.constructor = WebGLRenderTargetCube$1; WebGLRenderTargetCube$1.prototype.isWebGLRenderTargetCube = true; /** * @author mikael emtinger / http://gomo.se/ * @author alteredq / http://alteredqualia.com/ * @author WestLangley / http://github.com/WestLangley * @author bhouston / http://clara.io */ function Quaternion$1( x, y, z, w ) { this._x = x || 0; this._y = y || 0; this._z = z || 0; this._w = ( w !== undefined ) ? w : 1; } Object.assign( Quaternion$1, { slerp: function ( qa, qb, qm, t ) { return qm.copy( qa ).slerp( qb, t ); }, slerpFlat: function ( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) { // fuzz-free, array-based Quaternion SLERP operation var x0 = src0[ srcOffset0 + 0 ], y0 = src0[ srcOffset0 + 1 ], z0 = src0[ srcOffset0 + 2 ], w0 = src0[ srcOffset0 + 3 ], x1 = src1[ srcOffset1 + 0 ], y1 = src1[ srcOffset1 + 1 ], z1 = src1[ srcOffset1 + 2 ], w1 = src1[ srcOffset1 + 3 ]; if ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) { var s = 1 - t, cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1, dir = ( cos >= 0 ? 1 : - 1 ), sqrSin = 1 - cos * cos; // Skip the Slerp for tiny steps to avoid numeric problems: if ( sqrSin > Number.EPSILON ) { var sin = Math.sqrt( sqrSin ), len = Math.atan2( sin, cos * dir ); s = Math.sin( s * len ) / sin; t = Math.sin( t * len ) / sin; } var tDir = t * dir; x0 = x0 * s + x1 * tDir; y0 = y0 * s + y1 * tDir; z0 = z0 * s + z1 * tDir; w0 = w0 * s + w1 * tDir; // Normalize in case we just did a lerp: if ( s === 1 - t ) { var f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 ); x0 *= f; y0 *= f; z0 *= f; w0 *= f; } } dst[ dstOffset ] = x0; dst[ dstOffset + 1 ] = y0; dst[ dstOffset + 2 ] = z0; dst[ dstOffset + 3 ] = w0; } } ); Object.defineProperties( Quaternion$1.prototype, { x: { get: function () { return this._x; }, set: function ( value ) { this._x = value; this.onChangeCallback(); } }, y: { get: function () { return this._y; }, set: function ( value ) { this._y = value; this.onChangeCallback(); } }, z: { get: function () { return this._z; }, set: function ( value ) { this._z = value; this.onChangeCallback(); } }, w: { get: function () { return this._w; }, set: function ( value ) { this._w = value; this.onChangeCallback(); } } } ); Object.assign( Quaternion$1.prototype, { set: function ( x, y, z, w ) { this._x = x; this._y = y; this._z = z; this._w = w; this.onChangeCallback(); return this; }, clone: function () { return new this.constructor( this._x, this._y, this._z, this._w ); }, copy: function ( quaternion ) { this._x = quaternion.x; this._y = quaternion.y; this._z = quaternion.z; this._w = quaternion.w; this.onChangeCallback(); return this; }, setFromEuler: function ( euler, update ) { if ( ( euler && euler.isEuler ) === false ) { throw new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' ); } var x = euler._x, y = euler._y, z = euler._z, order = euler.order; // http://www.mathworks.com/matlabcentral/fileexchange/ // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ // content/SpinCalc.m var cos = Math.cos; var sin = Math.sin; var c1 = cos( x / 2 ); var c2 = cos( y / 2 ); var c3 = cos( z / 2 ); var s1 = sin( x / 2 ); var s2 = sin( y / 2 ); var s3 = sin( z / 2 ); if ( order === 'XYZ' ) { this._x = s1 * c2 * c3 + c1 * s2 * s3; this._y = c1 * s2 * c3 - s1 * c2 * s3; this._z = c1 * c2 * s3 + s1 * s2 * c3; this._w = c1 * c2 * c3 - s1 * s2 * s3; } else if ( order === 'YXZ' ) { this._x = s1 * c2 * c3 + c1 * s2 * s3; this._y = c1 * s2 * c3 - s1 * c2 * s3; this._z = c1 * c2 * s3 - s1 * s2 * c3; this._w = c1 * c2 * c3 + s1 * s2 * s3; } else if ( order === 'ZXY' ) { this._x = s1 * c2 * c3 - c1 * s2 * s3; this._y = c1 * s2 * c3 + s1 * c2 * s3; this._z = c1 * c2 * s3 + s1 * s2 * c3; this._w = c1 * c2 * c3 - s1 * s2 * s3; } else if ( order === 'ZYX' ) { this._x = s1 * c2 * c3 - c1 * s2 * s3; this._y = c1 * s2 * c3 + s1 * c2 * s3; this._z = c1 * c2 * s3 - s1 * s2 * c3; this._w = c1 * c2 * c3 + s1 * s2 * s3; } else if ( order === 'YZX' ) { this._x = s1 * c2 * c3 + c1 * s2 * s3; this._y = c1 * s2 * c3 + s1 * c2 * s3; this._z = c1 * c2 * s3 - s1 * s2 * c3; this._w = c1 * c2 * c3 - s1 * s2 * s3; } else if ( order === 'XZY' ) { this._x = s1 * c2 * c3 - c1 * s2 * s3; this._y = c1 * s2 * c3 - s1 * c2 * s3; this._z = c1 * c2 * s3 + s1 * s2 * c3; this._w = c1 * c2 * c3 + s1 * s2 * s3; } if ( update !== false ) this.onChangeCallback(); return this; }, setFromAxisAngle: function ( axis, angle ) { // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm // assumes axis is normalized var halfAngle = angle / 2, s = Math.sin( halfAngle ); this._x = axis.x * s; this._y = axis.y * s; this._z = axis.z * s; this._w = Math.cos( halfAngle ); this.onChangeCallback(); return this; }, setFromRotationMatrix: function ( m ) { // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) var te = m.elements, m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ], trace = m11 + m22 + m33, s; if ( trace > 0 ) { s = 0.5 / Math.sqrt( trace + 1.0 ); this._w = 0.25 / s; this._x = ( m32 - m23 ) * s; this._y = ( m13 - m31 ) * s; this._z = ( m21 - m12 ) * s; } else if ( m11 > m22 && m11 > m33 ) { s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 ); this._w = ( m32 - m23 ) / s; this._x = 0.25 * s; this._y = ( m12 + m21 ) / s; this._z = ( m13 + m31 ) / s; } else if ( m22 > m33 ) { s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 ); this._w = ( m13 - m31 ) / s; this._x = ( m12 + m21 ) / s; this._y = 0.25 * s; this._z = ( m23 + m32 ) / s; } else { s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 ); this._w = ( m21 - m12 ) / s; this._x = ( m13 + m31 ) / s; this._y = ( m23 + m32 ) / s; this._z = 0.25 * s; } this.onChangeCallback(); return this; }, setFromUnitVectors: function () { // assumes direction vectors vFrom and vTo are normalized var v1 = new Vector3$1(); var r; var EPS = 0.000001; return function setFromUnitVectors( vFrom, vTo ) { if ( v1 === undefined ) v1 = new Vector3$1(); r = vFrom.dot( vTo ) + 1; if ( r < EPS ) { r = 0; if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) { v1.set( - vFrom.y, vFrom.x, 0 ); } else { v1.set( 0, - vFrom.z, vFrom.y ); } } else { v1.crossVectors( vFrom, vTo ); } this._x = v1.x; this._y = v1.y; this._z = v1.z; this._w = r; return this.normalize(); }; }(), inverse: function () { return this.conjugate().normalize(); }, conjugate: function () { this._x *= - 1; this._y *= - 1; this._z *= - 1; this.onChangeCallback(); return this; }, dot: function ( v ) { return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; }, lengthSq: function () { return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; }, length: function () { return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w ); }, normalize: function () { var l = this.length(); if ( l === 0 ) { this._x = 0; this._y = 0; this._z = 0; this._w = 1; } else { l = 1 / l; this._x = this._x * l; this._y = this._y * l; this._z = this._z * l; this._w = this._w * l; } this.onChangeCallback(); return this; }, multiply: function ( q, p ) { if ( p !== undefined ) { console.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' ); return this.multiplyQuaternions( q, p ); } return this.multiplyQuaternions( this, q ); }, premultiply: function ( q ) { return this.multiplyQuaternions( q, this ); }, multiplyQuaternions: function ( a, b ) { // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; var qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w; this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; this.onChangeCallback(); return this; }, slerp: function ( qb, t ) { if ( t === 0 ) return this; if ( t === 1 ) return this.copy( qb ); var x = this._x, y = this._y, z = this._z, w = this._w; // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z; if ( cosHalfTheta < 0 ) { this._w = - qb._w; this._x = - qb._x; this._y = - qb._y; this._z = - qb._z; cosHalfTheta = - cosHalfTheta; } else { this.copy( qb ); } if ( cosHalfTheta >= 1.0 ) { this._w = w; this._x = x; this._y = y; this._z = z; return this; } var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta ); if ( Math.abs( sinHalfTheta ) < 0.001 ) { this._w = 0.5 * ( w + this._w ); this._x = 0.5 * ( x + this._x ); this._y = 0.5 * ( y + this._y ); this._z = 0.5 * ( z + this._z ); return this; } var halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta ); var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta, ratioB = Math.sin( t * halfTheta ) / sinHalfTheta; this._w = ( w * ratioA + this._w * ratioB ); this._x = ( x * ratioA + this._x * ratioB ); this._y = ( y * ratioA + this._y * ratioB ); this._z = ( z * ratioA + this._z * ratioB ); this.onChangeCallback(); return this; }, equals: function ( quaternion ) { return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w ); }, fromArray: function ( array, offset ) { if ( offset === undefined ) offset = 0; this._x = array[ offset ]; this._y = array[ offset + 1 ]; this._z = array[ offset + 2 ]; this._w = array[ offset + 3 ]; this.onChangeCallback(); return this; }, toArray: function ( array, offset ) { if ( array === undefined ) array = []; if ( offset === undefined ) offset = 0; array[ offset ] = this._x; array[ offset + 1 ] = this._y; array[ offset + 2 ] = this._z; array[ offset + 3 ] = this._w; return array; }, onChange: function ( callback ) { this.onChangeCallback = callback; return this; }, onChangeCallback: function () {} } ); /** * @author mrdoob / http://mrdoob.com/ * @author *kile / http://kile.stravaganza.org/ * @author philogb / http://blog.thejit.org/ * @author mikael emtinger / http://gomo.se/ * @author egraether / http://egraether.com/ * @author WestLangley / http://github.com/WestLangley */ function Vector3$1( x, y, z ) { this.x = x || 0; this.y = y || 0; this.z = z || 0; } Object.assign( Vector3$1.prototype, { isVector3: true, set: function ( x, y, z ) { this.x = x; this.y = y; this.z = z; return this; }, setScalar: function ( scalar ) { this.x = scalar; this.y = scalar; this.z = scalar; return this; }, setX: function ( x ) { this.x = x; return this; }, setY: function ( y ) { this.y = y; return this; }, setZ: function ( z ) { this.z = z; return this; }, setComponent: function ( index, value ) { switch ( index ) { case 0: this.x = value; break; case 1: this.y = value; break; case 2: this.z = value; break; default: throw new Error( 'index is out of range: ' + index ); } return this; }, getComponent: function ( index ) { switch ( index ) { case 0: return this.x; case 1: return this.y; case 2: return this.z; default: throw new Error( 'index is out of range: ' + index ); } }, clone: function () { return new this.constructor( this.x, this.y, this.z ); }, copy: function ( v ) { this.x = v.x; this.y = v.y; this.z = v.z; return this; }, add: function ( v, w ) { if ( w !== undefined ) { console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); return this.addVectors( v, w ); } this.x += v.x; this.y += v.y; this.z += v.z; return this; }, addScalar: function ( s ) { this.x += s; this.y += s; this.z += s; return this; }, addVectors: function ( a, b ) { this.x = a.x + b.x; this.y = a.y + b.y; this.z = a.z + b.z; return this; }, addScaledVector: function ( v, s ) { this.x += v.x * s; this.y += v.y * s; this.z += v.z * s; return this; }, sub: function ( v, w ) { if ( w !== undefined ) { console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); return this.subVectors( v, w ); } this.x -= v.x; this.y -= v.y; this.z -= v.z; return this; }, subScalar: function ( s ) { this.x -= s; this.y -= s; this.z -= s; return this; }, subVectors: function ( a, b ) { this.x = a.x - b.x; this.y = a.y - b.y; this.z = a.z - b.z; return this; }, multiply: function ( v, w ) { if ( w !== undefined ) { console.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' ); return this.multiplyVectors( v, w ); } this.x *= v.x; this.y *= v.y; this.z *= v.z; return this; }, multiplyScalar: function ( scalar ) { this.x *= scalar; this.y *= scalar; this.z *= scalar; return this; }, multiplyVectors: function ( a, b ) { this.x = a.x * b.x; this.y = a.y * b.y; this.z = a.z * b.z; return this; }, applyEuler: function () { var quaternion = new Quaternion$1(); return function applyEuler( euler ) { if ( ( euler && euler.isEuler ) === false ) { console.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' ); } return this.applyQuaternion( quaternion.setFromEuler( euler ) ); }; }(), applyAxisAngle: function () { var quaternion = new Quaternion$1(); return function applyAxisAngle( axis, angle ) { return this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) ); }; }(), applyMatrix3: function ( m ) { var x = this.x, y = this.y, z = this.z; var e = m.elements; this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z; this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z; this.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z; return this; }, applyMatrix4: function ( m ) { var x = this.x, y = this.y, z = this.z; var e = m.elements; this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ]; this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ]; this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ]; var w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ]; return this.divideScalar( w ); }, applyQuaternion: function ( q ) { var x = this.x, y = this.y, z = this.z; var qx = q.x, qy = q.y, qz = q.z, qw = q.w; // calculate quat * vector var ix = qw * x + qy * z - qz * y; var iy = qw * y + qz * x - qx * z; var iz = qw * z + qx * y - qy * x; var iw = - qx * x - qy * y - qz * z; // calculate result * inverse quat this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy; this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz; this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx; return this; }, project: function () { var matrix = new Matrix4$1(); return function project( camera ) { matrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) ); return this.applyMatrix4( matrix ); }; }(), unproject: function () { var matrix = new Matrix4$1(); return function unproject( camera ) { matrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) ); return this.applyMatrix4( matrix ); }; }(), transformDirection: function ( m ) { // input: THREE.Matrix4 affine matrix // vector interpreted as a direction var x = this.x, y = this.y, z = this.z; var e = m.elements; this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z; this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z; this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z; return this.normalize(); }, divide: function ( v ) { this.x /= v.x; this.y /= v.y; this.z /= v.z; return this; }, divideScalar: function ( scalar ) { return this.multiplyScalar( 1 / scalar ); }, min: function ( v ) { this.x = Math.min( this.x, v.x ); this.y = Math.min( this.y, v.y ); this.z = Math.min( this.z, v.z ); return this; }, max: function ( v ) { this.x = Math.max( this.x, v.x ); this.y = Math.max( this.y, v.y ); this.z = Math.max( this.z, v.z ); return this; }, clamp: function ( min, max ) { // This function assumes min < max, if this assumption isn't true it will not operate correctly this.x = Math.max( min.x, Math.min( max.x, this.x ) ); this.y = Math.max( min.y, Math.min( max.y, this.y ) ); this.z = Math.max( min.z, Math.min( max.z, this.z ) ); return this; }, clampScalar: function () { var min = new Vector3$1(); var max = new Vector3$1(); return function clampScalar( minVal, maxVal ) { min.set( minVal, minVal, minVal ); max.set( maxVal, maxVal, maxVal ); return this.clamp( min, max ); }; }(), clampLength: function ( min, max ) { var length = this.length(); return this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length ); }, floor: function () { this.x = Math.floor( this.x ); this.y = Math.floor( this.y ); this.z = Math.floor( this.z ); return this; }, ceil: function () { this.x = Math.ceil( this.x ); this.y = Math.ceil( this.y ); this.z = Math.ceil( this.z ); return this; }, round: function () { this.x = Math.round( this.x ); this.y = Math.round( this.y ); this.z = Math.round( this.z ); return this; }, roundToZero: function () { this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); return this; }, negate: function () { this.x = - this.x; this.y = - this.y; this.z = - this.z; return this; }, dot: function ( v ) { return this.x * v.x + this.y * v.y + this.z * v.z; }, // TODO lengthSquared? lengthSq: function () { return this.x * this.x + this.y * this.y + this.z * this.z; }, length: function () { return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z ); }, lengthManhattan: function () { return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ); }, normalize: function () { return this.divideScalar( this.length() ); }, setLength: function ( length ) { return this.multiplyScalar( length / this.length() ); }, lerp: function ( v, alpha ) { this.x += ( v.x - this.x ) * alpha; this.y += ( v.y - this.y ) * alpha; this.z += ( v.z - this.z ) * alpha; return this; }, lerpVectors: function ( v1, v2, alpha ) { return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); }, cross: function ( v, w ) { if ( w !== undefined ) { console.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' ); return this.crossVectors( v, w ); } var x = this.x, y = this.y, z = this.z; this.x = y * v.z - z * v.y; this.y = z * v.x - x * v.z; this.z = x * v.y - y * v.x; return this; }, crossVectors: function ( a, b ) { var ax = a.x, ay = a.y, az = a.z; var bx = b.x, by = b.y, bz = b.z; this.x = ay * bz - az * by; this.y = az * bx - ax * bz; this.z = ax * by - ay * bx; return this; }, projectOnVector: function ( vector ) { var scalar = vector.dot( this ) / vector.lengthSq(); return this.copy( vector ).multiplyScalar( scalar ); }, projectOnPlane: function () { var v1 = new Vector3$1(); return function projectOnPlane( planeNormal ) { v1.copy( this ).projectOnVector( planeNormal ); return this.sub( v1 ); }; }(), reflect: function () { // reflect incident vector off plane orthogonal to normal // normal is assumed to have unit length var v1 = new Vector3$1(); return function reflect( normal ) { return this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) ); }; }(), angleTo: function ( v ) { var theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) ); // clamp, to handle numerical problems return Math.acos( _Math$1.clamp( theta, - 1, 1 ) ); }, distanceTo: function ( v ) { return Math.sqrt( this.distanceToSquared( v ) ); }, distanceToSquared: function ( v ) { var dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z; return dx * dx + dy * dy + dz * dz; }, distanceToManhattan: function ( v ) { return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z ); }, setFromSpherical: function ( s ) { var sinPhiRadius = Math.sin( s.phi ) * s.radius; this.x = sinPhiRadius * Math.sin( s.theta ); this.y = Math.cos( s.phi ) * s.radius; this.z = sinPhiRadius * Math.cos( s.theta ); return this; }, setFromCylindrical: function ( c ) { this.x = c.radius * Math.sin( c.theta ); this.y = c.y; this.z = c.radius * Math.cos( c.theta ); return this; }, setFromMatrixPosition: function ( m ) { return this.setFromMatrixColumn( m, 3 ); }, setFromMatrixScale: function ( m ) { var sx = this.setFromMatrixColumn( m, 0 ).length(); var sy = this.setFromMatrixColumn( m, 1 ).length(); var sz = this.setFromMatrixColumn( m, 2 ).length(); this.x = sx; this.y = sy; this.z = sz; return this; }, setFromMatrixColumn: function ( m, index ) { return this.fromArray( m.elements, index * 4 ); }, equals: function ( v ) { return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) ); }, fromArray: function ( array, offset ) { if ( offset === undefined ) offset = 0; this.x = array[ offset ]; this.y = array[ offset + 1 ]; this.z = array[ offset + 2 ]; return this; }, toArray: function ( array, offset ) { if ( array === undefined ) array = []; if ( offset === undefined ) offset = 0; array[ offset ] = this.x; array[ offset + 1 ] = this.y; array[ offset + 2 ] = this.z; return array; }, fromBufferAttribute: function ( attribute, index, offset ) { if ( offset !== undefined ) { console.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' ); } this.x = attribute.getX( index ); this.y = attribute.getY( index ); this.z = attribute.getZ( index ); return this; } } ); /** * @author mrdoob / http://mrdoob.com/ * @author supereggbert / http://www.paulbrunt.co.uk/ * @author philogb / http://blog.thejit.org/ * @author jordi_ros / http://plattsoft.com * @author D1plo1d / http://github.com/D1plo1d * @author alteredq / http://alteredqualia.com/ * @author mikael emtinger / http://gomo.se/ * @author timknip / http://www.floorplanner.com/ * @author bhouston / http://clara.io * @author WestLangley / http://github.com/WestLangley */ function Matrix4$1() { this.elements = [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ]; if ( arguments.length > 0 ) { console.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' ); } } Object.assign( Matrix4$1.prototype, { isMatrix4: true, set: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { var te = this.elements; te[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14; te[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24; te[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34; te[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44; return this; }, identity: function () { this.set( 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ); return this; }, clone: function () { return new Matrix4$1().fromArray( this.elements ); }, copy: function ( m ) { var te = this.elements; var me = m.elements; te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ]; te[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ]; return this; }, copyPosition: function ( m ) { var te = this.elements, me = m.elements; te[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; return this; }, extractBasis: function ( xAxis, yAxis, zAxis ) { xAxis.setFromMatrixColumn( this, 0 ); yAxis.setFromMatrixColumn( this, 1 ); zAxis.setFromMatrixColumn( this, 2 ); return this; }, makeBasis: function ( xAxis, yAxis, zAxis ) { this.set( xAxis.x, yAxis.x, zAxis.x, 0, xAxis.y, yAxis.y, zAxis.y, 0, xAxis.z, yAxis.z, zAxis.z, 0, 0, 0, 0, 1 ); return this; }, extractRotation: function () { var v1 = new Vector3$1(); return function extractRotation( m ) { var te = this.elements; var me = m.elements; var scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length(); var scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length(); var scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length(); te[ 0 ] = me[ 0 ] * scaleX; te[ 1 ] = me[ 1 ] * scaleX; te[ 2 ] = me[ 2 ] * scaleX; te[ 4 ] = me[ 4 ] * scaleY; te[ 5 ] = me[ 5 ] * scaleY; te[ 6 ] = me[ 6 ] * scaleY; te[ 8 ] = me[ 8 ] * scaleZ; te[ 9 ] = me[ 9 ] * scaleZ; te[ 10 ] = me[ 10 ] * scaleZ; return this; }; }(), makeRotationFromEuler: function ( euler ) { if ( ( euler && euler.isEuler ) === false ) { console.error( 'THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' ); } var te = this.elements; var x = euler.x, y = euler.y, z = euler.z; var a = Math.cos( x ), b = Math.sin( x ); var c = Math.cos( y ), d = Math.sin( y ); var e = Math.cos( z ), f = Math.sin( z ); if ( euler.order === 'XYZ' ) { var ae = a * e, af = a * f, be = b * e, bf = b * f; te[ 0 ] = c * e; te[ 4 ] = - c * f; te[ 8 ] = d; te[ 1 ] = af + be * d; te[ 5 ] = ae - bf * d; te[ 9 ] = - b * c; te[ 2 ] = bf - ae * d; te[ 6 ] = be + af * d; te[ 10 ] = a * c; } else if ( euler.order === 'YXZ' ) { var ce = c * e, cf = c * f, de = d * e, df = d * f; te[ 0 ] = ce + df * b; te[ 4 ] = de * b - cf; te[ 8 ] = a * d; te[ 1 ] = a * f; te[ 5 ] = a * e; te[ 9 ] = - b; te[ 2 ] = cf * b - de; te[ 6 ] = df + ce * b; te[ 10 ] = a * c; } else if ( euler.order === 'ZXY' ) { var ce = c * e, cf = c * f, de = d * e, df = d * f; te[ 0 ] = ce - df * b; te[ 4 ] = - a * f; te[ 8 ] = de + cf * b; te[ 1 ] = cf + de * b; te[ 5 ] = a * e; te[ 9 ] = df - ce * b; te[ 2 ] = - a * d; te[ 6 ] = b; te[ 10 ] = a * c; } else if ( euler.order === 'ZYX' ) { var ae = a * e, af = a * f, be = b * e, bf = b * f; te[ 0 ] = c * e; te[ 4 ] = be * d - af; te[ 8 ] = ae * d + bf; te[ 1 ] = c * f; te[ 5 ] = bf * d + ae; te[ 9 ] = af * d - be; te[ 2 ] = - d; te[ 6 ] = b * c; te[ 10 ] = a * c; } else if ( euler.order === 'YZX' ) { var ac = a * c, ad = a * d, bc = b * c, bd = b * d; te[ 0 ] = c * e; te[ 4 ] = bd - ac * f; te[ 8 ] = bc * f + ad; te[ 1 ] = f; te[ 5 ] = a * e; te[ 9 ] = - b * e; te[ 2 ] = - d * e; te[ 6 ] = ad * f + bc; te[ 10 ] = ac - bd * f; } else if ( euler.order === 'XZY' ) { var ac = a * c, ad = a * d, bc = b * c, bd = b * d; te[ 0 ] = c * e; te[ 4 ] = - f; te[ 8 ] = d * e; te[ 1 ] = ac * f + bd; te[ 5 ] = a * e; te[ 9 ] = ad * f - bc; te[ 2 ] = bc * f - ad; te[ 6 ] = b * e; te[ 10 ] = bd * f + ac; } // last column te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; // bottom row te[ 12 ] = 0; te[ 13 ] = 0; te[ 14 ] = 0; te[ 15 ] = 1; return this; }, makeRotationFromQuaternion: function ( q ) { var te = this.elements; var x = q._x, y = q._y, z = q._z, w = q._w; var x2 = x + x, y2 = y + y, z2 = z + z; var xx = x * x2, xy = x * y2, xz = x * z2; var yy = y * y2, yz = y * z2, zz = z * z2; var wx = w * x2, wy = w * y2, wz = w * z2; te[ 0 ] = 1 - ( yy + zz ); te[ 4 ] = xy - wz; te[ 8 ] = xz + wy; te[ 1 ] = xy + wz; te[ 5 ] = 1 - ( xx + zz ); te[ 9 ] = yz - wx; te[ 2 ] = xz - wy; te[ 6 ] = yz + wx; te[ 10 ] = 1 - ( xx + yy ); // last column te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; // bottom row te[ 12 ] = 0; te[ 13 ] = 0; te[ 14 ] = 0; te[ 15 ] = 1; return this; }, lookAt: function () { var x = new Vector3$1(); var y = new Vector3$1(); var z = new Vector3$1(); return function lookAt( eye, target, up ) { var te = this.elements; z.subVectors( eye, target ); if ( z.lengthSq() === 0 ) { // eye and target are in the same position z.z = 1; } z.normalize(); x.crossVectors( up, z ); if ( x.lengthSq() === 0 ) { // eye and target are in the same vertical z.z += 0.0001; x.crossVectors( up, z ); } x.normalize(); y.crossVectors( z, x ); te[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x; te[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y; te[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z; return this; }; }(), multiply: function ( m, n ) { if ( n !== undefined ) { console.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' ); return this.multiplyMatrices( m, n ); } return this.multiplyMatrices( this, m ); }, premultiply: function ( m ) { return this.multiplyMatrices( m, this ); }, multiplyMatrices: function ( a, b ) { var ae = a.elements; var be = b.elements; var te = this.elements; var a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ]; var a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ]; var a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ]; var a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ]; var b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ]; var b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ]; var b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ]; var b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ]; te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; te[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; te[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; te[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; te[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; te[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; te[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; te[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; te[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; te[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; te[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; te[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; te[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; te[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; return this; }, multiplyScalar: function ( s ) { var te = this.elements; te[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s; te[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s; te[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s; te[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s; return this; }, applyToBufferAttribute: function () { var v1 = new Vector3$1(); return function applyToBufferAttribute( attribute ) { for ( var i = 0, l = attribute.count; i < l; i ++ ) { v1.x = attribute.getX( i ); v1.y = attribute.getY( i ); v1.z = attribute.getZ( i ); v1.applyMatrix4( this ); attribute.setXYZ( i, v1.x, v1.y, v1.z ); } return attribute; }; }(), determinant: function () { var te = this.elements; var n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ]; var n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ]; var n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ]; var n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ]; //TODO: make this more efficient //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm ) return ( n41 * ( + n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34 ) + n42 * ( + n11 * n23 * n34 - n11 * n24 * n33 + n14 * n21 * n33 - n13 * n21 * n34 + n13 * n24 * n31 - n14 * n23 * n31 ) + n43 * ( + n11 * n24 * n32 - n11 * n22 * n34 - n14 * n21 * n32 + n12 * n21 * n34 + n14 * n22 * n31 - n12 * n24 * n31 ) + n44 * ( - n13 * n22 * n31 - n11 * n23 * n32 + n11 * n22 * n33 + n13 * n21 * n32 - n12 * n21 * n33 + n12 * n23 * n31 ) ); }, transpose: function () { var te = this.elements; var tmp; tmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp; tmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp; tmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp; tmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp; tmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp; tmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp; return this; }, setPosition: function ( v ) { var te = this.elements; te[ 12 ] = v.x; te[ 13 ] = v.y; te[ 14 ] = v.z; return this; }, getInverse: function ( m, throwOnDegenerate ) { // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm var te = this.elements, me = m.elements, n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ], n12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ], n13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ], n14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ], t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44, t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44, t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44, t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34; var det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14; if ( det === 0 ) { var msg = "THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0"; if ( throwOnDegenerate === true ) { throw new Error( msg ); } else { console.warn( msg ); } return this.identity(); } var detInv = 1 / det; te[ 0 ] = t11 * detInv; te[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv; te[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv; te[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv; te[ 4 ] = t12 * detInv; te[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv; te[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv; te[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv; te[ 8 ] = t13 * detInv; te[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv; te[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv; te[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv; te[ 12 ] = t14 * detInv; te[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv; te[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv; te[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv; return this; }, scale: function ( v ) { var te = this.elements; var x = v.x, y = v.y, z = v.z; te[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z; te[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z; te[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z; te[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z; return this; }, getMaxScaleOnAxis: function () { var te = this.elements; var scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ]; var scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ]; var scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ]; return Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) ); }, makeTranslation: function ( x, y, z ) { this.set( 1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1 ); return this; }, makeRotationX: function ( theta ) { var c = Math.cos( theta ), s = Math.sin( theta ); this.set( 1, 0, 0, 0, 0, c, - s, 0, 0, s, c, 0, 0, 0, 0, 1 ); return this; }, makeRotationY: function ( theta ) { var c = Math.cos( theta ), s = Math.sin( theta ); this.set( c, 0, s, 0, 0, 1, 0, 0, - s, 0, c, 0, 0, 0, 0, 1 ); return this; }, makeRotationZ: function ( theta ) { var c = Math.cos( theta ), s = Math.sin( theta ); this.set( c, - s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ); return this; }, makeRotationAxis: function ( axis, angle ) { // Based on http://www.gamedev.net/reference/articles/article1199.asp var c = Math.cos( angle ); var s = Math.sin( angle ); var t = 1 - c; var x = axis.x, y = axis.y, z = axis.z; var tx = t * x, ty = t * y; this.set( tx * x + c, tx * y - s * z, tx * z + s * y, 0, tx * y + s * z, ty * y + c, ty * z - s * x, 0, tx * z - s * y, ty * z + s * x, t * z * z + c, 0, 0, 0, 0, 1 ); return this; }, makeScale: function ( x, y, z ) { this.set( x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1 ); return this; }, makeShear: function ( x, y, z ) { this.set( 1, y, z, 0, x, 1, z, 0, x, y, 1, 0, 0, 0, 0, 1 ); return this; }, compose: function ( position, quaternion, scale ) { this.makeRotationFromQuaternion( quaternion ); this.scale( scale ); this.setPosition( position ); return this; }, decompose: function () { var vector = new Vector3$1(); var matrix = new Matrix4$1(); return function decompose( position, quaternion, scale ) { var te = this.elements; var sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length(); var sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length(); var sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length(); // if determine is negative, we need to invert one scale var det = this.determinant(); if ( det < 0 ) sx = - sx; position.x = te[ 12 ]; position.y = te[ 13 ]; position.z = te[ 14 ]; // scale the rotation part matrix.copy( this ); var invSX = 1 / sx; var invSY = 1 / sy; var invSZ = 1 / sz; matrix.elements[ 0 ] *= invSX; matrix.elements[ 1 ] *= invSX; matrix.elements[ 2 ] *= invSX; matrix.elements[ 4 ] *= invSY; matrix.elements[ 5 ] *= invSY; matrix.elements[ 6 ] *= invSY; matrix.elements[ 8 ] *= invSZ; matrix.elements[ 9 ] *= invSZ; matrix.elements[ 10 ] *= invSZ; quaternion.setFromRotationMatrix( matrix ); scale.x = sx; scale.y = sy; scale.z = sz; return this; }; }(), makePerspective: function ( left, right, top, bottom, near, far ) { if ( far === undefined ) { console.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' ); } var te = this.elements; var x = 2 * near / ( right - left ); var y = 2 * near / ( top - bottom ); var a = ( right + left ) / ( right - left ); var b = ( top + bottom ) / ( top - bottom ); var c = - ( far + near ) / ( far - near ); var d = - 2 * far * near / ( far - near ); te[ 0 ] = x; te[ 4 ] = 0; te[ 8 ] = a; te[ 12 ] = 0; te[ 1 ] = 0; te[ 5 ] = y; te[ 9 ] = b; te[ 13 ] = 0; te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = c; te[ 14 ] = d; te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = - 1; te[ 15 ] = 0; return this; }, makeOrthographic: function ( left, right, top, bottom, near, far ) { var te = this.elements; var w = 1.0 / ( right - left ); var h = 1.0 / ( top - bottom ); var p = 1.0 / ( far - near ); var x = ( right + left ) * w; var y = ( top + bottom ) * h; var z = ( far + near ) * p; te[ 0 ] = 2 * w; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = - x; te[ 1 ] = 0; te[ 5 ] = 2 * h; te[ 9 ] = 0; te[ 13 ] = - y; te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = - 2 * p; te[ 14 ] = - z; te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = 1; return this; }, equals: function ( matrix ) { var te = this.elements; var me = matrix.elements; for ( var i = 0; i < 16; i ++ ) { if ( te[ i ] !== me[ i ] ) return false; } return true; }, fromArray: function ( array, offset ) { if ( offset === undefined ) offset = 0; for ( var i = 0; i < 16; i ++ ) { this.elements[ i ] = array[ i + offset ]; } return this; }, toArray: function ( array, offset ) { if ( array === undefined ) array = []; if ( offset === undefined ) offset = 0; var te = this.elements; array[ offset ] = te[ 0 ]; array[ offset + 1 ] = te[ 1 ]; array[ offset + 2 ] = te[ 2 ]; array[ offset + 3 ] = te[ 3 ]; array[ offset + 4 ] = te[ 4 ]; array[ offset + 5 ] = te[ 5 ]; array[ offset + 6 ] = te[ 6 ]; array[ offset + 7 ] = te[ 7 ]; array[ offset + 8 ] = te[ 8 ]; array[ offset + 9 ] = te[ 9 ]; array[ offset + 10 ] = te[ 10 ]; array[ offset + 11 ] = te[ 11 ]; array[ offset + 12 ] = te[ 12 ]; array[ offset + 13 ] = te[ 13 ]; array[ offset + 14 ] = te[ 14 ]; array[ offset + 15 ] = te[ 15 ]; return array; } } ); /** * @author alteredq / http://alteredqualia.com/ */ function DataTexture$1( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { Texture$1.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); this.image = { data: data, width: width, height: height }; this.magFilter = magFilter !== undefined ? magFilter : NearestFilter$1; this.minFilter = minFilter !== undefined ? minFilter : NearestFilter$1; this.generateMipmaps = false; this.flipY = false; this.unpackAlignment = 1; } DataTexture$1.prototype = Object.create( Texture$1.prototype ); DataTexture$1.prototype.constructor = DataTexture$1; DataTexture$1.prototype.isDataTexture = true; /** * @author mrdoob / http://mrdoob.com/ */ function CubeTexture$1( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { images = images !== undefined ? images : []; mapping = mapping !== undefined ? mapping : CubeReflectionMapping$1; Texture$1.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); this.flipY = false; } CubeTexture$1.prototype = Object.create( Texture$1.prototype ); CubeTexture$1.prototype.constructor = CubeTexture$1; CubeTexture$1.prototype.isCubeTexture = true; Object.defineProperty( CubeTexture$1.prototype, 'images', { get: function () { return this.image; }, set: function ( value ) { this.image = value; } } ); /** * @author tschw * * Uniforms of a program. * Those form a tree structure with a special top-level container for the root, * which you get by calling 'new WebGLUniforms( gl, program, renderer )'. * * * Properties of inner nodes including the top-level container: * * .seq - array of nested uniforms * .map - nested uniforms by name * * * Methods of all nodes except the top-level container: * * .setValue( gl, value, [renderer] ) * * uploads a uniform value(s) * the 'renderer' parameter is needed for sampler uniforms * * * Static methods of the top-level container (renderer factorizations): * * .upload( gl, seq, values, renderer ) * * sets uniforms in 'seq' to 'values[id].value' * * .seqWithValue( seq, values ) : filteredSeq * * filters 'seq' entries with corresponding entry in values * * * Methods of the top-level container (renderer factorizations): * * .setValue( gl, name, value ) * * sets uniform with name 'name' to 'value' * * .set( gl, obj, prop ) * * sets uniform from object and property with same name than uniform * * .setOptional( gl, obj, prop ) * * like .set for an optional property of the object * */ var emptyTexture$1 = new Texture$1(); var emptyCubeTexture$1 = new CubeTexture$1(); // --- Base for inner nodes (including the root) --- function UniformContainer$1() { this.seq = []; this.map = {}; } // --- Utilities --- // Array Caches (provide typed arrays for temporary by size) var arrayCacheF32$1 = []; var arrayCacheI32$1 = []; // Float32Array caches used for uploading Matrix uniforms var mat4array$1 = new Float32Array( 16 ); var mat3array$1 = new Float32Array( 9 ); // Flattening for arrays of vectors and matrices function flatten$1( array, nBlocks, blockSize ) { var firstElem = array[ 0 ]; if ( firstElem <= 0 || firstElem > 0 ) return array; // unoptimized: ! isNaN( firstElem ) // see http://jacksondunstan.com/articles/983 var n = nBlocks * blockSize, r = arrayCacheF32$1[ n ]; if ( r === undefined ) { r = new Float32Array( n ); arrayCacheF32$1[ n ] = r; } if ( nBlocks !== 0 ) { firstElem.toArray( r, 0 ); for ( var i = 1, offset = 0; i !== nBlocks; ++ i ) { offset += blockSize; array[ i ].toArray( r, offset ); } } return r; } // Texture unit allocation function allocTexUnits$1( renderer, n ) { var r = arrayCacheI32$1[ n ]; if ( r === undefined ) { r = new Int32Array( n ); arrayCacheI32$1[ n ] = r; } for ( var i = 0; i !== n; ++ i ) r[ i ] = renderer.allocTextureUnit(); return r; } // --- Setters --- // Note: Defining these methods externally, because they come in a bunch // and this way their names minify. // Single scalar function setValue1f$1( gl, v ) { gl.uniform1f( this.addr, v ); } function setValue1i$1( gl, v ) { gl.uniform1i( this.addr, v ); } // Single float vector (from flat array or THREE.VectorN) function setValue2fv$1( gl, v ) { if ( v.x === undefined ) gl.uniform2fv( this.addr, v ); else gl.uniform2f( this.addr, v.x, v.y ); } function setValue3fv$1( gl, v ) { if ( v.x !== undefined ) gl.uniform3f( this.addr, v.x, v.y, v.z ); else if ( v.r !== undefined ) gl.uniform3f( this.addr, v.r, v.g, v.b ); else gl.uniform3fv( this.addr, v ); } function setValue4fv$1( gl, v ) { if ( v.x === undefined ) gl.uniform4fv( this.addr, v ); else gl.uniform4f( this.addr, v.x, v.y, v.z, v.w ); } // Single matrix (from flat array or MatrixN) function setValue2fm$1( gl, v ) { gl.uniformMatrix2fv( this.addr, false, v.elements || v ); } function setValue3fm$1( gl, v ) { if ( v.elements === undefined ) { gl.uniformMatrix3fv( this.addr, false, v ); } else { mat3array$1.set( v.elements ); gl.uniformMatrix3fv( this.addr, false, mat3array$1 ); } } function setValue4fm$1( gl, v ) { if ( v.elements === undefined ) { gl.uniformMatrix4fv( this.addr, false, v ); } else { mat4array$1.set( v.elements ); gl.uniformMatrix4fv( this.addr, false, mat4array$1 ); } } // Single texture (2D / Cube) function setValueT1$1( gl, v, renderer ) { var unit = renderer.allocTextureUnit(); gl.uniform1i( this.addr, unit ); renderer.setTexture2D( v || emptyTexture$1, unit ); } function setValueT6$1( gl, v, renderer ) { var unit = renderer.allocTextureUnit(); gl.uniform1i( this.addr, unit ); renderer.setTextureCube( v || emptyCubeTexture$1, unit ); } // Integer / Boolean vectors or arrays thereof (always flat arrays) function setValue2iv$1( gl, v ) { gl.uniform2iv( this.addr, v ); } function setValue3iv$1( gl, v ) { gl.uniform3iv( this.addr, v ); } function setValue4iv$1( gl, v ) { gl.uniform4iv( this.addr, v ); } // Helper to pick the right setter for the singular case function getSingularSetter$1( type ) { switch ( type ) { case 0x1406: return setValue1f$1; // FLOAT case 0x8b50: return setValue2fv$1; // _VEC2 case 0x8b51: return setValue3fv$1; // _VEC3 case 0x8b52: return setValue4fv$1; // _VEC4 case 0x8b5a: return setValue2fm$1; // _MAT2 case 0x8b5b: return setValue3fm$1; // _MAT3 case 0x8b5c: return setValue4fm$1; // _MAT4 case 0x8b5e: return setValueT1$1; // SAMPLER_2D case 0x8b60: return setValueT6$1; // SAMPLER_CUBE case 0x1404: case 0x8b56: return setValue1i$1; // INT, BOOL case 0x8b53: case 0x8b57: return setValue2iv$1; // _VEC2 case 0x8b54: case 0x8b58: return setValue3iv$1; // _VEC3 case 0x8b55: case 0x8b59: return setValue4iv$1; // _VEC4 } } // Array of scalars function setValue1fv$1( gl, v ) { gl.uniform1fv( this.addr, v ); } function setValue1iv$1( gl, v ) { gl.uniform1iv( this.addr, v ); } // Array of vectors (flat or from THREE classes) function setValueV2a$1( gl, v ) { gl.uniform2fv( this.addr, flatten$1( v, this.size, 2 ) ); } function setValueV3a$1( gl, v ) { gl.uniform3fv( this.addr, flatten$1( v, this.size, 3 ) ); } function setValueV4a$1( gl, v ) { gl.uniform4fv( this.addr, flatten$1( v, this.size, 4 ) ); } // Array of matrices (flat or from THREE clases) function setValueM2a$1( gl, v ) { gl.uniformMatrix2fv( this.addr, false, flatten$1( v, this.size, 4 ) ); } function setValueM3a$1( gl, v ) { gl.uniformMatrix3fv( this.addr, false, flatten$1( v, this.size, 9 ) ); } function setValueM4a$1( gl, v ) { gl.uniformMatrix4fv( this.addr, false, flatten$1( v, this.size, 16 ) ); } // Array of textures (2D / Cube) function setValueT1a$1( gl, v, renderer ) { var n = v.length, units = allocTexUnits$1( renderer, n ); gl.uniform1iv( this.addr, units ); for ( var i = 0; i !== n; ++ i ) { renderer.setTexture2D( v[ i ] || emptyTexture$1, units[ i ] ); } } function setValueT6a$1( gl, v, renderer ) { var n = v.length, units = allocTexUnits$1( renderer, n ); gl.uniform1iv( this.addr, units ); for ( var i = 0; i !== n; ++ i ) { renderer.setTextureCube( v[ i ] || emptyCubeTexture$1, units[ i ] ); } } // Helper to pick the right setter for a pure (bottom-level) array function getPureArraySetter$1( type ) { switch ( type ) { case 0x1406: return setValue1fv$1; // FLOAT case 0x8b50: return setValueV2a$1; // _VEC2 case 0x8b51: return setValueV3a$1; // _VEC3 case 0x8b52: return setValueV4a$1; // _VEC4 case 0x8b5a: return setValueM2a$1; // _MAT2 case 0x8b5b: return setValueM3a$1; // _MAT3 case 0x8b5c: return setValueM4a$1; // _MAT4 case 0x8b5e: return setValueT1a$1; // SAMPLER_2D case 0x8b60: return setValueT6a$1; // SAMPLER_CUBE case 0x1404: case 0x8b56: return setValue1iv$1; // INT, BOOL case 0x8b53: case 0x8b57: return setValue2iv$1; // _VEC2 case 0x8b54: case 0x8b58: return setValue3iv$1; // _VEC3 case 0x8b55: case 0x8b59: return setValue4iv$1; // _VEC4 } } // --- Uniform Classes --- function SingleUniform$1( id, activeInfo, addr ) { this.id = id; this.addr = addr; this.setValue = getSingularSetter$1( activeInfo.type ); // this.path = activeInfo.name; // DEBUG } function PureArrayUniform$1( id, activeInfo, addr ) { this.id = id; this.addr = addr; this.size = activeInfo.size; this.setValue = getPureArraySetter$1( activeInfo.type ); // this.path = activeInfo.name; // DEBUG } function StructuredUniform$1( id ) { this.id = id; UniformContainer$1.call( this ); // mix-in } StructuredUniform$1.prototype.setValue = function ( gl, value ) { // Note: Don't need an extra 'renderer' parameter, since samplers // are not allowed in structured uniforms. var seq = this.seq; for ( var i = 0, n = seq.length; i !== n; ++ i ) { var u = seq[ i ]; u.setValue( gl, value[ u.id ] ); } }; // --- Top-level --- // Parser - builds up the property tree from the path strings var RePathPart$1 = /([\w\d_]+)(\])?(\[|\.)?/g; // extracts // - the identifier (member name or array index) // - followed by an optional right bracket (found when array index) // - followed by an optional left bracket or dot (type of subscript) // // Note: These portions can be read in a non-overlapping fashion and // allow straightforward parsing of the hierarchy that WebGL encodes // in the uniform names. function addUniform$1( container, uniformObject ) { container.seq.push( uniformObject ); container.map[ uniformObject.id ] = uniformObject; } function parseUniform$1( activeInfo, addr, container ) { var path = activeInfo.name, pathLength = path.length; // reset RegExp object, because of the early exit of a previous run RePathPart$1.lastIndex = 0; for ( ; ; ) { var match = RePathPart$1.exec( path ), matchEnd = RePathPart$1.lastIndex, id = match[ 1 ], idIsIndex = match[ 2 ] === ']', subscript = match[ 3 ]; if ( idIsIndex ) id = id | 0; // convert to integer if ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) { // bare name or "pure" bottom-level array "[0]" suffix addUniform$1( container, subscript === undefined ? new SingleUniform$1( id, activeInfo, addr ) : new PureArrayUniform$1( id, activeInfo, addr ) ); break; } else { // step into inner node / create it in case it doesn't exist var map = container.map, next = map[ id ]; if ( next === undefined ) { next = new StructuredUniform$1( id ); addUniform$1( container, next ); } container = next; } } } // Root Container function WebGLUniforms$1( gl, program, renderer ) { UniformContainer$1.call( this ); this.renderer = renderer; var n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS ); for ( var i = 0; i < n; ++ i ) { var info = gl.getActiveUniform( program, i ), path = info.name, addr = gl.getUniformLocation( program, path ); parseUniform$1( info, addr, this ); } } WebGLUniforms$1.prototype.setValue = function ( gl, name, value ) { var u = this.map[ name ]; if ( u !== undefined ) u.setValue( gl, value, this.renderer ); }; WebGLUniforms$1.prototype.setOptional = function ( gl, object, name ) { var v = object[ name ]; if ( v !== undefined ) this.setValue( gl, name, v ); }; // Static interface WebGLUniforms$1.upload = function ( gl, seq, values, renderer ) { for ( var i = 0, n = seq.length; i !== n; ++ i ) { var u = seq[ i ], v = values[ u.id ]; if ( v.needsUpdate !== false ) { // note: always updating when .needsUpdate is undefined u.setValue( gl, v.value, renderer ); } } }; WebGLUniforms$1.seqWithValue = function ( seq, values ) { var r = []; for ( var i = 0, n = seq.length; i !== n; ++ i ) { var u = seq[ i ]; if ( u.id in values ) r.push( u ); } return r; }; /** * @author mrdoob / http://mrdoob.com/ */ var ColorKeywords$1 = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF, 'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2, 'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50, 'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B, 'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B, 'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F, 'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3, 'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222, 'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700, 'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4, 'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00, 'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3, 'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA, 'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32, 'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3, 'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC, 'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD, 'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6, 'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9, 'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F, 'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE, 'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA, 'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0, 'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 }; function Color$1( r, g, b ) { if ( g === undefined && b === undefined ) { // r is THREE.Color, hex or string return this.set( r ); } return this.setRGB( r, g, b ); } Object.assign( Color$1.prototype, { isColor: true, r: 1, g: 1, b: 1, set: function ( value ) { if ( value && value.isColor ) { this.copy( value ); } else if ( typeof value === 'number' ) { this.setHex( value ); } else if ( typeof value === 'string' ) { this.setStyle( value ); } return this; }, setScalar: function ( scalar ) { this.r = scalar; this.g = scalar; this.b = scalar; return this; }, setHex: function ( hex ) { hex = Math.floor( hex ); this.r = ( hex >> 16 & 255 ) / 255; this.g = ( hex >> 8 & 255 ) / 255; this.b = ( hex & 255 ) / 255; return this; }, setRGB: function ( r, g, b ) { this.r = r; this.g = g; this.b = b; return this; }, setHSL: function () { function hue2rgb( p, q, t ) { if ( t < 0 ) t += 1; if ( t > 1 ) t -= 1; if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t; if ( t < 1 / 2 ) return q; if ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t ); return p; } return function setHSL( h, s, l ) { // h,s,l ranges are in 0.0 - 1.0 h = _Math$1.euclideanModulo( h, 1 ); s = _Math$1.clamp( s, 0, 1 ); l = _Math$1.clamp( l, 0, 1 ); if ( s === 0 ) { this.r = this.g = this.b = l; } else { var p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s ); var q = ( 2 * l ) - p; this.r = hue2rgb( q, p, h + 1 / 3 ); this.g = hue2rgb( q, p, h ); this.b = hue2rgb( q, p, h - 1 / 3 ); } return this; }; }(), setStyle: function ( style ) { function handleAlpha( string ) { if ( string === undefined ) return; if ( parseFloat( string ) < 1 ) { console.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' ); } } var m; if ( m = /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec( style ) ) { // rgb / hsl var color; var name = m[ 1 ]; var components = m[ 2 ]; switch ( name ) { case 'rgb': case 'rgba': if ( color = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { // rgb(255,0,0) rgba(255,0,0,0.5) this.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255; this.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255; this.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255; handleAlpha( color[ 5 ] ); return this; } if ( color = /^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { // rgb(100%,0%,0%) rgba(100%,0%,0%,0.5) this.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100; this.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100; this.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100; handleAlpha( color[ 5 ] ); return this; } break; case 'hsl': case 'hsla': if ( color = /^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { // hsl(120,50%,50%) hsla(120,50%,50%,0.5) var h = parseFloat( color[ 1 ] ) / 360; var s = parseInt( color[ 2 ], 10 ) / 100; var l = parseInt( color[ 3 ], 10 ) / 100; handleAlpha( color[ 5 ] ); return this.setHSL( h, s, l ); } break; } } else if ( m = /^\#([A-Fa-f0-9]+)$/.exec( style ) ) { // hex color var hex = m[ 1 ]; var size = hex.length; if ( size === 3 ) { // #ff0 this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255; this.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255; this.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255; return this; } else if ( size === 6 ) { // #ff0000 this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255; this.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255; this.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255; return this; } } if ( style && style.length > 0 ) { // color keywords var hex = ColorKeywords$1[ style ]; if ( hex !== undefined ) { // red this.setHex( hex ); } else { // unknown color console.warn( 'THREE.Color: Unknown color ' + style ); } } return this; }, clone: function () { return new this.constructor( this.r, this.g, this.b ); }, copy: function ( color ) { this.r = color.r; this.g = color.g; this.b = color.b; return this; }, copyGammaToLinear: function ( color, gammaFactor ) { if ( gammaFactor === undefined ) gammaFactor = 2.0; this.r = Math.pow( color.r, gammaFactor ); this.g = Math.pow( color.g, gammaFactor ); this.b = Math.pow( color.b, gammaFactor ); return this; }, copyLinearToGamma: function ( color, gammaFactor ) { if ( gammaFactor === undefined ) gammaFactor = 2.0; var safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0; this.r = Math.pow( color.r, safeInverse ); this.g = Math.pow( color.g, safeInverse ); this.b = Math.pow( color.b, safeInverse ); return this; }, convertGammaToLinear: function () { var r = this.r, g = this.g, b = this.b; this.r = r * r; this.g = g * g; this.b = b * b; return this; }, convertLinearToGamma: function () { this.r = Math.sqrt( this.r ); this.g = Math.sqrt( this.g ); this.b = Math.sqrt( this.b ); return this; }, getHex: function () { return ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0; }, getHexString: function () { return ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 ); }, getHSL: function ( optionalTarget ) { // h,s,l ranges are in 0.0 - 1.0 var hsl = optionalTarget || { h: 0, s: 0, l: 0 }; var r = this.r, g = this.g, b = this.b; var max = Math.max( r, g, b ); var min = Math.min( r, g, b ); var hue, saturation; var lightness = ( min + max ) / 2.0; if ( min === max ) { hue = 0; saturation = 0; } else { var delta = max - min; saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min ); switch ( max ) { case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break; case g: hue = ( b - r ) / delta + 2; break; case b: hue = ( r - g ) / delta + 4; break; } hue /= 6; } hsl.h = hue; hsl.s = saturation; hsl.l = lightness; return hsl; }, getStyle: function () { return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')'; }, offsetHSL: function ( h, s, l ) { var hsl = this.getHSL(); hsl.h += h; hsl.s += s; hsl.l += l; this.setHSL( hsl.h, hsl.s, hsl.l ); return this; }, add: function ( color ) { this.r += color.r; this.g += color.g; this.b += color.b; return this; }, addColors: function ( color1, color2 ) { this.r = color1.r + color2.r; this.g = color1.g + color2.g; this.b = color1.b + color2.b; return this; }, addScalar: function ( s ) { this.r += s; this.g += s; this.b += s; return this; }, sub: function( color ) { this.r = Math.max( 0, this.r - color.r ); this.g = Math.max( 0, this.g - color.g ); this.b = Math.max( 0, this.b - color.b ); return this; }, multiply: function ( color ) { this.r *= color.r; this.g *= color.g; this.b *= color.b; return this; }, multiplyScalar: function ( s ) { this.r *= s; this.g *= s; this.b *= s; return this; }, lerp: function ( color, alpha ) { this.r += ( color.r - this.r ) * alpha; this.g += ( color.g - this.g ) * alpha; this.b += ( color.b - this.b ) * alpha; return this; }, equals: function ( c ) { return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b ); }, fromArray: function ( array, offset ) { if ( offset === undefined ) offset = 0; this.r = array[ offset ]; this.g = array[ offset + 1 ]; this.b = array[ offset + 2 ]; return this; }, toArray: function ( array, offset ) { if ( array === undefined ) array = []; if ( offset === undefined ) offset = 0; array[ offset ] = this.r; array[ offset + 1 ] = this.g; array[ offset + 2 ] = this.b; return array; }, toJSON: function () { return this.getHex(); } } ); /** * Uniforms library for shared webgl shaders */ var UniformsLib$1 = { common: { diffuse: { value: new Color$1( 0xeeeeee ) }, opacity: { value: 1.0 }, map: { value: null }, offsetRepeat: { value: new Vector4$1( 0, 0, 1, 1 ) }, specularMap: { value: null }, alphaMap: { value: null }, envMap: { value: null }, flipEnvMap: { value: - 1 }, reflectivity: { value: 1.0 }, refractionRatio: { value: 0.98 } }, aomap: { aoMap: { value: null }, aoMapIntensity: { value: 1 } }, lightmap: { lightMap: { value: null }, lightMapIntensity: { value: 1 } }, emissivemap: { emissiveMap: { value: null } }, bumpmap: { bumpMap: { value: null }, bumpScale: { value: 1 } }, normalmap: { normalMap: { value: null }, normalScale: { value: new Vector2$1( 1, 1 ) } }, displacementmap: { displacementMap: { value: null }, displacementScale: { value: 1 }, displacementBias: { value: 0 } }, roughnessmap: { roughnessMap: { value: null } }, metalnessmap: { metalnessMap: { value: null } }, gradientmap: { gradientMap: { value: null } }, fog: { fogDensity: { value: 0.00025 }, fogNear: { value: 1 }, fogFar: { value: 2000 }, fogColor: { value: new Color$1( 0xffffff ) } }, lights: { ambientLightColor: { value: [] }, directionalLights: { value: [], properties: { direction: {}, color: {}, shadow: {}, shadowBias: {}, shadowRadius: {}, shadowMapSize: {} } }, directionalShadowMap: { value: [] }, directionalShadowMatrix: { value: [] }, spotLights: { value: [], properties: { color: {}, position: {}, direction: {}, distance: {}, coneCos: {}, penumbraCos: {}, decay: {}, shadow: {}, shadowBias: {}, shadowRadius: {}, shadowMapSize: {} } }, spotShadowMap: { value: [] }, spotShadowMatrix: { value: [] }, pointLights: { value: [], properties: { color: {}, position: {}, decay: {}, distance: {}, shadow: {}, shadowBias: {}, shadowRadius: {}, shadowMapSize: {} } }, pointShadowMap: { value: [] }, pointShadowMatrix: { value: [] }, hemisphereLights: { value: [], properties: { direction: {}, skyColor: {}, groundColor: {} } }, // TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src rectAreaLights: { value: [], properties: { color: {}, position: {}, width: {}, height: {} } } }, points: { diffuse: { value: new Color$1( 0xeeeeee ) }, opacity: { value: 1.0 }, size: { value: 1.0 }, scale: { value: 1.0 }, map: { value: null }, offsetRepeat: { value: new Vector4$1( 0, 0, 1, 1 ) } } }; /** * Uniform Utilities */ var UniformsUtils$1 = { merge: function ( uniforms ) { var merged = {}; for ( var u = 0; u < uniforms.length; u ++ ) { var tmp = this.clone( uniforms[ u ] ); for ( var p in tmp ) { merged[ p ] = tmp[ p ]; } } return merged; }, clone: function ( uniforms_src ) { var uniforms_dst = {}; for ( var u in uniforms_src ) { uniforms_dst[ u ] = {}; for ( var p in uniforms_src[ u ] ) { var parameter_src = uniforms_src[ u ][ p ]; if ( parameter_src && ( parameter_src.isColor || parameter_src.isMatrix3 || parameter_src.isMatrix4 || parameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 || parameter_src.isTexture ) ) { uniforms_dst[ u ][ p ] = parameter_src.clone(); } else if ( Array.isArray( parameter_src ) ) { uniforms_dst[ u ][ p ] = parameter_src.slice(); } else { uniforms_dst[ u ][ p ] = parameter_src; } } } return uniforms_dst; } }; var alphamap_fragment$1 = "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n"; var alphamap_pars_fragment$1 = "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n"; var alphatest_fragment$1 = "#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n"; var aomap_fragment$1 = "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n"; var aomap_pars_fragment$1 = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif"; var begin_vertex$1 = "\nvec3 transformed = vec3( position );\n"; var beginnormal_vertex$1 = "\nvec3 objectNormal = vec3( normal );\n"; var bsdfs$1 = "float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat theta = acos( dot( N, V ) );\n\tvec2 uv = vec2(\n\t\tsqrt( saturate( roughness ) ),\n\t\tsaturate( theta / ( 0.5 * PI ) ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.86267 + (0.49788 + 0.01436 * y ) * y;\n\tfloat b = 3.45068 + (4.18814 + y) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = (x > 0.0) ? v : 0.5 * inversesqrt( 1.0 - x * x ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tvec3 result = vec3( LTC_ClippedSphereFormFactor( vectorFormFactor ) );\n\treturn result;\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n"; var bumpmap_pars_fragment$1 = "#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = dFdx( surf_pos );\n\t\tvec3 vSigmaY = dFdy( surf_pos );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n"; var clipping_planes_fragment$1 = "#if NUM_CLIPPING_PLANES > 0\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\n\t\tvec4 plane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t\t\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\n\t\t\tvec4 plane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t\n\t#endif\n#endif\n"; var clipping_planes_pars_fragment$1 = "#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n"; var clipping_planes_pars_vertex$1 = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n"; var clipping_planes_vertex$1 = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n"; var color_fragment$1 = "#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif"; var color_pars_fragment$1 = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n"; var color_pars_vertex$1 = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif"; var color_vertex$1 = "#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif"; var common$1 = "#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transpose( const in mat3 v ) {\n\tmat3 tmp;\n\ttmp[0] = vec3(v[0].x, v[1].x, v[2].x);\n\ttmp[1] = vec3(v[0].y, v[1].y, v[2].y);\n\ttmp[2] = vec3(v[0].z, v[1].z, v[2].z);\n\treturn tmp;\n}\n"; var cube_uv_reflection_fragment$1 = "#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale = bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n"; var defaultnormal_vertex$1 = "#ifdef FLIP_SIDED\n\tobjectNormal = -objectNormal;\n#endif\nvec3 transformedNormal = normalMatrix * objectNormal;\n"; var displacementmap_pars_vertex$1 = "#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n"; var displacementmap_vertex$1 = "#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n"; var emissivemap_fragment$1 = "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n"; var emissivemap_pars_fragment$1 = "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n"; var encodings_fragment$1 = " gl_FragColor = linearToOutputTexel( gl_FragColor );\n"; var encodings_pars_fragment$1 = "\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract(Le);\n\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4( max(vRGB, 0.0), 1.0 );\n}\n"; var envmap_fragment$1 = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n"; var envmap_pars_fragment$1 = "#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n"; var envmap_pars_vertex$1 = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n"; var envmap_vertex$1 = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n"; var fog_vertex$1 = "\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif"; var fog_pars_vertex$1 = "#ifdef USE_FOG\n varying float fogDepth;\n#endif\n"; var fog_fragment$1 = "#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n"; var fog_pars_fragment$1 = "#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif\n"; var gradientmap_pars_fragment$1 = "#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n"; var lightmap_fragment$1 = "#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n"; var lightmap_pars_fragment$1 = "#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif"; var lights_lambert_vertex$1 = "vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n"; var lights_pars = "uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltcMat;\tuniform sampler2D ltcMag;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = saturate( reflectVec.y * 0.5 + 0.5 );\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n"; var lights_phong_fragment$1 = "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n"; var lights_phong_pars_fragment$1 = "varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_BlinnPhong( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = BlinnExponentToGGXRoughness( material.specularShininess );\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tfloat norm = texture2D( ltcMag, uv ).a;\n\t\tvec4 t = texture2D( ltcMat, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( 1, 0, t.y ),\n\t\t\tvec3( 0, t.z, 0 ),\n\t\t\tvec3( t.w, 0, t.x )\n\t\t);\n\t\treflectedLight.directSpecular += lightColor * material.specularColor * norm * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n"; var lights_physical_fragment$1 = "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n"; var lights_physical_pars_fragment$1 = "struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tfloat norm = texture2D( ltcMag, uv ).a;\n\t\tvec4 t = texture2D( ltcMat, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( 1, 0, t.y ),\n\t\t\tvec3( 0, t.z, 0 ),\n\t\t\tvec3( t.w, 0, t.x )\n\t\t);\n\t\treflectedLight.directSpecular += lightColor * material.specularColor * norm * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n"; var lights_template = "\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\n\t#ifndef STANDARD\n\t\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\n\t#else\n\t\tvec3 clearCoatRadiance = vec3( 0.0 );\n\t#endif\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n"; var logdepthbuf_fragment$1 = "#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n#endif"; var logdepthbuf_pars_fragment$1 = "#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n"; var logdepthbuf_pars_vertex$1 = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif"; var logdepthbuf_vertex$1 = "#ifdef USE_LOGDEPTHBUF\n\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\n\t#endif\n#endif\n"; var map_fragment$1 = "#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n"; var map_pars_fragment$1 = "#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n"; var map_particle_fragment$1 = "#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n"; var map_particle_pars_fragment$1 = "#ifdef USE_MAP\n\tuniform vec4 offsetRepeat;\n\tuniform sampler2D map;\n#endif\n"; var metalnessmap_fragment$1 = "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n"; var metalnessmap_pars_fragment$1 = "#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif"; var morphnormal_vertex$1 = "#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n"; var morphtarget_pars_vertex$1 = "#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif"; var morphtarget_vertex$1 = "#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n"; var normal_flip = "#ifdef DOUBLE_SIDED\n\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n#else\n\tfloat flipNormal = 1.0;\n#endif\n"; var normal_fragment = "#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal ) * flipNormal;\n#endif\n#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n"; var normalmap_pars_fragment$1 = "#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\n\t\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n"; var packing$1 = "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 1.0 - 2.0 * rgb.xyz;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n"; var premultiplied_alpha_fragment$1 = "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n"; var project_vertex$1 = "#ifdef USE_SKINNING\n\tvec4 mvPosition = modelViewMatrix * skinned;\n#else\n\tvec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n#endif\ngl_Position = projectionMatrix * mvPosition;\n"; var dithering_fragment$1 = "#if defined( DITHERING )\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n"; var dithering_pars_fragment$1 = "#if defined( DITHERING )\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif\n"; var roughnessmap_fragment$1 = "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n"; var roughnessmap_pars_fragment$1 = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif"; var shadowmap_pars_fragment$1 = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\treturn (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn 1.0;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n"; var shadowmap_pars_vertex$1 = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n"; var shadowmap_vertex$1 = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n"; var shadowmask_pars_fragment$1 = "float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n"; var skinbase_vertex$1 = "#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif"; var skinning_pars_vertex$1 = "#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n"; var skinning_vertex$1 = "#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\tskinned = bindMatrixInverse * skinned;\n#endif\n"; var skinnormal_vertex$1 = "#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n"; var specularmap_fragment$1 = "float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif"; var specularmap_pars_fragment$1 = "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif"; var tonemapping_fragment$1 = "#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n"; var tonemapping_pars_fragment$1 = "#define saturate(a) clamp( a, 0.0, 1.0 )\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n"; var uv_pars_fragment$1 = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif"; var uv_pars_vertex$1 = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform vec4 offsetRepeat;\n#endif\n"; var uv_vertex$1 = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n#endif"; var uv2_pars_fragment$1 = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif"; var uv2_pars_vertex$1 = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif"; var uv2_vertex$1 = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif"; var worldpos_vertex$1 = "#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n\t#ifdef USE_SKINNING\n\t\tvec4 worldPosition = modelMatrix * skinned;\n\t#else\n\t\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n\t#endif\n#endif\n"; var cube_frag$1 = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\n#include \nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n"; var cube_vert$1 = "varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n"; var depth_frag$1 = "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n"; var depth_vert$1 = "#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; var distanceRGBA_frag$1 = "uniform vec3 lightPos;\nvarying vec4 vWorldPosition;\n#include \n#include \n#include \nvoid main () {\n\t#include \n\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\n}\n"; var distanceRGBA_vert$1 = "varying vec4 vWorldPosition;\n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition;\n}\n"; var equirect_frag$1 = "uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n"; var equirect_vert$1 = "varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n"; var linedashed_frag$1 = "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; var linedashed_vert$1 = "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}\n"; var meshbasic_frag$1 = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; var meshbasic_vert$1 = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; var meshlambert_frag$1 = "uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include \n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; var meshlambert_vert$1 = "#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; var meshphong_frag$1 = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; var meshphong_vert$1 = "#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; var meshphysical_frag$1 = "#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; var meshphysical_vert$1 = "#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}\n"; var normal_frag$1 = "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n"; var normal_vert$1 = "#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n"; var points_frag$1 = "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; var points_vert$1 = "uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; var shadow_frag$1 = "uniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\n}\n"; var shadow_vert$1 = "#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; var ShaderChunk$1 = { alphamap_fragment: alphamap_fragment$1, alphamap_pars_fragment: alphamap_pars_fragment$1, alphatest_fragment: alphatest_fragment$1, aomap_fragment: aomap_fragment$1, aomap_pars_fragment: aomap_pars_fragment$1, begin_vertex: begin_vertex$1, beginnormal_vertex: beginnormal_vertex$1, bsdfs: bsdfs$1, bumpmap_pars_fragment: bumpmap_pars_fragment$1, clipping_planes_fragment: clipping_planes_fragment$1, clipping_planes_pars_fragment: clipping_planes_pars_fragment$1, clipping_planes_pars_vertex: clipping_planes_pars_vertex$1, clipping_planes_vertex: clipping_planes_vertex$1, color_fragment: color_fragment$1, color_pars_fragment: color_pars_fragment$1, color_pars_vertex: color_pars_vertex$1, color_vertex: color_vertex$1, common: common$1, cube_uv_reflection_fragment: cube_uv_reflection_fragment$1, defaultnormal_vertex: defaultnormal_vertex$1, displacementmap_pars_vertex: displacementmap_pars_vertex$1, displacementmap_vertex: displacementmap_vertex$1, emissivemap_fragment: emissivemap_fragment$1, emissivemap_pars_fragment: emissivemap_pars_fragment$1, encodings_fragment: encodings_fragment$1, encodings_pars_fragment: encodings_pars_fragment$1, envmap_fragment: envmap_fragment$1, envmap_pars_fragment: envmap_pars_fragment$1, envmap_pars_vertex: envmap_pars_vertex$1, envmap_vertex: envmap_vertex$1, fog_vertex: fog_vertex$1, fog_pars_vertex: fog_pars_vertex$1, fog_fragment: fog_fragment$1, fog_pars_fragment: fog_pars_fragment$1, gradientmap_pars_fragment: gradientmap_pars_fragment$1, lightmap_fragment: lightmap_fragment$1, lightmap_pars_fragment: lightmap_pars_fragment$1, lights_lambert_vertex: lights_lambert_vertex$1, lights_pars: lights_pars, lights_phong_fragment: lights_phong_fragment$1, lights_phong_pars_fragment: lights_phong_pars_fragment$1, lights_physical_fragment: lights_physical_fragment$1, lights_physical_pars_fragment: lights_physical_pars_fragment$1, lights_template: lights_template, logdepthbuf_fragment: logdepthbuf_fragment$1, logdepthbuf_pars_fragment: logdepthbuf_pars_fragment$1, logdepthbuf_pars_vertex: logdepthbuf_pars_vertex$1, logdepthbuf_vertex: logdepthbuf_vertex$1, map_fragment: map_fragment$1, map_pars_fragment: map_pars_fragment$1, map_particle_fragment: map_particle_fragment$1, map_particle_pars_fragment: map_particle_pars_fragment$1, metalnessmap_fragment: metalnessmap_fragment$1, metalnessmap_pars_fragment: metalnessmap_pars_fragment$1, morphnormal_vertex: morphnormal_vertex$1, morphtarget_pars_vertex: morphtarget_pars_vertex$1, morphtarget_vertex: morphtarget_vertex$1, normal_flip: normal_flip, normal_fragment: normal_fragment, normalmap_pars_fragment: normalmap_pars_fragment$1, packing: packing$1, premultiplied_alpha_fragment: premultiplied_alpha_fragment$1, project_vertex: project_vertex$1, dithering_fragment: dithering_fragment$1, dithering_pars_fragment: dithering_pars_fragment$1, roughnessmap_fragment: roughnessmap_fragment$1, roughnessmap_pars_fragment: roughnessmap_pars_fragment$1, shadowmap_pars_fragment: shadowmap_pars_fragment$1, shadowmap_pars_vertex: shadowmap_pars_vertex$1, shadowmap_vertex: shadowmap_vertex$1, shadowmask_pars_fragment: shadowmask_pars_fragment$1, skinbase_vertex: skinbase_vertex$1, skinning_pars_vertex: skinning_pars_vertex$1, skinning_vertex: skinning_vertex$1, skinnormal_vertex: skinnormal_vertex$1, specularmap_fragment: specularmap_fragment$1, specularmap_pars_fragment: specularmap_pars_fragment$1, tonemapping_fragment: tonemapping_fragment$1, tonemapping_pars_fragment: tonemapping_pars_fragment$1, uv_pars_fragment: uv_pars_fragment$1, uv_pars_vertex: uv_pars_vertex$1, uv_vertex: uv_vertex$1, uv2_pars_fragment: uv2_pars_fragment$1, uv2_pars_vertex: uv2_pars_vertex$1, uv2_vertex: uv2_vertex$1, worldpos_vertex: worldpos_vertex$1, cube_frag: cube_frag$1, cube_vert: cube_vert$1, depth_frag: depth_frag$1, depth_vert: depth_vert$1, distanceRGBA_frag: distanceRGBA_frag$1, distanceRGBA_vert: distanceRGBA_vert$1, equirect_frag: equirect_frag$1, equirect_vert: equirect_vert$1, linedashed_frag: linedashed_frag$1, linedashed_vert: linedashed_vert$1, meshbasic_frag: meshbasic_frag$1, meshbasic_vert: meshbasic_vert$1, meshlambert_frag: meshlambert_frag$1, meshlambert_vert: meshlambert_vert$1, meshphong_frag: meshphong_frag$1, meshphong_vert: meshphong_vert$1, meshphysical_frag: meshphysical_frag$1, meshphysical_vert: meshphysical_vert$1, normal_frag: normal_frag$1, normal_vert: normal_vert$1, points_frag: points_frag$1, points_vert: points_vert$1, shadow_frag: shadow_frag$1, shadow_vert: shadow_vert$1 }; /** * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ * @author mikael emtinger / http://gomo.se/ */ var ShaderLib$1 = { basic: { uniforms: UniformsUtils$1.merge( [ UniformsLib$1.common, UniformsLib$1.aomap, UniformsLib$1.lightmap, UniformsLib$1.fog ] ), vertexShader: ShaderChunk$1.meshbasic_vert, fragmentShader: ShaderChunk$1.meshbasic_frag }, lambert: { uniforms: UniformsUtils$1.merge( [ UniformsLib$1.common, UniformsLib$1.aomap, UniformsLib$1.lightmap, UniformsLib$1.emissivemap, UniformsLib$1.fog, UniformsLib$1.lights, { emissive: { value: new Color$1( 0x000000 ) } } ] ), vertexShader: ShaderChunk$1.meshlambert_vert, fragmentShader: ShaderChunk$1.meshlambert_frag }, phong: { uniforms: UniformsUtils$1.merge( [ UniformsLib$1.common, UniformsLib$1.aomap, UniformsLib$1.lightmap, UniformsLib$1.emissivemap, UniformsLib$1.bumpmap, UniformsLib$1.normalmap, UniformsLib$1.displacementmap, UniformsLib$1.gradientmap, UniformsLib$1.fog, UniformsLib$1.lights, { emissive: { value: new Color$1( 0x000000 ) }, specular: { value: new Color$1( 0x111111 ) }, shininess: { value: 30 } } ] ), vertexShader: ShaderChunk$1.meshphong_vert, fragmentShader: ShaderChunk$1.meshphong_frag }, standard: { uniforms: UniformsUtils$1.merge( [ UniformsLib$1.common, UniformsLib$1.aomap, UniformsLib$1.lightmap, UniformsLib$1.emissivemap, UniformsLib$1.bumpmap, UniformsLib$1.normalmap, UniformsLib$1.displacementmap, UniformsLib$1.roughnessmap, UniformsLib$1.metalnessmap, UniformsLib$1.fog, UniformsLib$1.lights, { emissive: { value: new Color$1( 0x000000 ) }, roughness: { value: 0.5 }, metalness: { value: 0.5 }, envMapIntensity: { value: 1 } // temporary } ] ), vertexShader: ShaderChunk$1.meshphysical_vert, fragmentShader: ShaderChunk$1.meshphysical_frag }, points: { uniforms: UniformsUtils$1.merge( [ UniformsLib$1.points, UniformsLib$1.fog ] ), vertexShader: ShaderChunk$1.points_vert, fragmentShader: ShaderChunk$1.points_frag }, dashed: { uniforms: UniformsUtils$1.merge( [ UniformsLib$1.common, UniformsLib$1.fog, { scale: { value: 1 }, dashSize: { value: 1 }, totalSize: { value: 2 } } ] ), vertexShader: ShaderChunk$1.linedashed_vert, fragmentShader: ShaderChunk$1.linedashed_frag }, depth: { uniforms: UniformsUtils$1.merge( [ UniformsLib$1.common, UniformsLib$1.displacementmap ] ), vertexShader: ShaderChunk$1.depth_vert, fragmentShader: ShaderChunk$1.depth_frag }, normal: { uniforms: UniformsUtils$1.merge( [ UniformsLib$1.common, UniformsLib$1.bumpmap, UniformsLib$1.normalmap, UniformsLib$1.displacementmap, { opacity: { value: 1.0 } } ] ), vertexShader: ShaderChunk$1.normal_vert, fragmentShader: ShaderChunk$1.normal_frag }, /* ------------------------------------------------------------------------- // Cube map shader ------------------------------------------------------------------------- */ cube: { uniforms: { tCube: { value: null }, tFlip: { value: - 1 }, opacity: { value: 1.0 } }, vertexShader: ShaderChunk$1.cube_vert, fragmentShader: ShaderChunk$1.cube_frag }, /* ------------------------------------------------------------------------- // Cube map shader ------------------------------------------------------------------------- */ equirect: { uniforms: { tEquirect: { value: null }, tFlip: { value: - 1 } }, vertexShader: ShaderChunk$1.equirect_vert, fragmentShader: ShaderChunk$1.equirect_frag }, distanceRGBA: { uniforms: { lightPos: { value: new Vector3$1() } }, vertexShader: ShaderChunk$1.distanceRGBA_vert, fragmentShader: ShaderChunk$1.distanceRGBA_frag } }; ShaderLib$1.physical = { uniforms: UniformsUtils$1.merge( [ ShaderLib$1.standard.uniforms, { clearCoat: { value: 0 }, clearCoatRoughness: { value: 0 } } ] ), vertexShader: ShaderChunk$1.meshphysical_vert, fragmentShader: ShaderChunk$1.meshphysical_frag }; /** * @author bhouston / http://clara.io */ function Box2$1( min, max ) { this.min = ( min !== undefined ) ? min : new Vector2$1( + Infinity, + Infinity ); this.max = ( max !== undefined ) ? max : new Vector2$1( - Infinity, - Infinity ); } Object.assign( Box2$1.prototype, { set: function ( min, max ) { this.min.copy( min ); this.max.copy( max ); return this; }, setFromPoints: function ( points ) { this.makeEmpty(); for ( var i = 0, il = points.length; i < il; i ++ ) { this.expandByPoint( points[ i ] ); } return this; }, setFromCenterAndSize: function () { var v1 = new Vector2$1(); return function setFromCenterAndSize( center, size ) { var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); this.min.copy( center ).sub( halfSize ); this.max.copy( center ).add( halfSize ); return this; }; }(), clone: function () { return new this.constructor().copy( this ); }, copy: function ( box ) { this.min.copy( box.min ); this.max.copy( box.max ); return this; }, makeEmpty: function () { this.min.x = this.min.y = + Infinity; this.max.x = this.max.y = - Infinity; return this; }, isEmpty: function () { // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ); }, getCenter: function ( optionalTarget ) { var result = optionalTarget || new Vector2$1(); return this.isEmpty() ? result.set( 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); }, getSize: function ( optionalTarget ) { var result = optionalTarget || new Vector2$1(); return this.isEmpty() ? result.set( 0, 0 ) : result.subVectors( this.max, this.min ); }, expandByPoint: function ( point ) { this.min.min( point ); this.max.max( point ); return this; }, expandByVector: function ( vector ) { this.min.sub( vector ); this.max.add( vector ); return this; }, expandByScalar: function ( scalar ) { this.min.addScalar( - scalar ); this.max.addScalar( scalar ); return this; }, containsPoint: function ( point ) { return point.x < this.min.x || point.x > this.max.x || point.y < this.min.y || point.y > this.max.y ? false : true; }, containsBox: function ( box ) { return this.min.x <= box.min.x && box.max.x <= this.max.x && this.min.y <= box.min.y && box.max.y <= this.max.y; }, getParameter: function ( point, optionalTarget ) { // This can potentially have a divide by zero if the box // has a size dimension of 0. var result = optionalTarget || new Vector2$1(); return result.set( ( point.x - this.min.x ) / ( this.max.x - this.min.x ), ( point.y - this.min.y ) / ( this.max.y - this.min.y ) ); }, intersectsBox: function ( box ) { // using 4 splitting planes to rule out intersections return box.max.x < this.min.x || box.min.x > this.max.x || box.max.y < this.min.y || box.min.y > this.max.y ? false : true; }, clampPoint: function ( point, optionalTarget ) { var result = optionalTarget || new Vector2$1(); return result.copy( point ).clamp( this.min, this.max ); }, distanceToPoint: function () { var v1 = new Vector2$1(); return function distanceToPoint( point ) { var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); return clampedPoint.sub( point ).length(); }; }(), intersect: function ( box ) { this.min.max( box.min ); this.max.min( box.max ); return this; }, union: function ( box ) { this.min.min( box.min ); this.max.max( box.max ); return this; }, translate: function ( offset ) { this.min.add( offset ); this.max.add( offset ); return this; }, equals: function ( box ) { return box.min.equals( this.min ) && box.max.equals( this.max ); } } ); /** * @author mikael emtinger / http://gomo.se/ * @author alteredq / http://alteredqualia.com/ */ function LensFlarePlugin( renderer, flares ) { var gl = renderer.context; var state = renderer.state; var vertexBuffer, elementBuffer; var shader, program, attributes, uniforms; var tempTexture, occlusionTexture; function init() { var vertices = new Float32Array( [ - 1, - 1, 0, 0, 1, - 1, 1, 0, 1, 1, 1, 1, - 1, 1, 0, 1 ] ); var faces = new Uint16Array( [ 0, 1, 2, 0, 2, 3 ] ); // buffers vertexBuffer = gl.createBuffer(); elementBuffer = gl.createBuffer(); gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); gl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW ); gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW ); // textures tempTexture = gl.createTexture(); occlusionTexture = gl.createTexture(); state.bindTexture( gl.TEXTURE_2D, tempTexture ); gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null ); gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE ); gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE ); gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); state.bindTexture( gl.TEXTURE_2D, occlusionTexture ); gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null ); gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE ); gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE ); gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); shader = { vertexShader: [ "uniform lowp int renderType;", "uniform vec3 screenPosition;", "uniform vec2 scale;", "uniform float rotation;", "uniform sampler2D occlusionMap;", "attribute vec2 position;", "attribute vec2 uv;", "varying vec2 vUV;", "varying float vVisibility;", "void main() {", "vUV = uv;", "vec2 pos = position;", "if ( renderType == 2 ) {", "vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );", "visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );", "visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );", "visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );", "visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );", "visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );", "visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );", "visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );", "visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );", "vVisibility = visibility.r / 9.0;", "vVisibility *= 1.0 - visibility.g / 9.0;", "vVisibility *= visibility.b / 9.0;", "vVisibility *= 1.0 - visibility.a / 9.0;", "pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;", "pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;", "}", "gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );", "}" ].join( "\n" ), fragmentShader: [ "uniform lowp int renderType;", "uniform sampler2D map;", "uniform float opacity;", "uniform vec3 color;", "varying vec2 vUV;", "varying float vVisibility;", "void main() {", // pink square "if ( renderType == 0 ) {", "gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );", // restore "} else if ( renderType == 1 ) {", "gl_FragColor = texture2D( map, vUV );", // flare "} else {", "vec4 texture = texture2D( map, vUV );", "texture.a *= opacity * vVisibility;", "gl_FragColor = texture;", "gl_FragColor.rgb *= color;", "}", "}" ].join( "\n" ) }; program = createProgram( shader ); attributes = { vertex: gl.getAttribLocation ( program, "position" ), uv: gl.getAttribLocation ( program, "uv" ) }; uniforms = { renderType: gl.getUniformLocation( program, "renderType" ), map: gl.getUniformLocation( program, "map" ), occlusionMap: gl.getUniformLocation( program, "occlusionMap" ), opacity: gl.getUniformLocation( program, "opacity" ), color: gl.getUniformLocation( program, "color" ), scale: gl.getUniformLocation( program, "scale" ), rotation: gl.getUniformLocation( program, "rotation" ), screenPosition: gl.getUniformLocation( program, "screenPosition" ) }; } /* * Render lens flares * Method: renders 16x16 0xff00ff-colored points scattered over the light source area, * reads these back and calculates occlusion. */ this.render = function ( scene, camera, viewport ) { if ( flares.length === 0 ) return; var tempPosition = new Vector3$1(); var invAspect = viewport.w / viewport.z, halfViewportWidth = viewport.z * 0.5, halfViewportHeight = viewport.w * 0.5; var size = 16 / viewport.w, scale = new Vector2$1( size * invAspect, size ); var screenPosition = new Vector3$1( 1, 1, 0 ), screenPositionPixels = new Vector2$1( 1, 1 ); var validArea = new Box2$1(); validArea.min.set( viewport.x, viewport.y ); validArea.max.set( viewport.x + ( viewport.z - 16 ), viewport.y + ( viewport.w - 16 ) ); if ( program === undefined ) { init(); } gl.useProgram( program ); state.initAttributes(); state.enableAttribute( attributes.vertex ); state.enableAttribute( attributes.uv ); state.disableUnusedAttributes(); // loop through all lens flares to update their occlusion and positions // setup gl and common used attribs/uniforms gl.uniform1i( uniforms.occlusionMap, 0 ); gl.uniform1i( uniforms.map, 1 ); gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); gl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 ); gl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 ); gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); state.disable( gl.CULL_FACE ); state.buffers.depth.setMask( false ); for ( var i = 0, l = flares.length; i < l; i ++ ) { size = 16 / viewport.w; scale.set( size * invAspect, size ); // calc object screen position var flare = flares[ i ]; tempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] ); tempPosition.applyMatrix4( camera.matrixWorldInverse ); tempPosition.applyMatrix4( camera.projectionMatrix ); // setup arrays for gl programs screenPosition.copy( tempPosition ); // horizontal and vertical coordinate of the lower left corner of the pixels to copy screenPositionPixels.x = viewport.x + ( screenPosition.x * halfViewportWidth ) + halfViewportWidth - 8; screenPositionPixels.y = viewport.y + ( screenPosition.y * halfViewportHeight ) + halfViewportHeight - 8; // screen cull if ( validArea.containsPoint( screenPositionPixels ) === true ) { // save current RGB to temp texture state.activeTexture( gl.TEXTURE0 ); state.bindTexture( gl.TEXTURE_2D, null ); state.activeTexture( gl.TEXTURE1 ); state.bindTexture( gl.TEXTURE_2D, tempTexture ); gl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 ); // render pink quad gl.uniform1i( uniforms.renderType, 0 ); gl.uniform2f( uniforms.scale, scale.x, scale.y ); gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z ); state.disable( gl.BLEND ); state.enable( gl.DEPTH_TEST ); gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); // copy result to occlusionMap state.activeTexture( gl.TEXTURE0 ); state.bindTexture( gl.TEXTURE_2D, occlusionTexture ); gl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 ); // restore graphics gl.uniform1i( uniforms.renderType, 1 ); state.disable( gl.DEPTH_TEST ); state.activeTexture( gl.TEXTURE1 ); state.bindTexture( gl.TEXTURE_2D, tempTexture ); gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); // update object positions flare.positionScreen.copy( screenPosition ); if ( flare.customUpdateCallback ) { flare.customUpdateCallback( flare ); } else { flare.updateLensFlares(); } // render flares gl.uniform1i( uniforms.renderType, 2 ); state.enable( gl.BLEND ); for ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) { var sprite = flare.lensFlares[ j ]; if ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) { screenPosition.x = sprite.x; screenPosition.y = sprite.y; screenPosition.z = sprite.z; size = sprite.size * sprite.scale / viewport.w; scale.x = size * invAspect; scale.y = size; gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z ); gl.uniform2f( uniforms.scale, scale.x, scale.y ); gl.uniform1f( uniforms.rotation, sprite.rotation ); gl.uniform1f( uniforms.opacity, sprite.opacity ); gl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b ); state.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst ); renderer.setTexture2D( sprite.texture, 1 ); gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); } } } } // restore gl state.enable( gl.CULL_FACE ); state.enable( gl.DEPTH_TEST ); state.buffers.depth.setMask( true ); renderer.resetGLState(); }; function createProgram( shader ) { var program = gl.createProgram(); var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER ); var vertexShader = gl.createShader( gl.VERTEX_SHADER ); var prefix = "precision " + renderer.getPrecision() + " float;\n"; gl.shaderSource( fragmentShader, prefix + shader.fragmentShader ); gl.shaderSource( vertexShader, prefix + shader.vertexShader ); gl.compileShader( fragmentShader ); gl.compileShader( vertexShader ); gl.attachShader( program, fragmentShader ); gl.attachShader( program, vertexShader ); gl.linkProgram( program ); return program; } } /** * @author mikael emtinger / http://gomo.se/ * @author alteredq / http://alteredqualia.com/ */ function SpritePlugin( renderer, sprites ) { var gl = renderer.context; var state = renderer.state; var vertexBuffer, elementBuffer; var program, attributes, uniforms; var texture; // decompose matrixWorld var spritePosition = new Vector3$1(); var spriteRotation = new Quaternion$1(); var spriteScale = new Vector3$1(); function init() { var vertices = new Float32Array( [ - 0.5, - 0.5, 0, 0, 0.5, - 0.5, 1, 0, 0.5, 0.5, 1, 1, - 0.5, 0.5, 0, 1 ] ); var faces = new Uint16Array( [ 0, 1, 2, 0, 2, 3 ] ); vertexBuffer = gl.createBuffer(); elementBuffer = gl.createBuffer(); gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); gl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW ); gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW ); program = createProgram(); attributes = { position: gl.getAttribLocation ( program, 'position' ), uv: gl.getAttribLocation ( program, 'uv' ) }; uniforms = { uvOffset: gl.getUniformLocation( program, 'uvOffset' ), uvScale: gl.getUniformLocation( program, 'uvScale' ), rotation: gl.getUniformLocation( program, 'rotation' ), scale: gl.getUniformLocation( program, 'scale' ), color: gl.getUniformLocation( program, 'color' ), map: gl.getUniformLocation( program, 'map' ), opacity: gl.getUniformLocation( program, 'opacity' ), modelViewMatrix: gl.getUniformLocation( program, 'modelViewMatrix' ), projectionMatrix: gl.getUniformLocation( program, 'projectionMatrix' ), fogType: gl.getUniformLocation( program, 'fogType' ), fogDensity: gl.getUniformLocation( program, 'fogDensity' ), fogNear: gl.getUniformLocation( program, 'fogNear' ), fogFar: gl.getUniformLocation( program, 'fogFar' ), fogColor: gl.getUniformLocation( program, 'fogColor' ), alphaTest: gl.getUniformLocation( program, 'alphaTest' ) }; var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); canvas.width = 8; canvas.height = 8; var context = canvas.getContext( '2d' ); context.fillStyle = 'white'; context.fillRect( 0, 0, 8, 8 ); texture = new Texture$1( canvas ); texture.needsUpdate = true; } this.render = function ( scene, camera ) { if ( sprites.length === 0 ) return; // setup gl if ( program === undefined ) { init(); } gl.useProgram( program ); state.initAttributes(); state.enableAttribute( attributes.position ); state.enableAttribute( attributes.uv ); state.disableUnusedAttributes(); state.disable( gl.CULL_FACE ); state.enable( gl.BLEND ); gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); gl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 ); gl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 ); gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); gl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements ); state.activeTexture( gl.TEXTURE0 ); gl.uniform1i( uniforms.map, 0 ); var oldFogType = 0; var sceneFogType = 0; var fog = scene.fog; if ( fog ) { gl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b ); if ( fog.isFog ) { gl.uniform1f( uniforms.fogNear, fog.near ); gl.uniform1f( uniforms.fogFar, fog.far ); gl.uniform1i( uniforms.fogType, 1 ); oldFogType = 1; sceneFogType = 1; } else if ( fog.isFogExp2 ) { gl.uniform1f( uniforms.fogDensity, fog.density ); gl.uniform1i( uniforms.fogType, 2 ); oldFogType = 2; sceneFogType = 2; } } else { gl.uniform1i( uniforms.fogType, 0 ); oldFogType = 0; sceneFogType = 0; } // update positions and sort for ( var i = 0, l = sprites.length; i < l; i ++ ) { var sprite = sprites[ i ]; sprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld ); sprite.z = - sprite.modelViewMatrix.elements[ 14 ]; } sprites.sort( painterSortStable ); // render all sprites var scale = []; for ( var i = 0, l = sprites.length; i < l; i ++ ) { var sprite = sprites[ i ]; var material = sprite.material; if ( material.visible === false ) continue; gl.uniform1f( uniforms.alphaTest, material.alphaTest ); gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements ); sprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale ); scale[ 0 ] = spriteScale.x; scale[ 1 ] = spriteScale.y; var fogType = 0; if ( scene.fog && material.fog ) { fogType = sceneFogType; } if ( oldFogType !== fogType ) { gl.uniform1i( uniforms.fogType, fogType ); oldFogType = fogType; } if ( material.map !== null ) { gl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y ); gl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y ); } else { gl.uniform2f( uniforms.uvOffset, 0, 0 ); gl.uniform2f( uniforms.uvScale, 1, 1 ); } gl.uniform1f( uniforms.opacity, material.opacity ); gl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b ); gl.uniform1f( uniforms.rotation, material.rotation ); gl.uniform2fv( uniforms.scale, scale ); state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst ); state.buffers.depth.setTest( material.depthTest ); state.buffers.depth.setMask( material.depthWrite ); if ( material.map ) { renderer.setTexture2D( material.map, 0 ); } else { renderer.setTexture2D( texture, 0 ); } gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); } // restore gl state.enable( gl.CULL_FACE ); renderer.resetGLState(); }; function createProgram() { var program = gl.createProgram(); var vertexShader = gl.createShader( gl.VERTEX_SHADER ); var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER ); gl.shaderSource( vertexShader, [ 'precision ' + renderer.getPrecision() + ' float;', 'uniform mat4 modelViewMatrix;', 'uniform mat4 projectionMatrix;', 'uniform float rotation;', 'uniform vec2 scale;', 'uniform vec2 uvOffset;', 'uniform vec2 uvScale;', 'attribute vec2 position;', 'attribute vec2 uv;', 'varying vec2 vUV;', 'void main() {', 'vUV = uvOffset + uv * uvScale;', 'vec2 alignedPosition = position * scale;', 'vec2 rotatedPosition;', 'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;', 'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;', 'vec4 finalPosition;', 'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );', 'finalPosition.xy += rotatedPosition;', 'finalPosition = projectionMatrix * finalPosition;', 'gl_Position = finalPosition;', '}' ].join( '\n' ) ); gl.shaderSource( fragmentShader, [ 'precision ' + renderer.getPrecision() + ' float;', 'uniform vec3 color;', 'uniform sampler2D map;', 'uniform float opacity;', 'uniform int fogType;', 'uniform vec3 fogColor;', 'uniform float fogDensity;', 'uniform float fogNear;', 'uniform float fogFar;', 'uniform float alphaTest;', 'varying vec2 vUV;', 'void main() {', 'vec4 texture = texture2D( map, vUV );', 'if ( texture.a < alphaTest ) discard;', 'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );', 'if ( fogType > 0 ) {', 'float depth = gl_FragCoord.z / gl_FragCoord.w;', 'float fogFactor = 0.0;', 'if ( fogType == 1 ) {', 'fogFactor = smoothstep( fogNear, fogFar, depth );', '} else {', 'const float LOG2 = 1.442695;', 'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );', 'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );', '}', 'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );', '}', '}' ].join( '\n' ) ); gl.compileShader( vertexShader ); gl.compileShader( fragmentShader ); gl.attachShader( program, vertexShader ); gl.attachShader( program, fragmentShader ); gl.linkProgram( program ); return program; } function painterSortStable( a, b ) { if ( a.renderOrder !== b.renderOrder ) { return a.renderOrder - b.renderOrder; } else if ( a.z !== b.z ) { return b.z - a.z; } else { return b.id - a.id; } } } /** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ */ var materialId$1 = 0; function Material$1() { Object.defineProperty( this, 'id', { value: materialId$1 ++ } ); this.uuid = _Math$1.generateUUID(); this.name = ''; this.type = 'Material'; this.fog = true; this.lights = true; this.blending = NormalBlending$1; this.side = FrontSide$1; this.shading = SmoothShading; // THREE.FlatShading, THREE.SmoothShading this.vertexColors = NoColors$1; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors this.opacity = 1; this.transparent = false; this.blendSrc = SrcAlphaFactor$1; this.blendDst = OneMinusSrcAlphaFactor$1; this.blendEquation = AddEquation$1; this.blendSrcAlpha = null; this.blendDstAlpha = null; this.blendEquationAlpha = null; this.depthFunc = LessEqualDepth$1; this.depthTest = true; this.depthWrite = true; this.clippingPlanes = null; this.clipIntersection = false; this.clipShadows = false; this.colorWrite = true; this.precision = null; // override the renderer's default precision for this material this.polygonOffset = false; this.polygonOffsetFactor = 0; this.polygonOffsetUnits = 0; this.dithering = false; this.alphaTest = 0; this.premultipliedAlpha = false; this.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer this.visible = true; this.needsUpdate = true; } Object.assign( Material$1.prototype, EventDispatcher$1.prototype, { isMaterial: true, setValues: function ( values ) { if ( values === undefined ) return; for ( var key in values ) { var newValue = values[ key ]; if ( newValue === undefined ) { console.warn( "THREE.Material: '" + key + "' parameter is undefined." ); continue; } var currentValue = this[ key ]; if ( currentValue === undefined ) { console.warn( "THREE." + this.type + ": '" + key + "' is not a property of this material." ); continue; } if ( currentValue && currentValue.isColor ) { currentValue.set( newValue ); } else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) { currentValue.copy( newValue ); } else if ( key === 'overdraw' ) { // ensure overdraw is backwards-compatible with legacy boolean type this[ key ] = Number( newValue ); } else { this[ key ] = newValue; } } }, toJSON: function ( meta ) { var isRoot = meta === undefined; if ( isRoot ) { meta = { textures: {}, images: {} }; } var data = { metadata: { version: 4.5, type: 'Material', generator: 'Material.toJSON' } }; // standard Material serialization data.uuid = this.uuid; data.type = this.type; if ( this.name !== '' ) data.name = this.name; if ( this.color && this.color.isColor ) data.color = this.color.getHex(); if ( this.roughness !== undefined ) data.roughness = this.roughness; if ( this.metalness !== undefined ) data.metalness = this.metalness; if ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex(); if ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex(); if ( this.shininess !== undefined ) data.shininess = this.shininess; if ( this.clearCoat !== undefined ) data.clearCoat = this.clearCoat; if ( this.clearCoatRoughness !== undefined ) data.clearCoatRoughness = this.clearCoatRoughness; if ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid; if ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid; if ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid; if ( this.bumpMap && this.bumpMap.isTexture ) { data.bumpMap = this.bumpMap.toJSON( meta ).uuid; data.bumpScale = this.bumpScale; } if ( this.normalMap && this.normalMap.isTexture ) { data.normalMap = this.normalMap.toJSON( meta ).uuid; data.normalScale = this.normalScale.toArray(); } if ( this.displacementMap && this.displacementMap.isTexture ) { data.displacementMap = this.displacementMap.toJSON( meta ).uuid; data.displacementScale = this.displacementScale; data.displacementBias = this.displacementBias; } if ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid; if ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid; if ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid; if ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid; if ( this.envMap && this.envMap.isTexture ) { data.envMap = this.envMap.toJSON( meta ).uuid; data.reflectivity = this.reflectivity; // Scale behind envMap } if ( this.gradientMap && this.gradientMap.isTexture ) { data.gradientMap = this.gradientMap.toJSON( meta ).uuid; } if ( this.size !== undefined ) data.size = this.size; if ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation; if ( this.blending !== NormalBlending$1 ) data.blending = this.blending; if ( this.shading !== SmoothShading ) data.shading = this.shading; if ( this.side !== FrontSide$1 ) data.side = this.side; if ( this.vertexColors !== NoColors$1 ) data.vertexColors = this.vertexColors; if ( this.opacity < 1 ) data.opacity = this.opacity; if ( this.transparent === true ) data.transparent = this.transparent; data.depthFunc = this.depthFunc; data.depthTest = this.depthTest; data.depthWrite = this.depthWrite; if ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest; if ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha; if ( this.wireframe === true ) data.wireframe = this.wireframe; if ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth; if ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap; if ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin; data.skinning = this.skinning; data.morphTargets = this.morphTargets; data.dithering = this.dithering; // TODO: Copied from Object3D.toJSON function extractFromCache( cache ) { var values = []; for ( var key in cache ) { var data = cache[ key ]; delete data.metadata; values.push( data ); } return values; } if ( isRoot ) { var textures = extractFromCache( meta.textures ); var images = extractFromCache( meta.images ); if ( textures.length > 0 ) data.textures = textures; if ( images.length > 0 ) data.images = images; } return data; }, clone: function () { return new this.constructor().copy( this ); }, copy: function ( source ) { this.name = source.name; this.fog = source.fog; this.lights = source.lights; this.blending = source.blending; this.side = source.side; this.shading = source.shading; this.vertexColors = source.vertexColors; this.opacity = source.opacity; this.transparent = source.transparent; this.blendSrc = source.blendSrc; this.blendDst = source.blendDst; this.blendEquation = source.blendEquation; this.blendSrcAlpha = source.blendSrcAlpha; this.blendDstAlpha = source.blendDstAlpha; this.blendEquationAlpha = source.blendEquationAlpha; this.depthFunc = source.depthFunc; this.depthTest = source.depthTest; this.depthWrite = source.depthWrite; this.colorWrite = source.colorWrite; this.precision = source.precision; this.polygonOffset = source.polygonOffset; this.polygonOffsetFactor = source.polygonOffsetFactor; this.polygonOffsetUnits = source.polygonOffsetUnits; this.dithering = source.dithering; this.alphaTest = source.alphaTest; this.premultipliedAlpha = source.premultipliedAlpha; this.overdraw = source.overdraw; this.visible = source.visible; this.clipShadows = source.clipShadows; this.clipIntersection = source.clipIntersection; var srcPlanes = source.clippingPlanes, dstPlanes = null; if ( srcPlanes !== null ) { var n = srcPlanes.length; dstPlanes = new Array( n ); for ( var i = 0; i !== n; ++ i ) dstPlanes[ i ] = srcPlanes[ i ].clone(); } this.clippingPlanes = dstPlanes; return this; }, dispose: function () { this.dispatchEvent( { type: 'dispose' } ); } } ); /** * @author alteredq / http://alteredqualia.com/ * * parameters = { * defines: { "label" : "value" }, * uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } }, * * fragmentShader: , * vertexShader: , * * wireframe: , * wireframeLinewidth: , * * lights: , * * skinning: , * morphTargets: , * morphNormals: * } */ function ShaderMaterial$1( parameters ) { Material$1.call( this ); this.type = 'ShaderMaterial'; this.defines = {}; this.uniforms = {}; this.vertexShader = 'void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}'; this.fragmentShader = 'void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}'; this.linewidth = 1; this.wireframe = false; this.wireframeLinewidth = 1; this.fog = false; // set to use scene fog this.lights = false; // set to use scene lights this.clipping = false; // set to use user-defined clipping planes this.skinning = false; // set to use skinning attribute streams this.morphTargets = false; // set to use morph targets this.morphNormals = false; // set to use morph normals this.extensions = { derivatives: false, // set to use derivatives fragDepth: false, // set to use fragment depth values drawBuffers: false, // set to use draw buffers shaderTextureLOD: false // set to use shader texture LOD }; // When rendered geometry doesn't include these attributes but the material does, // use these default values in WebGL. This avoids errors when buffer data is missing. this.defaultAttributeValues = { 'color': [ 1, 1, 1 ], 'uv': [ 0, 0 ], 'uv2': [ 0, 0 ] }; this.index0AttributeName = undefined; if ( parameters !== undefined ) { if ( parameters.attributes !== undefined ) { console.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' ); } this.setValues( parameters ); } } ShaderMaterial$1.prototype = Object.create( Material$1.prototype ); ShaderMaterial$1.prototype.constructor = ShaderMaterial$1; ShaderMaterial$1.prototype.isShaderMaterial = true; ShaderMaterial$1.prototype.copy = function ( source ) { Material$1.prototype.copy.call( this, source ); this.fragmentShader = source.fragmentShader; this.vertexShader = source.vertexShader; this.uniforms = UniformsUtils$1.clone( source.uniforms ); this.defines = source.defines; this.wireframe = source.wireframe; this.wireframeLinewidth = source.wireframeLinewidth; this.lights = source.lights; this.clipping = source.clipping; this.skinning = source.skinning; this.morphTargets = source.morphTargets; this.morphNormals = source.morphNormals; this.extensions = source.extensions; return this; }; ShaderMaterial$1.prototype.toJSON = function ( meta ) { var data = Material$1.prototype.toJSON.call( this, meta ); data.uniforms = this.uniforms; data.vertexShader = this.vertexShader; data.fragmentShader = this.fragmentShader; return data; }; /** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ * @author bhouston / https://clara.io * @author WestLangley / http://github.com/WestLangley * * parameters = { * * opacity: , * * map: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * displacementMap: new THREE.Texture( ), * displacementScale: , * displacementBias: , * * wireframe: , * wireframeLinewidth: * } */ function MeshDepthMaterial$1( parameters ) { Material$1.call( this ); this.type = 'MeshDepthMaterial'; this.depthPacking = BasicDepthPacking$1; this.skinning = false; this.morphTargets = false; this.map = null; this.alphaMap = null; this.displacementMap = null; this.displacementScale = 1; this.displacementBias = 0; this.wireframe = false; this.wireframeLinewidth = 1; this.fog = false; this.lights = false; this.setValues( parameters ); } MeshDepthMaterial$1.prototype = Object.create( Material$1.prototype ); MeshDepthMaterial$1.prototype.constructor = MeshDepthMaterial$1; MeshDepthMaterial$1.prototype.isMeshDepthMaterial = true; MeshDepthMaterial$1.prototype.copy = function ( source ) { Material$1.prototype.copy.call( this, source ); this.depthPacking = source.depthPacking; this.skinning = source.skinning; this.morphTargets = source.morphTargets; this.map = source.map; this.alphaMap = source.alphaMap; this.displacementMap = source.displacementMap; this.displacementScale = source.displacementScale; this.displacementBias = source.displacementBias; this.wireframe = source.wireframe; this.wireframeLinewidth = source.wireframeLinewidth; return this; }; /** * @author bhouston / http://clara.io * @author WestLangley / http://github.com/WestLangley */ function Box3$1( min, max ) { this.min = ( min !== undefined ) ? min : new Vector3$1( + Infinity, + Infinity, + Infinity ); this.max = ( max !== undefined ) ? max : new Vector3$1( - Infinity, - Infinity, - Infinity ); } Object.assign( Box3$1.prototype, { isBox3: true, set: function ( min, max ) { this.min.copy( min ); this.max.copy( max ); return this; }, setFromArray: function ( array ) { var minX = + Infinity; var minY = + Infinity; var minZ = + Infinity; var maxX = - Infinity; var maxY = - Infinity; var maxZ = - Infinity; for ( var i = 0, l = array.length; i < l; i += 3 ) { var x = array[ i ]; var y = array[ i + 1 ]; var z = array[ i + 2 ]; if ( x < minX ) minX = x; if ( y < minY ) minY = y; if ( z < minZ ) minZ = z; if ( x > maxX ) maxX = x; if ( y > maxY ) maxY = y; if ( z > maxZ ) maxZ = z; } this.min.set( minX, minY, minZ ); this.max.set( maxX, maxY, maxZ ); return this; }, setFromBufferAttribute: function ( attribute ) { var minX = + Infinity; var minY = + Infinity; var minZ = + Infinity; var maxX = - Infinity; var maxY = - Infinity; var maxZ = - Infinity; for ( var i = 0, l = attribute.count; i < l; i ++ ) { var x = attribute.getX( i ); var y = attribute.getY( i ); var z = attribute.getZ( i ); if ( x < minX ) minX = x; if ( y < minY ) minY = y; if ( z < minZ ) minZ = z; if ( x > maxX ) maxX = x; if ( y > maxY ) maxY = y; if ( z > maxZ ) maxZ = z; } this.min.set( minX, minY, minZ ); this.max.set( maxX, maxY, maxZ ); return this; }, setFromPoints: function ( points ) { this.makeEmpty(); for ( var i = 0, il = points.length; i < il; i ++ ) { this.expandByPoint( points[ i ] ); } return this; }, setFromCenterAndSize: function () { var v1 = new Vector3$1(); return function setFromCenterAndSize( center, size ) { var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); this.min.copy( center ).sub( halfSize ); this.max.copy( center ).add( halfSize ); return this; }; }(), setFromObject: function ( object ) { this.makeEmpty(); return this.expandByObject( object ); }, clone: function () { return new this.constructor().copy( this ); }, copy: function ( box ) { this.min.copy( box.min ); this.max.copy( box.max ); return this; }, makeEmpty: function () { this.min.x = this.min.y = this.min.z = + Infinity; this.max.x = this.max.y = this.max.z = - Infinity; return this; }, isEmpty: function () { // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z ); }, getCenter: function ( optionalTarget ) { var result = optionalTarget || new Vector3$1(); return this.isEmpty() ? result.set( 0, 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); }, getSize: function ( optionalTarget ) { var result = optionalTarget || new Vector3$1(); return this.isEmpty() ? result.set( 0, 0, 0 ) : result.subVectors( this.max, this.min ); }, expandByPoint: function ( point ) { this.min.min( point ); this.max.max( point ); return this; }, expandByVector: function ( vector ) { this.min.sub( vector ); this.max.add( vector ); return this; }, expandByScalar: function ( scalar ) { this.min.addScalar( - scalar ); this.max.addScalar( scalar ); return this; }, expandByObject: function () { // Computes the world-axis-aligned bounding box of an object (including its children), // accounting for both the object's, and children's, world transforms var v1 = new Vector3$1(); return function expandByObject( object ) { var scope = this; object.updateMatrixWorld( true ); object.traverse( function ( node ) { var i, l; var geometry = node.geometry; if ( geometry !== undefined ) { if ( geometry.isGeometry ) { var vertices = geometry.vertices; for ( i = 0, l = vertices.length; i < l; i ++ ) { v1.copy( vertices[ i ] ); v1.applyMatrix4( node.matrixWorld ); scope.expandByPoint( v1 ); } } else if ( geometry.isBufferGeometry ) { var attribute = geometry.attributes.position; if ( attribute !== undefined ) { for ( i = 0, l = attribute.count; i < l; i ++ ) { v1.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld ); scope.expandByPoint( v1 ); } } } } } ); return this; }; }(), containsPoint: function ( point ) { return point.x < this.min.x || point.x > this.max.x || point.y < this.min.y || point.y > this.max.y || point.z < this.min.z || point.z > this.max.z ? false : true; }, containsBox: function ( box ) { return this.min.x <= box.min.x && box.max.x <= this.max.x && this.min.y <= box.min.y && box.max.y <= this.max.y && this.min.z <= box.min.z && box.max.z <= this.max.z; }, getParameter: function ( point, optionalTarget ) { // This can potentially have a divide by zero if the box // has a size dimension of 0. var result = optionalTarget || new Vector3$1(); return result.set( ( point.x - this.min.x ) / ( this.max.x - this.min.x ), ( point.y - this.min.y ) / ( this.max.y - this.min.y ), ( point.z - this.min.z ) / ( this.max.z - this.min.z ) ); }, intersectsBox: function ( box ) { // using 6 splitting planes to rule out intersections. return box.max.x < this.min.x || box.min.x > this.max.x || box.max.y < this.min.y || box.min.y > this.max.y || box.max.z < this.min.z || box.min.z > this.max.z ? false : true; }, intersectsSphere: ( function () { var closestPoint = new Vector3$1(); return function intersectsSphere( sphere ) { // Find the point on the AABB closest to the sphere center. this.clampPoint( sphere.center, closestPoint ); // If that point is inside the sphere, the AABB and sphere intersect. return closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius ); }; } )(), intersectsPlane: function ( plane ) { // We compute the minimum and maximum dot product values. If those values // are on the same side (back or front) of the plane, then there is no intersection. var min, max; if ( plane.normal.x > 0 ) { min = plane.normal.x * this.min.x; max = plane.normal.x * this.max.x; } else { min = plane.normal.x * this.max.x; max = plane.normal.x * this.min.x; } if ( plane.normal.y > 0 ) { min += plane.normal.y * this.min.y; max += plane.normal.y * this.max.y; } else { min += plane.normal.y * this.max.y; max += plane.normal.y * this.min.y; } if ( plane.normal.z > 0 ) { min += plane.normal.z * this.min.z; max += plane.normal.z * this.max.z; } else { min += plane.normal.z * this.max.z; max += plane.normal.z * this.min.z; } return ( min <= plane.constant && max >= plane.constant ); }, clampPoint: function ( point, optionalTarget ) { var result = optionalTarget || new Vector3$1(); return result.copy( point ).clamp( this.min, this.max ); }, distanceToPoint: function () { var v1 = new Vector3$1(); return function distanceToPoint( point ) { var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); return clampedPoint.sub( point ).length(); }; }(), getBoundingSphere: function () { var v1 = new Vector3$1(); return function getBoundingSphere( optionalTarget ) { var result = optionalTarget || new Sphere$2(); this.getCenter( result.center ); result.radius = this.getSize( v1 ).length() * 0.5; return result; }; }(), intersect: function ( box ) { this.min.max( box.min ); this.max.min( box.max ); // ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values. if( this.isEmpty() ) this.makeEmpty(); return this; }, union: function ( box ) { this.min.min( box.min ); this.max.max( box.max ); return this; }, applyMatrix4: function () { var points = [ new Vector3$1(), new Vector3$1(), new Vector3$1(), new Vector3$1(), new Vector3$1(), new Vector3$1(), new Vector3$1(), new Vector3$1() ]; return function applyMatrix4( matrix ) { // transform of empty box is an empty box. if( this.isEmpty() ) return this; // NOTE: I am using a binary pattern to specify all 2^3 combinations below points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000 points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001 points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010 points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011 points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100 points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101 points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110 points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111 this.setFromPoints( points ); return this; }; }(), translate: function ( offset ) { this.min.add( offset ); this.max.add( offset ); return this; }, equals: function ( box ) { return box.min.equals( this.min ) && box.max.equals( this.max ); } } ); /** * @author bhouston / http://clara.io * @author mrdoob / http://mrdoob.com/ */ function Sphere$2( center, radius ) { this.center = ( center !== undefined ) ? center : new Vector3$1(); this.radius = ( radius !== undefined ) ? radius : 0; } Object.assign( Sphere$2.prototype, { set: function ( center, radius ) { this.center.copy( center ); this.radius = radius; return this; }, setFromPoints: function () { var box = new Box3$1(); return function setFromPoints( points, optionalCenter ) { var center = this.center; if ( optionalCenter !== undefined ) { center.copy( optionalCenter ); } else { box.setFromPoints( points ).getCenter( center ); } var maxRadiusSq = 0; for ( var i = 0, il = points.length; i < il; i ++ ) { maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) ); } this.radius = Math.sqrt( maxRadiusSq ); return this; }; }(), clone: function () { return new this.constructor().copy( this ); }, copy: function ( sphere ) { this.center.copy( sphere.center ); this.radius = sphere.radius; return this; }, empty: function () { return ( this.radius <= 0 ); }, containsPoint: function ( point ) { return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) ); }, distanceToPoint: function ( point ) { return ( point.distanceTo( this.center ) - this.radius ); }, intersectsSphere: function ( sphere ) { var radiusSum = this.radius + sphere.radius; return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum ); }, intersectsBox: function ( box ) { return box.intersectsSphere( this ); }, intersectsPlane: function ( plane ) { // We use the following equation to compute the signed distance from // the center of the sphere to the plane. // // distance = q * n - d // // If this distance is greater than the radius of the sphere, // then there is no intersection. return Math.abs( this.center.dot( plane.normal ) - plane.constant ) <= this.radius; }, clampPoint: function ( point, optionalTarget ) { var deltaLengthSq = this.center.distanceToSquared( point ); var result = optionalTarget || new Vector3$1(); result.copy( point ); if ( deltaLengthSq > ( this.radius * this.radius ) ) { result.sub( this.center ).normalize(); result.multiplyScalar( this.radius ).add( this.center ); } return result; }, getBoundingBox: function ( optionalTarget ) { var box = optionalTarget || new Box3$1(); box.set( this.center, this.center ); box.expandByScalar( this.radius ); return box; }, applyMatrix4: function ( matrix ) { this.center.applyMatrix4( matrix ); this.radius = this.radius * matrix.getMaxScaleOnAxis(); return this; }, translate: function ( offset ) { this.center.add( offset ); return this; }, equals: function ( sphere ) { return sphere.center.equals( this.center ) && ( sphere.radius === this.radius ); } } ); /** * @author alteredq / http://alteredqualia.com/ * @author WestLangley / http://github.com/WestLangley * @author bhouston / http://clara.io * @author tschw */ function Matrix3$1() { this.elements = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ]; if ( arguments.length > 0 ) { console.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' ); } } Object.assign( Matrix3$1.prototype, { isMatrix3: true, set: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) { var te = this.elements; te[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31; te[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32; te[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33; return this; }, identity: function () { this.set( 1, 0, 0, 0, 1, 0, 0, 0, 1 ); return this; }, clone: function () { return new this.constructor().fromArray( this.elements ); }, copy: function ( m ) { var te = this.elements; var me = m.elements; te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ]; return this; }, setFromMatrix4: function ( m ) { var me = m.elements; this.set( me[ 0 ], me[ 4 ], me[ 8 ], me[ 1 ], me[ 5 ], me[ 9 ], me[ 2 ], me[ 6 ], me[ 10 ] ); return this; }, applyToBufferAttribute: function () { var v1 = new Vector3$1(); return function applyToBufferAttribute( attribute ) { for ( var i = 0, l = attribute.count; i < l; i ++ ) { v1.x = attribute.getX( i ); v1.y = attribute.getY( i ); v1.z = attribute.getZ( i ); v1.applyMatrix3( this ); attribute.setXYZ( i, v1.x, v1.y, v1.z ); } return attribute; }; }(), multiply: function ( m ) { return this.multiplyMatrices( this, m ); }, premultiply: function ( m ) { return this.multiplyMatrices( m, this ); }, multiplyMatrices: function ( a, b ) { var ae = a.elements; var be = b.elements; var te = this.elements; var a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ]; var a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ]; var a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ]; var b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ]; var b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ]; var b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ]; te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31; te[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32; te[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33; te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31; te[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32; te[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33; te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31; te[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32; te[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33; return this; }, multiplyScalar: function ( s ) { var te = this.elements; te[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s; te[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s; te[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s; return this; }, determinant: function () { var te = this.elements; var a = te[ 0 ], b = te[ 1 ], c = te[ 2 ], d = te[ 3 ], e = te[ 4 ], f = te[ 5 ], g = te[ 6 ], h = te[ 7 ], i = te[ 8 ]; return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g; }, getInverse: function ( matrix, throwOnDegenerate ) { if ( matrix && matrix.isMatrix4 ) { console.error( "THREE.Matrix3.getInverse no longer takes a Matrix4 argument." ); } var me = matrix.elements, te = this.elements, n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ], n13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ], t11 = n33 * n22 - n32 * n23, t12 = n32 * n13 - n33 * n12, t13 = n23 * n12 - n22 * n13, det = n11 * t11 + n21 * t12 + n31 * t13; if ( det === 0 ) { var msg = "THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0"; if ( throwOnDegenerate === true ) { throw new Error( msg ); } else { console.warn( msg ); } return this.identity(); } var detInv = 1 / det; te[ 0 ] = t11 * detInv; te[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv; te[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv; te[ 3 ] = t12 * detInv; te[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv; te[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv; te[ 6 ] = t13 * detInv; te[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv; te[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv; return this; }, transpose: function () { var tmp, m = this.elements; tmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp; tmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp; tmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp; return this; }, getNormalMatrix: function ( matrix4 ) { return this.setFromMatrix4( matrix4 ).getInverse( this ).transpose(); }, transposeIntoArray: function ( r ) { var m = this.elements; r[ 0 ] = m[ 0 ]; r[ 1 ] = m[ 3 ]; r[ 2 ] = m[ 6 ]; r[ 3 ] = m[ 1 ]; r[ 4 ] = m[ 4 ]; r[ 5 ] = m[ 7 ]; r[ 6 ] = m[ 2 ]; r[ 7 ] = m[ 5 ]; r[ 8 ] = m[ 8 ]; return this; }, equals: function ( matrix ) { var te = this.elements; var me = matrix.elements; for ( var i = 0; i < 9; i ++ ) { if ( te[ i ] !== me[ i ] ) return false; } return true; }, fromArray: function ( array, offset ) { if ( offset === undefined ) offset = 0; for ( var i = 0; i < 9; i ++ ) { this.elements[ i ] = array[ i + offset ]; } return this; }, toArray: function ( array, offset ) { if ( array === undefined ) array = []; if ( offset === undefined ) offset = 0; var te = this.elements; array[ offset ] = te[ 0 ]; array[ offset + 1 ] = te[ 1 ]; array[ offset + 2 ] = te[ 2 ]; array[ offset + 3 ] = te[ 3 ]; array[ offset + 4 ] = te[ 4 ]; array[ offset + 5 ] = te[ 5 ]; array[ offset + 6 ] = te[ 6 ]; array[ offset + 7 ] = te[ 7 ]; array[ offset + 8 ] = te[ 8 ]; return array; } } ); /** * @author bhouston / http://clara.io */ function Plane$2( normal, constant ) { this.normal = ( normal !== undefined ) ? normal : new Vector3$1( 1, 0, 0 ); this.constant = ( constant !== undefined ) ? constant : 0; } Object.assign( Plane$2.prototype, { set: function ( normal, constant ) { this.normal.copy( normal ); this.constant = constant; return this; }, setComponents: function ( x, y, z, w ) { this.normal.set( x, y, z ); this.constant = w; return this; }, setFromNormalAndCoplanarPoint: function ( normal, point ) { this.normal.copy( normal ); this.constant = - point.dot( this.normal ); // must be this.normal, not normal, as this.normal is normalized return this; }, setFromCoplanarPoints: function () { var v1 = new Vector3$1(); var v2 = new Vector3$1(); return function setFromCoplanarPoints( a, b, c ) { var normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize(); // Q: should an error be thrown if normal is zero (e.g. degenerate plane)? this.setFromNormalAndCoplanarPoint( normal, a ); return this; }; }(), clone: function () { return new this.constructor().copy( this ); }, copy: function ( plane ) { this.normal.copy( plane.normal ); this.constant = plane.constant; return this; }, normalize: function () { // Note: will lead to a divide by zero if the plane is invalid. var inverseNormalLength = 1.0 / this.normal.length(); this.normal.multiplyScalar( inverseNormalLength ); this.constant *= inverseNormalLength; return this; }, negate: function () { this.constant *= - 1; this.normal.negate(); return this; }, distanceToPoint: function ( point ) { return this.normal.dot( point ) + this.constant; }, distanceToSphere: function ( sphere ) { return this.distanceToPoint( sphere.center ) - sphere.radius; }, projectPoint: function ( point, optionalTarget ) { return this.orthoPoint( point, optionalTarget ).sub( point ).negate(); }, orthoPoint: function ( point, optionalTarget ) { var perpendicularMagnitude = this.distanceToPoint( point ); var result = optionalTarget || new Vector3$1(); return result.copy( this.normal ).multiplyScalar( perpendicularMagnitude ); }, intersectLine: function () { var v1 = new Vector3$1(); return function intersectLine( line, optionalTarget ) { var result = optionalTarget || new Vector3$1(); var direction = line.delta( v1 ); var denominator = this.normal.dot( direction ); if ( denominator === 0 ) { // line is coplanar, return origin if ( this.distanceToPoint( line.start ) === 0 ) { return result.copy( line.start ); } // Unsure if this is the correct method to handle this case. return undefined; } var t = - ( line.start.dot( this.normal ) + this.constant ) / denominator; if ( t < 0 || t > 1 ) { return undefined; } return result.copy( direction ).multiplyScalar( t ).add( line.start ); }; }(), intersectsLine: function ( line ) { // Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it. var startSign = this.distanceToPoint( line.start ); var endSign = this.distanceToPoint( line.end ); return ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 ); }, intersectsBox: function ( box ) { return box.intersectsPlane( this ); }, intersectsSphere: function ( sphere ) { return sphere.intersectsPlane( this ); }, coplanarPoint: function ( optionalTarget ) { var result = optionalTarget || new Vector3$1(); return result.copy( this.normal ).multiplyScalar( - this.constant ); }, applyMatrix4: function () { var v1 = new Vector3$1(); var m1 = new Matrix3$1(); return function applyMatrix4( matrix, optionalNormalMatrix ) { var referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix ); // transform normal based on theory here: // http://www.songho.ca/opengl/gl_normaltransform.html var normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix ); var normal = this.normal.applyMatrix3( normalMatrix ).normalize(); // recalculate constant (like in setFromNormalAndCoplanarPoint) this.constant = - referencePoint.dot( normal ); return this; }; }(), translate: function ( offset ) { this.constant = this.constant - offset.dot( this.normal ); return this; }, equals: function ( plane ) { return plane.normal.equals( this.normal ) && ( plane.constant === this.constant ); } } ); /** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ * @author bhouston / http://clara.io */ function Frustum$1( p0, p1, p2, p3, p4, p5 ) { this.planes = [ ( p0 !== undefined ) ? p0 : new Plane$2(), ( p1 !== undefined ) ? p1 : new Plane$2(), ( p2 !== undefined ) ? p2 : new Plane$2(), ( p3 !== undefined ) ? p3 : new Plane$2(), ( p4 !== undefined ) ? p4 : new Plane$2(), ( p5 !== undefined ) ? p5 : new Plane$2() ]; } Object.assign( Frustum$1.prototype, { set: function ( p0, p1, p2, p3, p4, p5 ) { var planes = this.planes; planes[ 0 ].copy( p0 ); planes[ 1 ].copy( p1 ); planes[ 2 ].copy( p2 ); planes[ 3 ].copy( p3 ); planes[ 4 ].copy( p4 ); planes[ 5 ].copy( p5 ); return this; }, clone: function () { return new this.constructor().copy( this ); }, copy: function ( frustum ) { var planes = this.planes; for ( var i = 0; i < 6; i ++ ) { planes[ i ].copy( frustum.planes[ i ] ); } return this; }, setFromMatrix: function ( m ) { var planes = this.planes; var me = m.elements; var me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ]; var me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ]; var me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ]; var me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ]; planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize(); planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize(); planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize(); planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize(); planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); return this; }, intersectsObject: function () { var sphere = new Sphere$2(); return function intersectsObject( object ) { var geometry = object.geometry; if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); sphere.copy( geometry.boundingSphere ) .applyMatrix4( object.matrixWorld ); return this.intersectsSphere( sphere ); }; }(), intersectsSprite: function () { var sphere = new Sphere$2(); return function intersectsSprite( sprite ) { sphere.center.set( 0, 0, 0 ); sphere.radius = 0.7071067811865476; sphere.applyMatrix4( sprite.matrixWorld ); return this.intersectsSphere( sphere ); }; }(), intersectsSphere: function ( sphere ) { var planes = this.planes; var center = sphere.center; var negRadius = - sphere.radius; for ( var i = 0; i < 6; i ++ ) { var distance = planes[ i ].distanceToPoint( center ); if ( distance < negRadius ) { return false; } } return true; }, intersectsBox: function () { var p1 = new Vector3$1(), p2 = new Vector3$1(); return function intersectsBox( box ) { var planes = this.planes; for ( var i = 0; i < 6; i ++ ) { var plane = planes[ i ]; p1.x = plane.normal.x > 0 ? box.min.x : box.max.x; p2.x = plane.normal.x > 0 ? box.max.x : box.min.x; p1.y = plane.normal.y > 0 ? box.min.y : box.max.y; p2.y = plane.normal.y > 0 ? box.max.y : box.min.y; p1.z = plane.normal.z > 0 ? box.min.z : box.max.z; p2.z = plane.normal.z > 0 ? box.max.z : box.min.z; var d1 = plane.distanceToPoint( p1 ); var d2 = plane.distanceToPoint( p2 ); // if both outside plane, no intersection if ( d1 < 0 && d2 < 0 ) { return false; } } return true; }; }(), containsPoint: function ( point ) { var planes = this.planes; for ( var i = 0; i < 6; i ++ ) { if ( planes[ i ].distanceToPoint( point ) < 0 ) { return false; } } return true; } } ); /** * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ */ function WebGLShadowMap$1( _renderer, _lights, _objects, capabilities ) { var _gl = _renderer.context, _state = _renderer.state, _frustum = new Frustum$1(), _projScreenMatrix = new Matrix4$1(), _lightShadows = _lights.shadows, _shadowMapSize = new Vector2$1(), _maxShadowMapSize = new Vector2$1( capabilities.maxTextureSize, capabilities.maxTextureSize ), _lookTarget = new Vector3$1(), _lightPositionWorld = new Vector3$1(), _MorphingFlag = 1, _SkinningFlag = 2, _NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1, _depthMaterials = new Array( _NumberOfMaterialVariants ), _distanceMaterials = new Array( _NumberOfMaterialVariants ), _materialCache = {}; var cubeDirections = [ new Vector3$1( 1, 0, 0 ), new Vector3$1( - 1, 0, 0 ), new Vector3$1( 0, 0, 1 ), new Vector3$1( 0, 0, - 1 ), new Vector3$1( 0, 1, 0 ), new Vector3$1( 0, - 1, 0 ) ]; var cubeUps = [ new Vector3$1( 0, 1, 0 ), new Vector3$1( 0, 1, 0 ), new Vector3$1( 0, 1, 0 ), new Vector3$1( 0, 1, 0 ), new Vector3$1( 0, 0, 1 ), new Vector3$1( 0, 0, - 1 ) ]; var cube2DViewPorts = [ new Vector4$1(), new Vector4$1(), new Vector4$1(), new Vector4$1(), new Vector4$1(), new Vector4$1() ]; // init var depthMaterialTemplate = new MeshDepthMaterial$1(); depthMaterialTemplate.depthPacking = RGBADepthPacking$1; depthMaterialTemplate.clipping = true; var distanceShader = ShaderLib$1[ "distanceRGBA" ]; var distanceUniforms = UniformsUtils$1.clone( distanceShader.uniforms ); for ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) { var useMorphing = ( i & _MorphingFlag ) !== 0; var useSkinning = ( i & _SkinningFlag ) !== 0; var depthMaterial = depthMaterialTemplate.clone(); depthMaterial.morphTargets = useMorphing; depthMaterial.skinning = useSkinning; _depthMaterials[ i ] = depthMaterial; var distanceMaterial = new ShaderMaterial$1( { defines: { 'USE_SHADOWMAP': '' }, uniforms: distanceUniforms, vertexShader: distanceShader.vertexShader, fragmentShader: distanceShader.fragmentShader, morphTargets: useMorphing, skinning: useSkinning, clipping: true } ); _distanceMaterials[ i ] = distanceMaterial; } // var scope = this; this.enabled = false; this.autoUpdate = true; this.needsUpdate = false; this.type = PCFShadowMap$1; this.renderReverseSided = true; this.renderSingleSided = true; this.render = function ( scene, camera ) { if ( scope.enabled === false ) return; if ( scope.autoUpdate === false && scope.needsUpdate === false ) return; if ( _lightShadows.length === 0 ) return; // Set GL state for depth map. _state.disable( _gl.BLEND ); _state.buffers.color.setClear( 1, 1, 1, 1 ); _state.buffers.depth.setTest( true ); _state.setScissorTest( false ); // render depth map var faceCount, isPointLight; for ( var i = 0, il = _lightShadows.length; i < il; i ++ ) { var light = _lightShadows[ i ]; var shadow = light.shadow; if ( shadow === undefined ) { console.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' ); continue; } var shadowCamera = shadow.camera; var shadowMatrix = shadow.matrix; _lightPositionWorld.setFromMatrixPosition( light.matrixWorld ); shadowCamera.position.copy( _lightPositionWorld ); _shadowMapSize.copy( shadow.mapSize ); _shadowMapSize.min( _maxShadowMapSize ); if ( light && light.isPointLight ) { faceCount = 6; isPointLight = true; var vpWidth = _shadowMapSize.x; var vpHeight = _shadowMapSize.y; // These viewports map a cube-map onto a 2D texture with the // following orientation: // // xzXZ // y Y // // X - Positive x direction // x - Negative x direction // Y - Positive y direction // y - Negative y direction // Z - Positive z direction // z - Negative z direction // positive X cube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight ); // negative X cube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight ); // positive Z cube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight ); // negative Z cube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight ); // positive Y cube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight ); // negative Y cube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight ); _shadowMapSize.x *= 4.0; _shadowMapSize.y *= 2.0; // for point lights we set the shadow matrix to be a translation-only matrix // equal to inverse of the light's position shadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z ); } else { faceCount = 1; isPointLight = false; _lookTarget.setFromMatrixPosition( light.target.matrixWorld ); shadowCamera.lookAt( _lookTarget ); shadowCamera.updateMatrixWorld(); shadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld ); // compute shadow matrix shadowMatrix.set( 0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0 ); shadowMatrix.multiply( shadowCamera.projectionMatrix ); shadowMatrix.multiply( shadowCamera.matrixWorldInverse ); } if ( shadow.map === null ) { var pars = { minFilter: NearestFilter$1, magFilter: NearestFilter$1, format: RGBAFormat$1 }; shadow.map = new WebGLRenderTarget$1( _shadowMapSize.x, _shadowMapSize.y, pars ); shadow.map.texture.name = light.name + ".shadowMap"; shadowCamera.updateProjectionMatrix(); } if ( shadow.isSpotLightShadow ) { shadow.update( light ); } var shadowMap = shadow.map; _renderer.setRenderTarget( shadowMap ); _renderer.clear(); // render shadow map for each cube face (if omni-directional) or // run a single pass if not for ( var face = 0; face < faceCount; face ++ ) { if ( isPointLight ) { _lookTarget.copy( shadowCamera.position ); _lookTarget.add( cubeDirections[ face ] ); shadowCamera.up.copy( cubeUps[ face ] ); shadowCamera.lookAt( _lookTarget ); shadowCamera.updateMatrixWorld(); shadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld ); var vpDimensions = cube2DViewPorts[ face ]; _state.viewport( vpDimensions ); } // update camera matrices and frustum _projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse ); _frustum.setFromMatrix( _projScreenMatrix ); // set object matrices & frustum culling renderObject( scene, camera, shadowCamera, isPointLight ); } } // Restore GL state. var clearColor = _renderer.getClearColor(); var clearAlpha = _renderer.getClearAlpha(); _renderer.setClearColor( clearColor, clearAlpha ); scope.needsUpdate = false; }; function getDepthMaterial( object, material, isPointLight, lightPositionWorld ) { var geometry = object.geometry; var result = null; var materialVariants = _depthMaterials; var customMaterial = object.customDepthMaterial; if ( isPointLight ) { materialVariants = _distanceMaterials; customMaterial = object.customDistanceMaterial; } if ( ! customMaterial ) { var useMorphing = false; if ( material.morphTargets ) { if ( geometry && geometry.isBufferGeometry ) { useMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0; } else if ( geometry && geometry.isGeometry ) { useMorphing = geometry.morphTargets && geometry.morphTargets.length > 0; } } if ( object.isSkinnedMesh && material.skinning === false ) { console.warn( 'THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:', object ); } var useSkinning = object.isSkinnedMesh && material.skinning; var variantIndex = 0; if ( useMorphing ) variantIndex |= _MorphingFlag; if ( useSkinning ) variantIndex |= _SkinningFlag; result = materialVariants[ variantIndex ]; } else { result = customMaterial; } if ( _renderer.localClippingEnabled && material.clipShadows === true && material.clippingPlanes.length !== 0 ) { // in this case we need a unique material instance reflecting the // appropriate state var keyA = result.uuid, keyB = material.uuid; var materialsForVariant = _materialCache[ keyA ]; if ( materialsForVariant === undefined ) { materialsForVariant = {}; _materialCache[ keyA ] = materialsForVariant; } var cachedMaterial = materialsForVariant[ keyB ]; if ( cachedMaterial === undefined ) { cachedMaterial = result.clone(); materialsForVariant[ keyB ] = cachedMaterial; } result = cachedMaterial; } result.visible = material.visible; result.wireframe = material.wireframe; var side = material.side; if ( scope.renderSingleSided && side == DoubleSide$1 ) { side = FrontSide$1; } if ( scope.renderReverseSided ) { if ( side === FrontSide$1 ) side = BackSide$1; else if ( side === BackSide$1 ) side = FrontSide$1; } result.side = side; result.clipShadows = material.clipShadows; result.clippingPlanes = material.clippingPlanes; result.wireframeLinewidth = material.wireframeLinewidth; result.linewidth = material.linewidth; if ( isPointLight && result.uniforms.lightPos !== undefined ) { result.uniforms.lightPos.value.copy( lightPositionWorld ); } return result; } function renderObject( object, camera, shadowCamera, isPointLight ) { if ( object.visible === false ) return; var visible = object.layers.test( camera.layers ); if ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) { if ( object.castShadow && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) { object.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld ); var geometry = _objects.update( object ); var material = object.material; if ( Array.isArray( material ) ) { var groups = geometry.groups; for ( var k = 0, kl = groups.length; k < kl; k ++ ) { var group = groups[ k ]; var groupMaterial = material[ group.materialIndex ]; if ( groupMaterial && groupMaterial.visible ) { var depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld ); _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group ); } } } else if ( material.visible ) { var depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld ); _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null ); } } } var children = object.children; for ( var i = 0, l = children.length; i < l; i ++ ) { renderObject( children[ i ], camera, shadowCamera, isPointLight ); } } } /** * @author bhouston / http://clara.io */ function Ray$1( origin, direction ) { this.origin = ( origin !== undefined ) ? origin : new Vector3$1(); this.direction = ( direction !== undefined ) ? direction : new Vector3$1(); } Object.assign( Ray$1.prototype, { set: function ( origin, direction ) { this.origin.copy( origin ); this.direction.copy( direction ); return this; }, clone: function () { return new this.constructor().copy( this ); }, copy: function ( ray ) { this.origin.copy( ray.origin ); this.direction.copy( ray.direction ); return this; }, at: function ( t, optionalTarget ) { var result = optionalTarget || new Vector3$1(); return result.copy( this.direction ).multiplyScalar( t ).add( this.origin ); }, lookAt: function ( v ) { this.direction.copy( v ).sub( this.origin ).normalize(); return this; }, recast: function () { var v1 = new Vector3$1(); return function recast( t ) { this.origin.copy( this.at( t, v1 ) ); return this; }; }(), closestPointToPoint: function ( point, optionalTarget ) { var result = optionalTarget || new Vector3$1(); result.subVectors( point, this.origin ); var directionDistance = result.dot( this.direction ); if ( directionDistance < 0 ) { return result.copy( this.origin ); } return result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); }, distanceToPoint: function ( point ) { return Math.sqrt( this.distanceSqToPoint( point ) ); }, distanceSqToPoint: function () { var v1 = new Vector3$1(); return function distanceSqToPoint( point ) { var directionDistance = v1.subVectors( point, this.origin ).dot( this.direction ); // point behind the ray if ( directionDistance < 0 ) { return this.origin.distanceToSquared( point ); } v1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); return v1.distanceToSquared( point ); }; }(), distanceSqToSegment: function () { var segCenter = new Vector3$1(); var segDir = new Vector3$1(); var diff = new Vector3$1(); return function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) { // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h // It returns the min distance between the ray and the segment // defined by v0 and v1 // It can also set two optional targets : // - The closest point on the ray // - The closest point on the segment segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 ); segDir.copy( v1 ).sub( v0 ).normalize(); diff.copy( this.origin ).sub( segCenter ); var segExtent = v0.distanceTo( v1 ) * 0.5; var a01 = - this.direction.dot( segDir ); var b0 = diff.dot( this.direction ); var b1 = - diff.dot( segDir ); var c = diff.lengthSq(); var det = Math.abs( 1 - a01 * a01 ); var s0, s1, sqrDist, extDet; if ( det > 0 ) { // The ray and segment are not parallel. s0 = a01 * b1 - b0; s1 = a01 * b0 - b1; extDet = segExtent * det; if ( s0 >= 0 ) { if ( s1 >= - extDet ) { if ( s1 <= extDet ) { // region 0 // Minimum at interior points of ray and segment. var invDet = 1 / det; s0 *= invDet; s1 *= invDet; sqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c; } else { // region 1 s1 = segExtent; s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; } } else { // region 5 s1 = - segExtent; s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; } } else { if ( s1 <= - extDet ) { // region 4 s0 = Math.max( 0, - ( - a01 * segExtent + b0 ) ); s1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; } else if ( s1 <= extDet ) { // region 3 s0 = 0; s1 = Math.min( Math.max( - segExtent, - b1 ), segExtent ); sqrDist = s1 * ( s1 + 2 * b1 ) + c; } else { // region 2 s0 = Math.max( 0, - ( a01 * segExtent + b0 ) ); s1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; } } } else { // Ray and segment are parallel. s1 = ( a01 > 0 ) ? - segExtent : segExtent; s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; } if ( optionalPointOnRay ) { optionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin ); } if ( optionalPointOnSegment ) { optionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter ); } return sqrDist; }; }(), intersectSphere: function () { var v1 = new Vector3$1(); return function intersectSphere( sphere, optionalTarget ) { v1.subVectors( sphere.center, this.origin ); var tca = v1.dot( this.direction ); var d2 = v1.dot( v1 ) - tca * tca; var radius2 = sphere.radius * sphere.radius; if ( d2 > radius2 ) return null; var thc = Math.sqrt( radius2 - d2 ); // t0 = first intersect point - entrance on front of sphere var t0 = tca - thc; // t1 = second intersect point - exit point on back of sphere var t1 = tca + thc; // test to see if both t0 and t1 are behind the ray - if so, return null if ( t0 < 0 && t1 < 0 ) return null; // test to see if t0 is behind the ray: // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, // in order to always return an intersect point that is in front of the ray. if ( t0 < 0 ) return this.at( t1, optionalTarget ); // else t0 is in front of the ray, so return the first collision point scaled by t0 return this.at( t0, optionalTarget ); }; }(), intersectsSphere: function ( sphere ) { return this.distanceToPoint( sphere.center ) <= sphere.radius; }, distanceToPlane: function ( plane ) { var denominator = plane.normal.dot( this.direction ); if ( denominator === 0 ) { // line is coplanar, return origin if ( plane.distanceToPoint( this.origin ) === 0 ) { return 0; } // Null is preferable to undefined since undefined means.... it is undefined return null; } var t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator; // Return if the ray never intersects the plane return t >= 0 ? t : null; }, intersectPlane: function ( plane, optionalTarget ) { var t = this.distanceToPlane( plane ); if ( t === null ) { return null; } return this.at( t, optionalTarget ); }, intersectsPlane: function ( plane ) { // check if the ray lies on the plane first var distToPoint = plane.distanceToPoint( this.origin ); if ( distToPoint === 0 ) { return true; } var denominator = plane.normal.dot( this.direction ); if ( denominator * distToPoint < 0 ) { return true; } // ray origin is behind the plane (and is pointing behind it) return false; }, intersectBox: function ( box, optionalTarget ) { var tmin, tmax, tymin, tymax, tzmin, tzmax; var invdirx = 1 / this.direction.x, invdiry = 1 / this.direction.y, invdirz = 1 / this.direction.z; var origin = this.origin; if ( invdirx >= 0 ) { tmin = ( box.min.x - origin.x ) * invdirx; tmax = ( box.max.x - origin.x ) * invdirx; } else { tmin = ( box.max.x - origin.x ) * invdirx; tmax = ( box.min.x - origin.x ) * invdirx; } if ( invdiry >= 0 ) { tymin = ( box.min.y - origin.y ) * invdiry; tymax = ( box.max.y - origin.y ) * invdiry; } else { tymin = ( box.max.y - origin.y ) * invdiry; tymax = ( box.min.y - origin.y ) * invdiry; } if ( ( tmin > tymax ) || ( tymin > tmax ) ) return null; // These lines also handle the case where tmin or tmax is NaN // (result of 0 * Infinity). x !== x returns true if x is NaN if ( tymin > tmin || tmin !== tmin ) tmin = tymin; if ( tymax < tmax || tmax !== tmax ) tmax = tymax; if ( invdirz >= 0 ) { tzmin = ( box.min.z - origin.z ) * invdirz; tzmax = ( box.max.z - origin.z ) * invdirz; } else { tzmin = ( box.max.z - origin.z ) * invdirz; tzmax = ( box.min.z - origin.z ) * invdirz; } if ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null; if ( tzmin > tmin || tmin !== tmin ) tmin = tzmin; if ( tzmax < tmax || tmax !== tmax ) tmax = tzmax; //return point closest to the ray (positive side) if ( tmax < 0 ) return null; return this.at( tmin >= 0 ? tmin : tmax, optionalTarget ); }, intersectsBox: ( function () { var v = new Vector3$1(); return function intersectsBox( box ) { return this.intersectBox( box, v ) !== null; }; } )(), intersectTriangle: function () { // Compute the offset origin, edges, and normal. var diff = new Vector3$1(); var edge1 = new Vector3$1(); var edge2 = new Vector3$1(); var normal = new Vector3$1(); return function intersectTriangle( a, b, c, backfaceCulling, optionalTarget ) { // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h edge1.subVectors( b, a ); edge2.subVectors( c, a ); normal.crossVectors( edge1, edge2 ); // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction, // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2)) // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q)) // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N) var DdN = this.direction.dot( normal ); var sign; if ( DdN > 0 ) { if ( backfaceCulling ) return null; sign = 1; } else if ( DdN < 0 ) { sign = - 1; DdN = - DdN; } else { return null; } diff.subVectors( this.origin, a ); var DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) ); // b1 < 0, no intersection if ( DdQxE2 < 0 ) { return null; } var DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) ); // b2 < 0, no intersection if ( DdE1xQ < 0 ) { return null; } // b1+b2 > 1, no intersection if ( DdQxE2 + DdE1xQ > DdN ) { return null; } // Line intersects triangle, check if ray does. var QdN = - sign * diff.dot( normal ); // t < 0, no intersection if ( QdN < 0 ) { return null; } // Ray intersects triangle. return this.at( QdN / DdN, optionalTarget ); }; }(), applyMatrix4: function ( matrix4 ) { this.direction.add( this.origin ).applyMatrix4( matrix4 ); this.origin.applyMatrix4( matrix4 ); this.direction.sub( this.origin ); this.direction.normalize(); return this; }, equals: function ( ray ) { return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction ); } } ); /** * @author mrdoob / http://mrdoob.com/ * @author WestLangley / http://github.com/WestLangley * @author bhouston / http://clara.io */ function Euler$1( x, y, z, order ) { this._x = x || 0; this._y = y || 0; this._z = z || 0; this._order = order || Euler$1.DefaultOrder; } Euler$1.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ]; Euler$1.DefaultOrder = 'XYZ'; Object.defineProperties( Euler$1.prototype, { x: { get: function () { return this._x; }, set: function ( value ) { this._x = value; this.onChangeCallback(); } }, y: { get: function () { return this._y; }, set: function ( value ) { this._y = value; this.onChangeCallback(); } }, z: { get: function () { return this._z; }, set: function ( value ) { this._z = value; this.onChangeCallback(); } }, order: { get: function () { return this._order; }, set: function ( value ) { this._order = value; this.onChangeCallback(); } } } ); Object.assign( Euler$1.prototype, { isEuler: true, set: function ( x, y, z, order ) { this._x = x; this._y = y; this._z = z; this._order = order || this._order; this.onChangeCallback(); return this; }, clone: function () { return new this.constructor( this._x, this._y, this._z, this._order ); }, copy: function ( euler ) { this._x = euler._x; this._y = euler._y; this._z = euler._z; this._order = euler._order; this.onChangeCallback(); return this; }, setFromRotationMatrix: function ( m, order, update ) { var clamp = _Math$1.clamp; // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) var te = m.elements; var m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ]; var m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ]; var m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; order = order || this._order; if ( order === 'XYZ' ) { this._y = Math.asin( clamp( m13, - 1, 1 ) ); if ( Math.abs( m13 ) < 0.99999 ) { this._x = Math.atan2( - m23, m33 ); this._z = Math.atan2( - m12, m11 ); } else { this._x = Math.atan2( m32, m22 ); this._z = 0; } } else if ( order === 'YXZ' ) { this._x = Math.asin( - clamp( m23, - 1, 1 ) ); if ( Math.abs( m23 ) < 0.99999 ) { this._y = Math.atan2( m13, m33 ); this._z = Math.atan2( m21, m22 ); } else { this._y = Math.atan2( - m31, m11 ); this._z = 0; } } else if ( order === 'ZXY' ) { this._x = Math.asin( clamp( m32, - 1, 1 ) ); if ( Math.abs( m32 ) < 0.99999 ) { this._y = Math.atan2( - m31, m33 ); this._z = Math.atan2( - m12, m22 ); } else { this._y = 0; this._z = Math.atan2( m21, m11 ); } } else if ( order === 'ZYX' ) { this._y = Math.asin( - clamp( m31, - 1, 1 ) ); if ( Math.abs( m31 ) < 0.99999 ) { this._x = Math.atan2( m32, m33 ); this._z = Math.atan2( m21, m11 ); } else { this._x = 0; this._z = Math.atan2( - m12, m22 ); } } else if ( order === 'YZX' ) { this._z = Math.asin( clamp( m21, - 1, 1 ) ); if ( Math.abs( m21 ) < 0.99999 ) { this._x = Math.atan2( - m23, m22 ); this._y = Math.atan2( - m31, m11 ); } else { this._x = 0; this._y = Math.atan2( m13, m33 ); } } else if ( order === 'XZY' ) { this._z = Math.asin( - clamp( m12, - 1, 1 ) ); if ( Math.abs( m12 ) < 0.99999 ) { this._x = Math.atan2( m32, m22 ); this._y = Math.atan2( m13, m11 ); } else { this._x = Math.atan2( - m23, m33 ); this._y = 0; } } else { console.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order ); } this._order = order; if ( update !== false ) this.onChangeCallback(); return this; }, setFromQuaternion: function () { var matrix = new Matrix4$1(); return function setFromQuaternion( q, order, update ) { matrix.makeRotationFromQuaternion( q ); return this.setFromRotationMatrix( matrix, order, update ); }; }(), setFromVector3: function ( v, order ) { return this.set( v.x, v.y, v.z, order || this._order ); }, reorder: function () { // WARNING: this discards revolution information -bhouston var q = new Quaternion$1(); return function reorder( newOrder ) { q.setFromEuler( this ); return this.setFromQuaternion( q, newOrder ); }; }(), equals: function ( euler ) { return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order ); }, fromArray: function ( array ) { this._x = array[ 0 ]; this._y = array[ 1 ]; this._z = array[ 2 ]; if ( array[ 3 ] !== undefined ) this._order = array[ 3 ]; this.onChangeCallback(); return this; }, toArray: function ( array, offset ) { if ( array === undefined ) array = []; if ( offset === undefined ) offset = 0; array[ offset ] = this._x; array[ offset + 1 ] = this._y; array[ offset + 2 ] = this._z; array[ offset + 3 ] = this._order; return array; }, toVector3: function ( optionalResult ) { if ( optionalResult ) { return optionalResult.set( this._x, this._y, this._z ); } else { return new Vector3$1( this._x, this._y, this._z ); } }, onChange: function ( callback ) { this.onChangeCallback = callback; return this; }, onChangeCallback: function () {} } ); /** * @author mrdoob / http://mrdoob.com/ */ function Layers$1() { this.mask = 1 | 0; } Object.assign( Layers$1.prototype, { set: function ( channel ) { this.mask = 1 << channel | 0; }, enable: function ( channel ) { this.mask |= 1 << channel | 0; }, toggle: function ( channel ) { this.mask ^= 1 << channel | 0; }, disable: function ( channel ) { this.mask &= ~ ( 1 << channel | 0 ); }, test: function ( layers ) { return ( this.mask & layers.mask ) !== 0; } } ); /** * @author mrdoob / http://mrdoob.com/ * @author mikael emtinger / http://gomo.se/ * @author alteredq / http://alteredqualia.com/ * @author WestLangley / http://github.com/WestLangley * @author elephantatwork / www.elephantatwork.ch */ var object3DId$1 = 0; function Object3D$1() { Object.defineProperty( this, 'id', { value: object3DId$1 ++ } ); this.uuid = _Math$1.generateUUID(); this.name = ''; this.type = 'Object3D'; this.parent = null; this.children = []; this.up = Object3D$1.DefaultUp.clone(); var position = new Vector3$1(); var rotation = new Euler$1(); var quaternion = new Quaternion$1(); var scale = new Vector3$1( 1, 1, 1 ); function onRotationChange() { quaternion.setFromEuler( rotation, false ); } function onQuaternionChange() { rotation.setFromQuaternion( quaternion, undefined, false ); } rotation.onChange( onRotationChange ); quaternion.onChange( onQuaternionChange ); Object.defineProperties( this, { position: { enumerable: true, value: position }, rotation: { enumerable: true, value: rotation }, quaternion: { enumerable: true, value: quaternion }, scale: { enumerable: true, value: scale }, modelViewMatrix: { value: new Matrix4$1() }, normalMatrix: { value: new Matrix3$1() } } ); this.matrix = new Matrix4$1(); this.matrixWorld = new Matrix4$1(); this.matrixAutoUpdate = Object3D$1.DefaultMatrixAutoUpdate; this.matrixWorldNeedsUpdate = false; this.layers = new Layers$1(); this.visible = true; this.castShadow = false; this.receiveShadow = false; this.frustumCulled = true; this.renderOrder = 0; this.userData = {}; this.onBeforeRender = function () {}; this.onAfterRender = function () {}; } Object3D$1.DefaultUp = new Vector3$1( 0, 1, 0 ); Object3D$1.DefaultMatrixAutoUpdate = true; Object.assign( Object3D$1.prototype, EventDispatcher$1.prototype, { isObject3D: true, applyMatrix: function ( matrix ) { this.matrix.multiplyMatrices( matrix, this.matrix ); this.matrix.decompose( this.position, this.quaternion, this.scale ); }, setRotationFromAxisAngle: function ( axis, angle ) { // assumes axis is normalized this.quaternion.setFromAxisAngle( axis, angle ); }, setRotationFromEuler: function ( euler ) { this.quaternion.setFromEuler( euler, true ); }, setRotationFromMatrix: function ( m ) { // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) this.quaternion.setFromRotationMatrix( m ); }, setRotationFromQuaternion: function ( q ) { // assumes q is normalized this.quaternion.copy( q ); }, rotateOnAxis: function () { // rotate object on axis in object space // axis is assumed to be normalized var q1 = new Quaternion$1(); return function rotateOnAxis( axis, angle ) { q1.setFromAxisAngle( axis, angle ); this.quaternion.multiply( q1 ); return this; }; }(), rotateX: function () { var v1 = new Vector3$1( 1, 0, 0 ); return function rotateX( angle ) { return this.rotateOnAxis( v1, angle ); }; }(), rotateY: function () { var v1 = new Vector3$1( 0, 1, 0 ); return function rotateY( angle ) { return this.rotateOnAxis( v1, angle ); }; }(), rotateZ: function () { var v1 = new Vector3$1( 0, 0, 1 ); return function rotateZ( angle ) { return this.rotateOnAxis( v1, angle ); }; }(), translateOnAxis: function () { // translate object by distance along axis in object space // axis is assumed to be normalized var v1 = new Vector3$1(); return function translateOnAxis( axis, distance ) { v1.copy( axis ).applyQuaternion( this.quaternion ); this.position.add( v1.multiplyScalar( distance ) ); return this; }; }(), translateX: function () { var v1 = new Vector3$1( 1, 0, 0 ); return function translateX( distance ) { return this.translateOnAxis( v1, distance ); }; }(), translateY: function () { var v1 = new Vector3$1( 0, 1, 0 ); return function translateY( distance ) { return this.translateOnAxis( v1, distance ); }; }(), translateZ: function () { var v1 = new Vector3$1( 0, 0, 1 ); return function translateZ( distance ) { return this.translateOnAxis( v1, distance ); }; }(), localToWorld: function ( vector ) { return vector.applyMatrix4( this.matrixWorld ); }, worldToLocal: function () { var m1 = new Matrix4$1(); return function worldToLocal( vector ) { return vector.applyMatrix4( m1.getInverse( this.matrixWorld ) ); }; }(), lookAt: function () { // This routine does not support objects with rotated and/or translated parent(s) var m1 = new Matrix4$1(); return function lookAt( vector ) { if ( this.isCamera ) { m1.lookAt( this.position, vector, this.up ); } else { m1.lookAt( vector, this.position, this.up ); } this.quaternion.setFromRotationMatrix( m1 ); }; }(), add: function ( object ) { if ( arguments.length > 1 ) { for ( var i = 0; i < arguments.length; i ++ ) { this.add( arguments[ i ] ); } return this; } if ( object === this ) { console.error( "THREE.Object3D.add: object can't be added as a child of itself.", object ); return this; } if ( ( object && object.isObject3D ) ) { if ( object.parent !== null ) { object.parent.remove( object ); } object.parent = this; object.dispatchEvent( { type: 'added' } ); this.children.push( object ); } else { console.error( "THREE.Object3D.add: object not an instance of THREE.Object3D.", object ); } return this; }, remove: function ( object ) { if ( arguments.length > 1 ) { for ( var i = 0; i < arguments.length; i ++ ) { this.remove( arguments[ i ] ); } } var index = this.children.indexOf( object ); if ( index !== - 1 ) { object.parent = null; object.dispatchEvent( { type: 'removed' } ); this.children.splice( index, 1 ); } }, getObjectById: function ( id ) { return this.getObjectByProperty( 'id', id ); }, getObjectByName: function ( name ) { return this.getObjectByProperty( 'name', name ); }, getObjectByProperty: function ( name, value ) { if ( this[ name ] === value ) return this; for ( var i = 0, l = this.children.length; i < l; i ++ ) { var child = this.children[ i ]; var object = child.getObjectByProperty( name, value ); if ( object !== undefined ) { return object; } } return undefined; }, getWorldPosition: function ( optionalTarget ) { var result = optionalTarget || new Vector3$1(); this.updateMatrixWorld( true ); return result.setFromMatrixPosition( this.matrixWorld ); }, getWorldQuaternion: function () { var position = new Vector3$1(); var scale = new Vector3$1(); return function getWorldQuaternion( optionalTarget ) { var result = optionalTarget || new Quaternion$1(); this.updateMatrixWorld( true ); this.matrixWorld.decompose( position, result, scale ); return result; }; }(), getWorldRotation: function () { var quaternion = new Quaternion$1(); return function getWorldRotation( optionalTarget ) { var result = optionalTarget || new Euler$1(); this.getWorldQuaternion( quaternion ); return result.setFromQuaternion( quaternion, this.rotation.order, false ); }; }(), getWorldScale: function () { var position = new Vector3$1(); var quaternion = new Quaternion$1(); return function getWorldScale( optionalTarget ) { var result = optionalTarget || new Vector3$1(); this.updateMatrixWorld( true ); this.matrixWorld.decompose( position, quaternion, result ); return result; }; }(), getWorldDirection: function () { var quaternion = new Quaternion$1(); return function getWorldDirection( optionalTarget ) { var result = optionalTarget || new Vector3$1(); this.getWorldQuaternion( quaternion ); return result.set( 0, 0, 1 ).applyQuaternion( quaternion ); }; }(), raycast: function () {}, traverse: function ( callback ) { callback( this ); var children = this.children; for ( var i = 0, l = children.length; i < l; i ++ ) { children[ i ].traverse( callback ); } }, traverseVisible: function ( callback ) { if ( this.visible === false ) return; callback( this ); var children = this.children; for ( var i = 0, l = children.length; i < l; i ++ ) { children[ i ].traverseVisible( callback ); } }, traverseAncestors: function ( callback ) { var parent = this.parent; if ( parent !== null ) { callback( parent ); parent.traverseAncestors( callback ); } }, updateMatrix: function () { this.matrix.compose( this.position, this.quaternion, this.scale ); this.matrixWorldNeedsUpdate = true; }, updateMatrixWorld: function ( force ) { if ( this.matrixAutoUpdate ) this.updateMatrix(); if ( this.matrixWorldNeedsUpdate || force ) { if ( this.parent === null ) { this.matrixWorld.copy( this.matrix ); } else { this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); } this.matrixWorldNeedsUpdate = false; force = true; } // update children var children = this.children; for ( var i = 0, l = children.length; i < l; i ++ ) { children[ i ].updateMatrixWorld( force ); } }, toJSON: function ( meta ) { // meta is '' when called from JSON.stringify var isRootObject = ( meta === undefined || meta === '' ); var output = {}; // meta is a hash used to collect geometries, materials. // not providing it implies that this is the root object // being serialized. if ( isRootObject ) { // initialize meta obj meta = { geometries: {}, materials: {}, textures: {}, images: {} }; output.metadata = { version: 4.5, type: 'Object', generator: 'Object3D.toJSON' }; } // standard Object3D serialization var object = {}; object.uuid = this.uuid; object.type = this.type; if ( this.name !== '' ) object.name = this.name; if ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData; if ( this.castShadow === true ) object.castShadow = true; if ( this.receiveShadow === true ) object.receiveShadow = true; if ( this.visible === false ) object.visible = false; object.matrix = this.matrix.toArray(); // function serialize( library, element ) { if ( library[ element.uuid ] === undefined ) { library[ element.uuid ] = element.toJSON( meta ); } return element.uuid; } if ( this.geometry !== undefined ) { object.geometry = serialize( meta.geometries, this.geometry ); } if ( this.material !== undefined ) { if ( Array.isArray( this.material ) ) { var uuids = []; for ( var i = 0, l = this.material.length; i < l; i ++ ) { uuids.push( serialize( meta.materials, this.material[ i ] ) ); } object.material = uuids; } else { object.material = serialize( meta.materials, this.material ); } } // if ( this.children.length > 0 ) { object.children = []; for ( var i = 0; i < this.children.length; i ++ ) { object.children.push( this.children[ i ].toJSON( meta ).object ); } } if ( isRootObject ) { var geometries = extractFromCache( meta.geometries ); var materials = extractFromCache( meta.materials ); var textures = extractFromCache( meta.textures ); var images = extractFromCache( meta.images ); if ( geometries.length > 0 ) output.geometries = geometries; if ( materials.length > 0 ) output.materials = materials; if ( textures.length > 0 ) output.textures = textures; if ( images.length > 0 ) output.images = images; } output.object = object; return output; // extract data from the cache hash // remove metadata on each item // and return as array function extractFromCache( cache ) { var values = []; for ( var key in cache ) { var data = cache[ key ]; delete data.metadata; values.push( data ); } return values; } }, clone: function ( recursive ) { return new this.constructor().copy( this, recursive ); }, copy: function ( source, recursive ) { if ( recursive === undefined ) recursive = true; this.name = source.name; this.up.copy( source.up ); this.position.copy( source.position ); this.quaternion.copy( source.quaternion ); this.scale.copy( source.scale ); this.matrix.copy( source.matrix ); this.matrixWorld.copy( source.matrixWorld ); this.matrixAutoUpdate = source.matrixAutoUpdate; this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate; this.layers.mask = source.layers.mask; this.visible = source.visible; this.castShadow = source.castShadow; this.receiveShadow = source.receiveShadow; this.frustumCulled = source.frustumCulled; this.renderOrder = source.renderOrder; this.userData = JSON.parse( JSON.stringify( source.userData ) ); if ( recursive === true ) { for ( var i = 0; i < source.children.length; i ++ ) { var child = source.children[ i ]; this.add( child.clone() ); } } return this; } } ); /** * @author bhouston / http://clara.io */ function Line3$1( start, end ) { this.start = ( start !== undefined ) ? start : new Vector3$1(); this.end = ( end !== undefined ) ? end : new Vector3$1(); } Object.assign( Line3$1.prototype, { set: function ( start, end ) { this.start.copy( start ); this.end.copy( end ); return this; }, clone: function () { return new this.constructor().copy( this ); }, copy: function ( line ) { this.start.copy( line.start ); this.end.copy( line.end ); return this; }, getCenter: function ( optionalTarget ) { var result = optionalTarget || new Vector3$1(); return result.addVectors( this.start, this.end ).multiplyScalar( 0.5 ); }, delta: function ( optionalTarget ) { var result = optionalTarget || new Vector3$1(); return result.subVectors( this.end, this.start ); }, distanceSq: function () { return this.start.distanceToSquared( this.end ); }, distance: function () { return this.start.distanceTo( this.end ); }, at: function ( t, optionalTarget ) { var result = optionalTarget || new Vector3$1(); return this.delta( result ).multiplyScalar( t ).add( this.start ); }, closestPointToPointParameter: function () { var startP = new Vector3$1(); var startEnd = new Vector3$1(); return function closestPointToPointParameter( point, clampToLine ) { startP.subVectors( point, this.start ); startEnd.subVectors( this.end, this.start ); var startEnd2 = startEnd.dot( startEnd ); var startEnd_startP = startEnd.dot( startP ); var t = startEnd_startP / startEnd2; if ( clampToLine ) { t = _Math$1.clamp( t, 0, 1 ); } return t; }; }(), closestPointToPoint: function ( point, clampToLine, optionalTarget ) { var t = this.closestPointToPointParameter( point, clampToLine ); var result = optionalTarget || new Vector3$1(); return this.delta( result ).multiplyScalar( t ).add( this.start ); }, applyMatrix4: function ( matrix ) { this.start.applyMatrix4( matrix ); this.end.applyMatrix4( matrix ); return this; }, equals: function ( line ) { return line.start.equals( this.start ) && line.end.equals( this.end ); } } ); /** * @author bhouston / http://clara.io * @author mrdoob / http://mrdoob.com/ */ function Triangle$1( a, b, c ) { this.a = ( a !== undefined ) ? a : new Vector3$1(); this.b = ( b !== undefined ) ? b : new Vector3$1(); this.c = ( c !== undefined ) ? c : new Vector3$1(); } Object.assign( Triangle$1, { normal: function () { var v0 = new Vector3$1(); return function normal( a, b, c, optionalTarget ) { var result = optionalTarget || new Vector3$1(); result.subVectors( c, b ); v0.subVectors( a, b ); result.cross( v0 ); var resultLengthSq = result.lengthSq(); if ( resultLengthSq > 0 ) { return result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) ); } return result.set( 0, 0, 0 ); }; }(), // static/instance method to calculate barycentric coordinates // based on: http://www.blackpawn.com/texts/pointinpoly/default.html barycoordFromPoint: function () { var v0 = new Vector3$1(); var v1 = new Vector3$1(); var v2 = new Vector3$1(); return function barycoordFromPoint( point, a, b, c, optionalTarget ) { v0.subVectors( c, a ); v1.subVectors( b, a ); v2.subVectors( point, a ); var dot00 = v0.dot( v0 ); var dot01 = v0.dot( v1 ); var dot02 = v0.dot( v2 ); var dot11 = v1.dot( v1 ); var dot12 = v1.dot( v2 ); var denom = ( dot00 * dot11 - dot01 * dot01 ); var result = optionalTarget || new Vector3$1(); // collinear or singular triangle if ( denom === 0 ) { // arbitrary location outside of triangle? // not sure if this is the best idea, maybe should be returning undefined return result.set( - 2, - 1, - 1 ); } var invDenom = 1 / denom; var u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom; var v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom; // barycentric coordinates must always sum to 1 return result.set( 1 - u - v, v, u ); }; }(), containsPoint: function () { var v1 = new Vector3$1(); return function containsPoint( point, a, b, c ) { var result = Triangle$1.barycoordFromPoint( point, a, b, c, v1 ); return ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 ); }; }() } ); Object.assign( Triangle$1.prototype, { set: function ( a, b, c ) { this.a.copy( a ); this.b.copy( b ); this.c.copy( c ); return this; }, setFromPointsAndIndices: function ( points, i0, i1, i2 ) { this.a.copy( points[ i0 ] ); this.b.copy( points[ i1 ] ); this.c.copy( points[ i2 ] ); return this; }, clone: function () { return new this.constructor().copy( this ); }, copy: function ( triangle ) { this.a.copy( triangle.a ); this.b.copy( triangle.b ); this.c.copy( triangle.c ); return this; }, area: function () { var v0 = new Vector3$1(); var v1 = new Vector3$1(); return function area() { v0.subVectors( this.c, this.b ); v1.subVectors( this.a, this.b ); return v0.cross( v1 ).length() * 0.5; }; }(), midpoint: function ( optionalTarget ) { var result = optionalTarget || new Vector3$1(); return result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 ); }, normal: function ( optionalTarget ) { return Triangle$1.normal( this.a, this.b, this.c, optionalTarget ); }, plane: function ( optionalTarget ) { var result = optionalTarget || new Plane$2(); return result.setFromCoplanarPoints( this.a, this.b, this.c ); }, barycoordFromPoint: function ( point, optionalTarget ) { return Triangle$1.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget ); }, containsPoint: function ( point ) { return Triangle$1.containsPoint( point, this.a, this.b, this.c ); }, closestPointToPoint: function () { var plane = new Plane$2(); var edgeList = [ new Line3$1(), new Line3$1(), new Line3$1() ]; var projectedPoint = new Vector3$1(); var closestPoint = new Vector3$1(); return function closestPointToPoint( point, optionalTarget ) { var result = optionalTarget || new Vector3$1(); var minDistance = Infinity; // project the point onto the plane of the triangle plane.setFromCoplanarPoints( this.a, this.b, this.c ); plane.projectPoint( point, projectedPoint ); // check if the projection lies within the triangle if( this.containsPoint( projectedPoint ) === true ) { // if so, this is the closest point result.copy( projectedPoint ); } else { // if not, the point falls outside the triangle. the result is the closest point to the triangle's edges or vertices edgeList[ 0 ].set( this.a, this.b ); edgeList[ 1 ].set( this.b, this.c ); edgeList[ 2 ].set( this.c, this.a ); for( var i = 0; i < edgeList.length; i ++ ) { edgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint ); var distance = projectedPoint.distanceToSquared( closestPoint ); if( distance < minDistance ) { minDistance = distance; result.copy( closestPoint ); } } } return result; }; }(), equals: function ( triangle ) { return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c ); } } ); /** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ */ function Face3$1( a, b, c, normal, color, materialIndex ) { this.a = a; this.b = b; this.c = c; this.normal = ( normal && normal.isVector3 ) ? normal : new Vector3$1(); this.vertexNormals = Array.isArray( normal ) ? normal : []; this.color = ( color && color.isColor ) ? color : new Color$1(); this.vertexColors = Array.isArray( color ) ? color : []; this.materialIndex = materialIndex !== undefined ? materialIndex : 0; } Object.assign( Face3$1.prototype, { clone: function () { return new this.constructor().copy( this ); }, copy: function ( source ) { this.a = source.a; this.b = source.b; this.c = source.c; this.normal.copy( source.normal ); this.color.copy( source.color ); this.materialIndex = source.materialIndex; for ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) { this.vertexNormals[ i ] = source.vertexNormals[ i ].clone(); } for ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) { this.vertexColors[ i ] = source.vertexColors[ i ].clone(); } return this; } } ); /** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ * * parameters = { * color: , * opacity: , * map: new THREE.Texture( ), * * lightMap: new THREE.Texture( ), * lightMapIntensity: * * aoMap: new THREE.Texture( ), * aoMapIntensity: * * specularMap: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), * combine: THREE.Multiply, * reflectivity: , * refractionRatio: , * * shading: THREE.SmoothShading, * depthTest: , * depthWrite: , * * wireframe: , * wireframeLinewidth: , * * skinning: , * morphTargets: * } */ function MeshBasicMaterial$1( parameters ) { Material$1.call( this ); this.type = 'MeshBasicMaterial'; this.color = new Color$1( 0xffffff ); // emissive this.map = null; this.lightMap = null; this.lightMapIntensity = 1.0; this.aoMap = null; this.aoMapIntensity = 1.0; this.specularMap = null; this.alphaMap = null; this.envMap = null; this.combine = MultiplyOperation$1; this.reflectivity = 1; this.refractionRatio = 0.98; this.wireframe = false; this.wireframeLinewidth = 1; this.wireframeLinecap = 'round'; this.wireframeLinejoin = 'round'; this.skinning = false; this.morphTargets = false; this.lights = false; this.setValues( parameters ); } MeshBasicMaterial$1.prototype = Object.create( Material$1.prototype ); MeshBasicMaterial$1.prototype.constructor = MeshBasicMaterial$1; MeshBasicMaterial$1.prototype.isMeshBasicMaterial = true; MeshBasicMaterial$1.prototype.copy = function ( source ) { Material$1.prototype.copy.call( this, source ); this.color.copy( source.color ); this.map = source.map; this.lightMap = source.lightMap; this.lightMapIntensity = source.lightMapIntensity; this.aoMap = source.aoMap; this.aoMapIntensity = source.aoMapIntensity; this.specularMap = source.specularMap; this.alphaMap = source.alphaMap; this.envMap = source.envMap; this.combine = source.combine; this.reflectivity = source.reflectivity; this.refractionRatio = source.refractionRatio; this.wireframe = source.wireframe; this.wireframeLinewidth = source.wireframeLinewidth; this.wireframeLinecap = source.wireframeLinecap; this.wireframeLinejoin = source.wireframeLinejoin; this.skinning = source.skinning; this.morphTargets = source.morphTargets; return this; }; /** * @author mrdoob / http://mrdoob.com/ */ function BufferAttribute$1( array, itemSize, normalized ) { if ( Array.isArray( array ) ) { throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); } this.uuid = _Math$1.generateUUID(); this.array = array; this.itemSize = itemSize; this.count = array !== undefined ? array.length / itemSize : 0; this.normalized = normalized === true; this.dynamic = false; this.updateRange = { offset: 0, count: - 1 }; this.onUploadCallback = function () {}; this.version = 0; } Object.defineProperty( BufferAttribute$1.prototype, 'needsUpdate', { set: function ( value ) { if ( value === true ) this.version ++; } } ); Object.assign( BufferAttribute$1.prototype, { isBufferAttribute: true, setArray: function ( array ) { if ( Array.isArray( array ) ) { throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); } this.count = array !== undefined ? array.length / this.itemSize : 0; this.array = array; }, setDynamic: function ( value ) { this.dynamic = value; return this; }, copy: function ( source ) { this.array = new source.array.constructor( source.array ); this.itemSize = source.itemSize; this.count = source.count; this.normalized = source.normalized; this.dynamic = source.dynamic; return this; }, copyAt: function ( index1, attribute, index2 ) { index1 *= this.itemSize; index2 *= attribute.itemSize; for ( var i = 0, l = this.itemSize; i < l; i ++ ) { this.array[ index1 + i ] = attribute.array[ index2 + i ]; } return this; }, copyArray: function ( array ) { this.array.set( array ); return this; }, copyColorsArray: function ( colors ) { var array = this.array, offset = 0; for ( var i = 0, l = colors.length; i < l; i ++ ) { var color = colors[ i ]; if ( color === undefined ) { console.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i ); color = new Color$1(); } array[ offset ++ ] = color.r; array[ offset ++ ] = color.g; array[ offset ++ ] = color.b; } return this; }, copyIndicesArray: function ( indices ) { var array = this.array, offset = 0; for ( var i = 0, l = indices.length; i < l; i ++ ) { var index = indices[ i ]; array[ offset ++ ] = index.a; array[ offset ++ ] = index.b; array[ offset ++ ] = index.c; } return this; }, copyVector2sArray: function ( vectors ) { var array = this.array, offset = 0; for ( var i = 0, l = vectors.length; i < l; i ++ ) { var vector = vectors[ i ]; if ( vector === undefined ) { console.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i ); vector = new Vector2$1(); } array[ offset ++ ] = vector.x; array[ offset ++ ] = vector.y; } return this; }, copyVector3sArray: function ( vectors ) { var array = this.array, offset = 0; for ( var i = 0, l = vectors.length; i < l; i ++ ) { var vector = vectors[ i ]; if ( vector === undefined ) { console.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i ); vector = new Vector3$1(); } array[ offset ++ ] = vector.x; array[ offset ++ ] = vector.y; array[ offset ++ ] = vector.z; } return this; }, copyVector4sArray: function ( vectors ) { var array = this.array, offset = 0; for ( var i = 0, l = vectors.length; i < l; i ++ ) { var vector = vectors[ i ]; if ( vector === undefined ) { console.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i ); vector = new Vector4$1(); } array[ offset ++ ] = vector.x; array[ offset ++ ] = vector.y; array[ offset ++ ] = vector.z; array[ offset ++ ] = vector.w; } return this; }, set: function ( value, offset ) { if ( offset === undefined ) offset = 0; this.array.set( value, offset ); return this; }, getX: function ( index ) { return this.array[ index * this.itemSize ]; }, setX: function ( index, x ) { this.array[ index * this.itemSize ] = x; return this; }, getY: function ( index ) { return this.array[ index * this.itemSize + 1 ]; }, setY: function ( index, y ) { this.array[ index * this.itemSize + 1 ] = y; return this; }, getZ: function ( index ) { return this.array[ index * this.itemSize + 2 ]; }, setZ: function ( index, z ) { this.array[ index * this.itemSize + 2 ] = z; return this; }, getW: function ( index ) { return this.array[ index * this.itemSize + 3 ]; }, setW: function ( index, w ) { this.array[ index * this.itemSize + 3 ] = w; return this; }, setXY: function ( index, x, y ) { index *= this.itemSize; this.array[ index + 0 ] = x; this.array[ index + 1 ] = y; return this; }, setXYZ: function ( index, x, y, z ) { index *= this.itemSize; this.array[ index + 0 ] = x; this.array[ index + 1 ] = y; this.array[ index + 2 ] = z; return this; }, setXYZW: function ( index, x, y, z, w ) { index *= this.itemSize; this.array[ index + 0 ] = x; this.array[ index + 1 ] = y; this.array[ index + 2 ] = z; this.array[ index + 3 ] = w; return this; }, onUpload: function ( callback ) { this.onUploadCallback = callback; return this; }, clone: function () { return new this.constructor( this.array, this.itemSize ).copy( this ); } } ); // function Int8BufferAttribute$1( array, itemSize ) { BufferAttribute$1.call( this, new Int8Array( array ), itemSize ); } Int8BufferAttribute$1.prototype = Object.create( BufferAttribute$1.prototype ); Int8BufferAttribute$1.prototype.constructor = Int8BufferAttribute$1; function Uint8BufferAttribute$1( array, itemSize ) { BufferAttribute$1.call( this, new Uint8Array( array ), itemSize ); } Uint8BufferAttribute$1.prototype = Object.create( BufferAttribute$1.prototype ); Uint8BufferAttribute$1.prototype.constructor = Uint8BufferAttribute$1; function Uint8ClampedBufferAttribute$1( array, itemSize ) { BufferAttribute$1.call( this, new Uint8ClampedArray( array ), itemSize ); } Uint8ClampedBufferAttribute$1.prototype = Object.create( BufferAttribute$1.prototype ); Uint8ClampedBufferAttribute$1.prototype.constructor = Uint8ClampedBufferAttribute$1; function Int16BufferAttribute$1( array, itemSize ) { BufferAttribute$1.call( this, new Int16Array( array ), itemSize ); } Int16BufferAttribute$1.prototype = Object.create( BufferAttribute$1.prototype ); Int16BufferAttribute$1.prototype.constructor = Int16BufferAttribute$1; function Uint16BufferAttribute$1( array, itemSize ) { BufferAttribute$1.call( this, new Uint16Array( array ), itemSize ); } Uint16BufferAttribute$1.prototype = Object.create( BufferAttribute$1.prototype ); Uint16BufferAttribute$1.prototype.constructor = Uint16BufferAttribute$1; function Int32BufferAttribute$1( array, itemSize ) { BufferAttribute$1.call( this, new Int32Array( array ), itemSize ); } Int32BufferAttribute$1.prototype = Object.create( BufferAttribute$1.prototype ); Int32BufferAttribute$1.prototype.constructor = Int32BufferAttribute$1; function Uint32BufferAttribute$1( array, itemSize ) { BufferAttribute$1.call( this, new Uint32Array( array ), itemSize ); } Uint32BufferAttribute$1.prototype = Object.create( BufferAttribute$1.prototype ); Uint32BufferAttribute$1.prototype.constructor = Uint32BufferAttribute$1; function Float32BufferAttribute$1( array, itemSize ) { BufferAttribute$1.call( this, new Float32Array( array ), itemSize ); } Float32BufferAttribute$1.prototype = Object.create( BufferAttribute$1.prototype ); Float32BufferAttribute$1.prototype.constructor = Float32BufferAttribute$1; function Float64BufferAttribute$1( array, itemSize ) { BufferAttribute$1.call( this, new Float64Array( array ), itemSize ); } Float64BufferAttribute$1.prototype = Object.create( BufferAttribute$1.prototype ); Float64BufferAttribute$1.prototype.constructor = Float64BufferAttribute$1; /** * @author mrdoob / http://mrdoob.com/ */ function DirectGeometry$1() { this.indices = []; this.vertices = []; this.normals = []; this.colors = []; this.uvs = []; this.uvs2 = []; this.groups = []; this.morphTargets = {}; this.skinWeights = []; this.skinIndices = []; // this.lineDistances = []; this.boundingBox = null; this.boundingSphere = null; // update flags this.verticesNeedUpdate = false; this.normalsNeedUpdate = false; this.colorsNeedUpdate = false; this.uvsNeedUpdate = false; this.groupsNeedUpdate = false; } Object.assign( DirectGeometry$1.prototype, { computeGroups: function ( geometry ) { var group; var groups = []; var materialIndex = undefined; var faces = geometry.faces; for ( var i = 0; i < faces.length; i ++ ) { var face = faces[ i ]; // materials if ( face.materialIndex !== materialIndex ) { materialIndex = face.materialIndex; if ( group !== undefined ) { group.count = ( i * 3 ) - group.start; groups.push( group ); } group = { start: i * 3, materialIndex: materialIndex }; } } if ( group !== undefined ) { group.count = ( i * 3 ) - group.start; groups.push( group ); } this.groups = groups; }, fromGeometry: function ( geometry ) { var faces = geometry.faces; var vertices = geometry.vertices; var faceVertexUvs = geometry.faceVertexUvs; var hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0; var hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0; // morphs var morphTargets = geometry.morphTargets; var morphTargetsLength = morphTargets.length; var morphTargetsPosition; if ( morphTargetsLength > 0 ) { morphTargetsPosition = []; for ( var i = 0; i < morphTargetsLength; i ++ ) { morphTargetsPosition[ i ] = []; } this.morphTargets.position = morphTargetsPosition; } var morphNormals = geometry.morphNormals; var morphNormalsLength = morphNormals.length; var morphTargetsNormal; if ( morphNormalsLength > 0 ) { morphTargetsNormal = []; for ( var i = 0; i < morphNormalsLength; i ++ ) { morphTargetsNormal[ i ] = []; } this.morphTargets.normal = morphTargetsNormal; } // skins var skinIndices = geometry.skinIndices; var skinWeights = geometry.skinWeights; var hasSkinIndices = skinIndices.length === vertices.length; var hasSkinWeights = skinWeights.length === vertices.length; // for ( var i = 0; i < faces.length; i ++ ) { var face = faces[ i ]; this.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] ); var vertexNormals = face.vertexNormals; if ( vertexNormals.length === 3 ) { this.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] ); } else { var normal = face.normal; this.normals.push( normal, normal, normal ); } var vertexColors = face.vertexColors; if ( vertexColors.length === 3 ) { this.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] ); } else { var color = face.color; this.colors.push( color, color, color ); } if ( hasFaceVertexUv === true ) { var vertexUvs = faceVertexUvs[ 0 ][ i ]; if ( vertexUvs !== undefined ) { this.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); } else { console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i ); this.uvs.push( new Vector2$1(), new Vector2$1(), new Vector2$1() ); } } if ( hasFaceVertexUv2 === true ) { var vertexUvs = faceVertexUvs[ 1 ][ i ]; if ( vertexUvs !== undefined ) { this.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); } else { console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i ); this.uvs2.push( new Vector2$1(), new Vector2$1(), new Vector2$1() ); } } // morphs for ( var j = 0; j < morphTargetsLength; j ++ ) { var morphTarget = morphTargets[ j ].vertices; morphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] ); } for ( var j = 0; j < morphNormalsLength; j ++ ) { var morphNormal = morphNormals[ j ].vertexNormals[ i ]; morphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c ); } // skins if ( hasSkinIndices ) { this.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] ); } if ( hasSkinWeights ) { this.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] ); } } this.computeGroups( geometry ); this.verticesNeedUpdate = geometry.verticesNeedUpdate; this.normalsNeedUpdate = geometry.normalsNeedUpdate; this.colorsNeedUpdate = geometry.colorsNeedUpdate; this.uvsNeedUpdate = geometry.uvsNeedUpdate; this.groupsNeedUpdate = geometry.groupsNeedUpdate; return this; } } ); function arrayMax$1( array ) { if ( array.length === 0 ) return - Infinity; var max = array[ 0 ]; for ( var i = 1, l = array.length; i < l; ++ i ) { if ( array[ i ] > max ) max = array[ i ]; } return max; } /** * @author mrdoob / http://mrdoob.com/ * @author kile / http://kile.stravaganza.org/ * @author alteredq / http://alteredqualia.com/ * @author mikael emtinger / http://gomo.se/ * @author zz85 / http://www.lab4games.net/zz85/blog * @author bhouston / http://clara.io */ var count$1 = 0; function GeometryIdCount() { return count$1++; } function Geometry$1() { Object.defineProperty( this, 'id', { value: GeometryIdCount() } ); this.uuid = _Math$1.generateUUID(); this.name = ''; this.type = 'Geometry'; this.vertices = []; this.colors = []; this.faces = []; this.faceVertexUvs = [[]]; this.morphTargets = []; this.morphNormals = []; this.skinWeights = []; this.skinIndices = []; this.lineDistances = []; this.boundingBox = null; this.boundingSphere = null; // update flags this.elementsNeedUpdate = false; this.verticesNeedUpdate = false; this.uvsNeedUpdate = false; this.normalsNeedUpdate = false; this.colorsNeedUpdate = false; this.lineDistancesNeedUpdate = false; this.groupsNeedUpdate = false; } Object.assign( Geometry$1.prototype, EventDispatcher$1.prototype, { isGeometry: true, applyMatrix: function ( matrix ) { var normalMatrix = new Matrix3$1().getNormalMatrix( matrix ); for ( var i = 0, il = this.vertices.length; i < il; i ++ ) { var vertex = this.vertices[ i ]; vertex.applyMatrix4( matrix ); } for ( var i = 0, il = this.faces.length; i < il; i ++ ) { var face = this.faces[ i ]; face.normal.applyMatrix3( normalMatrix ).normalize(); for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { face.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize(); } } if ( this.boundingBox !== null ) { this.computeBoundingBox(); } if ( this.boundingSphere !== null ) { this.computeBoundingSphere(); } this.verticesNeedUpdate = true; this.normalsNeedUpdate = true; return this; }, rotateX: function () { // rotate geometry around world x-axis var m1 = new Matrix4$1(); return function rotateX( angle ) { m1.makeRotationX( angle ); this.applyMatrix( m1 ); return this; }; }(), rotateY: function () { // rotate geometry around world y-axis var m1 = new Matrix4$1(); return function rotateY( angle ) { m1.makeRotationY( angle ); this.applyMatrix( m1 ); return this; }; }(), rotateZ: function () { // rotate geometry around world z-axis var m1 = new Matrix4$1(); return function rotateZ( angle ) { m1.makeRotationZ( angle ); this.applyMatrix( m1 ); return this; }; }(), translate: function () { // translate geometry var m1 = new Matrix4$1(); return function translate( x, y, z ) { m1.makeTranslation( x, y, z ); this.applyMatrix( m1 ); return this; }; }(), scale: function () { // scale geometry var m1 = new Matrix4$1(); return function scale( x, y, z ) { m1.makeScale( x, y, z ); this.applyMatrix( m1 ); return this; }; }(), lookAt: function () { var obj = new Object3D$1(); return function lookAt( vector ) { obj.lookAt( vector ); obj.updateMatrix(); this.applyMatrix( obj.matrix ); }; }(), fromBufferGeometry: function ( geometry ) { var scope = this; var indices = geometry.index !== null ? geometry.index.array : undefined; var attributes = geometry.attributes; var positions = attributes.position.array; var normals = attributes.normal !== undefined ? attributes.normal.array : undefined; var colors = attributes.color !== undefined ? attributes.color.array : undefined; var uvs = attributes.uv !== undefined ? attributes.uv.array : undefined; var uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined; if ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = []; var tempNormals = []; var tempUVs = []; var tempUVs2 = []; for ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) { scope.vertices.push( new Vector3$1( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) ); if ( normals !== undefined ) { tempNormals.push( new Vector3$1( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) ); } if ( colors !== undefined ) { scope.colors.push( new Color$1( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) ); } if ( uvs !== undefined ) { tempUVs.push( new Vector2$1( uvs[ j ], uvs[ j + 1 ] ) ); } if ( uvs2 !== undefined ) { tempUVs2.push( new Vector2$1( uvs2[ j ], uvs2[ j + 1 ] ) ); } } function addFace( a, b, c, materialIndex ) { var vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : []; var vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : []; var face = new Face3$1( a, b, c, vertexNormals, vertexColors, materialIndex ); scope.faces.push( face ); if ( uvs !== undefined ) { scope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] ); } if ( uvs2 !== undefined ) { scope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] ); } } var groups = geometry.groups; if ( groups.length > 0 ) { for ( var i = 0; i < groups.length; i ++ ) { var group = groups[ i ]; var start = group.start; var count = group.count; for ( var j = start, jl = start + count; j < jl; j += 3 ) { if ( indices !== undefined ) { addFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex ); } else { addFace( j, j + 1, j + 2, group.materialIndex ); } } } } else { if ( indices !== undefined ) { for ( var i = 0; i < indices.length; i += 3 ) { addFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] ); } } else { for ( var i = 0; i < positions.length / 3; i += 3 ) { addFace( i, i + 1, i + 2 ); } } } this.computeFaceNormals(); if ( geometry.boundingBox !== null ) { this.boundingBox = geometry.boundingBox.clone(); } if ( geometry.boundingSphere !== null ) { this.boundingSphere = geometry.boundingSphere.clone(); } return this; }, center: function () { this.computeBoundingBox(); var offset = this.boundingBox.getCenter().negate(); this.translate( offset.x, offset.y, offset.z ); return offset; }, normalize: function () { this.computeBoundingSphere(); var center = this.boundingSphere.center; var radius = this.boundingSphere.radius; var s = radius === 0 ? 1 : 1.0 / radius; var matrix = new Matrix4$1(); matrix.set( s, 0, 0, - s * center.x, 0, s, 0, - s * center.y, 0, 0, s, - s * center.z, 0, 0, 0, 1 ); this.applyMatrix( matrix ); return this; }, computeFaceNormals: function () { var cb = new Vector3$1(), ab = new Vector3$1(); for ( var f = 0, fl = this.faces.length; f < fl; f ++ ) { var face = this.faces[ f ]; var vA = this.vertices[ face.a ]; var vB = this.vertices[ face.b ]; var vC = this.vertices[ face.c ]; cb.subVectors( vC, vB ); ab.subVectors( vA, vB ); cb.cross( ab ); cb.normalize(); face.normal.copy( cb ); } }, computeVertexNormals: function ( areaWeighted ) { if ( areaWeighted === undefined ) areaWeighted = true; var v, vl, f, fl, face, vertices; vertices = new Array( this.vertices.length ); for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { vertices[ v ] = new Vector3$1(); } if ( areaWeighted ) { // vertex normals weighted by triangle areas // http://www.iquilezles.org/www/articles/normals/normals.htm var vA, vB, vC; var cb = new Vector3$1(), ab = new Vector3$1(); for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { face = this.faces[ f ]; vA = this.vertices[ face.a ]; vB = this.vertices[ face.b ]; vC = this.vertices[ face.c ]; cb.subVectors( vC, vB ); ab.subVectors( vA, vB ); cb.cross( ab ); vertices[ face.a ].add( cb ); vertices[ face.b ].add( cb ); vertices[ face.c ].add( cb ); } } else { this.computeFaceNormals(); for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { face = this.faces[ f ]; vertices[ face.a ].add( face.normal ); vertices[ face.b ].add( face.normal ); vertices[ face.c ].add( face.normal ); } } for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { vertices[ v ].normalize(); } for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { face = this.faces[ f ]; var vertexNormals = face.vertexNormals; if ( vertexNormals.length === 3 ) { vertexNormals[ 0 ].copy( vertices[ face.a ] ); vertexNormals[ 1 ].copy( vertices[ face.b ] ); vertexNormals[ 2 ].copy( vertices[ face.c ] ); } else { vertexNormals[ 0 ] = vertices[ face.a ].clone(); vertexNormals[ 1 ] = vertices[ face.b ].clone(); vertexNormals[ 2 ] = vertices[ face.c ].clone(); } } if ( this.faces.length > 0 ) { this.normalsNeedUpdate = true; } }, computeFlatVertexNormals: function () { var f, fl, face; this.computeFaceNormals(); for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { face = this.faces[ f ]; var vertexNormals = face.vertexNormals; if ( vertexNormals.length === 3 ) { vertexNormals[ 0 ].copy( face.normal ); vertexNormals[ 1 ].copy( face.normal ); vertexNormals[ 2 ].copy( face.normal ); } else { vertexNormals[ 0 ] = face.normal.clone(); vertexNormals[ 1 ] = face.normal.clone(); vertexNormals[ 2 ] = face.normal.clone(); } } if ( this.faces.length > 0 ) { this.normalsNeedUpdate = true; } }, computeMorphNormals: function () { var i, il, f, fl, face; // save original normals // - create temp variables on first access // otherwise just copy (for faster repeated calls) for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { face = this.faces[ f ]; if ( ! face.__originalFaceNormal ) { face.__originalFaceNormal = face.normal.clone(); } else { face.__originalFaceNormal.copy( face.normal ); } if ( ! face.__originalVertexNormals ) face.__originalVertexNormals = []; for ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) { if ( ! face.__originalVertexNormals[ i ] ) { face.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone(); } else { face.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] ); } } } // use temp geometry to compute face and vertex normals for each morph var tmpGeo = new Geometry$1(); tmpGeo.faces = this.faces; for ( i = 0, il = this.morphTargets.length; i < il; i ++ ) { // create on first access if ( ! this.morphNormals[ i ] ) { this.morphNormals[ i ] = {}; this.morphNormals[ i ].faceNormals = []; this.morphNormals[ i ].vertexNormals = []; var dstNormalsFace = this.morphNormals[ i ].faceNormals; var dstNormalsVertex = this.morphNormals[ i ].vertexNormals; var faceNormal, vertexNormals; for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { faceNormal = new Vector3$1(); vertexNormals = { a: new Vector3$1(), b: new Vector3$1(), c: new Vector3$1() }; dstNormalsFace.push( faceNormal ); dstNormalsVertex.push( vertexNormals ); } } var morphNormals = this.morphNormals[ i ]; // set vertices to morph target tmpGeo.vertices = this.morphTargets[ i ].vertices; // compute morph normals tmpGeo.computeFaceNormals(); tmpGeo.computeVertexNormals(); // store morph normals var faceNormal, vertexNormals; for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { face = this.faces[ f ]; faceNormal = morphNormals.faceNormals[ f ]; vertexNormals = morphNormals.vertexNormals[ f ]; faceNormal.copy( face.normal ); vertexNormals.a.copy( face.vertexNormals[ 0 ] ); vertexNormals.b.copy( face.vertexNormals[ 1 ] ); vertexNormals.c.copy( face.vertexNormals[ 2 ] ); } } // restore original normals for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { face = this.faces[ f ]; face.normal = face.__originalFaceNormal; face.vertexNormals = face.__originalVertexNormals; } }, computeLineDistances: function () { var d = 0; var vertices = this.vertices; for ( var i = 0, il = vertices.length; i < il; i ++ ) { if ( i > 0 ) { d += vertices[ i ].distanceTo( vertices[ i - 1 ] ); } this.lineDistances[ i ] = d; } }, computeBoundingBox: function () { if ( this.boundingBox === null ) { this.boundingBox = new Box3$1(); } this.boundingBox.setFromPoints( this.vertices ); }, computeBoundingSphere: function () { if ( this.boundingSphere === null ) { this.boundingSphere = new Sphere$2(); } this.boundingSphere.setFromPoints( this.vertices ); }, merge: function ( geometry, matrix, materialIndexOffset ) { if ( ( geometry && geometry.isGeometry ) === false ) { console.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry ); return; } var normalMatrix, vertexOffset = this.vertices.length, vertices1 = this.vertices, vertices2 = geometry.vertices, faces1 = this.faces, faces2 = geometry.faces, uvs1 = this.faceVertexUvs[ 0 ], uvs2 = geometry.faceVertexUvs[ 0 ], colors1 = this.colors, colors2 = geometry.colors; if ( materialIndexOffset === undefined ) materialIndexOffset = 0; if ( matrix !== undefined ) { normalMatrix = new Matrix3$1().getNormalMatrix( matrix ); } // vertices for ( var i = 0, il = vertices2.length; i < il; i ++ ) { var vertex = vertices2[ i ]; var vertexCopy = vertex.clone(); if ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix ); vertices1.push( vertexCopy ); } // colors for ( var i = 0, il = colors2.length; i < il; i ++ ) { colors1.push( colors2[ i ].clone() ); } // faces for ( i = 0, il = faces2.length; i < il; i ++ ) { var face = faces2[ i ], faceCopy, normal, color, faceVertexNormals = face.vertexNormals, faceVertexColors = face.vertexColors; faceCopy = new Face3$1( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset ); faceCopy.normal.copy( face.normal ); if ( normalMatrix !== undefined ) { faceCopy.normal.applyMatrix3( normalMatrix ).normalize(); } for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) { normal = faceVertexNormals[ j ].clone(); if ( normalMatrix !== undefined ) { normal.applyMatrix3( normalMatrix ).normalize(); } faceCopy.vertexNormals.push( normal ); } faceCopy.color.copy( face.color ); for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) { color = faceVertexColors[ j ]; faceCopy.vertexColors.push( color.clone() ); } faceCopy.materialIndex = face.materialIndex + materialIndexOffset; faces1.push( faceCopy ); } // uvs for ( i = 0, il = uvs2.length; i < il; i ++ ) { var uv = uvs2[ i ], uvCopy = []; if ( uv === undefined ) { continue; } for ( var j = 0, jl = uv.length; j < jl; j ++ ) { uvCopy.push( uv[ j ].clone() ); } uvs1.push( uvCopy ); } }, mergeMesh: function ( mesh ) { if ( ( mesh && mesh.isMesh ) === false ) { console.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh ); return; } mesh.matrixAutoUpdate && mesh.updateMatrix(); this.merge( mesh.geometry, mesh.matrix ); }, /* * Checks for duplicate vertices with hashmap. * Duplicated vertices are removed * and faces' vertices are updated. */ mergeVertices: function () { var verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique) var unique = [], changes = []; var v, key; var precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001 var precision = Math.pow( 10, precisionPoints ); var i, il, face; var indices, j, jl; for ( i = 0, il = this.vertices.length; i < il; i ++ ) { v = this.vertices[ i ]; key = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision ); if ( verticesMap[ key ] === undefined ) { verticesMap[ key ] = i; unique.push( this.vertices[ i ] ); changes[ i ] = unique.length - 1; } else { //console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]); changes[ i ] = changes[ verticesMap[ key ] ]; } } // if faces are completely degenerate after merging vertices, we // have to remove them from the geometry. var faceIndicesToRemove = []; for ( i = 0, il = this.faces.length; i < il; i ++ ) { face = this.faces[ i ]; face.a = changes[ face.a ]; face.b = changes[ face.b ]; face.c = changes[ face.c ]; indices = [ face.a, face.b, face.c ]; // if any duplicate vertices are found in a Face3 // we have to remove the face as nothing can be saved for ( var n = 0; n < 3; n ++ ) { if ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) { faceIndicesToRemove.push( i ); break; } } } for ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) { var idx = faceIndicesToRemove[ i ]; this.faces.splice( idx, 1 ); for ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) { this.faceVertexUvs[ j ].splice( idx, 1 ); } } // Use unique set of vertices var diff = this.vertices.length - unique.length; this.vertices = unique; return diff; }, sortFacesByMaterialIndex: function () { var faces = this.faces; var length = faces.length; // tag faces for ( var i = 0; i < length; i ++ ) { faces[ i ]._id = i; } // sort faces function materialIndexSort( a, b ) { return a.materialIndex - b.materialIndex; } faces.sort( materialIndexSort ); // sort uvs var uvs1 = this.faceVertexUvs[ 0 ]; var uvs2 = this.faceVertexUvs[ 1 ]; var newUvs1, newUvs2; if ( uvs1 && uvs1.length === length ) newUvs1 = []; if ( uvs2 && uvs2.length === length ) newUvs2 = []; for ( var i = 0; i < length; i ++ ) { var id = faces[ i ]._id; if ( newUvs1 ) newUvs1.push( uvs1[ id ] ); if ( newUvs2 ) newUvs2.push( uvs2[ id ] ); } if ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1; if ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2; }, toJSON: function () { var data = { metadata: { version: 4.5, type: 'Geometry', generator: 'Geometry.toJSON' } }; // standard Geometry serialization data.uuid = this.uuid; data.type = this.type; if ( this.name !== '' ) data.name = this.name; if ( this.parameters !== undefined ) { var parameters = this.parameters; for ( var key in parameters ) { if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; } return data; } var vertices = []; for ( var i = 0; i < this.vertices.length; i ++ ) { var vertex = this.vertices[ i ]; vertices.push( vertex.x, vertex.y, vertex.z ); } var faces = []; var normals = []; var normalsHash = {}; var colors = []; var colorsHash = {}; var uvs = []; var uvsHash = {}; for ( var i = 0; i < this.faces.length; i ++ ) { var face = this.faces[ i ]; var hasMaterial = true; var hasFaceUv = false; // deprecated var hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined; var hasFaceNormal = face.normal.length() > 0; var hasFaceVertexNormal = face.vertexNormals.length > 0; var hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1; var hasFaceVertexColor = face.vertexColors.length > 0; var faceType = 0; faceType = setBit( faceType, 0, 0 ); // isQuad faceType = setBit( faceType, 1, hasMaterial ); faceType = setBit( faceType, 2, hasFaceUv ); faceType = setBit( faceType, 3, hasFaceVertexUv ); faceType = setBit( faceType, 4, hasFaceNormal ); faceType = setBit( faceType, 5, hasFaceVertexNormal ); faceType = setBit( faceType, 6, hasFaceColor ); faceType = setBit( faceType, 7, hasFaceVertexColor ); faces.push( faceType ); faces.push( face.a, face.b, face.c ); faces.push( face.materialIndex ); if ( hasFaceVertexUv ) { var faceVertexUvs = this.faceVertexUvs[ 0 ][ i ]; faces.push( getUvIndex( faceVertexUvs[ 0 ] ), getUvIndex( faceVertexUvs[ 1 ] ), getUvIndex( faceVertexUvs[ 2 ] ) ); } if ( hasFaceNormal ) { faces.push( getNormalIndex( face.normal ) ); } if ( hasFaceVertexNormal ) { var vertexNormals = face.vertexNormals; faces.push( getNormalIndex( vertexNormals[ 0 ] ), getNormalIndex( vertexNormals[ 1 ] ), getNormalIndex( vertexNormals[ 2 ] ) ); } if ( hasFaceColor ) { faces.push( getColorIndex( face.color ) ); } if ( hasFaceVertexColor ) { var vertexColors = face.vertexColors; faces.push( getColorIndex( vertexColors[ 0 ] ), getColorIndex( vertexColors[ 1 ] ), getColorIndex( vertexColors[ 2 ] ) ); } } function setBit( value, position, enabled ) { return enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) ); } function getNormalIndex( normal ) { var hash = normal.x.toString() + normal.y.toString() + normal.z.toString(); if ( normalsHash[ hash ] !== undefined ) { return normalsHash[ hash ]; } normalsHash[ hash ] = normals.length / 3; normals.push( normal.x, normal.y, normal.z ); return normalsHash[ hash ]; } function getColorIndex( color ) { var hash = color.r.toString() + color.g.toString() + color.b.toString(); if ( colorsHash[ hash ] !== undefined ) { return colorsHash[ hash ]; } colorsHash[ hash ] = colors.length; colors.push( color.getHex() ); return colorsHash[ hash ]; } function getUvIndex( uv ) { var hash = uv.x.toString() + uv.y.toString(); if ( uvsHash[ hash ] !== undefined ) { return uvsHash[ hash ]; } uvsHash[ hash ] = uvs.length / 2; uvs.push( uv.x, uv.y ); return uvsHash[ hash ]; } data.data = {}; data.data.vertices = vertices; data.data.normals = normals; if ( colors.length > 0 ) data.data.colors = colors; if ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility data.data.faces = faces; return data; }, clone: function () { /* // Handle primitives var parameters = this.parameters; if ( parameters !== undefined ) { var values = []; for ( var key in parameters ) { values.push( parameters[ key ] ); } var geometry = Object.create( this.constructor.prototype ); this.constructor.apply( geometry, values ); return geometry; } return new this.constructor().copy( this ); */ return new Geometry$1().copy( this ); }, copy: function ( source ) { var i, il, j, jl, k, kl; // reset this.vertices = []; this.colors = []; this.faces = []; this.faceVertexUvs = [[]]; this.morphTargets = []; this.morphNormals = []; this.skinWeights = []; this.skinIndices = []; this.lineDistances = []; this.boundingBox = null; this.boundingSphere = null; // name this.name = source.name; // vertices var vertices = source.vertices; for ( i = 0, il = vertices.length; i < il; i ++ ) { this.vertices.push( vertices[ i ].clone() ); } // colors var colors = source.colors; for ( i = 0, il = colors.length; i < il; i ++ ) { this.colors.push( colors[ i ].clone() ); } // faces var faces = source.faces; for ( i = 0, il = faces.length; i < il; i ++ ) { this.faces.push( faces[ i ].clone() ); } // face vertex uvs for ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) { var faceVertexUvs = source.faceVertexUvs[ i ]; if ( this.faceVertexUvs[ i ] === undefined ) { this.faceVertexUvs[ i ] = []; } for ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) { var uvs = faceVertexUvs[ j ], uvsCopy = []; for ( k = 0, kl = uvs.length; k < kl; k ++ ) { var uv = uvs[ k ]; uvsCopy.push( uv.clone() ); } this.faceVertexUvs[ i ].push( uvsCopy ); } } // morph targets var morphTargets = source.morphTargets; for ( i = 0, il = morphTargets.length; i < il; i ++ ) { var morphTarget = {}; morphTarget.name = morphTargets[ i ].name; // vertices if ( morphTargets[ i ].vertices !== undefined ) { morphTarget.vertices = []; for ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) { morphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() ); } } // normals if ( morphTargets[ i ].normals !== undefined ) { morphTarget.normals = []; for ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) { morphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() ); } } this.morphTargets.push( morphTarget ); } // morph normals var morphNormals = source.morphNormals; for ( i = 0, il = morphNormals.length; i < il; i ++ ) { var morphNormal = {}; // vertex normals if ( morphNormals[ i ].vertexNormals !== undefined ) { morphNormal.vertexNormals = []; for ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) { var srcVertexNormal = morphNormals[ i ].vertexNormals[ j ]; var destVertexNormal = {}; destVertexNormal.a = srcVertexNormal.a.clone(); destVertexNormal.b = srcVertexNormal.b.clone(); destVertexNormal.c = srcVertexNormal.c.clone(); morphNormal.vertexNormals.push( destVertexNormal ); } } // face normals if ( morphNormals[ i ].faceNormals !== undefined ) { morphNormal.faceNormals = []; for ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) { morphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() ); } } this.morphNormals.push( morphNormal ); } // skin weights var skinWeights = source.skinWeights; for ( i = 0, il = skinWeights.length; i < il; i ++ ) { this.skinWeights.push( skinWeights[ i ].clone() ); } // skin indices var skinIndices = source.skinIndices; for ( i = 0, il = skinIndices.length; i < il; i ++ ) { this.skinIndices.push( skinIndices[ i ].clone() ); } // line distances var lineDistances = source.lineDistances; for ( i = 0, il = lineDistances.length; i < il; i ++ ) { this.lineDistances.push( lineDistances[ i ] ); } // bounding box var boundingBox = source.boundingBox; if ( boundingBox !== null ) { this.boundingBox = boundingBox.clone(); } // bounding sphere var boundingSphere = source.boundingSphere; if ( boundingSphere !== null ) { this.boundingSphere = boundingSphere.clone(); } // update flags this.elementsNeedUpdate = source.elementsNeedUpdate; this.verticesNeedUpdate = source.verticesNeedUpdate; this.uvsNeedUpdate = source.uvsNeedUpdate; this.normalsNeedUpdate = source.normalsNeedUpdate; this.colorsNeedUpdate = source.colorsNeedUpdate; this.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate; this.groupsNeedUpdate = source.groupsNeedUpdate; return this; }, dispose: function () { this.dispatchEvent( { type: 'dispose' } ); } } ); /** * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ */ function BufferGeometry$1() { Object.defineProperty( this, 'id', { value: GeometryIdCount() } ); this.uuid = _Math$1.generateUUID(); this.name = ''; this.type = 'BufferGeometry'; this.index = null; this.attributes = {}; this.morphAttributes = {}; this.groups = []; this.boundingBox = null; this.boundingSphere = null; this.drawRange = { start: 0, count: Infinity }; } BufferGeometry$1.MaxIndex = 65535; Object.assign( BufferGeometry$1.prototype, EventDispatcher$1.prototype, { isBufferGeometry: true, getIndex: function () { return this.index; }, setIndex: function ( index ) { if ( Array.isArray( index ) ) { this.index = new ( arrayMax$1( index ) > 65535 ? Uint32BufferAttribute$1 : Uint16BufferAttribute$1 )( index, 1 ); } else { this.index = index; } }, addAttribute: function ( name, attribute ) { if ( ( attribute && attribute.isBufferAttribute ) === false && ( attribute && attribute.isInterleavedBufferAttribute ) === false ) { console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' ); this.addAttribute( name, new BufferAttribute$1( arguments[ 1 ], arguments[ 2 ] ) ); return; } if ( name === 'index' ) { console.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' ); this.setIndex( attribute ); return; } this.attributes[ name ] = attribute; return this; }, getAttribute: function ( name ) { return this.attributes[ name ]; }, removeAttribute: function ( name ) { delete this.attributes[ name ]; return this; }, addGroup: function ( start, count, materialIndex ) { this.groups.push( { start: start, count: count, materialIndex: materialIndex !== undefined ? materialIndex : 0 } ); }, clearGroups: function () { this.groups = []; }, setDrawRange: function ( start, count ) { this.drawRange.start = start; this.drawRange.count = count; }, applyMatrix: function ( matrix ) { var position = this.attributes.position; if ( position !== undefined ) { matrix.applyToBufferAttribute( position ); position.needsUpdate = true; } var normal = this.attributes.normal; if ( normal !== undefined ) { var normalMatrix = new Matrix3$1().getNormalMatrix( matrix ); normalMatrix.applyToBufferAttribute( normal ); normal.needsUpdate = true; } if ( this.boundingBox !== null ) { this.computeBoundingBox(); } if ( this.boundingSphere !== null ) { this.computeBoundingSphere(); } return this; }, rotateX: function () { // rotate geometry around world x-axis var m1 = new Matrix4$1(); return function rotateX( angle ) { m1.makeRotationX( angle ); this.applyMatrix( m1 ); return this; }; }(), rotateY: function () { // rotate geometry around world y-axis var m1 = new Matrix4$1(); return function rotateY( angle ) { m1.makeRotationY( angle ); this.applyMatrix( m1 ); return this; }; }(), rotateZ: function () { // rotate geometry around world z-axis var m1 = new Matrix4$1(); return function rotateZ( angle ) { m1.makeRotationZ( angle ); this.applyMatrix( m1 ); return this; }; }(), translate: function () { // translate geometry var m1 = new Matrix4$1(); return function translate( x, y, z ) { m1.makeTranslation( x, y, z ); this.applyMatrix( m1 ); return this; }; }(), scale: function () { // scale geometry var m1 = new Matrix4$1(); return function scale( x, y, z ) { m1.makeScale( x, y, z ); this.applyMatrix( m1 ); return this; }; }(), lookAt: function () { var obj = new Object3D$1(); return function lookAt( vector ) { obj.lookAt( vector ); obj.updateMatrix(); this.applyMatrix( obj.matrix ); }; }(), center: function () { this.computeBoundingBox(); var offset = this.boundingBox.getCenter().negate(); this.translate( offset.x, offset.y, offset.z ); return offset; }, setFromObject: function ( object ) { // console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this ); var geometry = object.geometry; if ( object.isPoints || object.isLine ) { var positions = new Float32BufferAttribute$1( geometry.vertices.length * 3, 3 ); var colors = new Float32BufferAttribute$1( geometry.colors.length * 3, 3 ); this.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) ); this.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) ); if ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) { var lineDistances = new Float32BufferAttribute$1( geometry.lineDistances.length, 1 ); this.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) ); } if ( geometry.boundingSphere !== null ) { this.boundingSphere = geometry.boundingSphere.clone(); } if ( geometry.boundingBox !== null ) { this.boundingBox = geometry.boundingBox.clone(); } } else if ( object.isMesh ) { if ( geometry && geometry.isGeometry ) { this.fromGeometry( geometry ); } } return this; }, updateFromObject: function ( object ) { var geometry = object.geometry; if ( object.isMesh ) { var direct = geometry.__directGeometry; if ( geometry.elementsNeedUpdate === true ) { direct = undefined; geometry.elementsNeedUpdate = false; } if ( direct === undefined ) { return this.fromGeometry( geometry ); } direct.verticesNeedUpdate = geometry.verticesNeedUpdate; direct.normalsNeedUpdate = geometry.normalsNeedUpdate; direct.colorsNeedUpdate = geometry.colorsNeedUpdate; direct.uvsNeedUpdate = geometry.uvsNeedUpdate; direct.groupsNeedUpdate = geometry.groupsNeedUpdate; geometry.verticesNeedUpdate = false; geometry.normalsNeedUpdate = false; geometry.colorsNeedUpdate = false; geometry.uvsNeedUpdate = false; geometry.groupsNeedUpdate = false; geometry = direct; } var attribute; if ( geometry.verticesNeedUpdate === true ) { attribute = this.attributes.position; if ( attribute !== undefined ) { attribute.copyVector3sArray( geometry.vertices ); attribute.needsUpdate = true; } geometry.verticesNeedUpdate = false; } if ( geometry.normalsNeedUpdate === true ) { attribute = this.attributes.normal; if ( attribute !== undefined ) { attribute.copyVector3sArray( geometry.normals ); attribute.needsUpdate = true; } geometry.normalsNeedUpdate = false; } if ( geometry.colorsNeedUpdate === true ) { attribute = this.attributes.color; if ( attribute !== undefined ) { attribute.copyColorsArray( geometry.colors ); attribute.needsUpdate = true; } geometry.colorsNeedUpdate = false; } if ( geometry.uvsNeedUpdate ) { attribute = this.attributes.uv; if ( attribute !== undefined ) { attribute.copyVector2sArray( geometry.uvs ); attribute.needsUpdate = true; } geometry.uvsNeedUpdate = false; } if ( geometry.lineDistancesNeedUpdate ) { attribute = this.attributes.lineDistance; if ( attribute !== undefined ) { attribute.copyArray( geometry.lineDistances ); attribute.needsUpdate = true; } geometry.lineDistancesNeedUpdate = false; } if ( geometry.groupsNeedUpdate ) { geometry.computeGroups( object.geometry ); this.groups = geometry.groups; geometry.groupsNeedUpdate = false; } return this; }, fromGeometry: function ( geometry ) { geometry.__directGeometry = new DirectGeometry$1().fromGeometry( geometry ); return this.fromDirectGeometry( geometry.__directGeometry ); }, fromDirectGeometry: function ( geometry ) { var positions = new Float32Array( geometry.vertices.length * 3 ); this.addAttribute( 'position', new BufferAttribute$1( positions, 3 ).copyVector3sArray( geometry.vertices ) ); if ( geometry.normals.length > 0 ) { var normals = new Float32Array( geometry.normals.length * 3 ); this.addAttribute( 'normal', new BufferAttribute$1( normals, 3 ).copyVector3sArray( geometry.normals ) ); } if ( geometry.colors.length > 0 ) { var colors = new Float32Array( geometry.colors.length * 3 ); this.addAttribute( 'color', new BufferAttribute$1( colors, 3 ).copyColorsArray( geometry.colors ) ); } if ( geometry.uvs.length > 0 ) { var uvs = new Float32Array( geometry.uvs.length * 2 ); this.addAttribute( 'uv', new BufferAttribute$1( uvs, 2 ).copyVector2sArray( geometry.uvs ) ); } if ( geometry.uvs2.length > 0 ) { var uvs2 = new Float32Array( geometry.uvs2.length * 2 ); this.addAttribute( 'uv2', new BufferAttribute$1( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) ); } if ( geometry.indices.length > 0 ) { var TypeArray = arrayMax$1( geometry.indices ) > 65535 ? Uint32Array : Uint16Array; var indices = new TypeArray( geometry.indices.length * 3 ); this.setIndex( new BufferAttribute$1( indices, 1 ).copyIndicesArray( geometry.indices ) ); } // groups this.groups = geometry.groups; // morphs for ( var name in geometry.morphTargets ) { var array = []; var morphTargets = geometry.morphTargets[ name ]; for ( var i = 0, l = morphTargets.length; i < l; i ++ ) { var morphTarget = morphTargets[ i ]; var attribute = new Float32BufferAttribute$1( morphTarget.length * 3, 3 ); array.push( attribute.copyVector3sArray( morphTarget ) ); } this.morphAttributes[ name ] = array; } // skinning if ( geometry.skinIndices.length > 0 ) { var skinIndices = new Float32BufferAttribute$1( geometry.skinIndices.length * 4, 4 ); this.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) ); } if ( geometry.skinWeights.length > 0 ) { var skinWeights = new Float32BufferAttribute$1( geometry.skinWeights.length * 4, 4 ); this.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) ); } // if ( geometry.boundingSphere !== null ) { this.boundingSphere = geometry.boundingSphere.clone(); } if ( geometry.boundingBox !== null ) { this.boundingBox = geometry.boundingBox.clone(); } return this; }, computeBoundingBox: function () { if ( this.boundingBox === null ) { this.boundingBox = new Box3$1(); } var position = this.attributes.position; if ( position !== undefined ) { this.boundingBox.setFromBufferAttribute( position ); } else { this.boundingBox.makeEmpty(); } if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) { console.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this ); } }, computeBoundingSphere: function () { var box = new Box3$1(); var vector = new Vector3$1(); return function computeBoundingSphere() { if ( this.boundingSphere === null ) { this.boundingSphere = new Sphere$2(); } var position = this.attributes.position; if ( position ) { var center = this.boundingSphere.center; box.setFromBufferAttribute( position ); box.getCenter( center ); // hoping to find a boundingSphere with a radius smaller than the // boundingSphere of the boundingBox: sqrt(3) smaller in the best case var maxRadiusSq = 0; for ( var i = 0, il = position.count; i < il; i ++ ) { vector.x = position.getX( i ); vector.y = position.getY( i ); vector.z = position.getZ( i ); maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) ); } this.boundingSphere.radius = Math.sqrt( maxRadiusSq ); if ( isNaN( this.boundingSphere.radius ) ) { console.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this ); } } }; }(), computeFaceNormals: function () { // backwards compatibility }, computeVertexNormals: function () { var index = this.index; var attributes = this.attributes; var groups = this.groups; if ( attributes.position ) { var positions = attributes.position.array; if ( attributes.normal === undefined ) { this.addAttribute( 'normal', new BufferAttribute$1( new Float32Array( positions.length ), 3 ) ); } else { // reset existing normals to zero var array = attributes.normal.array; for ( var i = 0, il = array.length; i < il; i ++ ) { array[ i ] = 0; } } var normals = attributes.normal.array; var vA, vB, vC; var pA = new Vector3$1(), pB = new Vector3$1(), pC = new Vector3$1(); var cb = new Vector3$1(), ab = new Vector3$1(); // indexed elements if ( index ) { var indices = index.array; if ( groups.length === 0 ) { this.addGroup( 0, indices.length ); } for ( var j = 0, jl = groups.length; j < jl; ++ j ) { var group = groups[ j ]; var start = group.start; var count = group.count; for ( var i = start, il = start + count; i < il; i += 3 ) { vA = indices[ i + 0 ] * 3; vB = indices[ i + 1 ] * 3; vC = indices[ i + 2 ] * 3; pA.fromArray( positions, vA ); pB.fromArray( positions, vB ); pC.fromArray( positions, vC ); cb.subVectors( pC, pB ); ab.subVectors( pA, pB ); cb.cross( ab ); normals[ vA ] += cb.x; normals[ vA + 1 ] += cb.y; normals[ vA + 2 ] += cb.z; normals[ vB ] += cb.x; normals[ vB + 1 ] += cb.y; normals[ vB + 2 ] += cb.z; normals[ vC ] += cb.x; normals[ vC + 1 ] += cb.y; normals[ vC + 2 ] += cb.z; } } } else { // non-indexed elements (unconnected triangle soup) for ( var i = 0, il = positions.length; i < il; i += 9 ) { pA.fromArray( positions, i ); pB.fromArray( positions, i + 3 ); pC.fromArray( positions, i + 6 ); cb.subVectors( pC, pB ); ab.subVectors( pA, pB ); cb.cross( ab ); normals[ i ] = cb.x; normals[ i + 1 ] = cb.y; normals[ i + 2 ] = cb.z; normals[ i + 3 ] = cb.x; normals[ i + 4 ] = cb.y; normals[ i + 5 ] = cb.z; normals[ i + 6 ] = cb.x; normals[ i + 7 ] = cb.y; normals[ i + 8 ] = cb.z; } } this.normalizeNormals(); attributes.normal.needsUpdate = true; } }, merge: function ( geometry, offset ) { if ( ( geometry && geometry.isBufferGeometry ) === false ) { console.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry ); return; } if ( offset === undefined ) offset = 0; var attributes = this.attributes; for ( var key in attributes ) { if ( geometry.attributes[ key ] === undefined ) continue; var attribute1 = attributes[ key ]; var attributeArray1 = attribute1.array; var attribute2 = geometry.attributes[ key ]; var attributeArray2 = attribute2.array; var attributeSize = attribute2.itemSize; for ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) { attributeArray1[ j ] = attributeArray2[ i ]; } } return this; }, normalizeNormals: function () { var normals = this.attributes.normal; var x, y, z, n; for ( var i = 0, il = normals.count; i < il; i ++ ) { x = normals.getX( i ); y = normals.getY( i ); z = normals.getZ( i ); n = 1.0 / Math.sqrt( x * x + y * y + z * z ); normals.setXYZ( i, x * n, y * n, z * n ); } }, toNonIndexed: function () { if ( this.index === null ) { console.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' ); return this; } var geometry2 = new BufferGeometry$1(); var indices = this.index.array; var attributes = this.attributes; for ( var name in attributes ) { var attribute = attributes[ name ]; var array = attribute.array; var itemSize = attribute.itemSize; var array2 = new array.constructor( indices.length * itemSize ); var index = 0, index2 = 0; for ( var i = 0, l = indices.length; i < l; i ++ ) { index = indices[ i ] * itemSize; for ( var j = 0; j < itemSize; j ++ ) { array2[ index2 ++ ] = array[ index ++ ]; } } geometry2.addAttribute( name, new BufferAttribute$1( array2, itemSize ) ); } return geometry2; }, toJSON: function () { var data = { metadata: { version: 4.5, type: 'BufferGeometry', generator: 'BufferGeometry.toJSON' } }; // standard BufferGeometry serialization data.uuid = this.uuid; data.type = this.type; if ( this.name !== '' ) data.name = this.name; if ( this.parameters !== undefined ) { var parameters = this.parameters; for ( var key in parameters ) { if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; } return data; } data.data = { attributes: {} }; var index = this.index; if ( index !== null ) { var array = Array.prototype.slice.call( index.array ); data.data.index = { type: index.array.constructor.name, array: array }; } var attributes = this.attributes; for ( var key in attributes ) { var attribute = attributes[ key ]; var array = Array.prototype.slice.call( attribute.array ); data.data.attributes[ key ] = { itemSize: attribute.itemSize, type: attribute.array.constructor.name, array: array, normalized: attribute.normalized }; } var groups = this.groups; if ( groups.length > 0 ) { data.data.groups = JSON.parse( JSON.stringify( groups ) ); } var boundingSphere = this.boundingSphere; if ( boundingSphere !== null ) { data.data.boundingSphere = { center: boundingSphere.center.toArray(), radius: boundingSphere.radius }; } return data; }, clone: function () { /* // Handle primitives var parameters = this.parameters; if ( parameters !== undefined ) { var values = []; for ( var key in parameters ) { values.push( parameters[ key ] ); } var geometry = Object.create( this.constructor.prototype ); this.constructor.apply( geometry, values ); return geometry; } return new this.constructor().copy( this ); */ return new BufferGeometry$1().copy( this ); }, copy: function ( source ) { var name, i, l; // reset this.index = null; this.attributes = {}; this.morphAttributes = {}; this.groups = []; this.boundingBox = null; this.boundingSphere = null; // name this.name = source.name; // index var index = source.index; if ( index !== null ) { this.setIndex( index.clone() ); } // attributes var attributes = source.attributes; for ( name in attributes ) { var attribute = attributes[ name ]; this.addAttribute( name, attribute.clone() ); } // morph attributes var morphAttributes = source.morphAttributes; for ( name in morphAttributes ) { var array = []; var morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes for ( i = 0, l = morphAttribute.length; i < l; i ++ ) { array.push( morphAttribute[ i ].clone() ); } this.morphAttributes[ name ] = array; } // groups var groups = source.groups; for ( i = 0, l = groups.length; i < l; i ++ ) { var group = groups[ i ]; this.addGroup( group.start, group.count, group.materialIndex ); } // bounding box var boundingBox = source.boundingBox; if ( boundingBox !== null ) { this.boundingBox = boundingBox.clone(); } // bounding sphere var boundingSphere = source.boundingSphere; if ( boundingSphere !== null ) { this.boundingSphere = boundingSphere.clone(); } // draw range this.drawRange.start = source.drawRange.start; this.drawRange.count = source.drawRange.count; return this; }, dispose: function () { this.dispatchEvent( { type: 'dispose' } ); } } ); /** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ * @author mikael emtinger / http://gomo.se/ * @author jonobr1 / http://jonobr1.com/ */ function Mesh$1( geometry, material ) { Object3D$1.call( this ); this.type = 'Mesh'; this.geometry = geometry !== undefined ? geometry : new BufferGeometry$1(); this.material = material !== undefined ? material : new MeshBasicMaterial$1( { color: Math.random() * 0xffffff } ); this.drawMode = TrianglesDrawMode$1; this.updateMorphTargets(); } Mesh$1.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: Mesh$1, isMesh: true, setDrawMode: function ( value ) { this.drawMode = value; }, copy: function ( source ) { Object3D$1.prototype.copy.call( this, source ); this.drawMode = source.drawMode; return this; }, updateMorphTargets: function () { var morphTargets = this.geometry.morphTargets; if ( morphTargets !== undefined && morphTargets.length > 0 ) { this.morphTargetInfluences = []; this.morphTargetDictionary = {}; for ( var m = 0, ml = morphTargets.length; m < ml; m ++ ) { this.morphTargetInfluences.push( 0 ); this.morphTargetDictionary[ morphTargets[ m ].name ] = m; } } }, raycast: ( function () { var inverseMatrix = new Matrix4$1(); var ray = new Ray$1(); var sphere = new Sphere$2(); var vA = new Vector3$1(); var vB = new Vector3$1(); var vC = new Vector3$1(); var tempA = new Vector3$1(); var tempB = new Vector3$1(); var tempC = new Vector3$1(); var uvA = new Vector2$1(); var uvB = new Vector2$1(); var uvC = new Vector2$1(); var barycoord = new Vector3$1(); var intersectionPoint = new Vector3$1(); var intersectionPointWorld = new Vector3$1(); function uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) { Triangle$1.barycoordFromPoint( point, p1, p2, p3, barycoord ); uv1.multiplyScalar( barycoord.x ); uv2.multiplyScalar( barycoord.y ); uv3.multiplyScalar( barycoord.z ); uv1.add( uv2 ).add( uv3 ); return uv1.clone(); } function checkIntersection( object, raycaster, ray, pA, pB, pC, point ) { var intersect; var material = object.material; if ( material.side === BackSide$1 ) { intersect = ray.intersectTriangle( pC, pB, pA, true, point ); } else { intersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide$1, point ); } if ( intersect === null ) return null; intersectionPointWorld.copy( point ); intersectionPointWorld.applyMatrix4( object.matrixWorld ); var distance = raycaster.ray.origin.distanceTo( intersectionPointWorld ); if ( distance < raycaster.near || distance > raycaster.far ) return null; return { distance: distance, point: intersectionPointWorld.clone(), object: object }; } function checkBufferGeometryIntersection( object, raycaster, ray, position, uv, a, b, c ) { vA.fromBufferAttribute( position, a ); vB.fromBufferAttribute( position, b ); vC.fromBufferAttribute( position, c ); var intersection = checkIntersection( object, raycaster, ray, vA, vB, vC, intersectionPoint ); if ( intersection ) { if ( uv ) { uvA.fromBufferAttribute( uv, a ); uvB.fromBufferAttribute( uv, b ); uvC.fromBufferAttribute( uv, c ); intersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC ); } intersection.face = new Face3$1( a, b, c, Triangle$1.normal( vA, vB, vC ) ); intersection.faceIndex = a; } return intersection; } return function raycast( raycaster, intersects ) { var geometry = this.geometry; var material = this.material; var matrixWorld = this.matrixWorld; if ( material === undefined ) return; // Checking boundingSphere distance to ray if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); sphere.copy( geometry.boundingSphere ); sphere.applyMatrix4( matrixWorld ); if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; // inverseMatrix.getInverse( matrixWorld ); ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); // Check boundingBox before continuing if ( geometry.boundingBox !== null ) { if ( ray.intersectsBox( geometry.boundingBox ) === false ) return; } var intersection; if ( geometry.isBufferGeometry ) { var a, b, c; var index = geometry.index; var position = geometry.attributes.position; var uv = geometry.attributes.uv; var i, l; if ( index !== null ) { // indexed buffer geometry for ( i = 0, l = index.count; i < l; i += 3 ) { a = index.getX( i ); b = index.getX( i + 1 ); c = index.getX( i + 2 ); intersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c ); if ( intersection ) { intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics intersects.push( intersection ); } } } else { // non-indexed buffer geometry for ( i = 0, l = position.count; i < l; i += 3 ) { a = i; b = i + 1; c = i + 2; intersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c ); if ( intersection ) { intersection.index = a; // triangle number in positions buffer semantics intersects.push( intersection ); } } } } else if ( geometry.isGeometry ) { var fvA, fvB, fvC; var isMultiMaterial = Array.isArray( material ); var vertices = geometry.vertices; var faces = geometry.faces; var uvs; var faceVertexUvs = geometry.faceVertexUvs[ 0 ]; if ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs; for ( var f = 0, fl = faces.length; f < fl; f ++ ) { var face = faces[ f ]; var faceMaterial = isMultiMaterial ? material[ face.materialIndex ] : material; if ( faceMaterial === undefined ) continue; fvA = vertices[ face.a ]; fvB = vertices[ face.b ]; fvC = vertices[ face.c ]; if ( faceMaterial.morphTargets === true ) { var morphTargets = geometry.morphTargets; var morphInfluences = this.morphTargetInfluences; vA.set( 0, 0, 0 ); vB.set( 0, 0, 0 ); vC.set( 0, 0, 0 ); for ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) { var influence = morphInfluences[ t ]; if ( influence === 0 ) continue; var targets = morphTargets[ t ].vertices; vA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence ); vB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence ); vC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence ); } vA.add( fvA ); vB.add( fvB ); vC.add( fvC ); fvA = vA; fvB = vB; fvC = vC; } intersection = checkIntersection( this, raycaster, ray, fvA, fvB, fvC, intersectionPoint ); if ( intersection ) { if ( uvs && uvs[ f ] ) { var uvs_f = uvs[ f ]; uvA.copy( uvs_f[ 0 ] ); uvB.copy( uvs_f[ 1 ] ); uvC.copy( uvs_f[ 2 ] ); intersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC ); } intersection.face = face; intersection.faceIndex = f; intersects.push( intersection ); } } } }; }() ), clone: function () { return new this.constructor( this.geometry, this.material ).copy( this ); } } ); /** * @author mrdoob / http://mrdoob.com/ * @author Mugen87 / https://github.com/Mugen87 */ // BoxGeometry function BoxGeometry$1( width, height, depth, widthSegments, heightSegments, depthSegments ) { Geometry$1.call( this ); this.type = 'BoxGeometry'; this.parameters = { width: width, height: height, depth: depth, widthSegments: widthSegments, heightSegments: heightSegments, depthSegments: depthSegments }; this.fromBufferGeometry( new BoxBufferGeometry$1( width, height, depth, widthSegments, heightSegments, depthSegments ) ); this.mergeVertices(); } BoxGeometry$1.prototype = Object.create( Geometry$1.prototype ); BoxGeometry$1.prototype.constructor = BoxGeometry$1; // BoxBufferGeometry function BoxBufferGeometry$1( width, height, depth, widthSegments, heightSegments, depthSegments ) { BufferGeometry$1.call( this ); this.type = 'BoxBufferGeometry'; this.parameters = { width: width, height: height, depth: depth, widthSegments: widthSegments, heightSegments: heightSegments, depthSegments: depthSegments }; var scope = this; // segments widthSegments = Math.floor( widthSegments ) || 1; heightSegments = Math.floor( heightSegments ) || 1; depthSegments = Math.floor( depthSegments ) || 1; // buffers var indices = []; var vertices = []; var normals = []; var uvs = []; // helper variables var numberOfVertices = 0; var groupStart = 0; // build each side of the box geometry buildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px buildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx buildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py buildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny buildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz buildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz // build geometry this.setIndex( indices ); this.addAttribute( 'position', new Float32BufferAttribute$1( vertices, 3 ) ); this.addAttribute( 'normal', new Float32BufferAttribute$1( normals, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( uvs, 2 ) ); function buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) { var segmentWidth = width / gridX; var segmentHeight = height / gridY; var widthHalf = width / 2; var heightHalf = height / 2; var depthHalf = depth / 2; var gridX1 = gridX + 1; var gridY1 = gridY + 1; var vertexCounter = 0; var groupCount = 0; var ix, iy; var vector = new Vector3$1(); // generate vertices, normals and uvs for ( iy = 0; iy < gridY1; iy ++ ) { var y = iy * segmentHeight - heightHalf; for ( ix = 0; ix < gridX1; ix ++ ) { var x = ix * segmentWidth - widthHalf; // set values to correct vector component vector[ u ] = x * udir; vector[ v ] = y * vdir; vector[ w ] = depthHalf; // now apply vector to vertex buffer vertices.push( vector.x, vector.y, vector.z ); // set values to correct vector component vector[ u ] = 0; vector[ v ] = 0; vector[ w ] = depth > 0 ? 1 : - 1; // now apply vector to normal buffer normals.push( vector.x, vector.y, vector.z ); // uvs uvs.push( ix / gridX ); uvs.push( 1 - ( iy / gridY ) ); // counters vertexCounter += 1; } } // indices // 1. you need three indices to draw a single face // 2. a single segment consists of two faces // 3. so we need to generate six (2*3) indices per segment for ( iy = 0; iy < gridY; iy ++ ) { for ( ix = 0; ix < gridX; ix ++ ) { var a = numberOfVertices + ix + gridX1 * iy; var b = numberOfVertices + ix + gridX1 * ( iy + 1 ); var c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 ); var d = numberOfVertices + ( ix + 1 ) + gridX1 * iy; // faces indices.push( a, b, d ); indices.push( b, c, d ); // increase counter groupCount += 6; } } // add a group to the geometry. this will ensure multi material support scope.addGroup( groupStart, groupCount, materialIndex ); // calculate new start value for groups groupStart += groupCount; // update total number of vertices numberOfVertices += vertexCounter; } } BoxBufferGeometry$1.prototype = Object.create( BufferGeometry$1.prototype ); BoxBufferGeometry$1.prototype.constructor = BoxBufferGeometry$1; /** * @author mrdoob / http://mrdoob.com/ * @author Mugen87 / https://github.com/Mugen87 */ // PlaneGeometry function PlaneGeometry$1( width, height, widthSegments, heightSegments ) { Geometry$1.call( this ); this.type = 'PlaneGeometry'; this.parameters = { width: width, height: height, widthSegments: widthSegments, heightSegments: heightSegments }; this.fromBufferGeometry( new PlaneBufferGeometry$1( width, height, widthSegments, heightSegments ) ); this.mergeVertices(); } PlaneGeometry$1.prototype = Object.create( Geometry$1.prototype ); PlaneGeometry$1.prototype.constructor = PlaneGeometry$1; // PlaneBufferGeometry function PlaneBufferGeometry$1( width, height, widthSegments, heightSegments ) { BufferGeometry$1.call( this ); this.type = 'PlaneBufferGeometry'; this.parameters = { width: width, height: height, widthSegments: widthSegments, heightSegments: heightSegments }; var width_half = width / 2; var height_half = height / 2; var gridX = Math.floor( widthSegments ) || 1; var gridY = Math.floor( heightSegments ) || 1; var gridX1 = gridX + 1; var gridY1 = gridY + 1; var segment_width = width / gridX; var segment_height = height / gridY; var ix, iy; // buffers var indices = []; var vertices = []; var normals = []; var uvs = []; // generate vertices, normals and uvs for ( iy = 0; iy < gridY1; iy ++ ) { var y = iy * segment_height - height_half; for ( ix = 0; ix < gridX1; ix ++ ) { var x = ix * segment_width - width_half; vertices.push( x, - y, 0 ); normals.push( 0, 0, 1 ); uvs.push( ix / gridX ); uvs.push( 1 - ( iy / gridY ) ); } } // indices for ( iy = 0; iy < gridY; iy ++ ) { for ( ix = 0; ix < gridX; ix ++ ) { var a = ix + gridX1 * iy; var b = ix + gridX1 * ( iy + 1 ); var c = ( ix + 1 ) + gridX1 * ( iy + 1 ); var d = ( ix + 1 ) + gridX1 * iy; // faces indices.push( a, b, d ); indices.push( b, c, d ); } } // build geometry this.setIndex( indices ); this.addAttribute( 'position', new Float32BufferAttribute$1( vertices, 3 ) ); this.addAttribute( 'normal', new Float32BufferAttribute$1( normals, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( uvs, 2 ) ); } PlaneBufferGeometry$1.prototype = Object.create( BufferGeometry$1.prototype ); PlaneBufferGeometry$1.prototype.constructor = PlaneBufferGeometry$1; /** * @author mrdoob / http://mrdoob.com/ * @author mikael emtinger / http://gomo.se/ * @author WestLangley / http://github.com/WestLangley */ function Camera$1() { Object3D$1.call( this ); this.type = 'Camera'; this.matrixWorldInverse = new Matrix4$1(); this.projectionMatrix = new Matrix4$1(); } Camera$1.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: Camera$1, isCamera: true, copy: function ( source ) { Object3D$1.prototype.copy.call( this, source ); this.matrixWorldInverse.copy( source.matrixWorldInverse ); this.projectionMatrix.copy( source.projectionMatrix ); return this; }, getWorldDirection: function () { var quaternion = new Quaternion$1(); return function getWorldDirection( optionalTarget ) { var result = optionalTarget || new Vector3$1(); this.getWorldQuaternion( quaternion ); return result.set( 0, 0, - 1 ).applyQuaternion( quaternion ); }; }(), clone: function () { return new this.constructor().copy( this ); } } ); /** * @author mrdoob / http://mrdoob.com/ * @author greggman / http://games.greggman.com/ * @author zz85 / http://www.lab4games.net/zz85/blog * @author tschw */ function PerspectiveCamera$2( fov, aspect, near, far ) { Camera$1.call( this ); this.type = 'PerspectiveCamera'; this.fov = fov !== undefined ? fov : 50; this.zoom = 1; this.near = near !== undefined ? near : 0.1; this.far = far !== undefined ? far : 2000; this.focus = 10; this.aspect = aspect !== undefined ? aspect : 1; this.view = null; this.filmGauge = 35; // width of the film (default in millimeters) this.filmOffset = 0; // horizontal film offset (same unit as gauge) this.updateProjectionMatrix(); } PerspectiveCamera$2.prototype = Object.assign( Object.create( Camera$1.prototype ), { constructor: PerspectiveCamera$2, isPerspectiveCamera: true, copy: function ( source ) { Camera$1.prototype.copy.call( this, source ); this.fov = source.fov; this.zoom = source.zoom; this.near = source.near; this.far = source.far; this.focus = source.focus; this.aspect = source.aspect; this.view = source.view === null ? null : Object.assign( {}, source.view ); this.filmGauge = source.filmGauge; this.filmOffset = source.filmOffset; return this; }, /** * Sets the FOV by focal length in respect to the current .filmGauge. * * The default film gauge is 35, so that the focal length can be specified for * a 35mm (full frame) camera. * * Values for focal length and film gauge must have the same unit. */ setFocalLength: function ( focalLength ) { // see http://www.bobatkins.com/photography/technical/field_of_view.html var vExtentSlope = 0.5 * this.getFilmHeight() / focalLength; this.fov = _Math$1.RAD2DEG * 2 * Math.atan( vExtentSlope ); this.updateProjectionMatrix(); }, /** * Calculates the focal length from the current .fov and .filmGauge. */ getFocalLength: function () { var vExtentSlope = Math.tan( _Math$1.DEG2RAD * 0.5 * this.fov ); return 0.5 * this.getFilmHeight() / vExtentSlope; }, getEffectiveFOV: function () { return _Math$1.RAD2DEG * 2 * Math.atan( Math.tan( _Math$1.DEG2RAD * 0.5 * this.fov ) / this.zoom ); }, getFilmWidth: function () { // film not completely covered in portrait format (aspect < 1) return this.filmGauge * Math.min( this.aspect, 1 ); }, getFilmHeight: function () { // film not completely covered in landscape format (aspect > 1) return this.filmGauge / Math.max( this.aspect, 1 ); }, /** * Sets an offset in a larger frustum. This is useful for multi-window or * multi-monitor/multi-machine setups. * * For example, if you have 3x2 monitors and each monitor is 1920x1080 and * the monitors are in grid like this * * +---+---+---+ * | A | B | C | * +---+---+---+ * | D | E | F | * +---+---+---+ * * then for each monitor you would call it like this * * var w = 1920; * var h = 1080; * var fullWidth = w * 3; * var fullHeight = h * 2; * * --A-- * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); * --B-- * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); * --C-- * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); * --D-- * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); * --E-- * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); * --F-- * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); * * Note there is no reason monitors have to be the same size or in a grid. */ setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) { this.aspect = fullWidth / fullHeight; this.view = { fullWidth: fullWidth, fullHeight: fullHeight, offsetX: x, offsetY: y, width: width, height: height }; this.updateProjectionMatrix(); }, clearViewOffset: function () { this.view = null; this.updateProjectionMatrix(); }, updateProjectionMatrix: function () { var near = this.near, top = near * Math.tan( _Math$1.DEG2RAD * 0.5 * this.fov ) / this.zoom, height = 2 * top, width = this.aspect * height, left = - 0.5 * width, view = this.view; if ( view !== null ) { var fullWidth = view.fullWidth, fullHeight = view.fullHeight; left += view.offsetX * width / fullWidth; top -= view.offsetY * height / fullHeight; width *= view.width / fullWidth; height *= view.height / fullHeight; } var skew = this.filmOffset; if ( skew !== 0 ) left += near * skew / this.getFilmWidth(); this.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far ); }, toJSON: function ( meta ) { var data = Object3D$1.prototype.toJSON.call( this, meta ); data.object.fov = this.fov; data.object.zoom = this.zoom; data.object.near = this.near; data.object.far = this.far; data.object.focus = this.focus; data.object.aspect = this.aspect; if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); data.object.filmGauge = this.filmGauge; data.object.filmOffset = this.filmOffset; return data; } } ); /** * @author alteredq / http://alteredqualia.com/ * @author arose / http://github.com/arose */ function OrthographicCamera$2( left, right, top, bottom, near, far ) { Camera$1.call( this ); this.type = 'OrthographicCamera'; this.zoom = 1; this.view = null; this.left = left; this.right = right; this.top = top; this.bottom = bottom; this.near = ( near !== undefined ) ? near : 0.1; this.far = ( far !== undefined ) ? far : 2000; this.updateProjectionMatrix(); } OrthographicCamera$2.prototype = Object.assign( Object.create( Camera$1.prototype ), { constructor: OrthographicCamera$2, isOrthographicCamera: true, copy: function ( source ) { Camera$1.prototype.copy.call( this, source ); this.left = source.left; this.right = source.right; this.top = source.top; this.bottom = source.bottom; this.near = source.near; this.far = source.far; this.zoom = source.zoom; this.view = source.view === null ? null : Object.assign( {}, source.view ); return this; }, setViewOffset: function( fullWidth, fullHeight, x, y, width, height ) { this.view = { fullWidth: fullWidth, fullHeight: fullHeight, offsetX: x, offsetY: y, width: width, height: height }; this.updateProjectionMatrix(); }, clearViewOffset: function() { this.view = null; this.updateProjectionMatrix(); }, updateProjectionMatrix: function () { var dx = ( this.right - this.left ) / ( 2 * this.zoom ); var dy = ( this.top - this.bottom ) / ( 2 * this.zoom ); var cx = ( this.right + this.left ) / 2; var cy = ( this.top + this.bottom ) / 2; var left = cx - dx; var right = cx + dx; var top = cy + dy; var bottom = cy - dy; if ( this.view !== null ) { var zoomW = this.zoom / ( this.view.width / this.view.fullWidth ); var zoomH = this.zoom / ( this.view.height / this.view.fullHeight ); var scaleW = ( this.right - this.left ) / this.view.width; var scaleH = ( this.top - this.bottom ) / this.view.height; left += scaleW * ( this.view.offsetX / zoomW ); right = left + scaleW * ( this.view.width / zoomW ); top -= scaleH * ( this.view.offsetY / zoomH ); bottom = top - scaleH * ( this.view.height / zoomH ); } this.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far ); }, toJSON: function ( meta ) { var data = Object3D$1.prototype.toJSON.call( this, meta ); data.object.zoom = this.zoom; data.object.left = this.left; data.object.right = this.right; data.object.top = this.top; data.object.bottom = this.bottom; data.object.near = this.near; data.object.far = this.far; if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); return data; } } ); /** * @author mrdoob / http://mrdoob.com/ */ function WebGLAttributes$1( gl ) { var buffers = {}; function createBuffer( attribute, bufferType ) { var array = attribute.array; var usage = attribute.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW; var buffer = gl.createBuffer(); gl.bindBuffer( bufferType, buffer ); gl.bufferData( bufferType, array, usage ); attribute.onUploadCallback(); var type = gl.FLOAT; if ( array instanceof Float32Array ) { type = gl.FLOAT; } else if ( array instanceof Float64Array ) { console.warn( "Unsupported data buffer format: Float64Array" ); } else if ( array instanceof Uint16Array ) { type = gl.UNSIGNED_SHORT; } else if ( array instanceof Int16Array ) { type = gl.SHORT; } else if ( array instanceof Uint32Array ) { type = gl.UNSIGNED_INT; } else if ( array instanceof Int32Array ) { type = gl.INT; } else if ( array instanceof Int8Array ) { type = gl.BYTE; } else if ( array instanceof Uint8Array ) { type = gl.UNSIGNED_BYTE; } return { buffer: buffer, type: type, bytesPerElement: array.BYTES_PER_ELEMENT, version: attribute.version }; } function updateBuffer( buffer, attribute, bufferType ) { var array = attribute.array; var updateRange = attribute.updateRange; gl.bindBuffer( bufferType, buffer ); if ( attribute.dynamic === false ) { gl.bufferData( bufferType, array, gl.STATIC_DRAW ); } else if ( updateRange.count === - 1 ) { // Not using update ranges gl.bufferSubData( bufferType, 0, array ); } else if ( updateRange.count === 0 ) { console.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' ); } else { gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT, array.subarray( updateRange.offset, updateRange.offset + updateRange.count ) ); updateRange.count = 0; // reset range } } // function get( attribute ) { if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; return buffers[ attribute.uuid ]; } function remove( attribute ) { var data = buffers[ attribute.uuid ]; if ( data ) { gl.deleteBuffer( data.buffer ); delete buffers[ attribute.uuid ]; } } function update( attribute, bufferType ) { if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; var data = buffers[ attribute.uuid ]; if ( data === undefined ) { buffers[ attribute.uuid ] = createBuffer( attribute, bufferType ); } else if ( data.version < attribute.version ) { updateBuffer( data.buffer, attribute, bufferType ); data.version = attribute.version; } } return { get: get, remove: remove, update: update }; } /** * @author mrdoob / http://mrdoob.com/ */ function painterSortStable$1( a, b ) { if ( a.renderOrder !== b.renderOrder ) { return a.renderOrder - b.renderOrder; } else if ( a.program && b.program && a.program !== b.program ) { return a.program.id - b.program.id; } else if ( a.material.id !== b.material.id ) { return a.material.id - b.material.id; } else if ( a.z !== b.z ) { return a.z - b.z; } else { return a.id - b.id; } } function reversePainterSortStable$1( a, b ) { if ( a.renderOrder !== b.renderOrder ) { return a.renderOrder - b.renderOrder; } if ( a.z !== b.z ) { return b.z - a.z; } else { return a.id - b.id; } } function WebGLRenderList$1() { var opaque = []; var opaqueLastIndex = - 1; var transparent = []; var transparentLastIndex = - 1; function init() { opaqueLastIndex = - 1; transparentLastIndex = - 1; } function push( object, geometry, material, z, group ) { var array, index; // allocate the next position in the appropriate array if ( material.transparent ) { array = transparent; index = ++ transparentLastIndex; } else { array = opaque; index = ++ opaqueLastIndex; } // recycle existing render item or grow the array var renderItem = array[ index ]; if ( renderItem ) { renderItem.id = object.id; renderItem.object = object; renderItem.geometry = geometry; renderItem.material = material; renderItem.program = material.program; renderItem.renderOrder = object.renderOrder; renderItem.z = z; renderItem.group = group; } else { renderItem = { id: object.id, object: object, geometry: geometry, material: material, program: material.program, renderOrder: object.renderOrder, z: z, group: group }; // assert( index === array.length ); array.push( renderItem ); } } function finish() { opaque.length = opaqueLastIndex + 1; transparent.length = transparentLastIndex + 1; } function sort() { opaque.sort( painterSortStable$1 ); transparent.sort( reversePainterSortStable$1 ); } return { opaque: opaque, transparent: transparent, init: init, push: push, finish: finish, sort: sort }; } function WebGLRenderLists$1() { var lists = {}; function get( scene, camera ) { var hash = scene.id + ',' + camera.id; var list = lists[ hash ]; if ( list === undefined ) { // console.log( 'THREE.WebGLRenderLists:', hash ); list = new WebGLRenderList$1(); lists[ hash ] = list; } return list; } function dispose() { lists = {}; } return { get: get, dispose: dispose }; } /** * @author mrdoob / http://mrdoob.com/ */ function WebGLIndexedBufferRenderer$1( gl, extensions, infoRender ) { var mode; function setMode( value ) { mode = value; } var type, size; function setIndex( index ) { if ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) { type = gl.UNSIGNED_INT; size = 4; } else if ( index.array instanceof Uint16Array ) { type = gl.UNSIGNED_SHORT; size = 2; } else { type = gl.UNSIGNED_BYTE; size = 1; } } function render( start, count ) { gl.drawElements( mode, count, type, start * size ); infoRender.calls ++; infoRender.vertices += count; if ( mode === gl.TRIANGLES ) infoRender.faces += count / 3; } function renderInstances( geometry, start, count ) { var extension = extensions.get( 'ANGLE_instanced_arrays' ); if ( extension === null ) { console.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); return; } extension.drawElementsInstancedANGLE( mode, count, type, start * size, geometry.maxInstancedCount ); infoRender.calls ++; infoRender.vertices += count * geometry.maxInstancedCount; if ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3; } // this.setMode = setMode; this.setIndex = setIndex; this.render = render; this.renderInstances = renderInstances; } /** * @author mrdoob / http://mrdoob.com/ */ function WebGLBufferRenderer$1( gl, extensions, infoRender ) { var mode; function setMode( value ) { mode = value; } function render( start, count ) { gl.drawArrays( mode, start, count ); infoRender.calls ++; infoRender.vertices += count; if ( mode === gl.TRIANGLES ) infoRender.faces += count / 3; } function renderInstances( geometry, start, count ) { var extension = extensions.get( 'ANGLE_instanced_arrays' ); if ( extension === null ) { console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); return; } var position = geometry.attributes.position; if ( position.isInterleavedBufferAttribute ) { count = position.data.count; extension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount ); } else { extension.drawArraysInstancedANGLE( mode, start, count, geometry.maxInstancedCount ); } infoRender.calls ++; infoRender.vertices += count * geometry.maxInstancedCount; if ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3; } // this.setMode = setMode; this.render = render; this.renderInstances = renderInstances; } /** * @author mrdoob / http://mrdoob.com/ */ function WebGLGeometries$1( gl, attributes, infoMemory ) { var geometries = {}; var wireframeAttributes = {}; function onGeometryDispose( event ) { var geometry = event.target; var buffergeometry = geometries[ geometry.id ]; if ( buffergeometry.index !== null ) { attributes.remove( buffergeometry.index ); } for ( var name in buffergeometry.attributes ) { attributes.remove( buffergeometry.attributes[ name ] ); } geometry.removeEventListener( 'dispose', onGeometryDispose ); delete geometries[ geometry.id ]; // TODO Remove duplicate code var attribute = wireframeAttributes[ geometry.id ]; if ( attribute ) { attributes.remove( attribute ); delete wireframeAttributes[ geometry.id ]; } attribute = wireframeAttributes[ buffergeometry.id ]; if ( attribute ) { attributes.remove( attribute ); delete wireframeAttributes[ buffergeometry.id ]; } // infoMemory.geometries --; } function get( object, geometry ) { var buffergeometry = geometries[ geometry.id ]; if ( buffergeometry ) return buffergeometry; geometry.addEventListener( 'dispose', onGeometryDispose ); if ( geometry.isBufferGeometry ) { buffergeometry = geometry; } else if ( geometry.isGeometry ) { if ( geometry._bufferGeometry === undefined ) { geometry._bufferGeometry = new BufferGeometry$1().setFromObject( object ); } buffergeometry = geometry._bufferGeometry; } geometries[ geometry.id ] = buffergeometry; infoMemory.geometries ++; return buffergeometry; } function update( geometry ) { var index = geometry.index; var geometryAttributes = geometry.attributes; if ( index !== null ) { attributes.update( index, gl.ELEMENT_ARRAY_BUFFER ); } for ( var name in geometryAttributes ) { attributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER ); } // morph targets var morphAttributes = geometry.morphAttributes; for ( var name in morphAttributes ) { var array = morphAttributes[ name ]; for ( var i = 0, l = array.length; i < l; i ++ ) { attributes.update( array[ i ], gl.ARRAY_BUFFER ); } } } function getWireframeAttribute( geometry ) { var attribute = wireframeAttributes[ geometry.id ]; if ( attribute ) return attribute; var indices = []; var geometryIndex = geometry.index; var geometryAttributes = geometry.attributes; // console.time( 'wireframe' ); if ( geometryIndex !== null ) { var array = geometryIndex.array; for ( var i = 0, l = array.length; i < l; i += 3 ) { var a = array[ i + 0 ]; var b = array[ i + 1 ]; var c = array[ i + 2 ]; indices.push( a, b, b, c, c, a ); } } else { var array = geometryAttributes.position.array; for ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) { var a = i + 0; var b = i + 1; var c = i + 2; indices.push( a, b, b, c, c, a ); } } // console.timeEnd( 'wireframe' ); attribute = new ( arrayMax$1( indices ) > 65535 ? Uint32BufferAttribute$1 : Uint16BufferAttribute$1 )( indices, 1 ); attributes.update( attribute, gl.ELEMENT_ARRAY_BUFFER ); wireframeAttributes[ geometry.id ] = attribute; return attribute; } return { get: get, update: update, getWireframeAttribute: getWireframeAttribute }; } /** * @author mrdoob / http://mrdoob.com/ */ function WebGLLights$1() { var lights = {}; return { get: function ( light ) { if ( lights[ light.id ] !== undefined ) { return lights[ light.id ]; } var uniforms; switch ( light.type ) { case 'DirectionalLight': uniforms = { direction: new Vector3$1(), color: new Color$1(), shadow: false, shadowBias: 0, shadowRadius: 1, shadowMapSize: new Vector2$1() }; break; case 'SpotLight': uniforms = { position: new Vector3$1(), direction: new Vector3$1(), color: new Color$1(), distance: 0, coneCos: 0, penumbraCos: 0, decay: 0, shadow: false, shadowBias: 0, shadowRadius: 1, shadowMapSize: new Vector2$1() }; break; case 'PointLight': uniforms = { position: new Vector3$1(), color: new Color$1(), distance: 0, decay: 0, shadow: false, shadowBias: 0, shadowRadius: 1, shadowMapSize: new Vector2$1() }; break; case 'HemisphereLight': uniforms = { direction: new Vector3$1(), skyColor: new Color$1(), groundColor: new Color$1() }; break; case 'RectAreaLight': uniforms = { color: new Color$1(), position: new Vector3$1(), halfWidth: new Vector3$1(), halfHeight: new Vector3$1() // TODO (abelnation): set RectAreaLight shadow uniforms }; break; } lights[ light.id ] = uniforms; return uniforms; } }; } /** * @author mrdoob / http://mrdoob.com/ */ function WebGLObjects$1( gl, geometries, infoRender ) { var updateList = {}; function update( object ) { var frame = infoRender.frame; var geometry = object.geometry; var buffergeometry = geometries.get( object, geometry ); // Update once per frame if ( updateList[ buffergeometry.id ] !== frame ) { if ( geometry.isGeometry ) { buffergeometry.updateFromObject( object ); } geometries.update( buffergeometry ); updateList[ buffergeometry.id ] = frame; } return buffergeometry; } function clear() { updateList = {}; } return { update: update, clear: clear }; } /** * @author mrdoob / http://mrdoob.com/ */ function addLineNumbers$1( string ) { var lines = string.split( '\n' ); for ( var i = 0; i < lines.length; i ++ ) { lines[ i ] = ( i + 1 ) + ': ' + lines[ i ]; } return lines.join( '\n' ); } function WebGLShader$1( gl, type, string ) { var shader = gl.createShader( type ); gl.shaderSource( shader, string ); gl.compileShader( shader ); if ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) { console.error( 'THREE.WebGLShader: Shader couldn\'t compile.' ); } if ( gl.getShaderInfoLog( shader ) !== '' ) { console.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers$1( string ) ); } // --enable-privileged-webgl-extension // console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) ); return shader; } /** * @author mrdoob / http://mrdoob.com/ */ var programIdCount$1 = 0; function getEncodingComponents$1( encoding ) { switch ( encoding ) { case LinearEncoding$1: return [ 'Linear','( value )' ]; case sRGBEncoding$1: return [ 'sRGB','( value )' ]; case RGBEEncoding$1: return [ 'RGBE','( value )' ]; case RGBM7Encoding$1: return [ 'RGBM','( value, 7.0 )' ]; case RGBM16Encoding$1: return [ 'RGBM','( value, 16.0 )' ]; case RGBDEncoding$1: return [ 'RGBD','( value, 256.0 )' ]; case GammaEncoding$1: return [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ]; default: throw new Error( 'unsupported encoding: ' + encoding ); } } function getTexelDecodingFunction$1( functionName, encoding ) { var components = getEncodingComponents$1( encoding ); return "vec4 " + functionName + "( vec4 value ) { return " + components[ 0 ] + "ToLinear" + components[ 1 ] + "; }"; } function getTexelEncodingFunction$1( functionName, encoding ) { var components = getEncodingComponents$1( encoding ); return "vec4 " + functionName + "( vec4 value ) { return LinearTo" + components[ 0 ] + components[ 1 ] + "; }"; } function getToneMappingFunction$1( functionName, toneMapping ) { var toneMappingName; switch ( toneMapping ) { case LinearToneMapping$1: toneMappingName = "Linear"; break; case ReinhardToneMapping$1: toneMappingName = "Reinhard"; break; case Uncharted2ToneMapping$1: toneMappingName = "Uncharted2"; break; case CineonToneMapping$1: toneMappingName = "OptimizedCineon"; break; default: throw new Error( 'unsupported toneMapping: ' + toneMapping ); } return "vec3 " + functionName + "( vec3 color ) { return " + toneMappingName + "ToneMapping( color ); }"; } function generateExtensions$1( extensions, parameters, rendererExtensions ) { extensions = extensions || {}; var chunks = [ ( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '', ( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '', ( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '', ( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : '' ]; return chunks.filter( filterEmptyLine$1 ).join( '\n' ); } function generateDefines$1( defines ) { var chunks = []; for ( var name in defines ) { var value = defines[ name ]; if ( value === false ) continue; chunks.push( '#define ' + name + ' ' + value ); } return chunks.join( '\n' ); } function fetchAttributeLocations$1( gl, program, identifiers ) { var attributes = {}; var n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES ); for ( var i = 0; i < n; i ++ ) { var info = gl.getActiveAttrib( program, i ); var name = info.name; // console.log("THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:", name, i ); attributes[ name ] = gl.getAttribLocation( program, name ); } return attributes; } function filterEmptyLine$1( string ) { return string !== ''; } function replaceLightNums$1( string, parameters ) { return string .replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights ) .replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights ) .replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights ) .replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights ) .replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights ); } function parseIncludes$1( string ) { var pattern = /^[ \t]*#include +<([\w\d.]+)>/gm; function replace( match, include ) { var replace = ShaderChunk$1[ include ]; if ( replace === undefined ) { throw new Error( 'Can not resolve #include <' + include + '>' ); } return parseIncludes$1( replace ); } return string.replace( pattern, replace ); } function unrollLoops$1( string ) { var pattern = /for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g; function replace( match, start, end, snippet ) { var unroll = ''; for ( var i = parseInt( start ); i < parseInt( end ); i ++ ) { unroll += snippet.replace( /\[ i \]/g, '[ ' + i + ' ]' ); } return unroll; } return string.replace( pattern, replace ); } function WebGLProgram$1( renderer, code, material, parameters ) { var gl = renderer.context; var extensions = material.extensions; var defines = material.defines; var vertexShader = material.__webglShader.vertexShader; var fragmentShader = material.__webglShader.fragmentShader; var shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC'; if ( parameters.shadowMapType === PCFShadowMap$1 ) { shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF'; } else if ( parameters.shadowMapType === PCFSoftShadowMap$1 ) { shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT'; } var envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; var envMapModeDefine = 'ENVMAP_MODE_REFLECTION'; var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; if ( parameters.envMap ) { switch ( material.envMap.mapping ) { case CubeReflectionMapping$1: case CubeRefractionMapping$1: envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; break; case CubeUVReflectionMapping$1: case CubeUVRefractionMapping$1: envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV'; break; case EquirectangularReflectionMapping$1: case EquirectangularRefractionMapping$1: envMapTypeDefine = 'ENVMAP_TYPE_EQUIREC'; break; case SphericalReflectionMapping$1: envMapTypeDefine = 'ENVMAP_TYPE_SPHERE'; break; } switch ( material.envMap.mapping ) { case CubeRefractionMapping$1: case EquirectangularRefractionMapping$1: envMapModeDefine = 'ENVMAP_MODE_REFRACTION'; break; } switch ( material.combine ) { case MultiplyOperation$1: envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; break; case MixOperation$1: envMapBlendingDefine = 'ENVMAP_BLENDING_MIX'; break; case AddOperation$1: envMapBlendingDefine = 'ENVMAP_BLENDING_ADD'; break; } } var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0; // console.log( 'building new program ' ); // var customExtensions = generateExtensions$1( extensions, parameters, renderer.extensions ); var customDefines = generateDefines$1( defines ); // var program = gl.createProgram(); var prefixVertex, prefixFragment; if ( material.isRawShaderMaterial ) { prefixVertex = [ customDefines, '\n' ].filter( filterEmptyLine$1 ).join( '\n' ); prefixFragment = [ customExtensions, customDefines, '\n' ].filter( filterEmptyLine$1 ).join( '\n' ); } else { prefixVertex = [ 'precision ' + parameters.precision + ' float;', 'precision ' + parameters.precision + ' int;', '#define SHADER_NAME ' + material.__webglShader.name, customDefines, parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '', '#define GAMMA_FACTOR ' + gammaFactorDefine, '#define MAX_BONES ' + parameters.maxBones, ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', parameters.map ? '#define USE_MAP' : '', parameters.envMap ? '#define USE_ENVMAP' : '', parameters.envMap ? '#define ' + envMapModeDefine : '', parameters.lightMap ? '#define USE_LIGHTMAP' : '', parameters.aoMap ? '#define USE_AOMAP' : '', parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', parameters.bumpMap ? '#define USE_BUMPMAP' : '', parameters.normalMap ? '#define USE_NORMALMAP' : '', parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '', parameters.specularMap ? '#define USE_SPECULARMAP' : '', parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', parameters.alphaMap ? '#define USE_ALPHAMAP' : '', parameters.vertexColors ? '#define USE_COLOR' : '', parameters.flatShading ? '#define FLAT_SHADED' : '', parameters.skinning ? '#define USE_SKINNING' : '', parameters.useVertexTexture ? '#define BONE_TEXTURE' : '', parameters.morphTargets ? '#define USE_MORPHTARGETS' : '', parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '', parameters.doubleSided ? '#define DOUBLE_SIDED' : '', parameters.flipSided ? '#define FLIP_SIDED' : '', '#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes, parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '', 'uniform mat4 modelMatrix;', 'uniform mat4 modelViewMatrix;', 'uniform mat4 projectionMatrix;', 'uniform mat4 viewMatrix;', 'uniform mat3 normalMatrix;', 'uniform vec3 cameraPosition;', 'attribute vec3 position;', 'attribute vec3 normal;', 'attribute vec2 uv;', '#ifdef USE_COLOR', ' attribute vec3 color;', '#endif', '#ifdef USE_MORPHTARGETS', ' attribute vec3 morphTarget0;', ' attribute vec3 morphTarget1;', ' attribute vec3 morphTarget2;', ' attribute vec3 morphTarget3;', ' #ifdef USE_MORPHNORMALS', ' attribute vec3 morphNormal0;', ' attribute vec3 morphNormal1;', ' attribute vec3 morphNormal2;', ' attribute vec3 morphNormal3;', ' #else', ' attribute vec3 morphTarget4;', ' attribute vec3 morphTarget5;', ' attribute vec3 morphTarget6;', ' attribute vec3 morphTarget7;', ' #endif', '#endif', '#ifdef USE_SKINNING', ' attribute vec4 skinIndex;', ' attribute vec4 skinWeight;', '#endif', '\n' ].filter( filterEmptyLine$1 ).join( '\n' ); prefixFragment = [ customExtensions, 'precision ' + parameters.precision + ' float;', 'precision ' + parameters.precision + ' int;', '#define SHADER_NAME ' + material.__webglShader.name, customDefines, parameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '', '#define GAMMA_FACTOR ' + gammaFactorDefine, ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', parameters.map ? '#define USE_MAP' : '', parameters.envMap ? '#define USE_ENVMAP' : '', parameters.envMap ? '#define ' + envMapTypeDefine : '', parameters.envMap ? '#define ' + envMapModeDefine : '', parameters.envMap ? '#define ' + envMapBlendingDefine : '', parameters.lightMap ? '#define USE_LIGHTMAP' : '', parameters.aoMap ? '#define USE_AOMAP' : '', parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', parameters.bumpMap ? '#define USE_BUMPMAP' : '', parameters.normalMap ? '#define USE_NORMALMAP' : '', parameters.specularMap ? '#define USE_SPECULARMAP' : '', parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', parameters.alphaMap ? '#define USE_ALPHAMAP' : '', parameters.vertexColors ? '#define USE_COLOR' : '', parameters.gradientMap ? '#define USE_GRADIENTMAP' : '', parameters.flatShading ? '#define FLAT_SHADED' : '', parameters.doubleSided ? '#define DOUBLE_SIDED' : '', parameters.flipSided ? '#define FLIP_SIDED' : '', '#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes, '#define UNION_CLIPPING_PLANES ' + (parameters.numClippingPlanes - parameters.numClipIntersection), parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', parameters.premultipliedAlpha ? "#define PREMULTIPLIED_ALPHA" : '', parameters.physicallyCorrectLights ? "#define PHYSICALLY_CORRECT_LIGHTS" : '', parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '', parameters.envMap && renderer.extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '', 'uniform mat4 viewMatrix;', 'uniform vec3 cameraPosition;', ( parameters.toneMapping !== NoToneMapping$1 ) ? "#define TONE_MAPPING" : '', ( parameters.toneMapping !== NoToneMapping$1 ) ? ShaderChunk$1[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below ( parameters.toneMapping !== NoToneMapping$1 ) ? getToneMappingFunction$1( "toneMapping", parameters.toneMapping ) : '', parameters.dithering ? '#define DITHERING' : '', ( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk$1[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below parameters.mapEncoding ? getTexelDecodingFunction$1( 'mapTexelToLinear', parameters.mapEncoding ) : '', parameters.envMapEncoding ? getTexelDecodingFunction$1( 'envMapTexelToLinear', parameters.envMapEncoding ) : '', parameters.emissiveMapEncoding ? getTexelDecodingFunction$1( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '', parameters.outputEncoding ? getTexelEncodingFunction$1( "linearToOutputTexel", parameters.outputEncoding ) : '', parameters.depthPacking ? "#define DEPTH_PACKING " + material.depthPacking : '', '\n' ].filter( filterEmptyLine$1 ).join( '\n' ); } vertexShader = parseIncludes$1( vertexShader, parameters ); vertexShader = replaceLightNums$1( vertexShader, parameters ); fragmentShader = parseIncludes$1( fragmentShader, parameters ); fragmentShader = replaceLightNums$1( fragmentShader, parameters ); if ( ! material.isShaderMaterial ) { vertexShader = unrollLoops$1( vertexShader ); fragmentShader = unrollLoops$1( fragmentShader ); } var vertexGlsl = prefixVertex + vertexShader; var fragmentGlsl = prefixFragment + fragmentShader; // console.log( '*VERTEX*', vertexGlsl ); // console.log( '*FRAGMENT*', fragmentGlsl ); var glVertexShader = WebGLShader$1( gl, gl.VERTEX_SHADER, vertexGlsl ); var glFragmentShader = WebGLShader$1( gl, gl.FRAGMENT_SHADER, fragmentGlsl ); gl.attachShader( program, glVertexShader ); gl.attachShader( program, glFragmentShader ); // Force a particular attribute to index 0. if ( material.index0AttributeName !== undefined ) { gl.bindAttribLocation( program, 0, material.index0AttributeName ); } else if ( parameters.morphTargets === true ) { // programs with morphTargets displace position out of attribute 0 gl.bindAttribLocation( program, 0, 'position' ); } gl.linkProgram( program ); var programLog = gl.getProgramInfoLog( program ); var vertexLog = gl.getShaderInfoLog( glVertexShader ); var fragmentLog = gl.getShaderInfoLog( glFragmentShader ); var runnable = true; var haveDiagnostics = true; // console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) ); // console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) ); if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) { runnable = false; console.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog ); } else if ( programLog !== '' ) { console.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog ); } else if ( vertexLog === '' || fragmentLog === '' ) { haveDiagnostics = false; } if ( haveDiagnostics ) { this.diagnostics = { runnable: runnable, material: material, programLog: programLog, vertexShader: { log: vertexLog, prefix: prefixVertex }, fragmentShader: { log: fragmentLog, prefix: prefixFragment } }; } // clean up gl.deleteShader( glVertexShader ); gl.deleteShader( glFragmentShader ); // set up caching for uniform locations var cachedUniforms; this.getUniforms = function() { if ( cachedUniforms === undefined ) { cachedUniforms = new WebGLUniforms$1( gl, program, renderer ); } return cachedUniforms; }; // set up caching for attribute locations var cachedAttributes; this.getAttributes = function() { if ( cachedAttributes === undefined ) { cachedAttributes = fetchAttributeLocations$1( gl, program ); } return cachedAttributes; }; // free resource this.destroy = function() { gl.deleteProgram( program ); this.program = undefined; }; // DEPRECATED Object.defineProperties( this, { uniforms: { get: function() { console.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' ); return this.getUniforms(); } }, attributes: { get: function() { console.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' ); return this.getAttributes(); } } } ); // this.id = programIdCount$1 ++; this.code = code; this.usedTimes = 1; this.program = program; this.vertexShader = glVertexShader; this.fragmentShader = glFragmentShader; return this; } /** * @author mrdoob / http://mrdoob.com/ */ function WebGLPrograms$1( renderer, capabilities ) { var programs = []; var shaderIDs = { MeshDepthMaterial: 'depth', MeshNormalMaterial: 'normal', MeshBasicMaterial: 'basic', MeshLambertMaterial: 'lambert', MeshPhongMaterial: 'phong', MeshToonMaterial: 'phong', MeshStandardMaterial: 'physical', MeshPhysicalMaterial: 'physical', LineBasicMaterial: 'basic', LineDashedMaterial: 'dashed', PointsMaterial: 'points' }; var parameterNames = [ "precision", "supportsVertexTextures", "map", "mapEncoding", "envMap", "envMapMode", "envMapEncoding", "lightMap", "aoMap", "emissiveMap", "emissiveMapEncoding", "bumpMap", "normalMap", "displacementMap", "specularMap", "roughnessMap", "metalnessMap", "gradientMap", "alphaMap", "combine", "vertexColors", "fog", "useFog", "fogExp", "flatShading", "sizeAttenuation", "logarithmicDepthBuffer", "skinning", "maxBones", "useVertexTexture", "morphTargets", "morphNormals", "maxMorphTargets", "maxMorphNormals", "premultipliedAlpha", "numDirLights", "numPointLights", "numSpotLights", "numHemiLights", "numRectAreaLights", "shadowMapEnabled", "shadowMapType", "toneMapping", 'physicallyCorrectLights', "alphaTest", "doubleSided", "flipSided", "numClippingPlanes", "numClipIntersection", "depthPacking", "dithering" ]; function allocateBones( object ) { var skeleton = object.skeleton; var bones = skeleton.bones; if ( capabilities.floatVertexTextures ) { return 1024; } else { // default for when object is not specified // ( for example when prebuilding shader to be used with multiple objects ) // // - leave some extra space for other uniforms // - limit here is ANGLE's 254 max uniform vectors // (up to 54 should be safe) var nVertexUniforms = capabilities.maxVertexUniforms; var nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 ); var maxBones = Math.min( nVertexMatrices, bones.length ); if ( maxBones < bones.length ) { console.warn( 'THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.' ); return 0; } return maxBones; } } function getTextureEncodingFromMap( map, gammaOverrideLinear ) { var encoding; if ( ! map ) { encoding = LinearEncoding$1; } else if ( map.isTexture ) { encoding = map.encoding; } else if ( map.isWebGLRenderTarget ) { console.warn( "THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead." ); encoding = map.texture.encoding; } // add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point. if ( encoding === LinearEncoding$1 && gammaOverrideLinear ) { encoding = GammaEncoding$1; } return encoding; } this.getParameters = function ( material, lights, fog, nClipPlanes, nClipIntersection, object ) { var shaderID = shaderIDs[ material.type ]; // heuristics to create shader parameters according to lights in the scene // (not to blow over maxLights budget) var maxBones = object.isSkinnedMesh ? allocateBones( object ) : 0; var precision = renderer.getPrecision(); if ( material.precision !== null ) { precision = capabilities.getMaxPrecision( material.precision ); if ( precision !== material.precision ) { console.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' ); } } var currentRenderTarget = renderer.getRenderTarget(); var parameters = { shaderID: shaderID, precision: precision, supportsVertexTextures: capabilities.vertexTextures, outputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ), map: !! material.map, mapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ), envMap: !! material.envMap, envMapMode: material.envMap && material.envMap.mapping, envMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ), envMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping$1 ) || ( material.envMap.mapping === CubeUVRefractionMapping$1 ) ), lightMap: !! material.lightMap, aoMap: !! material.aoMap, emissiveMap: !! material.emissiveMap, emissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ), bumpMap: !! material.bumpMap, normalMap: !! material.normalMap, displacementMap: !! material.displacementMap, roughnessMap: !! material.roughnessMap, metalnessMap: !! material.metalnessMap, specularMap: !! material.specularMap, alphaMap: !! material.alphaMap, gradientMap: !! material.gradientMap, combine: material.combine, vertexColors: material.vertexColors, fog: !! fog, useFog: material.fog, fogExp: ( fog && fog.isFogExp2 ), flatShading: material.shading === FlatShading$1, sizeAttenuation: material.sizeAttenuation, logarithmicDepthBuffer: capabilities.logarithmicDepthBuffer, skinning: material.skinning && maxBones > 0, maxBones: maxBones, useVertexTexture: capabilities.floatVertexTextures, morphTargets: material.morphTargets, morphNormals: material.morphNormals, maxMorphTargets: renderer.maxMorphTargets, maxMorphNormals: renderer.maxMorphNormals, numDirLights: lights.directional.length, numPointLights: lights.point.length, numSpotLights: lights.spot.length, numRectAreaLights: lights.rectArea.length, numHemiLights: lights.hemi.length, numClippingPlanes: nClipPlanes, numClipIntersection: nClipIntersection, dithering: material.dithering, shadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && lights.shadows.length > 0, shadowMapType: renderer.shadowMap.type, toneMapping: renderer.toneMapping, physicallyCorrectLights: renderer.physicallyCorrectLights, premultipliedAlpha: material.premultipliedAlpha, alphaTest: material.alphaTest, doubleSided: material.side === DoubleSide$1, flipSided: material.side === BackSide$1, depthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false }; return parameters; }; this.getProgramCode = function ( material, parameters ) { var array = []; if ( parameters.shaderID ) { array.push( parameters.shaderID ); } else { array.push( material.fragmentShader ); array.push( material.vertexShader ); } if ( material.defines !== undefined ) { for ( var name in material.defines ) { array.push( name ); array.push( material.defines[ name ] ); } } for ( var i = 0; i < parameterNames.length; i ++ ) { array.push( parameters[ parameterNames[ i ] ] ); } return array.join(); }; this.acquireProgram = function ( material, parameters, code ) { var program; // Check if code has been already compiled for ( var p = 0, pl = programs.length; p < pl; p ++ ) { var programInfo = programs[ p ]; if ( programInfo.code === code ) { program = programInfo; ++ program.usedTimes; break; } } if ( program === undefined ) { program = new WebGLProgram$1( renderer, code, material, parameters ); programs.push( program ); } return program; }; this.releaseProgram = function ( program ) { if ( -- program.usedTimes === 0 ) { // Remove from unordered set var i = programs.indexOf( program ); programs[ i ] = programs[ programs.length - 1 ]; programs.pop(); // Free WebGL resources program.destroy(); } }; // Exposed for resource monitoring & error feedback via renderer.info: this.programs = programs; } /** * @author mrdoob / http://mrdoob.com/ */ function WebGLTextures$1( _gl, extensions, state, properties, capabilities, paramThreeToGL, infoMemory ) { var _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext ); // function clampToMaxSize( image, maxSize ) { if ( image.width > maxSize || image.height > maxSize ) { // Warning: Scaling through the canvas will only work with images that use // premultiplied alpha. var scale = maxSize / Math.max( image.width, image.height ); var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); canvas.width = Math.floor( image.width * scale ); canvas.height = Math.floor( image.height * scale ); var context = canvas.getContext( '2d' ); context.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height ); console.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image ); return canvas; } return image; } function isPowerOfTwo( image ) { return _Math$1.isPowerOfTwo( image.width ) && _Math$1.isPowerOfTwo( image.height ); } function makePowerOfTwo( image ) { if ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) { var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); canvas.width = _Math$1.nearestPowerOfTwo( image.width ); canvas.height = _Math$1.nearestPowerOfTwo( image.height ); var context = canvas.getContext( '2d' ); context.drawImage( image, 0, 0, canvas.width, canvas.height ); console.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image ); return canvas; } return image; } function textureNeedsPowerOfTwo( texture ) { return ( texture.wrapS !== ClampToEdgeWrapping$1 || texture.wrapT !== ClampToEdgeWrapping$1 ) || ( texture.minFilter !== NearestFilter$1 && texture.minFilter !== LinearFilter$1 ); } // Fallback filters for non-power-of-2 textures function filterFallback( f ) { if ( f === NearestFilter$1 || f === NearestMipMapNearestFilter$1 || f === NearestMipMapLinearFilter$1 ) { return _gl.NEAREST; } return _gl.LINEAR; } // function onTextureDispose( event ) { var texture = event.target; texture.removeEventListener( 'dispose', onTextureDispose ); deallocateTexture( texture ); infoMemory.textures --; } function onRenderTargetDispose( event ) { var renderTarget = event.target; renderTarget.removeEventListener( 'dispose', onRenderTargetDispose ); deallocateRenderTarget( renderTarget ); infoMemory.textures --; } // function deallocateTexture( texture ) { var textureProperties = properties.get( texture ); if ( texture.image && textureProperties.__image__webglTextureCube ) { // cube texture _gl.deleteTexture( textureProperties.__image__webglTextureCube ); } else { // 2D texture if ( textureProperties.__webglInit === undefined ) return; _gl.deleteTexture( textureProperties.__webglTexture ); } // remove all webgl properties properties.remove( texture ); } function deallocateRenderTarget( renderTarget ) { var renderTargetProperties = properties.get( renderTarget ); var textureProperties = properties.get( renderTarget.texture ); if ( ! renderTarget ) return; if ( textureProperties.__webglTexture !== undefined ) { _gl.deleteTexture( textureProperties.__webglTexture ); } if ( renderTarget.depthTexture ) { renderTarget.depthTexture.dispose(); } if ( renderTarget.isWebGLRenderTargetCube ) { for ( var i = 0; i < 6; i ++ ) { _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] ); if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] ); } } else { _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer ); if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer ); } properties.remove( renderTarget.texture ); properties.remove( renderTarget ); } // function setTexture2D( texture, slot ) { var textureProperties = properties.get( texture ); if ( texture.version > 0 && textureProperties.__version !== texture.version ) { var image = texture.image; if ( image === undefined ) { console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture ); } else if ( image.complete === false ) { console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture ); } else { uploadTexture( textureProperties, texture, slot ); return; } } state.activeTexture( _gl.TEXTURE0 + slot ); state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); } function setTextureCube( texture, slot ) { var textureProperties = properties.get( texture ); if ( texture.image.length === 6 ) { if ( texture.version > 0 && textureProperties.__version !== texture.version ) { if ( ! textureProperties.__image__webglTextureCube ) { texture.addEventListener( 'dispose', onTextureDispose ); textureProperties.__image__webglTextureCube = _gl.createTexture(); infoMemory.textures ++; } state.activeTexture( _gl.TEXTURE0 + slot ); state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); var isCompressed = ( texture && texture.isCompressedTexture ); var isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture ); var cubeImage = []; for ( var i = 0; i < 6; i ++ ) { if ( ! isCompressed && ! isDataTexture ) { cubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize ); } else { cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ]; } } var image = cubeImage[ 0 ], isPowerOfTwoImage = isPowerOfTwo( image ), glFormat = paramThreeToGL( texture.format ), glType = paramThreeToGL( texture.type ); setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage ); for ( var i = 0; i < 6; i ++ ) { if ( ! isCompressed ) { if ( isDataTexture ) { state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data ); } else { state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] ); } } else { var mipmap, mipmaps = cubeImage[ i ].mipmaps; for ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) { mipmap = mipmaps[ j ]; if ( texture.format !== RGBAFormat$1 && texture.format !== RGBFormat$1 ) { if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data ); } else { console.warn( "THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()" ); } } else { state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); } } } } if ( texture.generateMipmaps && isPowerOfTwoImage ) { _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); } textureProperties.__version = texture.version; if ( texture.onUpdate ) texture.onUpdate( texture ); } else { state.activeTexture( _gl.TEXTURE0 + slot ); state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); } } } function setTextureCubeDynamic( texture, slot ) { state.activeTexture( _gl.TEXTURE0 + slot ); state.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture ); } function setTextureParameters( textureType, texture, isPowerOfTwoImage ) { var extension; if ( isPowerOfTwoImage ) { _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) ); _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) ); _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) ); _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) ); } else { _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE ); _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE ); if ( texture.wrapS !== ClampToEdgeWrapping$1 || texture.wrapT !== ClampToEdgeWrapping$1 ) { console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.', texture ); } _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) ); _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) ); if ( texture.minFilter !== NearestFilter$1 && texture.minFilter !== LinearFilter$1 ) { console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.', texture ); } } extension = extensions.get( 'EXT_texture_filter_anisotropic' ); if ( extension ) { if ( texture.type === FloatType$1 && extensions.get( 'OES_texture_float_linear' ) === null ) return; if ( texture.type === HalfFloatType$1 && extensions.get( 'OES_texture_half_float_linear' ) === null ) return; if ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) { _gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) ); properties.get( texture ).__currentAnisotropy = texture.anisotropy; } } } function uploadTexture( textureProperties, texture, slot ) { if ( textureProperties.__webglInit === undefined ) { textureProperties.__webglInit = true; texture.addEventListener( 'dispose', onTextureDispose ); textureProperties.__webglTexture = _gl.createTexture(); infoMemory.textures ++; } state.activeTexture( _gl.TEXTURE0 + slot ); state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha ); _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment ); var image = clampToMaxSize( texture.image, capabilities.maxTextureSize ); if ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) { image = makePowerOfTwo( image ); } var isPowerOfTwoImage = isPowerOfTwo( image ), glFormat = paramThreeToGL( texture.format ), glType = paramThreeToGL( texture.type ); setTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage ); var mipmap, mipmaps = texture.mipmaps; if ( texture.isDepthTexture ) { // populate depth texture with dummy data var internalFormat = _gl.DEPTH_COMPONENT; if ( texture.type === FloatType$1 ) { if ( !_isWebGL2 ) throw new Error('Float Depth Texture only supported in WebGL2.0'); internalFormat = _gl.DEPTH_COMPONENT32F; } else if ( _isWebGL2 ) { // WebGL 2.0 requires signed internalformat for glTexImage2D internalFormat = _gl.DEPTH_COMPONENT16; } if ( texture.format === DepthFormat$1 && internalFormat === _gl.DEPTH_COMPONENT ) { // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are // DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) if ( texture.type !== UnsignedShortType$1 && texture.type !== UnsignedIntType$1 ) { console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' ); texture.type = UnsignedShortType$1; glType = paramThreeToGL( texture.type ); } } // Depth stencil textures need the DEPTH_STENCIL internal format // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) if ( texture.format === DepthStencilFormat$1 ) { internalFormat = _gl.DEPTH_STENCIL; // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are // DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL. // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) if ( texture.type !== UnsignedInt248Type$1 ) { console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' ); texture.type = UnsignedInt248Type$1; glType = paramThreeToGL( texture.type ); } } state.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null ); } else if ( texture.isDataTexture ) { // use manually created mipmaps if available // if there are no manual mipmaps // set 0 level mipmap and then use GL to generate other mipmap levels if ( mipmaps.length > 0 && isPowerOfTwoImage ) { for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { mipmap = mipmaps[ i ]; state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); } texture.generateMipmaps = false; } else { state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data ); } } else if ( texture.isCompressedTexture ) { for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { mipmap = mipmaps[ i ]; if ( texture.format !== RGBAFormat$1 && texture.format !== RGBFormat$1 ) { if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { state.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data ); } else { console.warn( "THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()" ); } } else { state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); } } } else { // regular Texture (image, video, canvas) // use manually created mipmaps if available // if there are no manual mipmaps // set 0 level mipmap and then use GL to generate other mipmap levels if ( mipmaps.length > 0 && isPowerOfTwoImage ) { for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { mipmap = mipmaps[ i ]; state.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap ); } texture.generateMipmaps = false; } else { state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image ); } } if ( texture.generateMipmaps && isPowerOfTwoImage ) _gl.generateMipmap( _gl.TEXTURE_2D ); textureProperties.__version = texture.version; if ( texture.onUpdate ) texture.onUpdate( texture ); } // Render targets // Setup storage for target texture and bind it to correct framebuffer function setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) { var glFormat = paramThreeToGL( renderTarget.texture.format ); var glType = paramThreeToGL( renderTarget.texture.type ); state.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null ); _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); _gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 ); _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); } // Setup storage for internal depth/stencil buffers and bind to correct framebuffer function setupRenderBufferStorage( renderbuffer, renderTarget ) { _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer ); if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) { _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height ); _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) { _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height ); _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); } else { // FIXME: We don't support !depth !stencil _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height ); } _gl.bindRenderbuffer( _gl.RENDERBUFFER, null ); } // Setup resources for a Depth Texture for a FBO (needs an extension) function setupDepthTexture( framebuffer, renderTarget ) { var isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube ); if ( isCube ) throw new Error('Depth Texture with cube render targets is not supported!'); _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); if ( !( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) { throw new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture'); } // upload an empty depth texture with framebuffer size if ( !properties.get( renderTarget.depthTexture ).__webglTexture || renderTarget.depthTexture.image.width !== renderTarget.width || renderTarget.depthTexture.image.height !== renderTarget.height ) { renderTarget.depthTexture.image.width = renderTarget.width; renderTarget.depthTexture.image.height = renderTarget.height; renderTarget.depthTexture.needsUpdate = true; } setTexture2D( renderTarget.depthTexture, 0 ); var webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture; if ( renderTarget.depthTexture.format === DepthFormat$1 ) { _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); } else if ( renderTarget.depthTexture.format === DepthStencilFormat$1 ) { _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); } else { throw new Error('Unknown depthTexture format') } } // Setup GL resources for a non-texture depth buffer function setupDepthRenderbuffer( renderTarget ) { var renderTargetProperties = properties.get( renderTarget ); var isCube = ( renderTarget.isWebGLRenderTargetCube === true ); if ( renderTarget.depthTexture ) { if ( isCube ) throw new Error('target.depthTexture not supported in Cube render targets'); setupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget ); } else { if ( isCube ) { renderTargetProperties.__webglDepthbuffer = []; for ( var i = 0; i < 6; i ++ ) { _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] ); renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer(); setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget ); } } else { _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer ); renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer(); setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget ); } } _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); } // Set up GL resources for the render target function setupRenderTarget( renderTarget ) { var renderTargetProperties = properties.get( renderTarget ); var textureProperties = properties.get( renderTarget.texture ); renderTarget.addEventListener( 'dispose', onRenderTargetDispose ); textureProperties.__webglTexture = _gl.createTexture(); infoMemory.textures ++; var isCube = ( renderTarget.isWebGLRenderTargetCube === true ); var isTargetPowerOfTwo = isPowerOfTwo( renderTarget ); // Setup framebuffer if ( isCube ) { renderTargetProperties.__webglFramebuffer = []; for ( var i = 0; i < 6; i ++ ) { renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer(); } } else { renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer(); } // Setup color buffer if ( isCube ) { state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture ); setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo ); for ( var i = 0; i < 6; i ++ ) { setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i ); } if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); state.bindTexture( _gl.TEXTURE_CUBE_MAP, null ); } else { state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); setTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo ); setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D ); if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D ); state.bindTexture( _gl.TEXTURE_2D, null ); } // Setup depth and stencil buffers if ( renderTarget.depthBuffer ) { setupDepthRenderbuffer( renderTarget ); } } function updateRenderTargetMipmap( renderTarget ) { var texture = renderTarget.texture; if ( texture.generateMipmaps && isPowerOfTwo( renderTarget ) && texture.minFilter !== NearestFilter$1 && texture.minFilter !== LinearFilter$1 ) { var target = (renderTarget && renderTarget.isWebGLRenderTargetCube) ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D; var webglTexture = properties.get( texture ).__webglTexture; state.bindTexture( target, webglTexture ); _gl.generateMipmap( target ); state.bindTexture( target, null ); } } this.setTexture2D = setTexture2D; this.setTextureCube = setTextureCube; this.setTextureCubeDynamic = setTextureCubeDynamic; this.setupRenderTarget = setupRenderTarget; this.updateRenderTargetMipmap = updateRenderTargetMipmap; } /** * @author fordacious / fordacious.github.io */ function WebGLProperties$1() { var properties = {}; function get( object ) { var uuid = object.uuid; var map = properties[ uuid ]; if ( map === undefined ) { map = {}; properties[ uuid ] = map; } return map; } function remove( object ) { delete properties[ object.uuid ]; } function clear() { properties = {}; } return { get: get, remove: remove, clear: clear }; } /** * @author mrdoob / http://mrdoob.com/ */ function WebGLState$1( gl, extensions, paramThreeToGL ) { function ColorBuffer() { var locked = false; var color = new Vector4$1(); var currentColorMask = null; var currentColorClear = new Vector4$1(); return { setMask: function ( colorMask ) { if ( currentColorMask !== colorMask && ! locked ) { gl.colorMask( colorMask, colorMask, colorMask, colorMask ); currentColorMask = colorMask; } }, setLocked: function ( lock ) { locked = lock; }, setClear: function ( r, g, b, a, premultipliedAlpha ) { if ( premultipliedAlpha === true ) { r *= a; g *= a; b *= a; } color.set( r, g, b, a ); if ( currentColorClear.equals( color ) === false ) { gl.clearColor( r, g, b, a ); currentColorClear.copy( color ); } }, reset: function () { locked = false; currentColorMask = null; currentColorClear.set( 0, 0, 0, 1 ); } }; } function DepthBuffer() { var locked = false; var currentDepthMask = null; var currentDepthFunc = null; var currentDepthClear = null; return { setTest: function ( depthTest ) { if ( depthTest ) { enable( gl.DEPTH_TEST ); } else { disable( gl.DEPTH_TEST ); } }, setMask: function ( depthMask ) { if ( currentDepthMask !== depthMask && ! locked ) { gl.depthMask( depthMask ); currentDepthMask = depthMask; } }, setFunc: function ( depthFunc ) { if ( currentDepthFunc !== depthFunc ) { if ( depthFunc ) { switch ( depthFunc ) { case NeverDepth$1: gl.depthFunc( gl.NEVER ); break; case AlwaysDepth$1: gl.depthFunc( gl.ALWAYS ); break; case LessDepth$1: gl.depthFunc( gl.LESS ); break; case LessEqualDepth$1: gl.depthFunc( gl.LEQUAL ); break; case EqualDepth$1: gl.depthFunc( gl.EQUAL ); break; case GreaterEqualDepth$1: gl.depthFunc( gl.GEQUAL ); break; case GreaterDepth$1: gl.depthFunc( gl.GREATER ); break; case NotEqualDepth$1: gl.depthFunc( gl.NOTEQUAL ); break; default: gl.depthFunc( gl.LEQUAL ); } } else { gl.depthFunc( gl.LEQUAL ); } currentDepthFunc = depthFunc; } }, setLocked: function ( lock ) { locked = lock; }, setClear: function ( depth ) { if ( currentDepthClear !== depth ) { gl.clearDepth( depth ); currentDepthClear = depth; } }, reset: function () { locked = false; currentDepthMask = null; currentDepthFunc = null; currentDepthClear = null; } }; } function StencilBuffer() { var locked = false; var currentStencilMask = null; var currentStencilFunc = null; var currentStencilRef = null; var currentStencilFuncMask = null; var currentStencilFail = null; var currentStencilZFail = null; var currentStencilZPass = null; var currentStencilClear = null; return { setTest: function ( stencilTest ) { if ( stencilTest ) { enable( gl.STENCIL_TEST ); } else { disable( gl.STENCIL_TEST ); } }, setMask: function ( stencilMask ) { if ( currentStencilMask !== stencilMask && ! locked ) { gl.stencilMask( stencilMask ); currentStencilMask = stencilMask; } }, setFunc: function ( stencilFunc, stencilRef, stencilMask ) { if ( currentStencilFunc !== stencilFunc || currentStencilRef !== stencilRef || currentStencilFuncMask !== stencilMask ) { gl.stencilFunc( stencilFunc, stencilRef, stencilMask ); currentStencilFunc = stencilFunc; currentStencilRef = stencilRef; currentStencilFuncMask = stencilMask; } }, setOp: function ( stencilFail, stencilZFail, stencilZPass ) { if ( currentStencilFail !== stencilFail || currentStencilZFail !== stencilZFail || currentStencilZPass !== stencilZPass ) { gl.stencilOp( stencilFail, stencilZFail, stencilZPass ); currentStencilFail = stencilFail; currentStencilZFail = stencilZFail; currentStencilZPass = stencilZPass; } }, setLocked: function ( lock ) { locked = lock; }, setClear: function ( stencil ) { if ( currentStencilClear !== stencil ) { gl.clearStencil( stencil ); currentStencilClear = stencil; } }, reset: function () { locked = false; currentStencilMask = null; currentStencilFunc = null; currentStencilRef = null; currentStencilFuncMask = null; currentStencilFail = null; currentStencilZFail = null; currentStencilZPass = null; currentStencilClear = null; } }; } // var colorBuffer = new ColorBuffer(); var depthBuffer = new DepthBuffer(); var stencilBuffer = new StencilBuffer(); var maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); var newAttributes = new Uint8Array( maxVertexAttributes ); var enabledAttributes = new Uint8Array( maxVertexAttributes ); var attributeDivisors = new Uint8Array( maxVertexAttributes ); var capabilities = {}; var compressedTextureFormats = null; var currentBlending = null; var currentBlendEquation = null; var currentBlendSrc = null; var currentBlendDst = null; var currentBlendEquationAlpha = null; var currentBlendSrcAlpha = null; var currentBlendDstAlpha = null; var currentPremultipledAlpha = false; var currentFlipSided = null; var currentCullFace = null; var currentLineWidth = null; var currentPolygonOffsetFactor = null; var currentPolygonOffsetUnits = null; var currentScissorTest = null; var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); var version = parseFloat( /^WebGL\ ([0-9])/.exec( gl.getParameter( gl.VERSION ) )[ 1 ] ); var lineWidthAvailable = parseFloat( version ) >= 1.0; var currentTextureSlot = null; var currentBoundTextures = {}; var currentScissor = new Vector4$1(); var currentViewport = new Vector4$1(); function createTexture( type, target, count ) { var data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4. var texture = gl.createTexture(); gl.bindTexture( type, texture ); gl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); gl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); for ( var i = 0; i < count; i ++ ) { gl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data ); } return texture; } var emptyTextures = {}; emptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 ); emptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 ); // function init() { colorBuffer.setClear( 0, 0, 0, 1 ); depthBuffer.setClear( 1 ); stencilBuffer.setClear( 0 ); enable( gl.DEPTH_TEST ); depthBuffer.setFunc( LessEqualDepth$1 ); setFlipSided( false ); setCullFace( CullFaceBack$1 ); enable( gl.CULL_FACE ); enable( gl.BLEND ); setBlending( NormalBlending$1 ); } function initAttributes() { for ( var i = 0, l = newAttributes.length; i < l; i ++ ) { newAttributes[ i ] = 0; } } function enableAttribute( attribute ) { newAttributes[ attribute ] = 1; if ( enabledAttributes[ attribute ] === 0 ) { gl.enableVertexAttribArray( attribute ); enabledAttributes[ attribute ] = 1; } if ( attributeDivisors[ attribute ] !== 0 ) { var extension = extensions.get( 'ANGLE_instanced_arrays' ); extension.vertexAttribDivisorANGLE( attribute, 0 ); attributeDivisors[ attribute ] = 0; } } function enableAttributeAndDivisor( attribute, meshPerAttribute ) { newAttributes[ attribute ] = 1; if ( enabledAttributes[ attribute ] === 0 ) { gl.enableVertexAttribArray( attribute ); enabledAttributes[ attribute ] = 1; } if ( attributeDivisors[ attribute ] !== meshPerAttribute ) { var extension = extensions.get( 'ANGLE_instanced_arrays' ); extension.vertexAttribDivisorANGLE( attribute, meshPerAttribute ); attributeDivisors[ attribute ] = meshPerAttribute; } } function disableUnusedAttributes() { for ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) { if ( enabledAttributes[ i ] !== newAttributes[ i ] ) { gl.disableVertexAttribArray( i ); enabledAttributes[ i ] = 0; } } } function enable( id ) { if ( capabilities[ id ] !== true ) { gl.enable( id ); capabilities[ id ] = true; } } function disable( id ) { if ( capabilities[ id ] !== false ) { gl.disable( id ); capabilities[ id ] = false; } } function getCompressedTextureFormats() { if ( compressedTextureFormats === null ) { compressedTextureFormats = []; if ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) || extensions.get( 'WEBGL_compressed_texture_s3tc' ) || extensions.get( 'WEBGL_compressed_texture_etc1' ) ) { var formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS ); for ( var i = 0; i < formats.length; i ++ ) { compressedTextureFormats.push( formats[ i ] ); } } } return compressedTextureFormats; } function setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) { if ( blending !== NoBlending$1 ) { enable( gl.BLEND ); } else { disable( gl.BLEND ); } if ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) { if ( blending === AdditiveBlending$1 ) { if ( premultipliedAlpha ) { gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); gl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE ); } else { gl.blendEquation( gl.FUNC_ADD ); gl.blendFunc( gl.SRC_ALPHA, gl.ONE ); } } else if ( blending === SubtractiveBlending$1 ) { if ( premultipliedAlpha ) { gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); gl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA ); } else { gl.blendEquation( gl.FUNC_ADD ); gl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR ); } } else if ( blending === MultiplyBlending$1 ) { if ( premultipliedAlpha ) { gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); gl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA ); } else { gl.blendEquation( gl.FUNC_ADD ); gl.blendFunc( gl.ZERO, gl.SRC_COLOR ); } } else { if ( premultipliedAlpha ) { gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); gl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); } else { gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); } } currentBlending = blending; currentPremultipledAlpha = premultipliedAlpha; } if ( blending === CustomBlending$1 ) { blendEquationAlpha = blendEquationAlpha || blendEquation; blendSrcAlpha = blendSrcAlpha || blendSrc; blendDstAlpha = blendDstAlpha || blendDst; if ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) { gl.blendEquationSeparate( paramThreeToGL( blendEquation ), paramThreeToGL( blendEquationAlpha ) ); currentBlendEquation = blendEquation; currentBlendEquationAlpha = blendEquationAlpha; } if ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) { gl.blendFuncSeparate( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ), paramThreeToGL( blendSrcAlpha ), paramThreeToGL( blendDstAlpha ) ); currentBlendSrc = blendSrc; currentBlendDst = blendDst; currentBlendSrcAlpha = blendSrcAlpha; currentBlendDstAlpha = blendDstAlpha; } } else { currentBlendEquation = null; currentBlendSrc = null; currentBlendDst = null; currentBlendEquationAlpha = null; currentBlendSrcAlpha = null; currentBlendDstAlpha = null; } } function setMaterial( material ) { material.side === DoubleSide$1 ? disable( gl.CULL_FACE ) : enable( gl.CULL_FACE ); setFlipSided( material.side === BackSide$1 ); material.transparent === true ? setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha ) : setBlending( NoBlending$1 ); depthBuffer.setFunc( material.depthFunc ); depthBuffer.setTest( material.depthTest ); depthBuffer.setMask( material.depthWrite ); colorBuffer.setMask( material.colorWrite ); setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits ); } // function setFlipSided( flipSided ) { if ( currentFlipSided !== flipSided ) { if ( flipSided ) { gl.frontFace( gl.CW ); } else { gl.frontFace( gl.CCW ); } currentFlipSided = flipSided; } } function setCullFace( cullFace ) { if ( cullFace !== CullFaceNone$1 ) { enable( gl.CULL_FACE ); if ( cullFace !== currentCullFace ) { if ( cullFace === CullFaceBack$1 ) { gl.cullFace( gl.BACK ); } else if ( cullFace === CullFaceFront$1 ) { gl.cullFace( gl.FRONT ); } else { gl.cullFace( gl.FRONT_AND_BACK ); } } } else { disable( gl.CULL_FACE ); } currentCullFace = cullFace; } function setLineWidth( width ) { if ( width !== currentLineWidth ) { if ( lineWidthAvailable ) gl.lineWidth( width ); currentLineWidth = width; } } function setPolygonOffset( polygonOffset, factor, units ) { if ( polygonOffset ) { enable( gl.POLYGON_OFFSET_FILL ); if ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) { gl.polygonOffset( factor, units ); currentPolygonOffsetFactor = factor; currentPolygonOffsetUnits = units; } } else { disable( gl.POLYGON_OFFSET_FILL ); } } function getScissorTest() { return currentScissorTest; } function setScissorTest( scissorTest ) { currentScissorTest = scissorTest; if ( scissorTest ) { enable( gl.SCISSOR_TEST ); } else { disable( gl.SCISSOR_TEST ); } } // texture function activeTexture( webglSlot ) { if ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1; if ( currentTextureSlot !== webglSlot ) { gl.activeTexture( webglSlot ); currentTextureSlot = webglSlot; } } function bindTexture( webglType, webglTexture ) { if ( currentTextureSlot === null ) { activeTexture(); } var boundTexture = currentBoundTextures[ currentTextureSlot ]; if ( boundTexture === undefined ) { boundTexture = { type: undefined, texture: undefined }; currentBoundTextures[ currentTextureSlot ] = boundTexture; } if ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) { gl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] ); boundTexture.type = webglType; boundTexture.texture = webglTexture; } } function compressedTexImage2D() { try { gl.compressedTexImage2D.apply( gl, arguments ); } catch ( error ) { console.error( error ); } } function texImage2D() { try { gl.texImage2D.apply( gl, arguments ); } catch ( error ) { console.error( error ); } } // function scissor( scissor ) { if ( currentScissor.equals( scissor ) === false ) { gl.scissor( scissor.x, scissor.y, scissor.z, scissor.w ); currentScissor.copy( scissor ); } } function viewport( viewport ) { if ( currentViewport.equals( viewport ) === false ) { gl.viewport( viewport.x, viewport.y, viewport.z, viewport.w ); currentViewport.copy( viewport ); } } // function reset() { for ( var i = 0; i < enabledAttributes.length; i ++ ) { if ( enabledAttributes[ i ] === 1 ) { gl.disableVertexAttribArray( i ); enabledAttributes[ i ] = 0; } } capabilities = {}; compressedTextureFormats = null; currentTextureSlot = null; currentBoundTextures = {}; currentBlending = null; currentFlipSided = null; currentCullFace = null; colorBuffer.reset(); depthBuffer.reset(); stencilBuffer.reset(); } return { buffers: { color: colorBuffer, depth: depthBuffer, stencil: stencilBuffer }, init: init, initAttributes: initAttributes, enableAttribute: enableAttribute, enableAttributeAndDivisor: enableAttributeAndDivisor, disableUnusedAttributes: disableUnusedAttributes, enable: enable, disable: disable, getCompressedTextureFormats: getCompressedTextureFormats, setBlending: setBlending, setMaterial: setMaterial, setFlipSided: setFlipSided, setCullFace: setCullFace, setLineWidth: setLineWidth, setPolygonOffset: setPolygonOffset, getScissorTest: getScissorTest, setScissorTest: setScissorTest, activeTexture: activeTexture, bindTexture: bindTexture, compressedTexImage2D: compressedTexImage2D, texImage2D: texImage2D, scissor: scissor, viewport: viewport, reset: reset }; } /** * @author mrdoob / http://mrdoob.com/ */ function WebGLCapabilities$1( gl, extensions, parameters ) { var maxAnisotropy; function getMaxAnisotropy() { if ( maxAnisotropy !== undefined ) return maxAnisotropy; var extension = extensions.get( 'EXT_texture_filter_anisotropic' ); if ( extension !== null ) { maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT ); } else { maxAnisotropy = 0; } return maxAnisotropy; } function getMaxPrecision( precision ) { if ( precision === 'highp' ) { if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 && gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) { return 'highp'; } precision = 'mediump'; } if ( precision === 'mediump' ) { if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 && gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) { return 'mediump'; } } return 'lowp'; } var precision = parameters.precision !== undefined ? parameters.precision : 'highp'; var maxPrecision = getMaxPrecision( precision ); if ( maxPrecision !== precision ) { console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' ); precision = maxPrecision; } var logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true && !! extensions.get( 'EXT_frag_depth' ); var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); var maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ); var maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE ); var maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE ); var maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); var maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS ); var maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS ); var maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS ); var vertexTextures = maxVertexTextures > 0; var floatFragmentTextures = !! extensions.get( 'OES_texture_float' ); var floatVertexTextures = vertexTextures && floatFragmentTextures; return { getMaxAnisotropy: getMaxAnisotropy, getMaxPrecision: getMaxPrecision, precision: precision, logarithmicDepthBuffer: logarithmicDepthBuffer, maxTextures: maxTextures, maxVertexTextures: maxVertexTextures, maxTextureSize: maxTextureSize, maxCubemapSize: maxCubemapSize, maxAttributes: maxAttributes, maxVertexUniforms: maxVertexUniforms, maxVaryings: maxVaryings, maxFragmentUniforms: maxFragmentUniforms, vertexTextures: vertexTextures, floatFragmentTextures: floatFragmentTextures, floatVertexTextures: floatVertexTextures }; } /** * @author mrdoob / http://mrdoob.com/ */ function WebGLExtensions$1( gl ) { var extensions = {}; return { get: function ( name ) { if ( extensions[ name ] !== undefined ) { return extensions[ name ]; } var extension; switch ( name ) { case 'WEBGL_depth_texture': extension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' ); break; case 'EXT_texture_filter_anisotropic': extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' ); break; case 'WEBGL_compressed_texture_s3tc': extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' ); break; case 'WEBGL_compressed_texture_pvrtc': extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' ); break; case 'WEBGL_compressed_texture_etc1': extension = gl.getExtension( 'WEBGL_compressed_texture_etc1' ); break; default: extension = gl.getExtension( name ); } if ( extension === null ) { console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' ); } extensions[ name ] = extension; return extension; } }; } /** * @author tschw */ function WebGLClipping$1() { var scope = this, globalState = null, numGlobalPlanes = 0, localClippingEnabled = false, renderingShadows = false, plane = new Plane$2(), viewNormalMatrix = new Matrix3$1(), uniform = { value: null, needsUpdate: false }; this.uniform = uniform; this.numPlanes = 0; this.numIntersection = 0; this.init = function( planes, enableLocalClipping, camera ) { var enabled = planes.length !== 0 || enableLocalClipping || // enable state of previous frame - the clipping code has to // run another frame in order to reset the state: numGlobalPlanes !== 0 || localClippingEnabled; localClippingEnabled = enableLocalClipping; globalState = projectPlanes( planes, camera, 0 ); numGlobalPlanes = planes.length; return enabled; }; this.beginShadows = function() { renderingShadows = true; projectPlanes( null ); }; this.endShadows = function() { renderingShadows = false; resetGlobalState(); }; this.setState = function( planes, clipIntersection, clipShadows, camera, cache, fromCache ) { if ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) { // there's no local clipping if ( renderingShadows ) { // there's no global clipping projectPlanes( null ); } else { resetGlobalState(); } } else { var nGlobal = renderingShadows ? 0 : numGlobalPlanes, lGlobal = nGlobal * 4, dstArray = cache.clippingState || null; uniform.value = dstArray; // ensure unique state dstArray = projectPlanes( planes, camera, lGlobal, fromCache ); for ( var i = 0; i !== lGlobal; ++ i ) { dstArray[ i ] = globalState[ i ]; } cache.clippingState = dstArray; this.numIntersection = clipIntersection ? this.numPlanes : 0; this.numPlanes += nGlobal; } }; function resetGlobalState() { if ( uniform.value !== globalState ) { uniform.value = globalState; uniform.needsUpdate = numGlobalPlanes > 0; } scope.numPlanes = numGlobalPlanes; scope.numIntersection = 0; } function projectPlanes( planes, camera, dstOffset, skipTransform ) { var nPlanes = planes !== null ? planes.length : 0, dstArray = null; if ( nPlanes !== 0 ) { dstArray = uniform.value; if ( skipTransform !== true || dstArray === null ) { var flatSize = dstOffset + nPlanes * 4, viewMatrix = camera.matrixWorldInverse; viewNormalMatrix.getNormalMatrix( viewMatrix ); if ( dstArray === null || dstArray.length < flatSize ) { dstArray = new Float32Array( flatSize ); } for ( var i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) { plane.copy( planes[ i ] ). applyMatrix4( viewMatrix, viewNormalMatrix ); plane.normal.toArray( dstArray, i4 ); dstArray[ i4 + 3 ] = plane.constant; } } uniform.value = dstArray; uniform.needsUpdate = true; } scope.numPlanes = nPlanes; return dstArray; } } // import { Sphere } from '../math/Sphere'; /** * @author supereggbert / http://www.paulbrunt.co.uk/ * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ * @author szimek / https://github.com/szimek/ * @author tschw */ function WebGLRenderer$1( parameters ) { console.log( 'THREE.WebGLRenderer', REVISION$1 ); parameters = parameters || {}; var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ), _context = parameters.context !== undefined ? parameters.context : null, _alpha = parameters.alpha !== undefined ? parameters.alpha : false, _depth = parameters.depth !== undefined ? parameters.depth : true, _stencil = parameters.stencil !== undefined ? parameters.stencil : true, _antialias = parameters.antialias !== undefined ? parameters.antialias : false, _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true, _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false; var lights = []; var currentRenderList = null; var morphInfluences = new Float32Array( 8 ); var sprites = []; var lensFlares = []; // public properties this.domElement = _canvas; this.context = null; // clearing this.autoClear = true; this.autoClearColor = true; this.autoClearDepth = true; this.autoClearStencil = true; // scene graph this.sortObjects = true; // user-defined clipping this.clippingPlanes = []; this.localClippingEnabled = false; // physically based shading this.gammaFactor = 2.0; // for backwards compatibility this.gammaInput = false; this.gammaOutput = false; // physical lights this.physicallyCorrectLights = false; // tone mapping this.toneMapping = LinearToneMapping$1; this.toneMappingExposure = 1.0; this.toneMappingWhitePoint = 1.0; // morphs this.maxMorphTargets = 8; this.maxMorphNormals = 4; // internal properties var _this = this, // internal state cache _currentProgram = null, _currentRenderTarget = null, _currentFramebuffer = null, _currentMaterialId = - 1, _currentGeometryProgram = '', _currentCamera = null, _currentScissor = new Vector4$1(), _currentScissorTest = null, _currentViewport = new Vector4$1(), // _usedTextureUnits = 0, // _clearColor = new Color$1( 0x000000 ), _clearAlpha = 0, _width = _canvas.width, _height = _canvas.height, _pixelRatio = 1, _scissor = new Vector4$1( 0, 0, _width, _height ), _scissorTest = false, _viewport = new Vector4$1( 0, 0, _width, _height ), // frustum _frustum = new Frustum$1(), // clipping _clipping = new WebGLClipping$1(), _clippingEnabled = false, _localClippingEnabled = false, // camera matrices cache _projScreenMatrix = new Matrix4$1(), _vector3 = new Vector3$1(), _matrix4 = new Matrix4$1(), _matrix42 = new Matrix4$1(), // light arrays cache _lights = { hash: '', ambient: [ 0, 0, 0 ], directional: [], directionalShadowMap: [], directionalShadowMatrix: [], spot: [], spotShadowMap: [], spotShadowMatrix: [], rectArea: [], point: [], pointShadowMap: [], pointShadowMatrix: [], hemi: [], shadows: [] }, // info _infoMemory = { geometries: 0, textures: 0 }, _infoRender = { frame: 0, calls: 0, vertices: 0, faces: 0, points: 0 }; this.info = { render: _infoRender, memory: _infoMemory, programs: null }; // initialize var _gl; try { var contextAttributes = { alpha: _alpha, depth: _depth, stencil: _stencil, antialias: _antialias, premultipliedAlpha: _premultipliedAlpha, preserveDrawingBuffer: _preserveDrawingBuffer }; _gl = _context || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes ); if ( _gl === null ) { if ( _canvas.getContext( 'webgl' ) !== null ) { throw 'Error creating WebGL context with your selected attributes.'; } else { throw 'Error creating WebGL context.'; } } // Some experimental-webgl implementations do not have getShaderPrecisionFormat if ( _gl.getShaderPrecisionFormat === undefined ) { _gl.getShaderPrecisionFormat = function () { return { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 }; }; } _canvas.addEventListener( 'webglcontextlost', onContextLost, false ); } catch ( error ) { console.error( 'THREE.WebGLRenderer: ' + error ); } var extensions = new WebGLExtensions$1( _gl ); extensions.get( 'WEBGL_depth_texture' ); extensions.get( 'OES_texture_float' ); extensions.get( 'OES_texture_float_linear' ); extensions.get( 'OES_texture_half_float' ); extensions.get( 'OES_texture_half_float_linear' ); extensions.get( 'OES_standard_derivatives' ); extensions.get( 'ANGLE_instanced_arrays' ); if ( extensions.get( 'OES_element_index_uint' ) ) { BufferGeometry$1.MaxIndex = 4294967296; } var capabilities = new WebGLCapabilities$1( _gl, extensions, parameters ); var state = new WebGLState$1( _gl, extensions, paramThreeToGL ); var properties = new WebGLProperties$1(); var textures = new WebGLTextures$1( _gl, extensions, state, properties, capabilities, paramThreeToGL, _infoMemory ); var attributes = new WebGLAttributes$1( _gl ); var geometries = new WebGLGeometries$1( _gl, attributes, _infoMemory ); var objects = new WebGLObjects$1( _gl, geometries, _infoRender ); var programCache = new WebGLPrograms$1( this, capabilities ); var lightCache = new WebGLLights$1(); var renderLists = new WebGLRenderLists$1(); this.info.programs = programCache.programs; var bufferRenderer = new WebGLBufferRenderer$1( _gl, extensions, _infoRender ); var indexedBufferRenderer = new WebGLIndexedBufferRenderer$1( _gl, extensions, _infoRender ); // var backgroundPlaneCamera, backgroundPlaneMesh; var backgroundBoxCamera, backgroundBoxMesh; // function getTargetPixelRatio() { return _currentRenderTarget === null ? _pixelRatio : 1; } function setDefaultGLState() { state.init(); state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) ); state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) ); state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha ); } function resetGLState() { _currentProgram = null; _currentCamera = null; _currentGeometryProgram = ''; _currentMaterialId = - 1; state.reset(); } setDefaultGLState(); this.context = _gl; this.capabilities = capabilities; this.extensions = extensions; this.properties = properties; this.state = state; // shadow map var shadowMap = new WebGLShadowMap$1( this, _lights, objects, capabilities ); this.shadowMap = shadowMap; // Plugins var spritePlugin = new SpritePlugin( this, sprites ); var lensFlarePlugin = new LensFlarePlugin( this, lensFlares ); // API this.getContext = function () { return _gl; }; this.getContextAttributes = function () { return _gl.getContextAttributes(); }; this.forceContextLoss = function () { var extension = extensions.get( 'WEBGL_lose_context' ); if ( extension ) extension.loseContext(); }; this.getMaxAnisotropy = function () { return capabilities.getMaxAnisotropy(); }; this.getPrecision = function () { return capabilities.precision; }; this.getPixelRatio = function () { return _pixelRatio; }; this.setPixelRatio = function ( value ) { if ( value === undefined ) return; _pixelRatio = value; this.setSize( _viewport.z, _viewport.w, false ); }; this.getSize = function () { return { width: _width, height: _height }; }; this.setSize = function ( width, height, updateStyle ) { _width = width; _height = height; _canvas.width = width * _pixelRatio; _canvas.height = height * _pixelRatio; if ( updateStyle !== false ) { _canvas.style.width = width + 'px'; _canvas.style.height = height + 'px'; } this.setViewport( 0, 0, width, height ); }; this.setViewport = function ( x, y, width, height ) { state.viewport( _viewport.set( x, y, width, height ) ); }; this.setScissor = function ( x, y, width, height ) { state.scissor( _scissor.set( x, y, width, height ) ); }; this.setScissorTest = function ( boolean ) { state.setScissorTest( _scissorTest = boolean ); }; // Clearing this.getClearColor = function () { return _clearColor; }; this.setClearColor = function ( color, alpha ) { _clearColor.set( color ); _clearAlpha = alpha !== undefined ? alpha : 1; state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha ); }; this.getClearAlpha = function () { return _clearAlpha; }; this.setClearAlpha = function ( alpha ) { _clearAlpha = alpha; state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha ); }; this.clear = function ( color, depth, stencil ) { var bits = 0; if ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT; if ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT; if ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT; _gl.clear( bits ); }; this.clearColor = function () { this.clear( true, false, false ); }; this.clearDepth = function () { this.clear( false, true, false ); }; this.clearStencil = function () { this.clear( false, false, true ); }; this.clearTarget = function ( renderTarget, color, depth, stencil ) { this.setRenderTarget( renderTarget ); this.clear( color, depth, stencil ); }; // Reset this.resetGLState = resetGLState; this.dispose = function () { _canvas.removeEventListener( 'webglcontextlost', onContextLost, false ); renderLists.dispose(); }; // Events function onContextLost( event ) { event.preventDefault(); resetGLState(); setDefaultGLState(); properties.clear(); objects.clear(); } function onMaterialDispose( event ) { var material = event.target; material.removeEventListener( 'dispose', onMaterialDispose ); deallocateMaterial( material ); } // Buffer deallocation function deallocateMaterial( material ) { releaseMaterialProgramReference( material ); properties.remove( material ); } function releaseMaterialProgramReference( material ) { var programInfo = properties.get( material ).program; material.program = undefined; if ( programInfo !== undefined ) { programCache.releaseProgram( programInfo ); } } // Buffer rendering function renderObjectImmediate( object, program, material ) { object.render( function ( object ) { _this.renderBufferImmediate( object, program, material ); } ); } this.renderBufferImmediate = function ( object, program, material ) { state.initAttributes(); var buffers = properties.get( object ); if ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer(); if ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer(); if ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer(); if ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer(); var programAttributes = program.getAttributes(); if ( object.hasPositions ) { _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position ); _gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW ); state.enableAttribute( programAttributes.position ); _gl.vertexAttribPointer( programAttributes.position, 3, _gl.FLOAT, false, 0, 0 ); } if ( object.hasNormals ) { _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal ); if ( ! material.isMeshPhongMaterial && ! material.isMeshStandardMaterial && ! material.isMeshNormalMaterial && material.shading === FlatShading$1 ) { for ( var i = 0, l = object.count * 3; i < l; i += 9 ) { var array = object.normalArray; var nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3; var ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3; var nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3; array[ i + 0 ] = nx; array[ i + 1 ] = ny; array[ i + 2 ] = nz; array[ i + 3 ] = nx; array[ i + 4 ] = ny; array[ i + 5 ] = nz; array[ i + 6 ] = nx; array[ i + 7 ] = ny; array[ i + 8 ] = nz; } } _gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW ); state.enableAttribute( programAttributes.normal ); _gl.vertexAttribPointer( programAttributes.normal, 3, _gl.FLOAT, false, 0, 0 ); } if ( object.hasUvs && material.map ) { _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv ); _gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW ); state.enableAttribute( programAttributes.uv ); _gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 ); } if ( object.hasColors && material.vertexColors !== NoColors$1 ) { _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color ); _gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW ); state.enableAttribute( programAttributes.color ); _gl.vertexAttribPointer( programAttributes.color, 3, _gl.FLOAT, false, 0, 0 ); } state.disableUnusedAttributes(); _gl.drawArrays( _gl.TRIANGLES, 0, object.count ); object.count = 0; }; function absNumericalSort( a, b ) { return Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] ); } this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) { state.setMaterial( material ); var program = setProgram( camera, fog, material, object ); var geometryProgram = geometry.id + '_' + program.id + '_' + ( material.wireframe === true ); var updateBuffers = false; if ( geometryProgram !== _currentGeometryProgram ) { _currentGeometryProgram = geometryProgram; updateBuffers = true; } // morph targets var morphTargetInfluences = object.morphTargetInfluences; if ( morphTargetInfluences !== undefined ) { // TODO Remove allocations var activeInfluences = []; for ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) { var influence = morphTargetInfluences[ i ]; activeInfluences.push( [ influence, i ] ); } activeInfluences.sort( absNumericalSort ); if ( activeInfluences.length > 8 ) { activeInfluences.length = 8; } var morphAttributes = geometry.morphAttributes; for ( var i = 0, l = activeInfluences.length; i < l; i ++ ) { var influence = activeInfluences[ i ]; morphInfluences[ i ] = influence[ 0 ]; if ( influence[ 0 ] !== 0 ) { var index = influence[ 1 ]; if ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] ); if ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] ); } else { if ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i ); if ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i ); } } for ( var i = activeInfluences.length, il = morphInfluences.length; i < il; i ++ ) { morphInfluences[ i ] = 0.0; } program.getUniforms().setValue( _gl, 'morphTargetInfluences', morphInfluences ); updateBuffers = true; } // var index = geometry.index; var position = geometry.attributes.position; var rangeFactor = 1; if ( material.wireframe === true ) { index = geometries.getWireframeAttribute( geometry ); rangeFactor = 2; } var renderer = bufferRenderer; if ( index !== null ) { renderer = indexedBufferRenderer; renderer.setIndex( index ); } if ( updateBuffers ) { setupVertexAttributes( material, program, geometry ); if ( index !== null ) { _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, attributes.get( index ).buffer ); } } // var dataCount = 0; if ( index !== null ) { dataCount = index.count; } else if ( position !== undefined ) { dataCount = position.count; } var rangeStart = geometry.drawRange.start * rangeFactor; var rangeCount = geometry.drawRange.count * rangeFactor; var groupStart = group !== null ? group.start * rangeFactor : 0; var groupCount = group !== null ? group.count * rangeFactor : Infinity; var drawStart = Math.max( rangeStart, groupStart ); var drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1; var drawCount = Math.max( 0, drawEnd - drawStart + 1 ); if ( drawCount === 0 ) return; // if ( object.isMesh ) { if ( material.wireframe === true ) { state.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() ); renderer.setMode( _gl.LINES ); } else { switch ( object.drawMode ) { case TrianglesDrawMode$1: renderer.setMode( _gl.TRIANGLES ); break; case TriangleStripDrawMode$1: renderer.setMode( _gl.TRIANGLE_STRIP ); break; case TriangleFanDrawMode$1: renderer.setMode( _gl.TRIANGLE_FAN ); break; } } } else if ( object.isLine ) { var lineWidth = material.linewidth; if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material state.setLineWidth( lineWidth * getTargetPixelRatio() ); if ( object.isLineSegments ) { renderer.setMode( _gl.LINES ); } else if ( object.isLineLoop ) { renderer.setMode( _gl.LINE_LOOP ); } else { renderer.setMode( _gl.LINE_STRIP ); } } else if ( object.isPoints ) { renderer.setMode( _gl.POINTS ); } if ( geometry && geometry.isInstancedBufferGeometry ) { if ( geometry.maxInstancedCount > 0 ) { renderer.renderInstances( geometry, drawStart, drawCount ); } } else { renderer.render( drawStart, drawCount ); } }; function setupVertexAttributes( material, program, geometry, startIndex ) { if ( geometry && geometry.isInstancedBufferGeometry ) { if ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) { console.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); return; } } if ( startIndex === undefined ) startIndex = 0; state.initAttributes(); var geometryAttributes = geometry.attributes; var programAttributes = program.getAttributes(); var materialDefaultAttributeValues = material.defaultAttributeValues; for ( var name in programAttributes ) { var programAttribute = programAttributes[ name ]; if ( programAttribute >= 0 ) { var geometryAttribute = geometryAttributes[ name ]; if ( geometryAttribute !== undefined ) { var normalized = geometryAttribute.normalized; var size = geometryAttribute.itemSize; var attributeProperties = attributes.get( geometryAttribute ); var buffer = attributeProperties.buffer; var type = attributeProperties.type; var bytesPerElement = attributeProperties.bytesPerElement; if ( geometryAttribute.isInterleavedBufferAttribute ) { var data = geometryAttribute.data; var stride = data.stride; var offset = geometryAttribute.offset; if ( data && data.isInstancedInterleavedBuffer ) { state.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute ); if ( geometry.maxInstancedCount === undefined ) { geometry.maxInstancedCount = data.meshPerAttribute * data.count; } } else { state.enableAttribute( programAttribute ); } _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); _gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, ( startIndex * stride + offset ) * bytesPerElement ); } else { if ( geometryAttribute.isInstancedBufferAttribute ) { state.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute ); if ( geometry.maxInstancedCount === undefined ) { geometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count; } } else { state.enableAttribute( programAttribute ); } _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); _gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, startIndex * size * bytesPerElement ); } } else if ( materialDefaultAttributeValues !== undefined ) { var value = materialDefaultAttributeValues[ name ]; if ( value !== undefined ) { switch ( value.length ) { case 2: _gl.vertexAttrib2fv( programAttribute, value ); break; case 3: _gl.vertexAttrib3fv( programAttribute, value ); break; case 4: _gl.vertexAttrib4fv( programAttribute, value ); break; default: _gl.vertexAttrib1fv( programAttribute, value ); } } } } } state.disableUnusedAttributes(); } // Compile this.compile = function ( scene, camera ) { lights = []; scene.traverse( function ( object ) { if ( object.isLight ) { lights.push( object ); } } ); setupLights( lights, camera ); scene.traverse( function ( object ) { if ( object.material ) { if ( Array.isArray( object.material ) ) { for ( var i = 0; i < object.material.length; i ++ ) { initMaterial( object.material[ i ], scene.fog, object ); } } else { initMaterial( object.material, scene.fog, object ); } } } ); }; // Rendering this.render = function ( scene, camera, renderTarget, forceClear ) { if ( camera !== undefined && camera.isCamera !== true ) { console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' ); return; } // reset caching for this frame _currentGeometryProgram = ''; _currentMaterialId = - 1; _currentCamera = null; // update scene graph if ( scene.autoUpdate === true ) scene.updateMatrixWorld(); // update camera matrices and frustum camera.onBeforeRender( _this ); if ( camera.parent === null ) camera.updateMatrixWorld(); camera.matrixWorldInverse.getInverse( camera.matrixWorld ); _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); _frustum.setFromMatrix( _projScreenMatrix ); lights.length = 0; sprites.length = 0; lensFlares.length = 0; _localClippingEnabled = this.localClippingEnabled; _clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera ); currentRenderList = renderLists.get( scene, camera ); currentRenderList.init(); projectObject( scene, camera, _this.sortObjects ); currentRenderList.finish(); if ( _this.sortObjects === true ) { currentRenderList.sort(); } // if ( _clippingEnabled ) _clipping.beginShadows(); setupShadows( lights ); shadowMap.render( scene, camera ); setupLights( lights, camera ); if ( _clippingEnabled ) _clipping.endShadows(); // _infoRender.frame ++; _infoRender.calls = 0; _infoRender.vertices = 0; _infoRender.faces = 0; _infoRender.points = 0; if ( renderTarget === undefined ) { renderTarget = null; } this.setRenderTarget( renderTarget ); // var background = scene.background; if ( background === null ) { state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha ); } else if ( background && background.isColor ) { state.buffers.color.setClear( background.r, background.g, background.b, 1, _premultipliedAlpha ); forceClear = true; } if ( this.autoClear || forceClear ) { this.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil ); } if ( background && background.isCubeTexture ) { if ( backgroundBoxCamera === undefined ) { backgroundBoxCamera = new PerspectiveCamera$2(); backgroundBoxMesh = new Mesh$1( new BoxBufferGeometry$1( 5, 5, 5 ), new ShaderMaterial$1( { uniforms: ShaderLib$1.cube.uniforms, vertexShader: ShaderLib$1.cube.vertexShader, fragmentShader: ShaderLib$1.cube.fragmentShader, side: BackSide$1, depthTest: false, depthWrite: false, fog: false } ) ); } backgroundBoxCamera.projectionMatrix.copy( camera.projectionMatrix ); backgroundBoxCamera.matrixWorld.extractRotation( camera.matrixWorld ); backgroundBoxCamera.matrixWorldInverse.getInverse( backgroundBoxCamera.matrixWorld ); backgroundBoxMesh.material.uniforms[ "tCube" ].value = background; backgroundBoxMesh.modelViewMatrix.multiplyMatrices( backgroundBoxCamera.matrixWorldInverse, backgroundBoxMesh.matrixWorld ); objects.update( backgroundBoxMesh ); _this.renderBufferDirect( backgroundBoxCamera, null, backgroundBoxMesh.geometry, backgroundBoxMesh.material, backgroundBoxMesh, null ); } else if ( background && background.isTexture ) { if ( backgroundPlaneCamera === undefined ) { backgroundPlaneCamera = new OrthographicCamera$2( - 1, 1, 1, - 1, 0, 1 ); backgroundPlaneMesh = new Mesh$1( new PlaneBufferGeometry$1( 2, 2 ), new MeshBasicMaterial$1( { depthTest: false, depthWrite: false, fog: false } ) ); } backgroundPlaneMesh.material.map = background; objects.update( backgroundPlaneMesh ); _this.renderBufferDirect( backgroundPlaneCamera, null, backgroundPlaneMesh.geometry, backgroundPlaneMesh.material, backgroundPlaneMesh, null ); } // var opaqueObjects = currentRenderList.opaque; var transparentObjects = currentRenderList.transparent; if ( scene.overrideMaterial ) { var overrideMaterial = scene.overrideMaterial; if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera, overrideMaterial ); if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera, overrideMaterial ); } else { // opaque pass (front-to-back order) if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera ); // transparent pass (back-to-front order) if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera ); } // custom render plugins (post pass) spritePlugin.render( scene, camera ); lensFlarePlugin.render( scene, camera, _currentViewport ); // Generate mipmap if we're using any kind of mipmap filtering if ( renderTarget ) { textures.updateRenderTargetMipmap( renderTarget ); } // Ensure depth buffer writing is enabled so it can be cleared on next render state.buffers.depth.setTest( true ); state.buffers.depth.setMask( true ); state.buffers.color.setMask( true ); if ( camera.isArrayCamera && camera.enabled ) { _this.setScissorTest( false ); } camera.onAfterRender( _this ); // _gl.finish(); }; /* // TODO Duplicated code (Frustum) var _sphere = new Sphere(); function isObjectViewable( object ) { var geometry = object.geometry; if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); _sphere.copy( geometry.boundingSphere ). applyMatrix4( object.matrixWorld ); return isSphereViewable( _sphere ); } function isSpriteViewable( sprite ) { _sphere.center.set( 0, 0, 0 ); _sphere.radius = 0.7071067811865476; _sphere.applyMatrix4( sprite.matrixWorld ); return isSphereViewable( _sphere ); } function isSphereViewable( sphere ) { if ( ! _frustum.intersectsSphere( sphere ) ) return false; var numPlanes = _clipping.numPlanes; if ( numPlanes === 0 ) return true; var planes = _this.clippingPlanes, center = sphere.center, negRad = - sphere.radius, i = 0; do { // out when deeper than radius in the negative halfspace if ( planes[ i ].distanceToPoint( center ) < negRad ) return false; } while ( ++ i !== numPlanes ); return true; } */ function projectObject( object, camera, sortObjects ) { if ( ! object.visible ) return; var visible = object.layers.test( camera.layers ); if ( visible ) { if ( object.isLight ) { lights.push( object ); } else if ( object.isSprite ) { if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) { sprites.push( object ); } } else if ( object.isLensFlare ) { lensFlares.push( object ); } else if ( object.isImmediateRenderObject ) { if ( sortObjects ) { _vector3.setFromMatrixPosition( object.matrixWorld ) .applyMatrix4( _projScreenMatrix ); } currentRenderList.push( object, null, object.material, _vector3.z, null ); } else if ( object.isMesh || object.isLine || object.isPoints ) { if ( object.isSkinnedMesh ) { object.skeleton.update(); } if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) { if ( sortObjects ) { _vector3.setFromMatrixPosition( object.matrixWorld ) .applyMatrix4( _projScreenMatrix ); } var geometry = objects.update( object ); var material = object.material; if ( Array.isArray( material ) ) { var groups = geometry.groups; for ( var i = 0, l = groups.length; i < l; i ++ ) { var group = groups[ i ]; var groupMaterial = material[ group.materialIndex ]; if ( groupMaterial && groupMaterial.visible ) { currentRenderList.push( object, geometry, groupMaterial, _vector3.z, group ); } } } else if ( material.visible ) { currentRenderList.push( object, geometry, material, _vector3.z, null ); } } } } var children = object.children; for ( var i = 0, l = children.length; i < l; i ++ ) { projectObject( children[ i ], camera, sortObjects ); } } function renderObjects( renderList, scene, camera, overrideMaterial ) { for ( var i = 0, l = renderList.length; i < l; i ++ ) { var renderItem = renderList[ i ]; var object = renderItem.object; var geometry = renderItem.geometry; var material = overrideMaterial === undefined ? renderItem.material : overrideMaterial; var group = renderItem.group; object.onBeforeRender( _this, scene, camera, geometry, material, group ); if ( camera.isArrayCamera && camera.enabled ) { var cameras = camera.cameras; for ( var j = 0, jl = cameras.length; j < jl; j ++ ) { var camera2 = cameras[ j ]; var bounds = camera2.bounds; _this.setViewport( bounds.x * _width * _pixelRatio, bounds.y * _height * _pixelRatio, bounds.z * _width * _pixelRatio, bounds.w * _height * _pixelRatio ); _this.setScissor( bounds.x * _width * _pixelRatio, bounds.y * _height * _pixelRatio, bounds.z * _width * _pixelRatio, bounds.w * _height * _pixelRatio ); _this.setScissorTest( true ); renderObject( object, scene, camera2, geometry, material, group ); } } else { renderObject( object, scene, camera, geometry, material, group ); } object.onAfterRender( _this, scene, camera, geometry, material, group ); } } function renderObject( object, scene, camera, geometry, material, group ) { object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); object.normalMatrix.getNormalMatrix( object.modelViewMatrix ); if ( object.isImmediateRenderObject ) { state.setMaterial( material ); var program = setProgram( camera, scene.fog, material, object ); _currentGeometryProgram = ''; renderObjectImmediate( object, program, material ); } else { _this.renderBufferDirect( camera, scene.fog, geometry, material, object, group ); } } function initMaterial( material, fog, object ) { var materialProperties = properties.get( material ); var parameters = programCache.getParameters( material, _lights, fog, _clipping.numPlanes, _clipping.numIntersection, object ); var code = programCache.getProgramCode( material, parameters ); var program = materialProperties.program; var programChange = true; if ( program === undefined ) { // new material material.addEventListener( 'dispose', onMaterialDispose ); } else if ( program.code !== code ) { // changed glsl or parameters releaseMaterialProgramReference( material ); } else if ( parameters.shaderID !== undefined ) { // same glsl and uniform list return; } else { // only rebuild uniform list programChange = false; } if ( programChange ) { if ( parameters.shaderID ) { var shader = ShaderLib$1[ parameters.shaderID ]; materialProperties.__webglShader = { name: material.type, uniforms: UniformsUtils$1.clone( shader.uniforms ), vertexShader: shader.vertexShader, fragmentShader: shader.fragmentShader }; } else { materialProperties.__webglShader = { name: material.type, uniforms: material.uniforms, vertexShader: material.vertexShader, fragmentShader: material.fragmentShader }; } material.__webglShader = materialProperties.__webglShader; program = programCache.acquireProgram( material, parameters, code ); materialProperties.program = program; material.program = program; } var programAttributes = program.getAttributes(); if ( material.morphTargets ) { material.numSupportedMorphTargets = 0; for ( var i = 0; i < _this.maxMorphTargets; i ++ ) { if ( programAttributes[ 'morphTarget' + i ] >= 0 ) { material.numSupportedMorphTargets ++; } } } if ( material.morphNormals ) { material.numSupportedMorphNormals = 0; for ( var i = 0; i < _this.maxMorphNormals; i ++ ) { if ( programAttributes[ 'morphNormal' + i ] >= 0 ) { material.numSupportedMorphNormals ++; } } } var uniforms = materialProperties.__webglShader.uniforms; if ( ! material.isShaderMaterial && ! material.isRawShaderMaterial || material.clipping === true ) { materialProperties.numClippingPlanes = _clipping.numPlanes; materialProperties.numIntersection = _clipping.numIntersection; uniforms.clippingPlanes = _clipping.uniform; } materialProperties.fog = fog; // store the light setup it was created for materialProperties.lightsHash = _lights.hash; if ( material.lights ) { // wire up the material to this renderer's lighting state uniforms.ambientLightColor.value = _lights.ambient; uniforms.directionalLights.value = _lights.directional; uniforms.spotLights.value = _lights.spot; uniforms.rectAreaLights.value = _lights.rectArea; uniforms.pointLights.value = _lights.point; uniforms.hemisphereLights.value = _lights.hemi; uniforms.directionalShadowMap.value = _lights.directionalShadowMap; uniforms.directionalShadowMatrix.value = _lights.directionalShadowMatrix; uniforms.spotShadowMap.value = _lights.spotShadowMap; uniforms.spotShadowMatrix.value = _lights.spotShadowMatrix; uniforms.pointShadowMap.value = _lights.pointShadowMap; uniforms.pointShadowMatrix.value = _lights.pointShadowMatrix; // TODO (abelnation): add area lights shadow info to uniforms } var progUniforms = materialProperties.program.getUniforms(), uniformsList = WebGLUniforms$1.seqWithValue( progUniforms.seq, uniforms ); materialProperties.uniformsList = uniformsList; } function setProgram( camera, fog, material, object ) { _usedTextureUnits = 0; var materialProperties = properties.get( material ); if ( _clippingEnabled ) { if ( _localClippingEnabled || camera !== _currentCamera ) { var useCache = camera === _currentCamera && material.id === _currentMaterialId; // we might want to call this function with some ClippingGroup // object instead of the material, once it becomes feasible // (#8465, #8379) _clipping.setState( material.clippingPlanes, material.clipIntersection, material.clipShadows, camera, materialProperties, useCache ); } } if ( material.needsUpdate === false ) { if ( materialProperties.program === undefined ) { material.needsUpdate = true; } else if ( material.fog && materialProperties.fog !== fog ) { material.needsUpdate = true; } else if ( material.lights && materialProperties.lightsHash !== _lights.hash ) { material.needsUpdate = true; } else if ( materialProperties.numClippingPlanes !== undefined && ( materialProperties.numClippingPlanes !== _clipping.numPlanes || materialProperties.numIntersection !== _clipping.numIntersection ) ) { material.needsUpdate = true; } } if ( material.needsUpdate ) { initMaterial( material, fog, object ); material.needsUpdate = false; } var refreshProgram = false; var refreshMaterial = false; var refreshLights = false; var program = materialProperties.program, p_uniforms = program.getUniforms(), m_uniforms = materialProperties.__webglShader.uniforms; if ( program.id !== _currentProgram ) { _gl.useProgram( program.program ); _currentProgram = program.id; refreshProgram = true; refreshMaterial = true; refreshLights = true; } if ( material.id !== _currentMaterialId ) { _currentMaterialId = material.id; refreshMaterial = true; } if ( refreshProgram || camera !== _currentCamera ) { p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix ); if ( capabilities.logarithmicDepthBuffer ) { p_uniforms.setValue( _gl, 'logDepthBufFC', 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) ); } if ( camera !== _currentCamera ) { _currentCamera = camera; // lighting uniforms depend on the camera so enforce an update // now, in case this material supports lights - or later, when // the next material that does gets activated: refreshMaterial = true; // set to true on material change refreshLights = true; // remains set until update done } // load material specific uniforms // (shader material also gets them for the sake of genericity) if ( material.isShaderMaterial || material.isMeshPhongMaterial || material.isMeshStandardMaterial || material.envMap ) { var uCamPos = p_uniforms.map.cameraPosition; if ( uCamPos !== undefined ) { uCamPos.setValue( _gl, _vector3.setFromMatrixPosition( camera.matrixWorld ) ); } } if ( material.isMeshPhongMaterial || material.isMeshLambertMaterial || material.isMeshBasicMaterial || material.isMeshStandardMaterial || material.isShaderMaterial || material.skinning ) { p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse ); } p_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure ); p_uniforms.setValue( _gl, 'toneMappingWhitePoint', _this.toneMappingWhitePoint ); } // skinning uniforms must be set even if material didn't change // auto-setting of texture unit for bone texture must go before other textures // not sure why, but otherwise weird things happen if ( material.skinning ) { p_uniforms.setOptional( _gl, object, 'bindMatrix' ); p_uniforms.setOptional( _gl, object, 'bindMatrixInverse' ); var skeleton = object.skeleton; if ( skeleton ) { var bones = skeleton.bones; if ( capabilities.floatVertexTextures ) { if ( skeleton.boneTexture === undefined ) { // layout (1 matrix = 4 pixels) // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4) // with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8) // 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16) // 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32) // 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64) var size = Math.sqrt( bones.length * 4 ); // 4 pixels needed for 1 matrix size = _Math$1.nextPowerOfTwo( Math.ceil( size ) ); size = Math.max( size, 4 ); var boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel boneMatrices.set( skeleton.boneMatrices ); // copy current values var boneTexture = new DataTexture$1( boneMatrices, size, size, RGBAFormat$1, FloatType$1 ); skeleton.boneMatrices = boneMatrices; skeleton.boneTexture = boneTexture; skeleton.boneTextureSize = size; } p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture ); p_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize ); } else { p_uniforms.setOptional( _gl, skeleton, 'boneMatrices' ); } } } if ( refreshMaterial ) { if ( material.lights ) { // the current material requires lighting info // note: all lighting uniforms are always set correctly // they simply reference the renderer's state for their // values // // use the current material's .needsUpdate flags to set // the GL state when required markUniformsLightsNeedsUpdate( m_uniforms, refreshLights ); } // refresh uniforms common to several materials if ( fog && material.fog ) { refreshUniformsFog( m_uniforms, fog ); } if ( material.isMeshBasicMaterial || material.isMeshLambertMaterial || material.isMeshPhongMaterial || material.isMeshStandardMaterial || material.isMeshNormalMaterial || material.isMeshDepthMaterial ) { refreshUniformsCommon( m_uniforms, material ); } // refresh single material specific uniforms if ( material.isLineBasicMaterial ) { refreshUniformsLine( m_uniforms, material ); } else if ( material.isLineDashedMaterial ) { refreshUniformsLine( m_uniforms, material ); refreshUniformsDash( m_uniforms, material ); } else if ( material.isPointsMaterial ) { refreshUniformsPoints( m_uniforms, material ); } else if ( material.isMeshLambertMaterial ) { refreshUniformsLambert( m_uniforms, material ); } else if ( material.isMeshToonMaterial ) { refreshUniformsToon( m_uniforms, material ); } else if ( material.isMeshPhongMaterial ) { refreshUniformsPhong( m_uniforms, material ); } else if ( material.isMeshPhysicalMaterial ) { refreshUniformsPhysical( m_uniforms, material ); } else if ( material.isMeshStandardMaterial ) { refreshUniformsStandard( m_uniforms, material ); } else if ( material.isMeshDepthMaterial ) { if ( material.displacementMap ) { m_uniforms.displacementMap.value = material.displacementMap; m_uniforms.displacementScale.value = material.displacementScale; m_uniforms.displacementBias.value = material.displacementBias; } } else if ( material.isMeshNormalMaterial ) { refreshUniformsNormal( m_uniforms, material ); } // RectAreaLight Texture // TODO (mrdoob): Find a nicer implementation if ( m_uniforms.ltcMat !== undefined ) m_uniforms.ltcMat.value = UniformsLib$1.LTC_MAT_TEXTURE; if ( m_uniforms.ltcMag !== undefined ) m_uniforms.ltcMag.value = UniformsLib$1.LTC_MAG_TEXTURE; WebGLUniforms$1.upload( _gl, materialProperties.uniformsList, m_uniforms, _this ); } // common matrices p_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix ); p_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix ); p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld ); return program; } // Uniforms (refresh uniforms objects) function refreshUniformsCommon( uniforms, material ) { uniforms.opacity.value = material.opacity; uniforms.diffuse.value = material.color; if ( material.emissive ) { uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity ); } uniforms.map.value = material.map; uniforms.specularMap.value = material.specularMap; uniforms.alphaMap.value = material.alphaMap; if ( material.lightMap ) { uniforms.lightMap.value = material.lightMap; uniforms.lightMapIntensity.value = material.lightMapIntensity; } if ( material.aoMap ) { uniforms.aoMap.value = material.aoMap; uniforms.aoMapIntensity.value = material.aoMapIntensity; } // uv repeat and offset setting priorities // 1. color map // 2. specular map // 3. normal map // 4. bump map // 5. alpha map // 6. emissive map var uvScaleMap; if ( material.map ) { uvScaleMap = material.map; } else if ( material.specularMap ) { uvScaleMap = material.specularMap; } else if ( material.displacementMap ) { uvScaleMap = material.displacementMap; } else if ( material.normalMap ) { uvScaleMap = material.normalMap; } else if ( material.bumpMap ) { uvScaleMap = material.bumpMap; } else if ( material.roughnessMap ) { uvScaleMap = material.roughnessMap; } else if ( material.metalnessMap ) { uvScaleMap = material.metalnessMap; } else if ( material.alphaMap ) { uvScaleMap = material.alphaMap; } else if ( material.emissiveMap ) { uvScaleMap = material.emissiveMap; } if ( uvScaleMap !== undefined ) { // backwards compatibility if ( uvScaleMap.isWebGLRenderTarget ) { uvScaleMap = uvScaleMap.texture; } var offset = uvScaleMap.offset; var repeat = uvScaleMap.repeat; uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y ); } uniforms.envMap.value = material.envMap; // don't flip CubeTexture envMaps, flip everything else: // WebGLRenderTargetCube will be flipped for backwards compatibility // WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture // this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future uniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1; uniforms.reflectivity.value = material.reflectivity; uniforms.refractionRatio.value = material.refractionRatio; } function refreshUniformsLine( uniforms, material ) { uniforms.diffuse.value = material.color; uniforms.opacity.value = material.opacity; } function refreshUniformsDash( uniforms, material ) { uniforms.dashSize.value = material.dashSize; uniforms.totalSize.value = material.dashSize + material.gapSize; uniforms.scale.value = material.scale; } function refreshUniformsPoints( uniforms, material ) { uniforms.diffuse.value = material.color; uniforms.opacity.value = material.opacity; uniforms.size.value = material.size * _pixelRatio; uniforms.scale.value = _height * 0.5; uniforms.map.value = material.map; if ( material.map !== null ) { var offset = material.map.offset; var repeat = material.map.repeat; uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y ); } } function refreshUniformsFog( uniforms, fog ) { uniforms.fogColor.value = fog.color; if ( fog.isFog ) { uniforms.fogNear.value = fog.near; uniforms.fogFar.value = fog.far; } else if ( fog.isFogExp2 ) { uniforms.fogDensity.value = fog.density; } } function refreshUniformsLambert( uniforms, material ) { if ( material.emissiveMap ) { uniforms.emissiveMap.value = material.emissiveMap; } } function refreshUniformsPhong( uniforms, material ) { uniforms.specular.value = material.specular; uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 ) if ( material.emissiveMap ) { uniforms.emissiveMap.value = material.emissiveMap; } if ( material.bumpMap ) { uniforms.bumpMap.value = material.bumpMap; uniforms.bumpScale.value = material.bumpScale; } if ( material.normalMap ) { uniforms.normalMap.value = material.normalMap; uniforms.normalScale.value.copy( material.normalScale ); } if ( material.displacementMap ) { uniforms.displacementMap.value = material.displacementMap; uniforms.displacementScale.value = material.displacementScale; uniforms.displacementBias.value = material.displacementBias; } } function refreshUniformsToon( uniforms, material ) { refreshUniformsPhong( uniforms, material ); if ( material.gradientMap ) { uniforms.gradientMap.value = material.gradientMap; } } function refreshUniformsStandard( uniforms, material ) { uniforms.roughness.value = material.roughness; uniforms.metalness.value = material.metalness; if ( material.roughnessMap ) { uniforms.roughnessMap.value = material.roughnessMap; } if ( material.metalnessMap ) { uniforms.metalnessMap.value = material.metalnessMap; } if ( material.emissiveMap ) { uniforms.emissiveMap.value = material.emissiveMap; } if ( material.bumpMap ) { uniforms.bumpMap.value = material.bumpMap; uniforms.bumpScale.value = material.bumpScale; } if ( material.normalMap ) { uniforms.normalMap.value = material.normalMap; uniforms.normalScale.value.copy( material.normalScale ); } if ( material.displacementMap ) { uniforms.displacementMap.value = material.displacementMap; uniforms.displacementScale.value = material.displacementScale; uniforms.displacementBias.value = material.displacementBias; } if ( material.envMap ) { //uniforms.envMap.value = material.envMap; // part of uniforms common uniforms.envMapIntensity.value = material.envMapIntensity; } } function refreshUniformsPhysical( uniforms, material ) { uniforms.clearCoat.value = material.clearCoat; uniforms.clearCoatRoughness.value = material.clearCoatRoughness; refreshUniformsStandard( uniforms, material ); } function refreshUniformsNormal( uniforms, material ) { if ( material.bumpMap ) { uniforms.bumpMap.value = material.bumpMap; uniforms.bumpScale.value = material.bumpScale; } if ( material.normalMap ) { uniforms.normalMap.value = material.normalMap; uniforms.normalScale.value.copy( material.normalScale ); } if ( material.displacementMap ) { uniforms.displacementMap.value = material.displacementMap; uniforms.displacementScale.value = material.displacementScale; uniforms.displacementBias.value = material.displacementBias; } } // If uniforms are marked as clean, they don't need to be loaded to the GPU. function markUniformsLightsNeedsUpdate( uniforms, value ) { uniforms.ambientLightColor.needsUpdate = value; uniforms.directionalLights.needsUpdate = value; uniforms.pointLights.needsUpdate = value; uniforms.spotLights.needsUpdate = value; uniforms.rectAreaLights.needsUpdate = value; uniforms.hemisphereLights.needsUpdate = value; } // Lighting function setupShadows( lights ) { var lightShadowsLength = 0; for ( var i = 0, l = lights.length; i < l; i ++ ) { var light = lights[ i ]; if ( light.castShadow ) { _lights.shadows[ lightShadowsLength ] = light; lightShadowsLength ++; } } _lights.shadows.length = lightShadowsLength; } function setupLights( lights, camera ) { var l, ll, light, shadow, r = 0, g = 0, b = 0, color, intensity, distance, shadowMap, viewMatrix = camera.matrixWorldInverse, directionalLength = 0, pointLength = 0, spotLength = 0, rectAreaLength = 0, hemiLength = 0; for ( l = 0, ll = lights.length; l < ll; l ++ ) { light = lights[ l ]; color = light.color; intensity = light.intensity; distance = light.distance; shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null; if ( light.isAmbientLight ) { r += color.r * intensity; g += color.g * intensity; b += color.b * intensity; } else if ( light.isDirectionalLight ) { var uniforms = lightCache.get( light ); uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); uniforms.direction.setFromMatrixPosition( light.matrixWorld ); _vector3.setFromMatrixPosition( light.target.matrixWorld ); uniforms.direction.sub( _vector3 ); uniforms.direction.transformDirection( viewMatrix ); uniforms.shadow = light.castShadow; if ( light.castShadow ) { shadow = light.shadow; uniforms.shadowBias = shadow.bias; uniforms.shadowRadius = shadow.radius; uniforms.shadowMapSize = shadow.mapSize; } _lights.directionalShadowMap[ directionalLength ] = shadowMap; _lights.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix; _lights.directional[ directionalLength ] = uniforms; directionalLength ++; } else if ( light.isSpotLight ) { var uniforms = lightCache.get( light ); uniforms.position.setFromMatrixPosition( light.matrixWorld ); uniforms.position.applyMatrix4( viewMatrix ); uniforms.color.copy( color ).multiplyScalar( intensity ); uniforms.distance = distance; uniforms.direction.setFromMatrixPosition( light.matrixWorld ); _vector3.setFromMatrixPosition( light.target.matrixWorld ); uniforms.direction.sub( _vector3 ); uniforms.direction.transformDirection( viewMatrix ); uniforms.coneCos = Math.cos( light.angle ); uniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) ); uniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay; uniforms.shadow = light.castShadow; if ( light.castShadow ) { shadow = light.shadow; uniforms.shadowBias = shadow.bias; uniforms.shadowRadius = shadow.radius; uniforms.shadowMapSize = shadow.mapSize; } _lights.spotShadowMap[ spotLength ] = shadowMap; _lights.spotShadowMatrix[ spotLength ] = light.shadow.matrix; _lights.spot[ spotLength ] = uniforms; spotLength ++; } else if ( light.isRectAreaLight ) { var uniforms = lightCache.get( light ); // (a) intensity controls irradiance of entire light uniforms.color .copy( color ) .multiplyScalar( intensity / ( light.width * light.height ) ); // (b) intensity controls the radiance per light area // uniforms.color.copy( color ).multiplyScalar( intensity ); uniforms.position.setFromMatrixPosition( light.matrixWorld ); uniforms.position.applyMatrix4( viewMatrix ); // extract local rotation of light to derive width/height half vectors _matrix42.identity(); _matrix4.copy( light.matrixWorld ); _matrix4.premultiply( viewMatrix ); _matrix42.extractRotation( _matrix4 ); uniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 ); uniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 ); uniforms.halfWidth.applyMatrix4( _matrix42 ); uniforms.halfHeight.applyMatrix4( _matrix42 ); // TODO (abelnation): RectAreaLight distance? // uniforms.distance = distance; _lights.rectArea[ rectAreaLength ] = uniforms; rectAreaLength ++; } else if ( light.isPointLight ) { var uniforms = lightCache.get( light ); uniforms.position.setFromMatrixPosition( light.matrixWorld ); uniforms.position.applyMatrix4( viewMatrix ); uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); uniforms.distance = light.distance; uniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay; uniforms.shadow = light.castShadow; if ( light.castShadow ) { shadow = light.shadow; uniforms.shadowBias = shadow.bias; uniforms.shadowRadius = shadow.radius; uniforms.shadowMapSize = shadow.mapSize; } _lights.pointShadowMap[ pointLength ] = shadowMap; _lights.pointShadowMatrix[ pointLength ] = light.shadow.matrix; _lights.point[ pointLength ] = uniforms; pointLength ++; } else if ( light.isHemisphereLight ) { var uniforms = lightCache.get( light ); uniforms.direction.setFromMatrixPosition( light.matrixWorld ); uniforms.direction.transformDirection( viewMatrix ); uniforms.direction.normalize(); uniforms.skyColor.copy( light.color ).multiplyScalar( intensity ); uniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity ); _lights.hemi[ hemiLength ] = uniforms; hemiLength ++; } } _lights.ambient[ 0 ] = r; _lights.ambient[ 1 ] = g; _lights.ambient[ 2 ] = b; _lights.directional.length = directionalLength; _lights.spot.length = spotLength; _lights.rectArea.length = rectAreaLength; _lights.point.length = pointLength; _lights.hemi.length = hemiLength; // TODO (sam-g-steel) why aren't we using join _lights.hash = directionalLength + ',' + pointLength + ',' + spotLength + ',' + rectAreaLength + ',' + hemiLength + ',' + _lights.shadows.length; } // GL state setting this.setFaceCulling = function ( cullFace, frontFaceDirection ) { state.setCullFace( cullFace ); state.setFlipSided( frontFaceDirection === FrontFaceDirectionCW ); }; // Textures function allocTextureUnit() { var textureUnit = _usedTextureUnits; if ( textureUnit >= capabilities.maxTextures ) { console.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures ); } _usedTextureUnits += 1; return textureUnit; } this.allocTextureUnit = allocTextureUnit; // this.setTexture2D = setTexture2D; this.setTexture2D = ( function () { var warned = false; // backwards compatibility: peel texture.texture return function setTexture2D( texture, slot ) { if ( texture && texture.isWebGLRenderTarget ) { if ( ! warned ) { console.warn( "THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead." ); warned = true; } texture = texture.texture; } textures.setTexture2D( texture, slot ); }; }() ); this.setTexture = ( function () { var warned = false; return function setTexture( texture, slot ) { if ( ! warned ) { console.warn( "THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead." ); warned = true; } textures.setTexture2D( texture, slot ); }; }() ); this.setTextureCube = ( function () { var warned = false; return function setTextureCube( texture, slot ) { // backwards compatibility: peel texture.texture if ( texture && texture.isWebGLRenderTargetCube ) { if ( ! warned ) { console.warn( "THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead." ); warned = true; } texture = texture.texture; } // currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture // TODO: unify these code paths if ( ( texture && texture.isCubeTexture ) || ( Array.isArray( texture.image ) && texture.image.length === 6 ) ) { // CompressedTexture can have Array in image :/ // this function alone should take care of cube textures textures.setTextureCube( texture, slot ); } else { // assumed: texture property of THREE.WebGLRenderTargetCube textures.setTextureCubeDynamic( texture, slot ); } }; }() ); this.getRenderTarget = function () { return _currentRenderTarget; }; this.setRenderTarget = function ( renderTarget ) { _currentRenderTarget = renderTarget; if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) { textures.setupRenderTarget( renderTarget ); } var isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube ); var framebuffer; if ( renderTarget ) { var renderTargetProperties = properties.get( renderTarget ); if ( isCube ) { framebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ]; } else { framebuffer = renderTargetProperties.__webglFramebuffer; } _currentScissor.copy( renderTarget.scissor ); _currentScissorTest = renderTarget.scissorTest; _currentViewport.copy( renderTarget.viewport ); } else { framebuffer = null; _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ); _currentScissorTest = _scissorTest; _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ); } if ( _currentFramebuffer !== framebuffer ) { _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); _currentFramebuffer = framebuffer; } state.scissor( _currentScissor ); state.setScissorTest( _currentScissorTest ); state.viewport( _currentViewport ); if ( isCube ) { var textureProperties = properties.get( renderTarget.texture ); _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel ); } }; this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) { if ( ( renderTarget && renderTarget.isWebGLRenderTarget ) === false ) { console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' ); return; } var framebuffer = properties.get( renderTarget ).__webglFramebuffer; if ( framebuffer ) { var restore = false; if ( framebuffer !== _currentFramebuffer ) { _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); restore = true; } try { var texture = renderTarget.texture; var textureFormat = texture.format; var textureType = texture.type; if ( textureFormat !== RGBAFormat$1 && paramThreeToGL( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) { console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' ); return; } if ( textureType !== UnsignedByteType$1 && paramThreeToGL( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513) ! ( textureType === FloatType$1 && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox ! ( textureType === HalfFloatType$1 && extensions.get( 'EXT_color_buffer_half_float' ) ) ) { console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' ); return; } if ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) { // the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604) if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) { _gl.readPixels( x, y, width, height, paramThreeToGL( textureFormat ), paramThreeToGL( textureType ), buffer ); } } else { console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' ); } } finally { if ( restore ) { _gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer ); } } } }; // Map three.js constants to WebGL constants function paramThreeToGL( p ) { var extension; if ( p === RepeatWrapping$1 ) return _gl.REPEAT; if ( p === ClampToEdgeWrapping$1 ) return _gl.CLAMP_TO_EDGE; if ( p === MirroredRepeatWrapping$1 ) return _gl.MIRRORED_REPEAT; if ( p === NearestFilter$1 ) return _gl.NEAREST; if ( p === NearestMipMapNearestFilter$1 ) return _gl.NEAREST_MIPMAP_NEAREST; if ( p === NearestMipMapLinearFilter$1 ) return _gl.NEAREST_MIPMAP_LINEAR; if ( p === LinearFilter$1 ) return _gl.LINEAR; if ( p === LinearMipMapNearestFilter$1 ) return _gl.LINEAR_MIPMAP_NEAREST; if ( p === LinearMipMapLinearFilter$1 ) return _gl.LINEAR_MIPMAP_LINEAR; if ( p === UnsignedByteType$1 ) return _gl.UNSIGNED_BYTE; if ( p === UnsignedShort4444Type$1 ) return _gl.UNSIGNED_SHORT_4_4_4_4; if ( p === UnsignedShort5551Type$1 ) return _gl.UNSIGNED_SHORT_5_5_5_1; if ( p === UnsignedShort565Type$1 ) return _gl.UNSIGNED_SHORT_5_6_5; if ( p === ByteType$1 ) return _gl.BYTE; if ( p === ShortType$1 ) return _gl.SHORT; if ( p === UnsignedShortType$1 ) return _gl.UNSIGNED_SHORT; if ( p === IntType$1 ) return _gl.INT; if ( p === UnsignedIntType$1 ) return _gl.UNSIGNED_INT; if ( p === FloatType$1 ) return _gl.FLOAT; if ( p === HalfFloatType$1 ) { extension = extensions.get( 'OES_texture_half_float' ); if ( extension !== null ) return extension.HALF_FLOAT_OES; } if ( p === AlphaFormat$1 ) return _gl.ALPHA; if ( p === RGBFormat$1 ) return _gl.RGB; if ( p === RGBAFormat$1 ) return _gl.RGBA; if ( p === LuminanceFormat$1 ) return _gl.LUMINANCE; if ( p === LuminanceAlphaFormat$1 ) return _gl.LUMINANCE_ALPHA; if ( p === DepthFormat$1 ) return _gl.DEPTH_COMPONENT; if ( p === DepthStencilFormat$1 ) return _gl.DEPTH_STENCIL; if ( p === AddEquation$1 ) return _gl.FUNC_ADD; if ( p === SubtractEquation$1 ) return _gl.FUNC_SUBTRACT; if ( p === ReverseSubtractEquation$1 ) return _gl.FUNC_REVERSE_SUBTRACT; if ( p === ZeroFactor$1 ) return _gl.ZERO; if ( p === OneFactor$1 ) return _gl.ONE; if ( p === SrcColorFactor$1 ) return _gl.SRC_COLOR; if ( p === OneMinusSrcColorFactor$1 ) return _gl.ONE_MINUS_SRC_COLOR; if ( p === SrcAlphaFactor$1 ) return _gl.SRC_ALPHA; if ( p === OneMinusSrcAlphaFactor$1 ) return _gl.ONE_MINUS_SRC_ALPHA; if ( p === DstAlphaFactor$1 ) return _gl.DST_ALPHA; if ( p === OneMinusDstAlphaFactor$1 ) return _gl.ONE_MINUS_DST_ALPHA; if ( p === DstColorFactor$1 ) return _gl.DST_COLOR; if ( p === OneMinusDstColorFactor$1 ) return _gl.ONE_MINUS_DST_COLOR; if ( p === SrcAlphaSaturateFactor$1 ) return _gl.SRC_ALPHA_SATURATE; if ( p === RGB_S3TC_DXT1_Format$1 || p === RGBA_S3TC_DXT1_Format$1 || p === RGBA_S3TC_DXT3_Format$1 || p === RGBA_S3TC_DXT5_Format$1 ) { extension = extensions.get( 'WEBGL_compressed_texture_s3tc' ); if ( extension !== null ) { if ( p === RGB_S3TC_DXT1_Format$1 ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; if ( p === RGBA_S3TC_DXT1_Format$1 ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; if ( p === RGBA_S3TC_DXT3_Format$1 ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; if ( p === RGBA_S3TC_DXT5_Format$1 ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; } } if ( p === RGB_PVRTC_4BPPV1_Format$1 || p === RGB_PVRTC_2BPPV1_Format$1 || p === RGBA_PVRTC_4BPPV1_Format$1 || p === RGBA_PVRTC_2BPPV1_Format$1 ) { extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' ); if ( extension !== null ) { if ( p === RGB_PVRTC_4BPPV1_Format$1 ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; if ( p === RGB_PVRTC_2BPPV1_Format$1 ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; if ( p === RGBA_PVRTC_4BPPV1_Format$1 ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; if ( p === RGBA_PVRTC_2BPPV1_Format$1 ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; } } if ( p === RGB_ETC1_Format$1 ) { extension = extensions.get( 'WEBGL_compressed_texture_etc1' ); if ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL; } if ( p === MinEquation$1 || p === MaxEquation$1 ) { extension = extensions.get( 'EXT_blend_minmax' ); if ( extension !== null ) { if ( p === MinEquation$1 ) return extension.MIN_EXT; if ( p === MaxEquation$1 ) return extension.MAX_EXT; } } if ( p === UnsignedInt248Type$1 ) { extension = extensions.get( 'WEBGL_depth_texture' ); if ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL; } return 0; } } /** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ */ function FogExp2$1 ( color, density ) { this.name = ''; this.color = new Color$1( color ); this.density = ( density !== undefined ) ? density : 0.00025; } FogExp2$1.prototype.isFogExp2 = true; FogExp2$1.prototype.clone = function () { return new FogExp2$1( this.color.getHex(), this.density ); }; FogExp2$1.prototype.toJSON = function ( meta ) { return { type: 'FogExp2', color: this.color.getHex(), density: this.density }; }; /** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ */ function Fog$1 ( color, near, far ) { this.name = ''; this.color = new Color$1( color ); this.near = ( near !== undefined ) ? near : 1; this.far = ( far !== undefined ) ? far : 1000; } Fog$1.prototype.isFog = true; Fog$1.prototype.clone = function () { return new Fog$1( this.color.getHex(), this.near, this.far ); }; Fog$1.prototype.toJSON = function ( meta ) { return { type: 'Fog', color: this.color.getHex(), near: this.near, far: this.far }; }; /** * @author mrdoob / http://mrdoob.com/ */ function Scene$1 () { Object3D$1.call( this ); this.type = 'Scene'; this.background = null; this.fog = null; this.overrideMaterial = null; this.autoUpdate = true; // checked by the renderer } Scene$1.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: Scene$1, copy: function ( source, recursive ) { Object3D$1.prototype.copy.call( this, source, recursive ); if ( source.background !== null ) this.background = source.background.clone(); if ( source.fog !== null ) this.fog = source.fog.clone(); if ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone(); this.autoUpdate = source.autoUpdate; this.matrixAutoUpdate = source.matrixAutoUpdate; return this; }, toJSON: function ( meta ) { var data = Object3D$1.prototype.toJSON.call( this, meta ); if ( this.background !== null ) data.object.background = this.background.toJSON( meta ); if ( this.fog !== null ) data.object.fog = this.fog.toJSON(); return data; } } ); /** * @author mikael emtinger / http://gomo.se/ * @author alteredq / http://alteredqualia.com/ */ function LensFlare( texture, size, distance, blending, color ) { Object3D$1.call( this ); this.lensFlares = []; this.positionScreen = new Vector3$1(); this.customUpdateCallback = undefined; if ( texture !== undefined ) { this.add( texture, size, distance, blending, color ); } } LensFlare.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: LensFlare, isLensFlare: true, copy: function ( source ) { Object3D$1.prototype.copy.call( this, source ); this.positionScreen.copy( source.positionScreen ); this.customUpdateCallback = source.customUpdateCallback; for ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) { this.lensFlares.push( source.lensFlares[ i ] ); } return this; }, add: function ( texture, size, distance, blending, color, opacity ) { if ( size === undefined ) size = - 1; if ( distance === undefined ) distance = 0; if ( opacity === undefined ) opacity = 1; if ( color === undefined ) color = new Color$1( 0xffffff ); if ( blending === undefined ) blending = NormalBlending$1; distance = Math.min( distance, Math.max( 0, distance ) ); this.lensFlares.push( { texture: texture, // THREE.Texture size: size, // size in pixels (-1 = use texture.width) distance: distance, // distance (0-1) from light source (0=at light source) x: 0, y: 0, z: 0, // screen position (-1 => 1) z = 0 is in front z = 1 is back scale: 1, // scale rotation: 0, // rotation opacity: opacity, // opacity color: color, // color blending: blending // blending } ); }, /* * Update lens flares update positions on all flares based on the screen position * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way. */ updateLensFlares: function () { var f, fl = this.lensFlares.length; var flare; var vecX = - this.positionScreen.x * 2; var vecY = - this.positionScreen.y * 2; for ( f = 0; f < fl; f ++ ) { flare = this.lensFlares[ f ]; flare.x = this.positionScreen.x + vecX * flare.distance; flare.y = this.positionScreen.y + vecY * flare.distance; flare.wantedRotation = flare.x * Math.PI * 0.25; flare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25; } } } ); /** * @author alteredq / http://alteredqualia.com/ * * parameters = { * color: , * opacity: , * map: new THREE.Texture( ), * * uvOffset: new THREE.Vector2(), * uvScale: new THREE.Vector2() * } */ function SpriteMaterial$1( parameters ) { Material$1.call( this ); this.type = 'SpriteMaterial'; this.color = new Color$1( 0xffffff ); this.map = null; this.rotation = 0; this.fog = false; this.lights = false; this.setValues( parameters ); } SpriteMaterial$1.prototype = Object.create( Material$1.prototype ); SpriteMaterial$1.prototype.constructor = SpriteMaterial$1; SpriteMaterial$1.prototype.isSpriteMaterial = true; SpriteMaterial$1.prototype.copy = function ( source ) { Material$1.prototype.copy.call( this, source ); this.color.copy( source.color ); this.map = source.map; this.rotation = source.rotation; return this; }; /** * @author mikael emtinger / http://gomo.se/ * @author alteredq / http://alteredqualia.com/ */ function Sprite$1( material ) { Object3D$1.call( this ); this.type = 'Sprite'; this.material = ( material !== undefined ) ? material : new SpriteMaterial$1(); } Sprite$1.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: Sprite$1, isSprite: true, raycast: ( function () { var intersectPoint = new Vector3$1(); var worldPosition = new Vector3$1(); var worldScale = new Vector3$1(); return function raycast( raycaster, intersects ) { worldPosition.setFromMatrixPosition( this.matrixWorld ); raycaster.ray.closestPointToPoint( worldPosition, intersectPoint ); worldScale.setFromMatrixScale( this.matrixWorld ); var guessSizeSq = worldScale.x * worldScale.y / 4; if ( worldPosition.distanceToSquared( intersectPoint ) > guessSizeSq ) return; var distance = raycaster.ray.origin.distanceTo( intersectPoint ); if ( distance < raycaster.near || distance > raycaster.far ) return; intersects.push( { distance: distance, point: intersectPoint.clone(), face: null, object: this } ); }; }() ), clone: function () { return new this.constructor( this.material ).copy( this ); } } ); /** * @author mikael emtinger / http://gomo.se/ * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ */ function LOD$1() { Object3D$1.call( this ); this.type = 'LOD'; Object.defineProperties( this, { levels: { enumerable: true, value: [] } } ); } LOD$1.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: LOD$1, copy: function ( source ) { Object3D$1.prototype.copy.call( this, source, false ); var levels = source.levels; for ( var i = 0, l = levels.length; i < l; i ++ ) { var level = levels[ i ]; this.addLevel( level.object.clone(), level.distance ); } return this; }, addLevel: function ( object, distance ) { if ( distance === undefined ) distance = 0; distance = Math.abs( distance ); var levels = this.levels; for ( var l = 0; l < levels.length; l ++ ) { if ( distance < levels[ l ].distance ) { break; } } levels.splice( l, 0, { distance: distance, object: object } ); this.add( object ); }, getObjectForDistance: function ( distance ) { var levels = this.levels; for ( var i = 1, l = levels.length; i < l; i ++ ) { if ( distance < levels[ i ].distance ) { break; } } return levels[ i - 1 ].object; }, raycast: ( function () { var matrixPosition = new Vector3$1(); return function raycast( raycaster, intersects ) { matrixPosition.setFromMatrixPosition( this.matrixWorld ); var distance = raycaster.ray.origin.distanceTo( matrixPosition ); this.getObjectForDistance( distance ).raycast( raycaster, intersects ); }; }() ), update: function () { var v1 = new Vector3$1(); var v2 = new Vector3$1(); return function update( camera ) { var levels = this.levels; if ( levels.length > 1 ) { v1.setFromMatrixPosition( camera.matrixWorld ); v2.setFromMatrixPosition( this.matrixWorld ); var distance = v1.distanceTo( v2 ); levels[ 0 ].object.visible = true; for ( var i = 1, l = levels.length; i < l; i ++ ) { if ( distance >= levels[ i ].distance ) { levels[ i - 1 ].object.visible = false; levels[ i ].object.visible = true; } else { break; } } for ( ; i < l; i ++ ) { levels[ i ].object.visible = false; } } }; }(), toJSON: function ( meta ) { var data = Object3D$1.prototype.toJSON.call( this, meta ); data.object.levels = []; var levels = this.levels; for ( var i = 0, l = levels.length; i < l; i ++ ) { var level = levels[ i ]; data.object.levels.push( { object: level.object.uuid, distance: level.distance } ); } return data; } } ); /** * @author mikael emtinger / http://gomo.se/ * @author alteredq / http://alteredqualia.com/ * @author michael guerrero / http://realitymeltdown.com * @author ikerr / http://verold.com */ function Skeleton$1( bones, boneInverses ) { // copy the bone array bones = bones || []; this.bones = bones.slice( 0 ); this.boneMatrices = new Float32Array( this.bones.length * 16 ); // use the supplied bone inverses or calculate the inverses if ( boneInverses === undefined ) { this.calculateInverses(); } else { if ( this.bones.length === boneInverses.length ) { this.boneInverses = boneInverses.slice( 0 ); } else { console.warn( 'THREE.Skeleton boneInverses is the wrong length.' ); this.boneInverses = []; for ( var i = 0, il = this.bones.length; i < il; i ++ ) { this.boneInverses.push( new Matrix4$1() ); } } } } Object.assign( Skeleton$1.prototype, { calculateInverses: function () { this.boneInverses = []; for ( var i = 0, il = this.bones.length; i < il; i ++ ) { var inverse = new Matrix4$1(); if ( this.bones[ i ] ) { inverse.getInverse( this.bones[ i ].matrixWorld ); } this.boneInverses.push( inverse ); } }, pose: function () { var bone, i, il; // recover the bind-time world matrices for ( i = 0, il = this.bones.length; i < il; i ++ ) { bone = this.bones[ i ]; if ( bone ) { bone.matrixWorld.getInverse( this.boneInverses[ i ] ); } } // compute the local matrices, positions, rotations and scales for ( i = 0, il = this.bones.length; i < il; i ++ ) { bone = this.bones[ i ]; if ( bone ) { if ( bone.parent && bone.parent.isBone ) { bone.matrix.getInverse( bone.parent.matrixWorld ); bone.matrix.multiply( bone.matrixWorld ); } else { bone.matrix.copy( bone.matrixWorld ); } bone.matrix.decompose( bone.position, bone.quaternion, bone.scale ); } } }, update: ( function () { var offsetMatrix = new Matrix4$1(); var identityMatrix = new Matrix4$1(); return function update() { var bones = this.bones; var boneInverses = this.boneInverses; var boneMatrices = this.boneMatrices; var boneTexture = this.boneTexture; // flatten bone matrices to array for ( var i = 0, il = bones.length; i < il; i ++ ) { // compute the offset between the current and the original transform var matrix = bones[ i ] ? bones[ i ].matrixWorld : identityMatrix; offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] ); offsetMatrix.toArray( boneMatrices, i * 16 ); } if ( boneTexture !== undefined ) { boneTexture.needsUpdate = true; } }; } )(), clone: function () { return new Skeleton$1( this.bones, this.boneInverses ); } } ); /** * @author mikael emtinger / http://gomo.se/ * @author alteredq / http://alteredqualia.com/ * @author ikerr / http://verold.com */ function Bone$1() { Object3D$1.call( this ); this.type = 'Bone'; } Bone$1.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: Bone$1, isBone: true } ); /** * @author mikael emtinger / http://gomo.se/ * @author alteredq / http://alteredqualia.com/ * @author ikerr / http://verold.com */ function SkinnedMesh$1( geometry, material ) { Mesh$1.call( this, geometry, material ); this.type = 'SkinnedMesh'; this.bindMode = 'attached'; this.bindMatrix = new Matrix4$1(); this.bindMatrixInverse = new Matrix4$1(); var bones = this.initBones(); var skeleton = new Skeleton$1( bones ); this.bind( skeleton, this.matrixWorld ); this.normalizeSkinWeights(); } SkinnedMesh$1.prototype = Object.assign( Object.create( Mesh$1.prototype ), { constructor: SkinnedMesh$1, isSkinnedMesh: true, initBones: function () { var bones = [], bone, gbone; var i, il; if ( this.geometry && this.geometry.bones !== undefined ) { // first, create array of 'Bone' objects from geometry data for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) { gbone = this.geometry.bones[ i ]; // create new 'Bone' object bone = new Bone$1(); bones.push( bone ); // apply values bone.name = gbone.name; bone.position.fromArray( gbone.pos ); bone.quaternion.fromArray( gbone.rotq ); if ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl ); } // second, create bone hierarchy for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) { gbone = this.geometry.bones[ i ]; if ( ( gbone.parent !== - 1 ) && ( gbone.parent !== null ) && ( bones[ gbone.parent ] !== undefined ) ) { // subsequent bones in the hierarchy bones[ gbone.parent ].add( bones[ i ] ); } else { // topmost bone, immediate child of the skinned mesh this.add( bones[ i ] ); } } } // now the bones are part of the scene graph and children of the skinned mesh. // let's update the corresponding matrices this.updateMatrixWorld( true ); return bones; }, bind: function ( skeleton, bindMatrix ) { this.skeleton = skeleton; if ( bindMatrix === undefined ) { this.updateMatrixWorld( true ); this.skeleton.calculateInverses(); bindMatrix = this.matrixWorld; } this.bindMatrix.copy( bindMatrix ); this.bindMatrixInverse.getInverse( bindMatrix ); }, pose: function () { this.skeleton.pose(); }, normalizeSkinWeights: function () { var scale, i; if ( this.geometry && this.geometry.isGeometry ) { for ( i = 0; i < this.geometry.skinWeights.length; i ++ ) { var sw = this.geometry.skinWeights[ i ]; scale = 1.0 / sw.lengthManhattan(); if ( scale !== Infinity ) { sw.multiplyScalar( scale ); } else { sw.set( 1, 0, 0, 0 ); // do something reasonable } } } else if ( this.geometry && this.geometry.isBufferGeometry ) { var vec = new Vector4$1(); var skinWeight = this.geometry.attributes.skinWeight; for ( i = 0; i < skinWeight.count; i ++ ) { vec.x = skinWeight.getX( i ); vec.y = skinWeight.getY( i ); vec.z = skinWeight.getZ( i ); vec.w = skinWeight.getW( i ); scale = 1.0 / vec.lengthManhattan(); if ( scale !== Infinity ) { vec.multiplyScalar( scale ); } else { vec.set( 1, 0, 0, 0 ); // do something reasonable } skinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w ); } } }, updateMatrixWorld: function ( force ) { Mesh$1.prototype.updateMatrixWorld.call( this, force ); if ( this.bindMode === 'attached' ) { this.bindMatrixInverse.getInverse( this.matrixWorld ); } else if ( this.bindMode === 'detached' ) { this.bindMatrixInverse.getInverse( this.bindMatrix ); } else { console.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode ); } }, clone: function () { return new this.constructor( this.geometry, this.material ).copy( this ); } } ); /** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ * * parameters = { * color: , * opacity: , * * linewidth: , * linecap: "round", * linejoin: "round" * } */ function LineBasicMaterial$1( parameters ) { Material$1.call( this ); this.type = 'LineBasicMaterial'; this.color = new Color$1( 0xffffff ); this.linewidth = 1; this.linecap = 'round'; this.linejoin = 'round'; this.lights = false; this.setValues( parameters ); } LineBasicMaterial$1.prototype = Object.create( Material$1.prototype ); LineBasicMaterial$1.prototype.constructor = LineBasicMaterial$1; LineBasicMaterial$1.prototype.isLineBasicMaterial = true; LineBasicMaterial$1.prototype.copy = function ( source ) { Material$1.prototype.copy.call( this, source ); this.color.copy( source.color ); this.linewidth = source.linewidth; this.linecap = source.linecap; this.linejoin = source.linejoin; return this; }; /** * @author mrdoob / http://mrdoob.com/ */ function Line$2( geometry, material, mode ) { if ( mode === 1 ) { console.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' ); return new LineSegments$1( geometry, material ); } Object3D$1.call( this ); this.type = 'Line'; this.geometry = geometry !== undefined ? geometry : new BufferGeometry$1(); this.material = material !== undefined ? material : new LineBasicMaterial$1( { color: Math.random() * 0xffffff } ); } Line$2.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: Line$2, isLine: true, raycast: ( function () { var inverseMatrix = new Matrix4$1(); var ray = new Ray$1(); var sphere = new Sphere$2(); return function raycast( raycaster, intersects ) { var precision = raycaster.linePrecision; var precisionSq = precision * precision; var geometry = this.geometry; var matrixWorld = this.matrixWorld; // Checking boundingSphere distance to ray if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); sphere.copy( geometry.boundingSphere ); sphere.applyMatrix4( matrixWorld ); if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; // inverseMatrix.getInverse( matrixWorld ); ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); var vStart = new Vector3$1(); var vEnd = new Vector3$1(); var interSegment = new Vector3$1(); var interRay = new Vector3$1(); var step = (this && this.isLineSegments) ? 2 : 1; if ( geometry.isBufferGeometry ) { var index = geometry.index; var attributes = geometry.attributes; var positions = attributes.position.array; if ( index !== null ) { var indices = index.array; for ( var i = 0, l = indices.length - 1; i < l; i += step ) { var a = indices[ i ]; var b = indices[ i + 1 ]; vStart.fromArray( positions, a * 3 ); vEnd.fromArray( positions, b * 3 ); var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); if ( distSq > precisionSq ) continue; interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation var distance = raycaster.ray.origin.distanceTo( interRay ); if ( distance < raycaster.near || distance > raycaster.far ) continue; intersects.push( { distance: distance, // What do we want? intersection point on the ray or on the segment?? // point: raycaster.ray.at( distance ), point: interSegment.clone().applyMatrix4( this.matrixWorld ), index: i, face: null, faceIndex: null, object: this } ); } } else { for ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) { vStart.fromArray( positions, 3 * i ); vEnd.fromArray( positions, 3 * i + 3 ); var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); if ( distSq > precisionSq ) continue; interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation var distance = raycaster.ray.origin.distanceTo( interRay ); if ( distance < raycaster.near || distance > raycaster.far ) continue; intersects.push( { distance: distance, // What do we want? intersection point on the ray or on the segment?? // point: raycaster.ray.at( distance ), point: interSegment.clone().applyMatrix4( this.matrixWorld ), index: i, face: null, faceIndex: null, object: this } ); } } } else if ( geometry.isGeometry ) { var vertices = geometry.vertices; var nbVertices = vertices.length; for ( var i = 0; i < nbVertices - 1; i += step ) { var distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment ); if ( distSq > precisionSq ) continue; interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation var distance = raycaster.ray.origin.distanceTo( interRay ); if ( distance < raycaster.near || distance > raycaster.far ) continue; intersects.push( { distance: distance, // What do we want? intersection point on the ray or on the segment?? // point: raycaster.ray.at( distance ), point: interSegment.clone().applyMatrix4( this.matrixWorld ), index: i, face: null, faceIndex: null, object: this } ); } } }; }() ), clone: function () { return new this.constructor( this.geometry, this.material ).copy( this ); } } ); /** * @author mrdoob / http://mrdoob.com/ */ function LineSegments$1( geometry, material ) { Line$2.call( this, geometry, material ); this.type = 'LineSegments'; } LineSegments$1.prototype = Object.assign( Object.create( Line$2.prototype ), { constructor: LineSegments$1, isLineSegments: true } ); /** * @author mgreter / http://github.com/mgreter */ function LineLoop$1( geometry, material ) { Line$2.call( this, geometry, material ); this.type = 'LineLoop'; } LineLoop$1.prototype = Object.assign( Object.create( Line$2.prototype ), { constructor: LineLoop$1, isLineLoop: true, } ); /** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ * * parameters = { * color: , * opacity: , * map: new THREE.Texture( ), * * size: , * sizeAttenuation: * } */ function PointsMaterial$1( parameters ) { Material$1.call( this ); this.type = 'PointsMaterial'; this.color = new Color$1( 0xffffff ); this.map = null; this.size = 1; this.sizeAttenuation = true; this.lights = false; this.setValues( parameters ); } PointsMaterial$1.prototype = Object.create( Material$1.prototype ); PointsMaterial$1.prototype.constructor = PointsMaterial$1; PointsMaterial$1.prototype.isPointsMaterial = true; PointsMaterial$1.prototype.copy = function ( source ) { Material$1.prototype.copy.call( this, source ); this.color.copy( source.color ); this.map = source.map; this.size = source.size; this.sizeAttenuation = source.sizeAttenuation; return this; }; /** * @author alteredq / http://alteredqualia.com/ */ function Points$1( geometry, material ) { Object3D$1.call( this ); this.type = 'Points'; this.geometry = geometry !== undefined ? geometry : new BufferGeometry$1(); this.material = material !== undefined ? material : new PointsMaterial$1( { color: Math.random() * 0xffffff } ); } Points$1.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: Points$1, isPoints: true, raycast: ( function () { var inverseMatrix = new Matrix4$1(); var ray = new Ray$1(); var sphere = new Sphere$2(); return function raycast( raycaster, intersects ) { var object = this; var geometry = this.geometry; var matrixWorld = this.matrixWorld; var threshold = raycaster.params.Points.threshold; // Checking boundingSphere distance to ray if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); sphere.copy( geometry.boundingSphere ); sphere.applyMatrix4( matrixWorld ); sphere.radius += threshold; if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; // inverseMatrix.getInverse( matrixWorld ); ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); var localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); var localThresholdSq = localThreshold * localThreshold; var position = new Vector3$1(); function testPoint( point, index ) { var rayPointDistanceSq = ray.distanceSqToPoint( point ); if ( rayPointDistanceSq < localThresholdSq ) { var intersectPoint = ray.closestPointToPoint( point ); intersectPoint.applyMatrix4( matrixWorld ); var distance = raycaster.ray.origin.distanceTo( intersectPoint ); if ( distance < raycaster.near || distance > raycaster.far ) return; intersects.push( { distance: distance, distanceToRay: Math.sqrt( rayPointDistanceSq ), point: intersectPoint.clone(), index: index, face: null, object: object } ); } } if ( geometry.isBufferGeometry ) { var index = geometry.index; var attributes = geometry.attributes; var positions = attributes.position.array; if ( index !== null ) { var indices = index.array; for ( var i = 0, il = indices.length; i < il; i ++ ) { var a = indices[ i ]; position.fromArray( positions, a * 3 ); testPoint( position, a ); } } else { for ( var i = 0, l = positions.length / 3; i < l; i ++ ) { position.fromArray( positions, i * 3 ); testPoint( position, i ); } } } else { var vertices = geometry.vertices; for ( var i = 0, l = vertices.length; i < l; i ++ ) { testPoint( vertices[ i ], i ); } } }; }() ), clone: function () { return new this.constructor( this.geometry, this.material ).copy( this ); } } ); /** * @author mrdoob / http://mrdoob.com/ */ function Group$2() { Object3D$1.call( this ); this.type = 'Group'; } Group$2.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: Group$2 } ); /** * @author mrdoob / http://mrdoob.com/ */ function VideoTexture$1( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { Texture$1.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); this.generateMipmaps = false; var scope = this; function update() { requestAnimationFrame( update ); if ( video.readyState >= video.HAVE_CURRENT_DATA ) { scope.needsUpdate = true; } } update(); } VideoTexture$1.prototype = Object.create( Texture$1.prototype ); VideoTexture$1.prototype.constructor = VideoTexture$1; /** * @author alteredq / http://alteredqualia.com/ */ function CompressedTexture$1( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { Texture$1.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); this.image = { width: width, height: height }; this.mipmaps = mipmaps; // no flipping for cube textures // (also flipping doesn't work for compressed textures ) this.flipY = false; // can't generate mipmaps for compressed textures // mips must be embedded in DDS files this.generateMipmaps = false; } CompressedTexture$1.prototype = Object.create( Texture$1.prototype ); CompressedTexture$1.prototype.constructor = CompressedTexture$1; CompressedTexture$1.prototype.isCompressedTexture = true; /** * @author mrdoob / http://mrdoob.com/ */ function CanvasTexture$1( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { Texture$1.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); this.needsUpdate = true; } CanvasTexture$1.prototype = Object.create( Texture$1.prototype ); CanvasTexture$1.prototype.constructor = CanvasTexture$1; /** * @author Matt DesLauriers / @mattdesl * @author atix / arthursilber.de */ function DepthTexture$1( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) { format = format !== undefined ? format : DepthFormat$1; if ( format !== DepthFormat$1 && format !== DepthStencilFormat$1 ) { throw new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' ) } if ( type === undefined && format === DepthFormat$1 ) type = UnsignedShortType$1; if ( type === undefined && format === DepthStencilFormat$1 ) type = UnsignedInt248Type$1; Texture$1.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); this.image = { width: width, height: height }; this.magFilter = magFilter !== undefined ? magFilter : NearestFilter$1; this.minFilter = minFilter !== undefined ? minFilter : NearestFilter$1; this.flipY = false; this.generateMipmaps = false; } DepthTexture$1.prototype = Object.create( Texture$1.prototype ); DepthTexture$1.prototype.constructor = DepthTexture$1; DepthTexture$1.prototype.isDepthTexture = true; /** * @author mrdoob / http://mrdoob.com/ * @author Mugen87 / https://github.com/Mugen87 */ function WireframeGeometry$1( geometry ) { BufferGeometry$1.call( this ); this.type = 'WireframeGeometry'; // buffer var vertices = []; // helper variables var i, j, l, o, ol; var edge = [ 0, 0 ], edges = {}, e, edge1, edge2; var key, keys = [ 'a', 'b', 'c' ]; var vertex; // different logic for Geometry and BufferGeometry if ( geometry && geometry.isGeometry ) { // create a data structure that contains all edges without duplicates var faces = geometry.faces; for ( i = 0, l = faces.length; i < l; i ++ ) { var face = faces[ i ]; for ( j = 0; j < 3; j ++ ) { edge1 = face[ keys[ j ] ]; edge2 = face[ keys[ ( j + 1 ) % 3 ] ]; edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates edge[ 1 ] = Math.max( edge1, edge2 ); key = edge[ 0 ] + ',' + edge[ 1 ]; if ( edges[ key ] === undefined ) { edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; } } } // generate vertices for ( key in edges ) { e = edges[ key ]; vertex = geometry.vertices[ e.index1 ]; vertices.push( vertex.x, vertex.y, vertex.z ); vertex = geometry.vertices[ e.index2 ]; vertices.push( vertex.x, vertex.y, vertex.z ); } } else if ( geometry && geometry.isBufferGeometry ) { var position, indices, groups; var group, start, count; var index1, index2; vertex = new Vector3$1(); if ( geometry.index !== null ) { // indexed BufferGeometry position = geometry.attributes.position; indices = geometry.index; groups = geometry.groups; if ( groups.length === 0 ) { groups = [ { start: 0, count: indices.count, materialIndex: 0 } ]; } // create a data structure that contains all eges without duplicates for ( o = 0, ol = groups.length; o < ol; ++ o ) { group = groups[ o ]; start = group.start; count = group.count; for ( i = start, l = ( start + count ); i < l; i += 3 ) { for ( j = 0; j < 3; j ++ ) { edge1 = indices.getX( i + j ); edge2 = indices.getX( i + ( j + 1 ) % 3 ); edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates edge[ 1 ] = Math.max( edge1, edge2 ); key = edge[ 0 ] + ',' + edge[ 1 ]; if ( edges[ key ] === undefined ) { edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; } } } } // generate vertices for ( key in edges ) { e = edges[ key ]; vertex.fromBufferAttribute( position, e.index1 ); vertices.push( vertex.x, vertex.y, vertex.z ); vertex.fromBufferAttribute( position, e.index2 ); vertices.push( vertex.x, vertex.y, vertex.z ); } } else { // non-indexed BufferGeometry position = geometry.attributes.position; for ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) { for ( j = 0; j < 3; j ++ ) { // three edges per triangle, an edge is represented as (index1, index2) // e.g. the first triangle has the following edges: (0,1),(1,2),(2,0) index1 = 3 * i + j; vertex.fromBufferAttribute( position, index1 ); vertices.push( vertex.x, vertex.y, vertex.z ); index2 = 3 * i + ( ( j + 1 ) % 3 ); vertex.fromBufferAttribute( position, index2 ); vertices.push( vertex.x, vertex.y, vertex.z ); } } } } // build geometry this.addAttribute( 'position', new Float32BufferAttribute$1( vertices, 3 ) ); } WireframeGeometry$1.prototype = Object.create( BufferGeometry$1.prototype ); WireframeGeometry$1.prototype.constructor = WireframeGeometry$1; /** * @author zz85 / https://github.com/zz85 * @author Mugen87 / https://github.com/Mugen87 * * Parametric Surfaces Geometry * based on the brilliant article by @prideout http://prideout.net/blog/?p=44 */ // ParametricGeometry function ParametricGeometry$1( func, slices, stacks ) { Geometry$1.call( this ); this.type = 'ParametricGeometry'; this.parameters = { func: func, slices: slices, stacks: stacks }; this.fromBufferGeometry( new ParametricBufferGeometry$1( func, slices, stacks ) ); this.mergeVertices(); } ParametricGeometry$1.prototype = Object.create( Geometry$1.prototype ); ParametricGeometry$1.prototype.constructor = ParametricGeometry$1; // ParametricBufferGeometry function ParametricBufferGeometry$1( func, slices, stacks ) { BufferGeometry$1.call( this ); this.type = 'ParametricBufferGeometry'; this.parameters = { func: func, slices: slices, stacks: stacks }; // buffers var indices = []; var vertices = []; var normals = []; var uvs = []; var EPS = 0.00001; var normal = new Vector3$1(); var p0 = new Vector3$1(), p1 = new Vector3$1(); var pu = new Vector3$1(), pv = new Vector3$1(); var i, j; // generate vertices, normals and uvs var sliceCount = slices + 1; for ( i = 0; i <= stacks; i ++ ) { var v = i / stacks; for ( j = 0; j <= slices; j ++ ) { var u = j / slices; // vertex p0 = func( u, v, p0 ); vertices.push( p0.x, p0.y, p0.z ); // normal // approximate tangent vectors via finite differences if ( u - EPS >= 0 ) { p1 = func( u - EPS, v, p1 ); pu.subVectors( p0, p1 ); } else { p1 = func( u + EPS, v, p1 ); pu.subVectors( p1, p0 ); } if ( v - EPS >= 0 ) { p1 = func( u, v - EPS, p1 ); pv.subVectors( p0, p1 ); } else { p1 = func( u, v + EPS, p1 ); pv.subVectors( p1, p0 ); } // cross product of tangent vectors returns surface normal normal.crossVectors( pu, pv ).normalize(); normals.push( normal.x, normal.y, normal.z ); // uv uvs.push( u, v ); } } // generate indices for ( i = 0; i < stacks; i ++ ) { for ( j = 0; j < slices; j ++ ) { var a = i * sliceCount + j; var b = i * sliceCount + j + 1; var c = ( i + 1 ) * sliceCount + j + 1; var d = ( i + 1 ) * sliceCount + j; // faces one and two indices.push( a, b, d ); indices.push( b, c, d ); } } // build geometry this.setIndex( indices ); this.addAttribute( 'position', new Float32BufferAttribute$1( vertices, 3 ) ); this.addAttribute( 'normal', new Float32BufferAttribute$1( normals, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( uvs, 2 ) ); } ParametricBufferGeometry$1.prototype = Object.create( BufferGeometry$1.prototype ); ParametricBufferGeometry$1.prototype.constructor = ParametricBufferGeometry$1; /** * @author clockworkgeek / https://github.com/clockworkgeek * @author timothypratley / https://github.com/timothypratley * @author WestLangley / http://github.com/WestLangley * @author Mugen87 / https://github.com/Mugen87 */ // PolyhedronGeometry function PolyhedronGeometry$1( vertices, indices, radius, detail ) { Geometry$1.call( this ); this.type = 'PolyhedronGeometry'; this.parameters = { vertices: vertices, indices: indices, radius: radius, detail: detail }; this.fromBufferGeometry( new PolyhedronBufferGeometry$1( vertices, indices, radius, detail ) ); this.mergeVertices(); } PolyhedronGeometry$1.prototype = Object.create( Geometry$1.prototype ); PolyhedronGeometry$1.prototype.constructor = PolyhedronGeometry$1; // PolyhedronBufferGeometry function PolyhedronBufferGeometry$1( vertices, indices, radius, detail ) { BufferGeometry$1.call( this ); this.type = 'PolyhedronBufferGeometry'; this.parameters = { vertices: vertices, indices: indices, radius: radius, detail: detail }; radius = radius || 1; detail = detail || 0; // default buffer data var vertexBuffer = []; var uvBuffer = []; // the subdivision creates the vertex buffer data subdivide( detail ); // all vertices should lie on a conceptual sphere with a given radius appplyRadius( radius ); // finally, create the uv data generateUVs(); // build non-indexed geometry this.addAttribute( 'position', new Float32BufferAttribute$1( vertexBuffer, 3 ) ); this.addAttribute( 'normal', new Float32BufferAttribute$1( vertexBuffer.slice(), 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( uvBuffer, 2 ) ); this.normalizeNormals(); // helper functions function subdivide( detail ) { var a = new Vector3$1(); var b = new Vector3$1(); var c = new Vector3$1(); // iterate over all faces and apply a subdivison with the given detail value for ( var i = 0; i < indices.length; i += 3 ) { // get the vertices of the face getVertexByIndex( indices[ i + 0 ], a ); getVertexByIndex( indices[ i + 1 ], b ); getVertexByIndex( indices[ i + 2 ], c ); // perform subdivision subdivideFace( a, b, c, detail ); } } function subdivideFace( a, b, c, detail ) { var cols = Math.pow( 2, detail ); // we use this multidimensional array as a data structure for creating the subdivision var v = []; var i, j; // construct all of the vertices for this subdivision for ( i = 0; i <= cols; i ++ ) { v[ i ] = []; var aj = a.clone().lerp( c, i / cols ); var bj = b.clone().lerp( c, i / cols ); var rows = cols - i; for ( j = 0; j <= rows; j ++ ) { if ( j === 0 && i === cols ) { v[ i ][ j ] = aj; } else { v[ i ][ j ] = aj.clone().lerp( bj, j / rows ); } } } // construct all of the faces for ( i = 0; i < cols; i ++ ) { for ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) { var k = Math.floor( j / 2 ); if ( j % 2 === 0 ) { pushVertex( v[ i ][ k + 1 ] ); pushVertex( v[ i + 1 ][ k ] ); pushVertex( v[ i ][ k ] ); } else { pushVertex( v[ i ][ k + 1 ] ); pushVertex( v[ i + 1 ][ k + 1 ] ); pushVertex( v[ i + 1 ][ k ] ); } } } } function appplyRadius( radius ) { var vertex = new Vector3$1(); // iterate over the entire buffer and apply the radius to each vertex for ( var i = 0; i < vertexBuffer.length; i += 3 ) { vertex.x = vertexBuffer[ i + 0 ]; vertex.y = vertexBuffer[ i + 1 ]; vertex.z = vertexBuffer[ i + 2 ]; vertex.normalize().multiplyScalar( radius ); vertexBuffer[ i + 0 ] = vertex.x; vertexBuffer[ i + 1 ] = vertex.y; vertexBuffer[ i + 2 ] = vertex.z; } } function generateUVs() { var vertex = new Vector3$1(); for ( var i = 0; i < vertexBuffer.length; i += 3 ) { vertex.x = vertexBuffer[ i + 0 ]; vertex.y = vertexBuffer[ i + 1 ]; vertex.z = vertexBuffer[ i + 2 ]; var u = azimuth( vertex ) / 2 / Math.PI + 0.5; var v = inclination( vertex ) / Math.PI + 0.5; uvBuffer.push( u, 1 - v ); } correctUVs(); correctSeam(); } function correctSeam() { // handle case when face straddles the seam, see #3269 for ( var i = 0; i < uvBuffer.length; i += 6 ) { // uv data of a single face var x0 = uvBuffer[ i + 0 ]; var x1 = uvBuffer[ i + 2 ]; var x2 = uvBuffer[ i + 4 ]; var max = Math.max( x0, x1, x2 ); var min = Math.min( x0, x1, x2 ); // 0.9 is somewhat arbitrary if ( max > 0.9 && min < 0.1 ) { if ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1; if ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1; if ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1; } } } function pushVertex( vertex ) { vertexBuffer.push( vertex.x, vertex.y, vertex.z ); } function getVertexByIndex( index, vertex ) { var stride = index * 3; vertex.x = vertices[ stride + 0 ]; vertex.y = vertices[ stride + 1 ]; vertex.z = vertices[ stride + 2 ]; } function correctUVs() { var a = new Vector3$1(); var b = new Vector3$1(); var c = new Vector3$1(); var centroid = new Vector3$1(); var uvA = new Vector2$1(); var uvB = new Vector2$1(); var uvC = new Vector2$1(); for ( var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) { a.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] ); b.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] ); c.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] ); uvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] ); uvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] ); uvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] ); centroid.copy( a ).add( b ).add( c ).divideScalar( 3 ); var azi = azimuth( centroid ); correctUV( uvA, j + 0, a, azi ); correctUV( uvB, j + 2, b, azi ); correctUV( uvC, j + 4, c, azi ); } } function correctUV( uv, stride, vector, azimuth ) { if ( ( azimuth < 0 ) && ( uv.x === 1 ) ) { uvBuffer[ stride ] = uv.x - 1; } if ( ( vector.x === 0 ) && ( vector.z === 0 ) ) { uvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5; } } // Angle around the Y axis, counter-clockwise when looking from above. function azimuth( vector ) { return Math.atan2( vector.z, - vector.x ); } // Angle above the XZ plane. function inclination( vector ) { return Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) ); } } PolyhedronBufferGeometry$1.prototype = Object.create( BufferGeometry$1.prototype ); PolyhedronBufferGeometry$1.prototype.constructor = PolyhedronBufferGeometry$1; /** * @author timothypratley / https://github.com/timothypratley * @author Mugen87 / https://github.com/Mugen87 */ // TetrahedronGeometry function TetrahedronGeometry$1( radius, detail ) { Geometry$1.call( this ); this.type = 'TetrahedronGeometry'; this.parameters = { radius: radius, detail: detail }; this.fromBufferGeometry( new TetrahedronBufferGeometry$1( radius, detail ) ); this.mergeVertices(); } TetrahedronGeometry$1.prototype = Object.create( Geometry$1.prototype ); TetrahedronGeometry$1.prototype.constructor = TetrahedronGeometry$1; // TetrahedronBufferGeometry function TetrahedronBufferGeometry$1( radius, detail ) { var vertices = [ 1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1 ]; var indices = [ 2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1 ]; PolyhedronBufferGeometry$1.call( this, vertices, indices, radius, detail ); this.type = 'TetrahedronBufferGeometry'; this.parameters = { radius: radius, detail: detail }; } TetrahedronBufferGeometry$1.prototype = Object.create( PolyhedronBufferGeometry$1.prototype ); TetrahedronBufferGeometry$1.prototype.constructor = TetrahedronBufferGeometry$1; /** * @author timothypratley / https://github.com/timothypratley * @author Mugen87 / https://github.com/Mugen87 */ // OctahedronGeometry function OctahedronGeometry$1( radius, detail ) { Geometry$1.call( this ); this.type = 'OctahedronGeometry'; this.parameters = { radius: radius, detail: detail }; this.fromBufferGeometry( new OctahedronBufferGeometry$1( radius, detail ) ); this.mergeVertices(); } OctahedronGeometry$1.prototype = Object.create( Geometry$1.prototype ); OctahedronGeometry$1.prototype.constructor = OctahedronGeometry$1; // OctahedronBufferGeometry function OctahedronBufferGeometry$1( radius, detail ) { var vertices = [ 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1 ]; var indices = [ 0, 2, 4, 0, 4, 3, 0, 3, 5, 0, 5, 2, 1, 2, 5, 1, 5, 3, 1, 3, 4, 1, 4, 2 ]; PolyhedronBufferGeometry$1.call( this, vertices, indices, radius, detail ); this.type = 'OctahedronBufferGeometry'; this.parameters = { radius: radius, detail: detail }; } OctahedronBufferGeometry$1.prototype = Object.create( PolyhedronBufferGeometry$1.prototype ); OctahedronBufferGeometry$1.prototype.constructor = OctahedronBufferGeometry$1; /** * @author timothypratley / https://github.com/timothypratley * @author Mugen87 / https://github.com/Mugen87 */ // IcosahedronGeometry function IcosahedronGeometry$1( radius, detail ) { Geometry$1.call( this ); this.type = 'IcosahedronGeometry'; this.parameters = { radius: radius, detail: detail }; this.fromBufferGeometry( new IcosahedronBufferGeometry$1( radius, detail ) ); this.mergeVertices(); } IcosahedronGeometry$1.prototype = Object.create( Geometry$1.prototype ); IcosahedronGeometry$1.prototype.constructor = IcosahedronGeometry$1; // IcosahedronBufferGeometry function IcosahedronBufferGeometry$1( radius, detail ) { var t = ( 1 + Math.sqrt( 5 ) ) / 2; var vertices = [ - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0, 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1 ]; var indices = [ 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11, 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8, 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9, 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1 ]; PolyhedronBufferGeometry$1.call( this, vertices, indices, radius, detail ); this.type = 'IcosahedronBufferGeometry'; this.parameters = { radius: radius, detail: detail }; } IcosahedronBufferGeometry$1.prototype = Object.create( PolyhedronBufferGeometry$1.prototype ); IcosahedronBufferGeometry$1.prototype.constructor = IcosahedronBufferGeometry$1; /** * @author Abe Pazos / https://hamoid.com * @author Mugen87 / https://github.com/Mugen87 */ // DodecahedronGeometry function DodecahedronGeometry$1( radius, detail ) { Geometry$1.call( this ); this.type = 'DodecahedronGeometry'; this.parameters = { radius: radius, detail: detail }; this.fromBufferGeometry( new DodecahedronBufferGeometry$1( radius, detail ) ); this.mergeVertices(); } DodecahedronGeometry$1.prototype = Object.create( Geometry$1.prototype ); DodecahedronGeometry$1.prototype.constructor = DodecahedronGeometry$1; // DodecahedronBufferGeometry function DodecahedronBufferGeometry$1( radius, detail ) { var t = ( 1 + Math.sqrt( 5 ) ) / 2; var r = 1 / t; var vertices = [ // (±1, ±1, ±1) - 1, - 1, - 1, - 1, - 1, 1, - 1, 1, - 1, - 1, 1, 1, 1, - 1, - 1, 1, - 1, 1, 1, 1, - 1, 1, 1, 1, // (0, ±1/φ, ±φ) 0, - r, - t, 0, - r, t, 0, r, - t, 0, r, t, // (±1/φ, ±φ, 0) - r, - t, 0, - r, t, 0, r, - t, 0, r, t, 0, // (±φ, 0, ±1/φ) - t, 0, - r, t, 0, - r, - t, 0, r, t, 0, r ]; var indices = [ 3, 11, 7, 3, 7, 15, 3, 15, 13, 7, 19, 17, 7, 17, 6, 7, 6, 15, 17, 4, 8, 17, 8, 10, 17, 10, 6, 8, 0, 16, 8, 16, 2, 8, 2, 10, 0, 12, 1, 0, 1, 18, 0, 18, 16, 6, 10, 2, 6, 2, 13, 6, 13, 15, 2, 16, 18, 2, 18, 3, 2, 3, 13, 18, 1, 9, 18, 9, 11, 18, 11, 3, 4, 14, 12, 4, 12, 0, 4, 0, 8, 11, 9, 5, 11, 5, 19, 11, 19, 7, 19, 5, 14, 19, 14, 4, 19, 4, 17, 1, 12, 14, 1, 14, 5, 1, 5, 9 ]; PolyhedronBufferGeometry$1.call( this, vertices, indices, radius, detail ); this.type = 'DodecahedronBufferGeometry'; this.parameters = { radius: radius, detail: detail }; } DodecahedronBufferGeometry$1.prototype = Object.create( PolyhedronBufferGeometry$1.prototype ); DodecahedronBufferGeometry$1.prototype.constructor = DodecahedronBufferGeometry$1; /** * @author oosmoxiecode / https://github.com/oosmoxiecode * @author WestLangley / https://github.com/WestLangley * @author zz85 / https://github.com/zz85 * @author miningold / https://github.com/miningold * @author jonobr1 / https://github.com/jonobr1 * @author Mugen87 / https://github.com/Mugen87 * */ // TubeGeometry function TubeGeometry$1( path, tubularSegments, radius, radialSegments, closed, taper ) { Geometry$1.call( this ); this.type = 'TubeGeometry'; this.parameters = { path: path, tubularSegments: tubularSegments, radius: radius, radialSegments: radialSegments, closed: closed }; if ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' ); var bufferGeometry = new TubeBufferGeometry$1( path, tubularSegments, radius, radialSegments, closed ); // expose internals this.tangents = bufferGeometry.tangents; this.normals = bufferGeometry.normals; this.binormals = bufferGeometry.binormals; // create geometry this.fromBufferGeometry( bufferGeometry ); this.mergeVertices(); } TubeGeometry$1.prototype = Object.create( Geometry$1.prototype ); TubeGeometry$1.prototype.constructor = TubeGeometry$1; // TubeBufferGeometry function TubeBufferGeometry$1( path, tubularSegments, radius, radialSegments, closed ) { BufferGeometry$1.call( this ); this.type = 'TubeBufferGeometry'; this.parameters = { path: path, tubularSegments: tubularSegments, radius: radius, radialSegments: radialSegments, closed: closed }; tubularSegments = tubularSegments || 64; radius = radius || 1; radialSegments = radialSegments || 8; closed = closed || false; var frames = path.computeFrenetFrames( tubularSegments, closed ); // expose internals this.tangents = frames.tangents; this.normals = frames.normals; this.binormals = frames.binormals; // helper variables var vertex = new Vector3$1(); var normal = new Vector3$1(); var uv = new Vector2$1(); var i, j; // buffer var vertices = []; var normals = []; var uvs = []; var indices = []; // create buffer data generateBufferData(); // build geometry this.setIndex( indices ); this.addAttribute( 'position', new Float32BufferAttribute$1( vertices, 3 ) ); this.addAttribute( 'normal', new Float32BufferAttribute$1( normals, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( uvs, 2 ) ); // functions function generateBufferData() { for ( i = 0; i < tubularSegments; i ++ ) { generateSegment( i ); } // if the geometry is not closed, generate the last row of vertices and normals // at the regular position on the given path // // if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ) generateSegment( ( closed === false ) ? tubularSegments : 0 ); // uvs are generated in a separate function. // this makes it easy compute correct values for closed geometries generateUVs(); // finally create faces generateIndices(); } function generateSegment( i ) { // we use getPointAt to sample evenly distributed points from the given path var P = path.getPointAt( i / tubularSegments ); // retrieve corresponding normal and binormal var N = frames.normals[ i ]; var B = frames.binormals[ i ]; // generate normals and vertices for the current segment for ( j = 0; j <= radialSegments; j ++ ) { var v = j / radialSegments * Math.PI * 2; var sin = Math.sin( v ); var cos = - Math.cos( v ); // normal normal.x = ( cos * N.x + sin * B.x ); normal.y = ( cos * N.y + sin * B.y ); normal.z = ( cos * N.z + sin * B.z ); normal.normalize(); normals.push( normal.x, normal.y, normal.z ); // vertex vertex.x = P.x + radius * normal.x; vertex.y = P.y + radius * normal.y; vertex.z = P.z + radius * normal.z; vertices.push( vertex.x, vertex.y, vertex.z ); } } function generateIndices() { for ( j = 1; j <= tubularSegments; j ++ ) { for ( i = 1; i <= radialSegments; i ++ ) { var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); var b = ( radialSegments + 1 ) * j + ( i - 1 ); var c = ( radialSegments + 1 ) * j + i; var d = ( radialSegments + 1 ) * ( j - 1 ) + i; // faces indices.push( a, b, d ); indices.push( b, c, d ); } } } function generateUVs() { for ( i = 0; i <= tubularSegments; i ++ ) { for ( j = 0; j <= radialSegments; j ++ ) { uv.x = i / tubularSegments; uv.y = j / radialSegments; uvs.push( uv.x, uv.y ); } } } } TubeBufferGeometry$1.prototype = Object.create( BufferGeometry$1.prototype ); TubeBufferGeometry$1.prototype.constructor = TubeBufferGeometry$1; /** * @author oosmoxiecode * @author Mugen87 / https://github.com/Mugen87 * * based on http://www.blackpawn.com/texts/pqtorus/ */ // TorusKnotGeometry function TorusKnotGeometry$1( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) { Geometry$1.call( this ); this.type = 'TorusKnotGeometry'; this.parameters = { radius: radius, tube: tube, tubularSegments: tubularSegments, radialSegments: radialSegments, p: p, q: q }; if ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' ); this.fromBufferGeometry( new TorusKnotBufferGeometry$1( radius, tube, tubularSegments, radialSegments, p, q ) ); this.mergeVertices(); } TorusKnotGeometry$1.prototype = Object.create( Geometry$1.prototype ); TorusKnotGeometry$1.prototype.constructor = TorusKnotGeometry$1; // TorusKnotBufferGeometry function TorusKnotBufferGeometry$1( radius, tube, tubularSegments, radialSegments, p, q ) { BufferGeometry$1.call( this ); this.type = 'TorusKnotBufferGeometry'; this.parameters = { radius: radius, tube: tube, tubularSegments: tubularSegments, radialSegments: radialSegments, p: p, q: q }; radius = radius || 100; tube = tube || 40; tubularSegments = Math.floor( tubularSegments ) || 64; radialSegments = Math.floor( radialSegments ) || 8; p = p || 2; q = q || 3; // buffers var indices = []; var vertices = []; var normals = []; var uvs = []; // helper variables var i, j; var vertex = new Vector3$1(); var normal = new Vector3$1(); var P1 = new Vector3$1(); var P2 = new Vector3$1(); var B = new Vector3$1(); var T = new Vector3$1(); var N = new Vector3$1(); // generate vertices, normals and uvs for ( i = 0; i <= tubularSegments; ++ i ) { // the radian "u" is used to calculate the position on the torus curve of the current tubular segement var u = i / tubularSegments * p * Math.PI * 2; // now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead. // these points are used to create a special "coordinate space", which is necessary to calculate the correct vertex positions calculatePositionOnCurve( u, p, q, radius, P1 ); calculatePositionOnCurve( u + 0.01, p, q, radius, P2 ); // calculate orthonormal basis T.subVectors( P2, P1 ); N.addVectors( P2, P1 ); B.crossVectors( T, N ); N.crossVectors( B, T ); // normalize B, N. T can be ignored, we don't use it B.normalize(); N.normalize(); for ( j = 0; j <= radialSegments; ++ j ) { // now calculate the vertices. they are nothing more than an extrusion of the torus curve. // because we extrude a shape in the xy-plane, there is no need to calculate a z-value. var v = j / radialSegments * Math.PI * 2; var cx = - tube * Math.cos( v ); var cy = tube * Math.sin( v ); // now calculate the final vertex position. // first we orient the extrusion with our basis vectos, then we add it to the current position on the curve vertex.x = P1.x + ( cx * N.x + cy * B.x ); vertex.y = P1.y + ( cx * N.y + cy * B.y ); vertex.z = P1.z + ( cx * N.z + cy * B.z ); vertices.push( vertex.x, vertex.y, vertex.z ); // normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal) normal.subVectors( vertex, P1 ).normalize(); normals.push( normal.x, normal.y, normal.z ); // uv uvs.push( i / tubularSegments ); uvs.push( j / radialSegments ); } } // generate indices for ( j = 1; j <= tubularSegments; j ++ ) { for ( i = 1; i <= radialSegments; i ++ ) { // indices var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); var b = ( radialSegments + 1 ) * j + ( i - 1 ); var c = ( radialSegments + 1 ) * j + i; var d = ( radialSegments + 1 ) * ( j - 1 ) + i; // faces indices.push( a, b, d ); indices.push( b, c, d ); } } // build geometry this.setIndex( indices ); this.addAttribute( 'position', new Float32BufferAttribute$1( vertices, 3 ) ); this.addAttribute( 'normal', new Float32BufferAttribute$1( normals, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( uvs, 2 ) ); // this function calculates the current position on the torus curve function calculatePositionOnCurve( u, p, q, radius, position ) { var cu = Math.cos( u ); var su = Math.sin( u ); var quOverP = q / p * u; var cs = Math.cos( quOverP ); position.x = radius * ( 2 + cs ) * 0.5 * cu; position.y = radius * ( 2 + cs ) * su * 0.5; position.z = radius * Math.sin( quOverP ) * 0.5; } } TorusKnotBufferGeometry$1.prototype = Object.create( BufferGeometry$1.prototype ); TorusKnotBufferGeometry$1.prototype.constructor = TorusKnotBufferGeometry$1; /** * @author oosmoxiecode * @author mrdoob / http://mrdoob.com/ * @author Mugen87 / https://github.com/Mugen87 */ // TorusGeometry function TorusGeometry$1( radius, tube, radialSegments, tubularSegments, arc ) { Geometry$1.call( this ); this.type = 'TorusGeometry'; this.parameters = { radius: radius, tube: tube, radialSegments: radialSegments, tubularSegments: tubularSegments, arc: arc }; this.fromBufferGeometry( new TorusBufferGeometry$1( radius, tube, radialSegments, tubularSegments, arc ) ); this.mergeVertices(); } TorusGeometry$1.prototype = Object.create( Geometry$1.prototype ); TorusGeometry$1.prototype.constructor = TorusGeometry$1; // TorusBufferGeometry function TorusBufferGeometry$1( radius, tube, radialSegments, tubularSegments, arc ) { BufferGeometry$1.call( this ); this.type = 'TorusBufferGeometry'; this.parameters = { radius: radius, tube: tube, radialSegments: radialSegments, tubularSegments: tubularSegments, arc: arc }; radius = radius || 100; tube = tube || 40; radialSegments = Math.floor( radialSegments ) || 8; tubularSegments = Math.floor( tubularSegments ) || 6; arc = arc || Math.PI * 2; // buffers var indices = []; var vertices = []; var normals = []; var uvs = []; // helper variables var center = new Vector3$1(); var vertex = new Vector3$1(); var normal = new Vector3$1(); var j, i; // generate vertices, normals and uvs for ( j = 0; j <= radialSegments; j ++ ) { for ( i = 0; i <= tubularSegments; i ++ ) { var u = i / tubularSegments * arc; var v = j / radialSegments * Math.PI * 2; // vertex vertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u ); vertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u ); vertex.z = tube * Math.sin( v ); vertices.push( vertex.x, vertex.y, vertex.z ); // normal center.x = radius * Math.cos( u ); center.y = radius * Math.sin( u ); normal.subVectors( vertex, center ).normalize(); normals.push( normal.x, normal.y, normal.z ); // uv uvs.push( i / tubularSegments ); uvs.push( j / radialSegments ); } } // generate indices for ( j = 1; j <= radialSegments; j ++ ) { for ( i = 1; i <= tubularSegments; i ++ ) { // indices var a = ( tubularSegments + 1 ) * j + i - 1; var b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1; var c = ( tubularSegments + 1 ) * ( j - 1 ) + i; var d = ( tubularSegments + 1 ) * j + i; // faces indices.push( a, b, d ); indices.push( b, c, d ); } } // build geometry this.setIndex( indices ); this.addAttribute( 'position', new Float32BufferAttribute$1( vertices, 3 ) ); this.addAttribute( 'normal', new Float32BufferAttribute$1( normals, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( uvs, 2 ) ); } TorusBufferGeometry$1.prototype = Object.create( BufferGeometry$1.prototype ); TorusBufferGeometry$1.prototype.constructor = TorusBufferGeometry$1; /** * @author zz85 / http://www.lab4games.net/zz85/blog */ var ShapeUtils$1 = { // calculate area of the contour polygon area: function ( contour ) { var n = contour.length; var a = 0.0; for ( var p = n - 1, q = 0; q < n; p = q ++ ) { a += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y; } return a * 0.5; }, triangulate: ( function () { /** * This code is a quick port of code written in C++ which was submitted to * flipcode.com by John W. Ratcliff // July 22, 2000 * See original code and more information here: * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml * * ported to actionscript by Zevan Rosser * www.actionsnippet.com * * ported to javascript by Joshua Koo * http://www.lab4games.net/zz85/blog * */ function snip( contour, u, v, w, n, verts ) { var p; var ax, ay, bx, by; var cx, cy, px, py; ax = contour[ verts[ u ] ].x; ay = contour[ verts[ u ] ].y; bx = contour[ verts[ v ] ].x; by = contour[ verts[ v ] ].y; cx = contour[ verts[ w ] ].x; cy = contour[ verts[ w ] ].y; if ( ( bx - ax ) * ( cy - ay ) - ( by - ay ) * ( cx - ax ) <= 0 ) return false; var aX, aY, bX, bY, cX, cY; var apx, apy, bpx, bpy, cpx, cpy; var cCROSSap, bCROSScp, aCROSSbp; aX = cx - bx; aY = cy - by; bX = ax - cx; bY = ay - cy; cX = bx - ax; cY = by - ay; for ( p = 0; p < n; p ++ ) { px = contour[ verts[ p ] ].x; py = contour[ verts[ p ] ].y; if ( ( ( px === ax ) && ( py === ay ) ) || ( ( px === bx ) && ( py === by ) ) || ( ( px === cx ) && ( py === cy ) ) ) continue; apx = px - ax; apy = py - ay; bpx = px - bx; bpy = py - by; cpx = px - cx; cpy = py - cy; // see if p is inside triangle abc aCROSSbp = aX * bpy - aY * bpx; cCROSSap = cX * apy - cY * apx; bCROSScp = bX * cpy - bY * cpx; if ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false; } return true; } // takes in an contour array and returns return function triangulate( contour, indices ) { var n = contour.length; if ( n < 3 ) return null; var result = [], verts = [], vertIndices = []; /* we want a counter-clockwise polygon in verts */ var u, v, w; if ( ShapeUtils$1.area( contour ) > 0.0 ) { for ( v = 0; v < n; v ++ ) verts[ v ] = v; } else { for ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v; } var nv = n; /* remove nv - 2 vertices, creating 1 triangle every time */ var count = 2 * nv; /* error detection */ for ( v = nv - 1; nv > 2; ) { /* if we loop, it is probably a non-simple polygon */ if ( ( count -- ) <= 0 ) { //** Triangulate: ERROR - probable bad polygon! //throw ( "Warning, unable to triangulate polygon!" ); //return null; // Sometimes warning is fine, especially polygons are triangulated in reverse. console.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' ); if ( indices ) return vertIndices; return result; } /* three consecutive vertices in current polygon, */ u = v; if ( nv <= u ) u = 0; /* previous */ v = u + 1; if ( nv <= v ) v = 0; /* new v */ w = v + 1; if ( nv <= w ) w = 0; /* next */ if ( snip( contour, u, v, w, nv, verts ) ) { var a, b, c, s, t; /* true names of the vertices */ a = verts[ u ]; b = verts[ v ]; c = verts[ w ]; /* output Triangle */ result.push( [ contour[ a ], contour[ b ], contour[ c ] ] ); vertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] ); /* remove v from the remaining polygon */ for ( s = v, t = v + 1; t < nv; s ++, t ++ ) { verts[ s ] = verts[ t ]; } nv --; /* reset error detection counter */ count = 2 * nv; } } if ( indices ) return vertIndices; return result; } } )(), triangulateShape: function ( contour, holes ) { function removeDupEndPts(points) { var l = points.length; if ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) { points.pop(); } } removeDupEndPts( contour ); holes.forEach( removeDupEndPts ); function point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) { // inOtherPt needs to be collinear to the inSegment if ( inSegPt1.x !== inSegPt2.x ) { if ( inSegPt1.x < inSegPt2.x ) { return ( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) ); } else { return ( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) ); } } else { if ( inSegPt1.y < inSegPt2.y ) { return ( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) ); } else { return ( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) ); } } } function intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) { var seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y; var seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y; var seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x; var seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y; var limit = seg1dy * seg2dx - seg1dx * seg2dy; var perpSeg1 = seg1dy * seg1seg2dx - seg1dx * seg1seg2dy; if ( Math.abs( limit ) > Number.EPSILON ) { // not parallel var perpSeg2; if ( limit > 0 ) { if ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) return []; perpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy; if ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) return []; } else { if ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) return []; perpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy; if ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) return []; } // i.e. to reduce rounding errors // intersection at endpoint of segment#1? if ( perpSeg2 === 0 ) { if ( ( inExcludeAdjacentSegs ) && ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) ) return []; return [ inSeg1Pt1 ]; } if ( perpSeg2 === limit ) { if ( ( inExcludeAdjacentSegs ) && ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) ) return []; return [ inSeg1Pt2 ]; } // intersection at endpoint of segment#2? if ( perpSeg1 === 0 ) return [ inSeg2Pt1 ]; if ( perpSeg1 === limit ) return [ inSeg2Pt2 ]; // return real intersection point var factorSeg1 = perpSeg2 / limit; return [ { x: inSeg1Pt1.x + factorSeg1 * seg1dx, y: inSeg1Pt1.y + factorSeg1 * seg1dy } ]; } else { // parallel or collinear if ( ( perpSeg1 !== 0 ) || ( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) return []; // they are collinear or degenerate var seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) ); // segment1 is just a point? var seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) ); // segment2 is just a point? // both segments are points if ( seg1Pt && seg2Pt ) { if ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) || ( inSeg1Pt1.y !== inSeg2Pt1.y ) ) return []; // they are distinct points return [ inSeg1Pt1 ]; // they are the same point } // segment#1 is a single point if ( seg1Pt ) { if ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) ) return []; // but not in segment#2 return [ inSeg1Pt1 ]; } // segment#2 is a single point if ( seg2Pt ) { if ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) ) return []; // but not in segment#1 return [ inSeg2Pt1 ]; } // they are collinear segments, which might overlap var seg1min, seg1max, seg1minVal, seg1maxVal; var seg2min, seg2max, seg2minVal, seg2maxVal; if ( seg1dx !== 0 ) { // the segments are NOT on a vertical line if ( inSeg1Pt1.x < inSeg1Pt2.x ) { seg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x; seg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x; } else { seg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x; seg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x; } if ( inSeg2Pt1.x < inSeg2Pt2.x ) { seg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x; seg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x; } else { seg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x; seg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x; } } else { // the segments are on a vertical line if ( inSeg1Pt1.y < inSeg1Pt2.y ) { seg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y; seg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y; } else { seg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y; seg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y; } if ( inSeg2Pt1.y < inSeg2Pt2.y ) { seg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y; seg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y; } else { seg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y; seg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y; } } if ( seg1minVal <= seg2minVal ) { if ( seg1maxVal < seg2minVal ) return []; if ( seg1maxVal === seg2minVal ) { if ( inExcludeAdjacentSegs ) return []; return [ seg2min ]; } if ( seg1maxVal <= seg2maxVal ) return [ seg2min, seg1max ]; return [ seg2min, seg2max ]; } else { if ( seg1minVal > seg2maxVal ) return []; if ( seg1minVal === seg2maxVal ) { if ( inExcludeAdjacentSegs ) return []; return [ seg1min ]; } if ( seg1maxVal <= seg2maxVal ) return [ seg1min, seg1max ]; return [ seg1min, seg2max ]; } } } function isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) { // The order of legs is important // translation of all points, so that Vertex is at (0,0) var legFromPtX = inLegFromPt.x - inVertex.x, legFromPtY = inLegFromPt.y - inVertex.y; var legToPtX = inLegToPt.x - inVertex.x, legToPtY = inLegToPt.y - inVertex.y; var otherPtX = inOtherPt.x - inVertex.x, otherPtY = inOtherPt.y - inVertex.y; // main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg. var from2toAngle = legFromPtX * legToPtY - legFromPtY * legToPtX; var from2otherAngle = legFromPtX * otherPtY - legFromPtY * otherPtX; if ( Math.abs( from2toAngle ) > Number.EPSILON ) { // angle != 180 deg. var other2toAngle = otherPtX * legToPtY - otherPtY * legToPtX; // console.log( "from2to: " + from2toAngle + ", from2other: " + from2otherAngle + ", other2to: " + other2toAngle ); if ( from2toAngle > 0 ) { // main angle < 180 deg. return ( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) ); } else { // main angle > 180 deg. return ( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) ); } } else { // angle == 180 deg. // console.log( "from2to: 180 deg., from2other: " + from2otherAngle ); return ( from2otherAngle > 0 ); } } function removeHoles( contour, holes ) { var shape = contour.concat(); // work on this shape var hole; function isCutLineInsideAngles( inShapeIdx, inHoleIdx ) { // Check if hole point lies within angle around shape point var lastShapeIdx = shape.length - 1; var prevShapeIdx = inShapeIdx - 1; if ( prevShapeIdx < 0 ) prevShapeIdx = lastShapeIdx; var nextShapeIdx = inShapeIdx + 1; if ( nextShapeIdx > lastShapeIdx ) nextShapeIdx = 0; var insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] ); if ( ! insideAngle ) { // console.log( "Vertex (Shape): " + inShapeIdx + ", Point: " + hole[inHoleIdx].x + "/" + hole[inHoleIdx].y ); return false; } // Check if shape point lies within angle around hole point var lastHoleIdx = hole.length - 1; var prevHoleIdx = inHoleIdx - 1; if ( prevHoleIdx < 0 ) prevHoleIdx = lastHoleIdx; var nextHoleIdx = inHoleIdx + 1; if ( nextHoleIdx > lastHoleIdx ) nextHoleIdx = 0; insideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] ); if ( ! insideAngle ) { // console.log( "Vertex (Hole): " + inHoleIdx + ", Point: " + shape[inShapeIdx].x + "/" + shape[inShapeIdx].y ); return false; } return true; } function intersectsShapeEdge( inShapePt, inHolePt ) { // checks for intersections with shape edges var sIdx, nextIdx, intersection; for ( sIdx = 0; sIdx < shape.length; sIdx ++ ) { nextIdx = sIdx + 1; nextIdx %= shape.length; intersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true ); if ( intersection.length > 0 ) return true; } return false; } var indepHoles = []; function intersectsHoleEdge( inShapePt, inHolePt ) { // checks for intersections with hole edges var ihIdx, chkHole, hIdx, nextIdx, intersection; for ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) { chkHole = holes[ indepHoles[ ihIdx ]]; for ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) { nextIdx = hIdx + 1; nextIdx %= chkHole.length; intersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true ); if ( intersection.length > 0 ) return true; } } return false; } var holeIndex, shapeIndex, shapePt, holePt, holeIdx, cutKey, failedCuts = [], tmpShape1, tmpShape2, tmpHole1, tmpHole2; for ( var h = 0, hl = holes.length; h < hl; h ++ ) { indepHoles.push( h ); } var minShapeIndex = 0; var counter = indepHoles.length * 2; while ( indepHoles.length > 0 ) { counter --; if ( counter < 0 ) { console.log( "Infinite Loop! Holes left:" + indepHoles.length + ", Probably Hole outside Shape!" ); break; } // search for shape-vertex and hole-vertex, // which can be connected without intersections for ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) { shapePt = shape[ shapeIndex ]; holeIndex = - 1; // search for hole which can be reached without intersections for ( var h = 0; h < indepHoles.length; h ++ ) { holeIdx = indepHoles[ h ]; // prevent multiple checks cutKey = shapePt.x + ":" + shapePt.y + ":" + holeIdx; if ( failedCuts[ cutKey ] !== undefined ) continue; hole = holes[ holeIdx ]; for ( var h2 = 0; h2 < hole.length; h2 ++ ) { holePt = hole[ h2 ]; if ( ! isCutLineInsideAngles( shapeIndex, h2 ) ) continue; if ( intersectsShapeEdge( shapePt, holePt ) ) continue; if ( intersectsHoleEdge( shapePt, holePt ) ) continue; holeIndex = h2; indepHoles.splice( h, 1 ); tmpShape1 = shape.slice( 0, shapeIndex + 1 ); tmpShape2 = shape.slice( shapeIndex ); tmpHole1 = hole.slice( holeIndex ); tmpHole2 = hole.slice( 0, holeIndex + 1 ); shape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 ); minShapeIndex = shapeIndex; // Debug only, to show the selected cuts // glob_CutLines.push( [ shapePt, holePt ] ); break; } if ( holeIndex >= 0 ) break; // hole-vertex found failedCuts[ cutKey ] = true; // remember failure } if ( holeIndex >= 0 ) break; // hole-vertex found } } return shape; /* shape with no holes */ } var i, il, f, face, key, index, allPointsMap = {}; // To maintain reference to old shape, one must match coordinates, or offset the indices from original arrays. It's probably easier to do the first. var allpoints = contour.concat(); for ( var h = 0, hl = holes.length; h < hl; h ++ ) { Array.prototype.push.apply( allpoints, holes[ h ] ); } //console.log( "allpoints",allpoints, allpoints.length ); // prepare all points map for ( i = 0, il = allpoints.length; i < il; i ++ ) { key = allpoints[ i ].x + ":" + allpoints[ i ].y; if ( allPointsMap[ key ] !== undefined ) { console.warn( "THREE.ShapeUtils: Duplicate point", key, i ); } allPointsMap[ key ] = i; } // remove holes by cutting paths to holes and adding them to the shape var shapeWithoutHoles = removeHoles( contour, holes ); var triangles = ShapeUtils$1.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape //console.log( "triangles",triangles, triangles.length ); // check all face vertices against all points map for ( i = 0, il = triangles.length; i < il; i ++ ) { face = triangles[ i ]; for ( f = 0; f < 3; f ++ ) { key = face[ f ].x + ":" + face[ f ].y; index = allPointsMap[ key ]; if ( index !== undefined ) { face[ f ] = index; } } } return triangles.concat(); }, isClockWise: function ( pts ) { return ShapeUtils$1.area( pts ) < 0; } }; /** * @author zz85 / http://www.lab4games.net/zz85/blog * * Creates extruded geometry from a path shape. * * parameters = { * * curveSegments: , // number of points on the curves * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too * amount: , // Depth to extrude the shape * * bevelEnabled: , // turn on bevel * bevelThickness: , // how deep into the original shape bevel goes * bevelSize: , // how far from shape outline is bevel * bevelSegments: , // number of bevel layers * * extrudePath: // curve to extrude shape along * frames: // containing arrays of tangents, normals, binormals * * UVGenerator: // object that provides UV generator functions * * } */ // ExtrudeGeometry function ExtrudeGeometry$1( shapes, options ) { Geometry$1.call( this ); this.type = 'ExtrudeGeometry'; this.parameters = { shapes: shapes, options: options }; this.fromBufferGeometry( new ExtrudeBufferGeometry$1( shapes, options ) ); this.mergeVertices(); } ExtrudeGeometry$1.prototype = Object.create( Geometry$1.prototype ); ExtrudeGeometry$1.prototype.constructor = ExtrudeGeometry$1; // ExtrudeBufferGeometry function ExtrudeBufferGeometry$1( shapes, options ) { if ( typeof ( shapes ) === "undefined" ) { shapes = []; return; } BufferGeometry$1.call( this ); this.type = 'ExtrudeBufferGeometry'; shapes = Array.isArray( shapes ) ? shapes : [ shapes ]; this.addShapeList( shapes, options ); this.computeVertexNormals(); // can't really use automatic vertex normals // as then front and back sides get smoothed too // should do separate smoothing just for sides //this.computeVertexNormals(); //console.log( "took", ( Date.now() - startTime ) ); } ExtrudeBufferGeometry$1.prototype = Object.create( BufferGeometry$1.prototype ); ExtrudeBufferGeometry$1.prototype.constructor = ExtrudeBufferGeometry$1; ExtrudeBufferGeometry$1.prototype.getArrays = function () { var positionAttribute = this.getAttribute( "position" ); var verticesArray = positionAttribute ? Array.prototype.slice.call( positionAttribute.array ) : []; var uvAttribute = this.getAttribute( "uv" ); var uvArray = uvAttribute ? Array.prototype.slice.call( uvAttribute.array ) : []; var IndexAttribute = this.index; var indicesArray = IndexAttribute ? Array.prototype.slice.call( IndexAttribute.array ) : []; return { position: verticesArray, uv: uvArray, index: indicesArray }; }; ExtrudeBufferGeometry$1.prototype.addShapeList = function ( shapes, options ) { var sl = shapes.length; options.arrays = this.getArrays(); for ( var s = 0; s < sl; s ++ ) { var shape = shapes[ s ]; this.addShape( shape, options ); } this.setIndex( options.arrays.index ); this.addAttribute( 'position', new Float32BufferAttribute$1( options.arrays.position, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( options.arrays.uv, 2 ) ); }; ExtrudeBufferGeometry$1.prototype.addShape = function ( shape, options ) { var arrays = options.arrays ? options.arrays : this.getArrays(); var verticesArray = arrays.position; var indicesArray = arrays.index; var uvArray = arrays.uv; var placeholder = []; var amount = options.amount !== undefined ? options.amount : 100; var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10 var bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8 var bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3; var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; var steps = options.steps !== undefined ? options.steps : 1; var extrudePath = options.extrudePath; var extrudePts, extrudeByPath = false; // Use default WorldUVGenerator if no UV generators are specified. var uvgen = options.UVGenerator !== undefined ? options.UVGenerator : ExtrudeGeometry$1.WorldUVGenerator; var splineTube, binormal, normal, position2; if ( extrudePath ) { extrudePts = extrudePath.getSpacedPoints( steps ); extrudeByPath = true; bevelEnabled = false; // bevels not supported for path extrusion // SETUP TNB variables // TODO1 - have a .isClosed in spline? splineTube = options.frames !== undefined ? options.frames : extrudePath.computeFrenetFrames( steps, false ); // console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length); binormal = new Vector3$1(); normal = new Vector3$1(); position2 = new Vector3$1(); } // Safeguards if bevels are not enabled if ( ! bevelEnabled ) { bevelSegments = 0; bevelThickness = 0; bevelSize = 0; } // Variables initialization var ahole, h, hl; // looping of holes var scope = this; var shapePoints = shape.extractPoints( curveSegments ); var vertices = shapePoints.shape; var holes = shapePoints.holes; var reverse = ! ShapeUtils$1.isClockWise( vertices ); if ( reverse ) { vertices = vertices.reverse(); // Maybe we should also check if holes are in the opposite direction, just to be safe ... for ( h = 0, hl = holes.length; h < hl; h ++ ) { ahole = holes[ h ]; if ( ShapeUtils$1.isClockWise( ahole ) ) { holes[ h ] = ahole.reverse(); } } reverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)! } var faces = ShapeUtils$1.triangulateShape( vertices, holes ); /* Vertices */ var contour = vertices; // vertices has all points but contour has only points of circumference for ( h = 0, hl = holes.length; h < hl; h ++ ) { ahole = holes[ h ]; vertices = vertices.concat( ahole ); } function scalePt2( pt, vec, size ) { if ( ! vec ) console.error( "THREE.ExtrudeGeometry: vec does not exist" ); return vec.clone().multiplyScalar( size ).add( pt ); } var b, bs, t, z, vert, vlen = vertices.length, face, flen = faces.length; // Find directions for point movement function getBevelVec( inPt, inPrev, inNext ) { // computes for inPt the corresponding point inPt' on a new contour // shifted by 1 unit (length of normalized vector) to the left // if we walk along contour clockwise, this new contour is outside the old one // // inPt' is the intersection of the two lines parallel to the two // adjacent edges of inPt at a distance of 1 unit on the left side. var v_trans_x, v_trans_y, shrink_by = 1; // resulting translation vector for inPt // good reading for geometry algorithms (here: line-line intersection) // http://geomalgorithms.com/a05-_intersect-1.html var v_prev_x = inPt.x - inPrev.x, v_prev_y = inPt.y - inPrev.y; var v_next_x = inNext.x - inPt.x, v_next_y = inNext.y - inPt.y; var v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y ); // check for collinear edges var collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x ); if ( Math.abs( collinear0 ) > Number.EPSILON ) { // not collinear // length of vectors for normalizing var v_prev_len = Math.sqrt( v_prev_lensq ); var v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y ); // shift adjacent points by unit vectors to the left var ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len ); var ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len ); var ptNextShift_x = ( inNext.x - v_next_y / v_next_len ); var ptNextShift_y = ( inNext.y + v_next_x / v_next_len ); // scaling factor for v_prev to intersection point var sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y - ( ptNextShift_y - ptPrevShift_y ) * v_next_x ) / ( v_prev_x * v_next_y - v_prev_y * v_next_x ); // vector from inPt to intersection point v_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x ); v_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y ); // Don't normalize!, otherwise sharp corners become ugly // but prevent crazy spikes var v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y ); if ( v_trans_lensq <= 2 ) { return new Vector2$1( v_trans_x, v_trans_y ); } else { shrink_by = Math.sqrt( v_trans_lensq / 2 ); } } else { // handle special case of collinear edges var direction_eq = false; // assumes: opposite if ( v_prev_x > Number.EPSILON ) { if ( v_next_x > Number.EPSILON ) { direction_eq = true; } } else { if ( v_prev_x < - Number.EPSILON ) { if ( v_next_x < - Number.EPSILON ) { direction_eq = true; } } else { if ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) { direction_eq = true; } } } if ( direction_eq ) { // console.log("Warning: lines are a straight sequence"); v_trans_x = - v_prev_y; v_trans_y = v_prev_x; shrink_by = Math.sqrt( v_prev_lensq ); } else { // console.log("Warning: lines are a straight spike"); v_trans_x = v_prev_x; v_trans_y = v_prev_y; shrink_by = Math.sqrt( v_prev_lensq / 2 ); } } return new Vector2$1( v_trans_x / shrink_by, v_trans_y / shrink_by ); } var contourMovements = []; for ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { if ( j === il ) j = 0; if ( k === il ) k = 0; // (j)---(i)---(k) // console.log('i,j,k', i, j , k) contourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] ); } var holesMovements = [], oneHoleMovements, verticesMovements = contourMovements.concat(); for ( h = 0, hl = holes.length; h < hl; h ++ ) { ahole = holes[ h ]; oneHoleMovements = []; for ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { if ( j === il ) j = 0; if ( k === il ) k = 0; // (j)---(i)---(k) oneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] ); } holesMovements.push( oneHoleMovements ); verticesMovements = verticesMovements.concat( oneHoleMovements ); } // Loop bevelSegments, 1 for the front, 1 for the back for ( b = 0; b < bevelSegments; b ++ ) { //for ( b = bevelSegments; b > 0; b -- ) { t = b / bevelSegments; z = bevelThickness * Math.cos( t * Math.PI / 2 ); bs = bevelSize * Math.sin( t * Math.PI / 2 ); // contract shape for ( i = 0, il = contour.length; i < il; i ++ ) { vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); v( vert.x, vert.y, - z ); } // expand holes for ( h = 0, hl = holes.length; h < hl; h ++ ) { ahole = holes[ h ]; oneHoleMovements = holesMovements[ h ]; for ( i = 0, il = ahole.length; i < il; i ++ ) { vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); v( vert.x, vert.y, - z ); } } } bs = bevelSize; // Back facing vertices for ( i = 0; i < vlen; i ++ ) { vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; if ( ! extrudeByPath ) { v( vert.x, vert.y, 0 ); } else { // v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x ); normal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x ); binormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y ); position2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal ); v( position2.x, position2.y, position2.z ); } } // Add stepped vertices... // Including front facing vertices var s; for ( s = 1; s <= steps; s ++ ) { for ( i = 0; i < vlen; i ++ ) { vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; if ( ! extrudeByPath ) { v( vert.x, vert.y, amount / steps * s ); } else { // v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x ); normal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x ); binormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y ); position2.copy( extrudePts[ s ] ).add( normal ).add( binormal ); v( position2.x, position2.y, position2.z ); } } } // Add bevel segments planes //for ( b = 1; b <= bevelSegments; b ++ ) { for ( b = bevelSegments - 1; b >= 0; b -- ) { t = b / bevelSegments; z = bevelThickness * Math.cos( t * Math.PI / 2 ); bs = bevelSize * Math.sin( t * Math.PI / 2 ); // contract shape for ( i = 0, il = contour.length; i < il; i ++ ) { vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); v( vert.x, vert.y, amount + z ); } // expand holes for ( h = 0, hl = holes.length; h < hl; h ++ ) { ahole = holes[ h ]; oneHoleMovements = holesMovements[ h ]; for ( i = 0, il = ahole.length; i < il; i ++ ) { vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); if ( ! extrudeByPath ) { v( vert.x, vert.y, amount + z ); } else { v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z ); } } } } /* Faces */ // Top and bottom faces buildLidFaces(); // Sides faces buildSideFaces(); ///// Internal functions function buildLidFaces() { var start = verticesArray.length/3; if ( bevelEnabled ) { var layer = 0; // steps + 1 var offset = vlen * layer; // Bottom faces for ( i = 0; i < flen; i ++ ) { face = faces[ i ]; f3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset ); } layer = steps + bevelSegments * 2; offset = vlen * layer; // Top faces for ( i = 0; i < flen; i ++ ) { face = faces[ i ]; f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset ); } } else { // Bottom faces for ( i = 0; i < flen; i ++ ) { face = faces[ i ]; f3( face[ 2 ], face[ 1 ], face[ 0 ] ); } // Top faces for ( i = 0; i < flen; i ++ ) { face = faces[ i ]; f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps ); } } scope.addGroup( start, verticesArray.length/3 -start, options.material !== undefined ? options.material : 0); } // Create faces for the z-sides of the shape function buildSideFaces() { var start = verticesArray.length/3; var layeroffset = 0; sidewalls( contour, layeroffset ); layeroffset += contour.length; for ( h = 0, hl = holes.length; h < hl; h ++ ) { ahole = holes[ h ]; sidewalls( ahole, layeroffset ); //, true layeroffset += ahole.length; } scope.addGroup( start, verticesArray.length/3 -start, options.extrudeMaterial !== undefined ? options.extrudeMaterial : 1); } function sidewalls( contour, layeroffset ) { var j, k; i = contour.length; while ( -- i >= 0 ) { j = i; k = i - 1; if ( k < 0 ) k = contour.length - 1; //console.log('b', i,j, i-1, k,vertices.length); var s = 0, sl = steps + bevelSegments * 2; for ( s = 0; s < sl; s ++ ) { var slen1 = vlen * s; var slen2 = vlen * ( s + 1 ); var a = layeroffset + j + slen1, b = layeroffset + k + slen1, c = layeroffset + k + slen2, d = layeroffset + j + slen2; f4( a, b, c, d, contour, s, sl, j, k ); } } } function v( x, y, z ) { placeholder.push( x ); placeholder.push( y ); placeholder.push( z ); } function f3( a, b, c ) { addVertex( a ); addVertex( b ); addVertex( c ); var nextIndex = verticesArray.length / 3; var uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); addUV( uvs[ 0 ] ); addUV( uvs[ 1 ] ); addUV( uvs[ 2 ] ); } function f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) { addVertex( a ); addVertex( b ); addVertex( d ); addVertex( b ); addVertex( c ); addVertex( d ); var nextIndex = verticesArray.length / 3; var uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 ); addUV( uvs[ 0 ] ); addUV( uvs[ 1 ] ); addUV( uvs[ 3 ] ); addUV( uvs[ 1 ] ); addUV( uvs[ 2 ] ); addUV( uvs[ 3 ] ); } function addVertex( index ) { indicesArray.push( verticesArray.length / 3 ); verticesArray.push( placeholder[ index * 3 + 0 ] ); verticesArray.push( placeholder[ index * 3 + 1 ] ); verticesArray.push( placeholder[ index * 3 + 2 ] ); } function addUV( vector2 ) { uvArray.push( vector2.x ); uvArray.push( vector2.y ); } if ( ! options.arrays ) { this.setIndex( indicesArray ); this.addAttribute( 'position', new Float32BufferAttribute$1( verticesArray, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( options.arrays.uv, 2 ) ); } }; ExtrudeGeometry$1.WorldUVGenerator = { generateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) { var a_x = vertices[ indexA * 3 ]; var a_y = vertices[ indexA * 3 + 1 ]; var b_x = vertices[ indexB * 3 ]; var b_y = vertices[ indexB * 3 + 1 ]; var c_x = vertices[ indexC * 3 ]; var c_y = vertices[ indexC * 3 + 1 ]; return [ new Vector2$1( a_x, a_y ), new Vector2$1( b_x, b_y ), new Vector2$1( c_x, c_y ) ]; }, generateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) { var a_x = vertices[ indexA * 3 ]; var a_y = vertices[ indexA * 3 + 1 ]; var a_z = vertices[ indexA * 3 + 2 ]; var b_x = vertices[ indexB * 3 ]; var b_y = vertices[ indexB * 3 + 1 ]; var b_z = vertices[ indexB * 3 + 2 ]; var c_x = vertices[ indexC * 3 ]; var c_y = vertices[ indexC * 3 + 1 ]; var c_z = vertices[ indexC * 3 + 2 ]; var d_x = vertices[ indexD * 3 ]; var d_y = vertices[ indexD * 3 + 1 ]; var d_z = vertices[ indexD * 3 + 2 ]; if ( Math.abs( a_y - b_y ) < 0.01 ) { return [ new Vector2$1( a_x, 1 - a_z ), new Vector2$1( b_x, 1 - b_z ), new Vector2$1( c_x, 1 - c_z ), new Vector2$1( d_x, 1 - d_z ) ]; } else { return [ new Vector2$1( a_y, 1 - a_z ), new Vector2$1( b_y, 1 - b_z ), new Vector2$1( c_y, 1 - c_z ), new Vector2$1( d_y, 1 - d_z ) ]; } } }; /** * @author zz85 / http://www.lab4games.net/zz85/blog * @author alteredq / http://alteredqualia.com/ * * Text = 3D Text * * parameters = { * font: , // font * * size: , // size of the text * height: , // thickness to extrude text * curveSegments: , // number of points on the curves * * bevelEnabled: , // turn on bevel * bevelThickness: , // how deep into text bevel goes * bevelSize: // how far from text outline is bevel * } */ // TextGeometry function TextGeometry$1( text, parameters ) { Geometry$1.call( this ); this.type = 'TextGeometry'; this.parameters = { text: text, parameters: parameters }; this.fromBufferGeometry( new TextBufferGeometry$1( text, parameters ) ); this.mergeVertices(); } TextGeometry$1.prototype = Object.create( Geometry$1.prototype ); TextGeometry$1.prototype.constructor = TextGeometry$1; // TextBufferGeometry function TextBufferGeometry$1( text, parameters ) { parameters = parameters || {}; var font = parameters.font; if ( ( font && font.isFont ) === false ) { console.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' ); return new Geometry$1(); } var shapes = font.generateShapes( text, parameters.size, parameters.curveSegments ); // translate parameters to ExtrudeGeometry API parameters.amount = parameters.height !== undefined ? parameters.height : 50; // defaults if ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10; if ( parameters.bevelSize === undefined ) parameters.bevelSize = 8; if ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false; ExtrudeBufferGeometry$1.call( this, shapes, parameters ); this.type = 'TextBufferGeometry'; } TextBufferGeometry$1.prototype = Object.create( ExtrudeBufferGeometry$1.prototype ); TextBufferGeometry$1.prototype.constructor = TextBufferGeometry$1; /** * @author mrdoob / http://mrdoob.com/ * @author benaadams / https://twitter.com/ben_a_adams * @author Mugen87 / https://github.com/Mugen87 */ // SphereGeometry function SphereGeometry$1( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { Geometry$1.call( this ); this.type = 'SphereGeometry'; this.parameters = { radius: radius, widthSegments: widthSegments, heightSegments: heightSegments, phiStart: phiStart, phiLength: phiLength, thetaStart: thetaStart, thetaLength: thetaLength }; this.fromBufferGeometry( new SphereBufferGeometry$1( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) ); this.mergeVertices(); } SphereGeometry$1.prototype = Object.create( Geometry$1.prototype ); SphereGeometry$1.prototype.constructor = SphereGeometry$1; // SphereBufferGeometry function SphereBufferGeometry$1( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { BufferGeometry$1.call( this ); this.type = 'SphereBufferGeometry'; this.parameters = { radius: radius, widthSegments: widthSegments, heightSegments: heightSegments, phiStart: phiStart, phiLength: phiLength, thetaStart: thetaStart, thetaLength: thetaLength }; radius = radius || 50; widthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 ); heightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 ); phiStart = phiStart !== undefined ? phiStart : 0; phiLength = phiLength !== undefined ? phiLength : Math.PI * 2; thetaStart = thetaStart !== undefined ? thetaStart : 0; thetaLength = thetaLength !== undefined ? thetaLength : Math.PI; var thetaEnd = thetaStart + thetaLength; var ix, iy; var index = 0; var grid = []; var vertex = new Vector3$1(); var normal = new Vector3$1(); // buffers var indices = []; var vertices = []; var normals = []; var uvs = []; // generate vertices, normals and uvs for ( iy = 0; iy <= heightSegments; iy ++ ) { var verticesRow = []; var v = iy / heightSegments; for ( ix = 0; ix <= widthSegments; ix ++ ) { var u = ix / widthSegments; // vertex vertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); vertex.y = radius * Math.cos( thetaStart + v * thetaLength ); vertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); vertices.push( vertex.x, vertex.y, vertex.z ); // normal normal.set( vertex.x, vertex.y, vertex.z ).normalize(); normals.push( normal.x, normal.y, normal.z ); // uv uvs.push( u, 1 - v ); verticesRow.push( index ++ ); } grid.push( verticesRow ); } // indices for ( iy = 0; iy < heightSegments; iy ++ ) { for ( ix = 0; ix < widthSegments; ix ++ ) { var a = grid[ iy ][ ix + 1 ]; var b = grid[ iy ][ ix ]; var c = grid[ iy + 1 ][ ix ]; var d = grid[ iy + 1 ][ ix + 1 ]; if ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d ); if ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d ); } } // build geometry this.setIndex( indices ); this.addAttribute( 'position', new Float32BufferAttribute$1( vertices, 3 ) ); this.addAttribute( 'normal', new Float32BufferAttribute$1( normals, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( uvs, 2 ) ); } SphereBufferGeometry$1.prototype = Object.create( BufferGeometry$1.prototype ); SphereBufferGeometry$1.prototype.constructor = SphereBufferGeometry$1; /** * @author Kaleb Murphy * @author Mugen87 / https://github.com/Mugen87 */ // RingGeometry function RingGeometry$1( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { Geometry$1.call( this ); this.type = 'RingGeometry'; this.parameters = { innerRadius: innerRadius, outerRadius: outerRadius, thetaSegments: thetaSegments, phiSegments: phiSegments, thetaStart: thetaStart, thetaLength: thetaLength }; this.fromBufferGeometry( new RingBufferGeometry$1( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) ); this.mergeVertices(); } RingGeometry$1.prototype = Object.create( Geometry$1.prototype ); RingGeometry$1.prototype.constructor = RingGeometry$1; // RingBufferGeometry function RingBufferGeometry$1( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { BufferGeometry$1.call( this ); this.type = 'RingBufferGeometry'; this.parameters = { innerRadius: innerRadius, outerRadius: outerRadius, thetaSegments: thetaSegments, phiSegments: phiSegments, thetaStart: thetaStart, thetaLength: thetaLength }; innerRadius = innerRadius || 20; outerRadius = outerRadius || 50; thetaStart = thetaStart !== undefined ? thetaStart : 0; thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; thetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8; phiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1; // buffers var indices = []; var vertices = []; var normals = []; var uvs = []; // some helper variables var segment; var radius = innerRadius; var radiusStep = ( ( outerRadius - innerRadius ) / phiSegments ); var vertex = new Vector3$1(); var uv = new Vector2$1(); var j, i; // generate vertices, normals and uvs for ( j = 0; j <= phiSegments; j ++ ) { for ( i = 0; i <= thetaSegments; i ++ ) { // values are generate from the inside of the ring to the outside segment = thetaStart + i / thetaSegments * thetaLength; // vertex vertex.x = radius * Math.cos( segment ); vertex.y = radius * Math.sin( segment ); vertices.push( vertex.x, vertex.y, vertex.z ); // normal normals.push( 0, 0, 1 ); // uv uv.x = ( vertex.x / outerRadius + 1 ) / 2; uv.y = ( vertex.y / outerRadius + 1 ) / 2; uvs.push( uv.x, uv.y ); } // increase the radius for next row of vertices radius += radiusStep; } // indices for ( j = 0; j < phiSegments; j ++ ) { var thetaSegmentLevel = j * ( thetaSegments + 1 ); for ( i = 0; i < thetaSegments; i ++ ) { segment = i + thetaSegmentLevel; var a = segment; var b = segment + thetaSegments + 1; var c = segment + thetaSegments + 2; var d = segment + 1; // faces indices.push( a, b, d ); indices.push( b, c, d ); } } // build geometry this.setIndex( indices ); this.addAttribute( 'position', new Float32BufferAttribute$1( vertices, 3 ) ); this.addAttribute( 'normal', new Float32BufferAttribute$1( normals, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( uvs, 2 ) ); } RingBufferGeometry$1.prototype = Object.create( BufferGeometry$1.prototype ); RingBufferGeometry$1.prototype.constructor = RingBufferGeometry$1; /** * @author astrodud / http://astrodud.isgreat.org/ * @author zz85 / https://github.com/zz85 * @author bhouston / http://clara.io * @author Mugen87 / https://github.com/Mugen87 */ // LatheGeometry function LatheGeometry$1( points, segments, phiStart, phiLength ) { Geometry$1.call( this ); this.type = 'LatheGeometry'; this.parameters = { points: points, segments: segments, phiStart: phiStart, phiLength: phiLength }; this.fromBufferGeometry( new LatheBufferGeometry$1( points, segments, phiStart, phiLength ) ); this.mergeVertices(); } LatheGeometry$1.prototype = Object.create( Geometry$1.prototype ); LatheGeometry$1.prototype.constructor = LatheGeometry$1; // LatheBufferGeometry function LatheBufferGeometry$1( points, segments, phiStart, phiLength ) { BufferGeometry$1.call( this ); this.type = 'LatheBufferGeometry'; this.parameters = { points: points, segments: segments, phiStart: phiStart, phiLength: phiLength }; segments = Math.floor( segments ) || 12; phiStart = phiStart || 0; phiLength = phiLength || Math.PI * 2; // clamp phiLength so it's in range of [ 0, 2PI ] phiLength = _Math$1.clamp( phiLength, 0, Math.PI * 2 ); // buffers var indices = []; var vertices = []; var uvs = []; // helper variables var base; var inverseSegments = 1.0 / segments; var vertex = new Vector3$1(); var uv = new Vector2$1(); var i, j; // generate vertices and uvs for ( i = 0; i <= segments; i ++ ) { var phi = phiStart + i * inverseSegments * phiLength; var sin = Math.sin( phi ); var cos = Math.cos( phi ); for ( j = 0; j <= ( points.length - 1 ); j ++ ) { // vertex vertex.x = points[ j ].x * sin; vertex.y = points[ j ].y; vertex.z = points[ j ].x * cos; vertices.push( vertex.x, vertex.y, vertex.z ); // uv uv.x = i / segments; uv.y = j / ( points.length - 1 ); uvs.push( uv.x, uv.y ); } } // indices for ( i = 0; i < segments; i ++ ) { for ( j = 0; j < ( points.length - 1 ); j ++ ) { base = j + i * points.length; var a = base; var b = base + points.length; var c = base + points.length + 1; var d = base + 1; // faces indices.push( a, b, d ); indices.push( b, c, d ); } } // build geometry this.setIndex( indices ); this.addAttribute( 'position', new Float32BufferAttribute$1( vertices, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( uvs, 2 ) ); // generate normals this.computeVertexNormals(); // if the geometry is closed, we need to average the normals along the seam. // because the corresponding vertices are identical (but still have different UVs). if ( phiLength === Math.PI * 2 ) { var normals = this.attributes.normal.array; var n1 = new Vector3$1(); var n2 = new Vector3$1(); var n = new Vector3$1(); // this is the buffer offset for the last line of vertices base = segments * points.length * 3; for ( i = 0, j = 0; i < points.length; i ++, j += 3 ) { // select the normal of the vertex in the first line n1.x = normals[ j + 0 ]; n1.y = normals[ j + 1 ]; n1.z = normals[ j + 2 ]; // select the normal of the vertex in the last line n2.x = normals[ base + j + 0 ]; n2.y = normals[ base + j + 1 ]; n2.z = normals[ base + j + 2 ]; // average normals n.addVectors( n1, n2 ).normalize(); // assign the new values to both normals normals[ j + 0 ] = normals[ base + j + 0 ] = n.x; normals[ j + 1 ] = normals[ base + j + 1 ] = n.y; normals[ j + 2 ] = normals[ base + j + 2 ] = n.z; } } } LatheBufferGeometry$1.prototype = Object.create( BufferGeometry$1.prototype ); LatheBufferGeometry$1.prototype.constructor = LatheBufferGeometry$1; /** * @author jonobr1 / http://jonobr1.com * @author Mugen87 / https://github.com/Mugen87 */ // ShapeGeometry function ShapeGeometry$1( shapes, curveSegments ) { Geometry$1.call( this ); this.type = 'ShapeGeometry'; if ( typeof curveSegments === 'object' ) { console.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' ); curveSegments = curveSegments.curveSegments; } this.parameters = { shapes: shapes, curveSegments: curveSegments }; this.fromBufferGeometry( new ShapeBufferGeometry$1( shapes, curveSegments ) ); this.mergeVertices(); } ShapeGeometry$1.prototype = Object.create( Geometry$1.prototype ); ShapeGeometry$1.prototype.constructor = ShapeGeometry$1; // ShapeBufferGeometry function ShapeBufferGeometry$1( shapes, curveSegments ) { BufferGeometry$1.call( this ); this.type = 'ShapeBufferGeometry'; this.parameters = { shapes: shapes, curveSegments: curveSegments }; curveSegments = curveSegments || 12; // buffers var indices = []; var vertices = []; var normals = []; var uvs = []; // helper variables var groupStart = 0; var groupCount = 0; // allow single and array values for "shapes" parameter if ( Array.isArray( shapes ) === false ) { addShape( shapes ); } else { for ( var i = 0; i < shapes.length; i ++ ) { addShape( shapes[ i ] ); this.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support groupStart += groupCount; groupCount = 0; } } // build geometry this.setIndex( indices ); this.addAttribute( 'position', new Float32BufferAttribute$1( vertices, 3 ) ); this.addAttribute( 'normal', new Float32BufferAttribute$1( normals, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( uvs, 2 ) ); // helper functions function addShape( shape ) { var i, l, shapeHole; var indexOffset = vertices.length / 3; var points = shape.extractPoints( curveSegments ); var shapeVertices = points.shape; var shapeHoles = points.holes; // check direction of vertices if ( ShapeUtils$1.isClockWise( shapeVertices ) === false ) { shapeVertices = shapeVertices.reverse(); // also check if holes are in the opposite direction for ( i = 0, l = shapeHoles.length; i < l; i ++ ) { shapeHole = shapeHoles[ i ]; if ( ShapeUtils$1.isClockWise( shapeHole ) === true ) { shapeHoles[ i ] = shapeHole.reverse(); } } } var faces = ShapeUtils$1.triangulateShape( shapeVertices, shapeHoles ); // join vertices of inner and outer paths to a single array for ( i = 0, l = shapeHoles.length; i < l; i ++ ) { shapeHole = shapeHoles[ i ]; shapeVertices = shapeVertices.concat( shapeHole ); } // vertices, normals, uvs for ( i = 0, l = shapeVertices.length; i < l; i ++ ) { var vertex = shapeVertices[ i ]; vertices.push( vertex.x, vertex.y, 0 ); normals.push( 0, 0, 1 ); uvs.push( vertex.x, vertex.y ); // world uvs } // incides for ( i = 0, l = faces.length; i < l; i ++ ) { var face = faces[ i ]; var a = face[ 0 ] + indexOffset; var b = face[ 1 ] + indexOffset; var c = face[ 2 ] + indexOffset; indices.push( a, b, c ); groupCount += 3; } } } ShapeBufferGeometry$1.prototype = Object.create( BufferGeometry$1.prototype ); ShapeBufferGeometry$1.prototype.constructor = ShapeBufferGeometry$1; /** * @author WestLangley / http://github.com/WestLangley * @author Mugen87 / https://github.com/Mugen87 */ function EdgesGeometry$1( geometry, thresholdAngle ) { BufferGeometry$1.call( this ); this.type = 'EdgesGeometry'; this.parameters = { thresholdAngle: thresholdAngle }; thresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1; // buffer var vertices = []; // helper variables var thresholdDot = Math.cos( _Math$1.DEG2RAD * thresholdAngle ); var edge = [ 0, 0 ], edges = {}, edge1, edge2; var key, keys = [ 'a', 'b', 'c' ]; // prepare source geometry var geometry2; if ( geometry.isBufferGeometry ) { geometry2 = new Geometry$1(); geometry2.fromBufferGeometry( geometry ); } else { geometry2 = geometry.clone(); } geometry2.mergeVertices(); geometry2.computeFaceNormals(); var sourceVertices = geometry2.vertices; var faces = geometry2.faces; // now create a data structure where each entry represents an edge with its adjoining faces for ( var i = 0, l = faces.length; i < l; i ++ ) { var face = faces[ i ]; for ( var j = 0; j < 3; j ++ ) { edge1 = face[ keys[ j ] ]; edge2 = face[ keys[ ( j + 1 ) % 3 ] ]; edge[ 0 ] = Math.min( edge1, edge2 ); edge[ 1 ] = Math.max( edge1, edge2 ); key = edge[ 0 ] + ',' + edge[ 1 ]; if ( edges[ key ] === undefined ) { edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined }; } else { edges[ key ].face2 = i; } } } // generate vertices for ( key in edges ) { var e = edges[ key ]; // an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree. if ( e.face2 === undefined || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) { var vertex = sourceVertices[ e.index1 ]; vertices.push( vertex.x, vertex.y, vertex.z ); vertex = sourceVertices[ e.index2 ]; vertices.push( vertex.x, vertex.y, vertex.z ); } } // build geometry this.addAttribute( 'position', new Float32BufferAttribute$1( vertices, 3 ) ); } EdgesGeometry$1.prototype = Object.create( BufferGeometry$1.prototype ); EdgesGeometry$1.prototype.constructor = EdgesGeometry$1; /** * @author mrdoob / http://mrdoob.com/ * @author Mugen87 / https://github.com/Mugen87 */ // CylinderGeometry function CylinderGeometry$1( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { Geometry$1.call( this ); this.type = 'CylinderGeometry'; this.parameters = { radiusTop: radiusTop, radiusBottom: radiusBottom, height: height, radialSegments: radialSegments, heightSegments: heightSegments, openEnded: openEnded, thetaStart: thetaStart, thetaLength: thetaLength }; this.fromBufferGeometry( new CylinderBufferGeometry$1( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) ); this.mergeVertices(); } CylinderGeometry$1.prototype = Object.create( Geometry$1.prototype ); CylinderGeometry$1.prototype.constructor = CylinderGeometry$1; // CylinderBufferGeometry function CylinderBufferGeometry$1( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { BufferGeometry$1.call( this ); this.type = 'CylinderBufferGeometry'; this.parameters = { radiusTop: radiusTop, radiusBottom: radiusBottom, height: height, radialSegments: radialSegments, heightSegments: heightSegments, openEnded: openEnded, thetaStart: thetaStart, thetaLength: thetaLength }; var scope = this; radiusTop = radiusTop !== undefined ? radiusTop : 20; radiusBottom = radiusBottom !== undefined ? radiusBottom : 20; height = height !== undefined ? height : 100; radialSegments = Math.floor( radialSegments ) || 8; heightSegments = Math.floor( heightSegments ) || 1; openEnded = openEnded !== undefined ? openEnded : false; thetaStart = thetaStart !== undefined ? thetaStart : 0.0; thetaLength = thetaLength !== undefined ? thetaLength : 2.0 * Math.PI; // buffers var indices = []; var vertices = []; var normals = []; var uvs = []; // helper variables var index = 0; var indexArray = []; var halfHeight = height / 2; var groupStart = 0; // generate geometry generateTorso(); if ( openEnded === false ) { if ( radiusTop > 0 ) generateCap( true ); if ( radiusBottom > 0 ) generateCap( false ); } // build geometry this.setIndex( indices ); this.addAttribute( 'position', new Float32BufferAttribute$1( vertices, 3 ) ); this.addAttribute( 'normal', new Float32BufferAttribute$1( normals, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( uvs, 2 ) ); function generateTorso() { var x, y; var normal = new Vector3$1(); var vertex = new Vector3$1(); var groupCount = 0; // this will be used to calculate the normal var slope = ( radiusBottom - radiusTop ) / height; // generate vertices, normals and uvs for ( y = 0; y <= heightSegments; y ++ ) { var indexRow = []; var v = y / heightSegments; // calculate the radius of the current row var radius = v * ( radiusBottom - radiusTop ) + radiusTop; for ( x = 0; x <= radialSegments; x ++ ) { var u = x / radialSegments; var theta = u * thetaLength + thetaStart; var sinTheta = Math.sin( theta ); var cosTheta = Math.cos( theta ); // vertex vertex.x = radius * sinTheta; vertex.y = - v * height + halfHeight; vertex.z = radius * cosTheta; vertices.push( vertex.x, vertex.y, vertex.z ); // normal normal.set( sinTheta, slope, cosTheta ).normalize(); normals.push( normal.x, normal.y, normal.z ); // uv uvs.push( u, 1 - v ); // save index of vertex in respective row indexRow.push( index ++ ); } // now save vertices of the row in our index array indexArray.push( indexRow ); } // generate indices for ( x = 0; x < radialSegments; x ++ ) { for ( y = 0; y < heightSegments; y ++ ) { // we use the index array to access the correct indices var a = indexArray[ y ][ x ]; var b = indexArray[ y + 1 ][ x ]; var c = indexArray[ y + 1 ][ x + 1 ]; var d = indexArray[ y ][ x + 1 ]; // faces indices.push( a, b, d ); indices.push( b, c, d ); // update group counter groupCount += 6; } } // add a group to the geometry. this will ensure multi material support scope.addGroup( groupStart, groupCount, 0 ); // calculate new start value for groups groupStart += groupCount; } function generateCap( top ) { var x, centerIndexStart, centerIndexEnd; var uv = new Vector2$1(); var vertex = new Vector3$1(); var groupCount = 0; var radius = ( top === true ) ? radiusTop : radiusBottom; var sign = ( top === true ) ? 1 : - 1; // save the index of the first center vertex centerIndexStart = index; // first we generate the center vertex data of the cap. // because the geometry needs one set of uvs per face, // we must generate a center vertex per face/segment for ( x = 1; x <= radialSegments; x ++ ) { // vertex vertices.push( 0, halfHeight * sign, 0 ); // normal normals.push( 0, sign, 0 ); // uv uvs.push( 0.5, 0.5 ); // increase index index ++; } // save the index of the last center vertex centerIndexEnd = index; // now we generate the surrounding vertices, normals and uvs for ( x = 0; x <= radialSegments; x ++ ) { var u = x / radialSegments; var theta = u * thetaLength + thetaStart; var cosTheta = Math.cos( theta ); var sinTheta = Math.sin( theta ); // vertex vertex.x = radius * sinTheta; vertex.y = halfHeight * sign; vertex.z = radius * cosTheta; vertices.push( vertex.x, vertex.y, vertex.z ); // normal normals.push( 0, sign, 0 ); // uv uv.x = ( cosTheta * 0.5 ) + 0.5; uv.y = ( sinTheta * 0.5 * sign ) + 0.5; uvs.push( uv.x, uv.y ); // increase index index ++; } // generate indices for ( x = 0; x < radialSegments; x ++ ) { var c = centerIndexStart + x; var i = centerIndexEnd + x; if ( top === true ) { // face top indices.push( i, i + 1, c ); } else { // face bottom indices.push( i + 1, i, c ); } groupCount += 3; } // add a group to the geometry. this will ensure multi material support scope.addGroup( groupStart, groupCount, top === true ? 1 : 2 ); // calculate new start value for groups groupStart += groupCount; } } CylinderBufferGeometry$1.prototype = Object.create( BufferGeometry$1.prototype ); CylinderBufferGeometry$1.prototype.constructor = CylinderBufferGeometry$1; /** * @author abelnation / http://github.com/abelnation */ // ConeGeometry function ConeGeometry$1( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { CylinderGeometry$1.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); this.type = 'ConeGeometry'; this.parameters = { radius: radius, height: height, radialSegments: radialSegments, heightSegments: heightSegments, openEnded: openEnded, thetaStart: thetaStart, thetaLength: thetaLength }; } ConeGeometry$1.prototype = Object.create( CylinderGeometry$1.prototype ); ConeGeometry$1.prototype.constructor = ConeGeometry$1; // ConeBufferGeometry function ConeBufferGeometry$1( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { CylinderBufferGeometry$1.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); this.type = 'ConeBufferGeometry'; this.parameters = { radius: radius, height: height, radialSegments: radialSegments, heightSegments: heightSegments, openEnded: openEnded, thetaStart: thetaStart, thetaLength: thetaLength }; } ConeBufferGeometry$1.prototype = Object.create( CylinderBufferGeometry$1.prototype ); ConeBufferGeometry$1.prototype.constructor = ConeBufferGeometry$1; /** * @author benaadams / https://twitter.com/ben_a_adams * @author Mugen87 / https://github.com/Mugen87 * @author hughes */ // CircleGeometry function CircleGeometry$1( radius, segments, thetaStart, thetaLength ) { Geometry$1.call( this ); this.type = 'CircleGeometry'; this.parameters = { radius: radius, segments: segments, thetaStart: thetaStart, thetaLength: thetaLength }; this.fromBufferGeometry( new CircleBufferGeometry$1( radius, segments, thetaStart, thetaLength ) ); this.mergeVertices(); } CircleGeometry$1.prototype = Object.create( Geometry$1.prototype ); CircleGeometry$1.prototype.constructor = CircleGeometry$1; // CircleBufferGeometry function CircleBufferGeometry$1( radius, segments, thetaStart, thetaLength ) { BufferGeometry$1.call( this ); this.type = 'CircleBufferGeometry'; this.parameters = { radius: radius, segments: segments, thetaStart: thetaStart, thetaLength: thetaLength }; radius = radius || 50; segments = segments !== undefined ? Math.max( 3, segments ) : 8; thetaStart = thetaStart !== undefined ? thetaStart : 0; thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; // buffers var indices = []; var vertices = []; var normals = []; var uvs = []; // helper variables var i, s; var vertex = new Vector3$1(); var uv = new Vector2$1(); // center point vertices.push( 0, 0, 0 ); normals.push( 0, 0, 1 ); uvs.push( 0.5, 0.5 ); for ( s = 0, i = 3; s <= segments; s ++, i += 3 ) { var segment = thetaStart + s / segments * thetaLength; // vertex vertex.x = radius * Math.cos( segment ); vertex.y = radius * Math.sin( segment ); vertices.push( vertex.x, vertex.y, vertex.z ); // normal normals.push( 0, 0, 1 ); // uvs uv.x = ( vertices[ i ] / radius + 1 ) / 2; uv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2; uvs.push( uv.x, uv.y ); } // indices for ( i = 1; i <= segments; i ++ ) { indices.push( i, i + 1, 0 ); } // build geometry this.setIndex( indices ); this.addAttribute( 'position', new Float32BufferAttribute$1( vertices, 3 ) ); this.addAttribute( 'normal', new Float32BufferAttribute$1( normals, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( uvs, 2 ) ); } CircleBufferGeometry$1.prototype = Object.create( BufferGeometry$1.prototype ); CircleBufferGeometry$1.prototype.constructor = CircleBufferGeometry$1; var Geometries$1 = Object.freeze({ WireframeGeometry: WireframeGeometry$1, ParametricGeometry: ParametricGeometry$1, ParametricBufferGeometry: ParametricBufferGeometry$1, TetrahedronGeometry: TetrahedronGeometry$1, TetrahedronBufferGeometry: TetrahedronBufferGeometry$1, OctahedronGeometry: OctahedronGeometry$1, OctahedronBufferGeometry: OctahedronBufferGeometry$1, IcosahedronGeometry: IcosahedronGeometry$1, IcosahedronBufferGeometry: IcosahedronBufferGeometry$1, DodecahedronGeometry: DodecahedronGeometry$1, DodecahedronBufferGeometry: DodecahedronBufferGeometry$1, PolyhedronGeometry: PolyhedronGeometry$1, PolyhedronBufferGeometry: PolyhedronBufferGeometry$1, TubeGeometry: TubeGeometry$1, TubeBufferGeometry: TubeBufferGeometry$1, TorusKnotGeometry: TorusKnotGeometry$1, TorusKnotBufferGeometry: TorusKnotBufferGeometry$1, TorusGeometry: TorusGeometry$1, TorusBufferGeometry: TorusBufferGeometry$1, TextGeometry: TextGeometry$1, TextBufferGeometry: TextBufferGeometry$1, SphereGeometry: SphereGeometry$1, SphereBufferGeometry: SphereBufferGeometry$1, RingGeometry: RingGeometry$1, RingBufferGeometry: RingBufferGeometry$1, PlaneGeometry: PlaneGeometry$1, PlaneBufferGeometry: PlaneBufferGeometry$1, LatheGeometry: LatheGeometry$1, LatheBufferGeometry: LatheBufferGeometry$1, ShapeGeometry: ShapeGeometry$1, ShapeBufferGeometry: ShapeBufferGeometry$1, ExtrudeGeometry: ExtrudeGeometry$1, ExtrudeBufferGeometry: ExtrudeBufferGeometry$1, EdgesGeometry: EdgesGeometry$1, ConeGeometry: ConeGeometry$1, ConeBufferGeometry: ConeBufferGeometry$1, CylinderGeometry: CylinderGeometry$1, CylinderBufferGeometry: CylinderBufferGeometry$1, CircleGeometry: CircleGeometry$1, CircleBufferGeometry: CircleBufferGeometry$1, BoxGeometry: BoxGeometry$1, BoxBufferGeometry: BoxBufferGeometry$1 }); /** * @author mrdoob / http://mrdoob.com/ * * parameters = { * opacity: * } */ function ShadowMaterial$1( parameters ) { ShaderMaterial$1.call( this, { uniforms: UniformsUtils$1.merge( [ UniformsLib$1.lights, { opacity: { value: 1.0 } } ] ), vertexShader: ShaderChunk$1[ 'shadow_vert' ], fragmentShader: ShaderChunk$1[ 'shadow_frag' ] } ); this.lights = true; this.transparent = true; Object.defineProperties( this, { opacity: { enumerable: true, get: function () { return this.uniforms.opacity.value; }, set: function ( value ) { this.uniforms.opacity.value = value; } } } ); this.setValues( parameters ); } ShadowMaterial$1.prototype = Object.create( ShaderMaterial$1.prototype ); ShadowMaterial$1.prototype.constructor = ShadowMaterial$1; ShadowMaterial$1.prototype.isShadowMaterial = true; /** * @author mrdoob / http://mrdoob.com/ */ function RawShaderMaterial$1( parameters ) { ShaderMaterial$1.call( this, parameters ); this.type = 'RawShaderMaterial'; } RawShaderMaterial$1.prototype = Object.create( ShaderMaterial$1.prototype ); RawShaderMaterial$1.prototype.constructor = RawShaderMaterial$1; RawShaderMaterial$1.prototype.isRawShaderMaterial = true; /** * @author WestLangley / http://github.com/WestLangley * * parameters = { * color: , * roughness: , * metalness: , * opacity: , * * map: new THREE.Texture( ), * * lightMap: new THREE.Texture( ), * lightMapIntensity: * * aoMap: new THREE.Texture( ), * aoMapIntensity: * * emissive: , * emissiveIntensity: * emissiveMap: new THREE.Texture( ), * * bumpMap: new THREE.Texture( ), * bumpScale: , * * normalMap: new THREE.Texture( ), * normalScale: , * * displacementMap: new THREE.Texture( ), * displacementScale: , * displacementBias: , * * roughnessMap: new THREE.Texture( ), * * metalnessMap: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), * envMapIntensity: * * refractionRatio: , * * wireframe: , * wireframeLinewidth: , * * skinning: , * morphTargets: , * morphNormals: * } */ function MeshStandardMaterial$1( parameters ) { Material$1.call( this ); this.defines = { 'STANDARD': '' }; this.type = 'MeshStandardMaterial'; this.color = new Color$1( 0xffffff ); // diffuse this.roughness = 0.5; this.metalness = 0.5; this.map = null; this.lightMap = null; this.lightMapIntensity = 1.0; this.aoMap = null; this.aoMapIntensity = 1.0; this.emissive = new Color$1( 0x000000 ); this.emissiveIntensity = 1.0; this.emissiveMap = null; this.bumpMap = null; this.bumpScale = 1; this.normalMap = null; this.normalScale = new Vector2$1( 1, 1 ); this.displacementMap = null; this.displacementScale = 1; this.displacementBias = 0; this.roughnessMap = null; this.metalnessMap = null; this.alphaMap = null; this.envMap = null; this.envMapIntensity = 1.0; this.refractionRatio = 0.98; this.wireframe = false; this.wireframeLinewidth = 1; this.wireframeLinecap = 'round'; this.wireframeLinejoin = 'round'; this.skinning = false; this.morphTargets = false; this.morphNormals = false; this.setValues( parameters ); } MeshStandardMaterial$1.prototype = Object.create( Material$1.prototype ); MeshStandardMaterial$1.prototype.constructor = MeshStandardMaterial$1; MeshStandardMaterial$1.prototype.isMeshStandardMaterial = true; MeshStandardMaterial$1.prototype.copy = function ( source ) { Material$1.prototype.copy.call( this, source ); this.defines = { 'STANDARD': '' }; this.color.copy( source.color ); this.roughness = source.roughness; this.metalness = source.metalness; this.map = source.map; this.lightMap = source.lightMap; this.lightMapIntensity = source.lightMapIntensity; this.aoMap = source.aoMap; this.aoMapIntensity = source.aoMapIntensity; this.emissive.copy( source.emissive ); this.emissiveMap = source.emissiveMap; this.emissiveIntensity = source.emissiveIntensity; this.bumpMap = source.bumpMap; this.bumpScale = source.bumpScale; this.normalMap = source.normalMap; this.normalScale.copy( source.normalScale ); this.displacementMap = source.displacementMap; this.displacementScale = source.displacementScale; this.displacementBias = source.displacementBias; this.roughnessMap = source.roughnessMap; this.metalnessMap = source.metalnessMap; this.alphaMap = source.alphaMap; this.envMap = source.envMap; this.envMapIntensity = source.envMapIntensity; this.refractionRatio = source.refractionRatio; this.wireframe = source.wireframe; this.wireframeLinewidth = source.wireframeLinewidth; this.wireframeLinecap = source.wireframeLinecap; this.wireframeLinejoin = source.wireframeLinejoin; this.skinning = source.skinning; this.morphTargets = source.morphTargets; this.morphNormals = source.morphNormals; return this; }; /** * @author WestLangley / http://github.com/WestLangley * * parameters = { * reflectivity: * } */ function MeshPhysicalMaterial$1( parameters ) { MeshStandardMaterial$1.call( this ); this.defines = { 'PHYSICAL': '' }; this.type = 'MeshPhysicalMaterial'; this.reflectivity = 0.5; // maps to F0 = 0.04 this.clearCoat = 0.0; this.clearCoatRoughness = 0.0; this.setValues( parameters ); } MeshPhysicalMaterial$1.prototype = Object.create( MeshStandardMaterial$1.prototype ); MeshPhysicalMaterial$1.prototype.constructor = MeshPhysicalMaterial$1; MeshPhysicalMaterial$1.prototype.isMeshPhysicalMaterial = true; MeshPhysicalMaterial$1.prototype.copy = function ( source ) { MeshStandardMaterial$1.prototype.copy.call( this, source ); this.defines = { 'PHYSICAL': '' }; this.reflectivity = source.reflectivity; this.clearCoat = source.clearCoat; this.clearCoatRoughness = source.clearCoatRoughness; return this; }; /** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ * * parameters = { * color: , * specular: , * shininess: , * opacity: , * * map: new THREE.Texture( ), * * lightMap: new THREE.Texture( ), * lightMapIntensity: * * aoMap: new THREE.Texture( ), * aoMapIntensity: * * emissive: , * emissiveIntensity: * emissiveMap: new THREE.Texture( ), * * bumpMap: new THREE.Texture( ), * bumpScale: , * * normalMap: new THREE.Texture( ), * normalScale: , * * displacementMap: new THREE.Texture( ), * displacementScale: , * displacementBias: , * * specularMap: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), * combine: THREE.Multiply, * reflectivity: , * refractionRatio: , * * wireframe: , * wireframeLinewidth: , * * skinning: , * morphTargets: , * morphNormals: * } */ function MeshPhongMaterial$1( parameters ) { Material$1.call( this ); this.type = 'MeshPhongMaterial'; this.color = new Color$1( 0xffffff ); // diffuse this.specular = new Color$1( 0x111111 ); this.shininess = 30; this.map = null; this.lightMap = null; this.lightMapIntensity = 1.0; this.aoMap = null; this.aoMapIntensity = 1.0; this.emissive = new Color$1( 0x000000 ); this.emissiveIntensity = 1.0; this.emissiveMap = null; this.bumpMap = null; this.bumpScale = 1; this.normalMap = null; this.normalScale = new Vector2$1( 1, 1 ); this.displacementMap = null; this.displacementScale = 1; this.displacementBias = 0; this.specularMap = null; this.alphaMap = null; this.envMap = null; this.combine = MultiplyOperation$1; this.reflectivity = 1; this.refractionRatio = 0.98; this.wireframe = false; this.wireframeLinewidth = 1; this.wireframeLinecap = 'round'; this.wireframeLinejoin = 'round'; this.skinning = false; this.morphTargets = false; this.morphNormals = false; this.setValues( parameters ); } MeshPhongMaterial$1.prototype = Object.create( Material$1.prototype ); MeshPhongMaterial$1.prototype.constructor = MeshPhongMaterial$1; MeshPhongMaterial$1.prototype.isMeshPhongMaterial = true; MeshPhongMaterial$1.prototype.copy = function ( source ) { Material$1.prototype.copy.call( this, source ); this.color.copy( source.color ); this.specular.copy( source.specular ); this.shininess = source.shininess; this.map = source.map; this.lightMap = source.lightMap; this.lightMapIntensity = source.lightMapIntensity; this.aoMap = source.aoMap; this.aoMapIntensity = source.aoMapIntensity; this.emissive.copy( source.emissive ); this.emissiveMap = source.emissiveMap; this.emissiveIntensity = source.emissiveIntensity; this.bumpMap = source.bumpMap; this.bumpScale = source.bumpScale; this.normalMap = source.normalMap; this.normalScale.copy( source.normalScale ); this.displacementMap = source.displacementMap; this.displacementScale = source.displacementScale; this.displacementBias = source.displacementBias; this.specularMap = source.specularMap; this.alphaMap = source.alphaMap; this.envMap = source.envMap; this.combine = source.combine; this.reflectivity = source.reflectivity; this.refractionRatio = source.refractionRatio; this.wireframe = source.wireframe; this.wireframeLinewidth = source.wireframeLinewidth; this.wireframeLinecap = source.wireframeLinecap; this.wireframeLinejoin = source.wireframeLinejoin; this.skinning = source.skinning; this.morphTargets = source.morphTargets; this.morphNormals = source.morphNormals; return this; }; /** * @author takahirox / http://github.com/takahirox * * parameters = { * gradientMap: new THREE.Texture( ) * } */ function MeshToonMaterial$1( parameters ) { MeshPhongMaterial$1.call( this ); this.defines = { 'TOON': '' }; this.type = 'MeshToonMaterial'; this.gradientMap = null; this.setValues( parameters ); } MeshToonMaterial$1.prototype = Object.create( MeshPhongMaterial$1.prototype ); MeshToonMaterial$1.prototype.constructor = MeshToonMaterial$1; MeshToonMaterial$1.prototype.isMeshToonMaterial = true; MeshToonMaterial$1.prototype.copy = function ( source ) { MeshPhongMaterial$1.prototype.copy.call( this, source ); this.gradientMap = source.gradientMap; return this; }; /** * @author mrdoob / http://mrdoob.com/ * @author WestLangley / http://github.com/WestLangley * * parameters = { * opacity: , * * bumpMap: new THREE.Texture( ), * bumpScale: , * * normalMap: new THREE.Texture( ), * normalScale: , * * displacementMap: new THREE.Texture( ), * displacementScale: , * displacementBias: , * * wireframe: , * wireframeLinewidth: * * skinning: , * morphTargets: , * morphNormals: * } */ function MeshNormalMaterial$1( parameters ) { Material$1.call( this, parameters ); this.type = 'MeshNormalMaterial'; this.bumpMap = null; this.bumpScale = 1; this.normalMap = null; this.normalScale = new Vector2$1( 1, 1 ); this.displacementMap = null; this.displacementScale = 1; this.displacementBias = 0; this.wireframe = false; this.wireframeLinewidth = 1; this.fog = false; this.lights = false; this.skinning = false; this.morphTargets = false; this.morphNormals = false; this.setValues( parameters ); } MeshNormalMaterial$1.prototype = Object.create( Material$1.prototype ); MeshNormalMaterial$1.prototype.constructor = MeshNormalMaterial$1; MeshNormalMaterial$1.prototype.isMeshNormalMaterial = true; MeshNormalMaterial$1.prototype.copy = function ( source ) { Material$1.prototype.copy.call( this, source ); this.bumpMap = source.bumpMap; this.bumpScale = source.bumpScale; this.normalMap = source.normalMap; this.normalScale.copy( source.normalScale ); this.displacementMap = source.displacementMap; this.displacementScale = source.displacementScale; this.displacementBias = source.displacementBias; this.wireframe = source.wireframe; this.wireframeLinewidth = source.wireframeLinewidth; this.skinning = source.skinning; this.morphTargets = source.morphTargets; this.morphNormals = source.morphNormals; return this; }; /** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ * * parameters = { * color: , * opacity: , * * map: new THREE.Texture( ), * * lightMap: new THREE.Texture( ), * lightMapIntensity: * * aoMap: new THREE.Texture( ), * aoMapIntensity: * * emissive: , * emissiveIntensity: * emissiveMap: new THREE.Texture( ), * * specularMap: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), * combine: THREE.Multiply, * reflectivity: , * refractionRatio: , * * wireframe: , * wireframeLinewidth: , * * skinning: , * morphTargets: , * morphNormals: * } */ function MeshLambertMaterial$1( parameters ) { Material$1.call( this ); this.type = 'MeshLambertMaterial'; this.color = new Color$1( 0xffffff ); // diffuse this.map = null; this.lightMap = null; this.lightMapIntensity = 1.0; this.aoMap = null; this.aoMapIntensity = 1.0; this.emissive = new Color$1( 0x000000 ); this.emissiveIntensity = 1.0; this.emissiveMap = null; this.specularMap = null; this.alphaMap = null; this.envMap = null; this.combine = MultiplyOperation$1; this.reflectivity = 1; this.refractionRatio = 0.98; this.wireframe = false; this.wireframeLinewidth = 1; this.wireframeLinecap = 'round'; this.wireframeLinejoin = 'round'; this.skinning = false; this.morphTargets = false; this.morphNormals = false; this.setValues( parameters ); } MeshLambertMaterial$1.prototype = Object.create( Material$1.prototype ); MeshLambertMaterial$1.prototype.constructor = MeshLambertMaterial$1; MeshLambertMaterial$1.prototype.isMeshLambertMaterial = true; MeshLambertMaterial$1.prototype.copy = function ( source ) { Material$1.prototype.copy.call( this, source ); this.color.copy( source.color ); this.map = source.map; this.lightMap = source.lightMap; this.lightMapIntensity = source.lightMapIntensity; this.aoMap = source.aoMap; this.aoMapIntensity = source.aoMapIntensity; this.emissive.copy( source.emissive ); this.emissiveMap = source.emissiveMap; this.emissiveIntensity = source.emissiveIntensity; this.specularMap = source.specularMap; this.alphaMap = source.alphaMap; this.envMap = source.envMap; this.combine = source.combine; this.reflectivity = source.reflectivity; this.refractionRatio = source.refractionRatio; this.wireframe = source.wireframe; this.wireframeLinewidth = source.wireframeLinewidth; this.wireframeLinecap = source.wireframeLinecap; this.wireframeLinejoin = source.wireframeLinejoin; this.skinning = source.skinning; this.morphTargets = source.morphTargets; this.morphNormals = source.morphNormals; return this; }; /** * @author alteredq / http://alteredqualia.com/ * * parameters = { * color: , * opacity: , * * linewidth: , * * scale: , * dashSize: , * gapSize: * } */ function LineDashedMaterial$1( parameters ) { Material$1.call( this ); this.type = 'LineDashedMaterial'; this.color = new Color$1( 0xffffff ); this.linewidth = 1; this.scale = 1; this.dashSize = 3; this.gapSize = 1; this.lights = false; this.setValues( parameters ); } LineDashedMaterial$1.prototype = Object.create( Material$1.prototype ); LineDashedMaterial$1.prototype.constructor = LineDashedMaterial$1; LineDashedMaterial$1.prototype.isLineDashedMaterial = true; LineDashedMaterial$1.prototype.copy = function ( source ) { Material$1.prototype.copy.call( this, source ); this.color.copy( source.color ); this.linewidth = source.linewidth; this.scale = source.scale; this.dashSize = source.dashSize; this.gapSize = source.gapSize; return this; }; var Materials$1 = Object.freeze({ ShadowMaterial: ShadowMaterial$1, SpriteMaterial: SpriteMaterial$1, RawShaderMaterial: RawShaderMaterial$1, ShaderMaterial: ShaderMaterial$1, PointsMaterial: PointsMaterial$1, MeshPhysicalMaterial: MeshPhysicalMaterial$1, MeshStandardMaterial: MeshStandardMaterial$1, MeshPhongMaterial: MeshPhongMaterial$1, MeshToonMaterial: MeshToonMaterial$1, MeshNormalMaterial: MeshNormalMaterial$1, MeshLambertMaterial: MeshLambertMaterial$1, MeshDepthMaterial: MeshDepthMaterial$1, MeshBasicMaterial: MeshBasicMaterial$1, LineDashedMaterial: LineDashedMaterial$1, LineBasicMaterial: LineBasicMaterial$1, Material: Material$1 }); /** * @author mrdoob / http://mrdoob.com/ */ var Cache$1 = { enabled: false, files: {}, add: function ( key, file ) { if ( this.enabled === false ) return; // console.log( 'THREE.Cache', 'Adding key:', key ); this.files[ key ] = file; }, get: function ( key ) { if ( this.enabled === false ) return; // console.log( 'THREE.Cache', 'Checking key:', key ); return this.files[ key ]; }, remove: function ( key ) { delete this.files[ key ]; }, clear: function () { this.files = {}; } }; /** * @author mrdoob / http://mrdoob.com/ */ function LoadingManager$1( onLoad, onProgress, onError ) { var scope = this; var isLoading = false, itemsLoaded = 0, itemsTotal = 0; this.onStart = undefined; this.onLoad = onLoad; this.onProgress = onProgress; this.onError = onError; this.itemStart = function ( url ) { itemsTotal ++; if ( isLoading === false ) { if ( scope.onStart !== undefined ) { scope.onStart( url, itemsLoaded, itemsTotal ); } } isLoading = true; }; this.itemEnd = function ( url ) { itemsLoaded ++; if ( scope.onProgress !== undefined ) { scope.onProgress( url, itemsLoaded, itemsTotal ); } if ( itemsLoaded === itemsTotal ) { isLoading = false; if ( scope.onLoad !== undefined ) { scope.onLoad(); } } }; this.itemError = function ( url ) { if ( scope.onError !== undefined ) { scope.onError( url ); } }; } var DefaultLoadingManager$1 = new LoadingManager$1(); /** * @author mrdoob / http://mrdoob.com/ */ function FileLoader$1( manager ) { this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager$1; } Object.assign( FileLoader$1.prototype, { load: function ( url, onLoad, onProgress, onError ) { if ( url === undefined ) url = ''; if ( this.path !== undefined ) url = this.path + url; var scope = this; var cached = Cache$1.get( url ); if ( cached !== undefined ) { scope.manager.itemStart( url ); setTimeout( function () { if ( onLoad ) onLoad( cached ); scope.manager.itemEnd( url ); }, 0 ); return cached; } // Check for data: URI var dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/; var dataUriRegexResult = url.match( dataUriRegex ); // Safari can not handle Data URIs through XMLHttpRequest so process manually if ( dataUriRegexResult ) { var mimeType = dataUriRegexResult[ 1 ]; var isBase64 = !! dataUriRegexResult[ 2 ]; var data = dataUriRegexResult[ 3 ]; data = window.decodeURIComponent( data ); if ( isBase64 ) data = window.atob( data ); try { var response; var responseType = ( this.responseType || '' ).toLowerCase(); switch ( responseType ) { case 'arraybuffer': case 'blob': response = new ArrayBuffer( data.length ); var view = new Uint8Array( response ); for ( var i = 0; i < data.length; i ++ ) { view[ i ] = data.charCodeAt( i ); } if ( responseType === 'blob' ) { response = new Blob( [ response ], { type: mimeType } ); } break; case 'document': var parser = new DOMParser(); response = parser.parseFromString( data, mimeType ); break; case 'json': response = JSON.parse( data ); break; default: // 'text' or other response = data; break; } // Wait for next browser tick window.setTimeout( function () { if ( onLoad ) onLoad( response ); scope.manager.itemEnd( url ); }, 0 ); } catch ( error ) { // Wait for next browser tick window.setTimeout( function () { if ( onError ) onError( error ); scope.manager.itemEnd( url ); scope.manager.itemError( url ); }, 0 ); } } else { var request = new XMLHttpRequest(); request.open( 'GET', url, true ); request.addEventListener( 'load', function ( event ) { var response = event.target.response; Cache$1.add( url, response ); if ( this.status === 200 ) { if ( onLoad ) onLoad( response ); scope.manager.itemEnd( url ); } else if ( this.status === 0 ) { // Some browsers return HTTP Status 0 when using non-http protocol // e.g. 'file://' or 'data://'. Handle as success. console.warn( 'THREE.FileLoader: HTTP Status 0 received.' ); if ( onLoad ) onLoad( response ); scope.manager.itemEnd( url ); } else { if ( onError ) onError( event ); scope.manager.itemEnd( url ); scope.manager.itemError( url ); } }, false ); if ( onProgress !== undefined ) { request.addEventListener( 'progress', function ( event ) { onProgress( event ); }, false ); } request.addEventListener( 'error', function ( event ) { if ( onError ) onError( event ); scope.manager.itemEnd( url ); scope.manager.itemError( url ); }, false ); if ( this.responseType !== undefined ) request.responseType = this.responseType; if ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials; if ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' ); for ( var header in this.requestHeader ) { request.setRequestHeader( header, this.requestHeader[ header ] ); } request.send( null ); } scope.manager.itemStart( url ); return request; }, setPath: function ( value ) { this.path = value; return this; }, setResponseType: function ( value ) { this.responseType = value; return this; }, setWithCredentials: function ( value ) { this.withCredentials = value; return this; }, setMimeType: function ( value ) { this.mimeType = value; return this; }, setRequestHeader: function ( value ) { this.requestHeader = value; return this; } } ); /** * @author mrdoob / http://mrdoob.com/ * * Abstract Base class to block based textures loader (dds, pvr, ...) */ function CompressedTextureLoader$1( manager ) { this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager$1; // override in sub classes this._parser = null; } Object.assign( CompressedTextureLoader$1.prototype, { load: function ( url, onLoad, onProgress, onError ) { var scope = this; var images = []; var texture = new CompressedTexture$1(); texture.image = images; var loader = new FileLoader$1( this.manager ); loader.setPath( this.path ); loader.setResponseType( 'arraybuffer' ); function loadTexture( i ) { loader.load( url[ i ], function ( buffer ) { var texDatas = scope._parser( buffer, true ); images[ i ] = { width: texDatas.width, height: texDatas.height, format: texDatas.format, mipmaps: texDatas.mipmaps }; loaded += 1; if ( loaded === 6 ) { if ( texDatas.mipmapCount === 1 ) texture.minFilter = LinearFilter$1; texture.format = texDatas.format; texture.needsUpdate = true; if ( onLoad ) onLoad( texture ); } }, onProgress, onError ); } if ( Array.isArray( url ) ) { var loaded = 0; for ( var i = 0, il = url.length; i < il; ++ i ) { loadTexture( i ); } } else { // compressed cubemap texture stored in a single DDS file loader.load( url, function ( buffer ) { var texDatas = scope._parser( buffer, true ); if ( texDatas.isCubemap ) { var faces = texDatas.mipmaps.length / texDatas.mipmapCount; for ( var f = 0; f < faces; f ++ ) { images[ f ] = { mipmaps : [] }; for ( var i = 0; i < texDatas.mipmapCount; i ++ ) { images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] ); images[ f ].format = texDatas.format; images[ f ].width = texDatas.width; images[ f ].height = texDatas.height; } } } else { texture.image.width = texDatas.width; texture.image.height = texDatas.height; texture.mipmaps = texDatas.mipmaps; } if ( texDatas.mipmapCount === 1 ) { texture.minFilter = LinearFilter$1; } texture.format = texDatas.format; texture.needsUpdate = true; if ( onLoad ) onLoad( texture ); }, onProgress, onError ); } return texture; }, setPath: function ( value ) { this.path = value; return this; } } ); /** * @author Nikos M. / https://github.com/foo123/ * * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...) */ function DataTextureLoader$1( manager ) { this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager$1; // override in sub classes this._parser = null; } Object.assign( DataTextureLoader$1.prototype, { load: function ( url, onLoad, onProgress, onError ) { var scope = this; var texture = new DataTexture$1(); var loader = new FileLoader$1( this.manager ); loader.setResponseType( 'arraybuffer' ); loader.load( url, function ( buffer ) { var texData = scope._parser( buffer ); if ( ! texData ) return; if ( undefined !== texData.image ) { texture.image = texData.image; } else if ( undefined !== texData.data ) { texture.image.width = texData.width; texture.image.height = texData.height; texture.image.data = texData.data; } texture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping$1; texture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping$1; texture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter$1; texture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter$1; texture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1; if ( undefined !== texData.format ) { texture.format = texData.format; } if ( undefined !== texData.type ) { texture.type = texData.type; } if ( undefined !== texData.mipmaps ) { texture.mipmaps = texData.mipmaps; } if ( 1 === texData.mipmapCount ) { texture.minFilter = LinearFilter$1; } texture.needsUpdate = true; if ( onLoad ) onLoad( texture, texData ); }, onProgress, onError ); return texture; } } ); /** * @author mrdoob / http://mrdoob.com/ */ function ImageLoader$1( manager ) { this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager$1; } Object.assign( ImageLoader$1.prototype, { load: function ( url, onLoad, onProgress, onError ) { if ( url === undefined ) url = ''; if ( this.path !== undefined ) url = this.path + url; var scope = this; var cached = Cache$1.get( url ); if ( cached !== undefined ) { scope.manager.itemStart( url ); setTimeout( function () { if ( onLoad ) onLoad( cached ); scope.manager.itemEnd( url ); }, 0 ); return cached; } var image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' ); image.addEventListener( 'load', function () { Cache$1.add( url, this ); if ( onLoad ) onLoad( this ); scope.manager.itemEnd( url ); }, false ); /* image.addEventListener( 'progress', function ( event ) { if ( onProgress ) onProgress( event ); }, false ); */ image.addEventListener( 'error', function ( event ) { if ( onError ) onError( event ); scope.manager.itemEnd( url ); scope.manager.itemError( url ); }, false ); if ( url.substr( 0, 5 ) !== 'data:' ) { if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin; } scope.manager.itemStart( url ); image.src = url; return image; }, setCrossOrigin: function ( value ) { this.crossOrigin = value; return this; }, setPath: function ( value ) { this.path = value; return this; } } ); /** * @author mrdoob / http://mrdoob.com/ */ function CubeTextureLoader$1( manager ) { this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager$1; } Object.assign( CubeTextureLoader$1.prototype, { load: function ( urls, onLoad, onProgress, onError ) { var texture = new CubeTexture$1(); var loader = new ImageLoader$1( this.manager ); loader.setCrossOrigin( this.crossOrigin ); loader.setPath( this.path ); var loaded = 0; function loadTexture( i ) { loader.load( urls[ i ], function ( image ) { texture.images[ i ] = image; loaded ++; if ( loaded === 6 ) { texture.needsUpdate = true; if ( onLoad ) onLoad( texture ); } }, undefined, onError ); } for ( var i = 0; i < urls.length; ++ i ) { loadTexture( i ); } return texture; }, setCrossOrigin: function ( value ) { this.crossOrigin = value; return this; }, setPath: function ( value ) { this.path = value; return this; } } ); /** * @author mrdoob / http://mrdoob.com/ */ function TextureLoader$1( manager ) { this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager$1; } Object.assign( TextureLoader$1.prototype, { load: function ( url, onLoad, onProgress, onError ) { var loader = new ImageLoader$1( this.manager ); loader.setCrossOrigin( this.crossOrigin ); loader.setPath( this.path ); var texture = new Texture$1(); texture.image = loader.load( url, function () { // JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB. var isJPEG = url.search( /\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\:image\/jpeg/ ) === 0; texture.format = isJPEG ? RGBFormat$1 : RGBAFormat$1; texture.needsUpdate = true; if ( onLoad !== undefined ) { onLoad( texture ); } }, onProgress, onError ); return texture; }, setCrossOrigin: function ( value ) { this.crossOrigin = value; return this; }, setPath: function ( value ) { this.path = value; return this; } } ); /** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ */ function Light$1( color, intensity ) { Object3D$1.call( this ); this.type = 'Light'; this.color = new Color$1( color ); this.intensity = intensity !== undefined ? intensity : 1; this.receiveShadow = undefined; } Light$1.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: Light$1, isLight: true, copy: function ( source ) { Object3D$1.prototype.copy.call( this, source ); this.color.copy( source.color ); this.intensity = source.intensity; return this; }, toJSON: function ( meta ) { var data = Object3D$1.prototype.toJSON.call( this, meta ); data.object.color = this.color.getHex(); data.object.intensity = this.intensity; if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex(); if ( this.distance !== undefined ) data.object.distance = this.distance; if ( this.angle !== undefined ) data.object.angle = this.angle; if ( this.decay !== undefined ) data.object.decay = this.decay; if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra; if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON(); return data; } } ); /** * @author alteredq / http://alteredqualia.com/ */ function HemisphereLight$2( skyColor, groundColor, intensity ) { Light$1.call( this, skyColor, intensity ); this.type = 'HemisphereLight'; this.castShadow = undefined; this.position.copy( Object3D$1.DefaultUp ); this.updateMatrix(); this.groundColor = new Color$1( groundColor ); } HemisphereLight$2.prototype = Object.assign( Object.create( Light$1.prototype ), { constructor: HemisphereLight$2, isHemisphereLight: true, copy: function ( source ) { Light$1.prototype.copy.call( this, source ); this.groundColor.copy( source.groundColor ); return this; } } ); /** * @author mrdoob / http://mrdoob.com/ */ function LightShadow$1( camera ) { this.camera = camera; this.bias = 0; this.radius = 1; this.mapSize = new Vector2$1( 512, 512 ); this.map = null; this.matrix = new Matrix4$1(); } Object.assign( LightShadow$1.prototype, { copy: function ( source ) { this.camera = source.camera.clone(); this.bias = source.bias; this.radius = source.radius; this.mapSize.copy( source.mapSize ); return this; }, clone: function () { return new this.constructor().copy( this ); }, toJSON: function () { var object = {}; if ( this.bias !== 0 ) object.bias = this.bias; if ( this.radius !== 1 ) object.radius = this.radius; if ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray(); object.camera = this.camera.toJSON( false ).object; delete object.camera.matrix; return object; } } ); /** * @author mrdoob / http://mrdoob.com/ */ function SpotLightShadow$1() { LightShadow$1.call( this, new PerspectiveCamera$2( 50, 1, 0.5, 500 ) ); } SpotLightShadow$1.prototype = Object.assign( Object.create( LightShadow$1.prototype ), { constructor: SpotLightShadow$1, isSpotLightShadow: true, update: function ( light ) { var camera = this.camera; var fov = _Math$1.RAD2DEG * 2 * light.angle; var aspect = this.mapSize.width / this.mapSize.height; var far = light.distance || camera.far; if ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) { camera.fov = fov; camera.aspect = aspect; camera.far = far; camera.updateProjectionMatrix(); } } } ); /** * @author alteredq / http://alteredqualia.com/ */ function SpotLight$2( color, intensity, distance, angle, penumbra, decay ) { Light$1.call( this, color, intensity ); this.type = 'SpotLight'; this.position.copy( Object3D$1.DefaultUp ); this.updateMatrix(); this.target = new Object3D$1(); Object.defineProperty( this, 'power', { get: function () { // intensity = power per solid angle. // ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf return this.intensity * Math.PI; }, set: function ( power ) { // intensity = power per solid angle. // ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf this.intensity = power / Math.PI; } } ); this.distance = ( distance !== undefined ) ? distance : 0; this.angle = ( angle !== undefined ) ? angle : Math.PI / 3; this.penumbra = ( penumbra !== undefined ) ? penumbra : 0; this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. this.shadow = new SpotLightShadow$1(); } SpotLight$2.prototype = Object.assign( Object.create( Light$1.prototype ), { constructor: SpotLight$2, isSpotLight: true, copy: function ( source ) { Light$1.prototype.copy.call( this, source ); this.distance = source.distance; this.angle = source.angle; this.penumbra = source.penumbra; this.decay = source.decay; this.target = source.target.clone(); this.shadow = source.shadow.clone(); return this; } } ); /** * @author mrdoob / http://mrdoob.com/ */ function PointLight$2( color, intensity, distance, decay ) { Light$1.call( this, color, intensity ); this.type = 'PointLight'; Object.defineProperty( this, 'power', { get: function () { // intensity = power per solid angle. // ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf return this.intensity * 4 * Math.PI; }, set: function ( power ) { // intensity = power per solid angle. // ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf this.intensity = power / ( 4 * Math.PI ); } } ); this.distance = ( distance !== undefined ) ? distance : 0; this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. this.shadow = new LightShadow$1( new PerspectiveCamera$2( 90, 1, 0.5, 500 ) ); } PointLight$2.prototype = Object.assign( Object.create( Light$1.prototype ), { constructor: PointLight$2, isPointLight: true, copy: function ( source ) { Light$1.prototype.copy.call( this, source ); this.distance = source.distance; this.decay = source.decay; this.shadow = source.shadow.clone(); return this; } } ); /** * @author mrdoob / http://mrdoob.com/ */ function DirectionalLightShadow$1( ) { LightShadow$1.call( this, new OrthographicCamera$2( - 5, 5, 5, - 5, 0.5, 500 ) ); } DirectionalLightShadow$1.prototype = Object.assign( Object.create( LightShadow$1.prototype ), { constructor: DirectionalLightShadow$1 } ); /** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ */ function DirectionalLight$2( color, intensity ) { Light$1.call( this, color, intensity ); this.type = 'DirectionalLight'; this.position.copy( Object3D$1.DefaultUp ); this.updateMatrix(); this.target = new Object3D$1(); this.shadow = new DirectionalLightShadow$1(); } DirectionalLight$2.prototype = Object.assign( Object.create( Light$1.prototype ), { constructor: DirectionalLight$2, isDirectionalLight: true, copy: function ( source ) { Light$1.prototype.copy.call( this, source ); this.target = source.target.clone(); this.shadow = source.shadow.clone(); return this; } } ); /** * @author mrdoob / http://mrdoob.com/ */ function AmbientLight$2( color, intensity ) { Light$1.call( this, color, intensity ); this.type = 'AmbientLight'; this.castShadow = undefined; } AmbientLight$2.prototype = Object.assign( Object.create( Light$1.prototype ), { constructor: AmbientLight$2, isAmbientLight: true } ); /** * @author abelnation / http://github.com/abelnation */ function RectAreaLight$1( color, intensity, width, height ) { Light$1.call( this, color, intensity ); this.type = 'RectAreaLight'; this.position.set( 0, 1, 0 ); this.updateMatrix(); this.width = ( width !== undefined ) ? width : 10; this.height = ( height !== undefined ) ? height : 10; // TODO (abelnation): distance/decay // TODO (abelnation): update method for RectAreaLight to update transform to lookat target // TODO (abelnation): shadows } // TODO (abelnation): RectAreaLight update when light shape is changed RectAreaLight$1.prototype = Object.assign( Object.create( Light$1.prototype ), { constructor: RectAreaLight$1, isRectAreaLight: true, copy: function ( source ) { Light$1.prototype.copy.call( this, source ); this.width = source.width; this.height = source.height; return this; }, toJSON: function ( meta ) { var data = Light$1.prototype.toJSON.call( this, meta ); data.object.width = this.width; data.object.height = this.height; return data; } } ); /** * @author tschw * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ */ var AnimationUtils$1 = { // same as Array.prototype.slice, but also works on typed arrays arraySlice: function ( array, from, to ) { if ( AnimationUtils$1.isTypedArray( array ) ) { // in ios9 array.subarray(from, undefined) will return empty array // but array.subarray(from) or array.subarray(from, len) is correct return new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) ); } return array.slice( from, to ); }, // converts an array to a specific type convertArray: function ( array, type, forceClone ) { if ( ! array || // let 'undefined' and 'null' pass ! forceClone && array.constructor === type ) return array; if ( typeof type.BYTES_PER_ELEMENT === 'number' ) { return new type( array ); // create typed array } return Array.prototype.slice.call( array ); // create Array }, isTypedArray: function ( object ) { return ArrayBuffer.isView( object ) && ! ( object instanceof DataView ); }, // returns an array by which times and values can be sorted getKeyframeOrder: function ( times ) { function compareTime( i, j ) { return times[ i ] - times[ j ]; } var n = times.length; var result = new Array( n ); for ( var i = 0; i !== n; ++ i ) result[ i ] = i; result.sort( compareTime ); return result; }, // uses the array previously returned by 'getKeyframeOrder' to sort data sortedArray: function ( values, stride, order ) { var nValues = values.length; var result = new values.constructor( nValues ); for ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) { var srcOffset = order[ i ] * stride; for ( var j = 0; j !== stride; ++ j ) { result[ dstOffset ++ ] = values[ srcOffset + j ]; } } return result; }, // function for parsing AOS keyframe formats flattenJSON: function ( jsonKeys, times, values, valuePropertyName ) { var i = 1, key = jsonKeys[ 0 ]; while ( key !== undefined && key[ valuePropertyName ] === undefined ) { key = jsonKeys[ i ++ ]; } if ( key === undefined ) return; // no data var value = key[ valuePropertyName ]; if ( value === undefined ) return; // no data if ( Array.isArray( value ) ) { do { value = key[ valuePropertyName ]; if ( value !== undefined ) { times.push( key.time ); values.push.apply( values, value ); // push all elements } key = jsonKeys[ i ++ ]; } while ( key !== undefined ); } else if ( value.toArray !== undefined ) { // ...assume THREE.Math-ish do { value = key[ valuePropertyName ]; if ( value !== undefined ) { times.push( key.time ); value.toArray( values, values.length ); } key = jsonKeys[ i ++ ]; } while ( key !== undefined ); } else { // otherwise push as-is do { value = key[ valuePropertyName ]; if ( value !== undefined ) { times.push( key.time ); values.push( value ); } key = jsonKeys[ i ++ ]; } while ( key !== undefined ); } } }; /** * Abstract base class of interpolants over parametric samples. * * The parameter domain is one dimensional, typically the time or a path * along a curve defined by the data. * * The sample values can have any dimensionality and derived classes may * apply special interpretations to the data. * * This class provides the interval seek in a Template Method, deferring * the actual interpolation to derived classes. * * Time complexity is O(1) for linear access crossing at most two points * and O(log N) for random access, where N is the number of positions. * * References: * * http://www.oodesign.com/template-method-pattern.html * * @author tschw */ function Interpolant$1( parameterPositions, sampleValues, sampleSize, resultBuffer ) { this.parameterPositions = parameterPositions; this._cachedIndex = 0; this.resultBuffer = resultBuffer !== undefined ? resultBuffer : new sampleValues.constructor( sampleSize ); this.sampleValues = sampleValues; this.valueSize = sampleSize; } Object.assign( Interpolant$1.prototype, { evaluate: function( t ) { var pp = this.parameterPositions, i1 = this._cachedIndex, t1 = pp[ i1 ], t0 = pp[ i1 - 1 ]; validate_interval: { seek: { var right; linear_scan: { //- See http://jsperf.com/comparison-to-undefined/3 //- slower code: //- //- if ( t >= t1 || t1 === undefined ) { forward_scan: if ( ! ( t < t1 ) ) { for ( var giveUpAt = i1 + 2; ;) { if ( t1 === undefined ) { if ( t < t0 ) break forward_scan; // after end i1 = pp.length; this._cachedIndex = i1; return this.afterEnd_( i1 - 1, t, t0 ); } if ( i1 === giveUpAt ) break; // this loop t0 = t1; t1 = pp[ ++ i1 ]; if ( t < t1 ) { // we have arrived at the sought interval break seek; } } // prepare binary search on the right side of the index right = pp.length; break linear_scan; } //- slower code: //- if ( t < t0 || t0 === undefined ) { if ( ! ( t >= t0 ) ) { // looping? var t1global = pp[ 1 ]; if ( t < t1global ) { i1 = 2; // + 1, using the scan for the details t0 = t1global; } // linear reverse scan for ( var giveUpAt = i1 - 2; ;) { if ( t0 === undefined ) { // before start this._cachedIndex = 0; return this.beforeStart_( 0, t, t1 ); } if ( i1 === giveUpAt ) break; // this loop t1 = t0; t0 = pp[ -- i1 - 1 ]; if ( t >= t0 ) { // we have arrived at the sought interval break seek; } } // prepare binary search on the left side of the index right = i1; i1 = 0; break linear_scan; } // the interval is valid break validate_interval; } // linear scan // binary search while ( i1 < right ) { var mid = ( i1 + right ) >>> 1; if ( t < pp[ mid ] ) { right = mid; } else { i1 = mid + 1; } } t1 = pp[ i1 ]; t0 = pp[ i1 - 1 ]; // check boundary cases, again if ( t0 === undefined ) { this._cachedIndex = 0; return this.beforeStart_( 0, t, t1 ); } if ( t1 === undefined ) { i1 = pp.length; this._cachedIndex = i1; return this.afterEnd_( i1 - 1, t0, t ); } } // seek this._cachedIndex = i1; this.intervalChanged_( i1, t0, t1 ); } // validate_interval return this.interpolate_( i1, t0, t, t1 ); }, settings: null, // optional, subclass-specific settings structure // Note: The indirection allows central control of many interpolants. // --- Protected interface DefaultSettings_: {}, getSettings_: function() { return this.settings || this.DefaultSettings_; }, copySampleValue_: function( index ) { // copies a sample value to the result buffer var result = this.resultBuffer, values = this.sampleValues, stride = this.valueSize, offset = index * stride; for ( var i = 0; i !== stride; ++ i ) { result[ i ] = values[ offset + i ]; } return result; }, // Template methods for derived classes: interpolate_: function( i1, t0, t, t1 ) { throw new Error( "call to abstract method" ); // implementations shall return this.resultBuffer }, intervalChanged_: function( i1, t0, t1 ) { // empty } } ); //!\ DECLARE ALIAS AFTER assign prototype ! Object.assign( Interpolant$1.prototype, { //( 0, t, t0 ), returns this.resultBuffer beforeStart_: Interpolant$1.prototype.copySampleValue_, //( N-1, tN-1, t ), returns this.resultBuffer afterEnd_: Interpolant$1.prototype.copySampleValue_, } ); /** * Fast and simple cubic spline interpolant. * * It was derived from a Hermitian construction setting the first derivative * at each sample position to the linear slope between neighboring positions * over their parameter interval. * * @author tschw */ function CubicInterpolant$1( parameterPositions, sampleValues, sampleSize, resultBuffer ) { Interpolant$1.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); this._weightPrev = -0; this._offsetPrev = -0; this._weightNext = -0; this._offsetNext = -0; } CubicInterpolant$1.prototype = Object.assign( Object.create( Interpolant$1.prototype ), { constructor: CubicInterpolant$1, DefaultSettings_: { endingStart: ZeroCurvatureEnding$1, endingEnd: ZeroCurvatureEnding$1 }, intervalChanged_: function( i1, t0, t1 ) { var pp = this.parameterPositions, iPrev = i1 - 2, iNext = i1 + 1, tPrev = pp[ iPrev ], tNext = pp[ iNext ]; if ( tPrev === undefined ) { switch ( this.getSettings_().endingStart ) { case ZeroSlopeEnding$1: // f'(t0) = 0 iPrev = i1; tPrev = 2 * t0 - t1; break; case WrapAroundEnding$1: // use the other end of the curve iPrev = pp.length - 2; tPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ]; break; default: // ZeroCurvatureEnding // f''(t0) = 0 a.k.a. Natural Spline iPrev = i1; tPrev = t1; } } if ( tNext === undefined ) { switch ( this.getSettings_().endingEnd ) { case ZeroSlopeEnding$1: // f'(tN) = 0 iNext = i1; tNext = 2 * t1 - t0; break; case WrapAroundEnding$1: // use the other end of the curve iNext = 1; tNext = t1 + pp[ 1 ] - pp[ 0 ]; break; default: // ZeroCurvatureEnding // f''(tN) = 0, a.k.a. Natural Spline iNext = i1 - 1; tNext = t0; } } var halfDt = ( t1 - t0 ) * 0.5, stride = this.valueSize; this._weightPrev = halfDt / ( t0 - tPrev ); this._weightNext = halfDt / ( tNext - t1 ); this._offsetPrev = iPrev * stride; this._offsetNext = iNext * stride; }, interpolate_: function( i1, t0, t, t1 ) { var result = this.resultBuffer, values = this.sampleValues, stride = this.valueSize, o1 = i1 * stride, o0 = o1 - stride, oP = this._offsetPrev, oN = this._offsetNext, wP = this._weightPrev, wN = this._weightNext, p = ( t - t0 ) / ( t1 - t0 ), pp = p * p, ppp = pp * p; // evaluate polynomials var sP = - wP * ppp + 2 * wP * pp - wP * p; var s0 = ( 1 + wP ) * ppp + (-1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1; var s1 = (-1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p; var sN = wN * ppp - wN * pp; // combine data linearly for ( var i = 0; i !== stride; ++ i ) { result[ i ] = sP * values[ oP + i ] + s0 * values[ o0 + i ] + s1 * values[ o1 + i ] + sN * values[ oN + i ]; } return result; } } ); /** * @author tschw */ function LinearInterpolant$1( parameterPositions, sampleValues, sampleSize, resultBuffer ) { Interpolant$1.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); } LinearInterpolant$1.prototype = Object.assign( Object.create( Interpolant$1.prototype ), { constructor: LinearInterpolant$1, interpolate_: function( i1, t0, t, t1 ) { var result = this.resultBuffer, values = this.sampleValues, stride = this.valueSize, offset1 = i1 * stride, offset0 = offset1 - stride, weight1 = ( t - t0 ) / ( t1 - t0 ), weight0 = 1 - weight1; for ( var i = 0; i !== stride; ++ i ) { result[ i ] = values[ offset0 + i ] * weight0 + values[ offset1 + i ] * weight1; } return result; } } ); /** * * Interpolant that evaluates to the sample value at the position preceeding * the parameter. * * @author tschw */ function DiscreteInterpolant$1( parameterPositions, sampleValues, sampleSize, resultBuffer ) { Interpolant$1.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); } DiscreteInterpolant$1.prototype = Object.assign( Object.create( Interpolant$1.prototype ), { constructor: DiscreteInterpolant$1, interpolate_: function( i1, t0, t, t1 ) { return this.copySampleValue_( i1 - 1 ); } } ); var KeyframeTrackPrototype; KeyframeTrackPrototype = { TimeBufferType: Float32Array, ValueBufferType: Float32Array, DefaultInterpolation: InterpolateLinear$1, InterpolantFactoryMethodDiscrete: function ( result ) { return new DiscreteInterpolant$1( this.times, this.values, this.getValueSize(), result ); }, InterpolantFactoryMethodLinear: function ( result ) { return new LinearInterpolant$1( this.times, this.values, this.getValueSize(), result ); }, InterpolantFactoryMethodSmooth: function ( result ) { return new CubicInterpolant$1( this.times, this.values, this.getValueSize(), result ); }, setInterpolation: function ( interpolation ) { var factoryMethod; switch ( interpolation ) { case InterpolateDiscrete$1: factoryMethod = this.InterpolantFactoryMethodDiscrete; break; case InterpolateLinear$1: factoryMethod = this.InterpolantFactoryMethodLinear; break; case InterpolateSmooth$1: factoryMethod = this.InterpolantFactoryMethodSmooth; break; } if ( factoryMethod === undefined ) { var message = "unsupported interpolation for " + this.ValueTypeName + " keyframe track named " + this.name; if ( this.createInterpolant === undefined ) { // fall back to default, unless the default itself is messed up if ( interpolation !== this.DefaultInterpolation ) { this.setInterpolation( this.DefaultInterpolation ); } else { throw new Error( message ); // fatal, in this case } } console.warn( message ); return; } this.createInterpolant = factoryMethod; }, getInterpolation: function () { switch ( this.createInterpolant ) { case this.InterpolantFactoryMethodDiscrete: return InterpolateDiscrete$1; case this.InterpolantFactoryMethodLinear: return InterpolateLinear$1; case this.InterpolantFactoryMethodSmooth: return InterpolateSmooth$1; } }, getValueSize: function () { return this.values.length / this.times.length; }, // move all keyframes either forwards or backwards in time shift: function ( timeOffset ) { if ( timeOffset !== 0.0 ) { var times = this.times; for ( var i = 0, n = times.length; i !== n; ++ i ) { times[ i ] += timeOffset; } } return this; }, // scale all keyframe times by a factor (useful for frame <-> seconds conversions) scale: function ( timeScale ) { if ( timeScale !== 1.0 ) { var times = this.times; for ( var i = 0, n = times.length; i !== n; ++ i ) { times[ i ] *= timeScale; } } return this; }, // removes keyframes before and after animation without changing any values within the range [startTime, endTime]. // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values trim: function ( startTime, endTime ) { var times = this.times, nKeys = times.length, from = 0, to = nKeys - 1; while ( from !== nKeys && times[ from ] < startTime ) ++ from; while ( to !== - 1 && times[ to ] > endTime ) -- to; ++ to; // inclusive -> exclusive bound if ( from !== 0 || to !== nKeys ) { // empty tracks are forbidden, so keep at least one keyframe if ( from >= to ) to = Math.max( to, 1 ), from = to - 1; var stride = this.getValueSize(); this.times = AnimationUtils$1.arraySlice( times, from, to ); this.values = AnimationUtils$1. arraySlice( this.values, from * stride, to * stride ); } return this; }, // ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable validate: function () { var valid = true; var valueSize = this.getValueSize(); if ( valueSize - Math.floor( valueSize ) !== 0 ) { console.error( "invalid value size in track", this ); valid = false; } var times = this.times, values = this.values, nKeys = times.length; if ( nKeys === 0 ) { console.error( "track is empty", this ); valid = false; } var prevTime = null; for ( var i = 0; i !== nKeys; i ++ ) { var currTime = times[ i ]; if ( typeof currTime === 'number' && isNaN( currTime ) ) { console.error( "time is not a valid number", this, i, currTime ); valid = false; break; } if ( prevTime !== null && prevTime > currTime ) { console.error( "out of order keys", this, i, currTime, prevTime ); valid = false; break; } prevTime = currTime; } if ( values !== undefined ) { if ( AnimationUtils$1.isTypedArray( values ) ) { for ( var i = 0, n = values.length; i !== n; ++ i ) { var value = values[ i ]; if ( isNaN( value ) ) { console.error( "value is not a valid number", this, i, value ); valid = false; break; } } } } return valid; }, // removes equivalent sequential keys as common in morph target sequences // (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0) optimize: function () { var times = this.times, values = this.values, stride = this.getValueSize(), smoothInterpolation = this.getInterpolation() === InterpolateSmooth$1, writeIndex = 1, lastIndex = times.length - 1; for ( var i = 1; i < lastIndex; ++ i ) { var keep = false; var time = times[ i ]; var timeNext = times[ i + 1 ]; // remove adjacent keyframes scheduled at the same time if ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) { if ( ! smoothInterpolation ) { // remove unnecessary keyframes same as their neighbors var offset = i * stride, offsetP = offset - stride, offsetN = offset + stride; for ( var j = 0; j !== stride; ++ j ) { var value = values[ offset + j ]; if ( value !== values[ offsetP + j ] || value !== values[ offsetN + j ] ) { keep = true; break; } } } else keep = true; } // in-place compaction if ( keep ) { if ( i !== writeIndex ) { times[ writeIndex ] = times[ i ]; var readOffset = i * stride, writeOffset = writeIndex * stride; for ( var j = 0; j !== stride; ++ j ) values[ writeOffset + j ] = values[ readOffset + j ]; } ++ writeIndex; } } // flush last keyframe (compaction looks ahead) if ( lastIndex > 0 ) { times[ writeIndex ] = times[ lastIndex ]; for ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) values[ writeOffset + j ] = values[ readOffset + j ]; ++ writeIndex; } if ( writeIndex !== times.length ) { this.times = AnimationUtils$1.arraySlice( times, 0, writeIndex ); this.values = AnimationUtils$1.arraySlice( values, 0, writeIndex * stride ); } return this; } }; function KeyframeTrackConstructor( name, times, values, interpolation ) { if ( name === undefined ) throw new Error( "track name is undefined" ); if ( times === undefined || times.length === 0 ) { throw new Error( "no keyframes in track named " + name ); } this.name = name; this.times = AnimationUtils$1.convertArray( times, this.TimeBufferType ); this.values = AnimationUtils$1.convertArray( values, this.ValueBufferType ); this.setInterpolation( interpolation || this.DefaultInterpolation ); this.validate(); this.optimize(); } /** * * A Track of vectored keyframe values. * * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ * @author tschw */ function VectorKeyframeTrack$1( name, times, values, interpolation ) { KeyframeTrackConstructor.call( this, name, times, values, interpolation ); } VectorKeyframeTrack$1.prototype = Object.assign( Object.create( KeyframeTrackPrototype ), { constructor: VectorKeyframeTrack$1, ValueTypeName: 'vector' // ValueBufferType is inherited // DefaultInterpolation is inherited } ); /** * Spherical linear unit quaternion interpolant. * * @author tschw */ function QuaternionLinearInterpolant$1( parameterPositions, sampleValues, sampleSize, resultBuffer ) { Interpolant$1.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); } QuaternionLinearInterpolant$1.prototype = Object.assign( Object.create( Interpolant$1.prototype ), { constructor: QuaternionLinearInterpolant$1, interpolate_: function( i1, t0, t, t1 ) { var result = this.resultBuffer, values = this.sampleValues, stride = this.valueSize, offset = i1 * stride, alpha = ( t - t0 ) / ( t1 - t0 ); for ( var end = offset + stride; offset !== end; offset += 4 ) { Quaternion$1.slerpFlat( result, 0, values, offset - stride, values, offset, alpha ); } return result; } } ); /** * * A Track of quaternion keyframe values. * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ * @author tschw */ function QuaternionKeyframeTrack$1( name, times, values, interpolation ) { KeyframeTrackConstructor.call( this, name, times, values, interpolation ); } QuaternionKeyframeTrack$1.prototype = Object.assign( Object.create( KeyframeTrackPrototype ), { constructor: QuaternionKeyframeTrack$1, ValueTypeName: 'quaternion', // ValueBufferType is inherited DefaultInterpolation: InterpolateLinear$1, InterpolantFactoryMethodLinear: function( result ) { return new QuaternionLinearInterpolant$1( this.times, this.values, this.getValueSize(), result ); }, InterpolantFactoryMethodSmooth: undefined // not yet implemented } ); /** * * A Track of numeric keyframe values. * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ * @author tschw */ function NumberKeyframeTrack$1( name, times, values, interpolation ) { KeyframeTrackConstructor.call( this, name, times, values, interpolation ); } NumberKeyframeTrack$1.prototype = Object.assign( Object.create( KeyframeTrackPrototype ), { constructor: NumberKeyframeTrack$1, ValueTypeName: 'number' // ValueBufferType is inherited // DefaultInterpolation is inherited } ); /** * * A Track that interpolates Strings * * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ * @author tschw */ function StringKeyframeTrack$1( name, times, values, interpolation ) { KeyframeTrackConstructor.call( this, name, times, values, interpolation ); } StringKeyframeTrack$1.prototype = Object.assign( Object.create( KeyframeTrackPrototype ), { constructor: StringKeyframeTrack$1, ValueTypeName: 'string', ValueBufferType: Array, DefaultInterpolation: InterpolateDiscrete$1, InterpolantFactoryMethodLinear: undefined, InterpolantFactoryMethodSmooth: undefined } ); /** * * A Track of Boolean keyframe values. * * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ * @author tschw */ function BooleanKeyframeTrack$1( name, times, values ) { KeyframeTrackConstructor.call( this, name, times, values ); } BooleanKeyframeTrack$1.prototype = Object.assign( Object.create( KeyframeTrackPrototype ), { constructor: BooleanKeyframeTrack$1, ValueTypeName: 'bool', ValueBufferType: Array, DefaultInterpolation: InterpolateDiscrete$1, InterpolantFactoryMethodLinear: undefined, InterpolantFactoryMethodSmooth: undefined // Note: Actually this track could have a optimized / compressed // representation of a single value and a custom interpolant that // computes "firstValue ^ isOdd( index )". } ); /** * * A Track of keyframe values that represent color. * * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ * @author tschw */ function ColorKeyframeTrack$1( name, times, values, interpolation ) { KeyframeTrackConstructor.call( this, name, times, values, interpolation ); } ColorKeyframeTrack$1.prototype = Object.assign( Object.create( KeyframeTrackPrototype ), { constructor: ColorKeyframeTrack$1, ValueTypeName: 'color' // ValueBufferType is inherited // DefaultInterpolation is inherited // Note: Very basic implementation and nothing special yet. // However, this is the place for color space parameterization. } ); /** * * A timed sequence of keyframes for a specific property. * * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ * @author tschw */ function KeyframeTrack$1( name, times, values, interpolation ) { KeyframeTrackConstructor.apply( this, arguments ); } KeyframeTrack$1.prototype = KeyframeTrackPrototype; KeyframeTrackPrototype.constructor = KeyframeTrack$1; // Static methods: Object.assign( KeyframeTrack$1, { // Serialization (in static context, because of constructor invocation // and automatic invocation of .toJSON): parse: function( json ) { if( json.type === undefined ) { throw new Error( "track type undefined, can not parse" ); } var trackType = KeyframeTrack$1._getTrackTypeForValueTypeName( json.type ); if ( json.times === undefined ) { var times = [], values = []; AnimationUtils$1.flattenJSON( json.keys, times, values, 'value' ); json.times = times; json.values = values; } // derived classes can define a static parse method if ( trackType.parse !== undefined ) { return trackType.parse( json ); } else { // by default, we asssume a constructor compatible with the base return new trackType( json.name, json.times, json.values, json.interpolation ); } }, toJSON: function( track ) { var trackType = track.constructor; var json; // derived classes can define a static toJSON method if ( trackType.toJSON !== undefined ) { json = trackType.toJSON( track ); } else { // by default, we assume the data can be serialized as-is json = { 'name': track.name, 'times': AnimationUtils$1.convertArray( track.times, Array ), 'values': AnimationUtils$1.convertArray( track.values, Array ) }; var interpolation = track.getInterpolation(); if ( interpolation !== track.DefaultInterpolation ) { json.interpolation = interpolation; } } json.type = track.ValueTypeName; // mandatory return json; }, _getTrackTypeForValueTypeName: function( typeName ) { switch( typeName.toLowerCase() ) { case "scalar": case "double": case "float": case "number": case "integer": return NumberKeyframeTrack$1; case "vector": case "vector2": case "vector3": case "vector4": return VectorKeyframeTrack$1; case "color": return ColorKeyframeTrack$1; case "quaternion": return QuaternionKeyframeTrack$1; case "bool": case "boolean": return BooleanKeyframeTrack$1; case "string": return StringKeyframeTrack$1; } throw new Error( "Unsupported typeName: " + typeName ); } } ); /** * * Reusable set of Tracks that represent an animation. * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ */ function AnimationClip$1( name, duration, tracks ) { this.name = name; this.tracks = tracks; this.duration = ( duration !== undefined ) ? duration : - 1; this.uuid = _Math$1.generateUUID(); // this means it should figure out its duration by scanning the tracks if ( this.duration < 0 ) { this.resetDuration(); } this.optimize(); } Object.assign( AnimationClip$1, { parse: function ( json ) { var tracks = [], jsonTracks = json.tracks, frameTime = 1.0 / ( json.fps || 1.0 ); for ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) { tracks.push( KeyframeTrack$1.parse( jsonTracks[ i ] ).scale( frameTime ) ); } return new AnimationClip$1( json.name, json.duration, tracks ); }, toJSON: function ( clip ) { var tracks = [], clipTracks = clip.tracks; var json = { 'name': clip.name, 'duration': clip.duration, 'tracks': tracks }; for ( var i = 0, n = clipTracks.length; i !== n; ++ i ) { tracks.push( KeyframeTrack$1.toJSON( clipTracks[ i ] ) ); } return json; }, CreateFromMorphTargetSequence: function ( name, morphTargetSequence, fps, noLoop ) { var numMorphTargets = morphTargetSequence.length; var tracks = []; for ( var i = 0; i < numMorphTargets; i ++ ) { var times = []; var values = []; times.push( ( i + numMorphTargets - 1 ) % numMorphTargets, i, ( i + 1 ) % numMorphTargets ); values.push( 0, 1, 0 ); var order = AnimationUtils$1.getKeyframeOrder( times ); times = AnimationUtils$1.sortedArray( times, 1, order ); values = AnimationUtils$1.sortedArray( values, 1, order ); // if there is a key at the first frame, duplicate it as the // last frame as well for perfect loop. if ( ! noLoop && times[ 0 ] === 0 ) { times.push( numMorphTargets ); values.push( values[ 0 ] ); } tracks.push( new NumberKeyframeTrack$1( '.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']', times, values ).scale( 1.0 / fps ) ); } return new AnimationClip$1( name, - 1, tracks ); }, findByName: function ( objectOrClipArray, name ) { var clipArray = objectOrClipArray; if ( ! Array.isArray( objectOrClipArray ) ) { var o = objectOrClipArray; clipArray = o.geometry && o.geometry.animations || o.animations; } for ( var i = 0; i < clipArray.length; i ++ ) { if ( clipArray[ i ].name === name ) { return clipArray[ i ]; } } return null; }, CreateClipsFromMorphTargetSequences: function ( morphTargets, fps, noLoop ) { var animationToMorphTargets = {}; // tested with https://regex101.com/ on trick sequences // such flamingo_flyA_003, flamingo_run1_003, crdeath0059 var pattern = /^([\w-]*?)([\d]+)$/; // sort morph target names into animation groups based // patterns like Walk_001, Walk_002, Run_001, Run_002 for ( var i = 0, il = morphTargets.length; i < il; i ++ ) { var morphTarget = morphTargets[ i ]; var parts = morphTarget.name.match( pattern ); if ( parts && parts.length > 1 ) { var name = parts[ 1 ]; var animationMorphTargets = animationToMorphTargets[ name ]; if ( ! animationMorphTargets ) { animationToMorphTargets[ name ] = animationMorphTargets = []; } animationMorphTargets.push( morphTarget ); } } var clips = []; for ( var name in animationToMorphTargets ) { clips.push( AnimationClip$1.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) ); } return clips; }, // parse the animation.hierarchy format parseAnimation: function ( animation, bones ) { if ( ! animation ) { console.error( " no animation in JSONLoader data" ); return null; } var addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) { // only return track if there are actually keys. if ( animationKeys.length !== 0 ) { var times = []; var values = []; AnimationUtils$1.flattenJSON( animationKeys, times, values, propertyName ); // empty keys are filtered out, so check again if ( times.length !== 0 ) { destTracks.push( new trackType( trackName, times, values ) ); } } }; var tracks = []; var clipName = animation.name || 'default'; // automatic length determination in AnimationClip. var duration = animation.length || - 1; var fps = animation.fps || 30; var hierarchyTracks = animation.hierarchy || []; for ( var h = 0; h < hierarchyTracks.length; h ++ ) { var animationKeys = hierarchyTracks[ h ].keys; // skip empty tracks if ( ! animationKeys || animationKeys.length === 0 ) continue; // process morph targets in a way exactly compatible // with AnimationHandler.init( animation ) if ( animationKeys[ 0 ].morphTargets ) { // figure out all morph targets used in this track var morphTargetNames = {}; for ( var k = 0; k < animationKeys.length; k ++ ) { if ( animationKeys[ k ].morphTargets ) { for ( var m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) { morphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1; } } } // create a track for each morph target with all zero // morphTargetInfluences except for the keys in which // the morphTarget is named. for ( var morphTargetName in morphTargetNames ) { var times = []; var values = []; for ( var m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) { var animationKey = animationKeys[ k ]; times.push( animationKey.time ); values.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 ); } tracks.push( new NumberKeyframeTrack$1( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) ); } duration = morphTargetNames.length * ( fps || 1.0 ); } else { // ...assume skeletal animation var boneName = '.bones[' + bones[ h ].name + ']'; addNonemptyTrack( VectorKeyframeTrack$1, boneName + '.position', animationKeys, 'pos', tracks ); addNonemptyTrack( QuaternionKeyframeTrack$1, boneName + '.quaternion', animationKeys, 'rot', tracks ); addNonemptyTrack( VectorKeyframeTrack$1, boneName + '.scale', animationKeys, 'scl', tracks ); } } if ( tracks.length === 0 ) { return null; } var clip = new AnimationClip$1( clipName, duration, tracks ); return clip; } } ); Object.assign( AnimationClip$1.prototype, { resetDuration: function () { var tracks = this.tracks, duration = 0; for ( var i = 0, n = tracks.length; i !== n; ++ i ) { var track = this.tracks[ i ]; duration = Math.max( duration, track.times[ track.times.length - 1 ] ); } this.duration = duration; }, trim: function () { for ( var i = 0; i < this.tracks.length; i ++ ) { this.tracks[ i ].trim( 0, this.duration ); } return this; }, optimize: function () { for ( var i = 0; i < this.tracks.length; i ++ ) { this.tracks[ i ].optimize(); } return this; } } ); /** * @author mrdoob / http://mrdoob.com/ */ function MaterialLoader$1( manager ) { this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager$1; this.textures = {}; } Object.assign( MaterialLoader$1.prototype, { load: function ( url, onLoad, onProgress, onError ) { var scope = this; var loader = new FileLoader$1( scope.manager ); loader.setResponseType( 'json' ); loader.load( url, function ( json ) { onLoad( scope.parse( json ) ); }, onProgress, onError ); }, setTextures: function ( value ) { this.textures = value; }, parse: function ( json ) { var textures = this.textures; function getTexture( name ) { if ( textures[ name ] === undefined ) { console.warn( 'THREE.MaterialLoader: Undefined texture', name ); } return textures[ name ]; } var material = new Materials$1[ json.type ](); if ( json.uuid !== undefined ) material.uuid = json.uuid; if ( json.name !== undefined ) material.name = json.name; if ( json.color !== undefined ) material.color.setHex( json.color ); if ( json.roughness !== undefined ) material.roughness = json.roughness; if ( json.metalness !== undefined ) material.metalness = json.metalness; if ( json.emissive !== undefined ) material.emissive.setHex( json.emissive ); if ( json.specular !== undefined ) material.specular.setHex( json.specular ); if ( json.shininess !== undefined ) material.shininess = json.shininess; if ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat; if ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness; if ( json.uniforms !== undefined ) material.uniforms = json.uniforms; if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader; if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader; if ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors; if ( json.fog !== undefined ) material.fog = json.fog; if ( json.shading !== undefined ) material.shading = json.shading; if ( json.blending !== undefined ) material.blending = json.blending; if ( json.side !== undefined ) material.side = json.side; if ( json.opacity !== undefined ) material.opacity = json.opacity; if ( json.transparent !== undefined ) material.transparent = json.transparent; if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest; if ( json.depthTest !== undefined ) material.depthTest = json.depthTest; if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite; if ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite; if ( json.wireframe !== undefined ) material.wireframe = json.wireframe; if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth; if ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap; if ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin; if ( json.skinning !== undefined ) material.skinning = json.skinning; if ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets; // for PointsMaterial if ( json.size !== undefined ) material.size = json.size; if ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation; // maps if ( json.map !== undefined ) material.map = getTexture( json.map ); if ( json.alphaMap !== undefined ) { material.alphaMap = getTexture( json.alphaMap ); material.transparent = true; } if ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap ); if ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale; if ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap ); if ( json.normalScale !== undefined ) { var normalScale = json.normalScale; if ( Array.isArray( normalScale ) === false ) { // Blender exporter used to export a scalar. See #7459 normalScale = [ normalScale, normalScale ]; } material.normalScale = new Vector2$1().fromArray( normalScale ); } if ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap ); if ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale; if ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias; if ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap ); if ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap ); if ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap ); if ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity; if ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap ); if ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap ); if ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity; if ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap ); if ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity; if ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap ); if ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity; if ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap ); return material; } } ); /** * @author mrdoob / http://mrdoob.com/ */ function BufferGeometryLoader$1( manager ) { this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager$1; } Object.assign( BufferGeometryLoader$1.prototype, { load: function ( url, onLoad, onProgress, onError ) { var scope = this; var loader = new FileLoader$1( scope.manager ); loader.setResponseType( 'json' ); loader.load( url, function ( json ) { onLoad( scope.parse( json ) ); }, onProgress, onError ); }, parse: function ( json ) { var geometry = new BufferGeometry$1(); var index = json.data.index; if ( index !== undefined ) { var typedArray = new TYPED_ARRAYS$1[ index.type ]( index.array ); geometry.setIndex( new BufferAttribute$1( typedArray, 1 ) ); } var attributes = json.data.attributes; for ( var key in attributes ) { var attribute = attributes[ key ]; var typedArray = new TYPED_ARRAYS$1[ attribute.type ]( attribute.array ); geometry.addAttribute( key, new BufferAttribute$1( typedArray, attribute.itemSize, attribute.normalized ) ); } var groups = json.data.groups || json.data.drawcalls || json.data.offsets; if ( groups !== undefined ) { for ( var i = 0, n = groups.length; i !== n; ++ i ) { var group = groups[ i ]; geometry.addGroup( group.start, group.count, group.materialIndex ); } } var boundingSphere = json.data.boundingSphere; if ( boundingSphere !== undefined ) { var center = new Vector3$1(); if ( boundingSphere.center !== undefined ) { center.fromArray( boundingSphere.center ); } geometry.boundingSphere = new Sphere$2( center, boundingSphere.radius ); } return geometry; } } ); var TYPED_ARRAYS$1 = { Int8Array: Int8Array, Uint8Array: Uint8Array, Uint8ClampedArray: Uint8ClampedArray, Int16Array: Int16Array, Uint16Array: Uint16Array, Int32Array: Int32Array, Uint32Array: Uint32Array, Float32Array: Float32Array, Float64Array: Float64Array }; /** * @author alteredq / http://alteredqualia.com/ */ function Loader$1() { this.onLoadStart = function () {}; this.onLoadProgress = function () {}; this.onLoadComplete = function () {}; } Loader$1.Handlers = { handlers: [], add: function ( regex, loader ) { this.handlers.push( regex, loader ); }, get: function ( file ) { var handlers = this.handlers; for ( var i = 0, l = handlers.length; i < l; i += 2 ) { var regex = handlers[ i ]; var loader = handlers[ i + 1 ]; if ( regex.test( file ) ) { return loader; } } return null; } }; Object.assign( Loader$1.prototype, { crossOrigin: undefined, extractUrlBase: function ( url ) { var parts = url.split( '/' ); if ( parts.length === 1 ) return './'; parts.pop(); return parts.join( '/' ) + '/'; }, initMaterials: function ( materials, texturePath, crossOrigin ) { var array = []; for ( var i = 0; i < materials.length; ++ i ) { array[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin ); } return array; }, createMaterial: ( function () { var BlendingMode = { NoBlending: NoBlending$1, NormalBlending: NormalBlending$1, AdditiveBlending: AdditiveBlending$1, SubtractiveBlending: SubtractiveBlending$1, MultiplyBlending: MultiplyBlending$1, CustomBlending: CustomBlending$1 }; var color = new Color$1(); var textureLoader = new TextureLoader$1(); var materialLoader = new MaterialLoader$1(); return function createMaterial( m, texturePath, crossOrigin ) { // convert from old material format var textures = {}; function loadTexture( path, repeat, offset, wrap, anisotropy ) { var fullPath = texturePath + path; var loader = Loader$1.Handlers.get( fullPath ); var texture; if ( loader !== null ) { texture = loader.load( fullPath ); } else { textureLoader.setCrossOrigin( crossOrigin ); texture = textureLoader.load( fullPath ); } if ( repeat !== undefined ) { texture.repeat.fromArray( repeat ); if ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping$1; if ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping$1; } if ( offset !== undefined ) { texture.offset.fromArray( offset ); } if ( wrap !== undefined ) { if ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping$1; if ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping$1; if ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping$1; if ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping$1; } if ( anisotropy !== undefined ) { texture.anisotropy = anisotropy; } var uuid = _Math$1.generateUUID(); textures[ uuid ] = texture; return uuid; } // var json = { uuid: _Math$1.generateUUID(), type: 'MeshLambertMaterial' }; for ( var name in m ) { var value = m[ name ]; switch ( name ) { case 'DbgColor': case 'DbgIndex': case 'opticalDensity': case 'illumination': break; case 'DbgName': json.name = value; break; case 'blending': json.blending = BlendingMode[ value ]; break; case 'colorAmbient': case 'mapAmbient': console.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' ); break; case 'colorDiffuse': json.color = color.fromArray( value ).getHex(); break; case 'colorSpecular': json.specular = color.fromArray( value ).getHex(); break; case 'colorEmissive': json.emissive = color.fromArray( value ).getHex(); break; case 'specularCoef': json.shininess = value; break; case 'shading': if ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial'; if ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial'; if ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial'; break; case 'mapDiffuse': json.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy ); break; case 'mapDiffuseRepeat': case 'mapDiffuseOffset': case 'mapDiffuseWrap': case 'mapDiffuseAnisotropy': break; case 'mapEmissive': json.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy ); break; case 'mapEmissiveRepeat': case 'mapEmissiveOffset': case 'mapEmissiveWrap': case 'mapEmissiveAnisotropy': break; case 'mapLight': json.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy ); break; case 'mapLightRepeat': case 'mapLightOffset': case 'mapLightWrap': case 'mapLightAnisotropy': break; case 'mapAO': json.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy ); break; case 'mapAORepeat': case 'mapAOOffset': case 'mapAOWrap': case 'mapAOAnisotropy': break; case 'mapBump': json.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy ); break; case 'mapBumpScale': json.bumpScale = value; break; case 'mapBumpRepeat': case 'mapBumpOffset': case 'mapBumpWrap': case 'mapBumpAnisotropy': break; case 'mapNormal': json.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy ); break; case 'mapNormalFactor': json.normalScale = [ value, value ]; break; case 'mapNormalRepeat': case 'mapNormalOffset': case 'mapNormalWrap': case 'mapNormalAnisotropy': break; case 'mapSpecular': json.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy ); break; case 'mapSpecularRepeat': case 'mapSpecularOffset': case 'mapSpecularWrap': case 'mapSpecularAnisotropy': break; case 'mapMetalness': json.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy ); break; case 'mapMetalnessRepeat': case 'mapMetalnessOffset': case 'mapMetalnessWrap': case 'mapMetalnessAnisotropy': break; case 'mapRoughness': json.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy ); break; case 'mapRoughnessRepeat': case 'mapRoughnessOffset': case 'mapRoughnessWrap': case 'mapRoughnessAnisotropy': break; case 'mapAlpha': json.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy ); break; case 'mapAlphaRepeat': case 'mapAlphaOffset': case 'mapAlphaWrap': case 'mapAlphaAnisotropy': break; case 'flipSided': json.side = BackSide$1; break; case 'doubleSided': json.side = DoubleSide$1; break; case 'transparency': console.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' ); json.opacity = value; break; case 'depthTest': case 'depthWrite': case 'colorWrite': case 'opacity': case 'reflectivity': case 'transparent': case 'visible': case 'wireframe': json[ name ] = value; break; case 'vertexColors': if ( value === true ) json.vertexColors = VertexColors$1; if ( value === 'face' ) json.vertexColors = FaceColors$1; break; default: console.error( 'THREE.Loader.createMaterial: Unsupported', name, value ); break; } } if ( json.type === 'MeshBasicMaterial' ) delete json.emissive; if ( json.type !== 'MeshPhongMaterial' ) delete json.specular; if ( json.opacity < 1 ) json.transparent = true; materialLoader.setTextures( textures ); return materialLoader.parse( json ); }; } )() } ); /** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ */ function JSONLoader$1( manager ) { if ( typeof manager === 'boolean' ) { console.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' ); manager = undefined; } this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager$1; this.withCredentials = false; } Object.assign( JSONLoader$1.prototype, { load: function ( url, onLoad, onProgress, onError ) { var scope = this; var texturePath = this.texturePath && ( typeof this.texturePath === "string" ) ? this.texturePath : Loader$1.prototype.extractUrlBase( url ); var loader = new FileLoader$1( this.manager ); loader.setResponseType( 'json' ); loader.setWithCredentials( this.withCredentials ); loader.load( url, function ( json ) { var metadata = json.metadata; if ( metadata !== undefined ) { var type = metadata.type; if ( type !== undefined ) { if ( type.toLowerCase() === 'object' ) { console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' ); return; } if ( type.toLowerCase() === 'scene' ) { console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' ); return; } } } var object = scope.parse( json, texturePath ); onLoad( object.geometry, object.materials ); }, onProgress, onError ); }, setTexturePath: function ( value ) { this.texturePath = value; }, parse: ( function () { function parseModel( json, geometry ) { function isBitSet( value, position ) { return value & ( 1 << position ); } var i, j, fi, offset, zLength, colorIndex, normalIndex, uvIndex, materialIndex, type, isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor, vertex, face, faceA, faceB, hex, normal, uvLayer, uv, u, v, faces = json.faces, vertices = json.vertices, normals = json.normals, colors = json.colors, scale = json.scale, nUvLayers = 0; if ( json.uvs !== undefined ) { // disregard empty arrays for ( i = 0; i < json.uvs.length; i ++ ) { if ( json.uvs[ i ].length ) nUvLayers ++; } for ( i = 0; i < nUvLayers; i ++ ) { geometry.faceVertexUvs[ i ] = []; } } offset = 0; zLength = vertices.length; while ( offset < zLength ) { vertex = new Vector3$1(); vertex.x = vertices[ offset ++ ] * scale; vertex.y = vertices[ offset ++ ] * scale; vertex.z = vertices[ offset ++ ] * scale; geometry.vertices.push( vertex ); } offset = 0; zLength = faces.length; while ( offset < zLength ) { type = faces[ offset ++ ]; isQuad = isBitSet( type, 0 ); hasMaterial = isBitSet( type, 1 ); hasFaceVertexUv = isBitSet( type, 3 ); hasFaceNormal = isBitSet( type, 4 ); hasFaceVertexNormal = isBitSet( type, 5 ); hasFaceColor = isBitSet( type, 6 ); hasFaceVertexColor = isBitSet( type, 7 ); // console.log("type", type, "bits", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor); if ( isQuad ) { faceA = new Face3$1(); faceA.a = faces[ offset ]; faceA.b = faces[ offset + 1 ]; faceA.c = faces[ offset + 3 ]; faceB = new Face3$1(); faceB.a = faces[ offset + 1 ]; faceB.b = faces[ offset + 2 ]; faceB.c = faces[ offset + 3 ]; offset += 4; if ( hasMaterial ) { materialIndex = faces[ offset ++ ]; faceA.materialIndex = materialIndex; faceB.materialIndex = materialIndex; } // to get face <=> uv index correspondence fi = geometry.faces.length; if ( hasFaceVertexUv ) { for ( i = 0; i < nUvLayers; i ++ ) { uvLayer = json.uvs[ i ]; geometry.faceVertexUvs[ i ][ fi ] = []; geometry.faceVertexUvs[ i ][ fi + 1 ] = []; for ( j = 0; j < 4; j ++ ) { uvIndex = faces[ offset ++ ]; u = uvLayer[ uvIndex * 2 ]; v = uvLayer[ uvIndex * 2 + 1 ]; uv = new Vector2$1( u, v ); if ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv ); if ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv ); } } } if ( hasFaceNormal ) { normalIndex = faces[ offset ++ ] * 3; faceA.normal.set( normals[ normalIndex ++ ], normals[ normalIndex ++ ], normals[ normalIndex ] ); faceB.normal.copy( faceA.normal ); } if ( hasFaceVertexNormal ) { for ( i = 0; i < 4; i ++ ) { normalIndex = faces[ offset ++ ] * 3; normal = new Vector3$1( normals[ normalIndex ++ ], normals[ normalIndex ++ ], normals[ normalIndex ] ); if ( i !== 2 ) faceA.vertexNormals.push( normal ); if ( i !== 0 ) faceB.vertexNormals.push( normal ); } } if ( hasFaceColor ) { colorIndex = faces[ offset ++ ]; hex = colors[ colorIndex ]; faceA.color.setHex( hex ); faceB.color.setHex( hex ); } if ( hasFaceVertexColor ) { for ( i = 0; i < 4; i ++ ) { colorIndex = faces[ offset ++ ]; hex = colors[ colorIndex ]; if ( i !== 2 ) faceA.vertexColors.push( new Color$1( hex ) ); if ( i !== 0 ) faceB.vertexColors.push( new Color$1( hex ) ); } } geometry.faces.push( faceA ); geometry.faces.push( faceB ); } else { face = new Face3$1(); face.a = faces[ offset ++ ]; face.b = faces[ offset ++ ]; face.c = faces[ offset ++ ]; if ( hasMaterial ) { materialIndex = faces[ offset ++ ]; face.materialIndex = materialIndex; } // to get face <=> uv index correspondence fi = geometry.faces.length; if ( hasFaceVertexUv ) { for ( i = 0; i < nUvLayers; i ++ ) { uvLayer = json.uvs[ i ]; geometry.faceVertexUvs[ i ][ fi ] = []; for ( j = 0; j < 3; j ++ ) { uvIndex = faces[ offset ++ ]; u = uvLayer[ uvIndex * 2 ]; v = uvLayer[ uvIndex * 2 + 1 ]; uv = new Vector2$1( u, v ); geometry.faceVertexUvs[ i ][ fi ].push( uv ); } } } if ( hasFaceNormal ) { normalIndex = faces[ offset ++ ] * 3; face.normal.set( normals[ normalIndex ++ ], normals[ normalIndex ++ ], normals[ normalIndex ] ); } if ( hasFaceVertexNormal ) { for ( i = 0; i < 3; i ++ ) { normalIndex = faces[ offset ++ ] * 3; normal = new Vector3$1( normals[ normalIndex ++ ], normals[ normalIndex ++ ], normals[ normalIndex ] ); face.vertexNormals.push( normal ); } } if ( hasFaceColor ) { colorIndex = faces[ offset ++ ]; face.color.setHex( colors[ colorIndex ] ); } if ( hasFaceVertexColor ) { for ( i = 0; i < 3; i ++ ) { colorIndex = faces[ offset ++ ]; face.vertexColors.push( new Color$1( colors[ colorIndex ] ) ); } } geometry.faces.push( face ); } } } function parseSkin( json, geometry ) { var influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2; if ( json.skinWeights ) { for ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) { var x = json.skinWeights[ i ]; var y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0; var z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0; var w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0; geometry.skinWeights.push( new Vector4$1( x, y, z, w ) ); } } if ( json.skinIndices ) { for ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) { var a = json.skinIndices[ i ]; var b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0; var c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0; var d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0; geometry.skinIndices.push( new Vector4$1( a, b, c, d ) ); } } geometry.bones = json.bones; if ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) { console.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' + geometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' ); } } function parseMorphing( json, geometry ) { var scale = json.scale; if ( json.morphTargets !== undefined ) { for ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) { geometry.morphTargets[ i ] = {}; geometry.morphTargets[ i ].name = json.morphTargets[ i ].name; geometry.morphTargets[ i ].vertices = []; var dstVertices = geometry.morphTargets[ i ].vertices; var srcVertices = json.morphTargets[ i ].vertices; for ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) { var vertex = new Vector3$1(); vertex.x = srcVertices[ v ] * scale; vertex.y = srcVertices[ v + 1 ] * scale; vertex.z = srcVertices[ v + 2 ] * scale; dstVertices.push( vertex ); } } } if ( json.morphColors !== undefined && json.morphColors.length > 0 ) { console.warn( 'THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.' ); var faces = geometry.faces; var morphColors = json.morphColors[ 0 ].colors; for ( var i = 0, l = faces.length; i < l; i ++ ) { faces[ i ].color.fromArray( morphColors, i * 3 ); } } } function parseAnimations( json, geometry ) { var outputAnimations = []; // parse old style Bone/Hierarchy animations var animations = []; if ( json.animation !== undefined ) { animations.push( json.animation ); } if ( json.animations !== undefined ) { if ( json.animations.length ) { animations = animations.concat( json.animations ); } else { animations.push( json.animations ); } } for ( var i = 0; i < animations.length; i ++ ) { var clip = AnimationClip$1.parseAnimation( animations[ i ], geometry.bones ); if ( clip ) outputAnimations.push( clip ); } // parse implicit morph animations if ( geometry.morphTargets ) { // TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary. var morphAnimationClips = AnimationClip$1.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 ); outputAnimations = outputAnimations.concat( morphAnimationClips ); } if ( outputAnimations.length > 0 ) geometry.animations = outputAnimations; } return function ( json, texturePath ) { if ( json.data !== undefined ) { // Geometry 4.0 spec json = json.data; } if ( json.scale !== undefined ) { json.scale = 1.0 / json.scale; } else { json.scale = 1.0; } var geometry = new Geometry$1(); parseModel( json, geometry ); parseSkin( json, geometry ); parseMorphing( json, geometry ); parseAnimations( json, geometry ); geometry.computeFaceNormals(); geometry.computeBoundingSphere(); if ( json.materials === undefined || json.materials.length === 0 ) { return { geometry: geometry }; } else { var materials = Loader$1.prototype.initMaterials( json.materials, texturePath, this.crossOrigin ); return { geometry: geometry, materials: materials }; } }; } )() } ); /** * @author mrdoob / http://mrdoob.com/ */ function ObjectLoader$1( manager ) { this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager$1; this.texturePath = ''; } Object.assign( ObjectLoader$1.prototype, { load: function ( url, onLoad, onProgress, onError ) { if ( this.texturePath === '' ) { this.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 ); } var scope = this; var loader = new FileLoader$1( scope.manager ); loader.load( url, function ( text ) { var json = null; try { json = JSON.parse( text ); } catch ( error ) { if ( onError !== undefined ) onError( error ); console.error( 'THREE:ObjectLoader: Can\'t parse ' + url + '.', error.message ); return; } var metadata = json.metadata; if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) { console.error( 'THREE.ObjectLoader: Can\'t load ' + url + '. Use THREE.JSONLoader instead.' ); return; } scope.parse( json, onLoad ); }, onProgress, onError ); }, setTexturePath: function ( value ) { this.texturePath = value; }, setCrossOrigin: function ( value ) { this.crossOrigin = value; }, parse: function ( json, onLoad ) { var geometries = this.parseGeometries( json.geometries ); var images = this.parseImages( json.images, function () { if ( onLoad !== undefined ) onLoad( object ); } ); var textures = this.parseTextures( json.textures, images ); var materials = this.parseMaterials( json.materials, textures ); var object = this.parseObject( json.object, geometries, materials ); if ( json.animations ) { object.animations = this.parseAnimations( json.animations ); } if ( json.images === undefined || json.images.length === 0 ) { if ( onLoad !== undefined ) onLoad( object ); } return object; }, parseGeometries: function ( json ) { var geometries = {}; if ( json !== undefined ) { var geometryLoader = new JSONLoader$1(); var bufferGeometryLoader = new BufferGeometryLoader$1(); for ( var i = 0, l = json.length; i < l; i ++ ) { var geometry; var data = json[ i ]; switch ( data.type ) { case 'PlaneGeometry': case 'PlaneBufferGeometry': geometry = new Geometries$1[ data.type ]( data.width, data.height, data.widthSegments, data.heightSegments ); break; case 'BoxGeometry': case 'BoxBufferGeometry': case 'CubeGeometry': // backwards compatible geometry = new Geometries$1[ data.type ]( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments ); break; case 'CircleGeometry': case 'CircleBufferGeometry': geometry = new Geometries$1[ data.type ]( data.radius, data.segments, data.thetaStart, data.thetaLength ); break; case 'CylinderGeometry': case 'CylinderBufferGeometry': geometry = new Geometries$1[ data.type ]( data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength ); break; case 'ConeGeometry': case 'ConeBufferGeometry': geometry = new Geometries$1[ data.type ]( data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength ); break; case 'SphereGeometry': case 'SphereBufferGeometry': geometry = new Geometries$1[ data.type ]( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength ); break; case 'DodecahedronGeometry': case 'IcosahedronGeometry': case 'OctahedronGeometry': case 'TetrahedronGeometry': geometry = new Geometries$1[ data.type ]( data.radius, data.detail ); break; case 'RingGeometry': case 'RingBufferGeometry': geometry = new Geometries$1[ data.type ]( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength ); break; case 'TorusGeometry': case 'TorusBufferGeometry': geometry = new Geometries$1[ data.type ]( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc ); break; case 'TorusKnotGeometry': case 'TorusKnotBufferGeometry': geometry = new Geometries$1[ data.type ]( data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q ); break; case 'LatheGeometry': case 'LatheBufferGeometry': geometry = new Geometries$1[ data.type ]( data.points, data.segments, data.phiStart, data.phiLength ); break; case 'BufferGeometry': geometry = bufferGeometryLoader.parse( data ); break; case 'Geometry': geometry = geometryLoader.parse( data, this.texturePath ).geometry; break; default: console.warn( 'THREE.ObjectLoader: Unsupported geometry type "' + data.type + '"' ); continue; } geometry.uuid = data.uuid; if ( data.name !== undefined ) geometry.name = data.name; geometries[ data.uuid ] = geometry; } } return geometries; }, parseMaterials: function ( json, textures ) { var materials = {}; if ( json !== undefined ) { var loader = new MaterialLoader$1(); loader.setTextures( textures ); for ( var i = 0, l = json.length; i < l; i ++ ) { var data = json[ i ]; if ( data.type === 'MultiMaterial' ) { // Deprecated var array = []; for ( var j = 0; j < data.materials.length; j ++ ) { array.push( loader.parse( data.materials[ j ] ) ); } materials[ data.uuid ] = array; } else { materials[ data.uuid ] = loader.parse( data ); } } } return materials; }, parseAnimations: function ( json ) { var animations = []; for ( var i = 0; i < json.length; i ++ ) { var clip = AnimationClip$1.parse( json[ i ] ); animations.push( clip ); } return animations; }, parseImages: function ( json, onLoad ) { var scope = this; var images = {}; function loadImage( url ) { scope.manager.itemStart( url ); return loader.load( url, function () { scope.manager.itemEnd( url ); }, undefined, function () { scope.manager.itemEnd( url ); scope.manager.itemError( url ); } ); } if ( json !== undefined && json.length > 0 ) { var manager = new LoadingManager$1( onLoad ); var loader = new ImageLoader$1( manager ); loader.setCrossOrigin( this.crossOrigin ); for ( var i = 0, l = json.length; i < l; i ++ ) { var image = json[ i ]; var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url; images[ image.uuid ] = loadImage( path ); } } return images; }, parseTextures: function ( json, images ) { function parseConstant( value, type ) { if ( typeof( value ) === 'number' ) return value; console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value ); return type[ value ]; } var textures = {}; if ( json !== undefined ) { for ( var i = 0, l = json.length; i < l; i ++ ) { var data = json[ i ]; if ( data.image === undefined ) { console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid ); } if ( images[ data.image ] === undefined ) { console.warn( 'THREE.ObjectLoader: Undefined image', data.image ); } var texture = new Texture$1( images[ data.image ] ); texture.needsUpdate = true; texture.uuid = data.uuid; if ( data.name !== undefined ) texture.name = data.name; if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING$1 ); if ( data.offset !== undefined ) texture.offset.fromArray( data.offset ); if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat ); if ( data.wrap !== undefined ) { texture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING$1 ); texture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING$1 ); } if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER$1 ); if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER$1 ); if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy; if ( data.flipY !== undefined ) texture.flipY = data.flipY; textures[ data.uuid ] = texture; } } return textures; }, parseObject: function () { var matrix = new Matrix4$1(); return function parseObject( data, geometries, materials ) { var object; function getGeometry( name ) { if ( geometries[ name ] === undefined ) { console.warn( 'THREE.ObjectLoader: Undefined geometry', name ); } return geometries[ name ]; } function getMaterial( name ) { if ( name === undefined ) return undefined; if ( Array.isArray( name ) ) { var array = []; for ( var i = 0, l = name.length; i < l; i ++ ) { var uuid = name[ i ]; if ( materials[ uuid ] === undefined ) { console.warn( 'THREE.ObjectLoader: Undefined material', uuid ); } array.push( materials[ uuid ] ); } return array; } if ( materials[ name ] === undefined ) { console.warn( 'THREE.ObjectLoader: Undefined material', name ); } return materials[ name ]; } switch ( data.type ) { case 'Scene': object = new Scene$1(); if ( data.background !== undefined ) { if ( Number.isInteger( data.background ) ) { object.background = new Color$1( data.background ); } } if ( data.fog !== undefined ) { if ( data.fog.type === 'Fog' ) { object.fog = new Fog$1( data.fog.color, data.fog.near, data.fog.far ); } else if ( data.fog.type === 'FogExp2' ) { object.fog = new FogExp2$1( data.fog.color, data.fog.density ); } } break; case 'PerspectiveCamera': object = new PerspectiveCamera$2( data.fov, data.aspect, data.near, data.far ); if ( data.focus !== undefined ) object.focus = data.focus; if ( data.zoom !== undefined ) object.zoom = data.zoom; if ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge; if ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset; if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); break; case 'OrthographicCamera': object = new OrthographicCamera$2( data.left, data.right, data.top, data.bottom, data.near, data.far ); break; case 'AmbientLight': object = new AmbientLight$2( data.color, data.intensity ); break; case 'DirectionalLight': object = new DirectionalLight$2( data.color, data.intensity ); break; case 'PointLight': object = new PointLight$2( data.color, data.intensity, data.distance, data.decay ); break; case 'RectAreaLight': object = new RectAreaLight$1( data.color, data.intensity, data.width, data.height ); break; case 'SpotLight': object = new SpotLight$2( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay ); break; case 'HemisphereLight': object = new HemisphereLight$2( data.color, data.groundColor, data.intensity ); break; case 'SkinnedMesh': console.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.' ); case 'Mesh': var geometry = getGeometry( data.geometry ); var material = getMaterial( data.material ); if ( geometry.bones && geometry.bones.length > 0 ) { object = new SkinnedMesh$1( geometry, material ); } else { object = new Mesh$1( geometry, material ); } break; case 'LOD': object = new LOD$1(); break; case 'Line': object = new Line$2( getGeometry( data.geometry ), getMaterial( data.material ), data.mode ); break; case 'LineLoop': object = new LineLoop$1( getGeometry( data.geometry ), getMaterial( data.material ) ); break; case 'LineSegments': object = new LineSegments$1( getGeometry( data.geometry ), getMaterial( data.material ) ); break; case 'PointCloud': case 'Points': object = new Points$1( getGeometry( data.geometry ), getMaterial( data.material ) ); break; case 'Sprite': object = new Sprite$1( getMaterial( data.material ) ); break; case 'Group': object = new Group$2(); break; default: object = new Object3D$1(); } object.uuid = data.uuid; if ( data.name !== undefined ) object.name = data.name; if ( data.matrix !== undefined ) { matrix.fromArray( data.matrix ); matrix.decompose( object.position, object.quaternion, object.scale ); } else { if ( data.position !== undefined ) object.position.fromArray( data.position ); if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation ); if ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion ); if ( data.scale !== undefined ) object.scale.fromArray( data.scale ); } if ( data.castShadow !== undefined ) object.castShadow = data.castShadow; if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow; if ( data.shadow ) { if ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias; if ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius; if ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize ); if ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera ); } if ( data.visible !== undefined ) object.visible = data.visible; if ( data.userData !== undefined ) object.userData = data.userData; if ( data.children !== undefined ) { for ( var child in data.children ) { object.add( this.parseObject( data.children[ child ], geometries, materials ) ); } } if ( data.type === 'LOD' ) { var levels = data.levels; for ( var l = 0; l < levels.length; l ++ ) { var level = levels[ l ]; var child = object.getObjectByProperty( 'uuid', level.object ); if ( child !== undefined ) { object.addLevel( child, level.distance ); } } } return object; }; }() } ); var TEXTURE_MAPPING$1 = { UVMapping: UVMapping$1, CubeReflectionMapping: CubeReflectionMapping$1, CubeRefractionMapping: CubeRefractionMapping$1, EquirectangularReflectionMapping: EquirectangularReflectionMapping$1, EquirectangularRefractionMapping: EquirectangularRefractionMapping$1, SphericalReflectionMapping: SphericalReflectionMapping$1, CubeUVReflectionMapping: CubeUVReflectionMapping$1, CubeUVRefractionMapping: CubeUVRefractionMapping$1 }; var TEXTURE_WRAPPING$1 = { RepeatWrapping: RepeatWrapping$1, ClampToEdgeWrapping: ClampToEdgeWrapping$1, MirroredRepeatWrapping: MirroredRepeatWrapping$1 }; var TEXTURE_FILTER$1 = { NearestFilter: NearestFilter$1, NearestMipMapNearestFilter: NearestMipMapNearestFilter$1, NearestMipMapLinearFilter: NearestMipMapLinearFilter$1, LinearFilter: LinearFilter$1, LinearMipMapNearestFilter: LinearMipMapNearestFilter$1, LinearMipMapLinearFilter: LinearMipMapLinearFilter$1 }; /** * @author zz85 / http://www.lab4games.net/zz85/blog * * Bezier Curves formulas obtained from * http://en.wikipedia.org/wiki/Bézier_curve */ function CatmullRom$1( t, p0, p1, p2, p3 ) { var v0 = ( p2 - p0 ) * 0.5; var v1 = ( p3 - p1 ) * 0.5; var t2 = t * t; var t3 = t * t2; return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1; } // function QuadraticBezierP0$1( t, p ) { var k = 1 - t; return k * k * p; } function QuadraticBezierP1$1( t, p ) { return 2 * ( 1 - t ) * t * p; } function QuadraticBezierP2$1( t, p ) { return t * t * p; } function QuadraticBezier$1( t, p0, p1, p2 ) { return QuadraticBezierP0$1( t, p0 ) + QuadraticBezierP1$1( t, p1 ) + QuadraticBezierP2$1( t, p2 ); } // function CubicBezierP0$1( t, p ) { var k = 1 - t; return k * k * k * p; } function CubicBezierP1$1( t, p ) { var k = 1 - t; return 3 * k * k * t * p; } function CubicBezierP2$1( t, p ) { return 3 * ( 1 - t ) * t * t * p; } function CubicBezierP3$1( t, p ) { return t * t * t * p; } function CubicBezier$1( t, p0, p1, p2, p3 ) { return CubicBezierP0$1( t, p0 ) + CubicBezierP1$1( t, p1 ) + CubicBezierP2$1( t, p2 ) + CubicBezierP3$1( t, p3 ); } /** * @author zz85 / http://www.lab4games.net/zz85/blog * Extensible curve object * * Some common of curve methods: * .getPoint(t), getTangent(t) * .getPointAt(u), getTangentAt(u) * .getPoints(), .getSpacedPoints() * .getLength() * .updateArcLengths() * * This following curves inherit from THREE.Curve: * * -- 2D curves -- * THREE.ArcCurve * THREE.CubicBezierCurve * THREE.EllipseCurve * THREE.LineCurve * THREE.QuadraticBezierCurve * THREE.SplineCurve * * -- 3D curves -- * THREE.CatmullRomCurve3 * THREE.CubicBezierCurve3 * THREE.LineCurve3 * THREE.QuadraticBezierCurve3 * * A series of curves can be represented as a THREE.CurvePath. * **/ /************************************************************** * Abstract Curve base class **************************************************************/ function Curve$1() { this.arcLengthDivisions = 200; } Object.assign( Curve$1.prototype, { // Virtual base class method to overwrite and implement in subclasses // - t [0 .. 1] getPoint: function () { console.warn( 'THREE.Curve: .getPoint() not implemented.' ); return null; }, // Get point at relative position in curve according to arc length // - u [0 .. 1] getPointAt: function ( u ) { var t = this.getUtoTmapping( u ); return this.getPoint( t ); }, // Get sequence of points using getPoint( t ) getPoints: function ( divisions ) { if ( divisions === undefined ) divisions = 5; var points = []; for ( var d = 0; d <= divisions; d ++ ) { points.push( this.getPoint( d / divisions ) ); } return points; }, // Get sequence of points using getPointAt( u ) getSpacedPoints: function ( divisions ) { if ( divisions === undefined ) divisions = 5; var points = []; for ( var d = 0; d <= divisions; d ++ ) { points.push( this.getPointAt( d / divisions ) ); } return points; }, // Get total curve arc length getLength: function () { var lengths = this.getLengths(); return lengths[ lengths.length - 1 ]; }, // Get list of cumulative segment lengths getLengths: function ( divisions ) { if ( divisions === undefined ) divisions = this.arcLengthDivisions; if ( this.cacheArcLengths && ( this.cacheArcLengths.length === divisions + 1 ) && ! this.needsUpdate ) { return this.cacheArcLengths; } this.needsUpdate = false; var cache = []; var current, last = this.getPoint( 0 ); var p, sum = 0; cache.push( 0 ); for ( p = 1; p <= divisions; p ++ ) { current = this.getPoint( p / divisions ); sum += current.distanceTo( last ); cache.push( sum ); last = current; } this.cacheArcLengths = cache; return cache; // { sums: cache, sum: sum }; Sum is in the last element. }, updateArcLengths: function () { this.needsUpdate = true; this.getLengths(); }, // Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant getUtoTmapping: function ( u, distance ) { var arcLengths = this.getLengths(); var i = 0, il = arcLengths.length; var targetArcLength; // The targeted u distance value to get if ( distance ) { targetArcLength = distance; } else { targetArcLength = u * arcLengths[ il - 1 ]; } // binary search for the index with largest value smaller than target u distance var low = 0, high = il - 1, comparison; while ( low <= high ) { i = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats comparison = arcLengths[ i ] - targetArcLength; if ( comparison < 0 ) { low = i + 1; } else if ( comparison > 0 ) { high = i - 1; } else { high = i; break; // DONE } } i = high; if ( arcLengths[ i ] === targetArcLength ) { return i / ( il - 1 ); } // we could get finer grain at lengths, or use simple interpolation between two points var lengthBefore = arcLengths[ i ]; var lengthAfter = arcLengths[ i + 1 ]; var segmentLength = lengthAfter - lengthBefore; // determine where we are between the 'before' and 'after' points var segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength; // add that fractional amount to t var t = ( i + segmentFraction ) / ( il - 1 ); return t; }, // Returns a unit vector tangent at t // In case any sub curve does not implement its tangent derivation, // 2 points a small delta apart will be used to find its gradient // which seems to give a reasonable approximation getTangent: function ( t ) { var delta = 0.0001; var t1 = t - delta; var t2 = t + delta; // Capping in case of danger if ( t1 < 0 ) t1 = 0; if ( t2 > 1 ) t2 = 1; var pt1 = this.getPoint( t1 ); var pt2 = this.getPoint( t2 ); var vec = pt2.clone().sub( pt1 ); return vec.normalize(); }, getTangentAt: function ( u ) { var t = this.getUtoTmapping( u ); return this.getTangent( t ); }, computeFrenetFrames: function ( segments, closed ) { // see http://www.cs.indiana.edu/pub/techreports/TR425.pdf var normal = new Vector3$1(); var tangents = []; var normals = []; var binormals = []; var vec = new Vector3$1(); var mat = new Matrix4$1(); var i, u, theta; // compute the tangent vectors for each segment on the curve for ( i = 0; i <= segments; i ++ ) { u = i / segments; tangents[ i ] = this.getTangentAt( u ); tangents[ i ].normalize(); } // select an initial normal vector perpendicular to the first tangent vector, // and in the direction of the minimum tangent xyz component normals[ 0 ] = new Vector3$1(); binormals[ 0 ] = new Vector3$1(); var min = Number.MAX_VALUE; var tx = Math.abs( tangents[ 0 ].x ); var ty = Math.abs( tangents[ 0 ].y ); var tz = Math.abs( tangents[ 0 ].z ); if ( tx <= min ) { min = tx; normal.set( 1, 0, 0 ); } if ( ty <= min ) { min = ty; normal.set( 0, 1, 0 ); } if ( tz <= min ) { normal.set( 0, 0, 1 ); } vec.crossVectors( tangents[ 0 ], normal ).normalize(); normals[ 0 ].crossVectors( tangents[ 0 ], vec ); binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ); // compute the slowly-varying normal and binormal vectors for each segment on the curve for ( i = 1; i <= segments; i ++ ) { normals[ i ] = normals[ i - 1 ].clone(); binormals[ i ] = binormals[ i - 1 ].clone(); vec.crossVectors( tangents[ i - 1 ], tangents[ i ] ); if ( vec.length() > Number.EPSILON ) { vec.normalize(); theta = Math.acos( _Math$1.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors normals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) ); } binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); } // if the curve is closed, postprocess the vectors so the first and last normal vectors are the same if ( closed === true ) { theta = Math.acos( _Math$1.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) ); theta /= segments; if ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) { theta = - theta; } for ( i = 1; i <= segments; i ++ ) { // twist a little... normals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) ); binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); } } return { tangents: tangents, normals: normals, binormals: binormals }; } } ); function LineCurve$1( v1, v2 ) { Curve$1.call( this ); this.v1 = v1; this.v2 = v2; } LineCurve$1.prototype = Object.create( Curve$1.prototype ); LineCurve$1.prototype.constructor = LineCurve$1; LineCurve$1.prototype.isLineCurve = true; LineCurve$1.prototype.getPoint = function ( t ) { if ( t === 1 ) { return this.v2.clone(); } var point = this.v2.clone().sub( this.v1 ); point.multiplyScalar( t ).add( this.v1 ); return point; }; // Line curve is linear, so we can overwrite default getPointAt LineCurve$1.prototype.getPointAt = function ( u ) { return this.getPoint( u ); }; LineCurve$1.prototype.getTangent = function ( t ) { var tangent = this.v2.clone().sub( this.v1 ); return tangent.normalize(); }; /** * @author zz85 / http://www.lab4games.net/zz85/blog * **/ /************************************************************** * Curved Path - a curve path is simply a array of connected * curves, but retains the api of a curve **************************************************************/ function CurvePath$1() { Curve$1.call( this ); this.curves = []; this.autoClose = false; // Automatically closes the path } CurvePath$1.prototype = Object.assign( Object.create( Curve$1.prototype ), { constructor: CurvePath$1, add: function ( curve ) { this.curves.push( curve ); }, closePath: function () { // Add a line curve if start and end of lines are not connected var startPoint = this.curves[ 0 ].getPoint( 0 ); var endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 ); if ( ! startPoint.equals( endPoint ) ) { this.curves.push( new LineCurve$1( endPoint, startPoint ) ); } }, // To get accurate point with reference to // entire path distance at time t, // following has to be done: // 1. Length of each sub path have to be known // 2. Locate and identify type of curve // 3. Get t for the curve // 4. Return curve.getPointAt(t') getPoint: function ( t ) { var d = t * this.getLength(); var curveLengths = this.getCurveLengths(); var i = 0; // To think about boundaries points. while ( i < curveLengths.length ) { if ( curveLengths[ i ] >= d ) { var diff = curveLengths[ i ] - d; var curve = this.curves[ i ]; var segmentLength = curve.getLength(); var u = segmentLength === 0 ? 0 : 1 - diff / segmentLength; return curve.getPointAt( u ); } i ++; } return null; // loop where sum != 0, sum > d , sum+1 1 && !points[ points.length - 1 ].equals( points[ 0 ] ) ) { points.push( points[ 0 ] ); } return points; }, /************************************************************** * Create Geometries Helpers **************************************************************/ /// Generate geometry from path points (for Line or Points objects) createPointsGeometry: function ( divisions ) { var pts = this.getPoints( divisions ); return this.createGeometry( pts ); }, // Generate geometry from equidistant sampling along the path createSpacedPointsGeometry: function ( divisions ) { var pts = this.getSpacedPoints( divisions ); return this.createGeometry( pts ); }, createGeometry: function ( points ) { var geometry = new Geometry$1(); for ( var i = 0, l = points.length; i < l; i ++ ) { var point = points[ i ]; geometry.vertices.push( new Vector3$1( point.x, point.y, point.z || 0 ) ); } return geometry; } } ); function EllipseCurve$1( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { Curve$1.call( this ); this.aX = aX; this.aY = aY; this.xRadius = xRadius; this.yRadius = yRadius; this.aStartAngle = aStartAngle; this.aEndAngle = aEndAngle; this.aClockwise = aClockwise; this.aRotation = aRotation || 0; } EllipseCurve$1.prototype = Object.create( Curve$1.prototype ); EllipseCurve$1.prototype.constructor = EllipseCurve$1; EllipseCurve$1.prototype.isEllipseCurve = true; EllipseCurve$1.prototype.getPoint = function ( t ) { var twoPi = Math.PI * 2; var deltaAngle = this.aEndAngle - this.aStartAngle; var samePoints = Math.abs( deltaAngle ) < Number.EPSILON; // ensures that deltaAngle is 0 .. 2 PI while ( deltaAngle < 0 ) deltaAngle += twoPi; while ( deltaAngle > twoPi ) deltaAngle -= twoPi; if ( deltaAngle < Number.EPSILON ) { if ( samePoints ) { deltaAngle = 0; } else { deltaAngle = twoPi; } } if ( this.aClockwise === true && ! samePoints ) { if ( deltaAngle === twoPi ) { deltaAngle = - twoPi; } else { deltaAngle = deltaAngle - twoPi; } } var angle = this.aStartAngle + t * deltaAngle; var x = this.aX + this.xRadius * Math.cos( angle ); var y = this.aY + this.yRadius * Math.sin( angle ); if ( this.aRotation !== 0 ) { var cos = Math.cos( this.aRotation ); var sin = Math.sin( this.aRotation ); var tx = x - this.aX; var ty = y - this.aY; // Rotate the point about the center of the ellipse. x = tx * cos - ty * sin + this.aX; y = tx * sin + ty * cos + this.aY; } return new Vector2$1( x, y ); }; function SplineCurve$1( points /* array of Vector2 */ ) { Curve$1.call( this ); this.points = ( points === undefined ) ? [] : points; } SplineCurve$1.prototype = Object.create( Curve$1.prototype ); SplineCurve$1.prototype.constructor = SplineCurve$1; SplineCurve$1.prototype.isSplineCurve = true; SplineCurve$1.prototype.getPoint = function ( t ) { var points = this.points; var point = ( points.length - 1 ) * t; var intPoint = Math.floor( point ); var weight = point - intPoint; var point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ]; var point1 = points[ intPoint ]; var point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ]; var point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ]; return new Vector2$1( CatmullRom$1( weight, point0.x, point1.x, point2.x, point3.x ), CatmullRom$1( weight, point0.y, point1.y, point2.y, point3.y ) ); }; function CubicBezierCurve$1( v0, v1, v2, v3 ) { Curve$1.call( this ); this.v0 = v0; this.v1 = v1; this.v2 = v2; this.v3 = v3; } CubicBezierCurve$1.prototype = Object.create( Curve$1.prototype ); CubicBezierCurve$1.prototype.constructor = CubicBezierCurve$1; CubicBezierCurve$1.prototype.getPoint = function ( t ) { var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; return new Vector2$1( CubicBezier$1( t, v0.x, v1.x, v2.x, v3.x ), CubicBezier$1( t, v0.y, v1.y, v2.y, v3.y ) ); }; function QuadraticBezierCurve$1( v0, v1, v2 ) { Curve$1.call( this ); this.v0 = v0; this.v1 = v1; this.v2 = v2; } QuadraticBezierCurve$1.prototype = Object.create( Curve$1.prototype ); QuadraticBezierCurve$1.prototype.constructor = QuadraticBezierCurve$1; QuadraticBezierCurve$1.prototype.getPoint = function ( t ) { var v0 = this.v0, v1 = this.v1, v2 = this.v2; return new Vector2$1( QuadraticBezier$1( t, v0.x, v1.x, v2.x ), QuadraticBezier$1( t, v0.y, v1.y, v2.y ) ); }; var PathPrototype = Object.assign( Object.create( CurvePath$1.prototype ), { fromPoints: function ( vectors ) { this.moveTo( vectors[ 0 ].x, vectors[ 0 ].y ); for ( var i = 1, l = vectors.length; i < l; i ++ ) { this.lineTo( vectors[ i ].x, vectors[ i ].y ); } }, moveTo: function ( x, y ) { this.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying? }, lineTo: function ( x, y ) { var curve = new LineCurve$1( this.currentPoint.clone(), new Vector2$1( x, y ) ); this.curves.push( curve ); this.currentPoint.set( x, y ); }, quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { var curve = new QuadraticBezierCurve$1( this.currentPoint.clone(), new Vector2$1( aCPx, aCPy ), new Vector2$1( aX, aY ) ); this.curves.push( curve ); this.currentPoint.set( aX, aY ); }, bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { var curve = new CubicBezierCurve$1( this.currentPoint.clone(), new Vector2$1( aCP1x, aCP1y ), new Vector2$1( aCP2x, aCP2y ), new Vector2$1( aX, aY ) ); this.curves.push( curve ); this.currentPoint.set( aX, aY ); }, splineThru: function ( pts /*Array of Vector*/ ) { var npts = [ this.currentPoint.clone() ].concat( pts ); var curve = new SplineCurve$1( npts ); this.curves.push( curve ); this.currentPoint.copy( pts[ pts.length - 1 ] ); }, arc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { var x0 = this.currentPoint.x; var y0 = this.currentPoint.y; this.absarc( aX + x0, aY + y0, aRadius, aStartAngle, aEndAngle, aClockwise ); }, absarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { this.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); }, ellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { var x0 = this.currentPoint.x; var y0 = this.currentPoint.y; this.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); }, absellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { var curve = new EllipseCurve$1( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); if ( this.curves.length > 0 ) { // if a previous curve is present, attempt to join var firstPoint = curve.getPoint( 0 ); if ( ! firstPoint.equals( this.currentPoint ) ) { this.lineTo( firstPoint.x, firstPoint.y ); } } this.curves.push( curve ); var lastPoint = curve.getPoint( 1 ); this.currentPoint.copy( lastPoint ); } } ); /** * @author zz85 / http://www.lab4games.net/zz85/blog * Creates free form 2d path using series of points, lines or curves. **/ function Path$1( points ) { CurvePath$1.call( this ); this.currentPoint = new Vector2$1(); if ( points ) { this.fromPoints( points ); } } Path$1.prototype = PathPrototype; PathPrototype.constructor = Path$1; /** * @author zz85 / http://www.lab4games.net/zz85/blog * Defines a 2d shape plane using paths. **/ // STEP 1 Create a path. // STEP 2 Turn path into shape. // STEP 3 ExtrudeGeometry takes in Shape/Shapes // STEP 3a - Extract points from each shape, turn to vertices // STEP 3b - Triangulate each shape, add faces. function Shape$2() { Path$1.apply( this, arguments ); this.holes = []; } Shape$2.prototype = Object.assign( Object.create( PathPrototype ), { constructor: Shape$2, getPointsHoles: function ( divisions ) { var holesPts = []; for ( var i = 0, l = this.holes.length; i < l; i ++ ) { holesPts[ i ] = this.holes[ i ].getPoints( divisions ); } return holesPts; }, // Get points of shape and holes (keypoints based on segments parameter) extractAllPoints: function ( divisions ) { return { shape: this.getPoints( divisions ), holes: this.getPointsHoles( divisions ) }; }, extractPoints: function ( divisions ) { return this.extractAllPoints( divisions ); } } ); /** * @author zz85 / http://www.lab4games.net/zz85/blog * minimal class for proxing functions to Path. Replaces old "extractSubpaths()" **/ function ShapePath$1() { this.subPaths = []; this.currentPath = null; } Object.assign( ShapePath$1.prototype, { moveTo: function ( x, y ) { this.currentPath = new Path$1(); this.subPaths.push( this.currentPath ); this.currentPath.moveTo( x, y ); }, lineTo: function ( x, y ) { this.currentPath.lineTo( x, y ); }, quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { this.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY ); }, bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { this.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ); }, splineThru: function ( pts ) { this.currentPath.splineThru( pts ); }, toShapes: function ( isCCW, noHoles ) { function toShapesNoHoles( inSubpaths ) { var shapes = []; for ( var i = 0, l = inSubpaths.length; i < l; i ++ ) { var tmpPath = inSubpaths[ i ]; var tmpShape = new Shape$2(); tmpShape.curves = tmpPath.curves; shapes.push( tmpShape ); } return shapes; } function isPointInsidePolygon( inPt, inPolygon ) { var polyLen = inPolygon.length; // inPt on polygon contour => immediate success or // toggling of inside/outside at every single! intersection point of an edge // with the horizontal line through inPt, left of inPt // not counting lowerY endpoints of edges and whole edges on that line var inside = false; for ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) { var edgeLowPt = inPolygon[ p ]; var edgeHighPt = inPolygon[ q ]; var edgeDx = edgeHighPt.x - edgeLowPt.x; var edgeDy = edgeHighPt.y - edgeLowPt.y; if ( Math.abs( edgeDy ) > Number.EPSILON ) { // not parallel if ( edgeDy < 0 ) { edgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx; edgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy; } if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue; if ( inPt.y === edgeLowPt.y ) { if ( inPt.x === edgeLowPt.x ) return true; // inPt is on contour ? // continue; // no intersection or edgeLowPt => doesn't count !!! } else { var perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y ); if ( perpEdge === 0 ) return true; // inPt is on contour ? if ( perpEdge < 0 ) continue; inside = ! inside; // true intersection left of inPt } } else { // parallel or collinear if ( inPt.y !== edgeLowPt.y ) continue; // parallel // edge lies on the same horizontal line as inPt if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) || ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour ! // continue; } } return inside; } var isClockWise = ShapeUtils$1.isClockWise; var subPaths = this.subPaths; if ( subPaths.length === 0 ) return []; if ( noHoles === true ) return toShapesNoHoles( subPaths ); var solid, tmpPath, tmpShape, shapes = []; if ( subPaths.length === 1 ) { tmpPath = subPaths[ 0 ]; tmpShape = new Shape$2(); tmpShape.curves = tmpPath.curves; shapes.push( tmpShape ); return shapes; } var holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() ); holesFirst = isCCW ? ! holesFirst : holesFirst; // console.log("Holes first", holesFirst); var betterShapeHoles = []; var newShapes = []; var newShapeHoles = []; var mainIdx = 0; var tmpPoints; newShapes[ mainIdx ] = undefined; newShapeHoles[ mainIdx ] = []; for ( var i = 0, l = subPaths.length; i < l; i ++ ) { tmpPath = subPaths[ i ]; tmpPoints = tmpPath.getPoints(); solid = isClockWise( tmpPoints ); solid = isCCW ? ! solid : solid; if ( solid ) { if ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) ) mainIdx ++; newShapes[ mainIdx ] = { s: new Shape$2(), p: tmpPoints }; newShapes[ mainIdx ].s.curves = tmpPath.curves; if ( holesFirst ) mainIdx ++; newShapeHoles[ mainIdx ] = []; //console.log('cw', i); } else { newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } ); //console.log('ccw', i); } } // only Holes? -> probably all Shapes with wrong orientation if ( ! newShapes[ 0 ] ) return toShapesNoHoles( subPaths ); if ( newShapes.length > 1 ) { var ambiguous = false; var toChange = []; for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { betterShapeHoles[ sIdx ] = []; } for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { var sho = newShapeHoles[ sIdx ]; for ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) { var ho = sho[ hIdx ]; var hole_unassigned = true; for ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) { if ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) { if ( sIdx !== s2Idx ) toChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } ); if ( hole_unassigned ) { hole_unassigned = false; betterShapeHoles[ s2Idx ].push( ho ); } else { ambiguous = true; } } } if ( hole_unassigned ) { betterShapeHoles[ sIdx ].push( ho ); } } } // console.log("ambiguous: ", ambiguous); if ( toChange.length > 0 ) { // console.log("to change: ", toChange); if ( ! ambiguous ) newShapeHoles = betterShapeHoles; } } var tmpHoles; for ( var i = 0, il = newShapes.length; i < il; i ++ ) { tmpShape = newShapes[ i ].s; shapes.push( tmpShape ); tmpHoles = newShapeHoles[ i ]; for ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) { tmpShape.holes.push( tmpHoles[ j ].h ); } } //console.log("shape", shapes); return shapes; } } ); /** * @author zz85 / http://www.lab4games.net/zz85/blog * @author mrdoob / http://mrdoob.com/ */ function Font$1( data ) { this.data = data; } Object.assign( Font$1.prototype, { isFont: true, generateShapes: function ( text, size, divisions ) { function createPaths( text ) { var chars = String( text ).split( '' ); var scale = size / data.resolution; var line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale; var offsetX = 0, offsetY = 0; var paths = []; for ( var i = 0; i < chars.length; i ++ ) { var char = chars[ i ]; if ( char === '\n' ) { offsetX = 0; offsetY -= line_height; } else { var ret = createPath( char, scale, offsetX, offsetY ); offsetX += ret.offsetX; paths.push( ret.path ); } } return paths; } function createPath( c, scale, offsetX, offsetY ) { var glyph = data.glyphs[ c ] || data.glyphs[ '?' ]; if ( ! glyph ) return; var path = new ShapePath$1(); var pts = []; var x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste; if ( glyph.o ) { var outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) ); for ( var i = 0, l = outline.length; i < l; ) { var action = outline[ i ++ ]; switch ( action ) { case 'm': // moveTo x = outline[ i ++ ] * scale + offsetX; y = outline[ i ++ ] * scale + offsetY; path.moveTo( x, y ); break; case 'l': // lineTo x = outline[ i ++ ] * scale + offsetX; y = outline[ i ++ ] * scale + offsetY; path.lineTo( x, y ); break; case 'q': // quadraticCurveTo cpx = outline[ i ++ ] * scale + offsetX; cpy = outline[ i ++ ] * scale + offsetY; cpx1 = outline[ i ++ ] * scale + offsetX; cpy1 = outline[ i ++ ] * scale + offsetY; path.quadraticCurveTo( cpx1, cpy1, cpx, cpy ); laste = pts[ pts.length - 1 ]; if ( laste ) { cpx0 = laste.x; cpy0 = laste.y; } break; case 'b': // bezierCurveTo cpx = outline[ i ++ ] * scale + offsetX; cpy = outline[ i ++ ] * scale + offsetY; cpx1 = outline[ i ++ ] * scale + offsetX; cpy1 = outline[ i ++ ] * scale + offsetY; cpx2 = outline[ i ++ ] * scale + offsetX; cpy2 = outline[ i ++ ] * scale + offsetY; path.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy ); laste = pts[ pts.length - 1 ]; if ( laste ) { cpx0 = laste.x; cpy0 = laste.y; } break; } } } return { offsetX: glyph.ha * scale, path: path }; } // if ( size === undefined ) size = 100; if ( divisions === undefined ) divisions = 4; var data = this.data; var paths = createPaths( text ); var shapes = []; for ( var p = 0, pl = paths.length; p < pl; p ++ ) { Array.prototype.push.apply( shapes, paths[ p ].toShapes() ); } return shapes; } } ); /** * @author mrdoob / http://mrdoob.com/ */ function FontLoader$1( manager ) { this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager$1; } Object.assign( FontLoader$1.prototype, { load: function ( url, onLoad, onProgress, onError ) { var scope = this; var loader = new FileLoader$1( this.manager ); loader.load( url, function ( text ) { var json; try { json = JSON.parse( text ); } catch ( e ) { console.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' ); json = JSON.parse( text.substring( 65, text.length - 2 ) ); } var font = scope.parse( json ); if ( onLoad ) onLoad( font ); }, onProgress, onError ); }, parse: function ( json ) { return new Font$1( json ); } } ); var context$1; var AudioContext$1 = { getContext: function () { if ( context$1 === undefined ) { context$1 = new ( window.AudioContext || window.webkitAudioContext )(); } return context$1; }, setContext: function ( value ) { context$1 = value; } }; /** * @author Reece Aaron Lecrivain / http://reecenotes.com/ */ function AudioLoader$1( manager ) { this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager$1; } Object.assign( AudioLoader$1.prototype, { load: function ( url, onLoad, onProgress, onError ) { var loader = new FileLoader$1( this.manager ); loader.setResponseType( 'arraybuffer' ); loader.load( url, function ( buffer ) { var context = AudioContext$1.getContext(); context.decodeAudioData( buffer, function ( audioBuffer ) { onLoad( audioBuffer ); } ); }, onProgress, onError ); } } ); /** * @author mrdoob / http://mrdoob.com/ */ function StereoCamera$1() { this.type = 'StereoCamera'; this.aspect = 1; this.eyeSep = 0.064; this.cameraL = new PerspectiveCamera$2(); this.cameraL.layers.enable( 1 ); this.cameraL.matrixAutoUpdate = false; this.cameraR = new PerspectiveCamera$2(); this.cameraR.layers.enable( 2 ); this.cameraR.matrixAutoUpdate = false; } Object.assign( StereoCamera$1.prototype, { update: ( function () { var instance, focus, fov, aspect, near, far, zoom, eyeSep; var eyeRight = new Matrix4$1(); var eyeLeft = new Matrix4$1(); return function update( camera ) { var needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov || aspect !== camera.aspect * this.aspect || near !== camera.near || far !== camera.far || zoom !== camera.zoom || eyeSep !== this.eyeSep; if ( needsUpdate ) { instance = this; focus = camera.focus; fov = camera.fov; aspect = camera.aspect * this.aspect; near = camera.near; far = camera.far; zoom = camera.zoom; // Off-axis stereoscopic effect based on // http://paulbourke.net/stereographics/stereorender/ var projectionMatrix = camera.projectionMatrix.clone(); eyeSep = this.eyeSep / 2; var eyeSepOnProjection = eyeSep * near / focus; var ymax = ( near * Math.tan( _Math$1.DEG2RAD * fov * 0.5 ) ) / zoom; var xmin, xmax; // translate xOffset eyeLeft.elements[ 12 ] = - eyeSep; eyeRight.elements[ 12 ] = eyeSep; // for left eye xmin = - ymax * aspect + eyeSepOnProjection; xmax = ymax * aspect + eyeSepOnProjection; projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin ); projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); this.cameraL.projectionMatrix.copy( projectionMatrix ); // for right eye xmin = - ymax * aspect - eyeSepOnProjection; xmax = ymax * aspect - eyeSepOnProjection; projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin ); projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); this.cameraR.projectionMatrix.copy( projectionMatrix ); } this.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft ); this.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight ); }; } )() } ); /** * Camera for rendering cube maps * - renders scene into axis-aligned cube * * @author alteredq / http://alteredqualia.com/ */ function CubeCamera$2( near, far, cubeResolution ) { Object3D$1.call( this ); this.type = 'CubeCamera'; var fov = 90, aspect = 1; var cameraPX = new PerspectiveCamera$2( fov, aspect, near, far ); cameraPX.up.set( 0, - 1, 0 ); cameraPX.lookAt( new Vector3$1( 1, 0, 0 ) ); this.add( cameraPX ); var cameraNX = new PerspectiveCamera$2( fov, aspect, near, far ); cameraNX.up.set( 0, - 1, 0 ); cameraNX.lookAt( new Vector3$1( - 1, 0, 0 ) ); this.add( cameraNX ); var cameraPY = new PerspectiveCamera$2( fov, aspect, near, far ); cameraPY.up.set( 0, 0, 1 ); cameraPY.lookAt( new Vector3$1( 0, 1, 0 ) ); this.add( cameraPY ); var cameraNY = new PerspectiveCamera$2( fov, aspect, near, far ); cameraNY.up.set( 0, 0, - 1 ); cameraNY.lookAt( new Vector3$1( 0, - 1, 0 ) ); this.add( cameraNY ); var cameraPZ = new PerspectiveCamera$2( fov, aspect, near, far ); cameraPZ.up.set( 0, - 1, 0 ); cameraPZ.lookAt( new Vector3$1( 0, 0, 1 ) ); this.add( cameraPZ ); var cameraNZ = new PerspectiveCamera$2( fov, aspect, near, far ); cameraNZ.up.set( 0, - 1, 0 ); cameraNZ.lookAt( new Vector3$1( 0, 0, - 1 ) ); this.add( cameraNZ ); var options = { format: RGBFormat$1, magFilter: LinearFilter$1, minFilter: LinearFilter$1 }; this.renderTarget = new WebGLRenderTargetCube$1( cubeResolution, cubeResolution, options ); this.renderTarget.texture.name = "CubeCamera"; this.updateCubeMap = function ( renderer, scene ) { if ( this.parent === null ) this.updateMatrixWorld(); var renderTarget = this.renderTarget; var generateMipmaps = renderTarget.texture.generateMipmaps; renderTarget.texture.generateMipmaps = false; renderTarget.activeCubeFace = 0; renderer.render( scene, cameraPX, renderTarget ); renderTarget.activeCubeFace = 1; renderer.render( scene, cameraNX, renderTarget ); renderTarget.activeCubeFace = 2; renderer.render( scene, cameraPY, renderTarget ); renderTarget.activeCubeFace = 3; renderer.render( scene, cameraNY, renderTarget ); renderTarget.activeCubeFace = 4; renderer.render( scene, cameraPZ, renderTarget ); renderTarget.texture.generateMipmaps = generateMipmaps; renderTarget.activeCubeFace = 5; renderer.render( scene, cameraNZ, renderTarget ); renderer.setRenderTarget( null ); }; } CubeCamera$2.prototype = Object.create( Object3D$1.prototype ); CubeCamera$2.prototype.constructor = CubeCamera$2; /** * @author mrdoob / http://mrdoob.com/ */ function ArrayCamera$1( array ) { PerspectiveCamera$2.call( this ); this.enabled = false; this.cameras = array || []; } ArrayCamera$1.prototype = Object.assign( Object.create( PerspectiveCamera$2.prototype ), { constructor: ArrayCamera$1, isArrayCamera: true } ); /** * @author mrdoob / http://mrdoob.com/ */ function AudioListener$1() { Object3D$1.call( this ); this.type = 'AudioListener'; this.context = AudioContext$1.getContext(); this.gain = this.context.createGain(); this.gain.connect( this.context.destination ); this.filter = null; } AudioListener$1.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: AudioListener$1, getInput: function () { return this.gain; }, removeFilter: function ( ) { if ( this.filter !== null ) { this.gain.disconnect( this.filter ); this.filter.disconnect( this.context.destination ); this.gain.connect( this.context.destination ); this.filter = null; } }, getFilter: function () { return this.filter; }, setFilter: function ( value ) { if ( this.filter !== null ) { this.gain.disconnect( this.filter ); this.filter.disconnect( this.context.destination ); } else { this.gain.disconnect( this.context.destination ); } this.filter = value; this.gain.connect( this.filter ); this.filter.connect( this.context.destination ); }, getMasterVolume: function () { return this.gain.gain.value; }, setMasterVolume: function ( value ) { this.gain.gain.value = value; }, updateMatrixWorld: ( function () { var position = new Vector3$1(); var quaternion = new Quaternion$1(); var scale = new Vector3$1(); var orientation = new Vector3$1(); return function updateMatrixWorld( force ) { Object3D$1.prototype.updateMatrixWorld.call( this, force ); var listener = this.context.listener; var up = this.up; this.matrixWorld.decompose( position, quaternion, scale ); orientation.set( 0, 0, - 1 ).applyQuaternion( quaternion ); if ( listener.positionX ) { listener.positionX.setValueAtTime( position.x, this.context.currentTime ); listener.positionY.setValueAtTime( position.y, this.context.currentTime ); listener.positionZ.setValueAtTime( position.z, this.context.currentTime ); listener.forwardX.setValueAtTime( orientation.x, this.context.currentTime ); listener.forwardY.setValueAtTime( orientation.y, this.context.currentTime ); listener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime ); listener.upX.setValueAtTime( up.x, this.context.currentTime ); listener.upY.setValueAtTime( up.y, this.context.currentTime ); listener.upZ.setValueAtTime( up.z, this.context.currentTime ); } else { listener.setPosition( position.x, position.y, position.z ); listener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z ); } }; } )() } ); /** * @author mrdoob / http://mrdoob.com/ * @author Reece Aaron Lecrivain / http://reecenotes.com/ */ function Audio$1( listener ) { Object3D$1.call( this ); this.type = 'Audio'; this.context = listener.context; this.gain = this.context.createGain(); this.gain.connect( listener.getInput() ); this.autoplay = false; this.buffer = null; this.loop = false; this.startTime = 0; this.playbackRate = 1; this.isPlaying = false; this.hasPlaybackControl = true; this.sourceType = 'empty'; this.filters = []; } Audio$1.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: Audio$1, getOutput: function () { return this.gain; }, setNodeSource: function ( audioNode ) { this.hasPlaybackControl = false; this.sourceType = 'audioNode'; this.source = audioNode; this.connect(); return this; }, setBuffer: function ( audioBuffer ) { this.buffer = audioBuffer; this.sourceType = 'buffer'; if ( this.autoplay ) this.play(); return this; }, play: function () { if ( this.isPlaying === true ) { console.warn( 'THREE.Audio: Audio is already playing.' ); return; } if ( this.hasPlaybackControl === false ) { console.warn( 'THREE.Audio: this Audio has no playback control.' ); return; } var source = this.context.createBufferSource(); source.buffer = this.buffer; source.loop = this.loop; source.onended = this.onEnded.bind( this ); source.playbackRate.setValueAtTime( this.playbackRate, this.startTime ); source.start( 0, this.startTime ); this.isPlaying = true; this.source = source; return this.connect(); }, pause: function () { if ( this.hasPlaybackControl === false ) { console.warn( 'THREE.Audio: this Audio has no playback control.' ); return; } this.source.stop(); this.startTime = this.context.currentTime; this.isPlaying = false; return this; }, stop: function () { if ( this.hasPlaybackControl === false ) { console.warn( 'THREE.Audio: this Audio has no playback control.' ); return; } this.source.stop(); this.startTime = 0; this.isPlaying = false; return this; }, connect: function () { if ( this.filters.length > 0 ) { this.source.connect( this.filters[ 0 ] ); for ( var i = 1, l = this.filters.length; i < l; i ++ ) { this.filters[ i - 1 ].connect( this.filters[ i ] ); } this.filters[ this.filters.length - 1 ].connect( this.getOutput() ); } else { this.source.connect( this.getOutput() ); } return this; }, disconnect: function () { if ( this.filters.length > 0 ) { this.source.disconnect( this.filters[ 0 ] ); for ( var i = 1, l = this.filters.length; i < l; i ++ ) { this.filters[ i - 1 ].disconnect( this.filters[ i ] ); } this.filters[ this.filters.length - 1 ].disconnect( this.getOutput() ); } else { this.source.disconnect( this.getOutput() ); } return this; }, getFilters: function () { return this.filters; }, setFilters: function ( value ) { if ( ! value ) value = []; if ( this.isPlaying === true ) { this.disconnect(); this.filters = value; this.connect(); } else { this.filters = value; } return this; }, getFilter: function () { return this.getFilters()[ 0 ]; }, setFilter: function ( filter ) { return this.setFilters( filter ? [ filter ] : [] ); }, setPlaybackRate: function ( value ) { if ( this.hasPlaybackControl === false ) { console.warn( 'THREE.Audio: this Audio has no playback control.' ); return; } this.playbackRate = value; if ( this.isPlaying === true ) { this.source.playbackRate.setValueAtTime( this.playbackRate, this.context.currentTime ); } return this; }, getPlaybackRate: function () { return this.playbackRate; }, onEnded: function () { this.isPlaying = false; }, getLoop: function () { if ( this.hasPlaybackControl === false ) { console.warn( 'THREE.Audio: this Audio has no playback control.' ); return false; } return this.loop; }, setLoop: function ( value ) { if ( this.hasPlaybackControl === false ) { console.warn( 'THREE.Audio: this Audio has no playback control.' ); return; } this.loop = value; if ( this.isPlaying === true ) { this.source.loop = this.loop; } return this; }, getVolume: function () { return this.gain.gain.value; }, setVolume: function ( value ) { this.gain.gain.value = value; return this; } } ); /** * @author mrdoob / http://mrdoob.com/ */ function PositionalAudio$1( listener ) { Audio$1.call( this, listener ); this.panner = this.context.createPanner(); this.panner.connect( this.gain ); } PositionalAudio$1.prototype = Object.assign( Object.create( Audio$1.prototype ), { constructor: PositionalAudio$1, getOutput: function () { return this.panner; }, getRefDistance: function () { return this.panner.refDistance; }, setRefDistance: function ( value ) { this.panner.refDistance = value; }, getRolloffFactor: function () { return this.panner.rolloffFactor; }, setRolloffFactor: function ( value ) { this.panner.rolloffFactor = value; }, getDistanceModel: function () { return this.panner.distanceModel; }, setDistanceModel: function ( value ) { this.panner.distanceModel = value; }, getMaxDistance: function () { return this.panner.maxDistance; }, setMaxDistance: function ( value ) { this.panner.maxDistance = value; }, updateMatrixWorld: ( function () { var position = new Vector3$1(); return function updateMatrixWorld( force ) { Object3D$1.prototype.updateMatrixWorld.call( this, force ); position.setFromMatrixPosition( this.matrixWorld ); this.panner.setPosition( position.x, position.y, position.z ); }; } )() } ); /** * @author mrdoob / http://mrdoob.com/ */ function AudioAnalyser$1( audio, fftSize ) { this.analyser = audio.context.createAnalyser(); this.analyser.fftSize = fftSize !== undefined ? fftSize : 2048; this.data = new Uint8Array( this.analyser.frequencyBinCount ); audio.getOutput().connect( this.analyser ); } Object.assign( AudioAnalyser$1.prototype, { getFrequencyData: function () { this.analyser.getByteFrequencyData( this.data ); return this.data; }, getAverageFrequency: function () { var value = 0, data = this.getFrequencyData(); for ( var i = 0; i < data.length; i ++ ) { value += data[ i ]; } return value / data.length; } } ); /** * * Buffered scene graph property that allows weighted accumulation. * * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ * @author tschw */ function PropertyMixer$1( binding, typeName, valueSize ) { this.binding = binding; this.valueSize = valueSize; var bufferType = Float64Array, mixFunction; switch ( typeName ) { case 'quaternion': mixFunction = this._slerp; break; case 'string': case 'bool': bufferType = Array; mixFunction = this._select; break; default: mixFunction = this._lerp; } this.buffer = new bufferType( valueSize * 4 ); // layout: [ incoming | accu0 | accu1 | orig ] // // interpolators can use .buffer as their .result // the data then goes to 'incoming' // // 'accu0' and 'accu1' are used frame-interleaved for // the cumulative result and are compared to detect // changes // // 'orig' stores the original state of the property this._mixBufferRegion = mixFunction; this.cumulativeWeight = 0; this.useCount = 0; this.referenceCount = 0; } Object.assign( PropertyMixer$1.prototype, { // accumulate data in the 'incoming' region into 'accu' accumulate: function ( accuIndex, weight ) { // note: happily accumulating nothing when weight = 0, the caller knows // the weight and shouldn't have made the call in the first place var buffer = this.buffer, stride = this.valueSize, offset = accuIndex * stride + stride, currentWeight = this.cumulativeWeight; if ( currentWeight === 0 ) { // accuN := incoming * weight for ( var i = 0; i !== stride; ++ i ) { buffer[ offset + i ] = buffer[ i ]; } currentWeight = weight; } else { // accuN := accuN + incoming * weight currentWeight += weight; var mix = weight / currentWeight; this._mixBufferRegion( buffer, offset, 0, mix, stride ); } this.cumulativeWeight = currentWeight; }, // apply the state of 'accu' to the binding when accus differ apply: function ( accuIndex ) { var stride = this.valueSize, buffer = this.buffer, offset = accuIndex * stride + stride, weight = this.cumulativeWeight, binding = this.binding; this.cumulativeWeight = 0; if ( weight < 1 ) { // accuN := accuN + original * ( 1 - cumulativeWeight ) var originalValueOffset = stride * 3; this._mixBufferRegion( buffer, offset, originalValueOffset, 1 - weight, stride ); } for ( var i = stride, e = stride + stride; i !== e; ++ i ) { if ( buffer[ i ] !== buffer[ i + stride ] ) { // value has changed -> update scene graph binding.setValue( buffer, offset ); break; } } }, // remember the state of the bound property and copy it to both accus saveOriginalState: function () { var binding = this.binding; var buffer = this.buffer, stride = this.valueSize, originalValueOffset = stride * 3; binding.getValue( buffer, originalValueOffset ); // accu[0..1] := orig -- initially detect changes against the original for ( var i = stride, e = originalValueOffset; i !== e; ++ i ) { buffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ]; } this.cumulativeWeight = 0; }, // apply the state previously taken via 'saveOriginalState' to the binding restoreOriginalState: function () { var originalValueOffset = this.valueSize * 3; this.binding.setValue( this.buffer, originalValueOffset ); }, // mix functions _select: function ( buffer, dstOffset, srcOffset, t, stride ) { if ( t >= 0.5 ) { for ( var i = 0; i !== stride; ++ i ) { buffer[ dstOffset + i ] = buffer[ srcOffset + i ]; } } }, _slerp: function ( buffer, dstOffset, srcOffset, t ) { Quaternion$1.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t ); }, _lerp: function ( buffer, dstOffset, srcOffset, t, stride ) { var s = 1 - t; for ( var i = 0; i !== stride; ++ i ) { var j = dstOffset + i; buffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t; } } } ); /** * * A reference to a real property in the scene graph. * * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ * @author tschw */ function Composite$1( targetGroup, path, optionalParsedPath ) { var parsedPath = optionalParsedPath || PropertyBinding$1.parseTrackName( path ); this._targetGroup = targetGroup; this._bindings = targetGroup.subscribe_( path, parsedPath ); } Object.assign( Composite$1.prototype, { getValue: function ( array, offset ) { this.bind(); // bind all binding var firstValidIndex = this._targetGroup.nCachedObjects_, binding = this._bindings[ firstValidIndex ]; // and only call .getValue on the first if ( binding !== undefined ) binding.getValue( array, offset ); }, setValue: function ( array, offset ) { var bindings = this._bindings; for ( var i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) { bindings[ i ].setValue( array, offset ); } }, bind: function () { var bindings = this._bindings; for ( var i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) { bindings[ i ].bind(); } }, unbind: function () { var bindings = this._bindings; for ( var i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) { bindings[ i ].unbind(); } } } ); function PropertyBinding$1( rootNode, path, parsedPath ) { this.path = path; this.parsedPath = parsedPath || PropertyBinding$1.parseTrackName( path ); this.node = PropertyBinding$1.findNode( rootNode, this.parsedPath.nodeName ) || rootNode; this.rootNode = rootNode; } Object.assign( PropertyBinding$1, { Composite: Composite$1, create: function ( root, path, parsedPath ) { if ( ! ( root && root.isAnimationObjectGroup ) ) { return new PropertyBinding$1( root, path, parsedPath ); } else { return new PropertyBinding$1.Composite( root, path, parsedPath ); } }, parseTrackName: function () { // Parent directories, delimited by '/' or ':'. Currently unused, but must // be matched to parse the rest of the track name. var directoryRe = /((?:[\w-]+[\/:])*)/; // Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'. var nodeRe = /([\w-\.]+)?/; // Object on target node, and accessor. Name may contain only word // characters. Accessor may contain any character except closing bracket. var objectRe = /(?:\.([\w-]+)(?:\[(.+)\])?)?/; // Property and accessor. May contain only word characters. Accessor may // contain any non-bracket characters. var propertyRe = /\.([\w-]+)(?:\[(.+)\])?/; var trackRe = new RegExp('' + '^' + directoryRe.source + nodeRe.source + objectRe.source + propertyRe.source + '$' ); var supportedObjectNames = [ 'material', 'materials', 'bones' ]; return function ( trackName ) { var matches = trackRe.exec( trackName ); if ( ! matches ) { throw new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName ); } var results = { // directoryName: matches[ 1 ], // (tschw) currently unused nodeName: matches[ 2 ], objectName: matches[ 3 ], objectIndex: matches[ 4 ], propertyName: matches[ 5 ], // required propertyIndex: matches[ 6 ] }; var lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' ); if ( lastDot !== undefined && lastDot !== -1 ) { var objectName = results.nodeName.substring( lastDot + 1 ); // Object names must be checked against a whitelist. Otherwise, there // is no way to parse 'foo.bar.baz': 'baz' must be a property, but // 'bar' could be the objectName, or part of a nodeName (which can // include '.' characters). if ( supportedObjectNames.indexOf( objectName ) !== -1 ) { results.nodeName = results.nodeName.substring( 0, lastDot ); results.objectName = objectName; } } if ( results.propertyName === null || results.propertyName.length === 0 ) { throw new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName ); } return results; }; }(), findNode: function ( root, nodeName ) { if ( ! nodeName || nodeName === "" || nodeName === "root" || nodeName === "." || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) { return root; } // search into skeleton bones. if ( root.skeleton ) { var searchSkeleton = function ( skeleton ) { for ( var i = 0; i < skeleton.bones.length; i ++ ) { var bone = skeleton.bones[ i ]; if ( bone.name === nodeName ) { return bone; } } return null; }; var bone = searchSkeleton( root.skeleton ); if ( bone ) { return bone; } } // search into node subtree. if ( root.children ) { var searchNodeSubtree = function ( children ) { for ( var i = 0; i < children.length; i ++ ) { var childNode = children[ i ]; if ( childNode.name === nodeName || childNode.uuid === nodeName ) { return childNode; } var result = searchNodeSubtree( childNode.children ); if ( result ) return result; } return null; }; var subTreeNode = searchNodeSubtree( root.children ); if ( subTreeNode ) { return subTreeNode; } } return null; } } ); Object.assign( PropertyBinding$1.prototype, { // prototype, continued // these are used to "bind" a nonexistent property _getValue_unavailable: function () {}, _setValue_unavailable: function () {}, BindingType: { Direct: 0, EntireArray: 1, ArrayElement: 2, HasFromToArray: 3 }, Versioning: { None: 0, NeedsUpdate: 1, MatrixWorldNeedsUpdate: 2 }, GetterByBindingType: [ function getValue_direct( buffer, offset ) { buffer[ offset ] = this.node[ this.propertyName ]; }, function getValue_array( buffer, offset ) { var source = this.resolvedProperty; for ( var i = 0, n = source.length; i !== n; ++ i ) { buffer[ offset ++ ] = source[ i ]; } }, function getValue_arrayElement( buffer, offset ) { buffer[ offset ] = this.resolvedProperty[ this.propertyIndex ]; }, function getValue_toArray( buffer, offset ) { this.resolvedProperty.toArray( buffer, offset ); } ], SetterByBindingTypeAndVersioning: [ [ // Direct function setValue_direct( buffer, offset ) { this.node[ this.propertyName ] = buffer[ offset ]; }, function setValue_direct_setNeedsUpdate( buffer, offset ) { this.node[ this.propertyName ] = buffer[ offset ]; this.targetObject.needsUpdate = true; }, function setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) { this.node[ this.propertyName ] = buffer[ offset ]; this.targetObject.matrixWorldNeedsUpdate = true; } ], [ // EntireArray function setValue_array( buffer, offset ) { var dest = this.resolvedProperty; for ( var i = 0, n = dest.length; i !== n; ++ i ) { dest[ i ] = buffer[ offset ++ ]; } }, function setValue_array_setNeedsUpdate( buffer, offset ) { var dest = this.resolvedProperty; for ( var i = 0, n = dest.length; i !== n; ++ i ) { dest[ i ] = buffer[ offset ++ ]; } this.targetObject.needsUpdate = true; }, function setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) { var dest = this.resolvedProperty; for ( var i = 0, n = dest.length; i !== n; ++ i ) { dest[ i ] = buffer[ offset ++ ]; } this.targetObject.matrixWorldNeedsUpdate = true; } ], [ // ArrayElement function setValue_arrayElement( buffer, offset ) { this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; }, function setValue_arrayElement_setNeedsUpdate( buffer, offset ) { this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; this.targetObject.needsUpdate = true; }, function setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) { this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; this.targetObject.matrixWorldNeedsUpdate = true; } ], [ // HasToFromArray function setValue_fromArray( buffer, offset ) { this.resolvedProperty.fromArray( buffer, offset ); }, function setValue_fromArray_setNeedsUpdate( buffer, offset ) { this.resolvedProperty.fromArray( buffer, offset ); this.targetObject.needsUpdate = true; }, function setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) { this.resolvedProperty.fromArray( buffer, offset ); this.targetObject.matrixWorldNeedsUpdate = true; } ] ], getValue: function getValue_unbound( targetArray, offset ) { this.bind(); this.getValue( targetArray, offset ); // Note: This class uses a State pattern on a per-method basis: // 'bind' sets 'this.getValue' / 'setValue' and shadows the // prototype version of these methods with one that represents // the bound state. When the property is not found, the methods // become no-ops. }, setValue: function getValue_unbound( sourceArray, offset ) { this.bind(); this.setValue( sourceArray, offset ); }, // create getter / setter pair for a property in the scene graph bind: function () { var targetObject = this.node, parsedPath = this.parsedPath, objectName = parsedPath.objectName, propertyName = parsedPath.propertyName, propertyIndex = parsedPath.propertyIndex; if ( ! targetObject ) { targetObject = PropertyBinding$1.findNode( this.rootNode, parsedPath.nodeName ) || this.rootNode; this.node = targetObject; } // set fail state so we can just 'return' on error this.getValue = this._getValue_unavailable; this.setValue = this._setValue_unavailable; // ensure there is a value node if ( ! targetObject ) { console.error( " trying to update node for track: " + this.path + " but it wasn't found." ); return; } if ( objectName ) { var objectIndex = parsedPath.objectIndex; // special cases were we need to reach deeper into the hierarchy to get the face materials.... switch ( objectName ) { case 'materials': if ( ! targetObject.material ) { console.error( ' can not bind to material as node does not have a material', this ); return; } if ( ! targetObject.material.materials ) { console.error( ' can not bind to material.materials as node.material does not have a materials array', this ); return; } targetObject = targetObject.material.materials; break; case 'bones': if ( ! targetObject.skeleton ) { console.error( ' can not bind to bones as node does not have a skeleton', this ); return; } // potential future optimization: skip this if propertyIndex is already an integer // and convert the integer string to a true integer. targetObject = targetObject.skeleton.bones; // support resolving morphTarget names into indices. for ( var i = 0; i < targetObject.length; i ++ ) { if ( targetObject[ i ].name === objectIndex ) { objectIndex = i; break; } } break; default: if ( targetObject[ objectName ] === undefined ) { console.error( ' can not bind to objectName of node, undefined', this ); return; } targetObject = targetObject[ objectName ]; } if ( objectIndex !== undefined ) { if ( targetObject[ objectIndex ] === undefined ) { console.error( " trying to bind to objectIndex of objectName, but is undefined:", this, targetObject ); return; } targetObject = targetObject[ objectIndex ]; } } // resolve property var nodeProperty = targetObject[ propertyName ]; if ( nodeProperty === undefined ) { var nodeName = parsedPath.nodeName; console.error( " trying to update property for track: " + nodeName + '.' + propertyName + " but it wasn't found.", targetObject ); return; } // determine versioning scheme var versioning = this.Versioning.None; if ( targetObject.needsUpdate !== undefined ) { // material versioning = this.Versioning.NeedsUpdate; this.targetObject = targetObject; } else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform versioning = this.Versioning.MatrixWorldNeedsUpdate; this.targetObject = targetObject; } // determine how the property gets bound var bindingType = this.BindingType.Direct; if ( propertyIndex !== undefined ) { // access a sub element of the property array (only primitives are supported right now) if ( propertyName === "morphTargetInfluences" ) { // potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer. // support resolving morphTarget names into indices. if ( ! targetObject.geometry ) { console.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry', this ); return; } if ( ! targetObject.geometry.morphTargets ) { console.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets', this ); return; } for ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) { if ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) { propertyIndex = i; break; } } } bindingType = this.BindingType.ArrayElement; this.resolvedProperty = nodeProperty; this.propertyIndex = propertyIndex; } else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) { // must use copy for Object3D.Euler/Quaternion bindingType = this.BindingType.HasFromToArray; this.resolvedProperty = nodeProperty; } else if ( Array.isArray( nodeProperty ) ) { bindingType = this.BindingType.EntireArray; this.resolvedProperty = nodeProperty; } else { this.propertyName = propertyName; } // select getter / setter this.getValue = this.GetterByBindingType[ bindingType ]; this.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ]; }, unbind: function () { this.node = null; // back to the prototype version of getValue / setValue // note: avoiding to mutate the shape of 'this' via 'delete' this.getValue = this._getValue_unbound; this.setValue = this._setValue_unbound; } } ); //!\ DECLARE ALIAS AFTER assign prototype ! Object.assign( PropertyBinding$1.prototype, { // initial state of these methods that calls 'bind' _getValue_unbound: PropertyBinding$1.prototype.getValue, _setValue_unbound: PropertyBinding$1.prototype.setValue, } ); /** * * A group of objects that receives a shared animation state. * * Usage: * * - Add objects you would otherwise pass as 'root' to the * constructor or the .clipAction method of AnimationMixer. * * - Instead pass this object as 'root'. * * - You can also add and remove objects later when the mixer * is running. * * Note: * * Objects of this class appear as one object to the mixer, * so cache control of the individual objects must be done * on the group. * * Limitation: * * - The animated properties must be compatible among the * all objects in the group. * * - A single property can either be controlled through a * target group or directly, but not both. * * @author tschw */ function AnimationObjectGroup$1( var_args ) { this.uuid = _Math$1.generateUUID(); // cached objects followed by the active ones this._objects = Array.prototype.slice.call( arguments ); this.nCachedObjects_ = 0; // threshold // note: read by PropertyBinding.Composite var indices = {}; this._indicesByUUID = indices; // for bookkeeping for ( var i = 0, n = arguments.length; i !== n; ++ i ) { indices[ arguments[ i ].uuid ] = i; } this._paths = []; // inside: string this._parsedPaths = []; // inside: { we don't care, here } this._bindings = []; // inside: Array< PropertyBinding > this._bindingsIndicesByPath = {}; // inside: indices in these arrays var scope = this; this.stats = { objects: { get total() { return scope._objects.length; }, get inUse() { return this.total - scope.nCachedObjects_; } }, get bindingsPerObject() { return scope._bindings.length; } }; } Object.assign( AnimationObjectGroup$1.prototype, { isAnimationObjectGroup: true, add: function( var_args ) { var objects = this._objects, nObjects = objects.length, nCachedObjects = this.nCachedObjects_, indicesByUUID = this._indicesByUUID, paths = this._paths, parsedPaths = this._parsedPaths, bindings = this._bindings, nBindings = bindings.length; for ( var i = 0, n = arguments.length; i !== n; ++ i ) { var object = arguments[ i ], uuid = object.uuid, index = indicesByUUID[ uuid ], knownObject = undefined; if ( index === undefined ) { // unknown object -> add it to the ACTIVE region index = nObjects ++; indicesByUUID[ uuid ] = index; objects.push( object ); // accounting is done, now do the same for all bindings for ( var j = 0, m = nBindings; j !== m; ++ j ) { bindings[ j ].push( new PropertyBinding$1( object, paths[ j ], parsedPaths[ j ] ) ); } } else if ( index < nCachedObjects ) { knownObject = objects[ index ]; // move existing object to the ACTIVE region var firstActiveIndex = -- nCachedObjects, lastCachedObject = objects[ firstActiveIndex ]; indicesByUUID[ lastCachedObject.uuid ] = index; objects[ index ] = lastCachedObject; indicesByUUID[ uuid ] = firstActiveIndex; objects[ firstActiveIndex ] = object; // accounting is done, now do the same for all bindings for ( var j = 0, m = nBindings; j !== m; ++ j ) { var bindingsForPath = bindings[ j ], lastCached = bindingsForPath[ firstActiveIndex ], binding = bindingsForPath[ index ]; bindingsForPath[ index ] = lastCached; if ( binding === undefined ) { // since we do not bother to create new bindings // for objects that are cached, the binding may // or may not exist binding = new PropertyBinding$1( object, paths[ j ], parsedPaths[ j ] ); } bindingsForPath[ firstActiveIndex ] = binding; } } else if ( objects[ index ] !== knownObject ) { console.error( "Different objects with the same UUID " + "detected. Clean the caches or recreate your " + "infrastructure when reloading scenes..." ); } // else the object is already where we want it to be } // for arguments this.nCachedObjects_ = nCachedObjects; }, remove: function( var_args ) { var objects = this._objects, nCachedObjects = this.nCachedObjects_, indicesByUUID = this._indicesByUUID, bindings = this._bindings, nBindings = bindings.length; for ( var i = 0, n = arguments.length; i !== n; ++ i ) { var object = arguments[ i ], uuid = object.uuid, index = indicesByUUID[ uuid ]; if ( index !== undefined && index >= nCachedObjects ) { // move existing object into the CACHED region var lastCachedIndex = nCachedObjects ++, firstActiveObject = objects[ lastCachedIndex ]; indicesByUUID[ firstActiveObject.uuid ] = index; objects[ index ] = firstActiveObject; indicesByUUID[ uuid ] = lastCachedIndex; objects[ lastCachedIndex ] = object; // accounting is done, now do the same for all bindings for ( var j = 0, m = nBindings; j !== m; ++ j ) { var bindingsForPath = bindings[ j ], firstActive = bindingsForPath[ lastCachedIndex ], binding = bindingsForPath[ index ]; bindingsForPath[ index ] = firstActive; bindingsForPath[ lastCachedIndex ] = binding; } } } // for arguments this.nCachedObjects_ = nCachedObjects; }, // remove & forget uncache: function( var_args ) { var objects = this._objects, nObjects = objects.length, nCachedObjects = this.nCachedObjects_, indicesByUUID = this._indicesByUUID, bindings = this._bindings, nBindings = bindings.length; for ( var i = 0, n = arguments.length; i !== n; ++ i ) { var object = arguments[ i ], uuid = object.uuid, index = indicesByUUID[ uuid ]; if ( index !== undefined ) { delete indicesByUUID[ uuid ]; if ( index < nCachedObjects ) { // object is cached, shrink the CACHED region var firstActiveIndex = -- nCachedObjects, lastCachedObject = objects[ firstActiveIndex ], lastIndex = -- nObjects, lastObject = objects[ lastIndex ]; // last cached object takes this object's place indicesByUUID[ lastCachedObject.uuid ] = index; objects[ index ] = lastCachedObject; // last object goes to the activated slot and pop indicesByUUID[ lastObject.uuid ] = firstActiveIndex; objects[ firstActiveIndex ] = lastObject; objects.pop(); // accounting is done, now do the same for all bindings for ( var j = 0, m = nBindings; j !== m; ++ j ) { var bindingsForPath = bindings[ j ], lastCached = bindingsForPath[ firstActiveIndex ], last = bindingsForPath[ lastIndex ]; bindingsForPath[ index ] = lastCached; bindingsForPath[ firstActiveIndex ] = last; bindingsForPath.pop(); } } else { // object is active, just swap with the last and pop var lastIndex = -- nObjects, lastObject = objects[ lastIndex ]; indicesByUUID[ lastObject.uuid ] = index; objects[ index ] = lastObject; objects.pop(); // accounting is done, now do the same for all bindings for ( var j = 0, m = nBindings; j !== m; ++ j ) { var bindingsForPath = bindings[ j ]; bindingsForPath[ index ] = bindingsForPath[ lastIndex ]; bindingsForPath.pop(); } } // cached or active } // if object is known } // for arguments this.nCachedObjects_ = nCachedObjects; }, // Internal interface used by befriended PropertyBinding.Composite: subscribe_: function ( path, parsedPath ) { // returns an array of bindings for the given path that is changed // according to the contained objects in the group var indicesByPath = this._bindingsIndicesByPath, index = indicesByPath[ path ], bindings = this._bindings; if ( index !== undefined ) return bindings[ index ]; var paths = this._paths, parsedPaths = this._parsedPaths, objects = this._objects, nObjects = objects.length, nCachedObjects = this.nCachedObjects_, bindingsForPath = new Array( nObjects ); index = bindings.length; indicesByPath[ path ] = index; paths.push( path ); parsedPaths.push( parsedPath ); bindings.push( bindingsForPath ); for ( var i = nCachedObjects, n = objects.length; i !== n; ++ i ) { var object = objects[ i ]; bindingsForPath[ i ] = new PropertyBinding$1( object, path, parsedPath ); } return bindingsForPath; }, unsubscribe_: function ( path ) { // tells the group to forget about a property path and no longer // update the array previously obtained with 'subscribe_' var indicesByPath = this._bindingsIndicesByPath, index = indicesByPath[ path ]; if ( index !== undefined ) { var paths = this._paths, parsedPaths = this._parsedPaths, bindings = this._bindings, lastBindingsIndex = bindings.length - 1, lastBindings = bindings[ lastBindingsIndex ], lastBindingsPath = path[ lastBindingsIndex ]; indicesByPath[ lastBindingsPath ] = index; bindings[ index ] = lastBindings; bindings.pop(); parsedPaths[ index ] = parsedPaths[ lastBindingsIndex ]; parsedPaths.pop(); paths[ index ] = paths[ lastBindingsIndex ]; paths.pop(); } } } ); /** * * Action provided by AnimationMixer for scheduling clip playback on specific * objects. * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ * @author tschw * */ function AnimationAction$1( mixer, clip, localRoot ) { this._mixer = mixer; this._clip = clip; this._localRoot = localRoot || null; var tracks = clip.tracks, nTracks = tracks.length, interpolants = new Array( nTracks ); var interpolantSettings = { endingStart: ZeroCurvatureEnding$1, endingEnd: ZeroCurvatureEnding$1 }; for ( var i = 0; i !== nTracks; ++ i ) { var interpolant = tracks[ i ].createInterpolant( null ); interpolants[ i ] = interpolant; interpolant.settings = interpolantSettings; } this._interpolantSettings = interpolantSettings; this._interpolants = interpolants; // bound by the mixer // inside: PropertyMixer (managed by the mixer) this._propertyBindings = new Array( nTracks ); this._cacheIndex = null; // for the memory manager this._byClipCacheIndex = null; // for the memory manager this._timeScaleInterpolant = null; this._weightInterpolant = null; this.loop = LoopRepeat$1; this._loopCount = -1; // global mixer time when the action is to be started // it's set back to 'null' upon start of the action this._startTime = null; // scaled local time of the action // gets clamped or wrapped to 0..clip.duration according to loop this.time = 0; this.timeScale = 1; this._effectiveTimeScale = 1; this.weight = 1; this._effectiveWeight = 1; this.repetitions = Infinity; // no. of repetitions when looping this.paused = false; // true -> zero effective time scale this.enabled = true; // false -> zero effective weight this.clampWhenFinished = false; // keep feeding the last frame? this.zeroSlopeAtStart = true; // for smooth interpolation w/o separate this.zeroSlopeAtEnd = true; // clips for start, loop and end } Object.assign( AnimationAction$1.prototype, { // State & Scheduling play: function() { this._mixer._activateAction( this ); return this; }, stop: function() { this._mixer._deactivateAction( this ); return this.reset(); }, reset: function() { this.paused = false; this.enabled = true; this.time = 0; // restart clip this._loopCount = -1; // forget previous loops this._startTime = null; // forget scheduling return this.stopFading().stopWarping(); }, isRunning: function() { return this.enabled && ! this.paused && this.timeScale !== 0 && this._startTime === null && this._mixer._isActiveAction( this ); }, // return true when play has been called isScheduled: function() { return this._mixer._isActiveAction( this ); }, startAt: function( time ) { this._startTime = time; return this; }, setLoop: function( mode, repetitions ) { this.loop = mode; this.repetitions = repetitions; return this; }, // Weight // set the weight stopping any scheduled fading // although .enabled = false yields an effective weight of zero, this // method does *not* change .enabled, because it would be confusing setEffectiveWeight: function( weight ) { this.weight = weight; // note: same logic as when updated at runtime this._effectiveWeight = this.enabled ? weight : 0; return this.stopFading(); }, // return the weight considering fading and .enabled getEffectiveWeight: function() { return this._effectiveWeight; }, fadeIn: function( duration ) { return this._scheduleFading( duration, 0, 1 ); }, fadeOut: function( duration ) { return this._scheduleFading( duration, 1, 0 ); }, crossFadeFrom: function( fadeOutAction, duration, warp ) { fadeOutAction.fadeOut( duration ); this.fadeIn( duration ); if( warp ) { var fadeInDuration = this._clip.duration, fadeOutDuration = fadeOutAction._clip.duration, startEndRatio = fadeOutDuration / fadeInDuration, endStartRatio = fadeInDuration / fadeOutDuration; fadeOutAction.warp( 1.0, startEndRatio, duration ); this.warp( endStartRatio, 1.0, duration ); } return this; }, crossFadeTo: function( fadeInAction, duration, warp ) { return fadeInAction.crossFadeFrom( this, duration, warp ); }, stopFading: function() { var weightInterpolant = this._weightInterpolant; if ( weightInterpolant !== null ) { this._weightInterpolant = null; this._mixer._takeBackControlInterpolant( weightInterpolant ); } return this; }, // Time Scale Control // set the time scale stopping any scheduled warping // although .paused = true yields an effective time scale of zero, this // method does *not* change .paused, because it would be confusing setEffectiveTimeScale: function( timeScale ) { this.timeScale = timeScale; this._effectiveTimeScale = this.paused ? 0 :timeScale; return this.stopWarping(); }, // return the time scale considering warping and .paused getEffectiveTimeScale: function() { return this._effectiveTimeScale; }, setDuration: function( duration ) { this.timeScale = this._clip.duration / duration; return this.stopWarping(); }, syncWith: function( action ) { this.time = action.time; this.timeScale = action.timeScale; return this.stopWarping(); }, halt: function( duration ) { return this.warp( this._effectiveTimeScale, 0, duration ); }, warp: function( startTimeScale, endTimeScale, duration ) { var mixer = this._mixer, now = mixer.time, interpolant = this._timeScaleInterpolant, timeScale = this.timeScale; if ( interpolant === null ) { interpolant = mixer._lendControlInterpolant(); this._timeScaleInterpolant = interpolant; } var times = interpolant.parameterPositions, values = interpolant.sampleValues; times[ 0 ] = now; times[ 1 ] = now + duration; values[ 0 ] = startTimeScale / timeScale; values[ 1 ] = endTimeScale / timeScale; return this; }, stopWarping: function() { var timeScaleInterpolant = this._timeScaleInterpolant; if ( timeScaleInterpolant !== null ) { this._timeScaleInterpolant = null; this._mixer._takeBackControlInterpolant( timeScaleInterpolant ); } return this; }, // Object Accessors getMixer: function() { return this._mixer; }, getClip: function() { return this._clip; }, getRoot: function() { return this._localRoot || this._mixer._root; }, // Interna _update: function( time, deltaTime, timeDirection, accuIndex ) { // called by the mixer if ( ! this.enabled ) { // call ._updateWeight() to update ._effectiveWeight this._updateWeight( time ); return; } var startTime = this._startTime; if ( startTime !== null ) { // check for scheduled start of action var timeRunning = ( time - startTime ) * timeDirection; if ( timeRunning < 0 || timeDirection === 0 ) { return; // yet to come / don't decide when delta = 0 } // start this._startTime = null; // unschedule deltaTime = timeDirection * timeRunning; } // apply time scale and advance time deltaTime *= this._updateTimeScale( time ); var clipTime = this._updateTime( deltaTime ); // note: _updateTime may disable the action resulting in // an effective weight of 0 var weight = this._updateWeight( time ); if ( weight > 0 ) { var interpolants = this._interpolants; var propertyMixers = this._propertyBindings; for ( var j = 0, m = interpolants.length; j !== m; ++ j ) { interpolants[ j ].evaluate( clipTime ); propertyMixers[ j ].accumulate( accuIndex, weight ); } } }, _updateWeight: function( time ) { var weight = 0; if ( this.enabled ) { weight = this.weight; var interpolant = this._weightInterpolant; if ( interpolant !== null ) { var interpolantValue = interpolant.evaluate( time )[ 0 ]; weight *= interpolantValue; if ( time > interpolant.parameterPositions[ 1 ] ) { this.stopFading(); if ( interpolantValue === 0 ) { // faded out, disable this.enabled = false; } } } } this._effectiveWeight = weight; return weight; }, _updateTimeScale: function( time ) { var timeScale = 0; if ( ! this.paused ) { timeScale = this.timeScale; var interpolant = this._timeScaleInterpolant; if ( interpolant !== null ) { var interpolantValue = interpolant.evaluate( time )[ 0 ]; timeScale *= interpolantValue; if ( time > interpolant.parameterPositions[ 1 ] ) { this.stopWarping(); if ( timeScale === 0 ) { // motion has halted, pause this.paused = true; } else { // warp done - apply final time scale this.timeScale = timeScale; } } } } this._effectiveTimeScale = timeScale; return timeScale; }, _updateTime: function( deltaTime ) { var time = this.time + deltaTime; if ( deltaTime === 0 ) return time; var duration = this._clip.duration, loop = this.loop, loopCount = this._loopCount; if ( loop === LoopOnce$1 ) { if ( loopCount === -1 ) { // just started this._loopCount = 0; this._setEndings( true, true, false ); } handle_stop: { if ( time >= duration ) { time = duration; } else if ( time < 0 ) { time = 0; } else break handle_stop; if ( this.clampWhenFinished ) this.paused = true; else this.enabled = false; this._mixer.dispatchEvent( { type: 'finished', action: this, direction: deltaTime < 0 ? -1 : 1 } ); } } else { // repetitive Repeat or PingPong var pingPong = ( loop === LoopPingPong$1 ); if ( loopCount === -1 ) { // just started if ( deltaTime >= 0 ) { loopCount = 0; this._setEndings( true, this.repetitions === 0, pingPong ); } else { // when looping in reverse direction, the initial // transition through zero counts as a repetition, // so leave loopCount at -1 this._setEndings( this.repetitions === 0, true, pingPong ); } } if ( time >= duration || time < 0 ) { // wrap around var loopDelta = Math.floor( time / duration ); // signed time -= duration * loopDelta; loopCount += Math.abs( loopDelta ); var pending = this.repetitions - loopCount; if ( pending < 0 ) { // have to stop (switch state, clamp time, fire event) if ( this.clampWhenFinished ) this.paused = true; else this.enabled = false; time = deltaTime > 0 ? duration : 0; this._mixer.dispatchEvent( { type: 'finished', action: this, direction: deltaTime > 0 ? 1 : -1 } ); } else { // keep running if ( pending === 0 ) { // entering the last round var atStart = deltaTime < 0; this._setEndings( atStart, ! atStart, pingPong ); } else { this._setEndings( false, false, pingPong ); } this._loopCount = loopCount; this._mixer.dispatchEvent( { type: 'loop', action: this, loopDelta: loopDelta } ); } } if ( pingPong && ( loopCount & 1 ) === 1 ) { // invert time for the "pong round" this.time = time; return duration - time; } } this.time = time; return time; }, _setEndings: function( atStart, atEnd, pingPong ) { var settings = this._interpolantSettings; if ( pingPong ) { settings.endingStart = ZeroSlopeEnding$1; settings.endingEnd = ZeroSlopeEnding$1; } else { // assuming for LoopOnce atStart == atEnd == true if ( atStart ) { settings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding$1 : ZeroCurvatureEnding$1; } else { settings.endingStart = WrapAroundEnding$1; } if ( atEnd ) { settings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding$1 : ZeroCurvatureEnding$1; } else { settings.endingEnd = WrapAroundEnding$1; } } }, _scheduleFading: function( duration, weightNow, weightThen ) { var mixer = this._mixer, now = mixer.time, interpolant = this._weightInterpolant; if ( interpolant === null ) { interpolant = mixer._lendControlInterpolant(); this._weightInterpolant = interpolant; } var times = interpolant.parameterPositions, values = interpolant.sampleValues; times[ 0 ] = now; values[ 0 ] = weightNow; times[ 1 ] = now + duration; values[ 1 ] = weightThen; return this; } } ); /** * * Player for AnimationClips. * * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ * @author tschw */ function AnimationMixer$1( root ) { this._root = root; this._initMemoryManager(); this._accuIndex = 0; this.time = 0; this.timeScale = 1.0; } Object.assign( AnimationMixer$1.prototype, EventDispatcher$1.prototype, { _bindAction: function ( action, prototypeAction ) { var root = action._localRoot || this._root, tracks = action._clip.tracks, nTracks = tracks.length, bindings = action._propertyBindings, interpolants = action._interpolants, rootUuid = root.uuid, bindingsByRoot = this._bindingsByRootAndName, bindingsByName = bindingsByRoot[ rootUuid ]; if ( bindingsByName === undefined ) { bindingsByName = {}; bindingsByRoot[ rootUuid ] = bindingsByName; } for ( var i = 0; i !== nTracks; ++ i ) { var track = tracks[ i ], trackName = track.name, binding = bindingsByName[ trackName ]; if ( binding !== undefined ) { bindings[ i ] = binding; } else { binding = bindings[ i ]; if ( binding !== undefined ) { // existing binding, make sure the cache knows if ( binding._cacheIndex === null ) { ++ binding.referenceCount; this._addInactiveBinding( binding, rootUuid, trackName ); } continue; } var path = prototypeAction && prototypeAction. _propertyBindings[ i ].binding.parsedPath; binding = new PropertyMixer$1( PropertyBinding$1.create( root, trackName, path ), track.ValueTypeName, track.getValueSize() ); ++ binding.referenceCount; this._addInactiveBinding( binding, rootUuid, trackName ); bindings[ i ] = binding; } interpolants[ i ].resultBuffer = binding.buffer; } }, _activateAction: function ( action ) { if ( ! this._isActiveAction( action ) ) { if ( action._cacheIndex === null ) { // this action has been forgotten by the cache, but the user // appears to be still using it -> rebind var rootUuid = ( action._localRoot || this._root ).uuid, clipUuid = action._clip.uuid, actionsForClip = this._actionsByClip[ clipUuid ]; this._bindAction( action, actionsForClip && actionsForClip.knownActions[ 0 ] ); this._addInactiveAction( action, clipUuid, rootUuid ); } var bindings = action._propertyBindings; // increment reference counts / sort out state for ( var i = 0, n = bindings.length; i !== n; ++ i ) { var binding = bindings[ i ]; if ( binding.useCount ++ === 0 ) { this._lendBinding( binding ); binding.saveOriginalState(); } } this._lendAction( action ); } }, _deactivateAction: function ( action ) { if ( this._isActiveAction( action ) ) { var bindings = action._propertyBindings; // decrement reference counts / sort out state for ( var i = 0, n = bindings.length; i !== n; ++ i ) { var binding = bindings[ i ]; if ( -- binding.useCount === 0 ) { binding.restoreOriginalState(); this._takeBackBinding( binding ); } } this._takeBackAction( action ); } }, // Memory manager _initMemoryManager: function () { this._actions = []; // 'nActiveActions' followed by inactive ones this._nActiveActions = 0; this._actionsByClip = {}; // inside: // { // knownActions: Array< AnimationAction > - used as prototypes // actionByRoot: AnimationAction - lookup // } this._bindings = []; // 'nActiveBindings' followed by inactive ones this._nActiveBindings = 0; this._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer > this._controlInterpolants = []; // same game as above this._nActiveControlInterpolants = 0; var scope = this; this.stats = { actions: { get total() { return scope._actions.length; }, get inUse() { return scope._nActiveActions; } }, bindings: { get total() { return scope._bindings.length; }, get inUse() { return scope._nActiveBindings; } }, controlInterpolants: { get total() { return scope._controlInterpolants.length; }, get inUse() { return scope._nActiveControlInterpolants; } } }; }, // Memory management for AnimationAction objects _isActiveAction: function ( action ) { var index = action._cacheIndex; return index !== null && index < this._nActiveActions; }, _addInactiveAction: function ( action, clipUuid, rootUuid ) { var actions = this._actions, actionsByClip = this._actionsByClip, actionsForClip = actionsByClip[ clipUuid ]; if ( actionsForClip === undefined ) { actionsForClip = { knownActions: [ action ], actionByRoot: {} }; action._byClipCacheIndex = 0; actionsByClip[ clipUuid ] = actionsForClip; } else { var knownActions = actionsForClip.knownActions; action._byClipCacheIndex = knownActions.length; knownActions.push( action ); } action._cacheIndex = actions.length; actions.push( action ); actionsForClip.actionByRoot[ rootUuid ] = action; }, _removeInactiveAction: function ( action ) { var actions = this._actions, lastInactiveAction = actions[ actions.length - 1 ], cacheIndex = action._cacheIndex; lastInactiveAction._cacheIndex = cacheIndex; actions[ cacheIndex ] = lastInactiveAction; actions.pop(); action._cacheIndex = null; var clipUuid = action._clip.uuid, actionsByClip = this._actionsByClip, actionsForClip = actionsByClip[ clipUuid ], knownActionsForClip = actionsForClip.knownActions, lastKnownAction = knownActionsForClip[ knownActionsForClip.length - 1 ], byClipCacheIndex = action._byClipCacheIndex; lastKnownAction._byClipCacheIndex = byClipCacheIndex; knownActionsForClip[ byClipCacheIndex ] = lastKnownAction; knownActionsForClip.pop(); action._byClipCacheIndex = null; var actionByRoot = actionsForClip.actionByRoot, rootUuid = ( action._localRoot || this._root ).uuid; delete actionByRoot[ rootUuid ]; if ( knownActionsForClip.length === 0 ) { delete actionsByClip[ clipUuid ]; } this._removeInactiveBindingsForAction( action ); }, _removeInactiveBindingsForAction: function ( action ) { var bindings = action._propertyBindings; for ( var i = 0, n = bindings.length; i !== n; ++ i ) { var binding = bindings[ i ]; if ( -- binding.referenceCount === 0 ) { this._removeInactiveBinding( binding ); } } }, _lendAction: function ( action ) { // [ active actions | inactive actions ] // [ active actions >| inactive actions ] // s a // <-swap-> // a s var actions = this._actions, prevIndex = action._cacheIndex, lastActiveIndex = this._nActiveActions ++, firstInactiveAction = actions[ lastActiveIndex ]; action._cacheIndex = lastActiveIndex; actions[ lastActiveIndex ] = action; firstInactiveAction._cacheIndex = prevIndex; actions[ prevIndex ] = firstInactiveAction; }, _takeBackAction: function ( action ) { // [ active actions | inactive actions ] // [ active actions |< inactive actions ] // a s // <-swap-> // s a var actions = this._actions, prevIndex = action._cacheIndex, firstInactiveIndex = -- this._nActiveActions, lastActiveAction = actions[ firstInactiveIndex ]; action._cacheIndex = firstInactiveIndex; actions[ firstInactiveIndex ] = action; lastActiveAction._cacheIndex = prevIndex; actions[ prevIndex ] = lastActiveAction; }, // Memory management for PropertyMixer objects _addInactiveBinding: function ( binding, rootUuid, trackName ) { var bindingsByRoot = this._bindingsByRootAndName, bindingByName = bindingsByRoot[ rootUuid ], bindings = this._bindings; if ( bindingByName === undefined ) { bindingByName = {}; bindingsByRoot[ rootUuid ] = bindingByName; } bindingByName[ trackName ] = binding; binding._cacheIndex = bindings.length; bindings.push( binding ); }, _removeInactiveBinding: function ( binding ) { var bindings = this._bindings, propBinding = binding.binding, rootUuid = propBinding.rootNode.uuid, trackName = propBinding.path, bindingsByRoot = this._bindingsByRootAndName, bindingByName = bindingsByRoot[ rootUuid ], lastInactiveBinding = bindings[ bindings.length - 1 ], cacheIndex = binding._cacheIndex; lastInactiveBinding._cacheIndex = cacheIndex; bindings[ cacheIndex ] = lastInactiveBinding; bindings.pop(); delete bindingByName[ trackName ]; remove_empty_map: { for ( var _ in bindingByName ) break remove_empty_map; delete bindingsByRoot[ rootUuid ]; } }, _lendBinding: function ( binding ) { var bindings = this._bindings, prevIndex = binding._cacheIndex, lastActiveIndex = this._nActiveBindings ++, firstInactiveBinding = bindings[ lastActiveIndex ]; binding._cacheIndex = lastActiveIndex; bindings[ lastActiveIndex ] = binding; firstInactiveBinding._cacheIndex = prevIndex; bindings[ prevIndex ] = firstInactiveBinding; }, _takeBackBinding: function ( binding ) { var bindings = this._bindings, prevIndex = binding._cacheIndex, firstInactiveIndex = -- this._nActiveBindings, lastActiveBinding = bindings[ firstInactiveIndex ]; binding._cacheIndex = firstInactiveIndex; bindings[ firstInactiveIndex ] = binding; lastActiveBinding._cacheIndex = prevIndex; bindings[ prevIndex ] = lastActiveBinding; }, // Memory management of Interpolants for weight and time scale _lendControlInterpolant: function () { var interpolants = this._controlInterpolants, lastActiveIndex = this._nActiveControlInterpolants ++, interpolant = interpolants[ lastActiveIndex ]; if ( interpolant === undefined ) { interpolant = new LinearInterpolant$1( new Float32Array( 2 ), new Float32Array( 2 ), 1, this._controlInterpolantsResultBuffer ); interpolant.__cacheIndex = lastActiveIndex; interpolants[ lastActiveIndex ] = interpolant; } return interpolant; }, _takeBackControlInterpolant: function ( interpolant ) { var interpolants = this._controlInterpolants, prevIndex = interpolant.__cacheIndex, firstInactiveIndex = -- this._nActiveControlInterpolants, lastActiveInterpolant = interpolants[ firstInactiveIndex ]; interpolant.__cacheIndex = firstInactiveIndex; interpolants[ firstInactiveIndex ] = interpolant; lastActiveInterpolant.__cacheIndex = prevIndex; interpolants[ prevIndex ] = lastActiveInterpolant; }, _controlInterpolantsResultBuffer: new Float32Array( 1 ), // return an action for a clip optionally using a custom root target // object (this method allocates a lot of dynamic memory in case a // previously unknown clip/root combination is specified) clipAction: function ( clip, optionalRoot ) { var root = optionalRoot || this._root, rootUuid = root.uuid, clipObject = typeof clip === 'string' ? AnimationClip$1.findByName( root, clip ) : clip, clipUuid = clipObject !== null ? clipObject.uuid : clip, actionsForClip = this._actionsByClip[ clipUuid ], prototypeAction = null; if ( actionsForClip !== undefined ) { var existingAction = actionsForClip.actionByRoot[ rootUuid ]; if ( existingAction !== undefined ) { return existingAction; } // we know the clip, so we don't have to parse all // the bindings again but can just copy prototypeAction = actionsForClip.knownActions[ 0 ]; // also, take the clip from the prototype action if ( clipObject === null ) clipObject = prototypeAction._clip; } // clip must be known when specified via string if ( clipObject === null ) return null; // allocate all resources required to run it var newAction = new AnimationAction$1( this, clipObject, optionalRoot ); this._bindAction( newAction, prototypeAction ); // and make the action known to the memory manager this._addInactiveAction( newAction, clipUuid, rootUuid ); return newAction; }, // get an existing action existingAction: function ( clip, optionalRoot ) { var root = optionalRoot || this._root, rootUuid = root.uuid, clipObject = typeof clip === 'string' ? AnimationClip$1.findByName( root, clip ) : clip, clipUuid = clipObject ? clipObject.uuid : clip, actionsForClip = this._actionsByClip[ clipUuid ]; if ( actionsForClip !== undefined ) { return actionsForClip.actionByRoot[ rootUuid ] || null; } return null; }, // deactivates all previously scheduled actions stopAllAction: function () { var actions = this._actions, nActions = this._nActiveActions, bindings = this._bindings, nBindings = this._nActiveBindings; this._nActiveActions = 0; this._nActiveBindings = 0; for ( var i = 0; i !== nActions; ++ i ) { actions[ i ].reset(); } for ( var i = 0; i !== nBindings; ++ i ) { bindings[ i ].useCount = 0; } return this; }, // advance the time and update apply the animation update: function ( deltaTime ) { deltaTime *= this.timeScale; var actions = this._actions, nActions = this._nActiveActions, time = this.time += deltaTime, timeDirection = Math.sign( deltaTime ), accuIndex = this._accuIndex ^= 1; // run active actions for ( var i = 0; i !== nActions; ++ i ) { var action = actions[ i ]; action._update( time, deltaTime, timeDirection, accuIndex ); } // update scene graph var bindings = this._bindings, nBindings = this._nActiveBindings; for ( var i = 0; i !== nBindings; ++ i ) { bindings[ i ].apply( accuIndex ); } return this; }, // return this mixer's root target object getRoot: function () { return this._root; }, // free all resources specific to a particular clip uncacheClip: function ( clip ) { var actions = this._actions, clipUuid = clip.uuid, actionsByClip = this._actionsByClip, actionsForClip = actionsByClip[ clipUuid ]; if ( actionsForClip !== undefined ) { // note: just calling _removeInactiveAction would mess up the // iteration state and also require updating the state we can // just throw away var actionsToRemove = actionsForClip.knownActions; for ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) { var action = actionsToRemove[ i ]; this._deactivateAction( action ); var cacheIndex = action._cacheIndex, lastInactiveAction = actions[ actions.length - 1 ]; action._cacheIndex = null; action._byClipCacheIndex = null; lastInactiveAction._cacheIndex = cacheIndex; actions[ cacheIndex ] = lastInactiveAction; actions.pop(); this._removeInactiveBindingsForAction( action ); } delete actionsByClip[ clipUuid ]; } }, // free all resources specific to a particular root target object uncacheRoot: function ( root ) { var rootUuid = root.uuid, actionsByClip = this._actionsByClip; for ( var clipUuid in actionsByClip ) { var actionByRoot = actionsByClip[ clipUuid ].actionByRoot, action = actionByRoot[ rootUuid ]; if ( action !== undefined ) { this._deactivateAction( action ); this._removeInactiveAction( action ); } } var bindingsByRoot = this._bindingsByRootAndName, bindingByName = bindingsByRoot[ rootUuid ]; if ( bindingByName !== undefined ) { for ( var trackName in bindingByName ) { var binding = bindingByName[ trackName ]; binding.restoreOriginalState(); this._removeInactiveBinding( binding ); } } }, // remove a targeted clip from the cache uncacheAction: function ( clip, optionalRoot ) { var action = this.existingAction( clip, optionalRoot ); if ( action !== null ) { this._deactivateAction( action ); this._removeInactiveAction( action ); } } } ); /** * @author mrdoob / http://mrdoob.com/ */ function Uniform$1( value ) { if ( typeof value === 'string' ) { console.warn( 'THREE.Uniform: Type parameter is no longer needed.' ); value = arguments[ 1 ]; } this.value = value; } Uniform$1.prototype.clone = function () { return new Uniform$1( this.value.clone === undefined ? this.value : this.value.clone() ); }; /** * @author benaadams / https://twitter.com/ben_a_adams */ function InstancedBufferGeometry$1() { BufferGeometry$1.call( this ); this.type = 'InstancedBufferGeometry'; this.maxInstancedCount = undefined; } InstancedBufferGeometry$1.prototype = Object.assign( Object.create( BufferGeometry$1.prototype ), { constructor: InstancedBufferGeometry$1, isInstancedBufferGeometry: true, addGroup: function ( start, count, materialIndex ) { this.groups.push( { start: start, count: count, materialIndex: materialIndex } ); }, copy: function ( source ) { var index = source.index; if ( index !== null ) { this.setIndex( index.clone() ); } var attributes = source.attributes; for ( var name in attributes ) { var attribute = attributes[ name ]; this.addAttribute( name, attribute.clone() ); } var groups = source.groups; for ( var i = 0, l = groups.length; i < l; i ++ ) { var group = groups[ i ]; this.addGroup( group.start, group.count, group.materialIndex ); } return this; } } ); /** * @author benaadams / https://twitter.com/ben_a_adams */ function InterleavedBufferAttribute$1( interleavedBuffer, itemSize, offset, normalized ) { this.uuid = _Math$1.generateUUID(); this.data = interleavedBuffer; this.itemSize = itemSize; this.offset = offset; this.normalized = normalized === true; } Object.defineProperties( InterleavedBufferAttribute$1.prototype, { count: { get: function () { return this.data.count; } }, array: { get: function () { return this.data.array; } } } ); Object.assign( InterleavedBufferAttribute$1.prototype, { isInterleavedBufferAttribute: true, setX: function ( index, x ) { this.data.array[ index * this.data.stride + this.offset ] = x; return this; }, setY: function ( index, y ) { this.data.array[ index * this.data.stride + this.offset + 1 ] = y; return this; }, setZ: function ( index, z ) { this.data.array[ index * this.data.stride + this.offset + 2 ] = z; return this; }, setW: function ( index, w ) { this.data.array[ index * this.data.stride + this.offset + 3 ] = w; return this; }, getX: function ( index ) { return this.data.array[ index * this.data.stride + this.offset ]; }, getY: function ( index ) { return this.data.array[ index * this.data.stride + this.offset + 1 ]; }, getZ: function ( index ) { return this.data.array[ index * this.data.stride + this.offset + 2 ]; }, getW: function ( index ) { return this.data.array[ index * this.data.stride + this.offset + 3 ]; }, setXY: function ( index, x, y ) { index = index * this.data.stride + this.offset; this.data.array[ index + 0 ] = x; this.data.array[ index + 1 ] = y; return this; }, setXYZ: function ( index, x, y, z ) { index = index * this.data.stride + this.offset; this.data.array[ index + 0 ] = x; this.data.array[ index + 1 ] = y; this.data.array[ index + 2 ] = z; return this; }, setXYZW: function ( index, x, y, z, w ) { index = index * this.data.stride + this.offset; this.data.array[ index + 0 ] = x; this.data.array[ index + 1 ] = y; this.data.array[ index + 2 ] = z; this.data.array[ index + 3 ] = w; return this; } } ); /** * @author benaadams / https://twitter.com/ben_a_adams */ function InterleavedBuffer$1( array, stride ) { this.uuid = _Math$1.generateUUID(); this.array = array; this.stride = stride; this.count = array !== undefined ? array.length / stride : 0; this.dynamic = false; this.updateRange = { offset: 0, count: - 1 }; this.onUploadCallback = function () {}; this.version = 0; } Object.defineProperty( InterleavedBuffer$1.prototype, 'needsUpdate', { set: function ( value ) { if ( value === true ) this.version ++; } } ); Object.assign( InterleavedBuffer$1.prototype, { isInterleavedBuffer: true, setArray: function ( array ) { if ( Array.isArray( array ) ) { throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); } this.count = array !== undefined ? array.length / this.stride : 0; this.array = array; }, setDynamic: function ( value ) { this.dynamic = value; return this; }, copy: function ( source ) { this.array = new source.array.constructor( source.array ); this.count = source.count; this.stride = source.stride; this.dynamic = source.dynamic; return this; }, copyAt: function ( index1, attribute, index2 ) { index1 *= this.stride; index2 *= attribute.stride; for ( var i = 0, l = this.stride; i < l; i ++ ) { this.array[ index1 + i ] = attribute.array[ index2 + i ]; } return this; }, set: function ( value, offset ) { if ( offset === undefined ) offset = 0; this.array.set( value, offset ); return this; }, clone: function () { return new this.constructor().copy( this ); }, onUpload: function ( callback ) { this.onUploadCallback = callback; return this; } } ); /** * @author benaadams / https://twitter.com/ben_a_adams */ function InstancedInterleavedBuffer$1( array, stride, meshPerAttribute ) { InterleavedBuffer$1.call( this, array, stride ); this.meshPerAttribute = meshPerAttribute || 1; } InstancedInterleavedBuffer$1.prototype = Object.assign( Object.create( InterleavedBuffer$1.prototype ), { constructor: InstancedInterleavedBuffer$1, isInstancedInterleavedBuffer: true, copy: function ( source ) { InterleavedBuffer$1.prototype.copy.call( this, source ); this.meshPerAttribute = source.meshPerAttribute; return this; } } ); /** * @author benaadams / https://twitter.com/ben_a_adams */ function InstancedBufferAttribute$1( array, itemSize, meshPerAttribute ) { BufferAttribute$1.call( this, array, itemSize ); this.meshPerAttribute = meshPerAttribute || 1; } InstancedBufferAttribute$1.prototype = Object.assign( Object.create( BufferAttribute$1.prototype ), { constructor: InstancedBufferAttribute$1, isInstancedBufferAttribute: true, copy: function ( source ) { BufferAttribute$1.prototype.copy.call( this, source ); this.meshPerAttribute = source.meshPerAttribute; return this; } } ); /** * @author mrdoob / http://mrdoob.com/ * @author bhouston / http://clara.io/ * @author stephomi / http://stephaneginier.com/ */ function Raycaster$1( origin, direction, near, far ) { this.ray = new Ray$1( origin, direction ); // direction is assumed to be normalized (for accurate distance calculations) this.near = near || 0; this.far = far || Infinity; this.params = { Mesh: {}, Line: {}, LOD: {}, Points: { threshold: 1 }, Sprite: {} }; Object.defineProperties( this.params, { PointCloud: { get: function () { console.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' ); return this.Points; } } } ); } function ascSort$1( a, b ) { return a.distance - b.distance; } function intersectObject$1( object, raycaster, intersects, recursive ) { if ( object.visible === false ) return; object.raycast( raycaster, intersects ); if ( recursive === true ) { var children = object.children; for ( var i = 0, l = children.length; i < l; i ++ ) { intersectObject$1( children[ i ], raycaster, intersects, true ); } } } Object.assign( Raycaster$1.prototype, { linePrecision: 1, set: function ( origin, direction ) { // direction is assumed to be normalized (for accurate distance calculations) this.ray.set( origin, direction ); }, setFromCamera: function ( coords, camera ) { if ( ( camera && camera.isPerspectiveCamera ) ) { this.ray.origin.setFromMatrixPosition( camera.matrixWorld ); this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize(); } else if ( ( camera && camera.isOrthographicCamera ) ) { this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ); } else { console.error( 'THREE.Raycaster: Unsupported camera type.' ); } }, intersectObject: function ( object, recursive ) { var intersects = []; intersectObject$1( object, this, intersects, recursive ); intersects.sort( ascSort$1 ); return intersects; }, intersectObjects: function ( objects, recursive ) { var intersects = []; if ( Array.isArray( objects ) === false ) { console.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' ); return intersects; } for ( var i = 0, l = objects.length; i < l; i ++ ) { intersectObject$1( objects[ i ], this, intersects, recursive ); } intersects.sort( ascSort$1 ); return intersects; } } ); /** * @author alteredq / http://alteredqualia.com/ */ function Clock$1( autoStart ) { this.autoStart = ( autoStart !== undefined ) ? autoStart : true; this.startTime = 0; this.oldTime = 0; this.elapsedTime = 0; this.running = false; } Object.assign( Clock$1.prototype, { start: function () { this.startTime = ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732 this.oldTime = this.startTime; this.elapsedTime = 0; this.running = true; }, stop: function () { this.getElapsedTime(); this.running = false; }, getElapsedTime: function () { this.getDelta(); return this.elapsedTime; }, getDelta: function () { var diff = 0; if ( this.autoStart && ! this.running ) { this.start(); return 0; } if ( this.running ) { var newTime = ( typeof performance === 'undefined' ? Date : performance ).now(); diff = ( newTime - this.oldTime ) / 1000; this.oldTime = newTime; this.elapsedTime += diff; } return diff; } } ); /** * @author bhouston / http://clara.io * @author WestLangley / http://github.com/WestLangley * * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system * * The poles (phi) are at the positive and negative y axis. * The equator starts at positive z. */ function Spherical$1( radius, phi, theta ) { this.radius = ( radius !== undefined ) ? radius : 1.0; this.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole this.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere return this; } Object.assign( Spherical$1.prototype, { set: function ( radius, phi, theta ) { this.radius = radius; this.phi = phi; this.theta = theta; return this; }, clone: function () { return new this.constructor().copy( this ); }, copy: function ( other ) { this.radius = other.radius; this.phi = other.phi; this.theta = other.theta; return this; }, // restrict phi to be betwee EPS and PI-EPS makeSafe: function() { var EPS = 0.000001; this.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) ); return this; }, setFromVector3: function( vec3 ) { this.radius = vec3.length(); if ( this.radius === 0 ) { this.theta = 0; this.phi = 0; } else { this.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis this.phi = Math.acos( _Math$1.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle } return this; } } ); /** * @author Mugen87 / https://github.com/Mugen87 * * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system * */ function Cylindrical$1( radius, theta, y ) { this.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane this.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis this.y = ( y !== undefined ) ? y : 0; // height above the x-z plane return this; } Object.assign( Cylindrical$1.prototype, { set: function ( radius, theta, y ) { this.radius = radius; this.theta = theta; this.y = y; return this; }, clone: function () { return new this.constructor().copy( this ); }, copy: function ( other ) { this.radius = other.radius; this.theta = other.theta; this.y = other.y; return this; }, setFromVector3: function( vec3 ) { this.radius = Math.sqrt( vec3.x * vec3.x + vec3.z * vec3.z ); this.theta = Math.atan2( vec3.x, vec3.z ); this.y = vec3.y; return this; } } ); /** * @author alteredq / http://alteredqualia.com/ */ function MorphBlendMesh( geometry, material ) { Mesh$1.call( this, geometry, material ); this.animationsMap = {}; this.animationsList = []; // prepare default animation // (all frames played together in 1 second) var numFrames = this.geometry.morphTargets.length; var name = "__default"; var startFrame = 0; var endFrame = numFrames - 1; var fps = numFrames / 1; this.createAnimation( name, startFrame, endFrame, fps ); this.setAnimationWeight( name, 1 ); } MorphBlendMesh.prototype = Object.create( Mesh$1.prototype ); MorphBlendMesh.prototype.constructor = MorphBlendMesh; MorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) { var animation = { start: start, end: end, length: end - start + 1, fps: fps, duration: ( end - start ) / fps, lastFrame: 0, currentFrame: 0, active: false, time: 0, direction: 1, weight: 1, directionBackwards: false, mirroredLoop: false }; this.animationsMap[ name ] = animation; this.animationsList.push( animation ); }; MorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) { var pattern = /([a-z]+)_?(\d+)/i; var firstAnimation, frameRanges = {}; var geometry = this.geometry; for ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) { var morph = geometry.morphTargets[ i ]; var chunks = morph.name.match( pattern ); if ( chunks && chunks.length > 1 ) { var name = chunks[ 1 ]; if ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity }; var range = frameRanges[ name ]; if ( i < range.start ) range.start = i; if ( i > range.end ) range.end = i; if ( ! firstAnimation ) firstAnimation = name; } } for ( var name in frameRanges ) { var range = frameRanges[ name ]; this.createAnimation( name, range.start, range.end, fps ); } this.firstAnimation = firstAnimation; }; MorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) { var animation = this.animationsMap[ name ]; if ( animation ) { animation.direction = 1; animation.directionBackwards = false; } }; MorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) { var animation = this.animationsMap[ name ]; if ( animation ) { animation.direction = - 1; animation.directionBackwards = true; } }; MorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) { var animation = this.animationsMap[ name ]; if ( animation ) { animation.fps = fps; animation.duration = ( animation.end - animation.start ) / animation.fps; } }; MorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) { var animation = this.animationsMap[ name ]; if ( animation ) { animation.duration = duration; animation.fps = ( animation.end - animation.start ) / animation.duration; } }; MorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) { var animation = this.animationsMap[ name ]; if ( animation ) { animation.weight = weight; } }; MorphBlendMesh.prototype.setAnimationTime = function ( name, time ) { var animation = this.animationsMap[ name ]; if ( animation ) { animation.time = time; } }; MorphBlendMesh.prototype.getAnimationTime = function ( name ) { var time = 0; var animation = this.animationsMap[ name ]; if ( animation ) { time = animation.time; } return time; }; MorphBlendMesh.prototype.getAnimationDuration = function ( name ) { var duration = - 1; var animation = this.animationsMap[ name ]; if ( animation ) { duration = animation.duration; } return duration; }; MorphBlendMesh.prototype.playAnimation = function ( name ) { var animation = this.animationsMap[ name ]; if ( animation ) { animation.time = 0; animation.active = true; } else { console.warn( "THREE.MorphBlendMesh: animation[" + name + "] undefined in .playAnimation()" ); } }; MorphBlendMesh.prototype.stopAnimation = function ( name ) { var animation = this.animationsMap[ name ]; if ( animation ) { animation.active = false; } }; MorphBlendMesh.prototype.update = function ( delta ) { for ( var i = 0, il = this.animationsList.length; i < il; i ++ ) { var animation = this.animationsList[ i ]; if ( ! animation.active ) continue; var frameTime = animation.duration / animation.length; animation.time += animation.direction * delta; if ( animation.mirroredLoop ) { if ( animation.time > animation.duration || animation.time < 0 ) { animation.direction *= - 1; if ( animation.time > animation.duration ) { animation.time = animation.duration; animation.directionBackwards = true; } if ( animation.time < 0 ) { animation.time = 0; animation.directionBackwards = false; } } } else { animation.time = animation.time % animation.duration; if ( animation.time < 0 ) animation.time += animation.duration; } var keyframe = animation.start + _Math$1.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 ); var weight = animation.weight; if ( keyframe !== animation.currentFrame ) { this.morphTargetInfluences[ animation.lastFrame ] = 0; this.morphTargetInfluences[ animation.currentFrame ] = 1 * weight; this.morphTargetInfluences[ keyframe ] = 0; animation.lastFrame = animation.currentFrame; animation.currentFrame = keyframe; } var mix = ( animation.time % frameTime ) / frameTime; if ( animation.directionBackwards ) mix = 1 - mix; if ( animation.currentFrame !== animation.lastFrame ) { this.morphTargetInfluences[ animation.currentFrame ] = mix * weight; this.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight; } else { this.morphTargetInfluences[ animation.currentFrame ] = weight; } } }; /** * @author alteredq / http://alteredqualia.com/ */ function ImmediateRenderObject$1( material ) { Object3D$1.call( this ); this.material = material; this.render = function ( renderCallback ) {}; } ImmediateRenderObject$1.prototype = Object.create( Object3D$1.prototype ); ImmediateRenderObject$1.prototype.constructor = ImmediateRenderObject$1; ImmediateRenderObject$1.prototype.isImmediateRenderObject = true; /** * @author mrdoob / http://mrdoob.com/ * @author WestLangley / http://github.com/WestLangley */ function VertexNormalsHelper$1( object, size, hex, linewidth ) { this.object = object; this.size = ( size !== undefined ) ? size : 1; var color = ( hex !== undefined ) ? hex : 0xff0000; var width = ( linewidth !== undefined ) ? linewidth : 1; // var nNormals = 0; var objGeometry = this.object.geometry; if ( objGeometry && objGeometry.isGeometry ) { nNormals = objGeometry.faces.length * 3; } else if ( objGeometry && objGeometry.isBufferGeometry ) { nNormals = objGeometry.attributes.normal.count; } // var geometry = new BufferGeometry$1(); var positions = new Float32BufferAttribute$1( nNormals * 2 * 3, 3 ); geometry.addAttribute( 'position', positions ); LineSegments$1.call( this, geometry, new LineBasicMaterial$1( { color: color, linewidth: width } ) ); // this.matrixAutoUpdate = false; this.update(); } VertexNormalsHelper$1.prototype = Object.create( LineSegments$1.prototype ); VertexNormalsHelper$1.prototype.constructor = VertexNormalsHelper$1; VertexNormalsHelper$1.prototype.update = ( function () { var v1 = new Vector3$1(); var v2 = new Vector3$1(); var normalMatrix = new Matrix3$1(); return function update() { var keys = [ 'a', 'b', 'c' ]; this.object.updateMatrixWorld( true ); normalMatrix.getNormalMatrix( this.object.matrixWorld ); var matrixWorld = this.object.matrixWorld; var position = this.geometry.attributes.position; // var objGeometry = this.object.geometry; if ( objGeometry && objGeometry.isGeometry ) { var vertices = objGeometry.vertices; var faces = objGeometry.faces; var idx = 0; for ( var i = 0, l = faces.length; i < l; i ++ ) { var face = faces[ i ]; for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { var vertex = vertices[ face[ keys[ j ] ] ]; var normal = face.vertexNormals[ j ]; v1.copy( vertex ).applyMatrix4( matrixWorld ); v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); position.setXYZ( idx, v1.x, v1.y, v1.z ); idx = idx + 1; position.setXYZ( idx, v2.x, v2.y, v2.z ); idx = idx + 1; } } } else if ( objGeometry && objGeometry.isBufferGeometry ) { var objPos = objGeometry.attributes.position; var objNorm = objGeometry.attributes.normal; var idx = 0; // for simplicity, ignore index and drawcalls, and render every normal for ( var j = 0, jl = objPos.count; j < jl; j ++ ) { v1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld ); v2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) ); v2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); position.setXYZ( idx, v1.x, v1.y, v1.z ); idx = idx + 1; position.setXYZ( idx, v2.x, v2.y, v2.z ); idx = idx + 1; } } position.needsUpdate = true; }; }() ); /** * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ * @author WestLangley / http://github.com/WestLangley */ function SpotLightHelper$1( light ) { Object3D$1.call( this ); this.light = light; this.light.updateMatrixWorld(); this.matrix = light.matrixWorld; this.matrixAutoUpdate = false; var geometry = new BufferGeometry$1(); var positions = [ 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, - 1, 1 ]; for ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) { var p1 = ( i / l ) * Math.PI * 2; var p2 = ( j / l ) * Math.PI * 2; positions.push( Math.cos( p1 ), Math.sin( p1 ), 1, Math.cos( p2 ), Math.sin( p2 ), 1 ); } geometry.addAttribute( 'position', new Float32BufferAttribute$1( positions, 3 ) ); var material = new LineBasicMaterial$1( { fog: false } ); this.cone = new LineSegments$1( geometry, material ); this.add( this.cone ); this.update(); } SpotLightHelper$1.prototype = Object.create( Object3D$1.prototype ); SpotLightHelper$1.prototype.constructor = SpotLightHelper$1; SpotLightHelper$1.prototype.dispose = function () { this.cone.geometry.dispose(); this.cone.material.dispose(); }; SpotLightHelper$1.prototype.update = function () { var vector = new Vector3$1(); var vector2 = new Vector3$1(); return function update() { var coneLength = this.light.distance ? this.light.distance : 1000; var coneWidth = coneLength * Math.tan( this.light.angle ); this.cone.scale.set( coneWidth, coneWidth, coneLength ); vector.setFromMatrixPosition( this.light.matrixWorld ); vector2.setFromMatrixPosition( this.light.target.matrixWorld ); this.cone.lookAt( vector2.sub( vector ) ); this.cone.material.color.copy( this.light.color ); }; }(); /** * @author Sean Griffin / http://twitter.com/sgrif * @author Michael Guerrero / http://realitymeltdown.com * @author mrdoob / http://mrdoob.com/ * @author ikerr / http://verold.com * @author Mugen87 / https://github.com/Mugen87 */ function SkeletonHelper$1( object ) { this.bones = this.getBoneList( object ); var geometry = new BufferGeometry$1(); var vertices = []; var colors = []; var color1 = new Color$1( 0, 0, 1 ); var color2 = new Color$1( 0, 1, 0 ); for ( var i = 0; i < this.bones.length; i ++ ) { var bone = this.bones[ i ]; if ( bone.parent && bone.parent.isBone ) { vertices.push( 0, 0, 0 ); vertices.push( 0, 0, 0 ); colors.push( color1.r, color1.g, color1.b ); colors.push( color2.r, color2.g, color2.b ); } } geometry.addAttribute( 'position', new Float32BufferAttribute$1( vertices, 3 ) ); geometry.addAttribute( 'color', new Float32BufferAttribute$1( colors, 3 ) ); var material = new LineBasicMaterial$1( { vertexColors: VertexColors$1, depthTest: false, depthWrite: false, transparent: true } ); LineSegments$1.call( this, geometry, material ); this.root = object; this.matrix = object.matrixWorld; this.matrixAutoUpdate = false; this.update(); } SkeletonHelper$1.prototype = Object.create( LineSegments$1.prototype ); SkeletonHelper$1.prototype.constructor = SkeletonHelper$1; SkeletonHelper$1.prototype.getBoneList = function( object ) { var boneList = []; if ( object && object.isBone ) { boneList.push( object ); } for ( var i = 0; i < object.children.length; i ++ ) { boneList.push.apply( boneList, this.getBoneList( object.children[ i ] ) ); } return boneList; }; SkeletonHelper$1.prototype.update = function () { var vector = new Vector3$1(); var boneMatrix = new Matrix4$1(); var matrixWorldInv = new Matrix4$1(); return function update() { var geometry = this.geometry; var position = geometry.getAttribute( 'position' ); matrixWorldInv.getInverse( this.root.matrixWorld ); for ( var i = 0, j = 0; i < this.bones.length; i ++ ) { var bone = this.bones[ i ]; if ( bone.parent && bone.parent.isBone ) { boneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld ); vector.setFromMatrixPosition( boneMatrix ); position.setXYZ( j, vector.x, vector.y, vector.z ); boneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld ); vector.setFromMatrixPosition( boneMatrix ); position.setXYZ( j + 1, vector.x, vector.y, vector.z ); j += 2; } } geometry.getAttribute( 'position' ).needsUpdate = true; }; }(); /** * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ */ function PointLightHelper$1( light, sphereSize ) { this.light = light; this.light.updateMatrixWorld(); var geometry = new SphereBufferGeometry$1( sphereSize, 4, 2 ); var material = new MeshBasicMaterial$1( { wireframe: true, fog: false } ); material.color.copy( this.light.color ); Mesh$1.call( this, geometry, material ); this.matrix = this.light.matrixWorld; this.matrixAutoUpdate = false; /* var distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 ); var distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } ); this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial ); this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial ); var d = light.distance; if ( d === 0.0 ) { this.lightDistance.visible = false; } else { this.lightDistance.scale.set( d, d, d ); } this.add( this.lightDistance ); */ } PointLightHelper$1.prototype = Object.create( Mesh$1.prototype ); PointLightHelper$1.prototype.constructor = PointLightHelper$1; PointLightHelper$1.prototype.dispose = function () { this.geometry.dispose(); this.material.dispose(); }; PointLightHelper$1.prototype.update = function () { this.material.color.copy( this.light.color ); /* var d = this.light.distance; if ( d === 0.0 ) { this.lightDistance.visible = false; } else { this.lightDistance.visible = true; this.lightDistance.scale.set( d, d, d ); } */ }; /** * @author abelnation / http://github.com/abelnation * @author Mugen87 / http://github.com/Mugen87 * @author WestLangley / http://github.com/WestLangley */ function RectAreaLightHelper$1( light ) { Object3D$1.call( this ); this.light = light; this.light.updateMatrixWorld(); this.matrix = light.matrixWorld; this.matrixAutoUpdate = false; var material = new LineBasicMaterial$1( { color: light.color } ); var geometry = new BufferGeometry$1(); geometry.addAttribute( 'position', new BufferAttribute$1( new Float32Array( 5 * 3 ), 3 ) ); this.add( new Line$2( geometry, material ) ); this.update(); } RectAreaLightHelper$1.prototype = Object.create( Object3D$1.prototype ); RectAreaLightHelper$1.prototype.constructor = RectAreaLightHelper$1; RectAreaLightHelper$1.prototype.dispose = function () { this.children[ 0 ].geometry.dispose(); this.children[ 0 ].material.dispose(); }; RectAreaLightHelper$1.prototype.update = function () { var line = this.children[ 0 ]; // update material line.material.color.copy( this.light.color ); // calculate new dimensions of the helper var hx = this.light.width * 0.5; var hy = this.light.height * 0.5; var position = line.geometry.attributes.position; var array = position.array; // update vertices array[ 0 ] = hx; array[ 1 ] = - hy; array[ 2 ] = 0; array[ 3 ] = hx; array[ 4 ] = hy; array[ 5 ] = 0; array[ 6 ] = - hx; array[ 7 ] = hy; array[ 8 ] = 0; array[ 9 ] = - hx; array[ 10 ] = - hy; array[ 11 ] = 0; array[ 12 ] = hx; array[ 13 ] = - hy; array[ 14 ] = 0; position.needsUpdate = true; }; /** * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ * @author Mugen87 / https://github.com/Mugen87 */ function HemisphereLightHelper$1( light, size ) { Object3D$1.call( this ); this.light = light; this.light.updateMatrixWorld(); this.matrix = light.matrixWorld; this.matrixAutoUpdate = false; var geometry = new OctahedronBufferGeometry$1( size ); geometry.rotateY( Math.PI * 0.5 ); var material = new MeshBasicMaterial$1( { vertexColors: VertexColors$1, wireframe: true } ); var position = geometry.getAttribute( 'position' ); var colors = new Float32Array( position.count * 3 ); geometry.addAttribute( 'color', new BufferAttribute$1( colors, 3 ) ); this.add( new Mesh$1( geometry, material ) ); this.update(); } HemisphereLightHelper$1.prototype = Object.create( Object3D$1.prototype ); HemisphereLightHelper$1.prototype.constructor = HemisphereLightHelper$1; HemisphereLightHelper$1.prototype.dispose = function () { this.children[ 0 ].geometry.dispose(); this.children[ 0 ].material.dispose(); }; HemisphereLightHelper$1.prototype.update = function () { var vector = new Vector3$1(); var color1 = new Color$1(); var color2 = new Color$1(); return function update() { var mesh = this.children[ 0 ]; var colors = mesh.geometry.getAttribute( 'color' ); color1.copy( this.light.color ); color2.copy( this.light.groundColor ); for ( var i = 0, l = colors.count; i < l; i ++ ) { var color = ( i < ( l / 2 ) ) ? color1 : color2; colors.setXYZ( i, color.r, color.g, color.b ); } mesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() ); colors.needsUpdate = true; }; }(); /** * @author mrdoob / http://mrdoob.com/ */ function GridHelper$1( size, divisions, color1, color2 ) { size = size || 10; divisions = divisions || 10; color1 = new Color$1( color1 !== undefined ? color1 : 0x444444 ); color2 = new Color$1( color2 !== undefined ? color2 : 0x888888 ); var center = divisions / 2; var step = size / divisions; var halfSize = size / 2; var vertices = [], colors = []; for ( var i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) { vertices.push( - halfSize, 0, k, halfSize, 0, k ); vertices.push( k, 0, - halfSize, k, 0, halfSize ); var color = i === center ? color1 : color2; color.toArray( colors, j ); j += 3; color.toArray( colors, j ); j += 3; color.toArray( colors, j ); j += 3; color.toArray( colors, j ); j += 3; } var geometry = new BufferGeometry$1(); geometry.addAttribute( 'position', new Float32BufferAttribute$1( vertices, 3 ) ); geometry.addAttribute( 'color', new Float32BufferAttribute$1( colors, 3 ) ); var material = new LineBasicMaterial$1( { vertexColors: VertexColors$1 } ); LineSegments$1.call( this, geometry, material ); } GridHelper$1.prototype = Object.create( LineSegments$1.prototype ); GridHelper$1.prototype.constructor = GridHelper$1; /** * @author mrdoob / http://mrdoob.com/ * @author Mugen87 / http://github.com/Mugen87 * @author Hectate / http://www.github.com/Hectate */ function PolarGridHelper$1( radius, radials, circles, divisions, color1, color2 ) { radius = radius || 10; radials = radials || 16; circles = circles || 8; divisions = divisions || 64; color1 = new Color$1( color1 !== undefined ? color1 : 0x444444 ); color2 = new Color$1( color2 !== undefined ? color2 : 0x888888 ); var vertices = []; var colors = []; var x, z; var v, i, j, r, color; // create the radials for ( i = 0; i <= radials; i ++ ) { v = ( i / radials ) * ( Math.PI * 2 ); x = Math.sin( v ) * radius; z = Math.cos( v ) * radius; vertices.push( 0, 0, 0 ); vertices.push( x, 0, z ); color = ( i & 1 ) ? color1 : color2; colors.push( color.r, color.g, color.b ); colors.push( color.r, color.g, color.b ); } // create the circles for ( i = 0; i <= circles; i ++ ) { color = ( i & 1 ) ? color1 : color2; r = radius - ( radius / circles * i ); for ( j = 0; j < divisions; j ++ ) { // first vertex v = ( j / divisions ) * ( Math.PI * 2 ); x = Math.sin( v ) * r; z = Math.cos( v ) * r; vertices.push( x, 0, z ); colors.push( color.r, color.g, color.b ); // second vertex v = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 ); x = Math.sin( v ) * r; z = Math.cos( v ) * r; vertices.push( x, 0, z ); colors.push( color.r, color.g, color.b ); } } var geometry = new BufferGeometry$1(); geometry.addAttribute( 'position', new Float32BufferAttribute$1( vertices, 3 ) ); geometry.addAttribute( 'color', new Float32BufferAttribute$1( colors, 3 ) ); var material = new LineBasicMaterial$1( { vertexColors: VertexColors$1 } ); LineSegments$1.call( this, geometry, material ); } PolarGridHelper$1.prototype = Object.create( LineSegments$1.prototype ); PolarGridHelper$1.prototype.constructor = PolarGridHelper$1; /** * @author mrdoob / http://mrdoob.com/ * @author WestLangley / http://github.com/WestLangley */ function FaceNormalsHelper$1( object, size, hex, linewidth ) { // FaceNormalsHelper only supports THREE.Geometry this.object = object; this.size = ( size !== undefined ) ? size : 1; var color = ( hex !== undefined ) ? hex : 0xffff00; var width = ( linewidth !== undefined ) ? linewidth : 1; // var nNormals = 0; var objGeometry = this.object.geometry; if ( objGeometry && objGeometry.isGeometry ) { nNormals = objGeometry.faces.length; } else { console.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' ); } // var geometry = new BufferGeometry$1(); var positions = new Float32BufferAttribute$1( nNormals * 2 * 3, 3 ); geometry.addAttribute( 'position', positions ); LineSegments$1.call( this, geometry, new LineBasicMaterial$1( { color: color, linewidth: width } ) ); // this.matrixAutoUpdate = false; this.update(); } FaceNormalsHelper$1.prototype = Object.create( LineSegments$1.prototype ); FaceNormalsHelper$1.prototype.constructor = FaceNormalsHelper$1; FaceNormalsHelper$1.prototype.update = ( function () { var v1 = new Vector3$1(); var v2 = new Vector3$1(); var normalMatrix = new Matrix3$1(); return function update() { this.object.updateMatrixWorld( true ); normalMatrix.getNormalMatrix( this.object.matrixWorld ); var matrixWorld = this.object.matrixWorld; var position = this.geometry.attributes.position; // var objGeometry = this.object.geometry; var vertices = objGeometry.vertices; var faces = objGeometry.faces; var idx = 0; for ( var i = 0, l = faces.length; i < l; i ++ ) { var face = faces[ i ]; var normal = face.normal; v1.copy( vertices[ face.a ] ) .add( vertices[ face.b ] ) .add( vertices[ face.c ] ) .divideScalar( 3 ) .applyMatrix4( matrixWorld ); v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); position.setXYZ( idx, v1.x, v1.y, v1.z ); idx = idx + 1; position.setXYZ( idx, v2.x, v2.y, v2.z ); idx = idx + 1; } position.needsUpdate = true; }; }() ); /** * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ * @author WestLangley / http://github.com/WestLangley */ function DirectionalLightHelper$1( light, size ) { Object3D$1.call( this ); this.light = light; this.light.updateMatrixWorld(); this.matrix = light.matrixWorld; this.matrixAutoUpdate = false; if ( size === undefined ) size = 1; var geometry = new BufferGeometry$1(); geometry.addAttribute( 'position', new Float32BufferAttribute$1( [ - size, size, 0, size, size, 0, size, - size, 0, - size, - size, 0, - size, size, 0 ], 3 ) ); var material = new LineBasicMaterial$1( { fog: false } ); this.add( new Line$2( geometry, material ) ); geometry = new BufferGeometry$1(); geometry.addAttribute( 'position', new Float32BufferAttribute$1( [ 0, 0, 0, 0, 0, 1 ], 3 ) ); this.add( new Line$2( geometry, material )); this.update(); } DirectionalLightHelper$1.prototype = Object.create( Object3D$1.prototype ); DirectionalLightHelper$1.prototype.constructor = DirectionalLightHelper$1; DirectionalLightHelper$1.prototype.dispose = function () { var lightPlane = this.children[ 0 ]; var targetLine = this.children[ 1 ]; lightPlane.geometry.dispose(); lightPlane.material.dispose(); targetLine.geometry.dispose(); targetLine.material.dispose(); }; DirectionalLightHelper$1.prototype.update = function () { var v1 = new Vector3$1(); var v2 = new Vector3$1(); var v3 = new Vector3$1(); return function update() { v1.setFromMatrixPosition( this.light.matrixWorld ); v2.setFromMatrixPosition( this.light.target.matrixWorld ); v3.subVectors( v2, v1 ); var lightPlane = this.children[ 0 ]; var targetLine = this.children[ 1 ]; lightPlane.lookAt( v3 ); lightPlane.material.color.copy( this.light.color ); targetLine.lookAt( v3 ); targetLine.scale.z = v3.length(); }; }(); /** * @author alteredq / http://alteredqualia.com/ * @author Mugen87 / https://github.com/Mugen87 * * - shows frustum, line of sight and up of the camera * - suitable for fast updates * - based on frustum visualization in lightgl.js shadowmap example * http://evanw.github.com/lightgl.js/tests/shadowmap.html */ function CameraHelper$1( camera ) { var geometry = new BufferGeometry$1(); var material = new LineBasicMaterial$1( { color: 0xffffff, vertexColors: FaceColors$1 } ); var vertices = []; var colors = []; var pointMap = {}; // colors var colorFrustum = new Color$1( 0xffaa00 ); var colorCone = new Color$1( 0xff0000 ); var colorUp = new Color$1( 0x00aaff ); var colorTarget = new Color$1( 0xffffff ); var colorCross = new Color$1( 0x333333 ); // near addLine( "n1", "n2", colorFrustum ); addLine( "n2", "n4", colorFrustum ); addLine( "n4", "n3", colorFrustum ); addLine( "n3", "n1", colorFrustum ); // far addLine( "f1", "f2", colorFrustum ); addLine( "f2", "f4", colorFrustum ); addLine( "f4", "f3", colorFrustum ); addLine( "f3", "f1", colorFrustum ); // sides addLine( "n1", "f1", colorFrustum ); addLine( "n2", "f2", colorFrustum ); addLine( "n3", "f3", colorFrustum ); addLine( "n4", "f4", colorFrustum ); // cone addLine( "p", "n1", colorCone ); addLine( "p", "n2", colorCone ); addLine( "p", "n3", colorCone ); addLine( "p", "n4", colorCone ); // up addLine( "u1", "u2", colorUp ); addLine( "u2", "u3", colorUp ); addLine( "u3", "u1", colorUp ); // target addLine( "c", "t", colorTarget ); addLine( "p", "c", colorCross ); // cross addLine( "cn1", "cn2", colorCross ); addLine( "cn3", "cn4", colorCross ); addLine( "cf1", "cf2", colorCross ); addLine( "cf3", "cf4", colorCross ); function addLine( a, b, color ) { addPoint( a, color ); addPoint( b, color ); } function addPoint( id, color ) { vertices.push( 0, 0, 0 ); colors.push( color.r, color.g, color.b ); if ( pointMap[ id ] === undefined ) { pointMap[ id ] = []; } pointMap[ id ].push( ( vertices.length / 3 ) - 1 ); } geometry.addAttribute( 'position', new Float32BufferAttribute$1( vertices, 3 ) ); geometry.addAttribute( 'color', new Float32BufferAttribute$1( colors, 3 ) ); LineSegments$1.call( this, geometry, material ); this.camera = camera; if ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix(); this.matrix = camera.matrixWorld; this.matrixAutoUpdate = false; this.pointMap = pointMap; this.update(); } CameraHelper$1.prototype = Object.create( LineSegments$1.prototype ); CameraHelper$1.prototype.constructor = CameraHelper$1; CameraHelper$1.prototype.update = function () { var geometry, pointMap; var vector = new Vector3$1(); var camera = new Camera$1(); function setPoint( point, x, y, z ) { vector.set( x, y, z ).unproject( camera ); var points = pointMap[ point ]; if ( points !== undefined ) { var position = geometry.getAttribute( 'position' ); for ( var i = 0, l = points.length; i < l; i ++ ) { position.setXYZ( points[ i ], vector.x, vector.y, vector.z ); } } } return function update() { geometry = this.geometry; pointMap = this.pointMap; var w = 1, h = 1; // we need just camera projection matrix // world matrix must be identity camera.projectionMatrix.copy( this.camera.projectionMatrix ); // center / target setPoint( "c", 0, 0, - 1 ); setPoint( "t", 0, 0, 1 ); // near setPoint( "n1", - w, - h, - 1 ); setPoint( "n2", w, - h, - 1 ); setPoint( "n3", - w, h, - 1 ); setPoint( "n4", w, h, - 1 ); // far setPoint( "f1", - w, - h, 1 ); setPoint( "f2", w, - h, 1 ); setPoint( "f3", - w, h, 1 ); setPoint( "f4", w, h, 1 ); // up setPoint( "u1", w * 0.7, h * 1.1, - 1 ); setPoint( "u2", - w * 0.7, h * 1.1, - 1 ); setPoint( "u3", 0, h * 2, - 1 ); // cross setPoint( "cf1", - w, 0, 1 ); setPoint( "cf2", w, 0, 1 ); setPoint( "cf3", 0, - h, 1 ); setPoint( "cf4", 0, h, 1 ); setPoint( "cn1", - w, 0, - 1 ); setPoint( "cn2", w, 0, - 1 ); setPoint( "cn3", 0, - h, - 1 ); setPoint( "cn4", 0, h, - 1 ); geometry.getAttribute( 'position' ).needsUpdate = true; }; }(); /** * @author mrdoob / http://mrdoob.com/ * @author Mugen87 / http://github.com/Mugen87 */ function BoxHelper$1( object, color ) { this.object = object; if ( color === undefined ) color = 0xffff00; var indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] ); var positions = new Float32Array( 8 * 3 ); var geometry = new BufferGeometry$1(); geometry.setIndex( new BufferAttribute$1( indices, 1 ) ); geometry.addAttribute( 'position', new BufferAttribute$1( positions, 3 ) ); LineSegments$1.call( this, geometry, new LineBasicMaterial$1( { color: color } ) ); this.matrixAutoUpdate = false; this.update(); } BoxHelper$1.prototype = Object.create( LineSegments$1.prototype ); BoxHelper$1.prototype.constructor = BoxHelper$1; BoxHelper$1.prototype.update = ( function () { var box = new Box3$1(); return function update( object ) { if ( object !== undefined ) { console.warn( 'THREE.BoxHelper: .update() has no longer arguments.' ); } if ( this.object !== undefined ) { box.setFromObject( this.object ); } if ( box.isEmpty() ) return; var min = box.min; var max = box.max; /* 5____4 1/___0/| | 6__|_7 2/___3/ 0: max.x, max.y, max.z 1: min.x, max.y, max.z 2: min.x, min.y, max.z 3: max.x, min.y, max.z 4: max.x, max.y, min.z 5: min.x, max.y, min.z 6: min.x, min.y, min.z 7: max.x, min.y, min.z */ var position = this.geometry.attributes.position; var array = position.array; array[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z; array[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z; array[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z; array[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z; array[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z; array[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z; array[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z; array[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z; position.needsUpdate = true; this.geometry.computeBoundingSphere(); }; } )(); BoxHelper$1.prototype.setFromObject = function ( object ) { this.object = object; this.update(); return this; }; /** * @author WestLangley / http://github.com/WestLangley * @author zz85 / http://github.com/zz85 * @author bhouston / http://clara.io * * Creates an arrow for visualizing directions * * Parameters: * dir - Vector3 * origin - Vector3 * length - Number * color - color in hex value * headLength - Number * headWidth - Number */ var lineGeometry$1; var coneGeometry$1; function ArrowHelper$1( dir, origin, length, color, headLength, headWidth ) { // dir is assumed to be normalized Object3D$1.call( this ); if ( color === undefined ) color = 0xffff00; if ( length === undefined ) length = 1; if ( headLength === undefined ) headLength = 0.2 * length; if ( headWidth === undefined ) headWidth = 0.2 * headLength; if ( lineGeometry$1 === undefined ) { lineGeometry$1 = new BufferGeometry$1(); lineGeometry$1.addAttribute( 'position', new Float32BufferAttribute$1( [ 0, 0, 0, 0, 1, 0 ], 3 ) ); coneGeometry$1 = new CylinderBufferGeometry$1( 0, 0.5, 1, 5, 1 ); coneGeometry$1.translate( 0, - 0.5, 0 ); } this.position.copy( origin ); this.line = new Line$2( lineGeometry$1, new LineBasicMaterial$1( { color: color } ) ); this.line.matrixAutoUpdate = false; this.add( this.line ); this.cone = new Mesh$1( coneGeometry$1, new MeshBasicMaterial$1( { color: color } ) ); this.cone.matrixAutoUpdate = false; this.add( this.cone ); this.setDirection( dir ); this.setLength( length, headLength, headWidth ); } ArrowHelper$1.prototype = Object.create( Object3D$1.prototype ); ArrowHelper$1.prototype.constructor = ArrowHelper$1; ArrowHelper$1.prototype.setDirection = ( function () { var axis = new Vector3$1(); var radians; return function setDirection( dir ) { // dir is assumed to be normalized if ( dir.y > 0.99999 ) { this.quaternion.set( 0, 0, 0, 1 ); } else if ( dir.y < - 0.99999 ) { this.quaternion.set( 1, 0, 0, 0 ); } else { axis.set( dir.z, 0, - dir.x ).normalize(); radians = Math.acos( dir.y ); this.quaternion.setFromAxisAngle( axis, radians ); } }; }() ); ArrowHelper$1.prototype.setLength = function ( length, headLength, headWidth ) { if ( headLength === undefined ) headLength = 0.2 * length; if ( headWidth === undefined ) headWidth = 0.2 * headLength; this.line.scale.set( 1, Math.max( 0, length - headLength ), 1 ); this.line.updateMatrix(); this.cone.scale.set( headWidth, headLength, headWidth ); this.cone.position.y = length; this.cone.updateMatrix(); }; ArrowHelper$1.prototype.setColor = function ( color ) { this.line.material.color.copy( color ); this.cone.material.color.copy( color ); }; /** * @author sroucheray / http://sroucheray.org/ * @author mrdoob / http://mrdoob.com/ */ function AxisHelper( size ) { size = size || 1; var vertices = [ 0, 0, 0, size, 0, 0, 0, 0, 0, 0, size, 0, 0, 0, 0, 0, 0, size ]; var colors = [ 1, 0, 0, 1, 0.6, 0, 0, 1, 0, 0.6, 1, 0, 0, 0, 1, 0, 0.6, 1 ]; var geometry = new BufferGeometry$1(); geometry.addAttribute( 'position', new Float32BufferAttribute$1( vertices, 3 ) ); geometry.addAttribute( 'color', new Float32BufferAttribute$1( colors, 3 ) ); var material = new LineBasicMaterial$1( { vertexColors: VertexColors$1 } ); LineSegments$1.call( this, geometry, material ); } AxisHelper.prototype = Object.create( LineSegments$1.prototype ); AxisHelper.prototype.constructor = AxisHelper; /** * @author zz85 https://github.com/zz85 * * Centripetal CatmullRom Curve - which is useful for avoiding * cusps and self-intersections in non-uniform catmull rom curves. * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf * * curve.type accepts centripetal(default), chordal and catmullrom * curve.tension is used for catmullrom which defaults to 0.5 */ /* Based on an optimized c++ solution in - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/ - http://ideone.com/NoEbVM This CubicPoly class could be used for reusing some variables and calculations, but for three.js curve use, it could be possible inlined and flatten into a single function call which can be placed in CurveUtils. */ function CubicPoly$1() { var c0 = 0, c1 = 0, c2 = 0, c3 = 0; /* * Compute coefficients for a cubic polynomial * p(s) = c0 + c1*s + c2*s^2 + c3*s^3 * such that * p(0) = x0, p(1) = x1 * and * p'(0) = t0, p'(1) = t1. */ function init( x0, x1, t0, t1 ) { c0 = x0; c1 = t0; c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1; c3 = 2 * x0 - 2 * x1 + t0 + t1; } return { initCatmullRom: function ( x0, x1, x2, x3, tension ) { init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) ); }, initNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) { // compute tangents when parameterized in [t1,t2] var t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1; var t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2; // rescale tangents for parametrization in [0,1] t1 *= dt1; t2 *= dt1; init( x1, x2, t1, t2 ); }, calc: function ( t ) { var t2 = t * t; var t3 = t2 * t; return c0 + c1 * t + c2 * t2 + c3 * t3; } }; } // var tmp$1 = new Vector3$1(); var px$2 = new CubicPoly$1(); var py$1 = new CubicPoly$1(); var pz$1 = new CubicPoly$1(); function CatmullRomCurve3$1( p /* array of Vector3 */ ) { Curve$1.call( this ); this.points = p || []; this.closed = false; } CatmullRomCurve3$1.prototype = Object.create( Curve$1.prototype ); CatmullRomCurve3$1.prototype.constructor = CatmullRomCurve3$1; CatmullRomCurve3$1.prototype.getPoint = function ( t ) { var points = this.points; var l = points.length; if ( l < 2 ) console.log( 'duh, you need at least 2 points' ); var point = ( l - ( this.closed ? 0 : 1 ) ) * t; var intPoint = Math.floor( point ); var weight = point - intPoint; if ( this.closed ) { intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length; } else if ( weight === 0 && intPoint === l - 1 ) { intPoint = l - 2; weight = 1; } var p0, p1, p2, p3; // 4 points if ( this.closed || intPoint > 0 ) { p0 = points[ ( intPoint - 1 ) % l ]; } else { // extrapolate first point tmp$1.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] ); p0 = tmp$1; } p1 = points[ intPoint % l ]; p2 = points[ ( intPoint + 1 ) % l ]; if ( this.closed || intPoint + 2 < l ) { p3 = points[ ( intPoint + 2 ) % l ]; } else { // extrapolate last point tmp$1.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] ); p3 = tmp$1; } if ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) { // init Centripetal / Chordal Catmull-Rom var pow = this.type === 'chordal' ? 0.5 : 0.25; var dt0 = Math.pow( p0.distanceToSquared( p1 ), pow ); var dt1 = Math.pow( p1.distanceToSquared( p2 ), pow ); var dt2 = Math.pow( p2.distanceToSquared( p3 ), pow ); // safety check for repeated points if ( dt1 < 1e-4 ) dt1 = 1.0; if ( dt0 < 1e-4 ) dt0 = dt1; if ( dt2 < 1e-4 ) dt2 = dt1; px$2.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 ); py$1.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 ); pz$1.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 ); } else if ( this.type === 'catmullrom' ) { var tension = this.tension !== undefined ? this.tension : 0.5; px$2.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension ); py$1.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension ); pz$1.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension ); } return new Vector3$1( px$2.calc( weight ), py$1.calc( weight ), pz$1.calc( weight ) ); }; function CubicBezierCurve3$1( v0, v1, v2, v3 ) { Curve$1.call( this ); this.v0 = v0; this.v1 = v1; this.v2 = v2; this.v3 = v3; } CubicBezierCurve3$1.prototype = Object.create( Curve$1.prototype ); CubicBezierCurve3$1.prototype.constructor = CubicBezierCurve3$1; CubicBezierCurve3$1.prototype.getPoint = function ( t ) { var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; return new Vector3$1( CubicBezier$1( t, v0.x, v1.x, v2.x, v3.x ), CubicBezier$1( t, v0.y, v1.y, v2.y, v3.y ), CubicBezier$1( t, v0.z, v1.z, v2.z, v3.z ) ); }; function QuadraticBezierCurve3$1( v0, v1, v2 ) { Curve$1.call( this ); this.v0 = v0; this.v1 = v1; this.v2 = v2; } QuadraticBezierCurve3$1.prototype = Object.create( Curve$1.prototype ); QuadraticBezierCurve3$1.prototype.constructor = QuadraticBezierCurve3$1; QuadraticBezierCurve3$1.prototype.getPoint = function ( t ) { var v0 = this.v0, v1 = this.v1, v2 = this.v2; return new Vector3$1( QuadraticBezier$1( t, v0.x, v1.x, v2.x ), QuadraticBezier$1( t, v0.y, v1.y, v2.y ), QuadraticBezier$1( t, v0.z, v1.z, v2.z ) ); }; function LineCurve3$1( v1, v2 ) { Curve$1.call( this ); this.v1 = v1; this.v2 = v2; } LineCurve3$1.prototype = Object.create( Curve$1.prototype ); LineCurve3$1.prototype.constructor = LineCurve3$1; LineCurve3$1.prototype.getPoint = function ( t ) { if ( t === 1 ) { return this.v2.clone(); } var vector = new Vector3$1(); vector.subVectors( this.v2, this.v1 ); // diff vector.multiplyScalar( t ); vector.add( this.v1 ); return vector; }; function ArcCurve$1( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { EllipseCurve$1.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); } ArcCurve$1.prototype = Object.create( EllipseCurve$1.prototype ); ArcCurve$1.prototype.constructor = ArcCurve$1; // Curve$1.create = function ( construct, getPoint ) { console.log( 'THREE.Curve.create() has been deprecated' ); construct.prototype = Object.create( Curve$1.prototype ); construct.prototype.constructor = construct; construct.prototype.getPoint = getPoint; return construct; }; // function Spline$1( points ) { console.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' ); CatmullRomCurve3$1.call( this, points ); this.type = 'catmullrom'; } Spline$1.prototype = Object.create( CatmullRomCurve3$1.prototype ); Object.assign( Spline$1.prototype, { initFromArray: function ( a ) { console.error( 'THREE.Spline: .initFromArray() has been removed.' ); }, getControlPointsArray: function ( optionalTarget ) { console.error( 'THREE.Spline: .getControlPointsArray() has been removed.' ); }, reparametrizeByArcLength: function ( samplingCoef ) { console.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' ); } } ); GridHelper$1.prototype.setColors = function () { console.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' ); }; // Object.assign( Box2$1.prototype, { center: function ( optionalTarget ) { console.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' ); return this.getCenter( optionalTarget ); }, empty: function () { console.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' ); return this.isEmpty(); }, isIntersectionBox: function ( box ) { console.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' ); return this.intersectsBox( box ); }, size: function ( optionalTarget ) { console.warn( 'THREE.Box2: .size() has been renamed to .getSize().' ); return this.getSize( optionalTarget ); } } ); Object.assign( Box3$1.prototype, { center: function ( optionalTarget ) { console.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' ); return this.getCenter( optionalTarget ); }, empty: function () { console.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' ); return this.isEmpty(); }, isIntersectionBox: function ( box ) { console.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' ); return this.intersectsBox( box ); }, isIntersectionSphere: function ( sphere ) { console.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); return this.intersectsSphere( sphere ); }, size: function ( optionalTarget ) { console.warn( 'THREE.Box3: .size() has been renamed to .getSize().' ); return this.getSize( optionalTarget ); } } ); Line3$1.prototype.center = function ( optionalTarget ) { console.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' ); return this.getCenter( optionalTarget ); }; _Math$1.random16 = function () { console.warn( 'THREE.Math.random16() has been deprecated. Use Math.random() instead.' ); return Math.random(); }; Object.assign( Matrix3$1.prototype, { flattenToArrayOffset: function ( array, offset ) { console.warn( "THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." ); return this.toArray( array, offset ); }, multiplyVector3: function ( vector ) { console.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' ); return vector.applyMatrix3( this ); }, multiplyVector3Array: function ( a ) { console.warn( 'THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' ); return this.applyToVector3Array( a ); }, applyToBuffer: function( buffer, offset, length ) { console.warn( 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' ); return this.applyToBufferAttribute( buffer ); }, applyToVector3Array: function( array, offset, length ) { console.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' ); } } ); Object.assign( Matrix4$1.prototype, { extractPosition: function ( m ) { console.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' ); return this.copyPosition( m ); }, flattenToArrayOffset: function ( array, offset ) { console.warn( "THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." ); return this.toArray( array, offset ); }, getPosition: function () { var v1; return function getPosition() { if ( v1 === undefined ) v1 = new Vector3$1(); console.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' ); return v1.setFromMatrixColumn( this, 3 ); }; }(), setRotationFromQuaternion: function ( q ) { console.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' ); return this.makeRotationFromQuaternion( q ); }, multiplyToArray: function () { console.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' ); }, multiplyVector3: function ( vector ) { console.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); return vector.applyMatrix4( this ); }, multiplyVector4: function ( vector ) { console.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); return vector.applyMatrix4( this ); }, multiplyVector3Array: function ( a ) { console.warn( 'THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' ); return this.applyToVector3Array( a ); }, rotateAxis: function ( v ) { console.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' ); v.transformDirection( this ); }, crossVector: function ( vector ) { console.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); return vector.applyMatrix4( this ); }, translate: function () { console.error( 'THREE.Matrix4: .translate() has been removed.' ); }, rotateX: function () { console.error( 'THREE.Matrix4: .rotateX() has been removed.' ); }, rotateY: function () { console.error( 'THREE.Matrix4: .rotateY() has been removed.' ); }, rotateZ: function () { console.error( 'THREE.Matrix4: .rotateZ() has been removed.' ); }, rotateByAxis: function () { console.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' ); }, applyToBuffer: function( buffer, offset, length ) { console.warn( 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' ); return this.applyToBufferAttribute( buffer ); }, applyToVector3Array: function( array, offset, length ) { console.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' ); }, makeFrustum: function( left, right, bottom, top, near, far ) { console.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' ); return this.makePerspective( left, right, top, bottom, near, far ); } } ); Plane$2.prototype.isIntersectionLine = function ( line ) { console.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' ); return this.intersectsLine( line ); }; Quaternion$1.prototype.multiplyVector3 = function ( vector ) { console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' ); return vector.applyQuaternion( this ); }; Object.assign( Ray$1.prototype, { isIntersectionBox: function ( box ) { console.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' ); return this.intersectsBox( box ); }, isIntersectionPlane: function ( plane ) { console.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' ); return this.intersectsPlane( plane ); }, isIntersectionSphere: function ( sphere ) { console.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); return this.intersectsSphere( sphere ); } } ); Object.assign( Shape$2.prototype, { extrude: function ( options ) { console.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' ); return new ExtrudeGeometry$1( this, options ); }, makeGeometry: function ( options ) { console.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' ); return new ShapeGeometry$1( this, options ); } } ); Object.assign( Vector2$1.prototype, { fromAttribute: function ( attribute, index, offset ) { console.error( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' ); return this.fromBufferAttribute( attribute, index, offset ); } } ); Object.assign( Vector3$1.prototype, { setEulerFromRotationMatrix: function () { console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' ); }, setEulerFromQuaternion: function () { console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' ); }, getPositionFromMatrix: function ( m ) { console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' ); return this.setFromMatrixPosition( m ); }, getScaleFromMatrix: function ( m ) { console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' ); return this.setFromMatrixScale( m ); }, getColumnFromMatrix: function ( index, matrix ) { console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' ); return this.setFromMatrixColumn( matrix, index ); }, applyProjection: function ( m ) { console.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' ); return this.applyMatrix4( m ); }, fromAttribute: function ( attribute, index, offset ) { console.error( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' ); return this.fromBufferAttribute( attribute, index, offset ); } } ); Object.assign( Vector4$1.prototype, { fromAttribute: function ( attribute, index, offset ) { console.error( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' ); return this.fromBufferAttribute( attribute, index, offset ); } } ); // Geometry$1.prototype.computeTangents = function () { console.warn( 'THREE.Geometry: .computeTangents() has been removed.' ); }; Object.assign( Object3D$1.prototype, { getChildByName: function ( name ) { console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' ); return this.getObjectByName( name ); }, renderDepth: function () { console.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' ); }, translate: function ( distance, axis ) { console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' ); return this.translateOnAxis( axis, distance ); } } ); Object.defineProperties( Object3D$1.prototype, { eulerOrder: { get: function () { console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); return this.rotation.order; }, set: function ( value ) { console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); this.rotation.order = value; } }, useQuaternion: { get: function () { console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); }, set: function () { console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); } } } ); Object.defineProperties( LOD$1.prototype, { objects: { get: function () { console.warn( 'THREE.LOD: .objects has been renamed to .levels.' ); return this.levels; } } } ); Object.defineProperty( Skeleton$1.prototype, 'useVertexTexture', { get: function () { console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' ); }, set: function () { console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' ); } } ); Object.defineProperty( Curve$1.prototype, '__arcLengthDivisions', { get: function () { console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' ); return this.arcLengthDivisions; }, set: function ( value ) { console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' ); this.arcLengthDivisions = value; } } ); // PerspectiveCamera$2.prototype.setLens = function ( focalLength, filmGauge ) { console.warn( "THREE.PerspectiveCamera.setLens is deprecated. " + "Use .setFocalLength and .filmGauge for a photographic setup." ); if ( filmGauge !== undefined ) this.filmGauge = filmGauge; this.setFocalLength( focalLength ); }; // Object.defineProperties( Light$1.prototype, { onlyShadow: { set: function () { console.warn( 'THREE.Light: .onlyShadow has been removed.' ); } }, shadowCameraFov: { set: function ( value ) { console.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' ); this.shadow.camera.fov = value; } }, shadowCameraLeft: { set: function ( value ) { console.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' ); this.shadow.camera.left = value; } }, shadowCameraRight: { set: function ( value ) { console.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' ); this.shadow.camera.right = value; } }, shadowCameraTop: { set: function ( value ) { console.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' ); this.shadow.camera.top = value; } }, shadowCameraBottom: { set: function ( value ) { console.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' ); this.shadow.camera.bottom = value; } }, shadowCameraNear: { set: function ( value ) { console.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' ); this.shadow.camera.near = value; } }, shadowCameraFar: { set: function ( value ) { console.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' ); this.shadow.camera.far = value; } }, shadowCameraVisible: { set: function () { console.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' ); } }, shadowBias: { set: function ( value ) { console.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' ); this.shadow.bias = value; } }, shadowDarkness: { set: function () { console.warn( 'THREE.Light: .shadowDarkness has been removed.' ); } }, shadowMapWidth: { set: function ( value ) { console.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' ); this.shadow.mapSize.width = value; } }, shadowMapHeight: { set: function ( value ) { console.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' ); this.shadow.mapSize.height = value; } } } ); // Object.defineProperties( BufferAttribute$1.prototype, { length: { get: function () { console.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' ); return this.array.length; } } } ); Object.assign( BufferGeometry$1.prototype, { addIndex: function ( index ) { console.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' ); this.setIndex( index ); }, addDrawCall: function ( start, count, indexOffset ) { if ( indexOffset !== undefined ) { console.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' ); } console.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' ); this.addGroup( start, count ); }, clearDrawCalls: function () { console.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' ); this.clearGroups(); }, computeTangents: function () { console.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' ); }, computeOffsets: function () { console.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' ); } } ); Object.defineProperties( BufferGeometry$1.prototype, { drawcalls: { get: function () { console.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' ); return this.groups; } }, offsets: { get: function () { console.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' ); return this.groups; } } } ); // Object.defineProperties( Uniform$1.prototype, { dynamic: { set: function () { console.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' ); } }, onUpdate: { value: function () { console.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' ); return this; } } } ); // Object.defineProperties( Material$1.prototype, { wrapAround: { get: function () { console.warn( 'THREE.Material: .wrapAround has been removed.' ); }, set: function () { console.warn( 'THREE.Material: .wrapAround has been removed.' ); } }, wrapRGB: { get: function () { console.warn( 'THREE.Material: .wrapRGB has been removed.' ); return new Color$1(); } } } ); Object.defineProperties( MeshPhongMaterial$1.prototype, { metal: { get: function () { console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' ); return false; }, set: function () { console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' ); } } } ); Object.defineProperties( ShaderMaterial$1.prototype, { derivatives: { get: function () { console.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); return this.extensions.derivatives; }, set: function ( value ) { console.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); this.extensions.derivatives = value; } } } ); // Object.assign( WebGLRenderer$1.prototype, { getCurrentRenderTarget: function () { console.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' ); return this.getRenderTarget(); }, supportsFloatTextures: function () { console.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).' ); return this.extensions.get( 'OES_texture_float' ); }, supportsHalfFloatTextures: function () { console.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).' ); return this.extensions.get( 'OES_texture_half_float' ); }, supportsStandardDerivatives: function () { console.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).' ); return this.extensions.get( 'OES_standard_derivatives' ); }, supportsCompressedTextureS3TC: function () { console.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).' ); return this.extensions.get( 'WEBGL_compressed_texture_s3tc' ); }, supportsCompressedTexturePVRTC: function () { console.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).' ); return this.extensions.get( 'WEBGL_compressed_texture_pvrtc' ); }, supportsBlendMinMax: function () { console.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).' ); return this.extensions.get( 'EXT_blend_minmax' ); }, supportsVertexTextures: function () { console.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' ); return this.capabilities.vertexTextures; }, supportsInstancedArrays: function () { console.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).' ); return this.extensions.get( 'ANGLE_instanced_arrays' ); }, enableScissorTest: function ( boolean ) { console.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' ); this.setScissorTest( boolean ); }, initMaterial: function () { console.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' ); }, addPrePlugin: function () { console.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' ); }, addPostPlugin: function () { console.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' ); }, updateShadowMap: function () { console.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' ); } } ); Object.defineProperties( WebGLRenderer$1.prototype, { shadowMapEnabled: { get: function () { return this.shadowMap.enabled; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' ); this.shadowMap.enabled = value; } }, shadowMapType: { get: function () { return this.shadowMap.type; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' ); this.shadowMap.type = value; } }, shadowMapCullFace: { get: function () { return this.shadowMap.cullFace; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' ); this.shadowMap.cullFace = value; } } } ); Object.defineProperties( WebGLShadowMap$1.prototype, { cullFace: { get: function () { return this.renderReverseSided ? CullFaceFront$1 : CullFaceBack$1; }, set: function ( cullFace ) { var value = ( cullFace !== CullFaceBack$1 ); console.warn( "WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to " + value + "." ); this.renderReverseSided = value; } } } ); // Object.defineProperties( WebGLRenderTarget$1.prototype, { wrapS: { get: function () { console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); return this.texture.wrapS; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); this.texture.wrapS = value; } }, wrapT: { get: function () { console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); return this.texture.wrapT; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); this.texture.wrapT = value; } }, magFilter: { get: function () { console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); return this.texture.magFilter; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); this.texture.magFilter = value; } }, minFilter: { get: function () { console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); return this.texture.minFilter; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); this.texture.minFilter = value; } }, anisotropy: { get: function () { console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); return this.texture.anisotropy; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); this.texture.anisotropy = value; } }, offset: { get: function () { console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); return this.texture.offset; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); this.texture.offset = value; } }, repeat: { get: function () { console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); return this.texture.repeat; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); this.texture.repeat = value; } }, format: { get: function () { console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); return this.texture.format; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); this.texture.format = value; } }, type: { get: function () { console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); return this.texture.type; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); this.texture.type = value; } }, generateMipmaps: { get: function () { console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); return this.texture.generateMipmaps; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); this.texture.generateMipmaps = value; } } } ); // Audio$1.prototype.load = function ( file ) { console.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' ); var scope = this; var audioLoader = new AudioLoader$1(); audioLoader.load( file, function ( buffer ) { scope.setBuffer( buffer ); } ); return this; }; AudioAnalyser$1.prototype.getData = function () { console.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' ); return this.getFrequencyData(); }; /** * @author dmarcos / https://github.com/dmarcos * @author mrdoob / http://mrdoob.com * * WebVR Spec: http://mozvr.github.io/webvr-spec/webvr.html * * Firefox: http://mozvr.com/downloads/ * Chromium: https://webvr.info/get-chrome * */ var VREffect = function VREffect(renderer, onError) { var vrDisplay, vrDisplays; var eyeTranslationL = new Vector3$1(); var eyeTranslationR = new Vector3$1(); var renderRectL, renderRectR; var frameData = null; if ('VRFrameData' in window) { frameData = new VRFrameData(); } function gotVRDisplays(displays) { vrDisplays = displays; if (displays.length > 0) { vrDisplay = displays[0]; } else { if (onError) onError('HMD not available'); } } if (navigator.getVRDisplays) { navigator.getVRDisplays().then(gotVRDisplays).catch(function () { console.warn('THREE.VREffect: Unable to get VR Displays'); }); } // this.isPresenting = false; this.scale = 1; var scope = this; var rendererSize = renderer.getSize(); var rendererUpdateStyle = false; var rendererPixelRatio = renderer.getPixelRatio(); this.getVRDisplay = function () { return vrDisplay; }; this.setVRDisplay = function (value) { vrDisplay = value; }; this.getVRDisplays = function () { console.warn('THREE.VREffect: getVRDisplays() is being deprecated.'); return vrDisplays; }; this.setSize = function (width, height, updateStyle) { rendererSize = { width: width, height: height }; rendererUpdateStyle = updateStyle; if (scope.isPresenting) { var eyeParamsL = vrDisplay.getEyeParameters('left'); renderer.setPixelRatio(1); renderer.setSize(eyeParamsL.renderWidth * 2, eyeParamsL.renderHeight, false); } else { renderer.setPixelRatio(rendererPixelRatio); renderer.setSize(width, height, updateStyle); } }; // fullscreen var canvas = renderer.domElement; var defaultLeftBounds = [0.0, 0.0, 0.5, 1.0]; var defaultRightBounds = [0.5, 0.0, 0.5, 1.0]; function onVRDisplayPresentChange() { var wasPresenting = scope.isPresenting; scope.isPresenting = vrDisplay !== undefined && vrDisplay.isPresenting; if (scope.isPresenting) { var eyeParamsL = vrDisplay.getEyeParameters('left'); var eyeWidth = eyeParamsL.renderWidth; var eyeHeight = eyeParamsL.renderHeight; if (!wasPresenting) { rendererPixelRatio = renderer.getPixelRatio(); rendererSize = renderer.getSize(); renderer.setPixelRatio(1); renderer.setSize(eyeWidth * 2, eyeHeight, false); } } else if (wasPresenting) { renderer.setPixelRatio(rendererPixelRatio); renderer.setSize(rendererSize.width, rendererSize.height, rendererUpdateStyle); } } window.addEventListener('vrdisplaypresentchange', onVRDisplayPresentChange, false); this.setFullScreen = function (boolean) { return new Promise(function (resolve, reject) { if (vrDisplay === undefined) { reject(new Error('No VR hardware found.')); return; } if (scope.isPresenting === boolean) { resolve(); return; } if (boolean) { resolve(vrDisplay.requestPresent([{ source: canvas }])); } else { resolve(vrDisplay.exitPresent()); } }); }; this.requestPresent = function () { return this.setFullScreen(true); }; this.exitPresent = function () { return this.setFullScreen(false); }; this.requestAnimationFrame = function (f) { if (vrDisplay !== undefined) { return vrDisplay.requestAnimationFrame(f); } else { return window.requestAnimationFrame(f); } }; this.cancelAnimationFrame = function (h) { if (vrDisplay !== undefined) { vrDisplay.cancelAnimationFrame(h); } else { window.cancelAnimationFrame(h); } }; this.submitFrame = function () { if (vrDisplay !== undefined && scope.isPresenting) { vrDisplay.submitFrame(); } }; this.autoSubmitFrame = true; // render var cameraL = new PerspectiveCamera$2(); cameraL.layers.enable(1); var cameraR = new PerspectiveCamera$2(); cameraR.layers.enable(2); this.render = function (scene, camera, renderTarget, forceClear) { if (vrDisplay && scope.isPresenting) { var autoUpdate = scene.autoUpdate; if (autoUpdate) { scene.updateMatrixWorld(); scene.autoUpdate = false; } var eyeParamsL = vrDisplay.getEyeParameters('left'); var eyeParamsR = vrDisplay.getEyeParameters('right'); eyeTranslationL.fromArray(eyeParamsL.offset); eyeTranslationR.fromArray(eyeParamsR.offset); if (Array.isArray(scene)) { console.warn('THREE.VREffect.render() no longer supports arrays. Use object.layers instead.'); scene = scene[0]; } // When rendering we don't care what the recommended size is, only what the actual size // of the backbuffer is. var size = renderer.getSize(); var layers = vrDisplay.getLayers(); var leftBounds; var rightBounds; if (layers.length) { var layer = layers[0]; leftBounds = layer.leftBounds !== null && layer.leftBounds.length === 4 ? layer.leftBounds : defaultLeftBounds; rightBounds = layer.rightBounds !== null && layer.rightBounds.length === 4 ? layer.rightBounds : defaultRightBounds; } else { leftBounds = defaultLeftBounds; rightBounds = defaultRightBounds; } renderRectL = { x: Math.round(size.width * leftBounds[0]), y: Math.round(size.height * leftBounds[1]), width: Math.round(size.width * leftBounds[2]), height: Math.round(size.height * leftBounds[3]) }; renderRectR = { x: Math.round(size.width * rightBounds[0]), y: Math.round(size.height * rightBounds[1]), width: Math.round(size.width * rightBounds[2]), height: Math.round(size.height * rightBounds[3]) }; if (renderTarget) { renderer.setRenderTarget(renderTarget); renderTarget.scissorTest = true; } else { renderer.setRenderTarget(null); renderer.setScissorTest(true); } if (renderer.autoClear || forceClear) renderer.clear(); if (camera.parent === null) camera.updateMatrixWorld(); camera.matrixWorld.decompose(cameraL.position, cameraL.quaternion, cameraL.scale); camera.matrixWorld.decompose(cameraR.position, cameraR.quaternion, cameraR.scale); var scale = this.scale; cameraL.translateOnAxis(eyeTranslationL, scale); cameraR.translateOnAxis(eyeTranslationR, scale); if (vrDisplay.getFrameData) { vrDisplay.depthNear = camera.near; vrDisplay.depthFar = camera.far; vrDisplay.getFrameData(frameData); cameraL.projectionMatrix.elements = frameData.leftProjectionMatrix; cameraR.projectionMatrix.elements = frameData.rightProjectionMatrix; } else { cameraL.projectionMatrix = fovToProjection(eyeParamsL.fieldOfView, true, camera.near, camera.far); cameraR.projectionMatrix = fovToProjection(eyeParamsR.fieldOfView, true, camera.near, camera.far); } // render left eye if (renderTarget) { renderTarget.viewport.set(renderRectL.x, renderRectL.y, renderRectL.width, renderRectL.height); renderTarget.scissor.set(renderRectL.x, renderRectL.y, renderRectL.width, renderRectL.height); } else { renderer.setViewport(renderRectL.x, renderRectL.y, renderRectL.width, renderRectL.height); renderer.setScissor(renderRectL.x, renderRectL.y, renderRectL.width, renderRectL.height); } renderer.render(scene, cameraL, renderTarget, forceClear); // render right eye if (renderTarget) { renderTarget.viewport.set(renderRectR.x, renderRectR.y, renderRectR.width, renderRectR.height); renderTarget.scissor.set(renderRectR.x, renderRectR.y, renderRectR.width, renderRectR.height); } else { renderer.setViewport(renderRectR.x, renderRectR.y, renderRectR.width, renderRectR.height); renderer.setScissor(renderRectR.x, renderRectR.y, renderRectR.width, renderRectR.height); } renderer.render(scene, cameraR, renderTarget, forceClear); if (renderTarget) { renderTarget.viewport.set(0, 0, size.width, size.height); renderTarget.scissor.set(0, 0, size.width, size.height); renderTarget.scissorTest = false; renderer.setRenderTarget(null); } else { renderer.setViewport(0, 0, size.width, size.height); renderer.setScissorTest(false); } if (autoUpdate) { scene.autoUpdate = true; } if (scope.autoSubmitFrame) { scope.submitFrame(); } return; } // Regular render mode if not HMD renderer.render(scene, camera, renderTarget, forceClear); }; this.dispose = function () { window.removeEventListener('vrdisplaypresentchange', onVRDisplayPresentChange, false); }; // function fovToNDCScaleOffset(fov) { var pxscale = 2.0 / (fov.leftTan + fov.rightTan); var pxoffset = (fov.leftTan - fov.rightTan) * pxscale * 0.5; var pyscale = 2.0 / (fov.upTan + fov.downTan); var pyoffset = (fov.upTan - fov.downTan) * pyscale * 0.5; return { scale: [pxscale, pyscale], offset: [pxoffset, pyoffset] }; } function fovPortToProjection(fov, rightHanded, zNear, zFar) { rightHanded = rightHanded === undefined ? true : rightHanded; zNear = zNear === undefined ? 0.01 : zNear; zFar = zFar === undefined ? 10000.0 : zFar; var handednessScale = rightHanded ? -1.0 : 1.0; // start with an identity matrix var mobj = new Matrix4$1(); var m = mobj.elements; // and with scale/offset info for normalized device coords var scaleAndOffset = fovToNDCScaleOffset(fov); // X result, map clip edges to [-w,+w] m[0 * 4 + 0] = scaleAndOffset.scale[0]; m[0 * 4 + 1] = 0.0; m[0 * 4 + 2] = scaleAndOffset.offset[0] * handednessScale; m[0 * 4 + 3] = 0.0; // Y result, map clip edges to [-w,+w] // Y offset is negated because this proj matrix transforms from world coords with Y=up, // but the NDC scaling has Y=down (thanks D3D?) m[1 * 4 + 0] = 0.0; m[1 * 4 + 1] = scaleAndOffset.scale[1]; m[1 * 4 + 2] = -scaleAndOffset.offset[1] * handednessScale; m[1 * 4 + 3] = 0.0; // Z result (up to the app) m[2 * 4 + 0] = 0.0; m[2 * 4 + 1] = 0.0; m[2 * 4 + 2] = zFar / (zNear - zFar) * -handednessScale; m[2 * 4 + 3] = zFar * zNear / (zNear - zFar); // W result (= Z in) m[3 * 4 + 0] = 0.0; m[3 * 4 + 1] = 0.0; m[3 * 4 + 2] = handednessScale; m[3 * 4 + 3] = 0.0; mobj.transpose(); return mobj; } function fovToProjection(fov, rightHanded, zNear, zFar) { var DEG2RAD = Math.PI / 180.0; var fovPort = { upTan: Math.tan(fov.upDegrees * DEG2RAD), downTan: Math.tan(fov.downDegrees * DEG2RAD), leftTan: Math.tan(fov.leftDegrees * DEG2RAD), rightTan: Math.tan(fov.rightDegrees * DEG2RAD) }; return fovPortToProjection(fovPort, rightHanded, zNear, zFar); } }; /** * @author dmarcos / https://github.com/dmarcos * @author mrdoob / http://mrdoob.com * @author halvves / https://github.com/halvves (i only es6 moduled it) */ class VRControls { constructor(camera, onError) { this.camera = camera; this.vrDisplay; this.vrDisplays; this.standingMatrix = new Matrix4$1(); this.frameData = null; if ('VRFrameData' in window) { this.frameData = new VRFrameData(); } if (navigator.getVRDisplays) { navigator .getVRDisplays() .then((displays) => { this.vrDisplays = displays; if (displays.length > 0) { this.vrDisplay = displays[0]; } else { if (onError) onError('VR input not available.'); } }) .catch(() => { console.warn('VRControls: Unable to get VR Displays'); }); } // the Rift SDK returns the position in meters // this scale factor allows the user to define how meters // are converted to scene units. this.scale = 1; // If true will use "standing space" coordinate system where y=0 is the // floor and x=0, z=0 is the center of the room. this.standing = false; // Distance from the users eyes to the floor in meters. Used when // standing=true but the VRDisplay doesn't provide stageParameters. this.userHeight = 1.6; } getVRDisplay() { return this.vrDisplay; }; setVRDisplay(value) { this.vrDisplay = value; }; getVRDisplays() { console.warn('VRControls: getVRDisplays() is being deprecated.'); return this.vrDisplays; }; getStandingMatrix() { return this.standingMatrix; }; update() { const camera = this.camera; if (this.vrDisplay) { let pose; if (this.vrDisplay.getFrameData) { this.vrDisplay.getFrameData(this.frameData); pose = this.frameData.pose; } else if (this.vrDisplay.getPose) { pose = this.vrDisplay.getPose(); } if (pose.orientation !== null) { camera.quaternion.fromArray(pose.orientation); } if (pose.position !== null) { camera.position.fromArray(pose.position); } else { camera.position.set(0, 0, 0); } if (this.standing) { if (this.vrDisplay.stageParameters) { camera.updateMatrix(); this.standingMatrix.fromArray(this.vrDisplay.stageParameters.sittingToStandingTransform); camera.applyMatrix(this.standingMatrix); } else { camera.position.setY(camera.position.y + this.userHeight); } } camera.position.multiplyScalar(this.scale); } }; dispose() { this.vrDisplay = null; }; } /** * @author mrdoob / http://mrdoob.com * @author Mugen87 / https://github.com/Mugen87 * * Based on @tojiro's vr-samples-utils.js */ var WEBVR = { isAvailable: function isAvailable() { console.warn('WEBVR: isAvailable() is being deprecated. Use .checkAvailability() instead.'); return navigator.getVRDisplays !== undefined; }, checkAvailability: function checkAvailability() { return new Promise(function (resolve, reject) { if (navigator.getVRDisplays !== undefined) { navigator.getVRDisplays().then(function (displays) { if (displays.length === 0) { reject('WebVR supported, but no VRDisplays found.'); } else { resolve(); } }); } else { reject('Your browser does not support WebVR. See webvr.info for assistance.'); } }); }, getVRDisplay: function getVRDisplay(onDisplay) { if ('getVRDisplays' in navigator) { navigator.getVRDisplays().then(function (displays) { onDisplay(displays[0]); }); } }, getMessage: function getMessage() { console.warn('WEBVR: getMessage() is being deprecated. Use .getMessageContainer( message ) instead.'); var message; if (navigator.getVRDisplays) { navigator.getVRDisplays().then(function (displays) { if (displays.length === 0) message = 'WebVR supported, but no VRDisplays found.'; }); } else { message = 'Your browser does not support WebVR. See webvr.info for assistance.'; } if (message !== undefined) { var container = document.createElement('div'); container.style.position = 'absolute'; container.style.left = '0'; container.style.top = '0'; container.style.right = '0'; container.style.zIndex = '999'; container.align = 'center'; var error = document.createElement('div'); error.style.fontFamily = 'sans-serif'; error.style.fontSize = '16px'; error.style.fontStyle = 'normal'; error.style.lineHeight = '26px'; error.style.backgroundColor = '#fff'; error.style.color = '#000'; error.style.padding = '10px 20px'; error.style.margin = '50px'; error.style.display = 'inline-block'; error.innerHTML = message; container.appendChild(error); return container; } }, getMessageContainer: function getMessageContainer(message) { var container = document.createElement('div'); container.style.position = 'absolute'; container.style.left = '0'; container.style.top = '0'; container.style.right = '0'; container.style.zIndex = '999'; container.align = 'center'; var error = document.createElement('div'); error.style.fontFamily = 'sans-serif'; error.style.fontSize = '16px'; error.style.fontStyle = 'normal'; error.style.lineHeight = '26px'; error.style.backgroundColor = '#fff'; error.style.color = '#000'; error.style.padding = '10px 20px'; error.style.margin = '50px'; error.style.display = 'inline-block'; error.innerHTML = message; container.appendChild(error); return container; }, getButton: function getButton(display, canvas) { if ('VREffect' in THREE && display instanceof THREE.VREffect) { console.error('WebVR.getButton() now expects a VRDisplay.'); return document.createElement('button'); } var button = document.createElement('button'); button.style.position = 'absolute'; button.style.left = 'calc(50% - 50px)'; button.style.bottom = '20px'; button.style.width = '100px'; button.style.border = '0'; button.style.padding = '8px'; button.style.cursor = 'pointer'; button.style.backgroundColor = '#000'; button.style.color = '#fff'; button.style.fontFamily = 'sans-serif'; button.style.fontSize = '13px'; button.style.fontStyle = 'normal'; button.style.textAlign = 'center'; button.style.zIndex = '999'; if (display) { button.textContent = 'ENTER VR'; button.onclick = function () { display.isPresenting ? display.exitPresent() : display.requestPresent([{ source: canvas }]); }; window.addEventListener('vrdisplaypresentchange', function () { button.textContent = display.isPresenting ? 'EXIT VR' : 'ENTER VR'; }, false); } else { button.textContent = 'NO VR DISPLAY'; } return button; } }; var VRModule = /*#__PURE__*/ function () { function VRModule() { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, VRModule); this.params = Object.assign(params, { message: true, button: true }); this.scene = null; this.camera = null; this.effect = null; } _createClass(VRModule, [{ key: "manager", value: function manager(_manager) { var _this = this; _manager.define('vr'); var rendering = _manager.use('rendering'); var renderer = _manager.get('renderer'); var resize = _manager.use('resize'); this.effect = new VREffect(renderer); this.scene = _manager.get('scene'); this.camera = _manager.get('camera'); rendering.effect(this.effect); // TODO: Fix resize. resize.addCallback(function (width, height) { _this.effect.setSize(+width, +height); }); // WEBVR var _this$params = this.params, message = _this$params.message, button = _this$params.button; if (message) WEBVR.checkAvailability().catch(function (message) { document.body.appendChild(WEBVR.getMessageContainer(message)); }); if (button) WEBVR.getVRDisplay(function (display) { var vrbtn = WEBVR.getButton(display, renderer.domElement); vrbtn.className = 'vr-btn'; document.body.appendChild(vrbtn); }); } }]); return VRModule; }(); var VR2Module = /*#__PURE__*/ function () { function VR2Module() { _classCallCheck(this, VR2Module); this.display = new Promise(function (resolve) { return WEBVR.getVRDisplay(function (display) { return resolve(display); }); }); } _createClass(VR2Module, [{ key: "manager", value: function manager(_manager2) { _manager2.define('vr'); var renderer = _manager2.get('renderer'); renderer.vr.enabled = true; console.log(REVISION$1); console.log(1); this.display.then(function (display) { renderer.vr.setDevice(display); var vrbtn = WEBVR.getButton(display, renderer.domElement); vrbtn.className = 'vr-btn'; document.body.appendChild(vrbtn); }); } }]); return VR2Module; }(); var VRControls$1 = /*#__PURE__*/ function (_ControlsModule) { function VRControls$$1(_ref) { var object = _ref.object, onError = _ref.onError, intensity = _ref.intensity; _classCallCheck(this, VRControls$$1); var controls = new VRControls(object.native, onError); controls.standing = true; controls.scale = intensity; return _possibleConstructorReturn(this, _getPrototypeOf(VRControls$$1).call(this, { controls: controls })); } _inherits(VRControls$$1, _ControlsModule); return VRControls$$1; }(ControlsModule); export { WEBVR, VRModule, VR2Module, VRControls$1 as VRControls }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVlJLaXQubW9kdWxlLmpzIiwic291cmNlcyI6WyIuLi9zcmMvbW9kdWxlcy9leHRyYS9yb2xsdXBQbHVnaW5CYWJlbEhlbHBlcnMiLCIuLi8uLi9ub2RlX21vZHVsZXMvd2hzL2J1aWxkL3docy5tb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9leHRyYS9ub2RlX21vZHVsZXMvdGhyZWUvYnVpbGQvdGhyZWUubW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvZXh0cmEvdnIvVlJFZmZlY3QuanMiLCIuLi9zcmMvbW9kdWxlcy9leHRyYS9ub2RlX21vZHVsZXMvdGhyZWUtdnJjb250cm9scy1tb2R1bGUvc3JjL3ZyLWNvbnRyb2xzLmpzIiwiLi4vc3JjL21vZHVsZXMvZXh0cmEvdnIvV2ViVlIuanMiLCIuLi9zcmMvbW9kdWxlcy9leHRyYS9WUktpdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBfdHlwZW9mIGFzIHR5cGVvZiwgX2pzeCBhcyBqc3gsIF9hc3luY0l0ZXJhdG9yIGFzIGFzeW5jSXRlcmF0b3IsIF9Bd2FpdFZhbHVlIGFzIEF3YWl0VmFsdWUsIF9Bc3luY0dlbmVyYXRvciBhcyBBc3luY0dlbmVyYXRvciwgX3dyYXBBc3luY0dlbmVyYXRvciBhcyB3cmFwQXN5bmNHZW5lcmF0b3IsIF9hd2FpdEFzeW5jR2VuZXJhdG9yIGFzIGF3YWl0QXN5bmNHZW5lcmF0b3IsIF9hc3luY0dlbmVyYXRvckRlbGVnYXRlIGFzIGFzeW5jR2VuZXJhdG9yRGVsZWdhdGUsIF9hc3luY1RvR2VuZXJhdG9yIGFzIGFzeW5jVG9HZW5lcmF0b3IsIF9jbGFzc0NhbGxDaGVjayBhcyBjbGFzc0NhbGxDaGVjaywgX2NyZWF0ZUNsYXNzIGFzIGNyZWF0ZUNsYXNzLCBfZGVmaW5lRW51bWVyYWJsZVByb3BlcnRpZXMgYXMgZGVmaW5lRW51bWVyYWJsZVByb3BlcnRpZXMsIF9kZWZhdWx0cyBhcyBkZWZhdWx0cywgX2RlZmluZVByb3BlcnR5IGFzIGRlZmluZVByb3BlcnR5LCBfZXh0ZW5kcyBhcyBleHRlbmRzLCBfb2JqZWN0U3ByZWFkIGFzIG9iamVjdFNwcmVhZCwgX2luaGVyaXRzIGFzIGluaGVyaXRzLCBfaW5oZXJpdHNMb29zZSBhcyBpbmhlcml0c0xvb3NlLCBfZ2V0UHJvdG90eXBlT2YgYXMgZ2V0UHJvdG90eXBlT2YsIF9zZXRQcm90b3R5cGVPZiBhcyBzZXRQcm90b3R5cGVPZiwgX2NvbnN0cnVjdCBhcyBjb25zdHJ1Y3QsIF93cmFwTmF0aXZlU3VwZXIgYXMgd3JhcE5hdGl2ZVN1cGVyLCBfaW5zdGFuY2VvZiBhcyBpbnN0YW5jZW9mLCBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IGFzIGludGVyb3BSZXF1aXJlRGVmYXVsdCwgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgYXMgaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCwgX25ld0Fycm93Q2hlY2sgYXMgbmV3QXJyb3dDaGVjaywgX29iamVjdERlc3RydWN0dXJpbmdFbXB0eSBhcyBvYmplY3REZXN0cnVjdHVyaW5nRW1wdHksIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBhcyBvYmplY3RXaXRob3V0UHJvcGVydGllcywgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBhcyBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGFzIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4sIF9zdXBlclByb3BCYXNlIGFzIHN1cGVyUHJvcEJhc2UsIF9nZXQgYXMgZ2V0LCBfc2V0IGFzIHNldCwgX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbCBhcyB0YWdnZWRUZW1wbGF0ZUxpdGVyYWwsIF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZSBhcyB0YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZSwgX3RlbXBvcmFsUmVmIGFzIHRlbXBvcmFsUmVmLCBfcmVhZE9ubHlFcnJvciBhcyByZWFkT25seUVycm9yLCBfY2xhc3NOYW1lVERaRXJyb3IgYXMgY2xhc3NOYW1lVERaRXJyb3IsIF90ZW1wb3JhbFVuZGVmaW5lZCBhcyB0ZW1wb3JhbFVuZGVmaW5lZCwgX3NsaWNlZFRvQXJyYXkgYXMgc2xpY2VkVG9BcnJheSwgX3NsaWNlZFRvQXJyYXlMb29zZSBhcyBzbGljZWRUb0FycmF5TG9vc2UsIF90b0FycmF5IGFzIHRvQXJyYXksIF90b0NvbnN1bWFibGVBcnJheSBhcyB0b0NvbnN1bWFibGVBcnJheSwgX2FycmF5V2l0aG91dEhvbGVzIGFzIGFycmF5V2l0aG91dEhvbGVzLCBfYXJyYXlXaXRoSG9sZXMgYXMgYXJyYXlXaXRoSG9sZXMsIF9pdGVyYWJsZVRvQXJyYXkgYXMgaXRlcmFibGVUb0FycmF5LCBfaXRlcmFibGVUb0FycmF5TGltaXQgYXMgaXRlcmFibGVUb0FycmF5TGltaXQsIF9pdGVyYWJsZVRvQXJyYXlMaW1pdExvb3NlIGFzIGl0ZXJhYmxlVG9BcnJheUxpbWl0TG9vc2UsIF9ub25JdGVyYWJsZVNwcmVhZCBhcyBub25JdGVyYWJsZVNwcmVhZCwgX25vbkl0ZXJhYmxlUmVzdCBhcyBub25JdGVyYWJsZVJlc3QsIF9za2lwRmlyc3RHZW5lcmF0b3JOZXh0IGFzIHNraXBGaXJzdEdlbmVyYXRvck5leHQsIF90b1Byb3BlcnR5S2V5IGFzIHRvUHJvcGVydHlLZXksIF9pbml0aWFsaXplcldhcm5pbmdIZWxwZXIgYXMgaW5pdGlhbGl6ZXJXYXJuaW5nSGVscGVyLCBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSBhcyBpbml0aWFsaXplckRlZmluZVByb3BlcnR5LCBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yIGFzIGFwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciwgX2NsYXNzUHJpdmF0ZUZpZWxkTG9vc2VLZXkgYXMgY2xhc3NQcml2YXRlRmllbGRMb29zZUtleSwgX2NsYXNzUHJpdmF0ZUZpZWxkTG9vc2VCYXNlIGFzIGNsYXNzUHJpdmF0ZUZpZWxkTG9vc2VCYXNlLCBfY2xhc3NQcml2YXRlRmllbGRHZXQgYXMgY2xhc3NQcml2YXRlRmllbGRHZXQsIF9jbGFzc1ByaXZhdGVGaWVsZFNldCBhcyBjbGFzc1ByaXZhdGVGaWVsZFNldCB9O1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfdHlwZW9mKG9iaik7XG59XG5cbnZhciBSRUFDVF9FTEVNRU5UX1RZUEU7XG5cbmZ1bmN0aW9uIF9qc3godHlwZSwgcHJvcHMsIGtleSwgY2hpbGRyZW4pIHtcbiAgaWYgKCFSRUFDVF9FTEVNRU5UX1RZUEUpIHtcbiAgICBSRUFDVF9FTEVNRU5UX1RZUEUgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLmZvciAmJiBTeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKSB8fCAweGVhYzc7XG4gIH1cblxuICB2YXIgZGVmYXVsdFByb3BzID0gdHlwZSAmJiB0eXBlLmRlZmF1bHRQcm9wcztcbiAgdmFyIGNoaWxkcmVuTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCAtIDM7XG5cbiAgaWYgKCFwcm9wcyAmJiBjaGlsZHJlbkxlbmd0aCAhPT0gMCkge1xuICAgIHByb3BzID0ge1xuICAgICAgY2hpbGRyZW46IHZvaWQgMFxuICAgIH07XG4gIH1cblxuICBpZiAocHJvcHMgJiYgZGVmYXVsdFByb3BzKSB7XG4gICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gZGVmYXVsdFByb3BzKSB7XG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSB2b2lkIDApIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoIXByb3BzKSB7XG4gICAgcHJvcHMgPSBkZWZhdWx0UHJvcHMgfHwge307XG4gIH1cblxuICBpZiAoY2hpbGRyZW5MZW5ndGggPT09IDEpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkge1xuICAgIHZhciBjaGlsZEFycmF5ID0gbmV3IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGRBcnJheVtpXSA9IGFyZ3VtZW50c1tpICsgM107XG4gICAgfVxuXG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZEFycmF5O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuICAgIHR5cGU6IHR5cGUsXG4gICAga2V5OiBrZXkgPT09IHVuZGVmaW5lZCA/IG51bGwgOiAnJyArIGtleSxcbiAgICByZWY6IG51bGwsXG4gICAgcHJvcHM6IHByb3BzLFxuICAgIF9vd25lcjogbnVsbFxuICB9O1xufVxuXG5mdW5jdGlvbiBfYXN5bmNJdGVyYXRvcihpdGVyYWJsZSkge1xuICB2YXIgbWV0aG9kO1xuXG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBpZiAoU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHtcbiAgICAgIG1ldGhvZCA9IGl0ZXJhYmxlW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTtcbiAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkgcmV0dXJuIG1ldGhvZC5jYWxsKGl0ZXJhYmxlKTtcbiAgICB9XG5cbiAgICBpZiAoU3ltYm9sLml0ZXJhdG9yKSB7XG4gICAgICBtZXRob2QgPSBpdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdO1xuICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKSByZXR1cm4gbWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgaXMgbm90IGFzeW5jIGl0ZXJhYmxlXCIpO1xufVxuXG5mdW5jdGlvbiBfQXdhaXRWYWx1ZSh2YWx1ZSkge1xuICB0aGlzLndyYXBwZWQgPSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gX0FzeW5jR2VuZXJhdG9yKGdlbikge1xuICB2YXIgZnJvbnQsIGJhY2s7XG5cbiAgZnVuY3Rpb24gc2VuZChrZXksIGFyZykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgcmVxdWVzdCA9IHtcbiAgICAgICAga2V5OiBrZXksXG4gICAgICAgIGFyZzogYXJnLFxuICAgICAgICByZXNvbHZlOiByZXNvbHZlLFxuICAgICAgICByZWplY3Q6IHJlamVjdCxcbiAgICAgICAgbmV4dDogbnVsbFxuICAgICAgfTtcblxuICAgICAgaWYgKGJhY2spIHtcbiAgICAgICAgYmFjayA9IGJhY2submV4dCA9IHJlcXVlc3Q7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcm9udCA9IGJhY2sgPSByZXF1ZXN0O1xuICAgICAgICByZXN1bWUoa2V5LCBhcmcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzdW1lKGtleSwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXN1bHQgPSBnZW5ba2V5XShhcmcpO1xuICAgICAgdmFyIHZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgdmFyIHdyYXBwZWRBd2FpdCA9IHZhbHVlIGluc3RhbmNlb2YgX0F3YWl0VmFsdWU7XG4gICAgICBQcm9taXNlLnJlc29sdmUod3JhcHBlZEF3YWl0ID8gdmFsdWUud3JhcHBlZCA6IHZhbHVlKS50aGVuKGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgICAgaWYgKHdyYXBwZWRBd2FpdCkge1xuICAgICAgICAgIHJlc3VtZShcIm5leHRcIiwgYXJnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzZXR0bGUocmVzdWx0LmRvbmUgPyBcInJldHVyblwiIDogXCJub3JtYWxcIiwgYXJnKTtcbiAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgcmVzdW1lKFwidGhyb3dcIiwgZXJyKTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc2V0dGxlKFwidGhyb3dcIiwgZXJyKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzZXR0bGUodHlwZSwgdmFsdWUpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgXCJyZXR1cm5cIjpcbiAgICAgICAgZnJvbnQucmVzb2x2ZSh7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIGRvbmU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwidGhyb3dcIjpcbiAgICAgICAgZnJvbnQucmVqZWN0KHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGZyb250LnJlc29sdmUoe1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICBkb25lOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZnJvbnQgPSBmcm9udC5uZXh0O1xuXG4gICAgaWYgKGZyb250KSB7XG4gICAgICByZXN1bWUoZnJvbnQua2V5LCBmcm9udC5hcmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBiYWNrID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICB0aGlzLl9pbnZva2UgPSBzZW5kO1xuXG4gIGlmICh0eXBlb2YgZ2VuLnJldHVybiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhpcy5yZXR1cm4gPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuYXN5bmNJdGVyYXRvcikge1xuICBfQXN5bmNHZW5lcmF0b3IucHJvdG90eXBlW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn1cblxuX0FzeW5jR2VuZXJhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKGFyZykge1xuICByZXR1cm4gdGhpcy5faW52b2tlKFwibmV4dFwiLCBhcmcpO1xufTtcblxuX0FzeW5jR2VuZXJhdG9yLnByb3RvdHlwZS50aHJvdyA9IGZ1bmN0aW9uIChhcmcpIHtcbiAgcmV0dXJuIHRoaXMuX2ludm9rZShcInRocm93XCIsIGFyZyk7XG59O1xuXG5fQXN5bmNHZW5lcmF0b3IucHJvdG90eXBlLnJldHVybiA9IGZ1bmN0aW9uIChhcmcpIHtcbiAgcmV0dXJuIHRoaXMuX2ludm9rZShcInJldHVyblwiLCBhcmcpO1xufTtcblxuZnVuY3Rpb24gX3dyYXBBc3luY0dlbmVyYXRvcihmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgX0FzeW5jR2VuZXJhdG9yKGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBfYXdhaXRBc3luY0dlbmVyYXRvcih2YWx1ZSkge1xuICByZXR1cm4gbmV3IF9Bd2FpdFZhbHVlKHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gX2FzeW5jR2VuZXJhdG9yRGVsZWdhdGUoaW5uZXIsIGF3YWl0V3JhcCkge1xuICB2YXIgaXRlciA9IHt9LFxuICAgICAgd2FpdGluZyA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIHB1bXAoa2V5LCB2YWx1ZSkge1xuICAgIHdhaXRpbmcgPSB0cnVlO1xuICAgIHZhbHVlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgIHJlc29sdmUoaW5uZXJba2V5XSh2YWx1ZSkpO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBhd2FpdFdyYXAodmFsdWUpXG4gICAgfTtcbiAgfVxuXG4gIDtcblxuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvcikge1xuICAgIGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gIH1cblxuICBpdGVyLm5leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAod2FpdGluZykge1xuICAgICAgd2FpdGluZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBwdW1wKFwibmV4dFwiLCB2YWx1ZSk7XG4gIH07XG5cbiAgaWYgKHR5cGVvZiBpbm5lci50aHJvdyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgaXRlci50aHJvdyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgaWYgKHdhaXRpbmcpIHtcbiAgICAgICAgd2FpdGluZyA9IGZhbHNlO1xuICAgICAgICB0aHJvdyB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHB1bXAoXCJ0aHJvd1wiLCB2YWx1ZSk7XG4gICAgfTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5uZXIucmV0dXJuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBpdGVyLnJldHVybiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHB1bXAoXCJyZXR1cm5cIiwgdmFsdWUpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gaXRlcjtcbn1cblxuZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcblxuICAgICAgZnVuY3Rpb24gc3RlcChrZXksIGFyZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkge1xuICAgICAgICBzdGVwKFwibmV4dFwiLCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHtcbiAgICAgICAgc3RlcChcInRocm93XCIsIGVycik7XG4gICAgICB9XG5cbiAgICAgIF9uZXh0KCk7XG4gICAgfSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxuZnVuY3Rpb24gX2RlZmluZUVudW1lcmFibGVQcm9wZXJ0aWVzKG9iaiwgZGVzY3MpIHtcbiAgZm9yICh2YXIga2V5IGluIGRlc2NzKSB7XG4gICAgdmFyIGRlc2MgPSBkZXNjc1trZXldO1xuICAgIGRlc2MuY29uZmlndXJhYmxlID0gZGVzYy5lbnVtZXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MpIGRlc2Mud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgZGVzYyk7XG4gIH1cblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBvYmplY3RTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhkZXNjcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iamVjdFN5bWJvbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzeW0gPSBvYmplY3RTeW1ib2xzW2ldO1xuICAgICAgdmFyIGRlc2MgPSBkZXNjc1tzeW1dO1xuICAgICAgZGVzYy5jb25maWd1cmFibGUgPSBkZXNjLmVudW1lcmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjKSBkZXNjLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHN5bSwgZGVzYyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gX2RlZmF1bHRzKG9iaiwgZGVmYXVsdHMpIHtcbiAgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkZWZhdWx0cyk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgdmFyIHZhbHVlID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihkZWZhdWx0cywga2V5KTtcblxuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5jb25maWd1cmFibGUgJiYgb2JqW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG5cbiAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG4gICAgdmFyIG93bktleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuXG4gICAgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlO1xuICAgICAgfSkpO1xuICAgIH1cblxuICAgIG93bktleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7XG59XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpO1xuICBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzcztcbiAgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzcztcbn1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgICByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pO1xuICB9O1xuICByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pO1xufVxuXG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgcmV0dXJuIG87XG4gIH07XG5cbiAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTtcbn1cblxuZnVuY3Rpb24gaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7XG4gIGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7XG4gIGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7XG5cbiAgdHJ5IHtcbiAgICBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jb25zdHJ1Y3QoUGFyZW50LCBhcmdzLCBDbGFzcykge1xuICBpZiAoaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkpIHtcbiAgICBfY29uc3RydWN0ID0gUmVmbGVjdC5jb25zdHJ1Y3Q7XG4gIH0gZWxzZSB7XG4gICAgX2NvbnN0cnVjdCA9IGZ1bmN0aW9uIF9jb25zdHJ1Y3QoUGFyZW50LCBhcmdzLCBDbGFzcykge1xuICAgICAgdmFyIGEgPSBbbnVsbF07XG4gICAgICBhLnB1c2guYXBwbHkoYSwgYXJncyk7XG4gICAgICB2YXIgQ29uc3RydWN0b3IgPSBGdW5jdGlvbi5iaW5kLmFwcGx5KFBhcmVudCwgYSk7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBuZXcgQ29uc3RydWN0b3IoKTtcbiAgICAgIGlmIChDbGFzcykgX3NldFByb3RvdHlwZU9mKGluc3RhbmNlLCBDbGFzcy5wcm90b3R5cGUpO1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX2NvbnN0cnVjdC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfd3JhcE5hdGl2ZVN1cGVyKENsYXNzKSB7XG4gIHZhciBfY2FjaGUgPSB0eXBlb2YgTWFwID09PSBcImZ1bmN0aW9uXCIgPyBuZXcgTWFwKCkgOiB1bmRlZmluZWQ7XG5cbiAgX3dyYXBOYXRpdmVTdXBlciA9IGZ1bmN0aW9uIF93cmFwTmF0aXZlU3VwZXIoQ2xhc3MpIHtcbiAgICBpZiAoQ2xhc3MgPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gICAgaWYgKHR5cGVvZiBDbGFzcyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBfY2FjaGUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGlmIChfY2FjaGUuaGFzKENsYXNzKSkgcmV0dXJuIF9jYWNoZS5nZXQoQ2xhc3MpO1xuXG4gICAgICBfY2FjaGUuc2V0KENsYXNzLCBXcmFwcGVyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBXcmFwcGVyKCkge1xuICAgICAgcmV0dXJuIF9jb25zdHJ1Y3QoQ2xhc3MsIGFyZ3VtZW50cywgX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yKTtcbiAgICB9XG5cbiAgICBXcmFwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogV3JhcHBlcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gX3NldFByb3RvdHlwZU9mKFdyYXBwZXIsIENsYXNzKTtcbiAgfTtcblxuICByZXR1cm4gX3dyYXBOYXRpdmVTdXBlcihDbGFzcyk7XG59XG5cbmZ1bmN0aW9uIF9pbnN0YW5jZW9mKGxlZnQsIHJpZ2h0KSB7XG4gIGlmIChyaWdodCAhPSBudWxsICYmIHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgcmlnaHRbU3ltYm9sLmhhc0luc3RhbmNlXSkge1xuICAgIHJldHVybiByaWdodFtTeW1ib2wuaGFzSW5zdGFuY2VdKGxlZnQpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsZWZ0IGluc3RhbmNlb2YgcmlnaHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHtcbiAgICBkZWZhdWx0OiBvYmpcbiAgfTtcbn1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7XG4gIGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9IGVsc2Uge1xuICAgIHZhciBuZXdPYmogPSB7fTtcblxuICAgIGlmIChvYmogIT0gbnVsbCkge1xuICAgICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICAgIHZhciBkZXNjID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IHt9O1xuXG4gICAgICAgICAgaWYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdPYmpba2V5XSA9IG9ialtrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG5ld09iai5kZWZhdWx0ID0gb2JqO1xuICAgIHJldHVybiBuZXdPYmo7XG4gIH1cbn1cblxuZnVuY3Rpb24gX25ld0Fycm93Q2hlY2soaW5uZXJUaGlzLCBib3VuZFRoaXMpIHtcbiAgaWYgKGlubmVyVGhpcyAhPT0gYm91bmRUaGlzKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBpbnN0YW50aWF0ZSBhbiBhcnJvdyBmdW5jdGlvblwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfb2JqZWN0RGVzdHJ1Y3R1cmluZ0VtcHR5KG9iaikge1xuICBpZiAob2JqID09IG51bGwpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgZGVzdHJ1Y3R1cmUgdW5kZWZpbmVkXCIpO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkge1xuICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgdmFyIHRhcmdldCA9IHt9O1xuICB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gIHZhciBrZXksIGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBrZXkgPSBzb3VyY2VLZXlzW2ldO1xuICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgfVxuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTtcbiAgICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlO1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHtcbiAgaWYgKHNlbGYgPT09IHZvaWQgMCkge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBzZWxmO1xufVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7XG4gIGlmIChjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkge1xuICAgIHJldHVybiBjYWxsO1xuICB9XG5cbiAgcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7XG59XG5cbmZ1bmN0aW9uIF9zdXBlclByb3BCYXNlKG9iamVjdCwgcHJvcGVydHkpIHtcbiAgd2hpbGUgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSkpIHtcbiAgICBvYmplY3QgPSBfZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTtcbiAgICBpZiAob2JqZWN0ID09PSBudWxsKSBicmVhaztcbiAgfVxuXG4gIHJldHVybiBvYmplY3Q7XG59XG5cbmZ1bmN0aW9uIF9nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ICE9PSBcInVuZGVmaW5lZFwiICYmIFJlZmxlY3QuZ2V0KSB7XG4gICAgX2dldCA9IFJlZmxlY3QuZ2V0O1xuICB9IGVsc2Uge1xuICAgIF9nZXQgPSBmdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gICAgICB2YXIgYmFzZSA9IF9zdXBlclByb3BCYXNlKHRhcmdldCwgcHJvcGVydHkpO1xuXG4gICAgICBpZiAoIWJhc2UpIHJldHVybjtcbiAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihiYXNlLCBwcm9wZXJ0eSk7XG5cbiAgICAgIGlmIChkZXNjLmdldCkge1xuICAgICAgICByZXR1cm4gZGVzYy5nZXQuY2FsbChyZWNlaXZlcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZXNjLnZhbHVlO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX2dldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlciB8fCB0YXJnZXQpO1xufVxuXG5mdW5jdGlvbiBzZXQodGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUsIHJlY2VpdmVyKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBSZWZsZWN0LnNldCkge1xuICAgIHNldCA9IFJlZmxlY3Quc2V0O1xuICB9IGVsc2Uge1xuICAgIHNldCA9IGZ1bmN0aW9uIHNldCh0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSwgcmVjZWl2ZXIpIHtcbiAgICAgIHZhciBiYXNlID0gX3N1cGVyUHJvcEJhc2UodGFyZ2V0LCBwcm9wZXJ0eSk7XG5cbiAgICAgIHZhciBkZXNjO1xuXG4gICAgICBpZiAoYmFzZSkge1xuICAgICAgICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihiYXNlLCBwcm9wZXJ0eSk7XG5cbiAgICAgICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICAgICAgZGVzYy5zZXQuY2FsbChyZWNlaXZlciwgdmFsdWUpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKCFkZXNjLndyaXRhYmxlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHJlY2VpdmVyLCBwcm9wZXJ0eSk7XG5cbiAgICAgIGlmIChkZXNjKSB7XG4gICAgICAgIGlmICghZGVzYy53cml0YWJsZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlc2MudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlY2VpdmVyLCBwcm9wZXJ0eSwgZGVzYyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkocmVjZWl2ZXIsIHByb3BlcnR5LCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gc2V0KHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCByZWNlaXZlcik7XG59XG5cbmZ1bmN0aW9uIF9zZXQodGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUsIHJlY2VpdmVyLCBpc1N0cmljdCkge1xuICB2YXIgcyA9IHNldCh0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSwgcmVjZWl2ZXIgfHwgdGFyZ2V0KTtcblxuICBpZiAoIXMgJiYgaXNTdHJpY3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBzZXQgcHJvcGVydHknKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbChzdHJpbmdzLCByYXcpIHtcbiAgaWYgKCFyYXcpIHtcbiAgICByYXcgPSBzdHJpbmdzLnNsaWNlKDApO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoc3RyaW5ncywge1xuICAgIHJhdzoge1xuICAgICAgdmFsdWU6IE9iamVjdC5mcmVlemUocmF3KVxuICAgIH1cbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2Uoc3RyaW5ncywgcmF3KSB7XG4gIGlmICghcmF3KSB7XG4gICAgcmF3ID0gc3RyaW5ncy5zbGljZSgwKTtcbiAgfVxuXG4gIHN0cmluZ3MucmF3ID0gcmF3O1xuICByZXR1cm4gc3RyaW5ncztcbn1cblxuZnVuY3Rpb24gX3RlbXBvcmFsUmVmKHZhbCwgbmFtZSkge1xuICBpZiAodmFsID09PSBfdGVtcG9yYWxVbmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IobmFtZSArIFwiIGlzIG5vdCBkZWZpbmVkIC0gdGVtcG9yYWwgZGVhZCB6b25lXCIpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB2YWw7XG4gIH1cbn1cblxuZnVuY3Rpb24gX3JlYWRPbmx5RXJyb3IobmFtZSkge1xuICB0aHJvdyBuZXcgRXJyb3IoXCJcXFwiXCIgKyBuYW1lICsgXCJcXFwiIGlzIHJlYWQtb25seVwiKTtcbn1cblxuZnVuY3Rpb24gX2NsYXNzTmFtZVREWkVycm9yKG5hbWUpIHtcbiAgdGhyb3cgbmV3IEVycm9yKFwiQ2xhc3MgXFxcIlwiICsgbmFtZSArIFwiXFxcIiBjYW5ub3QgYmUgcmVmZXJlbmNlZCBpbiBjb21wdXRlZCBwcm9wZXJ0eSBrZXlzLlwiKTtcbn1cblxudmFyIF90ZW1wb3JhbFVuZGVmaW5lZCA9IHt9O1xuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTtcbn1cblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXlMb29zZShhcnIsIGkpIHtcbiAgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdExvb3NlKGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpO1xufVxuXG5mdW5jdGlvbiBfdG9BcnJheShhcnIpIHtcbiAgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7XG59XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIGFycjJbaV0gPSBhcnJbaV07XG5cbiAgICByZXR1cm4gYXJyMjtcbiAgfVxufVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7XG59XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikge1xuICBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyKSB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlcikgPT09IFwiW29iamVjdCBBcmd1bWVudHNdXCIpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpO1xufVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7XG4gIHZhciBfYXJyID0gW107XG4gIHZhciBfbiA9IHRydWU7XG4gIHZhciBfZCA9IGZhbHNlO1xuICB2YXIgX2UgPSB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKHZhciBfaSA9IGFycltTeW1ib2wuaXRlcmF0b3JdKCksIF9zOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7XG4gICAgICBfYXJyLnB1c2goX3MudmFsdWUpO1xuXG4gICAgICBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfZCA9IHRydWU7XG4gICAgX2UgPSBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0gIT0gbnVsbCkgX2lbXCJyZXR1cm5cIl0oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKF9kKSB0aHJvdyBfZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gX2Fycjtcbn1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0TG9vc2UoYXJyLCBpKSB7XG4gIHZhciBfYXJyID0gW107XG5cbiAgZm9yICh2YXIgX2l0ZXJhdG9yID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubmV4dCgpKS5kb25lOykge1xuICAgIF9hcnIucHVzaChfc3RlcC52YWx1ZSk7XG5cbiAgICBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gX2Fycjtcbn1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2VcIik7XG59XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpO1xufVxuXG5mdW5jdGlvbiBfc2tpcEZpcnN0R2VuZXJhdG9yTmV4dChmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBpdCA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaXQubmV4dCgpO1xuICAgIHJldHVybiBpdDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoa2V5KSB7XG4gIGlmICh0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiKSB7XG4gICAgcmV0dXJuIGtleTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gU3RyaW5nKGtleSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2luaXRpYWxpemVyV2FybmluZ0hlbHBlcihkZXNjcmlwdG9yLCBjb250ZXh0KSB7XG4gIHRocm93IG5ldyBFcnJvcignRGVjb3JhdGluZyBjbGFzcyBwcm9wZXJ0eSBmYWlsZWQuIFBsZWFzZSBlbnN1cmUgdGhhdCAnICsgJ3Byb3Bvc2FsLWNsYXNzLXByb3BlcnRpZXMgaXMgZW5hYmxlZCBhbmQgc2V0IHRvIHVzZSBsb29zZSBtb2RlLiAnICsgJ1RvIHVzZSBwcm9wb3NhbC1jbGFzcy1wcm9wZXJ0aWVzIGluIHNwZWMgbW9kZSB3aXRoIGRlY29yYXRvcnMsIHdhaXQgZm9yICcgKyAndGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBkZWNvcmF0b3JzIGluIHN0YWdlIDIuJyk7XG59XG5cbmZ1bmN0aW9uIF9pbml0aWFsaXplckRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHksIGRlc2NyaXB0b3IsIGNvbnRleHQpIHtcbiAgaWYgKCFkZXNjcmlwdG9yKSByZXR1cm47XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5LCB7XG4gICAgZW51bWVyYWJsZTogZGVzY3JpcHRvci5lbnVtZXJhYmxlLFxuICAgIGNvbmZpZ3VyYWJsZTogZGVzY3JpcHRvci5jb25maWd1cmFibGUsXG4gICAgd3JpdGFibGU6IGRlc2NyaXB0b3Iud3JpdGFibGUsXG4gICAgdmFsdWU6IGRlc2NyaXB0b3IuaW5pdGlhbGl6ZXIgPyBkZXNjcmlwdG9yLmluaXRpYWxpemVyLmNhbGwoY29udGV4dCkgOiB2b2lkIDBcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IodGFyZ2V0LCBwcm9wZXJ0eSwgZGVjb3JhdG9ycywgZGVzY3JpcHRvciwgY29udGV4dCkge1xuICB2YXIgZGVzYyA9IHt9O1xuICBPYmplY3RbJ2tlJyArICd5cyddKGRlc2NyaXB0b3IpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIGRlc2Nba2V5XSA9IGRlc2NyaXB0b3Jba2V5XTtcbiAgfSk7XG4gIGRlc2MuZW51bWVyYWJsZSA9ICEhZGVzYy5lbnVtZXJhYmxlO1xuICBkZXNjLmNvbmZpZ3VyYWJsZSA9ICEhZGVzYy5jb25maWd1cmFibGU7XG5cbiAgaWYgKCd2YWx1ZScgaW4gZGVzYyB8fCBkZXNjLmluaXRpYWxpemVyKSB7XG4gICAgZGVzYy53cml0YWJsZSA9IHRydWU7XG4gIH1cblxuICBkZXNjID0gZGVjb3JhdG9ycy5zbGljZSgpLnJldmVyc2UoKS5yZWR1Y2UoZnVuY3Rpb24gKGRlc2MsIGRlY29yYXRvcikge1xuICAgIHJldHVybiBkZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eSwgZGVzYykgfHwgZGVzYztcbiAgfSwgZGVzYyk7XG5cbiAgaWYgKGNvbnRleHQgJiYgZGVzYy5pbml0aWFsaXplciAhPT0gdm9pZCAwKSB7XG4gICAgZGVzYy52YWx1ZSA9IGRlc2MuaW5pdGlhbGl6ZXIgPyBkZXNjLmluaXRpYWxpemVyLmNhbGwoY29udGV4dCkgOiB2b2lkIDA7XG4gICAgZGVzYy5pbml0aWFsaXplciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChkZXNjLmluaXRpYWxpemVyID09PSB2b2lkIDApIHtcbiAgICBPYmplY3RbJ2RlZmluZScgKyAnUHJvcGVydHknXSh0YXJnZXQsIHByb3BlcnR5LCBkZXNjKTtcbiAgICBkZXNjID0gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBkZXNjO1xufVxuXG52YXIgaWQgPSAwO1xuXG5mdW5jdGlvbiBfY2xhc3NQcml2YXRlRmllbGRMb29zZUtleShuYW1lKSB7XG4gIHJldHVybiBcIl9fcHJpdmF0ZV9cIiArIGlkKysgKyBcIl9cIiArIG5hbWU7XG59XG5cbmZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVGaWVsZExvb3NlQmFzZShyZWNlaXZlciwgcHJpdmF0ZUtleSkge1xuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZWNlaXZlciwgcHJpdmF0ZUtleSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIHVzZSBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcbiAgfVxuXG4gIHJldHVybiByZWNlaXZlcjtcbn1cblxuZnVuY3Rpb24gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwKSB7XG4gIGlmICghcHJpdmF0ZU1hcC5oYXMocmVjZWl2ZXIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byBnZXQgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7XG4gIH1cblxuICByZXR1cm4gcHJpdmF0ZU1hcC5nZXQocmVjZWl2ZXIpO1xufVxuXG5mdW5jdGlvbiBfY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHByaXZhdGVNYXAsIHZhbHVlKSB7XG4gIGlmICghcHJpdmF0ZU1hcC5oYXMocmVjZWl2ZXIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byBzZXQgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7XG4gIH1cblxuICBwcml2YXRlTWFwLnNldChyZWNlaXZlciwgdmFsdWUpO1xuICByZXR1cm4gdmFsdWU7XG59IiwiLyogV2hpdGVzdG9ybUpTIEZyYW1ld29yayB2Mi4yLjAtYWxwaGEuMCAqL1xuZnVuY3Rpb24gY3JlYXRlQ29tbW9uanNNb2R1bGUoZm4sIG1vZHVsZSkge1xuXHRyZXR1cm4gbW9kdWxlID0geyBleHBvcnRzOiB7fSB9LCBmbihtb2R1bGUsIG1vZHVsZS5leHBvcnRzKSwgbW9kdWxlLmV4cG9ydHM7XG59XG5cbnZhciBydW50aW1lID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4hKGZ1bmN0aW9uKGdsb2JhbCkge1xuXG4gIHZhciBPcCA9IE9iamVjdC5wcm90b3R5cGU7XG4gIHZhciBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIHVuZGVmaW5lZDsgLy8gTW9yZSBjb21wcmVzc2libGUgdGhhbiB2b2lkIDAuXG4gIHZhciAkU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiID8gU3ltYm9sIDoge307XG4gIHZhciBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgXCJAQGl0ZXJhdG9yXCI7XG4gIHZhciBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFwiQEBhc3luY0l0ZXJhdG9yXCI7XG4gIHZhciB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgXCJAQHRvU3RyaW5nVGFnXCI7XG5cbiAgdmFyIGluTW9kdWxlID0gJ29iamVjdCcgPT09IFwib2JqZWN0XCI7XG4gIHZhciBydW50aW1lID0gZ2xvYmFsLnJlZ2VuZXJhdG9yUnVudGltZTtcbiAgaWYgKHJ1bnRpbWUpIHtcbiAgICBpZiAoaW5Nb2R1bGUpIHtcbiAgICAgIC8vIElmIHJlZ2VuZXJhdG9yUnVudGltZSBpcyBkZWZpbmVkIGdsb2JhbGx5IGFuZCB3ZSdyZSBpbiBhIG1vZHVsZSxcbiAgICAgIC8vIG1ha2UgdGhlIGV4cG9ydHMgb2JqZWN0IGlkZW50aWNhbCB0byByZWdlbmVyYXRvclJ1bnRpbWUuXG4gICAgICBtb2R1bGUuZXhwb3J0cyA9IHJ1bnRpbWU7XG4gICAgfVxuICAgIC8vIERvbid0IGJvdGhlciBldmFsdWF0aW5nIHRoZSByZXN0IG9mIHRoaXMgZmlsZSBpZiB0aGUgcnVudGltZSB3YXNcbiAgICAvLyBhbHJlYWR5IGRlZmluZWQgZ2xvYmFsbHkuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRGVmaW5lIHRoZSBydW50aW1lIGdsb2JhbGx5IChhcyBleHBlY3RlZCBieSBnZW5lcmF0ZWQgY29kZSkgYXMgZWl0aGVyXG4gIC8vIG1vZHVsZS5leHBvcnRzIChpZiB3ZSdyZSBpbiBhIG1vZHVsZSkgb3IgYSBuZXcsIGVtcHR5IG9iamVjdC5cbiAgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWUgPSBpbk1vZHVsZSA/IG1vZHVsZS5leHBvcnRzIDoge307XG5cbiAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIC8vIElmIG91dGVyRm4gcHJvdmlkZWQgYW5kIG91dGVyRm4ucHJvdG90eXBlIGlzIGEgR2VuZXJhdG9yLCB0aGVuIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yLlxuICAgIHZhciBwcm90b0dlbmVyYXRvciA9IG91dGVyRm4gJiYgb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBvdXRlckZuIDogR2VuZXJhdG9yO1xuICAgIHZhciBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSk7XG4gICAgdmFyIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7XG5cbiAgICAvLyBUaGUgLl9pbnZva2UgbWV0aG9kIHVuaWZpZXMgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzLlxuICAgIGdlbmVyYXRvci5faW52b2tlID0gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH1cbiAgcnVudGltZS53cmFwID0gd3JhcDtcblxuICAvLyBUcnkvY2F0Y2ggaGVscGVyIHRvIG1pbmltaXplIGRlb3B0aW1pemF0aW9ucy4gUmV0dXJucyBhIGNvbXBsZXRpb25cbiAgLy8gcmVjb3JkIGxpa2UgY29udGV4dC50cnlFbnRyaWVzW2ldLmNvbXBsZXRpb24uIFRoaXMgaW50ZXJmYWNlIGNvdWxkXG4gIC8vIGhhdmUgYmVlbiAoYW5kIHdhcyBwcmV2aW91c2x5KSBkZXNpZ25lZCB0byB0YWtlIGEgY2xvc3VyZSB0byBiZVxuICAvLyBpbnZva2VkIHdpdGhvdXQgYXJndW1lbnRzLCBidXQgaW4gYWxsIHRoZSBjYXNlcyB3ZSBjYXJlIGFib3V0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBtZXRob2Qgd2Ugd2FudCB0byBjYWxsLCBzbyB0aGVyZSdzIG5vIG5lZWRcbiAgLy8gdG8gY3JlYXRlIGEgbmV3IGZ1bmN0aW9uIG9iamVjdC4gV2UgY2FuIGV2ZW4gZ2V0IGF3YXkgd2l0aCBhc3N1bWluZ1xuICAvLyB0aGUgbWV0aG9kIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50LCBzaW5jZSB0aGF0IGhhcHBlbnMgdG8gYmUgdHJ1ZVxuICAvLyBpbiBldmVyeSBjYXNlLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHRvdWNoIHRoZSBhcmd1bWVudHMgb2JqZWN0LiBUaGVcbiAgLy8gb25seSBhZGRpdGlvbmFsIGFsbG9jYXRpb24gcmVxdWlyZWQgaXMgdGhlIGNvbXBsZXRpb24gcmVjb3JkLCB3aGljaFxuICAvLyBoYXMgYSBzdGFibGUgc2hhcGUgYW5kIHNvIGhvcGVmdWxseSBzaG91bGQgYmUgY2hlYXAgdG8gYWxsb2NhdGUuXG4gIGZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvYmosIGFyZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcIm5vcm1hbFwiLCBhcmc6IGZuLmNhbGwob2JqLCBhcmcpIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInRocm93XCIsIGFyZzogZXJyIH07XG4gICAgfVxuICB9XG5cbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkU3RhcnQgPSBcInN1c3BlbmRlZFN0YXJ0XCI7XG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkID0gXCJzdXNwZW5kZWRZaWVsZFwiO1xuICB2YXIgR2VuU3RhdGVFeGVjdXRpbmcgPSBcImV4ZWN1dGluZ1wiO1xuICB2YXIgR2VuU3RhdGVDb21wbGV0ZWQgPSBcImNvbXBsZXRlZFwiO1xuXG4gIC8vIFJldHVybmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBpbm5lckZuIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXNcbiAgLy8gYnJlYWtpbmcgb3V0IG9mIHRoZSBkaXNwYXRjaCBzd2l0Y2ggc3RhdGVtZW50LlxuICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9O1xuXG4gIC8vIER1bW15IGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyB0aGF0IHdlIHVzZSBhcyB0aGUgLmNvbnN0cnVjdG9yIGFuZFxuICAvLyAuY29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMgZm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0cy4gRm9yIGZ1bGwgc3BlYyBjb21wbGlhbmNlLCB5b3UgbWF5IHdpc2ggdG8gY29uZmlndXJlIHlvdXJcbiAgLy8gbWluaWZpZXIgbm90IHRvIG1hbmdsZSB0aGUgbmFtZXMgb2YgdGhlc2UgdHdvIGZ1bmN0aW9ucy5cbiAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9XG5cbiAgLy8gVGhpcyBpcyBhIHBvbHlmaWxsIGZvciAlSXRlcmF0b3JQcm90b3R5cGUlIGZvciBlbnZpcm9ubWVudHMgdGhhdFxuICAvLyBkb24ndCBuYXRpdmVseSBzdXBwb3J0IGl0LlxuICB2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcbiAgSXRlcmF0b3JQcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbiAgdmFyIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpO1xuICBpZiAoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiZcbiAgICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJlxuICAgICAgaGFzT3duLmNhbGwoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sKSkge1xuICAgIC8vIFRoaXMgZW52aXJvbm1lbnQgaGFzIGEgbmF0aXZlICVJdGVyYXRvclByb3RvdHlwZSU7IHVzZSBpdCBpbnN0ZWFkXG4gICAgLy8gb2YgdGhlIHBvbHlmaWxsLlxuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cblxuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPVxuICAgIEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR3AuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvbjtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGVbdG9TdHJpbmdUYWdTeW1ib2xdID1cbiAgICBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcblxuICAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZVxuICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLlxuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICBwcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKGFyZykge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBydW50aW1lLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICAgIGlmICghKHRvU3RyaW5nVGFnU3ltYm9sIGluIGdlbkZ1bikpIHtcbiAgICAgICAgZ2VuRnVuW3RvU3RyaW5nVGFnU3ltYm9sXSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApO1xuICAgIHJldHVybiBnZW5GdW47XG4gIH07XG5cbiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvXG4gIC8vIGB5aWVsZCByZWdlbmVyYXRvclJ1bnRpbWUuYXdyYXAoeClgLCBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiB0ZXN0XG4gIC8vIGBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpYCB0byBkZXRlcm1pbmUgaWYgdGhlIHlpZWxkZWQgdmFsdWUgaXNcbiAgLy8gbWVhbnQgdG8gYmUgYXdhaXRlZC5cbiAgcnVudGltZS5hd3JhcCA9IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB7IF9fYXdhaXQ6IGFyZyB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IoZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGludm9rZShcIm5leHRcIiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJ0aHJvd1wiLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uKHVud3JhcHBlZCkge1xuICAgICAgICAgIC8vIFdoZW4gYSB5aWVsZGVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGl0cyBmaW5hbCB2YWx1ZSBiZWNvbWVzXG4gICAgICAgICAgLy8gdGhlIC52YWx1ZSBvZiB0aGUgUHJvbWlzZTx7dmFsdWUsZG9uZX0+IHJlc3VsdCBmb3IgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCBpdGVyYXRpb24uIElmIHRoZSBQcm9taXNlIGlzIHJlamVjdGVkLCBob3dldmVyLCB0aGVcbiAgICAgICAgICAvLyByZXN1bHQgZm9yIHRoaXMgaXRlcmF0aW9uIHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCB0aGUgc2FtZVxuICAgICAgICAgIC8vIHJlYXNvbi4gTm90ZSB0aGF0IHJlamVjdGlvbnMgb2YgeWllbGRlZCBQcm9taXNlcyBhcmUgbm90XG4gICAgICAgICAgLy8gdGhyb3duIGJhY2sgaW50byB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBhcyBpcyB0aGUgY2FzZVxuICAgICAgICAgIC8vIHdoZW4gYW4gYXdhaXRlZCBQcm9taXNlIGlzIHJlamVjdGVkLiBUaGlzIGRpZmZlcmVuY2UgaW5cbiAgICAgICAgICAvLyBiZWhhdmlvciBiZXR3ZWVuIHlpZWxkIGFuZCBhd2FpdCBpcyBpbXBvcnRhbnQsIGJlY2F1c2UgaXRcbiAgICAgICAgICAvLyBhbGxvd3MgdGhlIGNvbnN1bWVyIHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggdGhlIHlpZWxkZWRcbiAgICAgICAgICAvLyByZWplY3Rpb24gKHN3YWxsb3cgaXQgYW5kIGNvbnRpbnVlLCBtYW51YWxseSAudGhyb3cgaXQgYmFja1xuICAgICAgICAgIC8vIGludG8gdGhlIGdlbmVyYXRvciwgYWJhbmRvbiBpdGVyYXRpb24sIHdoYXRldmVyKS4gV2l0aFxuICAgICAgICAgIC8vIGF3YWl0LCBieSBjb250cmFzdCwgdGhlcmUgaXMgbm8gb3Bwb3J0dW5pdHkgdG8gZXhhbWluZSB0aGVcbiAgICAgICAgICAvLyByZWplY3Rpb24gcmVhc29uIG91dHNpZGUgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiwgc28gdGhlXG4gICAgICAgICAgLy8gb25seSBvcHRpb24gaXMgdG8gdGhyb3cgaXQgZnJvbSB0aGUgYXdhaXQgZXhwcmVzc2lvbiwgYW5kXG4gICAgICAgICAgLy8gbGV0IHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gaGFuZGxlIHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkO1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykge1xuICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID1cbiAgICAgICAgLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAvLyBhbGwgcHJldmlvdXMgUHJvbWlzZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIGludm9rZSxcbiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZlxuICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0b1xuICAgICAgICAvLyBjYWxsIGludm9rZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZmlyZSxcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG9cbiAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eVxuICAgICAgICAvLyBpcyB3aHkgdGhlIFByb21pc2UgY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBpbnZva2VzIGl0c1xuICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseVxuICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZVxuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbnMgaW4gdGVybXMgb2YgYXN5bmMgZ2VuZXJhdG9ycywgaXQgaXMgZXNwZWNpYWxseVxuICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuXG4gICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKFxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLFxuICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyXG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnXG4gICAgICAgICkgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgIH1cblxuICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiAoc2VlIGRlZmluZUl0ZXJhdG9yTWV0aG9kcykuXG4gICAgdGhpcy5faW52b2tlID0gZW5xdWV1ZTtcbiAgfVxuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7XG4gIEFzeW5jSXRlcmF0b3IucHJvdG90eXBlW2FzeW5jSXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBydW50aW1lLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBydW50aW1lLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKFxuICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdClcbiAgICApO1xuXG4gICAgcmV0dXJuIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93XG4gICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvci5yZXR1cm4pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAvLyBJZiBtYXliZUludm9rZURlbGVnYXRlKGNvbnRleHQpIGNoYW5nZWQgY29udGV4dC5tZXRob2QgZnJvbVxuICAgICAgICAgICAgLy8gXCJyZXR1cm5cIiB0byBcInRocm93XCIsIGxldCB0aGF0IG92ZXJyaWRlIHRoZSBUeXBlRXJyb3IgYmVsb3cuXG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcblxuICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgaWYgKCEgaW5mbykge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKTtcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnlcbiAgICAgIC8vIHZhcmlhYmxlIHNwZWNpZmllZCBieSBkZWxlZ2F0ZS5yZXN1bHROYW1lIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcblxuICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcblxuICAgICAgLy8gSWYgY29udGV4dC5tZXRob2Qgd2FzIFwidGhyb3dcIiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlXG4gICAgICAvLyBleGNlcHRpb24sIGxldCB0aGUgb3V0ZXIgZ2VuZXJhdG9yIHByb2NlZWQgbm9ybWFsbHkuIElmXG4gICAgICAvLyBjb250ZXh0Lm1ldGhvZCB3YXMgXCJuZXh0XCIsIGZvcmdldCBjb250ZXh0LmFyZyBzaW5jZSBpdCBoYXMgYmVlblxuICAgICAgLy8gXCJjb25zdW1lZFwiIGJ5IHRoZSBkZWxlZ2F0ZSBpdGVyYXRvci4gSWYgY29udGV4dC5tZXRob2Qgd2FzXG4gICAgICAvLyBcInJldHVyblwiLCBhbGxvdyB0aGUgb3JpZ2luYWwgLnJldHVybiBjYWxsIHRvIGNvbnRpbnVlIGluIHRoZVxuICAgICAgLy8gb3V0ZXIgZ2VuZXJhdG9yLlxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSBcInJldHVyblwiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlLXlpZWxkIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGRlbGVnYXRlIG1ldGhvZC5cbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIC8vIFRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBpcyBmaW5pc2hlZCwgc28gZm9yZ2V0IGl0IGFuZCBjb250aW51ZSB3aXRoXG4gICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci5cbiAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBHcFt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvclwiO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIHJ1bnRpbWUua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBydW50aW1lLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xufSkoXG4gIC8vIEluIHNsb3BweSBtb2RlLCB1bmJvdW5kIGB0aGlzYCByZWZlcnMgdG8gdGhlIGdsb2JhbCBvYmplY3QsIGZhbGxiYWNrIHRvXG4gIC8vIEZ1bmN0aW9uIGNvbnN0cnVjdG9yIGlmIHdlJ3JlIGluIGdsb2JhbCBzdHJpY3QgbW9kZS4gVGhhdCBpcyBzYWRseSBhIGZvcm1cbiAgLy8gb2YgaW5kaXJlY3QgZXZhbCB3aGljaCB2aW9sYXRlcyBDb250ZW50IFNlY3VyaXR5IFBvbGljeS5cbiAgKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcyB9KSgpIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKVxuKTtcbn0pO1xuXG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbi8vIFRoaXMgbWV0aG9kIG9mIG9idGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdCBuZWVkcyB0byBiZVxuLy8ga2VwdCBpZGVudGljYWwgdG8gdGhlIHdheSBpdCBpcyBvYnRhaW5lZCBpbiBydW50aW1lLmpzXG52YXIgZyA9IChmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMgfSkoKSB8fCBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG5cbi8vIFVzZSBgZ2V0T3duUHJvcGVydHlOYW1lc2AgYmVjYXVzZSBub3QgYWxsIGJyb3dzZXJzIHN1cHBvcnQgY2FsbGluZ1xuLy8gYGhhc093blByb3BlcnR5YCBvbiB0aGUgZ2xvYmFsIGBzZWxmYCBvYmplY3QgaW4gYSB3b3JrZXIuIFNlZSAjMTgzLlxudmFyIGhhZFJ1bnRpbWUgPSBnLnJlZ2VuZXJhdG9yUnVudGltZSAmJlxuICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhnKS5pbmRleE9mKFwicmVnZW5lcmF0b3JSdW50aW1lXCIpID49IDA7XG5cbi8vIFNhdmUgdGhlIG9sZCByZWdlbmVyYXRvclJ1bnRpbWUgaW4gY2FzZSBpdCBuZWVkcyB0byBiZSByZXN0b3JlZCBsYXRlci5cbnZhciBvbGRSdW50aW1lID0gaGFkUnVudGltZSAmJiBnLnJlZ2VuZXJhdG9yUnVudGltZTtcblxuLy8gRm9yY2UgcmVldmFsdXRhdGlvbiBvZiBydW50aW1lLmpzLlxuZy5yZWdlbmVyYXRvclJ1bnRpbWUgPSB1bmRlZmluZWQ7XG5cbnZhciBydW50aW1lTW9kdWxlID0gcnVudGltZTtcblxuaWYgKGhhZFJ1bnRpbWUpIHtcbiAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcnVudGltZS5cbiAgZy5yZWdlbmVyYXRvclJ1bnRpbWUgPSBvbGRSdW50aW1lO1xufSBlbHNlIHtcbiAgLy8gUmVtb3ZlIHRoZSBnbG9iYWwgcHJvcGVydHkgYWRkZWQgYnkgcnVudGltZS5qcy5cbiAgdHJ5IHtcbiAgICBkZWxldGUgZy5yZWdlbmVyYXRvclJ1bnRpbWU7XG4gIH0gY2F0Y2goZSkge1xuICAgIGcucmVnZW5lcmF0b3JSdW50aW1lID0gdW5kZWZpbmVkO1xuICB9XG59XG5cbnZhciByZWdlbmVyYXRvciA9IHJ1bnRpbWVNb2R1bGU7XG5cbi8vIDcuMS40IFRvSW50ZWdlclxudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIF90b0ludGVnZXIgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG59O1xuXG4vLyA3LjIuMSBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KVxudmFyIF9kZWZpbmVkID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcblxuLy8gdHJ1ZSAgLT4gU3RyaW5nI2F0XG4vLyBmYWxzZSAtPiBTdHJpbmcjY29kZVBvaW50QXRcbnZhciBfc3RyaW5nQXQgPSBmdW5jdGlvbiAoVE9fU1RSSU5HKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGhhdCwgcG9zKSB7XG4gICAgdmFyIHMgPSBTdHJpbmcoX2RlZmluZWQodGhhdCkpO1xuICAgIHZhciBpID0gX3RvSW50ZWdlcihwb3MpO1xuICAgIHZhciBsID0gcy5sZW5ndGg7XG4gICAgdmFyIGEsIGI7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gbCkgcmV0dXJuIFRPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICAgIGEgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgcmV0dXJuIGEgPCAweGQ4MDAgfHwgYSA+IDB4ZGJmZiB8fCBpICsgMSA9PT0gbCB8fCAoYiA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGIgPiAweGRmZmZcbiAgICAgID8gVE9fU1RSSU5HID8gcy5jaGFyQXQoaSkgOiBhXG4gICAgICA6IFRPX1NUUklORyA/IHMuc2xpY2UoaSwgaSArIDIpIDogKGEgLSAweGQ4MDAgPDwgMTApICsgKGIgLSAweGRjMDApICsgMHgxMDAwMDtcbiAgfTtcbn07XG5cbnZhciBfbGlicmFyeSA9IHRydWU7XG5cbnZhciBfZ2xvYmFsID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbnZhciBnbG9iYWwgPSBtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lk1hdGggPT0gTWF0aFxuICA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PSBNYXRoID8gc2VsZlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuaWYgKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpIF9fZyA9IGdsb2JhbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxufSk7XG5cbnZhciBfY29yZSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbnZhciBjb3JlID0gbW9kdWxlLmV4cG9ydHMgPSB7IHZlcnNpb246ICcyLjUuNicgfTtcbmlmICh0eXBlb2YgX19lID09ICdudW1iZXInKSBfX2UgPSBjb3JlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG59KTtcbnZhciBfY29yZV8xID0gX2NvcmUudmVyc2lvbjtcblxudmFyIF9hRnVuY3Rpb24gPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59O1xuXG4vLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcblxudmFyIF9jdHggPSBmdW5jdGlvbiAoZm4sIHRoYXQsIGxlbmd0aCkge1xuICBfYUZ1bmN0aW9uKGZuKTtcbiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuO1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uIChhKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTtcbiAgICB9O1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcbiAgICB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoLyogLi4uYXJncyAqLykge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcblxudmFyIF9pc09iamVjdCA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xufTtcblxudmFyIF9hbk9iamVjdCA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIV9pc09iamVjdChpdCkpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTtcblxudmFyIF9mYWlscyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG5cbi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbnZhciBfZGVzY3JpcHRvcnMgPSAhX2ZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KS5hICE9IDc7XG59KTtcblxudmFyIGRvY3VtZW50JDEgPSBfZ2xvYmFsLmRvY3VtZW50O1xuLy8gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCcgaW4gb2xkIElFXG52YXIgaXMgPSBfaXNPYmplY3QoZG9jdW1lbnQkMSkgJiYgX2lzT2JqZWN0KGRvY3VtZW50JDEuY3JlYXRlRWxlbWVudCk7XG52YXIgX2RvbUNyZWF0ZSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXMgPyBkb2N1bWVudCQxLmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59O1xuXG52YXIgX2llOERvbURlZmluZSA9ICFfZGVzY3JpcHRvcnMgJiYgIV9mYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2RvbUNyZWF0ZSgnZGl2JyksICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG5cbi8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxuXG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbnZhciBfdG9QcmltaXRpdmUgPSBmdW5jdGlvbiAoaXQsIFMpIHtcbiAgaWYgKCFfaXNPYmplY3QoaXQpKSByZXR1cm4gaXQ7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIV9pc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICh0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhX2lzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKCFTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhX2lzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTtcblxudmFyIGRQID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG52YXIgZiA9IF9kZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgX2FuT2JqZWN0KE8pO1xuICBQID0gX3RvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBfYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChfaWU4RG9tRGVmaW5lKSB0cnkge1xuICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG5cbnZhciBfb2JqZWN0RHAgPSB7XG5cdGY6IGZcbn07XG5cbnZhciBfcHJvcGVydHlEZXNjID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG5cbnZhciBfaGlkZSA9IF9kZXNjcmlwdG9ycyA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIF9vYmplY3REcC5mKG9iamVjdCwga2V5LCBfcHJvcGVydHlEZXNjKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcblxudmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7XG52YXIgX2hhcyA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xufTtcblxudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG52YXIgJGV4cG9ydCA9IGZ1bmN0aW9uICh0eXBlLCBuYW1lLCBzb3VyY2UpIHtcbiAgdmFyIElTX0ZPUkNFRCA9IHR5cGUgJiAkZXhwb3J0LkY7XG4gIHZhciBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HO1xuICB2YXIgSVNfU1RBVElDID0gdHlwZSAmICRleHBvcnQuUztcbiAgdmFyIElTX1BST1RPID0gdHlwZSAmICRleHBvcnQuUDtcbiAgdmFyIElTX0JJTkQgPSB0eXBlICYgJGV4cG9ydC5CO1xuICB2YXIgSVNfV1JBUCA9IHR5cGUgJiAkZXhwb3J0Llc7XG4gIHZhciBleHBvcnRzID0gSVNfR0xPQkFMID8gX2NvcmUgOiBfY29yZVtuYW1lXSB8fCAoX2NvcmVbbmFtZV0gPSB7fSk7XG4gIHZhciBleHBQcm90byA9IGV4cG9ydHNbUFJPVE9UWVBFXTtcbiAgdmFyIHRhcmdldCA9IElTX0dMT0JBTCA/IF9nbG9iYWwgOiBJU19TVEFUSUMgPyBfZ2xvYmFsW25hbWVdIDogKF9nbG9iYWxbbmFtZV0gfHwge30pW1BST1RPVFlQRV07XG4gIHZhciBrZXksIG93biwgb3V0O1xuICBpZiAoSVNfR0xPQkFMKSBzb3VyY2UgPSBuYW1lO1xuICBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICAvLyBjb250YWlucyBpbiBuYXRpdmVcbiAgICBvd24gPSAhSVNfRk9SQ0VEICYmIHRhcmdldCAmJiB0YXJnZXRba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIGlmIChvd24gJiYgX2hhcyhleHBvcnRzLCBrZXkpKSBjb250aW51ZTtcbiAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuICAgIG91dCA9IG93biA/IHRhcmdldFtrZXldIDogc291cmNlW2tleV07XG4gICAgLy8gcHJldmVudCBnbG9iYWwgcG9sbHV0aW9uIGZvciBuYW1lc3BhY2VzXG4gICAgZXhwb3J0c1trZXldID0gSVNfR0xPQkFMICYmIHR5cGVvZiB0YXJnZXRba2V5XSAhPSAnZnVuY3Rpb24nID8gc291cmNlW2tleV1cbiAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuICAgIDogSVNfQklORCAmJiBvd24gPyBfY3R4KG91dCwgX2dsb2JhbClcbiAgICAvLyB3cmFwIGdsb2JhbCBjb25zdHJ1Y3RvcnMgZm9yIHByZXZlbnQgY2hhbmdlIHRoZW0gaW4gbGlicmFyeVxuICAgIDogSVNfV1JBUCAmJiB0YXJnZXRba2V5XSA9PSBvdXQgPyAoZnVuY3Rpb24gKEMpIHtcbiAgICAgIHZhciBGID0gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBDKSB7XG4gICAgICAgICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgQygpO1xuICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEMoYSk7XG4gICAgICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgQyhhLCBiKTtcbiAgICAgICAgICB9IHJldHVybiBuZXcgQyhhLCBiLCBjKTtcbiAgICAgICAgfSByZXR1cm4gQy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICAgIEZbUFJPVE9UWVBFXSA9IENbUFJPVE9UWVBFXTtcbiAgICAgIHJldHVybiBGO1xuICAgIC8vIG1ha2Ugc3RhdGljIHZlcnNpb25zIGZvciBwcm90b3R5cGUgbWV0aG9kc1xuICAgIH0pKG91dCkgOiBJU19QUk9UTyAmJiB0eXBlb2Ygb3V0ID09ICdmdW5jdGlvbicgPyBfY3R4KEZ1bmN0aW9uLmNhbGwsIG91dCkgOiBvdXQ7XG4gICAgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLm1ldGhvZHMuJU5BTUUlXG4gICAgaWYgKElTX1BST1RPKSB7XG4gICAgICAoZXhwb3J0cy52aXJ0dWFsIHx8IChleHBvcnRzLnZpcnR1YWwgPSB7fSkpW2tleV0gPSBvdXQ7XG4gICAgICAvLyBleHBvcnQgcHJvdG8gbWV0aG9kcyB0byBjb3JlLiVDT05TVFJVQ1RPUiUucHJvdG90eXBlLiVOQU1FJVxuICAgICAgaWYgKHR5cGUgJiAkZXhwb3J0LlIgJiYgZXhwUHJvdG8gJiYgIWV4cFByb3RvW2tleV0pIF9oaWRlKGV4cFByb3RvLCBrZXksIG91dCk7XG4gICAgfVxuICB9XG59O1xuLy8gdHlwZSBiaXRtYXBcbiRleHBvcnQuRiA9IDE7ICAgLy8gZm9yY2VkXG4kZXhwb3J0LkcgPSAyOyAgIC8vIGdsb2JhbFxuJGV4cG9ydC5TID0gNDsgICAvLyBzdGF0aWNcbiRleHBvcnQuUCA9IDg7ICAgLy8gcHJvdG9cbiRleHBvcnQuQiA9IDE2OyAgLy8gYmluZFxuJGV4cG9ydC5XID0gMzI7ICAvLyB3cmFwXG4kZXhwb3J0LlUgPSA2NDsgIC8vIHNhZmVcbiRleHBvcnQuUiA9IDEyODsgLy8gcmVhbCBwcm90byBtZXRob2QgZm9yIGBsaWJyYXJ5YFxudmFyIF9leHBvcnQgPSAkZXhwb3J0O1xuXG52YXIgX3JlZGVmaW5lID0gX2hpZGU7XG5cbnZhciBfaXRlcmF0b3JzID0ge307XG5cbnZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG52YXIgX2NvZiA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xufTtcblxuLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xudmFyIF9pb2JqZWN0ID0gT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCkgPyBPYmplY3QgOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIF9jb2YoaXQpID09ICdTdHJpbmcnID8gaXQuc3BsaXQoJycpIDogT2JqZWN0KGl0KTtcbn07XG5cbi8vIHRvIGluZGV4ZWQgb2JqZWN0LCB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xuXG5cbnZhciBfdG9Jb2JqZWN0ID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBfaW9iamVjdChfZGVmaW5lZChpdCkpO1xufTtcblxuLy8gNy4xLjE1IFRvTGVuZ3RoXG5cbnZhciBtaW4gPSBNYXRoLm1pbjtcbnZhciBfdG9MZW5ndGggPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ID4gMCA/IG1pbihfdG9JbnRlZ2VyKGl0KSwgMHgxZmZmZmZmZmZmZmZmZikgOiAwOyAvLyBwb3coMiwgNTMpIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59O1xuXG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluJDEgPSBNYXRoLm1pbjtcbnZhciBfdG9BYnNvbHV0ZUluZGV4ID0gZnVuY3Rpb24gKGluZGV4LCBsZW5ndGgpIHtcbiAgaW5kZXggPSBfdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGluZGV4IDwgMCA/IG1heChpbmRleCArIGxlbmd0aCwgMCkgOiBtaW4kMShpbmRleCwgbGVuZ3RoKTtcbn07XG5cbi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG5cblxuXG52YXIgX2FycmF5SW5jbHVkZXMgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICAgIHZhciBPID0gX3RvSW9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IF90b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gX3RvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKSB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIGlmICh2YWx1ZSAhPSB2YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjaW5kZXhPZiBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pIHtcbiAgICAgIGlmIChPW2luZGV4XSA9PT0gZWwpIHJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07XG5cbnZhciBfc2hhcmVkID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gX2dsb2JhbFtTSEFSRURdIHx8IChfZ2xvYmFsW1NIQVJFRF0gPSB7fSk7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pO1xufSkoJ3ZlcnNpb25zJywgW10pLnB1c2goe1xuICB2ZXJzaW9uOiBfY29yZS52ZXJzaW9uLFxuICBtb2RlOiBfbGlicmFyeSA/ICdwdXJlJyA6ICdnbG9iYWwnLFxuICBjb3B5cmlnaHQ6ICfCqSAyMDE4IERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpJ1xufSk7XG59KTtcblxudmFyIGlkID0gMDtcbnZhciBweCA9IE1hdGgucmFuZG9tKCk7XG52YXIgX3VpZCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuICdTeW1ib2woJy5jb25jYXQoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSwgJylfJywgKCsraWQgKyBweCkudG9TdHJpbmcoMzYpKTtcbn07XG5cbnZhciBzaGFyZWQgPSBfc2hhcmVkKCdrZXlzJyk7XG5cbnZhciBfc2hhcmVkS2V5ID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gc2hhcmVkW2tleV0gfHwgKHNoYXJlZFtrZXldID0gX3VpZChrZXkpKTtcbn07XG5cbnZhciBhcnJheUluZGV4T2YgPSBfYXJyYXlJbmNsdWRlcyhmYWxzZSk7XG52YXIgSUVfUFJPVE8gPSBfc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xuXG52YXIgX29iamVjdEtleXNJbnRlcm5hbCA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWVzKSB7XG4gIHZhciBPID0gX3RvSW9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgaWYgKGtleSAhPSBJRV9QUk9UTykgX2hhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChfaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKSB7XG4gICAgfmFycmF5SW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gSUUgOC0gZG9uJ3QgZW51bSBidWcga2V5c1xudmFyIF9lbnVtQnVnS2V5cyA9IChcbiAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcbikuc3BsaXQoJywnKTtcblxuLy8gMTkuMS4yLjE0IC8gMTUuMi4zLjE0IE9iamVjdC5rZXlzKE8pXG5cblxuXG52YXIgX29iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuIF9vYmplY3RLZXlzSW50ZXJuYWwoTywgX2VudW1CdWdLZXlzKTtcbn07XG5cbnZhciBfb2JqZWN0RHBzID0gX2Rlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgX2FuT2JqZWN0KE8pO1xuICB2YXIga2V5cyA9IF9vYmplY3RLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpID0gMDtcbiAgdmFyIFA7XG4gIHdoaWxlIChsZW5ndGggPiBpKSBfb2JqZWN0RHAuZihPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTtcbiAgcmV0dXJuIE87XG59O1xuXG52YXIgZG9jdW1lbnQkMiA9IF9nbG9iYWwuZG9jdW1lbnQ7XG52YXIgX2h0bWwgPSBkb2N1bWVudCQyICYmIGRvY3VtZW50JDIuZG9jdW1lbnRFbGVtZW50O1xuXG4vLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcblxuXG5cbnZhciBJRV9QUk9UTyQxID0gX3NoYXJlZEtleSgnSUVfUFJPVE8nKTtcbnZhciBFbXB0eSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbnZhciBQUk9UT1RZUEUkMSA9ICdwcm90b3R5cGUnO1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IF9kb21DcmVhdGUoJ2lmcmFtZScpO1xuICB2YXIgaSA9IF9lbnVtQnVnS2V5cy5sZW5ndGg7XG4gIHZhciBsdCA9ICc8JztcbiAgdmFyIGd0ID0gJz4nO1xuICB2YXIgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBfaHRtbC5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICBpZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zY3JpcHQtdXJsXG4gIC8vIGNyZWF0ZURpY3QgPSBpZnJhbWUuY29udGVudFdpbmRvdy5PYmplY3Q7XG4gIC8vIGh0bWwucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICBpZnJhbWVEb2N1bWVudC53cml0ZShsdCArICdzY3JpcHQnICsgZ3QgKyAnZG9jdW1lbnQuRj1PYmplY3QnICsgbHQgKyAnL3NjcmlwdCcgKyBndCk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xuICB3aGlsZSAoaS0tKSBkZWxldGUgY3JlYXRlRGljdFtQUk9UT1RZUEUkMV1bX2VudW1CdWdLZXlzW2ldXTtcbiAgcmV0dXJuIGNyZWF0ZURpY3QoKTtcbn07XG5cbnZhciBfb2JqZWN0Q3JlYXRlID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoTyAhPT0gbnVsbCkge1xuICAgIEVtcHR5W1BST1RPVFlQRSQxXSA9IF9hbk9iamVjdChPKTtcbiAgICByZXN1bHQgPSBuZXcgRW1wdHkoKTtcbiAgICBFbXB0eVtQUk9UT1RZUEUkMV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE8kMV0gPSBPO1xuICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpO1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogX29iamVjdERwcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcblxudmFyIF93a3MgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG52YXIgc3RvcmUgPSBfc2hhcmVkKCd3a3MnKTtcblxudmFyIFN5bWJvbCA9IF9nbG9iYWwuU3ltYm9sO1xudmFyIFVTRV9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09ICdmdW5jdGlvbic7XG5cbnZhciAkZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9XG4gICAgVVNFX1NZTUJPTCAmJiBTeW1ib2xbbmFtZV0gfHwgKFVTRV9TWU1CT0wgPyBTeW1ib2wgOiBfdWlkKSgnU3ltYm9sLicgKyBuYW1lKSk7XG59O1xuXG4kZXhwb3J0cy5zdG9yZSA9IHN0b3JlO1xufSk7XG5cbnZhciBkZWYgPSBfb2JqZWN0RHAuZjtcblxudmFyIFRBRyA9IF93a3MoJ3RvU3RyaW5nVGFnJyk7XG5cbnZhciBfc2V0VG9TdHJpbmdUYWcgPSBmdW5jdGlvbiAoaXQsIHRhZywgc3RhdCkge1xuICBpZiAoaXQgJiYgIV9oYXMoaXQgPSBzdGF0ID8gaXQgOiBpdC5wcm90b3R5cGUsIFRBRykpIGRlZihpdCwgVEFHLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHRhZyB9KTtcbn07XG5cbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyAyNS4xLjIuMS4xICVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKVxuX2hpZGUoSXRlcmF0b3JQcm90b3R5cGUsIF93a3MoJ2l0ZXJhdG9yJyksIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0pO1xuXG52YXIgX2l0ZXJDcmVhdGUgPSBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHtcbiAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gX29iamVjdENyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBfcHJvcGVydHlEZXNjKDEsIG5leHQpIH0pO1xuICBfc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIE5BTUUgKyAnIEl0ZXJhdG9yJyk7XG59O1xuXG4vLyA3LjEuMTMgVG9PYmplY3QoYXJndW1lbnQpXG5cbnZhciBfdG9PYmplY3QgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIE9iamVjdChfZGVmaW5lZChpdCkpO1xufTtcblxuLy8gMTkuMS4yLjkgLyAxNS4yLjMuMiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcblxuXG52YXIgSUVfUFJPVE8kMiA9IF9zaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG52YXIgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG52YXIgX29iamVjdEdwbyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiAoTykge1xuICBPID0gX3RvT2JqZWN0KE8pO1xuICBpZiAoX2hhcyhPLCBJRV9QUk9UTyQyKSkgcmV0dXJuIE9bSUVfUFJPVE8kMl07XG4gIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG8gOiBudWxsO1xufTtcblxudmFyIElURVJBVE9SID0gX3drcygnaXRlcmF0b3InKTtcbnZhciBCVUdHWSA9ICEoW10ua2V5cyAmJiAnbmV4dCcgaW4gW10ua2V5cygpKTsgLy8gU2FmYXJpIGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxudmFyIEZGX0lURVJBVE9SID0gJ0BAaXRlcmF0b3InO1xudmFyIEtFWVMgPSAna2V5cyc7XG52YXIgVkFMVUVTID0gJ3ZhbHVlcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxudmFyIF9pdGVyRGVmaW5lID0gZnVuY3Rpb24gKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICBfaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbiAoa2luZCkge1xuICAgIGlmICghQlVHR1kgJiYga2luZCBpbiBwcm90bykgcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVM7XG4gIHZhciBWQUxVRVNfQlVHID0gZmFsc2U7XG4gIHZhciBwcm90byA9IEJhc2UucHJvdG90eXBlO1xuICB2YXIgJG5hdGl2ZSA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXTtcbiAgdmFyICRkZWZhdWx0ID0gJG5hdGl2ZSB8fCBnZXRNZXRob2QoREVGQVVMVCk7XG4gIHZhciAkZW50cmllcyA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWQ7XG4gIHZhciAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZTtcbiAgdmFyIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYgKCRhbnlOYXRpdmUpIHtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IF9vYmplY3RHcG8oJGFueU5hdGl2ZS5jYWxsKG5ldyBCYXNlKCkpKTtcbiAgICBpZiAoSXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgSXRlcmF0b3JQcm90b3R5cGUubmV4dCkge1xuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgX3NldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZiAoIV9saWJyYXJ5ICYmIHR5cGVvZiBJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0gIT0gJ2Z1bmN0aW9uJykgX2hpZGUoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbiAgICB9XG4gIH1cbiAgLy8gZml4IEFycmF5I3t2YWx1ZXMsIEBAaXRlcmF0b3J9Lm5hbWUgaW4gVjggLyBGRlxuICBpZiAoREVGX1ZBTFVFUyAmJiAkbmF0aXZlICYmICRuYXRpdmUubmFtZSAhPT0gVkFMVUVTKSB7XG4gICAgVkFMVUVTX0JVRyA9IHRydWU7XG4gICAgJGRlZmF1bHQgPSBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiAkbmF0aXZlLmNhbGwodGhpcyk7IH07XG4gIH1cbiAgLy8gRGVmaW5lIGl0ZXJhdG9yXG4gIGlmICgoIV9saWJyYXJ5IHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpIHtcbiAgICBfaGlkZShwcm90bywgSVRFUkFUT1IsICRkZWZhdWx0KTtcbiAgfVxuICAvLyBQbHVnIGZvciBsaWJyYXJ5XG4gIF9pdGVyYXRvcnNbTkFNRV0gPSAkZGVmYXVsdDtcbiAgX2l0ZXJhdG9yc1tUQUddID0gcmV0dXJuVGhpcztcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoa2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGlmICghKGtleSBpbiBwcm90bykpIF9yZWRlZmluZShwcm90bywga2V5LCBtZXRob2RzW2tleV0pO1xuICAgIH0gZWxzZSBfZXhwb3J0KF9leHBvcnQuUCArIF9leHBvcnQuRiAqIChCVUdHWSB8fCBWQUxVRVNfQlVHKSwgTkFNRSwgbWV0aG9kcyk7XG4gIH1cbiAgcmV0dXJuIG1ldGhvZHM7XG59O1xuXG52YXIgJGF0ID0gX3N0cmluZ0F0KHRydWUpO1xuXG4vLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5faXRlckRlZmluZShTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbiAoaXRlcmF0ZWQpIHtcbiAgdGhpcy5fdCA9IFN0cmluZyhpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuLy8gMjEuMS41LjIuMSAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgTyA9IHRoaXMuX3Q7XG4gIHZhciBpbmRleCA9IHRoaXMuX2k7XG4gIHZhciBwb2ludDtcbiAgaWYgKGluZGV4ID49IE8ubGVuZ3RoKSByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIHBvaW50ID0gJGF0KE8sIGluZGV4KTtcbiAgdGhpcy5faSArPSBwb2ludC5sZW5ndGg7XG4gIHJldHVybiB7IHZhbHVlOiBwb2ludCwgZG9uZTogZmFsc2UgfTtcbn0pO1xuXG52YXIgX2l0ZXJTdGVwID0gZnVuY3Rpb24gKGRvbmUsIHZhbHVlKSB7XG4gIHJldHVybiB7IHZhbHVlOiB2YWx1ZSwgZG9uZTogISFkb25lIH07XG59O1xuXG4vLyAyMi4xLjMuNCBBcnJheS5wcm90b3R5cGUuZW50cmllcygpXG4vLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmtleXMoKVxuLy8gMjIuMS4zLjI5IEFycmF5LnByb3RvdHlwZS52YWx1ZXMoKVxuLy8gMjIuMS4zLjMwIEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG52YXIgZXM2X2FycmF5X2l0ZXJhdG9yID0gX2l0ZXJEZWZpbmUoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICB0aGlzLl90ID0gX3RvSW9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuLy8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGtpbmQgPSB0aGlzLl9rO1xuICB2YXIgaW5kZXggPSB0aGlzLl9pKys7XG4gIGlmICghTyB8fCBpbmRleCA+PSBPLmxlbmd0aCkge1xuICAgIHRoaXMuX3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIF9pdGVyU3RlcCgxKTtcbiAgfVxuICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiBfaXRlclN0ZXAoMCwgaW5kZXgpO1xuICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIF9pdGVyU3RlcCgwLCBPW2luZGV4XSk7XG4gIHJldHVybiBfaXRlclN0ZXAoMCwgW2luZGV4LCBPW2luZGV4XV0pO1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyUgKDkuNC40LjYsIDkuNC40LjcpXG5faXRlcmF0b3JzLkFyZ3VtZW50cyA9IF9pdGVyYXRvcnMuQXJyYXk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gX3drcygndG9TdHJpbmdUYWcnKTtcblxudmFyIERPTUl0ZXJhYmxlcyA9ICgnQ1NTUnVsZUxpc3QsQ1NTU3R5bGVEZWNsYXJhdGlvbixDU1NWYWx1ZUxpc3QsQ2xpZW50UmVjdExpc3QsRE9NUmVjdExpc3QsRE9NU3RyaW5nTGlzdCwnICtcbiAgJ0RPTVRva2VuTGlzdCxEYXRhVHJhbnNmZXJJdGVtTGlzdCxGaWxlTGlzdCxIVE1MQWxsQ29sbGVjdGlvbixIVE1MQ29sbGVjdGlvbixIVE1MRm9ybUVsZW1lbnQsSFRNTFNlbGVjdEVsZW1lbnQsJyArXG4gICdNZWRpYUxpc3QsTWltZVR5cGVBcnJheSxOYW1lZE5vZGVNYXAsTm9kZUxpc3QsUGFpbnRSZXF1ZXN0TGlzdCxQbHVnaW4sUGx1Z2luQXJyYXksU1ZHTGVuZ3RoTGlzdCxTVkdOdW1iZXJMaXN0LCcgK1xuICAnU1ZHUGF0aFNlZ0xpc3QsU1ZHUG9pbnRMaXN0LFNWR1N0cmluZ0xpc3QsU1ZHVHJhbnNmb3JtTGlzdCxTb3VyY2VCdWZmZXJMaXN0LFN0eWxlU2hlZXRMaXN0LFRleHRUcmFja0N1ZUxpc3QsJyArXG4gICdUZXh0VHJhY2tMaXN0LFRvdWNoTGlzdCcpLnNwbGl0KCcsJyk7XG5cbmZvciAodmFyIGkgPSAwOyBpIDwgRE9NSXRlcmFibGVzLmxlbmd0aDsgaSsrKSB7XG4gIHZhciBOQU1FID0gRE9NSXRlcmFibGVzW2ldO1xuICB2YXIgQ29sbGVjdGlvbiA9IF9nbG9iYWxbTkFNRV07XG4gIHZhciBwcm90byA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGU7XG4gIGlmIChwcm90byAmJiAhcHJvdG9bVE9fU1RSSU5HX1RBR10pIF9oaWRlKHByb3RvLCBUT19TVFJJTkdfVEFHLCBOQU1FKTtcbiAgX2l0ZXJhdG9yc1tOQU1FXSA9IF9pdGVyYXRvcnMuQXJyYXk7XG59XG5cbi8vIGdldHRpbmcgdGFnIGZyb20gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG5cbnZhciBUQUckMSA9IF93a3MoJ3RvU3RyaW5nVGFnJyk7XG4vLyBFUzMgd3JvbmcgaGVyZVxudmFyIEFSRyA9IF9jb2YoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxufTtcblxudmFyIF9jbGFzc29mID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBPLCBULCBCO1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAoVCA9IHRyeUdldChPID0gT2JqZWN0KGl0KSwgVEFHJDEpKSA9PSAnc3RyaW5nJyA/IFRcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IEFSRyA/IF9jb2YoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAoQiA9IF9jb2YoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiBCO1xufTtcblxudmFyIF9hbkluc3RhbmNlID0gZnVuY3Rpb24gKGl0LCBDb25zdHJ1Y3RvciwgbmFtZSwgZm9yYmlkZGVuRmllbGQpIHtcbiAgaWYgKCEoaXQgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikgfHwgKGZvcmJpZGRlbkZpZWxkICE9PSB1bmRlZmluZWQgJiYgZm9yYmlkZGVuRmllbGQgaW4gaXQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKG5hbWUgKyAnOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEnKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuXG4vLyBjYWxsIHNvbWV0aGluZyBvbiBpdGVyYXRvciBzdGVwIHdpdGggc2FmZSBjbG9zaW5nIG9uIGVycm9yXG5cbnZhciBfaXRlckNhbGwgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGZuLCB2YWx1ZSwgZW50cmllcykge1xuICB0cnkge1xuICAgIHJldHVybiBlbnRyaWVzID8gZm4oX2FuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpO1xuICAvLyA3LjQuNiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCBjb21wbGV0aW9uKVxuICB9IGNhdGNoIChlKSB7XG4gICAgdmFyIHJldCA9IGl0ZXJhdG9yWydyZXR1cm4nXTtcbiAgICBpZiAocmV0ICE9PSB1bmRlZmluZWQpIF9hbk9iamVjdChyZXQuY2FsbChpdGVyYXRvcikpO1xuICAgIHRocm93IGU7XG4gIH1cbn07XG5cbi8vIGNoZWNrIG9uIGRlZmF1bHQgQXJyYXkgaXRlcmF0b3JcblxudmFyIElURVJBVE9SJDEgPSBfd2tzKCdpdGVyYXRvcicpO1xudmFyIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cbnZhciBfaXNBcnJheUl0ZXIgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKF9pdGVyYXRvcnMuQXJyYXkgPT09IGl0IHx8IEFycmF5UHJvdG9bSVRFUkFUT1IkMV0gPT09IGl0KTtcbn07XG5cbnZhciBJVEVSQVRPUiQyID0gX3drcygnaXRlcmF0b3InKTtcblxudmFyIGNvcmVfZ2V0SXRlcmF0b3JNZXRob2QgPSBfY29yZS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgIT0gdW5kZWZpbmVkKSByZXR1cm4gaXRbSVRFUkFUT1IkMl1cbiAgICB8fCBpdFsnQEBpdGVyYXRvciddXG4gICAgfHwgX2l0ZXJhdG9yc1tfY2xhc3NvZihpdCldO1xufTtcblxudmFyIF9mb3JPZiA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbnZhciBCUkVBSyA9IHt9O1xudmFyIFJFVFVSTiA9IHt9O1xudmFyIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYWJsZSwgZW50cmllcywgZm4sIHRoYXQsIElURVJBVE9SKSB7XG4gIHZhciBpdGVyRm4gPSBJVEVSQVRPUiA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGl0ZXJhYmxlOyB9IDogY29yZV9nZXRJdGVyYXRvck1ldGhvZChpdGVyYWJsZSk7XG4gIHZhciBmID0gX2N0eChmbiwgdGhhdCwgZW50cmllcyA/IDIgOiAxKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCwgc3RlcCwgaXRlcmF0b3IsIHJlc3VsdDtcbiAgaWYgKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKGl0ZXJhYmxlICsgJyBpcyBub3QgaXRlcmFibGUhJyk7XG4gIC8vIGZhc3QgY2FzZSBmb3IgYXJyYXlzIHdpdGggZGVmYXVsdCBpdGVyYXRvclxuICBpZiAoX2lzQXJyYXlJdGVyKGl0ZXJGbikpIGZvciAobGVuZ3RoID0gX3RvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgcmVzdWx0ID0gZW50cmllcyA/IGYoX2FuT2JqZWN0KHN0ZXAgPSBpdGVyYWJsZVtpbmRleF0pWzBdLCBzdGVwWzFdKSA6IGYoaXRlcmFibGVbaW5kZXhdKTtcbiAgICBpZiAocmVzdWx0ID09PSBCUkVBSyB8fCByZXN1bHQgPT09IFJFVFVSTikgcmV0dXJuIHJlc3VsdDtcbiAgfSBlbHNlIGZvciAoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTspIHtcbiAgICByZXN1bHQgPSBfaXRlckNhbGwoaXRlcmF0b3IsIGYsIHN0ZXAudmFsdWUsIGVudHJpZXMpO1xuICAgIGlmIChyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKSByZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuZXhwb3J0cy5CUkVBSyA9IEJSRUFLO1xuZXhwb3J0cy5SRVRVUk4gPSBSRVRVUk47XG59KTtcblxuLy8gNy4zLjIwIFNwZWNpZXNDb25zdHJ1Y3RvcihPLCBkZWZhdWx0Q29uc3RydWN0b3IpXG5cblxudmFyIFNQRUNJRVMgPSBfd2tzKCdzcGVjaWVzJyk7XG52YXIgX3NwZWNpZXNDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIChPLCBEKSB7XG4gIHZhciBDID0gX2FuT2JqZWN0KE8pLmNvbnN0cnVjdG9yO1xuICB2YXIgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IF9hbk9iamVjdChDKVtTUEVDSUVTXSkgPT0gdW5kZWZpbmVkID8gRCA6IF9hRnVuY3Rpb24oUyk7XG59O1xuXG4vLyBmYXN0IGFwcGx5LCBodHRwOi8vanNwZXJmLmxua2l0LmNvbS9mYXN0LWFwcGx5LzVcbnZhciBfaW52b2tlID0gZnVuY3Rpb24gKGZuLCBhcmdzLCB0aGF0KSB7XG4gIHZhciB1biA9IHRoYXQgPT09IHVuZGVmaW5lZDtcbiAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIHVuID8gZm4oKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0KTtcbiAgICBjYXNlIDE6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICBjYXNlIDQ6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICB9IHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmdzKTtcbn07XG5cbnZhciBwcm9jZXNzID0gX2dsb2JhbC5wcm9jZXNzO1xudmFyIHNldFRhc2sgPSBfZ2xvYmFsLnNldEltbWVkaWF0ZTtcbnZhciBjbGVhclRhc2sgPSBfZ2xvYmFsLmNsZWFySW1tZWRpYXRlO1xudmFyIE1lc3NhZ2VDaGFubmVsID0gX2dsb2JhbC5NZXNzYWdlQ2hhbm5lbDtcbnZhciBEaXNwYXRjaCA9IF9nbG9iYWwuRGlzcGF0Y2g7XG52YXIgY291bnRlciA9IDA7XG52YXIgcXVldWUgPSB7fTtcbnZhciBPTlJFQURZU1RBVEVDSEFOR0UgPSAnb25yZWFkeXN0YXRlY2hhbmdlJztcbnZhciBkZWZlciwgY2hhbm5lbCwgcG9ydDtcbnZhciBydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBpZCA9ICt0aGlzO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gIGlmIChxdWV1ZS5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICB2YXIgZm4gPSBxdWV1ZVtpZF07XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgICBmbigpO1xuICB9XG59O1xudmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHJ1bi5jYWxsKGV2ZW50LmRhdGEpO1xufTtcbi8vIE5vZGUuanMgMC45KyAmIElFMTArIGhhcyBzZXRJbW1lZGlhdGUsIG90aGVyd2lzZTpcbmlmICghc2V0VGFzayB8fCAhY2xlYXJUYXNrKSB7XG4gIHNldFRhc2sgPSBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoZm4pIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIHZhciBpID0gMTtcbiAgICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGkpIGFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgcXVldWVbKytjb3VudGVyXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgICAgX2ludm9rZSh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJyA/IGZuIDogRnVuY3Rpb24oZm4pLCBhcmdzKTtcbiAgICB9O1xuICAgIGRlZmVyKGNvdW50ZXIpO1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9O1xuICBjbGVhclRhc2sgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCkge1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZiAoX2NvZihwcm9jZXNzKSA9PSAncHJvY2VzcycpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhfY3R4KHJ1biwgaWQsIDEpKTtcbiAgICB9O1xuICAvLyBTcGhlcmUgKEpTIGdhbWUgZW5naW5lKSBEaXNwYXRjaCBBUElcbiAgfSBlbHNlIGlmIChEaXNwYXRjaCAmJiBEaXNwYXRjaC5ub3cpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgRGlzcGF0Y2gubm93KF9jdHgocnVuLCBpZCwgMSkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgfSBlbHNlIGlmIChNZXNzYWdlQ2hhbm5lbCkge1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RlbmVyO1xuICAgIGRlZmVyID0gX2N0eChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0LCAxKTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBwb3N0TWVzc2FnZSwgc2tpcCBXZWJXb3JrZXJzXG4gIC8vIElFOCBoYXMgcG9zdE1lc3NhZ2UsIGJ1dCBpdCdzIHN5bmMgJiB0eXBlb2YgaXRzIHBvc3RNZXNzYWdlIGlzICdvYmplY3QnXG4gIH0gZWxzZSBpZiAoX2dsb2JhbC5hZGRFdmVudExpc3RlbmVyICYmIHR5cGVvZiBwb3N0TWVzc2FnZSA9PSAnZnVuY3Rpb24nICYmICFfZ2xvYmFsLmltcG9ydFNjcmlwdHMpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgX2dsb2JhbC5wb3N0TWVzc2FnZShpZCArICcnLCAnKicpO1xuICAgIH07XG4gICAgX2dsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBfZG9tQ3JlYXRlKCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBfaHRtbC5hcHBlbmRDaGlsZChfZG9tQ3JlYXRlKCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX2h0bWwucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICAgIHJ1bi5jYWxsKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgc2V0VGltZW91dChfY3R4KHJ1biwgaWQsIDEpLCAwKTtcbiAgICB9O1xuICB9XG59XG52YXIgX3Rhc2sgPSB7XG4gIHNldDogc2V0VGFzayxcbiAgY2xlYXI6IGNsZWFyVGFza1xufTtcblxudmFyIG1hY3JvdGFzayA9IF90YXNrLnNldDtcbnZhciBPYnNlcnZlciA9IF9nbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBfZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG52YXIgcHJvY2VzcyQxID0gX2dsb2JhbC5wcm9jZXNzO1xudmFyIFByb21pc2UkMSA9IF9nbG9iYWwuUHJvbWlzZTtcbnZhciBpc05vZGUgPSBfY29mKHByb2Nlc3MkMSkgPT0gJ3Byb2Nlc3MnO1xuXG52YXIgX21pY3JvdGFzayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGhlYWQsIGxhc3QsIG5vdGlmeTtcblxuICB2YXIgZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBhcmVudCwgZm47XG4gICAgaWYgKGlzTm9kZSAmJiAocGFyZW50ID0gcHJvY2VzcyQxLmRvbWFpbikpIHBhcmVudC5leGl0KCk7XG4gICAgd2hpbGUgKGhlYWQpIHtcbiAgICAgIGZuID0gaGVhZC5mbjtcbiAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoaGVhZCkgbm90aWZ5KCk7XG4gICAgICAgIGVsc2UgbGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9IGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gTm9kZS5qc1xuICBpZiAoaXNOb2RlKSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvY2VzcyQxLm5leHRUaWNrKGZsdXNoKTtcbiAgICB9O1xuICAvLyBicm93c2VycyB3aXRoIE11dGF0aW9uT2JzZXJ2ZXIsIGV4Y2VwdCBpT1MgU2FmYXJpIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzMzOVxuICB9IGVsc2UgaWYgKE9ic2VydmVyICYmICEoX2dsb2JhbC5uYXZpZ2F0b3IgJiYgX2dsb2JhbC5uYXZpZ2F0b3Iuc3RhbmRhbG9uZSkpIHtcbiAgICB2YXIgdG9nZ2xlID0gdHJ1ZTtcbiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9ICF0b2dnbGU7XG4gICAgfTtcbiAgLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2VcbiAgfSBlbHNlIGlmIChQcm9taXNlJDEgJiYgUHJvbWlzZSQxLnJlc29sdmUpIHtcbiAgICAvLyBQcm9taXNlLnJlc29sdmUgd2l0aG91dCBhbiBhcmd1bWVudCB0aHJvd3MgYW4gZXJyb3IgaW4gTEcgV2ViT1MgMlxuICAgIHZhciBwcm9taXNlID0gUHJvbWlzZSQxLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9taXNlLnRoZW4oZmx1c2gpO1xuICAgIH07XG4gIC8vIGZvciBvdGhlciBlbnZpcm9ubWVudHMgLSBtYWNyb3Rhc2sgYmFzZWQgb246XG4gIC8vIC0gc2V0SW1tZWRpYXRlXG4gIC8vIC0gTWVzc2FnZUNoYW5uZWxcbiAgLy8gLSB3aW5kb3cucG9zdE1lc3NhZ1xuICAvLyAtIG9ucmVhZHlzdGF0ZWNoYW5nZVxuICAvLyAtIHNldFRpbWVvdXRcbiAgfSBlbHNlIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBzdHJhbmdlIElFICsgd2VicGFjayBkZXYgc2VydmVyIGJ1ZyAtIHVzZSAuY2FsbChnbG9iYWwpXG4gICAgICBtYWNyb3Rhc2suY2FsbChfZ2xvYmFsLCBmbHVzaCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICB2YXIgdGFzayA9IHsgZm46IGZuLCBuZXh0OiB1bmRlZmluZWQgfTtcbiAgICBpZiAobGFzdCkgbGFzdC5uZXh0ID0gdGFzaztcbiAgICBpZiAoIWhlYWQpIHtcbiAgICAgIGhlYWQgPSB0YXNrO1xuICAgICAgbm90aWZ5KCk7XG4gICAgfSBsYXN0ID0gdGFzaztcbiAgfTtcbn07XG5cbi8vIDI1LjQuMS41IE5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG5cblxuZnVuY3Rpb24gUHJvbWlzZUNhcGFiaWxpdHkoQykge1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbiAoJCRyZXNvbHZlLCAkJHJlamVjdCkge1xuICAgIGlmIChyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gX2FGdW5jdGlvbihyZXNvbHZlKTtcbiAgdGhpcy5yZWplY3QgPSBfYUZ1bmN0aW9uKHJlamVjdCk7XG59XG5cbnZhciBmJDEgPSBmdW5jdGlvbiAoQykge1xuICByZXR1cm4gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcblxudmFyIF9uZXdQcm9taXNlQ2FwYWJpbGl0eSA9IHtcblx0ZjogZiQxXG59O1xuXG52YXIgX3BlcmZvcm0gPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiB7IGU6IGZhbHNlLCB2OiBleGVjKCkgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB7IGU6IHRydWUsIHY6IGUgfTtcbiAgfVxufTtcblxudmFyIG5hdmlnYXRvciA9IF9nbG9iYWwubmF2aWdhdG9yO1xuXG52YXIgX3VzZXJBZ2VudCA9IG5hdmlnYXRvciAmJiBuYXZpZ2F0b3IudXNlckFnZW50IHx8ICcnO1xuXG52YXIgX3Byb21pc2VSZXNvbHZlID0gZnVuY3Rpb24gKEMsIHgpIHtcbiAgX2FuT2JqZWN0KEMpO1xuICBpZiAoX2lzT2JqZWN0KHgpICYmIHguY29uc3RydWN0b3IgPT09IEMpIHJldHVybiB4O1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBfbmV3UHJvbWlzZUNhcGFiaWxpdHkuZihDKTtcbiAgdmFyIHJlc29sdmUgPSBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlO1xuICByZXNvbHZlKHgpO1xuICByZXR1cm4gcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZTtcbn07XG5cbnZhciBfcmVkZWZpbmVBbGwgPSBmdW5jdGlvbiAodGFyZ2V0LCBzcmMsIHNhZmUpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgIGlmIChzYWZlICYmIHRhcmdldFtrZXldKSB0YXJnZXRba2V5XSA9IHNyY1trZXldO1xuICAgIGVsc2UgX2hpZGUodGFyZ2V0LCBrZXksIHNyY1trZXldKTtcbiAgfSByZXR1cm4gdGFyZ2V0O1xufTtcblxudmFyIFNQRUNJRVMkMSA9IF93a3MoJ3NwZWNpZXMnKTtcblxudmFyIF9zZXRTcGVjaWVzID0gZnVuY3Rpb24gKEtFWSkge1xuICB2YXIgQyA9IHR5cGVvZiBfY29yZVtLRVldID09ICdmdW5jdGlvbicgPyBfY29yZVtLRVldIDogX2dsb2JhbFtLRVldO1xuICBpZiAoX2Rlc2NyaXB0b3JzICYmIEMgJiYgIUNbU1BFQ0lFUyQxXSkgX29iamVjdERwLmYoQywgU1BFQ0lFUyQxLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfVxuICB9KTtcbn07XG5cbnZhciBJVEVSQVRPUiQzID0gX3drcygnaXRlcmF0b3InKTtcbnZhciBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIHJpdGVyID0gWzddW0lURVJBVE9SJDNdKCk7XG4gIHJpdGVyWydyZXR1cm4nXSA9IGZ1bmN0aW9uICgpIHsgU0FGRV9DTE9TSU5HID0gdHJ1ZTsgfTtcbn0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuXG52YXIgX2l0ZXJEZXRlY3QgPSBmdW5jdGlvbiAoZXhlYywgc2tpcENsb3NpbmcpIHtcbiAgaWYgKCFza2lwQ2xvc2luZyAmJiAhU0FGRV9DTE9TSU5HKSByZXR1cm4gZmFsc2U7XG4gIHZhciBzYWZlID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IFs3XTtcbiAgICB2YXIgaXRlciA9IGFycltJVEVSQVRPUiQzXSgpO1xuICAgIGl0ZXIubmV4dCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHsgZG9uZTogc2FmZSA9IHRydWUgfTsgfTtcbiAgICBhcnJbSVRFUkFUT1IkM10gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyOyB9O1xuICAgIGV4ZWMoYXJyKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBzYWZlO1xufTtcblxudmFyIHRhc2sgPSBfdGFzay5zZXQ7XG52YXIgbWljcm90YXNrID0gX21pY3JvdGFzaygpO1xuXG5cblxuXG52YXIgUFJPTUlTRSA9ICdQcm9taXNlJztcbnZhciBUeXBlRXJyb3IkMSA9IF9nbG9iYWwuVHlwZUVycm9yO1xudmFyIHByb2Nlc3MkMiA9IF9nbG9iYWwucHJvY2VzcztcbnZhciB2ZXJzaW9ucyA9IHByb2Nlc3MkMiAmJiBwcm9jZXNzJDIudmVyc2lvbnM7XG52YXIgdjggPSB2ZXJzaW9ucyAmJiB2ZXJzaW9ucy52OCB8fCAnJztcbnZhciAkUHJvbWlzZSA9IF9nbG9iYWxbUFJPTUlTRV07XG52YXIgaXNOb2RlJDEgPSBfY2xhc3NvZihwcm9jZXNzJDIpID09ICdwcm9jZXNzJztcbnZhciBlbXB0eSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbnZhciBJbnRlcm5hbCwgbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5LCBPd25Qcm9taXNlQ2FwYWJpbGl0eSwgV3JhcHBlcjtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSA9IF9uZXdQcm9taXNlQ2FwYWJpbGl0eS5mO1xuXG52YXIgVVNFX05BVElWRSA9ICEhZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIC8vIGNvcnJlY3Qgc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICAgIHZhciBwcm9taXNlID0gJFByb21pc2UucmVzb2x2ZSgxKTtcbiAgICB2YXIgRmFrZVByb21pc2UgPSAocHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9KVtfd2tzKCdzcGVjaWVzJyldID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgICAgIGV4ZWMoZW1wdHksIGVtcHR5KTtcbiAgICB9O1xuICAgIC8vIHVuaGFuZGxlZCByZWplY3Rpb25zIHRyYWNraW5nIHN1cHBvcnQsIE5vZGVKUyBQcm9taXNlIHdpdGhvdXQgaXQgZmFpbHMgQEBzcGVjaWVzIHRlc3RcbiAgICByZXR1cm4gKGlzTm9kZSQxIHx8IHR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQgPT0gJ2Z1bmN0aW9uJylcbiAgICAgICYmIHByb21pc2UudGhlbihlbXB0eSkgaW5zdGFuY2VvZiBGYWtlUHJvbWlzZVxuICAgICAgLy8gdjggNi42IChOb2RlIDEwIGFuZCBDaHJvbWUgNjYpIGhhdmUgYSBidWcgd2l0aCByZXNvbHZpbmcgY3VzdG9tIHRoZW5hYmxlc1xuICAgICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9ODMwNTY1XG4gICAgICAvLyB3ZSBjYW4ndCBkZXRlY3QgaXQgc3luY2hyb25vdXNseSwgc28ganVzdCBjaGVjayB2ZXJzaW9uc1xuICAgICAgJiYgdjguaW5kZXhPZignNi42JykgIT09IDBcbiAgICAgICYmIF91c2VyQWdlbnQuaW5kZXhPZignQ2hyb21lLzY2JykgPT09IC0xO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbn0oKTtcblxuLy8gaGVscGVyc1xudmFyIGlzVGhlbmFibGUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHRoZW47XG4gIHJldHVybiBfaXNPYmplY3QoaXQpICYmIHR5cGVvZiAodGhlbiA9IGl0LnRoZW4pID09ICdmdW5jdGlvbicgPyB0aGVuIDogZmFsc2U7XG59O1xudmFyIG5vdGlmeSA9IGZ1bmN0aW9uIChwcm9taXNlLCBpc1JlamVjdCkge1xuICBpZiAocHJvbWlzZS5fbikgcmV0dXJuO1xuICBwcm9taXNlLl9uID0gdHJ1ZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYztcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciBvayA9IHByb21pc2UuX3MgPT0gMTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHJ1biA9IGZ1bmN0aW9uIChyZWFjdGlvbikge1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgICAgIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTtcbiAgICAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7XG4gICAgICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICAgICAgdmFyIHJlc3VsdCwgdGhlbiwgZXhpdGVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZS5faCA9PSAyKSBvbkhhbmRsZVVuaGFuZGxlZChwcm9taXNlKTtcbiAgICAgICAgICAgIHByb21pc2UuX2ggPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGFuZGxlciA9PT0gdHJ1ZSkgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoZG9tYWluKSBkb21haW4uZW50ZXIoKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZXIodmFsdWUpOyAvLyBtYXkgdGhyb3dcbiAgICAgICAgICAgIGlmIChkb21haW4pIHtcbiAgICAgICAgICAgICAgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgICAgICAgZXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gcmVhY3Rpb24ucHJvbWlzZSkge1xuICAgICAgICAgICAgcmVqZWN0KFR5cGVFcnJvciQxKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhlbiA9IGlzVGhlbmFibGUocmVzdWx0KSkge1xuICAgICAgICAgICAgdGhlbi5jYWxsKHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGRvbWFpbiAmJiAhZXhpdGVkKSBkb21haW4uZXhpdCgpO1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3aGlsZSAoY2hhaW4ubGVuZ3RoID4gaSkgcnVuKGNoYWluW2krK10pOyAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIHByb21pc2UuX2MgPSBbXTtcbiAgICBwcm9taXNlLl9uID0gZmFsc2U7XG4gICAgaWYgKGlzUmVqZWN0ICYmICFwcm9taXNlLl9oKSBvblVuaGFuZGxlZChwcm9taXNlKTtcbiAgfSk7XG59O1xudmFyIG9uVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgdGFzay5jYWxsKF9nbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciB1bmhhbmRsZWQgPSBpc1VuaGFuZGxlZChwcm9taXNlKTtcbiAgICB2YXIgcmVzdWx0LCBoYW5kbGVyLCBjb25zb2xlO1xuICAgIGlmICh1bmhhbmRsZWQpIHtcbiAgICAgIHJlc3VsdCA9IF9wZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGlzTm9kZSQxKSB7XG4gICAgICAgICAgcHJvY2VzcyQyLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGlmIChoYW5kbGVyID0gX2dsb2JhbC5vbnVuaGFuZGxlZHJlamVjdGlvbikge1xuICAgICAgICAgIGhhbmRsZXIoeyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHZhbHVlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKChjb25zb2xlID0gX2dsb2JhbC5jb25zb2xlKSAmJiBjb25zb2xlLmVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIEJyb3dzZXJzIHNob3VsZCBub3QgdHJpZ2dlciBgcmVqZWN0aW9uSGFuZGxlZGAgZXZlbnQgaWYgaXQgd2FzIGhhbmRsZWQgaGVyZSwgTm9kZUpTIC0gc2hvdWxkXG4gICAgICBwcm9taXNlLl9oID0gaXNOb2RlJDEgfHwgaXNVbmhhbmRsZWQocHJvbWlzZSkgPyAyIDogMTtcbiAgICB9IHByb21pc2UuX2EgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHVuaGFuZGxlZCAmJiByZXN1bHQuZSkgdGhyb3cgcmVzdWx0LnY7XG4gIH0pO1xufTtcbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHJldHVybiBwcm9taXNlLl9oICE9PSAxICYmIChwcm9taXNlLl9hIHx8IHByb21pc2UuX2MpLmxlbmd0aCA9PT0gMDtcbn07XG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICB0YXNrLmNhbGwoX2dsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBoYW5kbGVyO1xuICAgIGlmIChpc05vZGUkMSkge1xuICAgICAgcHJvY2VzcyQyLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPSBfZ2xvYmFsLm9ucmVqZWN0aW9uaGFuZGxlZCkge1xuICAgICAgaGFuZGxlcih7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogcHJvbWlzZS5fdiB9KTtcbiAgICB9XG4gIH0pO1xufTtcbnZhciAkcmVqZWN0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHZhciBwcm9taXNlID0gdGhpcztcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICBwcm9taXNlLl92ID0gdmFsdWU7XG4gIHByb21pc2UuX3MgPSAyO1xuICBpZiAoIXByb21pc2UuX2EpIHByb21pc2UuX2EgPSBwcm9taXNlLl9jLnNsaWNlKCk7XG4gIG5vdGlmeShwcm9taXNlLCB0cnVlKTtcbn07XG52YXIgJHJlc29sdmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICB2YXIgdGhlbjtcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICB0cnkge1xuICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkgdGhyb3cgVHlwZUVycm9yJDEoXCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZlwiKTtcbiAgICBpZiAodGhlbiA9IGlzVGhlbmFibGUodmFsdWUpKSB7XG4gICAgICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgd3JhcHBlciA9IHsgX3c6IHByb21pc2UsIF9kOiBmYWxzZSB9OyAvLyB3cmFwXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhlbi5jYWxsKHZhbHVlLCBfY3R4KCRyZXNvbHZlLCB3cmFwcGVyLCAxKSwgX2N0eCgkcmVqZWN0LCB3cmFwcGVyLCAxKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAkcmVqZWN0LmNhbGwod3JhcHBlciwgZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9taXNlLl92ID0gdmFsdWU7XG4gICAgICBwcm9taXNlLl9zID0gMTtcbiAgICAgIG5vdGlmeShwcm9taXNlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgJHJlamVjdC5jYWxsKHsgX3c6IHByb21pc2UsIF9kOiBmYWxzZSB9LCBlKTsgLy8gd3JhcFxuICB9XG59O1xuXG4vLyBjb25zdHJ1Y3RvciBwb2x5ZmlsbFxuaWYgKCFVU0VfTkFUSVZFKSB7XG4gIC8vIDI1LjQuMy4xIFByb21pc2UoZXhlY3V0b3IpXG4gICRQcm9taXNlID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIF9hbkluc3RhbmNlKHRoaXMsICRQcm9taXNlLCBQUk9NSVNFLCAnX2gnKTtcbiAgICBfYUZ1bmN0aW9uKGV4ZWN1dG9yKTtcbiAgICBJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihfY3R4KCRyZXNvbHZlLCB0aGlzLCAxKSwgX2N0eCgkcmVqZWN0LCB0aGlzLCAxKSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAkcmVqZWN0LmNhbGwodGhpcywgZXJyKTtcbiAgICB9XG4gIH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICB0aGlzLl9jID0gW107ICAgICAgICAgICAgIC8vIDwtIGF3YWl0aW5nIHJlYWN0aW9uc1xuICAgIHRoaXMuX2EgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gY2hlY2tlZCBpbiBpc1VuaGFuZGxlZCByZWFjdGlvbnNcbiAgICB0aGlzLl9zID0gMDsgICAgICAgICAgICAgIC8vIDwtIHN0YXRlXG4gICAgdGhpcy5fZCA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBkb25lXG4gICAgdGhpcy5fdiA9IHVuZGVmaW5lZDsgICAgICAvLyA8LSB2YWx1ZVxuICAgIHRoaXMuX2ggPSAwOyAgICAgICAgICAgICAgLy8gPC0gcmVqZWN0aW9uIHN0YXRlLCAwIC0gZGVmYXVsdCwgMSAtIGhhbmRsZWQsIDIgLSB1bmhhbmRsZWRcbiAgICB0aGlzLl9uID0gZmFsc2U7ICAgICAgICAgIC8vIDwtIG5vdGlmeVxuICB9O1xuICBJbnRlcm5hbC5wcm90b3R5cGUgPSBfcmVkZWZpbmVBbGwoJFByb21pc2UucHJvdG90eXBlLCB7XG4gICAgLy8gMjUuNC41LjMgUHJvbWlzZS5wcm90b3R5cGUudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZClcbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICB2YXIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShfc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsICRQcm9taXNlKSk7XG4gICAgICByZWFjdGlvbi5vayA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PSAnZnVuY3Rpb24nID8gb25GdWxmaWxsZWQgOiB0cnVlO1xuICAgICAgcmVhY3Rpb24uZmFpbCA9IHR5cGVvZiBvblJlamVjdGVkID09ICdmdW5jdGlvbicgJiYgb25SZWplY3RlZDtcbiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IGlzTm9kZSQxID8gcHJvY2VzcyQyLmRvbWFpbiA6IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2MucHVzaChyZWFjdGlvbik7XG4gICAgICBpZiAodGhpcy5fYSkgdGhpcy5fYS5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmICh0aGlzLl9zKSBub3RpZnkodGhpcywgZmFsc2UpO1xuICAgICAgcmV0dXJuIHJlYWN0aW9uLnByb21pc2U7XG4gICAgfSxcbiAgICAvLyAyNS40LjUuMSBQcm9taXNlLnByb3RvdHlwZS5jYXRjaChvblJlamVjdGVkKVxuICAgICdjYXRjaCc6IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gICAgfVxuICB9KTtcbiAgT3duUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBuZXcgSW50ZXJuYWwoKTtcbiAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlO1xuICAgIHRoaXMucmVzb2x2ZSA9IF9jdHgoJHJlc29sdmUsIHByb21pc2UsIDEpO1xuICAgIHRoaXMucmVqZWN0ID0gX2N0eCgkcmVqZWN0LCBwcm9taXNlLCAxKTtcbiAgfTtcbiAgX25ld1Byb21pc2VDYXBhYmlsaXR5LmYgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7XG4gICAgcmV0dXJuIEMgPT09ICRQcm9taXNlIHx8IEMgPT09IFdyYXBwZXJcbiAgICAgID8gbmV3IE93blByb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICA6IG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgfTtcbn1cblxuX2V4cG9ydChfZXhwb3J0LkcgKyBfZXhwb3J0LlcgKyBfZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgeyBQcm9taXNlOiAkUHJvbWlzZSB9KTtcbl9zZXRUb1N0cmluZ1RhZygkUHJvbWlzZSwgUFJPTUlTRSk7XG5fc2V0U3BlY2llcyhQUk9NSVNFKTtcbldyYXBwZXIgPSBfY29yZVtQUk9NSVNFXTtcblxuLy8gc3RhdGljc1xuX2V4cG9ydChfZXhwb3J0LlMgKyBfZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNSBQcm9taXNlLnJlamVjdChyKVxuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKSB7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKTtcbiAgICB2YXIgJCRyZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICAkJHJlamVjdChyKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbl9leHBvcnQoX2V4cG9ydC5TICsgX2V4cG9ydC5GICogKF9saWJyYXJ5IHx8ICFVU0VfTkFUSVZFKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNiBQcm9taXNlLnJlc29sdmUoeClcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh4KSB7XG4gICAgcmV0dXJuIF9wcm9taXNlUmVzb2x2ZShfbGlicmFyeSAmJiB0aGlzID09PSBXcmFwcGVyID8gJFByb21pc2UgOiB0aGlzLCB4KTtcbiAgfVxufSk7XG5fZXhwb3J0KF9leHBvcnQuUyArIF9leHBvcnQuRiAqICEoVVNFX05BVElWRSAmJiBfaXRlckRldGVjdChmdW5jdGlvbiAoaXRlcikge1xuICAkUHJvbWlzZS5hbGwoaXRlcilbJ2NhdGNoJ10oZW1wdHkpO1xufSkpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC4xIFByb21pc2UuYWxsKGl0ZXJhYmxlKVxuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gX3BlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgX2Zvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyICRpbmRleCA9IGluZGV4Kys7XG4gICAgICAgIHZhciBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHZhbHVlcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBDLnJlc29sdmUocHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1skaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lKSByZWplY3QocmVzdWx0LnYpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH0sXG4gIC8vIDI1LjQuNC40IFByb21pc2UucmFjZShpdGVyYWJsZSlcbiAgcmFjZTogZnVuY3Rpb24gcmFjZShpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gX3BlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgX2Zvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lKSByZWplY3QocmVzdWx0LnYpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuXG5fZXhwb3J0KF9leHBvcnQuUCArIF9leHBvcnQuUiwgJ1Byb21pc2UnLCB7ICdmaW5hbGx5JzogZnVuY3Rpb24gKG9uRmluYWxseSkge1xuICB2YXIgQyA9IF9zcGVjaWVzQ29uc3RydWN0b3IodGhpcywgX2NvcmUuUHJvbWlzZSB8fCBfZ2xvYmFsLlByb21pc2UpO1xuICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiBvbkZpbmFsbHkgPT0gJ2Z1bmN0aW9uJztcbiAgcmV0dXJuIHRoaXMudGhlbihcbiAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4geDsgfSk7XG4gICAgfSA6IG9uRmluYWxseSxcbiAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyB0aHJvdyBlOyB9KTtcbiAgICB9IDogb25GaW5hbGx5XG4gICk7XG59IH0pO1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wcm9taXNlLXRyeVxuXG5cblxuXG5fZXhwb3J0KF9leHBvcnQuUywgJ1Byb21pc2UnLCB7ICd0cnknOiBmdW5jdGlvbiAoY2FsbGJhY2tmbikge1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBfbmV3UHJvbWlzZUNhcGFiaWxpdHkuZih0aGlzKTtcbiAgdmFyIHJlc3VsdCA9IF9wZXJmb3JtKGNhbGxiYWNrZm4pO1xuICAocmVzdWx0LmUgPyBwcm9taXNlQ2FwYWJpbGl0eS5yZWplY3QgOiBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlKShyZXN1bHQudik7XG4gIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xufSB9KTtcblxudmFyIHByb21pc2UgPSBfY29yZS5Qcm9taXNlO1xuXG52YXIgcHJvbWlzZSQxID0gcHJvbWlzZTtcblxuZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgcmV0dXJuIG5ldyBwcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXG4gICAgICBmdW5jdGlvbiBzdGVwKGtleSwgYXJnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpO1xuICAgICAgICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvbWlzZSQxLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgc3RlcChcIm5leHRcIiwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7XG4gICAgICAgIHN0ZXAoXCJ0aHJvd1wiLCBlcnIpO1xuICAgICAgfVxuXG4gICAgICBfbmV4dCgpO1xuICAgIH0pO1xuICB9O1xufVxuXG52YXIgYXN5bmNUb0dlbmVyYXRvciA9IF9hc3luY1RvR2VuZXJhdG9yO1xuXG52YXIgZiQyID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbnZhciBfb2JqZWN0UGllID0ge1xuXHRmOiBmJDJcbn07XG5cbnZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxudmFyIGYkMyA9IF9kZXNjcmlwdG9ycyA/IGdPUEQgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICBPID0gX3RvSW9iamVjdChPKTtcbiAgUCA9IF90b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgaWYgKF9pZThEb21EZWZpbmUpIHRyeSB7XG4gICAgcmV0dXJuIGdPUEQoTywgUCk7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoX2hhcyhPLCBQKSkgcmV0dXJuIF9wcm9wZXJ0eURlc2MoIV9vYmplY3RQaWUuZi5jYWxsKE8sIFApLCBPW1BdKTtcbn07XG5cbnZhciBfb2JqZWN0R29wZCA9IHtcblx0ZjogZiQzXG59O1xuXG4vLyBtb3N0IE9iamVjdCBtZXRob2RzIGJ5IEVTNiBzaG91bGQgYWNjZXB0IHByaW1pdGl2ZXNcblxuXG5cbnZhciBfb2JqZWN0U2FwID0gZnVuY3Rpb24gKEtFWSwgZXhlYykge1xuICB2YXIgZm4gPSAoX2NvcmUuT2JqZWN0IHx8IHt9KVtLRVldIHx8IE9iamVjdFtLRVldO1xuICB2YXIgZXhwID0ge307XG4gIGV4cFtLRVldID0gZXhlYyhmbik7XG4gIF9leHBvcnQoX2V4cG9ydC5TICsgX2V4cG9ydC5GICogX2ZhaWxzKGZ1bmN0aW9uICgpIHsgZm4oMSk7IH0pLCAnT2JqZWN0JywgZXhwKTtcbn07XG5cbi8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcblxudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBfb2JqZWN0R29wZC5mO1xuXG5fb2JqZWN0U2FwKCdnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSkge1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF90b0lvYmplY3QoaXQpLCBrZXkpO1xuICB9O1xufSk7XG5cbnZhciAkT2JqZWN0ID0gX2NvcmUuT2JqZWN0O1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KSB7XG4gIHJldHVybiAkT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KTtcbn07XG5cbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IkMSA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxudmFyIF9tZXRhID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xudmFyIE1FVEEgPSBfdWlkKCdtZXRhJyk7XG5cblxudmFyIHNldERlc2MgPSBfb2JqZWN0RHAuZjtcbnZhciBpZCA9IDA7XG52YXIgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZSB8fCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0cnVlO1xufTtcbnZhciBGUkVFWkUgPSAhX2ZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcbn0pO1xudmFyIHNldE1ldGEgPSBmdW5jdGlvbiAoaXQpIHtcbiAgc2V0RGVzYyhpdCwgTUVUQSwgeyB2YWx1ZToge1xuICAgIGk6ICdPJyArICsraWQsIC8vIG9iamVjdCBJRFxuICAgIHc6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gfSk7XG59O1xudmFyIGZhc3RLZXkgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICAvLyByZXR1cm4gcHJpbWl0aXZlIHdpdGggcHJlZml4XG4gIGlmICghX2lzT2JqZWN0KGl0KSkgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyA/ICdTJyA6ICdQJykgKyBpdDtcbiAgaWYgKCFfaGFzKGl0LCBNRVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gJ0YnO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiAnRSc7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhKGl0KTtcbiAgLy8gcmV0dXJuIG9iamVjdCBJRFxuICB9IHJldHVybiBpdFtNRVRBXS5pO1xufTtcbnZhciBnZXRXZWFrID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgaWYgKCFfaGFzKGl0LCBNRVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhKGl0KTtcbiAgLy8gcmV0dXJuIGhhc2ggd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSByZXR1cm4gaXRbTUVUQV0udztcbn07XG4vLyBhZGQgbWV0YWRhdGEgb24gZnJlZXplLWZhbWlseSBtZXRob2RzIGNhbGxpbmdcbnZhciBvbkZyZWV6ZSA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoRlJFRVpFICYmIG1ldGEuTkVFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFfaGFzKGl0LCBNRVRBKSkgc2V0TWV0YShpdCk7XG4gIHJldHVybiBpdDtcbn07XG52YXIgbWV0YSA9IG1vZHVsZS5leHBvcnRzID0ge1xuICBLRVk6IE1FVEEsXG4gIE5FRUQ6IGZhbHNlLFxuICBmYXN0S2V5OiBmYXN0S2V5LFxuICBnZXRXZWFrOiBnZXRXZWFrLFxuICBvbkZyZWV6ZTogb25GcmVlemVcbn07XG59KTtcbnZhciBfbWV0YV8xID0gX21ldGEuS0VZO1xudmFyIF9tZXRhXzIgPSBfbWV0YS5ORUVEO1xudmFyIF9tZXRhXzMgPSBfbWV0YS5mYXN0S2V5O1xudmFyIF9tZXRhXzQgPSBfbWV0YS5nZXRXZWFrO1xudmFyIF9tZXRhXzUgPSBfbWV0YS5vbkZyZWV6ZTtcblxudmFyIGYkNCA9IF93a3M7XG5cbnZhciBfd2tzRXh0ID0ge1xuXHRmOiBmJDRcbn07XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IF9vYmplY3REcC5mO1xudmFyIF93a3NEZWZpbmUgPSBmdW5jdGlvbiAobmFtZSkge1xuICB2YXIgJFN5bWJvbCA9IF9jb3JlLlN5bWJvbCB8fCAoX2NvcmUuU3ltYm9sID0gX2xpYnJhcnkgPyB7fSA6IF9nbG9iYWwuU3ltYm9sIHx8IHt9KTtcbiAgaWYgKG5hbWUuY2hhckF0KDApICE9ICdfJyAmJiAhKG5hbWUgaW4gJFN5bWJvbCkpIGRlZmluZVByb3BlcnR5KCRTeW1ib2wsIG5hbWUsIHsgdmFsdWU6IF93a3NFeHQuZihuYW1lKSB9KTtcbn07XG5cbnZhciBmJDUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG52YXIgX29iamVjdEdvcHMgPSB7XG5cdGY6IGYkNVxufTtcblxuLy8gYWxsIGVudW1lcmFibGUgb2JqZWN0IGtleXMsIGluY2x1ZGVzIHN5bWJvbHNcblxuXG5cbnZhciBfZW51bUtleXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHJlc3VsdCA9IF9vYmplY3RLZXlzKGl0KTtcbiAgdmFyIGdldFN5bWJvbHMgPSBfb2JqZWN0R29wcy5mO1xuICBpZiAoZ2V0U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gZ2V0U3ltYm9scyhpdCk7XG4gICAgdmFyIGlzRW51bSA9IF9vYmplY3RQaWUuZjtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAoc3ltYm9scy5sZW5ndGggPiBpKSBpZiAoaXNFbnVtLmNhbGwoaXQsIGtleSA9IHN5bWJvbHNbaSsrXSkpIHJlc3VsdC5wdXNoKGtleSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIDcuMi4yIElzQXJyYXkoYXJndW1lbnQpXG5cbnZhciBfaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmcpIHtcbiAgcmV0dXJuIF9jb2YoYXJnKSA9PSAnQXJyYXknO1xufTtcblxuLy8gMTkuMS4yLjcgLyAxNS4yLjMuNCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxuXG52YXIgaGlkZGVuS2V5cyA9IF9lbnVtQnVnS2V5cy5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxudmFyIGYkNiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoTykge1xuICByZXR1cm4gX29iamVjdEtleXNJbnRlcm5hbChPLCBoaWRkZW5LZXlzKTtcbn07XG5cbnZhciBfb2JqZWN0R29wbiA9IHtcblx0ZjogZiQ2XG59O1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBidWdneSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB3aXRoIGlmcmFtZSBhbmQgd2luZG93XG5cbnZhciBnT1BOID0gX29iamVjdEdvcG4uZjtcbnZhciB0b1N0cmluZyQxID0ge30udG9TdHJpbmc7XG5cbnZhciB3aW5kb3dOYW1lcyA9IHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzXG4gID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KSA6IFtdO1xuXG52YXIgZ2V0V2luZG93TmFtZXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ09QTihpdCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gd2luZG93TmFtZXMuc2xpY2UoKTtcbiAgfVxufTtcblxudmFyIGYkNyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgcmV0dXJuIHdpbmRvd05hbWVzICYmIHRvU3RyaW5nJDEuY2FsbChpdCkgPT0gJ1tvYmplY3QgV2luZG93XScgPyBnZXRXaW5kb3dOYW1lcyhpdCkgOiBnT1BOKF90b0lvYmplY3QoaXQpKTtcbn07XG5cbnZhciBfb2JqZWN0R29wbkV4dCA9IHtcblx0ZjogZiQ3XG59O1xuXG4vLyBFQ01BU2NyaXB0IDYgc3ltYm9scyBzaGltXG5cblxuXG5cblxudmFyIE1FVEEgPSBfbWV0YS5LRVk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbnZhciBnT1BEJDEgPSBfb2JqZWN0R29wZC5mO1xudmFyIGRQJDEgPSBfb2JqZWN0RHAuZjtcbnZhciBnT1BOJDEgPSBfb2JqZWN0R29wbkV4dC5mO1xudmFyICRTeW1ib2wgPSBfZ2xvYmFsLlN5bWJvbDtcbnZhciAkSlNPTiA9IF9nbG9iYWwuSlNPTjtcbnZhciBfc3RyaW5naWZ5ID0gJEpTT04gJiYgJEpTT04uc3RyaW5naWZ5O1xudmFyIFBST1RPVFlQRSQyID0gJ3Byb3RvdHlwZSc7XG52YXIgSElEREVOID0gX3drcygnX2hpZGRlbicpO1xudmFyIFRPX1BSSU1JVElWRSA9IF93a3MoJ3RvUHJpbWl0aXZlJyk7XG52YXIgaXNFbnVtID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG52YXIgU3ltYm9sUmVnaXN0cnkgPSBfc2hhcmVkKCdzeW1ib2wtcmVnaXN0cnknKTtcbnZhciBBbGxTeW1ib2xzID0gX3NoYXJlZCgnc3ltYm9scycpO1xudmFyIE9QU3ltYm9scyA9IF9zaGFyZWQoJ29wLXN5bWJvbHMnKTtcbnZhciBPYmplY3RQcm90byQxID0gT2JqZWN0W1BST1RPVFlQRSQyXTtcbnZhciBVU0VfTkFUSVZFJDEgPSB0eXBlb2YgJFN5bWJvbCA9PSAnZnVuY3Rpb24nO1xudmFyIFFPYmplY3QgPSBfZ2xvYmFsLlFPYmplY3Q7XG4vLyBEb24ndCB1c2Ugc2V0dGVycyBpbiBRdCBTY3JpcHQsIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8xNzNcbnZhciBzZXR0ZXIgPSAhUU9iamVjdCB8fCAhUU9iamVjdFtQUk9UT1RZUEUkMl0gfHwgIVFPYmplY3RbUFJPVE9UWVBFJDJdLmZpbmRDaGlsZDtcblxuLy8gZmFsbGJhY2sgZm9yIG9sZCBBbmRyb2lkLCBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9Njg3XG52YXIgc2V0U3ltYm9sRGVzYyA9IF9kZXNjcmlwdG9ycyAmJiBfZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gX29iamVjdENyZWF0ZShkUCQxKHt9LCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRQJDEodGhpcywgJ2EnLCB7IHZhbHVlOiA3IH0pLmE7IH1cbiAgfSkpLmEgIT0gNztcbn0pID8gZnVuY3Rpb24gKGl0LCBrZXksIEQpIHtcbiAgdmFyIHByb3RvRGVzYyA9IGdPUEQkMShPYmplY3RQcm90byQxLCBrZXkpO1xuICBpZiAocHJvdG9EZXNjKSBkZWxldGUgT2JqZWN0UHJvdG8kMVtrZXldO1xuICBkUCQxKGl0LCBrZXksIEQpO1xuICBpZiAocHJvdG9EZXNjICYmIGl0ICE9PSBPYmplY3RQcm90byQxKSBkUCQxKE9iamVjdFByb3RvJDEsIGtleSwgcHJvdG9EZXNjKTtcbn0gOiBkUCQxO1xuXG52YXIgd3JhcCA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgdmFyIHN5bSA9IEFsbFN5bWJvbHNbdGFnXSA9IF9vYmplY3RDcmVhdGUoJFN5bWJvbFtQUk9UT1RZUEUkMl0pO1xuICBzeW0uX2sgPSB0YWc7XG4gIHJldHVybiBzeW07XG59O1xuXG52YXIgaXNTeW1ib2wgPSBVU0VfTkFUSVZFJDEgJiYgdHlwZW9mICRTeW1ib2wuaXRlcmF0b3IgPT0gJ3N5bWJvbCcgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJztcbn0gOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0IGluc3RhbmNlb2YgJFN5bWJvbDtcbn07XG5cbnZhciAkZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBEKSB7XG4gIGlmIChpdCA9PT0gT2JqZWN0UHJvdG8kMSkgJGRlZmluZVByb3BlcnR5KE9QU3ltYm9scywga2V5LCBEKTtcbiAgX2FuT2JqZWN0KGl0KTtcbiAga2V5ID0gX3RvUHJpbWl0aXZlKGtleSwgdHJ1ZSk7XG4gIF9hbk9iamVjdChEKTtcbiAgaWYgKF9oYXMoQWxsU3ltYm9scywga2V5KSkge1xuICAgIGlmICghRC5lbnVtZXJhYmxlKSB7XG4gICAgICBpZiAoIV9oYXMoaXQsIEhJRERFTikpIGRQJDEoaXQsIEhJRERFTiwgX3Byb3BlcnR5RGVzYygxLCB7fSkpO1xuICAgICAgaXRbSElEREVOXVtrZXldID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKF9oYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKSBpdFtISURERU5dW2tleV0gPSBmYWxzZTtcbiAgICAgIEQgPSBfb2JqZWN0Q3JlYXRlKEQsIHsgZW51bWVyYWJsZTogX3Byb3BlcnR5RGVzYygwLCBmYWxzZSkgfSk7XG4gICAgfSByZXR1cm4gc2V0U3ltYm9sRGVzYyhpdCwga2V5LCBEKTtcbiAgfSByZXR1cm4gZFAkMShpdCwga2V5LCBEKTtcbn07XG52YXIgJGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKGl0LCBQKSB7XG4gIF9hbk9iamVjdChpdCk7XG4gIHZhciBrZXlzID0gX2VudW1LZXlzKFAgPSBfdG9Jb2JqZWN0KFApKTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbCA9IGtleXMubGVuZ3RoO1xuICB2YXIga2V5O1xuICB3aGlsZSAobCA+IGkpICRkZWZpbmVQcm9wZXJ0eShpdCwga2V5ID0ga2V5c1tpKytdLCBQW2tleV0pO1xuICByZXR1cm4gaXQ7XG59O1xudmFyICRjcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaXQsIFApIHtcbiAgcmV0dXJuIFAgPT09IHVuZGVmaW5lZCA/IF9vYmplY3RDcmVhdGUoaXQpIDogJGRlZmluZVByb3BlcnRpZXMoX29iamVjdENyZWF0ZShpdCksIFApO1xufTtcbnZhciAkcHJvcGVydHlJc0VudW1lcmFibGUgPSBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShrZXkpIHtcbiAgdmFyIEUgPSBpc0VudW0uY2FsbCh0aGlzLCBrZXkgPSBfdG9QcmltaXRpdmUoa2V5LCB0cnVlKSk7XG4gIGlmICh0aGlzID09PSBPYmplY3RQcm90byQxICYmIF9oYXMoQWxsU3ltYm9scywga2V5KSAmJiAhX2hhcyhPUFN5bWJvbHMsIGtleSkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIEUgfHwgIV9oYXModGhpcywga2V5KSB8fCAhX2hhcyhBbGxTeW1ib2xzLCBrZXkpIHx8IF9oYXModGhpcywgSElEREVOKSAmJiB0aGlzW0hJRERFTl1ba2V5XSA/IEUgOiB0cnVlO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJDEgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSkge1xuICBpdCA9IF90b0lvYmplY3QoaXQpO1xuICBrZXkgPSBfdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcbiAgaWYgKGl0ID09PSBPYmplY3RQcm90byQxICYmIF9oYXMoQWxsU3ltYm9scywga2V5KSAmJiAhX2hhcyhPUFN5bWJvbHMsIGtleSkpIHJldHVybjtcbiAgdmFyIEQgPSBnT1BEJDEoaXQsIGtleSk7XG4gIGlmIChEICYmIF9oYXMoQWxsU3ltYm9scywga2V5KSAmJiAhKF9oYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKSkgRC5lbnVtZXJhYmxlID0gdHJ1ZTtcbiAgcmV0dXJuIEQ7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCkge1xuICB2YXIgbmFtZXMgPSBnT1BOJDEoX3RvSW9iamVjdChpdCkpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBpID0gMDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIHtcbiAgICBpZiAoIV9oYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYga2V5ICE9IEhJRERFTiAmJiBrZXkgIT0gTUVUQSkgcmVzdWx0LnB1c2goa2V5KTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSB7XG4gIHZhciBJU19PUCA9IGl0ID09PSBPYmplY3RQcm90byQxO1xuICB2YXIgbmFtZXMgPSBnT1BOJDEoSVNfT1AgPyBPUFN5bWJvbHMgOiBfdG9Jb2JqZWN0KGl0KSk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGkgPSAwO1xuICB2YXIga2V5O1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkge1xuICAgIGlmIChfaGFzKEFsbFN5bWJvbHMsIGtleSA9IG5hbWVzW2krK10pICYmIChJU19PUCA/IF9oYXMoT2JqZWN0UHJvdG8kMSwga2V5KSA6IHRydWUpKSByZXN1bHQucHVzaChBbGxTeW1ib2xzW2tleV0pO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyAxOS40LjEuMSBTeW1ib2woW2Rlc2NyaXB0aW9uXSlcbmlmICghVVNFX05BVElWRSQxKSB7XG4gICRTeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiAkU3ltYm9sKSB0aHJvdyBUeXBlRXJyb3IoJ1N5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciEnKTtcbiAgICB2YXIgdGFnID0gX3VpZChhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7XG4gICAgdmFyICRzZXQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh0aGlzID09PSBPYmplY3RQcm90byQxKSAkc2V0LmNhbGwoT1BTeW1ib2xzLCB2YWx1ZSk7XG4gICAgICBpZiAoX2hhcyh0aGlzLCBISURERU4pICYmIF9oYXModGhpc1tISURERU5dLCB0YWcpKSB0aGlzW0hJRERFTl1bdGFnXSA9IGZhbHNlO1xuICAgICAgc2V0U3ltYm9sRGVzYyh0aGlzLCB0YWcsIF9wcm9wZXJ0eURlc2MoMSwgdmFsdWUpKTtcbiAgICB9O1xuICAgIGlmIChfZGVzY3JpcHRvcnMgJiYgc2V0dGVyKSBzZXRTeW1ib2xEZXNjKE9iamVjdFByb3RvJDEsIHRhZywgeyBjb25maWd1cmFibGU6IHRydWUsIHNldDogJHNldCB9KTtcbiAgICByZXR1cm4gd3JhcCh0YWcpO1xuICB9O1xuICBfcmVkZWZpbmUoJFN5bWJvbFtQUk9UT1RZUEUkMl0sICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9rO1xuICB9KTtcblxuICBfb2JqZWN0R29wZC5mID0gJGdldE93blByb3BlcnR5RGVzY3JpcHRvciQxO1xuICBfb2JqZWN0RHAuZiA9ICRkZWZpbmVQcm9wZXJ0eTtcbiAgX29iamVjdEdvcG4uZiA9IF9vYmplY3RHb3BuRXh0LmYgPSAkZ2V0T3duUHJvcGVydHlOYW1lcztcbiAgX29iamVjdFBpZS5mID0gJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuICBfb2JqZWN0R29wcy5mID0gJGdldE93blByb3BlcnR5U3ltYm9scztcblxuICBpZiAoX2Rlc2NyaXB0b3JzICYmICFfbGlicmFyeSkge1xuICAgIF9yZWRlZmluZShPYmplY3RQcm90byQxLCAncHJvcGVydHlJc0VudW1lcmFibGUnLCAkcHJvcGVydHlJc0VudW1lcmFibGUsIHRydWUpO1xuICB9XG5cbiAgX3drc0V4dC5mID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gd3JhcChfd2tzKG5hbWUpKTtcbiAgfTtcbn1cblxuX2V4cG9ydChfZXhwb3J0LkcgKyBfZXhwb3J0LlcgKyBfZXhwb3J0LkYgKiAhVVNFX05BVElWRSQxLCB7IFN5bWJvbDogJFN5bWJvbCB9KTtcblxuZm9yICh2YXIgZXM2U3ltYm9scyA9IChcbiAgLy8gMTkuNC4yLjIsIDE5LjQuMi4zLCAxOS40LjIuNCwgMTkuNC4yLjYsIDE5LjQuMi44LCAxOS40LjIuOSwgMTkuNC4yLjEwLCAxOS40LjIuMTEsIDE5LjQuMi4xMiwgMTkuNC4yLjEzLCAxOS40LjIuMTRcbiAgJ2hhc0luc3RhbmNlLGlzQ29uY2F0U3ByZWFkYWJsZSxpdGVyYXRvcixtYXRjaCxyZXBsYWNlLHNlYXJjaCxzcGVjaWVzLHNwbGl0LHRvUHJpbWl0aXZlLHRvU3RyaW5nVGFnLHVuc2NvcGFibGVzJ1xuKS5zcGxpdCgnLCcpLCBqID0gMDsgZXM2U3ltYm9scy5sZW5ndGggPiBqOylfd2tzKGVzNlN5bWJvbHNbaisrXSk7XG5cbmZvciAodmFyIHdlbGxLbm93blN5bWJvbHMgPSBfb2JqZWN0S2V5cyhfd2tzLnN0b3JlKSwgayA9IDA7IHdlbGxLbm93blN5bWJvbHMubGVuZ3RoID4gazspIF93a3NEZWZpbmUod2VsbEtub3duU3ltYm9sc1trKytdKTtcblxuX2V4cG9ydChfZXhwb3J0LlMgKyBfZXhwb3J0LkYgKiAhVVNFX05BVElWRSQxLCAnU3ltYm9sJywge1xuICAvLyAxOS40LjIuMSBTeW1ib2wuZm9yKGtleSlcbiAgJ2Zvcic6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gX2hhcyhTeW1ib2xSZWdpc3RyeSwga2V5ICs9ICcnKVxuICAgICAgPyBTeW1ib2xSZWdpc3RyeVtrZXldXG4gICAgICA6IFN5bWJvbFJlZ2lzdHJ5W2tleV0gPSAkU3ltYm9sKGtleSk7XG4gIH0sXG4gIC8vIDE5LjQuMi41IFN5bWJvbC5rZXlGb3Ioc3ltKVxuICBrZXlGb3I6IGZ1bmN0aW9uIGtleUZvcihzeW0pIHtcbiAgICBpZiAoIWlzU3ltYm9sKHN5bSkpIHRocm93IFR5cGVFcnJvcihzeW0gKyAnIGlzIG5vdCBhIHN5bWJvbCEnKTtcbiAgICBmb3IgKHZhciBrZXkgaW4gU3ltYm9sUmVnaXN0cnkpIGlmIChTeW1ib2xSZWdpc3RyeVtrZXldID09PSBzeW0pIHJldHVybiBrZXk7XG4gIH0sXG4gIHVzZVNldHRlcjogZnVuY3Rpb24gKCkgeyBzZXR0ZXIgPSB0cnVlOyB9LFxuICB1c2VTaW1wbGU6IGZ1bmN0aW9uICgpIHsgc2V0dGVyID0gZmFsc2U7IH1cbn0pO1xuXG5fZXhwb3J0KF9leHBvcnQuUyArIF9leHBvcnQuRiAqICFVU0VfTkFUSVZFJDEsICdPYmplY3QnLCB7XG4gIC8vIDE5LjEuMi4yIE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbiAgY3JlYXRlOiAkY3JlYXRlLFxuICAvLyAxOS4xLjIuNCBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcbiAgZGVmaW5lUHJvcGVydHk6ICRkZWZpbmVQcm9wZXJ0eSxcbiAgLy8gMTkuMS4yLjMgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcylcbiAgZGVmaW5lUHJvcGVydGllczogJGRlZmluZVByb3BlcnRpZXMsXG4gIC8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJDEsXG4gIC8vIDE5LjEuMi43IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG4gIGdldE93blByb3BlcnR5TmFtZXM6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzLFxuICAvLyAxOS4xLjIuOCBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKE8pXG4gIGdldE93blByb3BlcnR5U3ltYm9sczogJGdldE93blByb3BlcnR5U3ltYm9sc1xufSk7XG5cbi8vIDI0LjMuMiBKU09OLnN0cmluZ2lmeSh2YWx1ZSBbLCByZXBsYWNlciBbLCBzcGFjZV1dKVxuJEpTT04gJiYgX2V4cG9ydChfZXhwb3J0LlMgKyBfZXhwb3J0LkYgKiAoIVVTRV9OQVRJVkUkMSB8fCBfZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgUyA9ICRTeW1ib2woKTtcbiAgLy8gTVMgRWRnZSBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMge31cbiAgLy8gV2ViS2l0IGNvbnZlcnRzIHN5bWJvbCB2YWx1ZXMgdG8gSlNPTiBhcyBudWxsXG4gIC8vIFY4IHRocm93cyBvbiBib3hlZCBzeW1ib2xzXG4gIHJldHVybiBfc3RyaW5naWZ5KFtTXSkgIT0gJ1tudWxsXScgfHwgX3N0cmluZ2lmeSh7IGE6IFMgfSkgIT0gJ3t9JyB8fCBfc3RyaW5naWZ5KE9iamVjdChTKSkgIT0gJ3t9Jztcbn0pKSwgJ0pTT04nLCB7XG4gIHN0cmluZ2lmeTogZnVuY3Rpb24gc3RyaW5naWZ5KGl0KSB7XG4gICAgdmFyIGFyZ3MgPSBbaXRdO1xuICAgIHZhciBpID0gMTtcbiAgICB2YXIgcmVwbGFjZXIsICRyZXBsYWNlcjtcbiAgICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGkpIGFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgJHJlcGxhY2VyID0gcmVwbGFjZXIgPSBhcmdzWzFdO1xuICAgIGlmICghX2lzT2JqZWN0KHJlcGxhY2VyKSAmJiBpdCA9PT0gdW5kZWZpbmVkIHx8IGlzU3ltYm9sKGl0KSkgcmV0dXJuOyAvLyBJRTggcmV0dXJucyBzdHJpbmcgb24gdW5kZWZpbmVkXG4gICAgaWYgKCFfaXNBcnJheShyZXBsYWNlcikpIHJlcGxhY2VyID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgJHJlcGxhY2VyID09ICdmdW5jdGlvbicpIHZhbHVlID0gJHJlcGxhY2VyLmNhbGwodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICBpZiAoIWlzU3ltYm9sKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgYXJnc1sxXSA9IHJlcGxhY2VyO1xuICAgIHJldHVybiBfc3RyaW5naWZ5LmFwcGx5KCRKU09OLCBhcmdzKTtcbiAgfVxufSk7XG5cbi8vIDE5LjQuMy40IFN5bWJvbC5wcm90b3R5cGVbQEB0b1ByaW1pdGl2ZV0oaGludClcbiRTeW1ib2xbUFJPVE9UWVBFJDJdW1RPX1BSSU1JVElWRV0gfHwgX2hpZGUoJFN5bWJvbFtQUk9UT1RZUEUkMl0sIFRPX1BSSU1JVElWRSwgJFN5bWJvbFtQUk9UT1RZUEUkMl0udmFsdWVPZik7XG4vLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddXG5fc2V0VG9TdHJpbmdUYWcoJFN5bWJvbCwgJ1N5bWJvbCcpO1xuLy8gMjAuMi4xLjkgTWF0aFtAQHRvU3RyaW5nVGFnXVxuX3NldFRvU3RyaW5nVGFnKE1hdGgsICdNYXRoJywgdHJ1ZSk7XG4vLyAyNC4zLjMgSlNPTltAQHRvU3RyaW5nVGFnXVxuX3NldFRvU3RyaW5nVGFnKF9nbG9iYWwuSlNPTiwgJ0pTT04nLCB0cnVlKTtcblxudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IF9jb3JlLk9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMkMSA9IGdldE93blByb3BlcnR5U3ltYm9scztcblxuLy8gMTkuMS4yLjE0IE9iamVjdC5rZXlzKE8pXG5cblxuXG5fb2JqZWN0U2FwKCdrZXlzJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24ga2V5cyhpdCkge1xuICAgIHJldHVybiBfb2JqZWN0S2V5cyhfdG9PYmplY3QoaXQpKTtcbiAgfTtcbn0pO1xuXG52YXIga2V5cyA9IF9jb3JlLk9iamVjdC5rZXlzO1xuXG52YXIga2V5cyQxID0ga2V5cztcblxuLy8gMTkuMS4yLjQgLyAxNS4yLjMuNiBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcbl9leHBvcnQoX2V4cG9ydC5TICsgX2V4cG9ydC5GICogIV9kZXNjcmlwdG9ycywgJ09iamVjdCcsIHsgZGVmaW5lUHJvcGVydHk6IF9vYmplY3REcC5mIH0pO1xuXG52YXIgJE9iamVjdCQxID0gX2NvcmUuT2JqZWN0O1xudmFyIGRlZmluZVByb3BlcnR5JDEgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBkZXNjKSB7XG4gIHJldHVybiAkT2JqZWN0JDEuZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgZGVzYyk7XG59O1xuXG52YXIgZGVmaW5lUHJvcGVydHkkMiA9IGRlZmluZVByb3BlcnR5JDE7XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBkZWZpbmVQcm9wZXJ0eSQyKG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxudmFyIGRlZmluZVByb3BlcnR5JDMgPSBfZGVmaW5lUHJvcGVydHk7XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG5cbiAgICB2YXIgb3duS2V5cyA9IGtleXMkMShzb3VyY2UpO1xuXG4gICAgaWYgKHR5cGVvZiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMkMSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3duS2V5cyA9IG93bktleXMuY29uY2F0KGdldE93blByb3BlcnR5U3ltYm9scyQxKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgICAgcmV0dXJuIGdldE93blByb3BlcnR5RGVzY3JpcHRvciQxKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlO1xuICAgICAgfSkpO1xuICAgIH1cblxuICAgIG93bktleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBkZWZpbmVQcm9wZXJ0eSQzKHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG52YXIgb2JqZWN0U3ByZWFkID0gX29iamVjdFNwcmVhZDtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxudmFyIGNsYXNzQ2FsbENoZWNrID0gX2NsYXNzQ2FsbENoZWNrO1xuXG4vLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5cblxudmFyIGNoZWNrID0gZnVuY3Rpb24gKE8sIHByb3RvKSB7XG4gIF9hbk9iamVjdChPKTtcbiAgaWYgKCFfaXNPYmplY3QocHJvdG8pICYmIHByb3RvICE9PSBudWxsKSB0aHJvdyBUeXBlRXJyb3IocHJvdG8gKyBcIjogY2FuJ3Qgc2V0IGFzIHByb3RvdHlwZSFcIik7XG59O1xudmFyIF9zZXRQcm90byA9IHtcbiAgc2V0OiBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKCdfX3Byb3RvX18nIGluIHt9ID8gLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgIGZ1bmN0aW9uICh0ZXN0LCBidWdneSwgc2V0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZXQgPSBfY3R4KEZ1bmN0aW9uLmNhbGwsIF9vYmplY3RHb3BkLmYoT2JqZWN0LnByb3RvdHlwZSwgJ19fcHJvdG9fXycpLnNldCwgMik7XG4gICAgICAgIHNldCh0ZXN0LCBbXSk7XG4gICAgICAgIGJ1Z2d5ID0gISh0ZXN0IGluc3RhbmNlb2YgQXJyYXkpO1xuICAgICAgfSBjYXRjaCAoZSkgeyBidWdneSA9IHRydWU7IH1cbiAgICAgIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90bykge1xuICAgICAgICBjaGVjayhPLCBwcm90byk7XG4gICAgICAgIGlmIChidWdneSkgTy5fX3Byb3RvX18gPSBwcm90bztcbiAgICAgICAgZWxzZSBzZXQoTywgcHJvdG8pO1xuICAgICAgICByZXR1cm4gTztcbiAgICAgIH07XG4gICAgfSh7fSwgZmFsc2UpIDogdW5kZWZpbmVkKSxcbiAgY2hlY2s6IGNoZWNrXG59O1xuXG4vLyAxOS4xLjMuMTkgT2JqZWN0LnNldFByb3RvdHlwZU9mKE8sIHByb3RvKVxuXG5fZXhwb3J0KF9leHBvcnQuUywgJ09iamVjdCcsIHsgc2V0UHJvdG90eXBlT2Y6IF9zZXRQcm90by5zZXQgfSk7XG5cbnZhciBzZXRQcm90b3R5cGVPZiA9IF9jb3JlLk9iamVjdC5zZXRQcm90b3R5cGVPZjtcblxudmFyIHNldFByb3RvdHlwZU9mJDEgPSBzZXRQcm90b3R5cGVPZjtcblxudmFyIHNldFByb3RvdHlwZU9mJDIgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IF9zZXRQcm90b3R5cGVPZiA9IHNldFByb3RvdHlwZU9mJDEgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgcmV0dXJuIG87XG4gIH07XG5cbiAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfc2V0UHJvdG90eXBlT2Y7XG59KTtcblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7XG4gIH1cblxuICBzZXRQcm90b3R5cGVPZiQyKHN1YkNsYXNzLnByb3RvdHlwZSwgc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSk7XG4gIGlmIChzdXBlckNsYXNzKSBzZXRQcm90b3R5cGVPZiQyKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbn1cblxudmFyIGluaGVyaXRzID0gX2luaGVyaXRzO1xuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcblxuICAgIGRlZmluZVByb3BlcnR5JDIodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5cbnZhciBjcmVhdGVDbGFzcyA9IF9jcmVhdGVDbGFzcztcblxudmFyIGl0ZXJhdG9yID0gX3drc0V4dC5mKCdpdGVyYXRvcicpO1xuXG52YXIgaXRlcmF0b3IkMSA9IGl0ZXJhdG9yO1xuXG5fd2tzRGVmaW5lKCdhc3luY0l0ZXJhdG9yJyk7XG5cbl93a3NEZWZpbmUoJ29ic2VydmFibGUnKTtcblxudmFyIHN5bWJvbCA9IF9jb3JlLlN5bWJvbDtcblxudmFyIHN5bWJvbCQxID0gc3ltYm9sO1xuXG52YXIgX3R5cGVvZl8xID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuZnVuY3Rpb24gX3R5cGVvZjIob2JqKSB7IGlmICh0eXBlb2Ygc3ltYm9sJDEgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgaXRlcmF0b3IkMSA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mMiA9IGZ1bmN0aW9uIF90eXBlb2YyKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZjIgPSBmdW5jdGlvbiBfdHlwZW9mMihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygc3ltYm9sJDEgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IHN5bWJvbCQxICYmIG9iaiAhPT0gc3ltYm9sJDEucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2YyKG9iaik7IH1cblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgaWYgKHR5cGVvZiBzeW1ib2wkMSA9PT0gXCJmdW5jdGlvblwiICYmIF90eXBlb2YyKGl0ZXJhdG9yJDEpID09PSBcInN5bWJvbFwiKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICAgIHJldHVybiBfdHlwZW9mMihvYmopO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIHN5bWJvbCQxID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBzeW1ib2wkMSAmJiBvYmogIT09IHN5bWJvbCQxLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiBfdHlwZW9mMihvYmopO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX3R5cGVvZihvYmopO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF90eXBlb2Y7XG59KTtcblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7XG4gIGlmIChzZWxmID09PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIH1cblxuICByZXR1cm4gc2VsZjtcbn1cblxudmFyIGFzc2VydFRoaXNJbml0aWFsaXplZCA9IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQ7XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHtcbiAgaWYgKGNhbGwgJiYgKF90eXBlb2ZfMShjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkge1xuICAgIHJldHVybiBjYWxsO1xuICB9XG5cbiAgcmV0dXJuIGFzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTtcbn1cblxudmFyIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjtcblxuLy8gMTkuMS4yLjkgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG5cblxuXG5fb2JqZWN0U2FwKCdnZXRQcm90b3R5cGVPZicsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKGl0KSB7XG4gICAgcmV0dXJuIF9vYmplY3RHcG8oX3RvT2JqZWN0KGl0KSk7XG4gIH07XG59KTtcblxudmFyIGdldFByb3RvdHlwZU9mID0gX2NvcmUuT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuXG52YXIgZ2V0UHJvdG90eXBlT2YkMSA9IGdldFByb3RvdHlwZU9mO1xuXG52YXIgZ2V0UHJvdG90eXBlT2YkMiA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gX2dldFByb3RvdHlwZU9mID0gZ2V0UHJvdG90eXBlT2YkMSB8fCBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICAgIHJldHVybiBvLl9fcHJvdG9fXztcbiAgfTtcblxuICByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9nZXRQcm90b3R5cGVPZjtcbn0pO1xuXG52YXIgZXh0ZW5kID0gZnVuY3Rpb24gZXh0ZW5kKG9iamVjdCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgZXh0ZW5zaW9ucyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgZXh0ZW5zaW9uc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICAvLyAkLmV4dGVuZCBhbHRlcm5hdGl2ZSwgLi4uIGlzIHRoZSBzcHJlYWQgb3BlcmF0b3IuXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBleHRlbnNpb25zLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zW19pXTtcbiAgICAvLyBjb25zb2xlLmxvZyhleHRlbnNpb24pO1xuICAgIC8vIGNvbnNvbGUubG9nKHR5cGVvZiBleHRlbnNpb24pO1xuICAgIGlmICghZXh0ZW5zaW9uKSBjb250aW51ZTsgLy8gSWdub3JlIG51bGwgYW5kIHVuZGVmaW5lZCBvYmplY3RzIGFuZCBwYXJhbWV0ZXJzLlxuXG4gICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvciA9IGZhbHNlO1xuICAgIHZhciBfaXRlcmF0b3JFcnJvciA9IHVuZGVmaW5lZDtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhleHRlbnNpb24pW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXA7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IChfc3RlcCA9IF9pdGVyYXRvci5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZSkge1xuICAgICAgICB2YXIgcHJvcCA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICAgIC8vIERvIG5vdCB0cmF2ZXJzZSB0aGUgcHJvdG90eXBlIGNoYWluLlxuICAgICAgICBpZiAob2JqZWN0W3Byb3BdICE9PSB1bmRlZmluZWQgJiYgZXh0ZW5zaW9uW3Byb3BdICYmIG9iamVjdFtwcm9wXS50b1N0cmluZygpID09PSAnW29iamVjdCBPYmplY3RdJyAmJiBleHRlbnNpb25bcHJvcF0udG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgICAgICAvLyBHb2VzIGRlZXAgb25seSBpZiBvYmplY3RbcHJvcF0gYW5kIGV4dGVuc2lvbltwcm9wXSBhcmUgYm90aCBvYmplY3RzICFcbiAgICAgICAgICBpZiAob2JqZWN0W3Byb3BdLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIGV4dGVuZChvYmplY3RbcHJvcF0sIGV4dGVuc2lvbltwcm9wXSk7XG4gICAgICAgIH0gZWxzZSBvYmplY3RbcHJvcF0gPSB0eXBlb2Ygb2JqZWN0W3Byb3BdID09PSAndW5kZWZpbmVkJyA/IGV4dGVuc2lvbltwcm9wXSA6IG9iamVjdFtwcm9wXTtcblxuICAgICAgICBpZiAodHlwZW9mIG9iamVjdFtwcm9wXSA9PT0gJ3VuZGVmaW5lZCcgJiYgQXJyYXkuaXNBcnJheShleHRlbnNpb25bcHJvcF0pKSBvYmplY3RbcHJvcF0gPSBleHRlbnNpb25bcHJvcF0uc2xpY2UoKTsgLy8gQWRkIHZhbHVlcyB0aGF0IGRvIG5vdCBhbHJlYWR5IGV4aXN0LlxuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb2JqZWN0W3Byb3BdID09PSAndW5kZWZpbmVkJyAmJiBBcnJheS5pc0FycmF5KGV4dGVuc2lvbltwcm9wXSkpIG9iamVjdFtwcm9wXSA9IGV4dGVuc2lvbltwcm9wXTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgIF9pdGVyYXRvckVycm9yID0gZXJyO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gJiYgX2l0ZXJhdG9yLnJldHVybiAhPSBudWxsKSB7XG4gICAgICAgICAgX2l0ZXJhdG9yLnJldHVybigpO1xuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmplY3Q7XG59O1xuXG52YXIgaW5zdHJ1Y3QgPSBmdW5jdGlvbiBpbnN0cnVjdChhcnJheSwgaW5zdEFycmF5KSB7XG4gIHZhciB0ZW1wT2JqZWN0ID0ge307XG5cbiAgZm9yICh2YXIgaSA9IDAsIG1heCA9IGluc3RBcnJheS5sZW5ndGg7IGkgPCBtYXg7IGkrKykge1xuICAgIHZhciBndWlkZSA9IGluc3RBcnJheVtpXTtcbiAgICB0ZW1wT2JqZWN0W2d1aWRlXSA9IGFycmF5W2ldO1xuICB9XG5cbiAgcmV0dXJuIHRlbXBPYmplY3Q7XG59O1xudmFyIHRyYW5zZm9ybURhdGEgPSBmdW5jdGlvbiB0cmFuc2Zvcm1EYXRhKG9iamVjdCwgaW5zdHJ1Y3Rpb25zKSB7XG4gIGZvciAodmFyIGtleSBpbiBpbnN0cnVjdGlvbnMpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3Rba2V5XSkpIG9iamVjdFtrZXldID0gaW5zdHJ1Y3Qob2JqZWN0W2tleV0sIGluc3RydWN0aW9uc1trZXldKTtlbHNlIGlmIChvYmplY3Rba2V5XSBpbnN0YW5jZW9mIE9iamVjdCAmJiAhQXJyYXkuaXNBcnJheShpbnN0cnVjdGlvbnNba2V5XSkpIG9iamVjdFtrZXldID0gdHJhbnNmb3JtRGF0YShvYmplY3Rba2V5XSwgaW5zdHJ1Y3Rpb25zW2tleV0pO1xuICB9XG5cbiAgcmV0dXJuIG9iamVjdDtcbn07XG52YXIgdG9BcnJheSA9IGZ1bmN0aW9uIHRvQXJyYXkob2JqZWN0LCBpbnN0cnVjdGlvbikge1xuICB2YXIgdGVtcEFycmF5ID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDAsIG1heCA9IGluc3RydWN0aW9uLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgdmFyIGd1aWRlID0gaW5zdHJ1Y3Rpb25baV07XG4gICAgdGVtcEFycmF5W2ldID0gb2JqZWN0W2d1aWRlXTtcbiAgfVxuXG4gIHJldHVybiB0ZW1wQXJyYXk7XG59O1xuXG4vLyBQb2x5ZmlsbHNcblxuaWYgKCBOdW1iZXIuRVBTSUxPTiA9PT0gdW5kZWZpbmVkICkge1xuXG5cdE51bWJlci5FUFNJTE9OID0gTWF0aC5wb3coIDIsIC0gNTIgKTtcblxufVxuXG5pZiAoIE51bWJlci5pc0ludGVnZXIgPT09IHVuZGVmaW5lZCApIHtcblxuXHQvLyBNaXNzaW5nIGluIElFXG5cdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL051bWJlci9pc0ludGVnZXJcblxuXHROdW1iZXIuaXNJbnRlZ2VyID0gZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKCB2YWx1ZSApICYmIE1hdGguZmxvb3IoIHZhbHVlICkgPT09IHZhbHVlO1xuXG5cdH07XG5cbn1cblxuLy9cblxuaWYgKCBNYXRoLnNpZ24gPT09IHVuZGVmaW5lZCApIHtcblxuXHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9NYXRoL3NpZ25cblxuXHRNYXRoLnNpZ24gPSBmdW5jdGlvbiAoIHggKSB7XG5cblx0XHRyZXR1cm4gKCB4IDwgMCApID8gLSAxIDogKCB4ID4gMCApID8gMSA6ICsgeDtcblxuXHR9O1xuXG59XG5cbmlmICggJ25hbWUnIGluIEZ1bmN0aW9uLnByb3RvdHlwZSA9PT0gZmFsc2UgKSB7XG5cblx0Ly8gTWlzc2luZyBpbiBJRVxuXHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9GdW5jdGlvbi9uYW1lXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCBGdW5jdGlvbi5wcm90b3R5cGUsICduYW1lJywge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnRvU3RyaW5nKCkubWF0Y2goIC9eXFxzKmZ1bmN0aW9uXFxzKihbXlxcKFxcc10qKS8gKVsgMSBdO1xuXG5cdFx0fVxuXG5cdH0gKTtcblxufVxuXG5pZiAoIE9iamVjdC5hc3NpZ24gPT09IHVuZGVmaW5lZCApIHtcblxuXHQvLyBNaXNzaW5nIGluIElFXG5cdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ25cblxuXHQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdE9iamVjdC5hc3NpZ24gPSBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCB8fCB0YXJnZXQgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvciggJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgb3V0cHV0ID0gT2JqZWN0KCB0YXJnZXQgKTtcblxuXHRcdFx0Zm9yICggdmFyIGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCArKyApIHtcblxuXHRcdFx0XHR2YXIgc291cmNlID0gYXJndW1lbnRzWyBpbmRleCBdO1xuXG5cdFx0XHRcdGlmICggc291cmNlICE9PSB1bmRlZmluZWQgJiYgc291cmNlICE9PSBudWxsICkge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIG5leHRLZXkgaW4gc291cmNlICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCggc291cmNlLCBuZXh0S2V5ICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0b3V0cHV0WyBuZXh0S2V5IF0gPSBzb3VyY2VbIG5leHRLZXkgXTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb3V0cHV0O1xuXG5cdFx0fTtcblxuXHR9ICkoKTtcblxufVxuXG4vKipcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvZXZlbnRkaXNwYXRjaGVyLmpzL1xuICovXG5cbmZ1bmN0aW9uIEV2ZW50RGlzcGF0Y2hlcigpIHt9XG5cbk9iamVjdC5hc3NpZ24oIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUsIHtcblxuXHRhZGRFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAoIHR5cGUsIGxpc3RlbmVyICkge1xuXG5cdFx0aWYgKCB0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xuXG5cdFx0dmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcblxuXHRcdGlmICggbGlzdGVuZXJzWyB0eXBlIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bGlzdGVuZXJzWyB0eXBlIF0gPSBbXTtcblxuXHRcdH1cblxuXHRcdGlmICggbGlzdGVuZXJzWyB0eXBlIF0uaW5kZXhPZiggbGlzdGVuZXIgKSA9PT0gLSAxICkge1xuXG5cdFx0XHRsaXN0ZW5lcnNbIHR5cGUgXS5wdXNoKCBsaXN0ZW5lciApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0aGFzRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gKCB0eXBlLCBsaXN0ZW5lciApIHtcblxuXHRcdGlmICggdGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSByZXR1cm4gZmFsc2U7XG5cblx0XHR2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xuXG5cdFx0cmV0dXJuIGxpc3RlbmVyc1sgdHlwZSBdICE9PSB1bmRlZmluZWQgJiYgbGlzdGVuZXJzWyB0eXBlIF0uaW5kZXhPZiggbGlzdGVuZXIgKSAhPT0gLSAxO1xuXG5cdH0sXG5cblx0cmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gKCB0eXBlLCBsaXN0ZW5lciApIHtcblxuXHRcdGlmICggdGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSByZXR1cm47XG5cblx0XHR2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xuXHRcdHZhciBsaXN0ZW5lckFycmF5ID0gbGlzdGVuZXJzWyB0eXBlIF07XG5cblx0XHRpZiAoIGxpc3RlbmVyQXJyYXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIGluZGV4ID0gbGlzdGVuZXJBcnJheS5pbmRleE9mKCBsaXN0ZW5lciApO1xuXG5cdFx0XHRpZiAoIGluZGV4ICE9PSAtIDEgKSB7XG5cblx0XHRcdFx0bGlzdGVuZXJBcnJheS5zcGxpY2UoIGluZGV4LCAxICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdGRpc3BhdGNoRXZlbnQ6IGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRpZiAoIHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0dmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcblx0XHR2YXIgbGlzdGVuZXJBcnJheSA9IGxpc3RlbmVyc1sgZXZlbnQudHlwZSBdO1xuXG5cdFx0aWYgKCBsaXN0ZW5lckFycmF5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGV2ZW50LnRhcmdldCA9IHRoaXM7XG5cblx0XHRcdHZhciBhcnJheSA9IGxpc3RlbmVyQXJyYXkuc2xpY2UoIDAgKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRhcnJheVsgaSBdLmNhbGwoIHRoaXMsIGV2ZW50ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxudmFyIFJFVklTSU9OID0gJzkyJztcbnZhciBNT1VTRSA9IHsgTEVGVDogMCwgTUlERExFOiAxLCBSSUdIVDogMiB9O1xudmFyIEN1bGxGYWNlTm9uZSA9IDA7XG52YXIgQ3VsbEZhY2VCYWNrID0gMTtcbnZhciBDdWxsRmFjZUZyb250ID0gMjtcbnZhciBQQ0ZTaGFkb3dNYXAgPSAxO1xudmFyIFBDRlNvZnRTaGFkb3dNYXAgPSAyO1xudmFyIEZyb250U2lkZSA9IDA7XG52YXIgQmFja1NpZGUgPSAxO1xudmFyIERvdWJsZVNpZGUgPSAyO1xudmFyIEZsYXRTaGFkaW5nID0gMTtcbnZhciBOb0NvbG9ycyA9IDA7XG52YXIgRmFjZUNvbG9ycyA9IDE7XG52YXIgVmVydGV4Q29sb3JzID0gMjtcbnZhciBOb0JsZW5kaW5nID0gMDtcbnZhciBOb3JtYWxCbGVuZGluZyA9IDE7XG52YXIgQWRkaXRpdmVCbGVuZGluZyA9IDI7XG52YXIgU3VidHJhY3RpdmVCbGVuZGluZyA9IDM7XG52YXIgTXVsdGlwbHlCbGVuZGluZyA9IDQ7XG52YXIgQ3VzdG9tQmxlbmRpbmcgPSA1O1xudmFyIEFkZEVxdWF0aW9uID0gMTAwO1xudmFyIFN1YnRyYWN0RXF1YXRpb24gPSAxMDE7XG52YXIgUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24gPSAxMDI7XG52YXIgTWluRXF1YXRpb24gPSAxMDM7XG52YXIgTWF4RXF1YXRpb24gPSAxMDQ7XG52YXIgWmVyb0ZhY3RvciA9IDIwMDtcbnZhciBPbmVGYWN0b3IgPSAyMDE7XG52YXIgU3JjQ29sb3JGYWN0b3IgPSAyMDI7XG52YXIgT25lTWludXNTcmNDb2xvckZhY3RvciA9IDIwMztcbnZhciBTcmNBbHBoYUZhY3RvciA9IDIwNDtcbnZhciBPbmVNaW51c1NyY0FscGhhRmFjdG9yID0gMjA1O1xudmFyIERzdEFscGhhRmFjdG9yID0gMjA2O1xudmFyIE9uZU1pbnVzRHN0QWxwaGFGYWN0b3IgPSAyMDc7XG52YXIgRHN0Q29sb3JGYWN0b3IgPSAyMDg7XG52YXIgT25lTWludXNEc3RDb2xvckZhY3RvciA9IDIwOTtcbnZhciBTcmNBbHBoYVNhdHVyYXRlRmFjdG9yID0gMjEwO1xudmFyIE5ldmVyRGVwdGggPSAwO1xudmFyIEFsd2F5c0RlcHRoID0gMTtcbnZhciBMZXNzRGVwdGggPSAyO1xudmFyIExlc3NFcXVhbERlcHRoID0gMztcbnZhciBFcXVhbERlcHRoID0gNDtcbnZhciBHcmVhdGVyRXF1YWxEZXB0aCA9IDU7XG52YXIgR3JlYXRlckRlcHRoID0gNjtcbnZhciBOb3RFcXVhbERlcHRoID0gNztcbnZhciBNdWx0aXBseU9wZXJhdGlvbiA9IDA7XG52YXIgTWl4T3BlcmF0aW9uID0gMTtcbnZhciBBZGRPcGVyYXRpb24gPSAyO1xudmFyIE5vVG9uZU1hcHBpbmcgPSAwO1xudmFyIExpbmVhclRvbmVNYXBwaW5nID0gMTtcbnZhciBSZWluaGFyZFRvbmVNYXBwaW5nID0gMjtcbnZhciBVbmNoYXJ0ZWQyVG9uZU1hcHBpbmcgPSAzO1xudmFyIENpbmVvblRvbmVNYXBwaW5nID0gNDtcbnZhciBVVk1hcHBpbmcgPSAzMDA7XG52YXIgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nID0gMzAxO1xudmFyIEN1YmVSZWZyYWN0aW9uTWFwcGluZyA9IDMwMjtcbnZhciBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyA9IDMwMztcbnZhciBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyA9IDMwNDtcbnZhciBTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZyA9IDMwNTtcbnZhciBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZyA9IDMwNjtcbnZhciBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZyA9IDMwNztcbnZhciBSZXBlYXRXcmFwcGluZyA9IDEwMDA7XG52YXIgQ2xhbXBUb0VkZ2VXcmFwcGluZyA9IDEwMDE7XG52YXIgTWlycm9yZWRSZXBlYXRXcmFwcGluZyA9IDEwMDI7XG52YXIgTmVhcmVzdEZpbHRlciA9IDEwMDM7XG52YXIgTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIgPSAxMDA0O1xudmFyIE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXIgPSAxMDA1O1xudmFyIExpbmVhckZpbHRlciA9IDEwMDY7XG52YXIgTGluZWFyTWlwTWFwTmVhcmVzdEZpbHRlciA9IDEwMDc7XG52YXIgTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyID0gMTAwODtcbnZhciBVbnNpZ25lZEJ5dGVUeXBlID0gMTAwOTtcbnZhciBCeXRlVHlwZSA9IDEwMTA7XG52YXIgU2hvcnRUeXBlID0gMTAxMTtcbnZhciBVbnNpZ25lZFNob3J0VHlwZSA9IDEwMTI7XG52YXIgSW50VHlwZSA9IDEwMTM7XG52YXIgVW5zaWduZWRJbnRUeXBlID0gMTAxNDtcbnZhciBGbG9hdFR5cGUgPSAxMDE1O1xudmFyIEhhbGZGbG9hdFR5cGUgPSAxMDE2O1xudmFyIFVuc2lnbmVkU2hvcnQ0NDQ0VHlwZSA9IDEwMTc7XG52YXIgVW5zaWduZWRTaG9ydDU1NTFUeXBlID0gMTAxODtcbnZhciBVbnNpZ25lZFNob3J0NTY1VHlwZSA9IDEwMTk7XG52YXIgVW5zaWduZWRJbnQyNDhUeXBlID0gMTAyMDtcbnZhciBBbHBoYUZvcm1hdCA9IDEwMjE7XG52YXIgUkdCRm9ybWF0ID0gMTAyMjtcbnZhciBSR0JBRm9ybWF0ID0gMTAyMztcbnZhciBMdW1pbmFuY2VGb3JtYXQgPSAxMDI0O1xudmFyIEx1bWluYW5jZUFscGhhRm9ybWF0ID0gMTAyNTtcbnZhciBEZXB0aEZvcm1hdCA9IDEwMjY7XG52YXIgRGVwdGhTdGVuY2lsRm9ybWF0ID0gMTAyNztcbnZhciBSR0JfUzNUQ19EWFQxX0Zvcm1hdCA9IDMzNzc2O1xudmFyIFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCA9IDMzNzc3O1xudmFyIFJHQkFfUzNUQ19EWFQzX0Zvcm1hdCA9IDMzNzc4O1xudmFyIFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdCA9IDMzNzc5O1xudmFyIFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0ID0gMzU4NDA7XG52YXIgUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQgPSAzNTg0MTtcbnZhciBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgPSAzNTg0MjtcbnZhciBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQgPSAzNTg0MztcbnZhciBSR0JfRVRDMV9Gb3JtYXQgPSAzNjE5NjtcbnZhciBSR0JBX0FTVENfNHg0X0Zvcm1hdCA9IDM3ODA4O1xudmFyIFJHQkFfQVNUQ181eDRfRm9ybWF0ID0gMzc4MDk7XG52YXIgUkdCQV9BU1RDXzV4NV9Gb3JtYXQgPSAzNzgxMDtcbnZhciBSR0JBX0FTVENfNng1X0Zvcm1hdCA9IDM3ODExO1xudmFyIFJHQkFfQVNUQ182eDZfRm9ybWF0ID0gMzc4MTI7XG52YXIgUkdCQV9BU1RDXzh4NV9Gb3JtYXQgPSAzNzgxMztcbnZhciBSR0JBX0FTVENfOHg2X0Zvcm1hdCA9IDM3ODE0O1xudmFyIFJHQkFfQVNUQ184eDhfRm9ybWF0ID0gMzc4MTU7XG52YXIgUkdCQV9BU1RDXzEweDVfRm9ybWF0ID0gMzc4MTY7XG52YXIgUkdCQV9BU1RDXzEweDZfRm9ybWF0ID0gMzc4MTc7XG52YXIgUkdCQV9BU1RDXzEweDhfRm9ybWF0ID0gMzc4MTg7XG52YXIgUkdCQV9BU1RDXzEweDEwX0Zvcm1hdCA9IDM3ODE5O1xudmFyIFJHQkFfQVNUQ18xMngxMF9Gb3JtYXQgPSAzNzgyMDtcbnZhciBSR0JBX0FTVENfMTJ4MTJfRm9ybWF0ID0gMzc4MjE7XG52YXIgTG9vcE9uY2UgPSAyMjAwO1xudmFyIExvb3BSZXBlYXQgPSAyMjAxO1xudmFyIExvb3BQaW5nUG9uZyA9IDIyMDI7XG52YXIgSW50ZXJwb2xhdGVEaXNjcmV0ZSA9IDIzMDA7XG52YXIgSW50ZXJwb2xhdGVMaW5lYXIgPSAyMzAxO1xudmFyIEludGVycG9sYXRlU21vb3RoID0gMjMwMjtcbnZhciBaZXJvQ3VydmF0dXJlRW5kaW5nID0gMjQwMDtcbnZhciBaZXJvU2xvcGVFbmRpbmcgPSAyNDAxO1xudmFyIFdyYXBBcm91bmRFbmRpbmcgPSAyNDAyO1xudmFyIFRyaWFuZ2xlc0RyYXdNb2RlID0gMDtcbnZhciBUcmlhbmdsZVN0cmlwRHJhd01vZGUgPSAxO1xudmFyIFRyaWFuZ2xlRmFuRHJhd01vZGUgPSAyO1xudmFyIExpbmVhckVuY29kaW5nID0gMzAwMDtcbnZhciBzUkdCRW5jb2RpbmcgPSAzMDAxO1xudmFyIEdhbW1hRW5jb2RpbmcgPSAzMDA3O1xudmFyIFJHQkVFbmNvZGluZyA9IDMwMDI7XG52YXIgUkdCTTdFbmNvZGluZyA9IDMwMDQ7XG52YXIgUkdCTTE2RW5jb2RpbmcgPSAzMDA1O1xudmFyIFJHQkRFbmNvZGluZyA9IDMwMDY7XG52YXIgQmFzaWNEZXB0aFBhY2tpbmcgPSAzMjAwO1xudmFyIFJHQkFEZXB0aFBhY2tpbmcgPSAzMjAxO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbnZhciBfTWF0aCA9IHtcblxuXHRERUcyUkFEOiBNYXRoLlBJIC8gMTgwLFxuXHRSQUQyREVHOiAxODAgLyBNYXRoLlBJLFxuXG5cdGdlbmVyYXRlVVVJRDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEwNTAzNC9ob3ctdG8tY3JlYXRlLWEtZ3VpZC11dWlkLWluLWphdmFzY3JpcHQvMjE5NjMxMzYjMjE5NjMxMzZcblxuXHRcdHZhciBsdXQgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDI1NjsgaSArKyApIHtcblxuXHRcdFx0bHV0WyBpIF0gPSAoIGkgPCAxNiA/ICcwJyA6ICcnICkgKyAoIGkgKS50b1N0cmluZyggMTYgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZW5lcmF0ZVVVSUQoKSB7XG5cblx0XHRcdHZhciBkMCA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDtcblx0XHRcdHZhciBkMSA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDtcblx0XHRcdHZhciBkMiA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDtcblx0XHRcdHZhciBkMyA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDtcblx0XHRcdHZhciB1dWlkID0gbHV0WyBkMCAmIDB4ZmYgXSArIGx1dFsgZDAgPj4gOCAmIDB4ZmYgXSArIGx1dFsgZDAgPj4gMTYgJiAweGZmIF0gKyBsdXRbIGQwID4+IDI0ICYgMHhmZiBdICsgJy0nICtcblx0XHRcdFx0bHV0WyBkMSAmIDB4ZmYgXSArIGx1dFsgZDEgPj4gOCAmIDB4ZmYgXSArICctJyArIGx1dFsgZDEgPj4gMTYgJiAweDBmIHwgMHg0MCBdICsgbHV0WyBkMSA+PiAyNCAmIDB4ZmYgXSArICctJyArXG5cdFx0XHRcdGx1dFsgZDIgJiAweDNmIHwgMHg4MCBdICsgbHV0WyBkMiA+PiA4ICYgMHhmZiBdICsgJy0nICsgbHV0WyBkMiA+PiAxNiAmIDB4ZmYgXSArIGx1dFsgZDIgPj4gMjQgJiAweGZmIF0gK1xuXHRcdFx0XHRsdXRbIGQzICYgMHhmZiBdICsgbHV0WyBkMyA+PiA4ICYgMHhmZiBdICsgbHV0WyBkMyA+PiAxNiAmIDB4ZmYgXSArIGx1dFsgZDMgPj4gMjQgJiAweGZmIF07XG5cblx0XHRcdC8vIC50b1VwcGVyQ2FzZSgpIGhlcmUgZmxhdHRlbnMgY29uY2F0ZW5hdGVkIHN0cmluZ3MgdG8gc2F2ZSBoZWFwIG1lbW9yeSBzcGFjZS5cblx0XHRcdHJldHVybiB1dWlkLnRvVXBwZXJDYXNlKCk7XG5cblx0XHR9O1xuXG5cdH0gKSgpLFxuXG5cdGNsYW1wOiBmdW5jdGlvbiAoIHZhbHVlLCBtaW4sIG1heCApIHtcblxuXHRcdHJldHVybiBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCB2YWx1ZSApICk7XG5cblx0fSxcblxuXHQvLyBjb21wdXRlIGV1Y2xpZGlhbiBtb2R1bG8gb2YgbSAlIG5cblx0Ly8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTW9kdWxvX29wZXJhdGlvblxuXG5cdGV1Y2xpZGVhbk1vZHVsbzogZnVuY3Rpb24gKCBuLCBtICkge1xuXG5cdFx0cmV0dXJuICggKCBuICUgbSApICsgbSApICUgbTtcblxuXHR9LFxuXG5cdC8vIExpbmVhciBtYXBwaW5nIGZyb20gcmFuZ2UgPGExLCBhMj4gdG8gcmFuZ2UgPGIxLCBiMj5cblxuXHRtYXBMaW5lYXI6IGZ1bmN0aW9uICggeCwgYTEsIGEyLCBiMSwgYjIgKSB7XG5cblx0XHRyZXR1cm4gYjEgKyAoIHggLSBhMSApICogKCBiMiAtIGIxICkgLyAoIGEyIC0gYTEgKTtcblxuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpbmVhcl9pbnRlcnBvbGF0aW9uXG5cblx0bGVycDogZnVuY3Rpb24gKCB4LCB5LCB0ICkge1xuXG5cdFx0cmV0dXJuICggMSAtIHQgKSAqIHggKyB0ICogeTtcblxuXHR9LFxuXG5cdC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU21vb3Roc3RlcFxuXG5cdHNtb290aHN0ZXA6IGZ1bmN0aW9uICggeCwgbWluLCBtYXggKSB7XG5cblx0XHRpZiAoIHggPD0gbWluICkgcmV0dXJuIDA7XG5cdFx0aWYgKCB4ID49IG1heCApIHJldHVybiAxO1xuXG5cdFx0eCA9ICggeCAtIG1pbiApIC8gKCBtYXggLSBtaW4gKTtcblxuXHRcdHJldHVybiB4ICogeCAqICggMyAtIDIgKiB4ICk7XG5cblx0fSxcblxuXHRzbW9vdGhlcnN0ZXA6IGZ1bmN0aW9uICggeCwgbWluLCBtYXggKSB7XG5cblx0XHRpZiAoIHggPD0gbWluICkgcmV0dXJuIDA7XG5cdFx0aWYgKCB4ID49IG1heCApIHJldHVybiAxO1xuXG5cdFx0eCA9ICggeCAtIG1pbiApIC8gKCBtYXggLSBtaW4gKTtcblxuXHRcdHJldHVybiB4ICogeCAqIHggKiAoIHggKiAoIHggKiA2IC0gMTUgKSArIDEwICk7XG5cblx0fSxcblxuXHQvLyBSYW5kb20gaW50ZWdlciBmcm9tIDxsb3csIGhpZ2g+IGludGVydmFsXG5cblx0cmFuZEludDogZnVuY3Rpb24gKCBsb3csIGhpZ2ggKSB7XG5cblx0XHRyZXR1cm4gbG93ICsgTWF0aC5mbG9vciggTWF0aC5yYW5kb20oKSAqICggaGlnaCAtIGxvdyArIDEgKSApO1xuXG5cdH0sXG5cblx0Ly8gUmFuZG9tIGZsb2F0IGZyb20gPGxvdywgaGlnaD4gaW50ZXJ2YWxcblxuXHRyYW5kRmxvYXQ6IGZ1bmN0aW9uICggbG93LCBoaWdoICkge1xuXG5cdFx0cmV0dXJuIGxvdyArIE1hdGgucmFuZG9tKCkgKiAoIGhpZ2ggLSBsb3cgKTtcblxuXHR9LFxuXG5cdC8vIFJhbmRvbSBmbG9hdCBmcm9tIDwtcmFuZ2UvMiwgcmFuZ2UvMj4gaW50ZXJ2YWxcblxuXHRyYW5kRmxvYXRTcHJlYWQ6IGZ1bmN0aW9uICggcmFuZ2UgKSB7XG5cblx0XHRyZXR1cm4gcmFuZ2UgKiAoIDAuNSAtIE1hdGgucmFuZG9tKCkgKTtcblxuXHR9LFxuXG5cdGRlZ1RvUmFkOiBmdW5jdGlvbiAoIGRlZ3JlZXMgKSB7XG5cblx0XHRyZXR1cm4gZGVncmVlcyAqIF9NYXRoLkRFRzJSQUQ7XG5cblx0fSxcblxuXHRyYWRUb0RlZzogZnVuY3Rpb24gKCByYWRpYW5zICkge1xuXG5cdFx0cmV0dXJuIHJhZGlhbnMgKiBfTWF0aC5SQUQyREVHO1xuXG5cdH0sXG5cblx0aXNQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0cmV0dXJuICggdmFsdWUgJiAoIHZhbHVlIC0gMSApICkgPT09IDAgJiYgdmFsdWUgIT09IDA7XG5cblx0fSxcblxuXHRjZWlsUG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHJldHVybiBNYXRoLnBvdyggMiwgTWF0aC5jZWlsKCBNYXRoLmxvZyggdmFsdWUgKSAvIE1hdGguTE4yICkgKTtcblxuXHR9LFxuXG5cdGZsb29yUG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHJldHVybiBNYXRoLnBvdyggMiwgTWF0aC5mbG9vciggTWF0aC5sb2coIHZhbHVlICkgLyBNYXRoLkxOMiApICk7XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIHBoaWxvZ2IgLyBodHRwOi8vYmxvZy50aGVqaXQub3JnL1xuICogQGF1dGhvciBlZ3JhZXRoZXIgLyBodHRwOi8vZWdyYWV0aGVyLmNvbS9cbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqL1xuXG5mdW5jdGlvbiBWZWN0b3IyKCB4LCB5ICkge1xuXG5cdHRoaXMueCA9IHggfHwgMDtcblx0dGhpcy55ID0geSB8fCAwO1xuXG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBWZWN0b3IyLnByb3RvdHlwZSwge1xuXG5cdFwid2lkdGhcIjoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLng7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLnggPSB2YWx1ZTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdFwiaGVpZ2h0XCI6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy55O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy55ID0gdmFsdWU7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFZlY3RvcjIucHJvdG90eXBlLCB7XG5cblx0aXNWZWN0b3IyOiB0cnVlLFxuXG5cdHNldDogZnVuY3Rpb24gKCB4LCB5ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ID0gc2NhbGFyO1xuXHRcdHRoaXMueSA9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WDogZnVuY3Rpb24gKCB4ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WTogZnVuY3Rpb24gKCB5ICkge1xuXG5cdFx0dGhpcy55ID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4LCB2YWx1ZSApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHRoaXMueCA9IHZhbHVlOyBicmVhaztcblx0XHRcdGNhc2UgMTogdGhpcy55ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogcmV0dXJuIHRoaXMueDtcblx0XHRcdGNhc2UgMTogcmV0dXJuIHRoaXMueTtcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLngsIHRoaXMueSApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gdi54O1xuXHRcdHRoaXMueSA9IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmFkZFZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCArPSB2Lng7XG5cdFx0dGhpcy55ICs9IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gcztcblx0XHR0aGlzLnkgKz0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54ICsgYi54O1xuXHRcdHRoaXMueSA9IGEueSArIGIueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGVkVmVjdG9yOiBmdW5jdGlvbiAoIHYsIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gdi54ICogcztcblx0XHR0aGlzLnkgKz0gdi55ICogcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCAtPSB2Lng7XG5cdFx0dGhpcy55IC09IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggLT0gcztcblx0XHR0aGlzLnkgLT0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54IC0gYi54O1xuXHRcdHRoaXMueSA9IGEueSAtIGIueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCAqPSB2Lng7XG5cdFx0dGhpcy55ICo9IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ICo9IHNjYWxhcjtcblx0XHR0aGlzLnkgKj0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXZpZGU6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCAvPSB2Lng7XG5cdFx0dGhpcy55IC89IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGl2aWRlU2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDM6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55O1xuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyAzIF0gKiB5ICsgZVsgNiBdO1xuXHRcdHRoaXMueSA9IGVbIDEgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgNyBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtaW46IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWluKCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYXg6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbGFtcDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdC8vIGFzc3VtZXMgbWluIDwgbWF4LCBjb21wb25lbnR3aXNlXG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggbWluLngsIE1hdGgubWluKCBtYXgueCwgdGhpcy54ICkgKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggbWluLnksIE1hdGgubWluKCBtYXgueSwgdGhpcy55ICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXBTY2FsYXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtaW4gPSBuZXcgVmVjdG9yMigpO1xuXHRcdHZhciBtYXggPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNsYW1wU2NhbGFyKCBtaW5WYWwsIG1heFZhbCApIHtcblxuXHRcdFx0bWluLnNldCggbWluVmFsLCBtaW5WYWwgKTtcblx0XHRcdG1heC5zZXQoIG1heFZhbCwgbWF4VmFsICk7XG5cblx0XHRcdHJldHVybiB0aGlzLmNsYW1wKCBtaW4sIG1heCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xhbXBMZW5ndGg6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHR2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGgoKTtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggbGVuZ3RoIHx8IDEgKS5tdWx0aXBseVNjYWxhciggTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgbGVuZ3RoICkgKSApO1xuXG5cdH0sXG5cblx0Zmxvb3I6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjZWlsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLmNlaWwoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguY2VpbCggdGhpcy55ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLnJvdW5kKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLnJvdW5kKCB0aGlzLnkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm91bmRUb1plcm86IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9ICggdGhpcy54IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnggKSA6IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9ICggdGhpcy55IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnkgKSA6IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IC0gdGhpcy54O1xuXHRcdHRoaXMueSA9IC0gdGhpcy55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkb3Q6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2Lnk7XG5cblx0fSxcblxuXHRsZW5ndGhTcTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueTtcblxuXHR9LFxuXG5cdGxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICk7XG5cblx0fSxcblxuXHRtYW5oYXR0YW5MZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54ICkgKyBNYXRoLmFicyggdGhpcy55ICk7XG5cblx0fSxcblxuXHRub3JtYWxpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggdGhpcy5sZW5ndGgoKSB8fCAxICk7XG5cblx0fSxcblxuXHRhbmdsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gY29tcHV0ZXMgdGhlIGFuZ2xlIGluIHJhZGlhbnMgd2l0aCByZXNwZWN0IHRvIHRoZSBwb3NpdGl2ZSB4LWF4aXNcblxuXHRcdHZhciBhbmdsZSA9IE1hdGguYXRhbjIoIHRoaXMueSwgdGhpcy54ICk7XG5cblx0XHRpZiAoIGFuZ2xlIDwgMCApIGFuZ2xlICs9IDIgKiBNYXRoLlBJO1xuXG5cdFx0cmV0dXJuIGFuZ2xlO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUbzogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy5kaXN0YW5jZVRvU3F1YXJlZCggdiApICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvU3F1YXJlZDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIGR4ID0gdGhpcy54IC0gdi54LCBkeSA9IHRoaXMueSAtIHYueTtcblx0XHRyZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG5cblx0fSxcblxuXHRtYW5oYXR0YW5EaXN0YW5jZVRvOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCAtIHYueCApICsgTWF0aC5hYnMoIHRoaXMueSAtIHYueSApO1xuXG5cdH0sXG5cblx0c2V0TGVuZ3RoOiBmdW5jdGlvbiAoIGxlbmd0aCApIHtcblxuXHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCBsZW5ndGggKTtcblxuXHR9LFxuXG5cdGxlcnA6IGZ1bmN0aW9uICggdiwgYWxwaGEgKSB7XG5cblx0XHR0aGlzLnggKz0gKCB2LnggLSB0aGlzLnggKSAqIGFscGhhO1xuXHRcdHRoaXMueSArPSAoIHYueSAtIHRoaXMueSApICogYWxwaGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxlcnBWZWN0b3JzOiBmdW5jdGlvbiAoIHYxLCB2MiwgYWxwaGEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2MiwgdjEgKS5tdWx0aXBseVNjYWxhciggYWxwaGEgKS5hZGQoIHYxICk7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiAoICggdi54ID09PSB0aGlzLnggKSAmJiAoIHYueSA9PT0gdGhpcy55ICkgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLnggPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy55ID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMueDtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy55O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0ZnJvbUJ1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7XG5cdFx0dGhpcy55ID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdGF0ZUFyb3VuZDogZnVuY3Rpb24gKCBjZW50ZXIsIGFuZ2xlICkge1xuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggYW5nbGUgKSwgcyA9IE1hdGguc2luKCBhbmdsZSApO1xuXG5cdFx0dmFyIHggPSB0aGlzLnggLSBjZW50ZXIueDtcblx0XHR2YXIgeSA9IHRoaXMueSAtIGNlbnRlci55O1xuXG5cdFx0dGhpcy54ID0geCAqIGMgLSB5ICogcyArIGNlbnRlci54O1xuXHRcdHRoaXMueSA9IHggKiBzICsgeSAqIGMgKyBjZW50ZXIueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIHN1cGVyZWdnYmVydCAvIGh0dHA6Ly93d3cucGF1bGJydW50LmNvLnVrL1xuICogQGF1dGhvciBwaGlsb2diIC8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy9cbiAqIEBhdXRob3Igam9yZGlfcm9zIC8gaHR0cDovL3BsYXR0c29mdC5jb21cbiAqIEBhdXRob3IgRDFwbG8xZCAvIGh0dHA6Ly9naXRodWIuY29tL0QxcGxvMWRcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciB0aW1rbmlwIC8gaHR0cDovL3d3dy5mbG9vcnBsYW5uZXIuY29tL1xuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gTWF0cml4NCgpIHtcblxuXHR0aGlzLmVsZW1lbnRzID0gW1xuXG5cdFx0MSwgMCwgMCwgMCxcblx0XHQwLCAxLCAwLCAwLFxuXHRcdDAsIDAsIDEsIDAsXG5cdFx0MCwgMCwgMCwgMVxuXG5cdF07XG5cblx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID4gMCApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLicgKTtcblxuXHR9XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggTWF0cml4NC5wcm90b3R5cGUsIHtcblxuXHRpc01hdHJpeDQ6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIG4xMSwgbjEyLCBuMTMsIG4xNCwgbjIxLCBuMjIsIG4yMywgbjI0LCBuMzEsIG4zMiwgbjMzLCBuMzQsIG40MSwgbjQyLCBuNDMsIG40NCApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdID0gbjExOyB0ZVsgNCBdID0gbjEyOyB0ZVsgOCBdID0gbjEzOyB0ZVsgMTIgXSA9IG4xNDtcblx0XHR0ZVsgMSBdID0gbjIxOyB0ZVsgNSBdID0gbjIyOyB0ZVsgOSBdID0gbjIzOyB0ZVsgMTMgXSA9IG4yNDtcblx0XHR0ZVsgMiBdID0gbjMxOyB0ZVsgNiBdID0gbjMyOyB0ZVsgMTAgXSA9IG4zMzsgdGVbIDE0IF0gPSBuMzQ7XG5cdFx0dGVbIDMgXSA9IG40MTsgdGVbIDcgXSA9IG40MjsgdGVbIDExIF0gPSBuNDM7IHRlWyAxNSBdID0gbjQ0O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRpZGVudGl0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIDAsIDAsIDAsXG5cdFx0XHQwLCAxLCAwLCAwLFxuXHRcdFx0MCwgMCwgMSwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IE1hdHJpeDQoKS5mcm9tQXJyYXkoIHRoaXMuZWxlbWVudHMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIG1lID0gbS5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gPSBtZVsgMCBdOyB0ZVsgMSBdID0gbWVbIDEgXTsgdGVbIDIgXSA9IG1lWyAyIF07IHRlWyAzIF0gPSBtZVsgMyBdO1xuXHRcdHRlWyA0IF0gPSBtZVsgNCBdOyB0ZVsgNSBdID0gbWVbIDUgXTsgdGVbIDYgXSA9IG1lWyA2IF07IHRlWyA3IF0gPSBtZVsgNyBdO1xuXHRcdHRlWyA4IF0gPSBtZVsgOCBdOyB0ZVsgOSBdID0gbWVbIDkgXTsgdGVbIDEwIF0gPSBtZVsgMTAgXTsgdGVbIDExIF0gPSBtZVsgMTEgXTtcblx0XHR0ZVsgMTIgXSA9IG1lWyAxMiBdOyB0ZVsgMTMgXSA9IG1lWyAxMyBdOyB0ZVsgMTQgXSA9IG1lWyAxNCBdOyB0ZVsgMTUgXSA9IG1lWyAxNSBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5UG9zaXRpb246IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHMsIG1lID0gbS5lbGVtZW50cztcblxuXHRcdHRlWyAxMiBdID0gbWVbIDEyIF07XG5cdFx0dGVbIDEzIF0gPSBtZVsgMTMgXTtcblx0XHR0ZVsgMTQgXSA9IG1lWyAxNCBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRleHRyYWN0QmFzaXM6IGZ1bmN0aW9uICggeEF4aXMsIHlBeGlzLCB6QXhpcyApIHtcblxuXHRcdHhBeGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIHRoaXMsIDAgKTtcblx0XHR5QXhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAxICk7XG5cdFx0ekF4aXMuc2V0RnJvbU1hdHJpeENvbHVtbiggdGhpcywgMiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlQmFzaXM6IGZ1bmN0aW9uICggeEF4aXMsIHlBeGlzLCB6QXhpcyApIHtcblxuXHRcdHRoaXMuc2V0KFxuXHRcdFx0eEF4aXMueCwgeUF4aXMueCwgekF4aXMueCwgMCxcblx0XHRcdHhBeGlzLnksIHlBeGlzLnksIHpBeGlzLnksIDAsXG5cdFx0XHR4QXhpcy56LCB5QXhpcy56LCB6QXhpcy56LCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGV4dHJhY3RSb3RhdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBleHRyYWN0Um90YXRpb24oIG0gKSB7XG5cblx0XHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0XHR2YXIgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0XHR2YXIgc2NhbGVYID0gMSAvIHYxLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDAgKS5sZW5ndGgoKTtcblx0XHRcdHZhciBzY2FsZVkgPSAxIC8gdjEuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMSApLmxlbmd0aCgpO1xuXHRcdFx0dmFyIHNjYWxlWiA9IDEgLyB2MS5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAyICkubGVuZ3RoKCk7XG5cblx0XHRcdHRlWyAwIF0gPSBtZVsgMCBdICogc2NhbGVYO1xuXHRcdFx0dGVbIDEgXSA9IG1lWyAxIF0gKiBzY2FsZVg7XG5cdFx0XHR0ZVsgMiBdID0gbWVbIDIgXSAqIHNjYWxlWDtcblxuXHRcdFx0dGVbIDQgXSA9IG1lWyA0IF0gKiBzY2FsZVk7XG5cdFx0XHR0ZVsgNSBdID0gbWVbIDUgXSAqIHNjYWxlWTtcblx0XHRcdHRlWyA2IF0gPSBtZVsgNiBdICogc2NhbGVZO1xuXG5cdFx0XHR0ZVsgOCBdID0gbWVbIDggXSAqIHNjYWxlWjtcblx0XHRcdHRlWyA5IF0gPSBtZVsgOSBdICogc2NhbGVaO1xuXHRcdFx0dGVbIDEwIF0gPSBtZVsgMTAgXSAqIHNjYWxlWjtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRtYWtlUm90YXRpb25Gcm9tRXVsZXI6IGZ1bmN0aW9uICggZXVsZXIgKSB7XG5cblx0XHRpZiAoICEgKCBldWxlciAmJiBldWxlci5pc0V1bGVyICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAubWFrZVJvdGF0aW9uRnJvbUV1bGVyKCkgbm93IGV4cGVjdHMgYSBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLicgKTtcblxuXHRcdH1cblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgeCA9IGV1bGVyLngsIHkgPSBldWxlci55LCB6ID0gZXVsZXIuejtcblx0XHR2YXIgYSA9IE1hdGguY29zKCB4ICksIGIgPSBNYXRoLnNpbiggeCApO1xuXHRcdHZhciBjID0gTWF0aC5jb3MoIHkgKSwgZCA9IE1hdGguc2luKCB5ICk7XG5cdFx0dmFyIGUgPSBNYXRoLmNvcyggeiApLCBmID0gTWF0aC5zaW4oIHogKTtcblxuXHRcdGlmICggZXVsZXIub3JkZXIgPT09ICdYWVonICkge1xuXG5cdFx0XHR2YXIgYWUgPSBhICogZSwgYWYgPSBhICogZiwgYmUgPSBiICogZSwgYmYgPSBiICogZjtcblxuXHRcdFx0dGVbIDAgXSA9IGMgKiBlO1xuXHRcdFx0dGVbIDQgXSA9IC0gYyAqIGY7XG5cdFx0XHR0ZVsgOCBdID0gZDtcblxuXHRcdFx0dGVbIDEgXSA9IGFmICsgYmUgKiBkO1xuXHRcdFx0dGVbIDUgXSA9IGFlIC0gYmYgKiBkO1xuXHRcdFx0dGVbIDkgXSA9IC0gYiAqIGM7XG5cblx0XHRcdHRlWyAyIF0gPSBiZiAtIGFlICogZDtcblx0XHRcdHRlWyA2IF0gPSBiZSArIGFmICogZDtcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XG5cblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1lYWicgKSB7XG5cblx0XHRcdHZhciBjZSA9IGMgKiBlLCBjZiA9IGMgKiBmLCBkZSA9IGQgKiBlLCBkZiA9IGQgKiBmO1xuXG5cdFx0XHR0ZVsgMCBdID0gY2UgKyBkZiAqIGI7XG5cdFx0XHR0ZVsgNCBdID0gZGUgKiBiIC0gY2Y7XG5cdFx0XHR0ZVsgOCBdID0gYSAqIGQ7XG5cblx0XHRcdHRlWyAxIF0gPSBhICogZjtcblx0XHRcdHRlWyA1IF0gPSBhICogZTtcblx0XHRcdHRlWyA5IF0gPSAtIGI7XG5cblx0XHRcdHRlWyAyIF0gPSBjZiAqIGIgLSBkZTtcblx0XHRcdHRlWyA2IF0gPSBkZiArIGNlICogYjtcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XG5cblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1pYWScgKSB7XG5cblx0XHRcdHZhciBjZSA9IGMgKiBlLCBjZiA9IGMgKiBmLCBkZSA9IGQgKiBlLCBkZiA9IGQgKiBmO1xuXG5cdFx0XHR0ZVsgMCBdID0gY2UgLSBkZiAqIGI7XG5cdFx0XHR0ZVsgNCBdID0gLSBhICogZjtcblx0XHRcdHRlWyA4IF0gPSBkZSArIGNmICogYjtcblxuXHRcdFx0dGVbIDEgXSA9IGNmICsgZGUgKiBiO1xuXHRcdFx0dGVbIDUgXSA9IGEgKiBlO1xuXHRcdFx0dGVbIDkgXSA9IGRmIC0gY2UgKiBiO1xuXG5cdFx0XHR0ZVsgMiBdID0gLSBhICogZDtcblx0XHRcdHRlWyA2IF0gPSBiO1xuXHRcdFx0dGVbIDEwIF0gPSBhICogYztcblxuXHRcdH0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWllYJyApIHtcblxuXHRcdFx0dmFyIGFlID0gYSAqIGUsIGFmID0gYSAqIGYsIGJlID0gYiAqIGUsIGJmID0gYiAqIGY7XG5cblx0XHRcdHRlWyAwIF0gPSBjICogZTtcblx0XHRcdHRlWyA0IF0gPSBiZSAqIGQgLSBhZjtcblx0XHRcdHRlWyA4IF0gPSBhZSAqIGQgKyBiZjtcblxuXHRcdFx0dGVbIDEgXSA9IGMgKiBmO1xuXHRcdFx0dGVbIDUgXSA9IGJmICogZCArIGFlO1xuXHRcdFx0dGVbIDkgXSA9IGFmICogZCAtIGJlO1xuXG5cdFx0XHR0ZVsgMiBdID0gLSBkO1xuXHRcdFx0dGVbIDYgXSA9IGIgKiBjO1xuXHRcdFx0dGVbIDEwIF0gPSBhICogYztcblxuXHRcdH0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWVpYJyApIHtcblxuXHRcdFx0dmFyIGFjID0gYSAqIGMsIGFkID0gYSAqIGQsIGJjID0gYiAqIGMsIGJkID0gYiAqIGQ7XG5cblx0XHRcdHRlWyAwIF0gPSBjICogZTtcblx0XHRcdHRlWyA0IF0gPSBiZCAtIGFjICogZjtcblx0XHRcdHRlWyA4IF0gPSBiYyAqIGYgKyBhZDtcblxuXHRcdFx0dGVbIDEgXSA9IGY7XG5cdFx0XHR0ZVsgNSBdID0gYSAqIGU7XG5cdFx0XHR0ZVsgOSBdID0gLSBiICogZTtcblxuXHRcdFx0dGVbIDIgXSA9IC0gZCAqIGU7XG5cdFx0XHR0ZVsgNiBdID0gYWQgKiBmICsgYmM7XG5cdFx0XHR0ZVsgMTAgXSA9IGFjIC0gYmQgKiBmO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdYWlknICkge1xuXG5cdFx0XHR2YXIgYWMgPSBhICogYywgYWQgPSBhICogZCwgYmMgPSBiICogYywgYmQgPSBiICogZDtcblxuXHRcdFx0dGVbIDAgXSA9IGMgKiBlO1xuXHRcdFx0dGVbIDQgXSA9IC0gZjtcblx0XHRcdHRlWyA4IF0gPSBkICogZTtcblxuXHRcdFx0dGVbIDEgXSA9IGFjICogZiArIGJkO1xuXHRcdFx0dGVbIDUgXSA9IGEgKiBlO1xuXHRcdFx0dGVbIDkgXSA9IGFkICogZiAtIGJjO1xuXG5cdFx0XHR0ZVsgMiBdID0gYmMgKiBmIC0gYWQ7XG5cdFx0XHR0ZVsgNiBdID0gYiAqIGU7XG5cdFx0XHR0ZVsgMTAgXSA9IGJkICogZiArIGFjO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbGFzdCBjb2x1bW5cblx0XHR0ZVsgMyBdID0gMDtcblx0XHR0ZVsgNyBdID0gMDtcblx0XHR0ZVsgMTEgXSA9IDA7XG5cblx0XHQvLyBib3R0b20gcm93XG5cdFx0dGVbIDEyIF0gPSAwO1xuXHRcdHRlWyAxMyBdID0gMDtcblx0XHR0ZVsgMTQgXSA9IDA7XG5cdFx0dGVbIDE1IF0gPSAxO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciB4ID0gcS5feCwgeSA9IHEuX3ksIHogPSBxLl96LCB3ID0gcS5fdztcblx0XHR2YXIgeDIgPSB4ICsgeCwgeTIgPSB5ICsgeSwgejIgPSB6ICsgejtcblx0XHR2YXIgeHggPSB4ICogeDIsIHh5ID0geCAqIHkyLCB4eiA9IHggKiB6Mjtcblx0XHR2YXIgeXkgPSB5ICogeTIsIHl6ID0geSAqIHoyLCB6eiA9IHogKiB6Mjtcblx0XHR2YXIgd3ggPSB3ICogeDIsIHd5ID0gdyAqIHkyLCB3eiA9IHcgKiB6MjtcblxuXHRcdHRlWyAwIF0gPSAxIC0gKCB5eSArIHp6ICk7XG5cdFx0dGVbIDQgXSA9IHh5IC0gd3o7XG5cdFx0dGVbIDggXSA9IHh6ICsgd3k7XG5cblx0XHR0ZVsgMSBdID0geHkgKyB3ejtcblx0XHR0ZVsgNSBdID0gMSAtICggeHggKyB6eiApO1xuXHRcdHRlWyA5IF0gPSB5eiAtIHd4O1xuXG5cdFx0dGVbIDIgXSA9IHh6IC0gd3k7XG5cdFx0dGVbIDYgXSA9IHl6ICsgd3g7XG5cdFx0dGVbIDEwIF0gPSAxIC0gKCB4eCArIHl5ICk7XG5cblx0XHQvLyBsYXN0IGNvbHVtblxuXHRcdHRlWyAzIF0gPSAwO1xuXHRcdHRlWyA3IF0gPSAwO1xuXHRcdHRlWyAxMSBdID0gMDtcblxuXHRcdC8vIGJvdHRvbSByb3dcblx0XHR0ZVsgMTIgXSA9IDA7XG5cdFx0dGVbIDEzIF0gPSAwO1xuXHRcdHRlWyAxNCBdID0gMDtcblx0XHR0ZVsgMTUgXSA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxvb2tBdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHggPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB5ID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgeiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gbG9va0F0KCBleWUsIHRhcmdldCwgdXAgKSB7XG5cblx0XHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRcdHouc3ViVmVjdG9ycyggZXllLCB0YXJnZXQgKTtcblxuXHRcdFx0aWYgKCB6Lmxlbmd0aFNxKCkgPT09IDAgKSB7XG5cblx0XHRcdFx0Ly8gZXllIGFuZCB0YXJnZXQgYXJlIGluIHRoZSBzYW1lIHBvc2l0aW9uXG5cblx0XHRcdFx0ei56ID0gMTtcblxuXHRcdFx0fVxuXG5cdFx0XHR6Lm5vcm1hbGl6ZSgpO1xuXHRcdFx0eC5jcm9zc1ZlY3RvcnMoIHVwLCB6ICk7XG5cblx0XHRcdGlmICggeC5sZW5ndGhTcSgpID09PSAwICkge1xuXG5cdFx0XHRcdC8vIHVwIGFuZCB6IGFyZSBwYXJhbGxlbFxuXG5cdFx0XHRcdGlmICggTWF0aC5hYnMoIHVwLnogKSA9PT0gMSApIHtcblxuXHRcdFx0XHRcdHoueCArPSAwLjAwMDE7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHoueiArPSAwLjAwMDE7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHoubm9ybWFsaXplKCk7XG5cdFx0XHRcdHguY3Jvc3NWZWN0b3JzKCB1cCwgeiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHgubm9ybWFsaXplKCk7XG5cdFx0XHR5LmNyb3NzVmVjdG9ycyggeiwgeCApO1xuXG5cdFx0XHR0ZVsgMCBdID0geC54OyB0ZVsgNCBdID0geS54OyB0ZVsgOCBdID0gei54O1xuXHRcdFx0dGVbIDEgXSA9IHgueTsgdGVbIDUgXSA9IHkueTsgdGVbIDkgXSA9IHoueTtcblx0XHRcdHRlWyAyIF0gPSB4Lno7IHRlWyA2IF0gPSB5Lno7IHRlWyAxMCBdID0gei56O1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdG11bHRpcGx5OiBmdW5jdGlvbiAoIG0sIG4gKSB7XG5cblx0XHRpZiAoIG4gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlNYXRyaWNlcyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggbSwgbiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggdGhpcywgbSApO1xuXG5cdH0sXG5cblx0cHJlbXVsdGlwbHk6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIG0sIHRoaXMgKTtcblxuXHR9LFxuXG5cdG11bHRpcGx5TWF0cmljZXM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHZhciBhZSA9IGEuZWxlbWVudHM7XG5cdFx0dmFyIGJlID0gYi5lbGVtZW50cztcblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIGExMSA9IGFlWyAwIF0sIGExMiA9IGFlWyA0IF0sIGExMyA9IGFlWyA4IF0sIGExNCA9IGFlWyAxMiBdO1xuXHRcdHZhciBhMjEgPSBhZVsgMSBdLCBhMjIgPSBhZVsgNSBdLCBhMjMgPSBhZVsgOSBdLCBhMjQgPSBhZVsgMTMgXTtcblx0XHR2YXIgYTMxID0gYWVbIDIgXSwgYTMyID0gYWVbIDYgXSwgYTMzID0gYWVbIDEwIF0sIGEzNCA9IGFlWyAxNCBdO1xuXHRcdHZhciBhNDEgPSBhZVsgMyBdLCBhNDIgPSBhZVsgNyBdLCBhNDMgPSBhZVsgMTEgXSwgYTQ0ID0gYWVbIDE1IF07XG5cblx0XHR2YXIgYjExID0gYmVbIDAgXSwgYjEyID0gYmVbIDQgXSwgYjEzID0gYmVbIDggXSwgYjE0ID0gYmVbIDEyIF07XG5cdFx0dmFyIGIyMSA9IGJlWyAxIF0sIGIyMiA9IGJlWyA1IF0sIGIyMyA9IGJlWyA5IF0sIGIyNCA9IGJlWyAxMyBdO1xuXHRcdHZhciBiMzEgPSBiZVsgMiBdLCBiMzIgPSBiZVsgNiBdLCBiMzMgPSBiZVsgMTAgXSwgYjM0ID0gYmVbIDE0IF07XG5cdFx0dmFyIGI0MSA9IGJlWyAzIF0sIGI0MiA9IGJlWyA3IF0sIGI0MyA9IGJlWyAxMSBdLCBiNDQgPSBiZVsgMTUgXTtcblxuXHRcdHRlWyAwIF0gPSBhMTEgKiBiMTEgKyBhMTIgKiBiMjEgKyBhMTMgKiBiMzEgKyBhMTQgKiBiNDE7XG5cdFx0dGVbIDQgXSA9IGExMSAqIGIxMiArIGExMiAqIGIyMiArIGExMyAqIGIzMiArIGExNCAqIGI0Mjtcblx0XHR0ZVsgOCBdID0gYTExICogYjEzICsgYTEyICogYjIzICsgYTEzICogYjMzICsgYTE0ICogYjQzO1xuXHRcdHRlWyAxMiBdID0gYTExICogYjE0ICsgYTEyICogYjI0ICsgYTEzICogYjM0ICsgYTE0ICogYjQ0O1xuXG5cdFx0dGVbIDEgXSA9IGEyMSAqIGIxMSArIGEyMiAqIGIyMSArIGEyMyAqIGIzMSArIGEyNCAqIGI0MTtcblx0XHR0ZVsgNSBdID0gYTIxICogYjEyICsgYTIyICogYjIyICsgYTIzICogYjMyICsgYTI0ICogYjQyO1xuXHRcdHRlWyA5IF0gPSBhMjEgKiBiMTMgKyBhMjIgKiBiMjMgKyBhMjMgKiBiMzMgKyBhMjQgKiBiNDM7XG5cdFx0dGVbIDEzIF0gPSBhMjEgKiBiMTQgKyBhMjIgKiBiMjQgKyBhMjMgKiBiMzQgKyBhMjQgKiBiNDQ7XG5cblx0XHR0ZVsgMiBdID0gYTMxICogYjExICsgYTMyICogYjIxICsgYTMzICogYjMxICsgYTM0ICogYjQxO1xuXHRcdHRlWyA2IF0gPSBhMzEgKiBiMTIgKyBhMzIgKiBiMjIgKyBhMzMgKiBiMzIgKyBhMzQgKiBiNDI7XG5cdFx0dGVbIDEwIF0gPSBhMzEgKiBiMTMgKyBhMzIgKiBiMjMgKyBhMzMgKiBiMzMgKyBhMzQgKiBiNDM7XG5cdFx0dGVbIDE0IF0gPSBhMzEgKiBiMTQgKyBhMzIgKiBiMjQgKyBhMzMgKiBiMzQgKyBhMzQgKiBiNDQ7XG5cblx0XHR0ZVsgMyBdID0gYTQxICogYjExICsgYTQyICogYjIxICsgYTQzICogYjMxICsgYTQ0ICogYjQxO1xuXHRcdHRlWyA3IF0gPSBhNDEgKiBiMTIgKyBhNDIgKiBiMjIgKyBhNDMgKiBiMzIgKyBhNDQgKiBiNDI7XG5cdFx0dGVbIDExIF0gPSBhNDEgKiBiMTMgKyBhNDIgKiBiMjMgKyBhNDMgKiBiMzMgKyBhNDQgKiBiNDM7XG5cdFx0dGVbIDE1IF0gPSBhNDEgKiBiMTQgKyBhNDIgKiBiMjQgKyBhNDMgKiBiMzQgKyBhNDQgKiBiNDQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSAqPSBzOyB0ZVsgNCBdICo9IHM7IHRlWyA4IF0gKj0gczsgdGVbIDEyIF0gKj0gcztcblx0XHR0ZVsgMSBdICo9IHM7IHRlWyA1IF0gKj0gczsgdGVbIDkgXSAqPSBzOyB0ZVsgMTMgXSAqPSBzO1xuXHRcdHRlWyAyIF0gKj0gczsgdGVbIDYgXSAqPSBzOyB0ZVsgMTAgXSAqPSBzOyB0ZVsgMTQgXSAqPSBzO1xuXHRcdHRlWyAzIF0gKj0gczsgdGVbIDcgXSAqPSBzOyB0ZVsgMTEgXSAqPSBzOyB0ZVsgMTUgXSAqPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseVRvQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gYXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2MS54ID0gYXR0cmlidXRlLmdldFgoIGkgKTtcblx0XHRcdFx0djEueSA9IGF0dHJpYnV0ZS5nZXRZKCBpICk7XG5cdFx0XHRcdHYxLnogPSBhdHRyaWJ1dGUuZ2V0WiggaSApO1xuXG5cdFx0XHRcdHYxLmFwcGx5TWF0cml4NCggdGhpcyApO1xuXG5cdFx0XHRcdGF0dHJpYnV0ZS5zZXRYWVooIGksIHYxLngsIHYxLnksIHYxLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gYXR0cmlidXRlO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0ZGV0ZXJtaW5hbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgbjExID0gdGVbIDAgXSwgbjEyID0gdGVbIDQgXSwgbjEzID0gdGVbIDggXSwgbjE0ID0gdGVbIDEyIF07XG5cdFx0dmFyIG4yMSA9IHRlWyAxIF0sIG4yMiA9IHRlWyA1IF0sIG4yMyA9IHRlWyA5IF0sIG4yNCA9IHRlWyAxMyBdO1xuXHRcdHZhciBuMzEgPSB0ZVsgMiBdLCBuMzIgPSB0ZVsgNiBdLCBuMzMgPSB0ZVsgMTAgXSwgbjM0ID0gdGVbIDE0IF07XG5cdFx0dmFyIG40MSA9IHRlWyAzIF0sIG40MiA9IHRlWyA3IF0sIG40MyA9IHRlWyAxMSBdLCBuNDQgPSB0ZVsgMTUgXTtcblxuXHRcdC8vVE9ETzogbWFrZSB0aGlzIG1vcmUgZWZmaWNpZW50XG5cdFx0Ly8oIGJhc2VkIG9uIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvbWF0cml4L2Z1bmN0aW9ucy9pbnZlcnNlL2ZvdXJEL2luZGV4Lmh0bSApXG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0bjQxICogKFxuXHRcdFx0XHQrIG4xNCAqIG4yMyAqIG4zMlxuXHRcdFx0XHQgLSBuMTMgKiBuMjQgKiBuMzJcblx0XHRcdFx0IC0gbjE0ICogbjIyICogbjMzXG5cdFx0XHRcdCArIG4xMiAqIG4yNCAqIG4zM1xuXHRcdFx0XHQgKyBuMTMgKiBuMjIgKiBuMzRcblx0XHRcdFx0IC0gbjEyICogbjIzICogbjM0XG5cdFx0XHQpICtcblx0XHRcdG40MiAqIChcblx0XHRcdFx0KyBuMTEgKiBuMjMgKiBuMzRcblx0XHRcdFx0IC0gbjExICogbjI0ICogbjMzXG5cdFx0XHRcdCArIG4xNCAqIG4yMSAqIG4zM1xuXHRcdFx0XHQgLSBuMTMgKiBuMjEgKiBuMzRcblx0XHRcdFx0ICsgbjEzICogbjI0ICogbjMxXG5cdFx0XHRcdCAtIG4xNCAqIG4yMyAqIG4zMVxuXHRcdFx0KSArXG5cdFx0XHRuNDMgKiAoXG5cdFx0XHRcdCsgbjExICogbjI0ICogbjMyXG5cdFx0XHRcdCAtIG4xMSAqIG4yMiAqIG4zNFxuXHRcdFx0XHQgLSBuMTQgKiBuMjEgKiBuMzJcblx0XHRcdFx0ICsgbjEyICogbjIxICogbjM0XG5cdFx0XHRcdCArIG4xNCAqIG4yMiAqIG4zMVxuXHRcdFx0XHQgLSBuMTIgKiBuMjQgKiBuMzFcblx0XHRcdCkgK1xuXHRcdFx0bjQ0ICogKFxuXHRcdFx0XHQtIG4xMyAqIG4yMiAqIG4zMVxuXHRcdFx0XHQgLSBuMTEgKiBuMjMgKiBuMzJcblx0XHRcdFx0ICsgbjExICogbjIyICogbjMzXG5cdFx0XHRcdCArIG4xMyAqIG4yMSAqIG4zMlxuXHRcdFx0XHQgLSBuMTIgKiBuMjEgKiBuMzNcblx0XHRcdFx0ICsgbjEyICogbjIzICogbjMxXG5cdFx0XHQpXG5cblx0XHQpO1xuXG5cdH0sXG5cblx0dHJhbnNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciB0bXA7XG5cblx0XHR0bXAgPSB0ZVsgMSBdOyB0ZVsgMSBdID0gdGVbIDQgXTsgdGVbIDQgXSA9IHRtcDtcblx0XHR0bXAgPSB0ZVsgMiBdOyB0ZVsgMiBdID0gdGVbIDggXTsgdGVbIDggXSA9IHRtcDtcblx0XHR0bXAgPSB0ZVsgNiBdOyB0ZVsgNiBdID0gdGVbIDkgXTsgdGVbIDkgXSA9IHRtcDtcblxuXHRcdHRtcCA9IHRlWyAzIF07IHRlWyAzIF0gPSB0ZVsgMTIgXTsgdGVbIDEyIF0gPSB0bXA7XG5cdFx0dG1wID0gdGVbIDcgXTsgdGVbIDcgXSA9IHRlWyAxMyBdOyB0ZVsgMTMgXSA9IHRtcDtcblx0XHR0bXAgPSB0ZVsgMTEgXTsgdGVbIDExIF0gPSB0ZVsgMTQgXTsgdGVbIDE0IF0gPSB0bXA7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFBvc2l0aW9uOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDEyIF0gPSB2Lng7XG5cdFx0dGVbIDEzIF0gPSB2Lnk7XG5cdFx0dGVbIDE0IF0gPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEludmVyc2U6IGZ1bmN0aW9uICggbSwgdGhyb3dPbkRlZ2VuZXJhdGUgKSB7XG5cblx0XHQvLyBiYXNlZCBvbiBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL21hdHJpeC9mdW5jdGlvbnMvaW52ZXJzZS9mb3VyRC9pbmRleC5odG1cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzLFxuXHRcdFx0bWUgPSBtLmVsZW1lbnRzLFxuXG5cdFx0XHRuMTEgPSBtZVsgMCBdLCBuMjEgPSBtZVsgMSBdLCBuMzEgPSBtZVsgMiBdLCBuNDEgPSBtZVsgMyBdLFxuXHRcdFx0bjEyID0gbWVbIDQgXSwgbjIyID0gbWVbIDUgXSwgbjMyID0gbWVbIDYgXSwgbjQyID0gbWVbIDcgXSxcblx0XHRcdG4xMyA9IG1lWyA4IF0sIG4yMyA9IG1lWyA5IF0sIG4zMyA9IG1lWyAxMCBdLCBuNDMgPSBtZVsgMTEgXSxcblx0XHRcdG4xNCA9IG1lWyAxMiBdLCBuMjQgPSBtZVsgMTMgXSwgbjM0ID0gbWVbIDE0IF0sIG40NCA9IG1lWyAxNSBdLFxuXG5cdFx0XHR0MTEgPSBuMjMgKiBuMzQgKiBuNDIgLSBuMjQgKiBuMzMgKiBuNDIgKyBuMjQgKiBuMzIgKiBuNDMgLSBuMjIgKiBuMzQgKiBuNDMgLSBuMjMgKiBuMzIgKiBuNDQgKyBuMjIgKiBuMzMgKiBuNDQsXG5cdFx0XHR0MTIgPSBuMTQgKiBuMzMgKiBuNDIgLSBuMTMgKiBuMzQgKiBuNDIgLSBuMTQgKiBuMzIgKiBuNDMgKyBuMTIgKiBuMzQgKiBuNDMgKyBuMTMgKiBuMzIgKiBuNDQgLSBuMTIgKiBuMzMgKiBuNDQsXG5cdFx0XHR0MTMgPSBuMTMgKiBuMjQgKiBuNDIgLSBuMTQgKiBuMjMgKiBuNDIgKyBuMTQgKiBuMjIgKiBuNDMgLSBuMTIgKiBuMjQgKiBuNDMgLSBuMTMgKiBuMjIgKiBuNDQgKyBuMTIgKiBuMjMgKiBuNDQsXG5cdFx0XHR0MTQgPSBuMTQgKiBuMjMgKiBuMzIgLSBuMTMgKiBuMjQgKiBuMzIgLSBuMTQgKiBuMjIgKiBuMzMgKyBuMTIgKiBuMjQgKiBuMzMgKyBuMTMgKiBuMjIgKiBuMzQgLSBuMTIgKiBuMjMgKiBuMzQ7XG5cblx0XHR2YXIgZGV0ID0gbjExICogdDExICsgbjIxICogdDEyICsgbjMxICogdDEzICsgbjQxICogdDE0O1xuXG5cdFx0aWYgKCBkZXQgPT09IDAgKSB7XG5cblx0XHRcdHZhciBtc2cgPSBcIlRIUkVFLk1hdHJpeDQ6IC5nZXRJbnZlcnNlKCkgY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMFwiO1xuXG5cdFx0XHRpZiAoIHRocm93T25EZWdlbmVyYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggbXNnICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCBtc2cgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy5pZGVudGl0eSgpO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGRldEludiA9IDEgLyBkZXQ7XG5cblx0XHR0ZVsgMCBdID0gdDExICogZGV0SW52O1xuXHRcdHRlWyAxIF0gPSAoIG4yNCAqIG4zMyAqIG40MSAtIG4yMyAqIG4zNCAqIG40MSAtIG4yNCAqIG4zMSAqIG40MyArIG4yMSAqIG4zNCAqIG40MyArIG4yMyAqIG4zMSAqIG40NCAtIG4yMSAqIG4zMyAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAyIF0gPSAoIG4yMiAqIG4zNCAqIG40MSAtIG4yNCAqIG4zMiAqIG40MSArIG4yNCAqIG4zMSAqIG40MiAtIG4yMSAqIG4zNCAqIG40MiAtIG4yMiAqIG4zMSAqIG40NCArIG4yMSAqIG4zMiAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAzIF0gPSAoIG4yMyAqIG4zMiAqIG40MSAtIG4yMiAqIG4zMyAqIG40MSAtIG4yMyAqIG4zMSAqIG40MiArIG4yMSAqIG4zMyAqIG40MiArIG4yMiAqIG4zMSAqIG40MyAtIG4yMSAqIG4zMiAqIG40MyApICogZGV0SW52O1xuXG5cdFx0dGVbIDQgXSA9IHQxMiAqIGRldEludjtcblx0XHR0ZVsgNSBdID0gKCBuMTMgKiBuMzQgKiBuNDEgLSBuMTQgKiBuMzMgKiBuNDEgKyBuMTQgKiBuMzEgKiBuNDMgLSBuMTEgKiBuMzQgKiBuNDMgLSBuMTMgKiBuMzEgKiBuNDQgKyBuMTEgKiBuMzMgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgNiBdID0gKCBuMTQgKiBuMzIgKiBuNDEgLSBuMTIgKiBuMzQgKiBuNDEgLSBuMTQgKiBuMzEgKiBuNDIgKyBuMTEgKiBuMzQgKiBuNDIgKyBuMTIgKiBuMzEgKiBuNDQgLSBuMTEgKiBuMzIgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgNyBdID0gKCBuMTIgKiBuMzMgKiBuNDEgLSBuMTMgKiBuMzIgKiBuNDEgKyBuMTMgKiBuMzEgKiBuNDIgLSBuMTEgKiBuMzMgKiBuNDIgLSBuMTIgKiBuMzEgKiBuNDMgKyBuMTEgKiBuMzIgKiBuNDMgKSAqIGRldEludjtcblxuXHRcdHRlWyA4IF0gPSB0MTMgKiBkZXRJbnY7XG5cdFx0dGVbIDkgXSA9ICggbjE0ICogbjIzICogbjQxIC0gbjEzICogbjI0ICogbjQxIC0gbjE0ICogbjIxICogbjQzICsgbjExICogbjI0ICogbjQzICsgbjEzICogbjIxICogbjQ0IC0gbjExICogbjIzICogbjQ0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDEwIF0gPSAoIG4xMiAqIG4yNCAqIG40MSAtIG4xNCAqIG4yMiAqIG40MSArIG4xNCAqIG4yMSAqIG40MiAtIG4xMSAqIG4yNCAqIG40MiAtIG4xMiAqIG4yMSAqIG40NCArIG4xMSAqIG4yMiAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAxMSBdID0gKCBuMTMgKiBuMjIgKiBuNDEgLSBuMTIgKiBuMjMgKiBuNDEgLSBuMTMgKiBuMjEgKiBuNDIgKyBuMTEgKiBuMjMgKiBuNDIgKyBuMTIgKiBuMjEgKiBuNDMgLSBuMTEgKiBuMjIgKiBuNDMgKSAqIGRldEludjtcblxuXHRcdHRlWyAxMiBdID0gdDE0ICogZGV0SW52O1xuXHRcdHRlWyAxMyBdID0gKCBuMTMgKiBuMjQgKiBuMzEgLSBuMTQgKiBuMjMgKiBuMzEgKyBuMTQgKiBuMjEgKiBuMzMgLSBuMTEgKiBuMjQgKiBuMzMgLSBuMTMgKiBuMjEgKiBuMzQgKyBuMTEgKiBuMjMgKiBuMzQgKSAqIGRldEludjtcblx0XHR0ZVsgMTQgXSA9ICggbjE0ICogbjIyICogbjMxIC0gbjEyICogbjI0ICogbjMxIC0gbjE0ICogbjIxICogbjMyICsgbjExICogbjI0ICogbjMyICsgbjEyICogbjIxICogbjM0IC0gbjExICogbjIyICogbjM0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDE1IF0gPSAoIG4xMiAqIG4yMyAqIG4zMSAtIG4xMyAqIG4yMiAqIG4zMSArIG4xMyAqIG4yMSAqIG4zMiAtIG4xMSAqIG4yMyAqIG4zMiAtIG4xMiAqIG4yMSAqIG4zMyArIG4xMSAqIG4yMiAqIG4zMyApICogZGV0SW52O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzY2FsZTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgeCA9IHYueCwgeSA9IHYueSwgeiA9IHYuejtcblxuXHRcdHRlWyAwIF0gKj0geDsgdGVbIDQgXSAqPSB5OyB0ZVsgOCBdICo9IHo7XG5cdFx0dGVbIDEgXSAqPSB4OyB0ZVsgNSBdICo9IHk7IHRlWyA5IF0gKj0gejtcblx0XHR0ZVsgMiBdICo9IHg7IHRlWyA2IF0gKj0geTsgdGVbIDEwIF0gKj0gejtcblx0XHR0ZVsgMyBdICo9IHg7IHRlWyA3IF0gKj0geTsgdGVbIDExIF0gKj0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0TWF4U2NhbGVPbkF4aXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgc2NhbGVYU3EgPSB0ZVsgMCBdICogdGVbIDAgXSArIHRlWyAxIF0gKiB0ZVsgMSBdICsgdGVbIDIgXSAqIHRlWyAyIF07XG5cdFx0dmFyIHNjYWxlWVNxID0gdGVbIDQgXSAqIHRlWyA0IF0gKyB0ZVsgNSBdICogdGVbIDUgXSArIHRlWyA2IF0gKiB0ZVsgNiBdO1xuXHRcdHZhciBzY2FsZVpTcSA9IHRlWyA4IF0gKiB0ZVsgOCBdICsgdGVbIDkgXSAqIHRlWyA5IF0gKyB0ZVsgMTAgXSAqIHRlWyAxMCBdO1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggTWF0aC5tYXgoIHNjYWxlWFNxLCBzY2FsZVlTcSwgc2NhbGVaU3EgKSApO1xuXG5cdH0sXG5cblx0bWFrZVRyYW5zbGF0aW9uOiBmdW5jdGlvbiAoIHgsIHksIHogKSB7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0MSwgMCwgMCwgeCxcblx0XHRcdDAsIDEsIDAsIHksXG5cdFx0XHQwLCAwLCAxLCB6LFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVJvdGF0aW9uWDogZnVuY3Rpb24gKCB0aGV0YSApIHtcblxuXHRcdHZhciBjID0gTWF0aC5jb3MoIHRoZXRhICksIHMgPSBNYXRoLnNpbiggdGhldGEgKTtcblxuXHRcdHRoaXMuc2V0KFxuXG5cdFx0XHQxLCAwLCAwLCAwLFxuXHRcdFx0MCwgYywgLSBzLCAwLFxuXHRcdFx0MCwgcywgYywgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VSb3RhdGlvblk6IGZ1bmN0aW9uICggdGhldGEgKSB7XG5cblx0XHR2YXIgYyA9IE1hdGguY29zKCB0aGV0YSApLCBzID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0IGMsIDAsIHMsIDAsXG5cdFx0XHQgMCwgMSwgMCwgMCxcblx0XHRcdC0gcywgMCwgYywgMCxcblx0XHRcdCAwLCAwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlUm90YXRpb25aOiBmdW5jdGlvbiAoIHRoZXRhICkge1xuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggdGhldGEgKSwgcyA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdGMsIC0gcywgMCwgMCxcblx0XHRcdHMsIGMsIDAsIDAsXG5cdFx0XHQwLCAwLCAxLCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVJvdGF0aW9uQXhpczogZnVuY3Rpb24gKCBheGlzLCBhbmdsZSApIHtcblxuXHRcdC8vIEJhc2VkIG9uIGh0dHA6Ly93d3cuZ2FtZWRldi5uZXQvcmVmZXJlbmNlL2FydGljbGVzL2FydGljbGUxMTk5LmFzcFxuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggYW5nbGUgKTtcblx0XHR2YXIgcyA9IE1hdGguc2luKCBhbmdsZSApO1xuXHRcdHZhciB0ID0gMSAtIGM7XG5cdFx0dmFyIHggPSBheGlzLngsIHkgPSBheGlzLnksIHogPSBheGlzLno7XG5cdFx0dmFyIHR4ID0gdCAqIHgsIHR5ID0gdCAqIHk7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0dHggKiB4ICsgYywgdHggKiB5IC0gcyAqIHosIHR4ICogeiArIHMgKiB5LCAwLFxuXHRcdFx0dHggKiB5ICsgcyAqIHosIHR5ICogeSArIGMsIHR5ICogeiAtIHMgKiB4LCAwLFxuXHRcdFx0dHggKiB6IC0gcyAqIHksIHR5ICogeiArIHMgKiB4LCB0ICogeiAqIHogKyBjLCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdCByZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VTY2FsZTogZnVuY3Rpb24gKCB4LCB5LCB6ICkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdHgsIDAsIDAsIDAsXG5cdFx0XHQwLCB5LCAwLCAwLFxuXHRcdFx0MCwgMCwgeiwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VTaGVhcjogZnVuY3Rpb24gKCB4LCB5LCB6ICkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIHksIHosIDAsXG5cdFx0XHR4LCAxLCB6LCAwLFxuXHRcdFx0eCwgeSwgMSwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbXBvc2U6IGZ1bmN0aW9uICggcG9zaXRpb24sIHF1YXRlcm5pb24sIHNjYWxlICkge1xuXG5cdFx0dGhpcy5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbiggcXVhdGVybmlvbiApO1xuXHRcdHRoaXMuc2NhbGUoIHNjYWxlICk7XG5cdFx0dGhpcy5zZXRQb3NpdGlvbiggcG9zaXRpb24gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGVjb21wb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBkZWNvbXBvc2UoIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBzY2FsZSApIHtcblxuXHRcdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdFx0dmFyIHN4ID0gdmVjdG9yLnNldCggdGVbIDAgXSwgdGVbIDEgXSwgdGVbIDIgXSApLmxlbmd0aCgpO1xuXHRcdFx0dmFyIHN5ID0gdmVjdG9yLnNldCggdGVbIDQgXSwgdGVbIDUgXSwgdGVbIDYgXSApLmxlbmd0aCgpO1xuXHRcdFx0dmFyIHN6ID0gdmVjdG9yLnNldCggdGVbIDggXSwgdGVbIDkgXSwgdGVbIDEwIF0gKS5sZW5ndGgoKTtcblxuXHRcdFx0Ly8gaWYgZGV0ZXJtaW5lIGlzIG5lZ2F0aXZlLCB3ZSBuZWVkIHRvIGludmVydCBvbmUgc2NhbGVcblx0XHRcdHZhciBkZXQgPSB0aGlzLmRldGVybWluYW50KCk7XG5cdFx0XHRpZiAoIGRldCA8IDAgKSBzeCA9IC0gc3g7XG5cblx0XHRcdHBvc2l0aW9uLnggPSB0ZVsgMTIgXTtcblx0XHRcdHBvc2l0aW9uLnkgPSB0ZVsgMTMgXTtcblx0XHRcdHBvc2l0aW9uLnogPSB0ZVsgMTQgXTtcblxuXHRcdFx0Ly8gc2NhbGUgdGhlIHJvdGF0aW9uIHBhcnRcblx0XHRcdG1hdHJpeC5jb3B5KCB0aGlzICk7XG5cblx0XHRcdHZhciBpbnZTWCA9IDEgLyBzeDtcblx0XHRcdHZhciBpbnZTWSA9IDEgLyBzeTtcblx0XHRcdHZhciBpbnZTWiA9IDEgLyBzejtcblxuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyAwIF0gKj0gaW52U1g7XG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDEgXSAqPSBpbnZTWDtcblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgMiBdICo9IGludlNYO1xuXG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDQgXSAqPSBpbnZTWTtcblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgNSBdICo9IGludlNZO1xuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyA2IF0gKj0gaW52U1k7XG5cblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgOCBdICo9IGludlNaO1xuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyA5IF0gKj0gaW52U1o7XG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDEwIF0gKj0gaW52U1o7XG5cblx0XHRcdHF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtYXRyaXggKTtcblxuXHRcdFx0c2NhbGUueCA9IHN4O1xuXHRcdFx0c2NhbGUueSA9IHN5O1xuXHRcdFx0c2NhbGUueiA9IHN6O1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdG1ha2VQZXJzcGVjdGl2ZTogZnVuY3Rpb24gKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIHtcblxuXHRcdGlmICggZmFyID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tYWtlUGVyc3BlY3RpdmUoKSBoYXMgYmVlbiByZWRlZmluZWQgYW5kIGhhcyBhIG5ldyBzaWduYXR1cmUuIFBsZWFzZSBjaGVjayB0aGUgZG9jcy4nICk7XG5cblx0XHR9XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciB4ID0gMiAqIG5lYXIgLyAoIHJpZ2h0IC0gbGVmdCApO1xuXHRcdHZhciB5ID0gMiAqIG5lYXIgLyAoIHRvcCAtIGJvdHRvbSApO1xuXG5cdFx0dmFyIGEgPSAoIHJpZ2h0ICsgbGVmdCApIC8gKCByaWdodCAtIGxlZnQgKTtcblx0XHR2YXIgYiA9ICggdG9wICsgYm90dG9tICkgLyAoIHRvcCAtIGJvdHRvbSApO1xuXHRcdHZhciBjID0gLSAoIGZhciArIG5lYXIgKSAvICggZmFyIC0gbmVhciApO1xuXHRcdHZhciBkID0gLSAyICogZmFyICogbmVhciAvICggZmFyIC0gbmVhciApO1xuXG5cdFx0dGVbIDAgXSA9IHg7XHR0ZVsgNCBdID0gMDtcdHRlWyA4IF0gPSBhO1x0dGVbIDEyIF0gPSAwO1xuXHRcdHRlWyAxIF0gPSAwO1x0dGVbIDUgXSA9IHk7XHR0ZVsgOSBdID0gYjtcdHRlWyAxMyBdID0gMDtcblx0XHR0ZVsgMiBdID0gMDtcdHRlWyA2IF0gPSAwO1x0dGVbIDEwIF0gPSBjO1x0dGVbIDE0IF0gPSBkO1xuXHRcdHRlWyAzIF0gPSAwO1x0dGVbIDcgXSA9IDA7XHR0ZVsgMTEgXSA9IC0gMTtcdHRlWyAxNSBdID0gMDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZU9ydGhvZ3JhcGhpYzogZnVuY3Rpb24gKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIHcgPSAxLjAgLyAoIHJpZ2h0IC0gbGVmdCApO1xuXHRcdHZhciBoID0gMS4wIC8gKCB0b3AgLSBib3R0b20gKTtcblx0XHR2YXIgcCA9IDEuMCAvICggZmFyIC0gbmVhciApO1xuXG5cdFx0dmFyIHggPSAoIHJpZ2h0ICsgbGVmdCApICogdztcblx0XHR2YXIgeSA9ICggdG9wICsgYm90dG9tICkgKiBoO1xuXHRcdHZhciB6ID0gKCBmYXIgKyBuZWFyICkgKiBwO1xuXG5cdFx0dGVbIDAgXSA9IDIgKiB3O1x0dGVbIDQgXSA9IDA7XHR0ZVsgOCBdID0gMDtcdHRlWyAxMiBdID0gLSB4O1xuXHRcdHRlWyAxIF0gPSAwO1x0dGVbIDUgXSA9IDIgKiBoO1x0dGVbIDkgXSA9IDA7XHR0ZVsgMTMgXSA9IC0geTtcblx0XHR0ZVsgMiBdID0gMDtcdHRlWyA2IF0gPSAwO1x0dGVbIDEwIF0gPSAtIDIgKiBwO1x0dGVbIDE0IF0gPSAtIHo7XG5cdFx0dGVbIDMgXSA9IDA7XHR0ZVsgNyBdID0gMDtcdHRlWyAxMSBdID0gMDtcdHRlWyAxNSBdID0gMTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIG1lID0gbWF0cml4LmVsZW1lbnRzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgMTY7IGkgKysgKSB7XG5cblx0XHRcdGlmICggdGVbIGkgXSAhPT0gbWVbIGkgXSApIHJldHVybiBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDE2OyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmVsZW1lbnRzWyBpIF0gPSBhcnJheVsgaSArIG9mZnNldCBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRlWyAwIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRlWyAxIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRlWyAyIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRlWyAzIF07XG5cblx0XHRhcnJheVsgb2Zmc2V0ICsgNCBdID0gdGVbIDQgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNSBdID0gdGVbIDUgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNiBdID0gdGVbIDYgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNyBdID0gdGVbIDcgXTtcblxuXHRcdGFycmF5WyBvZmZzZXQgKyA4IF0gPSB0ZVsgOCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA5IF0gPSB0ZVsgOSBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxMCBdID0gdGVbIDEwIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDExIF0gPSB0ZVsgMTEgXTtcblxuXHRcdGFycmF5WyBvZmZzZXQgKyAxMiBdID0gdGVbIDEyIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDEzIF0gPSB0ZVsgMTMgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTQgXSA9IHRlWyAxNCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxNSBdID0gdGVbIDE1IF07XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBRdWF0ZXJuaW9uKCB4LCB5LCB6LCB3ICkge1xuXG5cdHRoaXMuX3ggPSB4IHx8IDA7XG5cdHRoaXMuX3kgPSB5IHx8IDA7XG5cdHRoaXMuX3ogPSB6IHx8IDA7XG5cdHRoaXMuX3cgPSAoIHcgIT09IHVuZGVmaW5lZCApID8gdyA6IDE7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUXVhdGVybmlvbiwge1xuXG5cdHNsZXJwOiBmdW5jdGlvbiAoIHFhLCBxYiwgcW0sIHQgKSB7XG5cblx0XHRyZXR1cm4gcW0uY29weSggcWEgKS5zbGVycCggcWIsIHQgKTtcblxuXHR9LFxuXG5cdHNsZXJwRmxhdDogZnVuY3Rpb24gKCBkc3QsIGRzdE9mZnNldCwgc3JjMCwgc3JjT2Zmc2V0MCwgc3JjMSwgc3JjT2Zmc2V0MSwgdCApIHtcblxuXHRcdC8vIGZ1enotZnJlZSwgYXJyYXktYmFzZWQgUXVhdGVybmlvbiBTTEVSUCBvcGVyYXRpb25cblxuXHRcdHZhciB4MCA9IHNyYzBbIHNyY09mZnNldDAgKyAwIF0sXG5cdFx0XHR5MCA9IHNyYzBbIHNyY09mZnNldDAgKyAxIF0sXG5cdFx0XHR6MCA9IHNyYzBbIHNyY09mZnNldDAgKyAyIF0sXG5cdFx0XHR3MCA9IHNyYzBbIHNyY09mZnNldDAgKyAzIF0sXG5cblx0XHRcdHgxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDAgXSxcblx0XHRcdHkxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDEgXSxcblx0XHRcdHoxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDIgXSxcblx0XHRcdHcxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDMgXTtcblxuXHRcdGlmICggdzAgIT09IHcxIHx8IHgwICE9PSB4MSB8fCB5MCAhPT0geTEgfHwgejAgIT09IHoxICkge1xuXG5cdFx0XHR2YXIgcyA9IDEgLSB0LFxuXG5cdFx0XHRcdGNvcyA9IHgwICogeDEgKyB5MCAqIHkxICsgejAgKiB6MSArIHcwICogdzEsXG5cblx0XHRcdFx0ZGlyID0gKCBjb3MgPj0gMCA/IDEgOiAtIDEgKSxcblx0XHRcdFx0c3FyU2luID0gMSAtIGNvcyAqIGNvcztcblxuXHRcdFx0Ly8gU2tpcCB0aGUgU2xlcnAgZm9yIHRpbnkgc3RlcHMgdG8gYXZvaWQgbnVtZXJpYyBwcm9ibGVtczpcblx0XHRcdGlmICggc3FyU2luID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0dmFyIHNpbiA9IE1hdGguc3FydCggc3FyU2luICksXG5cdFx0XHRcdFx0bGVuID0gTWF0aC5hdGFuMiggc2luLCBjb3MgKiBkaXIgKTtcblxuXHRcdFx0XHRzID0gTWF0aC5zaW4oIHMgKiBsZW4gKSAvIHNpbjtcblx0XHRcdFx0dCA9IE1hdGguc2luKCB0ICogbGVuICkgLyBzaW47XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHREaXIgPSB0ICogZGlyO1xuXG5cdFx0XHR4MCA9IHgwICogcyArIHgxICogdERpcjtcblx0XHRcdHkwID0geTAgKiBzICsgeTEgKiB0RGlyO1xuXHRcdFx0ejAgPSB6MCAqIHMgKyB6MSAqIHREaXI7XG5cdFx0XHR3MCA9IHcwICogcyArIHcxICogdERpcjtcblxuXHRcdFx0Ly8gTm9ybWFsaXplIGluIGNhc2Ugd2UganVzdCBkaWQgYSBsZXJwOlxuXHRcdFx0aWYgKCBzID09PSAxIC0gdCApIHtcblxuXHRcdFx0XHR2YXIgZiA9IDEgLyBNYXRoLnNxcnQoIHgwICogeDAgKyB5MCAqIHkwICsgejAgKiB6MCArIHcwICogdzAgKTtcblxuXHRcdFx0XHR4MCAqPSBmO1xuXHRcdFx0XHR5MCAqPSBmO1xuXHRcdFx0XHR6MCAqPSBmO1xuXHRcdFx0XHR3MCAqPSBmO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRkc3RbIGRzdE9mZnNldCBdID0geDA7XG5cdFx0ZHN0WyBkc3RPZmZzZXQgKyAxIF0gPSB5MDtcblx0XHRkc3RbIGRzdE9mZnNldCArIDIgXSA9IHowO1xuXHRcdGRzdFsgZHN0T2Zmc2V0ICsgMyBdID0gdzA7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBRdWF0ZXJuaW9uLnByb3RvdHlwZSwge1xuXG5cdHg6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5feDtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0eToge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLl95O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy5feSA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR6OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3o7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl96ID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHc6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fdztcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3cgPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBRdWF0ZXJuaW9uLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCB4LCB5LCB6LCB3ICkge1xuXG5cdFx0dGhpcy5feCA9IHg7XG5cdFx0dGhpcy5feSA9IHk7XG5cdFx0dGhpcy5feiA9IHo7XG5cdFx0dGhpcy5fdyA9IHc7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiwgdGhpcy5fdyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBxdWF0ZXJuaW9uICkge1xuXG5cdFx0dGhpcy5feCA9IHF1YXRlcm5pb24ueDtcblx0XHR0aGlzLl95ID0gcXVhdGVybmlvbi55O1xuXHRcdHRoaXMuX3ogPSBxdWF0ZXJuaW9uLno7XG5cdFx0dGhpcy5fdyA9IHF1YXRlcm5pb24udztcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tRXVsZXI6IGZ1bmN0aW9uICggZXVsZXIsIHVwZGF0ZSApIHtcblxuXHRcdGlmICggISAoIGV1bGVyICYmIGV1bGVyLmlzRXVsZXIgKSApIHtcblxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuUXVhdGVybmlvbjogLnNldEZyb21FdWxlcigpIG5vdyBleHBlY3RzIGFuIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuJyApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHggPSBldWxlci5feCwgeSA9IGV1bGVyLl95LCB6ID0gZXVsZXIuX3osIG9yZGVyID0gZXVsZXIub3JkZXI7XG5cblx0XHQvLyBodHRwOi8vd3d3Lm1hdGh3b3Jrcy5jb20vbWF0bGFiY2VudHJhbC9maWxlZXhjaGFuZ2UvXG5cdFx0Ly8gXHQyMDY5Ni1mdW5jdGlvbi10by1jb252ZXJ0LWJldHdlZW4tZGNtLWV1bGVyLWFuZ2xlcy1xdWF0ZXJuaW9ucy1hbmQtZXVsZXItdmVjdG9ycy9cblx0XHQvL1x0Y29udGVudC9TcGluQ2FsYy5tXG5cblx0XHR2YXIgY29zID0gTWF0aC5jb3M7XG5cdFx0dmFyIHNpbiA9IE1hdGguc2luO1xuXG5cdFx0dmFyIGMxID0gY29zKCB4IC8gMiApO1xuXHRcdHZhciBjMiA9IGNvcyggeSAvIDIgKTtcblx0XHR2YXIgYzMgPSBjb3MoIHogLyAyICk7XG5cblx0XHR2YXIgczEgPSBzaW4oIHggLyAyICk7XG5cdFx0dmFyIHMyID0gc2luKCB5IC8gMiApO1xuXHRcdHZhciBzMyA9IHNpbiggeiAvIDIgKTtcblxuXHRcdGlmICggb3JkZXIgPT09ICdYWVonICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdZWFonICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdaWFknICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdaWVgnICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdZWlgnICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdYWlknICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB1cGRhdGUgIT09IGZhbHNlICkgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21BeGlzQW5nbGU6IGZ1bmN0aW9uICggYXhpcywgYW5nbGUgKSB7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvYW5nbGVUb1F1YXRlcm5pb24vaW5kZXguaHRtXG5cblx0XHQvLyBhc3N1bWVzIGF4aXMgaXMgbm9ybWFsaXplZFxuXG5cdFx0dmFyIGhhbGZBbmdsZSA9IGFuZ2xlIC8gMiwgcyA9IE1hdGguc2luKCBoYWxmQW5nbGUgKTtcblxuXHRcdHRoaXMuX3ggPSBheGlzLnggKiBzO1xuXHRcdHRoaXMuX3kgPSBheGlzLnkgKiBzO1xuXHRcdHRoaXMuX3ogPSBheGlzLnogKiBzO1xuXHRcdHRoaXMuX3cgPSBNYXRoLmNvcyggaGFsZkFuZ2xlICk7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVJvdGF0aW9uTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvbWF0cml4VG9RdWF0ZXJuaW9uL2luZGV4Lmh0bVxuXG5cdFx0Ly8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZClcblxuXHRcdHZhciB0ZSA9IG0uZWxlbWVudHMsXG5cblx0XHRcdG0xMSA9IHRlWyAwIF0sIG0xMiA9IHRlWyA0IF0sIG0xMyA9IHRlWyA4IF0sXG5cdFx0XHRtMjEgPSB0ZVsgMSBdLCBtMjIgPSB0ZVsgNSBdLCBtMjMgPSB0ZVsgOSBdLFxuXHRcdFx0bTMxID0gdGVbIDIgXSwgbTMyID0gdGVbIDYgXSwgbTMzID0gdGVbIDEwIF0sXG5cblx0XHRcdHRyYWNlID0gbTExICsgbTIyICsgbTMzLFxuXHRcdFx0cztcblxuXHRcdGlmICggdHJhY2UgPiAwICkge1xuXG5cdFx0XHRzID0gMC41IC8gTWF0aC5zcXJ0KCB0cmFjZSArIDEuMCApO1xuXG5cdFx0XHR0aGlzLl93ID0gMC4yNSAvIHM7XG5cdFx0XHR0aGlzLl94ID0gKCBtMzIgLSBtMjMgKSAqIHM7XG5cdFx0XHR0aGlzLl95ID0gKCBtMTMgLSBtMzEgKSAqIHM7XG5cdFx0XHR0aGlzLl96ID0gKCBtMjEgLSBtMTIgKSAqIHM7XG5cblx0XHR9IGVsc2UgaWYgKCBtMTEgPiBtMjIgJiYgbTExID4gbTMzICkge1xuXG5cdFx0XHRzID0gMi4wICogTWF0aC5zcXJ0KCAxLjAgKyBtMTEgLSBtMjIgLSBtMzMgKTtcblxuXHRcdFx0dGhpcy5fdyA9ICggbTMyIC0gbTIzICkgLyBzO1xuXHRcdFx0dGhpcy5feCA9IDAuMjUgKiBzO1xuXHRcdFx0dGhpcy5feSA9ICggbTEyICsgbTIxICkgLyBzO1xuXHRcdFx0dGhpcy5feiA9ICggbTEzICsgbTMxICkgLyBzO1xuXG5cdFx0fSBlbHNlIGlmICggbTIyID4gbTMzICkge1xuXG5cdFx0XHRzID0gMi4wICogTWF0aC5zcXJ0KCAxLjAgKyBtMjIgLSBtMTEgLSBtMzMgKTtcblxuXHRcdFx0dGhpcy5fdyA9ICggbTEzIC0gbTMxICkgLyBzO1xuXHRcdFx0dGhpcy5feCA9ICggbTEyICsgbTIxICkgLyBzO1xuXHRcdFx0dGhpcy5feSA9IDAuMjUgKiBzO1xuXHRcdFx0dGhpcy5feiA9ICggbTIzICsgbTMyICkgLyBzO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTMzIC0gbTExIC0gbTIyICk7XG5cblx0XHRcdHRoaXMuX3cgPSAoIG0yMSAtIG0xMiApIC8gcztcblx0XHRcdHRoaXMuX3ggPSAoIG0xMyArIG0zMSApIC8gcztcblx0XHRcdHRoaXMuX3kgPSAoIG0yMyArIG0zMiApIC8gcztcblx0XHRcdHRoaXMuX3ogPSAwLjI1ICogcztcblxuXHRcdH1cblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tVW5pdFZlY3RvcnM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIGFzc3VtZXMgZGlyZWN0aW9uIHZlY3RvcnMgdkZyb20gYW5kIHZUbyBhcmUgbm9ybWFsaXplZFxuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgcjtcblxuXHRcdHZhciBFUFMgPSAwLjAwMDAwMTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRGcm9tVW5pdFZlY3RvcnMoIHZGcm9tLCB2VG8gKSB7XG5cblx0XHRcdGlmICggdjEgPT09IHVuZGVmaW5lZCApIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0ciA9IHZGcm9tLmRvdCggdlRvICkgKyAxO1xuXG5cdFx0XHRpZiAoIHIgPCBFUFMgKSB7XG5cblx0XHRcdFx0ciA9IDA7XG5cblx0XHRcdFx0aWYgKCBNYXRoLmFicyggdkZyb20ueCApID4gTWF0aC5hYnMoIHZGcm9tLnogKSApIHtcblxuXHRcdFx0XHRcdHYxLnNldCggLSB2RnJvbS55LCB2RnJvbS54LCAwICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHYxLnNldCggMCwgLSB2RnJvbS56LCB2RnJvbS55ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHYxLmNyb3NzVmVjdG9ycyggdkZyb20sIHZUbyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3ggPSB2MS54O1xuXHRcdFx0dGhpcy5feSA9IHYxLnk7XG5cdFx0XHR0aGlzLl96ID0gdjEuejtcblx0XHRcdHRoaXMuX3cgPSByO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludmVyc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHF1YXRlcm5pb24gaXMgYXNzdW1lZCB0byBoYXZlIHVuaXQgbGVuZ3RoXG5cblx0XHRyZXR1cm4gdGhpcy5jb25qdWdhdGUoKTtcblxuXHR9LFxuXG5cdGNvbmp1Z2F0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5feCAqPSAtIDE7XG5cdFx0dGhpcy5feSAqPSAtIDE7XG5cdFx0dGhpcy5feiAqPSAtIDE7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZG90OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5feCAqIHYuX3ggKyB0aGlzLl95ICogdi5feSArIHRoaXMuX3ogKiB2Ll96ICsgdGhpcy5fdyAqIHYuX3c7XG5cblx0fSxcblxuXHRsZW5ndGhTcTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3ggKiB0aGlzLl94ICsgdGhpcy5feSAqIHRoaXMuX3kgKyB0aGlzLl96ICogdGhpcy5feiArIHRoaXMuX3cgKiB0aGlzLl93O1xuXG5cdH0sXG5cblx0bGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLl94ICogdGhpcy5feCArIHRoaXMuX3kgKiB0aGlzLl95ICsgdGhpcy5feiAqIHRoaXMuX3ogKyB0aGlzLl93ICogdGhpcy5fdyApO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbCA9IHRoaXMubGVuZ3RoKCk7XG5cblx0XHRpZiAoIGwgPT09IDAgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSAwO1xuXHRcdFx0dGhpcy5feSA9IDA7XG5cdFx0XHR0aGlzLl96ID0gMDtcblx0XHRcdHRoaXMuX3cgPSAxO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bCA9IDEgLyBsO1xuXG5cdFx0XHR0aGlzLl94ID0gdGhpcy5feCAqIGw7XG5cdFx0XHR0aGlzLl95ID0gdGhpcy5feSAqIGw7XG5cdFx0XHR0aGlzLl96ID0gdGhpcy5feiAqIGw7XG5cdFx0XHR0aGlzLl93ID0gdGhpcy5fdyAqIGw7XG5cblx0XHR9XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggcSwgcCApIHtcblxuXHRcdGlmICggcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseVF1YXRlcm5pb25zKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKCBxLCBwICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKCB0aGlzLCBxICk7XG5cblx0fSxcblxuXHRwcmVtdWx0aXBseTogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyggcSwgdGhpcyApO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlRdWF0ZXJuaW9uczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0Ly8gZnJvbSBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL3JlYWxOb3JtZWRBbGdlYnJhL3F1YXRlcm5pb25zL2NvZGUvaW5kZXguaHRtXG5cblx0XHR2YXIgcWF4ID0gYS5feCwgcWF5ID0gYS5feSwgcWF6ID0gYS5feiwgcWF3ID0gYS5fdztcblx0XHR2YXIgcWJ4ID0gYi5feCwgcWJ5ID0gYi5feSwgcWJ6ID0gYi5feiwgcWJ3ID0gYi5fdztcblxuXHRcdHRoaXMuX3ggPSBxYXggKiBxYncgKyBxYXcgKiBxYnggKyBxYXkgKiBxYnogLSBxYXogKiBxYnk7XG5cdFx0dGhpcy5feSA9IHFheSAqIHFidyArIHFhdyAqIHFieSArIHFheiAqIHFieCAtIHFheCAqIHFiejtcblx0XHR0aGlzLl96ID0gcWF6ICogcWJ3ICsgcWF3ICogcWJ6ICsgcWF4ICogcWJ5IC0gcWF5ICogcWJ4O1xuXHRcdHRoaXMuX3cgPSBxYXcgKiBxYncgLSBxYXggKiBxYnggLSBxYXkgKiBxYnkgLSBxYXogKiBxYno7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2xlcnA6IGZ1bmN0aW9uICggcWIsIHQgKSB7XG5cblx0XHRpZiAoIHQgPT09IDAgKSByZXR1cm4gdGhpcztcblx0XHRpZiAoIHQgPT09IDEgKSByZXR1cm4gdGhpcy5jb3B5KCBxYiApO1xuXG5cdFx0dmFyIHggPSB0aGlzLl94LCB5ID0gdGhpcy5feSwgeiA9IHRoaXMuX3osIHcgPSB0aGlzLl93O1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9yZWFsTm9ybWVkQWxnZWJyYS9xdWF0ZXJuaW9ucy9zbGVycC9cblxuXHRcdHZhciBjb3NIYWxmVGhldGEgPSB3ICogcWIuX3cgKyB4ICogcWIuX3ggKyB5ICogcWIuX3kgKyB6ICogcWIuX3o7XG5cblx0XHRpZiAoIGNvc0hhbGZUaGV0YSA8IDAgKSB7XG5cblx0XHRcdHRoaXMuX3cgPSAtIHFiLl93O1xuXHRcdFx0dGhpcy5feCA9IC0gcWIuX3g7XG5cdFx0XHR0aGlzLl95ID0gLSBxYi5feTtcblx0XHRcdHRoaXMuX3ogPSAtIHFiLl96O1xuXG5cdFx0XHRjb3NIYWxmVGhldGEgPSAtIGNvc0hhbGZUaGV0YTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuY29weSggcWIgKTtcblxuXHRcdH1cblxuXHRcdGlmICggY29zSGFsZlRoZXRhID49IDEuMCApIHtcblxuXHRcdFx0dGhpcy5fdyA9IHc7XG5cdFx0XHR0aGlzLl94ID0geDtcblx0XHRcdHRoaXMuX3kgPSB5O1xuXHRcdFx0dGhpcy5feiA9IHo7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHNpbkhhbGZUaGV0YSA9IE1hdGguc3FydCggMS4wIC0gY29zSGFsZlRoZXRhICogY29zSGFsZlRoZXRhICk7XG5cblx0XHRpZiAoIE1hdGguYWJzKCBzaW5IYWxmVGhldGEgKSA8IDAuMDAxICkge1xuXG5cdFx0XHR0aGlzLl93ID0gMC41ICogKCB3ICsgdGhpcy5fdyApO1xuXHRcdFx0dGhpcy5feCA9IDAuNSAqICggeCArIHRoaXMuX3ggKTtcblx0XHRcdHRoaXMuX3kgPSAwLjUgKiAoIHkgKyB0aGlzLl95ICk7XG5cdFx0XHR0aGlzLl96ID0gMC41ICogKCB6ICsgdGhpcy5feiApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblxuXHRcdHZhciBoYWxmVGhldGEgPSBNYXRoLmF0YW4yKCBzaW5IYWxmVGhldGEsIGNvc0hhbGZUaGV0YSApO1xuXHRcdHZhciByYXRpb0EgPSBNYXRoLnNpbiggKCAxIC0gdCApICogaGFsZlRoZXRhICkgLyBzaW5IYWxmVGhldGEsXG5cdFx0XHRyYXRpb0IgPSBNYXRoLnNpbiggdCAqIGhhbGZUaGV0YSApIC8gc2luSGFsZlRoZXRhO1xuXG5cdFx0dGhpcy5fdyA9ICggdyAqIHJhdGlvQSArIHRoaXMuX3cgKiByYXRpb0IgKTtcblx0XHR0aGlzLl94ID0gKCB4ICogcmF0aW9BICsgdGhpcy5feCAqIHJhdGlvQiApO1xuXHRcdHRoaXMuX3kgPSAoIHkgKiByYXRpb0EgKyB0aGlzLl95ICogcmF0aW9CICk7XG5cdFx0dGhpcy5feiA9ICggeiAqIHJhdGlvQSArIHRoaXMuX3ogKiByYXRpb0IgKTtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggcXVhdGVybmlvbiApIHtcblxuXHRcdHJldHVybiAoIHF1YXRlcm5pb24uX3ggPT09IHRoaXMuX3ggKSAmJiAoIHF1YXRlcm5pb24uX3kgPT09IHRoaXMuX3kgKSAmJiAoIHF1YXRlcm5pb24uX3ogPT09IHRoaXMuX3ogKSAmJiAoIHF1YXRlcm5pb24uX3cgPT09IHRoaXMuX3cgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLl94ID0gYXJyYXlbIG9mZnNldCBdO1xuXHRcdHRoaXMuX3kgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMuX3ogPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXHRcdHRoaXMuX3cgPSBhcnJheVsgb2Zmc2V0ICsgMyBdO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLl94O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLl95O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLl96O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLl93O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0b25DaGFuZ2U6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0b25DaGFuZ2VDYWxsYmFjazogZnVuY3Rpb24gKCkge31cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGtpbGUgLyBodHRwOi8va2lsZS5zdHJhdmFnYW56YS5vcmcvXG4gKiBAYXV0aG9yIHBoaWxvZ2IgLyBodHRwOi8vYmxvZy50aGVqaXQub3JnL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgZWdyYWV0aGVyIC8gaHR0cDovL2VncmFldGhlci5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBWZWN0b3IzKCB4LCB5LCB6ICkge1xuXG5cdHRoaXMueCA9IHggfHwgMDtcblx0dGhpcy55ID0geSB8fCAwO1xuXHR0aGlzLnogPSB6IHx8IDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yMy5wcm90b3R5cGUsIHtcblxuXHRpc1ZlY3RvcjM6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHksIHogKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXHRcdHRoaXMueSA9IHk7XG5cdFx0dGhpcy56ID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCA9IHNjYWxhcjtcblx0XHR0aGlzLnkgPSBzY2FsYXI7XG5cdFx0dGhpcy56ID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYOiBmdW5jdGlvbiAoIHggKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRZOiBmdW5jdGlvbiAoIHkgKSB7XG5cblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRaOiBmdW5jdGlvbiAoIHogKSB7XG5cblx0XHR0aGlzLnogPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXgsIHZhbHVlICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogdGhpcy54ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAxOiB0aGlzLnkgPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDI6IHRoaXMueiA9IHZhbHVlOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHJldHVybiB0aGlzLng7XG5cdFx0XHRjYXNlIDE6IHJldHVybiB0aGlzLnk7XG5cdFx0XHRjYXNlIDI6IHJldHVybiB0aGlzLno7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy54LCB0aGlzLnksIHRoaXMueiApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gdi54O1xuXHRcdHRoaXMueSA9IHYueTtcblx0XHR0aGlzLnogPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGRWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggKz0gdi54O1xuXHRcdHRoaXMueSArPSB2Lnk7XG5cdFx0dGhpcy56ICs9IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gcztcblx0XHR0aGlzLnkgKz0gcztcblx0XHR0aGlzLnogKz0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54ICsgYi54O1xuXHRcdHRoaXMueSA9IGEueSArIGIueTtcblx0XHR0aGlzLnogPSBhLnogKyBiLno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFNjYWxlZFZlY3RvcjogZnVuY3Rpb24gKCB2LCBzICkge1xuXG5cdFx0dGhpcy54ICs9IHYueCAqIHM7XG5cdFx0dGhpcy55ICs9IHYueSAqIHM7XG5cdFx0dGhpcy56ICs9IHYueiAqIHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YjogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggLT0gdi54O1xuXHRcdHRoaXMueSAtPSB2Lnk7XG5cdFx0dGhpcy56IC09IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggLT0gcztcblx0XHR0aGlzLnkgLT0gcztcblx0XHR0aGlzLnogLT0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54IC0gYi54O1xuXHRcdHRoaXMueSA9IGEueSAtIGIueTtcblx0XHR0aGlzLnogPSBhLnogLSBiLno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5OiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCAqPSB2Lng7XG5cdFx0dGhpcy55ICo9IHYueTtcblx0XHR0aGlzLnogKj0gdi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnggKj0gc2NhbGFyO1xuXHRcdHRoaXMueSAqPSBzY2FsYXI7XG5cdFx0dGhpcy56ICo9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggKiBiLng7XG5cdFx0dGhpcy55ID0gYS55ICogYi55O1xuXHRcdHRoaXMueiA9IGEueiAqIGIuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlFdWxlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGFwcGx5RXVsZXIoIGV1bGVyICkge1xuXG5cdFx0XHRpZiAoICEgKCBldWxlciAmJiBldWxlci5pc0V1bGVyICkgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlZlY3RvcjM6IC5hcHBseUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4nICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uLnNldEZyb21FdWxlciggZXVsZXIgKSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0YXBwbHlBeGlzQW5nbGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBhcHBseUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRhcHBseU1hdHJpeDM6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56O1xuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyAzIF0gKiB5ICsgZVsgNiBdICogejtcblx0XHR0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDcgXSAqIHo7XG5cdFx0dGhpcy56ID0gZVsgMiBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA4IF0gKiB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56O1xuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHZhciB3ID0gMSAvICggZVsgMyBdICogeCArIGVbIDcgXSAqIHkgKyBlWyAxMSBdICogeiArIGVbIDE1IF0gKTtcblxuXHRcdHRoaXMueCA9ICggZVsgMCBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA4IF0gKiB6ICsgZVsgMTIgXSApICogdztcblx0XHR0aGlzLnkgPSAoIGVbIDEgXSAqIHggKyBlWyA1IF0gKiB5ICsgZVsgOSBdICogeiArIGVbIDEzIF0gKSAqIHc7XG5cdFx0dGhpcy56ID0gKCBlWyAyIF0gKiB4ICsgZVsgNiBdICogeSArIGVbIDEwIF0gKiB6ICsgZVsgMTQgXSApICogdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlRdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHR2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejtcblx0XHR2YXIgcXggPSBxLngsIHF5ID0gcS55LCBxeiA9IHEueiwgcXcgPSBxLnc7XG5cblx0XHQvLyBjYWxjdWxhdGUgcXVhdCAqIHZlY3RvclxuXG5cdFx0dmFyIGl4ID0gcXcgKiB4ICsgcXkgKiB6IC0gcXogKiB5O1xuXHRcdHZhciBpeSA9IHF3ICogeSArIHF6ICogeCAtIHF4ICogejtcblx0XHR2YXIgaXogPSBxdyAqIHogKyBxeCAqIHkgLSBxeSAqIHg7XG5cdFx0dmFyIGl3ID0gLSBxeCAqIHggLSBxeSAqIHkgLSBxeiAqIHo7XG5cblx0XHQvLyBjYWxjdWxhdGUgcmVzdWx0ICogaW52ZXJzZSBxdWF0XG5cblx0XHR0aGlzLnggPSBpeCAqIHF3ICsgaXcgKiAtIHF4ICsgaXkgKiAtIHF6IC0gaXogKiAtIHF5O1xuXHRcdHRoaXMueSA9IGl5ICogcXcgKyBpdyAqIC0gcXkgKyBpeiAqIC0gcXggLSBpeCAqIC0gcXo7XG5cdFx0dGhpcy56ID0gaXogKiBxdyArIGl3ICogLSBxeiArIGl4ICogLSBxeSAtIGl5ICogLSBxeDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cHJvamVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcHJvamVjdCggY2FtZXJhICkge1xuXG5cdFx0XHRtYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIG1hdHJpeC5nZXRJbnZlcnNlKCBjYW1lcmEubWF0cml4V29ybGQgKSApO1xuXHRcdFx0cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHVucHJvamVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdW5wcm9qZWN0KCBjYW1lcmEgKSB7XG5cblx0XHRcdG1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEubWF0cml4V29ybGQsIG1hdHJpeC5nZXRJbnZlcnNlKCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNmb3JtRGlyZWN0aW9uOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHQvLyBpbnB1dDogVEhSRUUuTWF0cml4NCBhZmZpbmUgbWF0cml4XG5cdFx0Ly8gdmVjdG9yIGludGVycHJldGVkIGFzIGEgZGlyZWN0aW9uXG5cblx0XHR2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejtcblx0XHR2YXIgZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0aGlzLnggPSBlWyAwIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDggXSAqIHo7XG5cdFx0dGhpcy55ID0gZVsgMSBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA5IF0gKiB6O1xuXHRcdHRoaXMueiA9IGVbIDIgXSAqIHggKyBlWyA2IF0gKiB5ICsgZVsgMTAgXSAqIHo7XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKTtcblxuXHR9LFxuXG5cdGRpdmlkZTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54IC89IHYueDtcblx0XHR0aGlzLnkgLz0gdi55O1xuXHRcdHRoaXMueiAvPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpdmlkZVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhciggMSAvIHNjYWxhciApO1xuXG5cdH0sXG5cblx0bWluOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1pbiggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1pbiggdGhpcy55LCB2LnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1pbiggdGhpcy56LCB2LnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWF4OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggdGhpcy55LCB2LnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1heCggdGhpcy56LCB2LnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXA6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHQvLyBhc3N1bWVzIG1pbiA8IG1heCwgY29tcG9uZW50d2lzZVxuXG5cdFx0dGhpcy54ID0gTWF0aC5tYXgoIG1pbi54LCBNYXRoLm1pbiggbWF4LngsIHRoaXMueCApICk7XG5cdFx0dGhpcy55ID0gTWF0aC5tYXgoIG1pbi55LCBNYXRoLm1pbiggbWF4LnksIHRoaXMueSApICk7XG5cdFx0dGhpcy56ID0gTWF0aC5tYXgoIG1pbi56LCBNYXRoLm1pbiggbWF4LnosIHRoaXMueiApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsYW1wU2NhbGFyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWluID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbWF4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjbGFtcFNjYWxhciggbWluVmFsLCBtYXhWYWwgKSB7XG5cblx0XHRcdG1pbi5zZXQoIG1pblZhbCwgbWluVmFsLCBtaW5WYWwgKTtcblx0XHRcdG1heC5zZXQoIG1heFZhbCwgbWF4VmFsLCBtYXhWYWwgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuY2xhbXAoIG1pbiwgbWF4ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbGFtcExlbmd0aDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCBsZW5ndGggfHwgMSApLm11bHRpcGx5U2NhbGFyKCBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCBsZW5ndGggKSApICk7XG5cblx0fSxcblxuXHRmbG9vcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5mbG9vciggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5mbG9vciggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5mbG9vciggdGhpcy56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNlaWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguY2VpbCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5jZWlsKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLmNlaWwoIHRoaXMueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3VuZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5yb3VuZCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5yb3VuZCggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5yb3VuZCggdGhpcy56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kVG9aZXJvOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSAoIHRoaXMueCA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy54ICkgOiBNYXRoLmZsb29yKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSAoIHRoaXMueSA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy55ICkgOiBNYXRoLmZsb29yKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSAoIHRoaXMueiA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy56ICkgOiBNYXRoLmZsb29yKCB0aGlzLnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bmVnYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSAtIHRoaXMueDtcblx0XHR0aGlzLnkgPSAtIHRoaXMueTtcblx0XHR0aGlzLnogPSAtIHRoaXMuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZG90OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdi54ICsgdGhpcy55ICogdi55ICsgdGhpcy56ICogdi56O1xuXG5cdH0sXG5cblx0Ly8gVE9ETyBsZW5ndGhTcXVhcmVkP1xuXG5cdGxlbmd0aFNxOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56O1xuXG5cdH0sXG5cblx0bGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKTtcblxuXHR9LFxuXG5cdG1hbmhhdHRhbkxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGguYWJzKCB0aGlzLnkgKSArIE1hdGguYWJzKCB0aGlzLnogKTtcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCB0aGlzLmxlbmd0aCgpIHx8IDEgKTtcblxuXHR9LFxuXG5cdHNldExlbmd0aDogZnVuY3Rpb24gKCBsZW5ndGggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggbGVuZ3RoICk7XG5cblx0fSxcblxuXHRsZXJwOiBmdW5jdGlvbiAoIHYsIGFscGhhICkge1xuXG5cdFx0dGhpcy54ICs9ICggdi54IC0gdGhpcy54ICkgKiBhbHBoYTtcblx0XHR0aGlzLnkgKz0gKCB2LnkgLSB0aGlzLnkgKSAqIGFscGhhO1xuXHRcdHRoaXMueiArPSAoIHYueiAtIHRoaXMueiApICogYWxwaGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxlcnBWZWN0b3JzOiBmdW5jdGlvbiAoIHYxLCB2MiwgYWxwaGEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2MiwgdjEgKS5tdWx0aXBseVNjYWxhciggYWxwaGEgKS5hZGQoIHYxICk7XG5cblx0fSxcblxuXHRjcm9zczogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5jcm9zcygpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmNyb3NzVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5jcm9zc1ZlY3RvcnMoIHRoaXMsIHYgKTtcblxuXHR9LFxuXG5cdGNyb3NzVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dmFyIGF4ID0gYS54LCBheSA9IGEueSwgYXogPSBhLno7XG5cdFx0dmFyIGJ4ID0gYi54LCBieSA9IGIueSwgYnogPSBiLno7XG5cblx0XHR0aGlzLnggPSBheSAqIGJ6IC0gYXogKiBieTtcblx0XHR0aGlzLnkgPSBheiAqIGJ4IC0gYXggKiBiejtcblx0XHR0aGlzLnogPSBheCAqIGJ5IC0gYXkgKiBieDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cHJvamVjdE9uVmVjdG9yOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdHZhciBzY2FsYXIgPSB2ZWN0b3IuZG90KCB0aGlzICkgLyB2ZWN0b3IubGVuZ3RoU3EoKTtcblxuXHRcdHJldHVybiB0aGlzLmNvcHkoIHZlY3RvciApLm11bHRpcGx5U2NhbGFyKCBzY2FsYXIgKTtcblxuXHR9LFxuXG5cdHByb2plY3RPblBsYW5lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHByb2plY3RPblBsYW5lKCBwbGFuZU5vcm1hbCApIHtcblxuXHRcdFx0djEuY29weSggdGhpcyApLnByb2plY3RPblZlY3RvciggcGxhbmVOb3JtYWwgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc3ViKCB2MSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cmVmbGVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcmVmbGVjdCBpbmNpZGVudCB2ZWN0b3Igb2ZmIHBsYW5lIG9ydGhvZ29uYWwgdG8gbm9ybWFsXG5cdFx0Ly8gbm9ybWFsIGlzIGFzc3VtZWQgdG8gaGF2ZSB1bml0IGxlbmd0aFxuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByZWZsZWN0KCBub3JtYWwgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnN1YiggdjEuY29weSggbm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIDIgKiB0aGlzLmRvdCggbm9ybWFsICkgKSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0YW5nbGVUbzogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIHRoZXRhID0gdGhpcy5kb3QoIHYgKSAvICggTWF0aC5zcXJ0KCB0aGlzLmxlbmd0aFNxKCkgKiB2Lmxlbmd0aFNxKCkgKSApO1xuXG5cdFx0Ly8gY2xhbXAsIHRvIGhhbmRsZSBudW1lcmljYWwgcHJvYmxlbXNcblxuXHRcdHJldHVybiBNYXRoLmFjb3MoIF9NYXRoLmNsYW1wKCB0aGV0YSwgLSAxLCAxICkgKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG86IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQoIHYgKSApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1NxdWFyZWQ6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHZhciBkeCA9IHRoaXMueCAtIHYueCwgZHkgPSB0aGlzLnkgLSB2LnksIGR6ID0gdGhpcy56IC0gdi56O1xuXG5cdFx0cmV0dXJuIGR4ICogZHggKyBkeSAqIGR5ICsgZHogKiBkejtcblxuXHR9LFxuXG5cdG1hbmhhdHRhbkRpc3RhbmNlVG86IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54IC0gdi54ICkgKyBNYXRoLmFicyggdGhpcy55IC0gdi55ICkgKyBNYXRoLmFicyggdGhpcy56IC0gdi56ICk7XG5cblx0fSxcblxuXHRzZXRGcm9tU3BoZXJpY2FsOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR2YXIgc2luUGhpUmFkaXVzID0gTWF0aC5zaW4oIHMucGhpICkgKiBzLnJhZGl1cztcblxuXHRcdHRoaXMueCA9IHNpblBoaVJhZGl1cyAqIE1hdGguc2luKCBzLnRoZXRhICk7XG5cdFx0dGhpcy55ID0gTWF0aC5jb3MoIHMucGhpICkgKiBzLnJhZGl1cztcblx0XHR0aGlzLnogPSBzaW5QaGlSYWRpdXMgKiBNYXRoLmNvcyggcy50aGV0YSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tQ3lsaW5kcmljYWw6IGZ1bmN0aW9uICggYyApIHtcblxuXHRcdHRoaXMueCA9IGMucmFkaXVzICogTWF0aC5zaW4oIGMudGhldGEgKTtcblx0XHR0aGlzLnkgPSBjLnk7XG5cdFx0dGhpcy56ID0gYy5yYWRpdXMgKiBNYXRoLmNvcyggYy50aGV0YSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tTWF0cml4UG9zaXRpb246IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDEyIF07XG5cdFx0dGhpcy55ID0gZVsgMTMgXTtcblx0XHR0aGlzLnogPSBlWyAxNCBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tTWF0cml4U2NhbGU6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciBzeCA9IHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMCApLmxlbmd0aCgpO1xuXHRcdHZhciBzeSA9IHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMSApLmxlbmd0aCgpO1xuXHRcdHZhciBzeiA9IHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMiApLmxlbmd0aCgpO1xuXG5cdFx0dGhpcy54ID0gc3g7XG5cdFx0dGhpcy55ID0gc3k7XG5cdFx0dGhpcy56ID0gc3o7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21NYXRyaXhDb2x1bW46IGZ1bmN0aW9uICggbSwgaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5mcm9tQXJyYXkoIG0uZWxlbWVudHMsIGluZGV4ICogNCApO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gKCAoIHYueCA9PT0gdGhpcy54ICkgJiYgKCB2LnkgPT09IHRoaXMueSApICYmICggdi56ID09PSB0aGlzLnogKSApO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMueCA9IGFycmF5WyBvZmZzZXQgXTtcblx0XHR0aGlzLnkgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMueiA9IGFycmF5WyBvZmZzZXQgKyAyIF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLng7XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMueTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy56O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0ZnJvbUJ1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7XG5cdFx0dGhpcy55ID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7XG5cdFx0dGhpcy56ID0gYXR0cmlidXRlLmdldFooIGluZGV4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gTWF0cml4MygpIHtcblxuXHR0aGlzLmVsZW1lbnRzID0gW1xuXG5cdFx0MSwgMCwgMCxcblx0XHQwLCAxLCAwLFxuXHRcdDAsIDAsIDFcblxuXHRdO1xuXG5cdGlmICggYXJndW1lbnRzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4MzogdGhlIGNvbnN0cnVjdG9yIG5vIGxvbmdlciByZWFkcyBhcmd1bWVudHMuIHVzZSAuc2V0KCkgaW5zdGVhZC4nICk7XG5cblx0fVxuXG59XG5cbk9iamVjdC5hc3NpZ24oIE1hdHJpeDMucHJvdG90eXBlLCB7XG5cblx0aXNNYXRyaXgzOiB0cnVlLFxuXG5cdHNldDogZnVuY3Rpb24gKCBuMTEsIG4xMiwgbjEzLCBuMjEsIG4yMiwgbjIzLCBuMzEsIG4zMiwgbjMzICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gPSBuMTE7IHRlWyAxIF0gPSBuMjE7IHRlWyAyIF0gPSBuMzE7XG5cdFx0dGVbIDMgXSA9IG4xMjsgdGVbIDQgXSA9IG4yMjsgdGVbIDUgXSA9IG4zMjtcblx0XHR0ZVsgNiBdID0gbjEzOyB0ZVsgNyBdID0gbjIzOyB0ZVsgOCBdID0gbjMzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRpZGVudGl0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIDAsIDAsXG5cdFx0XHQwLCAxLCAwLFxuXHRcdFx0MCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmZyb21BcnJheSggdGhpcy5lbGVtZW50cyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSA9IG1lWyAwIF07IHRlWyAxIF0gPSBtZVsgMSBdOyB0ZVsgMiBdID0gbWVbIDIgXTtcblx0XHR0ZVsgMyBdID0gbWVbIDMgXTsgdGVbIDQgXSA9IG1lWyA0IF07IHRlWyA1IF0gPSBtZVsgNSBdO1xuXHRcdHRlWyA2IF0gPSBtZVsgNiBdOyB0ZVsgNyBdID0gbWVbIDcgXTsgdGVbIDggXSA9IG1lWyA4IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21NYXRyaXg0OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdG1lWyAwIF0sIG1lWyA0IF0sIG1lWyA4IF0sXG5cdFx0XHRtZVsgMSBdLCBtZVsgNSBdLCBtZVsgOSBdLFxuXHRcdFx0bWVbIDIgXSwgbWVbIDYgXSwgbWVbIDEwIF1cblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5VG9CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHYxLnggPSBhdHRyaWJ1dGUuZ2V0WCggaSApO1xuXHRcdFx0XHR2MS55ID0gYXR0cmlidXRlLmdldFkoIGkgKTtcblx0XHRcdFx0djEueiA9IGF0dHJpYnV0ZS5nZXRaKCBpICk7XG5cblx0XHRcdFx0djEuYXBwbHlNYXRyaXgzKCB0aGlzICk7XG5cblx0XHRcdFx0YXR0cmlidXRlLnNldFhZWiggaSwgdjEueCwgdjEueSwgdjEueiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBhdHRyaWJ1dGU7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRtdWx0aXBseTogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggdGhpcywgbSApO1xuXG5cdH0sXG5cblx0cHJlbXVsdGlwbHk6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIG0sIHRoaXMgKTtcblxuXHR9LFxuXG5cdG11bHRpcGx5TWF0cmljZXM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHZhciBhZSA9IGEuZWxlbWVudHM7XG5cdFx0dmFyIGJlID0gYi5lbGVtZW50cztcblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIGExMSA9IGFlWyAwIF0sIGExMiA9IGFlWyAzIF0sIGExMyA9IGFlWyA2IF07XG5cdFx0dmFyIGEyMSA9IGFlWyAxIF0sIGEyMiA9IGFlWyA0IF0sIGEyMyA9IGFlWyA3IF07XG5cdFx0dmFyIGEzMSA9IGFlWyAyIF0sIGEzMiA9IGFlWyA1IF0sIGEzMyA9IGFlWyA4IF07XG5cblx0XHR2YXIgYjExID0gYmVbIDAgXSwgYjEyID0gYmVbIDMgXSwgYjEzID0gYmVbIDYgXTtcblx0XHR2YXIgYjIxID0gYmVbIDEgXSwgYjIyID0gYmVbIDQgXSwgYjIzID0gYmVbIDcgXTtcblx0XHR2YXIgYjMxID0gYmVbIDIgXSwgYjMyID0gYmVbIDUgXSwgYjMzID0gYmVbIDggXTtcblxuXHRcdHRlWyAwIF0gPSBhMTEgKiBiMTEgKyBhMTIgKiBiMjEgKyBhMTMgKiBiMzE7XG5cdFx0dGVbIDMgXSA9IGExMSAqIGIxMiArIGExMiAqIGIyMiArIGExMyAqIGIzMjtcblx0XHR0ZVsgNiBdID0gYTExICogYjEzICsgYTEyICogYjIzICsgYTEzICogYjMzO1xuXG5cdFx0dGVbIDEgXSA9IGEyMSAqIGIxMSArIGEyMiAqIGIyMSArIGEyMyAqIGIzMTtcblx0XHR0ZVsgNCBdID0gYTIxICogYjEyICsgYTIyICogYjIyICsgYTIzICogYjMyO1xuXHRcdHRlWyA3IF0gPSBhMjEgKiBiMTMgKyBhMjIgKiBiMjMgKyBhMjMgKiBiMzM7XG5cblx0XHR0ZVsgMiBdID0gYTMxICogYjExICsgYTMyICogYjIxICsgYTMzICogYjMxO1xuXHRcdHRlWyA1IF0gPSBhMzEgKiBiMTIgKyBhMzIgKiBiMjIgKyBhMzMgKiBiMzI7XG5cdFx0dGVbIDggXSA9IGEzMSAqIGIxMyArIGEzMiAqIGIyMyArIGEzMyAqIGIzMztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdICo9IHM7IHRlWyAzIF0gKj0gczsgdGVbIDYgXSAqPSBzO1xuXHRcdHRlWyAxIF0gKj0gczsgdGVbIDQgXSAqPSBzOyB0ZVsgNyBdICo9IHM7XG5cdFx0dGVbIDIgXSAqPSBzOyB0ZVsgNSBdICo9IHM7IHRlWyA4IF0gKj0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGV0ZXJtaW5hbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgYSA9IHRlWyAwIF0sIGIgPSB0ZVsgMSBdLCBjID0gdGVbIDIgXSxcblx0XHRcdGQgPSB0ZVsgMyBdLCBlID0gdGVbIDQgXSwgZiA9IHRlWyA1IF0sXG5cdFx0XHRnID0gdGVbIDYgXSwgaCA9IHRlWyA3IF0sIGkgPSB0ZVsgOCBdO1xuXG5cdFx0cmV0dXJuIGEgKiBlICogaSAtIGEgKiBmICogaCAtIGIgKiBkICogaSArIGIgKiBmICogZyArIGMgKiBkICogaCAtIGMgKiBlICogZztcblxuXHR9LFxuXG5cdGdldEludmVyc2U6IGZ1bmN0aW9uICggbWF0cml4LCB0aHJvd09uRGVnZW5lcmF0ZSApIHtcblxuXHRcdGlmICggbWF0cml4ICYmIG1hdHJpeC5pc01hdHJpeDQgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoIFwiVEhSRUUuTWF0cml4MzogLmdldEludmVyc2UoKSBubyBsb25nZXIgdGFrZXMgYSBNYXRyaXg0IGFyZ3VtZW50LlwiICk7XG5cblx0XHR9XG5cblx0XHR2YXIgbWUgPSBtYXRyaXguZWxlbWVudHMsXG5cdFx0XHR0ZSA9IHRoaXMuZWxlbWVudHMsXG5cblx0XHRcdG4xMSA9IG1lWyAwIF0sIG4yMSA9IG1lWyAxIF0sIG4zMSA9IG1lWyAyIF0sXG5cdFx0XHRuMTIgPSBtZVsgMyBdLCBuMjIgPSBtZVsgNCBdLCBuMzIgPSBtZVsgNSBdLFxuXHRcdFx0bjEzID0gbWVbIDYgXSwgbjIzID0gbWVbIDcgXSwgbjMzID0gbWVbIDggXSxcblxuXHRcdFx0dDExID0gbjMzICogbjIyIC0gbjMyICogbjIzLFxuXHRcdFx0dDEyID0gbjMyICogbjEzIC0gbjMzICogbjEyLFxuXHRcdFx0dDEzID0gbjIzICogbjEyIC0gbjIyICogbjEzLFxuXG5cdFx0XHRkZXQgPSBuMTEgKiB0MTEgKyBuMjEgKiB0MTIgKyBuMzEgKiB0MTM7XG5cblx0XHRpZiAoIGRldCA9PT0gMCApIHtcblxuXHRcdFx0dmFyIG1zZyA9IFwiVEhSRUUuTWF0cml4MzogLmdldEludmVyc2UoKSBjYW4ndCBpbnZlcnQgbWF0cml4LCBkZXRlcm1pbmFudCBpcyAwXCI7XG5cblx0XHRcdGlmICggdGhyb3dPbkRlZ2VuZXJhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCBtc2cgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oIG1zZyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLmlkZW50aXR5KCk7XG5cblx0XHR9XG5cblx0XHR2YXIgZGV0SW52ID0gMSAvIGRldDtcblxuXHRcdHRlWyAwIF0gPSB0MTEgKiBkZXRJbnY7XG5cdFx0dGVbIDEgXSA9ICggbjMxICogbjIzIC0gbjMzICogbjIxICkgKiBkZXRJbnY7XG5cdFx0dGVbIDIgXSA9ICggbjMyICogbjIxIC0gbjMxICogbjIyICkgKiBkZXRJbnY7XG5cblx0XHR0ZVsgMyBdID0gdDEyICogZGV0SW52O1xuXHRcdHRlWyA0IF0gPSAoIG4zMyAqIG4xMSAtIG4zMSAqIG4xMyApICogZGV0SW52O1xuXHRcdHRlWyA1IF0gPSAoIG4zMSAqIG4xMiAtIG4zMiAqIG4xMSApICogZGV0SW52O1xuXG5cdFx0dGVbIDYgXSA9IHQxMyAqIGRldEludjtcblx0XHR0ZVsgNyBdID0gKCBuMjEgKiBuMTMgLSBuMjMgKiBuMTEgKSAqIGRldEludjtcblx0XHR0ZVsgOCBdID0gKCBuMjIgKiBuMTEgLSBuMjEgKiBuMTIgKSAqIGRldEludjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dHJhbnNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdG1wLCBtID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRtcCA9IG1bIDEgXTsgbVsgMSBdID0gbVsgMyBdOyBtWyAzIF0gPSB0bXA7XG5cdFx0dG1wID0gbVsgMiBdOyBtWyAyIF0gPSBtWyA2IF07IG1bIDYgXSA9IHRtcDtcblx0XHR0bXAgPSBtWyA1IF07IG1bIDUgXSA9IG1bIDcgXTsgbVsgNyBdID0gdG1wO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXROb3JtYWxNYXRyaXg6IGZ1bmN0aW9uICggbWF0cml4NCApIHtcblxuXHRcdHJldHVybiB0aGlzLnNldEZyb21NYXRyaXg0KCBtYXRyaXg0ICkuZ2V0SW52ZXJzZSggdGhpcyApLnRyYW5zcG9zZSgpO1xuXG5cdH0sXG5cblx0dHJhbnNwb3NlSW50b0FycmF5OiBmdW5jdGlvbiAoIHIgKSB7XG5cblx0XHR2YXIgbSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRyWyAwIF0gPSBtWyAwIF07XG5cdFx0clsgMSBdID0gbVsgMyBdO1xuXHRcdHJbIDIgXSA9IG1bIDYgXTtcblx0XHRyWyAzIF0gPSBtWyAxIF07XG5cdFx0clsgNCBdID0gbVsgNCBdO1xuXHRcdHJbIDUgXSA9IG1bIDcgXTtcblx0XHRyWyA2IF0gPSBtWyAyIF07XG5cdFx0clsgNyBdID0gbVsgNSBdO1xuXHRcdHJbIDggXSA9IG1bIDggXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0VXZUcmFuc2Zvcm06IGZ1bmN0aW9uICggdHgsIHR5LCBzeCwgc3ksIHJvdGF0aW9uLCBjeCwgY3kgKSB7XG5cblx0XHR2YXIgYyA9IE1hdGguY29zKCByb3RhdGlvbiApO1xuXHRcdHZhciBzID0gTWF0aC5zaW4oIHJvdGF0aW9uICk7XG5cblx0XHR0aGlzLnNldChcblx0XHRcdHN4ICogYywgc3ggKiBzLCAtIHN4ICogKCBjICogY3ggKyBzICogY3kgKSArIGN4ICsgdHgsXG5cdFx0XHQtIHN5ICogcywgc3kgKiBjLCAtIHN5ICogKCAtIHMgKiBjeCArIGMgKiBjeSApICsgY3kgKyB0eSxcblx0XHRcdDAsIDAsIDFcblx0XHQpO1xuXG5cdH0sXG5cblx0c2NhbGU6IGZ1bmN0aW9uICggc3gsIHN5ICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gKj0gc3g7IHRlWyAzIF0gKj0gc3g7IHRlWyA2IF0gKj0gc3g7XG5cdFx0dGVbIDEgXSAqPSBzeTsgdGVbIDQgXSAqPSBzeTsgdGVbIDcgXSAqPSBzeTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm90YXRlOiBmdW5jdGlvbiAoIHRoZXRhICkge1xuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggdGhldGEgKTtcblx0XHR2YXIgcyA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciBhMTEgPSB0ZVsgMCBdLCBhMTIgPSB0ZVsgMyBdLCBhMTMgPSB0ZVsgNiBdO1xuXHRcdHZhciBhMjEgPSB0ZVsgMSBdLCBhMjIgPSB0ZVsgNCBdLCBhMjMgPSB0ZVsgNyBdO1xuXG5cdFx0dGVbIDAgXSA9IGMgKiBhMTEgKyBzICogYTIxO1xuXHRcdHRlWyAzIF0gPSBjICogYTEyICsgcyAqIGEyMjtcblx0XHR0ZVsgNiBdID0gYyAqIGExMyArIHMgKiBhMjM7XG5cblx0XHR0ZVsgMSBdID0gLSBzICogYTExICsgYyAqIGEyMTtcblx0XHR0ZVsgNCBdID0gLSBzICogYTEyICsgYyAqIGEyMjtcblx0XHR0ZVsgNyBdID0gLSBzICogYTEzICsgYyAqIGEyMztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoIHR4LCB0eSApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdICs9IHR4ICogdGVbIDIgXTsgdGVbIDMgXSArPSB0eCAqIHRlWyA1IF07IHRlWyA2IF0gKz0gdHggKiB0ZVsgOCBdO1xuXHRcdHRlWyAxIF0gKz0gdHkgKiB0ZVsgMiBdOyB0ZVsgNCBdICs9IHR5ICogdGVbIDUgXTsgdGVbIDcgXSArPSB0eSAqIHRlWyA4IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciBtZSA9IG1hdHJpeC5lbGVtZW50cztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdGlmICggdGVbIGkgXSAhPT0gbWVbIGkgXSApIHJldHVybiBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZWxlbWVudHNbIGkgXSA9IGFycmF5WyBpICsgb2Zmc2V0IF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGVbIDAgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGVbIDEgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGVbIDIgXTtcblxuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0ZVsgMyBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA0IF0gPSB0ZVsgNCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA1IF0gPSB0ZVsgNSBdO1xuXG5cdFx0YXJyYXlbIG9mZnNldCArIDYgXSA9IHRlWyA2IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDcgXSA9IHRlWyA3IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDggXSA9IHRlWyA4IF07XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIHN6aW1layAvIGh0dHBzOi8vZ2l0aHViLmNvbS9zemltZWsvXG4gKi9cblxudmFyIHRleHR1cmVJZCA9IDA7XG5cbmZ1bmN0aW9uIFRleHR1cmUoIGltYWdlLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICkge1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogdGV4dHVyZUlkICsrIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLm5hbWUgPSAnJztcblxuXHR0aGlzLmltYWdlID0gaW1hZ2UgIT09IHVuZGVmaW5lZCA/IGltYWdlIDogVGV4dHVyZS5ERUZBVUxUX0lNQUdFO1xuXHR0aGlzLm1pcG1hcHMgPSBbXTtcblxuXHR0aGlzLm1hcHBpbmcgPSBtYXBwaW5nICE9PSB1bmRlZmluZWQgPyBtYXBwaW5nIDogVGV4dHVyZS5ERUZBVUxUX01BUFBJTkc7XG5cblx0dGhpcy53cmFwUyA9IHdyYXBTICE9PSB1bmRlZmluZWQgPyB3cmFwUyA6IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cdHRoaXMud3JhcFQgPSB3cmFwVCAhPT0gdW5kZWZpbmVkID8gd3JhcFQgOiBDbGFtcFRvRWRnZVdyYXBwaW5nO1xuXG5cdHRoaXMubWFnRmlsdGVyID0gbWFnRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtYWdGaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7XG5cdHRoaXMubWluRmlsdGVyID0gbWluRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtaW5GaWx0ZXIgOiBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXI7XG5cblx0dGhpcy5hbmlzb3Ryb3B5ID0gYW5pc290cm9weSAhPT0gdW5kZWZpbmVkID8gYW5pc290cm9weSA6IDE7XG5cblx0dGhpcy5mb3JtYXQgPSBmb3JtYXQgIT09IHVuZGVmaW5lZCA/IGZvcm1hdCA6IFJHQkFGb3JtYXQ7XG5cdHRoaXMudHlwZSA9IHR5cGUgIT09IHVuZGVmaW5lZCA/IHR5cGUgOiBVbnNpZ25lZEJ5dGVUeXBlO1xuXG5cdHRoaXMub2Zmc2V0ID0gbmV3IFZlY3RvcjIoIDAsIDAgKTtcblx0dGhpcy5yZXBlYXQgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXHR0aGlzLmNlbnRlciA9IG5ldyBWZWN0b3IyKCAwLCAwICk7XG5cdHRoaXMucm90YXRpb24gPSAwO1xuXG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IHRydWU7XG5cdHRoaXMubWF0cml4ID0gbmV3IE1hdHJpeDMoKTtcblxuXHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IHRydWU7XG5cdHRoaXMucHJlbXVsdGlwbHlBbHBoYSA9IGZhbHNlO1xuXHR0aGlzLmZsaXBZID0gdHJ1ZTtcblx0dGhpcy51bnBhY2tBbGlnbm1lbnQgPSA0O1x0Ly8gdmFsaWQgdmFsdWVzOiAxLCAyLCA0LCA4IChzZWUgaHR0cDovL3d3dy5raHJvbm9zLm9yZy9vcGVuZ2xlcy9zZGsvZG9jcy9tYW4veGh0bWwvZ2xQaXhlbFN0b3JlaS54bWwpXG5cblx0Ly8gVmFsdWVzIG9mIGVuY29kaW5nICE9PSBUSFJFRS5MaW5lYXJFbmNvZGluZyBvbmx5IHN1cHBvcnRlZCBvbiBtYXAsIGVudk1hcCBhbmQgZW1pc3NpdmVNYXAuXG5cdC8vXG5cdC8vIEFsc28gY2hhbmdpbmcgdGhlIGVuY29kaW5nIGFmdGVyIGFscmVhZHkgdXNlZCBieSBhIE1hdGVyaWFsIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgbWFrZSB0aGUgTWF0ZXJpYWxcblx0Ly8gdXBkYXRlLiAgWW91IG5lZWQgdG8gZXhwbGljaXRseSBjYWxsIE1hdGVyaWFsLm5lZWRzVXBkYXRlIHRvIHRyaWdnZXIgaXQgdG8gcmVjb21waWxlLlxuXHR0aGlzLmVuY29kaW5nID0gZW5jb2RpbmcgIT09IHVuZGVmaW5lZCA/IGVuY29kaW5nIDogTGluZWFyRW5jb2Rpbmc7XG5cblx0dGhpcy52ZXJzaW9uID0gMDtcblx0dGhpcy5vblVwZGF0ZSA9IG51bGw7XG5cbn1cblxuVGV4dHVyZS5ERUZBVUxUX0lNQUdFID0gdW5kZWZpbmVkO1xuVGV4dHVyZS5ERUZBVUxUX01BUFBJTkcgPSBVVk1hcHBpbmc7XG5cblRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFRleHR1cmUsXG5cblx0aXNUZXh0dXJlOiB0cnVlLFxuXG5cdHVwZGF0ZU1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5tYXRyaXguc2V0VXZUcmFuc2Zvcm0oIHRoaXMub2Zmc2V0LngsIHRoaXMub2Zmc2V0LnksIHRoaXMucmVwZWF0LngsIHRoaXMucmVwZWF0LnksIHRoaXMucm90YXRpb24sIHRoaXMuY2VudGVyLngsIHRoaXMuY2VudGVyLnkgKTtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lO1xuXG5cdFx0dGhpcy5pbWFnZSA9IHNvdXJjZS5pbWFnZTtcblx0XHR0aGlzLm1pcG1hcHMgPSBzb3VyY2UubWlwbWFwcy5zbGljZSggMCApO1xuXG5cdFx0dGhpcy5tYXBwaW5nID0gc291cmNlLm1hcHBpbmc7XG5cblx0XHR0aGlzLndyYXBTID0gc291cmNlLndyYXBTO1xuXHRcdHRoaXMud3JhcFQgPSBzb3VyY2Uud3JhcFQ7XG5cblx0XHR0aGlzLm1hZ0ZpbHRlciA9IHNvdXJjZS5tYWdGaWx0ZXI7XG5cdFx0dGhpcy5taW5GaWx0ZXIgPSBzb3VyY2UubWluRmlsdGVyO1xuXG5cdFx0dGhpcy5hbmlzb3Ryb3B5ID0gc291cmNlLmFuaXNvdHJvcHk7XG5cblx0XHR0aGlzLmZvcm1hdCA9IHNvdXJjZS5mb3JtYXQ7XG5cdFx0dGhpcy50eXBlID0gc291cmNlLnR5cGU7XG5cblx0XHR0aGlzLm9mZnNldC5jb3B5KCBzb3VyY2Uub2Zmc2V0ICk7XG5cdFx0dGhpcy5yZXBlYXQuY29weSggc291cmNlLnJlcGVhdCApO1xuXHRcdHRoaXMuY2VudGVyLmNvcHkoIHNvdXJjZS5jZW50ZXIgKTtcblx0XHR0aGlzLnJvdGF0aW9uID0gc291cmNlLnJvdGF0aW9uO1xuXG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gc291cmNlLm1hdHJpeEF1dG9VcGRhdGU7XG5cdFx0dGhpcy5tYXRyaXguY29weSggc291cmNlLm1hdHJpeCApO1xuXG5cdFx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBzb3VyY2UuZ2VuZXJhdGVNaXBtYXBzO1xuXHRcdHRoaXMucHJlbXVsdGlwbHlBbHBoYSA9IHNvdXJjZS5wcmVtdWx0aXBseUFscGhhO1xuXHRcdHRoaXMuZmxpcFkgPSBzb3VyY2UuZmxpcFk7XG5cdFx0dGhpcy51bnBhY2tBbGlnbm1lbnQgPSBzb3VyY2UudW5wYWNrQWxpZ25tZW50O1xuXHRcdHRoaXMuZW5jb2RpbmcgPSBzb3VyY2UuZW5jb2Rpbmc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGlzUm9vdE9iamVjdCA9ICggbWV0YSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXRhID09PSAnc3RyaW5nJyApO1xuXG5cdFx0aWYgKCAhIGlzUm9vdE9iamVjdCAmJiBtZXRhLnRleHR1cmVzWyB0aGlzLnV1aWQgXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRyZXR1cm4gbWV0YS50ZXh0dXJlc1sgdGhpcy51dWlkIF07XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXREYXRhVVJMKCBpbWFnZSApIHtcblxuXHRcdFx0dmFyIGNhbnZhcztcblxuXHRcdFx0aWYgKCBpbWFnZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50ICkge1xuXG5cdFx0XHRcdGNhbnZhcyA9IGltYWdlO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFzJyApO1xuXHRcdFx0XHRjYW52YXMud2lkdGggPSBpbWFnZS53aWR0aDtcblx0XHRcdFx0Y2FudmFzLmhlaWdodCA9IGltYWdlLmhlaWdodDtcblxuXHRcdFx0XHR2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7XG5cblx0XHRcdFx0aWYgKCBpbWFnZSBpbnN0YW5jZW9mIEltYWdlRGF0YSApIHtcblxuXHRcdFx0XHRcdGNvbnRleHQucHV0SW1hZ2VEYXRhKCBpbWFnZSwgMCwgMCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjb250ZXh0LmRyYXdJbWFnZSggaW1hZ2UsIDAsIDAsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBjYW52YXMud2lkdGggPiAyMDQ4IHx8IGNhbnZhcy5oZWlnaHQgPiAyMDQ4ICkge1xuXG5cdFx0XHRcdHJldHVybiBjYW52YXMudG9EYXRhVVJMKCAnaW1hZ2UvanBlZycsIDAuNiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBjYW52YXMudG9EYXRhVVJMKCAnaW1hZ2UvcG5nJyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgb3V0cHV0ID0ge1xuXG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdUZXh0dXJlJyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnVGV4dHVyZS50b0pTT04nXG5cdFx0XHR9LFxuXG5cdFx0XHR1dWlkOiB0aGlzLnV1aWQsXG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsXG5cblx0XHRcdG1hcHBpbmc6IHRoaXMubWFwcGluZyxcblxuXHRcdFx0cmVwZWF0OiBbIHRoaXMucmVwZWF0LngsIHRoaXMucmVwZWF0LnkgXSxcblx0XHRcdG9mZnNldDogWyB0aGlzLm9mZnNldC54LCB0aGlzLm9mZnNldC55IF0sXG5cdFx0XHRjZW50ZXI6IFsgdGhpcy5jZW50ZXIueCwgdGhpcy5jZW50ZXIueSBdLFxuXHRcdFx0cm90YXRpb246IHRoaXMucm90YXRpb24sXG5cblx0XHRcdHdyYXA6IFsgdGhpcy53cmFwUywgdGhpcy53cmFwVCBdLFxuXG5cdFx0XHRmb3JtYXQ6IHRoaXMuZm9ybWF0LFxuXHRcdFx0bWluRmlsdGVyOiB0aGlzLm1pbkZpbHRlcixcblx0XHRcdG1hZ0ZpbHRlcjogdGhpcy5tYWdGaWx0ZXIsXG5cdFx0XHRhbmlzb3Ryb3B5OiB0aGlzLmFuaXNvdHJvcHksXG5cblx0XHRcdGZsaXBZOiB0aGlzLmZsaXBZXG5cblx0XHR9O1xuXG5cdFx0aWYgKCB0aGlzLmltYWdlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIFRPRE86IE1vdmUgdG8gVEhSRUUuSW1hZ2VcblxuXHRcdFx0dmFyIGltYWdlID0gdGhpcy5pbWFnZTtcblxuXHRcdFx0aWYgKCBpbWFnZS51dWlkID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0aW1hZ2UudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpOyAvLyBVR0hcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoICEgaXNSb290T2JqZWN0ICYmIG1ldGEuaW1hZ2VzWyBpbWFnZS51dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtZXRhLmltYWdlc1sgaW1hZ2UudXVpZCBdID0ge1xuXHRcdFx0XHRcdHV1aWQ6IGltYWdlLnV1aWQsXG5cdFx0XHRcdFx0dXJsOiBnZXREYXRhVVJMKCBpbWFnZSApXG5cdFx0XHRcdH07XG5cblx0XHRcdH1cblxuXHRcdFx0b3V0cHV0LmltYWdlID0gaW1hZ2UudXVpZDtcblxuXHRcdH1cblxuXHRcdGlmICggISBpc1Jvb3RPYmplY3QgKSB7XG5cblx0XHRcdG1ldGEudGV4dHVyZXNbIHRoaXMudXVpZCBdID0gb3V0cHV0O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG91dHB1dDtcblxuXHR9LFxuXG5cdGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xuXG5cdH0sXG5cblx0dHJhbnNmb3JtVXY6IGZ1bmN0aW9uICggdXYgKSB7XG5cblx0XHRpZiAoIHRoaXMubWFwcGluZyAhPT0gVVZNYXBwaW5nICkgcmV0dXJuO1xuXG5cdFx0dXYuYXBwbHlNYXRyaXgzKCB0aGlzLm1hdHJpeCApO1xuXG5cdFx0aWYgKCB1di54IDwgMCB8fCB1di54ID4gMSApIHtcblxuXHRcdFx0c3dpdGNoICggdGhpcy53cmFwUyApIHtcblxuXHRcdFx0XHRjYXNlIFJlcGVhdFdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0dXYueCA9IHV2LnggLSBNYXRoLmZsb29yKCB1di54ICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBDbGFtcFRvRWRnZVdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0dXYueCA9IHV2LnggPCAwID8gMCA6IDE7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0aWYgKCBNYXRoLmFicyggTWF0aC5mbG9vciggdXYueCApICUgMiApID09PSAxICkge1xuXG5cdFx0XHRcdFx0XHR1di54ID0gTWF0aC5jZWlsKCB1di54ICkgLSB1di54O1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0dXYueCA9IHV2LnggLSBNYXRoLmZsb29yKCB1di54ICk7XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdXYueSA8IDAgfHwgdXYueSA+IDEgKSB7XG5cblx0XHRcdHN3aXRjaCAoIHRoaXMud3JhcFQgKSB7XG5cblx0XHRcdFx0Y2FzZSBSZXBlYXRXcmFwcGluZzpcblxuXHRcdFx0XHRcdHV2LnkgPSB1di55IC0gTWF0aC5mbG9vciggdXYueSApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgQ2xhbXBUb0VkZ2VXcmFwcGluZzpcblxuXHRcdFx0XHRcdHV2LnkgPSB1di55IDwgMCA/IDAgOiAxO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWlycm9yZWRSZXBlYXRXcmFwcGluZzpcblxuXHRcdFx0XHRcdGlmICggTWF0aC5hYnMoIE1hdGguZmxvb3IoIHV2LnkgKSAlIDIgKSA9PT0gMSApIHtcblxuXHRcdFx0XHRcdFx0dXYueSA9IE1hdGguY2VpbCggdXYueSApIC0gdXYueTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHV2LnkgPSB1di55IC0gTWF0aC5mbG9vciggdXYueSApO1xuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuZmxpcFkgKSB7XG5cblx0XHRcdHV2LnkgPSAxIC0gdXYueTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KCBUZXh0dXJlLnByb3RvdHlwZSwgXCJuZWVkc1VwZGF0ZVwiLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHN1cGVyZWdnYmVydCAvIGh0dHA6Ly93d3cucGF1bGJydW50LmNvLnVrL1xuICogQGF1dGhvciBwaGlsb2diIC8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGVncmFldGhlciAvIGh0dHA6Ly9lZ3JhZXRoZXIuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gVmVjdG9yNCggeCwgeSwgeiwgdyApIHtcblxuXHR0aGlzLnggPSB4IHx8IDA7XG5cdHRoaXMueSA9IHkgfHwgMDtcblx0dGhpcy56ID0geiB8fCAwO1xuXHR0aGlzLncgPSAoIHcgIT09IHVuZGVmaW5lZCApID8gdyA6IDE7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yNC5wcm90b3R5cGUsIHtcblxuXHRpc1ZlY3RvcjQ6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHksIHosIHcgKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXHRcdHRoaXMueSA9IHk7XG5cdFx0dGhpcy56ID0gejtcblx0XHR0aGlzLncgPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ID0gc2NhbGFyO1xuXHRcdHRoaXMueSA9IHNjYWxhcjtcblx0XHR0aGlzLnogPSBzY2FsYXI7XG5cdFx0dGhpcy53ID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYOiBmdW5jdGlvbiAoIHggKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRZOiBmdW5jdGlvbiAoIHkgKSB7XG5cblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRaOiBmdW5jdGlvbiAoIHogKSB7XG5cblx0XHR0aGlzLnogPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRXOiBmdW5jdGlvbiAoIHcgKSB7XG5cblx0XHR0aGlzLncgPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXgsIHZhbHVlICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogdGhpcy54ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAxOiB0aGlzLnkgPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDI6IHRoaXMueiA9IHZhbHVlOyBicmVhaztcblx0XHRcdGNhc2UgMzogdGhpcy53ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogcmV0dXJuIHRoaXMueDtcblx0XHRcdGNhc2UgMTogcmV0dXJuIHRoaXMueTtcblx0XHRcdGNhc2UgMjogcmV0dXJuIHRoaXMuejtcblx0XHRcdGNhc2UgMzogcmV0dXJuIHRoaXMudztcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLngsIHRoaXMueSwgdGhpcy56LCB0aGlzLncgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IHYueDtcblx0XHR0aGlzLnkgPSB2Lnk7XG5cdFx0dGhpcy56ID0gdi56O1xuXHRcdHRoaXMudyA9ICggdi53ICE9PSB1bmRlZmluZWQgKSA/IHYudyA6IDE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGRWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggKz0gdi54O1xuXHRcdHRoaXMueSArPSB2Lnk7XG5cdFx0dGhpcy56ICs9IHYuejtcblx0XHR0aGlzLncgKz0gdi53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMueCArPSBzO1xuXHRcdHRoaXMueSArPSBzO1xuXHRcdHRoaXMueiArPSBzO1xuXHRcdHRoaXMudyArPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggKyBiLng7XG5cdFx0dGhpcy55ID0gYS55ICsgYi55O1xuXHRcdHRoaXMueiA9IGEueiArIGIuejtcblx0XHR0aGlzLncgPSBhLncgKyBiLnc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFNjYWxlZFZlY3RvcjogZnVuY3Rpb24gKCB2LCBzICkge1xuXG5cdFx0dGhpcy54ICs9IHYueCAqIHM7XG5cdFx0dGhpcy55ICs9IHYueSAqIHM7XG5cdFx0dGhpcy56ICs9IHYueiAqIHM7XG5cdFx0dGhpcy53ICs9IHYudyAqIHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YjogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggLT0gdi54O1xuXHRcdHRoaXMueSAtPSB2Lnk7XG5cdFx0dGhpcy56IC09IHYuejtcblx0XHR0aGlzLncgLT0gdi53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWJTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMueCAtPSBzO1xuXHRcdHRoaXMueSAtPSBzO1xuXHRcdHRoaXMueiAtPSBzO1xuXHRcdHRoaXMudyAtPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWJWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggLSBiLng7XG5cdFx0dGhpcy55ID0gYS55IC0gYi55O1xuXHRcdHRoaXMueiA9IGEueiAtIGIuejtcblx0XHR0aGlzLncgPSBhLncgLSBiLnc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCAqPSBzY2FsYXI7XG5cdFx0dGhpcy55ICo9IHNjYWxhcjtcblx0XHR0aGlzLnogKj0gc2NhbGFyO1xuXHRcdHRoaXMudyAqPSBzY2FsYXI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLnosIHcgPSB0aGlzLnc7XG5cdFx0dmFyIGUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy54ID0gZVsgMCBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA4IF0gKiB6ICsgZVsgMTIgXSAqIHc7XG5cdFx0dGhpcy55ID0gZVsgMSBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA5IF0gKiB6ICsgZVsgMTMgXSAqIHc7XG5cdFx0dGhpcy56ID0gZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBlWyAxMCBdICogeiArIGVbIDE0IF0gKiB3O1xuXHRcdHRoaXMudyA9IGVbIDMgXSAqIHggKyBlWyA3IF0gKiB5ICsgZVsgMTEgXSAqIHogKyBlWyAxNSBdICogdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGl2aWRlU2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7XG5cblx0fSxcblxuXHRzZXRBeGlzQW5nbGVGcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL3F1YXRlcm5pb25Ub0FuZ2xlL2luZGV4Lmh0bVxuXG5cdFx0Ly8gcSBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdHRoaXMudyA9IDIgKiBNYXRoLmFjb3MoIHEudyApO1xuXG5cdFx0dmFyIHMgPSBNYXRoLnNxcnQoIDEgLSBxLncgKiBxLncgKTtcblxuXHRcdGlmICggcyA8IDAuMDAwMSApIHtcblxuXHRcdFx0dGhpcy54ID0gMTtcblx0XHRcdHRoaXMueSA9IDA7XG5cdFx0XHR0aGlzLnogPSAwO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy54ID0gcS54IC8gcztcblx0XHRcdHRoaXMueSA9IHEueSAvIHM7XG5cdFx0XHR0aGlzLnogPSBxLnogLyBzO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRBeGlzQW5nbGVGcm9tUm90YXRpb25NYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2dlb21ldHJ5L3JvdGF0aW9ucy9jb252ZXJzaW9ucy9tYXRyaXhUb0FuZ2xlL2luZGV4Lmh0bVxuXG5cdFx0Ly8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZClcblxuXHRcdHZhciBhbmdsZSwgeCwgeSwgeixcdFx0Ly8gdmFyaWFibGVzIGZvciByZXN1bHRcblx0XHRcdGVwc2lsb24gPSAwLjAxLFx0XHQvLyBtYXJnaW4gdG8gYWxsb3cgZm9yIHJvdW5kaW5nIGVycm9yc1xuXHRcdFx0ZXBzaWxvbjIgPSAwLjEsXHRcdC8vIG1hcmdpbiB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIDAgYW5kIDE4MCBkZWdyZWVzXG5cblx0XHRcdHRlID0gbS5lbGVtZW50cyxcblxuXHRcdFx0bTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVbIDggXSxcblx0XHRcdG0yMSA9IHRlWyAxIF0sIG0yMiA9IHRlWyA1IF0sIG0yMyA9IHRlWyA5IF0sXG5cdFx0XHRtMzEgPSB0ZVsgMiBdLCBtMzIgPSB0ZVsgNiBdLCBtMzMgPSB0ZVsgMTAgXTtcblxuXHRcdGlmICggKCBNYXRoLmFicyggbTEyIC0gbTIxICkgPCBlcHNpbG9uICkgJiZcblx0XHQgICAgICggTWF0aC5hYnMoIG0xMyAtIG0zMSApIDwgZXBzaWxvbiApICYmXG5cdFx0ICAgICAoIE1hdGguYWJzKCBtMjMgLSBtMzIgKSA8IGVwc2lsb24gKSApIHtcblxuXHRcdFx0Ly8gc2luZ3VsYXJpdHkgZm91bmRcblx0XHRcdC8vIGZpcnN0IGNoZWNrIGZvciBpZGVudGl0eSBtYXRyaXggd2hpY2ggbXVzdCBoYXZlICsxIGZvciBhbGwgdGVybXNcblx0XHRcdC8vIGluIGxlYWRpbmcgZGlhZ29uYWwgYW5kIHplcm8gaW4gb3RoZXIgdGVybXNcblxuXHRcdFx0aWYgKCAoIE1hdGguYWJzKCBtMTIgKyBtMjEgKSA8IGVwc2lsb24yICkgJiZcblx0XHRcdCAgICAgKCBNYXRoLmFicyggbTEzICsgbTMxICkgPCBlcHNpbG9uMiApICYmXG5cdFx0XHQgICAgICggTWF0aC5hYnMoIG0yMyArIG0zMiApIDwgZXBzaWxvbjIgKSAmJlxuXHRcdFx0ICAgICAoIE1hdGguYWJzKCBtMTEgKyBtMjIgKyBtMzMgLSAzICkgPCBlcHNpbG9uMiApICkge1xuXG5cdFx0XHRcdC8vIHRoaXMgc2luZ3VsYXJpdHkgaXMgaWRlbnRpdHkgbWF0cml4IHNvIGFuZ2xlID0gMFxuXG5cdFx0XHRcdHRoaXMuc2V0KCAxLCAwLCAwLCAwICk7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7IC8vIHplcm8gYW5nbGUsIGFyYml0cmFyeSBheGlzXG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gb3RoZXJ3aXNlIHRoaXMgc2luZ3VsYXJpdHkgaXMgYW5nbGUgPSAxODBcblxuXHRcdFx0YW5nbGUgPSBNYXRoLlBJO1xuXG5cdFx0XHR2YXIgeHggPSAoIG0xMSArIDEgKSAvIDI7XG5cdFx0XHR2YXIgeXkgPSAoIG0yMiArIDEgKSAvIDI7XG5cdFx0XHR2YXIgenogPSAoIG0zMyArIDEgKSAvIDI7XG5cdFx0XHR2YXIgeHkgPSAoIG0xMiArIG0yMSApIC8gNDtcblx0XHRcdHZhciB4eiA9ICggbTEzICsgbTMxICkgLyA0O1xuXHRcdFx0dmFyIHl6ID0gKCBtMjMgKyBtMzIgKSAvIDQ7XG5cblx0XHRcdGlmICggKCB4eCA+IHl5ICkgJiYgKCB4eCA+IHp6ICkgKSB7XG5cblx0XHRcdFx0Ly8gbTExIGlzIHRoZSBsYXJnZXN0IGRpYWdvbmFsIHRlcm1cblxuXHRcdFx0XHRpZiAoIHh4IDwgZXBzaWxvbiApIHtcblxuXHRcdFx0XHRcdHggPSAwO1xuXHRcdFx0XHRcdHkgPSAwLjcwNzEwNjc4MTtcblx0XHRcdFx0XHR6ID0gMC43MDcxMDY3ODE7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHggPSBNYXRoLnNxcnQoIHh4ICk7XG5cdFx0XHRcdFx0eSA9IHh5IC8geDtcblx0XHRcdFx0XHR6ID0geHogLyB4O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggeXkgPiB6eiApIHtcblxuXHRcdFx0XHQvLyBtMjIgaXMgdGhlIGxhcmdlc3QgZGlhZ29uYWwgdGVybVxuXG5cdFx0XHRcdGlmICggeXkgPCBlcHNpbG9uICkge1xuXG5cdFx0XHRcdFx0eCA9IDAuNzA3MTA2NzgxO1xuXHRcdFx0XHRcdHkgPSAwO1xuXHRcdFx0XHRcdHogPSAwLjcwNzEwNjc4MTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0eSA9IE1hdGguc3FydCggeXkgKTtcblx0XHRcdFx0XHR4ID0geHkgLyB5O1xuXHRcdFx0XHRcdHogPSB5eiAvIHk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIG0zMyBpcyB0aGUgbGFyZ2VzdCBkaWFnb25hbCB0ZXJtIHNvIGJhc2UgcmVzdWx0IG9uIHRoaXNcblxuXHRcdFx0XHRpZiAoIHp6IDwgZXBzaWxvbiApIHtcblxuXHRcdFx0XHRcdHggPSAwLjcwNzEwNjc4MTtcblx0XHRcdFx0XHR5ID0gMC43MDcxMDY3ODE7XG5cdFx0XHRcdFx0eiA9IDA7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHogPSBNYXRoLnNxcnQoIHp6ICk7XG5cdFx0XHRcdFx0eCA9IHh6IC8gejtcblx0XHRcdFx0XHR5ID0geXogLyB6O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnNldCggeCwgeSwgeiwgYW5nbGUgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7IC8vIHJldHVybiAxODAgZGVnIHJvdGF0aW9uXG5cblx0XHR9XG5cblx0XHQvLyBhcyB3ZSBoYXZlIHJlYWNoZWQgaGVyZSB0aGVyZSBhcmUgbm8gc2luZ3VsYXJpdGllcyBzbyB3ZSBjYW4gaGFuZGxlIG5vcm1hbGx5XG5cblx0XHR2YXIgcyA9IE1hdGguc3FydCggKCBtMzIgLSBtMjMgKSAqICggbTMyIC0gbTIzICkgK1xuXHRcdCAgICAgICAgICAgICAgICAgICAoIG0xMyAtIG0zMSApICogKCBtMTMgLSBtMzEgKSArXG5cdFx0ICAgICAgICAgICAgICAgICAgICggbTIxIC0gbTEyICkgKiAoIG0yMSAtIG0xMiApICk7IC8vIHVzZWQgdG8gbm9ybWFsaXplXG5cblx0XHRpZiAoIE1hdGguYWJzKCBzICkgPCAwLjAwMSApIHMgPSAxO1xuXG5cdFx0Ly8gcHJldmVudCBkaXZpZGUgYnkgemVybywgc2hvdWxkIG5vdCBoYXBwZW4gaWYgbWF0cml4IGlzIG9ydGhvZ29uYWwgYW5kIHNob3VsZCBiZVxuXHRcdC8vIGNhdWdodCBieSBzaW5ndWxhcml0eSB0ZXN0IGFib3ZlLCBidXQgSSd2ZSBsZWZ0IGl0IGluIGp1c3QgaW4gY2FzZVxuXG5cdFx0dGhpcy54ID0gKCBtMzIgLSBtMjMgKSAvIHM7XG5cdFx0dGhpcy55ID0gKCBtMTMgLSBtMzEgKSAvIHM7XG5cdFx0dGhpcy56ID0gKCBtMjEgLSBtMTIgKSAvIHM7XG5cdFx0dGhpcy53ID0gTWF0aC5hY29zKCAoIG0xMSArIG0yMiArIG0zMyAtIDEgKSAvIDIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWluOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1pbiggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1pbiggdGhpcy55LCB2LnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1pbiggdGhpcy56LCB2LnogKTtcblx0XHR0aGlzLncgPSBNYXRoLm1pbiggdGhpcy53LCB2LncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWF4OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggdGhpcy55LCB2LnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1heCggdGhpcy56LCB2LnogKTtcblx0XHR0aGlzLncgPSBNYXRoLm1heCggdGhpcy53LCB2LncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXA6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHQvLyBhc3N1bWVzIG1pbiA8IG1heCwgY29tcG9uZW50d2lzZVxuXG5cdFx0dGhpcy54ID0gTWF0aC5tYXgoIG1pbi54LCBNYXRoLm1pbiggbWF4LngsIHRoaXMueCApICk7XG5cdFx0dGhpcy55ID0gTWF0aC5tYXgoIG1pbi55LCBNYXRoLm1pbiggbWF4LnksIHRoaXMueSApICk7XG5cdFx0dGhpcy56ID0gTWF0aC5tYXgoIG1pbi56LCBNYXRoLm1pbiggbWF4LnosIHRoaXMueiApICk7XG5cdFx0dGhpcy53ID0gTWF0aC5tYXgoIG1pbi53LCBNYXRoLm1pbiggbWF4LncsIHRoaXMudyApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsYW1wU2NhbGFyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWluLCBtYXg7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2xhbXBTY2FsYXIoIG1pblZhbCwgbWF4VmFsICkge1xuXG5cdFx0XHRpZiAoIG1pbiA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1pbiA9IG5ldyBWZWN0b3I0KCk7XG5cdFx0XHRcdG1heCA9IG5ldyBWZWN0b3I0KCk7XG5cblx0XHRcdH1cblxuXHRcdFx0bWluLnNldCggbWluVmFsLCBtaW5WYWwsIG1pblZhbCwgbWluVmFsICk7XG5cdFx0XHRtYXguc2V0KCBtYXhWYWwsIG1heFZhbCwgbWF4VmFsLCBtYXhWYWwgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuY2xhbXAoIG1pbiwgbWF4ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbGFtcExlbmd0aDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCBsZW5ndGggfHwgMSApLm11bHRpcGx5U2NhbGFyKCBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCBsZW5ndGggKSApICk7XG5cblx0fSxcblxuXHRmbG9vcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5mbG9vciggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5mbG9vciggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5mbG9vciggdGhpcy56ICk7XG5cdFx0dGhpcy53ID0gTWF0aC5mbG9vciggdGhpcy53ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNlaWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguY2VpbCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5jZWlsKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLmNlaWwoIHRoaXMueiApO1xuXHRcdHRoaXMudyA9IE1hdGguY2VpbCggdGhpcy53ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLnJvdW5kKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLnJvdW5kKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLnJvdW5kKCB0aGlzLnogKTtcblx0XHR0aGlzLncgPSBNYXRoLnJvdW5kKCB0aGlzLncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm91bmRUb1plcm86IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9ICggdGhpcy54IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnggKSA6IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9ICggdGhpcy55IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnkgKSA6IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9ICggdGhpcy56IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnogKSA6IE1hdGguZmxvb3IoIHRoaXMueiApO1xuXHRcdHRoaXMudyA9ICggdGhpcy53IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLncgKSA6IE1hdGguZmxvb3IoIHRoaXMudyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IC0gdGhpcy54O1xuXHRcdHRoaXMueSA9IC0gdGhpcy55O1xuXHRcdHRoaXMueiA9IC0gdGhpcy56O1xuXHRcdHRoaXMudyA9IC0gdGhpcy53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkb3Q6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2LnkgKyB0aGlzLnogKiB2LnogKyB0aGlzLncgKiB2Lnc7XG5cblx0fSxcblxuXHRsZW5ndGhTcTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMueiArIHRoaXMudyAqIHRoaXMudztcblxuXHR9LFxuXG5cdGxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56ICsgdGhpcy53ICogdGhpcy53ICk7XG5cblx0fSxcblxuXHRtYW5oYXR0YW5MZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54ICkgKyBNYXRoLmFicyggdGhpcy55ICkgKyBNYXRoLmFicyggdGhpcy56ICkgKyBNYXRoLmFicyggdGhpcy53ICk7XG5cblx0fSxcblxuXHRub3JtYWxpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggdGhpcy5sZW5ndGgoKSB8fCAxICk7XG5cblx0fSxcblxuXHRzZXRMZW5ndGg6IGZ1bmN0aW9uICggbGVuZ3RoICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIGxlbmd0aCApO1xuXG5cdH0sXG5cblx0bGVycDogZnVuY3Rpb24gKCB2LCBhbHBoYSApIHtcblxuXHRcdHRoaXMueCArPSAoIHYueCAtIHRoaXMueCApICogYWxwaGE7XG5cdFx0dGhpcy55ICs9ICggdi55IC0gdGhpcy55ICkgKiBhbHBoYTtcblx0XHR0aGlzLnogKz0gKCB2LnogLSB0aGlzLnogKSAqIGFscGhhO1xuXHRcdHRoaXMudyArPSAoIHYudyAtIHRoaXMudyApICogYWxwaGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxlcnBWZWN0b3JzOiBmdW5jdGlvbiAoIHYxLCB2MiwgYWxwaGEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2MiwgdjEgKS5tdWx0aXBseVNjYWxhciggYWxwaGEgKS5hZGQoIHYxICk7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiAoICggdi54ID09PSB0aGlzLnggKSAmJiAoIHYueSA9PT0gdGhpcy55ICkgJiYgKCB2LnogPT09IHRoaXMueiApICYmICggdi53ID09PSB0aGlzLncgKSApO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMueCA9IGFycmF5WyBvZmZzZXQgXTtcblx0XHR0aGlzLnkgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMueiA9IGFycmF5WyBvZmZzZXQgKyAyIF07XG5cdFx0dGhpcy53ID0gYXJyYXlbIG9mZnNldCArIDMgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMueDtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy55O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLno7XG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRoaXMudztcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdGZyb21CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yNDogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCA9IGF0dHJpYnV0ZS5nZXRYKCBpbmRleCApO1xuXHRcdHRoaXMueSA9IGF0dHJpYnV0ZS5nZXRZKCBpbmRleCApO1xuXHRcdHRoaXMueiA9IGF0dHJpYnV0ZS5nZXRaKCBpbmRleCApO1xuXHRcdHRoaXMudyA9IGF0dHJpYnV0ZS5nZXRXKCBpbmRleCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBzemltZWsgLyBodHRwczovL2dpdGh1Yi5jb20vc3ppbWVrL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgTWFyaXVzIEtpbnRlbCAvIGh0dHBzOi8vZ2l0aHViLmNvbS9raW50ZWxcbiAqL1xuXG4vKlxuIEluIG9wdGlvbnMsIHdlIGNhbiBzcGVjaWZ5OlxuICogVGV4dHVyZSBwYXJhbWV0ZXJzIGZvciBhbiBhdXRvLWdlbmVyYXRlZCB0YXJnZXQgdGV4dHVyZVxuICogZGVwdGhCdWZmZXIvc3RlbmNpbEJ1ZmZlcjogQm9vbGVhbnMgdG8gaW5kaWNhdGUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIHRoZXNlIGJ1ZmZlcnNcbiovXG5mdW5jdGlvbiBXZWJHTFJlbmRlclRhcmdldCggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApIHtcblxuXHR0aGlzLndpZHRoID0gd2lkdGg7XG5cdHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdHRoaXMuc2Npc3NvciA9IG5ldyBWZWN0b3I0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cdHRoaXMuc2Npc3NvclRlc3QgPSBmYWxzZTtcblxuXHR0aGlzLnZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcblxuXHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRpZiAoIG9wdGlvbnMubWluRmlsdGVyID09PSB1bmRlZmluZWQgKSBvcHRpb25zLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcblxuXHR0aGlzLnRleHR1cmUgPSBuZXcgVGV4dHVyZSggdW5kZWZpbmVkLCB1bmRlZmluZWQsIG9wdGlvbnMud3JhcFMsIG9wdGlvbnMud3JhcFQsIG9wdGlvbnMubWFnRmlsdGVyLCBvcHRpb25zLm1pbkZpbHRlciwgb3B0aW9ucy5mb3JtYXQsIG9wdGlvbnMudHlwZSwgb3B0aW9ucy5hbmlzb3Ryb3B5LCBvcHRpb25zLmVuY29kaW5nICk7XG5cblx0dGhpcy5kZXB0aEJ1ZmZlciA9IG9wdGlvbnMuZGVwdGhCdWZmZXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVwdGhCdWZmZXIgOiB0cnVlO1xuXHR0aGlzLnN0ZW5jaWxCdWZmZXIgPSBvcHRpb25zLnN0ZW5jaWxCdWZmZXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc3RlbmNpbEJ1ZmZlciA6IHRydWU7XG5cdHRoaXMuZGVwdGhUZXh0dXJlID0gb3B0aW9ucy5kZXB0aFRleHR1cmUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVwdGhUZXh0dXJlIDogbnVsbDtcblxufVxuXG5XZWJHTFJlbmRlclRhcmdldC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogV2ViR0xSZW5kZXJUYXJnZXQsXG5cblx0aXNXZWJHTFJlbmRlclRhcmdldDogdHJ1ZSxcblxuXHRzZXRTaXplOiBmdW5jdGlvbiAoIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRpZiAoIHRoaXMud2lkdGggIT09IHdpZHRoIHx8IHRoaXMuaGVpZ2h0ICE9PSBoZWlnaHQgKSB7XG5cblx0XHRcdHRoaXMud2lkdGggPSB3aWR0aDtcblx0XHRcdHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdFx0XHR0aGlzLmRpc3Bvc2UoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMudmlld3BvcnQuc2V0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cdFx0dGhpcy5zY2lzc29yLnNldCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy53aWR0aCA9IHNvdXJjZS53aWR0aDtcblx0XHR0aGlzLmhlaWdodCA9IHNvdXJjZS5oZWlnaHQ7XG5cblx0XHR0aGlzLnZpZXdwb3J0LmNvcHkoIHNvdXJjZS52aWV3cG9ydCApO1xuXG5cdFx0dGhpcy50ZXh0dXJlID0gc291cmNlLnRleHR1cmUuY2xvbmUoKTtcblxuXHRcdHRoaXMuZGVwdGhCdWZmZXIgPSBzb3VyY2UuZGVwdGhCdWZmZXI7XG5cdFx0dGhpcy5zdGVuY2lsQnVmZmVyID0gc291cmNlLnN0ZW5jaWxCdWZmZXI7XG5cdFx0dGhpcy5kZXB0aFRleHR1cmUgPSBzb3VyY2UuZGVwdGhUZXh0dXJlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJUYXJnZXRDdWJlKCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zICkge1xuXG5cdFdlYkdMUmVuZGVyVGFyZ2V0LmNhbGwoIHRoaXMsIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKTtcblxuXHR0aGlzLmFjdGl2ZUN1YmVGYWNlID0gMDsgLy8gUFggMCwgTlggMSwgUFkgMiwgTlkgMywgUFogNCwgTlogNVxuXHR0aGlzLmFjdGl2ZU1pcE1hcExldmVsID0gMDtcblxufVxuXG5XZWJHTFJlbmRlclRhcmdldEN1YmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggV2ViR0xSZW5kZXJUYXJnZXQucHJvdG90eXBlICk7XG5XZWJHTFJlbmRlclRhcmdldEN1YmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gV2ViR0xSZW5kZXJUYXJnZXRDdWJlO1xuXG5XZWJHTFJlbmRlclRhcmdldEN1YmUucHJvdG90eXBlLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlID0gdHJ1ZTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIERhdGFUZXh0dXJlKCBkYXRhLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGFuaXNvdHJvcHksIGVuY29kaW5nICkge1xuXG5cdFRleHR1cmUuY2FsbCggdGhpcywgbnVsbCwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApO1xuXG5cdHRoaXMuaW1hZ2UgPSB7IGRhdGE6IGRhdGEsIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcblxuXHR0aGlzLm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWFnRmlsdGVyIDogTmVhcmVzdEZpbHRlcjtcblx0dGhpcy5taW5GaWx0ZXIgPSBtaW5GaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1pbkZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7XG5cblx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblx0dGhpcy5mbGlwWSA9IGZhbHNlO1xuXHR0aGlzLnVucGFja0FsaWdubWVudCA9IDE7XG5cbn1cblxuRGF0YVRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkRhdGFUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERhdGFUZXh0dXJlO1xuXG5EYXRhVGV4dHVyZS5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZSA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gQm94MyggbWluLCBtYXggKSB7XG5cblx0dGhpcy5taW4gPSAoIG1pbiAhPT0gdW5kZWZpbmVkICkgPyBtaW4gOiBuZXcgVmVjdG9yMyggKyBJbmZpbml0eSwgKyBJbmZpbml0eSwgKyBJbmZpbml0eSApO1xuXHR0aGlzLm1heCA9ICggbWF4ICE9PSB1bmRlZmluZWQgKSA/IG1heCA6IG5ldyBWZWN0b3IzKCAtIEluZmluaXR5LCAtIEluZmluaXR5LCAtIEluZmluaXR5ICk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQm94My5wcm90b3R5cGUsIHtcblxuXHRpc0JveDM6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0dGhpcy5taW4uY29weSggbWluICk7XG5cdFx0dGhpcy5tYXguY29weSggbWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdHZhciBtaW5YID0gKyBJbmZpbml0eTtcblx0XHR2YXIgbWluWSA9ICsgSW5maW5pdHk7XG5cdFx0dmFyIG1pblogPSArIEluZmluaXR5O1xuXG5cdFx0dmFyIG1heFggPSAtIEluZmluaXR5O1xuXHRcdHZhciBtYXhZID0gLSBJbmZpbml0eTtcblx0XHR2YXIgbWF4WiA9IC0gSW5maW5pdHk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdHZhciB4ID0gYXJyYXlbIGkgXTtcblx0XHRcdHZhciB5ID0gYXJyYXlbIGkgKyAxIF07XG5cdFx0XHR2YXIgeiA9IGFycmF5WyBpICsgMiBdO1xuXG5cdFx0XHRpZiAoIHggPCBtaW5YICkgbWluWCA9IHg7XG5cdFx0XHRpZiAoIHkgPCBtaW5ZICkgbWluWSA9IHk7XG5cdFx0XHRpZiAoIHogPCBtaW5aICkgbWluWiA9IHo7XG5cblx0XHRcdGlmICggeCA+IG1heFggKSBtYXhYID0geDtcblx0XHRcdGlmICggeSA+IG1heFkgKSBtYXhZID0geTtcblx0XHRcdGlmICggeiA+IG1heFogKSBtYXhaID0gejtcblxuXHRcdH1cblxuXHRcdHRoaXMubWluLnNldCggbWluWCwgbWluWSwgbWluWiApO1xuXHRcdHRoaXMubWF4LnNldCggbWF4WCwgbWF4WSwgbWF4WiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSApIHtcblxuXHRcdHZhciBtaW5YID0gKyBJbmZpbml0eTtcblx0XHR2YXIgbWluWSA9ICsgSW5maW5pdHk7XG5cdFx0dmFyIG1pblogPSArIEluZmluaXR5O1xuXG5cdFx0dmFyIG1heFggPSAtIEluZmluaXR5O1xuXHRcdHZhciBtYXhZID0gLSBJbmZpbml0eTtcblx0XHR2YXIgbWF4WiA9IC0gSW5maW5pdHk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgeCA9IGF0dHJpYnV0ZS5nZXRYKCBpICk7XG5cdFx0XHR2YXIgeSA9IGF0dHJpYnV0ZS5nZXRZKCBpICk7XG5cdFx0XHR2YXIgeiA9IGF0dHJpYnV0ZS5nZXRaKCBpICk7XG5cblx0XHRcdGlmICggeCA8IG1pblggKSBtaW5YID0geDtcblx0XHRcdGlmICggeSA8IG1pblkgKSBtaW5ZID0geTtcblx0XHRcdGlmICggeiA8IG1pblogKSBtaW5aID0gejtcblxuXHRcdFx0aWYgKCB4ID4gbWF4WCApIG1heFggPSB4O1xuXHRcdFx0aWYgKCB5ID4gbWF4WSApIG1heFkgPSB5O1xuXHRcdFx0aWYgKCB6ID4gbWF4WiApIG1heFogPSB6O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5taW4uc2V0KCBtaW5YLCBtaW5ZLCBtaW5aICk7XG5cdFx0dGhpcy5tYXguc2V0KCBtYXhYLCBtYXhZLCBtYXhaICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZXhwYW5kQnlQb2ludCggcG9pbnRzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUNlbnRlckFuZFNpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbUNlbnRlckFuZFNpemUoIGNlbnRlciwgc2l6ZSApIHtcblxuXHRcdFx0dmFyIGhhbGZTaXplID0gdjEuY29weSggc2l6ZSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHRcdFx0dGhpcy5taW4uY29weSggY2VudGVyICkuc3ViKCBoYWxmU2l6ZSApO1xuXHRcdFx0dGhpcy5tYXguY29weSggY2VudGVyICkuYWRkKCBoYWxmU2l6ZSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHNldEZyb21PYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdHJldHVybiB0aGlzLmV4cGFuZEJ5T2JqZWN0KCBvYmplY3QgKTtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHRoaXMubWluLmNvcHkoIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5jb3B5KCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VFbXB0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5taW4ueCA9IHRoaXMubWluLnkgPSB0aGlzLm1pbi56ID0gKyBJbmZpbml0eTtcblx0XHR0aGlzLm1heC54ID0gdGhpcy5tYXgueSA9IHRoaXMubWF4LnogPSAtIEluZmluaXR5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRpc0VtcHR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyB0aGlzIGlzIGEgbW9yZSByb2J1c3QgY2hlY2sgZm9yIGVtcHR5IHRoYW4gKCB2b2x1bWUgPD0gMCApIGJlY2F1c2Ugdm9sdW1lIGNhbiBnZXQgcG9zaXRpdmUgd2l0aCB0d28gbmVnYXRpdmUgYXhlc1xuXG5cdFx0cmV0dXJuICggdGhpcy5tYXgueCA8IHRoaXMubWluLnggKSB8fCAoIHRoaXMubWF4LnkgPCB0aGlzLm1pbi55ICkgfHwgKCB0aGlzLm1heC56IDwgdGhpcy5taW4ueiApO1xuXG5cdH0sXG5cblx0Z2V0Q2VudGVyOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHRhcmdldC5zZXQoIDAsIDAsIDAgKSA6IHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLm1pbiwgdGhpcy5tYXggKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cblx0fSxcblxuXHRnZXRTaXplOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5nZXRTaXplKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0YXJnZXQuc2V0KCAwLCAwLCAwICkgOiB0YXJnZXQuc3ViVmVjdG9ycyggdGhpcy5tYXgsIHRoaXMubWluICk7XG5cblx0fSxcblxuXHRleHBhbmRCeVBvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0dGhpcy5taW4ubWluKCBwb2ludCApO1xuXHRcdHRoaXMubWF4Lm1heCggcG9pbnQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlWZWN0b3I6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0dGhpcy5taW4uc3ViKCB2ZWN0b3IgKTtcblx0XHR0aGlzLm1heC5hZGQoIHZlY3RvciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRleHBhbmRCeVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLm1pbi5hZGRTY2FsYXIoIC0gc2NhbGFyICk7XG5cdFx0dGhpcy5tYXguYWRkU2NhbGFyKCBzY2FsYXIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlPYmplY3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIENvbXB1dGVzIHRoZSB3b3JsZC1heGlzLWFsaWduZWQgYm91bmRpbmcgYm94IG9mIGFuIG9iamVjdCAoaW5jbHVkaW5nIGl0cyBjaGlsZHJlbiksXG5cdFx0Ly8gYWNjb3VudGluZyBmb3IgYm90aCB0aGUgb2JqZWN0J3MsIGFuZCBjaGlsZHJlbidzLCB3b3JsZCB0cmFuc2Zvcm1zXG5cblx0XHR2YXIgc2NvcGUsIGksIGw7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0ZnVuY3Rpb24gdHJhdmVyc2UoIG5vZGUgKSB7XG5cblx0XHRcdHZhciBnZW9tZXRyeSA9IG5vZGUuZ2VvbWV0cnk7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblxuXHRcdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0djEuY29weSggdmVydGljZXNbIGkgXSApO1xuXHRcdFx0XHRcdFx0djEuYXBwbHlNYXRyaXg0KCBub2RlLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0XHRcdHNjb3BlLmV4cGFuZEJ5UG9pbnQoIHYxICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHRcdHZhciBhdHRyaWJ1dGUgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0XHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHYxLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaSApLmFwcGx5TWF0cml4NCggbm9kZS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdFx0XHRcdHNjb3BlLmV4cGFuZEJ5UG9pbnQoIHYxICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBmdW5jdGlvbiBleHBhbmRCeU9iamVjdCggb2JqZWN0ICkge1xuXG5cdFx0XHRzY29wZSA9IHRoaXM7XG5cblx0XHRcdG9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0XHRvYmplY3QudHJhdmVyc2UoIHRyYXZlcnNlICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHJldHVybiBwb2ludC54IDwgdGhpcy5taW4ueCB8fCBwb2ludC54ID4gdGhpcy5tYXgueCB8fFxuXHRcdFx0cG9pbnQueSA8IHRoaXMubWluLnkgfHwgcG9pbnQueSA+IHRoaXMubWF4LnkgfHxcblx0XHRcdHBvaW50LnogPCB0aGlzLm1pbi56IHx8IHBvaW50LnogPiB0aGlzLm1heC56ID8gZmFsc2UgOiB0cnVlO1xuXG5cdH0sXG5cblx0Y29udGFpbnNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubWluLnggPD0gYm94Lm1pbi54ICYmIGJveC5tYXgueCA8PSB0aGlzLm1heC54ICYmXG5cdFx0XHR0aGlzLm1pbi55IDw9IGJveC5taW4ueSAmJiBib3gubWF4LnkgPD0gdGhpcy5tYXgueSAmJlxuXHRcdFx0dGhpcy5taW4ueiA8PSBib3gubWluLnogJiYgYm94Lm1heC56IDw9IHRoaXMubWF4Lno7XG5cblx0fSxcblxuXHRnZXRQYXJhbWV0ZXI6IGZ1bmN0aW9uICggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdC8vIFRoaXMgY2FuIHBvdGVudGlhbGx5IGhhdmUgYSBkaXZpZGUgYnkgemVybyBpZiB0aGUgYm94XG5cdFx0Ly8gaGFzIGEgc2l6ZSBkaW1lbnNpb24gb2YgMC5cblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5nZXRQYXJhbWV0ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuc2V0KFxuXHRcdFx0KCBwb2ludC54IC0gdGhpcy5taW4ueCApIC8gKCB0aGlzLm1heC54IC0gdGhpcy5taW4ueCApLFxuXHRcdFx0KCBwb2ludC55IC0gdGhpcy5taW4ueSApIC8gKCB0aGlzLm1heC55IC0gdGhpcy5taW4ueSApLFxuXHRcdFx0KCBwb2ludC56IC0gdGhpcy5taW4ueiApIC8gKCB0aGlzLm1heC56IC0gdGhpcy5taW4ueiApXG5cdFx0KTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0Ly8gdXNpbmcgNiBzcGxpdHRpbmcgcGxhbmVzIHRvIHJ1bGUgb3V0IGludGVyc2VjdGlvbnMuXG5cdFx0cmV0dXJuIGJveC5tYXgueCA8IHRoaXMubWluLnggfHwgYm94Lm1pbi54ID4gdGhpcy5tYXgueCB8fFxuXHRcdFx0Ym94Lm1heC55IDwgdGhpcy5taW4ueSB8fCBib3gubWluLnkgPiB0aGlzLm1heC55IHx8XG5cdFx0XHRib3gubWF4LnogPCB0aGlzLm1pbi56IHx8IGJveC5taW4ueiA+IHRoaXMubWF4LnogPyBmYWxzZSA6IHRydWU7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzU3BoZXJlOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBjbG9zZXN0UG9pbnQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApIHtcblxuXHRcdFx0Ly8gRmluZCB0aGUgcG9pbnQgb24gdGhlIEFBQkIgY2xvc2VzdCB0byB0aGUgc3BoZXJlIGNlbnRlci5cblx0XHRcdHRoaXMuY2xhbXBQb2ludCggc3BoZXJlLmNlbnRlciwgY2xvc2VzdFBvaW50ICk7XG5cblx0XHRcdC8vIElmIHRoYXQgcG9pbnQgaXMgaW5zaWRlIHRoZSBzcGhlcmUsIHRoZSBBQUJCIGFuZCBzcGhlcmUgaW50ZXJzZWN0LlxuXHRcdFx0cmV0dXJuIGNsb3Nlc3RQb2ludC5kaXN0YW5jZVRvU3F1YXJlZCggc3BoZXJlLmNlbnRlciApIDw9ICggc3BoZXJlLnJhZGl1cyAqIHNwaGVyZS5yYWRpdXMgKTtcblxuXHRcdH07XG5cblx0fSApKCksXG5cblx0aW50ZXJzZWN0c1BsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkge1xuXG5cdFx0Ly8gV2UgY29tcHV0ZSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBkb3QgcHJvZHVjdCB2YWx1ZXMuIElmIHRob3NlIHZhbHVlc1xuXHRcdC8vIGFyZSBvbiB0aGUgc2FtZSBzaWRlIChiYWNrIG9yIGZyb250KSBvZiB0aGUgcGxhbmUsIHRoZW4gdGhlcmUgaXMgbm8gaW50ZXJzZWN0aW9uLlxuXG5cdFx0dmFyIG1pbiwgbWF4O1xuXG5cdFx0aWYgKCBwbGFuZS5ub3JtYWwueCA+IDAgKSB7XG5cblx0XHRcdG1pbiA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5taW4ueDtcblx0XHRcdG1heCA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5tYXgueDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdG1pbiA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5tYXgueDtcblx0XHRcdG1heCA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5taW4ueDtcblxuXHRcdH1cblxuXHRcdGlmICggcGxhbmUubm9ybWFsLnkgPiAwICkge1xuXG5cdFx0XHRtaW4gKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1pbi55O1xuXHRcdFx0bWF4ICs9IHBsYW5lLm5vcm1hbC55ICogdGhpcy5tYXgueTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdG1pbiArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWF4Lnk7XG5cdFx0XHRtYXggKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1pbi55O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwbGFuZS5ub3JtYWwueiA+IDAgKSB7XG5cblx0XHRcdG1pbiArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWluLno7XG5cdFx0XHRtYXggKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1heC56O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bWluICs9IHBsYW5lLm5vcm1hbC56ICogdGhpcy5tYXguejtcblx0XHRcdG1heCArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWluLno7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gKCBtaW4gPD0gcGxhbmUuY29uc3RhbnQgJiYgbWF4ID49IHBsYW5lLmNvbnN0YW50ICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzVHJpYW5nbGU6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gdHJpYW5nbGUgY2VudGVyZWQgdmVydGljZXNcblx0XHR2YXIgdjAgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdC8vIHRyaWFuZ2xlIGVkZ2UgdmVjdG9yc1xuXHRcdHZhciBmMCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgZjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIHRlc3RBeGlzID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBjZW50ZXIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBleHRlbnRzID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciB0cmlhbmdsZU5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRmdW5jdGlvbiBzYXRGb3JBeGVzKCBheGVzICkge1xuXG5cdFx0XHR2YXIgaSwgajtcblxuXHRcdFx0Zm9yICggaSA9IDAsIGogPSBheGVzLmxlbmd0aCAtIDM7IGkgPD0gajsgaSArPSAzICkge1xuXG5cdFx0XHRcdHRlc3RBeGlzLmZyb21BcnJheSggYXhlcywgaSApO1xuXHRcdFx0XHQvLyBwcm9qZWN0IHRoZSBhYWJiIG9udG8gdGhlIHNlcGVyYXRpbmcgYXhpc1xuXHRcdFx0XHR2YXIgciA9IGV4dGVudHMueCAqIE1hdGguYWJzKCB0ZXN0QXhpcy54ICkgKyBleHRlbnRzLnkgKiBNYXRoLmFicyggdGVzdEF4aXMueSApICsgZXh0ZW50cy56ICogTWF0aC5hYnMoIHRlc3RBeGlzLnogKTtcblx0XHRcdFx0Ly8gcHJvamVjdCBhbGwgMyB2ZXJ0aWNlcyBvZiB0aGUgdHJpYW5nbGUgb250byB0aGUgc2VwZXJhdGluZyBheGlzXG5cdFx0XHRcdHZhciBwMCA9IHYwLmRvdCggdGVzdEF4aXMgKTtcblx0XHRcdFx0dmFyIHAxID0gdjEuZG90KCB0ZXN0QXhpcyApO1xuXHRcdFx0XHR2YXIgcDIgPSB2Mi5kb3QoIHRlc3RBeGlzICk7XG5cdFx0XHRcdC8vIGFjdHVhbCB0ZXN0LCBiYXNpY2FsbHkgc2VlIGlmIGVpdGhlciBvZiB0aGUgbW9zdCBleHRyZW1lIG9mIHRoZSB0cmlhbmdsZSBwb2ludHMgaW50ZXJzZWN0cyByXG5cdFx0XHRcdGlmICggTWF0aC5tYXgoIC0gTWF0aC5tYXgoIHAwLCBwMSwgcDIgKSwgTWF0aC5taW4oIHAwLCBwMSwgcDIgKSApID4gciApIHtcblxuXHRcdFx0XHRcdC8vIHBvaW50cyBvZiB0aGUgcHJvamVjdGVkIHRyaWFuZ2xlIGFyZSBvdXRzaWRlIHRoZSBwcm9qZWN0ZWQgaGFsZi1sZW5ndGggb2YgdGhlIGFhYmJcblx0XHRcdFx0XHQvLyB0aGUgYXhpcyBpcyBzZXBlcmF0aW5nIGFuZCB3ZSBjYW4gZXhpdFxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0c1RyaWFuZ2xlKCB0cmlhbmdsZSApIHtcblxuXHRcdFx0aWYgKCB0aGlzLmlzRW1wdHkoKSApIHtcblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gY29tcHV0ZSBib3ggY2VudGVyIGFuZCBleHRlbnRzXG5cdFx0XHR0aGlzLmdldENlbnRlciggY2VudGVyICk7XG5cdFx0XHRleHRlbnRzLnN1YlZlY3RvcnMoIHRoaXMubWF4LCBjZW50ZXIgKTtcblxuXHRcdFx0Ly8gdHJhbnNsYXRlIHRyaWFuZ2xlIHRvIGFhYmIgb3JpZ2luXG5cdFx0XHR2MC5zdWJWZWN0b3JzKCB0cmlhbmdsZS5hLCBjZW50ZXIgKTtcblx0XHRcdHYxLnN1YlZlY3RvcnMoIHRyaWFuZ2xlLmIsIGNlbnRlciApO1xuXHRcdFx0djIuc3ViVmVjdG9ycyggdHJpYW5nbGUuYywgY2VudGVyICk7XG5cblx0XHRcdC8vIGNvbXB1dGUgZWRnZSB2ZWN0b3JzIGZvciB0cmlhbmdsZVxuXHRcdFx0ZjAuc3ViVmVjdG9ycyggdjEsIHYwICk7XG5cdFx0XHRmMS5zdWJWZWN0b3JzKCB2MiwgdjEgKTtcblx0XHRcdGYyLnN1YlZlY3RvcnMoIHYwLCB2MiApO1xuXG5cdFx0XHQvLyB0ZXN0IGFnYWluc3QgYXhlcyB0aGF0IGFyZSBnaXZlbiBieSBjcm9zcyBwcm9kdWN0IGNvbWJpbmF0aW9ucyBvZiB0aGUgZWRnZXMgb2YgdGhlIHRyaWFuZ2xlIGFuZCB0aGUgZWRnZXMgb2YgdGhlIGFhYmJcblx0XHRcdC8vIG1ha2UgYW4gYXhpcyB0ZXN0aW5nIG9mIGVhY2ggb2YgdGhlIDMgc2lkZXMgb2YgdGhlIGFhYmIgYWdhaW5zdCBlYWNoIG9mIHRoZSAzIHNpZGVzIG9mIHRoZSB0cmlhbmdsZSA9IDkgYXhpcyBvZiBzZXBhcmF0aW9uXG5cdFx0XHQvLyBheGlzX2lqID0gdV9pIHggZl9qICh1MCwgdTEsIHUyID0gZmFjZSBub3JtYWxzIG9mIGFhYmIgPSB4LHkseiBheGVzIHZlY3RvcnMgc2luY2UgYWFiYiBpcyBheGlzIGFsaWduZWQpXG5cdFx0XHR2YXIgYXhlcyA9IFtcblx0XHRcdFx0MCwgLSBmMC56LCBmMC55LCAwLCAtIGYxLnosIGYxLnksIDAsIC0gZjIueiwgZjIueSxcblx0XHRcdFx0ZjAueiwgMCwgLSBmMC54LCBmMS56LCAwLCAtIGYxLngsIGYyLnosIDAsIC0gZjIueCxcblx0XHRcdFx0LSBmMC55LCBmMC54LCAwLCAtIGYxLnksIGYxLngsIDAsIC0gZjIueSwgZjIueCwgMFxuXHRcdFx0XTtcblx0XHRcdGlmICggISBzYXRGb3JBeGVzKCBheGVzICkgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHRlc3QgMyBmYWNlIG5vcm1hbHMgZnJvbSB0aGUgYWFiYlxuXHRcdFx0YXhlcyA9IFsgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMSBdO1xuXHRcdFx0aWYgKCAhIHNhdEZvckF4ZXMoIGF4ZXMgKSApIHtcblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gZmluYWxseSB0ZXN0aW5nIHRoZSBmYWNlIG5vcm1hbCBvZiB0aGUgdHJpYW5nbGVcblx0XHRcdC8vIHVzZSBhbHJlYWR5IGV4aXN0aW5nIHRyaWFuZ2xlIGVkZ2UgdmVjdG9ycyBoZXJlXG5cdFx0XHR0cmlhbmdsZU5vcm1hbC5jcm9zc1ZlY3RvcnMoIGYwLCBmMSApO1xuXHRcdFx0YXhlcyA9IFsgdHJpYW5nbGVOb3JtYWwueCwgdHJpYW5nbGVOb3JtYWwueSwgdHJpYW5nbGVOb3JtYWwueiBdO1xuXHRcdFx0cmV0dXJuIHNhdEZvckF4ZXMoIGF4ZXMgKTtcblxuXHRcdH07XG5cblx0fSApKCksXG5cblx0Y2xhbXBQb2ludDogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmNsYW1wUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuY29weSggcG9pbnQgKS5jbGFtcCggdGhpcy5taW4sIHRoaXMubWF4ICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHtcblxuXHRcdFx0dmFyIGNsYW1wZWRQb2ludCA9IHYxLmNvcHkoIHBvaW50ICkuY2xhbXAoIHRoaXMubWluLCB0aGlzLm1heCApO1xuXHRcdFx0cmV0dXJuIGNsYW1wZWRQb2ludC5zdWIoIHBvaW50ICkubGVuZ3RoKCk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRnZXRCb3VuZGluZ1NwaGVyZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRCb3VuZGluZ1NwaGVyZSggdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5nZXRCb3VuZGluZ1NwaGVyZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHRcdHRhcmdldCA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmdldENlbnRlciggdGFyZ2V0LmNlbnRlciApO1xuXG5cdFx0XHR0YXJnZXQucmFkaXVzID0gdGhpcy5nZXRTaXplKCB2MSApLmxlbmd0aCgpICogMC41O1xuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW50ZXJzZWN0OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHRoaXMubWluLm1heCggYm94Lm1pbiApO1xuXHRcdHRoaXMubWF4Lm1pbiggYm94Lm1heCApO1xuXG5cdFx0Ly8gZW5zdXJlIHRoYXQgaWYgdGhlcmUgaXMgbm8gb3ZlcmxhcCwgdGhlIHJlc3VsdCBpcyBmdWxseSBlbXB0eSwgbm90IHNsaWdodGx5IGVtcHR5IHdpdGggbm9uLWluZi8raW5mIHZhbHVlcyB0aGF0IHdpbGwgY2F1c2Ugc3Vic2VxdWVuY2UgaW50ZXJzZWN0cyB0byBlcnJvbmVvdXNseSByZXR1cm4gdmFsaWQgdmFsdWVzLlxuXHRcdGlmICggdGhpcy5pc0VtcHR5KCkgKSB0aGlzLm1ha2VFbXB0eSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR1bmlvbjogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5taW4oIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5tYXgoIGJveC5tYXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcG9pbnRzID0gW1xuXHRcdFx0bmV3IFZlY3RvcjMoKSxcblx0XHRcdG5ldyBWZWN0b3IzKCksXG5cdFx0XHRuZXcgVmVjdG9yMygpLFxuXHRcdFx0bmV3IFZlY3RvcjMoKSxcblx0XHRcdG5ldyBWZWN0b3IzKCksXG5cdFx0XHRuZXcgVmVjdG9yMygpLFxuXHRcdFx0bmV3IFZlY3RvcjMoKSxcblx0XHRcdG5ldyBWZWN0b3IzKClcblx0XHRdO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGFwcGx5TWF0cml4NCggbWF0cml4ICkge1xuXG5cdFx0XHQvLyB0cmFuc2Zvcm0gb2YgZW1wdHkgYm94IGlzIGFuIGVtcHR5IGJveC5cblx0XHRcdGlmICggdGhpcy5pc0VtcHR5KCkgKSByZXR1cm4gdGhpcztcblxuXHRcdFx0Ly8gTk9URTogSSBhbSB1c2luZyBhIGJpbmFyeSBwYXR0ZXJuIHRvIHNwZWNpZnkgYWxsIDJeMyBjb21iaW5hdGlvbnMgYmVsb3dcblx0XHRcdHBvaW50c1sgMCBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5taW4ueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAwMFxuXHRcdFx0cG9pbnRzWyAxIF0uc2V0KCB0aGlzLm1pbi54LCB0aGlzLm1pbi55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMDAxXG5cdFx0XHRwb2ludHNbIDIgXS5zZXQoIHRoaXMubWluLngsIHRoaXMubWF4LnksIHRoaXMubWluLnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAwMTBcblx0XHRcdHBvaW50c1sgMyBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5tYXgueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAxMVxuXHRcdFx0cG9pbnRzWyA0IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1pbi55LCB0aGlzLm1pbi56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMTAwXG5cdFx0XHRwb2ludHNbIDUgXS5zZXQoIHRoaXMubWF4LngsIHRoaXMubWluLnksIHRoaXMubWF4LnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAxMDFcblx0XHRcdHBvaW50c1sgNiBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5tYXgueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDExMFxuXHRcdFx0cG9pbnRzWyA3IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1heC55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcdC8vIDExMVxuXG5cdFx0XHR0aGlzLnNldEZyb21Qb2ludHMoIHBvaW50cyApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLm1pbi5hZGQoIG9mZnNldCApO1xuXHRcdHRoaXMubWF4LmFkZCggb2Zmc2V0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRyZXR1cm4gYm94Lm1pbi5lcXVhbHMoIHRoaXMubWluICkgJiYgYm94Lm1heC5lcXVhbHMoIHRoaXMubWF4ICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTcGhlcmUoIGNlbnRlciwgcmFkaXVzICkge1xuXG5cdHRoaXMuY2VudGVyID0gKCBjZW50ZXIgIT09IHVuZGVmaW5lZCApID8gY2VudGVyIDogbmV3IFZlY3RvcjMoKTtcblx0dGhpcy5yYWRpdXMgPSAoIHJhZGl1cyAhPT0gdW5kZWZpbmVkICkgPyByYWRpdXMgOiAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFNwaGVyZS5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggY2VudGVyLCByYWRpdXMgKSB7XG5cblx0XHR0aGlzLmNlbnRlci5jb3B5KCBjZW50ZXIgKTtcblx0XHR0aGlzLnJhZGl1cyA9IHJhZGl1cztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJveCA9IG5ldyBCb3gzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbVBvaW50cyggcG9pbnRzLCBvcHRpb25hbENlbnRlciApIHtcblxuXHRcdFx0dmFyIGNlbnRlciA9IHRoaXMuY2VudGVyO1xuXG5cdFx0XHRpZiAoIG9wdGlvbmFsQ2VudGVyICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y2VudGVyLmNvcHkoIG9wdGlvbmFsQ2VudGVyICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ym94LnNldEZyb21Qb2ludHMoIHBvaW50cyApLmdldENlbnRlciggY2VudGVyICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG1heFJhZGl1c1NxID0gMDtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRtYXhSYWRpdXNTcSA9IE1hdGgubWF4KCBtYXhSYWRpdXNTcSwgY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludHNbIGkgXSApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5yYWRpdXMgPSBNYXRoLnNxcnQoIG1heFJhZGl1c1NxICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0dGhpcy5jZW50ZXIuY29weSggc3BoZXJlLmNlbnRlciApO1xuXHRcdHRoaXMucmFkaXVzID0gc3BoZXJlLnJhZGl1cztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiAoIHRoaXMucmFkaXVzIDw9IDAgKTtcblxuXHR9LFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gKCBwb2ludC5kaXN0YW5jZVRvU3F1YXJlZCggdGhpcy5jZW50ZXIgKSA8PSAoIHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXMgKSApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0cmV0dXJuICggcG9pbnQuZGlzdGFuY2VUbyggdGhpcy5jZW50ZXIgKSAtIHRoaXMucmFkaXVzICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHtcblxuXHRcdHZhciByYWRpdXNTdW0gPSB0aGlzLnJhZGl1cyArIHNwaGVyZS5yYWRpdXM7XG5cblx0XHRyZXR1cm4gc3BoZXJlLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCggdGhpcy5jZW50ZXIgKSA8PSAoIHJhZGl1c1N1bSAqIHJhZGl1c1N1bSApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c0JveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRyZXR1cm4gYm94LmludGVyc2VjdHNTcGhlcmUoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNQbGFuZTogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggcGxhbmUuZGlzdGFuY2VUb1BvaW50KCB0aGlzLmNlbnRlciApICkgPD0gdGhpcy5yYWRpdXM7XG5cblx0fSxcblxuXHRjbGFtcFBvaW50OiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHR2YXIgZGVsdGFMZW5ndGhTcSA9IHRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludCApO1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU3BoZXJlOiAuY2xhbXBQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0dGFyZ2V0LmNvcHkoIHBvaW50ICk7XG5cblx0XHRpZiAoIGRlbHRhTGVuZ3RoU3EgPiAoIHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXMgKSApIHtcblxuXHRcdFx0dGFyZ2V0LnN1YiggdGhpcy5jZW50ZXIgKS5ub3JtYWxpemUoKTtcblx0XHRcdHRhcmdldC5tdWx0aXBseVNjYWxhciggdGhpcy5yYWRpdXMgKS5hZGQoIHRoaXMuY2VudGVyICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdH0sXG5cblx0Z2V0Qm91bmRpbmdCb3g6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU3BoZXJlOiAuZ2V0Qm91bmRpbmdCb3goKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IEJveDMoKTtcblxuXHRcdH1cblxuXHRcdHRhcmdldC5zZXQoIHRoaXMuY2VudGVyLCB0aGlzLmNlbnRlciApO1xuXHRcdHRhcmdldC5leHBhbmRCeVNjYWxhciggdGhpcy5yYWRpdXMgKTtcblxuXHRcdHJldHVybiB0YXJnZXQ7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdFx0dGhpcy5jZW50ZXIuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblx0XHR0aGlzLnJhZGl1cyA9IHRoaXMucmFkaXVzICogbWF0cml4LmdldE1heFNjYWxlT25BeGlzKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmNlbnRlci5hZGQoIG9mZnNldCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHNwaGVyZS5jZW50ZXIuZXF1YWxzKCB0aGlzLmNlbnRlciApICYmICggc3BoZXJlLnJhZGl1cyA9PT0gdGhpcy5yYWRpdXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuZnVuY3Rpb24gUGxhbmUoIG5vcm1hbCwgY29uc3RhbnQgKSB7XG5cblx0Ly8gbm9ybWFsIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXG5cdHRoaXMubm9ybWFsID0gKCBub3JtYWwgIT09IHVuZGVmaW5lZCApID8gbm9ybWFsIDogbmV3IFZlY3RvcjMoIDEsIDAsIDAgKTtcblx0dGhpcy5jb25zdGFudCA9ICggY29uc3RhbnQgIT09IHVuZGVmaW5lZCApID8gY29uc3RhbnQgOiAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFBsYW5lLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBub3JtYWwsIGNvbnN0YW50ICkge1xuXG5cdFx0dGhpcy5ub3JtYWwuY29weSggbm9ybWFsICk7XG5cdFx0dGhpcy5jb25zdGFudCA9IGNvbnN0YW50O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRDb21wb25lbnRzOiBmdW5jdGlvbiAoIHgsIHksIHosIHcgKSB7XG5cblx0XHR0aGlzLm5vcm1hbC5zZXQoIHgsIHksIHogKTtcblx0XHR0aGlzLmNvbnN0YW50ID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQ6IGZ1bmN0aW9uICggbm9ybWFsLCBwb2ludCApIHtcblxuXHRcdHRoaXMubm9ybWFsLmNvcHkoIG5vcm1hbCApO1xuXHRcdHRoaXMuY29uc3RhbnQgPSAtIHBvaW50LmRvdCggdGhpcy5ub3JtYWwgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUNvcGxhbmFyUG9pbnRzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2MiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbUNvcGxhbmFyUG9pbnRzKCBhLCBiLCBjICkge1xuXG5cdFx0XHR2YXIgbm9ybWFsID0gdjEuc3ViVmVjdG9ycyggYywgYiApLmNyb3NzKCB2Mi5zdWJWZWN0b3JzKCBhLCBiICkgKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0Ly8gUTogc2hvdWxkIGFuIGVycm9yIGJlIHRocm93biBpZiBub3JtYWwgaXMgemVybyAoZS5nLiBkZWdlbmVyYXRlIHBsYW5lKT9cblxuXHRcdFx0dGhpcy5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludCggbm9ybWFsLCBhICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0XHR0aGlzLm5vcm1hbC5jb3B5KCBwbGFuZS5ub3JtYWwgKTtcblx0XHR0aGlzLmNvbnN0YW50ID0gcGxhbmUuY29uc3RhbnQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gTm90ZTogd2lsbCBsZWFkIHRvIGEgZGl2aWRlIGJ5IHplcm8gaWYgdGhlIHBsYW5lIGlzIGludmFsaWQuXG5cblx0XHR2YXIgaW52ZXJzZU5vcm1hbExlbmd0aCA9IDEuMCAvIHRoaXMubm9ybWFsLmxlbmd0aCgpO1xuXHRcdHRoaXMubm9ybWFsLm11bHRpcGx5U2NhbGFyKCBpbnZlcnNlTm9ybWFsTGVuZ3RoICk7XG5cdFx0dGhpcy5jb25zdGFudCAqPSBpbnZlcnNlTm9ybWFsTGVuZ3RoO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY29uc3RhbnQgKj0gLSAxO1xuXHRcdHRoaXMubm9ybWFsLm5lZ2F0ZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWwuZG90KCBwb2ludCApICsgdGhpcy5jb25zdGFudDtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9TcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBzcGhlcmUuY2VudGVyICkgLSBzcGhlcmUucmFkaXVzO1xuXG5cdH0sXG5cblx0cHJvamVjdFBvaW50OiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5QbGFuZTogLnByb2plY3RQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCB0aGlzLm5vcm1hbCApLm11bHRpcGx5U2NhbGFyKCAtIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBwb2ludCApICkuYWRkKCBwb2ludCApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0TGluZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKCBsaW5lLCB0YXJnZXQgKSB7XG5cblx0XHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGxhbmU6IC5pbnRlcnNlY3RMaW5lKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZGlyZWN0aW9uID0gbGluZS5kZWx0YSggdjEgKTtcblxuXHRcdFx0dmFyIGRlbm9taW5hdG9yID0gdGhpcy5ub3JtYWwuZG90KCBkaXJlY3Rpb24gKTtcblxuXHRcdFx0aWYgKCBkZW5vbWluYXRvciA9PT0gMCApIHtcblxuXHRcdFx0XHQvLyBsaW5lIGlzIGNvcGxhbmFyLCByZXR1cm4gb3JpZ2luXG5cdFx0XHRcdGlmICggdGhpcy5kaXN0YW5jZVRvUG9pbnQoIGxpbmUuc3RhcnQgKSA9PT0gMCApIHtcblxuXHRcdFx0XHRcdHJldHVybiB0YXJnZXQuY29weSggbGluZS5zdGFydCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBVbnN1cmUgaWYgdGhpcyBpcyB0aGUgY29ycmVjdCBtZXRob2QgdG8gaGFuZGxlIHRoaXMgY2FzZS5cblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgdCA9IC0gKCBsaW5lLnN0YXJ0LmRvdCggdGhpcy5ub3JtYWwgKSArIHRoaXMuY29uc3RhbnQgKSAvIGRlbm9taW5hdG9yO1xuXG5cdFx0XHRpZiAoIHQgPCAwIHx8IHQgPiAxICkge1xuXG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBkaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggdCApLmFkZCggbGluZS5zdGFydCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW50ZXJzZWN0c0xpbmU6IGZ1bmN0aW9uICggbGluZSApIHtcblxuXHRcdC8vIE5vdGU6IHRoaXMgdGVzdHMgaWYgYSBsaW5lIGludGVyc2VjdHMgdGhlIHBsYW5lLCBub3Qgd2hldGhlciBpdCAob3IgaXRzIGVuZC1wb2ludHMpIGFyZSBjb3BsYW5hciB3aXRoIGl0LlxuXG5cdFx0dmFyIHN0YXJ0U2lnbiA9IHRoaXMuZGlzdGFuY2VUb1BvaW50KCBsaW5lLnN0YXJ0ICk7XG5cdFx0dmFyIGVuZFNpZ24gPSB0aGlzLmRpc3RhbmNlVG9Qb2ludCggbGluZS5lbmQgKTtcblxuXHRcdHJldHVybiAoIHN0YXJ0U2lnbiA8IDAgJiYgZW5kU2lnbiA+IDAgKSB8fCAoIGVuZFNpZ24gPCAwICYmIHN0YXJ0U2lnbiA+IDAgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5pbnRlcnNlY3RzUGxhbmUoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHNwaGVyZS5pbnRlcnNlY3RzUGxhbmUoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcGxhbmFyUG9pbnQ6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGxhbmU6IC5jb3BsYW5hclBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMubm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIC0gdGhpcy5jb25zdGFudCApO1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXgzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gYXBwbHlNYXRyaXg0KCBtYXRyaXgsIG9wdGlvbmFsTm9ybWFsTWF0cml4ICkge1xuXG5cdFx0XHR2YXIgbm9ybWFsTWF0cml4ID0gb3B0aW9uYWxOb3JtYWxNYXRyaXggfHwgbTEuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTtcblxuXHRcdFx0dmFyIHJlZmVyZW5jZVBvaW50ID0gdGhpcy5jb3BsYW5hclBvaW50KCB2MSApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHRcdHZhciBub3JtYWwgPSB0aGlzLm5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHR0aGlzLmNvbnN0YW50ID0gLSByZWZlcmVuY2VQb2ludC5kb3QoIG5vcm1hbCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmNvbnN0YW50IC09IG9mZnNldC5kb3QoIHRoaXMubm9ybWFsICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdHJldHVybiBwbGFuZS5ub3JtYWwuZXF1YWxzKCB0aGlzLm5vcm1hbCApICYmICggcGxhbmUuY29uc3RhbnQgPT09IHRoaXMuY29uc3RhbnQgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBGcnVzdHVtKCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1ICkge1xuXG5cdHRoaXMucGxhbmVzID0gW1xuXG5cdFx0KCBwMCAhPT0gdW5kZWZpbmVkICkgPyBwMCA6IG5ldyBQbGFuZSgpLFxuXHRcdCggcDEgIT09IHVuZGVmaW5lZCApID8gcDEgOiBuZXcgUGxhbmUoKSxcblx0XHQoIHAyICE9PSB1bmRlZmluZWQgKSA/IHAyIDogbmV3IFBsYW5lKCksXG5cdFx0KCBwMyAhPT0gdW5kZWZpbmVkICkgPyBwMyA6IG5ldyBQbGFuZSgpLFxuXHRcdCggcDQgIT09IHVuZGVmaW5lZCApID8gcDQgOiBuZXcgUGxhbmUoKSxcblx0XHQoIHA1ICE9PSB1bmRlZmluZWQgKSA/IHA1IDogbmV3IFBsYW5lKClcblxuXHRdO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEZydXN0dW0ucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUgKSB7XG5cblx0XHR2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7XG5cblx0XHRwbGFuZXNbIDAgXS5jb3B5KCBwMCApO1xuXHRcdHBsYW5lc1sgMSBdLmNvcHkoIHAxICk7XG5cdFx0cGxhbmVzWyAyIF0uY29weSggcDIgKTtcblx0XHRwbGFuZXNbIDMgXS5jb3B5KCBwMyApO1xuXHRcdHBsYW5lc1sgNCBdLmNvcHkoIHA0ICk7XG5cdFx0cGxhbmVzWyA1IF0uY29weSggcDUgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggZnJ1c3R1bSApIHtcblxuXHRcdHZhciBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdHBsYW5lc1sgaSBdLmNvcHkoIGZydXN0dW0ucGxhbmVzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbU1hdHJpeDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXHRcdHZhciBtZSA9IG0uZWxlbWVudHM7XG5cdFx0dmFyIG1lMCA9IG1lWyAwIF0sIG1lMSA9IG1lWyAxIF0sIG1lMiA9IG1lWyAyIF0sIG1lMyA9IG1lWyAzIF07XG5cdFx0dmFyIG1lNCA9IG1lWyA0IF0sIG1lNSA9IG1lWyA1IF0sIG1lNiA9IG1lWyA2IF0sIG1lNyA9IG1lWyA3IF07XG5cdFx0dmFyIG1lOCA9IG1lWyA4IF0sIG1lOSA9IG1lWyA5IF0sIG1lMTAgPSBtZVsgMTAgXSwgbWUxMSA9IG1lWyAxMSBdO1xuXHRcdHZhciBtZTEyID0gbWVbIDEyIF0sIG1lMTMgPSBtZVsgMTMgXSwgbWUxNCA9IG1lWyAxNCBdLCBtZTE1ID0gbWVbIDE1IF07XG5cblx0XHRwbGFuZXNbIDAgXS5zZXRDb21wb25lbnRzKCBtZTMgLSBtZTAsIG1lNyAtIG1lNCwgbWUxMSAtIG1lOCwgbWUxNSAtIG1lMTIgKS5ub3JtYWxpemUoKTtcblx0XHRwbGFuZXNbIDEgXS5zZXRDb21wb25lbnRzKCBtZTMgKyBtZTAsIG1lNyArIG1lNCwgbWUxMSArIG1lOCwgbWUxNSArIG1lMTIgKS5ub3JtYWxpemUoKTtcblx0XHRwbGFuZXNbIDIgXS5zZXRDb21wb25lbnRzKCBtZTMgKyBtZTEsIG1lNyArIG1lNSwgbWUxMSArIG1lOSwgbWUxNSArIG1lMTMgKS5ub3JtYWxpemUoKTtcblx0XHRwbGFuZXNbIDMgXS5zZXRDb21wb25lbnRzKCBtZTMgLSBtZTEsIG1lNyAtIG1lNSwgbWUxMSAtIG1lOSwgbWUxNSAtIG1lMTMgKS5ub3JtYWxpemUoKTtcblx0XHRwbGFuZXNbIDQgXS5zZXRDb21wb25lbnRzKCBtZTMgLSBtZTIsIG1lNyAtIG1lNiwgbWUxMSAtIG1lMTAsIG1lMTUgLSBtZTE0ICkubm9ybWFsaXplKCk7XG5cdFx0cGxhbmVzWyA1IF0uc2V0Q29tcG9uZW50cyggbWUzICsgbWUyLCBtZTcgKyBtZTYsIG1lMTEgKyBtZTEwLCBtZTE1ICsgbWUxNCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzT2JqZWN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdHNPYmplY3QoIG9iamVjdCApIHtcblxuXHRcdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsIClcblx0XHRcdFx0Z2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRcdHNwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApXG5cdFx0XHRcdC5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdHNTcHJpdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0c1Nwcml0ZSggc3ByaXRlICkge1xuXG5cdFx0XHRzcGhlcmUuY2VudGVyLnNldCggMCwgMCwgMCApO1xuXHRcdFx0c3BoZXJlLnJhZGl1cyA9IDAuNzA3MTA2NzgxMTg2NTQ3Njtcblx0XHRcdHNwaGVyZS5hcHBseU1hdHJpeDQoIHNwcml0ZS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXHRcdHZhciBjZW50ZXIgPSBzcGhlcmUuY2VudGVyO1xuXHRcdHZhciBuZWdSYWRpdXMgPSAtIHNwaGVyZS5yYWRpdXM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHR2YXIgZGlzdGFuY2UgPSBwbGFuZXNbIGkgXS5kaXN0YW5jZVRvUG9pbnQoIGNlbnRlciApO1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgbmVnUmFkaXVzICkge1xuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzQm94OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcDEgPSBuZXcgVmVjdG9yMygpLFxuXHRcdFx0cDIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdHNCb3goIGJveCApIHtcblxuXHRcdFx0dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBwbGFuZSA9IHBsYW5lc1sgaSBdO1xuXG5cdFx0XHRcdHAxLnggPSBwbGFuZS5ub3JtYWwueCA+IDAgPyBib3gubWluLnggOiBib3gubWF4Lng7XG5cdFx0XHRcdHAyLnggPSBwbGFuZS5ub3JtYWwueCA+IDAgPyBib3gubWF4LnggOiBib3gubWluLng7XG5cdFx0XHRcdHAxLnkgPSBwbGFuZS5ub3JtYWwueSA+IDAgPyBib3gubWluLnkgOiBib3gubWF4Lnk7XG5cdFx0XHRcdHAyLnkgPSBwbGFuZS5ub3JtYWwueSA+IDAgPyBib3gubWF4LnkgOiBib3gubWluLnk7XG5cdFx0XHRcdHAxLnogPSBwbGFuZS5ub3JtYWwueiA+IDAgPyBib3gubWluLnogOiBib3gubWF4Lno7XG5cdFx0XHRcdHAyLnogPSBwbGFuZS5ub3JtYWwueiA+IDAgPyBib3gubWF4LnogOiBib3gubWluLno7XG5cblx0XHRcdFx0dmFyIGQxID0gcGxhbmUuZGlzdGFuY2VUb1BvaW50KCBwMSApO1xuXHRcdFx0XHR2YXIgZDIgPSBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHAyICk7XG5cblx0XHRcdFx0Ly8gaWYgYm90aCBvdXRzaWRlIHBsYW5lLCBubyBpbnRlcnNlY3Rpb25cblxuXHRcdFx0XHRpZiAoIGQxIDwgMCAmJiBkMiA8IDAgKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHZhciBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdGlmICggcGxhbmVzWyBpIF0uZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIDwgMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH1cblxufSApO1xuXG52YXIgYWxwaGFtYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQUxQSEFNQVBcXG5cXHRkaWZmdXNlQ29sb3IuYSAqPSB0ZXh0dXJlMkQoIGFscGhhTWFwLCB2VXYgKS5nO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgYWxwaGFtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9BTFBIQU1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgYWxwaGF0ZXN0X2ZyYWdtZW50ID0gXCIjaWZkZWYgQUxQSEFURVNUXFxuXFx0aWYgKCBkaWZmdXNlQ29sb3IuYSA8IEFMUEhBVEVTVCApIGRpc2NhcmQ7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBhb21hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9BT01BUFxcblxcdGZsb2F0IGFtYmllbnRPY2NsdXNpb24gPSAoIHRleHR1cmUyRCggYW9NYXAsIHZVdjIgKS5yIC0gMS4wICkgKiBhb01hcEludGVuc2l0eSArIDEuMDtcXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gYW1iaWVudE9jY2x1c2lvbjtcXG5cXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFBIWVNJQ0FMIClcXG5cXHRcXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciAqPSBjb21wdXRlU3BlY3VsYXJPY2NsdXNpb24oIGRvdE5WLCBhbWJpZW50T2NjbHVzaW9uLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgYW9tYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9BT01BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGFvTWFwO1xcblxcdHVuaWZvcm0gZmxvYXQgYW9NYXBJbnRlbnNpdHk7XFxuI2VuZGlmXCI7XG5cbnZhciBiZWdpbl92ZXJ0ZXggPSBcIlxcbnZlYzMgdHJhbnNmb3JtZWQgPSB2ZWMzKCBwb3NpdGlvbiApO1xcblwiO1xuXG52YXIgYmVnaW5ub3JtYWxfdmVydGV4ID0gXCJcXG52ZWMzIG9iamVjdE5vcm1hbCA9IHZlYzMoIG5vcm1hbCApO1xcblwiO1xuXG52YXIgYnNkZnMgPSBcImZsb2F0IHB1bmN0dWFsTGlnaHRJbnRlbnNpdHlUb0lycmFkaWFuY2VGYWN0b3IoIGNvbnN0IGluIGZsb2F0IGxpZ2h0RGlzdGFuY2UsIGNvbnN0IGluIGZsb2F0IGN1dG9mZkRpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBkZWNheUV4cG9uZW50ICkge1xcblxcdGlmKCBkZWNheUV4cG9uZW50ID4gMC4wICkge1xcbiNpZiBkZWZpbmVkICggUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUUyApXFxuXFx0XFx0ZmxvYXQgZGlzdGFuY2VGYWxsb2ZmID0gMS4wIC8gbWF4KCBwb3coIGxpZ2h0RGlzdGFuY2UsIGRlY2F5RXhwb25lbnQgKSwgMC4wMSApO1xcblxcdFxcdGZsb2F0IG1heERpc3RhbmNlQ3V0b2ZmRmFjdG9yID0gcG93Miggc2F0dXJhdGUoIDEuMCAtIHBvdzQoIGxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSApICkgKTtcXG5cXHRcXHRyZXR1cm4gZGlzdGFuY2VGYWxsb2ZmICogbWF4RGlzdGFuY2VDdXRvZmZGYWN0b3I7XFxuI2Vsc2VcXG5cXHRcXHRyZXR1cm4gcG93KCBzYXR1cmF0ZSggLWxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSArIDEuMCApLCBkZWNheUV4cG9uZW50ICk7XFxuI2VuZGlmXFxuXFx0fVxcblxcdHJldHVybiAxLjA7XFxufVxcbnZlYzMgQlJERl9EaWZmdXNlX0xhbWJlcnQoIGNvbnN0IGluIHZlYzMgZGlmZnVzZUNvbG9yICkge1xcblxcdHJldHVybiBSRUNJUFJPQ0FMX1BJICogZGlmZnVzZUNvbG9yO1xcbn1cXG52ZWMzIEZfU2NobGljayggY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBkb3RMSCApIHtcXG5cXHRmbG9hdCBmcmVzbmVsID0gZXhwMiggKCAtNS41NTQ3MyAqIGRvdExIIC0gNi45ODMxNiApICogZG90TEggKTtcXG5cXHRyZXR1cm4gKCAxLjAgLSBzcGVjdWxhckNvbG9yICkgKiBmcmVzbmVsICsgc3BlY3VsYXJDb2xvcjtcXG59XFxuZmxvYXQgR19HR1hfU21pdGgoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XFxuXFx0ZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApO1xcblxcdGZsb2F0IGdsID0gZG90TkwgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5MICkgKTtcXG5cXHRmbG9hdCBndiA9IGRvdE5WICsgc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROViApICk7XFxuXFx0cmV0dXJuIDEuMCAvICggZ2wgKiBndiApO1xcbn1cXG5mbG9hdCBHX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XFxuXFx0ZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApO1xcblxcdGZsb2F0IGd2ID0gZG90TkwgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcXG5cXHRmbG9hdCBnbCA9IGRvdE5WICogc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XFxuXFx0cmV0dXJuIDAuNSAvIG1heCggZ3YgKyBnbCwgRVBTSUxPTiApO1xcbn1cXG5mbG9hdCBEX0dHWCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkge1xcblxcdGZsb2F0IGEyID0gcG93MiggYWxwaGEgKTtcXG5cXHRmbG9hdCBkZW5vbSA9IHBvdzIoIGRvdE5IICkgKiAoIGEyIC0gMS4wICkgKyAxLjA7XFxuXFx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBhMiAvIHBvdzIoIGRlbm9tICk7XFxufVxcbnZlYzMgQlJERl9TcGVjdWxhcl9HR1goIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XFxuXFx0ZmxvYXQgYWxwaGEgPSBwb3cyKCByb3VnaG5lc3MgKTtcXG5cXHR2ZWMzIGhhbGZEaXIgPSBub3JtYWxpemUoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uICsgZ2VvbWV0cnkudmlld0RpciApO1xcblxcdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiApICk7XFxuXFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGdlb21ldHJ5LnZpZXdEaXIgKSApO1xcblxcdGZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoYWxmRGlyICkgKTtcXG5cXHRmbG9hdCBkb3RMSCA9IHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcXG5cXHR2ZWMzIEYgPSBGX1NjaGxpY2soIHNwZWN1bGFyQ29sb3IsIGRvdExIICk7XFxuXFx0ZmxvYXQgRyA9IEdfR0dYX1NtaXRoQ29ycmVsYXRlZCggYWxwaGEsIGRvdE5MLCBkb3ROViApO1xcblxcdGZsb2F0IEQgPSBEX0dHWCggYWxwaGEsIGRvdE5IICk7XFxuXFx0cmV0dXJuIEYgKiAoIEcgKiBEICk7XFxufVxcbnZlYzIgTFRDX1V2KCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xcblxcdGNvbnN0IGZsb2F0IExVVF9TSVpFICA9IDY0LjA7XFxuXFx0Y29uc3QgZmxvYXQgTFVUX1NDQUxFID0gKCBMVVRfU0laRSAtIDEuMCApIC8gTFVUX1NJWkU7XFxuXFx0Y29uc3QgZmxvYXQgTFVUX0JJQVMgID0gMC41IC8gTFVUX1NJWkU7XFxuXFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBOLCBWICkgKTtcXG5cXHR2ZWMyIHV2ID0gdmVjMiggcm91Z2huZXNzLCBzcXJ0KCAxLjAgLSBkb3ROViApICk7XFxuXFx0dXYgPSB1diAqIExVVF9TQ0FMRSArIExVVF9CSUFTO1xcblxcdHJldHVybiB1djtcXG59XFxuZmxvYXQgTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIGYgKSB7XFxuXFx0ZmxvYXQgbCA9IGxlbmd0aCggZiApO1xcblxcdHJldHVybiBtYXgoICggbCAqIGwgKyBmLnogKSAvICggbCArIDEuMCApLCAwLjAgKTtcXG59XFxudmVjMyBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvbnN0IGluIHZlYzMgdjEsIGNvbnN0IGluIHZlYzMgdjIgKSB7XFxuXFx0ZmxvYXQgeCA9IGRvdCggdjEsIHYyICk7XFxuXFx0ZmxvYXQgeSA9IGFicyggeCApO1xcblxcdGZsb2F0IGEgPSAwLjg1NDM5ODUgKyAoIDAuNDk2NTE1NSArIDAuMDE0NTIwNiAqIHkgKSAqIHk7XFxuXFx0ZmxvYXQgYiA9IDMuNDE3NTk0MCArICggNC4xNjE2NzI0ICsgeSApICogeTtcXG5cXHRmbG9hdCB2ID0gYSAvIGI7XFxuXFx0ZmxvYXQgdGhldGFfc2ludGhldGEgPSAoIHggPiAwLjAgKSA/IHYgOiAwLjUgKiBpbnZlcnNlc3FydCggbWF4KCAxLjAgLSB4ICogeCwgMWUtNyApICkgLSB2O1xcblxcdHJldHVybiBjcm9zcyggdjEsIHYyICkgKiB0aGV0YV9zaW50aGV0YTtcXG59XFxudmVjMyBMVENfRXZhbHVhdGUoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiB2ZWMzIFAsIGNvbnN0IGluIG1hdDMgbUludiwgY29uc3QgaW4gdmVjMyByZWN0Q29vcmRzWyA0IF0gKSB7XFxuXFx0dmVjMyB2MSA9IHJlY3RDb29yZHNbIDEgXSAtIHJlY3RDb29yZHNbIDAgXTtcXG5cXHR2ZWMzIHYyID0gcmVjdENvb3Jkc1sgMyBdIC0gcmVjdENvb3Jkc1sgMCBdO1xcblxcdHZlYzMgbGlnaHROb3JtYWwgPSBjcm9zcyggdjEsIHYyICk7XFxuXFx0aWYoIGRvdCggbGlnaHROb3JtYWwsIFAgLSByZWN0Q29vcmRzWyAwIF0gKSA8IDAuMCApIHJldHVybiB2ZWMzKCAwLjAgKTtcXG5cXHR2ZWMzIFQxLCBUMjtcXG5cXHRUMSA9IG5vcm1hbGl6ZSggViAtIE4gKiBkb3QoIFYsIE4gKSApO1xcblxcdFQyID0gLSBjcm9zcyggTiwgVDEgKTtcXG5cXHRtYXQzIG1hdCA9IG1JbnYgKiB0cmFuc3Bvc2VNYXQzKCBtYXQzKCBUMSwgVDIsIE4gKSApO1xcblxcdHZlYzMgY29vcmRzWyA0IF07XFxuXFx0Y29vcmRzWyAwIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDAgXSAtIFAgKTtcXG5cXHRjb29yZHNbIDEgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMSBdIC0gUCApO1xcblxcdGNvb3Jkc1sgMiBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAyIF0gLSBQICk7XFxuXFx0Y29vcmRzWyAzIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDMgXSAtIFAgKTtcXG5cXHRjb29yZHNbIDAgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAwIF0gKTtcXG5cXHRjb29yZHNbIDEgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAxIF0gKTtcXG5cXHRjb29yZHNbIDIgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAyIF0gKTtcXG5cXHRjb29yZHNbIDMgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAzIF0gKTtcXG5cXHR2ZWMzIHZlY3RvckZvcm1GYWN0b3IgPSB2ZWMzKCAwLjAgKTtcXG5cXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAwIF0sIGNvb3Jkc1sgMSBdICk7XFxuXFx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMSBdLCBjb29yZHNbIDIgXSApO1xcblxcdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDIgXSwgY29vcmRzWyAzIF0gKTtcXG5cXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAzIF0sIGNvb3Jkc1sgMCBdICk7XFxuXFx0ZmxvYXQgcmVzdWx0ID0gTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCB2ZWN0b3JGb3JtRmFjdG9yICk7XFxuXFx0cmV0dXJuIHZlYzMoIHJlc3VsdCApO1xcbn1cXG52ZWMzIEJSREZfU3BlY3VsYXJfR0dYX0Vudmlyb25tZW50KCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcXG5cXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XFxuXFx0Y29uc3QgdmVjNCBjMCA9IHZlYzQoIC0gMSwgLSAwLjAyNzUsIC0gMC41NzIsIDAuMDIyICk7XFxuXFx0Y29uc3QgdmVjNCBjMSA9IHZlYzQoIDEsIDAuMDQyNSwgMS4wNCwgLSAwLjA0ICk7XFxuXFx0dmVjNCByID0gcm91Z2huZXNzICogYzAgKyBjMTtcXG5cXHRmbG9hdCBhMDA0ID0gbWluKCByLnggKiByLngsIGV4cDIoIC0gOS4yOCAqIGRvdE5WICkgKSAqIHIueCArIHIueTtcXG5cXHR2ZWMyIEFCID0gdmVjMiggLTEuMDQsIDEuMDQgKSAqIGEwMDQgKyByLnp3O1xcblxcdHJldHVybiBzcGVjdWxhckNvbG9yICogQUIueCArIEFCLnk7XFxufVxcbmZsb2F0IEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKSB7XFxuXFx0cmV0dXJuIDAuMjU7XFxufVxcbmZsb2F0IERfQmxpbm5QaG9uZyggY29uc3QgaW4gZmxvYXQgc2hpbmluZXNzLCBjb25zdCBpbiBmbG9hdCBkb3ROSCApIHtcXG5cXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqICggc2hpbmluZXNzICogMC41ICsgMS4wICkgKiBwb3coIGRvdE5ILCBzaGluaW5lc3MgKTtcXG59XFxudmVjMyBCUkRGX1NwZWN1bGFyX0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzaGluaW5lc3MgKSB7XFxuXFx0dmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiArIGdlb21ldHJ5LnZpZXdEaXIgKTtcXG5cXHRmbG9hdCBkb3ROSCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgaGFsZkRpciApICk7XFxuXFx0ZmxvYXQgZG90TEggPSBzYXR1cmF0ZSggZG90KCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiwgaGFsZkRpciApICk7XFxuXFx0dmVjMyBGID0gRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCBkb3RMSCApO1xcblxcdGZsb2F0IEcgPSBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICk7XFxuXFx0ZmxvYXQgRCA9IERfQmxpbm5QaG9uZyggc2hpbmluZXNzLCBkb3ROSCApO1xcblxcdHJldHVybiBGICogKCBHICogRCApO1xcbn1cXG5mbG9hdCBHR1hSb3VnaG5lc3NUb0JsaW5uRXhwb25lbnQoIGNvbnN0IGluIGZsb2F0IGdneFJvdWdobmVzcyApIHtcXG5cXHRyZXR1cm4gKCAyLjAgLyBwb3cyKCBnZ3hSb3VnaG5lc3MgKyAwLjAwMDEgKSAtIDIuMCApO1xcbn1cXG5mbG9hdCBCbGlubkV4cG9uZW50VG9HR1hSb3VnaG5lc3MoIGNvbnN0IGluIGZsb2F0IGJsaW5uRXhwb25lbnQgKSB7XFxuXFx0cmV0dXJuIHNxcnQoIDIuMCAvICggYmxpbm5FeHBvbmVudCArIDIuMCApICk7XFxufVxcblwiO1xuXG52YXIgYnVtcG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0JVTVBNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBidW1wTWFwO1xcblxcdHVuaWZvcm0gZmxvYXQgYnVtcFNjYWxlO1xcblxcdHZlYzIgZEhkeHlfZndkKCkge1xcblxcdFxcdHZlYzIgZFNUZHggPSBkRmR4KCB2VXYgKTtcXG5cXHRcXHR2ZWMyIGRTVGR5ID0gZEZkeSggdlV2ICk7XFxuXFx0XFx0ZmxvYXQgSGxsID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2VXYgKS54O1xcblxcdFxcdGZsb2F0IGRCeCA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICsgZFNUZHggKS54IC0gSGxsO1xcblxcdFxcdGZsb2F0IGRCeSA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICsgZFNUZHkgKS54IC0gSGxsO1xcblxcdFxcdHJldHVybiB2ZWMyKCBkQngsIGRCeSApO1xcblxcdH1cXG5cXHR2ZWMzIHBlcnR1cmJOb3JtYWxBcmIoIHZlYzMgc3VyZl9wb3MsIHZlYzMgc3VyZl9ub3JtLCB2ZWMyIGRIZHh5ICkge1xcblxcdFxcdHZlYzMgdlNpZ21hWCA9IHZlYzMoIGRGZHgoIHN1cmZfcG9zLnggKSwgZEZkeCggc3VyZl9wb3MueSApLCBkRmR4KCBzdXJmX3Bvcy56ICkgKTtcXG5cXHRcXHR2ZWMzIHZTaWdtYVkgPSB2ZWMzKCBkRmR5KCBzdXJmX3Bvcy54ICksIGRGZHkoIHN1cmZfcG9zLnkgKSwgZEZkeSggc3VyZl9wb3MueiApICk7XFxuXFx0XFx0dmVjMyB2TiA9IHN1cmZfbm9ybTtcXG5cXHRcXHR2ZWMzIFIxID0gY3Jvc3MoIHZTaWdtYVksIHZOICk7XFxuXFx0XFx0dmVjMyBSMiA9IGNyb3NzKCB2TiwgdlNpZ21hWCApO1xcblxcdFxcdGZsb2F0IGZEZXQgPSBkb3QoIHZTaWdtYVgsIFIxICk7XFxuXFx0XFx0dmVjMyB2R3JhZCA9IHNpZ24oIGZEZXQgKSAqICggZEhkeHkueCAqIFIxICsgZEhkeHkueSAqIFIyICk7XFxuXFx0XFx0cmV0dXJuIG5vcm1hbGl6ZSggYWJzKCBmRGV0ICkgKiBzdXJmX25vcm0gLSB2R3JhZCApO1xcblxcdH1cXG4jZW5kaWZcXG5cIjtcblxudmFyIGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudCA9IFwiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwXFxuXFx0dmVjNCBwbGFuZTtcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpICsrICkge1xcblxcdFxcdHBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTtcXG5cXHRcXHRpZiAoIGRvdCggdlZpZXdQb3NpdGlvbiwgcGxhbmUueHl6ICkgPiBwbGFuZS53ICkgZGlzY2FyZDtcXG5cXHR9XFxuXFx0I2lmIFVOSU9OX0NMSVBQSU5HX1BMQU5FUyA8IE5VTV9DTElQUElOR19QTEFORVNcXG5cXHRcXHRib29sIGNsaXBwZWQgPSB0cnVlO1xcblxcdFxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRcXHRmb3IgKCBpbnQgaSA9IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSA8IE5VTV9DTElQUElOR19QTEFORVM7IGkgKysgKSB7XFxuXFx0XFx0XFx0cGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdO1xcblxcdFxcdFxcdGNsaXBwZWQgPSAoIGRvdCggdlZpZXdQb3NpdGlvbiwgcGxhbmUueHl6ICkgPiBwbGFuZS53ICkgJiYgY2xpcHBlZDtcXG5cXHRcXHR9XFxuXFx0XFx0aWYgKCBjbGlwcGVkICkgZGlzY2FyZDtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50ID0gXCIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBcXG5cXHQjaWYgISBkZWZpbmVkKCBQSFlTSUNBTCApICYmICEgZGVmaW5lZCggUEhPTkcgKVxcblxcdFxcdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcblxcdCNlbmRpZlxcblxcdHVuaWZvcm0gdmVjNCBjbGlwcGluZ1BsYW5lc1sgTlVNX0NMSVBQSU5HX1BMQU5FUyBdO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4ID0gXCIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDAgJiYgISBkZWZpbmVkKCBQSFlTSUNBTCApICYmICEgZGVmaW5lZCggUEhPTkcgKVxcblxcdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgY2xpcHBpbmdfcGxhbmVzX3ZlcnRleCA9IFwiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwICYmICEgZGVmaW5lZCggUEhZU0lDQUwgKSAmJiAhIGRlZmluZWQoIFBIT05HIClcXG5cXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGNvbG9yX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0NPTE9SXFxuXFx0ZGlmZnVzZUNvbG9yLnJnYiAqPSB2Q29sb3I7XFxuI2VuZGlmXCI7XG5cbnZhciBjb2xvcl9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0NPTE9SXFxuXFx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGNvbG9yX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0NPTE9SXFxuXFx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcXG4jZW5kaWZcIjtcblxudmFyIGNvbG9yX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9DT0xPUlxcblxcdHZDb2xvci54eXogPSBjb2xvci54eXo7XFxuI2VuZGlmXCI7XG5cbnZhciBjb21tb24gPSBcIiNkZWZpbmUgUEkgMy4xNDE1OTI2NTM1OVxcbiNkZWZpbmUgUEkyIDYuMjgzMTg1MzA3MThcXG4jZGVmaW5lIFBJX0hBTEYgMS41NzA3OTYzMjY3OTQ5XFxuI2RlZmluZSBSRUNJUFJPQ0FMX1BJIDAuMzE4MzA5ODg2MThcXG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkyIDAuMTU5MTU0OTRcXG4jZGVmaW5lIExPRzIgMS40NDI2OTVcXG4jZGVmaW5lIEVQU0lMT04gMWUtNlxcbiNkZWZpbmUgc2F0dXJhdGUoYSkgY2xhbXAoIGEsIDAuMCwgMS4wIClcXG4jZGVmaW5lIHdoaXRlQ29tcGxpbWVudChhKSAoIDEuMCAtIHNhdHVyYXRlKCBhICkgKVxcbmZsb2F0IHBvdzIoIGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4Kng7IH1cXG5mbG9hdCBwb3czKCBjb25zdCBpbiBmbG9hdCB4ICkgeyByZXR1cm4geCp4Kng7IH1cXG5mbG9hdCBwb3c0KCBjb25zdCBpbiBmbG9hdCB4ICkgeyBmbG9hdCB4MiA9IHgqeDsgcmV0dXJuIHgyKngyOyB9XFxuZmxvYXQgYXZlcmFnZSggY29uc3QgaW4gdmVjMyBjb2xvciApIHsgcmV0dXJuIGRvdCggY29sb3IsIHZlYzMoIDAuMzMzMyApICk7IH1cXG5oaWdocCBmbG9hdCByYW5kKCBjb25zdCBpbiB2ZWMyIHV2ICkge1xcblxcdGNvbnN0IGhpZ2hwIGZsb2F0IGEgPSAxMi45ODk4LCBiID0gNzguMjMzLCBjID0gNDM3NTguNTQ1MztcXG5cXHRoaWdocCBmbG9hdCBkdCA9IGRvdCggdXYueHksIHZlYzIoIGEsYiApICksIHNuID0gbW9kKCBkdCwgUEkgKTtcXG5cXHRyZXR1cm4gZnJhY3Qoc2luKHNuKSAqIGMpO1xcbn1cXG5zdHJ1Y3QgSW5jaWRlbnRMaWdodCB7XFxuXFx0dmVjMyBjb2xvcjtcXG5cXHR2ZWMzIGRpcmVjdGlvbjtcXG5cXHRib29sIHZpc2libGU7XFxufTtcXG5zdHJ1Y3QgUmVmbGVjdGVkTGlnaHQge1xcblxcdHZlYzMgZGlyZWN0RGlmZnVzZTtcXG5cXHR2ZWMzIGRpcmVjdFNwZWN1bGFyO1xcblxcdHZlYzMgaW5kaXJlY3REaWZmdXNlO1xcblxcdHZlYzMgaW5kaXJlY3RTcGVjdWxhcjtcXG59O1xcbnN0cnVjdCBHZW9tZXRyaWNDb250ZXh0IHtcXG5cXHR2ZWMzIHBvc2l0aW9uO1xcblxcdHZlYzMgbm9ybWFsO1xcblxcdHZlYzMgdmlld0RpcjtcXG59O1xcbnZlYzMgdHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7XFxuXFx0cmV0dXJuIG5vcm1hbGl6ZSggKCBtYXRyaXggKiB2ZWM0KCBkaXIsIDAuMCApICkueHl6ICk7XFxufVxcbnZlYzMgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xcblxcdHJldHVybiBub3JtYWxpemUoICggdmVjNCggZGlyLCAwLjAgKSAqIG1hdHJpeCApLnh5eiApO1xcbn1cXG52ZWMzIHByb2plY3RPblBsYW5lKGluIHZlYzMgcG9pbnQsIGluIHZlYzMgcG9pbnRPblBsYW5lLCBpbiB2ZWMzIHBsYW5lTm9ybWFsICkge1xcblxcdGZsb2F0IGRpc3RhbmNlID0gZG90KCBwbGFuZU5vcm1hbCwgcG9pbnQgLSBwb2ludE9uUGxhbmUgKTtcXG5cXHRyZXR1cm4gLSBkaXN0YW5jZSAqIHBsYW5lTm9ybWFsICsgcG9pbnQ7XFxufVxcbmZsb2F0IHNpZGVPZlBsYW5lKCBpbiB2ZWMzIHBvaW50LCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcXG5cXHRyZXR1cm4gc2lnbiggZG90KCBwb2ludCAtIHBvaW50T25QbGFuZSwgcGxhbmVOb3JtYWwgKSApO1xcbn1cXG52ZWMzIGxpbmVQbGFuZUludGVyc2VjdCggaW4gdmVjMyBwb2ludE9uTGluZSwgaW4gdmVjMyBsaW5lRGlyZWN0aW9uLCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcXG5cXHRyZXR1cm4gbGluZURpcmVjdGlvbiAqICggZG90KCBwbGFuZU5vcm1hbCwgcG9pbnRPblBsYW5lIC0gcG9pbnRPbkxpbmUgKSAvIGRvdCggcGxhbmVOb3JtYWwsIGxpbmVEaXJlY3Rpb24gKSApICsgcG9pbnRPbkxpbmU7XFxufVxcbm1hdDMgdHJhbnNwb3NlTWF0MyggY29uc3QgaW4gbWF0MyBtICkge1xcblxcdG1hdDMgdG1wO1xcblxcdHRtcFsgMCBdID0gdmVjMyggbVsgMCBdLngsIG1bIDEgXS54LCBtWyAyIF0ueCApO1xcblxcdHRtcFsgMSBdID0gdmVjMyggbVsgMCBdLnksIG1bIDEgXS55LCBtWyAyIF0ueSApO1xcblxcdHRtcFsgMiBdID0gdmVjMyggbVsgMCBdLnosIG1bIDEgXS56LCBtWyAyIF0ueiApO1xcblxcdHJldHVybiB0bXA7XFxufVxcbmZsb2F0IGxpbmVhclRvUmVsYXRpdmVMdW1pbmFuY2UoIGNvbnN0IGluIHZlYzMgY29sb3IgKSB7XFxuXFx0dmVjMyB3ZWlnaHRzID0gdmVjMyggMC4yMTI2LCAwLjcxNTIsIDAuMDcyMiApO1xcblxcdHJldHVybiBkb3QoIHdlaWdodHMsIGNvbG9yLnJnYiApO1xcbn1cXG5cIjtcblxudmFyIGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudCA9IFwiI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVfVVZcXG4jZGVmaW5lIGN1YmVVVl90ZXh0dXJlU2l6ZSAoMTAyNC4wKVxcbmludCBnZXRGYWNlRnJvbURpcmVjdGlvbih2ZWMzIGRpcmVjdGlvbikge1xcblxcdHZlYzMgYWJzRGlyZWN0aW9uID0gYWJzKGRpcmVjdGlvbik7XFxuXFx0aW50IGZhY2UgPSAtMTtcXG5cXHRpZiggYWJzRGlyZWN0aW9uLnggPiBhYnNEaXJlY3Rpb24ueiApIHtcXG5cXHRcXHRpZihhYnNEaXJlY3Rpb24ueCA+IGFic0RpcmVjdGlvbi55IClcXG5cXHRcXHRcXHRmYWNlID0gZGlyZWN0aW9uLnggPiAwLjAgPyAwIDogMztcXG5cXHRcXHRlbHNlXFxuXFx0XFx0XFx0ZmFjZSA9IGRpcmVjdGlvbi55ID4gMC4wID8gMSA6IDQ7XFxuXFx0fVxcblxcdGVsc2Uge1xcblxcdFxcdGlmKGFic0RpcmVjdGlvbi56ID4gYWJzRGlyZWN0aW9uLnkgKVxcblxcdFxcdFxcdGZhY2UgPSBkaXJlY3Rpb24ueiA+IDAuMCA/IDIgOiA1O1xcblxcdFxcdGVsc2VcXG5cXHRcXHRcXHRmYWNlID0gZGlyZWN0aW9uLnkgPiAwLjAgPyAxIDogNDtcXG5cXHR9XFxuXFx0cmV0dXJuIGZhY2U7XFxufVxcbiNkZWZpbmUgY3ViZVVWX21heExvZHMxICAobG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAxLjApXFxuI2RlZmluZSBjdWJlVVZfcmFuZ2VDbGFtcCAoZXhwMigoNi4wIC0gMS4wKSAqIDIuMCkpXFxudmVjMiBNaXBMZXZlbEluZm8oIHZlYzMgdmVjLCBmbG9hdCByb3VnaG5lc3NMZXZlbCwgZmxvYXQgcm91Z2huZXNzICkge1xcblxcdGZsb2F0IHNjYWxlID0gZXhwMihjdWJlVVZfbWF4TG9kczEgLSByb3VnaG5lc3NMZXZlbCk7XFxuXFx0ZmxvYXQgZHhSb3VnaG5lc3MgPSBkRmR4KHJvdWdobmVzcyk7XFxuXFx0ZmxvYXQgZHlSb3VnaG5lc3MgPSBkRmR5KHJvdWdobmVzcyk7XFxuXFx0dmVjMyBkeCA9IGRGZHgoIHZlYyAqIHNjYWxlICogZHhSb3VnaG5lc3MgKTtcXG5cXHR2ZWMzIGR5ID0gZEZkeSggdmVjICogc2NhbGUgKiBkeVJvdWdobmVzcyApO1xcblxcdGZsb2F0IGQgPSBtYXgoIGRvdCggZHgsIGR4ICksIGRvdCggZHksIGR5ICkgKTtcXG5cXHRkID0gY2xhbXAoZCwgMS4wLCBjdWJlVVZfcmFuZ2VDbGFtcCk7XFxuXFx0ZmxvYXQgbWlwTGV2ZWwgPSAwLjUgKiBsb2cyKGQpO1xcblxcdHJldHVybiB2ZWMyKGZsb29yKG1pcExldmVsKSwgZnJhY3QobWlwTGV2ZWwpKTtcXG59XFxuI2RlZmluZSBjdWJlVVZfbWF4TG9kczIgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMi4wKVxcbiNkZWZpbmUgY3ViZVVWX3JjcFRleHR1cmVTaXplICgxLjAgLyBjdWJlVVZfdGV4dHVyZVNpemUpXFxudmVjMiBnZXRDdWJlVVYodmVjMyBkaXJlY3Rpb24sIGZsb2F0IHJvdWdobmVzc0xldmVsLCBmbG9hdCBtaXBMZXZlbCkge1xcblxcdG1pcExldmVsID0gcm91Z2huZXNzTGV2ZWwgPiBjdWJlVVZfbWF4TG9kczIgLSAzLjAgPyAwLjAgOiBtaXBMZXZlbDtcXG5cXHRmbG9hdCBhID0gMTYuMCAqIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZTtcXG5cXHR2ZWMyIGV4cDJfcGFja2VkID0gZXhwMiggdmVjMiggcm91Z2huZXNzTGV2ZWwsIG1pcExldmVsICkgKTtcXG5cXHR2ZWMyIHJjcF9leHAyX3BhY2tlZCA9IHZlYzIoIDEuMCApIC8gZXhwMl9wYWNrZWQ7XFxuXFx0ZmxvYXQgcG93U2NhbGUgPSBleHAyX3BhY2tlZC54ICogZXhwMl9wYWNrZWQueTtcXG5cXHRmbG9hdCBzY2FsZSA9IHJjcF9leHAyX3BhY2tlZC54ICogcmNwX2V4cDJfcGFja2VkLnkgKiAwLjI1O1xcblxcdGZsb2F0IG1pcE9mZnNldCA9IDAuNzUqKDEuMCAtIHJjcF9leHAyX3BhY2tlZC55KSAqIHJjcF9leHAyX3BhY2tlZC54O1xcblxcdGJvb2wgYlJlcyA9IG1pcExldmVsID09IDAuMDtcXG5cXHRzY2FsZSA9ICBiUmVzICYmIChzY2FsZSA8IGEpID8gYSA6IHNjYWxlO1xcblxcdHZlYzMgcjtcXG5cXHR2ZWMyIG9mZnNldDtcXG5cXHRpbnQgZmFjZSA9IGdldEZhY2VGcm9tRGlyZWN0aW9uKGRpcmVjdGlvbik7XFxuXFx0ZmxvYXQgcmNwUG93U2NhbGUgPSAxLjAgLyBwb3dTY2FsZTtcXG5cXHRpZiggZmFjZSA9PSAwKSB7XFxuXFx0XFx0ciA9IHZlYzMoZGlyZWN0aW9uLngsIC1kaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkpO1xcblxcdFxcdG9mZnNldCA9IHZlYzIoMC4wK21pcE9mZnNldCwwLjc1ICogcmNwUG93U2NhbGUpO1xcblxcdFxcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyBhIDogb2Zmc2V0Lnk7XFxuXFx0fVxcblxcdGVsc2UgaWYoIGZhY2UgPT0gMSkge1xcblxcdFxcdHIgPSB2ZWMzKGRpcmVjdGlvbi55LCBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnopO1xcblxcdFxcdG9mZnNldCA9IHZlYzIoc2NhbGUrbWlwT2Zmc2V0LCAwLjc1ICogcmNwUG93U2NhbGUpO1xcblxcdFxcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyBhIDogb2Zmc2V0Lnk7XFxuXFx0fVxcblxcdGVsc2UgaWYoIGZhY2UgPT0gMikge1xcblxcdFxcdHIgPSB2ZWMzKGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkpO1xcblxcdFxcdG9mZnNldCA9IHZlYzIoMi4wKnNjYWxlK21pcE9mZnNldCwgMC43NSAqIHJjcFBvd1NjYWxlKTtcXG5cXHRcXHRvZmZzZXQueSA9IGJSZXMgJiYgKG9mZnNldC55IDwgMi4wKmEpID8gYSA6IG9mZnNldC55O1xcblxcdH1cXG5cXHRlbHNlIGlmKCBmYWNlID09IDMpIHtcXG5cXHRcXHRyID0gdmVjMyhkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnosIGRpcmVjdGlvbi55KTtcXG5cXHRcXHRvZmZzZXQgPSB2ZWMyKDAuMCttaXBPZmZzZXQsMC41ICogcmNwUG93U2NhbGUpO1xcblxcdFxcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcXG5cXHR9XFxuXFx0ZWxzZSBpZiggZmFjZSA9PSA0KSB7XFxuXFx0XFx0ciA9IHZlYzMoZGlyZWN0aW9uLnksIGRpcmVjdGlvbi54LCAtZGlyZWN0aW9uLnopO1xcblxcdFxcdG9mZnNldCA9IHZlYzIoc2NhbGUrbWlwT2Zmc2V0LCAwLjUgKiByY3BQb3dTY2FsZSk7XFxuXFx0XFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8IDIuMCphKSA/IDAuMCA6IG9mZnNldC55O1xcblxcdH1cXG5cXHRlbHNlIHtcXG5cXHRcXHRyID0gdmVjMyhkaXJlY3Rpb24ueiwgLWRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSk7XFxuXFx0XFx0b2Zmc2V0ID0gdmVjMigyLjAqc2NhbGUrbWlwT2Zmc2V0LCAwLjUgKiByY3BQb3dTY2FsZSk7XFxuXFx0XFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8IDIuMCphKSA/IDAuMCA6IG9mZnNldC55O1xcblxcdH1cXG5cXHRyID0gbm9ybWFsaXplKHIpO1xcblxcdGZsb2F0IHRleGVsT2Zmc2V0ID0gMC41ICogY3ViZVVWX3JjcFRleHR1cmVTaXplO1xcblxcdHZlYzIgcyA9ICggci55eiAvIGFicyggci54ICkgKyB2ZWMyKCAxLjAgKSApICogMC41O1xcblxcdHZlYzIgYmFzZSA9IG9mZnNldCArIHZlYzIoIHRleGVsT2Zmc2V0ICk7XFxuXFx0cmV0dXJuIGJhc2UgKyBzICogKCBzY2FsZSAtIDIuMCAqIHRleGVsT2Zmc2V0ICk7XFxufVxcbiNkZWZpbmUgY3ViZVVWX21heExvZHMzIChsb2cyKGN1YmVVVl90ZXh0dXJlU2l6ZSowLjI1KSAtIDMuMClcXG52ZWM0IHRleHR1cmVDdWJlVVYodmVjMyByZWZsZWN0ZWREaXJlY3Rpb24sIGZsb2F0IHJvdWdobmVzcyApIHtcXG5cXHRmbG9hdCByb3VnaG5lc3NWYWwgPSByb3VnaG5lc3MqIGN1YmVVVl9tYXhMb2RzMztcXG5cXHRmbG9hdCByMSA9IGZsb29yKHJvdWdobmVzc1ZhbCk7XFxuXFx0ZmxvYXQgcjIgPSByMSArIDEuMDtcXG5cXHRmbG9hdCB0ID0gZnJhY3Qocm91Z2huZXNzVmFsKTtcXG5cXHR2ZWMyIG1pcEluZm8gPSBNaXBMZXZlbEluZm8ocmVmbGVjdGVkRGlyZWN0aW9uLCByMSwgcm91Z2huZXNzKTtcXG5cXHRmbG9hdCBzID0gbWlwSW5mby55O1xcblxcdGZsb2F0IGxldmVsMCA9IG1pcEluZm8ueDtcXG5cXHRmbG9hdCBsZXZlbDEgPSBsZXZlbDAgKyAxLjA7XFxuXFx0bGV2ZWwxID0gbGV2ZWwxID4gNS4wID8gNS4wIDogbGV2ZWwxO1xcblxcdGxldmVsMCArPSBtaW4oIGZsb29yKCBzICsgMC41ICksIDUuMCApO1xcblxcdHZlYzIgdXZfMTAgPSBnZXRDdWJlVVYocmVmbGVjdGVkRGlyZWN0aW9uLCByMSwgbGV2ZWwwKTtcXG5cXHR2ZWM0IGNvbG9yMTAgPSBlbnZNYXBUZXhlbFRvTGluZWFyKHRleHR1cmUyRChlbnZNYXAsIHV2XzEwKSk7XFxuXFx0dmVjMiB1dl8yMCA9IGdldEN1YmVVVihyZWZsZWN0ZWREaXJlY3Rpb24sIHIyLCBsZXZlbDApO1xcblxcdHZlYzQgY29sb3IyMCA9IGVudk1hcFRleGVsVG9MaW5lYXIodGV4dHVyZTJEKGVudk1hcCwgdXZfMjApKTtcXG5cXHR2ZWM0IHJlc3VsdCA9IG1peChjb2xvcjEwLCBjb2xvcjIwLCB0KTtcXG5cXHRyZXR1cm4gdmVjNChyZXN1bHQucmdiLCAxLjApO1xcbn1cXG4jZW5kaWZcXG5cIjtcblxudmFyIGRlZmF1bHRub3JtYWxfdmVydGV4ID0gXCJ2ZWMzIHRyYW5zZm9ybWVkTm9ybWFsID0gbm9ybWFsTWF0cml4ICogb2JqZWN0Tm9ybWFsO1xcbiNpZmRlZiBGTElQX1NJREVEXFxuXFx0dHJhbnNmb3JtZWROb3JtYWwgPSAtIHRyYW5zZm9ybWVkTm9ybWFsO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGRpc3BsYWNlbWVudE1hcDtcXG5cXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudFNjYWxlO1xcblxcdHVuaWZvcm0gZmxvYXQgZGlzcGxhY2VtZW50QmlhcztcXG4jZW5kaWZcXG5cIjtcblxudmFyIGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXFxuXFx0dHJhbnNmb3JtZWQgKz0gbm9ybWFsaXplKCBvYmplY3ROb3JtYWwgKSAqICggdGV4dHVyZTJEKCBkaXNwbGFjZW1lbnRNYXAsIHV2ICkueCAqIGRpc3BsYWNlbWVudFNjYWxlICsgZGlzcGxhY2VtZW50QmlhcyApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZW1pc3NpdmVtYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfRU1JU1NJVkVNQVBcXG5cXHR2ZWM0IGVtaXNzaXZlQ29sb3IgPSB0ZXh0dXJlMkQoIGVtaXNzaXZlTWFwLCB2VXYgKTtcXG5cXHRlbWlzc2l2ZUNvbG9yLnJnYiA9IGVtaXNzaXZlTWFwVGV4ZWxUb0xpbmVhciggZW1pc3NpdmVDb2xvciApLnJnYjtcXG5cXHR0b3RhbEVtaXNzaXZlUmFkaWFuY2UgKj0gZW1pc3NpdmVDb2xvci5yZ2I7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0VNSVNTSVZFTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgZW1pc3NpdmVNYXA7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBlbmNvZGluZ3NfZnJhZ21lbnQgPSBcIiAgZ2xfRnJhZ0NvbG9yID0gbGluZWFyVG9PdXRwdXRUZXhlbCggZ2xfRnJhZ0NvbG9yICk7XFxuXCI7XG5cbnZhciBlbmNvZGluZ3NfcGFyc19mcmFnbWVudCA9IFwiXFxudmVjNCBMaW5lYXJUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRyZXR1cm4gdmFsdWU7XFxufVxcbnZlYzQgR2FtbWFUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHBvdyggdmFsdWUueHl6LCB2ZWMzKCBnYW1tYUZhY3RvciApICksIHZhbHVlLncgKTtcXG59XFxudmVjNCBMaW5lYXJUb0dhbW1hKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBnYW1tYUZhY3RvciApIHtcXG5cXHRyZXR1cm4gdmVjNCggcG93KCB2YWx1ZS54eXosIHZlYzMoIDEuMCAvIGdhbW1hRmFjdG9yICkgKSwgdmFsdWUudyApO1xcbn1cXG52ZWM0IHNSR0JUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiAqIDAuOTQ3ODY3Mjk4NiArIHZlYzMoIDAuMDUyMTMyNzAxNCApLCB2ZWMzKCAyLjQgKSApLCB2YWx1ZS5yZ2IgKiAwLjA3NzM5OTM4MDgsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wNDA0NSApICkgKSApLCB2YWx1ZS53ICk7XFxufVxcbnZlYzQgTGluZWFyVG9zUkdCKCBpbiB2ZWM0IHZhbHVlICkge1xcblxcdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCAwLjQxNjY2ICkgKSAqIDEuMDU1IC0gdmVjMyggMC4wNTUgKSwgdmFsdWUucmdiICogMTIuOTIsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wMDMxMzA4ICkgKSApICksIHZhbHVlLncgKTtcXG59XFxudmVjNCBSR0JFVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqIGV4cDIoIHZhbHVlLmEgKiAyNTUuMCAtIDEyOC4wICksIDEuMCApO1xcbn1cXG52ZWM0IExpbmVhclRvUkdCRSggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRmbG9hdCBtYXhDb21wb25lbnQgPSBtYXgoIG1heCggdmFsdWUuciwgdmFsdWUuZyApLCB2YWx1ZS5iICk7XFxuXFx0ZmxvYXQgZkV4cCA9IGNsYW1wKCBjZWlsKCBsb2cyKCBtYXhDb21wb25lbnQgKSApLCAtMTI4LjAsIDEyNy4wICk7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAvIGV4cDIoIGZFeHAgKSwgKCBmRXhwICsgMTI4LjAgKSAvIDI1NS4wICk7XFxufVxcbnZlYzQgUkdCTVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUueHl6ICogdmFsdWUudyAqIG1heFJhbmdlLCAxLjAgKTtcXG59XFxudmVjNCBMaW5lYXJUb1JHQk0oIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xcblxcdGZsb2F0IG1heFJHQiA9IG1heCggdmFsdWUueCwgbWF4KCB2YWx1ZS5nLCB2YWx1ZS5iICkgKTtcXG5cXHRmbG9hdCBNICAgICAgPSBjbGFtcCggbWF4UkdCIC8gbWF4UmFuZ2UsIDAuMCwgMS4wICk7XFxuXFx0TSAgICAgICAgICAgID0gY2VpbCggTSAqIDI1NS4wICkgLyAyNTUuMDtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiIC8gKCBNICogbWF4UmFuZ2UgKSwgTSApO1xcbn1cXG52ZWM0IFJHQkRUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqICggKCBtYXhSYW5nZSAvIDI1NS4wICkgLyB2YWx1ZS5hICksIDEuMCApO1xcbn1cXG52ZWM0IExpbmVhclRvUkdCRCggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XFxuXFx0ZmxvYXQgbWF4UkdCID0gbWF4KCB2YWx1ZS54LCBtYXgoIHZhbHVlLmcsIHZhbHVlLmIgKSApO1xcblxcdGZsb2F0IEQgICAgICA9IG1heCggbWF4UmFuZ2UgLyBtYXhSR0IsIDEuMCApO1xcblxcdEQgICAgICAgICAgICA9IG1pbiggZmxvb3IoIEQgKSAvIDI1NS4wLCAxLjAgKTtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogKCBEICogKCAyNTUuMCAvIG1heFJhbmdlICkgKSwgRCApO1xcbn1cXG5jb25zdCBtYXQzIGNMb2dMdXZNID0gbWF0MyggMC4yMjA5LCAwLjMzOTAsIDAuNDE4NCwgMC4xMTM4LCAwLjY3ODAsIDAuNzMxOSwgMC4wMTAyLCAwLjExMzAsIDAuMjk2OSApO1xcbnZlYzQgTGluZWFyVG9Mb2dMdXYoIGluIHZlYzQgdmFsdWUgKSAge1xcblxcdHZlYzMgWHBfWV9YWVpwID0gdmFsdWUucmdiICogY0xvZ0x1dk07XFxuXFx0WHBfWV9YWVpwID0gbWF4KFhwX1lfWFlacCwgdmVjMygxZS02LCAxZS02LCAxZS02KSk7XFxuXFx0dmVjNCB2UmVzdWx0O1xcblxcdHZSZXN1bHQueHkgPSBYcF9ZX1hZWnAueHkgLyBYcF9ZX1hZWnAuejtcXG5cXHRmbG9hdCBMZSA9IDIuMCAqIGxvZzIoWHBfWV9YWVpwLnkpICsgMTI3LjA7XFxuXFx0dlJlc3VsdC53ID0gZnJhY3QoTGUpO1xcblxcdHZSZXN1bHQueiA9IChMZSAtIChmbG9vcih2UmVzdWx0LncqMjU1LjApKS8yNTUuMCkvMjU1LjA7XFxuXFx0cmV0dXJuIHZSZXN1bHQ7XFxufVxcbmNvbnN0IG1hdDMgY0xvZ0x1dkludmVyc2VNID0gbWF0MyggNi4wMDE0LCAtMi43MDA4LCAtMS43OTk2LCAtMS4zMzIwLCAzLjEwMjksIC01Ljc3MjEsIDAuMzAwOCwgLTEuMDg4MiwgNS42MjY4ICk7XFxudmVjNCBMb2dMdXZUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRmbG9hdCBMZSA9IHZhbHVlLnogKiAyNTUuMCArIHZhbHVlLnc7XFxuXFx0dmVjMyBYcF9ZX1hZWnA7XFxuXFx0WHBfWV9YWVpwLnkgPSBleHAyKChMZSAtIDEyNy4wKSAvIDIuMCk7XFxuXFx0WHBfWV9YWVpwLnogPSBYcF9ZX1hZWnAueSAvIHZhbHVlLnk7XFxuXFx0WHBfWV9YWVpwLnggPSB2YWx1ZS54ICogWHBfWV9YWVpwLno7XFxuXFx0dmVjMyB2UkdCID0gWHBfWV9YWVpwLnJnYiAqIGNMb2dMdXZJbnZlcnNlTTtcXG5cXHRyZXR1cm4gdmVjNCggbWF4KHZSR0IsIDAuMCksIDEuMCApO1xcbn1cXG5cIjtcblxudmFyIGVudm1hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9FTlZNQVBcXG5cXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKVxcblxcdFxcdHZlYzMgY2FtZXJhVG9WZXJ0ZXggPSBub3JtYWxpemUoIHZXb3JsZFBvc2l0aW9uIC0gY2FtZXJhUG9zaXRpb24gKTtcXG5cXHRcXHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7XFxuXFx0XFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTtcXG5cXHRcXHQjZWxzZVxcblxcdFxcdFxcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZnJhY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0I2Vsc2VcXG5cXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSB2UmVmbGVjdDtcXG5cXHQjZW5kaWZcXG5cXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxcblxcdFxcdHZlYzQgZW52Q29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICkgKTtcXG5cXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9FUVVJUkVDIClcXG5cXHRcXHR2ZWMyIHNhbXBsZVVWO1xcblxcdFxcdHJlZmxlY3RWZWMgPSBub3JtYWxpemUoIHJlZmxlY3RWZWMgKTtcXG5cXHRcXHRzYW1wbGVVVi55ID0gYXNpbiggY2xhbXAoIHJlZmxlY3RWZWMueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xcblxcdFxcdHNhbXBsZVVWLnggPSBhdGFuKCByZWZsZWN0VmVjLnosIHJlZmxlY3RWZWMueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XFxuXFx0XFx0dmVjNCBlbnZDb2xvciA9IHRleHR1cmUyRCggZW52TWFwLCBzYW1wbGVVViApO1xcblxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX1NQSEVSRSApXFxuXFx0XFx0cmVmbGVjdFZlYyA9IG5vcm1hbGl6ZSggcmVmbGVjdFZlYyApO1xcblxcdFxcdHZlYzMgcmVmbGVjdFZpZXcgPSBub3JtYWxpemUoICggdmlld01hdHJpeCAqIHZlYzQoIHJlZmxlY3RWZWMsIDAuMCApICkueHl6ICsgdmVjMyggMC4wLCAwLjAsIDEuMCApICk7XFxuXFx0XFx0dmVjNCBlbnZDb2xvciA9IHRleHR1cmUyRCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSApO1xcblxcdCNlbHNlXFxuXFx0XFx0dmVjNCBlbnZDb2xvciA9IHZlYzQoIDAuMCApO1xcblxcdCNlbmRpZlxcblxcdGVudkNvbG9yID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52Q29sb3IgKTtcXG5cXHQjaWZkZWYgRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZXFxuXFx0XFx0b3V0Z29pbmdMaWdodCA9IG1peCggb3V0Z29pbmdMaWdodCwgb3V0Z29pbmdMaWdodCAqIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApO1xcblxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19NSVggKVxcblxcdFxcdG91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApO1xcblxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19BREQgKVxcblxcdFxcdG91dGdvaW5nTGlnaHQgKz0gZW52Q29sb3IueHl6ICogc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIGVudm1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQoIFBIWVNJQ0FMIClcXG5cXHR1bmlmb3JtIGZsb2F0IHJlZmxlY3Rpdml0eTtcXG5cXHR1bmlmb3JtIGZsb2F0IGVudk1hcEludGVuc2l0eTtcXG4jZW5kaWZcXG4jaWZkZWYgVVNFX0VOVk1BUFxcblxcdCNpZiAhIGRlZmluZWQoIFBIWVNJQ0FMICkgJiYgKCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApIClcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XFxuXFx0I2VuZGlmXFxuXFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcXG5cXHRcXHR1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDtcXG5cXHQjZWxzZVxcblxcdFxcdHVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDtcXG5cXHQjZW5kaWZcXG5cXHR1bmlmb3JtIGZsb2F0IGZsaXBFbnZNYXA7XFxuXFx0dW5pZm9ybSBpbnQgbWF4TWlwTGV2ZWw7XFxuXFx0I2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HICkgfHwgZGVmaW5lZCggUEhZU0lDQUwgKVxcblxcdFxcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xcblxcdCNlbHNlXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgZW52bWFwX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0VOVk1BUFxcblxcdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcblxcdCNlbHNlXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xcblxcdFxcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgZW52bWFwX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9FTlZNQVBcXG5cXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKVxcblxcdFxcdHZXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbi54eXo7XFxuXFx0I2Vsc2VcXG5cXHRcXHR2ZWMzIGNhbWVyYVRvVmVydGV4ID0gbm9ybWFsaXplKCB3b3JsZFBvc2l0aW9uLnh5eiAtIGNhbWVyYVBvc2l0aW9uICk7XFxuXFx0XFx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHRyYW5zZm9ybWVkTm9ybWFsLCB2aWV3TWF0cml4ICk7XFxuXFx0XFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cXG5cXHRcXHRcXHR2UmVmbGVjdCA9IHJlZmxlY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCApO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0dlJlZmxlY3QgPSByZWZyYWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApO1xcblxcdFxcdCNlbmRpZlxcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgZm9nX3ZlcnRleCA9IFwiXFxuI2lmZGVmIFVTRV9GT0dcXG5mb2dEZXB0aCA9IC1tdlBvc2l0aW9uLno7XFxuI2VuZGlmXCI7XG5cbnZhciBmb2dfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfRk9HXFxuICB2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZm9nX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0ZPR1xcblxcdCNpZmRlZiBGT0dfRVhQMlxcblxcdFxcdGZsb2F0IGZvZ0ZhY3RvciA9IHdoaXRlQ29tcGxpbWVudCggZXhwMiggLSBmb2dEZW5zaXR5ICogZm9nRGVuc2l0eSAqIGZvZ0RlcHRoICogZm9nRGVwdGggKiBMT0cyICkgKTtcXG5cXHQjZWxzZVxcblxcdFxcdGZsb2F0IGZvZ0ZhY3RvciA9IHNtb290aHN0ZXAoIGZvZ05lYXIsIGZvZ0ZhciwgZm9nRGVwdGggKTtcXG5cXHQjZW5kaWZcXG5cXHRnbF9GcmFnQ29sb3IucmdiID0gbWl4KCBnbF9GcmFnQ29sb3IucmdiLCBmb2dDb2xvciwgZm9nRmFjdG9yICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBmb2dfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9GT0dcXG5cXHR1bmlmb3JtIHZlYzMgZm9nQ29sb3I7XFxuXFx0dmFyeWluZyBmbG9hdCBmb2dEZXB0aDtcXG5cXHQjaWZkZWYgRk9HX0VYUDJcXG5cXHRcXHR1bmlmb3JtIGZsb2F0IGZvZ0RlbnNpdHk7XFxuXFx0I2Vsc2VcXG5cXHRcXHR1bmlmb3JtIGZsb2F0IGZvZ05lYXI7XFxuXFx0XFx0dW5pZm9ybSBmbG9hdCBmb2dGYXI7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVE9PTlxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGdyYWRpZW50TWFwO1xcblxcdHZlYzMgZ2V0R3JhZGllbnRJcnJhZGlhbmNlKCB2ZWMzIG5vcm1hbCwgdmVjMyBsaWdodERpcmVjdGlvbiApIHtcXG5cXHRcXHRmbG9hdCBkb3ROTCA9IGRvdCggbm9ybWFsLCBsaWdodERpcmVjdGlvbiApO1xcblxcdFxcdHZlYzIgY29vcmQgPSB2ZWMyKCBkb3ROTCAqIDAuNSArIDAuNSwgMC4wICk7XFxuXFx0XFx0I2lmZGVmIFVTRV9HUkFESUVOVE1BUFxcblxcdFxcdFxcdHJldHVybiB0ZXh0dXJlMkQoIGdyYWRpZW50TWFwLCBjb29yZCApLnJnYjtcXG5cXHRcXHQjZWxzZVxcblxcdFxcdFxcdHJldHVybiAoIGNvb3JkLnggPCAwLjcgKSA/IHZlYzMoIDAuNyApIDogdmVjMyggMS4wICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgbGlnaHRtYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTElHSFRNQVBcXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gUEkgKiB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0xJR0hUTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbGlnaHRNYXA7XFxuXFx0dW5pZm9ybSBmbG9hdCBsaWdodE1hcEludGVuc2l0eTtcXG4jZW5kaWZcIjtcblxudmFyIGxpZ2h0c19sYW1iZXJ0X3ZlcnRleCA9IFwidmVjMyBkaWZmdXNlID0gdmVjMyggMS4wICk7XFxuR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeTtcXG5nZW9tZXRyeS5wb3NpdGlvbiA9IG12UG9zaXRpb24ueHl6O1xcbmdlb21ldHJ5Lm5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcXG5nZW9tZXRyeS52aWV3RGlyID0gbm9ybWFsaXplKCAtbXZQb3NpdGlvbi54eXogKTtcXG5HZW9tZXRyaWNDb250ZXh0IGJhY2tHZW9tZXRyeTtcXG5iYWNrR2VvbWV0cnkucG9zaXRpb24gPSBnZW9tZXRyeS5wb3NpdGlvbjtcXG5iYWNrR2VvbWV0cnkubm9ybWFsID0gLWdlb21ldHJ5Lm5vcm1hbDtcXG5iYWNrR2VvbWV0cnkudmlld0RpciA9IGdlb21ldHJ5LnZpZXdEaXI7XFxudkxpZ2h0RnJvbnQgPSB2ZWMzKCAwLjAgKTtcXG4jaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0dkxpZ2h0QmFjayA9IHZlYzMoIDAuMCApO1xcbiNlbmRpZlxcbkluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQ7XFxuZmxvYXQgZG90Tkw7XFxudmVjMyBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuI2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0Z2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIHBvaW50TGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdGRvdE5MID0gZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xcblxcdFxcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSA9IFBJICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0XFx0dkxpZ2h0RnJvbnQgKz0gc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdFxcdHZMaWdodEJhY2sgKz0gc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xcblxcdFxcdCNlbmRpZlxcblxcdH1cXG4jZW5kaWZcXG4jaWYgTlVNX1NQT1RfTElHSFRTID4gMFxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0Z2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggc3BvdExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcXG5cXHRcXHRkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcXG5cXHRcXHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgPSBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xcblxcdFxcdHZMaWdodEZyb250ICs9IHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xcblxcdFxcdCNpZmRlZiBET1VCTEVfU0lERURcXG5cXHRcXHRcXHR2TGlnaHRCYWNrICs9IHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG5cXHRcXHQjZW5kaWZcXG5cXHR9XFxuI2VuZGlmXFxuI2lmIE5VTV9ESVJfTElHSFRTID4gMFxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0ZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XFxuXFx0XFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlID0gUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHRcXHR2TGlnaHRGcm9udCArPSBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG5cXHRcXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0XFx0dkxpZ2h0QmFjayArPSBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBOVU1fSEVNSV9MSUdIVFMgPiAwXFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9IRU1JX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHR2TGlnaHRGcm9udCArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGdlb21ldHJ5ICk7XFxuXFx0XFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdFxcdHZMaWdodEJhY2sgKz0gZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBiYWNrR2VvbWV0cnkgKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHR9XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodHNfcGFyc19iZWdpbiA9IFwidW5pZm9ybSB2ZWMzIGFtYmllbnRMaWdodENvbG9yO1xcbnZlYzMgZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gdmVjMyBhbWJpZW50TGlnaHRDb2xvciApIHtcXG5cXHR2ZWMzIGlycmFkaWFuY2UgPSBhbWJpZW50TGlnaHRDb2xvcjtcXG5cXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcXG5cXHRcXHRpcnJhZGlhbmNlICo9IFBJO1xcblxcdCNlbmRpZlxcblxcdHJldHVybiBpcnJhZGlhbmNlO1xcbn1cXG4jaWYgTlVNX0RJUl9MSUdIVFMgPiAwXFxuXFx0c3RydWN0IERpcmVjdGlvbmFsTGlnaHQge1xcblxcdFxcdHZlYzMgZGlyZWN0aW9uO1xcblxcdFxcdHZlYzMgY29sb3I7XFxuXFx0XFx0aW50IHNoYWRvdztcXG5cXHRcXHRmbG9hdCBzaGFkb3dCaWFzO1xcblxcdFxcdGZsb2F0IHNoYWRvd1JhZGl1cztcXG5cXHRcXHR2ZWMyIHNoYWRvd01hcFNpemU7XFxuXFx0fTtcXG5cXHR1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodHNbIE5VTV9ESVJfTElHSFRTIF07XFxuXFx0dm9pZCBnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gRGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCApIHtcXG5cXHRcXHRkaXJlY3RMaWdodC5jb2xvciA9IGRpcmVjdGlvbmFsTGlnaHQuY29sb3I7XFxuXFx0XFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uID0gZGlyZWN0aW9uYWxMaWdodC5kaXJlY3Rpb247XFxuXFx0XFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9IHRydWU7XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxcblxcdHN0cnVjdCBQb2ludExpZ2h0IHtcXG5cXHRcXHR2ZWMzIHBvc2l0aW9uO1xcblxcdFxcdHZlYzMgY29sb3I7XFxuXFx0XFx0ZmxvYXQgZGlzdGFuY2U7XFxuXFx0XFx0ZmxvYXQgZGVjYXk7XFxuXFx0XFx0aW50IHNoYWRvdztcXG5cXHRcXHRmbG9hdCBzaGFkb3dCaWFzO1xcblxcdFxcdGZsb2F0IHNoYWRvd1JhZGl1cztcXG5cXHRcXHR2ZWMyIHNoYWRvd01hcFNpemU7XFxuXFx0XFx0ZmxvYXQgc2hhZG93Q2FtZXJhTmVhcjtcXG5cXHRcXHRmbG9hdCBzaGFkb3dDYW1lcmFGYXI7XFxuXFx0fTtcXG5cXHR1bmlmb3JtIFBvaW50TGlnaHQgcG9pbnRMaWdodHNbIE5VTV9QT0lOVF9MSUdIVFMgXTtcXG5cXHR2b2lkIGdldFBvaW50RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBQb2ludExpZ2h0IHBvaW50TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICkge1xcblxcdFxcdHZlYzMgbFZlY3RvciA9IHBvaW50TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeS5wb3NpdGlvbjtcXG5cXHRcXHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gPSBub3JtYWxpemUoIGxWZWN0b3IgKTtcXG5cXHRcXHRmbG9hdCBsaWdodERpc3RhbmNlID0gbGVuZ3RoKCBsVmVjdG9yICk7XFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgPSBwb2ludExpZ2h0LmNvbG9yO1xcblxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yICo9IHB1bmN0dWFsTGlnaHRJbnRlbnNpdHlUb0lycmFkaWFuY2VGYWN0b3IoIGxpZ2h0RGlzdGFuY2UsIHBvaW50TGlnaHQuZGlzdGFuY2UsIHBvaW50TGlnaHQuZGVjYXkgKTtcXG5cXHRcXHRkaXJlY3RMaWdodC52aXNpYmxlID0gKCBkaXJlY3RMaWdodC5jb2xvciAhPSB2ZWMzKCAwLjAgKSApO1xcblxcdH1cXG4jZW5kaWZcXG4jaWYgTlVNX1NQT1RfTElHSFRTID4gMFxcblxcdHN0cnVjdCBTcG90TGlnaHQge1xcblxcdFxcdHZlYzMgcG9zaXRpb247XFxuXFx0XFx0dmVjMyBkaXJlY3Rpb247XFxuXFx0XFx0dmVjMyBjb2xvcjtcXG5cXHRcXHRmbG9hdCBkaXN0YW5jZTtcXG5cXHRcXHRmbG9hdCBkZWNheTtcXG5cXHRcXHRmbG9hdCBjb25lQ29zO1xcblxcdFxcdGZsb2F0IHBlbnVtYnJhQ29zO1xcblxcdFxcdGludCBzaGFkb3c7XFxuXFx0XFx0ZmxvYXQgc2hhZG93QmlhcztcXG5cXHRcXHRmbG9hdCBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0dmVjMiBzaGFkb3dNYXBTaXplO1xcblxcdH07XFxuXFx0dW5pZm9ybSBTcG90TGlnaHQgc3BvdExpZ2h0c1sgTlVNX1NQT1RfTElHSFRTIF07XFxuXFx0dm9pZCBnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBTcG90TGlnaHQgc3BvdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCAgKSB7XFxuXFx0XFx0dmVjMyBsVmVjdG9yID0gc3BvdExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnkucG9zaXRpb247XFxuXFx0XFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKCBsVmVjdG9yICk7XFxuXFx0XFx0ZmxvYXQgbGlnaHREaXN0YW5jZSA9IGxlbmd0aCggbFZlY3RvciApO1xcblxcdFxcdGZsb2F0IGFuZ2xlQ29zID0gZG90KCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIHNwb3RMaWdodC5kaXJlY3Rpb24gKTtcXG5cXHRcXHRpZiAoIGFuZ2xlQ29zID4gc3BvdExpZ2h0LmNvbmVDb3MgKSB7XFxuXFx0XFx0XFx0ZmxvYXQgc3BvdEVmZmVjdCA9IHNtb290aHN0ZXAoIHNwb3RMaWdodC5jb25lQ29zLCBzcG90TGlnaHQucGVudW1icmFDb3MsIGFuZ2xlQ29zICk7XFxuXFx0XFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgPSBzcG90TGlnaHQuY29sb3I7XFxuXFx0XFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gc3BvdEVmZmVjdCAqIHB1bmN0dWFsTGlnaHRJbnRlbnNpdHlUb0lycmFkaWFuY2VGYWN0b3IoIGxpZ2h0RGlzdGFuY2UsIHNwb3RMaWdodC5kaXN0YW5jZSwgc3BvdExpZ2h0LmRlY2F5ICk7XFxuXFx0XFx0XFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9IHRydWU7XFxuXFx0XFx0fSBlbHNlIHtcXG5cXHRcXHRcXHRkaXJlY3RMaWdodC5jb2xvciA9IHZlYzMoIDAuMCApO1xcblxcdFxcdFxcdGRpcmVjdExpZ2h0LnZpc2libGUgPSBmYWxzZTtcXG5cXHRcXHR9XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDBcXG5cXHRzdHJ1Y3QgUmVjdEFyZWFMaWdodCB7XFxuXFx0XFx0dmVjMyBjb2xvcjtcXG5cXHRcXHR2ZWMzIHBvc2l0aW9uO1xcblxcdFxcdHZlYzMgaGFsZldpZHRoO1xcblxcdFxcdHZlYzMgaGFsZkhlaWdodDtcXG5cXHR9O1xcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y18xO1xcdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y18yO1xcblxcdHVuaWZvcm0gUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0c1sgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXTtcXG4jZW5kaWZcXG4jaWYgTlVNX0hFTUlfTElHSFRTID4gMFxcblxcdHN0cnVjdCBIZW1pc3BoZXJlTGlnaHQge1xcblxcdFxcdHZlYzMgZGlyZWN0aW9uO1xcblxcdFxcdHZlYzMgc2t5Q29sb3I7XFxuXFx0XFx0dmVjMyBncm91bmRDb2xvcjtcXG5cXHR9O1xcblxcdHVuaWZvcm0gSGVtaXNwaGVyZUxpZ2h0IGhlbWlzcGhlcmVMaWdodHNbIE5VTV9IRU1JX0xJR0hUUyBdO1xcblxcdHZlYzMgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gSGVtaXNwaGVyZUxpZ2h0IGhlbWlMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSApIHtcXG5cXHRcXHRmbG9hdCBkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoZW1pTGlnaHQuZGlyZWN0aW9uICk7XFxuXFx0XFx0ZmxvYXQgaGVtaURpZmZ1c2VXZWlnaHQgPSAwLjUgKiBkb3ROTCArIDAuNTtcXG5cXHRcXHR2ZWMzIGlycmFkaWFuY2UgPSBtaXgoIGhlbWlMaWdodC5ncm91bmRDb2xvciwgaGVtaUxpZ2h0LnNreUNvbG9yLCBoZW1pRGlmZnVzZVdlaWdodCApO1xcblxcdFxcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xcblxcdFxcdFxcdGlycmFkaWFuY2UgKj0gUEk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0cmV0dXJuIGlycmFkaWFuY2U7XFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgbGlnaHRzX3BhcnNfbWFwcyA9IFwiI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBQSFlTSUNBTCApXFxuXFx0dmVjMyBnZXRMaWdodFByb2JlSW5kaXJlY3RJcnJhZGlhbmNlKCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XFxuXFx0XFx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGdlb21ldHJ5Lm5vcm1hbCwgdmlld01hdHJpeCApO1xcblxcdFxcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXFxuXFx0XFx0XFx0dmVjMyBxdWVyeVZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiB3b3JsZE5vcm1hbC54LCB3b3JsZE5vcm1hbC55eiApO1xcblxcdFxcdFxcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVMb2RFWFQoIGVudk1hcCwgcXVlcnlWZWMsIGZsb2F0KCBtYXhNSVBMZXZlbCApICk7XFxuXFx0XFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgcXVlcnlWZWMsIGZsb2F0KCBtYXhNSVBMZXZlbCApICk7XFxuXFx0XFx0XFx0I2VuZGlmXFxuXFx0XFx0XFx0ZW52TWFwQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XFxuXFx0XFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXFxuXFx0XFx0XFx0dmVjMyBxdWVyeVZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiB3b3JsZE5vcm1hbC54LCB3b3JsZE5vcm1hbC55eiApO1xcblxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZVVWKCBxdWVyeVZlYywgMS4wICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdmVjNCggMC4wICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0cmV0dXJuIFBJICogZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xcblxcdH1cXG5cXHRmbG9hdCBnZXRTcGVjdWxhck1JUExldmVsKCBjb25zdCBpbiBmbG9hdCBibGlublNoaW5pbmVzc0V4cG9uZW50LCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XFxuXFx0XFx0ZmxvYXQgbWF4TUlQTGV2ZWxTY2FsYXIgPSBmbG9hdCggbWF4TUlQTGV2ZWwgKTtcXG5cXHRcXHRmbG9hdCBkZXNpcmVkTUlQTGV2ZWwgPSBtYXhNSVBMZXZlbFNjYWxhciArIDAuNzkyNDggLSAwLjUgKiBsb2cyKCBwb3cyKCBibGlublNoaW5pbmVzc0V4cG9uZW50ICkgKyAxLjAgKTtcXG5cXHRcXHRyZXR1cm4gY2xhbXAoIGRlc2lyZWRNSVBMZXZlbCwgMC4wLCBtYXhNSVBMZXZlbFNjYWxhciApO1xcblxcdH1cXG5cXHR2ZWMzIGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBmbG9hdCBibGlublNoaW5pbmVzc0V4cG9uZW50LCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XFxuXFx0XFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZsZWN0KCAtZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZyYWN0KCAtZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRyZWZsZWN0VmVjID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggcmVmbGVjdFZlYywgdmlld01hdHJpeCApO1xcblxcdFxcdGZsb2F0IHNwZWN1bGFyTUlQTGV2ZWwgPSBnZXRTcGVjdWxhck1JUExldmVsKCBibGlublNoaW5pbmVzc0V4cG9uZW50LCBtYXhNSVBMZXZlbCApO1xcblxcdFxcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXFxuXFx0XFx0XFx0dmVjMyBxdWVyeVJlZmxlY3RWZWMgPSB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICk7XFxuXFx0XFx0XFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZUxvZEVYVCggZW52TWFwLCBxdWVyeVJlZmxlY3RWZWMsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZWxzZVxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCBxdWVyeVJlZmxlY3RWZWMsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZW5kaWZcXG5cXHRcXHRcXHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcXG5cXHRcXHRcXHR2ZWMzIHF1ZXJ5UmVmbGVjdFZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKTtcXG5cXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVVVihxdWVyeVJlZmxlY3RWZWMsIEJsaW5uRXhwb25lbnRUb0dHWFJvdWdobmVzcyhibGlublNoaW5pbmVzc0V4cG9uZW50KSk7XFxuXFx0XFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfRVFVSVJFQyApXFxuXFx0XFx0XFx0dmVjMiBzYW1wbGVVVjtcXG5cXHRcXHRcXHRzYW1wbGVVVi55ID0gYXNpbiggY2xhbXAoIHJlZmxlY3RWZWMueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xcblxcdFxcdFxcdHNhbXBsZVVWLnggPSBhdGFuKCByZWZsZWN0VmVjLnosIHJlZmxlY3RWZWMueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XFxuXFx0XFx0XFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlMkRMb2RFWFQoIGVudk1hcCwgc2FtcGxlVVYsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZWxzZVxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlMkQoIGVudk1hcCwgc2FtcGxlVVYsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZW5kaWZcXG5cXHRcXHRcXHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9TUEhFUkUgKVxcblxcdFxcdFxcdHZlYzMgcmVmbGVjdFZpZXcgPSBub3JtYWxpemUoICggdmlld01hdHJpeCAqIHZlYzQoIHJlZmxlY3RWZWMsIDAuMCApICkueHl6ICsgdmVjMyggMC4wLDAuMCwxLjAgKSApO1xcblxcdFxcdFxcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZTJETG9kRVhUKCBlbnZNYXAsIHJlZmxlY3RWaWV3Lnh5ICogMC41ICsgMC41LCBzcGVjdWxhck1JUExldmVsICk7XFxuXFx0XFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZTJEKCBlbnZNYXAsIHJlZmxlY3RWaWV3Lnh5ICogMC41ICsgMC41LCBzcGVjdWxhck1JUExldmVsICk7XFxuXFx0XFx0XFx0I2VuZGlmXFxuXFx0XFx0XFx0ZW52TWFwQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0cmV0dXJuIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTtcXG5cXHR9XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodHNfcGhvbmdfZnJhZ21lbnQgPSBcIkJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbDtcXG5tYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiO1xcbm1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBzcGVjdWxhcjtcXG5tYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyA9IHNoaW5pbmVzcztcXG5tYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoID0gc3BlY3VsYXJTdHJlbmd0aDtcXG5cIjtcblxudmFyIGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50ID0gXCJ2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuc3RydWN0IEJsaW5uUGhvbmdNYXRlcmlhbCB7XFxuXFx0dmVjM1xcdGRpZmZ1c2VDb2xvcjtcXG5cXHR2ZWMzXFx0c3BlY3VsYXJDb2xvcjtcXG5cXHRmbG9hdFxcdHNwZWN1bGFyU2hpbmluZXNzO1xcblxcdGZsb2F0XFx0c3BlY3VsYXJTdHJlbmd0aDtcXG59O1xcbnZvaWQgUkVfRGlyZWN0X0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0I2lmZGVmIFRPT05cXG5cXHRcXHR2ZWMzIGlycmFkaWFuY2UgPSBnZXRHcmFkaWVudElycmFkaWFuY2UoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHQjZWxzZVxcblxcdFxcdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xcblxcdFxcdHZlYzMgaXJyYWRpYW5jZSA9IGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0I2VuZGlmXFxuXFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXFxuXFx0XFx0aXJyYWRpYW5jZSAqPSBQSTtcXG5cXHQjZW5kaWZcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XFxuXFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyApICogbWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aDtcXG59XFxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfQmxpbm5QaG9uZyggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xcbn1cXG4jZGVmaW5lIFJFX0RpcmVjdFxcdFxcdFxcdFxcdFJFX0RpcmVjdF9CbGlublBob25nXFxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcXHRcXHRSRV9JbmRpcmVjdERpZmZ1c2VfQmxpbm5QaG9uZ1xcbiNkZWZpbmUgTWF0ZXJpYWxfTGlnaHRQcm9iZUxPRCggbWF0ZXJpYWwgKVxcdCgwKVxcblwiO1xuXG52YXIgbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50ID0gXCJQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsO1xcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2IgKiAoIDEuMCAtIG1ldGFsbmVzc0ZhY3RvciApO1xcbm1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzID0gY2xhbXAoIHJvdWdobmVzc0ZhY3RvciwgMC4wNCwgMS4wICk7XFxuI2lmZGVmIFNUQU5EQVJEXFxuXFx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IG1peCggdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTtcXG4jZWxzZVxcblxcdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIHZlYzMoIE1BWElNVU1fU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKiBwb3cyKCByZWZsZWN0aXZpdHkgKSApLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTtcXG5cXHRtYXRlcmlhbC5jbGVhckNvYXQgPSBzYXR1cmF0ZSggY2xlYXJDb2F0ICk7XFx0bWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzID0gY2xhbXAoIGNsZWFyQ29hdFJvdWdobmVzcywgMC4wNCwgMS4wICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudCA9IFwic3RydWN0IFBoeXNpY2FsTWF0ZXJpYWwge1xcblxcdHZlYzNcXHRkaWZmdXNlQ29sb3I7XFxuXFx0ZmxvYXRcXHRzcGVjdWxhclJvdWdobmVzcztcXG5cXHR2ZWMzXFx0c3BlY3VsYXJDb2xvcjtcXG5cXHQjaWZuZGVmIFNUQU5EQVJEXFxuXFx0XFx0ZmxvYXQgY2xlYXJDb2F0O1xcblxcdFxcdGZsb2F0IGNsZWFyQ29hdFJvdWdobmVzcztcXG5cXHQjZW5kaWZcXG59O1xcbiNkZWZpbmUgTUFYSU1VTV9TUEVDVUxBUl9DT0VGRklDSUVOVCAwLjE2XFxuI2RlZmluZSBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UIDAuMDRcXG5mbG9hdCBjbGVhckNvYXRESFJBcHByb3goIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkwgKSB7XFxuXFx0cmV0dXJuIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKyAoIDEuMCAtIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSAqICggcG93KCAxLjAgLSBkb3ROTCwgNS4wICkgKiBwb3coIDEuMCAtIHJvdWdobmVzcywgMi4wICkgKTtcXG59XFxuI2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMFxcblxcdHZvaWQgUkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsKCBjb25zdCBpbiBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xcblxcdFxcdHZlYzMgbm9ybWFsID0gZ2VvbWV0cnkubm9ybWFsO1xcblxcdFxcdHZlYzMgdmlld0RpciA9IGdlb21ldHJ5LnZpZXdEaXI7XFxuXFx0XFx0dmVjMyBwb3NpdGlvbiA9IGdlb21ldHJ5LnBvc2l0aW9uO1xcblxcdFxcdHZlYzMgbGlnaHRQb3MgPSByZWN0QXJlYUxpZ2h0LnBvc2l0aW9uO1xcblxcdFxcdHZlYzMgaGFsZldpZHRoID0gcmVjdEFyZWFMaWdodC5oYWxmV2lkdGg7XFxuXFx0XFx0dmVjMyBoYWxmSGVpZ2h0ID0gcmVjdEFyZWFMaWdodC5oYWxmSGVpZ2h0O1xcblxcdFxcdHZlYzMgbGlnaHRDb2xvciA9IHJlY3RBcmVhTGlnaHQuY29sb3I7XFxuXFx0XFx0ZmxvYXQgcm91Z2huZXNzID0gbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3M7XFxuXFx0XFx0dmVjMyByZWN0Q29vcmRzWyA0IF07XFxuXFx0XFx0cmVjdENvb3Jkc1sgMCBdID0gbGlnaHRQb3MgLSBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1xcdFxcdHJlY3RDb29yZHNbIDEgXSA9IGxpZ2h0UG9zICsgaGFsZldpZHRoIC0gaGFsZkhlaWdodDtcXG5cXHRcXHRyZWN0Q29vcmRzWyAyIF0gPSBsaWdodFBvcyArIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7XFxuXFx0XFx0cmVjdENvb3Jkc1sgMyBdID0gbGlnaHRQb3MgLSBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xcblxcdFxcdHZlYzIgdXYgPSBMVENfVXYoIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7XFxuXFx0XFx0dmVjNCB0MSA9IHRleHR1cmUyRCggbHRjXzEsIHV2ICk7XFxuXFx0XFx0dmVjNCB0MiA9IHRleHR1cmUyRCggbHRjXzIsIHV2ICk7XFxuXFx0XFx0bWF0MyBtSW52ID0gbWF0MyhcXG5cXHRcXHRcXHR2ZWMzKCB0MS54LCAwLCB0MS55ICksXFxuXFx0XFx0XFx0dmVjMyggICAgMCwgMSwgICAgMCApLFxcblxcdFxcdFxcdHZlYzMoIHQxLnosIDAsIHQxLncgKVxcblxcdFxcdCk7XFxuXFx0XFx0dmVjMyBmcmVzbmVsID0gKCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICogdDIueCArICggdmVjMyggMS4wICkgLSBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICkgKiB0Mi55ICk7XFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gbGlnaHRDb2xvciAqIGZyZXNuZWwgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1JbnYsIHJlY3RDb29yZHMgKTtcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGxpZ2h0Q29sb3IgKiBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1hdDMoIDEuMCApLCByZWN0Q29vcmRzICk7XFxuXFx0fVxcbiNlbmRpZlxcbnZvaWQgUkVfRGlyZWN0X1BoeXNpY2FsKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcXG5cXHRmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcXG5cXHR2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xcblxcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xcblxcdFxcdGlycmFkaWFuY2UgKj0gUEk7XFxuXFx0I2VuZGlmXFxuXFx0I2lmbmRlZiBTVEFOREFSRFxcblxcdFxcdGZsb2F0IGNsZWFyQ29hdERIUiA9IG1hdGVyaWFsLmNsZWFyQ29hdCAqIGNsZWFyQ29hdERIUkFwcHJveCggbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzLCBkb3ROTCApO1xcblxcdCNlbHNlXFxuXFx0XFx0ZmxvYXQgY2xlYXJDb2F0REhSID0gMC4wO1xcblxcdCNlbmRpZlxcblxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9ICggMS4wIC0gY2xlYXJDb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9HR1goIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgKTtcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9ICggMS4wIC0gY2xlYXJDb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xcblxcdCNpZm5kZWYgU1RBTkRBUkRcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBpcnJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJDb2F0ICogQlJERl9TcGVjdWxhcl9HR1goIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MgKTtcXG5cXHQjZW5kaWZcXG59XFxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XFxufVxcbnZvaWQgUkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbCggY29uc3QgaW4gdmVjMyByYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBjbGVhckNvYXRSYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0I2lmbmRlZiBTVEFOREFSRFxcblxcdFxcdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcXG5cXHRcXHRmbG9hdCBkb3ROTCA9IGRvdE5WO1xcblxcdFxcdGZsb2F0IGNsZWFyQ29hdERIUiA9IG1hdGVyaWFsLmNsZWFyQ29hdCAqIGNsZWFyQ29hdERIUkFwcHJveCggbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzLCBkb3ROTCApO1xcblxcdCNlbHNlXFxuXFx0XFx0ZmxvYXQgY2xlYXJDb2F0REhSID0gMC4wO1xcblxcdCNlbmRpZlxcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gKCAxLjAgLSBjbGVhckNvYXRESFIgKSAqIHJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xcblxcdCNpZm5kZWYgU1RBTkRBUkRcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9IGNsZWFyQ29hdFJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJDb2F0ICogQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGdlb21ldHJ5LCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIG1hdGVyaWFsLmNsZWFyQ29hdFJvdWdobmVzcyApO1xcblxcdCNlbmRpZlxcbn1cXG4jZGVmaW5lIFJFX0RpcmVjdFxcdFxcdFxcdFxcdFJFX0RpcmVjdF9QaHlzaWNhbFxcbiNkZWZpbmUgUkVfRGlyZWN0X1JlY3RBcmVhXFx0XFx0UkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsXFxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcXHRcXHRSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWxcXG4jZGVmaW5lIFJFX0luZGlyZWN0U3BlY3VsYXJcXHRcXHRSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsXFxuI2RlZmluZSBNYXRlcmlhbF9CbGlublNoaW5pbmVzc0V4cG9uZW50KCBtYXRlcmlhbCApICAgR0dYUm91Z2huZXNzVG9CbGlubkV4cG9uZW50KCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApXFxuI2RlZmluZSBNYXRlcmlhbF9DbGVhckNvYXRfQmxpbm5TaGluaW5lc3NFeHBvbmVudCggbWF0ZXJpYWwgKSAgIEdHWFJvdWdobmVzc1RvQmxpbm5FeHBvbmVudCggbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzIClcXG5mbG9hdCBjb21wdXRlU3BlY3VsYXJPY2NsdXNpb24oIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCBhbWJpZW50T2NjbHVzaW9uLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XFxuXFx0cmV0dXJuIHNhdHVyYXRlKCBwb3coIGRvdE5WICsgYW1iaWVudE9jY2x1c2lvbiwgZXhwMiggLSAxNi4wICogcm91Z2huZXNzIC0gMS4wICkgKSAtIDEuMCArIGFtYmllbnRPY2NsdXNpb24gKTtcXG59XFxuXCI7XG5cbnZhciBsaWdodHNfZnJhZ21lbnRfYmVnaW4gPSBcIlxcbkdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnk7XFxuZ2VvbWV0cnkucG9zaXRpb24gPSAtIHZWaWV3UG9zaXRpb247XFxuZ2VvbWV0cnkubm9ybWFsID0gbm9ybWFsO1xcbmdlb21ldHJ5LnZpZXdEaXIgPSBub3JtYWxpemUoIHZWaWV3UG9zaXRpb24gKTtcXG5JbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0O1xcbiNpZiAoIE5VTV9QT0lOVF9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcXG5cXHRQb2ludExpZ2h0IHBvaW50TGlnaHQ7XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0cG9pbnRMaWdodCA9IHBvaW50TGlnaHRzWyBpIF07XFxuXFx0XFx0Z2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIHBvaW50TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdCNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gYWxsKCBidmVjMiggcG9pbnRMaWdodC5zaGFkb3csIGRpcmVjdExpZ2h0LnZpc2libGUgKSApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodC5zaGFkb3dCaWFzLCBwb2ludExpZ2h0LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG5cXHR9XFxuI2VuZGlmXFxuI2lmICggTlVNX1NQT1RfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApXFxuXFx0U3BvdExpZ2h0IHNwb3RMaWdodDtcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHNwb3RMaWdodCA9IHNwb3RMaWdodHNbIGkgXTtcXG5cXHRcXHRnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBzcG90TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdCNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gYWxsKCBidmVjMiggc3BvdExpZ2h0LnNoYWRvdywgZGlyZWN0TGlnaHQudmlzaWJsZSApICkgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodC5zaGFkb3dCaWFzLCBzcG90TGlnaHQuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiAoIE5VTV9ESVJfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApXFxuXFx0RGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0O1xcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRkaXJlY3Rpb25hbExpZ2h0ID0gZGlyZWN0aW9uYWxMaWdodHNbIGkgXTtcXG5cXHRcXHRnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0I2lmZGVmIFVTRV9TSEFET1dNQVBcXG5cXHRcXHRkaXJlY3RMaWdodC5jb2xvciAqPSBhbGwoIGJ2ZWMyKCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvdywgZGlyZWN0TGlnaHQudmlzaWJsZSApICkgPyBnZXRTaGFkb3coIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBpIF0sIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93TWFwU2l6ZSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG5cXHR9XFxuI2VuZGlmXFxuI2lmICggTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0X1JlY3RBcmVhIClcXG5cXHRSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQ7XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9SRUNUX0FSRUFfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHJlY3RBcmVhTGlnaHQgPSByZWN0QXJlYUxpZ2h0c1sgaSBdO1xcblxcdFxcdFJFX0RpcmVjdF9SZWN0QXJlYSggcmVjdEFyZWFMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xcblxcdH1cXG4jZW5kaWZcXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlIClcXG5cXHR2ZWMzIGlycmFkaWFuY2UgPSBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xcblxcdCNpZiAoIE5VTV9IRU1JX0xJR0hUUyA+IDAgKVxcblxcdFxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRcXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fSEVNSV9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0XFx0aXJyYWRpYW5jZSArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGdlb21ldHJ5ICk7XFxuXFx0XFx0fVxcblxcdCNlbmRpZlxcbiNlbmRpZlxcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcXG5cXHR2ZWMzIHJhZGlhbmNlID0gdmVjMyggMC4wICk7XFxuXFx0dmVjMyBjbGVhckNvYXRSYWRpYW5jZSA9IHZlYzMoIDAuMCApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbGlnaHRzX2ZyYWdtZW50X21hcHMgPSBcIiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxcblxcdCNpZmRlZiBVU0VfTElHSFRNQVBcXG5cXHRcXHR2ZWMzIGxpZ2h0TWFwSXJyYWRpYW5jZSA9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKS54eXogKiBsaWdodE1hcEludGVuc2l0eTtcXG5cXHRcXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcXG5cXHRcXHRcXHRsaWdodE1hcElycmFkaWFuY2UgKj0gUEk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0aXJyYWRpYW5jZSArPSBsaWdodE1hcElycmFkaWFuY2U7XFxuXFx0I2VuZGlmXFxuXFx0I2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBQSFlTSUNBTCApICYmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxcblxcdFxcdGlycmFkaWFuY2UgKz0gZ2V0TGlnaHRQcm9iZUluZGlyZWN0SXJyYWRpYW5jZSggZ2VvbWV0cnksIG1heE1pcExldmVsICk7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcXG5cXHRyYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggZ2VvbWV0cnksIE1hdGVyaWFsX0JsaW5uU2hpbmluZXNzRXhwb25lbnQoIG1hdGVyaWFsICksIG1heE1pcExldmVsICk7XFxuXFx0I2lmbmRlZiBTVEFOREFSRFxcblxcdFxcdGNsZWFyQ29hdFJhZGlhbmNlICs9IGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBnZW9tZXRyeSwgTWF0ZXJpYWxfQ2xlYXJDb2F0X0JsaW5uU2hpbmluZXNzRXhwb25lbnQoIG1hdGVyaWFsICksIG1heE1pcExldmVsICk7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodHNfZnJhZ21lbnRfZW5kID0gXCIjaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlIClcXG5cXHRSRV9JbmRpcmVjdERpZmZ1c2UoIGlycmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG4jZW5kaWZcXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXFxuXFx0UkVfSW5kaXJlY3RTcGVjdWxhciggcmFkaWFuY2UsIGNsZWFyQ29hdFJhZGlhbmNlLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl9mcmFnbWVudCA9IFwiI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApICYmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRl9FWFQgKVxcblxcdGdsX0ZyYWdEZXB0aEVYVCA9IGxvZzIoIHZGcmFnRGVwdGggKSAqIGxvZ0RlcHRoQnVmRkMgKiAwLjU7XFxuI2VuZGlmXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXFxuXFx0dW5pZm9ybSBmbG9hdCBsb2dEZXB0aEJ1ZkZDO1xcblxcdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUXFxuXFx0XFx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcXG5cXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxcblxcdFxcdHZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDtcXG5cXHQjZW5kaWZcXG5cXHR1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XFxuI2VuZGlmXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcXG5cXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxcblxcdFxcdHZGcmFnRGVwdGggPSAxLjAgKyBnbF9Qb3NpdGlvbi53O1xcblxcdCNlbHNlXFxuXFx0XFx0Z2xfUG9zaXRpb24ueiA9IGxvZzIoIG1heCggRVBTSUxPTiwgZ2xfUG9zaXRpb24udyArIDEuMCApICkgKiBsb2dEZXB0aEJ1ZkZDIC0gMS4wO1xcblxcdFxcdGdsX1Bvc2l0aW9uLnogKj0gZ2xfUG9zaXRpb24udztcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIG1hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9NQVBcXG5cXHR2ZWM0IHRleGVsQ29sb3IgPSB0ZXh0dXJlMkQoIG1hcCwgdlV2ICk7XFxuXFx0dGV4ZWxDb2xvciA9IG1hcFRleGVsVG9MaW5lYXIoIHRleGVsQ29sb3IgKTtcXG5cXHRkaWZmdXNlQ29sb3IgKj0gdGV4ZWxDb2xvcjtcXG4jZW5kaWZcXG5cIjtcblxudmFyIG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX01BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIG1hcDtcXG4jZW5kaWZcXG5cIjtcblxudmFyIG1hcF9wYXJ0aWNsZV9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9NQVBcXG5cXHR2ZWMyIHV2ID0gKCB1dlRyYW5zZm9ybSAqIHZlYzMoIGdsX1BvaW50Q29vcmQueCwgMS4wIC0gZ2xfUG9pbnRDb29yZC55LCAxICkgKS54eTtcXG5cXHR2ZWM0IG1hcFRleGVsID0gdGV4dHVyZTJEKCBtYXAsIHV2ICk7XFxuXFx0ZGlmZnVzZUNvbG9yICo9IG1hcFRleGVsVG9MaW5lYXIoIG1hcFRleGVsICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9NQVBcXG5cXHR1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbWFwO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbWV0YWxuZXNzbWFwX2ZyYWdtZW50ID0gXCJmbG9hdCBtZXRhbG5lc3NGYWN0b3IgPSBtZXRhbG5lc3M7XFxuI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcXG5cXHR2ZWM0IHRleGVsTWV0YWxuZXNzID0gdGV4dHVyZTJEKCBtZXRhbG5lc3NNYXAsIHZVdiApO1xcblxcdG1ldGFsbmVzc0ZhY3RvciAqPSB0ZXhlbE1ldGFsbmVzcy5iO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbWV0YWxuZXNzTWFwO1xcbiNlbmRpZlwiO1xuXG52YXIgbW9ycGhub3JtYWxfdmVydGV4ID0gXCIjaWZkZWYgVVNFX01PUlBITk9STUFMU1xcblxcdG9iamVjdE5vcm1hbCArPSAoIG1vcnBoTm9ybWFsMCAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAwIF07XFxuXFx0b2JqZWN0Tm9ybWFsICs9ICggbW9ycGhOb3JtYWwxIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcXG5cXHRvYmplY3ROb3JtYWwgKz0gKCBtb3JwaE5vcm1hbDIgLSBub3JtYWwgKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMiBdO1xcblxcdG9iamVjdE5vcm1hbCArPSAoIG1vcnBoTm9ybWFsMyAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAzIF07XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBtb3JwaHRhcmdldF9wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFNcXG5cXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcXG5cXHR1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgOCBdO1xcblxcdCNlbHNlXFxuXFx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIG1vcnBodGFyZ2V0X3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFNcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MCAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDAgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MSAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MiAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDIgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MyAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDMgXTtcXG5cXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0NCAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0NSAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDUgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0NiAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDYgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0NyAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDcgXTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIG5vcm1hbF9mcmFnbWVudF9iZWdpbiA9IFwiI2lmZGVmIEZMQVRfU0hBREVEXFxuXFx0dmVjMyBmZHggPSB2ZWMzKCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnggKSwgZEZkeCggdlZpZXdQb3NpdGlvbi55ICksIGRGZHgoIHZWaWV3UG9zaXRpb24ueiApICk7XFxuXFx0dmVjMyBmZHkgPSB2ZWMzKCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnggKSwgZEZkeSggdlZpZXdQb3NpdGlvbi55ICksIGRGZHkoIHZWaWV3UG9zaXRpb24ueiApICk7XFxuXFx0dmVjMyBub3JtYWwgPSBub3JtYWxpemUoIGNyb3NzKCBmZHgsIGZkeSApICk7XFxuI2Vsc2VcXG5cXHR2ZWMzIG5vcm1hbCA9IG5vcm1hbGl6ZSggdk5vcm1hbCApO1xcblxcdCNpZmRlZiBET1VCTEVfU0lERURcXG5cXHRcXHRub3JtYWwgPSBub3JtYWwgKiAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBub3JtYWxfZnJhZ21lbnRfbWFwcyA9IFwiI2lmZGVmIFVTRV9OT1JNQUxNQVBcXG5cXHRub3JtYWwgPSBwZXJ0dXJiTm9ybWFsMkFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCApO1xcbiNlbGlmIGRlZmluZWQoIFVTRV9CVU1QTUFQIClcXG5cXHRub3JtYWwgPSBwZXJ0dXJiTm9ybWFsQXJiKCAtdlZpZXdQb3NpdGlvbiwgbm9ybWFsLCBkSGR4eV9md2QoKSApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTk9STUFMTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbm9ybWFsTWFwO1xcblxcdHVuaWZvcm0gdmVjMiBub3JtYWxTY2FsZTtcXG5cXHR2ZWMzIHBlcnR1cmJOb3JtYWwyQXJiKCB2ZWMzIGV5ZV9wb3MsIHZlYzMgc3VyZl9ub3JtICkge1xcblxcdFxcdHZlYzMgcTAgPSB2ZWMzKCBkRmR4KCBleWVfcG9zLnggKSwgZEZkeCggZXllX3Bvcy55ICksIGRGZHgoIGV5ZV9wb3MueiApICk7XFxuXFx0XFx0dmVjMyBxMSA9IHZlYzMoIGRGZHkoIGV5ZV9wb3MueCApLCBkRmR5KCBleWVfcG9zLnkgKSwgZEZkeSggZXllX3Bvcy56ICkgKTtcXG5cXHRcXHR2ZWMyIHN0MCA9IGRGZHgoIHZVdi5zdCApO1xcblxcdFxcdHZlYzIgc3QxID0gZEZkeSggdlV2LnN0ICk7XFxuXFx0XFx0ZmxvYXQgc2NhbGUgPSBzaWduKCBzdDEudCAqIHN0MC5zIC0gc3QwLnQgKiBzdDEucyApO1xcdFxcdHNjYWxlICo9IGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wO1xcblxcdFxcdHZlYzMgUyA9IG5vcm1hbGl6ZSggKCBxMCAqIHN0MS50IC0gcTEgKiBzdDAudCApICogc2NhbGUgKTtcXG5cXHRcXHR2ZWMzIFQgPSBub3JtYWxpemUoICggLSBxMCAqIHN0MS5zICsgcTEgKiBzdDAucyApICogc2NhbGUgKTtcXG5cXHRcXHR2ZWMzIE4gPSBub3JtYWxpemUoIHN1cmZfbm9ybSApO1xcblxcdFxcdHZlYzMgbWFwTiA9IHRleHR1cmUyRCggbm9ybWFsTWFwLCB2VXYgKS54eXogKiAyLjAgLSAxLjA7XFxuXFx0XFx0bWFwTi54eSA9IG5vcm1hbFNjYWxlICogbWFwTi54eTtcXG5cXHRcXHRtYXQzIHRzbiA9IG1hdDMoIFMsIFQsIE4gKTtcXG5cXHRcXHRyZXR1cm4gbm9ybWFsaXplKCB0c24gKiBtYXBOICk7XFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgcGFja2luZyA9IFwidmVjMyBwYWNrTm9ybWFsVG9SR0IoIGNvbnN0IGluIHZlYzMgbm9ybWFsICkge1xcblxcdHJldHVybiBub3JtYWxpemUoIG5vcm1hbCApICogMC41ICsgMC41O1xcbn1cXG52ZWMzIHVucGFja1JHQlRvTm9ybWFsKCBjb25zdCBpbiB2ZWMzIHJnYiApIHtcXG5cXHRyZXR1cm4gMi4wICogcmdiLnh5eiAtIDEuMDtcXG59XFxuY29uc3QgZmxvYXQgUGFja1Vwc2NhbGUgPSAyNTYuIC8gMjU1Ljtjb25zdCBmbG9hdCBVbnBhY2tEb3duc2NhbGUgPSAyNTUuIC8gMjU2LjtcXG5jb25zdCB2ZWMzIFBhY2tGYWN0b3JzID0gdmVjMyggMjU2LiAqIDI1Ni4gKiAyNTYuLCAyNTYuICogMjU2LiwgIDI1Ni4gKTtcXG5jb25zdCB2ZWM0IFVucGFja0ZhY3RvcnMgPSBVbnBhY2tEb3duc2NhbGUgLyB2ZWM0KCBQYWNrRmFjdG9ycywgMS4gKTtcXG5jb25zdCBmbG9hdCBTaGlmdFJpZ2h0OCA9IDEuIC8gMjU2LjtcXG52ZWM0IHBhY2tEZXB0aFRvUkdCQSggY29uc3QgaW4gZmxvYXQgdiApIHtcXG5cXHR2ZWM0IHIgPSB2ZWM0KCBmcmFjdCggdiAqIFBhY2tGYWN0b3JzICksIHYgKTtcXG5cXHRyLnl6dyAtPSByLnh5eiAqIFNoaWZ0UmlnaHQ4O1xcdHJldHVybiByICogUGFja1Vwc2NhbGU7XFxufVxcbmZsb2F0IHVucGFja1JHQkFUb0RlcHRoKCBjb25zdCBpbiB2ZWM0IHYgKSB7XFxuXFx0cmV0dXJuIGRvdCggdiwgVW5wYWNrRmFjdG9ycyApO1xcbn1cXG5mbG9hdCB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XFxuXFx0cmV0dXJuICggdmlld1ogKyBuZWFyICkgLyAoIG5lYXIgLSBmYXIgKTtcXG59XFxuZmxvYXQgb3J0aG9ncmFwaGljRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBsaW5lYXJDbGlwWiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xcblxcdHJldHVybiBsaW5lYXJDbGlwWiAqICggbmVhciAtIGZhciApIC0gbmVhcjtcXG59XFxuZmxvYXQgdmlld1pUb1BlcnNwZWN0aXZlRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XFxuXFx0cmV0dXJuICgoIG5lYXIgKyB2aWV3WiApICogZmFyICkgLyAoKCBmYXIgLSBuZWFyICkgKiB2aWV3WiApO1xcbn1cXG5mbG9hdCBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgaW52Q2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcXG5cXHRyZXR1cm4gKCBuZWFyICogZmFyICkgLyAoICggZmFyIC0gbmVhciApICogaW52Q2xpcFogLSBmYXIgKTtcXG59XFxuXCI7XG5cbnZhciBwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50ID0gXCIjaWZkZWYgUFJFTVVMVElQTElFRF9BTFBIQVxcblxcdGdsX0ZyYWdDb2xvci5yZ2IgKj0gZ2xfRnJhZ0NvbG9yLmE7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBwcm9qZWN0X3ZlcnRleCA9IFwidmVjNCBtdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xcbmdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG12UG9zaXRpb247XFxuXCI7XG5cbnZhciBkaXRoZXJpbmdfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBESVRIRVJJTkcgKVxcbiAgZ2xfRnJhZ0NvbG9yLnJnYiA9IGRpdGhlcmluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBESVRIRVJJTkcgKVxcblxcdHZlYzMgZGl0aGVyaW5nKCB2ZWMzIGNvbG9yICkge1xcblxcdFxcdGZsb2F0IGdyaWRfcG9zaXRpb24gPSByYW5kKCBnbF9GcmFnQ29vcmQueHkgKTtcXG5cXHRcXHR2ZWMzIGRpdGhlcl9zaGlmdF9SR0IgPSB2ZWMzKCAwLjI1IC8gMjU1LjAsIC0wLjI1IC8gMjU1LjAsIDAuMjUgLyAyNTUuMCApO1xcblxcdFxcdGRpdGhlcl9zaGlmdF9SR0IgPSBtaXgoIDIuMCAqIGRpdGhlcl9zaGlmdF9SR0IsIC0yLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCBncmlkX3Bvc2l0aW9uICk7XFxuXFx0XFx0cmV0dXJuIGNvbG9yICsgZGl0aGVyX3NoaWZ0X1JHQjtcXG5cXHR9XFxuI2VuZGlmXFxuXCI7XG5cbnZhciByb3VnaG5lc3NtYXBfZnJhZ21lbnQgPSBcImZsb2F0IHJvdWdobmVzc0ZhY3RvciA9IHJvdWdobmVzcztcXG4jaWZkZWYgVVNFX1JPVUdITkVTU01BUFxcblxcdHZlYzQgdGV4ZWxSb3VnaG5lc3MgPSB0ZXh0dXJlMkQoIHJvdWdobmVzc01hcCwgdlV2ICk7XFxuXFx0cm91Z2huZXNzRmFjdG9yICo9IHRleGVsUm91Z2huZXNzLmc7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciByb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCByb3VnaG5lc3NNYXA7XFxuI2VuZGlmXCI7XG5cbnZhciBzaGFkb3dtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9TSEFET1dNQVBcXG5cXHQjaWYgTlVNX0RJUl9MSUdIVFMgPiAwXFxuXFx0XFx0dW5pZm9ybSBzYW1wbGVyMkQgZGlyZWN0aW9uYWxTaGFkb3dNYXBbIE5VTV9ESVJfTElHSFRTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUUyBdO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXFxuXFx0XFx0dW5pZm9ybSBzYW1wbGVyMkQgc3BvdFNoYWRvd01hcFsgTlVNX1NQT1RfTElHSFRTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZTcG90U2hhZG93Q29vcmRbIE5VTV9TUE9UX0xJR0hUUyBdO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxcblxcdFxcdHVuaWZvcm0gc2FtcGxlcjJEIHBvaW50U2hhZG93TWFwWyBOVU1fUE9JTlRfTElHSFRTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRTIF07XFxuXFx0I2VuZGlmXFxuXFx0ZmxvYXQgdGV4dHVyZTJEQ29tcGFyZSggc2FtcGxlcjJEIGRlcHRocywgdmVjMiB1diwgZmxvYXQgY29tcGFyZSApIHtcXG5cXHRcXHRyZXR1cm4gc3RlcCggY29tcGFyZSwgdW5wYWNrUkdCQVRvRGVwdGgoIHRleHR1cmUyRCggZGVwdGhzLCB1diApICkgKTtcXG5cXHR9XFxuXFx0ZmxvYXQgdGV4dHVyZTJEU2hhZG93TGVycCggc2FtcGxlcjJEIGRlcHRocywgdmVjMiBzaXplLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkge1xcblxcdFxcdGNvbnN0IHZlYzIgb2Zmc2V0ID0gdmVjMiggMC4wLCAxLjAgKTtcXG5cXHRcXHR2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gc2l6ZTtcXG5cXHRcXHR2ZWMyIGNlbnRyb2lkVVYgPSBmbG9vciggdXYgKiBzaXplICsgMC41ICkgLyBzaXplO1xcblxcdFxcdGZsb2F0IGxiID0gdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnh4LCBjb21wYXJlICk7XFxuXFx0XFx0ZmxvYXQgbHQgPSB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueHksIGNvbXBhcmUgKTtcXG5cXHRcXHRmbG9hdCByYiA9IHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC55eCwgY29tcGFyZSApO1xcblxcdFxcdGZsb2F0IHJ0ID0gdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnl5LCBjb21wYXJlICk7XFxuXFx0XFx0dmVjMiBmID0gZnJhY3QoIHV2ICogc2l6ZSArIDAuNSApO1xcblxcdFxcdGZsb2F0IGEgPSBtaXgoIGxiLCBsdCwgZi55ICk7XFxuXFx0XFx0ZmxvYXQgYiA9IG1peCggcmIsIHJ0LCBmLnkgKTtcXG5cXHRcXHRmbG9hdCBjID0gbWl4KCBhLCBiLCBmLnggKTtcXG5cXHRcXHRyZXR1cm4gYztcXG5cXHR9XFxuXFx0ZmxvYXQgZ2V0U2hhZG93KCBzYW1wbGVyMkQgc2hhZG93TWFwLCB2ZWMyIHNoYWRvd01hcFNpemUsIGZsb2F0IHNoYWRvd0JpYXMsIGZsb2F0IHNoYWRvd1JhZGl1cywgdmVjNCBzaGFkb3dDb29yZCApIHtcXG5cXHRcXHRmbG9hdCBzaGFkb3cgPSAxLjA7XFxuXFx0XFx0c2hhZG93Q29vcmQueHl6IC89IHNoYWRvd0Nvb3JkLnc7XFxuXFx0XFx0c2hhZG93Q29vcmQueiArPSBzaGFkb3dCaWFzO1xcblxcdFxcdGJ2ZWM0IGluRnJ1c3R1bVZlYyA9IGJ2ZWM0ICggc2hhZG93Q29vcmQueCA+PSAwLjAsIHNoYWRvd0Nvb3JkLnggPD0gMS4wLCBzaGFkb3dDb29yZC55ID49IDAuMCwgc2hhZG93Q29vcmQueSA8PSAxLjAgKTtcXG5cXHRcXHRib29sIGluRnJ1c3R1bSA9IGFsbCggaW5GcnVzdHVtVmVjICk7XFxuXFx0XFx0YnZlYzIgZnJ1c3R1bVRlc3RWZWMgPSBidmVjMiggaW5GcnVzdHVtLCBzaGFkb3dDb29yZC56IDw9IDEuMCApO1xcblxcdFxcdGJvb2wgZnJ1c3R1bVRlc3QgPSBhbGwoIGZydXN0dW1UZXN0VmVjICk7XFxuXFx0XFx0aWYgKCBmcnVzdHVtVGVzdCApIHtcXG5cXHRcXHQjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGIClcXG5cXHRcXHRcXHR2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTtcXG5cXHRcXHRcXHRmbG9hdCBkeDAgPSAtIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdGZsb2F0IGR5MCA9IC0gdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0ZmxvYXQgZHgxID0gKyB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRmbG9hdCBkeTEgPSArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdHNoYWRvdyA9IChcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MSApLCBzaGFkb3dDb29yZC56IClcXG5cXHRcXHRcXHQpICogKCAxLjAgLyA5LjAgKTtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApXFxuXFx0XFx0XFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XFxuXFx0XFx0XFx0ZmxvYXQgZHgwID0gLSB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRmbG9hdCBkeTAgPSAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdGZsb2F0IGR4MSA9ICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0ZmxvYXQgZHkxID0gKyB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRzaGFkb3cgPSAoXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQueiApXFxuXFx0XFx0XFx0KSAqICggMS4wIC8gOS4wICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRzaGFkb3cgPSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0fVxcblxcdFxcdHJldHVybiBzaGFkb3c7XFxuXFx0fVxcblxcdHZlYzIgY3ViZVRvVVYoIHZlYzMgdiwgZmxvYXQgdGV4ZWxTaXplWSApIHtcXG5cXHRcXHR2ZWMzIGFic1YgPSBhYnMoIHYgKTtcXG5cXHRcXHRmbG9hdCBzY2FsZVRvQ3ViZSA9IDEuMCAvIG1heCggYWJzVi54LCBtYXgoIGFic1YueSwgYWJzVi56ICkgKTtcXG5cXHRcXHRhYnNWICo9IHNjYWxlVG9DdWJlO1xcblxcdFxcdHYgKj0gc2NhbGVUb0N1YmUgKiAoIDEuMCAtIDIuMCAqIHRleGVsU2l6ZVkgKTtcXG5cXHRcXHR2ZWMyIHBsYW5hciA9IHYueHk7XFxuXFx0XFx0ZmxvYXQgYWxtb3N0QVRleGVsID0gMS41ICogdGV4ZWxTaXplWTtcXG5cXHRcXHRmbG9hdCBhbG1vc3RPbmUgPSAxLjAgLSBhbG1vc3RBVGV4ZWw7XFxuXFx0XFx0aWYgKCBhYnNWLnogPj0gYWxtb3N0T25lICkge1xcblxcdFxcdFxcdGlmICggdi56ID4gMC4wIClcXG5cXHRcXHRcXHRcXHRwbGFuYXIueCA9IDQuMCAtIHYueDtcXG5cXHRcXHR9IGVsc2UgaWYgKCBhYnNWLnggPj0gYWxtb3N0T25lICkge1xcblxcdFxcdFxcdGZsb2F0IHNpZ25YID0gc2lnbiggdi54ICk7XFxuXFx0XFx0XFx0cGxhbmFyLnggPSB2LnogKiBzaWduWCArIDIuMCAqIHNpZ25YO1xcblxcdFxcdH0gZWxzZSBpZiAoIGFic1YueSA+PSBhbG1vc3RPbmUgKSB7XFxuXFx0XFx0XFx0ZmxvYXQgc2lnblkgPSBzaWduKCB2LnkgKTtcXG5cXHRcXHRcXHRwbGFuYXIueCA9IHYueCArIDIuMCAqIHNpZ25ZICsgMi4wO1xcblxcdFxcdFxcdHBsYW5hci55ID0gdi56ICogc2lnblkgLSAyLjA7XFxuXFx0XFx0fVxcblxcdFxcdHJldHVybiB2ZWMyKCAwLjEyNSwgMC4yNSApICogcGxhbmFyICsgdmVjMiggMC4zNzUsIDAuNzUgKTtcXG5cXHR9XFxuXFx0ZmxvYXQgZ2V0UG9pbnRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkLCBmbG9hdCBzaGFkb3dDYW1lcmFOZWFyLCBmbG9hdCBzaGFkb3dDYW1lcmFGYXIgKSB7XFxuXFx0XFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvICggc2hhZG93TWFwU2l6ZSAqIHZlYzIoIDQuMCwgMi4wICkgKTtcXG5cXHRcXHR2ZWMzIGxpZ2h0VG9Qb3NpdGlvbiA9IHNoYWRvd0Nvb3JkLnh5ejtcXG5cXHRcXHRmbG9hdCBkcCA9ICggbGVuZ3RoKCBsaWdodFRvUG9zaXRpb24gKSAtIHNoYWRvd0NhbWVyYU5lYXIgKSAvICggc2hhZG93Q2FtZXJhRmFyIC0gc2hhZG93Q2FtZXJhTmVhciApO1xcdFxcdGRwICs9IHNoYWRvd0JpYXM7XFxuXFx0XFx0dmVjMyBiZDNEID0gbm9ybWFsaXplKCBsaWdodFRvUG9zaXRpb24gKTtcXG5cXHRcXHQjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGICkgfHwgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKVxcblxcdFxcdFxcdHZlYzIgb2Zmc2V0ID0gdmVjMiggLSAxLCAxICkgKiBzaGFkb3dSYWRpdXMgKiB0ZXhlbFNpemUueTtcXG5cXHRcXHRcXHRyZXR1cm4gKFxcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl5LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl4LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHksIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHh4LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eCwgdGV4ZWxTaXplLnkgKSwgZHAgKVxcblxcdFxcdFxcdCkgKiAoIDEuMCAvIDkuMCApO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0cmV0dXJuIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgc2hhZG93bWFwX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdCNpZiBOVU1fRElSX0xJR0hUUyA+IDBcXG5cXHRcXHR1bmlmb3JtIG1hdDQgZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIE5VTV9ESVJfTElHSFRTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUUyBdO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXFxuXFx0XFx0dW5pZm9ybSBtYXQ0IHNwb3RTaGFkb3dNYXRyaXhbIE5VTV9TUE9UX0xJR0hUUyBdO1xcblxcdFxcdHZhcnlpbmcgdmVjNCB2U3BvdFNoYWRvd0Nvb3JkWyBOVU1fU1BPVF9MSUdIVFMgXTtcXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcXG5cXHRcXHR1bmlmb3JtIG1hdDQgcG9pbnRTaGFkb3dNYXRyaXhbIE5VTV9QT0lOVF9MSUdIVFMgXTtcXG5cXHRcXHR2YXJ5aW5nIHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVFMgXTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIHNoYWRvd21hcF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0I2lmIE5VTV9ESVJfTElHSFRTID4gMFxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHR2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdID0gZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XFxuXFx0fVxcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHR2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gPSBzcG90U2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xcblxcdH1cXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHR2UG9pbnRTaGFkb3dDb29yZFsgaSBdID0gcG9pbnRTaGFkb3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XFxuXFx0fVxcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgc2hhZG93bWFza19wYXJzX2ZyYWdtZW50ID0gXCJmbG9hdCBnZXRTaGFkb3dNYXNrKCkge1xcblxcdGZsb2F0IHNoYWRvdyA9IDEuMDtcXG5cXHQjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdCNpZiBOVU1fRElSX0xJR0hUUyA+IDBcXG5cXHREaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQ7XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xcblxcdFxcdGRpcmVjdGlvbmFsTGlnaHQgPSBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdO1xcblxcdFxcdHNoYWRvdyAqPSBib29sKCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvdyApID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93QmlhcywgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dSYWRpdXMsIHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcXG5cXHR9XFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9TUE9UX0xJR0hUUyA+IDBcXG5cXHRTcG90TGlnaHQgc3BvdExpZ2h0O1xcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0c3BvdExpZ2h0ID0gc3BvdExpZ2h0c1sgaSBdO1xcblxcdFxcdHNoYWRvdyAqPSBib29sKCBzcG90TGlnaHQuc2hhZG93ICkgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodC5zaGFkb3dCaWFzLCBzcG90TGlnaHQuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcXG5cXHR9XFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXFxuXFx0UG9pbnRMaWdodCBwb2ludExpZ2h0O1xcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHBvaW50TGlnaHQgPSBwb2ludExpZ2h0c1sgaSBdO1xcblxcdFxcdHNoYWRvdyAqPSBib29sKCBwb2ludExpZ2h0LnNoYWRvdyApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodC5zaGFkb3dCaWFzLCBwb2ludExpZ2h0LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xcblxcdH1cXG5cXHQjZW5kaWZcXG5cXHQjZW5kaWZcXG5cXHRyZXR1cm4gc2hhZG93O1xcbn1cXG5cIjtcblxudmFyIHNraW5iYXNlX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9TS0lOTklOR1xcblxcdG1hdDQgYm9uZU1hdFggPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueCApO1xcblxcdG1hdDQgYm9uZU1hdFkgPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueSApO1xcblxcdG1hdDQgYm9uZU1hdFogPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueiApO1xcblxcdG1hdDQgYm9uZU1hdFcgPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgudyApO1xcbiNlbmRpZlwiO1xuXG52YXIgc2tpbm5pbmdfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0tJTk5JTkdcXG5cXHR1bmlmb3JtIG1hdDQgYmluZE1hdHJpeDtcXG5cXHR1bmlmb3JtIG1hdDQgYmluZE1hdHJpeEludmVyc2U7XFxuXFx0I2lmZGVmIEJPTkVfVEVYVFVSRVxcblxcdFxcdHVuaWZvcm0gc2FtcGxlcjJEIGJvbmVUZXh0dXJlO1xcblxcdFxcdHVuaWZvcm0gaW50IGJvbmVUZXh0dXJlU2l6ZTtcXG5cXHRcXHRtYXQ0IGdldEJvbmVNYXRyaXgoIGNvbnN0IGluIGZsb2F0IGkgKSB7XFxuXFx0XFx0XFx0ZmxvYXQgaiA9IGkgKiA0LjA7XFxuXFx0XFx0XFx0ZmxvYXQgeCA9IG1vZCggaiwgZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApICk7XFxuXFx0XFx0XFx0ZmxvYXQgeSA9IGZsb29yKCBqIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApICk7XFxuXFx0XFx0XFx0ZmxvYXQgZHggPSAxLjAgLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICk7XFxuXFx0XFx0XFx0ZmxvYXQgZHkgPSAxLjAgLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICk7XFxuXFx0XFx0XFx0eSA9IGR5ICogKCB5ICsgMC41ICk7XFxuXFx0XFx0XFx0dmVjNCB2MSA9IHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMC41ICksIHkgKSApO1xcblxcdFxcdFxcdHZlYzQgdjIgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDEuNSApLCB5ICkgKTtcXG5cXHRcXHRcXHR2ZWM0IHYzID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAyLjUgKSwgeSApICk7XFxuXFx0XFx0XFx0dmVjNCB2NCA9IHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMy41ICksIHkgKSApO1xcblxcdFxcdFxcdG1hdDQgYm9uZSA9IG1hdDQoIHYxLCB2MiwgdjMsIHY0ICk7XFxuXFx0XFx0XFx0cmV0dXJuIGJvbmU7XFxuXFx0XFx0fVxcblxcdCNlbHNlXFxuXFx0XFx0dW5pZm9ybSBtYXQ0IGJvbmVNYXRyaWNlc1sgTUFYX0JPTkVTIF07XFxuXFx0XFx0bWF0NCBnZXRCb25lTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkge1xcblxcdFxcdFxcdG1hdDQgYm9uZSA9IGJvbmVNYXRyaWNlc1sgaW50KGkpIF07XFxuXFx0XFx0XFx0cmV0dXJuIGJvbmU7XFxuXFx0XFx0fVxcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgc2tpbm5pbmdfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NLSU5OSU5HXFxuXFx0dmVjNCBza2luVmVydGV4ID0gYmluZE1hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcXG5cXHR2ZWM0IHNraW5uZWQgPSB2ZWM0KCAwLjAgKTtcXG5cXHRza2lubmVkICs9IGJvbmVNYXRYICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQueDtcXG5cXHRza2lubmVkICs9IGJvbmVNYXRZICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQueTtcXG5cXHRza2lubmVkICs9IGJvbmVNYXRaICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQuejtcXG5cXHRza2lubmVkICs9IGJvbmVNYXRXICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQudztcXG5cXHR0cmFuc2Zvcm1lZCA9ICggYmluZE1hdHJpeEludmVyc2UgKiBza2lubmVkICkueHl6O1xcbiNlbmRpZlxcblwiO1xuXG52YXIgc2tpbm5vcm1hbF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0tJTk5JTkdcXG5cXHRtYXQ0IHNraW5NYXRyaXggPSBtYXQ0KCAwLjAgKTtcXG5cXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQueCAqIGJvbmVNYXRYO1xcblxcdHNraW5NYXRyaXggKz0gc2tpbldlaWdodC55ICogYm9uZU1hdFk7XFxuXFx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnogKiBib25lTWF0WjtcXG5cXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQudyAqIGJvbmVNYXRXO1xcblxcdHNraW5NYXRyaXggID0gYmluZE1hdHJpeEludmVyc2UgKiBza2luTWF0cml4ICogYmluZE1hdHJpeDtcXG5cXHRvYmplY3ROb3JtYWwgPSB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0Tm9ybWFsLCAwLjAgKSApLnh5ejtcXG4jZW5kaWZcXG5cIjtcblxudmFyIHNwZWN1bGFybWFwX2ZyYWdtZW50ID0gXCJmbG9hdCBzcGVjdWxhclN0cmVuZ3RoO1xcbiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVBcXG5cXHR2ZWM0IHRleGVsU3BlY3VsYXIgPSB0ZXh0dXJlMkQoIHNwZWN1bGFyTWFwLCB2VXYgKTtcXG5cXHRzcGVjdWxhclN0cmVuZ3RoID0gdGV4ZWxTcGVjdWxhci5yO1xcbiNlbHNlXFxuXFx0c3BlY3VsYXJTdHJlbmd0aCA9IDEuMDtcXG4jZW5kaWZcIjtcblxudmFyIHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhck1hcDtcXG4jZW5kaWZcIjtcblxudmFyIHRvbmVtYXBwaW5nX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVE9ORV9NQVBQSU5HIClcXG4gIGdsX0ZyYWdDb2xvci5yZ2IgPSB0b25lTWFwcGluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgdG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudCA9IFwiI2lmbmRlZiBzYXR1cmF0ZVxcblxcdCNkZWZpbmUgc2F0dXJhdGUoYSkgY2xhbXAoIGEsIDAuMCwgMS4wIClcXG4jZW5kaWZcXG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nRXhwb3N1cmU7XFxudW5pZm9ybSBmbG9hdCB0b25lTWFwcGluZ1doaXRlUG9pbnQ7XFxudmVjMyBMaW5lYXJUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcXG5cXHRyZXR1cm4gdG9uZU1hcHBpbmdFeHBvc3VyZSAqIGNvbG9yO1xcbn1cXG52ZWMzIFJlaW5oYXJkVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XFxuXFx0Y29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTtcXG5cXHRyZXR1cm4gc2F0dXJhdGUoIGNvbG9yIC8gKCB2ZWMzKCAxLjAgKSArIGNvbG9yICkgKTtcXG59XFxuI2RlZmluZSBVbmNoYXJ0ZWQySGVscGVyKCB4ICkgbWF4KCAoICggeCAqICggMC4xNSAqIHggKyAwLjEwICogMC41MCApICsgMC4yMCAqIDAuMDIgKSAvICggeCAqICggMC4xNSAqIHggKyAwLjUwICkgKyAwLjIwICogMC4zMCApICkgLSAwLjAyIC8gMC4zMCwgdmVjMyggMC4wICkgKVxcbnZlYzMgVW5jaGFydGVkMlRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xcblxcdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XFxuXFx0cmV0dXJuIHNhdHVyYXRlKCBVbmNoYXJ0ZWQySGVscGVyKCBjb2xvciApIC8gVW5jaGFydGVkMkhlbHBlciggdmVjMyggdG9uZU1hcHBpbmdXaGl0ZVBvaW50ICkgKSApO1xcbn1cXG52ZWMzIE9wdGltaXplZENpbmVvblRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xcblxcdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XFxuXFx0Y29sb3IgPSBtYXgoIHZlYzMoIDAuMCApLCBjb2xvciAtIDAuMDA0ICk7XFxuXFx0cmV0dXJuIHBvdyggKCBjb2xvciAqICggNi4yICogY29sb3IgKyAwLjUgKSApIC8gKCBjb2xvciAqICggNi4yICogY29sb3IgKyAxLjcgKSArIDAuMDYgKSwgdmVjMyggMi4yICkgKTtcXG59XFxuXCI7XG5cbnZhciB1dl9wYXJzX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFVTRV9TUEVDVUxBUk1BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApIHx8IGRlZmluZWQoIFVTRV9FTUlTU0lWRU1BUCApIHx8IGRlZmluZWQoIFVTRV9ST1VHSE5FU1NNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTUVUQUxORVNTTUFQIClcXG5cXHR2YXJ5aW5nIHZlYzIgdlV2O1xcbiNlbmRpZlwiO1xuXG52YXIgdXZfcGFyc192ZXJ0ZXggPSBcIiNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggVVNFX1NQRUNVTEFSTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQICkgfHwgZGVmaW5lZCggVVNFX0VNSVNTSVZFTUFQICkgfHwgZGVmaW5lZCggVVNFX1JPVUdITkVTU01BUCApIHx8IGRlZmluZWQoIFVTRV9NRVRBTE5FU1NNQVAgKVxcblxcdHZhcnlpbmcgdmVjMiB2VXY7XFxuXFx0dW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgdXZfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFVTRV9TUEVDVUxBUk1BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApIHx8IGRlZmluZWQoIFVTRV9FTUlTU0lWRU1BUCApIHx8IGRlZmluZWQoIFVTRV9ST1VHSE5FU1NNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTUVUQUxORVNTTUFQIClcXG5cXHR2VXYgPSAoIHV2VHJhbnNmb3JtICogdmVjMyggdXYsIDEgKSApLnh5O1xcbiNlbmRpZlwiO1xuXG52YXIgdXYyX3BhcnNfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxcblxcdHZhcnlpbmcgdmVjMiB2VXYyO1xcbiNlbmRpZlwiO1xuXG52YXIgdXYyX3BhcnNfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcXG5cXHRhdHRyaWJ1dGUgdmVjMiB1djI7XFxuXFx0dmFyeWluZyB2ZWMyIHZVdjI7XFxuI2VuZGlmXCI7XG5cbnZhciB1djJfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcXG5cXHR2VXYyID0gdXYyO1xcbiNlbmRpZlwiO1xuXG52YXIgd29ybGRwb3NfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQoIERJU1RBTkNFICkgfHwgZGVmaW5lZCAoIFVTRV9TSEFET1dNQVAgKVxcblxcdHZlYzQgd29ybGRQb3NpdGlvbiA9IG1vZGVsTWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgY3ViZV9mcmFnID0gXCJ1bmlmb3JtIHNhbXBsZXJDdWJlIHRDdWJlO1xcbnVuaWZvcm0gZmxvYXQgdEZsaXA7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcXG52b2lkIG1haW4oKSB7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdGV4dHVyZUN1YmUoIHRDdWJlLCB2ZWMzKCB0RmxpcCAqIHZXb3JsZFBvc2l0aW9uLngsIHZXb3JsZFBvc2l0aW9uLnl6ICkgKTtcXG5cXHRnbF9GcmFnQ29sb3IuYSAqPSBvcGFjaXR5O1xcbn1cXG5cIjtcblxudmFyIGN1YmVfdmVydCA9IFwidmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxudm9pZCBtYWluKCkge1xcblxcdHZXb3JsZFBvc2l0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHRnbF9Qb3NpdGlvbi56ID0gZ2xfUG9zaXRpb24udztcXG59XFxuXCI7XG5cbnZhciBkZXB0aF9mcmFnID0gXCIjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXFxuXFx0dW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDEuMCApO1xcblxcdCNpZiBERVBUSF9QQUNLSU5HID09IDMyMDBcXG5cXHRcXHRkaWZmdXNlQ29sb3IuYSA9IG9wYWNpdHk7XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMFxcblxcdFxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIHZlYzMoIDEuMCAtIGdsX0ZyYWdDb29yZC56ICksIG9wYWNpdHkgKTtcXG5cXHQjZWxpZiBERVBUSF9QQUNLSU5HID09IDMyMDFcXG5cXHRcXHRnbF9GcmFnQ29sb3IgPSBwYWNrRGVwdGhUb1JHQkEoIGdsX0ZyYWdDb29yZC56ICk7XFxuXFx0I2VuZGlmXFxufVxcblwiO1xuXG52YXIgZGVwdGhfdmVydCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcXG5cXHRcXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdFxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0XFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIGRpc3RhbmNlUkdCQV9mcmFnID0gXCIjZGVmaW5lIERJU1RBTkNFXFxudW5pZm9ybSB2ZWMzIHJlZmVyZW5jZVBvc2l0aW9uO1xcbnVuaWZvcm0gZmxvYXQgbmVhckRpc3RhbmNlO1xcbnVuaWZvcm0gZmxvYXQgZmFyRGlzdGFuY2U7XFxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4gKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCAxLjAgKTtcXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxcblxcdGZsb2F0IGRpc3QgPSBsZW5ndGgoIHZXb3JsZFBvc2l0aW9uIC0gcmVmZXJlbmNlUG9zaXRpb24gKTtcXG5cXHRkaXN0ID0gKCBkaXN0IC0gbmVhckRpc3RhbmNlICkgLyAoIGZhckRpc3RhbmNlIC0gbmVhckRpc3RhbmNlICk7XFxuXFx0ZGlzdCA9IHNhdHVyYXRlKCBkaXN0ICk7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBkaXN0ICk7XFxufVxcblwiO1xuXG52YXIgZGlzdGFuY2VSR0JBX3ZlcnQgPSBcIiNkZWZpbmUgRElTVEFOQ0VcXG52YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxcblxcdFxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0XFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHRcXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0dldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uLnh5ejtcXG59XFxuXCI7XG5cbnZhciBlcXVpcmVjdF9mcmFnID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0RXF1aXJlY3Q7XFxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxudm9pZCBtYWluKCkge1xcblxcdHZlYzMgZGlyZWN0aW9uID0gbm9ybWFsaXplKCB2V29ybGRQb3NpdGlvbiApO1xcblxcdHZlYzIgc2FtcGxlVVY7XFxuXFx0c2FtcGxlVVYueSA9IGFzaW4oIGNsYW1wKCBkaXJlY3Rpb24ueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xcblxcdHNhbXBsZVVWLnggPSBhdGFuKCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xcblxcdGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCggdEVxdWlyZWN0LCBzYW1wbGVVViApO1xcbn1cXG5cIjtcblxudmFyIGVxdWlyZWN0X3ZlcnQgPSBcInZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbnZvaWQgbWFpbigpIHtcXG5cXHR2V29ybGRQb3NpdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgbGluZWRhc2hlZF9mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxudW5pZm9ybSBmbG9hdCBkYXNoU2l6ZTtcXG51bmlmb3JtIGZsb2F0IHRvdGFsU2l6ZTtcXG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdGlmICggbW9kKCB2TGluZURpc3RhbmNlLCB0b3RhbFNpemUgKSA+IGRhc2hTaXplICkge1xcblxcdFxcdGRpc2NhcmQ7XFxuXFx0fVxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApO1xcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0b3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcXG5cXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50Plxcbn1cXG5cIjtcblxudmFyIGxpbmVkYXNoZWRfdmVydCA9IFwidW5pZm9ybSBmbG9hdCBzY2FsZTtcXG5hdHRyaWJ1dGUgZmxvYXQgbGluZURpc3RhbmNlO1xcbnZhcnlpbmcgZmxvYXQgdkxpbmVEaXN0YW5jZTtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdHZMaW5lRGlzdGFuY2UgPSBzY2FsZSAqIGxpbmVEaXN0YW5jZTtcXG5cXHR2ZWM0IG12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIG1lc2hiYXNpY19mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxcblxcdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XFxuXFx0I2lmZGVmIFVTRV9MSUdIVE1BUFxcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XFxuXFx0I2Vsc2VcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gdmVjMyggMS4wICk7XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBkaWZmdXNlQ29sb3IucmdiO1xcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZTtcXG5cXHQjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PlxcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBtZXNoYmFzaWNfdmVydCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpZmRlZiBVU0VfRU5WTUFQXFxuXFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XFxuXCI7XG5cbnZhciBtZXNobGFtYmVydF9mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbnZhcnlpbmcgdmVjMyB2TGlnaHRGcm9udDtcXG4jaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZMaWdodEJhY2s7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJzZGZzPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfbWFwcz5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XFxuXFx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgPSBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xcblxcdCNpbmNsdWRlIDxsaWdodG1hcF9mcmFnbWVudD5cXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gQlJERl9EaWZmdXNlX0xhbWJlcnQoIGRpZmZ1c2VDb2xvci5yZ2IgKTtcXG5cXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSA9ICggZ2xfRnJvbnRGYWNpbmcgKSA/IHZMaWdodEZyb250IDogdkxpZ2h0QmFjaztcXG5cXHQjZWxzZVxcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgPSB2TGlnaHRGcm9udDtcXG5cXHQjZW5kaWZcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICo9IEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBkaWZmdXNlQ29sb3IucmdiICkgKiBnZXRTaGFkb3dNYXNrKCk7XFxuXFx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XFxuXFx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBtZXNobGFtYmVydF92ZXJ0ID0gXCIjZGVmaW5lIExBTUJFUlRcXG52YXJ5aW5nIHZlYzMgdkxpZ2h0RnJvbnQ7XFxuI2lmZGVmIERPVUJMRV9TSURFRFxcblxcdHZhcnlpbmcgdmVjMyB2TGlnaHRCYWNrO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8YnNkZnM+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19tYXBzPlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX2xhbWJlcnRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIG1lc2hwaG9uZ19mcmFnID0gXCIjZGVmaW5lIFBIT05HXFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xcbnVuaWZvcm0gdmVjMyBzcGVjdWxhcjtcXG51bmlmb3JtIGZsb2F0IHNoaW5pbmVzcztcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxic2Rmcz5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX21hcHM+XFxuI2luY2x1ZGUgPGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XFxuXFx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcXG5cXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XFxuXFx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxsaWdodHNfcGhvbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9iZWdpbj5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9lbmQ+XFxuXFx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XFxuXFx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBtZXNocGhvbmdfdmVydCA9IFwiI2RlZmluZSBQSE9OR1xcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xcbiNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgbWVzaHBoeXNpY2FsX2ZyYWcgPSBcIiNkZWZpbmUgUEhZU0lDQUxcXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XFxudW5pZm9ybSBmbG9hdCByb3VnaG5lc3M7XFxudW5pZm9ybSBmbG9hdCBtZXRhbG5lc3M7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpZm5kZWYgU1RBTkRBUkRcXG5cXHR1bmlmb3JtIGZsb2F0IGNsZWFyQ29hdDtcXG5cXHR1bmlmb3JtIGZsb2F0IGNsZWFyQ29hdFJvdWdobmVzcztcXG4jZW5kaWZcXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxic2Rmcz5cXG4jaW5jbHVkZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfbWFwcz5cXG4jaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XFxuXFx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHJvdWdobmVzc21hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWV0YWxuZXNzbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxcblxcdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfYmVnaW4+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPlxcblxcdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPlxcblxcdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Plxcbn1cXG5cIjtcblxudmFyIG1lc2hwaHlzaWNhbF92ZXJ0ID0gXCIjZGVmaW5lIFBIWVNJQ0FMXFxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xcbiNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgbm9ybWFsX2ZyYWcgPSBcIiNkZWZpbmUgTk9STUFMXFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApXFxuXFx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2VuZGlmXFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggcGFja05vcm1hbFRvUkdCKCBub3JtYWwgKSwgb3BhY2l0eSApO1xcbn1cXG5cIjtcblxudmFyIG5vcm1hbF92ZXJ0ID0gXCIjZGVmaW5lIE5PUk1BTFxcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApXFxuXFx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2VuZGlmXFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XFxuI2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQIClcXG5cXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcXG4jZW5kaWZcXG59XFxuXCI7XG5cbnZhciBwb2ludHNfZnJhZyA9IFwidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApO1xcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX3BhcnRpY2xlX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxcblxcdG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiO1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBwb2ludHNfdmVydCA9IFwidW5pZm9ybSBmbG9hdCBzaXplO1xcbnVuaWZvcm0gZmxvYXQgc2NhbGU7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpZmRlZiBVU0VfU0laRUFUVEVOVUFUSU9OXFxuXFx0XFx0Z2xfUG9pbnRTaXplID0gc2l6ZSAqICggc2NhbGUgLyAtIG12UG9zaXRpb24ueiApO1xcblxcdCNlbHNlXFxuXFx0XFx0Z2xfUG9pbnRTaXplID0gc2l6ZTtcXG5cXHQjZW5kaWZcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgc2hhZG93X2ZyYWcgPSBcInVuaWZvcm0gdmVjMyBjb2xvcjtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJzZGZzPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hc2tfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggY29sb3IsIG9wYWNpdHkgKiAoIDEuMCAtIGdldFNoYWRvd01hc2soKSApICk7XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBzaGFkb3dfdmVydCA9IFwiI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIFNoYWRlckNodW5rID0ge1xuXHRhbHBoYW1hcF9mcmFnbWVudDogYWxwaGFtYXBfZnJhZ21lbnQsXG5cdGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ6IGFscGhhbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGFscGhhdGVzdF9mcmFnbWVudDogYWxwaGF0ZXN0X2ZyYWdtZW50LFxuXHRhb21hcF9mcmFnbWVudDogYW9tYXBfZnJhZ21lbnQsXG5cdGFvbWFwX3BhcnNfZnJhZ21lbnQ6IGFvbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGJlZ2luX3ZlcnRleDogYmVnaW5fdmVydGV4LFxuXHRiZWdpbm5vcm1hbF92ZXJ0ZXg6IGJlZ2lubm9ybWFsX3ZlcnRleCxcblx0YnNkZnM6IGJzZGZzLFxuXHRidW1wbWFwX3BhcnNfZnJhZ21lbnQ6IGJ1bXBtYXBfcGFyc19mcmFnbWVudCxcblx0Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50OiBjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQsXG5cdGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50OiBjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudCxcblx0Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4OiBjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXgsXG5cdGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg6IGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXgsXG5cdGNvbG9yX2ZyYWdtZW50OiBjb2xvcl9mcmFnbWVudCxcblx0Y29sb3JfcGFyc19mcmFnbWVudDogY29sb3JfcGFyc19mcmFnbWVudCxcblx0Y29sb3JfcGFyc192ZXJ0ZXg6IGNvbG9yX3BhcnNfdmVydGV4LFxuXHRjb2xvcl92ZXJ0ZXg6IGNvbG9yX3ZlcnRleCxcblx0Y29tbW9uOiBjb21tb24sXG5cdGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudDogY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50LFxuXHRkZWZhdWx0bm9ybWFsX3ZlcnRleDogZGVmYXVsdG5vcm1hbF92ZXJ0ZXgsXG5cdGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleDogZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4LFxuXHRkaXNwbGFjZW1lbnRtYXBfdmVydGV4OiBkaXNwbGFjZW1lbnRtYXBfdmVydGV4LFxuXHRlbWlzc2l2ZW1hcF9mcmFnbWVudDogZW1pc3NpdmVtYXBfZnJhZ21lbnQsXG5cdGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ6IGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGVuY29kaW5nc19mcmFnbWVudDogZW5jb2RpbmdzX2ZyYWdtZW50LFxuXHRlbmNvZGluZ3NfcGFyc19mcmFnbWVudDogZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQsXG5cdGVudm1hcF9mcmFnbWVudDogZW52bWFwX2ZyYWdtZW50LFxuXHRlbnZtYXBfcGFyc19mcmFnbWVudDogZW52bWFwX3BhcnNfZnJhZ21lbnQsXG5cdGVudm1hcF9wYXJzX3ZlcnRleDogZW52bWFwX3BhcnNfdmVydGV4LFxuXHRlbnZtYXBfdmVydGV4OiBlbnZtYXBfdmVydGV4LFxuXHRmb2dfdmVydGV4OiBmb2dfdmVydGV4LFxuXHRmb2dfcGFyc192ZXJ0ZXg6IGZvZ19wYXJzX3ZlcnRleCxcblx0Zm9nX2ZyYWdtZW50OiBmb2dfZnJhZ21lbnQsXG5cdGZvZ19wYXJzX2ZyYWdtZW50OiBmb2dfcGFyc19mcmFnbWVudCxcblx0Z3JhZGllbnRtYXBfcGFyc19mcmFnbWVudDogZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudCxcblx0bGlnaHRtYXBfZnJhZ21lbnQ6IGxpZ2h0bWFwX2ZyYWdtZW50LFxuXHRsaWdodG1hcF9wYXJzX2ZyYWdtZW50OiBsaWdodG1hcF9wYXJzX2ZyYWdtZW50LFxuXHRsaWdodHNfbGFtYmVydF92ZXJ0ZXg6IGxpZ2h0c19sYW1iZXJ0X3ZlcnRleCxcblx0bGlnaHRzX3BhcnNfYmVnaW46IGxpZ2h0c19wYXJzX2JlZ2luLFxuXHRsaWdodHNfcGFyc19tYXBzOiBsaWdodHNfcGFyc19tYXBzLFxuXHRsaWdodHNfcGhvbmdfZnJhZ21lbnQ6IGxpZ2h0c19waG9uZ19mcmFnbWVudCxcblx0bGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQ6IGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50LFxuXHRsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQ6IGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudCxcblx0bGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ6IGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50LFxuXHRsaWdodHNfZnJhZ21lbnRfYmVnaW46IGxpZ2h0c19mcmFnbWVudF9iZWdpbixcblx0bGlnaHRzX2ZyYWdtZW50X21hcHM6IGxpZ2h0c19mcmFnbWVudF9tYXBzLFxuXHRsaWdodHNfZnJhZ21lbnRfZW5kOiBsaWdodHNfZnJhZ21lbnRfZW5kLFxuXHRsb2dkZXB0aGJ1Zl9mcmFnbWVudDogbG9nZGVwdGhidWZfZnJhZ21lbnQsXG5cdGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ6IGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQsXG5cdGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4OiBsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleCxcblx0bG9nZGVwdGhidWZfdmVydGV4OiBsb2dkZXB0aGJ1Zl92ZXJ0ZXgsXG5cdG1hcF9mcmFnbWVudDogbWFwX2ZyYWdtZW50LFxuXHRtYXBfcGFyc19mcmFnbWVudDogbWFwX3BhcnNfZnJhZ21lbnQsXG5cdG1hcF9wYXJ0aWNsZV9mcmFnbWVudDogbWFwX3BhcnRpY2xlX2ZyYWdtZW50LFxuXHRtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudDogbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQsXG5cdG1ldGFsbmVzc21hcF9mcmFnbWVudDogbWV0YWxuZXNzbWFwX2ZyYWdtZW50LFxuXHRtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudDogbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQsXG5cdG1vcnBobm9ybWFsX3ZlcnRleDogbW9ycGhub3JtYWxfdmVydGV4LFxuXHRtb3JwaHRhcmdldF9wYXJzX3ZlcnRleDogbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXgsXG5cdG1vcnBodGFyZ2V0X3ZlcnRleDogbW9ycGh0YXJnZXRfdmVydGV4LFxuXHRub3JtYWxfZnJhZ21lbnRfYmVnaW46IG5vcm1hbF9mcmFnbWVudF9iZWdpbixcblx0bm9ybWFsX2ZyYWdtZW50X21hcHM6IG5vcm1hbF9mcmFnbWVudF9tYXBzLFxuXHRub3JtYWxtYXBfcGFyc19mcmFnbWVudDogbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQsXG5cdHBhY2tpbmc6IHBhY2tpbmcsXG5cdHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ6IHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQsXG5cdHByb2plY3RfdmVydGV4OiBwcm9qZWN0X3ZlcnRleCxcblx0ZGl0aGVyaW5nX2ZyYWdtZW50OiBkaXRoZXJpbmdfZnJhZ21lbnQsXG5cdGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50OiBkaXRoZXJpbmdfcGFyc19mcmFnbWVudCxcblx0cm91Z2huZXNzbWFwX2ZyYWdtZW50OiByb3VnaG5lc3NtYXBfZnJhZ21lbnQsXG5cdHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50OiByb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudCxcblx0c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ6IHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50LFxuXHRzaGFkb3dtYXBfcGFyc192ZXJ0ZXg6IHNoYWRvd21hcF9wYXJzX3ZlcnRleCxcblx0c2hhZG93bWFwX3ZlcnRleDogc2hhZG93bWFwX3ZlcnRleCxcblx0c2hhZG93bWFza19wYXJzX2ZyYWdtZW50OiBzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQsXG5cdHNraW5iYXNlX3ZlcnRleDogc2tpbmJhc2VfdmVydGV4LFxuXHRza2lubmluZ19wYXJzX3ZlcnRleDogc2tpbm5pbmdfcGFyc192ZXJ0ZXgsXG5cdHNraW5uaW5nX3ZlcnRleDogc2tpbm5pbmdfdmVydGV4LFxuXHRza2lubm9ybWFsX3ZlcnRleDogc2tpbm5vcm1hbF92ZXJ0ZXgsXG5cdHNwZWN1bGFybWFwX2ZyYWdtZW50OiBzcGVjdWxhcm1hcF9mcmFnbWVudCxcblx0c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudDogc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudCxcblx0dG9uZW1hcHBpbmdfZnJhZ21lbnQ6IHRvbmVtYXBwaW5nX2ZyYWdtZW50LFxuXHR0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50OiB0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50LFxuXHR1dl9wYXJzX2ZyYWdtZW50OiB1dl9wYXJzX2ZyYWdtZW50LFxuXHR1dl9wYXJzX3ZlcnRleDogdXZfcGFyc192ZXJ0ZXgsXG5cdHV2X3ZlcnRleDogdXZfdmVydGV4LFxuXHR1djJfcGFyc19mcmFnbWVudDogdXYyX3BhcnNfZnJhZ21lbnQsXG5cdHV2Ml9wYXJzX3ZlcnRleDogdXYyX3BhcnNfdmVydGV4LFxuXHR1djJfdmVydGV4OiB1djJfdmVydGV4LFxuXHR3b3JsZHBvc192ZXJ0ZXg6IHdvcmxkcG9zX3ZlcnRleCxcblxuXHRjdWJlX2ZyYWc6IGN1YmVfZnJhZyxcblx0Y3ViZV92ZXJ0OiBjdWJlX3ZlcnQsXG5cdGRlcHRoX2ZyYWc6IGRlcHRoX2ZyYWcsXG5cdGRlcHRoX3ZlcnQ6IGRlcHRoX3ZlcnQsXG5cdGRpc3RhbmNlUkdCQV9mcmFnOiBkaXN0YW5jZVJHQkFfZnJhZyxcblx0ZGlzdGFuY2VSR0JBX3ZlcnQ6IGRpc3RhbmNlUkdCQV92ZXJ0LFxuXHRlcXVpcmVjdF9mcmFnOiBlcXVpcmVjdF9mcmFnLFxuXHRlcXVpcmVjdF92ZXJ0OiBlcXVpcmVjdF92ZXJ0LFxuXHRsaW5lZGFzaGVkX2ZyYWc6IGxpbmVkYXNoZWRfZnJhZyxcblx0bGluZWRhc2hlZF92ZXJ0OiBsaW5lZGFzaGVkX3ZlcnQsXG5cdG1lc2hiYXNpY19mcmFnOiBtZXNoYmFzaWNfZnJhZyxcblx0bWVzaGJhc2ljX3ZlcnQ6IG1lc2hiYXNpY192ZXJ0LFxuXHRtZXNobGFtYmVydF9mcmFnOiBtZXNobGFtYmVydF9mcmFnLFxuXHRtZXNobGFtYmVydF92ZXJ0OiBtZXNobGFtYmVydF92ZXJ0LFxuXHRtZXNocGhvbmdfZnJhZzogbWVzaHBob25nX2ZyYWcsXG5cdG1lc2hwaG9uZ192ZXJ0OiBtZXNocGhvbmdfdmVydCxcblx0bWVzaHBoeXNpY2FsX2ZyYWc6IG1lc2hwaHlzaWNhbF9mcmFnLFxuXHRtZXNocGh5c2ljYWxfdmVydDogbWVzaHBoeXNpY2FsX3ZlcnQsXG5cdG5vcm1hbF9mcmFnOiBub3JtYWxfZnJhZyxcblx0bm9ybWFsX3ZlcnQ6IG5vcm1hbF92ZXJ0LFxuXHRwb2ludHNfZnJhZzogcG9pbnRzX2ZyYWcsXG5cdHBvaW50c192ZXJ0OiBwb2ludHNfdmVydCxcblx0c2hhZG93X2ZyYWc6IHNoYWRvd19mcmFnLFxuXHRzaGFkb3dfdmVydDogc2hhZG93X3ZlcnRcbn07XG5cbi8qKlxuICogVW5pZm9ybSBVdGlsaXRpZXNcbiAqL1xuXG52YXIgVW5pZm9ybXNVdGlscyA9IHtcblxuXHRtZXJnZTogZnVuY3Rpb24gKCB1bmlmb3JtcyApIHtcblxuXHRcdHZhciBtZXJnZWQgPSB7fTtcblxuXHRcdGZvciAoIHZhciB1ID0gMDsgdSA8IHVuaWZvcm1zLmxlbmd0aDsgdSArKyApIHtcblxuXHRcdFx0dmFyIHRtcCA9IHRoaXMuY2xvbmUoIHVuaWZvcm1zWyB1IF0gKTtcblxuXHRcdFx0Zm9yICggdmFyIHAgaW4gdG1wICkge1xuXG5cdFx0XHRcdG1lcmdlZFsgcCBdID0gdG1wWyBwIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBtZXJnZWQ7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCB1bmlmb3Jtc19zcmMgKSB7XG5cblx0XHR2YXIgdW5pZm9ybXNfZHN0ID0ge307XG5cblx0XHRmb3IgKCB2YXIgdSBpbiB1bmlmb3Jtc19zcmMgKSB7XG5cblx0XHRcdHVuaWZvcm1zX2RzdFsgdSBdID0ge307XG5cblx0XHRcdGZvciAoIHZhciBwIGluIHVuaWZvcm1zX3NyY1sgdSBdICkge1xuXG5cdFx0XHRcdHZhciBwYXJhbWV0ZXJfc3JjID0gdW5pZm9ybXNfc3JjWyB1IF1bIHAgXTtcblxuXHRcdFx0XHRpZiAoIHBhcmFtZXRlcl9zcmMgJiYgKCBwYXJhbWV0ZXJfc3JjLmlzQ29sb3IgfHxcblx0XHRcdFx0XHRwYXJhbWV0ZXJfc3JjLmlzTWF0cml4MyB8fCBwYXJhbWV0ZXJfc3JjLmlzTWF0cml4NCB8fFxuXHRcdFx0XHRcdHBhcmFtZXRlcl9zcmMuaXNWZWN0b3IyIHx8IHBhcmFtZXRlcl9zcmMuaXNWZWN0b3IzIHx8IHBhcmFtZXRlcl9zcmMuaXNWZWN0b3I0IHx8XG5cdFx0XHRcdFx0cGFyYW1ldGVyX3NyYy5pc1RleHR1cmUgKSApIHtcblxuXHRcdFx0XHRcdHVuaWZvcm1zX2RzdFsgdSBdWyBwIF0gPSBwYXJhbWV0ZXJfc3JjLmNsb25lKCk7XG5cblx0XHRcdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggcGFyYW1ldGVyX3NyYyApICkge1xuXG5cdFx0XHRcdFx0dW5pZm9ybXNfZHN0WyB1IF1bIHAgXSA9IHBhcmFtZXRlcl9zcmMuc2xpY2UoKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dW5pZm9ybXNfZHN0WyB1IF1bIHAgXSA9IHBhcmFtZXRlcl9zcmM7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdW5pZm9ybXNfZHN0O1xuXG5cdH1cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbnZhciBDb2xvcktleXdvcmRzID0geyAnYWxpY2VibHVlJzogMHhGMEY4RkYsICdhbnRpcXVld2hpdGUnOiAweEZBRUJENywgJ2FxdWEnOiAweDAwRkZGRiwgJ2FxdWFtYXJpbmUnOiAweDdGRkZENCwgJ2F6dXJlJzogMHhGMEZGRkYsXG5cdCdiZWlnZSc6IDB4RjVGNURDLCAnYmlzcXVlJzogMHhGRkU0QzQsICdibGFjayc6IDB4MDAwMDAwLCAnYmxhbmNoZWRhbG1vbmQnOiAweEZGRUJDRCwgJ2JsdWUnOiAweDAwMDBGRiwgJ2JsdWV2aW9sZXQnOiAweDhBMkJFMixcblx0J2Jyb3duJzogMHhBNTJBMkEsICdidXJseXdvb2QnOiAweERFQjg4NywgJ2NhZGV0Ymx1ZSc6IDB4NUY5RUEwLCAnY2hhcnRyZXVzZSc6IDB4N0ZGRjAwLCAnY2hvY29sYXRlJzogMHhEMjY5MUUsICdjb3JhbCc6IDB4RkY3RjUwLFxuXHQnY29ybmZsb3dlcmJsdWUnOiAweDY0OTVFRCwgJ2Nvcm5zaWxrJzogMHhGRkY4REMsICdjcmltc29uJzogMHhEQzE0M0MsICdjeWFuJzogMHgwMEZGRkYsICdkYXJrYmx1ZSc6IDB4MDAwMDhCLCAnZGFya2N5YW4nOiAweDAwOEI4Qixcblx0J2Rhcmtnb2xkZW5yb2QnOiAweEI4ODYwQiwgJ2RhcmtncmF5JzogMHhBOUE5QTksICdkYXJrZ3JlZW4nOiAweDAwNjQwMCwgJ2RhcmtncmV5JzogMHhBOUE5QTksICdkYXJra2hha2knOiAweEJEQjc2QiwgJ2RhcmttYWdlbnRhJzogMHg4QjAwOEIsXG5cdCdkYXJrb2xpdmVncmVlbic6IDB4NTU2QjJGLCAnZGFya29yYW5nZSc6IDB4RkY4QzAwLCAnZGFya29yY2hpZCc6IDB4OTkzMkNDLCAnZGFya3JlZCc6IDB4OEIwMDAwLCAnZGFya3NhbG1vbic6IDB4RTk5NjdBLCAnZGFya3NlYWdyZWVuJzogMHg4RkJDOEYsXG5cdCdkYXJrc2xhdGVibHVlJzogMHg0ODNEOEIsICdkYXJrc2xhdGVncmF5JzogMHgyRjRGNEYsICdkYXJrc2xhdGVncmV5JzogMHgyRjRGNEYsICdkYXJrdHVycXVvaXNlJzogMHgwMENFRDEsICdkYXJrdmlvbGV0JzogMHg5NDAwRDMsXG5cdCdkZWVwcGluayc6IDB4RkYxNDkzLCAnZGVlcHNreWJsdWUnOiAweDAwQkZGRiwgJ2RpbWdyYXknOiAweDY5Njk2OSwgJ2RpbWdyZXknOiAweDY5Njk2OSwgJ2RvZGdlcmJsdWUnOiAweDFFOTBGRiwgJ2ZpcmVicmljayc6IDB4QjIyMjIyLFxuXHQnZmxvcmFsd2hpdGUnOiAweEZGRkFGMCwgJ2ZvcmVzdGdyZWVuJzogMHgyMjhCMjIsICdmdWNoc2lhJzogMHhGRjAwRkYsICdnYWluc2Jvcm8nOiAweERDRENEQywgJ2dob3N0d2hpdGUnOiAweEY4RjhGRiwgJ2dvbGQnOiAweEZGRDcwMCxcblx0J2dvbGRlbnJvZCc6IDB4REFBNTIwLCAnZ3JheSc6IDB4ODA4MDgwLCAnZ3JlZW4nOiAweDAwODAwMCwgJ2dyZWVueWVsbG93JzogMHhBREZGMkYsICdncmV5JzogMHg4MDgwODAsICdob25leWRldyc6IDB4RjBGRkYwLCAnaG90cGluayc6IDB4RkY2OUI0LFxuXHQnaW5kaWFucmVkJzogMHhDRDVDNUMsICdpbmRpZ28nOiAweDRCMDA4MiwgJ2l2b3J5JzogMHhGRkZGRjAsICdraGFraSc6IDB4RjBFNjhDLCAnbGF2ZW5kZXInOiAweEU2RTZGQSwgJ2xhdmVuZGVyYmx1c2gnOiAweEZGRjBGNSwgJ2xhd25ncmVlbic6IDB4N0NGQzAwLFxuXHQnbGVtb25jaGlmZm9uJzogMHhGRkZBQ0QsICdsaWdodGJsdWUnOiAweEFERDhFNiwgJ2xpZ2h0Y29yYWwnOiAweEYwODA4MCwgJ2xpZ2h0Y3lhbic6IDB4RTBGRkZGLCAnbGlnaHRnb2xkZW5yb2R5ZWxsb3cnOiAweEZBRkFEMiwgJ2xpZ2h0Z3JheSc6IDB4RDNEM0QzLFxuXHQnbGlnaHRncmVlbic6IDB4OTBFRTkwLCAnbGlnaHRncmV5JzogMHhEM0QzRDMsICdsaWdodHBpbmsnOiAweEZGQjZDMSwgJ2xpZ2h0c2FsbW9uJzogMHhGRkEwN0EsICdsaWdodHNlYWdyZWVuJzogMHgyMEIyQUEsICdsaWdodHNreWJsdWUnOiAweDg3Q0VGQSxcblx0J2xpZ2h0c2xhdGVncmF5JzogMHg3Nzg4OTksICdsaWdodHNsYXRlZ3JleSc6IDB4Nzc4ODk5LCAnbGlnaHRzdGVlbGJsdWUnOiAweEIwQzRERSwgJ2xpZ2h0eWVsbG93JzogMHhGRkZGRTAsICdsaW1lJzogMHgwMEZGMDAsICdsaW1lZ3JlZW4nOiAweDMyQ0QzMixcblx0J2xpbmVuJzogMHhGQUYwRTYsICdtYWdlbnRhJzogMHhGRjAwRkYsICdtYXJvb24nOiAweDgwMDAwMCwgJ21lZGl1bWFxdWFtYXJpbmUnOiAweDY2Q0RBQSwgJ21lZGl1bWJsdWUnOiAweDAwMDBDRCwgJ21lZGl1bW9yY2hpZCc6IDB4QkE1NUQzLFxuXHQnbWVkaXVtcHVycGxlJzogMHg5MzcwREIsICdtZWRpdW1zZWFncmVlbic6IDB4M0NCMzcxLCAnbWVkaXVtc2xhdGVibHVlJzogMHg3QjY4RUUsICdtZWRpdW1zcHJpbmdncmVlbic6IDB4MDBGQTlBLCAnbWVkaXVtdHVycXVvaXNlJzogMHg0OEQxQ0MsXG5cdCdtZWRpdW12aW9sZXRyZWQnOiAweEM3MTU4NSwgJ21pZG5pZ2h0Ymx1ZSc6IDB4MTkxOTcwLCAnbWludGNyZWFtJzogMHhGNUZGRkEsICdtaXN0eXJvc2UnOiAweEZGRTRFMSwgJ21vY2Nhc2luJzogMHhGRkU0QjUsICduYXZham93aGl0ZSc6IDB4RkZERUFELFxuXHQnbmF2eSc6IDB4MDAwMDgwLCAnb2xkbGFjZSc6IDB4RkRGNUU2LCAnb2xpdmUnOiAweDgwODAwMCwgJ29saXZlZHJhYic6IDB4NkI4RTIzLCAnb3JhbmdlJzogMHhGRkE1MDAsICdvcmFuZ2VyZWQnOiAweEZGNDUwMCwgJ29yY2hpZCc6IDB4REE3MEQ2LFxuXHQncGFsZWdvbGRlbnJvZCc6IDB4RUVFOEFBLCAncGFsZWdyZWVuJzogMHg5OEZCOTgsICdwYWxldHVycXVvaXNlJzogMHhBRkVFRUUsICdwYWxldmlvbGV0cmVkJzogMHhEQjcwOTMsICdwYXBheWF3aGlwJzogMHhGRkVGRDUsICdwZWFjaHB1ZmYnOiAweEZGREFCOSxcblx0J3BlcnUnOiAweENEODUzRiwgJ3BpbmsnOiAweEZGQzBDQiwgJ3BsdW0nOiAweEREQTBERCwgJ3Bvd2RlcmJsdWUnOiAweEIwRTBFNiwgJ3B1cnBsZSc6IDB4ODAwMDgwLCAncmViZWNjYXB1cnBsZSc6IDB4NjYzMzk5LCAncmVkJzogMHhGRjAwMDAsICdyb3N5YnJvd24nOiAweEJDOEY4Rixcblx0J3JveWFsYmx1ZSc6IDB4NDE2OUUxLCAnc2FkZGxlYnJvd24nOiAweDhCNDUxMywgJ3NhbG1vbic6IDB4RkE4MDcyLCAnc2FuZHlicm93bic6IDB4RjRBNDYwLCAnc2VhZ3JlZW4nOiAweDJFOEI1NywgJ3NlYXNoZWxsJzogMHhGRkY1RUUsXG5cdCdzaWVubmEnOiAweEEwNTIyRCwgJ3NpbHZlcic6IDB4QzBDMEMwLCAnc2t5Ymx1ZSc6IDB4ODdDRUVCLCAnc2xhdGVibHVlJzogMHg2QTVBQ0QsICdzbGF0ZWdyYXknOiAweDcwODA5MCwgJ3NsYXRlZ3JleSc6IDB4NzA4MDkwLCAnc25vdyc6IDB4RkZGQUZBLFxuXHQnc3ByaW5nZ3JlZW4nOiAweDAwRkY3RiwgJ3N0ZWVsYmx1ZSc6IDB4NDY4MkI0LCAndGFuJzogMHhEMkI0OEMsICd0ZWFsJzogMHgwMDgwODAsICd0aGlzdGxlJzogMHhEOEJGRDgsICd0b21hdG8nOiAweEZGNjM0NywgJ3R1cnF1b2lzZSc6IDB4NDBFMEQwLFxuXHQndmlvbGV0JzogMHhFRTgyRUUsICd3aGVhdCc6IDB4RjVERUIzLCAnd2hpdGUnOiAweEZGRkZGRiwgJ3doaXRlc21va2UnOiAweEY1RjVGNSwgJ3llbGxvdyc6IDB4RkZGRjAwLCAneWVsbG93Z3JlZW4nOiAweDlBQ0QzMiB9O1xuXG5mdW5jdGlvbiBDb2xvciggciwgZywgYiApIHtcblxuXHRpZiAoIGcgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHQvLyByIGlzIFRIUkVFLkNvbG9yLCBoZXggb3Igc3RyaW5nXG5cdFx0cmV0dXJuIHRoaXMuc2V0KCByICk7XG5cblx0fVxuXG5cdHJldHVybiB0aGlzLnNldFJHQiggciwgZywgYiApO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIENvbG9yLnByb3RvdHlwZSwge1xuXG5cdGlzQ29sb3I6IHRydWUsXG5cblx0cjogMSwgZzogMSwgYjogMSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHZhbHVlICYmIHZhbHVlLmlzQ29sb3IgKSB7XG5cblx0XHRcdHRoaXMuY29weSggdmFsdWUgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgKSB7XG5cblx0XHRcdHRoaXMuc2V0SGV4KCB2YWx1ZSApO1xuXG5cdFx0fSBlbHNlIGlmICggdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyApIHtcblxuXHRcdFx0dGhpcy5zZXRTdHlsZSggdmFsdWUgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMuciA9IHNjYWxhcjtcblx0XHR0aGlzLmcgPSBzY2FsYXI7XG5cdFx0dGhpcy5iID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRIZXg6IGZ1bmN0aW9uICggaGV4ICkge1xuXG5cdFx0aGV4ID0gTWF0aC5mbG9vciggaGV4ICk7XG5cblx0XHR0aGlzLnIgPSAoIGhleCA+PiAxNiAmIDI1NSApIC8gMjU1O1xuXHRcdHRoaXMuZyA9ICggaGV4ID4+IDggJiAyNTUgKSAvIDI1NTtcblx0XHR0aGlzLmIgPSAoIGhleCAmIDI1NSApIC8gMjU1O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRSR0I6IGZ1bmN0aW9uICggciwgZywgYiApIHtcblxuXHRcdHRoaXMuciA9IHI7XG5cdFx0dGhpcy5nID0gZztcblx0XHR0aGlzLmIgPSBiO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRIU0w6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGZ1bmN0aW9uIGh1ZTJyZ2IoIHAsIHEsIHQgKSB7XG5cblx0XHRcdGlmICggdCA8IDAgKSB0ICs9IDE7XG5cdFx0XHRpZiAoIHQgPiAxICkgdCAtPSAxO1xuXHRcdFx0aWYgKCB0IDwgMSAvIDYgKSByZXR1cm4gcCArICggcSAtIHAgKSAqIDYgKiB0O1xuXHRcdFx0aWYgKCB0IDwgMSAvIDIgKSByZXR1cm4gcTtcblx0XHRcdGlmICggdCA8IDIgLyAzICkgcmV0dXJuIHAgKyAoIHEgLSBwICkgKiA2ICogKCAyIC8gMyAtIHQgKTtcblx0XHRcdHJldHVybiBwO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldEhTTCggaCwgcywgbCApIHtcblxuXHRcdFx0Ly8gaCxzLGwgcmFuZ2VzIGFyZSBpbiAwLjAgLSAxLjBcblx0XHRcdGggPSBfTWF0aC5ldWNsaWRlYW5Nb2R1bG8oIGgsIDEgKTtcblx0XHRcdHMgPSBfTWF0aC5jbGFtcCggcywgMCwgMSApO1xuXHRcdFx0bCA9IF9NYXRoLmNsYW1wKCBsLCAwLCAxICk7XG5cblx0XHRcdGlmICggcyA9PT0gMCApIHtcblxuXHRcdFx0XHR0aGlzLnIgPSB0aGlzLmcgPSB0aGlzLmIgPSBsO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZhciBwID0gbCA8PSAwLjUgPyBsICogKCAxICsgcyApIDogbCArIHMgLSAoIGwgKiBzICk7XG5cdFx0XHRcdHZhciBxID0gKCAyICogbCApIC0gcDtcblxuXHRcdFx0XHR0aGlzLnIgPSBodWUycmdiKCBxLCBwLCBoICsgMSAvIDMgKTtcblx0XHRcdFx0dGhpcy5nID0gaHVlMnJnYiggcSwgcCwgaCApO1xuXHRcdFx0XHR0aGlzLmIgPSBodWUycmdiKCBxLCBwLCBoIC0gMSAvIDMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHNldFN0eWxlOiBmdW5jdGlvbiAoIHN0eWxlICkge1xuXG5cdFx0ZnVuY3Rpb24gaGFuZGxlQWxwaGEoIHN0cmluZyApIHtcblxuXHRcdFx0aWYgKCBzdHJpbmcgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdFx0aWYgKCBwYXJzZUZsb2F0KCBzdHJpbmcgKSA8IDEgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAnICsgc3R5bGUgKyAnIHdpbGwgYmUgaWdub3JlZC4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXG5cdFx0dmFyIG07XG5cblx0XHRpZiAoIG0gPSAvXigoPzpyZ2J8aHNsKWE/KVxcKFxccyooW15cXCldKilcXCkvLmV4ZWMoIHN0eWxlICkgKSB7XG5cblx0XHRcdC8vIHJnYiAvIGhzbFxuXG5cdFx0XHR2YXIgY29sb3I7XG5cdFx0XHR2YXIgbmFtZSA9IG1bIDEgXTtcblx0XHRcdHZhciBjb21wb25lbnRzID0gbVsgMiBdO1xuXG5cdFx0XHRzd2l0Y2ggKCBuYW1lICkge1xuXG5cdFx0XHRcdGNhc2UgJ3JnYic6XG5cdFx0XHRcdGNhc2UgJ3JnYmEnOlxuXG5cdFx0XHRcdFx0aWYgKCBjb2xvciA9IC9eKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKigsXFxzKihbMC05XSpcXC4/WzAtOV0rKVxccyopPyQvLmV4ZWMoIGNvbXBvbmVudHMgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmdiKDI1NSwwLDApIHJnYmEoMjU1LDAsMCwwLjUpXG5cdFx0XHRcdFx0XHR0aGlzLnIgPSBNYXRoLm1pbiggMjU1LCBwYXJzZUludCggY29sb3JbIDEgXSwgMTAgKSApIC8gMjU1O1xuXHRcdFx0XHRcdFx0dGhpcy5nID0gTWF0aC5taW4oIDI1NSwgcGFyc2VJbnQoIGNvbG9yWyAyIF0sIDEwICkgKSAvIDI1NTtcblx0XHRcdFx0XHRcdHRoaXMuYiA9IE1hdGgubWluKCAyNTUsIHBhcnNlSW50KCBjb2xvclsgMyBdLCAxMCApICkgLyAyNTU7XG5cblx0XHRcdFx0XHRcdGhhbmRsZUFscGhhKCBjb2xvclsgNSBdICk7XG5cblx0XHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBjb2xvciA9IC9eKFxcZCspXFwlXFxzKixcXHMqKFxcZCspXFwlXFxzKixcXHMqKFxcZCspXFwlXFxzKigsXFxzKihbMC05XSpcXC4/WzAtOV0rKVxccyopPyQvLmV4ZWMoIGNvbXBvbmVudHMgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmdiKDEwMCUsMCUsMCUpIHJnYmEoMTAwJSwwJSwwJSwwLjUpXG5cdFx0XHRcdFx0XHR0aGlzLnIgPSBNYXRoLm1pbiggMTAwLCBwYXJzZUludCggY29sb3JbIDEgXSwgMTAgKSApIC8gMTAwO1xuXHRcdFx0XHRcdFx0dGhpcy5nID0gTWF0aC5taW4oIDEwMCwgcGFyc2VJbnQoIGNvbG9yWyAyIF0sIDEwICkgKSAvIDEwMDtcblx0XHRcdFx0XHRcdHRoaXMuYiA9IE1hdGgubWluKCAxMDAsIHBhcnNlSW50KCBjb2xvclsgMyBdLCAxMCApICkgLyAxMDA7XG5cblx0XHRcdFx0XHRcdGhhbmRsZUFscGhhKCBjb2xvclsgNSBdICk7XG5cblx0XHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnaHNsJzpcblx0XHRcdFx0Y2FzZSAnaHNsYSc6XG5cblx0XHRcdFx0XHRpZiAoIGNvbG9yID0gL14oWzAtOV0qXFwuP1swLTldKylcXHMqLFxccyooXFxkKylcXCVcXHMqLFxccyooXFxkKylcXCVcXHMqKCxcXHMqKFswLTldKlxcLj9bMC05XSspXFxzKik/JC8uZXhlYyggY29tcG9uZW50cyApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBoc2woMTIwLDUwJSw1MCUpIGhzbGEoMTIwLDUwJSw1MCUsMC41KVxuXHRcdFx0XHRcdFx0dmFyIGggPSBwYXJzZUZsb2F0KCBjb2xvclsgMSBdICkgLyAzNjA7XG5cdFx0XHRcdFx0XHR2YXIgcyA9IHBhcnNlSW50KCBjb2xvclsgMiBdLCAxMCApIC8gMTAwO1xuXHRcdFx0XHRcdFx0dmFyIGwgPSBwYXJzZUludCggY29sb3JbIDMgXSwgMTAgKSAvIDEwMDtcblxuXHRcdFx0XHRcdFx0aGFuZGxlQWxwaGEoIGNvbG9yWyA1IF0gKTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0SFNMKCBoLCBzLCBsICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggbSA9IC9eXFwjKFtBLUZhLWYwLTldKykkLy5leGVjKCBzdHlsZSApICkge1xuXG5cdFx0XHQvLyBoZXggY29sb3JcblxuXHRcdFx0dmFyIGhleCA9IG1bIDEgXTtcblx0XHRcdHZhciBzaXplID0gaGV4Lmxlbmd0aDtcblxuXHRcdFx0aWYgKCBzaXplID09PSAzICkge1xuXG5cdFx0XHRcdC8vICNmZjBcblx0XHRcdFx0dGhpcy5yID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDAgKSArIGhleC5jaGFyQXQoIDAgKSwgMTYgKSAvIDI1NTtcblx0XHRcdFx0dGhpcy5nID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDEgKSArIGhleC5jaGFyQXQoIDEgKSwgMTYgKSAvIDI1NTtcblx0XHRcdFx0dGhpcy5iID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDIgKSArIGhleC5jaGFyQXQoIDIgKSwgMTYgKSAvIDI1NTtcblxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdFx0fSBlbHNlIGlmICggc2l6ZSA9PT0gNiApIHtcblxuXHRcdFx0XHQvLyAjZmYwMDAwXG5cdFx0XHRcdHRoaXMuciA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAwICkgKyBoZXguY2hhckF0KCAxICksIDE2ICkgLyAyNTU7XG5cdFx0XHRcdHRoaXMuZyA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAyICkgKyBoZXguY2hhckF0KCAzICksIDE2ICkgLyAyNTU7XG5cdFx0XHRcdHRoaXMuYiA9IHBhcnNlSW50KCBoZXguY2hhckF0KCA0ICkgKyBoZXguY2hhckF0KCA1ICksIDE2ICkgLyAyNTU7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggc3R5bGUgJiYgc3R5bGUubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0Ly8gY29sb3Iga2V5d29yZHNcblx0XHRcdHZhciBoZXggPSBDb2xvcktleXdvcmRzWyBzdHlsZSBdO1xuXG5cdFx0XHRpZiAoIGhleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIHJlZFxuXHRcdFx0XHR0aGlzLnNldEhleCggaGV4ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gdW5rbm93biBjb2xvclxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciAnICsgc3R5bGUgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLnIsIHRoaXMuZywgdGhpcy5iICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIGNvbG9yICkge1xuXG5cdFx0dGhpcy5yID0gY29sb3Iucjtcblx0XHR0aGlzLmcgPSBjb2xvci5nO1xuXHRcdHRoaXMuYiA9IGNvbG9yLmI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlHYW1tYVRvTGluZWFyOiBmdW5jdGlvbiAoIGNvbG9yLCBnYW1tYUZhY3RvciApIHtcblxuXHRcdGlmICggZ2FtbWFGYWN0b3IgPT09IHVuZGVmaW5lZCApIGdhbW1hRmFjdG9yID0gMi4wO1xuXG5cdFx0dGhpcy5yID0gTWF0aC5wb3coIGNvbG9yLnIsIGdhbW1hRmFjdG9yICk7XG5cdFx0dGhpcy5nID0gTWF0aC5wb3coIGNvbG9yLmcsIGdhbW1hRmFjdG9yICk7XG5cdFx0dGhpcy5iID0gTWF0aC5wb3coIGNvbG9yLmIsIGdhbW1hRmFjdG9yICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlMaW5lYXJUb0dhbW1hOiBmdW5jdGlvbiAoIGNvbG9yLCBnYW1tYUZhY3RvciApIHtcblxuXHRcdGlmICggZ2FtbWFGYWN0b3IgPT09IHVuZGVmaW5lZCApIGdhbW1hRmFjdG9yID0gMi4wO1xuXG5cdFx0dmFyIHNhZmVJbnZlcnNlID0gKCBnYW1tYUZhY3RvciA+IDAgKSA/ICggMS4wIC8gZ2FtbWFGYWN0b3IgKSA6IDEuMDtcblxuXHRcdHRoaXMuciA9IE1hdGgucG93KCBjb2xvci5yLCBzYWZlSW52ZXJzZSApO1xuXHRcdHRoaXMuZyA9IE1hdGgucG93KCBjb2xvci5nLCBzYWZlSW52ZXJzZSApO1xuXHRcdHRoaXMuYiA9IE1hdGgucG93KCBjb2xvci5iLCBzYWZlSW52ZXJzZSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb252ZXJ0R2FtbWFUb0xpbmVhcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHIgPSB0aGlzLnIsIGcgPSB0aGlzLmcsIGIgPSB0aGlzLmI7XG5cblx0XHR0aGlzLnIgPSByICogcjtcblx0XHR0aGlzLmcgPSBnICogZztcblx0XHR0aGlzLmIgPSBiICogYjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29udmVydExpbmVhclRvR2FtbWE6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuciA9IE1hdGguc3FydCggdGhpcy5yICk7XG5cdFx0dGhpcy5nID0gTWF0aC5zcXJ0KCB0aGlzLmcgKTtcblx0XHR0aGlzLmIgPSBNYXRoLnNxcnQoIHRoaXMuYiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRIZXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiAoIHRoaXMuciAqIDI1NSApIDw8IDE2IF4gKCB0aGlzLmcgKiAyNTUgKSA8PCA4IF4gKCB0aGlzLmIgKiAyNTUgKSA8PCAwO1xuXG5cdH0sXG5cblx0Z2V0SGV4U3RyaW5nOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gKCAnMDAwMDAwJyArIHRoaXMuZ2V0SGV4KCkudG9TdHJpbmcoIDE2ICkgKS5zbGljZSggLSA2ICk7XG5cblx0fSxcblxuXHRnZXRIU0w6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0Ly8gaCxzLGwgcmFuZ2VzIGFyZSBpbiAwLjAgLSAxLjBcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkNvbG9yOiAuZ2V0SFNMKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IHsgaDogMCwgczogMCwgbDogMCB9O1xuXG5cdFx0fVxuXG5cdFx0dmFyIHIgPSB0aGlzLnIsIGcgPSB0aGlzLmcsIGIgPSB0aGlzLmI7XG5cblx0XHR2YXIgbWF4ID0gTWF0aC5tYXgoIHIsIGcsIGIgKTtcblx0XHR2YXIgbWluID0gTWF0aC5taW4oIHIsIGcsIGIgKTtcblxuXHRcdHZhciBodWUsIHNhdHVyYXRpb247XG5cdFx0dmFyIGxpZ2h0bmVzcyA9ICggbWluICsgbWF4ICkgLyAyLjA7XG5cblx0XHRpZiAoIG1pbiA9PT0gbWF4ICkge1xuXG5cdFx0XHRodWUgPSAwO1xuXHRcdFx0c2F0dXJhdGlvbiA9IDA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgZGVsdGEgPSBtYXggLSBtaW47XG5cblx0XHRcdHNhdHVyYXRpb24gPSBsaWdodG5lc3MgPD0gMC41ID8gZGVsdGEgLyAoIG1heCArIG1pbiApIDogZGVsdGEgLyAoIDIgLSBtYXggLSBtaW4gKTtcblxuXHRcdFx0c3dpdGNoICggbWF4ICkge1xuXG5cdFx0XHRcdGNhc2UgcjogaHVlID0gKCBnIC0gYiApIC8gZGVsdGEgKyAoIGcgPCBiID8gNiA6IDAgKTsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgZzogaHVlID0gKCBiIC0gciApIC8gZGVsdGEgKyAyOyBicmVhaztcblx0XHRcdFx0Y2FzZSBiOiBodWUgPSAoIHIgLSBnICkgLyBkZWx0YSArIDQ7IGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdGh1ZSAvPSA2O1xuXG5cdFx0fVxuXG5cdFx0dGFyZ2V0LmggPSBodWU7XG5cdFx0dGFyZ2V0LnMgPSBzYXR1cmF0aW9uO1xuXHRcdHRhcmdldC5sID0gbGlnaHRuZXNzO1xuXG5cdFx0cmV0dXJuIHRhcmdldDtcblxuXHR9LFxuXG5cdGdldFN0eWxlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gJ3JnYignICsgKCAoIHRoaXMuciAqIDI1NSApIHwgMCApICsgJywnICsgKCAoIHRoaXMuZyAqIDI1NSApIHwgMCApICsgJywnICsgKCAoIHRoaXMuYiAqIDI1NSApIHwgMCApICsgJyknO1xuXG5cdH0sXG5cblx0b2Zmc2V0SFNMOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaHNsID0ge307XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gKCBoLCBzLCBsICkge1xuXG5cdFx0XHR0aGlzLmdldEhTTCggaHNsICk7XG5cblx0XHRcdGhzbC5oICs9IGg7IGhzbC5zICs9IHM7IGhzbC5sICs9IGw7XG5cblx0XHRcdHRoaXMuc2V0SFNMKCBoc2wuaCwgaHNsLnMsIGhzbC5sICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0YWRkOiBmdW5jdGlvbiAoIGNvbG9yICkge1xuXG5cdFx0dGhpcy5yICs9IGNvbG9yLnI7XG5cdFx0dGhpcy5nICs9IGNvbG9yLmc7XG5cdFx0dGhpcy5iICs9IGNvbG9yLmI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZENvbG9yczogZnVuY3Rpb24gKCBjb2xvcjEsIGNvbG9yMiApIHtcblxuXHRcdHRoaXMuciA9IGNvbG9yMS5yICsgY29sb3IyLnI7XG5cdFx0dGhpcy5nID0gY29sb3IxLmcgKyBjb2xvcjIuZztcblx0XHR0aGlzLmIgPSBjb2xvcjEuYiArIGNvbG9yMi5iO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMuciArPSBzO1xuXHRcdHRoaXMuZyArPSBzO1xuXHRcdHRoaXMuYiArPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWI6IGZ1bmN0aW9uICggY29sb3IgKSB7XG5cblx0XHR0aGlzLnIgPSBNYXRoLm1heCggMCwgdGhpcy5yIC0gY29sb3IuciApO1xuXHRcdHRoaXMuZyA9IE1hdGgubWF4KCAwLCB0aGlzLmcgLSBjb2xvci5nICk7XG5cdFx0dGhpcy5iID0gTWF0aC5tYXgoIDAsIHRoaXMuYiAtIGNvbG9yLmIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggY29sb3IgKSB7XG5cblx0XHR0aGlzLnIgKj0gY29sb3Iucjtcblx0XHR0aGlzLmcgKj0gY29sb3IuZztcblx0XHR0aGlzLmIgKj0gY29sb3IuYjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMuciAqPSBzO1xuXHRcdHRoaXMuZyAqPSBzO1xuXHRcdHRoaXMuYiAqPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRsZXJwOiBmdW5jdGlvbiAoIGNvbG9yLCBhbHBoYSApIHtcblxuXHRcdHRoaXMuciArPSAoIGNvbG9yLnIgLSB0aGlzLnIgKSAqIGFscGhhO1xuXHRcdHRoaXMuZyArPSAoIGNvbG9yLmcgLSB0aGlzLmcgKSAqIGFscGhhO1xuXHRcdHRoaXMuYiArPSAoIGNvbG9yLmIgLSB0aGlzLmIgKSAqIGFscGhhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggYyApIHtcblxuXHRcdHJldHVybiAoIGMuciA9PT0gdGhpcy5yICkgJiYgKCBjLmcgPT09IHRoaXMuZyApICYmICggYy5iID09PSB0aGlzLmIgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLnIgPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy5nID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblx0XHR0aGlzLmIgPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy5yO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLmc7XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuYjtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0SGV4KCk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogVW5pZm9ybXMgbGlicmFyeSBmb3Igc2hhcmVkIHdlYmdsIHNoYWRlcnNcbiAqL1xuXG52YXIgVW5pZm9ybXNMaWIgPSB7XG5cblx0Y29tbW9uOiB7XG5cblx0XHRkaWZmdXNlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4ZWVlZWVlICkgfSxcblx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfSxcblxuXHRcdG1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdHV2VHJhbnNmb3JtOiB7IHZhbHVlOiBuZXcgTWF0cml4MygpIH0sXG5cblx0XHRhbHBoYU1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXG5cdH0sXG5cblx0c3BlY3VsYXJtYXA6IHtcblxuXHRcdHNwZWN1bGFyTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cblx0fSxcblxuXHRlbnZtYXA6IHtcblxuXHRcdGVudk1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGZsaXBFbnZNYXA6IHsgdmFsdWU6IC0gMSB9LFxuXHRcdHJlZmxlY3Rpdml0eTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0cmVmcmFjdGlvblJhdGlvOiB7IHZhbHVlOiAwLjk4IH0sXG5cdFx0bWF4TWlwTGV2ZWw6IHsgdmFsdWU6IDAgfVxuXG5cdH0sXG5cblx0YW9tYXA6IHtcblxuXHRcdGFvTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0YW9NYXBJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfVxuXG5cdH0sXG5cblx0bGlnaHRtYXA6IHtcblxuXHRcdGxpZ2h0TWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0bGlnaHRNYXBJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfVxuXG5cdH0sXG5cblx0ZW1pc3NpdmVtYXA6IHtcblxuXHRcdGVtaXNzaXZlTWFwOiB7IHZhbHVlOiBudWxsIH1cblxuXHR9LFxuXG5cdGJ1bXBtYXA6IHtcblxuXHRcdGJ1bXBNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRidW1wU2NhbGU6IHsgdmFsdWU6IDEgfVxuXG5cdH0sXG5cblx0bm9ybWFsbWFwOiB7XG5cblx0XHRub3JtYWxNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRub3JtYWxTY2FsZTogeyB2YWx1ZTogbmV3IFZlY3RvcjIoIDEsIDEgKSB9XG5cblx0fSxcblxuXHRkaXNwbGFjZW1lbnRtYXA6IHtcblxuXHRcdGRpc3BsYWNlbWVudE1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGRpc3BsYWNlbWVudFNjYWxlOiB7IHZhbHVlOiAxIH0sXG5cdFx0ZGlzcGxhY2VtZW50QmlhczogeyB2YWx1ZTogMCB9XG5cblx0fSxcblxuXHRyb3VnaG5lc3NtYXA6IHtcblxuXHRcdHJvdWdobmVzc01hcDogeyB2YWx1ZTogbnVsbCB9XG5cblx0fSxcblxuXHRtZXRhbG5lc3NtYXA6IHtcblxuXHRcdG1ldGFsbmVzc01hcDogeyB2YWx1ZTogbnVsbCB9XG5cblx0fSxcblxuXHRncmFkaWVudG1hcDoge1xuXG5cdFx0Z3JhZGllbnRNYXA6IHsgdmFsdWU6IG51bGwgfVxuXG5cdH0sXG5cblx0Zm9nOiB7XG5cblx0XHRmb2dEZW5zaXR5OiB7IHZhbHVlOiAwLjAwMDI1IH0sXG5cdFx0Zm9nTmVhcjogeyB2YWx1ZTogMSB9LFxuXHRcdGZvZ0ZhcjogeyB2YWx1ZTogMjAwMCB9LFxuXHRcdGZvZ0NvbG9yOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4ZmZmZmZmICkgfVxuXG5cdH0sXG5cblx0bGlnaHRzOiB7XG5cblx0XHRhbWJpZW50TGlnaHRDb2xvcjogeyB2YWx1ZTogW10gfSxcblxuXHRcdGRpcmVjdGlvbmFsTGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0ZGlyZWN0aW9uOiB7fSxcblx0XHRcdGNvbG9yOiB7fSxcblxuXHRcdFx0c2hhZG93OiB7fSxcblx0XHRcdHNoYWRvd0JpYXM6IHt9LFxuXHRcdFx0c2hhZG93UmFkaXVzOiB7fSxcblx0XHRcdHNoYWRvd01hcFNpemU6IHt9XG5cdFx0fSB9LFxuXG5cdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sXG5cdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6IHsgdmFsdWU6IFtdIH0sXG5cblx0XHRzcG90TGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0Y29sb3I6IHt9LFxuXHRcdFx0cG9zaXRpb246IHt9LFxuXHRcdFx0ZGlyZWN0aW9uOiB7fSxcblx0XHRcdGRpc3RhbmNlOiB7fSxcblx0XHRcdGNvbmVDb3M6IHt9LFxuXHRcdFx0cGVudW1icmFDb3M6IHt9LFxuXHRcdFx0ZGVjYXk6IHt9LFxuXG5cdFx0XHRzaGFkb3c6IHt9LFxuXHRcdFx0c2hhZG93Qmlhczoge30sXG5cdFx0XHRzaGFkb3dSYWRpdXM6IHt9LFxuXHRcdFx0c2hhZG93TWFwU2l6ZToge31cblx0XHR9IH0sXG5cblx0XHRzcG90U2hhZG93TWFwOiB7IHZhbHVlOiBbXSB9LFxuXHRcdHNwb3RTaGFkb3dNYXRyaXg6IHsgdmFsdWU6IFtdIH0sXG5cblx0XHRwb2ludExpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdGNvbG9yOiB7fSxcblx0XHRcdHBvc2l0aW9uOiB7fSxcblx0XHRcdGRlY2F5OiB7fSxcblx0XHRcdGRpc3RhbmNlOiB7fSxcblxuXHRcdFx0c2hhZG93OiB7fSxcblx0XHRcdHNoYWRvd0JpYXM6IHt9LFxuXHRcdFx0c2hhZG93UmFkaXVzOiB7fSxcblx0XHRcdHNoYWRvd01hcFNpemU6IHt9LFxuXHRcdFx0c2hhZG93Q2FtZXJhTmVhcjoge30sXG5cdFx0XHRzaGFkb3dDYW1lcmFGYXI6IHt9XG5cdFx0fSB9LFxuXG5cdFx0cG9pbnRTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sXG5cdFx0cG9pbnRTaGFkb3dNYXRyaXg6IHsgdmFsdWU6IFtdIH0sXG5cblx0XHRoZW1pc3BoZXJlTGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0ZGlyZWN0aW9uOiB7fSxcblx0XHRcdHNreUNvbG9yOiB7fSxcblx0XHRcdGdyb3VuZENvbG9yOiB7fVxuXHRcdH0gfSxcblxuXHRcdC8vIFRPRE8gKGFiZWxuYXRpb24pOiBSZWN0QXJlYUxpZ2h0IEJSREYgZGF0YSBuZWVkcyB0byBiZSBtb3ZlZCBmcm9tIGV4YW1wbGUgdG8gbWFpbiBzcmNcblx0XHRyZWN0QXJlYUxpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdGNvbG9yOiB7fSxcblx0XHRcdHBvc2l0aW9uOiB7fSxcblx0XHRcdHdpZHRoOiB7fSxcblx0XHRcdGhlaWdodDoge31cblx0XHR9IH1cblxuXHR9LFxuXG5cdHBvaW50czoge1xuXG5cdFx0ZGlmZnVzZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweGVlZWVlZSApIH0sXG5cdFx0b3BhY2l0eTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0c2l6ZTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0c2NhbGU6IHsgdmFsdWU6IDEuMCB9LFxuXHRcdG1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdHV2VHJhbnNmb3JtOiB7IHZhbHVlOiBuZXcgTWF0cml4MygpIH1cblxuXHR9XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICovXG5cbnZhciBTaGFkZXJMaWIgPSB7XG5cblx0YmFzaWM6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5zcGVjdWxhcm1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmVudm1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmFvbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2dcblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hiYXNpY192ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNoYmFzaWNfZnJhZ1xuXG5cdH0sXG5cblx0bGFtYmVydDoge1xuXG5cdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLnNwZWN1bGFybWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW52bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuYW9tYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmVtaXNzaXZlbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRzLFxuXHRcdFx0e1xuXHRcdFx0XHRlbWlzc2l2ZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweDAwMDAwMCApIH1cblx0XHRcdH1cblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hsYW1iZXJ0X3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hsYW1iZXJ0X2ZyYWdcblxuXHR9LFxuXG5cdHBob25nOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuc3BlY3VsYXJtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbnZtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5hb21hcCxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW1pc3NpdmVtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZ3JhZGllbnRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2csXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodHMsXG5cdFx0XHR7XG5cdFx0XHRcdGVtaXNzaXZlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MDAwMDAwICkgfSxcblx0XHRcdFx0c3BlY3VsYXI6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgxMTExMTEgKSB9LFxuXHRcdFx0XHRzaGluaW5lc3M6IHsgdmFsdWU6IDMwIH1cblx0XHRcdH1cblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaG9uZ192ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGhvbmdfZnJhZ1xuXG5cdH0sXG5cblx0c3RhbmRhcmQ6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbnZtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5hb21hcCxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW1pc3NpdmVtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIucm91Z2huZXNzbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubWV0YWxuZXNzbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRzLFxuXHRcdFx0e1xuXHRcdFx0XHRlbWlzc2l2ZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweDAwMDAwMCApIH0sXG5cdFx0XHRcdHJvdWdobmVzczogeyB2YWx1ZTogMC41IH0sXG5cdFx0XHRcdG1ldGFsbmVzczogeyB2YWx1ZTogMC41IH0sXG5cdFx0XHRcdGVudk1hcEludGVuc2l0eTogeyB2YWx1ZTogMSB9IC8vIHRlbXBvcmFyeVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF9mcmFnXG5cblx0fSxcblxuXHRwb2ludHM6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5wb2ludHMsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2dcblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLnBvaW50c192ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5wb2ludHNfZnJhZ1xuXG5cdH0sXG5cblx0ZGFzaGVkOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxuXHRcdFx0e1xuXHRcdFx0XHRzY2FsZTogeyB2YWx1ZTogMSB9LFxuXHRcdFx0XHRkYXNoU2l6ZTogeyB2YWx1ZTogMSB9LFxuXHRcdFx0XHR0b3RhbFNpemU6IHsgdmFsdWU6IDIgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubGluZWRhc2hlZF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5saW5lZGFzaGVkX2ZyYWdcblxuXHR9LFxuXG5cdGRlcHRoOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwXG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5kZXB0aF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5kZXB0aF9mcmFnXG5cblx0fSxcblxuXHRub3JtYWw6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0e1xuXHRcdFx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubm9ybWFsX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm5vcm1hbF9mcmFnXG5cblx0fSxcblxuXHQvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vXHRDdWJlIG1hcCBzaGFkZXJcblx0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHRjdWJlOiB7XG5cblx0XHR1bmlmb3Jtczoge1xuXHRcdFx0dEN1YmU6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRcdHRGbGlwOiB7IHZhbHVlOiAtIDEgfSxcblx0XHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9XG5cdFx0fSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuY3ViZV92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5jdWJlX2ZyYWdcblxuXHR9LFxuXG5cdGVxdWlyZWN0OiB7XG5cblx0XHR1bmlmb3Jtczoge1xuXHRcdFx0dEVxdWlyZWN0OiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0fSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuZXF1aXJlY3RfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuZXF1aXJlY3RfZnJhZ1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VSR0JBOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0e1xuXHRcdFx0XHRyZWZlcmVuY2VQb3NpdGlvbjogeyB2YWx1ZTogbmV3IFZlY3RvcjMoKSB9LFxuXHRcdFx0XHRuZWFyRGlzdGFuY2U6IHsgdmFsdWU6IDEgfSxcblx0XHRcdFx0ZmFyRGlzdGFuY2U6IHsgdmFsdWU6IDEwMDAgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuZGlzdGFuY2VSR0JBX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmRpc3RhbmNlUkdCQV9mcmFnXG5cblx0fSxcblxuXHRzaGFkb3c6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodHMsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2csXG5cdFx0XHR7XG5cdFx0XHRcdGNvbG9yOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MDAwMDAgKSB9LFxuXHRcdFx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfVxuXHRcdFx0fSxcblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLnNoYWRvd192ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5zaGFkb3dfZnJhZ1xuXG5cdH1cblxufTtcblxuU2hhZGVyTGliLnBoeXNpY2FsID0ge1xuXG5cdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0U2hhZGVyTGliLnN0YW5kYXJkLnVuaWZvcm1zLFxuXHRcdHtcblx0XHRcdGNsZWFyQ29hdDogeyB2YWx1ZTogMCB9LFxuXHRcdFx0Y2xlYXJDb2F0Um91Z2huZXNzOiB7IHZhbHVlOiAwIH1cblx0XHR9XG5cdF0gKSxcblxuXHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF92ZXJ0LFxuXHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX2ZyYWdcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMQXR0cmlidXRlcyggZ2wgKSB7XG5cblx0dmFyIGJ1ZmZlcnMgPSBuZXcgV2Vha01hcCgpO1xuXG5cdGZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciggYXR0cmlidXRlLCBidWZmZXJUeXBlICkge1xuXG5cdFx0dmFyIGFycmF5ID0gYXR0cmlidXRlLmFycmF5O1xuXHRcdHZhciB1c2FnZSA9IGF0dHJpYnV0ZS5keW5hbWljID8gZ2wuRFlOQU1JQ19EUkFXIDogZ2wuU1RBVElDX0RSQVc7XG5cblx0XHR2YXIgYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBidWZmZXJUeXBlLCBidWZmZXIgKTtcblx0XHRnbC5idWZmZXJEYXRhKCBidWZmZXJUeXBlLCBhcnJheSwgdXNhZ2UgKTtcblxuXHRcdGF0dHJpYnV0ZS5vblVwbG9hZENhbGxiYWNrKCk7XG5cblx0XHR2YXIgdHlwZSA9IGdsLkZMT0FUO1xuXG5cdFx0aWYgKCBhcnJheSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IGdsLkZMT0FUO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXkgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMQXR0cmlidXRlczogVW5zdXBwb3J0ZWQgZGF0YSBidWZmZXIgZm9ybWF0OiBGbG9hdDY0QXJyYXkuJyApO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBVaW50MTZBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IGdsLlVOU0lHTkVEX1NIT1JUO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQxNkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuU0hPUlQ7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuVU5TSUdORURfSU5UO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQzMkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuSU5UO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQ4QXJyYXkgKSB7XG5cblx0XHRcdHR5cGUgPSBnbC5CWVRFO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBVaW50OEFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuVU5TSUdORURfQllURTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRidWZmZXI6IGJ1ZmZlcixcblx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRieXRlc1BlckVsZW1lbnQ6IGFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULFxuXHRcdFx0dmVyc2lvbjogYXR0cmlidXRlLnZlcnNpb25cblx0XHR9O1xuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGVCdWZmZXIoIGJ1ZmZlciwgYXR0cmlidXRlLCBidWZmZXJUeXBlICkge1xuXG5cdFx0dmFyIGFycmF5ID0gYXR0cmlidXRlLmFycmF5O1xuXHRcdHZhciB1cGRhdGVSYW5nZSA9IGF0dHJpYnV0ZS51cGRhdGVSYW5nZTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGJ1ZmZlclR5cGUsIGJ1ZmZlciApO1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUuZHluYW1pYyA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGdsLmJ1ZmZlckRhdGEoIGJ1ZmZlclR5cGUsIGFycmF5LCBnbC5TVEFUSUNfRFJBVyApO1xuXG5cdFx0fSBlbHNlIGlmICggdXBkYXRlUmFuZ2UuY291bnQgPT09IC0gMSApIHtcblxuXHRcdFx0Ly8gTm90IHVzaW5nIHVwZGF0ZSByYW5nZXNcblxuXHRcdFx0Z2wuYnVmZmVyU3ViRGF0YSggYnVmZmVyVHlwZSwgMCwgYXJyYXkgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHVwZGF0ZVJhbmdlLmNvdW50ID09PSAwICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xPYmplY3RzLnVwZGF0ZUJ1ZmZlcjogZHluYW1pYyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUgbWFya2VkIGFzIG5lZWRzVXBkYXRlIGJ1dCB1cGRhdGVSYW5nZS5jb3VudCBpcyAwLCBlbnN1cmUgeW91IGFyZSB1c2luZyBzZXQgbWV0aG9kcyBvciB1cGRhdGluZyBtYW51YWxseS4nICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRnbC5idWZmZXJTdWJEYXRhKCBidWZmZXJUeXBlLCB1cGRhdGVSYW5nZS5vZmZzZXQgKiBhcnJheS5CWVRFU19QRVJfRUxFTUVOVCxcblx0XHRcdFx0YXJyYXkuc3ViYXJyYXkoIHVwZGF0ZVJhbmdlLm9mZnNldCwgdXBkYXRlUmFuZ2Uub2Zmc2V0ICsgdXBkYXRlUmFuZ2UuY291bnQgKSApO1xuXG5cdFx0XHR1cGRhdGVSYW5nZS5jb3VudCA9IC0gMTsgLy8gcmVzZXQgcmFuZ2VcblxuXHRcdH1cblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBnZXQoIGF0dHJpYnV0ZSApIHtcblxuXHRcdGlmICggYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuZGF0YTtcblxuXHRcdHJldHVybiBidWZmZXJzLmdldCggYXR0cmlidXRlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbW92ZSggYXR0cmlidXRlICkge1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5kYXRhO1xuXG5cdFx0dmFyIGRhdGEgPSBidWZmZXJzLmdldCggYXR0cmlidXRlICk7XG5cblx0XHRpZiAoIGRhdGEgKSB7XG5cblx0XHRcdGdsLmRlbGV0ZUJ1ZmZlciggZGF0YS5idWZmZXIgKTtcblxuXHRcdFx0YnVmZmVycy5kZWxldGUoIGF0dHJpYnV0ZSApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGUoIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApIHtcblxuXHRcdGlmICggYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuZGF0YTtcblxuXHRcdHZhciBkYXRhID0gYnVmZmVycy5nZXQoIGF0dHJpYnV0ZSApO1xuXG5cdFx0aWYgKCBkYXRhID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGJ1ZmZlcnMuc2V0KCBhdHRyaWJ1dGUsIGNyZWF0ZUJ1ZmZlciggYXR0cmlidXRlLCBidWZmZXJUeXBlICkgKTtcblxuXHRcdH0gZWxzZSBpZiAoIGRhdGEudmVyc2lvbiA8IGF0dHJpYnV0ZS52ZXJzaW9uICkge1xuXG5cdFx0XHR1cGRhdGVCdWZmZXIoIGRhdGEuYnVmZmVyLCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKTtcblxuXHRcdFx0ZGF0YS52ZXJzaW9uID0gYXR0cmlidXRlLnZlcnNpb247XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRnZXQ6IGdldCxcblx0XHRyZW1vdmU6IHJlbW92ZSxcblx0XHR1cGRhdGU6IHVwZGF0ZVxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuZnVuY3Rpb24gRXVsZXIoIHgsIHksIHosIG9yZGVyICkge1xuXG5cdHRoaXMuX3ggPSB4IHx8IDA7XG5cdHRoaXMuX3kgPSB5IHx8IDA7XG5cdHRoaXMuX3ogPSB6IHx8IDA7XG5cdHRoaXMuX29yZGVyID0gb3JkZXIgfHwgRXVsZXIuRGVmYXVsdE9yZGVyO1xuXG59XG5cbkV1bGVyLlJvdGF0aW9uT3JkZXJzID0gWyAnWFlaJywgJ1laWCcsICdaWFknLCAnWFpZJywgJ1lYWicsICdaWVgnIF07XG5cbkV1bGVyLkRlZmF1bHRPcmRlciA9ICdYWVonO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggRXVsZXIucHJvdG90eXBlLCB7XG5cblx0eDoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLl94O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy5feCA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR5OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3k7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl95ID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHo6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fejtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3ogPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0b3JkZXI6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fb3JkZXI7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl9vcmRlciA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEV1bGVyLnByb3RvdHlwZSwge1xuXG5cdGlzRXVsZXI6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHksIHosIG9yZGVyICkge1xuXG5cdFx0dGhpcy5feCA9IHg7XG5cdFx0dGhpcy5feSA9IHk7XG5cdFx0dGhpcy5feiA9IHo7XG5cdFx0dGhpcy5fb3JkZXIgPSBvcmRlciB8fCB0aGlzLl9vcmRlcjtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLl94LCB0aGlzLl95LCB0aGlzLl96LCB0aGlzLl9vcmRlciApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBldWxlciApIHtcblxuXHRcdHRoaXMuX3ggPSBldWxlci5feDtcblx0XHR0aGlzLl95ID0gZXVsZXIuX3k7XG5cdFx0dGhpcy5feiA9IGV1bGVyLl96O1xuXHRcdHRoaXMuX29yZGVyID0gZXVsZXIuX29yZGVyO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Sb3RhdGlvbk1hdHJpeDogZnVuY3Rpb24gKCBtLCBvcmRlciwgdXBkYXRlICkge1xuXG5cdFx0dmFyIGNsYW1wID0gX01hdGguY2xhbXA7XG5cblx0XHQvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2YgbSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKVxuXG5cdFx0dmFyIHRlID0gbS5lbGVtZW50cztcblx0XHR2YXIgbTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVbIDggXTtcblx0XHR2YXIgbTIxID0gdGVbIDEgXSwgbTIyID0gdGVbIDUgXSwgbTIzID0gdGVbIDkgXTtcblx0XHR2YXIgbTMxID0gdGVbIDIgXSwgbTMyID0gdGVbIDYgXSwgbTMzID0gdGVbIDEwIF07XG5cblx0XHRvcmRlciA9IG9yZGVyIHx8IHRoaXMuX29yZGVyO1xuXG5cdFx0aWYgKCBvcmRlciA9PT0gJ1hZWicgKSB7XG5cblx0XHRcdHRoaXMuX3kgPSBNYXRoLmFzaW4oIGNsYW1wKCBtMTMsIC0gMSwgMSApICk7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIG0xMyApIDwgMC45OTk5OSApIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggLSBtMjMsIG0zMyApO1xuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggLSBtMTIsIG0xMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCBtMzIsIG0yMiApO1xuXHRcdFx0XHR0aGlzLl96ID0gMDtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdZWFonICkge1xuXG5cdFx0XHR0aGlzLl94ID0gTWF0aC5hc2luKCAtIGNsYW1wKCBtMjMsIC0gMSwgMSApICk7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIG0yMyApIDwgMC45OTk5OSApIHtcblxuXHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggbTEzLCBtMzMgKTtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIG0yMSwgbTIyICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIC0gbTMxLCBtMTEgKTtcblx0XHRcdFx0dGhpcy5feiA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWlhZJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IE1hdGguYXNpbiggY2xhbXAoIG0zMiwgLSAxLCAxICkgKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbTMyICkgPCAwLjk5OTk5ICkge1xuXG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCAtIG0zMSwgbTMzICk7XG5cdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCAtIG0xMiwgbTIyICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feSA9IDA7XG5cdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCBtMjEsIG0xMSApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1pZWCcgKSB7XG5cblx0XHRcdHRoaXMuX3kgPSBNYXRoLmFzaW4oIC0gY2xhbXAoIG0zMSwgLSAxLCAxICkgKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbTMxICkgPCAwLjk5OTk5ICkge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCBtMzIsIG0zMyApO1xuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggbTIxLCBtMTEgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gMDtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIC0gbTEyLCBtMjIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdZWlgnICkge1xuXG5cdFx0XHR0aGlzLl96ID0gTWF0aC5hc2luKCBjbGFtcCggbTIxLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBtMjEgKSA8IDAuOTk5OTkgKSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIC0gbTIzLCBtMjIgKTtcblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIC0gbTMxLCBtMTEgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gMDtcblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIG0xMywgbTMzICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWFpZJyApIHtcblxuXHRcdFx0dGhpcy5feiA9IE1hdGguYXNpbiggLSBjbGFtcCggbTEyLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBtMTIgKSA8IDAuOTk5OTkgKSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIG0zMiwgbTIyICk7XG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCBtMTMsIG0xMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCAtIG0yMywgbTMzICk7XG5cdFx0XHRcdHRoaXMuX3kgPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5FdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGdpdmVuIHVuc3VwcG9ydGVkIG9yZGVyOiAnICsgb3JkZXIgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuX29yZGVyID0gb3JkZXI7XG5cblx0XHRpZiAoIHVwZGF0ZSAhPT0gZmFsc2UgKSB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldEZyb21RdWF0ZXJuaW9uKCBxLCBvcmRlciwgdXBkYXRlICkge1xuXG5cdFx0XHRtYXRyaXgubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oIHEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtYXRyaXgsIG9yZGVyLCB1cGRhdGUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHNldEZyb21WZWN0b3IzOiBmdW5jdGlvbiAoIHYsIG9yZGVyICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0KCB2LngsIHYueSwgdi56LCBvcmRlciB8fCB0aGlzLl9vcmRlciApO1xuXG5cdH0sXG5cblx0cmVvcmRlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gV0FSTklORzogdGhpcyBkaXNjYXJkcyByZXZvbHV0aW9uIGluZm9ybWF0aW9uIC1iaG91c3RvblxuXG5cdFx0dmFyIHEgPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJlb3JkZXIoIG5ld09yZGVyICkge1xuXG5cdFx0XHRxLnNldEZyb21FdWxlciggdGhpcyApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tUXVhdGVybmlvbiggcSwgbmV3T3JkZXIgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBldWxlciApIHtcblxuXHRcdHJldHVybiAoIGV1bGVyLl94ID09PSB0aGlzLl94ICkgJiYgKCBldWxlci5feSA9PT0gdGhpcy5feSApICYmICggZXVsZXIuX3ogPT09IHRoaXMuX3ogKSAmJiAoIGV1bGVyLl9vcmRlciA9PT0gdGhpcy5fb3JkZXIgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdHRoaXMuX3ggPSBhcnJheVsgMCBdO1xuXHRcdHRoaXMuX3kgPSBhcnJheVsgMSBdO1xuXHRcdHRoaXMuX3ogPSBhcnJheVsgMiBdO1xuXHRcdGlmICggYXJyYXlbIDMgXSAhPT0gdW5kZWZpbmVkICkgdGhpcy5fb3JkZXIgPSBhcnJheVsgMyBdO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLl94O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLl95O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLl96O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLl9vcmRlcjtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdHRvVmVjdG9yMzogZnVuY3Rpb24gKCBvcHRpb25hbFJlc3VsdCApIHtcblxuXHRcdGlmICggb3B0aW9uYWxSZXN1bHQgKSB7XG5cblx0XHRcdHJldHVybiBvcHRpb25hbFJlc3VsdC5zZXQoIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3ogKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJldHVybiBuZXcgVmVjdG9yMyggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0b25DaGFuZ2U6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0b25DaGFuZ2VDYWxsYmFjazogZnVuY3Rpb24gKCkge31cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gTGF5ZXJzKCkge1xuXG5cdHRoaXMubWFzayA9IDEgfCAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIExheWVycy5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggY2hhbm5lbCApIHtcblxuXHRcdHRoaXMubWFzayA9IDEgPDwgY2hhbm5lbCB8IDA7XG5cblx0fSxcblxuXHRlbmFibGU6IGZ1bmN0aW9uICggY2hhbm5lbCApIHtcblxuXHRcdHRoaXMubWFzayB8PSAxIDw8IGNoYW5uZWwgfCAwO1xuXG5cdH0sXG5cblx0dG9nZ2xlOiBmdW5jdGlvbiAoIGNoYW5uZWwgKSB7XG5cblx0XHR0aGlzLm1hc2sgXj0gMSA8PCBjaGFubmVsIHwgMDtcblxuXHR9LFxuXG5cdGRpc2FibGU6IGZ1bmN0aW9uICggY2hhbm5lbCApIHtcblxuXHRcdHRoaXMubWFzayAmPSB+ICggMSA8PCBjaGFubmVsIHwgMCApO1xuXG5cdH0sXG5cblx0dGVzdDogZnVuY3Rpb24gKCBsYXllcnMgKSB7XG5cblx0XHRyZXR1cm4gKCB0aGlzLm1hc2sgJiBsYXllcnMubWFzayApICE9PSAwO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciBlbGVwaGFudGF0d29yayAvIHd3dy5lbGVwaGFudGF0d29yay5jaFxuICovXG5cbnZhciBvYmplY3QzRElkID0gMDtcblxuZnVuY3Rpb24gT2JqZWN0M0QoKSB7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBvYmplY3QzRElkICsrIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLm5hbWUgPSAnJztcblx0dGhpcy50eXBlID0gJ09iamVjdDNEJztcblxuXHR0aGlzLnBhcmVudCA9IG51bGw7XG5cdHRoaXMuY2hpbGRyZW4gPSBbXTtcblxuXHR0aGlzLnVwID0gT2JqZWN0M0QuRGVmYXVsdFVwLmNsb25lKCk7XG5cblx0dmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHJvdGF0aW9uID0gbmV3IEV1bGVyKCk7XG5cdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblx0dmFyIHNjYWxlID0gbmV3IFZlY3RvcjMoIDEsIDEsIDEgKTtcblxuXHRmdW5jdGlvbiBvblJvdGF0aW9uQ2hhbmdlKCkge1xuXG5cdFx0cXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoIHJvdGF0aW9uLCBmYWxzZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBvblF1YXRlcm5pb25DaGFuZ2UoKSB7XG5cblx0XHRyb3RhdGlvbi5zZXRGcm9tUXVhdGVybmlvbiggcXVhdGVybmlvbiwgdW5kZWZpbmVkLCBmYWxzZSApO1xuXG5cdH1cblxuXHRyb3RhdGlvbi5vbkNoYW5nZSggb25Sb3RhdGlvbkNoYW5nZSApO1xuXHRxdWF0ZXJuaW9uLm9uQ2hhbmdlKCBvblF1YXRlcm5pb25DaGFuZ2UgKTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyggdGhpcywge1xuXHRcdHBvc2l0aW9uOiB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IHBvc2l0aW9uXG5cdFx0fSxcblx0XHRyb3RhdGlvbjoge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdHZhbHVlOiByb3RhdGlvblxuXHRcdH0sXG5cdFx0cXVhdGVybmlvbjoge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdHZhbHVlOiBxdWF0ZXJuaW9uXG5cdFx0fSxcblx0XHRzY2FsZToge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdHZhbHVlOiBzY2FsZVxuXHRcdH0sXG5cdFx0bW9kZWxWaWV3TWF0cml4OiB7XG5cdFx0XHR2YWx1ZTogbmV3IE1hdHJpeDQoKVxuXHRcdH0sXG5cdFx0bm9ybWFsTWF0cml4OiB7XG5cdFx0XHR2YWx1ZTogbmV3IE1hdHJpeDMoKVxuXHRcdH1cblx0fSApO1xuXG5cdHRoaXMubWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0dGhpcy5tYXRyaXhXb3JsZCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gT2JqZWN0M0QuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGU7XG5cdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMubGF5ZXJzID0gbmV3IExheWVycygpO1xuXHR0aGlzLnZpc2libGUgPSB0cnVlO1xuXG5cdHRoaXMuY2FzdFNoYWRvdyA9IGZhbHNlO1xuXHR0aGlzLnJlY2VpdmVTaGFkb3cgPSBmYWxzZTtcblxuXHR0aGlzLmZydXN0dW1DdWxsZWQgPSB0cnVlO1xuXHR0aGlzLnJlbmRlck9yZGVyID0gMDtcblxuXHR0aGlzLnVzZXJEYXRhID0ge307XG5cbn1cblxuT2JqZWN0M0QuRGVmYXVsdFVwID0gbmV3IFZlY3RvcjMoIDAsIDEsIDAgKTtcbk9iamVjdDNELkRlZmF1bHRNYXRyaXhBdXRvVXBkYXRlID0gdHJ1ZTtcblxuT2JqZWN0M0QucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IE9iamVjdDNELFxuXG5cdGlzT2JqZWN0M0Q6IHRydWUsXG5cblx0b25CZWZvcmVSZW5kZXI6IGZ1bmN0aW9uICgpIHt9LFxuXHRvbkFmdGVyUmVuZGVyOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRhcHBseU1hdHJpeDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR0aGlzLm1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXgsIHRoaXMubWF0cml4ICk7XG5cblx0XHR0aGlzLm1hdHJpeC5kZWNvbXBvc2UoIHRoaXMucG9zaXRpb24sIHRoaXMucXVhdGVybmlvbiwgdGhpcy5zY2FsZSApO1xuXG5cdH0sXG5cblx0YXBwbHlRdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHR0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoIHEgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlOiBmdW5jdGlvbiAoIGF4aXMsIGFuZ2xlICkge1xuXG5cdFx0Ly8gYXNzdW1lcyBheGlzIGlzIG5vcm1hbGl6ZWRcblxuXHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tRXVsZXI6IGZ1bmN0aW9uICggZXVsZXIgKSB7XG5cblx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKCBldWxlciwgdHJ1ZSApO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHQvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2YgbSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKVxuXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggbSApO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0Ly8gYXNzdW1lcyBxIGlzIG5vcm1hbGl6ZWRcblxuXHRcdHRoaXMucXVhdGVybmlvbi5jb3B5KCBxICk7XG5cblx0fSxcblxuXHRyb3RhdGVPbkF4aXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBvYmplY3Qgb24gYXhpcyBpbiBvYmplY3Qgc3BhY2Vcblx0XHQvLyBheGlzIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXG5cdFx0dmFyIHExID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVPbkF4aXMoIGF4aXMsIGFuZ2xlICkge1xuXG5cdFx0XHRxMS5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24ubXVsdGlwbHkoIHExICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlT25Xb3JsZEF4aXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBvYmplY3Qgb24gYXhpcyBpbiB3b3JsZCBzcGFjZVxuXHRcdC8vIGF4aXMgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXG5cdFx0Ly8gbWV0aG9kIGFzc3VtZXMgbm8gcm90YXRlZCBwYXJlbnRcblxuXHRcdHZhciBxMSA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlT25Xb3JsZEF4aXMoIGF4aXMsIGFuZ2xlICkge1xuXG5cdFx0XHRxMS5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoIHExICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlWDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoIDEsIDAsIDAgKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVYKCBhbmdsZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKCB2MSwgYW5nbGUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCAwLCAxLCAwICk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWSggYW5nbGUgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyggdjEsIGFuZ2xlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyb3RhdGVaOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMyggMCwgMCwgMSApO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVooIGFuZ2xlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoIHYxLCBhbmdsZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlT25BeGlzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyB0cmFuc2xhdGUgb2JqZWN0IGJ5IGRpc3RhbmNlIGFsb25nIGF4aXMgaW4gb2JqZWN0IHNwYWNlXG5cdFx0Ly8gYXhpcyBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlT25BeGlzKCBheGlzLCBkaXN0YW5jZSApIHtcblxuXHRcdFx0djEuY29weSggYXhpcyApLmFwcGx5UXVhdGVybmlvbiggdGhpcy5xdWF0ZXJuaW9uICk7XG5cblx0XHRcdHRoaXMucG9zaXRpb24uYWRkKCB2MS5tdWx0aXBseVNjYWxhciggZGlzdGFuY2UgKSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZVg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCAxLCAwLCAwICk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlWCggZGlzdGFuY2UgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggdjEsIGRpc3RhbmNlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0cmFuc2xhdGVZOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMyggMCwgMSwgMCApO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZVkoIGRpc3RhbmNlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIHYxLCBkaXN0YW5jZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlWjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoIDAsIDAsIDEgKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB0cmFuc2xhdGVaKCBkaXN0YW5jZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCB2MSwgZGlzdGFuY2UgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGxvY2FsVG9Xb3JsZDogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdH0sXG5cblx0d29ybGRUb0xvY2FsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHdvcmxkVG9Mb2NhbCggdmVjdG9yICkge1xuXG5cdFx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggbTEuZ2V0SW52ZXJzZSggdGhpcy5tYXRyaXhXb3JsZCApICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRsb29rQXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIFRoaXMgbWV0aG9kIGRvZXMgbm90IHN1cHBvcnQgb2JqZWN0cyB3aXRoIHJvdGF0ZWQgYW5kL29yIHRyYW5zbGF0ZWQgcGFyZW50KHMpXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXHRcdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGxvb2tBdCggeCwgeSwgeiApIHtcblxuXHRcdFx0aWYgKCB4LmlzVmVjdG9yMyApIHtcblxuXHRcdFx0XHR2ZWN0b3IuY29weSggeCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZlY3Rvci5zZXQoIHgsIHksIHogKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHRoaXMuaXNDYW1lcmEgKSB7XG5cblx0XHRcdFx0bTEubG9va0F0KCB0aGlzLnBvc2l0aW9uLCB2ZWN0b3IsIHRoaXMudXAgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRtMS5sb29rQXQoIHZlY3RvciwgdGhpcy5wb3NpdGlvbiwgdGhpcy51cCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoIG0xICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRhZGQ6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHR0aGlzLmFkZCggYXJndW1lbnRzWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0ID09PSB0aGlzICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCBcIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IGNhbid0IGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgaXRzZWxmLlwiLCBvYmplY3QgKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCAoIG9iamVjdCAmJiBvYmplY3QuaXNPYmplY3QzRCApICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5wYXJlbnQgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0b2JqZWN0LnBhcmVudC5yZW1vdmUoIG9iamVjdCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdG9iamVjdC5wYXJlbnQgPSB0aGlzO1xuXHRcdFx0b2JqZWN0LmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2FkZGVkJyB9ICk7XG5cblx0XHRcdHRoaXMuY2hpbGRyZW4ucHVzaCggb2JqZWN0ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCBcIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5PYmplY3QzRC5cIiwgb2JqZWN0ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJlbW92ZTogZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHRoaXMucmVtb3ZlKCBhcmd1bWVudHNbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGluZGV4ID0gdGhpcy5jaGlsZHJlbi5pbmRleE9mKCBvYmplY3QgKTtcblxuXHRcdGlmICggaW5kZXggIT09IC0gMSApIHtcblxuXHRcdFx0b2JqZWN0LnBhcmVudCA9IG51bGw7XG5cblx0XHRcdG9iamVjdC5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdyZW1vdmVkJyB9ICk7XG5cblx0XHRcdHRoaXMuY2hpbGRyZW4uc3BsaWNlKCBpbmRleCwgMSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRPYmplY3RCeUlkOiBmdW5jdGlvbiAoIGlkICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggJ2lkJywgaWQgKTtcblxuXHR9LFxuXG5cdGdldE9iamVjdEJ5TmFtZTogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggJ25hbWUnLCBuYW1lICk7XG5cblx0fSxcblxuXHRnZXRPYmplY3RCeVByb3BlcnR5OiBmdW5jdGlvbiAoIG5hbWUsIHZhbHVlICkge1xuXG5cdFx0aWYgKCB0aGlzWyBuYW1lIF0gPT09IHZhbHVlICkgcmV0dXJuIHRoaXM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5bIGkgXTtcblx0XHRcdHZhciBvYmplY3QgPSBjaGlsZC5nZXRPYmplY3RCeVByb3BlcnR5KCBuYW1lLCB2YWx1ZSApO1xuXG5cdFx0XHRpZiAoIG9iamVjdCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBvYmplY3Q7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0fSxcblxuXHRnZXRXb3JsZFBvc2l0aW9uOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRQb3NpdGlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0cmV0dXJuIHRhcmdldC5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHR9LFxuXG5cdGdldFdvcmxkUXVhdGVybmlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgc2NhbGUgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldFdvcmxkUXVhdGVybmlvbiggdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRRdWF0ZXJuaW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRcdHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBwb3NpdGlvbiwgdGFyZ2V0LCBzY2FsZSApO1xuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Z2V0V29ybGRTY2FsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2V0V29ybGRTY2FsZSggdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRTY2FsZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0XHR0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggcG9zaXRpb24sIHF1YXRlcm5pb24sIHRhcmdldCApO1xuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Z2V0V29ybGREaXJlY3Rpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRXb3JsZERpcmVjdGlvbiggdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGREaXJlY3Rpb24oKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZ2V0V29ybGRRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7XG5cblx0XHRcdHJldHVybiB0YXJnZXQuc2V0KCAwLCAwLCAxICkuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyYXljYXN0OiBmdW5jdGlvbiAoKSB7fSxcblxuXHR0cmF2ZXJzZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdGNhbGxiYWNrKCB0aGlzICk7XG5cblx0XHR2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y2hpbGRyZW5bIGkgXS50cmF2ZXJzZSggY2FsbGJhY2sgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHRyYXZlcnNlVmlzaWJsZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdGlmICggdGhpcy52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdGNhbGxiYWNrKCB0aGlzICk7XG5cblx0XHR2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y2hpbGRyZW5bIGkgXS50cmF2ZXJzZVZpc2libGUoIGNhbGxiYWNrICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR0cmF2ZXJzZUFuY2VzdG9yczogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcblxuXHRcdGlmICggcGFyZW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRjYWxsYmFjayggcGFyZW50ICk7XG5cblx0XHRcdHBhcmVudC50cmF2ZXJzZUFuY2VzdG9ycyggY2FsbGJhY2sgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5tYXRyaXguY29tcG9zZSggdGhpcy5wb3NpdGlvbiwgdGhpcy5xdWF0ZXJuaW9uLCB0aGlzLnNjYWxlICk7XG5cblx0XHR0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdH0sXG5cblx0dXBkYXRlTWF0cml4V29ybGQ6IGZ1bmN0aW9uICggZm9yY2UgKSB7XG5cblx0XHRpZiAoIHRoaXMubWF0cml4QXV0b1VwZGF0ZSApIHRoaXMudXBkYXRlTWF0cml4KCk7XG5cblx0XHRpZiAoIHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSB8fCBmb3JjZSApIHtcblxuXHRcdFx0aWYgKCB0aGlzLnBhcmVudCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHR0aGlzLm1hdHJpeFdvcmxkLmNvcHkoIHRoaXMubWF0cml4ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCwgdGhpcy5tYXRyaXggKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSBmYWxzZTtcblxuXHRcdFx0Zm9yY2UgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXBkYXRlIGNoaWxkcmVuXG5cblx0XHR2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y2hpbGRyZW5bIGkgXS51cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0Ly8gbWV0YSBpcyBhIHN0cmluZyB3aGVuIGNhbGxlZCBmcm9tIEpTT04uc3RyaW5naWZ5XG5cdFx0dmFyIGlzUm9vdE9iamVjdCA9ICggbWV0YSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXRhID09PSAnc3RyaW5nJyApO1xuXG5cdFx0dmFyIG91dHB1dCA9IHt9O1xuXG5cdFx0Ly8gbWV0YSBpcyBhIGhhc2ggdXNlZCB0byBjb2xsZWN0IGdlb21ldHJpZXMsIG1hdGVyaWFscy5cblx0XHQvLyBub3QgcHJvdmlkaW5nIGl0IGltcGxpZXMgdGhhdCB0aGlzIGlzIHRoZSByb290IG9iamVjdFxuXHRcdC8vIGJlaW5nIHNlcmlhbGl6ZWQuXG5cdFx0aWYgKCBpc1Jvb3RPYmplY3QgKSB7XG5cblx0XHRcdC8vIGluaXRpYWxpemUgbWV0YSBvYmpcblx0XHRcdG1ldGEgPSB7XG5cdFx0XHRcdGdlb21ldHJpZXM6IHt9LFxuXHRcdFx0XHRtYXRlcmlhbHM6IHt9LFxuXHRcdFx0XHR0ZXh0dXJlczoge30sXG5cdFx0XHRcdGltYWdlczoge30sXG5cdFx0XHRcdHNoYXBlczoge31cblx0XHRcdH07XG5cblx0XHRcdG91dHB1dC5tZXRhZGF0YSA9IHtcblx0XHRcdFx0dmVyc2lvbjogNC41LFxuXHRcdFx0XHR0eXBlOiAnT2JqZWN0Jyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnT2JqZWN0M0QudG9KU09OJ1xuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdC8vIHN0YW5kYXJkIE9iamVjdDNEIHNlcmlhbGl6YXRpb25cblxuXHRcdHZhciBvYmplY3QgPSB7fTtcblxuXHRcdG9iamVjdC51dWlkID0gdGhpcy51dWlkO1xuXHRcdG9iamVjdC50eXBlID0gdGhpcy50eXBlO1xuXG5cdFx0aWYgKCB0aGlzLm5hbWUgIT09ICcnICkgb2JqZWN0Lm5hbWUgPSB0aGlzLm5hbWU7XG5cdFx0aWYgKCB0aGlzLmNhc3RTaGFkb3cgPT09IHRydWUgKSBvYmplY3QuY2FzdFNoYWRvdyA9IHRydWU7XG5cdFx0aWYgKCB0aGlzLnJlY2VpdmVTaGFkb3cgPT09IHRydWUgKSBvYmplY3QucmVjZWl2ZVNoYWRvdyA9IHRydWU7XG5cdFx0aWYgKCB0aGlzLnZpc2libGUgPT09IGZhbHNlICkgb2JqZWN0LnZpc2libGUgPSBmYWxzZTtcblx0XHRpZiAoIHRoaXMuZnJ1c3R1bUN1bGxlZCA9PT0gZmFsc2UgKSBvYmplY3QuZnJ1c3R1bUN1bGxlZCA9IGZhbHNlO1xuXHRcdGlmICggdGhpcy5yZW5kZXJPcmRlciAhPT0gMCApIG9iamVjdC5yZW5kZXJPcmRlciA9IHRoaXMucmVuZGVyT3JkZXI7XG5cdFx0aWYgKCBKU09OLnN0cmluZ2lmeSggdGhpcy51c2VyRGF0YSApICE9PSAne30nICkgb2JqZWN0LnVzZXJEYXRhID0gdGhpcy51c2VyRGF0YTtcblxuXHRcdG9iamVjdC5tYXRyaXggPSB0aGlzLm1hdHJpeC50b0FycmF5KCk7XG5cblx0XHRpZiAoIHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9PT0gZmFsc2UgKSBvYmplY3QubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0Ly9cblxuXHRcdGZ1bmN0aW9uIHNlcmlhbGl6ZSggbGlicmFyeSwgZWxlbWVudCApIHtcblxuXHRcdFx0aWYgKCBsaWJyYXJ5WyBlbGVtZW50LnV1aWQgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGxpYnJhcnlbIGVsZW1lbnQudXVpZCBdID0gZWxlbWVudC50b0pTT04oIG1ldGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbWVudC51dWlkO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmdlb21ldHJ5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG9iamVjdC5nZW9tZXRyeSA9IHNlcmlhbGl6ZSggbWV0YS5nZW9tZXRyaWVzLCB0aGlzLmdlb21ldHJ5ICk7XG5cblx0XHRcdHZhciBwYXJhbWV0ZXJzID0gdGhpcy5nZW9tZXRyeS5wYXJhbWV0ZXJzO1xuXG5cdFx0XHRpZiAoIHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCAmJiBwYXJhbWV0ZXJzLnNoYXBlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHZhciBzaGFwZXMgPSBwYXJhbWV0ZXJzLnNoYXBlcztcblxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHNoYXBlcyApICkge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc2hhcGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBzaGFwZSA9IHNoYXBlc1sgaSBdO1xuXG5cdFx0XHRcdFx0XHRzZXJpYWxpemUoIG1ldGEuc2hhcGVzLCBzaGFwZSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRzZXJpYWxpemUoIG1ldGEuc2hhcGVzLCBzaGFwZXMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5tYXRlcmlhbCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHRoaXMubWF0ZXJpYWwgKSApIHtcblxuXHRcdFx0XHR2YXIgdXVpZHMgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLm1hdGVyaWFsLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR1dWlkcy5wdXNoKCBzZXJpYWxpemUoIG1ldGEubWF0ZXJpYWxzLCB0aGlzLm1hdGVyaWFsWyBpIF0gKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRvYmplY3QubWF0ZXJpYWwgPSB1dWlkcztcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRvYmplY3QubWF0ZXJpYWwgPSBzZXJpYWxpemUoIG1ldGEubWF0ZXJpYWxzLCB0aGlzLm1hdGVyaWFsICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHRpZiAoIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0b2JqZWN0LmNoaWxkcmVuID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdG9iamVjdC5jaGlsZHJlbi5wdXNoKCB0aGlzLmNoaWxkcmVuWyBpIF0udG9KU09OKCBtZXRhICkub2JqZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggaXNSb290T2JqZWN0ICkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cmllcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuZ2VvbWV0cmllcyApO1xuXHRcdFx0dmFyIG1hdGVyaWFscyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEubWF0ZXJpYWxzICk7XG5cdFx0XHR2YXIgdGV4dHVyZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnRleHR1cmVzICk7XG5cdFx0XHR2YXIgaW1hZ2VzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5pbWFnZXMgKTtcblx0XHRcdHZhciBzaGFwZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnNoYXBlcyApO1xuXG5cdFx0XHRpZiAoIGdlb21ldHJpZXMubGVuZ3RoID4gMCApIG91dHB1dC5nZW9tZXRyaWVzID0gZ2VvbWV0cmllcztcblx0XHRcdGlmICggbWF0ZXJpYWxzLmxlbmd0aCA+IDAgKSBvdXRwdXQubWF0ZXJpYWxzID0gbWF0ZXJpYWxzO1xuXHRcdFx0aWYgKCB0ZXh0dXJlcy5sZW5ndGggPiAwICkgb3V0cHV0LnRleHR1cmVzID0gdGV4dHVyZXM7XG5cdFx0XHRpZiAoIGltYWdlcy5sZW5ndGggPiAwICkgb3V0cHV0LmltYWdlcyA9IGltYWdlcztcblx0XHRcdGlmICggc2hhcGVzLmxlbmd0aCA+IDAgKSBvdXRwdXQuc2hhcGVzID0gc2hhcGVzO1xuXG5cdFx0fVxuXG5cdFx0b3V0cHV0Lm9iamVjdCA9IG9iamVjdDtcblxuXHRcdHJldHVybiBvdXRwdXQ7XG5cblx0XHQvLyBleHRyYWN0IGRhdGEgZnJvbSB0aGUgY2FjaGUgaGFzaFxuXHRcdC8vIHJlbW92ZSBtZXRhZGF0YSBvbiBlYWNoIGl0ZW1cblx0XHQvLyBhbmQgcmV0dXJuIGFzIGFycmF5XG5cdFx0ZnVuY3Rpb24gZXh0cmFjdEZyb21DYWNoZSggY2FjaGUgKSB7XG5cblx0XHRcdHZhciB2YWx1ZXMgPSBbXTtcblx0XHRcdGZvciAoIHZhciBrZXkgaW4gY2FjaGUgKSB7XG5cblx0XHRcdFx0dmFyIGRhdGEgPSBjYWNoZVsga2V5IF07XG5cdFx0XHRcdGRlbGV0ZSBkYXRhLm1ldGFkYXRhO1xuXHRcdFx0XHR2YWx1ZXMucHVzaCggZGF0YSApO1xuXG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdmFsdWVzO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICggcmVjdXJzaXZlICkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcywgcmVjdXJzaXZlICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0aWYgKCByZWN1cnNpdmUgPT09IHVuZGVmaW5lZCApIHJlY3Vyc2l2ZSA9IHRydWU7XG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblxuXHRcdHRoaXMudXAuY29weSggc291cmNlLnVwICk7XG5cblx0XHR0aGlzLnBvc2l0aW9uLmNvcHkoIHNvdXJjZS5wb3NpdGlvbiApO1xuXHRcdHRoaXMucXVhdGVybmlvbi5jb3B5KCBzb3VyY2UucXVhdGVybmlvbiApO1xuXHRcdHRoaXMuc2NhbGUuY29weSggc291cmNlLnNjYWxlICk7XG5cblx0XHR0aGlzLm1hdHJpeC5jb3B5KCBzb3VyY2UubWF0cml4ICk7XG5cdFx0dGhpcy5tYXRyaXhXb3JsZC5jb3B5KCBzb3VyY2UubWF0cml4V29ybGQgKTtcblxuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhBdXRvVXBkYXRlO1xuXHRcdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlO1xuXG5cdFx0dGhpcy5sYXllcnMubWFzayA9IHNvdXJjZS5sYXllcnMubWFzaztcblx0XHR0aGlzLnZpc2libGUgPSBzb3VyY2UudmlzaWJsZTtcblxuXHRcdHRoaXMuY2FzdFNoYWRvdyA9IHNvdXJjZS5jYXN0U2hhZG93O1xuXHRcdHRoaXMucmVjZWl2ZVNoYWRvdyA9IHNvdXJjZS5yZWNlaXZlU2hhZG93O1xuXG5cdFx0dGhpcy5mcnVzdHVtQ3VsbGVkID0gc291cmNlLmZydXN0dW1DdWxsZWQ7XG5cdFx0dGhpcy5yZW5kZXJPcmRlciA9IHNvdXJjZS5yZW5kZXJPcmRlcjtcblxuXHRcdHRoaXMudXNlckRhdGEgPSBKU09OLnBhcnNlKCBKU09OLnN0cmluZ2lmeSggc291cmNlLnVzZXJEYXRhICkgKTtcblxuXHRcdGlmICggcmVjdXJzaXZlID09PSB0cnVlICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBzb3VyY2UuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBjaGlsZCA9IHNvdXJjZS5jaGlsZHJlblsgaSBdO1xuXHRcdFx0XHR0aGlzLmFkZCggY2hpbGQuY2xvbmUoKSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuKi9cblxuZnVuY3Rpb24gQ2FtZXJhKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ2FtZXJhJztcblxuXHR0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7XG5cdHRoaXMucHJvamVjdGlvbk1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cbn1cblxuQ2FtZXJhLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IENhbWVyYSxcblxuXHRpc0NhbWVyYTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlLCByZWN1cnNpdmUgKTtcblxuXHRcdHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoIHNvdXJjZS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXguY29weSggc291cmNlLnByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0V29ybGREaXJlY3Rpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRXb3JsZERpcmVjdGlvbiggdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkNhbWVyYTogLmdldFdvcmxkRGlyZWN0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmdldFdvcmxkUXVhdGVybmlvbiggcXVhdGVybmlvbiApO1xuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LnNldCggMCwgMCwgLSAxICkuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR1cGRhdGVNYXRyaXhXb3JsZDogZnVuY3Rpb24gKCBmb3JjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3JjZSApO1xuXG5cdFx0dGhpcy5tYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBhcm9zZSAvIGh0dHA6Ly9naXRodWIuY29tL2Fyb3NlXG4gKi9cblxuZnVuY3Rpb24gT3J0aG9ncmFwaGljQ2FtZXJhKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIHtcblxuXHRDYW1lcmEuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdPcnRob2dyYXBoaWNDYW1lcmEnO1xuXG5cdHRoaXMuem9vbSA9IDE7XG5cdHRoaXMudmlldyA9IG51bGw7XG5cblx0dGhpcy5sZWZ0ID0gbGVmdDtcblx0dGhpcy5yaWdodCA9IHJpZ2h0O1xuXHR0aGlzLnRvcCA9IHRvcDtcblx0dGhpcy5ib3R0b20gPSBib3R0b207XG5cblx0dGhpcy5uZWFyID0gKCBuZWFyICE9PSB1bmRlZmluZWQgKSA/IG5lYXIgOiAwLjE7XG5cdHRoaXMuZmFyID0gKCBmYXIgIT09IHVuZGVmaW5lZCApID8gZmFyIDogMjAwMDtcblxuXHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxufVxuXG5PcnRob2dyYXBoaWNDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQ2FtZXJhLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IE9ydGhvZ3JhcGhpY0NhbWVyYSxcblxuXHRpc09ydGhvZ3JhcGhpY0NhbWVyYTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0Q2FtZXJhLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSwgcmVjdXJzaXZlICk7XG5cblx0XHR0aGlzLmxlZnQgPSBzb3VyY2UubGVmdDtcblx0XHR0aGlzLnJpZ2h0ID0gc291cmNlLnJpZ2h0O1xuXHRcdHRoaXMudG9wID0gc291cmNlLnRvcDtcblx0XHR0aGlzLmJvdHRvbSA9IHNvdXJjZS5ib3R0b207XG5cdFx0dGhpcy5uZWFyID0gc291cmNlLm5lYXI7XG5cdFx0dGhpcy5mYXIgPSBzb3VyY2UuZmFyO1xuXG5cdFx0dGhpcy56b29tID0gc291cmNlLnpvb207XG5cdFx0dGhpcy52aWV3ID0gc291cmNlLnZpZXcgPT09IG51bGwgPyBudWxsIDogT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS52aWV3ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFZpZXdPZmZzZXQ6IGZ1bmN0aW9uICggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMudmlldyA9IHtcblx0XHRcdFx0ZW5hYmxlZDogdHJ1ZSxcblx0XHRcdFx0ZnVsbFdpZHRoOiAxLFxuXHRcdFx0XHRmdWxsSGVpZ2h0OiAxLFxuXHRcdFx0XHRvZmZzZXRYOiAwLFxuXHRcdFx0XHRvZmZzZXRZOiAwLFxuXHRcdFx0XHR3aWR0aDogMSxcblx0XHRcdFx0aGVpZ2h0OiAxXG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy52aWV3LmVuYWJsZWQgPSB0cnVlO1xuXHRcdHRoaXMudmlldy5mdWxsV2lkdGggPSBmdWxsV2lkdGg7XG5cdFx0dGhpcy52aWV3LmZ1bGxIZWlnaHQgPSBmdWxsSGVpZ2h0O1xuXHRcdHRoaXMudmlldy5vZmZzZXRYID0geDtcblx0XHR0aGlzLnZpZXcub2Zmc2V0WSA9IHk7XG5cdFx0dGhpcy52aWV3LndpZHRoID0gd2lkdGg7XG5cdFx0dGhpcy52aWV3LmhlaWdodCA9IGhlaWdodDtcblxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdH0sXG5cblx0Y2xlYXJWaWV3T2Zmc2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy52aWV3LmVuYWJsZWQgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdH0sXG5cblx0dXBkYXRlUHJvamVjdGlvbk1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGR4ID0gKCB0aGlzLnJpZ2h0IC0gdGhpcy5sZWZ0ICkgLyAoIDIgKiB0aGlzLnpvb20gKTtcblx0XHR2YXIgZHkgPSAoIHRoaXMudG9wIC0gdGhpcy5ib3R0b20gKSAvICggMiAqIHRoaXMuem9vbSApO1xuXHRcdHZhciBjeCA9ICggdGhpcy5yaWdodCArIHRoaXMubGVmdCApIC8gMjtcblx0XHR2YXIgY3kgPSAoIHRoaXMudG9wICsgdGhpcy5ib3R0b20gKSAvIDI7XG5cblx0XHR2YXIgbGVmdCA9IGN4IC0gZHg7XG5cdFx0dmFyIHJpZ2h0ID0gY3ggKyBkeDtcblx0XHR2YXIgdG9wID0gY3kgKyBkeTtcblx0XHR2YXIgYm90dG9tID0gY3kgLSBkeTtcblxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICYmIHRoaXMudmlldy5lbmFibGVkICkge1xuXG5cdFx0XHR2YXIgem9vbVcgPSB0aGlzLnpvb20gLyAoIHRoaXMudmlldy53aWR0aCAvIHRoaXMudmlldy5mdWxsV2lkdGggKTtcblx0XHRcdHZhciB6b29tSCA9IHRoaXMuem9vbSAvICggdGhpcy52aWV3LmhlaWdodCAvIHRoaXMudmlldy5mdWxsSGVpZ2h0ICk7XG5cdFx0XHR2YXIgc2NhbGVXID0gKCB0aGlzLnJpZ2h0IC0gdGhpcy5sZWZ0ICkgLyB0aGlzLnZpZXcud2lkdGg7XG5cdFx0XHR2YXIgc2NhbGVIID0gKCB0aGlzLnRvcCAtIHRoaXMuYm90dG9tICkgLyB0aGlzLnZpZXcuaGVpZ2h0O1xuXG5cdFx0XHRsZWZ0ICs9IHNjYWxlVyAqICggdGhpcy52aWV3Lm9mZnNldFggLyB6b29tVyApO1xuXHRcdFx0cmlnaHQgPSBsZWZ0ICsgc2NhbGVXICogKCB0aGlzLnZpZXcud2lkdGggLyB6b29tVyApO1xuXHRcdFx0dG9wIC09IHNjYWxlSCAqICggdGhpcy52aWV3Lm9mZnNldFkgLyB6b29tSCApO1xuXHRcdFx0Ym90dG9tID0gdG9wIC0gc2NhbGVIICogKCB0aGlzLnZpZXcuaGVpZ2h0IC8gem9vbUggKTtcblxuXHRcdH1cblxuXHRcdHRoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlT3J0aG9ncmFwaGljKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIHRoaXMubmVhciwgdGhpcy5mYXIgKTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGRhdGEub2JqZWN0Lnpvb20gPSB0aGlzLnpvb207XG5cdFx0ZGF0YS5vYmplY3QubGVmdCA9IHRoaXMubGVmdDtcblx0XHRkYXRhLm9iamVjdC5yaWdodCA9IHRoaXMucmlnaHQ7XG5cdFx0ZGF0YS5vYmplY3QudG9wID0gdGhpcy50b3A7XG5cdFx0ZGF0YS5vYmplY3QuYm90dG9tID0gdGhpcy5ib3R0b207XG5cdFx0ZGF0YS5vYmplY3QubmVhciA9IHRoaXMubmVhcjtcblx0XHRkYXRhLm9iamVjdC5mYXIgPSB0aGlzLmZhcjtcblxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICkgZGF0YS5vYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24oIHt9LCB0aGlzLnZpZXcgKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEZhY2UzKCBhLCBiLCBjLCBub3JtYWwsIGNvbG9yLCBtYXRlcmlhbEluZGV4ICkge1xuXG5cdHRoaXMuYSA9IGE7XG5cdHRoaXMuYiA9IGI7XG5cdHRoaXMuYyA9IGM7XG5cblx0dGhpcy5ub3JtYWwgPSAoIG5vcm1hbCAmJiBub3JtYWwuaXNWZWN0b3IzICkgPyBub3JtYWwgOiBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLnZlcnRleE5vcm1hbHMgPSBBcnJheS5pc0FycmF5KCBub3JtYWwgKSA/IG5vcm1hbCA6IFtdO1xuXG5cdHRoaXMuY29sb3IgPSAoIGNvbG9yICYmIGNvbG9yLmlzQ29sb3IgKSA/IGNvbG9yIDogbmV3IENvbG9yKCk7XG5cdHRoaXMudmVydGV4Q29sb3JzID0gQXJyYXkuaXNBcnJheSggY29sb3IgKSA/IGNvbG9yIDogW107XG5cblx0dGhpcy5tYXRlcmlhbEluZGV4ID0gbWF0ZXJpYWxJbmRleCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWxJbmRleCA6IDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRmFjZTMucHJvdG90eXBlLCB7XG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5hID0gc291cmNlLmE7XG5cdFx0dGhpcy5iID0gc291cmNlLmI7XG5cdFx0dGhpcy5jID0gc291cmNlLmM7XG5cblx0XHR0aGlzLm5vcm1hbC5jb3B5KCBzb3VyY2Uubm9ybWFsICk7XG5cdFx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHRcdHRoaXMubWF0ZXJpYWxJbmRleCA9IHNvdXJjZS5tYXRlcmlhbEluZGV4O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHNvdXJjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnZlcnRleE5vcm1hbHNbIGkgXSA9IHNvdXJjZS52ZXJ0ZXhOb3JtYWxzWyBpIF0uY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBzb3VyY2UudmVydGV4Q29sb3JzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnZlcnRleENvbG9yc1sgaSBdID0gc291cmNlLnZlcnRleENvbG9yc1sgaSBdLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBraWxlIC8gaHR0cDovL2tpbGUuc3RyYXZhZ2FuemEub3JnL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxudmFyIGdlb21ldHJ5SWQgPSAwOyAvLyBHZW9tZXRyeSB1c2VzIGV2ZW4gbnVtYmVycyBhcyBJZFxuXG5mdW5jdGlvbiBHZW9tZXRyeSgpIHtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IGdlb21ldHJ5SWQgKz0gMiB9ICk7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cdHRoaXMudHlwZSA9ICdHZW9tZXRyeSc7XG5cblx0dGhpcy52ZXJ0aWNlcyA9IFtdO1xuXHR0aGlzLmNvbG9ycyA9IFtdO1xuXHR0aGlzLmZhY2VzID0gW107XG5cdHRoaXMuZmFjZVZlcnRleFV2cyA9IFtbXV07XG5cblx0dGhpcy5tb3JwaFRhcmdldHMgPSBbXTtcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBbXTtcblxuXHR0aGlzLnNraW5XZWlnaHRzID0gW107XG5cdHRoaXMuc2tpbkluZGljZXMgPSBbXTtcblxuXHR0aGlzLmxpbmVEaXN0YW5jZXMgPSBbXTtcblxuXHR0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDtcblx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XG5cblx0Ly8gdXBkYXRlIGZsYWdzXG5cblx0dGhpcy5lbGVtZW50c05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy51dnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5jb2xvcnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMubGluZURpc3RhbmNlc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5ncm91cHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cbn1cblxuR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEdlb21ldHJ5LFxuXG5cdGlzR2VvbWV0cnk6IHRydWUsXG5cblx0YXBwbHlNYXRyaXg6IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdFx0dmFyIG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCkuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVydGV4ID0gdGhpcy52ZXJ0aWNlc1sgaSBdO1xuXHRcdFx0dmVydGV4LmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSB0aGlzLmZhY2VzWyBpIF07XG5cdFx0XHRmYWNlLm5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdGZhY2UudmVydGV4Tm9ybWFsc1sgaiBdLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gdHJ1ZTtcblx0XHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gdHJ1ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm90YXRlWDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB4LWF4aXNcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWCggYW5nbGUgKSB7XG5cblx0XHRcdG0xLm1ha2VSb3RhdGlvblgoIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlWTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB5LWF4aXNcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWSggYW5nbGUgKSB7XG5cblx0XHRcdG0xLm1ha2VSb3RhdGlvblkoIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlWjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB6LWF4aXNcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWiggYW5nbGUgKSB7XG5cblx0XHRcdG0xLm1ha2VSb3RhdGlvblooIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyB0cmFuc2xhdGUgZ2VvbWV0cnlcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlKCB4LCB5LCB6ICkge1xuXG5cdFx0XHRtMS5tYWtlVHJhbnNsYXRpb24oIHgsIHksIHogKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRzY2FsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gc2NhbGUgZ2VvbWV0cnlcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2NhbGUoIHgsIHksIHogKSB7XG5cblx0XHRcdG0xLm1ha2VTY2FsZSggeCwgeSwgeiApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGxvb2tBdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9iaiA9IG5ldyBPYmplY3QzRCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGxvb2tBdCggdmVjdG9yICkge1xuXG5cdFx0XHRvYmoubG9va0F0KCB2ZWN0b3IgKTtcblxuXHRcdFx0b2JqLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBvYmoubWF0cml4ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRmcm9tQnVmZmVyR2VvbWV0cnk6IGZ1bmN0aW9uICggZ2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGluZGljZXMgPSBnZW9tZXRyeS5pbmRleCAhPT0gbnVsbCA/IGdlb21ldHJ5LmluZGV4LmFycmF5IDogdW5kZWZpbmVkO1xuXHRcdHZhciBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblxuXHRcdHZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXHRcdHZhciBub3JtYWxzID0gYXR0cmlidXRlcy5ub3JtYWwgIT09IHVuZGVmaW5lZCA/IGF0dHJpYnV0ZXMubm9ybWFsLmFycmF5IDogdW5kZWZpbmVkO1xuXHRcdHZhciBjb2xvcnMgPSBhdHRyaWJ1dGVzLmNvbG9yICE9PSB1bmRlZmluZWQgPyBhdHRyaWJ1dGVzLmNvbG9yLmFycmF5IDogdW5kZWZpbmVkO1xuXHRcdHZhciB1dnMgPSBhdHRyaWJ1dGVzLnV2ICE9PSB1bmRlZmluZWQgPyBhdHRyaWJ1dGVzLnV2LmFycmF5IDogdW5kZWZpbmVkO1xuXHRcdHZhciB1dnMyID0gYXR0cmlidXRlcy51djIgIT09IHVuZGVmaW5lZCA/IGF0dHJpYnV0ZXMudXYyLmFycmF5IDogdW5kZWZpbmVkO1xuXG5cdFx0aWYgKCB1dnMyICE9PSB1bmRlZmluZWQgKSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDEgXSA9IFtdO1xuXG5cdFx0dmFyIHRlbXBOb3JtYWxzID0gW107XG5cdFx0dmFyIHRlbXBVVnMgPSBbXTtcblx0XHR2YXIgdGVtcFVWczIgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaiA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpICs9IDMsIGogKz0gMiApIHtcblxuXHRcdFx0c2NvcGUudmVydGljZXMucHVzaCggbmV3IFZlY3RvcjMoIHBvc2l0aW9uc1sgaSBdLCBwb3NpdGlvbnNbIGkgKyAxIF0sIHBvc2l0aW9uc1sgaSArIDIgXSApICk7XG5cblx0XHRcdGlmICggbm9ybWFscyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRlbXBOb3JtYWxzLnB1c2goIG5ldyBWZWN0b3IzKCBub3JtYWxzWyBpIF0sIG5vcm1hbHNbIGkgKyAxIF0sIG5vcm1hbHNbIGkgKyAyIF0gKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggY29sb3JzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0c2NvcGUuY29sb3JzLnB1c2goIG5ldyBDb2xvciggY29sb3JzWyBpIF0sIGNvbG9yc1sgaSArIDEgXSwgY29sb3JzWyBpICsgMiBdICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHV2cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRlbXBVVnMucHVzaCggbmV3IFZlY3RvcjIoIHV2c1sgaiBdLCB1dnNbIGogKyAxIF0gKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdXZzMiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRlbXBVVnMyLnB1c2goIG5ldyBWZWN0b3IyKCB1dnMyWyBqIF0sIHV2czJbIGogKyAxIF0gKSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBhZGRGYWNlKCBhLCBiLCBjLCBtYXRlcmlhbEluZGV4ICkge1xuXG5cdFx0XHR2YXIgdmVydGV4Tm9ybWFscyA9IG5vcm1hbHMgIT09IHVuZGVmaW5lZCA/IFsgdGVtcE5vcm1hbHNbIGEgXS5jbG9uZSgpLCB0ZW1wTm9ybWFsc1sgYiBdLmNsb25lKCksIHRlbXBOb3JtYWxzWyBjIF0uY2xvbmUoKSBdIDogW107XG5cdFx0XHR2YXIgdmVydGV4Q29sb3JzID0gY29sb3JzICE9PSB1bmRlZmluZWQgPyBbIHNjb3BlLmNvbG9yc1sgYSBdLmNsb25lKCksIHNjb3BlLmNvbG9yc1sgYiBdLmNsb25lKCksIHNjb3BlLmNvbG9yc1sgYyBdLmNsb25lKCkgXSA6IFtdO1xuXG5cdFx0XHR2YXIgZmFjZSA9IG5ldyBGYWNlMyggYSwgYiwgYywgdmVydGV4Tm9ybWFscywgdmVydGV4Q29sb3JzLCBtYXRlcmlhbEluZGV4ICk7XG5cblx0XHRcdHNjb3BlLmZhY2VzLnB1c2goIGZhY2UgKTtcblxuXHRcdFx0aWYgKCB1dnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzY29wZS5mYWNlVmVydGV4VXZzWyAwIF0ucHVzaCggWyB0ZW1wVVZzWyBhIF0uY2xvbmUoKSwgdGVtcFVWc1sgYiBdLmNsb25lKCksIHRlbXBVVnNbIGMgXS5jbG9uZSgpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHV2czIgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzY29wZS5mYWNlVmVydGV4VXZzWyAxIF0ucHVzaCggWyB0ZW1wVVZzMlsgYSBdLmNsb25lKCksIHRlbXBVVnMyWyBiIF0uY2xvbmUoKSwgdGVtcFVWczJbIGMgXS5jbG9uZSgpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcblxuXHRcdGlmICggZ3JvdXBzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cblx0XHRcdFx0dmFyIHN0YXJ0ID0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRcdHZhciBjb3VudCA9IGdyb3VwLmNvdW50O1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gc3RhcnQsIGpsID0gc3RhcnQgKyBjb3VudDsgaiA8IGpsOyBqICs9IDMgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGluZGljZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0YWRkRmFjZSggaW5kaWNlc1sgaiBdLCBpbmRpY2VzWyBqICsgMSBdLCBpbmRpY2VzWyBqICsgMiBdLCBncm91cC5tYXRlcmlhbEluZGV4ICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRhZGRGYWNlKCBqLCBqICsgMSwgaiArIDIsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGlmICggaW5kaWNlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0XHRhZGRGYWNlKCBpbmRpY2VzWyBpIF0sIGluZGljZXNbIGkgKyAxIF0sIGluZGljZXNbIGkgKyAyIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aCAvIDM7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdGFkZEZhY2UoIGksIGkgKyAxLCBpICsgMiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBnZW9tZXRyeS5ib3VuZGluZ0JveC5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNlbnRlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9mZnNldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2VudGVyKCkge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlciggb2Zmc2V0ICkubmVnYXRlKCk7XG5cblx0XHRcdHRoaXMudHJhbnNsYXRlKCBvZmZzZXQueCwgb2Zmc2V0LnksIG9mZnNldC56ICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0bm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0dmFyIGNlbnRlciA9IHRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyO1xuXHRcdHZhciByYWRpdXMgPSB0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cztcblxuXHRcdHZhciBzID0gcmFkaXVzID09PSAwID8gMSA6IDEuMCAvIHJhZGl1cztcblxuXHRcdHZhciBtYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHRcdG1hdHJpeC5zZXQoXG5cdFx0XHRzLCAwLCAwLCAtIHMgKiBjZW50ZXIueCxcblx0XHRcdDAsIHMsIDAsIC0gcyAqIGNlbnRlci55LFxuXHRcdFx0MCwgMCwgcywgLSBzICogY2VudGVyLnosXG5cdFx0XHQwLCAwLCAwLCAxXG5cdFx0KTtcblxuXHRcdHRoaXMuYXBwbHlNYXRyaXgoIG1hdHJpeCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb21wdXRlRmFjZU5vcm1hbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBjYiA9IG5ldyBWZWN0b3IzKCksIGFiID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdGZvciAoIHZhciBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0dmFyIHZBID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5hIF07XG5cdFx0XHR2YXIgdkIgPSB0aGlzLnZlcnRpY2VzWyBmYWNlLmIgXTtcblx0XHRcdHZhciB2QyA9IHRoaXMudmVydGljZXNbIGZhY2UuYyBdO1xuXG5cdFx0XHRjYi5zdWJWZWN0b3JzKCB2QywgdkIgKTtcblx0XHRcdGFiLnN1YlZlY3RvcnMoIHZBLCB2QiApO1xuXHRcdFx0Y2IuY3Jvc3MoIGFiICk7XG5cblx0XHRcdGNiLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRmYWNlLm5vcm1hbC5jb3B5KCBjYiApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y29tcHV0ZVZlcnRleE5vcm1hbHM6IGZ1bmN0aW9uICggYXJlYVdlaWdodGVkICkge1xuXG5cdFx0aWYgKCBhcmVhV2VpZ2h0ZWQgPT09IHVuZGVmaW5lZCApIGFyZWFXZWlnaHRlZCA9IHRydWU7XG5cblx0XHR2YXIgdiwgdmwsIGYsIGZsLCBmYWNlLCB2ZXJ0aWNlcztcblxuXHRcdHZlcnRpY2VzID0gbmV3IEFycmF5KCB0aGlzLnZlcnRpY2VzLmxlbmd0aCApO1xuXG5cdFx0Zm9yICggdiA9IDAsIHZsID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IHYgPCB2bDsgdiArKyApIHtcblxuXHRcdFx0dmVydGljZXNbIHYgXSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGFyZWFXZWlnaHRlZCApIHtcblxuXHRcdFx0Ly8gdmVydGV4IG5vcm1hbHMgd2VpZ2h0ZWQgYnkgdHJpYW5nbGUgYXJlYXNcblx0XHRcdC8vIGh0dHA6Ly93d3cuaXF1aWxlemxlcy5vcmcvd3d3L2FydGljbGVzL25vcm1hbHMvbm9ybWFscy5odG1cblxuXHRcdFx0dmFyIHZBLCB2QiwgdkM7XG5cdFx0XHR2YXIgY2IgPSBuZXcgVmVjdG9yMygpLCBhYiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0XHR2QSA9IHRoaXMudmVydGljZXNbIGZhY2UuYSBdO1xuXHRcdFx0XHR2QiA9IHRoaXMudmVydGljZXNbIGZhY2UuYiBdO1xuXHRcdFx0XHR2QyA9IHRoaXMudmVydGljZXNbIGZhY2UuYyBdO1xuXG5cdFx0XHRcdGNiLnN1YlZlY3RvcnMoIHZDLCB2QiApO1xuXHRcdFx0XHRhYi5zdWJWZWN0b3JzKCB2QSwgdkIgKTtcblx0XHRcdFx0Y2IuY3Jvc3MoIGFiICk7XG5cblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYSBdLmFkZCggY2IgKTtcblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYiBdLmFkZCggY2IgKTtcblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYyBdLmFkZCggY2IgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblxuXHRcdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHRcdHZlcnRpY2VzWyBmYWNlLmEgXS5hZGQoIGZhY2Uubm9ybWFsICk7XG5cdFx0XHRcdHZlcnRpY2VzWyBmYWNlLmIgXS5hZGQoIGZhY2Uubm9ybWFsICk7XG5cdFx0XHRcdHZlcnRpY2VzWyBmYWNlLmMgXS5hZGQoIGZhY2Uubm9ybWFsICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZvciAoIHYgPSAwLCB2bCA9IHRoaXMudmVydGljZXMubGVuZ3RoOyB2IDwgdmw7IHYgKysgKSB7XG5cblx0XHRcdHZlcnRpY2VzWyB2IF0ubm9ybWFsaXplKCk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHR2YXIgdmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFscztcblxuXHRcdFx0aWYgKCB2ZXJ0ZXhOb3JtYWxzLmxlbmd0aCA9PT0gMyApIHtcblxuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAwIF0uY29weSggdmVydGljZXNbIGZhY2UuYSBdICk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDEgXS5jb3B5KCB2ZXJ0aWNlc1sgZmFjZS5iIF0gKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMiBdLmNvcHkoIHZlcnRpY2VzWyBmYWNlLmMgXSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDAgXSA9IHZlcnRpY2VzWyBmYWNlLmEgXS5jbG9uZSgpO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAxIF0gPSB2ZXJ0aWNlc1sgZmFjZS5iIF0uY2xvbmUoKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMiBdID0gdmVydGljZXNbIGZhY2UuYyBdLmNsb25lKCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5mYWNlcy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNvbXB1dGVGbGF0VmVydGV4Tm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGYsIGZsLCBmYWNlO1xuXG5cdFx0dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblxuXHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdHZhciB2ZXJ0ZXhOb3JtYWxzID0gZmFjZS52ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRpZiAoIHZlcnRleE5vcm1hbHMubGVuZ3RoID09PSAzICkge1xuXG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDAgXS5jb3B5KCBmYWNlLm5vcm1hbCApO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAxIF0uY29weSggZmFjZS5ub3JtYWwgKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMiBdLmNvcHkoIGZhY2Uubm9ybWFsICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMCBdID0gZmFjZS5ub3JtYWwuY2xvbmUoKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMSBdID0gZmFjZS5ub3JtYWwuY2xvbmUoKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMiBdID0gZmFjZS5ub3JtYWwuY2xvbmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmZhY2VzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y29tcHV0ZU1vcnBoTm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGksIGlsLCBmLCBmbCwgZmFjZTtcblxuXHRcdC8vIHNhdmUgb3JpZ2luYWwgbm9ybWFsc1xuXHRcdC8vIC0gY3JlYXRlIHRlbXAgdmFyaWFibGVzIG9uIGZpcnN0IGFjY2Vzc1xuXHRcdC8vICAgb3RoZXJ3aXNlIGp1c3QgY29weSAoZm9yIGZhc3RlciByZXBlYXRlZCBjYWxscylcblxuXHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdGlmICggISBmYWNlLl9fb3JpZ2luYWxGYWNlTm9ybWFsICkge1xuXG5cdFx0XHRcdGZhY2UuX19vcmlnaW5hbEZhY2VOb3JtYWwgPSBmYWNlLm5vcm1hbC5jbG9uZSgpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZhY2UuX19vcmlnaW5hbEZhY2VOb3JtYWwuY29weSggZmFjZS5ub3JtYWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoICEgZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFscyApIGZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHMgPSBbXTtcblxuXHRcdFx0Zm9yICggaSA9IDAsIGlsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdGlmICggISBmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzWyBpIF0gKSB7XG5cblx0XHRcdFx0XHRmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzWyBpIF0gPSBmYWNlLnZlcnRleE5vcm1hbHNbIGkgXS5jbG9uZSgpO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzWyBpIF0uY29weSggZmFjZS52ZXJ0ZXhOb3JtYWxzWyBpIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIHVzZSB0ZW1wIGdlb21ldHJ5IHRvIGNvbXB1dGUgZmFjZSBhbmQgdmVydGV4IG5vcm1hbHMgZm9yIGVhY2ggbW9ycGhcblxuXHRcdHZhciB0bXBHZW8gPSBuZXcgR2VvbWV0cnkoKTtcblx0XHR0bXBHZW8uZmFjZXMgPSB0aGlzLmZhY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy5tb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdC8vIGNyZWF0ZSBvbiBmaXJzdCBhY2Nlc3NcblxuXHRcdFx0aWYgKCAhIHRoaXMubW9ycGhOb3JtYWxzWyBpIF0gKSB7XG5cblx0XHRcdFx0dGhpcy5tb3JwaE5vcm1hbHNbIGkgXSA9IHt9O1xuXHRcdFx0XHR0aGlzLm1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3JtYWxzID0gW107XG5cdFx0XHRcdHRoaXMubW9ycGhOb3JtYWxzWyBpIF0udmVydGV4Tm9ybWFscyA9IFtdO1xuXG5cdFx0XHRcdHZhciBkc3ROb3JtYWxzRmFjZSA9IHRoaXMubW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHM7XG5cdFx0XHRcdHZhciBkc3ROb3JtYWxzVmVydGV4ID0gdGhpcy5tb3JwaE5vcm1hbHNbIGkgXS52ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRcdHZhciBmYWNlTm9ybWFsLCB2ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdFx0XHRmYWNlTm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzID0geyBhOiBuZXcgVmVjdG9yMygpLCBiOiBuZXcgVmVjdG9yMygpLCBjOiBuZXcgVmVjdG9yMygpIH07XG5cblx0XHRcdFx0XHRkc3ROb3JtYWxzRmFjZS5wdXNoKCBmYWNlTm9ybWFsICk7XG5cdFx0XHRcdFx0ZHN0Tm9ybWFsc1ZlcnRleC5wdXNoKCB2ZXJ0ZXhOb3JtYWxzICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBtb3JwaE5vcm1hbHMgPSB0aGlzLm1vcnBoTm9ybWFsc1sgaSBdO1xuXG5cdFx0XHQvLyBzZXQgdmVydGljZXMgdG8gbW9ycGggdGFyZ2V0XG5cblx0XHRcdHRtcEdlby52ZXJ0aWNlcyA9IHRoaXMubW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXM7XG5cblx0XHRcdC8vIGNvbXB1dGUgbW9ycGggbm9ybWFsc1xuXG5cdFx0XHR0bXBHZW8uY29tcHV0ZUZhY2VOb3JtYWxzKCk7XG5cdFx0XHR0bXBHZW8uY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcblxuXHRcdFx0Ly8gc3RvcmUgbW9ycGggbm9ybWFsc1xuXG5cdFx0XHR2YXIgZmFjZU5vcm1hbCwgdmVydGV4Tm9ybWFscztcblxuXHRcdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHRcdGZhY2VOb3JtYWwgPSBtb3JwaE5vcm1hbHMuZmFjZU5vcm1hbHNbIGYgXTtcblx0XHRcdFx0dmVydGV4Tm9ybWFscyA9IG1vcnBoTm9ybWFscy52ZXJ0ZXhOb3JtYWxzWyBmIF07XG5cblx0XHRcdFx0ZmFjZU5vcm1hbC5jb3B5KCBmYWNlLm5vcm1hbCApO1xuXG5cdFx0XHRcdHZlcnRleE5vcm1hbHMuYS5jb3B5KCBmYWNlLnZlcnRleE5vcm1hbHNbIDAgXSApO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzLmIuY29weSggZmFjZS52ZXJ0ZXhOb3JtYWxzWyAxIF0gKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFscy5jLmNvcHkoIGZhY2UudmVydGV4Tm9ybWFsc1sgMiBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIHJlc3RvcmUgb3JpZ2luYWwgbm9ybWFsc1xuXG5cdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0ZmFjZS5ub3JtYWwgPSBmYWNlLl9fb3JpZ2luYWxGYWNlTm9ybWFsO1xuXHRcdFx0ZmFjZS52ZXJ0ZXhOb3JtYWxzID0gZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFscztcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNvbXB1dGVCb3VuZGluZ0JveDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ID09PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJveDMoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuYm91bmRpbmdCb3guc2V0RnJvbVBvaW50cyggdGhpcy52ZXJ0aWNlcyApO1xuXG5cdH0sXG5cblx0Y29tcHV0ZUJvdW5kaW5nU3BoZXJlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlLnNldEZyb21Qb2ludHMoIHRoaXMudmVydGljZXMgKTtcblxuXHR9LFxuXG5cdG1lcmdlOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCBtYXRyaXgsIG1hdGVyaWFsSW5kZXhPZmZzZXQgKSB7XG5cblx0XHRpZiAoICEgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0dlb21ldHJ5ICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5HZW9tZXRyeS5tZXJnZSgpOiBnZW9tZXRyeSBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuR2VvbWV0cnkuJywgZ2VvbWV0cnkgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBub3JtYWxNYXRyaXgsXG5cdFx0XHR2ZXJ0ZXhPZmZzZXQgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aCxcblx0XHRcdHZlcnRpY2VzMSA9IHRoaXMudmVydGljZXMsXG5cdFx0XHR2ZXJ0aWNlczIgPSBnZW9tZXRyeS52ZXJ0aWNlcyxcblx0XHRcdGZhY2VzMSA9IHRoaXMuZmFjZXMsXG5cdFx0XHRmYWNlczIgPSBnZW9tZXRyeS5mYWNlcyxcblx0XHRcdHV2czEgPSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDAgXSxcblx0XHRcdHV2czIgPSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyAwIF0sXG5cdFx0XHRjb2xvcnMxID0gdGhpcy5jb2xvcnMsXG5cdFx0XHRjb2xvcnMyID0gZ2VvbWV0cnkuY29sb3JzO1xuXG5cdFx0aWYgKCBtYXRlcmlhbEluZGV4T2Zmc2V0ID09PSB1bmRlZmluZWQgKSBtYXRlcmlhbEluZGV4T2Zmc2V0ID0gMDtcblxuXHRcdGlmICggbWF0cml4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCkuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTtcblxuXHRcdH1cblxuXHRcdC8vIHZlcnRpY2VzXG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdmVydGljZXMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVydGV4ID0gdmVydGljZXMyWyBpIF07XG5cblx0XHRcdHZhciB2ZXJ0ZXhDb3B5ID0gdmVydGV4LmNsb25lKCk7XG5cblx0XHRcdGlmICggbWF0cml4ICE9PSB1bmRlZmluZWQgKSB2ZXJ0ZXhDb3B5LmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHRcdHZlcnRpY2VzMS5wdXNoKCB2ZXJ0ZXhDb3B5ICk7XG5cblx0XHR9XG5cblx0XHQvLyBjb2xvcnNcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBjb2xvcnMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRjb2xvcnMxLnB1c2goIGNvbG9yczJbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBmYWNlc1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gZmFjZXMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IGZhY2VzMlsgaSBdLCBmYWNlQ29weSwgbm9ybWFsLCBjb2xvcixcblx0XHRcdFx0ZmFjZVZlcnRleE5vcm1hbHMgPSBmYWNlLnZlcnRleE5vcm1hbHMsXG5cdFx0XHRcdGZhY2VWZXJ0ZXhDb2xvcnMgPSBmYWNlLnZlcnRleENvbG9ycztcblxuXHRcdFx0ZmFjZUNvcHkgPSBuZXcgRmFjZTMoIGZhY2UuYSArIHZlcnRleE9mZnNldCwgZmFjZS5iICsgdmVydGV4T2Zmc2V0LCBmYWNlLmMgKyB2ZXJ0ZXhPZmZzZXQgKTtcblx0XHRcdGZhY2VDb3B5Lm5vcm1hbC5jb3B5KCBmYWNlLm5vcm1hbCApO1xuXG5cdFx0XHRpZiAoIG5vcm1hbE1hdHJpeCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGZhY2VDb3B5Lm5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBmYWNlVmVydGV4Tm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRub3JtYWwgPSBmYWNlVmVydGV4Tm9ybWFsc1sgaiBdLmNsb25lKCk7XG5cblx0XHRcdFx0aWYgKCBub3JtYWxNYXRyaXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdG5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmYWNlQ29weS52ZXJ0ZXhOb3JtYWxzLnB1c2goIG5vcm1hbCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZhY2VDb3B5LmNvbG9yLmNvcHkoIGZhY2UuY29sb3IgKTtcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGZhY2VWZXJ0ZXhDb2xvcnMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0Y29sb3IgPSBmYWNlVmVydGV4Q29sb3JzWyBqIF07XG5cdFx0XHRcdGZhY2VDb3B5LnZlcnRleENvbG9ycy5wdXNoKCBjb2xvci5jbG9uZSgpICk7XG5cblx0XHRcdH1cblxuXHRcdFx0ZmFjZUNvcHkubWF0ZXJpYWxJbmRleCA9IGZhY2UubWF0ZXJpYWxJbmRleCArIG1hdGVyaWFsSW5kZXhPZmZzZXQ7XG5cblx0XHRcdGZhY2VzMS5wdXNoKCBmYWNlQ29weSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXZzXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB1dnMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdXYgPSB1dnMyWyBpIF0sIHV2Q29weSA9IFtdO1xuXG5cdFx0XHRpZiAoIHV2ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IHV2Lmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdHV2Q29weS5wdXNoKCB1dlsgaiBdLmNsb25lKCkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR1dnMxLnB1c2goIHV2Q29weSApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0bWVyZ2VNZXNoOiBmdW5jdGlvbiAoIG1lc2ggKSB7XG5cblx0XHRpZiAoICEgKCBtZXNoICYmIG1lc2guaXNNZXNoICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5HZW9tZXRyeS5tZXJnZU1lc2goKTogbWVzaCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuTWVzaC4nLCBtZXNoICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIG1lc2gubWF0cml4QXV0b1VwZGF0ZSApIG1lc2gudXBkYXRlTWF0cml4KCk7XG5cblx0XHR0aGlzLm1lcmdlKCBtZXNoLmdlb21ldHJ5LCBtZXNoLm1hdHJpeCApO1xuXG5cdH0sXG5cblx0Lypcblx0ICogQ2hlY2tzIGZvciBkdXBsaWNhdGUgdmVydGljZXMgd2l0aCBoYXNobWFwLlxuXHQgKiBEdXBsaWNhdGVkIHZlcnRpY2VzIGFyZSByZW1vdmVkXG5cdCAqIGFuZCBmYWNlcycgdmVydGljZXMgYXJlIHVwZGF0ZWQuXG5cdCAqL1xuXG5cdG1lcmdlVmVydGljZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2ZXJ0aWNlc01hcCA9IHt9OyAvLyBIYXNobWFwIGZvciBsb29raW5nIHVwIHZlcnRpY2VzIGJ5IHBvc2l0aW9uIGNvb3JkaW5hdGVzIChhbmQgbWFraW5nIHN1cmUgdGhleSBhcmUgdW5pcXVlKVxuXHRcdHZhciB1bmlxdWUgPSBbXSwgY2hhbmdlcyA9IFtdO1xuXG5cdFx0dmFyIHYsIGtleTtcblx0XHR2YXIgcHJlY2lzaW9uUG9pbnRzID0gNDsgLy8gbnVtYmVyIG9mIGRlY2ltYWwgcG9pbnRzLCBlLmcuIDQgZm9yIGVwc2lsb24gb2YgMC4wMDAxXG5cdFx0dmFyIHByZWNpc2lvbiA9IE1hdGgucG93KCAxMCwgcHJlY2lzaW9uUG9pbnRzICk7XG5cdFx0dmFyIGksIGlsLCBmYWNlO1xuXHRcdHZhciBpbmRpY2VzLCBqLCBqbDtcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHRoaXMudmVydGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHYgPSB0aGlzLnZlcnRpY2VzWyBpIF07XG5cdFx0XHRrZXkgPSBNYXRoLnJvdW5kKCB2LnggKiBwcmVjaXNpb24gKSArICdfJyArIE1hdGgucm91bmQoIHYueSAqIHByZWNpc2lvbiApICsgJ18nICsgTWF0aC5yb3VuZCggdi56ICogcHJlY2lzaW9uICk7XG5cblx0XHRcdGlmICggdmVydGljZXNNYXBbIGtleSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dmVydGljZXNNYXBbIGtleSBdID0gaTtcblx0XHRcdFx0dW5pcXVlLnB1c2goIHRoaXMudmVydGljZXNbIGkgXSApO1xuXHRcdFx0XHRjaGFuZ2VzWyBpIF0gPSB1bmlxdWUubGVuZ3RoIC0gMTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvL2NvbnNvbGUubG9nKCdEdXBsaWNhdGUgdmVydGV4IGZvdW5kLiAnLCBpLCAnIGNvdWxkIGJlIHVzaW5nICcsIHZlcnRpY2VzTWFwW2tleV0pO1xuXHRcdFx0XHRjaGFuZ2VzWyBpIF0gPSBjaGFuZ2VzWyB2ZXJ0aWNlc01hcFsga2V5IF0gXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cblx0XHQvLyBpZiBmYWNlcyBhcmUgY29tcGxldGVseSBkZWdlbmVyYXRlIGFmdGVyIG1lcmdpbmcgdmVydGljZXMsIHdlXG5cdFx0Ly8gaGF2ZSB0byByZW1vdmUgdGhlbSBmcm9tIHRoZSBnZW9tZXRyeS5cblx0XHR2YXIgZmFjZUluZGljZXNUb1JlbW92ZSA9IFtdO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGkgXTtcblxuXHRcdFx0ZmFjZS5hID0gY2hhbmdlc1sgZmFjZS5hIF07XG5cdFx0XHRmYWNlLmIgPSBjaGFuZ2VzWyBmYWNlLmIgXTtcblx0XHRcdGZhY2UuYyA9IGNoYW5nZXNbIGZhY2UuYyBdO1xuXG5cdFx0XHRpbmRpY2VzID0gWyBmYWNlLmEsIGZhY2UuYiwgZmFjZS5jIF07XG5cblx0XHRcdC8vIGlmIGFueSBkdXBsaWNhdGUgdmVydGljZXMgYXJlIGZvdW5kIGluIGEgRmFjZTNcblx0XHRcdC8vIHdlIGhhdmUgdG8gcmVtb3ZlIHRoZSBmYWNlIGFzIG5vdGhpbmcgY2FuIGJlIHNhdmVkXG5cdFx0XHRmb3IgKCB2YXIgbiA9IDA7IG4gPCAzOyBuICsrICkge1xuXG5cdFx0XHRcdGlmICggaW5kaWNlc1sgbiBdID09PSBpbmRpY2VzWyAoIG4gKyAxICkgJSAzIF0gKSB7XG5cblx0XHRcdFx0XHRmYWNlSW5kaWNlc1RvUmVtb3ZlLnB1c2goIGkgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZvciAoIGkgPSBmYWNlSW5kaWNlc1RvUmVtb3ZlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtLSApIHtcblxuXHRcdFx0dmFyIGlkeCA9IGZhY2VJbmRpY2VzVG9SZW1vdmVbIGkgXTtcblxuXHRcdFx0dGhpcy5mYWNlcy5zcGxpY2UoIGlkeCwgMSApO1xuXG5cdFx0XHRmb3IgKCBqID0gMCwgamwgPSB0aGlzLmZhY2VWZXJ0ZXhVdnMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0dGhpcy5mYWNlVmVydGV4VXZzWyBqIF0uc3BsaWNlKCBpZHgsIDEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gVXNlIHVuaXF1ZSBzZXQgb2YgdmVydGljZXNcblxuXHRcdHZhciBkaWZmID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGggLSB1bmlxdWUubGVuZ3RoO1xuXHRcdHRoaXMudmVydGljZXMgPSB1bmlxdWU7XG5cdFx0cmV0dXJuIGRpZmY7XG5cblx0fSxcblxuXHRzZXRGcm9tUG9pbnRzOiBmdW5jdGlvbiAoIHBvaW50cyApIHtcblxuXHRcdHRoaXMudmVydGljZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgcG9pbnQgPSBwb2ludHNbIGkgXTtcblx0XHRcdHRoaXMudmVydGljZXMucHVzaCggbmV3IFZlY3RvcjMoIHBvaW50LngsIHBvaW50LnksIHBvaW50LnogfHwgMCApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNvcnRGYWNlc0J5TWF0ZXJpYWxJbmRleDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGZhY2VzID0gdGhpcy5mYWNlcztcblx0XHR2YXIgbGVuZ3RoID0gZmFjZXMubGVuZ3RoO1xuXG5cdFx0Ly8gdGFnIGZhY2VzXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGZhY2VzWyBpIF0uX2lkID0gaTtcblxuXHRcdH1cblxuXHRcdC8vIHNvcnQgZmFjZXNcblxuXHRcdGZ1bmN0aW9uIG1hdGVyaWFsSW5kZXhTb3J0KCBhLCBiICkge1xuXG5cdFx0XHRyZXR1cm4gYS5tYXRlcmlhbEluZGV4IC0gYi5tYXRlcmlhbEluZGV4O1xuXG5cdFx0fVxuXG5cdFx0ZmFjZXMuc29ydCggbWF0ZXJpYWxJbmRleFNvcnQgKTtcblxuXHRcdC8vIHNvcnQgdXZzXG5cblx0XHR2YXIgdXZzMSA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdO1xuXHRcdHZhciB1dnMyID0gdGhpcy5mYWNlVmVydGV4VXZzWyAxIF07XG5cblx0XHR2YXIgbmV3VXZzMSwgbmV3VXZzMjtcblxuXHRcdGlmICggdXZzMSAmJiB1dnMxLmxlbmd0aCA9PT0gbGVuZ3RoICkgbmV3VXZzMSA9IFtdO1xuXHRcdGlmICggdXZzMiAmJiB1dnMyLmxlbmd0aCA9PT0gbGVuZ3RoICkgbmV3VXZzMiA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgaWQgPSBmYWNlc1sgaSBdLl9pZDtcblxuXHRcdFx0aWYgKCBuZXdVdnMxICkgbmV3VXZzMS5wdXNoKCB1dnMxWyBpZCBdICk7XG5cdFx0XHRpZiAoIG5ld1V2czIgKSBuZXdVdnMyLnB1c2goIHV2czJbIGlkIF0gKTtcblxuXHRcdH1cblxuXHRcdGlmICggbmV3VXZzMSApIHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdID0gbmV3VXZzMTtcblx0XHRpZiAoIG5ld1V2czIgKSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDEgXSA9IG5ld1V2czI7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBkYXRhID0ge1xuXHRcdFx0bWV0YWRhdGE6IHtcblx0XHRcdFx0dmVyc2lvbjogNC41LFxuXHRcdFx0XHR0eXBlOiAnR2VvbWV0cnknLFxuXHRcdFx0XHRnZW5lcmF0b3I6ICdHZW9tZXRyeS50b0pTT04nXG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8vIHN0YW5kYXJkIEdlb21ldHJ5IHNlcmlhbGl6YXRpb25cblxuXHRcdGRhdGEudXVpZCA9IHRoaXMudXVpZDtcblx0XHRkYXRhLnR5cGUgPSB0aGlzLnR5cGU7XG5cdFx0aWYgKCB0aGlzLm5hbWUgIT09ICcnICkgZGF0YS5uYW1lID0gdGhpcy5uYW1lO1xuXG5cdFx0aWYgKCB0aGlzLnBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7XG5cblx0XHRcdGZvciAoIHZhciBrZXkgaW4gcGFyYW1ldGVycyApIHtcblxuXHRcdFx0XHRpZiAoIHBhcmFtZXRlcnNbIGtleSBdICE9PSB1bmRlZmluZWQgKSBkYXRhWyBrZXkgXSA9IHBhcmFtZXRlcnNbIGtleSBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkYXRhO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHZlcnRpY2VzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlcnRleCA9IHRoaXMudmVydGljZXNbIGkgXTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdH1cblxuXHRcdHZhciBmYWNlcyA9IFtdO1xuXHRcdHZhciBub3JtYWxzID0gW107XG5cdFx0dmFyIG5vcm1hbHNIYXNoID0ge307XG5cdFx0dmFyIGNvbG9ycyA9IFtdO1xuXHRcdHZhciBjb2xvcnNIYXNoID0ge307XG5cdFx0dmFyIHV2cyA9IFtdO1xuXHRcdHZhciB1dnNIYXNoID0ge307XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLmZhY2VzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSB0aGlzLmZhY2VzWyBpIF07XG5cblx0XHRcdHZhciBoYXNNYXRlcmlhbCA9IHRydWU7XG5cdFx0XHR2YXIgaGFzRmFjZVV2ID0gZmFsc2U7IC8vIGRlcHJlY2F0ZWRcblx0XHRcdHZhciBoYXNGYWNlVmVydGV4VXYgPSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDAgXVsgaSBdICE9PSB1bmRlZmluZWQ7XG5cdFx0XHR2YXIgaGFzRmFjZU5vcm1hbCA9IGZhY2Uubm9ybWFsLmxlbmd0aCgpID4gMDtcblx0XHRcdHZhciBoYXNGYWNlVmVydGV4Tm9ybWFsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aCA+IDA7XG5cdFx0XHR2YXIgaGFzRmFjZUNvbG9yID0gZmFjZS5jb2xvci5yICE9PSAxIHx8IGZhY2UuY29sb3IuZyAhPT0gMSB8fCBmYWNlLmNvbG9yLmIgIT09IDE7XG5cdFx0XHR2YXIgaGFzRmFjZVZlcnRleENvbG9yID0gZmFjZS52ZXJ0ZXhDb2xvcnMubGVuZ3RoID4gMDtcblxuXHRcdFx0dmFyIGZhY2VUeXBlID0gMDtcblxuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAwLCAwICk7IC8vIGlzUXVhZFxuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAxLCBoYXNNYXRlcmlhbCApO1xuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAyLCBoYXNGYWNlVXYgKTtcblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgMywgaGFzRmFjZVZlcnRleFV2ICk7XG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDQsIGhhc0ZhY2VOb3JtYWwgKTtcblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgNSwgaGFzRmFjZVZlcnRleE5vcm1hbCApO1xuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCA2LCBoYXNGYWNlQ29sb3IgKTtcblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgNywgaGFzRmFjZVZlcnRleENvbG9yICk7XG5cblx0XHRcdGZhY2VzLnB1c2goIGZhY2VUeXBlICk7XG5cdFx0XHRmYWNlcy5wdXNoKCBmYWNlLmEsIGZhY2UuYiwgZmFjZS5jICk7XG5cdFx0XHRmYWNlcy5wdXNoKCBmYWNlLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4VXYgKSB7XG5cblx0XHRcdFx0dmFyIGZhY2VWZXJ0ZXhVdnMgPSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDAgXVsgaSBdO1xuXG5cdFx0XHRcdGZhY2VzLnB1c2goXG5cdFx0XHRcdFx0Z2V0VXZJbmRleCggZmFjZVZlcnRleFV2c1sgMCBdICksXG5cdFx0XHRcdFx0Z2V0VXZJbmRleCggZmFjZVZlcnRleFV2c1sgMSBdICksXG5cdFx0XHRcdFx0Z2V0VXZJbmRleCggZmFjZVZlcnRleFV2c1sgMiBdIClcblx0XHRcdFx0KTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc0ZhY2VOb3JtYWwgKSB7XG5cblx0XHRcdFx0ZmFjZXMucHVzaCggZ2V0Tm9ybWFsSW5kZXgoIGZhY2Uubm9ybWFsICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgKSB7XG5cblx0XHRcdFx0dmFyIHZlcnRleE5vcm1hbHMgPSBmYWNlLnZlcnRleE5vcm1hbHM7XG5cblx0XHRcdFx0ZmFjZXMucHVzaChcblx0XHRcdFx0XHRnZXROb3JtYWxJbmRleCggdmVydGV4Tm9ybWFsc1sgMCBdICksXG5cdFx0XHRcdFx0Z2V0Tm9ybWFsSW5kZXgoIHZlcnRleE5vcm1hbHNbIDEgXSApLFxuXHRcdFx0XHRcdGdldE5vcm1hbEluZGV4KCB2ZXJ0ZXhOb3JtYWxzWyAyIF0gKVxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZUNvbG9yICkge1xuXG5cdFx0XHRcdGZhY2VzLnB1c2goIGdldENvbG9ySW5kZXgoIGZhY2UuY29sb3IgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZVZlcnRleENvbG9yICkge1xuXG5cdFx0XHRcdHZhciB2ZXJ0ZXhDb2xvcnMgPSBmYWNlLnZlcnRleENvbG9ycztcblxuXHRcdFx0XHRmYWNlcy5wdXNoKFxuXHRcdFx0XHRcdGdldENvbG9ySW5kZXgoIHZlcnRleENvbG9yc1sgMCBdICksXG5cdFx0XHRcdFx0Z2V0Q29sb3JJbmRleCggdmVydGV4Q29sb3JzWyAxIF0gKSxcblx0XHRcdFx0XHRnZXRDb2xvckluZGV4KCB2ZXJ0ZXhDb2xvcnNbIDIgXSApXG5cdFx0XHRcdCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHNldEJpdCggdmFsdWUsIHBvc2l0aW9uLCBlbmFibGVkICkge1xuXG5cdFx0XHRyZXR1cm4gZW5hYmxlZCA/IHZhbHVlIHwgKCAxIDw8IHBvc2l0aW9uICkgOiB2YWx1ZSAmICggfiAoIDEgPDwgcG9zaXRpb24gKSApO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0Tm9ybWFsSW5kZXgoIG5vcm1hbCApIHtcblxuXHRcdFx0dmFyIGhhc2ggPSBub3JtYWwueC50b1N0cmluZygpICsgbm9ybWFsLnkudG9TdHJpbmcoKSArIG5vcm1hbC56LnRvU3RyaW5nKCk7XG5cblx0XHRcdGlmICggbm9ybWFsc0hhc2hbIGhhc2ggXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBub3JtYWxzSGFzaFsgaGFzaCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdG5vcm1hbHNIYXNoWyBoYXNoIF0gPSBub3JtYWxzLmxlbmd0aCAvIDM7XG5cdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0cmV0dXJuIG5vcm1hbHNIYXNoWyBoYXNoIF07XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXRDb2xvckluZGV4KCBjb2xvciApIHtcblxuXHRcdFx0dmFyIGhhc2ggPSBjb2xvci5yLnRvU3RyaW5nKCkgKyBjb2xvci5nLnRvU3RyaW5nKCkgKyBjb2xvci5iLnRvU3RyaW5nKCk7XG5cblx0XHRcdGlmICggY29sb3JzSGFzaFsgaGFzaCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGNvbG9yc0hhc2hbIGhhc2ggXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjb2xvcnNIYXNoWyBoYXNoIF0gPSBjb2xvcnMubGVuZ3RoO1xuXHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yLmdldEhleCgpICk7XG5cblx0XHRcdHJldHVybiBjb2xvcnNIYXNoWyBoYXNoIF07XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXRVdkluZGV4KCB1diApIHtcblxuXHRcdFx0dmFyIGhhc2ggPSB1di54LnRvU3RyaW5nKCkgKyB1di55LnRvU3RyaW5nKCk7XG5cblx0XHRcdGlmICggdXZzSGFzaFsgaGFzaCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHV2c0hhc2hbIGhhc2ggXTtcblxuXHRcdFx0fVxuXG5cdFx0XHR1dnNIYXNoWyBoYXNoIF0gPSB1dnMubGVuZ3RoIC8gMjtcblx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0XHRcdHJldHVybiB1dnNIYXNoWyBoYXNoIF07XG5cblx0XHR9XG5cblx0XHRkYXRhLmRhdGEgPSB7fTtcblxuXHRcdGRhdGEuZGF0YS52ZXJ0aWNlcyA9IHZlcnRpY2VzO1xuXHRcdGRhdGEuZGF0YS5ub3JtYWxzID0gbm9ybWFscztcblx0XHRpZiAoIGNvbG9ycy5sZW5ndGggPiAwICkgZGF0YS5kYXRhLmNvbG9ycyA9IGNvbG9ycztcblx0XHRpZiAoIHV2cy5sZW5ndGggPiAwICkgZGF0YS5kYXRhLnV2cyA9IFsgdXZzIF07IC8vIHRlbXBvcmFsIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcblx0XHRkYXRhLmRhdGEuZmFjZXMgPSBmYWNlcztcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8qXG5cdFx0IC8vIEhhbmRsZSBwcmltaXRpdmVzXG5cblx0XHQgdmFyIHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7XG5cblx0XHQgaWYgKCBwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHQgdmFyIHZhbHVlcyA9IFtdO1xuXG5cdFx0IGZvciAoIHZhciBrZXkgaW4gcGFyYW1ldGVycyApIHtcblxuXHRcdCB2YWx1ZXMucHVzaCggcGFyYW1ldGVyc1sga2V5IF0gKTtcblxuXHRcdCB9XG5cblx0XHQgdmFyIGdlb21ldHJ5ID0gT2JqZWN0LmNyZWF0ZSggdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgKTtcblx0XHQgdGhpcy5jb25zdHJ1Y3Rvci5hcHBseSggZ2VvbWV0cnksIHZhbHVlcyApO1xuXHRcdCByZXR1cm4gZ2VvbWV0cnk7XG5cblx0XHQgfVxuXG5cdFx0IHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblx0XHQgKi9cblxuXHRcdHJldHVybiBuZXcgR2VvbWV0cnkoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHZhciBpLCBpbCwgaiwgamwsIGssIGtsO1xuXG5cdFx0Ly8gcmVzZXRcblxuXHRcdHRoaXMudmVydGljZXMgPSBbXTtcblx0XHR0aGlzLmNvbG9ycyA9IFtdO1xuXHRcdHRoaXMuZmFjZXMgPSBbXTtcblx0XHR0aGlzLmZhY2VWZXJ0ZXhVdnMgPSBbW11dO1xuXHRcdHRoaXMubW9ycGhUYXJnZXRzID0gW107XG5cdFx0dGhpcy5tb3JwaE5vcm1hbHMgPSBbXTtcblx0XHR0aGlzLnNraW5XZWlnaHRzID0gW107XG5cdFx0dGhpcy5za2luSW5kaWNlcyA9IFtdO1xuXHRcdHRoaXMubGluZURpc3RhbmNlcyA9IFtdO1xuXHRcdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xuXHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xuXG5cdFx0Ly8gbmFtZVxuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHQvLyB2ZXJ0aWNlc1xuXG5cdFx0dmFyIHZlcnRpY2VzID0gc291cmNlLnZlcnRpY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMudmVydGljZXMucHVzaCggdmVydGljZXNbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBjb2xvcnNcblxuXHRcdHZhciBjb2xvcnMgPSBzb3VyY2UuY29sb3JzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gY29sb3JzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmNvbG9ycy5wdXNoKCBjb2xvcnNbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBmYWNlc1xuXG5cdFx0dmFyIGZhY2VzID0gc291cmNlLmZhY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gZmFjZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZmFjZXMucHVzaCggZmFjZXNbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBmYWNlIHZlcnRleCB1dnNcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHNvdXJjZS5mYWNlVmVydGV4VXZzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZVZlcnRleFV2cyA9IHNvdXJjZS5mYWNlVmVydGV4VXZzWyBpIF07XG5cblx0XHRcdGlmICggdGhpcy5mYWNlVmVydGV4VXZzWyBpIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0aGlzLmZhY2VWZXJ0ZXhVdnNbIGkgXSA9IFtdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIGogPSAwLCBqbCA9IGZhY2VWZXJ0ZXhVdnMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0dmFyIHV2cyA9IGZhY2VWZXJ0ZXhVdnNbIGogXSwgdXZzQ29weSA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGsgPSAwLCBrbCA9IHV2cy5sZW5ndGg7IGsgPCBrbDsgayArKyApIHtcblxuXHRcdFx0XHRcdHZhciB1diA9IHV2c1sgayBdO1xuXG5cdFx0XHRcdFx0dXZzQ29weS5wdXNoKCB1di5jbG9uZSgpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuZmFjZVZlcnRleFV2c1sgaSBdLnB1c2goIHV2c0NvcHkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gbW9ycGggdGFyZ2V0c1xuXG5cdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBtb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBtb3JwaFRhcmdldCA9IHt9O1xuXHRcdFx0bW9ycGhUYXJnZXQubmFtZSA9IG1vcnBoVGFyZ2V0c1sgaSBdLm5hbWU7XG5cblx0XHRcdC8vIHZlcnRpY2VzXG5cblx0XHRcdGlmICggbW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtb3JwaFRhcmdldC52ZXJ0aWNlcyA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGogPSAwLCBqbCA9IG1vcnBoVGFyZ2V0c1sgaSBdLnZlcnRpY2VzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0bW9ycGhUYXJnZXQudmVydGljZXMucHVzaCggbW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXNbIGogXS5jbG9uZSgpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIG5vcm1hbHNcblxuXHRcdFx0aWYgKCBtb3JwaFRhcmdldHNbIGkgXS5ub3JtYWxzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bW9ycGhUYXJnZXQubm9ybWFscyA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGogPSAwLCBqbCA9IG1vcnBoVGFyZ2V0c1sgaSBdLm5vcm1hbHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRtb3JwaFRhcmdldC5ub3JtYWxzLnB1c2goIG1vcnBoVGFyZ2V0c1sgaSBdLm5vcm1hbHNbIGogXS5jbG9uZSgpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhUYXJnZXRzLnB1c2goIG1vcnBoVGFyZ2V0ICk7XG5cblx0XHR9XG5cblx0XHQvLyBtb3JwaCBub3JtYWxzXG5cblx0XHR2YXIgbW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IG1vcnBoTm9ybWFscy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIG1vcnBoTm9ybWFsID0ge307XG5cblx0XHRcdC8vIHZlcnRleCBub3JtYWxzXG5cblx0XHRcdGlmICggbW9ycGhOb3JtYWxzWyBpIF0udmVydGV4Tm9ybWFscyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1vcnBoTm9ybWFsLnZlcnRleE5vcm1hbHMgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCBqID0gMCwgamwgPSBtb3JwaE5vcm1hbHNbIGkgXS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIHNyY1ZlcnRleE5vcm1hbCA9IG1vcnBoTm9ybWFsc1sgaSBdLnZlcnRleE5vcm1hbHNbIGogXTtcblx0XHRcdFx0XHR2YXIgZGVzdFZlcnRleE5vcm1hbCA9IHt9O1xuXG5cdFx0XHRcdFx0ZGVzdFZlcnRleE5vcm1hbC5hID0gc3JjVmVydGV4Tm9ybWFsLmEuY2xvbmUoKTtcblx0XHRcdFx0XHRkZXN0VmVydGV4Tm9ybWFsLmIgPSBzcmNWZXJ0ZXhOb3JtYWwuYi5jbG9uZSgpO1xuXHRcdFx0XHRcdGRlc3RWZXJ0ZXhOb3JtYWwuYyA9IHNyY1ZlcnRleE5vcm1hbC5jLmNsb25lKCk7XG5cblx0XHRcdFx0XHRtb3JwaE5vcm1hbC52ZXJ0ZXhOb3JtYWxzLnB1c2goIGRlc3RWZXJ0ZXhOb3JtYWwgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gZmFjZSBub3JtYWxzXG5cblx0XHRcdGlmICggbW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtb3JwaE5vcm1hbC5mYWNlTm9ybWFscyA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGogPSAwLCBqbCA9IG1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0bW9ycGhOb3JtYWwuZmFjZU5vcm1hbHMucHVzaCggbW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHNbIGogXS5jbG9uZSgpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhOb3JtYWxzLnB1c2goIG1vcnBoTm9ybWFsICk7XG5cblx0XHR9XG5cblx0XHQvLyBza2luIHdlaWdodHNcblxuXHRcdHZhciBza2luV2VpZ2h0cyA9IHNvdXJjZS5za2luV2VpZ2h0cztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHNraW5XZWlnaHRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnNraW5XZWlnaHRzLnB1c2goIHNraW5XZWlnaHRzWyBpIF0uY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2tpbiBpbmRpY2VzXG5cblx0XHR2YXIgc2tpbkluZGljZXMgPSBzb3VyY2Uuc2tpbkluZGljZXM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBza2luSW5kaWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5za2luSW5kaWNlcy5wdXNoKCBza2luSW5kaWNlc1sgaSBdLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGxpbmUgZGlzdGFuY2VzXG5cblx0XHR2YXIgbGluZURpc3RhbmNlcyA9IHNvdXJjZS5saW5lRGlzdGFuY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gbGluZURpc3RhbmNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5saW5lRGlzdGFuY2VzLnB1c2goIGxpbmVEaXN0YW5jZXNbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYm91bmRpbmcgYm94XG5cblx0XHR2YXIgYm91bmRpbmdCb3ggPSBzb3VyY2UuYm91bmRpbmdCb3g7XG5cblx0XHRpZiAoIGJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gYm91bmRpbmdCb3guY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdC8vIGJvdW5kaW5nIHNwaGVyZVxuXG5cdFx0dmFyIGJvdW5kaW5nU3BoZXJlID0gc291cmNlLmJvdW5kaW5nU3BoZXJlO1xuXG5cdFx0aWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IGJvdW5kaW5nU3BoZXJlLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHQvLyB1cGRhdGUgZmxhZ3NcblxuXHRcdHRoaXMuZWxlbWVudHNOZWVkVXBkYXRlID0gc291cmNlLmVsZW1lbnRzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IHNvdXJjZS52ZXJ0aWNlc05lZWRVcGRhdGU7XG5cdFx0dGhpcy51dnNOZWVkVXBkYXRlID0gc291cmNlLnV2c05lZWRVcGRhdGU7XG5cdFx0dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IHNvdXJjZS5ub3JtYWxzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLmNvbG9yc05lZWRVcGRhdGUgPSBzb3VyY2UuY29sb3JzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlID0gc291cmNlLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlO1xuXHRcdHRoaXMuZ3JvdXBzTmVlZFVwZGF0ZSA9IHNvdXJjZS5ncm91cHNOZWVkVXBkYXRlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdGlmICggQXJyYXkuaXNBcnJheSggYXJyYXkgKSApIHtcblxuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNob3VsZCBiZSBhIFR5cGVkIEFycmF5LicgKTtcblxuXHR9XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cblx0dGhpcy5hcnJheSA9IGFycmF5O1xuXHR0aGlzLml0ZW1TaXplID0gaXRlbVNpemU7XG5cdHRoaXMuY291bnQgPSBhcnJheSAhPT0gdW5kZWZpbmVkID8gYXJyYXkubGVuZ3RoIC8gaXRlbVNpemUgOiAwO1xuXHR0aGlzLm5vcm1hbGl6ZWQgPSBub3JtYWxpemVkID09PSB0cnVlO1xuXG5cdHRoaXMuZHluYW1pYyA9IGZhbHNlO1xuXHR0aGlzLnVwZGF0ZVJhbmdlID0geyBvZmZzZXQ6IDAsIGNvdW50OiAtIDEgfTtcblxuXHR0aGlzLnZlcnNpb24gPSAwO1xuXG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwgJ25lZWRzVXBkYXRlJywge1xuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHtcblxuXHRpc0J1ZmZlckF0dHJpYnV0ZTogdHJ1ZSxcblxuXHRvblVwbG9hZENhbGxiYWNrOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRzZXRBcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggYXJyYXkgKSApIHtcblxuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvciggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jb3VudCA9IGFycmF5ICE9PSB1bmRlZmluZWQgPyBhcnJheS5sZW5ndGggLyB0aGlzLml0ZW1TaXplIDogMDtcblx0XHR0aGlzLmFycmF5ID0gYXJyYXk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldER5bmFtaWM6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmR5bmFtaWMgPSB2YWx1ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblx0XHR0aGlzLmFycmF5ID0gbmV3IHNvdXJjZS5hcnJheS5jb25zdHJ1Y3Rvciggc291cmNlLmFycmF5ICk7XG5cdFx0dGhpcy5pdGVtU2l6ZSA9IHNvdXJjZS5pdGVtU2l6ZTtcblx0XHR0aGlzLmNvdW50ID0gc291cmNlLmNvdW50O1xuXHRcdHRoaXMubm9ybWFsaXplZCA9IHNvdXJjZS5ub3JtYWxpemVkO1xuXG5cdFx0dGhpcy5keW5hbWljID0gc291cmNlLmR5bmFtaWM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlBdDogZnVuY3Rpb24gKCBpbmRleDEsIGF0dHJpYnV0ZSwgaW5kZXgyICkge1xuXG5cdFx0aW5kZXgxICo9IHRoaXMuaXRlbVNpemU7XG5cdFx0aW5kZXgyICo9IGF0dHJpYnV0ZS5pdGVtU2l6ZTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuaXRlbVNpemU7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmFycmF5WyBpbmRleDEgKyBpIF0gPSBhdHRyaWJ1dGUuYXJyYXlbIGluZGV4MiArIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weUFycmF5OiBmdW5jdGlvbiAoIGFycmF5ICkge1xuXG5cdFx0dGhpcy5hcnJheS5zZXQoIGFycmF5ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlDb2xvcnNBcnJheTogZnVuY3Rpb24gKCBjb2xvcnMgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY29sb3JzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjb2xvciA9IGNvbG9yc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGNvbG9yID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlDb2xvcnNBcnJheSgpOiBjb2xvciBpcyB1bmRlZmluZWQnLCBpICk7XG5cdFx0XHRcdGNvbG9yID0gbmV3IENvbG9yKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gY29sb3Iucjtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IGNvbG9yLmc7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSBjb2xvci5iO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5VmVjdG9yMnNBcnJheTogZnVuY3Rpb24gKCB2ZWN0b3JzICkge1xuXG5cdFx0dmFyIGFycmF5ID0gdGhpcy5hcnJheSwgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHZlY3RvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlY3RvciA9IHZlY3RvcnNbIGkgXTtcblxuXHRcdFx0aWYgKCB2ZWN0b3IgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCcsIGkgKTtcblx0XHRcdFx0dmVjdG9yID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueDtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci55O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5VmVjdG9yM3NBcnJheTogZnVuY3Rpb24gKCB2ZWN0b3JzICkge1xuXG5cdFx0dmFyIGFycmF5ID0gdGhpcy5hcnJheSwgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHZlY3RvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlY3RvciA9IHZlY3RvcnNbIGkgXTtcblxuXHRcdFx0aWYgKCB2ZWN0b3IgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCcsIGkgKTtcblx0XHRcdFx0dmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueDtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci55O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLno7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlWZWN0b3I0c0FycmF5OiBmdW5jdGlvbiAoIHZlY3RvcnMgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdmVjdG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVjdG9yID0gdmVjdG9yc1sgaSBdO1xuXG5cdFx0XHRpZiAoIHZlY3RvciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yNHNBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkJywgaSApO1xuXHRcdFx0XHR2ZWN0b3IgPSBuZXcgVmVjdG9yNCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci54O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLnk7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3Iuejtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci53O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUsIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dGhpcy5hcnJheS5zZXQoIHZhbHVlLCBvZmZzZXQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0WDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgXTtcblxuXHR9LFxuXG5cdHNldFg6IGZ1bmN0aW9uICggaW5kZXgsIHggKSB7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgXSA9IHg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFk6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMSBdO1xuXG5cdH0sXG5cblx0c2V0WTogZnVuY3Rpb24gKCBpbmRleCwgeSApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFo6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMiBdO1xuXG5cdH0sXG5cblx0c2V0WjogZnVuY3Rpb24gKCBpbmRleCwgeiApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDIgXSA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFc6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMyBdO1xuXG5cdH0sXG5cblx0c2V0VzogZnVuY3Rpb24gKCBpbmRleCwgdyApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5ICkge1xuXG5cdFx0aW5kZXggKj0gdGhpcy5pdGVtU2l6ZTtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZWjogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSwgeiApIHtcblxuXHRcdGluZGV4ICo9IHRoaXMuaXRlbVNpemU7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WFlaVzogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSwgeiwgdyApIHtcblxuXHRcdGluZGV4ICo9IHRoaXMuaXRlbVNpemU7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG9uVXBsb2FkOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0dGhpcy5vblVwbG9hZENhbGxiYWNrID0gY2FsbGJhY2s7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuYXJyYXksIHRoaXMuaXRlbVNpemUgKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cbmZ1bmN0aW9uIEludDhCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEludDhBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5JbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcbkludDhCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50OEJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBVaW50OEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgVWludDhBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5VaW50OEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5VaW50OEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBVaW50OEJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cblVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5VaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIEludDE2QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBJbnQxNkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cbkludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcbkludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEludDE2QnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgVWludDE2QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuVWludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcblVpbnQxNkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBVaW50MTZCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gSW50MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEludDMyQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuSW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuSW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50MzJCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gVWludDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50MzJBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5VaW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuVWludDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBGbG9hdDMyQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5GbG9hdDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgRmxvYXQ2NEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cbkZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBGbG9hdDY0QnVmZmVyQXR0cmlidXRlO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gRGlyZWN0R2VvbWV0cnkoKSB7XG5cblx0dGhpcy52ZXJ0aWNlcyA9IFtdO1xuXHR0aGlzLm5vcm1hbHMgPSBbXTtcblx0dGhpcy5jb2xvcnMgPSBbXTtcblx0dGhpcy51dnMgPSBbXTtcblx0dGhpcy51dnMyID0gW107XG5cblx0dGhpcy5ncm91cHMgPSBbXTtcblxuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHt9O1xuXG5cdHRoaXMuc2tpbldlaWdodHMgPSBbXTtcblx0dGhpcy5za2luSW5kaWNlcyA9IFtdO1xuXG5cdC8vIHRoaXMubGluZURpc3RhbmNlcyA9IFtdO1xuXG5cdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xuXHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDtcblxuXHQvLyB1cGRhdGUgZmxhZ3NcblxuXHR0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMuY29sb3JzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLnV2c05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5ncm91cHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRGlyZWN0R2VvbWV0cnkucHJvdG90eXBlLCB7XG5cblx0Y29tcHV0ZUdyb3VwczogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHtcblxuXHRcdHZhciBncm91cDtcblx0XHR2YXIgZ3JvdXBzID0gW107XG5cdFx0dmFyIG1hdGVyaWFsSW5kZXggPSB1bmRlZmluZWQ7XG5cblx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGZhY2VzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHQvLyBtYXRlcmlhbHNcblxuXHRcdFx0aWYgKCBmYWNlLm1hdGVyaWFsSW5kZXggIT09IG1hdGVyaWFsSW5kZXggKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWxJbmRleCA9IGZhY2UubWF0ZXJpYWxJbmRleDtcblxuXHRcdFx0XHRpZiAoIGdyb3VwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRncm91cC5jb3VudCA9ICggaSAqIDMgKSAtIGdyb3VwLnN0YXJ0O1xuXHRcdFx0XHRcdGdyb3Vwcy5wdXNoKCBncm91cCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRncm91cCA9IHtcblx0XHRcdFx0XHRzdGFydDogaSAqIDMsXG5cdFx0XHRcdFx0bWF0ZXJpYWxJbmRleDogbWF0ZXJpYWxJbmRleFxuXHRcdFx0XHR9O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIGdyb3VwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGdyb3VwLmNvdW50ID0gKCBpICogMyApIC0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRncm91cHMucHVzaCggZ3JvdXAgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuZ3JvdXBzID0gZ3JvdXBzO1xuXG5cdH0sXG5cblx0ZnJvbUdlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIGZhY2VzID0gZ2VvbWV0cnkuZmFjZXM7XG5cdFx0dmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7XG5cdFx0dmFyIGZhY2VWZXJ0ZXhVdnMgPSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzO1xuXG5cdFx0dmFyIGhhc0ZhY2VWZXJ0ZXhVdiA9IGZhY2VWZXJ0ZXhVdnNbIDAgXSAmJiBmYWNlVmVydGV4VXZzWyAwIF0ubGVuZ3RoID4gMDtcblx0XHR2YXIgaGFzRmFjZVZlcnRleFV2MiA9IGZhY2VWZXJ0ZXhVdnNbIDEgXSAmJiBmYWNlVmVydGV4VXZzWyAxIF0ubGVuZ3RoID4gMDtcblxuXHRcdC8vIG1vcnBoc1xuXG5cdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cztcblx0XHR2YXIgbW9ycGhUYXJnZXRzTGVuZ3RoID0gbW9ycGhUYXJnZXRzLmxlbmd0aDtcblxuXHRcdHZhciBtb3JwaFRhcmdldHNQb3NpdGlvbjtcblxuXHRcdGlmICggbW9ycGhUYXJnZXRzTGVuZ3RoID4gMCApIHtcblxuXHRcdFx0bW9ycGhUYXJnZXRzUG9zaXRpb24gPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbW9ycGhUYXJnZXRzTGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdG1vcnBoVGFyZ2V0c1Bvc2l0aW9uWyBpIF0gPSBbXTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0cy5wb3NpdGlvbiA9IG1vcnBoVGFyZ2V0c1Bvc2l0aW9uO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG1vcnBoTm9ybWFscyA9IGdlb21ldHJ5Lm1vcnBoTm9ybWFscztcblx0XHR2YXIgbW9ycGhOb3JtYWxzTGVuZ3RoID0gbW9ycGhOb3JtYWxzLmxlbmd0aDtcblxuXHRcdHZhciBtb3JwaFRhcmdldHNOb3JtYWw7XG5cblx0XHRpZiAoIG1vcnBoTm9ybWFsc0xlbmd0aCA+IDAgKSB7XG5cblx0XHRcdG1vcnBoVGFyZ2V0c05vcm1hbCA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBtb3JwaE5vcm1hbHNMZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0bW9ycGhUYXJnZXRzTm9ybWFsWyBpIF0gPSBbXTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0cy5ub3JtYWwgPSBtb3JwaFRhcmdldHNOb3JtYWw7XG5cblx0XHR9XG5cblx0XHQvLyBza2luc1xuXG5cdFx0dmFyIHNraW5JbmRpY2VzID0gZ2VvbWV0cnkuc2tpbkluZGljZXM7XG5cdFx0dmFyIHNraW5XZWlnaHRzID0gZ2VvbWV0cnkuc2tpbldlaWdodHM7XG5cblx0XHR2YXIgaGFzU2tpbkluZGljZXMgPSBza2luSW5kaWNlcy5sZW5ndGggPT09IHZlcnRpY2VzLmxlbmd0aDtcblx0XHR2YXIgaGFzU2tpbldlaWdodHMgPSBza2luV2VpZ2h0cy5sZW5ndGggPT09IHZlcnRpY2VzLmxlbmd0aDtcblxuXHRcdC8vXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBmYWNlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdFx0dGhpcy52ZXJ0aWNlcy5wdXNoKCB2ZXJ0aWNlc1sgZmFjZS5hIF0sIHZlcnRpY2VzWyBmYWNlLmIgXSwgdmVydGljZXNbIGZhY2UuYyBdICk7XG5cblx0XHRcdHZhciB2ZXJ0ZXhOb3JtYWxzID0gZmFjZS52ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRpZiAoIHZlcnRleE5vcm1hbHMubGVuZ3RoID09PSAzICkge1xuXG5cdFx0XHRcdHRoaXMubm9ybWFscy5wdXNoKCB2ZXJ0ZXhOb3JtYWxzWyAwIF0sIHZlcnRleE5vcm1hbHNbIDEgXSwgdmVydGV4Tm9ybWFsc1sgMiBdICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmFyIG5vcm1hbCA9IGZhY2Uubm9ybWFsO1xuXG5cdFx0XHRcdHRoaXMubm9ybWFscy5wdXNoKCBub3JtYWwsIG5vcm1hbCwgbm9ybWFsICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHZlcnRleENvbG9ycyA9IGZhY2UudmVydGV4Q29sb3JzO1xuXG5cdFx0XHRpZiAoIHZlcnRleENvbG9ycy5sZW5ndGggPT09IDMgKSB7XG5cblx0XHRcdFx0dGhpcy5jb2xvcnMucHVzaCggdmVydGV4Q29sb3JzWyAwIF0sIHZlcnRleENvbG9yc1sgMSBdLCB2ZXJ0ZXhDb2xvcnNbIDIgXSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZhciBjb2xvciA9IGZhY2UuY29sb3I7XG5cblx0XHRcdFx0dGhpcy5jb2xvcnMucHVzaCggY29sb3IsIGNvbG9yLCBjb2xvciApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZVZlcnRleFV2ID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHZhciB2ZXJ0ZXhVdnMgPSBmYWNlVmVydGV4VXZzWyAwIF1bIGkgXTtcblxuXHRcdFx0XHRpZiAoIHZlcnRleFV2cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGhpcy51dnMucHVzaCggdmVydGV4VXZzWyAwIF0sIHZlcnRleFV2c1sgMSBdLCB2ZXJ0ZXhVdnNbIDIgXSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5EaXJlY3RHZW9tZXRyeS5mcm9tR2VvbWV0cnkoKTogVW5kZWZpbmVkIHZlcnRleFV2ICcsIGkgKTtcblxuXHRcdFx0XHRcdHRoaXMudXZzLnB1c2goIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4VXYyID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHZhciB2ZXJ0ZXhVdnMgPSBmYWNlVmVydGV4VXZzWyAxIF1bIGkgXTtcblxuXHRcdFx0XHRpZiAoIHZlcnRleFV2cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGhpcy51dnMyLnB1c2goIHZlcnRleFV2c1sgMCBdLCB2ZXJ0ZXhVdnNbIDEgXSwgdmVydGV4VXZzWyAyIF0gKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRGlyZWN0R2VvbWV0cnkuZnJvbUdlb21ldHJ5KCk6IFVuZGVmaW5lZCB2ZXJ0ZXhVdjIgJywgaSApO1xuXG5cdFx0XHRcdFx0dGhpcy51dnMyLnB1c2goIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gbW9ycGhzXG5cblx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IG1vcnBoVGFyZ2V0c0xlbmd0aDsgaiArKyApIHtcblxuXHRcdFx0XHR2YXIgbW9ycGhUYXJnZXQgPSBtb3JwaFRhcmdldHNbIGogXS52ZXJ0aWNlcztcblxuXHRcdFx0XHRtb3JwaFRhcmdldHNQb3NpdGlvblsgaiBdLnB1c2goIG1vcnBoVGFyZ2V0WyBmYWNlLmEgXSwgbW9ycGhUYXJnZXRbIGZhY2UuYiBdLCBtb3JwaFRhcmdldFsgZmFjZS5jIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCBtb3JwaE5vcm1hbHNMZW5ndGg7IGogKysgKSB7XG5cblx0XHRcdFx0dmFyIG1vcnBoTm9ybWFsID0gbW9ycGhOb3JtYWxzWyBqIF0udmVydGV4Tm9ybWFsc1sgaSBdO1xuXG5cdFx0XHRcdG1vcnBoVGFyZ2V0c05vcm1hbFsgaiBdLnB1c2goIG1vcnBoTm9ybWFsLmEsIG1vcnBoTm9ybWFsLmIsIG1vcnBoTm9ybWFsLmMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBza2luc1xuXG5cdFx0XHRpZiAoIGhhc1NraW5JbmRpY2VzICkge1xuXG5cdFx0XHRcdHRoaXMuc2tpbkluZGljZXMucHVzaCggc2tpbkluZGljZXNbIGZhY2UuYSBdLCBza2luSW5kaWNlc1sgZmFjZS5iIF0sIHNraW5JbmRpY2VzWyBmYWNlLmMgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzU2tpbldlaWdodHMgKSB7XG5cblx0XHRcdFx0dGhpcy5za2luV2VpZ2h0cy5wdXNoKCBza2luV2VpZ2h0c1sgZmFjZS5hIF0sIHNraW5XZWlnaHRzWyBmYWNlLmIgXSwgc2tpbldlaWdodHNbIGZhY2UuYyBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuY29tcHV0ZUdyb3VwcyggZ2VvbWV0cnkgKTtcblxuXHRcdHRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gZ2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlO1xuXHRcdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSBnZW9tZXRyeS5ub3JtYWxzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLmNvbG9yc05lZWRVcGRhdGUgPSBnZW9tZXRyeS5jb2xvcnNOZWVkVXBkYXRlO1xuXHRcdHRoaXMudXZzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LnV2c05lZWRVcGRhdGU7XG5cdFx0dGhpcy5ncm91cHNOZWVkVXBkYXRlID0gZ2VvbWV0cnkuZ3JvdXBzTmVlZFVwZGF0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gYXJyYXlNYXgoIGFycmF5ICkge1xuXG5cdGlmICggYXJyYXkubGVuZ3RoID09PSAwICkgcmV0dXJuIC0gSW5maW5pdHk7XG5cblx0dmFyIG1heCA9IGFycmF5WyAwIF07XG5cblx0Zm9yICggdmFyIGkgPSAxLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgKysgaSApIHtcblxuXHRcdGlmICggYXJyYXlbIGkgXSA+IG1heCApIG1heCA9IGFycmF5WyBpIF07XG5cblx0fVxuXG5cdHJldHVybiBtYXg7XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgYnVmZmVyR2VvbWV0cnlJZCA9IDE7IC8vIEJ1ZmZlckdlb21ldHJ5IHVzZXMgb2RkIG51bWJlcnMgYXMgSWRcblxuZnVuY3Rpb24gQnVmZmVyR2VvbWV0cnkoKSB7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBidWZmZXJHZW9tZXRyeUlkICs9IDIgfSApO1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXHR0aGlzLnR5cGUgPSAnQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMuaW5kZXggPSBudWxsO1xuXHR0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcblxuXHR0aGlzLm1vcnBoQXR0cmlidXRlcyA9IHt9O1xuXG5cdHRoaXMuZ3JvdXBzID0gW107XG5cblx0dGhpcy5ib3VuZGluZ0JveCA9IG51bGw7XG5cdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xuXG5cdHRoaXMuZHJhd1JhbmdlID0geyBzdGFydDogMCwgY291bnQ6IEluZmluaXR5IH07XG5cbn1cblxuQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEJ1ZmZlckdlb21ldHJ5LFxuXG5cdGlzQnVmZmVyR2VvbWV0cnk6IHRydWUsXG5cblx0Z2V0SW5kZXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmluZGV4O1xuXG5cdH0sXG5cblx0c2V0SW5kZXg6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIGluZGV4ICkgKSB7XG5cblx0XHRcdHRoaXMuaW5kZXggPSBuZXcgKCBhcnJheU1heCggaW5kZXggKSA+IDY1NTM1ID8gVWludDMyQnVmZmVyQXR0cmlidXRlIDogVWludDE2QnVmZmVyQXR0cmlidXRlICkoIGluZGV4LCAxICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmluZGV4ID0gaW5kZXg7XG5cblx0XHR9XG5cblx0fSxcblxuXHRhZGRBdHRyaWJ1dGU6IGZ1bmN0aW9uICggbmFtZSwgYXR0cmlidXRlICkge1xuXG5cdFx0aWYgKCAhICggYXR0cmlidXRlICYmIGF0dHJpYnV0ZS5pc0J1ZmZlckF0dHJpYnV0ZSApICYmICEgKCBhdHRyaWJ1dGUgJiYgYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRBdHRyaWJ1dGUoKSBub3cgZXhwZWN0cyAoIG5hbWUsIGF0dHJpYnV0ZSApLicgKTtcblxuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoIG5hbWUsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGFyZ3VtZW50c1sgMSBdLCBhcmd1bWVudHNbIDIgXSApICk7XG5cblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggbmFtZSA9PT0gJ2luZGV4JyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuYWRkQXR0cmlidXRlOiBVc2UgLnNldEluZGV4KCkgZm9yIGluZGV4IGF0dHJpYnV0ZS4nICk7XG5cdFx0XHR0aGlzLnNldEluZGV4KCBhdHRyaWJ1dGUgKTtcblxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF0gPSBhdHRyaWJ1dGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEF0dHJpYnV0ZTogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuYXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdH0sXG5cblx0cmVtb3ZlQXR0cmlidXRlOiBmdW5jdGlvbiAoIG5hbWUgKSB7XG5cblx0XHRkZWxldGUgdGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZEdyb3VwOiBmdW5jdGlvbiAoIHN0YXJ0LCBjb3VudCwgbWF0ZXJpYWxJbmRleCApIHtcblxuXHRcdHRoaXMuZ3JvdXBzLnB1c2goIHtcblxuXHRcdFx0c3RhcnQ6IHN0YXJ0LFxuXHRcdFx0Y291bnQ6IGNvdW50LFxuXHRcdFx0bWF0ZXJpYWxJbmRleDogbWF0ZXJpYWxJbmRleCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWxJbmRleCA6IDBcblxuXHRcdH0gKTtcblxuXHR9LFxuXG5cdGNsZWFyR3JvdXBzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmdyb3VwcyA9IFtdO1xuXG5cdH0sXG5cblx0c2V0RHJhd1JhbmdlOiBmdW5jdGlvbiAoIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdHRoaXMuZHJhd1JhbmdlLnN0YXJ0ID0gc3RhcnQ7XG5cdFx0dGhpcy5kcmF3UmFuZ2UuY291bnQgPSBjb3VudDtcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4OiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdHZhciBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uICk7XG5cdFx0XHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHR2YXIgbm9ybWFsID0gdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtcblxuXHRcdGlmICggbm9ybWFsICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpLmdldE5vcm1hbE1hdHJpeCggbWF0cml4ICk7XG5cblx0XHRcdG5vcm1hbE1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBub3JtYWwgKTtcblx0XHRcdG5vcm1hbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdGF0ZVg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgeC1heGlzXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVgoIGFuZ2xlICkge1xuXG5cdFx0XHRtMS5tYWtlUm90YXRpb25YKCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgeS1heGlzXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVkoIGFuZ2xlICkge1xuXG5cdFx0XHRtMS5tYWtlUm90YXRpb25ZKCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVo6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgei1heGlzXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVooIGFuZ2xlICkge1xuXG5cdFx0XHRtMS5tYWtlUm90YXRpb25aKCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gdHJhbnNsYXRlIGdlb21ldHJ5XG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZSggeCwgeSwgeiApIHtcblxuXHRcdFx0bTEubWFrZVRyYW5zbGF0aW9uKCB4LCB5LCB6ICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0c2NhbGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHNjYWxlIGdlb21ldHJ5XG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNjYWxlKCB4LCB5LCB6ICkge1xuXG5cdFx0XHRtMS5tYWtlU2NhbGUoIHgsIHksIHogKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRsb29rQXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvYmogPSBuZXcgT2JqZWN0M0QoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBsb29rQXQoIHZlY3RvciApIHtcblxuXHRcdFx0b2JqLmxvb2tBdCggdmVjdG9yICk7XG5cblx0XHRcdG9iai51cGRhdGVNYXRyaXgoKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggb2JqLm1hdHJpeCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2VudGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb2Zmc2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjZW50ZXIoKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKCBvZmZzZXQgKS5uZWdhdGUoKTtcblxuXHRcdFx0dGhpcy50cmFuc2xhdGUoIG9mZnNldC54LCBvZmZzZXQueSwgb2Zmc2V0LnogKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRzZXRGcm9tT2JqZWN0OiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdC8vIGNvbnNvbGUubG9nKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuc2V0RnJvbU9iamVjdCgpLiBDb252ZXJ0aW5nJywgb2JqZWN0LCB0aGlzICk7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XG5cblx0XHRpZiAoIG9iamVjdC5pc1BvaW50cyB8fCBvYmplY3QuaXNMaW5lICkge1xuXG5cdFx0XHR2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCAqIDMsIDMgKTtcblx0XHRcdHZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkuY29sb3JzLmxlbmd0aCAqIDMsIDMgKTtcblxuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIHBvc2l0aW9ucy5jb3B5VmVjdG9yM3NBcnJheSggZ2VvbWV0cnkudmVydGljZXMgKSApO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIGNvbG9ycy5jb3B5Q29sb3JzQXJyYXkoIGdlb21ldHJ5LmNvbG9ycyApICk7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkubGluZURpc3RhbmNlcyAmJiBnZW9tZXRyeS5saW5lRGlzdGFuY2VzLmxlbmd0aCA9PT0gZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoICkge1xuXG5cdFx0XHRcdHZhciBsaW5lRGlzdGFuY2VzID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LmxpbmVEaXN0YW5jZXMubGVuZ3RoLCAxICk7XG5cblx0XHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdsaW5lRGlzdGFuY2UnLCBsaW5lRGlzdGFuY2VzLmNvcHlBcnJheSggZ2VvbWV0cnkubGluZURpc3RhbmNlcyApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUuY2xvbmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBnZW9tZXRyeS5ib3VuZGluZ0JveC5jbG9uZSgpO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNNZXNoICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dGhpcy5mcm9tR2VvbWV0cnkoIGdlb21ldHJ5ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHR2YXIgcG9zaXRpb24gPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgcG9pbnQgPSBwb2ludHNbIGkgXTtcblx0XHRcdHBvc2l0aW9uLnB1c2goIHBvaW50LngsIHBvaW50LnksIHBvaW50LnogfHwgMCApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgMyApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHVwZGF0ZUZyb21PYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0aWYgKCBvYmplY3QuaXNNZXNoICkge1xuXG5cdFx0XHR2YXIgZGlyZWN0ID0gZ2VvbWV0cnkuX19kaXJlY3RHZW9tZXRyeTtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5lbGVtZW50c05lZWRVcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0ZGlyZWN0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRnZW9tZXRyeS5lbGVtZW50c05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGRpcmVjdCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiB0aGlzLmZyb21HZW9tZXRyeSggZ2VvbWV0cnkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRkaXJlY3QudmVydGljZXNOZWVkVXBkYXRlID0gZ2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlO1xuXHRcdFx0ZGlyZWN0Lm5vcm1hbHNOZWVkVXBkYXRlID0gZ2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGU7XG5cdFx0XHRkaXJlY3QuY29sb3JzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGU7XG5cdFx0XHRkaXJlY3QudXZzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LnV2c05lZWRVcGRhdGU7XG5cdFx0XHRkaXJlY3QuZ3JvdXBzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGU7XG5cblx0XHRcdGdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHRcdFx0Z2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0XHRcdGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0XHRcdGdlb21ldHJ5LnV2c05lZWRVcGRhdGUgPSBmYWxzZTtcblx0XHRcdGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdFx0Z2VvbWV0cnkgPSBkaXJlY3Q7XG5cblx0XHR9XG5cblx0XHR2YXIgYXR0cmlidXRlO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS52ZXJ0aWNlc05lZWRVcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzICk7XG5cdFx0XHRcdGF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5Lm5vcm1hbHNOZWVkVXBkYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRhdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXMubm9ybWFsO1xuXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSggZ2VvbWV0cnkubm9ybWFscyApO1xuXHRcdFx0XHRhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5Lm5vcm1hbHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5jb2xvcjtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuY29weUNvbG9yc0FycmF5KCBnZW9tZXRyeS5jb2xvcnMgKTtcblx0XHRcdFx0YXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeS5jb2xvcnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LnV2c05lZWRVcGRhdGUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy51djtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoIGdlb21ldHJ5LnV2cyApO1xuXHRcdFx0XHRhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LnV2c05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkubGluZURpc3RhbmNlc05lZWRVcGRhdGUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5saW5lRGlzdGFuY2U7XG5cblx0XHRcdGlmICggYXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlLmNvcHlBcnJheSggZ2VvbWV0cnkubGluZURpc3RhbmNlcyApO1xuXHRcdFx0XHRhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUgKSB7XG5cblx0XHRcdGdlb21ldHJ5LmNvbXB1dGVHcm91cHMoIG9iamVjdC5nZW9tZXRyeSApO1xuXHRcdFx0dGhpcy5ncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cblx0XHRcdGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZnJvbUdlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0Z2VvbWV0cnkuX19kaXJlY3RHZW9tZXRyeSA9IG5ldyBEaXJlY3RHZW9tZXRyeSgpLmZyb21HZW9tZXRyeSggZ2VvbWV0cnkgKTtcblxuXHRcdHJldHVybiB0aGlzLmZyb21EaXJlY3RHZW9tZXRyeSggZ2VvbWV0cnkuX19kaXJlY3RHZW9tZXRyeSApO1xuXG5cdH0sXG5cblx0ZnJvbURpcmVjdEdlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCAqIDMgKTtcblx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzICkgKTtcblxuXHRcdGlmICggZ2VvbWV0cnkubm9ybWFscy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR2YXIgbm9ybWFscyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5Lm5vcm1hbHMubGVuZ3RoICogMyApO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5Lm5vcm1hbHMgKSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5jb2xvcnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIGNvbG9ycyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LmNvbG9ycy5sZW5ndGggKiAzICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkuY29weUNvbG9yc0FycmF5KCBnZW9tZXRyeS5jb2xvcnMgKSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS51dnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIHV2cyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LnV2cy5sZW5ndGggKiAyICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkuY29weVZlY3RvcjJzQXJyYXkoIGdlb21ldHJ5LnV2cyApICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LnV2czIubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIHV2czIgPSBuZXcgRmxvYXQzMkFycmF5KCBnZW9tZXRyeS51dnMyLmxlbmd0aCAqIDIgKTtcblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAndXYyJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdXZzMiwgMiApLmNvcHlWZWN0b3Iyc0FycmF5KCBnZW9tZXRyeS51dnMyICkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGdyb3Vwc1xuXG5cdFx0dGhpcy5ncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cblx0XHQvLyBtb3JwaHNcblxuXHRcdGZvciAoIHZhciBuYW1lIGluIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gW107XG5cdFx0XHR2YXIgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzWyBuYW1lIF07XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBtb3JwaFRhcmdldCA9IG1vcnBoVGFyZ2V0c1sgaSBdO1xuXG5cdFx0XHRcdHZhciBhdHRyaWJ1dGUgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbW9ycGhUYXJnZXQubGVuZ3RoICogMywgMyApO1xuXG5cdFx0XHRcdGFycmF5LnB1c2goIGF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSggbW9ycGhUYXJnZXQgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF0gPSBhcnJheTtcblxuXHRcdH1cblxuXHRcdC8vIHNraW5uaW5nXG5cblx0XHRpZiAoIGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZhciBza2luSW5kaWNlcyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS5za2luSW5kaWNlcy5sZW5ndGggKiA0LCA0ICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3NraW5JbmRleCcsIHNraW5JbmRpY2VzLmNvcHlWZWN0b3I0c0FycmF5KCBnZW9tZXRyeS5za2luSW5kaWNlcyApICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LnNraW5XZWlnaHRzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZhciBza2luV2VpZ2h0cyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS5za2luV2VpZ2h0cy5sZW5ndGggKiA0LCA0ICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3NraW5XZWlnaHQnLCBza2luV2VpZ2h0cy5jb3B5VmVjdG9yNHNBcnJheSggZ2VvbWV0cnkuc2tpbldlaWdodHMgKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IGdlb21ldHJ5LmJvdW5kaW5nQm94LmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbXB1dGVCb3VuZGluZ0JveDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ID09PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJveDMoKTtcblxuXHRcdH1cblxuXHRcdHZhciBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTtcblxuXHRcdH1cblxuXHRcdGlmICggaXNOYU4oIHRoaXMuYm91bmRpbmdCb3gubWluLnggKSB8fCBpc05hTiggdGhpcy5ib3VuZGluZ0JveC5taW4ueSApIHx8IGlzTmFOKCB0aGlzLmJvdW5kaW5nQm94Lm1pbi56ICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3g6IENvbXB1dGVkIG1pbi9tYXggaGF2ZSBOYU4gdmFsdWVzLiBUaGUgXCJwb3NpdGlvblwiIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsIHRoaXMgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNvbXB1dGVCb3VuZGluZ1NwaGVyZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJveCA9IG5ldyBCb3gzKCk7XG5cdFx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCkge1xuXG5cdFx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcG9zaXRpb24gPSB0aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRcdGlmICggcG9zaXRpb24gKSB7XG5cblx0XHRcdFx0dmFyIGNlbnRlciA9IHRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyO1xuXG5cdFx0XHRcdGJveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiApO1xuXHRcdFx0XHRib3guZ2V0Q2VudGVyKCBjZW50ZXIgKTtcblxuXHRcdFx0XHQvLyBob3BpbmcgdG8gZmluZCBhIGJvdW5kaW5nU3BoZXJlIHdpdGggYSByYWRpdXMgc21hbGxlciB0aGFuIHRoZVxuXHRcdFx0XHQvLyBib3VuZGluZ1NwaGVyZSBvZiB0aGUgYm91bmRpbmdCb3g6IHNxcnQoMykgc21hbGxlciBpbiB0aGUgYmVzdCBjYXNlXG5cblx0XHRcdFx0dmFyIG1heFJhZGl1c1NxID0gMDtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9zaXRpb24uY291bnQ7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZlY3Rvci54ID0gcG9zaXRpb24uZ2V0WCggaSApO1xuXHRcdFx0XHRcdHZlY3Rvci55ID0gcG9zaXRpb24uZ2V0WSggaSApO1xuXHRcdFx0XHRcdHZlY3Rvci56ID0gcG9zaXRpb24uZ2V0WiggaSApO1xuXHRcdFx0XHRcdG1heFJhZGl1c1NxID0gTWF0aC5tYXgoIG1heFJhZGl1c1NxLCBjZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHZlY3RvciApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzID0gTWF0aC5zcXJ0KCBtYXhSYWRpdXNTcSApO1xuXG5cdFx0XHRcdGlmICggaXNOYU4oIHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzICkgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IENvbXB1dGVkIHJhZGl1cyBpcyBOYU4uIFRoZSBcInBvc2l0aW9uXCIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJywgdGhpcyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y29tcHV0ZUZhY2VOb3JtYWxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXG5cdH0sXG5cblx0Y29tcHV0ZVZlcnRleE5vcm1hbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpbmRleCA9IHRoaXMuaW5kZXg7XG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG5cdFx0dmFyIGdyb3VwcyA9IHRoaXMuZ3JvdXBzO1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGVzLnBvc2l0aW9uICkge1xuXG5cdFx0XHR2YXIgcG9zaXRpb25zID0gYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGVzLm5vcm1hbCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggbmV3IEZsb2F0MzJBcnJheSggcG9zaXRpb25zLmxlbmd0aCApLCAzICkgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyByZXNldCBleGlzdGluZyBub3JtYWxzIHRvIHplcm9cblxuXHRcdFx0XHR2YXIgYXJyYXkgPSBhdHRyaWJ1dGVzLm5vcm1hbC5hcnJheTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gYXJyYXkubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRhcnJheVsgaSBdID0gMDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG5vcm1hbHMgPSBhdHRyaWJ1dGVzLm5vcm1hbC5hcnJheTtcblxuXHRcdFx0dmFyIHZBLCB2QiwgdkM7XG5cdFx0XHR2YXIgcEEgPSBuZXcgVmVjdG9yMygpLCBwQiA9IG5ldyBWZWN0b3IzKCksIHBDID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdHZhciBjYiA9IG5ldyBWZWN0b3IzKCksIGFiID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0Ly8gaW5kZXhlZCBlbGVtZW50c1xuXG5cdFx0XHRpZiAoIGluZGV4ICkge1xuXG5cdFx0XHRcdHZhciBpbmRpY2VzID0gaW5kZXguYXJyYXk7XG5cblx0XHRcdFx0aWYgKCBncm91cHMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRcdFx0dGhpcy5hZGRHcm91cCggMCwgaW5kaWNlcy5sZW5ndGggKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGdyb3Vwcy5sZW5ndGg7IGogPCBqbDsgKysgaiApIHtcblxuXHRcdFx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgaiBdO1xuXG5cdFx0XHRcdFx0dmFyIHN0YXJ0ID0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRcdFx0dmFyIGNvdW50ID0gZ3JvdXAuY291bnQ7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IHN0YXJ0LCBpbCA9IHN0YXJ0ICsgY291bnQ7IGkgPCBpbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0XHR2QSA9IGluZGljZXNbIGkgKyAwIF0gKiAzO1xuXHRcdFx0XHRcdFx0dkIgPSBpbmRpY2VzWyBpICsgMSBdICogMztcblx0XHRcdFx0XHRcdHZDID0gaW5kaWNlc1sgaSArIDIgXSAqIDM7XG5cblx0XHRcdFx0XHRcdHBBLmZyb21BcnJheSggcG9zaXRpb25zLCB2QSApO1xuXHRcdFx0XHRcdFx0cEIuZnJvbUFycmF5KCBwb3NpdGlvbnMsIHZCICk7XG5cdFx0XHRcdFx0XHRwQy5mcm9tQXJyYXkoIHBvc2l0aW9ucywgdkMgKTtcblxuXHRcdFx0XHRcdFx0Y2Iuc3ViVmVjdG9ycyggcEMsIHBCICk7XG5cdFx0XHRcdFx0XHRhYi5zdWJWZWN0b3JzKCBwQSwgcEIgKTtcblx0XHRcdFx0XHRcdGNiLmNyb3NzKCBhYiApO1xuXG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QSBdICs9IGNiLng7XG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QSArIDEgXSArPSBjYi55O1xuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkEgKyAyIF0gKz0gY2IuejtcblxuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkIgXSArPSBjYi54O1xuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkIgKyAxIF0gKz0gY2IueTtcblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZCICsgMiBdICs9IGNiLno7XG5cblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZDIF0gKz0gY2IueDtcblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZDICsgMSBdICs9IGNiLnk7XG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QyArIDIgXSArPSBjYi56O1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBub24taW5kZXhlZCBlbGVtZW50cyAodW5jb25uZWN0ZWQgdHJpYW5nbGUgc291cClcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9zaXRpb25zLmxlbmd0aDsgaSA8IGlsOyBpICs9IDkgKSB7XG5cblx0XHRcdFx0XHRwQS5mcm9tQXJyYXkoIHBvc2l0aW9ucywgaSApO1xuXHRcdFx0XHRcdHBCLmZyb21BcnJheSggcG9zaXRpb25zLCBpICsgMyApO1xuXHRcdFx0XHRcdHBDLmZyb21BcnJheSggcG9zaXRpb25zLCBpICsgNiApO1xuXG5cdFx0XHRcdFx0Y2Iuc3ViVmVjdG9ycyggcEMsIHBCICk7XG5cdFx0XHRcdFx0YWIuc3ViVmVjdG9ycyggcEEsIHBCICk7XG5cdFx0XHRcdFx0Y2IuY3Jvc3MoIGFiICk7XG5cblx0XHRcdFx0XHRub3JtYWxzWyBpIF0gPSBjYi54O1xuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyAxIF0gPSBjYi55O1xuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyAyIF0gPSBjYi56O1xuXG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDMgXSA9IGNiLng7XG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDQgXSA9IGNiLnk7XG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDUgXSA9IGNiLno7XG5cblx0XHRcdFx0XHRub3JtYWxzWyBpICsgNiBdID0gY2IueDtcblx0XHRcdFx0XHRub3JtYWxzWyBpICsgNyBdID0gY2IueTtcblx0XHRcdFx0XHRub3JtYWxzWyBpICsgOCBdID0gY2IuejtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7XG5cblx0XHRcdGF0dHJpYnV0ZXMubm9ybWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdG1lcmdlOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoICEgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5tZXJnZSgpOiBnZW9tZXRyeSBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQnVmZmVyR2VvbWV0cnkuJywgZ2VvbWV0cnkgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG9mZnNldCA9IDA7XG5cblx0XHRcdGNvbnNvbGUud2Fybihcblx0XHRcdFx0J1RIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdlKCk6IE92ZXJ3cml0aW5nIG9yaWdpbmFsIGdlb21ldHJ5LCBzdGFydGluZyBhdCBvZmZzZXQ9MC4gJ1xuXHRcdFx0XHQrICdVc2UgQnVmZmVyR2VvbWV0cnlVdGlscy5tZXJnZUJ1ZmZlckdlb21ldHJpZXMoKSBmb3IgbG9zc2xlc3MgbWVyZ2UuJ1xuXHRcdFx0KTtcblxuXHRcdH1cblxuXHRcdHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggdmFyIGtleSBpbiBhdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmF0dHJpYnV0ZXNbIGtleSBdID09PSB1bmRlZmluZWQgKSBjb250aW51ZTtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZTEgPSBhdHRyaWJ1dGVzWyBrZXkgXTtcblx0XHRcdHZhciBhdHRyaWJ1dGVBcnJheTEgPSBhdHRyaWJ1dGUxLmFycmF5O1xuXG5cdFx0XHR2YXIgYXR0cmlidXRlMiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXNbIGtleSBdO1xuXHRcdFx0dmFyIGF0dHJpYnV0ZUFycmF5MiA9IGF0dHJpYnV0ZTIuYXJyYXk7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGVTaXplID0gYXR0cmlidXRlMi5pdGVtU2l6ZTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBqID0gYXR0cmlidXRlU2l6ZSAqIG9mZnNldDsgaSA8IGF0dHJpYnV0ZUFycmF5Mi5sZW5ndGg7IGkgKyssIGogKysgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlQXJyYXkxWyBqIF0gPSBhdHRyaWJ1dGVBcnJheTJbIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRub3JtYWxpemVOb3JtYWxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBub3JtYWxpemVOb3JtYWxzKCkge1xuXG5cdFx0XHR2YXIgbm9ybWFscyA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBub3JtYWxzLmNvdW50OyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmVjdG9yLnggPSBub3JtYWxzLmdldFgoIGkgKTtcblx0XHRcdFx0dmVjdG9yLnkgPSBub3JtYWxzLmdldFkoIGkgKTtcblx0XHRcdFx0dmVjdG9yLnogPSBub3JtYWxzLmdldFooIGkgKTtcblxuXHRcdFx0XHR2ZWN0b3Iubm9ybWFsaXplKCk7XG5cblx0XHRcdFx0bm9ybWFscy5zZXRYWVooIGksIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dG9Ob25JbmRleGVkOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuaW5kZXggPT09IG51bGwgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LnRvTm9uSW5kZXhlZCgpOiBHZW9tZXRyeSBpcyBhbHJlYWR5IG5vbi1pbmRleGVkLicgKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGdlb21ldHJ5MiA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdFx0dmFyIGluZGljZXMgPSB0aGlzLmluZGV4LmFycmF5O1xuXHRcdHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gYXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHRcdFx0dmFyIGFycmF5ID0gYXR0cmlidXRlLmFycmF5O1xuXHRcdFx0dmFyIGl0ZW1TaXplID0gYXR0cmlidXRlLml0ZW1TaXplO1xuXG5cdFx0XHR2YXIgYXJyYXkyID0gbmV3IGFycmF5LmNvbnN0cnVjdG9yKCBpbmRpY2VzLmxlbmd0aCAqIGl0ZW1TaXplICk7XG5cblx0XHRcdHZhciBpbmRleCA9IDAsIGluZGV4MiA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGluZGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRpbmRleCA9IGluZGljZXNbIGkgXSAqIGl0ZW1TaXplO1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IGl0ZW1TaXplOyBqICsrICkge1xuXG5cdFx0XHRcdFx0YXJyYXkyWyBpbmRleDIgKysgXSA9IGFycmF5WyBpbmRleCArKyBdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeTIuYWRkQXR0cmlidXRlKCBuYW1lLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBhcnJheTIsIGl0ZW1TaXplICkgKTtcblxuXHRcdH1cblxuXHRcdHZhciBncm91cHMgPSB0aGlzLmdyb3VwcztcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZ3JvdXAgPSBncm91cHNbIGkgXTtcblx0XHRcdGdlb21ldHJ5Mi5hZGRHcm91cCggZ3JvdXAuc3RhcnQsIGdyb3VwLmNvdW50LCBncm91cC5tYXRlcmlhbEluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZ2VvbWV0cnkyO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZGF0YSA9IHtcblx0XHRcdG1ldGFkYXRhOiB7XG5cdFx0XHRcdHZlcnNpb246IDQuNSxcblx0XHRcdFx0dHlwZTogJ0J1ZmZlckdlb21ldHJ5Jyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnQnVmZmVyR2VvbWV0cnkudG9KU09OJ1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBzdGFuZGFyZCBCdWZmZXJHZW9tZXRyeSBzZXJpYWxpemF0aW9uXG5cblx0XHRkYXRhLnV1aWQgPSB0aGlzLnV1aWQ7XG5cdFx0ZGF0YS50eXBlID0gdGhpcy50eXBlO1xuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIGRhdGEubmFtZSA9IHRoaXMubmFtZTtcblxuXHRcdGlmICggdGhpcy5wYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBwYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzO1xuXG5cdFx0XHRmb3IgKCB2YXIga2V5IGluIHBhcmFtZXRlcnMgKSB7XG5cblx0XHRcdFx0aWYgKCBwYXJhbWV0ZXJzWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgZGF0YVsga2V5IF0gPSBwYXJhbWV0ZXJzWyBrZXkgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGF0YTtcblxuXHRcdH1cblxuXHRcdGRhdGEuZGF0YSA9IHsgYXR0cmlidXRlczoge30gfTtcblxuXHRcdHZhciBpbmRleCA9IHRoaXMuaW5kZXg7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggaW5kZXguYXJyYXkgKTtcblxuXHRcdFx0ZGF0YS5kYXRhLmluZGV4ID0ge1xuXHRcdFx0XHR0eXBlOiBpbmRleC5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLFxuXHRcdFx0XHRhcnJheTogYXJyYXlcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHR2YXIgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcblxuXHRcdGZvciAoIHZhciBrZXkgaW4gYXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIGtleSBdO1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXR0cmlidXRlLmFycmF5ICk7XG5cblx0XHRcdGRhdGEuZGF0YS5hdHRyaWJ1dGVzWyBrZXkgXSA9IHtcblx0XHRcdFx0aXRlbVNpemU6IGF0dHJpYnV0ZS5pdGVtU2l6ZSxcblx0XHRcdFx0dHlwZTogYXR0cmlidXRlLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsXG5cdFx0XHRcdGFycmF5OiBhcnJheSxcblx0XHRcdFx0bm9ybWFsaXplZDogYXR0cmlidXRlLm5vcm1hbGl6ZWRcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHR2YXIgZ3JvdXBzID0gdGhpcy5ncm91cHM7XG5cblx0XHRpZiAoIGdyb3Vwcy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRkYXRhLmRhdGEuZ3JvdXBzID0gSlNPTi5wYXJzZSggSlNPTi5zdHJpbmdpZnkoIGdyb3VwcyApICk7XG5cblx0XHR9XG5cblx0XHR2YXIgYm91bmRpbmdTcGhlcmUgPSB0aGlzLmJvdW5kaW5nU3BoZXJlO1xuXG5cdFx0aWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0ZGF0YS5kYXRhLmJvdW5kaW5nU3BoZXJlID0ge1xuXHRcdFx0XHRjZW50ZXI6IGJvdW5kaW5nU3BoZXJlLmNlbnRlci50b0FycmF5KCksXG5cdFx0XHRcdHJhZGl1czogYm91bmRpbmdTcGhlcmUucmFkaXVzXG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Lypcblx0XHQgLy8gSGFuZGxlIHByaW1pdGl2ZXNcblxuXHRcdCB2YXIgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycztcblxuXHRcdCBpZiAoIHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdCB2YXIgdmFsdWVzID0gW107XG5cblx0XHQgZm9yICggdmFyIGtleSBpbiBwYXJhbWV0ZXJzICkge1xuXG5cdFx0IHZhbHVlcy5wdXNoKCBwYXJhbWV0ZXJzWyBrZXkgXSApO1xuXG5cdFx0IH1cblxuXHRcdCB2YXIgZ2VvbWV0cnkgPSBPYmplY3QuY3JlYXRlKCB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSApO1xuXHRcdCB0aGlzLmNvbnN0cnVjdG9yLmFwcGx5KCBnZW9tZXRyeSwgdmFsdWVzICk7XG5cdFx0IHJldHVybiBnZW9tZXRyeTtcblxuXHRcdCB9XG5cblx0XHQgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXHRcdCAqL1xuXG5cdFx0cmV0dXJuIG5ldyBCdWZmZXJHZW9tZXRyeSgpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dmFyIG5hbWUsIGksIGw7XG5cblx0XHQvLyByZXNldFxuXG5cdFx0dGhpcy5pbmRleCA9IG51bGw7XG5cdFx0dGhpcy5hdHRyaWJ1dGVzID0ge307XG5cdFx0dGhpcy5tb3JwaEF0dHJpYnV0ZXMgPSB7fTtcblx0XHR0aGlzLmdyb3VwcyA9IFtdO1xuXHRcdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xuXHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xuXG5cdFx0Ly8gbmFtZVxuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHQvLyBpbmRleFxuXG5cdFx0dmFyIGluZGV4ID0gc291cmNlLmluZGV4O1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5zZXRJbmRleCggaW5kZXguY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYXR0cmlidXRlc1xuXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBzb3VyY2UuYXR0cmlidXRlcztcblxuXHRcdGZvciAoIG5hbWUgaW4gYXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIG5hbWUgXTtcblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCBuYW1lLCBhdHRyaWJ1dGUuY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbW9ycGggYXR0cmlidXRlc1xuXG5cdFx0dmFyIG1vcnBoQXR0cmlidXRlcyA9IHNvdXJjZS5tb3JwaEF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCBuYW1lIGluIG1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gW107XG5cdFx0XHR2YXIgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXTsgLy8gbW9ycGhBdHRyaWJ1dGU6IGFycmF5IG9mIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGVzXG5cblx0XHRcdGZvciAoIGkgPSAwLCBsID0gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRhcnJheS5wdXNoKCBtb3JwaEF0dHJpYnV0ZVsgaSBdLmNsb25lKCkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1vcnBoQXR0cmlidXRlc1sgbmFtZSBdID0gYXJyYXk7XG5cblx0XHR9XG5cblx0XHQvLyBncm91cHNcblxuXHRcdHZhciBncm91cHMgPSBzb3VyY2UuZ3JvdXBzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGwgPSBncm91cHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cdFx0XHR0aGlzLmFkZEdyb3VwKCBncm91cC5zdGFydCwgZ3JvdXAuY291bnQsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdH1cblxuXHRcdC8vIGJvdW5kaW5nIGJveFxuXG5cdFx0dmFyIGJvdW5kaW5nQm94ID0gc291cmNlLmJvdW5kaW5nQm94O1xuXG5cdFx0aWYgKCBib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IGJvdW5kaW5nQm94LmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHQvLyBib3VuZGluZyBzcGhlcmVcblxuXHRcdHZhciBib3VuZGluZ1NwaGVyZSA9IHNvdXJjZS5ib3VuZGluZ1NwaGVyZTtcblxuXHRcdGlmICggYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBib3VuZGluZ1NwaGVyZS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZHJhdyByYW5nZVxuXG5cdFx0dGhpcy5kcmF3UmFuZ2Uuc3RhcnQgPSBzb3VyY2UuZHJhd1JhbmdlLnN0YXJ0O1xuXHRcdHRoaXMuZHJhd1JhbmdlLmNvdW50ID0gc291cmNlLmRyYXdSYW5nZS5jb3VudDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gQm94R2VvbWV0cnlcblxuZnVuY3Rpb24gQm94R2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgZGVwdGhTZWdtZW50cyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0JveEdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0d2lkdGg6IHdpZHRoLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdGRlcHRoOiBkZXB0aCxcblx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRkZXB0aFNlZ21lbnRzOiBkZXB0aFNlZ21lbnRzXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBCb3hCdWZmZXJHZW9tZXRyeSggd2lkdGgsIGhlaWdodCwgZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuQm94R2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5Cb3hHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCb3hHZW9tZXRyeTtcblxuLy8gQm94QnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gQm94QnVmZmVyR2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgZGVwdGhTZWdtZW50cyApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0JveEJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0d2lkdGg6IHdpZHRoLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdGRlcHRoOiBkZXB0aCxcblx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRkZXB0aFNlZ21lbnRzOiBkZXB0aFNlZ21lbnRzXG5cdH07XG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHR3aWR0aCA9IHdpZHRoIHx8IDE7XG5cdGhlaWdodCA9IGhlaWdodCB8fCAxO1xuXHRkZXB0aCA9IGRlcHRoIHx8IDE7XG5cblx0Ly8gc2VnbWVudHNcblxuXHR3aWR0aFNlZ21lbnRzID0gTWF0aC5mbG9vciggd2lkdGhTZWdtZW50cyApIHx8IDE7XG5cdGhlaWdodFNlZ21lbnRzID0gTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVudHMgKSB8fCAxO1xuXHRkZXB0aFNlZ21lbnRzID0gTWF0aC5mbG9vciggZGVwdGhTZWdtZW50cyApIHx8IDE7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBudW1iZXJPZlZlcnRpY2VzID0gMDtcblx0dmFyIGdyb3VwU3RhcnQgPSAwO1xuXG5cdC8vIGJ1aWxkIGVhY2ggc2lkZSBvZiB0aGUgYm94IGdlb21ldHJ5XG5cblx0YnVpbGRQbGFuZSggJ3onLCAneScsICd4JywgLSAxLCAtIDEsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLCBkZXB0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgMCApOyAvLyBweFxuXHRidWlsZFBsYW5lKCAneicsICd5JywgJ3gnLCAxLCAtIDEsIGRlcHRoLCBoZWlnaHQsIC0gd2lkdGgsIGRlcHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCAxICk7IC8vIG54XG5cdGJ1aWxkUGxhbmUoICd4JywgJ3onLCAneScsIDEsIDEsIHdpZHRoLCBkZXB0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzLCAyICk7IC8vIHB5XG5cdGJ1aWxkUGxhbmUoICd4JywgJ3onLCAneScsIDEsIC0gMSwgd2lkdGgsIGRlcHRoLCAtIGhlaWdodCwgd2lkdGhTZWdtZW50cywgZGVwdGhTZWdtZW50cywgMyApOyAvLyBueVxuXHRidWlsZFBsYW5lKCAneCcsICd5JywgJ3onLCAxLCAtIDEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgNCApOyAvLyBwelxuXHRidWlsZFBsYW5lKCAneCcsICd5JywgJ3onLCAtIDEsIC0gMSwgd2lkdGgsIGhlaWdodCwgLSBkZXB0aCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIDUgKTsgLy8gbnpcblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0ZnVuY3Rpb24gYnVpbGRQbGFuZSggdSwgdiwgdywgdWRpciwgdmRpciwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGdyaWRYLCBncmlkWSwgbWF0ZXJpYWxJbmRleCApIHtcblxuXHRcdHZhciBzZWdtZW50V2lkdGggPSB3aWR0aCAvIGdyaWRYO1xuXHRcdHZhciBzZWdtZW50SGVpZ2h0ID0gaGVpZ2h0IC8gZ3JpZFk7XG5cblx0XHR2YXIgd2lkdGhIYWxmID0gd2lkdGggLyAyO1xuXHRcdHZhciBoZWlnaHRIYWxmID0gaGVpZ2h0IC8gMjtcblx0XHR2YXIgZGVwdGhIYWxmID0gZGVwdGggLyAyO1xuXG5cdFx0dmFyIGdyaWRYMSA9IGdyaWRYICsgMTtcblx0XHR2YXIgZ3JpZFkxID0gZ3JpZFkgKyAxO1xuXG5cdFx0dmFyIHZlcnRleENvdW50ZXIgPSAwO1xuXHRcdHZhciBncm91cENvdW50ID0gMDtcblxuXHRcdHZhciBpeCwgaXk7XG5cblx0XHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRcdGZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTE7IGl5ICsrICkge1xuXG5cdFx0XHR2YXIgeSA9IGl5ICogc2VnbWVudEhlaWdodCAtIGhlaWdodEhhbGY7XG5cblx0XHRcdGZvciAoIGl4ID0gMDsgaXggPCBncmlkWDE7IGl4ICsrICkge1xuXG5cdFx0XHRcdHZhciB4ID0gaXggKiBzZWdtZW50V2lkdGggLSB3aWR0aEhhbGY7XG5cblx0XHRcdFx0Ly8gc2V0IHZhbHVlcyB0byBjb3JyZWN0IHZlY3RvciBjb21wb25lbnRcblxuXHRcdFx0XHR2ZWN0b3JbIHUgXSA9IHggKiB1ZGlyO1xuXHRcdFx0XHR2ZWN0b3JbIHYgXSA9IHkgKiB2ZGlyO1xuXHRcdFx0XHR2ZWN0b3JbIHcgXSA9IGRlcHRoSGFsZjtcblxuXHRcdFx0XHQvLyBub3cgYXBwbHkgdmVjdG9yIHRvIHZlcnRleCBidWZmZXJcblxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7XG5cblx0XHRcdFx0Ly8gc2V0IHZhbHVlcyB0byBjb3JyZWN0IHZlY3RvciBjb21wb25lbnRcblxuXHRcdFx0XHR2ZWN0b3JbIHUgXSA9IDA7XG5cdFx0XHRcdHZlY3RvclsgdiBdID0gMDtcblx0XHRcdFx0dmVjdG9yWyB3IF0gPSBkZXB0aCA+IDAgPyAxIDogLSAxO1xuXG5cdFx0XHRcdC8vIG5vdyBhcHBseSB2ZWN0b3IgdG8gbm9ybWFsIGJ1ZmZlclxuXG5cdFx0XHRcdG5vcm1hbHMucHVzaCggdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApO1xuXG5cdFx0XHRcdC8vIHV2c1xuXG5cdFx0XHRcdHV2cy5wdXNoKCBpeCAvIGdyaWRYICk7XG5cdFx0XHRcdHV2cy5wdXNoKCAxIC0gKCBpeSAvIGdyaWRZICkgKTtcblxuXHRcdFx0XHQvLyBjb3VudGVyc1xuXG5cdFx0XHRcdHZlcnRleENvdW50ZXIgKz0gMTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gaW5kaWNlc1xuXG5cdFx0Ly8gMS4geW91IG5lZWQgdGhyZWUgaW5kaWNlcyB0byBkcmF3IGEgc2luZ2xlIGZhY2Vcblx0XHQvLyAyLiBhIHNpbmdsZSBzZWdtZW50IGNvbnNpc3RzIG9mIHR3byBmYWNlc1xuXHRcdC8vIDMuIHNvIHdlIG5lZWQgdG8gZ2VuZXJhdGUgc2l4ICgyKjMpIGluZGljZXMgcGVyIHNlZ21lbnRcblxuXHRcdGZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTsgaXkgKysgKSB7XG5cblx0XHRcdGZvciAoIGl4ID0gMDsgaXggPCBncmlkWDsgaXggKysgKSB7XG5cblx0XHRcdFx0dmFyIGEgPSBudW1iZXJPZlZlcnRpY2VzICsgaXggKyBncmlkWDEgKiBpeTtcblx0XHRcdFx0dmFyIGIgPSBudW1iZXJPZlZlcnRpY2VzICsgaXggKyBncmlkWDEgKiAoIGl5ICsgMSApO1xuXHRcdFx0XHR2YXIgYyA9IG51bWJlck9mVmVydGljZXMgKyAoIGl4ICsgMSApICsgZ3JpZFgxICogKCBpeSArIDEgKTtcblx0XHRcdFx0dmFyIGQgPSBudW1iZXJPZlZlcnRpY2VzICsgKCBpeCArIDEgKSArIGdyaWRYMSAqIGl5O1xuXG5cdFx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0XHRcdC8vIGluY3JlYXNlIGNvdW50ZXJcblxuXHRcdFx0XHRncm91cENvdW50ICs9IDY7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGFkZCBhIGdyb3VwIHRvIHRoZSBnZW9tZXRyeS4gdGhpcyB3aWxsIGVuc3VyZSBtdWx0aSBtYXRlcmlhbCBzdXBwb3J0XG5cblx0XHRzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgbWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0Ly8gY2FsY3VsYXRlIG5ldyBzdGFydCB2YWx1ZSBmb3IgZ3JvdXBzXG5cblx0XHRncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7XG5cblx0XHQvLyB1cGRhdGUgdG90YWwgbnVtYmVyIG9mIHZlcnRpY2VzXG5cblx0XHRudW1iZXJPZlZlcnRpY2VzICs9IHZlcnRleENvdW50ZXI7XG5cblx0fVxuXG59XG5cbkJveEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuQm94QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQm94QnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gUGxhbmVHZW9tZXRyeVxuXG5mdW5jdGlvbiBQbGFuZUdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BsYW5lR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR3aWR0aDogd2lkdGgsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0d2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHNcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFBsYW5lQnVmZmVyR2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuUGxhbmVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBsYW5lR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGxhbmVHZW9tZXRyeTtcblxuLy8gUGxhbmVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBQbGFuZUJ1ZmZlckdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cyApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BsYW5lQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR3aWR0aDogd2lkdGgsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0d2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHNcblx0fTtcblxuXHR3aWR0aCA9IHdpZHRoIHx8IDE7XG5cdGhlaWdodCA9IGhlaWdodCB8fCAxO1xuXG5cdHZhciB3aWR0aF9oYWxmID0gd2lkdGggLyAyO1xuXHR2YXIgaGVpZ2h0X2hhbGYgPSBoZWlnaHQgLyAyO1xuXG5cdHZhciBncmlkWCA9IE1hdGguZmxvb3IoIHdpZHRoU2VnbWVudHMgKSB8fCAxO1xuXHR2YXIgZ3JpZFkgPSBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApIHx8IDE7XG5cblx0dmFyIGdyaWRYMSA9IGdyaWRYICsgMTtcblx0dmFyIGdyaWRZMSA9IGdyaWRZICsgMTtcblxuXHR2YXIgc2VnbWVudF93aWR0aCA9IHdpZHRoIC8gZ3JpZFg7XG5cdHZhciBzZWdtZW50X2hlaWdodCA9IGhlaWdodCAvIGdyaWRZO1xuXG5cdHZhciBpeCwgaXk7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdGZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTE7IGl5ICsrICkge1xuXG5cdFx0dmFyIHkgPSBpeSAqIHNlZ21lbnRfaGVpZ2h0IC0gaGVpZ2h0X2hhbGY7XG5cblx0XHRmb3IgKCBpeCA9IDA7IGl4IDwgZ3JpZFgxOyBpeCArKyApIHtcblxuXHRcdFx0dmFyIHggPSBpeCAqIHNlZ21lbnRfd2lkdGggLSB3aWR0aF9oYWxmO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB4LCAtIHksIDAgKTtcblxuXHRcdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cblx0XHRcdHV2cy5wdXNoKCBpeCAvIGdyaWRYICk7XG5cdFx0XHR1dnMucHVzaCggMSAtICggaXkgLyBncmlkWSApICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGluZGljZXNcblxuXHRmb3IgKCBpeSA9IDA7IGl5IDwgZ3JpZFk7IGl5ICsrICkge1xuXG5cdFx0Zm9yICggaXggPSAwOyBpeCA8IGdyaWRYOyBpeCArKyApIHtcblxuXHRcdFx0dmFyIGEgPSBpeCArIGdyaWRYMSAqIGl5O1xuXHRcdFx0dmFyIGIgPSBpeCArIGdyaWRYMSAqICggaXkgKyAxICk7XG5cdFx0XHR2YXIgYyA9ICggaXggKyAxICkgKyBncmlkWDEgKiAoIGl5ICsgMSApO1xuXHRcdFx0dmFyIGQgPSAoIGl4ICsgMSApICsgZ3JpZFgxICogaXk7XG5cblx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5QbGFuZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuUGxhbmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQbGFuZUJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbnZhciBtYXRlcmlhbElkID0gMDtcblxuZnVuY3Rpb24gTWF0ZXJpYWwoKSB7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBtYXRlcmlhbElkICsrIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLm5hbWUgPSAnJztcblx0dGhpcy50eXBlID0gJ01hdGVyaWFsJztcblxuXHR0aGlzLmZvZyA9IHRydWU7XG5cdHRoaXMubGlnaHRzID0gdHJ1ZTtcblxuXHR0aGlzLmJsZW5kaW5nID0gTm9ybWFsQmxlbmRpbmc7XG5cdHRoaXMuc2lkZSA9IEZyb250U2lkZTtcblx0dGhpcy5mbGF0U2hhZGluZyA9IGZhbHNlO1xuXHR0aGlzLnZlcnRleENvbG9ycyA9IE5vQ29sb3JzOyAvLyBUSFJFRS5Ob0NvbG9ycywgVEhSRUUuVmVydGV4Q29sb3JzLCBUSFJFRS5GYWNlQ29sb3JzXG5cblx0dGhpcy5vcGFjaXR5ID0gMTtcblx0dGhpcy50cmFuc3BhcmVudCA9IGZhbHNlO1xuXG5cdHRoaXMuYmxlbmRTcmMgPSBTcmNBbHBoYUZhY3Rvcjtcblx0dGhpcy5ibGVuZERzdCA9IE9uZU1pbnVzU3JjQWxwaGFGYWN0b3I7XG5cdHRoaXMuYmxlbmRFcXVhdGlvbiA9IEFkZEVxdWF0aW9uO1xuXHR0aGlzLmJsZW5kU3JjQWxwaGEgPSBudWxsO1xuXHR0aGlzLmJsZW5kRHN0QWxwaGEgPSBudWxsO1xuXHR0aGlzLmJsZW5kRXF1YXRpb25BbHBoYSA9IG51bGw7XG5cblx0dGhpcy5kZXB0aEZ1bmMgPSBMZXNzRXF1YWxEZXB0aDtcblx0dGhpcy5kZXB0aFRlc3QgPSB0cnVlO1xuXHR0aGlzLmRlcHRoV3JpdGUgPSB0cnVlO1xuXG5cdHRoaXMuY2xpcHBpbmdQbGFuZXMgPSBudWxsO1xuXHR0aGlzLmNsaXBJbnRlcnNlY3Rpb24gPSBmYWxzZTtcblx0dGhpcy5jbGlwU2hhZG93cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2hhZG93U2lkZSA9IG51bGw7XG5cblx0dGhpcy5jb2xvcldyaXRlID0gdHJ1ZTtcblxuXHR0aGlzLnByZWNpc2lvbiA9IG51bGw7IC8vIG92ZXJyaWRlIHRoZSByZW5kZXJlcidzIGRlZmF1bHQgcHJlY2lzaW9uIGZvciB0aGlzIG1hdGVyaWFsXG5cblx0dGhpcy5wb2x5Z29uT2Zmc2V0ID0gZmFsc2U7XG5cdHRoaXMucG9seWdvbk9mZnNldEZhY3RvciA9IDA7XG5cdHRoaXMucG9seWdvbk9mZnNldFVuaXRzID0gMDtcblxuXHR0aGlzLmRpdGhlcmluZyA9IGZhbHNlO1xuXG5cdHRoaXMuYWxwaGFUZXN0ID0gMDtcblx0dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEgPSBmYWxzZTtcblxuXHR0aGlzLm92ZXJkcmF3ID0gMDsgLy8gT3ZlcmRyYXduIHBpeGVscyAodHlwaWNhbGx5IGJldHdlZW4gMCBhbmQgMSkgZm9yIGZpeGluZyBhbnRpYWxpYXNpbmcgZ2FwcyBpbiBDYW52YXNSZW5kZXJlclxuXG5cdHRoaXMudmlzaWJsZSA9IHRydWU7XG5cblx0dGhpcy51c2VyRGF0YSA9IHt9O1xuXG5cdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG59XG5cbk1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBNYXRlcmlhbCxcblxuXHRpc01hdGVyaWFsOiB0cnVlLFxuXG5cdG9uQmVmb3JlQ29tcGlsZTogZnVuY3Rpb24gKCkge30sXG5cblx0c2V0VmFsdWVzOiBmdW5jdGlvbiAoIHZhbHVlcyApIHtcblxuXHRcdGlmICggdmFsdWVzID09PSB1bmRlZmluZWQgKSByZXR1cm47XG5cblx0XHRmb3IgKCB2YXIga2V5IGluIHZhbHVlcyApIHtcblxuXHRcdFx0dmFyIG5ld1ZhbHVlID0gdmFsdWVzWyBrZXkgXTtcblxuXHRcdFx0aWYgKCBuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5NYXRlcmlhbDogJ1wiICsga2V5ICsgXCInIHBhcmFtZXRlciBpcyB1bmRlZmluZWQuXCIgKTtcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gZm9yIGJhY2t3YXJkIGNvbXBhdGFiaWxpdHkgaWYgc2hhZGluZyBpcyBzZXQgaW4gdGhlIGNvbnN0cnVjdG9yXG5cdFx0XHRpZiAoIGtleSA9PT0gJ3NoYWRpbmcnICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLicgKyB0aGlzLnR5cGUgKyAnOiAuc2hhZGluZyBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdGhlIGJvb2xlYW4gLmZsYXRTaGFkaW5nIGluc3RlYWQuJyApO1xuXHRcdFx0XHR0aGlzLmZsYXRTaGFkaW5nID0gKCBuZXdWYWx1ZSA9PT0gRmxhdFNoYWRpbmcgKSA/IHRydWUgOiBmYWxzZTtcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGN1cnJlbnRWYWx1ZSA9IHRoaXNbIGtleSBdO1xuXG5cdFx0XHRpZiAoIGN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5cIiArIHRoaXMudHlwZSArIFwiOiAnXCIgKyBrZXkgKyBcIicgaXMgbm90IGEgcHJvcGVydHkgb2YgdGhpcyBtYXRlcmlhbC5cIiApO1xuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGN1cnJlbnRWYWx1ZSAmJiBjdXJyZW50VmFsdWUuaXNDb2xvciApIHtcblxuXHRcdFx0XHRjdXJyZW50VmFsdWUuc2V0KCBuZXdWYWx1ZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCAoIGN1cnJlbnRWYWx1ZSAmJiBjdXJyZW50VmFsdWUuaXNWZWN0b3IzICkgJiYgKCBuZXdWYWx1ZSAmJiBuZXdWYWx1ZS5pc1ZlY3RvcjMgKSApIHtcblxuXHRcdFx0XHRjdXJyZW50VmFsdWUuY29weSggbmV3VmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICgga2V5ID09PSAnb3ZlcmRyYXcnICkge1xuXG5cdFx0XHRcdC8vIGVuc3VyZSBvdmVyZHJhdyBpcyBiYWNrd2FyZHMtY29tcGF0aWJsZSB3aXRoIGxlZ2FjeSBib29sZWFuIHR5cGVcblx0XHRcdFx0dGhpc1sga2V5IF0gPSBOdW1iZXIoIG5ld1ZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpc1sga2V5IF0gPSBuZXdWYWx1ZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgaXNSb290ID0gKCBtZXRhID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG1ldGEgPT09ICdzdHJpbmcnICk7XG5cblx0XHRpZiAoIGlzUm9vdCApIHtcblxuXHRcdFx0bWV0YSA9IHtcblx0XHRcdFx0dGV4dHVyZXM6IHt9LFxuXHRcdFx0XHRpbWFnZXM6IHt9XG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0dmFyIGRhdGEgPSB7XG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdNYXRlcmlhbCcsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ01hdGVyaWFsLnRvSlNPTidcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gc3RhbmRhcmQgTWF0ZXJpYWwgc2VyaWFsaXphdGlvblxuXHRcdGRhdGEudXVpZCA9IHRoaXMudXVpZDtcblx0XHRkYXRhLnR5cGUgPSB0aGlzLnR5cGU7XG5cblx0XHRpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBkYXRhLm5hbWUgPSB0aGlzLm5hbWU7XG5cblx0XHRpZiAoIHRoaXMuY29sb3IgJiYgdGhpcy5jb2xvci5pc0NvbG9yICkgZGF0YS5jb2xvciA9IHRoaXMuY29sb3IuZ2V0SGV4KCk7XG5cblx0XHRpZiAoIHRoaXMucm91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLnJvdWdobmVzcyA9IHRoaXMucm91Z2huZXNzO1xuXHRcdGlmICggdGhpcy5tZXRhbG5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEubWV0YWxuZXNzID0gdGhpcy5tZXRhbG5lc3M7XG5cblx0XHRpZiAoIHRoaXMuZW1pc3NpdmUgJiYgdGhpcy5lbWlzc2l2ZS5pc0NvbG9yICkgZGF0YS5lbWlzc2l2ZSA9IHRoaXMuZW1pc3NpdmUuZ2V0SGV4KCk7XG5cdFx0aWYgKCB0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ICE9PSAxICkgZGF0YS5lbWlzc2l2ZUludGVuc2l0eSA9IHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0XHRpZiAoIHRoaXMuc3BlY3VsYXIgJiYgdGhpcy5zcGVjdWxhci5pc0NvbG9yICkgZGF0YS5zcGVjdWxhciA9IHRoaXMuc3BlY3VsYXIuZ2V0SGV4KCk7XG5cdFx0aWYgKCB0aGlzLnNoaW5pbmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5zaGluaW5lc3MgPSB0aGlzLnNoaW5pbmVzcztcblx0XHRpZiAoIHRoaXMuY2xlYXJDb2F0ICE9PSB1bmRlZmluZWQgKSBkYXRhLmNsZWFyQ29hdCA9IHRoaXMuY2xlYXJDb2F0O1xuXHRcdGlmICggdGhpcy5jbGVhckNvYXRSb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEuY2xlYXJDb2F0Um91Z2huZXNzID0gdGhpcy5jbGVhckNvYXRSb3VnaG5lc3M7XG5cblx0XHRpZiAoIHRoaXMubWFwICYmIHRoaXMubWFwLmlzVGV4dHVyZSApIGRhdGEubWFwID0gdGhpcy5tYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRpZiAoIHRoaXMuYWxwaGFNYXAgJiYgdGhpcy5hbHBoYU1hcC5pc1RleHR1cmUgKSBkYXRhLmFscGhhTWFwID0gdGhpcy5hbHBoYU1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdGlmICggdGhpcy5saWdodE1hcCAmJiB0aGlzLmxpZ2h0TWFwLmlzVGV4dHVyZSApIGRhdGEubGlnaHRNYXAgPSB0aGlzLmxpZ2h0TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0aWYgKCB0aGlzLmJ1bXBNYXAgJiYgdGhpcy5idW1wTWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5idW1wTWFwID0gdGhpcy5idW1wTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLmJ1bXBTY2FsZSA9IHRoaXMuYnVtcFNjYWxlO1xuXG5cdFx0fVxuXHRcdGlmICggdGhpcy5ub3JtYWxNYXAgJiYgdGhpcy5ub3JtYWxNYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRkYXRhLm5vcm1hbE1hcCA9IHRoaXMubm9ybWFsTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLm5vcm1hbFNjYWxlID0gdGhpcy5ub3JtYWxTY2FsZS50b0FycmF5KCk7XG5cblx0XHR9XG5cdFx0aWYgKCB0aGlzLmRpc3BsYWNlbWVudE1hcCAmJiB0aGlzLmRpc3BsYWNlbWVudE1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEuZGlzcGxhY2VtZW50TWFwID0gdGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRcdGRhdGEuZGlzcGxhY2VtZW50U2NhbGUgPSB0aGlzLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0ZGF0YS5kaXNwbGFjZW1lbnRCaWFzID0gdGhpcy5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0fVxuXHRcdGlmICggdGhpcy5yb3VnaG5lc3NNYXAgJiYgdGhpcy5yb3VnaG5lc3NNYXAuaXNUZXh0dXJlICkgZGF0YS5yb3VnaG5lc3NNYXAgPSB0aGlzLnJvdWdobmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdGlmICggdGhpcy5tZXRhbG5lc3NNYXAgJiYgdGhpcy5tZXRhbG5lc3NNYXAuaXNUZXh0dXJlICkgZGF0YS5tZXRhbG5lc3NNYXAgPSB0aGlzLm1ldGFsbmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXG5cdFx0aWYgKCB0aGlzLmVtaXNzaXZlTWFwICYmIHRoaXMuZW1pc3NpdmVNYXAuaXNUZXh0dXJlICkgZGF0YS5lbWlzc2l2ZU1hcCA9IHRoaXMuZW1pc3NpdmVNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRpZiAoIHRoaXMuc3BlY3VsYXJNYXAgJiYgdGhpcy5zcGVjdWxhck1hcC5pc1RleHR1cmUgKSBkYXRhLnNwZWN1bGFyTWFwID0gdGhpcy5zcGVjdWxhck1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXG5cdFx0aWYgKCB0aGlzLmVudk1hcCAmJiB0aGlzLmVudk1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEuZW52TWFwID0gdGhpcy5lbnZNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRcdGRhdGEucmVmbGVjdGl2aXR5ID0gdGhpcy5yZWZsZWN0aXZpdHk7IC8vIFNjYWxlIGJlaGluZCBlbnZNYXBcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ncmFkaWVudE1hcCAmJiB0aGlzLmdyYWRpZW50TWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5ncmFkaWVudE1hcCA9IHRoaXMuZ3JhZGllbnRNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5zaXplICE9PSB1bmRlZmluZWQgKSBkYXRhLnNpemUgPSB0aGlzLnNpemU7XG5cdFx0aWYgKCB0aGlzLnNpemVBdHRlbnVhdGlvbiAhPT0gdW5kZWZpbmVkICkgZGF0YS5zaXplQXR0ZW51YXRpb24gPSB0aGlzLnNpemVBdHRlbnVhdGlvbjtcblxuXHRcdGlmICggdGhpcy5ibGVuZGluZyAhPT0gTm9ybWFsQmxlbmRpbmcgKSBkYXRhLmJsZW5kaW5nID0gdGhpcy5ibGVuZGluZztcblx0XHRpZiAoIHRoaXMuZmxhdFNoYWRpbmcgPT09IHRydWUgKSBkYXRhLmZsYXRTaGFkaW5nID0gdGhpcy5mbGF0U2hhZGluZztcblx0XHRpZiAoIHRoaXMuc2lkZSAhPT0gRnJvbnRTaWRlICkgZGF0YS5zaWRlID0gdGhpcy5zaWRlO1xuXHRcdGlmICggdGhpcy52ZXJ0ZXhDb2xvcnMgIT09IE5vQ29sb3JzICkgZGF0YS52ZXJ0ZXhDb2xvcnMgPSB0aGlzLnZlcnRleENvbG9ycztcblxuXHRcdGlmICggdGhpcy5vcGFjaXR5IDwgMSApIGRhdGEub3BhY2l0eSA9IHRoaXMub3BhY2l0eTtcblx0XHRpZiAoIHRoaXMudHJhbnNwYXJlbnQgPT09IHRydWUgKSBkYXRhLnRyYW5zcGFyZW50ID0gdGhpcy50cmFuc3BhcmVudDtcblxuXHRcdGRhdGEuZGVwdGhGdW5jID0gdGhpcy5kZXB0aEZ1bmM7XG5cdFx0ZGF0YS5kZXB0aFRlc3QgPSB0aGlzLmRlcHRoVGVzdDtcblx0XHRkYXRhLmRlcHRoV3JpdGUgPSB0aGlzLmRlcHRoV3JpdGU7XG5cblx0XHQvLyByb3RhdGlvbiAoU3ByaXRlTWF0ZXJpYWwpXG5cdFx0aWYgKCB0aGlzLnJvdGF0aW9uICE9PSAwICkgZGF0YS5yb3RhdGlvbiA9IHRoaXMucm90YXRpb247XG5cblx0XHRpZiAoIHRoaXMubGluZXdpZHRoICE9PSAxICkgZGF0YS5saW5ld2lkdGggPSB0aGlzLmxpbmV3aWR0aDtcblx0XHRpZiAoIHRoaXMuZGFzaFNpemUgIT09IHVuZGVmaW5lZCApIGRhdGEuZGFzaFNpemUgPSB0aGlzLmRhc2hTaXplO1xuXHRcdGlmICggdGhpcy5nYXBTaXplICE9PSB1bmRlZmluZWQgKSBkYXRhLmdhcFNpemUgPSB0aGlzLmdhcFNpemU7XG5cdFx0aWYgKCB0aGlzLnNjYWxlICE9PSB1bmRlZmluZWQgKSBkYXRhLnNjYWxlID0gdGhpcy5zY2FsZTtcblxuXHRcdGlmICggdGhpcy5kaXRoZXJpbmcgPT09IHRydWUgKSBkYXRhLmRpdGhlcmluZyA9IHRydWU7XG5cblx0XHRpZiAoIHRoaXMuYWxwaGFUZXN0ID4gMCApIGRhdGEuYWxwaGFUZXN0ID0gdGhpcy5hbHBoYVRlc3Q7XG5cdFx0aWYgKCB0aGlzLnByZW11bHRpcGxpZWRBbHBoYSA9PT0gdHJ1ZSApIGRhdGEucHJlbXVsdGlwbGllZEFscGhhID0gdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE7XG5cblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lID09PSB0cnVlICkgZGF0YS53aXJlZnJhbWUgPSB0aGlzLndpcmVmcmFtZTtcblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID4gMSApIGRhdGEud2lyZWZyYW1lTGluZXdpZHRoID0gdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg7XG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZUxpbmVjYXAgIT09ICdyb3VuZCcgKSBkYXRhLndpcmVmcmFtZUxpbmVjYXAgPSB0aGlzLndpcmVmcmFtZUxpbmVjYXA7XG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZUxpbmVqb2luICE9PSAncm91bmQnICkgZGF0YS53aXJlZnJhbWVMaW5lam9pbiA9IHRoaXMud2lyZWZyYW1lTGluZWpvaW47XG5cblx0XHRpZiAoIHRoaXMubW9ycGhUYXJnZXRzID09PSB0cnVlICkgZGF0YS5tb3JwaFRhcmdldHMgPSB0cnVlO1xuXHRcdGlmICggdGhpcy5za2lubmluZyA9PT0gdHJ1ZSApIGRhdGEuc2tpbm5pbmcgPSB0cnVlO1xuXG5cdFx0aWYgKCB0aGlzLnZpc2libGUgPT09IGZhbHNlICkgZGF0YS52aXNpYmxlID0gZmFsc2U7XG5cdFx0aWYgKCBKU09OLnN0cmluZ2lmeSggdGhpcy51c2VyRGF0YSApICE9PSAne30nICkgZGF0YS51c2VyRGF0YSA9IHRoaXMudXNlckRhdGE7XG5cblx0XHQvLyBUT0RPOiBDb3BpZWQgZnJvbSBPYmplY3QzRC50b0pTT05cblxuXHRcdGZ1bmN0aW9uIGV4dHJhY3RGcm9tQ2FjaGUoIGNhY2hlICkge1xuXG5cdFx0XHR2YXIgdmFsdWVzID0gW107XG5cblx0XHRcdGZvciAoIHZhciBrZXkgaW4gY2FjaGUgKSB7XG5cblx0XHRcdFx0dmFyIGRhdGEgPSBjYWNoZVsga2V5IF07XG5cdFx0XHRcdGRlbGV0ZSBkYXRhLm1ldGFkYXRhO1xuXHRcdFx0XHR2YWx1ZXMucHVzaCggZGF0YSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB2YWx1ZXM7XG5cblx0XHR9XG5cblx0XHRpZiAoIGlzUm9vdCApIHtcblxuXHRcdFx0dmFyIHRleHR1cmVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS50ZXh0dXJlcyApO1xuXHRcdFx0dmFyIGltYWdlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuaW1hZ2VzICk7XG5cblx0XHRcdGlmICggdGV4dHVyZXMubGVuZ3RoID4gMCApIGRhdGEudGV4dHVyZXMgPSB0ZXh0dXJlcztcblx0XHRcdGlmICggaW1hZ2VzLmxlbmd0aCA+IDAgKSBkYXRhLmltYWdlcyA9IGltYWdlcztcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHR0aGlzLmZvZyA9IHNvdXJjZS5mb2c7XG5cdFx0dGhpcy5saWdodHMgPSBzb3VyY2UubGlnaHRzO1xuXG5cdFx0dGhpcy5ibGVuZGluZyA9IHNvdXJjZS5ibGVuZGluZztcblx0XHR0aGlzLnNpZGUgPSBzb3VyY2Uuc2lkZTtcblx0XHR0aGlzLmZsYXRTaGFkaW5nID0gc291cmNlLmZsYXRTaGFkaW5nO1xuXHRcdHRoaXMudmVydGV4Q29sb3JzID0gc291cmNlLnZlcnRleENvbG9ycztcblxuXHRcdHRoaXMub3BhY2l0eSA9IHNvdXJjZS5vcGFjaXR5O1xuXHRcdHRoaXMudHJhbnNwYXJlbnQgPSBzb3VyY2UudHJhbnNwYXJlbnQ7XG5cblx0XHR0aGlzLmJsZW5kU3JjID0gc291cmNlLmJsZW5kU3JjO1xuXHRcdHRoaXMuYmxlbmREc3QgPSBzb3VyY2UuYmxlbmREc3Q7XG5cdFx0dGhpcy5ibGVuZEVxdWF0aW9uID0gc291cmNlLmJsZW5kRXF1YXRpb247XG5cdFx0dGhpcy5ibGVuZFNyY0FscGhhID0gc291cmNlLmJsZW5kU3JjQWxwaGE7XG5cdFx0dGhpcy5ibGVuZERzdEFscGhhID0gc291cmNlLmJsZW5kRHN0QWxwaGE7XG5cdFx0dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEgPSBzb3VyY2UuYmxlbmRFcXVhdGlvbkFscGhhO1xuXG5cdFx0dGhpcy5kZXB0aEZ1bmMgPSBzb3VyY2UuZGVwdGhGdW5jO1xuXHRcdHRoaXMuZGVwdGhUZXN0ID0gc291cmNlLmRlcHRoVGVzdDtcblx0XHR0aGlzLmRlcHRoV3JpdGUgPSBzb3VyY2UuZGVwdGhXcml0ZTtcblxuXHRcdHRoaXMuY29sb3JXcml0ZSA9IHNvdXJjZS5jb2xvcldyaXRlO1xuXG5cdFx0dGhpcy5wcmVjaXNpb24gPSBzb3VyY2UucHJlY2lzaW9uO1xuXG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0ID0gc291cmNlLnBvbHlnb25PZmZzZXQ7XG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yID0gc291cmNlLnBvbHlnb25PZmZzZXRGYWN0b3I7XG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMgPSBzb3VyY2UucG9seWdvbk9mZnNldFVuaXRzO1xuXG5cdFx0dGhpcy5kaXRoZXJpbmcgPSBzb3VyY2UuZGl0aGVyaW5nO1xuXG5cdFx0dGhpcy5hbHBoYVRlc3QgPSBzb3VyY2UuYWxwaGFUZXN0O1xuXHRcdHRoaXMucHJlbXVsdGlwbGllZEFscGhhID0gc291cmNlLnByZW11bHRpcGxpZWRBbHBoYTtcblxuXHRcdHRoaXMub3ZlcmRyYXcgPSBzb3VyY2Uub3ZlcmRyYXc7XG5cblx0XHR0aGlzLnZpc2libGUgPSBzb3VyY2UudmlzaWJsZTtcblx0XHR0aGlzLnVzZXJEYXRhID0gSlNPTi5wYXJzZSggSlNPTi5zdHJpbmdpZnkoIHNvdXJjZS51c2VyRGF0YSApICk7XG5cblx0XHR0aGlzLmNsaXBTaGFkb3dzID0gc291cmNlLmNsaXBTaGFkb3dzO1xuXHRcdHRoaXMuY2xpcEludGVyc2VjdGlvbiA9IHNvdXJjZS5jbGlwSW50ZXJzZWN0aW9uO1xuXG5cdFx0dmFyIHNyY1BsYW5lcyA9IHNvdXJjZS5jbGlwcGluZ1BsYW5lcyxcblx0XHRcdGRzdFBsYW5lcyA9IG51bGw7XG5cblx0XHRpZiAoIHNyY1BsYW5lcyAhPT0gbnVsbCApIHtcblxuXHRcdFx0dmFyIG4gPSBzcmNQbGFuZXMubGVuZ3RoO1xuXHRcdFx0ZHN0UGxhbmVzID0gbmV3IEFycmF5KCBuICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbjsgKysgaSApXG5cdFx0XHRcdGRzdFBsYW5lc1sgaSBdID0gc3JjUGxhbmVzWyBpIF0uY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY2xpcHBpbmdQbGFuZXMgPSBkc3RQbGFuZXM7XG5cblx0XHR0aGlzLnNoYWRvd1NpZGUgPSBzb3VyY2Uuc2hhZG93U2lkZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIHNwZWN1bGFyTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgZW52TWFwOiBuZXcgVEhSRUUuQ3ViZVRleHR1cmUoIFtwb3N4LCBuZWd4LCBwb3N5LCBuZWd5LCBwb3N6LCBuZWd6XSApLFxuICogIGNvbWJpbmU6IFRIUkVFLk11bHRpcGx5LFxuICogIHJlZmxlY3Rpdml0eTogPGZsb2F0PixcbiAqICByZWZyYWN0aW9uUmF0aW86IDxmbG9hdD4sXG4gKlxuICogIGRlcHRoVGVzdDogPGJvb2w+LFxuICogIGRlcHRoV3JpdGU6IDxib29sPixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaEJhc2ljTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoQmFzaWNNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZW1pc3NpdmVcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5saWdodE1hcCA9IG51bGw7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5hb01hcCA9IG51bGw7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHR0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9wZXJhdGlvbjtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSAxO1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cblx0dGhpcy5saWdodHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hCYXNpY01hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaEJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaEJhc2ljTWF0ZXJpYWw7XG5cbk1lc2hCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hCYXNpY01hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaEJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcblx0dGhpcy5jb21iaW5lID0gc291cmNlLmNvbWJpbmU7XG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTtcblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGRlZmluZXM6IHsgXCJsYWJlbFwiIDogXCJ2YWx1ZVwiIH0sXG4gKiAgdW5pZm9ybXM6IHsgXCJwYXJhbWV0ZXIxXCI6IHsgdmFsdWU6IDEuMCB9LCBcInBhcmFtZXRlcjJcIjogeyB2YWx1ZTI6IDIgfSB9LFxuICpcbiAqICBmcmFnbWVudFNoYWRlcjogPHN0cmluZz4sXG4gKiAgdmVydGV4U2hhZGVyOiA8c3RyaW5nPixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBsaWdodHM6IDxib29sPixcbiAqXG4gKiAgc2tpbm5pbmc6IDxib29sPixcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPixcbiAqICBtb3JwaE5vcm1hbHM6IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIFNoYWRlck1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU2hhZGVyTWF0ZXJpYWwnO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHt9O1xuXHR0aGlzLnVuaWZvcm1zID0ge307XG5cblx0dGhpcy52ZXJ0ZXhTaGFkZXIgPSAndm9pZCBtYWluKCkge1xcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcXG59Jztcblx0dGhpcy5mcmFnbWVudFNoYWRlciA9ICd2b2lkIG1haW4oKSB7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggMS4wLCAwLjAsIDAuMCwgMS4wICk7XFxufSc7XG5cblx0dGhpcy5saW5ld2lkdGggPSAxO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblxuXHR0aGlzLmZvZyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHNjZW5lIGZvZ1xuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHNjZW5lIGxpZ2h0c1xuXHR0aGlzLmNsaXBwaW5nID0gZmFsc2U7IC8vIHNldCB0byB1c2UgdXNlci1kZWZpbmVkIGNsaXBwaW5nIHBsYW5lc1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBza2lubmluZyBhdHRyaWJ1dGUgc3RyZWFtc1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIG1vcnBoIHRhcmdldHNcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBtb3JwaCBub3JtYWxzXG5cblx0dGhpcy5leHRlbnNpb25zID0ge1xuXHRcdGRlcml2YXRpdmVzOiBmYWxzZSwgLy8gc2V0IHRvIHVzZSBkZXJpdmF0aXZlc1xuXHRcdGZyYWdEZXB0aDogZmFsc2UsIC8vIHNldCB0byB1c2UgZnJhZ21lbnQgZGVwdGggdmFsdWVzXG5cdFx0ZHJhd0J1ZmZlcnM6IGZhbHNlLCAvLyBzZXQgdG8gdXNlIGRyYXcgYnVmZmVyc1xuXHRcdHNoYWRlclRleHR1cmVMT0Q6IGZhbHNlIC8vIHNldCB0byB1c2Ugc2hhZGVyIHRleHR1cmUgTE9EXG5cdH07XG5cblx0Ly8gV2hlbiByZW5kZXJlZCBnZW9tZXRyeSBkb2Vzbid0IGluY2x1ZGUgdGhlc2UgYXR0cmlidXRlcyBidXQgdGhlIG1hdGVyaWFsIGRvZXMsXG5cdC8vIHVzZSB0aGVzZSBkZWZhdWx0IHZhbHVlcyBpbiBXZWJHTC4gVGhpcyBhdm9pZHMgZXJyb3JzIHdoZW4gYnVmZmVyIGRhdGEgaXMgbWlzc2luZy5cblx0dGhpcy5kZWZhdWx0QXR0cmlidXRlVmFsdWVzID0ge1xuXHRcdCdjb2xvcic6IFsgMSwgMSwgMSBdLFxuXHRcdCd1dic6IFsgMCwgMCBdLFxuXHRcdCd1djInOiBbIDAsIDAgXVxuXHR9O1xuXG5cdHRoaXMuaW5kZXgwQXR0cmlidXRlTmFtZSA9IHVuZGVmaW5lZDtcblx0dGhpcy51bmlmb3Jtc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRpZiAoIHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGlmICggcGFyYW1ldGVycy5hdHRyaWJ1dGVzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TaGFkZXJNYXRlcmlhbDogYXR0cmlidXRlcyBzaG91bGQgbm93IGJlIGRlZmluZWQgaW4gVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG5cdH1cblxufVxuXG5TaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcblNoYWRlck1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNoYWRlck1hdGVyaWFsO1xuXG5TaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuaXNTaGFkZXJNYXRlcmlhbCA9IHRydWU7XG5cblNoYWRlck1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5mcmFnbWVudFNoYWRlciA9IHNvdXJjZS5mcmFnbWVudFNoYWRlcjtcblx0dGhpcy52ZXJ0ZXhTaGFkZXIgPSBzb3VyY2UudmVydGV4U2hhZGVyO1xuXG5cdHRoaXMudW5pZm9ybXMgPSBVbmlmb3Jtc1V0aWxzLmNsb25lKCBzb3VyY2UudW5pZm9ybXMgKTtcblxuXHR0aGlzLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLmRlZmluZXMgKTtcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblxuXHR0aGlzLmxpZ2h0cyA9IHNvdXJjZS5saWdodHM7XG5cdHRoaXMuY2xpcHBpbmcgPSBzb3VyY2UuY2xpcHBpbmc7XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblxuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHR0aGlzLmV4dGVuc2lvbnMgPSBzb3VyY2UuZXh0ZW5zaW9ucztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHR2YXIgZGF0YSA9IE1hdGVyaWFsLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdGRhdGEudW5pZm9ybXMgPSB0aGlzLnVuaWZvcm1zO1xuXHRkYXRhLnZlcnRleFNoYWRlciA9IHRoaXMudmVydGV4U2hhZGVyO1xuXHRkYXRhLmZyYWdtZW50U2hhZGVyID0gdGhpcy5mcmFnbWVudFNoYWRlcjtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuZnVuY3Rpb24gUmF5KCBvcmlnaW4sIGRpcmVjdGlvbiApIHtcblxuXHR0aGlzLm9yaWdpbiA9ICggb3JpZ2luICE9PSB1bmRlZmluZWQgKSA/IG9yaWdpbiA6IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMuZGlyZWN0aW9uID0gKCBkaXJlY3Rpb24gIT09IHVuZGVmaW5lZCApID8gZGlyZWN0aW9uIDogbmV3IFZlY3RvcjMoKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBSYXkucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIG9yaWdpbiwgZGlyZWN0aW9uICkge1xuXG5cdFx0dGhpcy5vcmlnaW4uY29weSggb3JpZ2luICk7XG5cdFx0dGhpcy5kaXJlY3Rpb24uY29weSggZGlyZWN0aW9uICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHJheSApIHtcblxuXHRcdHRoaXMub3JpZ2luLmNvcHkoIHJheS5vcmlnaW4gKTtcblx0XHR0aGlzLmRpcmVjdGlvbi5jb3B5KCByYXkuZGlyZWN0aW9uICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGF0OiBmdW5jdGlvbiAoIHQsIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheTogLmF0KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMuZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMub3JpZ2luICk7XG5cblx0fSxcblxuXHRsb29rQXQ6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMuZGlyZWN0aW9uLmNvcHkoIHYgKS5zdWIoIHRoaXMub3JpZ2luICkubm9ybWFsaXplKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJlY2FzdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByZWNhc3QoIHQgKSB7XG5cblx0XHRcdHRoaXMub3JpZ2luLmNvcHkoIHRoaXMuYXQoIHQsIHYxICkgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbG9zZXN0UG9pbnRUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXk6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHR0YXJnZXQuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMub3JpZ2luICk7XG5cblx0XHR2YXIgZGlyZWN0aW9uRGlzdGFuY2UgPSB0YXJnZXQuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXG5cdFx0aWYgKCBkaXJlY3Rpb25EaXN0YW5jZSA8IDAgKSB7XG5cblx0XHRcdHJldHVybiB0YXJnZXQuY29weSggdGhpcy5vcmlnaW4gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggZGlyZWN0aW9uRGlzdGFuY2UgKS5hZGQoIHRoaXMub3JpZ2luICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLmRpc3RhbmNlU3FUb1BvaW50KCBwb2ludCApICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVNxVG9Qb2ludDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBkaXN0YW5jZVNxVG9Qb2ludCggcG9pbnQgKSB7XG5cblx0XHRcdHZhciBkaXJlY3Rpb25EaXN0YW5jZSA9IHYxLnN1YlZlY3RvcnMoIHBvaW50LCB0aGlzLm9yaWdpbiApLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblxuXHRcdFx0Ly8gcG9pbnQgYmVoaW5kIHRoZSByYXlcblxuXHRcdFx0aWYgKCBkaXJlY3Rpb25EaXN0YW5jZSA8IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXMub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHYxLmNvcHkoIHRoaXMuZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIGRpcmVjdGlvbkRpc3RhbmNlICkuYWRkKCB0aGlzLm9yaWdpbiApO1xuXG5cdFx0XHRyZXR1cm4gdjEuZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRkaXN0YW5jZVNxVG9TZWdtZW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc2VnQ2VudGVyID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgc2VnRGlyID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgZGlmZiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZGlzdGFuY2VTcVRvU2VnbWVudCggdjAsIHYxLCBvcHRpb25hbFBvaW50T25SYXksIG9wdGlvbmFsUG9pbnRPblNlZ21lbnQgKSB7XG5cblx0XHRcdC8vIGZyb20gaHR0cDovL3d3dy5nZW9tZXRyaWN0b29scy5jb20vR1RFbmdpbmUvSW5jbHVkZS9NYXRoZW1hdGljcy9HdGVEaXN0UmF5U2VnbWVudC5oXG5cdFx0XHQvLyBJdCByZXR1cm5zIHRoZSBtaW4gZGlzdGFuY2UgYmV0d2VlbiB0aGUgcmF5IGFuZCB0aGUgc2VnbWVudFxuXHRcdFx0Ly8gZGVmaW5lZCBieSB2MCBhbmQgdjFcblx0XHRcdC8vIEl0IGNhbiBhbHNvIHNldCB0d28gb3B0aW9uYWwgdGFyZ2V0cyA6XG5cdFx0XHQvLyAtIFRoZSBjbG9zZXN0IHBvaW50IG9uIHRoZSByYXlcblx0XHRcdC8vIC0gVGhlIGNsb3Nlc3QgcG9pbnQgb24gdGhlIHNlZ21lbnRcblxuXHRcdFx0c2VnQ2VudGVyLmNvcHkoIHYwICkuYWRkKCB2MSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblx0XHRcdHNlZ0Rpci5jb3B5KCB2MSApLnN1YiggdjAgKS5ub3JtYWxpemUoKTtcblx0XHRcdGRpZmYuY29weSggdGhpcy5vcmlnaW4gKS5zdWIoIHNlZ0NlbnRlciApO1xuXG5cdFx0XHR2YXIgc2VnRXh0ZW50ID0gdjAuZGlzdGFuY2VUbyggdjEgKSAqIDAuNTtcblx0XHRcdHZhciBhMDEgPSAtIHRoaXMuZGlyZWN0aW9uLmRvdCggc2VnRGlyICk7XG5cdFx0XHR2YXIgYjAgPSBkaWZmLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblx0XHRcdHZhciBiMSA9IC0gZGlmZi5kb3QoIHNlZ0RpciApO1xuXHRcdFx0dmFyIGMgPSBkaWZmLmxlbmd0aFNxKCk7XG5cdFx0XHR2YXIgZGV0ID0gTWF0aC5hYnMoIDEgLSBhMDEgKiBhMDEgKTtcblx0XHRcdHZhciBzMCwgczEsIHNxckRpc3QsIGV4dERldDtcblxuXHRcdFx0aWYgKCBkZXQgPiAwICkge1xuXG5cdFx0XHRcdC8vIFRoZSByYXkgYW5kIHNlZ21lbnQgYXJlIG5vdCBwYXJhbGxlbC5cblxuXHRcdFx0XHRzMCA9IGEwMSAqIGIxIC0gYjA7XG5cdFx0XHRcdHMxID0gYTAxICogYjAgLSBiMTtcblx0XHRcdFx0ZXh0RGV0ID0gc2VnRXh0ZW50ICogZGV0O1xuXG5cdFx0XHRcdGlmICggczAgPj0gMCApIHtcblxuXHRcdFx0XHRcdGlmICggczEgPj0gLSBleHREZXQgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggczEgPD0gZXh0RGV0ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIHJlZ2lvbiAwXG5cdFx0XHRcdFx0XHRcdC8vIE1pbmltdW0gYXQgaW50ZXJpb3IgcG9pbnRzIG9mIHJheSBhbmQgc2VnbWVudC5cblxuXHRcdFx0XHRcdFx0XHR2YXIgaW52RGV0ID0gMSAvIGRldDtcblx0XHRcdFx0XHRcdFx0czAgKj0gaW52RGV0O1xuXHRcdFx0XHRcdFx0XHRzMSAqPSBpbnZEZXQ7XG5cdFx0XHRcdFx0XHRcdHNxckRpc3QgPSBzMCAqICggczAgKyBhMDEgKiBzMSArIDIgKiBiMCApICsgczEgKiAoIGEwMSAqIHMwICsgczEgKyAyICogYjEgKSArIGM7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDFcblxuXHRcdFx0XHRcdFx0XHRzMSA9IHNlZ0V4dGVudDtcblx0XHRcdFx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHMxICsgYjAgKSApO1xuXHRcdFx0XHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHQvLyByZWdpb24gNVxuXG5cdFx0XHRcdFx0XHRzMSA9IC0gc2VnRXh0ZW50O1xuXHRcdFx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHMxICsgYjAgKSApO1xuXHRcdFx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aWYgKCBzMSA8PSAtIGV4dERldCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDRcblxuXHRcdFx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIC0gYTAxICogc2VnRXh0ZW50ICsgYjAgKSApO1xuXHRcdFx0XHRcdFx0czEgPSAoIHMwID4gMCApID8gLSBzZWdFeHRlbnQgOiBNYXRoLm1pbiggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApO1xuXHRcdFx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIHMxIDw9IGV4dERldCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDNcblxuXHRcdFx0XHRcdFx0czAgPSAwO1xuXHRcdFx0XHRcdFx0czEgPSBNYXRoLm1pbiggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApO1xuXHRcdFx0XHRcdFx0c3FyRGlzdCA9IHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdC8vIHJlZ2lvbiAyXG5cblx0XHRcdFx0XHRcdHMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzZWdFeHRlbnQgKyBiMCApICk7XG5cdFx0XHRcdFx0XHRzMSA9ICggczAgPiAwICkgPyBzZWdFeHRlbnQgOiBNYXRoLm1pbiggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApO1xuXHRcdFx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gUmF5IGFuZCBzZWdtZW50IGFyZSBwYXJhbGxlbC5cblxuXHRcdFx0XHRzMSA9ICggYTAxID4gMCApID8gLSBzZWdFeHRlbnQgOiBzZWdFeHRlbnQ7XG5cdFx0XHRcdHMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzMSArIGIwICkgKTtcblx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG9wdGlvbmFsUG9pbnRPblJheSApIHtcblxuXHRcdFx0XHRvcHRpb25hbFBvaW50T25SYXkuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggczAgKS5hZGQoIHRoaXMub3JpZ2luICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBvcHRpb25hbFBvaW50T25TZWdtZW50ICkge1xuXG5cdFx0XHRcdG9wdGlvbmFsUG9pbnRPblNlZ21lbnQuY29weSggc2VnRGlyICkubXVsdGlwbHlTY2FsYXIoIHMxICkuYWRkKCBzZWdDZW50ZXIgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gc3FyRGlzdDtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdFNwaGVyZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RTcGhlcmUoIHNwaGVyZSwgdGFyZ2V0ICkge1xuXG5cdFx0XHR2MS5zdWJWZWN0b3JzKCBzcGhlcmUuY2VudGVyLCB0aGlzLm9yaWdpbiApO1xuXHRcdFx0dmFyIHRjYSA9IHYxLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblx0XHRcdHZhciBkMiA9IHYxLmRvdCggdjEgKSAtIHRjYSAqIHRjYTtcblx0XHRcdHZhciByYWRpdXMyID0gc3BoZXJlLnJhZGl1cyAqIHNwaGVyZS5yYWRpdXM7XG5cblx0XHRcdGlmICggZDIgPiByYWRpdXMyICkgcmV0dXJuIG51bGw7XG5cblx0XHRcdHZhciB0aGMgPSBNYXRoLnNxcnQoIHJhZGl1czIgLSBkMiApO1xuXG5cdFx0XHQvLyB0MCA9IGZpcnN0IGludGVyc2VjdCBwb2ludCAtIGVudHJhbmNlIG9uIGZyb250IG9mIHNwaGVyZVxuXHRcdFx0dmFyIHQwID0gdGNhIC0gdGhjO1xuXG5cdFx0XHQvLyB0MSA9IHNlY29uZCBpbnRlcnNlY3QgcG9pbnQgLSBleGl0IHBvaW50IG9uIGJhY2sgb2Ygc3BoZXJlXG5cdFx0XHR2YXIgdDEgPSB0Y2EgKyB0aGM7XG5cblx0XHRcdC8vIHRlc3QgdG8gc2VlIGlmIGJvdGggdDAgYW5kIHQxIGFyZSBiZWhpbmQgdGhlIHJheSAtIGlmIHNvLCByZXR1cm4gbnVsbFxuXHRcdFx0aWYgKCB0MCA8IDAgJiYgdDEgPCAwICkgcmV0dXJuIG51bGw7XG5cblx0XHRcdC8vIHRlc3QgdG8gc2VlIGlmIHQwIGlzIGJlaGluZCB0aGUgcmF5OlxuXHRcdFx0Ly8gaWYgaXQgaXMsIHRoZSByYXkgaXMgaW5zaWRlIHRoZSBzcGhlcmUsIHNvIHJldHVybiB0aGUgc2Vjb25kIGV4aXQgcG9pbnQgc2NhbGVkIGJ5IHQxLFxuXHRcdFx0Ly8gaW4gb3JkZXIgdG8gYWx3YXlzIHJldHVybiBhbiBpbnRlcnNlY3QgcG9pbnQgdGhhdCBpcyBpbiBmcm9udCBvZiB0aGUgcmF5LlxuXHRcdFx0aWYgKCB0MCA8IDAgKSByZXR1cm4gdGhpcy5hdCggdDEsIHRhcmdldCApO1xuXG5cdFx0XHQvLyBlbHNlIHQwIGlzIGluIGZyb250IG9mIHRoZSByYXksIHNvIHJldHVybiB0aGUgZmlyc3QgY29sbGlzaW9uIHBvaW50IHNjYWxlZCBieSB0MFxuXHRcdFx0cmV0dXJuIHRoaXMuYXQoIHQwLCB0YXJnZXQgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBzcGhlcmUuY2VudGVyICkgPD0gc3BoZXJlLnJhZGl1cztcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9QbGFuZTogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdHZhciBkZW5vbWluYXRvciA9IHBsYW5lLm5vcm1hbC5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XG5cblx0XHRpZiAoIGRlbm9taW5hdG9yID09PSAwICkge1xuXG5cdFx0XHQvLyBsaW5lIGlzIGNvcGxhbmFyLCByZXR1cm4gb3JpZ2luXG5cdFx0XHRpZiAoIHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggdGhpcy5vcmlnaW4gKSA9PT0gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gMDtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBOdWxsIGlzIHByZWZlcmFibGUgdG8gdW5kZWZpbmVkIHNpbmNlIHVuZGVmaW5lZCBtZWFucy4uLi4gaXQgaXMgdW5kZWZpbmVkXG5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHQgPSAtICggdGhpcy5vcmlnaW4uZG90KCBwbGFuZS5ub3JtYWwgKSArIHBsYW5lLmNvbnN0YW50ICkgLyBkZW5vbWluYXRvcjtcblxuXHRcdC8vIFJldHVybiBpZiB0aGUgcmF5IG5ldmVyIGludGVyc2VjdHMgdGhlIHBsYW5lXG5cblx0XHRyZXR1cm4gdCA+PSAwID8gdCA6IG51bGw7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RQbGFuZTogZnVuY3Rpb24gKCBwbGFuZSwgdGFyZ2V0ICkge1xuXG5cdFx0dmFyIHQgPSB0aGlzLmRpc3RhbmNlVG9QbGFuZSggcGxhbmUgKTtcblxuXHRcdGlmICggdCA9PT0gbnVsbCApIHtcblxuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5hdCggdCwgdGFyZ2V0ICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzUGxhbmU6IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0XHQvLyBjaGVjayBpZiB0aGUgcmF5IGxpZXMgb24gdGhlIHBsYW5lIGZpcnN0XG5cblx0XHR2YXIgZGlzdFRvUG9pbnQgPSBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHRoaXMub3JpZ2luICk7XG5cblx0XHRpZiAoIGRpc3RUb1BvaW50ID09PSAwICkge1xuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdHZhciBkZW5vbWluYXRvciA9IHBsYW5lLm5vcm1hbC5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XG5cblx0XHRpZiAoIGRlbm9taW5hdG9yICogZGlzdFRvUG9pbnQgPCAwICkge1xuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdC8vIHJheSBvcmlnaW4gaXMgYmVoaW5kIHRoZSBwbGFuZSAoYW5kIGlzIHBvaW50aW5nIGJlaGluZCBpdClcblxuXHRcdHJldHVybiBmYWxzZTtcblxuXHR9LFxuXG5cdGludGVyc2VjdEJveDogZnVuY3Rpb24gKCBib3gsIHRhcmdldCApIHtcblxuXHRcdHZhciB0bWluLCB0bWF4LCB0eW1pbiwgdHltYXgsIHR6bWluLCB0em1heDtcblxuXHRcdHZhciBpbnZkaXJ4ID0gMSAvIHRoaXMuZGlyZWN0aW9uLngsXG5cdFx0XHRpbnZkaXJ5ID0gMSAvIHRoaXMuZGlyZWN0aW9uLnksXG5cdFx0XHRpbnZkaXJ6ID0gMSAvIHRoaXMuZGlyZWN0aW9uLno7XG5cblx0XHR2YXIgb3JpZ2luID0gdGhpcy5vcmlnaW47XG5cblx0XHRpZiAoIGludmRpcnggPj0gMCApIHtcblxuXHRcdFx0dG1pbiA9ICggYm94Lm1pbi54IC0gb3JpZ2luLnggKSAqIGludmRpcng7XG5cdFx0XHR0bWF4ID0gKCBib3gubWF4LnggLSBvcmlnaW4ueCApICogaW52ZGlyeDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRtaW4gPSAoIGJveC5tYXgueCAtIG9yaWdpbi54ICkgKiBpbnZkaXJ4O1xuXHRcdFx0dG1heCA9ICggYm94Lm1pbi54IC0gb3JpZ2luLnggKSAqIGludmRpcng7XG5cblx0XHR9XG5cblx0XHRpZiAoIGludmRpcnkgPj0gMCApIHtcblxuXHRcdFx0dHltaW4gPSAoIGJveC5taW4ueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXHRcdFx0dHltYXggPSAoIGJveC5tYXgueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dHltaW4gPSAoIGJveC5tYXgueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXHRcdFx0dHltYXggPSAoIGJveC5taW4ueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCAoIHRtaW4gPiB0eW1heCApIHx8ICggdHltaW4gPiB0bWF4ICkgKSByZXR1cm4gbnVsbDtcblxuXHRcdC8vIFRoZXNlIGxpbmVzIGFsc28gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRtaW4gb3IgdG1heCBpcyBOYU5cblx0XHQvLyAocmVzdWx0IG9mIDAgKiBJbmZpbml0eSkuIHggIT09IHggcmV0dXJucyB0cnVlIGlmIHggaXMgTmFOXG5cblx0XHRpZiAoIHR5bWluID4gdG1pbiB8fCB0bWluICE9PSB0bWluICkgdG1pbiA9IHR5bWluO1xuXG5cdFx0aWYgKCB0eW1heCA8IHRtYXggfHwgdG1heCAhPT0gdG1heCApIHRtYXggPSB0eW1heDtcblxuXHRcdGlmICggaW52ZGlyeiA+PSAwICkge1xuXG5cdFx0XHR0em1pbiA9ICggYm94Lm1pbi56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cdFx0XHR0em1heCA9ICggYm94Lm1heC56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0em1pbiA9ICggYm94Lm1heC56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cdFx0XHR0em1heCA9ICggYm94Lm1pbi56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cblx0XHR9XG5cblx0XHRpZiAoICggdG1pbiA+IHR6bWF4ICkgfHwgKCB0em1pbiA+IHRtYXggKSApIHJldHVybiBudWxsO1xuXG5cdFx0aWYgKCB0em1pbiA+IHRtaW4gfHwgdG1pbiAhPT0gdG1pbiApIHRtaW4gPSB0em1pbjtcblxuXHRcdGlmICggdHptYXggPCB0bWF4IHx8IHRtYXggIT09IHRtYXggKSB0bWF4ID0gdHptYXg7XG5cblx0XHQvL3JldHVybiBwb2ludCBjbG9zZXN0IHRvIHRoZSByYXkgKHBvc2l0aXZlIHNpZGUpXG5cblx0XHRpZiAoIHRtYXggPCAwICkgcmV0dXJuIG51bGw7XG5cblx0XHRyZXR1cm4gdGhpcy5hdCggdG1pbiA+PSAwID8gdG1pbiA6IHRtYXgsIHRhcmdldCApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c0JveDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0c0JveCggYm94ICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RCb3goIGJveCwgdiApICE9PSBudWxsO1xuXG5cdFx0fTtcblxuXHR9ICkoKSxcblxuXHRpbnRlcnNlY3RUcmlhbmdsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gQ29tcHV0ZSB0aGUgb2Zmc2V0IG9yaWdpbiwgZWRnZXMsIGFuZCBub3JtYWwuXG5cdFx0dmFyIGRpZmYgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBlZGdlMSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGVkZ2UyID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RUcmlhbmdsZSggYSwgYiwgYywgYmFja2ZhY2VDdWxsaW5nLCB0YXJnZXQgKSB7XG5cblx0XHRcdC8vIGZyb20gaHR0cDovL3d3dy5nZW9tZXRyaWN0b29scy5jb20vR1RFbmdpbmUvSW5jbHVkZS9NYXRoZW1hdGljcy9HdGVJbnRyUmF5M1RyaWFuZ2xlMy5oXG5cblx0XHRcdGVkZ2UxLnN1YlZlY3RvcnMoIGIsIGEgKTtcblx0XHRcdGVkZ2UyLnN1YlZlY3RvcnMoIGMsIGEgKTtcblx0XHRcdG5vcm1hbC5jcm9zc1ZlY3RvcnMoIGVkZ2UxLCBlZGdlMiApO1xuXG5cdFx0XHQvLyBTb2x2ZSBRICsgdCpEID0gYjEqRTEgKyBiMipFMiAoUSA9IGtEaWZmLCBEID0gcmF5IGRpcmVjdGlvbixcblx0XHRcdC8vIEUxID0ga0VkZ2UxLCBFMiA9IGtFZGdlMiwgTiA9IENyb3NzKEUxLEUyKSkgYnlcblx0XHRcdC8vICAgfERvdChELE4pfCpiMSA9IHNpZ24oRG90KEQsTikpKkRvdChELENyb3NzKFEsRTIpKVxuXHRcdFx0Ly8gICB8RG90KEQsTil8KmIyID0gc2lnbihEb3QoRCxOKSkqRG90KEQsQ3Jvc3MoRTEsUSkpXG5cdFx0XHQvLyAgIHxEb3QoRCxOKXwqdCA9IC1zaWduKERvdChELE4pKSpEb3QoUSxOKVxuXHRcdFx0dmFyIERkTiA9IHRoaXMuZGlyZWN0aW9uLmRvdCggbm9ybWFsICk7XG5cdFx0XHR2YXIgc2lnbjtcblxuXHRcdFx0aWYgKCBEZE4gPiAwICkge1xuXG5cdFx0XHRcdGlmICggYmFja2ZhY2VDdWxsaW5nICkgcmV0dXJuIG51bGw7XG5cdFx0XHRcdHNpZ24gPSAxO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBEZE4gPCAwICkge1xuXG5cdFx0XHRcdHNpZ24gPSAtIDE7XG5cdFx0XHRcdERkTiA9IC0gRGROO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdGRpZmYuc3ViVmVjdG9ycyggdGhpcy5vcmlnaW4sIGEgKTtcblx0XHRcdHZhciBEZFF4RTIgPSBzaWduICogdGhpcy5kaXJlY3Rpb24uZG90KCBlZGdlMi5jcm9zc1ZlY3RvcnMoIGRpZmYsIGVkZ2UyICkgKTtcblxuXHRcdFx0Ly8gYjEgPCAwLCBubyBpbnRlcnNlY3Rpb25cblx0XHRcdGlmICggRGRReEUyIDwgMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgRGRFMXhRID0gc2lnbiAqIHRoaXMuZGlyZWN0aW9uLmRvdCggZWRnZTEuY3Jvc3MoIGRpZmYgKSApO1xuXG5cdFx0XHQvLyBiMiA8IDAsIG5vIGludGVyc2VjdGlvblxuXHRcdFx0aWYgKCBEZEUxeFEgPCAwICkge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGIxK2IyID4gMSwgbm8gaW50ZXJzZWN0aW9uXG5cdFx0XHRpZiAoIERkUXhFMiArIERkRTF4USA+IERkTiApIHtcblxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBMaW5lIGludGVyc2VjdHMgdHJpYW5nbGUsIGNoZWNrIGlmIHJheSBkb2VzLlxuXHRcdFx0dmFyIFFkTiA9IC0gc2lnbiAqIGRpZmYuZG90KCBub3JtYWwgKTtcblxuXHRcdFx0Ly8gdCA8IDAsIG5vIGludGVyc2VjdGlvblxuXHRcdFx0aWYgKCBRZE4gPCAwICkge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIFJheSBpbnRlcnNlY3RzIHRyaWFuZ2xlLlxuXHRcdFx0cmV0dXJuIHRoaXMuYXQoIFFkTiAvIERkTiwgdGFyZ2V0ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbWF0cml4NCApIHtcblxuXHRcdHRoaXMub3JpZ2luLmFwcGx5TWF0cml4NCggbWF0cml4NCApO1xuXHRcdHRoaXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggbWF0cml4NCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggcmF5ICkge1xuXG5cdFx0cmV0dXJuIHJheS5vcmlnaW4uZXF1YWxzKCB0aGlzLm9yaWdpbiApICYmIHJheS5kaXJlY3Rpb24uZXF1YWxzKCB0aGlzLmRpcmVjdGlvbiApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBMaW5lMyggc3RhcnQsIGVuZCApIHtcblxuXHR0aGlzLnN0YXJ0ID0gKCBzdGFydCAhPT0gdW5kZWZpbmVkICkgPyBzdGFydCA6IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMuZW5kID0gKCBlbmQgIT09IHVuZGVmaW5lZCApID8gZW5kIDogbmV3IFZlY3RvcjMoKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBMaW5lMy5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggc3RhcnQsIGVuZCApIHtcblxuXHRcdHRoaXMuc3RhcnQuY29weSggc3RhcnQgKTtcblx0XHR0aGlzLmVuZC5jb3B5KCBlbmQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggbGluZSApIHtcblxuXHRcdHRoaXMuc3RhcnQuY29weSggbGluZS5zdGFydCApO1xuXHRcdHRoaXMuZW5kLmNvcHkoIGxpbmUuZW5kICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldENlbnRlcjogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lMzogLmdldENlbnRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLnN0YXJ0LCB0aGlzLmVuZCApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHR9LFxuXG5cdGRlbHRhOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmUzOiAuZGVsdGEoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuc3ViVmVjdG9ycyggdGhpcy5lbmQsIHRoaXMuc3RhcnQgKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlU3E6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG9TcXVhcmVkKCB0aGlzLmVuZCApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG8oIHRoaXMuZW5kICk7XG5cblx0fSxcblxuXHRhdDogZnVuY3Rpb24gKCB0LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lMzogLmF0KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5kZWx0YSggdGFyZ2V0ICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMuc3RhcnQgKTtcblxuXHR9LFxuXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzdGFydFAgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBzdGFydEVuZCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlciggcG9pbnQsIGNsYW1wVG9MaW5lICkge1xuXG5cdFx0XHRzdGFydFAuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMuc3RhcnQgKTtcblx0XHRcdHN0YXJ0RW5kLnN1YlZlY3RvcnMoIHRoaXMuZW5kLCB0aGlzLnN0YXJ0ICk7XG5cblx0XHRcdHZhciBzdGFydEVuZDIgPSBzdGFydEVuZC5kb3QoIHN0YXJ0RW5kICk7XG5cdFx0XHR2YXIgc3RhcnRFbmRfc3RhcnRQID0gc3RhcnRFbmQuZG90KCBzdGFydFAgKTtcblxuXHRcdFx0dmFyIHQgPSBzdGFydEVuZF9zdGFydFAgLyBzdGFydEVuZDI7XG5cblx0XHRcdGlmICggY2xhbXBUb0xpbmUgKSB7XG5cblx0XHRcdFx0dCA9IF9NYXRoLmNsYW1wKCB0LCAwLCAxICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHQ7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbG9zZXN0UG9pbnRUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50LCBjbGFtcFRvTGluZSwgdGFyZ2V0ICkge1xuXG5cdFx0dmFyIHQgPSB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIoIHBvaW50LCBjbGFtcFRvTGluZSApO1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZTM6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5kZWx0YSggdGFyZ2V0ICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMuc3RhcnQgKTtcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR0aGlzLnN0YXJ0LmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cdFx0dGhpcy5lbmQuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIGxpbmUgKSB7XG5cblx0XHRyZXR1cm4gbGluZS5zdGFydC5lcXVhbHMoIHRoaXMuc3RhcnQgKSAmJiBsaW5lLmVuZC5lcXVhbHMoIHRoaXMuZW5kICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBUcmlhbmdsZSggYSwgYiwgYyApIHtcblxuXHR0aGlzLmEgPSAoIGEgIT09IHVuZGVmaW5lZCApID8gYSA6IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMuYiA9ICggYiAhPT0gdW5kZWZpbmVkICkgPyBiIDogbmV3IFZlY3RvcjMoKTtcblx0dGhpcy5jID0gKCBjICE9PSB1bmRlZmluZWQgKSA/IGMgOiBuZXcgVmVjdG9yMygpO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFRyaWFuZ2xlLCB7XG5cblx0Z2V0Tm9ybWFsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjAgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldE5vcm1hbCggYSwgYiwgYywgdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuZ2V0Tm9ybWFsKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0YXJnZXQuc3ViVmVjdG9ycyggYywgYiApO1xuXHRcdFx0djAuc3ViVmVjdG9ycyggYSwgYiApO1xuXHRcdFx0dGFyZ2V0LmNyb3NzKCB2MCApO1xuXG5cdFx0XHR2YXIgdGFyZ2V0TGVuZ3RoU3EgPSB0YXJnZXQubGVuZ3RoU3EoKTtcblx0XHRcdGlmICggdGFyZ2V0TGVuZ3RoU3EgPiAwICkge1xuXG5cdFx0XHRcdHJldHVybiB0YXJnZXQubXVsdGlwbHlTY2FsYXIoIDEgLyBNYXRoLnNxcnQoIHRhcmdldExlbmd0aFNxICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LnNldCggMCwgMCwgMCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Ly8gc3RhdGljL2luc3RhbmNlIG1ldGhvZCB0byBjYWxjdWxhdGUgYmFyeWNlbnRyaWMgY29vcmRpbmF0ZXNcblx0Ly8gYmFzZWQgb246IGh0dHA6Ly93d3cuYmxhY2twYXduLmNvbS90ZXh0cy9wb2ludGlucG9seS9kZWZhdWx0Lmh0bWxcblx0Z2V0QmFyeWNvb3JkOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjAgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRCYXJ5Y29vcmQoIHBvaW50LCBhLCBiLCBjLCB0YXJnZXQgKSB7XG5cblx0XHRcdHYwLnN1YlZlY3RvcnMoIGMsIGEgKTtcblx0XHRcdHYxLnN1YlZlY3RvcnMoIGIsIGEgKTtcblx0XHRcdHYyLnN1YlZlY3RvcnMoIHBvaW50LCBhICk7XG5cblx0XHRcdHZhciBkb3QwMCA9IHYwLmRvdCggdjAgKTtcblx0XHRcdHZhciBkb3QwMSA9IHYwLmRvdCggdjEgKTtcblx0XHRcdHZhciBkb3QwMiA9IHYwLmRvdCggdjIgKTtcblx0XHRcdHZhciBkb3QxMSA9IHYxLmRvdCggdjEgKTtcblx0XHRcdHZhciBkb3QxMiA9IHYxLmRvdCggdjIgKTtcblxuXHRcdFx0dmFyIGRlbm9tID0gKCBkb3QwMCAqIGRvdDExIC0gZG90MDEgKiBkb3QwMSApO1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuZ2V0QmFyeWNvb3JkKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBjb2xsaW5lYXIgb3Igc2luZ3VsYXIgdHJpYW5nbGVcblx0XHRcdGlmICggZGVub20gPT09IDAgKSB7XG5cblx0XHRcdFx0Ly8gYXJiaXRyYXJ5IGxvY2F0aW9uIG91dHNpZGUgb2YgdHJpYW5nbGU/XG5cdFx0XHRcdC8vIG5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIGJlc3QgaWRlYSwgbWF5YmUgc2hvdWxkIGJlIHJldHVybmluZyB1bmRlZmluZWRcblx0XHRcdFx0cmV0dXJuIHRhcmdldC5zZXQoIC0gMiwgLSAxLCAtIDEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgaW52RGVub20gPSAxIC8gZGVub207XG5cdFx0XHR2YXIgdSA9ICggZG90MTEgKiBkb3QwMiAtIGRvdDAxICogZG90MTIgKSAqIGludkRlbm9tO1xuXHRcdFx0dmFyIHYgPSAoIGRvdDAwICogZG90MTIgLSBkb3QwMSAqIGRvdDAyICkgKiBpbnZEZW5vbTtcblxuXHRcdFx0Ly8gYmFyeWNlbnRyaWMgY29vcmRpbmF0ZXMgbXVzdCBhbHdheXMgc3VtIHRvIDFcblx0XHRcdHJldHVybiB0YXJnZXQuc2V0KCAxIC0gdSAtIHYsIHYsIHUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY29udGFpbnNQb2ludCggcG9pbnQsIGEsIGIsIGMgKSB7XG5cblx0XHRcdFRyaWFuZ2xlLmdldEJhcnljb29yZCggcG9pbnQsIGEsIGIsIGMsIHYxICk7XG5cblx0XHRcdHJldHVybiAoIHYxLnggPj0gMCApICYmICggdjEueSA+PSAwICkgJiYgKCAoIHYxLnggKyB2MS55ICkgPD0gMSApO1xuXG5cdFx0fTtcblxuXHR9KClcblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBUcmlhbmdsZS5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggYSwgYiwgYyApIHtcblxuXHRcdHRoaXMuYS5jb3B5KCBhICk7XG5cdFx0dGhpcy5iLmNvcHkoIGIgKTtcblx0XHR0aGlzLmMuY29weSggYyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tUG9pbnRzQW5kSW5kaWNlczogZnVuY3Rpb24gKCBwb2ludHMsIGkwLCBpMSwgaTIgKSB7XG5cblx0XHR0aGlzLmEuY29weSggcG9pbnRzWyBpMCBdICk7XG5cdFx0dGhpcy5iLmNvcHkoIHBvaW50c1sgaTEgXSApO1xuXHRcdHRoaXMuYy5jb3B5KCBwb2ludHNbIGkyIF0gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggdHJpYW5nbGUgKSB7XG5cblx0XHR0aGlzLmEuY29weSggdHJpYW5nbGUuYSApO1xuXHRcdHRoaXMuYi5jb3B5KCB0cmlhbmdsZS5iICk7XG5cdFx0dGhpcy5jLmNvcHkoIHRyaWFuZ2xlLmMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0QXJlYTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYwID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldEFyZWEoKSB7XG5cblx0XHRcdHYwLnN1YlZlY3RvcnMoIHRoaXMuYywgdGhpcy5iICk7XG5cdFx0XHR2MS5zdWJWZWN0b3JzKCB0aGlzLmEsIHRoaXMuYiApO1xuXG5cdFx0XHRyZXR1cm4gdjAuY3Jvc3MoIHYxICkubGVuZ3RoKCkgKiAwLjU7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRnZXRNaWRwb2ludDogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLmdldE1pZHBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmFkZFZlY3RvcnMoIHRoaXMuYSwgdGhpcy5iICkuYWRkKCB0aGlzLmMgKS5tdWx0aXBseVNjYWxhciggMSAvIDMgKTtcblxuXHR9LFxuXG5cdGdldE5vcm1hbDogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRyZXR1cm4gVHJpYW5nbGUuZ2V0Tm9ybWFsKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jLCB0YXJnZXQgKTtcblxuXHR9LFxuXG5cdGdldFBsYW5lOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuZ2V0UGxhbmUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuc2V0RnJvbUNvcGxhbmFyUG9pbnRzKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jICk7XG5cblx0fSxcblxuXHRnZXRCYXJ5Y29vcmQ6IGZ1bmN0aW9uICggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdHJldHVybiBUcmlhbmdsZS5nZXRCYXJ5Y29vcmQoIHBvaW50LCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jLCB0YXJnZXQgKTtcblxuXHR9LFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gVHJpYW5nbGUuY29udGFpbnNQb2ludCggcG9pbnQsIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5pbnRlcnNlY3RzVHJpYW5nbGUoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBwbGFuZSA9IG5ldyBQbGFuZSgpO1xuXHRcdHZhciBlZGdlTGlzdCA9IFsgbmV3IExpbmUzKCksIG5ldyBMaW5lMygpLCBuZXcgTGluZTMoKSBdO1xuXHRcdHZhciBwcm9qZWN0ZWRQb2ludCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGNsb3Nlc3RQb2ludCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2xvc2VzdFBvaW50VG9Qb2ludCggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLmNsb3Nlc3RQb2ludFRvUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBtaW5EaXN0YW5jZSA9IEluZmluaXR5O1xuXG5cdFx0XHQvLyBwcm9qZWN0IHRoZSBwb2ludCBvbnRvIHRoZSBwbGFuZSBvZiB0aGUgdHJpYW5nbGVcblxuXHRcdFx0cGxhbmUuc2V0RnJvbUNvcGxhbmFyUG9pbnRzKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jICk7XG5cdFx0XHRwbGFuZS5wcm9qZWN0UG9pbnQoIHBvaW50LCBwcm9qZWN0ZWRQb2ludCApO1xuXG5cdFx0XHQvLyBjaGVjayBpZiB0aGUgcHJvamVjdGlvbiBsaWVzIHdpdGhpbiB0aGUgdHJpYW5nbGVcblxuXHRcdFx0aWYgKCB0aGlzLmNvbnRhaW5zUG9pbnQoIHByb2plY3RlZFBvaW50ICkgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0Ly8gaWYgc28sIHRoaXMgaXMgdGhlIGNsb3Nlc3QgcG9pbnRcblxuXHRcdFx0XHR0YXJnZXQuY29weSggcHJvamVjdGVkUG9pbnQgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBpZiBub3QsIHRoZSBwb2ludCBmYWxscyBvdXRzaWRlIHRoZSB0cmlhbmdsZS4gdGhlIHRhcmdldCBpcyB0aGUgY2xvc2VzdCBwb2ludCB0byB0aGUgdHJpYW5nbGUncyBlZGdlcyBvciB2ZXJ0aWNlc1xuXG5cdFx0XHRcdGVkZ2VMaXN0WyAwIF0uc2V0KCB0aGlzLmEsIHRoaXMuYiApO1xuXHRcdFx0XHRlZGdlTGlzdFsgMSBdLnNldCggdGhpcy5iLCB0aGlzLmMgKTtcblx0XHRcdFx0ZWRnZUxpc3RbIDIgXS5zZXQoIHRoaXMuYywgdGhpcy5hICk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZWRnZUxpc3QubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0ZWRnZUxpc3RbIGkgXS5jbG9zZXN0UG9pbnRUb1BvaW50KCBwcm9qZWN0ZWRQb2ludCwgdHJ1ZSwgY2xvc2VzdFBvaW50ICk7XG5cblx0XHRcdFx0XHR2YXIgZGlzdGFuY2UgPSBwcm9qZWN0ZWRQb2ludC5kaXN0YW5jZVRvU3F1YXJlZCggY2xvc2VzdFBvaW50ICk7XG5cblx0XHRcdFx0XHRpZiAoIGRpc3RhbmNlIDwgbWluRGlzdGFuY2UgKSB7XG5cblx0XHRcdFx0XHRcdG1pbkRpc3RhbmNlID0gZGlzdGFuY2U7XG5cblx0XHRcdFx0XHRcdHRhcmdldC5jb3B5KCBjbG9zZXN0UG9pbnQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRhcmdldDtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCB0cmlhbmdsZSApIHtcblxuXHRcdHJldHVybiB0cmlhbmdsZS5hLmVxdWFscyggdGhpcy5hICkgJiYgdHJpYW5nbGUuYi5lcXVhbHMoIHRoaXMuYiApICYmIHRyaWFuZ2xlLmMuZXF1YWxzKCB0aGlzLmMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGpvbm9icjEgLyBodHRwOi8vam9ub2JyMS5jb20vXG4gKi9cblxuZnVuY3Rpb24gTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaCc7XG5cblx0dGhpcy5nZW9tZXRyeSA9IGdlb21ldHJ5ICE9PSB1bmRlZmluZWQgPyBnZW9tZXRyeSA6IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHR0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWwgIT09IHVuZGVmaW5lZCA/IG1hdGVyaWFsIDogbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmYgfSApO1xuXG5cdHRoaXMuZHJhd01vZGUgPSBUcmlhbmdsZXNEcmF3TW9kZTtcblxuXHR0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpO1xuXG59XG5cbk1lc2gucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTWVzaCxcblxuXHRpc01lc2g6IHRydWUsXG5cblx0c2V0RHJhd01vZGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmRyYXdNb2RlID0gdmFsdWU7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5kcmF3TW9kZSA9IHNvdXJjZS5kcmF3TW9kZTtcblxuXHRcdGlmICggc291cmNlLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IHNvdXJjZS5tb3JwaFRhcmdldEluZmx1ZW5jZXMuc2xpY2UoKTtcblxuXHRcdH1cblxuXHRcdGlmICggc291cmNlLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UubW9ycGhUYXJnZXREaWN0aW9uYXJ5ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHVwZGF0ZU1vcnBoVGFyZ2V0czogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblx0XHR2YXIgbSwgbWwsIG5hbWU7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciBtb3JwaEF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXM7XG5cdFx0XHR2YXIga2V5cyA9IE9iamVjdC5rZXlzKCBtb3JwaEF0dHJpYnV0ZXMgKTtcblxuXHRcdFx0aWYgKCBrZXlzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0dmFyIG1vcnBoQXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVzWyBrZXlzWyAwIF0gXTtcblxuXHRcdFx0XHRpZiAoIG1vcnBoQXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IFtdO1xuXHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0ge307XG5cblx0XHRcdFx0XHRmb3IgKCBtID0gMCwgbWwgPSBtb3JwaEF0dHJpYnV0ZS5sZW5ndGg7IG0gPCBtbDsgbSArKyApIHtcblxuXHRcdFx0XHRcdFx0bmFtZSA9IG1vcnBoQXR0cmlidXRlWyBtIF0ubmFtZSB8fCBTdHJpbmcoIG0gKTtcblxuXHRcdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCggMCApO1xuXHRcdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbIG5hbWUgXSA9IG07XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzO1xuXG5cdFx0XHRpZiAoIG1vcnBoVGFyZ2V0cyAhPT0gdW5kZWZpbmVkICYmIG1vcnBoVGFyZ2V0cy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzID0gW107XG5cdFx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0ge307XG5cblx0XHRcdFx0Zm9yICggbSA9IDAsIG1sID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgbSA8IG1sOyBtICsrICkge1xuXG5cdFx0XHRcdFx0bmFtZSA9IG1vcnBoVGFyZ2V0c1sgbSBdLm5hbWUgfHwgU3RyaW5nKCBtICk7XG5cblx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKCAwICk7XG5cdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbIG5hbWUgXSA9IG07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRyYXljYXN0OiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpbnZlcnNlTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0XHR2YXIgcmF5ID0gbmV3IFJheSgpO1xuXHRcdHZhciBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHR2YXIgdkEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2QiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHZDID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciB0ZW1wQSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHRlbXBCID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdGVtcEMgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIHV2QSA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0dmFyIHV2QiA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0dmFyIHV2QyA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHR2YXIgYmFyeWNvb3JkID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBpbnRlcnNlY3Rpb25Qb2ludCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGludGVyc2VjdGlvblBvaW50V29ybGQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0ZnVuY3Rpb24gdXZJbnRlcnNlY3Rpb24oIHBvaW50LCBwMSwgcDIsIHAzLCB1djEsIHV2MiwgdXYzICkge1xuXG5cdFx0XHRUcmlhbmdsZS5nZXRCYXJ5Y29vcmQoIHBvaW50LCBwMSwgcDIsIHAzLCBiYXJ5Y29vcmQgKTtcblxuXHRcdFx0dXYxLm11bHRpcGx5U2NhbGFyKCBiYXJ5Y29vcmQueCApO1xuXHRcdFx0dXYyLm11bHRpcGx5U2NhbGFyKCBiYXJ5Y29vcmQueSApO1xuXHRcdFx0dXYzLm11bHRpcGx5U2NhbGFyKCBiYXJ5Y29vcmQueiApO1xuXG5cdFx0XHR1djEuYWRkKCB1djIgKS5hZGQoIHV2MyApO1xuXG5cdFx0XHRyZXR1cm4gdXYxLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBjaGVja0ludGVyc2VjdGlvbiggb2JqZWN0LCBtYXRlcmlhbCwgcmF5Y2FzdGVyLCByYXksIHBBLCBwQiwgcEMsIHBvaW50ICkge1xuXG5cdFx0XHR2YXIgaW50ZXJzZWN0O1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkge1xuXG5cdFx0XHRcdGludGVyc2VjdCA9IHJheS5pbnRlcnNlY3RUcmlhbmdsZSggcEMsIHBCLCBwQSwgdHJ1ZSwgcG9pbnQgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRpbnRlcnNlY3QgPSByYXkuaW50ZXJzZWN0VHJpYW5nbGUoIHBBLCBwQiwgcEMsIG1hdGVyaWFsLnNpZGUgIT09IERvdWJsZVNpZGUsIHBvaW50ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBpbnRlcnNlY3QgPT09IG51bGwgKSByZXR1cm4gbnVsbDtcblxuXHRcdFx0aW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5jb3B5KCBwb2ludCApO1xuXHRcdFx0aW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHR2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlcnNlY3Rpb25Qb2ludFdvcmxkICk7XG5cblx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm4gbnVsbDtcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRwb2ludDogaW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5jbG9uZSgpLFxuXHRcdFx0XHRvYmplY3Q6IG9iamVjdFxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNlY3Rpb24oIG9iamVjdCwgcmF5Y2FzdGVyLCByYXksIHBvc2l0aW9uLCB1diwgYSwgYiwgYyApIHtcblxuXHRcdFx0dkEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGEgKTtcblx0XHRcdHZCLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBiICk7XG5cdFx0XHR2Qy5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgYyApO1xuXG5cdFx0XHR2YXIgaW50ZXJzZWN0aW9uID0gY2hlY2tJbnRlcnNlY3Rpb24oIG9iamVjdCwgb2JqZWN0Lm1hdGVyaWFsLCByYXljYXN0ZXIsIHJheSwgdkEsIHZCLCB2QywgaW50ZXJzZWN0aW9uUG9pbnQgKTtcblxuXHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRcdFx0aWYgKCB1diApIHtcblxuXHRcdFx0XHRcdHV2QS5mcm9tQnVmZmVyQXR0cmlidXRlKCB1diwgYSApO1xuXHRcdFx0XHRcdHV2Qi5mcm9tQnVmZmVyQXR0cmlidXRlKCB1diwgYiApO1xuXHRcdFx0XHRcdHV2Qy5mcm9tQnVmZmVyQXR0cmlidXRlKCB1diwgYyApO1xuXG5cdFx0XHRcdFx0aW50ZXJzZWN0aW9uLnV2ID0gdXZJbnRlcnNlY3Rpb24oIGludGVyc2VjdGlvblBvaW50LCB2QSwgdkIsIHZDLCB1dkEsIHV2QiwgdXZDICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBmYWNlID0gbmV3IEZhY2UzKCBhLCBiLCBjICk7XG5cdFx0XHRcdFRyaWFuZ2xlLmdldE5vcm1hbCggdkEsIHZCLCB2QywgZmFjZS5ub3JtYWwgKTtcblxuXHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZSA9IGZhY2U7XG5cdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBhO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBpbnRlcnNlY3Rpb247XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdFx0dmFyIG1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbDtcblx0XHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdFx0Ly8gQ2hlY2tpbmcgYm91bmRpbmdTcGhlcmUgZGlzdGFuY2UgdG8gcmF5XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdFx0c3BoZXJlLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICk7XG5cdFx0XHRzcGhlcmUuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRpZiAoIHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0XHQvL1xuXG5cdFx0XHRpbnZlcnNlTWF0cml4LmdldEludmVyc2UoIG1hdHJpeFdvcmxkICk7XG5cdFx0XHRyYXkuY29weSggcmF5Y2FzdGVyLnJheSApLmFwcGx5TWF0cml4NCggaW52ZXJzZU1hdHJpeCApO1xuXG5cdFx0XHQvLyBDaGVjayBib3VuZGluZ0JveCBiZWZvcmUgY29udGludWluZ1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdGlmICggcmF5LmludGVyc2VjdHNCb3goIGdlb21ldHJ5LmJvdW5kaW5nQm94ICkgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBpbnRlcnNlY3Rpb247XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgYSwgYiwgYztcblx0XHRcdFx0dmFyIGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0XHRcdHZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0XHRcdHZhciB1diA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMudXY7XG5cdFx0XHRcdHZhciBpLCBsO1xuXG5cdFx0XHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHQvLyBpbmRleGVkIGJ1ZmZlciBnZW9tZXRyeVxuXG5cdFx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBpbmRleC5jb3VudDsgaSA8IGw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdFx0YSA9IGluZGV4LmdldFgoIGkgKTtcblx0XHRcdFx0XHRcdGIgPSBpbmRleC5nZXRYKCBpICsgMSApO1xuXHRcdFx0XHRcdFx0YyA9IGluZGV4LmdldFgoIGkgKyAyICk7XG5cblx0XHRcdFx0XHRcdGludGVyc2VjdGlvbiA9IGNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNlY3Rpb24oIHRoaXMsIHJheWNhc3RlciwgcmF5LCBwb3NpdGlvbiwgdXYsIGEsIGIsIGMgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2VJbmRleCA9IE1hdGguZmxvb3IoIGkgLyAzICk7IC8vIHRyaWFuZ2xlIG51bWJlciBpbiBpbmRpY2VzIGJ1ZmZlciBzZW1hbnRpY3Ncblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBub24taW5kZXhlZCBidWZmZXIgZ2VvbWV0cnlcblxuXHRcdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gcG9zaXRpb24uY291bnQ7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0XHRcdGEgPSBpO1xuXHRcdFx0XHRcdFx0YiA9IGkgKyAxO1xuXHRcdFx0XHRcdFx0YyA9IGkgKyAyO1xuXG5cdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24gPSBjaGVja0J1ZmZlckdlb21ldHJ5SW50ZXJzZWN0aW9uKCB0aGlzLCByYXljYXN0ZXIsIHJheSwgcG9zaXRpb24sIHV2LCBhLCBiLCBjICk7XG5cblx0XHRcdFx0XHRcdGlmICggaW50ZXJzZWN0aW9uICkgaW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dmFyIGZ2QSwgZnZCLCBmdkM7XG5cdFx0XHRcdHZhciBpc011bHRpTWF0ZXJpYWwgPSBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdHZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzO1xuXHRcdFx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblx0XHRcdFx0dmFyIHV2cztcblxuXHRcdFx0XHR2YXIgZmFjZVZlcnRleFV2cyA9IGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIDAgXTtcblx0XHRcdFx0aWYgKCBmYWNlVmVydGV4VXZzLmxlbmd0aCA+IDAgKSB1dnMgPSBmYWNlVmVydGV4VXZzO1xuXG5cdFx0XHRcdGZvciAoIHZhciBmID0gMCwgZmwgPSBmYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGYgXTtcblx0XHRcdFx0XHR2YXIgZmFjZU1hdGVyaWFsID0gaXNNdWx0aU1hdGVyaWFsID8gbWF0ZXJpYWxbIGZhY2UubWF0ZXJpYWxJbmRleCBdIDogbWF0ZXJpYWw7XG5cblx0XHRcdFx0XHRpZiAoIGZhY2VNYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkgY29udGludWU7XG5cblx0XHRcdFx0XHRmdkEgPSB2ZXJ0aWNlc1sgZmFjZS5hIF07XG5cdFx0XHRcdFx0ZnZCID0gdmVydGljZXNbIGZhY2UuYiBdO1xuXHRcdFx0XHRcdGZ2QyA9IHZlcnRpY2VzWyBmYWNlLmMgXTtcblxuXHRcdFx0XHRcdGlmICggZmFjZU1hdGVyaWFsLm1vcnBoVGFyZ2V0cyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cztcblx0XHRcdFx0XHRcdHZhciBtb3JwaEluZmx1ZW5jZXMgPSB0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztcblxuXHRcdFx0XHRcdFx0dkEuc2V0KCAwLCAwLCAwICk7XG5cdFx0XHRcdFx0XHR2Qi5zZXQoIDAsIDAsIDAgKTtcblx0XHRcdFx0XHRcdHZDLnNldCggMCwgMCwgMCApO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgdCA9IDAsIHRsID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgdCA8IHRsOyB0ICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHZhciBpbmZsdWVuY2UgPSBtb3JwaEluZmx1ZW5jZXNbIHQgXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGluZmx1ZW5jZSA9PT0gMCApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRcdHZhciB0YXJnZXRzID0gbW9ycGhUYXJnZXRzWyB0IF0udmVydGljZXM7XG5cblx0XHRcdFx0XHRcdFx0dkEuYWRkU2NhbGVkVmVjdG9yKCB0ZW1wQS5zdWJWZWN0b3JzKCB0YXJnZXRzWyBmYWNlLmEgXSwgZnZBICksIGluZmx1ZW5jZSApO1xuXHRcdFx0XHRcdFx0XHR2Qi5hZGRTY2FsZWRWZWN0b3IoIHRlbXBCLnN1YlZlY3RvcnMoIHRhcmdldHNbIGZhY2UuYiBdLCBmdkIgKSwgaW5mbHVlbmNlICk7XG5cdFx0XHRcdFx0XHRcdHZDLmFkZFNjYWxlZFZlY3RvciggdGVtcEMuc3ViVmVjdG9ycyggdGFyZ2V0c1sgZmFjZS5jIF0sIGZ2QyApLCBpbmZsdWVuY2UgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR2QS5hZGQoIGZ2QSApO1xuXHRcdFx0XHRcdFx0dkIuYWRkKCBmdkIgKTtcblx0XHRcdFx0XHRcdHZDLmFkZCggZnZDICk7XG5cblx0XHRcdFx0XHRcdGZ2QSA9IHZBO1xuXHRcdFx0XHRcdFx0ZnZCID0gdkI7XG5cdFx0XHRcdFx0XHRmdkMgPSB2QztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGludGVyc2VjdGlvbiA9IGNoZWNrSW50ZXJzZWN0aW9uKCB0aGlzLCBmYWNlTWF0ZXJpYWwsIHJheWNhc3RlciwgcmF5LCBmdkEsIGZ2QiwgZnZDLCBpbnRlcnNlY3Rpb25Qb2ludCApO1xuXG5cdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRcdFx0XHRcdGlmICggdXZzICYmIHV2c1sgZiBdICkge1xuXG5cdFx0XHRcdFx0XHRcdHZhciB1dnNfZiA9IHV2c1sgZiBdO1xuXHRcdFx0XHRcdFx0XHR1dkEuY29weSggdXZzX2ZbIDAgXSApO1xuXHRcdFx0XHRcdFx0XHR1dkIuY29weSggdXZzX2ZbIDEgXSApO1xuXHRcdFx0XHRcdFx0XHR1dkMuY29weSggdXZzX2ZbIDIgXSApO1xuXG5cdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi51diA9IHV2SW50ZXJzZWN0aW9uKCBpbnRlcnNlY3Rpb25Qb2ludCwgZnZBLCBmdkIsIGZ2QywgdXZBLCB1dkIsIHV2QyApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlID0gZmFjZTtcblx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBmO1xuXHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpICksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5nZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMQmFja2dyb3VuZCggcmVuZGVyZXIsIHN0YXRlLCBnZW9tZXRyaWVzLCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XG5cblx0dmFyIGNsZWFyQ29sb3IgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XG5cdHZhciBjbGVhckFscGhhID0gMDtcblxuXHR2YXIgcGxhbmVDYW1lcmEsIHBsYW5lTWVzaDtcblx0dmFyIGJveE1lc2g7XG5cblx0ZnVuY3Rpb24gcmVuZGVyKCByZW5kZXJMaXN0LCBzY2VuZSwgY2FtZXJhLCBmb3JjZUNsZWFyICkge1xuXG5cdFx0dmFyIGJhY2tncm91bmQgPSBzY2VuZS5iYWNrZ3JvdW5kO1xuXG5cdFx0aWYgKCBiYWNrZ3JvdW5kID09PSBudWxsICkge1xuXG5cdFx0XHRzZXRDbGVhciggY2xlYXJDb2xvciwgY2xlYXJBbHBoYSApO1xuXG5cdFx0fSBlbHNlIGlmICggYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzQ29sb3IgKSB7XG5cblx0XHRcdHNldENsZWFyKCBiYWNrZ3JvdW5kLCAxICk7XG5cdFx0XHRmb3JjZUNsZWFyID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICggcmVuZGVyZXIuYXV0b0NsZWFyIHx8IGZvcmNlQ2xlYXIgKSB7XG5cblx0XHRcdHJlbmRlcmVyLmNsZWFyKCByZW5kZXJlci5hdXRvQ2xlYXJDb2xvciwgcmVuZGVyZXIuYXV0b0NsZWFyRGVwdGgsIHJlbmRlcmVyLmF1dG9DbGVhclN0ZW5jaWwgKTtcblxuXHRcdH1cblxuXHRcdGlmICggYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzQ3ViZVRleHR1cmUgKSB7XG5cblx0XHRcdGlmICggYm94TWVzaCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGJveE1lc2ggPSBuZXcgTWVzaChcblx0XHRcdFx0XHRuZXcgQm94QnVmZmVyR2VvbWV0cnkoIDEsIDEsIDEgKSxcblx0XHRcdFx0XHRuZXcgU2hhZGVyTWF0ZXJpYWwoIHtcblx0XHRcdFx0XHRcdHVuaWZvcm1zOiBTaGFkZXJMaWIuY3ViZS51bmlmb3Jtcyxcblx0XHRcdFx0XHRcdHZlcnRleFNoYWRlcjogU2hhZGVyTGliLmN1YmUudmVydGV4U2hhZGVyLFxuXHRcdFx0XHRcdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckxpYi5jdWJlLmZyYWdtZW50U2hhZGVyLFxuXHRcdFx0XHRcdFx0c2lkZTogQmFja1NpZGUsXG5cdFx0XHRcdFx0XHRkZXB0aFRlc3Q6IHRydWUsXG5cdFx0XHRcdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcblx0XHRcdFx0XHRcdGZvZzogZmFsc2Vcblx0XHRcdFx0XHR9IClcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRib3hNZXNoLmdlb21ldHJ5LnJlbW92ZUF0dHJpYnV0ZSggJ25vcm1hbCcgKTtcblx0XHRcdFx0Ym94TWVzaC5nZW9tZXRyeS5yZW1vdmVBdHRyaWJ1dGUoICd1dicgKTtcblxuXHRcdFx0XHRib3hNZXNoLm9uQmVmb3JlUmVuZGVyID0gZnVuY3Rpb24gKCByZW5kZXJlciwgc2NlbmUsIGNhbWVyYSApIHtcblxuXHRcdFx0XHRcdHRoaXMubWF0cml4V29ybGQuY29weVBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGdlb21ldHJpZXMudXBkYXRlKCBib3hNZXNoLmdlb21ldHJ5ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ym94TWVzaC5tYXRlcmlhbC51bmlmb3Jtcy50Q3ViZS52YWx1ZSA9IGJhY2tncm91bmQ7XG5cblx0XHRcdHJlbmRlckxpc3QucHVzaCggYm94TWVzaCwgYm94TWVzaC5nZW9tZXRyeSwgYm94TWVzaC5tYXRlcmlhbCwgMCwgbnVsbCApO1xuXG5cdFx0fSBlbHNlIGlmICggYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0aWYgKCBwbGFuZUNhbWVyYSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHBsYW5lQ2FtZXJhID0gbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSggLSAxLCAxLCAxLCAtIDEsIDAsIDEgKTtcblxuXHRcdFx0XHRwbGFuZU1lc2ggPSBuZXcgTWVzaChcblx0XHRcdFx0XHRuZXcgUGxhbmVCdWZmZXJHZW9tZXRyeSggMiwgMiApLFxuXHRcdFx0XHRcdG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyBkZXB0aFRlc3Q6IGZhbHNlLCBkZXB0aFdyaXRlOiBmYWxzZSwgZm9nOiBmYWxzZSB9IClcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRnZW9tZXRyaWVzLnVwZGF0ZSggcGxhbmVNZXNoLmdlb21ldHJ5ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cGxhbmVNZXNoLm1hdGVyaWFsLm1hcCA9IGJhY2tncm91bmQ7XG5cblx0XHRcdC8vIFRPRE8gUHVzaCB0aGlzIHRvIHJlbmRlckxpc3RcblxuXHRcdFx0cmVuZGVyZXIucmVuZGVyQnVmZmVyRGlyZWN0KCBwbGFuZUNhbWVyYSwgbnVsbCwgcGxhbmVNZXNoLmdlb21ldHJ5LCBwbGFuZU1lc2gubWF0ZXJpYWwsIHBsYW5lTWVzaCwgbnVsbCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRDbGVhciggY29sb3IsIGFscGhhICkge1xuXG5cdFx0c3RhdGUuYnVmZmVycy5jb2xvci5zZXRDbGVhciggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiwgYWxwaGEsIHByZW11bHRpcGxpZWRBbHBoYSApO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0Z2V0Q2xlYXJDb2xvcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gY2xlYXJDb2xvcjtcblxuXHRcdH0sXG5cdFx0c2V0Q2xlYXJDb2xvcjogZnVuY3Rpb24gKCBjb2xvciwgYWxwaGEgKSB7XG5cblx0XHRcdGNsZWFyQ29sb3Iuc2V0KCBjb2xvciApO1xuXHRcdFx0Y2xlYXJBbHBoYSA9IGFscGhhICE9PSB1bmRlZmluZWQgPyBhbHBoYSA6IDE7XG5cdFx0XHRzZXRDbGVhciggY2xlYXJDb2xvciwgY2xlYXJBbHBoYSApO1xuXG5cdFx0fSxcblx0XHRnZXRDbGVhckFscGhhOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiBjbGVhckFscGhhO1xuXG5cdFx0fSxcblx0XHRzZXRDbGVhckFscGhhOiBmdW5jdGlvbiAoIGFscGhhICkge1xuXG5cdFx0XHRjbGVhckFscGhhID0gYWxwaGE7XG5cdFx0XHRzZXRDbGVhciggY2xlYXJDb2xvciwgY2xlYXJBbHBoYSApO1xuXG5cdFx0fSxcblx0XHRyZW5kZXI6IHJlbmRlclxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMQnVmZmVyUmVuZGVyZXIoIGdsLCBleHRlbnNpb25zLCBpbmZvICkge1xuXG5cdHZhciBtb2RlO1xuXG5cdGZ1bmN0aW9uIHNldE1vZGUoIHZhbHVlICkge1xuXG5cdFx0bW9kZSA9IHZhbHVlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXIoIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdGdsLmRyYXdBcnJheXMoIG1vZGUsIHN0YXJ0LCBjb3VudCApO1xuXG5cdFx0aW5mby51cGRhdGUoIGNvdW50LCBtb2RlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlckluc3RhbmNlcyggZ2VvbWV0cnksIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cblx0XHRpZiAoIGV4dGVuc2lvbiA9PT0gbnVsbCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMQnVmZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRpZiAoIHBvc2l0aW9uLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSB7XG5cblx0XHRcdGNvdW50ID0gcG9zaXRpb24uZGF0YS5jb3VudDtcblxuXHRcdFx0ZXh0ZW5zaW9uLmRyYXdBcnJheXNJbnN0YW5jZWRBTkdMRSggbW9kZSwgMCwgY291bnQsIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRleHRlbnNpb24uZHJhd0FycmF5c0luc3RhbmNlZEFOR0xFKCBtb2RlLCBzdGFydCwgY291bnQsIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICk7XG5cblx0XHR9XG5cblx0XHRpbmZvLnVwZGF0ZSggY291bnQsIG1vZGUsIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICk7XG5cblx0fVxuXG5cdC8vXG5cblx0dGhpcy5zZXRNb2RlID0gc2V0TW9kZTtcblx0dGhpcy5yZW5kZXIgPSByZW5kZXI7XG5cdHRoaXMucmVuZGVySW5zdGFuY2VzID0gcmVuZGVySW5zdGFuY2VzO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTENhcGFiaWxpdGllcyggZ2wsIGV4dGVuc2lvbnMsIHBhcmFtZXRlcnMgKSB7XG5cblx0dmFyIG1heEFuaXNvdHJvcHk7XG5cblx0ZnVuY3Rpb24gZ2V0TWF4QW5pc290cm9weSgpIHtcblxuXHRcdGlmICggbWF4QW5pc290cm9weSAhPT0gdW5kZWZpbmVkICkgcmV0dXJuIG1heEFuaXNvdHJvcHk7XG5cblx0XHR2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICk7XG5cblx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0bWF4QW5pc290cm9weSA9IGdsLmdldFBhcmFtZXRlciggZXh0ZW5zaW9uLk1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bWF4QW5pc290cm9weSA9IDA7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF4QW5pc290cm9weTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0TWF4UHJlY2lzaW9uKCBwcmVjaXNpb24gKSB7XG5cblx0XHRpZiAoIHByZWNpc2lvbiA9PT0gJ2hpZ2hwJyApIHtcblxuXHRcdFx0aWYgKCBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIGdsLlZFUlRFWF9TSEFERVIsIGdsLkhJR0hfRkxPQVQgKS5wcmVjaXNpb24gPiAwICYmXG5cdFx0XHQgICAgIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggZ2wuRlJBR01FTlRfU0hBREVSLCBnbC5ISUdIX0ZMT0FUICkucHJlY2lzaW9uID4gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gJ2hpZ2hwJztcblxuXHRcdFx0fVxuXG5cdFx0XHRwcmVjaXNpb24gPSAnbWVkaXVtcCc7XG5cblx0XHR9XG5cblx0XHRpZiAoIHByZWNpc2lvbiA9PT0gJ21lZGl1bXAnICkge1xuXG5cdFx0XHRpZiAoIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggZ2wuVkVSVEVYX1NIQURFUiwgZ2wuTUVESVVNX0ZMT0FUICkucHJlY2lzaW9uID4gMCAmJlxuXHRcdFx0ICAgICBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIGdsLkZSQUdNRU5UX1NIQURFUiwgZ2wuTUVESVVNX0ZMT0FUICkucHJlY2lzaW9uID4gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gJ21lZGl1bXAnO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gJ2xvd3AnO1xuXG5cdH1cblxuXHR2YXIgcHJlY2lzaW9uID0gcGFyYW1ldGVycy5wcmVjaXNpb24gIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMucHJlY2lzaW9uIDogJ2hpZ2hwJztcblx0dmFyIG1heFByZWNpc2lvbiA9IGdldE1heFByZWNpc2lvbiggcHJlY2lzaW9uICk7XG5cblx0aWYgKCBtYXhQcmVjaXNpb24gIT09IHByZWNpc2lvbiApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6JywgcHJlY2lzaW9uLCAnbm90IHN1cHBvcnRlZCwgdXNpbmcnLCBtYXhQcmVjaXNpb24sICdpbnN0ZWFkLicgKTtcblx0XHRwcmVjaXNpb24gPSBtYXhQcmVjaXNpb247XG5cblx0fVxuXG5cdHZhciBsb2dhcml0aG1pY0RlcHRoQnVmZmVyID0gcGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID09PSB0cnVlO1xuXG5cdHZhciBtYXhUZXh0dXJlcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMgKTtcblx0dmFyIG1heFZlcnRleFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMgKTtcblx0dmFyIG1heFRleHR1cmVTaXplID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVEVYVFVSRV9TSVpFICk7XG5cdHZhciBtYXhDdWJlbWFwU2l6ZSA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSApO1xuXG5cdHZhciBtYXhBdHRyaWJ1dGVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkVSVEVYX0FUVFJJQlMgKTtcblx0dmFyIG1heFZlcnRleFVuaWZvcm1zID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUyApO1xuXHR2YXIgbWF4VmFyeWluZ3MgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9WQVJZSU5HX1ZFQ1RPUlMgKTtcblx0dmFyIG1heEZyYWdtZW50VW5pZm9ybXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlMgKTtcblxuXHR2YXIgdmVydGV4VGV4dHVyZXMgPSBtYXhWZXJ0ZXhUZXh0dXJlcyA+IDA7XG5cdHZhciBmbG9hdEZyYWdtZW50VGV4dHVyZXMgPSAhISBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApO1xuXHR2YXIgZmxvYXRWZXJ0ZXhUZXh0dXJlcyA9IHZlcnRleFRleHR1cmVzICYmIGZsb2F0RnJhZ21lbnRUZXh0dXJlcztcblxuXHRyZXR1cm4ge1xuXG5cdFx0Z2V0TWF4QW5pc290cm9weTogZ2V0TWF4QW5pc290cm9weSxcblx0XHRnZXRNYXhQcmVjaXNpb246IGdldE1heFByZWNpc2lvbixcblxuXHRcdHByZWNpc2lvbjogcHJlY2lzaW9uLFxuXHRcdGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IGxvZ2FyaXRobWljRGVwdGhCdWZmZXIsXG5cblx0XHRtYXhUZXh0dXJlczogbWF4VGV4dHVyZXMsXG5cdFx0bWF4VmVydGV4VGV4dHVyZXM6IG1heFZlcnRleFRleHR1cmVzLFxuXHRcdG1heFRleHR1cmVTaXplOiBtYXhUZXh0dXJlU2l6ZSxcblx0XHRtYXhDdWJlbWFwU2l6ZTogbWF4Q3ViZW1hcFNpemUsXG5cblx0XHRtYXhBdHRyaWJ1dGVzOiBtYXhBdHRyaWJ1dGVzLFxuXHRcdG1heFZlcnRleFVuaWZvcm1zOiBtYXhWZXJ0ZXhVbmlmb3Jtcyxcblx0XHRtYXhWYXJ5aW5nczogbWF4VmFyeWluZ3MsXG5cdFx0bWF4RnJhZ21lbnRVbmlmb3JtczogbWF4RnJhZ21lbnRVbmlmb3JtcyxcblxuXHRcdHZlcnRleFRleHR1cmVzOiB2ZXJ0ZXhUZXh0dXJlcyxcblx0XHRmbG9hdEZyYWdtZW50VGV4dHVyZXM6IGZsb2F0RnJhZ21lbnRUZXh0dXJlcyxcblx0XHRmbG9hdFZlcnRleFRleHR1cmVzOiBmbG9hdFZlcnRleFRleHR1cmVzXG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBXZWJHTENsaXBwaW5nKCkge1xuXG5cdHZhciBzY29wZSA9IHRoaXMsXG5cblx0XHRnbG9iYWxTdGF0ZSA9IG51bGwsXG5cdFx0bnVtR2xvYmFsUGxhbmVzID0gMCxcblx0XHRsb2NhbENsaXBwaW5nRW5hYmxlZCA9IGZhbHNlLFxuXHRcdHJlbmRlcmluZ1NoYWRvd3MgPSBmYWxzZSxcblxuXHRcdHBsYW5lID0gbmV3IFBsYW5lKCksXG5cdFx0dmlld05vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCksXG5cblx0XHR1bmlmb3JtID0geyB2YWx1ZTogbnVsbCwgbmVlZHNVcGRhdGU6IGZhbHNlIH07XG5cblx0dGhpcy51bmlmb3JtID0gdW5pZm9ybTtcblx0dGhpcy5udW1QbGFuZXMgPSAwO1xuXHR0aGlzLm51bUludGVyc2VjdGlvbiA9IDA7XG5cblx0dGhpcy5pbml0ID0gZnVuY3Rpb24gKCBwbGFuZXMsIGVuYWJsZUxvY2FsQ2xpcHBpbmcsIGNhbWVyYSApIHtcblxuXHRcdHZhciBlbmFibGVkID1cblx0XHRcdHBsYW5lcy5sZW5ndGggIT09IDAgfHxcblx0XHRcdGVuYWJsZUxvY2FsQ2xpcHBpbmcgfHxcblx0XHRcdC8vIGVuYWJsZSBzdGF0ZSBvZiBwcmV2aW91cyBmcmFtZSAtIHRoZSBjbGlwcGluZyBjb2RlIGhhcyB0b1xuXHRcdFx0Ly8gcnVuIGFub3RoZXIgZnJhbWUgaW4gb3JkZXIgdG8gcmVzZXQgdGhlIHN0YXRlOlxuXHRcdFx0bnVtR2xvYmFsUGxhbmVzICE9PSAwIHx8XG5cdFx0XHRsb2NhbENsaXBwaW5nRW5hYmxlZDtcblxuXHRcdGxvY2FsQ2xpcHBpbmdFbmFibGVkID0gZW5hYmxlTG9jYWxDbGlwcGluZztcblxuXHRcdGdsb2JhbFN0YXRlID0gcHJvamVjdFBsYW5lcyggcGxhbmVzLCBjYW1lcmEsIDAgKTtcblx0XHRudW1HbG9iYWxQbGFuZXMgPSBwbGFuZXMubGVuZ3RoO1xuXG5cdFx0cmV0dXJuIGVuYWJsZWQ7XG5cblx0fTtcblxuXHR0aGlzLmJlZ2luU2hhZG93cyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJlbmRlcmluZ1NoYWRvd3MgPSB0cnVlO1xuXHRcdHByb2plY3RQbGFuZXMoIG51bGwgKTtcblxuXHR9O1xuXG5cdHRoaXMuZW5kU2hhZG93cyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJlbmRlcmluZ1NoYWRvd3MgPSBmYWxzZTtcblx0XHRyZXNldEdsb2JhbFN0YXRlKCk7XG5cblx0fTtcblxuXHR0aGlzLnNldFN0YXRlID0gZnVuY3Rpb24gKCBwbGFuZXMsIGNsaXBJbnRlcnNlY3Rpb24sIGNsaXBTaGFkb3dzLCBjYW1lcmEsIGNhY2hlLCBmcm9tQ2FjaGUgKSB7XG5cblx0XHRpZiAoICEgbG9jYWxDbGlwcGluZ0VuYWJsZWQgfHwgcGxhbmVzID09PSBudWxsIHx8IHBsYW5lcy5sZW5ndGggPT09IDAgfHwgcmVuZGVyaW5nU2hhZG93cyAmJiAhIGNsaXBTaGFkb3dzICkge1xuXG5cdFx0XHQvLyB0aGVyZSdzIG5vIGxvY2FsIGNsaXBwaW5nXG5cblx0XHRcdGlmICggcmVuZGVyaW5nU2hhZG93cyApIHtcblxuXHRcdFx0XHQvLyB0aGVyZSdzIG5vIGdsb2JhbCBjbGlwcGluZ1xuXG5cdFx0XHRcdHByb2plY3RQbGFuZXMoIG51bGwgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZXNldEdsb2JhbFN0YXRlKCk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHZhciBuR2xvYmFsID0gcmVuZGVyaW5nU2hhZG93cyA/IDAgOiBudW1HbG9iYWxQbGFuZXMsXG5cdFx0XHRcdGxHbG9iYWwgPSBuR2xvYmFsICogNCxcblxuXHRcdFx0XHRkc3RBcnJheSA9IGNhY2hlLmNsaXBwaW5nU3RhdGUgfHwgbnVsbDtcblxuXHRcdFx0dW5pZm9ybS52YWx1ZSA9IGRzdEFycmF5OyAvLyBlbnN1cmUgdW5pcXVlIHN0YXRlXG5cblx0XHRcdGRzdEFycmF5ID0gcHJvamVjdFBsYW5lcyggcGxhbmVzLCBjYW1lcmEsIGxHbG9iYWwsIGZyb21DYWNoZSApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IGxHbG9iYWw7ICsrIGkgKSB7XG5cblx0XHRcdFx0ZHN0QXJyYXlbIGkgXSA9IGdsb2JhbFN0YXRlWyBpIF07XG5cblx0XHRcdH1cblxuXHRcdFx0Y2FjaGUuY2xpcHBpbmdTdGF0ZSA9IGRzdEFycmF5O1xuXHRcdFx0dGhpcy5udW1JbnRlcnNlY3Rpb24gPSBjbGlwSW50ZXJzZWN0aW9uID8gdGhpcy5udW1QbGFuZXMgOiAwO1xuXHRcdFx0dGhpcy5udW1QbGFuZXMgKz0gbkdsb2JhbDtcblxuXHRcdH1cblxuXG5cdH07XG5cblx0ZnVuY3Rpb24gcmVzZXRHbG9iYWxTdGF0ZSgpIHtcblxuXHRcdGlmICggdW5pZm9ybS52YWx1ZSAhPT0gZ2xvYmFsU3RhdGUgKSB7XG5cblx0XHRcdHVuaWZvcm0udmFsdWUgPSBnbG9iYWxTdGF0ZTtcblx0XHRcdHVuaWZvcm0ubmVlZHNVcGRhdGUgPSBudW1HbG9iYWxQbGFuZXMgPiAwO1xuXG5cdFx0fVxuXG5cdFx0c2NvcGUubnVtUGxhbmVzID0gbnVtR2xvYmFsUGxhbmVzO1xuXHRcdHNjb3BlLm51bUludGVyc2VjdGlvbiA9IDA7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHByb2plY3RQbGFuZXMoIHBsYW5lcywgY2FtZXJhLCBkc3RPZmZzZXQsIHNraXBUcmFuc2Zvcm0gKSB7XG5cblx0XHR2YXIgblBsYW5lcyA9IHBsYW5lcyAhPT0gbnVsbCA/IHBsYW5lcy5sZW5ndGggOiAwLFxuXHRcdFx0ZHN0QXJyYXkgPSBudWxsO1xuXG5cdFx0aWYgKCBuUGxhbmVzICE9PSAwICkge1xuXG5cdFx0XHRkc3RBcnJheSA9IHVuaWZvcm0udmFsdWU7XG5cblx0XHRcdGlmICggc2tpcFRyYW5zZm9ybSAhPT0gdHJ1ZSB8fCBkc3RBcnJheSA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHR2YXIgZmxhdFNpemUgPSBkc3RPZmZzZXQgKyBuUGxhbmVzICogNCxcblx0XHRcdFx0XHR2aWV3TWF0cml4ID0gY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZTtcblxuXHRcdFx0XHR2aWV3Tm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdGlmICggZHN0QXJyYXkgPT09IG51bGwgfHwgZHN0QXJyYXkubGVuZ3RoIDwgZmxhdFNpemUgKSB7XG5cblx0XHRcdFx0XHRkc3RBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIGZsYXRTaXplICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaTQgPSBkc3RPZmZzZXQ7IGkgIT09IG5QbGFuZXM7ICsrIGksIGk0ICs9IDQgKSB7XG5cblx0XHRcdFx0XHRwbGFuZS5jb3B5KCBwbGFuZXNbIGkgXSApLmFwcGx5TWF0cml4NCggdmlld01hdHJpeCwgdmlld05vcm1hbE1hdHJpeCApO1xuXG5cdFx0XHRcdFx0cGxhbmUubm9ybWFsLnRvQXJyYXkoIGRzdEFycmF5LCBpNCApO1xuXHRcdFx0XHRcdGRzdEFycmF5WyBpNCArIDMgXSA9IHBsYW5lLmNvbnN0YW50O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR1bmlmb3JtLnZhbHVlID0gZHN0QXJyYXk7XG5cdFx0XHR1bmlmb3JtLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdHNjb3BlLm51bVBsYW5lcyA9IG5QbGFuZXM7XG5cblx0XHRyZXR1cm4gZHN0QXJyYXk7XG5cblx0fVxuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTEV4dGVuc2lvbnMoIGdsICkge1xuXG5cdHZhciBleHRlbnNpb25zID0ge307XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbnNbIG5hbWUgXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBleHRlbnNpb25zWyBuYW1lIF07XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGV4dGVuc2lvbjtcblxuXHRcdFx0c3dpdGNoICggbmFtZSApIHtcblxuXHRcdFx0XHRjYXNlICdXRUJHTF9kZXB0aF90ZXh0dXJlJzpcblx0XHRcdFx0XHRleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9kZXB0aF90ZXh0dXJlJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ01PWl9XRUJHTF9kZXB0aF90ZXh0dXJlJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9XRUJHTF9kZXB0aF90ZXh0dXJlJyApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyc6XG5cdFx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ01PWl9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCS0lUX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0Yyc6XG5cdFx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnTU9aX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnOlxuXHRcdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCBuYW1lICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBleHRlbnNpb24gPT09IG51bGwgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogJyArIG5hbWUgKyAnIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRleHRlbnNpb25zWyBuYW1lIF0gPSBleHRlbnNpb247XG5cblx0XHRcdHJldHVybiBleHRlbnNpb247XG5cblx0XHR9XG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xHZW9tZXRyaWVzKCBnbCwgYXR0cmlidXRlcywgaW5mbyApIHtcblxuXHR2YXIgZ2VvbWV0cmllcyA9IHt9O1xuXHR2YXIgd2lyZWZyYW1lQXR0cmlidXRlcyA9IHt9O1xuXG5cdGZ1bmN0aW9uIG9uR2VvbWV0cnlEaXNwb3NlKCBldmVudCApIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IGV2ZW50LnRhcmdldDtcblx0XHR2YXIgYnVmZmVyZ2VvbWV0cnkgPSBnZW9tZXRyaWVzWyBnZW9tZXRyeS5pZCBdO1xuXG5cdFx0aWYgKCBidWZmZXJnZW9tZXRyeS5pbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0YXR0cmlidXRlcy5yZW1vdmUoIGJ1ZmZlcmdlb21ldHJ5LmluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgbmFtZSBpbiBidWZmZXJnZW9tZXRyeS5hdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnJlbW92ZSggYnVmZmVyZ2VvbWV0cnkuYXR0cmlidXRlc1sgbmFtZSBdICk7XG5cblx0XHR9XG5cblx0XHRnZW9tZXRyeS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uR2VvbWV0cnlEaXNwb3NlICk7XG5cblx0XHRkZWxldGUgZ2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdC8vIFRPRE8gUmVtb3ZlIGR1cGxpY2F0ZSBjb2RlXG5cblx0XHR2YXIgYXR0cmlidXRlID0gd2lyZWZyYW1lQXR0cmlidXRlc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggYXR0cmlidXRlICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnJlbW92ZSggYXR0cmlidXRlICk7XG5cdFx0XHRkZWxldGUgd2lyZWZyYW1lQXR0cmlidXRlc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdH1cblxuXHRcdGF0dHJpYnV0ZSA9IHdpcmVmcmFtZUF0dHJpYnV0ZXNbIGJ1ZmZlcmdlb21ldHJ5LmlkIF07XG5cblx0XHRpZiAoIGF0dHJpYnV0ZSApIHtcblxuXHRcdFx0YXR0cmlidXRlcy5yZW1vdmUoIGF0dHJpYnV0ZSApO1xuXHRcdFx0ZGVsZXRlIHdpcmVmcmFtZUF0dHJpYnV0ZXNbIGJ1ZmZlcmdlb21ldHJ5LmlkIF07XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0aW5mby5tZW1vcnkuZ2VvbWV0cmllcyAtLTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0KCBvYmplY3QsIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggYnVmZmVyZ2VvbWV0cnkgKSByZXR1cm4gYnVmZmVyZ2VvbWV0cnk7XG5cblx0XHRnZW9tZXRyeS5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uR2VvbWV0cnlEaXNwb3NlICk7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cnk7XG5cblx0XHR9IGVsc2UgaWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5Ll9idWZmZXJHZW9tZXRyeSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGdlb21ldHJ5Ll9idWZmZXJHZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpLnNldEZyb21PYmplY3QoIG9iamVjdCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cnkuX2J1ZmZlckdlb21ldHJ5O1xuXG5cdFx0fVxuXG5cdFx0Z2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXSA9IGJ1ZmZlcmdlb21ldHJ5O1xuXG5cdFx0aW5mby5tZW1vcnkuZ2VvbWV0cmllcyArKztcblxuXHRcdHJldHVybiBidWZmZXJnZW9tZXRyeTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlKCBnZW9tZXRyeSApIHtcblxuXHRcdHZhciBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdHZhciBnZW9tZXRyeUF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0YXR0cmlidXRlcy51cGRhdGUoIGluZGV4LCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiApO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gZ2VvbWV0cnlBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnVwZGF0ZSggZ2VvbWV0cnlBdHRyaWJ1dGVzWyBuYW1lIF0sIGdsLkFSUkFZX0JVRkZFUiApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbW9ycGggdGFyZ2V0c1xuXG5cdFx0dmFyIG1vcnBoQXR0cmlidXRlcyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcztcblxuXHRcdGZvciAoIHZhciBuYW1lIGluIG1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gbW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF07XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlcy51cGRhdGUoIGFycmF5WyBpIF0sIGdsLkFSUkFZX0JVRkZFUiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldFdpcmVmcmFtZUF0dHJpYnV0ZSggZ2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgYXR0cmlidXRlID0gd2lyZWZyYW1lQXR0cmlidXRlc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggYXR0cmlidXRlICkgcmV0dXJuIGF0dHJpYnV0ZTtcblxuXHRcdHZhciBpbmRpY2VzID0gW107XG5cblx0XHR2YXIgZ2VvbWV0cnlJbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdHZhciBnZW9tZXRyeUF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXG5cdFx0Ly8gY29uc29sZS50aW1lKCAnd2lyZWZyYW1lJyApO1xuXG5cdFx0aWYgKCBnZW9tZXRyeUluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBnZW9tZXRyeUluZGV4LmFycmF5O1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0dmFyIGEgPSBhcnJheVsgaSArIDAgXTtcblx0XHRcdFx0dmFyIGIgPSBhcnJheVsgaSArIDEgXTtcblx0XHRcdFx0dmFyIGMgPSBhcnJheVsgaSArIDIgXTtcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGIsIGMsIGMsIGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gZ2VvbWV0cnlBdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSAoIGFycmF5Lmxlbmd0aCAvIDMgKSAtIDE7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0dmFyIGEgPSBpICsgMDtcblx0XHRcdFx0dmFyIGIgPSBpICsgMTtcblx0XHRcdFx0dmFyIGMgPSBpICsgMjtcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGIsIGMsIGMsIGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gY29uc29sZS50aW1lRW5kKCAnd2lyZWZyYW1lJyApO1xuXG5cdFx0YXR0cmlidXRlID0gbmV3ICggYXJyYXlNYXgoIGluZGljZXMgKSA+IDY1NTM1ID8gVWludDMyQnVmZmVyQXR0cmlidXRlIDogVWludDE2QnVmZmVyQXR0cmlidXRlICkoIGluZGljZXMsIDEgKTtcblxuXHRcdGF0dHJpYnV0ZXMudXBkYXRlKCBhdHRyaWJ1dGUsIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSICk7XG5cblx0XHR3aXJlZnJhbWVBdHRyaWJ1dGVzWyBnZW9tZXRyeS5pZCBdID0gYXR0cmlidXRlO1xuXG5cdFx0cmV0dXJuIGF0dHJpYnV0ZTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldDogZ2V0LFxuXHRcdHVwZGF0ZTogdXBkYXRlLFxuXG5cdFx0Z2V0V2lyZWZyYW1lQXR0cmlidXRlOiBnZXRXaXJlZnJhbWVBdHRyaWJ1dGVcblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlciggZ2wsIGV4dGVuc2lvbnMsIGluZm8gKSB7XG5cblx0dmFyIG1vZGU7XG5cblx0ZnVuY3Rpb24gc2V0TW9kZSggdmFsdWUgKSB7XG5cblx0XHRtb2RlID0gdmFsdWU7XG5cblx0fVxuXG5cdHZhciB0eXBlLCBieXRlc1BlckVsZW1lbnQ7XG5cblx0ZnVuY3Rpb24gc2V0SW5kZXgoIHZhbHVlICkge1xuXG5cdFx0dHlwZSA9IHZhbHVlLnR5cGU7XG5cdFx0Ynl0ZXNQZXJFbGVtZW50ID0gdmFsdWUuYnl0ZXNQZXJFbGVtZW50O1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXIoIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdGdsLmRyYXdFbGVtZW50cyggbW9kZSwgY291bnQsIHR5cGUsIHN0YXJ0ICogYnl0ZXNQZXJFbGVtZW50ICk7XG5cblx0XHRpbmZvLnVwZGF0ZSggY291bnQsIG1vZGUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVySW5zdGFuY2VzKCBnZW9tZXRyeSwgc3RhcnQsIGNvdW50ICkge1xuXG5cdFx0dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcblxuXHRcdGlmICggZXh0ZW5zaW9uID09PSBudWxsICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGV4dGVuc2lvbi5kcmF3RWxlbWVudHNJbnN0YW5jZWRBTkdMRSggbW9kZSwgY291bnQsIHR5cGUsIHN0YXJ0ICogYnl0ZXNQZXJFbGVtZW50LCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCApO1xuXG5cdFx0aW5mby51cGRhdGUoIGNvdW50LCBtb2RlLCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCApO1xuXG5cdH1cblxuXHQvL1xuXG5cdHRoaXMuc2V0TW9kZSA9IHNldE1vZGU7XG5cdHRoaXMuc2V0SW5kZXggPSBzZXRJbmRleDtcblx0dGhpcy5yZW5kZXIgPSByZW5kZXI7XG5cdHRoaXMucmVuZGVySW5zdGFuY2VzID0gcmVuZGVySW5zdGFuY2VzO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBXZWJHTEluZm8oIGdsICkge1xuXG5cdHZhciBtZW1vcnkgPSB7XG5cdFx0Z2VvbWV0cmllczogMCxcblx0XHR0ZXh0dXJlczogMFxuXHR9O1xuXG5cdHZhciByZW5kZXIgPSB7XG5cdFx0ZnJhbWU6IDAsXG5cdFx0Y2FsbHM6IDAsXG5cdFx0dHJpYW5nbGVzOiAwLFxuXHRcdHBvaW50czogMCxcblx0XHRsaW5lczogMFxuXHR9O1xuXG5cdGZ1bmN0aW9uIHVwZGF0ZSggY291bnQsIG1vZGUsIGluc3RhbmNlQ291bnQgKSB7XG5cblx0XHRpbnN0YW5jZUNvdW50ID0gaW5zdGFuY2VDb3VudCB8fCAxO1xuXG5cdFx0cmVuZGVyLmNhbGxzICsrO1xuXG5cdFx0c3dpdGNoICggbW9kZSApIHtcblxuXHRcdFx0Y2FzZSBnbC5UUklBTkdMRVM6XG5cdFx0XHRcdHJlbmRlci50cmlhbmdsZXMgKz0gaW5zdGFuY2VDb3VudCAqICggY291bnQgLyAzICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIGdsLlRSSUFOR0xFX1NUUklQOlxuXHRcdFx0Y2FzZSBnbC5UUklBTkdMRV9GQU46XG5cdFx0XHRcdHJlbmRlci50cmlhbmdsZXMgKz0gaW5zdGFuY2VDb3VudCAqICggY291bnQgLSAyICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIGdsLkxJTkVTOlxuXHRcdFx0XHRyZW5kZXIubGluZXMgKz0gaW5zdGFuY2VDb3VudCAqICggY291bnQgLyAyICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIGdsLkxJTkVfU1RSSVA6XG5cdFx0XHRcdHJlbmRlci5saW5lcyArPSBpbnN0YW5jZUNvdW50ICogKCBjb3VudCAtIDEgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgZ2wuTElORV9MT09QOlxuXHRcdFx0XHRyZW5kZXIubGluZXMgKz0gaW5zdGFuY2VDb3VudCAqIGNvdW50O1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBnbC5QT0lOVFM6XG5cdFx0XHRcdHJlbmRlci5wb2ludHMgKz0gaW5zdGFuY2VDb3VudCAqIGNvdW50O1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMSW5mbzogVW5rbm93biBkcmF3IG1vZGU6JywgbW9kZSApO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVzZXQoKSB7XG5cblx0XHRyZW5kZXIuZnJhbWUgKys7XG5cdFx0cmVuZGVyLmNhbGxzID0gMDtcblx0XHRyZW5kZXIudHJpYW5nbGVzID0gMDtcblx0XHRyZW5kZXIucG9pbnRzID0gMDtcblx0XHRyZW5kZXIubGluZXMgPSAwO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdG1lbW9yeTogbWVtb3J5LFxuXHRcdHJlbmRlcjogcmVuZGVyLFxuXHRcdHByb2dyYW1zOiBudWxsLFxuXHRcdGF1dG9SZXNldDogdHJ1ZSxcblx0XHRyZXNldDogcmVzZXQsXG5cdFx0dXBkYXRlOiB1cGRhdGVcblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gYWJzTnVtZXJpY2FsU29ydCggYSwgYiApIHtcblxuXHRyZXR1cm4gTWF0aC5hYnMoIGJbIDEgXSApIC0gTWF0aC5hYnMoIGFbIDEgXSApO1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMTW9ycGh0YXJnZXRzKCBnbCApIHtcblxuXHR2YXIgaW5mbHVlbmNlc0xpc3QgPSB7fTtcblx0dmFyIG1vcnBoSW5mbHVlbmNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIDggKTtcblxuXHRmdW5jdGlvbiB1cGRhdGUoIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBwcm9ncmFtICkge1xuXG5cdFx0dmFyIG9iamVjdEluZmx1ZW5jZXMgPSBvYmplY3QubW9ycGhUYXJnZXRJbmZsdWVuY2VzO1xuXG5cdFx0dmFyIGxlbmd0aCA9IG9iamVjdEluZmx1ZW5jZXMubGVuZ3RoO1xuXG5cdFx0dmFyIGluZmx1ZW5jZXMgPSBpbmZsdWVuY2VzTGlzdFsgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggaW5mbHVlbmNlcyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBpbml0aWFsaXNlIGxpc3RcblxuXHRcdFx0aW5mbHVlbmNlcyA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0aW5mbHVlbmNlc1sgaSBdID0gWyBpLCAwIF07XG5cblx0XHRcdH1cblxuXHRcdFx0aW5mbHVlbmNlc0xpc3RbIGdlb21ldHJ5LmlkIF0gPSBpbmZsdWVuY2VzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyAmJiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0dmFyIG1vcnBoTm9ybWFscyA9IG1hdGVyaWFsLm1vcnBoTm9ybWFscyAmJiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsO1xuXG5cdFx0Ly8gUmVtb3ZlIGN1cnJlbnQgbW9ycGhBdHRyaWJ1dGVzXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBpbmZsdWVuY2UgPSBpbmZsdWVuY2VzWyBpIF07XG5cblx0XHRcdGlmICggaW5mbHVlbmNlWyAxIF0gIT09IDAgKSB7XG5cblx0XHRcdFx0aWYgKCBtb3JwaFRhcmdldHMgKSBnZW9tZXRyeS5yZW1vdmVBdHRyaWJ1dGUoICdtb3JwaFRhcmdldCcgKyBpICk7XG5cdFx0XHRcdGlmICggbW9ycGhOb3JtYWxzICkgZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCAnbW9ycGhOb3JtYWwnICsgaSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBDb2xsZWN0IGluZmx1ZW5jZXNcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGluZmx1ZW5jZSA9IGluZmx1ZW5jZXNbIGkgXTtcblxuXHRcdFx0aW5mbHVlbmNlWyAwIF0gPSBpO1xuXHRcdFx0aW5mbHVlbmNlWyAxIF0gPSBvYmplY3RJbmZsdWVuY2VzWyBpIF07XG5cblx0XHR9XG5cblx0XHRpbmZsdWVuY2VzLnNvcnQoIGFic051bWVyaWNhbFNvcnQgKTtcblxuXHRcdC8vIEFkZCBtb3JwaEF0dHJpYnV0ZXNcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBpbmZsdWVuY2UgPSBpbmZsdWVuY2VzWyBpIF07XG5cblx0XHRcdGlmICggaW5mbHVlbmNlICkge1xuXG5cdFx0XHRcdHZhciBpbmRleCA9IGluZmx1ZW5jZVsgMCBdO1xuXHRcdFx0XHR2YXIgdmFsdWUgPSBpbmZsdWVuY2VbIDEgXTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICkge1xuXG5cdFx0XHRcdFx0aWYgKCBtb3JwaFRhcmdldHMgKSBnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdtb3JwaFRhcmdldCcgKyBpLCBtb3JwaFRhcmdldHNbIGluZGV4IF0gKTtcblx0XHRcdFx0XHRpZiAoIG1vcnBoTm9ybWFscyApIGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ21vcnBoTm9ybWFsJyArIGksIG1vcnBoTm9ybWFsc1sgaW5kZXggXSApO1xuXG5cdFx0XHRcdFx0bW9ycGhJbmZsdWVuY2VzWyBpIF0gPSB2YWx1ZTtcblx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0bW9ycGhJbmZsdWVuY2VzWyBpIF0gPSAwO1xuXG5cdFx0fVxuXG5cdFx0cHJvZ3JhbS5nZXRVbmlmb3JtcygpLnNldFZhbHVlKCBnbCwgJ21vcnBoVGFyZ2V0SW5mbHVlbmNlcycsIG1vcnBoSW5mbHVlbmNlcyApO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0dXBkYXRlOiB1cGRhdGVcblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTE9iamVjdHMoIGdlb21ldHJpZXMsIGluZm8gKSB7XG5cblx0dmFyIHVwZGF0ZUxpc3QgPSB7fTtcblxuXHRmdW5jdGlvbiB1cGRhdGUoIG9iamVjdCApIHtcblxuXHRcdHZhciBmcmFtZSA9IGluZm8ucmVuZGVyLmZyYW1lO1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXHRcdHZhciBidWZmZXJnZW9tZXRyeSA9IGdlb21ldHJpZXMuZ2V0KCBvYmplY3QsIGdlb21ldHJ5ICk7XG5cblx0XHQvLyBVcGRhdGUgb25jZSBwZXIgZnJhbWVcblxuXHRcdGlmICggdXBkYXRlTGlzdFsgYnVmZmVyZ2VvbWV0cnkuaWQgXSAhPT0gZnJhbWUgKSB7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHRidWZmZXJnZW9tZXRyeS51cGRhdGVGcm9tT2JqZWN0KCBvYmplY3QgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyaWVzLnVwZGF0ZSggYnVmZmVyZ2VvbWV0cnkgKTtcblxuXHRcdFx0dXBkYXRlTGlzdFsgYnVmZmVyZ2VvbWV0cnkuaWQgXSA9IGZyYW1lO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGJ1ZmZlcmdlb21ldHJ5O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xuXG5cdFx0dXBkYXRlTGlzdCA9IHt9O1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0dXBkYXRlOiB1cGRhdGUsXG5cdFx0ZGlzcG9zZTogZGlzcG9zZVxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEN1YmVUZXh0dXJlKCBpbWFnZXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2RpbmcgKSB7XG5cblx0aW1hZ2VzID0gaW1hZ2VzICE9PSB1bmRlZmluZWQgPyBpbWFnZXMgOiBbXTtcblx0bWFwcGluZyA9IG1hcHBpbmcgIT09IHVuZGVmaW5lZCA/IG1hcHBpbmcgOiBDdWJlUmVmbGVjdGlvbk1hcHBpbmc7XG5cblx0VGV4dHVyZS5jYWxsKCB0aGlzLCBpbWFnZXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2RpbmcgKTtcblxuXHR0aGlzLmZsaXBZID0gZmFsc2U7XG5cbn1cblxuQ3ViZVRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkN1YmVUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1YmVUZXh0dXJlO1xuXG5DdWJlVGV4dHVyZS5wcm90b3R5cGUuaXNDdWJlVGV4dHVyZSA9IHRydWU7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggQ3ViZVRleHR1cmUucHJvdG90eXBlLCAnaW1hZ2VzJywge1xuXG5cdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuaW1hZ2U7XG5cblx0fSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmltYWdlID0gdmFsdWU7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB0c2Nod1xuICpcbiAqIFVuaWZvcm1zIG9mIGEgcHJvZ3JhbS5cbiAqIFRob3NlIGZvcm0gYSB0cmVlIHN0cnVjdHVyZSB3aXRoIGEgc3BlY2lhbCB0b3AtbGV2ZWwgY29udGFpbmVyIGZvciB0aGUgcm9vdCxcbiAqIHdoaWNoIHlvdSBnZXQgYnkgY2FsbGluZyAnbmV3IFdlYkdMVW5pZm9ybXMoIGdsLCBwcm9ncmFtLCByZW5kZXJlciApJy5cbiAqXG4gKlxuICogUHJvcGVydGllcyBvZiBpbm5lciBub2RlcyBpbmNsdWRpbmcgdGhlIHRvcC1sZXZlbCBjb250YWluZXI6XG4gKlxuICogLnNlcSAtIGFycmF5IG9mIG5lc3RlZCB1bmlmb3Jtc1xuICogLm1hcCAtIG5lc3RlZCB1bmlmb3JtcyBieSBuYW1lXG4gKlxuICpcbiAqIE1ldGhvZHMgb2YgYWxsIG5vZGVzIGV4Y2VwdCB0aGUgdG9wLWxldmVsIGNvbnRhaW5lcjpcbiAqXG4gKiAuc2V0VmFsdWUoIGdsLCB2YWx1ZSwgW3JlbmRlcmVyXSApXG4gKlxuICogXHRcdHVwbG9hZHMgYSB1bmlmb3JtIHZhbHVlKHMpXG4gKiAgXHR0aGUgJ3JlbmRlcmVyJyBwYXJhbWV0ZXIgaXMgbmVlZGVkIGZvciBzYW1wbGVyIHVuaWZvcm1zXG4gKlxuICpcbiAqIFN0YXRpYyBtZXRob2RzIG9mIHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyIChyZW5kZXJlciBmYWN0b3JpemF0aW9ucyk6XG4gKlxuICogLnVwbG9hZCggZ2wsIHNlcSwgdmFsdWVzLCByZW5kZXJlciApXG4gKlxuICogXHRcdHNldHMgdW5pZm9ybXMgaW4gJ3NlcScgdG8gJ3ZhbHVlc1tpZF0udmFsdWUnXG4gKlxuICogLnNlcVdpdGhWYWx1ZSggc2VxLCB2YWx1ZXMgKSA6IGZpbHRlcmVkU2VxXG4gKlxuICogXHRcdGZpbHRlcnMgJ3NlcScgZW50cmllcyB3aXRoIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdmFsdWVzXG4gKlxuICpcbiAqIE1ldGhvZHMgb2YgdGhlIHRvcC1sZXZlbCBjb250YWluZXIgKHJlbmRlcmVyIGZhY3Rvcml6YXRpb25zKTpcbiAqXG4gKiAuc2V0VmFsdWUoIGdsLCBuYW1lLCB2YWx1ZSApXG4gKlxuICogXHRcdHNldHMgdW5pZm9ybSB3aXRoICBuYW1lICduYW1lJyB0byAndmFsdWUnXG4gKlxuICogLnNldCggZ2wsIG9iaiwgcHJvcCApXG4gKlxuICogXHRcdHNldHMgdW5pZm9ybSBmcm9tIG9iamVjdCBhbmQgcHJvcGVydHkgd2l0aCBzYW1lIG5hbWUgdGhhbiB1bmlmb3JtXG4gKlxuICogLnNldE9wdGlvbmFsKCBnbCwgb2JqLCBwcm9wIClcbiAqXG4gKiBcdFx0bGlrZSAuc2V0IGZvciBhbiBvcHRpb25hbCBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0XG4gKlxuICovXG5cbnZhciBlbXB0eVRleHR1cmUgPSBuZXcgVGV4dHVyZSgpO1xudmFyIGVtcHR5Q3ViZVRleHR1cmUgPSBuZXcgQ3ViZVRleHR1cmUoKTtcblxuLy8gLS0tIEJhc2UgZm9yIGlubmVyIG5vZGVzIChpbmNsdWRpbmcgdGhlIHJvb3QpIC0tLVxuXG5mdW5jdGlvbiBVbmlmb3JtQ29udGFpbmVyKCkge1xuXG5cdHRoaXMuc2VxID0gW107XG5cdHRoaXMubWFwID0ge307XG5cbn1cblxuLy8gLS0tIFV0aWxpdGllcyAtLS1cblxuLy8gQXJyYXkgQ2FjaGVzIChwcm92aWRlIHR5cGVkIGFycmF5cyBmb3IgdGVtcG9yYXJ5IGJ5IHNpemUpXG5cbnZhciBhcnJheUNhY2hlRjMyID0gW107XG52YXIgYXJyYXlDYWNoZUkzMiA9IFtdO1xuXG4vLyBGbG9hdDMyQXJyYXkgY2FjaGVzIHVzZWQgZm9yIHVwbG9hZGluZyBNYXRyaXggdW5pZm9ybXNcblxudmFyIG1hdDRhcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIDE2ICk7XG52YXIgbWF0M2FycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggOSApO1xuXG4vLyBGbGF0dGVuaW5nIGZvciBhcnJheXMgb2YgdmVjdG9ycyBhbmQgbWF0cmljZXNcblxuZnVuY3Rpb24gZmxhdHRlbiggYXJyYXksIG5CbG9ja3MsIGJsb2NrU2l6ZSApIHtcblxuXHR2YXIgZmlyc3RFbGVtID0gYXJyYXlbIDAgXTtcblxuXHRpZiAoIGZpcnN0RWxlbSA8PSAwIHx8IGZpcnN0RWxlbSA+IDAgKSByZXR1cm4gYXJyYXk7XG5cdC8vIHVub3B0aW1pemVkOiAhIGlzTmFOKCBmaXJzdEVsZW0gKVxuXHQvLyBzZWUgaHR0cDovL2phY2tzb25kdW5zdGFuLmNvbS9hcnRpY2xlcy85ODNcblxuXHR2YXIgbiA9IG5CbG9ja3MgKiBibG9ja1NpemUsXG5cdFx0ciA9IGFycmF5Q2FjaGVGMzJbIG4gXTtcblxuXHRpZiAoIHIgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdHIgPSBuZXcgRmxvYXQzMkFycmF5KCBuICk7XG5cdFx0YXJyYXlDYWNoZUYzMlsgbiBdID0gcjtcblxuXHR9XG5cblx0aWYgKCBuQmxvY2tzICE9PSAwICkge1xuXG5cdFx0Zmlyc3RFbGVtLnRvQXJyYXkoIHIsIDAgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMSwgb2Zmc2V0ID0gMDsgaSAhPT0gbkJsb2NrczsgKysgaSApIHtcblxuXHRcdFx0b2Zmc2V0ICs9IGJsb2NrU2l6ZTtcblx0XHRcdGFycmF5WyBpIF0udG9BcnJheSggciwgb2Zmc2V0ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiByO1xuXG59XG5cbi8vIFRleHR1cmUgdW5pdCBhbGxvY2F0aW9uXG5cbmZ1bmN0aW9uIGFsbG9jVGV4VW5pdHMoIHJlbmRlcmVyLCBuICkge1xuXG5cdHZhciByID0gYXJyYXlDYWNoZUkzMlsgbiBdO1xuXG5cdGlmICggciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0ciA9IG5ldyBJbnQzMkFycmF5KCBuICk7XG5cdFx0YXJyYXlDYWNoZUkzMlsgbiBdID0gcjtcblxuXHR9XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpIClcblx0XHRyWyBpIF0gPSByZW5kZXJlci5hbGxvY1RleHR1cmVVbml0KCk7XG5cblx0cmV0dXJuIHI7XG5cbn1cblxuLy8gLS0tIFNldHRlcnMgLS0tXG5cbi8vIE5vdGU6IERlZmluaW5nIHRoZXNlIG1ldGhvZHMgZXh0ZXJuYWxseSwgYmVjYXVzZSB0aGV5IGNvbWUgaW4gYSBidW5jaFxuLy8gYW5kIHRoaXMgd2F5IHRoZWlyIG5hbWVzIG1pbmlmeS5cblxuLy8gU2luZ2xlIHNjYWxhclxuXG5mdW5jdGlvbiBzZXRWYWx1ZTFmKCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtMWYoIHRoaXMuYWRkciwgdiApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlMWkoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm0xaSggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuLy8gU2luZ2xlIGZsb2F0IHZlY3RvciAoZnJvbSBmbGF0IGFycmF5IG9yIFRIUkVFLlZlY3Rvck4pXG5cbmZ1bmN0aW9uIHNldFZhbHVlMmZ2KCBnbCwgdiApIHtcblxuXHRpZiAoIHYueCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0Z2wudW5pZm9ybTJmdiggdGhpcy5hZGRyLCB2ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGdsLnVuaWZvcm0yZiggdGhpcy5hZGRyLCB2LngsIHYueSApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTNmdiggZ2wsIHYgKSB7XG5cblx0aWYgKCB2LnggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGdsLnVuaWZvcm0zZiggdGhpcy5hZGRyLCB2LngsIHYueSwgdi56ICk7XG5cblx0fSBlbHNlIGlmICggdi5yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRnbC51bmlmb3JtM2YoIHRoaXMuYWRkciwgdi5yLCB2LmcsIHYuYiApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRnbC51bmlmb3JtM2Z2KCB0aGlzLmFkZHIsIHYgKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWU0ZnYoIGdsLCB2ICkge1xuXG5cdGlmICggdi54ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRnbC51bmlmb3JtNGZ2KCB0aGlzLmFkZHIsIHYgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0IGdsLnVuaWZvcm00ZiggdGhpcy5hZGRyLCB2LngsIHYueSwgdi56LCB2LncgKTtcblxuXHR9XG5cbn1cblxuLy8gU2luZ2xlIG1hdHJpeCAoZnJvbSBmbGF0IGFycmF5IG9yIE1hdHJpeE4pXG5cbmZ1bmN0aW9uIHNldFZhbHVlMmZtKCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtTWF0cml4MmZ2KCB0aGlzLmFkZHIsIGZhbHNlLCB2LmVsZW1lbnRzIHx8IHYgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTNmbSggZ2wsIHYgKSB7XG5cblx0aWYgKCB2LmVsZW1lbnRzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRnbC51bmlmb3JtTWF0cml4M2Z2KCB0aGlzLmFkZHIsIGZhbHNlLCB2ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdG1hdDNhcnJheS5zZXQoIHYuZWxlbWVudHMgKTtcblx0XHRnbC51bmlmb3JtTWF0cml4M2Z2KCB0aGlzLmFkZHIsIGZhbHNlLCBtYXQzYXJyYXkgKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWU0Zm0oIGdsLCB2ICkge1xuXG5cdGlmICggdi5lbGVtZW50cyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0Z2wudW5pZm9ybU1hdHJpeDRmdiggdGhpcy5hZGRyLCBmYWxzZSwgdiApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRtYXQ0YXJyYXkuc2V0KCB2LmVsZW1lbnRzICk7XG5cdFx0Z2wudW5pZm9ybU1hdHJpeDRmdiggdGhpcy5hZGRyLCBmYWxzZSwgbWF0NGFycmF5ICk7XG5cblx0fVxuXG59XG5cbi8vIFNpbmdsZSB0ZXh0dXJlICgyRCAvIEN1YmUpXG5cbmZ1bmN0aW9uIHNldFZhbHVlVDEoIGdsLCB2LCByZW5kZXJlciApIHtcblxuXHR2YXIgdW5pdCA9IHJlbmRlcmVyLmFsbG9jVGV4dHVyZVVuaXQoKTtcblx0Z2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHVuaXQgKTtcblx0cmVuZGVyZXIuc2V0VGV4dHVyZTJEKCB2IHx8IGVtcHR5VGV4dHVyZSwgdW5pdCApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlVDYoIGdsLCB2LCByZW5kZXJlciApIHtcblxuXHR2YXIgdW5pdCA9IHJlbmRlcmVyLmFsbG9jVGV4dHVyZVVuaXQoKTtcblx0Z2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHVuaXQgKTtcblx0cmVuZGVyZXIuc2V0VGV4dHVyZUN1YmUoIHYgfHwgZW1wdHlDdWJlVGV4dHVyZSwgdW5pdCApO1xuXG59XG5cbi8vIEludGVnZXIgLyBCb29sZWFuIHZlY3RvcnMgb3IgYXJyYXlzIHRoZXJlb2YgKGFsd2F5cyBmbGF0IGFycmF5cylcblxuZnVuY3Rpb24gc2V0VmFsdWUyaXYoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm0yaXYoIHRoaXMuYWRkciwgdiApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlM2l2KCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtM2l2KCB0aGlzLmFkZHIsIHYgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTRpdiggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTRpdiggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuLy8gSGVscGVyIHRvIHBpY2sgdGhlIHJpZ2h0IHNldHRlciBmb3IgdGhlIHNpbmd1bGFyIGNhc2VcblxuZnVuY3Rpb24gZ2V0U2luZ3VsYXJTZXR0ZXIoIHR5cGUgKSB7XG5cblx0c3dpdGNoICggdHlwZSApIHtcblxuXHRcdGNhc2UgMHgxNDA2OiByZXR1cm4gc2V0VmFsdWUxZjsgLy8gRkxPQVRcblx0XHRjYXNlIDB4OGI1MDogcmV0dXJuIHNldFZhbHVlMmZ2OyAvLyBfVkVDMlxuXHRcdGNhc2UgMHg4YjUxOiByZXR1cm4gc2V0VmFsdWUzZnY7IC8vIF9WRUMzXG5cdFx0Y2FzZSAweDhiNTI6IHJldHVybiBzZXRWYWx1ZTRmdjsgLy8gX1ZFQzRcblxuXHRcdGNhc2UgMHg4YjVhOiByZXR1cm4gc2V0VmFsdWUyZm07IC8vIF9NQVQyXG5cdFx0Y2FzZSAweDhiNWI6IHJldHVybiBzZXRWYWx1ZTNmbTsgLy8gX01BVDNcblx0XHRjYXNlIDB4OGI1YzogcmV0dXJuIHNldFZhbHVlNGZtOyAvLyBfTUFUNFxuXG5cdFx0Y2FzZSAweDhiNWU6IGNhc2UgMHg4ZDY2OiByZXR1cm4gc2V0VmFsdWVUMTsgLy8gU0FNUExFUl8yRCwgU0FNUExFUl9FWFRFUk5BTF9PRVNcblx0XHRjYXNlIDB4OGI2MDogcmV0dXJuIHNldFZhbHVlVDY7IC8vIFNBTVBMRVJfQ1VCRVxuXG5cdFx0Y2FzZSAweDE0MDQ6IGNhc2UgMHg4YjU2OiByZXR1cm4gc2V0VmFsdWUxaTsgLy8gSU5ULCBCT09MXG5cdFx0Y2FzZSAweDhiNTM6IGNhc2UgMHg4YjU3OiByZXR1cm4gc2V0VmFsdWUyaXY7IC8vIF9WRUMyXG5cdFx0Y2FzZSAweDhiNTQ6IGNhc2UgMHg4YjU4OiByZXR1cm4gc2V0VmFsdWUzaXY7IC8vIF9WRUMzXG5cdFx0Y2FzZSAweDhiNTU6IGNhc2UgMHg4YjU5OiByZXR1cm4gc2V0VmFsdWU0aXY7IC8vIF9WRUM0XG5cblx0fVxuXG59XG5cbi8vIEFycmF5IG9mIHNjYWxhcnNcblxuZnVuY3Rpb24gc2V0VmFsdWUxZnYoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm0xZnYoIHRoaXMuYWRkciwgdiApO1xuXG59XG5mdW5jdGlvbiBzZXRWYWx1ZTFpdiggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTFpdiggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuLy8gQXJyYXkgb2YgdmVjdG9ycyAoZmxhdCBvciBmcm9tIFRIUkVFIGNsYXNzZXMpXG5cbmZ1bmN0aW9uIHNldFZhbHVlVjJhKCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtMmZ2KCB0aGlzLmFkZHIsIGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgMiApICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVWM2EoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm0zZnYoIHRoaXMuYWRkciwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCAzICkgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVY0YSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTRmdiggdGhpcy5hZGRyLCBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDQgKSApO1xuXG59XG5cbi8vIEFycmF5IG9mIG1hdHJpY2VzIChmbGF0IG9yIGZyb20gVEhSRUUgY2xhc2VzKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZU0yYSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybU1hdHJpeDJmdiggdGhpcy5hZGRyLCBmYWxzZSwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCA0ICkgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZU0zYSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybU1hdHJpeDNmdiggdGhpcy5hZGRyLCBmYWxzZSwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCA5ICkgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZU00YSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybU1hdHJpeDRmdiggdGhpcy5hZGRyLCBmYWxzZSwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCAxNiApICk7XG5cbn1cblxuLy8gQXJyYXkgb2YgdGV4dHVyZXMgKDJEIC8gQ3ViZSlcblxuZnVuY3Rpb24gc2V0VmFsdWVUMWEoIGdsLCB2LCByZW5kZXJlciApIHtcblxuXHR2YXIgbiA9IHYubGVuZ3RoLFxuXHRcdHVuaXRzID0gYWxsb2NUZXhVbml0cyggcmVuZGVyZXIsIG4gKTtcblxuXHRnbC51bmlmb3JtMWl2KCB0aGlzLmFkZHIsIHVuaXRzICk7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0cmVuZGVyZXIuc2V0VGV4dHVyZTJEKCB2WyBpIF0gfHwgZW1wdHlUZXh0dXJlLCB1bml0c1sgaSBdICk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlVDZhKCBnbCwgdiwgcmVuZGVyZXIgKSB7XG5cblx0dmFyIG4gPSB2Lmxlbmd0aCxcblx0XHR1bml0cyA9IGFsbG9jVGV4VW5pdHMoIHJlbmRlcmVyLCBuICk7XG5cblx0Z2wudW5pZm9ybTFpdiggdGhpcy5hZGRyLCB1bml0cyApO1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdHJlbmRlcmVyLnNldFRleHR1cmVDdWJlKCB2WyBpIF0gfHwgZW1wdHlDdWJlVGV4dHVyZSwgdW5pdHNbIGkgXSApO1xuXG5cdH1cblxufVxuXG4vLyBIZWxwZXIgdG8gcGljayB0aGUgcmlnaHQgc2V0dGVyIGZvciBhIHB1cmUgKGJvdHRvbS1sZXZlbCkgYXJyYXlcblxuZnVuY3Rpb24gZ2V0UHVyZUFycmF5U2V0dGVyKCB0eXBlICkge1xuXG5cdHN3aXRjaCAoIHR5cGUgKSB7XG5cblx0XHRjYXNlIDB4MTQwNjogcmV0dXJuIHNldFZhbHVlMWZ2OyAvLyBGTE9BVFxuXHRcdGNhc2UgMHg4YjUwOiByZXR1cm4gc2V0VmFsdWVWMmE7IC8vIF9WRUMyXG5cdFx0Y2FzZSAweDhiNTE6IHJldHVybiBzZXRWYWx1ZVYzYTsgLy8gX1ZFQzNcblx0XHRjYXNlIDB4OGI1MjogcmV0dXJuIHNldFZhbHVlVjRhOyAvLyBfVkVDNFxuXG5cdFx0Y2FzZSAweDhiNWE6IHJldHVybiBzZXRWYWx1ZU0yYTsgLy8gX01BVDJcblx0XHRjYXNlIDB4OGI1YjogcmV0dXJuIHNldFZhbHVlTTNhOyAvLyBfTUFUM1xuXHRcdGNhc2UgMHg4YjVjOiByZXR1cm4gc2V0VmFsdWVNNGE7IC8vIF9NQVQ0XG5cblx0XHRjYXNlIDB4OGI1ZTogcmV0dXJuIHNldFZhbHVlVDFhOyAvLyBTQU1QTEVSXzJEXG5cdFx0Y2FzZSAweDhiNjA6IHJldHVybiBzZXRWYWx1ZVQ2YTsgLy8gU0FNUExFUl9DVUJFXG5cblx0XHRjYXNlIDB4MTQwNDogY2FzZSAweDhiNTY6IHJldHVybiBzZXRWYWx1ZTFpdjsgLy8gSU5ULCBCT09MXG5cdFx0Y2FzZSAweDhiNTM6IGNhc2UgMHg4YjU3OiByZXR1cm4gc2V0VmFsdWUyaXY7IC8vIF9WRUMyXG5cdFx0Y2FzZSAweDhiNTQ6IGNhc2UgMHg4YjU4OiByZXR1cm4gc2V0VmFsdWUzaXY7IC8vIF9WRUMzXG5cdFx0Y2FzZSAweDhiNTU6IGNhc2UgMHg4YjU5OiByZXR1cm4gc2V0VmFsdWU0aXY7IC8vIF9WRUM0XG5cblx0fVxuXG59XG5cbi8vIC0tLSBVbmlmb3JtIENsYXNzZXMgLS0tXG5cbmZ1bmN0aW9uIFNpbmdsZVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkge1xuXG5cdHRoaXMuaWQgPSBpZDtcblx0dGhpcy5hZGRyID0gYWRkcjtcblx0dGhpcy5zZXRWYWx1ZSA9IGdldFNpbmd1bGFyU2V0dGVyKCBhY3RpdmVJbmZvLnR5cGUgKTtcblxuXHQvLyB0aGlzLnBhdGggPSBhY3RpdmVJbmZvLm5hbWU7IC8vIERFQlVHXG5cbn1cblxuZnVuY3Rpb24gUHVyZUFycmF5VW5pZm9ybSggaWQsIGFjdGl2ZUluZm8sIGFkZHIgKSB7XG5cblx0dGhpcy5pZCA9IGlkO1xuXHR0aGlzLmFkZHIgPSBhZGRyO1xuXHR0aGlzLnNpemUgPSBhY3RpdmVJbmZvLnNpemU7XG5cdHRoaXMuc2V0VmFsdWUgPSBnZXRQdXJlQXJyYXlTZXR0ZXIoIGFjdGl2ZUluZm8udHlwZSApO1xuXG5cdC8vIHRoaXMucGF0aCA9IGFjdGl2ZUluZm8ubmFtZTsgLy8gREVCVUdcblxufVxuXG5mdW5jdGlvbiBTdHJ1Y3R1cmVkVW5pZm9ybSggaWQgKSB7XG5cblx0dGhpcy5pZCA9IGlkO1xuXG5cdFVuaWZvcm1Db250YWluZXIuY2FsbCggdGhpcyApOyAvLyBtaXgtaW5cblxufVxuXG5TdHJ1Y3R1cmVkVW5pZm9ybS5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAoIGdsLCB2YWx1ZSApIHtcblxuXHQvLyBOb3RlOiBEb24ndCBuZWVkIGFuIGV4dHJhICdyZW5kZXJlcicgcGFyYW1ldGVyLCBzaW5jZSBzYW1wbGVyc1xuXHQvLyBhcmUgbm90IGFsbG93ZWQgaW4gc3RydWN0dXJlZCB1bmlmb3Jtcy5cblxuXHR2YXIgc2VxID0gdGhpcy5zZXE7XG5cblx0Zm9yICggdmFyIGkgPSAwLCBuID0gc2VxLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdHZhciB1ID0gc2VxWyBpIF07XG5cdFx0dS5zZXRWYWx1ZSggZ2wsIHZhbHVlWyB1LmlkIF0gKTtcblxuXHR9XG5cbn07XG5cbi8vIC0tLSBUb3AtbGV2ZWwgLS0tXG5cbi8vIFBhcnNlciAtIGJ1aWxkcyB1cCB0aGUgcHJvcGVydHkgdHJlZSBmcm9tIHRoZSBwYXRoIHN0cmluZ3NcblxudmFyIFJlUGF0aFBhcnQgPSAvKFtcXHdcXGRfXSspKFxcXSk/KFxcW3xcXC4pPy9nO1xuXG4vLyBleHRyYWN0c1xuLy8gXHQtIHRoZSBpZGVudGlmaWVyIChtZW1iZXIgbmFtZSBvciBhcnJheSBpbmRleClcbi8vICAtIGZvbGxvd2VkIGJ5IGFuIG9wdGlvbmFsIHJpZ2h0IGJyYWNrZXQgKGZvdW5kIHdoZW4gYXJyYXkgaW5kZXgpXG4vLyAgLSBmb2xsb3dlZCBieSBhbiBvcHRpb25hbCBsZWZ0IGJyYWNrZXQgb3IgZG90ICh0eXBlIG9mIHN1YnNjcmlwdClcbi8vXG4vLyBOb3RlOiBUaGVzZSBwb3J0aW9ucyBjYW4gYmUgcmVhZCBpbiBhIG5vbi1vdmVybGFwcGluZyBmYXNoaW9uIGFuZFxuLy8gYWxsb3cgc3RyYWlnaHRmb3J3YXJkIHBhcnNpbmcgb2YgdGhlIGhpZXJhcmNoeSB0aGF0IFdlYkdMIGVuY29kZXNcbi8vIGluIHRoZSB1bmlmb3JtIG5hbWVzLlxuXG5mdW5jdGlvbiBhZGRVbmlmb3JtKCBjb250YWluZXIsIHVuaWZvcm1PYmplY3QgKSB7XG5cblx0Y29udGFpbmVyLnNlcS5wdXNoKCB1bmlmb3JtT2JqZWN0ICk7XG5cdGNvbnRhaW5lci5tYXBbIHVuaWZvcm1PYmplY3QuaWQgXSA9IHVuaWZvcm1PYmplY3Q7XG5cbn1cblxuZnVuY3Rpb24gcGFyc2VVbmlmb3JtKCBhY3RpdmVJbmZvLCBhZGRyLCBjb250YWluZXIgKSB7XG5cblx0dmFyIHBhdGggPSBhY3RpdmVJbmZvLm5hbWUsXG5cdFx0cGF0aExlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG5cdC8vIHJlc2V0IFJlZ0V4cCBvYmplY3QsIGJlY2F1c2Ugb2YgdGhlIGVhcmx5IGV4aXQgb2YgYSBwcmV2aW91cyBydW5cblx0UmVQYXRoUGFydC5sYXN0SW5kZXggPSAwO1xuXG5cdGZvciAoIDsgOyApIHtcblxuXHRcdHZhciBtYXRjaCA9IFJlUGF0aFBhcnQuZXhlYyggcGF0aCApLFxuXHRcdFx0bWF0Y2hFbmQgPSBSZVBhdGhQYXJ0Lmxhc3RJbmRleCxcblxuXHRcdFx0aWQgPSBtYXRjaFsgMSBdLFxuXHRcdFx0aWRJc0luZGV4ID0gbWF0Y2hbIDIgXSA9PT0gJ10nLFxuXHRcdFx0c3Vic2NyaXB0ID0gbWF0Y2hbIDMgXTtcblxuXHRcdGlmICggaWRJc0luZGV4ICkgaWQgPSBpZCB8IDA7IC8vIGNvbnZlcnQgdG8gaW50ZWdlclxuXG5cdFx0aWYgKCBzdWJzY3JpcHQgPT09IHVuZGVmaW5lZCB8fCBzdWJzY3JpcHQgPT09ICdbJyAmJiBtYXRjaEVuZCArIDIgPT09IHBhdGhMZW5ndGggKSB7XG5cblx0XHRcdC8vIGJhcmUgbmFtZSBvciBcInB1cmVcIiBib3R0b20tbGV2ZWwgYXJyYXkgXCJbMF1cIiBzdWZmaXhcblxuXHRcdFx0YWRkVW5pZm9ybSggY29udGFpbmVyLCBzdWJzY3JpcHQgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdG5ldyBTaW5nbGVVbmlmb3JtKCBpZCwgYWN0aXZlSW5mbywgYWRkciApIDpcblx0XHRcdFx0bmV3IFB1cmVBcnJheVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkgKTtcblxuXHRcdFx0YnJlYWs7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBzdGVwIGludG8gaW5uZXIgbm9kZSAvIGNyZWF0ZSBpdCBpbiBjYXNlIGl0IGRvZXNuJ3QgZXhpc3RcblxuXHRcdFx0dmFyIG1hcCA9IGNvbnRhaW5lci5tYXAsIG5leHQgPSBtYXBbIGlkIF07XG5cblx0XHRcdGlmICggbmV4dCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG5leHQgPSBuZXcgU3RydWN0dXJlZFVuaWZvcm0oIGlkICk7XG5cdFx0XHRcdGFkZFVuaWZvcm0oIGNvbnRhaW5lciwgbmV4dCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnRhaW5lciA9IG5leHQ7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbi8vIFJvb3QgQ29udGFpbmVyXG5cbmZ1bmN0aW9uIFdlYkdMVW5pZm9ybXMoIGdsLCBwcm9ncmFtLCByZW5kZXJlciApIHtcblxuXHRVbmlmb3JtQ29udGFpbmVyLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG5cblx0dmFyIG4gPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCBnbC5BQ1RJVkVfVU5JRk9STVMgKTtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBuOyArKyBpICkge1xuXG5cdFx0dmFyIGluZm8gPSBnbC5nZXRBY3RpdmVVbmlmb3JtKCBwcm9ncmFtLCBpICksXG5cdFx0XHRhZGRyID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCBpbmZvLm5hbWUgKTtcblxuXHRcdHBhcnNlVW5pZm9ybSggaW5mbywgYWRkciwgdGhpcyApO1xuXG5cdH1cblxufVxuXG5XZWJHTFVuaWZvcm1zLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uICggZ2wsIG5hbWUsIHZhbHVlICkge1xuXG5cdHZhciB1ID0gdGhpcy5tYXBbIG5hbWUgXTtcblxuXHRpZiAoIHUgIT09IHVuZGVmaW5lZCApIHUuc2V0VmFsdWUoIGdsLCB2YWx1ZSwgdGhpcy5yZW5kZXJlciApO1xuXG59O1xuXG5XZWJHTFVuaWZvcm1zLnByb3RvdHlwZS5zZXRPcHRpb25hbCA9IGZ1bmN0aW9uICggZ2wsIG9iamVjdCwgbmFtZSApIHtcblxuXHR2YXIgdiA9IG9iamVjdFsgbmFtZSBdO1xuXG5cdGlmICggdiAhPT0gdW5kZWZpbmVkICkgdGhpcy5zZXRWYWx1ZSggZ2wsIG5hbWUsIHYgKTtcblxufTtcblxuXG4vLyBTdGF0aWMgaW50ZXJmYWNlXG5cbldlYkdMVW5pZm9ybXMudXBsb2FkID0gZnVuY3Rpb24gKCBnbCwgc2VxLCB2YWx1ZXMsIHJlbmRlcmVyICkge1xuXG5cdGZvciAoIHZhciBpID0gMCwgbiA9IHNlcS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHR2YXIgdSA9IHNlcVsgaSBdLFxuXHRcdFx0diA9IHZhbHVlc1sgdS5pZCBdO1xuXG5cdFx0aWYgKCB2Lm5lZWRzVXBkYXRlICE9PSBmYWxzZSApIHtcblxuXHRcdFx0Ly8gbm90ZTogYWx3YXlzIHVwZGF0aW5nIHdoZW4gLm5lZWRzVXBkYXRlIGlzIHVuZGVmaW5lZFxuXHRcdFx0dS5zZXRWYWx1ZSggZ2wsIHYudmFsdWUsIHJlbmRlcmVyICk7XG5cblx0XHR9XG5cblx0fVxuXG59O1xuXG5XZWJHTFVuaWZvcm1zLnNlcVdpdGhWYWx1ZSA9IGZ1bmN0aW9uICggc2VxLCB2YWx1ZXMgKSB7XG5cblx0dmFyIHIgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBzZXEubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0dmFyIHUgPSBzZXFbIGkgXTtcblx0XHRpZiAoIHUuaWQgaW4gdmFsdWVzICkgci5wdXNoKCB1ICk7XG5cblx0fVxuXG5cdHJldHVybiByO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gYWRkTGluZU51bWJlcnMoIHN0cmluZyApIHtcblxuXHR2YXIgbGluZXMgPSBzdHJpbmcuc3BsaXQoICdcXG4nICk7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0bGluZXNbIGkgXSA9ICggaSArIDEgKSArICc6ICcgKyBsaW5lc1sgaSBdO1xuXG5cdH1cblxuXHRyZXR1cm4gbGluZXMuam9pbiggJ1xcbicgKTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTFNoYWRlciggZ2wsIHR5cGUsIHN0cmluZyApIHtcblxuXHR2YXIgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKCB0eXBlICk7XG5cblx0Z2wuc2hhZGVyU291cmNlKCBzaGFkZXIsIHN0cmluZyApO1xuXHRnbC5jb21waWxlU2hhZGVyKCBzaGFkZXIgKTtcblxuXHRpZiAoIGdsLmdldFNoYWRlclBhcmFtZXRlciggc2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUyApID09PSBmYWxzZSApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFNoYWRlcjogU2hhZGVyIGNvdWxkblxcJ3QgY29tcGlsZS4nICk7XG5cblx0fVxuXG5cdGlmICggZ2wuZ2V0U2hhZGVySW5mb0xvZyggc2hhZGVyICkgIT09ICcnICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xTaGFkZXI6IGdsLmdldFNoYWRlckluZm9Mb2coKScsIHR5cGUgPT09IGdsLlZFUlRFWF9TSEFERVIgPyAndmVydGV4JyA6ICdmcmFnbWVudCcsIGdsLmdldFNoYWRlckluZm9Mb2coIHNoYWRlciApLCBhZGRMaW5lTnVtYmVycyggc3RyaW5nICkgKTtcblxuXHR9XG5cblx0Ly8gLS1lbmFibGUtcHJpdmlsZWdlZC13ZWJnbC1leHRlbnNpb25cblx0Ly8gY29uc29sZS5sb2coIHR5cGUsIGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2RlYnVnX3NoYWRlcnMnICkuZ2V0VHJhbnNsYXRlZFNoYWRlclNvdXJjZSggc2hhZGVyICkgKTtcblxuXHRyZXR1cm4gc2hhZGVyO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgcHJvZ3JhbUlkQ291bnQgPSAwO1xuXG5mdW5jdGlvbiBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGVuY29kaW5nICkge1xuXG5cdHN3aXRjaCAoIGVuY29kaW5nICkge1xuXG5cdFx0Y2FzZSBMaW5lYXJFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdMaW5lYXInLCAnKCB2YWx1ZSApJyBdO1xuXHRcdGNhc2Ugc1JHQkVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ3NSR0InLCAnKCB2YWx1ZSApJyBdO1xuXHRcdGNhc2UgUkdCRUVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ1JHQkUnLCAnKCB2YWx1ZSApJyBdO1xuXHRcdGNhc2UgUkdCTTdFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdSR0JNJywgJyggdmFsdWUsIDcuMCApJyBdO1xuXHRcdGNhc2UgUkdCTTE2RW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnUkdCTScsICcoIHZhbHVlLCAxNi4wICknIF07XG5cdFx0Y2FzZSBSR0JERW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnUkdCRCcsICcoIHZhbHVlLCAyNTYuMCApJyBdO1xuXHRcdGNhc2UgR2FtbWFFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdHYW1tYScsICcoIHZhbHVlLCBmbG9hdCggR0FNTUFfRkFDVE9SICkgKScgXTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAndW5zdXBwb3J0ZWQgZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oIGZ1bmN0aW9uTmFtZSwgZW5jb2RpbmcgKSB7XG5cblx0dmFyIGNvbXBvbmVudHMgPSBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGVuY29kaW5nICk7XG5cdHJldHVybiAndmVjNCAnICsgZnVuY3Rpb25OYW1lICsgJyggdmVjNCB2YWx1ZSApIHsgcmV0dXJuICcgKyBjb21wb25lbnRzWyAwIF0gKyAnVG9MaW5lYXInICsgY29tcG9uZW50c1sgMSBdICsgJzsgfSc7XG5cbn1cblxuZnVuY3Rpb24gZ2V0VGV4ZWxFbmNvZGluZ0Z1bmN0aW9uKCBmdW5jdGlvbk5hbWUsIGVuY29kaW5nICkge1xuXG5cdHZhciBjb21wb25lbnRzID0gZ2V0RW5jb2RpbmdDb21wb25lbnRzKCBlbmNvZGluZyApO1xuXHRyZXR1cm4gJ3ZlYzQgJyArIGZ1bmN0aW9uTmFtZSArICcoIHZlYzQgdmFsdWUgKSB7IHJldHVybiBMaW5lYXJUbycgKyBjb21wb25lbnRzWyAwIF0gKyBjb21wb25lbnRzWyAxIF0gKyAnOyB9JztcblxufVxuXG5mdW5jdGlvbiBnZXRUb25lTWFwcGluZ0Z1bmN0aW9uKCBmdW5jdGlvbk5hbWUsIHRvbmVNYXBwaW5nICkge1xuXG5cdHZhciB0b25lTWFwcGluZ05hbWU7XG5cblx0c3dpdGNoICggdG9uZU1hcHBpbmcgKSB7XG5cblx0XHRjYXNlIExpbmVhclRvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ0xpbmVhcic7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgUmVpbmhhcmRUb25lTWFwcGluZzpcblx0XHRcdHRvbmVNYXBwaW5nTmFtZSA9ICdSZWluaGFyZCc7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVW5jaGFydGVkMlRvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ1VuY2hhcnRlZDInO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIENpbmVvblRvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ09wdGltaXplZENpbmVvbic7XG5cdFx0XHRicmVhaztcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICd1bnN1cHBvcnRlZCB0b25lTWFwcGluZzogJyArIHRvbmVNYXBwaW5nICk7XG5cblx0fVxuXG5cdHJldHVybiAndmVjMyAnICsgZnVuY3Rpb25OYW1lICsgJyggdmVjMyBjb2xvciApIHsgcmV0dXJuICcgKyB0b25lTWFwcGluZ05hbWUgKyAnVG9uZU1hcHBpbmcoIGNvbG9yICk7IH0nO1xuXG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXh0ZW5zaW9ucyggZXh0ZW5zaW9ucywgcGFyYW1ldGVycywgcmVuZGVyZXJFeHRlbnNpb25zICkge1xuXG5cdGV4dGVuc2lvbnMgPSBleHRlbnNpb25zIHx8IHt9O1xuXG5cdHZhciBjaHVua3MgPSBbXG5cdFx0KCBleHRlbnNpb25zLmRlcml2YXRpdmVzIHx8IHBhcmFtZXRlcnMuZW52TWFwQ3ViZVVWIHx8IHBhcmFtZXRlcnMuYnVtcE1hcCB8fCBwYXJhbWV0ZXJzLm5vcm1hbE1hcCB8fCBwYXJhbWV0ZXJzLmZsYXRTaGFkaW5nICkgPyAnI2V4dGVuc2lvbiBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMgOiBlbmFibGUnIDogJycsXG5cdFx0KCBleHRlbnNpb25zLmZyYWdEZXB0aCB8fCBwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgKSAmJiByZW5kZXJlckV4dGVuc2lvbnMuZ2V0KCAnRVhUX2ZyYWdfZGVwdGgnICkgPyAnI2V4dGVuc2lvbiBHTF9FWFRfZnJhZ19kZXB0aCA6IGVuYWJsZScgOiAnJyxcblx0XHQoIGV4dGVuc2lvbnMuZHJhd0J1ZmZlcnMgKSAmJiByZW5kZXJlckV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfZHJhd19idWZmZXJzJyApID8gJyNleHRlbnNpb24gR0xfRVhUX2RyYXdfYnVmZmVycyA6IHJlcXVpcmUnIDogJycsXG5cdFx0KCBleHRlbnNpb25zLnNoYWRlclRleHR1cmVMT0QgfHwgcGFyYW1ldGVycy5lbnZNYXAgKSAmJiByZW5kZXJlckV4dGVuc2lvbnMuZ2V0KCAnRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCcgKSA/ICcjZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QgOiBlbmFibGUnIDogJydcblx0XTtcblxuXHRyZXR1cm4gY2h1bmtzLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xcbicgKTtcblxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZURlZmluZXMoIGRlZmluZXMgKSB7XG5cblx0dmFyIGNodW5rcyA9IFtdO1xuXG5cdGZvciAoIHZhciBuYW1lIGluIGRlZmluZXMgKSB7XG5cblx0XHR2YXIgdmFsdWUgPSBkZWZpbmVzWyBuYW1lIF07XG5cblx0XHRpZiAoIHZhbHVlID09PSBmYWxzZSApIGNvbnRpbnVlO1xuXG5cdFx0Y2h1bmtzLnB1c2goICcjZGVmaW5lICcgKyBuYW1lICsgJyAnICsgdmFsdWUgKTtcblxuXHR9XG5cblx0cmV0dXJuIGNodW5rcy5qb2luKCAnXFxuJyApO1xuXG59XG5cbmZ1bmN0aW9uIGZldGNoQXR0cmlidXRlTG9jYXRpb25zKCBnbCwgcHJvZ3JhbSApIHtcblxuXHR2YXIgYXR0cmlidXRlcyA9IHt9O1xuXG5cdHZhciBuID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgZ2wuQUNUSVZFX0FUVFJJQlVURVMgKTtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBuOyBpICsrICkge1xuXG5cdFx0dmFyIGluZm8gPSBnbC5nZXRBY3RpdmVBdHRyaWIoIHByb2dyYW0sIGkgKTtcblx0XHR2YXIgbmFtZSA9IGluZm8ubmFtZTtcblxuXHRcdC8vIGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBBQ1RJVkUgVkVSVEVYIEFUVFJJQlVURTonLCBuYW1lLCBpICk7XG5cblx0XHRhdHRyaWJ1dGVzWyBuYW1lIF0gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgbmFtZSApO1xuXG5cdH1cblxuXHRyZXR1cm4gYXR0cmlidXRlcztcblxufVxuXG5mdW5jdGlvbiBmaWx0ZXJFbXB0eUxpbmUoIHN0cmluZyApIHtcblxuXHRyZXR1cm4gc3RyaW5nICE9PSAnJztcblxufVxuXG5mdW5jdGlvbiByZXBsYWNlTGlnaHROdW1zKCBzdHJpbmcsIHBhcmFtZXRlcnMgKSB7XG5cblx0cmV0dXJuIHN0cmluZ1xuXHRcdC5yZXBsYWNlKCAvTlVNX0RJUl9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1EaXJMaWdodHMgKVxuXHRcdC5yZXBsYWNlKCAvTlVNX1NQT1RfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtU3BvdExpZ2h0cyApXG5cdFx0LnJlcGxhY2UoIC9OVU1fUkVDVF9BUkVBX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bVJlY3RBcmVhTGlnaHRzIClcblx0XHQucmVwbGFjZSggL05VTV9QT0lOVF9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1Qb2ludExpZ2h0cyApXG5cdFx0LnJlcGxhY2UoIC9OVU1fSEVNSV9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1IZW1pTGlnaHRzICk7XG5cbn1cblxuZnVuY3Rpb24gcmVwbGFjZUNsaXBwaW5nUGxhbmVOdW1zKCBzdHJpbmcsIHBhcmFtZXRlcnMgKSB7XG5cblx0cmV0dXJuIHN0cmluZ1xuXHRcdC5yZXBsYWNlKCAvTlVNX0NMSVBQSU5HX1BMQU5FUy9nLCBwYXJhbWV0ZXJzLm51bUNsaXBwaW5nUGxhbmVzIClcblx0XHQucmVwbGFjZSggL1VOSU9OX0NMSVBQSU5HX1BMQU5FUy9nLCAoIHBhcmFtZXRlcnMubnVtQ2xpcHBpbmdQbGFuZXMgLSBwYXJhbWV0ZXJzLm51bUNsaXBJbnRlcnNlY3Rpb24gKSApO1xuXG59XG5cbmZ1bmN0aW9uIHBhcnNlSW5jbHVkZXMoIHN0cmluZyApIHtcblxuXHR2YXIgcGF0dGVybiA9IC9eWyBcXHRdKiNpbmNsdWRlICs8KFtcXHdcXGQuXSspPi9nbTtcblxuXHRmdW5jdGlvbiByZXBsYWNlKCBtYXRjaCwgaW5jbHVkZSApIHtcblxuXHRcdHZhciByZXBsYWNlID0gU2hhZGVyQ2h1bmtbIGluY2x1ZGUgXTtcblxuXHRcdGlmICggcmVwbGFjZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdDYW4gbm90IHJlc29sdmUgI2luY2x1ZGUgPCcgKyBpbmNsdWRlICsgJz4nICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcGFyc2VJbmNsdWRlcyggcmVwbGFjZSApO1xuXG5cdH1cblxuXHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHBhdHRlcm4sIHJlcGxhY2UgKTtcblxufVxuXG5mdW5jdGlvbiB1bnJvbGxMb29wcyggc3RyaW5nICkge1xuXG5cdHZhciBwYXR0ZXJuID0gLyNwcmFnbWEgdW5yb2xsX2xvb3BbXFxzXSs/Zm9yIFxcKCBpbnQgaSBcXD0gKFxcZCspXFw7IGkgPCAoXFxkKylcXDsgaSBcXCtcXCsgXFwpIFxceyhbXFxzXFxTXSs/KSg/PVxcfSlcXH0vZztcblxuXHRmdW5jdGlvbiByZXBsYWNlKCBtYXRjaCwgc3RhcnQsIGVuZCwgc25pcHBldCApIHtcblxuXHRcdHZhciB1bnJvbGwgPSAnJztcblxuXHRcdGZvciAoIHZhciBpID0gcGFyc2VJbnQoIHN0YXJ0ICk7IGkgPCBwYXJzZUludCggZW5kICk7IGkgKysgKSB7XG5cblx0XHRcdHVucm9sbCArPSBzbmlwcGV0LnJlcGxhY2UoIC9cXFsgaSBcXF0vZywgJ1sgJyArIGkgKyAnIF0nICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdW5yb2xsO1xuXG5cdH1cblxuXHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHBhdHRlcm4sIHJlcGxhY2UgKTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTFByb2dyYW0oIHJlbmRlcmVyLCBleHRlbnNpb25zLCBjb2RlLCBtYXRlcmlhbCwgc2hhZGVyLCBwYXJhbWV0ZXJzICkge1xuXG5cdHZhciBnbCA9IHJlbmRlcmVyLmNvbnRleHQ7XG5cblx0dmFyIGRlZmluZXMgPSBtYXRlcmlhbC5kZWZpbmVzO1xuXG5cdHZhciB2ZXJ0ZXhTaGFkZXIgPSBzaGFkZXIudmVydGV4U2hhZGVyO1xuXHR2YXIgZnJhZ21lbnRTaGFkZXIgPSBzaGFkZXIuZnJhZ21lbnRTaGFkZXI7XG5cblx0dmFyIHNoYWRvd01hcFR5cGVEZWZpbmUgPSAnU0hBRE9XTUFQX1RZUEVfQkFTSUMnO1xuXG5cdGlmICggcGFyYW1ldGVycy5zaGFkb3dNYXBUeXBlID09PSBQQ0ZTaGFkb3dNYXAgKSB7XG5cblx0XHRzaGFkb3dNYXBUeXBlRGVmaW5lID0gJ1NIQURPV01BUF9UWVBFX1BDRic7XG5cblx0fSBlbHNlIGlmICggcGFyYW1ldGVycy5zaGFkb3dNYXBUeXBlID09PSBQQ0ZTb2Z0U2hhZG93TWFwICkge1xuXG5cdFx0c2hhZG93TWFwVHlwZURlZmluZSA9ICdTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCc7XG5cblx0fVxuXG5cdHZhciBlbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX0NVQkUnO1xuXHR2YXIgZW52TWFwTW9kZURlZmluZSA9ICdFTlZNQVBfTU9ERV9SRUZMRUNUSU9OJztcblx0dmFyIGVudk1hcEJsZW5kaW5nRGVmaW5lID0gJ0VOVk1BUF9CTEVORElOR19NVUxUSVBMWSc7XG5cblx0aWYgKCBwYXJhbWV0ZXJzLmVudk1hcCApIHtcblxuXHRcdHN3aXRjaCAoIG1hdGVyaWFsLmVudk1hcC5tYXBwaW5nICkge1xuXG5cdFx0XHRjYXNlIEN1YmVSZWZsZWN0aW9uTWFwcGluZzpcblx0XHRcdGNhc2UgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOlxuXHRcdFx0XHRlbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX0NVQkUnO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzpcblx0XHRcdGNhc2UgQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmc6XG5cdFx0XHRcdGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfQ1VCRV9VVic7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nOlxuXHRcdFx0Y2FzZSBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZzpcblx0XHRcdFx0ZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9FUVVJUkVDJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmc6XG5cdFx0XHRcdGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfU1BIRVJFJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0XHRzd2l0Y2ggKCBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyApIHtcblxuXHRcdFx0Y2FzZSBDdWJlUmVmcmFjdGlvbk1hcHBpbmc6XG5cdFx0XHRjYXNlIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOlxuXHRcdFx0XHRlbnZNYXBNb2RlRGVmaW5lID0gJ0VOVk1BUF9NT0RFX1JFRlJBQ1RJT04nO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdH1cblxuXHRcdHN3aXRjaCAoIG1hdGVyaWFsLmNvbWJpbmUgKSB7XG5cblx0XHRcdGNhc2UgTXVsdGlwbHlPcGVyYXRpb246XG5cdFx0XHRcdGVudk1hcEJsZW5kaW5nRGVmaW5lID0gJ0VOVk1BUF9CTEVORElOR19NVUxUSVBMWSc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIE1peE9wZXJhdGlvbjpcblx0XHRcdFx0ZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX01JWCc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEFkZE9wZXJhdGlvbjpcblx0XHRcdFx0ZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX0FERCc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXG5cdH1cblxuXHR2YXIgZ2FtbWFGYWN0b3JEZWZpbmUgPSAoIHJlbmRlcmVyLmdhbW1hRmFjdG9yID4gMCApID8gcmVuZGVyZXIuZ2FtbWFGYWN0b3IgOiAxLjA7XG5cblx0Ly8gY29uc29sZS5sb2coICdidWlsZGluZyBuZXcgcHJvZ3JhbSAnICk7XG5cblx0Ly9cblxuXHR2YXIgY3VzdG9tRXh0ZW5zaW9ucyA9IGdlbmVyYXRlRXh0ZW5zaW9ucyggbWF0ZXJpYWwuZXh0ZW5zaW9ucywgcGFyYW1ldGVycywgZXh0ZW5zaW9ucyApO1xuXG5cdHZhciBjdXN0b21EZWZpbmVzID0gZ2VuZXJhdGVEZWZpbmVzKCBkZWZpbmVzICk7XG5cblx0Ly9cblxuXHR2YXIgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTtcblxuXHR2YXIgcHJlZml4VmVydGV4LCBwcmVmaXhGcmFnbWVudDtcblxuXHRpZiAoIG1hdGVyaWFsLmlzUmF3U2hhZGVyTWF0ZXJpYWwgKSB7XG5cblx0XHRwcmVmaXhWZXJ0ZXggPSBbXG5cblx0XHRcdGN1c3RvbURlZmluZXNcblxuXHRcdF0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xuXG5cdFx0aWYgKCBwcmVmaXhWZXJ0ZXgubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0cHJlZml4VmVydGV4ICs9ICdcXG4nO1xuXG5cdFx0fVxuXG5cdFx0cHJlZml4RnJhZ21lbnQgPSBbXG5cblx0XHRcdGN1c3RvbUV4dGVuc2lvbnMsXG5cdFx0XHRjdXN0b21EZWZpbmVzXG5cblx0XHRdLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xcbicgKTtcblxuXHRcdGlmICggcHJlZml4RnJhZ21lbnQubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0cHJlZml4RnJhZ21lbnQgKz0gJ1xcbic7XG5cblx0XHR9XG5cblx0fSBlbHNlIHtcblxuXHRcdHByZWZpeFZlcnRleCA9IFtcblxuXHRcdFx0J3ByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGZsb2F0OycsXG5cdFx0XHQncHJlY2lzaW9uICcgKyBwYXJhbWV0ZXJzLnByZWNpc2lvbiArICcgaW50OycsXG5cblx0XHRcdCcjZGVmaW5lIFNIQURFUl9OQU1FICcgKyBzaGFkZXIubmFtZSxcblxuXHRcdFx0Y3VzdG9tRGVmaW5lcyxcblxuXHRcdFx0cGFyYW1ldGVycy5zdXBwb3J0c1ZlcnRleFRleHR1cmVzID8gJyNkZWZpbmUgVkVSVEVYX1RFWFRVUkVTJyA6ICcnLFxuXG5cdFx0XHQnI2RlZmluZSBHQU1NQV9GQUNUT1IgJyArIGdhbW1hRmFjdG9yRGVmaW5lLFxuXG5cdFx0XHQnI2RlZmluZSBNQVhfQk9ORVMgJyArIHBhcmFtZXRlcnMubWF4Qm9uZXMsXG5cdFx0XHQoIHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nICkgPyAnI2RlZmluZSBVU0VfRk9HJyA6ICcnLFxuXHRcdFx0KCBwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZ0V4cCApID8gJyNkZWZpbmUgRk9HX0VYUDInIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMubWFwID8gJyNkZWZpbmUgVVNFX01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgVVNFX0VOVk1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgJyArIGVudk1hcE1vZGVEZWZpbmUgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubGlnaHRNYXAgPyAnI2RlZmluZSBVU0VfTElHSFRNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmFvTWFwID8gJyNkZWZpbmUgVVNFX0FPTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbWlzc2l2ZU1hcCA/ICcjZGVmaW5lIFVTRV9FTUlTU0lWRU1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYnVtcE1hcCA/ICcjZGVmaW5lIFVTRV9CVU1QTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5ub3JtYWxNYXAgPyAnI2RlZmluZSBVU0VfTk9STUFMTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5kaXNwbGFjZW1lbnRNYXAgJiYgcGFyYW1ldGVycy5zdXBwb3J0c1ZlcnRleFRleHR1cmVzID8gJyNkZWZpbmUgVVNFX0RJU1BMQUNFTUVOVE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc3BlY3VsYXJNYXAgPyAnI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnJvdWdobmVzc01hcCA/ICcjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcCA/ICcjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmFscGhhTWFwID8gJyNkZWZpbmUgVVNFX0FMUEhBTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy52ZXJ0ZXhDb2xvcnMgPyAnI2RlZmluZSBVU0VfQ09MT1InIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPyAnI2RlZmluZSBGTEFUX1NIQURFRCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5za2lubmluZyA/ICcjZGVmaW5lIFVTRV9TS0lOTklORycgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMudXNlVmVydGV4VGV4dHVyZSA/ICcjZGVmaW5lIEJPTkVfVEVYVFVSRScgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5tb3JwaFRhcmdldHMgPyAnI2RlZmluZSBVU0VfTU9SUEhUQVJHRVRTJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5tb3JwaE5vcm1hbHMgJiYgcGFyYW1ldGVycy5mbGF0U2hhZGluZyA9PT0gZmFsc2UgPyAnI2RlZmluZSBVU0VfTU9SUEhOT1JNQUxTJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5kb3VibGVTaWRlZCA/ICcjZGVmaW5lIERPVUJMRV9TSURFRCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZmxpcFNpZGVkID8gJyNkZWZpbmUgRkxJUF9TSURFRCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5zaGFkb3dNYXBFbmFibGVkID8gJyNkZWZpbmUgVVNFX1NIQURPV01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lICcgKyBzaGFkb3dNYXBUeXBlRGVmaW5lIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuc2l6ZUF0dGVudWF0aW9uID8gJyNkZWZpbmUgVVNFX1NJWkVBVFRFTlVBVElPTicgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID8gJyNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICYmIGV4dGVuc2lvbnMuZ2V0KCAnRVhUX2ZyYWdfZGVwdGgnICkgPyAnI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUJyA6ICcnLFxuXG5cdFx0XHQndW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSBtYXQ0IG1vZGVsVmlld01hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIG1hdDMgbm9ybWFsTWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOycsXG5cblx0XHRcdCdhdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjsnLFxuXHRcdFx0J2F0dHJpYnV0ZSB2ZWMzIG5vcm1hbDsnLFxuXHRcdFx0J2F0dHJpYnV0ZSB2ZWMyIHV2OycsXG5cblx0XHRcdCcjaWZkZWYgVVNFX0NPTE9SJyxcblxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzMgY29sb3I7JyxcblxuXHRcdFx0JyNlbmRpZicsXG5cblx0XHRcdCcjaWZkZWYgVVNFX01PUlBIVEFSR0VUUycsXG5cblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MDsnLFxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQxOycsXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDI7Jyxcblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MzsnLFxuXG5cdFx0XHQnXHQjaWZkZWYgVVNFX01PUlBITk9STUFMUycsXG5cblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwwOycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMTsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDI7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwzOycsXG5cblx0XHRcdCdcdCNlbHNlJyxcblxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDQ7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ1OycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NjsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDc7JyxcblxuXHRcdFx0J1x0I2VuZGlmJyxcblxuXHRcdFx0JyNlbmRpZicsXG5cblx0XHRcdCcjaWZkZWYgVVNFX1NLSU5OSU5HJyxcblxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzQgc2tpbkluZGV4OycsXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjNCBza2luV2VpZ2h0OycsXG5cblx0XHRcdCcjZW5kaWYnLFxuXG5cdFx0XHQnXFxuJ1xuXG5cdFx0XS5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcXG4nICk7XG5cblx0XHRwcmVmaXhGcmFnbWVudCA9IFtcblxuXHRcdFx0Y3VzdG9tRXh0ZW5zaW9ucyxcblxuXHRcdFx0J3ByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGZsb2F0OycsXG5cdFx0XHQncHJlY2lzaW9uICcgKyBwYXJhbWV0ZXJzLnByZWNpc2lvbiArICcgaW50OycsXG5cblx0XHRcdCcjZGVmaW5lIFNIQURFUl9OQU1FICcgKyBzaGFkZXIubmFtZSxcblxuXHRcdFx0Y3VzdG9tRGVmaW5lcyxcblxuXHRcdFx0cGFyYW1ldGVycy5hbHBoYVRlc3QgPyAnI2RlZmluZSBBTFBIQVRFU1QgJyArIHBhcmFtZXRlcnMuYWxwaGFUZXN0IDogJycsXG5cblx0XHRcdCcjZGVmaW5lIEdBTU1BX0ZBQ1RPUiAnICsgZ2FtbWFGYWN0b3JEZWZpbmUsXG5cblx0XHRcdCggcGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2cgKSA/ICcjZGVmaW5lIFVTRV9GT0cnIDogJycsXG5cdFx0XHQoIHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nRXhwICkgPyAnI2RlZmluZSBGT0dfRVhQMicgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5tYXAgPyAnI2RlZmluZSBVU0VfTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSBVU0VfRU5WTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwVHlwZURlZmluZSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwTW9kZURlZmluZSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwQmxlbmRpbmdEZWZpbmUgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubGlnaHRNYXAgPyAnI2RlZmluZSBVU0VfTElHSFRNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmFvTWFwID8gJyNkZWZpbmUgVVNFX0FPTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbWlzc2l2ZU1hcCA/ICcjZGVmaW5lIFVTRV9FTUlTU0lWRU1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYnVtcE1hcCA/ICcjZGVmaW5lIFVTRV9CVU1QTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5ub3JtYWxNYXAgPyAnI2RlZmluZSBVU0VfTk9STUFMTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5zcGVjdWxhck1hcCA/ICcjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMucm91Z2huZXNzTWFwID8gJyNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubWV0YWxuZXNzTWFwID8gJyNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYWxwaGFNYXAgPyAnI2RlZmluZSBVU0VfQUxQSEFNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleENvbG9ycyA/ICcjZGVmaW5lIFVTRV9DT0xPUicgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5ncmFkaWVudE1hcCA/ICcjZGVmaW5lIFVTRV9HUkFESUVOVE1BUCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5mbGF0U2hhZGluZyA/ICcjZGVmaW5lIEZMQVRfU0hBREVEJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmRvdWJsZVNpZGVkID8gJyNkZWZpbmUgRE9VQkxFX1NJREVEJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5mbGlwU2lkZWQgPyAnI2RlZmluZSBGTElQX1NJREVEJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnNoYWRvd01hcEVuYWJsZWQgPyAnI2RlZmluZSBVU0VfU0hBRE9XTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5zaGFkb3dNYXBFbmFibGVkID8gJyNkZWZpbmUgJyArIHNoYWRvd01hcFR5cGVEZWZpbmUgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5wcmVtdWx0aXBsaWVkQWxwaGEgPyAnI2RlZmluZSBQUkVNVUxUSVBMSUVEX0FMUEhBJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzID8gJyNkZWZpbmUgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUUycgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID8gJyNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICYmIGV4dGVuc2lvbnMuZ2V0KCAnRVhUX2ZyYWdfZGVwdGgnICkgPyAnI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCAmJiBleHRlbnNpb25zLmdldCggJ0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QnICkgPyAnI2RlZmluZSBURVhUVVJFX0xPRF9FWFQnIDogJycsXG5cblx0XHRcdCd1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsnLFxuXG5cdFx0XHQoIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgIT09IE5vVG9uZU1hcHBpbmcgKSA/ICcjZGVmaW5lIFRPTkVfTUFQUElORycgOiAnJyxcblx0XHRcdCggcGFyYW1ldGVycy50b25lTWFwcGluZyAhPT0gTm9Ub25lTWFwcGluZyApID8gU2hhZGVyQ2h1bmtbICd0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50JyBdIDogJycsIC8vIHRoaXMgY29kZSBpcyByZXF1aXJlZCBoZXJlIGJlY2F1c2UgaXQgaXMgdXNlZCBieSB0aGUgdG9uZU1hcHBpbmcoKSBmdW5jdGlvbiBkZWZpbmVkIGJlbG93XG5cdFx0XHQoIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgIT09IE5vVG9uZU1hcHBpbmcgKSA/IGdldFRvbmVNYXBwaW5nRnVuY3Rpb24oICd0b25lTWFwcGluZycsIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgKSA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmRpdGhlcmluZyA/ICcjZGVmaW5lIERJVEhFUklORycgOiAnJyxcblxuXHRcdFx0KCBwYXJhbWV0ZXJzLm91dHB1dEVuY29kaW5nIHx8IHBhcmFtZXRlcnMubWFwRW5jb2RpbmcgfHwgcGFyYW1ldGVycy5lbnZNYXBFbmNvZGluZyB8fCBwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwRW5jb2RpbmcgKSA/IFNoYWRlckNodW5rWyAnZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQnIF0gOiAnJywgLy8gdGhpcyBjb2RlIGlzIHJlcXVpcmVkIGhlcmUgYmVjYXVzZSBpdCBpcyB1c2VkIGJ5IHRoZSB2YXJpb3VzIGVuY29kaW5nL2RlY29kaW5nIGZ1bmN0aW9uIGRlZmluZWQgYmVsb3dcblx0XHRcdHBhcmFtZXRlcnMubWFwRW5jb2RpbmcgPyBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oICdtYXBUZXhlbFRvTGluZWFyJywgcGFyYW1ldGVycy5tYXBFbmNvZGluZyApIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcEVuY29kaW5nID8gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCAnZW52TWFwVGV4ZWxUb0xpbmVhcicsIHBhcmFtZXRlcnMuZW52TWFwRW5jb2RpbmcgKSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbWlzc2l2ZU1hcEVuY29kaW5nID8gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCAnZW1pc3NpdmVNYXBUZXhlbFRvTGluZWFyJywgcGFyYW1ldGVycy5lbWlzc2l2ZU1hcEVuY29kaW5nICkgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMub3V0cHV0RW5jb2RpbmcgPyBnZXRUZXhlbEVuY29kaW5nRnVuY3Rpb24oICdsaW5lYXJUb091dHB1dFRleGVsJywgcGFyYW1ldGVycy5vdXRwdXRFbmNvZGluZyApIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZGVwdGhQYWNraW5nID8gJyNkZWZpbmUgREVQVEhfUEFDS0lORyAnICsgbWF0ZXJpYWwuZGVwdGhQYWNraW5nIDogJycsXG5cblx0XHRcdCdcXG4nXG5cblx0XHRdLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xcbicgKTtcblxuXHR9XG5cblx0dmVydGV4U2hhZGVyID0gcGFyc2VJbmNsdWRlcyggdmVydGV4U2hhZGVyICk7XG5cdHZlcnRleFNoYWRlciA9IHJlcGxhY2VMaWdodE51bXMoIHZlcnRleFNoYWRlciwgcGFyYW1ldGVycyApO1xuXHR2ZXJ0ZXhTaGFkZXIgPSByZXBsYWNlQ2xpcHBpbmdQbGFuZU51bXMoIHZlcnRleFNoYWRlciwgcGFyYW1ldGVycyApO1xuXG5cdGZyYWdtZW50U2hhZGVyID0gcGFyc2VJbmNsdWRlcyggZnJhZ21lbnRTaGFkZXIgKTtcblx0ZnJhZ21lbnRTaGFkZXIgPSByZXBsYWNlTGlnaHROdW1zKCBmcmFnbWVudFNoYWRlciwgcGFyYW1ldGVycyApO1xuXHRmcmFnbWVudFNoYWRlciA9IHJlcGxhY2VDbGlwcGluZ1BsYW5lTnVtcyggZnJhZ21lbnRTaGFkZXIsIHBhcmFtZXRlcnMgKTtcblxuXHR2ZXJ0ZXhTaGFkZXIgPSB1bnJvbGxMb29wcyggdmVydGV4U2hhZGVyICk7XG5cdGZyYWdtZW50U2hhZGVyID0gdW5yb2xsTG9vcHMoIGZyYWdtZW50U2hhZGVyICk7XG5cblx0dmFyIHZlcnRleEdsc2wgPSBwcmVmaXhWZXJ0ZXggKyB2ZXJ0ZXhTaGFkZXI7XG5cdHZhciBmcmFnbWVudEdsc2wgPSBwcmVmaXhGcmFnbWVudCArIGZyYWdtZW50U2hhZGVyO1xuXG5cdC8vIGNvbnNvbGUubG9nKCAnKlZFUlRFWConLCB2ZXJ0ZXhHbHNsICk7XG5cdC8vIGNvbnNvbGUubG9nKCAnKkZSQUdNRU5UKicsIGZyYWdtZW50R2xzbCApO1xuXG5cdHZhciBnbFZlcnRleFNoYWRlciA9IFdlYkdMU2hhZGVyKCBnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdmVydGV4R2xzbCApO1xuXHR2YXIgZ2xGcmFnbWVudFNoYWRlciA9IFdlYkdMU2hhZGVyKCBnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCBmcmFnbWVudEdsc2wgKTtcblxuXHRnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIGdsVmVydGV4U2hhZGVyICk7XG5cdGdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbSwgZ2xGcmFnbWVudFNoYWRlciApO1xuXG5cdC8vIEZvcmNlIGEgcGFydGljdWxhciBhdHRyaWJ1dGUgdG8gaW5kZXggMC5cblxuXHRpZiAoIG1hdGVyaWFsLmluZGV4MEF0dHJpYnV0ZU5hbWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGdsLmJpbmRBdHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgMCwgbWF0ZXJpYWwuaW5kZXgwQXR0cmlidXRlTmFtZSApO1xuXG5cdH0gZWxzZSBpZiAoIHBhcmFtZXRlcnMubW9ycGhUYXJnZXRzID09PSB0cnVlICkge1xuXG5cdFx0Ly8gcHJvZ3JhbXMgd2l0aCBtb3JwaFRhcmdldHMgZGlzcGxhY2UgcG9zaXRpb24gb3V0IG9mIGF0dHJpYnV0ZSAwXG5cdFx0Z2wuYmluZEF0dHJpYkxvY2F0aW9uKCBwcm9ncmFtLCAwLCAncG9zaXRpb24nICk7XG5cblx0fVxuXG5cdGdsLmxpbmtQcm9ncmFtKCBwcm9ncmFtICk7XG5cblx0dmFyIHByb2dyYW1Mb2cgPSBnbC5nZXRQcm9ncmFtSW5mb0xvZyggcHJvZ3JhbSApLnRyaW0oKTtcblx0dmFyIHZlcnRleExvZyA9IGdsLmdldFNoYWRlckluZm9Mb2coIGdsVmVydGV4U2hhZGVyICkudHJpbSgpO1xuXHR2YXIgZnJhZ21lbnRMb2cgPSBnbC5nZXRTaGFkZXJJbmZvTG9nKCBnbEZyYWdtZW50U2hhZGVyICkudHJpbSgpO1xuXG5cdHZhciBydW5uYWJsZSA9IHRydWU7XG5cdHZhciBoYXZlRGlhZ25vc3RpY3MgPSB0cnVlO1xuXG5cdC8vIGNvbnNvbGUubG9nKCAnKipWRVJURVgqKicsIGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2RlYnVnX3NoYWRlcnMnICkuZ2V0VHJhbnNsYXRlZFNoYWRlclNvdXJjZSggZ2xWZXJ0ZXhTaGFkZXIgKSApO1xuXHQvLyBjb25zb2xlLmxvZyggJyoqRlJBR01FTlQqKicsIGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2RlYnVnX3NoYWRlcnMnICkuZ2V0VHJhbnNsYXRlZFNoYWRlclNvdXJjZSggZ2xGcmFnbWVudFNoYWRlciApICk7XG5cblx0aWYgKCBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUyApID09PSBmYWxzZSApIHtcblxuXHRcdHJ1bm5hYmxlID0gZmFsc2U7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBzaGFkZXIgZXJyb3I6ICcsIGdsLmdldEVycm9yKCksICdnbC5WQUxJREFURV9TVEFUVVMnLCBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCBnbC5WQUxJREFURV9TVEFUVVMgKSwgJ2dsLmdldFByb2dyYW1JbmZvTG9nJywgcHJvZ3JhbUxvZywgdmVydGV4TG9nLCBmcmFnbWVudExvZyApO1xuXG5cdH0gZWxzZSBpZiAoIHByb2dyYW1Mb2cgIT09ICcnICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBnbC5nZXRQcm9ncmFtSW5mb0xvZygpJywgcHJvZ3JhbUxvZyApO1xuXG5cdH0gZWxzZSBpZiAoIHZlcnRleExvZyA9PT0gJycgfHwgZnJhZ21lbnRMb2cgPT09ICcnICkge1xuXG5cdFx0aGF2ZURpYWdub3N0aWNzID0gZmFsc2U7XG5cblx0fVxuXG5cdGlmICggaGF2ZURpYWdub3N0aWNzICkge1xuXG5cdFx0dGhpcy5kaWFnbm9zdGljcyA9IHtcblxuXHRcdFx0cnVubmFibGU6IHJ1bm5hYmxlLFxuXHRcdFx0bWF0ZXJpYWw6IG1hdGVyaWFsLFxuXG5cdFx0XHRwcm9ncmFtTG9nOiBwcm9ncmFtTG9nLFxuXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHtcblxuXHRcdFx0XHRsb2c6IHZlcnRleExvZyxcblx0XHRcdFx0cHJlZml4OiBwcmVmaXhWZXJ0ZXhcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IHtcblxuXHRcdFx0XHRsb2c6IGZyYWdtZW50TG9nLFxuXHRcdFx0XHRwcmVmaXg6IHByZWZpeEZyYWdtZW50XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fVxuXG5cdC8vIGNsZWFuIHVwXG5cblx0Z2wuZGVsZXRlU2hhZGVyKCBnbFZlcnRleFNoYWRlciApO1xuXHRnbC5kZWxldGVTaGFkZXIoIGdsRnJhZ21lbnRTaGFkZXIgKTtcblxuXHQvLyBzZXQgdXAgY2FjaGluZyBmb3IgdW5pZm9ybSBsb2NhdGlvbnNcblxuXHR2YXIgY2FjaGVkVW5pZm9ybXM7XG5cblx0dGhpcy5nZXRVbmlmb3JtcyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggY2FjaGVkVW5pZm9ybXMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y2FjaGVkVW5pZm9ybXMgPSBuZXcgV2ViR0xVbmlmb3JtcyggZ2wsIHByb2dyYW0sIHJlbmRlcmVyICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY2FjaGVkVW5pZm9ybXM7XG5cblx0fTtcblxuXHQvLyBzZXQgdXAgY2FjaGluZyBmb3IgYXR0cmlidXRlIGxvY2F0aW9uc1xuXG5cdHZhciBjYWNoZWRBdHRyaWJ1dGVzO1xuXG5cdHRoaXMuZ2V0QXR0cmlidXRlcyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggY2FjaGVkQXR0cmlidXRlcyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjYWNoZWRBdHRyaWJ1dGVzID0gZmV0Y2hBdHRyaWJ1dGVMb2NhdGlvbnMoIGdsLCBwcm9ncmFtICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY2FjaGVkQXR0cmlidXRlcztcblxuXHR9O1xuXG5cdC8vIGZyZWUgcmVzb3VyY2VcblxuXHR0aGlzLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRnbC5kZWxldGVQcm9ncmFtKCBwcm9ncmFtICk7XG5cdFx0dGhpcy5wcm9ncmFtID0gdW5kZWZpbmVkO1xuXG5cdH07XG5cblx0Ly8gREVQUkVDQVRFRFxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7XG5cblx0XHR1bmlmb3Jtczoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiAudW5pZm9ybXMgaXMgbm93IC5nZXRVbmlmb3JtcygpLicgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0VW5pZm9ybXMoKTtcblxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRhdHRyaWJ1dGVzOiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFByb2dyYW06IC5hdHRyaWJ1dGVzIGlzIG5vdyAuZ2V0QXR0cmlidXRlcygpLicgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpO1xuXG5cdFx0XHR9XG5cdFx0fVxuXG5cdH0gKTtcblxuXG5cdC8vXG5cblx0dGhpcy5uYW1lID0gc2hhZGVyLm5hbWU7XG5cdHRoaXMuaWQgPSBwcm9ncmFtSWRDb3VudCArKztcblx0dGhpcy5jb2RlID0gY29kZTtcblx0dGhpcy51c2VkVGltZXMgPSAxO1xuXHR0aGlzLnByb2dyYW0gPSBwcm9ncmFtO1xuXHR0aGlzLnZlcnRleFNoYWRlciA9IGdsVmVydGV4U2hhZGVyO1xuXHR0aGlzLmZyYWdtZW50U2hhZGVyID0gZ2xGcmFnbWVudFNoYWRlcjtcblxuXHRyZXR1cm4gdGhpcztcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xQcm9ncmFtcyggcmVuZGVyZXIsIGV4dGVuc2lvbnMsIGNhcGFiaWxpdGllcyApIHtcblxuXHR2YXIgcHJvZ3JhbXMgPSBbXTtcblxuXHR2YXIgc2hhZGVySURzID0ge1xuXHRcdE1lc2hEZXB0aE1hdGVyaWFsOiAnZGVwdGgnLFxuXHRcdE1lc2hEaXN0YW5jZU1hdGVyaWFsOiAnZGlzdGFuY2VSR0JBJyxcblx0XHRNZXNoTm9ybWFsTWF0ZXJpYWw6ICdub3JtYWwnLFxuXHRcdE1lc2hCYXNpY01hdGVyaWFsOiAnYmFzaWMnLFxuXHRcdE1lc2hMYW1iZXJ0TWF0ZXJpYWw6ICdsYW1iZXJ0Jyxcblx0XHRNZXNoUGhvbmdNYXRlcmlhbDogJ3Bob25nJyxcblx0XHRNZXNoVG9vbk1hdGVyaWFsOiAncGhvbmcnLFxuXHRcdE1lc2hTdGFuZGFyZE1hdGVyaWFsOiAncGh5c2ljYWwnLFxuXHRcdE1lc2hQaHlzaWNhbE1hdGVyaWFsOiAncGh5c2ljYWwnLFxuXHRcdExpbmVCYXNpY01hdGVyaWFsOiAnYmFzaWMnLFxuXHRcdExpbmVEYXNoZWRNYXRlcmlhbDogJ2Rhc2hlZCcsXG5cdFx0UG9pbnRzTWF0ZXJpYWw6ICdwb2ludHMnLFxuXHRcdFNoYWRvd01hdGVyaWFsOiAnc2hhZG93J1xuXHR9O1xuXG5cdHZhciBwYXJhbWV0ZXJOYW1lcyA9IFtcblx0XHRcInByZWNpc2lvblwiLCBcInN1cHBvcnRzVmVydGV4VGV4dHVyZXNcIiwgXCJtYXBcIiwgXCJtYXBFbmNvZGluZ1wiLCBcImVudk1hcFwiLCBcImVudk1hcE1vZGVcIiwgXCJlbnZNYXBFbmNvZGluZ1wiLFxuXHRcdFwibGlnaHRNYXBcIiwgXCJhb01hcFwiLCBcImVtaXNzaXZlTWFwXCIsIFwiZW1pc3NpdmVNYXBFbmNvZGluZ1wiLCBcImJ1bXBNYXBcIiwgXCJub3JtYWxNYXBcIiwgXCJkaXNwbGFjZW1lbnRNYXBcIiwgXCJzcGVjdWxhck1hcFwiLFxuXHRcdFwicm91Z2huZXNzTWFwXCIsIFwibWV0YWxuZXNzTWFwXCIsIFwiZ3JhZGllbnRNYXBcIixcblx0XHRcImFscGhhTWFwXCIsIFwiY29tYmluZVwiLCBcInZlcnRleENvbG9yc1wiLCBcImZvZ1wiLCBcInVzZUZvZ1wiLCBcImZvZ0V4cFwiLFxuXHRcdFwiZmxhdFNoYWRpbmdcIiwgXCJzaXplQXR0ZW51YXRpb25cIiwgXCJsb2dhcml0aG1pY0RlcHRoQnVmZmVyXCIsIFwic2tpbm5pbmdcIixcblx0XHRcIm1heEJvbmVzXCIsIFwidXNlVmVydGV4VGV4dHVyZVwiLCBcIm1vcnBoVGFyZ2V0c1wiLCBcIm1vcnBoTm9ybWFsc1wiLFxuXHRcdFwibWF4TW9ycGhUYXJnZXRzXCIsIFwibWF4TW9ycGhOb3JtYWxzXCIsIFwicHJlbXVsdGlwbGllZEFscGhhXCIsXG5cdFx0XCJudW1EaXJMaWdodHNcIiwgXCJudW1Qb2ludExpZ2h0c1wiLCBcIm51bVNwb3RMaWdodHNcIiwgXCJudW1IZW1pTGlnaHRzXCIsIFwibnVtUmVjdEFyZWFMaWdodHNcIixcblx0XHRcInNoYWRvd01hcEVuYWJsZWRcIiwgXCJzaGFkb3dNYXBUeXBlXCIsIFwidG9uZU1hcHBpbmdcIiwgJ3BoeXNpY2FsbHlDb3JyZWN0TGlnaHRzJyxcblx0XHRcImFscGhhVGVzdFwiLCBcImRvdWJsZVNpZGVkXCIsIFwiZmxpcFNpZGVkXCIsIFwibnVtQ2xpcHBpbmdQbGFuZXNcIiwgXCJudW1DbGlwSW50ZXJzZWN0aW9uXCIsIFwiZGVwdGhQYWNraW5nXCIsIFwiZGl0aGVyaW5nXCJcblx0XTtcblxuXG5cdGZ1bmN0aW9uIGFsbG9jYXRlQm9uZXMoIG9iamVjdCApIHtcblxuXHRcdHZhciBza2VsZXRvbiA9IG9iamVjdC5za2VsZXRvbjtcblx0XHR2YXIgYm9uZXMgPSBza2VsZXRvbi5ib25lcztcblxuXHRcdGlmICggY2FwYWJpbGl0aWVzLmZsb2F0VmVydGV4VGV4dHVyZXMgKSB7XG5cblx0XHRcdHJldHVybiAxMDI0O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gZGVmYXVsdCBmb3Igd2hlbiBvYmplY3QgaXMgbm90IHNwZWNpZmllZFxuXHRcdFx0Ly8gKCBmb3IgZXhhbXBsZSB3aGVuIHByZWJ1aWxkaW5nIHNoYWRlciB0byBiZSB1c2VkIHdpdGggbXVsdGlwbGUgb2JqZWN0cyApXG5cdFx0XHQvL1xuXHRcdFx0Ly8gIC0gbGVhdmUgc29tZSBleHRyYSBzcGFjZSBmb3Igb3RoZXIgdW5pZm9ybXNcblx0XHRcdC8vICAtIGxpbWl0IGhlcmUgaXMgQU5HTEUncyAyNTQgbWF4IHVuaWZvcm0gdmVjdG9yc1xuXHRcdFx0Ly8gICAgKHVwIHRvIDU0IHNob3VsZCBiZSBzYWZlKVxuXG5cdFx0XHR2YXIgblZlcnRleFVuaWZvcm1zID0gY2FwYWJpbGl0aWVzLm1heFZlcnRleFVuaWZvcm1zO1xuXHRcdFx0dmFyIG5WZXJ0ZXhNYXRyaWNlcyA9IE1hdGguZmxvb3IoICggblZlcnRleFVuaWZvcm1zIC0gMjAgKSAvIDQgKTtcblxuXHRcdFx0dmFyIG1heEJvbmVzID0gTWF0aC5taW4oIG5WZXJ0ZXhNYXRyaWNlcywgYm9uZXMubGVuZ3RoICk7XG5cblx0XHRcdGlmICggbWF4Qm9uZXMgPCBib25lcy5sZW5ndGggKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogU2tlbGV0b24gaGFzICcgKyBib25lcy5sZW5ndGggKyAnIGJvbmVzLiBUaGlzIEdQVSBzdXBwb3J0cyAnICsgbWF4Qm9uZXMgKyAnLicgKTtcblx0XHRcdFx0cmV0dXJuIDA7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG1heEJvbmVzO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXAsIGdhbW1hT3ZlcnJpZGVMaW5lYXIgKSB7XG5cblx0XHR2YXIgZW5jb2Rpbmc7XG5cblx0XHRpZiAoICEgbWFwICkge1xuXG5cdFx0XHRlbmNvZGluZyA9IExpbmVhckVuY29kaW5nO1xuXG5cdFx0fSBlbHNlIGlmICggbWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZW5jb2RpbmcgPSBtYXAuZW5jb2Rpbmc7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXAuaXNXZWJHTFJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLldlYkdMUHJvZ3JhbXMuZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcDogZG9uJ3QgdXNlIHJlbmRlciB0YXJnZXRzIGFzIHRleHR1cmVzLiBVc2UgdGhlaXIgLnRleHR1cmUgcHJvcGVydHkgaW5zdGVhZC5cIiApO1xuXHRcdFx0ZW5jb2RpbmcgPSBtYXAudGV4dHVyZS5lbmNvZGluZztcblxuXHRcdH1cblxuXHRcdC8vIGFkZCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgV2ViR0xSZW5kZXJlci5nYW1tYUlucHV0L2dhbW1hT3V0cHV0IHBhcmFtZXRlciwgc2hvdWxkIHByb2JhYmx5IGJlIHJlbW92ZWQgYXQgc29tZSBwb2ludC5cblx0XHRpZiAoIGVuY29kaW5nID09PSBMaW5lYXJFbmNvZGluZyAmJiBnYW1tYU92ZXJyaWRlTGluZWFyICkge1xuXG5cdFx0XHRlbmNvZGluZyA9IEdhbW1hRW5jb2Rpbmc7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZW5jb2Rpbmc7XG5cblx0fVxuXG5cdHRoaXMuZ2V0UGFyYW1ldGVycyA9IGZ1bmN0aW9uICggbWF0ZXJpYWwsIGxpZ2h0cywgc2hhZG93cywgZm9nLCBuQ2xpcFBsYW5lcywgbkNsaXBJbnRlcnNlY3Rpb24sIG9iamVjdCApIHtcblxuXHRcdHZhciBzaGFkZXJJRCA9IHNoYWRlcklEc1sgbWF0ZXJpYWwudHlwZSBdO1xuXG5cdFx0Ly8gaGV1cmlzdGljcyB0byBjcmVhdGUgc2hhZGVyIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIGxpZ2h0cyBpbiB0aGUgc2NlbmVcblx0XHQvLyAobm90IHRvIGJsb3cgb3ZlciBtYXhMaWdodHMgYnVkZ2V0KVxuXG5cdFx0dmFyIG1heEJvbmVzID0gb2JqZWN0LmlzU2tpbm5lZE1lc2ggPyBhbGxvY2F0ZUJvbmVzKCBvYmplY3QgKSA6IDA7XG5cdFx0dmFyIHByZWNpc2lvbiA9IGNhcGFiaWxpdGllcy5wcmVjaXNpb247XG5cblx0XHRpZiAoIG1hdGVyaWFsLnByZWNpc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0cHJlY2lzaW9uID0gY2FwYWJpbGl0aWVzLmdldE1heFByZWNpc2lvbiggbWF0ZXJpYWwucHJlY2lzaW9uICk7XG5cblx0XHRcdGlmICggcHJlY2lzaW9uICE9PSBtYXRlcmlhbC5wcmVjaXNpb24gKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtLmdldFBhcmFtZXRlcnM6JywgbWF0ZXJpYWwucHJlY2lzaW9uLCAnbm90IHN1cHBvcnRlZCwgdXNpbmcnLCBwcmVjaXNpb24sICdpbnN0ZWFkLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGN1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcblxuXHRcdHZhciBwYXJhbWV0ZXJzID0ge1xuXG5cdFx0XHRzaGFkZXJJRDogc2hhZGVySUQsXG5cblx0XHRcdHByZWNpc2lvbjogcHJlY2lzaW9uLFxuXHRcdFx0c3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczogY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzLFxuXHRcdFx0b3V0cHV0RW5jb2Rpbmc6IGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoICggISBjdXJyZW50UmVuZGVyVGFyZ2V0ICkgPyBudWxsIDogY3VycmVudFJlbmRlclRhcmdldC50ZXh0dXJlLCByZW5kZXJlci5nYW1tYU91dHB1dCApLFxuXHRcdFx0bWFwOiAhISBtYXRlcmlhbC5tYXAsXG5cdFx0XHRtYXBFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWF0ZXJpYWwubWFwLCByZW5kZXJlci5nYW1tYUlucHV0ICksXG5cdFx0XHRlbnZNYXA6ICEhIG1hdGVyaWFsLmVudk1hcCxcblx0XHRcdGVudk1hcE1vZGU6IG1hdGVyaWFsLmVudk1hcCAmJiBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyxcblx0XHRcdGVudk1hcEVuY29kaW5nOiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXRlcmlhbC5lbnZNYXAsIHJlbmRlcmVyLmdhbW1hSW5wdXQgKSxcblx0XHRcdGVudk1hcEN1YmVVVjogKCAhISBtYXRlcmlhbC5lbnZNYXAgKSAmJiAoICggbWF0ZXJpYWwuZW52TWFwLm1hcHBpbmcgPT09IEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nICkgfHwgKCBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyA9PT0gQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmcgKSApLFxuXHRcdFx0bGlnaHRNYXA6ICEhIG1hdGVyaWFsLmxpZ2h0TWFwLFxuXHRcdFx0YW9NYXA6ICEhIG1hdGVyaWFsLmFvTWFwLFxuXHRcdFx0ZW1pc3NpdmVNYXA6ICEhIG1hdGVyaWFsLmVtaXNzaXZlTWFwLFxuXHRcdFx0ZW1pc3NpdmVNYXBFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWF0ZXJpYWwuZW1pc3NpdmVNYXAsIHJlbmRlcmVyLmdhbW1hSW5wdXQgKSxcblx0XHRcdGJ1bXBNYXA6ICEhIG1hdGVyaWFsLmJ1bXBNYXAsXG5cdFx0XHRub3JtYWxNYXA6ICEhIG1hdGVyaWFsLm5vcm1hbE1hcCxcblx0XHRcdGRpc3BsYWNlbWVudE1hcDogISEgbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwLFxuXHRcdFx0cm91Z2huZXNzTWFwOiAhISBtYXRlcmlhbC5yb3VnaG5lc3NNYXAsXG5cdFx0XHRtZXRhbG5lc3NNYXA6ICEhIG1hdGVyaWFsLm1ldGFsbmVzc01hcCxcblx0XHRcdHNwZWN1bGFyTWFwOiAhISBtYXRlcmlhbC5zcGVjdWxhck1hcCxcblx0XHRcdGFscGhhTWFwOiAhISBtYXRlcmlhbC5hbHBoYU1hcCxcblxuXHRcdFx0Z3JhZGllbnRNYXA6ICEhIG1hdGVyaWFsLmdyYWRpZW50TWFwLFxuXG5cdFx0XHRjb21iaW5lOiBtYXRlcmlhbC5jb21iaW5lLFxuXG5cdFx0XHR2ZXJ0ZXhDb2xvcnM6IG1hdGVyaWFsLnZlcnRleENvbG9ycyxcblxuXHRcdFx0Zm9nOiAhISBmb2csXG5cdFx0XHR1c2VGb2c6IG1hdGVyaWFsLmZvZyxcblx0XHRcdGZvZ0V4cDogKCBmb2cgJiYgZm9nLmlzRm9nRXhwMiApLFxuXG5cdFx0XHRmbGF0U2hhZGluZzogbWF0ZXJpYWwuZmxhdFNoYWRpbmcsXG5cblx0XHRcdHNpemVBdHRlbnVhdGlvbjogbWF0ZXJpYWwuc2l6ZUF0dGVudWF0aW9uLFxuXHRcdFx0bG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjogY2FwYWJpbGl0aWVzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIsXG5cblx0XHRcdHNraW5uaW5nOiBtYXRlcmlhbC5za2lubmluZyAmJiBtYXhCb25lcyA+IDAsXG5cdFx0XHRtYXhCb25lczogbWF4Qm9uZXMsXG5cdFx0XHR1c2VWZXJ0ZXhUZXh0dXJlOiBjYXBhYmlsaXRpZXMuZmxvYXRWZXJ0ZXhUZXh0dXJlcyxcblxuXHRcdFx0bW9ycGhUYXJnZXRzOiBtYXRlcmlhbC5tb3JwaFRhcmdldHMsXG5cdFx0XHRtb3JwaE5vcm1hbHM6IG1hdGVyaWFsLm1vcnBoTm9ybWFscyxcblx0XHRcdG1heE1vcnBoVGFyZ2V0czogcmVuZGVyZXIubWF4TW9ycGhUYXJnZXRzLFxuXHRcdFx0bWF4TW9ycGhOb3JtYWxzOiByZW5kZXJlci5tYXhNb3JwaE5vcm1hbHMsXG5cblx0XHRcdG51bURpckxpZ2h0czogbGlnaHRzLmRpcmVjdGlvbmFsLmxlbmd0aCxcblx0XHRcdG51bVBvaW50TGlnaHRzOiBsaWdodHMucG9pbnQubGVuZ3RoLFxuXHRcdFx0bnVtU3BvdExpZ2h0czogbGlnaHRzLnNwb3QubGVuZ3RoLFxuXHRcdFx0bnVtUmVjdEFyZWFMaWdodHM6IGxpZ2h0cy5yZWN0QXJlYS5sZW5ndGgsXG5cdFx0XHRudW1IZW1pTGlnaHRzOiBsaWdodHMuaGVtaS5sZW5ndGgsXG5cblx0XHRcdG51bUNsaXBwaW5nUGxhbmVzOiBuQ2xpcFBsYW5lcyxcblx0XHRcdG51bUNsaXBJbnRlcnNlY3Rpb246IG5DbGlwSW50ZXJzZWN0aW9uLFxuXG5cdFx0XHRkaXRoZXJpbmc6IG1hdGVyaWFsLmRpdGhlcmluZyxcblxuXHRcdFx0c2hhZG93TWFwRW5hYmxlZDogcmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQgJiYgb2JqZWN0LnJlY2VpdmVTaGFkb3cgJiYgc2hhZG93cy5sZW5ndGggPiAwLFxuXHRcdFx0c2hhZG93TWFwVHlwZTogcmVuZGVyZXIuc2hhZG93TWFwLnR5cGUsXG5cblx0XHRcdHRvbmVNYXBwaW5nOiByZW5kZXJlci50b25lTWFwcGluZyxcblx0XHRcdHBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzOiByZW5kZXJlci5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyxcblxuXHRcdFx0cHJlbXVsdGlwbGllZEFscGhhOiBtYXRlcmlhbC5wcmVtdWx0aXBsaWVkQWxwaGEsXG5cblx0XHRcdGFscGhhVGVzdDogbWF0ZXJpYWwuYWxwaGFUZXN0LFxuXHRcdFx0ZG91YmxlU2lkZWQ6IG1hdGVyaWFsLnNpZGUgPT09IERvdWJsZVNpZGUsXG5cdFx0XHRmbGlwU2lkZWQ6IG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlLFxuXG5cdFx0XHRkZXB0aFBhY2tpbmc6ICggbWF0ZXJpYWwuZGVwdGhQYWNraW5nICE9PSB1bmRlZmluZWQgKSA/IG1hdGVyaWFsLmRlcHRoUGFja2luZyA6IGZhbHNlXG5cblx0XHR9O1xuXG5cdFx0cmV0dXJuIHBhcmFtZXRlcnM7XG5cblx0fTtcblxuXHR0aGlzLmdldFByb2dyYW1Db2RlID0gZnVuY3Rpb24gKCBtYXRlcmlhbCwgcGFyYW1ldGVycyApIHtcblxuXHRcdHZhciBhcnJheSA9IFtdO1xuXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLnNoYWRlcklEICkge1xuXG5cdFx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLnNoYWRlcklEICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRhcnJheS5wdXNoKCBtYXRlcmlhbC5mcmFnbWVudFNoYWRlciApO1xuXHRcdFx0YXJyYXkucHVzaCggbWF0ZXJpYWwudmVydGV4U2hhZGVyICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmRlZmluZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggdmFyIG5hbWUgaW4gbWF0ZXJpYWwuZGVmaW5lcyApIHtcblxuXHRcdFx0XHRhcnJheS5wdXNoKCBuYW1lICk7XG5cdFx0XHRcdGFycmF5LnB1c2goIG1hdGVyaWFsLmRlZmluZXNbIG5hbWUgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBwYXJhbWV0ZXJOYW1lcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnNbIHBhcmFtZXRlck5hbWVzWyBpIF0gXSApO1xuXG5cdFx0fVxuXG5cdFx0YXJyYXkucHVzaCggbWF0ZXJpYWwub25CZWZvcmVDb21waWxlLnRvU3RyaW5nKCkgKTtcblxuXHRcdGFycmF5LnB1c2goIHJlbmRlcmVyLmdhbW1hT3V0cHV0ICk7XG5cblx0XHRyZXR1cm4gYXJyYXkuam9pbigpO1xuXG5cdH07XG5cblx0dGhpcy5hY3F1aXJlUHJvZ3JhbSA9IGZ1bmN0aW9uICggbWF0ZXJpYWwsIHNoYWRlciwgcGFyYW1ldGVycywgY29kZSApIHtcblxuXHRcdHZhciBwcm9ncmFtO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgY29kZSBoYXMgYmVlbiBhbHJlYWR5IGNvbXBpbGVkXG5cdFx0Zm9yICggdmFyIHAgPSAwLCBwbCA9IHByb2dyYW1zLmxlbmd0aDsgcCA8IHBsOyBwICsrICkge1xuXG5cdFx0XHR2YXIgcHJvZ3JhbUluZm8gPSBwcm9ncmFtc1sgcCBdO1xuXG5cdFx0XHRpZiAoIHByb2dyYW1JbmZvLmNvZGUgPT09IGNvZGUgKSB7XG5cblx0XHRcdFx0cHJvZ3JhbSA9IHByb2dyYW1JbmZvO1xuXHRcdFx0XHQrKyBwcm9ncmFtLnVzZWRUaW1lcztcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBwcm9ncmFtID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHByb2dyYW0gPSBuZXcgV2ViR0xQcm9ncmFtKCByZW5kZXJlciwgZXh0ZW5zaW9ucywgY29kZSwgbWF0ZXJpYWwsIHNoYWRlciwgcGFyYW1ldGVycyApO1xuXHRcdFx0cHJvZ3JhbXMucHVzaCggcHJvZ3JhbSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByb2dyYW07XG5cblx0fTtcblxuXHR0aGlzLnJlbGVhc2VQcm9ncmFtID0gZnVuY3Rpb24gKCBwcm9ncmFtICkge1xuXG5cdFx0aWYgKCAtLSBwcm9ncmFtLnVzZWRUaW1lcyA9PT0gMCApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGZyb20gdW5vcmRlcmVkIHNldFxuXHRcdFx0dmFyIGkgPSBwcm9ncmFtcy5pbmRleE9mKCBwcm9ncmFtICk7XG5cdFx0XHRwcm9ncmFtc1sgaSBdID0gcHJvZ3JhbXNbIHByb2dyYW1zLmxlbmd0aCAtIDEgXTtcblx0XHRcdHByb2dyYW1zLnBvcCgpO1xuXG5cdFx0XHQvLyBGcmVlIFdlYkdMIHJlc291cmNlc1xuXHRcdFx0cHJvZ3JhbS5kZXN0cm95KCk7XG5cblx0XHR9XG5cblx0fTtcblxuXHQvLyBFeHBvc2VkIGZvciByZXNvdXJjZSBtb25pdG9yaW5nICYgZXJyb3IgZmVlZGJhY2sgdmlhIHJlbmRlcmVyLmluZm86XG5cdHRoaXMucHJvZ3JhbXMgPSBwcm9ncmFtcztcblxufVxuXG4vKipcbiAqIEBhdXRob3IgZm9yZGFjaW91cyAvIGZvcmRhY2lvdXMuZ2l0aHViLmlvXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xQcm9wZXJ0aWVzKCkge1xuXG5cdHZhciBwcm9wZXJ0aWVzID0gbmV3IFdlYWtNYXAoKTtcblxuXHRmdW5jdGlvbiBnZXQoIG9iamVjdCApIHtcblxuXHRcdHZhciBtYXAgPSBwcm9wZXJ0aWVzLmdldCggb2JqZWN0ICk7XG5cblx0XHRpZiAoIG1hcCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRtYXAgPSB7fTtcblx0XHRcdHByb3BlcnRpZXMuc2V0KCBvYmplY3QsIG1hcCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hcDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVtb3ZlKCBvYmplY3QgKSB7XG5cblx0XHRwcm9wZXJ0aWVzLmRlbGV0ZSggb2JqZWN0ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZSggb2JqZWN0LCBrZXksIHZhbHVlICkge1xuXG5cdFx0cHJvcGVydGllcy5nZXQoIG9iamVjdCApWyBrZXkgXSA9IHZhbHVlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xuXG5cdFx0cHJvcGVydGllcyA9IG5ldyBXZWFrTWFwKCk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBnZXQsXG5cdFx0cmVtb3ZlOiByZW1vdmUsXG5cdFx0dXBkYXRlOiB1cGRhdGUsXG5cdFx0ZGlzcG9zZTogZGlzcG9zZVxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBwYWludGVyU29ydFN0YWJsZSggYSwgYiApIHtcblxuXHRpZiAoIGEucmVuZGVyT3JkZXIgIT09IGIucmVuZGVyT3JkZXIgKSB7XG5cblx0XHRyZXR1cm4gYS5yZW5kZXJPcmRlciAtIGIucmVuZGVyT3JkZXI7XG5cblx0fSBlbHNlIGlmICggYS5wcm9ncmFtICYmIGIucHJvZ3JhbSAmJiBhLnByb2dyYW0gIT09IGIucHJvZ3JhbSApIHtcblxuXHRcdHJldHVybiBhLnByb2dyYW0uaWQgLSBiLnByb2dyYW0uaWQ7XG5cblx0fSBlbHNlIGlmICggYS5tYXRlcmlhbC5pZCAhPT0gYi5tYXRlcmlhbC5pZCApIHtcblxuXHRcdHJldHVybiBhLm1hdGVyaWFsLmlkIC0gYi5tYXRlcmlhbC5pZDtcblxuXHR9IGVsc2UgaWYgKCBhLnogIT09IGIueiApIHtcblxuXHRcdHJldHVybiBhLnogLSBiLno7XG5cblx0fSBlbHNlIHtcblxuXHRcdHJldHVybiBhLmlkIC0gYi5pZDtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlKCBhLCBiICkge1xuXG5cdGlmICggYS5yZW5kZXJPcmRlciAhPT0gYi5yZW5kZXJPcmRlciApIHtcblxuXHRcdHJldHVybiBhLnJlbmRlck9yZGVyIC0gYi5yZW5kZXJPcmRlcjtcblxuXHR9IGlmICggYS56ICE9PSBiLnogKSB7XG5cblx0XHRyZXR1cm4gYi56IC0gYS56O1xuXG5cdH0gZWxzZSB7XG5cblx0XHRyZXR1cm4gYS5pZCAtIGIuaWQ7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIFdlYkdMUmVuZGVyTGlzdCgpIHtcblxuXHR2YXIgcmVuZGVySXRlbXMgPSBbXTtcblx0dmFyIHJlbmRlckl0ZW1zSW5kZXggPSAwO1xuXG5cdHZhciBvcGFxdWUgPSBbXTtcblx0dmFyIHRyYW5zcGFyZW50ID0gW107XG5cblx0ZnVuY3Rpb24gaW5pdCgpIHtcblxuXHRcdHJlbmRlckl0ZW1zSW5kZXggPSAwO1xuXG5cdFx0b3BhcXVlLmxlbmd0aCA9IDA7XG5cdFx0dHJhbnNwYXJlbnQubGVuZ3RoID0gMDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHosIGdyb3VwICkge1xuXG5cdFx0dmFyIHJlbmRlckl0ZW0gPSByZW5kZXJJdGVtc1sgcmVuZGVySXRlbXNJbmRleCBdO1xuXG5cdFx0aWYgKCByZW5kZXJJdGVtID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHJlbmRlckl0ZW0gPSB7XG5cdFx0XHRcdGlkOiBvYmplY3QuaWQsXG5cdFx0XHRcdG9iamVjdDogb2JqZWN0LFxuXHRcdFx0XHRnZW9tZXRyeTogZ2VvbWV0cnksXG5cdFx0XHRcdG1hdGVyaWFsOiBtYXRlcmlhbCxcblx0XHRcdFx0cHJvZ3JhbTogbWF0ZXJpYWwucHJvZ3JhbSxcblx0XHRcdFx0cmVuZGVyT3JkZXI6IG9iamVjdC5yZW5kZXJPcmRlcixcblx0XHRcdFx0ejogeixcblx0XHRcdFx0Z3JvdXA6IGdyb3VwXG5cdFx0XHR9O1xuXG5cdFx0XHRyZW5kZXJJdGVtc1sgcmVuZGVySXRlbXNJbmRleCBdID0gcmVuZGVySXRlbTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJlbmRlckl0ZW0uaWQgPSBvYmplY3QuaWQ7XG5cdFx0XHRyZW5kZXJJdGVtLm9iamVjdCA9IG9iamVjdDtcblx0XHRcdHJlbmRlckl0ZW0uZ2VvbWV0cnkgPSBnZW9tZXRyeTtcblx0XHRcdHJlbmRlckl0ZW0ubWF0ZXJpYWwgPSBtYXRlcmlhbDtcblx0XHRcdHJlbmRlckl0ZW0ucHJvZ3JhbSA9IG1hdGVyaWFsLnByb2dyYW07XG5cdFx0XHRyZW5kZXJJdGVtLnJlbmRlck9yZGVyID0gb2JqZWN0LnJlbmRlck9yZGVyO1xuXHRcdFx0cmVuZGVySXRlbS56ID0gejtcblx0XHRcdHJlbmRlckl0ZW0uZ3JvdXAgPSBncm91cDtcblxuXHRcdH1cblxuXHRcdCggbWF0ZXJpYWwudHJhbnNwYXJlbnQgPT09IHRydWUgPyB0cmFuc3BhcmVudCA6IG9wYXF1ZSApLnB1c2goIHJlbmRlckl0ZW0gKTtcblxuXHRcdHJlbmRlckl0ZW1zSW5kZXggKys7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNvcnQoKSB7XG5cblx0XHRpZiAoIG9wYXF1ZS5sZW5ndGggPiAxICkgb3BhcXVlLnNvcnQoIHBhaW50ZXJTb3J0U3RhYmxlICk7XG5cdFx0aWYgKCB0cmFuc3BhcmVudC5sZW5ndGggPiAxICkgdHJhbnNwYXJlbnQuc29ydCggcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlICk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0b3BhcXVlOiBvcGFxdWUsXG5cdFx0dHJhbnNwYXJlbnQ6IHRyYW5zcGFyZW50LFxuXG5cdFx0aW5pdDogaW5pdCxcblx0XHRwdXNoOiBwdXNoLFxuXG5cdFx0c29ydDogc29ydFxuXHR9O1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMUmVuZGVyTGlzdHMoKSB7XG5cblx0dmFyIGxpc3RzID0ge307XG5cblx0ZnVuY3Rpb24gZ2V0KCBzY2VuZSwgY2FtZXJhICkge1xuXG5cdFx0dmFyIGhhc2ggPSBzY2VuZS5pZCArICcsJyArIGNhbWVyYS5pZDtcblx0XHR2YXIgbGlzdCA9IGxpc3RzWyBoYXNoIF07XG5cblx0XHRpZiAoIGxpc3QgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gY29uc29sZS5sb2coICdUSFJFRS5XZWJHTFJlbmRlckxpc3RzOicsIGhhc2ggKTtcblxuXHRcdFx0bGlzdCA9IG5ldyBXZWJHTFJlbmRlckxpc3QoKTtcblx0XHRcdGxpc3RzWyBoYXNoIF0gPSBsaXN0O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGxpc3Q7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG5cblx0XHRsaXN0cyA9IHt9O1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGdldDogZ2V0LFxuXHRcdGRpc3Bvc2U6IGRpc3Bvc2Vcblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gVW5pZm9ybXNDYWNoZSgpIHtcblxuXHR2YXIgbGlnaHRzID0ge307XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCBsaWdodCApIHtcblxuXHRcdFx0aWYgKCBsaWdodHNbIGxpZ2h0LmlkIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gbGlnaHRzWyBsaWdodC5pZCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciB1bmlmb3JtcztcblxuXHRcdFx0c3dpdGNoICggbGlnaHQudHlwZSApIHtcblxuXHRcdFx0XHRjYXNlICdEaXJlY3Rpb25hbExpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogbmV3IFZlY3RvcjMoKSxcblx0XHRcdFx0XHRcdGNvbG9yOiBuZXcgQ29sb3IoKSxcblxuXHRcdFx0XHRcdFx0c2hhZG93OiBmYWxzZSxcblx0XHRcdFx0XHRcdHNoYWRvd0JpYXM6IDAsXG5cdFx0XHRcdFx0XHRzaGFkb3dSYWRpdXM6IDEsXG5cdFx0XHRcdFx0XHRzaGFkb3dNYXBTaXplOiBuZXcgVmVjdG9yMigpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdTcG90TGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKCksXG5cdFx0XHRcdFx0XHRkaXN0YW5jZTogMCxcblx0XHRcdFx0XHRcdGNvbmVDb3M6IDAsXG5cdFx0XHRcdFx0XHRwZW51bWJyYUNvczogMCxcblx0XHRcdFx0XHRcdGRlY2F5OiAwLFxuXG5cdFx0XHRcdFx0XHRzaGFkb3c6IGZhbHNlLFxuXHRcdFx0XHRcdFx0c2hhZG93QmlhczogMCxcblx0XHRcdFx0XHRcdHNoYWRvd1JhZGl1czogMSxcblx0XHRcdFx0XHRcdHNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKClcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1BvaW50TGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKCksXG5cdFx0XHRcdFx0XHRkaXN0YW5jZTogMCxcblx0XHRcdFx0XHRcdGRlY2F5OiAwLFxuXG5cdFx0XHRcdFx0XHRzaGFkb3c6IGZhbHNlLFxuXHRcdFx0XHRcdFx0c2hhZG93QmlhczogMCxcblx0XHRcdFx0XHRcdHNoYWRvd1JhZGl1czogMSxcblx0XHRcdFx0XHRcdHNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKCksXG5cdFx0XHRcdFx0XHRzaGFkb3dDYW1lcmFOZWFyOiAxLFxuXHRcdFx0XHRcdFx0c2hhZG93Q2FtZXJhRmFyOiAxMDAwXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdIZW1pc3BoZXJlTGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0c2t5Q29sb3I6IG5ldyBDb2xvcigpLFxuXHRcdFx0XHRcdFx0Z3JvdW5kQ29sb3I6IG5ldyBDb2xvcigpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdSZWN0QXJlYUxpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdGNvbG9yOiBuZXcgQ29sb3IoKSxcblx0XHRcdFx0XHRcdHBvc2l0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0aGFsZldpZHRoOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0aGFsZkhlaWdodDogbmV3IFZlY3RvcjMoKVxuXHRcdFx0XHRcdFx0Ly8gVE9ETyAoYWJlbG5hdGlvbik6IHNldCBSZWN0QXJlYUxpZ2h0IHNoYWRvdyB1bmlmb3Jtc1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdFx0bGlnaHRzWyBsaWdodC5pZCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdHJldHVybiB1bmlmb3JtcztcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbnZhciBjb3VudCA9IDA7XG5cbmZ1bmN0aW9uIFdlYkdMTGlnaHRzKCkge1xuXG5cdHZhciBjYWNoZSA9IG5ldyBVbmlmb3Jtc0NhY2hlKCk7XG5cblx0dmFyIHN0YXRlID0ge1xuXG5cdFx0aWQ6IGNvdW50ICsrLFxuXG5cdFx0aGFzaDogJycsXG5cblx0XHRhbWJpZW50OiBbIDAsIDAsIDAgXSxcblx0XHRkaXJlY3Rpb25hbDogW10sXG5cdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXA6IFtdLFxuXHRcdGRpcmVjdGlvbmFsU2hhZG93TWF0cml4OiBbXSxcblx0XHRzcG90OiBbXSxcblx0XHRzcG90U2hhZG93TWFwOiBbXSxcblx0XHRzcG90U2hhZG93TWF0cml4OiBbXSxcblx0XHRyZWN0QXJlYTogW10sXG5cdFx0cG9pbnQ6IFtdLFxuXHRcdHBvaW50U2hhZG93TWFwOiBbXSxcblx0XHRwb2ludFNoYWRvd01hdHJpeDogW10sXG5cdFx0aGVtaTogW11cblxuXHR9O1xuXG5cdHZhciB2ZWN0b3IzID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIG1hdHJpeDQgPSBuZXcgTWF0cml4NCgpO1xuXHR2YXIgbWF0cml4NDIgPSBuZXcgTWF0cml4NCgpO1xuXG5cdGZ1bmN0aW9uIHNldHVwKCBsaWdodHMsIHNoYWRvd3MsIGNhbWVyYSApIHtcblxuXHRcdHZhciByID0gMCwgZyA9IDAsIGIgPSAwO1xuXG5cdFx0dmFyIGRpcmVjdGlvbmFsTGVuZ3RoID0gMDtcblx0XHR2YXIgcG9pbnRMZW5ndGggPSAwO1xuXHRcdHZhciBzcG90TGVuZ3RoID0gMDtcblx0XHR2YXIgcmVjdEFyZWFMZW5ndGggPSAwO1xuXHRcdHZhciBoZW1pTGVuZ3RoID0gMDtcblxuXHRcdHZhciB2aWV3TWF0cml4ID0gY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGxpZ2h0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgbGlnaHQgPSBsaWdodHNbIGkgXTtcblxuXHRcdFx0dmFyIGNvbG9yID0gbGlnaHQuY29sb3I7XG5cdFx0XHR2YXIgaW50ZW5zaXR5ID0gbGlnaHQuaW50ZW5zaXR5O1xuXHRcdFx0dmFyIGRpc3RhbmNlID0gbGlnaHQuZGlzdGFuY2U7XG5cblx0XHRcdHZhciBzaGFkb3dNYXAgPSAoIGxpZ2h0LnNoYWRvdyAmJiBsaWdodC5zaGFkb3cubWFwICkgPyBsaWdodC5zaGFkb3cubWFwLnRleHR1cmUgOiBudWxsO1xuXG5cdFx0XHRpZiAoIGxpZ2h0LmlzQW1iaWVudExpZ2h0ICkge1xuXG5cdFx0XHRcdHIgKz0gY29sb3IuciAqIGludGVuc2l0eTtcblx0XHRcdFx0ZyArPSBjb2xvci5nICogaW50ZW5zaXR5O1xuXHRcdFx0XHRiICs9IGNvbG9yLmIgKiBpbnRlbnNpdHk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzRGlyZWN0aW9uYWxMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuY29sb3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggbGlnaHQuaW50ZW5zaXR5ICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnN1YiggdmVjdG9yMyApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuc2hhZG93ID0gbGlnaHQuY2FzdFNoYWRvdztcblxuXHRcdFx0XHRpZiAoIGxpZ2h0LmNhc3RTaGFkb3cgKSB7XG5cblx0XHRcdFx0XHR2YXIgc2hhZG93ID0gbGlnaHQuc2hhZG93O1xuXG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd1JhZGl1cyA9IHNoYWRvdy5yYWRpdXM7XG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93TWFwU2l6ZSA9IHNoYWRvdy5tYXBTaXplO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hcFsgZGlyZWN0aW9uYWxMZW5ndGggXSA9IHNoYWRvd01hcDtcblx0XHRcdFx0c3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIGRpcmVjdGlvbmFsTGVuZ3RoIF0gPSBsaWdodC5zaGFkb3cubWF0cml4O1xuXHRcdFx0XHRzdGF0ZS5kaXJlY3Rpb25hbFsgZGlyZWN0aW9uYWxMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdGRpcmVjdGlvbmFsTGVuZ3RoICsrO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc1Nwb3RMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXggKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5jb2xvci5jb3B5KCBjb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlzdGFuY2UgPSBkaXN0YW5jZTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR2ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zdWIoIHZlY3RvcjMgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmNvbmVDb3MgPSBNYXRoLmNvcyggbGlnaHQuYW5nbGUgKTtcblx0XHRcdFx0dW5pZm9ybXMucGVudW1icmFDb3MgPSBNYXRoLmNvcyggbGlnaHQuYW5nbGUgKiAoIDEgLSBsaWdodC5wZW51bWJyYSApICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRlY2F5ID0gKCBsaWdodC5kaXN0YW5jZSA9PT0gMCApID8gMC4wIDogbGlnaHQuZGVjYXk7XG5cblx0XHRcdFx0dW5pZm9ybXMuc2hhZG93ID0gbGlnaHQuY2FzdFNoYWRvdztcblxuXHRcdFx0XHRpZiAoIGxpZ2h0LmNhc3RTaGFkb3cgKSB7XG5cblx0XHRcdFx0XHR2YXIgc2hhZG93ID0gbGlnaHQuc2hhZG93O1xuXG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd1JhZGl1cyA9IHNoYWRvdy5yYWRpdXM7XG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93TWFwU2l6ZSA9IHNoYWRvdy5tYXBTaXplO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzdGF0ZS5zcG90U2hhZG93TWFwWyBzcG90TGVuZ3RoIF0gPSBzaGFkb3dNYXA7XG5cdFx0XHRcdHN0YXRlLnNwb3RTaGFkb3dNYXRyaXhbIHNwb3RMZW5ndGggXSA9IGxpZ2h0LnNoYWRvdy5tYXRyaXg7XG5cdFx0XHRcdHN0YXRlLnNwb3RbIHNwb3RMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdHNwb3RMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzUmVjdEFyZWFMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0Ly8gKGEpIGludGVuc2l0eSBpcyB0aGUgdG90YWwgdmlzaWJsZSBsaWdodCBlbWl0dGVkXG5cdFx0XHRcdC8vdW5pZm9ybXMuY29sb3IuY29weSggY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5IC8gKCBsaWdodC53aWR0aCAqIGxpZ2h0LmhlaWdodCAqIE1hdGguUEkgKSApO1xuXG5cdFx0XHRcdC8vIChiKSBpbnRlbnNpdHkgaXMgdGhlIGJyaWdodG5lc3Mgb2YgdGhlIGxpZ2h0XG5cdFx0XHRcdHVuaWZvcm1zLmNvbG9yLmNvcHkoIGNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0Ly8gZXh0cmFjdCBsb2NhbCByb3RhdGlvbiBvZiBsaWdodCB0byBkZXJpdmUgd2lkdGgvaGVpZ2h0IGhhbGYgdmVjdG9yc1xuXHRcdFx0XHRtYXRyaXg0Mi5pZGVudGl0eSgpO1xuXHRcdFx0XHRtYXRyaXg0LmNvcHkoIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdG1hdHJpeDQucHJlbXVsdGlwbHkoIHZpZXdNYXRyaXggKTtcblx0XHRcdFx0bWF0cml4NDIuZXh0cmFjdFJvdGF0aW9uKCBtYXRyaXg0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuaGFsZldpZHRoLnNldCggbGlnaHQud2lkdGggKiAwLjUsIDAuMCwgMC4wICk7XG5cdFx0XHRcdHVuaWZvcm1zLmhhbGZIZWlnaHQuc2V0KCAwLjAsIGxpZ2h0LmhlaWdodCAqIDAuNSwgMC4wICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuaGFsZldpZHRoLmFwcGx5TWF0cml4NCggbWF0cml4NDIgKTtcblx0XHRcdFx0dW5pZm9ybXMuaGFsZkhlaWdodC5hcHBseU1hdHJpeDQoIG1hdHJpeDQyICk7XG5cblx0XHRcdFx0Ly8gVE9ETyAoYWJlbG5hdGlvbik6IFJlY3RBcmVhTGlnaHQgZGlzdGFuY2U/XG5cdFx0XHRcdC8vIHVuaWZvcm1zLmRpc3RhbmNlID0gZGlzdGFuY2U7XG5cblx0XHRcdFx0c3RhdGUucmVjdEFyZWFbIHJlY3RBcmVhTGVuZ3RoIF0gPSB1bmlmb3JtcztcblxuXHRcdFx0XHRyZWN0QXJlYUxlbmd0aCArKztcblxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNQb2ludExpZ2h0ICkge1xuXG5cdFx0XHRcdHZhciB1bmlmb3JtcyA9IGNhY2hlLmdldCggbGlnaHQgKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLmFwcGx5TWF0cml4NCggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmNvbG9yLmNvcHkoIGxpZ2h0LmNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGxpZ2h0LmludGVuc2l0eSApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXN0YW5jZSA9IGxpZ2h0LmRpc3RhbmNlO1xuXHRcdFx0XHR1bmlmb3Jtcy5kZWNheSA9ICggbGlnaHQuZGlzdGFuY2UgPT09IDAgKSA/IDAuMCA6IGxpZ2h0LmRlY2F5O1xuXG5cdFx0XHRcdHVuaWZvcm1zLnNoYWRvdyA9IGxpZ2h0LmNhc3RTaGFkb3c7XG5cblx0XHRcdFx0aWYgKCBsaWdodC5jYXN0U2hhZG93ICkge1xuXG5cdFx0XHRcdFx0dmFyIHNoYWRvdyA9IGxpZ2h0LnNoYWRvdztcblxuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd0JpYXMgPSBzaGFkb3cuYmlhcztcblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dSYWRpdXMgPSBzaGFkb3cucmFkaXVzO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd01hcFNpemUgPSBzaGFkb3cubWFwU2l6ZTtcblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dDYW1lcmFOZWFyID0gc2hhZG93LmNhbWVyYS5uZWFyO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd0NhbWVyYUZhciA9IHNoYWRvdy5jYW1lcmEuZmFyO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzdGF0ZS5wb2ludFNoYWRvd01hcFsgcG9pbnRMZW5ndGggXSA9IHNoYWRvd01hcDtcblx0XHRcdFx0c3RhdGUucG9pbnRTaGFkb3dNYXRyaXhbIHBvaW50TGVuZ3RoIF0gPSBsaWdodC5zaGFkb3cubWF0cml4O1xuXHRcdFx0XHRzdGF0ZS5wb2ludFsgcG9pbnRMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdHBvaW50TGVuZ3RoICsrO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc0hlbWlzcGhlcmVMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggdmlld01hdHJpeCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24ubm9ybWFsaXplKCk7XG5cblx0XHRcdFx0dW5pZm9ybXMuc2t5Q29sb3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5ICk7XG5cdFx0XHRcdHVuaWZvcm1zLmdyb3VuZENvbG9yLmNvcHkoIGxpZ2h0Lmdyb3VuZENvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApO1xuXG5cdFx0XHRcdHN0YXRlLmhlbWlbIGhlbWlMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdGhlbWlMZW5ndGggKys7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHN0YXRlLmFtYmllbnRbIDAgXSA9IHI7XG5cdFx0c3RhdGUuYW1iaWVudFsgMSBdID0gZztcblx0XHRzdGF0ZS5hbWJpZW50WyAyIF0gPSBiO1xuXG5cdFx0c3RhdGUuZGlyZWN0aW9uYWwubGVuZ3RoID0gZGlyZWN0aW9uYWxMZW5ndGg7XG5cdFx0c3RhdGUuc3BvdC5sZW5ndGggPSBzcG90TGVuZ3RoO1xuXHRcdHN0YXRlLnJlY3RBcmVhLmxlbmd0aCA9IHJlY3RBcmVhTGVuZ3RoO1xuXHRcdHN0YXRlLnBvaW50Lmxlbmd0aCA9IHBvaW50TGVuZ3RoO1xuXHRcdHN0YXRlLmhlbWkubGVuZ3RoID0gaGVtaUxlbmd0aDtcblxuXHRcdHN0YXRlLmhhc2ggPSBzdGF0ZS5pZCArICcsJyArIGRpcmVjdGlvbmFsTGVuZ3RoICsgJywnICsgcG9pbnRMZW5ndGggKyAnLCcgKyBzcG90TGVuZ3RoICsgJywnICsgcmVjdEFyZWFMZW5ndGggKyAnLCcgKyBoZW1pTGVuZ3RoICsgJywnICsgc2hhZG93cy5sZW5ndGg7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0c2V0dXA6IHNldHVwLFxuXHRcdHN0YXRlOiBzdGF0ZVxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFJlbmRlclN0YXRlKCkge1xuXG5cdHZhciBsaWdodHMgPSBuZXcgV2ViR0xMaWdodHMoKTtcblxuXHR2YXIgbGlnaHRzQXJyYXkgPSBbXTtcblx0dmFyIHNoYWRvd3NBcnJheSA9IFtdO1xuXHR2YXIgc3ByaXRlc0FycmF5ID0gW107XG5cblx0ZnVuY3Rpb24gaW5pdCgpIHtcblxuXHRcdGxpZ2h0c0FycmF5Lmxlbmd0aCA9IDA7XG5cdFx0c2hhZG93c0FycmF5Lmxlbmd0aCA9IDA7XG5cdFx0c3ByaXRlc0FycmF5Lmxlbmd0aCA9IDA7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHB1c2hMaWdodCggbGlnaHQgKSB7XG5cblx0XHRsaWdodHNBcnJheS5wdXNoKCBsaWdodCApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwdXNoU2hhZG93KCBzaGFkb3dMaWdodCApIHtcblxuXHRcdHNoYWRvd3NBcnJheS5wdXNoKCBzaGFkb3dMaWdodCApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwdXNoU3ByaXRlKCBzaGFkb3dMaWdodCApIHtcblxuXHRcdHNwcml0ZXNBcnJheS5wdXNoKCBzaGFkb3dMaWdodCApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXR1cExpZ2h0cyggY2FtZXJhICkge1xuXG5cdFx0bGlnaHRzLnNldHVwKCBsaWdodHNBcnJheSwgc2hhZG93c0FycmF5LCBjYW1lcmEgKTtcblxuXHR9XG5cblx0dmFyIHN0YXRlID0ge1xuXHRcdGxpZ2h0c0FycmF5OiBsaWdodHNBcnJheSxcblx0XHRzaGFkb3dzQXJyYXk6IHNoYWRvd3NBcnJheSxcblx0XHRzcHJpdGVzQXJyYXk6IHNwcml0ZXNBcnJheSxcblxuXHRcdGxpZ2h0czogbGlnaHRzXG5cdH07XG5cblx0cmV0dXJuIHtcblx0XHRpbml0OiBpbml0LFxuXHRcdHN0YXRlOiBzdGF0ZSxcblx0XHRzZXR1cExpZ2h0czogc2V0dXBMaWdodHMsXG5cblx0XHRwdXNoTGlnaHQ6IHB1c2hMaWdodCxcblx0XHRwdXNoU2hhZG93OiBwdXNoU2hhZG93LFxuXHRcdHB1c2hTcHJpdGU6IHB1c2hTcHJpdGVcblx0fTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTFJlbmRlclN0YXRlcygpIHtcblxuXHR2YXIgcmVuZGVyU3RhdGVzID0ge307XG5cblx0ZnVuY3Rpb24gZ2V0KCBzY2VuZSwgY2FtZXJhICkge1xuXG5cdFx0dmFyIGhhc2ggPSBzY2VuZS5pZCArICcsJyArIGNhbWVyYS5pZDtcblxuXHRcdHZhciByZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlc1sgaGFzaCBdO1xuXG5cdFx0aWYgKCByZW5kZXJTdGF0ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRyZW5kZXJTdGF0ZSA9IG5ldyBXZWJHTFJlbmRlclN0YXRlKCk7XG5cdFx0XHRyZW5kZXJTdGF0ZXNbIGhhc2ggXSA9IHJlbmRlclN0YXRlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlbmRlclN0YXRlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xuXG5cdFx0cmVuZGVyU3RhdGVzID0ge307XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBnZXQsXG5cdFx0ZGlzcG9zZTogZGlzcG9zZVxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cHM6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LFxuICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hEZXB0aE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaERlcHRoTWF0ZXJpYWwnO1xuXG5cdHRoaXMuZGVwdGhQYWNraW5nID0gQmFzaWNEZXB0aFBhY2tpbmc7XG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXG5cdHRoaXMubWFwID0gbnVsbDtcblxuXHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblxuXHR0aGlzLmZvZyA9IGZhbHNlO1xuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaERlcHRoTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoRGVwdGhNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoRGVwdGhNYXRlcmlhbDtcblxuTWVzaERlcHRoTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaERlcHRoTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoRGVwdGhNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZGVwdGhQYWNraW5nID0gc291cmNlLmRlcHRoUGFja2luZztcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICpcbiAqICByZWZlcmVuY2VQb3NpdGlvbjogPGZsb2F0PixcbiAqICBuZWFyRGlzdGFuY2U6IDxmbG9hdD4sXG4gKiAgZmFyRGlzdGFuY2U6IDxmbG9hdD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKlxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PixcbiAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+XG4gKlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hEaXN0YW5jZU1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaERpc3RhbmNlTWF0ZXJpYWwnO1xuXG5cdHRoaXMucmVmZXJlbmNlUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLm5lYXJEaXN0YW5jZSA9IDE7XG5cdHRoaXMuZmFyRGlzdGFuY2UgPSAxMDAwO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcblxuXHR0aGlzLmZvZyA9IGZhbHNlO1xuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaERpc3RhbmNlTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoRGlzdGFuY2VNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoRGlzdGFuY2VNYXRlcmlhbDtcblxuTWVzaERpc3RhbmNlTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoRGlzdGFuY2VNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMucmVmZXJlbmNlUG9zaXRpb24uY29weSggc291cmNlLnJlZmVyZW5jZVBvc2l0aW9uICk7XG5cdHRoaXMubmVhckRpc3RhbmNlID0gc291cmNlLm5lYXJEaXN0YW5jZTtcblx0dGhpcy5mYXJEaXN0YW5jZSA9IHNvdXJjZS5mYXJEaXN0YW5jZTtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFNoYWRvd01hcCggX3JlbmRlcmVyLCBfb2JqZWN0cywgbWF4VGV4dHVyZVNpemUgKSB7XG5cblx0dmFyIF9mcnVzdHVtID0gbmV3IEZydXN0dW0oKSxcblx0XHRfcHJvalNjcmVlbk1hdHJpeCA9IG5ldyBNYXRyaXg0KCksXG5cblx0XHRfc2hhZG93TWFwU2l6ZSA9IG5ldyBWZWN0b3IyKCksXG5cdFx0X21heFNoYWRvd01hcFNpemUgPSBuZXcgVmVjdG9yMiggbWF4VGV4dHVyZVNpemUsIG1heFRleHR1cmVTaXplICksXG5cblx0XHRfbG9va1RhcmdldCA9IG5ldyBWZWN0b3IzKCksXG5cdFx0X2xpZ2h0UG9zaXRpb25Xb3JsZCA9IG5ldyBWZWN0b3IzKCksXG5cblx0XHRfTW9ycGhpbmdGbGFnID0gMSxcblx0XHRfU2tpbm5pbmdGbGFnID0gMixcblxuXHRcdF9OdW1iZXJPZk1hdGVyaWFsVmFyaWFudHMgPSAoIF9Nb3JwaGluZ0ZsYWcgfCBfU2tpbm5pbmdGbGFnICkgKyAxLFxuXG5cdFx0X2RlcHRoTWF0ZXJpYWxzID0gbmV3IEFycmF5KCBfTnVtYmVyT2ZNYXRlcmlhbFZhcmlhbnRzICksXG5cdFx0X2Rpc3RhbmNlTWF0ZXJpYWxzID0gbmV3IEFycmF5KCBfTnVtYmVyT2ZNYXRlcmlhbFZhcmlhbnRzICksXG5cblx0XHRfbWF0ZXJpYWxDYWNoZSA9IHt9O1xuXG5cdHZhciBzaGFkb3dTaWRlID0geyAwOiBCYWNrU2lkZSwgMTogRnJvbnRTaWRlLCAyOiBEb3VibGVTaWRlIH07XG5cblx0dmFyIGN1YmVEaXJlY3Rpb25zID0gW1xuXHRcdG5ldyBWZWN0b3IzKCAxLCAwLCAwICksIG5ldyBWZWN0b3IzKCAtIDEsIDAsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSxcblx0XHRuZXcgVmVjdG9yMyggMCwgMCwgLSAxICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAtIDEsIDAgKVxuXHRdO1xuXG5cdHZhciBjdWJlVXBzID0gW1xuXHRcdG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksXG5cdFx0bmV3IFZlY3RvcjMoIDAsIDEsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSxcdG5ldyBWZWN0b3IzKCAwLCAwLCAtIDEgKVxuXHRdO1xuXG5cdHZhciBjdWJlMkRWaWV3UG9ydHMgPSBbXG5cdFx0bmV3IFZlY3RvcjQoKSwgbmV3IFZlY3RvcjQoKSwgbmV3IFZlY3RvcjQoKSxcblx0XHRuZXcgVmVjdG9yNCgpLCBuZXcgVmVjdG9yNCgpLCBuZXcgVmVjdG9yNCgpXG5cdF07XG5cblx0Ly8gaW5pdFxuXG5cdGZvciAoIHZhciBpID0gMDsgaSAhPT0gX051bWJlck9mTWF0ZXJpYWxWYXJpYW50czsgKysgaSApIHtcblxuXHRcdHZhciB1c2VNb3JwaGluZyA9ICggaSAmIF9Nb3JwaGluZ0ZsYWcgKSAhPT0gMDtcblx0XHR2YXIgdXNlU2tpbm5pbmcgPSAoIGkgJiBfU2tpbm5pbmdGbGFnICkgIT09IDA7XG5cblx0XHR2YXIgZGVwdGhNYXRlcmlhbCA9IG5ldyBNZXNoRGVwdGhNYXRlcmlhbCgge1xuXG5cdFx0XHRkZXB0aFBhY2tpbmc6IFJHQkFEZXB0aFBhY2tpbmcsXG5cblx0XHRcdG1vcnBoVGFyZ2V0czogdXNlTW9ycGhpbmcsXG5cdFx0XHRza2lubmluZzogdXNlU2tpbm5pbmdcblxuXHRcdH0gKTtcblxuXHRcdF9kZXB0aE1hdGVyaWFsc1sgaSBdID0gZGVwdGhNYXRlcmlhbDtcblxuXHRcdC8vXG5cblx0XHR2YXIgZGlzdGFuY2VNYXRlcmlhbCA9IG5ldyBNZXNoRGlzdGFuY2VNYXRlcmlhbCgge1xuXG5cdFx0XHRtb3JwaFRhcmdldHM6IHVzZU1vcnBoaW5nLFxuXHRcdFx0c2tpbm5pbmc6IHVzZVNraW5uaW5nXG5cblx0XHR9ICk7XG5cblx0XHRfZGlzdGFuY2VNYXRlcmlhbHNbIGkgXSA9IGRpc3RhbmNlTWF0ZXJpYWw7XG5cblx0fVxuXG5cdC8vXG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHR0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblxuXHR0aGlzLmF1dG9VcGRhdGUgPSB0cnVlO1xuXHR0aGlzLm5lZWRzVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy50eXBlID0gUENGU2hhZG93TWFwO1xuXG5cdHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCBsaWdodHMsIHNjZW5lLCBjYW1lcmEgKSB7XG5cblx0XHRpZiAoIHNjb3BlLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuO1xuXHRcdGlmICggc2NvcGUuYXV0b1VwZGF0ZSA9PT0gZmFsc2UgJiYgc2NvcGUubmVlZHNVcGRhdGUgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0aWYgKCBsaWdodHMubGVuZ3RoID09PSAwICkgcmV0dXJuO1xuXG5cdFx0Ly8gVE9ETyBDbGVhbiB1cCAobmVlZGVkIGluIGNhc2Ugb2YgY29udGV4dGxvc3QpXG5cdFx0dmFyIF9nbCA9IF9yZW5kZXJlci5jb250ZXh0O1xuXHRcdHZhciBfc3RhdGUgPSBfcmVuZGVyZXIuc3RhdGU7XG5cblx0XHQvLyBTZXQgR0wgc3RhdGUgZm9yIGRlcHRoIG1hcC5cblx0XHRfc3RhdGUuZGlzYWJsZSggX2dsLkJMRU5EICk7XG5cdFx0X3N0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoIDEsIDEsIDEsIDEgKTtcblx0XHRfc3RhdGUuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCB0cnVlICk7XG5cdFx0X3N0YXRlLnNldFNjaXNzb3JUZXN0KCBmYWxzZSApO1xuXG5cdFx0Ly8gcmVuZGVyIGRlcHRoIG1hcFxuXG5cdFx0dmFyIGZhY2VDb3VudDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBsaWdodHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBsaWdodCA9IGxpZ2h0c1sgaSBdO1xuXHRcdFx0dmFyIHNoYWRvdyA9IGxpZ2h0LnNoYWRvdztcblx0XHRcdHZhciBpc1BvaW50TGlnaHQgPSBsaWdodCAmJiBsaWdodC5pc1BvaW50TGlnaHQ7XG5cblx0XHRcdGlmICggc2hhZG93ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xTaGFkb3dNYXA6JywgbGlnaHQsICdoYXMgbm8gc2hhZG93LicgKTtcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHNoYWRvd0NhbWVyYSA9IHNoYWRvdy5jYW1lcmE7XG5cblx0XHRcdF9zaGFkb3dNYXBTaXplLmNvcHkoIHNoYWRvdy5tYXBTaXplICk7XG5cdFx0XHRfc2hhZG93TWFwU2l6ZS5taW4oIF9tYXhTaGFkb3dNYXBTaXplICk7XG5cblx0XHRcdGlmICggaXNQb2ludExpZ2h0ICkge1xuXG5cdFx0XHRcdHZhciB2cFdpZHRoID0gX3NoYWRvd01hcFNpemUueDtcblx0XHRcdFx0dmFyIHZwSGVpZ2h0ID0gX3NoYWRvd01hcFNpemUueTtcblxuXHRcdFx0XHQvLyBUaGVzZSB2aWV3cG9ydHMgbWFwIGEgY3ViZS1tYXAgb250byBhIDJEIHRleHR1cmUgd2l0aCB0aGVcblx0XHRcdFx0Ly8gZm9sbG93aW5nIG9yaWVudGF0aW9uOlxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyAgeHpYWlxuXHRcdFx0XHQvLyAgIHkgWVxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyBYIC0gUG9zaXRpdmUgeCBkaXJlY3Rpb25cblx0XHRcdFx0Ly8geCAtIE5lZ2F0aXZlIHggZGlyZWN0aW9uXG5cdFx0XHRcdC8vIFkgLSBQb3NpdGl2ZSB5IGRpcmVjdGlvblxuXHRcdFx0XHQvLyB5IC0gTmVnYXRpdmUgeSBkaXJlY3Rpb25cblx0XHRcdFx0Ly8gWiAtIFBvc2l0aXZlIHogZGlyZWN0aW9uXG5cdFx0XHRcdC8vIHogLSBOZWdhdGl2ZSB6IGRpcmVjdGlvblxuXG5cdFx0XHRcdC8vIHBvc2l0aXZlIFhcblx0XHRcdFx0Y3ViZTJEVmlld1BvcnRzWyAwIF0uc2V0KCB2cFdpZHRoICogMiwgdnBIZWlnaHQsIHZwV2lkdGgsIHZwSGVpZ2h0ICk7XG5cdFx0XHRcdC8vIG5lZ2F0aXZlIFhcblx0XHRcdFx0Y3ViZTJEVmlld1BvcnRzWyAxIF0uc2V0KCAwLCB2cEhlaWdodCwgdnBXaWR0aCwgdnBIZWlnaHQgKTtcblx0XHRcdFx0Ly8gcG9zaXRpdmUgWlxuXHRcdFx0XHRjdWJlMkRWaWV3UG9ydHNbIDIgXS5zZXQoIHZwV2lkdGggKiAzLCB2cEhlaWdodCwgdnBXaWR0aCwgdnBIZWlnaHQgKTtcblx0XHRcdFx0Ly8gbmVnYXRpdmUgWlxuXHRcdFx0XHRjdWJlMkRWaWV3UG9ydHNbIDMgXS5zZXQoIHZwV2lkdGgsIHZwSGVpZ2h0LCB2cFdpZHRoLCB2cEhlaWdodCApO1xuXHRcdFx0XHQvLyBwb3NpdGl2ZSBZXG5cdFx0XHRcdGN1YmUyRFZpZXdQb3J0c1sgNCBdLnNldCggdnBXaWR0aCAqIDMsIDAsIHZwV2lkdGgsIHZwSGVpZ2h0ICk7XG5cdFx0XHRcdC8vIG5lZ2F0aXZlIFlcblx0XHRcdFx0Y3ViZTJEVmlld1BvcnRzWyA1IF0uc2V0KCB2cFdpZHRoLCAwLCB2cFdpZHRoLCB2cEhlaWdodCApO1xuXG5cdFx0XHRcdF9zaGFkb3dNYXBTaXplLnggKj0gNC4wO1xuXHRcdFx0XHRfc2hhZG93TWFwU2l6ZS55ICo9IDIuMDtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNoYWRvdy5tYXAgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0dmFyIHBhcnMgPSB7IG1pbkZpbHRlcjogTmVhcmVzdEZpbHRlciwgbWFnRmlsdGVyOiBOZWFyZXN0RmlsdGVyLCBmb3JtYXQ6IFJHQkFGb3JtYXQgfTtcblxuXHRcdFx0XHRzaGFkb3cubWFwID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KCBfc2hhZG93TWFwU2l6ZS54LCBfc2hhZG93TWFwU2l6ZS55LCBwYXJzICk7XG5cdFx0XHRcdHNoYWRvdy5tYXAudGV4dHVyZS5uYW1lID0gbGlnaHQubmFtZSArIFwiLnNoYWRvd01hcFwiO1xuXG5cdFx0XHRcdHNoYWRvd0NhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBzaGFkb3cuaXNTcG90TGlnaHRTaGFkb3cgKSB7XG5cblx0XHRcdFx0c2hhZG93LnVwZGF0ZSggbGlnaHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgc2hhZG93TWFwID0gc2hhZG93Lm1hcDtcblx0XHRcdHZhciBzaGFkb3dNYXRyaXggPSBzaGFkb3cubWF0cml4O1xuXG5cdFx0XHRfbGlnaHRQb3NpdGlvbldvcmxkLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdHNoYWRvd0NhbWVyYS5wb3NpdGlvbi5jb3B5KCBfbGlnaHRQb3NpdGlvbldvcmxkICk7XG5cblx0XHRcdGlmICggaXNQb2ludExpZ2h0ICkge1xuXG5cdFx0XHRcdGZhY2VDb3VudCA9IDY7XG5cblx0XHRcdFx0Ly8gZm9yIHBvaW50IGxpZ2h0cyB3ZSBzZXQgdGhlIHNoYWRvdyBtYXRyaXggdG8gYmUgYSB0cmFuc2xhdGlvbi1vbmx5IG1hdHJpeFxuXHRcdFx0XHQvLyBlcXVhbCB0byBpbnZlcnNlIG9mIHRoZSBsaWdodCdzIHBvc2l0aW9uXG5cblx0XHRcdFx0c2hhZG93TWF0cml4Lm1ha2VUcmFuc2xhdGlvbiggLSBfbGlnaHRQb3NpdGlvbldvcmxkLngsIC0gX2xpZ2h0UG9zaXRpb25Xb3JsZC55LCAtIF9saWdodFBvc2l0aW9uV29ybGQueiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZhY2VDb3VudCA9IDE7XG5cblx0XHRcdFx0X2xvb2tUYXJnZXQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0c2hhZG93Q2FtZXJhLmxvb2tBdCggX2xvb2tUYXJnZXQgKTtcblx0XHRcdFx0c2hhZG93Q2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHRcdFx0Ly8gY29tcHV0ZSBzaGFkb3cgbWF0cml4XG5cblx0XHRcdFx0c2hhZG93TWF0cml4LnNldChcblx0XHRcdFx0XHQwLjUsIDAuMCwgMC4wLCAwLjUsXG5cdFx0XHRcdFx0MC4wLCAwLjUsIDAuMCwgMC41LFxuXHRcdFx0XHRcdDAuMCwgMC4wLCAwLjUsIDAuNSxcblx0XHRcdFx0XHQwLjAsIDAuMCwgMC4wLCAxLjBcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRzaGFkb3dNYXRyaXgubXVsdGlwbHkoIHNoYWRvd0NhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7XG5cdFx0XHRcdHNoYWRvd01hdHJpeC5tdWx0aXBseSggc2hhZG93Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdF9yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHNoYWRvd01hcCApO1xuXHRcdFx0X3JlbmRlcmVyLmNsZWFyKCk7XG5cblx0XHRcdC8vIHJlbmRlciBzaGFkb3cgbWFwIGZvciBlYWNoIGN1YmUgZmFjZSAoaWYgb21uaS1kaXJlY3Rpb25hbCkgb3Jcblx0XHRcdC8vIHJ1biBhIHNpbmdsZSBwYXNzIGlmIG5vdFxuXG5cdFx0XHRmb3IgKCB2YXIgZmFjZSA9IDA7IGZhY2UgPCBmYWNlQ291bnQ7IGZhY2UgKysgKSB7XG5cblx0XHRcdFx0aWYgKCBpc1BvaW50TGlnaHQgKSB7XG5cblx0XHRcdFx0XHRfbG9va1RhcmdldC5jb3B5KCBzaGFkb3dDYW1lcmEucG9zaXRpb24gKTtcblx0XHRcdFx0XHRfbG9va1RhcmdldC5hZGQoIGN1YmVEaXJlY3Rpb25zWyBmYWNlIF0gKTtcblx0XHRcdFx0XHRzaGFkb3dDYW1lcmEudXAuY29weSggY3ViZVVwc1sgZmFjZSBdICk7XG5cdFx0XHRcdFx0c2hhZG93Q2FtZXJhLmxvb2tBdCggX2xvb2tUYXJnZXQgKTtcblx0XHRcdFx0XHRzaGFkb3dDYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHRcdFx0XHRcdHZhciB2cERpbWVuc2lvbnMgPSBjdWJlMkRWaWV3UG9ydHNbIGZhY2UgXTtcblx0XHRcdFx0XHRfc3RhdGUudmlld3BvcnQoIHZwRGltZW5zaW9ucyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyB1cGRhdGUgY2FtZXJhIG1hdHJpY2VzIGFuZCBmcnVzdHVtXG5cblx0XHRcdFx0X3Byb2pTY3JlZW5NYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggc2hhZG93Q2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIHNoYWRvd0NhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblx0XHRcdFx0X2ZydXN0dW0uc2V0RnJvbU1hdHJpeCggX3Byb2pTY3JlZW5NYXRyaXggKTtcblxuXHRcdFx0XHQvLyBzZXQgb2JqZWN0IG1hdHJpY2VzICYgZnJ1c3R1bSBjdWxsaW5nXG5cblx0XHRcdFx0cmVuZGVyT2JqZWN0KCBzY2VuZSwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGlzUG9pbnRMaWdodCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRzY29wZS5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdH07XG5cblx0ZnVuY3Rpb24gZ2V0RGVwdGhNYXRlcmlhbCggb2JqZWN0LCBtYXRlcmlhbCwgaXNQb2ludExpZ2h0LCBsaWdodFBvc2l0aW9uV29ybGQsIHNoYWRvd0NhbWVyYU5lYXIsIHNoYWRvd0NhbWVyYUZhciApIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTtcblxuXHRcdHZhciByZXN1bHQgPSBudWxsO1xuXG5cdFx0dmFyIG1hdGVyaWFsVmFyaWFudHMgPSBfZGVwdGhNYXRlcmlhbHM7XG5cdFx0dmFyIGN1c3RvbU1hdGVyaWFsID0gb2JqZWN0LmN1c3RvbURlcHRoTWF0ZXJpYWw7XG5cblx0XHRpZiAoIGlzUG9pbnRMaWdodCApIHtcblxuXHRcdFx0bWF0ZXJpYWxWYXJpYW50cyA9IF9kaXN0YW5jZU1hdGVyaWFscztcblx0XHRcdGN1c3RvbU1hdGVyaWFsID0gb2JqZWN0LmN1c3RvbURpc3RhbmNlTWF0ZXJpYWw7XG5cblx0XHR9XG5cblx0XHRpZiAoICEgY3VzdG9tTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHZhciB1c2VNb3JwaGluZyA9IGZhbHNlO1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0XHR1c2VNb3JwaGluZyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcyAmJiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24gJiYgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLmxlbmd0aCA+IDA7XG5cblx0XHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHRcdHVzZU1vcnBoaW5nID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzICYmIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy5sZW5ndGggPiAwO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG9iamVjdC5pc1NraW5uZWRNZXNoICYmIG1hdGVyaWFsLnNraW5uaW5nID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFNoYWRvd01hcDogVEhSRUUuU2tpbm5lZE1lc2ggd2l0aCBtYXRlcmlhbC5za2lubmluZyBzZXQgdG8gZmFsc2U6Jywgb2JqZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHVzZVNraW5uaW5nID0gb2JqZWN0LmlzU2tpbm5lZE1lc2ggJiYgbWF0ZXJpYWwuc2tpbm5pbmc7XG5cblx0XHRcdHZhciB2YXJpYW50SW5kZXggPSAwO1xuXG5cdFx0XHRpZiAoIHVzZU1vcnBoaW5nICkgdmFyaWFudEluZGV4IHw9IF9Nb3JwaGluZ0ZsYWc7XG5cdFx0XHRpZiAoIHVzZVNraW5uaW5nICkgdmFyaWFudEluZGV4IHw9IF9Ta2lubmluZ0ZsYWc7XG5cblx0XHRcdHJlc3VsdCA9IG1hdGVyaWFsVmFyaWFudHNbIHZhcmlhbnRJbmRleCBdO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmVzdWx0ID0gY3VzdG9tTWF0ZXJpYWw7XG5cblx0XHR9XG5cblx0XHRpZiAoIF9yZW5kZXJlci5sb2NhbENsaXBwaW5nRW5hYmxlZCAmJlxuXHRcdFx0XHRtYXRlcmlhbC5jbGlwU2hhZG93cyA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRtYXRlcmlhbC5jbGlwcGluZ1BsYW5lcy5sZW5ndGggIT09IDAgKSB7XG5cblx0XHRcdC8vIGluIHRoaXMgY2FzZSB3ZSBuZWVkIGEgdW5pcXVlIG1hdGVyaWFsIGluc3RhbmNlIHJlZmxlY3RpbmcgdGhlXG5cdFx0XHQvLyBhcHByb3ByaWF0ZSBzdGF0ZVxuXG5cdFx0XHR2YXIga2V5QSA9IHJlc3VsdC51dWlkLCBrZXlCID0gbWF0ZXJpYWwudXVpZDtcblxuXHRcdFx0dmFyIG1hdGVyaWFsc0ZvclZhcmlhbnQgPSBfbWF0ZXJpYWxDYWNoZVsga2V5QSBdO1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsc0ZvclZhcmlhbnQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtYXRlcmlhbHNGb3JWYXJpYW50ID0ge307XG5cdFx0XHRcdF9tYXRlcmlhbENhY2hlWyBrZXlBIF0gPSBtYXRlcmlhbHNGb3JWYXJpYW50O1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBjYWNoZWRNYXRlcmlhbCA9IG1hdGVyaWFsc0ZvclZhcmlhbnRbIGtleUIgXTtcblxuXHRcdFx0aWYgKCBjYWNoZWRNYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNhY2hlZE1hdGVyaWFsID0gcmVzdWx0LmNsb25lKCk7XG5cdFx0XHRcdG1hdGVyaWFsc0ZvclZhcmlhbnRbIGtleUIgXSA9IGNhY2hlZE1hdGVyaWFsO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJlc3VsdCA9IGNhY2hlZE1hdGVyaWFsO1xuXG5cdFx0fVxuXG5cdFx0cmVzdWx0LnZpc2libGUgPSBtYXRlcmlhbC52aXNpYmxlO1xuXHRcdHJlc3VsdC53aXJlZnJhbWUgPSBtYXRlcmlhbC53aXJlZnJhbWU7XG5cblx0XHRyZXN1bHQuc2lkZSA9ICggbWF0ZXJpYWwuc2hhZG93U2lkZSAhPSBudWxsICkgPyBtYXRlcmlhbC5zaGFkb3dTaWRlIDogc2hhZG93U2lkZVsgbWF0ZXJpYWwuc2lkZSBdO1xuXG5cdFx0cmVzdWx0LmNsaXBTaGFkb3dzID0gbWF0ZXJpYWwuY2xpcFNoYWRvd3M7XG5cdFx0cmVzdWx0LmNsaXBwaW5nUGxhbmVzID0gbWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXM7XG5cdFx0cmVzdWx0LmNsaXBJbnRlcnNlY3Rpb24gPSBtYXRlcmlhbC5jbGlwSW50ZXJzZWN0aW9uO1xuXG5cdFx0cmVzdWx0LndpcmVmcmFtZUxpbmV3aWR0aCA9IG1hdGVyaWFsLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0XHRyZXN1bHQubGluZXdpZHRoID0gbWF0ZXJpYWwubGluZXdpZHRoO1xuXG5cdFx0aWYgKCBpc1BvaW50TGlnaHQgJiYgcmVzdWx0LmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHJlc3VsdC5yZWZlcmVuY2VQb3NpdGlvbi5jb3B5KCBsaWdodFBvc2l0aW9uV29ybGQgKTtcblx0XHRcdHJlc3VsdC5uZWFyRGlzdGFuY2UgPSBzaGFkb3dDYW1lcmFOZWFyO1xuXHRcdFx0cmVzdWx0LmZhckRpc3RhbmNlID0gc2hhZG93Q2FtZXJhRmFyO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVyT2JqZWN0KCBvYmplY3QsIGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBpc1BvaW50TGlnaHQgKSB7XG5cblx0XHRpZiAoIG9iamVjdC52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdHZhciB2aXNpYmxlID0gb2JqZWN0LmxheWVycy50ZXN0KCBjYW1lcmEubGF5ZXJzICk7XG5cblx0XHRpZiAoIHZpc2libGUgJiYgKCBvYmplY3QuaXNNZXNoIHx8IG9iamVjdC5pc0xpbmUgfHwgb2JqZWN0LmlzUG9pbnRzICkgKSB7XG5cblx0XHRcdGlmICggb2JqZWN0LmNhc3RTaGFkb3cgJiYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVkIHx8IF9mcnVzdHVtLmludGVyc2VjdHNPYmplY3QoIG9iamVjdCApICkgKSB7XG5cblx0XHRcdFx0b2JqZWN0Lm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBzaGFkb3dDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLCBvYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR2YXIgZ2VvbWV0cnkgPSBfb2JqZWN0cy51cGRhdGUoIG9iamVjdCApO1xuXHRcdFx0XHR2YXIgbWF0ZXJpYWwgPSBvYmplY3QubWF0ZXJpYWw7XG5cblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApICkge1xuXG5cdFx0XHRcdFx0dmFyIGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcblxuXHRcdFx0XHRcdGZvciAoIHZhciBrID0gMCwga2wgPSBncm91cHMubGVuZ3RoOyBrIDwga2w7IGsgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgayBdO1xuXHRcdFx0XHRcdFx0dmFyIGdyb3VwTWF0ZXJpYWwgPSBtYXRlcmlhbFsgZ3JvdXAubWF0ZXJpYWxJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGdyb3VwTWF0ZXJpYWwgJiYgZ3JvdXBNYXRlcmlhbC52aXNpYmxlICkge1xuXG5cdFx0XHRcdFx0XHRcdHZhciBkZXB0aE1hdGVyaWFsID0gZ2V0RGVwdGhNYXRlcmlhbCggb2JqZWN0LCBncm91cE1hdGVyaWFsLCBpc1BvaW50TGlnaHQsIF9saWdodFBvc2l0aW9uV29ybGQsIHNoYWRvd0NhbWVyYS5uZWFyLCBzaGFkb3dDYW1lcmEuZmFyICk7XG5cdFx0XHRcdFx0XHRcdF9yZW5kZXJlci5yZW5kZXJCdWZmZXJEaXJlY3QoIHNoYWRvd0NhbWVyYSwgbnVsbCwgZ2VvbWV0cnksIGRlcHRoTWF0ZXJpYWwsIG9iamVjdCwgZ3JvdXAgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnZpc2libGUgKSB7XG5cblx0XHRcdFx0XHR2YXIgZGVwdGhNYXRlcmlhbCA9IGdldERlcHRoTWF0ZXJpYWwoIG9iamVjdCwgbWF0ZXJpYWwsIGlzUG9pbnRMaWdodCwgX2xpZ2h0UG9zaXRpb25Xb3JsZCwgc2hhZG93Q2FtZXJhLm5lYXIsIHNoYWRvd0NhbWVyYS5mYXIgKTtcblx0XHRcdFx0XHRfcmVuZGVyZXIucmVuZGVyQnVmZmVyRGlyZWN0KCBzaGFkb3dDYW1lcmEsIG51bGwsIGdlb21ldHJ5LCBkZXB0aE1hdGVyaWFsLCBvYmplY3QsIG51bGwgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHJlbmRlck9iamVjdCggY2hpbGRyZW5bIGkgXSwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGlzUG9pbnRMaWdodCApO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQ2FudmFzVGV4dHVyZSggY2FudmFzLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKSB7XG5cblx0VGV4dHVyZS5jYWxsKCB0aGlzLCBjYW52YXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApO1xuXG5cdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG59XG5cbkNhbnZhc1RleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkNhbnZhc1RleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2FudmFzVGV4dHVyZTtcblxuLyoqXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFNwcml0ZVJlbmRlcmVyKCByZW5kZXJlciwgZ2wsIHN0YXRlLCB0ZXh0dXJlcywgY2FwYWJpbGl0aWVzICkge1xuXG5cdHZhciB2ZXJ0ZXhCdWZmZXIsIGVsZW1lbnRCdWZmZXI7XG5cdHZhciBwcm9ncmFtLCBhdHRyaWJ1dGVzLCB1bmlmb3JtcztcblxuXHR2YXIgdGV4dHVyZTtcblxuXHQvLyBkZWNvbXBvc2UgbWF0cml4V29ybGRcblxuXHR2YXIgc3ByaXRlUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgc3ByaXRlUm90YXRpb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXHR2YXIgc3ByaXRlU2NhbGUgPSBuZXcgVmVjdG9yMygpO1xuXG5cdGZ1bmN0aW9uIGluaXQoKSB7XG5cblx0XHR2YXIgdmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KCBbXG5cdFx0XHQtIDAuNSwgLSAwLjUsIDAsIDAsXG5cdFx0XHQgIDAuNSwgLSAwLjUsIDEsIDAsXG5cdFx0XHQgIDAuNSwgMC41LCAxLCAxLFxuXHRcdFx0LSAwLjUsIDAuNSwgMCwgMVxuXHRcdF0gKTtcblxuXHRcdHZhciBmYWNlcyA9IG5ldyBVaW50MTZBcnJheSggW1xuXHRcdFx0MCwgMSwgMixcblx0XHRcdDAsIDIsIDNcblx0XHRdICk7XG5cblx0XHR2ZXJ0ZXhCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcblx0XHRlbGVtZW50QnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBnbC5BUlJBWV9CVUZGRVIsIHZlcnRleEJ1ZmZlciApO1xuXHRcdGdsLmJ1ZmZlckRhdGEoIGdsLkFSUkFZX0JVRkZFUiwgdmVydGljZXMsIGdsLlNUQVRJQ19EUkFXICk7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZWxlbWVudEJ1ZmZlciApO1xuXHRcdGdsLmJ1ZmZlckRhdGEoIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBmYWNlcywgZ2wuU1RBVElDX0RSQVcgKTtcblxuXHRcdHByb2dyYW0gPSBjcmVhdGVQcm9ncmFtKCk7XG5cblx0XHRhdHRyaWJ1dGVzID0ge1xuXHRcdFx0cG9zaXRpb246IGdsLmdldEF0dHJpYkxvY2F0aW9uKCBwcm9ncmFtLCAncG9zaXRpb24nICksXG5cdFx0XHR1djogZ2wuZ2V0QXR0cmliTG9jYXRpb24oIHByb2dyYW0sICd1dicgKVxuXHRcdH07XG5cblx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdHV2T2Zmc2V0OiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICd1dk9mZnNldCcgKSxcblx0XHRcdHV2U2NhbGU6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ3V2U2NhbGUnICksXG5cblx0XHRcdHJvdGF0aW9uOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdyb3RhdGlvbicgKSxcblx0XHRcdGNlbnRlcjogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnY2VudGVyJyApLFxuXHRcdFx0c2NhbGU6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ3NjYWxlJyApLFxuXG5cdFx0XHRjb2xvcjogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnY29sb3InICksXG5cdFx0XHRtYXA6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ21hcCcgKSxcblx0XHRcdG9wYWNpdHk6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ29wYWNpdHknICksXG5cblx0XHRcdG1vZGVsVmlld01hdHJpeDogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnbW9kZWxWaWV3TWF0cml4JyApLFxuXHRcdFx0cHJvamVjdGlvbk1hdHJpeDogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAncHJvamVjdGlvbk1hdHJpeCcgKSxcblxuXHRcdFx0Zm9nVHlwZTogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nVHlwZScgKSxcblx0XHRcdGZvZ0RlbnNpdHk6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ2ZvZ0RlbnNpdHknICksXG5cdFx0XHRmb2dOZWFyOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdmb2dOZWFyJyApLFxuXHRcdFx0Zm9nRmFyOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdmb2dGYXInICksXG5cdFx0XHRmb2dDb2xvcjogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nQ29sb3InICksXG5cdFx0XHRmb2dEZXB0aDogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nRGVwdGgnICksXG5cblx0XHRcdGFscGhhVGVzdDogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnYWxwaGFUZXN0JyApXG5cdFx0fTtcblxuXHRcdHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKTtcblx0XHRjYW52YXMud2lkdGggPSA4O1xuXHRcdGNhbnZhcy5oZWlnaHQgPSA4O1xuXG5cdFx0dmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCggJzJkJyApO1xuXHRcdGNvbnRleHQuZmlsbFN0eWxlID0gJ3doaXRlJztcblx0XHRjb250ZXh0LmZpbGxSZWN0KCAwLCAwLCA4LCA4ICk7XG5cblx0XHR0ZXh0dXJlID0gbmV3IENhbnZhc1RleHR1cmUoIGNhbnZhcyApO1xuXG5cdH1cblxuXHR0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggc3ByaXRlcywgc2NlbmUsIGNhbWVyYSApIHtcblxuXHRcdGlmICggc3ByaXRlcy5sZW5ndGggPT09IDAgKSByZXR1cm47XG5cblx0XHQvLyBzZXR1cCBnbFxuXG5cdFx0aWYgKCBwcm9ncmFtID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGluaXQoKTtcblxuXHRcdH1cblxuXHRcdHN0YXRlLnVzZVByb2dyYW0oIHByb2dyYW0gKTtcblxuXHRcdHN0YXRlLmluaXRBdHRyaWJ1dGVzKCk7XG5cdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBhdHRyaWJ1dGVzLnBvc2l0aW9uICk7XG5cdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBhdHRyaWJ1dGVzLnV2ICk7XG5cdFx0c3RhdGUuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKTtcblxuXHRcdHN0YXRlLmRpc2FibGUoIGdsLkNVTExfRkFDRSApO1xuXHRcdHN0YXRlLmVuYWJsZSggZ2wuQkxFTkQgKTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLkFSUkFZX0JVRkZFUiwgdmVydGV4QnVmZmVyICk7XG5cdFx0Z2wudmVydGV4QXR0cmliUG9pbnRlciggYXR0cmlidXRlcy5wb3NpdGlvbiwgMiwgZ2wuRkxPQVQsIGZhbHNlLCAyICogOCwgMCApO1xuXHRcdGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoIGF0dHJpYnV0ZXMudXYsIDIsIGdsLkZMT0FULCBmYWxzZSwgMiAqIDgsIDggKTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBlbGVtZW50QnVmZmVyICk7XG5cblx0XHRnbC51bmlmb3JtTWF0cml4NGZ2KCB1bmlmb3Jtcy5wcm9qZWN0aW9uTWF0cml4LCBmYWxzZSwgY2FtZXJhLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMgKTtcblxuXHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIGdsLlRFWFRVUkUwICk7XG5cdFx0Z2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5tYXAsIDAgKTtcblxuXHRcdHZhciBvbGRGb2dUeXBlID0gMDtcblx0XHR2YXIgc2NlbmVGb2dUeXBlID0gMDtcblx0XHR2YXIgZm9nID0gc2NlbmUuZm9nO1xuXG5cdFx0aWYgKCBmb2cgKSB7XG5cblx0XHRcdGdsLnVuaWZvcm0zZiggdW5pZm9ybXMuZm9nQ29sb3IsIGZvZy5jb2xvci5yLCBmb2cuY29sb3IuZywgZm9nLmNvbG9yLmIgKTtcblxuXHRcdFx0aWYgKCBmb2cuaXNGb2cgKSB7XG5cblx0XHRcdFx0Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5mb2dOZWFyLCBmb2cubmVhciApO1xuXHRcdFx0XHRnbC51bmlmb3JtMWYoIHVuaWZvcm1zLmZvZ0ZhciwgZm9nLmZhciApO1xuXG5cdFx0XHRcdGdsLnVuaWZvcm0xaSggdW5pZm9ybXMuZm9nVHlwZSwgMSApO1xuXHRcdFx0XHRvbGRGb2dUeXBlID0gMTtcblx0XHRcdFx0c2NlbmVGb2dUeXBlID0gMTtcblxuXHRcdFx0fSBlbHNlIGlmICggZm9nLmlzRm9nRXhwMiApIHtcblxuXHRcdFx0XHRnbC51bmlmb3JtMWYoIHVuaWZvcm1zLmZvZ0RlbnNpdHksIGZvZy5kZW5zaXR5ICk7XG5cblx0XHRcdFx0Z2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5mb2dUeXBlLCAyICk7XG5cdFx0XHRcdG9sZEZvZ1R5cGUgPSAyO1xuXHRcdFx0XHRzY2VuZUZvZ1R5cGUgPSAyO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRnbC51bmlmb3JtMWkoIHVuaWZvcm1zLmZvZ1R5cGUsIDAgKTtcblx0XHRcdG9sZEZvZ1R5cGUgPSAwO1xuXHRcdFx0c2NlbmVGb2dUeXBlID0gMDtcblxuXHRcdH1cblxuXG5cdFx0Ly8gdXBkYXRlIHBvc2l0aW9ucyBhbmQgc29ydFxuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc3ByaXRlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgc3ByaXRlID0gc3ByaXRlc1sgaSBdO1xuXG5cdFx0XHRzcHJpdGUubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsIHNwcml0ZS5tYXRyaXhXb3JsZCApO1xuXHRcdFx0c3ByaXRlLnogPSAtIHNwcml0ZS5tb2RlbFZpZXdNYXRyaXguZWxlbWVudHNbIDE0IF07XG5cblx0XHR9XG5cblx0XHRzcHJpdGVzLnNvcnQoIHBhaW50ZXJTb3J0U3RhYmxlICk7XG5cblx0XHQvLyByZW5kZXIgYWxsIHNwcml0ZXNcblxuXHRcdHZhciBzY2FsZSA9IFtdO1xuXHRcdHZhciBjZW50ZXIgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHNwcml0ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHNwcml0ZSA9IHNwcml0ZXNbIGkgXTtcblx0XHRcdHZhciBtYXRlcmlhbCA9IHNwcml0ZS5tYXRlcmlhbDtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC52aXNpYmxlID09PSBmYWxzZSApIGNvbnRpbnVlO1xuXG5cdFx0XHRzcHJpdGUub25CZWZvcmVSZW5kZXIoIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhLCB1bmRlZmluZWQsIG1hdGVyaWFsLCB1bmRlZmluZWQgKTtcblxuXHRcdFx0Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5hbHBoYVRlc3QsIG1hdGVyaWFsLmFscGhhVGVzdCApO1xuXHRcdFx0Z2wudW5pZm9ybU1hdHJpeDRmdiggdW5pZm9ybXMubW9kZWxWaWV3TWF0cml4LCBmYWxzZSwgc3ByaXRlLm1vZGVsVmlld01hdHJpeC5lbGVtZW50cyApO1xuXG5cdFx0XHRzcHJpdGUubWF0cml4V29ybGQuZGVjb21wb3NlKCBzcHJpdGVQb3NpdGlvbiwgc3ByaXRlUm90YXRpb24sIHNwcml0ZVNjYWxlICk7XG5cblx0XHRcdHNjYWxlWyAwIF0gPSBzcHJpdGVTY2FsZS54O1xuXHRcdFx0c2NhbGVbIDEgXSA9IHNwcml0ZVNjYWxlLnk7XG5cblx0XHRcdGNlbnRlclsgMCBdID0gc3ByaXRlLmNlbnRlci54IC0gMC41O1xuXHRcdFx0Y2VudGVyWyAxIF0gPSBzcHJpdGUuY2VudGVyLnkgLSAwLjU7XG5cblx0XHRcdHZhciBmb2dUeXBlID0gMDtcblxuXHRcdFx0aWYgKCBzY2VuZS5mb2cgJiYgbWF0ZXJpYWwuZm9nICkge1xuXG5cdFx0XHRcdGZvZ1R5cGUgPSBzY2VuZUZvZ1R5cGU7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBvbGRGb2dUeXBlICE9PSBmb2dUeXBlICkge1xuXG5cdFx0XHRcdGdsLnVuaWZvcm0xaSggdW5pZm9ybXMuZm9nVHlwZSwgZm9nVHlwZSApO1xuXHRcdFx0XHRvbGRGb2dUeXBlID0gZm9nVHlwZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLm1hcCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRnbC51bmlmb3JtMmYoIHVuaWZvcm1zLnV2T2Zmc2V0LCBtYXRlcmlhbC5tYXAub2Zmc2V0LngsIG1hdGVyaWFsLm1hcC5vZmZzZXQueSApO1xuXHRcdFx0XHRnbC51bmlmb3JtMmYoIHVuaWZvcm1zLnV2U2NhbGUsIG1hdGVyaWFsLm1hcC5yZXBlYXQueCwgbWF0ZXJpYWwubWFwLnJlcGVhdC55ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Z2wudW5pZm9ybTJmKCB1bmlmb3Jtcy51dk9mZnNldCwgMCwgMCApO1xuXHRcdFx0XHRnbC51bmlmb3JtMmYoIHVuaWZvcm1zLnV2U2NhbGUsIDEsIDEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnbC51bmlmb3JtMWYoIHVuaWZvcm1zLm9wYWNpdHksIG1hdGVyaWFsLm9wYWNpdHkgKTtcblx0XHRcdGdsLnVuaWZvcm0zZiggdW5pZm9ybXMuY29sb3IsIG1hdGVyaWFsLmNvbG9yLnIsIG1hdGVyaWFsLmNvbG9yLmcsIG1hdGVyaWFsLmNvbG9yLmIgKTtcblxuXHRcdFx0Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5yb3RhdGlvbiwgbWF0ZXJpYWwucm90YXRpb24gKTtcblx0XHRcdGdsLnVuaWZvcm0yZnYoIHVuaWZvcm1zLmNlbnRlciwgY2VudGVyICk7XG5cdFx0XHRnbC51bmlmb3JtMmZ2KCB1bmlmb3Jtcy5zY2FsZSwgc2NhbGUgKTtcblxuXHRcdFx0c3RhdGUuc2V0QmxlbmRpbmcoIG1hdGVyaWFsLmJsZW5kaW5nLCBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uLCBtYXRlcmlhbC5ibGVuZFNyYywgbWF0ZXJpYWwuYmxlbmREc3QsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb25BbHBoYSwgbWF0ZXJpYWwuYmxlbmRTcmNBbHBoYSwgbWF0ZXJpYWwuYmxlbmREc3RBbHBoYSwgbWF0ZXJpYWwucHJlbXVsdGlwbGllZEFscGhhICk7XG5cdFx0XHRzdGF0ZS5idWZmZXJzLmRlcHRoLnNldFRlc3QoIG1hdGVyaWFsLmRlcHRoVGVzdCApO1xuXHRcdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRNYXNrKCBtYXRlcmlhbC5kZXB0aFdyaXRlICk7XG5cdFx0XHRzdGF0ZS5idWZmZXJzLmNvbG9yLnNldE1hc2soIG1hdGVyaWFsLmNvbG9yV3JpdGUgKTtcblxuXHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZTJEKCBtYXRlcmlhbC5tYXAgfHwgdGV4dHVyZSwgMCApO1xuXG5cdFx0XHRnbC5kcmF3RWxlbWVudHMoIGdsLlRSSUFOR0xFUywgNiwgZ2wuVU5TSUdORURfU0hPUlQsIDAgKTtcblxuXHRcdFx0c3ByaXRlLm9uQWZ0ZXJSZW5kZXIoIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhLCB1bmRlZmluZWQsIG1hdGVyaWFsLCB1bmRlZmluZWQgKTtcblxuXHRcdH1cblxuXHRcdC8vIHJlc3RvcmUgZ2xcblxuXHRcdHN0YXRlLmVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cblx0XHRzdGF0ZS5yZXNldCgpO1xuXG5cdH07XG5cblx0ZnVuY3Rpb24gY3JlYXRlUHJvZ3JhbSgpIHtcblxuXHRcdHZhciBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpO1xuXG5cdFx0dmFyIHZlcnRleFNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlciggZ2wuVkVSVEVYX1NIQURFUiApO1xuXHRcdHZhciBmcmFnbWVudFNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlciggZ2wuRlJBR01FTlRfU0hBREVSICk7XG5cblx0XHRnbC5zaGFkZXJTb3VyY2UoIHZlcnRleFNoYWRlciwgW1xuXG5cdFx0XHQncHJlY2lzaW9uICcgKyBjYXBhYmlsaXRpZXMucHJlY2lzaW9uICsgJyBmbG9hdDsnLFxuXG5cdFx0XHQnI2RlZmluZSBTSEFERVJfTkFNRSAnICsgJ1Nwcml0ZU1hdGVyaWFsJyxcblxuXHRcdFx0J3VuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gZmxvYXQgcm90YXRpb247Jyxcblx0XHRcdCd1bmlmb3JtIHZlYzIgY2VudGVyOycsXG5cdFx0XHQndW5pZm9ybSB2ZWMyIHNjYWxlOycsXG5cdFx0XHQndW5pZm9ybSB2ZWMyIHV2T2Zmc2V0OycsXG5cdFx0XHQndW5pZm9ybSB2ZWMyIHV2U2NhbGU7JyxcblxuXHRcdFx0J2F0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uOycsXG5cdFx0XHQnYXR0cmlidXRlIHZlYzIgdXY7JyxcblxuXHRcdFx0J3ZhcnlpbmcgdmVjMiB2VVY7Jyxcblx0XHRcdCd2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoOycsXG5cblx0XHRcdCd2b2lkIG1haW4oKSB7JyxcblxuXHRcdFx0J1x0dlVWID0gdXZPZmZzZXQgKyB1diAqIHV2U2NhbGU7JyxcblxuXHRcdFx0J1x0dmVjMiBhbGlnbmVkUG9zaXRpb24gPSAoIHBvc2l0aW9uIC0gY2VudGVyICkgKiBzY2FsZTsnLFxuXG5cdFx0XHQnXHR2ZWMyIHJvdGF0ZWRQb3NpdGlvbjsnLFxuXHRcdFx0J1x0cm90YXRlZFBvc2l0aW9uLnggPSBjb3MoIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCAtIHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55OycsXG5cdFx0XHQnXHRyb3RhdGVkUG9zaXRpb24ueSA9IHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54ICsgY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7JyxcblxuXHRcdFx0J1x0dmVjNCBtdlBvc2l0aW9uOycsXG5cblx0XHRcdCdcdG12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTsnLFxuXHRcdFx0J1x0bXZQb3NpdGlvbi54eSArPSByb3RhdGVkUG9zaXRpb247JyxcblxuXHRcdFx0J1x0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjsnLFxuXG5cdFx0XHQnXHRmb2dEZXB0aCA9IC0gbXZQb3NpdGlvbi56OycsXG5cblx0XHRcdCd9J1xuXG5cdFx0XS5qb2luKCAnXFxuJyApICk7XG5cblx0XHRnbC5zaGFkZXJTb3VyY2UoIGZyYWdtZW50U2hhZGVyLCBbXG5cblx0XHRcdCdwcmVjaXNpb24gJyArIGNhcGFiaWxpdGllcy5wcmVjaXNpb24gKyAnIGZsb2F0OycsXG5cblx0XHRcdCcjZGVmaW5lIFNIQURFUl9OQU1FICcgKyAnU3ByaXRlTWF0ZXJpYWwnLFxuXG5cdFx0XHQndW5pZm9ybSB2ZWMzIGNvbG9yOycsXG5cdFx0XHQndW5pZm9ybSBzYW1wbGVyMkQgbWFwOycsXG5cdFx0XHQndW5pZm9ybSBmbG9hdCBvcGFjaXR5OycsXG5cblx0XHRcdCd1bmlmb3JtIGludCBmb2dUeXBlOycsXG5cdFx0XHQndW5pZm9ybSB2ZWMzIGZvZ0NvbG9yOycsXG5cdFx0XHQndW5pZm9ybSBmbG9hdCBmb2dEZW5zaXR5OycsXG5cdFx0XHQndW5pZm9ybSBmbG9hdCBmb2dOZWFyOycsXG5cdFx0XHQndW5pZm9ybSBmbG9hdCBmb2dGYXI7Jyxcblx0XHRcdCd1bmlmb3JtIGZsb2F0IGFscGhhVGVzdDsnLFxuXG5cdFx0XHQndmFyeWluZyB2ZWMyIHZVVjsnLFxuXHRcdFx0J3ZhcnlpbmcgZmxvYXQgZm9nRGVwdGg7JyxcblxuXHRcdFx0J3ZvaWQgbWFpbigpIHsnLFxuXG5cdFx0XHQnXHR2ZWM0IHRleHR1cmUgPSB0ZXh0dXJlMkQoIG1hcCwgdlVWICk7JyxcblxuXHRcdFx0J1x0Z2xfRnJhZ0NvbG9yID0gdmVjNCggY29sb3IgKiB0ZXh0dXJlLnh5eiwgdGV4dHVyZS5hICogb3BhY2l0eSApOycsXG5cblx0XHRcdCdcdGlmICggZ2xfRnJhZ0NvbG9yLmEgPCBhbHBoYVRlc3QgKSBkaXNjYXJkOycsXG5cblx0XHRcdCdcdGlmICggZm9nVHlwZSA+IDAgKSB7JyxcblxuXHRcdFx0J1x0XHRmbG9hdCBmb2dGYWN0b3IgPSAwLjA7JyxcblxuXHRcdFx0J1x0XHRpZiAoIGZvZ1R5cGUgPT0gMSApIHsnLFxuXG5cdFx0XHQnXHRcdFx0Zm9nRmFjdG9yID0gc21vb3Roc3RlcCggZm9nTmVhciwgZm9nRmFyLCBmb2dEZXB0aCApOycsXG5cblx0XHRcdCdcdFx0fSBlbHNlIHsnLFxuXG5cdFx0XHQnXHRcdFx0Y29uc3QgZmxvYXQgTE9HMiA9IDEuNDQyNjk1OycsXG5cdFx0XHQnXHRcdFx0Zm9nRmFjdG9yID0gZXhwMiggLSBmb2dEZW5zaXR5ICogZm9nRGVuc2l0eSAqIGZvZ0RlcHRoICogZm9nRGVwdGggKiBMT0cyICk7Jyxcblx0XHRcdCdcdFx0XHRmb2dGYWN0b3IgPSAxLjAgLSBjbGFtcCggZm9nRmFjdG9yLCAwLjAsIDEuMCApOycsXG5cblx0XHRcdCdcdFx0fScsXG5cblx0XHRcdCdcdFx0Z2xfRnJhZ0NvbG9yLnJnYiA9IG1peCggZ2xfRnJhZ0NvbG9yLnJnYiwgZm9nQ29sb3IsIGZvZ0ZhY3RvciApOycsXG5cblx0XHRcdCdcdH0nLFxuXG5cdFx0XHQnfSdcblxuXHRcdF0uam9pbiggJ1xcbicgKSApO1xuXG5cdFx0Z2wuY29tcGlsZVNoYWRlciggdmVydGV4U2hhZGVyICk7XG5cdFx0Z2wuY29tcGlsZVNoYWRlciggZnJhZ21lbnRTaGFkZXIgKTtcblxuXHRcdGdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbSwgdmVydGV4U2hhZGVyICk7XG5cdFx0Z2wuYXR0YWNoU2hhZGVyKCBwcm9ncmFtLCBmcmFnbWVudFNoYWRlciApO1xuXG5cdFx0Z2wubGlua1Byb2dyYW0oIHByb2dyYW0gKTtcblxuXHRcdHJldHVybiBwcm9ncmFtO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwYWludGVyU29ydFN0YWJsZSggYSwgYiApIHtcblxuXHRcdGlmICggYS5yZW5kZXJPcmRlciAhPT0gYi5yZW5kZXJPcmRlciApIHtcblxuXHRcdFx0cmV0dXJuIGEucmVuZGVyT3JkZXIgLSBiLnJlbmRlck9yZGVyO1xuXG5cdFx0fSBlbHNlIGlmICggYS56ICE9PSBiLnogKSB7XG5cblx0XHRcdHJldHVybiBiLnogLSBhLno7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXR1cm4gYi5pZCAtIGEuaWQ7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFN0YXRlKCBnbCwgZXh0ZW5zaW9ucywgdXRpbHMgKSB7XG5cblx0ZnVuY3Rpb24gQ29sb3JCdWZmZXIoKSB7XG5cblx0XHR2YXIgbG9ja2VkID0gZmFsc2U7XG5cblx0XHR2YXIgY29sb3IgPSBuZXcgVmVjdG9yNCgpO1xuXHRcdHZhciBjdXJyZW50Q29sb3JNYXNrID0gbnVsbDtcblx0XHR2YXIgY3VycmVudENvbG9yQ2xlYXIgPSBuZXcgVmVjdG9yNCggMCwgMCwgMCwgMCApO1xuXG5cdFx0cmV0dXJuIHtcblxuXHRcdFx0c2V0TWFzazogZnVuY3Rpb24gKCBjb2xvck1hc2sgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50Q29sb3JNYXNrICE9PSBjb2xvck1hc2sgJiYgISBsb2NrZWQgKSB7XG5cblx0XHRcdFx0XHRnbC5jb2xvck1hc2soIGNvbG9yTWFzaywgY29sb3JNYXNrLCBjb2xvck1hc2ssIGNvbG9yTWFzayApO1xuXHRcdFx0XHRcdGN1cnJlbnRDb2xvck1hc2sgPSBjb2xvck1hc2s7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRMb2NrZWQ6IGZ1bmN0aW9uICggbG9jayApIHtcblxuXHRcdFx0XHRsb2NrZWQgPSBsb2NrO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRDbGVhcjogZnVuY3Rpb24gKCByLCBnLCBiLCBhLCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XG5cblx0XHRcdFx0aWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHRyICo9IGE7IGcgKj0gYTsgYiAqPSBhO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb2xvci5zZXQoIHIsIGcsIGIsIGEgKTtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRDb2xvckNsZWFyLmVxdWFscyggY29sb3IgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0XHRnbC5jbGVhckNvbG9yKCByLCBnLCBiLCBhICk7XG5cdFx0XHRcdFx0Y3VycmVudENvbG9yQ2xlYXIuY29weSggY29sb3IgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHJlc2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0bG9ja2VkID0gZmFsc2U7XG5cblx0XHRcdFx0Y3VycmVudENvbG9yTWFzayA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRDb2xvckNsZWFyLnNldCggLSAxLCAwLCAwLCAwICk7IC8vIHNldCB0byBpbnZhbGlkIHN0YXRlXG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIERlcHRoQnVmZmVyKCkge1xuXG5cdFx0dmFyIGxvY2tlZCA9IGZhbHNlO1xuXG5cdFx0dmFyIGN1cnJlbnREZXB0aE1hc2sgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50RGVwdGhGdW5jID0gbnVsbDtcblx0XHR2YXIgY3VycmVudERlcHRoQ2xlYXIgPSBudWxsO1xuXG5cdFx0cmV0dXJuIHtcblxuXHRcdFx0c2V0VGVzdDogZnVuY3Rpb24gKCBkZXB0aFRlc3QgKSB7XG5cblx0XHRcdFx0aWYgKCBkZXB0aFRlc3QgKSB7XG5cblx0XHRcdFx0XHRlbmFibGUoIGdsLkRFUFRIX1RFU1QgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0ZGlzYWJsZSggZ2wuREVQVEhfVEVTVCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0TWFzazogZnVuY3Rpb24gKCBkZXB0aE1hc2sgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50RGVwdGhNYXNrICE9PSBkZXB0aE1hc2sgJiYgISBsb2NrZWQgKSB7XG5cblx0XHRcdFx0XHRnbC5kZXB0aE1hc2soIGRlcHRoTWFzayApO1xuXHRcdFx0XHRcdGN1cnJlbnREZXB0aE1hc2sgPSBkZXB0aE1hc2s7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRGdW5jOiBmdW5jdGlvbiAoIGRlcHRoRnVuYyApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnREZXB0aEZ1bmMgIT09IGRlcHRoRnVuYyApIHtcblxuXHRcdFx0XHRcdGlmICggZGVwdGhGdW5jICkge1xuXG5cdFx0XHRcdFx0XHRzd2l0Y2ggKCBkZXB0aEZ1bmMgKSB7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBOZXZlckRlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5ORVZFUiApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgQWx3YXlzRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkFMV0FZUyApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgTGVzc0RlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5MRVNTICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBMZXNzRXF1YWxEZXB0aDpcblxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuTEVRVUFMICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBFcXVhbERlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5FUVVBTCApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgR3JlYXRlckVxdWFsRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkdFUVVBTCApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgR3JlYXRlckRlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5HUkVBVEVSICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBOb3RFcXVhbERlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5OT1RFUVVBTCApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkxFUVVBTCApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkxFUVVBTCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y3VycmVudERlcHRoRnVuYyA9IGRlcHRoRnVuYztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldExvY2tlZDogZnVuY3Rpb24gKCBsb2NrICkge1xuXG5cdFx0XHRcdGxvY2tlZCA9IGxvY2s7XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldENsZWFyOiBmdW5jdGlvbiAoIGRlcHRoICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudERlcHRoQ2xlYXIgIT09IGRlcHRoICkge1xuXG5cdFx0XHRcdFx0Z2wuY2xlYXJEZXB0aCggZGVwdGggKTtcblx0XHRcdFx0XHRjdXJyZW50RGVwdGhDbGVhciA9IGRlcHRoO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0cmVzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRsb2NrZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRjdXJyZW50RGVwdGhNYXNrID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudERlcHRoRnVuYyA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnREZXB0aENsZWFyID0gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gU3RlbmNpbEJ1ZmZlcigpIHtcblxuXHRcdHZhciBsb2NrZWQgPSBmYWxzZTtcblxuXHRcdHZhciBjdXJyZW50U3RlbmNpbE1hc2sgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbEZ1bmMgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbFJlZiA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnRTdGVuY2lsRnVuY01hc2sgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbEZhaWwgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbFpGYWlsID0gbnVsbDtcblx0XHR2YXIgY3VycmVudFN0ZW5jaWxaUGFzcyA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnRTdGVuY2lsQ2xlYXIgPSBudWxsO1xuXG5cdFx0cmV0dXJuIHtcblxuXHRcdFx0c2V0VGVzdDogZnVuY3Rpb24gKCBzdGVuY2lsVGVzdCApIHtcblxuXHRcdFx0XHRpZiAoIHN0ZW5jaWxUZXN0ICkge1xuXG5cdFx0XHRcdFx0ZW5hYmxlKCBnbC5TVEVOQ0lMX1RFU1QgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0ZGlzYWJsZSggZ2wuU1RFTkNJTF9URVNUICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRNYXNrOiBmdW5jdGlvbiAoIHN0ZW5jaWxNYXNrICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudFN0ZW5jaWxNYXNrICE9PSBzdGVuY2lsTWFzayAmJiAhIGxvY2tlZCApIHtcblxuXHRcdFx0XHRcdGdsLnN0ZW5jaWxNYXNrKCBzdGVuY2lsTWFzayApO1xuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsTWFzayA9IHN0ZW5jaWxNYXNrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0RnVuYzogZnVuY3Rpb24gKCBzdGVuY2lsRnVuYywgc3RlbmNpbFJlZiwgc3RlbmNpbE1hc2sgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50U3RlbmNpbEZ1bmMgIT09IHN0ZW5jaWxGdW5jIHx8XG5cdFx0XHRcdCAgICAgY3VycmVudFN0ZW5jaWxSZWYgXHQhPT0gc3RlbmNpbFJlZiBcdHx8XG5cdFx0XHRcdCAgICAgY3VycmVudFN0ZW5jaWxGdW5jTWFzayAhPT0gc3RlbmNpbE1hc2sgKSB7XG5cblx0XHRcdFx0XHRnbC5zdGVuY2lsRnVuYyggc3RlbmNpbEZ1bmMsIHN0ZW5jaWxSZWYsIHN0ZW5jaWxNYXNrICk7XG5cblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbEZ1bmMgPSBzdGVuY2lsRnVuYztcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbFJlZiA9IHN0ZW5jaWxSZWY7XG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGdW5jTWFzayA9IHN0ZW5jaWxNYXNrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0T3A6IGZ1bmN0aW9uICggc3RlbmNpbEZhaWwsIHN0ZW5jaWxaRmFpbCwgc3RlbmNpbFpQYXNzICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudFN0ZW5jaWxGYWlsXHQgIT09IHN0ZW5jaWxGYWlsIFx0fHxcblx0XHRcdFx0ICAgICBjdXJyZW50U3RlbmNpbFpGYWlsICE9PSBzdGVuY2lsWkZhaWwgfHxcblx0XHRcdFx0ICAgICBjdXJyZW50U3RlbmNpbFpQYXNzICE9PSBzdGVuY2lsWlBhc3MgKSB7XG5cblx0XHRcdFx0XHRnbC5zdGVuY2lsT3AoIHN0ZW5jaWxGYWlsLCBzdGVuY2lsWkZhaWwsIHN0ZW5jaWxaUGFzcyApO1xuXG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGYWlsID0gc3RlbmNpbEZhaWw7XG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxaRmFpbCA9IHN0ZW5jaWxaRmFpbDtcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbFpQYXNzID0gc3RlbmNpbFpQYXNzO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0TG9ja2VkOiBmdW5jdGlvbiAoIGxvY2sgKSB7XG5cblx0XHRcdFx0bG9ja2VkID0gbG9jaztcblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0Q2xlYXI6IGZ1bmN0aW9uICggc3RlbmNpbCApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRTdGVuY2lsQ2xlYXIgIT09IHN0ZW5jaWwgKSB7XG5cblx0XHRcdFx0XHRnbC5jbGVhclN0ZW5jaWwoIHN0ZW5jaWwgKTtcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbENsZWFyID0gc3RlbmNpbDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHJlc2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0bG9ja2VkID0gZmFsc2U7XG5cblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxNYXNrID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGdW5jID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxSZWYgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50U3RlbmNpbEZ1bmNNYXNrID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGYWlsID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxaRmFpbCA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsWlBhc3MgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50U3RlbmNpbENsZWFyID0gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9XG5cblx0Ly9cblxuXHR2YXIgY29sb3JCdWZmZXIgPSBuZXcgQ29sb3JCdWZmZXIoKTtcblx0dmFyIGRlcHRoQnVmZmVyID0gbmV3IERlcHRoQnVmZmVyKCk7XG5cdHZhciBzdGVuY2lsQnVmZmVyID0gbmV3IFN0ZW5jaWxCdWZmZXIoKTtcblxuXHR2YXIgbWF4VmVydGV4QXR0cmlidXRlcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1ZFUlRFWF9BVFRSSUJTICk7XG5cdHZhciBuZXdBdHRyaWJ1dGVzID0gbmV3IFVpbnQ4QXJyYXkoIG1heFZlcnRleEF0dHJpYnV0ZXMgKTtcblx0dmFyIGVuYWJsZWRBdHRyaWJ1dGVzID0gbmV3IFVpbnQ4QXJyYXkoIG1heFZlcnRleEF0dHJpYnV0ZXMgKTtcblx0dmFyIGF0dHJpYnV0ZURpdmlzb3JzID0gbmV3IFVpbnQ4QXJyYXkoIG1heFZlcnRleEF0dHJpYnV0ZXMgKTtcblxuXHR2YXIgY2FwYWJpbGl0aWVzID0ge307XG5cblx0dmFyIGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9IG51bGw7XG5cblx0dmFyIGN1cnJlbnRQcm9ncmFtID0gbnVsbDtcblxuXHR2YXIgY3VycmVudEJsZW5kaW5nID0gbnVsbDtcblx0dmFyIGN1cnJlbnRCbGVuZEVxdWF0aW9uID0gbnVsbDtcblx0dmFyIGN1cnJlbnRCbGVuZFNyYyA9IG51bGw7XG5cdHZhciBjdXJyZW50QmxlbmREc3QgPSBudWxsO1xuXHR2YXIgY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSA9IG51bGw7XG5cdHZhciBjdXJyZW50QmxlbmRTcmNBbHBoYSA9IG51bGw7XG5cdHZhciBjdXJyZW50QmxlbmREc3RBbHBoYSA9IG51bGw7XG5cdHZhciBjdXJyZW50UHJlbXVsdGlwbGVkQWxwaGEgPSBmYWxzZTtcblxuXHR2YXIgY3VycmVudEZsaXBTaWRlZCA9IG51bGw7XG5cdHZhciBjdXJyZW50Q3VsbEZhY2UgPSBudWxsO1xuXG5cdHZhciBjdXJyZW50TGluZVdpZHRoID0gbnVsbDtcblxuXHR2YXIgY3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgPSBudWxsO1xuXHR2YXIgY3VycmVudFBvbHlnb25PZmZzZXRVbml0cyA9IG51bGw7XG5cblx0dmFyIG1heFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUyApO1xuXG5cdHZhciBsaW5lV2lkdGhBdmFpbGFibGUgPSBmYWxzZTtcblx0dmFyIHZlcnNpb24gPSAwO1xuXHR2YXIgZ2xWZXJzaW9uID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5WRVJTSU9OICk7XG5cblx0aWYgKCBnbFZlcnNpb24uaW5kZXhPZiggJ1dlYkdMJyApICE9PSAtIDEgKSB7XG5cblx0XHR2ZXJzaW9uID0gcGFyc2VGbG9hdCggL15XZWJHTFxcIChbMC05XSkvLmV4ZWMoIGdsVmVyc2lvbiApWyAxIF0gKTtcblx0XHRsaW5lV2lkdGhBdmFpbGFibGUgPSAoIHZlcnNpb24gPj0gMS4wICk7XG5cblx0fSBlbHNlIGlmICggZ2xWZXJzaW9uLmluZGV4T2YoICdPcGVuR0wgRVMnICkgIT09IC0gMSApIHtcblxuXHRcdHZlcnNpb24gPSBwYXJzZUZsb2F0KCAvXk9wZW5HTFxcIEVTXFwgKFswLTldKS8uZXhlYyggZ2xWZXJzaW9uIClbIDEgXSApO1xuXHRcdGxpbmVXaWR0aEF2YWlsYWJsZSA9ICggdmVyc2lvbiA+PSAyLjAgKTtcblxuXHR9XG5cblx0dmFyIGN1cnJlbnRUZXh0dXJlU2xvdCA9IG51bGw7XG5cdHZhciBjdXJyZW50Qm91bmRUZXh0dXJlcyA9IHt9O1xuXG5cdHZhciBjdXJyZW50U2Npc3NvciA9IG5ldyBWZWN0b3I0KCk7XG5cdHZhciBjdXJyZW50Vmlld3BvcnQgPSBuZXcgVmVjdG9yNCgpO1xuXG5cdGZ1bmN0aW9uIGNyZWF0ZVRleHR1cmUoIHR5cGUsIHRhcmdldCwgY291bnQgKSB7XG5cblx0XHR2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KCA0ICk7IC8vIDQgaXMgcmVxdWlyZWQgdG8gbWF0Y2ggZGVmYXVsdCB1bnBhY2sgYWxpZ25tZW50IG9mIDQuXG5cdFx0dmFyIHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG5cblx0XHRnbC5iaW5kVGV4dHVyZSggdHlwZSwgdGV4dHVyZSApO1xuXHRcdGdsLnRleFBhcmFtZXRlcmkoIHR5cGUsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCApO1xuXHRcdGdsLnRleFBhcmFtZXRlcmkoIHR5cGUsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY291bnQ7IGkgKysgKSB7XG5cblx0XHRcdGdsLnRleEltYWdlMkQoIHRhcmdldCArIGksIDAsIGdsLlJHQkEsIDEsIDEsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGRhdGEgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH1cblxuXHR2YXIgZW1wdHlUZXh0dXJlcyA9IHt9O1xuXHRlbXB0eVRleHR1cmVzWyBnbC5URVhUVVJFXzJEIF0gPSBjcmVhdGVUZXh0dXJlKCBnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFXzJELCAxICk7XG5cdGVtcHR5VGV4dHVyZXNbIGdsLlRFWFRVUkVfQ1VCRV9NQVAgXSA9IGNyZWF0ZVRleHR1cmUoIGdsLlRFWFRVUkVfQ1VCRV9NQVAsIGdsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCwgNiApO1xuXG5cdC8vIGluaXRcblxuXHRjb2xvckJ1ZmZlci5zZXRDbGVhciggMCwgMCwgMCwgMSApO1xuXHRkZXB0aEJ1ZmZlci5zZXRDbGVhciggMSApO1xuXHRzdGVuY2lsQnVmZmVyLnNldENsZWFyKCAwICk7XG5cblx0ZW5hYmxlKCBnbC5ERVBUSF9URVNUICk7XG5cdGRlcHRoQnVmZmVyLnNldEZ1bmMoIExlc3NFcXVhbERlcHRoICk7XG5cblx0c2V0RmxpcFNpZGVkKCBmYWxzZSApO1xuXHRzZXRDdWxsRmFjZSggQ3VsbEZhY2VCYWNrICk7XG5cdGVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cblx0ZW5hYmxlKCBnbC5CTEVORCApO1xuXHRzZXRCbGVuZGluZyggTm9ybWFsQmxlbmRpbmcgKTtcblxuXHQvL1xuXG5cdGZ1bmN0aW9uIGluaXRBdHRyaWJ1dGVzKCkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbmV3QXR0cmlidXRlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRuZXdBdHRyaWJ1dGVzWyBpIF0gPSAwO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBlbmFibGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcblxuXHRcdG5ld0F0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID0gMTtcblxuXHRcdGlmICggZW5hYmxlZEF0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID09PSAwICkge1xuXG5cdFx0XHRnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSggYXR0cmlidXRlICk7XG5cdFx0XHRlbmFibGVkQXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPSAxO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBhdHRyaWJ1dGVEaXZpc29yc1sgYXR0cmlidXRlIF0gIT09IDAgKSB7XG5cblx0XHRcdHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cblx0XHRcdGV4dGVuc2lvbi52ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUoIGF0dHJpYnV0ZSwgMCApO1xuXHRcdFx0YXR0cmlidXRlRGl2aXNvcnNbIGF0dHJpYnV0ZSBdID0gMDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciggYXR0cmlidXRlLCBtZXNoUGVyQXR0cmlidXRlICkge1xuXG5cdFx0bmV3QXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPSAxO1xuXG5cdFx0aWYgKCBlbmFibGVkQXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPT09IDAgKSB7XG5cblx0XHRcdGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KCBhdHRyaWJ1dGUgKTtcblx0XHRcdGVuYWJsZWRBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9IDE7XG5cblx0XHR9XG5cblx0XHRpZiAoIGF0dHJpYnV0ZURpdmlzb3JzWyBhdHRyaWJ1dGUgXSAhPT0gbWVzaFBlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcblxuXHRcdFx0ZXh0ZW5zaW9uLnZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRSggYXR0cmlidXRlLCBtZXNoUGVyQXR0cmlidXRlICk7XG5cdFx0XHRhdHRyaWJ1dGVEaXZpc29yc1sgYXR0cmlidXRlIF0gPSBtZXNoUGVyQXR0cmlidXRlO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNhYmxlVW51c2VkQXR0cmlidXRlcygpIHtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGVuYWJsZWRBdHRyaWJ1dGVzLmxlbmd0aDsgaSAhPT0gbDsgKysgaSApIHtcblxuXHRcdFx0aWYgKCBlbmFibGVkQXR0cmlidXRlc1sgaSBdICE9PSBuZXdBdHRyaWJ1dGVzWyBpIF0gKSB7XG5cblx0XHRcdFx0Z2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KCBpICk7XG5cdFx0XHRcdGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGVuYWJsZSggaWQgKSB7XG5cblx0XHRpZiAoIGNhcGFiaWxpdGllc1sgaWQgXSAhPT0gdHJ1ZSApIHtcblxuXHRcdFx0Z2wuZW5hYmxlKCBpZCApO1xuXHRcdFx0Y2FwYWJpbGl0aWVzWyBpZCBdID0gdHJ1ZTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZGlzYWJsZSggaWQgKSB7XG5cblx0XHRpZiAoIGNhcGFiaWxpdGllc1sgaWQgXSAhPT0gZmFsc2UgKSB7XG5cblx0XHRcdGdsLmRpc2FibGUoIGlkICk7XG5cdFx0XHRjYXBhYmlsaXRpZXNbIGlkIF0gPSBmYWxzZTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkge1xuXG5cdFx0aWYgKCBjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMgPT09IG51bGwgKSB7XG5cblx0XHRcdGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9IFtdO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApIHx8XG5cdFx0XHQgICAgIGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICkgfHxcblx0XHRcdCAgICAgZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMScgKSB8fFxuXHRcdFx0ICAgICBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9hc3RjJyApICkge1xuXG5cdFx0XHRcdHZhciBmb3JtYXRzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyApO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGZvcm1hdHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0Y29tcHJlc3NlZFRleHR1cmVGb3JtYXRzLnB1c2goIGZvcm1hdHNbIGkgXSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cztcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXNlUHJvZ3JhbSggcHJvZ3JhbSApIHtcblxuXHRcdGlmICggY3VycmVudFByb2dyYW0gIT09IHByb2dyYW0gKSB7XG5cblx0XHRcdGdsLnVzZVByb2dyYW0oIHByb2dyYW0gKTtcblxuXHRcdFx0Y3VycmVudFByb2dyYW0gPSBwcm9ncmFtO1xuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0QmxlbmRpbmcoIGJsZW5kaW5nLCBibGVuZEVxdWF0aW9uLCBibGVuZFNyYywgYmxlbmREc3QsIGJsZW5kRXF1YXRpb25BbHBoYSwgYmxlbmRTcmNBbHBoYSwgYmxlbmREc3RBbHBoYSwgcHJlbXVsdGlwbGllZEFscGhhICkge1xuXG5cdFx0aWYgKCBibGVuZGluZyAhPT0gTm9CbGVuZGluZyApIHtcblxuXHRcdFx0ZW5hYmxlKCBnbC5CTEVORCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGlzYWJsZSggZ2wuQkxFTkQgKTtcblxuXHRcdH1cblxuXHRcdGlmICggYmxlbmRpbmcgIT09IEN1c3RvbUJsZW5kaW5nICkge1xuXG5cdFx0XHRpZiAoIGJsZW5kaW5nICE9PSBjdXJyZW50QmxlbmRpbmcgfHwgcHJlbXVsdGlwbGllZEFscGhhICE9PSBjdXJyZW50UHJlbXVsdGlwbGVkQWxwaGEgKSB7XG5cblx0XHRcdFx0c3dpdGNoICggYmxlbmRpbmcgKSB7XG5cblx0XHRcdFx0XHRjYXNlIEFkZGl0aXZlQmxlbmRpbmc6XG5cblx0XHRcdFx0XHRcdGlmICggcHJlbXVsdGlwbGllZEFscGhhICkge1xuXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb25TZXBhcmF0ZSggZ2wuRlVOQ19BREQsIGdsLkZVTkNfQUREICk7XG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBnbC5PTkUsIGdsLk9ORSwgZ2wuT05FLCBnbC5PTkUgKTtcblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uKCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmMoIGdsLlNSQ19BTFBIQSwgZ2wuT05FICk7XG5cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSBTdWJ0cmFjdGl2ZUJsZW5kaW5nOlxuXG5cdFx0XHRcdFx0XHRpZiAoIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuWkVSTywgZ2wuWkVSTywgZ2wuT05FX01JTlVTX1NSQ19DT0xPUiwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSApO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb24oIGdsLkZVTkNfQUREICk7XG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuYyggZ2wuWkVSTywgZ2wuT05FX01JTlVTX1NSQ19DT0xPUiApO1xuXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgTXVsdGlwbHlCbGVuZGluZzpcblxuXHRcdFx0XHRcdFx0aWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XG5cblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBnbC5GVU5DX0FERCwgZ2wuRlVOQ19BREQgKTtcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLlpFUk8sIGdsLlNSQ19DT0xPUiwgZ2wuWkVSTywgZ2wuU1JDX0FMUEhBICk7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvbiggZ2wuRlVOQ19BREQgKTtcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jKCBnbC5aRVJPLCBnbC5TUkNfQ09MT1IgKTtcblxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdFx0XHRpZiAoIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLCBnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEgKTtcblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuU1JDX0FMUEhBLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLCBnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbiA9IG51bGw7XG5cdFx0XHRjdXJyZW50QmxlbmRTcmMgPSBudWxsO1xuXHRcdFx0Y3VycmVudEJsZW5kRHN0ID0gbnVsbDtcblx0XHRcdGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBudWxsO1xuXHRcdFx0Y3VycmVudEJsZW5kU3JjQWxwaGEgPSBudWxsO1xuXHRcdFx0Y3VycmVudEJsZW5kRHN0QWxwaGEgPSBudWxsO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0YmxlbmRFcXVhdGlvbkFscGhhID0gYmxlbmRFcXVhdGlvbkFscGhhIHx8IGJsZW5kRXF1YXRpb247XG5cdFx0XHRibGVuZFNyY0FscGhhID0gYmxlbmRTcmNBbHBoYSB8fCBibGVuZFNyYztcblx0XHRcdGJsZW5kRHN0QWxwaGEgPSBibGVuZERzdEFscGhhIHx8IGJsZW5kRHN0O1xuXG5cdFx0XHRpZiAoIGJsZW5kRXF1YXRpb24gIT09IGN1cnJlbnRCbGVuZEVxdWF0aW9uIHx8IGJsZW5kRXF1YXRpb25BbHBoYSAhPT0gY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSApIHtcblxuXHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIHV0aWxzLmNvbnZlcnQoIGJsZW5kRXF1YXRpb24gKSwgdXRpbHMuY29udmVydCggYmxlbmRFcXVhdGlvbkFscGhhICkgKTtcblxuXHRcdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbiA9IGJsZW5kRXF1YXRpb247XG5cdFx0XHRcdGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBibGVuZEVxdWF0aW9uQWxwaGE7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBibGVuZFNyYyAhPT0gY3VycmVudEJsZW5kU3JjIHx8IGJsZW5kRHN0ICE9PSBjdXJyZW50QmxlbmREc3QgfHwgYmxlbmRTcmNBbHBoYSAhPT0gY3VycmVudEJsZW5kU3JjQWxwaGEgfHwgYmxlbmREc3RBbHBoYSAhPT0gY3VycmVudEJsZW5kRHN0QWxwaGEgKSB7XG5cblx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIHV0aWxzLmNvbnZlcnQoIGJsZW5kU3JjICksIHV0aWxzLmNvbnZlcnQoIGJsZW5kRHN0ICksIHV0aWxzLmNvbnZlcnQoIGJsZW5kU3JjQWxwaGEgKSwgdXRpbHMuY29udmVydCggYmxlbmREc3RBbHBoYSApICk7XG5cblx0XHRcdFx0Y3VycmVudEJsZW5kU3JjID0gYmxlbmRTcmM7XG5cdFx0XHRcdGN1cnJlbnRCbGVuZERzdCA9IGJsZW5kRHN0O1xuXHRcdFx0XHRjdXJyZW50QmxlbmRTcmNBbHBoYSA9IGJsZW5kU3JjQWxwaGE7XG5cdFx0XHRcdGN1cnJlbnRCbGVuZERzdEFscGhhID0gYmxlbmREc3RBbHBoYTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Y3VycmVudEJsZW5kaW5nID0gYmxlbmRpbmc7XG5cdFx0Y3VycmVudFByZW11bHRpcGxlZEFscGhhID0gcHJlbXVsdGlwbGllZEFscGhhO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRNYXRlcmlhbCggbWF0ZXJpYWwsIGZyb250RmFjZUNXICkge1xuXG5cdFx0bWF0ZXJpYWwuc2lkZSA9PT0gRG91YmxlU2lkZVxuXHRcdFx0PyBkaXNhYmxlKCBnbC5DVUxMX0ZBQ0UgKVxuXHRcdFx0OiBlbmFibGUoIGdsLkNVTExfRkFDRSApO1xuXG5cdFx0dmFyIGZsaXBTaWRlZCA9ICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKTtcblx0XHRpZiAoIGZyb250RmFjZUNXICkgZmxpcFNpZGVkID0gISBmbGlwU2lkZWQ7XG5cblx0XHRzZXRGbGlwU2lkZWQoIGZsaXBTaWRlZCApO1xuXG5cdFx0bWF0ZXJpYWwudHJhbnNwYXJlbnQgPT09IHRydWVcblx0XHRcdD8gc2V0QmxlbmRpbmcoIG1hdGVyaWFsLmJsZW5kaW5nLCBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uLCBtYXRlcmlhbC5ibGVuZFNyYywgbWF0ZXJpYWwuYmxlbmREc3QsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb25BbHBoYSwgbWF0ZXJpYWwuYmxlbmRTcmNBbHBoYSwgbWF0ZXJpYWwuYmxlbmREc3RBbHBoYSwgbWF0ZXJpYWwucHJlbXVsdGlwbGllZEFscGhhIClcblx0XHRcdDogc2V0QmxlbmRpbmcoIE5vQmxlbmRpbmcgKTtcblxuXHRcdGRlcHRoQnVmZmVyLnNldEZ1bmMoIG1hdGVyaWFsLmRlcHRoRnVuYyApO1xuXHRcdGRlcHRoQnVmZmVyLnNldFRlc3QoIG1hdGVyaWFsLmRlcHRoVGVzdCApO1xuXHRcdGRlcHRoQnVmZmVyLnNldE1hc2soIG1hdGVyaWFsLmRlcHRoV3JpdGUgKTtcblx0XHRjb2xvckJ1ZmZlci5zZXRNYXNrKCBtYXRlcmlhbC5jb2xvcldyaXRlICk7XG5cblx0XHRzZXRQb2x5Z29uT2Zmc2V0KCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0LCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0RmFjdG9yLCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0VW5pdHMgKTtcblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBzZXRGbGlwU2lkZWQoIGZsaXBTaWRlZCApIHtcblxuXHRcdGlmICggY3VycmVudEZsaXBTaWRlZCAhPT0gZmxpcFNpZGVkICkge1xuXG5cdFx0XHRpZiAoIGZsaXBTaWRlZCApIHtcblxuXHRcdFx0XHRnbC5mcm9udEZhY2UoIGdsLkNXICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Z2wuZnJvbnRGYWNlKCBnbC5DQ1cgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50RmxpcFNpZGVkID0gZmxpcFNpZGVkO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRDdWxsRmFjZSggY3VsbEZhY2UgKSB7XG5cblx0XHRpZiAoIGN1bGxGYWNlICE9PSBDdWxsRmFjZU5vbmUgKSB7XG5cblx0XHRcdGVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cblx0XHRcdGlmICggY3VsbEZhY2UgIT09IGN1cnJlbnRDdWxsRmFjZSApIHtcblxuXHRcdFx0XHRpZiAoIGN1bGxGYWNlID09PSBDdWxsRmFjZUJhY2sgKSB7XG5cblx0XHRcdFx0XHRnbC5jdWxsRmFjZSggZ2wuQkFDSyApO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGN1bGxGYWNlID09PSBDdWxsRmFjZUZyb250ICkge1xuXG5cdFx0XHRcdFx0Z2wuY3VsbEZhY2UoIGdsLkZST05UICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGdsLmN1bGxGYWNlKCBnbC5GUk9OVF9BTkRfQkFDSyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGlzYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cblx0XHR9XG5cblx0XHRjdXJyZW50Q3VsbEZhY2UgPSBjdWxsRmFjZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0TGluZVdpZHRoKCB3aWR0aCApIHtcblxuXHRcdGlmICggd2lkdGggIT09IGN1cnJlbnRMaW5lV2lkdGggKSB7XG5cblx0XHRcdGlmICggbGluZVdpZHRoQXZhaWxhYmxlICkgZ2wubGluZVdpZHRoKCB3aWR0aCApO1xuXG5cdFx0XHRjdXJyZW50TGluZVdpZHRoID0gd2lkdGg7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFBvbHlnb25PZmZzZXQoIHBvbHlnb25PZmZzZXQsIGZhY3RvciwgdW5pdHMgKSB7XG5cblx0XHRpZiAoIHBvbHlnb25PZmZzZXQgKSB7XG5cblx0XHRcdGVuYWJsZSggZ2wuUE9MWUdPTl9PRkZTRVRfRklMTCApO1xuXG5cdFx0XHRpZiAoIGN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yICE9PSBmYWN0b3IgfHwgY3VycmVudFBvbHlnb25PZmZzZXRVbml0cyAhPT0gdW5pdHMgKSB7XG5cblx0XHRcdFx0Z2wucG9seWdvbk9mZnNldCggZmFjdG9yLCB1bml0cyApO1xuXG5cdFx0XHRcdGN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yID0gZmFjdG9yO1xuXHRcdFx0XHRjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzID0gdW5pdHM7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGRpc2FibGUoIGdsLlBPTFlHT05fT0ZGU0VUX0ZJTEwgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0U2Npc3NvclRlc3QoIHNjaXNzb3JUZXN0ICkge1xuXG5cdFx0aWYgKCBzY2lzc29yVGVzdCApIHtcblxuXHRcdFx0ZW5hYmxlKCBnbC5TQ0lTU09SX1RFU1QgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGRpc2FibGUoIGdsLlNDSVNTT1JfVEVTVCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyB0ZXh0dXJlXG5cblx0ZnVuY3Rpb24gYWN0aXZlVGV4dHVyZSggd2ViZ2xTbG90ICkge1xuXG5cdFx0aWYgKCB3ZWJnbFNsb3QgPT09IHVuZGVmaW5lZCApIHdlYmdsU2xvdCA9IGdsLlRFWFRVUkUwICsgbWF4VGV4dHVyZXMgLSAxO1xuXG5cdFx0aWYgKCBjdXJyZW50VGV4dHVyZVNsb3QgIT09IHdlYmdsU2xvdCApIHtcblxuXHRcdFx0Z2wuYWN0aXZlVGV4dHVyZSggd2ViZ2xTbG90ICk7XG5cdFx0XHRjdXJyZW50VGV4dHVyZVNsb3QgPSB3ZWJnbFNsb3Q7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGJpbmRUZXh0dXJlKCB3ZWJnbFR5cGUsIHdlYmdsVGV4dHVyZSApIHtcblxuXHRcdGlmICggY3VycmVudFRleHR1cmVTbG90ID09PSBudWxsICkge1xuXG5cdFx0XHRhY3RpdmVUZXh0dXJlKCk7XG5cblx0XHR9XG5cblx0XHR2YXIgYm91bmRUZXh0dXJlID0gY3VycmVudEJvdW5kVGV4dHVyZXNbIGN1cnJlbnRUZXh0dXJlU2xvdCBdO1xuXG5cdFx0aWYgKCBib3VuZFRleHR1cmUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ym91bmRUZXh0dXJlID0geyB0eXBlOiB1bmRlZmluZWQsIHRleHR1cmU6IHVuZGVmaW5lZCB9O1xuXHRcdFx0Y3VycmVudEJvdW5kVGV4dHVyZXNbIGN1cnJlbnRUZXh0dXJlU2xvdCBdID0gYm91bmRUZXh0dXJlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBib3VuZFRleHR1cmUudHlwZSAhPT0gd2ViZ2xUeXBlIHx8IGJvdW5kVGV4dHVyZS50ZXh0dXJlICE9PSB3ZWJnbFRleHR1cmUgKSB7XG5cblx0XHRcdGdsLmJpbmRUZXh0dXJlKCB3ZWJnbFR5cGUsIHdlYmdsVGV4dHVyZSB8fCBlbXB0eVRleHR1cmVzWyB3ZWJnbFR5cGUgXSApO1xuXG5cdFx0XHRib3VuZFRleHR1cmUudHlwZSA9IHdlYmdsVHlwZTtcblx0XHRcdGJvdW5kVGV4dHVyZS50ZXh0dXJlID0gd2ViZ2xUZXh0dXJlO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBjb21wcmVzc2VkVGV4SW1hZ2UyRCgpIHtcblxuXHRcdHRyeSB7XG5cblx0XHRcdGdsLmNvbXByZXNzZWRUZXhJbWFnZTJELmFwcGx5KCBnbCwgYXJndW1lbnRzICk7XG5cblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHRleEltYWdlMkQoKSB7XG5cblx0XHR0cnkge1xuXG5cdFx0XHRnbC50ZXhJbWFnZTJELmFwcGx5KCBnbCwgYXJndW1lbnRzICk7XG5cblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vXG5cblx0ZnVuY3Rpb24gc2Npc3Nvciggc2Npc3NvciApIHtcblxuXHRcdGlmICggY3VycmVudFNjaXNzb3IuZXF1YWxzKCBzY2lzc29yICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRnbC5zY2lzc29yKCBzY2lzc29yLngsIHNjaXNzb3IueSwgc2Npc3Nvci56LCBzY2lzc29yLncgKTtcblx0XHRcdGN1cnJlbnRTY2lzc29yLmNvcHkoIHNjaXNzb3IgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdmlld3BvcnQoIHZpZXdwb3J0ICkge1xuXG5cdFx0aWYgKCBjdXJyZW50Vmlld3BvcnQuZXF1YWxzKCB2aWV3cG9ydCApID09PSBmYWxzZSApIHtcblxuXHRcdFx0Z2wudmlld3BvcnQoIHZpZXdwb3J0LngsIHZpZXdwb3J0LnksIHZpZXdwb3J0LnosIHZpZXdwb3J0LncgKTtcblx0XHRcdGN1cnJlbnRWaWV3cG9ydC5jb3B5KCB2aWV3cG9ydCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIHJlc2V0KCkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZW5hYmxlZEF0dHJpYnV0ZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRpZiAoIGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPT09IDEgKSB7XG5cblx0XHRcdFx0Z2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KCBpICk7XG5cdFx0XHRcdGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRjYXBhYmlsaXRpZXMgPSB7fTtcblxuXHRcdGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9IG51bGw7XG5cblx0XHRjdXJyZW50VGV4dHVyZVNsb3QgPSBudWxsO1xuXHRcdGN1cnJlbnRCb3VuZFRleHR1cmVzID0ge307XG5cblx0XHRjdXJyZW50UHJvZ3JhbSA9IG51bGw7XG5cblx0XHRjdXJyZW50QmxlbmRpbmcgPSBudWxsO1xuXG5cdFx0Y3VycmVudEZsaXBTaWRlZCA9IG51bGw7XG5cdFx0Y3VycmVudEN1bGxGYWNlID0gbnVsbDtcblxuXHRcdGNvbG9yQnVmZmVyLnJlc2V0KCk7XG5cdFx0ZGVwdGhCdWZmZXIucmVzZXQoKTtcblx0XHRzdGVuY2lsQnVmZmVyLnJlc2V0KCk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRidWZmZXJzOiB7XG5cdFx0XHRjb2xvcjogY29sb3JCdWZmZXIsXG5cdFx0XHRkZXB0aDogZGVwdGhCdWZmZXIsXG5cdFx0XHRzdGVuY2lsOiBzdGVuY2lsQnVmZmVyXG5cdFx0fSxcblxuXHRcdGluaXRBdHRyaWJ1dGVzOiBpbml0QXR0cmlidXRlcyxcblx0XHRlbmFibGVBdHRyaWJ1dGU6IGVuYWJsZUF0dHJpYnV0ZSxcblx0XHRlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yOiBlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yLFxuXHRcdGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzOiBkaXNhYmxlVW51c2VkQXR0cmlidXRlcyxcblx0XHRlbmFibGU6IGVuYWJsZSxcblx0XHRkaXNhYmxlOiBkaXNhYmxlLFxuXHRcdGdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0czogZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzLFxuXG5cdFx0dXNlUHJvZ3JhbTogdXNlUHJvZ3JhbSxcblxuXHRcdHNldEJsZW5kaW5nOiBzZXRCbGVuZGluZyxcblx0XHRzZXRNYXRlcmlhbDogc2V0TWF0ZXJpYWwsXG5cblx0XHRzZXRGbGlwU2lkZWQ6IHNldEZsaXBTaWRlZCxcblx0XHRzZXRDdWxsRmFjZTogc2V0Q3VsbEZhY2UsXG5cblx0XHRzZXRMaW5lV2lkdGg6IHNldExpbmVXaWR0aCxcblx0XHRzZXRQb2x5Z29uT2Zmc2V0OiBzZXRQb2x5Z29uT2Zmc2V0LFxuXG5cdFx0c2V0U2Npc3NvclRlc3Q6IHNldFNjaXNzb3JUZXN0LFxuXG5cdFx0YWN0aXZlVGV4dHVyZTogYWN0aXZlVGV4dHVyZSxcblx0XHRiaW5kVGV4dHVyZTogYmluZFRleHR1cmUsXG5cdFx0Y29tcHJlc3NlZFRleEltYWdlMkQ6IGNvbXByZXNzZWRUZXhJbWFnZTJELFxuXHRcdHRleEltYWdlMkQ6IHRleEltYWdlMkQsXG5cblx0XHRzY2lzc29yOiBzY2lzc29yLFxuXHRcdHZpZXdwb3J0OiB2aWV3cG9ydCxcblxuXHRcdHJlc2V0OiByZXNldFxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMVGV4dHVyZXMoIF9nbCwgZXh0ZW5zaW9ucywgc3RhdGUsIHByb3BlcnRpZXMsIGNhcGFiaWxpdGllcywgdXRpbHMsIGluZm8gKSB7XG5cblx0dmFyIF9pc1dlYkdMMiA9ICggdHlwZW9mIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgIT09ICd1bmRlZmluZWQnICYmIF9nbCBpbnN0YW5jZW9mIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgKTsgLyogZ2xvYmFsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgKi9cblx0dmFyIF92aWRlb1RleHR1cmVzID0ge307XG5cdHZhciBfY2FudmFzO1xuXG5cdC8vXG5cblx0ZnVuY3Rpb24gY2xhbXBUb01heFNpemUoIGltYWdlLCBtYXhTaXplICkge1xuXG5cdFx0aWYgKCBpbWFnZS53aWR0aCA+IG1heFNpemUgfHwgaW1hZ2UuaGVpZ2h0ID4gbWF4U2l6ZSApIHtcblxuXHRcdFx0aWYgKCAnZGF0YScgaW4gaW1hZ2UgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogaW1hZ2UgaW4gRGF0YVRleHR1cmUgaXMgdG9vIGJpZyAoJyArIGltYWdlLndpZHRoICsgJ3gnICsgaW1hZ2UuaGVpZ2h0ICsgJykuJyApO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gV2FybmluZzogU2NhbGluZyB0aHJvdWdoIHRoZSBjYW52YXMgd2lsbCBvbmx5IHdvcmsgd2l0aCBpbWFnZXMgdGhhdCB1c2Vcblx0XHRcdC8vIHByZW11bHRpcGxpZWQgYWxwaGEuXG5cblx0XHRcdHZhciBzY2FsZSA9IG1heFNpemUgLyBNYXRoLm1heCggaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCApO1xuXG5cdFx0XHR2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICk7XG5cdFx0XHRjYW52YXMud2lkdGggPSBNYXRoLmZsb29yKCBpbWFnZS53aWR0aCAqIHNjYWxlICk7XG5cdFx0XHRjYW52YXMuaGVpZ2h0ID0gTWF0aC5mbG9vciggaW1hZ2UuaGVpZ2h0ICogc2NhbGUgKTtcblxuXHRcdFx0dmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCggJzJkJyApO1xuXHRcdFx0Y29udGV4dC5kcmF3SW1hZ2UoIGltYWdlLCAwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCAwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQgKTtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogaW1hZ2UgaXMgdG9vIGJpZyAoJyArIGltYWdlLndpZHRoICsgJ3gnICsgaW1hZ2UuaGVpZ2h0ICsgJykuIFJlc2l6ZWQgdG8gJyArIGNhbnZhcy53aWR0aCArICd4JyArIGNhbnZhcy5oZWlnaHQsIGltYWdlICk7XG5cblx0XHRcdHJldHVybiBjYW52YXM7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gaW1hZ2U7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGlzUG93ZXJPZlR3byggaW1hZ2UgKSB7XG5cblx0XHRyZXR1cm4gX01hdGguaXNQb3dlck9mVHdvKCBpbWFnZS53aWR0aCApICYmIF9NYXRoLmlzUG93ZXJPZlR3byggaW1hZ2UuaGVpZ2h0ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIG1ha2VQb3dlck9mVHdvKCBpbWFnZSApIHtcblxuXHRcdGlmICggaW1hZ2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50IHx8IGltYWdlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgfHwgaW1hZ2UgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCApIHtcblxuXHRcdFx0aWYgKCBfY2FudmFzID09PSB1bmRlZmluZWQgKSBfY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICk7XG5cblx0XHRcdF9jYW52YXMud2lkdGggPSBfTWF0aC5mbG9vclBvd2VyT2ZUd28oIGltYWdlLndpZHRoICk7XG5cdFx0XHRfY2FudmFzLmhlaWdodCA9IF9NYXRoLmZsb29yUG93ZXJPZlR3byggaW1hZ2UuaGVpZ2h0ICk7XG5cblx0XHRcdHZhciBjb250ZXh0ID0gX2NhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7XG5cdFx0XHRjb250ZXh0LmRyYXdJbWFnZSggaW1hZ2UsIDAsIDAsIF9jYW52YXMud2lkdGgsIF9jYW52YXMuaGVpZ2h0ICk7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IGltYWdlIGlzIG5vdCBwb3dlciBvZiB0d28gKCcgKyBpbWFnZS53aWR0aCArICd4JyArIGltYWdlLmhlaWdodCArICcpLiBSZXNpemVkIHRvICcgKyBfY2FudmFzLndpZHRoICsgJ3gnICsgX2NhbnZhcy5oZWlnaHQsIGltYWdlICk7XG5cblx0XHRcdHJldHVybiBfY2FudmFzO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGltYWdlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiB0ZXh0dXJlTmVlZHNQb3dlck9mVHdvKCB0ZXh0dXJlICkge1xuXG5cdFx0cmV0dXJuICggdGV4dHVyZS53cmFwUyAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyB8fCB0ZXh0dXJlLndyYXBUICE9PSBDbGFtcFRvRWRnZVdyYXBwaW5nICkgfHxcblx0XHRcdCggdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhckZpbHRlciApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUsIGlzUG93ZXJPZlR3byApIHtcblxuXHRcdHJldHVybiB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyAmJiBpc1Bvd2VyT2ZUd28gJiZcblx0XHRcdHRleHR1cmUubWluRmlsdGVyICE9PSBOZWFyZXN0RmlsdGVyICYmIHRleHR1cmUubWluRmlsdGVyICE9PSBMaW5lYXJGaWx0ZXI7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlTWlwbWFwKCB0YXJnZXQsIHRleHR1cmUsIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRfZ2wuZ2VuZXJhdGVNaXBtYXAoIHRhcmdldCApO1xuXG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdC8vIE5vdGU6IE1hdGgubG9nKCB4ICkgKiBNYXRoLkxPRzJFIHVzZWQgaW5zdGVhZCBvZiBNYXRoLmxvZzIoIHggKSB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGJ5IElFMTFcblx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gTWF0aC5sb2coIE1hdGgubWF4KCB3aWR0aCwgaGVpZ2h0ICkgKSAqIE1hdGguTE9HMkU7XG5cblx0fVxuXG5cdC8vIEZhbGxiYWNrIGZpbHRlcnMgZm9yIG5vbi1wb3dlci1vZi0yIHRleHR1cmVzXG5cblx0ZnVuY3Rpb24gZmlsdGVyRmFsbGJhY2soIGYgKSB7XG5cblx0XHRpZiAoIGYgPT09IE5lYXJlc3RGaWx0ZXIgfHwgZiA9PT0gTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIgfHwgZiA9PT0gTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciApIHtcblxuXHRcdFx0cmV0dXJuIF9nbC5ORUFSRVNUO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIF9nbC5MSU5FQVI7XG5cblx0fVxuXG5cdC8vXG5cblx0ZnVuY3Rpb24gb25UZXh0dXJlRGlzcG9zZSggZXZlbnQgKSB7XG5cblx0XHR2YXIgdGV4dHVyZSA9IGV2ZW50LnRhcmdldDtcblxuXHRcdHRleHR1cmUucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7XG5cblx0XHRkZWFsbG9jYXRlVGV4dHVyZSggdGV4dHVyZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLmlzVmlkZW9UZXh0dXJlICkge1xuXG5cdFx0XHRkZWxldGUgX3ZpZGVvVGV4dHVyZXNbIHRleHR1cmUuaWQgXTtcblxuXHRcdH1cblxuXHRcdGluZm8ubWVtb3J5LnRleHR1cmVzIC0tO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBvblJlbmRlclRhcmdldERpc3Bvc2UoIGV2ZW50ICkge1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldCA9IGV2ZW50LnRhcmdldDtcblxuXHRcdHJlbmRlclRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uUmVuZGVyVGFyZ2V0RGlzcG9zZSApO1xuXG5cdFx0ZGVhbGxvY2F0ZVJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRpbmZvLm1lbW9yeS50ZXh0dXJlcyAtLTtcblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBkZWFsbG9jYXRlVGV4dHVyZSggdGV4dHVyZSApIHtcblxuXHRcdHZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7XG5cblx0XHRpZiAoIHRleHR1cmUuaW1hZ2UgJiYgdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApIHtcblxuXHRcdFx0Ly8gY3ViZSB0ZXh0dXJlXG5cblx0XHRcdF9nbC5kZWxldGVUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193ZWJnbFRleHR1cmVDdWJlICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyAyRCB0ZXh0dXJlXG5cblx0XHRcdGlmICggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbEluaXQgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdFx0X2dsLmRlbGV0ZVRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cblx0XHR9XG5cblx0XHQvLyByZW1vdmUgYWxsIHdlYmdsIHByb3BlcnRpZXNcblx0XHRwcm9wZXJ0aWVzLnJlbW92ZSggdGV4dHVyZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkZWFsbG9jYXRlUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcblx0XHR2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKTtcblxuXHRcdGlmICggISByZW5kZXJUYXJnZXQgKSByZXR1cm47XG5cblx0XHRpZiAoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdF9nbC5kZWxldGVUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICkge1xuXG5cdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmRpc3Bvc2UoKTtcblxuXHRcdH1cblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdF9nbC5kZWxldGVGcmFtZWJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSApO1xuXHRcdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyICkgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXJbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfZ2wuZGVsZXRlRnJhbWVidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyICk7XG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyICkgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgKTtcblxuXHRcdH1cblxuXHRcdHByb3BlcnRpZXMucmVtb3ZlKCByZW5kZXJUYXJnZXQudGV4dHVyZSApO1xuXHRcdHByb3BlcnRpZXMucmVtb3ZlKCByZW5kZXJUYXJnZXQgKTtcblxuXHR9XG5cblx0Ly9cblxuXG5cblx0ZnVuY3Rpb24gc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSApIHVwZGF0ZVZpZGVvVGV4dHVyZSggdGV4dHVyZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLnZlcnNpb24gPiAwICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uICkge1xuXG5cdFx0XHR2YXIgaW1hZ2UgPSB0ZXh0dXJlLmltYWdlO1xuXG5cdFx0XHRpZiAoIGltYWdlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgaW1hZ2UgaXMgdW5kZWZpbmVkJywgdGV4dHVyZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbWFnZS5jb21wbGV0ZSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgaW1hZ2UgaXMgaW5jb21wbGV0ZScsIHRleHR1cmUgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR1cGxvYWRUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcywgdGV4dHVyZSwgc2xvdCApO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIF9nbC5URVhUVVJFMCArIHNsb3QgKTtcblx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFRleHR1cmVDdWJlKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZS5pbWFnZS5sZW5ndGggPT09IDYgKSB7XG5cblx0XHRcdGlmICggdGV4dHVyZS52ZXJzaW9uID4gMCAmJiB0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gIT09IHRleHR1cmUudmVyc2lvbiApIHtcblxuXHRcdFx0XHRpZiAoICEgdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7XG5cblx0XHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193ZWJnbFRleHR1cmVDdWJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTtcblxuXHRcdFx0XHRcdGluZm8ubWVtb3J5LnRleHR1cmVzICsrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7XG5cdFx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApO1xuXG5cdFx0XHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19GTElQX1lfV0VCR0wsIHRleHR1cmUuZmxpcFkgKTtcblxuXHRcdFx0XHR2YXIgaXNDb21wcmVzc2VkID0gKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNDb21wcmVzc2VkVGV4dHVyZSApO1xuXHRcdFx0XHR2YXIgaXNEYXRhVGV4dHVyZSA9ICggdGV4dHVyZS5pbWFnZVsgMCBdICYmIHRleHR1cmUuaW1hZ2VbIDAgXS5pc0RhdGFUZXh0dXJlICk7XG5cblx0XHRcdFx0dmFyIGN1YmVJbWFnZSA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoICEgaXNDb21wcmVzc2VkICYmICEgaXNEYXRhVGV4dHVyZSApIHtcblxuXHRcdFx0XHRcdFx0Y3ViZUltYWdlWyBpIF0gPSBjbGFtcFRvTWF4U2l6ZSggdGV4dHVyZS5pbWFnZVsgaSBdLCBjYXBhYmlsaXRpZXMubWF4Q3ViZW1hcFNpemUgKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGN1YmVJbWFnZVsgaSBdID0gaXNEYXRhVGV4dHVyZSA/IHRleHR1cmUuaW1hZ2VbIGkgXS5pbWFnZSA6IHRleHR1cmUuaW1hZ2VbIGkgXTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIGltYWdlID0gY3ViZUltYWdlWyAwIF0sXG5cdFx0XHRcdFx0aXNQb3dlck9mVHdvSW1hZ2UgPSBpc1Bvd2VyT2ZUd28oIGltYWdlICksXG5cdFx0XHRcdFx0Z2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCApLFxuXHRcdFx0XHRcdGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApO1xuXG5cdFx0XHRcdHNldFRleHR1cmVQYXJhbWV0ZXJzKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVyZSwgaXNQb3dlck9mVHdvSW1hZ2UgKTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdFx0aWYgKCAhIGlzQ29tcHJlc3NlZCApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBpc0RhdGFUZXh0dXJlICkge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCAwLCBnbEZvcm1hdCwgY3ViZUltYWdlWyBpIF0ud2lkdGgsIGN1YmVJbWFnZVsgaSBdLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgY3ViZUltYWdlWyBpIF0uZGF0YSApO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCAwLCBnbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgY3ViZUltYWdlWyBpIF0gKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0dmFyIG1pcG1hcCwgbWlwbWFwcyA9IGN1YmVJbWFnZVsgaSBdLm1pcG1hcHM7XG5cblx0XHRcdFx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBtaXBtYXBzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdG1pcG1hcCA9IG1pcG1hcHNbIGogXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHRleHR1cmUuZm9ybWF0ICE9PSBSR0JBRm9ybWF0ICYmIHRleHR1cmUuZm9ybWF0ICE9PSBSR0JGb3JtYXQgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoIHN0YXRlLmdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cygpLmluZGV4T2YoIGdsRm9ybWF0ICkgPiAtIDEgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdHN0YXRlLmNvbXByZXNzZWRUZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgaiwgZ2xGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgbWlwbWFwLmRhdGEgKTtcblxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC5zZXRUZXh0dXJlQ3ViZSgpJyApO1xuXG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgaiwgZ2xGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmRhdGEgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCAhIGlzQ29tcHJlc3NlZCApIHtcblxuXHRcdFx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSAwO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gbWlwbWFwcy5sZW5ndGggLSAxO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSwgaXNQb3dlck9mVHdvSW1hZ2UgKSApIHtcblxuXHRcdFx0XHRcdC8vIFdlIGFzc3VtZSBpbWFnZXMgZm9yIGN1YmUgbWFwIGhhdmUgdGhlIHNhbWUgc2l6ZS5cblx0XHRcdFx0XHRnZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHRleHR1cmUsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uID0gdGV4dHVyZS52ZXJzaW9uO1xuXG5cdFx0XHRcdGlmICggdGV4dHVyZS5vblVwZGF0ZSApIHRleHR1cmUub25VcGRhdGUoIHRleHR1cmUgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7XG5cdFx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFRleHR1cmVDdWJlRHluYW1pYyggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIF9nbC5URVhUVVJFMCArIHNsb3QgKTtcblx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX193ZWJnbFRleHR1cmUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0VGV4dHVyZVBhcmFtZXRlcnMoIHRleHR1cmVUeXBlLCB0ZXh0dXJlLCBpc1Bvd2VyT2ZUd29JbWFnZSApIHtcblxuXHRcdHZhciBleHRlbnNpb247XG5cblx0XHRpZiAoIGlzUG93ZXJPZlR3b0ltYWdlICkge1xuXG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfUywgdXRpbHMuY29udmVydCggdGV4dHVyZS53cmFwUyApICk7XG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfVCwgdXRpbHMuY29udmVydCggdGV4dHVyZS53cmFwVCApICk7XG5cblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgdXRpbHMuY29udmVydCggdGV4dHVyZS5tYWdGaWx0ZXIgKSApO1xuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLm1pbkZpbHRlciApICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfUywgX2dsLkNMQU1QX1RPX0VER0UgKTtcblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfV1JBUF9ULCBfZ2wuQ0xBTVBfVE9fRURHRSApO1xuXG5cdFx0XHRpZiAoIHRleHR1cmUud3JhcFMgIT09IENsYW1wVG9FZGdlV3JhcHBpbmcgfHwgdGV4dHVyZS53cmFwVCAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUud3JhcFMgYW5kIFRleHR1cmUud3JhcFQgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5DbGFtcFRvRWRnZVdyYXBwaW5nLicsIHRleHR1cmUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX01BR19GSUxURVIsIGZpbHRlckZhbGxiYWNrKCB0ZXh0dXJlLm1hZ0ZpbHRlciApICk7XG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX01JTl9GSUxURVIsIGZpbHRlckZhbGxiYWNrKCB0ZXh0dXJlLm1pbkZpbHRlciApICk7XG5cblx0XHRcdGlmICggdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhckZpbHRlciApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUubWluRmlsdGVyIHNob3VsZCBiZSBzZXQgdG8gVEhSRUUuTmVhcmVzdEZpbHRlciBvciBUSFJFRS5MaW5lYXJGaWx0ZXIuJywgdGV4dHVyZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKTtcblxuXHRcdGlmICggZXh0ZW5zaW9uICkge1xuXG5cdFx0XHRpZiAoIHRleHR1cmUudHlwZSA9PT0gRmxvYXRUeXBlICYmIGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyJyApID09PSBudWxsICkgcmV0dXJuO1xuXHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgPT09IEhhbGZGbG9hdFR5cGUgJiYgZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhcicgKSA9PT0gbnVsbCApIHJldHVybjtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlLmFuaXNvdHJvcHkgPiAxIHx8IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX19jdXJyZW50QW5pc290cm9weSApIHtcblxuXHRcdFx0XHRfZ2wudGV4UGFyYW1ldGVyZiggdGV4dHVyZVR5cGUsIGV4dGVuc2lvbi5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCwgTWF0aC5taW4oIHRleHR1cmUuYW5pc290cm9weSwgY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKSApICk7XG5cdFx0XHRcdHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX19jdXJyZW50QW5pc290cm9weSA9IHRleHR1cmUuYW5pc290cm9weTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGxvYWRUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcywgdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdGlmICggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbEluaXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbEluaXQgPSB0cnVlO1xuXG5cdFx0XHR0ZXh0dXJlLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApO1xuXG5cdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSA9IF9nbC5jcmVhdGVUZXh0dXJlKCk7XG5cblx0XHRcdGluZm8ubWVtb3J5LnRleHR1cmVzICsrO1xuXG5cdFx0fVxuXG5cdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggX2dsLlRFWFRVUkUwICsgc2xvdCApO1xuXHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblxuXHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19GTElQX1lfV0VCR0wsIHRleHR1cmUuZmxpcFkgKTtcblx0XHRfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIHRleHR1cmUucHJlbXVsdGlwbHlBbHBoYSApO1xuXHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19BTElHTk1FTlQsIHRleHR1cmUudW5wYWNrQWxpZ25tZW50ICk7XG5cblx0XHR2YXIgaW1hZ2UgPSBjbGFtcFRvTWF4U2l6ZSggdGV4dHVyZS5pbWFnZSwgY2FwYWJpbGl0aWVzLm1heFRleHR1cmVTaXplICk7XG5cblx0XHRpZiAoIHRleHR1cmVOZWVkc1Bvd2VyT2ZUd28oIHRleHR1cmUgKSAmJiBpc1Bvd2VyT2ZUd28oIGltYWdlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRpbWFnZSA9IG1ha2VQb3dlck9mVHdvKCBpbWFnZSApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGlzUG93ZXJPZlR3b0ltYWdlID0gaXNQb3dlck9mVHdvKCBpbWFnZSApLFxuXHRcdFx0Z2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCApLFxuXHRcdFx0Z2xUeXBlID0gdXRpbHMuY29udmVydCggdGV4dHVyZS50eXBlICk7XG5cblx0XHRzZXRUZXh0dXJlUGFyYW1ldGVycyggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmUsIGlzUG93ZXJPZlR3b0ltYWdlICk7XG5cblx0XHR2YXIgbWlwbWFwLCBtaXBtYXBzID0gdGV4dHVyZS5taXBtYXBzO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLmlzRGVwdGhUZXh0dXJlICkge1xuXG5cdFx0XHQvLyBwb3B1bGF0ZSBkZXB0aCB0ZXh0dXJlIHdpdGggZHVtbXkgZGF0YVxuXG5cdFx0XHR2YXIgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEhfQ09NUE9ORU5UO1xuXG5cdFx0XHRpZiAoIHRleHR1cmUudHlwZSA9PT0gRmxvYXRUeXBlICkge1xuXG5cdFx0XHRcdGlmICggISBfaXNXZWJHTDIgKSB0aHJvdyBuZXcgRXJyb3IoICdGbG9hdCBEZXB0aCBUZXh0dXJlIG9ubHkgc3VwcG9ydGVkIGluIFdlYkdMMi4wJyApO1xuXHRcdFx0XHRpbnRlcm5hbEZvcm1hdCA9IF9nbC5ERVBUSF9DT01QT05FTlQzMkY7XG5cblx0XHRcdH0gZWxzZSBpZiAoIF9pc1dlYkdMMiApIHtcblxuXHRcdFx0XHQvLyBXZWJHTCAyLjAgcmVxdWlyZXMgc2lnbmVkIGludGVybmFsZm9ybWF0IGZvciBnbFRleEltYWdlMkRcblx0XHRcdFx0aW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEhfQ09NUE9ORU5UMTY7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0ZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhGb3JtYXQgJiYgaW50ZXJuYWxGb3JtYXQgPT09IF9nbC5ERVBUSF9DT01QT05FTlQgKSB7XG5cblx0XHRcdFx0Ly8gVGhlIGVycm9yIElOVkFMSURfT1BFUkFUSU9OIGlzIGdlbmVyYXRlZCBieSB0ZXhJbWFnZTJEIGlmIGZvcm1hdCBhbmQgaW50ZXJuYWxmb3JtYXQgYXJlXG5cdFx0XHRcdC8vIERFUFRIX0NPTVBPTkVOVCBhbmQgdHlwZSBpcyBub3QgVU5TSUdORURfU0hPUlQgb3IgVU5TSUdORURfSU5UXG5cdFx0XHRcdC8vIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9leHRlbnNpb25zL1dFQkdMX2RlcHRoX3RleHR1cmUvKVxuXHRcdFx0XHRpZiAoIHRleHR1cmUudHlwZSAhPT0gVW5zaWduZWRTaG9ydFR5cGUgJiYgdGV4dHVyZS50eXBlICE9PSBVbnNpZ25lZEludFR5cGUgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBVc2UgVW5zaWduZWRTaG9ydFR5cGUgb3IgVW5zaWduZWRJbnRUeXBlIGZvciBEZXB0aEZvcm1hdCBEZXB0aFRleHR1cmUuJyApO1xuXG5cdFx0XHRcdFx0dGV4dHVyZS50eXBlID0gVW5zaWduZWRTaG9ydFR5cGU7XG5cdFx0XHRcdFx0Z2xUeXBlID0gdXRpbHMuY29udmVydCggdGV4dHVyZS50eXBlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIERlcHRoIHN0ZW5jaWwgdGV4dHVyZXMgbmVlZCB0aGUgREVQVEhfU1RFTkNJTCBpbnRlcm5hbCBmb3JtYXRcblx0XHRcdC8vIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9leHRlbnNpb25zL1dFQkdMX2RlcHRoX3RleHR1cmUvKVxuXHRcdFx0aWYgKCB0ZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkge1xuXG5cdFx0XHRcdGludGVybmFsRm9ybWF0ID0gX2dsLkRFUFRIX1NURU5DSUw7XG5cblx0XHRcdFx0Ly8gVGhlIGVycm9yIElOVkFMSURfT1BFUkFUSU9OIGlzIGdlbmVyYXRlZCBieSB0ZXhJbWFnZTJEIGlmIGZvcm1hdCBhbmQgaW50ZXJuYWxmb3JtYXQgYXJlXG5cdFx0XHRcdC8vIERFUFRIX1NURU5DSUwgYW5kIHR5cGUgaXMgbm90IFVOU0lHTkVEX0lOVF8yNF84X1dFQkdMLlxuXHRcdFx0XHQvLyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvZXh0ZW5zaW9ucy9XRUJHTF9kZXB0aF90ZXh0dXJlLylcblx0XHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgIT09IFVuc2lnbmVkSW50MjQ4VHlwZSApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZEludDI0OFR5cGUgZm9yIERlcHRoU3RlbmNpbEZvcm1hdCBEZXB0aFRleHR1cmUuJyApO1xuXG5cdFx0XHRcdFx0dGV4dHVyZS50eXBlID0gVW5zaWduZWRJbnQyNDhUeXBlO1xuXHRcdFx0XHRcdGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgMCwgaW50ZXJuYWxGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG51bGwgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNEYXRhVGV4dHVyZSApIHtcblxuXHRcdFx0Ly8gdXNlIG1hbnVhbGx5IGNyZWF0ZWQgbWlwbWFwcyBpZiBhdmFpbGFibGVcblx0XHRcdC8vIGlmIHRoZXJlIGFyZSBubyBtYW51YWwgbWlwbWFwc1xuXHRcdFx0Ly8gc2V0IDAgbGV2ZWwgbWlwbWFwIGFuZCB0aGVuIHVzZSBHTCB0byBnZW5lcmF0ZSBvdGhlciBtaXBtYXAgbGV2ZWxzXG5cblx0XHRcdGlmICggbWlwbWFwcy5sZW5ndGggPiAwICYmIGlzUG93ZXJPZlR3b0ltYWdlICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBtaXBtYXBzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0bWlwbWFwID0gbWlwbWFwc1sgaSBdO1xuXHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBpLCBnbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuZGF0YSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gbWlwbWFwcy5sZW5ndGggLSAxO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCAwLCBnbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UuZGF0YSApO1xuXHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gMDtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0NvbXByZXNzZWRUZXh0dXJlICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRtaXBtYXAgPSBtaXBtYXBzWyBpIF07XG5cblx0XHRcdFx0aWYgKCB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCQUZvcm1hdCAmJiB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCRm9ybWF0ICkge1xuXG5cdFx0XHRcdFx0aWYgKCBzdGF0ZS5nZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMoKS5pbmRleE9mKCBnbEZvcm1hdCApID4gLSAxICkge1xuXG5cdFx0XHRcdFx0XHRzdGF0ZS5jb21wcmVzc2VkVGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGksIGdsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIG1pcG1hcC5kYXRhICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAudXBsb2FkVGV4dHVyZSgpJyApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgaSwgZ2xGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmRhdGEgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IG1pcG1hcHMubGVuZ3RoIC0gMTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIHJlZ3VsYXIgVGV4dHVyZSAoaW1hZ2UsIHZpZGVvLCBjYW52YXMpXG5cblx0XHRcdC8vIHVzZSBtYW51YWxseSBjcmVhdGVkIG1pcG1hcHMgaWYgYXZhaWxhYmxlXG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgbm8gbWFudWFsIG1pcG1hcHNcblx0XHRcdC8vIHNldCAwIGxldmVsIG1pcG1hcCBhbmQgdGhlbiB1c2UgR0wgdG8gZ2VuZXJhdGUgb3RoZXIgbWlwbWFwIGxldmVsc1xuXG5cdFx0XHRpZiAoIG1pcG1hcHMubGVuZ3RoID4gMCAmJiBpc1Bvd2VyT2ZUd29JbWFnZSApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdG1pcG1hcCA9IG1pcG1hcHNbIGkgXTtcblx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgaSwgZ2xGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gbWlwbWFwcy5sZW5ndGggLSAxO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCAwLCBnbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UgKTtcblx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlLCBpc1Bvd2VyT2ZUd29JbWFnZSApICkge1xuXG5cdFx0XHRnZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmUsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdH1cblxuXHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiA9IHRleHR1cmUudmVyc2lvbjtcblxuXHRcdGlmICggdGV4dHVyZS5vblVwZGF0ZSApIHRleHR1cmUub25VcGRhdGUoIHRleHR1cmUgKTtcblxuXHR9XG5cblx0Ly8gUmVuZGVyIHRhcmdldHNcblxuXHQvLyBTZXR1cCBzdG9yYWdlIGZvciB0YXJnZXQgdGV4dHVyZSBhbmQgYmluZCBpdCB0byBjb3JyZWN0IGZyYW1lYnVmZmVyXG5cdGZ1bmN0aW9uIHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCBmcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0dXJlVGFyZ2V0ICkge1xuXG5cdFx0dmFyIGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggcmVuZGVyVGFyZ2V0LnRleHR1cmUuZm9ybWF0ICk7XG5cdFx0dmFyIGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHJlbmRlclRhcmdldC50ZXh0dXJlLnR5cGUgKTtcblx0XHRzdGF0ZS50ZXhJbWFnZTJEKCB0ZXh0dXJlVGFyZ2V0LCAwLCBnbEZvcm1hdCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBudWxsICk7XG5cdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlciApO1xuXHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBhdHRhY2htZW50LCB0ZXh0dXJlVGFyZ2V0LCBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZSwgMCApO1xuXHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgbnVsbCApO1xuXG5cdH1cblxuXHQvLyBTZXR1cCBzdG9yYWdlIGZvciBpbnRlcm5hbCBkZXB0aC9zdGVuY2lsIGJ1ZmZlcnMgYW5kIGJpbmQgdG8gY29ycmVjdCBmcmFtZWJ1ZmZlclxuXHRmdW5jdGlvbiBzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UoIHJlbmRlcmJ1ZmZlciwgcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0X2dsLmJpbmRSZW5kZXJidWZmZXIoIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgJiYgISByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciApIHtcblxuXHRcdFx0X2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoIF9nbC5SRU5ERVJCVUZGRVIsIF9nbC5ERVBUSF9DT01QT05FTlQxNiwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cdFx0XHRfZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkRFUFRIX0FUVEFDSE1FTlQsIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xuXG5cdFx0fSBlbHNlIGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICYmIHJlbmRlclRhcmdldC5zdGVuY2lsQnVmZmVyICkge1xuXG5cdFx0XHRfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZSggX2dsLlJFTkRFUkJVRkZFUiwgX2dsLkRFUFRIX1NURU5DSUwsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xuXHRcdFx0X2dsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQsIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gRklYTUU6IFdlIGRvbid0IHN1cHBvcnQgIWRlcHRoICFzdGVuY2lsXG5cdFx0XHRfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZSggX2dsLlJFTkRFUkJVRkZFUiwgX2dsLlJHQkE0LCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcblxuXHRcdH1cblxuXHRcdF9nbC5iaW5kUmVuZGVyYnVmZmVyKCBfZ2wuUkVOREVSQlVGRkVSLCBudWxsICk7XG5cblx0fVxuXG5cdC8vIFNldHVwIHJlc291cmNlcyBmb3IgYSBEZXB0aCBUZXh0dXJlIGZvciBhIEZCTyAobmVlZHMgYW4gZXh0ZW5zaW9uKVxuXHRmdW5jdGlvbiBzZXR1cERlcHRoVGV4dHVyZSggZnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCApIHtcblxuXHRcdHZhciBpc0N1YmUgPSAoIHJlbmRlclRhcmdldCAmJiByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgKTtcblx0XHRpZiAoIGlzQ3ViZSApIHRocm93IG5ldyBFcnJvciggJ0RlcHRoIFRleHR1cmUgd2l0aCBjdWJlIHJlbmRlciB0YXJnZXRzIGlzIG5vdCBzdXBwb3J0ZWQnICk7XG5cblx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyICk7XG5cblx0XHRpZiAoICEgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICYmIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaXNEZXB0aFRleHR1cmUgKSApIHtcblxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAncmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFRIUkVFLkRlcHRoVGV4dHVyZScgKTtcblxuXHRcdH1cblxuXHRcdC8vIHVwbG9hZCBhbiBlbXB0eSBkZXB0aCB0ZXh0dXJlIHdpdGggZnJhbWVidWZmZXIgc2l6ZVxuXHRcdGlmICggISBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlIHx8XG5cdFx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGggIT09IHJlbmRlclRhcmdldC53aWR0aCB8fFxuXHRcdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodCAhPT0gcmVuZGVyVGFyZ2V0LmhlaWdodCApIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pbWFnZS53aWR0aCA9IHJlbmRlclRhcmdldC53aWR0aDtcblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gcmVuZGVyVGFyZ2V0LmhlaWdodDtcblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0c2V0VGV4dHVyZTJEKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLCAwICk7XG5cblx0XHR2YXIgd2ViZ2xEZXB0aFRleHR1cmUgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhGb3JtYXQgKSB7XG5cblx0XHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfQVRUQUNITUVOVCwgX2dsLlRFWFRVUkVfMkQsIHdlYmdsRGVwdGhUZXh0dXJlLCAwICk7XG5cblx0XHR9IGVsc2UgaWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkge1xuXG5cdFx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCwgX2dsLlRFWFRVUkVfMkQsIHdlYmdsRGVwdGhUZXh0dXJlLCAwICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdVbmtub3duIGRlcHRoVGV4dHVyZSBmb3JtYXQnICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIFNldHVwIEdMIHJlc291cmNlcyBmb3IgYSBub24tdGV4dHVyZSBkZXB0aCBidWZmZXJcblx0ZnVuY3Rpb24gc2V0dXBEZXB0aFJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR2YXIgaXNDdWJlID0gKCByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgPT09IHRydWUgKTtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApIHtcblxuXHRcdFx0aWYgKCBpc0N1YmUgKSB0aHJvdyBuZXcgRXJyb3IoICd0YXJnZXQuZGVwdGhUZXh0dXJlIG5vdCBzdXBwb3J0ZWQgaW4gQ3ViZSByZW5kZXIgdGFyZ2V0cycgKTtcblxuXHRcdFx0c2V0dXBEZXB0aFRleHR1cmUoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGlmICggaXNDdWJlICkge1xuXG5cdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyID0gW107XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSApO1xuXHRcdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyWyBpIF0gPSBfZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKCk7XG5cdFx0XHRcdFx0c2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlclsgaSBdLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciApO1xuXHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciA9IF9nbC5jcmVhdGVSZW5kZXJidWZmZXIoKTtcblx0XHRcdFx0c2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgbnVsbCApO1xuXG5cdH1cblxuXHQvLyBTZXQgdXAgR0wgcmVzb3VyY2VzIGZvciB0aGUgcmVuZGVyIHRhcmdldFxuXHRmdW5jdGlvbiBzZXR1cFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC50ZXh0dXJlICk7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblJlbmRlclRhcmdldERpc3Bvc2UgKTtcblxuXHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTtcblxuXHRcdGluZm8ubWVtb3J5LnRleHR1cmVzICsrO1xuXG5cdFx0dmFyIGlzQ3ViZSA9ICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlID09PSB0cnVlICk7XG5cdFx0dmFyIGlzVGFyZ2V0UG93ZXJPZlR3byA9IGlzUG93ZXJPZlR3byggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHQvLyBTZXR1cCBmcmFtZWJ1ZmZlclxuXG5cdFx0aWYgKCBpc0N1YmUgKSB7XG5cblx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSA9IF9nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9IF9nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gU2V0dXAgY29sb3IgYnVmZmVyXG5cblx0XHRpZiAoIGlzQ3ViZSApIHtcblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXHRcdFx0c2V0VGV4dHVyZVBhcmFtZXRlcnMoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCByZW5kZXJUYXJnZXQudGV4dHVyZSwgaXNUYXJnZXRQb3dlck9mVHdvICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0c2V0dXBGcmFtZUJ1ZmZlclRleHR1cmUoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0sIHJlbmRlclRhcmdldCwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCByZW5kZXJUYXJnZXQudGV4dHVyZSwgaXNUYXJnZXRQb3dlck9mVHdvICkgKSB7XG5cblx0XHRcdFx0Z2VuZXJhdGVNaXBtYXAoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCByZW5kZXJUYXJnZXQudGV4dHVyZSwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCBudWxsICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cdFx0XHRzZXRUZXh0dXJlUGFyYW1ldGVycyggX2dsLlRFWFRVUkVfMkQsIHJlbmRlclRhcmdldC50ZXh0dXJlLCBpc1RhcmdldFBvd2VyT2ZUd28gKTtcblx0XHRcdHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIF9nbC5URVhUVVJFXzJEICk7XG5cblx0XHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCByZW5kZXJUYXJnZXQudGV4dHVyZSwgaXNUYXJnZXRQb3dlck9mVHdvICkgKSB7XG5cblx0XHRcdFx0Z2VuZXJhdGVNaXBtYXAoIF9nbC5URVhUVVJFXzJELCByZW5kZXJUYXJnZXQudGV4dHVyZSwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFXzJELCBudWxsICk7XG5cblx0XHR9XG5cblx0XHQvLyBTZXR1cCBkZXB0aCBhbmQgc3RlbmNpbCBidWZmZXJzXG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciApIHtcblxuXHRcdFx0c2V0dXBEZXB0aFJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHRleHR1cmUgPSByZW5kZXJUYXJnZXQudGV4dHVyZTtcblx0XHR2YXIgaXNUYXJnZXRQb3dlck9mVHdvID0gaXNQb3dlck9mVHdvKCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlLCBpc1RhcmdldFBvd2VyT2ZUd28gKSApIHtcblxuXHRcdFx0dmFyIHRhcmdldCA9IHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSA/IF9nbC5URVhUVVJFX0NVQkVfTUFQIDogX2dsLlRFWFRVUkVfMkQ7XG5cdFx0XHR2YXIgd2ViZ2xUZXh0dXJlID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZTtcblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIHRhcmdldCwgd2ViZ2xUZXh0dXJlICk7XG5cdFx0XHRnZW5lcmF0ZU1pcG1hcCggdGFyZ2V0LCB0ZXh0dXJlLCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcblx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCB0YXJnZXQsIG51bGwgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlVmlkZW9UZXh0dXJlKCB0ZXh0dXJlICkge1xuXG5cdFx0dmFyIGlkID0gdGV4dHVyZS5pZDtcblx0XHR2YXIgZnJhbWUgPSBpbmZvLnJlbmRlci5mcmFtZTtcblxuXHRcdC8vIENoZWNrIHRoZSBsYXN0IGZyYW1lIHdlIHVwZGF0ZWQgdGhlIFZpZGVvVGV4dHVyZVxuXG5cdFx0aWYgKCBfdmlkZW9UZXh0dXJlc1sgaWQgXSAhPT0gZnJhbWUgKSB7XG5cblx0XHRcdF92aWRlb1RleHR1cmVzWyBpZCBdID0gZnJhbWU7XG5cdFx0XHR0ZXh0dXJlLnVwZGF0ZSgpO1xuXG5cdFx0fVxuXG5cdH1cblxuXHR0aGlzLnNldFRleHR1cmUyRCA9IHNldFRleHR1cmUyRDtcblx0dGhpcy5zZXRUZXh0dXJlQ3ViZSA9IHNldFRleHR1cmVDdWJlO1xuXHR0aGlzLnNldFRleHR1cmVDdWJlRHluYW1pYyA9IHNldFRleHR1cmVDdWJlRHluYW1pYztcblx0dGhpcy5zZXR1cFJlbmRlclRhcmdldCA9IHNldHVwUmVuZGVyVGFyZ2V0O1xuXHR0aGlzLnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCA9IHVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcDtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgdGhlc3BpdGUgLyBodHRwOi8vd3d3LnR3aXR0ZXIuY29tL3RoZXNwaXRlXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xVdGlscyggZ2wsIGV4dGVuc2lvbnMgKSB7XG5cblx0ZnVuY3Rpb24gY29udmVydCggcCApIHtcblxuXHRcdHZhciBleHRlbnNpb247XG5cblx0XHRpZiAoIHAgPT09IFJlcGVhdFdyYXBwaW5nICkgcmV0dXJuIGdsLlJFUEVBVDtcblx0XHRpZiAoIHAgPT09IENsYW1wVG9FZGdlV3JhcHBpbmcgKSByZXR1cm4gZ2wuQ0xBTVBfVE9fRURHRTtcblx0XHRpZiAoIHAgPT09IE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcgKSByZXR1cm4gZ2wuTUlSUk9SRURfUkVQRUFUO1xuXG5cdFx0aWYgKCBwID09PSBOZWFyZXN0RmlsdGVyICkgcmV0dXJuIGdsLk5FQVJFU1Q7XG5cdFx0aWYgKCBwID09PSBOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlciApIHJldHVybiBnbC5ORUFSRVNUX01JUE1BUF9ORUFSRVNUO1xuXHRcdGlmICggcCA9PT0gTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciApIHJldHVybiBnbC5ORUFSRVNUX01JUE1BUF9MSU5FQVI7XG5cblx0XHRpZiAoIHAgPT09IExpbmVhckZpbHRlciApIHJldHVybiBnbC5MSU5FQVI7XG5cdFx0aWYgKCBwID09PSBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyICkgcmV0dXJuIGdsLkxJTkVBUl9NSVBNQVBfTkVBUkVTVDtcblx0XHRpZiAoIHAgPT09IExpbmVhck1pcE1hcExpbmVhckZpbHRlciApIHJldHVybiBnbC5MSU5FQVJfTUlQTUFQX0xJTkVBUjtcblxuXHRcdGlmICggcCA9PT0gVW5zaWduZWRCeXRlVHlwZSApIHJldHVybiBnbC5VTlNJR05FRF9CWVRFO1xuXHRcdGlmICggcCA9PT0gVW5zaWduZWRTaG9ydDQ0NDRUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX1NIT1JUXzRfNF80XzQ7XG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZFNob3J0NTU1MVR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfU0hPUlRfNV81XzVfMTtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnQ1NjVUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX1NIT1JUXzVfNl81O1xuXG5cdFx0aWYgKCBwID09PSBCeXRlVHlwZSApIHJldHVybiBnbC5CWVRFO1xuXHRcdGlmICggcCA9PT0gU2hvcnRUeXBlICkgcmV0dXJuIGdsLlNIT1JUO1xuXHRcdGlmICggcCA9PT0gVW5zaWduZWRTaG9ydFR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfU0hPUlQ7XG5cdFx0aWYgKCBwID09PSBJbnRUeXBlICkgcmV0dXJuIGdsLklOVDtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkSW50VHlwZSApIHJldHVybiBnbC5VTlNJR05FRF9JTlQ7XG5cdFx0aWYgKCBwID09PSBGbG9hdFR5cGUgKSByZXR1cm4gZ2wuRkxPQVQ7XG5cblx0XHRpZiAoIHAgPT09IEhhbGZGbG9hdFR5cGUgKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSByZXR1cm4gZXh0ZW5zaW9uLkhBTEZfRkxPQVRfT0VTO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwID09PSBBbHBoYUZvcm1hdCApIHJldHVybiBnbC5BTFBIQTtcblx0XHRpZiAoIHAgPT09IFJHQkZvcm1hdCApIHJldHVybiBnbC5SR0I7XG5cdFx0aWYgKCBwID09PSBSR0JBRm9ybWF0ICkgcmV0dXJuIGdsLlJHQkE7XG5cdFx0aWYgKCBwID09PSBMdW1pbmFuY2VGb3JtYXQgKSByZXR1cm4gZ2wuTFVNSU5BTkNFO1xuXHRcdGlmICggcCA9PT0gTHVtaW5hbmNlQWxwaGFGb3JtYXQgKSByZXR1cm4gZ2wuTFVNSU5BTkNFX0FMUEhBO1xuXHRcdGlmICggcCA9PT0gRGVwdGhGb3JtYXQgKSByZXR1cm4gZ2wuREVQVEhfQ09NUE9ORU5UO1xuXHRcdGlmICggcCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkgcmV0dXJuIGdsLkRFUFRIX1NURU5DSUw7XG5cblx0XHRpZiAoIHAgPT09IEFkZEVxdWF0aW9uICkgcmV0dXJuIGdsLkZVTkNfQUREO1xuXHRcdGlmICggcCA9PT0gU3VidHJhY3RFcXVhdGlvbiApIHJldHVybiBnbC5GVU5DX1NVQlRSQUNUO1xuXHRcdGlmICggcCA9PT0gUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24gKSByZXR1cm4gZ2wuRlVOQ19SRVZFUlNFX1NVQlRSQUNUO1xuXG5cdFx0aWYgKCBwID09PSBaZXJvRmFjdG9yICkgcmV0dXJuIGdsLlpFUk87XG5cdFx0aWYgKCBwID09PSBPbmVGYWN0b3IgKSByZXR1cm4gZ2wuT05FO1xuXHRcdGlmICggcCA9PT0gU3JjQ29sb3JGYWN0b3IgKSByZXR1cm4gZ2wuU1JDX0NPTE9SO1xuXHRcdGlmICggcCA9PT0gT25lTWludXNTcmNDb2xvckZhY3RvciApIHJldHVybiBnbC5PTkVfTUlOVVNfU1JDX0NPTE9SO1xuXHRcdGlmICggcCA9PT0gU3JjQWxwaGFGYWN0b3IgKSByZXR1cm4gZ2wuU1JDX0FMUEhBO1xuXHRcdGlmICggcCA9PT0gT25lTWludXNTcmNBbHBoYUZhY3RvciApIHJldHVybiBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBO1xuXHRcdGlmICggcCA9PT0gRHN0QWxwaGFGYWN0b3IgKSByZXR1cm4gZ2wuRFNUX0FMUEhBO1xuXHRcdGlmICggcCA9PT0gT25lTWludXNEc3RBbHBoYUZhY3RvciApIHJldHVybiBnbC5PTkVfTUlOVVNfRFNUX0FMUEhBO1xuXG5cdFx0aWYgKCBwID09PSBEc3RDb2xvckZhY3RvciApIHJldHVybiBnbC5EU1RfQ09MT1I7XG5cdFx0aWYgKCBwID09PSBPbmVNaW51c0RzdENvbG9yRmFjdG9yICkgcmV0dXJuIGdsLk9ORV9NSU5VU19EU1RfQ09MT1I7XG5cdFx0aWYgKCBwID09PSBTcmNBbHBoYVNhdHVyYXRlRmFjdG9yICkgcmV0dXJuIGdsLlNSQ19BTFBIQV9TQVRVUkFURTtcblxuXHRcdGlmICggcCA9PT0gUkdCX1MzVENfRFhUMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9TM1RDX0RYVDFfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX1MzVENfRFhUM19Gb3JtYXQgfHwgcCA9PT0gUkdCQV9TM1RDX0RYVDVfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQl9TM1RDX0RYVDFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ7XG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9TM1RDX0RYVDNfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVDtcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0IHx8IHAgPT09IFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdFx0aWYgKCBwID09PSBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRztcblx0XHRcdFx0aWYgKCBwID09PSBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfUFZSVENfMkJQUFYxX0lNRztcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUc7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gUkdCX0VUQzFfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMxJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTDtcblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzR4NF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzV4NF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzV4NV9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFJHQkFfQVNUQ182eDVfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ182eDZfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ184eDVfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX0FTVENfOHg2X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfOHg4X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTB4NV9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFJHQkFfQVNUQ18xMHg2X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTB4OF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzEweDEwX0Zvcm1hdCB8fFxuXHRcdFx0cCA9PT0gUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTJ4MTJfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9hc3RjJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRyZXR1cm4gcDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBwID09PSBNaW5FcXVhdGlvbiB8fCBwID09PSBNYXhFcXVhdGlvbiApIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfYmxlbmRfbWlubWF4JyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRpZiAoIHAgPT09IE1pbkVxdWF0aW9uICkgcmV0dXJuIGV4dGVuc2lvbi5NSU5fRVhUO1xuXHRcdFx0XHRpZiAoIHAgPT09IE1heEVxdWF0aW9uICkgcmV0dXJuIGV4dGVuc2lvbi5NQVhfRVhUO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkSW50MjQ4VHlwZSApIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9kZXB0aF90ZXh0dXJlJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHJldHVybiBleHRlbnNpb24uVU5TSUdORURfSU5UXzI0XzhfV0VCR0w7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gMDtcblxuXHR9XG5cblx0cmV0dXJuIHsgY29udmVydDogY29udmVydCB9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgZ3JlZ2dtYW4gLyBodHRwOi8vZ2FtZXMuZ3JlZ2dtYW4uY29tL1xuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICkge1xuXG5cdENhbWVyYS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BlcnNwZWN0aXZlQ2FtZXJhJztcblxuXHR0aGlzLmZvdiA9IGZvdiAhPT0gdW5kZWZpbmVkID8gZm92IDogNTA7XG5cdHRoaXMuem9vbSA9IDE7XG5cblx0dGhpcy5uZWFyID0gbmVhciAhPT0gdW5kZWZpbmVkID8gbmVhciA6IDAuMTtcblx0dGhpcy5mYXIgPSBmYXIgIT09IHVuZGVmaW5lZCA/IGZhciA6IDIwMDA7XG5cdHRoaXMuZm9jdXMgPSAxMDtcblxuXHR0aGlzLmFzcGVjdCA9IGFzcGVjdCAhPT0gdW5kZWZpbmVkID8gYXNwZWN0IDogMTtcblx0dGhpcy52aWV3ID0gbnVsbDtcblxuXHR0aGlzLmZpbG1HYXVnZSA9IDM1O1x0Ly8gd2lkdGggb2YgdGhlIGZpbG0gKGRlZmF1bHQgaW4gbWlsbGltZXRlcnMpXG5cdHRoaXMuZmlsbU9mZnNldCA9IDA7XHQvLyBob3Jpem9udGFsIGZpbG0gb2Zmc2V0IChzYW1lIHVuaXQgYXMgZ2F1Z2UpXG5cblx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cbn1cblxuUGVyc3BlY3RpdmVDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQ2FtZXJhLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFBlcnNwZWN0aXZlQ2FtZXJhLFxuXG5cdGlzUGVyc3BlY3RpdmVDYW1lcmE6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcblxuXHRcdENhbWVyYS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xuXG5cdFx0dGhpcy5mb3YgPSBzb3VyY2UuZm92O1xuXHRcdHRoaXMuem9vbSA9IHNvdXJjZS56b29tO1xuXG5cdFx0dGhpcy5uZWFyID0gc291cmNlLm5lYXI7XG5cdFx0dGhpcy5mYXIgPSBzb3VyY2UuZmFyO1xuXHRcdHRoaXMuZm9jdXMgPSBzb3VyY2UuZm9jdXM7XG5cblx0XHR0aGlzLmFzcGVjdCA9IHNvdXJjZS5hc3BlY3Q7XG5cdFx0dGhpcy52aWV3ID0gc291cmNlLnZpZXcgPT09IG51bGwgPyBudWxsIDogT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS52aWV3ICk7XG5cblx0XHR0aGlzLmZpbG1HYXVnZSA9IHNvdXJjZS5maWxtR2F1Z2U7XG5cdFx0dGhpcy5maWxtT2Zmc2V0ID0gc291cmNlLmZpbG1PZmZzZXQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBGT1YgYnkgZm9jYWwgbGVuZ3RoIGluIHJlc3BlY3QgdG8gdGhlIGN1cnJlbnQgLmZpbG1HYXVnZS5cblx0ICpcblx0ICogVGhlIGRlZmF1bHQgZmlsbSBnYXVnZSBpcyAzNSwgc28gdGhhdCB0aGUgZm9jYWwgbGVuZ3RoIGNhbiBiZSBzcGVjaWZpZWQgZm9yXG5cdCAqIGEgMzVtbSAoZnVsbCBmcmFtZSkgY2FtZXJhLlxuXHQgKlxuXHQgKiBWYWx1ZXMgZm9yIGZvY2FsIGxlbmd0aCBhbmQgZmlsbSBnYXVnZSBtdXN0IGhhdmUgdGhlIHNhbWUgdW5pdC5cblx0ICovXG5cdHNldEZvY2FsTGVuZ3RoOiBmdW5jdGlvbiAoIGZvY2FsTGVuZ3RoICkge1xuXG5cdFx0Ly8gc2VlIGh0dHA6Ly93d3cuYm9iYXRraW5zLmNvbS9waG90b2dyYXBoeS90ZWNobmljYWwvZmllbGRfb2Zfdmlldy5odG1sXG5cdFx0dmFyIHZFeHRlbnRTbG9wZSA9IDAuNSAqIHRoaXMuZ2V0RmlsbUhlaWdodCgpIC8gZm9jYWxMZW5ndGg7XG5cblx0XHR0aGlzLmZvdiA9IF9NYXRoLlJBRDJERUcgKiAyICogTWF0aC5hdGFuKCB2RXh0ZW50U2xvcGUgKTtcblx0XHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxjdWxhdGVzIHRoZSBmb2NhbCBsZW5ndGggZnJvbSB0aGUgY3VycmVudCAuZm92IGFuZCAuZmlsbUdhdWdlLlxuXHQgKi9cblx0Z2V0Rm9jYWxMZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2RXh0ZW50U2xvcGUgPSBNYXRoLnRhbiggX01hdGguREVHMlJBRCAqIDAuNSAqIHRoaXMuZm92ICk7XG5cblx0XHRyZXR1cm4gMC41ICogdGhpcy5nZXRGaWxtSGVpZ2h0KCkgLyB2RXh0ZW50U2xvcGU7XG5cblx0fSxcblxuXHRnZXRFZmZlY3RpdmVGT1Y6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfTWF0aC5SQUQyREVHICogMiAqIE1hdGguYXRhbihcblx0XHRcdE1hdGgudGFuKCBfTWF0aC5ERUcyUkFEICogMC41ICogdGhpcy5mb3YgKSAvIHRoaXMuem9vbSApO1xuXG5cdH0sXG5cblx0Z2V0RmlsbVdpZHRoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBmaWxtIG5vdCBjb21wbGV0ZWx5IGNvdmVyZWQgaW4gcG9ydHJhaXQgZm9ybWF0IChhc3BlY3QgPCAxKVxuXHRcdHJldHVybiB0aGlzLmZpbG1HYXVnZSAqIE1hdGgubWluKCB0aGlzLmFzcGVjdCwgMSApO1xuXG5cdH0sXG5cblx0Z2V0RmlsbUhlaWdodDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gZmlsbSBub3QgY29tcGxldGVseSBjb3ZlcmVkIGluIGxhbmRzY2FwZSBmb3JtYXQgKGFzcGVjdCA+IDEpXG5cdFx0cmV0dXJuIHRoaXMuZmlsbUdhdWdlIC8gTWF0aC5tYXgoIHRoaXMuYXNwZWN0LCAxICk7XG5cblx0fSxcblxuXHQvKipcblx0ICogU2V0cyBhbiBvZmZzZXQgaW4gYSBsYXJnZXIgZnJ1c3R1bS4gVGhpcyBpcyB1c2VmdWwgZm9yIG11bHRpLXdpbmRvdyBvclxuXHQgKiBtdWx0aS1tb25pdG9yL211bHRpLW1hY2hpbmUgc2V0dXBzLlxuXHQgKlxuXHQgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgM3gyIG1vbml0b3JzIGFuZCBlYWNoIG1vbml0b3IgaXMgMTkyMHgxMDgwIGFuZFxuXHQgKiB0aGUgbW9uaXRvcnMgYXJlIGluIGdyaWQgbGlrZSB0aGlzXG5cdCAqXG5cdCAqICAgKy0tLSstLS0rLS0tK1xuXHQgKiAgIHwgQSB8IEIgfCBDIHxcblx0ICogICArLS0tKy0tLSstLS0rXG5cdCAqICAgfCBEIHwgRSB8IEYgfFxuXHQgKiAgICstLS0rLS0tKy0tLStcblx0ICpcblx0ICogdGhlbiBmb3IgZWFjaCBtb25pdG9yIHlvdSB3b3VsZCBjYWxsIGl0IGxpa2UgdGhpc1xuXHQgKlxuXHQgKiAgIHZhciB3ID0gMTkyMDtcblx0ICogICB2YXIgaCA9IDEwODA7XG5cdCAqICAgdmFyIGZ1bGxXaWR0aCA9IHcgKiAzO1xuXHQgKiAgIHZhciBmdWxsSGVpZ2h0ID0gaCAqIDI7XG5cdCAqXG5cdCAqICAgLS1BLS1cblx0ICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAwLCBoICogMCwgdywgaCApO1xuXHQgKiAgIC0tQi0tXG5cdCAqICAgY2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMSwgaCAqIDAsIHcsIGggKTtcblx0ICogICAtLUMtLVxuXHQgKiAgIGNhbWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDIsIGggKiAwLCB3LCBoICk7XG5cdCAqICAgLS1ELS1cblx0ICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAwLCBoICogMSwgdywgaCApO1xuXHQgKiAgIC0tRS0tXG5cdCAqICAgY2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMSwgaCAqIDEsIHcsIGggKTtcblx0ICogICAtLUYtLVxuXHQgKiAgIGNhbWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDIsIGggKiAxLCB3LCBoICk7XG5cdCAqXG5cdCAqICAgTm90ZSB0aGVyZSBpcyBubyByZWFzb24gbW9uaXRvcnMgaGF2ZSB0byBiZSB0aGUgc2FtZSBzaXplIG9yIGluIGEgZ3JpZC5cblx0ICovXG5cdHNldFZpZXdPZmZzZXQ6IGZ1bmN0aW9uICggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdFx0dGhpcy5hc3BlY3QgPSBmdWxsV2lkdGggLyBmdWxsSGVpZ2h0O1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMudmlldyA9IHtcblx0XHRcdFx0ZW5hYmxlZDogdHJ1ZSxcblx0XHRcdFx0ZnVsbFdpZHRoOiAxLFxuXHRcdFx0XHRmdWxsSGVpZ2h0OiAxLFxuXHRcdFx0XHRvZmZzZXRYOiAwLFxuXHRcdFx0XHRvZmZzZXRZOiAwLFxuXHRcdFx0XHR3aWR0aDogMSxcblx0XHRcdFx0aGVpZ2h0OiAxXG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy52aWV3LmVuYWJsZWQgPSB0cnVlO1xuXHRcdHRoaXMudmlldy5mdWxsV2lkdGggPSBmdWxsV2lkdGg7XG5cdFx0dGhpcy52aWV3LmZ1bGxIZWlnaHQgPSBmdWxsSGVpZ2h0O1xuXHRcdHRoaXMudmlldy5vZmZzZXRYID0geDtcblx0XHR0aGlzLnZpZXcub2Zmc2V0WSA9IHk7XG5cdFx0dGhpcy52aWV3LndpZHRoID0gd2lkdGg7XG5cdFx0dGhpcy52aWV3LmhlaWdodCA9IGhlaWdodDtcblxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdH0sXG5cblx0Y2xlYXJWaWV3T2Zmc2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy52aWV3LmVuYWJsZWQgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdH0sXG5cblx0dXBkYXRlUHJvamVjdGlvbk1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG5lYXIgPSB0aGlzLm5lYXIsXG5cdFx0XHR0b3AgPSBuZWFyICogTWF0aC50YW4oXG5cdFx0XHRcdF9NYXRoLkRFRzJSQUQgKiAwLjUgKiB0aGlzLmZvdiApIC8gdGhpcy56b29tLFxuXHRcdFx0aGVpZ2h0ID0gMiAqIHRvcCxcblx0XHRcdHdpZHRoID0gdGhpcy5hc3BlY3QgKiBoZWlnaHQsXG5cdFx0XHRsZWZ0ID0gLSAwLjUgKiB3aWR0aCxcblx0XHRcdHZpZXcgPSB0aGlzLnZpZXc7XG5cblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCAmJiB0aGlzLnZpZXcuZW5hYmxlZCApIHtcblxuXHRcdFx0dmFyIGZ1bGxXaWR0aCA9IHZpZXcuZnVsbFdpZHRoLFxuXHRcdFx0XHRmdWxsSGVpZ2h0ID0gdmlldy5mdWxsSGVpZ2h0O1xuXG5cdFx0XHRsZWZ0ICs9IHZpZXcub2Zmc2V0WCAqIHdpZHRoIC8gZnVsbFdpZHRoO1xuXHRcdFx0dG9wIC09IHZpZXcub2Zmc2V0WSAqIGhlaWdodCAvIGZ1bGxIZWlnaHQ7XG5cdFx0XHR3aWR0aCAqPSB2aWV3LndpZHRoIC8gZnVsbFdpZHRoO1xuXHRcdFx0aGVpZ2h0ICo9IHZpZXcuaGVpZ2h0IC8gZnVsbEhlaWdodDtcblxuXHRcdH1cblxuXHRcdHZhciBza2V3ID0gdGhpcy5maWxtT2Zmc2V0O1xuXHRcdGlmICggc2tldyAhPT0gMCApIGxlZnQgKz0gbmVhciAqIHNrZXcgLyB0aGlzLmdldEZpbG1XaWR0aCgpO1xuXG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgbGVmdCArIHdpZHRoLCB0b3AsIHRvcCAtIGhlaWdodCwgbmVhciwgdGhpcy5mYXIgKTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGRhdGEub2JqZWN0LmZvdiA9IHRoaXMuZm92O1xuXHRcdGRhdGEub2JqZWN0Lnpvb20gPSB0aGlzLnpvb207XG5cblx0XHRkYXRhLm9iamVjdC5uZWFyID0gdGhpcy5uZWFyO1xuXHRcdGRhdGEub2JqZWN0LmZhciA9IHRoaXMuZmFyO1xuXHRcdGRhdGEub2JqZWN0LmZvY3VzID0gdGhpcy5mb2N1cztcblxuXHRcdGRhdGEub2JqZWN0LmFzcGVjdCA9IHRoaXMuYXNwZWN0O1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgIT09IG51bGwgKSBkYXRhLm9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIHRoaXMudmlldyApO1xuXG5cdFx0ZGF0YS5vYmplY3QuZmlsbUdhdWdlID0gdGhpcy5maWxtR2F1Z2U7XG5cdFx0ZGF0YS5vYmplY3QuZmlsbU9mZnNldCA9IHRoaXMuZmlsbU9mZnNldDtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQXJyYXlDYW1lcmEoIGFycmF5ICkge1xuXG5cdFBlcnNwZWN0aXZlQ2FtZXJhLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmNhbWVyYXMgPSBhcnJheSB8fCBbXTtcblxufVxuXG5BcnJheUNhbWVyYS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBQZXJzcGVjdGl2ZUNhbWVyYS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBBcnJheUNhbWVyYSxcblxuXHRpc0FycmF5Q2FtZXJhOiB0cnVlXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYlZSTWFuYWdlciggcmVuZGVyZXIgKSB7XG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHR2YXIgZGV2aWNlID0gbnVsbDtcblx0dmFyIGZyYW1lRGF0YSA9IG51bGw7XG5cblx0dmFyIHBvc2VUYXJnZXQgPSBudWxsO1xuXG5cdHZhciBzdGFuZGluZ01hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdHZhciBzdGFuZGluZ01hdHJpeEludmVyc2UgPSBuZXcgTWF0cml4NCgpO1xuXG5cdGlmICggdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ1ZSRnJhbWVEYXRhJyBpbiB3aW5kb3cgKSB7XG5cblx0XHRmcmFtZURhdGEgPSBuZXcgd2luZG93LlZSRnJhbWVEYXRhKCk7XG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICd2cmRpc3BsYXlwcmVzZW50Y2hhbmdlJywgb25WUkRpc3BsYXlQcmVzZW50Q2hhbmdlLCBmYWxzZSApO1xuXG5cdH1cblxuXHR2YXIgbWF0cml4V29ybGRJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTtcblx0dmFyIHRlbXBRdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblx0dmFyIHRlbXBQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIGNhbWVyYUwgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTtcblx0Y2FtZXJhTC5ib3VuZHMgPSBuZXcgVmVjdG9yNCggMC4wLCAwLjAsIDAuNSwgMS4wICk7XG5cdGNhbWVyYUwubGF5ZXJzLmVuYWJsZSggMSApO1xuXG5cdHZhciBjYW1lcmFSID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XG5cdGNhbWVyYVIuYm91bmRzID0gbmV3IFZlY3RvcjQoIDAuNSwgMC4wLCAwLjUsIDEuMCApO1xuXHRjYW1lcmFSLmxheWVycy5lbmFibGUoIDIgKTtcblxuXHR2YXIgY2FtZXJhVlIgPSBuZXcgQXJyYXlDYW1lcmEoIFsgY2FtZXJhTCwgY2FtZXJhUiBdICk7XG5cdGNhbWVyYVZSLmxheWVycy5lbmFibGUoIDEgKTtcblx0Y2FtZXJhVlIubGF5ZXJzLmVuYWJsZSggMiApO1xuXG5cdC8vXG5cblx0ZnVuY3Rpb24gaXNQcmVzZW50aW5nKCkge1xuXG5cdFx0cmV0dXJuIGRldmljZSAhPT0gbnVsbCAmJiBkZXZpY2UuaXNQcmVzZW50aW5nID09PSB0cnVlO1xuXG5cdH1cblxuXHR2YXIgY3VycmVudFNpemUsIGN1cnJlbnRQaXhlbFJhdGlvO1xuXG5cdGZ1bmN0aW9uIG9uVlJEaXNwbGF5UHJlc2VudENoYW5nZSgpIHtcblxuXHRcdGlmICggaXNQcmVzZW50aW5nKCkgKSB7XG5cblx0XHRcdHZhciBleWVQYXJhbWV0ZXJzID0gZGV2aWNlLmdldEV5ZVBhcmFtZXRlcnMoICdsZWZ0JyApO1xuXHRcdFx0dmFyIHJlbmRlcldpZHRoID0gZXllUGFyYW1ldGVycy5yZW5kZXJXaWR0aDtcblx0XHRcdHZhciByZW5kZXJIZWlnaHQgPSBleWVQYXJhbWV0ZXJzLnJlbmRlckhlaWdodDtcblxuXHRcdFx0Y3VycmVudFBpeGVsUmF0aW8gPSByZW5kZXJlci5nZXRQaXhlbFJhdGlvKCk7XG5cdFx0XHRjdXJyZW50U2l6ZSA9IHJlbmRlcmVyLmdldFNpemUoKTtcblxuXHRcdFx0cmVuZGVyZXIuc2V0RHJhd2luZ0J1ZmZlclNpemUoIHJlbmRlcldpZHRoICogMiwgcmVuZGVySGVpZ2h0LCAxICk7XG5cblx0XHR9IGVsc2UgaWYgKCBzY29wZS5lbmFibGVkICkge1xuXG5cdFx0XHRyZW5kZXJlci5zZXREcmF3aW5nQnVmZmVyU2l6ZSggY3VycmVudFNpemUud2lkdGgsIGN1cnJlbnRTaXplLmhlaWdodCwgY3VycmVudFBpeGVsUmF0aW8gKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly9cblxuXHR0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblx0dGhpcy51c2VySGVpZ2h0ID0gMS42O1xuXG5cdHRoaXMuZ2V0RGV2aWNlID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIGRldmljZTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0RGV2aWNlID0gZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIGRldmljZSA9IHZhbHVlO1xuXG5cdH07XG5cblx0dGhpcy5zZXRQb3NlVGFyZ2V0ID0gZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRpZiAoIG9iamVjdCAhPT0gdW5kZWZpbmVkICkgcG9zZVRhcmdldCA9IG9iamVjdDtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0Q2FtZXJhID0gZnVuY3Rpb24gKCBjYW1lcmEgKSB7XG5cblx0XHRpZiAoIGRldmljZSA9PT0gbnVsbCApIHJldHVybiBjYW1lcmE7XG5cblx0XHRkZXZpY2UuZGVwdGhOZWFyID0gY2FtZXJhLm5lYXI7XG5cdFx0ZGV2aWNlLmRlcHRoRmFyID0gY2FtZXJhLmZhcjtcblxuXHRcdGRldmljZS5nZXRGcmFtZURhdGEoIGZyYW1lRGF0YSApO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBzdGFnZVBhcmFtZXRlcnMgPSBkZXZpY2Uuc3RhZ2VQYXJhbWV0ZXJzO1xuXG5cdFx0aWYgKCBzdGFnZVBhcmFtZXRlcnMgKSB7XG5cblx0XHRcdHN0YW5kaW5nTWF0cml4LmZyb21BcnJheSggc3RhZ2VQYXJhbWV0ZXJzLnNpdHRpbmdUb1N0YW5kaW5nVHJhbnNmb3JtICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRzdGFuZGluZ01hdHJpeC5tYWtlVHJhbnNsYXRpb24oIDAsIHNjb3BlLnVzZXJIZWlnaHQsIDAgKTtcblxuXHRcdH1cblxuXG5cdFx0dmFyIHBvc2UgPSBmcmFtZURhdGEucG9zZTtcblx0XHR2YXIgcG9zZU9iamVjdCA9IHBvc2VUYXJnZXQgIT09IG51bGwgPyBwb3NlVGFyZ2V0IDogY2FtZXJhO1xuXG5cdFx0Ly8gV2Ugd2FudCB0byBtYW5pcHVsYXRlIHBvc2VPYmplY3QgYnkgaXRzIHBvc2l0aW9uIGFuZCBxdWF0ZXJuaW9uIGNvbXBvbmVudHMgc2luY2UgdXNlcnMgbWF5IHJlbHkgb24gdGhlbS5cblx0XHRwb3NlT2JqZWN0Lm1hdHJpeC5jb3B5KCBzdGFuZGluZ01hdHJpeCApO1xuXHRcdHBvc2VPYmplY3QubWF0cml4LmRlY29tcG9zZSggcG9zZU9iamVjdC5wb3NpdGlvbiwgcG9zZU9iamVjdC5xdWF0ZXJuaW9uLCBwb3NlT2JqZWN0LnNjYWxlICk7XG5cblx0XHRpZiAoIHBvc2Uub3JpZW50YXRpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdHRlbXBRdWF0ZXJuaW9uLmZyb21BcnJheSggcG9zZS5vcmllbnRhdGlvbiApO1xuXHRcdFx0cG9zZU9iamVjdC5xdWF0ZXJuaW9uLm11bHRpcGx5KCB0ZW1wUXVhdGVybmlvbiApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwb3NlLnBvc2l0aW9uICE9PSBudWxsICkge1xuXG5cdFx0XHR0ZW1wUXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoIHN0YW5kaW5nTWF0cml4ICk7XG5cdFx0XHR0ZW1wUG9zaXRpb24uZnJvbUFycmF5KCBwb3NlLnBvc2l0aW9uICk7XG5cdFx0XHR0ZW1wUG9zaXRpb24uYXBwbHlRdWF0ZXJuaW9uKCB0ZW1wUXVhdGVybmlvbiApO1xuXHRcdFx0cG9zZU9iamVjdC5wb3NpdGlvbi5hZGQoIHRlbXBQb3NpdGlvbiApO1xuXG5cdFx0fVxuXG5cdFx0cG9zZU9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0aWYgKCBkZXZpY2UuaXNQcmVzZW50aW5nID09PSBmYWxzZSApIHJldHVybiBjYW1lcmE7XG5cblx0XHQvL1xuXG5cdFx0Y2FtZXJhTC5uZWFyID0gY2FtZXJhLm5lYXI7XG5cdFx0Y2FtZXJhUi5uZWFyID0gY2FtZXJhLm5lYXI7XG5cblx0XHRjYW1lcmFMLmZhciA9IGNhbWVyYS5mYXI7XG5cdFx0Y2FtZXJhUi5mYXIgPSBjYW1lcmEuZmFyO1xuXG5cdFx0Y2FtZXJhVlIubWF0cml4V29ybGQuY29weSggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cdFx0Y2FtZXJhVlIubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblxuXHRcdGNhbWVyYUwubWF0cml4V29ybGRJbnZlcnNlLmZyb21BcnJheSggZnJhbWVEYXRhLmxlZnRWaWV3TWF0cml4ICk7XG5cdFx0Y2FtZXJhUi5tYXRyaXhXb3JsZEludmVyc2UuZnJvbUFycmF5KCBmcmFtZURhdGEucmlnaHRWaWV3TWF0cml4ICk7XG5cblx0XHQvLyBUT0RPIChtcmRvb2IpIERvdWJsZSBjaGVjayB0aGlzIGNvZGVcblxuXHRcdHN0YW5kaW5nTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKCBzdGFuZGluZ01hdHJpeCApO1xuXG5cdFx0Y2FtZXJhTC5tYXRyaXhXb3JsZEludmVyc2UubXVsdGlwbHkoIHN0YW5kaW5nTWF0cml4SW52ZXJzZSApO1xuXHRcdGNhbWVyYVIubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KCBzdGFuZGluZ01hdHJpeEludmVyc2UgKTtcblxuXHRcdHZhciBwYXJlbnQgPSBwb3NlT2JqZWN0LnBhcmVudDtcblxuXHRcdGlmICggcGFyZW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRtYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSggcGFyZW50Lm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdGNhbWVyYUwubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KCBtYXRyaXhXb3JsZEludmVyc2UgKTtcblx0XHRcdGNhbWVyYVIubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KCBtYXRyaXhXb3JsZEludmVyc2UgKTtcblxuXHRcdH1cblxuXHRcdC8vIGVudk1hcCBhbmQgTWlycm9yIG5lZWRzIGNhbWVyYS5tYXRyaXhXb3JsZFxuXG5cdFx0Y2FtZXJhTC5tYXRyaXhXb3JsZC5nZXRJbnZlcnNlKCBjYW1lcmFMLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXHRcdGNhbWVyYVIubWF0cml4V29ybGQuZ2V0SW52ZXJzZSggY2FtZXJhUi5tYXRyaXhXb3JsZEludmVyc2UgKTtcblxuXHRcdGNhbWVyYUwucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoIGZyYW1lRGF0YS5sZWZ0UHJvamVjdGlvbk1hdHJpeCApO1xuXHRcdGNhbWVyYVIucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoIGZyYW1lRGF0YS5yaWdodFByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdC8vIEhBQ0sgKG1yZG9vYilcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vdzNjL3dlYnZyL2lzc3Vlcy8yMDNcblxuXHRcdGNhbWVyYVZSLnByb2plY3Rpb25NYXRyaXguY29weSggY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4ICk7XG5cblx0XHQvL1xuXG5cdFx0dmFyIGxheWVycyA9IGRldmljZS5nZXRMYXllcnMoKTtcblxuXHRcdGlmICggbGF5ZXJzLmxlbmd0aCApIHtcblxuXHRcdFx0dmFyIGxheWVyID0gbGF5ZXJzWyAwIF07XG5cblx0XHRcdGlmICggbGF5ZXIubGVmdEJvdW5kcyAhPT0gbnVsbCAmJiBsYXllci5sZWZ0Qm91bmRzLmxlbmd0aCA9PT0gNCApIHtcblxuXHRcdFx0XHRjYW1lcmFMLmJvdW5kcy5mcm9tQXJyYXkoIGxheWVyLmxlZnRCb3VuZHMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGxheWVyLnJpZ2h0Qm91bmRzICE9PSBudWxsICYmIGxheWVyLnJpZ2h0Qm91bmRzLmxlbmd0aCA9PT0gNCApIHtcblxuXHRcdFx0XHRjYW1lcmFSLmJvdW5kcy5mcm9tQXJyYXkoIGxheWVyLnJpZ2h0Qm91bmRzICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBjYW1lcmFWUjtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0U3RhbmRpbmdNYXRyaXggPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gc3RhbmRpbmdNYXRyaXg7XG5cblx0fTtcblxuXHR0aGlzLnN1Ym1pdEZyYW1lID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCBpc1ByZXNlbnRpbmcoKSApIGRldmljZS5zdWJtaXRGcmFtZSgpO1xuXG5cdH07XG5cblx0dGhpcy5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyApIHtcblxuXHRcdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoICd2cmRpc3BsYXlwcmVzZW50Y2hhbmdlJywgb25WUkRpc3BsYXlQcmVzZW50Q2hhbmdlICk7XG5cblx0XHR9XG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3Igc3VwZXJlZ2diZXJ0IC8gaHR0cDovL3d3dy5wYXVsYnJ1bnQuY28udWsvXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3Igc3ppbWVrIC8gaHR0cHM6Ly9naXRodWIuY29tL3N6aW1lay9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFJlbmRlcmVyKCBwYXJhbWV0ZXJzICkge1xuXG5cdGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xSZW5kZXJlcicsIFJFVklTSU9OICk7XG5cblx0cGFyYW1ldGVycyA9IHBhcmFtZXRlcnMgfHwge307XG5cblx0dmFyIF9jYW52YXMgPSBwYXJhbWV0ZXJzLmNhbnZhcyAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5jYW52YXMgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKSxcblx0XHRfY29udGV4dCA9IHBhcmFtZXRlcnMuY29udGV4dCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5jb250ZXh0IDogbnVsbCxcblxuXHRcdF9hbHBoYSA9IHBhcmFtZXRlcnMuYWxwaGEgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuYWxwaGEgOiBmYWxzZSxcblx0XHRfZGVwdGggPSBwYXJhbWV0ZXJzLmRlcHRoICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmRlcHRoIDogdHJ1ZSxcblx0XHRfc3RlbmNpbCA9IHBhcmFtZXRlcnMuc3RlbmNpbCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5zdGVuY2lsIDogdHJ1ZSxcblx0XHRfYW50aWFsaWFzID0gcGFyYW1ldGVycy5hbnRpYWxpYXMgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuYW50aWFsaWFzIDogZmFsc2UsXG5cdFx0X3ByZW11bHRpcGxpZWRBbHBoYSA9IHBhcmFtZXRlcnMucHJlbXVsdGlwbGllZEFscGhhICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnByZW11bHRpcGxpZWRBbHBoYSA6IHRydWUsXG5cdFx0X3ByZXNlcnZlRHJhd2luZ0J1ZmZlciA9IHBhcmFtZXRlcnMucHJlc2VydmVEcmF3aW5nQnVmZmVyICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnByZXNlcnZlRHJhd2luZ0J1ZmZlciA6IGZhbHNlLFxuXHRcdF9wb3dlclByZWZlcmVuY2UgPSBwYXJhbWV0ZXJzLnBvd2VyUHJlZmVyZW5jZSAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5wb3dlclByZWZlcmVuY2UgOiAnZGVmYXVsdCc7XG5cblx0dmFyIGN1cnJlbnRSZW5kZXJMaXN0ID0gbnVsbDtcblx0dmFyIGN1cnJlbnRSZW5kZXJTdGF0ZSA9IG51bGw7XG5cblx0Ly8gcHVibGljIHByb3BlcnRpZXNcblxuXHR0aGlzLmRvbUVsZW1lbnQgPSBfY2FudmFzO1xuXHR0aGlzLmNvbnRleHQgPSBudWxsO1xuXG5cdC8vIGNsZWFyaW5nXG5cblx0dGhpcy5hdXRvQ2xlYXIgPSB0cnVlO1xuXHR0aGlzLmF1dG9DbGVhckNvbG9yID0gdHJ1ZTtcblx0dGhpcy5hdXRvQ2xlYXJEZXB0aCA9IHRydWU7XG5cdHRoaXMuYXV0b0NsZWFyU3RlbmNpbCA9IHRydWU7XG5cblx0Ly8gc2NlbmUgZ3JhcGhcblxuXHR0aGlzLnNvcnRPYmplY3RzID0gdHJ1ZTtcblxuXHQvLyB1c2VyLWRlZmluZWQgY2xpcHBpbmdcblxuXHR0aGlzLmNsaXBwaW5nUGxhbmVzID0gW107XG5cdHRoaXMubG9jYWxDbGlwcGluZ0VuYWJsZWQgPSBmYWxzZTtcblxuXHQvLyBwaHlzaWNhbGx5IGJhc2VkIHNoYWRpbmdcblxuXHR0aGlzLmdhbW1hRmFjdG9yID0gMi4wO1x0Ly8gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cdHRoaXMuZ2FtbWFJbnB1dCA9IGZhbHNlO1xuXHR0aGlzLmdhbW1hT3V0cHV0ID0gZmFsc2U7XG5cblx0Ly8gcGh5c2ljYWwgbGlnaHRzXG5cblx0dGhpcy5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyA9IGZhbHNlO1xuXG5cdC8vIHRvbmUgbWFwcGluZ1xuXG5cdHRoaXMudG9uZU1hcHBpbmcgPSBMaW5lYXJUb25lTWFwcGluZztcblx0dGhpcy50b25lTWFwcGluZ0V4cG9zdXJlID0gMS4wO1xuXHR0aGlzLnRvbmVNYXBwaW5nV2hpdGVQb2ludCA9IDEuMDtcblxuXHQvLyBtb3JwaHNcblxuXHR0aGlzLm1heE1vcnBoVGFyZ2V0cyA9IDg7XG5cdHRoaXMubWF4TW9ycGhOb3JtYWxzID0gNDtcblxuXHQvLyBpbnRlcm5hbCBwcm9wZXJ0aWVzXG5cblx0dmFyIF90aGlzID0gdGhpcyxcblxuXHRcdF9pc0NvbnRleHRMb3N0ID0gZmFsc2UsXG5cblx0XHQvLyBpbnRlcm5hbCBzdGF0ZSBjYWNoZVxuXG5cdFx0X2N1cnJlbnRSZW5kZXJUYXJnZXQgPSBudWxsLFxuXHRcdF9jdXJyZW50RnJhbWVidWZmZXIgPSBudWxsLFxuXHRcdF9jdXJyZW50TWF0ZXJpYWxJZCA9IC0gMSxcblx0XHRfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9ICcnLFxuXG5cdFx0X2N1cnJlbnRDYW1lcmEgPSBudWxsLFxuXHRcdF9jdXJyZW50QXJyYXlDYW1lcmEgPSBudWxsLFxuXG5cdFx0X2N1cnJlbnRWaWV3cG9ydCA9IG5ldyBWZWN0b3I0KCksXG5cdFx0X2N1cnJlbnRTY2lzc29yID0gbmV3IFZlY3RvcjQoKSxcblx0XHRfY3VycmVudFNjaXNzb3JUZXN0ID0gbnVsbCxcblxuXHRcdC8vXG5cblx0XHRfdXNlZFRleHR1cmVVbml0cyA9IDAsXG5cblx0XHQvL1xuXG5cdFx0X3dpZHRoID0gX2NhbnZhcy53aWR0aCxcblx0XHRfaGVpZ2h0ID0gX2NhbnZhcy5oZWlnaHQsXG5cblx0XHRfcGl4ZWxSYXRpbyA9IDEsXG5cblx0XHRfdmlld3BvcnQgPSBuZXcgVmVjdG9yNCggMCwgMCwgX3dpZHRoLCBfaGVpZ2h0ICksXG5cdFx0X3NjaXNzb3IgPSBuZXcgVmVjdG9yNCggMCwgMCwgX3dpZHRoLCBfaGVpZ2h0ICksXG5cdFx0X3NjaXNzb3JUZXN0ID0gZmFsc2UsXG5cblx0XHQvLyBmcnVzdHVtXG5cblx0XHRfZnJ1c3R1bSA9IG5ldyBGcnVzdHVtKCksXG5cblx0XHQvLyBjbGlwcGluZ1xuXG5cdFx0X2NsaXBwaW5nID0gbmV3IFdlYkdMQ2xpcHBpbmcoKSxcblx0XHRfY2xpcHBpbmdFbmFibGVkID0gZmFsc2UsXG5cdFx0X2xvY2FsQ2xpcHBpbmdFbmFibGVkID0gZmFsc2UsXG5cblx0XHQvLyBjYW1lcmEgbWF0cmljZXMgY2FjaGVcblxuXHRcdF9wcm9qU2NyZWVuTWF0cml4ID0gbmV3IE1hdHJpeDQoKSxcblxuXHRcdF92ZWN0b3IzID0gbmV3IFZlY3RvcjMoKTtcblxuXHRmdW5jdGlvbiBnZXRUYXJnZXRQaXhlbFJhdGlvKCkge1xuXG5cdFx0cmV0dXJuIF9jdXJyZW50UmVuZGVyVGFyZ2V0ID09PSBudWxsID8gX3BpeGVsUmF0aW8gOiAxO1xuXG5cdH1cblxuXHQvLyBpbml0aWFsaXplXG5cblx0dmFyIF9nbDtcblxuXHR0cnkge1xuXG5cdFx0dmFyIGNvbnRleHRBdHRyaWJ1dGVzID0ge1xuXHRcdFx0YWxwaGE6IF9hbHBoYSxcblx0XHRcdGRlcHRoOiBfZGVwdGgsXG5cdFx0XHRzdGVuY2lsOiBfc3RlbmNpbCxcblx0XHRcdGFudGlhbGlhczogX2FudGlhbGlhcyxcblx0XHRcdHByZW11bHRpcGxpZWRBbHBoYTogX3ByZW11bHRpcGxpZWRBbHBoYSxcblx0XHRcdHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogX3ByZXNlcnZlRHJhd2luZ0J1ZmZlcixcblx0XHRcdHBvd2VyUHJlZmVyZW5jZTogX3Bvd2VyUHJlZmVyZW5jZVxuXHRcdH07XG5cblx0XHQvLyBldmVudCBsaXN0ZW5lcnMgbXVzdCBiZSByZWdpc3RlcmVkIGJlZm9yZSBXZWJHTCBjb250ZXh0IGlzIGNyZWF0ZWQsIHNlZSAjMTI3NTNcblxuXHRcdF9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dGxvc3QnLCBvbkNvbnRleHRMb3N0LCBmYWxzZSApO1xuXHRcdF9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dHJlc3RvcmVkJywgb25Db250ZXh0UmVzdG9yZSwgZmFsc2UgKTtcblxuXHRcdF9nbCA9IF9jb250ZXh0IHx8IF9jYW52YXMuZ2V0Q29udGV4dCggJ3dlYmdsJywgY29udGV4dEF0dHJpYnV0ZXMgKSB8fCBfY2FudmFzLmdldENvbnRleHQoICdleHBlcmltZW50YWwtd2ViZ2wnLCBjb250ZXh0QXR0cmlidXRlcyApO1xuXG5cdFx0aWYgKCBfZ2wgPT09IG51bGwgKSB7XG5cblx0XHRcdGlmICggX2NhbnZhcy5nZXRDb250ZXh0KCAnd2ViZ2wnICkgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnRXJyb3IgY3JlYXRpbmcgV2ViR0wgY29udGV4dCB3aXRoIHlvdXIgc2VsZWN0ZWQgYXR0cmlidXRlcy4nICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnRXJyb3IgY3JlYXRpbmcgV2ViR0wgY29udGV4dC4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIFNvbWUgZXhwZXJpbWVudGFsLXdlYmdsIGltcGxlbWVudGF0aW9ucyBkbyBub3QgaGF2ZSBnZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXRcblxuXHRcdGlmICggX2dsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRfZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdHJldHVybiB7ICdyYW5nZU1pbic6IDEsICdyYW5nZU1heCc6IDEsICdwcmVjaXNpb24nOiAxIH07XG5cblx0XHRcdH07XG5cblx0XHR9XG5cblx0fSBjYXRjaCAoIGVycm9yICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXI6ICcgKyBlcnJvci5tZXNzYWdlICk7XG5cblx0fVxuXG5cdHZhciBleHRlbnNpb25zLCBjYXBhYmlsaXRpZXMsIHN0YXRlLCBpbmZvO1xuXHR2YXIgcHJvcGVydGllcywgdGV4dHVyZXMsIGF0dHJpYnV0ZXMsIGdlb21ldHJpZXMsIG9iamVjdHM7XG5cdHZhciBwcm9ncmFtQ2FjaGUsIHJlbmRlckxpc3RzLCByZW5kZXJTdGF0ZXM7XG5cblx0dmFyIGJhY2tncm91bmQsIG1vcnBodGFyZ2V0cywgYnVmZmVyUmVuZGVyZXIsIGluZGV4ZWRCdWZmZXJSZW5kZXJlcjtcblx0dmFyIHNwcml0ZVJlbmRlcmVyO1xuXG5cdHZhciB1dGlscztcblxuXHRmdW5jdGlvbiBpbml0R0xDb250ZXh0KCkge1xuXG5cdFx0ZXh0ZW5zaW9ucyA9IG5ldyBXZWJHTEV4dGVuc2lvbnMoIF9nbCApO1xuXHRcdGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfZGVwdGhfdGV4dHVyZScgKTtcblx0XHRleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApO1xuXHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyJyApO1xuXHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKTtcblx0XHRleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyJyApO1xuXHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzJyApO1xuXHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX2VsZW1lbnRfaW5kZXhfdWludCcgKTtcblx0XHRleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cblx0XHR1dGlscyA9IG5ldyBXZWJHTFV0aWxzKCBfZ2wsIGV4dGVuc2lvbnMgKTtcblxuXHRcdGNhcGFiaWxpdGllcyA9IG5ldyBXZWJHTENhcGFiaWxpdGllcyggX2dsLCBleHRlbnNpb25zLCBwYXJhbWV0ZXJzICk7XG5cblx0XHRzdGF0ZSA9IG5ldyBXZWJHTFN0YXRlKCBfZ2wsIGV4dGVuc2lvbnMsIHV0aWxzICk7XG5cdFx0c3RhdGUuc2Npc3NvciggX2N1cnJlbnRTY2lzc29yLmNvcHkoIF9zY2lzc29yICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkgKTtcblx0XHRzdGF0ZS52aWV3cG9ydCggX2N1cnJlbnRWaWV3cG9ydC5jb3B5KCBfdmlld3BvcnQgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKSApO1xuXG5cdFx0aW5mbyA9IG5ldyBXZWJHTEluZm8oIF9nbCApO1xuXHRcdHByb3BlcnRpZXMgPSBuZXcgV2ViR0xQcm9wZXJ0aWVzKCk7XG5cdFx0dGV4dHVyZXMgPSBuZXcgV2ViR0xUZXh0dXJlcyggX2dsLCBleHRlbnNpb25zLCBzdGF0ZSwgcHJvcGVydGllcywgY2FwYWJpbGl0aWVzLCB1dGlscywgaW5mbyApO1xuXHRcdGF0dHJpYnV0ZXMgPSBuZXcgV2ViR0xBdHRyaWJ1dGVzKCBfZ2wgKTtcblx0XHRnZW9tZXRyaWVzID0gbmV3IFdlYkdMR2VvbWV0cmllcyggX2dsLCBhdHRyaWJ1dGVzLCBpbmZvICk7XG5cdFx0b2JqZWN0cyA9IG5ldyBXZWJHTE9iamVjdHMoIGdlb21ldHJpZXMsIGluZm8gKTtcblx0XHRtb3JwaHRhcmdldHMgPSBuZXcgV2ViR0xNb3JwaHRhcmdldHMoIF9nbCApO1xuXHRcdHByb2dyYW1DYWNoZSA9IG5ldyBXZWJHTFByb2dyYW1zKCBfdGhpcywgZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzICk7XG5cdFx0cmVuZGVyTGlzdHMgPSBuZXcgV2ViR0xSZW5kZXJMaXN0cygpO1xuXHRcdHJlbmRlclN0YXRlcyA9IG5ldyBXZWJHTFJlbmRlclN0YXRlcygpO1xuXG5cdFx0YmFja2dyb3VuZCA9IG5ldyBXZWJHTEJhY2tncm91bmQoIF90aGlzLCBzdGF0ZSwgZ2VvbWV0cmllcywgX3ByZW11bHRpcGxpZWRBbHBoYSApO1xuXG5cdFx0YnVmZmVyUmVuZGVyZXIgPSBuZXcgV2ViR0xCdWZmZXJSZW5kZXJlciggX2dsLCBleHRlbnNpb25zLCBpbmZvICk7XG5cdFx0aW5kZXhlZEJ1ZmZlclJlbmRlcmVyID0gbmV3IFdlYkdMSW5kZXhlZEJ1ZmZlclJlbmRlcmVyKCBfZ2wsIGV4dGVuc2lvbnMsIGluZm8gKTtcblxuXHRcdHNwcml0ZVJlbmRlcmVyID0gbmV3IFdlYkdMU3ByaXRlUmVuZGVyZXIoIF90aGlzLCBfZ2wsIHN0YXRlLCB0ZXh0dXJlcywgY2FwYWJpbGl0aWVzICk7XG5cblx0XHRpbmZvLnByb2dyYW1zID0gcHJvZ3JhbUNhY2hlLnByb2dyYW1zO1xuXG5cdFx0X3RoaXMuY29udGV4dCA9IF9nbDtcblx0XHRfdGhpcy5jYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXM7XG5cdFx0X3RoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7XG5cdFx0X3RoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG5cdFx0X3RoaXMucmVuZGVyTGlzdHMgPSByZW5kZXJMaXN0cztcblx0XHRfdGhpcy5zdGF0ZSA9IHN0YXRlO1xuXHRcdF90aGlzLmluZm8gPSBpbmZvO1xuXG5cdH1cblxuXHRpbml0R0xDb250ZXh0KCk7XG5cblx0Ly8gdnJcblxuXHR2YXIgdnIgPSBuZXcgV2ViVlJNYW5hZ2VyKCBfdGhpcyApO1xuXG5cdHRoaXMudnIgPSB2cjtcblxuXHQvLyBzaGFkb3cgbWFwXG5cblx0dmFyIHNoYWRvd01hcCA9IG5ldyBXZWJHTFNoYWRvd01hcCggX3RoaXMsIG9iamVjdHMsIGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlU2l6ZSApO1xuXG5cdHRoaXMuc2hhZG93TWFwID0gc2hhZG93TWFwO1xuXG5cdC8vIEFQSVxuXG5cdHRoaXMuZ2V0Q29udGV4dCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfZ2w7XG5cblx0fTtcblxuXHR0aGlzLmdldENvbnRleHRBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9nbC5nZXRDb250ZXh0QXR0cmlidXRlcygpO1xuXG5cdH07XG5cblx0dGhpcy5mb3JjZUNvbnRleHRMb3NzID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfbG9zZV9jb250ZXh0JyApO1xuXHRcdGlmICggZXh0ZW5zaW9uICkgZXh0ZW5zaW9uLmxvc2VDb250ZXh0KCk7XG5cblx0fTtcblxuXHR0aGlzLmZvcmNlQ29udGV4dFJlc3RvcmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9sb3NlX2NvbnRleHQnICk7XG5cdFx0aWYgKCBleHRlbnNpb24gKSBleHRlbnNpb24ucmVzdG9yZUNvbnRleHQoKTtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0UGl4ZWxSYXRpbyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfcGl4ZWxSYXRpbztcblxuXHR9O1xuXG5cdHRoaXMuc2V0UGl4ZWxSYXRpbyA9IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSByZXR1cm47XG5cblx0XHRfcGl4ZWxSYXRpbyA9IHZhbHVlO1xuXG5cdFx0dGhpcy5zZXRTaXplKCBfd2lkdGgsIF9oZWlnaHQsIGZhbHNlICk7XG5cblx0fTtcblxuXHR0aGlzLmdldFNpemUgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0d2lkdGg6IF93aWR0aCxcblx0XHRcdGhlaWdodDogX2hlaWdodFxuXHRcdH07XG5cblx0fTtcblxuXHR0aGlzLnNldFNpemUgPSBmdW5jdGlvbiAoIHdpZHRoLCBoZWlnaHQsIHVwZGF0ZVN0eWxlICkge1xuXG5cdFx0dmFyIGRldmljZSA9IHZyLmdldERldmljZSgpO1xuXG5cdFx0aWYgKCBkZXZpY2UgJiYgZGV2aWNlLmlzUHJlc2VudGluZyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQ2FuXFwndCBjaGFuZ2Ugc2l6ZSB3aGlsZSBWUiBkZXZpY2UgaXMgcHJlc2VudGluZy4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRfd2lkdGggPSB3aWR0aDtcblx0XHRfaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdFx0X2NhbnZhcy53aWR0aCA9IHdpZHRoICogX3BpeGVsUmF0aW87XG5cdFx0X2NhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBfcGl4ZWxSYXRpbztcblxuXHRcdGlmICggdXBkYXRlU3R5bGUgIT09IGZhbHNlICkge1xuXG5cdFx0XHRfY2FudmFzLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xuXHRcdFx0X2NhbnZhcy5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5zZXRWaWV3cG9ydCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXG5cdH07XG5cblx0dGhpcy5nZXREcmF3aW5nQnVmZmVyU2l6ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB7XG5cdFx0XHR3aWR0aDogX3dpZHRoICogX3BpeGVsUmF0aW8sXG5cdFx0XHRoZWlnaHQ6IF9oZWlnaHQgKiBfcGl4ZWxSYXRpb1xuXHRcdH07XG5cblx0fTtcblxuXHR0aGlzLnNldERyYXdpbmdCdWZmZXJTaXplID0gZnVuY3Rpb24gKCB3aWR0aCwgaGVpZ2h0LCBwaXhlbFJhdGlvICkge1xuXG5cdFx0X3dpZHRoID0gd2lkdGg7XG5cdFx0X2hlaWdodCA9IGhlaWdodDtcblxuXHRcdF9waXhlbFJhdGlvID0gcGl4ZWxSYXRpbztcblxuXHRcdF9jYW52YXMud2lkdGggPSB3aWR0aCAqIHBpeGVsUmF0aW87XG5cdFx0X2NhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBwaXhlbFJhdGlvO1xuXG5cdFx0dGhpcy5zZXRWaWV3cG9ydCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXG5cdH07XG5cblx0dGhpcy5nZXRDdXJyZW50Vmlld3BvcnQgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gX2N1cnJlbnRWaWV3cG9ydDtcblxuXHR9O1xuXG5cdHRoaXMuc2V0Vmlld3BvcnQgPSBmdW5jdGlvbiAoIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRfdmlld3BvcnQuc2V0KCB4LCBfaGVpZ2h0IC0geSAtIGhlaWdodCwgd2lkdGgsIGhlaWdodCApO1xuXHRcdHN0YXRlLnZpZXdwb3J0KCBfY3VycmVudFZpZXdwb3J0LmNvcHkoIF92aWV3cG9ydCApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApICk7XG5cblx0fTtcblxuXHR0aGlzLnNldFNjaXNzb3IgPSBmdW5jdGlvbiAoIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRfc2Npc3Nvci5zZXQoIHgsIF9oZWlnaHQgLSB5IC0gaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0ICk7XG5cdFx0c3RhdGUuc2Npc3NvciggX2N1cnJlbnRTY2lzc29yLmNvcHkoIF9zY2lzc29yICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkgKTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0U2Npc3NvclRlc3QgPSBmdW5jdGlvbiAoIGJvb2xlYW4gKSB7XG5cblx0XHRzdGF0ZS5zZXRTY2lzc29yVGVzdCggX3NjaXNzb3JUZXN0ID0gYm9vbGVhbiApO1xuXG5cdH07XG5cblx0Ly8gQ2xlYXJpbmdcblxuXHR0aGlzLmdldENsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gYmFja2dyb3VuZC5nZXRDbGVhckNvbG9yKCk7XG5cblx0fTtcblxuXHR0aGlzLnNldENsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRiYWNrZ3JvdW5kLnNldENsZWFyQ29sb3IuYXBwbHkoIGJhY2tncm91bmQsIGFyZ3VtZW50cyApO1xuXG5cdH07XG5cblx0dGhpcy5nZXRDbGVhckFscGhhID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIGJhY2tncm91bmQuZ2V0Q2xlYXJBbHBoYSgpO1xuXG5cdH07XG5cblx0dGhpcy5zZXRDbGVhckFscGhhID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0YmFja2dyb3VuZC5zZXRDbGVhckFscGhhLmFwcGx5KCBiYWNrZ3JvdW5kLCBhcmd1bWVudHMgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXIgPSBmdW5jdGlvbiAoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApIHtcblxuXHRcdHZhciBiaXRzID0gMDtcblxuXHRcdGlmICggY29sb3IgPT09IHVuZGVmaW5lZCB8fCBjb2xvciApIGJpdHMgfD0gX2dsLkNPTE9SX0JVRkZFUl9CSVQ7XG5cdFx0aWYgKCBkZXB0aCA9PT0gdW5kZWZpbmVkIHx8IGRlcHRoICkgYml0cyB8PSBfZ2wuREVQVEhfQlVGRkVSX0JJVDtcblx0XHRpZiAoIHN0ZW5jaWwgPT09IHVuZGVmaW5lZCB8fCBzdGVuY2lsICkgYml0cyB8PSBfZ2wuU1RFTkNJTF9CVUZGRVJfQklUO1xuXG5cdFx0X2dsLmNsZWFyKCBiaXRzICk7XG5cblx0fTtcblxuXHR0aGlzLmNsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNsZWFyKCB0cnVlLCBmYWxzZSwgZmFsc2UgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXJEZXB0aCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY2xlYXIoIGZhbHNlLCB0cnVlLCBmYWxzZSApO1xuXG5cdH07XG5cblx0dGhpcy5jbGVhclN0ZW5jaWwgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNsZWFyKCBmYWxzZSwgZmFsc2UsIHRydWUgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXJUYXJnZXQgPSBmdW5jdGlvbiAoIHJlbmRlclRhcmdldCwgY29sb3IsIGRlcHRoLCBzdGVuY2lsICkge1xuXG5cdFx0dGhpcy5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApO1xuXHRcdHRoaXMuY2xlYXIoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApO1xuXG5cdH07XG5cblx0Ly9cblxuXHR0aGlzLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRfY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoICd3ZWJnbGNvbnRleHRsb3N0Jywgb25Db250ZXh0TG9zdCwgZmFsc2UgKTtcblx0XHRfY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoICd3ZWJnbGNvbnRleHRyZXN0b3JlZCcsIG9uQ29udGV4dFJlc3RvcmUsIGZhbHNlICk7XG5cblx0XHRyZW5kZXJMaXN0cy5kaXNwb3NlKCk7XG5cdFx0cmVuZGVyU3RhdGVzLmRpc3Bvc2UoKTtcblx0XHRwcm9wZXJ0aWVzLmRpc3Bvc2UoKTtcblx0XHRvYmplY3RzLmRpc3Bvc2UoKTtcblxuXHRcdHZyLmRpc3Bvc2UoKTtcblxuXHRcdHN0b3BBbmltYXRpb24oKTtcblxuXHR9O1xuXG5cdC8vIEV2ZW50c1xuXG5cdGZ1bmN0aW9uIG9uQ29udGV4dExvc3QoIGV2ZW50ICkge1xuXG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQ29udGV4dCBMb3N0LicgKTtcblxuXHRcdF9pc0NvbnRleHRMb3N0ID0gdHJ1ZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gb25Db250ZXh0UmVzdG9yZSggLyogZXZlbnQgKi8gKSB7XG5cblx0XHRjb25zb2xlLmxvZyggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgUmVzdG9yZWQuJyApO1xuXG5cdFx0X2lzQ29udGV4dExvc3QgPSBmYWxzZTtcblxuXHRcdGluaXRHTENvbnRleHQoKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gb25NYXRlcmlhbERpc3Bvc2UoIGV2ZW50ICkge1xuXG5cdFx0dmFyIG1hdGVyaWFsID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0bWF0ZXJpYWwucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvbk1hdGVyaWFsRGlzcG9zZSApO1xuXG5cdFx0ZGVhbGxvY2F0ZU1hdGVyaWFsKCBtYXRlcmlhbCApO1xuXG5cdH1cblxuXHQvLyBCdWZmZXIgZGVhbGxvY2F0aW9uXG5cblx0ZnVuY3Rpb24gZGVhbGxvY2F0ZU1hdGVyaWFsKCBtYXRlcmlhbCApIHtcblxuXHRcdHJlbGVhc2VNYXRlcmlhbFByb2dyYW1SZWZlcmVuY2UoIG1hdGVyaWFsICk7XG5cblx0XHRwcm9wZXJ0aWVzLnJlbW92ZSggbWF0ZXJpYWwgKTtcblxuXHR9XG5cblxuXHRmdW5jdGlvbiByZWxlYXNlTWF0ZXJpYWxQcm9ncmFtUmVmZXJlbmNlKCBtYXRlcmlhbCApIHtcblxuXHRcdHZhciBwcm9ncmFtSW5mbyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApLnByb2dyYW07XG5cblx0XHRtYXRlcmlhbC5wcm9ncmFtID0gdW5kZWZpbmVkO1xuXG5cdFx0aWYgKCBwcm9ncmFtSW5mbyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRwcm9ncmFtQ2FjaGUucmVsZWFzZVByb2dyYW0oIHByb2dyYW1JbmZvICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIEJ1ZmZlciByZW5kZXJpbmdcblxuXHRmdW5jdGlvbiByZW5kZXJPYmplY3RJbW1lZGlhdGUoIG9iamVjdCwgcHJvZ3JhbSwgbWF0ZXJpYWwgKSB7XG5cblx0XHRvYmplY3QucmVuZGVyKCBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdFx0X3RoaXMucmVuZGVyQnVmZmVySW1tZWRpYXRlKCBvYmplY3QsIHByb2dyYW0sIG1hdGVyaWFsICk7XG5cblx0XHR9ICk7XG5cblx0fVxuXG5cdHRoaXMucmVuZGVyQnVmZmVySW1tZWRpYXRlID0gZnVuY3Rpb24gKCBvYmplY3QsIHByb2dyYW0sIG1hdGVyaWFsICkge1xuXG5cdFx0c3RhdGUuaW5pdEF0dHJpYnV0ZXMoKTtcblxuXHRcdHZhciBidWZmZXJzID0gcHJvcGVydGllcy5nZXQoIG9iamVjdCApO1xuXG5cdFx0aWYgKCBvYmplY3QuaGFzUG9zaXRpb25zICYmICEgYnVmZmVycy5wb3NpdGlvbiApIGJ1ZmZlcnMucG9zaXRpb24gPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0aWYgKCBvYmplY3QuaGFzTm9ybWFscyAmJiAhIGJ1ZmZlcnMubm9ybWFsICkgYnVmZmVycy5ub3JtYWwgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0aWYgKCBvYmplY3QuaGFzVXZzICYmICEgYnVmZmVycy51diApIGJ1ZmZlcnMudXYgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0aWYgKCBvYmplY3QuaGFzQ29sb3JzICYmICEgYnVmZmVycy5jb2xvciApIGJ1ZmZlcnMuY29sb3IgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cblx0XHR2YXIgcHJvZ3JhbUF0dHJpYnV0ZXMgPSBwcm9ncmFtLmdldEF0dHJpYnV0ZXMoKTtcblxuXHRcdGlmICggb2JqZWN0Lmhhc1Bvc2l0aW9ucyApIHtcblxuXHRcdFx0X2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcnMucG9zaXRpb24gKTtcblx0XHRcdF9nbC5idWZmZXJEYXRhKCBfZ2wuQVJSQVlfQlVGRkVSLCBvYmplY3QucG9zaXRpb25BcnJheSwgX2dsLkRZTkFNSUNfRFJBVyApO1xuXG5cdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLnBvc2l0aW9uICk7XG5cdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZXMucG9zaXRpb24sIDMsIF9nbC5GTE9BVCwgZmFsc2UsIDAsIDAgKTtcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0Lmhhc05vcm1hbHMgKSB7XG5cblx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXJzLm5vcm1hbCApO1xuXG5cdFx0XHRpZiAoICEgbWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCAmJlxuXHRcdFx0XHQhIG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgJiZcblx0XHRcdFx0ISBtYXRlcmlhbC5pc01lc2hOb3JtYWxNYXRlcmlhbCAmJlxuXHRcdFx0XHRtYXRlcmlhbC5mbGF0U2hhZGluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBvYmplY3QuY291bnQgKiAzOyBpIDwgbDsgaSArPSA5ICkge1xuXG5cdFx0XHRcdFx0dmFyIGFycmF5ID0gb2JqZWN0Lm5vcm1hbEFycmF5O1xuXG5cdFx0XHRcdFx0dmFyIG54ID0gKCBhcnJheVsgaSArIDAgXSArIGFycmF5WyBpICsgMyBdICsgYXJyYXlbIGkgKyA2IF0gKSAvIDM7XG5cdFx0XHRcdFx0dmFyIG55ID0gKCBhcnJheVsgaSArIDEgXSArIGFycmF5WyBpICsgNCBdICsgYXJyYXlbIGkgKyA3IF0gKSAvIDM7XG5cdFx0XHRcdFx0dmFyIG56ID0gKCBhcnJheVsgaSArIDIgXSArIGFycmF5WyBpICsgNSBdICsgYXJyYXlbIGkgKyA4IF0gKSAvIDM7XG5cblx0XHRcdFx0XHRhcnJheVsgaSArIDAgXSA9IG54O1xuXHRcdFx0XHRcdGFycmF5WyBpICsgMSBdID0gbnk7XG5cdFx0XHRcdFx0YXJyYXlbIGkgKyAyIF0gPSBuejtcblxuXHRcdFx0XHRcdGFycmF5WyBpICsgMyBdID0gbng7XG5cdFx0XHRcdFx0YXJyYXlbIGkgKyA0IF0gPSBueTtcblx0XHRcdFx0XHRhcnJheVsgaSArIDUgXSA9IG56O1xuXG5cdFx0XHRcdFx0YXJyYXlbIGkgKyA2IF0gPSBueDtcblx0XHRcdFx0XHRhcnJheVsgaSArIDcgXSA9IG55O1xuXHRcdFx0XHRcdGFycmF5WyBpICsgOCBdID0gbno7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdF9nbC5idWZmZXJEYXRhKCBfZ2wuQVJSQVlfQlVGRkVSLCBvYmplY3Qubm9ybWFsQXJyYXksIF9nbC5EWU5BTUlDX0RSQVcgKTtcblxuXHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlcy5ub3JtYWwgKTtcblxuXHRcdFx0X2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGVzLm5vcm1hbCwgMywgX2dsLkZMT0FULCBmYWxzZSwgMCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QuaGFzVXZzICYmIG1hdGVyaWFsLm1hcCApIHtcblxuXHRcdFx0X2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcnMudXYgKTtcblx0XHRcdF9nbC5idWZmZXJEYXRhKCBfZ2wuQVJSQVlfQlVGRkVSLCBvYmplY3QudXZBcnJheSwgX2dsLkRZTkFNSUNfRFJBVyApO1xuXG5cdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLnV2ICk7XG5cblx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlcy51diwgMiwgX2dsLkZMT0FULCBmYWxzZSwgMCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QuaGFzQ29sb3JzICYmIG1hdGVyaWFsLnZlcnRleENvbG9ycyAhPT0gTm9Db2xvcnMgKSB7XG5cblx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXJzLmNvbG9yICk7XG5cdFx0XHRfZ2wuYnVmZmVyRGF0YSggX2dsLkFSUkFZX0JVRkZFUiwgb2JqZWN0LmNvbG9yQXJyYXksIF9nbC5EWU5BTUlDX0RSQVcgKTtcblxuXHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlcy5jb2xvciApO1xuXG5cdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZXMuY29sb3IsIDMsIF9nbC5GTE9BVCwgZmFsc2UsIDAsIDAgKTtcblxuXHRcdH1cblxuXHRcdHN0YXRlLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCk7XG5cblx0XHRfZ2wuZHJhd0FycmF5cyggX2dsLlRSSUFOR0xFUywgMCwgb2JqZWN0LmNvdW50ICk7XG5cblx0XHRvYmplY3QuY291bnQgPSAwO1xuXG5cdH07XG5cblx0dGhpcy5yZW5kZXJCdWZmZXJEaXJlY3QgPSBmdW5jdGlvbiAoIGNhbWVyYSwgZm9nLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIG9iamVjdCwgZ3JvdXAgKSB7XG5cblx0XHR2YXIgZnJvbnRGYWNlQ1cgPSAoIG9iamVjdC5pc01lc2ggJiYgb2JqZWN0Lm1hdHJpeFdvcmxkLmRldGVybWluYW50KCkgPCAwICk7XG5cblx0XHRzdGF0ZS5zZXRNYXRlcmlhbCggbWF0ZXJpYWwsIGZyb250RmFjZUNXICk7XG5cblx0XHR2YXIgcHJvZ3JhbSA9IHNldFByb2dyYW0oIGNhbWVyYSwgZm9nLCBtYXRlcmlhbCwgb2JqZWN0ICk7XG5cdFx0dmFyIGdlb21ldHJ5UHJvZ3JhbSA9IGdlb21ldHJ5LmlkICsgJ18nICsgcHJvZ3JhbS5pZCArICdfJyArICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICk7XG5cblx0XHR2YXIgdXBkYXRlQnVmZmVycyA9IGZhbHNlO1xuXG5cdFx0aWYgKCBnZW9tZXRyeVByb2dyYW0gIT09IF9jdXJyZW50R2VvbWV0cnlQcm9ncmFtICkge1xuXG5cdFx0XHRfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9IGdlb21ldHJ5UHJvZ3JhbTtcblx0XHRcdHVwZGF0ZUJ1ZmZlcnMgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QubW9ycGhUYXJnZXRJbmZsdWVuY2VzICkge1xuXG5cdFx0XHRtb3JwaHRhcmdldHMudXBkYXRlKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcHJvZ3JhbSApO1xuXG5cdFx0XHR1cGRhdGVCdWZmZXJzID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHR2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcblx0XHR2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdHZhciByYW5nZUZhY3RvciA9IDE7XG5cblx0XHRpZiAoIG1hdGVyaWFsLndpcmVmcmFtZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0aW5kZXggPSBnZW9tZXRyaWVzLmdldFdpcmVmcmFtZUF0dHJpYnV0ZSggZ2VvbWV0cnkgKTtcblx0XHRcdHJhbmdlRmFjdG9yID0gMjtcblxuXHRcdH1cblxuXHRcdHZhciBhdHRyaWJ1dGU7XG5cdFx0dmFyIHJlbmRlcmVyID0gYnVmZmVyUmVuZGVyZXI7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldCggaW5kZXggKTtcblxuXHRcdFx0cmVuZGVyZXIgPSBpbmRleGVkQnVmZmVyUmVuZGVyZXI7XG5cdFx0XHRyZW5kZXJlci5zZXRJbmRleCggYXR0cmlidXRlICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHVwZGF0ZUJ1ZmZlcnMgKSB7XG5cblx0XHRcdHNldHVwVmVydGV4QXR0cmlidXRlcyggbWF0ZXJpYWwsIHByb2dyYW0sIGdlb21ldHJ5ICk7XG5cblx0XHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0X2dsLmJpbmRCdWZmZXIoIF9nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgYXR0cmlidXRlLmJ1ZmZlciApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0dmFyIGRhdGFDb3VudCA9IEluZmluaXR5O1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0ZGF0YUNvdW50ID0gaW5kZXguY291bnQ7XG5cblx0XHR9IGVsc2UgaWYgKCBwb3NpdGlvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRkYXRhQ291bnQgPSBwb3NpdGlvbi5jb3VudDtcblxuXHRcdH1cblxuXHRcdHZhciByYW5nZVN0YXJ0ID0gZ2VvbWV0cnkuZHJhd1JhbmdlLnN0YXJ0ICogcmFuZ2VGYWN0b3I7XG5cdFx0dmFyIHJhbmdlQ291bnQgPSBnZW9tZXRyeS5kcmF3UmFuZ2UuY291bnQgKiByYW5nZUZhY3RvcjtcblxuXHRcdHZhciBncm91cFN0YXJ0ID0gZ3JvdXAgIT09IG51bGwgPyBncm91cC5zdGFydCAqIHJhbmdlRmFjdG9yIDogMDtcblx0XHR2YXIgZ3JvdXBDb3VudCA9IGdyb3VwICE9PSBudWxsID8gZ3JvdXAuY291bnQgKiByYW5nZUZhY3RvciA6IEluZmluaXR5O1xuXG5cdFx0dmFyIGRyYXdTdGFydCA9IE1hdGgubWF4KCByYW5nZVN0YXJ0LCBncm91cFN0YXJ0ICk7XG5cdFx0dmFyIGRyYXdFbmQgPSBNYXRoLm1pbiggZGF0YUNvdW50LCByYW5nZVN0YXJ0ICsgcmFuZ2VDb3VudCwgZ3JvdXBTdGFydCArIGdyb3VwQ291bnQgKSAtIDE7XG5cblx0XHR2YXIgZHJhd0NvdW50ID0gTWF0aC5tYXgoIDAsIGRyYXdFbmQgLSBkcmF3U3RhcnQgKyAxICk7XG5cblx0XHRpZiAoIGRyYXdDb3VudCA9PT0gMCApIHJldHVybjtcblxuXHRcdC8vXG5cblx0XHRpZiAoIG9iamVjdC5pc01lc2ggKSB7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHN0YXRlLnNldExpbmVXaWR0aCggbWF0ZXJpYWwud2lyZWZyYW1lTGluZXdpZHRoICogZ2V0VGFyZ2V0UGl4ZWxSYXRpbygpICk7XG5cdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5MSU5FUyApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHN3aXRjaCAoIG9iamVjdC5kcmF3TW9kZSApIHtcblxuXHRcdFx0XHRcdGNhc2UgVHJpYW5nbGVzRHJhd01vZGU6XG5cdFx0XHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuVFJJQU5HTEVTICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgVHJpYW5nbGVTdHJpcERyYXdNb2RlOlxuXHRcdFx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLlRSSUFOR0xFX1NUUklQICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgVHJpYW5nbGVGYW5EcmF3TW9kZTpcblx0XHRcdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5UUklBTkdMRV9GQU4gKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cblx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNMaW5lICkge1xuXG5cdFx0XHR2YXIgbGluZVdpZHRoID0gbWF0ZXJpYWwubGluZXdpZHRoO1xuXG5cdFx0XHRpZiAoIGxpbmVXaWR0aCA9PT0gdW5kZWZpbmVkICkgbGluZVdpZHRoID0gMTsgLy8gTm90IHVzaW5nIExpbmUqTWF0ZXJpYWxcblxuXHRcdFx0c3RhdGUuc2V0TGluZVdpZHRoKCBsaW5lV2lkdGggKiBnZXRUYXJnZXRQaXhlbFJhdGlvKCkgKTtcblxuXHRcdFx0aWYgKCBvYmplY3QuaXNMaW5lU2VnbWVudHMgKSB7XG5cblx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLkxJTkVTICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0xpbmVMb29wICkge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5MSU5FX0xPT1AgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuTElORV9TVFJJUCApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNQb2ludHMgKSB7XG5cblx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5QT0lOVFMgKTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCA+IDAgKSB7XG5cblx0XHRcdFx0cmVuZGVyZXIucmVuZGVySW5zdGFuY2VzKCBnZW9tZXRyeSwgZHJhd1N0YXJ0LCBkcmF3Q291bnQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKCBkcmF3U3RhcnQsIGRyYXdDb3VudCApO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0ZnVuY3Rpb24gc2V0dXBWZXJ0ZXhBdHRyaWJ1dGVzKCBtYXRlcmlhbCwgcHJvZ3JhbSwgZ2VvbWV0cnkgKSB7XG5cblx0XHRpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApID09PSBudWxsICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnNldHVwVmVydGV4QXR0cmlidXRlczogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuJyApO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHN0YXRlLmluaXRBdHRyaWJ1dGVzKCk7XG5cblx0XHR2YXIgZ2VvbWV0cnlBdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblxuXHRcdHZhciBwcm9ncmFtQXR0cmlidXRlcyA9IHByb2dyYW0uZ2V0QXR0cmlidXRlcygpO1xuXG5cdFx0dmFyIG1hdGVyaWFsRGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyA9IG1hdGVyaWFsLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM7XG5cblx0XHRmb3IgKCB2YXIgbmFtZSBpbiBwcm9ncmFtQXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIHByb2dyYW1BdHRyaWJ1dGUgPSBwcm9ncmFtQXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdFx0XHRpZiAoIHByb2dyYW1BdHRyaWJ1dGUgPj0gMCApIHtcblxuXHRcdFx0XHR2YXIgZ2VvbWV0cnlBdHRyaWJ1dGUgPSBnZW9tZXRyeUF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5QXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR2YXIgbm9ybWFsaXplZCA9IGdlb21ldHJ5QXR0cmlidXRlLm5vcm1hbGl6ZWQ7XG5cdFx0XHRcdFx0dmFyIHNpemUgPSBnZW9tZXRyeUF0dHJpYnV0ZS5pdGVtU2l6ZTtcblxuXHRcdFx0XHRcdHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldCggZ2VvbWV0cnlBdHRyaWJ1dGUgKTtcblxuXHRcdFx0XHRcdC8vIFRPRE8gQXR0cmlidXRlIG1heSBub3QgYmUgYXZhaWxhYmxlIG9uIGNvbnRleHQgcmVzdG9yZVxuXG5cdFx0XHRcdFx0aWYgKCBhdHRyaWJ1dGUgPT09IHVuZGVmaW5lZCApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0dmFyIGJ1ZmZlciA9IGF0dHJpYnV0ZS5idWZmZXI7XG5cdFx0XHRcdFx0dmFyIHR5cGUgPSBhdHRyaWJ1dGUudHlwZTtcblx0XHRcdFx0XHR2YXIgYnl0ZXNQZXJFbGVtZW50ID0gYXR0cmlidXRlLmJ5dGVzUGVyRWxlbWVudDtcblxuXHRcdFx0XHRcdGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGRhdGEgPSBnZW9tZXRyeUF0dHJpYnV0ZS5kYXRhO1xuXHRcdFx0XHRcdFx0dmFyIHN0cmlkZSA9IGRhdGEuc3RyaWRlO1xuXHRcdFx0XHRcdFx0dmFyIG9mZnNldCA9IGdlb21ldHJ5QXR0cmlidXRlLm9mZnNldDtcblxuXHRcdFx0XHRcdFx0aWYgKCBkYXRhICYmIGRhdGEuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciApIHtcblxuXHRcdFx0XHRcdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBwcm9ncmFtQXR0cmlidXRlLCBkYXRhLm1lc2hQZXJBdHRyaWJ1dGUgKTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCA9IGRhdGEubWVzaFBlckF0dHJpYnV0ZSAqIGRhdGEuY291bnQ7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIgKTtcblx0XHRcdFx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlLCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUgKiBieXRlc1BlckVsZW1lbnQsIG9mZnNldCAqIGJ5dGVzUGVyRWxlbWVudCApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBnZW9tZXRyeUF0dHJpYnV0ZS5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0XHRcdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBwcm9ncmFtQXR0cmlidXRlLCBnZW9tZXRyeUF0dHJpYnV0ZS5tZXNoUGVyQXR0cmlidXRlICk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Z2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgPSBnZW9tZXRyeUF0dHJpYnV0ZS5tZXNoUGVyQXR0cmlidXRlICogZ2VvbWV0cnlBdHRyaWJ1dGUuY291bnQ7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIgKTtcblx0XHRcdFx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlLCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCAwLCAwICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWxEZWZhdWx0QXR0cmlidXRlVmFsdWVzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR2YXIgdmFsdWUgPSBtYXRlcmlhbERlZmF1bHRBdHRyaWJ1dGVWYWx1ZXNbIG5hbWUgXTtcblxuXHRcdFx0XHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0c3dpdGNoICggdmFsdWUubGVuZ3RoICkge1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgMjpcblx0XHRcdFx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliMmZ2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgMzpcblx0XHRcdFx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliM2Z2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgNDpcblx0XHRcdFx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliNGZ2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdFx0X2dsLnZlcnRleEF0dHJpYjFmdiggcHJvZ3JhbUF0dHJpYnV0ZSwgdmFsdWUgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0c3RhdGUuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKTtcblxuXHR9XG5cblx0Ly8gQ29tcGlsZVxuXG5cdHRoaXMuY29tcGlsZSA9IGZ1bmN0aW9uICggc2NlbmUsIGNhbWVyYSApIHtcblxuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlcy5nZXQoIHNjZW5lLCBjYW1lcmEgKTtcblx0XHRjdXJyZW50UmVuZGVyU3RhdGUuaW5pdCgpO1xuXG5cdFx0c2NlbmUudHJhdmVyc2UoIGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5pc0xpZ2h0ICkge1xuXG5cdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoTGlnaHQoIG9iamVjdCApO1xuXG5cdFx0XHRcdGlmICggb2JqZWN0LmNhc3RTaGFkb3cgKSB7XG5cblx0XHRcdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUucHVzaFNoYWRvdyggb2JqZWN0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9ICk7XG5cblx0XHRjdXJyZW50UmVuZGVyU3RhdGUuc2V0dXBMaWdodHMoIGNhbWVyYSApO1xuXG5cdFx0c2NlbmUudHJhdmVyc2UoIGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5tYXRlcmlhbCApIHtcblxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG9iamVjdC5tYXRlcmlhbCApICkge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgb2JqZWN0Lm1hdGVyaWFsLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0aW5pdE1hdGVyaWFsKCBvYmplY3QubWF0ZXJpYWxbIGkgXSwgc2NlbmUuZm9nLCBvYmplY3QgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aW5pdE1hdGVyaWFsKCBvYmplY3QubWF0ZXJpYWwsIHNjZW5lLmZvZywgb2JqZWN0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9ICk7XG5cblx0fTtcblxuXHQvLyBBbmltYXRpb24gTG9vcFxuXG5cdHZhciBpc0FuaW1hdGluZyA9IGZhbHNlO1xuXHR2YXIgb25BbmltYXRpb25GcmFtZSA9IG51bGw7XG5cblx0ZnVuY3Rpb24gc3RhcnRBbmltYXRpb24oKSB7XG5cblx0XHRpZiAoIGlzQW5pbWF0aW5nICkgcmV0dXJuO1xuXG5cdFx0cmVxdWVzdEFuaW1hdGlvbkxvb3BGcmFtZSgpO1xuXG5cdFx0aXNBbmltYXRpbmcgPSB0cnVlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzdG9wQW5pbWF0aW9uKCkge1xuXG5cdFx0aXNBbmltYXRpbmcgPSBmYWxzZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVxdWVzdEFuaW1hdGlvbkxvb3BGcmFtZSgpIHtcblxuXHRcdHZhciBkZXZpY2UgPSB2ci5nZXREZXZpY2UoKTtcblxuXHRcdGlmICggZGV2aWNlICYmIGRldmljZS5pc1ByZXNlbnRpbmcgKSB7XG5cblx0XHRcdGRldmljZS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGFuaW1hdGlvbkxvb3AgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGFuaW1hdGlvbkxvb3AgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gYW5pbWF0aW9uTG9vcCggdGltZSApIHtcblxuXHRcdGlmICggaXNBbmltYXRpbmcgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0b25BbmltYXRpb25GcmFtZSggdGltZSApO1xuXG5cdFx0cmVxdWVzdEFuaW1hdGlvbkxvb3BGcmFtZSgpO1xuXG5cdH1cblxuXHR0aGlzLmFuaW1hdGUgPSBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0b25BbmltYXRpb25GcmFtZSA9IGNhbGxiYWNrO1xuXHRcdG9uQW5pbWF0aW9uRnJhbWUgIT09IG51bGwgPyBzdGFydEFuaW1hdGlvbigpIDogc3RvcEFuaW1hdGlvbigpO1xuXG5cdH07XG5cblx0Ly8gUmVuZGVyaW5nXG5cblx0dGhpcy5yZW5kZXIgPSBmdW5jdGlvbiAoIHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldCwgZm9yY2VDbGVhciApIHtcblxuXHRcdGlmICggISAoIGNhbWVyYSAmJiBjYW1lcmEuaXNDYW1lcmEgKSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVuZGVyOiBjYW1lcmEgaXMgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkNhbWVyYS4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIF9pc0NvbnRleHRMb3N0ICkgcmV0dXJuO1xuXG5cdFx0Ly8gcmVzZXQgY2FjaGluZyBmb3IgdGhpcyBmcmFtZVxuXG5cdFx0X2N1cnJlbnRHZW9tZXRyeVByb2dyYW0gPSAnJztcblx0XHRfY3VycmVudE1hdGVyaWFsSWQgPSAtIDE7XG5cdFx0X2N1cnJlbnRDYW1lcmEgPSBudWxsO1xuXG5cdFx0Ly8gdXBkYXRlIHNjZW5lIGdyYXBoXG5cblx0XHRpZiAoIHNjZW5lLmF1dG9VcGRhdGUgPT09IHRydWUgKSBzY2VuZS51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0Ly8gdXBkYXRlIGNhbWVyYSBtYXRyaWNlcyBhbmQgZnJ1c3R1bVxuXG5cdFx0aWYgKCBjYW1lcmEucGFyZW50ID09PSBudWxsICkgY2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHRpZiAoIHZyLmVuYWJsZWQgKSB7XG5cblx0XHRcdGNhbWVyYSA9IHZyLmdldENhbWVyYSggY2FtZXJhICk7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0Y3VycmVudFJlbmRlclN0YXRlID0gcmVuZGVyU3RhdGVzLmdldCggc2NlbmUsIGNhbWVyYSApO1xuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5pbml0KCk7XG5cblx0XHRzY2VuZS5vbkJlZm9yZVJlbmRlciggX3RoaXMsIHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldCApO1xuXG5cdFx0X3Byb2pTY3JlZW5NYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblx0XHRfZnJ1c3R1bS5zZXRGcm9tTWF0cml4KCBfcHJvalNjcmVlbk1hdHJpeCApO1xuXG5cdFx0X2xvY2FsQ2xpcHBpbmdFbmFibGVkID0gdGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZDtcblx0XHRfY2xpcHBpbmdFbmFibGVkID0gX2NsaXBwaW5nLmluaXQoIHRoaXMuY2xpcHBpbmdQbGFuZXMsIF9sb2NhbENsaXBwaW5nRW5hYmxlZCwgY2FtZXJhICk7XG5cblx0XHRjdXJyZW50UmVuZGVyTGlzdCA9IHJlbmRlckxpc3RzLmdldCggc2NlbmUsIGNhbWVyYSApO1xuXHRcdGN1cnJlbnRSZW5kZXJMaXN0LmluaXQoKTtcblxuXHRcdHByb2plY3RPYmplY3QoIHNjZW5lLCBjYW1lcmEsIF90aGlzLnNvcnRPYmplY3RzICk7XG5cblx0XHRpZiAoIF90aGlzLnNvcnRPYmplY3RzID09PSB0cnVlICkge1xuXG5cdFx0XHRjdXJyZW50UmVuZGVyTGlzdC5zb3J0KCk7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0aWYgKCBfY2xpcHBpbmdFbmFibGVkICkgX2NsaXBwaW5nLmJlZ2luU2hhZG93cygpO1xuXG5cdFx0dmFyIHNoYWRvd3NBcnJheSA9IGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS5zaGFkb3dzQXJyYXk7XG5cblx0XHRzaGFkb3dNYXAucmVuZGVyKCBzaGFkb3dzQXJyYXksIHNjZW5lLCBjYW1lcmEgKTtcblxuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5zZXR1cExpZ2h0cyggY2FtZXJhICk7XG5cblx0XHRpZiAoIF9jbGlwcGluZ0VuYWJsZWQgKSBfY2xpcHBpbmcuZW5kU2hhZG93cygpO1xuXG5cdFx0Ly9cblxuXHRcdGlmICggdGhpcy5pbmZvLmF1dG9SZXNldCApIHRoaXMuaW5mby5yZXNldCgpO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0ID0gbnVsbDtcblxuXHRcdH1cblxuXHRcdHRoaXMuc2V0UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdC8vXG5cblx0XHRiYWNrZ3JvdW5kLnJlbmRlciggY3VycmVudFJlbmRlckxpc3QsIHNjZW5lLCBjYW1lcmEsIGZvcmNlQ2xlYXIgKTtcblxuXHRcdC8vIHJlbmRlciBzY2VuZVxuXG5cdFx0dmFyIG9wYXF1ZU9iamVjdHMgPSBjdXJyZW50UmVuZGVyTGlzdC5vcGFxdWU7XG5cdFx0dmFyIHRyYW5zcGFyZW50T2JqZWN0cyA9IGN1cnJlbnRSZW5kZXJMaXN0LnRyYW5zcGFyZW50O1xuXG5cdFx0aWYgKCBzY2VuZS5vdmVycmlkZU1hdGVyaWFsICkge1xuXG5cdFx0XHR2YXIgb3ZlcnJpZGVNYXRlcmlhbCA9IHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWw7XG5cblx0XHRcdGlmICggb3BhcXVlT2JqZWN0cy5sZW5ndGggKSByZW5kZXJPYmplY3RzKCBvcGFxdWVPYmplY3RzLCBzY2VuZSwgY2FtZXJhLCBvdmVycmlkZU1hdGVyaWFsICk7XG5cdFx0XHRpZiAoIHRyYW5zcGFyZW50T2JqZWN0cy5sZW5ndGggKSByZW5kZXJPYmplY3RzKCB0cmFuc3BhcmVudE9iamVjdHMsIHNjZW5lLCBjYW1lcmEsIG92ZXJyaWRlTWF0ZXJpYWwgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIG9wYXF1ZSBwYXNzIChmcm9udC10by1iYWNrIG9yZGVyKVxuXG5cdFx0XHRpZiAoIG9wYXF1ZU9iamVjdHMubGVuZ3RoICkgcmVuZGVyT2JqZWN0cyggb3BhcXVlT2JqZWN0cywgc2NlbmUsIGNhbWVyYSApO1xuXG5cdFx0XHQvLyB0cmFuc3BhcmVudCBwYXNzIChiYWNrLXRvLWZyb250IG9yZGVyKVxuXG5cdFx0XHRpZiAoIHRyYW5zcGFyZW50T2JqZWN0cy5sZW5ndGggKSByZW5kZXJPYmplY3RzKCB0cmFuc3BhcmVudE9iamVjdHMsIHNjZW5lLCBjYW1lcmEgKTtcblxuXHRcdH1cblxuXHRcdC8vIGN1c3RvbSByZW5kZXJlcnNcblxuXHRcdHZhciBzcHJpdGVzQXJyYXkgPSBjdXJyZW50UmVuZGVyU3RhdGUuc3RhdGUuc3ByaXRlc0FycmF5O1xuXG5cdFx0c3ByaXRlUmVuZGVyZXIucmVuZGVyKCBzcHJpdGVzQXJyYXksIHNjZW5lLCBjYW1lcmEgKTtcblxuXHRcdC8vIEdlbmVyYXRlIG1pcG1hcCBpZiB3ZSdyZSB1c2luZyBhbnkga2luZCBvZiBtaXBtYXAgZmlsdGVyaW5nXG5cblx0XHRpZiAoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0dGV4dHVyZXMudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdH1cblxuXHRcdC8vIEVuc3VyZSBkZXB0aCBidWZmZXIgd3JpdGluZyBpcyBlbmFibGVkIHNvIGl0IGNhbiBiZSBjbGVhcmVkIG9uIG5leHQgcmVuZGVyXG5cblx0XHRzdGF0ZS5idWZmZXJzLmRlcHRoLnNldFRlc3QoIHRydWUgKTtcblx0XHRzdGF0ZS5idWZmZXJzLmRlcHRoLnNldE1hc2soIHRydWUgKTtcblx0XHRzdGF0ZS5idWZmZXJzLmNvbG9yLnNldE1hc2soIHRydWUgKTtcblxuXHRcdHN0YXRlLnNldFBvbHlnb25PZmZzZXQoIGZhbHNlICk7XG5cblx0XHRzY2VuZS5vbkFmdGVyUmVuZGVyKCBfdGhpcywgc2NlbmUsIGNhbWVyYSApO1xuXG5cdFx0aWYgKCB2ci5lbmFibGVkICkge1xuXG5cdFx0XHR2ci5zdWJtaXRGcmFtZSgpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gX2dsLmZpbmlzaCgpO1xuXG5cdFx0Y3VycmVudFJlbmRlckxpc3QgPSBudWxsO1xuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZSA9IG51bGw7XG5cblx0fTtcblxuXHQvKlxuXHQvLyBUT0RPIER1cGxpY2F0ZWQgY29kZSAoRnJ1c3R1bSlcblxuXHR2YXIgX3NwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRmdW5jdGlvbiBpc09iamVjdFZpZXdhYmxlKCBvYmplY3QgKSB7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsIClcblx0XHRcdGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0X3NwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApLlxuXHRcdGFwcGx5TWF0cml4NCggb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cblx0XHRyZXR1cm4gaXNTcGhlcmVWaWV3YWJsZSggX3NwaGVyZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBpc1Nwcml0ZVZpZXdhYmxlKCBzcHJpdGUgKSB7XG5cblx0XHRfc3BoZXJlLmNlbnRlci5zZXQoIDAsIDAsIDAgKTtcblx0XHRfc3BoZXJlLnJhZGl1cyA9IDAuNzA3MTA2NzgxMTg2NTQ3Njtcblx0XHRfc3BoZXJlLmFwcGx5TWF0cml4NCggc3ByaXRlLm1hdHJpeFdvcmxkICk7XG5cblx0XHRyZXR1cm4gaXNTcGhlcmVWaWV3YWJsZSggX3NwaGVyZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBpc1NwaGVyZVZpZXdhYmxlKCBzcGhlcmUgKSB7XG5cblx0XHRpZiAoICEgX2ZydXN0dW0uaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkgKSByZXR1cm4gZmFsc2U7XG5cblx0XHR2YXIgbnVtUGxhbmVzID0gX2NsaXBwaW5nLm51bVBsYW5lcztcblxuXHRcdGlmICggbnVtUGxhbmVzID09PSAwICkgcmV0dXJuIHRydWU7XG5cblx0XHR2YXIgcGxhbmVzID0gX3RoaXMuY2xpcHBpbmdQbGFuZXMsXG5cblx0XHRcdGNlbnRlciA9IHNwaGVyZS5jZW50ZXIsXG5cdFx0XHRuZWdSYWQgPSAtIHNwaGVyZS5yYWRpdXMsXG5cdFx0XHRpID0gMDtcblxuXHRcdGRvIHtcblxuXHRcdFx0Ly8gb3V0IHdoZW4gZGVlcGVyIHRoYW4gcmFkaXVzIGluIHRoZSBuZWdhdGl2ZSBoYWxmc3BhY2Vcblx0XHRcdGlmICggcGxhbmVzWyBpIF0uZGlzdGFuY2VUb1BvaW50KCBjZW50ZXIgKSA8IG5lZ1JhZCApIHJldHVybiBmYWxzZTtcblxuXHRcdH0gd2hpbGUgKCArKyBpICE9PSBudW1QbGFuZXMgKTtcblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH1cblx0Ki9cblxuXHRmdW5jdGlvbiBwcm9qZWN0T2JqZWN0KCBvYmplY3QsIGNhbWVyYSwgc29ydE9iamVjdHMgKSB7XG5cblx0XHRpZiAoIG9iamVjdC52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdHZhciB2aXNpYmxlID0gb2JqZWN0LmxheWVycy50ZXN0KCBjYW1lcmEubGF5ZXJzICk7XG5cblx0XHRpZiAoIHZpc2libGUgKSB7XG5cblx0XHRcdGlmICggb2JqZWN0LmlzTGlnaHQgKSB7XG5cblx0XHRcdFx0Y3VycmVudFJlbmRlclN0YXRlLnB1c2hMaWdodCggb2JqZWN0ICk7XG5cblx0XHRcdFx0aWYgKCBvYmplY3QuY2FzdFNoYWRvdyApIHtcblxuXHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoU2hhZG93KCBvYmplY3QgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc1Nwcml0ZSApIHtcblxuXHRcdFx0XHRpZiAoICEgb2JqZWN0LmZydXN0dW1DdWxsZWQgfHwgX2ZydXN0dW0uaW50ZXJzZWN0c1Nwcml0ZSggb2JqZWN0ICkgKSB7XG5cblx0XHRcdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUucHVzaFNwcml0ZSggb2JqZWN0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3QgKSB7XG5cblx0XHRcdFx0aWYgKCBzb3J0T2JqZWN0cyApIHtcblxuXHRcdFx0XHRcdF92ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggb2JqZWN0Lm1hdHJpeFdvcmxkIClcblx0XHRcdFx0XHRcdC5hcHBseU1hdHJpeDQoIF9wcm9qU2NyZWVuTWF0cml4ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgbnVsbCwgb2JqZWN0Lm1hdGVyaWFsLCBfdmVjdG9yMy56LCBudWxsICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc01lc2ggfHwgb2JqZWN0LmlzTGluZSB8fCBvYmplY3QuaXNQb2ludHMgKSB7XG5cblx0XHRcdFx0aWYgKCBvYmplY3QuaXNTa2lubmVkTWVzaCApIHtcblxuXHRcdFx0XHRcdG9iamVjdC5za2VsZXRvbi51cGRhdGUoKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVkIHx8IF9mcnVzdHVtLmludGVyc2VjdHNPYmplY3QoIG9iamVjdCApICkge1xuXG5cdFx0XHRcdFx0aWYgKCBzb3J0T2JqZWN0cyApIHtcblxuXHRcdFx0XHRcdFx0X3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBvYmplY3QubWF0cml4V29ybGQgKVxuXHRcdFx0XHRcdFx0XHQuYXBwbHlNYXRyaXg0KCBfcHJvalNjcmVlbk1hdHJpeCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0cy51cGRhdGUoIG9iamVjdCApO1xuXHRcdFx0XHRcdHZhciBtYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDtcblxuXHRcdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwgKSApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cdFx0XHRcdFx0XHRcdHZhciBncm91cE1hdGVyaWFsID0gbWF0ZXJpYWxbIGdyb3VwLm1hdGVyaWFsSW5kZXggXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGdyb3VwTWF0ZXJpYWwgJiYgZ3JvdXBNYXRlcmlhbC52aXNpYmxlICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Y3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgZ3JvdXBNYXRlcmlhbCwgX3ZlY3RvcjMueiwgZ3JvdXAgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnZpc2libGUgKSB7XG5cblx0XHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBfdmVjdG9yMy56LCBudWxsICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRwcm9qZWN0T2JqZWN0KCBjaGlsZHJlblsgaSBdLCBjYW1lcmEsIHNvcnRPYmplY3RzICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlck9iamVjdHMoIHJlbmRlckxpc3QsIHNjZW5lLCBjYW1lcmEsIG92ZXJyaWRlTWF0ZXJpYWwgKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSByZW5kZXJMaXN0Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciByZW5kZXJJdGVtID0gcmVuZGVyTGlzdFsgaSBdO1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gcmVuZGVySXRlbS5vYmplY3Q7XG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSByZW5kZXJJdGVtLmdlb21ldHJ5O1xuXHRcdFx0dmFyIG1hdGVyaWFsID0gb3ZlcnJpZGVNYXRlcmlhbCA9PT0gdW5kZWZpbmVkID8gcmVuZGVySXRlbS5tYXRlcmlhbCA6IG92ZXJyaWRlTWF0ZXJpYWw7XG5cdFx0XHR2YXIgZ3JvdXAgPSByZW5kZXJJdGVtLmdyb3VwO1xuXG5cdFx0XHRpZiAoIGNhbWVyYS5pc0FycmF5Q2FtZXJhICkge1xuXG5cdFx0XHRcdF9jdXJyZW50QXJyYXlDYW1lcmEgPSBjYW1lcmE7XG5cblx0XHRcdFx0dmFyIGNhbWVyYXMgPSBjYW1lcmEuY2FtZXJhcztcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gY2FtZXJhcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRcdHZhciBjYW1lcmEyID0gY2FtZXJhc1sgaiBdO1xuXG5cdFx0XHRcdFx0aWYgKCBvYmplY3QubGF5ZXJzLnRlc3QoIGNhbWVyYTIubGF5ZXJzICkgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBib3VuZHMgPSBjYW1lcmEyLmJvdW5kcztcblxuXHRcdFx0XHRcdFx0dmFyIHggPSBib3VuZHMueCAqIF93aWR0aDtcblx0XHRcdFx0XHRcdHZhciB5ID0gYm91bmRzLnkgKiBfaGVpZ2h0O1xuXHRcdFx0XHRcdFx0dmFyIHdpZHRoID0gYm91bmRzLnogKiBfd2lkdGg7XG5cdFx0XHRcdFx0XHR2YXIgaGVpZ2h0ID0gYm91bmRzLncgKiBfaGVpZ2h0O1xuXG5cdFx0XHRcdFx0XHRzdGF0ZS52aWV3cG9ydCggX2N1cnJlbnRWaWV3cG9ydC5zZXQoIHgsIHksIHdpZHRoLCBoZWlnaHQgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKSApO1xuXG5cdFx0XHRcdFx0XHRyZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYTIsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0X2N1cnJlbnRBcnJheUNhbWVyYSA9IG51bGw7XG5cblx0XHRcdFx0cmVuZGVyT2JqZWN0KCBvYmplY3QsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApIHtcblxuXHRcdG9iamVjdC5vbkJlZm9yZVJlbmRlciggX3RoaXMsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblx0XHRjdXJyZW50UmVuZGVyU3RhdGUgPSByZW5kZXJTdGF0ZXMuZ2V0KCBzY2VuZSwgX2N1cnJlbnRBcnJheUNhbWVyYSB8fCBjYW1lcmEgKTtcblxuXHRcdG9iamVjdC5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cdFx0b2JqZWN0Lm5vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIG9iamVjdC5tb2RlbFZpZXdNYXRyaXggKTtcblxuXHRcdGlmICggb2JqZWN0LmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0ICkge1xuXG5cdFx0XHR2YXIgZnJvbnRGYWNlQ1cgPSAoIG9iamVjdC5pc01lc2ggJiYgb2JqZWN0Lm1hdHJpeFdvcmxkLmRldGVybWluYW50KCkgPCAwICk7XG5cblx0XHRcdHN0YXRlLnNldE1hdGVyaWFsKCBtYXRlcmlhbCwgZnJvbnRGYWNlQ1cgKTtcblxuXHRcdFx0dmFyIHByb2dyYW0gPSBzZXRQcm9ncmFtKCBjYW1lcmEsIHNjZW5lLmZvZywgbWF0ZXJpYWwsIG9iamVjdCApO1xuXG5cdFx0XHRfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9ICcnO1xuXG5cdFx0XHRyZW5kZXJPYmplY3RJbW1lZGlhdGUoIG9iamVjdCwgcHJvZ3JhbSwgbWF0ZXJpYWwgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdF90aGlzLnJlbmRlckJ1ZmZlckRpcmVjdCggY2FtZXJhLCBzY2VuZS5mb2csIGdlb21ldHJ5LCBtYXRlcmlhbCwgb2JqZWN0LCBncm91cCApO1xuXG5cdFx0fVxuXG5cdFx0b2JqZWN0Lm9uQWZ0ZXJSZW5kZXIoIF90aGlzLCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICk7XG5cdFx0Y3VycmVudFJlbmRlclN0YXRlID0gcmVuZGVyU3RhdGVzLmdldCggc2NlbmUsIF9jdXJyZW50QXJyYXlDYW1lcmEgfHwgY2FtZXJhICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGluaXRNYXRlcmlhbCggbWF0ZXJpYWwsIGZvZywgb2JqZWN0ICkge1xuXG5cdFx0dmFyIG1hdGVyaWFsUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApO1xuXG5cdFx0dmFyIGxpZ2h0cyA9IGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS5saWdodHM7XG5cdFx0dmFyIHNoYWRvd3NBcnJheSA9IGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS5zaGFkb3dzQXJyYXk7XG5cblx0XHR2YXIgcGFyYW1ldGVycyA9IHByb2dyYW1DYWNoZS5nZXRQYXJhbWV0ZXJzKFxuXHRcdFx0bWF0ZXJpYWwsIGxpZ2h0cy5zdGF0ZSwgc2hhZG93c0FycmF5LCBmb2csIF9jbGlwcGluZy5udW1QbGFuZXMsIF9jbGlwcGluZy5udW1JbnRlcnNlY3Rpb24sIG9iamVjdCApO1xuXG5cdFx0dmFyIGNvZGUgPSBwcm9ncmFtQ2FjaGUuZ2V0UHJvZ3JhbUNvZGUoIG1hdGVyaWFsLCBwYXJhbWV0ZXJzICk7XG5cblx0XHR2YXIgcHJvZ3JhbSA9IG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtO1xuXHRcdHZhciBwcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcblxuXHRcdGlmICggcHJvZ3JhbSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBuZXcgbWF0ZXJpYWxcblx0XHRcdG1hdGVyaWFsLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25NYXRlcmlhbERpc3Bvc2UgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHByb2dyYW0uY29kZSAhPT0gY29kZSApIHtcblxuXHRcdFx0Ly8gY2hhbmdlZCBnbHNsIG9yIHBhcmFtZXRlcnNcblx0XHRcdHJlbGVhc2VNYXRlcmlhbFByb2dyYW1SZWZlcmVuY2UoIG1hdGVyaWFsICk7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMubGlnaHRzSGFzaCAhPT0gbGlnaHRzLnN0YXRlLmhhc2ggKSB7XG5cblx0XHRcdHByb3BlcnRpZXMudXBkYXRlKCBtYXRlcmlhbCwgJ2xpZ2h0c0hhc2gnLCBsaWdodHMuc3RhdGUuaGFzaCApO1xuXHRcdFx0cHJvZ3JhbUNoYW5nZSA9IGZhbHNlO1xuXG5cdFx0fSBlbHNlIGlmICggcGFyYW1ldGVycy5zaGFkZXJJRCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBzYW1lIGdsc2wgYW5kIHVuaWZvcm0gbGlzdFxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gb25seSByZWJ1aWxkIHVuaWZvcm0gbGlzdFxuXHRcdFx0cHJvZ3JhbUNoYW5nZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwcm9ncmFtQ2hhbmdlICkge1xuXG5cdFx0XHRpZiAoIHBhcmFtZXRlcnMuc2hhZGVySUQgKSB7XG5cblx0XHRcdFx0dmFyIHNoYWRlciA9IFNoYWRlckxpYlsgcGFyYW1ldGVycy5zaGFkZXJJRCBdO1xuXG5cdFx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5zaGFkZXIgPSB7XG5cdFx0XHRcdFx0bmFtZTogbWF0ZXJpYWwudHlwZSxcblx0XHRcdFx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5jbG9uZSggc2hhZGVyLnVuaWZvcm1zICksXG5cdFx0XHRcdFx0dmVydGV4U2hhZGVyOiBzaGFkZXIudmVydGV4U2hhZGVyLFxuXHRcdFx0XHRcdGZyYWdtZW50U2hhZGVyOiBzaGFkZXIuZnJhZ21lbnRTaGFkZXJcblx0XHRcdFx0fTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVyID0ge1xuXHRcdFx0XHRcdG5hbWU6IG1hdGVyaWFsLnR5cGUsXG5cdFx0XHRcdFx0dW5pZm9ybXM6IG1hdGVyaWFsLnVuaWZvcm1zLFxuXHRcdFx0XHRcdHZlcnRleFNoYWRlcjogbWF0ZXJpYWwudmVydGV4U2hhZGVyLFxuXHRcdFx0XHRcdGZyYWdtZW50U2hhZGVyOiBtYXRlcmlhbC5mcmFnbWVudFNoYWRlclxuXHRcdFx0XHR9O1xuXG5cdFx0XHR9XG5cblx0XHRcdG1hdGVyaWFsLm9uQmVmb3JlQ29tcGlsZSggbWF0ZXJpYWxQcm9wZXJ0aWVzLnNoYWRlciwgX3RoaXMgKTtcblxuXHRcdFx0cHJvZ3JhbSA9IHByb2dyYW1DYWNoZS5hY3F1aXJlUHJvZ3JhbSggbWF0ZXJpYWwsIG1hdGVyaWFsUHJvcGVydGllcy5zaGFkZXIsIHBhcmFtZXRlcnMsIGNvZGUgKTtcblxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLnByb2dyYW0gPSBwcm9ncmFtO1xuXHRcdFx0bWF0ZXJpYWwucHJvZ3JhbSA9IHByb2dyYW07XG5cblx0XHR9XG5cblx0XHR2YXIgcHJvZ3JhbUF0dHJpYnV0ZXMgPSBwcm9ncmFtLmdldEF0dHJpYnV0ZXMoKTtcblxuXHRcdGlmICggbWF0ZXJpYWwubW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRtYXRlcmlhbC5udW1TdXBwb3J0ZWRNb3JwaFRhcmdldHMgPSAwO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBfdGhpcy5tYXhNb3JwaFRhcmdldHM7IGkgKysgKSB7XG5cblx0XHRcdFx0aWYgKCBwcm9ncmFtQXR0cmlidXRlc1sgJ21vcnBoVGFyZ2V0JyArIGkgXSA+PSAwICkge1xuXG5cdFx0XHRcdFx0bWF0ZXJpYWwubnVtU3VwcG9ydGVkTW9ycGhUYXJnZXRzICsrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5tb3JwaE5vcm1hbHMgKSB7XG5cblx0XHRcdG1hdGVyaWFsLm51bVN1cHBvcnRlZE1vcnBoTm9ybWFscyA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IF90aGlzLm1heE1vcnBoTm9ybWFsczsgaSArKyApIHtcblxuXHRcdFx0XHRpZiAoIHByb2dyYW1BdHRyaWJ1dGVzWyAnbW9ycGhOb3JtYWwnICsgaSBdID49IDAgKSB7XG5cblx0XHRcdFx0XHRtYXRlcmlhbC5udW1TdXBwb3J0ZWRNb3JwaE5vcm1hbHMgKys7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgdW5pZm9ybXMgPSBtYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVyLnVuaWZvcm1zO1xuXG5cdFx0aWYgKCAhIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgJiZcblx0XHRcdCEgbWF0ZXJpYWwuaXNSYXdTaGFkZXJNYXRlcmlhbCB8fFxuXHRcdFx0bWF0ZXJpYWwuY2xpcHBpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5udW1DbGlwcGluZ1BsYW5lcyA9IF9jbGlwcGluZy5udW1QbGFuZXM7XG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMubnVtSW50ZXJzZWN0aW9uID0gX2NsaXBwaW5nLm51bUludGVyc2VjdGlvbjtcblx0XHRcdHVuaWZvcm1zLmNsaXBwaW5nUGxhbmVzID0gX2NsaXBwaW5nLnVuaWZvcm07XG5cblx0XHR9XG5cblx0XHRtYXRlcmlhbFByb3BlcnRpZXMuZm9nID0gZm9nO1xuXG5cdFx0Ly8gc3RvcmUgdGhlIGxpZ2h0IHNldHVwIGl0IHdhcyBjcmVhdGVkIGZvclxuXG5cdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLmxpZ2h0c0hhc2ggPSBsaWdodHMuc3RhdGUuaGFzaDtcblxuXHRcdGlmICggbWF0ZXJpYWwubGlnaHRzICkge1xuXG5cdFx0XHQvLyB3aXJlIHVwIHRoZSBtYXRlcmlhbCB0byB0aGlzIHJlbmRlcmVyJ3MgbGlnaHRpbmcgc3RhdGVcblxuXHRcdFx0dW5pZm9ybXMuYW1iaWVudExpZ2h0Q29sb3IudmFsdWUgPSBsaWdodHMuc3RhdGUuYW1iaWVudDtcblx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbmFsTGlnaHRzLnZhbHVlID0gbGlnaHRzLnN0YXRlLmRpcmVjdGlvbmFsO1xuXHRcdFx0dW5pZm9ybXMuc3BvdExpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90O1xuXHRcdFx0dW5pZm9ybXMucmVjdEFyZWFMaWdodHMudmFsdWUgPSBsaWdodHMuc3RhdGUucmVjdEFyZWE7XG5cdFx0XHR1bmlmb3Jtcy5wb2ludExpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5wb2ludDtcblx0XHRcdHVuaWZvcm1zLmhlbWlzcGhlcmVMaWdodHMudmFsdWUgPSBsaWdodHMuc3RhdGUuaGVtaTtcblxuXHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uYWxTaGFkb3dNYXAudmFsdWUgPSBsaWdodHMuc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXA7XG5cdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeDtcblx0XHRcdHVuaWZvcm1zLnNwb3RTaGFkb3dNYXAudmFsdWUgPSBsaWdodHMuc3RhdGUuc3BvdFNoYWRvd01hcDtcblx0XHRcdHVuaWZvcm1zLnNwb3RTaGFkb3dNYXRyaXgudmFsdWUgPSBsaWdodHMuc3RhdGUuc3BvdFNoYWRvd01hdHJpeDtcblx0XHRcdHVuaWZvcm1zLnBvaW50U2hhZG93TWFwLnZhbHVlID0gbGlnaHRzLnN0YXRlLnBvaW50U2hhZG93TWFwO1xuXHRcdFx0dW5pZm9ybXMucG9pbnRTaGFkb3dNYXRyaXgudmFsdWUgPSBsaWdodHMuc3RhdGUucG9pbnRTaGFkb3dNYXRyaXg7XG5cdFx0XHQvLyBUT0RPIChhYmVsbmF0aW9uKTogYWRkIGFyZWEgbGlnaHRzIHNoYWRvdyBpbmZvIHRvIHVuaWZvcm1zXG5cblx0XHR9XG5cblx0XHR2YXIgcHJvZ1VuaWZvcm1zID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLnByb2dyYW0uZ2V0VW5pZm9ybXMoKSxcblx0XHRcdHVuaWZvcm1zTGlzdCA9XG5cdFx0XHRcdFdlYkdMVW5pZm9ybXMuc2VxV2l0aFZhbHVlKCBwcm9nVW5pZm9ybXMuc2VxLCB1bmlmb3JtcyApO1xuXG5cdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLnVuaWZvcm1zTGlzdCA9IHVuaWZvcm1zTGlzdDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0UHJvZ3JhbSggY2FtZXJhLCBmb2csIG1hdGVyaWFsLCBvYmplY3QgKSB7XG5cblx0XHRfdXNlZFRleHR1cmVVbml0cyA9IDA7XG5cblx0XHR2YXIgbWF0ZXJpYWxQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICk7XG5cdFx0dmFyIGxpZ2h0cyA9IGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS5saWdodHM7XG5cblx0XHRpZiAoIF9jbGlwcGluZ0VuYWJsZWQgKSB7XG5cblx0XHRcdGlmICggX2xvY2FsQ2xpcHBpbmdFbmFibGVkIHx8IGNhbWVyYSAhPT0gX2N1cnJlbnRDYW1lcmEgKSB7XG5cblx0XHRcdFx0dmFyIHVzZUNhY2hlID1cblx0XHRcdFx0XHRjYW1lcmEgPT09IF9jdXJyZW50Q2FtZXJhICYmXG5cdFx0XHRcdFx0bWF0ZXJpYWwuaWQgPT09IF9jdXJyZW50TWF0ZXJpYWxJZDtcblxuXHRcdFx0XHQvLyB3ZSBtaWdodCB3YW50IHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHNvbWUgQ2xpcHBpbmdHcm91cFxuXHRcdFx0XHQvLyBvYmplY3QgaW5zdGVhZCBvZiB0aGUgbWF0ZXJpYWwsIG9uY2UgaXQgYmVjb21lcyBmZWFzaWJsZVxuXHRcdFx0XHQvLyAoIzg0NjUsICM4Mzc5KVxuXHRcdFx0XHRfY2xpcHBpbmcuc2V0U3RhdGUoXG5cdFx0XHRcdFx0bWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXMsIG1hdGVyaWFsLmNsaXBJbnRlcnNlY3Rpb24sIG1hdGVyaWFsLmNsaXBTaGFkb3dzLFxuXHRcdFx0XHRcdGNhbWVyYSwgbWF0ZXJpYWxQcm9wZXJ0aWVzLCB1c2VDYWNoZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5lZWRzVXBkYXRlID09PSBmYWxzZSApIHtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuZm9nICYmIG1hdGVyaWFsUHJvcGVydGllcy5mb2cgIT09IGZvZyApIHtcblxuXHRcdFx0XHRtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmxpZ2h0cyAmJiBtYXRlcmlhbFByb3BlcnRpZXMubGlnaHRzSGFzaCAhPT0gbGlnaHRzLnN0YXRlLmhhc2ggKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMubnVtQ2xpcHBpbmdQbGFuZXMgIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHQoIG1hdGVyaWFsUHJvcGVydGllcy5udW1DbGlwcGluZ1BsYW5lcyAhPT0gX2NsaXBwaW5nLm51bVBsYW5lcyB8fFxuXHRcdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMubnVtSW50ZXJzZWN0aW9uICE9PSBfY2xpcHBpbmcubnVtSW50ZXJzZWN0aW9uICkgKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5lZWRzVXBkYXRlICkge1xuXG5cdFx0XHRpbml0TWF0ZXJpYWwoIG1hdGVyaWFsLCBmb2csIG9iamVjdCApO1xuXHRcdFx0bWF0ZXJpYWwubmVlZHNVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHZhciByZWZyZXNoUHJvZ3JhbSA9IGZhbHNlO1xuXHRcdHZhciByZWZyZXNoTWF0ZXJpYWwgPSBmYWxzZTtcblx0XHR2YXIgcmVmcmVzaExpZ2h0cyA9IGZhbHNlO1xuXG5cdFx0dmFyIHByb2dyYW0gPSBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbSxcblx0XHRcdHBfdW5pZm9ybXMgPSBwcm9ncmFtLmdldFVuaWZvcm1zKCksXG5cdFx0XHRtX3VuaWZvcm1zID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLnNoYWRlci51bmlmb3JtcztcblxuXHRcdGlmICggc3RhdGUudXNlUHJvZ3JhbSggcHJvZ3JhbS5wcm9ncmFtICkgKSB7XG5cblx0XHRcdHJlZnJlc2hQcm9ncmFtID0gdHJ1ZTtcblx0XHRcdHJlZnJlc2hNYXRlcmlhbCA9IHRydWU7XG5cdFx0XHRyZWZyZXNoTGlnaHRzID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuaWQgIT09IF9jdXJyZW50TWF0ZXJpYWxJZCApIHtcblxuXHRcdFx0X2N1cnJlbnRNYXRlcmlhbElkID0gbWF0ZXJpYWwuaWQ7XG5cblx0XHRcdHJlZnJlc2hNYXRlcmlhbCA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIHJlZnJlc2hQcm9ncmFtIHx8IGNhbWVyYSAhPT0gX2N1cnJlbnRDYW1lcmEgKSB7XG5cblx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3Byb2plY3Rpb25NYXRyaXgnLCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0XHRpZiAoIGNhcGFiaWxpdGllcy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICkge1xuXG5cdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2xvZ0RlcHRoQnVmRkMnLFxuXHRcdFx0XHRcdDIuMCAvICggTWF0aC5sb2coIGNhbWVyYS5mYXIgKyAxLjAgKSAvIE1hdGguTE4yICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBBdm9pZCB1bm5lZWRlZCB1bmlmb3JtIHVwZGF0ZXMgcGVyIEFycmF5Q2FtZXJhJ3Mgc3ViLWNhbWVyYVxuXG5cdFx0XHRpZiAoIF9jdXJyZW50Q2FtZXJhICE9PSAoIF9jdXJyZW50QXJyYXlDYW1lcmEgfHwgY2FtZXJhICkgKSB7XG5cblx0XHRcdFx0X2N1cnJlbnRDYW1lcmEgPSAoIF9jdXJyZW50QXJyYXlDYW1lcmEgfHwgY2FtZXJhICk7XG5cblx0XHRcdFx0Ly8gbGlnaHRpbmcgdW5pZm9ybXMgZGVwZW5kIG9uIHRoZSBjYW1lcmEgc28gZW5mb3JjZSBhbiB1cGRhdGVcblx0XHRcdFx0Ly8gbm93LCBpbiBjYXNlIHRoaXMgbWF0ZXJpYWwgc3VwcG9ydHMgbGlnaHRzIC0gb3IgbGF0ZXIsIHdoZW5cblx0XHRcdFx0Ly8gdGhlIG5leHQgbWF0ZXJpYWwgdGhhdCBkb2VzIGdldHMgYWN0aXZhdGVkOlxuXG5cdFx0XHRcdHJlZnJlc2hNYXRlcmlhbCA9IHRydWU7XHRcdC8vIHNldCB0byB0cnVlIG9uIG1hdGVyaWFsIGNoYW5nZVxuXHRcdFx0XHRyZWZyZXNoTGlnaHRzID0gdHJ1ZTtcdFx0Ly8gcmVtYWlucyBzZXQgdW50aWwgdXBkYXRlIGRvbmVcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBsb2FkIG1hdGVyaWFsIHNwZWNpZmljIHVuaWZvcm1zXG5cdFx0XHQvLyAoc2hhZGVyIG1hdGVyaWFsIGFsc28gZ2V0cyB0aGVtIGZvciB0aGUgc2FrZSBvZiBnZW5lcmljaXR5KVxuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmVudk1hcCApIHtcblxuXHRcdFx0XHR2YXIgdUNhbVBvcyA9IHBfdW5pZm9ybXMubWFwLmNhbWVyYVBvc2l0aW9uO1xuXG5cdFx0XHRcdGlmICggdUNhbVBvcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dUNhbVBvcy5zZXRWYWx1ZSggX2dsLFxuXHRcdFx0XHRcdFx0X3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaEJhc2ljTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLnNraW5uaW5nICkge1xuXG5cdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3ZpZXdNYXRyaXgnLCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIHNraW5uaW5nIHVuaWZvcm1zIG11c3QgYmUgc2V0IGV2ZW4gaWYgbWF0ZXJpYWwgZGlkbid0IGNoYW5nZVxuXHRcdC8vIGF1dG8tc2V0dGluZyBvZiB0ZXh0dXJlIHVuaXQgZm9yIGJvbmUgdGV4dHVyZSBtdXN0IGdvIGJlZm9yZSBvdGhlciB0ZXh0dXJlc1xuXHRcdC8vIG5vdCBzdXJlIHdoeSwgYnV0IG90aGVyd2lzZSB3ZWlyZCB0aGluZ3MgaGFwcGVuXG5cblx0XHRpZiAoIG1hdGVyaWFsLnNraW5uaW5nICkge1xuXG5cdFx0XHRwX3VuaWZvcm1zLnNldE9wdGlvbmFsKCBfZ2wsIG9iamVjdCwgJ2JpbmRNYXRyaXgnICk7XG5cdFx0XHRwX3VuaWZvcm1zLnNldE9wdGlvbmFsKCBfZ2wsIG9iamVjdCwgJ2JpbmRNYXRyaXhJbnZlcnNlJyApO1xuXG5cdFx0XHR2YXIgc2tlbGV0b24gPSBvYmplY3Quc2tlbGV0b247XG5cblx0XHRcdGlmICggc2tlbGV0b24gKSB7XG5cblx0XHRcdFx0dmFyIGJvbmVzID0gc2tlbGV0b24uYm9uZXM7XG5cblx0XHRcdFx0aWYgKCBjYXBhYmlsaXRpZXMuZmxvYXRWZXJ0ZXhUZXh0dXJlcyApIHtcblxuXHRcdFx0XHRcdGlmICggc2tlbGV0b24uYm9uZVRleHR1cmUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gbGF5b3V0ICgxIG1hdHJpeCA9IDQgcGl4ZWxzKVxuXHRcdFx0XHRcdFx0Ly8gICAgICBSR0JBIFJHQkEgUkdCQSBSR0JBICg9PiBjb2x1bW4xLCBjb2x1bW4yLCBjb2x1bW4zLCBjb2x1bW40KVxuXHRcdFx0XHRcdFx0Ly8gIHdpdGggIDh4OCAgcGl4ZWwgdGV4dHVyZSBtYXggICAxNiBib25lcyAqIDQgcGl4ZWxzID0gICg4ICogOClcblx0XHRcdFx0XHRcdC8vICAgICAgIDE2eDE2IHBpeGVsIHRleHR1cmUgbWF4ICAgNjQgYm9uZXMgKiA0IHBpeGVscyA9ICgxNiAqIDE2KVxuXHRcdFx0XHRcdFx0Ly8gICAgICAgMzJ4MzIgcGl4ZWwgdGV4dHVyZSBtYXggIDI1NiBib25lcyAqIDQgcGl4ZWxzID0gKDMyICogMzIpXG5cdFx0XHRcdFx0XHQvLyAgICAgICA2NHg2NCBwaXhlbCB0ZXh0dXJlIG1heCAxMDI0IGJvbmVzICogNCBwaXhlbHMgPSAoNjQgKiA2NClcblxuXG5cdFx0XHRcdFx0XHR2YXIgc2l6ZSA9IE1hdGguc3FydCggYm9uZXMubGVuZ3RoICogNCApOyAvLyA0IHBpeGVscyBuZWVkZWQgZm9yIDEgbWF0cml4XG5cdFx0XHRcdFx0XHRzaXplID0gX01hdGguY2VpbFBvd2VyT2ZUd28oIHNpemUgKTtcblx0XHRcdFx0XHRcdHNpemUgPSBNYXRoLm1heCggc2l6ZSwgNCApO1xuXG5cdFx0XHRcdFx0XHR2YXIgYm9uZU1hdHJpY2VzID0gbmV3IEZsb2F0MzJBcnJheSggc2l6ZSAqIHNpemUgKiA0ICk7IC8vIDQgZmxvYXRzIHBlciBSR0JBIHBpeGVsXG5cdFx0XHRcdFx0XHRib25lTWF0cmljZXMuc2V0KCBza2VsZXRvbi5ib25lTWF0cmljZXMgKTsgLy8gY29weSBjdXJyZW50IHZhbHVlc1xuXG5cdFx0XHRcdFx0XHR2YXIgYm9uZVRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoIGJvbmVNYXRyaWNlcywgc2l6ZSwgc2l6ZSwgUkdCQUZvcm1hdCwgRmxvYXRUeXBlICk7XG5cdFx0XHRcdFx0XHRib25lVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdFx0XHRcdHNrZWxldG9uLmJvbmVNYXRyaWNlcyA9IGJvbmVNYXRyaWNlcztcblx0XHRcdFx0XHRcdHNrZWxldG9uLmJvbmVUZXh0dXJlID0gYm9uZVRleHR1cmU7XG5cdFx0XHRcdFx0XHRza2VsZXRvbi5ib25lVGV4dHVyZVNpemUgPSBzaXplO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnYm9uZVRleHR1cmUnLCBza2VsZXRvbi5ib25lVGV4dHVyZSApO1xuXHRcdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2JvbmVUZXh0dXJlU2l6ZScsIHNrZWxldG9uLmJvbmVUZXh0dXJlU2l6ZSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRwX3VuaWZvcm1zLnNldE9wdGlvbmFsKCBfZ2wsIHNrZWxldG9uLCAnYm9uZU1hdHJpY2VzJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCByZWZyZXNoTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3RvbmVNYXBwaW5nRXhwb3N1cmUnLCBfdGhpcy50b25lTWFwcGluZ0V4cG9zdXJlICk7XG5cdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICd0b25lTWFwcGluZ1doaXRlUG9pbnQnLCBfdGhpcy50b25lTWFwcGluZ1doaXRlUG9pbnQgKTtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5saWdodHMgKSB7XG5cblx0XHRcdFx0Ly8gdGhlIGN1cnJlbnQgbWF0ZXJpYWwgcmVxdWlyZXMgbGlnaHRpbmcgaW5mb1xuXG5cdFx0XHRcdC8vIG5vdGU6IGFsbCBsaWdodGluZyB1bmlmb3JtcyBhcmUgYWx3YXlzIHNldCBjb3JyZWN0bHlcblx0XHRcdFx0Ly8gdGhleSBzaW1wbHkgcmVmZXJlbmNlIHRoZSByZW5kZXJlcidzIHN0YXRlIGZvciB0aGVpclxuXHRcdFx0XHQvLyB2YWx1ZXNcblx0XHRcdFx0Ly9cblx0XHRcdFx0Ly8gdXNlIHRoZSBjdXJyZW50IG1hdGVyaWFsJ3MgLm5lZWRzVXBkYXRlIGZsYWdzIHRvIHNldFxuXHRcdFx0XHQvLyB0aGUgR0wgc3RhdGUgd2hlbiByZXF1aXJlZFxuXG5cdFx0XHRcdG1hcmtVbmlmb3Jtc0xpZ2h0c05lZWRzVXBkYXRlKCBtX3VuaWZvcm1zLCByZWZyZXNoTGlnaHRzICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gcmVmcmVzaCB1bmlmb3JtcyBjb21tb24gdG8gc2V2ZXJhbCBtYXRlcmlhbHNcblxuXHRcdFx0aWYgKCBmb2cgJiYgbWF0ZXJpYWwuZm9nICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0ZvZyggbV91bmlmb3JtcywgZm9nICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5pc01lc2hCYXNpY01hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zTGFtYmVydCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0aWYgKCBtYXRlcmlhbC5pc01lc2hUb29uTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNUb29uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNQaG9uZyggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdGlmICggbWF0ZXJpYWwuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc1BoeXNpY2FsKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNTdGFuZGFyZCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaERlcHRoTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNEZXB0aCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoRGlzdGFuY2VNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0Rpc3RhbmNlKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hOb3JtYWxNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc05vcm1hbCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNMaW5lQmFzaWNNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNMaW5lKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdGlmICggbWF0ZXJpYWwuaXNMaW5lRGFzaGVkTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNEYXNoKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNQb2ludHNNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNQb2ludHMoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzU2hhZG93TWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0bV91bmlmb3Jtcy5jb2xvci52YWx1ZSA9IG1hdGVyaWFsLmNvbG9yO1xuXHRcdFx0XHRtX3VuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSBtYXRlcmlhbC5vcGFjaXR5O1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlY3RBcmVhTGlnaHQgVGV4dHVyZVxuXHRcdFx0Ly8gVE9ETyAobXJkb29iKTogRmluZCBhIG5pY2VyIGltcGxlbWVudGF0aW9uXG5cblx0XHRcdGlmICggbV91bmlmb3Jtcy5sdGNfMSAhPT0gdW5kZWZpbmVkICkgbV91bmlmb3Jtcy5sdGNfMS52YWx1ZSA9IFVuaWZvcm1zTGliLkxUQ18xO1xuXHRcdFx0aWYgKCBtX3VuaWZvcm1zLmx0Y18yICE9PSB1bmRlZmluZWQgKSBtX3VuaWZvcm1zLmx0Y18yLnZhbHVlID0gVW5pZm9ybXNMaWIuTFRDXzI7XG5cblx0XHRcdFdlYkdMVW5pZm9ybXMudXBsb2FkKCBfZ2wsIG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3Jtc0xpc3QsIG1fdW5pZm9ybXMsIF90aGlzICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgJiYgbWF0ZXJpYWwudW5pZm9ybXNOZWVkVXBkYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRXZWJHTFVuaWZvcm1zLnVwbG9hZCggX2dsLCBtYXRlcmlhbFByb3BlcnRpZXMudW5pZm9ybXNMaXN0LCBtX3VuaWZvcm1zLCBfdGhpcyApO1xuXHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHQvLyBjb21tb24gbWF0cmljZXNcblxuXHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ21vZGVsVmlld01hdHJpeCcsIG9iamVjdC5tb2RlbFZpZXdNYXRyaXggKTtcblx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdub3JtYWxNYXRyaXgnLCBvYmplY3Qubm9ybWFsTWF0cml4ICk7XG5cdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnbW9kZWxNYXRyaXgnLCBvYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdHJldHVybiBwcm9ncmFtO1xuXG5cdH1cblxuXHQvLyBVbmlmb3JtcyAocmVmcmVzaCB1bmlmb3JtcyBvYmplY3RzKVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmNvbG9yICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlID0gbWF0ZXJpYWwuY29sb3I7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmVtaXNzaXZlICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5lbWlzc2l2ZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5lbWlzc2l2ZSApLm11bHRpcGx5U2NhbGFyKCBtYXRlcmlhbC5lbWlzc2l2ZUludGVuc2l0eSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm1hcC52YWx1ZSA9IG1hdGVyaWFsLm1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYWxwaGFNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmFscGhhTWFwLnZhbHVlID0gbWF0ZXJpYWwuYWxwaGFNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLnNwZWN1bGFyTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5zcGVjdWxhck1hcC52YWx1ZSA9IG1hdGVyaWFsLnNwZWN1bGFyTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5lbnZNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmVudk1hcC52YWx1ZSA9IG1hdGVyaWFsLmVudk1hcDtcblxuXHRcdFx0Ly8gZG9uJ3QgZmxpcCBDdWJlVGV4dHVyZSBlbnZNYXBzLCBmbGlwIGV2ZXJ5dGhpbmcgZWxzZTpcblx0XHRcdC8vICBXZWJHTFJlbmRlclRhcmdldEN1YmUgd2lsbCBiZSBmbGlwcGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXHRcdFx0Ly8gIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZS50ZXh0dXJlIHdpbGwgYmUgZmxpcHBlZCBiZWNhdXNlIGl0J3MgYSBUZXh0dXJlIGFuZCBOT1QgYSBDdWJlVGV4dHVyZVxuXHRcdFx0Ly8gdGhpcyBjaGVjayBtdXN0IGJlIGhhbmRsZWQgZGlmZmVyZW50bHksIG9yIHJlbW92ZWQgZW50aXJlbHksIGlmIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZSB1c2VzIGEgQ3ViZVRleHR1cmUgaW4gdGhlIGZ1dHVyZVxuXHRcdFx0dW5pZm9ybXMuZmxpcEVudk1hcC52YWx1ZSA9ICggISAoIG1hdGVyaWFsLmVudk1hcCAmJiBtYXRlcmlhbC5lbnZNYXAuaXNDdWJlVGV4dHVyZSApICkgPyAxIDogLSAxO1xuXG5cdFx0XHR1bmlmb3Jtcy5yZWZsZWN0aXZpdHkudmFsdWUgPSBtYXRlcmlhbC5yZWZsZWN0aXZpdHk7XG5cdFx0XHR1bmlmb3Jtcy5yZWZyYWN0aW9uUmF0aW8udmFsdWUgPSBtYXRlcmlhbC5yZWZyYWN0aW9uUmF0aW87XG5cblx0XHRcdHVuaWZvcm1zLm1heE1pcExldmVsLnZhbHVlID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsLmVudk1hcCApLl9fbWF4TWlwTGV2ZWw7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmxpZ2h0TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5saWdodE1hcC52YWx1ZSA9IG1hdGVyaWFsLmxpZ2h0TWFwO1xuXHRcdFx0dW5pZm9ybXMubGlnaHRNYXBJbnRlbnNpdHkudmFsdWUgPSBtYXRlcmlhbC5saWdodE1hcEludGVuc2l0eTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYW9NYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmFvTWFwLnZhbHVlID0gbWF0ZXJpYWwuYW9NYXA7XG5cdFx0XHR1bmlmb3Jtcy5hb01hcEludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLmFvTWFwSW50ZW5zaXR5O1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXYgcmVwZWF0IGFuZCBvZmZzZXQgc2V0dGluZyBwcmlvcml0aWVzXG5cdFx0Ly8gMS4gY29sb3IgbWFwXG5cdFx0Ly8gMi4gc3BlY3VsYXIgbWFwXG5cdFx0Ly8gMy4gbm9ybWFsIG1hcFxuXHRcdC8vIDQuIGJ1bXAgbWFwXG5cdFx0Ly8gNS4gYWxwaGEgbWFwXG5cdFx0Ly8gNi4gZW1pc3NpdmUgbWFwXG5cblx0XHR2YXIgdXZTY2FsZU1hcDtcblxuXHRcdGlmICggbWF0ZXJpYWwubWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwubWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuc3BlY3VsYXJNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5zcGVjdWxhck1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLm5vcm1hbE1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5idW1wTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwucm91Z2huZXNzTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwucm91Z2huZXNzTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwubWV0YWxuZXNzTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwubWV0YWxuZXNzTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuYWxwaGFNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5hbHBoYU1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuZW1pc3NpdmVNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIHV2U2NhbGVNYXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblx0XHRcdGlmICggdXZTY2FsZU1hcC5pc1dlYkdMUmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHRcdHV2U2NhbGVNYXAgPSB1dlNjYWxlTWFwLnRleHR1cmU7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB1dlNjYWxlTWFwLm1hdHJpeEF1dG9VcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0dXZTY2FsZU1hcC51cGRhdGVNYXRyaXgoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR1bmlmb3Jtcy51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KCB1dlNjYWxlTWFwLm1hdHJpeCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNMaW5lKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlID0gbWF0ZXJpYWwuY29sb3I7XG5cdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0Rhc2goIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLmRhc2hTaXplLnZhbHVlID0gbWF0ZXJpYWwuZGFzaFNpemU7XG5cdFx0dW5pZm9ybXMudG90YWxTaXplLnZhbHVlID0gbWF0ZXJpYWwuZGFzaFNpemUgKyBtYXRlcmlhbC5nYXBTaXplO1xuXHRcdHVuaWZvcm1zLnNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuc2NhbGU7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1BvaW50cyggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMuZGlmZnVzZS52YWx1ZSA9IG1hdGVyaWFsLmNvbG9yO1xuXHRcdHVuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSBtYXRlcmlhbC5vcGFjaXR5O1xuXHRcdHVuaWZvcm1zLnNpemUudmFsdWUgPSBtYXRlcmlhbC5zaXplICogX3BpeGVsUmF0aW87XG5cdFx0dW5pZm9ybXMuc2NhbGUudmFsdWUgPSBfaGVpZ2h0ICogMC41O1xuXG5cdFx0dW5pZm9ybXMubWFwLnZhbHVlID0gbWF0ZXJpYWwubWFwO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXAgIT09IG51bGwgKSB7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwubWFwLm1hdHJpeEF1dG9VcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwubWFwLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHVuaWZvcm1zLnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoIG1hdGVyaWFsLm1hcC5tYXRyaXggKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zRm9nKCB1bmlmb3JtcywgZm9nICkge1xuXG5cdFx0dW5pZm9ybXMuZm9nQ29sb3IudmFsdWUgPSBmb2cuY29sb3I7XG5cblx0XHRpZiAoIGZvZy5pc0ZvZyApIHtcblxuXHRcdFx0dW5pZm9ybXMuZm9nTmVhci52YWx1ZSA9IGZvZy5uZWFyO1xuXHRcdFx0dW5pZm9ybXMuZm9nRmFyLnZhbHVlID0gZm9nLmZhcjtcblxuXHRcdH0gZWxzZSBpZiAoIGZvZy5pc0ZvZ0V4cDIgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmZvZ0RlbnNpdHkudmFsdWUgPSBmb2cuZGVuc2l0eTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zTGFtYmVydCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZW1pc3NpdmVNYXAudmFsdWUgPSBtYXRlcmlhbC5lbWlzc2l2ZU1hcDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zUGhvbmcoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLnNwZWN1bGFyLnZhbHVlID0gbWF0ZXJpYWwuc3BlY3VsYXI7XG5cdFx0dW5pZm9ybXMuc2hpbmluZXNzLnZhbHVlID0gTWF0aC5tYXgoIG1hdGVyaWFsLnNoaW5pbmVzcywgMWUtNCApOyAvLyB0byBwcmV2ZW50IHBvdyggMC4wLCAwLjAgKVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZW1pc3NpdmVNYXAudmFsdWUgPSBtYXRlcmlhbC5lbWlzc2l2ZU1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYnVtcE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuYnVtcE1hcC52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBNYXA7XG5cdFx0XHR1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgPSBtYXRlcmlhbC5idW1wU2NhbGU7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubm9ybWFsTWFwLnZhbHVlID0gbWF0ZXJpYWwubm9ybWFsTWFwO1xuXHRcdFx0dW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUuY29weSggbWF0ZXJpYWwubm9ybWFsU2NhbGUgKTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1Rvb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHJlZnJlc2hVbmlmb3Jtc1Bob25nKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdGlmICggbWF0ZXJpYWwuZ3JhZGllbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmdyYWRpZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZ3JhZGllbnRNYXA7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1N0YW5kYXJkKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5yb3VnaG5lc3MudmFsdWUgPSBtYXRlcmlhbC5yb3VnaG5lc3M7XG5cdFx0dW5pZm9ybXMubWV0YWxuZXNzLnZhbHVlID0gbWF0ZXJpYWwubWV0YWxuZXNzO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5yb3VnaG5lc3NNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLnJvdWdobmVzc01hcC52YWx1ZSA9IG1hdGVyaWFsLnJvdWdobmVzc01hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubWV0YWxuZXNzTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5tZXRhbG5lc3NNYXAudmFsdWUgPSBtYXRlcmlhbC5tZXRhbG5lc3NNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5lbWlzc2l2ZU1hcC52YWx1ZSA9IG1hdGVyaWFsLmVtaXNzaXZlTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5idW1wTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5idW1wTWFwLnZhbHVlID0gbWF0ZXJpYWwuYnVtcE1hcDtcblx0XHRcdHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBTY2FsZTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5ub3JtYWxNYXA7XG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZW52TWFwICkge1xuXG5cdFx0XHQvL3VuaWZvcm1zLmVudk1hcC52YWx1ZSA9IG1hdGVyaWFsLmVudk1hcDsgLy8gcGFydCBvZiB1bmlmb3JtcyBjb21tb25cblx0XHRcdHVuaWZvcm1zLmVudk1hcEludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLmVudk1hcEludGVuc2l0eTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zUGh5c2ljYWwoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLmNsZWFyQ29hdC52YWx1ZSA9IG1hdGVyaWFsLmNsZWFyQ29hdDtcblx0XHR1bmlmb3Jtcy5jbGVhckNvYXRSb3VnaG5lc3MudmFsdWUgPSBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3M7XG5cblx0XHRyZWZyZXNoVW5pZm9ybXNTdGFuZGFyZCggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0RlcHRoKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNEaXN0YW5jZSggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHRcdHVuaWZvcm1zLnJlZmVyZW5jZVBvc2l0aW9uLnZhbHVlLmNvcHkoIG1hdGVyaWFsLnJlZmVyZW5jZVBvc2l0aW9uICk7XG5cdFx0dW5pZm9ybXMubmVhckRpc3RhbmNlLnZhbHVlID0gbWF0ZXJpYWwubmVhckRpc3RhbmNlO1xuXHRcdHVuaWZvcm1zLmZhckRpc3RhbmNlLnZhbHVlID0gbWF0ZXJpYWwuZmFyRGlzdGFuY2U7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc05vcm1hbCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5idW1wTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5idW1wTWFwLnZhbHVlID0gbWF0ZXJpYWwuYnVtcE1hcDtcblx0XHRcdHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBTY2FsZTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5ub3JtYWxNYXA7XG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gSWYgdW5pZm9ybXMgYXJlIG1hcmtlZCBhcyBjbGVhbiwgdGhleSBkb24ndCBuZWVkIHRvIGJlIGxvYWRlZCB0byB0aGUgR1BVLlxuXG5cdGZ1bmN0aW9uIG1hcmtVbmlmb3Jtc0xpZ2h0c05lZWRzVXBkYXRlKCB1bmlmb3JtcywgdmFsdWUgKSB7XG5cblx0XHR1bmlmb3Jtcy5hbWJpZW50TGlnaHRDb2xvci5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXG5cdFx0dW5pZm9ybXMuZGlyZWN0aW9uYWxMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblx0XHR1bmlmb3Jtcy5wb2ludExpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXHRcdHVuaWZvcm1zLnNwb3RMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblx0XHR1bmlmb3Jtcy5yZWN0QXJlYUxpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXHRcdHVuaWZvcm1zLmhlbWlzcGhlcmVMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblxuXHR9XG5cblx0Ly8gVGV4dHVyZXNcblxuXHRmdW5jdGlvbiBhbGxvY1RleHR1cmVVbml0KCkge1xuXG5cdFx0dmFyIHRleHR1cmVVbml0ID0gX3VzZWRUZXh0dXJlVW5pdHM7XG5cblx0XHRpZiAoIHRleHR1cmVVbml0ID49IGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlcyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVHJ5aW5nIHRvIHVzZSAnICsgdGV4dHVyZVVuaXQgKyAnIHRleHR1cmUgdW5pdHMgd2hpbGUgdGhpcyBHUFUgc3VwcG9ydHMgb25seSAnICsgY2FwYWJpbGl0aWVzLm1heFRleHR1cmVzICk7XG5cblx0XHR9XG5cblx0XHRfdXNlZFRleHR1cmVVbml0cyArPSAxO1xuXG5cdFx0cmV0dXJuIHRleHR1cmVVbml0O1xuXG5cdH1cblxuXHR0aGlzLmFsbG9jVGV4dHVyZVVuaXQgPSBhbGxvY1RleHR1cmVVbml0O1xuXG5cdC8vIHRoaXMuc2V0VGV4dHVyZTJEID0gc2V0VGV4dHVyZTJEO1xuXHR0aGlzLnNldFRleHR1cmUyRCA9ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHdhcm5lZCA9IGZhbHNlO1xuXG5cdFx0Ly8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6IHBlZWwgdGV4dHVyZS50ZXh0dXJlXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldFRleHR1cmUyRCggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNXZWJHTFJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0XHRpZiAoICEgd2FybmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLldlYkdMUmVuZGVyZXIuc2V0VGV4dHVyZTJEOiBkb24ndCB1c2UgcmVuZGVyIHRhcmdldHMgYXMgdGV4dHVyZXMuIFVzZSB0aGVpciAudGV4dHVyZSBwcm9wZXJ0eSBpbnN0ZWFkLlwiICk7XG5cdFx0XHRcdFx0d2FybmVkID0gdHJ1ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZSA9IHRleHR1cmUudGV4dHVyZTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlMkQoIHRleHR1cmUsIHNsb3QgKTtcblxuXHRcdH07XG5cblx0fSgpICk7XG5cblx0dGhpcy5zZXRUZXh0dXJlID0gKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgd2FybmVkID0gZmFsc2U7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0VGV4dHVyZSggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdFx0aWYgKCAhIHdhcm5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldFRleHR1cmUgaXMgZGVwcmVjYXRlZCwgdXNlIHNldFRleHR1cmUyRCBpbnN0ZWFkLlwiICk7XG5cdFx0XHRcdHdhcm5lZCA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCBzbG90ICk7XG5cblx0XHR9O1xuXG5cdH0oKSApO1xuXG5cdHRoaXMuc2V0VGV4dHVyZUN1YmUgPSAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB3YXJuZWQgPSBmYWxzZTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRUZXh0dXJlQ3ViZSggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdFx0Ly8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6IHBlZWwgdGV4dHVyZS50ZXh0dXJlXG5cdFx0XHRpZiAoIHRleHR1cmUgJiYgdGV4dHVyZS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSApIHtcblxuXHRcdFx0XHRpZiAoICEgd2FybmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLldlYkdMUmVuZGVyZXIuc2V0VGV4dHVyZUN1YmU6IGRvbid0IHVzZSBjdWJlIHJlbmRlciB0YXJnZXRzIGFzIHRleHR1cmVzLiBVc2UgdGhlaXIgLnRleHR1cmUgcHJvcGVydHkgaW5zdGVhZC5cIiApO1xuXHRcdFx0XHRcdHdhcm5lZCA9IHRydWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRleHR1cmUgPSB0ZXh0dXJlLnRleHR1cmU7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gY3VycmVudGx5IHJlbHlpbmcgb24gdGhlIGZhY3QgdGhhdCBXZWJHTFJlbmRlclRhcmdldEN1YmUudGV4dHVyZSBpcyBhIFRleHR1cmUgYW5kIE5PVCBhIEN1YmVUZXh0dXJlXG5cdFx0XHQvLyBUT0RPOiB1bmlmeSB0aGVzZSBjb2RlIHBhdGhzXG5cdFx0XHRpZiAoICggdGV4dHVyZSAmJiB0ZXh0dXJlLmlzQ3ViZVRleHR1cmUgKSB8fFxuXHRcdFx0XHQoIEFycmF5LmlzQXJyYXkoIHRleHR1cmUuaW1hZ2UgKSAmJiB0ZXh0dXJlLmltYWdlLmxlbmd0aCA9PT0gNiApICkge1xuXG5cdFx0XHRcdC8vIENvbXByZXNzZWRUZXh0dXJlIGNhbiBoYXZlIEFycmF5IGluIGltYWdlIDovXG5cblx0XHRcdFx0Ly8gdGhpcyBmdW5jdGlvbiBhbG9uZSBzaG91bGQgdGFrZSBjYXJlIG9mIGN1YmUgdGV4dHVyZXNcblx0XHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZUN1YmUoIHRleHR1cmUsIHNsb3QgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBhc3N1bWVkOiB0ZXh0dXJlIHByb3BlcnR5IG9mIFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0Q3ViZVxuXG5cdFx0XHRcdHRleHR1cmVzLnNldFRleHR1cmVDdWJlRHluYW1pYyggdGV4dHVyZSwgc2xvdCApO1xuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0oKSApO1xuXG5cdHRoaXMuZ2V0UmVuZGVyVGFyZ2V0ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9jdXJyZW50UmVuZGVyVGFyZ2V0O1xuXG5cdH07XG5cblx0dGhpcy5zZXRSZW5kZXJUYXJnZXQgPSBmdW5jdGlvbiAoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdF9jdXJyZW50UmVuZGVyVGFyZ2V0ID0gcmVuZGVyVGFyZ2V0O1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgJiYgcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0ZXh0dXJlcy5zZXR1cFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR9XG5cblx0XHR2YXIgZnJhbWVidWZmZXIgPSBudWxsO1xuXHRcdHZhciBpc0N1YmUgPSBmYWxzZTtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHR2YXIgX193ZWJnbEZyYW1lYnVmZmVyID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApLl9fd2ViZ2xGcmFtZWJ1ZmZlcjtcblxuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgKSB7XG5cblx0XHRcdFx0ZnJhbWVidWZmZXIgPSBfX3dlYmdsRnJhbWVidWZmZXJbIHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSBdO1xuXHRcdFx0XHRpc0N1YmUgPSB0cnVlO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZyYW1lYnVmZmVyID0gX193ZWJnbEZyYW1lYnVmZmVyO1xuXG5cdFx0XHR9XG5cblx0XHRcdF9jdXJyZW50Vmlld3BvcnQuY29weSggcmVuZGVyVGFyZ2V0LnZpZXdwb3J0ICk7XG5cdFx0XHRfY3VycmVudFNjaXNzb3IuY29weSggcmVuZGVyVGFyZ2V0LnNjaXNzb3IgKTtcblx0XHRcdF9jdXJyZW50U2Npc3NvclRlc3QgPSByZW5kZXJUYXJnZXQuc2Npc3NvclRlc3Q7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfY3VycmVudFZpZXdwb3J0LmNvcHkoIF92aWV3cG9ydCApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApO1xuXHRcdFx0X2N1cnJlbnRTY2lzc29yLmNvcHkoIF9zY2lzc29yICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICk7XG5cdFx0XHRfY3VycmVudFNjaXNzb3JUZXN0ID0gX3NjaXNzb3JUZXN0O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBfY3VycmVudEZyYW1lYnVmZmVyICE9PSBmcmFtZWJ1ZmZlciApIHtcblxuXHRcdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlciApO1xuXHRcdFx0X2N1cnJlbnRGcmFtZWJ1ZmZlciA9IGZyYW1lYnVmZmVyO1xuXG5cdFx0fVxuXG5cdFx0c3RhdGUudmlld3BvcnQoIF9jdXJyZW50Vmlld3BvcnQgKTtcblx0XHRzdGF0ZS5zY2lzc29yKCBfY3VycmVudFNjaXNzb3IgKTtcblx0XHRzdGF0ZS5zZXRTY2lzc29yVGVzdCggX2N1cnJlbnRTY2lzc29yVGVzdCApO1xuXG5cdFx0aWYgKCBpc0N1YmUgKSB7XG5cblx0XHRcdHZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQudGV4dHVyZSApO1xuXHRcdFx0X2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUsIHJlbmRlclRhcmdldC5hY3RpdmVNaXBNYXBMZXZlbCApO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0dGhpcy5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzID0gZnVuY3Rpb24gKCByZW5kZXJUYXJnZXQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGJ1ZmZlciApIHtcblxuXHRcdGlmICggISAoIHJlbmRlclRhcmdldCAmJiByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldCApICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0LicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBmcmFtZWJ1ZmZlciA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKS5fX3dlYmdsRnJhbWVidWZmZXI7XG5cblx0XHRpZiAoIGZyYW1lYnVmZmVyICkge1xuXG5cdFx0XHR2YXIgcmVzdG9yZSA9IGZhbHNlO1xuXG5cdFx0XHRpZiAoIGZyYW1lYnVmZmVyICE9PSBfY3VycmVudEZyYW1lYnVmZmVyICkge1xuXG5cdFx0XHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIgKTtcblxuXHRcdFx0XHRyZXN0b3JlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdHZhciB0ZXh0dXJlID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7XG5cdFx0XHRcdHZhciB0ZXh0dXJlRm9ybWF0ID0gdGV4dHVyZS5mb3JtYXQ7XG5cdFx0XHRcdHZhciB0ZXh0dXJlVHlwZSA9IHRleHR1cmUudHlwZTtcblxuXHRcdFx0XHRpZiAoIHRleHR1cmVGb3JtYXQgIT09IFJHQkFGb3JtYXQgJiYgdXRpbHMuY29udmVydCggdGV4dHVyZUZvcm1hdCApICE9PSBfZ2wuZ2V0UGFyYW1ldGVyKCBfZ2wuSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQgKSApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gUkdCQSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGZvcm1hdC4nICk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHRleHR1cmVUeXBlICE9PSBVbnNpZ25lZEJ5dGVUeXBlICYmIHV0aWxzLmNvbnZlcnQoIHRleHR1cmVUeXBlICkgIT09IF9nbC5nZXRQYXJhbWV0ZXIoIF9nbC5JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEUgKSAmJiAvLyBJRTExLCBFZGdlIGFuZCBDaHJvbWUgTWFjIDwgNTIgKCM5NTEzKVxuXHRcdFx0XHRcdCEgKCB0ZXh0dXJlVHlwZSA9PT0gRmxvYXRUeXBlICYmICggZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdCcgKSB8fCBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbG9yX2J1ZmZlcl9mbG9hdCcgKSApICkgJiYgLy8gQ2hyb21lIE1hYyA+PSA1MiBhbmQgRmlyZWZveFxuXHRcdFx0XHRcdCEgKCB0ZXh0dXJlVHlwZSA9PT0gSGFsZkZsb2F0VHlwZSAmJiBleHRlbnNpb25zLmdldCggJ0VYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCcgKSApICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4nICk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIF9nbC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKCBfZ2wuRlJBTUVCVUZGRVIgKSA9PT0gX2dsLkZSQU1FQlVGRkVSX0NPTVBMRVRFICkge1xuXG5cdFx0XHRcdFx0Ly8gdGhlIGZvbGxvd2luZyBpZiBzdGF0ZW1lbnQgZW5zdXJlcyB2YWxpZCByZWFkIHJlcXVlc3RzIChubyBvdXQtb2YtYm91bmRzIHBpeGVscywgc2VlICM4NjA0KVxuXG5cdFx0XHRcdFx0aWYgKCAoIHggPj0gMCAmJiB4IDw9ICggcmVuZGVyVGFyZ2V0LndpZHRoIC0gd2lkdGggKSApICYmICggeSA+PSAwICYmIHkgPD0gKCByZW5kZXJUYXJnZXQuaGVpZ2h0IC0gaGVpZ2h0ICkgKSApIHtcblxuXHRcdFx0XHRcdFx0X2dsLnJlYWRQaXhlbHMoIHgsIHksIHdpZHRoLCBoZWlnaHQsIHV0aWxzLmNvbnZlcnQoIHRleHR1cmVGb3JtYXQgKSwgdXRpbHMuY29udmVydCggdGV4dHVyZVR5cGUgKSwgYnVmZmVyICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlYWRQaXhlbHMgZnJvbSByZW5kZXJUYXJnZXQgZmFpbGVkLiBGcmFtZWJ1ZmZlciBub3QgY29tcGxldGUuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBmaW5hbGx5IHtcblxuXHRcdFx0XHRpZiAoIHJlc3RvcmUgKSB7XG5cblx0XHRcdFx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIF9jdXJyZW50RnJhbWVidWZmZXIgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9O1xuXG5cdHRoaXMuY29weUZyYW1lYnVmZmVyVG9UZXh0dXJlID0gZnVuY3Rpb24gKCBwb3NpdGlvbiwgdGV4dHVyZSwgbGV2ZWwgKSB7XG5cblx0XHR2YXIgd2lkdGggPSB0ZXh0dXJlLmltYWdlLndpZHRoO1xuXHRcdHZhciBoZWlnaHQgPSB0ZXh0dXJlLmltYWdlLmhlaWdodDtcblx0XHR2YXIgZ2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCApO1xuXG5cdFx0dGhpcy5zZXRUZXh0dXJlMkQoIHRleHR1cmUsIDAgKTtcblxuXHRcdF9nbC5jb3B5VGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGxldmVsIHx8IDAsIGdsRm9ybWF0LCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCB3aWR0aCwgaGVpZ2h0LCAwICk7XG5cblx0fTtcblxuXHR0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlID0gZnVuY3Rpb24gKCBwb3NpdGlvbiwgc3JjVGV4dHVyZSwgZHN0VGV4dHVyZSwgbGV2ZWwgKSB7XG5cblx0XHR2YXIgd2lkdGggPSBzcmNUZXh0dXJlLmltYWdlLndpZHRoO1xuXHRcdHZhciBoZWlnaHQgPSBzcmNUZXh0dXJlLmltYWdlLmhlaWdodDtcblx0XHR2YXIgZ2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCBkc3RUZXh0dXJlLmZvcm1hdCApO1xuXHRcdHZhciBnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCBkc3RUZXh0dXJlLnR5cGUgKTtcblx0XHR2YXIgcGl4ZWxzID0gc3JjVGV4dHVyZS5pc0RhdGFUZXh0dXJlID8gc3JjVGV4dHVyZS5pbWFnZS5kYXRhIDogc3JjVGV4dHVyZS5pbWFnZTtcblxuXHRcdHRoaXMuc2V0VGV4dHVyZTJEKCBkc3RUZXh0dXJlLCAwICk7XG5cblx0XHRfZ2wudGV4U3ViSW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGxldmVsIHx8IDAsIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHdpZHRoLCBoZWlnaHQsIGdsRm9ybWF0LCBnbFR5cGUsIHBpeGVscyApO1xuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBGb2dFeHAyKCBjb2xvciwgZGVuc2l0eSApIHtcblxuXHR0aGlzLm5hbWUgPSAnJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCBjb2xvciApO1xuXHR0aGlzLmRlbnNpdHkgPSAoIGRlbnNpdHkgIT09IHVuZGVmaW5lZCApID8gZGVuc2l0eSA6IDAuMDAwMjU7XG5cbn1cblxuRm9nRXhwMi5wcm90b3R5cGUuaXNGb2dFeHAyID0gdHJ1ZTtcblxuRm9nRXhwMi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0cmV0dXJuIG5ldyBGb2dFeHAyKCB0aGlzLmNvbG9yLmdldEhleCgpLCB0aGlzLmRlbnNpdHkgKTtcblxufTtcblxuRm9nRXhwMi5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCAvKiBtZXRhICovICkge1xuXG5cdHJldHVybiB7XG5cdFx0dHlwZTogJ0ZvZ0V4cDInLFxuXHRcdGNvbG9yOiB0aGlzLmNvbG9yLmdldEhleCgpLFxuXHRcdGRlbnNpdHk6IHRoaXMuZGVuc2l0eVxuXHR9O1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEZvZyggY29sb3IsIG5lYXIsIGZhciApIHtcblxuXHR0aGlzLm5hbWUgPSAnJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCBjb2xvciApO1xuXG5cdHRoaXMubmVhciA9ICggbmVhciAhPT0gdW5kZWZpbmVkICkgPyBuZWFyIDogMTtcblx0dGhpcy5mYXIgPSAoIGZhciAhPT0gdW5kZWZpbmVkICkgPyBmYXIgOiAxMDAwO1xuXG59XG5cbkZvZy5wcm90b3R5cGUuaXNGb2cgPSB0cnVlO1xuXG5Gb2cucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuXG5cdHJldHVybiBuZXcgRm9nKCB0aGlzLmNvbG9yLmdldEhleCgpLCB0aGlzLm5lYXIsIHRoaXMuZmFyICk7XG5cbn07XG5cbkZvZy5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCAvKiBtZXRhICovICkge1xuXG5cdHJldHVybiB7XG5cdFx0dHlwZTogJ0ZvZycsXG5cdFx0Y29sb3I6IHRoaXMuY29sb3IuZ2V0SGV4KCksXG5cdFx0bmVhcjogdGhpcy5uZWFyLFxuXHRcdGZhcjogdGhpcy5mYXJcblx0fTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFNjZW5lKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU2NlbmUnO1xuXG5cdHRoaXMuYmFja2dyb3VuZCA9IG51bGw7XG5cdHRoaXMuZm9nID0gbnVsbDtcblx0dGhpcy5vdmVycmlkZU1hdGVyaWFsID0gbnVsbDtcblxuXHR0aGlzLmF1dG9VcGRhdGUgPSB0cnVlOyAvLyBjaGVja2VkIGJ5IHRoZSByZW5kZXJlclxuXG59XG5cblNjZW5lLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFNjZW5lLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgKSB7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xuXG5cdFx0aWYgKCBzb3VyY2UuYmFja2dyb3VuZCAhPT0gbnVsbCApIHRoaXMuYmFja2dyb3VuZCA9IHNvdXJjZS5iYWNrZ3JvdW5kLmNsb25lKCk7XG5cdFx0aWYgKCBzb3VyY2UuZm9nICE9PSBudWxsICkgdGhpcy5mb2cgPSBzb3VyY2UuZm9nLmNsb25lKCk7XG5cdFx0aWYgKCBzb3VyY2Uub3ZlcnJpZGVNYXRlcmlhbCAhPT0gbnVsbCApIHRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IHNvdXJjZS5vdmVycmlkZU1hdGVyaWFsLmNsb25lKCk7XG5cblx0XHR0aGlzLmF1dG9VcGRhdGUgPSBzb3VyY2UuYXV0b1VwZGF0ZTtcblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBzb3VyY2UubWF0cml4QXV0b1VwZGF0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0aWYgKCB0aGlzLmJhY2tncm91bmQgIT09IG51bGwgKSBkYXRhLm9iamVjdC5iYWNrZ3JvdW5kID0gdGhpcy5iYWNrZ3JvdW5kLnRvSlNPTiggbWV0YSApO1xuXHRcdGlmICggdGhpcy5mb2cgIT09IG51bGwgKSBkYXRhLm9iamVjdC5mb2cgPSB0aGlzLmZvZy50b0pTT04oKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICpcdHV2T2Zmc2V0OiBuZXcgVEhSRUUuVmVjdG9yMigpLFxuICpcdHV2U2NhbGU6IG5ldyBUSFJFRS5WZWN0b3IyKClcbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBTcHJpdGVNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1Nwcml0ZU1hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApO1xuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5yb3RhdGlvbiA9IDA7XG5cblx0dGhpcy5mb2cgPSBmYWxzZTtcblx0dGhpcy5saWdodHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cblNwcml0ZU1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuU3ByaXRlTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ByaXRlTWF0ZXJpYWw7XG5TcHJpdGVNYXRlcmlhbC5wcm90b3R5cGUuaXNTcHJpdGVNYXRlcmlhbCA9IHRydWU7XG5cblNwcml0ZU1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMucm90YXRpb24gPSBzb3VyY2Uucm90YXRpb247XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gU3ByaXRlKCBtYXRlcmlhbCApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1Nwcml0ZSc7XG5cblx0dGhpcy5tYXRlcmlhbCA9ICggbWF0ZXJpYWwgIT09IHVuZGVmaW5lZCApID8gbWF0ZXJpYWwgOiBuZXcgU3ByaXRlTWF0ZXJpYWwoKTtcblxuXHR0aGlzLmNlbnRlciA9IG5ldyBWZWN0b3IyKCAwLjUsIDAuNSApO1xuXG59XG5cblNwcml0ZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTcHJpdGUsXG5cblx0aXNTcHJpdGU6IHRydWUsXG5cblx0cmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW50ZXJzZWN0UG9pbnQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB3b3JsZFBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgd29ybGRTY2FsZSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xuXG5cdFx0XHR3b3JsZFBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApO1xuXHRcdFx0cmF5Y2FzdGVyLnJheS5jbG9zZXN0UG9pbnRUb1BvaW50KCB3b3JsZFBvc2l0aW9uLCBpbnRlcnNlY3RQb2ludCApO1xuXG5cdFx0XHR3b3JsZFNjYWxlLnNldEZyb21NYXRyaXhTY2FsZSggdGhpcy5tYXRyaXhXb3JsZCApO1xuXHRcdFx0dmFyIGd1ZXNzU2l6ZVNxID0gd29ybGRTY2FsZS54ICogd29ybGRTY2FsZS55IC8gNDtcblxuXHRcdFx0aWYgKCB3b3JsZFBvc2l0aW9uLmRpc3RhbmNlVG9TcXVhcmVkKCBpbnRlcnNlY3RQb2ludCApID4gZ3Vlc3NTaXplU3EgKSByZXR1cm47XG5cblx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyc2VjdFBvaW50ICk7XG5cblx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm47XG5cblx0XHRcdGludGVyc2VjdHMucHVzaCgge1xuXG5cdFx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdFx0cG9pbnQ6IGludGVyc2VjdFBvaW50LmNsb25lKCksXG5cdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdG9iamVjdDogdGhpc1xuXG5cdFx0XHR9ICk7XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0aWYgKCBzb3VyY2UuY2VudGVyICE9PSB1bmRlZmluZWQgKSB0aGlzLmNlbnRlci5jb3B5KCBzb3VyY2UuY2VudGVyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMT0QoKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMT0QnO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7XG5cdFx0bGV2ZWxzOiB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IFtdXG5cdFx0fVxuXHR9ICk7XG5cbn1cblxuTE9ELnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExPRCxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSwgZmFsc2UgKTtcblxuXHRcdHZhciBsZXZlbHMgPSBzb3VyY2UubGV2ZWxzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBsZXZlbCA9IGxldmVsc1sgaSBdO1xuXG5cdFx0XHR0aGlzLmFkZExldmVsKCBsZXZlbC5vYmplY3QuY2xvbmUoKSwgbGV2ZWwuZGlzdGFuY2UgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkTGV2ZWw6IGZ1bmN0aW9uICggb2JqZWN0LCBkaXN0YW5jZSApIHtcblxuXHRcdGlmICggZGlzdGFuY2UgPT09IHVuZGVmaW5lZCApIGRpc3RhbmNlID0gMDtcblxuXHRcdGRpc3RhbmNlID0gTWF0aC5hYnMoIGRpc3RhbmNlICk7XG5cblx0XHR2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XG5cblx0XHRmb3IgKCB2YXIgbCA9IDA7IGwgPCBsZXZlbHMubGVuZ3RoOyBsICsrICkge1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgbGV2ZWxzWyBsIF0uZGlzdGFuY2UgKSB7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGxldmVscy5zcGxpY2UoIGwsIDAsIHsgZGlzdGFuY2U6IGRpc3RhbmNlLCBvYmplY3Q6IG9iamVjdCB9ICk7XG5cblx0XHR0aGlzLmFkZCggb2JqZWN0ICk7XG5cblx0fSxcblxuXHRnZXRPYmplY3RGb3JEaXN0YW5jZTogZnVuY3Rpb24gKCBkaXN0YW5jZSApIHtcblxuXHRcdHZhciBsZXZlbHMgPSB0aGlzLmxldmVscztcblxuXHRcdGZvciAoIHZhciBpID0gMSwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgbGV2ZWxzWyBpIF0uZGlzdGFuY2UgKSB7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBsZXZlbHNbIGkgLSAxIF0ub2JqZWN0O1xuXG5cdH0sXG5cblx0cmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWF0cml4UG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcblxuXHRcdFx0bWF0cml4UG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIG1hdHJpeFBvc2l0aW9uICk7XG5cblx0XHRcdHRoaXMuZ2V0T2JqZWN0Rm9yRGlzdGFuY2UoIGRpc3RhbmNlICkucmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICk7XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdHVwZGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSggY2FtZXJhICkge1xuXG5cdFx0XHR2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XG5cblx0XHRcdGlmICggbGV2ZWxzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdFx0djEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcblx0XHRcdFx0djIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0dmFyIGRpc3RhbmNlID0gdjEuZGlzdGFuY2VUbyggdjIgKTtcblxuXHRcdFx0XHRsZXZlbHNbIDAgXS5vYmplY3QudmlzaWJsZSA9IHRydWU7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGRpc3RhbmNlID49IGxldmVsc1sgaSBdLmRpc3RhbmNlICkge1xuXG5cdFx0XHRcdFx0XHRsZXZlbHNbIGkgLSAxIF0ub2JqZWN0LnZpc2libGUgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGxldmVsc1sgaSBdLm9iamVjdC52aXNpYmxlID0gdHJ1ZTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0bGV2ZWxzWyBpIF0ub2JqZWN0LnZpc2libGUgPSBmYWxzZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGRhdGEub2JqZWN0LmxldmVscyA9IFtdO1xuXG5cdFx0dmFyIGxldmVscyA9IHRoaXMubGV2ZWxzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBsZXZlbCA9IGxldmVsc1sgaSBdO1xuXG5cdFx0XHRkYXRhLm9iamVjdC5sZXZlbHMucHVzaCgge1xuXHRcdFx0XHRvYmplY3Q6IGxldmVsLm9iamVjdC51dWlkLFxuXHRcdFx0XHRkaXN0YW5jZTogbGV2ZWwuZGlzdGFuY2Vcblx0XHRcdH0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtaWNoYWVsIGd1ZXJyZXJvIC8gaHR0cDovL3JlYWxpdHltZWx0ZG93bi5jb21cbiAqIEBhdXRob3IgaWtlcnIgLyBodHRwOi8vdmVyb2xkLmNvbVxuICovXG5cbmZ1bmN0aW9uIFNrZWxldG9uKCBib25lcywgYm9uZUludmVyc2VzICkge1xuXG5cdC8vIGNvcHkgdGhlIGJvbmUgYXJyYXlcblxuXHRib25lcyA9IGJvbmVzIHx8IFtdO1xuXG5cdHRoaXMuYm9uZXMgPSBib25lcy5zbGljZSggMCApO1xuXHR0aGlzLmJvbmVNYXRyaWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIHRoaXMuYm9uZXMubGVuZ3RoICogMTYgKTtcblxuXHQvLyB1c2UgdGhlIHN1cHBsaWVkIGJvbmUgaW52ZXJzZXMgb3IgY2FsY3VsYXRlIHRoZSBpbnZlcnNlc1xuXG5cdGlmICggYm9uZUludmVyc2VzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHR0aGlzLmNhbGN1bGF0ZUludmVyc2VzKCk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGlmICggdGhpcy5ib25lcy5sZW5ndGggPT09IGJvbmVJbnZlcnNlcy5sZW5ndGggKSB7XG5cblx0XHRcdHRoaXMuYm9uZUludmVyc2VzID0gYm9uZUludmVyc2VzLnNsaWNlKCAwICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Ta2VsZXRvbiBib25lSW52ZXJzZXMgaXMgdGhlIHdyb25nIGxlbmd0aC4nICk7XG5cblx0XHRcdHRoaXMuYm9uZUludmVyc2VzID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdHRoaXMuYm9uZUludmVyc2VzLnB1c2goIG5ldyBNYXRyaXg0KCkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5PYmplY3QuYXNzaWduKCBTa2VsZXRvbi5wcm90b3R5cGUsIHtcblxuXHRjYWxjdWxhdGVJbnZlcnNlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5ib25lSW52ZXJzZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgaW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRcdGlmICggdGhpcy5ib25lc1sgaSBdICkge1xuXG5cdFx0XHRcdGludmVyc2UuZ2V0SW52ZXJzZSggdGhpcy5ib25lc1sgaSBdLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5ib25lSW52ZXJzZXMucHVzaCggaW52ZXJzZSApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0cG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJvbmUsIGksIGlsO1xuXG5cdFx0Ly8gcmVjb3ZlciB0aGUgYmluZC10aW1lIHdvcmxkIG1hdHJpY2VzXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRib25lID0gdGhpcy5ib25lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGJvbmUgKSB7XG5cblx0XHRcdFx0Ym9uZS5tYXRyaXhXb3JsZC5nZXRJbnZlcnNlKCB0aGlzLmJvbmVJbnZlcnNlc1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGNvbXB1dGUgdGhlIGxvY2FsIG1hdHJpY2VzLCBwb3NpdGlvbnMsIHJvdGF0aW9ucyBhbmQgc2NhbGVzXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRib25lID0gdGhpcy5ib25lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGJvbmUgKSB7XG5cblx0XHRcdFx0aWYgKCBib25lLnBhcmVudCAmJiBib25lLnBhcmVudC5pc0JvbmUgKSB7XG5cblx0XHRcdFx0XHRib25lLm1hdHJpeC5nZXRJbnZlcnNlKCBib25lLnBhcmVudC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHRcdGJvbmUubWF0cml4Lm11bHRpcGx5KCBib25lLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGJvbmUubWF0cml4LmNvcHkoIGJvbmUubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ym9uZS5tYXRyaXguZGVjb21wb3NlKCBib25lLnBvc2l0aW9uLCBib25lLnF1YXRlcm5pb24sIGJvbmUuc2NhbGUgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0dXBkYXRlOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvZmZzZXRNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHRcdHZhciBpZGVudGl0eU1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0XHR2YXIgYm9uZXMgPSB0aGlzLmJvbmVzO1xuXHRcdFx0dmFyIGJvbmVJbnZlcnNlcyA9IHRoaXMuYm9uZUludmVyc2VzO1xuXHRcdFx0dmFyIGJvbmVNYXRyaWNlcyA9IHRoaXMuYm9uZU1hdHJpY2VzO1xuXHRcdFx0dmFyIGJvbmVUZXh0dXJlID0gdGhpcy5ib25lVGV4dHVyZTtcblxuXHRcdFx0Ly8gZmxhdHRlbiBib25lIG1hdHJpY2VzIHRvIGFycmF5XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHQvLyBjb21wdXRlIHRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgY3VycmVudCBhbmQgdGhlIG9yaWdpbmFsIHRyYW5zZm9ybVxuXG5cdFx0XHRcdHZhciBtYXRyaXggPSBib25lc1sgaSBdID8gYm9uZXNbIGkgXS5tYXRyaXhXb3JsZCA6IGlkZW50aXR5TWF0cml4O1xuXG5cdFx0XHRcdG9mZnNldE1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXgsIGJvbmVJbnZlcnNlc1sgaSBdICk7XG5cdFx0XHRcdG9mZnNldE1hdHJpeC50b0FycmF5KCBib25lTWF0cmljZXMsIGkgKiAxNiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggYm9uZVRleHR1cmUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRib25lVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSApKCksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgU2tlbGV0b24oIHRoaXMuYm9uZXMsIHRoaXMuYm9uZUludmVyc2VzICk7XG5cblx0fSxcblxuXHRnZXRCb25lQnlOYW1lOiBmdW5jdGlvbiAoIG5hbWUgKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGJvbmUgPSB0aGlzLmJvbmVzWyBpIF07XG5cblx0XHRcdGlmICggYm9uZS5uYW1lID09PSBuYW1lICkge1xuXG5cdFx0XHRcdHJldHVybiBib25lO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBpa2VyciAvIGh0dHA6Ly92ZXJvbGQuY29tXG4gKi9cblxuZnVuY3Rpb24gQm9uZSgpIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0JvbmUnO1xuXG59XG5cbkJvbmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQm9uZSxcblxuXHRpc0JvbmU6IHRydWVcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBpa2VyciAvIGh0dHA6Ly92ZXJvbGQuY29tXG4gKi9cblxuZnVuY3Rpb24gU2tpbm5lZE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRNZXNoLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdHRoaXMudHlwZSA9ICdTa2lubmVkTWVzaCc7XG5cblx0dGhpcy5iaW5kTW9kZSA9ICdhdHRhY2hlZCc7XG5cdHRoaXMuYmluZE1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdHRoaXMuYmluZE1hdHJpeEludmVyc2UgPSBuZXcgTWF0cml4NCgpO1xuXG5cdHZhciBib25lcyA9IHRoaXMuaW5pdEJvbmVzKCk7XG5cdHZhciBza2VsZXRvbiA9IG5ldyBTa2VsZXRvbiggYm9uZXMgKTtcblxuXHR0aGlzLmJpbmQoIHNrZWxldG9uLCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0dGhpcy5ub3JtYWxpemVTa2luV2VpZ2h0cygpO1xuXG59XG5cblNraW5uZWRNZXNoLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE1lc2gucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogU2tpbm5lZE1lc2gsXG5cblx0aXNTa2lubmVkTWVzaDogdHJ1ZSxcblxuXHRpbml0Qm9uZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBib25lcyA9IFtdLCBib25lLCBnYm9uZTtcblx0XHR2YXIgaSwgaWw7XG5cblx0XHRpZiAoIHRoaXMuZ2VvbWV0cnkgJiYgdGhpcy5nZW9tZXRyeS5ib25lcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBmaXJzdCwgY3JlYXRlIGFycmF5IG9mICdCb25lJyBvYmplY3RzIGZyb20gZ2VvbWV0cnkgZGF0YVxuXG5cdFx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmdlb21ldHJ5LmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdGdib25lID0gdGhpcy5nZW9tZXRyeS5ib25lc1sgaSBdO1xuXG5cdFx0XHRcdC8vIGNyZWF0ZSBuZXcgJ0JvbmUnIG9iamVjdFxuXG5cdFx0XHRcdGJvbmUgPSBuZXcgQm9uZSgpO1xuXHRcdFx0XHRib25lcy5wdXNoKCBib25lICk7XG5cblx0XHRcdFx0Ly8gYXBwbHkgdmFsdWVzXG5cblx0XHRcdFx0Ym9uZS5uYW1lID0gZ2JvbmUubmFtZTtcblx0XHRcdFx0Ym9uZS5wb3NpdGlvbi5mcm9tQXJyYXkoIGdib25lLnBvcyApO1xuXHRcdFx0XHRib25lLnF1YXRlcm5pb24uZnJvbUFycmF5KCBnYm9uZS5yb3RxICk7XG5cdFx0XHRcdGlmICggZ2JvbmUuc2NsICE9PSB1bmRlZmluZWQgKSBib25lLnNjYWxlLmZyb21BcnJheSggZ2JvbmUuc2NsICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gc2Vjb25kLCBjcmVhdGUgYm9uZSBoaWVyYXJjaHlcblxuXHRcdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy5nZW9tZXRyeS5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRnYm9uZSA9IHRoaXMuZ2VvbWV0cnkuYm9uZXNbIGkgXTtcblxuXHRcdFx0XHRpZiAoICggZ2JvbmUucGFyZW50ICE9PSAtIDEgKSAmJiAoIGdib25lLnBhcmVudCAhPT0gbnVsbCApICYmICggYm9uZXNbIGdib25lLnBhcmVudCBdICE9PSB1bmRlZmluZWQgKSApIHtcblxuXHRcdFx0XHRcdC8vIHN1YnNlcXVlbnQgYm9uZXMgaW4gdGhlIGhpZXJhcmNoeVxuXG5cdFx0XHRcdFx0Ym9uZXNbIGdib25lLnBhcmVudCBdLmFkZCggYm9uZXNbIGkgXSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyB0b3Btb3N0IGJvbmUsIGltbWVkaWF0ZSBjaGlsZCBvZiB0aGUgc2tpbm5lZCBtZXNoXG5cblx0XHRcdFx0XHR0aGlzLmFkZCggYm9uZXNbIGkgXSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gbm93IHRoZSBib25lcyBhcmUgcGFydCBvZiB0aGUgc2NlbmUgZ3JhcGggYW5kIGNoaWxkcmVuIG9mIHRoZSBza2lubmVkIG1lc2guXG5cdFx0Ly8gbGV0J3MgdXBkYXRlIHRoZSBjb3JyZXNwb25kaW5nIG1hdHJpY2VzXG5cblx0XHR0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRyZXR1cm4gYm9uZXM7XG5cblx0fSxcblxuXHRiaW5kOiBmdW5jdGlvbiAoIHNrZWxldG9uLCBiaW5kTWF0cml4ICkge1xuXG5cdFx0dGhpcy5za2VsZXRvbiA9IHNrZWxldG9uO1xuXG5cdFx0aWYgKCBiaW5kTWF0cml4ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcblxuXHRcdFx0dGhpcy5za2VsZXRvbi5jYWxjdWxhdGVJbnZlcnNlcygpO1xuXG5cdFx0XHRiaW5kTWF0cml4ID0gdGhpcy5tYXRyaXhXb3JsZDtcblxuXHRcdH1cblxuXHRcdHRoaXMuYmluZE1hdHJpeC5jb3B5KCBiaW5kTWF0cml4ICk7XG5cdFx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKCBiaW5kTWF0cml4ICk7XG5cblx0fSxcblxuXHRwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnNrZWxldG9uLnBvc2UoKTtcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZVNraW5XZWlnaHRzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc2NhbGUsIGk7XG5cblx0XHRpZiAoIHRoaXMuZ2VvbWV0cnkgJiYgdGhpcy5nZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IHRoaXMuZ2VvbWV0cnkuc2tpbldlaWdodHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBzdyA9IHRoaXMuZ2VvbWV0cnkuc2tpbldlaWdodHNbIGkgXTtcblxuXHRcdFx0XHRzY2FsZSA9IDEuMCAvIHN3Lm1hbmhhdHRhbkxlbmd0aCgpO1xuXG5cdFx0XHRcdGlmICggc2NhbGUgIT09IEluZmluaXR5ICkge1xuXG5cdFx0XHRcdFx0c3cubXVsdGlwbHlTY2FsYXIoIHNjYWxlICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHN3LnNldCggMSwgMCwgMCwgMCApOyAvLyBkbyBzb21ldGhpbmcgcmVhc29uYWJsZVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggdGhpcy5nZW9tZXRyeSAmJiB0aGlzLmdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciB2ZWMgPSBuZXcgVmVjdG9yNCgpO1xuXG5cdFx0XHR2YXIgc2tpbldlaWdodCA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luV2VpZ2h0O1xuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IHNraW5XZWlnaHQuY291bnQ7IGkgKysgKSB7XG5cblx0XHRcdFx0dmVjLnggPSBza2luV2VpZ2h0LmdldFgoIGkgKTtcblx0XHRcdFx0dmVjLnkgPSBza2luV2VpZ2h0LmdldFkoIGkgKTtcblx0XHRcdFx0dmVjLnogPSBza2luV2VpZ2h0LmdldFooIGkgKTtcblx0XHRcdFx0dmVjLncgPSBza2luV2VpZ2h0LmdldFcoIGkgKTtcblxuXHRcdFx0XHRzY2FsZSA9IDEuMCAvIHZlYy5tYW5oYXR0YW5MZW5ndGgoKTtcblxuXHRcdFx0XHRpZiAoIHNjYWxlICE9PSBJbmZpbml0eSApIHtcblxuXHRcdFx0XHRcdHZlYy5tdWx0aXBseVNjYWxhciggc2NhbGUgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dmVjLnNldCggMSwgMCwgMCwgMCApOyAvLyBkbyBzb21ldGhpbmcgcmVhc29uYWJsZVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRza2luV2VpZ2h0LnNldFhZWlcoIGksIHZlYy54LCB2ZWMueSwgdmVjLnosIHZlYy53ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkOiBmdW5jdGlvbiAoIGZvcmNlICkge1xuXG5cdFx0TWVzaC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxuXHRcdGlmICggdGhpcy5iaW5kTW9kZSA9PT0gJ2F0dGFjaGVkJyApIHtcblxuXHRcdFx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHR9IGVsc2UgaWYgKCB0aGlzLmJpbmRNb2RlID09PSAnZGV0YWNoZWQnICkge1xuXG5cdFx0XHR0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmdldEludmVyc2UoIHRoaXMuYmluZE1hdHJpeCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2tpbm5lZE1lc2g6IFVucmVjb2duaXplZCBiaW5kTW9kZTogJyArIHRoaXMuYmluZE1vZGUgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbGluZXdpZHRoOiA8ZmxvYXQ+LFxuICogIGxpbmVjYXA6IFwicm91bmRcIixcbiAqICBsaW5lam9pbjogXCJyb3VuZFwiXG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTGluZUJhc2ljTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lQmFzaWNNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcblxuXHR0aGlzLmxpbmV3aWR0aCA9IDE7XG5cdHRoaXMubGluZWNhcCA9ICdyb3VuZCc7XG5cdHRoaXMubGluZWpvaW4gPSAncm91bmQnO1xuXG5cdHRoaXMubGlnaHRzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5MaW5lQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbkxpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVCYXNpY01hdGVyaWFsO1xuXG5MaW5lQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuaXNMaW5lQmFzaWNNYXRlcmlhbCA9IHRydWU7XG5cbkxpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHR0aGlzLmxpbmV3aWR0aCA9IHNvdXJjZS5saW5ld2lkdGg7XG5cdHRoaXMubGluZWNhcCA9IHNvdXJjZS5saW5lY2FwO1xuXHR0aGlzLmxpbmVqb2luID0gc291cmNlLmxpbmVqb2luO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsLCBtb2RlICkge1xuXG5cdGlmICggbW9kZSA9PT0gMSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmU6IHBhcmFtZXRlciBUSFJFRS5MaW5lUGllY2VzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIENyZWF0ZWQgVEhSRUUuTGluZVNlZ21lbnRzIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiBuZXcgTGluZVNlZ21lbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHR9XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lJztcblxuXHR0aGlzLmdlb21ldHJ5ID0gZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCA/IGdlb21ldHJ5IDogbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWwgOiBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZiB9ICk7XG5cbn1cblxuTGluZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaW5lLFxuXG5cdGlzTGluZTogdHJ1ZSxcblxuXHRjb21wdXRlTGluZURpc3RhbmNlczogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc3RhcnQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBlbmQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNvbXB1dGVMaW5lRGlzdGFuY2VzKCkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0Ly8gd2UgYXNzdW1lIG5vbi1pbmRleGVkIGdlb21ldHJ5XG5cblx0XHRcdFx0aWYgKCBnZW9tZXRyeS5pbmRleCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdHZhciBwb3NpdGlvbkF0dHJpYnV0ZSA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0XHRcdFx0dmFyIGxpbmVEaXN0YW5jZXMgPSBbIDAgXTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMSwgbCA9IHBvc2l0aW9uQXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0c3RhcnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgLSAxICk7XG5cdFx0XHRcdFx0XHRlbmQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgKTtcblxuXHRcdFx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSBdID0gbGluZURpc3RhbmNlc1sgaSAtIDEgXTtcblx0XHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSArPSBzdGFydC5kaXN0YW5jZVRvKCBlbmQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2xpbmVEaXN0YW5jZScsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBsaW5lRGlzdGFuY2VzLCAxICkgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblx0XHRcdFx0dmFyIGxpbmVEaXN0YW5jZXMgPSBnZW9tZXRyeS5saW5lRGlzdGFuY2VzO1xuXG5cdFx0XHRcdGxpbmVEaXN0YW5jZXNbIDAgXSA9IDA7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSA9IGxpbmVEaXN0YW5jZXNbIGkgLSAxIF07XG5cdFx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSBdICs9IHZlcnRpY2VzWyBpIC0gMSBdLmRpc3RhbmNlVG8oIHZlcnRpY2VzWyBpIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdHJheWNhc3Q6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGludmVyc2VNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHRcdHZhciByYXkgPSBuZXcgUmF5KCk7XG5cdFx0dmFyIHNwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XG5cblx0XHRcdHZhciBwcmVjaXNpb24gPSByYXljYXN0ZXIubGluZVByZWNpc2lvbjtcblx0XHRcdHZhciBwcmVjaXNpb25TcSA9IHByZWNpc2lvbiAqIHByZWNpc2lvbjtcblxuXHRcdFx0dmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblx0XHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7XG5cblx0XHRcdC8vIENoZWNraW5nIGJvdW5kaW5nU3BoZXJlIGRpc3RhbmNlIHRvIHJheVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRcdHNwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApO1xuXHRcdFx0c3BoZXJlLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcblxuXHRcdFx0aWYgKCByYXljYXN0ZXIucmF5LmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdFx0Ly9cblxuXHRcdFx0aW52ZXJzZU1hdHJpeC5nZXRJbnZlcnNlKCBtYXRyaXhXb3JsZCApO1xuXHRcdFx0cmF5LmNvcHkoIHJheWNhc3Rlci5yYXkgKS5hcHBseU1hdHJpeDQoIGludmVyc2VNYXRyaXggKTtcblxuXHRcdFx0dmFyIHZTdGFydCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHR2YXIgdkVuZCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHR2YXIgaW50ZXJTZWdtZW50ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdHZhciBpbnRlclJheSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHR2YXIgc3RlcCA9ICggdGhpcyAmJiB0aGlzLmlzTGluZVNlZ21lbnRzICkgPyAyIDogMTtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRcdHZhciBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdFx0XHR2YXIgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cdFx0XHRcdHZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXG5cdFx0XHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHR2YXIgaW5kaWNlcyA9IGluZGV4LmFycmF5O1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gaW5kaWNlcy5sZW5ndGggLSAxOyBpIDwgbDsgaSArPSBzdGVwICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgYSA9IGluZGljZXNbIGkgXTtcblx0XHRcdFx0XHRcdHZhciBiID0gaW5kaWNlc1sgaSArIDEgXTtcblxuXHRcdFx0XHRcdFx0dlN0YXJ0LmZyb21BcnJheSggcG9zaXRpb25zLCBhICogMyApO1xuXHRcdFx0XHRcdFx0dkVuZC5mcm9tQXJyYXkoIHBvc2l0aW9ucywgYiAqIDMgKTtcblxuXHRcdFx0XHRcdFx0dmFyIGRpc3RTcSA9IHJheS5kaXN0YW5jZVNxVG9TZWdtZW50KCB2U3RhcnQsIHZFbmQsIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBkaXN0U3EgPiBwcmVjaXNpb25TcSApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRpbnRlclJheS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTsgLy9Nb3ZlIGJhY2sgdG8gd29ybGQgc3BhY2UgZm9yIGRpc3RhbmNlIGNhbGN1bGF0aW9uXG5cblx0XHRcdFx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyUmF5ICk7XG5cblx0XHRcdFx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRcdFx0XHQvLyBXaGF0IGRvIHdlIHdhbnQ/IGludGVyc2VjdGlvbiBwb2ludCBvbiB0aGUgcmF5IG9yIG9uIHRoZSBzZWdtZW50Pz9cblx0XHRcdFx0XHRcdFx0Ly8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksXG5cdFx0XHRcdFx0XHRcdHBvaW50OiBpbnRlclNlZ21lbnQuY2xvbmUoKS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKSxcblx0XHRcdFx0XHRcdFx0aW5kZXg6IGksXG5cdFx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRcdGZhY2VJbmRleDogbnVsbCxcblx0XHRcdFx0XHRcdFx0b2JqZWN0OiB0aGlzXG5cblx0XHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9zaXRpb25zLmxlbmd0aCAvIDMgLSAxOyBpIDwgbDsgaSArPSBzdGVwICkge1xuXG5cdFx0XHRcdFx0XHR2U3RhcnQuZnJvbUFycmF5KCBwb3NpdGlvbnMsIDMgKiBpICk7XG5cdFx0XHRcdFx0XHR2RW5kLmZyb21BcnJheSggcG9zaXRpb25zLCAzICogaSArIDMgKTtcblxuXHRcdFx0XHRcdFx0dmFyIGRpc3RTcSA9IHJheS5kaXN0YW5jZVNxVG9TZWdtZW50KCB2U3RhcnQsIHZFbmQsIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBkaXN0U3EgPiBwcmVjaXNpb25TcSApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRpbnRlclJheS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTsgLy9Nb3ZlIGJhY2sgdG8gd29ybGQgc3BhY2UgZm9yIGRpc3RhbmNlIGNhbGN1bGF0aW9uXG5cblx0XHRcdFx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyUmF5ICk7XG5cblx0XHRcdFx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRcdFx0XHQvLyBXaGF0IGRvIHdlIHdhbnQ/IGludGVyc2VjdGlvbiBwb2ludCBvbiB0aGUgcmF5IG9yIG9uIHRoZSBzZWdtZW50Pz9cblx0XHRcdFx0XHRcdFx0Ly8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksXG5cdFx0XHRcdFx0XHRcdHBvaW50OiBpbnRlclNlZ21lbnQuY2xvbmUoKS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKSxcblx0XHRcdFx0XHRcdFx0aW5kZXg6IGksXG5cdFx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRcdGZhY2VJbmRleDogbnVsbCxcblx0XHRcdFx0XHRcdFx0b2JqZWN0OiB0aGlzXG5cblx0XHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7XG5cdFx0XHRcdHZhciBuYlZlcnRpY2VzID0gdmVydGljZXMubGVuZ3RoO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IG5iVmVydGljZXMgLSAxOyBpICs9IHN0ZXAgKSB7XG5cblx0XHRcdFx0XHR2YXIgZGlzdFNxID0gcmF5LmRpc3RhbmNlU3FUb1NlZ21lbnQoIHZlcnRpY2VzWyBpIF0sIHZlcnRpY2VzWyBpICsgMSBdLCBpbnRlclJheSwgaW50ZXJTZWdtZW50ICk7XG5cblx0XHRcdFx0XHRpZiAoIGRpc3RTcSA+IHByZWNpc2lvblNxICkgY29udGludWU7XG5cblx0XHRcdFx0XHRpbnRlclJheS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTsgLy9Nb3ZlIGJhY2sgdG8gd29ybGQgc3BhY2UgZm9yIGRpc3RhbmNlIGNhbGN1bGF0aW9uXG5cblx0XHRcdFx0XHR2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlclJheSApO1xuXG5cdFx0XHRcdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdFx0XHRcdC8vIFdoYXQgZG8gd2Ugd2FudD8gaW50ZXJzZWN0aW9uIHBvaW50IG9uIHRoZSByYXkgb3Igb24gdGhlIHNlZ21lbnQ/P1xuXHRcdFx0XHRcdFx0Ly8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksXG5cdFx0XHRcdFx0XHRwb2ludDogaW50ZXJTZWdtZW50LmNsb25lKCkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICksXG5cdFx0XHRcdFx0XHRpbmRleDogaSxcblx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRmYWNlSW5kZXg6IG51bGwsXG5cdFx0XHRcdFx0XHRvYmplY3Q6IHRoaXNcblxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpICksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5nZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIExpbmVTZWdtZW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdExpbmUuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVTZWdtZW50cyc7XG5cbn1cblxuTGluZVNlZ21lbnRzLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpbmUucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTGluZVNlZ21lbnRzLFxuXG5cdGlzTGluZVNlZ21lbnRzOiB0cnVlLFxuXG5cdGNvbXB1dGVMaW5lRGlzdGFuY2VzOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzdGFydCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGVuZCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSB7XG5cblx0XHRcdHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHQvLyB3ZSBhc3N1bWUgbm9uLWluZGV4ZWQgZ2VvbWV0cnlcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5LmluZGV4ID09PSBudWxsICkge1xuXG5cdFx0XHRcdFx0dmFyIHBvc2l0aW9uQXR0cmlidXRlID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblx0XHRcdFx0XHR2YXIgbGluZURpc3RhbmNlcyA9IFtdO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9zaXRpb25BdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICs9IDIgKSB7XG5cblx0XHRcdFx0XHRcdHN0YXJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICk7XG5cdFx0XHRcdFx0XHRlbmQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgKyAxICk7XG5cblx0XHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSA9ICggaSA9PT0gMCApID8gMCA6IGxpbmVEaXN0YW5jZXNbIGkgLSAxIF07XG5cdFx0XHRcdFx0XHRsaW5lRGlzdGFuY2VzWyBpICsgMSBdID0gbGluZURpc3RhbmNlc1sgaSBdICsgc3RhcnQuZGlzdGFuY2VUbyggZW5kICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdsaW5lRGlzdGFuY2UnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbGluZURpc3RhbmNlcywgMSApICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmVTZWdtZW50cy5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblx0XHRcdFx0dmFyIGxpbmVEaXN0YW5jZXMgPSBnZW9tZXRyeS5saW5lRGlzdGFuY2VzO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKz0gMiApIHtcblxuXHRcdFx0XHRcdHN0YXJ0LmNvcHkoIHZlcnRpY2VzWyBpIF0gKTtcblx0XHRcdFx0XHRlbmQuY29weSggdmVydGljZXNbIGkgKyAxIF0gKTtcblxuXHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSA9ICggaSA9PT0gMCApID8gMCA6IGxpbmVEaXN0YW5jZXNbIGkgLSAxIF07XG5cdFx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSArIDEgXSA9IGxpbmVEaXN0YW5jZXNbIGkgXSArIHN0YXJ0LmRpc3RhbmNlVG8oIGVuZCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpIClcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWdyZXRlciAvIGh0dHA6Ly9naXRodWIuY29tL21ncmV0ZXJcbiAqL1xuXG5mdW5jdGlvbiBMaW5lTG9vcCggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdExpbmUuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVMb29wJztcblxufVxuXG5MaW5lTG9vcC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaW5lLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExpbmVMb29wLFxuXG5cdGlzTGluZUxvb3A6IHRydWUsXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgc2l6ZTogPGZsb2F0PixcbiAqICBzaXplQXR0ZW51YXRpb246IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIFBvaW50c01hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUG9pbnRzTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7XG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMuc2l6ZSA9IDE7XG5cdHRoaXMuc2l6ZUF0dGVudWF0aW9uID0gdHJ1ZTtcblxuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuUG9pbnRzTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5Qb2ludHNNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2ludHNNYXRlcmlhbDtcblxuUG9pbnRzTWF0ZXJpYWwucHJvdG90eXBlLmlzUG9pbnRzTWF0ZXJpYWwgPSB0cnVlO1xuXG5Qb2ludHNNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMuc2l6ZSA9IHNvdXJjZS5zaXplO1xuXHR0aGlzLnNpemVBdHRlbnVhdGlvbiA9IHNvdXJjZS5zaXplQXR0ZW51YXRpb247XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBQb2ludHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BvaW50cyc7XG5cblx0dGhpcy5nZW9tZXRyeSA9IGdlb21ldHJ5ICE9PSB1bmRlZmluZWQgPyBnZW9tZXRyeSA6IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHR0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWwgIT09IHVuZGVmaW5lZCA/IG1hdGVyaWFsIDogbmV3IFBvaW50c01hdGVyaWFsKCB7IGNvbG9yOiBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmYgfSApO1xuXG59XG5cblBvaW50cy5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBQb2ludHMsXG5cblx0aXNQb2ludHM6IHRydWUsXG5cblx0cmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW52ZXJzZU1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdFx0dmFyIHJheSA9IG5ldyBSYXkoKTtcblx0XHR2YXIgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcblxuXHRcdFx0dmFyIG9iamVjdCA9IHRoaXM7XG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdFx0dmFyIG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDtcblx0XHRcdHZhciB0aHJlc2hvbGQgPSByYXljYXN0ZXIucGFyYW1zLlBvaW50cy50aHJlc2hvbGQ7XG5cblx0XHRcdC8vIENoZWNraW5nIGJvdW5kaW5nU3BoZXJlIGRpc3RhbmNlIHRvIHJheVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRcdHNwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApO1xuXHRcdFx0c3BoZXJlLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcblx0XHRcdHNwaGVyZS5yYWRpdXMgKz0gdGhyZXNob2xkO1xuXG5cdFx0XHRpZiAoIHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0XHQvL1xuXG5cdFx0XHRpbnZlcnNlTWF0cml4LmdldEludmVyc2UoIG1hdHJpeFdvcmxkICk7XG5cdFx0XHRyYXkuY29weSggcmF5Y2FzdGVyLnJheSApLmFwcGx5TWF0cml4NCggaW52ZXJzZU1hdHJpeCApO1xuXG5cdFx0XHR2YXIgbG9jYWxUaHJlc2hvbGQgPSB0aHJlc2hvbGQgLyAoICggdGhpcy5zY2FsZS54ICsgdGhpcy5zY2FsZS55ICsgdGhpcy5zY2FsZS56ICkgLyAzICk7XG5cdFx0XHR2YXIgbG9jYWxUaHJlc2hvbGRTcSA9IGxvY2FsVGhyZXNob2xkICogbG9jYWxUaHJlc2hvbGQ7XG5cdFx0XHR2YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0dmFyIGludGVyc2VjdFBvaW50ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0ZnVuY3Rpb24gdGVzdFBvaW50KCBwb2ludCwgaW5kZXggKSB7XG5cblx0XHRcdFx0dmFyIHJheVBvaW50RGlzdGFuY2VTcSA9IHJheS5kaXN0YW5jZVNxVG9Qb2ludCggcG9pbnQgKTtcblxuXHRcdFx0XHRpZiAoIHJheVBvaW50RGlzdGFuY2VTcSA8IGxvY2FsVGhyZXNob2xkU3EgKSB7XG5cblx0XHRcdFx0XHRyYXkuY2xvc2VzdFBvaW50VG9Qb2ludCggcG9pbnQsIGludGVyc2VjdFBvaW50ICk7XG5cdFx0XHRcdFx0aW50ZXJzZWN0UG9pbnQuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdFx0dmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJzZWN0UG9pbnQgKTtcblxuXHRcdFx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm47XG5cblx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIHtcblxuXHRcdFx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRcdFx0ZGlzdGFuY2VUb1JheTogTWF0aC5zcXJ0KCByYXlQb2ludERpc3RhbmNlU3EgKSxcblx0XHRcdFx0XHRcdHBvaW50OiBpbnRlcnNlY3RQb2ludC5jbG9uZSgpLFxuXHRcdFx0XHRcdFx0aW5kZXg6IGluZGV4LFxuXHRcdFx0XHRcdFx0ZmFjZTogbnVsbCxcblx0XHRcdFx0XHRcdG9iamVjdDogb2JqZWN0XG5cblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcblx0XHRcdFx0dmFyIGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXHRcdFx0XHR2YXIgcG9zaXRpb25zID0gYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcblxuXHRcdFx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdFx0dmFyIGluZGljZXMgPSBpbmRleC5hcnJheTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBpbmRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgYSA9IGluZGljZXNbIGkgXTtcblxuXHRcdFx0XHRcdFx0cG9zaXRpb24uZnJvbUFycmF5KCBwb3NpdGlvbnMsIGEgKiAzICk7XG5cblx0XHRcdFx0XHRcdHRlc3RQb2ludCggcG9zaXRpb24sIGEgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9zaXRpb25zLmxlbmd0aCAvIDM7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRwb3NpdGlvbi5mcm9tQXJyYXkoIHBvc2l0aW9ucywgaSAqIDMgKTtcblxuXHRcdFx0XHRcdFx0dGVzdFBvaW50KCBwb3NpdGlvbiwgaSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB2ZXJ0aWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dGVzdFBvaW50KCB2ZXJ0aWNlc1sgaSBdLCBpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBHcm91cCgpIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0dyb3VwJztcblxufVxuXG5Hcm91cC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBHcm91cCxcblxuXHRpc0dyb3VwOiB0cnVlXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFZpZGVvVGV4dHVyZSggdmlkZW8sIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApIHtcblxuXHRUZXh0dXJlLmNhbGwoIHRoaXMsIHZpZGVvLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKTtcblxuXHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXG59XG5cblZpZGVvVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFZpZGVvVGV4dHVyZSxcblxuXHRpc1ZpZGVvVGV4dHVyZTogdHJ1ZSxcblxuXHR1cGRhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2aWRlbyA9IHRoaXMuaW1hZ2U7XG5cblx0XHRpZiAoIHZpZGVvLnJlYWR5U3RhdGUgPj0gdmlkZW8uSEFWRV9DVVJSRU5UX0RBVEEgKSB7XG5cblx0XHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gQ29tcHJlc3NlZFRleHR1cmUoIG1pcG1hcHMsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgYW5pc290cm9weSwgZW5jb2RpbmcgKSB7XG5cblx0VGV4dHVyZS5jYWxsKCB0aGlzLCBudWxsLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICk7XG5cblx0dGhpcy5pbWFnZSA9IHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xuXHR0aGlzLm1pcG1hcHMgPSBtaXBtYXBzO1xuXG5cdC8vIG5vIGZsaXBwaW5nIGZvciBjdWJlIHRleHR1cmVzXG5cdC8vIChhbHNvIGZsaXBwaW5nIGRvZXNuJ3Qgd29yayBmb3IgY29tcHJlc3NlZCB0ZXh0dXJlcyApXG5cblx0dGhpcy5mbGlwWSA9IGZhbHNlO1xuXG5cdC8vIGNhbid0IGdlbmVyYXRlIG1pcG1hcHMgZm9yIGNvbXByZXNzZWQgdGV4dHVyZXNcblx0Ly8gbWlwcyBtdXN0IGJlIGVtYmVkZGVkIGluIEREUyBmaWxlc1xuXG5cdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG5cbn1cblxuQ29tcHJlc3NlZFRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkNvbXByZXNzZWRUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbXByZXNzZWRUZXh0dXJlO1xuXG5Db21wcmVzc2VkVGV4dHVyZS5wcm90b3R5cGUuaXNDb21wcmVzc2VkVGV4dHVyZSA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBNYXR0IERlc0xhdXJpZXJzIC8gQG1hdHRkZXNsXG4gKiBAYXV0aG9yIGF0aXggLyBhcnRodXJzaWxiZXIuZGVcbiAqL1xuXG5mdW5jdGlvbiBEZXB0aFRleHR1cmUoIHdpZHRoLCBoZWlnaHQsIHR5cGUsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGFuaXNvdHJvcHksIGZvcm1hdCApIHtcblxuXHRmb3JtYXQgPSBmb3JtYXQgIT09IHVuZGVmaW5lZCA/IGZvcm1hdCA6IERlcHRoRm9ybWF0O1xuXG5cdGlmICggZm9ybWF0ICE9PSBEZXB0aEZvcm1hdCAmJiBmb3JtYXQgIT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHtcblxuXHRcdHRocm93IG5ldyBFcnJvciggJ0RlcHRoVGV4dHVyZSBmb3JtYXQgbXVzdCBiZSBlaXRoZXIgVEhSRUUuRGVwdGhGb3JtYXQgb3IgVEhSRUUuRGVwdGhTdGVuY2lsRm9ybWF0JyApO1xuXG5cdH1cblxuXHRpZiAoIHR5cGUgPT09IHVuZGVmaW5lZCAmJiBmb3JtYXQgPT09IERlcHRoRm9ybWF0ICkgdHlwZSA9IFVuc2lnbmVkU2hvcnRUeXBlO1xuXHRpZiAoIHR5cGUgPT09IHVuZGVmaW5lZCAmJiBmb3JtYXQgPT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHR5cGUgPSBVbnNpZ25lZEludDI0OFR5cGU7XG5cblx0VGV4dHVyZS5jYWxsKCB0aGlzLCBudWxsLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKTtcblxuXHR0aGlzLmltYWdlID0geyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XG5cblx0dGhpcy5tYWdGaWx0ZXIgPSBtYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1hZ0ZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7XG5cdHRoaXMubWluRmlsdGVyID0gbWluRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtaW5GaWx0ZXIgOiBOZWFyZXN0RmlsdGVyO1xuXG5cdHRoaXMuZmxpcFkgPSBmYWxzZTtcblx0dGhpcy5nZW5lcmF0ZU1pcG1hcHNcdD0gZmFsc2U7XG5cbn1cblxuRGVwdGhUZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7XG5EZXB0aFRleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRGVwdGhUZXh0dXJlO1xuRGVwdGhUZXh0dXJlLnByb3RvdHlwZS5pc0RlcHRoVGV4dHVyZSA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuZnVuY3Rpb24gV2lyZWZyYW1lR2VvbWV0cnkoIGdlb21ldHJ5ICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnV2lyZWZyYW1lR2VvbWV0cnknO1xuXG5cdC8vIGJ1ZmZlclxuXG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgaSwgaiwgbCwgbywgb2w7XG5cdHZhciBlZGdlID0gWyAwLCAwIF0sIGVkZ2VzID0ge30sIGUsIGVkZ2UxLCBlZGdlMjtcblx0dmFyIGtleSwga2V5cyA9IFsgJ2EnLCAnYicsICdjJyBdO1xuXHR2YXIgdmVydGV4O1xuXG5cdC8vIGRpZmZlcmVudCBsb2dpYyBmb3IgR2VvbWV0cnkgYW5kIEJ1ZmZlckdlb21ldHJ5XG5cblx0aWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0Ly8gY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwgZWRnZXMgd2l0aG91dCBkdXBsaWNhdGVzXG5cblx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblxuXHRcdGZvciAoIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHRmb3IgKCBqID0gMDsgaiA8IDM7IGogKysgKSB7XG5cblx0XHRcdFx0ZWRnZTEgPSBmYWNlWyBrZXlzWyBqIF0gXTtcblx0XHRcdFx0ZWRnZTIgPSBmYWNlWyBrZXlzWyAoIGogKyAxICkgJSAzIF0gXTtcblx0XHRcdFx0ZWRnZVsgMCBdID0gTWF0aC5taW4oIGVkZ2UxLCBlZGdlMiApOyAvLyBzb3J0aW5nIHByZXZlbnRzIGR1cGxpY2F0ZXNcblx0XHRcdFx0ZWRnZVsgMSBdID0gTWF0aC5tYXgoIGVkZ2UxLCBlZGdlMiApO1xuXG5cdFx0XHRcdGtleSA9IGVkZ2VbIDAgXSArICcsJyArIGVkZ2VbIDEgXTtcblxuXHRcdFx0XHRpZiAoIGVkZ2VzWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0ZWRnZXNbIGtleSBdID0geyBpbmRleDE6IGVkZ2VbIDAgXSwgaW5kZXgyOiBlZGdlWyAxIF0gfTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzXG5cblx0XHRmb3IgKCBrZXkgaW4gZWRnZXMgKSB7XG5cblx0XHRcdGUgPSBlZGdlc1sga2V5IF07XG5cblx0XHRcdHZlcnRleCA9IGdlb21ldHJ5LnZlcnRpY2VzWyBlLmluZGV4MSBdO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHR2ZXJ0ZXggPSBnZW9tZXRyeS52ZXJ0aWNlc1sgZS5pbmRleDIgXTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdH1cblxuXHR9IGVsc2UgaWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIHBvc2l0aW9uLCBpbmRpY2VzLCBncm91cHM7XG5cdFx0dmFyIGdyb3VwLCBzdGFydCwgY291bnQ7XG5cdFx0dmFyIGluZGV4MSwgaW5kZXgyO1xuXG5cdFx0dmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdGlmICggZ2VvbWV0cnkuaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdC8vIGluZGV4ZWQgQnVmZmVyR2VvbWV0cnlcblxuXHRcdFx0cG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdFx0aW5kaWNlcyA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdFx0Z3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXG5cdFx0XHRpZiAoIGdyb3Vwcy5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdFx0Z3JvdXBzID0gWyB7IHN0YXJ0OiAwLCBjb3VudDogaW5kaWNlcy5jb3VudCwgbWF0ZXJpYWxJbmRleDogMCB9IF07XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwgZWdlcyB3aXRob3V0IGR1cGxpY2F0ZXNcblxuXHRcdFx0Zm9yICggbyA9IDAsIG9sID0gZ3JvdXBzLmxlbmd0aDsgbyA8IG9sOyArKyBvICkge1xuXG5cdFx0XHRcdGdyb3VwID0gZ3JvdXBzWyBvIF07XG5cblx0XHRcdFx0c3RhcnQgPSBncm91cC5zdGFydDtcblx0XHRcdFx0Y291bnQgPSBncm91cC5jb3VudDtcblxuXHRcdFx0XHRmb3IgKCBpID0gc3RhcnQsIGwgPSAoIHN0YXJ0ICsgY291bnQgKTsgaSA8IGw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdGZvciAoIGogPSAwOyBqIDwgMzsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0ZWRnZTEgPSBpbmRpY2VzLmdldFgoIGkgKyBqICk7XG5cdFx0XHRcdFx0XHRlZGdlMiA9IGluZGljZXMuZ2V0WCggaSArICggaiArIDEgKSAlIDMgKTtcblx0XHRcdFx0XHRcdGVkZ2VbIDAgXSA9IE1hdGgubWluKCBlZGdlMSwgZWRnZTIgKTsgLy8gc29ydGluZyBwcmV2ZW50cyBkdXBsaWNhdGVzXG5cdFx0XHRcdFx0XHRlZGdlWyAxIF0gPSBNYXRoLm1heCggZWRnZTEsIGVkZ2UyICk7XG5cblx0XHRcdFx0XHRcdGtleSA9IGVkZ2VbIDAgXSArICcsJyArIGVkZ2VbIDEgXTtcblxuXHRcdFx0XHRcdFx0aWYgKCBlZGdlc1sga2V5IF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRlZGdlc1sga2V5IF0gPSB7IGluZGV4MTogZWRnZVsgMCBdLCBpbmRleDI6IGVkZ2VbIDEgXSB9O1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzXG5cblx0XHRcdGZvciAoIGtleSBpbiBlZGdlcyApIHtcblxuXHRcdFx0XHRlID0gZWRnZXNbIGtleSBdO1xuXG5cdFx0XHRcdHZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgZS5pbmRleDEgKTtcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdHZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgZS5pbmRleDIgKTtcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeVxuXG5cdFx0XHRwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRcdGZvciAoIGkgPSAwLCBsID0gKCBwb3NpdGlvbi5jb3VudCAvIDMgKTsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0Zm9yICggaiA9IDA7IGogPCAzOyBqICsrICkge1xuXG5cdFx0XHRcdFx0Ly8gdGhyZWUgZWRnZXMgcGVyIHRyaWFuZ2xlLCBhbiBlZGdlIGlzIHJlcHJlc2VudGVkIGFzIChpbmRleDEsIGluZGV4Milcblx0XHRcdFx0XHQvLyBlLmcuIHRoZSBmaXJzdCB0cmlhbmdsZSBoYXMgdGhlIGZvbGxvd2luZyBlZGdlczogKDAsMSksKDEsMiksKDIsMClcblxuXHRcdFx0XHRcdGluZGV4MSA9IDMgKiBpICsgajtcblx0XHRcdFx0XHR2ZXJ0ZXguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGluZGV4MSApO1xuXHRcdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0XHRcdGluZGV4MiA9IDMgKiBpICsgKCAoIGogKyAxICkgJSAzICk7XG5cdFx0XHRcdFx0dmVydGV4LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBpbmRleDIgKTtcblx0XHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cbn1cblxuV2lyZWZyYW1lR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5XaXJlZnJhbWVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBXaXJlZnJhbWVHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwczovL2dpdGh1Yi5jb20veno4NVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqXG4gKiBQYXJhbWV0cmljIFN1cmZhY2VzIEdlb21ldHJ5XG4gKiBiYXNlZCBvbiB0aGUgYnJpbGxpYW50IGFydGljbGUgYnkgQHByaWRlb3V0IGh0dHA6Ly9wcmlkZW91dC5uZXQvYmxvZy8/cD00NFxuICovXG5cbi8vIFBhcmFtZXRyaWNHZW9tZXRyeVxuXG5mdW5jdGlvbiBQYXJhbWV0cmljR2VvbWV0cnkoIGZ1bmMsIHNsaWNlcywgc3RhY2tzICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGFyYW1ldHJpY0dlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0ZnVuYzogZnVuYyxcblx0XHRzbGljZXM6IHNsaWNlcyxcblx0XHRzdGFja3M6IHN0YWNrc1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5KCBmdW5jLCBzbGljZXMsIHN0YWNrcyApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblBhcmFtZXRyaWNHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBhcmFtZXRyaWNHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQYXJhbWV0cmljR2VvbWV0cnk7XG5cbi8vIFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkoIGZ1bmMsIHNsaWNlcywgc3RhY2tzICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0ZnVuYzogZnVuYyxcblx0XHRzbGljZXM6IHNsaWNlcyxcblx0XHRzdGFja3M6IHN0YWNrc1xuXHR9O1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdHZhciBFUFMgPSAwLjAwMDAxO1xuXG5cdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBwMCA9IG5ldyBWZWN0b3IzKCksIHAxID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHB1ID0gbmV3IFZlY3RvcjMoKSwgcHYgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBpLCBqO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHR2YXIgc2xpY2VDb3VudCA9IHNsaWNlcyArIDE7XG5cblx0Zm9yICggaSA9IDA7IGkgPD0gc3RhY2tzOyBpICsrICkge1xuXG5cdFx0dmFyIHYgPSBpIC8gc3RhY2tzO1xuXG5cdFx0Zm9yICggaiA9IDA7IGogPD0gc2xpY2VzOyBqICsrICkge1xuXG5cdFx0XHR2YXIgdSA9IGogLyBzbGljZXM7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHRmdW5jKCB1LCB2LCBwMCApO1xuXHRcdFx0dmVydGljZXMucHVzaCggcDAueCwgcDAueSwgcDAueiApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0Ly8gYXBwcm94aW1hdGUgdGFuZ2VudCB2ZWN0b3JzIHZpYSBmaW5pdGUgZGlmZmVyZW5jZXNcblxuXHRcdFx0aWYgKCB1IC0gRVBTID49IDAgKSB7XG5cblx0XHRcdFx0ZnVuYyggdSAtIEVQUywgdiwgcDEgKTtcblx0XHRcdFx0cHUuc3ViVmVjdG9ycyggcDAsIHAxICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0ZnVuYyggdSArIEVQUywgdiwgcDEgKTtcblx0XHRcdFx0cHUuc3ViVmVjdG9ycyggcDEsIHAwICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB2IC0gRVBTID49IDAgKSB7XG5cblx0XHRcdFx0ZnVuYyggdSwgdiAtIEVQUywgcDEgKTtcblx0XHRcdFx0cHYuc3ViVmVjdG9ycyggcDAsIHAxICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0ZnVuYyggdSwgdiArIEVQUywgcDEgKTtcblx0XHRcdFx0cHYuc3ViVmVjdG9ycyggcDEsIHAwICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gY3Jvc3MgcHJvZHVjdCBvZiB0YW5nZW50IHZlY3RvcnMgcmV0dXJucyBzdXJmYWNlIG5vcm1hbFxuXG5cdFx0XHRub3JtYWwuY3Jvc3NWZWN0b3JzKCBwdSwgcHYgKS5ub3JtYWxpemUoKTtcblx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1dnMucHVzaCggdSwgdiApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBnZW5lcmF0ZSBpbmRpY2VzXG5cblx0Zm9yICggaSA9IDA7IGkgPCBzdGFja3M7IGkgKysgKSB7XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8IHNsaWNlczsgaiArKyApIHtcblxuXHRcdFx0dmFyIGEgPSBpICogc2xpY2VDb3VudCArIGo7XG5cdFx0XHR2YXIgYiA9IGkgKiBzbGljZUNvdW50ICsgaiArIDE7XG5cdFx0XHR2YXIgYyA9ICggaSArIDEgKSAqIHNsaWNlQ291bnQgKyBqICsgMTtcblx0XHRcdHZhciBkID0gKCBpICsgMSApICogc2xpY2VDb3VudCArIGo7XG5cblx0XHRcdC8vIGZhY2VzIG9uZSBhbmQgdHdvXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5QYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5QYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgY2xvY2t3b3JrZ2VlayAvIGh0dHBzOi8vZ2l0aHViLmNvbS9jbG9ja3dvcmtnZWVrXG4gKiBAYXV0aG9yIHRpbW90aHlwcmF0bGV5IC8gaHR0cHM6Ly9naXRodWIuY29tL3RpbW90aHlwcmF0bGV5XG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gUG9seWhlZHJvbkdlb21ldHJ5XG5cbmZ1bmN0aW9uIFBvbHloZWRyb25HZW9tZXRyeSggdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUG9seWhlZHJvbkdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0dmVydGljZXM6IHZlcnRpY2VzLFxuXHRcdGluZGljZXM6IGluZGljZXMsXG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSggdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuUG9seWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuUG9seWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvbHloZWRyb25HZW9tZXRyeTtcblxuLy8gUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSggdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0dmVydGljZXM6IHZlcnRpY2VzLFxuXHRcdGluZGljZXM6IGluZGljZXMsXG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTtcblx0ZGV0YWlsID0gZGV0YWlsIHx8IDA7XG5cblx0Ly8gZGVmYXVsdCBidWZmZXIgZGF0YVxuXG5cdHZhciB2ZXJ0ZXhCdWZmZXIgPSBbXTtcblx0dmFyIHV2QnVmZmVyID0gW107XG5cblx0Ly8gdGhlIHN1YmRpdmlzaW9uIGNyZWF0ZXMgdGhlIHZlcnRleCBidWZmZXIgZGF0YVxuXG5cdHN1YmRpdmlkZSggZGV0YWlsICk7XG5cblx0Ly8gYWxsIHZlcnRpY2VzIHNob3VsZCBsaWUgb24gYSBjb25jZXB0dWFsIHNwaGVyZSB3aXRoIGEgZ2l2ZW4gcmFkaXVzXG5cblx0YXBwcGx5UmFkaXVzKCByYWRpdXMgKTtcblxuXHQvLyBmaW5hbGx5LCBjcmVhdGUgdGhlIHV2IGRhdGFcblxuXHRnZW5lcmF0ZVVWcygpO1xuXG5cdC8vIGJ1aWxkIG5vbi1pbmRleGVkIGdlb21ldHJ5XG5cblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0ZXhCdWZmZXIsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0ZXhCdWZmZXIuc2xpY2UoKSwgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZCdWZmZXIsIDIgKSApO1xuXG5cdGlmICggZGV0YWlsID09PSAwICkge1xuXG5cdFx0dGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpOyAvLyBmbGF0IG5vcm1hbHNcblxuXHR9IGVsc2Uge1xuXG5cdFx0dGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7IC8vIHNtb290aCBub3JtYWxzXG5cblx0fVxuXG5cdC8vIGhlbHBlciBmdW5jdGlvbnNcblxuXHRmdW5jdGlvbiBzdWJkaXZpZGUoIGRldGFpbCApIHtcblxuXHRcdHZhciBhID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgYiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGMgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Ly8gaXRlcmF0ZSBvdmVyIGFsbCBmYWNlcyBhbmQgYXBwbHkgYSBzdWJkaXZpc29uIHdpdGggdGhlIGdpdmVuIGRldGFpbCB2YWx1ZVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkgKz0gMyApIHtcblxuXHRcdFx0Ly8gZ2V0IHRoZSB2ZXJ0aWNlcyBvZiB0aGUgZmFjZVxuXG5cdFx0XHRnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMCBdLCBhICk7XG5cdFx0XHRnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMSBdLCBiICk7XG5cdFx0XHRnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMiBdLCBjICk7XG5cblx0XHRcdC8vIHBlcmZvcm0gc3ViZGl2aXNpb25cblxuXHRcdFx0c3ViZGl2aWRlRmFjZSggYSwgYiwgYywgZGV0YWlsICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHN1YmRpdmlkZUZhY2UoIGEsIGIsIGMsIGRldGFpbCApIHtcblxuXHRcdHZhciBjb2xzID0gTWF0aC5wb3coIDIsIGRldGFpbCApO1xuXG5cdFx0Ly8gd2UgdXNlIHRoaXMgbXVsdGlkaW1lbnNpb25hbCBhcnJheSBhcyBhIGRhdGEgc3RydWN0dXJlIGZvciBjcmVhdGluZyB0aGUgc3ViZGl2aXNpb25cblxuXHRcdHZhciB2ID0gW107XG5cblx0XHR2YXIgaSwgajtcblxuXHRcdC8vIGNvbnN0cnVjdCBhbGwgb2YgdGhlIHZlcnRpY2VzIGZvciB0aGlzIHN1YmRpdmlzaW9uXG5cblx0XHRmb3IgKCBpID0gMDsgaSA8PSBjb2xzOyBpICsrICkge1xuXG5cdFx0XHR2WyBpIF0gPSBbXTtcblxuXHRcdFx0dmFyIGFqID0gYS5jbG9uZSgpLmxlcnAoIGMsIGkgLyBjb2xzICk7XG5cdFx0XHR2YXIgYmogPSBiLmNsb25lKCkubGVycCggYywgaSAvIGNvbHMgKTtcblxuXHRcdFx0dmFyIHJvd3MgPSBjb2xzIC0gaTtcblxuXHRcdFx0Zm9yICggaiA9IDA7IGogPD0gcm93czsgaiArKyApIHtcblxuXHRcdFx0XHRpZiAoIGogPT09IDAgJiYgaSA9PT0gY29scyApIHtcblxuXHRcdFx0XHRcdHZbIGkgXVsgaiBdID0gYWo7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHZbIGkgXVsgaiBdID0gYWouY2xvbmUoKS5sZXJwKCBiaiwgaiAvIHJvd3MgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGNvbnN0cnVjdCBhbGwgb2YgdGhlIGZhY2VzXG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IGNvbHM7IGkgKysgKSB7XG5cblx0XHRcdGZvciAoIGogPSAwOyBqIDwgMiAqICggY29scyAtIGkgKSAtIDE7IGogKysgKSB7XG5cblx0XHRcdFx0dmFyIGsgPSBNYXRoLmZsb29yKCBqIC8gMiApO1xuXG5cdFx0XHRcdGlmICggaiAlIDIgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpIF1bIGsgKyAxIF0gKTtcblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpICsgMSBdWyBrIF0gKTtcblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpIF1bIGsgXSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpIF1bIGsgKyAxIF0gKTtcblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpICsgMSBdWyBrICsgMSBdICk7XG5cdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSArIDEgXVsgayBdICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGFwcHBseVJhZGl1cyggcmFkaXVzICkge1xuXG5cdFx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHQvLyBpdGVyYXRlIG92ZXIgdGhlIGVudGlyZSBidWZmZXIgYW5kIGFwcGx5IHRoZSByYWRpdXMgdG8gZWFjaCB2ZXJ0ZXhcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHZlcnRleEJ1ZmZlci5sZW5ndGg7IGkgKz0gMyApIHtcblxuXHRcdFx0dmVydGV4LnggPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF07XG5cdFx0XHR2ZXJ0ZXgueSA9IHZlcnRleEJ1ZmZlclsgaSArIDEgXTtcblx0XHRcdHZlcnRleC56ID0gdmVydGV4QnVmZmVyWyBpICsgMiBdO1xuXG5cdFx0XHR2ZXJ0ZXgubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIHJhZGl1cyApO1xuXG5cdFx0XHR2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF0gPSB2ZXJ0ZXgueDtcblx0XHRcdHZlcnRleEJ1ZmZlclsgaSArIDEgXSA9IHZlcnRleC55O1xuXHRcdFx0dmVydGV4QnVmZmVyWyBpICsgMiBdID0gdmVydGV4Lno7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlVVZzKCkge1xuXG5cdFx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdHZlcnRleC54ID0gdmVydGV4QnVmZmVyWyBpICsgMCBdO1xuXHRcdFx0dmVydGV4LnkgPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAxIF07XG5cdFx0XHR2ZXJ0ZXgueiA9IHZlcnRleEJ1ZmZlclsgaSArIDIgXTtcblxuXHRcdFx0dmFyIHUgPSBhemltdXRoKCB2ZXJ0ZXggKSAvIDIgLyBNYXRoLlBJICsgMC41O1xuXHRcdFx0dmFyIHYgPSBpbmNsaW5hdGlvbiggdmVydGV4ICkgLyBNYXRoLlBJICsgMC41O1xuXHRcdFx0dXZCdWZmZXIucHVzaCggdSwgMSAtIHYgKTtcblxuXHRcdH1cblxuXHRcdGNvcnJlY3RVVnMoKTtcblxuXHRcdGNvcnJlY3RTZWFtKCk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGNvcnJlY3RTZWFtKCkge1xuXG5cdFx0Ly8gaGFuZGxlIGNhc2Ugd2hlbiBmYWNlIHN0cmFkZGxlcyB0aGUgc2VhbSwgc2VlICMzMjY5XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB1dkJ1ZmZlci5sZW5ndGg7IGkgKz0gNiApIHtcblxuXHRcdFx0Ly8gdXYgZGF0YSBvZiBhIHNpbmdsZSBmYWNlXG5cblx0XHRcdHZhciB4MCA9IHV2QnVmZmVyWyBpICsgMCBdO1xuXHRcdFx0dmFyIHgxID0gdXZCdWZmZXJbIGkgKyAyIF07XG5cdFx0XHR2YXIgeDIgPSB1dkJ1ZmZlclsgaSArIDQgXTtcblxuXHRcdFx0dmFyIG1heCA9IE1hdGgubWF4KCB4MCwgeDEsIHgyICk7XG5cdFx0XHR2YXIgbWluID0gTWF0aC5taW4oIHgwLCB4MSwgeDIgKTtcblxuXHRcdFx0Ly8gMC45IGlzIHNvbWV3aGF0IGFyYml0cmFyeVxuXG5cdFx0XHRpZiAoIG1heCA+IDAuOSAmJiBtaW4gPCAwLjEgKSB7XG5cblx0XHRcdFx0aWYgKCB4MCA8IDAuMiApIHV2QnVmZmVyWyBpICsgMCBdICs9IDE7XG5cdFx0XHRcdGlmICggeDEgPCAwLjIgKSB1dkJ1ZmZlclsgaSArIDIgXSArPSAxO1xuXHRcdFx0XHRpZiAoIHgyIDwgMC4yICkgdXZCdWZmZXJbIGkgKyA0IF0gKz0gMTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBwdXNoVmVydGV4KCB2ZXJ0ZXggKSB7XG5cblx0XHR2ZXJ0ZXhCdWZmZXIucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRWZXJ0ZXhCeUluZGV4KCBpbmRleCwgdmVydGV4ICkge1xuXG5cdFx0dmFyIHN0cmlkZSA9IGluZGV4ICogMztcblxuXHRcdHZlcnRleC54ID0gdmVydGljZXNbIHN0cmlkZSArIDAgXTtcblx0XHR2ZXJ0ZXgueSA9IHZlcnRpY2VzWyBzdHJpZGUgKyAxIF07XG5cdFx0dmVydGV4LnogPSB2ZXJ0aWNlc1sgc3RyaWRlICsgMiBdO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBjb3JyZWN0VVZzKCkge1xuXG5cdFx0dmFyIGEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBiID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgYyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgY2VudHJvaWQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIHV2QSA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0dmFyIHV2QiA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0dmFyIHV2QyA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGogPSAwOyBpIDwgdmVydGV4QnVmZmVyLmxlbmd0aDsgaSArPSA5LCBqICs9IDYgKSB7XG5cblx0XHRcdGEuc2V0KCB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF0sIHZlcnRleEJ1ZmZlclsgaSArIDEgXSwgdmVydGV4QnVmZmVyWyBpICsgMiBdICk7XG5cdFx0XHRiLnNldCggdmVydGV4QnVmZmVyWyBpICsgMyBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA0IF0sIHZlcnRleEJ1ZmZlclsgaSArIDUgXSApO1xuXHRcdFx0Yy5zZXQoIHZlcnRleEJ1ZmZlclsgaSArIDYgXSwgdmVydGV4QnVmZmVyWyBpICsgNyBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA4IF0gKTtcblxuXHRcdFx0dXZBLnNldCggdXZCdWZmZXJbIGogKyAwIF0sIHV2QnVmZmVyWyBqICsgMSBdICk7XG5cdFx0XHR1dkIuc2V0KCB1dkJ1ZmZlclsgaiArIDIgXSwgdXZCdWZmZXJbIGogKyAzIF0gKTtcblx0XHRcdHV2Qy5zZXQoIHV2QnVmZmVyWyBqICsgNCBdLCB1dkJ1ZmZlclsgaiArIDUgXSApO1xuXG5cdFx0XHRjZW50cm9pZC5jb3B5KCBhICkuYWRkKCBiICkuYWRkKCBjICkuZGl2aWRlU2NhbGFyKCAzICk7XG5cblx0XHRcdHZhciBhemkgPSBhemltdXRoKCBjZW50cm9pZCApO1xuXG5cdFx0XHRjb3JyZWN0VVYoIHV2QSwgaiArIDAsIGEsIGF6aSApO1xuXHRcdFx0Y29ycmVjdFVWKCB1dkIsIGogKyAyLCBiLCBhemkgKTtcblx0XHRcdGNvcnJlY3RVViggdXZDLCBqICsgNCwgYywgYXppICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGNvcnJlY3RVViggdXYsIHN0cmlkZSwgdmVjdG9yLCBhemltdXRoICkge1xuXG5cdFx0aWYgKCAoIGF6aW11dGggPCAwICkgJiYgKCB1di54ID09PSAxICkgKSB7XG5cblx0XHRcdHV2QnVmZmVyWyBzdHJpZGUgXSA9IHV2LnggLSAxO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCAoIHZlY3Rvci54ID09PSAwICkgJiYgKCB2ZWN0b3IueiA9PT0gMCApICkge1xuXG5cdFx0XHR1dkJ1ZmZlclsgc3RyaWRlIF0gPSBhemltdXRoIC8gMiAvIE1hdGguUEkgKyAwLjU7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIEFuZ2xlIGFyb3VuZCB0aGUgWSBheGlzLCBjb3VudGVyLWNsb2Nrd2lzZSB3aGVuIGxvb2tpbmcgZnJvbSBhYm92ZS5cblxuXHRmdW5jdGlvbiBhemltdXRoKCB2ZWN0b3IgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hdGFuMiggdmVjdG9yLnosIC0gdmVjdG9yLnggKTtcblxuXHR9XG5cblxuXHQvLyBBbmdsZSBhYm92ZSB0aGUgWFogcGxhbmUuXG5cblx0ZnVuY3Rpb24gaW5jbGluYXRpb24oIHZlY3RvciApIHtcblxuXHRcdHJldHVybiBNYXRoLmF0YW4yKCAtIHZlY3Rvci55LCBNYXRoLnNxcnQoICggdmVjdG9yLnggKiB2ZWN0b3IueCApICsgKCB2ZWN0b3IueiAqIHZlY3Rvci56ICkgKSApO1xuXG5cdH1cblxufVxuXG5Qb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5Qb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgdGltb3RoeXByYXRsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vdGltb3RoeXByYXRsZXlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gVGV0cmFoZWRyb25HZW9tZXRyeVxuXG5mdW5jdGlvbiBUZXRyYWhlZHJvbkdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1RldHJhaGVkcm9uR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5UZXRyYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuVGV0cmFoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXRyYWhlZHJvbkdlb21ldHJ5O1xuXG4vLyBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtcblx0XHQxLCAxLCAxLCBcdC0gMSwgLSAxLCAxLCBcdC0gMSwgMSwgLSAxLCBcdDEsIC0gMSwgLSAxXG5cdF07XG5cblx0dmFyIGluZGljZXMgPSBbXG5cdFx0MiwgMSwgMCwgXHQwLCAzLCAyLFx0MSwgMywgMCxcdDIsIDMsIDFcblx0XTtcblxuXHRQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7XG5cblx0dGhpcy50eXBlID0gJ1RldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG59XG5cblRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgdGltb3RoeXByYXRsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vdGltb3RoeXByYXRsZXlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gT2N0YWhlZHJvbkdlb21ldHJ5XG5cbmZ1bmN0aW9uIE9jdGFoZWRyb25HZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdPY3RhaGVkcm9uR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbk9jdGFoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbk9jdGFoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBPY3RhaGVkcm9uR2VvbWV0cnk7XG5cbi8vIE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtcblx0XHQxLCAwLCAwLCBcdC0gMSwgMCwgMCxcdDAsIDEsIDAsXG5cdFx0MCwgLSAxLCAwLCBcdDAsIDAsIDEsXHQwLCAwLCAtIDFcblx0XTtcblxuXHR2YXIgaW5kaWNlcyA9IFtcblx0XHQwLCAyLCA0LFx0MCwgNCwgMyxcdDAsIDMsIDUsXG5cdFx0MCwgNSwgMixcdDEsIDIsIDUsXHQxLCA1LCAzLFxuXHRcdDEsIDMsIDQsXHQxLCA0LCAyXG5cdF07XG5cblx0UG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApO1xuXG5cdHRoaXMudHlwZSA9ICdPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG59XG5cbk9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5PY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgdGltb3RoeXByYXRsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vdGltb3RoeXByYXRsZXlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gSWNvc2FoZWRyb25HZW9tZXRyeVxuXG5mdW5jdGlvbiBJY29zYWhlZHJvbkdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0ljb3NhaGVkcm9uR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5JY29zYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuSWNvc2FoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJY29zYWhlZHJvbkdlb21ldHJ5O1xuXG4vLyBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdHZhciB0ID0gKCAxICsgTWF0aC5zcXJ0KCA1ICkgKSAvIDI7XG5cblx0dmFyIHZlcnRpY2VzID0gW1xuXHRcdC0gMSwgdCwgMCwgXHQxLCB0LCAwLCBcdC0gMSwgLSB0LCAwLCBcdDEsIC0gdCwgMCxcblx0XHQgMCwgLSAxLCB0LCBcdDAsIDEsIHQsXHQwLCAtIDEsIC0gdCwgXHQwLCAxLCAtIHQsXG5cdFx0IHQsIDAsIC0gMSwgXHR0LCAwLCAxLCBcdC0gdCwgMCwgLSAxLCBcdC0gdCwgMCwgMVxuXHRdO1xuXG5cdHZhciBpbmRpY2VzID0gW1xuXHRcdCAwLCAxMSwgNSwgXHQwLCA1LCAxLCBcdDAsIDEsIDcsIFx0MCwgNywgMTAsIFx0MCwgMTAsIDExLFxuXHRcdCAxLCA1LCA5LCBcdDUsIDExLCA0LFx0MTEsIDEwLCAyLFx0MTAsIDcsIDYsXHQ3LCAxLCA4LFxuXHRcdCAzLCA5LCA0LCBcdDMsIDQsIDIsXHQzLCAyLCA2LFx0MywgNiwgOCxcdDMsIDgsIDksXG5cdFx0IDQsIDksIDUsIFx0MiwgNCwgMTEsXHQ2LCAyLCAxMCxcdDgsIDYsIDcsXHQ5LCA4LCAxXG5cdF07XG5cblx0UG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApO1xuXG5cdHRoaXMudHlwZSA9ICdJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxufVxuXG5JY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIEFiZSBQYXpvcyAvIGh0dHBzOi8vaGFtb2lkLmNvbVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBEb2RlY2FoZWRyb25HZW9tZXRyeVxuXG5mdW5jdGlvbiBEb2RlY2FoZWRyb25HZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdEb2RlY2FoZWRyb25HZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5Eb2RlY2FoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkRvZGVjYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERvZGVjYWhlZHJvbkdlb21ldHJ5O1xuXG4vLyBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0dmFyIHQgPSAoIDEgKyBNYXRoLnNxcnQoIDUgKSApIC8gMjtcblx0dmFyIHIgPSAxIC8gdDtcblxuXHR2YXIgdmVydGljZXMgPSBbXG5cblx0XHQvLyAowrExLCDCsTEsIMKxMSlcblx0XHQtIDEsIC0gMSwgLSAxLFx0LSAxLCAtIDEsIDEsXG5cdFx0LSAxLCAxLCAtIDEsIC0gMSwgMSwgMSxcblx0XHQxLCAtIDEsIC0gMSwgMSwgLSAxLCAxLFxuXHRcdDEsIDEsIC0gMSwgMSwgMSwgMSxcblxuXHRcdC8vICgwLCDCsTEvz4YsIMKxz4YpXG5cdFx0IDAsIC0gciwgLSB0LCAwLCAtIHIsIHQsXG5cdFx0IDAsIHIsIC0gdCwgMCwgciwgdCxcblxuXHRcdC8vICjCsTEvz4YsIMKxz4YsIDApXG5cdFx0LSByLCAtIHQsIDAsIC0gciwgdCwgMCxcblx0XHQgciwgLSB0LCAwLCByLCB0LCAwLFxuXG5cdFx0Ly8gKMKxz4YsIDAsIMKxMS/Philcblx0XHQtIHQsIDAsIC0gciwgdCwgMCwgLSByLFxuXHRcdC0gdCwgMCwgciwgdCwgMCwgclxuXHRdO1xuXG5cdHZhciBpbmRpY2VzID0gW1xuXHRcdDMsIDExLCA3LCBcdDMsIDcsIDE1LCBcdDMsIDE1LCAxMyxcblx0XHQ3LCAxOSwgMTcsIFx0NywgMTcsIDYsIFx0NywgNiwgMTUsXG5cdFx0MTcsIDQsIDgsIFx0MTcsIDgsIDEwLCBcdDE3LCAxMCwgNixcblx0XHQ4LCAwLCAxNiwgXHQ4LCAxNiwgMiwgXHQ4LCAyLCAxMCxcblx0XHQwLCAxMiwgMSwgXHQwLCAxLCAxOCwgXHQwLCAxOCwgMTYsXG5cdFx0NiwgMTAsIDIsIFx0NiwgMiwgMTMsIFx0NiwgMTMsIDE1LFxuXHRcdDIsIDE2LCAxOCwgXHQyLCAxOCwgMywgXHQyLCAzLCAxMyxcblx0XHQxOCwgMSwgOSwgXHQxOCwgOSwgMTEsIFx0MTgsIDExLCAzLFxuXHRcdDQsIDE0LCAxMiwgXHQ0LCAxMiwgMCwgXHQ0LCAwLCA4LFxuXHRcdDExLCA5LCA1LCBcdDExLCA1LCAxOSwgXHQxMSwgMTksIDcsXG5cdFx0MTksIDUsIDE0LCBcdDE5LCAxNCwgNCwgXHQxOSwgNCwgMTcsXG5cdFx0MSwgMTIsIDE0LCBcdDEsIDE0LCA1LCBcdDEsIDUsIDlcblx0XTtcblxuXHRQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7XG5cblx0dGhpcy50eXBlID0gJ0RvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxufVxuXG5Eb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5Eb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIG9vc21veGllY29kZSAvIGh0dHBzOi8vZ2l0aHViLmNvbS9vb3Ntb3hpZWNvZGVcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3Igeno4NSAvIGh0dHBzOi8vZ2l0aHViLmNvbS96ejg1XG4gKiBAYXV0aG9yIG1pbmluZ29sZCAvIGh0dHBzOi8vZ2l0aHViLmNvbS9taW5pbmdvbGRcbiAqIEBhdXRob3Igam9ub2JyMSAvIGh0dHBzOi8vZ2l0aHViLmNvbS9qb25vYnIxXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICpcbiAqL1xuXG4vLyBUdWJlR2VvbWV0cnlcblxuZnVuY3Rpb24gVHViZUdlb21ldHJ5KCBwYXRoLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGl1cywgcmFkaWFsU2VnbWVudHMsIGNsb3NlZCwgdGFwZXIgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUdWJlR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRwYXRoOiBwYXRoLFxuXHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRjbG9zZWQ6IGNsb3NlZFxuXHR9O1xuXG5cdGlmICggdGFwZXIgIT09IHVuZGVmaW5lZCApIGNvbnNvbGUud2FybiggJ1RIUkVFLlR1YmVHZW9tZXRyeTogdGFwZXIgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0dmFyIGJ1ZmZlckdlb21ldHJ5ID0gbmV3IFR1YmVCdWZmZXJHZW9tZXRyeSggcGF0aCwgdHVidWxhclNlZ21lbnRzLCByYWRpdXMsIHJhZGlhbFNlZ21lbnRzLCBjbG9zZWQgKTtcblxuXHQvLyBleHBvc2UgaW50ZXJuYWxzXG5cblx0dGhpcy50YW5nZW50cyA9IGJ1ZmZlckdlb21ldHJ5LnRhbmdlbnRzO1xuXHR0aGlzLm5vcm1hbHMgPSBidWZmZXJHZW9tZXRyeS5ub3JtYWxzO1xuXHR0aGlzLmJpbm9ybWFscyA9IGJ1ZmZlckdlb21ldHJ5LmJpbm9ybWFscztcblxuXHQvLyBjcmVhdGUgZ2VvbWV0cnlcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggYnVmZmVyR2VvbWV0cnkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuVHViZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuVHViZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFR1YmVHZW9tZXRyeTtcblxuLy8gVHViZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFR1YmVCdWZmZXJHZW9tZXRyeSggcGF0aCwgdHVidWxhclNlZ21lbnRzLCByYWRpdXMsIHJhZGlhbFNlZ21lbnRzLCBjbG9zZWQgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUdWJlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRwYXRoOiBwYXRoLFxuXHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRjbG9zZWQ6IGNsb3NlZFxuXHR9O1xuXG5cdHR1YnVsYXJTZWdtZW50cyA9IHR1YnVsYXJTZWdtZW50cyB8fCA2NDtcblx0cmFkaXVzID0gcmFkaXVzIHx8IDE7XG5cdHJhZGlhbFNlZ21lbnRzID0gcmFkaWFsU2VnbWVudHMgfHwgODtcblx0Y2xvc2VkID0gY2xvc2VkIHx8IGZhbHNlO1xuXG5cdHZhciBmcmFtZXMgPSBwYXRoLmNvbXB1dGVGcmVuZXRGcmFtZXMoIHR1YnVsYXJTZWdtZW50cywgY2xvc2VkICk7XG5cblx0Ly8gZXhwb3NlIGludGVybmFsc1xuXG5cdHRoaXMudGFuZ2VudHMgPSBmcmFtZXMudGFuZ2VudHM7XG5cdHRoaXMubm9ybWFscyA9IGZyYW1lcy5ub3JtYWxzO1xuXHR0aGlzLmJpbm9ybWFscyA9IGZyYW1lcy5iaW5vcm1hbHM7XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHV2ID0gbmV3IFZlY3RvcjIoKTtcblx0dmFyIFAgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBpLCBqO1xuXG5cdC8vIGJ1ZmZlclxuXG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cdHZhciBpbmRpY2VzID0gW107XG5cblx0Ly8gY3JlYXRlIGJ1ZmZlciBkYXRhXG5cblx0Z2VuZXJhdGVCdWZmZXJEYXRhKCk7XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cdC8vIGZ1bmN0aW9uc1xuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlQnVmZmVyRGF0YSgpIHtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgdHVidWxhclNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRnZW5lcmF0ZVNlZ21lbnQoIGkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGlmIHRoZSBnZW9tZXRyeSBpcyBub3QgY2xvc2VkLCBnZW5lcmF0ZSB0aGUgbGFzdCByb3cgb2YgdmVydGljZXMgYW5kIG5vcm1hbHNcblx0XHQvLyBhdCB0aGUgcmVndWxhciBwb3NpdGlvbiBvbiB0aGUgZ2l2ZW4gcGF0aFxuXHRcdC8vXG5cdFx0Ly8gaWYgdGhlIGdlb21ldHJ5IGlzIGNsb3NlZCwgZHVwbGljYXRlIHRoZSBmaXJzdCByb3cgb2YgdmVydGljZXMgYW5kIG5vcm1hbHMgKHV2cyB3aWxsIGRpZmZlcilcblxuXHRcdGdlbmVyYXRlU2VnbWVudCggKCBjbG9zZWQgPT09IGZhbHNlICkgPyB0dWJ1bGFyU2VnbWVudHMgOiAwICk7XG5cblx0XHQvLyB1dnMgYXJlIGdlbmVyYXRlZCBpbiBhIHNlcGFyYXRlIGZ1bmN0aW9uLlxuXHRcdC8vIHRoaXMgbWFrZXMgaXQgZWFzeSBjb21wdXRlIGNvcnJlY3QgdmFsdWVzIGZvciBjbG9zZWQgZ2VvbWV0cmllc1xuXG5cdFx0Z2VuZXJhdGVVVnMoKTtcblxuXHRcdC8vIGZpbmFsbHkgY3JlYXRlIGZhY2VzXG5cblx0XHRnZW5lcmF0ZUluZGljZXMoKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVTZWdtZW50KCBpICkge1xuXG5cdFx0Ly8gd2UgdXNlIGdldFBvaW50QXQgdG8gc2FtcGxlIGV2ZW5seSBkaXN0cmlidXRlZCBwb2ludHMgZnJvbSB0aGUgZ2l2ZW4gcGF0aFxuXG5cdFx0UCA9IHBhdGguZ2V0UG9pbnRBdCggaSAvIHR1YnVsYXJTZWdtZW50cywgUCApO1xuXG5cdFx0Ly8gcmV0cmlldmUgY29ycmVzcG9uZGluZyBub3JtYWwgYW5kIGJpbm9ybWFsXG5cblx0XHR2YXIgTiA9IGZyYW1lcy5ub3JtYWxzWyBpIF07XG5cdFx0dmFyIEIgPSBmcmFtZXMuYmlub3JtYWxzWyBpIF07XG5cblx0XHQvLyBnZW5lcmF0ZSBub3JtYWxzIGFuZCB2ZXJ0aWNlcyBmb3IgdGhlIGN1cnJlbnQgc2VnbWVudFxuXG5cdFx0Zm9yICggaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRcdHZhciB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAqIDI7XG5cblx0XHRcdHZhciBzaW4gPSBNYXRoLnNpbiggdiApO1xuXHRcdFx0dmFyIGNvcyA9IC0gTWF0aC5jb3MoIHYgKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdG5vcm1hbC54ID0gKCBjb3MgKiBOLnggKyBzaW4gKiBCLnggKTtcblx0XHRcdG5vcm1hbC55ID0gKCBjb3MgKiBOLnkgKyBzaW4gKiBCLnkgKTtcblx0XHRcdG5vcm1hbC56ID0gKCBjb3MgKiBOLnogKyBzaW4gKiBCLnogKTtcblx0XHRcdG5vcm1hbC5ub3JtYWxpemUoKTtcblxuXHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHR2ZXJ0ZXgueCA9IFAueCArIHJhZGl1cyAqIG5vcm1hbC54O1xuXHRcdFx0dmVydGV4LnkgPSBQLnkgKyByYWRpdXMgKiBub3JtYWwueTtcblx0XHRcdHZlcnRleC56ID0gUC56ICsgcmFkaXVzICogbm9ybWFsLno7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVJbmRpY2VzKCkge1xuXG5cdFx0Zm9yICggaiA9IDE7IGogPD0gdHVidWxhclNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0XHRmb3IgKCBpID0gMTsgaSA8PSByYWRpYWxTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgYSA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyAoIGkgLSAxICk7XG5cdFx0XHRcdHZhciBiID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyAoIGkgLSAxICk7XG5cdFx0XHRcdHZhciBjID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyBpO1xuXHRcdFx0XHR2YXIgZCA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyBpO1xuXG5cdFx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlVVZzKCkge1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPD0gdHVidWxhclNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRmb3IgKCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHtcblxuXHRcdFx0XHR1di54ID0gaSAvIHR1YnVsYXJTZWdtZW50cztcblx0XHRcdFx0dXYueSA9IGogLyByYWRpYWxTZWdtZW50cztcblxuXHRcdFx0XHR1dnMucHVzaCggdXYueCwgdXYueSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG59XG5cblR1YmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblR1YmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUdWJlQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBvb3Ntb3hpZWNvZGVcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKlxuICogYmFzZWQgb24gaHR0cDovL3d3dy5ibGFja3Bhd24uY29tL3RleHRzL3BxdG9ydXMvXG4gKi9cblxuLy8gVG9ydXNLbm90R2VvbWV0cnlcblxuZnVuY3Rpb24gVG9ydXNLbm90R2VvbWV0cnkoIHJhZGl1cywgdHViZSwgdHVidWxhclNlZ21lbnRzLCByYWRpYWxTZWdtZW50cywgcCwgcSwgaGVpZ2h0U2NhbGUgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUb3J1c0tub3RHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHR1YmU6IHR1YmUsXG5cdFx0dHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdHA6IHAsXG5cdFx0cTogcVxuXHR9O1xuXG5cdGlmICggaGVpZ2h0U2NhbGUgIT09IHVuZGVmaW5lZCApIGNvbnNvbGUud2FybiggJ1RIUkVFLlRvcnVzS25vdEdlb21ldHJ5OiBoZWlnaHRTY2FsZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnNjYWxlKCB4LCB5LCB6ICkgaW5zdGVhZC4nICk7XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGlhbFNlZ21lbnRzLCBwLCBxICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuVG9ydXNLbm90R2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5Ub3J1c0tub3RHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb3J1c0tub3RHZW9tZXRyeTtcblxuLy8gVG9ydXNLbm90QnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgdHViZSwgdHVidWxhclNlZ21lbnRzLCByYWRpYWxTZWdtZW50cywgcCwgcSApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1RvcnVzS25vdEJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0dHViZTogdHViZSxcblx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0cDogcCxcblx0XHRxOiBxXG5cdH07XG5cblx0cmFkaXVzID0gcmFkaXVzIHx8IDE7XG5cdHR1YmUgPSB0dWJlIHx8IDAuNDtcblx0dHVidWxhclNlZ21lbnRzID0gTWF0aC5mbG9vciggdHVidWxhclNlZ21lbnRzICkgfHwgNjQ7XG5cdHJhZGlhbFNlZ21lbnRzID0gTWF0aC5mbG9vciggcmFkaWFsU2VnbWVudHMgKSB8fCA4O1xuXHRwID0gcCB8fCAyO1xuXHRxID0gcSB8fCAzO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgaSwgajtcblxuXHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIFAxID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIFAyID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgQiA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBUID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIE4gPSBuZXcgVmVjdG9yMygpO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRmb3IgKCBpID0gMDsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7ICsrIGkgKSB7XG5cblx0XHQvLyB0aGUgcmFkaWFuIFwidVwiIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvbiB0aGUgdG9ydXMgY3VydmUgb2YgdGhlIGN1cnJlbnQgdHVidWxhciBzZWdlbWVudFxuXG5cdFx0dmFyIHUgPSBpIC8gdHVidWxhclNlZ21lbnRzICogcCAqIE1hdGguUEkgKiAyO1xuXG5cdFx0Ly8gbm93IHdlIGNhbGN1bGF0ZSB0d28gcG9pbnRzLiBQMSBpcyBvdXIgY3VycmVudCBwb3NpdGlvbiBvbiB0aGUgY3VydmUsIFAyIGlzIGEgbGl0dGxlIGZhcnRoZXIgYWhlYWQuXG5cdFx0Ly8gdGhlc2UgcG9pbnRzIGFyZSB1c2VkIHRvIGNyZWF0ZSBhIHNwZWNpYWwgXCJjb29yZGluYXRlIHNwYWNlXCIsIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byBjYWxjdWxhdGUgdGhlIGNvcnJlY3QgdmVydGV4IHBvc2l0aW9uc1xuXG5cdFx0Y2FsY3VsYXRlUG9zaXRpb25PbkN1cnZlKCB1LCBwLCBxLCByYWRpdXMsIFAxICk7XG5cdFx0Y2FsY3VsYXRlUG9zaXRpb25PbkN1cnZlKCB1ICsgMC4wMSwgcCwgcSwgcmFkaXVzLCBQMiApO1xuXG5cdFx0Ly8gY2FsY3VsYXRlIG9ydGhvbm9ybWFsIGJhc2lzXG5cblx0XHRULnN1YlZlY3RvcnMoIFAyLCBQMSApO1xuXHRcdE4uYWRkVmVjdG9ycyggUDIsIFAxICk7XG5cdFx0Qi5jcm9zc1ZlY3RvcnMoIFQsIE4gKTtcblx0XHROLmNyb3NzVmVjdG9ycyggQiwgVCApO1xuXG5cdFx0Ly8gbm9ybWFsaXplIEIsIE4uIFQgY2FuIGJlIGlnbm9yZWQsIHdlIGRvbid0IHVzZSBpdFxuXG5cdFx0Qi5ub3JtYWxpemUoKTtcblx0XHROLm5vcm1hbGl6ZSgpO1xuXG5cdFx0Zm9yICggaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7ICsrIGogKSB7XG5cblx0XHRcdC8vIG5vdyBjYWxjdWxhdGUgdGhlIHZlcnRpY2VzLiB0aGV5IGFyZSBub3RoaW5nIG1vcmUgdGhhbiBhbiBleHRydXNpb24gb2YgdGhlIHRvcnVzIGN1cnZlLlxuXHRcdFx0Ly8gYmVjYXVzZSB3ZSBleHRydWRlIGEgc2hhcGUgaW4gdGhlIHh5LXBsYW5lLCB0aGVyZSBpcyBubyBuZWVkIHRvIGNhbGN1bGF0ZSBhIHotdmFsdWUuXG5cblx0XHRcdHZhciB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAqIDI7XG5cdFx0XHR2YXIgY3ggPSAtIHR1YmUgKiBNYXRoLmNvcyggdiApO1xuXHRcdFx0dmFyIGN5ID0gdHViZSAqIE1hdGguc2luKCB2ICk7XG5cblx0XHRcdC8vIG5vdyBjYWxjdWxhdGUgdGhlIGZpbmFsIHZlcnRleCBwb3NpdGlvbi5cblx0XHRcdC8vIGZpcnN0IHdlIG9yaWVudCB0aGUgZXh0cnVzaW9uIHdpdGggb3VyIGJhc2lzIHZlY3RvcywgdGhlbiB3ZSBhZGQgaXQgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gb24gdGhlIGN1cnZlXG5cblx0XHRcdHZlcnRleC54ID0gUDEueCArICggY3ggKiBOLnggKyBjeSAqIEIueCApO1xuXHRcdFx0dmVydGV4LnkgPSBQMS55ICsgKCBjeCAqIE4ueSArIGN5ICogQi55ICk7XG5cdFx0XHR2ZXJ0ZXgueiA9IFAxLnogKyAoIGN4ICogTi56ICsgY3kgKiBCLnogKTtcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyBub3JtYWwgKFAxIGlzIGFsd2F5cyB0aGUgY2VudGVyL29yaWdpbiBvZiB0aGUgZXh0cnVzaW9uLCB0aHVzIHdlIGNhbiB1c2UgaXQgdG8gY2FsY3VsYXRlIHRoZSBub3JtYWwpXG5cblx0XHRcdG5vcm1hbC5zdWJWZWN0b3JzKCB2ZXJ0ZXgsIFAxICkubm9ybWFsaXplKCk7XG5cblx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1dnMucHVzaCggaSAvIHR1YnVsYXJTZWdtZW50cyApO1xuXHRcdFx0dXZzLnB1c2goIGogLyByYWRpYWxTZWdtZW50cyApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBnZW5lcmF0ZSBpbmRpY2VzXG5cblx0Zm9yICggaiA9IDE7IGogPD0gdHVidWxhclNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0Zm9yICggaSA9IDE7IGkgPD0gcmFkaWFsU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdC8vIGluZGljZXNcblxuXHRcdFx0dmFyIGEgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgKCBpIC0gMSApO1xuXHRcdFx0dmFyIGIgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArICggaSAtIDEgKTtcblx0XHRcdHZhciBjID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyBpO1xuXHRcdFx0dmFyIGQgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaTtcblxuXHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cdC8vIHRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgY3VycmVudCBwb3NpdGlvbiBvbiB0aGUgdG9ydXMgY3VydmVcblxuXHRmdW5jdGlvbiBjYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUoIHUsIHAsIHEsIHJhZGl1cywgcG9zaXRpb24gKSB7XG5cblx0XHR2YXIgY3UgPSBNYXRoLmNvcyggdSApO1xuXHRcdHZhciBzdSA9IE1hdGguc2luKCB1ICk7XG5cdFx0dmFyIHF1T3ZlclAgPSBxIC8gcCAqIHU7XG5cdFx0dmFyIGNzID0gTWF0aC5jb3MoIHF1T3ZlclAgKTtcblxuXHRcdHBvc2l0aW9uLnggPSByYWRpdXMgKiAoIDIgKyBjcyApICogMC41ICogY3U7XG5cdFx0cG9zaXRpb24ueSA9IHJhZGl1cyAqICggMiArIGNzICkgKiBzdSAqIDAuNTtcblx0XHRwb3NpdGlvbi56ID0gcmFkaXVzICogTWF0aC5zaW4oIHF1T3ZlclAgKSAqIDAuNTtcblxuXHR9XG5cbn1cblxuVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5Ub3J1c0tub3RCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIG9vc21veGllY29kZVxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gVG9ydXNHZW9tZXRyeVxuXG5mdW5jdGlvbiBUb3J1c0dlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHJhZGlhbFNlZ21lbnRzLCB0dWJ1bGFyU2VnbWVudHMsIGFyYyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1RvcnVzR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHR0dWJlOiB0dWJlLFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcblx0XHRhcmM6IGFyY1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgVG9ydXNCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCByYWRpYWxTZWdtZW50cywgdHVidWxhclNlZ21lbnRzLCBhcmMgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5Ub3J1c0dlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuVG9ydXNHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb3J1c0dlb21ldHJ5O1xuXG4vLyBUb3J1c0J1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFRvcnVzQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgdHViZSwgcmFkaWFsU2VnbWVudHMsIHR1YnVsYXJTZWdtZW50cywgYXJjICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVG9ydXNCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHR1YmU6IHR1YmUsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdGFyYzogYXJjXG5cdH07XG5cblx0cmFkaXVzID0gcmFkaXVzIHx8IDE7XG5cdHR1YmUgPSB0dWJlIHx8IDAuNDtcblx0cmFkaWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKCByYWRpYWxTZWdtZW50cyApIHx8IDg7XG5cdHR1YnVsYXJTZWdtZW50cyA9IE1hdGguZmxvb3IoIHR1YnVsYXJTZWdtZW50cyApIHx8IDY7XG5cdGFyYyA9IGFyYyB8fCBNYXRoLlBJICogMjtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIGNlbnRlciA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgaiwgaTtcblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0Zm9yICggaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdHZhciB1ID0gaSAvIHR1YnVsYXJTZWdtZW50cyAqIGFyYztcblx0XHRcdHZhciB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAqIDI7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHR2ZXJ0ZXgueCA9ICggcmFkaXVzICsgdHViZSAqIE1hdGguY29zKCB2ICkgKSAqIE1hdGguY29zKCB1ICk7XG5cdFx0XHR2ZXJ0ZXgueSA9ICggcmFkaXVzICsgdHViZSAqIE1hdGguY29zKCB2ICkgKSAqIE1hdGguc2luKCB1ICk7XG5cdFx0XHR2ZXJ0ZXgueiA9IHR1YmUgKiBNYXRoLnNpbiggdiApO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRjZW50ZXIueCA9IHJhZGl1cyAqIE1hdGguY29zKCB1ICk7XG5cdFx0XHRjZW50ZXIueSA9IHJhZGl1cyAqIE1hdGguc2luKCB1ICk7XG5cdFx0XHRub3JtYWwuc3ViVmVjdG9ycyggdmVydGV4LCBjZW50ZXIgKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2cy5wdXNoKCBpIC8gdHVidWxhclNlZ21lbnRzICk7XG5cdFx0XHR1dnMucHVzaCggaiAvIHJhZGlhbFNlZ21lbnRzICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGdlbmVyYXRlIGluZGljZXNcblxuXHRmb3IgKCBqID0gMTsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHtcblxuXHRcdGZvciAoIGkgPSAxOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0Ly8gaW5kaWNlc1xuXG5cdFx0XHR2YXIgYSA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogaiArIGkgLSAxO1xuXHRcdFx0dmFyIGIgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGkgLSAxO1xuXHRcdFx0dmFyIGMgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGk7XG5cdFx0XHR2YXIgZCA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogaiArIGk7XG5cblx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5Ub3J1c0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuVG9ydXNCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb3J1c0J1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKiBQb3J0IGZyb20gaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9lYXJjdXQgKHYyLjEuMilcbiAqL1xuXG52YXIgRWFyY3V0ID0ge1xuXG5cdHRyaWFuZ3VsYXRlOiBmdW5jdGlvbiAoIGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0gKSB7XG5cblx0XHRkaW0gPSBkaW0gfHwgMjtcblxuXHRcdHZhciBoYXNIb2xlcyA9IGhvbGVJbmRpY2VzICYmIGhvbGVJbmRpY2VzLmxlbmd0aCxcblx0XHRcdG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1sgMCBdICogZGltIDogZGF0YS5sZW5ndGgsXG5cdFx0XHRvdXRlck5vZGUgPSBsaW5rZWRMaXN0KCBkYXRhLCAwLCBvdXRlckxlbiwgZGltLCB0cnVlICksXG5cdFx0XHR0cmlhbmdsZXMgPSBbXTtcblxuXHRcdGlmICggISBvdXRlck5vZGUgKSByZXR1cm4gdHJpYW5nbGVzO1xuXG5cdFx0dmFyIG1pblgsIG1pblksIG1heFgsIG1heFksIHgsIHksIGludlNpemU7XG5cblx0XHRpZiAoIGhhc0hvbGVzICkgb3V0ZXJOb2RlID0gZWxpbWluYXRlSG9sZXMoIGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSApO1xuXG5cdFx0Ly8gaWYgdGhlIHNoYXBlIGlzIG5vdCB0b28gc2ltcGxlLCB3ZSdsbCB1c2Ugei1vcmRlciBjdXJ2ZSBoYXNoIGxhdGVyOyBjYWxjdWxhdGUgcG9seWdvbiBiYm94XG5cblx0XHRpZiAoIGRhdGEubGVuZ3RoID4gODAgKiBkaW0gKSB7XG5cblx0XHRcdG1pblggPSBtYXhYID0gZGF0YVsgMCBdO1xuXHRcdFx0bWluWSA9IG1heFkgPSBkYXRhWyAxIF07XG5cblx0XHRcdGZvciAoIHZhciBpID0gZGltOyBpIDwgb3V0ZXJMZW47IGkgKz0gZGltICkge1xuXG5cdFx0XHRcdHggPSBkYXRhWyBpIF07XG5cdFx0XHRcdHkgPSBkYXRhWyBpICsgMSBdO1xuXHRcdFx0XHRpZiAoIHggPCBtaW5YICkgbWluWCA9IHg7XG5cdFx0XHRcdGlmICggeSA8IG1pblkgKSBtaW5ZID0geTtcblx0XHRcdFx0aWYgKCB4ID4gbWF4WCApIG1heFggPSB4O1xuXHRcdFx0XHRpZiAoIHkgPiBtYXhZICkgbWF4WSA9IHk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gbWluWCwgbWluWSBhbmQgaW52U2l6ZSBhcmUgbGF0ZXIgdXNlZCB0byB0cmFuc2Zvcm0gY29vcmRzIGludG8gaW50ZWdlcnMgZm9yIHotb3JkZXIgY2FsY3VsYXRpb25cblxuXHRcdFx0aW52U2l6ZSA9IE1hdGgubWF4KCBtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkgKTtcblx0XHRcdGludlNpemUgPSBpbnZTaXplICE9PSAwID8gMSAvIGludlNpemUgOiAwO1xuXG5cdFx0fVxuXG5cdFx0ZWFyY3V0TGlua2VkKCBvdXRlck5vZGUsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cblx0XHRyZXR1cm4gdHJpYW5nbGVzO1xuXG5cdH1cblxufTtcblxuLy8gY3JlYXRlIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0IGZyb20gcG9seWdvbiBwb2ludHMgaW4gdGhlIHNwZWNpZmllZCB3aW5kaW5nIG9yZGVyXG5cbmZ1bmN0aW9uIGxpbmtlZExpc3QoIGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgY2xvY2t3aXNlICkge1xuXG5cdHZhciBpLCBsYXN0O1xuXG5cdGlmICggY2xvY2t3aXNlID09PSAoIHNpZ25lZEFyZWEoIGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSApID4gMCApICkge1xuXG5cdFx0Zm9yICggaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IGRpbSApIGxhc3QgPSBpbnNlcnROb2RlKCBpLCBkYXRhWyBpIF0sIGRhdGFbIGkgKyAxIF0sIGxhc3QgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Zm9yICggaSA9IGVuZCAtIGRpbTsgaSA+PSBzdGFydDsgaSAtPSBkaW0gKSBsYXN0ID0gaW5zZXJ0Tm9kZSggaSwgZGF0YVsgaSBdLCBkYXRhWyBpICsgMSBdLCBsYXN0ICk7XG5cblx0fVxuXG5cdGlmICggbGFzdCAmJiBlcXVhbHMoIGxhc3QsIGxhc3QubmV4dCApICkge1xuXG5cdFx0cmVtb3ZlTm9kZSggbGFzdCApO1xuXHRcdGxhc3QgPSBsYXN0Lm5leHQ7XG5cblx0fVxuXG5cdHJldHVybiBsYXN0O1xuXG59XG5cbi8vIGVsaW1pbmF0ZSBjb2xpbmVhciBvciBkdXBsaWNhdGUgcG9pbnRzXG5cbmZ1bmN0aW9uIGZpbHRlclBvaW50cyggc3RhcnQsIGVuZCApIHtcblxuXHRpZiAoICEgc3RhcnQgKSByZXR1cm4gc3RhcnQ7XG5cdGlmICggISBlbmQgKSBlbmQgPSBzdGFydDtcblxuXHR2YXIgcCA9IHN0YXJ0LCBhZ2FpbjtcblxuXHRkbyB7XG5cblx0XHRhZ2FpbiA9IGZhbHNlO1xuXG5cdFx0aWYgKCAhIHAuc3RlaW5lciAmJiAoIGVxdWFscyggcCwgcC5uZXh0ICkgfHwgYXJlYSggcC5wcmV2LCBwLCBwLm5leHQgKSA9PT0gMCApICkge1xuXG5cdFx0XHRyZW1vdmVOb2RlKCBwICk7XG5cdFx0XHRwID0gZW5kID0gcC5wcmV2O1xuXHRcdFx0aWYgKCBwID09PSBwLm5leHQgKSBicmVhaztcblx0XHRcdGFnYWluID0gdHJ1ZTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHAgPSBwLm5leHQ7XG5cblx0XHR9XG5cblx0fSB3aGlsZSAoIGFnYWluIHx8IHAgIT09IGVuZCApO1xuXG5cdHJldHVybiBlbmQ7XG5cbn1cblxuLy8gbWFpbiBlYXIgc2xpY2luZyBsb29wIHdoaWNoIHRyaWFuZ3VsYXRlcyBhIHBvbHlnb24gKGdpdmVuIGFzIGEgbGlua2VkIGxpc3QpXG5cbmZ1bmN0aW9uIGVhcmN1dExpbmtlZCggZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgcGFzcyApIHtcblxuXHRpZiAoICEgZWFyICkgcmV0dXJuO1xuXG5cdC8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcblxuXHRpZiAoICEgcGFzcyAmJiBpbnZTaXplICkgaW5kZXhDdXJ2ZSggZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cblx0dmFyIHN0b3AgPSBlYXIsIHByZXYsIG5leHQ7XG5cblx0Ly8gaXRlcmF0ZSB0aHJvdWdoIGVhcnMsIHNsaWNpbmcgdGhlbSBvbmUgYnkgb25lXG5cblx0d2hpbGUgKCBlYXIucHJldiAhPT0gZWFyLm5leHQgKSB7XG5cblx0XHRwcmV2ID0gZWFyLnByZXY7XG5cdFx0bmV4dCA9IGVhci5uZXh0O1xuXG5cdFx0aWYgKCBpbnZTaXplID8gaXNFYXJIYXNoZWQoIGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSApIDogaXNFYXIoIGVhciApICkge1xuXG5cdFx0XHQvLyBjdXQgb2ZmIHRoZSB0cmlhbmdsZVxuXHRcdFx0dHJpYW5nbGVzLnB1c2goIHByZXYuaSAvIGRpbSApO1xuXHRcdFx0dHJpYW5nbGVzLnB1c2goIGVhci5pIC8gZGltICk7XG5cdFx0XHR0cmlhbmdsZXMucHVzaCggbmV4dC5pIC8gZGltICk7XG5cblx0XHRcdHJlbW92ZU5vZGUoIGVhciApO1xuXG5cdFx0XHQvLyBza2lwcGluZyB0aGUgbmV4dCB2ZXJ0aWNlIGxlYWRzIHRvIGxlc3Mgc2xpdmVyIHRyaWFuZ2xlc1xuXHRcdFx0ZWFyID0gbmV4dC5uZXh0O1xuXHRcdFx0c3RvcCA9IG5leHQubmV4dDtcblxuXHRcdFx0Y29udGludWU7XG5cblx0XHR9XG5cblx0XHRlYXIgPSBuZXh0O1xuXG5cdFx0Ly8gaWYgd2UgbG9vcGVkIHRocm91Z2ggdGhlIHdob2xlIHJlbWFpbmluZyBwb2x5Z29uIGFuZCBjYW4ndCBmaW5kIGFueSBtb3JlIGVhcnNcblxuXHRcdGlmICggZWFyID09PSBzdG9wICkge1xuXG5cdFx0XHQvLyB0cnkgZmlsdGVyaW5nIHBvaW50cyBhbmQgc2xpY2luZyBhZ2FpblxuXG5cdFx0XHRpZiAoICEgcGFzcyApIHtcblxuXHRcdFx0XHRlYXJjdXRMaW5rZWQoIGZpbHRlclBvaW50cyggZWFyICksIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAxICk7XG5cblx0XHRcdFx0Ly8gaWYgdGhpcyBkaWRuJ3Qgd29yaywgdHJ5IGN1cmluZyBhbGwgc21hbGwgc2VsZi1pbnRlcnNlY3Rpb25zIGxvY2FsbHlcblxuXHRcdFx0fSBlbHNlIGlmICggcGFzcyA9PT0gMSApIHtcblxuXHRcdFx0XHRlYXIgPSBjdXJlTG9jYWxJbnRlcnNlY3Rpb25zKCBlYXIsIHRyaWFuZ2xlcywgZGltICk7XG5cdFx0XHRcdGVhcmN1dExpbmtlZCggZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgMiApO1xuXG5cdFx0XHQvLyBhcyBhIGxhc3QgcmVzb3J0LCB0cnkgc3BsaXR0aW5nIHRoZSByZW1haW5pbmcgcG9seWdvbiBpbnRvIHR3b1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBwYXNzID09PSAyICkge1xuXG5cdFx0XHRcdHNwbGl0RWFyY3V0KCBlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cblx0XHRcdH1cblxuXHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbi8vIGNoZWNrIHdoZXRoZXIgYSBwb2x5Z29uIG5vZGUgZm9ybXMgYSB2YWxpZCBlYXIgd2l0aCBhZGphY2VudCBub2Rlc1xuXG5mdW5jdGlvbiBpc0VhciggZWFyICkge1xuXG5cdHZhciBhID0gZWFyLnByZXYsXG5cdFx0YiA9IGVhcixcblx0XHRjID0gZWFyLm5leHQ7XG5cblx0aWYgKCBhcmVhKCBhLCBiLCBjICkgPj0gMCApIHJldHVybiBmYWxzZTsgLy8gcmVmbGV4LCBjYW4ndCBiZSBhbiBlYXJcblxuXHQvLyBub3cgbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgb3RoZXIgcG9pbnRzIGluc2lkZSB0aGUgcG90ZW50aWFsIGVhclxuXHR2YXIgcCA9IGVhci5uZXh0Lm5leHQ7XG5cblx0d2hpbGUgKCBwICE9PSBlYXIucHJldiApIHtcblxuXHRcdGlmICggcG9pbnRJblRyaWFuZ2xlKCBhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSApICYmIGFyZWEoIHAucHJldiwgcCwgcC5uZXh0ICkgPj0gMCApIHtcblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9XG5cblx0cmV0dXJuIHRydWU7XG5cbn1cblxuZnVuY3Rpb24gaXNFYXJIYXNoZWQoIGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSApIHtcblxuXHR2YXIgYSA9IGVhci5wcmV2LFxuXHRcdGIgPSBlYXIsXG5cdFx0YyA9IGVhci5uZXh0O1xuXG5cdGlmICggYXJlYSggYSwgYiwgYyApID49IDAgKSByZXR1cm4gZmFsc2U7IC8vIHJlZmxleCwgY2FuJ3QgYmUgYW4gZWFyXG5cblx0Ly8gdHJpYW5nbGUgYmJveDsgbWluICYgbWF4IGFyZSBjYWxjdWxhdGVkIGxpa2UgdGhpcyBmb3Igc3BlZWRcblxuXHR2YXIgbWluVFggPSBhLnggPCBiLnggPyAoIGEueCA8IGMueCA/IGEueCA6IGMueCApIDogKCBiLnggPCBjLnggPyBiLnggOiBjLnggKSxcblx0XHRtaW5UWSA9IGEueSA8IGIueSA/ICggYS55IDwgYy55ID8gYS55IDogYy55ICkgOiAoIGIueSA8IGMueSA/IGIueSA6IGMueSApLFxuXHRcdG1heFRYID0gYS54ID4gYi54ID8gKCBhLnggPiBjLnggPyBhLnggOiBjLnggKSA6ICggYi54ID4gYy54ID8gYi54IDogYy54ICksXG5cdFx0bWF4VFkgPSBhLnkgPiBiLnkgPyAoIGEueSA+IGMueSA/IGEueSA6IGMueSApIDogKCBiLnkgPiBjLnkgPyBiLnkgOiBjLnkgKTtcblxuXHQvLyB6LW9yZGVyIHJhbmdlIGZvciB0aGUgY3VycmVudCB0cmlhbmdsZSBiYm94O1xuXG5cdHZhciBtaW5aID0gek9yZGVyKCBtaW5UWCwgbWluVFksIG1pblgsIG1pblksIGludlNpemUgKSxcblx0XHRtYXhaID0gek9yZGVyKCBtYXhUWCwgbWF4VFksIG1pblgsIG1pblksIGludlNpemUgKTtcblxuXHQvLyBmaXJzdCBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBpbiBpbmNyZWFzaW5nIHotb3JkZXJcblxuXHR2YXIgcCA9IGVhci5uZXh0WjtcblxuXHR3aGlsZSAoIHAgJiYgcC56IDw9IG1heFogKSB7XG5cblx0XHRpZiAoIHAgIT09IGVhci5wcmV2ICYmIHAgIT09IGVhci5uZXh0ICYmXG5cdFx0XHRcdHBvaW50SW5UcmlhbmdsZSggYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkgKSAmJlxuXHRcdFx0XHRhcmVhKCBwLnByZXYsIHAsIHAubmV4dCApID49IDAgKSByZXR1cm4gZmFsc2U7XG5cdFx0cCA9IHAubmV4dFo7XG5cblx0fVxuXG5cdC8vIHRoZW4gbG9vayBmb3IgcG9pbnRzIGluIGRlY3JlYXNpbmcgei1vcmRlclxuXG5cdHAgPSBlYXIucHJldlo7XG5cblx0d2hpbGUgKCBwICYmIHAueiA+PSBtaW5aICkge1xuXG5cdFx0aWYgKCBwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJlxuXHRcdFx0XHRwb2ludEluVHJpYW5nbGUoIGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55ICkgJiZcblx0XHRcdFx0YXJlYSggcC5wcmV2LCBwLCBwLm5leHQgKSA+PSAwICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0cCA9IHAucHJldlo7XG5cblx0fVxuXG5cdHJldHVybiB0cnVlO1xuXG59XG5cbi8vIGdvIHRocm91Z2ggYWxsIHBvbHlnb24gbm9kZXMgYW5kIGN1cmUgc21hbGwgbG9jYWwgc2VsZi1pbnRlcnNlY3Rpb25zXG5cbmZ1bmN0aW9uIGN1cmVMb2NhbEludGVyc2VjdGlvbnMoIHN0YXJ0LCB0cmlhbmdsZXMsIGRpbSApIHtcblxuXHR2YXIgcCA9IHN0YXJ0O1xuXG5cdGRvIHtcblxuXHRcdHZhciBhID0gcC5wcmV2LCBiID0gcC5uZXh0Lm5leHQ7XG5cblx0XHRpZiAoICEgZXF1YWxzKCBhLCBiICkgJiYgaW50ZXJzZWN0cyggYSwgcCwgcC5uZXh0LCBiICkgJiYgbG9jYWxseUluc2lkZSggYSwgYiApICYmIGxvY2FsbHlJbnNpZGUoIGIsIGEgKSApIHtcblxuXHRcdFx0dHJpYW5nbGVzLnB1c2goIGEuaSAvIGRpbSApO1xuXHRcdFx0dHJpYW5nbGVzLnB1c2goIHAuaSAvIGRpbSApO1xuXHRcdFx0dHJpYW5nbGVzLnB1c2goIGIuaSAvIGRpbSApO1xuXG5cdFx0XHQvLyByZW1vdmUgdHdvIG5vZGVzIGludm9sdmVkXG5cblx0XHRcdHJlbW92ZU5vZGUoIHAgKTtcblx0XHRcdHJlbW92ZU5vZGUoIHAubmV4dCApO1xuXG5cdFx0XHRwID0gc3RhcnQgPSBiO1xuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gc3RhcnQgKTtcblxuXHRyZXR1cm4gcDtcblxufVxuXG4vLyB0cnkgc3BsaXR0aW5nIHBvbHlnb24gaW50byB0d28gYW5kIHRyaWFuZ3VsYXRlIHRoZW0gaW5kZXBlbmRlbnRseVxuXG5mdW5jdGlvbiBzcGxpdEVhcmN1dCggc3RhcnQsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICkge1xuXG5cdC8vIGxvb2sgZm9yIGEgdmFsaWQgZGlhZ29uYWwgdGhhdCBkaXZpZGVzIHRoZSBwb2x5Z29uIGludG8gdHdvXG5cblx0dmFyIGEgPSBzdGFydDtcblxuXHRkbyB7XG5cblx0XHR2YXIgYiA9IGEubmV4dC5uZXh0O1xuXG5cdFx0d2hpbGUgKCBiICE9PSBhLnByZXYgKSB7XG5cblx0XHRcdGlmICggYS5pICE9PSBiLmkgJiYgaXNWYWxpZERpYWdvbmFsKCBhLCBiICkgKSB7XG5cblx0XHRcdFx0Ly8gc3BsaXQgdGhlIHBvbHlnb24gaW4gdHdvIGJ5IHRoZSBkaWFnb25hbFxuXG5cdFx0XHRcdHZhciBjID0gc3BsaXRQb2x5Z29uKCBhLCBiICk7XG5cblx0XHRcdFx0Ly8gZmlsdGVyIGNvbGluZWFyIHBvaW50cyBhcm91bmQgdGhlIGN1dHNcblxuXHRcdFx0XHRhID0gZmlsdGVyUG9pbnRzKCBhLCBhLm5leHQgKTtcblx0XHRcdFx0YyA9IGZpbHRlclBvaW50cyggYywgYy5uZXh0ICk7XG5cblx0XHRcdFx0Ly8gcnVuIGVhcmN1dCBvbiBlYWNoIGhhbGZcblxuXHRcdFx0XHRlYXJjdXRMaW5rZWQoIGEsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cdFx0XHRcdGVhcmN1dExpbmtlZCggYywgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUgKTtcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdGIgPSBiLm5leHQ7XG5cblx0XHR9XG5cblx0XHRhID0gYS5uZXh0O1xuXG5cdH0gd2hpbGUgKCBhICE9PSBzdGFydCApO1xuXG59XG5cbi8vIGxpbmsgZXZlcnkgaG9sZSBpbnRvIHRoZSBvdXRlciBsb29wLCBwcm9kdWNpbmcgYSBzaW5nbGUtcmluZyBwb2x5Z29uIHdpdGhvdXQgaG9sZXNcblxuZnVuY3Rpb24gZWxpbWluYXRlSG9sZXMoIGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSApIHtcblxuXHR2YXIgcXVldWUgPSBbXSwgaSwgbGVuLCBzdGFydCwgZW5kLCBsaXN0O1xuXG5cdGZvciAoIGkgPSAwLCBsZW4gPSBob2xlSW5kaWNlcy5sZW5ndGg7IGkgPCBsZW47IGkgKysgKSB7XG5cblx0XHRzdGFydCA9IGhvbGVJbmRpY2VzWyBpIF0gKiBkaW07XG5cdFx0ZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1sgaSArIDEgXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuXHRcdGxpc3QgPSBsaW5rZWRMaXN0KCBkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGZhbHNlICk7XG5cdFx0aWYgKCBsaXN0ID09PSBsaXN0Lm5leHQgKSBsaXN0LnN0ZWluZXIgPSB0cnVlO1xuXHRcdHF1ZXVlLnB1c2goIGdldExlZnRtb3N0KCBsaXN0ICkgKTtcblxuXHR9XG5cblx0cXVldWUuc29ydCggY29tcGFyZVggKTtcblxuXHQvLyBwcm9jZXNzIGhvbGVzIGZyb20gbGVmdCB0byByaWdodFxuXG5cdGZvciAoIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0ZWxpbWluYXRlSG9sZSggcXVldWVbIGkgXSwgb3V0ZXJOb2RlICk7XG5cdFx0b3V0ZXJOb2RlID0gZmlsdGVyUG9pbnRzKCBvdXRlck5vZGUsIG91dGVyTm9kZS5uZXh0ICk7XG5cblx0fVxuXG5cdHJldHVybiBvdXRlck5vZGU7XG5cbn1cblxuZnVuY3Rpb24gY29tcGFyZVgoIGEsIGIgKSB7XG5cblx0cmV0dXJuIGEueCAtIGIueDtcblxufVxuXG4vLyBmaW5kIGEgYnJpZGdlIGJldHdlZW4gdmVydGljZXMgdGhhdCBjb25uZWN0cyBob2xlIHdpdGggYW4gb3V0ZXIgcmluZyBhbmQgYW5kIGxpbmsgaXRcblxuZnVuY3Rpb24gZWxpbWluYXRlSG9sZSggaG9sZSwgb3V0ZXJOb2RlICkge1xuXG5cdG91dGVyTm9kZSA9IGZpbmRIb2xlQnJpZGdlKCBob2xlLCBvdXRlck5vZGUgKTtcblxuXHRpZiAoIG91dGVyTm9kZSApIHtcblxuXHRcdHZhciBiID0gc3BsaXRQb2x5Z29uKCBvdXRlck5vZGUsIGhvbGUgKTtcblxuXHRcdGZpbHRlclBvaW50cyggYiwgYi5uZXh0ICk7XG5cblx0fVxuXG59XG5cbi8vIERhdmlkIEViZXJseSdzIGFsZ29yaXRobSBmb3IgZmluZGluZyBhIGJyaWRnZSBiZXR3ZWVuIGhvbGUgYW5kIG91dGVyIHBvbHlnb25cblxuZnVuY3Rpb24gZmluZEhvbGVCcmlkZ2UoIGhvbGUsIG91dGVyTm9kZSApIHtcblxuXHR2YXIgcCA9IG91dGVyTm9kZSxcblx0XHRoeCA9IGhvbGUueCxcblx0XHRoeSA9IGhvbGUueSxcblx0XHRxeCA9IC0gSW5maW5pdHksXG5cdFx0bTtcblxuXHQvLyBmaW5kIGEgc2VnbWVudCBpbnRlcnNlY3RlZCBieSBhIHJheSBmcm9tIHRoZSBob2xlJ3MgbGVmdG1vc3QgcG9pbnQgdG8gdGhlIGxlZnQ7XG5cdC8vIHNlZ21lbnQncyBlbmRwb2ludCB3aXRoIGxlc3NlciB4IHdpbGwgYmUgcG90ZW50aWFsIGNvbm5lY3Rpb24gcG9pbnRcblxuXHRkbyB7XG5cblx0XHRpZiAoIGh5IDw9IHAueSAmJiBoeSA+PSBwLm5leHQueSAmJiBwLm5leHQueSAhPT0gcC55ICkge1xuXG5cdFx0XHR2YXIgeCA9IHAueCArICggaHkgLSBwLnkgKSAqICggcC5uZXh0LnggLSBwLnggKSAvICggcC5uZXh0LnkgLSBwLnkgKTtcblxuXHRcdFx0aWYgKCB4IDw9IGh4ICYmIHggPiBxeCApIHtcblxuXHRcdFx0XHRxeCA9IHg7XG5cblx0XHRcdFx0aWYgKCB4ID09PSBoeCApIHtcblxuXHRcdFx0XHRcdGlmICggaHkgPT09IHAueSApIHJldHVybiBwO1xuXHRcdFx0XHRcdGlmICggaHkgPT09IHAubmV4dC55ICkgcmV0dXJuIHAubmV4dDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bSA9IHAueCA8IHAubmV4dC54ID8gcCA6IHAubmV4dDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gb3V0ZXJOb2RlICk7XG5cblx0aWYgKCAhIG0gKSByZXR1cm4gbnVsbDtcblxuXHRpZiAoIGh4ID09PSBxeCApIHJldHVybiBtLnByZXY7IC8vIGhvbGUgdG91Y2hlcyBvdXRlciBzZWdtZW50OyBwaWNrIGxvd2VyIGVuZHBvaW50XG5cblx0Ly8gbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgb2YgaG9sZSBwb2ludCwgc2VnbWVudCBpbnRlcnNlY3Rpb24gYW5kIGVuZHBvaW50O1xuXHQvLyBpZiB0aGVyZSBhcmUgbm8gcG9pbnRzIGZvdW5kLCB3ZSBoYXZlIGEgdmFsaWQgY29ubmVjdGlvbjtcblx0Ly8gb3RoZXJ3aXNlIGNob29zZSB0aGUgcG9pbnQgb2YgdGhlIG1pbmltdW0gYW5nbGUgd2l0aCB0aGUgcmF5IGFzIGNvbm5lY3Rpb24gcG9pbnRcblxuXHR2YXIgc3RvcCA9IG0sXG5cdFx0bXggPSBtLngsXG5cdFx0bXkgPSBtLnksXG5cdFx0dGFuTWluID0gSW5maW5pdHksXG5cdFx0dGFuO1xuXG5cdHAgPSBtLm5leHQ7XG5cblx0d2hpbGUgKCBwICE9PSBzdG9wICkge1xuXG5cdFx0aWYgKCBoeCA+PSBwLnggJiYgcC54ID49IG14ICYmIGh4ICE9PSBwLnggJiZcblx0XHRcdFx0XHRcdHBvaW50SW5UcmlhbmdsZSggaHkgPCBteSA/IGh4IDogcXgsIGh5LCBteCwgbXksIGh5IDwgbXkgPyBxeCA6IGh4LCBoeSwgcC54LCBwLnkgKSApIHtcblxuXHRcdFx0dGFuID0gTWF0aC5hYnMoIGh5IC0gcC55ICkgLyAoIGh4IC0gcC54ICk7IC8vIHRhbmdlbnRpYWxcblxuXHRcdFx0aWYgKCAoIHRhbiA8IHRhbk1pbiB8fCAoIHRhbiA9PT0gdGFuTWluICYmIHAueCA+IG0ueCApICkgJiYgbG9jYWxseUluc2lkZSggcCwgaG9sZSApICkge1xuXG5cdFx0XHRcdG0gPSBwO1xuXHRcdFx0XHR0YW5NaW4gPSB0YW47XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHAgPSBwLm5leHQ7XG5cblx0fVxuXG5cdHJldHVybiBtO1xuXG59XG5cbi8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcblxuZnVuY3Rpb24gaW5kZXhDdXJ2ZSggc3RhcnQsIG1pblgsIG1pblksIGludlNpemUgKSB7XG5cblx0dmFyIHAgPSBzdGFydDtcblxuXHRkbyB7XG5cblx0XHRpZiAoIHAueiA9PT0gbnVsbCApIHAueiA9IHpPcmRlciggcC54LCBwLnksIG1pblgsIG1pblksIGludlNpemUgKTtcblx0XHRwLnByZXZaID0gcC5wcmV2O1xuXHRcdHAubmV4dFogPSBwLm5leHQ7XG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gc3RhcnQgKTtcblxuXHRwLnByZXZaLm5leHRaID0gbnVsbDtcblx0cC5wcmV2WiA9IG51bGw7XG5cblx0c29ydExpbmtlZCggcCApO1xuXG59XG5cbi8vIFNpbW9uIFRhdGhhbSdzIGxpbmtlZCBsaXN0IG1lcmdlIHNvcnQgYWxnb3JpdGhtXG4vLyBodHRwOi8vd3d3LmNoaWFyay5ncmVlbmVuZC5vcmcudWsvfnNndGF0aGFtL2FsZ29yaXRobXMvbGlzdHNvcnQuaHRtbFxuXG5mdW5jdGlvbiBzb3J0TGlua2VkKCBsaXN0ICkge1xuXG5cdHZhciBpLCBwLCBxLCBlLCB0YWlsLCBudW1NZXJnZXMsIHBTaXplLCBxU2l6ZSwgaW5TaXplID0gMTtcblxuXHRkbyB7XG5cblx0XHRwID0gbGlzdDtcblx0XHRsaXN0ID0gbnVsbDtcblx0XHR0YWlsID0gbnVsbDtcblx0XHRudW1NZXJnZXMgPSAwO1xuXG5cdFx0d2hpbGUgKCBwICkge1xuXG5cdFx0XHRudW1NZXJnZXMgKys7XG5cdFx0XHRxID0gcDtcblx0XHRcdHBTaXplID0gMDtcblxuXHRcdFx0Zm9yICggaSA9IDA7IGkgPCBpblNpemU7IGkgKysgKSB7XG5cblx0XHRcdFx0cFNpemUgKys7XG5cdFx0XHRcdHEgPSBxLm5leHRaO1xuXHRcdFx0XHRpZiAoICEgcSApIGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdHFTaXplID0gaW5TaXplO1xuXG5cdFx0XHR3aGlsZSAoIHBTaXplID4gMCB8fCAoIHFTaXplID4gMCAmJiBxICkgKSB7XG5cblx0XHRcdFx0aWYgKCBwU2l6ZSAhPT0gMCAmJiAoIHFTaXplID09PSAwIHx8ICEgcSB8fCBwLnogPD0gcS56ICkgKSB7XG5cblx0XHRcdFx0XHRlID0gcDtcblx0XHRcdFx0XHRwID0gcC5uZXh0Wjtcblx0XHRcdFx0XHRwU2l6ZSAtLTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0ZSA9IHE7XG5cdFx0XHRcdFx0cSA9IHEubmV4dFo7XG5cdFx0XHRcdFx0cVNpemUgLS07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdGFpbCApIHRhaWwubmV4dFogPSBlO1xuXHRcdFx0XHRlbHNlIGxpc3QgPSBlO1xuXG5cdFx0XHRcdGUucHJldlogPSB0YWlsO1xuXHRcdFx0XHR0YWlsID0gZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRwID0gcTtcblxuXHRcdH1cblxuXHRcdHRhaWwubmV4dFogPSBudWxsO1xuXHRcdGluU2l6ZSAqPSAyO1xuXG5cdH0gd2hpbGUgKCBudW1NZXJnZXMgPiAxICk7XG5cblx0cmV0dXJuIGxpc3Q7XG5cbn1cblxuLy8gei1vcmRlciBvZiBhIHBvaW50IGdpdmVuIGNvb3JkcyBhbmQgaW52ZXJzZSBvZiB0aGUgbG9uZ2VyIHNpZGUgb2YgZGF0YSBiYm94XG5cbmZ1bmN0aW9uIHpPcmRlciggeCwgeSwgbWluWCwgbWluWSwgaW52U2l6ZSApIHtcblxuXHQvLyBjb29yZHMgYXJlIHRyYW5zZm9ybWVkIGludG8gbm9uLW5lZ2F0aXZlIDE1LWJpdCBpbnRlZ2VyIHJhbmdlXG5cblx0eCA9IDMyNzY3ICogKCB4IC0gbWluWCApICogaW52U2l6ZTtcblx0eSA9IDMyNzY3ICogKCB5IC0gbWluWSApICogaW52U2l6ZTtcblxuXHR4ID0gKCB4IHwgKCB4IDw8IDggKSApICYgMHgwMEZGMDBGRjtcblx0eCA9ICggeCB8ICggeCA8PCA0ICkgKSAmIDB4MEYwRjBGMEY7XG5cdHggPSAoIHggfCAoIHggPDwgMiApICkgJiAweDMzMzMzMzMzO1xuXHR4ID0gKCB4IHwgKCB4IDw8IDEgKSApICYgMHg1NTU1NTU1NTtcblxuXHR5ID0gKCB5IHwgKCB5IDw8IDggKSApICYgMHgwMEZGMDBGRjtcblx0eSA9ICggeSB8ICggeSA8PCA0ICkgKSAmIDB4MEYwRjBGMEY7XG5cdHkgPSAoIHkgfCAoIHkgPDwgMiApICkgJiAweDMzMzMzMzMzO1xuXHR5ID0gKCB5IHwgKCB5IDw8IDEgKSApICYgMHg1NTU1NTU1NTtcblxuXHRyZXR1cm4geCB8ICggeSA8PCAxICk7XG5cbn1cblxuLy8gZmluZCB0aGUgbGVmdG1vc3Qgbm9kZSBvZiBhIHBvbHlnb24gcmluZ1xuXG5mdW5jdGlvbiBnZXRMZWZ0bW9zdCggc3RhcnQgKSB7XG5cblx0dmFyIHAgPSBzdGFydCwgbGVmdG1vc3QgPSBzdGFydDtcblxuXHRkbyB7XG5cblx0XHRpZiAoIHAueCA8IGxlZnRtb3N0LnggKSBsZWZ0bW9zdCA9IHA7XG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gc3RhcnQgKTtcblxuXHRyZXR1cm4gbGVmdG1vc3Q7XG5cbn1cblxuLy8gY2hlY2sgaWYgYSBwb2ludCBsaWVzIHdpdGhpbiBhIGNvbnZleCB0cmlhbmdsZVxuXG5mdW5jdGlvbiBwb2ludEluVHJpYW5nbGUoIGF4LCBheSwgYngsIGJ5LCBjeCwgY3ksIHB4LCBweSApIHtcblxuXHRyZXR1cm4gKCBjeCAtIHB4ICkgKiAoIGF5IC0gcHkgKSAtICggYXggLSBweCApICogKCBjeSAtIHB5ICkgPj0gMCAmJlxuXHQgKCBheCAtIHB4ICkgKiAoIGJ5IC0gcHkgKSAtICggYnggLSBweCApICogKCBheSAtIHB5ICkgPj0gMCAmJlxuXHQgKCBieCAtIHB4ICkgKiAoIGN5IC0gcHkgKSAtICggY3ggLSBweCApICogKCBieSAtIHB5ICkgPj0gMDtcblxufVxuXG4vLyBjaGVjayBpZiBhIGRpYWdvbmFsIGJldHdlZW4gdHdvIHBvbHlnb24gbm9kZXMgaXMgdmFsaWQgKGxpZXMgaW4gcG9seWdvbiBpbnRlcmlvcilcblxuZnVuY3Rpb24gaXNWYWxpZERpYWdvbmFsKCBhLCBiICkge1xuXG5cdHJldHVybiBhLm5leHQuaSAhPT0gYi5pICYmIGEucHJldi5pICE9PSBiLmkgJiYgISBpbnRlcnNlY3RzUG9seWdvbiggYSwgYiApICYmXG5cdFx0bG9jYWxseUluc2lkZSggYSwgYiApICYmIGxvY2FsbHlJbnNpZGUoIGIsIGEgKSAmJiBtaWRkbGVJbnNpZGUoIGEsIGIgKTtcblxufVxuXG4vLyBzaWduZWQgYXJlYSBvZiBhIHRyaWFuZ2xlXG5cbmZ1bmN0aW9uIGFyZWEoIHAsIHEsIHIgKSB7XG5cblx0cmV0dXJuICggcS55IC0gcC55ICkgKiAoIHIueCAtIHEueCApIC0gKCBxLnggLSBwLnggKSAqICggci55IC0gcS55ICk7XG5cbn1cblxuLy8gY2hlY2sgaWYgdHdvIHBvaW50cyBhcmUgZXF1YWxcblxuZnVuY3Rpb24gZXF1YWxzKCBwMSwgcDIgKSB7XG5cblx0cmV0dXJuIHAxLnggPT09IHAyLnggJiYgcDEueSA9PT0gcDIueTtcblxufVxuXG4vLyBjaGVjayBpZiB0d28gc2VnbWVudHMgaW50ZXJzZWN0XG5cbmZ1bmN0aW9uIGludGVyc2VjdHMoIHAxLCBxMSwgcDIsIHEyICkge1xuXG5cdGlmICggKCBlcXVhbHMoIHAxLCBxMSApICYmIGVxdWFscyggcDIsIHEyICkgKSB8fFxuXHRcdFx0KCBlcXVhbHMoIHAxLCBxMiApICYmIGVxdWFscyggcDIsIHExICkgKSApIHJldHVybiB0cnVlO1xuXG5cdHJldHVybiBhcmVhKCBwMSwgcTEsIHAyICkgPiAwICE9PSBhcmVhKCBwMSwgcTEsIHEyICkgPiAwICYmXG5cdFx0XHRcdCBhcmVhKCBwMiwgcTIsIHAxICkgPiAwICE9PSBhcmVhKCBwMiwgcTIsIHExICkgPiAwO1xuXG59XG5cbi8vIGNoZWNrIGlmIGEgcG9seWdvbiBkaWFnb25hbCBpbnRlcnNlY3RzIGFueSBwb2x5Z29uIHNlZ21lbnRzXG5cbmZ1bmN0aW9uIGludGVyc2VjdHNQb2x5Z29uKCBhLCBiICkge1xuXG5cdHZhciBwID0gYTtcblxuXHRkbyB7XG5cblx0XHRpZiAoIHAuaSAhPT0gYS5pICYmIHAubmV4dC5pICE9PSBhLmkgJiYgcC5pICE9PSBiLmkgJiYgcC5uZXh0LmkgIT09IGIuaSAmJlxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0cyggcCwgcC5uZXh0LCBhLCBiICkgKSB7XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gYSApO1xuXG5cdHJldHVybiBmYWxzZTtcblxufVxuXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgbG9jYWxseSBpbnNpZGUgdGhlIHBvbHlnb25cblxuZnVuY3Rpb24gbG9jYWxseUluc2lkZSggYSwgYiApIHtcblxuXHRyZXR1cm4gYXJlYSggYS5wcmV2LCBhLCBhLm5leHQgKSA8IDAgP1xuXHRcdGFyZWEoIGEsIGIsIGEubmV4dCApID49IDAgJiYgYXJlYSggYSwgYS5wcmV2LCBiICkgPj0gMCA6XG5cdFx0YXJlYSggYSwgYiwgYS5wcmV2ICkgPCAwIHx8IGFyZWEoIGEsIGEubmV4dCwgYiApIDwgMDtcblxufVxuXG4vLyBjaGVjayBpZiB0aGUgbWlkZGxlIHBvaW50IG9mIGEgcG9seWdvbiBkaWFnb25hbCBpcyBpbnNpZGUgdGhlIHBvbHlnb25cblxuZnVuY3Rpb24gbWlkZGxlSW5zaWRlKCBhLCBiICkge1xuXG5cdHZhciBwID0gYSxcblx0XHRpbnNpZGUgPSBmYWxzZSxcblx0XHRweCA9ICggYS54ICsgYi54ICkgLyAyLFxuXHRcdHB5ID0gKCBhLnkgKyBiLnkgKSAvIDI7XG5cblx0ZG8ge1xuXG5cdFx0aWYgKCAoICggcC55ID4gcHkgKSAhPT0gKCBwLm5leHQueSA+IHB5ICkgKSAmJiBwLm5leHQueSAhPT0gcC55ICYmXG5cdFx0XHRcdFx0XHQoIHB4IDwgKCBwLm5leHQueCAtIHAueCApICogKCBweSAtIHAueSApIC8gKCBwLm5leHQueSAtIHAueSApICsgcC54ICkgKSB7XG5cblx0XHRcdGluc2lkZSA9ICEgaW5zaWRlO1xuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gYSApO1xuXG5cdHJldHVybiBpbnNpZGU7XG5cbn1cblxuLy8gbGluayB0d28gcG9seWdvbiB2ZXJ0aWNlcyB3aXRoIGEgYnJpZGdlOyBpZiB0aGUgdmVydGljZXMgYmVsb25nIHRvIHRoZSBzYW1lIHJpbmcsIGl0IHNwbGl0cyBwb2x5Z29uIGludG8gdHdvO1xuLy8gaWYgb25lIGJlbG9uZ3MgdG8gdGhlIG91dGVyIHJpbmcgYW5kIGFub3RoZXIgdG8gYSBob2xlLCBpdCBtZXJnZXMgaXQgaW50byBhIHNpbmdsZSByaW5nXG5cbmZ1bmN0aW9uIHNwbGl0UG9seWdvbiggYSwgYiApIHtcblxuXHR2YXIgYTIgPSBuZXcgTm9kZSggYS5pLCBhLngsIGEueSApLFxuXHRcdGIyID0gbmV3IE5vZGUoIGIuaSwgYi54LCBiLnkgKSxcblx0XHRhbiA9IGEubmV4dCxcblx0XHRicCA9IGIucHJldjtcblxuXHRhLm5leHQgPSBiO1xuXHRiLnByZXYgPSBhO1xuXG5cdGEyLm5leHQgPSBhbjtcblx0YW4ucHJldiA9IGEyO1xuXG5cdGIyLm5leHQgPSBhMjtcblx0YTIucHJldiA9IGIyO1xuXG5cdGJwLm5leHQgPSBiMjtcblx0YjIucHJldiA9IGJwO1xuXG5cdHJldHVybiBiMjtcblxufVxuXG4vLyBjcmVhdGUgYSBub2RlIGFuZCBvcHRpb25hbGx5IGxpbmsgaXQgd2l0aCBwcmV2aW91cyBvbmUgKGluIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0KVxuXG5mdW5jdGlvbiBpbnNlcnROb2RlKCBpLCB4LCB5LCBsYXN0ICkge1xuXG5cdHZhciBwID0gbmV3IE5vZGUoIGksIHgsIHkgKTtcblxuXHRpZiAoICEgbGFzdCApIHtcblxuXHRcdHAucHJldiA9IHA7XG5cdFx0cC5uZXh0ID0gcDtcblxuXHR9IGVsc2Uge1xuXG5cdFx0cC5uZXh0ID0gbGFzdC5uZXh0O1xuXHRcdHAucHJldiA9IGxhc3Q7XG5cdFx0bGFzdC5uZXh0LnByZXYgPSBwO1xuXHRcdGxhc3QubmV4dCA9IHA7XG5cblx0fVxuXG5cdHJldHVybiBwO1xuXG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGUoIHAgKSB7XG5cblx0cC5uZXh0LnByZXYgPSBwLnByZXY7XG5cdHAucHJldi5uZXh0ID0gcC5uZXh0O1xuXG5cdGlmICggcC5wcmV2WiApIHAucHJldloubmV4dFogPSBwLm5leHRaO1xuXHRpZiAoIHAubmV4dFogKSBwLm5leHRaLnByZXZaID0gcC5wcmV2WjtcblxufVxuXG5mdW5jdGlvbiBOb2RlKCBpLCB4LCB5ICkge1xuXG5cdC8vIHZlcnRpY2UgaW5kZXggaW4gY29vcmRpbmF0ZXMgYXJyYXlcblx0dGhpcy5pID0gaTtcblxuXHQvLyB2ZXJ0ZXggY29vcmRpbmF0ZXNcblx0dGhpcy54ID0geDtcblx0dGhpcy55ID0geTtcblxuXHQvLyBwcmV2aW91cyBhbmQgbmV4dCB2ZXJ0aWNlIG5vZGVzIGluIGEgcG9seWdvbiByaW5nXG5cdHRoaXMucHJldiA9IG51bGw7XG5cdHRoaXMubmV4dCA9IG51bGw7XG5cblx0Ly8gei1vcmRlciBjdXJ2ZSB2YWx1ZVxuXHR0aGlzLnogPSBudWxsO1xuXG5cdC8vIHByZXZpb3VzIGFuZCBuZXh0IG5vZGVzIGluIHotb3JkZXJcblx0dGhpcy5wcmV2WiA9IG51bGw7XG5cdHRoaXMubmV4dFogPSBudWxsO1xuXG5cdC8vIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYSBzdGVpbmVyIHBvaW50XG5cdHRoaXMuc3RlaW5lciA9IGZhbHNlO1xuXG59XG5cbmZ1bmN0aW9uIHNpZ25lZEFyZWEoIGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSApIHtcblxuXHR2YXIgc3VtID0gMDtcblxuXHRmb3IgKCB2YXIgaSA9IHN0YXJ0LCBqID0gZW5kIC0gZGltOyBpIDwgZW5kOyBpICs9IGRpbSApIHtcblxuXHRcdHN1bSArPSAoIGRhdGFbIGogXSAtIGRhdGFbIGkgXSApICogKCBkYXRhWyBpICsgMSBdICsgZGF0YVsgaiArIDEgXSApO1xuXHRcdGogPSBpO1xuXG5cdH1cblxuXHRyZXR1cm4gc3VtO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICovXG5cbnZhciBTaGFwZVV0aWxzID0ge1xuXG5cdC8vIGNhbGN1bGF0ZSBhcmVhIG9mIHRoZSBjb250b3VyIHBvbHlnb25cblxuXHRhcmVhOiBmdW5jdGlvbiAoIGNvbnRvdXIgKSB7XG5cblx0XHR2YXIgbiA9IGNvbnRvdXIubGVuZ3RoO1xuXHRcdHZhciBhID0gMC4wO1xuXG5cdFx0Zm9yICggdmFyIHAgPSBuIC0gMSwgcSA9IDA7IHEgPCBuOyBwID0gcSArKyApIHtcblxuXHRcdFx0YSArPSBjb250b3VyWyBwIF0ueCAqIGNvbnRvdXJbIHEgXS55IC0gY29udG91clsgcSBdLnggKiBjb250b3VyWyBwIF0ueTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBhICogMC41O1xuXG5cdH0sXG5cblx0aXNDbG9ja1dpc2U6IGZ1bmN0aW9uICggcHRzICkge1xuXG5cdFx0cmV0dXJuIFNoYXBlVXRpbHMuYXJlYSggcHRzICkgPCAwO1xuXG5cdH0sXG5cblx0dHJpYW5ndWxhdGVTaGFwZTogZnVuY3Rpb24gKCBjb250b3VyLCBob2xlcyApIHtcblxuXHRcdHZhciB2ZXJ0aWNlcyA9IFtdOyAvLyBmbGF0IGFycmF5IG9mIHZlcnRpY2VzIGxpa2UgWyB4MCx5MCwgeDEseTEsIHgyLHkyLCAuLi4gXVxuXHRcdHZhciBob2xlSW5kaWNlcyA9IFtdOyAvLyBhcnJheSBvZiBob2xlIGluZGljZXNcblx0XHR2YXIgZmFjZXMgPSBbXTsgLy8gZmluYWwgYXJyYXkgb2YgdmVydGV4IGluZGljZXMgbGlrZSBbIFsgYSxiLGQgXSwgWyBiLGMsZCBdIF1cblxuXHRcdHJlbW92ZUR1cEVuZFB0cyggY29udG91ciApO1xuXHRcdGFkZENvbnRvdXIoIHZlcnRpY2VzLCBjb250b3VyICk7XG5cblx0XHQvL1xuXG5cdFx0dmFyIGhvbGVJbmRleCA9IGNvbnRvdXIubGVuZ3RoO1xuXG5cdFx0aG9sZXMuZm9yRWFjaCggcmVtb3ZlRHVwRW5kUHRzICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBob2xlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGhvbGVJbmRpY2VzLnB1c2goIGhvbGVJbmRleCApO1xuXHRcdFx0aG9sZUluZGV4ICs9IGhvbGVzWyBpIF0ubGVuZ3RoO1xuXHRcdFx0YWRkQ29udG91ciggdmVydGljZXMsIGhvbGVzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHR2YXIgdHJpYW5nbGVzID0gRWFyY3V0LnRyaWFuZ3VsYXRlKCB2ZXJ0aWNlcywgaG9sZUluZGljZXMgKTtcblxuXHRcdC8vXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0cmlhbmdsZXMubGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdGZhY2VzLnB1c2goIHRyaWFuZ2xlcy5zbGljZSggaSwgaSArIDMgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhY2VzO1xuXG5cdH1cblxufTtcblxuZnVuY3Rpb24gcmVtb3ZlRHVwRW5kUHRzKCBwb2ludHMgKSB7XG5cblx0dmFyIGwgPSBwb2ludHMubGVuZ3RoO1xuXG5cdGlmICggbCA+IDIgJiYgcG9pbnRzWyBsIC0gMSBdLmVxdWFscyggcG9pbnRzWyAwIF0gKSApIHtcblxuXHRcdHBvaW50cy5wb3AoKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gYWRkQ29udG91ciggdmVydGljZXMsIGNvbnRvdXIgKSB7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY29udG91ci5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHR2ZXJ0aWNlcy5wdXNoKCBjb250b3VyWyBpIF0ueCApO1xuXHRcdHZlcnRpY2VzLnB1c2goIGNvbnRvdXJbIGkgXS55ICk7XG5cblx0fVxuXG59XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICpcbiAqIENyZWF0ZXMgZXh0cnVkZWQgZ2VvbWV0cnkgZnJvbSBhIHBhdGggc2hhcGUuXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqXG4gKiAgY3VydmVTZWdtZW50czogPGludD4sIC8vIG51bWJlciBvZiBwb2ludHMgb24gdGhlIGN1cnZlc1xuICogIHN0ZXBzOiA8aW50PiwgLy8gbnVtYmVyIG9mIHBvaW50cyBmb3Igei1zaWRlIGV4dHJ1c2lvbnMgLyB1c2VkIGZvciBzdWJkaXZpZGluZyBzZWdtZW50cyBvZiBleHRydWRlIHNwbGluZSB0b29cbiAqICBhbW91bnQ6IDxpbnQ+LCAvLyBEZXB0aCB0byBleHRydWRlIHRoZSBzaGFwZVxuICpcbiAqICBiZXZlbEVuYWJsZWQ6IDxib29sPiwgLy8gdHVybiBvbiBiZXZlbFxuICogIGJldmVsVGhpY2tuZXNzOiA8ZmxvYXQ+LCAvLyBob3cgZGVlcCBpbnRvIHRoZSBvcmlnaW5hbCBzaGFwZSBiZXZlbCBnb2VzXG4gKiAgYmV2ZWxTaXplOiA8ZmxvYXQ+LCAvLyBob3cgZmFyIGZyb20gc2hhcGUgb3V0bGluZSBpcyBiZXZlbFxuICogIGJldmVsU2VnbWVudHM6IDxpbnQ+LCAvLyBudW1iZXIgb2YgYmV2ZWwgbGF5ZXJzXG4gKlxuICogIGV4dHJ1ZGVQYXRoOiA8VEhSRUUuQ3VydmU+IC8vIGN1cnZlIHRvIGV4dHJ1ZGUgc2hhcGUgYWxvbmdcbiAqXG4gKiAgVVZHZW5lcmF0b3I6IDxPYmplY3Q+IC8vIG9iamVjdCB0aGF0IHByb3ZpZGVzIFVWIGdlbmVyYXRvciBmdW5jdGlvbnNcbiAqXG4gKiB9XG4gKi9cblxuLy8gRXh0cnVkZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIEV4dHJ1ZGVHZW9tZXRyeSggc2hhcGVzLCBvcHRpb25zICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnRXh0cnVkZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0c2hhcGVzOiBzaGFwZXMsXG5cdFx0b3B0aW9uczogb3B0aW9uc1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgRXh0cnVkZUJ1ZmZlckdlb21ldHJ5KCBzaGFwZXMsIG9wdGlvbnMgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5FeHRydWRlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5FeHRydWRlR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRXh0cnVkZUdlb21ldHJ5O1xuXG4vLyBFeHRydWRlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gRXh0cnVkZUJ1ZmZlckdlb21ldHJ5KCBzaGFwZXMsIG9wdGlvbnMgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdFeHRydWRlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRzaGFwZXM6IHNoYXBlcyxcblx0XHRvcHRpb25zOiBvcHRpb25zXG5cdH07XG5cblx0c2hhcGVzID0gQXJyYXkuaXNBcnJheSggc2hhcGVzICkgPyBzaGFwZXMgOiBbIHNoYXBlcyBdO1xuXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0dmFyIHZlcnRpY2VzQXJyYXkgPSBbXTtcblx0dmFyIHV2QXJyYXkgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBzaGFwZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBzaGFwZSA9IHNoYXBlc1sgaSBdO1xuXHRcdGFkZFNoYXBlKCBzaGFwZSwgb3B0aW9ucyApO1xuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXNBcnJheSwgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZBcnJheSwgMiApICk7XG5cblx0dGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xuXG5cdC8vIGZ1bmN0aW9uc1xuXG5cdGZ1bmN0aW9uIGFkZFNoYXBlKCBzaGFwZSApIHtcblxuXHRcdHZhciBwbGFjZWhvbGRlciA9IFtdO1xuXG5cdFx0Ly8gb3B0aW9uc1xuXG5cdFx0dmFyIGN1cnZlU2VnbWVudHMgPSBvcHRpb25zLmN1cnZlU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY3VydmVTZWdtZW50cyA6IDEyO1xuXHRcdHZhciBzdGVwcyA9IG9wdGlvbnMuc3RlcHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc3RlcHMgOiAxO1xuXHRcdHZhciBhbW91bnQgPSBvcHRpb25zLmFtb3VudCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5hbW91bnQgOiAxMDA7XG5cblx0XHR2YXIgYmV2ZWxFbmFibGVkID0gb3B0aW9ucy5iZXZlbEVuYWJsZWQgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxFbmFibGVkIDogdHJ1ZTtcblx0XHR2YXIgYmV2ZWxUaGlja25lc3MgPSBvcHRpb25zLmJldmVsVGhpY2tuZXNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsVGhpY2tuZXNzIDogNjtcblx0XHR2YXIgYmV2ZWxTaXplID0gb3B0aW9ucy5iZXZlbFNpemUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxTaXplIDogYmV2ZWxUaGlja25lc3MgLSAyO1xuXHRcdHZhciBiZXZlbFNlZ21lbnRzID0gb3B0aW9ucy5iZXZlbFNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsU2VnbWVudHMgOiAzO1xuXG5cdFx0dmFyIGV4dHJ1ZGVQYXRoID0gb3B0aW9ucy5leHRydWRlUGF0aDtcblxuXHRcdHZhciB1dmdlbiA9IG9wdGlvbnMuVVZHZW5lcmF0b3IgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuVVZHZW5lcmF0b3IgOiBXb3JsZFVWR2VuZXJhdG9yO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBleHRydWRlUHRzLCBleHRydWRlQnlQYXRoID0gZmFsc2U7XG5cdFx0dmFyIHNwbGluZVR1YmUsIGJpbm9ybWFsLCBub3JtYWwsIHBvc2l0aW9uMjtcblxuXHRcdGlmICggZXh0cnVkZVBhdGggKSB7XG5cblx0XHRcdGV4dHJ1ZGVQdHMgPSBleHRydWRlUGF0aC5nZXRTcGFjZWRQb2ludHMoIHN0ZXBzICk7XG5cblx0XHRcdGV4dHJ1ZGVCeVBhdGggPSB0cnVlO1xuXHRcdFx0YmV2ZWxFbmFibGVkID0gZmFsc2U7IC8vIGJldmVscyBub3Qgc3VwcG9ydGVkIGZvciBwYXRoIGV4dHJ1c2lvblxuXG5cdFx0XHQvLyBTRVRVUCBUTkIgdmFyaWFibGVzXG5cblx0XHRcdC8vIFRPRE8xIC0gaGF2ZSBhIC5pc0Nsb3NlZCBpbiBzcGxpbmU/XG5cblx0XHRcdHNwbGluZVR1YmUgPSBleHRydWRlUGF0aC5jb21wdXRlRnJlbmV0RnJhbWVzKCBzdGVwcywgZmFsc2UgKTtcblxuXHRcdFx0Ly8gY29uc29sZS5sb2coc3BsaW5lVHViZSwgJ3NwbGluZVR1YmUnLCBzcGxpbmVUdWJlLm5vcm1hbHMubGVuZ3RoLCAnc3RlcHMnLCBzdGVwcywgJ2V4dHJ1ZGVQdHMnLCBleHRydWRlUHRzLmxlbmd0aCk7XG5cblx0XHRcdGJpbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHRwb3NpdGlvbjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gU2FmZWd1YXJkcyBpZiBiZXZlbHMgYXJlIG5vdCBlbmFibGVkXG5cblx0XHRpZiAoICEgYmV2ZWxFbmFibGVkICkge1xuXG5cdFx0XHRiZXZlbFNlZ21lbnRzID0gMDtcblx0XHRcdGJldmVsVGhpY2tuZXNzID0gMDtcblx0XHRcdGJldmVsU2l6ZSA9IDA7XG5cblx0XHR9XG5cblx0XHQvLyBWYXJpYWJsZXMgaW5pdGlhbGl6YXRpb25cblxuXHRcdHZhciBhaG9sZSwgaCwgaGw7IC8vIGxvb3Bpbmcgb2YgaG9sZXNcblxuXHRcdHZhciBzaGFwZVBvaW50cyA9IHNoYXBlLmV4dHJhY3RQb2ludHMoIGN1cnZlU2VnbWVudHMgKTtcblxuXHRcdHZhciB2ZXJ0aWNlcyA9IHNoYXBlUG9pbnRzLnNoYXBlO1xuXHRcdHZhciBob2xlcyA9IHNoYXBlUG9pbnRzLmhvbGVzO1xuXG5cdFx0dmFyIHJldmVyc2UgPSAhIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIHZlcnRpY2VzICk7XG5cblx0XHRpZiAoIHJldmVyc2UgKSB7XG5cblx0XHRcdHZlcnRpY2VzID0gdmVydGljZXMucmV2ZXJzZSgpO1xuXG5cdFx0XHQvLyBNYXliZSB3ZSBzaG91bGQgYWxzbyBjaGVjayBpZiBob2xlcyBhcmUgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiwganVzdCB0byBiZSBzYWZlIC4uLlxuXG5cdFx0XHRmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0XHRhaG9sZSA9IGhvbGVzWyBoIF07XG5cblx0XHRcdFx0aWYgKCBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCBhaG9sZSApICkge1xuXG5cdFx0XHRcdFx0aG9sZXNbIGggXSA9IGFob2xlLnJldmVyc2UoKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXG5cdFx0dmFyIGZhY2VzID0gU2hhcGVVdGlscy50cmlhbmd1bGF0ZVNoYXBlKCB2ZXJ0aWNlcywgaG9sZXMgKTtcblxuXHRcdC8qIFZlcnRpY2VzICovXG5cblx0XHR2YXIgY29udG91ciA9IHZlcnRpY2VzOyAvLyB2ZXJ0aWNlcyBoYXMgYWxsIHBvaW50cyBidXQgY29udG91ciBoYXMgb25seSBwb2ludHMgb2YgY2lyY3VtZmVyZW5jZVxuXG5cdFx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdGFob2xlID0gaG9sZXNbIGggXTtcblxuXHRcdFx0dmVydGljZXMgPSB2ZXJ0aWNlcy5jb25jYXQoIGFob2xlICk7XG5cblx0XHR9XG5cblxuXHRcdGZ1bmN0aW9uIHNjYWxlUHQyKCBwdCwgdmVjLCBzaXplICkge1xuXG5cdFx0XHRpZiAoICEgdmVjICkgY29uc29sZS5lcnJvciggXCJUSFJFRS5FeHRydWRlR2VvbWV0cnk6IHZlYyBkb2VzIG5vdCBleGlzdFwiICk7XG5cblx0XHRcdHJldHVybiB2ZWMuY2xvbmUoKS5tdWx0aXBseVNjYWxhciggc2l6ZSApLmFkZCggcHQgKTtcblxuXHRcdH1cblxuXHRcdHZhciBiLCBicywgdCwgeixcblx0XHRcdHZlcnQsIHZsZW4gPSB2ZXJ0aWNlcy5sZW5ndGgsXG5cdFx0XHRmYWNlLCBmbGVuID0gZmFjZXMubGVuZ3RoO1xuXG5cblx0XHQvLyBGaW5kIGRpcmVjdGlvbnMgZm9yIHBvaW50IG1vdmVtZW50XG5cblxuXHRcdGZ1bmN0aW9uIGdldEJldmVsVmVjKCBpblB0LCBpblByZXYsIGluTmV4dCApIHtcblxuXHRcdFx0Ly8gY29tcHV0ZXMgZm9yIGluUHQgdGhlIGNvcnJlc3BvbmRpbmcgcG9pbnQgaW5QdCcgb24gYSBuZXcgY29udG91clxuXHRcdFx0Ly8gICBzaGlmdGVkIGJ5IDEgdW5pdCAobGVuZ3RoIG9mIG5vcm1hbGl6ZWQgdmVjdG9yKSB0byB0aGUgbGVmdFxuXHRcdFx0Ly8gaWYgd2Ugd2FsayBhbG9uZyBjb250b3VyIGNsb2Nrd2lzZSwgdGhpcyBuZXcgY29udG91ciBpcyBvdXRzaWRlIHRoZSBvbGQgb25lXG5cdFx0XHQvL1xuXHRcdFx0Ly8gaW5QdCcgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgdHdvIGxpbmVzIHBhcmFsbGVsIHRvIHRoZSB0d29cblx0XHRcdC8vICBhZGphY2VudCBlZGdlcyBvZiBpblB0IGF0IGEgZGlzdGFuY2Ugb2YgMSB1bml0IG9uIHRoZSBsZWZ0IHNpZGUuXG5cblx0XHRcdHZhciB2X3RyYW5zX3gsIHZfdHJhbnNfeSwgc2hyaW5rX2J5OyAvLyByZXN1bHRpbmcgdHJhbnNsYXRpb24gdmVjdG9yIGZvciBpblB0XG5cblx0XHRcdC8vIGdvb2QgcmVhZGluZyBmb3IgZ2VvbWV0cnkgYWxnb3JpdGhtcyAoaGVyZTogbGluZS1saW5lIGludGVyc2VjdGlvbilcblx0XHRcdC8vIGh0dHA6Ly9nZW9tYWxnb3JpdGhtcy5jb20vYTA1LV9pbnRlcnNlY3QtMS5odG1sXG5cblx0XHRcdHZhciB2X3ByZXZfeCA9IGluUHQueCAtIGluUHJldi54LFxuXHRcdFx0XHR2X3ByZXZfeSA9IGluUHQueSAtIGluUHJldi55O1xuXHRcdFx0dmFyIHZfbmV4dF94ID0gaW5OZXh0LnggLSBpblB0LngsXG5cdFx0XHRcdHZfbmV4dF95ID0gaW5OZXh0LnkgLSBpblB0Lnk7XG5cblx0XHRcdHZhciB2X3ByZXZfbGVuc3EgPSAoIHZfcHJldl94ICogdl9wcmV2X3ggKyB2X3ByZXZfeSAqIHZfcHJldl95ICk7XG5cblx0XHRcdC8vIGNoZWNrIGZvciBjb2xsaW5lYXIgZWRnZXNcblx0XHRcdHZhciBjb2xsaW5lYXIwID0gKCB2X3ByZXZfeCAqIHZfbmV4dF95IC0gdl9wcmV2X3kgKiB2X25leHRfeCApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBjb2xsaW5lYXIwICkgPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHQvLyBub3QgY29sbGluZWFyXG5cblx0XHRcdFx0Ly8gbGVuZ3RoIG9mIHZlY3RvcnMgZm9yIG5vcm1hbGl6aW5nXG5cblx0XHRcdFx0dmFyIHZfcHJldl9sZW4gPSBNYXRoLnNxcnQoIHZfcHJldl9sZW5zcSApO1xuXHRcdFx0XHR2YXIgdl9uZXh0X2xlbiA9IE1hdGguc3FydCggdl9uZXh0X3ggKiB2X25leHRfeCArIHZfbmV4dF95ICogdl9uZXh0X3kgKTtcblxuXHRcdFx0XHQvLyBzaGlmdCBhZGphY2VudCBwb2ludHMgYnkgdW5pdCB2ZWN0b3JzIHRvIHRoZSBsZWZ0XG5cblx0XHRcdFx0dmFyIHB0UHJldlNoaWZ0X3ggPSAoIGluUHJldi54IC0gdl9wcmV2X3kgLyB2X3ByZXZfbGVuICk7XG5cdFx0XHRcdHZhciBwdFByZXZTaGlmdF95ID0gKCBpblByZXYueSArIHZfcHJldl94IC8gdl9wcmV2X2xlbiApO1xuXG5cdFx0XHRcdHZhciBwdE5leHRTaGlmdF94ID0gKCBpbk5leHQueCAtIHZfbmV4dF95IC8gdl9uZXh0X2xlbiApO1xuXHRcdFx0XHR2YXIgcHROZXh0U2hpZnRfeSA9ICggaW5OZXh0LnkgKyB2X25leHRfeCAvIHZfbmV4dF9sZW4gKTtcblxuXHRcdFx0XHQvLyBzY2FsaW5nIGZhY3RvciBmb3Igdl9wcmV2IHRvIGludGVyc2VjdGlvbiBwb2ludFxuXG5cdFx0XHRcdHZhciBzZiA9ICggKCBwdE5leHRTaGlmdF94IC0gcHRQcmV2U2hpZnRfeCApICogdl9uZXh0X3kgLVxuXHRcdFx0XHRcdFx0KCBwdE5leHRTaGlmdF95IC0gcHRQcmV2U2hpZnRfeSApICogdl9uZXh0X3ggKSAvXG5cdFx0XHRcdFx0KCB2X3ByZXZfeCAqIHZfbmV4dF95IC0gdl9wcmV2X3kgKiB2X25leHRfeCApO1xuXG5cdFx0XHRcdC8vIHZlY3RvciBmcm9tIGluUHQgdG8gaW50ZXJzZWN0aW9uIHBvaW50XG5cblx0XHRcdFx0dl90cmFuc194ID0gKCBwdFByZXZTaGlmdF94ICsgdl9wcmV2X3ggKiBzZiAtIGluUHQueCApO1xuXHRcdFx0XHR2X3RyYW5zX3kgPSAoIHB0UHJldlNoaWZ0X3kgKyB2X3ByZXZfeSAqIHNmIC0gaW5QdC55ICk7XG5cblx0XHRcdFx0Ly8gRG9uJ3Qgbm9ybWFsaXplISwgb3RoZXJ3aXNlIHNoYXJwIGNvcm5lcnMgYmVjb21lIHVnbHlcblx0XHRcdFx0Ly8gIGJ1dCBwcmV2ZW50IGNyYXp5IHNwaWtlc1xuXHRcdFx0XHR2YXIgdl90cmFuc19sZW5zcSA9ICggdl90cmFuc194ICogdl90cmFuc194ICsgdl90cmFuc195ICogdl90cmFuc195ICk7XG5cdFx0XHRcdGlmICggdl90cmFuc19sZW5zcSA8PSAyICkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBWZWN0b3IyKCB2X3RyYW5zX3gsIHZfdHJhbnNfeSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRzaHJpbmtfYnkgPSBNYXRoLnNxcnQoIHZfdHJhbnNfbGVuc3EgLyAyICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgY29sbGluZWFyIGVkZ2VzXG5cblx0XHRcdFx0dmFyIGRpcmVjdGlvbl9lcSA9IGZhbHNlOyAvLyBhc3N1bWVzOiBvcHBvc2l0ZVxuXHRcdFx0XHRpZiAoIHZfcHJldl94ID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0XHRpZiAoIHZfbmV4dF94ID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0XHRcdGRpcmVjdGlvbl9lcSA9IHRydWU7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGlmICggdl9wcmV2X3ggPCAtIE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIHZfbmV4dF94IDwgLSBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRcdFx0XHRkaXJlY3Rpb25fZXEgPSB0cnVlO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRpZiAoIE1hdGguc2lnbiggdl9wcmV2X3kgKSA9PT0gTWF0aC5zaWduKCB2X25leHRfeSApICkge1xuXG5cdFx0XHRcdFx0XHRcdGRpcmVjdGlvbl9lcSA9IHRydWU7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBkaXJlY3Rpb25fZXEgKSB7XG5cblx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcIldhcm5pbmc6IGxpbmVzIGFyZSBhIHN0cmFpZ2h0IHNlcXVlbmNlXCIpO1xuXHRcdFx0XHRcdHZfdHJhbnNfeCA9IC0gdl9wcmV2X3k7XG5cdFx0XHRcdFx0dl90cmFuc195ID0gdl9wcmV2X3g7XG5cdFx0XHRcdFx0c2hyaW5rX2J5ID0gTWF0aC5zcXJ0KCB2X3ByZXZfbGVuc3EgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJXYXJuaW5nOiBsaW5lcyBhcmUgYSBzdHJhaWdodCBzcGlrZVwiKTtcblx0XHRcdFx0XHR2X3RyYW5zX3ggPSB2X3ByZXZfeDtcblx0XHRcdFx0XHR2X3RyYW5zX3kgPSB2X3ByZXZfeTtcblx0XHRcdFx0XHRzaHJpbmtfYnkgPSBNYXRoLnNxcnQoIHZfcHJldl9sZW5zcSAvIDIgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG5ldyBWZWN0b3IyKCB2X3RyYW5zX3ggLyBzaHJpbmtfYnksIHZfdHJhbnNfeSAvIHNocmlua19ieSApO1xuXG5cdFx0fVxuXG5cblx0XHR2YXIgY29udG91ck1vdmVtZW50cyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGNvbnRvdXIubGVuZ3RoLCBqID0gaWwgLSAxLCBrID0gaSArIDE7IGkgPCBpbDsgaSArKywgaiArKywgayArKyApIHtcblxuXHRcdFx0aWYgKCBqID09PSBpbCApIGogPSAwO1xuXHRcdFx0aWYgKCBrID09PSBpbCApIGsgPSAwO1xuXG5cdFx0XHQvLyAgKGopLS0tKGkpLS0tKGspXG5cdFx0XHQvLyBjb25zb2xlLmxvZygnaSxqLGsnLCBpLCBqICwgaylcblxuXHRcdFx0Y29udG91ck1vdmVtZW50c1sgaSBdID0gZ2V0QmV2ZWxWZWMoIGNvbnRvdXJbIGkgXSwgY29udG91clsgaiBdLCBjb250b3VyWyBrIF0gKTtcblxuXHRcdH1cblxuXHRcdHZhciBob2xlc01vdmVtZW50cyA9IFtdLFxuXHRcdFx0b25lSG9sZU1vdmVtZW50cywgdmVydGljZXNNb3ZlbWVudHMgPSBjb250b3VyTW92ZW1lbnRzLmNvbmNhdCgpO1xuXG5cdFx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdGFob2xlID0gaG9sZXNbIGggXTtcblxuXHRcdFx0b25lSG9sZU1vdmVtZW50cyA9IFtdO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgaWwgPSBhaG9sZS5sZW5ndGgsIGogPSBpbCAtIDEsIGsgPSBpICsgMTsgaSA8IGlsOyBpICsrLCBqICsrLCBrICsrICkge1xuXG5cdFx0XHRcdGlmICggaiA9PT0gaWwgKSBqID0gMDtcblx0XHRcdFx0aWYgKCBrID09PSBpbCApIGsgPSAwO1xuXG5cdFx0XHRcdC8vICAoaiktLS0oaSktLS0oaylcblx0XHRcdFx0b25lSG9sZU1vdmVtZW50c1sgaSBdID0gZ2V0QmV2ZWxWZWMoIGFob2xlWyBpIF0sIGFob2xlWyBqIF0sIGFob2xlWyBrIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRob2xlc01vdmVtZW50cy5wdXNoKCBvbmVIb2xlTW92ZW1lbnRzICk7XG5cdFx0XHR2ZXJ0aWNlc01vdmVtZW50cyA9IHZlcnRpY2VzTW92ZW1lbnRzLmNvbmNhdCggb25lSG9sZU1vdmVtZW50cyApO1xuXG5cdFx0fVxuXG5cblx0XHQvLyBMb29wIGJldmVsU2VnbWVudHMsIDEgZm9yIHRoZSBmcm9udCwgMSBmb3IgdGhlIGJhY2tcblxuXHRcdGZvciAoIGIgPSAwOyBiIDwgYmV2ZWxTZWdtZW50czsgYiArKyApIHtcblxuXHRcdFx0Ly9mb3IgKCBiID0gYmV2ZWxTZWdtZW50czsgYiA+IDA7IGIgLS0gKSB7XG5cblx0XHRcdHQgPSBiIC8gYmV2ZWxTZWdtZW50cztcblx0XHRcdHogPSBiZXZlbFRoaWNrbmVzcyAqIE1hdGguY29zKCB0ICogTWF0aC5QSSAvIDIgKTtcblx0XHRcdGJzID0gYmV2ZWxTaXplICogTWF0aC5zaW4oIHQgKiBNYXRoLlBJIC8gMiApO1xuXG5cdFx0XHQvLyBjb250cmFjdCBzaGFwZVxuXG5cdFx0XHRmb3IgKCBpID0gMCwgaWwgPSBjb250b3VyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdHZlcnQgPSBzY2FsZVB0MiggY29udG91clsgaSBdLCBjb250b3VyTW92ZW1lbnRzWyBpIF0sIGJzICk7XG5cblx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIC0geiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGV4cGFuZCBob2xlc1xuXG5cdFx0XHRmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0XHRhaG9sZSA9IGhvbGVzWyBoIF07XG5cdFx0XHRcdG9uZUhvbGVNb3ZlbWVudHMgPSBob2xlc01vdmVtZW50c1sgaCBdO1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwLCBpbCA9IGFob2xlLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmVydCA9IHNjYWxlUHQyKCBhaG9sZVsgaSBdLCBvbmVIb2xlTW92ZW1lbnRzWyBpIF0sIGJzICk7XG5cblx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgLSB6ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRicyA9IGJldmVsU2l6ZTtcblxuXHRcdC8vIEJhY2sgZmFjaW5nIHZlcnRpY2VzXG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IHZsZW47IGkgKysgKSB7XG5cblx0XHRcdHZlcnQgPSBiZXZlbEVuYWJsZWQgPyBzY2FsZVB0MiggdmVydGljZXNbIGkgXSwgdmVydGljZXNNb3ZlbWVudHNbIGkgXSwgYnMgKSA6IHZlcnRpY2VzWyBpIF07XG5cblx0XHRcdGlmICggISBleHRydWRlQnlQYXRoICkge1xuXG5cdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCAwICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gdiggdmVydC54LCB2ZXJ0LnkgKyBleHRydWRlUHRzWyAwIF0ueSwgZXh0cnVkZVB0c1sgMCBdLnggKTtcblxuXHRcdFx0XHRub3JtYWwuY29weSggc3BsaW5lVHViZS5ub3JtYWxzWyAwIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC54ICk7XG5cdFx0XHRcdGJpbm9ybWFsLmNvcHkoIHNwbGluZVR1YmUuYmlub3JtYWxzWyAwIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC55ICk7XG5cblx0XHRcdFx0cG9zaXRpb24yLmNvcHkoIGV4dHJ1ZGVQdHNbIDAgXSApLmFkZCggbm9ybWFsICkuYWRkKCBiaW5vcm1hbCApO1xuXG5cdFx0XHRcdHYoIHBvc2l0aW9uMi54LCBwb3NpdGlvbjIueSwgcG9zaXRpb24yLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHN0ZXBwZWQgdmVydGljZXMuLi5cblx0XHQvLyBJbmNsdWRpbmcgZnJvbnQgZmFjaW5nIHZlcnRpY2VzXG5cblx0XHR2YXIgcztcblxuXHRcdGZvciAoIHMgPSAxOyBzIDw9IHN0ZXBzOyBzICsrICkge1xuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IHZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0dmVydCA9IGJldmVsRW5hYmxlZCA/IHNjYWxlUHQyKCB2ZXJ0aWNlc1sgaSBdLCB2ZXJ0aWNlc01vdmVtZW50c1sgaSBdLCBicyApIDogdmVydGljZXNbIGkgXTtcblxuXHRcdFx0XHRpZiAoICEgZXh0cnVkZUJ5UGF0aCApIHtcblxuXHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCBhbW91bnQgLyBzdGVwcyAqIHMgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gdiggdmVydC54LCB2ZXJ0LnkgKyBleHRydWRlUHRzWyBzIC0gMSBdLnksIGV4dHJ1ZGVQdHNbIHMgLSAxIF0ueCApO1xuXG5cdFx0XHRcdFx0bm9ybWFsLmNvcHkoIHNwbGluZVR1YmUubm9ybWFsc1sgcyBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQueCApO1xuXHRcdFx0XHRcdGJpbm9ybWFsLmNvcHkoIHNwbGluZVR1YmUuYmlub3JtYWxzWyBzIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC55ICk7XG5cblx0XHRcdFx0XHRwb3NpdGlvbjIuY29weSggZXh0cnVkZVB0c1sgcyBdICkuYWRkKCBub3JtYWwgKS5hZGQoIGJpbm9ybWFsICk7XG5cblx0XHRcdFx0XHR2KCBwb3NpdGlvbjIueCwgcG9zaXRpb24yLnksIHBvc2l0aW9uMi56ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblxuXHRcdC8vIEFkZCBiZXZlbCBzZWdtZW50cyBwbGFuZXNcblxuXHRcdC8vZm9yICggYiA9IDE7IGIgPD0gYmV2ZWxTZWdtZW50czsgYiArKyApIHtcblx0XHRmb3IgKCBiID0gYmV2ZWxTZWdtZW50cyAtIDE7IGIgPj0gMDsgYiAtLSApIHtcblxuXHRcdFx0dCA9IGIgLyBiZXZlbFNlZ21lbnRzO1xuXHRcdFx0eiA9IGJldmVsVGhpY2tuZXNzICogTWF0aC5jb3MoIHQgKiBNYXRoLlBJIC8gMiApO1xuXHRcdFx0YnMgPSBiZXZlbFNpemUgKiBNYXRoLnNpbiggdCAqIE1hdGguUEkgLyAyICk7XG5cblx0XHRcdC8vIGNvbnRyYWN0IHNoYXBlXG5cblx0XHRcdGZvciAoIGkgPSAwLCBpbCA9IGNvbnRvdXIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmVydCA9IHNjYWxlUHQyKCBjb250b3VyWyBpIF0sIGNvbnRvdXJNb3ZlbWVudHNbIGkgXSwgYnMgKTtcblx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIGFtb3VudCArIHogKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBleHBhbmQgaG9sZXNcblxuXHRcdFx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdFx0YWhvbGUgPSBob2xlc1sgaCBdO1xuXHRcdFx0XHRvbmVIb2xlTW92ZW1lbnRzID0gaG9sZXNNb3ZlbWVudHNbIGggXTtcblxuXHRcdFx0XHRmb3IgKCBpID0gMCwgaWwgPSBhaG9sZS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZlcnQgPSBzY2FsZVB0MiggYWhvbGVbIGkgXSwgb25lSG9sZU1vdmVtZW50c1sgaSBdLCBicyApO1xuXG5cdFx0XHRcdFx0aWYgKCAhIGV4dHJ1ZGVCeVBhdGggKSB7XG5cblx0XHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCBhbW91bnQgKyB6ICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSArIGV4dHJ1ZGVQdHNbIHN0ZXBzIC0gMSBdLnksIGV4dHJ1ZGVQdHNbIHN0ZXBzIC0gMSBdLnggKyB6ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvKiBGYWNlcyAqL1xuXG5cdFx0Ly8gVG9wIGFuZCBib3R0b20gZmFjZXNcblxuXHRcdGJ1aWxkTGlkRmFjZXMoKTtcblxuXHRcdC8vIFNpZGVzIGZhY2VzXG5cblx0XHRidWlsZFNpZGVGYWNlcygpO1xuXG5cblx0XHQvLy8vLyAgSW50ZXJuYWwgZnVuY3Rpb25zXG5cblx0XHRmdW5jdGlvbiBidWlsZExpZEZhY2VzKCkge1xuXG5cdFx0XHR2YXIgc3RhcnQgPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7XG5cblx0XHRcdGlmICggYmV2ZWxFbmFibGVkICkge1xuXG5cdFx0XHRcdHZhciBsYXllciA9IDA7IC8vIHN0ZXBzICsgMVxuXHRcdFx0XHR2YXIgb2Zmc2V0ID0gdmxlbiAqIGxheWVyO1xuXG5cdFx0XHRcdC8vIEJvdHRvbSBmYWNlc1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHtcblxuXHRcdFx0XHRcdGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRcdGYzKCBmYWNlWyAyIF0gKyBvZmZzZXQsIGZhY2VbIDEgXSArIG9mZnNldCwgZmFjZVsgMCBdICsgb2Zmc2V0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxheWVyID0gc3RlcHMgKyBiZXZlbFNlZ21lbnRzICogMjtcblx0XHRcdFx0b2Zmc2V0ID0gdmxlbiAqIGxheWVyO1xuXG5cdFx0XHRcdC8vIFRvcCBmYWNlc1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHtcblxuXHRcdFx0XHRcdGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRcdGYzKCBmYWNlWyAwIF0gKyBvZmZzZXQsIGZhY2VbIDEgXSArIG9mZnNldCwgZmFjZVsgMiBdICsgb2Zmc2V0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIEJvdHRvbSBmYWNlc1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHtcblxuXHRcdFx0XHRcdGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRcdGYzKCBmYWNlWyAyIF0sIGZhY2VbIDEgXSwgZmFjZVsgMCBdICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRvcCBmYWNlc1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHtcblxuXHRcdFx0XHRcdGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRcdGYzKCBmYWNlWyAwIF0gKyB2bGVuICogc3RlcHMsIGZhY2VbIDEgXSArIHZsZW4gKiBzdGVwcywgZmFjZVsgMiBdICsgdmxlbiAqIHN0ZXBzICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHNjb3BlLmFkZEdyb3VwKCBzdGFydCwgdmVydGljZXNBcnJheS5sZW5ndGggLyAzIC0gc3RhcnQsIDAgKTtcblxuXHRcdH1cblxuXHRcdC8vIENyZWF0ZSBmYWNlcyBmb3IgdGhlIHotc2lkZXMgb2YgdGhlIHNoYXBlXG5cblx0XHRmdW5jdGlvbiBidWlsZFNpZGVGYWNlcygpIHtcblxuXHRcdFx0dmFyIHN0YXJ0ID0gdmVydGljZXNBcnJheS5sZW5ndGggLyAzO1xuXHRcdFx0dmFyIGxheWVyb2Zmc2V0ID0gMDtcblx0XHRcdHNpZGV3YWxscyggY29udG91ciwgbGF5ZXJvZmZzZXQgKTtcblx0XHRcdGxheWVyb2Zmc2V0ICs9IGNvbnRvdXIubGVuZ3RoO1xuXG5cdFx0XHRmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0XHRhaG9sZSA9IGhvbGVzWyBoIF07XG5cdFx0XHRcdHNpZGV3YWxscyggYWhvbGUsIGxheWVyb2Zmc2V0ICk7XG5cblx0XHRcdFx0Ly8sIHRydWVcblx0XHRcdFx0bGF5ZXJvZmZzZXQgKz0gYWhvbGUubGVuZ3RoO1xuXG5cdFx0XHR9XG5cblxuXHRcdFx0c2NvcGUuYWRkR3JvdXAoIHN0YXJ0LCB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDMgLSBzdGFydCwgMSApO1xuXG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBzaWRld2FsbHMoIGNvbnRvdXIsIGxheWVyb2Zmc2V0ICkge1xuXG5cdFx0XHR2YXIgaiwgaztcblx0XHRcdGkgPSBjb250b3VyLmxlbmd0aDtcblxuXHRcdFx0d2hpbGUgKCAtLSBpID49IDAgKSB7XG5cblx0XHRcdFx0aiA9IGk7XG5cdFx0XHRcdGsgPSBpIC0gMTtcblx0XHRcdFx0aWYgKCBrIDwgMCApIGsgPSBjb250b3VyLmxlbmd0aCAtIDE7XG5cblx0XHRcdFx0Ly9jb25zb2xlLmxvZygnYicsIGksaiwgaS0xLCBrLHZlcnRpY2VzLmxlbmd0aCk7XG5cblx0XHRcdFx0dmFyIHMgPSAwLFxuXHRcdFx0XHRcdHNsID0gc3RlcHMgKyBiZXZlbFNlZ21lbnRzICogMjtcblxuXHRcdFx0XHRmb3IgKCBzID0gMDsgcyA8IHNsOyBzICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIHNsZW4xID0gdmxlbiAqIHM7XG5cdFx0XHRcdFx0dmFyIHNsZW4yID0gdmxlbiAqICggcyArIDEgKTtcblxuXHRcdFx0XHRcdHZhciBhID0gbGF5ZXJvZmZzZXQgKyBqICsgc2xlbjEsXG5cdFx0XHRcdFx0XHRiID0gbGF5ZXJvZmZzZXQgKyBrICsgc2xlbjEsXG5cdFx0XHRcdFx0XHRjID0gbGF5ZXJvZmZzZXQgKyBrICsgc2xlbjIsXG5cdFx0XHRcdFx0XHRkID0gbGF5ZXJvZmZzZXQgKyBqICsgc2xlbjI7XG5cblx0XHRcdFx0XHRmNCggYSwgYiwgYywgZCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gdiggeCwgeSwgeiApIHtcblxuXHRcdFx0cGxhY2Vob2xkZXIucHVzaCggeCApO1xuXHRcdFx0cGxhY2Vob2xkZXIucHVzaCggeSApO1xuXHRcdFx0cGxhY2Vob2xkZXIucHVzaCggeiApO1xuXG5cdFx0fVxuXG5cblx0XHRmdW5jdGlvbiBmMyggYSwgYiwgYyApIHtcblxuXHRcdFx0YWRkVmVydGV4KCBhICk7XG5cdFx0XHRhZGRWZXJ0ZXgoIGIgKTtcblx0XHRcdGFkZFZlcnRleCggYyApO1xuXG5cdFx0XHR2YXIgbmV4dEluZGV4ID0gdmVydGljZXNBcnJheS5sZW5ndGggLyAzO1xuXHRcdFx0dmFyIHV2cyA9IHV2Z2VuLmdlbmVyYXRlVG9wVVYoIHNjb3BlLCB2ZXJ0aWNlc0FycmF5LCBuZXh0SW5kZXggLSAzLCBuZXh0SW5kZXggLSAyLCBuZXh0SW5kZXggLSAxICk7XG5cblx0XHRcdGFkZFVWKCB1dnNbIDAgXSApO1xuXHRcdFx0YWRkVVYoIHV2c1sgMSBdICk7XG5cdFx0XHRhZGRVViggdXZzWyAyIF0gKTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGY0KCBhLCBiLCBjLCBkICkge1xuXG5cdFx0XHRhZGRWZXJ0ZXgoIGEgKTtcblx0XHRcdGFkZFZlcnRleCggYiApO1xuXHRcdFx0YWRkVmVydGV4KCBkICk7XG5cblx0XHRcdGFkZFZlcnRleCggYiApO1xuXHRcdFx0YWRkVmVydGV4KCBjICk7XG5cdFx0XHRhZGRWZXJ0ZXgoIGQgKTtcblxuXG5cdFx0XHR2YXIgbmV4dEluZGV4ID0gdmVydGljZXNBcnJheS5sZW5ndGggLyAzO1xuXHRcdFx0dmFyIHV2cyA9IHV2Z2VuLmdlbmVyYXRlU2lkZVdhbGxVViggc2NvcGUsIHZlcnRpY2VzQXJyYXksIG5leHRJbmRleCAtIDYsIG5leHRJbmRleCAtIDMsIG5leHRJbmRleCAtIDIsIG5leHRJbmRleCAtIDEgKTtcblxuXHRcdFx0YWRkVVYoIHV2c1sgMCBdICk7XG5cdFx0XHRhZGRVViggdXZzWyAxIF0gKTtcblx0XHRcdGFkZFVWKCB1dnNbIDMgXSApO1xuXG5cdFx0XHRhZGRVViggdXZzWyAxIF0gKTtcblx0XHRcdGFkZFVWKCB1dnNbIDIgXSApO1xuXHRcdFx0YWRkVVYoIHV2c1sgMyBdICk7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBhZGRWZXJ0ZXgoIGluZGV4ICkge1xuXG5cdFx0XHR2ZXJ0aWNlc0FycmF5LnB1c2goIHBsYWNlaG9sZGVyWyBpbmRleCAqIDMgKyAwIF0gKTtcblx0XHRcdHZlcnRpY2VzQXJyYXkucHVzaCggcGxhY2Vob2xkZXJbIGluZGV4ICogMyArIDEgXSApO1xuXHRcdFx0dmVydGljZXNBcnJheS5wdXNoKCBwbGFjZWhvbGRlclsgaW5kZXggKiAzICsgMiBdICk7XG5cblx0XHR9XG5cblxuXHRcdGZ1bmN0aW9uIGFkZFVWKCB2ZWN0b3IyICkge1xuXG5cdFx0XHR1dkFycmF5LnB1c2goIHZlY3RvcjIueCApO1xuXHRcdFx0dXZBcnJheS5wdXNoKCB2ZWN0b3IyLnkgKTtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTtcblxudmFyIFdvcmxkVVZHZW5lcmF0b3IgPSB7XG5cblx0Z2VuZXJhdGVUb3BVVjogZnVuY3Rpb24gKCBnZW9tZXRyeSwgdmVydGljZXMsIGluZGV4QSwgaW5kZXhCLCBpbmRleEMgKSB7XG5cblx0XHR2YXIgYV94ID0gdmVydGljZXNbIGluZGV4QSAqIDMgXTtcblx0XHR2YXIgYV95ID0gdmVydGljZXNbIGluZGV4QSAqIDMgKyAxIF07XG5cdFx0dmFyIGJfeCA9IHZlcnRpY2VzWyBpbmRleEIgKiAzIF07XG5cdFx0dmFyIGJfeSA9IHZlcnRpY2VzWyBpbmRleEIgKiAzICsgMSBdO1xuXHRcdHZhciBjX3ggPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyBdO1xuXHRcdHZhciBjX3kgPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyArIDEgXTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHRuZXcgVmVjdG9yMiggYV94LCBhX3kgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBiX3gsIGJfeSApLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGNfeCwgY195IClcblx0XHRdO1xuXG5cdH0sXG5cblx0Z2VuZXJhdGVTaWRlV2FsbFVWOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCB2ZXJ0aWNlcywgaW5kZXhBLCBpbmRleEIsIGluZGV4QywgaW5kZXhEICkge1xuXG5cdFx0dmFyIGFfeCA9IHZlcnRpY2VzWyBpbmRleEEgKiAzIF07XG5cdFx0dmFyIGFfeSA9IHZlcnRpY2VzWyBpbmRleEEgKiAzICsgMSBdO1xuXHRcdHZhciBhX3ogPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyArIDIgXTtcblx0XHR2YXIgYl94ID0gdmVydGljZXNbIGluZGV4QiAqIDMgXTtcblx0XHR2YXIgYl95ID0gdmVydGljZXNbIGluZGV4QiAqIDMgKyAxIF07XG5cdFx0dmFyIGJfeiA9IHZlcnRpY2VzWyBpbmRleEIgKiAzICsgMiBdO1xuXHRcdHZhciBjX3ggPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyBdO1xuXHRcdHZhciBjX3kgPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyArIDEgXTtcblx0XHR2YXIgY196ID0gdmVydGljZXNbIGluZGV4QyAqIDMgKyAyIF07XG5cdFx0dmFyIGRfeCA9IHZlcnRpY2VzWyBpbmRleEQgKiAzIF07XG5cdFx0dmFyIGRfeSA9IHZlcnRpY2VzWyBpbmRleEQgKiAzICsgMSBdO1xuXHRcdHZhciBkX3ogPSB2ZXJ0aWNlc1sgaW5kZXhEICogMyArIDIgXTtcblxuXHRcdGlmICggTWF0aC5hYnMoIGFfeSAtIGJfeSApIDwgMC4wMSApIHtcblxuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGFfeCwgMSAtIGFfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggYl94LCAxIC0gYl96ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBjX3gsIDEgLSBjX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGRfeCwgMSAtIGRfeiApXG5cdFx0XHRdO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGFfeSwgMSAtIGFfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggYl95LCAxIC0gYl96ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBjX3ksIDEgLSBjX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGRfeSwgMSAtIGRfeiApXG5cdFx0XHRdO1xuXG5cdFx0fVxuXG5cdH1cbn07XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBUZXh0ID0gM0QgVGV4dFxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgZm9udDogPFRIUkVFLkZvbnQ+LCAvLyBmb250XG4gKlxuICogIHNpemU6IDxmbG9hdD4sIC8vIHNpemUgb2YgdGhlIHRleHRcbiAqICBoZWlnaHQ6IDxmbG9hdD4sIC8vIHRoaWNrbmVzcyB0byBleHRydWRlIHRleHRcbiAqICBjdXJ2ZVNlZ21lbnRzOiA8aW50PiwgLy8gbnVtYmVyIG9mIHBvaW50cyBvbiB0aGUgY3VydmVzXG4gKlxuICogIGJldmVsRW5hYmxlZDogPGJvb2w+LCAvLyB0dXJuIG9uIGJldmVsXG4gKiAgYmV2ZWxUaGlja25lc3M6IDxmbG9hdD4sIC8vIGhvdyBkZWVwIGludG8gdGV4dCBiZXZlbCBnb2VzXG4gKiAgYmV2ZWxTaXplOiA8ZmxvYXQ+IC8vIGhvdyBmYXIgZnJvbSB0ZXh0IG91dGxpbmUgaXMgYmV2ZWxcbiAqIH1cbiAqL1xuXG4vLyBUZXh0R2VvbWV0cnlcblxuZnVuY3Rpb24gVGV4dEdlb21ldHJ5KCB0ZXh0LCBwYXJhbWV0ZXJzICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVGV4dEdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0dGV4dDogdGV4dCxcblx0XHRwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBUZXh0QnVmZmVyR2VvbWV0cnkoIHRleHQsIHBhcmFtZXRlcnMgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5UZXh0R2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5UZXh0R2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVGV4dEdlb21ldHJ5O1xuXG4vLyBUZXh0QnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gVGV4dEJ1ZmZlckdlb21ldHJ5KCB0ZXh0LCBwYXJhbWV0ZXJzICkge1xuXG5cdHBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdHZhciBmb250ID0gcGFyYW1ldGVycy5mb250O1xuXG5cdGlmICggISAoIGZvbnQgJiYgZm9udC5pc0ZvbnQgKSApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5UZXh0R2VvbWV0cnk6IGZvbnQgcGFyYW1ldGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5Gb250LicgKTtcblx0XHRyZXR1cm4gbmV3IEdlb21ldHJ5KCk7XG5cblx0fVxuXG5cdHZhciBzaGFwZXMgPSBmb250LmdlbmVyYXRlU2hhcGVzKCB0ZXh0LCBwYXJhbWV0ZXJzLnNpemUsIHBhcmFtZXRlcnMuY3VydmVTZWdtZW50cyApO1xuXG5cdC8vIHRyYW5zbGF0ZSBwYXJhbWV0ZXJzIHRvIEV4dHJ1ZGVHZW9tZXRyeSBBUElcblxuXHRwYXJhbWV0ZXJzLmFtb3VudCA9IHBhcmFtZXRlcnMuaGVpZ2h0ICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmhlaWdodCA6IDUwO1xuXG5cdC8vIGRlZmF1bHRzXG5cblx0aWYgKCBwYXJhbWV0ZXJzLmJldmVsVGhpY2tuZXNzID09PSB1bmRlZmluZWQgKSBwYXJhbWV0ZXJzLmJldmVsVGhpY2tuZXNzID0gMTA7XG5cdGlmICggcGFyYW1ldGVycy5iZXZlbFNpemUgPT09IHVuZGVmaW5lZCApIHBhcmFtZXRlcnMuYmV2ZWxTaXplID0gODtcblx0aWYgKCBwYXJhbWV0ZXJzLmJldmVsRW5hYmxlZCA9PT0gdW5kZWZpbmVkICkgcGFyYW1ldGVycy5iZXZlbEVuYWJsZWQgPSBmYWxzZTtcblxuXHRFeHRydWRlQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgc2hhcGVzLCBwYXJhbWV0ZXJzICk7XG5cblx0dGhpcy50eXBlID0gJ1RleHRCdWZmZXJHZW9tZXRyeSc7XG5cbn1cblxuVGV4dEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRleHRCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXh0QnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtc1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBTcGhlcmVHZW9tZXRyeVxuXG5mdW5jdGlvbiBTcGhlcmVHZW9tZXRyeSggcmFkaXVzLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTcGhlcmVHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdHBoaVN0YXJ0OiBwaGlTdGFydCxcblx0XHRwaGlMZW5ndGg6IHBoaUxlbmd0aCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgU3BoZXJlQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGgsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuU3BoZXJlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5TcGhlcmVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcGhlcmVHZW9tZXRyeTtcblxuLy8gU3BoZXJlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gU3BoZXJlQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGgsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU3BoZXJlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRwaGlTdGFydDogcGhpU3RhcnQsXG5cdFx0cGhpTGVuZ3RoOiBwaGlMZW5ndGgsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTtcblxuXHR3aWR0aFNlZ21lbnRzID0gTWF0aC5tYXgoIDMsIE1hdGguZmxvb3IoIHdpZHRoU2VnbWVudHMgKSB8fCA4ICk7XG5cdGhlaWdodFNlZ21lbnRzID0gTWF0aC5tYXgoIDIsIE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICkgfHwgNiApO1xuXG5cdHBoaVN0YXJ0ID0gcGhpU3RhcnQgIT09IHVuZGVmaW5lZCA/IHBoaVN0YXJ0IDogMDtcblx0cGhpTGVuZ3RoID0gcGhpTGVuZ3RoICE9PSB1bmRlZmluZWQgPyBwaGlMZW5ndGggOiBNYXRoLlBJICogMjtcblxuXHR0aGV0YVN0YXJ0ID0gdGhldGFTdGFydCAhPT0gdW5kZWZpbmVkID8gdGhldGFTdGFydCA6IDA7XG5cdHRoZXRhTGVuZ3RoID0gdGhldGFMZW5ndGggIT09IHVuZGVmaW5lZCA/IHRoZXRhTGVuZ3RoIDogTWF0aC5QSTtcblxuXHR2YXIgdGhldGFFbmQgPSB0aGV0YVN0YXJ0ICsgdGhldGFMZW5ndGg7XG5cblx0dmFyIGl4LCBpeTtcblxuXHR2YXIgaW5kZXggPSAwO1xuXHR2YXIgZ3JpZCA9IFtdO1xuXG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0Zm9yICggaXkgPSAwOyBpeSA8PSBoZWlnaHRTZWdtZW50czsgaXkgKysgKSB7XG5cblx0XHR2YXIgdmVydGljZXNSb3cgPSBbXTtcblxuXHRcdHZhciB2ID0gaXkgLyBoZWlnaHRTZWdtZW50cztcblxuXHRcdGZvciAoIGl4ID0gMDsgaXggPD0gd2lkdGhTZWdtZW50czsgaXggKysgKSB7XG5cblx0XHRcdHZhciB1ID0gaXggLyB3aWR0aFNlZ21lbnRzO1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGV4LnggPSAtIHJhZGl1cyAqIE1hdGguY29zKCBwaGlTdGFydCArIHUgKiBwaGlMZW5ndGggKSAqIE1hdGguc2luKCB0aGV0YVN0YXJ0ICsgdiAqIHRoZXRhTGVuZ3RoICk7XG5cdFx0XHR2ZXJ0ZXgueSA9IHJhZGl1cyAqIE1hdGguY29zKCB0aGV0YVN0YXJ0ICsgdiAqIHRoZXRhTGVuZ3RoICk7XG5cdFx0XHR2ZXJ0ZXgueiA9IHJhZGl1cyAqIE1hdGguc2luKCBwaGlTdGFydCArIHUgKiBwaGlMZW5ndGggKSAqIE1hdGguc2luKCB0aGV0YVN0YXJ0ICsgdiAqIHRoZXRhTGVuZ3RoICk7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdG5vcm1hbC5zZXQoIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKS5ub3JtYWxpemUoKTtcblx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1dnMucHVzaCggdSwgMSAtIHYgKTtcblxuXHRcdFx0dmVydGljZXNSb3cucHVzaCggaW5kZXggKysgKTtcblxuXHRcdH1cblxuXHRcdGdyaWQucHVzaCggdmVydGljZXNSb3cgKTtcblxuXHR9XG5cblx0Ly8gaW5kaWNlc1xuXG5cdGZvciAoIGl5ID0gMDsgaXkgPCBoZWlnaHRTZWdtZW50czsgaXkgKysgKSB7XG5cblx0XHRmb3IgKCBpeCA9IDA7IGl4IDwgd2lkdGhTZWdtZW50czsgaXggKysgKSB7XG5cblx0XHRcdHZhciBhID0gZ3JpZFsgaXkgXVsgaXggKyAxIF07XG5cdFx0XHR2YXIgYiA9IGdyaWRbIGl5IF1bIGl4IF07XG5cdFx0XHR2YXIgYyA9IGdyaWRbIGl5ICsgMSBdWyBpeCBdO1xuXHRcdFx0dmFyIGQgPSBncmlkWyBpeSArIDEgXVsgaXggKyAxIF07XG5cblx0XHRcdGlmICggaXkgIT09IDAgfHwgdGhldGFTdGFydCA+IDAgKSBpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdGlmICggaXkgIT09IGhlaWdodFNlZ21lbnRzIC0gMSB8fCB0aGV0YUVuZCA8IE1hdGguUEkgKSBpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG59XG5cblNwaGVyZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuU3BoZXJlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3BoZXJlQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBLYWxlYiBNdXJwaHlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gUmluZ0dlb21ldHJ5XG5cbmZ1bmN0aW9uIFJpbmdHZW9tZXRyeSggaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCB0aGV0YVNlZ21lbnRzLCBwaGlTZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdSaW5nR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRpbm5lclJhZGl1czogaW5uZXJSYWRpdXMsXG5cdFx0b3V0ZXJSYWRpdXM6IG91dGVyUmFkaXVzLFxuXHRcdHRoZXRhU2VnbWVudHM6IHRoZXRhU2VnbWVudHMsXG5cdFx0cGhpU2VnbWVudHM6IHBoaVNlZ21lbnRzLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBSaW5nQnVmZmVyR2VvbWV0cnkoIGlubmVyUmFkaXVzLCBvdXRlclJhZGl1cywgdGhldGFTZWdtZW50cywgcGhpU2VnbWVudHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuUmluZ0dlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuUmluZ0dlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJpbmdHZW9tZXRyeTtcblxuLy8gUmluZ0J1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFJpbmdCdWZmZXJHZW9tZXRyeSggaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCB0aGV0YVNlZ21lbnRzLCBwaGlTZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdSaW5nQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRpbm5lclJhZGl1czogaW5uZXJSYWRpdXMsXG5cdFx0b3V0ZXJSYWRpdXM6IG91dGVyUmFkaXVzLFxuXHRcdHRoZXRhU2VnbWVudHM6IHRoZXRhU2VnbWVudHMsXG5cdFx0cGhpU2VnbWVudHM6IHBoaVNlZ21lbnRzLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0aW5uZXJSYWRpdXMgPSBpbm5lclJhZGl1cyB8fCAwLjU7XG5cdG91dGVyUmFkaXVzID0gb3V0ZXJSYWRpdXMgfHwgMTtcblxuXHR0aGV0YVN0YXJ0ID0gdGhldGFTdGFydCAhPT0gdW5kZWZpbmVkID8gdGhldGFTdGFydCA6IDA7XG5cdHRoZXRhTGVuZ3RoID0gdGhldGFMZW5ndGggIT09IHVuZGVmaW5lZCA/IHRoZXRhTGVuZ3RoIDogTWF0aC5QSSAqIDI7XG5cblx0dGhldGFTZWdtZW50cyA9IHRoZXRhU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IE1hdGgubWF4KCAzLCB0aGV0YVNlZ21lbnRzICkgOiA4O1xuXHRwaGlTZWdtZW50cyA9IHBoaVNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBNYXRoLm1heCggMSwgcGhpU2VnbWVudHMgKSA6IDE7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gc29tZSBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIHNlZ21lbnQ7XG5cdHZhciByYWRpdXMgPSBpbm5lclJhZGl1cztcblx0dmFyIHJhZGl1c1N0ZXAgPSAoICggb3V0ZXJSYWRpdXMgLSBpbm5lclJhZGl1cyApIC8gcGhpU2VnbWVudHMgKTtcblx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB1diA9IG5ldyBWZWN0b3IyKCk7XG5cdHZhciBqLCBpO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRmb3IgKCBqID0gMDsgaiA8PSBwaGlTZWdtZW50czsgaiArKyApIHtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDw9IHRoZXRhU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdC8vIHZhbHVlcyBhcmUgZ2VuZXJhdGUgZnJvbSB0aGUgaW5zaWRlIG9mIHRoZSByaW5nIHRvIHRoZSBvdXRzaWRlXG5cblx0XHRcdHNlZ21lbnQgPSB0aGV0YVN0YXJ0ICsgaSAvIHRoZXRhU2VnbWVudHMgKiB0aGV0YUxlbmd0aDtcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRleC54ID0gcmFkaXVzICogTWF0aC5jb3MoIHNlZ21lbnQgKTtcblx0XHRcdHZlcnRleC55ID0gcmFkaXVzICogTWF0aC5zaW4oIHNlZ21lbnQgKTtcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2LnggPSAoIHZlcnRleC54IC8gb3V0ZXJSYWRpdXMgKyAxICkgLyAyO1xuXHRcdFx0dXYueSA9ICggdmVydGV4LnkgLyBvdXRlclJhZGl1cyArIDEgKSAvIDI7XG5cblx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0XHR9XG5cblx0XHQvLyBpbmNyZWFzZSB0aGUgcmFkaXVzIGZvciBuZXh0IHJvdyBvZiB2ZXJ0aWNlc1xuXG5cdFx0cmFkaXVzICs9IHJhZGl1c1N0ZXA7XG5cblx0fVxuXG5cdC8vIGluZGljZXNcblxuXHRmb3IgKCBqID0gMDsgaiA8IHBoaVNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0dmFyIHRoZXRhU2VnbWVudExldmVsID0gaiAqICggdGhldGFTZWdtZW50cyArIDEgKTtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgdGhldGFTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0c2VnbWVudCA9IGkgKyB0aGV0YVNlZ21lbnRMZXZlbDtcblxuXHRcdFx0dmFyIGEgPSBzZWdtZW50O1xuXHRcdFx0dmFyIGIgPSBzZWdtZW50ICsgdGhldGFTZWdtZW50cyArIDE7XG5cdFx0XHR2YXIgYyA9IHNlZ21lbnQgKyB0aGV0YVNlZ21lbnRzICsgMjtcblx0XHRcdHZhciBkID0gc2VnbWVudCArIDE7XG5cblx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5SaW5nQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5SaW5nQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmluZ0J1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgYXN0cm9kdWQgLyBodHRwOi8vYXN0cm9kdWQuaXNncmVhdC5vcmcvXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwczovL2dpdGh1Yi5jb20veno4NVxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBMYXRoZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIExhdGhlR2VvbWV0cnkoIHBvaW50cywgc2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMYXRoZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cG9pbnRzOiBwb2ludHMsXG5cdFx0c2VnbWVudHM6IHNlZ21lbnRzLFxuXHRcdHBoaVN0YXJ0OiBwaGlTdGFydCxcblx0XHRwaGlMZW5ndGg6IHBoaUxlbmd0aFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgTGF0aGVCdWZmZXJHZW9tZXRyeSggcG9pbnRzLCBzZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbkxhdGhlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5MYXRoZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExhdGhlR2VvbWV0cnk7XG5cbi8vIExhdGhlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gTGF0aGVCdWZmZXJHZW9tZXRyeSggcG9pbnRzLCBzZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xhdGhlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRwb2ludHM6IHBvaW50cyxcblx0XHRzZWdtZW50czogc2VnbWVudHMsXG5cdFx0cGhpU3RhcnQ6IHBoaVN0YXJ0LFxuXHRcdHBoaUxlbmd0aDogcGhpTGVuZ3RoXG5cdH07XG5cblx0c2VnbWVudHMgPSBNYXRoLmZsb29yKCBzZWdtZW50cyApIHx8IDEyO1xuXHRwaGlTdGFydCA9IHBoaVN0YXJ0IHx8IDA7XG5cdHBoaUxlbmd0aCA9IHBoaUxlbmd0aCB8fCBNYXRoLlBJICogMjtcblxuXHQvLyBjbGFtcCBwaGlMZW5ndGggc28gaXQncyBpbiByYW5nZSBvZiBbIDAsIDJQSSBdXG5cblx0cGhpTGVuZ3RoID0gX01hdGguY2xhbXAoIHBoaUxlbmd0aCwgMCwgTWF0aC5QSSAqIDIgKTtcblxuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgYmFzZTtcblx0dmFyIGludmVyc2VTZWdtZW50cyA9IDEuMCAvIHNlZ21lbnRzO1xuXHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHV2ID0gbmV3IFZlY3RvcjIoKTtcblx0dmFyIGksIGo7XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMgYW5kIHV2c1xuXG5cdGZvciAoIGkgPSAwOyBpIDw9IHNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0dmFyIHBoaSA9IHBoaVN0YXJ0ICsgaSAqIGludmVyc2VTZWdtZW50cyAqIHBoaUxlbmd0aDtcblxuXHRcdHZhciBzaW4gPSBNYXRoLnNpbiggcGhpICk7XG5cdFx0dmFyIGNvcyA9IE1hdGguY29zKCBwaGkgKTtcblxuXHRcdGZvciAoIGogPSAwOyBqIDw9ICggcG9pbnRzLmxlbmd0aCAtIDEgKTsgaiArKyApIHtcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRleC54ID0gcG9pbnRzWyBqIF0ueCAqIHNpbjtcblx0XHRcdHZlcnRleC55ID0gcG9pbnRzWyBqIF0ueTtcblx0XHRcdHZlcnRleC56ID0gcG9pbnRzWyBqIF0ueCAqIGNvcztcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1di54ID0gaSAvIHNlZ21lbnRzO1xuXHRcdFx0dXYueSA9IGogLyAoIHBvaW50cy5sZW5ndGggLSAxICk7XG5cblx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gaW5kaWNlc1xuXG5cdGZvciAoIGkgPSAwOyBpIDwgc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8ICggcG9pbnRzLmxlbmd0aCAtIDEgKTsgaiArKyApIHtcblxuXHRcdFx0YmFzZSA9IGogKyBpICogcG9pbnRzLmxlbmd0aDtcblxuXHRcdFx0dmFyIGEgPSBiYXNlO1xuXHRcdFx0dmFyIGIgPSBiYXNlICsgcG9pbnRzLmxlbmd0aDtcblx0XHRcdHZhciBjID0gYmFzZSArIHBvaW50cy5sZW5ndGggKyAxO1xuXHRcdFx0dmFyIGQgPSBiYXNlICsgMTtcblxuXHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0Ly8gZ2VuZXJhdGUgbm9ybWFsc1xuXG5cdHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcblxuXHQvLyBpZiB0aGUgZ2VvbWV0cnkgaXMgY2xvc2VkLCB3ZSBuZWVkIHRvIGF2ZXJhZ2UgdGhlIG5vcm1hbHMgYWxvbmcgdGhlIHNlYW0uXG5cdC8vIGJlY2F1c2UgdGhlIGNvcnJlc3BvbmRpbmcgdmVydGljZXMgYXJlIGlkZW50aWNhbCAoYnV0IHN0aWxsIGhhdmUgZGlmZmVyZW50IFVWcykuXG5cblx0aWYgKCBwaGlMZW5ndGggPT09IE1hdGguUEkgKiAyICkge1xuXG5cdFx0dmFyIG5vcm1hbHMgPSB0aGlzLmF0dHJpYnV0ZXMubm9ybWFsLmFycmF5O1xuXHRcdHZhciBuMSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIG4yID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHQvLyB0aGlzIGlzIHRoZSBidWZmZXIgb2Zmc2V0IGZvciB0aGUgbGFzdCBsaW5lIG9mIHZlcnRpY2VzXG5cblx0XHRiYXNlID0gc2VnbWVudHMgKiBwb2ludHMubGVuZ3RoICogMztcblxuXHRcdGZvciAoIGkgPSAwLCBqID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkgKyssIGogKz0gMyApIHtcblxuXHRcdFx0Ly8gc2VsZWN0IHRoZSBub3JtYWwgb2YgdGhlIHZlcnRleCBpbiB0aGUgZmlyc3QgbGluZVxuXG5cdFx0XHRuMS54ID0gbm9ybWFsc1sgaiArIDAgXTtcblx0XHRcdG4xLnkgPSBub3JtYWxzWyBqICsgMSBdO1xuXHRcdFx0bjEueiA9IG5vcm1hbHNbIGogKyAyIF07XG5cblx0XHRcdC8vIHNlbGVjdCB0aGUgbm9ybWFsIG9mIHRoZSB2ZXJ0ZXggaW4gdGhlIGxhc3QgbGluZVxuXG5cdFx0XHRuMi54ID0gbm9ybWFsc1sgYmFzZSArIGogKyAwIF07XG5cdFx0XHRuMi55ID0gbm9ybWFsc1sgYmFzZSArIGogKyAxIF07XG5cdFx0XHRuMi56ID0gbm9ybWFsc1sgYmFzZSArIGogKyAyIF07XG5cblx0XHRcdC8vIGF2ZXJhZ2Ugbm9ybWFsc1xuXG5cdFx0XHRuLmFkZFZlY3RvcnMoIG4xLCBuMiApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHQvLyBhc3NpZ24gdGhlIG5ldyB2YWx1ZXMgdG8gYm90aCBub3JtYWxzXG5cblx0XHRcdG5vcm1hbHNbIGogKyAwIF0gPSBub3JtYWxzWyBiYXNlICsgaiArIDAgXSA9IG4ueDtcblx0XHRcdG5vcm1hbHNbIGogKyAxIF0gPSBub3JtYWxzWyBiYXNlICsgaiArIDEgXSA9IG4ueTtcblx0XHRcdG5vcm1hbHNbIGogKyAyIF0gPSBub3JtYWxzWyBiYXNlICsgaiArIDIgXSA9IG4uejtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuTGF0aGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkxhdGhlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGF0aGVCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIGpvbm9icjEgLyBodHRwOi8vam9ub2JyMS5jb21cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gU2hhcGVHZW9tZXRyeVxuXG5mdW5jdGlvbiBTaGFwZUdlb21ldHJ5KCBzaGFwZXMsIGN1cnZlU2VnbWVudHMgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTaGFwZUdlb21ldHJ5JztcblxuXHRpZiAoIHR5cGVvZiBjdXJ2ZVNlZ21lbnRzID09PSAnb2JqZWN0JyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlR2VvbWV0cnk6IE9wdGlvbnMgcGFyYW1ldGVyIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0Y3VydmVTZWdtZW50cyA9IGN1cnZlU2VnbWVudHMuY3VydmVTZWdtZW50cztcblxuXHR9XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHNoYXBlczogc2hhcGVzLFxuXHRcdGN1cnZlU2VnbWVudHM6IGN1cnZlU2VnbWVudHNcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFNoYXBlQnVmZmVyR2VvbWV0cnkoIHNoYXBlcywgY3VydmVTZWdtZW50cyApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblNoYXBlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5TaGFwZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNoYXBlR2VvbWV0cnk7XG5cblNoYXBlR2VvbWV0cnkucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEdlb21ldHJ5LnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdHZhciBzaGFwZXMgPSB0aGlzLnBhcmFtZXRlcnMuc2hhcGVzO1xuXG5cdHJldHVybiB0b0pTT04oIHNoYXBlcywgZGF0YSApO1xuXG59O1xuXG4vLyBTaGFwZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFNoYXBlQnVmZmVyR2VvbWV0cnkoIHNoYXBlcywgY3VydmVTZWdtZW50cyApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NoYXBlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRzaGFwZXM6IHNoYXBlcyxcblx0XHRjdXJ2ZVNlZ21lbnRzOiBjdXJ2ZVNlZ21lbnRzXG5cdH07XG5cblx0Y3VydmVTZWdtZW50cyA9IGN1cnZlU2VnbWVudHMgfHwgMTI7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBncm91cFN0YXJ0ID0gMDtcblx0dmFyIGdyb3VwQ291bnQgPSAwO1xuXG5cdC8vIGFsbG93IHNpbmdsZSBhbmQgYXJyYXkgdmFsdWVzIGZvciBcInNoYXBlc1wiIHBhcmFtZXRlclxuXG5cdGlmICggQXJyYXkuaXNBcnJheSggc2hhcGVzICkgPT09IGZhbHNlICkge1xuXG5cdFx0YWRkU2hhcGUoIHNoYXBlcyApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBzaGFwZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRhZGRTaGFwZSggc2hhcGVzWyBpIF0gKTtcblxuXHRcdFx0dGhpcy5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgaSApOyAvLyBlbmFibGVzIE11bHRpTWF0ZXJpYWwgc3VwcG9ydFxuXG5cdFx0XHRncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7XG5cdFx0XHRncm91cENvdW50ID0gMDtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cblx0Ly8gaGVscGVyIGZ1bmN0aW9uc1xuXG5cdGZ1bmN0aW9uIGFkZFNoYXBlKCBzaGFwZSApIHtcblxuXHRcdHZhciBpLCBsLCBzaGFwZUhvbGU7XG5cblx0XHR2YXIgaW5kZXhPZmZzZXQgPSB2ZXJ0aWNlcy5sZW5ndGggLyAzO1xuXHRcdHZhciBwb2ludHMgPSBzaGFwZS5leHRyYWN0UG9pbnRzKCBjdXJ2ZVNlZ21lbnRzICk7XG5cblx0XHR2YXIgc2hhcGVWZXJ0aWNlcyA9IHBvaW50cy5zaGFwZTtcblx0XHR2YXIgc2hhcGVIb2xlcyA9IHBvaW50cy5ob2xlcztcblxuXHRcdC8vIGNoZWNrIGRpcmVjdGlvbiBvZiB2ZXJ0aWNlc1xuXG5cdFx0aWYgKCBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCBzaGFwZVZlcnRpY2VzICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRzaGFwZVZlcnRpY2VzID0gc2hhcGVWZXJ0aWNlcy5yZXZlcnNlKCk7XG5cblx0XHRcdC8vIGFsc28gY2hlY2sgaWYgaG9sZXMgYXJlIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb25cblxuXHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzaGFwZUhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0c2hhcGVIb2xlID0gc2hhcGVIb2xlc1sgaSBdO1xuXG5cdFx0XHRcdGlmICggU2hhcGVVdGlscy5pc0Nsb2NrV2lzZSggc2hhcGVIb2xlICkgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHRzaGFwZUhvbGVzWyBpIF0gPSBzaGFwZUhvbGUucmV2ZXJzZSgpO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGZhY2VzID0gU2hhcGVVdGlscy50cmlhbmd1bGF0ZVNoYXBlKCBzaGFwZVZlcnRpY2VzLCBzaGFwZUhvbGVzICk7XG5cblx0XHQvLyBqb2luIHZlcnRpY2VzIG9mIGlubmVyIGFuZCBvdXRlciBwYXRocyB0byBhIHNpbmdsZSBhcnJheVxuXG5cdFx0Zm9yICggaSA9IDAsIGwgPSBzaGFwZUhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHNoYXBlSG9sZSA9IHNoYXBlSG9sZXNbIGkgXTtcblx0XHRcdHNoYXBlVmVydGljZXMgPSBzaGFwZVZlcnRpY2VzLmNvbmNhdCggc2hhcGVIb2xlICk7XG5cblx0XHR9XG5cblx0XHQvLyB2ZXJ0aWNlcywgbm9ybWFscywgdXZzXG5cblx0XHRmb3IgKCBpID0gMCwgbCA9IHNoYXBlVmVydGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlcnRleCA9IHNoYXBlVmVydGljZXNbIGkgXTtcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCAwICk7XG5cdFx0XHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcblx0XHRcdHV2cy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnkgKTsgLy8gd29ybGQgdXZzXG5cblx0XHR9XG5cblx0XHQvLyBpbmNpZGVzXG5cblx0XHRmb3IgKCBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdFx0dmFyIGEgPSBmYWNlWyAwIF0gKyBpbmRleE9mZnNldDtcblx0XHRcdHZhciBiID0gZmFjZVsgMSBdICsgaW5kZXhPZmZzZXQ7XG5cdFx0XHR2YXIgYyA9IGZhY2VbIDIgXSArIGluZGV4T2Zmc2V0O1xuXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGMgKTtcblx0XHRcdGdyb3VwQ291bnQgKz0gMztcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuU2hhcGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblNoYXBlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2hhcGVCdWZmZXJHZW9tZXRyeTtcblxuU2hhcGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0dmFyIHNoYXBlcyA9IHRoaXMucGFyYW1ldGVycy5zaGFwZXM7XG5cblx0cmV0dXJuIHRvSlNPTiggc2hhcGVzLCBkYXRhICk7XG5cbn07XG5cbi8vXG5cbmZ1bmN0aW9uIHRvSlNPTiggc2hhcGVzLCBkYXRhICkge1xuXG5cdGRhdGEuc2hhcGVzID0gW107XG5cblx0aWYgKCBBcnJheS5pc0FycmF5KCBzaGFwZXMgKSApIHtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHNoYXBlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgc2hhcGUgPSBzaGFwZXNbIGkgXTtcblxuXHRcdFx0ZGF0YS5zaGFwZXMucHVzaCggc2hhcGUudXVpZCApO1xuXG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cblx0XHRkYXRhLnNoYXBlcy5wdXNoKCBzaGFwZXMudXVpZCApO1xuXG5cdH1cblxuXHRyZXR1cm4gZGF0YTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBFZGdlc0dlb21ldHJ5KCBnZW9tZXRyeSwgdGhyZXNob2xkQW5nbGUgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdFZGdlc0dlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0dGhyZXNob2xkQW5nbGU6IHRocmVzaG9sZEFuZ2xlXG5cdH07XG5cblx0dGhyZXNob2xkQW5nbGUgPSAoIHRocmVzaG9sZEFuZ2xlICE9PSB1bmRlZmluZWQgKSA/IHRocmVzaG9sZEFuZ2xlIDogMTtcblxuXHQvLyBidWZmZXJcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIHRocmVzaG9sZERvdCA9IE1hdGguY29zKCBfTWF0aC5ERUcyUkFEICogdGhyZXNob2xkQW5nbGUgKTtcblx0dmFyIGVkZ2UgPSBbIDAsIDAgXSwgZWRnZXMgPSB7fSwgZWRnZTEsIGVkZ2UyO1xuXHR2YXIga2V5LCBrZXlzID0gWyAnYScsICdiJywgJ2MnIF07XG5cblx0Ly8gcHJlcGFyZSBzb3VyY2UgZ2VvbWV0cnlcblxuXHR2YXIgZ2VvbWV0cnkyO1xuXG5cdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdGdlb21ldHJ5MiA9IG5ldyBHZW9tZXRyeSgpO1xuXHRcdGdlb21ldHJ5Mi5mcm9tQnVmZmVyR2VvbWV0cnkoIGdlb21ldHJ5ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGdlb21ldHJ5MiA9IGdlb21ldHJ5LmNsb25lKCk7XG5cblx0fVxuXG5cdGdlb21ldHJ5Mi5tZXJnZVZlcnRpY2VzKCk7XG5cdGdlb21ldHJ5Mi5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblxuXHR2YXIgc291cmNlVmVydGljZXMgPSBnZW9tZXRyeTIudmVydGljZXM7XG5cdHZhciBmYWNlcyA9IGdlb21ldHJ5Mi5mYWNlcztcblxuXHQvLyBub3cgY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgd2hlcmUgZWFjaCBlbnRyeSByZXByZXNlbnRzIGFuIGVkZ2Ugd2l0aCBpdHMgYWRqb2luaW5nIGZhY2VzXG5cblx0Zm9yICggdmFyIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdGZvciAoIHZhciBqID0gMDsgaiA8IDM7IGogKysgKSB7XG5cblx0XHRcdGVkZ2UxID0gZmFjZVsga2V5c1sgaiBdIF07XG5cdFx0XHRlZGdlMiA9IGZhY2VbIGtleXNbICggaiArIDEgKSAlIDMgXSBdO1xuXHRcdFx0ZWRnZVsgMCBdID0gTWF0aC5taW4oIGVkZ2UxLCBlZGdlMiApO1xuXHRcdFx0ZWRnZVsgMSBdID0gTWF0aC5tYXgoIGVkZ2UxLCBlZGdlMiApO1xuXG5cdFx0XHRrZXkgPSBlZGdlWyAwIF0gKyAnLCcgKyBlZGdlWyAxIF07XG5cblx0XHRcdGlmICggZWRnZXNbIGtleSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0ZWRnZXNbIGtleSBdID0geyBpbmRleDE6IGVkZ2VbIDAgXSwgaW5kZXgyOiBlZGdlWyAxIF0sIGZhY2UxOiBpLCBmYWNlMjogdW5kZWZpbmVkIH07XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0ZWRnZXNbIGtleSBdLmZhY2UyID0gaTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlc1xuXG5cdGZvciAoIGtleSBpbiBlZGdlcyApIHtcblxuXHRcdHZhciBlID0gZWRnZXNbIGtleSBdO1xuXG5cdFx0Ly8gYW4gZWRnZSBpcyBvbmx5IHJlbmRlcmVkIGlmIHRoZSBhbmdsZSAoaW4gZGVncmVlcykgYmV0d2VlbiB0aGUgZmFjZSBub3JtYWxzIG9mIHRoZSBhZGpvaW5pbmcgZmFjZXMgZXhjZWVkcyB0aGlzIHZhbHVlLiBkZWZhdWx0ID0gMSBkZWdyZWUuXG5cblx0XHRpZiAoIGUuZmFjZTIgPT09IHVuZGVmaW5lZCB8fCBmYWNlc1sgZS5mYWNlMSBdLm5vcm1hbC5kb3QoIGZhY2VzWyBlLmZhY2UyIF0ubm9ybWFsICkgPD0gdGhyZXNob2xkRG90ICkge1xuXG5cdFx0XHR2YXIgdmVydGV4ID0gc291cmNlVmVydGljZXNbIGUuaW5kZXgxIF07XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdHZlcnRleCA9IHNvdXJjZVZlcnRpY2VzWyBlLmluZGV4MiBdO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXG59XG5cbkVkZ2VzR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5FZGdlc0dlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEVkZ2VzR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gQ3lsaW5kZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBDeWxpbmRlckdlb21ldHJ5KCByYWRpdXNUb3AsIHJhZGl1c0JvdHRvbSwgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDeWxpbmRlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzVG9wOiByYWRpdXNUb3AsXG5cdFx0cmFkaXVzQm90dG9tOiByYWRpdXNCb3R0b20sXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRvcGVuRW5kZWQ6IG9wZW5FbmRlZCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSggcmFkaXVzVG9wLCByYWRpdXNCb3R0b20sIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuQ3lsaW5kZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkN5bGluZGVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3lsaW5kZXJHZW9tZXRyeTtcblxuLy8gQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5KCByYWRpdXNUb3AsIHJhZGl1c0JvdHRvbSwgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDeWxpbmRlckJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzVG9wOiByYWRpdXNUb3AsXG5cdFx0cmFkaXVzQm90dG9tOiByYWRpdXNCb3R0b20sXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRvcGVuRW5kZWQ6IG9wZW5FbmRlZCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0cmFkaXVzVG9wID0gcmFkaXVzVG9wICE9PSB1bmRlZmluZWQgPyByYWRpdXNUb3AgOiAxO1xuXHRyYWRpdXNCb3R0b20gPSByYWRpdXNCb3R0b20gIT09IHVuZGVmaW5lZCA/IHJhZGl1c0JvdHRvbSA6IDE7XG5cdGhlaWdodCA9IGhlaWdodCB8fCAxO1xuXG5cdHJhZGlhbFNlZ21lbnRzID0gTWF0aC5mbG9vciggcmFkaWFsU2VnbWVudHMgKSB8fCA4O1xuXHRoZWlnaHRTZWdtZW50cyA9IE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICkgfHwgMTtcblxuXHRvcGVuRW5kZWQgPSBvcGVuRW5kZWQgIT09IHVuZGVmaW5lZCA/IG9wZW5FbmRlZCA6IGZhbHNlO1xuXHR0aGV0YVN0YXJ0ID0gdGhldGFTdGFydCAhPT0gdW5kZWZpbmVkID8gdGhldGFTdGFydCA6IDAuMDtcblx0dGhldGFMZW5ndGggPSB0aGV0YUxlbmd0aCAhPT0gdW5kZWZpbmVkID8gdGhldGFMZW5ndGggOiBNYXRoLlBJICogMjtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIGluZGV4ID0gMDtcblx0dmFyIGluZGV4QXJyYXkgPSBbXTtcblx0dmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuXHR2YXIgZ3JvdXBTdGFydCA9IDA7XG5cblx0Ly8gZ2VuZXJhdGUgZ2VvbWV0cnlcblxuXHRnZW5lcmF0ZVRvcnNvKCk7XG5cblx0aWYgKCBvcGVuRW5kZWQgPT09IGZhbHNlICkge1xuXG5cdFx0aWYgKCByYWRpdXNUb3AgPiAwICkgZ2VuZXJhdGVDYXAoIHRydWUgKTtcblx0XHRpZiAoIHJhZGl1c0JvdHRvbSA+IDAgKSBnZW5lcmF0ZUNhcCggZmFsc2UgKTtcblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlVG9yc28oKSB7XG5cblx0XHR2YXIgeCwgeTtcblx0XHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBncm91cENvdW50ID0gMDtcblxuXHRcdC8vIHRoaXMgd2lsbCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgbm9ybWFsXG5cdFx0dmFyIHNsb3BlID0gKCByYWRpdXNCb3R0b20gLSByYWRpdXNUb3AgKSAvIGhlaWdodDtcblxuXHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRcdGZvciAoIHkgPSAwOyB5IDw9IGhlaWdodFNlZ21lbnRzOyB5ICsrICkge1xuXG5cdFx0XHR2YXIgaW5kZXhSb3cgPSBbXTtcblxuXHRcdFx0dmFyIHYgPSB5IC8gaGVpZ2h0U2VnbWVudHM7XG5cblx0XHRcdC8vIGNhbGN1bGF0ZSB0aGUgcmFkaXVzIG9mIHRoZSBjdXJyZW50IHJvd1xuXG5cdFx0XHR2YXIgcmFkaXVzID0gdiAqICggcmFkaXVzQm90dG9tIC0gcmFkaXVzVG9wICkgKyByYWRpdXNUb3A7XG5cblx0XHRcdGZvciAoIHggPSAwOyB4IDw9IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xuXG5cdFx0XHRcdHZhciB1ID0geCAvIHJhZGlhbFNlZ21lbnRzO1xuXG5cdFx0XHRcdHZhciB0aGV0YSA9IHUgKiB0aGV0YUxlbmd0aCArIHRoZXRhU3RhcnQ7XG5cblx0XHRcdFx0dmFyIHNpblRoZXRhID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cdFx0XHRcdHZhciBjb3NUaGV0YSA9IE1hdGguY29zKCB0aGV0YSApO1xuXG5cdFx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHRcdHZlcnRleC54ID0gcmFkaXVzICogc2luVGhldGE7XG5cdFx0XHRcdHZlcnRleC55ID0gLSB2ICogaGVpZ2h0ICsgaGFsZkhlaWdodDtcblx0XHRcdFx0dmVydGV4LnogPSByYWRpdXMgKiBjb3NUaGV0YTtcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRcdG5vcm1hbC5zZXQoIHNpblRoZXRhLCBzbG9wZSwgY29zVGhldGEgKS5ub3JtYWxpemUoKTtcblx0XHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdFx0Ly8gdXZcblxuXHRcdFx0XHR1dnMucHVzaCggdSwgMSAtIHYgKTtcblxuXHRcdFx0XHQvLyBzYXZlIGluZGV4IG9mIHZlcnRleCBpbiByZXNwZWN0aXZlIHJvd1xuXG5cdFx0XHRcdGluZGV4Um93LnB1c2goIGluZGV4ICsrICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gbm93IHNhdmUgdmVydGljZXMgb2YgdGhlIHJvdyBpbiBvdXIgaW5kZXggYXJyYXlcblxuXHRcdFx0aW5kZXhBcnJheS5wdXNoKCBpbmRleFJvdyApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xuXG5cdFx0Zm9yICggeCA9IDA7IHggPCByYWRpYWxTZWdtZW50czsgeCArKyApIHtcblxuXHRcdFx0Zm9yICggeSA9IDA7IHkgPCBoZWlnaHRTZWdtZW50czsgeSArKyApIHtcblxuXHRcdFx0XHQvLyB3ZSB1c2UgdGhlIGluZGV4IGFycmF5IHRvIGFjY2VzcyB0aGUgY29ycmVjdCBpbmRpY2VzXG5cblx0XHRcdFx0dmFyIGEgPSBpbmRleEFycmF5WyB5IF1bIHggXTtcblx0XHRcdFx0dmFyIGIgPSBpbmRleEFycmF5WyB5ICsgMSBdWyB4IF07XG5cdFx0XHRcdHZhciBjID0gaW5kZXhBcnJheVsgeSArIDEgXVsgeCArIDEgXTtcblx0XHRcdFx0dmFyIGQgPSBpbmRleEFycmF5WyB5IF1bIHggKyAxIF07XG5cblx0XHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHRcdFx0Ly8gdXBkYXRlIGdyb3VwIGNvdW50ZXJcblxuXHRcdFx0XHRncm91cENvdW50ICs9IDY7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGFkZCBhIGdyb3VwIHRvIHRoZSBnZW9tZXRyeS4gdGhpcyB3aWxsIGVuc3VyZSBtdWx0aSBtYXRlcmlhbCBzdXBwb3J0XG5cblx0XHRzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgMCApO1xuXG5cdFx0Ly8gY2FsY3VsYXRlIG5ldyBzdGFydCB2YWx1ZSBmb3IgZ3JvdXBzXG5cblx0XHRncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlQ2FwKCB0b3AgKSB7XG5cblx0XHR2YXIgeCwgY2VudGVySW5kZXhTdGFydCwgY2VudGVySW5kZXhFbmQ7XG5cblx0XHR2YXIgdXYgPSBuZXcgVmVjdG9yMigpO1xuXHRcdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIGdyb3VwQ291bnQgPSAwO1xuXG5cdFx0dmFyIHJhZGl1cyA9ICggdG9wID09PSB0cnVlICkgPyByYWRpdXNUb3AgOiByYWRpdXNCb3R0b207XG5cdFx0dmFyIHNpZ24gPSAoIHRvcCA9PT0gdHJ1ZSApID8gMSA6IC0gMTtcblxuXHRcdC8vIHNhdmUgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjZW50ZXIgdmVydGV4XG5cdFx0Y2VudGVySW5kZXhTdGFydCA9IGluZGV4O1xuXG5cdFx0Ly8gZmlyc3Qgd2UgZ2VuZXJhdGUgdGhlIGNlbnRlciB2ZXJ0ZXggZGF0YSBvZiB0aGUgY2FwLlxuXHRcdC8vIGJlY2F1c2UgdGhlIGdlb21ldHJ5IG5lZWRzIG9uZSBzZXQgb2YgdXZzIHBlciBmYWNlLFxuXHRcdC8vIHdlIG11c3QgZ2VuZXJhdGUgYSBjZW50ZXIgdmVydGV4IHBlciBmYWNlL3NlZ21lbnRcblxuXHRcdGZvciAoIHggPSAxOyB4IDw9IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGljZXMucHVzaCggMCwgaGFsZkhlaWdodCAqIHNpZ24sIDAgKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdG5vcm1hbHMucHVzaCggMCwgc2lnbiwgMCApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1dnMucHVzaCggMC41LCAwLjUgKTtcblxuXHRcdFx0Ly8gaW5jcmVhc2UgaW5kZXhcblxuXHRcdFx0aW5kZXggKys7XG5cblx0XHR9XG5cblx0XHQvLyBzYXZlIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBjZW50ZXIgdmVydGV4XG5cblx0XHRjZW50ZXJJbmRleEVuZCA9IGluZGV4O1xuXG5cdFx0Ly8gbm93IHdlIGdlbmVyYXRlIHRoZSBzdXJyb3VuZGluZyB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0XHRmb3IgKCB4ID0gMDsgeCA8PSByYWRpYWxTZWdtZW50czsgeCArKyApIHtcblxuXHRcdFx0dmFyIHUgPSB4IC8gcmFkaWFsU2VnbWVudHM7XG5cdFx0XHR2YXIgdGhldGEgPSB1ICogdGhldGFMZW5ndGggKyB0aGV0YVN0YXJ0O1xuXG5cdFx0XHR2YXIgY29zVGhldGEgPSBNYXRoLmNvcyggdGhldGEgKTtcblx0XHRcdHZhciBzaW5UaGV0YSA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGV4LnggPSByYWRpdXMgKiBzaW5UaGV0YTtcblx0XHRcdHZlcnRleC55ID0gaGFsZkhlaWdodCAqIHNpZ247XG5cdFx0XHR2ZXJ0ZXgueiA9IHJhZGl1cyAqIGNvc1RoZXRhO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0bm9ybWFscy5wdXNoKCAwLCBzaWduLCAwICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2LnggPSAoIGNvc1RoZXRhICogMC41ICkgKyAwLjU7XG5cdFx0XHR1di55ID0gKCBzaW5UaGV0YSAqIDAuNSAqIHNpZ24gKSArIDAuNTtcblx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0XHRcdC8vIGluY3JlYXNlIGluZGV4XG5cblx0XHRcdGluZGV4ICsrO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xuXG5cdFx0Zm9yICggeCA9IDA7IHggPCByYWRpYWxTZWdtZW50czsgeCArKyApIHtcblxuXHRcdFx0dmFyIGMgPSBjZW50ZXJJbmRleFN0YXJ0ICsgeDtcblx0XHRcdHZhciBpID0gY2VudGVySW5kZXhFbmQgKyB4O1xuXG5cdFx0XHRpZiAoIHRvcCA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHQvLyBmYWNlIHRvcFxuXG5cdFx0XHRcdGluZGljZXMucHVzaCggaSwgaSArIDEsIGMgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBmYWNlIGJvdHRvbVxuXG5cdFx0XHRcdGluZGljZXMucHVzaCggaSArIDEsIGksIGMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRncm91cENvdW50ICs9IDM7XG5cblx0XHR9XG5cblx0XHQvLyBhZGQgYSBncm91cCB0byB0aGUgZ2VvbWV0cnkuIHRoaXMgd2lsbCBlbnN1cmUgbXVsdGkgbWF0ZXJpYWwgc3VwcG9ydFxuXG5cdFx0c2NvcGUuYWRkR3JvdXAoIGdyb3VwU3RhcnQsIGdyb3VwQ291bnQsIHRvcCA9PT0gdHJ1ZSA/IDEgOiAyICk7XG5cblx0XHQvLyBjYWxjdWxhdGUgbmV3IHN0YXJ0IHZhbHVlIGZvciBncm91cHNcblxuXHRcdGdyb3VwU3RhcnQgKz0gZ3JvdXBDb3VudDtcblxuXHR9XG5cbn1cblxuQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkN5bGluZGVyQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIGFiZWxuYXRpb24gLyBodHRwOi8vZ2l0aHViLmNvbS9hYmVsbmF0aW9uXG4gKi9cblxuLy8gQ29uZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIENvbmVHZW9tZXRyeSggcmFkaXVzLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRDeWxpbmRlckdlb21ldHJ5LmNhbGwoIHRoaXMsIDAsIHJhZGl1cywgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKTtcblxuXHR0aGlzLnR5cGUgPSAnQ29uZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRvcGVuRW5kZWQ6IG9wZW5FbmRlZCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG59XG5cbkNvbmVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDeWxpbmRlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuQ29uZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbmVHZW9tZXRyeTtcblxuLy8gQ29uZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIENvbmVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRDeWxpbmRlckJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIDAsIHJhZGl1cywgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKTtcblxuXHR0aGlzLnR5cGUgPSAnQ29uZUJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRvcGVuRW5kZWQ6IG9wZW5FbmRlZCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG59XG5cbkNvbmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuQ29uZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbmVCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKiBAYXV0aG9yIGh1Z2hlc1xuICovXG5cbi8vIENpcmNsZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIENpcmNsZUdlb21ldHJ5KCByYWRpdXMsIHNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0NpcmNsZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0c2VnbWVudHM6IHNlZ21lbnRzLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBDaXJjbGVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBzZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5DaXJjbGVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkNpcmNsZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENpcmNsZUdlb21ldHJ5O1xuXG4vLyBDaXJjbGVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBDaXJjbGVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBzZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDaXJjbGVCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHNlZ21lbnRzOiBzZWdtZW50cyxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHJhZGl1cyA9IHJhZGl1cyB8fCAxO1xuXHRzZWdtZW50cyA9IHNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBNYXRoLm1heCggMywgc2VnbWVudHMgKSA6IDg7XG5cblx0dGhldGFTdGFydCA9IHRoZXRhU3RhcnQgIT09IHVuZGVmaW5lZCA/IHRoZXRhU3RhcnQgOiAwO1xuXHR0aGV0YUxlbmd0aCA9IHRoZXRhTGVuZ3RoICE9PSB1bmRlZmluZWQgPyB0aGV0YUxlbmd0aCA6IE1hdGguUEkgKiAyO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgaSwgcztcblx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB1diA9IG5ldyBWZWN0b3IyKCk7XG5cblx0Ly8gY2VudGVyIHBvaW50XG5cblx0dmVydGljZXMucHVzaCggMCwgMCwgMCApO1xuXHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcblx0dXZzLnB1c2goIDAuNSwgMC41ICk7XG5cblx0Zm9yICggcyA9IDAsIGkgPSAzOyBzIDw9IHNlZ21lbnRzOyBzICsrLCBpICs9IDMgKSB7XG5cblx0XHR2YXIgc2VnbWVudCA9IHRoZXRhU3RhcnQgKyBzIC8gc2VnbWVudHMgKiB0aGV0YUxlbmd0aDtcblxuXHRcdC8vIHZlcnRleFxuXG5cdFx0dmVydGV4LnggPSByYWRpdXMgKiBNYXRoLmNvcyggc2VnbWVudCApO1xuXHRcdHZlcnRleC55ID0gcmFkaXVzICogTWF0aC5zaW4oIHNlZ21lbnQgKTtcblxuXHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdC8vIG5vcm1hbFxuXG5cdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cblx0XHQvLyB1dnNcblxuXHRcdHV2LnggPSAoIHZlcnRpY2VzWyBpIF0gLyByYWRpdXMgKyAxICkgLyAyO1xuXHRcdHV2LnkgPSAoIHZlcnRpY2VzWyBpICsgMSBdIC8gcmFkaXVzICsgMSApIC8gMjtcblxuXHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0fVxuXG5cdC8vIGluZGljZXNcblxuXHRmb3IgKCBpID0gMTsgaSA8PSBzZWdtZW50czsgaSArKyApIHtcblxuXHRcdGluZGljZXMucHVzaCggaSwgaSArIDEsIDAgKTtcblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG59XG5cbkNpcmNsZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuQ2lyY2xlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2lyY2xlQnVmZmVyR2VvbWV0cnk7XG5cblxuXG52YXIgR2VvbWV0cmllcyA9IE9iamVjdC5mcmVlemUoe1xuXHRXaXJlZnJhbWVHZW9tZXRyeTogV2lyZWZyYW1lR2VvbWV0cnksXG5cdFBhcmFtZXRyaWNHZW9tZXRyeTogUGFyYW1ldHJpY0dlb21ldHJ5LFxuXHRQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnk6IFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSxcblx0VGV0cmFoZWRyb25HZW9tZXRyeTogVGV0cmFoZWRyb25HZW9tZXRyeSxcblx0VGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeTogVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSxcblx0T2N0YWhlZHJvbkdlb21ldHJ5OiBPY3RhaGVkcm9uR2VvbWV0cnksXG5cdE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeTogT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5LFxuXHRJY29zYWhlZHJvbkdlb21ldHJ5OiBJY29zYWhlZHJvbkdlb21ldHJ5LFxuXHRJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LFxuXHREb2RlY2FoZWRyb25HZW9tZXRyeTogRG9kZWNhaGVkcm9uR2VvbWV0cnksXG5cdERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSxcblx0UG9seWhlZHJvbkdlb21ldHJ5OiBQb2x5aGVkcm9uR2VvbWV0cnksXG5cdFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeTogUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LFxuXHRUdWJlR2VvbWV0cnk6IFR1YmVHZW9tZXRyeSxcblx0VHViZUJ1ZmZlckdlb21ldHJ5OiBUdWJlQnVmZmVyR2VvbWV0cnksXG5cdFRvcnVzS25vdEdlb21ldHJ5OiBUb3J1c0tub3RHZW9tZXRyeSxcblx0VG9ydXNLbm90QnVmZmVyR2VvbWV0cnk6IFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5LFxuXHRUb3J1c0dlb21ldHJ5OiBUb3J1c0dlb21ldHJ5LFxuXHRUb3J1c0J1ZmZlckdlb21ldHJ5OiBUb3J1c0J1ZmZlckdlb21ldHJ5LFxuXHRUZXh0R2VvbWV0cnk6IFRleHRHZW9tZXRyeSxcblx0VGV4dEJ1ZmZlckdlb21ldHJ5OiBUZXh0QnVmZmVyR2VvbWV0cnksXG5cdFNwaGVyZUdlb21ldHJ5OiBTcGhlcmVHZW9tZXRyeSxcblx0U3BoZXJlQnVmZmVyR2VvbWV0cnk6IFNwaGVyZUJ1ZmZlckdlb21ldHJ5LFxuXHRSaW5nR2VvbWV0cnk6IFJpbmdHZW9tZXRyeSxcblx0UmluZ0J1ZmZlckdlb21ldHJ5OiBSaW5nQnVmZmVyR2VvbWV0cnksXG5cdFBsYW5lR2VvbWV0cnk6IFBsYW5lR2VvbWV0cnksXG5cdFBsYW5lQnVmZmVyR2VvbWV0cnk6IFBsYW5lQnVmZmVyR2VvbWV0cnksXG5cdExhdGhlR2VvbWV0cnk6IExhdGhlR2VvbWV0cnksXG5cdExhdGhlQnVmZmVyR2VvbWV0cnk6IExhdGhlQnVmZmVyR2VvbWV0cnksXG5cdFNoYXBlR2VvbWV0cnk6IFNoYXBlR2VvbWV0cnksXG5cdFNoYXBlQnVmZmVyR2VvbWV0cnk6IFNoYXBlQnVmZmVyR2VvbWV0cnksXG5cdEV4dHJ1ZGVHZW9tZXRyeTogRXh0cnVkZUdlb21ldHJ5LFxuXHRFeHRydWRlQnVmZmVyR2VvbWV0cnk6IEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSxcblx0RWRnZXNHZW9tZXRyeTogRWRnZXNHZW9tZXRyeSxcblx0Q29uZUdlb21ldHJ5OiBDb25lR2VvbWV0cnksXG5cdENvbmVCdWZmZXJHZW9tZXRyeTogQ29uZUJ1ZmZlckdlb21ldHJ5LFxuXHRDeWxpbmRlckdlb21ldHJ5OiBDeWxpbmRlckdlb21ldHJ5LFxuXHRDeWxpbmRlckJ1ZmZlckdlb21ldHJ5OiBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5LFxuXHRDaXJjbGVHZW9tZXRyeTogQ2lyY2xlR2VvbWV0cnksXG5cdENpcmNsZUJ1ZmZlckdlb21ldHJ5OiBDaXJjbGVCdWZmZXJHZW9tZXRyeSxcblx0Qm94R2VvbWV0cnk6IEJveEdlb21ldHJ5LFxuXHRCb3hCdWZmZXJHZW9tZXRyeTogQm94QnVmZmVyR2VvbWV0cnlcbn0pO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPFRIUkVFLkNvbG9yPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIFNoYWRvd01hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU2hhZG93TWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XG5cdHRoaXMudHJhbnNwYXJlbnQgPSB0cnVlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuU2hhZG93TWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5TaGFkb3dNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTaGFkb3dNYXRlcmlhbDtcblxuU2hhZG93TWF0ZXJpYWwucHJvdG90eXBlLmlzU2hhZG93TWF0ZXJpYWwgPSB0cnVlO1xuXG5TaGFkb3dNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBSYXdTaGFkZXJNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRTaGFkZXJNYXRlcmlhbC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJzICk7XG5cblx0dGhpcy50eXBlID0gJ1Jhd1NoYWRlck1hdGVyaWFsJztcblxufVxuXG5SYXdTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUgKTtcblJhd1NoYWRlck1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJhd1NoYWRlck1hdGVyaWFsO1xuXG5SYXdTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuaXNSYXdTaGFkZXJNYXRlcmlhbCA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgcm91Z2huZXNzOiA8ZmxvYXQ+LFxuICogIG1ldGFsbmVzczogPGZsb2F0PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGVtaXNzaXZlOiA8aGV4PixcbiAqICBlbWlzc2l2ZUludGVuc2l0eTogPGZsb2F0PlxuICogIGVtaXNzaXZlTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBidW1wTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGJ1bXBTY2FsZTogPGZsb2F0PixcbiAqXG4gKiAgbm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIG5vcm1hbFNjYWxlOiA8VmVjdG9yMj4sXG4gKlxuICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PixcbiAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+LFxuICpcbiAqICByb3VnaG5lc3NNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIG1ldGFsbmVzc01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGVudk1hcDogbmV3IFRIUkVFLkN1YmVUZXh0dXJlKCBbcG9zeCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSxcbiAqICBlbnZNYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoU3RhbmRhcmRNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5kZWZpbmVzID0geyAnU1RBTkRBUkQnOiAnJyB9O1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoU3RhbmRhcmRNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZGlmZnVzZVxuXHR0aGlzLnJvdWdobmVzcyA9IDAuNTtcblx0dGhpcy5tZXRhbG5lc3MgPSAwLjU7XG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBudWxsO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuYW9NYXAgPSBudWxsO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuZW1pc3NpdmUgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSAxLjA7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsO1xuXG5cdHRoaXMuYnVtcE1hcCA9IG51bGw7XG5cdHRoaXMuYnVtcFNjYWxlID0gMTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XG5cdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0dGhpcy5yb3VnaG5lc3NNYXAgPSBudWxsO1xuXG5cdHRoaXMubWV0YWxuZXNzTWFwID0gbnVsbDtcblxuXHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHR0aGlzLmVudk1hcCA9IG51bGw7XG5cdHRoaXMuZW52TWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gMC45ODtcblxuXHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAncm91bmQnO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaFN0YW5kYXJkTWF0ZXJpYWw7XG5cbk1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmRlZmluZXMgPSB7ICdTVEFOREFSRCc6ICcnIH07XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblx0dGhpcy5yb3VnaG5lc3MgPSBzb3VyY2Uucm91Z2huZXNzO1xuXHR0aGlzLm1ldGFsbmVzcyA9IHNvdXJjZS5tZXRhbG5lc3M7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBzb3VyY2UubGlnaHRNYXA7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5hb01hcCA9IHNvdXJjZS5hb01hcDtcblx0dGhpcy5hb01hcEludGVuc2l0eSA9IHNvdXJjZS5hb01hcEludGVuc2l0eTtcblxuXHR0aGlzLmVtaXNzaXZlLmNvcHkoIHNvdXJjZS5lbWlzc2l2ZSApO1xuXHR0aGlzLmVtaXNzaXZlTWFwID0gc291cmNlLmVtaXNzaXZlTWFwO1xuXHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gc291cmNlLmVtaXNzaXZlSW50ZW5zaXR5O1xuXG5cdHRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwO1xuXHR0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7XG5cblx0dGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwO1xuXHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0dGhpcy5yb3VnaG5lc3NNYXAgPSBzb3VyY2Uucm91Z2huZXNzTWFwO1xuXG5cdHRoaXMubWV0YWxuZXNzTWFwID0gc291cmNlLm1ldGFsbmVzc01hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcblx0dGhpcy5lbnZNYXBJbnRlbnNpdHkgPSBzb3VyY2UuZW52TWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gc291cmNlLnJlZnJhY3Rpb25SYXRpbztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoUGh5c2ljYWxNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNZXNoU3RhbmRhcmRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5kZWZpbmVzID0geyAnUEhZU0lDQUwnOiAnJyB9O1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoUGh5c2ljYWxNYXRlcmlhbCc7XG5cblx0dGhpcy5yZWZsZWN0aXZpdHkgPSAwLjU7IC8vIG1hcHMgdG8gRjAgPSAwLjA0XG5cblx0dGhpcy5jbGVhckNvYXQgPSAwLjA7XG5cdHRoaXMuY2xlYXJDb2F0Um91Z2huZXNzID0gMC4wO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoUGh5c2ljYWxNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoUGh5c2ljYWxNYXRlcmlhbDtcblxuTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoUGh5c2ljYWxNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHsgJ1BIWVNJQ0FMJzogJycgfTtcblxuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7XG5cblx0dGhpcy5jbGVhckNvYXQgPSBzb3VyY2UuY2xlYXJDb2F0O1xuXHR0aGlzLmNsZWFyQ29hdFJvdWdobmVzcyA9IHNvdXJjZS5jbGVhckNvYXRSb3VnaG5lc3M7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgc3BlY3VsYXI6IDxoZXg+LFxuICogIHNoaW5pbmVzczogPGZsb2F0PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGVtaXNzaXZlOiA8aGV4PixcbiAqICBlbWlzc2l2ZUludGVuc2l0eTogPGZsb2F0PlxuICogIGVtaXNzaXZlTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBidW1wTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGJ1bXBTY2FsZTogPGZsb2F0PixcbiAqXG4gKiAgbm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIG5vcm1hbFNjYWxlOiA8VmVjdG9yMj4sXG4gKlxuICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PixcbiAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+LFxuICpcbiAqICBzcGVjdWxhck1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGVudk1hcDogbmV3IFRIUkVFLkN1YmVUZXh0dXJlKCBbcG9zeCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSxcbiAqICBjb21iaW5lOiBUSFJFRS5NdWx0aXBseSxcbiAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD4sXG4gKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoUGhvbmdNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ01lc2hQaG9uZ01hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOyAvLyBkaWZmdXNlXG5cdHRoaXMuc3BlY3VsYXIgPSBuZXcgQ29sb3IoIDB4MTExMTExICk7XG5cdHRoaXMuc2hpbmluZXNzID0gMzA7XG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBudWxsO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuYW9NYXAgPSBudWxsO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuZW1pc3NpdmUgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSAxLjA7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsO1xuXG5cdHRoaXMuYnVtcE1hcCA9IG51bGw7XG5cdHRoaXMuYnVtcFNjYWxlID0gMTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XG5cdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHR0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9wZXJhdGlvbjtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSAxO1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hQaG9uZ01hdGVyaWFsO1xuXG5NZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoUGhvbmdNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblx0dGhpcy5zcGVjdWxhci5jb3B5KCBzb3VyY2Uuc3BlY3VsYXIgKTtcblx0dGhpcy5zaGluaW5lc3MgPSBzb3VyY2Uuc2hpbmluZXNzO1xuXG5cdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5lbWlzc2l2ZS5jb3B5KCBzb3VyY2UuZW1pc3NpdmUgKTtcblx0dGhpcy5lbWlzc2l2ZU1hcCA9IHNvdXJjZS5lbWlzc2l2ZU1hcDtcblx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVuc2l0eTtcblxuXHR0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDtcblx0dGhpcy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlO1xuXG5cdHRoaXMubm9ybWFsTWFwID0gc291cmNlLm5vcm1hbE1hcDtcblx0dGhpcy5ub3JtYWxTY2FsZS5jb3B5KCBzb3VyY2Uubm9ybWFsU2NhbGUgKTtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdHRoaXMuc3BlY3VsYXJNYXAgPSBzb3VyY2Uuc3BlY3VsYXJNYXA7XG5cblx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHR0aGlzLmVudk1hcCA9IHNvdXJjZS5lbnZNYXA7XG5cdHRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lO1xuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7XG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gc291cmNlLnJlZnJhY3Rpb25SYXRpbztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciB0YWthaGlyb3ggLyBodHRwOi8vZ2l0aHViLmNvbS90YWthaGlyb3hcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGdyYWRpZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApXG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaFRvb25NYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNZXNoUGhvbmdNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5kZWZpbmVzID0geyAnVE9PTic6ICcnIH07XG5cblx0dGhpcy50eXBlID0gJ01lc2hUb29uTWF0ZXJpYWwnO1xuXG5cdHRoaXMuZ3JhZGllbnRNYXAgPSBudWxsO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hUb29uTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaFRvb25NYXRlcmlhbDtcblxuTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoVG9vbk1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZ3JhZGllbnRNYXAgPSBzb3VyY2UuZ3JhZGllbnRNYXA7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgYnVtcE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBidW1wU2NhbGU6IDxmbG9hdD4sXG4gKlxuICogIG5vcm1hbE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBub3JtYWxTY2FsZTogPFZlY3RvcjI+LFxuICpcbiAqICBkaXNwbGFjZW1lbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgZGlzcGxhY2VtZW50U2NhbGU6IDxmbG9hdD4sXG4gKiAgZGlzcGxhY2VtZW50QmlhczogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+XG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoTm9ybWFsTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoTm9ybWFsTWF0ZXJpYWwnO1xuXG5cdHRoaXMuYnVtcE1hcCA9IG51bGw7XG5cdHRoaXMuYnVtcFNjYWxlID0gMTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XG5cdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXG5cdHRoaXMuZm9nID0gZmFsc2U7XG5cdHRoaXMubGlnaHRzID0gZmFsc2U7XG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaE5vcm1hbE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaE5vcm1hbE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hOb3JtYWxNYXRlcmlhbDtcblxuTWVzaE5vcm1hbE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hOb3JtYWxNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hOb3JtYWxNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwO1xuXHR0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7XG5cblx0dGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwO1xuXHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBsaWdodE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBhb01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBlbWlzc2l2ZTogPGhleD4sXG4gKiAgZW1pc3NpdmVJbnRlbnNpdHk6IDxmbG9hdD5cbiAqICBlbWlzc2l2ZU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgc3BlY3VsYXJNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBlbnZNYXA6IG5ldyBUSFJFRS5DdWJlVGV4dHVyZSggW3Bvc3gsIG5lZ3gsIHBvc3ksIG5lZ3ksIHBvc3osIG5lZ3pdICksXG4gKiAgY29tYmluZTogVEhSRUUuTXVsdGlwbHksXG4gKiAgcmVmbGVjdGl2aXR5OiA8ZmxvYXQ+LFxuICogIHJlZnJhY3Rpb25SYXRpbzogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LFxuICogIG1vcnBoTm9ybWFsczogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaExhbWJlcnRNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ01lc2hMYW1iZXJ0TWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2VcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5saWdodE1hcCA9IG51bGw7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5hb01hcCA9IG51bGw7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcblx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IDEuMDtcblx0dGhpcy5lbWlzc2l2ZU1hcCA9IG51bGw7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHR0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9wZXJhdGlvbjtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSAxO1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaExhbWJlcnRNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoTGFtYmVydE1hdGVyaWFsO1xuXG5NZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hMYW1iZXJ0TWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcblxuXHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcblx0dGhpcy5jb21iaW5lID0gc291cmNlLmNvbWJpbmU7XG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTtcblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKlxuICogIGxpbmV3aWR0aDogPGZsb2F0PixcbiAqXG4gKiAgc2NhbGU6IDxmbG9hdD4sXG4gKiAgZGFzaFNpemU6IDxmbG9hdD4sXG4gKiAgZ2FwU2l6ZTogPGZsb2F0PlxuICogfVxuICovXG5cbmZ1bmN0aW9uIExpbmVEYXNoZWRNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRMaW5lQmFzaWNNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVEYXNoZWRNYXRlcmlhbCc7XG5cblx0dGhpcy5zY2FsZSA9IDE7XG5cdHRoaXMuZGFzaFNpemUgPSAzO1xuXHR0aGlzLmdhcFNpemUgPSAxO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZSApO1xuTGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVEYXNoZWRNYXRlcmlhbDtcblxuTGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZS5pc0xpbmVEYXNoZWRNYXRlcmlhbCA9IHRydWU7XG5cbkxpbmVEYXNoZWRNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdExpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuc2NhbGUgPSBzb3VyY2Uuc2NhbGU7XG5cdHRoaXMuZGFzaFNpemUgPSBzb3VyY2UuZGFzaFNpemU7XG5cdHRoaXMuZ2FwU2l6ZSA9IHNvdXJjZS5nYXBTaXplO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5cblxudmFyIE1hdGVyaWFscyA9IE9iamVjdC5mcmVlemUoe1xuXHRTaGFkb3dNYXRlcmlhbDogU2hhZG93TWF0ZXJpYWwsXG5cdFNwcml0ZU1hdGVyaWFsOiBTcHJpdGVNYXRlcmlhbCxcblx0UmF3U2hhZGVyTWF0ZXJpYWw6IFJhd1NoYWRlck1hdGVyaWFsLFxuXHRTaGFkZXJNYXRlcmlhbDogU2hhZGVyTWF0ZXJpYWwsXG5cdFBvaW50c01hdGVyaWFsOiBQb2ludHNNYXRlcmlhbCxcblx0TWVzaFBoeXNpY2FsTWF0ZXJpYWw6IE1lc2hQaHlzaWNhbE1hdGVyaWFsLFxuXHRNZXNoU3RhbmRhcmRNYXRlcmlhbDogTWVzaFN0YW5kYXJkTWF0ZXJpYWwsXG5cdE1lc2hQaG9uZ01hdGVyaWFsOiBNZXNoUGhvbmdNYXRlcmlhbCxcblx0TWVzaFRvb25NYXRlcmlhbDogTWVzaFRvb25NYXRlcmlhbCxcblx0TWVzaE5vcm1hbE1hdGVyaWFsOiBNZXNoTm9ybWFsTWF0ZXJpYWwsXG5cdE1lc2hMYW1iZXJ0TWF0ZXJpYWw6IE1lc2hMYW1iZXJ0TWF0ZXJpYWwsXG5cdE1lc2hEZXB0aE1hdGVyaWFsOiBNZXNoRGVwdGhNYXRlcmlhbCxcblx0TWVzaERpc3RhbmNlTWF0ZXJpYWw6IE1lc2hEaXN0YW5jZU1hdGVyaWFsLFxuXHRNZXNoQmFzaWNNYXRlcmlhbDogTWVzaEJhc2ljTWF0ZXJpYWwsXG5cdExpbmVEYXNoZWRNYXRlcmlhbDogTGluZURhc2hlZE1hdGVyaWFsLFxuXHRMaW5lQmFzaWNNYXRlcmlhbDogTGluZUJhc2ljTWF0ZXJpYWwsXG5cdE1hdGVyaWFsOiBNYXRlcmlhbFxufSk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgQ2FjaGUgPSB7XG5cblx0ZW5hYmxlZDogZmFsc2UsXG5cblx0ZmlsZXM6IHt9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCBrZXksIGZpbGUgKSB7XG5cblx0XHRpZiAoIHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHQvLyBjb25zb2xlLmxvZyggJ1RIUkVFLkNhY2hlJywgJ0FkZGluZyBrZXk6Jywga2V5ICk7XG5cblx0XHR0aGlzLmZpbGVzWyBrZXkgXSA9IGZpbGU7XG5cblx0fSxcblxuXHRnZXQ6IGZ1bmN0aW9uICgga2V5ICkge1xuXG5cdFx0aWYgKCB0aGlzLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0Ly8gY29uc29sZS5sb2coICdUSFJFRS5DYWNoZScsICdDaGVja2luZyBrZXk6Jywga2V5ICk7XG5cblx0XHRyZXR1cm4gdGhpcy5maWxlc1sga2V5IF07XG5cblx0fSxcblxuXHRyZW1vdmU6IGZ1bmN0aW9uICgga2V5ICkge1xuXG5cdFx0ZGVsZXRlIHRoaXMuZmlsZXNbIGtleSBdO1xuXG5cdH0sXG5cblx0Y2xlYXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZmlsZXMgPSB7fTtcblxuXHR9XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMb2FkaW5nTWFuYWdlciggb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0dmFyIGlzTG9hZGluZyA9IGZhbHNlO1xuXHR2YXIgaXRlbXNMb2FkZWQgPSAwO1xuXHR2YXIgaXRlbXNUb3RhbCA9IDA7XG5cdHZhciB1cmxNb2RpZmllciA9IHVuZGVmaW5lZDtcblxuXHR0aGlzLm9uU3RhcnQgPSB1bmRlZmluZWQ7XG5cdHRoaXMub25Mb2FkID0gb25Mb2FkO1xuXHR0aGlzLm9uUHJvZ3Jlc3MgPSBvblByb2dyZXNzO1xuXHR0aGlzLm9uRXJyb3IgPSBvbkVycm9yO1xuXG5cdHRoaXMuaXRlbVN0YXJ0ID0gZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHRpdGVtc1RvdGFsICsrO1xuXG5cdFx0aWYgKCBpc0xvYWRpbmcgPT09IGZhbHNlICkge1xuXG5cdFx0XHRpZiAoIHNjb3BlLm9uU3RhcnQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzY29wZS5vblN0YXJ0KCB1cmwsIGl0ZW1zTG9hZGVkLCBpdGVtc1RvdGFsICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlzTG9hZGluZyA9IHRydWU7XG5cblx0fTtcblxuXHR0aGlzLml0ZW1FbmQgPSBmdW5jdGlvbiAoIHVybCApIHtcblxuXHRcdGl0ZW1zTG9hZGVkICsrO1xuXG5cdFx0aWYgKCBzY29wZS5vblByb2dyZXNzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHNjb3BlLm9uUHJvZ3Jlc3MoIHVybCwgaXRlbXNMb2FkZWQsIGl0ZW1zVG90YWwgKTtcblxuXHRcdH1cblxuXHRcdGlmICggaXRlbXNMb2FkZWQgPT09IGl0ZW1zVG90YWwgKSB7XG5cblx0XHRcdGlzTG9hZGluZyA9IGZhbHNlO1xuXG5cdFx0XHRpZiAoIHNjb3BlLm9uTG9hZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHNjb3BlLm9uTG9hZCgpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fTtcblxuXHR0aGlzLml0ZW1FcnJvciA9IGZ1bmN0aW9uICggdXJsICkge1xuXG5cdFx0aWYgKCBzY29wZS5vbkVycm9yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHNjb3BlLm9uRXJyb3IoIHVybCApO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0dGhpcy5yZXNvbHZlVVJMID0gZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHRpZiAoIHVybE1vZGlmaWVyICkge1xuXG5cdFx0XHRyZXR1cm4gdXJsTW9kaWZpZXIoIHVybCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVybDtcblxuXHR9O1xuXG5cdHRoaXMuc2V0VVJMTW9kaWZpZXIgPSBmdW5jdGlvbiAoIHRyYW5zZm9ybSApIHtcblxuXHRcdHVybE1vZGlmaWVyID0gdHJhbnNmb3JtO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH07XG5cbn1cblxudmFyIERlZmF1bHRMb2FkaW5nTWFuYWdlciA9IG5ldyBMb2FkaW5nTWFuYWdlcigpO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxudmFyIGxvYWRpbmcgPSB7fTtcblxuZnVuY3Rpb24gRmlsZUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxufVxuXG5PYmplY3QuYXNzaWduKCBGaWxlTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHRpZiAoIHVybCA9PT0gdW5kZWZpbmVkICkgdXJsID0gJyc7XG5cblx0XHRpZiAoIHRoaXMucGF0aCAhPT0gdW5kZWZpbmVkICkgdXJsID0gdGhpcy5wYXRoICsgdXJsO1xuXG5cdFx0dXJsID0gdGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwoIHVybCApO1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBjYWNoZWQgPSBDYWNoZS5nZXQoIHVybCApO1xuXG5cdFx0aWYgKCBjYWNoZWQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0XHRzZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIGNhY2hlZCApO1xuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdH0sIDAgKTtcblxuXHRcdFx0cmV0dXJuIGNhY2hlZDtcblxuXHRcdH1cblxuXHRcdC8vIENoZWNrIGlmIHJlcXVlc3QgaXMgZHVwbGljYXRlXG5cblx0XHRpZiAoIGxvYWRpbmdbIHVybCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGxvYWRpbmdbIHVybCBdLnB1c2goIHtcblxuXHRcdFx0XHRvbkxvYWQ6IG9uTG9hZCxcblx0XHRcdFx0b25Qcm9ncmVzczogb25Qcm9ncmVzcyxcblx0XHRcdFx0b25FcnJvcjogb25FcnJvclxuXG5cdFx0XHR9ICk7XG5cblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdC8vIENoZWNrIGZvciBkYXRhOiBVUklcblx0XHR2YXIgZGF0YVVyaVJlZ2V4ID0gL15kYXRhOiguKj8pKDtiYXNlNjQpPywoLiopJC87XG5cdFx0dmFyIGRhdGFVcmlSZWdleFJlc3VsdCA9IHVybC5tYXRjaCggZGF0YVVyaVJlZ2V4ICk7XG5cblx0XHQvLyBTYWZhcmkgY2FuIG5vdCBoYW5kbGUgRGF0YSBVUklzIHRocm91Z2ggWE1MSHR0cFJlcXVlc3Qgc28gcHJvY2VzcyBtYW51YWxseVxuXHRcdGlmICggZGF0YVVyaVJlZ2V4UmVzdWx0ICkge1xuXG5cdFx0XHR2YXIgbWltZVR5cGUgPSBkYXRhVXJpUmVnZXhSZXN1bHRbIDEgXTtcblx0XHRcdHZhciBpc0Jhc2U2NCA9ICEhIGRhdGFVcmlSZWdleFJlc3VsdFsgMiBdO1xuXHRcdFx0dmFyIGRhdGEgPSBkYXRhVXJpUmVnZXhSZXN1bHRbIDMgXTtcblxuXHRcdFx0ZGF0YSA9IHdpbmRvdy5kZWNvZGVVUklDb21wb25lbnQoIGRhdGEgKTtcblxuXHRcdFx0aWYgKCBpc0Jhc2U2NCApIGRhdGEgPSB3aW5kb3cuYXRvYiggZGF0YSApO1xuXG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdHZhciByZXNwb25zZTtcblx0XHRcdFx0dmFyIHJlc3BvbnNlVHlwZSA9ICggdGhpcy5yZXNwb25zZVR5cGUgfHwgJycgKS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHRcdHN3aXRjaCAoIHJlc3BvbnNlVHlwZSApIHtcblxuXHRcdFx0XHRcdGNhc2UgJ2FycmF5YnVmZmVyJzpcblx0XHRcdFx0XHRjYXNlICdibG9iJzpcblxuXHRcdFx0XHRcdFx0dmFyIHZpZXcgPSBuZXcgVWludDhBcnJheSggZGF0YS5sZW5ndGggKTtcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dmlld1sgaSBdID0gZGF0YS5jaGFyQ29kZUF0KCBpICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKCByZXNwb25zZVR5cGUgPT09ICdibG9iJyApIHtcblxuXHRcdFx0XHRcdFx0XHRyZXNwb25zZSA9IG5ldyBCbG9iKCBbIHZpZXcuYnVmZmVyIF0sIHsgdHlwZTogbWltZVR5cGUgfSApO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlID0gdmlldy5idWZmZXI7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdkb2N1bWVudCc6XG5cblx0XHRcdFx0XHRcdHZhciBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG5cdFx0XHRcdFx0XHRyZXNwb25zZSA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoIGRhdGEsIG1pbWVUeXBlICk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnanNvbic6XG5cblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gSlNPTi5wYXJzZSggZGF0YSApO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGRlZmF1bHQ6IC8vICd0ZXh0JyBvciBvdGhlclxuXG5cdFx0XHRcdFx0XHRyZXNwb25zZSA9IGRhdGE7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXYWl0IGZvciBuZXh0IGJyb3dzZXIgdGljayBsaWtlIHN0YW5kYXJkIFhNTEh0dHBSZXF1ZXN0IGV2ZW50IGRpc3BhdGNoaW5nIGRvZXNcblx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCByZXNwb25zZSApO1xuXG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0XHR9LCAwICk7XG5cblx0XHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcblxuXHRcdFx0XHQvLyBXYWl0IGZvciBuZXh0IGJyb3dzZXIgdGljayBsaWtlIHN0YW5kYXJkIFhNTEh0dHBSZXF1ZXN0IGV2ZW50IGRpc3BhdGNoaW5nIGRvZXNcblx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRcdGlmICggb25FcnJvciApIG9uRXJyb3IoIGVycm9yICk7XG5cblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblxuXHRcdFx0XHR9LCAwICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIEluaXRpYWxpc2UgYXJyYXkgZm9yIGR1cGxpY2F0ZSByZXF1ZXN0c1xuXG5cdFx0XHRsb2FkaW5nWyB1cmwgXSA9IFtdO1xuXG5cdFx0XHRsb2FkaW5nWyB1cmwgXS5wdXNoKCB7XG5cblx0XHRcdFx0b25Mb2FkOiBvbkxvYWQsXG5cdFx0XHRcdG9uUHJvZ3Jlc3M6IG9uUHJvZ3Jlc3MsXG5cdFx0XHRcdG9uRXJyb3I6IG9uRXJyb3JcblxuXHRcdFx0fSApO1xuXG5cdFx0XHR2YXIgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG5cdFx0XHRyZXF1ZXN0Lm9wZW4oICdHRVQnLCB1cmwsIHRydWUgKTtcblxuXHRcdFx0cmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCAnbG9hZCcsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRcdFx0dmFyIHJlc3BvbnNlID0gdGhpcy5yZXNwb25zZTtcblxuXHRcdFx0XHRDYWNoZS5hZGQoIHVybCwgcmVzcG9uc2UgKTtcblxuXHRcdFx0XHR2YXIgY2FsbGJhY2tzID0gbG9hZGluZ1sgdXJsIF07XG5cblx0XHRcdFx0ZGVsZXRlIGxvYWRpbmdbIHVybCBdO1xuXG5cdFx0XHRcdGlmICggdGhpcy5zdGF0dXMgPT09IDIwMCApIHtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBjYWxsYmFjayA9IGNhbGxiYWNrc1sgaSBdO1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5vbkxvYWQgKSBjYWxsYmFjay5vbkxvYWQoIHJlc3BvbnNlICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHRoaXMuc3RhdHVzID09PSAwICkge1xuXG5cdFx0XHRcdFx0Ly8gU29tZSBicm93c2VycyByZXR1cm4gSFRUUCBTdGF0dXMgMCB3aGVuIHVzaW5nIG5vbi1odHRwIHByb3RvY29sXG5cdFx0XHRcdFx0Ly8gZS5nLiAnZmlsZTovLycgb3IgJ2RhdGE6Ly8nLiBIYW5kbGUgYXMgc3VjY2Vzcy5cblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkZpbGVMb2FkZXI6IEhUVFAgU3RhdHVzIDAgcmVjZWl2ZWQuJyApO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07XG5cdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrLm9uTG9hZCApIGNhbGxiYWNrLm9uTG9hZCggcmVzcG9uc2UgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBjYWxsYmFjayA9IGNhbGxiYWNrc1sgaSBdO1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5vbkVycm9yICkgY2FsbGJhY2sub25FcnJvciggZXZlbnQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSwgZmFsc2UgKTtcblxuXHRcdFx0cmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCAncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0XHRcdHZhciBjYWxsYmFja3MgPSBsb2FkaW5nWyB1cmwgXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07XG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5vblByb2dyZXNzICkgY2FsbGJhY2sub25Qcm9ncmVzcyggZXZlbnQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sIGZhbHNlICk7XG5cblx0XHRcdHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lciggJ2Vycm9yJywgZnVuY3Rpb24gKCBldmVudCApIHtcblxuXHRcdFx0XHR2YXIgY2FsbGJhY2tzID0gbG9hZGluZ1sgdXJsIF07XG5cblx0XHRcdFx0ZGVsZXRlIGxvYWRpbmdbIHVybCBdO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgY2FsbGJhY2sgPSBjYWxsYmFja3NbIGkgXTtcblx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrLm9uRXJyb3IgKSBjYWxsYmFjay5vbkVycm9yKCBldmVudCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XG5cblx0XHRcdH0sIGZhbHNlICk7XG5cblx0XHRcdGlmICggdGhpcy5yZXNwb25zZVR5cGUgIT09IHVuZGVmaW5lZCApIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gdGhpcy5yZXNwb25zZVR5cGU7XG5cdFx0XHRpZiAoIHRoaXMud2l0aENyZWRlbnRpYWxzICE9PSB1bmRlZmluZWQgKSByZXF1ZXN0LndpdGhDcmVkZW50aWFscyA9IHRoaXMud2l0aENyZWRlbnRpYWxzO1xuXG5cdFx0XHRpZiAoIHJlcXVlc3Qub3ZlcnJpZGVNaW1lVHlwZSApIHJlcXVlc3Qub3ZlcnJpZGVNaW1lVHlwZSggdGhpcy5taW1lVHlwZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5taW1lVHlwZSA6ICd0ZXh0L3BsYWluJyApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaGVhZGVyIGluIHRoaXMucmVxdWVzdEhlYWRlciApIHtcblxuXHRcdFx0XHRyZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoIGhlYWRlciwgdGhpcy5yZXF1ZXN0SGVhZGVyWyBoZWFkZXIgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJlcXVlc3Quc2VuZCggbnVsbCApO1xuXG5cdFx0fVxuXG5cdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0cmV0dXJuIHJlcXVlc3Q7XG5cblx0fSxcblxuXHRzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYXRoID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRSZXNwb25zZVR5cGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnJlc3BvbnNlVHlwZSA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0V2l0aENyZWRlbnRpYWxzOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy53aXRoQ3JlZGVudGlhbHMgPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldE1pbWVUeXBlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5taW1lVHlwZSA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucmVxdWVzdEhlYWRlciA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKlxuICogQWJzdHJhY3QgQmFzZSBjbGFzcyB0byBibG9jayBiYXNlZCB0ZXh0dXJlcyBsb2FkZXIgKGRkcywgcHZyLCAuLi4pXG4gKi9cblxuZnVuY3Rpb24gQ29tcHJlc3NlZFRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cblx0Ly8gb3ZlcnJpZGUgaW4gc3ViIGNsYXNzZXNcblx0dGhpcy5fcGFyc2VyID0gbnVsbDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBDb21wcmVzc2VkVGV4dHVyZUxvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBpbWFnZXMgPSBbXTtcblxuXHRcdHZhciB0ZXh0dXJlID0gbmV3IENvbXByZXNzZWRUZXh0dXJlKCk7XG5cdFx0dGV4dHVyZS5pbWFnZSA9IGltYWdlcztcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXHRcdGxvYWRlci5zZXRSZXNwb25zZVR5cGUoICdhcnJheWJ1ZmZlcicgKTtcblxuXHRcdGZ1bmN0aW9uIGxvYWRUZXh0dXJlKCBpICkge1xuXG5cdFx0XHRsb2FkZXIubG9hZCggdXJsWyBpIF0sIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0XHRcdHZhciB0ZXhEYXRhcyA9IHNjb3BlLl9wYXJzZXIoIGJ1ZmZlciwgdHJ1ZSApO1xuXG5cdFx0XHRcdGltYWdlc1sgaSBdID0ge1xuXHRcdFx0XHRcdHdpZHRoOiB0ZXhEYXRhcy53aWR0aCxcblx0XHRcdFx0XHRoZWlnaHQ6IHRleERhdGFzLmhlaWdodCxcblx0XHRcdFx0XHRmb3JtYXQ6IHRleERhdGFzLmZvcm1hdCxcblx0XHRcdFx0XHRtaXBtYXBzOiB0ZXhEYXRhcy5taXBtYXBzXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0bG9hZGVkICs9IDE7XG5cblx0XHRcdFx0aWYgKCBsb2FkZWQgPT09IDYgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHRleERhdGFzLm1pcG1hcENvdW50ID09PSAxIClcblx0XHRcdFx0XHRcdHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyRmlsdGVyO1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7XG5cdFx0XHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggdGV4dHVyZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB1cmwgKSApIHtcblxuXHRcdFx0dmFyIGxvYWRlZCA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB1cmwubGVuZ3RoOyBpIDwgaWw7ICsrIGkgKSB7XG5cblx0XHRcdFx0bG9hZFRleHR1cmUoIGkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gY29tcHJlc3NlZCBjdWJlbWFwIHRleHR1cmUgc3RvcmVkIGluIGEgc2luZ2xlIEREUyBmaWxlXG5cblx0XHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0XHRcdHZhciB0ZXhEYXRhcyA9IHNjb3BlLl9wYXJzZXIoIGJ1ZmZlciwgdHJ1ZSApO1xuXG5cdFx0XHRcdGlmICggdGV4RGF0YXMuaXNDdWJlbWFwICkge1xuXG5cdFx0XHRcdFx0dmFyIGZhY2VzID0gdGV4RGF0YXMubWlwbWFwcy5sZW5ndGggLyB0ZXhEYXRhcy5taXBtYXBDb3VudDtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBmID0gMDsgZiA8IGZhY2VzOyBmICsrICkge1xuXG5cdFx0XHRcdFx0XHRpbWFnZXNbIGYgXSA9IHsgbWlwbWFwczogW10gfTtcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGV4RGF0YXMubWlwbWFwQ291bnQ7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0aW1hZ2VzWyBmIF0ubWlwbWFwcy5wdXNoKCB0ZXhEYXRhcy5taXBtYXBzWyBmICogdGV4RGF0YXMubWlwbWFwQ291bnQgKyBpIF0gKTtcblx0XHRcdFx0XHRcdFx0aW1hZ2VzWyBmIF0uZm9ybWF0ID0gdGV4RGF0YXMuZm9ybWF0O1xuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS53aWR0aCA9IHRleERhdGFzLndpZHRoO1xuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS5oZWlnaHQgPSB0ZXhEYXRhcy5oZWlnaHQ7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5pbWFnZS53aWR0aCA9IHRleERhdGFzLndpZHRoO1xuXHRcdFx0XHRcdHRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gdGV4RGF0YXMuaGVpZ2h0O1xuXHRcdFx0XHRcdHRleHR1cmUubWlwbWFwcyA9IHRleERhdGFzLm1pcG1hcHM7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdGV4RGF0YXMubWlwbWFwQ291bnQgPT09IDEgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7XG5cdFx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlICk7XG5cblx0XHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgTmlrb3MgTS4gLyBodHRwczovL2dpdGh1Yi5jb20vZm9vMTIzL1xuICpcbiAqIEFic3RyYWN0IEJhc2UgY2xhc3MgdG8gbG9hZCBnZW5lcmljIGJpbmFyeSB0ZXh0dXJlcyBmb3JtYXRzIChyZ2JlLCBoZHIsIC4uLilcbiAqL1xuXG5mdW5jdGlvbiBEYXRhVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxuXHQvLyBvdmVycmlkZSBpbiBzdWIgY2xhc3Nlc1xuXHR0aGlzLl9wYXJzZXIgPSBudWxsO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIERhdGFUZXh0dXJlTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIHRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoKTtcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFJlc3BvbnNlVHlwZSggJ2FycmF5YnVmZmVyJyApO1xuXG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBidWZmZXIgKSB7XG5cblx0XHRcdHZhciB0ZXhEYXRhID0gc2NvcGUuX3BhcnNlciggYnVmZmVyICk7XG5cblx0XHRcdGlmICggISB0ZXhEYXRhICkgcmV0dXJuO1xuXG5cdFx0XHRpZiAoIHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5pbWFnZSApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLmltYWdlID0gdGV4RGF0YS5pbWFnZTtcblxuXHRcdFx0fSBlbHNlIGlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLmRhdGEgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5pbWFnZS53aWR0aCA9IHRleERhdGEud2lkdGg7XG5cdFx0XHRcdHRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gdGV4RGF0YS5oZWlnaHQ7XG5cdFx0XHRcdHRleHR1cmUuaW1hZ2UuZGF0YSA9IHRleERhdGEuZGF0YTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlLndyYXBTID0gdW5kZWZpbmVkICE9PSB0ZXhEYXRhLndyYXBTID8gdGV4RGF0YS53cmFwUyA6IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cdFx0XHR0ZXh0dXJlLndyYXBUID0gdW5kZWZpbmVkICE9PSB0ZXhEYXRhLndyYXBUID8gdGV4RGF0YS53cmFwVCA6IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cblx0XHRcdHRleHR1cmUubWFnRmlsdGVyID0gdW5kZWZpbmVkICE9PSB0ZXhEYXRhLm1hZ0ZpbHRlciA/IHRleERhdGEubWFnRmlsdGVyIDogTGluZWFyRmlsdGVyO1xuXHRcdFx0dGV4dHVyZS5taW5GaWx0ZXIgPSB1bmRlZmluZWQgIT09IHRleERhdGEubWluRmlsdGVyID8gdGV4RGF0YS5taW5GaWx0ZXIgOiBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXI7XG5cblx0XHRcdHRleHR1cmUuYW5pc290cm9weSA9IHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5hbmlzb3Ryb3B5ID8gdGV4RGF0YS5hbmlzb3Ryb3B5IDogMTtcblxuXHRcdFx0aWYgKCB1bmRlZmluZWQgIT09IHRleERhdGEuZm9ybWF0ICkge1xuXG5cdFx0XHRcdHRleHR1cmUuZm9ybWF0ID0gdGV4RGF0YS5mb3JtYXQ7XG5cblx0XHRcdH1cblx0XHRcdGlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLnR5cGUgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS50eXBlID0gdGV4RGF0YS50eXBlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLm1pcG1hcHMgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5taXBtYXBzID0gdGV4RGF0YS5taXBtYXBzO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggMSA9PT0gdGV4RGF0YS5taXBtYXBDb3VudCApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUsIHRleERhdGEgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBJbWFnZUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxufVxuXG5PYmplY3QuYXNzaWduKCBJbWFnZUxvYWRlci5wcm90b3R5cGUsIHtcblxuXHRjcm9zc09yaWdpbjogJ0Fub255bW91cycsXG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGlmICggdXJsID09PSB1bmRlZmluZWQgKSB1cmwgPSAnJztcblxuXHRcdGlmICggdGhpcy5wYXRoICE9PSB1bmRlZmluZWQgKSB1cmwgPSB0aGlzLnBhdGggKyB1cmw7XG5cblx0XHR1cmwgPSB0aGlzLm1hbmFnZXIucmVzb2x2ZVVSTCggdXJsICk7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGNhY2hlZCA9IENhY2hlLmdldCggdXJsICk7XG5cblx0XHRpZiAoIGNhY2hlZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggY2FjaGVkICk7XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0fSwgMCApO1xuXG5cdFx0XHRyZXR1cm4gY2FjaGVkO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdpbWcnICk7XG5cblx0XHRpbWFnZS5hZGRFdmVudExpc3RlbmVyKCAnbG9hZCcsIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Q2FjaGUuYWRkKCB1cmwsIHRoaXMgKTtcblxuXHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRoaXMgKTtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdH0sIGZhbHNlICk7XG5cblx0XHQvKlxuXHRcdGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoICdwcm9ncmVzcycsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRcdGlmICggb25Qcm9ncmVzcyApIG9uUHJvZ3Jlc3MoIGV2ZW50ICk7XG5cblx0XHR9LCBmYWxzZSApO1xuXHRcdCovXG5cblx0XHRpbWFnZS5hZGRFdmVudExpc3RlbmVyKCAnZXJyb3InLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0XHRpZiAoIG9uRXJyb3IgKSBvbkVycm9yKCBldmVudCApO1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0fSwgZmFsc2UgKTtcblxuXHRcdGlmICggdXJsLnN1YnN0ciggMCwgNSApICE9PSAnZGF0YTonICkge1xuXG5cdFx0XHRpZiAoIHRoaXMuY3Jvc3NPcmlnaW4gIT09IHVuZGVmaW5lZCApIGltYWdlLmNyb3NzT3JpZ2luID0gdGhpcy5jcm9zc09yaWdpbjtcblxuXHRcdH1cblxuXHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcblxuXHRcdGltYWdlLnNyYyA9IHVybDtcblxuXHRcdHJldHVybiBpbWFnZTtcblxuXHR9LFxuXG5cdHNldENyb3NzT3JpZ2luOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5jcm9zc09yaWdpbiA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQ3ViZVRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQ3ViZVRleHR1cmVMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0Y3Jvc3NPcmlnaW46ICdBbm9ueW1vdXMnLFxuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJscywgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHRleHR1cmUgPSBuZXcgQ3ViZVRleHR1cmUoKTtcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoIHRoaXMubWFuYWdlciApO1xuXHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xuXHRcdGxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTtcblxuXHRcdHZhciBsb2FkZWQgPSAwO1xuXG5cdFx0ZnVuY3Rpb24gbG9hZFRleHR1cmUoIGkgKSB7XG5cblx0XHRcdGxvYWRlci5sb2FkKCB1cmxzWyBpIF0sIGZ1bmN0aW9uICggaW1hZ2UgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5pbWFnZXNbIGkgXSA9IGltYWdlO1xuXG5cdFx0XHRcdGxvYWRlZCArKztcblxuXHRcdFx0XHRpZiAoIGxvYWRlZCA9PT0gNiApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sIHVuZGVmaW5lZCwgb25FcnJvciApO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7ICsrIGkgKSB7XG5cblx0XHRcdGxvYWRUZXh0dXJlKCBpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGV4dHVyZTtcblxuXHR9LFxuXG5cdHNldENyb3NzT3JpZ2luOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5jcm9zc09yaWdpbiA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxufVxuXG5PYmplY3QuYXNzaWduKCBUZXh0dXJlTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGNyb3NzT3JpZ2luOiAnQW5vbnltb3VzJyxcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHRleHR1cmUgPSBuZXcgVGV4dHVyZSgpO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBpbWFnZSApIHtcblxuXHRcdFx0dGV4dHVyZS5pbWFnZSA9IGltYWdlO1xuXG5cdFx0XHQvLyBKUEVHcyBjYW4ndCBoYXZlIGFuIGFscGhhIGNoYW5uZWwsIHNvIG1lbW9yeSBjYW4gYmUgc2F2ZWQgYnkgc3RvcmluZyB0aGVtIGFzIFJHQi5cblx0XHRcdHZhciBpc0pQRUcgPSB1cmwuc2VhcmNoKCAvXFwuKGpwZ3xqcGVnKSQvICkgPiAwIHx8IHVybC5zZWFyY2goIC9eZGF0YVxcOmltYWdlXFwvanBlZy8gKSA9PT0gMDtcblxuXHRcdFx0dGV4dHVyZS5mb3JtYXQgPSBpc0pQRUcgPyBSR0JGb3JtYXQgOiBSR0JBRm9ybWF0O1xuXHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdGlmICggb25Mb2FkICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0b25Mb2FkKCB0ZXh0dXJlICk7XG5cblx0XHRcdH1cblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH0sXG5cblx0c2V0Q3Jvc3NPcmlnaW46IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmNyb3NzT3JpZ2luID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYXRoID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogRXh0ZW5zaWJsZSBjdXJ2ZSBvYmplY3RcbiAqXG4gKiBTb21lIGNvbW1vbiBvZiBjdXJ2ZSBtZXRob2RzOlxuICogLmdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCApLCAuZ2V0VGFuZ2VudCggdCApXG4gKiAuZ2V0UG9pbnRBdCggdSwgb3B0aW9uYWxUYXJnZXQgKSwgLmdldFRhbmdlbnRBdCggdSApXG4gKiAuZ2V0UG9pbnRzKCksIC5nZXRTcGFjZWRQb2ludHMoKVxuICogLmdldExlbmd0aCgpXG4gKiAudXBkYXRlQXJjTGVuZ3RocygpXG4gKlxuICogVGhpcyBmb2xsb3dpbmcgY3VydmVzIGluaGVyaXQgZnJvbSBUSFJFRS5DdXJ2ZTpcbiAqXG4gKiAtLSAyRCBjdXJ2ZXMgLS1cbiAqIFRIUkVFLkFyY0N1cnZlXG4gKiBUSFJFRS5DdWJpY0JlemllckN1cnZlXG4gKiBUSFJFRS5FbGxpcHNlQ3VydmVcbiAqIFRIUkVFLkxpbmVDdXJ2ZVxuICogVEhSRUUuUXVhZHJhdGljQmV6aWVyQ3VydmVcbiAqIFRIUkVFLlNwbGluZUN1cnZlXG4gKlxuICogLS0gM0QgY3VydmVzIC0tXG4gKiBUSFJFRS5DYXRtdWxsUm9tQ3VydmUzXG4gKiBUSFJFRS5DdWJpY0JlemllckN1cnZlM1xuICogVEhSRUUuTGluZUN1cnZlM1xuICogVEhSRUUuUXVhZHJhdGljQmV6aWVyQ3VydmUzXG4gKlxuICogQSBzZXJpZXMgb2YgY3VydmVzIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFRIUkVFLkN1cnZlUGF0aC5cbiAqXG4gKiovXG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICpcdEFic3RyYWN0IEN1cnZlIGJhc2UgY2xhc3NcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuZnVuY3Rpb24gQ3VydmUoKSB7XG5cblx0dGhpcy50eXBlID0gJ0N1cnZlJztcblxuXHR0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IDIwMDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBDdXJ2ZS5wcm90b3R5cGUsIHtcblxuXHQvLyBWaXJ0dWFsIGJhc2UgY2xhc3MgbWV0aG9kIHRvIG92ZXJ3cml0ZSBhbmQgaW1wbGVtZW50IGluIHN1YmNsYXNzZXNcblx0Ly9cdC0gdCBbMCAuLiAxXVxuXG5cdGdldFBvaW50OiBmdW5jdGlvbiAoIC8qIHQsIG9wdGlvbmFsVGFyZ2V0ICovICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmU6IC5nZXRQb2ludCgpIG5vdCBpbXBsZW1lbnRlZC4nICk7XG5cdFx0cmV0dXJuIG51bGw7XG5cblx0fSxcblxuXHQvLyBHZXQgcG9pbnQgYXQgcmVsYXRpdmUgcG9zaXRpb24gaW4gY3VydmUgYWNjb3JkaW5nIHRvIGFyYyBsZW5ndGhcblx0Ly8gLSB1IFswIC4uIDFdXG5cblx0Z2V0UG9pbnRBdDogZnVuY3Rpb24gKCB1LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciB0ID0gdGhpcy5nZXRVdG9UbWFwcGluZyggdSApO1xuXHRcdHJldHVybiB0aGlzLmdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCApO1xuXG5cdH0sXG5cblx0Ly8gR2V0IHNlcXVlbmNlIG9mIHBvaW50cyB1c2luZyBnZXRQb2ludCggdCApXG5cblx0Z2V0UG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSA1O1xuXG5cdFx0dmFyIHBvaW50cyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGQgPSAwOyBkIDw9IGRpdmlzaW9uczsgZCArKyApIHtcblxuXHRcdFx0cG9pbnRzLnB1c2goIHRoaXMuZ2V0UG9pbnQoIGQgLyBkaXZpc2lvbnMgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50cztcblxuXHR9LFxuXG5cdC8vIEdldCBzZXF1ZW5jZSBvZiBwb2ludHMgdXNpbmcgZ2V0UG9pbnRBdCggdSApXG5cblx0Z2V0U3BhY2VkUG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSA1O1xuXG5cdFx0dmFyIHBvaW50cyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGQgPSAwOyBkIDw9IGRpdmlzaW9uczsgZCArKyApIHtcblxuXHRcdFx0cG9pbnRzLnB1c2goIHRoaXMuZ2V0UG9pbnRBdCggZCAvIGRpdmlzaW9ucyApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcG9pbnRzO1xuXG5cdH0sXG5cblx0Ly8gR2V0IHRvdGFsIGN1cnZlIGFyYyBsZW5ndGhcblxuXHRnZXRMZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBsZW5ndGhzID0gdGhpcy5nZXRMZW5ndGhzKCk7XG5cdFx0cmV0dXJuIGxlbmd0aHNbIGxlbmd0aHMubGVuZ3RoIC0gMSBdO1xuXG5cdH0sXG5cblx0Ly8gR2V0IGxpc3Qgb2YgY3VtdWxhdGl2ZSBzZWdtZW50IGxlbmd0aHNcblxuXHRnZXRMZW5ndGhzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucztcblxuXHRcdGlmICggdGhpcy5jYWNoZUFyY0xlbmd0aHMgJiZcblx0XHRcdCggdGhpcy5jYWNoZUFyY0xlbmd0aHMubGVuZ3RoID09PSBkaXZpc2lvbnMgKyAxICkgJiZcblx0XHRcdCEgdGhpcy5uZWVkc1VwZGF0ZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0dmFyIGNhY2hlID0gW107XG5cdFx0dmFyIGN1cnJlbnQsIGxhc3QgPSB0aGlzLmdldFBvaW50KCAwICk7XG5cdFx0dmFyIHAsIHN1bSA9IDA7XG5cblx0XHRjYWNoZS5wdXNoKCAwICk7XG5cblx0XHRmb3IgKCBwID0gMTsgcCA8PSBkaXZpc2lvbnM7IHAgKysgKSB7XG5cblx0XHRcdGN1cnJlbnQgPSB0aGlzLmdldFBvaW50KCBwIC8gZGl2aXNpb25zICk7XG5cdFx0XHRzdW0gKz0gY3VycmVudC5kaXN0YW5jZVRvKCBsYXN0ICk7XG5cdFx0XHRjYWNoZS5wdXNoKCBzdW0gKTtcblx0XHRcdGxhc3QgPSBjdXJyZW50O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jYWNoZUFyY0xlbmd0aHMgPSBjYWNoZTtcblxuXHRcdHJldHVybiBjYWNoZTsgLy8geyBzdW1zOiBjYWNoZSwgc3VtOiBzdW0gfTsgU3VtIGlzIGluIHRoZSBsYXN0IGVsZW1lbnQuXG5cblx0fSxcblxuXHR1cGRhdGVBcmNMZW5ndGhzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblx0XHR0aGlzLmdldExlbmd0aHMoKTtcblxuXHR9LFxuXG5cdC8vIEdpdmVuIHUgKCAwIC4uIDEgKSwgZ2V0IGEgdCB0byBmaW5kIHAuIFRoaXMgZ2l2ZXMgeW91IHBvaW50cyB3aGljaCBhcmUgZXF1aWRpc3RhbnRcblxuXHRnZXRVdG9UbWFwcGluZzogZnVuY3Rpb24gKCB1LCBkaXN0YW5jZSApIHtcblxuXHRcdHZhciBhcmNMZW5ndGhzID0gdGhpcy5nZXRMZW5ndGhzKCk7XG5cblx0XHR2YXIgaSA9IDAsIGlsID0gYXJjTGVuZ3Rocy5sZW5ndGg7XG5cblx0XHR2YXIgdGFyZ2V0QXJjTGVuZ3RoOyAvLyBUaGUgdGFyZ2V0ZWQgdSBkaXN0YW5jZSB2YWx1ZSB0byBnZXRcblxuXHRcdGlmICggZGlzdGFuY2UgKSB7XG5cblx0XHRcdHRhcmdldEFyY0xlbmd0aCA9IGRpc3RhbmNlO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGFyZ2V0QXJjTGVuZ3RoID0gdSAqIGFyY0xlbmd0aHNbIGlsIC0gMSBdO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYmluYXJ5IHNlYXJjaCBmb3IgdGhlIGluZGV4IHdpdGggbGFyZ2VzdCB2YWx1ZSBzbWFsbGVyIHRoYW4gdGFyZ2V0IHUgZGlzdGFuY2VcblxuXHRcdHZhciBsb3cgPSAwLCBoaWdoID0gaWwgLSAxLCBjb21wYXJpc29uO1xuXG5cdFx0d2hpbGUgKCBsb3cgPD0gaGlnaCApIHtcblxuXHRcdFx0aSA9IE1hdGguZmxvb3IoIGxvdyArICggaGlnaCAtIGxvdyApIC8gMiApOyAvLyBsZXNzIGxpa2VseSB0byBvdmVyZmxvdywgdGhvdWdoIHByb2JhYmx5IG5vdCBpc3N1ZSBoZXJlLCBKUyBkb2Vzbid0IHJlYWxseSBoYXZlIGludGVnZXJzLCBhbGwgbnVtYmVycyBhcmUgZmxvYXRzXG5cblx0XHRcdGNvbXBhcmlzb24gPSBhcmNMZW5ndGhzWyBpIF0gLSB0YXJnZXRBcmNMZW5ndGg7XG5cblx0XHRcdGlmICggY29tcGFyaXNvbiA8IDAgKSB7XG5cblx0XHRcdFx0bG93ID0gaSArIDE7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGNvbXBhcmlzb24gPiAwICkge1xuXG5cdFx0XHRcdGhpZ2ggPSBpIC0gMTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRoaWdoID0gaTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Ly8gRE9ORVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpID0gaGlnaDtcblxuXHRcdGlmICggYXJjTGVuZ3Roc1sgaSBdID09PSB0YXJnZXRBcmNMZW5ndGggKSB7XG5cblx0XHRcdHJldHVybiBpIC8gKCBpbCAtIDEgKTtcblxuXHRcdH1cblxuXHRcdC8vIHdlIGNvdWxkIGdldCBmaW5lciBncmFpbiBhdCBsZW5ndGhzLCBvciB1c2Ugc2ltcGxlIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gcG9pbnRzXG5cblx0XHR2YXIgbGVuZ3RoQmVmb3JlID0gYXJjTGVuZ3Roc1sgaSBdO1xuXHRcdHZhciBsZW5ndGhBZnRlciA9IGFyY0xlbmd0aHNbIGkgKyAxIF07XG5cblx0XHR2YXIgc2VnbWVudExlbmd0aCA9IGxlbmd0aEFmdGVyIC0gbGVuZ3RoQmVmb3JlO1xuXG5cdFx0Ly8gZGV0ZXJtaW5lIHdoZXJlIHdlIGFyZSBiZXR3ZWVuIHRoZSAnYmVmb3JlJyBhbmQgJ2FmdGVyJyBwb2ludHNcblxuXHRcdHZhciBzZWdtZW50RnJhY3Rpb24gPSAoIHRhcmdldEFyY0xlbmd0aCAtIGxlbmd0aEJlZm9yZSApIC8gc2VnbWVudExlbmd0aDtcblxuXHRcdC8vIGFkZCB0aGF0IGZyYWN0aW9uYWwgYW1vdW50IHRvIHRcblxuXHRcdHZhciB0ID0gKCBpICsgc2VnbWVudEZyYWN0aW9uICkgLyAoIGlsIC0gMSApO1xuXG5cdFx0cmV0dXJuIHQ7XG5cblx0fSxcblxuXHQvLyBSZXR1cm5zIGEgdW5pdCB2ZWN0b3IgdGFuZ2VudCBhdCB0XG5cdC8vIEluIGNhc2UgYW55IHN1YiBjdXJ2ZSBkb2VzIG5vdCBpbXBsZW1lbnQgaXRzIHRhbmdlbnQgZGVyaXZhdGlvbixcblx0Ly8gMiBwb2ludHMgYSBzbWFsbCBkZWx0YSBhcGFydCB3aWxsIGJlIHVzZWQgdG8gZmluZCBpdHMgZ3JhZGllbnRcblx0Ly8gd2hpY2ggc2VlbXMgdG8gZ2l2ZSBhIHJlYXNvbmFibGUgYXBwcm94aW1hdGlvblxuXG5cdGdldFRhbmdlbnQ6IGZ1bmN0aW9uICggdCApIHtcblxuXHRcdHZhciBkZWx0YSA9IDAuMDAwMTtcblx0XHR2YXIgdDEgPSB0IC0gZGVsdGE7XG5cdFx0dmFyIHQyID0gdCArIGRlbHRhO1xuXG5cdFx0Ly8gQ2FwcGluZyBpbiBjYXNlIG9mIGRhbmdlclxuXG5cdFx0aWYgKCB0MSA8IDAgKSB0MSA9IDA7XG5cdFx0aWYgKCB0MiA+IDEgKSB0MiA9IDE7XG5cblx0XHR2YXIgcHQxID0gdGhpcy5nZXRQb2ludCggdDEgKTtcblx0XHR2YXIgcHQyID0gdGhpcy5nZXRQb2ludCggdDIgKTtcblxuXHRcdHZhciB2ZWMgPSBwdDIuY2xvbmUoKS5zdWIoIHB0MSApO1xuXHRcdHJldHVybiB2ZWMubm9ybWFsaXplKCk7XG5cblx0fSxcblxuXHRnZXRUYW5nZW50QXQ6IGZ1bmN0aW9uICggdSApIHtcblxuXHRcdHZhciB0ID0gdGhpcy5nZXRVdG9UbWFwcGluZyggdSApO1xuXHRcdHJldHVybiB0aGlzLmdldFRhbmdlbnQoIHQgKTtcblxuXHR9LFxuXG5cdGNvbXB1dGVGcmVuZXRGcmFtZXM6IGZ1bmN0aW9uICggc2VnbWVudHMsIGNsb3NlZCApIHtcblxuXHRcdC8vIHNlZSBodHRwOi8vd3d3LmNzLmluZGlhbmEuZWR1L3B1Yi90ZWNocmVwb3J0cy9UUjQyNS5wZGZcblxuXHRcdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIHRhbmdlbnRzID0gW107XG5cdFx0dmFyIG5vcm1hbHMgPSBbXTtcblx0XHR2YXIgYmlub3JtYWxzID0gW107XG5cblx0XHR2YXIgdmVjID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbWF0ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHZhciBpLCB1LCB0aGV0YTtcblxuXHRcdC8vIGNvbXB1dGUgdGhlIHRhbmdlbnQgdmVjdG9ycyBmb3IgZWFjaCBzZWdtZW50IG9uIHRoZSBjdXJ2ZVxuXG5cdFx0Zm9yICggaSA9IDA7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdHUgPSBpIC8gc2VnbWVudHM7XG5cblx0XHRcdHRhbmdlbnRzWyBpIF0gPSB0aGlzLmdldFRhbmdlbnRBdCggdSApO1xuXHRcdFx0dGFuZ2VudHNbIGkgXS5ub3JtYWxpemUoKTtcblxuXHRcdH1cblxuXHRcdC8vIHNlbGVjdCBhbiBpbml0aWFsIG5vcm1hbCB2ZWN0b3IgcGVycGVuZGljdWxhciB0byB0aGUgZmlyc3QgdGFuZ2VudCB2ZWN0b3IsXG5cdFx0Ly8gYW5kIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIG1pbmltdW0gdGFuZ2VudCB4eXogY29tcG9uZW50XG5cblx0XHRub3JtYWxzWyAwIF0gPSBuZXcgVmVjdG9yMygpO1xuXHRcdGJpbm9ybWFsc1sgMCBdID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbWluID0gTnVtYmVyLk1BWF9WQUxVRTtcblx0XHR2YXIgdHggPSBNYXRoLmFicyggdGFuZ2VudHNbIDAgXS54ICk7XG5cdFx0dmFyIHR5ID0gTWF0aC5hYnMoIHRhbmdlbnRzWyAwIF0ueSApO1xuXHRcdHZhciB0eiA9IE1hdGguYWJzKCB0YW5nZW50c1sgMCBdLnogKTtcblxuXHRcdGlmICggdHggPD0gbWluICkge1xuXG5cdFx0XHRtaW4gPSB0eDtcblx0XHRcdG5vcm1hbC5zZXQoIDEsIDAsIDAgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdHkgPD0gbWluICkge1xuXG5cdFx0XHRtaW4gPSB0eTtcblx0XHRcdG5vcm1hbC5zZXQoIDAsIDEsIDAgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdHogPD0gbWluICkge1xuXG5cdFx0XHRub3JtYWwuc2V0KCAwLCAwLCAxICk7XG5cblx0XHR9XG5cblx0XHR2ZWMuY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgMCBdLCBub3JtYWwgKS5ub3JtYWxpemUoKTtcblxuXHRcdG5vcm1hbHNbIDAgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyAwIF0sIHZlYyApO1xuXHRcdGJpbm9ybWFsc1sgMCBdLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIDAgXSwgbm9ybWFsc1sgMCBdICk7XG5cblxuXHRcdC8vIGNvbXB1dGUgdGhlIHNsb3dseS12YXJ5aW5nIG5vcm1hbCBhbmQgYmlub3JtYWwgdmVjdG9ycyBmb3IgZWFjaCBzZWdtZW50IG9uIHRoZSBjdXJ2ZVxuXG5cdFx0Zm9yICggaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdG5vcm1hbHNbIGkgXSA9IG5vcm1hbHNbIGkgLSAxIF0uY2xvbmUoKTtcblxuXHRcdFx0Ymlub3JtYWxzWyBpIF0gPSBiaW5vcm1hbHNbIGkgLSAxIF0uY2xvbmUoKTtcblxuXHRcdFx0dmVjLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIGkgLSAxIF0sIHRhbmdlbnRzWyBpIF0gKTtcblxuXHRcdFx0aWYgKCB2ZWMubGVuZ3RoKCkgPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHR2ZWMubm9ybWFsaXplKCk7XG5cblx0XHRcdFx0dGhldGEgPSBNYXRoLmFjb3MoIF9NYXRoLmNsYW1wKCB0YW5nZW50c1sgaSAtIDEgXS5kb3QoIHRhbmdlbnRzWyBpIF0gKSwgLSAxLCAxICkgKTsgLy8gY2xhbXAgZm9yIGZsb2F0aW5nIHB0IGVycm9yc1xuXG5cdFx0XHRcdG5vcm1hbHNbIGkgXS5hcHBseU1hdHJpeDQoIG1hdC5tYWtlUm90YXRpb25BeGlzKCB2ZWMsIHRoZXRhICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRiaW5vcm1hbHNbIGkgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyBpIF0sIG5vcm1hbHNbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gaWYgdGhlIGN1cnZlIGlzIGNsb3NlZCwgcG9zdHByb2Nlc3MgdGhlIHZlY3RvcnMgc28gdGhlIGZpcnN0IGFuZCBsYXN0IG5vcm1hbCB2ZWN0b3JzIGFyZSB0aGUgc2FtZVxuXG5cdFx0aWYgKCBjbG9zZWQgPT09IHRydWUgKSB7XG5cblx0XHRcdHRoZXRhID0gTWF0aC5hY29zKCBfTWF0aC5jbGFtcCggbm9ybWFsc1sgMCBdLmRvdCggbm9ybWFsc1sgc2VnbWVudHMgXSApLCAtIDEsIDEgKSApO1xuXHRcdFx0dGhldGEgLz0gc2VnbWVudHM7XG5cblx0XHRcdGlmICggdGFuZ2VudHNbIDAgXS5kb3QoIHZlYy5jcm9zc1ZlY3RvcnMoIG5vcm1hbHNbIDAgXSwgbm9ybWFsc1sgc2VnbWVudHMgXSApICkgPiAwICkge1xuXG5cdFx0XHRcdHRoZXRhID0gLSB0aGV0YTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCBpID0gMTsgaSA8PSBzZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0XHQvLyB0d2lzdCBhIGxpdHRsZS4uLlxuXHRcdFx0XHRub3JtYWxzWyBpIF0uYXBwbHlNYXRyaXg0KCBtYXQubWFrZVJvdGF0aW9uQXhpcyggdGFuZ2VudHNbIGkgXSwgdGhldGEgKiBpICkgKTtcblx0XHRcdFx0Ymlub3JtYWxzWyBpIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgaSBdLCBub3JtYWxzWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhbmdlbnRzOiB0YW5nZW50cyxcblx0XHRcdG5vcm1hbHM6IG5vcm1hbHMsXG5cdFx0XHRiaW5vcm1hbHM6IGJpbm9ybWFsc1xuXHRcdH07XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IHNvdXJjZS5hcmNMZW5ndGhEaXZpc2lvbnM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGRhdGEgPSB7XG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdDdXJ2ZScsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ0N1cnZlLnRvSlNPTidcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0ZGF0YS5hcmNMZW5ndGhEaXZpc2lvbnMgPSB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucztcblx0XHRkYXRhLnR5cGUgPSB0aGlzLnR5cGU7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9LFxuXG5cdGZyb21KU09OOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IGpzb24uYXJjTGVuZ3RoRGl2aXNpb25zO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbmZ1bmN0aW9uIEVsbGlwc2VDdXJ2ZSggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdFbGxpcHNlQ3VydmUnO1xuXG5cdHRoaXMuYVggPSBhWCB8fCAwO1xuXHR0aGlzLmFZID0gYVkgfHwgMDtcblxuXHR0aGlzLnhSYWRpdXMgPSB4UmFkaXVzIHx8IDE7XG5cdHRoaXMueVJhZGl1cyA9IHlSYWRpdXMgfHwgMTtcblxuXHR0aGlzLmFTdGFydEFuZ2xlID0gYVN0YXJ0QW5nbGUgfHwgMDtcblx0dGhpcy5hRW5kQW5nbGUgPSBhRW5kQW5nbGUgfHwgMiAqIE1hdGguUEk7XG5cblx0dGhpcy5hQ2xvY2t3aXNlID0gYUNsb2Nrd2lzZSB8fCBmYWxzZTtcblxuXHR0aGlzLmFSb3RhdGlvbiA9IGFSb3RhdGlvbiB8fCAwO1xuXG59XG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBFbGxpcHNlQ3VydmU7XG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuaXNFbGxpcHNlQ3VydmUgPSB0cnVlO1xuXG5FbGxpcHNlQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXG5cdHZhciB0d29QaSA9IE1hdGguUEkgKiAyO1xuXHR2YXIgZGVsdGFBbmdsZSA9IHRoaXMuYUVuZEFuZ2xlIC0gdGhpcy5hU3RhcnRBbmdsZTtcblx0dmFyIHNhbWVQb2ludHMgPSBNYXRoLmFicyggZGVsdGFBbmdsZSApIDwgTnVtYmVyLkVQU0lMT047XG5cblx0Ly8gZW5zdXJlcyB0aGF0IGRlbHRhQW5nbGUgaXMgMCAuLiAyIFBJXG5cdHdoaWxlICggZGVsdGFBbmdsZSA8IDAgKSBkZWx0YUFuZ2xlICs9IHR3b1BpO1xuXHR3aGlsZSAoIGRlbHRhQW5nbGUgPiB0d29QaSApIGRlbHRhQW5nbGUgLT0gdHdvUGk7XG5cblx0aWYgKCBkZWx0YUFuZ2xlIDwgTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRpZiAoIHNhbWVQb2ludHMgKSB7XG5cblx0XHRcdGRlbHRhQW5nbGUgPSAwO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGVsdGFBbmdsZSA9IHR3b1BpO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRpZiAoIHRoaXMuYUNsb2Nrd2lzZSA9PT0gdHJ1ZSAmJiAhIHNhbWVQb2ludHMgKSB7XG5cblx0XHRpZiAoIGRlbHRhQW5nbGUgPT09IHR3b1BpICkge1xuXG5cdFx0XHRkZWx0YUFuZ2xlID0gLSB0d29QaTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGRlbHRhQW5nbGUgPSBkZWx0YUFuZ2xlIC0gdHdvUGk7XG5cblx0XHR9XG5cblx0fVxuXG5cdHZhciBhbmdsZSA9IHRoaXMuYVN0YXJ0QW5nbGUgKyB0ICogZGVsdGFBbmdsZTtcblx0dmFyIHggPSB0aGlzLmFYICsgdGhpcy54UmFkaXVzICogTWF0aC5jb3MoIGFuZ2xlICk7XG5cdHZhciB5ID0gdGhpcy5hWSArIHRoaXMueVJhZGl1cyAqIE1hdGguc2luKCBhbmdsZSApO1xuXG5cdGlmICggdGhpcy5hUm90YXRpb24gIT09IDAgKSB7XG5cblx0XHR2YXIgY29zID0gTWF0aC5jb3MoIHRoaXMuYVJvdGF0aW9uICk7XG5cdFx0dmFyIHNpbiA9IE1hdGguc2luKCB0aGlzLmFSb3RhdGlvbiApO1xuXG5cdFx0dmFyIHR4ID0geCAtIHRoaXMuYVg7XG5cdFx0dmFyIHR5ID0geSAtIHRoaXMuYVk7XG5cblx0XHQvLyBSb3RhdGUgdGhlIHBvaW50IGFib3V0IHRoZSBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuXG5cdFx0eCA9IHR4ICogY29zIC0gdHkgKiBzaW4gKyB0aGlzLmFYO1xuXHRcdHkgPSB0eCAqIHNpbiArIHR5ICogY29zICsgdGhpcy5hWTtcblxuXHR9XG5cblx0cmV0dXJuIHBvaW50LnNldCggeCwgeSApO1xuXG59O1xuXG5FbGxpcHNlQ3VydmUucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmFYID0gc291cmNlLmFYO1xuXHR0aGlzLmFZID0gc291cmNlLmFZO1xuXG5cdHRoaXMueFJhZGl1cyA9IHNvdXJjZS54UmFkaXVzO1xuXHR0aGlzLnlSYWRpdXMgPSBzb3VyY2UueVJhZGl1cztcblxuXHR0aGlzLmFTdGFydEFuZ2xlID0gc291cmNlLmFTdGFydEFuZ2xlO1xuXHR0aGlzLmFFbmRBbmdsZSA9IHNvdXJjZS5hRW5kQW5nbGU7XG5cblx0dGhpcy5hQ2xvY2t3aXNlID0gc291cmNlLmFDbG9ja3dpc2U7XG5cblx0dGhpcy5hUm90YXRpb24gPSBzb3VyY2UuYVJvdGF0aW9uO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS5hWCA9IHRoaXMuYVg7XG5cdGRhdGEuYVkgPSB0aGlzLmFZO1xuXG5cdGRhdGEueFJhZGl1cyA9IHRoaXMueFJhZGl1cztcblx0ZGF0YS55UmFkaXVzID0gdGhpcy55UmFkaXVzO1xuXG5cdGRhdGEuYVN0YXJ0QW5nbGUgPSB0aGlzLmFTdGFydEFuZ2xlO1xuXHRkYXRhLmFFbmRBbmdsZSA9IHRoaXMuYUVuZEFuZ2xlO1xuXG5cdGRhdGEuYUNsb2Nrd2lzZSA9IHRoaXMuYUNsb2Nrd2lzZTtcblxuXHRkYXRhLmFSb3RhdGlvbiA9IHRoaXMuYVJvdGF0aW9uO1xuXG5cdHJldHVybiBkYXRhO1xuXG59O1xuXG5FbGxpcHNlQ3VydmUucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy5hWCA9IGpzb24uYVg7XG5cdHRoaXMuYVkgPSBqc29uLmFZO1xuXG5cdHRoaXMueFJhZGl1cyA9IGpzb24ueFJhZGl1cztcblx0dGhpcy55UmFkaXVzID0ganNvbi55UmFkaXVzO1xuXG5cdHRoaXMuYVN0YXJ0QW5nbGUgPSBqc29uLmFTdGFydEFuZ2xlO1xuXHR0aGlzLmFFbmRBbmdsZSA9IGpzb24uYUVuZEFuZ2xlO1xuXG5cdHRoaXMuYUNsb2Nrd2lzZSA9IGpzb24uYUNsb2Nrd2lzZTtcblxuXHR0aGlzLmFSb3RhdGlvbiA9IGpzb24uYVJvdGF0aW9uO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5mdW5jdGlvbiBBcmNDdXJ2ZSggYVgsIGFZLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICkge1xuXG5cdEVsbGlwc2VDdXJ2ZS5jYWxsKCB0aGlzLCBhWCwgYVksIGFSYWRpdXMsIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKTtcblxuXHR0aGlzLnR5cGUgPSAnQXJjQ3VydmUnO1xuXG59XG5cbkFyY0N1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUgKTtcbkFyY0N1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEFyY0N1cnZlO1xuXG5BcmNDdXJ2ZS5wcm90b3R5cGUuaXNBcmNDdXJ2ZSA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IGh0dHBzOi8vZ2l0aHViLmNvbS96ejg1XG4gKlxuICogQ2VudHJpcGV0YWwgQ2F0bXVsbFJvbSBDdXJ2ZSAtIHdoaWNoIGlzIHVzZWZ1bCBmb3IgYXZvaWRpbmdcbiAqIGN1c3BzIGFuZCBzZWxmLWludGVyc2VjdGlvbnMgaW4gbm9uLXVuaWZvcm0gY2F0bXVsbCByb20gY3VydmVzLlxuICogaHR0cDovL3d3dy5jZW15dWtzZWwuY29tL3Jlc2VhcmNoL2NhdG11bGxyb21fcGFyYW0vY2F0bXVsbHJvbS5wZGZcbiAqXG4gKiBjdXJ2ZS50eXBlIGFjY2VwdHMgY2VudHJpcGV0YWwoZGVmYXVsdCksIGNob3JkYWwgYW5kIGNhdG11bGxyb21cbiAqIGN1cnZlLnRlbnNpb24gaXMgdXNlZCBmb3IgY2F0bXVsbHJvbSB3aGljaCBkZWZhdWx0cyB0byAwLjVcbiAqL1xuXG5cbi8qXG5CYXNlZCBvbiBhbiBvcHRpbWl6ZWQgYysrIHNvbHV0aW9uIGluXG4gLSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzk0ODk3MzYvY2F0bXVsbC1yb20tY3VydmUtd2l0aC1uby1jdXNwcy1hbmQtbm8tc2VsZi1pbnRlcnNlY3Rpb25zL1xuIC0gaHR0cDovL2lkZW9uZS5jb20vTm9FYlZNXG5cblRoaXMgQ3ViaWNQb2x5IGNsYXNzIGNvdWxkIGJlIHVzZWQgZm9yIHJldXNpbmcgc29tZSB2YXJpYWJsZXMgYW5kIGNhbGN1bGF0aW9ucyxcbmJ1dCBmb3IgdGhyZWUuanMgY3VydmUgdXNlLCBpdCBjb3VsZCBiZSBwb3NzaWJsZSBpbmxpbmVkIGFuZCBmbGF0dGVuIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gY2FsbFxud2hpY2ggY2FuIGJlIHBsYWNlZCBpbiBDdXJ2ZVV0aWxzLlxuKi9cblxuZnVuY3Rpb24gQ3ViaWNQb2x5KCkge1xuXG5cdHZhciBjMCA9IDAsIGMxID0gMCwgYzIgPSAwLCBjMyA9IDA7XG5cblx0Lypcblx0ICogQ29tcHV0ZSBjb2VmZmljaWVudHMgZm9yIGEgY3ViaWMgcG9seW5vbWlhbFxuXHQgKiAgIHAocykgPSBjMCArIGMxKnMgKyBjMipzXjIgKyBjMypzXjNcblx0ICogc3VjaCB0aGF0XG5cdCAqICAgcCgwKSA9IHgwLCBwKDEpID0geDFcblx0ICogIGFuZFxuXHQgKiAgIHAnKDApID0gdDAsIHAnKDEpID0gdDEuXG5cdCAqL1xuXHRmdW5jdGlvbiBpbml0KCB4MCwgeDEsIHQwLCB0MSApIHtcblxuXHRcdGMwID0geDA7XG5cdFx0YzEgPSB0MDtcblx0XHRjMiA9IC0gMyAqIHgwICsgMyAqIHgxIC0gMiAqIHQwIC0gdDE7XG5cdFx0YzMgPSAyICogeDAgLSAyICogeDEgKyB0MCArIHQxO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0aW5pdENhdG11bGxSb206IGZ1bmN0aW9uICggeDAsIHgxLCB4MiwgeDMsIHRlbnNpb24gKSB7XG5cblx0XHRcdGluaXQoIHgxLCB4MiwgdGVuc2lvbiAqICggeDIgLSB4MCApLCB0ZW5zaW9uICogKCB4MyAtIHgxICkgKTtcblxuXHRcdH0sXG5cblx0XHRpbml0Tm9udW5pZm9ybUNhdG11bGxSb206IGZ1bmN0aW9uICggeDAsIHgxLCB4MiwgeDMsIGR0MCwgZHQxLCBkdDIgKSB7XG5cblx0XHRcdC8vIGNvbXB1dGUgdGFuZ2VudHMgd2hlbiBwYXJhbWV0ZXJpemVkIGluIFt0MSx0Ml1cblx0XHRcdHZhciB0MSA9ICggeDEgLSB4MCApIC8gZHQwIC0gKCB4MiAtIHgwICkgLyAoIGR0MCArIGR0MSApICsgKCB4MiAtIHgxICkgLyBkdDE7XG5cdFx0XHR2YXIgdDIgPSAoIHgyIC0geDEgKSAvIGR0MSAtICggeDMgLSB4MSApIC8gKCBkdDEgKyBkdDIgKSArICggeDMgLSB4MiApIC8gZHQyO1xuXG5cdFx0XHQvLyByZXNjYWxlIHRhbmdlbnRzIGZvciBwYXJhbWV0cml6YXRpb24gaW4gWzAsMV1cblx0XHRcdHQxICo9IGR0MTtcblx0XHRcdHQyICo9IGR0MTtcblxuXHRcdFx0aW5pdCggeDEsIHgyLCB0MSwgdDIgKTtcblxuXHRcdH0sXG5cblx0XHRjYWxjOiBmdW5jdGlvbiAoIHQgKSB7XG5cblx0XHRcdHZhciB0MiA9IHQgKiB0O1xuXHRcdFx0dmFyIHQzID0gdDIgKiB0O1xuXHRcdFx0cmV0dXJuIGMwICsgYzEgKiB0ICsgYzIgKiB0MiArIGMzICogdDM7XG5cblx0XHR9XG5cblx0fTtcblxufVxuXG4vL1xuXG52YXIgdG1wID0gbmV3IFZlY3RvcjMoKTtcbnZhciBweCQxID0gbmV3IEN1YmljUG9seSgpO1xudmFyIHB5ID0gbmV3IEN1YmljUG9seSgpO1xudmFyIHB6ID0gbmV3IEN1YmljUG9seSgpO1xuXG5mdW5jdGlvbiBDYXRtdWxsUm9tQ3VydmUzKCBwb2ludHMsIGNsb3NlZCwgY3VydmVUeXBlLCB0ZW5zaW9uICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ2F0bXVsbFJvbUN1cnZlMyc7XG5cblx0dGhpcy5wb2ludHMgPSBwb2ludHMgfHwgW107XG5cdHRoaXMuY2xvc2VkID0gY2xvc2VkIHx8IGZhbHNlO1xuXHR0aGlzLmN1cnZlVHlwZSA9IGN1cnZlVHlwZSB8fCAnY2VudHJpcGV0YWwnO1xuXHR0aGlzLnRlbnNpb24gPSB0ZW5zaW9uIHx8IDAuNTtcblxufVxuXG5DYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDYXRtdWxsUm9tQ3VydmUzO1xuXG5DYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZS5pc0NhdG11bGxSb21DdXJ2ZTMgPSB0cnVlO1xuXG5DYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0dmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgcG9pbnRzID0gdGhpcy5wb2ludHM7XG5cdHZhciBsID0gcG9pbnRzLmxlbmd0aDtcblxuXHR2YXIgcCA9ICggbCAtICggdGhpcy5jbG9zZWQgPyAwIDogMSApICkgKiB0O1xuXHR2YXIgaW50UG9pbnQgPSBNYXRoLmZsb29yKCBwICk7XG5cdHZhciB3ZWlnaHQgPSBwIC0gaW50UG9pbnQ7XG5cblx0aWYgKCB0aGlzLmNsb3NlZCApIHtcblxuXHRcdGludFBvaW50ICs9IGludFBvaW50ID4gMCA/IDAgOiAoIE1hdGguZmxvb3IoIE1hdGguYWJzKCBpbnRQb2ludCApIC8gbCApICsgMSApICogbDtcblxuXHR9IGVsc2UgaWYgKCB3ZWlnaHQgPT09IDAgJiYgaW50UG9pbnQgPT09IGwgLSAxICkge1xuXG5cdFx0aW50UG9pbnQgPSBsIC0gMjtcblx0XHR3ZWlnaHQgPSAxO1xuXG5cdH1cblxuXHR2YXIgcDAsIHAxLCBwMiwgcDM7IC8vIDQgcG9pbnRzXG5cblx0aWYgKCB0aGlzLmNsb3NlZCB8fCBpbnRQb2ludCA+IDAgKSB7XG5cblx0XHRwMCA9IHBvaW50c1sgKCBpbnRQb2ludCAtIDEgKSAlIGwgXTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gZXh0cmFwb2xhdGUgZmlyc3QgcG9pbnRcblx0XHR0bXAuc3ViVmVjdG9ycyggcG9pbnRzWyAwIF0sIHBvaW50c1sgMSBdICkuYWRkKCBwb2ludHNbIDAgXSApO1xuXHRcdHAwID0gdG1wO1xuXG5cdH1cblxuXHRwMSA9IHBvaW50c1sgaW50UG9pbnQgJSBsIF07XG5cdHAyID0gcG9pbnRzWyAoIGludFBvaW50ICsgMSApICUgbCBdO1xuXG5cdGlmICggdGhpcy5jbG9zZWQgfHwgaW50UG9pbnQgKyAyIDwgbCApIHtcblxuXHRcdHAzID0gcG9pbnRzWyAoIGludFBvaW50ICsgMiApICUgbCBdO1xuXG5cdH0gZWxzZSB7XG5cblx0XHQvLyBleHRyYXBvbGF0ZSBsYXN0IHBvaW50XG5cdFx0dG1wLnN1YlZlY3RvcnMoIHBvaW50c1sgbCAtIDEgXSwgcG9pbnRzWyBsIC0gMiBdICkuYWRkKCBwb2ludHNbIGwgLSAxIF0gKTtcblx0XHRwMyA9IHRtcDtcblxuXHR9XG5cblx0aWYgKCB0aGlzLmN1cnZlVHlwZSA9PT0gJ2NlbnRyaXBldGFsJyB8fCB0aGlzLmN1cnZlVHlwZSA9PT0gJ2Nob3JkYWwnICkge1xuXG5cdFx0Ly8gaW5pdCBDZW50cmlwZXRhbCAvIENob3JkYWwgQ2F0bXVsbC1Sb21cblx0XHR2YXIgcG93ID0gdGhpcy5jdXJ2ZVR5cGUgPT09ICdjaG9yZGFsJyA/IDAuNSA6IDAuMjU7XG5cdFx0dmFyIGR0MCA9IE1hdGgucG93KCBwMC5kaXN0YW5jZVRvU3F1YXJlZCggcDEgKSwgcG93ICk7XG5cdFx0dmFyIGR0MSA9IE1hdGgucG93KCBwMS5kaXN0YW5jZVRvU3F1YXJlZCggcDIgKSwgcG93ICk7XG5cdFx0dmFyIGR0MiA9IE1hdGgucG93KCBwMi5kaXN0YW5jZVRvU3F1YXJlZCggcDMgKSwgcG93ICk7XG5cblx0XHQvLyBzYWZldHkgY2hlY2sgZm9yIHJlcGVhdGVkIHBvaW50c1xuXHRcdGlmICggZHQxIDwgMWUtNCApIGR0MSA9IDEuMDtcblx0XHRpZiAoIGR0MCA8IDFlLTQgKSBkdDAgPSBkdDE7XG5cdFx0aWYgKCBkdDIgPCAxZS00ICkgZHQyID0gZHQxO1xuXG5cdFx0cHgkMS5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20oIHAwLngsIHAxLngsIHAyLngsIHAzLngsIGR0MCwgZHQxLCBkdDIgKTtcblx0XHRweS5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20oIHAwLnksIHAxLnksIHAyLnksIHAzLnksIGR0MCwgZHQxLCBkdDIgKTtcblx0XHRwei5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20oIHAwLnosIHAxLnosIHAyLnosIHAzLnosIGR0MCwgZHQxLCBkdDIgKTtcblxuXHR9IGVsc2UgaWYgKCB0aGlzLmN1cnZlVHlwZSA9PT0gJ2NhdG11bGxyb20nICkge1xuXG5cdFx0cHgkMS5pbml0Q2F0bXVsbFJvbSggcDAueCwgcDEueCwgcDIueCwgcDMueCwgdGhpcy50ZW5zaW9uICk7XG5cdFx0cHkuaW5pdENhdG11bGxSb20oIHAwLnksIHAxLnksIHAyLnksIHAzLnksIHRoaXMudGVuc2lvbiApO1xuXHRcdHB6LmluaXRDYXRtdWxsUm9tKCBwMC56LCBwMS56LCBwMi56LCBwMy56LCB0aGlzLnRlbnNpb24gKTtcblxuXHR9XG5cblx0cG9pbnQuc2V0KFxuXHRcdHB4JDEuY2FsYyggd2VpZ2h0ICksXG5cdFx0cHkuY2FsYyggd2VpZ2h0ICksXG5cdFx0cHouY2FsYyggd2VpZ2h0IClcblx0KTtcblxuXHRyZXR1cm4gcG9pbnQ7XG5cbn07XG5cbkNhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLnBvaW50cyA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgbCA9IHNvdXJjZS5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBwb2ludCA9IHNvdXJjZS5wb2ludHNbIGkgXTtcblxuXHRcdHRoaXMucG9pbnRzLnB1c2goIHBvaW50LmNsb25lKCkgKTtcblxuXHR9XG5cblx0dGhpcy5jbG9zZWQgPSBzb3VyY2UuY2xvc2VkO1xuXHR0aGlzLmN1cnZlVHlwZSA9IHNvdXJjZS5jdXJ2ZVR5cGU7XG5cdHRoaXMudGVuc2lvbiA9IHNvdXJjZS50ZW5zaW9uO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5DYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLnBvaW50cyA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHR2YXIgcG9pbnQgPSB0aGlzLnBvaW50c1sgaSBdO1xuXHRcdGRhdGEucG9pbnRzLnB1c2goIHBvaW50LnRvQXJyYXkoKSApO1xuXG5cdH1cblxuXHRkYXRhLmNsb3NlZCA9IHRoaXMuY2xvc2VkO1xuXHRkYXRhLmN1cnZlVHlwZSA9IHRoaXMuY3VydmVUeXBlO1xuXHRkYXRhLnRlbnNpb24gPSB0aGlzLnRlbnNpb247XG5cblx0cmV0dXJuIGRhdGE7XG5cbn07XG5cbkNhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy5wb2ludHMgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0dmFyIHBvaW50ID0ganNvbi5wb2ludHNbIGkgXTtcblx0XHR0aGlzLnBvaW50cy5wdXNoKCBuZXcgVmVjdG9yMygpLmZyb21BcnJheSggcG9pbnQgKSApO1xuXG5cdH1cblxuXHR0aGlzLmNsb3NlZCA9IGpzb24uY2xvc2VkO1xuXHR0aGlzLmN1cnZlVHlwZSA9IGpzb24uY3VydmVUeXBlO1xuXHR0aGlzLnRlbnNpb24gPSBqc29uLnRlbnNpb247XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICpcbiAqIEJlemllciBDdXJ2ZXMgZm9ybXVsYXMgb2J0YWluZWQgZnJvbVxuICogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Cw6l6aWVyX2N1cnZlXG4gKi9cblxuZnVuY3Rpb24gQ2F0bXVsbFJvbSggdCwgcDAsIHAxLCBwMiwgcDMgKSB7XG5cblx0dmFyIHYwID0gKCBwMiAtIHAwICkgKiAwLjU7XG5cdHZhciB2MSA9ICggcDMgLSBwMSApICogMC41O1xuXHR2YXIgdDIgPSB0ICogdDtcblx0dmFyIHQzID0gdCAqIHQyO1xuXHRyZXR1cm4gKCAyICogcDEgLSAyICogcDIgKyB2MCArIHYxICkgKiB0MyArICggLSAzICogcDEgKyAzICogcDIgLSAyICogdjAgLSB2MSApICogdDIgKyB2MCAqIHQgKyBwMTtcblxufVxuXG4vL1xuXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJQMCggdCwgcCApIHtcblxuXHR2YXIgayA9IDEgLSB0O1xuXHRyZXR1cm4gayAqIGsgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllclAxKCB0LCBwICkge1xuXG5cdHJldHVybiAyICogKCAxIC0gdCApICogdCAqIHA7XG5cbn1cblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyUDIoIHQsIHAgKSB7XG5cblx0cmV0dXJuIHQgKiB0ICogcDtcblxufVxuXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXIoIHQsIHAwLCBwMSwgcDIgKSB7XG5cblx0cmV0dXJuIFF1YWRyYXRpY0JlemllclAwKCB0LCBwMCApICsgUXVhZHJhdGljQmV6aWVyUDEoIHQsIHAxICkgK1xuXHRcdFF1YWRyYXRpY0JlemllclAyKCB0LCBwMiApO1xuXG59XG5cbi8vXG5cbmZ1bmN0aW9uIEN1YmljQmV6aWVyUDAoIHQsIHAgKSB7XG5cblx0dmFyIGsgPSAxIC0gdDtcblx0cmV0dXJuIGsgKiBrICogayAqIHA7XG5cbn1cblxuZnVuY3Rpb24gQ3ViaWNCZXppZXJQMSggdCwgcCApIHtcblxuXHR2YXIgayA9IDEgLSB0O1xuXHRyZXR1cm4gMyAqIGsgKiBrICogdCAqIHA7XG5cbn1cblxuZnVuY3Rpb24gQ3ViaWNCZXppZXJQMiggdCwgcCApIHtcblxuXHRyZXR1cm4gMyAqICggMSAtIHQgKSAqIHQgKiB0ICogcDtcblxufVxuXG5mdW5jdGlvbiBDdWJpY0JlemllclAzKCB0LCBwICkge1xuXG5cdHJldHVybiB0ICogdCAqIHQgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIEN1YmljQmV6aWVyKCB0LCBwMCwgcDEsIHAyLCBwMyApIHtcblxuXHRyZXR1cm4gQ3ViaWNCZXppZXJQMCggdCwgcDAgKSArIEN1YmljQmV6aWVyUDEoIHQsIHAxICkgKyBDdWJpY0JlemllclAyKCB0LCBwMiApICtcblx0XHRDdWJpY0JlemllclAzKCB0LCBwMyApO1xuXG59XG5cbmZ1bmN0aW9uIEN1YmljQmV6aWVyQ3VydmUoIHYwLCB2MSwgdjIsIHYzICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ3ViaWNCZXppZXJDdXJ2ZSc7XG5cblx0dGhpcy52MCA9IHYwIHx8IG5ldyBWZWN0b3IyKCk7XG5cdHRoaXMudjEgPSB2MSB8fCBuZXcgVmVjdG9yMigpO1xuXHR0aGlzLnYyID0gdjIgfHwgbmV3IFZlY3RvcjIoKTtcblx0dGhpcy52MyA9IHYzIHx8IG5ldyBWZWN0b3IyKCk7XG5cbn1cblxuQ3ViaWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3ViaWNCZXppZXJDdXJ2ZTtcblxuQ3ViaWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuaXNDdWJpY0JlemllckN1cnZlID0gdHJ1ZTtcblxuQ3ViaWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHZhciBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IyKCk7XG5cblx0dmFyIHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2MiA9IHRoaXMudjIsIHYzID0gdGhpcy52MztcblxuXHRwb2ludC5zZXQoXG5cdFx0Q3ViaWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLngsIHYzLnggKSxcblx0XHRDdWJpY0JlemllciggdCwgdjAueSwgdjEueSwgdjIueSwgdjMueSApXG5cdCk7XG5cblx0cmV0dXJuIHBvaW50O1xuXG59O1xuXG5DdWJpY0JlemllckN1cnZlLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy52MC5jb3B5KCBzb3VyY2UudjAgKTtcblx0dGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTtcblx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcblx0dGhpcy52My5jb3B5KCBzb3VyY2UudjMgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuQ3ViaWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS52MCA9IHRoaXMudjAudG9BcnJheSgpO1xuXHRkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7XG5cdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcblx0ZGF0YS52MyA9IHRoaXMudjMudG9BcnJheSgpO1xuXG5cdHJldHVybiBkYXRhO1xuXG59O1xuXG5DdWJpY0JlemllckN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTiA9IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdHRoaXMudjAuZnJvbUFycmF5KCBqc29uLnYwICk7XG5cdHRoaXMudjEuZnJvbUFycmF5KCBqc29uLnYxICk7XG5cdHRoaXMudjIuZnJvbUFycmF5KCBqc29uLnYyICk7XG5cdHRoaXMudjMuZnJvbUFycmF5KCBqc29uLnYzICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbmZ1bmN0aW9uIEN1YmljQmV6aWVyQ3VydmUzKCB2MCwgdjEsIHYyLCB2MyApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0N1YmljQmV6aWVyQ3VydmUzJztcblxuXHR0aGlzLnYwID0gdjAgfHwgbmV3IFZlY3RvcjMoKTtcblx0dGhpcy52MSA9IHYxIHx8IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMudjIgPSB2MiB8fCBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLnYzID0gdjMgfHwgbmV3IFZlY3RvcjMoKTtcblxufVxuXG5DdWJpY0JlemllckN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcbkN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1YmljQmV6aWVyQ3VydmUzO1xuXG5DdWJpY0JlemllckN1cnZlMy5wcm90b3R5cGUuaXNDdWJpY0JlemllckN1cnZlMyA9IHRydWU7XG5cbkN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0dmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgdjAgPSB0aGlzLnYwLCB2MSA9IHRoaXMudjEsIHYyID0gdGhpcy52MiwgdjMgPSB0aGlzLnYzO1xuXG5cdHBvaW50LnNldChcblx0XHRDdWJpY0JlemllciggdCwgdjAueCwgdjEueCwgdjIueCwgdjMueCApLFxuXHRcdEN1YmljQmV6aWVyKCB0LCB2MC55LCB2MS55LCB2Mi55LCB2My55ICksXG5cdFx0Q3ViaWNCZXppZXIoIHQsIHYwLnosIHYxLnosIHYyLnosIHYzLnogKVxuXHQpO1xuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLnYwLmNvcHkoIHNvdXJjZS52MCApO1xuXHR0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApO1xuXHR0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApO1xuXHR0aGlzLnYzLmNvcHkoIHNvdXJjZS52MyApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5DdWJpY0JlemllckN1cnZlMy5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS52MCA9IHRoaXMudjAudG9BcnJheSgpO1xuXHRkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7XG5cdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcblx0ZGF0YS52MyA9IHRoaXMudjMudG9BcnJheSgpO1xuXG5cdHJldHVybiBkYXRhO1xuXG59O1xuXG5DdWJpY0JlemllckN1cnZlMy5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHR0aGlzLnYwLmZyb21BcnJheSgganNvbi52MCApO1xuXHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xuXHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xuXHR0aGlzLnYzLmZyb21BcnJheSgganNvbi52MyApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5mdW5jdGlvbiBMaW5lQ3VydmUoIHYxLCB2MiApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVDdXJ2ZSc7XG5cblx0dGhpcy52MSA9IHYxIHx8IG5ldyBWZWN0b3IyKCk7XG5cdHRoaXMudjIgPSB2MiB8fCBuZXcgVmVjdG9yMigpO1xuXG59XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcbkxpbmVDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMaW5lQ3VydmU7XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUuaXNMaW5lQ3VydmUgPSB0cnVlO1xuXG5MaW5lQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXG5cdGlmICggdCA9PT0gMSApIHtcblxuXHRcdHBvaW50LmNvcHkoIHRoaXMudjIgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0cG9pbnQuY29weSggdGhpcy52MiApLnN1YiggdGhpcy52MSApO1xuXHRcdHBvaW50Lm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLnYxICk7XG5cblx0fVxuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuLy8gTGluZSBjdXJ2ZSBpcyBsaW5lYXIsIHNvIHdlIGNhbiBvdmVyd3JpdGUgZGVmYXVsdCBnZXRQb2ludEF0XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUuZ2V0UG9pbnRBdCA9IGZ1bmN0aW9uICggdSwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0cmV0dXJuIHRoaXMuZ2V0UG9pbnQoIHUsIG9wdGlvbmFsVGFyZ2V0ICk7XG5cbn07XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUuZ2V0VGFuZ2VudCA9IGZ1bmN0aW9uICggLyogdCAqLyApIHtcblxuXHR2YXIgdGFuZ2VudCA9IHRoaXMudjIuY2xvbmUoKS5zdWIoIHRoaXMudjEgKTtcblxuXHRyZXR1cm4gdGFuZ2VudC5ub3JtYWxpemUoKTtcblxufTtcblxuTGluZUN1cnZlLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTtcblx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuTGluZUN1cnZlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7XG5cdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuTGluZUN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTiA9IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdHRoaXMudjEuZnJvbUFycmF5KCBqc29uLnYxICk7XG5cdHRoaXMudjIuZnJvbUFycmF5KCBqc29uLnYyICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbmZ1bmN0aW9uIExpbmVDdXJ2ZTMoIHYxLCB2MiApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVDdXJ2ZTMnO1xuXG5cdHRoaXMudjEgPSB2MSB8fCBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLnYyID0gdjIgfHwgbmV3IFZlY3RvcjMoKTtcblxufVxuXG5MaW5lQ3VydmUzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuTGluZUN1cnZlMy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMaW5lQ3VydmUzO1xuXG5MaW5lQ3VydmUzLnByb3RvdHlwZS5pc0xpbmVDdXJ2ZTMgPSB0cnVlO1xuXG5MaW5lQ3VydmUzLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0dmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblxuXHRpZiAoIHQgPT09IDEgKSB7XG5cblx0XHRwb2ludC5jb3B5KCB0aGlzLnYyICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdHBvaW50LmNvcHkoIHRoaXMudjIgKS5zdWIoIHRoaXMudjEgKTtcblx0XHRwb2ludC5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy52MSApO1xuXG5cdH1cblxuXHRyZXR1cm4gcG9pbnQ7XG5cbn07XG5cbi8vIExpbmUgY3VydmUgaXMgbGluZWFyLCBzbyB3ZSBjYW4gb3ZlcndyaXRlIGRlZmF1bHQgZ2V0UG9pbnRBdFxuXG5MaW5lQ3VydmUzLnByb3RvdHlwZS5nZXRQb2ludEF0ID0gZnVuY3Rpb24gKCB1LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRyZXR1cm4gdGhpcy5nZXRQb2ludCggdSwgb3B0aW9uYWxUYXJnZXQgKTtcblxufTtcblxuTGluZUN1cnZlMy5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XG5cdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbkxpbmVDdXJ2ZTMucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTtcblx0ZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpO1xuXG5cdHJldHVybiBkYXRhO1xuXG59O1xuXG5MaW5lQ3VydmUzLnByb3RvdHlwZS5mcm9tSlNPTiA9IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdHRoaXMudjEuZnJvbUFycmF5KCBqc29uLnYxICk7XG5cdHRoaXMudjIuZnJvbUFycmF5KCBqc29uLnYyICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllckN1cnZlKCB2MCwgdjEsIHYyICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUXVhZHJhdGljQmV6aWVyQ3VydmUnO1xuXG5cdHRoaXMudjAgPSB2MCB8fCBuZXcgVmVjdG9yMigpO1xuXHR0aGlzLnYxID0gdjEgfHwgbmV3IFZlY3RvcjIoKTtcblx0dGhpcy52MiA9IHYyIHx8IG5ldyBWZWN0b3IyKCk7XG5cbn1cblxuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5RdWFkcmF0aWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBRdWFkcmF0aWNCZXppZXJDdXJ2ZTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUgPSB0cnVlO1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHZhciBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IyKCk7XG5cblx0dmFyIHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2MiA9IHRoaXMudjI7XG5cblx0cG9pbnQuc2V0KFxuXHRcdFF1YWRyYXRpY0JlemllciggdCwgdjAueCwgdjEueCwgdjIueCApLFxuXHRcdFF1YWRyYXRpY0JlemllciggdCwgdjAueSwgdjEueSwgdjIueSApXG5cdCk7XG5cblx0cmV0dXJuIHBvaW50O1xuXG59O1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMudjAuY29weSggc291cmNlLnYwICk7XG5cdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XG5cdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLnYwID0gdGhpcy52MC50b0FycmF5KCk7XG5cdGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTtcblx0ZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpO1xuXG5cdHJldHVybiBkYXRhO1xuXG59O1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHR0aGlzLnYwLmZyb21BcnJheSgganNvbi52MCApO1xuXHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xuXHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJDdXJ2ZTMoIHYwLCB2MSwgdjIgKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdRdWFkcmF0aWNCZXppZXJDdXJ2ZTMnO1xuXG5cdHRoaXMudjAgPSB2MCB8fCBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLnYxID0gdjEgfHwgbmV3IFZlY3RvcjMoKTtcblx0dGhpcy52MiA9IHYyIHx8IG5ldyBWZWN0b3IzKCk7XG5cbn1cblxuUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFF1YWRyYXRpY0JlemllckN1cnZlMztcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5pc1F1YWRyYXRpY0JlemllckN1cnZlMyA9IHRydWU7XG5cblF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHZhciBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2MiA9IHRoaXMudjI7XG5cblx0cG9pbnQuc2V0KFxuXHRcdFF1YWRyYXRpY0JlemllciggdCwgdjAueCwgdjEueCwgdjIueCApLFxuXHRcdFF1YWRyYXRpY0JlemllciggdCwgdjAueSwgdjEueSwgdjIueSApLFxuXHRcdFF1YWRyYXRpY0JlemllciggdCwgdjAueiwgdjEueiwgdjIueiApXG5cdCk7XG5cblx0cmV0dXJuIHBvaW50O1xuXG59O1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLnYwLmNvcHkoIHNvdXJjZS52MCApO1xuXHR0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApO1xuXHR0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdGRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTtcblx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xuXHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XG5cblx0cmV0dXJuIGRhdGE7XG5cbn07XG5cblF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHR0aGlzLnYwLmZyb21BcnJheSgganNvbi52MCApO1xuXHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xuXHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5mdW5jdGlvbiBTcGxpbmVDdXJ2ZSggcG9pbnRzIC8qIGFycmF5IG9mIFZlY3RvcjIgKi8gKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTcGxpbmVDdXJ2ZSc7XG5cblx0dGhpcy5wb2ludHMgPSBwb2ludHMgfHwgW107XG5cbn1cblxuU3BsaW5lQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5TcGxpbmVDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcGxpbmVDdXJ2ZTtcblxuU3BsaW5lQ3VydmUucHJvdG90eXBlLmlzU3BsaW5lQ3VydmUgPSB0cnVlO1xuXG5TcGxpbmVDdXJ2ZS5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHZhciBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IyKCk7XG5cblx0dmFyIHBvaW50cyA9IHRoaXMucG9pbnRzO1xuXHR2YXIgcCA9ICggcG9pbnRzLmxlbmd0aCAtIDEgKSAqIHQ7XG5cblx0dmFyIGludFBvaW50ID0gTWF0aC5mbG9vciggcCApO1xuXHR2YXIgd2VpZ2h0ID0gcCAtIGludFBvaW50O1xuXG5cdHZhciBwMCA9IHBvaW50c1sgaW50UG9pbnQgPT09IDAgPyBpbnRQb2ludCA6IGludFBvaW50IC0gMSBdO1xuXHR2YXIgcDEgPSBwb2ludHNbIGludFBvaW50IF07XG5cdHZhciBwMiA9IHBvaW50c1sgaW50UG9pbnQgPiBwb2ludHMubGVuZ3RoIC0gMiA/IHBvaW50cy5sZW5ndGggLSAxIDogaW50UG9pbnQgKyAxIF07XG5cdHZhciBwMyA9IHBvaW50c1sgaW50UG9pbnQgPiBwb2ludHMubGVuZ3RoIC0gMyA/IHBvaW50cy5sZW5ndGggLSAxIDogaW50UG9pbnQgKyAyIF07XG5cblx0cG9pbnQuc2V0KFxuXHRcdENhdG11bGxSb20oIHdlaWdodCwgcDAueCwgcDEueCwgcDIueCwgcDMueCApLFxuXHRcdENhdG11bGxSb20oIHdlaWdodCwgcDAueSwgcDEueSwgcDIueSwgcDMueSApXG5cdCk7XG5cblx0cmV0dXJuIHBvaW50O1xuXG59O1xuXG5TcGxpbmVDdXJ2ZS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMucG9pbnRzID0gW107XG5cblx0Zm9yICggdmFyIGkgPSAwLCBsID0gc291cmNlLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0dmFyIHBvaW50ID0gc291cmNlLnBvaW50c1sgaSBdO1xuXG5cdFx0dGhpcy5wb2ludHMucHVzaCggcG9pbnQuY2xvbmUoKSApO1xuXG5cdH1cblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuU3BsaW5lQ3VydmUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdGRhdGEucG9pbnRzID0gW107XG5cblx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBwb2ludCA9IHRoaXMucG9pbnRzWyBpIF07XG5cdFx0ZGF0YS5wb2ludHMucHVzaCggcG9pbnQudG9BcnJheSgpICk7XG5cblx0fVxuXG5cdHJldHVybiBkYXRhO1xuXG59O1xuXG5TcGxpbmVDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHR0aGlzLnBvaW50cyA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHR2YXIgcG9pbnQgPSBqc29uLnBvaW50c1sgaSBdO1xuXHRcdHRoaXMucG9pbnRzLnB1c2goIG5ldyBWZWN0b3IyKCkuZnJvbUFycmF5KCBwb2ludCApICk7XG5cblx0fVxuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5cblxudmFyIEN1cnZlcyA9IE9iamVjdC5mcmVlemUoe1xuXHRBcmNDdXJ2ZTogQXJjQ3VydmUsXG5cdENhdG11bGxSb21DdXJ2ZTM6IENhdG11bGxSb21DdXJ2ZTMsXG5cdEN1YmljQmV6aWVyQ3VydmU6IEN1YmljQmV6aWVyQ3VydmUsXG5cdEN1YmljQmV6aWVyQ3VydmUzOiBDdWJpY0JlemllckN1cnZlMyxcblx0RWxsaXBzZUN1cnZlOiBFbGxpcHNlQ3VydmUsXG5cdExpbmVDdXJ2ZTogTGluZUN1cnZlLFxuXHRMaW5lQ3VydmUzOiBMaW5lQ3VydmUzLFxuXHRRdWFkcmF0aWNCZXppZXJDdXJ2ZTogUXVhZHJhdGljQmV6aWVyQ3VydmUsXG5cdFF1YWRyYXRpY0JlemllckN1cnZlMzogUXVhZHJhdGljQmV6aWVyQ3VydmUzLFxuXHRTcGxpbmVDdXJ2ZTogU3BsaW5lQ3VydmVcbn0pO1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqXG4gKiovXG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICpcdEN1cnZlZCBQYXRoIC0gYSBjdXJ2ZSBwYXRoIGlzIHNpbXBseSBhIGFycmF5IG9mIGNvbm5lY3RlZFxuICogIGN1cnZlcywgYnV0IHJldGFpbnMgdGhlIGFwaSBvZiBhIGN1cnZlXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmZ1bmN0aW9uIEN1cnZlUGF0aCgpIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0N1cnZlUGF0aCc7XG5cblx0dGhpcy5jdXJ2ZXMgPSBbXTtcblx0dGhpcy5hdXRvQ2xvc2UgPSBmYWxzZTsgLy8gQXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHBhdGhcblxufVxuXG5DdXJ2ZVBhdGgucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQ3VydmVQYXRoLFxuXG5cdGFkZDogZnVuY3Rpb24gKCBjdXJ2ZSApIHtcblxuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XG5cblx0fSxcblxuXHRjbG9zZVBhdGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIEFkZCBhIGxpbmUgY3VydmUgaWYgc3RhcnQgYW5kIGVuZCBvZiBsaW5lcyBhcmUgbm90IGNvbm5lY3RlZFxuXHRcdHZhciBzdGFydFBvaW50ID0gdGhpcy5jdXJ2ZXNbIDAgXS5nZXRQb2ludCggMCApO1xuXHRcdHZhciBlbmRQb2ludCA9IHRoaXMuY3VydmVzWyB0aGlzLmN1cnZlcy5sZW5ndGggLSAxIF0uZ2V0UG9pbnQoIDEgKTtcblxuXHRcdGlmICggISBzdGFydFBvaW50LmVxdWFscyggZW5kUG9pbnQgKSApIHtcblxuXHRcdFx0dGhpcy5jdXJ2ZXMucHVzaCggbmV3IExpbmVDdXJ2ZSggZW5kUG9pbnQsIHN0YXJ0UG9pbnQgKSApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Ly8gVG8gZ2V0IGFjY3VyYXRlIHBvaW50IHdpdGggcmVmZXJlbmNlIHRvXG5cdC8vIGVudGlyZSBwYXRoIGRpc3RhbmNlIGF0IHRpbWUgdCxcblx0Ly8gZm9sbG93aW5nIGhhcyB0byBiZSBkb25lOlxuXG5cdC8vIDEuIExlbmd0aCBvZiBlYWNoIHN1YiBwYXRoIGhhdmUgdG8gYmUga25vd25cblx0Ly8gMi4gTG9jYXRlIGFuZCBpZGVudGlmeSB0eXBlIG9mIGN1cnZlXG5cdC8vIDMuIEdldCB0IGZvciB0aGUgY3VydmVcblx0Ly8gNC4gUmV0dXJuIGN1cnZlLmdldFBvaW50QXQodCcpXG5cblx0Z2V0UG9pbnQ6IGZ1bmN0aW9uICggdCApIHtcblxuXHRcdHZhciBkID0gdCAqIHRoaXMuZ2V0TGVuZ3RoKCk7XG5cdFx0dmFyIGN1cnZlTGVuZ3RocyA9IHRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7XG5cdFx0dmFyIGkgPSAwO1xuXG5cdFx0Ly8gVG8gdGhpbmsgYWJvdXQgYm91bmRhcmllcyBwb2ludHMuXG5cblx0XHR3aGlsZSAoIGkgPCBjdXJ2ZUxlbmd0aHMubGVuZ3RoICkge1xuXG5cdFx0XHRpZiAoIGN1cnZlTGVuZ3Roc1sgaSBdID49IGQgKSB7XG5cblx0XHRcdFx0dmFyIGRpZmYgPSBjdXJ2ZUxlbmd0aHNbIGkgXSAtIGQ7XG5cdFx0XHRcdHZhciBjdXJ2ZSA9IHRoaXMuY3VydmVzWyBpIF07XG5cblx0XHRcdFx0dmFyIHNlZ21lbnRMZW5ndGggPSBjdXJ2ZS5nZXRMZW5ndGgoKTtcblx0XHRcdFx0dmFyIHUgPSBzZWdtZW50TGVuZ3RoID09PSAwID8gMCA6IDEgLSBkaWZmIC8gc2VnbWVudExlbmd0aDtcblxuXHRcdFx0XHRyZXR1cm4gY3VydmUuZ2V0UG9pbnRBdCggdSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGkgKys7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdC8vIGxvb3Agd2hlcmUgc3VtICE9IDAsIHN1bSA+IGQgLCBzdW0rMSA8ZFxuXG5cdH0sXG5cblx0Ly8gV2UgY2Fubm90IHVzZSB0aGUgZGVmYXVsdCBUSFJFRS5DdXJ2ZSBnZXRQb2ludCgpIHdpdGggZ2V0TGVuZ3RoKCkgYmVjYXVzZSBpblxuXHQvLyBUSFJFRS5DdXJ2ZSwgZ2V0TGVuZ3RoKCkgZGVwZW5kcyBvbiBnZXRQb2ludCgpIGJ1dCBpbiBUSFJFRS5DdXJ2ZVBhdGhcblx0Ly8gZ2V0UG9pbnQoKSBkZXBlbmRzIG9uIGdldExlbmd0aFxuXG5cdGdldExlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGxlbnMgPSB0aGlzLmdldEN1cnZlTGVuZ3RocygpO1xuXHRcdHJldHVybiBsZW5zWyBsZW5zLmxlbmd0aCAtIDEgXTtcblxuXHR9LFxuXG5cdC8vIGNhY2hlTGVuZ3RocyBtdXN0IGJlIHJlY2FsY3VsYXRlZC5cblx0dXBkYXRlQXJjTGVuZ3RoczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cdFx0dGhpcy5jYWNoZUxlbmd0aHMgPSBudWxsO1xuXHRcdHRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7XG5cblx0fSxcblxuXHQvLyBDb21wdXRlIGxlbmd0aHMgYW5kIGNhY2hlIHRoZW1cblx0Ly8gV2UgY2Fubm90IG92ZXJ3cml0ZSBnZXRMZW5ndGhzKCkgYmVjYXVzZSBVdG9UIG1hcHBpbmcgdXNlcyBpdC5cblxuXHRnZXRDdXJ2ZUxlbmd0aHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIFdlIHVzZSBjYWNoZSB2YWx1ZXMgaWYgY3VydmVzIGFuZCBjYWNoZSBhcnJheSBhcmUgc2FtZSBsZW5ndGhcblxuXHRcdGlmICggdGhpcy5jYWNoZUxlbmd0aHMgJiYgdGhpcy5jYWNoZUxlbmd0aHMubGVuZ3RoID09PSB0aGlzLmN1cnZlcy5sZW5ndGggKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmNhY2hlTGVuZ3RocztcblxuXHRcdH1cblxuXHRcdC8vIEdldCBsZW5ndGggb2Ygc3ViLWN1cnZlXG5cdFx0Ly8gUHVzaCBzdW1zIGludG8gY2FjaGVkIGFycmF5XG5cblx0XHR2YXIgbGVuZ3RocyA9IFtdLCBzdW1zID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuY3VydmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHN1bXMgKz0gdGhpcy5jdXJ2ZXNbIGkgXS5nZXRMZW5ndGgoKTtcblx0XHRcdGxlbmd0aHMucHVzaCggc3VtcyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jYWNoZUxlbmd0aHMgPSBsZW5ndGhzO1xuXG5cdFx0cmV0dXJuIGxlbmd0aHM7XG5cblx0fSxcblxuXHRnZXRTcGFjZWRQb2ludHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkge1xuXG5cdFx0aWYgKCBkaXZpc2lvbnMgPT09IHVuZGVmaW5lZCApIGRpdmlzaW9ucyA9IDQwO1xuXG5cdFx0dmFyIHBvaW50cyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDw9IGRpdmlzaW9uczsgaSArKyApIHtcblxuXHRcdFx0cG9pbnRzLnB1c2goIHRoaXMuZ2V0UG9pbnQoIGkgLyBkaXZpc2lvbnMgKSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmF1dG9DbG9zZSApIHtcblxuXHRcdFx0cG9pbnRzLnB1c2goIHBvaW50c1sgMCBdICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcG9pbnRzO1xuXG5cdH0sXG5cblx0Z2V0UG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGRpdmlzaW9ucyA9IGRpdmlzaW9ucyB8fCAxMjtcblxuXHRcdHZhciBwb2ludHMgPSBbXSwgbGFzdDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgY3VydmVzID0gdGhpcy5jdXJ2ZXM7IGkgPCBjdXJ2ZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY3VydmUgPSBjdXJ2ZXNbIGkgXTtcblx0XHRcdHZhciByZXNvbHV0aW9uID0gKCBjdXJ2ZSAmJiBjdXJ2ZS5pc0VsbGlwc2VDdXJ2ZSApID8gZGl2aXNpb25zICogMlxuXHRcdFx0XHQ6ICggY3VydmUgJiYgY3VydmUuaXNMaW5lQ3VydmUgKSA/IDFcblx0XHRcdFx0XHQ6ICggY3VydmUgJiYgY3VydmUuaXNTcGxpbmVDdXJ2ZSApID8gZGl2aXNpb25zICogY3VydmUucG9pbnRzLmxlbmd0aFxuXHRcdFx0XHRcdFx0OiBkaXZpc2lvbnM7XG5cblx0XHRcdHZhciBwdHMgPSBjdXJ2ZS5nZXRQb2ludHMoIHJlc29sdXRpb24gKTtcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwOyBqIDwgcHRzLmxlbmd0aDsgaiArKyApIHtcblxuXHRcdFx0XHR2YXIgcG9pbnQgPSBwdHNbIGogXTtcblxuXHRcdFx0XHRpZiAoIGxhc3QgJiYgbGFzdC5lcXVhbHMoIHBvaW50ICkgKSBjb250aW51ZTsgLy8gZW5zdXJlcyBubyBjb25zZWN1dGl2ZSBwb2ludHMgYXJlIGR1cGxpY2F0ZXNcblxuXHRcdFx0XHRwb2ludHMucHVzaCggcG9pbnQgKTtcblx0XHRcdFx0bGFzdCA9IHBvaW50O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYXV0b0Nsb3NlICYmIHBvaW50cy5sZW5ndGggPiAxICYmICEgcG9pbnRzWyBwb2ludHMubGVuZ3RoIC0gMSBdLmVxdWFscyggcG9pbnRzWyAwIF0gKSApIHtcblxuXHRcdFx0cG9pbnRzLnB1c2goIHBvaW50c1sgMCBdICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcG9pbnRzO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuY3VydmVzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBzb3VyY2UuY3VydmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjdXJ2ZSA9IHNvdXJjZS5jdXJ2ZXNbIGkgXTtcblxuXHRcdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUuY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5hdXRvQ2xvc2UgPSBzb3VyY2UuYXV0b0Nsb3NlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0XHRkYXRhLmF1dG9DbG9zZSA9IHRoaXMuYXV0b0Nsb3NlO1xuXHRcdGRhdGEuY3VydmVzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmN1cnZlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY3VydmUgPSB0aGlzLmN1cnZlc1sgaSBdO1xuXHRcdFx0ZGF0YS5jdXJ2ZXMucHVzaCggY3VydmUudG9KU09OKCkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0ZnJvbUpTT046IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0XHR0aGlzLmF1dG9DbG9zZSA9IGpzb24uYXV0b0Nsb3NlO1xuXHRcdHRoaXMuY3VydmVzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmN1cnZlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY3VydmUgPSBqc29uLmN1cnZlc1sgaSBdO1xuXHRcdFx0dGhpcy5jdXJ2ZXMucHVzaCggbmV3IEN1cnZlc1sgY3VydmUudHlwZSBdKCkuZnJvbUpTT04oIGN1cnZlICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIENyZWF0ZXMgZnJlZSBmb3JtIDJkIHBhdGggdXNpbmcgc2VyaWVzIG9mIHBvaW50cywgbGluZXMgb3IgY3VydmVzLlxuICoqL1xuXG5mdW5jdGlvbiBQYXRoKCBwb2ludHMgKSB7XG5cblx0Q3VydmVQYXRoLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGF0aCc7XG5cblx0dGhpcy5jdXJyZW50UG9pbnQgPSBuZXcgVmVjdG9yMigpO1xuXG5cdGlmICggcG9pbnRzICkge1xuXG5cdFx0dGhpcy5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKTtcblxuXHR9XG5cbn1cblxuUGF0aC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBDdXJ2ZVBhdGgucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogUGF0aCxcblxuXHRzZXRGcm9tUG9pbnRzOiBmdW5jdGlvbiAoIHBvaW50cyApIHtcblxuXHRcdHRoaXMubW92ZVRvKCBwb2ludHNbIDAgXS54LCBwb2ludHNbIDAgXS55ICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDEsIGwgPSBwb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5saW5lVG8oIHBvaW50c1sgaSBdLngsIHBvaW50c1sgaSBdLnkgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdG1vdmVUbzogZnVuY3Rpb24gKCB4LCB5ICkge1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuc2V0KCB4LCB5ICk7IC8vIFRPRE8gY29uc2lkZXIgcmVmZXJlbmNpbmcgdmVjdG9ycyBpbnN0ZWFkIG9mIGNvcHlpbmc/XG5cblx0fSxcblxuXHRsaW5lVG86IGZ1bmN0aW9uICggeCwgeSApIHtcblxuXHRcdHZhciBjdXJ2ZSA9IG5ldyBMaW5lQ3VydmUoIHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksIG5ldyBWZWN0b3IyKCB4LCB5ICkgKTtcblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuc2V0KCB4LCB5ICk7XG5cblx0fSxcblxuXHRxdWFkcmF0aWNDdXJ2ZVRvOiBmdW5jdGlvbiAoIGFDUHgsIGFDUHksIGFYLCBhWSApIHtcblxuXHRcdHZhciBjdXJ2ZSA9IG5ldyBRdWFkcmF0aWNCZXppZXJDdXJ2ZShcblx0XHRcdHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksXG5cdFx0XHRuZXcgVmVjdG9yMiggYUNQeCwgYUNQeSApLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFYLCBhWSApXG5cdFx0KTtcblxuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5zZXQoIGFYLCBhWSApO1xuXG5cdH0sXG5cblx0YmV6aWVyQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1AxeCwgYUNQMXksIGFDUDJ4LCBhQ1AyeSwgYVgsIGFZICkge1xuXG5cdFx0dmFyIGN1cnZlID0gbmV3IEN1YmljQmV6aWVyQ3VydmUoXG5cdFx0XHR0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFDUDF4LCBhQ1AxeSApLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFDUDJ4LCBhQ1AyeSApLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFYLCBhWSApXG5cdFx0KTtcblxuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5zZXQoIGFYLCBhWSApO1xuXG5cdH0sXG5cblx0c3BsaW5lVGhydTogZnVuY3Rpb24gKCBwdHMgLypBcnJheSBvZiBWZWN0b3IqLyApIHtcblxuXHRcdHZhciBucHRzID0gWyB0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpIF0uY29uY2F0KCBwdHMgKTtcblxuXHRcdHZhciBjdXJ2ZSA9IG5ldyBTcGxpbmVDdXJ2ZSggbnB0cyApO1xuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5jb3B5KCBwdHNbIHB0cy5sZW5ndGggLSAxIF0gKTtcblxuXHR9LFxuXG5cdGFyYzogZnVuY3Rpb24gKCBhWCwgYVksIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKSB7XG5cblx0XHR2YXIgeDAgPSB0aGlzLmN1cnJlbnRQb2ludC54O1xuXHRcdHZhciB5MCA9IHRoaXMuY3VycmVudFBvaW50Lnk7XG5cblx0XHR0aGlzLmFic2FyYyggYVggKyB4MCwgYVkgKyB5MCwgYVJhZGl1cyxcblx0XHRcdGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKTtcblxuXHR9LFxuXG5cdGFic2FyYzogZnVuY3Rpb24gKCBhWCwgYVksIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKSB7XG5cblx0XHR0aGlzLmFic2VsbGlwc2UoIGFYLCBhWSwgYVJhZGl1cywgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApO1xuXG5cdH0sXG5cblx0ZWxsaXBzZTogZnVuY3Rpb24gKCBhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApIHtcblxuXHRcdHZhciB4MCA9IHRoaXMuY3VycmVudFBvaW50Lng7XG5cdFx0dmFyIHkwID0gdGhpcy5jdXJyZW50UG9pbnQueTtcblxuXHRcdHRoaXMuYWJzZWxsaXBzZSggYVggKyB4MCwgYVkgKyB5MCwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICk7XG5cblx0fSxcblxuXHRhYnNlbGxpcHNlOiBmdW5jdGlvbiAoIGFYLCBhWSwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICkge1xuXG5cdFx0dmFyIGN1cnZlID0gbmV3IEVsbGlwc2VDdXJ2ZSggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKTtcblxuXHRcdGlmICggdGhpcy5jdXJ2ZXMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0Ly8gaWYgYSBwcmV2aW91cyBjdXJ2ZSBpcyBwcmVzZW50LCBhdHRlbXB0IHRvIGpvaW5cblx0XHRcdHZhciBmaXJzdFBvaW50ID0gY3VydmUuZ2V0UG9pbnQoIDAgKTtcblxuXHRcdFx0aWYgKCAhIGZpcnN0UG9pbnQuZXF1YWxzKCB0aGlzLmN1cnJlbnRQb2ludCApICkge1xuXG5cdFx0XHRcdHRoaXMubGluZVRvKCBmaXJzdFBvaW50LngsIGZpcnN0UG9pbnQueSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdFx0dmFyIGxhc3RQb2ludCA9IGN1cnZlLmdldFBvaW50KCAxICk7XG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuY29weSggbGFzdFBvaW50ICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdEN1cnZlUGF0aC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LmNvcHkoIHNvdXJjZS5jdXJyZW50UG9pbnQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZGF0YSA9IEN1cnZlUGF0aC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRcdGRhdGEuY3VycmVudFBvaW50ID0gdGhpcy5jdXJyZW50UG9pbnQudG9BcnJheSgpO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fSxcblxuXHRmcm9tSlNPTjogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0Q3VydmVQYXRoLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5mcm9tQXJyYXkoIGpzb24uY3VycmVudFBvaW50ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBEZWZpbmVzIGEgMmQgc2hhcGUgcGxhbmUgdXNpbmcgcGF0aHMuXG4gKiovXG5cbi8vIFNURVAgMSBDcmVhdGUgYSBwYXRoLlxuLy8gU1RFUCAyIFR1cm4gcGF0aCBpbnRvIHNoYXBlLlxuLy8gU1RFUCAzIEV4dHJ1ZGVHZW9tZXRyeSB0YWtlcyBpbiBTaGFwZS9TaGFwZXNcbi8vIFNURVAgM2EgLSBFeHRyYWN0IHBvaW50cyBmcm9tIGVhY2ggc2hhcGUsIHR1cm4gdG8gdmVydGljZXNcbi8vIFNURVAgM2IgLSBUcmlhbmd1bGF0ZSBlYWNoIHNoYXBlLCBhZGQgZmFjZXMuXG5cbmZ1bmN0aW9uIFNoYXBlKCBwb2ludHMgKSB7XG5cblx0UGF0aC5jYWxsKCB0aGlzLCBwb2ludHMgKTtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLnR5cGUgPSAnU2hhcGUnO1xuXG5cdHRoaXMuaG9sZXMgPSBbXTtcblxufVxuXG5TaGFwZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBQYXRoLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFNoYXBlLFxuXG5cdGdldFBvaW50c0hvbGVzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdHZhciBob2xlc1B0cyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5ob2xlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRob2xlc1B0c1sgaSBdID0gdGhpcy5ob2xlc1sgaSBdLmdldFBvaW50cyggZGl2aXNpb25zICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gaG9sZXNQdHM7XG5cblx0fSxcblxuXHQvLyBnZXQgcG9pbnRzIG9mIHNoYXBlIGFuZCBob2xlcyAoa2V5cG9pbnRzIGJhc2VkIG9uIHNlZ21lbnRzIHBhcmFtZXRlcilcblxuXHRleHRyYWN0UG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdHJldHVybiB7XG5cblx0XHRcdHNoYXBlOiB0aGlzLmdldFBvaW50cyggZGl2aXNpb25zICksXG5cdFx0XHRob2xlczogdGhpcy5nZXRQb2ludHNIb2xlcyggZGl2aXNpb25zIClcblxuXHRcdH07XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdFBhdGgucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmhvbGVzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBzb3VyY2UuaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGhvbGUgPSBzb3VyY2UuaG9sZXNbIGkgXTtcblxuXHRcdFx0dGhpcy5ob2xlcy5wdXNoKCBob2xlLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZGF0YSA9IFBhdGgucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0XHRkYXRhLnV1aWQgPSB0aGlzLnV1aWQ7XG5cdFx0ZGF0YS5ob2xlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5ob2xlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgaG9sZSA9IHRoaXMuaG9sZXNbIGkgXTtcblx0XHRcdGRhdGEuaG9sZXMucHVzaCggaG9sZS50b0pTT04oKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fSxcblxuXHRmcm9tSlNPTjogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0UGF0aC5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdFx0dGhpcy51dWlkID0ganNvbi51dWlkO1xuXHRcdHRoaXMuaG9sZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24uaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGhvbGUgPSBqc29uLmhvbGVzWyBpIF07XG5cdFx0XHR0aGlzLmhvbGVzLnB1c2goIG5ldyBQYXRoKCkuZnJvbUpTT04oIGhvbGUgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gTGlnaHQoIGNvbG9yLCBpbnRlbnNpdHkgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMaWdodCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggY29sb3IgKTtcblx0dGhpcy5pbnRlbnNpdHkgPSBpbnRlbnNpdHkgIT09IHVuZGVmaW5lZCA/IGludGVuc2l0eSA6IDE7XG5cblx0dGhpcy5yZWNlaXZlU2hhZG93ID0gdW5kZWZpbmVkO1xuXG59XG5cbkxpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExpZ2h0LFxuXG5cdGlzTGlnaHQ6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cdFx0dGhpcy5pbnRlbnNpdHkgPSBzb3VyY2UuaW50ZW5zaXR5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRcdHZhciBkYXRhID0gT2JqZWN0M0QucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7XG5cblx0XHRkYXRhLm9iamVjdC5jb2xvciA9IHRoaXMuY29sb3IuZ2V0SGV4KCk7XG5cdFx0ZGF0YS5vYmplY3QuaW50ZW5zaXR5ID0gdGhpcy5pbnRlbnNpdHk7XG5cblx0XHRpZiAoIHRoaXMuZ3JvdW5kQ29sb3IgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0Lmdyb3VuZENvbG9yID0gdGhpcy5ncm91bmRDb2xvci5nZXRIZXgoKTtcblxuXHRcdGlmICggdGhpcy5kaXN0YW5jZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QuZGlzdGFuY2UgPSB0aGlzLmRpc3RhbmNlO1xuXHRcdGlmICggdGhpcy5hbmdsZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QuYW5nbGUgPSB0aGlzLmFuZ2xlO1xuXHRcdGlmICggdGhpcy5kZWNheSAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QuZGVjYXkgPSB0aGlzLmRlY2F5O1xuXHRcdGlmICggdGhpcy5wZW51bWJyYSAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QucGVudW1icmEgPSB0aGlzLnBlbnVtYnJhO1xuXG5cdFx0aWYgKCB0aGlzLnNoYWRvdyAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3Quc2hhZG93ID0gdGhpcy5zaGFkb3cudG9KU09OKCk7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEhlbWlzcGhlcmVMaWdodCggc2t5Q29sb3IsIGdyb3VuZENvbG9yLCBpbnRlbnNpdHkgKSB7XG5cblx0TGlnaHQuY2FsbCggdGhpcywgc2t5Q29sb3IsIGludGVuc2l0eSApO1xuXG5cdHRoaXMudHlwZSA9ICdIZW1pc3BoZXJlTGlnaHQnO1xuXG5cdHRoaXMuY2FzdFNoYWRvdyA9IHVuZGVmaW5lZDtcblxuXHR0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNELkRlZmF1bHRVcCApO1xuXHR0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdHRoaXMuZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IoIGdyb3VuZENvbG9yICk7XG5cbn1cblxuSGVtaXNwaGVyZUxpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEhlbWlzcGhlcmVMaWdodCxcblxuXHRpc0hlbWlzcGhlcmVMaWdodDogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdExpZ2h0LnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5ncm91bmRDb2xvci5jb3B5KCBzb3VyY2UuZ3JvdW5kQ29sb3IgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gTGlnaHRTaGFkb3coIGNhbWVyYSApIHtcblxuXHR0aGlzLmNhbWVyYSA9IGNhbWVyYTtcblxuXHR0aGlzLmJpYXMgPSAwO1xuXHR0aGlzLnJhZGl1cyA9IDE7XG5cblx0dGhpcy5tYXBTaXplID0gbmV3IFZlY3RvcjIoIDUxMiwgNTEyICk7XG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXHR0aGlzLm1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggTGlnaHRTaGFkb3cucHJvdG90eXBlLCB7XG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLmNhbWVyYSA9IHNvdXJjZS5jYW1lcmEuY2xvbmUoKTtcblxuXHRcdHRoaXMuYmlhcyA9IHNvdXJjZS5iaWFzO1xuXHRcdHRoaXMucmFkaXVzID0gc291cmNlLnJhZGl1cztcblxuXHRcdHRoaXMubWFwU2l6ZS5jb3B5KCBzb3VyY2UubWFwU2l6ZSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb2JqZWN0ID0ge307XG5cblx0XHRpZiAoIHRoaXMuYmlhcyAhPT0gMCApIG9iamVjdC5iaWFzID0gdGhpcy5iaWFzO1xuXHRcdGlmICggdGhpcy5yYWRpdXMgIT09IDEgKSBvYmplY3QucmFkaXVzID0gdGhpcy5yYWRpdXM7XG5cdFx0aWYgKCB0aGlzLm1hcFNpemUueCAhPT0gNTEyIHx8IHRoaXMubWFwU2l6ZS55ICE9PSA1MTIgKSBvYmplY3QubWFwU2l6ZSA9IHRoaXMubWFwU2l6ZS50b0FycmF5KCk7XG5cblx0XHRvYmplY3QuY2FtZXJhID0gdGhpcy5jYW1lcmEudG9KU09OKCBmYWxzZSApLm9iamVjdDtcblx0XHRkZWxldGUgb2JqZWN0LmNhbWVyYS5tYXRyaXg7XG5cblx0XHRyZXR1cm4gb2JqZWN0O1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gU3BvdExpZ2h0U2hhZG93KCkge1xuXG5cdExpZ2h0U2hhZG93LmNhbGwoIHRoaXMsIG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggNTAsIDEsIDAuNSwgNTAwICkgKTtcblxufVxuXG5TcG90TGlnaHRTaGFkb3cucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHRTaGFkb3cucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogU3BvdExpZ2h0U2hhZG93LFxuXG5cdGlzU3BvdExpZ2h0U2hhZG93OiB0cnVlLFxuXG5cdHVwZGF0ZTogZnVuY3Rpb24gKCBsaWdodCApIHtcblxuXHRcdHZhciBjYW1lcmEgPSB0aGlzLmNhbWVyYTtcblxuXHRcdHZhciBmb3YgPSBfTWF0aC5SQUQyREVHICogMiAqIGxpZ2h0LmFuZ2xlO1xuXHRcdHZhciBhc3BlY3QgPSB0aGlzLm1hcFNpemUud2lkdGggLyB0aGlzLm1hcFNpemUuaGVpZ2h0O1xuXHRcdHZhciBmYXIgPSBsaWdodC5kaXN0YW5jZSB8fCBjYW1lcmEuZmFyO1xuXG5cdFx0aWYgKCBmb3YgIT09IGNhbWVyYS5mb3YgfHwgYXNwZWN0ICE9PSBjYW1lcmEuYXNwZWN0IHx8IGZhciAhPT0gY2FtZXJhLmZhciApIHtcblxuXHRcdFx0Y2FtZXJhLmZvdiA9IGZvdjtcblx0XHRcdGNhbWVyYS5hc3BlY3QgPSBhc3BlY3Q7XG5cdFx0XHRjYW1lcmEuZmFyID0gZmFyO1xuXHRcdFx0Y2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIFNwb3RMaWdodCggY29sb3IsIGludGVuc2l0eSwgZGlzdGFuY2UsIGFuZ2xlLCBwZW51bWJyYSwgZGVjYXkgKSB7XG5cblx0TGlnaHQuY2FsbCggdGhpcywgY29sb3IsIGludGVuc2l0eSApO1xuXG5cdHRoaXMudHlwZSA9ICdTcG90TGlnaHQnO1xuXG5cdHRoaXMucG9zaXRpb24uY29weSggT2JqZWN0M0QuRGVmYXVsdFVwICk7XG5cdHRoaXMudXBkYXRlTWF0cml4KCk7XG5cblx0dGhpcy50YXJnZXQgPSBuZXcgT2JqZWN0M0QoKTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdwb3dlcicsIHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Ly8gaW50ZW5zaXR5ID0gcG93ZXIgcGVyIHNvbGlkIGFuZ2xlLlxuXHRcdFx0Ly8gcmVmOiBlcXVhdGlvbiAoMTcpIGZyb20gaHR0cHM6Ly9zZWJsYWdhcmRlLmZpbGVzLndvcmRwcmVzcy5jb20vMjAxNS8wNy9jb3Vyc2Vfbm90ZXNfbW92aW5nX2Zyb3N0Yml0ZV90b19wYnJfdjMyLnBkZlxuXHRcdFx0cmV0dXJuIHRoaXMuaW50ZW5zaXR5ICogTWF0aC5QSTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHBvd2VyICkge1xuXG5cdFx0XHQvLyBpbnRlbnNpdHkgPSBwb3dlciBwZXIgc29saWQgYW5nbGUuXG5cdFx0XHQvLyByZWY6IGVxdWF0aW9uICgxNykgZnJvbSBodHRwczovL3NlYmxhZ2FyZGUuZmlsZXMud29yZHByZXNzLmNvbS8yMDE1LzA3L2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3RvX3Bicl92MzIucGRmXG5cdFx0XHR0aGlzLmludGVuc2l0eSA9IHBvd2VyIC8gTWF0aC5QSTtcblxuXHRcdH1cblx0fSApO1xuXG5cdHRoaXMuZGlzdGFuY2UgPSAoIGRpc3RhbmNlICE9PSB1bmRlZmluZWQgKSA/IGRpc3RhbmNlIDogMDtcblx0dGhpcy5hbmdsZSA9ICggYW5nbGUgIT09IHVuZGVmaW5lZCApID8gYW5nbGUgOiBNYXRoLlBJIC8gMztcblx0dGhpcy5wZW51bWJyYSA9ICggcGVudW1icmEgIT09IHVuZGVmaW5lZCApID8gcGVudW1icmEgOiAwO1xuXHR0aGlzLmRlY2F5ID0gKCBkZWNheSAhPT0gdW5kZWZpbmVkICkgPyBkZWNheSA6IDE7XHQvLyBmb3IgcGh5c2ljYWxseSBjb3JyZWN0IGxpZ2h0cywgc2hvdWxkIGJlIDIuXG5cblx0dGhpcy5zaGFkb3cgPSBuZXcgU3BvdExpZ2h0U2hhZG93KCk7XG5cbn1cblxuU3BvdExpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFNwb3RMaWdodCxcblxuXHRpc1Nwb3RMaWdodDogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdExpZ2h0LnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5kaXN0YW5jZSA9IHNvdXJjZS5kaXN0YW5jZTtcblx0XHR0aGlzLmFuZ2xlID0gc291cmNlLmFuZ2xlO1xuXHRcdHRoaXMucGVudW1icmEgPSBzb3VyY2UucGVudW1icmE7XG5cdFx0dGhpcy5kZWNheSA9IHNvdXJjZS5kZWNheTtcblxuXHRcdHRoaXMudGFyZ2V0ID0gc291cmNlLnRhcmdldC5jbG9uZSgpO1xuXG5cdFx0dGhpcy5zaGFkb3cgPSBzb3VyY2Uuc2hhZG93LmNsb25lKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cblxuZnVuY3Rpb24gUG9pbnRMaWdodCggY29sb3IsIGludGVuc2l0eSwgZGlzdGFuY2UsIGRlY2F5ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnUG9pbnRMaWdodCc7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAncG93ZXInLCB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdC8vIGludGVuc2l0eSA9IHBvd2VyIHBlciBzb2xpZCBhbmdsZS5cblx0XHRcdC8vIHJlZjogZXF1YXRpb24gKDE1KSBmcm9tIGh0dHBzOi8vc2VibGFnYXJkZS5maWxlcy53b3JkcHJlc3MuY29tLzIwMTUvMDcvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyX3YzMi5wZGZcblx0XHRcdHJldHVybiB0aGlzLmludGVuc2l0eSAqIDQgKiBNYXRoLlBJO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggcG93ZXIgKSB7XG5cblx0XHRcdC8vIGludGVuc2l0eSA9IHBvd2VyIHBlciBzb2xpZCBhbmdsZS5cblx0XHRcdC8vIHJlZjogZXF1YXRpb24gKDE1KSBmcm9tIGh0dHBzOi8vc2VibGFnYXJkZS5maWxlcy53b3JkcHJlc3MuY29tLzIwMTUvMDcvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyX3YzMi5wZGZcblx0XHRcdHRoaXMuaW50ZW5zaXR5ID0gcG93ZXIgLyAoIDQgKiBNYXRoLlBJICk7XG5cblx0XHR9XG5cdH0gKTtcblxuXHR0aGlzLmRpc3RhbmNlID0gKCBkaXN0YW5jZSAhPT0gdW5kZWZpbmVkICkgPyBkaXN0YW5jZSA6IDA7XG5cdHRoaXMuZGVjYXkgPSAoIGRlY2F5ICE9PSB1bmRlZmluZWQgKSA/IGRlY2F5IDogMTtcdC8vIGZvciBwaHlzaWNhbGx5IGNvcnJlY3QgbGlnaHRzLCBzaG91bGQgYmUgMi5cblxuXHR0aGlzLnNoYWRvdyA9IG5ldyBMaWdodFNoYWRvdyggbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCA5MCwgMSwgMC41LCA1MDAgKSApO1xuXG59XG5cblBvaW50TGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogUG9pbnRMaWdodCxcblxuXHRpc1BvaW50TGlnaHQ6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuZGlzdGFuY2UgPSBzb3VyY2UuZGlzdGFuY2U7XG5cdFx0dGhpcy5kZWNheSA9IHNvdXJjZS5kZWNheTtcblxuXHRcdHRoaXMuc2hhZG93ID0gc291cmNlLnNoYWRvdy5jbG9uZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBEaXJlY3Rpb25hbExpZ2h0U2hhZG93KCApIHtcblxuXHRMaWdodFNoYWRvdy5jYWxsKCB0aGlzLCBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKCAtIDUsIDUsIDUsIC0gNSwgMC41LCA1MDAgKSApO1xuXG59XG5cbkRpcmVjdGlvbmFsTGlnaHRTaGFkb3cucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHRTaGFkb3cucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogRGlyZWN0aW9uYWxMaWdodFNoYWRvd1xuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gRGlyZWN0aW9uYWxMaWdodCggY29sb3IsIGludGVuc2l0eSApIHtcblxuXHRMaWdodC5jYWxsKCB0aGlzLCBjb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0dGhpcy50eXBlID0gJ0RpcmVjdGlvbmFsTGlnaHQnO1xuXG5cdHRoaXMucG9zaXRpb24uY29weSggT2JqZWN0M0QuRGVmYXVsdFVwICk7XG5cdHRoaXMudXBkYXRlTWF0cml4KCk7XG5cblx0dGhpcy50YXJnZXQgPSBuZXcgT2JqZWN0M0QoKTtcblxuXHR0aGlzLnNoYWRvdyA9IG5ldyBEaXJlY3Rpb25hbExpZ2h0U2hhZG93KCk7XG5cbn1cblxuRGlyZWN0aW9uYWxMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBEaXJlY3Rpb25hbExpZ2h0LFxuXG5cdGlzRGlyZWN0aW9uYWxMaWdodDogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdExpZ2h0LnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy50YXJnZXQgPSBzb3VyY2UudGFyZ2V0LmNsb25lKCk7XG5cblx0XHR0aGlzLnNoYWRvdyA9IHNvdXJjZS5zaGFkb3cuY2xvbmUoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQW1iaWVudExpZ2h0KCBjb2xvciwgaW50ZW5zaXR5ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnQW1iaWVudExpZ2h0JztcblxuXHR0aGlzLmNhc3RTaGFkb3cgPSB1bmRlZmluZWQ7XG5cbn1cblxuQW1iaWVudExpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEFtYmllbnRMaWdodCxcblxuXHRpc0FtYmllbnRMaWdodDogdHJ1ZVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhYmVsbmF0aW9uIC8gaHR0cDovL2dpdGh1Yi5jb20vYWJlbG5hdGlvblxuICovXG5cbmZ1bmN0aW9uIFJlY3RBcmVhTGlnaHQoIGNvbG9yLCBpbnRlbnNpdHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0TGlnaHQuY2FsbCggdGhpcywgY29sb3IsIGludGVuc2l0eSApO1xuXG5cdHRoaXMudHlwZSA9ICdSZWN0QXJlYUxpZ2h0JztcblxuXHR0aGlzLndpZHRoID0gKCB3aWR0aCAhPT0gdW5kZWZpbmVkICkgPyB3aWR0aCA6IDEwO1xuXHR0aGlzLmhlaWdodCA9ICggaGVpZ2h0ICE9PSB1bmRlZmluZWQgKSA/IGhlaWdodCA6IDEwO1xuXG59XG5cblJlY3RBcmVhTGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogUmVjdEFyZWFMaWdodCxcblxuXHRpc1JlY3RBcmVhTGlnaHQ6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMud2lkdGggPSBzb3VyY2Uud2lkdGg7XG5cdFx0dGhpcy5oZWlnaHQgPSBzb3VyY2UuaGVpZ2h0O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRcdHZhciBkYXRhID0gTGlnaHQucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7XG5cblx0XHRkYXRhLm9iamVjdC53aWR0aCA9IHRoaXMud2lkdGg7XG5cdFx0ZGF0YS5vYmplY3QuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSBUcmFjayB0aGF0IGludGVycG9sYXRlcyBTdHJpbmdzXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBTdHJpbmdLZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdEtleWZyYW1lVHJhY2suY2FsbCggdGhpcywgbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApO1xuXG59XG5cblN0cmluZ0tleWZyYW1lVHJhY2sucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTdHJpbmdLZXlmcmFtZVRyYWNrLFxuXG5cdFZhbHVlVHlwZU5hbWU6ICdzdHJpbmcnLFxuXHRWYWx1ZUJ1ZmZlclR5cGU6IEFycmF5LFxuXG5cdERlZmF1bHRJbnRlcnBvbGF0aW9uOiBJbnRlcnBvbGF0ZURpc2NyZXRlLFxuXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjogdW5kZWZpbmVkLFxuXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDogdW5kZWZpbmVkXG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSBUcmFjayBvZiBCb29sZWFuIGtleWZyYW1lIHZhbHVlcy5cbiAqXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIEJvb2xlYW5LZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzICkge1xuXG5cdEtleWZyYW1lVHJhY2suY2FsbCggdGhpcywgbmFtZSwgdGltZXMsIHZhbHVlcyApO1xuXG59XG5cbkJvb2xlYW5LZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQm9vbGVhbktleWZyYW1lVHJhY2ssXG5cblx0VmFsdWVUeXBlTmFtZTogJ2Jvb2wnLFxuXHRWYWx1ZUJ1ZmZlclR5cGU6IEFycmF5LFxuXG5cdERlZmF1bHRJbnRlcnBvbGF0aW9uOiBJbnRlcnBvbGF0ZURpc2NyZXRlLFxuXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjogdW5kZWZpbmVkLFxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6IHVuZGVmaW5lZFxuXG5cdC8vIE5vdGU6IEFjdHVhbGx5IHRoaXMgdHJhY2sgY291bGQgaGF2ZSBhIG9wdGltaXplZCAvIGNvbXByZXNzZWRcblx0Ly8gcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgdmFsdWUgYW5kIGEgY3VzdG9tIGludGVycG9sYW50IHRoYXRcblx0Ly8gY29tcHV0ZXMgXCJmaXJzdFZhbHVlIF4gaXNPZGQoIGluZGV4IClcIi5cblxufSApO1xuXG4vKipcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgaW50ZXJwb2xhbnRzIG92ZXIgcGFyYW1ldHJpYyBzYW1wbGVzLlxuICpcbiAqIFRoZSBwYXJhbWV0ZXIgZG9tYWluIGlzIG9uZSBkaW1lbnNpb25hbCwgdHlwaWNhbGx5IHRoZSB0aW1lIG9yIGEgcGF0aFxuICogYWxvbmcgYSBjdXJ2ZSBkZWZpbmVkIGJ5IHRoZSBkYXRhLlxuICpcbiAqIFRoZSBzYW1wbGUgdmFsdWVzIGNhbiBoYXZlIGFueSBkaW1lbnNpb25hbGl0eSBhbmQgZGVyaXZlZCBjbGFzc2VzIG1heVxuICogYXBwbHkgc3BlY2lhbCBpbnRlcnByZXRhdGlvbnMgdG8gdGhlIGRhdGEuXG4gKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgaW50ZXJ2YWwgc2VlayBpbiBhIFRlbXBsYXRlIE1ldGhvZCwgZGVmZXJyaW5nXG4gKiB0aGUgYWN0dWFsIGludGVycG9sYXRpb24gdG8gZGVyaXZlZCBjbGFzc2VzLlxuICpcbiAqIFRpbWUgY29tcGxleGl0eSBpcyBPKDEpIGZvciBsaW5lYXIgYWNjZXNzIGNyb3NzaW5nIGF0IG1vc3QgdHdvIHBvaW50c1xuICogYW5kIE8obG9nIE4pIGZvciByYW5kb20gYWNjZXNzLCB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2YgcG9zaXRpb25zLlxuICpcbiAqIFJlZmVyZW5jZXM6XG4gKlxuICogXHRcdGh0dHA6Ly93d3cub29kZXNpZ24uY29tL3RlbXBsYXRlLW1ldGhvZC1wYXR0ZXJuLmh0bWxcbiAqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gSW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0dGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMgPSBwYXJhbWV0ZXJQb3NpdGlvbnM7XG5cdHRoaXMuX2NhY2hlZEluZGV4ID0gMDtcblxuXHR0aGlzLnJlc3VsdEJ1ZmZlciA9IHJlc3VsdEJ1ZmZlciAhPT0gdW5kZWZpbmVkID9cblx0XHRyZXN1bHRCdWZmZXIgOiBuZXcgc2FtcGxlVmFsdWVzLmNvbnN0cnVjdG9yKCBzYW1wbGVTaXplICk7XG5cdHRoaXMuc2FtcGxlVmFsdWVzID0gc2FtcGxlVmFsdWVzO1xuXHR0aGlzLnZhbHVlU2l6ZSA9IHNhbXBsZVNpemU7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggSW50ZXJwb2xhbnQucHJvdG90eXBlLCB7XG5cblx0ZXZhbHVhdGU6IGZ1bmN0aW9uICggdCApIHtcblxuXHRcdHZhciBwcCA9IHRoaXMucGFyYW1ldGVyUG9zaXRpb25zLFxuXHRcdFx0aTEgPSB0aGlzLl9jYWNoZWRJbmRleCxcblxuXHRcdFx0dDEgPSBwcFsgaTEgXSxcblx0XHRcdHQwID0gcHBbIGkxIC0gMSBdO1xuXG5cdFx0dmFsaWRhdGVfaW50ZXJ2YWw6IHtcblxuXHRcdFx0c2Vlazoge1xuXG5cdFx0XHRcdHZhciByaWdodDtcblxuXHRcdFx0XHRsaW5lYXJfc2Nhbjoge1xuXG5cdFx0XHRcdFx0Ly8tIFNlZSBodHRwOi8vanNwZXJmLmNvbS9jb21wYXJpc29uLXRvLXVuZGVmaW5lZC8zXG5cdFx0XHRcdFx0Ly8tIHNsb3dlciBjb2RlOlxuXHRcdFx0XHRcdC8vLVxuXHRcdFx0XHRcdC8vLSBcdFx0XHRcdGlmICggdCA+PSB0MSB8fCB0MSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGZvcndhcmRfc2NhbjogaWYgKCAhICggdCA8IHQxICkgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIHZhciBnaXZlVXBBdCA9IGkxICsgMjsgOyApIHtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHQxID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoIHQgPCB0MCApIGJyZWFrIGZvcndhcmRfc2NhbjtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIGFmdGVyIGVuZFxuXG5cdFx0XHRcdFx0XHRcdFx0aTEgPSBwcC5sZW5ndGg7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSBpMTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5hZnRlckVuZF8oIGkxIC0gMSwgdCwgdDAgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBpMSA9PT0gZ2l2ZVVwQXQgKSBicmVhazsgLy8gdGhpcyBsb29wXG5cblx0XHRcdFx0XHRcdFx0dDAgPSB0MTtcblx0XHRcdFx0XHRcdFx0dDEgPSBwcFsgKysgaTEgXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHQgPCB0MSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIHdlIGhhdmUgYXJyaXZlZCBhdCB0aGUgc291Z2h0IGludGVydmFsXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWsgc2VlaztcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gcHJlcGFyZSBiaW5hcnkgc2VhcmNoIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBpbmRleFxuXHRcdFx0XHRcdFx0cmlnaHQgPSBwcC5sZW5ndGg7XG5cdFx0XHRcdFx0XHRicmVhayBsaW5lYXJfc2NhbjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vLSBzbG93ZXIgY29kZTpcblx0XHRcdFx0XHQvLy1cdFx0XHRcdFx0aWYgKCB0IDwgdDAgfHwgdDAgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRpZiAoICEgKCB0ID49IHQwICkgKSB7XG5cblx0XHRcdFx0XHRcdC8vIGxvb3Bpbmc/XG5cblx0XHRcdFx0XHRcdHZhciB0MWdsb2JhbCA9IHBwWyAxIF07XG5cblx0XHRcdFx0XHRcdGlmICggdCA8IHQxZ2xvYmFsICkge1xuXG5cdFx0XHRcdFx0XHRcdGkxID0gMjsgLy8gKyAxLCB1c2luZyB0aGUgc2NhbiBmb3IgdGhlIGRldGFpbHNcblx0XHRcdFx0XHRcdFx0dDAgPSB0MWdsb2JhbDtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBsaW5lYXIgcmV2ZXJzZSBzY2FuXG5cblx0XHRcdFx0XHRcdGZvciAoIHZhciBnaXZlVXBBdCA9IGkxIC0gMjsgOyApIHtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHQwID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBiZWZvcmUgc3RhcnRcblxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gMDtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5iZWZvcmVTdGFydF8oIDAsIHQsIHQxICk7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmICggaTEgPT09IGdpdmVVcEF0ICkgYnJlYWs7IC8vIHRoaXMgbG9vcFxuXG5cdFx0XHRcdFx0XHRcdHQxID0gdDA7XG5cdFx0XHRcdFx0XHRcdHQwID0gcHBbIC0tIGkxIC0gMSBdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdCA+PSB0MCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIHdlIGhhdmUgYXJyaXZlZCBhdCB0aGUgc291Z2h0IGludGVydmFsXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWsgc2VlaztcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gcHJlcGFyZSBiaW5hcnkgc2VhcmNoIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGluZGV4XG5cdFx0XHRcdFx0XHRyaWdodCA9IGkxO1xuXHRcdFx0XHRcdFx0aTEgPSAwO1xuXHRcdFx0XHRcdFx0YnJlYWsgbGluZWFyX3NjYW47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyB0aGUgaW50ZXJ2YWwgaXMgdmFsaWRcblxuXHRcdFx0XHRcdGJyZWFrIHZhbGlkYXRlX2ludGVydmFsO1xuXG5cdFx0XHRcdH0gLy8gbGluZWFyIHNjYW5cblxuXHRcdFx0XHQvLyBiaW5hcnkgc2VhcmNoXG5cblx0XHRcdFx0d2hpbGUgKCBpMSA8IHJpZ2h0ICkge1xuXG5cdFx0XHRcdFx0dmFyIG1pZCA9ICggaTEgKyByaWdodCApID4+PiAxO1xuXG5cdFx0XHRcdFx0aWYgKCB0IDwgcHBbIG1pZCBdICkge1xuXG5cdFx0XHRcdFx0XHRyaWdodCA9IG1pZDtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGkxID0gbWlkICsgMTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dDEgPSBwcFsgaTEgXTtcblx0XHRcdFx0dDAgPSBwcFsgaTEgLSAxIF07XG5cblx0XHRcdFx0Ly8gY2hlY2sgYm91bmRhcnkgY2FzZXMsIGFnYWluXG5cblx0XHRcdFx0aWYgKCB0MCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSAwO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmJlZm9yZVN0YXJ0XyggMCwgdCwgdDEgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCB0MSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0aTEgPSBwcC5sZW5ndGg7XG5cdFx0XHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSBpMTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5hZnRlckVuZF8oIGkxIC0gMSwgdDAsIHQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gLy8gc2Vla1xuXG5cdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IGkxO1xuXG5cdFx0XHR0aGlzLmludGVydmFsQ2hhbmdlZF8oIGkxLCB0MCwgdDEgKTtcblxuXHRcdH0gLy8gdmFsaWRhdGVfaW50ZXJ2YWxcblxuXHRcdHJldHVybiB0aGlzLmludGVycG9sYXRlXyggaTEsIHQwLCB0LCB0MSApO1xuXG5cdH0sXG5cblx0c2V0dGluZ3M6IG51bGwsIC8vIG9wdGlvbmFsLCBzdWJjbGFzcy1zcGVjaWZpYyBzZXR0aW5ncyBzdHJ1Y3R1cmVcblx0Ly8gTm90ZTogVGhlIGluZGlyZWN0aW9uIGFsbG93cyBjZW50cmFsIGNvbnRyb2wgb2YgbWFueSBpbnRlcnBvbGFudHMuXG5cblx0Ly8gLS0tIFByb3RlY3RlZCBpbnRlcmZhY2VcblxuXHREZWZhdWx0U2V0dGluZ3NfOiB7fSxcblxuXHRnZXRTZXR0aW5nc186IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnNldHRpbmdzIHx8IHRoaXMuRGVmYXVsdFNldHRpbmdzXztcblxuXHR9LFxuXG5cdGNvcHlTYW1wbGVWYWx1ZV86IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHQvLyBjb3BpZXMgYSBzYW1wbGUgdmFsdWUgdG8gdGhlIHJlc3VsdCBidWZmZXJcblxuXHRcdHZhciByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cdFx0XHRvZmZzZXQgPSBpbmRleCAqIHN0cmlkZTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHRyZXN1bHRbIGkgXSA9IHZhbHVlc1sgb2Zmc2V0ICsgaSBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9LFxuXG5cdC8vIFRlbXBsYXRlIG1ldGhvZHMgZm9yIGRlcml2ZWQgY2xhc3NlczpcblxuXHRpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uICggLyogaTEsIHQwLCB0LCB0MSAqLyApIHtcblxuXHRcdHRocm93IG5ldyBFcnJvciggJ2NhbGwgdG8gYWJzdHJhY3QgbWV0aG9kJyApO1xuXHRcdC8vIGltcGxlbWVudGF0aW9ucyBzaGFsbCByZXR1cm4gdGhpcy5yZXN1bHRCdWZmZXJcblxuXHR9LFxuXG5cdGludGVydmFsQ2hhbmdlZF86IGZ1bmN0aW9uICggLyogaTEsIHQwLCB0MSAqLyApIHtcblxuXHRcdC8vIGVtcHR5XG5cblx0fVxuXG59ICk7XG5cbi8vIVxcIERFQ0xBUkUgQUxJQVMgQUZURVIgYXNzaWduIHByb3RvdHlwZSAhXG5PYmplY3QuYXNzaWduKCBJbnRlcnBvbGFudC5wcm90b3R5cGUsIHtcblxuXHQvLyggMCwgdCwgdDAgKSwgcmV0dXJucyB0aGlzLnJlc3VsdEJ1ZmZlclxuXHRiZWZvcmVTdGFydF86IEludGVycG9sYW50LnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVfLFxuXG5cdC8vKCBOLTEsIHROLTEsIHQgKSwgcmV0dXJucyB0aGlzLnJlc3VsdEJ1ZmZlclxuXHRhZnRlckVuZF86IEludGVycG9sYW50LnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVfLFxuXG59ICk7XG5cbi8qKlxuICogU3BoZXJpY2FsIGxpbmVhciB1bml0IHF1YXRlcm5pb24gaW50ZXJwb2xhbnQuXG4gKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHtcblxuXHRJbnRlcnBvbGFudC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICk7XG5cbn1cblxuUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEludGVycG9sYW50LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCxcblxuXHRpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uICggaTEsIHQwLCB0LCB0MSApIHtcblxuXHRcdHZhciByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cblx0XHRcdG9mZnNldCA9IGkxICogc3RyaWRlLFxuXG5cdFx0XHRhbHBoYSA9ICggdCAtIHQwICkgLyAoIHQxIC0gdDAgKTtcblxuXHRcdGZvciAoIHZhciBlbmQgPSBvZmZzZXQgKyBzdHJpZGU7IG9mZnNldCAhPT0gZW5kOyBvZmZzZXQgKz0gNCApIHtcblxuXHRcdFx0UXVhdGVybmlvbi5zbGVycEZsYXQoIHJlc3VsdCwgMCwgdmFsdWVzLCBvZmZzZXQgLSBzdHJpZGUsIHZhbHVlcywgb2Zmc2V0LCBhbHBoYSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSBUcmFjayBvZiBxdWF0ZXJuaW9uIGtleWZyYW1lIHZhbHVlcy5cbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gUXVhdGVybmlvbktleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XG5cblx0S2V5ZnJhbWVUcmFjay5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7XG5cbn1cblxuUXVhdGVybmlvbktleWZyYW1lVHJhY2sucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjayxcblxuXHRWYWx1ZVR5cGVOYW1lOiAncXVhdGVybmlvbicsXG5cblx0Ly8gVmFsdWVCdWZmZXJUeXBlIGlzIGluaGVyaXRlZFxuXG5cdERlZmF1bHRJbnRlcnBvbGF0aW9uOiBJbnRlcnBvbGF0ZUxpbmVhcixcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6IGZ1bmN0aW9uICggcmVzdWx0ICkge1xuXG5cdFx0cmV0dXJuIG5ldyBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQoIHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTtcblxuXHR9LFxuXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDogdW5kZWZpbmVkIC8vIG5vdCB5ZXQgaW1wbGVtZW50ZWRcblxufSApO1xuXG4vKipcbiAqXG4gKiBBIFRyYWNrIG9mIGtleWZyYW1lIHZhbHVlcyB0aGF0IHJlcHJlc2VudCBjb2xvci5cbiAqXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIENvbG9yS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTtcblxufVxuXG5Db2xvcktleWZyYW1lVHJhY2sucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBDb2xvcktleWZyYW1lVHJhY2ssXG5cblx0VmFsdWVUeXBlTmFtZTogJ2NvbG9yJ1xuXG5cdC8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcblxuXHQvLyBEZWZhdWx0SW50ZXJwb2xhdGlvbiBpcyBpbmhlcml0ZWRcblxuXHQvLyBOb3RlOiBWZXJ5IGJhc2ljIGltcGxlbWVudGF0aW9uIGFuZCBub3RoaW5nIHNwZWNpYWwgeWV0LlxuXHQvLyBIb3dldmVyLCB0aGlzIGlzIHRoZSBwbGFjZSBmb3IgY29sb3Igc3BhY2UgcGFyYW1ldGVyaXphdGlvbi5cblxufSApO1xuXG4vKipcbiAqXG4gKiBBIFRyYWNrIG9mIG51bWVyaWMga2V5ZnJhbWUgdmFsdWVzLlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBOdW1iZXJLZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdEtleWZyYW1lVHJhY2suY2FsbCggdGhpcywgbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApO1xuXG59XG5cbk51bWJlcktleWZyYW1lVHJhY2sucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBOdW1iZXJLZXlmcmFtZVRyYWNrLFxuXG5cdFZhbHVlVHlwZU5hbWU6ICdudW1iZXInXG5cblx0Ly8gVmFsdWVCdWZmZXJUeXBlIGlzIGluaGVyaXRlZFxuXG5cdC8vIERlZmF1bHRJbnRlcnBvbGF0aW9uIGlzIGluaGVyaXRlZFxuXG59ICk7XG5cbi8qKlxuICogRmFzdCBhbmQgc2ltcGxlIGN1YmljIHNwbGluZSBpbnRlcnBvbGFudC5cbiAqXG4gKiBJdCB3YXMgZGVyaXZlZCBmcm9tIGEgSGVybWl0aWFuIGNvbnN0cnVjdGlvbiBzZXR0aW5nIHRoZSBmaXJzdCBkZXJpdmF0aXZlXG4gKiBhdCBlYWNoIHNhbXBsZSBwb3NpdGlvbiB0byB0aGUgbGluZWFyIHNsb3BlIGJldHdlZW4gbmVpZ2hib3JpbmcgcG9zaXRpb25zXG4gKiBvdmVyIHRoZWlyIHBhcmFtZXRlciBpbnRlcnZhbC5cbiAqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gQ3ViaWNJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHtcblxuXHRJbnRlcnBvbGFudC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICk7XG5cblx0dGhpcy5fd2VpZ2h0UHJldiA9IC0gMDtcblx0dGhpcy5fb2Zmc2V0UHJldiA9IC0gMDtcblx0dGhpcy5fd2VpZ2h0TmV4dCA9IC0gMDtcblx0dGhpcy5fb2Zmc2V0TmV4dCA9IC0gMDtcblxufVxuXG5DdWJpY0ludGVycG9sYW50LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEludGVycG9sYW50LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEN1YmljSW50ZXJwb2xhbnQsXG5cblx0RGVmYXVsdFNldHRpbmdzXzoge1xuXG5cdFx0ZW5kaW5nU3RhcnQ6IFplcm9DdXJ2YXR1cmVFbmRpbmcsXG5cdFx0ZW5kaW5nRW5kOiBaZXJvQ3VydmF0dXJlRW5kaW5nXG5cblx0fSxcblxuXHRpbnRlcnZhbENoYW5nZWRfOiBmdW5jdGlvbiAoIGkxLCB0MCwgdDEgKSB7XG5cblx0XHR2YXIgcHAgPSB0aGlzLnBhcmFtZXRlclBvc2l0aW9ucyxcblx0XHRcdGlQcmV2ID0gaTEgLSAyLFxuXHRcdFx0aU5leHQgPSBpMSArIDEsXG5cblx0XHRcdHRQcmV2ID0gcHBbIGlQcmV2IF0sXG5cdFx0XHR0TmV4dCA9IHBwWyBpTmV4dCBdO1xuXG5cdFx0aWYgKCB0UHJldiA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzd2l0Y2ggKCB0aGlzLmdldFNldHRpbmdzXygpLmVuZGluZ1N0YXJ0ICkge1xuXG5cdFx0XHRcdGNhc2UgWmVyb1Nsb3BlRW5kaW5nOlxuXG5cdFx0XHRcdFx0Ly8gZicodDApID0gMFxuXHRcdFx0XHRcdGlQcmV2ID0gaTE7XG5cdFx0XHRcdFx0dFByZXYgPSAyICogdDAgLSB0MTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgV3JhcEFyb3VuZEVuZGluZzpcblxuXHRcdFx0XHRcdC8vIHVzZSB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjdXJ2ZVxuXHRcdFx0XHRcdGlQcmV2ID0gcHAubGVuZ3RoIC0gMjtcblx0XHRcdFx0XHR0UHJldiA9IHQwICsgcHBbIGlQcmV2IF0gLSBwcFsgaVByZXYgKyAxIF07XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OiAvLyBaZXJvQ3VydmF0dXJlRW5kaW5nXG5cblx0XHRcdFx0XHQvLyBmJycodDApID0gMCBhLmsuYS4gTmF0dXJhbCBTcGxpbmVcblx0XHRcdFx0XHRpUHJldiA9IGkxO1xuXHRcdFx0XHRcdHRQcmV2ID0gdDE7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdE5leHQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c3dpdGNoICggdGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdFbmQgKSB7XG5cblx0XHRcdFx0Y2FzZSBaZXJvU2xvcGVFbmRpbmc6XG5cblx0XHRcdFx0XHQvLyBmJyh0TikgPSAwXG5cdFx0XHRcdFx0aU5leHQgPSBpMTtcblx0XHRcdFx0XHR0TmV4dCA9IDIgKiB0MSAtIHQwO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBXcmFwQXJvdW5kRW5kaW5nOlxuXG5cdFx0XHRcdFx0Ly8gdXNlIHRoZSBvdGhlciBlbmQgb2YgdGhlIGN1cnZlXG5cdFx0XHRcdFx0aU5leHQgPSAxO1xuXHRcdFx0XHRcdHROZXh0ID0gdDEgKyBwcFsgMSBdIC0gcHBbIDAgXTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6IC8vIFplcm9DdXJ2YXR1cmVFbmRpbmdcblxuXHRcdFx0XHRcdC8vIGYnJyh0TikgPSAwLCBhLmsuYS4gTmF0dXJhbCBTcGxpbmVcblx0XHRcdFx0XHRpTmV4dCA9IGkxIC0gMTtcblx0XHRcdFx0XHR0TmV4dCA9IHQwO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgaGFsZkR0ID0gKCB0MSAtIHQwICkgKiAwLjUsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZTtcblxuXHRcdHRoaXMuX3dlaWdodFByZXYgPSBoYWxmRHQgLyAoIHQwIC0gdFByZXYgKTtcblx0XHR0aGlzLl93ZWlnaHROZXh0ID0gaGFsZkR0IC8gKCB0TmV4dCAtIHQxICk7XG5cdFx0dGhpcy5fb2Zmc2V0UHJldiA9IGlQcmV2ICogc3RyaWRlO1xuXHRcdHRoaXMuX29mZnNldE5leHQgPSBpTmV4dCAqIHN0cmlkZTtcblxuXHR9LFxuXG5cdGludGVycG9sYXRlXzogZnVuY3Rpb24gKCBpMSwgdDAsIHQsIHQxICkge1xuXG5cdFx0dmFyIHJlc3VsdCA9IHRoaXMucmVzdWx0QnVmZmVyLFxuXHRcdFx0dmFsdWVzID0gdGhpcy5zYW1wbGVWYWx1ZXMsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblxuXHRcdFx0bzEgPSBpMSAqIHN0cmlkZSxcdFx0bzAgPSBvMSAtIHN0cmlkZSxcblx0XHRcdG9QID0gdGhpcy5fb2Zmc2V0UHJldiwgXHRvTiA9IHRoaXMuX29mZnNldE5leHQsXG5cdFx0XHR3UCA9IHRoaXMuX3dlaWdodFByZXYsXHR3TiA9IHRoaXMuX3dlaWdodE5leHQsXG5cblx0XHRcdHAgPSAoIHQgLSB0MCApIC8gKCB0MSAtIHQwICksXG5cdFx0XHRwcCA9IHAgKiBwLFxuXHRcdFx0cHBwID0gcHAgKiBwO1xuXG5cdFx0Ly8gZXZhbHVhdGUgcG9seW5vbWlhbHNcblxuXHRcdHZhciBzUCA9IC0gd1AgKiBwcHAgKyAyICogd1AgKiBwcCAtIHdQICogcDtcblx0XHR2YXIgczAgPSAoIDEgKyB3UCApICogcHBwICsgKCAtIDEuNSAtIDIgKiB3UCApICogcHAgKyAoIC0gMC41ICsgd1AgKSAqIHAgKyAxO1xuXHRcdHZhciBzMSA9ICggLSAxIC0gd04gKSAqIHBwcCArICggMS41ICsgd04gKSAqIHBwICsgMC41ICogcDtcblx0XHR2YXIgc04gPSB3TiAqIHBwcCAtIHdOICogcHA7XG5cblx0XHQvLyBjb21iaW5lIGRhdGEgbGluZWFybHlcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHRyZXN1bHRbIGkgXSA9XG5cdFx0XHRcdFx0c1AgKiB2YWx1ZXNbIG9QICsgaSBdICtcblx0XHRcdFx0XHRzMCAqIHZhbHVlc1sgbzAgKyBpIF0gK1xuXHRcdFx0XHRcdHMxICogdmFsdWVzWyBvMSArIGkgXSArXG5cdFx0XHRcdFx0c04gKiB2YWx1ZXNbIG9OICsgaSBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gTGluZWFySW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0SW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xuXG59XG5cbkxpbmVhckludGVycG9sYW50LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEludGVycG9sYW50LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExpbmVhckludGVycG9sYW50LFxuXG5cdGludGVycG9sYXRlXzogZnVuY3Rpb24gKCBpMSwgdDAsIHQsIHQxICkge1xuXG5cdFx0dmFyIHJlc3VsdCA9IHRoaXMucmVzdWx0QnVmZmVyLFxuXHRcdFx0dmFsdWVzID0gdGhpcy5zYW1wbGVWYWx1ZXMsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblxuXHRcdFx0b2Zmc2V0MSA9IGkxICogc3RyaWRlLFxuXHRcdFx0b2Zmc2V0MCA9IG9mZnNldDEgLSBzdHJpZGUsXG5cblx0XHRcdHdlaWdodDEgPSAoIHQgLSB0MCApIC8gKCB0MSAtIHQwICksXG5cdFx0XHR3ZWlnaHQwID0gMSAtIHdlaWdodDE7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcblxuXHRcdFx0cmVzdWx0WyBpIF0gPVxuXHRcdFx0XHRcdHZhbHVlc1sgb2Zmc2V0MCArIGkgXSAqIHdlaWdodDAgK1xuXHRcdFx0XHRcdHZhbHVlc1sgb2Zmc2V0MSArIGkgXSAqIHdlaWdodDE7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqXG4gKiBJbnRlcnBvbGFudCB0aGF0IGV2YWx1YXRlcyB0byB0aGUgc2FtcGxlIHZhbHVlIGF0IHRoZSBwb3NpdGlvbiBwcmVjZWVkaW5nXG4gKiB0aGUgcGFyYW1ldGVyLlxuICpcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBEaXNjcmV0ZUludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkge1xuXG5cdEludGVycG9sYW50LmNhbGwoIHRoaXMsIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKTtcblxufVxuXG5EaXNjcmV0ZUludGVycG9sYW50LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEludGVycG9sYW50LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IERpc2NyZXRlSW50ZXJwb2xhbnQsXG5cblx0aW50ZXJwb2xhdGVfOiBmdW5jdGlvbiAoIGkxIC8qLCB0MCwgdCwgdDEgKi8gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5jb3B5U2FtcGxlVmFsdWVfKCBpMSAtIDEgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKi9cblxudmFyIEFuaW1hdGlvblV0aWxzID0ge1xuXG5cdC8vIHNhbWUgYXMgQXJyYXkucHJvdG90eXBlLnNsaWNlLCBidXQgYWxzbyB3b3JrcyBvbiB0eXBlZCBhcnJheXNcblx0YXJyYXlTbGljZTogZnVuY3Rpb24gKCBhcnJheSwgZnJvbSwgdG8gKSB7XG5cblx0XHRpZiAoIEFuaW1hdGlvblV0aWxzLmlzVHlwZWRBcnJheSggYXJyYXkgKSApIHtcblxuXHRcdFx0Ly8gaW4gaW9zOSBhcnJheS5zdWJhcnJheShmcm9tLCB1bmRlZmluZWQpIHdpbGwgcmV0dXJuIGVtcHR5IGFycmF5XG5cdFx0XHQvLyBidXQgYXJyYXkuc3ViYXJyYXkoZnJvbSkgb3IgYXJyYXkuc3ViYXJyYXkoZnJvbSwgbGVuKSBpcyBjb3JyZWN0XG5cdFx0XHRyZXR1cm4gbmV3IGFycmF5LmNvbnN0cnVjdG9yKCBhcnJheS5zdWJhcnJheSggZnJvbSwgdG8gIT09IHVuZGVmaW5lZCA/IHRvIDogYXJyYXkubGVuZ3RoICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBhcnJheS5zbGljZSggZnJvbSwgdG8gKTtcblxuXHR9LFxuXG5cdC8vIGNvbnZlcnRzIGFuIGFycmF5IHRvIGEgc3BlY2lmaWMgdHlwZVxuXHRjb252ZXJ0QXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIHR5cGUsIGZvcmNlQ2xvbmUgKSB7XG5cblx0XHRpZiAoICEgYXJyYXkgfHwgLy8gbGV0ICd1bmRlZmluZWQnIGFuZCAnbnVsbCcgcGFzc1xuXHRcdFx0XHQhIGZvcmNlQ2xvbmUgJiYgYXJyYXkuY29uc3RydWN0b3IgPT09IHR5cGUgKSByZXR1cm4gYXJyYXk7XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlLkJZVEVTX1BFUl9FTEVNRU5UID09PSAnbnVtYmVyJyApIHtcblxuXHRcdFx0cmV0dXJuIG5ldyB0eXBlKCBhcnJheSApOyAvLyBjcmVhdGUgdHlwZWQgYXJyYXlcblxuXHRcdH1cblxuXHRcdHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJyYXkgKTsgLy8gY3JlYXRlIEFycmF5XG5cblx0fSxcblxuXHRpc1R5cGVkQXJyYXk6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyggb2JqZWN0ICkgJiZcblx0XHRcdFx0ISAoIG9iamVjdCBpbnN0YW5jZW9mIERhdGFWaWV3ICk7XG5cblx0fSxcblxuXHQvLyByZXR1cm5zIGFuIGFycmF5IGJ5IHdoaWNoIHRpbWVzIGFuZCB2YWx1ZXMgY2FuIGJlIHNvcnRlZFxuXHRnZXRLZXlmcmFtZU9yZGVyOiBmdW5jdGlvbiAoIHRpbWVzICkge1xuXG5cdFx0ZnVuY3Rpb24gY29tcGFyZVRpbWUoIGksIGogKSB7XG5cblx0XHRcdHJldHVybiB0aW1lc1sgaSBdIC0gdGltZXNbIGogXTtcblxuXHRcdH1cblxuXHRcdHZhciBuID0gdGltZXMubGVuZ3RoO1xuXHRcdHZhciByZXN1bHQgPSBuZXcgQXJyYXkoIG4gKTtcblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG47ICsrIGkgKSByZXN1bHRbIGkgXSA9IGk7XG5cblx0XHRyZXN1bHQuc29ydCggY29tcGFyZVRpbWUgKTtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fSxcblxuXHQvLyB1c2VzIHRoZSBhcnJheSBwcmV2aW91c2x5IHJldHVybmVkIGJ5ICdnZXRLZXlmcmFtZU9yZGVyJyB0byBzb3J0IGRhdGFcblx0c29ydGVkQXJyYXk6IGZ1bmN0aW9uICggdmFsdWVzLCBzdHJpZGUsIG9yZGVyICkge1xuXG5cdFx0dmFyIG5WYWx1ZXMgPSB2YWx1ZXMubGVuZ3RoO1xuXHRcdHZhciByZXN1bHQgPSBuZXcgdmFsdWVzLmNvbnN0cnVjdG9yKCBuVmFsdWVzICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGRzdE9mZnNldCA9IDA7IGRzdE9mZnNldCAhPT0gblZhbHVlczsgKysgaSApIHtcblxuXHRcdFx0dmFyIHNyY09mZnNldCA9IG9yZGVyWyBpIF0gKiBzdHJpZGU7XG5cblx0XHRcdGZvciAoIHZhciBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqICkge1xuXG5cdFx0XHRcdHJlc3VsdFsgZHN0T2Zmc2V0ICsrIF0gPSB2YWx1ZXNbIHNyY09mZnNldCArIGogXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9LFxuXG5cdC8vIGZ1bmN0aW9uIGZvciBwYXJzaW5nIEFPUyBrZXlmcmFtZSBmb3JtYXRzXG5cdGZsYXR0ZW5KU09OOiBmdW5jdGlvbiAoIGpzb25LZXlzLCB0aW1lcywgdmFsdWVzLCB2YWx1ZVByb3BlcnR5TmFtZSApIHtcblxuXHRcdHZhciBpID0gMSwga2V5ID0ganNvbktleXNbIDAgXTtcblxuXHRcdHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgJiYga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGtleSA9IGpzb25LZXlzWyBpICsrIF07XG5cblx0XHR9XG5cblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuOyAvLyBubyBkYXRhXG5cblx0XHR2YXIgdmFsdWUgPSBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF07XG5cdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuOyAvLyBubyBkYXRhXG5cblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cblx0XHRcdGRvIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aW1lcy5wdXNoKCBrZXkudGltZSApO1xuXHRcdFx0XHRcdHZhbHVlcy5wdXNoLmFwcGx5KCB2YWx1ZXMsIHZhbHVlICk7IC8vIHB1c2ggYWxsIGVsZW1lbnRzXG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGtleSA9IGpzb25LZXlzWyBpICsrIF07XG5cblx0XHRcdH0gd2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCApO1xuXG5cdFx0fSBlbHNlIGlmICggdmFsdWUudG9BcnJheSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyAuLi5hc3N1bWUgVEhSRUUuTWF0aC1pc2hcblxuXHRcdFx0ZG8ge1xuXG5cdFx0XHRcdHZhbHVlID0ga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRpbWVzLnB1c2goIGtleS50aW1lICk7XG5cdFx0XHRcdFx0dmFsdWUudG9BcnJheSggdmFsdWVzLCB2YWx1ZXMubGVuZ3RoICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGtleSA9IGpzb25LZXlzWyBpICsrIF07XG5cblx0XHRcdH0gd2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gb3RoZXJ3aXNlIHB1c2ggYXMtaXNcblxuXHRcdFx0ZG8ge1xuXG5cdFx0XHRcdHZhbHVlID0ga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRpbWVzLnB1c2goIGtleS50aW1lICk7XG5cdFx0XHRcdFx0dmFsdWVzLnB1c2goIHZhbHVlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGtleSA9IGpzb25LZXlzWyBpICsrIF07XG5cblx0XHRcdH0gd2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCApO1xuXG5cdFx0fVxuXG5cdH1cblxufTtcblxuLyoqXG4gKlxuICogQSB0aW1lZCBzZXF1ZW5jZSBvZiBrZXlmcmFtZXMgZm9yIGEgc3BlY2lmaWMgcHJvcGVydHkuXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBLZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdGlmICggbmFtZSA9PT0gdW5kZWZpbmVkICkgdGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgbmFtZSBpcyB1bmRlZmluZWQnICk7XG5cdGlmICggdGltZXMgPT09IHVuZGVmaW5lZCB8fCB0aW1lcy5sZW5ndGggPT09IDAgKSB0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBubyBrZXlmcmFtZXMgaW4gdHJhY2sgbmFtZWQgJyArIG5hbWUgKTtcblxuXHR0aGlzLm5hbWUgPSBuYW1lO1xuXG5cdHRoaXMudGltZXMgPSBBbmltYXRpb25VdGlscy5jb252ZXJ0QXJyYXkoIHRpbWVzLCB0aGlzLlRpbWVCdWZmZXJUeXBlICk7XG5cdHRoaXMudmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB2YWx1ZXMsIHRoaXMuVmFsdWVCdWZmZXJUeXBlICk7XG5cblx0dGhpcy5zZXRJbnRlcnBvbGF0aW9uKCBpbnRlcnBvbGF0aW9uIHx8IHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24gKTtcblxuXHR0aGlzLnZhbGlkYXRlKCk7XG5cdHRoaXMub3B0aW1pemUoKTtcblxufVxuXG4vLyBTdGF0aWMgbWV0aG9kczpcblxuT2JqZWN0LmFzc2lnbiggS2V5ZnJhbWVUcmFjaywge1xuXG5cdC8vIFNlcmlhbGl6YXRpb24gKGluIHN0YXRpYyBjb250ZXh0LCBiZWNhdXNlIG9mIGNvbnN0cnVjdG9yIGludm9jYXRpb25cblx0Ly8gYW5kIGF1dG9tYXRpYyBpbnZvY2F0aW9uIG9mIC50b0pTT04pOlxuXG5cdHBhcnNlOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHRpZiAoIGpzb24udHlwZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiB0cmFjayB0eXBlIHVuZGVmaW5lZCwgY2FuIG5vdCBwYXJzZScgKTtcblxuXHRcdH1cblxuXHRcdHZhciB0cmFja1R5cGUgPSBLZXlmcmFtZVRyYWNrLl9nZXRUcmFja1R5cGVGb3JWYWx1ZVR5cGVOYW1lKCBqc29uLnR5cGUgKTtcblxuXHRcdGlmICgganNvbi50aW1lcyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgdGltZXMgPSBbXSwgdmFsdWVzID0gW107XG5cblx0XHRcdEFuaW1hdGlvblV0aWxzLmZsYXR0ZW5KU09OKCBqc29uLmtleXMsIHRpbWVzLCB2YWx1ZXMsICd2YWx1ZScgKTtcblxuXHRcdFx0anNvbi50aW1lcyA9IHRpbWVzO1xuXHRcdFx0anNvbi52YWx1ZXMgPSB2YWx1ZXM7XG5cblx0XHR9XG5cblx0XHQvLyBkZXJpdmVkIGNsYXNzZXMgY2FuIGRlZmluZSBhIHN0YXRpYyBwYXJzZSBtZXRob2Rcblx0XHRpZiAoIHRyYWNrVHlwZS5wYXJzZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRyZXR1cm4gdHJhY2tUeXBlLnBhcnNlKCBqc29uICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBieSBkZWZhdWx0LCB3ZSBhc3N1bWUgYSBjb25zdHJ1Y3RvciBjb21wYXRpYmxlIHdpdGggdGhlIGJhc2Vcblx0XHRcdHJldHVybiBuZXcgdHJhY2tUeXBlKCBqc29uLm5hbWUsIGpzb24udGltZXMsIGpzb24udmFsdWVzLCBqc29uLmludGVycG9sYXRpb24gKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCB0cmFjayApIHtcblxuXHRcdHZhciB0cmFja1R5cGUgPSB0cmFjay5jb25zdHJ1Y3RvcjtcblxuXHRcdHZhciBqc29uO1xuXG5cdFx0Ly8gZGVyaXZlZCBjbGFzc2VzIGNhbiBkZWZpbmUgYSBzdGF0aWMgdG9KU09OIG1ldGhvZFxuXHRcdGlmICggdHJhY2tUeXBlLnRvSlNPTiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRqc29uID0gdHJhY2tUeXBlLnRvSlNPTiggdHJhY2sgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGJ5IGRlZmF1bHQsIHdlIGFzc3VtZSB0aGUgZGF0YSBjYW4gYmUgc2VyaWFsaXplZCBhcy1pc1xuXHRcdFx0anNvbiA9IHtcblxuXHRcdFx0XHQnbmFtZSc6IHRyYWNrLm5hbWUsXG5cdFx0XHRcdCd0aW1lcyc6IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdHJhY2sudGltZXMsIEFycmF5ICksXG5cdFx0XHRcdCd2YWx1ZXMnOiBBbmltYXRpb25VdGlscy5jb252ZXJ0QXJyYXkoIHRyYWNrLnZhbHVlcywgQXJyYXkgKVxuXG5cdFx0XHR9O1xuXG5cdFx0XHR2YXIgaW50ZXJwb2xhdGlvbiA9IHRyYWNrLmdldEludGVycG9sYXRpb24oKTtcblxuXHRcdFx0aWYgKCBpbnRlcnBvbGF0aW9uICE9PSB0cmFjay5EZWZhdWx0SW50ZXJwb2xhdGlvbiApIHtcblxuXHRcdFx0XHRqc29uLmludGVycG9sYXRpb24gPSBpbnRlcnBvbGF0aW9uO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRqc29uLnR5cGUgPSB0cmFjay5WYWx1ZVR5cGVOYW1lOyAvLyBtYW5kYXRvcnlcblxuXHRcdHJldHVybiBqc29uO1xuXG5cdH0sXG5cblx0X2dldFRyYWNrVHlwZUZvclZhbHVlVHlwZU5hbWU6IGZ1bmN0aW9uICggdHlwZU5hbWUgKSB7XG5cblx0XHRzd2l0Y2ggKCB0eXBlTmFtZS50b0xvd2VyQ2FzZSgpICkge1xuXG5cdFx0XHRjYXNlICdzY2FsYXInOlxuXHRcdFx0Y2FzZSAnZG91YmxlJzpcblx0XHRcdGNhc2UgJ2Zsb2F0Jzpcblx0XHRcdGNhc2UgJ251bWJlcic6XG5cdFx0XHRjYXNlICdpbnRlZ2VyJzpcblxuXHRcdFx0XHRyZXR1cm4gTnVtYmVyS2V5ZnJhbWVUcmFjaztcblxuXHRcdFx0Y2FzZSAndmVjdG9yJzpcblx0XHRcdGNhc2UgJ3ZlY3RvcjInOlxuXHRcdFx0Y2FzZSAndmVjdG9yMyc6XG5cdFx0XHRjYXNlICd2ZWN0b3I0JzpcblxuXHRcdFx0XHRyZXR1cm4gVmVjdG9yS2V5ZnJhbWVUcmFjaztcblxuXHRcdFx0Y2FzZSAnY29sb3InOlxuXG5cdFx0XHRcdHJldHVybiBDb2xvcktleWZyYW1lVHJhY2s7XG5cblx0XHRcdGNhc2UgJ3F1YXRlcm5pb24nOlxuXG5cdFx0XHRcdHJldHVybiBRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjaztcblxuXHRcdFx0Y2FzZSAnYm9vbCc6XG5cdFx0XHRjYXNlICdib29sZWFuJzpcblxuXHRcdFx0XHRyZXR1cm4gQm9vbGVhbktleWZyYW1lVHJhY2s7XG5cblx0XHRcdGNhc2UgJ3N0cmluZyc6XG5cblx0XHRcdFx0cmV0dXJuIFN0cmluZ0tleWZyYW1lVHJhY2s7XG5cblx0XHR9XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBVbnN1cHBvcnRlZCB0eXBlTmFtZTogJyArIHR5cGVOYW1lICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEtleWZyYW1lVHJhY2sucHJvdG90eXBlLCB7XG5cblx0Y29uc3RydWN0b3I6IEtleWZyYW1lVHJhY2ssXG5cblx0VGltZUJ1ZmZlclR5cGU6IEZsb2F0MzJBcnJheSxcblxuXHRWYWx1ZUJ1ZmZlclR5cGU6IEZsb2F0MzJBcnJheSxcblxuXHREZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVMaW5lYXIsXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU6IGZ1bmN0aW9uICggcmVzdWx0ICkge1xuXG5cdFx0cmV0dXJuIG5ldyBEaXNjcmV0ZUludGVycG9sYW50KCB0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVzdWx0ICk7XG5cblx0fSxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6IGZ1bmN0aW9uICggcmVzdWx0ICkge1xuXG5cdFx0cmV0dXJuIG5ldyBMaW5lYXJJbnRlcnBvbGFudCggdGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApO1xuXG5cdH0sXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOiBmdW5jdGlvbiAoIHJlc3VsdCApIHtcblxuXHRcdHJldHVybiBuZXcgQ3ViaWNJbnRlcnBvbGFudCggdGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApO1xuXG5cdH0sXG5cblx0c2V0SW50ZXJwb2xhdGlvbjogZnVuY3Rpb24gKCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdFx0dmFyIGZhY3RvcnlNZXRob2Q7XG5cblx0XHRzd2l0Y2ggKCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdFx0XHRjYXNlIEludGVycG9sYXRlRGlzY3JldGU6XG5cblx0XHRcdFx0ZmFjdG9yeU1ldGhvZCA9IHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgSW50ZXJwb2xhdGVMaW5lYXI6XG5cblx0XHRcdFx0ZmFjdG9yeU1ldGhvZCA9IHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEludGVycG9sYXRlU21vb3RoOlxuXG5cdFx0XHRcdGZhY3RvcnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdH1cblxuXHRcdGlmICggZmFjdG9yeU1ldGhvZCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgbWVzc2FnZSA9IFwidW5zdXBwb3J0ZWQgaW50ZXJwb2xhdGlvbiBmb3IgXCIgK1xuXHRcdFx0XHR0aGlzLlZhbHVlVHlwZU5hbWUgKyBcIiBrZXlmcmFtZSB0cmFjayBuYW1lZCBcIiArIHRoaXMubmFtZTtcblxuXHRcdFx0aWYgKCB0aGlzLmNyZWF0ZUludGVycG9sYW50ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ly8gZmFsbCBiYWNrIHRvIGRlZmF1bHQsIHVubGVzcyB0aGUgZGVmYXVsdCBpdHNlbGYgaXMgbWVzc2VkIHVwXG5cdFx0XHRcdGlmICggaW50ZXJwb2xhdGlvbiAhPT0gdGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbiApIHtcblxuXHRcdFx0XHRcdHRoaXMuc2V0SW50ZXJwb2xhdGlvbiggdGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbiApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoIG1lc3NhZ2UgKTsgLy8gZmF0YWwsIGluIHRoaXMgY2FzZVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5LZXlmcmFtZVRyYWNrOicsIG1lc3NhZ2UgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQgPSBmYWN0b3J5TWV0aG9kO1xuXG5cdH0sXG5cblx0Z2V0SW50ZXJwb2xhdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0c3dpdGNoICggdGhpcy5jcmVhdGVJbnRlcnBvbGFudCApIHtcblxuXHRcdFx0Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlOlxuXG5cdFx0XHRcdHJldHVybiBJbnRlcnBvbGF0ZURpc2NyZXRlO1xuXG5cdFx0XHRjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOlxuXG5cdFx0XHRcdHJldHVybiBJbnRlcnBvbGF0ZUxpbmVhcjtcblxuXHRcdFx0Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDpcblxuXHRcdFx0XHRyZXR1cm4gSW50ZXJwb2xhdGVTbW9vdGg7XG5cblx0XHR9XG5cblx0fSxcblxuXHRnZXRWYWx1ZVNpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnZhbHVlcy5sZW5ndGggLyB0aGlzLnRpbWVzLmxlbmd0aDtcblxuXHR9LFxuXG5cdC8vIG1vdmUgYWxsIGtleWZyYW1lcyBlaXRoZXIgZm9yd2FyZHMgb3IgYmFja3dhcmRzIGluIHRpbWVcblx0c2hpZnQ6IGZ1bmN0aW9uICggdGltZU9mZnNldCApIHtcblxuXHRcdGlmICggdGltZU9mZnNldCAhPT0gMC4wICkge1xuXG5cdFx0XHR2YXIgdGltZXMgPSB0aGlzLnRpbWVzO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSB0aW1lcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0dGltZXNbIGkgXSArPSB0aW1lT2Zmc2V0O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIHNjYWxlIGFsbCBrZXlmcmFtZSB0aW1lcyBieSBhIGZhY3RvciAodXNlZnVsIGZvciBmcmFtZSA8LT4gc2Vjb25kcyBjb252ZXJzaW9ucylcblx0c2NhbGU6IGZ1bmN0aW9uICggdGltZVNjYWxlICkge1xuXG5cdFx0aWYgKCB0aW1lU2NhbGUgIT09IDEuMCApIHtcblxuXHRcdFx0dmFyIHRpbWVzID0gdGhpcy50aW1lcztcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gdGltZXMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHRpbWVzWyBpIF0gKj0gdGltZVNjYWxlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIHJlbW92ZXMga2V5ZnJhbWVzIGJlZm9yZSBhbmQgYWZ0ZXIgYW5pbWF0aW9uIHdpdGhvdXQgY2hhbmdpbmcgYW55IHZhbHVlcyB3aXRoaW4gdGhlIHJhbmdlIFtzdGFydFRpbWUsIGVuZFRpbWVdLlxuXHQvLyBJTVBPUlRBTlQ6IFdlIGRvIG5vdCBzaGlmdCBhcm91bmQga2V5cyB0byB0aGUgc3RhcnQgb2YgdGhlIHRyYWNrIHRpbWUsIGJlY2F1c2UgZm9yIGludGVycG9sYXRlZCBrZXlzIHRoaXMgd2lsbCBjaGFuZ2UgdGhlaXIgdmFsdWVzXG5cdHRyaW06IGZ1bmN0aW9uICggc3RhcnRUaW1lLCBlbmRUaW1lICkge1xuXG5cdFx0dmFyIHRpbWVzID0gdGhpcy50aW1lcyxcblx0XHRcdG5LZXlzID0gdGltZXMubGVuZ3RoLFxuXHRcdFx0ZnJvbSA9IDAsXG5cdFx0XHR0byA9IG5LZXlzIC0gMTtcblxuXHRcdHdoaWxlICggZnJvbSAhPT0gbktleXMgJiYgdGltZXNbIGZyb20gXSA8IHN0YXJ0VGltZSApIHtcblxuXHRcdFx0KysgZnJvbTtcblxuXHRcdH1cblxuXHRcdHdoaWxlICggdG8gIT09IC0gMSAmJiB0aW1lc1sgdG8gXSA+IGVuZFRpbWUgKSB7XG5cblx0XHRcdC0tIHRvO1xuXG5cdFx0fVxuXG5cdFx0KysgdG87IC8vIGluY2x1c2l2ZSAtPiBleGNsdXNpdmUgYm91bmRcblxuXHRcdGlmICggZnJvbSAhPT0gMCB8fCB0byAhPT0gbktleXMgKSB7XG5cblx0XHRcdC8vIGVtcHR5IHRyYWNrcyBhcmUgZm9yYmlkZGVuLCBzbyBrZWVwIGF0IGxlYXN0IG9uZSBrZXlmcmFtZVxuXHRcdFx0aWYgKCBmcm9tID49IHRvICkgdG8gPSBNYXRoLm1heCggdG8sIDEgKSwgZnJvbSA9IHRvIC0gMTtcblxuXHRcdFx0dmFyIHN0cmlkZSA9IHRoaXMuZ2V0VmFsdWVTaXplKCk7XG5cdFx0XHR0aGlzLnRpbWVzID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggdGltZXMsIGZyb20sIHRvICk7XG5cdFx0XHR0aGlzLnZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRoaXMudmFsdWVzLCBmcm9tICogc3RyaWRlLCB0byAqIHN0cmlkZSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBlbnN1cmUgd2UgZG8gbm90IGdldCBhIEdhcmJhZ2VJbkdhcmJhZ2VPdXQgc2l0dWF0aW9uLCBtYWtlIHN1cmUgdHJhY2tzIGFyZSBhdCBsZWFzdCBtaW5pbWFsbHkgdmlhYmxlXG5cdHZhbGlkYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdmFsaWQgPSB0cnVlO1xuXG5cdFx0dmFyIHZhbHVlU2l6ZSA9IHRoaXMuZ2V0VmFsdWVTaXplKCk7XG5cdFx0aWYgKCB2YWx1ZVNpemUgLSBNYXRoLmZsb29yKCB2YWx1ZVNpemUgKSAhPT0gMCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IEludmFsaWQgdmFsdWUgc2l6ZSBpbiB0cmFjay4nLCB0aGlzICk7XG5cdFx0XHR2YWxpZCA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHRpbWVzID0gdGhpcy50aW1lcyxcblx0XHRcdHZhbHVlcyA9IHRoaXMudmFsdWVzLFxuXG5cdFx0XHRuS2V5cyA9IHRpbWVzLmxlbmd0aDtcblxuXHRcdGlmICggbktleXMgPT09IDAgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBUcmFjayBpcyBlbXB0eS4nLCB0aGlzICk7XG5cdFx0XHR2YWxpZCA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHByZXZUaW1lID0gbnVsbDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbktleXM7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjdXJyVGltZSA9IHRpbWVzWyBpIF07XG5cblx0XHRcdGlmICggdHlwZW9mIGN1cnJUaW1lID09PSAnbnVtYmVyJyAmJiBpc05hTiggY3VyclRpbWUgKSApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVGltZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuJywgdGhpcywgaSwgY3VyclRpbWUgKTtcblx0XHRcdFx0dmFsaWQgPSBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBwcmV2VGltZSAhPT0gbnVsbCAmJiBwcmV2VGltZSA+IGN1cnJUaW1lICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBPdXQgb2Ygb3JkZXIga2V5cy4nLCB0aGlzLCBpLCBjdXJyVGltZSwgcHJldlRpbWUgKTtcblx0XHRcdFx0dmFsaWQgPSBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdFx0cHJldlRpbWUgPSBjdXJyVGltZTtcblxuXHRcdH1cblxuXHRcdGlmICggdmFsdWVzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGlmICggQW5pbWF0aW9uVXRpbHMuaXNUeXBlZEFycmF5KCB2YWx1ZXMgKSApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSB2YWx1ZXMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdFx0dmFyIHZhbHVlID0gdmFsdWVzWyBpIF07XG5cblx0XHRcdFx0XHRpZiAoIGlzTmFOKCB2YWx1ZSApICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVmFsdWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLicsIHRoaXMsIGksIHZhbHVlICk7XG5cdFx0XHRcdFx0XHR2YWxpZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsaWQ7XG5cblx0fSxcblxuXHQvLyByZW1vdmVzIGVxdWl2YWxlbnQgc2VxdWVudGlhbCBrZXlzIGFzIGNvbW1vbiBpbiBtb3JwaCB0YXJnZXQgc2VxdWVuY2VzXG5cdC8vICgwLDAsMCwwLDEsMSwxLDAsMCwwLDAsMCwwLDApIC0tPiAoMCwwLDEsMSwwLDApXG5cdG9wdGltaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdGltZXMgPSB0aGlzLnRpbWVzLFxuXHRcdFx0dmFsdWVzID0gdGhpcy52YWx1ZXMsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpLFxuXG5cdFx0XHRzbW9vdGhJbnRlcnBvbGF0aW9uID0gdGhpcy5nZXRJbnRlcnBvbGF0aW9uKCkgPT09IEludGVycG9sYXRlU21vb3RoLFxuXG5cdFx0XHR3cml0ZUluZGV4ID0gMSxcblx0XHRcdGxhc3RJbmRleCA9IHRpbWVzLmxlbmd0aCAtIDE7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDE7IGkgPCBsYXN0SW5kZXg7ICsrIGkgKSB7XG5cblx0XHRcdHZhciBrZWVwID0gZmFsc2U7XG5cblx0XHRcdHZhciB0aW1lID0gdGltZXNbIGkgXTtcblx0XHRcdHZhciB0aW1lTmV4dCA9IHRpbWVzWyBpICsgMSBdO1xuXG5cdFx0XHQvLyByZW1vdmUgYWRqYWNlbnQga2V5ZnJhbWVzIHNjaGVkdWxlZCBhdCB0aGUgc2FtZSB0aW1lXG5cblx0XHRcdGlmICggdGltZSAhPT0gdGltZU5leHQgJiYgKCBpICE9PSAxIHx8IHRpbWUgIT09IHRpbWVbIDAgXSApICkge1xuXG5cdFx0XHRcdGlmICggISBzbW9vdGhJbnRlcnBvbGF0aW9uICkge1xuXG5cdFx0XHRcdFx0Ly8gcmVtb3ZlIHVubmVjZXNzYXJ5IGtleWZyYW1lcyBzYW1lIGFzIHRoZWlyIG5laWdoYm9yc1xuXG5cdFx0XHRcdFx0dmFyIG9mZnNldCA9IGkgKiBzdHJpZGUsXG5cdFx0XHRcdFx0XHRvZmZzZXRQID0gb2Zmc2V0IC0gc3RyaWRlLFxuXHRcdFx0XHRcdFx0b2Zmc2V0TiA9IG9mZnNldCArIHN0cmlkZTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgdmFsdWUgPSB2YWx1ZXNbIG9mZnNldCArIGogXTtcblxuXHRcdFx0XHRcdFx0aWYgKCB2YWx1ZSAhPT0gdmFsdWVzWyBvZmZzZXRQICsgaiBdIHx8XG5cdFx0XHRcdFx0XHRcdHZhbHVlICE9PSB2YWx1ZXNbIG9mZnNldE4gKyBqIF0gKSB7XG5cblx0XHRcdFx0XHRcdFx0a2VlcCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGtlZXAgPSB0cnVlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBpbi1wbGFjZSBjb21wYWN0aW9uXG5cblx0XHRcdGlmICgga2VlcCApIHtcblxuXHRcdFx0XHRpZiAoIGkgIT09IHdyaXRlSW5kZXggKSB7XG5cblx0XHRcdFx0XHR0aW1lc1sgd3JpdGVJbmRleCBdID0gdGltZXNbIGkgXTtcblxuXHRcdFx0XHRcdHZhciByZWFkT2Zmc2V0ID0gaSAqIHN0cmlkZSxcblx0XHRcdFx0XHRcdHdyaXRlT2Zmc2V0ID0gd3JpdGVJbmRleCAqIHN0cmlkZTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqICkge1xuXG5cdFx0XHRcdFx0XHR2YWx1ZXNbIHdyaXRlT2Zmc2V0ICsgaiBdID0gdmFsdWVzWyByZWFkT2Zmc2V0ICsgaiBdO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQrKyB3cml0ZUluZGV4O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBmbHVzaCBsYXN0IGtleWZyYW1lIChjb21wYWN0aW9uIGxvb2tzIGFoZWFkKVxuXG5cdFx0aWYgKCBsYXN0SW5kZXggPiAwICkge1xuXG5cdFx0XHR0aW1lc1sgd3JpdGVJbmRleCBdID0gdGltZXNbIGxhc3RJbmRleCBdO1xuXG5cdFx0XHRmb3IgKCB2YXIgcmVhZE9mZnNldCA9IGxhc3RJbmRleCAqIHN0cmlkZSwgd3JpdGVPZmZzZXQgPSB3cml0ZUluZGV4ICogc3RyaWRlLCBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqICkge1xuXG5cdFx0XHRcdHZhbHVlc1sgd3JpdGVPZmZzZXQgKyBqIF0gPSB2YWx1ZXNbIHJlYWRPZmZzZXQgKyBqIF07XG5cblx0XHRcdH1cblxuXHRcdFx0Kysgd3JpdGVJbmRleDtcblxuXHRcdH1cblxuXHRcdGlmICggd3JpdGVJbmRleCAhPT0gdGltZXMubGVuZ3RoICkge1xuXG5cdFx0XHR0aGlzLnRpbWVzID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggdGltZXMsIDAsIHdyaXRlSW5kZXggKTtcblx0XHRcdHRoaXMudmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggdmFsdWVzLCAwLCB3cml0ZUluZGV4ICogc3RyaWRlICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSBUcmFjayBvZiB2ZWN0b3JlZCBrZXlmcmFtZSB2YWx1ZXMuXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBWZWN0b3JLZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdEtleWZyYW1lVHJhY2suY2FsbCggdGhpcywgbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApO1xuXG59XG5cblZlY3RvcktleWZyYW1lVHJhY2sucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBWZWN0b3JLZXlmcmFtZVRyYWNrLFxuXG5cdFZhbHVlVHlwZU5hbWU6ICd2ZWN0b3InXG5cblx0Ly8gVmFsdWVCdWZmZXJUeXBlIGlzIGluaGVyaXRlZFxuXG5cdC8vIERlZmF1bHRJbnRlcnBvbGF0aW9uIGlzIGluaGVyaXRlZFxuXG59ICk7XG5cbi8qKlxuICpcbiAqIFJldXNhYmxlIHNldCBvZiBUcmFja3MgdGhhdCByZXByZXNlbnQgYW4gYW5pbWF0aW9uLlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqL1xuXG5mdW5jdGlvbiBBbmltYXRpb25DbGlwKCBuYW1lLCBkdXJhdGlvbiwgdHJhY2tzICkge1xuXG5cdHRoaXMubmFtZSA9IG5hbWU7XG5cdHRoaXMudHJhY2tzID0gdHJhY2tzO1xuXHR0aGlzLmR1cmF0aW9uID0gKCBkdXJhdGlvbiAhPT0gdW5kZWZpbmVkICkgPyBkdXJhdGlvbiA6IC0gMTtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHQvLyB0aGlzIG1lYW5zIGl0IHNob3VsZCBmaWd1cmUgb3V0IGl0cyBkdXJhdGlvbiBieSBzY2FubmluZyB0aGUgdHJhY2tzXG5cdGlmICggdGhpcy5kdXJhdGlvbiA8IDAgKSB7XG5cblx0XHR0aGlzLnJlc2V0RHVyYXRpb24oKTtcblxuXHR9XG5cblx0dGhpcy5vcHRpbWl6ZSgpO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEFuaW1hdGlvbkNsaXAsIHtcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0dmFyIHRyYWNrcyA9IFtdLFxuXHRcdFx0anNvblRyYWNrcyA9IGpzb24udHJhY2tzLFxuXHRcdFx0ZnJhbWVUaW1lID0gMS4wIC8gKCBqc29uLmZwcyB8fCAxLjAgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGpzb25UcmFja3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR0cmFja3MucHVzaCggS2V5ZnJhbWVUcmFjay5wYXJzZSgganNvblRyYWNrc1sgaSBdICkuc2NhbGUoIGZyYW1lVGltZSApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbmV3IEFuaW1hdGlvbkNsaXAoIGpzb24ubmFtZSwganNvbi5kdXJhdGlvbiwgdHJhY2tzICk7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggY2xpcCApIHtcblxuXHRcdHZhciB0cmFja3MgPSBbXSxcblx0XHRcdGNsaXBUcmFja3MgPSBjbGlwLnRyYWNrcztcblxuXHRcdHZhciBqc29uID0ge1xuXG5cdFx0XHQnbmFtZSc6IGNsaXAubmFtZSxcblx0XHRcdCdkdXJhdGlvbic6IGNsaXAuZHVyYXRpb24sXG5cdFx0XHQndHJhY2tzJzogdHJhY2tzXG5cblx0XHR9O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gY2xpcFRyYWNrcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHRyYWNrcy5wdXNoKCBLZXlmcmFtZVRyYWNrLnRvSlNPTiggY2xpcFRyYWNrc1sgaSBdICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBqc29uO1xuXG5cdH0sXG5cblx0Q3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2U6IGZ1bmN0aW9uICggbmFtZSwgbW9ycGhUYXJnZXRTZXF1ZW5jZSwgZnBzLCBub0xvb3AgKSB7XG5cblx0XHR2YXIgbnVtTW9ycGhUYXJnZXRzID0gbW9ycGhUYXJnZXRTZXF1ZW5jZS5sZW5ndGg7XG5cdFx0dmFyIHRyYWNrcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbnVtTW9ycGhUYXJnZXRzOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdGltZXMgPSBbXTtcblx0XHRcdHZhciB2YWx1ZXMgPSBbXTtcblxuXHRcdFx0dGltZXMucHVzaChcblx0XHRcdFx0KCBpICsgbnVtTW9ycGhUYXJnZXRzIC0gMSApICUgbnVtTW9ycGhUYXJnZXRzLFxuXHRcdFx0XHRpLFxuXHRcdFx0XHQoIGkgKyAxICkgJSBudW1Nb3JwaFRhcmdldHMgKTtcblxuXHRcdFx0dmFsdWVzLnB1c2goIDAsIDEsIDAgKTtcblxuXHRcdFx0dmFyIG9yZGVyID0gQW5pbWF0aW9uVXRpbHMuZ2V0S2V5ZnJhbWVPcmRlciggdGltZXMgKTtcblx0XHRcdHRpbWVzID0gQW5pbWF0aW9uVXRpbHMuc29ydGVkQXJyYXkoIHRpbWVzLCAxLCBvcmRlciApO1xuXHRcdFx0dmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuc29ydGVkQXJyYXkoIHZhbHVlcywgMSwgb3JkZXIgKTtcblxuXHRcdFx0Ly8gaWYgdGhlcmUgaXMgYSBrZXkgYXQgdGhlIGZpcnN0IGZyYW1lLCBkdXBsaWNhdGUgaXQgYXMgdGhlXG5cdFx0XHQvLyBsYXN0IGZyYW1lIGFzIHdlbGwgZm9yIHBlcmZlY3QgbG9vcC5cblx0XHRcdGlmICggISBub0xvb3AgJiYgdGltZXNbIDAgXSA9PT0gMCApIHtcblxuXHRcdFx0XHR0aW1lcy5wdXNoKCBudW1Nb3JwaFRhcmdldHMgKTtcblx0XHRcdFx0dmFsdWVzLnB1c2goIHZhbHVlc1sgMCBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dHJhY2tzLnB1c2goXG5cdFx0XHRcdG5ldyBOdW1iZXJLZXlmcmFtZVRyYWNrKFxuXHRcdFx0XHRcdCcubW9ycGhUYXJnZXRJbmZsdWVuY2VzWycgKyBtb3JwaFRhcmdldFNlcXVlbmNlWyBpIF0ubmFtZSArICddJyxcblx0XHRcdFx0XHR0aW1lcywgdmFsdWVzXG5cdFx0XHRcdCkuc2NhbGUoIDEuMCAvIGZwcyApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbmV3IEFuaW1hdGlvbkNsaXAoIG5hbWUsIC0gMSwgdHJhY2tzICk7XG5cblx0fSxcblxuXHRmaW5kQnlOYW1lOiBmdW5jdGlvbiAoIG9iamVjdE9yQ2xpcEFycmF5LCBuYW1lICkge1xuXG5cdFx0dmFyIGNsaXBBcnJheSA9IG9iamVjdE9yQ2xpcEFycmF5O1xuXG5cdFx0aWYgKCAhIEFycmF5LmlzQXJyYXkoIG9iamVjdE9yQ2xpcEFycmF5ICkgKSB7XG5cblx0XHRcdHZhciBvID0gb2JqZWN0T3JDbGlwQXJyYXk7XG5cdFx0XHRjbGlwQXJyYXkgPSBvLmdlb21ldHJ5ICYmIG8uZ2VvbWV0cnkuYW5pbWF0aW9ucyB8fCBvLmFuaW1hdGlvbnM7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBjbGlwQXJyYXkubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRpZiAoIGNsaXBBcnJheVsgaSBdLm5hbWUgPT09IG5hbWUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGNsaXBBcnJheVsgaSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblxuXHR9LFxuXG5cdENyZWF0ZUNsaXBzRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2VzOiBmdW5jdGlvbiAoIG1vcnBoVGFyZ2V0cywgZnBzLCBub0xvb3AgKSB7XG5cblx0XHR2YXIgYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHMgPSB7fTtcblxuXHRcdC8vIHRlc3RlZCB3aXRoIGh0dHBzOi8vcmVnZXgxMDEuY29tLyBvbiB0cmljayBzZXF1ZW5jZXNcblx0XHQvLyBzdWNoIGZsYW1pbmdvX2ZseUFfMDAzLCBmbGFtaW5nb19ydW4xXzAwMywgY3JkZWF0aDAwNTlcblx0XHR2YXIgcGF0dGVybiA9IC9eKFtcXHctXSo/KShbXFxkXSspJC87XG5cblx0XHQvLyBzb3J0IG1vcnBoIHRhcmdldCBuYW1lcyBpbnRvIGFuaW1hdGlvbiBncm91cHMgYmFzZWRcblx0XHQvLyBwYXR0ZXJucyBsaWtlIFdhbGtfMDAxLCBXYWxrXzAwMiwgUnVuXzAwMSwgUnVuXzAwMlxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBtb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBtb3JwaFRhcmdldCA9IG1vcnBoVGFyZ2V0c1sgaSBdO1xuXHRcdFx0dmFyIHBhcnRzID0gbW9ycGhUYXJnZXQubmFtZS5tYXRjaCggcGF0dGVybiApO1xuXG5cdFx0XHRpZiAoIHBhcnRzICYmIHBhcnRzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdFx0dmFyIG5hbWUgPSBwYXJ0c1sgMSBdO1xuXG5cdFx0XHRcdHZhciBhbmltYXRpb25Nb3JwaFRhcmdldHMgPSBhbmltYXRpb25Ub01vcnBoVGFyZ2V0c1sgbmFtZSBdO1xuXHRcdFx0XHRpZiAoICEgYW5pbWF0aW9uTW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRcdFx0YW5pbWF0aW9uVG9Nb3JwaFRhcmdldHNbIG5hbWUgXSA9IGFuaW1hdGlvbk1vcnBoVGFyZ2V0cyA9IFtdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhbmltYXRpb25Nb3JwaFRhcmdldHMucHVzaCggbW9ycGhUYXJnZXQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGNsaXBzID0gW107XG5cblx0XHRmb3IgKCB2YXIgbmFtZSBpbiBhbmltYXRpb25Ub01vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0Y2xpcHMucHVzaCggQW5pbWF0aW9uQ2xpcC5DcmVhdGVGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZSggbmFtZSwgYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHNbIG5hbWUgXSwgZnBzLCBub0xvb3AgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNsaXBzO1xuXG5cdH0sXG5cblx0Ly8gcGFyc2UgdGhlIGFuaW1hdGlvbi5oaWVyYXJjaHkgZm9ybWF0XG5cdHBhcnNlQW5pbWF0aW9uOiBmdW5jdGlvbiAoIGFuaW1hdGlvbiwgYm9uZXMgKSB7XG5cblx0XHRpZiAoICEgYW5pbWF0aW9uICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQW5pbWF0aW9uQ2xpcDogTm8gYW5pbWF0aW9uIGluIEpTT05Mb2FkZXIgZGF0YS4nICk7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdH1cblxuXHRcdHZhciBhZGROb25lbXB0eVRyYWNrID0gZnVuY3Rpb24gKCB0cmFja1R5cGUsIHRyYWNrTmFtZSwgYW5pbWF0aW9uS2V5cywgcHJvcGVydHlOYW1lLCBkZXN0VHJhY2tzICkge1xuXG5cdFx0XHQvLyBvbmx5IHJldHVybiB0cmFjayBpZiB0aGVyZSBhcmUgYWN0dWFsbHkga2V5cy5cblx0XHRcdGlmICggYW5pbWF0aW9uS2V5cy5sZW5ndGggIT09IDAgKSB7XG5cblx0XHRcdFx0dmFyIHRpbWVzID0gW107XG5cdFx0XHRcdHZhciB2YWx1ZXMgPSBbXTtcblxuXHRcdFx0XHRBbmltYXRpb25VdGlscy5mbGF0dGVuSlNPTiggYW5pbWF0aW9uS2V5cywgdGltZXMsIHZhbHVlcywgcHJvcGVydHlOYW1lICk7XG5cblx0XHRcdFx0Ly8gZW1wdHkga2V5cyBhcmUgZmlsdGVyZWQgb3V0LCBzbyBjaGVjayBhZ2FpblxuXHRcdFx0XHRpZiAoIHRpbWVzLmxlbmd0aCAhPT0gMCApIHtcblxuXHRcdFx0XHRcdGRlc3RUcmFja3MucHVzaCggbmV3IHRyYWNrVHlwZSggdHJhY2tOYW1lLCB0aW1lcywgdmFsdWVzICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0XHR2YXIgdHJhY2tzID0gW107XG5cblx0XHR2YXIgY2xpcE5hbWUgPSBhbmltYXRpb24ubmFtZSB8fCAnZGVmYXVsdCc7XG5cdFx0Ly8gYXV0b21hdGljIGxlbmd0aCBkZXRlcm1pbmF0aW9uIGluIEFuaW1hdGlvbkNsaXAuXG5cdFx0dmFyIGR1cmF0aW9uID0gYW5pbWF0aW9uLmxlbmd0aCB8fCAtIDE7XG5cdFx0dmFyIGZwcyA9IGFuaW1hdGlvbi5mcHMgfHwgMzA7XG5cblx0XHR2YXIgaGllcmFyY2h5VHJhY2tzID0gYW5pbWF0aW9uLmhpZXJhcmNoeSB8fCBbXTtcblxuXHRcdGZvciAoIHZhciBoID0gMDsgaCA8IGhpZXJhcmNoeVRyYWNrcy5sZW5ndGg7IGggKysgKSB7XG5cblx0XHRcdHZhciBhbmltYXRpb25LZXlzID0gaGllcmFyY2h5VHJhY2tzWyBoIF0ua2V5cztcblxuXHRcdFx0Ly8gc2tpcCBlbXB0eSB0cmFja3Ncblx0XHRcdGlmICggISBhbmltYXRpb25LZXlzIHx8IGFuaW1hdGlvbktleXMubGVuZ3RoID09PSAwICkgY29udGludWU7XG5cblx0XHRcdC8vIHByb2Nlc3MgbW9ycGggdGFyZ2V0c1xuXHRcdFx0aWYgKCBhbmltYXRpb25LZXlzWyAwIF0ubW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRcdC8vIGZpZ3VyZSBvdXQgYWxsIG1vcnBoIHRhcmdldHMgdXNlZCBpbiB0aGlzIHRyYWNrXG5cdFx0XHRcdHZhciBtb3JwaFRhcmdldE5hbWVzID0ge307XG5cblx0XHRcdFx0Zm9yICggdmFyIGsgPSAwOyBrIDwgYW5pbWF0aW9uS2V5cy5sZW5ndGg7IGsgKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGFuaW1hdGlvbktleXNbIGsgXS5tb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIHZhciBtID0gMDsgbSA8IGFuaW1hdGlvbktleXNbIGsgXS5tb3JwaFRhcmdldHMubGVuZ3RoOyBtICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdG1vcnBoVGFyZ2V0TmFtZXNbIGFuaW1hdGlvbktleXNbIGsgXS5tb3JwaFRhcmdldHNbIG0gXSBdID0gLSAxO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGNyZWF0ZSBhIHRyYWNrIGZvciBlYWNoIG1vcnBoIHRhcmdldCB3aXRoIGFsbCB6ZXJvXG5cdFx0XHRcdC8vIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBleGNlcHQgZm9yIHRoZSBrZXlzIGluIHdoaWNoXG5cdFx0XHRcdC8vIHRoZSBtb3JwaFRhcmdldCBpcyBuYW1lZC5cblx0XHRcdFx0Zm9yICggdmFyIG1vcnBoVGFyZ2V0TmFtZSBpbiBtb3JwaFRhcmdldE5hbWVzICkge1xuXG5cdFx0XHRcdFx0dmFyIHRpbWVzID0gW107XG5cdFx0XHRcdFx0dmFyIHZhbHVlcyA9IFtdO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIG0gPSAwOyBtICE9PSBhbmltYXRpb25LZXlzWyBrIF0ubW9ycGhUYXJnZXRzLmxlbmd0aDsgKysgbSApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGFuaW1hdGlvbktleSA9IGFuaW1hdGlvbktleXNbIGsgXTtcblxuXHRcdFx0XHRcdFx0dGltZXMucHVzaCggYW5pbWF0aW9uS2V5LnRpbWUgKTtcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKCAoIGFuaW1hdGlvbktleS5tb3JwaFRhcmdldCA9PT0gbW9ycGhUYXJnZXROYW1lICkgPyAxIDogMCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dHJhY2tzLnB1c2goIG5ldyBOdW1iZXJLZXlmcmFtZVRyYWNrKCAnLm1vcnBoVGFyZ2V0SW5mbHVlbmNlWycgKyBtb3JwaFRhcmdldE5hbWUgKyAnXScsIHRpbWVzLCB2YWx1ZXMgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkdXJhdGlvbiA9IG1vcnBoVGFyZ2V0TmFtZXMubGVuZ3RoICogKCBmcHMgfHwgMS4wICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gLi4uYXNzdW1lIHNrZWxldGFsIGFuaW1hdGlvblxuXG5cdFx0XHRcdHZhciBib25lTmFtZSA9ICcuYm9uZXNbJyArIGJvbmVzWyBoIF0ubmFtZSArICddJztcblxuXHRcdFx0XHRhZGROb25lbXB0eVRyYWNrKFxuXHRcdFx0XHRcdFZlY3RvcktleWZyYW1lVHJhY2ssIGJvbmVOYW1lICsgJy5wb3NpdGlvbicsXG5cdFx0XHRcdFx0YW5pbWF0aW9uS2V5cywgJ3BvcycsIHRyYWNrcyApO1xuXG5cdFx0XHRcdGFkZE5vbmVtcHR5VHJhY2soXG5cdFx0XHRcdFx0UXVhdGVybmlvbktleWZyYW1lVHJhY2ssIGJvbmVOYW1lICsgJy5xdWF0ZXJuaW9uJyxcblx0XHRcdFx0XHRhbmltYXRpb25LZXlzLCAncm90JywgdHJhY2tzICk7XG5cblx0XHRcdFx0YWRkTm9uZW1wdHlUcmFjayhcblx0XHRcdFx0XHRWZWN0b3JLZXlmcmFtZVRyYWNrLCBib25lTmFtZSArICcuc2NhbGUnLFxuXHRcdFx0XHRcdGFuaW1hdGlvbktleXMsICdzY2wnLCB0cmFja3MgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0cmFja3MubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdH1cblxuXHRcdHZhciBjbGlwID0gbmV3IEFuaW1hdGlvbkNsaXAoIGNsaXBOYW1lLCBkdXJhdGlvbiwgdHJhY2tzICk7XG5cblx0XHRyZXR1cm4gY2xpcDtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggQW5pbWF0aW9uQ2xpcC5wcm90b3R5cGUsIHtcblxuXHRyZXNldER1cmF0aW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdHJhY2tzID0gdGhpcy50cmFja3MsIGR1cmF0aW9uID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbiA9IHRyYWNrcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHZhciB0cmFjayA9IHRoaXMudHJhY2tzWyBpIF07XG5cblx0XHRcdGR1cmF0aW9uID0gTWF0aC5tYXgoIGR1cmF0aW9uLCB0cmFjay50aW1lc1sgdHJhY2sudGltZXMubGVuZ3RoIC0gMSBdICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247XG5cblx0fSxcblxuXHR0cmltOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMudHJhY2tzWyBpIF0udHJpbSggMCwgdGhpcy5kdXJhdGlvbiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRvcHRpbWl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy50cmFja3MubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnRyYWNrc1sgaSBdLm9wdGltaXplKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIE1hdGVyaWFsTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXHR0aGlzLnRleHR1cmVzID0ge307XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggTWF0ZXJpYWxMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHNjb3BlLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIHRleHQgKSB7XG5cblx0XHRcdG9uTG9hZCggc2NvcGUucGFyc2UoIEpTT04ucGFyc2UoIHRleHQgKSApICk7XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fSxcblxuXHRzZXRUZXh0dXJlczogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMudGV4dHVyZXMgPSB2YWx1ZTtcblxuXHR9LFxuXG5cdHBhcnNlOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR2YXIgdGV4dHVyZXMgPSB0aGlzLnRleHR1cmVzO1xuXG5cdFx0ZnVuY3Rpb24gZ2V0VGV4dHVyZSggbmFtZSApIHtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlc1sgbmFtZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWxMb2FkZXI6IFVuZGVmaW5lZCB0ZXh0dXJlJywgbmFtZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0ZXh0dXJlc1sgbmFtZSBdO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG1hdGVyaWFsID0gbmV3IE1hdGVyaWFsc1sganNvbi50eXBlIF0oKTtcblxuXHRcdGlmICgganNvbi51dWlkICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC51dWlkID0ganNvbi51dWlkO1xuXHRcdGlmICgganNvbi5uYW1lICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5uYW1lID0ganNvbi5uYW1lO1xuXHRcdGlmICgganNvbi5jb2xvciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY29sb3Iuc2V0SGV4KCBqc29uLmNvbG9yICk7XG5cdFx0aWYgKCBqc29uLnJvdWdobmVzcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucm91Z2huZXNzID0ganNvbi5yb3VnaG5lc3M7XG5cdFx0aWYgKCBqc29uLm1ldGFsbmVzcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubWV0YWxuZXNzID0ganNvbi5tZXRhbG5lc3M7XG5cdFx0aWYgKCBqc29uLmVtaXNzaXZlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbWlzc2l2ZS5zZXRIZXgoIGpzb24uZW1pc3NpdmUgKTtcblx0XHRpZiAoIGpzb24uc3BlY3VsYXIgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNwZWN1bGFyLnNldEhleCgganNvbi5zcGVjdWxhciApO1xuXHRcdGlmICgganNvbi5zaGluaW5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNoaW5pbmVzcyA9IGpzb24uc2hpbmluZXNzO1xuXHRcdGlmICgganNvbi5jbGVhckNvYXQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNsZWFyQ29hdCA9IGpzb24uY2xlYXJDb2F0O1xuXHRcdGlmICgganNvbi5jbGVhckNvYXRSb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNsZWFyQ29hdFJvdWdobmVzcyA9IGpzb24uY2xlYXJDb2F0Um91Z2huZXNzO1xuXHRcdGlmICgganNvbi51bmlmb3JtcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudW5pZm9ybXMgPSBqc29uLnVuaWZvcm1zO1xuXHRcdGlmICgganNvbi52ZXJ0ZXhTaGFkZXIgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnZlcnRleFNoYWRlciA9IGpzb24udmVydGV4U2hhZGVyO1xuXHRcdGlmICgganNvbi5mcmFnbWVudFNoYWRlciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZnJhZ21lbnRTaGFkZXIgPSBqc29uLmZyYWdtZW50U2hhZGVyO1xuXHRcdGlmICgganNvbi52ZXJ0ZXhDb2xvcnMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnZlcnRleENvbG9ycyA9IGpzb24udmVydGV4Q29sb3JzO1xuXHRcdGlmICgganNvbi5mb2cgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZvZyA9IGpzb24uZm9nO1xuXHRcdGlmICgganNvbi5mbGF0U2hhZGluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZmxhdFNoYWRpbmcgPSBqc29uLmZsYXRTaGFkaW5nO1xuXHRcdGlmICgganNvbi5ibGVuZGluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYmxlbmRpbmcgPSBqc29uLmJsZW5kaW5nO1xuXHRcdGlmICgganNvbi5zaWRlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaWRlID0ganNvbi5zaWRlO1xuXHRcdGlmICgganNvbi5vcGFjaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5vcGFjaXR5ID0ganNvbi5vcGFjaXR5O1xuXHRcdGlmICgganNvbi50cmFuc3BhcmVudCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudHJhbnNwYXJlbnQgPSBqc29uLnRyYW5zcGFyZW50O1xuXHRcdGlmICgganNvbi5hbHBoYVRlc3QgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFscGhhVGVzdCA9IGpzb24uYWxwaGFUZXN0O1xuXHRcdGlmICgganNvbi5kZXB0aFRlc3QgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRlcHRoVGVzdCA9IGpzb24uZGVwdGhUZXN0O1xuXHRcdGlmICgganNvbi5kZXB0aFdyaXRlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kZXB0aFdyaXRlID0ganNvbi5kZXB0aFdyaXRlO1xuXHRcdGlmICgganNvbi5jb2xvcldyaXRlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jb2xvcldyaXRlID0ganNvbi5jb2xvcldyaXRlO1xuXHRcdGlmICgganNvbi53aXJlZnJhbWUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLndpcmVmcmFtZSA9IGpzb24ud2lyZWZyYW1lO1xuXHRcdGlmICgganNvbi53aXJlZnJhbWVMaW5ld2lkdGggIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLndpcmVmcmFtZUxpbmV3aWR0aCA9IGpzb24ud2lyZWZyYW1lTGluZXdpZHRoO1xuXHRcdGlmICgganNvbi53aXJlZnJhbWVMaW5lY2FwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWVMaW5lY2FwID0ganNvbi53aXJlZnJhbWVMaW5lY2FwO1xuXHRcdGlmICgganNvbi53aXJlZnJhbWVMaW5lam9pbiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwud2lyZWZyYW1lTGluZWpvaW4gPSBqc29uLndpcmVmcmFtZUxpbmVqb2luO1xuXG5cdFx0aWYgKCBqc29uLnJvdGF0aW9uICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5yb3RhdGlvbiA9IGpzb24ucm90YXRpb247XG5cblx0XHRpZiAoIGpzb24ubGluZXdpZHRoICE9PSAxICkgbWF0ZXJpYWwubGluZXdpZHRoID0ganNvbi5saW5ld2lkdGg7XG5cdFx0aWYgKCBqc29uLmRhc2hTaXplICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kYXNoU2l6ZSA9IGpzb24uZGFzaFNpemU7XG5cdFx0aWYgKCBqc29uLmdhcFNpemUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmdhcFNpemUgPSBqc29uLmdhcFNpemU7XG5cdFx0aWYgKCBqc29uLnNjYWxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zY2FsZSA9IGpzb24uc2NhbGU7XG5cblx0XHRpZiAoIGpzb24ucG9seWdvbk9mZnNldCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucG9seWdvbk9mZnNldCA9IGpzb24ucG9seWdvbk9mZnNldDtcblx0XHRpZiAoIGpzb24ucG9seWdvbk9mZnNldEZhY3RvciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucG9seWdvbk9mZnNldEZhY3RvciA9IGpzb24ucG9seWdvbk9mZnNldEZhY3Rvcjtcblx0XHRpZiAoIGpzb24ucG9seWdvbk9mZnNldFVuaXRzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0VW5pdHMgPSBqc29uLnBvbHlnb25PZmZzZXRVbml0cztcblxuXHRcdGlmICgganNvbi5za2lubmluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2tpbm5pbmcgPSBqc29uLnNraW5uaW5nO1xuXHRcdGlmICgganNvbi5tb3JwaFRhcmdldHMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyA9IGpzb24ubW9ycGhUYXJnZXRzO1xuXHRcdGlmICgganNvbi5kaXRoZXJpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpdGhlcmluZyA9IGpzb24uZGl0aGVyaW5nO1xuXG5cdFx0aWYgKCBqc29uLnZpc2libGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnZpc2libGUgPSBqc29uLnZpc2libGU7XG5cdFx0aWYgKCBqc29uLnVzZXJEYXRhICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC51c2VyRGF0YSA9IGpzb24udXNlckRhdGE7XG5cblx0XHQvLyBEZXByZWNhdGVkXG5cblx0XHRpZiAoIGpzb24uc2hhZGluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZmxhdFNoYWRpbmcgPSBqc29uLnNoYWRpbmcgPT09IDE7IC8vIFRIUkVFLkZsYXRTaGFkaW5nXG5cblx0XHQvLyBmb3IgUG9pbnRzTWF0ZXJpYWxcblxuXHRcdGlmICgganNvbi5zaXplICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaXplID0ganNvbi5zaXplO1xuXHRcdGlmICgganNvbi5zaXplQXR0ZW51YXRpb24gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNpemVBdHRlbnVhdGlvbiA9IGpzb24uc2l6ZUF0dGVudWF0aW9uO1xuXG5cdFx0Ly8gbWFwc1xuXG5cdFx0aWYgKCBqc29uLm1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubWFwID0gZ2V0VGV4dHVyZSgganNvbi5tYXAgKTtcblxuXHRcdGlmICgganNvbi5hbHBoYU1hcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRtYXRlcmlhbC5hbHBoYU1hcCA9IGdldFRleHR1cmUoIGpzb24uYWxwaGFNYXAgKTtcblx0XHRcdG1hdGVyaWFsLnRyYW5zcGFyZW50ID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICgganNvbi5idW1wTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5idW1wTWFwID0gZ2V0VGV4dHVyZSgganNvbi5idW1wTWFwICk7XG5cdFx0aWYgKCBqc29uLmJ1bXBTY2FsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYnVtcFNjYWxlID0ganNvbi5idW1wU2NhbGU7XG5cblx0XHRpZiAoIGpzb24ubm9ybWFsTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ub3JtYWxNYXAgPSBnZXRUZXh0dXJlKCBqc29uLm5vcm1hbE1hcCApO1xuXHRcdGlmICgganNvbi5ub3JtYWxTY2FsZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgbm9ybWFsU2NhbGUgPSBqc29uLm5vcm1hbFNjYWxlO1xuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG5vcm1hbFNjYWxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdC8vIEJsZW5kZXIgZXhwb3J0ZXIgdXNlZCB0byBleHBvcnQgYSBzY2FsYXIuIFNlZSAjNzQ1OVxuXG5cdFx0XHRcdG5vcm1hbFNjYWxlID0gWyBub3JtYWxTY2FsZSwgbm9ybWFsU2NhbGUgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRtYXRlcmlhbC5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCkuZnJvbUFycmF5KCBub3JtYWxTY2FsZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBqc29uLmRpc3BsYWNlbWVudE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwID0gZ2V0VGV4dHVyZSgganNvbi5kaXNwbGFjZW1lbnRNYXAgKTtcblx0XHRpZiAoIGpzb24uZGlzcGxhY2VtZW50U2NhbGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlID0ganNvbi5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRpZiAoIGpzb24uZGlzcGxhY2VtZW50QmlhcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcyA9IGpzb24uZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdGlmICgganNvbi5yb3VnaG5lc3NNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJvdWdobmVzc01hcCA9IGdldFRleHR1cmUoIGpzb24ucm91Z2huZXNzTWFwICk7XG5cdFx0aWYgKCBqc29uLm1ldGFsbmVzc01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubWV0YWxuZXNzTWFwID0gZ2V0VGV4dHVyZSgganNvbi5tZXRhbG5lc3NNYXAgKTtcblxuXHRcdGlmICgganNvbi5lbWlzc2l2ZU1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW1pc3NpdmVNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmVtaXNzaXZlTWFwICk7XG5cdFx0aWYgKCBqc29uLmVtaXNzaXZlSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbWlzc2l2ZUludGVuc2l0eSA9IGpzb24uZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0XHRpZiAoIGpzb24uc3BlY3VsYXJNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNwZWN1bGFyTWFwID0gZ2V0VGV4dHVyZSgganNvbi5zcGVjdWxhck1hcCApO1xuXG5cdFx0aWYgKCBqc29uLmVudk1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW52TWFwID0gZ2V0VGV4dHVyZSgganNvbi5lbnZNYXAgKTtcblxuXHRcdGlmICgganNvbi5yZWZsZWN0aXZpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJlZmxlY3Rpdml0eSA9IGpzb24ucmVmbGVjdGl2aXR5O1xuXG5cdFx0aWYgKCBqc29uLmxpZ2h0TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5saWdodE1hcCA9IGdldFRleHR1cmUoIGpzb24ubGlnaHRNYXAgKTtcblx0XHRpZiAoIGpzb24ubGlnaHRNYXBJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmxpZ2h0TWFwSW50ZW5zaXR5ID0ganNvbi5saWdodE1hcEludGVuc2l0eTtcblxuXHRcdGlmICgganNvbi5hb01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYW9NYXAgPSBnZXRUZXh0dXJlKCBqc29uLmFvTWFwICk7XG5cdFx0aWYgKCBqc29uLmFvTWFwSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hb01hcEludGVuc2l0eSA9IGpzb24uYW9NYXBJbnRlbnNpdHk7XG5cblx0XHRpZiAoIGpzb24uZ3JhZGllbnRNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmdyYWRpZW50TWFwID0gZ2V0VGV4dHVyZSgganNvbi5ncmFkaWVudE1hcCApO1xuXG5cdFx0cmV0dXJuIG1hdGVyaWFsO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyR2VvbWV0cnlMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQnVmZmVyR2VvbWV0cnlMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHNjb3BlLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIHRleHQgKSB7XG5cblx0XHRcdG9uTG9hZCggc2NvcGUucGFyc2UoIEpTT04ucGFyc2UoIHRleHQgKSApICk7XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fSxcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0XHR2YXIgaW5kZXggPSBqc29uLmRhdGEuaW5kZXg7XG5cblx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciB0eXBlZEFycmF5ID0gbmV3IFRZUEVEX0FSUkFZU1sgaW5kZXgudHlwZSBdKCBpbmRleC5hcnJheSApO1xuXHRcdFx0Z2VvbWV0cnkuc2V0SW5kZXgoIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHR5cGVkQXJyYXksIDEgKSApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBqc29uLmRhdGEuYXR0cmlidXRlcztcblxuXHRcdGZvciAoIHZhciBrZXkgaW4gYXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIGtleSBdO1xuXHRcdFx0dmFyIHR5cGVkQXJyYXkgPSBuZXcgVFlQRURfQVJSQVlTWyBhdHRyaWJ1dGUudHlwZSBdKCBhdHRyaWJ1dGUuYXJyYXkgKTtcblxuXHRcdFx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCBrZXksIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHR5cGVkQXJyYXksIGF0dHJpYnV0ZS5pdGVtU2l6ZSwgYXR0cmlidXRlLm5vcm1hbGl6ZWQgKSApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGdyb3VwcyA9IGpzb24uZGF0YS5ncm91cHMgfHwganNvbi5kYXRhLmRyYXdjYWxscyB8fCBqc29uLmRhdGEub2Zmc2V0cztcblxuXHRcdGlmICggZ3JvdXBzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGdyb3Vwcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cblx0XHRcdFx0Z2VvbWV0cnkuYWRkR3JvdXAoIGdyb3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgYm91bmRpbmdTcGhlcmUgPSBqc29uLmRhdGEuYm91bmRpbmdTcGhlcmU7XG5cblx0XHRpZiAoIGJvdW5kaW5nU3BoZXJlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBjZW50ZXIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHRpZiAoIGJvdW5kaW5nU3BoZXJlLmNlbnRlciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNlbnRlci5mcm9tQXJyYXkoIGJvdW5kaW5nU3BoZXJlLmNlbnRlciApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID0gbmV3IFNwaGVyZSggY2VudGVyLCBib3VuZGluZ1NwaGVyZS5yYWRpdXMgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBnZW9tZXRyeTtcblxuXHR9XG5cbn0gKTtcblxudmFyIFRZUEVEX0FSUkFZUyA9IHtcblx0SW50OEFycmF5OiBJbnQ4QXJyYXksXG5cdFVpbnQ4QXJyYXk6IFVpbnQ4QXJyYXksXG5cdC8vIFdvcmthcm91bmQgZm9yIElFMTEgcHJlIEtCMjkyOTQzNy4gU2VlICMxMTQ0MFxuXHRVaW50OENsYW1wZWRBcnJheTogdHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4Q2xhbXBlZEFycmF5IDogVWludDhBcnJheSxcblx0SW50MTZBcnJheTogSW50MTZBcnJheSxcblx0VWludDE2QXJyYXk6IFVpbnQxNkFycmF5LFxuXHRJbnQzMkFycmF5OiBJbnQzMkFycmF5LFxuXHRVaW50MzJBcnJheTogVWludDMyQXJyYXksXG5cdEZsb2F0MzJBcnJheTogRmxvYXQzMkFycmF5LFxuXHRGbG9hdDY0QXJyYXk6IEZsb2F0NjRBcnJheVxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIExvYWRlcigpIHt9XG5cbkxvYWRlci5IYW5kbGVycyA9IHtcblxuXHRoYW5kbGVyczogW10sXG5cblx0YWRkOiBmdW5jdGlvbiAoIHJlZ2V4LCBsb2FkZXIgKSB7XG5cblx0XHR0aGlzLmhhbmRsZXJzLnB1c2goIHJlZ2V4LCBsb2FkZXIgKTtcblxuXHR9LFxuXG5cdGdldDogZnVuY3Rpb24gKCBmaWxlICkge1xuXG5cdFx0dmFyIGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycztcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGhhbmRsZXJzLmxlbmd0aDsgaSA8IGw7IGkgKz0gMiApIHtcblxuXHRcdFx0dmFyIHJlZ2V4ID0gaGFuZGxlcnNbIGkgXTtcblx0XHRcdHZhciBsb2FkZXIgPSBoYW5kbGVyc1sgaSArIDEgXTtcblxuXHRcdFx0aWYgKCByZWdleC50ZXN0KCBmaWxlICkgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGxvYWRlcjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cblx0fVxuXG59O1xuXG5PYmplY3QuYXNzaWduKCBMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0Y3Jvc3NPcmlnaW46IHVuZGVmaW5lZCxcblxuXHRvbkxvYWRTdGFydDogZnVuY3Rpb24gKCkge30sXG5cblx0b25Mb2FkUHJvZ3Jlc3M6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdG9uTG9hZENvbXBsZXRlOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRpbml0TWF0ZXJpYWxzOiBmdW5jdGlvbiAoIG1hdGVyaWFscywgdGV4dHVyZVBhdGgsIGNyb3NzT3JpZ2luICkge1xuXG5cdFx0dmFyIGFycmF5ID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBtYXRlcmlhbHMubGVuZ3RoOyArKyBpICkge1xuXG5cdFx0XHRhcnJheVsgaSBdID0gdGhpcy5jcmVhdGVNYXRlcmlhbCggbWF0ZXJpYWxzWyBpIF0sIHRleHR1cmVQYXRoLCBjcm9zc09yaWdpbiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0Y3JlYXRlTWF0ZXJpYWw6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIEJsZW5kaW5nTW9kZSA9IHtcblx0XHRcdE5vQmxlbmRpbmc6IE5vQmxlbmRpbmcsXG5cdFx0XHROb3JtYWxCbGVuZGluZzogTm9ybWFsQmxlbmRpbmcsXG5cdFx0XHRBZGRpdGl2ZUJsZW5kaW5nOiBBZGRpdGl2ZUJsZW5kaW5nLFxuXHRcdFx0U3VidHJhY3RpdmVCbGVuZGluZzogU3VidHJhY3RpdmVCbGVuZGluZyxcblx0XHRcdE11bHRpcGx5QmxlbmRpbmc6IE11bHRpcGx5QmxlbmRpbmcsXG5cdFx0XHRDdXN0b21CbGVuZGluZzogQ3VzdG9tQmxlbmRpbmdcblx0XHR9O1xuXG5cdFx0dmFyIGNvbG9yID0gbmV3IENvbG9yKCk7XG5cdFx0dmFyIHRleHR1cmVMb2FkZXIgPSBuZXcgVGV4dHVyZUxvYWRlcigpO1xuXHRcdHZhciBtYXRlcmlhbExvYWRlciA9IG5ldyBNYXRlcmlhbExvYWRlcigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZU1hdGVyaWFsKCBtLCB0ZXh0dXJlUGF0aCwgY3Jvc3NPcmlnaW4gKSB7XG5cblx0XHRcdC8vIGNvbnZlcnQgZnJvbSBvbGQgbWF0ZXJpYWwgZm9ybWF0XG5cblx0XHRcdHZhciB0ZXh0dXJlcyA9IHt9O1xuXG5cdFx0XHRmdW5jdGlvbiBsb2FkVGV4dHVyZSggcGF0aCwgcmVwZWF0LCBvZmZzZXQsIHdyYXAsIGFuaXNvdHJvcHkgKSB7XG5cblx0XHRcdFx0dmFyIGZ1bGxQYXRoID0gdGV4dHVyZVBhdGggKyBwYXRoO1xuXHRcdFx0XHR2YXIgbG9hZGVyID0gTG9hZGVyLkhhbmRsZXJzLmdldCggZnVsbFBhdGggKTtcblxuXHRcdFx0XHR2YXIgdGV4dHVyZTtcblxuXHRcdFx0XHRpZiAoIGxvYWRlciAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUgPSBsb2FkZXIubG9hZCggZnVsbFBhdGggKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dGV4dHVyZUxvYWRlci5zZXRDcm9zc09yaWdpbiggY3Jvc3NPcmlnaW4gKTtcblx0XHRcdFx0XHR0ZXh0dXJlID0gdGV4dHVyZUxvYWRlci5sb2FkKCBmdWxsUGF0aCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHJlcGVhdCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5yZXBlYXQuZnJvbUFycmF5KCByZXBlYXQgKTtcblxuXHRcdFx0XHRcdGlmICggcmVwZWF0WyAwIF0gIT09IDEgKSB0ZXh0dXJlLndyYXBTID0gUmVwZWF0V3JhcHBpbmc7XG5cdFx0XHRcdFx0aWYgKCByZXBlYXRbIDEgXSAhPT0gMSApIHRleHR1cmUud3JhcFQgPSBSZXBlYXRXcmFwcGluZztcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBvZmZzZXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUub2Zmc2V0LmZyb21BcnJheSggb2Zmc2V0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggd3JhcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0aWYgKCB3cmFwWyAwIF0gPT09ICdyZXBlYXQnICkgdGV4dHVyZS53cmFwUyA9IFJlcGVhdFdyYXBwaW5nO1xuXHRcdFx0XHRcdGlmICggd3JhcFsgMCBdID09PSAnbWlycm9yJyApIHRleHR1cmUud3JhcFMgPSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nO1xuXG5cdFx0XHRcdFx0aWYgKCB3cmFwWyAxIF0gPT09ICdyZXBlYXQnICkgdGV4dHVyZS53cmFwVCA9IFJlcGVhdFdyYXBwaW5nO1xuXHRcdFx0XHRcdGlmICggd3JhcFsgMSBdID09PSAnbWlycm9yJyApIHRleHR1cmUud3JhcFQgPSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIGFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUuYW5pc290cm9weSA9IGFuaXNvdHJvcHk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciB1dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0XHRcdFx0dGV4dHVyZXNbIHV1aWQgXSA9IHRleHR1cmU7XG5cblx0XHRcdFx0cmV0dXJuIHV1aWQ7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly9cblxuXHRcdFx0dmFyIGpzb24gPSB7XG5cdFx0XHRcdHV1aWQ6IF9NYXRoLmdlbmVyYXRlVVVJRCgpLFxuXHRcdFx0XHR0eXBlOiAnTWVzaExhbWJlcnRNYXRlcmlhbCdcblx0XHRcdH07XG5cblx0XHRcdGZvciAoIHZhciBuYW1lIGluIG0gKSB7XG5cblx0XHRcdFx0dmFyIHZhbHVlID0gbVsgbmFtZSBdO1xuXG5cdFx0XHRcdHN3aXRjaCAoIG5hbWUgKSB7XG5cblx0XHRcdFx0XHRjYXNlICdEYmdDb2xvcic6XG5cdFx0XHRcdFx0Y2FzZSAnRGJnSW5kZXgnOlxuXHRcdFx0XHRcdGNhc2UgJ29wdGljYWxEZW5zaXR5Jzpcblx0XHRcdFx0XHRjYXNlICdpbGx1bWluYXRpb24nOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnRGJnTmFtZSc6XG5cdFx0XHRcdFx0XHRqc29uLm5hbWUgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2JsZW5kaW5nJzpcblx0XHRcdFx0XHRcdGpzb24uYmxlbmRpbmcgPSBCbGVuZGluZ01vZGVbIHZhbHVlIF07XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdjb2xvckFtYmllbnQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEFtYmllbnQnOlxuXHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTG9hZGVyLmNyZWF0ZU1hdGVyaWFsOicsIG5hbWUsICdpcyBubyBsb25nZXIgc3VwcG9ydGVkLicgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NvbG9yRGlmZnVzZSc6XG5cdFx0XHRcdFx0XHRqc29uLmNvbG9yID0gY29sb3IuZnJvbUFycmF5KCB2YWx1ZSApLmdldEhleCgpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29sb3JTcGVjdWxhcic6XG5cdFx0XHRcdFx0XHRqc29uLnNwZWN1bGFyID0gY29sb3IuZnJvbUFycmF5KCB2YWx1ZSApLmdldEhleCgpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29sb3JFbWlzc2l2ZSc6XG5cdFx0XHRcdFx0XHRqc29uLmVtaXNzaXZlID0gY29sb3IuZnJvbUFycmF5KCB2YWx1ZSApLmdldEhleCgpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc3BlY3VsYXJDb2VmJzpcblx0XHRcdFx0XHRcdGpzb24uc2hpbmluZXNzID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdzaGFkaW5nJzpcblx0XHRcdFx0XHRcdGlmICggdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ2Jhc2ljJyApIGpzb24udHlwZSA9ICdNZXNoQmFzaWNNYXRlcmlhbCc7XG5cdFx0XHRcdFx0XHRpZiAoIHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICdwaG9uZycgKSBqc29uLnR5cGUgPSAnTWVzaFBob25nTWF0ZXJpYWwnO1xuXHRcdFx0XHRcdFx0aWYgKCB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAnc3RhbmRhcmQnICkganNvbi50eXBlID0gJ01lc2hTdGFuZGFyZE1hdGVyaWFsJztcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcERpZmZ1c2UnOlxuXHRcdFx0XHRcdFx0anNvbi5tYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwRGlmZnVzZVJlcGVhdCwgbS5tYXBEaWZmdXNlT2Zmc2V0LCBtLm1hcERpZmZ1c2VXcmFwLCBtLm1hcERpZmZ1c2VBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBEaWZmdXNlUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBEaWZmdXNlT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBEaWZmdXNlV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRGlmZnVzZUFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRW1pc3NpdmUnOlxuXHRcdFx0XHRcdFx0anNvbi5lbWlzc2l2ZU1hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBFbWlzc2l2ZVJlcGVhdCwgbS5tYXBFbWlzc2l2ZU9mZnNldCwgbS5tYXBFbWlzc2l2ZVdyYXAsIG0ubWFwRW1pc3NpdmVBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBFbWlzc2l2ZVJlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRW1pc3NpdmVPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEVtaXNzaXZlV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRW1pc3NpdmVBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcExpZ2h0Jzpcblx0XHRcdFx0XHRcdGpzb24ubGlnaHRNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwTGlnaHRSZXBlYXQsIG0ubWFwTGlnaHRPZmZzZXQsIG0ubWFwTGlnaHRXcmFwLCBtLm1hcExpZ2h0QW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTGlnaHRSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcExpZ2h0T2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBMaWdodFdyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcExpZ2h0QW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBBTyc6XG5cdFx0XHRcdFx0XHRqc29uLmFvTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcEFPUmVwZWF0LCBtLm1hcEFPT2Zmc2V0LCBtLm1hcEFPV3JhcCwgbS5tYXBBT0FuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEFPUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBBT09mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQU9XcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBBT0FuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQnVtcCc6XG5cdFx0XHRcdFx0XHRqc29uLmJ1bXBNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwQnVtcFJlcGVhdCwgbS5tYXBCdW1wT2Zmc2V0LCBtLm1hcEJ1bXBXcmFwLCBtLm1hcEJ1bXBBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBCdW1wU2NhbGUnOlxuXHRcdFx0XHRcdFx0anNvbi5idW1wU2NhbGUgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEJ1bXBSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEJ1bXBPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEJ1bXBXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBCdW1wQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBOb3JtYWwnOlxuXHRcdFx0XHRcdFx0anNvbi5ub3JtYWxNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwTm9ybWFsUmVwZWF0LCBtLm1hcE5vcm1hbE9mZnNldCwgbS5tYXBOb3JtYWxXcmFwLCBtLm1hcE5vcm1hbEFuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcE5vcm1hbEZhY3Rvcic6XG5cdFx0XHRcdFx0XHRqc29uLm5vcm1hbFNjYWxlID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBOb3JtYWxSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE5vcm1hbE9mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTm9ybWFsV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTm9ybWFsQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBTcGVjdWxhcic6XG5cdFx0XHRcdFx0XHRqc29uLnNwZWN1bGFyTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcFNwZWN1bGFyUmVwZWF0LCBtLm1hcFNwZWN1bGFyT2Zmc2V0LCBtLm1hcFNwZWN1bGFyV3JhcCwgbS5tYXBTcGVjdWxhckFuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcFNwZWN1bGFyUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBTcGVjdWxhck9mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwU3BlY3VsYXJXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBTcGVjdWxhckFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTWV0YWxuZXNzJzpcblx0XHRcdFx0XHRcdGpzb24ubWV0YWxuZXNzTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcE1ldGFsbmVzc1JlcGVhdCwgbS5tYXBNZXRhbG5lc3NPZmZzZXQsIG0ubWFwTWV0YWxuZXNzV3JhcCwgbS5tYXBNZXRhbG5lc3NBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBNZXRhbG5lc3NSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE1ldGFsbmVzc09mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTWV0YWxuZXNzV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTWV0YWxuZXNzQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBSb3VnaG5lc3MnOlxuXHRcdFx0XHRcdFx0anNvbi5yb3VnaG5lc3NNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwUm91Z2huZXNzUmVwZWF0LCBtLm1hcFJvdWdobmVzc09mZnNldCwgbS5tYXBSb3VnaG5lc3NXcmFwLCBtLm1hcFJvdWdobmVzc0FuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcFJvdWdobmVzc1JlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwUm91Z2huZXNzT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBSb3VnaG5lc3NXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBSb3VnaG5lc3NBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEFscGhhJzpcblx0XHRcdFx0XHRcdGpzb24uYWxwaGFNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwQWxwaGFSZXBlYXQsIG0ubWFwQWxwaGFPZmZzZXQsIG0ubWFwQWxwaGFXcmFwLCBtLm1hcEFscGhhQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQWxwaGFSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEFscGhhT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBBbHBoYVdyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEFscGhhQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdmbGlwU2lkZWQnOlxuXHRcdFx0XHRcdFx0anNvbi5zaWRlID0gQmFja1NpZGU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdkb3VibGVTaWRlZCc6XG5cdFx0XHRcdFx0XHRqc29uLnNpZGUgPSBEb3VibGVTaWRlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndHJhbnNwYXJlbmN5Jzpcblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxvYWRlci5jcmVhdGVNYXRlcmlhbDogdHJhbnNwYXJlbmN5IGhhcyBiZWVuIHJlbmFtZWQgdG8gb3BhY2l0eScgKTtcblx0XHRcdFx0XHRcdGpzb24ub3BhY2l0eSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZGVwdGhUZXN0Jzpcblx0XHRcdFx0XHRjYXNlICdkZXB0aFdyaXRlJzpcblx0XHRcdFx0XHRjYXNlICdjb2xvcldyaXRlJzpcblx0XHRcdFx0XHRjYXNlICdvcGFjaXR5Jzpcblx0XHRcdFx0XHRjYXNlICdyZWZsZWN0aXZpdHknOlxuXHRcdFx0XHRcdGNhc2UgJ3RyYW5zcGFyZW50Jzpcblx0XHRcdFx0XHRjYXNlICd2aXNpYmxlJzpcblx0XHRcdFx0XHRjYXNlICd3aXJlZnJhbWUnOlxuXHRcdFx0XHRcdFx0anNvblsgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICd2ZXJ0ZXhDb2xvcnMnOlxuXHRcdFx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIGpzb24udmVydGV4Q29sb3JzID0gVmVydGV4Q29sb3JzO1xuXHRcdFx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gJ2ZhY2UnICkganNvbi52ZXJ0ZXhDb2xvcnMgPSBGYWNlQ29sb3JzO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Mb2FkZXIuY3JlYXRlTWF0ZXJpYWw6IFVuc3VwcG9ydGVkJywgbmFtZSwgdmFsdWUgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGpzb24udHlwZSA9PT0gJ01lc2hCYXNpY01hdGVyaWFsJyApIGRlbGV0ZSBqc29uLmVtaXNzaXZlO1xuXHRcdFx0aWYgKCBqc29uLnR5cGUgIT09ICdNZXNoUGhvbmdNYXRlcmlhbCcgKSBkZWxldGUganNvbi5zcGVjdWxhcjtcblxuXHRcdFx0aWYgKCBqc29uLm9wYWNpdHkgPCAxICkganNvbi50cmFuc3BhcmVudCA9IHRydWU7XG5cblx0XHRcdG1hdGVyaWFsTG9hZGVyLnNldFRleHR1cmVzKCB0ZXh0dXJlcyApO1xuXG5cdFx0XHRyZXR1cm4gbWF0ZXJpYWxMb2FkZXIucGFyc2UoIGpzb24gKTtcblxuXHRcdH07XG5cblx0fSApKClcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgRG9uIE1jQ3VyZHkgLyBodHRwczovL3d3dy5kb25tY2N1cmR5LmNvbVxuICovXG5cbnZhciBMb2FkZXJVdGlscyA9IHtcblxuXHRkZWNvZGVUZXh0OiBmdW5jdGlvbiAoIGFycmF5ICkge1xuXG5cdFx0aWYgKCB0eXBlb2YgVGV4dERlY29kZXIgIT09ICd1bmRlZmluZWQnICkge1xuXG5cdFx0XHRyZXR1cm4gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKCBhcnJheSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gQXZvaWQgdGhlIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYXJyYXkpIHNob3J0Y3V0LCB3aGljaFxuXHRcdC8vIHRocm93cyBhIFwibWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIiBlcnJvciBmb3IgbGFyZ2UgYXJyYXlzLlxuXG5cdFx0dmFyIHMgPSAnJztcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBhcnJheS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0Ly8gSW1wbGljaXRseSBhc3N1bWVzIGxpdHRsZS1lbmRpYW4uXG5cdFx0XHRzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoIGFycmF5WyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdC8vIE1lcmdlcyBtdWx0aS1ieXRlIHV0Zi04IGNoYXJhY3RlcnMuXG5cdFx0cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCggZXNjYXBlKCBzICkgKTtcblxuXHR9LFxuXG5cdGV4dHJhY3RVcmxCYXNlOiBmdW5jdGlvbiAoIHVybCApIHtcblxuXHRcdHZhciBpbmRleCA9IHVybC5sYXN0SW5kZXhPZiggJy8nICk7XG5cblx0XHRpZiAoIGluZGV4ID09PSAtIDEgKSByZXR1cm4gJy4vJztcblxuXHRcdHJldHVybiB1cmwuc3Vic3RyKCAwLCBpbmRleCArIDEgKTtcblxuXHR9XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gSlNPTkxvYWRlciggbWFuYWdlciApIHtcblxuXHRpZiAoIHR5cGVvZiBtYW5hZ2VyID09PSAnYm9vbGVhbicgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5KU09OTG9hZGVyOiBzaG93U3RhdHVzIHBhcmFtZXRlciBoYXMgYmVlbiByZW1vdmVkIGZyb20gY29uc3RydWN0b3IuJyApO1xuXHRcdG1hbmFnZXIgPSB1bmRlZmluZWQ7XG5cblx0fVxuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG5cdHRoaXMud2l0aENyZWRlbnRpYWxzID0gZmFsc2U7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggSlNPTkxvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciB0ZXh0dXJlUGF0aCA9IHRoaXMudGV4dHVyZVBhdGggJiYgKCB0eXBlb2YgdGhpcy50ZXh0dXJlUGF0aCA9PT0gJ3N0cmluZycgKSA/IHRoaXMudGV4dHVyZVBhdGggOiBMb2FkZXJVdGlscy5leHRyYWN0VXJsQmFzZSggdXJsICk7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApO1xuXHRcdGxvYWRlci5zZXRXaXRoQ3JlZGVudGlhbHMoIHRoaXMud2l0aENyZWRlbnRpYWxzICk7XG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkge1xuXG5cdFx0XHR2YXIganNvbiA9IEpTT04ucGFyc2UoIHRleHQgKTtcblx0XHRcdHZhciBtZXRhZGF0YSA9IGpzb24ubWV0YWRhdGE7XG5cblx0XHRcdGlmICggbWV0YWRhdGEgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR2YXIgdHlwZSA9IG1ldGFkYXRhLnR5cGU7XG5cblx0XHRcdFx0aWYgKCB0eXBlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ29iamVjdCcgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5KU09OTG9hZGVyOiAnICsgdXJsICsgJyBzaG91bGQgYmUgbG9hZGVkIHdpdGggVEhSRUUuT2JqZWN0TG9hZGVyIGluc3RlYWQuJyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgb2JqZWN0ID0gc2NvcGUucGFyc2UoIGpzb24sIHRleHR1cmVQYXRoICk7XG5cdFx0XHRvbkxvYWQoIG9iamVjdC5nZW9tZXRyeSwgb2JqZWN0Lm1hdGVyaWFscyApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdH0sXG5cblx0c2V0VGV4dHVyZVBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnRleHR1cmVQYXRoID0gdmFsdWU7XG5cblx0fSxcblxuXHRwYXJzZTogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHRmdW5jdGlvbiBwYXJzZU1vZGVsKCBqc29uLCBnZW9tZXRyeSApIHtcblxuXHRcdFx0ZnVuY3Rpb24gaXNCaXRTZXQoIHZhbHVlLCBwb3NpdGlvbiApIHtcblxuXHRcdFx0XHRyZXR1cm4gdmFsdWUgJiAoIDEgPDwgcG9zaXRpb24gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgaSwgaiwgZmksXG5cblx0XHRcdFx0b2Zmc2V0LCB6TGVuZ3RoLFxuXG5cdFx0XHRcdGNvbG9ySW5kZXgsIG5vcm1hbEluZGV4LCB1dkluZGV4LCBtYXRlcmlhbEluZGV4LFxuXG5cdFx0XHRcdHR5cGUsXG5cdFx0XHRcdGlzUXVhZCxcblx0XHRcdFx0aGFzTWF0ZXJpYWwsXG5cdFx0XHRcdGhhc0ZhY2VWZXJ0ZXhVdixcblx0XHRcdFx0aGFzRmFjZU5vcm1hbCwgaGFzRmFjZVZlcnRleE5vcm1hbCxcblx0XHRcdFx0aGFzRmFjZUNvbG9yLCBoYXNGYWNlVmVydGV4Q29sb3IsXG5cblx0XHRcdFx0dmVydGV4LCBmYWNlLCBmYWNlQSwgZmFjZUIsIGhleCwgbm9ybWFsLFxuXG5cdFx0XHRcdHV2TGF5ZXIsIHV2LCB1LCB2LFxuXG5cdFx0XHRcdGZhY2VzID0ganNvbi5mYWNlcyxcblx0XHRcdFx0dmVydGljZXMgPSBqc29uLnZlcnRpY2VzLFxuXHRcdFx0XHRub3JtYWxzID0ganNvbi5ub3JtYWxzLFxuXHRcdFx0XHRjb2xvcnMgPSBqc29uLmNvbG9ycyxcblxuXHRcdFx0XHRzY2FsZSA9IGpzb24uc2NhbGUsXG5cblx0XHRcdFx0blV2TGF5ZXJzID0gMDtcblxuXG5cdFx0XHRpZiAoIGpzb24udXZzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ly8gZGlzcmVnYXJkIGVtcHR5IGFycmF5c1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwganNvbi51dnMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0aWYgKCBqc29uLnV2c1sgaSBdLmxlbmd0aCApIG5VdkxheWVycyArKztcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBuVXZMYXllcnM7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF0gPSBbXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0b2Zmc2V0ID0gMDtcblx0XHRcdHpMZW5ndGggPSB2ZXJ0aWNlcy5sZW5ndGg7XG5cblx0XHRcdHdoaWxlICggb2Zmc2V0IDwgekxlbmd0aCApIHtcblxuXHRcdFx0XHR2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHRcdHZlcnRleC54ID0gdmVydGljZXNbIG9mZnNldCArKyBdICogc2NhbGU7XG5cdFx0XHRcdHZlcnRleC55ID0gdmVydGljZXNbIG9mZnNldCArKyBdICogc2NhbGU7XG5cdFx0XHRcdHZlcnRleC56ID0gdmVydGljZXNbIG9mZnNldCArKyBdICogc2NhbGU7XG5cblx0XHRcdFx0Z2VvbWV0cnkudmVydGljZXMucHVzaCggdmVydGV4ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0b2Zmc2V0ID0gMDtcblx0XHRcdHpMZW5ndGggPSBmYWNlcy5sZW5ndGg7XG5cblx0XHRcdHdoaWxlICggb2Zmc2V0IDwgekxlbmd0aCApIHtcblxuXHRcdFx0XHR0eXBlID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXG5cdFx0XHRcdGlzUXVhZCA9IGlzQml0U2V0KCB0eXBlLCAwICk7XG5cdFx0XHRcdGhhc01hdGVyaWFsID0gaXNCaXRTZXQoIHR5cGUsIDEgKTtcblx0XHRcdFx0aGFzRmFjZVZlcnRleFV2ID0gaXNCaXRTZXQoIHR5cGUsIDMgKTtcblx0XHRcdFx0aGFzRmFjZU5vcm1hbCA9IGlzQml0U2V0KCB0eXBlLCA0ICk7XG5cdFx0XHRcdGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgPSBpc0JpdFNldCggdHlwZSwgNSApO1xuXHRcdFx0XHRoYXNGYWNlQ29sb3IgPSBpc0JpdFNldCggdHlwZSwgNiApO1xuXHRcdFx0XHRoYXNGYWNlVmVydGV4Q29sb3IgPSBpc0JpdFNldCggdHlwZSwgNyApO1xuXG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKFwidHlwZVwiLCB0eXBlLCBcImJpdHNcIiwgaXNRdWFkLCBoYXNNYXRlcmlhbCwgaGFzRmFjZVZlcnRleFV2LCBoYXNGYWNlTm9ybWFsLCBoYXNGYWNlVmVydGV4Tm9ybWFsLCBoYXNGYWNlQ29sb3IsIGhhc0ZhY2VWZXJ0ZXhDb2xvcik7XG5cblx0XHRcdFx0aWYgKCBpc1F1YWQgKSB7XG5cblx0XHRcdFx0XHRmYWNlQSA9IG5ldyBGYWNlMygpO1xuXHRcdFx0XHRcdGZhY2VBLmEgPSBmYWNlc1sgb2Zmc2V0IF07XG5cdFx0XHRcdFx0ZmFjZUEuYiA9IGZhY2VzWyBvZmZzZXQgKyAxIF07XG5cdFx0XHRcdFx0ZmFjZUEuYyA9IGZhY2VzWyBvZmZzZXQgKyAzIF07XG5cblx0XHRcdFx0XHRmYWNlQiA9IG5ldyBGYWNlMygpO1xuXHRcdFx0XHRcdGZhY2VCLmEgPSBmYWNlc1sgb2Zmc2V0ICsgMSBdO1xuXHRcdFx0XHRcdGZhY2VCLmIgPSBmYWNlc1sgb2Zmc2V0ICsgMiBdO1xuXHRcdFx0XHRcdGZhY2VCLmMgPSBmYWNlc1sgb2Zmc2V0ICsgMyBdO1xuXG5cdFx0XHRcdFx0b2Zmc2V0ICs9IDQ7XG5cblx0XHRcdFx0XHRpZiAoIGhhc01hdGVyaWFsICkge1xuXG5cdFx0XHRcdFx0XHRtYXRlcmlhbEluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXHRcdFx0XHRcdFx0ZmFjZUEubWF0ZXJpYWxJbmRleCA9IG1hdGVyaWFsSW5kZXg7XG5cdFx0XHRcdFx0XHRmYWNlQi5tYXRlcmlhbEluZGV4ID0gbWF0ZXJpYWxJbmRleDtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIHRvIGdldCBmYWNlIDw9PiB1diBpbmRleCBjb3JyZXNwb25kZW5jZVxuXG5cdFx0XHRcdFx0ZmkgPSBnZW9tZXRyeS5mYWNlcy5sZW5ndGg7XG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhVdiApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBuVXZMYXllcnM7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dXZMYXllciA9IGpzb24udXZzWyBpIF07XG5cblx0XHRcdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdWyBmaSBdID0gW107XG5cdFx0XHRcdFx0XHRcdGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgKyAxIF0gPSBbXTtcblxuXHRcdFx0XHRcdFx0XHRmb3IgKCBqID0gMDsgaiA8IDQ7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHR1dkluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXG5cdFx0XHRcdFx0XHRcdFx0dSA9IHV2TGF5ZXJbIHV2SW5kZXggKiAyIF07XG5cdFx0XHRcdFx0XHRcdFx0diA9IHV2TGF5ZXJbIHV2SW5kZXggKiAyICsgMSBdO1xuXG5cdFx0XHRcdFx0XHRcdFx0dXYgPSBuZXcgVmVjdG9yMiggdSwgdiApO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBqICE9PSAyICkgZ2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdWyBmaSBdLnB1c2goIHV2ICk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBqICE9PSAwICkgZ2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdWyBmaSArIDEgXS5wdXNoKCB1diApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlTm9ybWFsICkge1xuXG5cdFx0XHRcdFx0XHRub3JtYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXSAqIDM7XG5cblx0XHRcdFx0XHRcdGZhY2VBLm5vcm1hbC5zZXQoXG5cdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sXG5cdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sXG5cdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4IF1cblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGZhY2VCLm5vcm1hbC5jb3B5KCBmYWNlQS5ub3JtYWwgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZVZlcnRleE5vcm1hbCApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCA0OyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdG5vcm1hbEluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdICogMztcblxuXHRcdFx0XHRcdFx0XHRub3JtYWwgPSBuZXcgVmVjdG9yMyhcblx0XHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sXG5cdFx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggXVxuXHRcdFx0XHRcdFx0XHQpO1xuXG5cblx0XHRcdFx0XHRcdFx0aWYgKCBpICE9PSAyICkgZmFjZUEudmVydGV4Tm9ybWFscy5wdXNoKCBub3JtYWwgKTtcblx0XHRcdFx0XHRcdFx0aWYgKCBpICE9PSAwICkgZmFjZUIudmVydGV4Tm9ybWFscy5wdXNoKCBub3JtYWwgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VDb2xvciApIHtcblxuXHRcdFx0XHRcdFx0Y29sb3JJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRcdGhleCA9IGNvbG9yc1sgY29sb3JJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRmYWNlQS5jb2xvci5zZXRIZXgoIGhleCApO1xuXHRcdFx0XHRcdFx0ZmFjZUIuY29sb3Iuc2V0SGV4KCBoZXggKTtcblxuXHRcdFx0XHRcdH1cblxuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4Q29sb3IgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgNDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRjb2xvckluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXHRcdFx0XHRcdFx0XHRoZXggPSBjb2xvcnNbIGNvbG9ySW5kZXggXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGkgIT09IDIgKSBmYWNlQS52ZXJ0ZXhDb2xvcnMucHVzaCggbmV3IENvbG9yKCBoZXggKSApO1xuXHRcdFx0XHRcdFx0XHRpZiAoIGkgIT09IDAgKSBmYWNlQi52ZXJ0ZXhDb2xvcnMucHVzaCggbmV3IENvbG9yKCBoZXggKSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlcy5wdXNoKCBmYWNlQSApO1xuXHRcdFx0XHRcdGdlb21ldHJ5LmZhY2VzLnB1c2goIGZhY2VCICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGZhY2UgPSBuZXcgRmFjZTMoKTtcblx0XHRcdFx0XHRmYWNlLmEgPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0ZmFjZS5iID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXHRcdFx0XHRcdGZhY2UuYyA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHRcdGlmICggaGFzTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0XHRcdG1hdGVyaWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0XHRmYWNlLm1hdGVyaWFsSW5kZXggPSBtYXRlcmlhbEluZGV4O1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gdG8gZ2V0IGZhY2UgPD0+IHV2IGluZGV4IGNvcnJlc3BvbmRlbmNlXG5cblx0XHRcdFx0XHRmaSA9IGdlb21ldHJ5LmZhY2VzLmxlbmd0aDtcblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZVZlcnRleFV2ICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IG5VdkxheWVyczsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHR1dkxheWVyID0ganNvbi51dnNbIGkgXTtcblxuXHRcdFx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpIF0gPSBbXTtcblxuXHRcdFx0XHRcdFx0XHRmb3IgKCBqID0gMDsgaiA8IDM7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHR1dkluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXG5cdFx0XHRcdFx0XHRcdFx0dSA9IHV2TGF5ZXJbIHV2SW5kZXggKiAyIF07XG5cdFx0XHRcdFx0XHRcdFx0diA9IHV2TGF5ZXJbIHV2SW5kZXggKiAyICsgMSBdO1xuXG5cdFx0XHRcdFx0XHRcdFx0dXYgPSBuZXcgVmVjdG9yMiggdSwgdiApO1xuXG5cdFx0XHRcdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdWyBmaSBdLnB1c2goIHV2ICk7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VOb3JtYWwgKSB7XG5cblx0XHRcdFx0XHRcdG5vcm1hbEluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdICogMztcblxuXHRcdFx0XHRcdFx0ZmFjZS5ub3JtYWwuc2V0KFxuXHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCBdXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4Tm9ybWFsICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IDM7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0bm9ybWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF0gKiAzO1xuXG5cdFx0XHRcdFx0XHRcdG5vcm1hbCA9IG5ldyBWZWN0b3IzKFxuXHRcdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sXG5cdFx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCBdXG5cdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0ZmFjZS52ZXJ0ZXhOb3JtYWxzLnB1c2goIG5vcm1hbCApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZUNvbG9yICkge1xuXG5cdFx0XHRcdFx0XHRjb2xvckluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXHRcdFx0XHRcdFx0ZmFjZS5jb2xvci5zZXRIZXgoIGNvbG9yc1sgY29sb3JJbmRleCBdICk7XG5cblx0XHRcdFx0XHR9XG5cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZVZlcnRleENvbG9yICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IDM7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0Y29sb3JJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRcdFx0ZmFjZS52ZXJ0ZXhDb2xvcnMucHVzaCggbmV3IENvbG9yKCBjb2xvcnNbIGNvbG9ySW5kZXggXSApICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGdlb21ldHJ5LmZhY2VzLnB1c2goIGZhY2UgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHBhcnNlU2tpbigganNvbiwgZ2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciBpbmZsdWVuY2VzUGVyVmVydGV4ID0gKCBqc29uLmluZmx1ZW5jZXNQZXJWZXJ0ZXggIT09IHVuZGVmaW5lZCApID8ganNvbi5pbmZsdWVuY2VzUGVyVmVydGV4IDogMjtcblxuXHRcdFx0aWYgKCBqc29uLnNraW5XZWlnaHRzICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24uc2tpbldlaWdodHMubGVuZ3RoOyBpIDwgbDsgaSArPSBpbmZsdWVuY2VzUGVyVmVydGV4ICkge1xuXG5cdFx0XHRcdFx0dmFyIHggPSBqc29uLnNraW5XZWlnaHRzWyBpIF07XG5cdFx0XHRcdFx0dmFyIHkgPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAxICkgPyBqc29uLnNraW5XZWlnaHRzWyBpICsgMSBdIDogMDtcblx0XHRcdFx0XHR2YXIgeiA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDIgKSA/IGpzb24uc2tpbldlaWdodHNbIGkgKyAyIF0gOiAwO1xuXHRcdFx0XHRcdHZhciB3ID0gKCBpbmZsdWVuY2VzUGVyVmVydGV4ID4gMyApID8ganNvbi5za2luV2VpZ2h0c1sgaSArIDMgXSA6IDA7XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5za2luV2VpZ2h0cy5wdXNoKCBuZXcgVmVjdG9yNCggeCwgeSwgeiwgdyApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICgganNvbi5za2luSW5kaWNlcyApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLnNraW5JbmRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKz0gaW5mbHVlbmNlc1BlclZlcnRleCApIHtcblxuXHRcdFx0XHRcdHZhciBhID0ganNvbi5za2luSW5kaWNlc1sgaSBdO1xuXHRcdFx0XHRcdHZhciBiID0gKCBpbmZsdWVuY2VzUGVyVmVydGV4ID4gMSApID8ganNvbi5za2luSW5kaWNlc1sgaSArIDEgXSA6IDA7XG5cdFx0XHRcdFx0dmFyIGMgPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAyICkgPyBqc29uLnNraW5JbmRpY2VzWyBpICsgMiBdIDogMDtcblx0XHRcdFx0XHR2YXIgZCA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDMgKSA/IGpzb24uc2tpbkluZGljZXNbIGkgKyAzIF0gOiAwO1xuXG5cdFx0XHRcdFx0Z2VvbWV0cnkuc2tpbkluZGljZXMucHVzaCggbmV3IFZlY3RvcjQoIGEsIGIsIGMsIGQgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeS5ib25lcyA9IGpzb24uYm9uZXM7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYm9uZXMgJiYgZ2VvbWV0cnkuYm9uZXMubGVuZ3RoID4gMCAmJiAoIGdlb21ldHJ5LnNraW5XZWlnaHRzLmxlbmd0aCAhPT0gZ2VvbWV0cnkuc2tpbkluZGljZXMubGVuZ3RoIHx8IGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCAhPT0gZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoICkgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnV2hlbiBza2lubmluZywgbnVtYmVyIG9mIHZlcnRpY2VzICgnICsgZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoICsgJyksIHNraW5JbmRpY2VzICgnICtcblx0XHRcdFx0XHRnZW9tZXRyeS5za2luSW5kaWNlcy5sZW5ndGggKyAnKSwgYW5kIHNraW5XZWlnaHRzICgnICsgZ2VvbWV0cnkuc2tpbldlaWdodHMubGVuZ3RoICsgJykgc2hvdWxkIG1hdGNoLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gcGFyc2VNb3JwaGluZygganNvbiwgZ2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciBzY2FsZSA9IGpzb24uc2NhbGU7XG5cblx0XHRcdGlmICgganNvbi5tb3JwaFRhcmdldHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLm1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0Z2VvbWV0cnkubW9ycGhUYXJnZXRzWyBpIF0gPSB7fTtcblx0XHRcdFx0XHRnZW9tZXRyeS5tb3JwaFRhcmdldHNbIGkgXS5uYW1lID0ganNvbi5tb3JwaFRhcmdldHNbIGkgXS5uYW1lO1xuXHRcdFx0XHRcdGdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1sgaSBdLnZlcnRpY2VzID0gW107XG5cblx0XHRcdFx0XHR2YXIgZHN0VmVydGljZXMgPSBnZW9tZXRyeS5tb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlcztcblx0XHRcdFx0XHR2YXIgc3JjVmVydGljZXMgPSBqc29uLm1vcnBoVGFyZ2V0c1sgaSBdLnZlcnRpY2VzO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIHYgPSAwLCB2bCA9IHNyY1ZlcnRpY2VzLmxlbmd0aDsgdiA8IHZsOyB2ICs9IDMgKSB7XG5cblx0XHRcdFx0XHRcdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0XHRcdFx0dmVydGV4LnggPSBzcmNWZXJ0aWNlc1sgdiBdICogc2NhbGU7XG5cdFx0XHRcdFx0XHR2ZXJ0ZXgueSA9IHNyY1ZlcnRpY2VzWyB2ICsgMSBdICogc2NhbGU7XG5cdFx0XHRcdFx0XHR2ZXJ0ZXgueiA9IHNyY1ZlcnRpY2VzWyB2ICsgMiBdICogc2NhbGU7XG5cblx0XHRcdFx0XHRcdGRzdFZlcnRpY2VzLnB1c2goIHZlcnRleCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGpzb24ubW9ycGhDb2xvcnMgIT09IHVuZGVmaW5lZCAmJiBqc29uLm1vcnBoQ29sb3JzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuSlNPTkxvYWRlcjogXCJtb3JwaENvbG9yc1wiIG5vIGxvbmdlciBzdXBwb3J0ZWQuIFVzaW5nIHRoZW0gYXMgZmFjZSBjb2xvcnMuJyApO1xuXG5cdFx0XHRcdHZhciBmYWNlcyA9IGdlb21ldHJ5LmZhY2VzO1xuXHRcdFx0XHR2YXIgbW9ycGhDb2xvcnMgPSBqc29uLm1vcnBoQ29sb3JzWyAwIF0uY29sb3JzO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRmYWNlc1sgaSBdLmNvbG9yLmZyb21BcnJheSggbW9ycGhDb2xvcnMsIGkgKiAzICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBwYXJzZUFuaW1hdGlvbnMoIGpzb24sIGdlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgb3V0cHV0QW5pbWF0aW9ucyA9IFtdO1xuXG5cdFx0XHQvLyBwYXJzZSBvbGQgc3R5bGUgQm9uZS9IaWVyYXJjaHkgYW5pbWF0aW9uc1xuXHRcdFx0dmFyIGFuaW1hdGlvbnMgPSBbXTtcblxuXHRcdFx0aWYgKCBqc29uLmFuaW1hdGlvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGFuaW1hdGlvbnMucHVzaCgganNvbi5hbmltYXRpb24gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGpzb24uYW5pbWF0aW9ucyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGlmICgganNvbi5hbmltYXRpb25zLmxlbmd0aCApIHtcblxuXHRcdFx0XHRcdGFuaW1hdGlvbnMgPSBhbmltYXRpb25zLmNvbmNhdCgganNvbi5hbmltYXRpb25zICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGFuaW1hdGlvbnMucHVzaCgganNvbi5hbmltYXRpb25zICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGFuaW1hdGlvbnMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBjbGlwID0gQW5pbWF0aW9uQ2xpcC5wYXJzZUFuaW1hdGlvbiggYW5pbWF0aW9uc1sgaSBdLCBnZW9tZXRyeS5ib25lcyApO1xuXHRcdFx0XHRpZiAoIGNsaXAgKSBvdXRwdXRBbmltYXRpb25zLnB1c2goIGNsaXAgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBwYXJzZSBpbXBsaWNpdCBtb3JwaCBhbmltYXRpb25zXG5cdFx0XHRpZiAoIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHQvLyBUT0RPOiBGaWd1cmUgb3V0IHdoYXQgYW4gYXBwcm9wcmFpdGUgRlBTIGlzIGZvciBtb3JwaCB0YXJnZXQgYW5pbWF0aW9ucyAtLSBkZWZhdWx0aW5nIHRvIDEwLCBidXQgcmVhbGx5IGl0IGlzIGNvbXBsZXRlbHkgYXJiaXRyYXJ5LlxuXHRcdFx0XHR2YXIgbW9ycGhBbmltYXRpb25DbGlwcyA9IEFuaW1hdGlvbkNsaXAuQ3JlYXRlQ2xpcHNGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZXMoIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cywgMTAgKTtcblx0XHRcdFx0b3V0cHV0QW5pbWF0aW9ucyA9IG91dHB1dEFuaW1hdGlvbnMuY29uY2F0KCBtb3JwaEFuaW1hdGlvbkNsaXBzICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBvdXRwdXRBbmltYXRpb25zLmxlbmd0aCA+IDAgKSBnZW9tZXRyeS5hbmltYXRpb25zID0gb3V0cHV0QW5pbWF0aW9ucztcblxuXHRcdH1cblxuXHRcdHJldHVybiBmdW5jdGlvbiBwYXJzZSgganNvbiwgdGV4dHVyZVBhdGggKSB7XG5cblx0XHRcdGlmICgganNvbi5kYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ly8gR2VvbWV0cnkgNC4wIHNwZWNcblx0XHRcdFx0anNvbiA9IGpzb24uZGF0YTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGpzb24uc2NhbGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRqc29uLnNjYWxlID0gMS4wIC8ganNvbi5zY2FsZTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRqc29uLnNjYWxlID0gMS4wO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBnZW9tZXRyeSA9IG5ldyBHZW9tZXRyeSgpO1xuXG5cdFx0XHRwYXJzZU1vZGVsKCBqc29uLCBnZW9tZXRyeSApO1xuXHRcdFx0cGFyc2VTa2luKCBqc29uLCBnZW9tZXRyeSApO1xuXHRcdFx0cGFyc2VNb3JwaGluZygganNvbiwgZ2VvbWV0cnkgKTtcblx0XHRcdHBhcnNlQW5pbWF0aW9ucygganNvbiwgZ2VvbWV0cnkgKTtcblxuXHRcdFx0Z2VvbWV0cnkuY29tcHV0ZUZhY2VOb3JtYWxzKCk7XG5cdFx0XHRnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdFx0aWYgKCBqc29uLm1hdGVyaWFscyA9PT0gdW5kZWZpbmVkIHx8IGpzb24ubWF0ZXJpYWxzLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4geyBnZW9tZXRyeTogZ2VvbWV0cnkgfTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR2YXIgbWF0ZXJpYWxzID0gTG9hZGVyLnByb3RvdHlwZS5pbml0TWF0ZXJpYWxzKCBqc29uLm1hdGVyaWFscywgdGV4dHVyZVBhdGgsIHRoaXMuY3Jvc3NPcmlnaW4gKTtcblxuXHRcdFx0XHRyZXR1cm4geyBnZW9tZXRyeTogZ2VvbWV0cnksIG1hdGVyaWFsczogbWF0ZXJpYWxzIH07XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSApKClcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gT2JqZWN0TG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXHR0aGlzLnRleHR1cmVQYXRoID0gJyc7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggT2JqZWN0TG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHRpZiAoIHRoaXMudGV4dHVyZVBhdGggPT09ICcnICkge1xuXG5cdFx0XHR0aGlzLnRleHR1cmVQYXRoID0gdXJsLnN1YnN0cmluZyggMCwgdXJsLmxhc3RJbmRleE9mKCAnLycgKSArIDEgKTtcblxuXHRcdH1cblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHNjb3BlLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIHRleHQgKSB7XG5cblx0XHRcdHZhciBqc29uID0gbnVsbDtcblxuXHRcdFx0dHJ5IHtcblxuXHRcdFx0XHRqc29uID0gSlNPTi5wYXJzZSggdGV4dCApO1xuXG5cdFx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRcdFx0aWYgKCBvbkVycm9yICE9PSB1bmRlZmluZWQgKSBvbkVycm9yKCBlcnJvciApO1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRTpPYmplY3RMb2FkZXI6IENhblxcJ3QgcGFyc2UgJyArIHVybCArICcuJywgZXJyb3IubWVzc2FnZSApO1xuXG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgbWV0YWRhdGEgPSBqc29uLm1ldGFkYXRhO1xuXG5cdFx0XHRpZiAoIG1ldGFkYXRhID09PSB1bmRlZmluZWQgfHwgbWV0YWRhdGEudHlwZSA9PT0gdW5kZWZpbmVkIHx8IG1ldGFkYXRhLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ2dlb21ldHJ5JyApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBDYW5cXCd0IGxvYWQgJyArIHVybCArICcuIFVzZSBUSFJFRS5KU09OTG9hZGVyIGluc3RlYWQuJyApO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdFx0c2NvcGUucGFyc2UoIGpzb24sIG9uTG9hZCApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdH0sXG5cblx0c2V0VGV4dHVyZVBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnRleHR1cmVQYXRoID0gdmFsdWU7XG5cblx0fSxcblxuXHRzZXRDcm9zc09yaWdpbjogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuY3Jvc3NPcmlnaW4gPSB2YWx1ZTtcblxuXHR9LFxuXG5cdHBhcnNlOiBmdW5jdGlvbiAoIGpzb24sIG9uTG9hZCApIHtcblxuXHRcdHZhciBzaGFwZXMgPSB0aGlzLnBhcnNlU2hhcGUoIGpzb24uc2hhcGVzICk7XG5cdFx0dmFyIGdlb21ldHJpZXMgPSB0aGlzLnBhcnNlR2VvbWV0cmllcygganNvbi5nZW9tZXRyaWVzLCBzaGFwZXMgKTtcblxuXHRcdHZhciBpbWFnZXMgPSB0aGlzLnBhcnNlSW1hZ2VzKCBqc29uLmltYWdlcywgZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRpZiAoIG9uTG9hZCAhPT0gdW5kZWZpbmVkICkgb25Mb2FkKCBvYmplY3QgKTtcblxuXHRcdH0gKTtcblxuXHRcdHZhciB0ZXh0dXJlcyA9IHRoaXMucGFyc2VUZXh0dXJlcygganNvbi50ZXh0dXJlcywgaW1hZ2VzICk7XG5cdFx0dmFyIG1hdGVyaWFscyA9IHRoaXMucGFyc2VNYXRlcmlhbHMoIGpzb24ubWF0ZXJpYWxzLCB0ZXh0dXJlcyApO1xuXG5cdFx0dmFyIG9iamVjdCA9IHRoaXMucGFyc2VPYmplY3QoIGpzb24ub2JqZWN0LCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMgKTtcblxuXHRcdGlmICgganNvbi5hbmltYXRpb25zICkge1xuXG5cdFx0XHRvYmplY3QuYW5pbWF0aW9ucyA9IHRoaXMucGFyc2VBbmltYXRpb25zKCBqc29uLmFuaW1hdGlvbnMgKTtcblxuXHRcdH1cblxuXHRcdGlmICgganNvbi5pbWFnZXMgPT09IHVuZGVmaW5lZCB8fCBqc29uLmltYWdlcy5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdGlmICggb25Mb2FkICE9PSB1bmRlZmluZWQgKSBvbkxvYWQoIG9iamVjdCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9iamVjdDtcblxuXHR9LFxuXG5cdHBhcnNlU2hhcGU6IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdHZhciBzaGFwZXMgPSB7fTtcblxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIHNoYXBlID0gbmV3IFNoYXBlKCkuZnJvbUpTT04oIGpzb25bIGkgXSApO1xuXG5cdFx0XHRcdHNoYXBlc1sgc2hhcGUudXVpZCBdID0gc2hhcGU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBzaGFwZXM7XG5cblx0fSxcblxuXHRwYXJzZUdlb21ldHJpZXM6IGZ1bmN0aW9uICgganNvbiwgc2hhcGVzICkge1xuXG5cdFx0dmFyIGdlb21ldHJpZXMgPSB7fTtcblxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cnlMb2FkZXIgPSBuZXcgSlNPTkxvYWRlcigpO1xuXHRcdFx0dmFyIGJ1ZmZlckdlb21ldHJ5TG9hZGVyID0gbmV3IEJ1ZmZlckdlb21ldHJ5TG9hZGVyKCk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgZ2VvbWV0cnk7XG5cdFx0XHRcdHZhciBkYXRhID0ganNvblsgaSBdO1xuXG5cdFx0XHRcdHN3aXRjaCAoIGRhdGEudHlwZSApIHtcblxuXHRcdFx0XHRcdGNhc2UgJ1BsYW5lR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1BsYW5lQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS53aWR0aCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHQsXG5cdFx0XHRcdFx0XHRcdGRhdGEud2lkdGhTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50c1xuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdCb3hHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnQm94QnVmZmVyR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0N1YmVHZW9tZXRyeSc6IC8vIGJhY2t3YXJkcyBjb21wYXRpYmxlXG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLndpZHRoLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5kZXB0aCxcblx0XHRcdFx0XHRcdFx0ZGF0YS53aWR0aFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmRlcHRoU2VnbWVudHNcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnQ2lyY2xlR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0NpcmNsZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnQ3lsaW5kZXJHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1c1RvcCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXNCb3R0b20sXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGlhbFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLm9wZW5FbmRlZCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YVN0YXJ0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhTGVuZ3RoXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0NvbmVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnQ29uZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpYWxTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5vcGVuRW5kZWQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdTcGhlcmVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnU3BoZXJlQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEud2lkdGhTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5waGlTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5waGlMZW5ndGgsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdEb2RlY2FoZWRyb25HZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0ljb3NhaGVkcm9uR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0ljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ09jdGFoZWRyb25HZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdUZXRyYWhlZHJvbkdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmRldGFpbFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdSaW5nR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1JpbmdCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLmlubmVyUmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLm91dGVyUmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucGhpU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdUb3J1c0dlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdUb3J1c0J1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnR1YmUsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaWFsU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEudHVidWxhclNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmFyY1xuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdUb3J1c0tub3RHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnVG9ydXNLbm90QnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEudHViZSxcblx0XHRcdFx0XHRcdFx0ZGF0YS50dWJ1bGFyU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaWFsU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5xXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0xhdGhlR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0xhdGhlQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5wb2ludHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuc2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucGhpU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEucGhpTGVuZ3RoXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ1BvbHloZWRyb25HZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEudmVydGljZXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaW5kaWNlcyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuZGV0YWlsc1xuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdTaGFwZUdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdTaGFwZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0dmFyIGdlb21ldHJ5U2hhcGVzID0gW107XG5cblx0XHRcdFx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBkYXRhLnNoYXBlcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0XHR2YXIgc2hhcGUgPSBzaGFwZXNbIGRhdGEuc2hhcGVzWyBqIF0gXTtcblxuXHRcdFx0XHRcdFx0XHRnZW9tZXRyeVNoYXBlcy5wdXNoKCBzaGFwZSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRnZW9tZXRyeVNoYXBlcyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5jdXJ2ZVNlZ21lbnRzXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0J1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBidWZmZXJHZW9tZXRyeUxvYWRlci5wYXJzZSggZGF0YSApO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0dlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBnZW9tZXRyeUxvYWRlci5wYXJzZSggZGF0YSwgdGhpcy50ZXh0dXJlUGF0aCApLmdlb21ldHJ5O1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5zdXBwb3J0ZWQgZ2VvbWV0cnkgdHlwZSBcIicgKyBkYXRhLnR5cGUgKyAnXCInICk7XG5cblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRnZW9tZXRyeS51dWlkID0gZGF0YS51dWlkO1xuXG5cdFx0XHRcdGlmICggZGF0YS5uYW1lICE9PSB1bmRlZmluZWQgKSBnZW9tZXRyeS5uYW1lID0gZGF0YS5uYW1lO1xuXG5cdFx0XHRcdGdlb21ldHJpZXNbIGRhdGEudXVpZCBdID0gZ2VvbWV0cnk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBnZW9tZXRyaWVzO1xuXG5cdH0sXG5cblx0cGFyc2VNYXRlcmlhbHM6IGZ1bmN0aW9uICgganNvbiwgdGV4dHVyZXMgKSB7XG5cblx0XHR2YXIgbWF0ZXJpYWxzID0ge307XG5cblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIGxvYWRlciA9IG5ldyBNYXRlcmlhbExvYWRlcigpO1xuXHRcdFx0bG9hZGVyLnNldFRleHR1cmVzKCB0ZXh0dXJlcyApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGRhdGEgPSBqc29uWyBpIF07XG5cblx0XHRcdFx0aWYgKCBkYXRhLnR5cGUgPT09ICdNdWx0aU1hdGVyaWFsJyApIHtcblxuXHRcdFx0XHRcdC8vIERlcHJlY2F0ZWRcblxuXHRcdFx0XHRcdHZhciBhcnJheSA9IFtdO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGogPSAwOyBqIDwgZGF0YS5tYXRlcmlhbHMubGVuZ3RoOyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHRhcnJheS5wdXNoKCBsb2FkZXIucGFyc2UoIGRhdGEubWF0ZXJpYWxzWyBqIF0gKSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0bWF0ZXJpYWxzWyBkYXRhLnV1aWQgXSA9IGFycmF5O1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRtYXRlcmlhbHNbIGRhdGEudXVpZCBdID0gbG9hZGVyLnBhcnNlKCBkYXRhICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF0ZXJpYWxzO1xuXG5cdH0sXG5cblx0cGFyc2VBbmltYXRpb25zOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR2YXIgYW5pbWF0aW9ucyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwganNvbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjbGlwID0gQW5pbWF0aW9uQ2xpcC5wYXJzZSgganNvblsgaSBdICk7XG5cblx0XHRcdGFuaW1hdGlvbnMucHVzaCggY2xpcCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFuaW1hdGlvbnM7XG5cblx0fSxcblxuXHRwYXJzZUltYWdlczogZnVuY3Rpb24gKCBqc29uLCBvbkxvYWQgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXHRcdHZhciBpbWFnZXMgPSB7fTtcblxuXHRcdGZ1bmN0aW9uIGxvYWRJbWFnZSggdXJsICkge1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0XHRcdHJldHVybiBsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0fSwgdW5kZWZpbmVkLCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0XHR9ICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCAmJiBqc29uLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZhciBtYW5hZ2VyID0gbmV3IExvYWRpbmdNYW5hZ2VyKCBvbkxvYWQgKTtcblxuXHRcdFx0dmFyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlciggbWFuYWdlciApO1xuXHRcdFx0bG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgaW1hZ2UgPSBqc29uWyBpIF07XG5cdFx0XHRcdHZhciBwYXRoID0gL14oXFwvXFwvKXwoW2Etel0rOihcXC9cXC8pPykvaS50ZXN0KCBpbWFnZS51cmwgKSA/IGltYWdlLnVybCA6IHNjb3BlLnRleHR1cmVQYXRoICsgaW1hZ2UudXJsO1xuXG5cdFx0XHRcdGltYWdlc1sgaW1hZ2UudXVpZCBdID0gbG9hZEltYWdlKCBwYXRoICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBpbWFnZXM7XG5cblx0fSxcblxuXHRwYXJzZVRleHR1cmVzOiBmdW5jdGlvbiAoIGpzb24sIGltYWdlcyApIHtcblxuXHRcdGZ1bmN0aW9uIHBhcnNlQ29uc3RhbnQoIHZhbHVlLCB0eXBlICkge1xuXG5cdFx0XHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgKSByZXR1cm4gdmFsdWU7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlci5wYXJzZVRleHR1cmU6IENvbnN0YW50IHNob3VsZCBiZSBpbiBudW1lcmljIGZvcm0uJywgdmFsdWUgKTtcblxuXHRcdFx0cmV0dXJuIHR5cGVbIHZhbHVlIF07XG5cblx0XHR9XG5cblx0XHR2YXIgdGV4dHVyZXMgPSB7fTtcblxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGRhdGEgPSBqc29uWyBpIF07XG5cblx0XHRcdFx0aWYgKCBkYXRhLmltYWdlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IE5vIFwiaW1hZ2VcIiBzcGVjaWZpZWQgZm9yJywgZGF0YS51dWlkICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggaW1hZ2VzWyBkYXRhLmltYWdlIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGltYWdlJywgZGF0YS5pbWFnZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgdGV4dHVyZSA9IG5ldyBUZXh0dXJlKCBpbWFnZXNbIGRhdGEuaW1hZ2UgXSApO1xuXHRcdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0XHR0ZXh0dXJlLnV1aWQgPSBkYXRhLnV1aWQ7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm5hbWUgIT09IHVuZGVmaW5lZCApIHRleHR1cmUubmFtZSA9IGRhdGEubmFtZTtcblxuXHRcdFx0XHRpZiAoIGRhdGEubWFwcGluZyAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5tYXBwaW5nID0gcGFyc2VDb25zdGFudCggZGF0YS5tYXBwaW5nLCBURVhUVVJFX01BUFBJTkcgKTtcblxuXHRcdFx0XHRpZiAoIGRhdGEub2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm9mZnNldC5mcm9tQXJyYXkoIGRhdGEub2Zmc2V0ICk7XG5cdFx0XHRcdGlmICggZGF0YS5yZXBlYXQgIT09IHVuZGVmaW5lZCApIHRleHR1cmUucmVwZWF0LmZyb21BcnJheSggZGF0YS5yZXBlYXQgKTtcblx0XHRcdFx0aWYgKCBkYXRhLmNlbnRlciAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5jZW50ZXIuZnJvbUFycmF5KCBkYXRhLmNlbnRlciApO1xuXHRcdFx0XHRpZiAoIGRhdGEucm90YXRpb24gIT09IHVuZGVmaW5lZCApIHRleHR1cmUucm90YXRpb24gPSBkYXRhLnJvdGF0aW9uO1xuXG5cdFx0XHRcdGlmICggZGF0YS53cmFwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLndyYXBTID0gcGFyc2VDb25zdGFudCggZGF0YS53cmFwWyAwIF0sIFRFWFRVUkVfV1JBUFBJTkcgKTtcblx0XHRcdFx0XHR0ZXh0dXJlLndyYXBUID0gcGFyc2VDb25zdGFudCggZGF0YS53cmFwWyAxIF0sIFRFWFRVUkVfV1JBUFBJTkcgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBkYXRhLmZvcm1hdCAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5mb3JtYXQgPSBkYXRhLmZvcm1hdDtcblxuXHRcdFx0XHRpZiAoIGRhdGEubWluRmlsdGVyICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm1pbkZpbHRlciA9IHBhcnNlQ29uc3RhbnQoIGRhdGEubWluRmlsdGVyLCBURVhUVVJFX0ZJTFRFUiApO1xuXHRcdFx0XHRpZiAoIGRhdGEubWFnRmlsdGVyICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm1hZ0ZpbHRlciA9IHBhcnNlQ29uc3RhbnQoIGRhdGEubWFnRmlsdGVyLCBURVhUVVJFX0ZJTFRFUiApO1xuXHRcdFx0XHRpZiAoIGRhdGEuYW5pc290cm9weSAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5hbmlzb3Ryb3B5ID0gZGF0YS5hbmlzb3Ryb3B5O1xuXG5cdFx0XHRcdGlmICggZGF0YS5mbGlwWSAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5mbGlwWSA9IGRhdGEuZmxpcFk7XG5cblx0XHRcdFx0dGV4dHVyZXNbIGRhdGEudXVpZCBdID0gdGV4dHVyZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRleHR1cmVzO1xuXG5cdH0sXG5cblx0cGFyc2VPYmplY3Q6IGZ1bmN0aW9uICggZGF0YSwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzICkge1xuXG5cdFx0dmFyIG9iamVjdDtcblxuXHRcdGZ1bmN0aW9uIGdldEdlb21ldHJ5KCBuYW1lICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJpZXNbIG5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGdlb21ldHJ5JywgbmFtZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBnZW9tZXRyaWVzWyBuYW1lIF07XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXRNYXRlcmlhbCggbmFtZSApIHtcblxuXHRcdFx0aWYgKCBuYW1lID09PSB1bmRlZmluZWQgKSByZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG5hbWUgKSApIHtcblxuXHRcdFx0XHR2YXIgYXJyYXkgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBuYW1lLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgdXVpZCA9IG5hbWVbIGkgXTtcblxuXHRcdFx0XHRcdGlmICggbWF0ZXJpYWxzWyB1dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwnLCB1dWlkICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRhcnJheS5wdXNoKCBtYXRlcmlhbHNbIHV1aWQgXSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gYXJyYXk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBtYXRlcmlhbHNbIG5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsJywgbmFtZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRlcmlhbHNbIG5hbWUgXTtcblxuXHRcdH1cblxuXHRcdHN3aXRjaCAoIGRhdGEudHlwZSApIHtcblxuXHRcdFx0Y2FzZSAnU2NlbmUnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBTY2VuZSgpO1xuXG5cdFx0XHRcdGlmICggZGF0YS5iYWNrZ3JvdW5kICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRpZiAoIE51bWJlci5pc0ludGVnZXIoIGRhdGEuYmFja2dyb3VuZCApICkge1xuXG5cdFx0XHRcdFx0XHRvYmplY3QuYmFja2dyb3VuZCA9IG5ldyBDb2xvciggZGF0YS5iYWNrZ3JvdW5kICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggZGF0YS5mb2cgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGlmICggZGF0YS5mb2cudHlwZSA9PT0gJ0ZvZycgKSB7XG5cblx0XHRcdFx0XHRcdG9iamVjdC5mb2cgPSBuZXcgRm9nKCBkYXRhLmZvZy5jb2xvciwgZGF0YS5mb2cubmVhciwgZGF0YS5mb2cuZmFyICk7XG5cblx0XHRcdFx0XHR9IGVsc2UgaWYgKCBkYXRhLmZvZy50eXBlID09PSAnRm9nRXhwMicgKSB7XG5cblx0XHRcdFx0XHRcdG9iamVjdC5mb2cgPSBuZXcgRm9nRXhwMiggZGF0YS5mb2cuY29sb3IsIGRhdGEuZm9nLmRlbnNpdHkgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1BlcnNwZWN0aXZlQ2FtZXJhJzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGRhdGEuZm92LCBkYXRhLmFzcGVjdCwgZGF0YS5uZWFyLCBkYXRhLmZhciApO1xuXG5cdFx0XHRcdGlmICggZGF0YS5mb2N1cyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZvY3VzID0gZGF0YS5mb2N1cztcblx0XHRcdFx0aWYgKCBkYXRhLnpvb20gIT09IHVuZGVmaW5lZCApIG9iamVjdC56b29tID0gZGF0YS56b29tO1xuXHRcdFx0XHRpZiAoIGRhdGEuZmlsbUdhdWdlICE9PSB1bmRlZmluZWQgKSBvYmplY3QuZmlsbUdhdWdlID0gZGF0YS5maWxtR2F1Z2U7XG5cdFx0XHRcdGlmICggZGF0YS5maWxtT2Zmc2V0ICE9PSB1bmRlZmluZWQgKSBvYmplY3QuZmlsbU9mZnNldCA9IGRhdGEuZmlsbU9mZnNldDtcblx0XHRcdFx0aWYgKCBkYXRhLnZpZXcgIT09IHVuZGVmaW5lZCApIG9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIGRhdGEudmlldyApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdPcnRob2dyYXBoaWNDYW1lcmEnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBPcnRob2dyYXBoaWNDYW1lcmEoIGRhdGEubGVmdCwgZGF0YS5yaWdodCwgZGF0YS50b3AsIGRhdGEuYm90dG9tLCBkYXRhLm5lYXIsIGRhdGEuZmFyICk7XG5cblx0XHRcdFx0aWYgKCBkYXRhLnpvb20gIT09IHVuZGVmaW5lZCApIG9iamVjdC56b29tID0gZGF0YS56b29tO1xuXHRcdFx0XHRpZiAoIGRhdGEudmlldyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnZpZXcgPSBPYmplY3QuYXNzaWduKCB7fSwgZGF0YS52aWV3ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0FtYmllbnRMaWdodCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IEFtYmllbnRMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnRGlyZWN0aW9uYWxMaWdodCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IERpcmVjdGlvbmFsTGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1BvaW50TGlnaHQnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBQb2ludExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSwgZGF0YS5kaXN0YW5jZSwgZGF0YS5kZWNheSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdSZWN0QXJlYUxpZ2h0JzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgUmVjdEFyZWFMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHksIGRhdGEud2lkdGgsIGRhdGEuaGVpZ2h0ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1Nwb3RMaWdodCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IFNwb3RMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHksIGRhdGEuZGlzdGFuY2UsIGRhdGEuYW5nbGUsIGRhdGEucGVudW1icmEsIGRhdGEuZGVjYXkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnSGVtaXNwaGVyZUxpZ2h0JzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgSGVtaXNwaGVyZUxpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmdyb3VuZENvbG9yLCBkYXRhLmludGVuc2l0eSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdTa2lubmVkTWVzaCc6XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyLnBhcnNlT2JqZWN0KCkgZG9lcyBub3Qgc3VwcG9ydCBTa2lubmVkTWVzaCB5ZXQuJyApO1xuXG5cdFx0XHRjYXNlICdNZXNoJzpcblxuXHRcdFx0XHR2YXIgZ2VvbWV0cnkgPSBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApO1xuXHRcdFx0XHR2YXIgbWF0ZXJpYWwgPSBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApO1xuXG5cdFx0XHRcdGlmICggZ2VvbWV0cnkuYm9uZXMgJiYgZ2VvbWV0cnkuYm9uZXMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0XHRcdG9iamVjdCA9IG5ldyBTa2lubmVkTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdG9iamVjdCA9IG5ldyBNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0xPRCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IExPRCgpO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdMaW5lJzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgTGluZSggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSwgZGF0YS5tb2RlICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0xpbmVMb29wJzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgTGluZUxvb3AoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnTGluZVNlZ21lbnRzJzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgTGluZVNlZ21lbnRzKCBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApLCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1BvaW50Q2xvdWQnOlxuXHRcdFx0Y2FzZSAnUG9pbnRzJzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgUG9pbnRzKCBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApLCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1Nwcml0ZSc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IFNwcml0ZSggZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdHcm91cCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IEdyb3VwKCk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IE9iamVjdDNEKCk7XG5cblx0XHR9XG5cblx0XHRvYmplY3QudXVpZCA9IGRhdGEudXVpZDtcblxuXHRcdGlmICggZGF0YS5uYW1lICE9PSB1bmRlZmluZWQgKSBvYmplY3QubmFtZSA9IGRhdGEubmFtZTtcblxuXHRcdGlmICggZGF0YS5tYXRyaXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0b2JqZWN0Lm1hdHJpeC5mcm9tQXJyYXkoIGRhdGEubWF0cml4ICk7XG5cblx0XHRcdGlmICggZGF0YS5tYXRyaXhBdXRvVXBkYXRlICE9PSB1bmRlZmluZWQgKSBvYmplY3QubWF0cml4QXV0b1VwZGF0ZSA9IGRhdGEubWF0cml4QXV0b1VwZGF0ZTtcblx0XHRcdGlmICggb2JqZWN0Lm1hdHJpeEF1dG9VcGRhdGUgKSBvYmplY3QubWF0cml4LmRlY29tcG9zZSggb2JqZWN0LnBvc2l0aW9uLCBvYmplY3QucXVhdGVybmlvbiwgb2JqZWN0LnNjYWxlICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRpZiAoIGRhdGEucG9zaXRpb24gIT09IHVuZGVmaW5lZCApIG9iamVjdC5wb3NpdGlvbi5mcm9tQXJyYXkoIGRhdGEucG9zaXRpb24gKTtcblx0XHRcdGlmICggZGF0YS5yb3RhdGlvbiAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnJvdGF0aW9uLmZyb21BcnJheSggZGF0YS5yb3RhdGlvbiApO1xuXHRcdFx0aWYgKCBkYXRhLnF1YXRlcm5pb24gIT09IHVuZGVmaW5lZCApIG9iamVjdC5xdWF0ZXJuaW9uLmZyb21BcnJheSggZGF0YS5xdWF0ZXJuaW9uICk7XG5cdFx0XHRpZiAoIGRhdGEuc2NhbGUgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zY2FsZS5mcm9tQXJyYXkoIGRhdGEuc2NhbGUgKTtcblxuXHRcdH1cblxuXHRcdGlmICggZGF0YS5jYXN0U2hhZG93ICE9PSB1bmRlZmluZWQgKSBvYmplY3QuY2FzdFNoYWRvdyA9IGRhdGEuY2FzdFNoYWRvdztcblx0XHRpZiAoIGRhdGEucmVjZWl2ZVNoYWRvdyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnJlY2VpdmVTaGFkb3cgPSBkYXRhLnJlY2VpdmVTaGFkb3c7XG5cblx0XHRpZiAoIGRhdGEuc2hhZG93ICkge1xuXG5cdFx0XHRpZiAoIGRhdGEuc2hhZG93LmJpYXMgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zaGFkb3cuYmlhcyA9IGRhdGEuc2hhZG93LmJpYXM7XG5cdFx0XHRpZiAoIGRhdGEuc2hhZG93LnJhZGl1cyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5yYWRpdXMgPSBkYXRhLnNoYWRvdy5yYWRpdXM7XG5cdFx0XHRpZiAoIGRhdGEuc2hhZG93Lm1hcFNpemUgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zaGFkb3cubWFwU2l6ZS5mcm9tQXJyYXkoIGRhdGEuc2hhZG93Lm1hcFNpemUgKTtcblx0XHRcdGlmICggZGF0YS5zaGFkb3cuY2FtZXJhICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93LmNhbWVyYSA9IHRoaXMucGFyc2VPYmplY3QoIGRhdGEuc2hhZG93LmNhbWVyYSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBkYXRhLnZpc2libGUgIT09IHVuZGVmaW5lZCApIG9iamVjdC52aXNpYmxlID0gZGF0YS52aXNpYmxlO1xuXHRcdGlmICggZGF0YS5mcnVzdHVtQ3VsbGVkICE9PSB1bmRlZmluZWQgKSBvYmplY3QuZnJ1c3R1bUN1bGxlZCA9IGRhdGEuZnJ1c3R1bUN1bGxlZDtcblx0XHRpZiAoIGRhdGEucmVuZGVyT3JkZXIgIT09IHVuZGVmaW5lZCApIG9iamVjdC5yZW5kZXJPcmRlciA9IGRhdGEucmVuZGVyT3JkZXI7XG5cdFx0aWYgKCBkYXRhLnVzZXJEYXRhICE9PSB1bmRlZmluZWQgKSBvYmplY3QudXNlckRhdGEgPSBkYXRhLnVzZXJEYXRhO1xuXG5cdFx0aWYgKCBkYXRhLmNoaWxkcmVuICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBjaGlsZHJlbiA9IGRhdGEuY2hpbGRyZW47XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRvYmplY3QuYWRkKCB0aGlzLnBhcnNlT2JqZWN0KCBjaGlsZHJlblsgaSBdLCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMgKSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIGRhdGEudHlwZSA9PT0gJ0xPRCcgKSB7XG5cblx0XHRcdHZhciBsZXZlbHMgPSBkYXRhLmxldmVscztcblxuXHRcdFx0Zm9yICggdmFyIGwgPSAwOyBsIDwgbGV2ZWxzLmxlbmd0aDsgbCArKyApIHtcblxuXHRcdFx0XHR2YXIgbGV2ZWwgPSBsZXZlbHNbIGwgXTtcblx0XHRcdFx0dmFyIGNoaWxkID0gb2JqZWN0LmdldE9iamVjdEJ5UHJvcGVydHkoICd1dWlkJywgbGV2ZWwub2JqZWN0ICk7XG5cblx0XHRcdFx0aWYgKCBjaGlsZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0b2JqZWN0LmFkZExldmVsKCBjaGlsZCwgbGV2ZWwuZGlzdGFuY2UgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBvYmplY3Q7XG5cblx0fVxuXG59ICk7XG5cbnZhciBURVhUVVJFX01BUFBJTkcgPSB7XG5cdFVWTWFwcGluZzogVVZNYXBwaW5nLFxuXHRDdWJlUmVmbGVjdGlvbk1hcHBpbmc6IEN1YmVSZWZsZWN0aW9uTWFwcGluZyxcblx0Q3ViZVJlZnJhY3Rpb25NYXBwaW5nOiBDdWJlUmVmcmFjdGlvbk1hcHBpbmcsXG5cdEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nOiBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyxcblx0RXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6IEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nLFxuXHRTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZzogU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nOiBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZyxcblx0Q3ViZVVWUmVmcmFjdGlvbk1hcHBpbmc6IEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nXG59O1xuXG52YXIgVEVYVFVSRV9XUkFQUElORyA9IHtcblx0UmVwZWF0V3JhcHBpbmc6IFJlcGVhdFdyYXBwaW5nLFxuXHRDbGFtcFRvRWRnZVdyYXBwaW5nOiBDbGFtcFRvRWRnZVdyYXBwaW5nLFxuXHRNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOiBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nXG59O1xuXG52YXIgVEVYVFVSRV9GSUxURVIgPSB7XG5cdE5lYXJlc3RGaWx0ZXI6IE5lYXJlc3RGaWx0ZXIsXG5cdE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyOiBOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlcixcblx0TmVhcmVzdE1pcE1hcExpbmVhckZpbHRlcjogTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlcixcblx0TGluZWFyRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG5cdExpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXI6IExpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXIsXG5cdExpbmVhck1pcE1hcExpbmVhckZpbHRlcjogTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyXG59O1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIG1pbmltYWwgY2xhc3MgZm9yIHByb3hpbmcgZnVuY3Rpb25zIHRvIFBhdGguIFJlcGxhY2VzIG9sZCBcImV4dHJhY3RTdWJwYXRocygpXCJcbiAqKi9cblxuZnVuY3Rpb24gU2hhcGVQYXRoKCkge1xuXG5cdHRoaXMudHlwZSA9ICdTaGFwZVBhdGgnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoKTtcblxuXHR0aGlzLnN1YlBhdGhzID0gW107XG5cdHRoaXMuY3VycmVudFBhdGggPSBudWxsO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFNoYXBlUGF0aC5wcm90b3R5cGUsIHtcblxuXHRtb3ZlVG86IGZ1bmN0aW9uICggeCwgeSApIHtcblxuXHRcdHRoaXMuY3VycmVudFBhdGggPSBuZXcgUGF0aCgpO1xuXHRcdHRoaXMuc3ViUGF0aHMucHVzaCggdGhpcy5jdXJyZW50UGF0aCApO1xuXHRcdHRoaXMuY3VycmVudFBhdGgubW92ZVRvKCB4LCB5ICk7XG5cblx0fSxcblxuXHRsaW5lVG86IGZ1bmN0aW9uICggeCwgeSApIHtcblxuXHRcdHRoaXMuY3VycmVudFBhdGgubGluZVRvKCB4LCB5ICk7XG5cblx0fSxcblxuXHRxdWFkcmF0aWNDdXJ2ZVRvOiBmdW5jdGlvbiAoIGFDUHgsIGFDUHksIGFYLCBhWSApIHtcblxuXHRcdHRoaXMuY3VycmVudFBhdGgucXVhZHJhdGljQ3VydmVUbyggYUNQeCwgYUNQeSwgYVgsIGFZICk7XG5cblx0fSxcblxuXHRiZXppZXJDdXJ2ZVRvOiBmdW5jdGlvbiAoIGFDUDF4LCBhQ1AxeSwgYUNQMngsIGFDUDJ5LCBhWCwgYVkgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQYXRoLmJlemllckN1cnZlVG8oIGFDUDF4LCBhQ1AxeSwgYUNQMngsIGFDUDJ5LCBhWCwgYVkgKTtcblxuXHR9LFxuXG5cdHNwbGluZVRocnU6IGZ1bmN0aW9uICggcHRzICkge1xuXG5cdFx0dGhpcy5jdXJyZW50UGF0aC5zcGxpbmVUaHJ1KCBwdHMgKTtcblxuXHR9LFxuXG5cdHRvU2hhcGVzOiBmdW5jdGlvbiAoIGlzQ0NXLCBub0hvbGVzICkge1xuXG5cdFx0ZnVuY3Rpb24gdG9TaGFwZXNOb0hvbGVzKCBpblN1YnBhdGhzICkge1xuXG5cdFx0XHR2YXIgc2hhcGVzID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGluU3VicGF0aHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgdG1wUGF0aCA9IGluU3VicGF0aHNbIGkgXTtcblxuXHRcdFx0XHR2YXIgdG1wU2hhcGUgPSBuZXcgU2hhcGUoKTtcblx0XHRcdFx0dG1wU2hhcGUuY3VydmVzID0gdG1wUGF0aC5jdXJ2ZXM7XG5cblx0XHRcdFx0c2hhcGVzLnB1c2goIHRtcFNoYXBlICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNoYXBlcztcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGlzUG9pbnRJbnNpZGVQb2x5Z29uKCBpblB0LCBpblBvbHlnb24gKSB7XG5cblx0XHRcdHZhciBwb2x5TGVuID0gaW5Qb2x5Z29uLmxlbmd0aDtcblxuXHRcdFx0Ly8gaW5QdCBvbiBwb2x5Z29uIGNvbnRvdXIgPT4gaW1tZWRpYXRlIHN1Y2Nlc3MgICAgb3Jcblx0XHRcdC8vIHRvZ2dsaW5nIG9mIGluc2lkZS9vdXRzaWRlIGF0IGV2ZXJ5IHNpbmdsZSEgaW50ZXJzZWN0aW9uIHBvaW50IG9mIGFuIGVkZ2Vcblx0XHRcdC8vICB3aXRoIHRoZSBob3Jpem9udGFsIGxpbmUgdGhyb3VnaCBpblB0LCBsZWZ0IG9mIGluUHRcblx0XHRcdC8vICBub3QgY291bnRpbmcgbG93ZXJZIGVuZHBvaW50cyBvZiBlZGdlcyBhbmQgd2hvbGUgZWRnZXMgb24gdGhhdCBsaW5lXG5cdFx0XHR2YXIgaW5zaWRlID0gZmFsc2U7XG5cdFx0XHRmb3IgKCB2YXIgcCA9IHBvbHlMZW4gLSAxLCBxID0gMDsgcSA8IHBvbHlMZW47IHAgPSBxICsrICkge1xuXG5cdFx0XHRcdHZhciBlZGdlTG93UHQgPSBpblBvbHlnb25bIHAgXTtcblx0XHRcdFx0dmFyIGVkZ2VIaWdoUHQgPSBpblBvbHlnb25bIHEgXTtcblxuXHRcdFx0XHR2YXIgZWRnZUR4ID0gZWRnZUhpZ2hQdC54IC0gZWRnZUxvd1B0Lng7XG5cdFx0XHRcdHZhciBlZGdlRHkgPSBlZGdlSGlnaFB0LnkgLSBlZGdlTG93UHQueTtcblxuXHRcdFx0XHRpZiAoIE1hdGguYWJzKCBlZGdlRHkgKSA+IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdFx0Ly8gbm90IHBhcmFsbGVsXG5cdFx0XHRcdFx0aWYgKCBlZGdlRHkgPCAwICkge1xuXG5cdFx0XHRcdFx0XHRlZGdlTG93UHQgPSBpblBvbHlnb25bIHEgXTsgZWRnZUR4ID0gLSBlZGdlRHg7XG5cdFx0XHRcdFx0XHRlZGdlSGlnaFB0ID0gaW5Qb2x5Z29uWyBwIF07IGVkZ2VEeSA9IC0gZWRnZUR5O1xuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggKCBpblB0LnkgPCBlZGdlTG93UHQueSApIHx8ICggaW5QdC55ID4gZWRnZUhpZ2hQdC55ICkgKSBcdFx0Y29udGludWU7XG5cblx0XHRcdFx0XHRpZiAoIGluUHQueSA9PT0gZWRnZUxvd1B0LnkgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggaW5QdC54ID09PSBlZGdlTG93UHQueCApXHRcdHJldHVyblx0dHJ1ZTtcdFx0Ly8gaW5QdCBpcyBvbiBjb250b3VyID9cblx0XHRcdFx0XHRcdC8vIGNvbnRpbnVlO1x0XHRcdFx0Ly8gbm8gaW50ZXJzZWN0aW9uIG9yIGVkZ2VMb3dQdCA9PiBkb2Vzbid0IGNvdW50ICEhIVxuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0dmFyIHBlcnBFZGdlID0gZWRnZUR5ICogKCBpblB0LnggLSBlZGdlTG93UHQueCApIC0gZWRnZUR4ICogKCBpblB0LnkgLSBlZGdlTG93UHQueSApO1xuXHRcdFx0XHRcdFx0aWYgKCBwZXJwRWRnZSA9PT0gMCApXHRcdFx0XHRyZXR1cm5cdHRydWU7XHRcdC8vIGluUHQgaXMgb24gY29udG91ciA/XG5cdFx0XHRcdFx0XHRpZiAoIHBlcnBFZGdlIDwgMCApIFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHRpbnNpZGUgPSAhIGluc2lkZTtcdFx0Ly8gdHJ1ZSBpbnRlcnNlY3Rpb24gbGVmdCBvZiBpblB0XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIHBhcmFsbGVsIG9yIGNvbGxpbmVhclxuXHRcdFx0XHRcdGlmICggaW5QdC55ICE9PSBlZGdlTG93UHQueSApIFx0XHRjb250aW51ZTtcdFx0XHQvLyBwYXJhbGxlbFxuXHRcdFx0XHRcdC8vIGVkZ2UgbGllcyBvbiB0aGUgc2FtZSBob3Jpem9udGFsIGxpbmUgYXMgaW5QdFxuXHRcdFx0XHRcdGlmICggKCAoIGVkZ2VIaWdoUHQueCA8PSBpblB0LnggKSAmJiAoIGluUHQueCA8PSBlZGdlTG93UHQueCApICkgfHxcblx0XHRcdFx0XHRcdCAoICggZWRnZUxvd1B0LnggPD0gaW5QdC54ICkgJiYgKCBpblB0LnggPD0gZWRnZUhpZ2hQdC54ICkgKSApXHRcdHJldHVyblx0dHJ1ZTtcdC8vIGluUHQ6IFBvaW50IG9uIGNvbnRvdXIgIVxuXHRcdFx0XHRcdC8vIGNvbnRpbnVlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm5cdGluc2lkZTtcblxuXHRcdH1cblxuXHRcdHZhciBpc0Nsb2NrV2lzZSA9IFNoYXBlVXRpbHMuaXNDbG9ja1dpc2U7XG5cblx0XHR2YXIgc3ViUGF0aHMgPSB0aGlzLnN1YlBhdGhzO1xuXHRcdGlmICggc3ViUGF0aHMubGVuZ3RoID09PSAwICkgcmV0dXJuIFtdO1xuXG5cdFx0aWYgKCBub0hvbGVzID09PSB0cnVlIClcdHJldHVyblx0dG9TaGFwZXNOb0hvbGVzKCBzdWJQYXRocyApO1xuXG5cblx0XHR2YXIgc29saWQsIHRtcFBhdGgsIHRtcFNoYXBlLCBzaGFwZXMgPSBbXTtcblxuXHRcdGlmICggc3ViUGF0aHMubGVuZ3RoID09PSAxICkge1xuXG5cdFx0XHR0bXBQYXRoID0gc3ViUGF0aHNbIDAgXTtcblx0XHRcdHRtcFNoYXBlID0gbmV3IFNoYXBlKCk7XG5cdFx0XHR0bXBTaGFwZS5jdXJ2ZXMgPSB0bXBQYXRoLmN1cnZlcztcblx0XHRcdHNoYXBlcy5wdXNoKCB0bXBTaGFwZSApO1xuXHRcdFx0cmV0dXJuIHNoYXBlcztcblxuXHRcdH1cblxuXHRcdHZhciBob2xlc0ZpcnN0ID0gISBpc0Nsb2NrV2lzZSggc3ViUGF0aHNbIDAgXS5nZXRQb2ludHMoKSApO1xuXHRcdGhvbGVzRmlyc3QgPSBpc0NDVyA/ICEgaG9sZXNGaXJzdCA6IGhvbGVzRmlyc3Q7XG5cblx0XHQvLyBjb25zb2xlLmxvZyhcIkhvbGVzIGZpcnN0XCIsIGhvbGVzRmlyc3QpO1xuXG5cdFx0dmFyIGJldHRlclNoYXBlSG9sZXMgPSBbXTtcblx0XHR2YXIgbmV3U2hhcGVzID0gW107XG5cdFx0dmFyIG5ld1NoYXBlSG9sZXMgPSBbXTtcblx0XHR2YXIgbWFpbklkeCA9IDA7XG5cdFx0dmFyIHRtcFBvaW50cztcblxuXHRcdG5ld1NoYXBlc1sgbWFpbklkeCBdID0gdW5kZWZpbmVkO1xuXHRcdG5ld1NoYXBlSG9sZXNbIG1haW5JZHggXSA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc3ViUGF0aHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dG1wUGF0aCA9IHN1YlBhdGhzWyBpIF07XG5cdFx0XHR0bXBQb2ludHMgPSB0bXBQYXRoLmdldFBvaW50cygpO1xuXHRcdFx0c29saWQgPSBpc0Nsb2NrV2lzZSggdG1wUG9pbnRzICk7XG5cdFx0XHRzb2xpZCA9IGlzQ0NXID8gISBzb2xpZCA6IHNvbGlkO1xuXG5cdFx0XHRpZiAoIHNvbGlkICkge1xuXG5cdFx0XHRcdGlmICggKCAhIGhvbGVzRmlyc3QgKSAmJiAoIG5ld1NoYXBlc1sgbWFpbklkeCBdICkgKVx0bWFpbklkeCArKztcblxuXHRcdFx0XHRuZXdTaGFwZXNbIG1haW5JZHggXSA9IHsgczogbmV3IFNoYXBlKCksIHA6IHRtcFBvaW50cyB9O1xuXHRcdFx0XHRuZXdTaGFwZXNbIG1haW5JZHggXS5zLmN1cnZlcyA9IHRtcFBhdGguY3VydmVzO1xuXG5cdFx0XHRcdGlmICggaG9sZXNGaXJzdCApXHRtYWluSWR4ICsrO1xuXHRcdFx0XHRuZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0gPSBbXTtcblxuXHRcdFx0XHQvL2NvbnNvbGUubG9nKCdjdycsIGkpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdG5ld1NoYXBlSG9sZXNbIG1haW5JZHggXS5wdXNoKCB7IGg6IHRtcFBhdGgsIHA6IHRtcFBvaW50c1sgMCBdIH0gKTtcblxuXHRcdFx0XHQvL2NvbnNvbGUubG9nKCdjY3cnLCBpKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gb25seSBIb2xlcz8gLT4gcHJvYmFibHkgYWxsIFNoYXBlcyB3aXRoIHdyb25nIG9yaWVudGF0aW9uXG5cdFx0aWYgKCAhIG5ld1NoYXBlc1sgMCBdIClcdHJldHVyblx0dG9TaGFwZXNOb0hvbGVzKCBzdWJQYXRocyApO1xuXG5cblx0XHRpZiAoIG5ld1NoYXBlcy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHR2YXIgYW1iaWd1b3VzID0gZmFsc2U7XG5cdFx0XHR2YXIgdG9DaGFuZ2UgPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIHNJZHggPSAwLCBzTGVuID0gbmV3U2hhcGVzLmxlbmd0aDsgc0lkeCA8IHNMZW47IHNJZHggKysgKSB7XG5cblx0XHRcdFx0YmV0dGVyU2hhcGVIb2xlc1sgc0lkeCBdID0gW107XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggdmFyIHNJZHggPSAwLCBzTGVuID0gbmV3U2hhcGVzLmxlbmd0aDsgc0lkeCA8IHNMZW47IHNJZHggKysgKSB7XG5cblx0XHRcdFx0dmFyIHNobyA9IG5ld1NoYXBlSG9sZXNbIHNJZHggXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaElkeCA9IDA7IGhJZHggPCBzaG8ubGVuZ3RoOyBoSWR4ICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIGhvID0gc2hvWyBoSWR4IF07XG5cdFx0XHRcdFx0dmFyIGhvbGVfdW5hc3NpZ25lZCA9IHRydWU7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgczJJZHggPSAwOyBzMklkeCA8IG5ld1NoYXBlcy5sZW5ndGg7IHMySWR4ICsrICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIGlzUG9pbnRJbnNpZGVQb2x5Z29uKCBoby5wLCBuZXdTaGFwZXNbIHMySWR4IF0ucCApICkge1xuXG5cdFx0XHRcdFx0XHRcdGlmICggc0lkeCAhPT0gczJJZHggKVx0dG9DaGFuZ2UucHVzaCggeyBmcm9tczogc0lkeCwgdG9zOiBzMklkeCwgaG9sZTogaElkeCB9ICk7XG5cdFx0XHRcdFx0XHRcdGlmICggaG9sZV91bmFzc2lnbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0aG9sZV91bmFzc2lnbmVkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0YmV0dGVyU2hhcGVIb2xlc1sgczJJZHggXS5wdXNoKCBobyApO1xuXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRhbWJpZ3VvdXMgPSB0cnVlO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggaG9sZV91bmFzc2lnbmVkICkge1xuXG5cdFx0XHRcdFx0XHRiZXR0ZXJTaGFwZUhvbGVzWyBzSWR4IF0ucHVzaCggaG8gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblx0XHRcdC8vIGNvbnNvbGUubG9nKFwiYW1iaWd1b3VzOiBcIiwgYW1iaWd1b3VzKTtcblx0XHRcdGlmICggdG9DaGFuZ2UubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcInRvIGNoYW5nZTogXCIsIHRvQ2hhbmdlKTtcblx0XHRcdFx0aWYgKCAhIGFtYmlndW91cyApXHRuZXdTaGFwZUhvbGVzID0gYmV0dGVyU2hhcGVIb2xlcztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIHRtcEhvbGVzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IG5ld1NoYXBlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dG1wU2hhcGUgPSBuZXdTaGFwZXNbIGkgXS5zO1xuXHRcdFx0c2hhcGVzLnB1c2goIHRtcFNoYXBlICk7XG5cdFx0XHR0bXBIb2xlcyA9IG5ld1NoYXBlSG9sZXNbIGkgXTtcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IHRtcEhvbGVzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdHRtcFNoYXBlLmhvbGVzLnB1c2goIHRtcEhvbGVzWyBqIF0uaCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvL2NvbnNvbGUubG9nKFwic2hhcGVcIiwgc2hhcGVzKTtcblxuXHRcdHJldHVybiBzaGFwZXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBGb250KCBkYXRhICkge1xuXG5cdHRoaXMudHlwZSA9ICdGb250JztcblxuXHR0aGlzLmRhdGEgPSBkYXRhO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEZvbnQucHJvdG90eXBlLCB7XG5cblx0aXNGb250OiB0cnVlLFxuXG5cdGdlbmVyYXRlU2hhcGVzOiBmdW5jdGlvbiAoIHRleHQsIHNpemUsIGRpdmlzaW9ucyApIHtcblxuXHRcdGlmICggc2l6ZSA9PT0gdW5kZWZpbmVkICkgc2l6ZSA9IDEwMDtcblx0XHRpZiAoIGRpdmlzaW9ucyA9PT0gdW5kZWZpbmVkICkgZGl2aXNpb25zID0gNDtcblxuXHRcdHZhciBzaGFwZXMgPSBbXTtcblx0XHR2YXIgcGF0aHMgPSBjcmVhdGVQYXRocyggdGV4dCwgc2l6ZSwgZGl2aXNpb25zLCB0aGlzLmRhdGEgKTtcblxuXHRcdGZvciAoIHZhciBwID0gMCwgcGwgPSBwYXRocy5sZW5ndGg7IHAgPCBwbDsgcCArKyApIHtcblxuXHRcdFx0QXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoIHNoYXBlcywgcGF0aHNbIHAgXS50b1NoYXBlcygpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gc2hhcGVzO1xuXG5cdH1cblxufSApO1xuXG5mdW5jdGlvbiBjcmVhdGVQYXRocyggdGV4dCwgc2l6ZSwgZGl2aXNpb25zLCBkYXRhICkge1xuXG5cdHZhciBjaGFycyA9IFN0cmluZyggdGV4dCApLnNwbGl0KCAnJyApO1xuXHR2YXIgc2NhbGUgPSBzaXplIC8gZGF0YS5yZXNvbHV0aW9uO1xuXHR2YXIgbGluZV9oZWlnaHQgPSAoIGRhdGEuYm91bmRpbmdCb3gueU1heCAtIGRhdGEuYm91bmRpbmdCb3gueU1pbiArIGRhdGEudW5kZXJsaW5lVGhpY2tuZXNzICkgKiBzY2FsZTtcblxuXHR2YXIgcGF0aHMgPSBbXTtcblxuXHR2YXIgb2Zmc2V0WCA9IDAsIG9mZnNldFkgPSAwO1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdHZhciBjaGFyID0gY2hhcnNbIGkgXTtcblxuXHRcdGlmICggY2hhciA9PT0gJ1xcbicgKSB7XG5cblx0XHRcdG9mZnNldFggPSAwO1xuXHRcdFx0b2Zmc2V0WSAtPSBsaW5lX2hlaWdodDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHZhciByZXQgPSBjcmVhdGVQYXRoKCBjaGFyLCBkaXZpc2lvbnMsIHNjYWxlLCBvZmZzZXRYLCBvZmZzZXRZLCBkYXRhICk7XG5cdFx0XHRvZmZzZXRYICs9IHJldC5vZmZzZXRYO1xuXHRcdFx0cGF0aHMucHVzaCggcmV0LnBhdGggKTtcblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIHBhdGhzO1xuXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBhdGgoIGNoYXIsIGRpdmlzaW9ucywgc2NhbGUsIG9mZnNldFgsIG9mZnNldFksIGRhdGEgKSB7XG5cblx0dmFyIGdseXBoID0gZGF0YS5nbHlwaHNbIGNoYXIgXSB8fCBkYXRhLmdseXBoc1sgJz8nIF07XG5cblx0aWYgKCAhIGdseXBoICkgcmV0dXJuO1xuXG5cdHZhciBwYXRoID0gbmV3IFNoYXBlUGF0aCgpO1xuXG5cdHZhciB4LCB5LCBjcHgsIGNweSwgY3B4MSwgY3B5MSwgY3B4MiwgY3B5MjtcblxuXHRpZiAoIGdseXBoLm8gKSB7XG5cblx0XHR2YXIgb3V0bGluZSA9IGdseXBoLl9jYWNoZWRPdXRsaW5lIHx8ICggZ2x5cGguX2NhY2hlZE91dGxpbmUgPSBnbHlwaC5vLnNwbGl0KCAnICcgKSApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gb3V0bGluZS5sZW5ndGg7IGkgPCBsOyApIHtcblxuXHRcdFx0dmFyIGFjdGlvbiA9IG91dGxpbmVbIGkgKysgXTtcblxuXHRcdFx0c3dpdGNoICggYWN0aW9uICkge1xuXG5cdFx0XHRcdGNhc2UgJ20nOiAvLyBtb3ZlVG9cblxuXHRcdFx0XHRcdHggPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0eSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblxuXHRcdFx0XHRcdHBhdGgubW92ZVRvKCB4LCB5ICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdsJzogLy8gbGluZVRvXG5cblx0XHRcdFx0XHR4ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdHkgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cblx0XHRcdFx0XHRwYXRoLmxpbmVUbyggeCwgeSApO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAncSc6IC8vIHF1YWRyYXRpY0N1cnZlVG9cblxuXHRcdFx0XHRcdGNweCA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0XHRcdFx0XHRjcHkgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cdFx0XHRcdFx0Y3B4MSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0XHRcdFx0XHRjcHkxID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXG5cdFx0XHRcdFx0cGF0aC5xdWFkcmF0aWNDdXJ2ZVRvKCBjcHgxLCBjcHkxLCBjcHgsIGNweSApO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnYic6IC8vIGJlemllckN1cnZlVG9cblxuXHRcdFx0XHRcdGNweCA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0XHRcdFx0XHRjcHkgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cdFx0XHRcdFx0Y3B4MSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0XHRcdFx0XHRjcHkxID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXHRcdFx0XHRcdGNweDIgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0Y3B5MiA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblxuXHRcdFx0XHRcdHBhdGguYmV6aWVyQ3VydmVUbyggY3B4MSwgY3B5MSwgY3B4MiwgY3B5MiwgY3B4LCBjcHkgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiB7IG9mZnNldFg6IGdseXBoLmhhICogc2NhbGUsIHBhdGg6IHBhdGggfTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gRm9udExvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxufVxuXG5PYmplY3QuYXNzaWduKCBGb250TG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7XG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkge1xuXG5cdFx0XHR2YXIganNvbjtcblxuXHRcdFx0dHJ5IHtcblxuXHRcdFx0XHRqc29uID0gSlNPTi5wYXJzZSggdGV4dCApO1xuXG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Gb250TG9hZGVyOiB0eXBlZmFjZS5qcyBzdXBwb3J0IGlzIGJlaW5nIGRlcHJlY2F0ZWQuIFVzZSB0eXBlZmFjZS5qc29uIGluc3RlYWQuJyApO1xuXHRcdFx0XHRqc29uID0gSlNPTi5wYXJzZSggdGV4dC5zdWJzdHJpbmcoIDY1LCB0ZXh0Lmxlbmd0aCAtIDIgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBmb250ID0gc2NvcGUucGFyc2UoIGpzb24gKTtcblxuXHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIGZvbnQgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHR9LFxuXG5cdHBhcnNlOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHRyZXR1cm4gbmV3IEZvbnQoIGpzb24gKTtcblxuXHR9LFxuXG5cdHNldFBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhdGggPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbnZhciBjb250ZXh0O1xuXG52YXIgQXVkaW9Db250ZXh0ID0ge1xuXG5cdGdldENvbnRleHQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggY29udGV4dCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb250ZXh0ID0gbmV3ICggd2luZG93LkF1ZGlvQ29udGV4dCB8fCB3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0ICkoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBjb250ZXh0O1xuXG5cdH0sXG5cblx0c2V0Q29udGV4dDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGNvbnRleHQgPSB2YWx1ZTtcblxuXHR9XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBSZWVjZSBBYXJvbiBMZWNyaXZhaW4gLyBodHRwOi8vcmVlY2Vub3Rlcy5jb20vXG4gKi9cblxuZnVuY3Rpb24gQXVkaW9Mb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQXVkaW9Mb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFJlc3BvbnNlVHlwZSggJ2FycmF5YnVmZmVyJyApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0XHR2YXIgY29udGV4dCA9IEF1ZGlvQ29udGV4dC5nZXRDb250ZXh0KCk7XG5cblx0XHRcdGNvbnRleHQuZGVjb2RlQXVkaW9EYXRhKCBidWZmZXIsIGZ1bmN0aW9uICggYXVkaW9CdWZmZXIgKSB7XG5cblx0XHRcdFx0b25Mb2FkKCBhdWRpb0J1ZmZlciApO1xuXG5cdFx0XHR9ICk7XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTdGVyZW9DYW1lcmEoKSB7XG5cblx0dGhpcy50eXBlID0gJ1N0ZXJlb0NhbWVyYSc7XG5cblx0dGhpcy5hc3BlY3QgPSAxO1xuXG5cdHRoaXMuZXllU2VwID0gMC4wNjQ7XG5cblx0dGhpcy5jYW1lcmFMID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XG5cdHRoaXMuY2FtZXJhTC5sYXllcnMuZW5hYmxlKCAxICk7XG5cdHRoaXMuY2FtZXJhTC5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy5jYW1lcmFSID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XG5cdHRoaXMuY2FtZXJhUi5sYXllcnMuZW5hYmxlKCAyICk7XG5cdHRoaXMuY2FtZXJhUi5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggU3RlcmVvQ2FtZXJhLnByb3RvdHlwZSwge1xuXG5cdHVwZGF0ZTogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW5zdGFuY2UsIGZvY3VzLCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyLCB6b29tLCBleWVTZXA7XG5cblx0XHR2YXIgZXllUmlnaHQgPSBuZXcgTWF0cml4NCgpO1xuXHRcdHZhciBleWVMZWZ0ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoIGNhbWVyYSApIHtcblxuXHRcdFx0dmFyIG5lZWRzVXBkYXRlID0gaW5zdGFuY2UgIT09IHRoaXMgfHwgZm9jdXMgIT09IGNhbWVyYS5mb2N1cyB8fCBmb3YgIT09IGNhbWVyYS5mb3YgfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFzcGVjdCAhPT0gY2FtZXJhLmFzcGVjdCAqIHRoaXMuYXNwZWN0IHx8IG5lYXIgIT09IGNhbWVyYS5uZWFyIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmYXIgIT09IGNhbWVyYS5mYXIgfHwgem9vbSAhPT0gY2FtZXJhLnpvb20gfHwgZXllU2VwICE9PSB0aGlzLmV5ZVNlcDtcblxuXHRcdFx0aWYgKCBuZWVkc1VwZGF0ZSApIHtcblxuXHRcdFx0XHRpbnN0YW5jZSA9IHRoaXM7XG5cdFx0XHRcdGZvY3VzID0gY2FtZXJhLmZvY3VzO1xuXHRcdFx0XHRmb3YgPSBjYW1lcmEuZm92O1xuXHRcdFx0XHRhc3BlY3QgPSBjYW1lcmEuYXNwZWN0ICogdGhpcy5hc3BlY3Q7XG5cdFx0XHRcdG5lYXIgPSBjYW1lcmEubmVhcjtcblx0XHRcdFx0ZmFyID0gY2FtZXJhLmZhcjtcblx0XHRcdFx0em9vbSA9IGNhbWVyYS56b29tO1xuXG5cdFx0XHRcdC8vIE9mZi1heGlzIHN0ZXJlb3Njb3BpYyBlZmZlY3QgYmFzZWQgb25cblx0XHRcdFx0Ly8gaHR0cDovL3BhdWxib3Vya2UubmV0L3N0ZXJlb2dyYXBoaWNzL3N0ZXJlb3JlbmRlci9cblxuXHRcdFx0XHR2YXIgcHJvamVjdGlvbk1hdHJpeCA9IGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmNsb25lKCk7XG5cdFx0XHRcdGV5ZVNlcCA9IHRoaXMuZXllU2VwIC8gMjtcblx0XHRcdFx0dmFyIGV5ZVNlcE9uUHJvamVjdGlvbiA9IGV5ZVNlcCAqIG5lYXIgLyBmb2N1cztcblx0XHRcdFx0dmFyIHltYXggPSAoIG5lYXIgKiBNYXRoLnRhbiggX01hdGguREVHMlJBRCAqIGZvdiAqIDAuNSApICkgLyB6b29tO1xuXHRcdFx0XHR2YXIgeG1pbiwgeG1heDtcblxuXHRcdFx0XHQvLyB0cmFuc2xhdGUgeE9mZnNldFxuXG5cdFx0XHRcdGV5ZUxlZnQuZWxlbWVudHNbIDEyIF0gPSAtIGV5ZVNlcDtcblx0XHRcdFx0ZXllUmlnaHQuZWxlbWVudHNbIDEyIF0gPSBleWVTZXA7XG5cblx0XHRcdFx0Ly8gZm9yIGxlZnQgZXllXG5cblx0XHRcdFx0eG1pbiA9IC0geW1heCAqIGFzcGVjdCArIGV5ZVNlcE9uUHJvamVjdGlvbjtcblx0XHRcdFx0eG1heCA9IHltYXggKiBhc3BlY3QgKyBleWVTZXBPblByb2plY3Rpb247XG5cblx0XHRcdFx0cHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgMCBdID0gMiAqIG5lYXIgLyAoIHhtYXggLSB4bWluICk7XG5cdFx0XHRcdHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDggXSA9ICggeG1heCArIHhtaW4gKSAvICggeG1heCAtIHhtaW4gKTtcblxuXHRcdFx0XHR0aGlzLmNhbWVyYUwucHJvamVjdGlvbk1hdHJpeC5jb3B5KCBwcm9qZWN0aW9uTWF0cml4ICk7XG5cblx0XHRcdFx0Ly8gZm9yIHJpZ2h0IGV5ZVxuXG5cdFx0XHRcdHhtaW4gPSAtIHltYXggKiBhc3BlY3QgLSBleWVTZXBPblByb2plY3Rpb247XG5cdFx0XHRcdHhtYXggPSB5bWF4ICogYXNwZWN0IC0gZXllU2VwT25Qcm9qZWN0aW9uO1xuXG5cdFx0XHRcdHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDAgXSA9IDIgKiBuZWFyIC8gKCB4bWF4IC0geG1pbiApO1xuXHRcdFx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyA4IF0gPSAoIHhtYXggKyB4bWluICkgLyAoIHhtYXggLSB4bWluICk7XG5cblx0XHRcdFx0dGhpcy5jYW1lcmFSLnByb2plY3Rpb25NYXRyaXguY29weSggcHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuY2FtZXJhTC5tYXRyaXhXb3JsZC5jb3B5KCBjYW1lcmEubWF0cml4V29ybGQgKS5tdWx0aXBseSggZXllTGVmdCApO1xuXHRcdFx0dGhpcy5jYW1lcmFSLm1hdHJpeFdvcmxkLmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZCApLm11bHRpcGx5KCBleWVSaWdodCApO1xuXG5cdFx0fTtcblxuXHR9ICkoKVxuXG59ICk7XG5cbi8qKlxuICogQ2FtZXJhIGZvciByZW5kZXJpbmcgY3ViZSBtYXBzXG4gKlx0LSByZW5kZXJzIHNjZW5lIGludG8gYXhpcy1hbGlnbmVkIGN1YmVcbiAqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEN1YmVDYW1lcmEoIG5lYXIsIGZhciwgY3ViZVJlc29sdXRpb24gKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDdWJlQ2FtZXJhJztcblxuXHR2YXIgZm92ID0gOTAsIGFzcGVjdCA9IDE7XG5cblx0dmFyIGNhbWVyYVBYID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdGNhbWVyYVBYLnVwLnNldCggMCwgLSAxLCAwICk7XG5cdGNhbWVyYVBYLmxvb2tBdCggbmV3IFZlY3RvcjMoIDEsIDAsIDAgKSApO1xuXHR0aGlzLmFkZCggY2FtZXJhUFggKTtcblxuXHR2YXIgY2FtZXJhTlggPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcblx0Y2FtZXJhTlgudXAuc2V0KCAwLCAtIDEsIDAgKTtcblx0Y2FtZXJhTlgubG9va0F0KCBuZXcgVmVjdG9yMyggLSAxLCAwLCAwICkgKTtcblx0dGhpcy5hZGQoIGNhbWVyYU5YICk7XG5cblx0dmFyIGNhbWVyYVBZID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdGNhbWVyYVBZLnVwLnNldCggMCwgMCwgMSApO1xuXHRjYW1lcmFQWS5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAxLCAwICkgKTtcblx0dGhpcy5hZGQoIGNhbWVyYVBZICk7XG5cblx0dmFyIGNhbWVyYU5ZID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdGNhbWVyYU5ZLnVwLnNldCggMCwgMCwgLSAxICk7XG5cdGNhbWVyYU5ZLmxvb2tBdCggbmV3IFZlY3RvcjMoIDAsIC0gMSwgMCApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFOWSApO1xuXG5cdHZhciBjYW1lcmFQWiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFQWi51cC5zZXQoIDAsIC0gMSwgMCApO1xuXHRjYW1lcmFQWi5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAwLCAxICkgKTtcblx0dGhpcy5hZGQoIGNhbWVyYVBaICk7XG5cblx0dmFyIGNhbWVyYU5aID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdGNhbWVyYU5aLnVwLnNldCggMCwgLSAxLCAwICk7XG5cdGNhbWVyYU5aLmxvb2tBdCggbmV3IFZlY3RvcjMoIDAsIDAsIC0gMSApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFOWiApO1xuXG5cdHZhciBvcHRpb25zID0geyBmb3JtYXQ6IFJHQkZvcm1hdCwgbWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsIG1pbkZpbHRlcjogTGluZWFyRmlsdGVyIH07XG5cblx0dGhpcy5yZW5kZXJUYXJnZXQgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXRDdWJlKCBjdWJlUmVzb2x1dGlvbiwgY3ViZVJlc29sdXRpb24sIG9wdGlvbnMgKTtcblx0dGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZS5uYW1lID0gXCJDdWJlQ2FtZXJhXCI7XG5cblx0dGhpcy51cGRhdGUgPSBmdW5jdGlvbiAoIHJlbmRlcmVyLCBzY2VuZSApIHtcblxuXHRcdGlmICggdGhpcy5wYXJlbnQgPT09IG51bGwgKSB0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHR2YXIgcmVuZGVyVGFyZ2V0ID0gdGhpcy5yZW5kZXJUYXJnZXQ7XG5cdFx0dmFyIGdlbmVyYXRlTWlwbWFwcyA9IHJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztcblxuXHRcdHJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gMDtcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFQWCwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgPSAxO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5YLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDI7XG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhUFksIHJlbmRlclRhcmdldCApO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gMztcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFOWSwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgPSA0O1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYVBaLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdHJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGdlbmVyYXRlTWlwbWFwcztcblxuXHRcdHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDU7XG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhTlosIHJlbmRlclRhcmdldCApO1xuXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBudWxsICk7XG5cblx0fTtcblxuXHR0aGlzLmNsZWFyID0gZnVuY3Rpb24gKCByZW5kZXJlciwgY29sb3IsIGRlcHRoLCBzdGVuY2lsICkge1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldCA9IHRoaXMucmVuZGVyVGFyZ2V0O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gaTtcblx0XHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRcdHJlbmRlcmVyLmNsZWFyKCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKTtcblxuXHRcdH1cblxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggbnVsbCApO1xuXG5cdH07XG5cbn1cblxuQ3ViZUNhbWVyYS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcbkN1YmVDYW1lcmEucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3ViZUNhbWVyYTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEF1ZGlvTGlzdGVuZXIoKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdBdWRpb0xpc3RlbmVyJztcblxuXHR0aGlzLmNvbnRleHQgPSBBdWRpb0NvbnRleHQuZ2V0Q29udGV4dCgpO1xuXG5cdHRoaXMuZ2FpbiA9IHRoaXMuY29udGV4dC5jcmVhdGVHYWluKCk7XG5cdHRoaXMuZ2Fpbi5jb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTtcblxuXHR0aGlzLmZpbHRlciA9IG51bGw7XG5cbn1cblxuQXVkaW9MaXN0ZW5lci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBBdWRpb0xpc3RlbmVyLFxuXG5cdGdldElucHV0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nYWluO1xuXG5cdH0sXG5cblx0cmVtb3ZlRmlsdGVyOiBmdW5jdGlvbiAoICkge1xuXG5cdFx0aWYgKCB0aGlzLmZpbHRlciAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5nYWluLmRpc2Nvbm5lY3QoIHRoaXMuZmlsdGVyICk7XG5cdFx0XHR0aGlzLmZpbHRlci5kaXNjb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTtcblx0XHRcdHRoaXMuZ2Fpbi5jb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTtcblx0XHRcdHRoaXMuZmlsdGVyID0gbnVsbDtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGdldEZpbHRlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyO1xuXG5cdH0sXG5cblx0c2V0RmlsdGVyOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB0aGlzLmZpbHRlciAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5nYWluLmRpc2Nvbm5lY3QoIHRoaXMuZmlsdGVyICk7XG5cdFx0XHR0aGlzLmZpbHRlci5kaXNjb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuZ2Fpbi5kaXNjb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuZmlsdGVyID0gdmFsdWU7XG5cdFx0dGhpcy5nYWluLmNvbm5lY3QoIHRoaXMuZmlsdGVyICk7XG5cdFx0dGhpcy5maWx0ZXIuY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cblx0fSxcblxuXHRnZXRNYXN0ZXJWb2x1bWU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZTtcblxuXHR9LFxuXG5cdHNldE1hc3RlclZvbHVtZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZSggdmFsdWUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwgMC4wMSApO1xuXG5cdH0sXG5cblx0dXBkYXRlTWF0cml4V29ybGQ6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cdFx0dmFyIHNjYWxlID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBvcmllbnRhdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICkge1xuXG5cdFx0XHRPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxuXHRcdFx0dmFyIGxpc3RlbmVyID0gdGhpcy5jb250ZXh0Lmxpc3RlbmVyO1xuXHRcdFx0dmFyIHVwID0gdGhpcy51cDtcblxuXHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBzY2FsZSApO1xuXG5cdFx0XHRvcmllbnRhdGlvbi5zZXQoIDAsIDAsIC0gMSApLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApO1xuXG5cdFx0XHRpZiAoIGxpc3RlbmVyLnBvc2l0aW9uWCApIHtcblxuXHRcdFx0XHRsaXN0ZW5lci5wb3NpdGlvblguc2V0VmFsdWVBdFRpbWUoIHBvc2l0aW9uLngsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXHRcdFx0XHRsaXN0ZW5lci5wb3NpdGlvblkuc2V0VmFsdWVBdFRpbWUoIHBvc2l0aW9uLnksIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXHRcdFx0XHRsaXN0ZW5lci5wb3NpdGlvblouc2V0VmFsdWVBdFRpbWUoIHBvc2l0aW9uLnosIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXHRcdFx0XHRsaXN0ZW5lci5mb3J3YXJkWC5zZXRWYWx1ZUF0VGltZSggb3JpZW50YXRpb24ueCwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7XG5cdFx0XHRcdGxpc3RlbmVyLmZvcndhcmRZLnNldFZhbHVlQXRUaW1lKCBvcmllbnRhdGlvbi55LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIuZm9yd2FyZFouc2V0VmFsdWVBdFRpbWUoIG9yaWVudGF0aW9uLnosIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXHRcdFx0XHRsaXN0ZW5lci51cFguc2V0VmFsdWVBdFRpbWUoIHVwLngsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXHRcdFx0XHRsaXN0ZW5lci51cFkuc2V0VmFsdWVBdFRpbWUoIHVwLnksIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXHRcdFx0XHRsaXN0ZW5lci51cFouc2V0VmFsdWVBdFRpbWUoIHVwLnosIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGxpc3RlbmVyLnNldFBvc2l0aW9uKCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56ICk7XG5cdFx0XHRcdGxpc3RlbmVyLnNldE9yaWVudGF0aW9uKCBvcmllbnRhdGlvbi54LCBvcmllbnRhdGlvbi55LCBvcmllbnRhdGlvbi56LCB1cC54LCB1cC55LCB1cC56ICk7XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSApKClcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIFJlZWNlIEFhcm9uIExlY3JpdmFpbiAvIGh0dHA6Ly9yZWVjZW5vdGVzLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBBdWRpbyggbGlzdGVuZXIgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdBdWRpbyc7XG5cblx0dGhpcy5jb250ZXh0ID0gbGlzdGVuZXIuY29udGV4dDtcblxuXHR0aGlzLmdhaW4gPSB0aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpO1xuXHR0aGlzLmdhaW4uY29ubmVjdCggbGlzdGVuZXIuZ2V0SW5wdXQoKSApO1xuXG5cdHRoaXMuYXV0b3BsYXkgPSBmYWxzZTtcblxuXHR0aGlzLmJ1ZmZlciA9IG51bGw7XG5cdHRoaXMubG9vcCA9IGZhbHNlO1xuXHR0aGlzLnN0YXJ0VGltZSA9IDA7XG5cdHRoaXMub2Zmc2V0ID0gMDtcblx0dGhpcy5wbGF5YmFja1JhdGUgPSAxO1xuXHR0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuXHR0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9IHRydWU7XG5cdHRoaXMuc291cmNlVHlwZSA9ICdlbXB0eSc7XG5cblx0dGhpcy5maWx0ZXJzID0gW107XG5cbn1cblxuQXVkaW8ucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQXVkaW8sXG5cblx0Z2V0T3V0cHV0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nYWluO1xuXG5cdH0sXG5cblx0c2V0Tm9kZVNvdXJjZTogZnVuY3Rpb24gKCBhdWRpb05vZGUgKSB7XG5cblx0XHR0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9IGZhbHNlO1xuXHRcdHRoaXMuc291cmNlVHlwZSA9ICdhdWRpb05vZGUnO1xuXHRcdHRoaXMuc291cmNlID0gYXVkaW9Ob2RlO1xuXHRcdHRoaXMuY29ubmVjdCgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRCdWZmZXI6IGZ1bmN0aW9uICggYXVkaW9CdWZmZXIgKSB7XG5cblx0XHR0aGlzLmJ1ZmZlciA9IGF1ZGlvQnVmZmVyO1xuXHRcdHRoaXMuc291cmNlVHlwZSA9ICdidWZmZXInO1xuXG5cdFx0aWYgKCB0aGlzLmF1dG9wbGF5ICkgdGhpcy5wbGF5KCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHBsYXk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiBBdWRpbyBpcyBhbHJlYWR5IHBsYXlpbmcuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBzb3VyY2UgPSB0aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyU291cmNlKCk7XG5cblx0XHRzb3VyY2UuYnVmZmVyID0gdGhpcy5idWZmZXI7XG5cdFx0c291cmNlLmxvb3AgPSB0aGlzLmxvb3A7XG5cdFx0c291cmNlLm9uZW5kZWQgPSB0aGlzLm9uRW5kZWQuYmluZCggdGhpcyApO1xuXHRcdHNvdXJjZS5wbGF5YmFja1JhdGUuc2V0VmFsdWVBdFRpbWUoIHRoaXMucGxheWJhY2tSYXRlLCB0aGlzLnN0YXJ0VGltZSApO1xuXHRcdHRoaXMuc3RhcnRUaW1lID0gdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lO1xuXHRcdHNvdXJjZS5zdGFydCggdGhpcy5zdGFydFRpbWUsIHRoaXMub2Zmc2V0ICk7XG5cblx0XHR0aGlzLmlzUGxheWluZyA9IHRydWU7XG5cblx0XHR0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblxuXHRcdHJldHVybiB0aGlzLmNvbm5lY3QoKTtcblxuXHR9LFxuXG5cdHBhdXNlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0dGhpcy5zb3VyY2Uuc3RvcCgpO1xuXHRcdFx0dGhpcy5vZmZzZXQgKz0gKCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgLSB0aGlzLnN0YXJ0VGltZSApICogdGhpcy5wbGF5YmFja1JhdGU7XG5cdFx0XHR0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdG9wOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5zb3VyY2Uuc3RvcCgpO1xuXHRcdHRoaXMub2Zmc2V0ID0gMDtcblx0XHR0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb25uZWN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuZmlsdGVycy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR0aGlzLnNvdXJjZS5jb25uZWN0KCB0aGlzLmZpbHRlcnNbIDAgXSApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDEsIGwgPSB0aGlzLmZpbHRlcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR0aGlzLmZpbHRlcnNbIGkgLSAxIF0uY29ubmVjdCggdGhpcy5maWx0ZXJzWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmZpbHRlcnNbIHRoaXMuZmlsdGVycy5sZW5ndGggLSAxIF0uY29ubmVjdCggdGhpcy5nZXRPdXRwdXQoKSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UuY29ubmVjdCggdGhpcy5nZXRPdXRwdXQoKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXNjb25uZWN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuZmlsdGVycy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR0aGlzLnNvdXJjZS5kaXNjb25uZWN0KCB0aGlzLmZpbHRlcnNbIDAgXSApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDEsIGwgPSB0aGlzLmZpbHRlcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR0aGlzLmZpbHRlcnNbIGkgLSAxIF0uZGlzY29ubmVjdCggdGhpcy5maWx0ZXJzWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmZpbHRlcnNbIHRoaXMuZmlsdGVycy5sZW5ndGggLSAxIF0uZGlzY29ubmVjdCggdGhpcy5nZXRPdXRwdXQoKSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UuZGlzY29ubmVjdCggdGhpcy5nZXRPdXRwdXQoKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRGaWx0ZXJzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5maWx0ZXJzO1xuXG5cdH0sXG5cblx0c2V0RmlsdGVyczogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggISB2YWx1ZSApIHZhbHVlID0gW107XG5cblx0XHRpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkge1xuXG5cdFx0XHR0aGlzLmRpc2Nvbm5lY3QoKTtcblx0XHRcdHRoaXMuZmlsdGVycyA9IHZhbHVlO1xuXHRcdFx0dGhpcy5jb25uZWN0KCk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmZpbHRlcnMgPSB2YWx1ZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0RmlsdGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nZXRGaWx0ZXJzKClbIDAgXTtcblxuXHR9LFxuXG5cdHNldEZpbHRlcjogZnVuY3Rpb24gKCBmaWx0ZXIgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXRGaWx0ZXJzKCBmaWx0ZXIgPyBbIGZpbHRlciBdIDogW10gKTtcblxuXHR9LFxuXG5cdHNldFBsYXliYWNrUmF0ZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR0aGlzLnBsYXliYWNrUmF0ZSA9IHZhbHVlO1xuXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UucGxheWJhY2tSYXRlLnNldFZhbHVlQXRUaW1lKCB0aGlzLnBsYXliYWNrUmF0ZSwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFBsYXliYWNrUmF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGxheWJhY2tSYXRlO1xuXG5cdH0sXG5cblx0b25FbmRlZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcblxuXHR9LFxuXG5cdGdldExvb3A6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5sb29wO1xuXG5cdH0sXG5cblx0c2V0TG9vcDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR0aGlzLmxvb3AgPSB2YWx1ZTtcblxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdHRoaXMuc291cmNlLmxvb3AgPSB0aGlzLmxvb3A7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFZvbHVtZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnZhbHVlO1xuXG5cdH0sXG5cblx0c2V0Vm9sdW1lOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5nYWluLmdhaW4uc2V0VGFyZ2V0QXRUaW1lKCB2YWx1ZSwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLCAwLjAxICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFBvc2l0aW9uYWxBdWRpbyggbGlzdGVuZXIgKSB7XG5cblx0QXVkaW8uY2FsbCggdGhpcywgbGlzdGVuZXIgKTtcblxuXHR0aGlzLnBhbm5lciA9IHRoaXMuY29udGV4dC5jcmVhdGVQYW5uZXIoKTtcblx0dGhpcy5wYW5uZXIuY29ubmVjdCggdGhpcy5nYWluICk7XG5cbn1cblxuUG9zaXRpb25hbEF1ZGlvLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEF1ZGlvLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFBvc2l0aW9uYWxBdWRpbyxcblxuXHRnZXRPdXRwdXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnBhbm5lcjtcblxuXHR9LFxuXG5cdGdldFJlZkRpc3RhbmNlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5wYW5uZXIucmVmRGlzdGFuY2U7XG5cblx0fSxcblxuXHRzZXRSZWZEaXN0YW5jZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGFubmVyLnJlZkRpc3RhbmNlID0gdmFsdWU7XG5cblx0fSxcblxuXHRnZXRSb2xsb2ZmRmFjdG9yOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5wYW5uZXIucm9sbG9mZkZhY3RvcjtcblxuXHR9LFxuXG5cdHNldFJvbGxvZmZGYWN0b3I6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhbm5lci5yb2xsb2ZmRmFjdG9yID0gdmFsdWU7XG5cblx0fSxcblxuXHRnZXREaXN0YW5jZU1vZGVsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbDtcblxuXHR9LFxuXG5cdHNldERpc3RhbmNlTW9kZWw6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsID0gdmFsdWU7XG5cblx0fSxcblxuXHRnZXRNYXhEaXN0YW5jZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLm1heERpc3RhbmNlO1xuXG5cdH0sXG5cblx0c2V0TWF4RGlzdGFuY2U6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhbm5lci5tYXhEaXN0YW5jZSA9IHZhbHVlO1xuXG5cdH0sXG5cblx0dXBkYXRlTWF0cml4V29ybGQ6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB1cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKSB7XG5cblx0XHRcdE9iamVjdDNELnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3JjZSApO1xuXG5cdFx0XHRwb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHRcdFx0dGhpcy5wYW5uZXIuc2V0UG9zaXRpb24oIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnogKTtcblxuXHRcdH07XG5cblx0fSApKClcblxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBBdWRpb0FuYWx5c2VyKCBhdWRpbywgZmZ0U2l6ZSApIHtcblxuXHR0aGlzLmFuYWx5c2VyID0gYXVkaW8uY29udGV4dC5jcmVhdGVBbmFseXNlcigpO1xuXHR0aGlzLmFuYWx5c2VyLmZmdFNpemUgPSBmZnRTaXplICE9PSB1bmRlZmluZWQgPyBmZnRTaXplIDogMjA0ODtcblxuXHR0aGlzLmRhdGEgPSBuZXcgVWludDhBcnJheSggdGhpcy5hbmFseXNlci5mcmVxdWVuY3lCaW5Db3VudCApO1xuXG5cdGF1ZGlvLmdldE91dHB1dCgpLmNvbm5lY3QoIHRoaXMuYW5hbHlzZXIgKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBBdWRpb0FuYWx5c2VyLnByb3RvdHlwZSwge1xuXG5cdGdldEZyZXF1ZW5jeURhdGE6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuYW5hbHlzZXIuZ2V0Qnl0ZUZyZXF1ZW5jeURhdGEoIHRoaXMuZGF0YSApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZGF0YTtcblxuXHR9LFxuXG5cdGdldEF2ZXJhZ2VGcmVxdWVuY3k6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2YWx1ZSA9IDAsIGRhdGEgPSB0aGlzLmdldEZyZXF1ZW5jeURhdGEoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YWx1ZSArPSBkYXRhWyBpIF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsdWUgLyBkYXRhLmxlbmd0aDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKlxuICogQnVmZmVyZWQgc2NlbmUgZ3JhcGggcHJvcGVydHkgdGhhdCBhbGxvd3Mgd2VpZ2h0ZWQgYWNjdW11bGF0aW9uLlxuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gUHJvcGVydHlNaXhlciggYmluZGluZywgdHlwZU5hbWUsIHZhbHVlU2l6ZSApIHtcblxuXHR0aGlzLmJpbmRpbmcgPSBiaW5kaW5nO1xuXHR0aGlzLnZhbHVlU2l6ZSA9IHZhbHVlU2l6ZTtcblxuXHR2YXIgYnVmZmVyVHlwZSA9IEZsb2F0NjRBcnJheSxcblx0XHRtaXhGdW5jdGlvbjtcblxuXHRzd2l0Y2ggKCB0eXBlTmFtZSApIHtcblxuXHRcdGNhc2UgJ3F1YXRlcm5pb24nOlxuXHRcdFx0bWl4RnVuY3Rpb24gPSB0aGlzLl9zbGVycDtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAnc3RyaW5nJzpcblx0XHRjYXNlICdib29sJzpcblx0XHRcdGJ1ZmZlclR5cGUgPSBBcnJheTtcblx0XHRcdG1peEZ1bmN0aW9uID0gdGhpcy5fc2VsZWN0O1xuXHRcdFx0YnJlYWs7XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0bWl4RnVuY3Rpb24gPSB0aGlzLl9sZXJwO1xuXG5cdH1cblxuXHR0aGlzLmJ1ZmZlciA9IG5ldyBidWZmZXJUeXBlKCB2YWx1ZVNpemUgKiA0ICk7XG5cdC8vIGxheW91dDogWyBpbmNvbWluZyB8IGFjY3UwIHwgYWNjdTEgfCBvcmlnIF1cblx0Ly9cblx0Ly8gaW50ZXJwb2xhdG9ycyBjYW4gdXNlIC5idWZmZXIgYXMgdGhlaXIgLnJlc3VsdFxuXHQvLyB0aGUgZGF0YSB0aGVuIGdvZXMgdG8gJ2luY29taW5nJ1xuXHQvL1xuXHQvLyAnYWNjdTAnIGFuZCAnYWNjdTEnIGFyZSB1c2VkIGZyYW1lLWludGVybGVhdmVkIGZvclxuXHQvLyB0aGUgY3VtdWxhdGl2ZSByZXN1bHQgYW5kIGFyZSBjb21wYXJlZCB0byBkZXRlY3Rcblx0Ly8gY2hhbmdlc1xuXHQvL1xuXHQvLyAnb3JpZycgc3RvcmVzIHRoZSBvcmlnaW5hbCBzdGF0ZSBvZiB0aGUgcHJvcGVydHlcblxuXHR0aGlzLl9taXhCdWZmZXJSZWdpb24gPSBtaXhGdW5jdGlvbjtcblxuXHR0aGlzLmN1bXVsYXRpdmVXZWlnaHQgPSAwO1xuXG5cdHRoaXMudXNlQ291bnQgPSAwO1xuXHR0aGlzLnJlZmVyZW5jZUNvdW50ID0gMDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBQcm9wZXJ0eU1peGVyLnByb3RvdHlwZSwge1xuXG5cdC8vIGFjY3VtdWxhdGUgZGF0YSBpbiB0aGUgJ2luY29taW5nJyByZWdpb24gaW50byAnYWNjdTxpPidcblx0YWNjdW11bGF0ZTogZnVuY3Rpb24gKCBhY2N1SW5kZXgsIHdlaWdodCApIHtcblxuXHRcdC8vIG5vdGU6IGhhcHBpbHkgYWNjdW11bGF0aW5nIG5vdGhpbmcgd2hlbiB3ZWlnaHQgPSAwLCB0aGUgY2FsbGVyIGtub3dzXG5cdFx0Ly8gdGhlIHdlaWdodCBhbmQgc2hvdWxkbid0IGhhdmUgbWFkZSB0aGUgY2FsbCBpbiB0aGUgZmlyc3QgcGxhY2VcblxuXHRcdHZhciBidWZmZXIgPSB0aGlzLmJ1ZmZlcixcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxuXHRcdFx0b2Zmc2V0ID0gYWNjdUluZGV4ICogc3RyaWRlICsgc3RyaWRlLFxuXG5cdFx0XHRjdXJyZW50V2VpZ2h0ID0gdGhpcy5jdW11bGF0aXZlV2VpZ2h0O1xuXG5cdFx0aWYgKCBjdXJyZW50V2VpZ2h0ID09PSAwICkge1xuXG5cdFx0XHQvLyBhY2N1TiA6PSBpbmNvbWluZyAqIHdlaWdodFxuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcblxuXHRcdFx0XHRidWZmZXJbIG9mZnNldCArIGkgXSA9IGJ1ZmZlclsgaSBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGN1cnJlbnRXZWlnaHQgPSB3ZWlnaHQ7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBhY2N1TiA6PSBhY2N1TiArIGluY29taW5nICogd2VpZ2h0XG5cblx0XHRcdGN1cnJlbnRXZWlnaHQgKz0gd2VpZ2h0O1xuXHRcdFx0dmFyIG1peCA9IHdlaWdodCAvIGN1cnJlbnRXZWlnaHQ7XG5cdFx0XHR0aGlzLl9taXhCdWZmZXJSZWdpb24oIGJ1ZmZlciwgb2Zmc2V0LCAwLCBtaXgsIHN0cmlkZSApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gY3VycmVudFdlaWdodDtcblxuXHR9LFxuXG5cdC8vIGFwcGx5IHRoZSBzdGF0ZSBvZiAnYWNjdTxpPicgdG8gdGhlIGJpbmRpbmcgd2hlbiBhY2N1cyBkaWZmZXJcblx0YXBwbHk6IGZ1bmN0aW9uICggYWNjdUluZGV4ICkge1xuXG5cdFx0dmFyIHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxuXHRcdFx0YnVmZmVyID0gdGhpcy5idWZmZXIsXG5cdFx0XHRvZmZzZXQgPSBhY2N1SW5kZXggKiBzdHJpZGUgKyBzdHJpZGUsXG5cblx0XHRcdHdlaWdodCA9IHRoaXMuY3VtdWxhdGl2ZVdlaWdodCxcblxuXHRcdFx0YmluZGluZyA9IHRoaXMuYmluZGluZztcblxuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IDA7XG5cblx0XHRpZiAoIHdlaWdodCA8IDEgKSB7XG5cblx0XHRcdC8vIGFjY3VOIDo9IGFjY3VOICsgb3JpZ2luYWwgKiAoIDEgLSBjdW11bGF0aXZlV2VpZ2h0IClcblxuXHRcdFx0dmFyIG9yaWdpbmFsVmFsdWVPZmZzZXQgPSBzdHJpZGUgKiAzO1xuXG5cdFx0XHR0aGlzLl9taXhCdWZmZXJSZWdpb24oXG5cdFx0XHRcdGJ1ZmZlciwgb2Zmc2V0LCBvcmlnaW5hbFZhbHVlT2Zmc2V0LCAxIC0gd2VpZ2h0LCBzdHJpZGUgKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBpID0gc3RyaWRlLCBlID0gc3RyaWRlICsgc3RyaWRlOyBpICE9PSBlOyArKyBpICkge1xuXG5cdFx0XHRpZiAoIGJ1ZmZlclsgaSBdICE9PSBidWZmZXJbIGkgKyBzdHJpZGUgXSApIHtcblxuXHRcdFx0XHQvLyB2YWx1ZSBoYXMgY2hhbmdlZCAtPiB1cGRhdGUgc2NlbmUgZ3JhcGhcblxuXHRcdFx0XHRiaW5kaW5nLnNldFZhbHVlKCBidWZmZXIsIG9mZnNldCApO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0Ly8gcmVtZW1iZXIgdGhlIHN0YXRlIG9mIHRoZSBib3VuZCBwcm9wZXJ0eSBhbmQgY29weSBpdCB0byBib3RoIGFjY3VzXG5cdHNhdmVPcmlnaW5hbFN0YXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYmluZGluZyA9IHRoaXMuYmluZGluZztcblxuXHRcdHZhciBidWZmZXIgPSB0aGlzLmJ1ZmZlcixcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxuXG5cdFx0XHRvcmlnaW5hbFZhbHVlT2Zmc2V0ID0gc3RyaWRlICogMztcblxuXHRcdGJpbmRpbmcuZ2V0VmFsdWUoIGJ1ZmZlciwgb3JpZ2luYWxWYWx1ZU9mZnNldCApO1xuXG5cdFx0Ly8gYWNjdVswLi4xXSA6PSBvcmlnIC0tIGluaXRpYWxseSBkZXRlY3QgY2hhbmdlcyBhZ2FpbnN0IHRoZSBvcmlnaW5hbFxuXHRcdGZvciAoIHZhciBpID0gc3RyaWRlLCBlID0gb3JpZ2luYWxWYWx1ZU9mZnNldDsgaSAhPT0gZTsgKysgaSApIHtcblxuXHRcdFx0YnVmZmVyWyBpIF0gPSBidWZmZXJbIG9yaWdpbmFsVmFsdWVPZmZzZXQgKyAoIGkgJSBzdHJpZGUgKSBdO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gMDtcblxuXHR9LFxuXG5cdC8vIGFwcGx5IHRoZSBzdGF0ZSBwcmV2aW91c2x5IHRha2VuIHZpYSAnc2F2ZU9yaWdpbmFsU3RhdGUnIHRvIHRoZSBiaW5kaW5nXG5cdHJlc3RvcmVPcmlnaW5hbFN0YXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb3JpZ2luYWxWYWx1ZU9mZnNldCA9IHRoaXMudmFsdWVTaXplICogMztcblx0XHR0aGlzLmJpbmRpbmcuc2V0VmFsdWUoIHRoaXMuYnVmZmVyLCBvcmlnaW5hbFZhbHVlT2Zmc2V0ICk7XG5cblx0fSxcblxuXG5cdC8vIG1peCBmdW5jdGlvbnNcblxuXHRfc2VsZWN0OiBmdW5jdGlvbiAoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBzcmNPZmZzZXQsIHQsIHN0cmlkZSApIHtcblxuXHRcdGlmICggdCA+PSAwLjUgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHRcdGJ1ZmZlclsgZHN0T2Zmc2V0ICsgaSBdID0gYnVmZmVyWyBzcmNPZmZzZXQgKyBpIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdF9zbGVycDogZnVuY3Rpb24gKCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0ICkge1xuXG5cdFx0UXVhdGVybmlvbi5zbGVycEZsYXQoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBidWZmZXIsIGRzdE9mZnNldCwgYnVmZmVyLCBzcmNPZmZzZXQsIHQgKTtcblxuXHR9LFxuXG5cdF9sZXJwOiBmdW5jdGlvbiAoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBzcmNPZmZzZXQsIHQsIHN0cmlkZSApIHtcblxuXHRcdHZhciBzID0gMSAtIHQ7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcblxuXHRcdFx0dmFyIGogPSBkc3RPZmZzZXQgKyBpO1xuXG5cdFx0XHRidWZmZXJbIGogXSA9IGJ1ZmZlclsgaiBdICogcyArIGJ1ZmZlclsgc3JjT2Zmc2V0ICsgaSBdICogdDtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSByZWZlcmVuY2UgdG8gYSByZWFsIHByb3BlcnR5IGluIHRoZSBzY2VuZSBncmFwaC5cbiAqXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbi8vIENoYXJhY3RlcnMgW10uOi8gYXJlIHJlc2VydmVkIGZvciB0cmFjayBiaW5kaW5nIHN5bnRheC5cbnZhciBSRVNFUlZFRF9DSEFSU19SRSA9ICdcXFxcW1xcXFxdXFxcXC46XFxcXC8nO1xuXG5mdW5jdGlvbiBDb21wb3NpdGUoIHRhcmdldEdyb3VwLCBwYXRoLCBvcHRpb25hbFBhcnNlZFBhdGggKSB7XG5cblx0dmFyIHBhcnNlZFBhdGggPSBvcHRpb25hbFBhcnNlZFBhdGggfHwgUHJvcGVydHlCaW5kaW5nLnBhcnNlVHJhY2tOYW1lKCBwYXRoICk7XG5cblx0dGhpcy5fdGFyZ2V0R3JvdXAgPSB0YXJnZXRHcm91cDtcblx0dGhpcy5fYmluZGluZ3MgPSB0YXJnZXRHcm91cC5zdWJzY3JpYmVfKCBwYXRoLCBwYXJzZWRQYXRoICk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQ29tcG9zaXRlLnByb3RvdHlwZSwge1xuXG5cdGdldFZhbHVlOiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmJpbmQoKTsgLy8gYmluZCBhbGwgYmluZGluZ1xuXG5cdFx0dmFyIGZpcnN0VmFsaWRJbmRleCA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdGJpbmRpbmcgPSB0aGlzLl9iaW5kaW5nc1sgZmlyc3RWYWxpZEluZGV4IF07XG5cblx0XHQvLyBhbmQgb25seSBjYWxsIC5nZXRWYWx1ZSBvbiB0aGUgZmlyc3Rcblx0XHRpZiAoIGJpbmRpbmcgIT09IHVuZGVmaW5lZCApIGJpbmRpbmcuZ2V0VmFsdWUoIGFycmF5LCBvZmZzZXQgKTtcblxuXHR9LFxuXG5cdHNldFZhbHVlOiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGZvciAoIHZhciBpID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0XHQgIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0uc2V0VmFsdWUoIGFycmF5LCBvZmZzZXQgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGJpbmQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sXG5cdFx0XHRcdCAgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0YmluZGluZ3NbIGkgXS5iaW5kKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR1bmJpbmQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sXG5cdFx0XHRcdCAgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0YmluZGluZ3NbIGkgXS51bmJpbmQoKTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuXG5mdW5jdGlvbiBQcm9wZXJ0eUJpbmRpbmcoIHJvb3ROb2RlLCBwYXRoLCBwYXJzZWRQYXRoICkge1xuXG5cdHRoaXMucGF0aCA9IHBhdGg7XG5cdHRoaXMucGFyc2VkUGF0aCA9IHBhcnNlZFBhdGggfHwgUHJvcGVydHlCaW5kaW5nLnBhcnNlVHJhY2tOYW1lKCBwYXRoICk7XG5cblx0dGhpcy5ub2RlID0gUHJvcGVydHlCaW5kaW5nLmZpbmROb2RlKCByb290Tm9kZSwgdGhpcy5wYXJzZWRQYXRoLm5vZGVOYW1lICkgfHwgcm9vdE5vZGU7XG5cblx0dGhpcy5yb290Tm9kZSA9IHJvb3ROb2RlO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFByb3BlcnR5QmluZGluZywge1xuXG5cdENvbXBvc2l0ZTogQ29tcG9zaXRlLFxuXG5cdGNyZWF0ZTogZnVuY3Rpb24gKCByb290LCBwYXRoLCBwYXJzZWRQYXRoICkge1xuXG5cdFx0aWYgKCAhICggcm9vdCAmJiByb290LmlzQW5pbWF0aW9uT2JqZWN0R3JvdXAgKSApIHtcblxuXHRcdFx0cmV0dXJuIG5ldyBQcm9wZXJ0eUJpbmRpbmcoIHJvb3QsIHBhdGgsIHBhcnNlZFBhdGggKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJldHVybiBuZXcgUHJvcGVydHlCaW5kaW5nLkNvbXBvc2l0ZSggcm9vdCwgcGF0aCwgcGFyc2VkUGF0aCApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlcGxhY2VzIHNwYWNlcyB3aXRoIHVuZGVyc2NvcmVzIGFuZCByZW1vdmVzIHVuc3VwcG9ydGVkIGNoYXJhY3RlcnMgZnJvbVxuXHQgKiBub2RlIG5hbWVzLCB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoIHBhcnNlVHJhY2tOYW1lKCkuXG5cdCAqXG5cdCAqIEBwYXJhbSAge3N0cmluZ30gbmFtZSBOb2RlIG5hbWUgdG8gYmUgc2FuaXRpemVkLlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqL1xuXHRzYW5pdGl6ZU5vZGVOYW1lOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciByZXNlcnZlZFJlID0gbmV3IFJlZ0V4cCggJ1snICsgUkVTRVJWRURfQ0hBUlNfUkUgKyAnXScsICdnJyApO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNhbml0aXplTm9kZU5hbWUoIG5hbWUgKSB7XG5cblx0XHRcdHJldHVybiBuYW1lLnJlcGxhY2UoIC9cXHMvZywgJ18nICkucmVwbGFjZSggcmVzZXJ2ZWRSZSwgJycgKTtcblxuXHRcdH07XG5cblx0fSgpICksXG5cblx0cGFyc2VUcmFja05hbWU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIEF0dGVtcHRzIHRvIGFsbG93IG5vZGUgbmFtZXMgZnJvbSBhbnkgbGFuZ3VhZ2UuIEVTNSdzIGBcXHdgIHJlZ2V4cCBtYXRjaGVzXG5cdFx0Ly8gb25seSBsYXRpbiBjaGFyYWN0ZXJzLCBhbmQgdGhlIHVuaWNvZGUgXFxwe0x9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiBTb1xuXHRcdC8vIGluc3RlYWQsIHdlIGV4Y2x1ZGUgcmVzZXJ2ZWQgY2hhcmFjdGVycyBhbmQgbWF0Y2ggZXZlcnl0aGluZyBlbHNlLlxuXHRcdHZhciB3b3JkQ2hhciA9ICdbXicgKyBSRVNFUlZFRF9DSEFSU19SRSArICddJztcblx0XHR2YXIgd29yZENoYXJPckRvdCA9ICdbXicgKyBSRVNFUlZFRF9DSEFSU19SRS5yZXBsYWNlKCAnXFxcXC4nLCAnJyApICsgJ10nO1xuXG5cdFx0Ly8gUGFyZW50IGRpcmVjdG9yaWVzLCBkZWxpbWl0ZWQgYnkgJy8nIG9yICc6Jy4gQ3VycmVudGx5IHVudXNlZCwgYnV0IG11c3Rcblx0XHQvLyBiZSBtYXRjaGVkIHRvIHBhcnNlIHRoZSByZXN0IG9mIHRoZSB0cmFjayBuYW1lLlxuXHRcdHZhciBkaXJlY3RvcnlSZSA9IC8oKD86V0MrW1xcLzpdKSopLy5zb3VyY2UucmVwbGFjZSggJ1dDJywgd29yZENoYXIgKTtcblxuXHRcdC8vIFRhcmdldCBub2RlLiBNYXkgY29udGFpbiB3b3JkIGNoYXJhY3RlcnMgKGEtekEtWjAtOV8pIGFuZCAnLicgb3IgJy0nLlxuXHRcdHZhciBub2RlUmUgPSAvKFdDT0QrKT8vLnNvdXJjZS5yZXBsYWNlKCAnV0NPRCcsIHdvcmRDaGFyT3JEb3QgKTtcblxuXHRcdC8vIE9iamVjdCBvbiB0YXJnZXQgbm9kZSwgYW5kIGFjY2Vzc29yLiBNYXkgbm90IGNvbnRhaW4gcmVzZXJ2ZWRcblx0XHQvLyBjaGFyYWN0ZXJzLiBBY2Nlc3NvciBtYXkgY29udGFpbiBhbnkgY2hhcmFjdGVyIGV4Y2VwdCBjbG9zaW5nIGJyYWNrZXQuXG5cdFx0dmFyIG9iamVjdFJlID0gLyg/OlxcLihXQyspKD86XFxbKC4rKVxcXSk/KT8vLnNvdXJjZS5yZXBsYWNlKCAnV0MnLCB3b3JkQ2hhciApO1xuXG5cdFx0Ly8gUHJvcGVydHkgYW5kIGFjY2Vzc29yLiBNYXkgbm90IGNvbnRhaW4gcmVzZXJ2ZWQgY2hhcmFjdGVycy4gQWNjZXNzb3IgbWF5XG5cdFx0Ly8gY29udGFpbiBhbnkgbm9uLWJyYWNrZXQgY2hhcmFjdGVycy5cblx0XHR2YXIgcHJvcGVydHlSZSA9IC9cXC4oV0MrKSg/OlxcWyguKylcXF0pPy8uc291cmNlLnJlcGxhY2UoICdXQycsIHdvcmRDaGFyICk7XG5cblx0XHR2YXIgdHJhY2tSZSA9IG5ldyBSZWdFeHAoICcnXG5cdFx0XHQrICdeJ1xuXHRcdFx0KyBkaXJlY3RvcnlSZVxuXHRcdFx0KyBub2RlUmVcblx0XHRcdCsgb2JqZWN0UmVcblx0XHRcdCsgcHJvcGVydHlSZVxuXHRcdFx0KyAnJCdcblx0XHQpO1xuXG5cdFx0dmFyIHN1cHBvcnRlZE9iamVjdE5hbWVzID0gWyAnbWF0ZXJpYWwnLCAnbWF0ZXJpYWxzJywgJ2JvbmVzJyBdO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHBhcnNlVHJhY2tOYW1lKCB0cmFja05hbWUgKSB7XG5cblx0XHRcdHZhciBtYXRjaGVzID0gdHJhY2tSZS5leGVjKCB0cmFja05hbWUgKTtcblxuXHRcdFx0aWYgKCAhIG1hdGNoZXMgKSB7XG5cblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnUHJvcGVydHlCaW5kaW5nOiBDYW5ub3QgcGFyc2UgdHJhY2tOYW1lOiAnICsgdHJhY2tOYW1lICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHJlc3VsdHMgPSB7XG5cdFx0XHRcdC8vIGRpcmVjdG9yeU5hbWU6IG1hdGNoZXNbIDEgXSwgLy8gKHRzY2h3KSBjdXJyZW50bHkgdW51c2VkXG5cdFx0XHRcdG5vZGVOYW1lOiBtYXRjaGVzWyAyIF0sXG5cdFx0XHRcdG9iamVjdE5hbWU6IG1hdGNoZXNbIDMgXSxcblx0XHRcdFx0b2JqZWN0SW5kZXg6IG1hdGNoZXNbIDQgXSxcblx0XHRcdFx0cHJvcGVydHlOYW1lOiBtYXRjaGVzWyA1IF0sIC8vIHJlcXVpcmVkXG5cdFx0XHRcdHByb3BlcnR5SW5kZXg6IG1hdGNoZXNbIDYgXVxuXHRcdFx0fTtcblxuXHRcdFx0dmFyIGxhc3REb3QgPSByZXN1bHRzLm5vZGVOYW1lICYmIHJlc3VsdHMubm9kZU5hbWUubGFzdEluZGV4T2YoICcuJyApO1xuXG5cdFx0XHRpZiAoIGxhc3REb3QgIT09IHVuZGVmaW5lZCAmJiBsYXN0RG90ICE9PSAtIDEgKSB7XG5cblx0XHRcdFx0dmFyIG9iamVjdE5hbWUgPSByZXN1bHRzLm5vZGVOYW1lLnN1YnN0cmluZyggbGFzdERvdCArIDEgKTtcblxuXHRcdFx0XHQvLyBPYmplY3QgbmFtZXMgbXVzdCBiZSBjaGVja2VkIGFnYWluc3QgYSB3aGl0ZWxpc3QuIE90aGVyd2lzZSwgdGhlcmVcblx0XHRcdFx0Ly8gaXMgbm8gd2F5IHRvIHBhcnNlICdmb28uYmFyLmJheic6ICdiYXonIG11c3QgYmUgYSBwcm9wZXJ0eSwgYnV0XG5cdFx0XHRcdC8vICdiYXInIGNvdWxkIGJlIHRoZSBvYmplY3ROYW1lLCBvciBwYXJ0IG9mIGEgbm9kZU5hbWUgKHdoaWNoIGNhblxuXHRcdFx0XHQvLyBpbmNsdWRlICcuJyBjaGFyYWN0ZXJzKS5cblx0XHRcdFx0aWYgKCBzdXBwb3J0ZWRPYmplY3ROYW1lcy5pbmRleE9mKCBvYmplY3ROYW1lICkgIT09IC0gMSApIHtcblxuXHRcdFx0XHRcdHJlc3VsdHMubm9kZU5hbWUgPSByZXN1bHRzLm5vZGVOYW1lLnN1YnN0cmluZyggMCwgbGFzdERvdCApO1xuXHRcdFx0XHRcdHJlc3VsdHMub2JqZWN0TmFtZSA9IG9iamVjdE5hbWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggcmVzdWx0cy5wcm9wZXJ0eU5hbWUgPT09IG51bGwgfHwgcmVzdWx0cy5wcm9wZXJ0eU5hbWUubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggJ1Byb3BlcnR5QmluZGluZzogY2FuIG5vdCBwYXJzZSBwcm9wZXJ0eU5hbWUgZnJvbSB0cmFja05hbWU6ICcgKyB0cmFja05hbWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmVzdWx0cztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGZpbmROb2RlOiBmdW5jdGlvbiAoIHJvb3QsIG5vZGVOYW1lICkge1xuXG5cdFx0aWYgKCAhIG5vZGVOYW1lIHx8IG5vZGVOYW1lID09PSBcIlwiIHx8IG5vZGVOYW1lID09PSBcInJvb3RcIiB8fCBub2RlTmFtZSA9PT0gXCIuXCIgfHwgbm9kZU5hbWUgPT09IC0gMSB8fCBub2RlTmFtZSA9PT0gcm9vdC5uYW1lIHx8IG5vZGVOYW1lID09PSByb290LnV1aWQgKSB7XG5cblx0XHRcdHJldHVybiByb290O1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2VhcmNoIGludG8gc2tlbGV0b24gYm9uZXMuXG5cdFx0aWYgKCByb290LnNrZWxldG9uICkge1xuXG5cdFx0XHR2YXIgYm9uZSA9IHJvb3Quc2tlbGV0b24uZ2V0Qm9uZUJ5TmFtZSggbm9kZU5hbWUgKTtcblxuXHRcdFx0aWYgKCBib25lICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGJvbmU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIHNlYXJjaCBpbnRvIG5vZGUgc3VidHJlZS5cblx0XHRpZiAoIHJvb3QuY2hpbGRyZW4gKSB7XG5cblx0XHRcdHZhciBzZWFyY2hOb2RlU3VidHJlZSA9IGZ1bmN0aW9uICggY2hpbGRyZW4gKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIGNoaWxkTm9kZSA9IGNoaWxkcmVuWyBpIF07XG5cblx0XHRcdFx0XHRpZiAoIGNoaWxkTm9kZS5uYW1lID09PSBub2RlTmFtZSB8fCBjaGlsZE5vZGUudXVpZCA9PT0gbm9kZU5hbWUgKSB7XG5cblx0XHRcdFx0XHRcdHJldHVybiBjaGlsZE5vZGU7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR2YXIgcmVzdWx0ID0gc2VhcmNoTm9kZVN1YnRyZWUoIGNoaWxkTm9kZS5jaGlsZHJlbiApO1xuXG5cdFx0XHRcdFx0aWYgKCByZXN1bHQgKSByZXR1cm4gcmVzdWx0O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdFx0fTtcblxuXHRcdFx0dmFyIHN1YlRyZWVOb2RlID0gc2VhcmNoTm9kZVN1YnRyZWUoIHJvb3QuY2hpbGRyZW4gKTtcblxuXHRcdFx0aWYgKCBzdWJUcmVlTm9kZSApIHtcblxuXHRcdFx0XHRyZXR1cm4gc3ViVHJlZU5vZGU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLCB7IC8vIHByb3RvdHlwZSwgY29udGludWVkXG5cblx0Ly8gdGhlc2UgYXJlIHVzZWQgdG8gXCJiaW5kXCIgYSBub25leGlzdGVudCBwcm9wZXJ0eVxuXHRfZ2V0VmFsdWVfdW5hdmFpbGFibGU6IGZ1bmN0aW9uICgpIHt9LFxuXHRfc2V0VmFsdWVfdW5hdmFpbGFibGU6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdEJpbmRpbmdUeXBlOiB7XG5cdFx0RGlyZWN0OiAwLFxuXHRcdEVudGlyZUFycmF5OiAxLFxuXHRcdEFycmF5RWxlbWVudDogMixcblx0XHRIYXNGcm9tVG9BcnJheTogM1xuXHR9LFxuXG5cdFZlcnNpb25pbmc6IHtcblx0XHROb25lOiAwLFxuXHRcdE5lZWRzVXBkYXRlOiAxLFxuXHRcdE1hdHJpeFdvcmxkTmVlZHNVcGRhdGU6IDJcblx0fSxcblxuXHRHZXR0ZXJCeUJpbmRpbmdUeXBlOiBbXG5cblx0XHRmdW5jdGlvbiBnZXRWYWx1ZV9kaXJlY3QoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRidWZmZXJbIG9mZnNldCBdID0gdGhpcy5ub2RlWyB0aGlzLnByb3BlcnR5TmFtZSBdO1xuXG5cdFx0fSxcblxuXHRcdGZ1bmN0aW9uIGdldFZhbHVlX2FycmF5KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0dmFyIHNvdXJjZSA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gc291cmNlLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRidWZmZXJbIG9mZnNldCArKyBdID0gc291cmNlWyBpIF07XG5cblx0XHRcdH1cblxuXHRcdH0sXG5cblx0XHRmdW5jdGlvbiBnZXRWYWx1ZV9hcnJheUVsZW1lbnQoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRidWZmZXJbIG9mZnNldCBdID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5WyB0aGlzLnByb3BlcnR5SW5kZXggXTtcblxuXHRcdH0sXG5cblx0XHRmdW5jdGlvbiBnZXRWYWx1ZV90b0FycmF5KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5LnRvQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7XG5cblx0XHR9XG5cblx0XSxcblxuXHRTZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZzogW1xuXG5cdFx0W1xuXHRcdFx0Ly8gRGlyZWN0XG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2RpcmVjdCggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3RbIHRoaXMucHJvcGVydHlOYW1lIF0gPSBidWZmZXJbIG9mZnNldCBdO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9kaXJlY3Rfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0WyB0aGlzLnByb3BlcnR5TmFtZSBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9kaXJlY3Rfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3RbIHRoaXMucHJvcGVydHlOYW1lIF0gPSBidWZmZXJbIG9mZnNldCBdO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XSwgW1xuXG5cdFx0XHQvLyBFbnRpcmVBcnJheVxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dmFyIGRlc3QgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gZGVzdC5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0XHRkZXN0WyBpIF0gPSBidWZmZXJbIG9mZnNldCArKyBdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHZhciBkZXN0ID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5O1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGRlc3QubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdFx0ZGVzdFsgaSBdID0gYnVmZmVyWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR2YXIgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBkZXN0Lmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRcdGRlc3RbIGkgXSA9IGJ1ZmZlclsgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRdLCBbXG5cblx0XHRcdC8vIEFycmF5RWxlbWVudFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheUVsZW1lbnQoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF0gPSBidWZmZXJbIG9mZnNldCBdO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF0gPSBidWZmZXJbIG9mZnNldCBdO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2FycmF5RWxlbWVudF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdF0sIFtcblxuXHRcdFx0Ly8gSGFzVG9Gcm9tQXJyYXlcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZnJvbUFycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRdXG5cblx0XSxcblxuXHRnZXRWYWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWVfdW5ib3VuZCggdGFyZ2V0QXJyYXksIG9mZnNldCApIHtcblxuXHRcdHRoaXMuYmluZCgpO1xuXHRcdHRoaXMuZ2V0VmFsdWUoIHRhcmdldEFycmF5LCBvZmZzZXQgKTtcblxuXHRcdC8vIE5vdGU6IFRoaXMgY2xhc3MgdXNlcyBhIFN0YXRlIHBhdHRlcm4gb24gYSBwZXItbWV0aG9kIGJhc2lzOlxuXHRcdC8vICdiaW5kJyBzZXRzICd0aGlzLmdldFZhbHVlJyAvICdzZXRWYWx1ZScgYW5kIHNoYWRvd3MgdGhlXG5cdFx0Ly8gcHJvdG90eXBlIHZlcnNpb24gb2YgdGhlc2UgbWV0aG9kcyB3aXRoIG9uZSB0aGF0IHJlcHJlc2VudHNcblx0XHQvLyB0aGUgYm91bmQgc3RhdGUuIFdoZW4gdGhlIHByb3BlcnR5IGlzIG5vdCBmb3VuZCwgdGhlIG1ldGhvZHNcblx0XHQvLyBiZWNvbWUgbm8tb3BzLlxuXG5cdH0sXG5cblx0c2V0VmFsdWU6IGZ1bmN0aW9uIGdldFZhbHVlX3VuYm91bmQoIHNvdXJjZUFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmJpbmQoKTtcblx0XHR0aGlzLnNldFZhbHVlKCBzb3VyY2VBcnJheSwgb2Zmc2V0ICk7XG5cblx0fSxcblxuXHQvLyBjcmVhdGUgZ2V0dGVyIC8gc2V0dGVyIHBhaXIgZm9yIGEgcHJvcGVydHkgaW4gdGhlIHNjZW5lIGdyYXBoXG5cdGJpbmQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0YXJnZXRPYmplY3QgPSB0aGlzLm5vZGUsXG5cdFx0XHRwYXJzZWRQYXRoID0gdGhpcy5wYXJzZWRQYXRoLFxuXG5cdFx0XHRvYmplY3ROYW1lID0gcGFyc2VkUGF0aC5vYmplY3ROYW1lLFxuXHRcdFx0cHJvcGVydHlOYW1lID0gcGFyc2VkUGF0aC5wcm9wZXJ0eU5hbWUsXG5cdFx0XHRwcm9wZXJ0eUluZGV4ID0gcGFyc2VkUGF0aC5wcm9wZXJ0eUluZGV4O1xuXG5cdFx0aWYgKCAhIHRhcmdldE9iamVjdCApIHtcblxuXHRcdFx0dGFyZ2V0T2JqZWN0ID0gUHJvcGVydHlCaW5kaW5nLmZpbmROb2RlKCB0aGlzLnJvb3ROb2RlLCBwYXJzZWRQYXRoLm5vZGVOYW1lICkgfHwgdGhpcy5yb290Tm9kZTtcblxuXHRcdFx0dGhpcy5ub2RlID0gdGFyZ2V0T2JqZWN0O1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2V0IGZhaWwgc3RhdGUgc28gd2UgY2FuIGp1c3QgJ3JldHVybicgb24gZXJyb3Jcblx0XHR0aGlzLmdldFZhbHVlID0gdGhpcy5fZ2V0VmFsdWVfdW5hdmFpbGFibGU7XG5cdFx0dGhpcy5zZXRWYWx1ZSA9IHRoaXMuX3NldFZhbHVlX3VuYXZhaWxhYmxlO1xuXG5cdFx0Ly8gZW5zdXJlIHRoZXJlIGlzIGEgdmFsdWUgbm9kZVxuXHRcdGlmICggISB0YXJnZXRPYmplY3QgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byB1cGRhdGUgbm9kZSBmb3IgdHJhY2s6ICcgKyB0aGlzLnBhdGggKyAnIGJ1dCBpdCB3YXNuXFwndCBmb3VuZC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIG9iamVjdE5hbWUgKSB7XG5cblx0XHRcdHZhciBvYmplY3RJbmRleCA9IHBhcnNlZFBhdGgub2JqZWN0SW5kZXg7XG5cblx0XHRcdC8vIHNwZWNpYWwgY2FzZXMgd2VyZSB3ZSBuZWVkIHRvIHJlYWNoIGRlZXBlciBpbnRvIHRoZSBoaWVyYXJjaHkgdG8gZ2V0IHRoZSBmYWNlIG1hdGVyaWFscy4uLi5cblx0XHRcdHN3aXRjaCAoIG9iamVjdE5hbWUgKSB7XG5cblx0XHRcdFx0Y2FzZSAnbWF0ZXJpYWxzJzpcblxuXHRcdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3QubWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbCBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbC4nLCB0aGlzICk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0Lm1hdGVyaWFsLm1hdGVyaWFscyApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsLm1hdGVyaWFscyBhcyBub2RlLm1hdGVyaWFsIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbHMgYXJyYXkuJywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0Lm1hdGVyaWFsLm1hdGVyaWFscztcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ2JvbmVzJzpcblxuXHRcdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3Quc2tlbGV0b24gKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBib25lcyBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBza2VsZXRvbi4nLCB0aGlzICk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBwb3RlbnRpYWwgZnV0dXJlIG9wdGltaXphdGlvbjogc2tpcCB0aGlzIGlmIHByb3BlcnR5SW5kZXggaXMgYWxyZWFkeSBhbiBpbnRlZ2VyXG5cdFx0XHRcdFx0Ly8gYW5kIGNvbnZlcnQgdGhlIGludGVnZXIgc3RyaW5nIHRvIGEgdHJ1ZSBpbnRlZ2VyLlxuXG5cdFx0XHRcdFx0dGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0LnNrZWxldG9uLmJvbmVzO1xuXG5cdFx0XHRcdFx0Ly8gc3VwcG9ydCByZXNvbHZpbmcgbW9ycGhUYXJnZXQgbmFtZXMgaW50byBpbmRpY2VzLlxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRhcmdldE9iamVjdC5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0WyBpIF0ubmFtZSA9PT0gb2JqZWN0SW5kZXggKSB7XG5cblx0XHRcdFx0XHRcdFx0b2JqZWN0SW5kZXggPSBpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0ZGVmYXVsdDpcblxuXHRcdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0WyBvYmplY3ROYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG9iamVjdE5hbWUgb2Ygbm9kZSB1bmRlZmluZWQuJywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0WyBvYmplY3ROYW1lIF07XG5cblx0XHRcdH1cblxuXG5cdFx0XHRpZiAoIG9iamVjdEluZGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0aWYgKCB0YXJnZXRPYmplY3RbIG9iamVjdEluZGV4IF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byBiaW5kIHRvIG9iamVjdEluZGV4IG9mIG9iamVjdE5hbWUsIGJ1dCBpcyB1bmRlZmluZWQuJywgdGhpcywgdGFyZ2V0T2JqZWN0ICk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3RbIG9iamVjdEluZGV4IF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIHJlc29sdmUgcHJvcGVydHlcblx0XHR2YXIgbm9kZVByb3BlcnR5ID0gdGFyZ2V0T2JqZWN0WyBwcm9wZXJ0eU5hbWUgXTtcblxuXHRcdGlmICggbm9kZVByb3BlcnR5ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBub2RlTmFtZSA9IHBhcnNlZFBhdGgubm9kZU5hbWU7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byB1cGRhdGUgcHJvcGVydHkgZm9yIHRyYWNrOiAnICsgbm9kZU5hbWUgK1xuXHRcdFx0XHQnLicgKyBwcm9wZXJ0eU5hbWUgKyAnIGJ1dCBpdCB3YXNuXFwndCBmb3VuZC4nLCB0YXJnZXRPYmplY3QgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdC8vIGRldGVybWluZSB2ZXJzaW9uaW5nIHNjaGVtZVxuXHRcdHZhciB2ZXJzaW9uaW5nID0gdGhpcy5WZXJzaW9uaW5nLk5vbmU7XG5cblx0XHRpZiAoIHRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSAhPT0gdW5kZWZpbmVkICkgeyAvLyBtYXRlcmlhbFxuXG5cdFx0XHR2ZXJzaW9uaW5nID0gdGhpcy5WZXJzaW9uaW5nLk5lZWRzVXBkYXRlO1xuXHRcdFx0dGhpcy50YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3Q7XG5cblx0XHR9IGVsc2UgaWYgKCB0YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSAhPT0gdW5kZWZpbmVkICkgeyAvLyBub2RlIHRyYW5zZm9ybVxuXG5cdFx0XHR2ZXJzaW9uaW5nID0gdGhpcy5WZXJzaW9uaW5nLk1hdHJpeFdvcmxkTmVlZHNVcGRhdGU7XG5cdFx0XHR0aGlzLnRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdDtcblxuXHRcdH1cblxuXHRcdC8vIGRldGVybWluZSBob3cgdGhlIHByb3BlcnR5IGdldHMgYm91bmRcblx0XHR2YXIgYmluZGluZ1R5cGUgPSB0aGlzLkJpbmRpbmdUeXBlLkRpcmVjdDtcblxuXHRcdGlmICggcHJvcGVydHlJbmRleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBhY2Nlc3MgYSBzdWIgZWxlbWVudCBvZiB0aGUgcHJvcGVydHkgYXJyYXkgKG9ubHkgcHJpbWl0aXZlcyBhcmUgc3VwcG9ydGVkIHJpZ2h0IG5vdylcblxuXHRcdFx0aWYgKCBwcm9wZXJ0eU5hbWUgPT09IFwibW9ycGhUYXJnZXRJbmZsdWVuY2VzXCIgKSB7XG5cblx0XHRcdFx0Ly8gcG90ZW50aWFsIG9wdGltaXphdGlvbiwgc2tpcCB0aGlzIGlmIHByb3BlcnR5SW5kZXggaXMgYWxyZWFkeSBhbiBpbnRlZ2VyLCBhbmQgY29udmVydCB0aGUgaW50ZWdlciBzdHJpbmcgdG8gYSB0cnVlIGludGVnZXIuXG5cblx0XHRcdFx0Ly8gc3VwcG9ydCByZXNvbHZpbmcgbW9ycGhUYXJnZXQgbmFtZXMgaW50byBpbmRpY2VzLlxuXHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0Lmdlb21ldHJ5ICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5LicsIHRoaXMgKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0Lmdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0Lmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy4nLCB0aGlzICk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLm5vZGUuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCB0YXJnZXRPYmplY3QuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uWyBpIF0ubmFtZSA9PT0gcHJvcGVydHlJbmRleCApIHtcblxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eUluZGV4ID0gaTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0Lmdlb21ldHJ5Lm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy4nLCB0aGlzICk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLm5vZGUuZ2VvbWV0cnkubW9ycGhUYXJnZXRzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCB0YXJnZXRPYmplY3QuZ2VvbWV0cnkubW9ycGhUYXJnZXRzWyBpIF0ubmFtZSA9PT0gcHJvcGVydHlJbmRleCApIHtcblxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eUluZGV4ID0gaTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0YmluZGluZ1R5cGUgPSB0aGlzLkJpbmRpbmdUeXBlLkFycmF5RWxlbWVudDtcblxuXHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gbm9kZVByb3BlcnR5O1xuXHRcdFx0dGhpcy5wcm9wZXJ0eUluZGV4ID0gcHJvcGVydHlJbmRleDtcblxuXHRcdH0gZWxzZSBpZiAoIG5vZGVQcm9wZXJ0eS5mcm9tQXJyYXkgIT09IHVuZGVmaW5lZCAmJiBub2RlUHJvcGVydHkudG9BcnJheSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBtdXN0IHVzZSBjb3B5IGZvciBPYmplY3QzRC5FdWxlci9RdWF0ZXJuaW9uXG5cblx0XHRcdGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5IYXNGcm9tVG9BcnJheTtcblxuXHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gbm9kZVByb3BlcnR5O1xuXG5cdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggbm9kZVByb3BlcnR5ICkgKSB7XG5cblx0XHRcdGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5FbnRpcmVBcnJheTtcblxuXHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gbm9kZVByb3BlcnR5O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7XG5cblx0XHR9XG5cblx0XHQvLyBzZWxlY3QgZ2V0dGVyIC8gc2V0dGVyXG5cdFx0dGhpcy5nZXRWYWx1ZSA9IHRoaXMuR2V0dGVyQnlCaW5kaW5nVHlwZVsgYmluZGluZ1R5cGUgXTtcblx0XHR0aGlzLnNldFZhbHVlID0gdGhpcy5TZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZ1sgYmluZGluZ1R5cGUgXVsgdmVyc2lvbmluZyBdO1xuXG5cdH0sXG5cblx0dW5iaW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLm5vZGUgPSBudWxsO1xuXG5cdFx0Ly8gYmFjayB0byB0aGUgcHJvdG90eXBlIHZlcnNpb24gb2YgZ2V0VmFsdWUgLyBzZXRWYWx1ZVxuXHRcdC8vIG5vdGU6IGF2b2lkaW5nIHRvIG11dGF0ZSB0aGUgc2hhcGUgb2YgJ3RoaXMnIHZpYSAnZGVsZXRlJ1xuXHRcdHRoaXMuZ2V0VmFsdWUgPSB0aGlzLl9nZXRWYWx1ZV91bmJvdW5kO1xuXHRcdHRoaXMuc2V0VmFsdWUgPSB0aGlzLl9zZXRWYWx1ZV91bmJvdW5kO1xuXG5cdH1cblxufSApO1xuXG4vLyFcXCBERUNMQVJFIEFMSUFTIEFGVEVSIGFzc2lnbiBwcm90b3R5cGUgIVxuT2JqZWN0LmFzc2lnbiggUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZSwge1xuXG5cdC8vIGluaXRpYWwgc3RhdGUgb2YgdGhlc2UgbWV0aG9kcyB0aGF0IGNhbGxzICdiaW5kJ1xuXHRfZ2V0VmFsdWVfdW5ib3VuZDogUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5nZXRWYWx1ZSxcblx0X3NldFZhbHVlX3VuYm91bmQ6IFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuc2V0VmFsdWUsXG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSBncm91cCBvZiBvYmplY3RzIHRoYXQgcmVjZWl2ZXMgYSBzaGFyZWQgYW5pbWF0aW9uIHN0YXRlLlxuICpcbiAqIFVzYWdlOlxuICpcbiAqIFx0LVx0QWRkIG9iamVjdHMgeW91IHdvdWxkIG90aGVyd2lzZSBwYXNzIGFzICdyb290JyB0byB0aGVcbiAqIFx0XHRjb25zdHJ1Y3RvciBvciB0aGUgLmNsaXBBY3Rpb24gbWV0aG9kIG9mIEFuaW1hdGlvbk1peGVyLlxuICpcbiAqIFx0LVx0SW5zdGVhZCBwYXNzIHRoaXMgb2JqZWN0IGFzICdyb290Jy5cbiAqXG4gKiBcdC1cdFlvdSBjYW4gYWxzbyBhZGQgYW5kIHJlbW92ZSBvYmplY3RzIGxhdGVyIHdoZW4gdGhlIG1peGVyXG4gKiBcdFx0aXMgcnVubmluZy5cbiAqXG4gKiBOb3RlOlxuICpcbiAqICBcdE9iamVjdHMgb2YgdGhpcyBjbGFzcyBhcHBlYXIgYXMgb25lIG9iamVjdCB0byB0aGUgbWl4ZXIsXG4gKiAgXHRzbyBjYWNoZSBjb250cm9sIG9mIHRoZSBpbmRpdmlkdWFsIG9iamVjdHMgbXVzdCBiZSBkb25lXG4gKiAgXHRvbiB0aGUgZ3JvdXAuXG4gKlxuICogTGltaXRhdGlvbjpcbiAqXG4gKiBcdC0gXHRUaGUgYW5pbWF0ZWQgcHJvcGVydGllcyBtdXN0IGJlIGNvbXBhdGlibGUgYW1vbmcgdGhlXG4gKiBcdFx0YWxsIG9iamVjdHMgaW4gdGhlIGdyb3VwLlxuICpcbiAqICAtXHRBIHNpbmdsZSBwcm9wZXJ0eSBjYW4gZWl0aGVyIGJlIGNvbnRyb2xsZWQgdGhyb3VnaCBhXG4gKiAgXHR0YXJnZXQgZ3JvdXAgb3IgZGlyZWN0bHksIGJ1dCBub3QgYm90aC5cbiAqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gQW5pbWF0aW9uT2JqZWN0R3JvdXAoKSB7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0Ly8gY2FjaGVkIG9iamVjdHMgZm9sbG93ZWQgYnkgdGhlIGFjdGl2ZSBvbmVzXG5cdHRoaXMuX29iamVjdHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJndW1lbnRzICk7XG5cblx0dGhpcy5uQ2FjaGVkT2JqZWN0c18gPSAwO1x0XHRcdC8vIHRocmVzaG9sZFxuXHQvLyBub3RlOiByZWFkIGJ5IFByb3BlcnR5QmluZGluZy5Db21wb3NpdGVcblxuXHR2YXIgaW5kaWNlcyA9IHt9O1xuXHR0aGlzLl9pbmRpY2VzQnlVVUlEID0gaW5kaWNlcztcdFx0Ly8gZm9yIGJvb2trZWVwaW5nXG5cblx0Zm9yICggdmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdGluZGljZXNbIGFyZ3VtZW50c1sgaSBdLnV1aWQgXSA9IGk7XG5cblx0fVxuXG5cdHRoaXMuX3BhdGhzID0gW107XHRcdFx0XHRcdC8vIGluc2lkZTogc3RyaW5nXG5cdHRoaXMuX3BhcnNlZFBhdGhzID0gW107XHRcdFx0XHQvLyBpbnNpZGU6IHsgd2UgZG9uJ3QgY2FyZSwgaGVyZSB9XG5cdHRoaXMuX2JpbmRpbmdzID0gW107IFx0XHRcdFx0Ly8gaW5zaWRlOiBBcnJheTwgUHJvcGVydHlCaW5kaW5nID5cblx0dGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoID0ge307IFx0Ly8gaW5zaWRlOiBpbmRpY2VzIGluIHRoZXNlIGFycmF5c1xuXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0dGhpcy5zdGF0cyA9IHtcblxuXHRcdG9iamVjdHM6IHtcblx0XHRcdGdldCB0b3RhbCgpIHtcblxuXHRcdFx0XHRyZXR1cm4gc2NvcGUuX29iamVjdHMubGVuZ3RoO1xuXG5cdFx0XHR9LFxuXHRcdFx0Z2V0IGluVXNlKCkge1xuXG5cdFx0XHRcdHJldHVybiB0aGlzLnRvdGFsIC0gc2NvcGUubkNhY2hlZE9iamVjdHNfO1xuXG5cdFx0XHR9XG5cdFx0fSxcblx0XHRnZXQgYmluZGluZ3NQZXJPYmplY3QoKSB7XG5cblx0XHRcdHJldHVybiBzY29wZS5fYmluZGluZ3MubGVuZ3RoO1xuXG5cdFx0fVxuXG5cdH07XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQW5pbWF0aW9uT2JqZWN0R3JvdXAucHJvdG90eXBlLCB7XG5cblx0aXNBbmltYXRpb25PYmplY3RHcm91cDogdHJ1ZSxcblxuXHRhZGQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvYmplY3RzID0gdGhpcy5fb2JqZWN0cyxcblx0XHRcdG5PYmplY3RzID0gb2JqZWN0cy5sZW5ndGgsXG5cdFx0XHRuQ2FjaGVkT2JqZWN0cyA9IHRoaXMubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0aW5kaWNlc0J5VVVJRCA9IHRoaXMuX2luZGljZXNCeVVVSUQsXG5cdFx0XHRwYXRocyA9IHRoaXMuX3BhdGhzLFxuXHRcdFx0cGFyc2VkUGF0aHMgPSB0aGlzLl9wYXJzZWRQYXRocyxcblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRuQmluZGluZ3MgPSBiaW5kaW5ncy5sZW5ndGgsXG5cdFx0XHRrbm93bk9iamVjdCA9IHVuZGVmaW5lZDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHZhciBvYmplY3QgPSBhcmd1bWVudHNbIGkgXSxcblx0XHRcdFx0dXVpZCA9IG9iamVjdC51dWlkLFxuXHRcdFx0XHRpbmRleCA9IGluZGljZXNCeVVVSURbIHV1aWQgXTtcblxuXHRcdFx0aWYgKCBpbmRleCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIHVua25vd24gb2JqZWN0IC0+IGFkZCBpdCB0byB0aGUgQUNUSVZFIHJlZ2lvblxuXG5cdFx0XHRcdGluZGV4ID0gbk9iamVjdHMgKys7XG5cdFx0XHRcdGluZGljZXNCeVVVSURbIHV1aWQgXSA9IGluZGV4O1xuXHRcdFx0XHRvYmplY3RzLnB1c2goIG9iamVjdCApO1xuXG5cdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7XG5cblx0XHRcdFx0XHRiaW5kaW5nc1sgaiBdLnB1c2goIG5ldyBQcm9wZXJ0eUJpbmRpbmcoIG9iamVjdCwgcGF0aHNbIGogXSwgcGFyc2VkUGF0aHNbIGogXSApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbmRleCA8IG5DYWNoZWRPYmplY3RzICkge1xuXG5cdFx0XHRcdGtub3duT2JqZWN0ID0gb2JqZWN0c1sgaW5kZXggXTtcblxuXHRcdFx0XHQvLyBtb3ZlIGV4aXN0aW5nIG9iamVjdCB0byB0aGUgQUNUSVZFIHJlZ2lvblxuXG5cdFx0XHRcdHZhciBmaXJzdEFjdGl2ZUluZGV4ID0gLS0gbkNhY2hlZE9iamVjdHMsXG5cdFx0XHRcdFx0bGFzdENhY2hlZE9iamVjdCA9IG9iamVjdHNbIGZpcnN0QWN0aXZlSW5kZXggXTtcblxuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBsYXN0Q2FjaGVkT2JqZWN0LnV1aWQgXSA9IGluZGV4O1xuXHRcdFx0XHRvYmplY3RzWyBpbmRleCBdID0gbGFzdENhY2hlZE9iamVjdDtcblxuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyB1dWlkIF0gPSBmaXJzdEFjdGl2ZUluZGV4O1xuXHRcdFx0XHRvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBvYmplY3Q7XG5cblx0XHRcdFx0Ly8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5nc1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdHZhciBiaW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1sgaiBdLFxuXHRcdFx0XHRcdFx0bGFzdENhY2hlZCA9IGJpbmRpbmdzRm9yUGF0aFsgZmlyc3RBY3RpdmVJbmRleCBdLFxuXHRcdFx0XHRcdFx0YmluZGluZyA9IGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXTtcblxuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGxhc3RDYWNoZWQ7XG5cblx0XHRcdFx0XHRpZiAoIGJpbmRpbmcgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gc2luY2Ugd2UgZG8gbm90IGJvdGhlciB0byBjcmVhdGUgbmV3IGJpbmRpbmdzXG5cdFx0XHRcdFx0XHQvLyBmb3Igb2JqZWN0cyB0aGF0IGFyZSBjYWNoZWQsIHRoZSBiaW5kaW5nIG1heVxuXHRcdFx0XHRcdFx0Ly8gb3IgbWF5IG5vdCBleGlzdFxuXG5cdFx0XHRcdFx0XHRiaW5kaW5nID0gbmV3IFByb3BlcnR5QmluZGluZyggb2JqZWN0LCBwYXRoc1sgaiBdLCBwYXJzZWRQYXRoc1sgaiBdICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSA9IGJpbmRpbmc7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3RzWyBpbmRleCBdICE9PSBrbm93bk9iamVjdCApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQW5pbWF0aW9uT2JqZWN0R3JvdXA6IERpZmZlcmVudCBvYmplY3RzIHdpdGggdGhlIHNhbWUgVVVJRCAnICtcblx0XHRcdFx0XHRcdCdkZXRlY3RlZC4gQ2xlYW4gdGhlIGNhY2hlcyBvciByZWNyZWF0ZSB5b3VyIGluZnJhc3RydWN0dXJlIHdoZW4gcmVsb2FkaW5nIHNjZW5lcy4nICk7XG5cblx0XHRcdH0gLy8gZWxzZSB0aGUgb2JqZWN0IGlzIGFscmVhZHkgd2hlcmUgd2Ugd2FudCBpdCB0byBiZVxuXG5cdFx0fSAvLyBmb3IgYXJndW1lbnRzXG5cblx0XHR0aGlzLm5DYWNoZWRPYmplY3RzXyA9IG5DYWNoZWRPYmplY3RzO1xuXG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb2JqZWN0cyA9IHRoaXMuX29iamVjdHMsXG5cdFx0XHRuQ2FjaGVkT2JqZWN0cyA9IHRoaXMubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0aW5kaWNlc0J5VVVJRCA9IHRoaXMuX2luZGljZXNCeVVVSUQsXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0bkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dmFyIG9iamVjdCA9IGFyZ3VtZW50c1sgaSBdLFxuXHRcdFx0XHR1dWlkID0gb2JqZWN0LnV1aWQsXG5cdFx0XHRcdGluZGV4ID0gaW5kaWNlc0J5VVVJRFsgdXVpZCBdO1xuXG5cdFx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgJiYgaW5kZXggPj0gbkNhY2hlZE9iamVjdHMgKSB7XG5cblx0XHRcdFx0Ly8gbW92ZSBleGlzdGluZyBvYmplY3QgaW50byB0aGUgQ0FDSEVEIHJlZ2lvblxuXG5cdFx0XHRcdHZhciBsYXN0Q2FjaGVkSW5kZXggPSBuQ2FjaGVkT2JqZWN0cyArKyxcblx0XHRcdFx0XHRmaXJzdEFjdGl2ZU9iamVjdCA9IG9iamVjdHNbIGxhc3RDYWNoZWRJbmRleCBdO1xuXG5cdFx0XHRcdGluZGljZXNCeVVVSURbIGZpcnN0QWN0aXZlT2JqZWN0LnV1aWQgXSA9IGluZGV4O1xuXHRcdFx0XHRvYmplY3RzWyBpbmRleCBdID0gZmlyc3RBY3RpdmVPYmplY3Q7XG5cblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgdXVpZCBdID0gbGFzdENhY2hlZEluZGV4O1xuXHRcdFx0XHRvYmplY3RzWyBsYXN0Q2FjaGVkSW5kZXggXSA9IG9iamVjdDtcblxuXHRcdFx0XHQvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzXG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkge1xuXG5cdFx0XHRcdFx0dmFyIGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF0sXG5cdFx0XHRcdFx0XHRmaXJzdEFjdGl2ZSA9IGJpbmRpbmdzRm9yUGF0aFsgbGFzdENhY2hlZEluZGV4IF0sXG5cdFx0XHRcdFx0XHRiaW5kaW5nID0gYmluZGluZ3NGb3JQYXRoWyBpbmRleCBdO1xuXG5cdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBpbmRleCBdID0gZmlyc3RBY3RpdmU7XG5cdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBsYXN0Q2FjaGVkSW5kZXggXSA9IGJpbmRpbmc7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9IC8vIGZvciBhcmd1bWVudHNcblxuXHRcdHRoaXMubkNhY2hlZE9iamVjdHNfID0gbkNhY2hlZE9iamVjdHM7XG5cblx0fSxcblxuXHQvLyByZW1vdmUgJiBmb3JnZXRcblx0dW5jYWNoZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLFxuXHRcdFx0bk9iamVjdHMgPSBvYmplY3RzLmxlbmd0aCxcblx0XHRcdG5DYWNoZWRPYmplY3RzID0gdGhpcy5uQ2FjaGVkT2JqZWN0c18sXG5cdFx0XHRpbmRpY2VzQnlVVUlEID0gdGhpcy5faW5kaWNlc0J5VVVJRCxcblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRuQmluZGluZ3MgPSBiaW5kaW5ncy5sZW5ndGg7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gYXJndW1lbnRzWyBpIF0sXG5cdFx0XHRcdHV1aWQgPSBvYmplY3QudXVpZCxcblx0XHRcdFx0aW5kZXggPSBpbmRpY2VzQnlVVUlEWyB1dWlkIF07XG5cblx0XHRcdGlmICggaW5kZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRkZWxldGUgaW5kaWNlc0J5VVVJRFsgdXVpZCBdO1xuXG5cdFx0XHRcdGlmICggaW5kZXggPCBuQ2FjaGVkT2JqZWN0cyApIHtcblxuXHRcdFx0XHRcdC8vIG9iamVjdCBpcyBjYWNoZWQsIHNocmluayB0aGUgQ0FDSEVEIHJlZ2lvblxuXG5cdFx0XHRcdFx0dmFyIGZpcnN0QWN0aXZlSW5kZXggPSAtLSBuQ2FjaGVkT2JqZWN0cyxcblx0XHRcdFx0XHRcdGxhc3RDYWNoZWRPYmplY3QgPSBvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF0sXG5cdFx0XHRcdFx0XHRsYXN0SW5kZXggPSAtLSBuT2JqZWN0cyxcblx0XHRcdFx0XHRcdGxhc3RPYmplY3QgPSBvYmplY3RzWyBsYXN0SW5kZXggXTtcblxuXHRcdFx0XHRcdC8vIGxhc3QgY2FjaGVkIG9iamVjdCB0YWtlcyB0aGlzIG9iamVjdCdzIHBsYWNlXG5cdFx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgbGFzdENhY2hlZE9iamVjdC51dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0XHRvYmplY3RzWyBpbmRleCBdID0gbGFzdENhY2hlZE9iamVjdDtcblxuXHRcdFx0XHRcdC8vIGxhc3Qgb2JqZWN0IGdvZXMgdG8gdGhlIGFjdGl2YXRlZCBzbG90IGFuZCBwb3Bcblx0XHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBsYXN0T2JqZWN0LnV1aWQgXSA9IGZpcnN0QWN0aXZlSW5kZXg7XG5cdFx0XHRcdFx0b2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdID0gbGFzdE9iamVjdDtcblx0XHRcdFx0XHRvYmplY3RzLnBvcCgpO1xuXG5cdFx0XHRcdFx0Ly8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5nc1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgYmluZGluZ3NGb3JQYXRoID0gYmluZGluZ3NbIGogXSxcblx0XHRcdFx0XHRcdFx0bGFzdENhY2hlZCA9IGJpbmRpbmdzRm9yUGF0aFsgZmlyc3RBY3RpdmVJbmRleCBdLFxuXHRcdFx0XHRcdFx0XHRsYXN0ID0gYmluZGluZ3NGb3JQYXRoWyBsYXN0SW5kZXggXTtcblxuXHRcdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBpbmRleCBdID0gbGFzdENhY2hlZDtcblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgZmlyc3RBY3RpdmVJbmRleCBdID0gbGFzdDtcblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aC5wb3AoKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gb2JqZWN0IGlzIGFjdGl2ZSwganVzdCBzd2FwIHdpdGggdGhlIGxhc3QgYW5kIHBvcFxuXG5cdFx0XHRcdFx0dmFyIGxhc3RJbmRleCA9IC0tIG5PYmplY3RzLFxuXHRcdFx0XHRcdFx0bGFzdE9iamVjdCA9IG9iamVjdHNbIGxhc3RJbmRleCBdO1xuXG5cdFx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgbGFzdE9iamVjdC51dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0XHRvYmplY3RzWyBpbmRleCBdID0gbGFzdE9iamVjdDtcblx0XHRcdFx0XHRvYmplY3RzLnBvcCgpO1xuXG5cdFx0XHRcdFx0Ly8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5nc1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgYmluZGluZ3NGb3JQYXRoID0gYmluZGluZ3NbIGogXTtcblxuXHRcdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBpbmRleCBdID0gYmluZGluZ3NGb3JQYXRoWyBsYXN0SW5kZXggXTtcblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aC5wb3AoKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IC8vIGNhY2hlZCBvciBhY3RpdmVcblxuXHRcdFx0fSAvLyBpZiBvYmplY3QgaXMga25vd25cblxuXHRcdH0gLy8gZm9yIGFyZ3VtZW50c1xuXG5cdFx0dGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0cztcblxuXHR9LFxuXG5cdC8vIEludGVybmFsIGludGVyZmFjZSB1c2VkIGJ5IGJlZnJpZW5kZWQgUHJvcGVydHlCaW5kaW5nLkNvbXBvc2l0ZTpcblxuXHRzdWJzY3JpYmVfOiBmdW5jdGlvbiAoIHBhdGgsIHBhcnNlZFBhdGggKSB7XG5cblx0XHQvLyByZXR1cm5zIGFuIGFycmF5IG9mIGJpbmRpbmdzIGZvciB0aGUgZ2l2ZW4gcGF0aCB0aGF0IGlzIGNoYW5nZWRcblx0XHQvLyBhY2NvcmRpbmcgdG8gdGhlIGNvbnRhaW5lZCBvYmplY3RzIGluIHRoZSBncm91cFxuXG5cdFx0dmFyIGluZGljZXNCeVBhdGggPSB0aGlzLl9iaW5kaW5nc0luZGljZXNCeVBhdGgsXG5cdFx0XHRpbmRleCA9IGluZGljZXNCeVBhdGhbIHBhdGggXSxcblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7XG5cblx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSByZXR1cm4gYmluZGluZ3NbIGluZGV4IF07XG5cblx0XHR2YXIgcGF0aHMgPSB0aGlzLl9wYXRocyxcblx0XHRcdHBhcnNlZFBhdGhzID0gdGhpcy5fcGFyc2VkUGF0aHMsXG5cdFx0XHRvYmplY3RzID0gdGhpcy5fb2JqZWN0cyxcblx0XHRcdG5PYmplY3RzID0gb2JqZWN0cy5sZW5ndGgsXG5cdFx0XHRuQ2FjaGVkT2JqZWN0cyA9IHRoaXMubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0YmluZGluZ3NGb3JQYXRoID0gbmV3IEFycmF5KCBuT2JqZWN0cyApO1xuXG5cdFx0aW5kZXggPSBiaW5kaW5ncy5sZW5ndGg7XG5cblx0XHRpbmRpY2VzQnlQYXRoWyBwYXRoIF0gPSBpbmRleDtcblxuXHRcdHBhdGhzLnB1c2goIHBhdGggKTtcblx0XHRwYXJzZWRQYXRocy5wdXNoKCBwYXJzZWRQYXRoICk7XG5cdFx0YmluZGluZ3MucHVzaCggYmluZGluZ3NGb3JQYXRoICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IG5DYWNoZWRPYmplY3RzLCBuID0gb2JqZWN0cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHZhciBvYmplY3QgPSBvYmplY3RzWyBpIF07XG5cdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGkgXSA9IG5ldyBQcm9wZXJ0eUJpbmRpbmcoIG9iamVjdCwgcGF0aCwgcGFyc2VkUGF0aCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGJpbmRpbmdzRm9yUGF0aDtcblxuXHR9LFxuXG5cdHVuc3Vic2NyaWJlXzogZnVuY3Rpb24gKCBwYXRoICkge1xuXG5cdFx0Ly8gdGVsbHMgdGhlIGdyb3VwIHRvIGZvcmdldCBhYm91dCBhIHByb3BlcnR5IHBhdGggYW5kIG5vIGxvbmdlclxuXHRcdC8vIHVwZGF0ZSB0aGUgYXJyYXkgcHJldmlvdXNseSBvYnRhaW5lZCB3aXRoICdzdWJzY3JpYmVfJ1xuXG5cdFx0dmFyIGluZGljZXNCeVBhdGggPSB0aGlzLl9iaW5kaW5nc0luZGljZXNCeVBhdGgsXG5cdFx0XHRpbmRleCA9IGluZGljZXNCeVBhdGhbIHBhdGggXTtcblxuXHRcdGlmICggaW5kZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIHBhdGhzID0gdGhpcy5fcGF0aHMsXG5cdFx0XHRcdHBhcnNlZFBhdGhzID0gdGhpcy5fcGFyc2VkUGF0aHMsXG5cdFx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRcdGxhc3RCaW5kaW5nc0luZGV4ID0gYmluZGluZ3MubGVuZ3RoIC0gMSxcblx0XHRcdFx0bGFzdEJpbmRpbmdzID0gYmluZGluZ3NbIGxhc3RCaW5kaW5nc0luZGV4IF0sXG5cdFx0XHRcdGxhc3RCaW5kaW5nc1BhdGggPSBwYXRoWyBsYXN0QmluZGluZ3NJbmRleCBdO1xuXG5cdFx0XHRpbmRpY2VzQnlQYXRoWyBsYXN0QmluZGluZ3NQYXRoIF0gPSBpbmRleDtcblxuXHRcdFx0YmluZGluZ3NbIGluZGV4IF0gPSBsYXN0QmluZGluZ3M7XG5cdFx0XHRiaW5kaW5ncy5wb3AoKTtcblxuXHRcdFx0cGFyc2VkUGF0aHNbIGluZGV4IF0gPSBwYXJzZWRQYXRoc1sgbGFzdEJpbmRpbmdzSW5kZXggXTtcblx0XHRcdHBhcnNlZFBhdGhzLnBvcCgpO1xuXG5cdFx0XHRwYXRoc1sgaW5kZXggXSA9IHBhdGhzWyBsYXN0QmluZGluZ3NJbmRleCBdO1xuXHRcdFx0cGF0aHMucG9wKCk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEFjdGlvbiBwcm92aWRlZCBieSBBbmltYXRpb25NaXhlciBmb3Igc2NoZWR1bGluZyBjbGlwIHBsYXliYWNrIG9uIHNwZWNpZmljXG4gKiBvYmplY3RzLlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqXG4gKi9cblxuZnVuY3Rpb24gQW5pbWF0aW9uQWN0aW9uKCBtaXhlciwgY2xpcCwgbG9jYWxSb290ICkge1xuXG5cdHRoaXMuX21peGVyID0gbWl4ZXI7XG5cdHRoaXMuX2NsaXAgPSBjbGlwO1xuXHR0aGlzLl9sb2NhbFJvb3QgPSBsb2NhbFJvb3QgfHwgbnVsbDtcblxuXHR2YXIgdHJhY2tzID0gY2xpcC50cmFja3MsXG5cdFx0blRyYWNrcyA9IHRyYWNrcy5sZW5ndGgsXG5cdFx0aW50ZXJwb2xhbnRzID0gbmV3IEFycmF5KCBuVHJhY2tzICk7XG5cblx0dmFyIGludGVycG9sYW50U2V0dGluZ3MgPSB7XG5cdFx0ZW5kaW5nU3RhcnQ6IFplcm9DdXJ2YXR1cmVFbmRpbmcsXG5cdFx0ZW5kaW5nRW5kOiBaZXJvQ3VydmF0dXJlRW5kaW5nXG5cdH07XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuVHJhY2tzOyArKyBpICkge1xuXG5cdFx0dmFyIGludGVycG9sYW50ID0gdHJhY2tzWyBpIF0uY3JlYXRlSW50ZXJwb2xhbnQoIG51bGwgKTtcblx0XHRpbnRlcnBvbGFudHNbIGkgXSA9IGludGVycG9sYW50O1xuXHRcdGludGVycG9sYW50LnNldHRpbmdzID0gaW50ZXJwb2xhbnRTZXR0aW5ncztcblxuXHR9XG5cblx0dGhpcy5faW50ZXJwb2xhbnRTZXR0aW5ncyA9IGludGVycG9sYW50U2V0dGluZ3M7XG5cblx0dGhpcy5faW50ZXJwb2xhbnRzID0gaW50ZXJwb2xhbnRzO1x0Ly8gYm91bmQgYnkgdGhlIG1peGVyXG5cblx0Ly8gaW5zaWRlOiBQcm9wZXJ0eU1peGVyIChtYW5hZ2VkIGJ5IHRoZSBtaXhlcilcblx0dGhpcy5fcHJvcGVydHlCaW5kaW5ncyA9IG5ldyBBcnJheSggblRyYWNrcyApO1xuXG5cdHRoaXMuX2NhY2hlSW5kZXggPSBudWxsO1x0XHRcdC8vIGZvciB0aGUgbWVtb3J5IG1hbmFnZXJcblx0dGhpcy5fYnlDbGlwQ2FjaGVJbmRleCA9IG51bGw7XHRcdC8vIGZvciB0aGUgbWVtb3J5IG1hbmFnZXJcblxuXHR0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudCA9IG51bGw7XG5cdHRoaXMuX3dlaWdodEludGVycG9sYW50ID0gbnVsbDtcblxuXHR0aGlzLmxvb3AgPSBMb29wUmVwZWF0O1xuXHR0aGlzLl9sb29wQ291bnQgPSAtIDE7XG5cblx0Ly8gZ2xvYmFsIG1peGVyIHRpbWUgd2hlbiB0aGUgYWN0aW9uIGlzIHRvIGJlIHN0YXJ0ZWRcblx0Ly8gaXQncyBzZXQgYmFjayB0byAnbnVsbCcgdXBvbiBzdGFydCBvZiB0aGUgYWN0aW9uXG5cdHRoaXMuX3N0YXJ0VGltZSA9IG51bGw7XG5cblx0Ly8gc2NhbGVkIGxvY2FsIHRpbWUgb2YgdGhlIGFjdGlvblxuXHQvLyBnZXRzIGNsYW1wZWQgb3Igd3JhcHBlZCB0byAwLi5jbGlwLmR1cmF0aW9uIGFjY29yZGluZyB0byBsb29wXG5cdHRoaXMudGltZSA9IDA7XG5cblx0dGhpcy50aW1lU2NhbGUgPSAxO1xuXHR0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUgPSAxO1xuXG5cdHRoaXMud2VpZ2h0ID0gMTtcblx0dGhpcy5fZWZmZWN0aXZlV2VpZ2h0ID0gMTtcblxuXHR0aGlzLnJlcGV0aXRpb25zID0gSW5maW5pdHk7IFx0XHQvLyBuby4gb2YgcmVwZXRpdGlvbnMgd2hlbiBsb29waW5nXG5cblx0dGhpcy5wYXVzZWQgPSBmYWxzZTtcdFx0XHRcdC8vIHRydWUgLT4gemVybyBlZmZlY3RpdmUgdGltZSBzY2FsZVxuXHR0aGlzLmVuYWJsZWQgPSB0cnVlO1x0XHRcdFx0Ly8gZmFsc2UgLT4gemVybyBlZmZlY3RpdmUgd2VpZ2h0XG5cblx0dGhpcy5jbGFtcFdoZW5GaW5pc2hlZCBcdD0gZmFsc2U7XHQvLyBrZWVwIGZlZWRpbmcgdGhlIGxhc3QgZnJhbWU/XG5cblx0dGhpcy56ZXJvU2xvcGVBdFN0YXJ0IFx0PSB0cnVlO1x0XHQvLyBmb3Igc21vb3RoIGludGVycG9sYXRpb24gdy9vIHNlcGFyYXRlXG5cdHRoaXMuemVyb1Nsb3BlQXRFbmRcdFx0PSB0cnVlO1x0XHQvLyBjbGlwcyBmb3Igc3RhcnQsIGxvb3AgYW5kIGVuZFxuXG59XG5cbk9iamVjdC5hc3NpZ24oIEFuaW1hdGlvbkFjdGlvbi5wcm90b3R5cGUsIHtcblxuXHQvLyBTdGF0ZSAmIFNjaGVkdWxpbmdcblxuXHRwbGF5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLl9taXhlci5fYWN0aXZhdGVBY3Rpb24oIHRoaXMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3RvcDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5fbWl4ZXIuX2RlYWN0aXZhdGVBY3Rpb24oIHRoaXMgKTtcblxuXHRcdHJldHVybiB0aGlzLnJlc2V0KCk7XG5cblx0fSxcblxuXHRyZXNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5wYXVzZWQgPSBmYWxzZTtcblx0XHR0aGlzLmVuYWJsZWQgPSB0cnVlO1xuXG5cdFx0dGhpcy50aW1lID0gMDtcdFx0XHQvLyByZXN0YXJ0IGNsaXBcblx0XHR0aGlzLl9sb29wQ291bnQgPSAtIDE7XHQvLyBmb3JnZXQgcHJldmlvdXMgbG9vcHNcblx0XHR0aGlzLl9zdGFydFRpbWUgPSBudWxsO1x0Ly8gZm9yZ2V0IHNjaGVkdWxpbmdcblxuXHRcdHJldHVybiB0aGlzLnN0b3BGYWRpbmcoKS5zdG9wV2FycGluZygpO1xuXG5cdH0sXG5cblx0aXNSdW5uaW5nOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5lbmFibGVkICYmICEgdGhpcy5wYXVzZWQgJiYgdGhpcy50aW1lU2NhbGUgIT09IDAgJiZcblx0XHRcdFx0dGhpcy5fc3RhcnRUaW1lID09PSBudWxsICYmIHRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbiggdGhpcyApO1xuXG5cdH0sXG5cblx0Ly8gcmV0dXJuIHRydWUgd2hlbiBwbGF5IGhhcyBiZWVuIGNhbGxlZFxuXHRpc1NjaGVkdWxlZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbiggdGhpcyApO1xuXG5cdH0sXG5cblx0c3RhcnRBdDogZnVuY3Rpb24gKCB0aW1lICkge1xuXG5cdFx0dGhpcy5fc3RhcnRUaW1lID0gdGltZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0TG9vcDogZnVuY3Rpb24gKCBtb2RlLCByZXBldGl0aW9ucyApIHtcblxuXHRcdHRoaXMubG9vcCA9IG1vZGU7XG5cdFx0dGhpcy5yZXBldGl0aW9ucyA9IHJlcGV0aXRpb25zO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBXZWlnaHRcblxuXHQvLyBzZXQgdGhlIHdlaWdodCBzdG9wcGluZyBhbnkgc2NoZWR1bGVkIGZhZGluZ1xuXHQvLyBhbHRob3VnaCAuZW5hYmxlZCA9IGZhbHNlIHlpZWxkcyBhbiBlZmZlY3RpdmUgd2VpZ2h0IG9mIHplcm8sIHRoaXNcblx0Ly8gbWV0aG9kIGRvZXMgKm5vdCogY2hhbmdlIC5lbmFibGVkLCBiZWNhdXNlIGl0IHdvdWxkIGJlIGNvbmZ1c2luZ1xuXHRzZXRFZmZlY3RpdmVXZWlnaHQ6IGZ1bmN0aW9uICggd2VpZ2h0ICkge1xuXG5cdFx0dGhpcy53ZWlnaHQgPSB3ZWlnaHQ7XG5cblx0XHQvLyBub3RlOiBzYW1lIGxvZ2ljIGFzIHdoZW4gdXBkYXRlZCBhdCBydW50aW1lXG5cdFx0dGhpcy5fZWZmZWN0aXZlV2VpZ2h0ID0gdGhpcy5lbmFibGVkID8gd2VpZ2h0IDogMDtcblxuXHRcdHJldHVybiB0aGlzLnN0b3BGYWRpbmcoKTtcblxuXHR9LFxuXG5cdC8vIHJldHVybiB0aGUgd2VpZ2h0IGNvbnNpZGVyaW5nIGZhZGluZyBhbmQgLmVuYWJsZWRcblx0Z2V0RWZmZWN0aXZlV2VpZ2h0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fZWZmZWN0aXZlV2VpZ2h0O1xuXG5cdH0sXG5cblx0ZmFkZUluOiBmdW5jdGlvbiAoIGR1cmF0aW9uICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKCBkdXJhdGlvbiwgMCwgMSApO1xuXG5cdH0sXG5cblx0ZmFkZU91dDogZnVuY3Rpb24gKCBkdXJhdGlvbiApIHtcblxuXHRcdHJldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyggZHVyYXRpb24sIDEsIDAgKTtcblxuXHR9LFxuXG5cdGNyb3NzRmFkZUZyb206IGZ1bmN0aW9uICggZmFkZU91dEFjdGlvbiwgZHVyYXRpb24sIHdhcnAgKSB7XG5cblx0XHRmYWRlT3V0QWN0aW9uLmZhZGVPdXQoIGR1cmF0aW9uICk7XG5cdFx0dGhpcy5mYWRlSW4oIGR1cmF0aW9uICk7XG5cblx0XHRpZiAoIHdhcnAgKSB7XG5cblx0XHRcdHZhciBmYWRlSW5EdXJhdGlvbiA9IHRoaXMuX2NsaXAuZHVyYXRpb24sXG5cdFx0XHRcdGZhZGVPdXREdXJhdGlvbiA9IGZhZGVPdXRBY3Rpb24uX2NsaXAuZHVyYXRpb24sXG5cblx0XHRcdFx0c3RhcnRFbmRSYXRpbyA9IGZhZGVPdXREdXJhdGlvbiAvIGZhZGVJbkR1cmF0aW9uLFxuXHRcdFx0XHRlbmRTdGFydFJhdGlvID0gZmFkZUluRHVyYXRpb24gLyBmYWRlT3V0RHVyYXRpb247XG5cblx0XHRcdGZhZGVPdXRBY3Rpb24ud2FycCggMS4wLCBzdGFydEVuZFJhdGlvLCBkdXJhdGlvbiApO1xuXHRcdFx0dGhpcy53YXJwKCBlbmRTdGFydFJhdGlvLCAxLjAsIGR1cmF0aW9uICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNyb3NzRmFkZVRvOiBmdW5jdGlvbiAoIGZhZGVJbkFjdGlvbiwgZHVyYXRpb24sIHdhcnAgKSB7XG5cblx0XHRyZXR1cm4gZmFkZUluQWN0aW9uLmNyb3NzRmFkZUZyb20oIHRoaXMsIGR1cmF0aW9uLCB3YXJwICk7XG5cblx0fSxcblxuXHRzdG9wRmFkaW5nOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgd2VpZ2h0SW50ZXJwb2xhbnQgPSB0aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtcblxuXHRcdGlmICggd2VpZ2h0SW50ZXJwb2xhbnQgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuX3dlaWdodEludGVycG9sYW50ID0gbnVsbDtcblx0XHRcdHRoaXMuX21peGVyLl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCggd2VpZ2h0SW50ZXJwb2xhbnQgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gVGltZSBTY2FsZSBDb250cm9sXG5cblx0Ly8gc2V0IHRoZSB0aW1lIHNjYWxlIHN0b3BwaW5nIGFueSBzY2hlZHVsZWQgd2FycGluZ1xuXHQvLyBhbHRob3VnaCAucGF1c2VkID0gdHJ1ZSB5aWVsZHMgYW4gZWZmZWN0aXZlIHRpbWUgc2NhbGUgb2YgemVybywgdGhpc1xuXHQvLyBtZXRob2QgZG9lcyAqbm90KiBjaGFuZ2UgLnBhdXNlZCwgYmVjYXVzZSBpdCB3b3VsZCBiZSBjb25mdXNpbmdcblx0c2V0RWZmZWN0aXZlVGltZVNjYWxlOiBmdW5jdGlvbiAoIHRpbWVTY2FsZSApIHtcblxuXHRcdHRoaXMudGltZVNjYWxlID0gdGltZVNjYWxlO1xuXHRcdHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSA9IHRoaXMucGF1c2VkID8gMCA6IHRpbWVTY2FsZTtcblxuXHRcdHJldHVybiB0aGlzLnN0b3BXYXJwaW5nKCk7XG5cblx0fSxcblxuXHQvLyByZXR1cm4gdGhlIHRpbWUgc2NhbGUgY29uc2lkZXJpbmcgd2FycGluZyBhbmQgLnBhdXNlZFxuXHRnZXRFZmZlY3RpdmVUaW1lU2NhbGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGU7XG5cblx0fSxcblxuXHRzZXREdXJhdGlvbjogZnVuY3Rpb24gKCBkdXJhdGlvbiApIHtcblxuXHRcdHRoaXMudGltZVNjYWxlID0gdGhpcy5fY2xpcC5kdXJhdGlvbiAvIGR1cmF0aW9uO1xuXG5cdFx0cmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKTtcblxuXHR9LFxuXG5cdHN5bmNXaXRoOiBmdW5jdGlvbiAoIGFjdGlvbiApIHtcblxuXHRcdHRoaXMudGltZSA9IGFjdGlvbi50aW1lO1xuXHRcdHRoaXMudGltZVNjYWxlID0gYWN0aW9uLnRpbWVTY2FsZTtcblxuXHRcdHJldHVybiB0aGlzLnN0b3BXYXJwaW5nKCk7XG5cblx0fSxcblxuXHRoYWx0OiBmdW5jdGlvbiAoIGR1cmF0aW9uICkge1xuXG5cdFx0cmV0dXJuIHRoaXMud2FycCggdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlLCAwLCBkdXJhdGlvbiApO1xuXG5cdH0sXG5cblx0d2FycDogZnVuY3Rpb24gKCBzdGFydFRpbWVTY2FsZSwgZW5kVGltZVNjYWxlLCBkdXJhdGlvbiApIHtcblxuXHRcdHZhciBtaXhlciA9IHRoaXMuX21peGVyLCBub3cgPSBtaXhlci50aW1lLFxuXHRcdFx0aW50ZXJwb2xhbnQgPSB0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudCxcblxuXHRcdFx0dGltZVNjYWxlID0gdGhpcy50aW1lU2NhbGU7XG5cblx0XHRpZiAoIGludGVycG9sYW50ID09PSBudWxsICkge1xuXG5cdFx0XHRpbnRlcnBvbGFudCA9IG1peGVyLl9sZW5kQ29udHJvbEludGVycG9sYW50KCk7XG5cdFx0XHR0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudCA9IGludGVycG9sYW50O1xuXG5cdFx0fVxuXG5cdFx0dmFyIHRpbWVzID0gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zLFxuXHRcdFx0dmFsdWVzID0gaW50ZXJwb2xhbnQuc2FtcGxlVmFsdWVzO1xuXG5cdFx0dGltZXNbIDAgXSA9IG5vdztcblx0XHR0aW1lc1sgMSBdID0gbm93ICsgZHVyYXRpb247XG5cblx0XHR2YWx1ZXNbIDAgXSA9IHN0YXJ0VGltZVNjYWxlIC8gdGltZVNjYWxlO1xuXHRcdHZhbHVlc1sgMSBdID0gZW5kVGltZVNjYWxlIC8gdGltZVNjYWxlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdG9wV2FycGluZzogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRpbWVTY2FsZUludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7XG5cblx0XHRpZiAoIHRpbWVTY2FsZUludGVycG9sYW50ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudCA9IG51bGw7XG5cdFx0XHR0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoIHRpbWVTY2FsZUludGVycG9sYW50ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIE9iamVjdCBBY2Nlc3NvcnNcblxuXHRnZXRNaXhlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX21peGVyO1xuXG5cdH0sXG5cblx0Z2V0Q2xpcDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX2NsaXA7XG5cblx0fSxcblxuXHRnZXRSb290OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fbG9jYWxSb290IHx8IHRoaXMuX21peGVyLl9yb290O1xuXG5cdH0sXG5cblx0Ly8gSW50ZXJuYVxuXG5cdF91cGRhdGU6IGZ1bmN0aW9uICggdGltZSwgZGVsdGFUaW1lLCB0aW1lRGlyZWN0aW9uLCBhY2N1SW5kZXggKSB7XG5cblx0XHQvLyBjYWxsZWQgYnkgdGhlIG1peGVyXG5cblx0XHRpZiAoICEgdGhpcy5lbmFibGVkICkge1xuXG5cdFx0XHQvLyBjYWxsIC5fdXBkYXRlV2VpZ2h0KCkgdG8gdXBkYXRlIC5fZWZmZWN0aXZlV2VpZ2h0XG5cblx0XHRcdHRoaXMuX3VwZGF0ZVdlaWdodCggdGltZSApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHN0YXJ0VGltZSA9IHRoaXMuX3N0YXJ0VGltZTtcblxuXHRcdGlmICggc3RhcnRUaW1lICE9PSBudWxsICkge1xuXG5cdFx0XHQvLyBjaGVjayBmb3Igc2NoZWR1bGVkIHN0YXJ0IG9mIGFjdGlvblxuXG5cdFx0XHR2YXIgdGltZVJ1bm5pbmcgPSAoIHRpbWUgLSBzdGFydFRpbWUgKSAqIHRpbWVEaXJlY3Rpb247XG5cdFx0XHRpZiAoIHRpbWVSdW5uaW5nIDwgMCB8fCB0aW1lRGlyZWN0aW9uID09PSAwICkge1xuXG5cdFx0XHRcdHJldHVybjsgLy8geWV0IHRvIGNvbWUgLyBkb24ndCBkZWNpZGUgd2hlbiBkZWx0YSA9IDBcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBzdGFydFxuXG5cdFx0XHR0aGlzLl9zdGFydFRpbWUgPSBudWxsOyAvLyB1bnNjaGVkdWxlXG5cdFx0XHRkZWx0YVRpbWUgPSB0aW1lRGlyZWN0aW9uICogdGltZVJ1bm5pbmc7XG5cblx0XHR9XG5cblx0XHQvLyBhcHBseSB0aW1lIHNjYWxlIGFuZCBhZHZhbmNlIHRpbWVcblxuXHRcdGRlbHRhVGltZSAqPSB0aGlzLl91cGRhdGVUaW1lU2NhbGUoIHRpbWUgKTtcblx0XHR2YXIgY2xpcFRpbWUgPSB0aGlzLl91cGRhdGVUaW1lKCBkZWx0YVRpbWUgKTtcblxuXHRcdC8vIG5vdGU6IF91cGRhdGVUaW1lIG1heSBkaXNhYmxlIHRoZSBhY3Rpb24gcmVzdWx0aW5nIGluXG5cdFx0Ly8gYW4gZWZmZWN0aXZlIHdlaWdodCBvZiAwXG5cblx0XHR2YXIgd2VpZ2h0ID0gdGhpcy5fdXBkYXRlV2VpZ2h0KCB0aW1lICk7XG5cblx0XHRpZiAoIHdlaWdodCA+IDAgKSB7XG5cblx0XHRcdHZhciBpbnRlcnBvbGFudHMgPSB0aGlzLl9pbnRlcnBvbGFudHM7XG5cdFx0XHR2YXIgcHJvcGVydHlNaXhlcnMgPSB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzO1xuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDAsIG0gPSBpbnRlcnBvbGFudHMubGVuZ3RoOyBqICE9PSBtOyArKyBqICkge1xuXG5cdFx0XHRcdGludGVycG9sYW50c1sgaiBdLmV2YWx1YXRlKCBjbGlwVGltZSApO1xuXHRcdFx0XHRwcm9wZXJ0eU1peGVyc1sgaiBdLmFjY3VtdWxhdGUoIGFjY3VJbmRleCwgd2VpZ2h0ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdF91cGRhdGVXZWlnaHQ6IGZ1bmN0aW9uICggdGltZSApIHtcblxuXHRcdHZhciB3ZWlnaHQgPSAwO1xuXG5cdFx0aWYgKCB0aGlzLmVuYWJsZWQgKSB7XG5cblx0XHRcdHdlaWdodCA9IHRoaXMud2VpZ2h0O1xuXHRcdFx0dmFyIGludGVycG9sYW50ID0gdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7XG5cblx0XHRcdGlmICggaW50ZXJwb2xhbnQgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0dmFyIGludGVycG9sYW50VmFsdWUgPSBpbnRlcnBvbGFudC5ldmFsdWF0ZSggdGltZSApWyAwIF07XG5cblx0XHRcdFx0d2VpZ2h0ICo9IGludGVycG9sYW50VmFsdWU7XG5cblx0XHRcdFx0aWYgKCB0aW1lID4gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zWyAxIF0gKSB7XG5cblx0XHRcdFx0XHR0aGlzLnN0b3BGYWRpbmcoKTtcblxuXHRcdFx0XHRcdGlmICggaW50ZXJwb2xhbnRWYWx1ZSA9PT0gMCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gZmFkZWQgb3V0LCBkaXNhYmxlXG5cdFx0XHRcdFx0XHR0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IHdlaWdodDtcblx0XHRyZXR1cm4gd2VpZ2h0O1xuXG5cdH0sXG5cblx0X3VwZGF0ZVRpbWVTY2FsZTogZnVuY3Rpb24gKCB0aW1lICkge1xuXG5cdFx0dmFyIHRpbWVTY2FsZSA9IDA7XG5cblx0XHRpZiAoICEgdGhpcy5wYXVzZWQgKSB7XG5cblx0XHRcdHRpbWVTY2FsZSA9IHRoaXMudGltZVNjYWxlO1xuXG5cdFx0XHR2YXIgaW50ZXJwb2xhbnQgPSB0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtcblxuXHRcdFx0aWYgKCBpbnRlcnBvbGFudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHR2YXIgaW50ZXJwb2xhbnRWYWx1ZSA9IGludGVycG9sYW50LmV2YWx1YXRlKCB0aW1lIClbIDAgXTtcblxuXHRcdFx0XHR0aW1lU2NhbGUgKj0gaW50ZXJwb2xhbnRWYWx1ZTtcblxuXHRcdFx0XHRpZiAoIHRpbWUgPiBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnNbIDEgXSApIHtcblxuXHRcdFx0XHRcdHRoaXMuc3RvcFdhcnBpbmcoKTtcblxuXHRcdFx0XHRcdGlmICggdGltZVNjYWxlID09PSAwICkge1xuXG5cdFx0XHRcdFx0XHQvLyBtb3Rpb24gaGFzIGhhbHRlZCwgcGF1c2Vcblx0XHRcdFx0XHRcdHRoaXMucGF1c2VkID0gdHJ1ZTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdC8vIHdhcnAgZG9uZSAtIGFwcGx5IGZpbmFsIHRpbWUgc2NhbGVcblx0XHRcdFx0XHRcdHRoaXMudGltZVNjYWxlID0gdGltZVNjYWxlO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlID0gdGltZVNjYWxlO1xuXHRcdHJldHVybiB0aW1lU2NhbGU7XG5cblx0fSxcblxuXHRfdXBkYXRlVGltZTogZnVuY3Rpb24gKCBkZWx0YVRpbWUgKSB7XG5cblx0XHR2YXIgdGltZSA9IHRoaXMudGltZSArIGRlbHRhVGltZTtcblxuXHRcdGlmICggZGVsdGFUaW1lID09PSAwICkgcmV0dXJuIHRpbWU7XG5cblx0XHR2YXIgZHVyYXRpb24gPSB0aGlzLl9jbGlwLmR1cmF0aW9uLFxuXG5cdFx0XHRsb29wID0gdGhpcy5sb29wLFxuXHRcdFx0bG9vcENvdW50ID0gdGhpcy5fbG9vcENvdW50O1xuXG5cdFx0aWYgKCBsb29wID09PSBMb29wT25jZSApIHtcblxuXHRcdFx0aWYgKCBsb29wQ291bnQgPT09IC0gMSApIHtcblxuXHRcdFx0XHQvLyBqdXN0IHN0YXJ0ZWRcblxuXHRcdFx0XHR0aGlzLl9sb29wQ291bnQgPSAwO1xuXHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCB0cnVlLCB0cnVlLCBmYWxzZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGhhbmRsZV9zdG9wOiB7XG5cblx0XHRcdFx0aWYgKCB0aW1lID49IGR1cmF0aW9uICkge1xuXG5cdFx0XHRcdFx0dGltZSA9IGR1cmF0aW9uO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHRpbWUgPCAwICkge1xuXG5cdFx0XHRcdFx0dGltZSA9IDA7XG5cblx0XHRcdFx0fSBlbHNlIGJyZWFrIGhhbmRsZV9zdG9wO1xuXG5cdFx0XHRcdGlmICggdGhpcy5jbGFtcFdoZW5GaW5pc2hlZCApIHRoaXMucGF1c2VkID0gdHJ1ZTtcblx0XHRcdFx0ZWxzZSB0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblxuXHRcdFx0XHR0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KCB7XG5cdFx0XHRcdFx0dHlwZTogJ2ZpbmlzaGVkJywgYWN0aW9uOiB0aGlzLFxuXHRcdFx0XHRcdGRpcmVjdGlvbjogZGVsdGFUaW1lIDwgMCA/IC0gMSA6IDFcblx0XHRcdFx0fSApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgeyAvLyByZXBldGl0aXZlIFJlcGVhdCBvciBQaW5nUG9uZ1xuXG5cdFx0XHR2YXIgcGluZ1BvbmcgPSAoIGxvb3AgPT09IExvb3BQaW5nUG9uZyApO1xuXG5cdFx0XHRpZiAoIGxvb3BDb3VudCA9PT0gLSAxICkge1xuXG5cdFx0XHRcdC8vIGp1c3Qgc3RhcnRlZFxuXG5cdFx0XHRcdGlmICggZGVsdGFUaW1lID49IDAgKSB7XG5cblx0XHRcdFx0XHRsb29wQ291bnQgPSAwO1xuXG5cdFx0XHRcdFx0dGhpcy5fc2V0RW5kaW5ncyggdHJ1ZSwgdGhpcy5yZXBldGl0aW9ucyA9PT0gMCwgcGluZ1BvbmcgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gd2hlbiBsb29waW5nIGluIHJldmVyc2UgZGlyZWN0aW9uLCB0aGUgaW5pdGlhbFxuXHRcdFx0XHRcdC8vIHRyYW5zaXRpb24gdGhyb3VnaCB6ZXJvIGNvdW50cyBhcyBhIHJlcGV0aXRpb24sXG5cdFx0XHRcdFx0Ly8gc28gbGVhdmUgbG9vcENvdW50IGF0IC0xXG5cblx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCB0aGlzLnJlcGV0aXRpb25zID09PSAwLCB0cnVlLCBwaW5nUG9uZyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHRpbWUgPj0gZHVyYXRpb24gfHwgdGltZSA8IDAgKSB7XG5cblx0XHRcdFx0Ly8gd3JhcCBhcm91bmRcblxuXHRcdFx0XHR2YXIgbG9vcERlbHRhID0gTWF0aC5mbG9vciggdGltZSAvIGR1cmF0aW9uICk7IC8vIHNpZ25lZFxuXHRcdFx0XHR0aW1lIC09IGR1cmF0aW9uICogbG9vcERlbHRhO1xuXG5cdFx0XHRcdGxvb3BDb3VudCArPSBNYXRoLmFicyggbG9vcERlbHRhICk7XG5cblx0XHRcdFx0dmFyIHBlbmRpbmcgPSB0aGlzLnJlcGV0aXRpb25zIC0gbG9vcENvdW50O1xuXG5cdFx0XHRcdGlmICggcGVuZGluZyA8PSAwICkge1xuXG5cdFx0XHRcdFx0Ly8gaGF2ZSB0byBzdG9wIChzd2l0Y2ggc3RhdGUsIGNsYW1wIHRpbWUsIGZpcmUgZXZlbnQpXG5cblx0XHRcdFx0XHRpZiAoIHRoaXMuY2xhbXBXaGVuRmluaXNoZWQgKSB0aGlzLnBhdXNlZCA9IHRydWU7XG5cdFx0XHRcdFx0ZWxzZSB0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRcdHRpbWUgPSBkZWx0YVRpbWUgPiAwID8gZHVyYXRpb24gOiAwO1xuXG5cdFx0XHRcdFx0dGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCgge1xuXHRcdFx0XHRcdFx0dHlwZTogJ2ZpbmlzaGVkJywgYWN0aW9uOiB0aGlzLFxuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBkZWx0YVRpbWUgPiAwID8gMSA6IC0gMVxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8ga2VlcCBydW5uaW5nXG5cblx0XHRcdFx0XHRpZiAoIHBlbmRpbmcgPT09IDEgKSB7XG5cblx0XHRcdFx0XHRcdC8vIGVudGVyaW5nIHRoZSBsYXN0IHJvdW5kXG5cblx0XHRcdFx0XHRcdHZhciBhdFN0YXJ0ID0gZGVsdGFUaW1lIDwgMDtcblx0XHRcdFx0XHRcdHRoaXMuX3NldEVuZGluZ3MoIGF0U3RhcnQsICEgYXRTdGFydCwgcGluZ1BvbmcgKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHRoaXMuX3NldEVuZGluZ3MoIGZhbHNlLCBmYWxzZSwgcGluZ1BvbmcgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRoaXMuX2xvb3BDb3VudCA9IGxvb3BDb3VudDtcblxuXHRcdFx0XHRcdHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoIHtcblx0XHRcdFx0XHRcdHR5cGU6ICdsb29wJywgYWN0aW9uOiB0aGlzLCBsb29wRGVsdGE6IGxvb3BEZWx0YVxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBwaW5nUG9uZyAmJiAoIGxvb3BDb3VudCAmIDEgKSA9PT0gMSApIHtcblxuXHRcdFx0XHQvLyBpbnZlcnQgdGltZSBmb3IgdGhlIFwicG9uZyByb3VuZFwiXG5cblx0XHRcdFx0dGhpcy50aW1lID0gdGltZTtcblx0XHRcdFx0cmV0dXJuIGR1cmF0aW9uIC0gdGltZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy50aW1lID0gdGltZTtcblx0XHRyZXR1cm4gdGltZTtcblxuXHR9LFxuXG5cdF9zZXRFbmRpbmdzOiBmdW5jdGlvbiAoIGF0U3RhcnQsIGF0RW5kLCBwaW5nUG9uZyApIHtcblxuXHRcdHZhciBzZXR0aW5ncyA9IHRoaXMuX2ludGVycG9sYW50U2V0dGluZ3M7XG5cblx0XHRpZiAoIHBpbmdQb25nICkge1xuXG5cdFx0XHRzZXR0aW5ncy5lbmRpbmdTdGFydCBcdD0gWmVyb1Nsb3BlRW5kaW5nO1xuXHRcdFx0c2V0dGluZ3MuZW5kaW5nRW5kXHRcdD0gWmVyb1Nsb3BlRW5kaW5nO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gYXNzdW1pbmcgZm9yIExvb3BPbmNlIGF0U3RhcnQgPT0gYXRFbmQgPT0gdHJ1ZVxuXG5cdFx0XHRpZiAoIGF0U3RhcnQgKSB7XG5cblx0XHRcdFx0c2V0dGluZ3MuZW5kaW5nU3RhcnQgPSB0aGlzLnplcm9TbG9wZUF0U3RhcnQgPyBaZXJvU2xvcGVFbmRpbmcgOiBaZXJvQ3VydmF0dXJlRW5kaW5nO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHNldHRpbmdzLmVuZGluZ1N0YXJ0ID0gV3JhcEFyb3VuZEVuZGluZztcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGF0RW5kICkge1xuXG5cdFx0XHRcdHNldHRpbmdzLmVuZGluZ0VuZCA9IHRoaXMuemVyb1Nsb3BlQXRFbmQgPyBaZXJvU2xvcGVFbmRpbmcgOiBaZXJvQ3VydmF0dXJlRW5kaW5nO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHNldHRpbmdzLmVuZGluZ0VuZCBcdCA9IFdyYXBBcm91bmRFbmRpbmc7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdF9zY2hlZHVsZUZhZGluZzogZnVuY3Rpb24gKCBkdXJhdGlvbiwgd2VpZ2h0Tm93LCB3ZWlnaHRUaGVuICkge1xuXG5cdFx0dmFyIG1peGVyID0gdGhpcy5fbWl4ZXIsIG5vdyA9IG1peGVyLnRpbWUsXG5cdFx0XHRpbnRlcnBvbGFudCA9IHRoaXMuX3dlaWdodEludGVycG9sYW50O1xuXG5cdFx0aWYgKCBpbnRlcnBvbGFudCA9PT0gbnVsbCApIHtcblxuXHRcdFx0aW50ZXJwb2xhbnQgPSBtaXhlci5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpO1xuXHRcdFx0dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudDtcblxuXHRcdH1cblxuXHRcdHZhciB0aW1lcyA9IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9ucyxcblx0XHRcdHZhbHVlcyA9IGludGVycG9sYW50LnNhbXBsZVZhbHVlcztcblxuXHRcdHRpbWVzWyAwIF0gPSBub3c7IFx0XHRcdFx0dmFsdWVzWyAwIF0gPSB3ZWlnaHROb3c7XG5cdFx0dGltZXNbIDEgXSA9IG5vdyArIGR1cmF0aW9uO1x0dmFsdWVzWyAxIF0gPSB3ZWlnaHRUaGVuO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIFBsYXllciBmb3IgQW5pbWF0aW9uQ2xpcHMuXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBBbmltYXRpb25NaXhlciggcm9vdCApIHtcblxuXHR0aGlzLl9yb290ID0gcm9vdDtcblx0dGhpcy5faW5pdE1lbW9yeU1hbmFnZXIoKTtcblx0dGhpcy5fYWNjdUluZGV4ID0gMDtcblxuXHR0aGlzLnRpbWUgPSAwO1xuXG5cdHRoaXMudGltZVNjYWxlID0gMS4wO1xuXG59XG5cbkFuaW1hdGlvbk1peGVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBBbmltYXRpb25NaXhlcixcblxuXHRfYmluZEFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24sIHByb3RvdHlwZUFjdGlvbiApIHtcblxuXHRcdHZhciByb290ID0gYWN0aW9uLl9sb2NhbFJvb3QgfHwgdGhpcy5fcm9vdCxcblx0XHRcdHRyYWNrcyA9IGFjdGlvbi5fY2xpcC50cmFja3MsXG5cdFx0XHRuVHJhY2tzID0gdHJhY2tzLmxlbmd0aCxcblx0XHRcdGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzLFxuXHRcdFx0aW50ZXJwb2xhbnRzID0gYWN0aW9uLl9pbnRlcnBvbGFudHMsXG5cdFx0XHRyb290VXVpZCA9IHJvb3QudXVpZCxcblx0XHRcdGJpbmRpbmdzQnlSb290ID0gdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLFxuXHRcdFx0YmluZGluZ3NCeU5hbWUgPSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXTtcblxuXHRcdGlmICggYmluZGluZ3NCeU5hbWUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0YmluZGluZ3NCeU5hbWUgPSB7fTtcblx0XHRcdGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdID0gYmluZGluZ3NCeU5hbWU7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5UcmFja3M7ICsrIGkgKSB7XG5cblx0XHRcdHZhciB0cmFjayA9IHRyYWNrc1sgaSBdLFxuXHRcdFx0XHR0cmFja05hbWUgPSB0cmFjay5uYW1lLFxuXHRcdFx0XHRiaW5kaW5nID0gYmluZGluZ3NCeU5hbWVbIHRyYWNrTmFtZSBdO1xuXG5cdFx0XHRpZiAoIGJpbmRpbmcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRiaW5kaW5nc1sgaSBdID0gYmluZGluZztcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRiaW5kaW5nID0gYmluZGluZ3NbIGkgXTtcblxuXHRcdFx0XHRpZiAoIGJpbmRpbmcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdC8vIGV4aXN0aW5nIGJpbmRpbmcsIG1ha2Ugc3VyZSB0aGUgY2FjaGUga25vd3NcblxuXHRcdFx0XHRcdGlmICggYmluZGluZy5fY2FjaGVJbmRleCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdFx0KysgYmluZGluZy5yZWZlcmVuY2VDb3VudDtcblx0XHRcdFx0XHRcdHRoaXMuX2FkZEluYWN0aXZlQmluZGluZyggYmluZGluZywgcm9vdFV1aWQsIHRyYWNrTmFtZSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBwYXRoID0gcHJvdG90eXBlQWN0aW9uICYmIHByb3RvdHlwZUFjdGlvbi5cblx0XHRcdFx0XHRfcHJvcGVydHlCaW5kaW5nc1sgaSBdLmJpbmRpbmcucGFyc2VkUGF0aDtcblxuXHRcdFx0XHRiaW5kaW5nID0gbmV3IFByb3BlcnR5TWl4ZXIoXG5cdFx0XHRcdFx0UHJvcGVydHlCaW5kaW5nLmNyZWF0ZSggcm9vdCwgdHJhY2tOYW1lLCBwYXRoICksXG5cdFx0XHRcdFx0dHJhY2suVmFsdWVUeXBlTmFtZSwgdHJhY2suZ2V0VmFsdWVTaXplKCkgKTtcblxuXHRcdFx0XHQrKyBiaW5kaW5nLnJlZmVyZW5jZUNvdW50O1xuXHRcdFx0XHR0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcsIHJvb3RVdWlkLCB0cmFja05hbWUgKTtcblxuXHRcdFx0XHRiaW5kaW5nc1sgaSBdID0gYmluZGluZztcblxuXHRcdFx0fVxuXG5cdFx0XHRpbnRlcnBvbGFudHNbIGkgXS5yZXN1bHRCdWZmZXIgPSBiaW5kaW5nLmJ1ZmZlcjtcblxuXHRcdH1cblxuXHR9LFxuXG5cdF9hY3RpdmF0ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHRpZiAoICEgdGhpcy5faXNBY3RpdmVBY3Rpb24oIGFjdGlvbiApICkge1xuXG5cdFx0XHRpZiAoIGFjdGlvbi5fY2FjaGVJbmRleCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHQvLyB0aGlzIGFjdGlvbiBoYXMgYmVlbiBmb3Jnb3R0ZW4gYnkgdGhlIGNhY2hlLCBidXQgdGhlIHVzZXJcblx0XHRcdFx0Ly8gYXBwZWFycyB0byBiZSBzdGlsbCB1c2luZyBpdCAtPiByZWJpbmRcblxuXHRcdFx0XHR2YXIgcm9vdFV1aWQgPSAoIGFjdGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QgKS51dWlkLFxuXHRcdFx0XHRcdGNsaXBVdWlkID0gYWN0aW9uLl9jbGlwLnV1aWQsXG5cdFx0XHRcdFx0YWN0aW9uc0ZvckNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xuXG5cdFx0XHRcdHRoaXMuX2JpbmRBY3Rpb24oIGFjdGlvbixcblx0XHRcdFx0XHRhY3Rpb25zRm9yQ2xpcCAmJiBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnNbIDAgXSApO1xuXG5cdFx0XHRcdHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKCBhY3Rpb24sIGNsaXBVdWlkLCByb290VXVpZCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncztcblxuXHRcdFx0Ly8gaW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudHMgLyBzb3J0IG91dCBzdGF0ZVxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHZhciBiaW5kaW5nID0gYmluZGluZ3NbIGkgXTtcblxuXHRcdFx0XHRpZiAoIGJpbmRpbmcudXNlQ291bnQgKysgPT09IDAgKSB7XG5cblx0XHRcdFx0XHR0aGlzLl9sZW5kQmluZGluZyggYmluZGluZyApO1xuXHRcdFx0XHRcdGJpbmRpbmcuc2F2ZU9yaWdpbmFsU3RhdGUoKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fbGVuZEFjdGlvbiggYWN0aW9uICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRfZGVhY3RpdmF0ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHRpZiAoIHRoaXMuX2lzQWN0aXZlQWN0aW9uKCBhY3Rpb24gKSApIHtcblxuXHRcdFx0dmFyIGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzO1xuXG5cdFx0XHQvLyBkZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50cyAvIHNvcnQgb3V0IHN0YXRlXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0dmFyIGJpbmRpbmcgPSBiaW5kaW5nc1sgaSBdO1xuXG5cdFx0XHRcdGlmICggLS0gYmluZGluZy51c2VDb3VudCA9PT0gMCApIHtcblxuXHRcdFx0XHRcdGJpbmRpbmcucmVzdG9yZU9yaWdpbmFsU3RhdGUoKTtcblx0XHRcdFx0XHR0aGlzLl90YWtlQmFja0JpbmRpbmcoIGJpbmRpbmcgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fdGFrZUJhY2tBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Ly8gTWVtb3J5IG1hbmFnZXJcblxuXHRfaW5pdE1lbW9yeU1hbmFnZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuX2FjdGlvbnMgPSBbXTsgLy8gJ25BY3RpdmVBY3Rpb25zJyBmb2xsb3dlZCBieSBpbmFjdGl2ZSBvbmVzXG5cdFx0dGhpcy5fbkFjdGl2ZUFjdGlvbnMgPSAwO1xuXG5cdFx0dGhpcy5fYWN0aW9uc0J5Q2xpcCA9IHt9O1xuXHRcdC8vIGluc2lkZTpcblx0XHQvLyB7XG5cdFx0Ly8gXHRcdGtub3duQWN0aW9uczogQXJyYXk8IEFuaW1hdGlvbkFjdGlvbiA+XHQtIHVzZWQgYXMgcHJvdG90eXBlc1xuXHRcdC8vIFx0XHRhY3Rpb25CeVJvb3Q6IEFuaW1hdGlvbkFjdGlvblx0XHRcdC0gbG9va3VwXG5cdFx0Ly8gfVxuXG5cblx0XHR0aGlzLl9iaW5kaW5ncyA9IFtdOyAvLyAnbkFjdGl2ZUJpbmRpbmdzJyBmb2xsb3dlZCBieSBpbmFjdGl2ZSBvbmVzXG5cdFx0dGhpcy5fbkFjdGl2ZUJpbmRpbmdzID0gMDtcblxuXHRcdHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSA9IHt9OyAvLyBpbnNpZGU6IE1hcDwgbmFtZSwgUHJvcGVydHlNaXhlciA+XG5cblxuXHRcdHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMgPSBbXTsgLy8gc2FtZSBnYW1lIGFzIGFib3ZlXG5cdFx0dGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMgPSAwO1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHRoaXMuc3RhdHMgPSB7XG5cblx0XHRcdGFjdGlvbnM6IHtcblx0XHRcdFx0Z2V0IHRvdGFsKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9hY3Rpb25zLmxlbmd0aDtcblxuXHRcdFx0XHR9LFxuXHRcdFx0XHRnZXQgaW5Vc2UoKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX25BY3RpdmVBY3Rpb25zO1xuXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRiaW5kaW5nczoge1xuXHRcdFx0XHRnZXQgdG90YWwoKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX2JpbmRpbmdzLmxlbmd0aDtcblxuXHRcdFx0XHR9LFxuXHRcdFx0XHRnZXQgaW5Vc2UoKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX25BY3RpdmVCaW5kaW5ncztcblxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0Y29udHJvbEludGVycG9sYW50czoge1xuXHRcdFx0XHRnZXQgdG90YWwoKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX2NvbnRyb2xJbnRlcnBvbGFudHMubGVuZ3RoO1xuXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGdldCBpblVzZSgpIHtcblxuXHRcdFx0XHRcdHJldHVybiBzY29wZS5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHM7XG5cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9LFxuXG5cdC8vIE1lbW9yeSBtYW5hZ2VtZW50IGZvciBBbmltYXRpb25BY3Rpb24gb2JqZWN0c1xuXG5cdF9pc0FjdGl2ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHR2YXIgaW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXg7XG5cdFx0cmV0dXJuIGluZGV4ICE9PSBudWxsICYmIGluZGV4IDwgdGhpcy5fbkFjdGl2ZUFjdGlvbnM7XG5cblx0fSxcblxuXHRfYWRkSW5hY3RpdmVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uLCBjbGlwVXVpZCwgcm9vdFV1aWQgKSB7XG5cblx0XHR2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcCxcblx0XHRcdGFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdGlmICggYWN0aW9uc0ZvckNsaXAgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0YWN0aW9uc0ZvckNsaXAgPSB7XG5cblx0XHRcdFx0a25vd25BY3Rpb25zOiBbIGFjdGlvbiBdLFxuXHRcdFx0XHRhY3Rpb25CeVJvb3Q6IHt9XG5cblx0XHRcdH07XG5cblx0XHRcdGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IDA7XG5cblx0XHRcdGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF0gPSBhY3Rpb25zRm9yQ2xpcDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHZhciBrbm93bkFjdGlvbnMgPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnM7XG5cblx0XHRcdGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IGtub3duQWN0aW9ucy5sZW5ndGg7XG5cdFx0XHRrbm93bkFjdGlvbnMucHVzaCggYWN0aW9uICk7XG5cblx0XHR9XG5cblx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBhY3Rpb25zLmxlbmd0aDtcblx0XHRhY3Rpb25zLnB1c2goIGFjdGlvbiApO1xuXG5cdFx0YWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290WyByb290VXVpZCBdID0gYWN0aW9uO1xuXG5cdH0sXG5cblx0X3JlbW92ZUluYWN0aXZlQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHtcblxuXHRcdHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdGxhc3RJbmFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGFjdGlvbnMubGVuZ3RoIC0gMSBdLFxuXHRcdFx0Y2FjaGVJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleDtcblxuXHRcdGxhc3RJbmFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IGNhY2hlSW5kZXg7XG5cdFx0YWN0aW9uc1sgY2FjaGVJbmRleCBdID0gbGFzdEluYWN0aXZlQWN0aW9uO1xuXHRcdGFjdGlvbnMucG9wKCk7XG5cblx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBudWxsO1xuXG5cblx0XHR2YXIgY2xpcFV1aWQgPSBhY3Rpb24uX2NsaXAudXVpZCxcblx0XHRcdGFjdGlvbnNCeUNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwLFxuXHRcdFx0YWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdLFxuXHRcdFx0a25vd25BY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9ucyxcblxuXHRcdFx0bGFzdEtub3duQWN0aW9uID1cblx0XHRcdFx0a25vd25BY3Rpb25zRm9yQ2xpcFsga25vd25BY3Rpb25zRm9yQ2xpcC5sZW5ndGggLSAxIF0sXG5cblx0XHRcdGJ5Q2xpcENhY2hlSW5kZXggPSBhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXg7XG5cblx0XHRsYXN0S25vd25BY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBieUNsaXBDYWNoZUluZGV4O1xuXHRcdGtub3duQWN0aW9uc0ZvckNsaXBbIGJ5Q2xpcENhY2hlSW5kZXggXSA9IGxhc3RLbm93bkFjdGlvbjtcblx0XHRrbm93bkFjdGlvbnNGb3JDbGlwLnBvcCgpO1xuXG5cdFx0YWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gbnVsbDtcblxuXG5cdFx0dmFyIGFjdGlvbkJ5Um9vdCA9IGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdCxcblx0XHRcdHJvb3RVdWlkID0gKCBhY3Rpb24uX2xvY2FsUm9vdCB8fCB0aGlzLl9yb290ICkudXVpZDtcblxuXHRcdGRlbGV0ZSBhY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHRpZiAoIGtub3duQWN0aW9uc0ZvckNsaXAubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRkZWxldGUgYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdH1cblxuXHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24oIGFjdGlvbiApO1xuXG5cdH0sXG5cblx0X3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0dmFyIGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzO1xuXHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dmFyIGJpbmRpbmcgPSBiaW5kaW5nc1sgaSBdO1xuXG5cdFx0XHRpZiAoIC0tIGJpbmRpbmcucmVmZXJlbmNlQ291bnQgPT09IDAgKSB7XG5cblx0XHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdF9sZW5kQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHtcblxuXHRcdC8vIFsgYWN0aXZlIGFjdGlvbnMgfCAgaW5hY3RpdmUgYWN0aW9ucyAgXVxuXHRcdC8vIFsgIGFjdGl2ZSBhY3Rpb25zID58IGluYWN0aXZlIGFjdGlvbnMgXVxuXHRcdC8vICAgICAgICAgICAgICAgICBzICAgICAgICBhXG5cdFx0Ly8gICAgICAgICAgICAgICAgICA8LXN3YXAtPlxuXHRcdC8vICAgICAgICAgICAgICAgICBhICAgICAgICBzXG5cblx0XHR2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRwcmV2SW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXgsXG5cblx0XHRcdGxhc3RBY3RpdmVJbmRleCA9IHRoaXMuX25BY3RpdmVBY3Rpb25zICsrLFxuXG5cdFx0XHRmaXJzdEluYWN0aXZlQWN0aW9uID0gYWN0aW9uc1sgbGFzdEFjdGl2ZUluZGV4IF07XG5cblx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBsYXN0QWN0aXZlSW5kZXg7XG5cdFx0YWN0aW9uc1sgbGFzdEFjdGl2ZUluZGV4IF0gPSBhY3Rpb247XG5cblx0XHRmaXJzdEluYWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gcHJldkluZGV4O1xuXHRcdGFjdGlvbnNbIHByZXZJbmRleCBdID0gZmlyc3RJbmFjdGl2ZUFjdGlvbjtcblxuXHR9LFxuXG5cdF90YWtlQmFja0FjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHQvLyBbICBhY3RpdmUgYWN0aW9ucyAgfCBpbmFjdGl2ZSBhY3Rpb25zIF1cblx0XHQvLyBbIGFjdGl2ZSBhY3Rpb25zIHw8IGluYWN0aXZlIGFjdGlvbnMgIF1cblx0XHQvLyAgICAgICAgYSAgICAgICAgc1xuXHRcdC8vICAgICAgICAgPC1zd2FwLT5cblx0XHQvLyAgICAgICAgcyAgICAgICAgYVxuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0cHJldkluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4LFxuXG5cdFx0XHRmaXJzdEluYWN0aXZlSW5kZXggPSAtLSB0aGlzLl9uQWN0aXZlQWN0aW9ucyxcblxuXHRcdFx0bGFzdEFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGZpcnN0SW5hY3RpdmVJbmRleCBdO1xuXG5cdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gZmlyc3RJbmFjdGl2ZUluZGV4O1xuXHRcdGFjdGlvbnNbIGZpcnN0SW5hY3RpdmVJbmRleCBdID0gYWN0aW9uO1xuXG5cdFx0bGFzdEFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcblx0XHRhY3Rpb25zWyBwcmV2SW5kZXggXSA9IGxhc3RBY3RpdmVBY3Rpb247XG5cblx0fSxcblxuXHQvLyBNZW1vcnkgbWFuYWdlbWVudCBmb3IgUHJvcGVydHlNaXhlciBvYmplY3RzXG5cblx0X2FkZEluYWN0aXZlQmluZGluZzogZnVuY3Rpb24gKCBiaW5kaW5nLCByb290VXVpZCwgdHJhY2tOYW1lICkge1xuXG5cdFx0dmFyIGJpbmRpbmdzQnlSb290ID0gdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLFxuXHRcdFx0YmluZGluZ0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdLFxuXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xuXG5cdFx0aWYgKCBiaW5kaW5nQnlOYW1lID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGJpbmRpbmdCeU5hbWUgPSB7fTtcblx0XHRcdGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdID0gYmluZGluZ0J5TmFtZTtcblxuXHRcdH1cblxuXHRcdGJpbmRpbmdCeU5hbWVbIHRyYWNrTmFtZSBdID0gYmluZGluZztcblxuXHRcdGJpbmRpbmcuX2NhY2hlSW5kZXggPSBiaW5kaW5ncy5sZW5ndGg7XG5cdFx0YmluZGluZ3MucHVzaCggYmluZGluZyApO1xuXG5cdH0sXG5cblx0X3JlbW92ZUluYWN0aXZlQmluZGluZzogZnVuY3Rpb24gKCBiaW5kaW5nICkge1xuXG5cdFx0dmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRwcm9wQmluZGluZyA9IGJpbmRpbmcuYmluZGluZyxcblx0XHRcdHJvb3RVdWlkID0gcHJvcEJpbmRpbmcucm9vdE5vZGUudXVpZCxcblx0XHRcdHRyYWNrTmFtZSA9IHByb3BCaW5kaW5nLnBhdGgsXG5cdFx0XHRiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxcblx0XHRcdGJpbmRpbmdCeU5hbWUgPSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXSxcblxuXHRcdFx0bGFzdEluYWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBiaW5kaW5ncy5sZW5ndGggLSAxIF0sXG5cdFx0XHRjYWNoZUluZGV4ID0gYmluZGluZy5fY2FjaGVJbmRleDtcblxuXHRcdGxhc3RJbmFjdGl2ZUJpbmRpbmcuX2NhY2hlSW5kZXggPSBjYWNoZUluZGV4O1xuXHRcdGJpbmRpbmdzWyBjYWNoZUluZGV4IF0gPSBsYXN0SW5hY3RpdmVCaW5kaW5nO1xuXHRcdGJpbmRpbmdzLnBvcCgpO1xuXG5cdFx0ZGVsZXRlIGJpbmRpbmdCeU5hbWVbIHRyYWNrTmFtZSBdO1xuXG5cdFx0cmVtb3ZlX2VtcHR5X21hcDoge1xuXG5cdFx0XHRmb3IgKCB2YXIgXyBpbiBiaW5kaW5nQnlOYW1lICkgYnJlYWsgcmVtb3ZlX2VtcHR5X21hcDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuXG5cdFx0XHRkZWxldGUgYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHR9XG5cblx0fSxcblxuXHRfbGVuZEJpbmRpbmc6IGZ1bmN0aW9uICggYmluZGluZyApIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0cHJldkluZGV4ID0gYmluZGluZy5fY2FjaGVJbmRleCxcblxuXHRcdFx0bGFzdEFjdGl2ZUluZGV4ID0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzICsrLFxuXG5cdFx0XHRmaXJzdEluYWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBsYXN0QWN0aXZlSW5kZXggXTtcblxuXHRcdGJpbmRpbmcuX2NhY2hlSW5kZXggPSBsYXN0QWN0aXZlSW5kZXg7XG5cdFx0YmluZGluZ3NbIGxhc3RBY3RpdmVJbmRleCBdID0gYmluZGluZztcblxuXHRcdGZpcnN0SW5hY3RpdmVCaW5kaW5nLl9jYWNoZUluZGV4ID0gcHJldkluZGV4O1xuXHRcdGJpbmRpbmdzWyBwcmV2SW5kZXggXSA9IGZpcnN0SW5hY3RpdmVCaW5kaW5nO1xuXG5cdH0sXG5cblx0X3Rha2VCYWNrQmluZGluZzogZnVuY3Rpb24gKCBiaW5kaW5nICkge1xuXG5cdFx0dmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRwcmV2SW5kZXggPSBiaW5kaW5nLl9jYWNoZUluZGV4LFxuXG5cdFx0XHRmaXJzdEluYWN0aXZlSW5kZXggPSAtLSB0aGlzLl9uQWN0aXZlQmluZGluZ3MsXG5cblx0XHRcdGxhc3RBY3RpdmVCaW5kaW5nID0gYmluZGluZ3NbIGZpcnN0SW5hY3RpdmVJbmRleCBdO1xuXG5cdFx0YmluZGluZy5fY2FjaGVJbmRleCA9IGZpcnN0SW5hY3RpdmVJbmRleDtcblx0XHRiaW5kaW5nc1sgZmlyc3RJbmFjdGl2ZUluZGV4IF0gPSBiaW5kaW5nO1xuXG5cdFx0bGFzdEFjdGl2ZUJpbmRpbmcuX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XG5cdFx0YmluZGluZ3NbIHByZXZJbmRleCBdID0gbGFzdEFjdGl2ZUJpbmRpbmc7XG5cblx0fSxcblxuXG5cdC8vIE1lbW9yeSBtYW5hZ2VtZW50IG9mIEludGVycG9sYW50cyBmb3Igd2VpZ2h0IGFuZCB0aW1lIHNjYWxlXG5cblx0X2xlbmRDb250cm9sSW50ZXJwb2xhbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpbnRlcnBvbGFudHMgPSB0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzLFxuXHRcdFx0bGFzdEFjdGl2ZUluZGV4ID0gdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMgKyssXG5cdFx0XHRpbnRlcnBvbGFudCA9IGludGVycG9sYW50c1sgbGFzdEFjdGl2ZUluZGV4IF07XG5cblx0XHRpZiAoIGludGVycG9sYW50ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGludGVycG9sYW50ID0gbmV3IExpbmVhckludGVycG9sYW50KFxuXHRcdFx0XHRuZXcgRmxvYXQzMkFycmF5KCAyICksIG5ldyBGbG9hdDMyQXJyYXkoIDIgKSxcblx0XHRcdFx0MSwgdGhpcy5fY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlciApO1xuXG5cdFx0XHRpbnRlcnBvbGFudC5fX2NhY2hlSW5kZXggPSBsYXN0QWN0aXZlSW5kZXg7XG5cdFx0XHRpbnRlcnBvbGFudHNbIGxhc3RBY3RpdmVJbmRleCBdID0gaW50ZXJwb2xhbnQ7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gaW50ZXJwb2xhbnQ7XG5cblx0fSxcblxuXHRfdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQ6IGZ1bmN0aW9uICggaW50ZXJwb2xhbnQgKSB7XG5cblx0XHR2YXIgaW50ZXJwb2xhbnRzID0gdGhpcy5fY29udHJvbEludGVycG9sYW50cyxcblx0XHRcdHByZXZJbmRleCA9IGludGVycG9sYW50Ll9fY2FjaGVJbmRleCxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUluZGV4ID0gLS0gdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMsXG5cblx0XHRcdGxhc3RBY3RpdmVJbnRlcnBvbGFudCA9IGludGVycG9sYW50c1sgZmlyc3RJbmFjdGl2ZUluZGV4IF07XG5cblx0XHRpbnRlcnBvbGFudC5fX2NhY2hlSW5kZXggPSBmaXJzdEluYWN0aXZlSW5kZXg7XG5cdFx0aW50ZXJwb2xhbnRzWyBmaXJzdEluYWN0aXZlSW5kZXggXSA9IGludGVycG9sYW50O1xuXG5cdFx0bGFzdEFjdGl2ZUludGVycG9sYW50Ll9fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcblx0XHRpbnRlcnBvbGFudHNbIHByZXZJbmRleCBdID0gbGFzdEFjdGl2ZUludGVycG9sYW50O1xuXG5cdH0sXG5cblx0X2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXI6IG5ldyBGbG9hdDMyQXJyYXkoIDEgKSxcblxuXHQvLyByZXR1cm4gYW4gYWN0aW9uIGZvciBhIGNsaXAgb3B0aW9uYWxseSB1c2luZyBhIGN1c3RvbSByb290IHRhcmdldFxuXHQvLyBvYmplY3QgKHRoaXMgbWV0aG9kIGFsbG9jYXRlcyBhIGxvdCBvZiBkeW5hbWljIG1lbW9yeSBpbiBjYXNlIGFcblx0Ly8gcHJldmlvdXNseSB1bmtub3duIGNsaXAvcm9vdCBjb21iaW5hdGlvbiBpcyBzcGVjaWZpZWQpXG5cdGNsaXBBY3Rpb246IGZ1bmN0aW9uICggY2xpcCwgb3B0aW9uYWxSb290ICkge1xuXG5cdFx0dmFyIHJvb3QgPSBvcHRpb25hbFJvb3QgfHwgdGhpcy5fcm9vdCxcblx0XHRcdHJvb3RVdWlkID0gcm9vdC51dWlkLFxuXG5cdFx0XHRjbGlwT2JqZWN0ID0gdHlwZW9mIGNsaXAgPT09ICdzdHJpbmcnID9cblx0XHRcdFx0QW5pbWF0aW9uQ2xpcC5maW5kQnlOYW1lKCByb290LCBjbGlwICkgOiBjbGlwLFxuXG5cdFx0XHRjbGlwVXVpZCA9IGNsaXBPYmplY3QgIT09IG51bGwgPyBjbGlwT2JqZWN0LnV1aWQgOiBjbGlwLFxuXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF0sXG5cdFx0XHRwcm90b3R5cGVBY3Rpb24gPSBudWxsO1xuXG5cdFx0aWYgKCBhY3Rpb25zRm9yQ2xpcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgZXhpc3RpbmdBY3Rpb24gPVxuXHRcdFx0XHRcdGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXTtcblxuXHRcdFx0aWYgKCBleGlzdGluZ0FjdGlvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBleGlzdGluZ0FjdGlvbjtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyB3ZSBrbm93IHRoZSBjbGlwLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHBhcnNlIGFsbFxuXHRcdFx0Ly8gdGhlIGJpbmRpbmdzIGFnYWluIGJ1dCBjYW4ganVzdCBjb3B5XG5cdFx0XHRwcm90b3R5cGVBY3Rpb24gPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnNbIDAgXTtcblxuXHRcdFx0Ly8gYWxzbywgdGFrZSB0aGUgY2xpcCBmcm9tIHRoZSBwcm90b3R5cGUgYWN0aW9uXG5cdFx0XHRpZiAoIGNsaXBPYmplY3QgPT09IG51bGwgKVxuXHRcdFx0XHRjbGlwT2JqZWN0ID0gcHJvdG90eXBlQWN0aW9uLl9jbGlwO1xuXG5cdFx0fVxuXG5cdFx0Ly8gY2xpcCBtdXN0IGJlIGtub3duIHdoZW4gc3BlY2lmaWVkIHZpYSBzdHJpbmdcblx0XHRpZiAoIGNsaXBPYmplY3QgPT09IG51bGwgKSByZXR1cm4gbnVsbDtcblxuXHRcdC8vIGFsbG9jYXRlIGFsbCByZXNvdXJjZXMgcmVxdWlyZWQgdG8gcnVuIGl0XG5cdFx0dmFyIG5ld0FjdGlvbiA9IG5ldyBBbmltYXRpb25BY3Rpb24oIHRoaXMsIGNsaXBPYmplY3QsIG9wdGlvbmFsUm9vdCApO1xuXG5cdFx0dGhpcy5fYmluZEFjdGlvbiggbmV3QWN0aW9uLCBwcm90b3R5cGVBY3Rpb24gKTtcblxuXHRcdC8vIGFuZCBtYWtlIHRoZSBhY3Rpb24ga25vd24gdG8gdGhlIG1lbW9yeSBtYW5hZ2VyXG5cdFx0dGhpcy5fYWRkSW5hY3RpdmVBY3Rpb24oIG5ld0FjdGlvbiwgY2xpcFV1aWQsIHJvb3RVdWlkICk7XG5cblx0XHRyZXR1cm4gbmV3QWN0aW9uO1xuXG5cdH0sXG5cblx0Ly8gZ2V0IGFuIGV4aXN0aW5nIGFjdGlvblxuXHRleGlzdGluZ0FjdGlvbjogZnVuY3Rpb24gKCBjbGlwLCBvcHRpb25hbFJvb3QgKSB7XG5cblx0XHR2YXIgcm9vdCA9IG9wdGlvbmFsUm9vdCB8fCB0aGlzLl9yb290LFxuXHRcdFx0cm9vdFV1aWQgPSByb290LnV1aWQsXG5cblx0XHRcdGNsaXBPYmplY3QgPSB0eXBlb2YgY2xpcCA9PT0gJ3N0cmluZycgP1xuXHRcdFx0XHRBbmltYXRpb25DbGlwLmZpbmRCeU5hbWUoIHJvb3QsIGNsaXAgKSA6IGNsaXAsXG5cblx0XHRcdGNsaXBVdWlkID0gY2xpcE9iamVjdCA/IGNsaXBPYmplY3QudXVpZCA6IGNsaXAsXG5cblx0XHRcdGFjdGlvbnNGb3JDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdGlmICggYWN0aW9uc0ZvckNsaXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmV0dXJuIGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXSB8fCBudWxsO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cblx0fSxcblxuXHQvLyBkZWFjdGl2YXRlcyBhbGwgcHJldmlvdXNseSBzY2hlZHVsZWQgYWN0aW9uc1xuXHRzdG9wQWxsQWN0aW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRuQWN0aW9ucyA9IHRoaXMuX25BY3RpdmVBY3Rpb25zLFxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdG5CaW5kaW5ncyA9IHRoaXMuX25BY3RpdmVCaW5kaW5ncztcblxuXHRcdHRoaXMuX25BY3RpdmVBY3Rpb25zID0gMDtcblx0XHR0aGlzLl9uQWN0aXZlQmluZGluZ3MgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuQWN0aW9uczsgKysgaSApIHtcblxuXHRcdFx0YWN0aW9uc1sgaSBdLnJlc2V0KCk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5CaW5kaW5nczsgKysgaSApIHtcblxuXHRcdFx0YmluZGluZ3NbIGkgXS51c2VDb3VudCA9IDA7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIGFkdmFuY2UgdGhlIHRpbWUgYW5kIHVwZGF0ZSBhcHBseSB0aGUgYW5pbWF0aW9uXG5cdHVwZGF0ZTogZnVuY3Rpb24gKCBkZWx0YVRpbWUgKSB7XG5cblx0XHRkZWx0YVRpbWUgKj0gdGhpcy50aW1lU2NhbGU7XG5cblx0XHR2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRuQWN0aW9ucyA9IHRoaXMuX25BY3RpdmVBY3Rpb25zLFxuXG5cdFx0XHR0aW1lID0gdGhpcy50aW1lICs9IGRlbHRhVGltZSxcblx0XHRcdHRpbWVEaXJlY3Rpb24gPSBNYXRoLnNpZ24oIGRlbHRhVGltZSApLFxuXG5cdFx0XHRhY2N1SW5kZXggPSB0aGlzLl9hY2N1SW5kZXggXj0gMTtcblxuXHRcdC8vIHJ1biBhY3RpdmUgYWN0aW9uc1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuQWN0aW9uczsgKysgaSApIHtcblxuXHRcdFx0dmFyIGFjdGlvbiA9IGFjdGlvbnNbIGkgXTtcblxuXHRcdFx0YWN0aW9uLl91cGRhdGUoIHRpbWUsIGRlbHRhVGltZSwgdGltZURpcmVjdGlvbiwgYWNjdUluZGV4ICk7XG5cblx0XHR9XG5cblx0XHQvLyB1cGRhdGUgc2NlbmUgZ3JhcGhcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0bkJpbmRpbmdzID0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuQmluZGluZ3M7ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0uYXBwbHkoIGFjY3VJbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyByZXR1cm4gdGhpcyBtaXhlcidzIHJvb3QgdGFyZ2V0IG9iamVjdFxuXHRnZXRSb290OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fcm9vdDtcblxuXHR9LFxuXG5cdC8vIGZyZWUgYWxsIHJlc291cmNlcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgY2xpcFxuXHR1bmNhY2hlQ2xpcDogZnVuY3Rpb24gKCBjbGlwICkge1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0Y2xpcFV1aWQgPSBjbGlwLnV1aWQsXG5cdFx0XHRhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcCxcblx0XHRcdGFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdGlmICggYWN0aW9uc0ZvckNsaXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gbm90ZToganVzdCBjYWxsaW5nIF9yZW1vdmVJbmFjdGl2ZUFjdGlvbiB3b3VsZCBtZXNzIHVwIHRoZVxuXHRcdFx0Ly8gaXRlcmF0aW9uIHN0YXRlIGFuZCBhbHNvIHJlcXVpcmUgdXBkYXRpbmcgdGhlIHN0YXRlIHdlIGNhblxuXHRcdFx0Ly8ganVzdCB0aHJvdyBhd2F5XG5cblx0XHRcdHZhciBhY3Rpb25zVG9SZW1vdmUgPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnM7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGFjdGlvbnNUb1JlbW92ZS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0dmFyIGFjdGlvbiA9IGFjdGlvbnNUb1JlbW92ZVsgaSBdO1xuXG5cdFx0XHRcdHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0XHRcdHZhciBjYWNoZUluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4LFxuXHRcdFx0XHRcdGxhc3RJbmFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGFjdGlvbnMubGVuZ3RoIC0gMSBdO1xuXG5cdFx0XHRcdGFjdGlvbi5fY2FjaGVJbmRleCA9IG51bGw7XG5cdFx0XHRcdGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IG51bGw7XG5cblx0XHRcdFx0bGFzdEluYWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gY2FjaGVJbmRleDtcblx0XHRcdFx0YWN0aW9uc1sgY2FjaGVJbmRleCBdID0gbGFzdEluYWN0aXZlQWN0aW9uO1xuXHRcdFx0XHRhY3Rpb25zLnBvcCgpO1xuXG5cdFx0XHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGRlbGV0ZSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Ly8gZnJlZSBhbGwgcmVzb3VyY2VzIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciByb290IHRhcmdldCBvYmplY3Rcblx0dW5jYWNoZVJvb3Q6IGZ1bmN0aW9uICggcm9vdCApIHtcblxuXHRcdHZhciByb290VXVpZCA9IHJvb3QudXVpZCxcblx0XHRcdGFjdGlvbnNCeUNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwO1xuXG5cdFx0Zm9yICggdmFyIGNsaXBVdWlkIGluIGFjdGlvbnNCeUNsaXAgKSB7XG5cblx0XHRcdHZhciBhY3Rpb25CeVJvb3QgPSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdLmFjdGlvbkJ5Um9vdCxcblx0XHRcdFx0YWN0aW9uID0gYWN0aW9uQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0XHRpZiAoIGFjdGlvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oIGFjdGlvbiApO1xuXHRcdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUFjdGlvbiggYWN0aW9uICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxcblx0XHRcdGJpbmRpbmdCeU5hbWUgPSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXTtcblxuXHRcdGlmICggYmluZGluZ0J5TmFtZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgdHJhY2tOYW1lIGluIGJpbmRpbmdCeU5hbWUgKSB7XG5cblx0XHRcdFx0dmFyIGJpbmRpbmcgPSBiaW5kaW5nQnlOYW1lWyB0cmFja05hbWUgXTtcblx0XHRcdFx0YmluZGluZy5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpO1xuXHRcdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0Ly8gcmVtb3ZlIGEgdGFyZ2V0ZWQgY2xpcCBmcm9tIHRoZSBjYWNoZVxuXHR1bmNhY2hlQWN0aW9uOiBmdW5jdGlvbiAoIGNsaXAsIG9wdGlvbmFsUm9vdCApIHtcblxuXHRcdHZhciBhY3Rpb24gPSB0aGlzLmV4aXN0aW5nQWN0aW9uKCBjbGlwLCBvcHRpb25hbFJvb3QgKTtcblxuXHRcdGlmICggYWN0aW9uICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKTtcblx0XHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFVuaWZvcm0oIHZhbHVlICkge1xuXG5cdGlmICggdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlVuaWZvcm06IFR5cGUgcGFyYW1ldGVyIGlzIG5vIGxvbmdlciBuZWVkZWQuJyApO1xuXHRcdHZhbHVlID0gYXJndW1lbnRzWyAxIF07XG5cblx0fVxuXG5cdHRoaXMudmFsdWUgPSB2YWx1ZTtcblxufVxuXG5Vbmlmb3JtLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRyZXR1cm4gbmV3IFVuaWZvcm0oIHRoaXMudmFsdWUuY2xvbmUgPT09IHVuZGVmaW5lZCA/IHRoaXMudmFsdWUgOiB0aGlzLnZhbHVlLmNsb25lKCkgKTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqL1xuXG5mdW5jdGlvbiBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSgpIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5Jztcblx0dGhpcy5tYXhJbnN0YW5jZWRDb3VudCA9IHVuZGVmaW5lZDtcblxufVxuXG5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSxcblxuXHRpc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLm1heEluc3RhbmNlZENvdW50ID0gc291cmNlLm1heEluc3RhbmNlZENvdW50O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtc1xuICovXG5cbmZ1bmN0aW9uIEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKCBpbnRlcmxlYXZlZEJ1ZmZlciwgaXRlbVNpemUsIG9mZnNldCwgbm9ybWFsaXplZCApIHtcblxuXHR0aGlzLmRhdGEgPSBpbnRlcmxlYXZlZEJ1ZmZlcjtcblx0dGhpcy5pdGVtU2l6ZSA9IGl0ZW1TaXplO1xuXHR0aGlzLm9mZnNldCA9IG9mZnNldDtcblxuXHR0aGlzLm5vcm1hbGl6ZWQgPSBub3JtYWxpemVkID09PSB0cnVlO1xuXG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHtcblxuXHRjb3VudDoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmRhdGEuY291bnQ7XG5cblx0XHR9XG5cblx0fSxcblxuXHRhcnJheToge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmRhdGEuYXJyYXk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwge1xuXG5cdGlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU6IHRydWUsXG5cblx0c2V0WDogZnVuY3Rpb24gKCBpbmRleCwgeCApIHtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgXSA9IHg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFk6IGZ1bmN0aW9uICggaW5kZXgsIHkgKSB7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMSBdID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WjogZnVuY3Rpb24gKCBpbmRleCwgeiApIHtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAyIF0gPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRXOiBmdW5jdGlvbiAoIGluZGV4LCB3ICkge1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFg6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCBdO1xuXG5cdH0sXG5cblx0Z2V0WTogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMSBdO1xuXG5cdH0sXG5cblx0Z2V0WjogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMiBdO1xuXG5cdH0sXG5cblx0Z2V0VzogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMyBdO1xuXG5cdH0sXG5cblx0c2V0WFk6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHkgKSB7XG5cblx0XHRpbmRleCA9IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0O1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZWjogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSwgeiApIHtcblxuXHRcdGluZGV4ID0gaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQ7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMSBdID0geTtcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WFlaVzogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSwgeiwgdyApIHtcblxuXHRcdGluZGV4ID0gaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQ7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMSBdID0geTtcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMyBdID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtc1xuICovXG5cbmZ1bmN0aW9uIEludGVybGVhdmVkQnVmZmVyKCBhcnJheSwgc3RyaWRlICkge1xuXG5cdHRoaXMuYXJyYXkgPSBhcnJheTtcblx0dGhpcy5zdHJpZGUgPSBzdHJpZGU7XG5cdHRoaXMuY291bnQgPSBhcnJheSAhPT0gdW5kZWZpbmVkID8gYXJyYXkubGVuZ3RoIC8gc3RyaWRlIDogMDtcblxuXHR0aGlzLmR5bmFtaWMgPSBmYWxzZTtcblx0dGhpcy51cGRhdGVSYW5nZSA9IHsgb2Zmc2V0OiAwLCBjb3VudDogLSAxIH07XG5cblx0dGhpcy52ZXJzaW9uID0gMDtcblxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoIEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSwgJ25lZWRzVXBkYXRlJywge1xuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSwge1xuXG5cdGlzSW50ZXJsZWF2ZWRCdWZmZXI6IHRydWUsXG5cblx0b25VcGxvYWRDYWxsYmFjazogZnVuY3Rpb24gKCkge30sXG5cblx0c2V0QXJyYXk6IGZ1bmN0aW9uICggYXJyYXkgKSB7XG5cblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIGFycmF5ICkgKSB7XG5cblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNob3VsZCBiZSBhIFR5cGVkIEFycmF5LicgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY291bnQgPSBhcnJheSAhPT0gdW5kZWZpbmVkID8gYXJyYXkubGVuZ3RoIC8gdGhpcy5zdHJpZGUgOiAwO1xuXHRcdHRoaXMuYXJyYXkgPSBhcnJheTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RHluYW1pYzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuZHluYW1pYyA9IHZhbHVlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHRoaXMuYXJyYXkgPSBuZXcgc291cmNlLmFycmF5LmNvbnN0cnVjdG9yKCBzb3VyY2UuYXJyYXkgKTtcblx0XHR0aGlzLmNvdW50ID0gc291cmNlLmNvdW50O1xuXHRcdHRoaXMuc3RyaWRlID0gc291cmNlLnN0cmlkZTtcblx0XHR0aGlzLmR5bmFtaWMgPSBzb3VyY2UuZHluYW1pYztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weUF0OiBmdW5jdGlvbiAoIGluZGV4MSwgYXR0cmlidXRlLCBpbmRleDIgKSB7XG5cblx0XHRpbmRleDEgKj0gdGhpcy5zdHJpZGU7XG5cdFx0aW5kZXgyICo9IGF0dHJpYnV0ZS5zdHJpZGU7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLnN0cmlkZTsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuYXJyYXlbIGluZGV4MSArIGkgXSA9IGF0dHJpYnV0ZS5hcnJheVsgaW5kZXgyICsgaSBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUsIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dGhpcy5hcnJheS5zZXQoIHZhbHVlLCBvZmZzZXQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdG9uVXBsb2FkOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0dGhpcy5vblVwbG9hZENhbGxiYWNrID0gY2FsbGJhY2s7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqL1xuXG5mdW5jdGlvbiBJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciggYXJyYXksIHN0cmlkZSwgbWVzaFBlckF0dHJpYnV0ZSApIHtcblxuXHRJbnRlcmxlYXZlZEJ1ZmZlci5jYWxsKCB0aGlzLCBhcnJheSwgc3RyaWRlICk7XG5cblx0dGhpcy5tZXNoUGVyQXR0cmlidXRlID0gbWVzaFBlckF0dHJpYnV0ZSB8fCAxO1xuXG59XG5cbkluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyLFxuXG5cdGlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IHNvdXJjZS5tZXNoUGVyQXR0cmlidXRlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKi9cblxuZnVuY3Rpb24gSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG1lc2hQZXJBdHRyaWJ1dGUgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIGFycmF5LCBpdGVtU2l6ZSApO1xuXG5cdHRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IG1lc2hQZXJBdHRyaWJ1dGUgfHwgMTtcblxufVxuXG5JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSxcblxuXHRpc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IHNvdXJjZS5tZXNoUGVyQXR0cmlidXRlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIHN0ZXBob21pIC8gaHR0cDovL3N0ZXBoYW5lZ2luaWVyLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBSYXljYXN0ZXIoIG9yaWdpbiwgZGlyZWN0aW9uLCBuZWFyLCBmYXIgKSB7XG5cblx0dGhpcy5yYXkgPSBuZXcgUmF5KCBvcmlnaW4sIGRpcmVjdGlvbiApO1xuXHQvLyBkaXJlY3Rpb24gaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkIChmb3IgYWNjdXJhdGUgZGlzdGFuY2UgY2FsY3VsYXRpb25zKVxuXG5cdHRoaXMubmVhciA9IG5lYXIgfHwgMDtcblx0dGhpcy5mYXIgPSBmYXIgfHwgSW5maW5pdHk7XG5cblx0dGhpcy5wYXJhbXMgPSB7XG5cdFx0TWVzaDoge30sXG5cdFx0TGluZToge30sXG5cdFx0TE9EOiB7fSxcblx0XHRQb2ludHM6IHsgdGhyZXNob2xkOiAxIH0sXG5cdFx0U3ByaXRlOiB7fVxuXHR9O1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLnBhcmFtcywge1xuXHRcdFBvaW50Q2xvdWQ6IHtcblx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheWNhc3RlcjogcGFyYW1zLlBvaW50Q2xvdWQgaGFzIGJlZW4gcmVuYW1lZCB0byBwYXJhbXMuUG9pbnRzLicgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuUG9pbnRzO1xuXG5cdFx0XHR9XG5cdFx0fVxuXHR9ICk7XG5cbn1cblxuZnVuY3Rpb24gYXNjU29ydCggYSwgYiApIHtcblxuXHRyZXR1cm4gYS5kaXN0YW5jZSAtIGIuZGlzdGFuY2U7XG5cbn1cblxuZnVuY3Rpb24gaW50ZXJzZWN0T2JqZWN0KCBvYmplY3QsIHJheWNhc3RlciwgaW50ZXJzZWN0cywgcmVjdXJzaXZlICkge1xuXG5cdGlmICggb2JqZWN0LnZpc2libGUgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdG9iamVjdC5yYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKTtcblxuXHRpZiAoIHJlY3Vyc2l2ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdHZhciBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGludGVyc2VjdE9iamVjdCggY2hpbGRyZW5bIGkgXSwgcmF5Y2FzdGVyLCBpbnRlcnNlY3RzLCB0cnVlICk7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbk9iamVjdC5hc3NpZ24oIFJheWNhc3Rlci5wcm90b3R5cGUsIHtcblxuXHRsaW5lUHJlY2lzaW9uOiAxLFxuXG5cdHNldDogZnVuY3Rpb24gKCBvcmlnaW4sIGRpcmVjdGlvbiApIHtcblxuXHRcdC8vIGRpcmVjdGlvbiBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWQgKGZvciBhY2N1cmF0ZSBkaXN0YW5jZSBjYWxjdWxhdGlvbnMpXG5cblx0XHR0aGlzLnJheS5zZXQoIG9yaWdpbiwgZGlyZWN0aW9uICk7XG5cblx0fSxcblxuXHRzZXRGcm9tQ2FtZXJhOiBmdW5jdGlvbiAoIGNvb3JkcywgY2FtZXJhICkge1xuXG5cdFx0aWYgKCAoIGNhbWVyYSAmJiBjYW1lcmEuaXNQZXJzcGVjdGl2ZUNhbWVyYSApICkge1xuXG5cdFx0XHR0aGlzLnJheS5vcmlnaW4uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcblx0XHRcdHRoaXMucmF5LmRpcmVjdGlvbi5zZXQoIGNvb3Jkcy54LCBjb29yZHMueSwgMC41ICkudW5wcm9qZWN0KCBjYW1lcmEgKS5zdWIoIHRoaXMucmF5Lm9yaWdpbiApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0fSBlbHNlIGlmICggKCBjYW1lcmEgJiYgY2FtZXJhLmlzT3J0aG9ncmFwaGljQ2FtZXJhICkgKSB7XG5cblx0XHRcdHRoaXMucmF5Lm9yaWdpbi5zZXQoIGNvb3Jkcy54LCBjb29yZHMueSwgKCBjYW1lcmEubmVhciArIGNhbWVyYS5mYXIgKSAvICggY2FtZXJhLm5lYXIgLSBjYW1lcmEuZmFyICkgKS51bnByb2plY3QoIGNhbWVyYSApOyAvLyBzZXQgb3JpZ2luIGluIHBsYW5lIG9mIGNhbWVyYVxuXHRcdFx0dGhpcy5yYXkuZGlyZWN0aW9uLnNldCggMCwgMCwgLSAxICkudHJhbnNmb3JtRGlyZWN0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5SYXljYXN0ZXI6IFVuc3VwcG9ydGVkIGNhbWVyYSB0eXBlLicgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGludGVyc2VjdE9iamVjdDogZnVuY3Rpb24gKCBvYmplY3QsIHJlY3Vyc2l2ZSwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgaW50ZXJzZWN0cyA9IG9wdGlvbmFsVGFyZ2V0IHx8IFtdO1xuXG5cdFx0aW50ZXJzZWN0T2JqZWN0KCBvYmplY3QsIHRoaXMsIGludGVyc2VjdHMsIHJlY3Vyc2l2ZSApO1xuXG5cdFx0aW50ZXJzZWN0cy5zb3J0KCBhc2NTb3J0ICk7XG5cblx0XHRyZXR1cm4gaW50ZXJzZWN0cztcblxuXHR9LFxuXG5cdGludGVyc2VjdE9iamVjdHM6IGZ1bmN0aW9uICggb2JqZWN0cywgcmVjdXJzaXZlLCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciBpbnRlcnNlY3RzID0gb3B0aW9uYWxUYXJnZXQgfHwgW107XG5cblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG9iamVjdHMgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzOiBvYmplY3RzIGlzIG5vdCBhbiBBcnJheS4nICk7XG5cdFx0XHRyZXR1cm4gaW50ZXJzZWN0cztcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IG9iamVjdHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0aW50ZXJzZWN0T2JqZWN0KCBvYmplY3RzWyBpIF0sIHRoaXMsIGludGVyc2VjdHMsIHJlY3Vyc2l2ZSApO1xuXG5cdFx0fVxuXG5cdFx0aW50ZXJzZWN0cy5zb3J0KCBhc2NTb3J0ICk7XG5cblx0XHRyZXR1cm4gaW50ZXJzZWN0cztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIENsb2NrKCBhdXRvU3RhcnQgKSB7XG5cblx0dGhpcy5hdXRvU3RhcnQgPSAoIGF1dG9TdGFydCAhPT0gdW5kZWZpbmVkICkgPyBhdXRvU3RhcnQgOiB0cnVlO1xuXG5cdHRoaXMuc3RhcnRUaW1lID0gMDtcblx0dGhpcy5vbGRUaW1lID0gMDtcblx0dGhpcy5lbGFwc2VkVGltZSA9IDA7XG5cblx0dGhpcy5ydW5uaW5nID0gZmFsc2U7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQ2xvY2sucHJvdG90eXBlLCB7XG5cblx0c3RhcnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuc3RhcnRUaW1lID0gKCB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICd1bmRlZmluZWQnID8gRGF0ZSA6IHBlcmZvcm1hbmNlICkubm93KCk7IC8vIHNlZSAjMTA3MzJcblxuXHRcdHRoaXMub2xkVGltZSA9IHRoaXMuc3RhcnRUaW1lO1xuXHRcdHRoaXMuZWxhcHNlZFRpbWUgPSAwO1xuXHRcdHRoaXMucnVubmluZyA9IHRydWU7XG5cblx0fSxcblxuXHRzdG9wOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmdldEVsYXBzZWRUaW1lKCk7XG5cdFx0dGhpcy5ydW5uaW5nID0gZmFsc2U7XG5cdFx0dGhpcy5hdXRvU3RhcnQgPSBmYWxzZTtcblxuXHR9LFxuXG5cdGdldEVsYXBzZWRUaW1lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmdldERlbHRhKCk7XG5cdFx0cmV0dXJuIHRoaXMuZWxhcHNlZFRpbWU7XG5cblx0fSxcblxuXHRnZXREZWx0YTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGRpZmYgPSAwO1xuXG5cdFx0aWYgKCB0aGlzLmF1dG9TdGFydCAmJiAhIHRoaXMucnVubmluZyApIHtcblxuXHRcdFx0dGhpcy5zdGFydCgpO1xuXHRcdFx0cmV0dXJuIDA7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMucnVubmluZyApIHtcblxuXHRcdFx0dmFyIG5ld1RpbWUgPSAoIHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ3VuZGVmaW5lZCcgPyBEYXRlIDogcGVyZm9ybWFuY2UgKS5ub3coKTtcblxuXHRcdFx0ZGlmZiA9ICggbmV3VGltZSAtIHRoaXMub2xkVGltZSApIC8gMTAwMDtcblx0XHRcdHRoaXMub2xkVGltZSA9IG5ld1RpbWU7XG5cblx0XHRcdHRoaXMuZWxhcHNlZFRpbWUgKz0gZGlmZjtcblxuXHRcdH1cblxuXHRcdHJldHVybiBkaWZmO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICpcbiAqIFJlZjogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3BoZXJpY2FsX2Nvb3JkaW5hdGVfc3lzdGVtXG4gKlxuICogVGhlIHBvbGVzIChwaGkpIGFyZSBhdCB0aGUgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHkgYXhpcy5cbiAqIFRoZSBlcXVhdG9yIHN0YXJ0cyBhdCBwb3NpdGl2ZSB6LlxuICovXG5cbmZ1bmN0aW9uIFNwaGVyaWNhbCggcmFkaXVzLCBwaGksIHRoZXRhICkge1xuXG5cdHRoaXMucmFkaXVzID0gKCByYWRpdXMgIT09IHVuZGVmaW5lZCApID8gcmFkaXVzIDogMS4wO1xuXHR0aGlzLnBoaSA9ICggcGhpICE9PSB1bmRlZmluZWQgKSA/IHBoaSA6IDA7IC8vIHVwIC8gZG93biB0b3dhcmRzIHRvcCBhbmQgYm90dG9tIHBvbGVcblx0dGhpcy50aGV0YSA9ICggdGhldGEgIT09IHVuZGVmaW5lZCApID8gdGhldGEgOiAwOyAvLyBhcm91bmQgdGhlIGVxdWF0b3Igb2YgdGhlIHNwaGVyZVxuXG5cdHJldHVybiB0aGlzO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFNwaGVyaWNhbC5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggcmFkaXVzLCBwaGksIHRoZXRhICkge1xuXG5cdFx0dGhpcy5yYWRpdXMgPSByYWRpdXM7XG5cdFx0dGhpcy5waGkgPSBwaGk7XG5cdFx0dGhpcy50aGV0YSA9IHRoZXRhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBvdGhlciApIHtcblxuXHRcdHRoaXMucmFkaXVzID0gb3RoZXIucmFkaXVzO1xuXHRcdHRoaXMucGhpID0gb3RoZXIucGhpO1xuXHRcdHRoaXMudGhldGEgPSBvdGhlci50aGV0YTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gcmVzdHJpY3QgcGhpIHRvIGJlIGJldHdlZSBFUFMgYW5kIFBJLUVQU1xuXHRtYWtlU2FmZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIEVQUyA9IDAuMDAwMDAxO1xuXHRcdHRoaXMucGhpID0gTWF0aC5tYXgoIEVQUywgTWF0aC5taW4oIE1hdGguUEkgLSBFUFMsIHRoaXMucGhpICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVZlY3RvcjM6IGZ1bmN0aW9uICggdmVjMyApIHtcblxuXHRcdHRoaXMucmFkaXVzID0gdmVjMy5sZW5ndGgoKTtcblxuXHRcdGlmICggdGhpcy5yYWRpdXMgPT09IDAgKSB7XG5cblx0XHRcdHRoaXMudGhldGEgPSAwO1xuXHRcdFx0dGhpcy5waGkgPSAwO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy50aGV0YSA9IE1hdGguYXRhbjIoIHZlYzMueCwgdmVjMy56ICk7IC8vIGVxdWF0b3IgYW5nbGUgYXJvdW5kIHktdXAgYXhpc1xuXHRcdFx0dGhpcy5waGkgPSBNYXRoLmFjb3MoIF9NYXRoLmNsYW1wKCB2ZWMzLnkgLyB0aGlzLnJhZGl1cywgLSAxLCAxICkgKTsgLy8gcG9sYXIgYW5nbGVcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKlxuICogUmVmOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DeWxpbmRyaWNhbF9jb29yZGluYXRlX3N5c3RlbVxuICpcbiAqL1xuXG5mdW5jdGlvbiBDeWxpbmRyaWNhbCggcmFkaXVzLCB0aGV0YSwgeSApIHtcblxuXHR0aGlzLnJhZGl1cyA9ICggcmFkaXVzICE9PSB1bmRlZmluZWQgKSA/IHJhZGl1cyA6IDEuMDsgLy8gZGlzdGFuY2UgZnJvbSB0aGUgb3JpZ2luIHRvIGEgcG9pbnQgaW4gdGhlIHgteiBwbGFuZVxuXHR0aGlzLnRoZXRhID0gKCB0aGV0YSAhPT0gdW5kZWZpbmVkICkgPyB0aGV0YSA6IDA7IC8vIGNvdW50ZXJjbG9ja3dpc2UgYW5nbGUgaW4gdGhlIHgteiBwbGFuZSBtZWFzdXJlZCBpbiByYWRpYW5zIGZyb20gdGhlIHBvc2l0aXZlIHotYXhpc1xuXHR0aGlzLnkgPSAoIHkgIT09IHVuZGVmaW5lZCApID8geSA6IDA7IC8vIGhlaWdodCBhYm92ZSB0aGUgeC16IHBsYW5lXG5cblx0cmV0dXJuIHRoaXM7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQ3lsaW5kcmljYWwucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHJhZGl1cywgdGhldGEsIHkgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IHJhZGl1cztcblx0XHR0aGlzLnRoZXRhID0gdGhldGE7XG5cdFx0dGhpcy55ID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggb3RoZXIgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IG90aGVyLnJhZGl1cztcblx0XHR0aGlzLnRoZXRhID0gb3RoZXIudGhldGE7XG5cdFx0dGhpcy55ID0gb3RoZXIueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVZlY3RvcjM6IGZ1bmN0aW9uICggdmVjMyApIHtcblxuXHRcdHRoaXMucmFkaXVzID0gTWF0aC5zcXJ0KCB2ZWMzLnggKiB2ZWMzLnggKyB2ZWMzLnogKiB2ZWMzLnogKTtcblx0XHR0aGlzLnRoZXRhID0gTWF0aC5hdGFuMiggdmVjMy54LCB2ZWMzLnogKTtcblx0XHR0aGlzLnkgPSB2ZWMzLnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuZnVuY3Rpb24gQm94MiggbWluLCBtYXggKSB7XG5cblx0dGhpcy5taW4gPSAoIG1pbiAhPT0gdW5kZWZpbmVkICkgPyBtaW4gOiBuZXcgVmVjdG9yMiggKyBJbmZpbml0eSwgKyBJbmZpbml0eSApO1xuXHR0aGlzLm1heCA9ICggbWF4ICE9PSB1bmRlZmluZWQgKSA/IG1heCA6IG5ldyBWZWN0b3IyKCAtIEluZmluaXR5LCAtIEluZmluaXR5ICk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQm94Mi5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHR0aGlzLm1pbi5jb3B5KCBtaW4gKTtcblx0XHR0aGlzLm1heC5jb3B5KCBtYXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHR0aGlzLm1ha2VFbXB0eSgpO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5leHBhbmRCeVBvaW50KCBwb2ludHNbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tQ2VudGVyQW5kU2l6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRGcm9tQ2VudGVyQW5kU2l6ZSggY2VudGVyLCBzaXplICkge1xuXG5cdFx0XHR2YXIgaGFsZlNpemUgPSB2MS5jb3B5KCBzaXplICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xuXHRcdFx0dGhpcy5taW4uY29weSggY2VudGVyICkuc3ViKCBoYWxmU2l6ZSApO1xuXHRcdFx0dGhpcy5tYXguY29weSggY2VudGVyICkuYWRkKCBoYWxmU2l6ZSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHRoaXMubWluLmNvcHkoIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5jb3B5KCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VFbXB0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5taW4ueCA9IHRoaXMubWluLnkgPSArIEluZmluaXR5O1xuXHRcdHRoaXMubWF4LnggPSB0aGlzLm1heC55ID0gLSBJbmZpbml0eTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0aXNFbXB0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gdGhpcyBpcyBhIG1vcmUgcm9idXN0IGNoZWNrIGZvciBlbXB0eSB0aGFuICggdm9sdW1lIDw9IDAgKSBiZWNhdXNlIHZvbHVtZSBjYW4gZ2V0IHBvc2l0aXZlIHdpdGggdHdvIG5lZ2F0aXZlIGF4ZXNcblxuXHRcdHJldHVybiAoIHRoaXMubWF4LnggPCB0aGlzLm1pbi54ICkgfHwgKCB0aGlzLm1heC55IDwgdGhpcy5taW4ueSApO1xuXG5cdH0sXG5cblx0Z2V0Q2VudGVyOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHRhcmdldC5zZXQoIDAsIDAgKSA6IHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLm1pbiwgdGhpcy5tYXggKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cblx0fSxcblxuXHRnZXRTaXplOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5nZXRTaXplKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0YXJnZXQuc2V0KCAwLCAwICkgOiB0YXJnZXQuc3ViVmVjdG9ycyggdGhpcy5tYXgsIHRoaXMubWluICk7XG5cblx0fSxcblxuXHRleHBhbmRCeVBvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0dGhpcy5taW4ubWluKCBwb2ludCApO1xuXHRcdHRoaXMubWF4Lm1heCggcG9pbnQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlWZWN0b3I6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0dGhpcy5taW4uc3ViKCB2ZWN0b3IgKTtcblx0XHR0aGlzLm1heC5hZGQoIHZlY3RvciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRleHBhbmRCeVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLm1pbi5hZGRTY2FsYXIoIC0gc2NhbGFyICk7XG5cdFx0dGhpcy5tYXguYWRkU2NhbGFyKCBzY2FsYXIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHJldHVybiBwb2ludC54IDwgdGhpcy5taW4ueCB8fCBwb2ludC54ID4gdGhpcy5tYXgueCB8fFxuXHRcdFx0cG9pbnQueSA8IHRoaXMubWluLnkgfHwgcG9pbnQueSA+IHRoaXMubWF4LnkgPyBmYWxzZSA6IHRydWU7XG5cblx0fSxcblxuXHRjb250YWluc0JveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5taW4ueCA8PSBib3gubWluLnggJiYgYm94Lm1heC54IDw9IHRoaXMubWF4LnggJiZcblx0XHRcdHRoaXMubWluLnkgPD0gYm94Lm1pbi55ICYmIGJveC5tYXgueSA8PSB0aGlzLm1heC55O1xuXG5cdH0sXG5cblx0Z2V0UGFyYW1ldGVyOiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHQvLyBUaGlzIGNhbiBwb3RlbnRpYWxseSBoYXZlIGEgZGl2aWRlIGJ5IHplcm8gaWYgdGhlIGJveFxuXHRcdC8vIGhhcyBhIHNpemUgZGltZW5zaW9uIG9mIDAuXG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuZ2V0UGFyYW1ldGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LnNldChcblx0XHRcdCggcG9pbnQueCAtIHRoaXMubWluLnggKSAvICggdGhpcy5tYXgueCAtIHRoaXMubWluLnggKSxcblx0XHRcdCggcG9pbnQueSAtIHRoaXMubWluLnkgKSAvICggdGhpcy5tYXgueSAtIHRoaXMubWluLnkgKVxuXHRcdCk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdC8vIHVzaW5nIDQgc3BsaXR0aW5nIHBsYW5lcyB0byBydWxlIG91dCBpbnRlcnNlY3Rpb25zXG5cblx0XHRyZXR1cm4gYm94Lm1heC54IDwgdGhpcy5taW4ueCB8fCBib3gubWluLnggPiB0aGlzLm1heC54IHx8XG5cdFx0XHRib3gubWF4LnkgPCB0aGlzLm1pbi55IHx8IGJveC5taW4ueSA+IHRoaXMubWF4LnkgPyBmYWxzZSA6IHRydWU7XG5cblx0fSxcblxuXHRjbGFtcFBvaW50OiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuY2xhbXBQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9Qb2ludDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBkaXN0YW5jZVRvUG9pbnQoIHBvaW50ICkge1xuXG5cdFx0XHR2YXIgY2xhbXBlZFBvaW50ID0gdjEuY29weSggcG9pbnQgKS5jbGFtcCggdGhpcy5taW4sIHRoaXMubWF4ICk7XG5cdFx0XHRyZXR1cm4gY2xhbXBlZFBvaW50LnN1YiggcG9pbnQgKS5sZW5ndGgoKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5tYXgoIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5taW4oIGJveC5tYXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dW5pb246IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0dGhpcy5taW4ubWluKCBib3gubWluICk7XG5cdFx0dGhpcy5tYXgubWF4KCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLm1pbi5hZGQoIG9mZnNldCApO1xuXHRcdHRoaXMubWF4LmFkZCggb2Zmc2V0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRyZXR1cm4gYm94Lm1pbi5lcXVhbHMoIHRoaXMubWluICkgJiYgYm94Lm1heC5lcXVhbHMoIHRoaXMubWF4ICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBJbW1lZGlhdGVSZW5kZXJPYmplY3QoIG1hdGVyaWFsICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWw7XG5cdHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCAvKiByZW5kZXJDYWxsYmFjayAqLyApIHt9O1xuXG59XG5cbkltbWVkaWF0ZVJlbmRlck9iamVjdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcbkltbWVkaWF0ZVJlbmRlck9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbW1lZGlhdGVSZW5kZXJPYmplY3Q7XG5cbkltbWVkaWF0ZVJlbmRlck9iamVjdC5wcm90b3R5cGUuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3QgPSB0cnVlO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBWZXJ0ZXhOb3JtYWxzSGVscGVyKCBvYmplY3QsIHNpemUsIGhleCwgbGluZXdpZHRoICkge1xuXG5cdHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuXG5cdHRoaXMuc2l6ZSA9ICggc2l6ZSAhPT0gdW5kZWZpbmVkICkgPyBzaXplIDogMTtcblxuXHR2YXIgY29sb3IgPSAoIGhleCAhPT0gdW5kZWZpbmVkICkgPyBoZXggOiAweGZmMDAwMDtcblxuXHR2YXIgd2lkdGggPSAoIGxpbmV3aWR0aCAhPT0gdW5kZWZpbmVkICkgPyBsaW5ld2lkdGggOiAxO1xuXG5cdC8vXG5cblx0dmFyIG5Ob3JtYWxzID0gMDtcblxuXHR2YXIgb2JqR2VvbWV0cnkgPSB0aGlzLm9iamVjdC5nZW9tZXRyeTtcblxuXHRpZiAoIG9iakdlb21ldHJ5ICYmIG9iakdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRuTm9ybWFscyA9IG9iakdlb21ldHJ5LmZhY2VzLmxlbmd0aCAqIDM7XG5cblx0fSBlbHNlIGlmICggb2JqR2VvbWV0cnkgJiYgb2JqR2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdG5Ob3JtYWxzID0gb2JqR2VvbWV0cnkuYXR0cmlidXRlcy5ub3JtYWwuY291bnQ7XG5cblx0fVxuXG5cdC8vXG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0dmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBuTm9ybWFscyAqIDIgKiAzLCAzICk7XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBwb3NpdGlvbnMgKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIGxpbmV3aWR0aDogd2lkdGggfSApICk7XG5cblx0Ly9cblxuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cblZlcnRleE5vcm1hbHNIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuVmVydGV4Tm9ybWFsc0hlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBWZXJ0ZXhOb3JtYWxzSGVscGVyO1xuXG5WZXJ0ZXhOb3JtYWxzSGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSAoIGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdjIgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0dmFyIGtleXMgPSBbICdhJywgJ2InLCAnYycgXTtcblxuXHRcdHRoaXMub2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KCB0aGlzLm9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0dmFyIG1hdHJpeFdvcmxkID0gdGhpcy5vYmplY3QubWF0cml4V29ybGQ7XG5cblx0XHR2YXIgcG9zaXRpb24gPSB0aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHQvL1xuXG5cdFx0dmFyIG9iakdlb21ldHJ5ID0gdGhpcy5vYmplY3QuZ2VvbWV0cnk7XG5cblx0XHRpZiAoIG9iakdlb21ldHJ5ICYmIG9iakdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciB2ZXJ0aWNlcyA9IG9iakdlb21ldHJ5LnZlcnRpY2VzO1xuXG5cdFx0XHR2YXIgZmFjZXMgPSBvYmpHZW9tZXRyeS5mYWNlcztcblxuXHRcdFx0dmFyIGlkeCA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBmYWNlLnZlcnRleE5vcm1hbHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgdmVydGV4ID0gdmVydGljZXNbIGZhY2VbIGtleXNbIGogXSBdIF07XG5cblx0XHRcdFx0XHR2YXIgbm9ybWFsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzWyBqIF07XG5cblx0XHRcdFx0XHR2MS5jb3B5KCB2ZXJ0ZXggKS5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0XHR2Mi5jb3B5KCBub3JtYWwgKS5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCB0aGlzLnNpemUgKS5hZGQoIHYxICk7XG5cblx0XHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjEueCwgdjEueSwgdjEueiApO1xuXG5cdFx0XHRcdFx0aWR4ID0gaWR4ICsgMTtcblxuXHRcdFx0XHRcdHBvc2l0aW9uLnNldFhZWiggaWR4LCB2Mi54LCB2Mi55LCB2Mi56ICk7XG5cblx0XHRcdFx0XHRpZHggPSBpZHggKyAxO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb2JqR2VvbWV0cnkgJiYgb2JqR2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0dmFyIG9ialBvcyA9IG9iakdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRcdHZhciBvYmpOb3JtID0gb2JqR2VvbWV0cnkuYXR0cmlidXRlcy5ub3JtYWw7XG5cblx0XHRcdHZhciBpZHggPSAwO1xuXG5cdFx0XHQvLyBmb3Igc2ltcGxpY2l0eSwgaWdub3JlIGluZGV4IGFuZCBkcmF3Y2FsbHMsIGFuZCByZW5kZXIgZXZlcnkgbm9ybWFsXG5cblx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBvYmpQb3MuY291bnQ7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHR2MS5zZXQoIG9ialBvcy5nZXRYKCBqICksIG9ialBvcy5nZXRZKCBqICksIG9ialBvcy5nZXRaKCBqICkgKS5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0djIuc2V0KCBvYmpOb3JtLmdldFgoIGogKSwgb2JqTm9ybS5nZXRZKCBqICksIG9iak5vcm0uZ2V0WiggaiApICk7XG5cblx0XHRcdFx0djIuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggdGhpcy5zaXplICkuYWRkKCB2MSApO1xuXG5cdFx0XHRcdHBvc2l0aW9uLnNldFhZWiggaWR4LCB2MS54LCB2MS55LCB2MS56ICk7XG5cblx0XHRcdFx0aWR4ID0gaWR4ICsgMTtcblxuXHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjIueCwgdjIueSwgdjIueiApO1xuXG5cdFx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHBvc2l0aW9uLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHR9O1xuXG59KCkgKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cbmZ1bmN0aW9uIFNwb3RMaWdodEhlbHBlciggbGlnaHQsIGNvbG9yICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XG5cdHRoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHR0aGlzLm1hdHJpeCA9IGxpZ2h0Lm1hdHJpeFdvcmxkO1xuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLmNvbG9yID0gY29sb3I7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0dmFyIHBvc2l0aW9ucyA9IFtcblx0XHQwLCAwLCAwLCBcdDAsIDAsIDEsXG5cdFx0MCwgMCwgMCwgXHQxLCAwLCAxLFxuXHRcdDAsIDAsIDAsXHQtIDEsIDAsIDEsXG5cdFx0MCwgMCwgMCwgXHQwLCAxLCAxLFxuXHRcdDAsIDAsIDAsIFx0MCwgLSAxLCAxXG5cdF07XG5cblx0Zm9yICggdmFyIGkgPSAwLCBqID0gMSwgbCA9IDMyOyBpIDwgbDsgaSArKywgaiArKyApIHtcblxuXHRcdHZhciBwMSA9ICggaSAvIGwgKSAqIE1hdGguUEkgKiAyO1xuXHRcdHZhciBwMiA9ICggaiAvIGwgKSAqIE1hdGguUEkgKiAyO1xuXG5cdFx0cG9zaXRpb25zLnB1c2goXG5cdFx0XHRNYXRoLmNvcyggcDEgKSwgTWF0aC5zaW4oIHAxICksIDEsXG5cdFx0XHRNYXRoLmNvcyggcDIgKSwgTWF0aC5zaW4oIHAyICksIDFcblx0XHQpO1xuXG5cdH1cblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApO1xuXG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBmb2c6IGZhbHNlIH0gKTtcblxuXHR0aGlzLmNvbmUgPSBuZXcgTGluZVNlZ21lbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblx0dGhpcy5hZGQoIHRoaXMuY29uZSApO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuU3BvdExpZ2h0SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApO1xuU3BvdExpZ2h0SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNwb3RMaWdodEhlbHBlcjtcblxuU3BvdExpZ2h0SGVscGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXG5cdHRoaXMuY29uZS5nZW9tZXRyeS5kaXNwb3NlKCk7XG5cdHRoaXMuY29uZS5tYXRlcmlhbC5kaXNwb3NlKCk7XG5cbn07XG5cblNwb3RMaWdodEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdmVjdG9yMiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblxuXHRcdHRoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHRcdHZhciBjb25lTGVuZ3RoID0gdGhpcy5saWdodC5kaXN0YW5jZSA/IHRoaXMubGlnaHQuZGlzdGFuY2UgOiAxMDAwO1xuXHRcdHZhciBjb25lV2lkdGggPSBjb25lTGVuZ3RoICogTWF0aC50YW4oIHRoaXMubGlnaHQuYW5nbGUgKTtcblxuXHRcdHRoaXMuY29uZS5zY2FsZS5zZXQoIGNvbmVXaWR0aCwgY29uZVdpZHRoLCBjb25lTGVuZ3RoICk7XG5cblx0XHR2ZWN0b3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0dmVjdG9yMi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7XG5cblx0XHR0aGlzLmNvbmUubG9va0F0KCB2ZWN0b3IyLnN1YiggdmVjdG9yICkgKTtcblxuXHRcdGlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLmNvbmUubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmNvbmUubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXG5cdFx0fVxuXG5cdH07XG5cbn0oKTtcblxuLyoqXG4gKiBAYXV0aG9yIFNlYW4gR3JpZmZpbiAvIGh0dHA6Ly90d2l0dGVyLmNvbS9zZ3JpZlxuICogQGF1dGhvciBNaWNoYWVsIEd1ZXJyZXJvIC8gaHR0cDovL3JlYWxpdHltZWx0ZG93bi5jb21cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGlrZXJyIC8gaHR0cDovL3Zlcm9sZC5jb21cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuZnVuY3Rpb24gZ2V0Qm9uZUxpc3QoIG9iamVjdCApIHtcblxuXHR2YXIgYm9uZUxpc3QgPSBbXTtcblxuXHRpZiAoIG9iamVjdCAmJiBvYmplY3QuaXNCb25lICkge1xuXG5cdFx0Ym9uZUxpc3QucHVzaCggb2JqZWN0ICk7XG5cblx0fVxuXG5cdGZvciAoIHZhciBpID0gMDsgaSA8IG9iamVjdC5jaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRib25lTGlzdC5wdXNoLmFwcGx5KCBib25lTGlzdCwgZ2V0Qm9uZUxpc3QoIG9iamVjdC5jaGlsZHJlblsgaSBdICkgKTtcblxuXHR9XG5cblx0cmV0dXJuIGJvbmVMaXN0O1xuXG59XG5cbmZ1bmN0aW9uIFNrZWxldG9uSGVscGVyKCBvYmplY3QgKSB7XG5cblx0dmFyIGJvbmVzID0gZ2V0Qm9uZUxpc3QoIG9iamVjdCApO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgY29sb3JzID0gW107XG5cblx0dmFyIGNvbG9yMSA9IG5ldyBDb2xvciggMCwgMCwgMSApO1xuXHR2YXIgY29sb3IyID0gbmV3IENvbG9yKCAwLCAxLCAwICk7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgYm9uZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0dmFyIGJvbmUgPSBib25lc1sgaSBdO1xuXG5cdFx0aWYgKCBib25lLnBhcmVudCAmJiBib25lLnBhcmVudC5pc0JvbmUgKSB7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcblx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvcjEuciwgY29sb3IxLmcsIGNvbG9yMS5iICk7XG5cdFx0XHRjb2xvcnMucHVzaCggY29sb3IyLnIsIGNvbG9yMi5nLCBjb2xvcjIuYiApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0dmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IHZlcnRleENvbG9yczogVmVydGV4Q29sb3JzLCBkZXB0aFRlc3Q6IGZhbHNlLCBkZXB0aFdyaXRlOiBmYWxzZSwgdHJhbnNwYXJlbnQ6IHRydWUgfSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHR0aGlzLnJvb3QgPSBvYmplY3Q7XG5cdHRoaXMuYm9uZXMgPSBib25lcztcblxuXHR0aGlzLm1hdHJpeCA9IG9iamVjdC5tYXRyaXhXb3JsZDtcblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cbn1cblxuU2tlbGV0b25IZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuU2tlbGV0b25IZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2tlbGV0b25IZWxwZXI7XG5cblNrZWxldG9uSGVscGVyLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZCA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgYm9uZU1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdHZhciBtYXRyaXhXb3JsZEludiA9IG5ldyBNYXRyaXg0KCk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApIHtcblxuXHRcdHZhciBib25lcyA9IHRoaXMuYm9uZXM7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdHZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApO1xuXG5cdFx0bWF0cml4V29ybGRJbnYuZ2V0SW52ZXJzZSggdGhpcy5yb290Lm1hdHJpeFdvcmxkICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGogPSAwOyBpIDwgYm9uZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgYm9uZSA9IGJvbmVzWyBpIF07XG5cblx0XHRcdGlmICggYm9uZS5wYXJlbnQgJiYgYm9uZS5wYXJlbnQuaXNCb25lICkge1xuXG5cdFx0XHRcdGJvbmVNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggbWF0cml4V29ybGRJbnYsIGJvbmUubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggYm9uZU1hdHJpeCApO1xuXHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGosIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTtcblxuXHRcdFx0XHRib25lTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIG1hdHJpeFdvcmxkSW52LCBib25lLnBhcmVudC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR2ZWN0b3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBib25lTWF0cml4ICk7XG5cdFx0XHRcdHBvc2l0aW9uLnNldFhZWiggaiArIDEsIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTtcblxuXHRcdFx0XHRqICs9IDI7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3JjZSApO1xuXG5cdH07XG5cbn0oKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBQb2ludExpZ2h0SGVscGVyKCBsaWdodCwgc3BoZXJlU2l6ZSwgY29sb3IgKSB7XG5cblx0dGhpcy5saWdodCA9IGxpZ2h0O1xuXHR0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0dGhpcy5jb2xvciA9IGNvbG9yO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBTcGhlcmVCdWZmZXJHZW9tZXRyeSggc3BoZXJlU2l6ZSwgNCwgMiApO1xuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgd2lyZWZyYW1lOiB0cnVlLCBmb2c6IGZhbHNlIH0gKTtcblxuXHRNZXNoLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdHRoaXMubWF0cml4ID0gdGhpcy5saWdodC5tYXRyaXhXb3JsZDtcblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy51cGRhdGUoKTtcblxuXG5cdC8qXG5cdHZhciBkaXN0YW5jZUdlb21ldHJ5ID0gbmV3IFRIUkVFLkljb3NhaGVkcm9uR2VvbWV0cnkoIDEsIDIgKTtcblx0dmFyIGRpc3RhbmNlTWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGhleENvbG9yLCBmb2c6IGZhbHNlLCB3aXJlZnJhbWU6IHRydWUsIG9wYWNpdHk6IDAuMSwgdHJhbnNwYXJlbnQ6IHRydWUgfSApO1xuXG5cdHRoaXMubGlnaHRTcGhlcmUgPSBuZXcgVEhSRUUuTWVzaCggYnVsYkdlb21ldHJ5LCBidWxiTWF0ZXJpYWwgKTtcblx0dGhpcy5saWdodERpc3RhbmNlID0gbmV3IFRIUkVFLk1lc2goIGRpc3RhbmNlR2VvbWV0cnksIGRpc3RhbmNlTWF0ZXJpYWwgKTtcblxuXHR2YXIgZCA9IGxpZ2h0LmRpc3RhbmNlO1xuXG5cdGlmICggZCA9PT0gMC4wICkge1xuXG5cdFx0dGhpcy5saWdodERpc3RhbmNlLnZpc2libGUgPSBmYWxzZTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0dGhpcy5saWdodERpc3RhbmNlLnNjYWxlLnNldCggZCwgZCwgZCApO1xuXG5cdH1cblxuXHR0aGlzLmFkZCggdGhpcy5saWdodERpc3RhbmNlICk7XG5cdCovXG5cbn1cblxuUG9pbnRMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNZXNoLnByb3RvdHlwZSApO1xuUG9pbnRMaWdodEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2ludExpZ2h0SGVscGVyO1xuXG5Qb2ludExpZ2h0SGVscGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXG5cdHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKTtcblxufTtcblxuUG9pbnRMaWdodEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdGlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0dGhpcy5tYXRlcmlhbC5jb2xvci5zZXQoIHRoaXMuY29sb3IgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0dGhpcy5tYXRlcmlhbC5jb2xvci5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9yICk7XG5cblx0fVxuXG5cdC8qXG5cdHZhciBkID0gdGhpcy5saWdodC5kaXN0YW5jZTtcblxuXHRpZiAoIGQgPT09IDAuMCApIHtcblxuXHRcdHRoaXMubGlnaHREaXN0YW5jZS52aXNpYmxlID0gZmFsc2U7XG5cblx0fSBlbHNlIHtcblxuXHRcdHRoaXMubGlnaHREaXN0YW5jZS52aXNpYmxlID0gdHJ1ZTtcblx0XHR0aGlzLmxpZ2h0RGlzdGFuY2Uuc2NhbGUuc2V0KCBkLCBkLCBkICk7XG5cblx0fVxuXHQqL1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgYWJlbG5hdGlvbiAvIGh0dHA6Ly9naXRodWIuY29tL2FiZWxuYXRpb25cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHA6Ly9naXRodWIuY29tL011Z2VuODdcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cbmZ1bmN0aW9uIFJlY3RBcmVhTGlnaHRIZWxwZXIoIGxpZ2h0LCBjb2xvciApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5saWdodCA9IGxpZ2h0O1xuXHR0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0dGhpcy5tYXRyaXggPSBsaWdodC5tYXRyaXhXb3JsZDtcblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy5jb2xvciA9IGNvbG9yO1xuXG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBmb2c6IGZhbHNlIH0gKTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIG5ldyBGbG9hdDMyQXJyYXkoIDUgKiAzICksIDMgKSApO1xuXG5cdHRoaXMubGluZSA9IG5ldyBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblx0dGhpcy5hZGQoIHRoaXMubGluZSApO1xuXG5cblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5SZWN0QXJlYUxpZ2h0SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApO1xuUmVjdEFyZWFMaWdodEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSZWN0QXJlYUxpZ2h0SGVscGVyO1xuXG5SZWN0QXJlYUxpZ2h0SGVscGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXG5cdHRoaXMuY2hpbGRyZW5bIDAgXS5nZW9tZXRyeS5kaXNwb3NlKCk7XG5cdHRoaXMuY2hpbGRyZW5bIDAgXS5tYXRlcmlhbC5kaXNwb3NlKCk7XG5cbn07XG5cblJlY3RBcmVhTGlnaHRIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHQvLyBjYWxjdWxhdGUgbmV3IGRpbWVuc2lvbnMgb2YgdGhlIGhlbHBlclxuXG5cdHZhciBoeCA9IHRoaXMubGlnaHQud2lkdGggKiAwLjU7XG5cdHZhciBoeSA9IHRoaXMubGlnaHQuaGVpZ2h0ICogMC41O1xuXG5cdHZhciBwb3NpdGlvbiA9IHRoaXMubGluZS5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHR2YXIgYXJyYXkgPSBwb3NpdGlvbi5hcnJheTtcblxuXHQvLyB1cGRhdGUgdmVydGljZXNcblxuXHRhcnJheVsgMCBdID0gaHg7IGFycmF5WyAxIF0gPSAtIGh5OyBhcnJheVsgMiBdID0gMDtcblx0YXJyYXlbIDMgXSA9IGh4OyBhcnJheVsgNCBdID0gaHk7IGFycmF5WyA1IF0gPSAwO1xuXHRhcnJheVsgNiBdID0gLSBoeDsgYXJyYXlbIDcgXSA9IGh5OyBhcnJheVsgOCBdID0gMDtcblx0YXJyYXlbIDkgXSA9IC0gaHg7IGFycmF5WyAxMCBdID0gLSBoeTsgYXJyYXlbIDExIF0gPSAwO1xuXHRhcnJheVsgMTIgXSA9IGh4OyBhcnJheVsgMTMgXSA9IC0gaHk7IGFycmF5WyAxNCBdID0gMDtcblxuXHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0aWYgKCB0aGlzLmNvbG9yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHR0aGlzLmxpbmUubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdHRoaXMubGluZS5tYXRlcmlhbC5jb2xvci5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9yICk7XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBIZW1pc3BoZXJlTGlnaHRIZWxwZXIoIGxpZ2h0LCBzaXplLCBjb2xvciApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5saWdodCA9IGxpZ2h0O1xuXHR0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0dGhpcy5tYXRyaXggPSBsaWdodC5tYXRyaXhXb3JsZDtcblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy5jb2xvciA9IGNvbG9yO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHNpemUgKTtcblx0Z2VvbWV0cnkucm90YXRlWSggTWF0aC5QSSAqIDAuNSApO1xuXG5cdHRoaXMubWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgd2lyZWZyYW1lOiB0cnVlLCBmb2c6IGZhbHNlIH0gKTtcblx0aWYgKCB0aGlzLmNvbG9yID09PSB1bmRlZmluZWQgKSB0aGlzLm1hdGVyaWFsLnZlcnRleENvbG9ycyA9IFZlcnRleENvbG9ycztcblxuXHR2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcblx0dmFyIGNvbG9ycyA9IG5ldyBGbG9hdDMyQXJyYXkoIHBvc2l0aW9uLmNvdW50ICogMyApO1xuXG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHR0aGlzLmFkZCggbmV3IE1lc2goIGdlb21ldHJ5LCB0aGlzLm1hdGVyaWFsICkgKTtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cbkhlbWlzcGhlcmVMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcbkhlbWlzcGhlcmVMaWdodEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBIZW1pc3BoZXJlTGlnaHRIZWxwZXI7XG5cbkhlbWlzcGhlcmVMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR0aGlzLmNoaWxkcmVuWyAwIF0uZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0aGlzLmNoaWxkcmVuWyAwIF0ubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG59O1xuXG5IZW1pc3BoZXJlTGlnaHRIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgY29sb3IxID0gbmV3IENvbG9yKCk7XG5cdHZhciBjb2xvcjIgPSBuZXcgQ29sb3IoKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0dmFyIG1lc2ggPSB0aGlzLmNoaWxkcmVuWyAwIF07XG5cblx0XHRpZiAoIHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5tYXRlcmlhbC5jb2xvci5zZXQoIHRoaXMuY29sb3IgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHZhciBjb2xvcnMgPSBtZXNoLmdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ2NvbG9yJyApO1xuXG5cdFx0XHRjb2xvcjEuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXHRcdFx0Y29sb3IyLmNvcHkoIHRoaXMubGlnaHQuZ3JvdW5kQ29sb3IgKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY29sb3JzLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgY29sb3IgPSAoIGkgPCAoIGwgLyAyICkgKSA/IGNvbG9yMSA6IGNvbG9yMjtcblxuXHRcdFx0XHRjb2xvcnMuc2V0WFlaKCBpLCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Y29sb3JzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdG1lc2gubG9va0F0KCB2ZWN0b3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkICkubmVnYXRlKCkgKTtcblxuXHR9O1xuXG59KCk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBHcmlkSGVscGVyKCBzaXplLCBkaXZpc2lvbnMsIGNvbG9yMSwgY29sb3IyICkge1xuXG5cdHNpemUgPSBzaXplIHx8IDEwO1xuXHRkaXZpc2lvbnMgPSBkaXZpc2lvbnMgfHwgMTA7XG5cdGNvbG9yMSA9IG5ldyBDb2xvciggY29sb3IxICE9PSB1bmRlZmluZWQgPyBjb2xvcjEgOiAweDQ0NDQ0NCApO1xuXHRjb2xvcjIgPSBuZXcgQ29sb3IoIGNvbG9yMiAhPT0gdW5kZWZpbmVkID8gY29sb3IyIDogMHg4ODg4ODggKTtcblxuXHR2YXIgY2VudGVyID0gZGl2aXNpb25zIC8gMjtcblx0dmFyIHN0ZXAgPSBzaXplIC8gZGl2aXNpb25zO1xuXHR2YXIgaGFsZlNpemUgPSBzaXplIC8gMjtcblxuXHR2YXIgdmVydGljZXMgPSBbXSwgY29sb3JzID0gW107XG5cblx0Zm9yICggdmFyIGkgPSAwLCBqID0gMCwgayA9IC0gaGFsZlNpemU7IGkgPD0gZGl2aXNpb25zOyBpICsrLCBrICs9IHN0ZXAgKSB7XG5cblx0XHR2ZXJ0aWNlcy5wdXNoKCAtIGhhbGZTaXplLCAwLCBrLCBoYWxmU2l6ZSwgMCwgayApO1xuXHRcdHZlcnRpY2VzLnB1c2goIGssIDAsIC0gaGFsZlNpemUsIGssIDAsIGhhbGZTaXplICk7XG5cblx0XHR2YXIgY29sb3IgPSBpID09PSBjZW50ZXIgPyBjb2xvcjEgOiBjb2xvcjI7XG5cblx0XHRjb2xvci50b0FycmF5KCBjb2xvcnMsIGogKTsgaiArPSAzO1xuXHRcdGNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7XG5cdFx0Y29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMztcblx0XHRjb2xvci50b0FycmF5KCBjb2xvcnMsIGogKTsgaiArPSAzO1xuXG5cdH1cblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xuXG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IFZlcnRleENvbG9ycyB9ICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG59XG5cbkdyaWRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuR3JpZEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBHcmlkSGVscGVyO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKiBAYXV0aG9yIEhlY3RhdGUgLyBodHRwOi8vd3d3LmdpdGh1Yi5jb20vSGVjdGF0ZVxuICovXG5cbmZ1bmN0aW9uIFBvbGFyR3JpZEhlbHBlciggcmFkaXVzLCByYWRpYWxzLCBjaXJjbGVzLCBkaXZpc2lvbnMsIGNvbG9yMSwgY29sb3IyICkge1xuXG5cdHJhZGl1cyA9IHJhZGl1cyB8fCAxMDtcblx0cmFkaWFscyA9IHJhZGlhbHMgfHwgMTY7XG5cdGNpcmNsZXMgPSBjaXJjbGVzIHx8IDg7XG5cdGRpdmlzaW9ucyA9IGRpdmlzaW9ucyB8fCA2NDtcblx0Y29sb3IxID0gbmV3IENvbG9yKCBjb2xvcjEgIT09IHVuZGVmaW5lZCA/IGNvbG9yMSA6IDB4NDQ0NDQ0ICk7XG5cdGNvbG9yMiA9IG5ldyBDb2xvciggY29sb3IyICE9PSB1bmRlZmluZWQgPyBjb2xvcjIgOiAweDg4ODg4OCApO1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgY29sb3JzID0gW107XG5cblx0dmFyIHgsIHo7XG5cdHZhciB2LCBpLCBqLCByLCBjb2xvcjtcblxuXHQvLyBjcmVhdGUgdGhlIHJhZGlhbHNcblxuXHRmb3IgKCBpID0gMDsgaSA8PSByYWRpYWxzOyBpICsrICkge1xuXG5cdFx0diA9ICggaSAvIHJhZGlhbHMgKSAqICggTWF0aC5QSSAqIDIgKTtcblxuXHRcdHggPSBNYXRoLnNpbiggdiApICogcmFkaXVzO1xuXHRcdHogPSBNYXRoLmNvcyggdiApICogcmFkaXVzO1xuXG5cdFx0dmVydGljZXMucHVzaCggMCwgMCwgMCApO1xuXHRcdHZlcnRpY2VzLnB1c2goIHgsIDAsIHogKTtcblxuXHRcdGNvbG9yID0gKCBpICYgMSApID8gY29sb3IxIDogY29sb3IyO1xuXG5cdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblx0XHRjb2xvcnMucHVzaCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xuXG5cdH1cblxuXHQvLyBjcmVhdGUgdGhlIGNpcmNsZXNcblxuXHRmb3IgKCBpID0gMDsgaSA8PSBjaXJjbGVzOyBpICsrICkge1xuXG5cdFx0Y29sb3IgPSAoIGkgJiAxICkgPyBjb2xvcjEgOiBjb2xvcjI7XG5cblx0XHRyID0gcmFkaXVzIC0gKCByYWRpdXMgLyBjaXJjbGVzICogaSApO1xuXG5cdFx0Zm9yICggaiA9IDA7IGogPCBkaXZpc2lvbnM7IGogKysgKSB7XG5cblx0XHRcdC8vIGZpcnN0IHZlcnRleFxuXG5cdFx0XHR2ID0gKCBqIC8gZGl2aXNpb25zICkgKiAoIE1hdGguUEkgKiAyICk7XG5cblx0XHRcdHggPSBNYXRoLnNpbiggdiApICogcjtcblx0XHRcdHogPSBNYXRoLmNvcyggdiApICogcjtcblxuXHRcdFx0dmVydGljZXMucHVzaCggeCwgMCwgeiApO1xuXHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblxuXHRcdFx0Ly8gc2Vjb25kIHZlcnRleFxuXG5cdFx0XHR2ID0gKCAoIGogKyAxICkgLyBkaXZpc2lvbnMgKSAqICggTWF0aC5QSSAqIDIgKTtcblxuXHRcdFx0eCA9IE1hdGguc2luKCB2ICkgKiByO1xuXHRcdFx0eiA9IE1hdGguY29zKCB2ICkgKiByO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB4LCAwLCB6ICk7XG5cdFx0XHRjb2xvcnMucHVzaCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xuXG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IFZlcnRleENvbG9ycyB9ICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG59XG5cblBvbGFyR3JpZEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5Qb2xhckdyaWRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9sYXJHcmlkSGVscGVyO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBGYWNlTm9ybWFsc0hlbHBlciggb2JqZWN0LCBzaXplLCBoZXgsIGxpbmV3aWR0aCApIHtcblxuXHQvLyBGYWNlTm9ybWFsc0hlbHBlciBvbmx5IHN1cHBvcnRzIFRIUkVFLkdlb21ldHJ5XG5cblx0dGhpcy5vYmplY3QgPSBvYmplY3Q7XG5cblx0dGhpcy5zaXplID0gKCBzaXplICE9PSB1bmRlZmluZWQgKSA/IHNpemUgOiAxO1xuXG5cdHZhciBjb2xvciA9ICggaGV4ICE9PSB1bmRlZmluZWQgKSA/IGhleCA6IDB4ZmZmZjAwO1xuXG5cdHZhciB3aWR0aCA9ICggbGluZXdpZHRoICE9PSB1bmRlZmluZWQgKSA/IGxpbmV3aWR0aCA6IDE7XG5cblx0Ly9cblxuXHR2YXIgbk5vcm1hbHMgPSAwO1xuXG5cdHZhciBvYmpHZW9tZXRyeSA9IHRoaXMub2JqZWN0Lmdlb21ldHJ5O1xuXG5cdGlmICggb2JqR2VvbWV0cnkgJiYgb2JqR2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdG5Ob3JtYWxzID0gb2JqR2VvbWV0cnkuZmFjZXMubGVuZ3RoO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5GYWNlTm9ybWFsc0hlbHBlcjogb25seSBUSFJFRS5HZW9tZXRyeSBpcyBzdXBwb3J0ZWQuIFVzZSBUSFJFRS5WZXJ0ZXhOb3JtYWxzSGVscGVyLCBpbnN0ZWFkLicgKTtcblxuXHR9XG5cblx0Ly9cblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHR2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5Ob3JtYWxzICogMiAqIDMsIDMgKTtcblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIHBvc2l0aW9ucyApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciwgbGluZXdpZHRoOiB3aWR0aCB9ICkgKTtcblxuXHQvL1xuXG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cbkZhY2VOb3JtYWxzSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcbkZhY2VOb3JtYWxzSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEZhY2VOb3JtYWxzSGVscGVyO1xuXG5GYWNlTm9ybWFsc0hlbHBlci5wcm90b3R5cGUudXBkYXRlID0gKCBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblxuXHRcdHRoaXMub2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KCB0aGlzLm9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0dmFyIG1hdHJpeFdvcmxkID0gdGhpcy5vYmplY3QubWF0cml4V29ybGQ7XG5cblx0XHR2YXIgcG9zaXRpb24gPSB0aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHQvL1xuXG5cdFx0dmFyIG9iakdlb21ldHJ5ID0gdGhpcy5vYmplY3QuZ2VvbWV0cnk7XG5cblx0XHR2YXIgdmVydGljZXMgPSBvYmpHZW9tZXRyeS52ZXJ0aWNlcztcblxuXHRcdHZhciBmYWNlcyA9IG9iakdlb21ldHJ5LmZhY2VzO1xuXG5cdFx0dmFyIGlkeCA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IGZhY2VzWyBpIF07XG5cblx0XHRcdHZhciBub3JtYWwgPSBmYWNlLm5vcm1hbDtcblxuXHRcdFx0djEuY29weSggdmVydGljZXNbIGZhY2UuYSBdIClcblx0XHRcdFx0LmFkZCggdmVydGljZXNbIGZhY2UuYiBdIClcblx0XHRcdFx0LmFkZCggdmVydGljZXNbIGZhY2UuYyBdIClcblx0XHRcdFx0LmRpdmlkZVNjYWxhciggMyApXG5cdFx0XHRcdC5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7XG5cblx0XHRcdHYyLmNvcHkoIG5vcm1hbCApLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIHRoaXMuc2l6ZSApLmFkZCggdjEgKTtcblxuXHRcdFx0cG9zaXRpb24uc2V0WFlaKCBpZHgsIHYxLngsIHYxLnksIHYxLnogKTtcblxuXHRcdFx0aWR4ID0gaWR4ICsgMTtcblxuXHRcdFx0cG9zaXRpb24uc2V0WFlaKCBpZHgsIHYyLngsIHYyLnksIHYyLnogKTtcblxuXHRcdFx0aWR4ID0gaWR4ICsgMTtcblxuXHRcdH1cblxuXHRcdHBvc2l0aW9uLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHR9O1xuXG59KCkgKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cbmZ1bmN0aW9uIERpcmVjdGlvbmFsTGlnaHRIZWxwZXIoIGxpZ2h0LCBzaXplLCBjb2xvciApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5saWdodCA9IGxpZ2h0O1xuXHR0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0dGhpcy5tYXRyaXggPSBsaWdodC5tYXRyaXhXb3JsZDtcblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy5jb2xvciA9IGNvbG9yO1xuXG5cdGlmICggc2l6ZSA9PT0gdW5kZWZpbmVkICkgc2l6ZSA9IDE7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIFtcblx0XHQtIHNpemUsIHNpemUsIDAsXG5cdFx0c2l6ZSwgc2l6ZSwgMCxcblx0XHRzaXplLCAtIHNpemUsIDAsXG5cdFx0LSBzaXplLCAtIHNpemUsIDAsXG5cdFx0LSBzaXplLCBzaXplLCAwXG5cdF0sIDMgKSApO1xuXG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBmb2c6IGZhbHNlIH0gKTtcblxuXHR0aGlzLmxpZ2h0UGxhbmUgPSBuZXcgTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cdHRoaXMuYWRkKCB0aGlzLmxpZ2h0UGxhbmUgKTtcblxuXHRnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBbIDAsIDAsIDAsIDAsIDAsIDEgXSwgMyApICk7XG5cblx0dGhpcy50YXJnZXRMaW5lID0gbmV3IExpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXHR0aGlzLmFkZCggdGhpcy50YXJnZXRMaW5lICk7XG5cblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5EaXJlY3Rpb25hbExpZ2h0SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApO1xuRGlyZWN0aW9uYWxMaWdodEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBEaXJlY3Rpb25hbExpZ2h0SGVscGVyO1xuXG5EaXJlY3Rpb25hbExpZ2h0SGVscGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXG5cdHRoaXMubGlnaHRQbGFuZS5nZW9tZXRyeS5kaXNwb3NlKCk7XG5cdHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5kaXNwb3NlKCk7XG5cdHRoaXMudGFyZ2V0TGluZS5nZW9tZXRyeS5kaXNwb3NlKCk7XG5cdHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5kaXNwb3NlKCk7XG5cbn07XG5cbkRpcmVjdGlvbmFsTGlnaHRIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdjIgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdjMgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHR2MS5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubGlnaHQubWF0cml4V29ybGQgKTtcblx0XHR2Mi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7XG5cdFx0djMuc3ViVmVjdG9ycyggdjIsIHYxICk7XG5cblx0XHR0aGlzLmxpZ2h0UGxhbmUubG9va0F0KCB2MyApO1xuXG5cdFx0aWYgKCB0aGlzLmNvbG9yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5jb2xvci5zZXQoIHRoaXMuY29sb3IgKTtcblx0XHRcdHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5jb2xvci5zZXQoIHRoaXMuY29sb3IgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5jb2xvci5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9yICk7XG5cdFx0XHR0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy50YXJnZXRMaW5lLmxvb2tBdCggdjMgKTtcblx0XHR0aGlzLnRhcmdldExpbmUuc2NhbGUueiA9IHYzLmxlbmd0aCgpO1xuXG5cdH07XG5cbn0oKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqXG4gKlx0LSBzaG93cyBmcnVzdHVtLCBsaW5lIG9mIHNpZ2h0IGFuZCB1cCBvZiB0aGUgY2FtZXJhXG4gKlx0LSBzdWl0YWJsZSBmb3IgZmFzdCB1cGRhdGVzXG4gKiBcdC0gYmFzZWQgb24gZnJ1c3R1bSB2aXN1YWxpemF0aW9uIGluIGxpZ2h0Z2wuanMgc2hhZG93bWFwIGV4YW1wbGVcbiAqXHRcdGh0dHA6Ly9ldmFudy5naXRodWIuY29tL2xpZ2h0Z2wuanMvdGVzdHMvc2hhZG93bWFwLmh0bWxcbiAqL1xuXG5mdW5jdGlvbiBDYW1lcmFIZWxwZXIoIGNhbWVyYSApIHtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0dmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmZmZiwgdmVydGV4Q29sb3JzOiBGYWNlQ29sb3JzIH0gKTtcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIGNvbG9ycyA9IFtdO1xuXG5cdHZhciBwb2ludE1hcCA9IHt9O1xuXG5cdC8vIGNvbG9yc1xuXG5cdHZhciBjb2xvckZydXN0dW0gPSBuZXcgQ29sb3IoIDB4ZmZhYTAwICk7XG5cdHZhciBjb2xvckNvbmUgPSBuZXcgQ29sb3IoIDB4ZmYwMDAwICk7XG5cdHZhciBjb2xvclVwID0gbmV3IENvbG9yKCAweDAwYWFmZiApO1xuXHR2YXIgY29sb3JUYXJnZXQgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7XG5cdHZhciBjb2xvckNyb3NzID0gbmV3IENvbG9yKCAweDMzMzMzMyApO1xuXG5cdC8vIG5lYXJcblxuXHRhZGRMaW5lKCAnbjEnLCAnbjInLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggJ24yJywgJ240JywgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoICduNCcsICduMycsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCAnbjMnLCAnbjEnLCBjb2xvckZydXN0dW0gKTtcblxuXHQvLyBmYXJcblxuXHRhZGRMaW5lKCAnZjEnLCAnZjInLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggJ2YyJywgJ2Y0JywgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoICdmNCcsICdmMycsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCAnZjMnLCAnZjEnLCBjb2xvckZydXN0dW0gKTtcblxuXHQvLyBzaWRlc1xuXG5cdGFkZExpbmUoICduMScsICdmMScsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCAnbjInLCAnZjInLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggJ24zJywgJ2YzJywgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoICduNCcsICdmNCcsIGNvbG9yRnJ1c3R1bSApO1xuXG5cdC8vIGNvbmVcblxuXHRhZGRMaW5lKCAncCcsICduMScsIGNvbG9yQ29uZSApO1xuXHRhZGRMaW5lKCAncCcsICduMicsIGNvbG9yQ29uZSApO1xuXHRhZGRMaW5lKCAncCcsICduMycsIGNvbG9yQ29uZSApO1xuXHRhZGRMaW5lKCAncCcsICduNCcsIGNvbG9yQ29uZSApO1xuXG5cdC8vIHVwXG5cblx0YWRkTGluZSggJ3UxJywgJ3UyJywgY29sb3JVcCApO1xuXHRhZGRMaW5lKCAndTInLCAndTMnLCBjb2xvclVwICk7XG5cdGFkZExpbmUoICd1MycsICd1MScsIGNvbG9yVXAgKTtcblxuXHQvLyB0YXJnZXRcblxuXHRhZGRMaW5lKCAnYycsICd0JywgY29sb3JUYXJnZXQgKTtcblx0YWRkTGluZSggJ3AnLCAnYycsIGNvbG9yQ3Jvc3MgKTtcblxuXHQvLyBjcm9zc1xuXG5cdGFkZExpbmUoICdjbjEnLCAnY24yJywgY29sb3JDcm9zcyApO1xuXHRhZGRMaW5lKCAnY24zJywgJ2NuNCcsIGNvbG9yQ3Jvc3MgKTtcblxuXHRhZGRMaW5lKCAnY2YxJywgJ2NmMicsIGNvbG9yQ3Jvc3MgKTtcblx0YWRkTGluZSggJ2NmMycsICdjZjQnLCBjb2xvckNyb3NzICk7XG5cblx0ZnVuY3Rpb24gYWRkTGluZSggYSwgYiwgY29sb3IgKSB7XG5cblx0XHRhZGRQb2ludCggYSwgY29sb3IgKTtcblx0XHRhZGRQb2ludCggYiwgY29sb3IgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gYWRkUG9pbnQoIGlkLCBjb2xvciApIHtcblxuXHRcdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcblx0XHRjb2xvcnMucHVzaCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xuXG5cdFx0aWYgKCBwb2ludE1hcFsgaWQgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRwb2ludE1hcFsgaWQgXSA9IFtdO1xuXG5cdFx0fVxuXG5cdFx0cG9pbnRNYXBbIGlkIF0ucHVzaCggKCB2ZXJ0aWNlcy5sZW5ndGggLyAzICkgLSAxICk7XG5cblx0fVxuXG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XG5cdGlmICggdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCApIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHR0aGlzLm1hdHJpeCA9IGNhbWVyYS5tYXRyaXhXb3JsZDtcblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy5wb2ludE1hcCA9IHBvaW50TWFwO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuQ2FtZXJhSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcbkNhbWVyYUhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDYW1lcmFIZWxwZXI7XG5cbkNhbWVyYUhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBnZW9tZXRyeSwgcG9pbnRNYXA7XG5cblx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBjYW1lcmEgPSBuZXcgQ2FtZXJhKCk7XG5cblx0ZnVuY3Rpb24gc2V0UG9pbnQoIHBvaW50LCB4LCB5LCB6ICkge1xuXG5cdFx0dmVjdG9yLnNldCggeCwgeSwgeiApLnVucHJvamVjdCggY2FtZXJhICk7XG5cblx0XHR2YXIgcG9pbnRzID0gcG9pbnRNYXBbIHBvaW50IF07XG5cblx0XHRpZiAoIHBvaW50cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBwb2ludHNbIGkgXSwgdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHRnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cdFx0cG9pbnRNYXAgPSB0aGlzLnBvaW50TWFwO1xuXG5cdFx0dmFyIHcgPSAxLCBoID0gMTtcblxuXHRcdC8vIHdlIG5lZWQganVzdCBjYW1lcmEgcHJvamVjdGlvbiBtYXRyaXhcblx0XHQvLyB3b3JsZCBtYXRyaXggbXVzdCBiZSBpZGVudGl0eVxuXG5cdFx0Y2FtZXJhLnByb2plY3Rpb25NYXRyaXguY29weSggdGhpcy5jYW1lcmEucHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0Ly8gY2VudGVyIC8gdGFyZ2V0XG5cblx0XHRzZXRQb2ludCggJ2MnLCAwLCAwLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ3QnLCAwLCAwLCAxICk7XG5cblx0XHQvLyBuZWFyXG5cblx0XHRzZXRQb2ludCggJ24xJywgLSB3LCAtIGgsIC0gMSApO1xuXHRcdHNldFBvaW50KCAnbjInLCB3LCAtIGgsIC0gMSApO1xuXHRcdHNldFBvaW50KCAnbjMnLCAtIHcsIGgsIC0gMSApO1xuXHRcdHNldFBvaW50KCAnbjQnLCB3LCBoLCAtIDEgKTtcblxuXHRcdC8vIGZhclxuXG5cdFx0c2V0UG9pbnQoICdmMScsIC0gdywgLSBoLCAxICk7XG5cdFx0c2V0UG9pbnQoICdmMicsIHcsIC0gaCwgMSApO1xuXHRcdHNldFBvaW50KCAnZjMnLCAtIHcsIGgsIDEgKTtcblx0XHRzZXRQb2ludCggJ2Y0JywgdywgaCwgMSApO1xuXG5cdFx0Ly8gdXBcblxuXHRcdHNldFBvaW50KCAndTEnLCB3ICogMC43LCBoICogMS4xLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ3UyJywgLSB3ICogMC43LCBoICogMS4xLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ3UzJywgMCwgaCAqIDIsIC0gMSApO1xuXG5cdFx0Ly8gY3Jvc3NcblxuXHRcdHNldFBvaW50KCAnY2YxJywgLSB3LCAwLCAxICk7XG5cdFx0c2V0UG9pbnQoICdjZjInLCB3LCAwLCAxICk7XG5cdFx0c2V0UG9pbnQoICdjZjMnLCAwLCAtIGgsIDEgKTtcblx0XHRzZXRQb2ludCggJ2NmNCcsIDAsIGgsIDEgKTtcblxuXHRcdHNldFBvaW50KCAnY24xJywgLSB3LCAwLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ2NuMicsIHcsIDAsIC0gMSApO1xuXHRcdHNldFBvaW50KCAnY24zJywgMCwgLSBoLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ2NuNCcsIDAsIGgsIC0gMSApO1xuXG5cdFx0Z2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICkubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdH07XG5cbn0oKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cDovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbmZ1bmN0aW9uIEJveEhlbHBlciggb2JqZWN0LCBjb2xvciApIHtcblxuXHR0aGlzLm9iamVjdCA9IG9iamVjdDtcblxuXHRpZiAoIGNvbG9yID09PSB1bmRlZmluZWQgKSBjb2xvciA9IDB4ZmZmZjAwO1xuXG5cdHZhciBpbmRpY2VzID0gbmV3IFVpbnQxNkFycmF5KCBbIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDAsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDQsIDAsIDQsIDEsIDUsIDIsIDYsIDMsIDcgXSApO1xuXHR2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheSggOCAqIDMgKTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuc2V0SW5kZXgoIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGluZGljZXMsIDEgKSApO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9ucywgMyApICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yIH0gKSApO1xuXG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuQm94SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcbkJveEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCb3hIZWxwZXI7XG5cbkJveEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gKCBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGJveCA9IG5ldyBCb3gzKCk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSggb2JqZWN0ICkge1xuXG5cdFx0aWYgKCBvYmplY3QgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94SGVscGVyOiAudXBkYXRlKCkgaGFzIG5vIGxvbmdlciBhcmd1bWVudHMuJyApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLm9iamVjdCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRib3guc2V0RnJvbU9iamVjdCggdGhpcy5vYmplY3QgKTtcblxuXHRcdH1cblxuXHRcdGlmICggYm94LmlzRW1wdHkoKSApIHJldHVybjtcblxuXHRcdHZhciBtaW4gPSBib3gubWluO1xuXHRcdHZhciBtYXggPSBib3gubWF4O1xuXG5cdFx0Lypcblx0XHQgIDVfX19fNFxuXHRcdDEvX19fMC98XG5cdFx0fCA2X198Xzdcblx0XHQyL19fXzMvXG5cblx0XHQwOiBtYXgueCwgbWF4LnksIG1heC56XG5cdFx0MTogbWluLngsIG1heC55LCBtYXguelxuXHRcdDI6IG1pbi54LCBtaW4ueSwgbWF4Lnpcblx0XHQzOiBtYXgueCwgbWluLnksIG1heC56XG5cdFx0NDogbWF4LngsIG1heC55LCBtaW4uelxuXHRcdDU6IG1pbi54LCBtYXgueSwgbWluLnpcblx0XHQ2OiBtaW4ueCwgbWluLnksIG1pbi56XG5cdFx0NzogbWF4LngsIG1pbi55LCBtaW4uelxuXHRcdCovXG5cblx0XHR2YXIgcG9zaXRpb24gPSB0aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0dmFyIGFycmF5ID0gcG9zaXRpb24uYXJyYXk7XG5cblx0XHRhcnJheVsgMCBdID0gbWF4Lng7IGFycmF5WyAxIF0gPSBtYXgueTsgYXJyYXlbIDIgXSA9IG1heC56O1xuXHRcdGFycmF5WyAzIF0gPSBtaW4ueDsgYXJyYXlbIDQgXSA9IG1heC55OyBhcnJheVsgNSBdID0gbWF4Lno7XG5cdFx0YXJyYXlbIDYgXSA9IG1pbi54OyBhcnJheVsgNyBdID0gbWluLnk7IGFycmF5WyA4IF0gPSBtYXguejtcblx0XHRhcnJheVsgOSBdID0gbWF4Lng7IGFycmF5WyAxMCBdID0gbWluLnk7IGFycmF5WyAxMSBdID0gbWF4Lno7XG5cdFx0YXJyYXlbIDEyIF0gPSBtYXgueDsgYXJyYXlbIDEzIF0gPSBtYXgueTsgYXJyYXlbIDE0IF0gPSBtaW4uejtcblx0XHRhcnJheVsgMTUgXSA9IG1pbi54OyBhcnJheVsgMTYgXSA9IG1heC55OyBhcnJheVsgMTcgXSA9IG1pbi56O1xuXHRcdGFycmF5WyAxOCBdID0gbWluLng7IGFycmF5WyAxOSBdID0gbWluLnk7IGFycmF5WyAyMCBdID0gbWluLno7XG5cdFx0YXJyYXlbIDIxIF0gPSBtYXgueDsgYXJyYXlbIDIyIF0gPSBtaW4ueTsgYXJyYXlbIDIzIF0gPSBtaW4uejtcblxuXHRcdHBvc2l0aW9uLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdHRoaXMuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0fTtcblxufSApKCk7XG5cbkJveEhlbHBlci5wcm90b3R5cGUuc2V0RnJvbU9iamVjdCA9IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuXHR0aGlzLnVwZGF0ZSgpO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cbmZ1bmN0aW9uIEJveDNIZWxwZXIoIGJveCwgaGV4ICkge1xuXG5cdHRoaXMudHlwZSA9ICdCb3gzSGVscGVyJztcblxuXHR0aGlzLmJveCA9IGJveDtcblxuXHR2YXIgY29sb3IgPSAoIGhleCAhPT0gdW5kZWZpbmVkICkgPyBoZXggOiAweGZmZmYwMDtcblxuXHR2YXIgaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheSggWyAwLCAxLCAxLCAyLCAyLCAzLCAzLCAwLCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA0LCAwLCA0LCAxLCA1LCAyLCA2LCAzLCA3IF0gKTtcblxuXHR2YXIgcG9zaXRpb25zID0gWyAxLCAxLCAxLCAtIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAxLCAtIDEsIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAtIDEsIC0gMSwgLSAxLCAtIDEsIDEsIC0gMSwgLSAxIF07XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0Z2VvbWV0cnkuc2V0SW5kZXgoIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGluZGljZXMsIDEgKSApO1xuXG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9ucywgMyApICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yIH0gKSApO1xuXG5cdHRoaXMuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cbn1cblxuQm94M0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5Cb3gzSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJveDNIZWxwZXI7XG5cbkJveDNIZWxwZXIucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkID0gZnVuY3Rpb24gKCBmb3JjZSApIHtcblxuXHR2YXIgYm94ID0gdGhpcy5ib3g7XG5cblx0aWYgKCBib3guaXNFbXB0eSgpICkgcmV0dXJuO1xuXG5cdGJveC5nZXRDZW50ZXIoIHRoaXMucG9zaXRpb24gKTtcblxuXHRib3guZ2V0U2l6ZSggdGhpcy5zY2FsZSApO1xuXG5cdHRoaXMuc2NhbGUubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xuXG5cdE9iamVjdDNELnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3JjZSApO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cbmZ1bmN0aW9uIFBsYW5lSGVscGVyKCBwbGFuZSwgc2l6ZSwgaGV4ICkge1xuXG5cdHRoaXMudHlwZSA9ICdQbGFuZUhlbHBlcic7XG5cblx0dGhpcy5wbGFuZSA9IHBsYW5lO1xuXG5cdHRoaXMuc2l6ZSA9ICggc2l6ZSA9PT0gdW5kZWZpbmVkICkgPyAxIDogc2l6ZTtcblxuXHR2YXIgY29sb3IgPSAoIGhleCAhPT0gdW5kZWZpbmVkICkgPyBoZXggOiAweGZmZmYwMDtcblxuXHR2YXIgcG9zaXRpb25zID0gWyAxLCAtIDEsIDEsIC0gMSwgMSwgMSwgLSAxLCAtIDEsIDEsIDEsIDEsIDEsIC0gMSwgMSwgMSwgLSAxLCAtIDEsIDEsIDEsIC0gMSwgMSwgMSwgMSwgMSwgMCwgMCwgMSwgMCwgMCwgMCBdO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApO1xuXHRnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRMaW5lLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yIH0gKSApO1xuXG5cdC8vXG5cblx0dmFyIHBvc2l0aW9uczIgPSBbIDEsIDEsIDEsIC0gMSwgMSwgMSwgLSAxLCAtIDEsIDEsIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAxLCAtIDEsIDEgXTtcblxuXHR2YXIgZ2VvbWV0cnkyID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGdlb21ldHJ5Mi5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMyLCAzICkgKTtcblx0Z2VvbWV0cnkyLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdHRoaXMuYWRkKCBuZXcgTWVzaCggZ2VvbWV0cnkyLCBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yLCBvcGFjaXR5OiAwLjIsIHRyYW5zcGFyZW50OiB0cnVlLCBkZXB0aFdyaXRlOiBmYWxzZSB9ICkgKSApO1xuXG59XG5cblBsYW5lSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmUucHJvdG90eXBlICk7XG5QbGFuZUhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQbGFuZUhlbHBlcjtcblxuUGxhbmVIZWxwZXIucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkID0gZnVuY3Rpb24gKCBmb3JjZSApIHtcblxuXHR2YXIgc2NhbGUgPSAtIHRoaXMucGxhbmUuY29uc3RhbnQ7XG5cblx0aWYgKCBNYXRoLmFicyggc2NhbGUgKSA8IDFlLTggKSBzY2FsZSA9IDFlLTg7IC8vIHNpZ24gZG9lcyBub3QgbWF0dGVyXG5cblx0dGhpcy5zY2FsZS5zZXQoIDAuNSAqIHRoaXMuc2l6ZSwgMC41ICogdGhpcy5zaXplLCBzY2FsZSApO1xuXG5cdHRoaXMubG9va0F0KCB0aGlzLnBsYW5lLm5vcm1hbCApO1xuXG5cdE9iamVjdDNELnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3JjZSApO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL2dpdGh1Yi5jb20veno4NVxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICpcbiAqIENyZWF0ZXMgYW4gYXJyb3cgZm9yIHZpc3VhbGl6aW5nIGRpcmVjdGlvbnNcbiAqXG4gKiBQYXJhbWV0ZXJzOlxuICogIGRpciAtIFZlY3RvcjNcbiAqICBvcmlnaW4gLSBWZWN0b3IzXG4gKiAgbGVuZ3RoIC0gTnVtYmVyXG4gKiAgY29sb3IgLSBjb2xvciBpbiBoZXggdmFsdWVcbiAqICBoZWFkTGVuZ3RoIC0gTnVtYmVyXG4gKiAgaGVhZFdpZHRoIC0gTnVtYmVyXG4gKi9cblxudmFyIGxpbmVHZW9tZXRyeTtcbnZhciBjb25lR2VvbWV0cnk7XG5cbmZ1bmN0aW9uIEFycm93SGVscGVyKCBkaXIsIG9yaWdpbiwgbGVuZ3RoLCBjb2xvciwgaGVhZExlbmd0aCwgaGVhZFdpZHRoICkge1xuXG5cdC8vIGRpciBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0aWYgKCBjb2xvciA9PT0gdW5kZWZpbmVkICkgY29sb3IgPSAweGZmZmYwMDtcblx0aWYgKCBsZW5ndGggPT09IHVuZGVmaW5lZCApIGxlbmd0aCA9IDE7XG5cdGlmICggaGVhZExlbmd0aCA9PT0gdW5kZWZpbmVkICkgaGVhZExlbmd0aCA9IDAuMiAqIGxlbmd0aDtcblx0aWYgKCBoZWFkV2lkdGggPT09IHVuZGVmaW5lZCApIGhlYWRXaWR0aCA9IDAuMiAqIGhlYWRMZW5ndGg7XG5cblx0aWYgKCBsaW5lR2VvbWV0cnkgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGxpbmVHZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRcdGxpbmVHZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBbIDAsIDAsIDAsIDAsIDEsIDAgXSwgMyApICk7XG5cblx0XHRjb25lR2VvbWV0cnkgPSBuZXcgQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSggMCwgMC41LCAxLCA1LCAxICk7XG5cdFx0Y29uZUdlb21ldHJ5LnRyYW5zbGF0ZSggMCwgLSAwLjUsIDAgKTtcblxuXHR9XG5cblx0dGhpcy5wb3NpdGlvbi5jb3B5KCBvcmlnaW4gKTtcblxuXHR0aGlzLmxpbmUgPSBuZXcgTGluZSggbGluZUdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yIH0gKSApO1xuXHR0aGlzLmxpbmUubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLmFkZCggdGhpcy5saW5lICk7XG5cblx0dGhpcy5jb25lID0gbmV3IE1lc2goIGNvbmVHZW9tZXRyeSwgbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTtcblx0dGhpcy5jb25lLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5hZGQoIHRoaXMuY29uZSApO1xuXG5cdHRoaXMuc2V0RGlyZWN0aW9uKCBkaXIgKTtcblx0dGhpcy5zZXRMZW5ndGgoIGxlbmd0aCwgaGVhZExlbmd0aCwgaGVhZFdpZHRoICk7XG5cbn1cblxuQXJyb3dIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5BcnJvd0hlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBcnJvd0hlbHBlcjtcblxuQXJyb3dIZWxwZXIucHJvdG90eXBlLnNldERpcmVjdGlvbiA9ICggZnVuY3Rpb24gKCkge1xuXG5cdHZhciBheGlzID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHJhZGlhbnM7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHNldERpcmVjdGlvbiggZGlyICkge1xuXG5cdFx0Ly8gZGlyIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXG5cdFx0aWYgKCBkaXIueSA+IDAuOTk5OTkgKSB7XG5cblx0XHRcdHRoaXMucXVhdGVybmlvbi5zZXQoIDAsIDAsIDAsIDEgKTtcblxuXHRcdH0gZWxzZSBpZiAoIGRpci55IDwgLSAwLjk5OTk5ICkge1xuXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24uc2V0KCAxLCAwLCAwLCAwICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRheGlzLnNldCggZGlyLnosIDAsIC0gZGlyLnggKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0cmFkaWFucyA9IE1hdGguYWNvcyggZGlyLnkgKTtcblxuXHRcdFx0dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIHJhZGlhbnMgKTtcblxuXHRcdH1cblxuXHR9O1xuXG59KCkgKTtcblxuQXJyb3dIZWxwZXIucHJvdG90eXBlLnNldExlbmd0aCA9IGZ1bmN0aW9uICggbGVuZ3RoLCBoZWFkTGVuZ3RoLCBoZWFkV2lkdGggKSB7XG5cblx0aWYgKCBoZWFkTGVuZ3RoID09PSB1bmRlZmluZWQgKSBoZWFkTGVuZ3RoID0gMC4yICogbGVuZ3RoO1xuXHRpZiAoIGhlYWRXaWR0aCA9PT0gdW5kZWZpbmVkICkgaGVhZFdpZHRoID0gMC4yICogaGVhZExlbmd0aDtcblxuXHR0aGlzLmxpbmUuc2NhbGUuc2V0KCAxLCBNYXRoLm1heCggMCwgbGVuZ3RoIC0gaGVhZExlbmd0aCApLCAxICk7XG5cdHRoaXMubGluZS51cGRhdGVNYXRyaXgoKTtcblxuXHR0aGlzLmNvbmUuc2NhbGUuc2V0KCBoZWFkV2lkdGgsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApO1xuXHR0aGlzLmNvbmUucG9zaXRpb24ueSA9IGxlbmd0aDtcblx0dGhpcy5jb25lLnVwZGF0ZU1hdHJpeCgpO1xuXG59O1xuXG5BcnJvd0hlbHBlci5wcm90b3R5cGUuc2V0Q29sb3IgPSBmdW5jdGlvbiAoIGNvbG9yICkge1xuXG5cdHRoaXMubGluZS5tYXRlcmlhbC5jb2xvci5jb3B5KCBjb2xvciApO1xuXHR0aGlzLmNvbmUubWF0ZXJpYWwuY29sb3IuY29weSggY29sb3IgKTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIHNyb3VjaGVyYXkgLyBodHRwOi8vc3JvdWNoZXJheS5vcmcvXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEF4ZXNIZWxwZXIoIHNpemUgKSB7XG5cblx0c2l6ZSA9IHNpemUgfHwgMTtcblxuXHR2YXIgdmVydGljZXMgPSBbXG5cdFx0MCwgMCwgMCxcdHNpemUsIDAsIDAsXG5cdFx0MCwgMCwgMCxcdDAsIHNpemUsIDAsXG5cdFx0MCwgMCwgMCxcdDAsIDAsIHNpemVcblx0XTtcblxuXHR2YXIgY29sb3JzID0gW1xuXHRcdDEsIDAsIDAsXHQxLCAwLjYsIDAsXG5cdFx0MCwgMSwgMCxcdDAuNiwgMSwgMCxcblx0XHQwLCAwLCAxLFx0MCwgMC42LCAxXG5cdF07XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiBWZXJ0ZXhDb2xvcnMgfSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxufVxuXG5BeGVzSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcbkF4ZXNIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQXhlc0hlbHBlcjtcblxuLy9cblxuQ3VydmUuY3JlYXRlID0gZnVuY3Rpb24gKCBjb25zdHJ1Y3QsIGdldFBvaW50ICkge1xuXG5cdGNvbnNvbGUubG9nKCAnVEhSRUUuQ3VydmUuY3JlYXRlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCcgKTtcblxuXHRjb25zdHJ1Y3QucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5cdGNvbnN0cnVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3Q7XG5cdGNvbnN0cnVjdC5wcm90b3R5cGUuZ2V0UG9pbnQgPSBnZXRQb2ludDtcblxuXHRyZXR1cm4gY29uc3RydWN0O1xuXG59O1xuXG4vL1xuXG5PYmplY3QuYXNzaWduKCBDdXJ2ZVBhdGgucHJvdG90eXBlLCB7XG5cblx0Y3JlYXRlUG9pbnRzR2VvbWV0cnk6IGZ1bmN0aW9uICggZGl2aXNpb25zICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmVQYXRoOiAuY3JlYXRlUG9pbnRzR2VvbWV0cnkoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkdlb21ldHJ5KCkuc2V0RnJvbVBvaW50cyggcG9pbnRzICkgaW5zdGVhZC4nICk7XG5cblx0XHQvLyBnZW5lcmF0ZSBnZW9tZXRyeSBmcm9tIHBhdGggcG9pbnRzIChmb3IgTGluZSBvciBQb2ludHMgb2JqZWN0cylcblxuXHRcdHZhciBwdHMgPSB0aGlzLmdldFBvaW50cyggZGl2aXNpb25zICk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlR2VvbWV0cnkoIHB0cyApO1xuXG5cdH0sXG5cblx0Y3JlYXRlU3BhY2VkUG9pbnRzR2VvbWV0cnk6IGZ1bmN0aW9uICggZGl2aXNpb25zICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmVQYXRoOiAuY3JlYXRlU3BhY2VkUG9pbnRzR2VvbWV0cnkoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkdlb21ldHJ5KCkuc2V0RnJvbVBvaW50cyggcG9pbnRzICkgaW5zdGVhZC4nICk7XG5cblx0XHQvLyBnZW5lcmF0ZSBnZW9tZXRyeSBmcm9tIGVxdWlkaXN0YW50IHNhbXBsaW5nIGFsb25nIHRoZSBwYXRoXG5cblx0XHR2YXIgcHRzID0gdGhpcy5nZXRTcGFjZWRQb2ludHMoIGRpdmlzaW9ucyApO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUdlb21ldHJ5KCBwdHMgKTtcblxuXHR9LFxuXG5cdGNyZWF0ZUdlb21ldHJ5OiBmdW5jdGlvbiAoIHBvaW50cyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlUGF0aDogLmNyZWF0ZUdlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5HZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApIGluc3RlYWQuJyApO1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gbmV3IEdlb21ldHJ5KCk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBwb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHBvaW50ID0gcG9pbnRzWyBpIF07XG5cdFx0XHRnZW9tZXRyeS52ZXJ0aWNlcy5wdXNoKCBuZXcgVmVjdG9yMyggcG9pbnQueCwgcG9pbnQueSwgcG9pbnQueiB8fCAwICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBnZW9tZXRyeTtcblxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmFzc2lnbiggUGF0aC5wcm90b3R5cGUsIHtcblxuXHRmcm9tUG9pbnRzOiBmdW5jdGlvbiAoIHBvaW50cyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlBhdGg6IC5mcm9tUG9pbnRzKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbVBvaW50cygpLicgKTtcblx0XHR0aGlzLnNldEZyb21Qb2ludHMoIHBvaW50cyApO1xuXG5cdH1cblxufSApO1xuXG4vL1xuXG5mdW5jdGlvbiBTcGxpbmUoIHBvaW50cyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5TcGxpbmUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4nICk7XG5cblx0Q2F0bXVsbFJvbUN1cnZlMy5jYWxsKCB0aGlzLCBwb2ludHMgKTtcblx0dGhpcy50eXBlID0gJ2NhdG11bGxyb20nO1xuXG59XG5cblNwbGluZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZSApO1xuXG5PYmplY3QuYXNzaWduKCBTcGxpbmUucHJvdG90eXBlLCB7XG5cblx0aW5pdEZyb21BcnJheTogZnVuY3Rpb24gKCAvKiBhICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNwbGluZTogLmluaXRGcm9tQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRnZXRDb250cm9sUG9pbnRzQXJyYXk6IGZ1bmN0aW9uICggLyogb3B0aW9uYWxUYXJnZXQgKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU3BsaW5lOiAuZ2V0Q29udHJvbFBvaW50c0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0cmVwYXJhbWV0cml6ZUJ5QXJjTGVuZ3RoOiBmdW5jdGlvbiAoIC8qIHNhbXBsaW5nQ29lZiAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TcGxpbmU6IC5yZXBhcmFtZXRyaXplQnlBcmNMZW5ndGgoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuR3JpZEhlbHBlci5wcm90b3R5cGUuc2V0Q29sb3JzID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5HcmlkSGVscGVyOiBzZXRDb2xvcnMoKSBoYXMgYmVlbiBkZXByZWNhdGVkLCBwYXNzIHRoZW0gaW4gdGhlIGNvbnN0cnVjdG9yIGluc3RlYWQuJyApO1xuXG59O1xuXG5Ta2VsZXRvbkhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Ta2VsZXRvbkhlbHBlcjogdXBkYXRlKCkgbm8gbG9uZ2VyIG5lZWRzIHRvIGJlIGNhbGxlZC4nICk7XG5cbn07XG5cbi8vXG5cbk9iamVjdC5hc3NpZ24oIExvYWRlci5wcm90b3R5cGUsIHtcblxuXHRleHRyYWN0VXJsQmFzZTogZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Mb2FkZXI6IC5leHRyYWN0VXJsQmFzZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5Mb2FkZXJVdGlscy5leHRyYWN0VXJsQmFzZSgpIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiBMb2FkZXJVdGlscy5leHRyYWN0VXJsQmFzZSggdXJsICk7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5hc3NpZ24oIEJveDIucHJvdG90eXBlLCB7XG5cblx0Y2VudGVyOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRDZW50ZXIoIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0fSxcblx0ZW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5lbXB0eSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmlzRW1wdHkoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpO1xuXG5cdH0sXG5cdGlzSW50ZXJzZWN0aW9uQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5pc0ludGVyc2VjdGlvbkJveCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNCb3goKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveCggYm94ICk7XG5cblx0fSxcblx0c2l6ZTogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5zaXplKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0U2l6ZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRTaXplKCBvcHRpb25hbFRhcmdldCApO1xuXG5cdH1cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggQm94My5wcm90b3R5cGUsIHtcblxuXHRjZW50ZXI6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuY2VudGVyKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVyKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldENlbnRlciggb3B0aW9uYWxUYXJnZXQgKTtcblxuXHR9LFxuXHRlbXB0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmVtcHR5KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaXNFbXB0eSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCk7XG5cblx0fSxcblx0aXNJbnRlcnNlY3Rpb25Cb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzQm94KCBib3ggKTtcblxuXHR9LFxuXHRpc0ludGVyc2VjdGlvblNwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuaXNJbnRlcnNlY3Rpb25TcGhlcmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzU3BoZXJlKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApO1xuXG5cdH0sXG5cdHNpemU6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuc2l6ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFNpemUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0U2l6ZSggb3B0aW9uYWxUYXJnZXQgKTtcblxuXHR9XG59ICk7XG5cbkxpbmUzLnByb3RvdHlwZS5jZW50ZXIgPSBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmUzOiAuY2VudGVyKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVyKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5nZXRDZW50ZXIoIG9wdGlvbmFsVGFyZ2V0ICk7XG5cbn07XG5cbk9iamVjdC5hc3NpZ24oIF9NYXRoLCB7XG5cblx0cmFuZG9tMTY6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGg6IC5yYW5kb20xNigpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBNYXRoLnJhbmRvbSgpIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiBNYXRoLnJhbmRvbSgpO1xuXG5cdH0sXG5cblx0bmVhcmVzdFBvd2VyT2ZUd286IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRoOiAubmVhcmVzdFBvd2VyT2ZUd28oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mbG9vclBvd2VyT2ZUd28oKS4nICk7XG5cdFx0cmV0dXJuIF9NYXRoLmZsb29yUG93ZXJPZlR3byggdmFsdWUgKTtcblxuXHR9LFxuXG5cdG5leHRQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0aDogLm5leHRQb3dlck9mVHdvKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuY2VpbFBvd2VyT2ZUd28oKS4nICk7XG5cdFx0cmV0dXJuIF9NYXRoLmNlaWxQb3dlck9mVHdvKCB2YWx1ZSApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBNYXRyaXgzLnByb3RvdHlwZSwge1xuXG5cdGZsYXR0ZW5Ub0FycmF5T2Zmc2V0OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuTWF0cml4MzogLmZsYXR0ZW5Ub0FycmF5T2Zmc2V0KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC50b0FycmF5KCkgaW5zdGVhZC5cIiApO1xuXHRcdHJldHVybiB0aGlzLnRvQXJyYXkoIGFycmF5LCBvZmZzZXQgKTtcblxuXHR9LFxuXHRtdWx0aXBseVZlY3RvcjM6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4MzogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXgzKCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4MyggdGhpcyApO1xuXG5cdH0sXG5cdG11bHRpcGx5VmVjdG9yM0FycmF5OiBmdW5jdGlvbiAoIC8qIGEgKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4MzogLm11bHRpcGx5VmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0YXBwbHlUb0J1ZmZlcjogZnVuY3Rpb24gKCBidWZmZXIgLyosIG9mZnNldCwgbGVuZ3RoICovICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4MzogLmFwcGx5VG9CdWZmZXIoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB0aGlzLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGJ1ZmZlciApO1xuXG5cdH0sXG5cdGFwcGx5VG9WZWN0b3IzQXJyYXk6IGZ1bmN0aW9uICggLyogYXJyYXksIG9mZnNldCwgbGVuZ3RoICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDM6IC5hcHBseVRvVmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIE1hdHJpeDQucHJvdG90eXBlLCB7XG5cblx0ZXh0cmFjdFBvc2l0aW9uOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuZXh0cmFjdFBvc2l0aW9uKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuY29weVBvc2l0aW9uKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmNvcHlQb3NpdGlvbiggbSApO1xuXG5cdH0sXG5cdGZsYXR0ZW5Ub0FycmF5T2Zmc2V0OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuTWF0cml4NDogLmZsYXR0ZW5Ub0FycmF5T2Zmc2V0KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC50b0FycmF5KCkgaW5zdGVhZC5cIiApO1xuXHRcdHJldHVybiB0aGlzLnRvQXJyYXkoIGFycmF5LCBvZmZzZXQgKTtcblxuXHR9LFxuXHRnZXRQb3NpdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldFBvc2l0aW9uKCkge1xuXG5cdFx0XHRpZiAoIHYxID09PSB1bmRlZmluZWQgKSB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuZ2V0UG9zaXRpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHYxLnNldEZyb21NYXRyaXhDb2x1bW4oIHRoaXMsIDMgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXHRzZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuc2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCBxICk7XG5cblx0fSxcblx0bXVsdGlwbHlUb0FycmF5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlUb0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0bXVsdGlwbHlWZWN0b3IzOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4NCggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMgKTtcblxuXHR9LFxuXHRtdWx0aXBseVZlY3RvcjQ6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yNCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggdGhpcyApO1xuXG5cdH0sXG5cdG11bHRpcGx5VmVjdG9yM0FycmF5OiBmdW5jdGlvbiAoIC8qIGEgKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0cm90YXRlQXhpczogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLnJvdGF0ZUF4aXMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVmVjdG9yMy50cmFuc2Zvcm1EaXJlY3Rpb24oIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRcdHYudHJhbnNmb3JtRGlyZWN0aW9uKCB0aGlzICk7XG5cblx0fSxcblx0Y3Jvc3NWZWN0b3I6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLmNyb3NzVmVjdG9yKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzICk7XG5cblx0fSxcblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnRyYW5zbGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHJvdGF0ZVg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlWCgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHJvdGF0ZVk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlWSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHJvdGF0ZVo6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlWigpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHJvdGF0ZUJ5QXhpczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVCeUF4aXMoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRhcHBseVRvQnVmZmVyOiBmdW5jdGlvbiAoIGJ1ZmZlciAvKiwgb2Zmc2V0LCBsZW5ndGggKi8gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuYXBwbHlUb0J1ZmZlcigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBtYXRyaXguYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHRoaXMuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYnVmZmVyICk7XG5cblx0fSxcblx0YXBwbHlUb1ZlY3RvcjNBcnJheTogZnVuY3Rpb24gKCAvKiBhcnJheSwgb2Zmc2V0LCBsZW5ndGggKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLmFwcGx5VG9WZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRtYWtlRnJ1c3R1bTogZnVuY3Rpb24gKCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tYWtlRnJ1c3R1bSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAubWFrZVBlcnNwZWN0aXZlKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB0aGlzLm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKTtcblxuXHR9XG5cbn0gKTtcblxuUGxhbmUucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uTGluZSA9IGZ1bmN0aW9uICggbGluZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5QbGFuZTogLmlzSW50ZXJzZWN0aW9uTGluZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNMaW5lKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzTGluZSggbGluZSApO1xuXG59O1xuXG5RdWF0ZXJuaW9uLnByb3RvdHlwZS5tdWx0aXBseVZlY3RvcjMgPSBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGlzIG5vdyB2ZWN0b3IuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICkgaW5zdGVhZC4nICk7XG5cdHJldHVybiB2ZWN0b3IuYXBwbHlRdWF0ZXJuaW9uKCB0aGlzICk7XG5cbn07XG5cbk9iamVjdC5hc3NpZ24oIFJheS5wcm90b3R5cGUsIHtcblxuXHRpc0ludGVyc2VjdGlvbkJveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvbkJveCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNCb3goKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveCggYm94ICk7XG5cblx0fSxcblx0aXNJbnRlcnNlY3Rpb25QbGFuZTogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uUGxhbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzUGxhbmUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1BsYW5lKCBwbGFuZSApO1xuXG5cdH0sXG5cdGlzSW50ZXJzZWN0aW9uU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uU3BoZXJlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1NwaGVyZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVHJpYW5nbGUucHJvdG90eXBlLCB7XG5cblx0YXJlYTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5hcmVhKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QXJlYSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRBcmVhKCk7XG5cblx0fSxcblx0YmFyeWNvb3JkRnJvbVBvaW50OiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLmJhcnljb29yZEZyb21Qb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEJhcnljb29yZCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQoIHBvaW50LCB0YXJnZXQgKTtcblxuXHR9LFxuXHRtaWRwb2ludDogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLm1pZHBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0TWlkcG9pbnQoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0TWlkcG9pbnQoIHRhcmdldCApO1xuXG5cdH0sXG5cdG5vcm1hbDogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLm5vcm1hbCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE5vcm1hbCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXROb3JtYWwoIHRhcmdldCApO1xuXG5cdH0sXG5cdHBsYW5lOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAucGxhbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRQbGFuZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRQbGFuZSggdGFyZ2V0ICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFRyaWFuZ2xlLCB7XG5cblx0YmFyeWNvb3JkRnJvbVBvaW50OiBmdW5jdGlvbiAoIHBvaW50LCBhLCBiLCBjLCB0YXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLmJhcnljb29yZEZyb21Qb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEJhcnljb29yZCgpLicgKTtcblx0XHRyZXR1cm4gVHJpYW5nbGUuZ2V0QmFyeWNvb3JkKCBwb2ludCwgYSwgYiwgYywgdGFyZ2V0ICk7XG5cblx0fSxcblx0bm9ybWFsOiBmdW5jdGlvbiAoIGEsIGIsIGMsIHRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAubm9ybWFsKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Tm9ybWFsKCkuJyApO1xuXHRcdHJldHVybiBUcmlhbmdsZS5nZXROb3JtYWwoIGEsIGIsIGMsIHRhcmdldCApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBTaGFwZS5wcm90b3R5cGUsIHtcblxuXHRleHRyYWN0QWxsUG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlOiAuZXh0cmFjdEFsbFBvaW50cygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuZXh0cmFjdFBvaW50cygpIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dHJhY3RQb2ludHMoIGRpdmlzaW9ucyApO1xuXG5cdH0sXG5cdGV4dHJ1ZGU6IGZ1bmN0aW9uICggb3B0aW9ucyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlOiAuZXh0cnVkZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFeHRydWRlR2VvbWV0cnkoKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gbmV3IEV4dHJ1ZGVHZW9tZXRyeSggdGhpcywgb3B0aW9ucyApO1xuXG5cdH0sXG5cdG1ha2VHZW9tZXRyeTogZnVuY3Rpb24gKCBvcHRpb25zICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2hhcGU6IC5tYWtlR2VvbWV0cnkoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgU2hhcGVHZW9tZXRyeSgpIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiBuZXcgU2hhcGVHZW9tZXRyeSggdGhpcywgb3B0aW9ucyApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBWZWN0b3IyLnByb3RvdHlwZSwge1xuXG5cdGZyb21BdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApO1xuXG5cdH0sXG5cdGRpc3RhbmNlVG9NYW5oYXR0YW46IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjI6IC5kaXN0YW5jZVRvTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuRGlzdGFuY2VUbygpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5tYW5oYXR0YW5EaXN0YW5jZVRvKCB2ICk7XG5cblx0fSxcblx0bGVuZ3RoTWFuaGF0dGFuOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiAubGVuZ3RoTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuTGVuZ3RoKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLm1hbmhhdHRhbkxlbmd0aCgpO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBWZWN0b3IzLnByb3RvdHlwZSwge1xuXG5cdHNldEV1bGVyRnJvbVJvdGF0aW9uTWF0cml4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuVmVjdG9yMzogLnNldEV1bGVyRnJvbVJvdGF0aW9uTWF0cml4KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEV1bGVyLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGluc3RlYWQuJyApO1xuXG5cdH0sXG5cdHNldEV1bGVyRnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5WZWN0b3IzOiAuc2V0RXVsZXJGcm9tUXVhdGVybmlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFdWxlci5zZXRGcm9tUXVhdGVybmlvbigpIGluc3RlYWQuJyApO1xuXG5cdH0sXG5cdGdldFBvc2l0aW9uRnJvbU1hdHJpeDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmdldFBvc2l0aW9uRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhQb3NpdGlvbigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG0gKTtcblxuXHR9LFxuXHRnZXRTY2FsZUZyb21NYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5nZXRTY2FsZUZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4U2NhbGUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeFNjYWxlKCBtICk7XG5cblx0fSxcblx0Z2V0Q29sdW1uRnJvbU1hdHJpeDogZnVuY3Rpb24gKCBpbmRleCwgbWF0cml4ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmdldENvbHVtbkZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4Q29sdW1uKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIG1hdHJpeCwgaW5kZXggKTtcblxuXHR9LFxuXHRhcHBseVByb2plY3Rpb246IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5hcHBseVByb2plY3Rpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmFwcGx5TWF0cml4NCggbSApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB0aGlzLmFwcGx5TWF0cml4NCggbSApO1xuXG5cdH0sXG5cdGZyb21BdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApO1xuXG5cdH0sXG5cdGRpc3RhbmNlVG9NYW5oYXR0YW46IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5kaXN0YW5jZVRvTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuRGlzdGFuY2VUbygpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5tYW5oYXR0YW5EaXN0YW5jZVRvKCB2ICk7XG5cblx0fSxcblx0bGVuZ3RoTWFuaGF0dGFuOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAubGVuZ3RoTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuTGVuZ3RoKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLm1hbmhhdHRhbkxlbmd0aCgpO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBWZWN0b3I0LnByb3RvdHlwZSwge1xuXG5cdGZyb21BdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yNDogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApO1xuXG5cdH0sXG5cdGxlbmd0aE1hbmhhdHRhbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yNDogLmxlbmd0aE1hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkxlbmd0aCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKTtcblxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmFzc2lnbiggR2VvbWV0cnkucHJvdG90eXBlLCB7XG5cblx0Y29tcHV0ZVRhbmdlbnRzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRjb21wdXRlTGluZURpc3RhbmNlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkdlb21ldHJ5OiAuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpIGluc3RlYWQuJyApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBPYmplY3QzRC5wcm90b3R5cGUsIHtcblxuXHRnZXRDaGlsZEJ5TmFtZTogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5nZXRDaGlsZEJ5TmFtZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE9iamVjdEJ5TmFtZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRPYmplY3RCeU5hbWUoIG5hbWUgKTtcblxuXHR9LFxuXHRyZW5kZXJEZXB0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5yZW5kZXJEZXB0aCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnJlbmRlck9yZGVyLCBpbnN0ZWFkLicgKTtcblxuXHR9LFxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICggZGlzdGFuY2UsIGF4aXMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLnRyYW5zbGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAudHJhbnNsYXRlT25BeGlzKCBheGlzLCBkaXN0YW5jZSApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFuY2UgKTtcblxuXHR9LFxuXHRnZXRXb3JsZFJvdGF0aW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFJvdGF0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLk9iamVjdDNELmdldFdvcmxkUXVhdGVybmlvbiggdGFyZ2V0ICkgaW5zdGVhZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBPYmplY3QzRC5wcm90b3R5cGUsIHtcblxuXHRldWxlck9yZGVyOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZXVsZXJPcmRlciBpcyBub3cgLnJvdGF0aW9uLm9yZGVyLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnJvdGF0aW9uLm9yZGVyO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZXVsZXJPcmRlciBpcyBub3cgLnJvdGF0aW9uLm9yZGVyLicgKTtcblx0XHRcdHRoaXMucm90YXRpb24ub3JkZXIgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0dXNlUXVhdGVybmlvbjoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLnVzZVF1YXRlcm5pb24gaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIGxpYnJhcnkgbm93IHVzZXMgcXVhdGVybmlvbnMgYnkgZGVmYXVsdC4nICk7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLnVzZVF1YXRlcm5pb24gaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIGxpYnJhcnkgbm93IHVzZXMgcXVhdGVybmlvbnMgYnkgZGVmYXVsdC4nICk7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggTE9ELnByb3RvdHlwZSwge1xuXG5cdG9iamVjdHM6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTE9EOiAub2JqZWN0cyBoYXMgYmVlbiByZW5hbWVkIHRvIC5sZXZlbHMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMubGV2ZWxzO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KCBTa2VsZXRvbi5wcm90b3R5cGUsICd1c2VWZXJ0ZXhUZXh0dXJlJywge1xuXG5cdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2tlbGV0b246IHVzZVZlcnRleFRleHR1cmUgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Ta2VsZXRvbjogdXNlVmVydGV4VGV4dHVyZSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KCBDdXJ2ZS5wcm90b3R5cGUsICdfX2FyY0xlbmd0aERpdmlzaW9ucycsIHtcblxuXHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlOiAuX19hcmNMZW5ndGhEaXZpc2lvbnMgaXMgbm93IC5hcmNMZW5ndGhEaXZpc2lvbnMuJyApO1xuXHRcdHJldHVybiB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucztcblxuXHR9LFxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZTogLl9fYXJjTGVuZ3RoRGl2aXNpb25zIGlzIG5vdyAuYXJjTGVuZ3RoRGl2aXNpb25zLicgKTtcblx0XHR0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IHZhbHVlO1xuXG5cdH1cblxufSApO1xuXG4vL1xuXG5QZXJzcGVjdGl2ZUNhbWVyYS5wcm90b3R5cGUuc2V0TGVucyA9IGZ1bmN0aW9uICggZm9jYWxMZW5ndGgsIGZpbG1HYXVnZSApIHtcblxuXHRjb25zb2xlLndhcm4oIFwiVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEuc2V0TGVucyBpcyBkZXByZWNhdGVkLiBcIiArXG5cdFx0XHRcIlVzZSAuc2V0Rm9jYWxMZW5ndGggYW5kIC5maWxtR2F1Z2UgZm9yIGEgcGhvdG9ncmFwaGljIHNldHVwLlwiICk7XG5cblx0aWYgKCBmaWxtR2F1Z2UgIT09IHVuZGVmaW5lZCApIHRoaXMuZmlsbUdhdWdlID0gZmlsbUdhdWdlO1xuXHR0aGlzLnNldEZvY2FsTGVuZ3RoKCBmb2NhbExlbmd0aCApO1xuXG59O1xuXG4vL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggTGlnaHQucHJvdG90eXBlLCB7XG5cdG9ubHlTaGFkb3c6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5vbmx5U2hhZG93IGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dDYW1lcmFGb3Y6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhRm92IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5mb3YuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cuY2FtZXJhLmZvdiA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dDYW1lcmFMZWZ0OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUxlZnQgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmxlZnQuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cuY2FtZXJhLmxlZnQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhUmlnaHQ6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhUmlnaHQgaXMgbm93IC5zaGFkb3cuY2FtZXJhLnJpZ2h0LicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5yaWdodCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dDYW1lcmFUb3A6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhVG9wIGlzIG5vdyAuc2hhZG93LmNhbWVyYS50b3AuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cuY2FtZXJhLnRvcCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dDYW1lcmFCb3R0b206IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhQm90dG9tIGlzIG5vdyAuc2hhZG93LmNhbWVyYS5ib3R0b20uJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cuY2FtZXJhLmJvdHRvbSA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dDYW1lcmFOZWFyOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYU5lYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLm5lYXIuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cuY2FtZXJhLm5lYXIgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhRmFyOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUZhciBpcyBub3cgLnNoYWRvdy5jYW1lcmEuZmFyLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5mYXIgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhVmlzaWJsZToge1xuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVZpc2libGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5DYW1lcmFIZWxwZXIoIGxpZ2h0LnNoYWRvdy5jYW1lcmEgKSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Qmlhczoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dCaWFzIGlzIG5vdyAuc2hhZG93LmJpYXMuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cuYmlhcyA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dEYXJrbmVzczoge1xuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0RhcmtuZXNzIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dNYXBXaWR0aDoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dNYXBXaWR0aCBpcyBub3cgLnNoYWRvdy5tYXBTaXplLndpZHRoLicgKTtcblx0XHRcdHRoaXMuc2hhZG93Lm1hcFNpemUud2lkdGggPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93TWFwSGVpZ2h0OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd01hcEhlaWdodCBpcyBub3cgLnNoYWRvdy5tYXBTaXplLmhlaWdodC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5tYXBTaXplLmhlaWdodCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCB7XG5cblx0bGVuZ3RoOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmxlbmd0aCBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmNvdW50IGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuYXJyYXkubGVuZ3RoO1xuXG5cdFx0fVxuXHR9LFxuXHRjb3B5SW5kaWNlc0FycmF5OiBmdW5jdGlvbiAoIC8qIGluZGljZXMgKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAuY29weUluZGljZXNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUsIHtcblxuXHRhZGRJbmRleDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkSW5kZXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRJbmRleCgpLicgKTtcblx0XHR0aGlzLnNldEluZGV4KCBpbmRleCApO1xuXG5cdH0sXG5cdGFkZERyYXdDYWxsOiBmdW5jdGlvbiAoIHN0YXJ0LCBjb3VudCwgaW5kZXhPZmZzZXQgKSB7XG5cblx0XHRpZiAoIGluZGV4T2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkRHJhd0NhbGwoKSBubyBsb25nZXIgc3VwcG9ydHMgaW5kZXhPZmZzZXQuJyApO1xuXG5cdFx0fVxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkRHJhd0NhbGwoKSBpcyBub3cgLmFkZEdyb3VwKCkuJyApO1xuXHRcdHRoaXMuYWRkR3JvdXAoIHN0YXJ0LCBjb3VudCApO1xuXG5cdH0sXG5cdGNsZWFyRHJhd0NhbGxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNsZWFyRHJhd0NhbGxzKCkgaXMgbm93IC5jbGVhckdyb3VwcygpLicgKTtcblx0XHR0aGlzLmNsZWFyR3JvdXBzKCk7XG5cblx0fSxcblx0Y29tcHV0ZVRhbmdlbnRzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdGNvbXB1dGVPZmZzZXRzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVPZmZzZXRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUsIHtcblxuXHRkcmF3Y2FsbHM6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuZHJhd2NhbGxzIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdyb3Vwcy4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5ncm91cHM7XG5cblx0XHR9XG5cdH0sXG5cdG9mZnNldHM6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5vZmZzZXRzIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdyb3Vwcy4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5ncm91cHM7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG4vL1xuXG5PYmplY3QuYXNzaWduKCBFeHRydWRlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLCB7XG5cblx0Z2V0QXJyYXlzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiAuZ2V0QXJyYXlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblxuXHRhZGRTaGFwZUxpc3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IC5hZGRTaGFwZUxpc3QoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXG5cdGFkZFNoYXBlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiAuYWRkU2hhcGUoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFVuaWZvcm0ucHJvdG90eXBlLCB7XG5cblx0ZHluYW1pYzoge1xuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Vbmlmb3JtOiAuZHluYW1pYyBoYXMgYmVlbiByZW1vdmVkLiBVc2Ugb2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCkgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdG9uVXBkYXRlOiB7XG5cdFx0dmFsdWU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVW5pZm9ybTogLm9uVXBkYXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG9iamVjdC5vbkJlZm9yZVJlbmRlcigpIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG4vL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggTWF0ZXJpYWwucHJvdG90eXBlLCB7XG5cblx0d3JhcEFyb3VuZDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRlcmlhbDogLndyYXBBcm91bmQgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRlcmlhbDogLndyYXBBcm91bmQgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdHdyYXBSR0I6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IC53cmFwUkdCIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXHRcdFx0cmV0dXJuIG5ldyBDb2xvcigpO1xuXG5cdFx0fVxuXHR9LFxuXG5cdHNoYWRpbmc6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLicgKyB0aGlzLnR5cGUgKyAnOiAuc2hhZGluZyBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdGhlIGJvb2xlYW4gLmZsYXRTaGFkaW5nIGluc3RlYWQuJyApO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLicgKyB0aGlzLnR5cGUgKyAnOiAuc2hhZGluZyBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdGhlIGJvb2xlYW4gLmZsYXRTaGFkaW5nIGluc3RlYWQuJyApO1xuXHRcdFx0dGhpcy5mbGF0U2hhZGluZyA9ICggdmFsdWUgPT09IEZsYXRTaGFkaW5nICk7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggTWVzaFBob25nTWF0ZXJpYWwucHJvdG90eXBlLCB7XG5cblx0bWV0YWw6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw6IC5tZXRhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbDogLm1ldGFsIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCBpbnN0ZWFkJyApO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFNoYWRlck1hdGVyaWFsLnByb3RvdHlwZSwge1xuXG5cdGRlcml2YXRpdmVzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNoYWRlck1hdGVyaWFsOiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcztcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS4gU2hhZGVyTWF0ZXJpYWw6IC5kZXJpdmF0aXZlcyBoYXMgYmVlbiBtb3ZlZCB0byAuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcy4nICk7XG5cdFx0XHR0aGlzLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMgPSB2YWx1ZTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5hc3NpZ24oIFdlYkdMUmVuZGVyZXIucHJvdG90eXBlLCB7XG5cblx0Z2V0Q3VycmVudFJlbmRlclRhcmdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldEN1cnJlbnRSZW5kZXJUYXJnZXQoKSBpcyBub3cgLmdldFJlbmRlclRhcmdldCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRSZW5kZXJUYXJnZXQoKTtcblxuXHR9LFxuXG5cdGdldE1heEFuaXNvdHJvcHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRNYXhBbmlzb3Ryb3B5KCkgaXMgbm93IC5jYXBhYmlsaXRpZXMuZ2V0TWF4QW5pc290cm9weSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5jYXBhYmlsaXRpZXMuZ2V0TWF4QW5pc290cm9weSgpO1xuXG5cdH0sXG5cblx0Z2V0UHJlY2lzaW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0UHJlY2lzaW9uKCkgaXMgbm93IC5jYXBhYmlsaXRpZXMucHJlY2lzaW9uLicgKTtcblx0XHRyZXR1cm4gdGhpcy5jYXBhYmlsaXRpZXMucHJlY2lzaW9uO1xuXG5cdH0sXG5cblx0cmVzZXRHTFN0YXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAucmVzZXRHTFN0YXRlKCkgaXMgbm93IC5zdGF0ZS5yZXNldCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5zdGF0ZS5yZXNldCgpO1xuXG5cdH0sXG5cblx0c3VwcG9ydHNGbG9hdFRleHR1cmVzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNGbG9hdFRleHR1cmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnT0VTX3RleHR1cmVfZmxvYXRcXCcgKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdCcgKTtcblxuXHR9LFxuXHRzdXBwb3J0c0hhbGZGbG9hdFRleHR1cmVzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ09FU190ZXh0dXJlX2hhbGZfZmxvYXRcXCcgKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0JyApO1xuXG5cdH0sXG5cdHN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ09FU19zdGFuZGFyZF9kZXJpdmF0aXZlc1xcJyApLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcycgKTtcblxuXHR9LFxuXHRzdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUzNUQzogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGNcXCcgKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKTtcblxuXHR9LFxuXHRzdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUFZSVEM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUFZSVEMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGNcXCcgKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICk7XG5cblx0fSxcblx0c3VwcG9ydHNCbGVuZE1pbk1heDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQmxlbmRNaW5NYXgoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdFWFRfYmxlbmRfbWlubWF4XFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnRVhUX2JsZW5kX21pbm1heCcgKTtcblxuXHR9LFxuXHRzdXBwb3J0c1ZlcnRleFRleHR1cmVzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcygpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzLicgKTtcblx0XHRyZXR1cm4gdGhpcy5jYXBhYmlsaXRpZXMudmVydGV4VGV4dHVyZXM7XG5cblx0fSxcblx0c3VwcG9ydHNJbnN0YW5jZWRBcnJheXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0luc3RhbmNlZEFycmF5cygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ0FOR0xFX2luc3RhbmNlZF9hcnJheXNcXCcgKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApO1xuXG5cdH0sXG5cdGVuYWJsZVNjaXNzb3JUZXN0OiBmdW5jdGlvbiAoIGJvb2xlYW4gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZW5hYmxlU2Npc3NvclRlc3QoKSBpcyBub3cgLnNldFNjaXNzb3JUZXN0KCkuJyApO1xuXHRcdHRoaXMuc2V0U2Npc3NvclRlc3QoIGJvb2xlYW4gKTtcblxuXHR9LFxuXHRpbml0TWF0ZXJpYWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5pbml0TWF0ZXJpYWwoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRhZGRQcmVQbHVnaW46IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5hZGRQcmVQbHVnaW4oKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRhZGRQb3N0UGx1Z2luOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWRkUG9zdFBsdWdpbigpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHVwZGF0ZVNoYWRvd01hcDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnVwZGF0ZVNoYWRvd01hcCgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHNldEZhY2VDdWxsaW5nOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0RmFjZUN1bGxpbmcoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFdlYkdMUmVuZGVyZXIucHJvdG90eXBlLCB7XG5cblx0c2hhZG93TWFwRW5hYmxlZDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zaGFkb3dNYXAuZW5hYmxlZDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwRW5hYmxlZCBpcyBub3cgLnNoYWRvd01hcC5lbmFibGVkLicgKTtcblx0XHRcdHRoaXMuc2hhZG93TWFwLmVuYWJsZWQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93TWFwVHlwZToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zaGFkb3dNYXAudHlwZTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwVHlwZSBpcyBub3cgLnNoYWRvd01hcC50eXBlLicgKTtcblx0XHRcdHRoaXMuc2hhZG93TWFwLnR5cGUgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93TWFwQ3VsbEZhY2U6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIC8qIHZhbHVlICovICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwQ3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH1cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFdlYkdMU2hhZG93TWFwLnByb3RvdHlwZSwge1xuXG5cdGN1bGxGYWNlOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAuY3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggLyogY3VsbEZhY2UgKi8gKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAuY3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdHJlbmRlclJldmVyc2VTaWRlZDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclJldmVyc2VTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclJldmVyc2VTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblx0fSxcblx0cmVuZGVyU2luZ2xlU2lkZWQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJTaW5nbGVTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclNpbmdsZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFdlYkdMUmVuZGVyVGFyZ2V0LnByb3RvdHlwZSwge1xuXG5cdHdyYXBTOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUud3JhcFM7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwUyBpcyBub3cgLnRleHR1cmUud3JhcFMuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLndyYXBTID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHdyYXBUOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0dXJlLndyYXBULicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUud3JhcFQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwVCBpcyBub3cgLnRleHR1cmUud3JhcFQuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLndyYXBUID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdG1hZ0ZpbHRlcjoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUubWFnRmlsdGVyO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWFnRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5tYWdGaWx0ZXIuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLm1hZ0ZpbHRlciA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRtaW5GaWx0ZXI6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5taW5GaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1pbkZpbHRlci4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLm1pbkZpbHRlcjtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1pbkZpbHRlciBpcyBub3cgLnRleHR1cmUubWluRmlsdGVyLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5taW5GaWx0ZXIgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0YW5pc290cm9weToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmFuaXNvdHJvcHkgaXMgbm93IC50ZXh0dXJlLmFuaXNvdHJvcHkuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5hbmlzb3Ryb3B5O1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuYW5pc290cm9weSBpcyBub3cgLnRleHR1cmUuYW5pc290cm9weS4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUuYW5pc290cm9weSA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRvZmZzZXQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5vZmZzZXQgaXMgbm93IC50ZXh0dXJlLm9mZnNldC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLm9mZnNldDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm9mZnNldCBpcyBub3cgLnRleHR1cmUub2Zmc2V0LicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5vZmZzZXQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0cmVwZWF0OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5yZXBlYXQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5yZXBlYXQgaXMgbm93IC50ZXh0dXJlLnJlcGVhdC4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUucmVwZWF0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdGZvcm1hdDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBpcyBub3cgLnRleHR1cmUuZm9ybWF0LicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUuZm9ybWF0O1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZm9ybWF0IGlzIG5vdyAudGV4dHVyZS5mb3JtYXQuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLmZvcm1hdCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHR0eXBlOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLnR5cGU7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC50eXBlIGlzIG5vdyAudGV4dHVyZS50eXBlLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS50eXBlID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdGdlbmVyYXRlTWlwbWFwczoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmdlbmVyYXRlTWlwbWFwcyBpcyBub3cgLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZ2VuZXJhdGVNaXBtYXBzIGlzIG5vdyAudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFdlYlZSTWFuYWdlci5wcm90b3R5cGUsIHtcblxuXHRzdGFuZGluZzoge1xuXHRcdHNldDogZnVuY3Rpb24gKCAvKiB2YWx1ZSAqLyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViVlJNYW5hZ2VyOiAuc3RhbmRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG4vL1xuXG5BdWRpby5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uICggZmlsZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogLmxvYWQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkF1ZGlvTG9hZGVyIGluc3RlYWQuJyApO1xuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXHR2YXIgYXVkaW9Mb2FkZXIgPSBuZXcgQXVkaW9Mb2FkZXIoKTtcblx0YXVkaW9Mb2FkZXIubG9hZCggZmlsZSwgZnVuY3Rpb24gKCBidWZmZXIgKSB7XG5cblx0XHRzY29wZS5zZXRCdWZmZXIoIGJ1ZmZlciApO1xuXG5cdH0gKTtcblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbkF1ZGlvQW5hbHlzZXIucHJvdG90eXBlLmdldERhdGEgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW9BbmFseXNlcjogLmdldERhdGEoKSBpcyBub3cgLmdldEZyZXF1ZW5jeURhdGEoKS4nICk7XG5cdHJldHVybiB0aGlzLmdldEZyZXF1ZW5jeURhdGEoKTtcblxufTtcblxuLy9cblxuQ3ViZUNhbWVyYS5wcm90b3R5cGUudXBkYXRlQ3ViZU1hcCA9IGZ1bmN0aW9uICggcmVuZGVyZXIsIHNjZW5lICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkN1YmVDYW1lcmE6IC51cGRhdGVDdWJlTWFwKCkgaXMgbm93IC51cGRhdGUoKS4nICk7XG5cdHJldHVybiB0aGlzLnVwZGF0ZSggcmVuZGVyZXIsIHNjZW5lICk7XG5cbn07XG5cbnZhciBtaW5pdmVudHNfY29tbW9uanMgPSBmdW5jdGlvbiBFdmVudHModGFyZ2V0KXtcbiAgdmFyIGV2ZW50cyA9IHt9LCBlbXB0eSA9IFtdO1xuICB0YXJnZXQgPSB0YXJnZXQgfHwgdGhpcztcbiAgLyoqXG4gICAqICBPbjogbGlzdGVuIHRvIGV2ZW50c1xuICAgKi9cbiAgdGFyZ2V0Lm9uID0gZnVuY3Rpb24odHlwZSwgZnVuYywgY3R4KXtcbiAgICAoZXZlbnRzW3R5cGVdID0gZXZlbnRzW3R5cGVdIHx8IFtdKS5wdXNoKFtmdW5jLCBjdHhdKTtcbiAgICByZXR1cm4gdGFyZ2V0XG4gIH07XG4gIC8qKlxuICAgKiAgT2ZmOiBzdG9wIGxpc3RlbmluZyB0byBldmVudCAvIHNwZWNpZmljIGNhbGxiYWNrXG4gICAqL1xuICB0YXJnZXQub2ZmID0gZnVuY3Rpb24odHlwZSwgZnVuYyl7XG4gICAgdHlwZSB8fCAoZXZlbnRzID0ge30pO1xuICAgIHZhciBsaXN0ID0gZXZlbnRzW3R5cGVdIHx8IGVtcHR5LFxuICAgICAgICBpID0gbGlzdC5sZW5ndGggPSBmdW5jID8gbGlzdC5sZW5ndGggOiAwO1xuICAgIHdoaWxlKGktLSkgZnVuYyA9PSBsaXN0W2ldWzBdICYmIGxpc3Quc3BsaWNlKGksMSk7XG4gICAgcmV0dXJuIHRhcmdldFxuICB9O1xuICAvKiogXG4gICAqIEVtaXQ6IHNlbmQgZXZlbnQsIGNhbGxiYWNrcyB3aWxsIGJlIHRyaWdnZXJlZFxuICAgKi9cbiAgdGFyZ2V0LmVtaXQgPSBmdW5jdGlvbih0eXBlKXtcbiAgICB2YXIgZSA9IGV2ZW50c1t0eXBlXSB8fCBlbXB0eSwgbGlzdCA9IGUubGVuZ3RoID4gMCA/IGUuc2xpY2UoMCwgZS5sZW5ndGgpIDogZSwgaT0wLCBqO1xuICAgIHdoaWxlKGo9bGlzdFtpKytdKSBqWzBdLmFwcGx5KGpbMV0sIGVtcHR5LnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7XG4gICAgcmV0dXJuIHRhcmdldFxuICB9O1xufTtcblxuLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG5fZXhwb3J0KF9leHBvcnQuUywgJ09iamVjdCcsIHsgY3JlYXRlOiBfb2JqZWN0Q3JlYXRlIH0pO1xuXG52YXIgJE9iamVjdCQyID0gX2NvcmUuT2JqZWN0O1xudmFyIGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShQLCBEKSB7XG4gIHJldHVybiAkT2JqZWN0JDIuY3JlYXRlKFAsIEQpO1xufTtcblxudmFyIGNyZWF0ZSQxID0gY3JlYXRlO1xuXG52YXIgX3ZhbGlkYXRlQ29sbGVjdGlvbiA9IGZ1bmN0aW9uIChpdCwgVFlQRSkge1xuICBpZiAoIV9pc09iamVjdChpdCkgfHwgaXQuX3QgIT09IFRZUEUpIHRocm93IFR5cGVFcnJvcignSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAnICsgVFlQRSArICcgcmVxdWlyZWQhJyk7XG4gIHJldHVybiBpdDtcbn07XG5cbnZhciBkUCQyID0gX29iamVjdERwLmY7XG5cblxuXG5cblxuXG5cblxuXG52YXIgZmFzdEtleSA9IF9tZXRhLmZhc3RLZXk7XG5cbnZhciBTSVpFID0gX2Rlc2NyaXB0b3JzID8gJ19zJyA6ICdzaXplJztcblxudmFyIGdldEVudHJ5ID0gZnVuY3Rpb24gKHRoYXQsIGtleSkge1xuICAvLyBmYXN0IGNhc2VcbiAgdmFyIGluZGV4ID0gZmFzdEtleShrZXkpO1xuICB2YXIgZW50cnk7XG4gIGlmIChpbmRleCAhPT0gJ0YnKSByZXR1cm4gdGhhdC5faVtpbmRleF07XG4gIC8vIGZyb3plbiBvYmplY3QgY2FzZVxuICBmb3IgKGVudHJ5ID0gdGhhdC5fZjsgZW50cnk7IGVudHJ5ID0gZW50cnkubikge1xuICAgIGlmIChlbnRyeS5rID09IGtleSkgcmV0dXJuIGVudHJ5O1xuICB9XG59O1xuXG52YXIgX2NvbGxlY3Rpb25TdHJvbmcgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUikge1xuICAgIHZhciBDID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgaXRlcmFibGUpIHtcbiAgICAgIF9hbkluc3RhbmNlKHRoYXQsIEMsIE5BTUUsICdfaScpO1xuICAgICAgdGhhdC5fdCA9IE5BTUU7ICAgICAgICAgLy8gY29sbGVjdGlvbiB0eXBlXG4gICAgICB0aGF0Ll9pID0gX29iamVjdENyZWF0ZShudWxsKTsgLy8gaW5kZXhcbiAgICAgIHRoYXQuX2YgPSB1bmRlZmluZWQ7ICAgIC8vIGZpcnN0IGVudHJ5XG4gICAgICB0aGF0Ll9sID0gdW5kZWZpbmVkOyAgICAvLyBsYXN0IGVudHJ5XG4gICAgICB0aGF0W1NJWkVdID0gMDsgICAgICAgICAvLyBzaXplXG4gICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBfZm9yT2YoaXRlcmFibGUsIElTX01BUCwgdGhhdFtBRERFUl0sIHRoYXQpO1xuICAgIH0pO1xuICAgIF9yZWRlZmluZUFsbChDLnByb3RvdHlwZSwge1xuICAgICAgLy8gMjMuMS4zLjEgTWFwLnByb3RvdHlwZS5jbGVhcigpXG4gICAgICAvLyAyMy4yLjMuMiBTZXQucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgICAgZm9yICh2YXIgdGhhdCA9IF92YWxpZGF0ZUNvbGxlY3Rpb24odGhpcywgTkFNRSksIGRhdGEgPSB0aGF0Ll9pLCBlbnRyeSA9IHRoYXQuX2Y7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm4pIHtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZW50cnkucCkgZW50cnkucCA9IGVudHJ5LnAubiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBkZWxldGUgZGF0YVtlbnRyeS5pXTtcbiAgICAgICAgfVxuICAgICAgICB0aGF0Ll9mID0gdGhhdC5fbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhhdFtTSVpFXSA9IDA7XG4gICAgICB9LFxuICAgICAgLy8gMjMuMS4zLjMgTWFwLnByb3RvdHlwZS5kZWxldGUoa2V5KVxuICAgICAgLy8gMjMuMi4zLjQgU2V0LnByb3RvdHlwZS5kZWxldGUodmFsdWUpXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdGhhdCA9IF92YWxpZGF0ZUNvbGxlY3Rpb24odGhpcywgTkFNRSk7XG4gICAgICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgIHZhciBuZXh0ID0gZW50cnkubjtcbiAgICAgICAgICB2YXIgcHJldiA9IGVudHJ5LnA7XG4gICAgICAgICAgZGVsZXRlIHRoYXQuX2lbZW50cnkuaV07XG4gICAgICAgICAgZW50cnkuciA9IHRydWU7XG4gICAgICAgICAgaWYgKHByZXYpIHByZXYubiA9IG5leHQ7XG4gICAgICAgICAgaWYgKG5leHQpIG5leHQucCA9IHByZXY7XG4gICAgICAgICAgaWYgKHRoYXQuX2YgPT0gZW50cnkpIHRoYXQuX2YgPSBuZXh0O1xuICAgICAgICAgIGlmICh0aGF0Ll9sID09IGVudHJ5KSB0aGF0Ll9sID0gcHJldjtcbiAgICAgICAgICB0aGF0W1NJWkVdLS07XG4gICAgICAgIH0gcmV0dXJuICEhZW50cnk7XG4gICAgICB9LFxuICAgICAgLy8gMjMuMi4zLjYgU2V0LnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gICAgICAvLyAyMy4xLjMuNSBNYXAucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgICAgIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2tmbiAvKiAsIHRoYXQgPSB1bmRlZmluZWQgKi8pIHtcbiAgICAgICAgX3ZhbGlkYXRlQ29sbGVjdGlvbih0aGlzLCBOQU1FKTtcbiAgICAgICAgdmFyIGYgPSBfY3R4KGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCAzKTtcbiAgICAgICAgdmFyIGVudHJ5O1xuICAgICAgICB3aGlsZSAoZW50cnkgPSBlbnRyeSA/IGVudHJ5Lm4gOiB0aGlzLl9mKSB7XG4gICAgICAgICAgZihlbnRyeS52LCBlbnRyeS5rLCB0aGlzKTtcbiAgICAgICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgICAgICB3aGlsZSAoZW50cnkgJiYgZW50cnkucikgZW50cnkgPSBlbnRyeS5wO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gMjMuMS4zLjcgTWFwLnByb3RvdHlwZS5oYXMoa2V5KVxuICAgICAgLy8gMjMuMi4zLjcgU2V0LnByb3RvdHlwZS5oYXModmFsdWUpXG4gICAgICBoYXM6IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgICAgcmV0dXJuICEhZ2V0RW50cnkoX3ZhbGlkYXRlQ29sbGVjdGlvbih0aGlzLCBOQU1FKSwga2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoX2Rlc2NyaXB0b3JzKSBkUCQyKEMucHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3ZhbGlkYXRlQ29sbGVjdGlvbih0aGlzLCBOQU1FKVtTSVpFXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQztcbiAgfSxcbiAgZGVmOiBmdW5jdGlvbiAodGhhdCwga2V5LCB2YWx1ZSkge1xuICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgdmFyIHByZXYsIGluZGV4O1xuICAgIC8vIGNoYW5nZSBleGlzdGluZyBlbnRyeVxuICAgIGlmIChlbnRyeSkge1xuICAgICAgZW50cnkudiA9IHZhbHVlO1xuICAgIC8vIGNyZWF0ZSBuZXcgZW50cnlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhhdC5fbCA9IGVudHJ5ID0ge1xuICAgICAgICBpOiBpbmRleCA9IGZhc3RLZXkoa2V5LCB0cnVlKSwgLy8gPC0gaW5kZXhcbiAgICAgICAgazoga2V5LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIGtleVxuICAgICAgICB2OiB2YWx1ZSwgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gdmFsdWVcbiAgICAgICAgcDogcHJldiA9IHRoYXQuX2wsICAgICAgICAgICAgIC8vIDwtIHByZXZpb3VzIGVudHJ5XG4gICAgICAgIG46IHVuZGVmaW5lZCwgICAgICAgICAgICAgICAgICAvLyA8LSBuZXh0IGVudHJ5XG4gICAgICAgIHI6IGZhbHNlICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSByZW1vdmVkXG4gICAgICB9O1xuICAgICAgaWYgKCF0aGF0Ll9mKSB0aGF0Ll9mID0gZW50cnk7XG4gICAgICBpZiAocHJldikgcHJldi5uID0gZW50cnk7XG4gICAgICB0aGF0W1NJWkVdKys7XG4gICAgICAvLyBhZGQgdG8gaW5kZXhcbiAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSB0aGF0Ll9pW2luZGV4XSA9IGVudHJ5O1xuICAgIH0gcmV0dXJuIHRoYXQ7XG4gIH0sXG4gIGdldEVudHJ5OiBnZXRFbnRyeSxcbiAgc2V0U3Ryb25nOiBmdW5jdGlvbiAoQywgTkFNRSwgSVNfTUFQKSB7XG4gICAgLy8gYWRkIC5rZXlzLCAudmFsdWVzLCAuZW50cmllcywgW0BAaXRlcmF0b3JdXG4gICAgLy8gMjMuMS4zLjQsIDIzLjEuMy44LCAyMy4xLjMuMTEsIDIzLjEuMy4xMiwgMjMuMi4zLjUsIDIzLjIuMy44LCAyMy4yLjMuMTAsIDIzLjIuMy4xMVxuICAgIF9pdGVyRGVmaW5lKEMsIE5BTUUsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICAgICAgdGhpcy5fdCA9IF92YWxpZGF0ZUNvbGxlY3Rpb24oaXRlcmF0ZWQsIE5BTUUpOyAvLyB0YXJnZXRcbiAgICAgIHRoaXMuX2sgPSBraW5kOyAgICAgICAgICAgICAgICAgICAgIC8vIGtpbmRcbiAgICAgIHRoaXMuX2wgPSB1bmRlZmluZWQ7ICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzXG4gICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgdmFyIGtpbmQgPSB0aGF0Ll9rO1xuICAgICAgdmFyIGVudHJ5ID0gdGhhdC5fbDtcbiAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgd2hpbGUgKGVudHJ5ICYmIGVudHJ5LnIpIGVudHJ5ID0gZW50cnkucDtcbiAgICAgIC8vIGdldCBuZXh0IGVudHJ5XG4gICAgICBpZiAoIXRoYXQuX3QgfHwgISh0aGF0Ll9sID0gZW50cnkgPSBlbnRyeSA/IGVudHJ5Lm4gOiB0aGF0Ll90Ll9mKSkge1xuICAgICAgICAvLyBvciBmaW5pc2ggdGhlIGl0ZXJhdGlvblxuICAgICAgICB0aGF0Ll90ID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gX2l0ZXJTdGVwKDEpO1xuICAgICAgfVxuICAgICAgLy8gcmV0dXJuIHN0ZXAgYnkga2luZFxuICAgICAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4gX2l0ZXJTdGVwKDAsIGVudHJ5LmspO1xuICAgICAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiBfaXRlclN0ZXAoMCwgZW50cnkudik7XG4gICAgICByZXR1cm4gX2l0ZXJTdGVwKDAsIFtlbnRyeS5rLCBlbnRyeS52XSk7XG4gICAgfSwgSVNfTUFQID8gJ2VudHJpZXMnIDogJ3ZhbHVlcycsICFJU19NQVAsIHRydWUpO1xuXG4gICAgLy8gYWRkIFtAQHNwZWNpZXNdLCAyMy4xLjIuMiwgMjMuMi4yLjJcbiAgICBfc2V0U3BlY2llcyhOQU1FKTtcbiAgfVxufTtcblxudmFyIFNQRUNJRVMkMiA9IF93a3MoJ3NwZWNpZXMnKTtcblxudmFyIF9hcnJheVNwZWNpZXNDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIChvcmlnaW5hbCkge1xuICB2YXIgQztcbiAgaWYgKF9pc0FycmF5KG9yaWdpbmFsKSkge1xuICAgIEMgPSBvcmlnaW5hbC5jb25zdHJ1Y3RvcjtcbiAgICAvLyBjcm9zcy1yZWFsbSBmYWxsYmFja1xuICAgIGlmICh0eXBlb2YgQyA9PSAnZnVuY3Rpb24nICYmIChDID09PSBBcnJheSB8fCBfaXNBcnJheShDLnByb3RvdHlwZSkpKSBDID0gdW5kZWZpbmVkO1xuICAgIGlmIChfaXNPYmplY3QoQykpIHtcbiAgICAgIEMgPSBDW1NQRUNJRVMkMl07XG4gICAgICBpZiAoQyA9PT0gbnVsbCkgQyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gcmV0dXJuIEMgPT09IHVuZGVmaW5lZCA/IEFycmF5IDogQztcbn07XG5cbi8vIDkuNC4yLjMgQXJyYXlTcGVjaWVzQ3JlYXRlKG9yaWdpbmFsQXJyYXksIGxlbmd0aClcblxuXG52YXIgX2FycmF5U3BlY2llc0NyZWF0ZSA9IGZ1bmN0aW9uIChvcmlnaW5hbCwgbGVuZ3RoKSB7XG4gIHJldHVybiBuZXcgKF9hcnJheVNwZWNpZXNDb25zdHJ1Y3RvcihvcmlnaW5hbCkpKGxlbmd0aCk7XG59O1xuXG4vLyAwIC0+IEFycmF5I2ZvckVhY2hcbi8vIDEgLT4gQXJyYXkjbWFwXG4vLyAyIC0+IEFycmF5I2ZpbHRlclxuLy8gMyAtPiBBcnJheSNzb21lXG4vLyA0IC0+IEFycmF5I2V2ZXJ5XG4vLyA1IC0+IEFycmF5I2ZpbmRcbi8vIDYgLT4gQXJyYXkjZmluZEluZGV4XG5cblxuXG5cblxudmFyIF9hcnJheU1ldGhvZHMgPSBmdW5jdGlvbiAoVFlQRSwgJGNyZWF0ZSkge1xuICB2YXIgSVNfTUFQID0gVFlQRSA9PSAxO1xuICB2YXIgSVNfRklMVEVSID0gVFlQRSA9PSAyO1xuICB2YXIgSVNfU09NRSA9IFRZUEUgPT0gMztcbiAgdmFyIElTX0VWRVJZID0gVFlQRSA9PSA0O1xuICB2YXIgSVNfRklORF9JTkRFWCA9IFRZUEUgPT0gNjtcbiAgdmFyIE5PX0hPTEVTID0gVFlQRSA9PSA1IHx8IElTX0ZJTkRfSU5ERVg7XG4gIHZhciBjcmVhdGUgPSAkY3JlYXRlIHx8IF9hcnJheVNwZWNpZXNDcmVhdGU7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQpIHtcbiAgICB2YXIgTyA9IF90b09iamVjdCgkdGhpcyk7XG4gICAgdmFyIHNlbGYgPSBfaW9iamVjdChPKTtcbiAgICB2YXIgZiA9IF9jdHgoY2FsbGJhY2tmbiwgdGhhdCwgMyk7XG4gICAgdmFyIGxlbmd0aCA9IF90b0xlbmd0aChzZWxmLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgcmVzdWx0ID0gSVNfTUFQID8gY3JlYXRlKCR0aGlzLCBsZW5ndGgpIDogSVNfRklMVEVSID8gY3JlYXRlKCR0aGlzLCAwKSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgdmFsLCByZXM7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChOT19IT0xFUyB8fCBpbmRleCBpbiBzZWxmKSB7XG4gICAgICB2YWwgPSBzZWxmW2luZGV4XTtcbiAgICAgIHJlcyA9IGYodmFsLCBpbmRleCwgTyk7XG4gICAgICBpZiAoVFlQRSkge1xuICAgICAgICBpZiAoSVNfTUFQKSByZXN1bHRbaW5kZXhdID0gcmVzOyAgIC8vIG1hcFxuICAgICAgICBlbHNlIGlmIChyZXMpIHN3aXRjaCAoVFlQRSkge1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuIHRydWU7ICAgICAgICAgICAgIC8vIHNvbWVcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiB2YWw7ICAgICAgICAgICAgICAvLyBmaW5kXG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gaW5kZXg7ICAgICAgICAgICAgLy8gZmluZEluZGV4XG4gICAgICAgICAgY2FzZSAyOiByZXN1bHQucHVzaCh2YWwpOyAgICAgICAgLy8gZmlsdGVyXG4gICAgICAgIH0gZWxzZSBpZiAoSVNfRVZFUlkpIHJldHVybiBmYWxzZTsgLy8gZXZlcnlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHJlc3VsdDtcbiAgfTtcbn07XG5cbnZhciBkUCQzID0gX29iamVjdERwLmY7XG52YXIgZWFjaCA9IF9hcnJheU1ldGhvZHMoMCk7XG5cblxudmFyIF9jb2xsZWN0aW9uID0gZnVuY3Rpb24gKE5BTUUsIHdyYXBwZXIsIG1ldGhvZHMsIGNvbW1vbiwgSVNfTUFQLCBJU19XRUFLKSB7XG4gIHZhciBCYXNlID0gX2dsb2JhbFtOQU1FXTtcbiAgdmFyIEMgPSBCYXNlO1xuICB2YXIgQURERVIgPSBJU19NQVAgPyAnc2V0JyA6ICdhZGQnO1xuICB2YXIgcHJvdG8gPSBDICYmIEMucHJvdG90eXBlO1xuICB2YXIgTyA9IHt9O1xuICBpZiAoIV9kZXNjcmlwdG9ycyB8fCB0eXBlb2YgQyAhPSAnZnVuY3Rpb24nIHx8ICEoSVNfV0VBSyB8fCBwcm90by5mb3JFYWNoICYmICFfZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIG5ldyBDKCkuZW50cmllcygpLm5leHQoKTtcbiAgfSkpKSB7XG4gICAgLy8gY3JlYXRlIGNvbGxlY3Rpb24gY29uc3RydWN0b3JcbiAgICBDID0gY29tbW9uLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIE5BTUUsIElTX01BUCwgQURERVIpO1xuICAgIF9yZWRlZmluZUFsbChDLnByb3RvdHlwZSwgbWV0aG9kcyk7XG4gICAgX21ldGEuTkVFRCA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgQyA9IHdyYXBwZXIoZnVuY3Rpb24gKHRhcmdldCwgaXRlcmFibGUpIHtcbiAgICAgIF9hbkluc3RhbmNlKHRhcmdldCwgQywgTkFNRSwgJ19jJyk7XG4gICAgICB0YXJnZXQuX2MgPSBuZXcgQmFzZSgpO1xuICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgX2Zvck9mKGl0ZXJhYmxlLCBJU19NQVAsIHRhcmdldFtBRERFUl0sIHRhcmdldCk7XG4gICAgfSk7XG4gICAgZWFjaCgnYWRkLGNsZWFyLGRlbGV0ZSxmb3JFYWNoLGdldCxoYXMsc2V0LGtleXMsdmFsdWVzLGVudHJpZXMsdG9KU09OJy5zcGxpdCgnLCcpLCBmdW5jdGlvbiAoS0VZKSB7XG4gICAgICB2YXIgSVNfQURERVIgPSBLRVkgPT0gJ2FkZCcgfHwgS0VZID09ICdzZXQnO1xuICAgICAgaWYgKEtFWSBpbiBwcm90byAmJiAhKElTX1dFQUsgJiYgS0VZID09ICdjbGVhcicpKSBfaGlkZShDLnByb3RvdHlwZSwgS0VZLCBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICBfYW5JbnN0YW5jZSh0aGlzLCBDLCBLRVkpO1xuICAgICAgICBpZiAoIUlTX0FEREVSICYmIElTX1dFQUsgJiYgIV9pc09iamVjdChhKSkgcmV0dXJuIEtFWSA9PSAnZ2V0JyA/IHVuZGVmaW5lZCA6IGZhbHNlO1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fY1tLRVldKGEgPT09IDAgPyAwIDogYSwgYik7XG4gICAgICAgIHJldHVybiBJU19BRERFUiA/IHRoaXMgOiByZXN1bHQ7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBJU19XRUFLIHx8IGRQJDMoQy5wcm90b3R5cGUsICdzaXplJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jLnNpemU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBfc2V0VG9TdHJpbmdUYWcoQywgTkFNRSk7XG5cbiAgT1tOQU1FXSA9IEM7XG4gIF9leHBvcnQoX2V4cG9ydC5HICsgX2V4cG9ydC5XICsgX2V4cG9ydC5GLCBPKTtcblxuICBpZiAoIUlTX1dFQUspIGNvbW1vbi5zZXRTdHJvbmcoQywgTkFNRSwgSVNfTUFQKTtcblxuICByZXR1cm4gQztcbn07XG5cbnZhciBNQVAgPSAnTWFwJztcblxuLy8gMjMuMSBNYXAgT2JqZWN0c1xudmFyIGVzNl9tYXAgPSBfY29sbGVjdGlvbihNQVAsIGZ1bmN0aW9uIChnZXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIE1hcCgpIHsgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCB7XG4gIC8vIDIzLjEuMy42IE1hcC5wcm90b3R5cGUuZ2V0KGtleSlcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgdmFyIGVudHJ5ID0gX2NvbGxlY3Rpb25TdHJvbmcuZ2V0RW50cnkoX3ZhbGlkYXRlQ29sbGVjdGlvbih0aGlzLCBNQVApLCBrZXkpO1xuICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeS52O1xuICB9LFxuICAvLyAyMy4xLjMuOSBNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKVxuICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIF9jb2xsZWN0aW9uU3Ryb25nLmRlZihfdmFsaWRhdGVDb2xsZWN0aW9uKHRoaXMsIE1BUCksIGtleSA9PT0gMCA/IDAgOiBrZXksIHZhbHVlKTtcbiAgfVxufSwgX2NvbGxlY3Rpb25TdHJvbmcsIHRydWUpO1xuXG52YXIgX2FycmF5RnJvbUl0ZXJhYmxlID0gZnVuY3Rpb24gKGl0ZXIsIElURVJBVE9SKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgX2Zvck9mKGl0ZXIsIGZhbHNlLCByZXN1bHQucHVzaCwgcmVzdWx0LCBJVEVSQVRPUik7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vRGF2aWRCcnVhbnQvTWFwLVNldC5wcm90b3R5cGUudG9KU09OXG5cblxudmFyIF9jb2xsZWN0aW9uVG9Kc29uID0gZnVuY3Rpb24gKE5BTUUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICBpZiAoX2NsYXNzb2YodGhpcykgIT0gTkFNRSkgdGhyb3cgVHlwZUVycm9yKE5BTUUgKyBcIiN0b0pTT04gaXNuJ3QgZ2VuZXJpY1wiKTtcbiAgICByZXR1cm4gX2FycmF5RnJvbUl0ZXJhYmxlKHRoaXMpO1xuICB9O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdmlkQnJ1YW50L01hcC1TZXQucHJvdG90eXBlLnRvSlNPTlxuXG5cbl9leHBvcnQoX2V4cG9ydC5QICsgX2V4cG9ydC5SLCAnTWFwJywgeyB0b0pTT046IF9jb2xsZWN0aW9uVG9Kc29uKCdNYXAnKSB9KTtcblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tL1xuXG5cbnZhciBfc2V0Q29sbGVjdGlvbk9mID0gZnVuY3Rpb24gKENPTExFQ1RJT04pIHtcbiAgX2V4cG9ydChfZXhwb3J0LlMsIENPTExFQ1RJT04sIHsgb2Y6IGZ1bmN0aW9uIG9mKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBBID0gbmV3IEFycmF5KGxlbmd0aCk7XG4gICAgd2hpbGUgKGxlbmd0aC0tKSBBW2xlbmd0aF0gPSBhcmd1bWVudHNbbGVuZ3RoXTtcbiAgICByZXR1cm4gbmV3IHRoaXMoQSk7XG4gIH0gfSk7XG59O1xuXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy1tYXAub2Zcbl9zZXRDb2xsZWN0aW9uT2YoJ01hcCcpO1xuXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vXG5cblxuXG5cblxudmFyIF9zZXRDb2xsZWN0aW9uRnJvbSA9IGZ1bmN0aW9uIChDT0xMRUNUSU9OKSB7XG4gIF9leHBvcnQoX2V4cG9ydC5TLCBDT0xMRUNUSU9OLCB7IGZyb206IGZ1bmN0aW9uIGZyb20oc291cmNlIC8qICwgbWFwRm4sIHRoaXNBcmcgKi8pIHtcbiAgICB2YXIgbWFwRm4gPSBhcmd1bWVudHNbMV07XG4gICAgdmFyIG1hcHBpbmcsIEEsIG4sIGNiO1xuICAgIF9hRnVuY3Rpb24odGhpcyk7XG4gICAgbWFwcGluZyA9IG1hcEZuICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKG1hcHBpbmcpIF9hRnVuY3Rpb24obWFwRm4pO1xuICAgIGlmIChzb3VyY2UgPT0gdW5kZWZpbmVkKSByZXR1cm4gbmV3IHRoaXMoKTtcbiAgICBBID0gW107XG4gICAgaWYgKG1hcHBpbmcpIHtcbiAgICAgIG4gPSAwO1xuICAgICAgY2IgPSBfY3R4KG1hcEZuLCBhcmd1bWVudHNbMl0sIDIpO1xuICAgICAgX2Zvck9mKHNvdXJjZSwgZmFsc2UsIGZ1bmN0aW9uIChuZXh0SXRlbSkge1xuICAgICAgICBBLnB1c2goY2IobmV4dEl0ZW0sIG4rKykpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9mb3JPZihzb3VyY2UsIGZhbHNlLCBBLnB1c2gsIEEpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHRoaXMoQSk7XG4gIH0gfSk7XG59O1xuXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy1tYXAuZnJvbVxuX3NldENvbGxlY3Rpb25Gcm9tKCdNYXAnKTtcblxudmFyIG1hcCA9IF9jb3JlLk1hcDtcblxudmFyIG1hcCQxID0gbWFwO1xuXG52YXIgYXJyYXlTbGljZSA9IFtdLnNsaWNlO1xudmFyIGZhY3RvcmllcyA9IHt9O1xuXG52YXIgY29uc3RydWN0ID0gZnVuY3Rpb24gKEYsIGxlbiwgYXJncykge1xuICBpZiAoIShsZW4gaW4gZmFjdG9yaWVzKSkge1xuICAgIGZvciAodmFyIG4gPSBbXSwgaSA9IDA7IGkgPCBsZW47IGkrKykgbltpXSA9ICdhWycgKyBpICsgJ10nO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgIGZhY3Rvcmllc1tsZW5dID0gRnVuY3Rpb24oJ0YsYScsICdyZXR1cm4gbmV3IEYoJyArIG4uam9pbignLCcpICsgJyknKTtcbiAgfSByZXR1cm4gZmFjdG9yaWVzW2xlbl0oRiwgYXJncyk7XG59O1xuXG52YXIgX2JpbmQgPSBGdW5jdGlvbi5iaW5kIHx8IGZ1bmN0aW9uIGJpbmQodGhhdCAvKiAsIC4uLmFyZ3MgKi8pIHtcbiAgdmFyIGZuID0gX2FGdW5jdGlvbih0aGlzKTtcbiAgdmFyIHBhcnRBcmdzID0gYXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIHZhciBib3VuZCA9IGZ1bmN0aW9uICgvKiBhcmdzLi4uICovKSB7XG4gICAgdmFyIGFyZ3MgPSBwYXJ0QXJncy5jb25jYXQoYXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgYm91bmQgPyBjb25zdHJ1Y3QoZm4sIGFyZ3MubGVuZ3RoLCBhcmdzKSA6IF9pbnZva2UoZm4sIGFyZ3MsIHRoYXQpO1xuICB9O1xuICBpZiAoX2lzT2JqZWN0KGZuLnByb3RvdHlwZSkpIGJvdW5kLnByb3RvdHlwZSA9IGZuLnByb3RvdHlwZTtcbiAgcmV0dXJuIGJvdW5kO1xufTtcblxuLy8gMjYuMS4yIFJlZmxlY3QuY29uc3RydWN0KHRhcmdldCwgYXJndW1lbnRzTGlzdCBbLCBuZXdUYXJnZXRdKVxuXG5cblxuXG5cblxuXG52YXIgckNvbnN0cnVjdCA9IChfZ2xvYmFsLlJlZmxlY3QgfHwge30pLmNvbnN0cnVjdDtcblxuLy8gTVMgRWRnZSBzdXBwb3J0cyBvbmx5IDIgYXJndW1lbnRzIGFuZCBhcmd1bWVudHNMaXN0IGFyZ3VtZW50IGlzIG9wdGlvbmFsXG4vLyBGRiBOaWdodGx5IHNldHMgdGhpcmQgYXJndW1lbnQgYXMgYG5ldy50YXJnZXRgLCBidXQgZG9lcyBub3QgY3JlYXRlIGB0aGlzYCBmcm9tIGl0XG52YXIgTkVXX1RBUkdFVF9CVUcgPSBfZmFpbHMoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiAhKHJDb25zdHJ1Y3QoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCBbXSwgRikgaW5zdGFuY2VvZiBGKTtcbn0pO1xudmFyIEFSR1NfQlVHID0gIV9mYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJDb25zdHJ1Y3QoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuXG5fZXhwb3J0KF9leHBvcnQuUyArIF9leHBvcnQuRiAqIChORVdfVEFSR0VUX0JVRyB8fCBBUkdTX0JVRyksICdSZWZsZWN0Jywge1xuICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIGNvbnN0cnVjdChUYXJnZXQsIGFyZ3MgLyogLCBuZXdUYXJnZXQgKi8pIHtcbiAgICBfYUZ1bmN0aW9uKFRhcmdldCk7XG4gICAgX2FuT2JqZWN0KGFyZ3MpO1xuICAgIHZhciBuZXdUYXJnZXQgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IFRhcmdldCA6IF9hRnVuY3Rpb24oYXJndW1lbnRzWzJdKTtcbiAgICBpZiAoQVJHU19CVUcgJiYgIU5FV19UQVJHRVRfQlVHKSByZXR1cm4gckNvbnN0cnVjdChUYXJnZXQsIGFyZ3MsIG5ld1RhcmdldCk7XG4gICAgaWYgKFRhcmdldCA9PSBuZXdUYXJnZXQpIHtcbiAgICAgIC8vIHcvbyBhbHRlcmVkIG5ld1RhcmdldCwgb3B0aW1pemF0aW9uIGZvciAwLTQgYXJndW1lbnRzXG4gICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBUYXJnZXQoKTtcbiAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdKTtcbiAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgY2FzZSA0OiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgICAgIH1cbiAgICAgIC8vIHcvbyBhbHRlcmVkIG5ld1RhcmdldCwgbG90IG9mIGFyZ3VtZW50cyBjYXNlXG4gICAgICB2YXIgJGFyZ3MgPSBbbnVsbF07XG4gICAgICAkYXJncy5wdXNoLmFwcGx5KCRhcmdzLCBhcmdzKTtcbiAgICAgIHJldHVybiBuZXcgKF9iaW5kLmFwcGx5KFRhcmdldCwgJGFyZ3MpKSgpO1xuICAgIH1cbiAgICAvLyB3aXRoIGFsdGVyZWQgbmV3VGFyZ2V0LCBub3Qgc3VwcG9ydCBidWlsdC1pbiBjb25zdHJ1Y3RvcnNcbiAgICB2YXIgcHJvdG8gPSBuZXdUYXJnZXQucHJvdG90eXBlO1xuICAgIHZhciBpbnN0YW5jZSA9IF9vYmplY3RDcmVhdGUoX2lzT2JqZWN0KHByb3RvKSA/IHByb3RvIDogT2JqZWN0LnByb3RvdHlwZSk7XG4gICAgdmFyIHJlc3VsdCA9IEZ1bmN0aW9uLmFwcGx5LmNhbGwoVGFyZ2V0LCBpbnN0YW5jZSwgYXJncyk7XG4gICAgcmV0dXJuIF9pc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogaW5zdGFuY2U7XG4gIH1cbn0pO1xuXG52YXIgY29uc3RydWN0JDEgPSBfY29yZS5SZWZsZWN0LmNvbnN0cnVjdDtcblxudmFyIGNvbnN0cnVjdCQyID0gY29uc3RydWN0JDE7XG5cbnZhciBjb25zdHJ1Y3QkMyA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbmZ1bmN0aW9uIF9jb25zdHJ1Y3QoUGFyZW50LCBhcmdzLCBDbGFzcykge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgIT09IFwidW5kZWZpbmVkXCIgJiYgY29uc3RydWN0JDIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF9jb25zdHJ1Y3QgPSBjb25zdHJ1Y3QkMjtcbiAgfSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF9jb25zdHJ1Y3QgPSBmdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgICAgIHZhciBhID0gW251bGxdO1xuICAgICAgYS5wdXNoLmFwcGx5KGEsIGFyZ3MpO1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gUGFyZW50LmJpbmQuYXBwbHkoUGFyZW50LCBhKTtcbiAgICAgIHZhciBpbnN0YW5jZSA9IG5ldyBDb25zdHJ1Y3RvcigpO1xuICAgICAgaWYgKENsYXNzKSBzZXRQcm90b3R5cGVPZiQyKGluc3RhbmNlLCBDbGFzcy5wcm90b3R5cGUpO1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX2NvbnN0cnVjdC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9jb25zdHJ1Y3Q7XG59KTtcblxudmFyIHdyYXBOYXRpdmVTdXBlciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbmZ1bmN0aW9uIF93cmFwTmF0aXZlU3VwZXIoQ2xhc3MpIHtcbiAgdmFyIF9jYWNoZSA9IHR5cGVvZiBtYXAkMSA9PT0gXCJmdW5jdGlvblwiID8gbmV3IG1hcCQxKCkgOiB1bmRlZmluZWQ7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBfd3JhcE5hdGl2ZVN1cGVyID0gZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcihDbGFzcykge1xuICAgIGlmICh0eXBlb2YgQ2xhc3MgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgX2NhY2hlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoX2NhY2hlLmhhcyhDbGFzcykpIHJldHVybiBfY2FjaGUuZ2V0KENsYXNzKTtcblxuICAgICAgX2NhY2hlLnNldChDbGFzcywgV3JhcHBlcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gV3JhcHBlcigpIHt9XG5cbiAgICBXcmFwcGVyLnByb3RvdHlwZSA9IGNyZWF0ZSQxKENsYXNzLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IFdyYXBwZXIsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHNldFByb3RvdHlwZU9mJDIoV3JhcHBlciwgc2V0UHJvdG90eXBlT2YkMihmdW5jdGlvbiBTdXBlcigpIHtcbiAgICAgIHJldHVybiBjb25zdHJ1Y3QkMyhDbGFzcywgYXJndW1lbnRzLCBnZXRQcm90b3R5cGVPZiQyKHRoaXMpLmNvbnN0cnVjdG9yKTtcbiAgICB9LCBDbGFzcykpO1xuICB9O1xuXG4gIHJldHVybiBfd3JhcE5hdGl2ZVN1cGVyKENsYXNzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfd3JhcE5hdGl2ZVN1cGVyO1xufSk7XG5cbnZhciBDb21wb3NpdGlvbkVycm9yJDEgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9FcnJvcikge1xuICBmdW5jdGlvbiBDb21wb3NpdGlvbkVycm9yKGNsYXNzSW5zdGFuY2UsIG1lc3NhZ2UsIGNvbXBvbmVudCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIENvbXBvc2l0aW9uRXJyb3IpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoQ29tcG9zaXRpb25FcnJvcikuY2FsbCh0aGlzLCBcIkBcIi5jb25jYXQoY2xhc3NJbnN0YW5jZSwgXCI6IFwiKS5jb25jYXQobWVzc2FnZSkpKTtcblxuICAgIHZhciBzdGFja0FycmF5ID0gX3RoaXMuc3RhY2suc3BsaXQoJ1xcbicpO1xuXG4gICAgc3RhY2tBcnJheS5zcGxpY2UoMSwgMik7XG4gICAgX3RoaXMuc3RhY2sgPSBzdGFja0FycmF5LmpvaW4oJ1xcbicpO1xuICAgIGlmIChjb25zb2xlKSBjb25zb2xlLmVycm9yKCdDb21wb25lbnQ6JywgY29tcG9uZW50KTtcbiAgICBfdGhpcy5uYW1lID0gJ0NvbXBvc2l0aW9uRXJyb3InO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIGluaGVyaXRzKENvbXBvc2l0aW9uRXJyb3IsIF9FcnJvcik7XG5cbiAgcmV0dXJuIENvbXBvc2l0aW9uRXJyb3I7XG59KHdyYXBOYXRpdmVTdXBlcihFcnJvcikpO1xudmFyIERlcGVuZGVuY3lFcnJvciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0Vycm9yMikge1xuICBmdW5jdGlvbiBEZXBlbmRlbmN5RXJyb3IoY2xhc3NJbnN0YW5jZSwgbWVzc2FnZSwgYWN0aXZlTW9kdWxlKSB7XG4gICAgdmFyIF90aGlzMjtcblxuICAgIHZhciBkZXBlbmRlbmN5TW9kdWxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBmYWxzZTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIERlcGVuZGVuY3lFcnJvcik7XG5cbiAgICBfdGhpczIgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoRGVwZW5kZW5jeUVycm9yKS5jYWxsKHRoaXMsIFwiQFwiLmNvbmNhdChjbGFzc0luc3RhbmNlLCBcIjogXCIpLmNvbmNhdChtZXNzYWdlKSkpO1xuXG4gICAgdmFyIHN0YWNrQXJyYXkgPSBfdGhpczIuc3RhY2suc3BsaXQoJ1xcbicpO1xuXG4gICAgc3RhY2tBcnJheS5zcGxpY2UoMSwgMik7XG4gICAgX3RoaXMyLnN0YWNrID0gc3RhY2tBcnJheS5qb2luKCdcXG4nKTtcbiAgICBpZiAoY29uc29sZSkgY29uc29sZS5lcnJvcignQWN0aXZlIG1vZHVsZTonLCBhY3RpdmVNb2R1bGUpO1xuICAgIGlmIChjb25zb2xlICYmIGRlcGVuZGVuY3lNb2R1bGUpIGNvbnNvbGUuZXJyb3IoJ0RlcGVuZGVuY3kgcHVibGlzaGVkIGJ5IG1vZHVsZTonLCBkZXBlbmRlbmN5TW9kdWxlKTtcbiAgICBfdGhpczIubmFtZSA9ICdEZXBlbmRlbmN5RXJyb3InO1xuICAgIHJldHVybiBfdGhpczI7XG4gIH1cblxuICBpbmhlcml0cyhEZXBlbmRlbmN5RXJyb3IsIF9FcnJvcjIpO1xuXG4gIHJldHVybiBEZXBlbmRlbmN5RXJyb3I7XG59KHdyYXBOYXRpdmVTdXBlcihFcnJvcikpO1xudmFyIE1hbmFnZXJFcnJvciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0Vycm9yMykge1xuICBmdW5jdGlvbiBNYW5hZ2VyRXJyb3IoY2xhc3NJbnN0YW5jZSwgbWVzc2FnZSwgY29tcG9uZW50KSB7XG4gICAgdmFyIF90aGlzMztcblxuICAgIHZhciBhY3RpdmVNb2R1bGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZhbHNlO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgTWFuYWdlckVycm9yKTtcblxuICAgIF90aGlzMyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihNYW5hZ2VyRXJyb3IpLmNhbGwodGhpcywgXCJAXCIuY29uY2F0KGNsYXNzSW5zdGFuY2UsIFwiOiBcIikuY29uY2F0KG1lc3NhZ2UpKSk7XG5cbiAgICB2YXIgc3RhY2tBcnJheSA9IF90aGlzMy5zdGFjay5zcGxpdCgnXFxuJyk7XG5cbiAgICBzdGFja0FycmF5LnNwbGljZSgxLCAyKTtcbiAgICBfdGhpczMuc3RhY2sgPSBzdGFja0FycmF5LmpvaW4oJ1xcbicpO1xuICAgIGlmIChjb25zb2xlKSBjb25zb2xlLmVycm9yKCdDb21wb25lbnQ6JywgY29tcG9uZW50KTtcbiAgICBpZiAoY29uc29sZSAmJiBhY3RpdmVNb2R1bGUpIGNvbnNvbGUuZXJyb3IoJ0FjdGl2ZSBtb2R1bGU6JywgYWN0aXZlTW9kdWxlKTtcbiAgICBfdGhpczMubmFtZSA9ICdNYW5hZ2VyRXJyb3InO1xuICAgIHJldHVybiBfdGhpczM7XG4gIH1cblxuICBpbmhlcml0cyhNYW5hZ2VyRXJyb3IsIF9FcnJvcjMpO1xuXG4gIHJldHVybiBNYW5hZ2VyRXJyb3I7XG59KHdyYXBOYXRpdmVTdXBlcihFcnJvcikpO1xuXG52YXIgd2FybkRlcHMgPSBmdW5jdGlvbiB3YXJuRGVwcygpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdXaGl0ZXN0b3JtSlMgRnJhbWV3b3JrIHJlcXUgaXJlcyBUaHJlZS5qcyByOTIuIGh0dHBzOi8vdGhyZWVqcy5vcmcvJyk7XG59O1xuXG50cnkge1xuICBpZiAoIVJFVklTSU9OKSB3YXJuRGVwcygpO1xufSBjYXRjaCAoZXJyKSB7XG4gIHdhcm5EZXBzKCk7XG59XG4vKipcbiAqIEBjbGFzcyBNb2R1bGVTeXN0ZW1cbiAqIEBjYXRlZ29yeSBjb3JlXG4gKiBAZGVzY3JpcHRpb24gIFByb3ZpZGVzIEFQSSBmb3IgY2xhc3NlcyB0aGF0IHdpbGwgdXNlIE1vZHVsZXMuPGJyLz5cbiAqIFRoaXMgY2xhc3MgaW5jbHVkZXMgYmFzaWMgZXZlbnQgc3lzdGVtIHdpdGggdGhvc2Ugc3VwcG9ydGVkIG1ldGhvZHM6XG4gKiA8cHJlPi5vbigpPC9wcmU+PHByZT4ub2ZmKCk8L3ByZT48cHJlPi5lbWl0KCk8L3ByZT5cbiAqIEBleHRlbmRzIEV2ZW50c1xuICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlXG4gKi9cblxuXG52YXIgTW9kdWxlU3lzdGVtID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfRXZlbnRzKSB7XG4gIGZ1bmN0aW9uIE1vZHVsZVN5c3RlbSgpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBNb2R1bGVTeXN0ZW0pO1xuXG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihNb2R1bGVTeXN0ZW0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoTW9kdWxlU3lzdGVtLCBbe1xuICAgIGtleTogXCJpbnRlZ3JhdGVNb2R1bGVzXCIsXG4gICAgLy8gSU5URUdSQVRJTkdcblxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgaW50ZWdyYXRlTW9kdWxlc1xuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBUaGlzIG1ldGhvZCBhcHBsaWVzIGFsbCBtb2R1bGVzIGZyb20gLm1vZHVsZXMgY29sbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3NvdXJjZV0gSWYgc291cmNlIChzaG91bGQgYmUgYSBjb21wb25lbnQpIGlzIHByb3ZpZGVkLCB3aWxsIHJlcGxhY2UgLm1vZHVsZXMgd2l0aCBzb3VyY2UncyBvbmUgYmVmb3JlIGV4ZWN1dGluZyBtb2R1bGVzLlxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVTeXN0ZW1cbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gaW50ZWdyYXRlTW9kdWxlcyhzb3VyY2UpIHtcbiAgICAgIGlmICghdGhpcy5tb2R1bGVzICYmICFzb3VyY2UpIHJldHVybjtcbiAgICAgIGlmIChzb3VyY2UgJiYgc291cmNlLm1vZHVsZXMpIHRoaXMubW9kdWxlcyA9IHNvdXJjZS5tb2R1bGVzLnNsaWNlKDApO1xuXG4gICAgICBpZiAodGhpcy5tb2R1bGVzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBtYXggPSB0aGlzLm1vZHVsZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHtcbiAgICAgICAgICB0aGlzLmFwcGx5TW9kdWxlKHRoaXMubW9kdWxlc1tpXSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzb3VyY2UpIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBvbkNvcHk6IHNvdXJjZVxuICAgICAgfSk7XG4gICAgfSAvLyBBUFBMWUlORyBNT0RVTEUgKC4uLmFuZCBhIFwiYnJpZGdlXCIgZm9yIG1vZHVsZSlcblxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgYXBwbHlCcmlkZ2VcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gTWFrZXMgY29tcG9uZW50LXNwZWNpZmljIEFQSSB0byB3b3JrIHdpdGggbW9kdWxlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYnJpZGdlTWFwXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIG9iamVjdCB3aXRoIG1vZGlmaWVkIHZhbHVlcy5cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlU3lzdGVtXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJhcHBseUJyaWRnZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhcHBseUJyaWRnZSgpIHtcbiAgICAgIHZhciBicmlkZ2VNYXAgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgdmFyIG1vZHVsZXMgPSB0aGlzLm1vZHVsZXM7XG4gICAgICBpZiAoIW1vZHVsZXMpIHJldHVybiBicmlkZ2VNYXA7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBtYXggPSBtb2R1bGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBicmlkZ2VNYXApIHtcbiAgICAgICAgICBpZiAoYnJpZGdlTWFwW2tleV0pIHtcbiAgICAgICAgICAgIHZhciBtb2R1bGUgPSBtb2R1bGVzW2ldO1xuICAgICAgICAgICAgaWYgKG1vZHVsZSAmJiBtb2R1bGUuYnJpZGdlICYmIG1vZHVsZS5icmlkZ2Vba2V5XSkgYnJpZGdlTWFwW2tleV0gPSBtb2R1bGUuYnJpZGdlW2tleV0uYXBwbHkodGhpcywgW2JyaWRnZU1hcFtrZXldLCBtb2R1bGVdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGJyaWRnZU1hcDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBhcHBseUNvbW1hbmRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gLmFwcGx5Q29tbWFuZCBydW5zIGEgbWV0aG9kIGNhbGxlZCBgbmFtZWAgb24gYWxsIG1vZHVsZXMuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG1ldGhvZCBuYW1lLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYj0oZnVuYywgbW9kdWxlU2NvcGUpID0+IGZ1bmMuYXBwbHkodGhpcywgW21vZHVsZVNjb3BlXSldIEhvdyB0aGUgZnVuY3Rpb24gaXMgd3JhcHBlZC9cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlU3lzdGVtXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJhcHBseUNvbW1hbmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwbHlDb21tYW5kKG5hbWUpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBjYiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZnVuY3Rpb24gKGZ1bmMsIG1vZHVsZVNjb3BlKSB7XG4gICAgICAgIHJldHVybiBmdW5jLmFwcGx5KF90aGlzLCBbbW9kdWxlU2NvcGVdKTtcbiAgICAgIH07XG4gICAgICB2YXIgbW9kdWxlcyA9IHRoaXMubW9kdWxlcztcbiAgICAgIGlmICghbW9kdWxlcykgcmV0dXJuO1xuXG4gICAgICBmb3IgKHZhciBpID0gMCwgbWF4ID0gbW9kdWxlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykge1xuICAgICAgICB2YXIgbW9kdWxlID0gbW9kdWxlc1tpXTtcbiAgICAgICAgaWYgKG5hbWUgaW4gbW9kdWxlKSBjYihtb2R1bGVbbmFtZV0sIG1vZHVsZSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgYXBwbHlNb2R1bGVcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gLmFwcGx5TW9kdWxlIGlzIGFsc28gdXNlZCBpbiAuaW50ZWdyYXRlTW9kdWxlcygpIGZ1bmN0aW9uLlxuICAgICAqIEl0IGRvZXMgZXhhY3RseSB3aGF0IGl0cyBuYW1lIHNheXMgKGFwcGxpZXMgbW9kdWxlIHRvIGNvbXBvbmVudCBvciBhcHApLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtb2R1bGUgdGhlIG1vZHVsZSB0byBhcHBseVxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3B1c2g9dHJ1ZV1cbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgbW9kdWxlIHRoYXQgd2FzIGFwcGxpZWQuXG4gICAgICogQHRocm93cyB7TWFuYWdlckVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVTeXN0ZW1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImFwcGx5TW9kdWxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGx5TW9kdWxlKG1vZHVsZSkge1xuICAgICAgdmFyIHB1c2ggPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gICAgICBpZiAoIW1vZHVsZSkgcmV0dXJuO1xuICAgICAgaWYgKHB1c2ggJiYgdGhpcy5tb2R1bGVzKSB0aGlzLm1vZHVsZXMucHVzaChtb2R1bGUpO2Vsc2UgaWYgKHB1c2gpIHRoaXMubW9kdWxlcyA9IFttb2R1bGVdO1xuICAgICAgaWYgKHRoaXMubWFuYWdlcikgdGhpcy5tYW5hZ2VyLmFjdGl2ZShtb2R1bGUpO1xuICAgICAgaWYgKG1vZHVsZS5tYW5hZ2VyICYmIHRoaXMubWFuYWdlcikgbW9kdWxlLm1hbmFnZXIodGhpcy5tYW5hZ2VyKTtlbHNlIGlmIChtb2R1bGUubWFuYWdlcikge1xuICAgICAgICB0aHJvdyBuZXcgTWFuYWdlckVycm9yKCdDb21wb25lbnQnLCBcIk1vZHVsZSByZXF1aXJlcyBNb2R1bGVNYW5hZ2VyIHRoYXQgaXMgdHVybmVkIG9mZiBmb3IgdGhpcyBjb21wb25lbnRcIiwgdGhpcywgbW9kdWxlKTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2R1bGUuaW50ZWdyYXRlKSBtb2R1bGUuaW50ZWdyYXRlLmJpbmQodGhpcykobW9kdWxlKTtcbiAgICAgIHJldHVybiBtb2R1bGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgZGlzcG9zZU1vZHVsZXNcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gRGlzcG9zZXMgb2YgYWxsIG1vZHVsZXNcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlU3lzdGVtXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkaXNwb3NlTW9kdWxlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNwb3NlTW9kdWxlcygpIHtcbiAgICAgIHdoaWxlICh0aGlzLm1vZHVsZXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZGlzcG9zZU1vZHVsZSh0aGlzLm1vZHVsZXNbMF0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGRpc3Bvc2VNb2R1bGVcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gRGlzcG9zZXMgb2YgdGhlIGdpdmVuIG1vZHVsZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtb2R1bGUgdGhlIG1vZHVsZSB0byBkaXNwb3NlXG4gICAgICogQHJldHVybiB7TW9kdWxlfSBSZXR1cm5zIG1vZHVsZSB0aGF0IHdhcyByZW1vdmVkLlxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVTeXN0ZW1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRpc3Bvc2VNb2R1bGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGlzcG9zZU1vZHVsZShtb2R1bGUpIHtcbiAgICAgIGlmICghbW9kdWxlKSByZXR1cm47XG4gICAgICB0aGlzLm1vZHVsZXMuc3BsaWNlKHRoaXMubW9kdWxlcy5pbmRleE9mKG1vZHVsZSksIDEpO1xuICAgICAgaWYgKG1vZHVsZS5kaXNwb3NlKSBtb2R1bGUuZGlzcG9zZS5iaW5kKHRoaXMpKG1vZHVsZSk7XG4gICAgICByZXR1cm4gbW9kdWxlO1xuICAgIH0gLy8gUElQRUQgTUVUSE9EXG5cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIG1vZHVsZVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBwaXBlZCB2ZXJzaW9uIG9mIC5hcHBseU1vZHVsZSgpLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtb2R1bGUgdGhlIG1vZHVsZSB0byBhcHBseVxuICAgICAqIEByZXR1cm4ge3RoaXN9IHJldHVybnMgdGhpcyAtIGFwcC9jb21wb25lbnRcbiAgICAgKiBAdGhyb3dzIHtNYW5hZ2VyRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZVN5c3RlbVxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPlBpcGVkIG1vZHVsZXM8L2NhcHRpb24+XG4gICAgICogY29tcG9uZW50XG4gICAgICogICAubW9kdWxlKG5ldyBNb2R1bGUxKCkpXG4gICAgICogICAubW9kdWxlKG5ldyBNb2R1bGUyKCkpXG4gICAgICogICAubW9kdWxlKG5ldyBNb2R1bGUzKCkpXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJtb2R1bGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbW9kdWxlKF9tb2R1bGUpIHtcbiAgICAgIHRoaXMuYXBwbHlNb2R1bGUoX21vZHVsZSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhNb2R1bGVTeXN0ZW0sIF9FdmVudHMpO1xuXG4gIHJldHVybiBNb2R1bGVTeXN0ZW07XG59KG1pbml2ZW50c19jb21tb25qcyk7XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbn1cblxudmFyIGFycmF5V2l0aEhvbGVzID0gX2FycmF5V2l0aEhvbGVzO1xuXG52YXIgY29yZV9nZXRJdGVyYXRvciA9IF9jb3JlLmdldEl0ZXJhdG9yID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBpdGVyRm4gPSBjb3JlX2dldEl0ZXJhdG9yTWV0aG9kKGl0KTtcbiAgaWYgKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgaXRlcmFibGUhJyk7XG4gIHJldHVybiBfYW5PYmplY3QoaXRlckZuLmNhbGwoaXQpKTtcbn07XG5cbnZhciBnZXRJdGVyYXRvciA9IGNvcmVfZ2V0SXRlcmF0b3I7XG5cbnZhciBnZXRJdGVyYXRvciQxID0gZ2V0SXRlcmF0b3I7XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHtcbiAgdmFyIF9hcnIgPSBbXTtcbiAgdmFyIF9uID0gdHJ1ZTtcbiAgdmFyIF9kID0gZmFsc2U7XG4gIHZhciBfZSA9IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGZvciAodmFyIF9pID0gZ2V0SXRlcmF0b3IkMShhcnIpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkge1xuICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2QgPSB0cnVlO1xuICAgIF9lID0gZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIF9hcnI7XG59XG5cbnZhciBpdGVyYWJsZVRvQXJyYXlMaW1pdCA9IF9pdGVyYWJsZVRvQXJyYXlMaW1pdDtcblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2VcIik7XG59XG5cbnZhciBub25JdGVyYWJsZVJlc3QgPSBfbm9uSXRlcmFibGVSZXN0O1xuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIGFycmF5V2l0aEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBub25JdGVyYWJsZVJlc3QoKTtcbn1cblxudmFyIHNsaWNlZFRvQXJyYXkgPSBfc2xpY2VkVG9BcnJheTtcblxuZnVuY3Rpb24gc3ltYm9sT2JzZXJ2YWJsZVBvbnlmaWxsKHJvb3QpIHtcblx0dmFyIHJlc3VsdDtcblx0dmFyIFN5bWJvbCA9IHJvb3QuU3ltYm9sO1xuXG5cdGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0aWYgKFN5bWJvbC5vYnNlcnZhYmxlKSB7XG5cdFx0XHRyZXN1bHQgPSBTeW1ib2wub2JzZXJ2YWJsZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0ID0gU3ltYm9sKCdvYnNlcnZhYmxlJyk7XG5cdFx0XHRTeW1ib2wub2JzZXJ2YWJsZSA9IHJlc3VsdDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmVzdWx0ID0gJ0BAb2JzZXJ2YWJsZSc7XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG4vKiBnbG9iYWwgd2luZG93ICovXG5cbnZhciByb290O1xuXG5pZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSBzZWxmO1xufSBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICByb290ID0gd2luZG93O1xufSBlbHNlIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICByb290ID0gZ2xvYmFsO1xufSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykge1xuICByb290ID0gbW9kdWxlO1xufSBlbHNlIHtcbiAgcm9vdCA9IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG59XG5cbnZhciByZXN1bHQgPSBzeW1ib2xPYnNlcnZhYmxlUG9ueWZpbGwocm9vdCk7XG5cbi8qKlxuICogVGhlc2UgYXJlIHByaXZhdGUgYWN0aW9uIHR5cGVzIHJlc2VydmVkIGJ5IFJlZHV4LlxuICogRm9yIGFueSB1bmtub3duIGFjdGlvbnMsIHlvdSBtdXN0IHJldHVybiB0aGUgY3VycmVudCBzdGF0ZS5cbiAqIElmIHRoZSBjdXJyZW50IHN0YXRlIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLlxuICogRG8gbm90IHJlZmVyZW5jZSB0aGVzZSBhY3Rpb24gdHlwZXMgZGlyZWN0bHkgaW4geW91ciBjb2RlLlxuICovXG52YXIgQWN0aW9uVHlwZXMgPSB7XG4gIElOSVQ6ICdAQHJlZHV4L0lOSVQnICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KCcnKS5qb2luKCcuJyksXG4gIFJFUExBQ0U6ICdAQHJlZHV4L1JFUExBQ0UnICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KCcnKS5qb2luKCcuJylcbn07XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqO1xufSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBvYmogVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGFyZ3VtZW50IGFwcGVhcnMgdG8gYmUgYSBwbGFpbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qob2JqKSB7XG4gIGlmICgodHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yob2JqKSkgIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBwcm90byA9IG9iajtcbiAgd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykgIT09IG51bGwpIHtcbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IHByb3RvO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBSZWR1eCBzdG9yZSB0aGF0IGhvbGRzIHRoZSBzdGF0ZSB0cmVlLlxuICogVGhlIG9ubHkgd2F5IHRvIGNoYW5nZSB0aGUgZGF0YSBpbiB0aGUgc3RvcmUgaXMgdG8gY2FsbCBgZGlzcGF0Y2goKWAgb24gaXQuXG4gKlxuICogVGhlcmUgc2hvdWxkIG9ubHkgYmUgYSBzaW5nbGUgc3RvcmUgaW4geW91ciBhcHAuIFRvIHNwZWNpZnkgaG93IGRpZmZlcmVudFxuICogcGFydHMgb2YgdGhlIHN0YXRlIHRyZWUgcmVzcG9uZCB0byBhY3Rpb25zLCB5b3UgbWF5IGNvbWJpbmUgc2V2ZXJhbCByZWR1Y2Vyc1xuICogaW50byBhIHNpbmdsZSByZWR1Y2VyIGZ1bmN0aW9uIGJ5IHVzaW5nIGBjb21iaW5lUmVkdWNlcnNgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlZHVjZXIgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG5leHQgc3RhdGUgdHJlZSwgZ2l2ZW5cbiAqIHRoZSBjdXJyZW50IHN0YXRlIHRyZWUgYW5kIHRoZSBhY3Rpb24gdG8gaGFuZGxlLlxuICpcbiAqIEBwYXJhbSB7YW55fSBbcHJlbG9hZGVkU3RhdGVdIFRoZSBpbml0aWFsIHN0YXRlLiBZb3UgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBpdFxuICogdG8gaHlkcmF0ZSB0aGUgc3RhdGUgZnJvbSB0aGUgc2VydmVyIGluIHVuaXZlcnNhbCBhcHBzLCBvciB0byByZXN0b3JlIGFcbiAqIHByZXZpb3VzbHkgc2VyaWFsaXplZCB1c2VyIHNlc3Npb24uXG4gKiBJZiB5b3UgdXNlIGBjb21iaW5lUmVkdWNlcnNgIHRvIHByb2R1Y2UgdGhlIHJvb3QgcmVkdWNlciBmdW5jdGlvbiwgdGhpcyBtdXN0IGJlXG4gKiBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZSBhcyBgY29tYmluZVJlZHVjZXJzYCBrZXlzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtlbmhhbmNlcl0gVGhlIHN0b3JlIGVuaGFuY2VyLiBZb3UgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBpdFxuICogdG8gZW5oYW5jZSB0aGUgc3RvcmUgd2l0aCB0aGlyZC1wYXJ0eSBjYXBhYmlsaXRpZXMgc3VjaCBhcyBtaWRkbGV3YXJlLFxuICogdGltZSB0cmF2ZWwsIHBlcnNpc3RlbmNlLCBldGMuIFRoZSBvbmx5IHN0b3JlIGVuaGFuY2VyIHRoYXQgc2hpcHMgd2l0aCBSZWR1eFxuICogaXMgYGFwcGx5TWlkZGxld2FyZSgpYC5cbiAqXG4gKiBAcmV0dXJucyB7U3RvcmV9IEEgUmVkdXggc3RvcmUgdGhhdCBsZXRzIHlvdSByZWFkIHRoZSBzdGF0ZSwgZGlzcGF0Y2ggYWN0aW9uc1xuICogYW5kIHN1YnNjcmliZSB0byBjaGFuZ2VzLlxuICovXG5mdW5jdGlvbiBjcmVhdGVTdG9yZShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSwgZW5oYW5jZXIpIHtcbiAgdmFyIF9yZWYyO1xuXG4gIGlmICh0eXBlb2YgcHJlbG9hZGVkU3RhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGVuaGFuY2VyID09PSAndW5kZWZpbmVkJykge1xuICAgIGVuaGFuY2VyID0gcHJlbG9hZGVkU3RhdGU7XG4gICAgcHJlbG9hZGVkU3RhdGUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmICh0eXBlb2YgZW5oYW5jZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdGhlIGVuaGFuY2VyIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuaGFuY2VyKGNyZWF0ZVN0b3JlKShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSk7XG4gIH1cblxuICBpZiAodHlwZW9mIHJlZHVjZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRoZSByZWR1Y2VyIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gIH1cblxuICB2YXIgY3VycmVudFJlZHVjZXIgPSByZWR1Y2VyO1xuICB2YXIgY3VycmVudFN0YXRlID0gcHJlbG9hZGVkU3RhdGU7XG4gIHZhciBjdXJyZW50TGlzdGVuZXJzID0gW107XG4gIHZhciBuZXh0TGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycztcbiAgdmFyIGlzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCkge1xuICAgIGlmIChuZXh0TGlzdGVuZXJzID09PSBjdXJyZW50TGlzdGVuZXJzKSB7XG4gICAgICBuZXh0TGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycy5zbGljZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgc3RhdGUgdHJlZSBtYW5hZ2VkIGJ5IHRoZSBzdG9yZS5cbiAgICpcbiAgICogQHJldHVybnMge2FueX0gVGhlIGN1cnJlbnQgc3RhdGUgdHJlZSBvZiB5b3VyIGFwcGxpY2F0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3RhdGUoKSB7XG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG1heSBub3QgY2FsbCBzdG9yZS5nZXRTdGF0ZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdUaGUgcmVkdWNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCB0aGUgc3RhdGUgYXMgYW4gYXJndW1lbnQuICcgKyAnUGFzcyBpdCBkb3duIGZyb20gdGhlIHRvcCByZWR1Y2VyIGluc3RlYWQgb2YgcmVhZGluZyBpdCBmcm9tIHRoZSBzdG9yZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudFN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjaGFuZ2UgbGlzdGVuZXIuIEl0IHdpbGwgYmUgY2FsbGVkIGFueSB0aW1lIGFuIGFjdGlvbiBpcyBkaXNwYXRjaGVkLFxuICAgKiBhbmQgc29tZSBwYXJ0IG9mIHRoZSBzdGF0ZSB0cmVlIG1heSBwb3RlbnRpYWxseSBoYXZlIGNoYW5nZWQuIFlvdSBtYXkgdGhlblxuICAgKiBjYWxsIGBnZXRTdGF0ZSgpYCB0byByZWFkIHRoZSBjdXJyZW50IHN0YXRlIHRyZWUgaW5zaWRlIHRoZSBjYWxsYmFjay5cbiAgICpcbiAgICogWW91IG1heSBjYWxsIGBkaXNwYXRjaCgpYCBmcm9tIGEgY2hhbmdlIGxpc3RlbmVyLCB3aXRoIHRoZSBmb2xsb3dpbmdcbiAgICogY2F2ZWF0czpcbiAgICpcbiAgICogMS4gVGhlIHN1YnNjcmlwdGlvbnMgYXJlIHNuYXBzaG90dGVkIGp1c3QgYmVmb3JlIGV2ZXJ5IGBkaXNwYXRjaCgpYCBjYWxsLlxuICAgKiBJZiB5b3Ugc3Vic2NyaWJlIG9yIHVuc3Vic2NyaWJlIHdoaWxlIHRoZSBsaXN0ZW5lcnMgYXJlIGJlaW5nIGludm9rZWQsIHRoaXNcbiAgICogd2lsbCBub3QgaGF2ZSBhbnkgZWZmZWN0IG9uIHRoZSBgZGlzcGF0Y2goKWAgdGhhdCBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MuXG4gICAqIEhvd2V2ZXIsIHRoZSBuZXh0IGBkaXNwYXRjaCgpYCBjYWxsLCB3aGV0aGVyIG5lc3RlZCBvciBub3QsIHdpbGwgdXNlIGEgbW9yZVxuICAgKiByZWNlbnQgc25hcHNob3Qgb2YgdGhlIHN1YnNjcmlwdGlvbiBsaXN0LlxuICAgKlxuICAgKiAyLiBUaGUgbGlzdGVuZXIgc2hvdWxkIG5vdCBleHBlY3QgdG8gc2VlIGFsbCBzdGF0ZSBjaGFuZ2VzLCBhcyB0aGUgc3RhdGVcbiAgICogbWlnaHQgaGF2ZSBiZWVuIHVwZGF0ZWQgbXVsdGlwbGUgdGltZXMgZHVyaW5nIGEgbmVzdGVkIGBkaXNwYXRjaCgpYCBiZWZvcmVcbiAgICogdGhlIGxpc3RlbmVyIGlzIGNhbGxlZC4gSXQgaXMsIGhvd2V2ZXIsIGd1YXJhbnRlZWQgdGhhdCBhbGwgc3Vic2NyaWJlcnNcbiAgICogcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIGBkaXNwYXRjaCgpYCBzdGFydGVkIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGxhdGVzdFxuICAgKiBzdGF0ZSBieSB0aGUgdGltZSBpdCBleGl0cy5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgQSBjYWxsYmFjayB0byBiZSBpbnZva2VkIG9uIGV2ZXJ5IGRpc3BhdGNoLlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdG8gcmVtb3ZlIHRoaXMgY2hhbmdlIGxpc3RlbmVyLlxuICAgKi9cbiAgZnVuY3Rpb24gc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0aGUgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbWF5IG5vdCBjYWxsIHN0b3JlLnN1YnNjcmliZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdJZiB5b3Ugd291bGQgbGlrZSB0byBiZSBub3RpZmllZCBhZnRlciB0aGUgc3RvcmUgaGFzIGJlZW4gdXBkYXRlZCwgc3Vic2NyaWJlIGZyb20gYSAnICsgJ2NvbXBvbmVudCBhbmQgaW52b2tlIHN0b3JlLmdldFN0YXRlKCkgaW4gdGhlIGNhbGxiYWNrIHRvIGFjY2VzcyB0aGUgbGF0ZXN0IHN0YXRlLiAnICsgJ1NlZSBodHRwczovL3JlZHV4LmpzLm9yZy9hcGktcmVmZXJlbmNlL3N0b3JlI3N1YnNjcmliZShsaXN0ZW5lcikgZm9yIG1vcmUgZGV0YWlscy4nKTtcbiAgICB9XG5cbiAgICB2YXIgaXNTdWJzY3JpYmVkID0gdHJ1ZTtcblxuICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICBuZXh0TGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIHVuc3Vic2NyaWJlKCkge1xuICAgICAgaWYgKCFpc1N1YnNjcmliZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtYXkgbm90IHVuc3Vic2NyaWJlIGZyb20gYSBzdG9yZSBsaXN0ZW5lciB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuICcgKyAnU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2FwaS1yZWZlcmVuY2Uvc3RvcmUjc3Vic2NyaWJlKGxpc3RlbmVyKSBmb3IgbW9yZSBkZXRhaWxzLicpO1xuICAgICAgfVxuXG4gICAgICBpc1N1YnNjcmliZWQgPSBmYWxzZTtcblxuICAgICAgZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpO1xuICAgICAgdmFyIGluZGV4ID0gbmV4dExpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgIG5leHRMaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoZXMgYW4gYWN0aW9uLiBJdCBpcyB0aGUgb25seSB3YXkgdG8gdHJpZ2dlciBhIHN0YXRlIGNoYW5nZS5cbiAgICpcbiAgICogVGhlIGByZWR1Y2VyYCBmdW5jdGlvbiwgdXNlZCB0byBjcmVhdGUgdGhlIHN0b3JlLCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZVxuICAgKiBjdXJyZW50IHN0YXRlIHRyZWUgYW5kIHRoZSBnaXZlbiBgYWN0aW9uYC4gSXRzIHJldHVybiB2YWx1ZSB3aWxsXG4gICAqIGJlIGNvbnNpZGVyZWQgdGhlICoqbmV4dCoqIHN0YXRlIG9mIHRoZSB0cmVlLCBhbmQgdGhlIGNoYW5nZSBsaXN0ZW5lcnNcbiAgICogd2lsbCBiZSBub3RpZmllZC5cbiAgICpcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cyBwbGFpbiBvYmplY3QgYWN0aW9ucy4gSWYgeW91IHdhbnQgdG9cbiAgICogZGlzcGF0Y2ggYSBQcm9taXNlLCBhbiBPYnNlcnZhYmxlLCBhIHRodW5rLCBvciBzb21ldGhpbmcgZWxzZSwgeW91IG5lZWQgdG9cbiAgICogd3JhcCB5b3VyIHN0b3JlIGNyZWF0aW5nIGZ1bmN0aW9uIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgbWlkZGxld2FyZS4gRm9yXG4gICAqIGV4YW1wbGUsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGByZWR1eC10aHVua2AgcGFja2FnZS4gRXZlbiB0aGVcbiAgICogbWlkZGxld2FyZSB3aWxsIGV2ZW50dWFsbHkgZGlzcGF0Y2ggcGxhaW4gb2JqZWN0IGFjdGlvbnMgdXNpbmcgdGhpcyBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb24gQSBwbGFpbiBvYmplY3QgcmVwcmVzZW50aW5nIOKAnHdoYXQgY2hhbmdlZOKAnS4gSXQgaXNcbiAgICogYSBnb29kIGlkZWEgdG8ga2VlcCBhY3Rpb25zIHNlcmlhbGl6YWJsZSBzbyB5b3UgY2FuIHJlY29yZCBhbmQgcmVwbGF5IHVzZXJcbiAgICogc2Vzc2lvbnMsIG9yIHVzZSB0aGUgdGltZSB0cmF2ZWxsaW5nIGByZWR1eC1kZXZ0b29sc2AuIEFuIGFjdGlvbiBtdXN0IGhhdmVcbiAgICogYSBgdHlwZWAgcHJvcGVydHkgd2hpY2ggbWF5IG5vdCBiZSBgdW5kZWZpbmVkYC4gSXQgaXMgYSBnb29kIGlkZWEgdG8gdXNlXG4gICAqIHN0cmluZyBjb25zdGFudHMgZm9yIGFjdGlvbiB0eXBlcy5cbiAgICpcbiAgICogQHJldHVybnMge09iamVjdH0gRm9yIGNvbnZlbmllbmNlLCB0aGUgc2FtZSBhY3Rpb24gb2JqZWN0IHlvdSBkaXNwYXRjaGVkLlxuICAgKlxuICAgKiBOb3RlIHRoYXQsIGlmIHlvdSB1c2UgYSBjdXN0b20gbWlkZGxld2FyZSwgaXQgbWF5IHdyYXAgYGRpc3BhdGNoKClgIHRvXG4gICAqIHJldHVybiBzb21ldGhpbmcgZWxzZSAoZm9yIGV4YW1wbGUsIGEgUHJvbWlzZSB5b3UgY2FuIGF3YWl0KS5cbiAgICovXG4gIGZ1bmN0aW9uIGRpc3BhdGNoKGFjdGlvbikge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChhY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjdGlvbnMgbXVzdCBiZSBwbGFpbiBvYmplY3RzLiAnICsgJ1VzZSBjdXN0b20gbWlkZGxld2FyZSBmb3IgYXN5bmMgYWN0aW9ucy4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGFjdGlvbi50eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY3Rpb25zIG1heSBub3QgaGF2ZSBhbiB1bmRlZmluZWQgXCJ0eXBlXCIgcHJvcGVydHkuICcgKyAnSGF2ZSB5b3UgbWlzc3BlbGxlZCBhIGNvbnN0YW50PycpO1xuICAgIH1cblxuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZHVjZXJzIG1heSBub3QgZGlzcGF0Y2ggYWN0aW9ucy4nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaXNEaXNwYXRjaGluZyA9IHRydWU7XG4gICAgICBjdXJyZW50U3RhdGUgPSBjdXJyZW50UmVkdWNlcihjdXJyZW50U3RhdGUsIGFjdGlvbik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgbGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycyA9IG5leHRMaXN0ZW5lcnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXTtcbiAgICAgIGxpc3RlbmVyKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyB0aGUgcmVkdWNlciBjdXJyZW50bHkgdXNlZCBieSB0aGUgc3RvcmUgdG8gY2FsY3VsYXRlIHRoZSBzdGF0ZS5cbiAgICpcbiAgICogWW91IG1pZ2h0IG5lZWQgdGhpcyBpZiB5b3VyIGFwcCBpbXBsZW1lbnRzIGNvZGUgc3BsaXR0aW5nIGFuZCB5b3Ugd2FudCB0b1xuICAgKiBsb2FkIHNvbWUgb2YgdGhlIHJlZHVjZXJzIGR5bmFtaWNhbGx5LiBZb3UgbWlnaHQgYWxzbyBuZWVkIHRoaXMgaWYgeW91XG4gICAqIGltcGxlbWVudCBhIGhvdCByZWxvYWRpbmcgbWVjaGFuaXNtIGZvciBSZWR1eC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV4dFJlZHVjZXIgVGhlIHJlZHVjZXIgZm9yIHRoZSBzdG9yZSB0byB1c2UgaW5zdGVhZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmdW5jdGlvbiByZXBsYWNlUmVkdWNlcihuZXh0UmVkdWNlcikge1xuICAgIGlmICh0eXBlb2YgbmV4dFJlZHVjZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdGhlIG5leHRSZWR1Y2VyIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgY3VycmVudFJlZHVjZXIgPSBuZXh0UmVkdWNlcjtcbiAgICBkaXNwYXRjaCh7IHR5cGU6IEFjdGlvblR5cGVzLlJFUExBQ0UgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJvcGVyYWJpbGl0eSBwb2ludCBmb3Igb2JzZXJ2YWJsZS9yZWFjdGl2ZSBsaWJyYXJpZXMuXG4gICAqIEByZXR1cm5zIHtvYnNlcnZhYmxlfSBBIG1pbmltYWwgb2JzZXJ2YWJsZSBvZiBzdGF0ZSBjaGFuZ2VzLlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBvYnNlcnZhYmxlIHByb3Bvc2FsOlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYnNlcnZhYmxlXG4gICAqL1xuICBmdW5jdGlvbiBvYnNlcnZhYmxlKCkge1xuICAgIHZhciBfcmVmO1xuXG4gICAgdmFyIG91dGVyU3Vic2NyaWJlID0gc3Vic2NyaWJlO1xuICAgIHJldHVybiBfcmVmID0ge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbWluaW1hbCBvYnNlcnZhYmxlIHN1YnNjcmlwdGlvbiBtZXRob2QuXG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JzZXJ2ZXIgQW55IG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuIG9ic2VydmVyLlxuICAgICAgICogVGhlIG9ic2VydmVyIG9iamVjdCBzaG91bGQgaGF2ZSBhIGBuZXh0YCBtZXRob2QuXG4gICAgICAgKiBAcmV0dXJucyB7c3Vic2NyaXB0aW9ufSBBbiBvYmplY3Qgd2l0aCBhbiBgdW5zdWJzY3JpYmVgIG1ldGhvZCB0aGF0IGNhblxuICAgICAgICogYmUgdXNlZCB0byB1bnN1YnNjcmliZSB0aGUgb2JzZXJ2YWJsZSBmcm9tIHRoZSBzdG9yZSwgYW5kIHByZXZlbnQgZnVydGhlclxuICAgICAgICogZW1pc3Npb24gb2YgdmFsdWVzIGZyb20gdGhlIG9ic2VydmFibGUuXG4gICAgICAgKi9cbiAgICAgIHN1YnNjcmliZTogZnVuY3Rpb24gc3Vic2NyaWJlKG9ic2VydmVyKSB7XG4gICAgICAgIGlmICgodHlwZW9mIG9ic2VydmVyID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihvYnNlcnZlcikpICE9PSAnb2JqZWN0JyB8fCBvYnNlcnZlciA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIHRoZSBvYnNlcnZlciB0byBiZSBhbiBvYmplY3QuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBvYnNlcnZlU3RhdGUoKSB7XG4gICAgICAgICAgaWYgKG9ic2VydmVyLm5leHQpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZVN0YXRlKCk7XG4gICAgICAgIHZhciB1bnN1YnNjcmliZSA9IG91dGVyU3Vic2NyaWJlKG9ic2VydmVTdGF0ZSk7XG4gICAgICAgIHJldHVybiB7IHVuc3Vic2NyaWJlOiB1bnN1YnNjcmliZSB9O1xuICAgICAgfVxuICAgIH0sIF9yZWZbcmVzdWx0XSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sIF9yZWY7XG4gIH1cblxuICAvLyBXaGVuIGEgc3RvcmUgaXMgY3JlYXRlZCwgYW4gXCJJTklUXCIgYWN0aW9uIGlzIGRpc3BhdGNoZWQgc28gdGhhdCBldmVyeVxuICAvLyByZWR1Y2VyIHJldHVybnMgdGhlaXIgaW5pdGlhbCBzdGF0ZS4gVGhpcyBlZmZlY3RpdmVseSBwb3B1bGF0ZXNcbiAgLy8gdGhlIGluaXRpYWwgc3RhdGUgdHJlZS5cbiAgZGlzcGF0Y2goeyB0eXBlOiBBY3Rpb25UeXBlcy5JTklUIH0pO1xuXG4gIHJldHVybiBfcmVmMiA9IHtcbiAgICBkaXNwYXRjaDogZGlzcGF0Y2gsXG4gICAgc3Vic2NyaWJlOiBzdWJzY3JpYmUsXG4gICAgZ2V0U3RhdGU6IGdldFN0YXRlLFxuICAgIHJlcGxhY2VSZWR1Y2VyOiByZXBsYWNlUmVkdWNlclxuICB9LCBfcmVmMltyZXN1bHRdID0gb2JzZXJ2YWJsZSwgX3JlZjI7XG59XG5cbi8qKlxuICogQGNsYXNzIE1vZHVsZU1hbmFnZXJcbiAqIEBjYXRlZ29yeSBjb3JlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IGhhbmRsZXJcbiAqIEBkZXNjcmlwdGlvbiAgU29sdmVzIG1vZHVsZXMgZGVwZW5kZW5jaWVzXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmVcbiAqL1xuXG52YXIgTW9kdWxlTWFuYWdlciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE1vZHVsZU1hbmFnZXIob2JqZWN0KSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgTW9kdWxlTWFuYWdlcik7XG5cbiAgICB0aGlzLmhhbmRsZXIgPSBvYmplY3Q7XG4gICAgdGhpcy5jdXJyZW50TW9kdWxlID0gbnVsbDtcbiAgICB0aGlzLnN0b3JlID0gY3JlYXRlU3RvcmUoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0YXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbe30sICcnXTtcbiAgICAgIHZhciBhY3Rpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgICAgIHN0YXRlWzBdW2FjdGlvbi5rZXldID0gYWN0aW9uLmRhdGE7XG4gICAgICBzdGF0ZVsxXSA9IGFjdGlvbi5rZXk7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfSk7XG4gICAgdGhpcy5tb2R1bGVzID0ge307XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgYWN0aXZlXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyAuY3VycmVudE1vZHVsZSB0byBwcm92aWRlZCBtb2R1bGUuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBtb2R1bGUgdGhlIG1vZHVsZSB0byBtYWtlIGN1cnJlbnRcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhNb2R1bGVNYW5hZ2VyLCBbe1xuICAgIGtleTogXCJhY3RpdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWN0aXZlKG1vZHVsZSkge1xuICAgICAgdGhpcy5jdXJyZW50TW9kdWxlID0gbW9kdWxlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHJlc2V0XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIFNldCdzIC5jdXJyZW50TW9kdWxlIHRvIG51bGwuXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInJlc2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgdGhpcy5jdXJyZW50TW9kdWxlID0gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBkZWZpbmVcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gRGVmaW5lIHRoZSBtb2R1bGUgaW4gbWFuYWdlclxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBtb2R1bGUgbmFtZVxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVNYW5hZ2VyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkZWZpbmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVmaW5lKG5hbWUpIHtcbiAgICAgIHRoaXMubW9kdWxlc1tuYW1lXSA9IHRoaXMuY3VycmVudE1vZHVsZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCB1c2VcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IHRoZSBkZWZpbmVkIG1vZHVsZSBmcm9tIG1hbmFnZXJcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbW9kdWxlIG5hbWVcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlTWFuYWdlclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwidXNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVzZShuYW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5tb2R1bGVzW25hbWVdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHNldFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBBbiBhbGlhcyBmb3IgLmFkZCgpIDxici8+PGJyLz5cbiAgICAgKiBVc2UgdGhpcyBtZXRob2QgaWYgeW91IGtub3cgdGhhdCB5b3Ugd2lsbCBvdmVyd3JpdGUgZXhpc3RpbmcgZGVwZW5kZW5jeS48YnIvPlxuICAgICAqIFVzZSBpdCBpbiB5b3VyIGFwcCwgYnV0IG5vdCBpbiBtb2R1bGUgdGhhdCB5b3UgcHJvdmlkZSB0byBvdGhlciBwZW9wbGUuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGtleSB0aGUga2V5IG9mIHRoZSBkZXBlbmRlbmN5XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgdGhlIHZhbHVlIG9mIHRoZSBkZXBlbmRlbmN5XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQoa2V5LCBkYXRhKSB7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogJ0FERCcsXG4gICAgICAgIGtleToga2V5LFxuICAgICAgICBkYXRhOiBkYXRhXG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBnZXRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyBkZXBlbmRlbmN5IGluIHN0b3JlIG9iamVjdCwgYnkga2V5LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhlIGtleSBvZiB0aGUgZGVwZW5kZW5jeVxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVNYW5hZ2VyXG4gICAgICogQHJldHVybiB7T2JqZWN0fE1vZHVsZX1cbiAgICAgKiBAdGhyb3dzIHtEZXBlbmRlbmN5RXJyb3J9IGlmIGRlcGVuZGVuY3kgaXMgbm90IGluIHRoZSBzdG9yZVxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPkdldCB0aGUgJ2hlbGxvJyBkZXBlbmRlbmN5PC9jYXB0aW9uPlxuICAgICAqIG1hbmFnZXIuZ2V0KCdoZWxsbycpOyAvLyAtPiB7d29ybGQ6IHRydWV9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgaWYgKCF0aGlzLnN0b3JlLmdldFN0YXRlKClbMF1ba2V5XSkge1xuICAgICAgICB0aHJvdyBuZXcgRGVwZW5kZW5jeUVycm9yKCdNb2R1bGVNYW5hZ2VyJywgXCJNb2R1bGUgcmVxdWlyZXMgJ1wiLmNvbmNhdChrZXksIFwiJyBkZXBlbmRlbmN5XCIpLCB0aGlzLmN1cnJlbnRNb2R1bGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRTdGF0ZSgpWzBdW2tleV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgaGFzXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgd2hldGhlciBtYW5hZ2VyIGhhcyBhIGRlcGVuZGVuY3kgd2l0aCB0aGUgZ2l2ZW4ga2V5XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGtleSB0aGUga2V5IG9mIHRoZSBkZXBlbmRlbmN5XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXJcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiBhbGwgcHJvbWlzZXMgY29tcGxldGVkLlxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPkNoZWNrIHdoZXRoZXIgdGhlIHN0b3JlIGhhcyB0aGUgJ2hlbGxvJyBkZXBlbmRlbmN5PC9jYXB0aW9uPlxuICAgICAqIG1hbmFnZXIuaGFzKCdoZWxsbycpOyAvLyAtPiB0cnVlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJoYXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5zdG9yZS5nZXRTdGF0ZSgpWzBdW2tleV0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHVwZGF0ZVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGRlcHNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW2RlcHNNYXA9e31dXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGUoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgZGVwc01hcCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICB0aGlzLnN0b3JlLnN1YnNjcmliZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyRzdG9yZSRnZXRTdGF0ZSA9IF90aGlzLnN0b3JlLmdldFN0YXRlKCksXG4gICAgICAgICAgICBfdGhpcyRzdG9yZSRnZXRTdGF0ZTIgPSBzbGljZWRUb0FycmF5KF90aGlzJHN0b3JlJGdldFN0YXRlLCAyKSxcbiAgICAgICAgICAgIGRhdGEgPSBfdGhpcyRzdG9yZSRnZXRTdGF0ZTJbMF0sXG4gICAgICAgICAgICBjaGFuZ2VkS2V5ID0gX3RoaXMkc3RvcmUkZ2V0U3RhdGUyWzFdO1xuXG4gICAgICAgIHZhciBjYWxsYmFjayA9IGRlcHNNYXBbY2hhbmdlZEtleV07XG4gICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soZGF0YVtjaGFuZ2VkS2V5XSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBhZGRcbiAgICAgKiBAYWxpYXMgbW9kdWxlOmNvcmUuTW9kdWxlTWFuYWdlciNzZXRcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlTWFuYWdlclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZCgpIHtcbiAgICAgIGNvbnNvbGUud2FybignLmFkZCgpIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBVc2UgLnNldCgpIGluc3RlYWQnKTtcbiAgICAgIHJldHVybiB0aGlzLnNldC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHJlcXVpcmVcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gUmVxdWlyZSBtb2R1bGVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBEZWZpbmVkIG5hbWVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtb2R1bGVFeGVjdXRvciBGdW5jdGlvbiB0aGF0IHJldHVybnMgYXBwbGllZCBtb2R1bGVcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlTWFuYWdlclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVxdWlyZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXF1aXJlKG5hbWUsIG1vZHVsZUV4ZWN1dG9yKSB7XG4gICAgICBpZiAodGhpcy51c2UobmFtZSkgPT09IHVuZGVmaW5lZCkgdGhpcy5oYW5kbGVyLmFwcGx5TW9kdWxlKG1vZHVsZUV4ZWN1dG9yKCkpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBNb2R1bGVNYW5hZ2VyO1xufSgpO1xuXG4vKipcbiAqIEBjbGFzcyBDb21wb25lbnRcbiAqIEBjYXRlZ29yeSBjb3JlXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1ldGVycyBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW2luc3RydWN0aW9uc10gLSBUaGUgaW5zdHJ1Y3Rpb25zIG9iamVjdC5cbiAqIEBleHRlbmRzIE1vZHVsZVN5c3RlbVxuICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlXG4gKi9cblxudmFyIENvbXBvbmVudCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX01vZHVsZVN5c3RlbSkge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29yZS5Db21wb25lbnQjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCB7XG4gICAqICAgbW9kdWxlczogW10sXG4gICAqICAgbWFuYWdlcjogdHJ1ZVxuICAgKiB9XG4gICAqL1xuXG4gIC8qKlxuICAgKiBTdGF0aWMgaW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvcmUuQ29tcG9uZW50I2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IHt9XG4gICAqL1xuXG4gIC8qKlxuICAgKiBBcnJheSBvZiBwcm9taXNlcyB0aGF0IHNob3VsZCBiZSByZXNvbHZlZCBiZWZvcmUgQ29tcG9uZW50IGlzIHJlYWR5LlxuICAgKiBAbWVtYmVyIHtBcnJheX0gbW9kdWxlOmNvcmUuQ29tcG9uZW50I193YWl0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICAvLyBDb2xsZWN0aW9uIG9mIHByb21pc2VzO1xuXG4gIC8qKlxuICAgKiBDb2xsZWN0aW9uIG9mIGBtb2R1bGVzYC5cbiAgICogQG1lbWJlciB7QXJyYXl9IG1vZHVsZTpjb3JlLkNvbXBvbmVudCNtb2R1bGVzXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIC8vIENvbGxlY3Rpb24gb2YgbW9kdWxlcztcblxuICAvKipcbiAgICogQ29sbGVjdGlvbiBvZiBgY2hpbGRgIENvbXBvbmVudHMuXG4gICAqIEBtZW1iZXIge0FycmF5fSBtb2R1bGU6Y29yZS5Db21wb25lbnQjY2hpbGRyZW5cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgLy8gRm9yIGtlZXBpbmcgY2hpbGRyZW4gY29tcG9uZW50cztcbiAgZnVuY3Rpb24gQ29tcG9uZW50KCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIHZhciBkZWZhdWx0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogQ29tcG9uZW50LmRlZmF1bHRzO1xuICAgIHZhciBpbnN0cnVjdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IENvbXBvbmVudC5pbnN0cnVjdGlvbnM7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDb21wb25lbnQpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoQ29tcG9uZW50KS5jYWxsKHRoaXMpKTsgLy8gQXBwbHkgcG9seWZpbGxlZCBwYXJhbWV0ZXJzIHRvIC5wYXJhbXM7XG5cbiAgICBkZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSksIFwiX3dhaXRcIiwgW10pLCBcIm1vZHVsZXNcIiwgW10pLCBcImNoaWxkcmVuXCIsIFtdKTtcblxuICAgIF90aGlzLnBhcmFtcyA9IGV4dGVuZCh0cmFuc2Zvcm1EYXRhKHBhcmFtcywgaW5zdHJ1Y3Rpb25zKSwgZGVmYXVsdHMpO1xuICAgIGlmIChfdGhpcy5wYXJhbXMubWFuYWdlcikgX3RoaXMubWFuYWdlciA9IG5ldyBNb2R1bGVNYW5hZ2VyKGFzc2VydFRoaXNJbml0aWFsaXplZChhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKSk7XG4gICAgX3RoaXMubW9kdWxlcyA9IF90aGlzLnBhcmFtcy5tb2R1bGVzO1xuXG4gICAgX3RoaXMuaW50ZWdyYXRlTW9kdWxlcygpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIHdhaXRcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBXYWl0IGZvciBhIHByb21pc2UuXG4gICAqIEBwYXJhbSB7UHJvbWlzZX0gW3Byb21pc2VdIC0gVGhlIHByb21pc2UgdGhhdCBzaG91bGQgYmUgYWRkZWQgdG8gYSBxdWV1ZS5cbiAgICogQHJldHVybiB7UHJvbWlzZX0gUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gYWxsIHByb21pc2VzIGNvbXBsZXRlZC5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkNvbXBvbmVudFxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKENvbXBvbmVudCwgW3tcbiAgICBrZXk6IFwid2FpdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB3YWl0KHByb21pc2UpIHtcbiAgICAgIGlmIChwcm9taXNlKSB0aGlzLl93YWl0LnB1c2gocHJvbWlzZSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwodGhpcy5fd2FpdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgZGVmZXJcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZSBgZnVuY2AgKENhbGxiYWNrKSB3aGVuIENvbXBvbmVudCBpcyByZWFkeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIC0gQ2FsbGJhY2suXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkNvbXBvbmVudFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVmZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVmZXIoZnVuYykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLmlzRGVmZmVyZWQpIHRoaXMud2FpdCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZnVuYyhfdGhpczIpO1xuICAgICAgfSk7ZWxzZSBmdW5jKHRoaXMpO1xuICAgIH0gLy8gUEFSQU1FVEVSU1xuXG4gICAgLyoqXG4gICAgICogQG1ldGhvZCB1cGRhdGVQYXJhbXNcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBwYXJhbWV0ZXJzIG9mIHRoZSBDb21wb25lbnQuXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBQYXJhbXMgb2YgdGhpcyBDb21wb25lbnRcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ29tcG9uZW50XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVQYXJhbXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlUGFyYW1zKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICB0aGlzLnBhcmFtcyA9IGV4dGVuZChwYXJhbXMsIHRoaXMucGFyYW1zKTtcbiAgICAgIHJldHVybiB0aGlzLnBhcmFtcztcbiAgICB9IC8vIENPUFlJTkcgJiBDTE9OSU5HXG5cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGNsb25lXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIENsb25lIHRoaXMgY29tcG9uZW50XG4gICAgICogQHJldHVybiB7b2JqZWN0fSBhIGNsb25lZCBjb21wb25lbnQgd2l0aCBhbGwgaXRzIHNvdXJjZSBjb21wb25lbnQnIHBhcmFtcyBjb3BpZWQuXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkNvbXBvbmVudFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiY2xvbmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xvbmUoKSB7XG4gICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5wYXJhbXMpLmNvcHkodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgY29weVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBDb3B5IHNvdXJjZSBuYXRpdmUgYW5kIGludGVncmF0ZSBgbW9kdWxlc2AgdG8gaXQuXG4gICAgICogQHBhcmFtIHtDb21wb25lbnR9IHNvdXJjZSAtIFNvdXJjZSBjb21wb25lbnQgdGhhdCBpcyB1c2VkIGZvciBgY29weSgpYCBhY3Rpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZV0gLSBDYWxsYmFjayBleGVjdXRlZCBiZWZvcmUgbW9kdWxlcyBpbnRlZ3JhdGlvbiBwcm9jZXNzLlxuICAgICAqIEByZXR1cm4ge3RoaXN9IENvbXBvbmVudFxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Db21wb25lbnRcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImNvcHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29weShzb3VyY2UsIGN1c3RvbWl6ZSkge1xuICAgICAgdGhpcy5wYXJhbXMgPSBvYmplY3RTcHJlYWQoe30sIHNvdXJjZS5wYXJhbXMpO1xuICAgICAgaWYgKHNvdXJjZS5uYXRpdmUpIHRoaXMubmF0aXZlID0gc291cmNlLm5hdGl2ZS5jbG9uZShzb3VyY2UucGFyYW1zKTtcbiAgICAgIGlmIChjdXN0b21pemUpIGN1c3RvbWl6ZSgpO1xuICAgICAgdGhpcy5pbnRlZ3JhdGVNb2R1bGVzKHNvdXJjZSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBhZGRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gQWRkIGEgY2hpbGQgYENvbXBvbmVudGAuXG4gICAgICogQHBhcmFtIHtDb21wb25lbnR9IG9iamVjdCAtIENvbXBvbmVudCB0aGF0IHNob3VsZCBiZSBhZGRlZCBhcyBhIGBjaGlsZGAuXG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gUmVzb2x2ZWQgd2hlbiBhY3Rpb24gaXMgZG9uZS5cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ29tcG9uZW50XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJhZGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9hZGQgPSBhc3luY1RvR2VuZXJhdG9yKFxuICAgICAgLyojX19QVVJFX18qL1xuICAgICAgcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdC5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5wYXJlbnQucmVtb3ZlKG9iamVjdCk7XG5cbiAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1O1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLndhaXQoKTtcblxuICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdC53YWl0KCk7XG5cbiAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgIGlmIChvYmplY3QubmF0aXZlKSB7XG4gICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gOTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb21wb3NpdGlvbkVycm9yJDEoJ0NvbXBvbmVudCcsICd0aGVyZSBpcyBubyBvYmplY3QubmF0aXZlJywgdGhpcyk7XG5cbiAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgIG9iamVjdC5wYXJlbnQgPSB0aGlzO1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMjtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgICAgICAgICAgICBvbkFkZDogb2JqZWN0XG4gICAgICAgICAgICAgICAgfSkub25BZGQ7XG5cbiAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZS5hZGQob2JqZWN0Lm5hdGl2ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKG9iamVjdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCBvYmplY3QpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZSwgdGhpcyk7XG4gICAgICB9KSk7XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbiBhZGQoX3gpIHtcbiAgICAgICAgcmV0dXJuIF9hZGQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfSgpXG4gICAgLyoqXG4gICAgICogQG1ldGhvZCByZW1vdmVcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gUmVtb3ZlIGEgY2hpbGQgYENvbXBvbmVudGAuXG4gICAgICogQHBhcmFtIHtDb21wb25lbnR9IG9iamVjdCAtIENvbXBvbmVudCB0aGF0IHNob3VsZCBiZSBhICoqY2hpbGQqKiBvZiB0aGlzIENvbXBvbmVudC5cbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlZCB3aGVuIGFjdGlvbiBpcyBkb25lLlxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Db21wb25lbnRcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3JlbW92ZSA9IGFzeW5jVG9HZW5lcmF0b3IoXG4gICAgICAvKiNfX1BVUkVfXyovXG4gICAgICByZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgaWYgKCEob2JqZWN0LnBhcmVudCAhPT0gdGhpcykpIHtcbiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KFwicmV0dXJuXCIpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud2FpdCgpO1xuXG4gICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDY7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdC53YWl0KCk7XG5cbiAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgIG9iamVjdC5wYXJlbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlLnJlbW92ZShvYmplY3QubmF0aXZlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZSh0aGlzLmNoaWxkcmVuLmluZGV4T2Yob2JqZWN0KSwgMSk7XG5cbiAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlMiwgdGhpcyk7XG4gICAgICB9KSk7XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbiByZW1vdmUoX3gyKSB7XG4gICAgICAgIHJldHVybiBfcmVtb3ZlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIH0oKVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgYWRkVG9cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gQWRkcyBgdGhpc2AgQ29tcG9uZW50IHRvIHNwZWNpZmllZCBgQXBwYC9gQ29tcG9uZW50YC5cbiAgICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gb2JqZWN0IC0gQ29tcG9uZW50IHRoYXQgd2lsbCBiZSBhIHBhcmVudCBvZiBgdGhpc2AuXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkNvbXBvbmVudFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkVG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkVG8ob2JqZWN0KSB7XG4gICAgICByZXR1cm4gb2JqZWN0LmFkZCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuZ2V0KGtleSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVzZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1c2Uoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLnVzZShrZXkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG9iamVjdCBpcyBgYXN5bmNgIChgd2FpdGAgcHJvbWlzZXMgYXJlIG1vcmUgdGhhbiBgMGApLlxuICAgICAqIEBtZW1iZXIge0Jvb2xlYW59IG1vZHVsZTpjb3JlLkNvbXBvbmVudCNpc0RlZmZlcmVkXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpc0RlZmZlcmVkXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd2FpdC5sZW5ndGggPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBgTW9kdWxlTWFuYWdlcmAgdXNlZCBmb3IgdGhpcyBjb21wb25lbnQuXG4gICAgICogQG1lbWJlciB7TW9kdWxlTWFuYWdlcn0gbW9kdWxlOmNvcmUuQ29tcG9uZW50I21hbmFnZXJcbiAgICAgKiBAdGhyb3dzIHtNYW5hZ2VyRXJyb3J9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJtYW5hZ2VyXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAodGhpcy5fbWFuYWdlcikgcmV0dXJuIHRoaXMuX21hbmFnZXI7XG4gICAgICB0aHJvdyBuZXcgTWFuYWdlckVycm9yKCdDb21wb25lbnQnLCBcIk1vZHVsZU1hbmFnZXIgaXMgbm90IHVzZWQgaW4gdGhpcyBjb21wb25lbnQuICdtYW5hZ2VyJyBwYXJhbWV0ZXIgc2hvdWxkIGJlIHNldCBhcyAndHJ1ZSdcIiwgdGhpcyk7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChtYW5hZ2VyKSB7XG4gICAgICB0aGlzLl9tYW5hZ2VyID0gbWFuYWdlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYG5hdGl2ZWAgb2JqZWN0IHVzZWQgZm9yIHRoaXMgY29tcG9uZW50LlxuICAgICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvcmUuQ29tcG9uZW50I25hdGl2ZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibmF0aXZlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbmF0aXZlO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQobWVzaCkge1xuICAgICAgdGhpcy5fbmF0aXZlID0gbWVzaDtcbiAgICAgIHRoaXMuX25hdGl2ZS5jb21wb25lbnQgPSB0aGlzO1xuICAgICAgcmV0dXJuIHRoaXMuX25hdGl2ZTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhDb21wb25lbnQsIF9Nb2R1bGVTeXN0ZW0pO1xuXG4gIHJldHVybiBDb21wb25lbnQ7XG59KE1vZHVsZVN5c3RlbSk7XG5cbmRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhDb21wb25lbnQsIFwiZGVmYXVsdHNcIiwge1xuICBtb2R1bGVzOiBudWxsLFxuICBtYW5hZ2VyOiB0cnVlXG59KSwgXCJpbnN0cnVjdGlvbnNcIiwge30pO1xuXG4vLyAyNi4xLjYgUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSBbLCByZWNlaXZlcl0pXG5cblxuXG5cblxuXG5cbmZ1bmN0aW9uIGdldCh0YXJnZXQsIHByb3BlcnR5S2V5IC8qICwgcmVjZWl2ZXIgKi8pIHtcbiAgdmFyIHJlY2VpdmVyID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB0YXJnZXQgOiBhcmd1bWVudHNbMl07XG4gIHZhciBkZXNjLCBwcm90bztcbiAgaWYgKF9hbk9iamVjdCh0YXJnZXQpID09PSByZWNlaXZlcikgcmV0dXJuIHRhcmdldFtwcm9wZXJ0eUtleV07XG4gIGlmIChkZXNjID0gX29iamVjdEdvcGQuZih0YXJnZXQsIHByb3BlcnR5S2V5KSkgcmV0dXJuIF9oYXMoZGVzYywgJ3ZhbHVlJylcbiAgICA/IGRlc2MudmFsdWVcbiAgICA6IGRlc2MuZ2V0ICE9PSB1bmRlZmluZWRcbiAgICAgID8gZGVzYy5nZXQuY2FsbChyZWNlaXZlcilcbiAgICAgIDogdW5kZWZpbmVkO1xuICBpZiAoX2lzT2JqZWN0KHByb3RvID0gX29iamVjdEdwbyh0YXJnZXQpKSkgcmV0dXJuIGdldChwcm90bywgcHJvcGVydHlLZXksIHJlY2VpdmVyKTtcbn1cblxuX2V4cG9ydChfZXhwb3J0LlMsICdSZWZsZWN0JywgeyBnZXQ6IGdldCB9KTtcblxudmFyIGdldCQxID0gX2NvcmUuUmVmbGVjdC5nZXQ7XG5cbnZhciBnZXQkMiA9IGdldCQxO1xuXG5mdW5jdGlvbiBfc3VwZXJQcm9wQmFzZShvYmplY3QsIHByb3BlcnR5KSB7XG4gIHdoaWxlICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpKSB7XG4gICAgb2JqZWN0ID0gZ2V0UHJvdG90eXBlT2YkMihvYmplY3QpO1xuICAgIGlmIChvYmplY3QgPT09IG51bGwpIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIG9iamVjdDtcbn1cblxudmFyIHN1cGVyUHJvcEJhc2UgPSBfc3VwZXJQcm9wQmFzZTtcblxudmFyIGdldCQzID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuZnVuY3Rpb24gX2dldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlcikge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2V0JDIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF9nZXQgPSBnZXQkMjtcbiAgfSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF9nZXQgPSBmdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gICAgICB2YXIgYmFzZSA9IHN1cGVyUHJvcEJhc2UodGFyZ2V0LCBwcm9wZXJ0eSk7XG4gICAgICBpZiAoIWJhc2UpIHJldHVybjtcblxuICAgICAgdmFyIGRlc2MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IkMShiYXNlLCBwcm9wZXJ0eSk7XG5cbiAgICAgIGlmIChkZXNjLmdldCkge1xuICAgICAgICByZXR1cm4gZGVzYy5nZXQuY2FsbChyZWNlaXZlcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZXNjLnZhbHVlO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX2dldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlciB8fCB0YXJnZXQpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9nZXQ7XG59KTtcblxuZnVuY3Rpb24gYXR0cmlidXRlcygpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1hcHBlcnMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgbWFwcGVyc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbWFwcGVyID0gbWFwcGVyc1tpXTtcblxuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBtYXBwZXIubWFwLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHZhciBhdHRyaWJ1dGUgPSBtYXBwZXIubWFwW2tdO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LnByb3RvdHlwZSwgYXR0cmlidXRlLCB7XG4gICAgICAgICAgZ2V0OiBtYXBwZXIuZ2V0dGVyKGF0dHJpYnV0ZSksXG4gICAgICAgICAgc2V0OiBtYXBwZXIuc2V0dGVyKGF0dHJpYnV0ZSksXG4gICAgICAgICAgY29uZmlndXJhYmxlOiBtYXBwZXIuY29uZmlndXJhYmxlLFxuICAgICAgICAgIGVudW1lcmFibGU6IG1hcHBlci5lbnVtZXJhYmxlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIGNvcHkoKSB7XG4gIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgbWFwID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgbWFwW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1hcDogbWFwLFxuICAgIGdldHRlcjogZnVuY3Rpb24gZ2V0dGVyKG5hbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZVtuYW1lXTtcbiAgICAgIH07XG4gICAgfSxcbiAgICBzZXR0ZXI6IGZ1bmN0aW9uIHNldHRlcihuYW1lKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMubmF0aXZlW25hbWVdLmNvcHkodmFsdWUpO1xuICAgICAgfTtcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlXG4gIH07XG59XG5mdW5jdGlvbiBtaXJyb3IoKSB7XG4gIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgbWFwID0gbmV3IEFycmF5KF9sZW4zKSwgX2tleTMgPSAwOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG4gICAgbWFwW19rZXkzXSA9IGFyZ3VtZW50c1tfa2V5M107XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1hcDogbWFwLFxuICAgIGdldHRlcjogZnVuY3Rpb24gZ2V0dGVyKG5hbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZVtuYW1lXTtcbiAgICAgIH07XG4gICAgfSxcbiAgICBzZXR0ZXI6IGZ1bmN0aW9uIHNldHRlcihuYW1lKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMubmF0aXZlW25hbWVdID0gdmFsdWU7XG4gICAgICB9O1xuICAgIH0sXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWVcbiAgfTtcbn1cblxudmFyIF9kZWMsIF9jbGFzcztcbnZhciBcbi8qKlxuICogQGNsYXNzIE1lc2hDb21wb25lbnRcbiAqIEBjYXRlZ29yeSBjb3JlXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1ldGVycyBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW2luc3RydWN0aW9uc10gLSBUaGUgaW5zdHJ1Y3Rpb25zIG9iamVjdC5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLkNvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlXG4gKi9cbk1lc2hDb21wb25lbnQgPSAoX2RlYyA9IGF0dHJpYnV0ZXMoY29weSgncG9zaXRpb24nLCAncm90YXRpb24nLCAncXVhdGVybmlvbicsICdzY2FsZScpLCBtaXJyb3IoJ21hdGVyaWFsJywgJ2dlb21ldHJ5JykpLCBfZGVjKF9jbGFzcyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBjcmVhdGVDbGFzcyhNZXNoQ29tcG9uZW50LCBudWxsLCBbe1xuICAgIGtleTogXCJjdXN0b21cIixcblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50I2RlZmF1bHRzXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBkZWZhdWx0XG4gICAgICoge1xuICAgICAqICAgYnVpbGQ6IHRydWUsXG4gICAgICogICBnZW9tZXRyeToge30sXG4gICAgICogICBtYXRlcmlhbDogZmFsc2UsXG4gICAgICpcbiAgICAgKiAgIHNoYWRvdzoge1xuICAgICAqICAgICBjYXN0OiB0cnVlLFxuICAgICAqICAgICByZWNlaXZlOiB0cnVlXG4gICAgICogICB9LFxuICAgICAqXG4gICAgICogICBwb3NpdGlvbjoge3g6IDAsIHk6IDAsIHo6IDB9LFxuICAgICAqICAgcm90YXRpb246IHt4OiAwLCB5OiAwLCB6OiAwfSxcbiAgICAgKiAgIHNjYWxlOiB7eDogMSwgeTogMSwgejogMX1cbiAgICAgKiB9XG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBTdGF0aWMgaW5zdHJ1Y3Rpb25zXG4gICAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50I2luc3RydWN0aW9uc1xuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAZGVmYXVsdFxuICAgICAqIHtcbiAgICAgKiAgIHBvc2l0aW9uOiBbJ3gnLCAneScsICd6J10sXG4gICAgICogICByb3RhdGlvbjogWyd4JywgJ3knLCAneiddLFxuICAgICAqICAgc2NhbGU6IFsneCcsICd5JywgJ3onXVxuICAgICAqIH1cbiAgICAgKi9cbiAgICAvLyBDVVNUT00gR0VPTUVUUlkgSEFORExJTkdcbiAgICB2YWx1ZTogZnVuY3Rpb24gY3VzdG9tKGdlb20pIHtcbiAgICAgIHZhciBjb25zdHJ1Y3RvciA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogTWVzaDtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIC8qI19fUFVSRV9fKi9cbiAgICAgICAgZnVuY3Rpb24gKF9NZXNoQ29tcG9uZW50KSB7XG4gICAgICAgICAgZnVuY3Rpb24gX2NsYXNzMigpIHtcbiAgICAgICAgICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIF9jbGFzczIpO1xuXG4gICAgICAgICAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKF9jbGFzczIpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNyZWF0ZUNsYXNzKF9jbGFzczIsIFt7XG4gICAgICAgICAgICBrZXk6IFwiYnVpbGRcIixcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy5wYXJhbXM7XG5cbiAgICAgICAgICAgICAgdmFyIF90aGlzJGFwcGx5QnJpZGdlID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IGdlb20sXG4gICAgICAgICAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgIGdlb21ldHJ5ID0gX3RoaXMkYXBwbHlCcmlkZ2UuZ2VvbWV0cnksXG4gICAgICAgICAgICAgICAgICBtYXRlcmlhbCA9IF90aGlzJGFwcGx5QnJpZGdlLm1hdGVyaWFsO1xuXG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgICAgICAgICBtZXNoOiBuZXcgY29uc3RydWN0b3IoZ2VvbWV0cnksIG1hdGVyaWFsKVxuICAgICAgICAgICAgICB9KS5tZXNoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1dKTtcblxuICAgICAgICAgIGluaGVyaXRzKF9jbGFzczIsIF9NZXNoQ29tcG9uZW50KTtcblxuICAgICAgICAgIHJldHVybiBfY2xhc3MyO1xuICAgICAgICB9KE1lc2hDb21wb25lbnQpXG4gICAgICApO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjcmVhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlKGdlb20sIHBhcmFtcywgY29uc3RydWN0b3IpIHtcbiAgICAgIHJldHVybiBuZXcgKE1lc2hDb21wb25lbnQuY3VzdG9tKGdlb20sIGNvbnN0cnVjdG9yKSkocGFyYW1zKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZnJvbVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tKG1lc2gpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgICAgcGFyYW1zLmJ1aWxkID0gZmFsc2U7XG4gICAgICB2YXIgY29tcG9uZW50ID0gbmV3IE1lc2hDb21wb25lbnQocGFyYW1zKTtcbiAgICAgIGNvbXBvbmVudC5uYXRpdmUgPSBtZXNoO1xuICAgICAgY29tcG9uZW50LndyYXAoKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfVxuICB9XSk7XG5cbiAgZnVuY3Rpb24gTWVzaENvbXBvbmVudChwYXJhbXMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgZGVmYXVsdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IE1lc2hDb21wb25lbnQuZGVmYXVsdHM7XG4gICAgdmFyIGluc3RydWN0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnM7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBNZXNoQ29tcG9uZW50KTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKE1lc2hDb21wb25lbnQpLmNhbGwodGhpcywgcGFyYW1zLCBkZWZhdWx0cywgaW5zdHJ1Y3Rpb25zKSk7XG5cbiAgICBpZiAoX3RoaXMucGFyYW1zLmJ1aWxkKSB7XG4gICAgICB2YXIgYnVpbGQgPSBfdGhpcy5idWlsZChfdGhpcy5wYXJhbXMpO1xuXG4gICAgICBpZiAoIWJ1aWxkKSB7XG4gICAgICAgIHRocm93IG5ldyBDb21wb3NpdGlvbkVycm9yJDEoJ01lc2hDb21wb25lbnQnLCAnLmJ1aWxkKCkgbWV0aG9kIHNob3VsZCByZXR1cm4gYSBUSFJFRS5PYmplY3QzRCBvciBhIFByb21pc2UgcmVzb2x2ZWQgd2l0aCBUSFJFRS5PYmplY3QzRC4nLCBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYnVpbGQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIF90aGlzLndhaXQoYnVpbGQpO1xuXG4gICAgICAgIF90aGlzLndhaXQobmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICBidWlsZC50aGVuKGZ1bmN0aW9uIChuYXRpdmUpIHtcbiAgICAgICAgICAgIF90aGlzLm5hdGl2ZSA9IG5hdGl2ZTtcblxuICAgICAgICAgICAgX3RoaXMud3JhcCgpLnRoZW4ocmVzb2x2ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzLm5hdGl2ZSA9IGJ1aWxkO1xuXG4gICAgICAgIF90aGlzLndhaXQoX3RoaXMud3JhcCgpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfdGhpcy5hcHBseUNvbW1hbmQoJ3Bvc3RJbnRlZ3JhdGUnKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfSAvLyBCVUlMRElORyAmIFdSQVBQSU5HXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpdmVjeWNsZSBzaG91bGQgcmV0dXJuIGEgbmF0aXZlIG9iamVjdC5cbiAgICogQHRocm93cyB7Q29tcG9zaXRpb25FcnJvcn1cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhNZXNoQ29tcG9uZW50LCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHRocm93IG5ldyBDb21wb3NpdGlvbkVycm9yJDEoJ01lc2hDb21wb25lbnQnLCAnSW5zdGFuY2Ugc2hvdWxkIGhhdmUgaXRcXCdzIG93biAuYnVpbGQoKS4nLCB0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCB3cmFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIFdyYXBzIHRyYW5zZm9ybXMgKGBwb3NpdGlvbmAgJiBgcm90YXRpb25gKVxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9IFJlc29sdmVkIHdoZW4gYWN0aW9uIGlzIGNvbXBsZXRlZFxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ3cmFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHdyYXAoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIC8vIFRPRE86IEZpeCBkZWZlciB3aXRoIHBoeXNpY3NcbiAgICAgICAgLy8gdGhpcy5kZWZlcigoKSA9PiB7XG4gICAgICAgIHZhciBfdGhpczIkcGFyYW1zID0gX3RoaXMyLnBhcmFtcyxcbiAgICAgICAgICAgIHBvc2l0aW9uID0gX3RoaXMyJHBhcmFtcy5wb3NpdGlvbixcbiAgICAgICAgICAgIHJvdGF0aW9uID0gX3RoaXMyJHBhcmFtcy5yb3RhdGlvbixcbiAgICAgICAgICAgIHNjYWxlID0gX3RoaXMyJHBhcmFtcy5zY2FsZSxcbiAgICAgICAgICAgIHNoYWRvdyA9IF90aGlzMiRwYXJhbXMuc2hhZG93O1xuXG4gICAgICAgIF90aGlzMi5wb3NpdGlvbi5zZXQocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueik7XG5cbiAgICAgICAgX3RoaXMyLnJvdGF0aW9uLnNldChyb3RhdGlvbi54LCByb3RhdGlvbi55LCByb3RhdGlvbi56KTtcblxuICAgICAgICBfdGhpczIuc2NhbGUuc2V0KHNjYWxlLngsIHNjYWxlLnksIHNjYWxlLnopO1xuXG4gICAgICAgIF90aGlzMi5uYXRpdmUuY2FzdFNoYWRvdyA9IHNoYWRvdy5jYXN0O1xuICAgICAgICBfdGhpczIubmF0aXZlLnJlY2VpdmVTaGFkb3cgPSBzaGFkb3cucmVjZWl2ZTtcblxuICAgICAgICBfdGhpczIuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICAgIG9uV3JhcDogMVxuICAgICAgICB9KTtcblxuICAgICAgICByZXNvbHZlKF90aGlzMik7IC8vIH0pO1xuICAgICAgfSk7XG4gICAgfSAvLyBDT1BZSU5HICYgQ0xPTklOR1xuXG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBjb3B5XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIENvcHkgc291cmNlIHRyYW5zZm9ybXMgJiBleGVjdXRlIGBDb21wb25lbnQuY29weSgpYFxuICAgICAqIEByZXR1cm4ge3RoaXN9IE1lc2hDb21wb25lbnRcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiY29weVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb3B5JCQxKHNvdXJjZSkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHJldHVybiBnZXQkMyhnZXRQcm90b3R5cGVPZiQyKE1lc2hDb21wb25lbnQucHJvdG90eXBlKSwgXCJjb3B5XCIsIHRoaXMpLmNhbGwodGhpcywgc291cmNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMy5wb3NpdGlvbi5jb3B5KHNvdXJjZS5wb3NpdGlvbik7XG5cbiAgICAgICAgX3RoaXMzLnJvdGF0aW9uLmNvcHkoc291cmNlLnJvdGF0aW9uKTtcblxuICAgICAgICBfdGhpczMucXVhdGVybmlvbi5jb3B5KHNvdXJjZS5xdWF0ZXJuaW9uKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGNsb25lXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIE1ha2UgYSBjbG9uZSBvZiB0aGlzIE1lc2hDb21wb25lbnQgdXNpbmcgYC5jb3B5KClgXG4gICAgICogQHJldHVybiB7TWVzaENvbXBvbmVudH0gY2xvbmUgb2YgdGhpcyBvYmplY3RcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiY2xvbmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xvbmUoZ2VvbWV0cnksIG1hdGVyaWFsKSB7XG4gICAgICB2YXIgZGVzdCA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKHtcbiAgICAgICAgYnVpbGQ6IGZhbHNlXG4gICAgICB9KS5jb3B5KHRoaXMpO1xuICAgICAgaWYgKGdlb21ldHJ5KSBkZXN0Lmdlb21ldHJ5ID0gZGVzdC5nZW9tZXRyeS5jbG9uZSgpO1xuICAgICAgaWYgKG1hdGVyaWFsKSBkZXN0Lm1hdGVyaWFsID0gZGVzdC5tYXRlcmlhbC5jbG9uZSgpO1xuICAgICAgcmV0dXJuIGRlc3Q7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoTWVzaENvbXBvbmVudCwgX0NvbXBvbmVudCk7XG5cbiAgcmV0dXJuIE1lc2hDb21wb25lbnQ7XG59KENvbXBvbmVudCkpIHx8IF9jbGFzcyk7XG5cbmRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhNZXNoQ29tcG9uZW50LCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGJ1aWxkOiB0cnVlLFxuICBnZW9tZXRyeToge30sXG4gIG1hdGVyaWFsOiBmYWxzZSxcbiAgc2hhZG93OiB7XG4gICAgY2FzdDogdHJ1ZSxcbiAgICByZWNlaXZlOiB0cnVlXG4gIH0sXG4gIHBvc2l0aW9uOiB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHo6IDBcbiAgfSxcbiAgcm90YXRpb246IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgejogMFxuICB9LFxuICBzY2FsZToge1xuICAgIHg6IDEsXG4gICAgeTogMSxcbiAgICB6OiAxXG4gIH1cbn0pKSwgXCJpbnN0cnVjdGlvbnNcIiwge1xuICBwb3NpdGlvbjogWyd4JywgJ3knLCAneiddLFxuICByb3RhdGlvbjogWyd4JywgJ3knLCAneiddLFxuICBzY2FsZTogWyd4JywgJ3knLCAneiddXG59KTtcblxudmFyIF9kZWMkMSwgX2NsYXNzJDE7XG52YXIgXG4vKipcbiAqIEBjbGFzcyBMaWdodENvbXBvbmVudFxuICogQGNhdGVnb3J5IGNvcmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbWV0ZXJzIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbaW5zdHJ1Y3Rpb25zXSAtIFRoZSBpbnN0cnVjdGlvbnMgb2JqZWN0LlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmVcbiAqL1xuTGlnaHRDb21wb25lbnQgPSAoX2RlYyQxID0gYXR0cmlidXRlcyhjb3B5KCdwb3NpdGlvbicsICdyb3RhdGlvbicsICdxdWF0ZXJuaW9uJywgJ3RhcmdldCcpKSwgX2RlYyQxKF9jbGFzcyQxID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIGNyZWF0ZUNsYXNzKExpZ2h0Q29tcG9uZW50LCBudWxsLCBbe1xuICAgIGtleTogXCJmcm9tXCIsXG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnQjZGVmYXVsdHNcbiAgICAgKiBAc3RhdGljXG4gICAgICogQGRlZmF1bHRcbiAgICAgKiB7XG4gICAgICogICBidWlsZDogdHJ1ZSxcbiAgICAgKlxuICAgICAqICAgc2hhZG93OiB7XG4gICAgICogICAgIGNhc3Q6IHRydWUsXG4gICAgICpcbiAgICAgKiAgICAgYmlhczogMCxcbiAgICAgKiAgICAgcmFkaXVzOiAxLFxuICAgICAqXG4gICAgICogICAgIG1hcFNpemU6IHtcbiAgICAgKiAgICAgICB3aWR0aDogMTAyNCxcbiAgICAgKiAgICAgICBoZWlnaHQ6IDEwMjRcbiAgICAgKiAgICAgfSxcbiAgICAgKlxuICAgICAqICAgICBjYW1lcmE6IHtcbiAgICAgKiAgICAgICBuZWFyOiB0cnVlLFxuICAgICAqICAgICAgIGZhcjogNDAwLFxuICAgICAqICAgICAgIGZvdjogOTAsXG4gICAgICpcbiAgICAgKiAgICAgICB0b3A6IDIwMCxcbiAgICAgKiAgICAgICBib3R0b206IC0yMDAsXG4gICAgICogICAgICAgbGVmdDogLTIwMCxcbiAgICAgKiAgICAgICByaWdodDogMjAwXG4gICAgICogICAgIH1cbiAgICAgKiAgIH0sXG4gICAgICpcbiAgICAgKiAgIHBvc2l0aW9uOiB7eDogMCwgeTogMCwgejogMH0sXG4gICAgICogICByb3RhdGlvbjoge3g6IDAsIHk6IDAsIHo6IDB9XG4gICAgICogfVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogU3RhdGljIGluc3RydWN0aW9uc1xuICAgICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnQjaW5zdHJ1Y3Rpb25zXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBkZWZhdWx0XG4gICAgICoge1xuICAgICAqICAgcG9zaXRpb246IFsneCcsICd5JywgJ3onXSxcbiAgICAgKiAgIHJvdGF0aW9uOiBbJ3gnLCAneScsICd6J11cbiAgICAgKiB9XG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZyb20obGlnaHQpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgICAgdmFyIHdyYXBTaGFkb3cgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHRydWU7XG4gICAgICBwYXJhbXMuYnVpbGQgPSBmYWxzZTtcbiAgICAgIHZhciBjb21wb25lbnQgPSBuZXcgTGlnaHRDb21wb25lbnQocGFyYW1zKTtcbiAgICAgIGNvbXBvbmVudC5uYXRpdmUgPSBsaWdodDtcbiAgICAgIGNvbXBvbmVudC53cmFwKCk7XG4gICAgICBpZiAod3JhcFNoYWRvdykgY29tcG9uZW50LndyYXBTaGFkb3coKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfVxuICB9XSk7XG5cbiAgZnVuY3Rpb24gTGlnaHRDb21wb25lbnQocGFyYW1zKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIGRlZmF1bHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBMaWdodENvbXBvbmVudC5kZWZhdWx0cztcbiAgICB2YXIgaW5zdHJ1Y3Rpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBMaWdodENvbXBvbmVudC5pbnN0cnVjdGlvbnM7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBMaWdodENvbXBvbmVudCk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihMaWdodENvbXBvbmVudCkuY2FsbCh0aGlzLCBwYXJhbXMsIGRlZmF1bHRzLCBpbnN0cnVjdGlvbnMpKTtcblxuICAgIGlmIChfdGhpcy5wYXJhbXMuYnVpbGQpIHtcbiAgICAgIHZhciBidWlsZCA9IF90aGlzLmJ1aWxkKF90aGlzLnBhcmFtcyk7XG5cbiAgICAgIGlmICghYnVpbGQpIHtcbiAgICAgICAgdGhyb3cgbmV3IENvbXBvc2l0aW9uRXJyb3IkMSgnTGlnaHRDb21wb25lbnQnLCAnLmJ1aWxkKCkgbWV0aG9kIHNob3VsZCByZXR1cm4gYSBUSFJFRS5PYmplY3QzRCBvciBhIFByb21pc2UgcmVzb2x2ZWQgd2l0aCBUSFJFRS5PYmplY3QzRC4nLCBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYnVpbGQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIGJ1aWxkLnRoZW4oZnVuY3Rpb24gKG5hdGl2ZSkge1xuICAgICAgICAgIF90aGlzLm5hdGl2ZSA9IG5hdGl2ZTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgX3RoaXMubmF0aXZlID0gYnVpbGQ7XG5cbiAgICAgIF90aGlzLndhaXQoX3RoaXMud3JhcCgpKTtcbiAgICB9XG5cbiAgICBfdGhpcy5hcHBseUNvbW1hbmQoJ3Bvc3RJbnRlZ3JhdGUnKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfSAvLyBCVUlMRElORyAmIFdSQVBQSU5HXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaXZlY3ljbGUgc2hvdWxkIHJldHVybiBhIG5hdGl2ZSBvYmplY3QuXG4gICAqIEB0aHJvd3Mge0NvbXBvc2l0aW9uRXJyb3J9XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5MaWdodENvbXBvbmVudFxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKExpZ2h0Q29tcG9uZW50LCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHRocm93IG5ldyBDb21wb3NpdGlvbkVycm9yJDEoJ01lc2hDb21wb25lbnQnLCAnSW5zdGFuY2Ugc2hvdWxkIGhhdmUgaXRcXCdzIG93biAuYnVpbGQoKS4nLCB0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCB3cmFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIFdyYXBzIHRyYW5zZm9ybXMgKGBwb3NpdGlvbmAgJiBgcm90YXRpb25gKVxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9IFJlc29sdmVkIHdoZW4gYWN0aW9uIGlzIGNvbXBsZXRlZFxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5MaWdodENvbXBvbmVudFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwid3JhcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB3cmFwKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICBfdGhpczIuZGVmZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBfdGhpczIkcGFyYW1zID0gX3RoaXMyLnBhcmFtcyxcbiAgICAgICAgICAgICAgcG9zaXRpb24gPSBfdGhpczIkcGFyYW1zLnBvc2l0aW9uLFxuICAgICAgICAgICAgICByb3RhdGlvbiA9IF90aGlzMiRwYXJhbXMucm90YXRpb247XG5cbiAgICAgICAgICBfdGhpczIucG9zaXRpb24uc2V0KHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnopO1xuXG4gICAgICAgICAgX3RoaXMyLnJvdGF0aW9uLnNldChyb3RhdGlvbi54LCByb3RhdGlvbi55LCByb3RhdGlvbi56KTtcblxuICAgICAgICAgIF90aGlzMi5hcHBseUJyaWRnZSh7XG4gICAgICAgICAgICBvbldyYXA6IDFcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJlc29sdmUoX3RoaXMyKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCB3cmFwU2hhZG93XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIFdyYXBzIHNoYWRvdyBwcm9wZXJ0aWVzXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkxpZ2h0Q29tcG9uZW50XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ3cmFwU2hhZG93XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHdyYXBTaGFkb3coKSB7XG4gICAgICB2YXIgbmF0aXZlID0gdGhpcy5uYXRpdmUsXG4gICAgICAgICAgc2hhZG93ID0gdGhpcy5wYXJhbXMuc2hhZG93O1xuICAgICAgbmF0aXZlLmNhc3RTaGFkb3cgPSBzaGFkb3cuY2FzdDtcbiAgICAgIG5hdGl2ZS5zaGFkb3cubWFwU2l6ZS53aWR0aCA9IHNoYWRvdy5tYXBTaXplLndpZHRoO1xuICAgICAgbmF0aXZlLnNoYWRvdy5tYXBTaXplLmhlaWdodCA9IHNoYWRvdy5tYXBTaXplLmhlaWdodDtcbiAgICAgIG5hdGl2ZS5zaGFkb3cuYmlhcyA9IHNoYWRvdy5iaWFzO1xuICAgICAgbmF0aXZlLnNoYWRvdy5yYWRpdXMgPSBzaGFkb3cucmFkaXVzO1xuICAgICAgdmFyIHNoYWRvd0NhbWVyYSA9IG5hdGl2ZS5zaGFkb3cuY2FtZXJhO1xuICAgICAgdmFyIGNhbWVyYSA9IHNoYWRvdy5jYW1lcmE7XG4gICAgICBzaGFkb3dDYW1lcmEubmVhciA9IGNhbWVyYS5uZWFyO1xuICAgICAgc2hhZG93Q2FtZXJhLmZhciA9IGNhbWVyYS5mYXI7XG4gICAgICBzaGFkb3dDYW1lcmEuZm92ID0gY2FtZXJhLmZvdjtcbiAgICAgIHNoYWRvd0NhbWVyYS5sZWZ0ID0gY2FtZXJhLmxlZnQ7XG4gICAgICBzaGFkb3dDYW1lcmEucmlnaHQgPSBjYW1lcmEucmlnaHQ7XG4gICAgICBzaGFkb3dDYW1lcmEudG9wID0gY2FtZXJhLnRvcDtcbiAgICAgIHNoYWRvd0NhbWVyYS5ib3R0b20gPSBjYW1lcmEuYm90dG9tO1xuICAgIH0gLy8gQ09QWUlORyAmIENMT05JTkdcblxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgY29weVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBDb3B5IHNvdXJjZSB0cmFuc2Zvcm1zICYgZXhlY3V0ZSBgQ29tcG9uZW50LmNvcHkoKWBcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBMaWdodENvbXBvbmVudFxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5MaWdodENvbXBvbmVudFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiY29weVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb3B5JCQxKHNvdXJjZSkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHJldHVybiBnZXQkMyhnZXRQcm90b3R5cGVPZiQyKExpZ2h0Q29tcG9uZW50LnByb3RvdHlwZSksIFwiY29weVwiLCB0aGlzKS5jYWxsKHRoaXMsIHNvdXJjZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoX3RoaXMzLnRhcmdldCkgX3RoaXMzLnRhcmdldC5jb3B5KHNvdXJjZS50YXJnZXQoKSk7XG5cbiAgICAgICAgX3RoaXMzLnBvc2l0aW9uLmNvcHkoc291cmNlLnBvc2l0aW9uKTtcblxuICAgICAgICBfdGhpczMucm90YXRpb24uY29weShzb3VyY2Uucm90YXRpb24pO1xuXG4gICAgICAgIF90aGlzMy5xdWF0ZXJuaW9uLmNvcHkoc291cmNlLnF1YXRlcm5pb24pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgY2xvbmVcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gTWFrZSBhIGNsb25lIG9mIHRoaXMgTGlnaHRDb21wb25lbnQgdXNpbmcgYC5jb3B5KClgXG4gICAgICogQHJldHVybiB7TGlnaHRDb21wb25lbnR9IGNsb25lIG9mIHRoaXMgb2JqZWN0XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkxpZ2h0Q29tcG9uZW50XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjbG9uZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbG9uZSgpIHtcbiAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih7XG4gICAgICAgIGJ1aWxkOiBmYWxzZVxuICAgICAgfSkuY29weSh0aGlzKTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhMaWdodENvbXBvbmVudCwgX0NvbXBvbmVudCk7XG5cbiAgcmV0dXJuIExpZ2h0Q29tcG9uZW50O1xufShDb21wb25lbnQpKSB8fCBfY2xhc3MkMSk7XG5cbmRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhMaWdodENvbXBvbmVudCwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIENvbXBvbmVudC5kZWZhdWx0cywge1xuICBidWlsZDogdHJ1ZSxcbiAgc2hhZG93OiB7XG4gICAgY2FzdDogdHJ1ZSxcbiAgICBiaWFzOiAwLFxuICAgIHJhZGl1czogMSxcbiAgICBtYXBTaXplOiB7XG4gICAgICB3aWR0aDogMTAyNCxcbiAgICAgIGhlaWdodDogMTAyNFxuICAgIH0sXG4gICAgY2FtZXJhOiB7XG4gICAgICBuZWFyOiB0cnVlLFxuICAgICAgZmFyOiA0MDAsXG4gICAgICBmb3Y6IDkwLFxuICAgICAgdG9wOiAyMDAsXG4gICAgICBib3R0b206IC0yMDAsXG4gICAgICBsZWZ0OiAtMjAwLFxuICAgICAgcmlnaHQ6IDIwMFxuICAgIH1cbiAgfSxcbiAgcG9zaXRpb246IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgejogMFxuICB9LFxuICByb3RhdGlvbjoge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB6OiAwXG4gIH1cbn0pKSwgXCJpbnN0cnVjdGlvbnNcIiwge1xuICBwb3NpdGlvbjogWyd4JywgJ3knLCAneiddLFxuICByb3RhdGlvbjogWyd4JywgJ3knLCAneiddXG59KTtcblxudmFyIF9kZWMkMiwgX2NsYXNzJDI7XG52YXIgXG4vKipcbiAqIEBjbGFzcyBDYW1lcmFDb21wb25lbnRcbiAqIEBjYXRlZ29yeSBjb3JlXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1ldGVycyBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW2luc3RydWN0aW9uc10gLSBUaGUgaW5zdHJ1Y3Rpb25zIG9iamVjdC5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLkNvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlXG4gKi9cbkNhbWVyYUNvbXBvbmVudCA9IChfZGVjJDIgPSBhdHRyaWJ1dGVzKGNvcHkoJ3Bvc2l0aW9uJywgJ3JvdGF0aW9uJywgJ3F1YXRlcm5pb24nLCAndGFyZ2V0JykpLCBfZGVjJDIoX2NsYXNzJDIgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgY3JlYXRlQ2xhc3MoQ2FtZXJhQ29tcG9uZW50LCBudWxsLCBbe1xuICAgIGtleTogXCJmcm9tXCIsXG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvcmUuQ2FtZXJhQ29tcG9uZW50I2RlZmF1bHRzXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBkZWZhdWx0XG4gICAgICoge1xuICAgICAqICAgYnVpbGQ6IHRydWUsXG4gICAgICpcbiAgICAgKiAgIHBvc2l0aW9uOiB7eDogMCwgeTogMCwgejogMH0sXG4gICAgICogICByb3RhdGlvbjoge3g6IDAsIHk6IDAsIHo6IDB9XG4gICAgICogfVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogU3RhdGljIGluc3RydWN0aW9uc1xuICAgICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvcmUuQ2FtZXJhQ29tcG9uZW50I2luc3RydWN0aW9uc1xuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAZGVmYXVsdFxuICAgICAqIHtcbiAgICAgKiAgIHBvc2l0aW9uOiBbJ3gnLCAneScsICd6J10sXG4gICAgICogICByb3RhdGlvbjogWyd4JywgJ3knLCAneiddLFxuICAgICAqICAgc2NhbGU6IFsneCcsICd5JywgJ3onXVxuICAgICAqIH1cbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbShjYW1lcmEpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgICAgcGFyYW1zLmJ1aWxkID0gZmFsc2U7XG4gICAgICB2YXIgY29tcG9uZW50ID0gbmV3IENhbWVyYUNvbXBvbmVudChwYXJhbXMpO1xuICAgICAgY29tcG9uZW50Lm5hdGl2ZSA9IGNhbWVyYTtcbiAgICAgIGNvbXBvbmVudC53cmFwKCk7XG4gICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cbiAgfV0pO1xuXG4gIGZ1bmN0aW9uIENhbWVyYUNvbXBvbmVudChwYXJhbXMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgZGVmYXVsdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IENhbWVyYUNvbXBvbmVudC5kZWZhdWx0cztcbiAgICB2YXIgaW5zdHJ1Y3Rpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBDYW1lcmFDb21wb25lbnQuaW5zdHJ1Y3Rpb25zO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2FtZXJhQ29tcG9uZW50KTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKENhbWVyYUNvbXBvbmVudCkuY2FsbCh0aGlzLCBwYXJhbXMsIGRlZmF1bHRzLCBpbnN0cnVjdGlvbnMpKTtcblxuICAgIGlmIChfdGhpcy5wYXJhbXMuYnVpbGQpIHtcbiAgICAgIHZhciBidWlsZCA9IF90aGlzLmJ1aWxkKF90aGlzLnBhcmFtcyk7XG5cbiAgICAgIGlmICghYnVpbGQpIHtcbiAgICAgICAgdGhyb3cgbmV3IENvbXBvc2l0aW9uRXJyb3IkMSgnQ2FtZXJhQ29tcG9uZW50JywgJy5idWlsZCgpIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgVEhSRUUuT2JqZWN0M0Qgb3IgYSBQcm9taXNlIHJlc29sdmVkIHdpdGggVEhSRUUuT2JqZWN0M0QuJywgYXNzZXJ0VGhpc0luaXRpYWxpemVkKGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJ1aWxkIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICBidWlsZC50aGVuKGZ1bmN0aW9uIChuYXRpdmUpIHtcbiAgICAgICAgICBfdGhpcy5uYXRpdmUgPSBuYXRpdmU7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIF90aGlzLm5hdGl2ZSA9IGJ1aWxkO1xuXG4gICAgICBfdGhpcy53YWl0KF90aGlzLndyYXAoKSk7XG4gICAgfVxuXG4gICAgX3RoaXMuYXBwbHlDb21tYW5kKCdwb3N0SW50ZWdyYXRlJyk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH0gLy8gQlVJTERJTkcgJiBXUkFQUElOR1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGl2ZWN5Y2xlIHNob3VsZCByZXR1cm4gYSBuYXRpdmUgb2JqZWN0LlxuICAgKiBAdGhyb3dzIHtDb21wb3NpdGlvbkVycm9yfVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ2FtZXJhQ29tcG9uZW50XG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoQ2FtZXJhQ29tcG9uZW50LCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHRocm93IG5ldyBDb21wb3NpdGlvbkVycm9yJDEoJ0NhbWVyYUNvbXBvbmVudCcsICdJbnN0YW5jZSBzaG91bGQgaGF2ZSBpdFxcJ3Mgb3duIC5idWlsZCgpLicsIHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHdyYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gV3JhcHMgdHJhbnNmb3JtcyAoYHBvc2l0aW9uYCAmIGByb3RhdGlvbmApXG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gUmVzb2x2ZWQgd2hlbiBhY3Rpb24gaXMgY29tcGxldGVkXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkNhbWVyYUNvbXBvbmVudFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwid3JhcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB3cmFwKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICBfdGhpczIuZGVmZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzMi5wb3NpdGlvbi5zZXQoX3RoaXMyLnBhcmFtcy5wb3NpdGlvbi54LCBfdGhpczIucGFyYW1zLnBvc2l0aW9uLnksIF90aGlzMi5wYXJhbXMucG9zaXRpb24ueik7XG5cbiAgICAgICAgICBfdGhpczIucm90YXRpb24uc2V0KF90aGlzMi5wYXJhbXMucm90YXRpb24ueCwgX3RoaXMyLnBhcmFtcy5yb3RhdGlvbi55LCBfdGhpczIucGFyYW1zLnJvdGF0aW9uLnopO1xuXG4gICAgICAgICAgX3RoaXMyLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgICAgIG9uV3JhcDogMVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmVzb2x2ZShfdGhpczIpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGNvcHlcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gQ29weSBzb3VyY2UgdHJhbnNmb3JtcyAmIGV4ZWN1dGUgYENvbXBvbmVudC5jb3B5KClgXG4gICAgICogQHJldHVybiB7dGhpc30gQ2FtZXJhQ29tcG9uZW50XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkNhbWVyYUNvbXBvbmVudFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiY29weVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb3B5JCQxKHNvdXJjZSkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHJldHVybiBnZXQkMyhnZXRQcm90b3R5cGVPZiQyKENhbWVyYUNvbXBvbmVudC5wcm90b3R5cGUpLCBcImNvcHlcIiwgdGhpcykuY2FsbCh0aGlzLCBzb3VyY2UsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKF90aGlzMy50YXJnZXQpIF90aGlzMy50YXJnZXQuY29weShzb3VyY2UudGFyZ2V0KCkpO1xuXG4gICAgICAgIF90aGlzMy5wb3NpdGlvbi5jb3B5KHNvdXJjZS5wb3NpdGlvbik7XG5cbiAgICAgICAgX3RoaXMzLnJvdGF0aW9uLmNvcHkoc291cmNlLnJvdGF0aW9uKTtcblxuICAgICAgICBfdGhpczMucXVhdGVybmlvbi5jb3B5KHNvdXJjZS5xdWF0ZXJuaW9uKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGNsb25lXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIE1ha2UgYSBjbG9uZSBvZiB0aGlzIENhbWVyYUNvbXBvbmVudCB1c2luZyBgLmNvcHkoKWBcbiAgICAgKiBAcmV0dXJuIHtDYW1lcmFDb21wb25lbnR9IGNsb25lIG9mIHRoaXMgb2JqZWN0XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkNhbWVyYUNvbXBvbmVudFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiY2xvbmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xvbmUoKSB7XG4gICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3Ioe1xuICAgICAgICBidWlsZDogZmFsc2VcbiAgICAgIH0pLmNvcHkodGhpcyk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoQ2FtZXJhQ29tcG9uZW50LCBfQ29tcG9uZW50KTtcblxuICByZXR1cm4gQ2FtZXJhQ29tcG9uZW50O1xufShDb21wb25lbnQpKSB8fCBfY2xhc3MkMik7XG5cbmRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhDYW1lcmFDb21wb25lbnQsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgYnVpbGQ6IHRydWUsXG4gIHBvc2l0aW9uOiB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHo6IDBcbiAgfSxcbiAgcm90YXRpb246IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgejogMFxuICB9XG59KSksIFwiaW5zdHJ1Y3Rpb25zXCIsIHtcbiAgcG9zaXRpb246IFsneCcsICd5JywgJ3onXSxcbiAgcm90YXRpb246IFsneCcsICd5JywgJ3onXSxcbiAgc2NhbGU6IFsneCcsICd5JywgJ3onXVxufSk7XG5cbmNvbnN0IHZlcnNpb24gPSBcIjIuMi4wLWFscGhhLjBcIjtcblxudmFyIHN5c3RlbSA9IHtcbiAgd2luZG93OiB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvd1xufTtcblxuLyoqXG4gKiBAY2xhc3MgQXBwXG4gKiBAY2F0ZWdvcnkgY29yZVxuICogQGRlc2NyaXB0aW9uIFRoaXMgY29tcG9uZW50IGlzIHVzZWQgdG8gcHJlcGFyZSBhIHdvcmxkIHNjZW5lLCBzZXR1cCBwaHlzaWNzLCBjYW1lcmEsIHJlbmRlcmVyIGFuZCBhbGwgb3RoZXIgdGhpbmdzIHRoYXQgeW91IHVzdWFsbHkgZG8gYmVmb3JlIG1ha2luZyBtZXNoZXMuXG4gKiBAcGFyYW0ge0FycmF5fSBbbW9kdWxlcz1bXV0gLSBBcnJheSBvZiBNb2R1bGVzXG4gKiBAZXh0ZW5kcyBNb2R1bGVTeXN0ZW1cbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZVxuICovXG5cbnZhciBBcHAgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9Nb2R1bGVTeXN0ZW0pIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIHdoZXRoZXIgdGhlIHNjZW5lIHNob3VsZCByZW5kZXIgb3Igbm90XG4gICAqIEBtZW1iZXIge0Jvb2xlYW59IG1vZHVsZTpjb3JlLkFwcCNlbmFibGVkXG4gICAqIEBwdWJsaWNcbiAgICovXG5cbiAgLyoqXG4gICAqIExvb3BzIGluIHRoaXMgYXBwXG4gICAqIEBkZXNjcmlwdGlvbiBBcnJheSBvZiBsb29wcyB0aGF0IGFyZSBleGVjdXRlZCBieSB0aGlzIGFwcC5cbiAgICogQG1lbWJlciB7QXJyYXl9IG1vZHVsZTpjb3JlLkFwcCNsb29wc1xuICAgKiBAcHVibGljXG4gICAqL1xuICBmdW5jdGlvbiBBcHAoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIG1vZHVsZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQXBwKTtcblxuICAgIGNvbnNvbGUubG9nKFwiV0hTLkFwcCBcIi5jb25jYXQodmVyc2lvbikpO1xuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKEFwcCkuY2FsbCh0aGlzKSk7XG5cbiAgICBkZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoYXNzZXJ0VGhpc0luaXRpYWxpemVkKGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpLCBcImVuYWJsZWRcIiwgdHJ1ZSksIFwibG9vcHNcIiwgW10pO1xuXG4gICAgX3RoaXMubWFuYWdlciA9IG5ldyBNb2R1bGVNYW5hZ2VyKGFzc2VydFRoaXNJbml0aWFsaXplZChhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKSk7XG4gICAgX3RoaXMubW9kdWxlcyA9IG1vZHVsZXM7XG5cbiAgICBfdGhpcy5pbnRlZ3JhdGVNb2R1bGVzKCk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH0gLy8gQ09OVFJPTFMgJiBVUERBVElOR1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHN0YXJ0XG4gICAqIEBkZXNjcmlwdGlvbiBTdGFydCByZW5kZXJpbmcgbG9vcCBhbmQgcGh5c2ljcyBzaW11bGF0aW9uIChpZiB5b3UgdXNlIHZlcnNpb24gd2l0aCBwaHlzaWNzKS5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkFwcFxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKEFwcCwgW3tcbiAgICBrZXk6IFwic3RhcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgICB2YXIgcmVxdWVzdEFuaW1GcmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHN5c3RlbS53aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHN5c3RlbS53aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHN5c3RlbS53aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgIHN5c3RlbS53aW5kb3cuc2V0VGltZW91dChjYWxsYmFjaywgMTAwMCAvIDYwKTtcbiAgICAgICAgfTtcbiAgICAgIH0oKTtcblxuICAgICAgdmFyIGxvb3BzID0gdGhpcy5sb29wcyxcbiAgICAgICAgICBlbmFibGVkID0gdGhpcy5lbmFibGVkO1xuXG4gICAgICBmdW5jdGlvbiBwcm9jZXNzKCkge1xuICAgICAgICByZXF1ZXN0QW5pbUZyYW1lKHByb2Nlc3MpO1xuICAgICAgICBpZiAoIWVuYWJsZWQpIHJldHVybjtcblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGwgPSBsb29wcy5sZW5ndGg7IGkgPCBsbDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGUgPSBsb29wc1tpXTtcbiAgICAgICAgICBpZiAoZS5lbmFibGVkKSBlLmV4ZWN1dGUoZS5jbG9jayk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcbiAgICAgIHByb2Nlc3MoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBzdG9wXG4gICAgICogQGRlc2NyaXB0aW9uIFN0b3BzIHJlbmRlcmluZyBsb29wc1xuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5BcHBcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInN0b3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGFkZExvb3BcbiAgICAgKiBAZGVzY3JpcHRpb24gQWRkcyBsb29wIHRvIHRoaXMgYXBwLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBsb29wIC0gdGhlIGxvb3AgdG8gYWRkXG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gcHJvbWlzZXMgY29tcGxldGVkLlxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5BcHBcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5BZGRpbmcgYSBsb29wIHRvIGFuIGFwcDwvY2FwdGlvbj5cbiAgICAgKiBjb25zdCBsb29wID0gbmV3IExvb3AoKCkgPT4ge1xuICAgICAqICAvLyAuLi5cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIGNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbiAgICAgKlxuICAgICAqIGFwcC5hZGRMb29wKGxvb3ApO1xuICAgICAqIGxvb3Auc3RhcnQoKTtcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImFkZExvb3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkTG9vcChsb29wKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIF90aGlzMi5sb29wcy5wdXNoKGxvb3ApO1xuXG4gICAgICAgIHJlc29sdmUobG9vcCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCByZW1vdmVMb29wXG4gICAgICogQGRlc2NyaXB0aW9uIFJlbW92ZXMgbG9vcCBmcm9tIHRoaXMgYXBwLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBsb29wIC0gdGhlIGxvb3AgdG8gcmVtb3ZlXG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gcHJvbWlzZXMgY29tcGxldGVkLlxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5BcHBcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZUxvb3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlTG9vcChsb29wKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IF90aGlzMy5sb29wcy5pbmRleE9mKGxvb3ApO1xuXG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIF90aGlzMy5sb29wcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICByZXNvbHZlKGxvb3ApO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLmdldChrZXkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1c2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXNlKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci51c2Uoa2V5KTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhBcHAsIF9Nb2R1bGVTeXN0ZW0pO1xuXG4gIHJldHVybiBBcHA7XG59KE1vZHVsZVN5c3RlbSk7XG5cbi8qKlxuICogQGNsYXNzIExvb3BcbiAqIEBjYXRlZ29yeSBjb3JlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgb24gZWFjaCBhbmltYXRpb24gZnJhbWVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW3VzZUNsb2NrPXRydWVdIHBhc3NlcyBhIENsb2NrIHRvIHRoZSBmdW5jdGlvbiB3aGVuIGNhbGxlZCwgaWYgdHJ1ZVxuICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlXG4gKi9cblxudmFyIExvb3AgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBMb29wKGZ1bmMpIHtcbiAgICB2YXIgdXNlQ2xvY2sgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBMb29wKTtcblxuICAgIHRoaXMuZnVuYyA9IGZ1bmM7XG4gICAgdGhpcy5jbG9jayA9IHVzZUNsb2NrID8gbmV3IENsb2NrKCkgOiBudWxsO1xuICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuICB9IC8vIENPTlRST0xTXG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc3RhcnRcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBTdGFydHMgdGhpcyBsb29wLCBjbG9jayBpZiBpdCBoYXMgb25lLiBXb24ndCBkbyBhbnl0aGluZyBpZiBsb29wIGVuYWJsZWQgYWxyZWFkeS5cbiAgICogQHBhcmFtIHtDb21wb25lbnR9IFt3b3JsZF0gYXBwIHRvIGFkZCB0aGlzIGxvb3AgdG8sIGlmIHByb3ZpZGVkLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTG9vcFxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKExvb3AsIFt7XG4gICAga2V5OiBcInN0YXJ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0YXJ0KHdvcmxkKSB7XG4gICAgICBpZiAodGhpcy5lbmFibGVkKSByZXR1cm47XG4gICAgICBpZiAod29ybGQpIHdvcmxkLmFkZExvb3AodGhpcyk7XG4gICAgICBpZiAodGhpcy5jbG9jaykgdGhpcy5jbG9jay5zdGFydCgpO1xuICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBzdG9wXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIFN0b3BzIHRoaXMgbG9vcCBhbmQgaXRzIGNsb2NrIGlmIGl0IGhhcyBvbmUsIHdvbid0IGRvIGFueXRoaW5nIGlmIHRoaXMgbG9vcCBpcyBub3QgZW5hYmxlZClcbiAgICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gW3dvcmxkXSBhcHAgdG8gcmVtb3ZlIHRoaXMgbG9vcCBmcm9tLCBpZiBwcm92aWRlZC5cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTG9vcFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic3RvcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdG9wKHdvcmxkKSB7XG4gICAgICBpZiAoIXRoaXMuZW5hYmxlZCkgcmV0dXJuO1xuICAgICAgaWYgKHRoaXMuY2xvY2spIHRoaXMuY2xvY2suc3RvcCgpO1xuICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2U7XG4gICAgICBpZiAod29ybGQpIHdvcmxkLnJlbW92ZUxvb3AodGhpcyk7XG4gICAgfSAvLyBFWEVDVVRJT05cblxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgZXhlY3V0ZVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyB0aGUgZnVuY3Rpb24gb2YgdGhpcyBsb29wXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkxvb3BcbiAgICAgKiBAcmV0dXJucyB7Kn0gd2hhdGV2ZXIgdGhlIGZ1bmN0aW9uIG9mIHRoaXMgbG9vcCByZXR1cm5zXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJleGVjdXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGV4ZWN1dGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5mdW5jKHRoaXMuY2xvY2spO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBMb29wO1xufSgpO1xuXG4vKiogQG1vZHVsZSBjb3JlICovXG5cbi8qKlxuICogQGNsYXNzIEFtYmllbnRMaWdodFxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbGlnaHRzXG4gKiBAZGVzY3JpcHRpb24gQW1iaWVudExpZ2h0IGlzIGEgc2ltcGxlIGNsYXNzLCBpdCBleHRlbmRzIExpZ2h0IGFuZCBpbmhlcml0cyBhbGwgaXRzIG1ldGhvZHMuXG4gKiBBbWJpZW50TGlnaHQgY3JlYXRlcyBiYXNpYyBsaWdodCBhcm91bmQgYWxsIHNjZW5lLCBzbyBpdCBkb2Vzbid0IG5lZWQgcHJvcGVydGllcyBsaWtlIHBvcyBvciB0YXJnZXQuXG4gKiBJdCBzdXBwb3J0cyBvbmx5IGNvbG9yIGFuZCBpbnRlbnNpdHkgYXMgcGFyYW1ldGVycywgd2hpY2ggZGVmaW5lcyB0aGUgY29sb3Igb2YgdGhlIHN1cnJvdW5kZWQgbGlnaHQgYW5kIGludGVuc2l0eSBvZiBsaWdodC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zPXtsaWdodDoge2NvbG9yOiAweGZmZmZmZiwgaW50ZW5zaXR5OiAxfX1dIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLkxpZ2h0Q29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbGlnaHRzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhbiBBbWJpZW50TGlnaHQgPC9jYXB0aW9uPlxuICogbmV3IEFtYmllbnRMaWdodCh7XG4gKiAgIGNvbG9yOiAweGZmZmZmZixcbiAqICAgaW50ZW5zaXR5OiAwLjJcbiAqIH0pLmFkZFRvKHdvcmxkKTtcbiAqL1xuXG52YXIgQW1iaWVudExpZ2h0JDEgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9MaWdodENvbXBvbmVudCkge1xuICBmdW5jdGlvbiBBbWJpZW50TGlnaHQkJDEoKSB7XG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBBbWJpZW50TGlnaHQkJDEpO1xuXG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihBbWJpZW50TGlnaHQkJDEpLmNhbGwodGhpcywgcGFyYW1zLCBBbWJpZW50TGlnaHQkJDEuZGVmYXVsdHMpKTtcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKEFtYmllbnRMaWdodCQkMSwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbGlnaHQ6IG5ldyBBbWJpZW50TGlnaHQocGFyYW1zLmNvbG9yLCBwYXJhbXMuaW50ZW5zaXR5KVxuICAgICAgfSkubGlnaHQ7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoQW1iaWVudExpZ2h0JCQxLCBfTGlnaHRDb21wb25lbnQpO1xuXG4gIHJldHVybiBBbWJpZW50TGlnaHQkJDE7XG59KExpZ2h0Q29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhBbWJpZW50TGlnaHQkMSwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIExpZ2h0Q29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGNvbG9yOiAweGZmZmZmZixcbiAgaW50ZW5zaXR5OiAxXG59KSk7XG5cbi8qKlxuICogQGNsYXNzIERpcmVjdGlvbmFsTGlnaHRcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL2xpZ2h0c1xuICogQGRlc2NyaXB0aW9uIERpcmVjdGluYWxMaWdodCBjcmVhdGVzIGEgbGlnaHQgdGhhdCBzaGluZXMgZnJvbSBhIHNwZWNpZmljIGRpcmVjdGlvbiBub3QgZnJvbSBhIHNwZWNpZmljIHBvc2l0aW9uLjxici8+PGJyLz5cbiAqIFRoaXMgbGlnaHQgd2lsbCBiZWhhdmUgYXMgdGhvdWdoIGl0IGlzIGluZmluaXRlbHkgZmFyIGF3YXkgYW5kIHRoZSByYXlzIHByb2R1Y2VkIGZyb20gaXQgYXJlIGFsbCBwYXJhbGxlbC4gPGJyLz48YnIvPlxuICogVGhlIGJlc3QgYW5hbG9neSB3b3VsZCBiZSBhIGxpZ2h0IHNvdXJjZSB0aGF0IGFjdHMgbGlrZSB0aGUgc3VuOiB0aGUgc3VuIGlzIHNvIGZhciBhd2F5IHRoYXQgYWxsIHN1bmxpZ2h0IGhpdHRpbmcgb2JqZWN0cyBjb21lcyBmcm9tIHRoZSBzYW1lIGFuZ2xlLjxici8+PGJyLz5cbiAqIEl0IGhhcyB0aGUgc2FtZSBvcHRpb25zIGFzIEFtYmllbnRMaWdodCBpbiBsaWdodCBwYXJhbWF0ZXIsIGJ1dCBpdCBhbHNvIHN1cHBvcnRzIHBvcyBhbmQgdGFyZ2V0IHBhcmFtYXRlcnMuXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcz17bGlnaHQ6IHtjb2xvcjogMHhmZmZmZmYsIGludGVuc2l0eTogMX19XSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5MaWdodENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL2xpZ2h0c1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBEaXJlY3Rpb25hbExpZ2h0IHRvIGZhbGwgZG93biBmcm9tIHZlYzMoMTAsIDIwLCAxMCkgdG8gdmVjMygwLCAwLCAwKTwvY2FwdGlvbj5cbiAqIG5ldyBEaXJlY3Rpb25hbExpZ2h0KHtcbiAqICAgY29sb3I6IDB4ZmZmZmZmLFxuICogICBpbnRlbnNpdHk6IDAuMixcbiAqXG4gKiAgIHBvc2l0aW9uOiBbMTAsIDIwLCAxMF1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIERpcmVjdGlvbmFsTGlnaHQkMSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0xpZ2h0Q29tcG9uZW50KSB7XG4gIGZ1bmN0aW9uIERpcmVjdGlvbmFsTGlnaHQkJDEoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBEaXJlY3Rpb25hbExpZ2h0JCQxKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKERpcmVjdGlvbmFsTGlnaHQkJDEpLmNhbGwodGhpcywgcGFyYW1zLCBEaXJlY3Rpb25hbExpZ2h0JCQxLmRlZmF1bHRzKSk7XG5cbiAgICBfdGhpcy53cmFwU2hhZG93KCk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhEaXJlY3Rpb25hbExpZ2h0JCQxLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBsaWdodDogbmV3IERpcmVjdGlvbmFsTGlnaHQocGFyYW1zLmNvbG9yLCBwYXJhbXMuaW50ZW5zaXR5KVxuICAgICAgfSkubGlnaHQ7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoRGlyZWN0aW9uYWxMaWdodCQkMSwgX0xpZ2h0Q29tcG9uZW50KTtcblxuICByZXR1cm4gRGlyZWN0aW9uYWxMaWdodCQkMTtcbn0oTGlnaHRDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKERpcmVjdGlvbmFsTGlnaHQkMSwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIExpZ2h0Q29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGNvbG9yOiAweGZmZmZmZixcbiAgaW50ZW5zaXR5OiAxXG59KSk7XG5cbi8qKlxuICogQGNsYXNzIEhlbWlzcGhlcmVMaWdodFxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbGlnaHRzXG4gKiBAZGVzY3JpcHRpb24gSGVtaXNwaGVyZUxpZ2h0IGlzIGEgbGlnaHQgc291cmNlIHBvc2l0aW9uZWQgZGlyZWN0bHkgYWJvdmUgdGhlIHNjZW5lLjxici8+XG4gKiBJdCBhbHNvIGRvZXNuJ3QgbmVlZCBwb3NpdGlvbiBhbmQgdGFyZ2V0IHByb3BlcnRpZXMuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZXhhbXBsZXMvd2ViZ2xfbGlnaHRzX2hlbWlzcGhlcmUuaHRtbFwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXM9e2xpZ2h0OiB7c2t5Q29sb3I6IDB4ZmZmZmZmLCBncm91bmRDb2xvcjogMHhmZmZmZmYsIGludGVuc2l0eTogMX19XSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5MaWdodENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL2xpZ2h0c1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBIZW1pc3BoZXJlTGlnaHQ8L2NhcHRpb24+XG4gKiBuZXcgSGVtaXNwaGVyZUxpZ2h0KHtcbiAqICAgc2t5Q29sb3I6IDB4ZmYwMDAwLFxuICogICBncm91bmRDb2xvcjogMHgwMDAwZmYsXG4gKiAgIGludGVuc2l0eTogMC4yXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBIZW1pc3BoZXJlTGlnaHQkMSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0xpZ2h0Q29tcG9uZW50KSB7XG4gIGZ1bmN0aW9uIEhlbWlzcGhlcmVMaWdodCQkMSgpIHtcbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEhlbWlzcGhlcmVMaWdodCQkMSk7XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKEhlbWlzcGhlcmVMaWdodCQkMSkuY2FsbCh0aGlzLCBwYXJhbXMsIEhlbWlzcGhlcmVMaWdodCQkMS5kZWZhdWx0cykpO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoSGVtaXNwaGVyZUxpZ2h0JCQxLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBsaWdodDogbmV3IEhlbWlzcGhlcmVMaWdodChwYXJhbXMuc2t5Q29sb3IsIHBhcmFtcy5ncm91bmRDb2xvciwgcGFyYW1zLmludGVuc2l0eSlcbiAgICAgIH0pLmxpZ2h0O1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKEhlbWlzcGhlcmVMaWdodCQkMSwgX0xpZ2h0Q29tcG9uZW50KTtcblxuICByZXR1cm4gSGVtaXNwaGVyZUxpZ2h0JCQxO1xufShMaWdodENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoSGVtaXNwaGVyZUxpZ2h0JDEsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBMaWdodENvbXBvbmVudC5kZWZhdWx0cywge1xuICBza3lDb2xvcjogMHhmZmZmZmYsXG4gIGdyb3VuZENvbG9yOiAweGZmZmZmZixcbiAgaW50ZW5zaXR5OiAxXG59KSk7XG5cbi8qKlxuICogQGNsYXNzIFBvaW50TGlnaHRcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL2xpZ2h0c1xuICogQGRlc2NyaXB0aW9uIFBvaW50TGlnaHQgY3JlYXRlcyBhIGxpZ2h0IGF0IGEgc3BlY2lmaWMgcG9zaXRpb24gaW4gdGhlIHNjZW5lLiBUaGUgbGlnaHQgc2hpbmVzIGluIGFsbCBkaXJlY3Rpb25zIChyb3VnaGx5IHNpbWlsYXIgdG8gYSBsaWdodCBidWxiLik8YnIvPjxici8+XG4gKiBJdCBoYXMgdGhlIHNhbWUgb3B0aW9ucyBhcyBBbWJpZW50TGlnaHQgaW4gbGlnaHQgcGFyYW1hdGVyLCBidXQgaXQgYWxzbyBzdXBwb3J0cyBwb3NpdGlvbiwgZGlzdGFuY2UgYW5kIGRlY2F5Ljxici8+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcz17bGlnaHQ6IHtjb2xvcjogMHhmZmZmZmYsIGludGVuc2l0eTogMSwgZGlzdGFuY2U6IDEwMCwgZGVjYXk6IDF9fV0gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgTGlnaHRDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9saWdodHNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgUG9pbnRMaWdodDwvY2FwdGlvbj5cbiAqIG5ldyBQb2ludExpZ2h0KCB7XG4gKiAgIGNvbG9yOiAweGZmMDAwMCxcbiAqICAgaW50ZW5zaXR5OiAyLFxuICogICBkaXN0YW5jZTogMzAwXG4gKlxuICogICBwb3NpdGlvbjogWzEwLCAyMCwgMTBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBQb2ludExpZ2h0JDEgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9MaWdodENvbXBvbmVudCkge1xuICBmdW5jdGlvbiBQb2ludExpZ2h0JCQxKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9pbnRMaWdodCQkMSk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihQb2ludExpZ2h0JCQxKS5jYWxsKHRoaXMsIHBhcmFtcywgUG9pbnRMaWdodCQkMS5kZWZhdWx0cykpO1xuXG4gICAgX3RoaXMud3JhcFNoYWRvdygpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoUG9pbnRMaWdodCQkMSwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbGlnaHQ6IG5ldyBQb2ludExpZ2h0KHBhcmFtcy5jb2xvciwgcGFyYW1zLmludGVuc2l0eSwgcGFyYW1zLmRpc3RhbmNlLCBwYXJhbXMuZGVjYXkpXG4gICAgICB9KS5saWdodDtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhQb2ludExpZ2h0JCQxLCBfTGlnaHRDb21wb25lbnQpO1xuXG4gIHJldHVybiBQb2ludExpZ2h0JCQxO1xufShMaWdodENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoUG9pbnRMaWdodCQxLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTGlnaHRDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgY29sb3I6IDB4ZmZmZmZmLFxuICBpbnRlbnNpdHk6IDEsXG4gIGRpc3RhbmNlOiAxMDAsXG4gIGRlY2F5OiAxXG59KSk7XG5cbi8qKlxuICogQGNsYXNzIFNwb3RMaWdodFxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbGlnaHRzXG4gKiBAZGVzY3JpcHRpb24gU3BvdExpZ2h0IGNyZWF0ZXMgc3BvdCBsaWdodCB0aGF0IGNhbiBjYXN0IHNoYWRvdyBpbiBvbmUgZGlyZWN0aW9uLiA8YnIvPjxici8+XG4gKiBJdCBoYXMgdGhlIHNhbWUgcGFyYW1ldGVycyBhcyBBbWJpZW50TGlnaHQgaW4gbGlnaHQsIGJ1dCBpdCBhbHNvIHN1cHBvcnRzIHBvcyBhbmQgdGFyZ2V0LiA8YnIvPjxici8+XG4gKiBTcG90TGlnaHQgYWZmZWN0cyBtZXNoZXMgd2l0aCBsYW1iZXJ0IGFuZCBwaG9uZyBtYXRlcmlhbC5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9leGFtcGxlcy93ZWJnbF9saWdodHNfc3BvdGxpZ2h0Lmh0bWxcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zPXtsaWdodDoge2NvbG9yOiAweGZmZmZmZiwgaW50ZW5zaXR5OiAxLCBkaXN0YW5jZTogMTAwLCBhbmdsZTogTWF0aC5QSSAvIDMsIGV4cG9uZW50OiAwLCBkZWNheTogMX19XSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5MaWdodENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL2xpZ2h0c1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBTcG90TGlnaHQgdGhhdCBmYWxscyBkb3duIGZyb20gdmVjMygxMCwgMjAsIDEwKSB0byB2ZWMzKDAsIDAsIDApPC9jYXB0aW9uPlxuICogbmV3IFNwb3RMaWdodCh7XG4gKiAgIGNvbG9yOiAweDAwZmYwMCxcbiAqICAgaW50ZW5zaXR5OiAzLFxuICogICBkaXN0YW5jZTogMTAwMFxuICpcbiAqICAgcG9zaXRpb246IFsxMCwgMjAsIDEwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgU3BvdExpZ2h0JDEgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9MaWdodENvbXBvbmVudCkge1xuICBmdW5jdGlvbiBTcG90TGlnaHQkJDEoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTcG90TGlnaHQkJDEpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoU3BvdExpZ2h0JCQxKS5jYWxsKHRoaXMsIHBhcmFtcywgU3BvdExpZ2h0JCQxLmRlZmF1bHRzKSk7XG5cbiAgICBfdGhpcy53cmFwU2hhZG93KCk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhTcG90TGlnaHQkJDEsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGxpZ2h0OiBuZXcgU3BvdExpZ2h0KHBhcmFtcy5jb2xvciwgcGFyYW1zLmludGVuc2l0eSwgcGFyYW1zLmRpc3RhbmNlLCBwYXJhbXMuYW5nbGUsIHBhcmFtcy5leHBvbmVudCwgcGFyYW1zLmRlY2F5KVxuICAgICAgfSkubGlnaHQ7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoU3BvdExpZ2h0JCQxLCBfTGlnaHRDb21wb25lbnQpO1xuXG4gIHJldHVybiBTcG90TGlnaHQkJDE7XG59KExpZ2h0Q29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhTcG90TGlnaHQkMSwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIExpZ2h0Q29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGNvbG9yOiAweGZmZmZmZixcbiAgaW50ZW5zaXR5OiAxLFxuICBkaXN0YW5jZTogMTAwLFxuICBhbmdsZTogTWF0aC5QSSAvIDMsXG4gIGV4cG9uZW50OiAwLFxuICBkZWNheTogMVxufSkpO1xuXG52YXIgQXJlYUxpZ2h0ID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTGlnaHRDb21wb25lbnQpIHtcbiAgZnVuY3Rpb24gQXJlYUxpZ2h0KCkge1xuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQXJlYUxpZ2h0KTtcblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoQXJlYUxpZ2h0KS5jYWxsKHRoaXMsIHBhcmFtcywgQXJlYUxpZ2h0LmRlZmF1bHRzKSk7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhBcmVhTGlnaHQsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGxpZ2h0OiBuZXcgUmVjdEFyZWFMaWdodChwYXJhbXMuY29sb3IsIHBhcmFtcy5pbnRlbnNpdHksIHBhcmFtcy53aWR0aCwgcGFyYW1zLmhlaWdodClcbiAgICAgIH0pLmxpZ2h0O1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKEFyZWFMaWdodCwgX0xpZ2h0Q29tcG9uZW50KTtcblxuICByZXR1cm4gQXJlYUxpZ2h0O1xufShMaWdodENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoQXJlYUxpZ2h0LCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTGlnaHRDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgY29sb3I6IDB4ZmZmZmZmLFxuICBpbnRlbnNpdHk6IDEsXG4gIHdpZHRoOiAxMCxcbiAgaGVpZ2h0OiAxMFxufSkpO1xuXG4vKiogQG1vZHVsZSBjb21wb25lbnRzL2xpZ2h0cyAqL1xuXG4vKipcbiAqIEBjbGFzcyBDdWJlQ2FtZXJhXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9jYW1lcmFzXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyA2IGNhbWVyYXMgdGhhdCByZW5kZXIgdG8gYSBXZWJHTFJlbmRlclRhcmdldEN1YmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbWV0ZXJzIG9iamVjdC5cbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9jYW1lcmFzXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5DYW1lcmFDb21wb25lbnRcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0ZXMgYSBDdWJlQ2FtZXJhIGFuZCBzZXQgaXQgYXMgYXBwJ3MgY2FtZXJhPC9jYXB0aW9uPlxuICogY29uc3QgY2FtZXJhID0gbmV3IEN1YmVDYW1lcmEoe1xuICogICBjYW1lcmE6IHtcbiAqICAgICBjdWJlUmVzb2x1dGlvbjogMjU2XG4gKiAgIH0sXG4gKlxuICogICBwb3NpdGlvbjoge1xuICogICAgIHg6IDAsXG4gKiAgICAgeTogMTAwLFxuICogICAgIHo6IDBcbiAqICAgfVxuICogfSk7XG4gKlxuICogYXBwLmNhbWVyYSA9IGNhbWVyYTtcbiAqL1xuXG52YXIgQ3ViZUNhbWVyYSQxID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfQ2FtZXJhQ29tcG9uZW50KSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL2NhbWVyYXMuQ3ViZUNhbWVyYSNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBjYW1lcmE6IHtcbiAgICogICAgIG5lYXI6IDEsXG4gICAqICAgICBmYXI6IDEwMDAsXG4gICAqICAgICBjdWJlUmVzb2x1dGlvbjogMTI4XG4gICAqICAgfVxuICAgKiB9PC9wcmU+XG4gICAqL1xuICBmdW5jdGlvbiBDdWJlQ2FtZXJhJCQxKCkge1xuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ3ViZUNhbWVyYSQkMSk7XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKEN1YmVDYW1lcmEkJDEpLmNhbGwodGhpcywgcGFyYW1zLCBDdWJlQ2FtZXJhJCQxLmRlZmF1bHRzKSk7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhDdWJlQ2FtZXJhJCQxLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBjYW1lcmE6IG5ldyBDdWJlQ2FtZXJhKHBhcmFtcy5uZWFyLCBwYXJhbXMuZmFyLCBwYXJhbXMuY3ViZVJlc29sdXRpb24pXG4gICAgICB9KS5jYW1lcmE7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoQ3ViZUNhbWVyYSQkMSwgX0NhbWVyYUNvbXBvbmVudCk7XG5cbiAgcmV0dXJuIEN1YmVDYW1lcmEkJDE7XG59KENhbWVyYUNvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoQ3ViZUNhbWVyYSQxLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgQ2FtZXJhQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIG5lYXI6IDEsXG4gIGZhcjogMTAwMCxcbiAgY3ViZVJlc29sdXRpb246IDEyOFxufSkpO1xuXG4vKipcbiAqIEBjbGFzcyBPcnRob2dyYXBoaWNDYW1lcmFcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL2NhbWVyYXNcbiAqIEBkZXNjcmlwdGlvbiBDYW1lcmEgd2l0aCBvcnRob2dyYXBoaWMgcHJvamVjdGlvbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbWV0ZXJzIG9iamVjdC5cbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9jYW1lcmFzXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5DYW1lcmFDb21wb25lbnRcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0ZSBhbiBPcnRob2dyYXBoaWNDYW1lcmEgYW5kIHNldCBpdCBhcyBhcHAncyBjYW1lcmE8L2NhcHRpb24+XG4gKiBjb25zdCBjYW1lcmEgPSBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKHtcbiAqICAgY2FtZXJhOiB7XG4gKiAgICAgZmFyOiAxMDAwMFxuICogICB9LFxuICpcbiAqICAgcG9zaXRpb246IHtcbiAqICAgICB5OiA1MFxuICogICB9XG4gKiB9KTtcbiAqXG4gKiBhcHAuY2FtZXJhID0gY2FtZXJhO1xuICovXG5cbnZhciBPcnRob2dyYXBoaWNDYW1lcmEkMSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0NhbWVyYUNvbXBvbmVudCkge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9jYW1lcmFzLk9ydGhvZ3JhcGhpY0NhbWVyYSNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBuZWFyOiAxLFxuICAgKiAgIGZhcjogMTAwMCxcbiAgICogICBsZWZ0OiBzeXN0ZW0ud2luZG93LmlubmVyV2lkdGggLyAtMixcbiAgICogICByaWdodDogc3lzdGVtLndpbmRvdy5pbm5lcldpZHRoIC8gMixcbiAgICogICB0b3A6IHN5c3RlbS53aW5kb3cuaW5uZXJIZWlnaHQgLyAyLFxuICAgKiAgIGJvdHRvbTogc3lzdGVtLndpbmRvdy5pbm5lckhlaWdodCAvIC0yXG4gICAqIH08L3ByZT5cbiAgICovXG4gIGZ1bmN0aW9uIE9ydGhvZ3JhcGhpY0NhbWVyYSQkMSgpIHtcbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIE9ydGhvZ3JhcGhpY0NhbWVyYSQkMSk7XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKE9ydGhvZ3JhcGhpY0NhbWVyYSQkMSkuY2FsbCh0aGlzLCBwYXJhbXMsIE9ydGhvZ3JhcGhpY0NhbWVyYSQkMS5kZWZhdWx0cykpO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoT3J0aG9ncmFwaGljQ2FtZXJhJCQxLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBjYW1lcmE6IG5ldyBPcnRob2dyYXBoaWNDYW1lcmEocGFyYW1zLmxlZnQsIHBhcmFtcy5yaWdodCwgcGFyYW1zLnRvcCwgcGFyYW1zLmJvdHRvbSwgcGFyYW1zLm5lYXIsIHBhcmFtcy5mYXIpXG4gICAgICB9KS5jYW1lcmE7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoT3J0aG9ncmFwaGljQ2FtZXJhJCQxLCBfQ2FtZXJhQ29tcG9uZW50KTtcblxuICByZXR1cm4gT3J0aG9ncmFwaGljQ2FtZXJhJCQxO1xufShDYW1lcmFDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKE9ydGhvZ3JhcGhpY0NhbWVyYSQxLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgQ2FtZXJhQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIG5lYXI6IDEsXG4gIGZhcjogMTAwMCxcbiAgbGVmdDogc3lzdGVtLndpbmRvdy5pbm5lcldpZHRoIC8gLTIsXG4gIHJpZ2h0OiBzeXN0ZW0ud2luZG93LmlubmVyV2lkdGggLyAyLFxuICB0b3A6IHN5c3RlbS53aW5kb3cuaW5uZXJIZWlnaHQgLyAyLFxuICBib3R0b206IHN5c3RlbS53aW5kb3cuaW5uZXJIZWlnaHQgLyAtMlxufSkpO1xuXG4vKipcbiAqIEBjbGFzcyBQZXJzcGVjdGl2ZUNhbWVyYVxuICogQGRlc2NyaXB0aW9uIENhbWVyYSB3aXRoIHBlcnNwZWN0aXZlIHByb2plY3Rpb24uXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9jYW1lcmFzXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1ldGVycyBvYmplY3QuXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvY2FtZXJhc1xuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuQ2FtZXJhQ29tcG9uZW50XG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGUgYW4gUGVyc3BlY3RpdmVDYW1lcmEgYW5kIHNldCBpdCBhcyBhcHAncyBjYW1lcmE8L2NhcHRpb24+XG4gKiBjb25zdCBjYW1lcmEgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoe1xuICogICBmb3Y6IDc1LFxuICogICBhc3BlY3Q6IHdpbmRvdy5pbm5lcldpZHRoIC8gd2luZG93LmlubmVySGVpZ2h0LFxuICpcbiAqICAgcG9zaXRpb246IHtcbiAqICAgICB4OiAwLFxuICogICAgIHk6IDEwMCxcbiAqICAgICB6OiAwXG4gKiAgIH1cbiAqIH0pO1xuICpcbiAqIGFwcC5jYW1lcmEgPSBjYW1lcmE7XG4gKi9cblxudmFyIFBlcnNwZWN0aXZlQ2FtZXJhJDEgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9DYW1lcmFDb21wb25lbnQpIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvY2FtZXJhcy5QZXJzcGVjdGl2ZUNhbWVyYSNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBuZWFyOiAxLFxuICAgKiAgIGZhcjogMTAwMCxcbiAgICogICBmb3Y6IDc1LFxuICAgKiAgIGFzcGVjdDogc3lzdGVtLndpbmRvdy5pbm5lcldpZHRoIC8gc3lzdGVtLndpbmRvdy5pbm5lckhlaWdodFxuICAgKiB9PC9wcmU+XG4gICAqL1xuICBmdW5jdGlvbiBQZXJzcGVjdGl2ZUNhbWVyYSQkMSgpIHtcbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFBlcnNwZWN0aXZlQ2FtZXJhJCQxKTtcblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoUGVyc3BlY3RpdmVDYW1lcmEkJDEpLmNhbGwodGhpcywgcGFyYW1zLCBQZXJzcGVjdGl2ZUNhbWVyYSQkMS5kZWZhdWx0cykpO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoUGVyc3BlY3RpdmVDYW1lcmEkJDEsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGNhbWVyYTogbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKHBhcmFtcy5mb3YsIHBhcmFtcy5hc3BlY3QsIHBhcmFtcy5uZWFyLCBwYXJhbXMuZmFyKVxuICAgICAgfSkuY2FtZXJhO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFBlcnNwZWN0aXZlQ2FtZXJhJCQxLCBfQ2FtZXJhQ29tcG9uZW50KTtcblxuICByZXR1cm4gUGVyc3BlY3RpdmVDYW1lcmEkJDE7XG59KENhbWVyYUNvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoUGVyc3BlY3RpdmVDYW1lcmEkMSwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIENhbWVyYUNvbXBvbmVudC5kZWZhdWx0cywge1xuICBuZWFyOiAxLFxuICBmYXI6IDEwMDAsXG4gIGZvdjogNzUsXG4gIGFzcGVjdDogc3lzdGVtLndpbmRvdy5pbm5lcldpZHRoIC8gc3lzdGVtLndpbmRvdy5pbm5lckhlaWdodFxufSkpO1xuXG4vKiogQG1vZHVsZSBjb21wb25lbnRzL2NhbWVyYXMgKi9cblxuLyoqXG4gKiBAY2xhc3MgQm94XG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBBcyB0b2xkIG9uIENvbXBvbmVudCBkZWZpbml0aW9uLCB3aGlsZSB5b3UgY2FuIHBhc3MgYW55IG9mIHRoZSBpbmhlcml0ZWQgcGFyYW1zIGZvciB0aGlzIGNvbXBvbmVudCBjb25zdHJ1Y3Rpb24sIHlvdSB3aWxsIG5lZWQgdG9cbiAqIHBhc3Mgc3BlY2lmaWMgcGFyYW1ldGVycyB0byBidWlsZCB0aGlzIG1lc2ggYXMgYSBnZW9tZXRyeSBvYmplY3QuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI0JveEdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBCb3gsIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogIG5ldyBCb3goe1xuICogICAgZ2VvbWV0cnk6IHtcbiAqICAgICAgd2lkdGg6IDIsXG4gKiAgICAgIGhlaWdodDogMixcbiAqICAgICAgZGVwdGg6IDJcbiAqICAgIH0sXG4gKlxuICogICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgIGNvbG9yOiAweGZmZmZmZlxuICogICAgfSksXG4gKlxuICogICAgcG9zaXRpb246IFs1MCwgNjAsIDcwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgQm94ID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTWVzaENvbXBvbmVudCkge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuQm94I2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICB3aWR0aDogMSxcbiAgICogICAgIGhlaWdodDogMSxcbiAgICogICAgIGRlcHRoOiAxLFxuICAgKiAgICAgd2lkdGhTZWdtZW50czogMSxcbiAgICogICAgIGhlaWdodFNlZ21lbnRzOiAxLFxuICAgKiAgICAgZGVwdGhTZWdtZW50czogMVxuICAgKiAgIH1cbiAgICogfTwvcHJlPlxuICAgKi9cblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkJveCNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCBnZW9tZXRyeTogWyd3aWR0aCcsICdoZWlnaHQnLCAnZGVwdGgnLCAnd2lkdGhTZWdtZW50cycsICdoZWlnaHRTZWdtZW50cycsICdkZXB0aFNlZ2VtZW50cyddXG4gICAqL1xuICBmdW5jdGlvbiBCb3goKSB7XG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBCb3gpO1xuXG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihCb3gpLmNhbGwodGhpcywgcGFyYW1zLCBCb3guZGVmYXVsdHMsIEJveC5pbnN0cnVjdGlvbnMpKTtcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkJveFxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKEJveCwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLnBhcmFtcztcblxuICAgICAgdmFyIF90aGlzJGFwcGx5QnJpZGdlID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgfSksXG4gICAgICAgICAgZ2VvbWV0cnkgPSBfdGhpcyRhcHBseUJyaWRnZS5nZW9tZXRyeSxcbiAgICAgICAgICBtYXRlcmlhbCA9IF90aGlzJGFwcGx5QnJpZGdlLm1hdGVyaWFsO1xuXG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIG1lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbClcbiAgICAgIH0pLm1lc2g7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJ1aWxkR2VvbWV0cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRHZW9tZXRyeSgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgdmFyIGdlb21ldHJ5ID0gbmV3IChwYXJhbXMuYnVmZmVyID8gQm94QnVmZmVyR2VvbWV0cnkgOiBCb3hHZW9tZXRyeSkocGFyYW1zLmdlb21ldHJ5LndpZHRoLCBwYXJhbXMuZ2VvbWV0cnkuaGVpZ2h0LCBwYXJhbXMuZ2VvbWV0cnkuZGVwdGgsIHBhcmFtcy5nZW9tZXRyeS53aWR0aFNlZ21lbnRzLCBwYXJhbXMuZ2VvbWV0cnkuaGVpZ2h0U2VnbWVudHMsIHBhcmFtcy5nZW9tZXRyeS5kZXB0aFNlZ21lbnRzKTtcbiAgICAgIHJldHVybiBnZW9tZXRyeTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhCb3gsIF9NZXNoQ29tcG9uZW50KTtcblxuICByZXR1cm4gQm94O1xufShNZXNoQ29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKEJveCwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgZ2VvbWV0cnk6IHtcbiAgICB3aWR0aDogMSxcbiAgICBoZWlnaHQ6IDEsXG4gICAgZGVwdGg6IDEsXG4gICAgd2lkdGhTZWdtZW50czogMSxcbiAgICBoZWlnaHRTZWdtZW50czogMSxcbiAgICBkZXB0aFNlZ21lbnRzOiAxXG4gIH1cbn0pKSwgXCJpbnN0cnVjdGlvbnNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucywge1xuICBnZW9tZXRyeTogWyd3aWR0aCcsICdoZWlnaHQnLCAnZGVwdGgnLCAnd2lkdGhTZWdtZW50cycsICdoZWlnaHRTZWdtZW50cycsICdkZXB0aFNlZ2VtZW50cyddXG59KSk7XG5cbi8qKlxuICogQGNsYXNzIENpcmNsZVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gQXMgdG9sZCBvbiBDb21wb25lbnQgZGVmaW5pdGlvbiwgd2hpbGUgeW91IGNhbiBwYXNzIGFueSBvZiB0aGUgaW5oZXJpdGVkIHBhcmFtcyBmb3IgdGhpcyBjb21wb25lbnQgY29uc3RydWN0aW9uLCB5b3Ugd2lsbCBuZWVkIHRvXG4gKiBwYXNzIHNwZWNpZmljIHBhcmFtZXRlcnMgdG8gYnVpbGQgdGhpcyBtZXNoIGFzIGEgZ2VvbWV0cnkgb2JqZWN0LlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNDaXJjbGVHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgQ2lyY2xlLCBhbmQgYWRkaW5nIHRvIGFwcDwvY2FwdGlvbj5cbiAqICBuZXcgQ2lyY2xlKHtcbiAqICAgIGdlb21ldHJ5OiB7XG4gKiAgICAgIHJhZGl1czogNCxcbiAqICAgICAgc2VnbWVudHM6IDE2XG4gKiAgICB9LFxuICpcbiAqICAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgIH0pLFxuICpcbiAqICAgIHBvc2l0aW9uOiBbNTAsIDYwLCA3MF1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIENpcmNsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX01lc2hDb21wb25lbnQpIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkNpcmNsZSNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgcmFkaXVzOiA1MCxcbiAgICogICAgIHNlZ21lbnRzOiA4LFxuICAgKiAgICAgdGhldGFTdGFydDogMCxcbiAgICogICAgIHRoZXRhTGVuZ3RoOiBNYXRoLlBJICogMlxuICAgKiAgIH1cbiAgICogfTwvcHJlPlxuICAgKi9cblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkNpcmNsZSNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCBnZW9tZXRyeTogWydyYWRpdXMnLCAnc2VnbWVudHMnLCAndGhldGFTdGFydCcsICd0aGV0YUxlbmd0aCddXG4gICAqL1xuICBmdW5jdGlvbiBDaXJjbGUoKSB7XG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDaXJjbGUpO1xuXG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihDaXJjbGUpLmNhbGwodGhpcywgcGFyYW1zLCBDaXJjbGUuZGVmYXVsdHMsIENpcmNsZS5pbnN0cnVjdGlvbnMpKTtcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkNpcmNsZVxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKENpcmNsZSwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLnBhcmFtcztcblxuICAgICAgdmFyIF90aGlzJGFwcGx5QnJpZGdlID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgfSksXG4gICAgICAgICAgZ2VvbWV0cnkgPSBfdGhpcyRhcHBseUJyaWRnZS5nZW9tZXRyeSxcbiAgICAgICAgICBtYXRlcmlhbCA9IF90aGlzJGFwcGx5QnJpZGdlLm1hdGVyaWFsO1xuXG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIG1lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbClcbiAgICAgIH0pLm1lc2g7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJ1aWxkR2VvbWV0cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRHZW9tZXRyeSgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgdmFyIGdlb21ldHJ5ID0gbmV3IChwYXJhbXMuYnVmZmVyID8gQ2lyY2xlQnVmZmVyR2VvbWV0cnkgOiBDaXJjbGVHZW9tZXRyeSkocGFyYW1zLmdlb21ldHJ5LnJhZGl1cywgcGFyYW1zLmdlb21ldHJ5LnNlZ21lbnRzLCBwYXJhbXMuZ2VvbWV0cnkudGhldGFTdGFydCwgcGFyYW1zLmdlb21ldHJ5LnRoZXRhTGVuZ3RoKTtcbiAgICAgIHJldHVybiBnZW9tZXRyeTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhDaXJjbGUsIF9NZXNoQ29tcG9uZW50KTtcblxuICByZXR1cm4gQ2lyY2xlO1xufShNZXNoQ29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKENpcmNsZSwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgZ2VvbWV0cnk6IHtcbiAgICByYWRpdXM6IDUwLFxuICAgIHNlZ21lbnRzOiA4LFxuICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAgdGhldGFMZW5ndGg6IE1hdGguUEkgKiAyXG4gIH1cbn0pKSwgXCJpbnN0cnVjdGlvbnNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucywge1xuICBnZW9tZXRyeTogWydyYWRpdXMnLCAnc2VnbWVudHMnLCAndGhldGFTdGFydCcsICd0aGV0YUxlbmd0aCddXG59KSk7XG5cbi8qKlxuICogQGNsYXNzIENvbmVcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIEEgY3lsaW5kZXIgaXMgb25lIG9mIHRoZSBtb3N0IGJhc2ljIGN1cnZpbGluZWFyIGdlb21ldHJpYyBzaGFwZXMsIHRoZSBzdXJmYWNlIGZvcm1lZCBieSB0aGUgcG9pbnRzIGF0IGEgZml4ZWQgZGlzdGFuY2UgZnJvbSBhIGdpdmVuIHN0cmFpZ2h0IGxpbmUsIHRoZSBheGlzIG9mIHRoZSBjeWxpbmRlci4gPGJyLz48YnIvPlxuICogVGhlIHNvbGlkIGVuY2xvc2VkIGJ5IHRoaXMgc3VyZmFjZSBhbmQgYnkgdHdvIHBsYW5lcyBwZXJwZW5kaWN1bGFyIHRvIHRoZSBheGlzIGlzIGFsc28gY2FsbGVkIGEgY3lsaW5kZXIuPGJyLz5cbiAqIFRoZSBzdXJmYWNlIGFyZWEgYW5kIHRoZSB2b2x1bWUgb2YgYSBjeWxpbmRlciBoYXZlIGJlZW4ga25vd24gc2luY2UgZGVlcCBhbnRpcXVpdHkuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI0NvbmVHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgQ29uZSwgYW5kIGFkZGluZyB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgQ29uZSh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcmFkaXVzVG9wOiAyLFxuICogICAgIHJhZGl1c0JvdHRvbTogNCxcbiAqICAgICBoZWlnaHQ6IDVcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqXG4gKiAgIHBvczogWzAsIDEwMCwgMF1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIENvbmUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9NZXNoQ29tcG9uZW50KSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Db25lI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICByYWRpdXM6IDIwLFxuICAgKiAgICAgaGVpZ2h0OiAxMDAsXG4gICAqICAgICByYWRpdXNTZWdtZW50czogMzIsXG4gICAqICAgICBoZWlnaHRTZWdtZW50czogMSxcbiAgICogICAgIG9wZW5FbmRlZDogZmFsc2UsXG4gICAqICAgICB0aGV0YVN0YXJ0OiAwLFxuICAgKiAgICAgdGhldGFMZW5ndGg6IE1hdGguUEkgKiAyXG4gICAqICAgfVxuICAgKiB9PC9wcmU+XG4gICAqL1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuQ29uZSNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiBnZW9tZXRyeTogW1xuICAgKiAgICdyYWRpdXMnLFxuICAgKiAgICdoZWlnaHQnLFxuICAgKiAgICdyYWRpdXNTZWdtZW50cycsXG4gICAqICAgJ2hlaWdodFNlZ21lbnRzJyxcbiAgICogICAnb3BlbkVuZGVkJyxcbiAgICogICAndGhldGFTdGFydCcsXG4gICAqICAgJ3RoZXRhTGVuZ3RoJ1xuICAgKiBdXG4gICAqIDwvcHJlPlxuICAgKi9cbiAgZnVuY3Rpb24gQ29uZSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIENvbmUpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoQ29uZSkuY2FsbCh0aGlzLCBwYXJhbXMsIENvbmUuZGVmYXVsdHMsIENvbmUuaW5zdHJ1Y3Rpb25zKSk7XG5cbiAgICBpZiAocGFyYW1zLmJ1aWxkKSB7XG4gICAgICBfdGhpcy5idWlsZChwYXJhbXMpO1xuXG4gICAgICBnZXQkMyhnZXRQcm90b3R5cGVPZiQyKENvbmUucHJvdG90eXBlKSwgXCJ3cmFwXCIsIGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpLmNhbGwoYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuQ29uZVxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKENvbmUsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy5wYXJhbXM7XG5cbiAgICAgIHZhciBfdGhpcyRhcHBseUJyaWRnZSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgIH0pLFxuICAgICAgICAgIGdlb21ldHJ5ID0gX3RoaXMkYXBwbHlCcmlkZ2UuZ2VvbWV0cnksXG4gICAgICAgICAgbWF0ZXJpYWwgPSBfdGhpcyRhcHBseUJyaWRnZS5tYXRlcmlhbDtcblxuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBtZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpXG4gICAgICB9KS5tZXNoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJidWlsZEdlb21ldHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkR2VvbWV0cnkoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyAocGFyYW1zLmJ1ZmZlciA/IENvbmVCdWZmZXJHZW9tZXRyeSA6IENvbmVHZW9tZXRyeSkocGFyYW1zLmdlb21ldHJ5LnJhZGl1cywgcGFyYW1zLmdlb21ldHJ5LmhlaWdodCwgcGFyYW1zLmdlb21ldHJ5LnJhZGl1c1NlZ21lbnRzLCBwYXJhbXMuZ2VvbWV0cnkuaGVpZ2h0U2VnbWVudHMsIHBhcmFtcy5nZW9tZXRyeS5vcGVuRW5kZWQsIHBhcmFtcy5nZW9tZXRyeS50aGV0YVN0YXJ0LCBwYXJhbXMuZ2VvbWV0cnkudGhldGFMZW5ndGgpO1xuICAgICAgcmV0dXJuIGdlb21ldHJ5O1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKENvbmUsIF9NZXNoQ29tcG9uZW50KTtcblxuICByZXR1cm4gQ29uZTtcbn0oTWVzaENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhDb25lLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5kZWZhdWx0cywge1xuICBnZW9tZXRyeToge1xuICAgIHJhZGl1czogMjAsXG4gICAgaGVpZ2h0OiAxMDAsXG4gICAgcmFkaXVzU2VnbWVudHM6IDMyLFxuICAgIGhlaWdodFNlZ21lbnRzOiAxLFxuICAgIG9wZW5FbmRlZDogZmFsc2UsXG4gICAgdGhldGFTdGFydDogMCxcbiAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgfVxufSkpLCBcImluc3RydWN0aW9uc1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLCB7XG4gIGdlb21ldHJ5OiBbJ3JhZGl1cycsICdoZWlnaHQnLCAncmFkaXVzU2VnbWVudHMnLCAnaGVpZ2h0U2VnbWVudHMnLCAnb3BlbkVuZGVkJywgJ3RoZXRhU3RhcnQnLCAndGhldGFMZW5ndGgnXVxufSkpO1xuXG4vKipcbiAqIEBjbGFzcyBDeWxpbmRlclxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gQSBjeWxpbmRlciBpcyBvbmUgb2YgdGhlIG1vc3QgYmFzaWMgY3VydmlsaW5lYXIgZ2VvbWV0cmljIHNoYXBlcywgdGhlIHN1cmZhY2UgZm9ybWVkIGJ5IHRoZSBwb2ludHMgYXQgYSBmaXhlZCBkaXN0YW5jZSBmcm9tIGEgZ2l2ZW4gc3RyYWlnaHQgbGluZSwgdGhlIGF4aXMgb2YgdGhlIGN5bGluZGVyLiA8YnIvPjxici8+XG4gKiBUaGUgc29saWQgZW5jbG9zZWQgYnkgdGhpcyBzdXJmYWNlIGFuZCBieSB0d28gcGxhbmVzIHBlcnBlbmRpY3VsYXIgdG8gdGhlIGF4aXMgaXMgYWxzbyBjYWxsZWQgYSBjeWxpbmRlci48YnIvPlxuICogVGhlIHN1cmZhY2UgYXJlYSBhbmQgdGhlIHZvbHVtZSBvZiBhIGN5bGluZGVyIGhhdmUgYmVlbiBrbm93biBzaW5jZSBkZWVwIGFudGlxdWl0eS5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjQ3lsaW5kZXJHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgQ3lsaW5kZXIsIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IEN5bGluZGVyKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICByYWRpdXNUb3A6IDIsXG4gKiAgICAgcmFkaXVzQm90dG9tOiA0LFxuICogICAgIGhlaWdodDogNVxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zOiBbMCwgMTAwLCAwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgQ3lsaW5kZXIgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9NZXNoQ29tcG9uZW50KSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5DeWxpbmRlciNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgcmFkaXVzVG9wOiAyMCxcbiAgICogICAgIHJhZGl1c0JvdHRvbTogMjAsXG4gICAqICAgICBoZWlnaHQ6IDEwMCxcbiAgICogICAgIHJhZGl1c1NlZ21lbnRzOiAzMixcbiAgICogICAgIGhlaWdodFNlZ21lbnRzOiAxLFxuICAgKiAgICAgb3BlbkVuZGVkOiBmYWxzZSxcbiAgICogICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAqICAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgICogICB9XG4gICAqIH08L3ByZT5cbiAgICovXG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5DeWxpbmRlciNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiBnZW9tZXRyeTogW1xuICAgKiAgICdyYWRpdXNUb3AnLFxuICAgKiAgICdyYWRpdXNCb3R0b20nLFxuICAgKiAgICdoZWlnaHQnLFxuICAgKiAgICdyYWRpdXNTZWdtZW50cycsXG4gICAqICAgJ2hlaWdodFNlZ21lbnRzJyxcbiAgICogICAnb3BlbkVuZGVkJyxcbiAgICogICAndGhldGFTdGFydCcsXG4gICAqICAgJ3RoZXRhTGVuZ3RoJ1xuICAgKiBdXG4gICAqIDwvcHJlPlxuICAgKi9cbiAgZnVuY3Rpb24gQ3lsaW5kZXIoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDeWxpbmRlcik7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihDeWxpbmRlcikuY2FsbCh0aGlzLCBwYXJhbXMsIEN5bGluZGVyLmRlZmF1bHRzLCBDeWxpbmRlci5pbnN0cnVjdGlvbnMpKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIF90aGlzLmJ1aWxkKHBhcmFtcyk7XG5cbiAgICAgIGdldCQzKGdldFByb3RvdHlwZU9mJDIoQ3lsaW5kZXIucHJvdG90eXBlKSwgXCJ3cmFwXCIsIGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpLmNhbGwoYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuQ3lsaW5kZXJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhDeWxpbmRlciwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLnBhcmFtcztcblxuICAgICAgdmFyIF90aGlzJGFwcGx5QnJpZGdlID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgfSksXG4gICAgICAgICAgZ2VvbWV0cnkgPSBfdGhpcyRhcHBseUJyaWRnZS5nZW9tZXRyeSxcbiAgICAgICAgICBtYXRlcmlhbCA9IF90aGlzJGFwcGx5QnJpZGdlLm1hdGVyaWFsO1xuXG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIG1lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbClcbiAgICAgIH0pLm1lc2g7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJ1aWxkR2VvbWV0cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRHZW9tZXRyeSgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgdmFyIGdlb21ldHJ5ID0gbmV3IChwYXJhbXMuYnVmZmVyID8gQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSA6IEN5bGluZGVyR2VvbWV0cnkpKHBhcmFtcy5nZW9tZXRyeS5yYWRpdXNUb3AsIHBhcmFtcy5nZW9tZXRyeS5yYWRpdXNCb3R0b20sIHBhcmFtcy5nZW9tZXRyeS5oZWlnaHQsIHBhcmFtcy5nZW9tZXRyeS5yYWRpdXNTZWdtZW50cywgcGFyYW1zLmdlb21ldHJ5LmhlaWdodFNlZ21lbnRzLCBwYXJhbXMuZ2VvbWV0cnkub3BlbkVuZGVkLCBwYXJhbXMuZ2VvbWV0cnkudGhldGFTdGFydCwgcGFyYW1zLmdlb21ldHJ5LnRoZXRhTGVuZ3RoKTtcbiAgICAgIHJldHVybiBnZW9tZXRyeTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhDeWxpbmRlciwgX01lc2hDb21wb25lbnQpO1xuXG4gIHJldHVybiBDeWxpbmRlcjtcbn0oTWVzaENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhDeWxpbmRlciwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgZ2VvbWV0cnk6IHtcbiAgICByYWRpdXNUb3A6IDAsXG4gICAgcmFkaXVzQm90dG9tOiAxLFxuICAgIGhlaWdodDogMSxcbiAgICByYWRpdXNTZWdtZW50czogMzIsXG4gICAgaGVpZ2h0U2VnbWVudHM6IDEsXG4gICAgb3BlbkVuZGVkOiBmYWxzZSxcbiAgICB0aGV0YVN0YXJ0OiAwLFxuICAgIHRoZXRhTGVuZ3RoOiBNYXRoLlBJICogMlxuICB9XG59KSksIFwiaW5zdHJ1Y3Rpb25zXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsIHtcbiAgZ2VvbWV0cnk6IFsncmFkaXVzVG9wJywgJ3JhZGl1c0JvdHRvbScsICdoZWlnaHQnLCAncmFkaXVzU2VnbWVudHMnLCAnaGVpZ2h0U2VnbWVudHMnLCAnb3BlbkVuZGVkJywgJ3RoZXRhU3RhcnQnLCAndGhldGFMZW5ndGgnXVxufSkpO1xuXG4vKipcbiAqIEBjbGFzcyBEb2RlY2FoZWRyb25cbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIEluIGdlb21ldHJ5LCBhIGRvZGVjYWhlZHJvbiBpcyBhbnkgcG9seWhlZHJvbiB3aXRoIHR3ZWx2ZSBmbGF0IGZhY2VzLiA8YnIvPjxici8+XG4gKiBUaGUgbW9zdCBmYW1pbGlhciBkb2RlY2FoZWRyb24gaXMgdGhlIHJlZ3VsYXIgZG9kZWNhaGVkcm9uLCB3aGljaCBpcyBhIFBsYXRvbmljIHNvbGlkLiA8YnIvPlxuICogVGhlcmUgYXJlIGFsc28gdGhyZWUgcmVndWxhciBzdGFyIGRvZGVjYWhlZHJhLCB3aGljaCBhcmUgY29uc3RydWN0ZWQgYXMgc3RlbGxhdGlvbnMgb2YgdGhlIGNvbnZleCBmb3JtLiA8YnIvPlxuICogQWxsIG9mIHRoZXNlIGhhdmUgaWNvc2FoZWRyYWwgc3ltbWV0cnksIG9yZGVyIDEyMC5cbiAqIERvZGVjYWhlZHJvbiBjcmVhdGVzIERvZGVjYWhlZHJvbiBvYmplY3QgYnkgaXQncyByYWRpdXMgYW5kIGRldGFpbC5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjRG9kZWNhaGVkcm9uR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIERvZGVjYWhlZHJvbiwgYW5kIGFkZGluZyB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgRG9kZWNhaGVkcm9uKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICByYWRpdXM6IDJcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiB7XG4gKiAgICAgeTogMTBcbiAqICAgfVxuICAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIERvZGVjYWhlZHJvbiA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX01lc2hDb21wb25lbnQpIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkRvZGVjYWhlZHJvbiNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIGdlb21ldHJ5OiB7XG4gICAqICAgcmFkaXVzOiAxLFxuICAgKiAgIGRldGFpbDogMFxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkRvZGVjYWhlZHJvbiNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiBnZW9tZXRyeTogWydyYWRpdXMnLCAnZGV0YWlsJ11cbiAgICogPC9wcmU+XG4gICAqL1xuICBmdW5jdGlvbiBEb2RlY2FoZWRyb24oKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBEb2RlY2FoZWRyb24pO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoRG9kZWNhaGVkcm9uKS5jYWxsKHRoaXMsIHBhcmFtcywgRG9kZWNhaGVkcm9uLmRlZmF1bHRzLCBEb2RlY2FoZWRyb24uaW5zdHJ1Y3Rpb25zKSk7XG5cbiAgICBpZiAocGFyYW1zLmJ1aWxkKSB7XG4gICAgICBfdGhpcy5idWlsZChwYXJhbXMpO1xuXG4gICAgICBnZXQkMyhnZXRQcm90b3R5cGVPZiQyKERvZGVjYWhlZHJvbi5wcm90b3R5cGUpLCBcIndyYXBcIiwgYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSkuY2FsbChhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Eb2RlY2FoZWRyb25cbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhEb2RlY2FoZWRyb24sIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy5wYXJhbXM7XG5cbiAgICAgIHZhciBfdGhpcyRhcHBseUJyaWRnZSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgIH0pLFxuICAgICAgICAgIGdlb21ldHJ5ID0gX3RoaXMkYXBwbHlCcmlkZ2UuZ2VvbWV0cnksXG4gICAgICAgICAgbWF0ZXJpYWwgPSBfdGhpcyRhcHBseUJyaWRnZS5tYXRlcmlhbDtcblxuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBtZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpXG4gICAgICB9KS5tZXNoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJidWlsZEdlb21ldHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkR2VvbWV0cnkoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHJldHVybiBuZXcgKHBhcmFtcy5idWZmZXIgPyBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSA6IERvZGVjYWhlZHJvbkdlb21ldHJ5KShwYXJhbXMuZ2VvbWV0cnkucmFkaXVzLCBwYXJhbXMuZ2VvbWV0cnkuZGV0YWlsKTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhEb2RlY2FoZWRyb24sIF9NZXNoQ29tcG9uZW50KTtcblxuICByZXR1cm4gRG9kZWNhaGVkcm9uO1xufShNZXNoQ29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKERvZGVjYWhlZHJvbiwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgZ2VvbWV0cnk6IHtcbiAgICByYWRpdXM6IDEsXG4gICAgZGV0YWlsOiAwXG4gIH1cbn0pKSwgXCJpbnN0cnVjdGlvbnNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucywge1xuICBnZW9tZXRyeTogWydyYWRpdXMnLCAnZGV0YWlsJ11cbn0pKTtcblxuLyoqXG4gKiBAY2xhc3MgRXh0cnVkZVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gRXh0cnVkZSBnZW9tZXRyeSBtZWFucyB0aGF0IHlvdSBjYW4gY3JlYXRlIGEgM0QgbWVzaCBmcm9tIGFueSAyRCBzaGFwZSB1c2luZyB0aHJlZS5qcyBnZW9tZXRyeSBiYXNlZCBvbiA8YSBocmVmPSdodHRwczovL3RocmVlanMub3JnL2RvY3MvI2FwaS9tYXRoL1ZlY3RvcjInPlRIUkVFLlZlY3RvcjIuPC9hPiA8YnIvPlxuICogU3VjaCBpbXBsZW1lbnRhdGlvbiB3aWxsIGhlbHAgeW91IHRvIG1ha2Ugdm9sdW1lZCBzaGFwZXMgdGhhdCBoYXZlIHRoZWlyIG93biBkZXB0aCBhbmQgY2FuIGJlIHNlZW4gZnJvbSBhbGwgYW5nZWxzLjxici8+PGJyLz5cbiAqIFlvdSBjYW4gYWxzbyBmaW5kIHNvbWUgaW50ZXJlc3RpbmcgZXhhbXBsZXMgbWFkZSB1c2luZyA8YSBocmVmPSd0aHJlZWpzLm9yZyc+dGhyZWUuanM8L2E+IHdoaWNoIGlzIGEgY29yZSBvZiB3aHMuanMsIHN1Y2ggYXM6XG4gKiAtIDxhIGhyZWY9J2h0dHA6Ly90aHJlZWpzLm9yZy9leGFtcGxlcy93ZWJnbF9nZW9tZXRyeV9leHRydWRlX3NoYXBlcy5odG1sJz5XZWJnbCBnZW9tZXRyeSBleHRydWRlPC9hPlxuICogLSA8YSBocmVmPSdodHRwOi8vdGhyZWVqcy5vcmcvZXhhbXBsZXMvd2ViZ2xfZ2VvbWV0cnlfZXh0cnVkZV9zaGFwZXMyLmh0bWwnPkV4dHJ1ZGUgc2hhcGVzIGZyb20gZ2VvZGF0YTwvYT5cbiAqIC0gPGEgaHJlZj0naHR0cDovL3RocmVlanMub3JnL2V4YW1wbGVzL3dlYmdsX2dlb21ldHJ5X2V4dHJ1ZGVfc3BsaW5lcy5odG1sJz5FeHRydWRlIHNwbGluZXM8L2E+XG4gKlxuICogU3VjaCBleGFtcGxlcyBjYW4gYmUgZWFzaWx5IGltcGxlbWVudGVkIHVzaW5nIHdoaXRlc3Rvcm0uanMgb3IgaXQncyBwbHVnaW5zLiBVc2UgYEV4dHJ1ZGVgIGNsYXNzIHdpdGggPGEgaHJlZj0naHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzLyNhcGkvZXh0cmFzL2NvcmUvU2hhcGUnPlRIUkVFLlNoYXBlPC9hPiB0byBnZXQgZXh0cnVkZSBlZmZlY3Qgb2Ygc2hhcGUgZGVmaW5lZCBieSAyRCB2ZWN0b3JzLlxuICogVGhpcyBjbGFzcyBpcyBzaW1pbGFyIHRvIDxhIGhyZWY9J2h0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy8jYXBpL2dlb21ldHJpZXMvRXh0cnVkZUdlb21ldHJ5Jz5USFJFRS5FeHRydWRlR2VvbWV0cnk8L2E+LFxuICogYnV0IGl0IGFsc28gY29udGFpbnMgYWxsIHByb3BlcnRpZXMsIGFwcGxpZWQgYnkgYFNoYXBlYCwgc3VjaCBhcyBtYXRlcmlhbCwgbWFzcyBhbmQgdmVjdG9ycyBsaWtlIHBvc2l0aW9uIChwb3MpIGFuZCByb3RhdGlvbiAocm90KS5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjRXh0cnVkZUdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBzaGFwZSwgdGhlbiBhbiBFeHRydWRlIGZyb20gaXQ8L2NhcHRpb24+XG4gKiBjb25zdCBzaGFwZSA9IG5ldyBUSFJFRS5TaGFwZShbXG4gKiAgIG5ldyBUSFJFRS5WZWN0b3IyKC00LC00KSxcbiAqICAgbmV3IFRIUkVFLlZlY3RvcjIoLTIsMCksXG4gKiAgIG5ldyBUSFJFRS5WZWN0b3IyKC00LDQpLFxuICogICBuZXcgVEhSRUUuVmVjdG9yMigwLDIpLFxuICogICBuZXcgVEhSRUUuVmVjdG9yMig0LDQpLFxuICogICBuZXcgVEhSRUUuVmVjdG9yMigyLDApLFxuICogICBuZXcgVEhSRUUuVmVjdG9yMig0LC00KSxcbiAqICAgbmV3IFRIUkVFLlZlY3RvcjIoMCwtMilcbiAqIF0pO1xuICpcbiAqIGNvbnN0IGV4dHJ1ZGUgPSBuZXcgRXh0cnVkZSh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgc2hhcGVzOiBzaGFwZSxcbiAqICAgICBvcHRpb25zOiB7XG4gKiAgICAgICBiZXZlbEVuYWJsZWQ6IGZhbHNlLFxuICogICAgICAgYmV2ZWxTaXplOiAwLFxuICogICAgICAgYW1vdW50OiAyXG4gKiAgICAgfVxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IFswLCAxMDAsIDBdXG4gKiB9KTtcbiAqXG4gKiBleHRydWRlLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIEV4dHJ1ZGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9NZXNoQ29tcG9uZW50KSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5FeHRydWRlI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICBzaGFwZXM6IFtdLFxuICAgKiAgICAgb3B0aW9uczoge31cbiAgICogICB9XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuRXh0cnVkZSNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IFsnc2hhcGVzJywgJ29wdGlvbnMnXVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgZnVuY3Rpb24gRXh0cnVkZSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEV4dHJ1ZGUpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoRXh0cnVkZSkuY2FsbCh0aGlzLCBwYXJhbXMsIEV4dHJ1ZGUuZGVmYXVsdHMsIEV4dHJ1ZGUuaW5zdHJ1Y3Rpb25zKSk7XG5cbiAgICBpZiAocGFyYW1zLmJ1aWxkKSB7XG4gICAgICBfdGhpcy5idWlsZChwYXJhbXMpO1xuXG4gICAgICBnZXQkMyhnZXRQcm90b3R5cGVPZiQyKEV4dHJ1ZGUucHJvdG90eXBlKSwgXCJ3cmFwXCIsIGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpLmNhbGwoYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuRXh0cnVkZVxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKEV4dHJ1ZGUsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy5wYXJhbXM7XG5cbiAgICAgIHZhciBfdGhpcyRhcHBseUJyaWRnZSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgIH0pLFxuICAgICAgICAgIGdlb21ldHJ5ID0gX3RoaXMkYXBwbHlCcmlkZ2UuZ2VvbWV0cnksXG4gICAgICAgICAgbWF0ZXJpYWwgPSBfdGhpcyRhcHBseUJyaWRnZS5tYXRlcmlhbDtcblxuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBtZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpXG4gICAgICB9KS5tZXNoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJidWlsZEdlb21ldHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkR2VvbWV0cnkoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyBFeHRydWRlR2VvbWV0cnkocGFyYW1zLmdlb21ldHJ5LnNoYXBlcywgcGFyYW1zLmdlb21ldHJ5Lm9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHBhcmFtcy5idWZmZXIgPyBuZXcgQnVmZmVyR2VvbWV0cnkoKS5mcm9tR2VvbWV0cnkoZ2VvbWV0cnkpIDogZ2VvbWV0cnk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoRXh0cnVkZSwgX01lc2hDb21wb25lbnQpO1xuXG4gIHJldHVybiBFeHRydWRlO1xufShNZXNoQ29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKEV4dHJ1ZGUsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGdlb21ldHJ5OiB7XG4gICAgc2hhcGVzOiBbXSxcbiAgICBvcHRpb25zOiB7fVxuICB9XG59KSksIFwiaW5zdHJ1Y3Rpb25zXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsIHtcbiAgZ2VvbWV0cnk6IFsnc2hhcGVzJywgJ29wdGlvbnMnXVxufSkpO1xuXG4vKipcbiAqIEBjbGFzcyBJY29zYWhlZHJvblxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gSW4gZ2VvbWV0cnksIGFuIGljb3NhaGVkcm9uIGlzIGEgcG9seWhlZHJvbiB3aXRoIDIwIGZhY2VzLjxici8+XG4gKiBUaGVyZSBhcmUgbWFueSBraW5kcyBvZiBpY29zYWhlZHJhLCB3aXRoIHNvbWUgYmVpbmcgbW9yZSBzeW1tZXRyaWNhbCB0aGFuIG90aGVycy4gVGhlIG1vc3Qgd2VsbCBrbm93biBpcyB0aGUgUGxhdG9uaWMsIGNvbnZleCByZWd1bGFyIGljb3NhaGVkcm9uLjxici8+XG4gKiBgSWNvc2FoZWRyb25gIGNyZWF0ZXMgYW4gSWNvc2FoZWRyb24gb2JqZWN0IGJ5IGl0cyByYWRpdXMgYW5kIGRldGFpbC5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjSWNvc2FoZWRyb25HZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgSWNvc2FoZWRyb24sIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IEljb3NhaGVkcm9uKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICByYWRpdXM6IDIsXG4gKiAgICAgZGV0YWlsOiAxXG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKlxuICogICBwb3NpdGlvbjogWzAsIDEwMCwgMF1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIEljb3NhaGVkcm9uID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTWVzaENvbXBvbmVudCkge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuSWNvc2FoZWRyb24jZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHJhZGl1czogMSxcbiAgICogICAgIGRldGFpbDogMFxuICAgKiAgIH1cbiAgICogfTwvcHJlPlxuICAgKi9cblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkljb3NhaGVkcm9uI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IHtnZW9tZXRyeTogWydyYWRpdXMnLCAnZGV0YWlsJ119XG4gICAqL1xuICBmdW5jdGlvbiBJY29zYWhlZHJvbigpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEljb3NhaGVkcm9uKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKEljb3NhaGVkcm9uKS5jYWxsKHRoaXMsIHBhcmFtcywgSWNvc2FoZWRyb24uZGVmYXVsdHMsIEljb3NhaGVkcm9uLmluc3RydWN0aW9ucykpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgX3RoaXMuYnVpbGQocGFyYW1zKTtcblxuICAgICAgZ2V0JDMoZ2V0UHJvdG90eXBlT2YkMihJY29zYWhlZHJvbi5wcm90b3R5cGUpLCBcIndyYXBcIiwgYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSkuY2FsbChhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5JY29zYWhlZHJvblxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKEljb3NhaGVkcm9uLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMucGFyYW1zO1xuXG4gICAgICB2YXIgX3RoaXMkYXBwbHlCcmlkZ2UgPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgICB9KSxcbiAgICAgICAgICBnZW9tZXRyeSA9IF90aGlzJGFwcGx5QnJpZGdlLmdlb21ldHJ5LFxuICAgICAgICAgIG1hdGVyaWFsID0gX3RoaXMkYXBwbHlCcmlkZ2UubWF0ZXJpYWw7XG5cbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKVxuICAgICAgfSkubWVzaDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYnVpbGRHZW9tZXRyeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEdlb21ldHJ5KCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSA6IEljb3NhaGVkcm9uR2VvbWV0cnkpKHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsIHBhcmFtcy5nZW9tZXRyeS5kZXRhaWwpO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKEljb3NhaGVkcm9uLCBfTWVzaENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIEljb3NhaGVkcm9uO1xufShNZXNoQ29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKEljb3NhaGVkcm9uLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5kZWZhdWx0cywge1xuICBnZW9tZXRyeToge1xuICAgIHJhZGl1czogMSxcbiAgICBkZXRhaWw6IDBcbiAgfVxufSkpLCBcImluc3RydWN0aW9uc1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLCB7XG4gIGdlb21ldHJ5OiBbJ3JhZGl1cycsICdkZXRhaWwnXVxufSkpO1xuXG4vKipcbiAqIEBjbGFzcyBMYXRoZVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gQSBgTGF0aGVHZW9tZXRyeWAgYWxsb3dzIHlvdSB0byBjcmVhdGUgc2hhcGVzIGZyb20gYSBzbW9vdGggY3VydmUuXG4gKiBUaGlzIGN1cnZlIGlzIGRlZmluZWQgYnkgYSBudW1iZXIgb2YgcG9pbnRzIChhbHNvIGNhbGxlZCBrbm90cykgYW5kIGlzIG1vc3Qgb2Z0ZW4gY2FsbGVkIGEgc3BsaW5lLiBUaGlzIHNwbGluZSBpcyByb3RhdGVkIGFyb3VuZCBhIGZpeGVkIHBvaW50IGFuZCByZXN1bHRzIGluIHZhc2UtIGFuZCBiZWxsLWxpa2Ugc2hhcGVzLjxici8+PGJyLz5cbiAqIEluIDNEIGNvbXB1dGVyIGdyYXBoaWNzLCBhIGxhdGhlZCBvYmplY3QgaXMgYSAzRCBtb2RlbCB3aG9zZSB2ZXJ0ZXggZ2VvbWV0cnkgaXMgcHJvZHVjZWQgYnkgcm90YXRpbmcgdGhlIHBvaW50cyBvZiBhIHNwbGluZSBvciBvdGhlciBwb2ludCBzZXQgYXJvdW5kIGEgZml4ZWQgYXhpcy5cbiAqIFRoZSBsYXRoaW5nIG1heSBiZSBwYXJ0aWFsOyB0aGUgYW1vdW50IG9mIHJvdGF0aW9uIGlzIG5vdCBuZWNlc3NhcmlseSBhIGZ1bGwgMzYwIGRlZ3JlZXMuXG4gKiBUaGUgcG9pbnQgc2V0IHByb3ZpZGluZyB0aGUgaW5pdGlhbCBzb3VyY2UgZGF0YSBjYW4gYmUgdGhvdWdodCBvZiBhcyBhIGNyb3NzIHNlY3Rpb24gdGhyb3VnaCB0aGUgb2JqZWN0IGFsb25nIGEgcGxhbmUgY29udGFpbmluZyBpdHMgYXhpcyBvZiByYWRpYWwgc3ltbWV0cnkuIDxici8+PGJyLz5cbiAqIFRoZSA8YSBocmVmPSdodHRwOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI0xhdGhlR2VvbWV0cnknPmZvbGxvd2luZyBleGFtcGxlPC9hPiBzaG93cyBhIGdlb21ldHJ5IHdoaWNoIGNhbiBiZSBnZW5lcmF0ZWQgdXNpbmcgYExhdGhlYCBjbGFzcy5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjTGF0aGVHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgTGF0aCwgYW5kIGFkZGluZyB0byBhcHA8L2NhcHRpb24+XG4gKiBjb25zdCBwb2ludHMgPSBbXTtcbiAqXG4gKiBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAqICAgcG9pbnRzLnB1c2goXG4gKiAgICAgbmV3IFRIUkVFLlZlY3RvcjIoXG4gKiAgICAgICAoTWF0aC5zaW4oaSAqIDAuNykgKiAxNSArIDUwKSAvIDEwLFxuICogICAgICAgKGkgLSA1KSAqIDAuMlxuICogICAgIClcbiAqICAgKTtcbiAqIH1cbiAqXG4gKiBjb25zdCBsYXRoZSA9IG5ldyBMYXRoZSh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcG9pbnRzOiBwb2ludHNcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiBbMCwgNTAsIDEwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgTGF0aGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9NZXNoQ29tcG9uZW50KSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5MYXRoZSNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgcG9pbnRzOiBbXVxuICAgKiAgIH1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5MYXRoZSNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPntcbiAgICogICBnZW9tZXRyeTogWydwb2ludHMnXVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgZnVuY3Rpb24gTGF0aGUoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBMYXRoZSk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihMYXRoZSkuY2FsbCh0aGlzLCBwYXJhbXMsIExhdGhlLmRlZmF1bHRzLCBMYXRoZS5pbnN0cnVjdGlvbnMpKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIF90aGlzLmJ1aWxkKHBhcmFtcyk7XG5cbiAgICAgIGdldCQzKGdldFByb3RvdHlwZU9mJDIoTGF0aGUucHJvdG90eXBlKSwgXCJ3cmFwXCIsIGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpLmNhbGwoYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuTGF0aGVcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhMYXRoZSwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLnBhcmFtcztcblxuICAgICAgdmFyIF90aGlzJGFwcGx5QnJpZGdlID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgfSksXG4gICAgICAgICAgZ2VvbWV0cnkgPSBfdGhpcyRhcHBseUJyaWRnZS5nZW9tZXRyeSxcbiAgICAgICAgICBtYXRlcmlhbCA9IF90aGlzJGFwcGx5QnJpZGdlLm1hdGVyaWFsO1xuXG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIG1lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbClcbiAgICAgIH0pLm1lc2g7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJ1aWxkR2VvbWV0cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRHZW9tZXRyeSgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgcmV0dXJuIG5ldyAocGFyYW1zLmJ1ZmZlciA/IExhdGhlQnVmZmVyR2VvbWV0cnkgOiBMYXRoZUdlb21ldHJ5KShwYXJhbXMuZ2VvbWV0cnkucG9pbnRzKTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhMYXRoZSwgX01lc2hDb21wb25lbnQpO1xuXG4gIHJldHVybiBMYXRoZTtcbn0oTWVzaENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhMYXRoZSwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgZ2VvbWV0cnk6IHtcbiAgICBwb2ludHM6IFtdXG4gIH1cbn0pKSwgXCJpbnN0cnVjdGlvbnNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucywge1xuICBnZW9tZXRyeTogWydwb2ludHMnXVxufSkpO1xuXG4vKipcbiAqIEBjbGFzcyBMaW5lXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBMaW5lIGNvbXBvbmVudCBpcyBnZW5lcmF0ZWQgZnJvbSBhIGN1cnZlL2xpbmUgYW5kIGFtb3VudCBvZiB2ZWN0b3JzIHRoYXQgc2hvdWxkIGJlIHVzZWQgKHBvaW50cykuXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBMaW5lLCBhbmQgYWRkaW5nIHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBMaW5lKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICBjdXJ2ZTogbmV3IFRIUkVFLkxpbmVDdXJ2ZTMobmV3IFRIUkVFLlZlY3RvcjMoMTAsIDEwLCAwKSwgbmV3IFRIUkVFLlZlY3RvcjMoMTAsIDMwLCAwKSlcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgTGluZSQxID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTWVzaENvbXBvbmVudCkge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuTGluZSNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBjdXJ2ZTogbmV3IExpbmVDdXJ2ZTMobmV3IFZlY3RvcjMoMCwgMCwgMCksIG5ldyBWZWN0b3IzKDEwLCAwLCAwKSksXG4gICAqICAgcG9pbnRzOiA1MFxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkxpbmUjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT57XG4gICAqICAgZ2VvbWV0cnk6IFsnY3VydmUnLCAncG9pbnRzJ11cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIGZ1bmN0aW9uIExpbmUkJDEocGFyYW1zKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgTGluZSQkMSk7XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKExpbmUkJDEpLmNhbGwodGhpcywgcGFyYW1zLCBMaW5lJCQxLmRlZmF1bHRzLCBMaW5lJCQxLmluc3RydWN0aW9ucykpO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuTGluZVxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKExpbmUkJDEsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy5wYXJhbXM7XG5cbiAgICAgIHZhciBfdGhpcyRhcHBseUJyaWRnZSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgIH0pLFxuICAgICAgICAgIGdlb21ldHJ5ID0gX3RoaXMkYXBwbHlCcmlkZ2UuZ2VvbWV0cnksXG4gICAgICAgICAgbWF0ZXJpYWwgPSBfdGhpcyRhcHBseUJyaWRnZS5tYXRlcmlhbDtcblxuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBtZXNoOiBuZXcgTGluZShnZW9tZXRyeSwgbWF0ZXJpYWwpXG4gICAgICB9KS5tZXNoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJidWlsZEdlb21ldHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkR2VvbWV0cnkoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHZhciBnZW9tZXRyeSA9IHBhcmFtcy5idWZmZXIgPyBuZXcgQnVmZmVyR2VvbWV0cnkoKSA6IG5ldyBHZW9tZXRyeSgpO1xuXG4gICAgICBpZiAocGFyYW1zLmJ1ZmZlcikge1xuICAgICAgICB2YXIgcHAgPSBwYXJhbXMuY3VydmUuZ2V0UG9pbnRzKHBhcmFtcy5wb2ludHMpO1xuICAgICAgICB2YXIgdmVydHMgPSBuZXcgRmxvYXQzMkFycmF5KHBwLmxlbmd0aCAqIDMpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBtYXggPSBwcC5sZW5ndGg7IGkgPCBtYXg7IGkrKykge1xuICAgICAgICAgIHZhciBpMyA9IGkgKiAzO1xuICAgICAgICAgIHZlcnRzW2kzXSA9IHBwW2ldLng7XG4gICAgICAgICAgdmVydHNbaTMgKyAxXSA9IHBwW2ldLnk7XG4gICAgICAgICAgdmVydHNbaTMgKyAyXSA9IHBwW2ldLno7XG4gICAgICAgIH1cblxuICAgICAgICBnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSh2ZXJ0cywgMykpO1xuICAgICAgfSBlbHNlIGdlb21ldHJ5LnZlcnRpY2VzID0gcGFyYW1zLmN1cnZlLmdldFBvaW50cyhwYXJhbXMucG9pbnRzKTtcblxuICAgICAgcmV0dXJuIGdlb21ldHJ5O1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKExpbmUkJDEsIF9NZXNoQ29tcG9uZW50KTtcblxuICByZXR1cm4gTGluZSQkMTtcbn0oTWVzaENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhMaW5lJDEsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGN1cnZlOiBudWxsLFxuICBwb2ludHM6IDUwXG59KSksIFwiaW5zdHJ1Y3Rpb25zXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsIHtcbiAgZ2VvbWV0cnk6IFsnY3VydmUnLCAncG9pbnRzJ11cbn0pKTtcblxuLyoqXG4gKiBAY2xhc3MgSW1wb3J0ZXJcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIEltcG9ydGVyIGlzIGEgbG9hZGVyIGZvciBtZXNoZXMgYW5kIGFueSBvdGhlciBkYXRhIHRvIHlvdXIgc2NlbmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIEltcG9ydGVyLCBhbmQgYWRkaW5nIHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBJbXBvcnRlcih7XG4gKiAgIGxvYWRlcjogbmV3IFRIUkVFLk9CSkxvYWRlcigpLFxuICpcbiAqICAgcGFyc2VyKGdlb21ldHJ5LCBtYXRlcmlhbCkgeyAvLyBkYXRhIGZyb20gbG9hZGVyXG4gKiAgICAgcmV0dXJuIG5ldyBUSFJFRS5NZXNoKGdlb21ldHJ5LCBtYXRlcmlhbCk7IC8vIHNob3VsZCByZXR1cm4geW91ciAubmF0aXZlIChtZXNoIGluIHRoaXMgY2FzZSlcbiAqICAgfSxcbiAqXG4gKiAgIHBvc2l0aW9uOiBbMCwgMTAwLCAwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgSW1wb3J0ZXIgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9NZXNoQ29tcG9uZW50KSB7XG4gIGNyZWF0ZUNsYXNzKEltcG9ydGVyLCBudWxsLCBbe1xuICAgIGtleTogXCJmaWx0ZXJcIixcblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuSW1wb3J0ZXIjZGVmYXVsdHNcbiAgICAgKiBAc3RhdGljXG4gICAgICogQGRlZmF1bHQgPHByZT5cbiAgICAgKiB7XG4gICAgICogICB1cmw6ICcnLFxuICAgICAqICAgbG9hZGVyOiBuZXcgSlNPTkxvYWRlcigpLFxuICAgICAqXG4gICAgICogICBvbkxvYWQoKSB7fSxcbiAgICAgKiAgIG9uUHJvZ3Jlc3MoKSB7fSxcbiAgICAgKiAgIG9uRXJyb3IoKSB7fSxcbiAgICAgKlxuICAgICAqICAgdGV4dHVyZVBhdGg6IG51bGwsXG4gICAgICogICB1c2VDdXN0b21NYXRlcmlhbDogZmFsc2UsXG4gICAgICpcbiAgICAgKiAgIHBhcnNlcihnZW9tZXRyeSwgbWF0ZXJpYWxzKSB7XG4gICAgICogICAgIHJldHVybiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWxzKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9PC9wcmU+XG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGZpbHRlclxuICAgICAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IHZhbHVlcyBmb3IgZmlsdGVyXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7VEhSRUUuTWVzaH0gb2JqZWN0IEluc3RhbmNlIGZvciBpdGVyYXRpbmcgdGhyb3VnaCBpdCdzIGNoaWxkcmVuLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZpbHRlciBGdW5jdGlvbiB3aXRoIGNoaWxkIGFzIGFyZ3VtZW50LCBzaG91bGQgcmV0dXJuIGEgYm9vbGVhbiB3aGV0aGVyIGluY2x1ZGUgdGhlIGNoaWxkIG9yIG5vdC5cbiAgICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBvYmplY3Qgd2l0aCBjaGlsZHJlblxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuSW1wb3J0ZXJcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5SZW1vdmluZyB1bm5lY2Vzc2FyeSBsaWdodHMgZnJvbSBjaGlsZHJlbjwvY2FwdGlvbj5cbiAgICAgKiBuZXcgSW1wb3J0ZXIoe1xuICAgICAqICAgbG9hZGVyOiBuZXcgVEhSRUUuT0JKTG9hZGVyKCksXG4gICAgICpcbiAgICAgKiAgIHBhcnNlKGdyb3VwKSB7IC8vIGRhdGEgZnJvbSBsb2FkZXJcbiAgICAgKiAgICAgcmV0dXJuIEltcG9ydGVyLmZpbHRlcihncm91cCwgY2hpbGQgPT4gIWNoaWxkLmlzTGlnaHQpOyAvLyByZW1vdmUgbGlnaHRzXG4gICAgICogICB9LFxuICAgICAqXG4gICAgICogICBwb3NpdGlvbjogWzAsIDEwMCwgMF1cbiAgICAgKiB9KS5hZGRUbyhhcHApO1xuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiBmaWx0ZXIob2JqZWN0LCBfZmlsdGVyKSB7XG4gICAgICB2YXIgcHJvY2Vzc0ZpbHRlciA9IGZ1bmN0aW9uIHByb2Nlc3NGaWx0ZXIob2JqZWN0KSB7XG4gICAgICAgIG9iamVjdC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChlbCwgaW5kZXgpIHtcbiAgICAgICAgICBpZiAoZWwuY2hpbGRyZW4pIHByb2Nlc3NGaWx0ZXIoZWwpO1xuICAgICAgICAgIGlmICghX2ZpbHRlcihlbCkpIG9iamVjdC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBwcm9jZXNzRmlsdGVyKG9iamVjdCk7XG4gICAgfVxuICB9XSk7XG5cbiAgZnVuY3Rpb24gSW1wb3J0ZXIoKSB7XG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBJbXBvcnRlcik7XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKEltcG9ydGVyKS5jYWxsKHRoaXMsIHBhcmFtcywgSW1wb3J0ZXIuZGVmYXVsdHMsIEltcG9ydGVyLmluc3RydWN0aW9ucywgZmFsc2UpKTtcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkltcG9ydGVyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoSW1wb3J0ZXIsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgaWYgKHBhcmFtcy50ZXh0dXJlUGF0aCkgcGFyYW1zLmxvYWRlci5zZXRUZXh0dXJlUGF0aChwYXJhbXMudGV4dHVyZVBhdGgpO1xuICAgICAgICBwYXJhbXMubG9hZGVyLmxvYWQocGFyYW1zLnVybCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBkYXRhID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgICAgZGF0YVtfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBnZW9tZXRyeSwgbWF0ZXJpYWxzXG4gICAgICAgICAgcGFyYW1zLm9uTG9hZC5hcHBseShwYXJhbXMsIGRhdGEpO1xuICAgICAgICAgIHZhciBvYmplY3QgPSBwYXJhbXMucGFyc2VyLmFwcGx5KF90aGlzLCBkYXRhKTtcbiAgICAgICAgICBpZiAocGFyYW1zLm1hdGVyaWFsKSBvYmplY3QubWF0ZXJpYWwgPSBfdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgICAgICAgfSkubWF0ZXJpYWw7XG4gICAgICAgICAgcmVzb2x2ZShvYmplY3QpO1xuICAgICAgICB9LCBwYXJhbXMub25Qcm9ncmVzcywgcGFyYW1zLm9uRXJyb3IpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoSW1wb3J0ZXIsIF9NZXNoQ29tcG9uZW50KTtcblxuICByZXR1cm4gSW1wb3J0ZXI7XG59KE1lc2hDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoSW1wb3J0ZXIsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIHVybDogJycsXG4gIGxvYWRlcjogbmV3IEpTT05Mb2FkZXIoKSxcbiAgb25Mb2FkOiBmdW5jdGlvbiBvbkxvYWQoKSB7fSxcbiAgb25Qcm9ncmVzczogZnVuY3Rpb24gb25Qcm9ncmVzcygpIHt9LFxuICAvLyBUT0RPIGFkZCBvbkNvbXBsZXRlP1xuICBvbkVycm9yOiBmdW5jdGlvbiBvbkVycm9yKCkge30sXG4gIHRleHR1cmVQYXRoOiBudWxsLFxuICB1c2VDdXN0b21NYXRlcmlhbDogZmFsc2UsXG4gIHBhcnNlcjogZnVuY3Rpb24gcGFyc2VyKGdlb21ldHJ5LCBtYXRlcmlhbCkge1xuICAgIHZhciBfdGhpcyRhcHBseUJyaWRnZSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgZ2VvbWV0cnk6IGdlb21ldHJ5LFxuICAgICAgbWF0ZXJpYWw6IG1hdGVyaWFsXG4gICAgfSksXG4gICAgICAgIGdlb20gPSBfdGhpcyRhcHBseUJyaWRnZS5nZW9tZXRyeSxcbiAgICAgICAgbWF0ID0gX3RoaXMkYXBwbHlCcmlkZ2UubWF0ZXJpYWw7XG5cbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICBtZXNoOiBnZW9tLmJvbmVzID8gbmV3IFNraW5uZWRNZXNoKGdlb20sIG1hdCkgOiBuZXcgTWVzaChnZW9tLCBtYXQpXG4gICAgfSkubWVzaDtcbiAgfVxufSkpLCBcImluc3RydWN0aW9uc1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zKSk7XG5cbi8qKlxuICogQGNsYXNzIE9jdGFoZWRyb25cbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIEluIGdlb21ldHJ5LCBhbiBvY3RhaGVkcm9uIGlzIGEgcG9seWhlZHJvbiB3aXRoIGVpZ2h0IGZhY2VzLlxuICogQSByZWd1bGFyIG9jdGFoZWRyb24gaXMgYSBQbGF0b25pYyBzb2xpZCBjb21wb3NlZCBvZiBlaWdodCBlcXVpbGF0ZXJhbCB0cmlhbmdsZXMsIGZvdXIgb2Ygd2hpY2ggbWVldCBhdCBlYWNoIHZlcnRleC5cbiAqIDxici8+PGJyLz5cbiAqIGBPY3RhaGVkcm9uYCBjcmVhdGVzIGFuIE9jdGFoZWRyb24gb2JqZWN0IGJ5IGl0cyBgcmFkaXVzYCBhbmQgYGRldGFpbGAuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI09jdGFoZWRyb25HZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGFuIE9jdGFoZWRyb24sIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IE9jdGFoZWRyb24oe1xuICogICBnZW9tZXRyeToge1xuICogICAgIHJhZGl1czogMixcbiAqICAgICBkZXRhaWw6IDFcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiBbMCwgMTAwLCAwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgT2N0YWhlZHJvbiA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX01lc2hDb21wb25lbnQpIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLk9jdGFoZWRyb24jZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHJhZGl1czogMSxcbiAgICogICAgIGRldGFpbDogMFxuICAgKiAgIH1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIGZ1bmN0aW9uIE9jdGFoZWRyb24oKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBPY3RhaGVkcm9uKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKE9jdGFoZWRyb24pLmNhbGwodGhpcywgcGFyYW1zLCBPY3RhaGVkcm9uLmRlZmF1bHRzLCBPY3RhaGVkcm9uLmluc3RydWN0aW9ucykpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgX3RoaXMuYnVpbGQocGFyYW1zKTtcblxuICAgICAgZ2V0JDMoZ2V0UHJvdG90eXBlT2YkMihPY3RhaGVkcm9uLnByb3RvdHlwZSksIFwid3JhcFwiLCBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKS5jYWxsKGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLk9jdGFoZWRyb25cbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhPY3RhaGVkcm9uLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMucGFyYW1zO1xuXG4gICAgICB2YXIgX3RoaXMkYXBwbHlCcmlkZ2UgPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgICB9KSxcbiAgICAgICAgICBnZW9tZXRyeSA9IF90aGlzJGFwcGx5QnJpZGdlLmdlb21ldHJ5LFxuICAgICAgICAgIG1hdGVyaWFsID0gX3RoaXMkYXBwbHlCcmlkZ2UubWF0ZXJpYWw7XG5cbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKVxuICAgICAgfSkubWVzaDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYnVpbGRHZW9tZXRyeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEdlb21ldHJ5KCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5IDogT2N0YWhlZHJvbkdlb21ldHJ5KShwYXJhbXMuZ2VvbWV0cnkucmFkaXVzLCBwYXJhbXMuZ2VvbWV0cnkuZGV0YWlsKTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhPY3RhaGVkcm9uLCBfTWVzaENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIE9jdGFoZWRyb247XG59KE1lc2hDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKE9jdGFoZWRyb24sIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGdlb21ldHJ5OiB7XG4gICAgcmFkaXVzOiAxLFxuICAgIGRldGFpbDogMFxuICB9XG59KSk7XG5cbi8qKlxuICogQGNsYXNzIFBhcmFtZXRyaWNcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIGBQYXJhbWV0cmljYCBnZW5lcmF0ZXMgYSBnZW9tZXRyeSByZXByZXNlbnRpbmcgYSA8YSBocmVmPSdodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QYXJhbWV0cmljX3N1cmZhY2UnPlBhcmFtZXRyaWMgc3VyZmFjZTwvYT5cbiAqIDxici8+PGJyLz5cbiAqIEl0IGlzIHVzdWFsbHkgdXNlZCB0byBkZXZlbG9wIGRpZmZlcmVudCBraW5kcyBvZiBoaWdoZmllbGRzIG9yIHZpc3VhbGl6ZSBhIDxhIGhyZWY9J2h0dHBzOi8vc3RlbWtvc2tpLmdpdGh1Yi5pby9UaHJlZS5qcy9HcmFwaHVsdXMtRnVuY3Rpb24uaHRtbCc+bWF0aCBmdW5jdGlvbjwvYT4uXG4gKiA8YnIvPlxuICogLSA8YSBocmVmPSdodHRwOi8vbWF0aC5od3MuZWR1L2dyYXBoaWNzYm9vay9zb3VyY2UvdGhyZWVqcy9jdXJ2ZXMtYW5kLXN1cmZhY2VzLmh0bWwnPlBhcmFtZXRyaWMgc3VyZmFjZTwvYT5cbiAqIC0gPGEgaHJlZj0naHR0cHM6Ly9zdGVta29za2kuZ2l0aHViLmlvL1RocmVlLmpzL0dyYXBodWx1cy1TdXJmYWNlLmh0bWwnPlwiR3JhcGh1bHVzXCI8L2E+XG4gKiA8YnIvPjxici8+XG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI1BhcmFtZXRyaWNHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkV4YW1wbGUgY3JlYXRpbmcgYW4gaGVpZ2h0ZmllbGQtbGlrZSBnZW9tZXRyeS4gYHVgIGFuZCBgdmAgYXJlIGxpa2UgYHhgIGFuZCBgeWAgaW4gc2hhcGUsIGJ1dCB0aGVpciB2YWx1ZXMgYXJlIGFsd2F5cyBmcm9tIGAwYCB0byBgMWAuXG4gKiBXZSB1c2UgdGhlbSBpbiBgVEhSRUUuVmVjdG9yM2AgbGlrZSBgeGAgYW5kIGB6YCBhbmQgYE1hdGgucmFuZG9tKCkgKiA1YCBmb3IgYHlgLjwvY2FwdGlvbj5cbiAqIGNvbnN0IGNyZWF0ZVBhcmFtZXRyaWMgPSAodSwgdikgPT4ge1xuICogICByZXR1cm4gbmV3IFRIUkVFLlZlY3RvcjModSAqIDMwLCBNYXRoLnJhbmRvbSgpICogNSwgdiAqIDMwKTtcbiAqIH1cbiAqXG4gKiBuZXcgUGFyYW1ldHJpYyh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgZnVuYzogY3JlYXRlUGFyYW1ldHJpY1xuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoTGFtYmVydE1hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmYsXG4gKiAgICAgc2lkZTogVEhSRUUuRG91YmxlU2lkZVxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiBbMCwgMTAwLCAtMTAwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgUGFyYW1ldHJpYyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX01lc2hDb21wb25lbnQpIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlBhcmFtZXRyaWMjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIGZ1bmM6ICh1LCB2KSA9PiBuZXcgVmVjdG9yMyh1LCB2LCAwKSxcbiAgICogICAgIHNsaWNlczogMTAsXG4gICAqICAgICB0YWNrczogMTBcbiAgICogICB9XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBmdW5jdGlvbiBQYXJhbWV0cmljKCkge1xuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUGFyYW1ldHJpYyk7XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFBhcmFtZXRyaWMpLmNhbGwodGhpcywgcGFyYW1zLCBQYXJhbWV0cmljLmRlZmF1bHRzLCBQYXJhbWV0cmljLmluc3RydWN0aW9ucykpO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuUGFyYW1ldHJpY1xuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFBhcmFtZXRyaWMsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy5wYXJhbXM7XG5cbiAgICAgIHZhciBfdGhpcyRhcHBseUJyaWRnZSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgIH0pLFxuICAgICAgICAgIGdlb21ldHJ5ID0gX3RoaXMkYXBwbHlCcmlkZ2UuZ2VvbWV0cnksXG4gICAgICAgICAgbWF0ZXJpYWwgPSBfdGhpcyRhcHBseUJyaWRnZS5tYXRlcmlhbDtcblxuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBtZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpXG4gICAgICB9KS5tZXNoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJidWlsZEdlb21ldHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkR2VvbWV0cnkoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHJldHVybiBuZXcgKHBhcmFtcy5idWZmZXIgPyBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkgOiBQYXJhbWV0cmljR2VvbWV0cnkpKHBhcmFtcy5nZW9tZXRyeS5mdW5jLCBwYXJhbXMuZ2VvbWV0cnkuc2xpY2VzLCBwYXJhbXMuZ2VvbWV0cnkuc3RhY2tzKTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhQYXJhbWV0cmljLCBfTWVzaENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIFBhcmFtZXRyaWM7XG59KE1lc2hDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKFBhcmFtZXRyaWMsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGdlb21ldHJ5OiB7XG4gICAgZnVuYzogZnVuY3Rpb24gZnVuYyh1LCB2KSB7XG4gICAgICByZXR1cm4gbmV3IFZlY3RvcjModSwgdiwgMCk7XG4gICAgfSxcbiAgICBzbGljZXM6IDEwLFxuICAgIHN0YWNrczogMTBcbiAgfVxufSkpO1xuXG4vKipcbiAqIEBjbGFzcyBQbGFuZVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gYFBsYW5lYCBpcyB1c2VkIGZvciBjcmVhdGluZyBwbGFuZXMgZ2l2ZW4gc29tZSBgd2lkdGhgIGFuZCBgaGVpZ2h0YC5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjUGxhbmVHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgUGxhbmUsIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IFBsYW5lKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICB3aWR0aDogMjAsXG4gKiAgICAgaGVpZ2h0OiAzMFxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBQbGFuZSQxID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTWVzaENvbXBvbmVudCkge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuUGxhbmUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHdpZHRoOiAxMCxcbiAgICogICAgIGhlaWdodDogMTAsXG4gICAqICAgICB3U2VnbWVudHM6IDEsXG4gICAqICAgICBoU2VnbWVudHM6IDFcbiAgICogICB9XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuUGxhbmUjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiBbJ3dpZHRoJywgJ2hlaWdodCcsICd3U2VnbWVudHMnLCAnaFNlZ21lbnRzJ11cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIGZ1bmN0aW9uIFBsYW5lJCQxKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUGxhbmUkJDEpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoUGxhbmUkJDEpLmNhbGwodGhpcywgcGFyYW1zLCBQbGFuZSQkMS5kZWZhdWx0cywgUGxhbmUkJDEuaW5zdHJ1Y3Rpb25zKSk7XG5cbiAgICBpZiAocGFyYW1zLmJ1aWxkKSB7XG4gICAgICBfdGhpcy5idWlsZChwYXJhbXMpO1xuXG4gICAgICBnZXQkMyhnZXRQcm90b3R5cGVPZiQyKFBsYW5lJCQxLnByb3RvdHlwZSksIFwid3JhcFwiLCBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKS5jYWxsKGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlBsYW5lXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoUGxhbmUkJDEsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy5wYXJhbXM7XG5cbiAgICAgIHZhciBfdGhpcyRhcHBseUJyaWRnZSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgIH0pLFxuICAgICAgICAgIGdlb21ldHJ5ID0gX3RoaXMkYXBwbHlCcmlkZ2UuZ2VvbWV0cnksXG4gICAgICAgICAgbWF0ZXJpYWwgPSBfdGhpcyRhcHBseUJyaWRnZS5tYXRlcmlhbDtcblxuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBtZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpXG4gICAgICB9KS5tZXNoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJidWlsZEdlb21ldHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkR2VvbWV0cnkoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyAocGFyYW1zLmJ1ZmZlciA/IFBsYW5lQnVmZmVyR2VvbWV0cnkgOiBQbGFuZUdlb21ldHJ5KShwYXJhbXMuZ2VvbWV0cnkud2lkdGgsIHBhcmFtcy5nZW9tZXRyeS5oZWlnaHQsIHBhcmFtcy5nZW9tZXRyeS53U2VnbWVudHMsIHBhcmFtcy5nZW9tZXRyeS5oU2VnbWVudHMpO1xuICAgICAgcmV0dXJuIGdlb21ldHJ5O1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFBsYW5lJCQxLCBfTWVzaENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIFBsYW5lJCQxO1xufShNZXNoQ29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKFBsYW5lJDEsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGdlb21ldHJ5OiB7XG4gICAgd2lkdGg6IDEwLFxuICAgIGhlaWdodDogMTAsXG4gICAgd1NlZ21lbnRzOiAxLFxuICAgIGhTZWdtZW50czogMVxuICB9XG59KSksIFwiaW5zdHJ1Y3Rpb25zXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsIHtcbiAgZ2VvbWV0cnk6IFsnd2lkdGgnLCAnaGVpZ2h0JywgJ3dTZWdtZW50cycsICdoU2VnbWVudHMnXVxufSkpO1xuXG52YXIgdmVydGljZXNPZkN1YmUgPSBbLTEsIC0xLCAtMSwgMSwgLTEsIC0xLCAxLCAxLCAtMSwgLTEsIDEsIC0xLCAtMSwgLTEsIDEsIDEsIC0xLCAxLCAxLCAxLCAxLCAtMSwgMSwgMV0sXG4gICAgaW5kaWNlc09mRmFjZXMgPSBbMiwgMSwgMCwgMCwgMywgMiwgMCwgNCwgNywgNywgMywgMCwgMCwgMSwgNSwgNSwgNCwgMCwgMSwgMiwgNiwgNiwgNSwgMSwgMiwgMywgNywgNywgNiwgMiwgNCwgNSwgNiwgNiwgNywgNF07XG4vKipcbiAqIEBjbGFzcyBQb2x5aGVkcm9uXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBJbiBlbGVtZW50YXJ5IGdlb21ldHJ5LCBhIHBvbHloZWRyb24gaXMgYSBzb2xpZCBpbiB0aHJlZSBkaW1lbnNpb25zIHdpdGggZmxhdCBwb2x5Z29uYWwgZmFjZXMsIHN0cmFpZ2h0IGVkZ2VzIGFuZCBzaGFycCBjb3JuZXJzIG9yIHZlcnRpY2VzLlxuICogPGJyLz48YnIvPlxuICogYFBvbHloZWRyb25gIGNyZWF0ZXMgYSBQb2x5aGVkcm9uIGJ5IGl0cyBgcmFkaXVzYCBhbmQgYGRldGFpbGAuXG4gKiA8YnIvPjxici8+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYW4gUG9seWhlZHJvbiwgYW5kIGFkZGluZyB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgUG9seWhlZHJvbih7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcmFkaXVzOiAyLFxuICogICAgIGRldGFpbDogMVxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IFswLCAxMDAsIDBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBQb2x5aGVkcm9uID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTWVzaENvbXBvbmVudCkge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuUG9seWhlZHJvbiNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgdmVydGljZXNPZkN1YmU6IFtcbiAgICogICAgICAgLTEsIC0xLCAtMSwgMSwgLTEsIC0xLCAxLCAxLCAtMSwgLTEsIDEsIC0xLFxuICAgKiAgICAgICAtMSwgLTEsIDEsIDEsIC0xLCAxLCAxLCAxLCAxLCAtMSwgMSwgMVxuICAgKiAgICAgXSxcbiAgICpcbiAgICogICAgIGluZGljZXNPZkZhY2VzOiBbXG4gICAqICAgICAgIDIsIDEsIDAsIDAsIDMsIDIsXG4gICAqICAgICAgIDAsIDQsIDcsIDcsIDMsIDAsXG4gICAqICAgICAgIDAsIDEsIDUsIDUsIDQsIDAsXG4gICAqICAgICAgIDEsIDIsIDYsIDYsIDUsIDEsXG4gICAqICAgICAgIDIsIDMsIDcsIDcsIDYsIDIsXG4gICAqICAgICAgIDQsIDUsIDYsIDYsIDcsIDRcbiAgICogICAgIF0sXG4gICAqXG4gICAqICAgICByYWRpdXM6IDYsXG4gICAqICAgICBkZXRhaWw6IDJcbiAgICogICB9XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuUG9seWhlZHJvbiNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IFsndmVydGljZXNPZkN1YmUnLCAnaW5kaWNlc09mRmFjZXMnLCAncmFkaXVzJywgJ2RldGFpbCddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBmdW5jdGlvbiBQb2x5aGVkcm9uKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9seWhlZHJvbik7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihQb2x5aGVkcm9uKS5jYWxsKHRoaXMsIHBhcmFtcywgUG9seWhlZHJvbi5kZWZhdWx0cywgUG9seWhlZHJvbi5pbnN0cnVjdGlvbnMpKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIF90aGlzLmJ1aWxkKHBhcmFtcyk7XG5cbiAgICAgIGdldCQzKGdldFByb3RvdHlwZU9mJDIoUG9seWhlZHJvbi5wcm90b3R5cGUpLCBcIndyYXBcIiwgYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSkuY2FsbChhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Qb2x5aGVkcm9uXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoUG9seWhlZHJvbiwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLnBhcmFtcztcblxuICAgICAgdmFyIF90aGlzJGFwcGx5QnJpZGdlID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgfSksXG4gICAgICAgICAgZ2VvbWV0cnkgPSBfdGhpcyRhcHBseUJyaWRnZS5nZW9tZXRyeSxcbiAgICAgICAgICBtYXRlcmlhbCA9IF90aGlzJGFwcGx5QnJpZGdlLm1hdGVyaWFsO1xuXG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIG1lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbClcbiAgICAgIH0pLm1lc2g7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJ1aWxkR2VvbWV0cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRHZW9tZXRyeSgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgcmV0dXJuIG5ldyAocGFyYW1zLmJ1ZmZlciA/IFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSA6IFBvbHloZWRyb25HZW9tZXRyeSkocGFyYW1zLmdlb21ldHJ5LnZlcnRpY2VzT2ZDdWJlLCBwYXJhbXMuZ2VvbWV0cnkuaW5kaWNlc09mRmFjZXMsIHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsIHBhcmFtcy5nZW9tZXRyeS5kZXRhaWwpO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFBvbHloZWRyb24sIF9NZXNoQ29tcG9uZW50KTtcblxuICByZXR1cm4gUG9seWhlZHJvbjtcbn0oTWVzaENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoUG9seWhlZHJvbiwgXCJ2ZXJ0aWNlc09mQ3ViZVwiLCB2ZXJ0aWNlc09mQ3ViZSksIFwiaW5kaWNlc09mRmFjZXNcIiwgaW5kaWNlc09mRmFjZXMpLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5kZWZhdWx0cywge1xuICBnZW9tZXRyeToge1xuICAgIHZlcnRpY2VzT2ZDdWJlOiB2ZXJ0aWNlc09mQ3ViZSxcbiAgICBpbmRpY2VzT2ZGYWNlczogaW5kaWNlc09mRmFjZXMsXG4gICAgcmFkaXVzOiA2LFxuICAgIGRldGFpbDogMlxuICB9XG59KSksIFwiaW5zdHJ1Y3Rpb25zXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsIHtcbiAgZ2VvbWV0cnk6IFsndmVydGljZXNPZkN1YmUnLCAnaW5kaWNlc09mRmFjZXMnLCAncmFkaXVzJywgJ2RldGFpbCddXG59KSk7XG5cbi8qKlxuICogQGNsYXNzIFJpbmdcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIFJpbmcgY2xhc3MgY3JlYXRlcyBhIGNpcmNsZSBvciBqdXN0IDJEIFRvcnVzLiBEb2VzIG5vdCBzdXBwb3J0IHBoeXNpY3MuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI1JpbmdHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgUmluZywgYW5kIGFkZGluZyB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgUmluZyh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgaW5uZXJSYWRpdXM6IDUsXG4gKiAgICAgb3V0ZXJSYWRpdXM6IDJcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaExhbWJlcnRNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmLFxuICogICAgIHNpZGUgVEhSRUUuRG91YmxlU2lkZVxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiBbMCwgOCwgMF0sXG4gKlxuICogICByb3RhdGlvbjoge1xuICogICAgIHg6IE1hdGguUEkvNFxuICogICB9XG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBSaW5nID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTWVzaENvbXBvbmVudCkge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuUmluZyNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgaW5uZXJSYWRpdXM6IDAsXG4gICAqICAgICBvdXRlclJhZGl1czogNTAsXG4gICAqICAgICB0aGV0YVNlZ21lbnRzOiA4LFxuICAgKiAgICAgcGhpU2VnbWVudHM6IDgsXG4gICAqICAgICB0aGV0YVN0YXJ0OiAwLFxuICAgKiAgICAgdGhldGFMZW5ndGg6IE1hdGguUEkgKiAyXG4gICAqICAgfVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlJpbmcjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiBbXG4gICAqICAgICAnaW5uZXJSYWRpdXMnLFxuICAgKiAgICAgJ291dGVyUmFkaXVzJyxcbiAgICogICAgICd0aGV0YVNlZ21lbnRzJyxcbiAgICogICAgICdwaGlTZWdtZW50cycsXG4gICAqICAgICAndGhldGFTdGFydCcsXG4gICAqICAgICAndGhldGFMZW5ndGgnXG4gICAqICAgXVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgZnVuY3Rpb24gUmluZygpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFJpbmcpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoUmluZykuY2FsbCh0aGlzLCBwYXJhbXMsIFJpbmcuZGVmYXVsdHMsIFJpbmcuaW5zdHJ1Y3Rpb25zKSk7XG5cbiAgICBpZiAocGFyYW1zLmJ1aWxkKSB7XG4gICAgICBfdGhpcy5idWlsZChwYXJhbXMpO1xuXG4gICAgICBnZXQkMyhnZXRQcm90b3R5cGVPZiQyKFJpbmcucHJvdG90eXBlKSwgXCJ3cmFwXCIsIGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpLmNhbGwoYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuUmluZ1xuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFJpbmcsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy5wYXJhbXM7XG5cbiAgICAgIHZhciBfdGhpcyRhcHBseUJyaWRnZSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgIH0pLFxuICAgICAgICAgIGdlb21ldHJ5ID0gX3RoaXMkYXBwbHlCcmlkZ2UuZ2VvbWV0cnksXG4gICAgICAgICAgbWF0ZXJpYWwgPSBfdGhpcyRhcHBseUJyaWRnZS5tYXRlcmlhbDtcblxuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBtZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpXG4gICAgICB9KS5tZXNoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJidWlsZEdlb21ldHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkR2VvbWV0cnkoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHJldHVybiBuZXcgKHBhcmFtcy5idWZmZXIgPyBSaW5nQnVmZmVyR2VvbWV0cnkgOiBSaW5nR2VvbWV0cnkpKHBhcmFtcy5nZW9tZXRyeS5pbm5lclJhZGl1cywgcGFyYW1zLmdlb21ldHJ5Lm91dGVyUmFkaXVzLCBwYXJhbXMuZ2VvbWV0cnkudGhldGFTZWdtZW50cywgcGFyYW1zLmdlb21ldHJ5LnBoaVNlZ21lbnRzLCBwYXJhbXMuZ2VvbWV0cnkudGhldGFTdGFydCwgcGFyYW1zLmdlb21ldHJ5LnRoZXRhTGVuZ3RoKTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhSaW5nLCBfTWVzaENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIFJpbmc7XG59KE1lc2hDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoUmluZywgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgZ2VvbWV0cnk6IHtcbiAgICBpbm5lclJhZGl1czogMCxcbiAgICBvdXRlclJhZGl1czogNTAsXG4gICAgdGhldGFTZWdtZW50czogOCxcbiAgICBwaGlTZWdtZW50czogOCxcbiAgICB0aGV0YVN0YXJ0OiAwLFxuICAgIHRoZXRhTGVuZ3RoOiBNYXRoLlBJICogMlxuICB9XG59KSksIFwiaW5zdHJ1Y3Rpb25zXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5kZWZhdWx0cywge1xuICBnZW9tZXRyeTogWydpbm5lclJhZGl1cycsICdvdXRlclJhZGl1cycsICd0aGV0YVNlZ21lbnRzJywgJ3BoaVNlZ21lbnRzJywgJ3RoZXRhU3RhcnQnLCAndGhldGFMZW5ndGgnXVxufSkpO1xuXG4vKipcbiAqIEBjbGFzcyBTaGFwZVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gU2hhcGUgaXMgYSB1bml2ZXJzYWwgY2xhc3MuIEl0IGFsbG93cyB5b3UgdG8gY3JlYXRlIGRpZmZlcmVudCAyRCBzaGFwZXMgaW4gM0Qgc2NlbmUuPGJyLz5cbiAqIFVuZm9ydHVuYXRlbHksIG5vdCBhbGwgb2YgdGhlbSBzdXBwb3J0IHBoeXNpY3MsIGFuIGFsdGVybmF0aXZlIGlzIHRvIG1ha2UgYSBzaW1pbGFyIDNEIG9iamVjdCBhbmQgc2NhbGUgaXRzIHdpZHRoIGRvd24gdG8gbmVhciB6ZXJvLlxuICogPGJyLz48YnIvPlxuICogYFNoYXBlYCBjb25zaXN0cyBvZiBzaGFwZXMgdGhhdCBhcmUgaW4gaXRzIHNoYXBlcyBwYXJhbWV0ZXIuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI1NoYXBlR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIHBsYW5lIGxvb2tpbmcgU2hhcGUgZnJvbSBhIFRIUkVFLlNoYXBlLCBhbmQgYWRkaW5nIGl0IHRvIGFwcDwvY2FwdGlvbj5cbiAqIGNvbnN0IHJlY3RXaWR0aCA9IDEwLFxuICogcmVjdExlbmd0aCA9IDU7XG4gKlxuICogY29uc3QgcmVjdFNoYXBlID0gbmV3IFRIUkVFLlNoYXBlKCk7XG4gKiByZWN0U2hhcGUubW92ZVRvKDAsMCk7XG4gKiByZWN0U2hhcGUubGluZVRvKDAsIHJlY3RXaWR0aCk7XG4gKiByZWN0U2hhcGUubGluZVRvKHJlY3RMZW5ndGgsIHJlY3RXaWR0aCk7XG4gKiByZWN0U2hhcGUubGluZVRvKHJlY3RMZW5ndGgsIDApO1xuICogcmVjdFNoYXBlLmxpbmVUbygwLCAwKTtcbiAqXG4gKiBjb25zdCBwbGFuZSA9IG5ldyBTaGFwZSh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgc2hhcGU6IHJlY3RTaGFwZVxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBTaGFwZSQxID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTWVzaENvbXBvbmVudCkge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuU2hhcGUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHNoYXBlczogW11cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5TaGFwZSNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IFsnc2hhcGVzJ11cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIGZ1bmN0aW9uIFNoYXBlJCQxKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgU2hhcGUkJDEpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoU2hhcGUkJDEpLmNhbGwodGhpcywgcGFyYW1zLCBTaGFwZSQkMS5kZWZhdWx0cywgU2hhcGUkJDEuaW5zdHJ1Y3Rpb25zKSk7XG5cbiAgICBpZiAocGFyYW1zLmJ1aWxkKSB7XG4gICAgICBfdGhpcy5idWlsZChwYXJhbXMpO1xuXG4gICAgICBnZXQkMyhnZXRQcm90b3R5cGVPZiQyKFNoYXBlJCQxLnByb3RvdHlwZSksIFwid3JhcFwiLCBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKS5jYWxsKGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlNoYXBlXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoU2hhcGUkJDEsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy5wYXJhbXM7XG5cbiAgICAgIHZhciBfdGhpcyRhcHBseUJyaWRnZSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgIH0pLFxuICAgICAgICAgIGdlb21ldHJ5ID0gX3RoaXMkYXBwbHlCcmlkZ2UuZ2VvbWV0cnksXG4gICAgICAgICAgbWF0ZXJpYWwgPSBfdGhpcyRhcHBseUJyaWRnZS5tYXRlcmlhbDtcblxuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBtZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpXG4gICAgICB9KS5tZXNoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJidWlsZEdlb21ldHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkR2VvbWV0cnkoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHJldHVybiBuZXcgKHBhcmFtcy5idWZmZXIgPyBTaGFwZUJ1ZmZlckdlb21ldHJ5IDogU2hhcGVHZW9tZXRyeSkocGFyYW1zLmdlb21ldHJ5LnNoYXBlcyk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoU2hhcGUkJDEsIF9NZXNoQ29tcG9uZW50KTtcblxuICByZXR1cm4gU2hhcGUkJDE7XG59KE1lc2hDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoU2hhcGUkMSwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgZ2VvbWV0cnk6IHtcbiAgICBzaGFwZXM6IFtdXG4gIH1cbn0pKSwgXCJpbnN0cnVjdGlvbnNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucywge1xuICBnZW9tZXRyeTogWydzaGFwZXMnXVxufSkpO1xuXG4vKipcbiAqIEBjbGFzcyBTcGhlcmVcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIFNwaGVyZSBjbGFzcyBpcyB1c2VkIHRvIGNyZWF0ZSBzcGhlcmUgb2JqZWN0cyBieSBpdHMgcmFkaXVzIHByb3BlcnR5IGFuZCBvdGhlciB2YWx1ZXMgdGhhdCBkZXRlcm1pbmVzIGl0cyBkZXRhbGl0eS5cbiAqIDxici8+PGJyLz5cbiAqIEl0IGlzIHNpbWlsYXIgdG8gVEhSRUUuU3BoZXJlR2VvbWV0cnksIGJ1dCBpdCBhbHNvIGNvbnRhaW5zIGFsbCBgU2hhcGVgIHByb3BlcnRpZXMsIHN1Y2ggYXMgbWF0ZXJpYWwsIG1hc3MgYW5kIHZlY3RvcnMgbGlrZSBwb3NpdGlvbiAocG9zKSBhbmQgcm90YXRpb24gKHJvdCkuXG4gKiA8YnIvPjxici8+XG4gKiBUaGVuIGl0IGNyZWF0ZXMgYW4gYFRocmVlLmpzIG1lc2hgIG9yIGEgYFBoeXNpanMgbWVzaGAsIHRoYXQgaXMgc2ltaWxhciB0byBgVGhyZWUuanMgbWVzaGAsIGJ1dCBpdCBhbHNvIHRha2UgaW50byBjb25zaWRlcmF0aW9uIGNvbGxpc2lvbiBjYWxjdWxhdGlvbnMuXG4gKiBUaGlzIG1lc2ggaXMgYSBjb21iaW5hdGlvbiBvZiBgVGhyZWUuanMgZ2VvbWV0cnlgIGFuZCBgUGh5c2lqcyBtYXRlcmlhbGAgKFRoZSBzYW1lIGFzIGluIHRocmVlLmpzLCBidXQgd2l0aCBmcmljdGlvbiBhbmQgcmVzdGl0dXRpb24pLlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNTcGhlcmVHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgU3BoZXJlLCBhbmQgYWRkaW5nIGl0IHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBTcGhlcmUoe1xuICogICBnZW9tZXRyeToge1xuICogICAgIHJhZGl1czogMlxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IHtcbiAqICAgICB5OiAxMDBcbiAqICAgfVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgU3BoZXJlJDEgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9NZXNoQ29tcG9uZW50KSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5TcGhlcmUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHJhZGl1czogMSxcbiAgICogICAgIHdpZHRoU2VnbWVudHM6IDgsXG4gICAqICAgICBoZWlnaHRTZWdtZW50czogNlxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlNwaGVyZSNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IFsncmFkaXVzJywgJ3dpZHRoU2VnbWVudHMnLCAnaGVpZ2h0U2VnbWVudHMnXVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgZnVuY3Rpb24gU3BoZXJlJCQxKCkge1xuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgU3BoZXJlJCQxKTtcblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoU3BoZXJlJCQxKS5jYWxsKHRoaXMsIHBhcmFtcywgU3BoZXJlJCQxLmRlZmF1bHRzLCBTcGhlcmUkJDEuaW5zdHJ1Y3Rpb25zKSk7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5TcGhlcmVcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhTcGhlcmUkJDEsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy5wYXJhbXM7XG5cbiAgICAgIHZhciBfdGhpcyRhcHBseUJyaWRnZSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgIH0pLFxuICAgICAgICAgIGdlb21ldHJ5ID0gX3RoaXMkYXBwbHlCcmlkZ2UuZ2VvbWV0cnksXG4gICAgICAgICAgbWF0ZXJpYWwgPSBfdGhpcyRhcHBseUJyaWRnZS5tYXRlcmlhbDtcblxuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBtZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpXG4gICAgICB9KS5tZXNoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJidWlsZEdlb21ldHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkR2VvbWV0cnkoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyAocGFyYW1zLmJ1ZmZlciA/IFNwaGVyZUJ1ZmZlckdlb21ldHJ5IDogU3BoZXJlR2VvbWV0cnkpKHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsIHBhcmFtcy5nZW9tZXRyeS53aWR0aFNlZ21lbnRzLCBwYXJhbXMuZ2VvbWV0cnkuaGVpZ2h0U2VnbWVudHMpO1xuICAgICAgcmV0dXJuIGdlb21ldHJ5O1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFNwaGVyZSQkMSwgX01lc2hDb21wb25lbnQpO1xuXG4gIHJldHVybiBTcGhlcmUkJDE7XG59KE1lc2hDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoU3BoZXJlJDEsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGdlb21ldHJ5OiB7XG4gICAgcmFkaXVzOiAxLFxuICAgIHdpZHRoU2VnbWVudHM6IDgsXG4gICAgaGVpZ2h0U2VnbWVudHM6IDZcbiAgfVxufSkpLCBcImluc3RydWN0aW9uc1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLCB7XG4gIGdlb21ldHJ5OiBbJ3JhZGl1cycsICd3aWR0aFNlZ21lbnRzJywgJ2hlaWdodFNlZ21lbnRzJ11cbn0pKTtcblxuLyoqXG4gKiBAY2xhc3MgVGV0cmFoZWRyb25cbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIEluIGdlb21ldHJ5LCBhIHRldHJhaGVkcm9uIGlzIGEgcG9seWhlZHJvbiBjb21wb3NlZCBvZiBmb3VyIHRyaWFuZ3VsYXIgZmFjZXMsIHNpeCBzdHJhaWdodCBlZGdlcywgYW5kIGZvdXIgdmVydGV4IGNvcm5lcnMuXG4gKiBUaGUgdGV0cmFoZWRyb24gaXMgdGhlIHNpbXBsZXN0IG9mIGFsbCB0aGUgb3JkaW5hcnkgY29udmV4IHBvbHloZWRyYSBhbmQgdGhlIG9ubHkgb25lIHRoYXQgaGFzIGZld2VyIHRoYW4gNSBmYWNlcy5cbiAqIDxici8+PGJyLz5cbiAqIGBUZXRyYWhlZHJvbmAgY3JlYXRlcyBhIFRldHJhaGVkcm9uIG9iamVjdCBieSBpdHMgYHJhZGl1c2AgYW5kIGBkZXRhaWxgXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI1RldHJhaGVkcm9uR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIFRldHJhaGVkcm9uLCBhbmQgYWRkaW5nIGl0IHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBUZXRyYWhlZHJvbih7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcmFkaXVzOiAyLFxuICogICAgIGRldGFpbDogMVxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IHtcbiAqICAgICB4OiAwLFxuICogICAgIHk6IDEwMCxcbiAqICAgICB6OiAwXG4gKiAgIH1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIFRldHJhaGVkcm9uID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTWVzaENvbXBvbmVudCkge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVGV0cmFoZWRyb24jZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHJhZGl1czogMSxcbiAgICogICAgIGRldGFpbDogMFxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlRldHJhaGVkcm9uI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeTogWydyYWRpdXMnLCAnZGV0YWlsJ11cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIGZ1bmN0aW9uIFRldHJhaGVkcm9uKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV0cmFoZWRyb24pO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoVGV0cmFoZWRyb24pLmNhbGwodGhpcywgcGFyYW1zLCBUZXRyYWhlZHJvbi5kZWZhdWx0cywgVGV0cmFoZWRyb24uaW5zdHJ1Y3Rpb25zKSk7XG5cbiAgICBpZiAocGFyYW1zLmJ1aWxkKSB7XG4gICAgICBfdGhpcy5idWlsZChwYXJhbXMpO1xuXG4gICAgICBnZXQkMyhnZXRQcm90b3R5cGVPZiQyKFRldHJhaGVkcm9uLnByb3RvdHlwZSksIFwid3JhcFwiLCBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKS5jYWxsKGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlRldHJhaGVkcm9uXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoVGV0cmFoZWRyb24sIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy5wYXJhbXM7XG5cbiAgICAgIHZhciBfdGhpcyRhcHBseUJyaWRnZSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgIH0pLFxuICAgICAgICAgIGdlb21ldHJ5ID0gX3RoaXMkYXBwbHlCcmlkZ2UuZ2VvbWV0cnksXG4gICAgICAgICAgbWF0ZXJpYWwgPSBfdGhpcyRhcHBseUJyaWRnZS5tYXRlcmlhbDtcblxuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBtZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpXG4gICAgICB9KS5tZXNoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJidWlsZEdlb21ldHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkR2VvbWV0cnkoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHJldHVybiBuZXcgKHBhcmFtcy5idWZmZXIgPyBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IDogVGV0cmFoZWRyb25HZW9tZXRyeSkocGFyYW1zLmdlb21ldHJ5LnJhZGl1cywgcGFyYW1zLmdlb21ldHJ5LmRldGFpbCk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoVGV0cmFoZWRyb24sIF9NZXNoQ29tcG9uZW50KTtcblxuICByZXR1cm4gVGV0cmFoZWRyb247XG59KE1lc2hDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoVGV0cmFoZWRyb24sIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGdlb21ldHJ5OiB7XG4gICAgcmFkaXVzOiAxLFxuICAgIGRldGFpbDogMFxuICB9XG59KSksIFwiaW5zdHJ1Y3Rpb25zXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsIHtcbiAgZ2VvbWV0cnk6IFsncmFkaXVzJywgJ2RldGFpbCddXG59KSk7XG5cbi8qKlxuICogQGNsYXNzIFRleHRcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIFRleHQgY2xhc3MgaXMgbWFkZSBmb3IgY3JlYXRpbmcgM0QgdGV4dCBvYmplY3RzLlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNUZXh0R2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIDxici8+PGJyLz5cbiAqIFBoeXNpY3MgdGV4dCBvYmplY3QgY2FuIGJlIGNvbnZleCBvciBjb25jYXZlLiBCeSBkZWZhdWx0IGl0J3MgY29udmV4IGJ1dCB5b3UgY2FuIGFsc28gc3dpdGNoIHRvIGNvbmNhdmUuXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBUZXh0LCBhbmQgYWRkaW5nIGl0IHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBUZXh0KHtcbiAqICAgICB0ZXh0OiAnU29tZSB0ZXh0JyxcbiAqICAgICBwYXJhbWV0ZXJzOiB7XG4gKiAgICAgICBmb250OiAncGF0aC90by9mb250LnR5cGVmYWNlLmpzJyxcbiAqICAgICAgIHNpemU6IDIwLFxuICogICAgICAgaGVpZ2h0OiA1LFxuICogICAgICAgY3VydmVTZWdtZW50czogNlxuICogICAgIH1cbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiB7XG4gKiAgICAgeDogLTQwLFxuICogICAgIHk6IDIwLFxuICogICAgIHo6IDBcbiAqICAgfVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgVGV4dCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX01lc2hDb21wb25lbnQpIHtcbiAgY3JlYXRlQ2xhc3MoVGV4dCwgbnVsbCwgW3tcbiAgICBrZXk6IFwibG9hZFwiLFxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5UZXh0I2RlZmF1bHRzXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBkZWZhdWx0IDxwcmU+XG4gICAgICoge1xuICAgICAqICAgdGV4dDogJ0hlbGxvIFdvcmxkIScsXG4gICAgICogICBmb250OiBudWxsLFxuICAgICAqXG4gICAgICogICBnZW9tZXRyeToge1xuICAgICAqICAgICBzaXplOiAxMixcbiAgICAgKiAgICAgaGVpZ2h0OiA1MCxcbiAgICAgKiAgICAgY3VydmVTZWdtZW50czogMTIsXG4gICAgICogICAgIGZvbnQ6IG5ldyBGb250KCksXG4gICAgICogICAgIGJldmVsRW5hYmxlZDogZmFsc2UsXG4gICAgICogICAgIGJldmVsVGhpY2tuZXNzOiAxMCxcbiAgICAgKiAgICAgYmV2ZWxTaXplOiA4XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqIDwvcHJlPlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBGb250TG9hZGVyXG4gICAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVGV4dCNsb2FkZXJcbiAgICAgKiBAc3RhdGljXG4gICAgICogQGRlZmF1bHQgbmV3IEZvbnRMb2FkZXIoKVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBsb2FkXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBkZXNjcmlwdGlvbiBsb2FkKCkgcHJlbG9hZHMgYSBGb250IG9iamVjdCBhbmQgcmV0dXJucyBhIFByb21pc2Ugd2l0aCBpdC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGF0aCBQYXRoIHRvIHRoZSBmb250XG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gQSBwcm9taXNlIHJlc29sdmVkIHdpdGggYSBmb250XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5UZXh0XG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxvYWQocGF0aCkge1xuICAgICAgdmFyIGxvYWRlciA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogVGV4dC5sb2FkZXI7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgbG9hZGVyLmxvYWQocGF0aCwgcmVzb2x2ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1dKTtcblxuICBmdW5jdGlvbiBUZXh0KCkge1xuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dCk7XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFRleHQpLmNhbGwodGhpcywgcGFyYW1zLCBUZXh0LmRlZmF1bHRzLCBUZXh0Lmluc3RydWN0aW9ucykpO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBpcyBjYWxsZWQgYXMgcGFydCBvZiB0aGUgbGlmZWN5Y2xlIHRvIGNyZWF0ZSBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVGV4dFxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFRleHQsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy5wYXJhbXM7XG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIChwYXJhbXMuZm9udCBpbnN0YW5jZW9mIFByb21pc2UgPyBwYXJhbXMuZm9udCA6IFByb21pc2UucmVzb2x2ZShwYXJhbXMuZm9udCkpLnRoZW4oZnVuY3Rpb24gKGZvbnQpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkYXBwbHlCcmlkZ2UgPSBfdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgICAgICBnZW9tZXRyeTogbmV3IFRleHRHZW9tZXRyeShwYXJhbXMudGV4dCwgT2JqZWN0LmFzc2lnbihwYXJhbXMuZ2VvbWV0cnksIHtcbiAgICAgICAgICAgICAgZm9udDogZm9udFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBnZW9tZXRyeSA9IF90aGlzJGFwcGx5QnJpZGdlLmdlb21ldHJ5LFxuICAgICAgICAgICAgICBtYXRlcmlhbCA9IF90aGlzJGFwcGx5QnJpZGdlLm1hdGVyaWFsO1xuXG4gICAgICAgICAgcmVzb2x2ZShfdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgICAgICBtZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpXG4gICAgICAgICAgfSkubWVzaCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGdldCQzKGdldFByb3RvdHlwZU9mJDIoVGV4dC5wcm90b3R5cGUpLCBcIndhaXRcIiwgdGhpcykuY2FsbCh0aGlzLCBwcm9taXNlKTtcblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoVGV4dCwgX01lc2hDb21wb25lbnQpO1xuXG4gIHJldHVybiBUZXh0O1xufShNZXNoQ29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoVGV4dCwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgdGV4dDogJ0hlbGxvIFdvcmxkIScsXG4gIGZvbnQ6IG51bGwsXG4gIGdlb21ldHJ5OiB7XG4gICAgc2l6ZTogMTIsXG4gICAgaGVpZ2h0OiA1MCxcbiAgICBjdXJ2ZVNlZ21lbnRzOiAxMixcbiAgICBmb250OiBuZXcgRm9udCgpLFxuICAgIGJldmVsRW5hYmxlZDogZmFsc2UsXG4gICAgYmV2ZWxUaGlja25lc3M6IDEwLFxuICAgIGJldmVsU2l6ZTogOFxuICB9XG59KSksIFwiaW5zdHJ1Y3Rpb25zXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMpKSwgXCJsb2FkZXJcIiwgbmV3IEZvbnRMb2FkZXIoKSk7XG5cbi8qKlxuICogQGNsYXNzIFRvcnVzXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBUb3J1cyBjbGFzcyBtYWtlcyBhIHRvcnVzIGZpZ3VyZS4gQSBkb251dCBpcyBhIHRvcnVzLlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3MvaW5kZXguaHRtbCNhcGkvZ2VvbWV0cmllcy9Ub3J1c0dlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBUb3J1cywgYW5kIGFkZGluZyBpdCB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgVG9ydXMoe1xuICogICBnZW9tZXRyeToge1xuICogICAgIHJhZGl1czogNSxcbiAqICAgICB0dWJlOiAyXG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKlxuICogICBwb3NpdGlvbjoge1xuICogICAgIHk6IDM1XG4gKiAgIH1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIFRvcnVzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTWVzaENvbXBvbmVudCkge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVG9ydXMjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHJhZGl1czogMTAwLFxuICAgKiAgICAgdHViZTogNDAsXG4gICAqICAgICByYWRpYWxTZWdtZW50czogOCxcbiAgICogICAgIHR1YnVsYXJTZWdtZW50czogNixcbiAgICogICAgIGFyYzogTWF0aC5QSSAqIDJcbiAgICogICB9XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVG9ydXMjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiBbXG4gICAqICAgICAncmFkaXVzJyxcbiAgICogICAgICd0dWJlJyxcbiAgICogICAgICdyYWRpYWxTZWdtZW50cycsXG4gICAqICAgICAndHVidWxhclNlZ21lbnRzJyxcbiAgICogICAgICdhcmMnXG4gICAqICAgXVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgZnVuY3Rpb24gVG9ydXMoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBUb3J1cyk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihUb3J1cykuY2FsbCh0aGlzLCBwYXJhbXMsIFRvcnVzLmRlZmF1bHRzLCBUb3J1cy5pbnN0cnVjdGlvbnMpKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIF90aGlzLmJ1aWxkKHBhcmFtcyk7XG5cbiAgICAgIGdldCQzKGdldFByb3RvdHlwZU9mJDIoVG9ydXMucHJvdG90eXBlKSwgXCJ3cmFwXCIsIGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpLmNhbGwoYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVG9ydXNcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhUb3J1cywgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLnBhcmFtcztcblxuICAgICAgdmFyIF90aGlzJGFwcGx5QnJpZGdlID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgfSksXG4gICAgICAgICAgZ2VvbWV0cnkgPSBfdGhpcyRhcHBseUJyaWRnZS5nZW9tZXRyeSxcbiAgICAgICAgICBtYXRlcmlhbCA9IF90aGlzJGFwcGx5QnJpZGdlLm1hdGVyaWFsO1xuXG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIG1lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbClcbiAgICAgIH0pLm1lc2g7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJ1aWxkR2VvbWV0cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRHZW9tZXRyeSgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgcmV0dXJuIG5ldyBUb3J1c0dlb21ldHJ5KHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsIHBhcmFtcy5nZW9tZXRyeS50dWJlLCBwYXJhbXMuZ2VvbWV0cnkucmFkaWFsU2VnbWVudHMsIHBhcmFtcy5nZW9tZXRyeS50dWJ1bGFyU2VnbWVudHMsIHBhcmFtcy5nZW9tZXRyeS5hcmMpO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFRvcnVzLCBfTWVzaENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIFRvcnVzO1xufShNZXNoQ29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKFRvcnVzLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5kZWZhdWx0cywge1xuICBnZW9tZXRyeToge1xuICAgIHJhZGl1czogMTAwLFxuICAgIHR1YmU6IDQwLFxuICAgIHJhZGlhbFNlZ21lbnRzOiA4LFxuICAgIHR1YnVsYXJTZWdtZW50czogNixcbiAgICBhcmM6IE1hdGguUEkgKiAyXG4gIH1cbn0pKSwgXCJpbnN0cnVjdGlvbnNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucywge1xuICBnZW9tZXRyeTogWydyYWRpdXMnLCAndHViZScsICdyYWRpYWxTZWdtZW50cycsICd0dWJ1bGFyU2VnbWVudHMnLCAnYXJjJ11cbn0pKTtcblxuLyoqXG4gKiBAY2xhc3MgVG9ydXNrbm90XG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBUb3J1c2tub3QgY2xhc3MgbWFrZXMgYSB0b3J1c2tub3QgZmlndXJlLiBJdCdzIGxpa2UgYSBjcm9va2VkIGRvbnV0LCB2ZXJ5IGNyb29rZWQuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI1RvcnVzS25vdEdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBUb3J1c2tub3QsIGFuZCBhZGRpbmcgaXQgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IFRvcnVza25vdCh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcmFkaXVzOjUsXG4gKiAgICAgdHViZTogMlxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zOiB7XG4gKiAgICAgeTogMTAwXG4gKiAgIH1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIFRvcnVza25vdCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX01lc2hDb21wb25lbnQpIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlRvcnVza25vdCNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgcmFkaXVzOiAxMDAsXG4gICAqICAgICB0dWJlOiA0MCxcbiAgICogICAgIHJhZGlhbFNlZ21lbnRzOiA2NCxcbiAgICogICAgIHR1YnVsYXJTZWdtZW50czogOCxcbiAgICogICAgIHA6IDIsXG4gICAqICAgICBxOiAzXG4gICAqICAgfVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlRvcnVza25vdCNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IFtcbiAgICogICAgICdyYWRpdXMnLFxuICAgKiAgICAgJ3R1YmUnLFxuICAgKiAgICAgJ3JhZGlhbFNlZ21lbnRzJyxcbiAgICogICAgICd0dWJ1bGFyU2VnbWVudHMnLFxuICAgKiAgICAgJ3AnLFxuICAgKiAgICAgJ3EnXG4gICAqICAgXVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgZnVuY3Rpb24gVG9ydXNrbm90KCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVG9ydXNrbm90KTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFRvcnVza25vdCkuY2FsbCh0aGlzLCBwYXJhbXMsIFRvcnVza25vdC5kZWZhdWx0cywgVG9ydXNrbm90Lmluc3RydWN0aW9ucykpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgX3RoaXMuYnVpbGQocGFyYW1zKTtcblxuICAgICAgZ2V0JDMoZ2V0UHJvdG90eXBlT2YkMihUb3J1c2tub3QucHJvdG90eXBlKSwgXCJ3cmFwXCIsIGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpLmNhbGwoYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVG9ydXNrbm90XG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoVG9ydXNrbm90LCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMucGFyYW1zO1xuXG4gICAgICB2YXIgX3RoaXMkYXBwbHlCcmlkZ2UgPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgICB9KSxcbiAgICAgICAgICBnZW9tZXRyeSA9IF90aGlzJGFwcGx5QnJpZGdlLmdlb21ldHJ5LFxuICAgICAgICAgIG1hdGVyaWFsID0gX3RoaXMkYXBwbHlCcmlkZ2UubWF0ZXJpYWw7XG5cbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKVxuICAgICAgfSkubWVzaDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYnVpbGRHZW9tZXRyeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEdlb21ldHJ5KCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICB2YXIgR0NvbnN0cnVjdCA9IHBhcmFtcy5idWZmZXIgPyBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSA6IFRvcnVzS25vdEdlb21ldHJ5O1xuICAgICAgcmV0dXJuIG5ldyBHQ29uc3RydWN0KHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsIHBhcmFtcy5nZW9tZXRyeS50dWJlLCBwYXJhbXMuZ2VvbWV0cnkucmFkaWFsU2VnbWVudHMsIHBhcmFtcy5nZW9tZXRyeS50dWJ1bGFyU2VnbWVudHMsIHBhcmFtcy5nZW9tZXRyeS5wLCBwYXJhbXMuZ2VvbWV0cnkucSk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoVG9ydXNrbm90LCBfTWVzaENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIFRvcnVza25vdDtcbn0oTWVzaENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhUb3J1c2tub3QsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGdlb21ldHJ5OiB7XG4gICAgcmFkaXVzOiAxMDAsXG4gICAgdHViZTogNDAsXG4gICAgcmFkaWFsU2VnbWVudHM6IDY0LFxuICAgIHR1YnVsYXJTZWdtZW50czogOCxcbiAgICBwOiAyLFxuICAgIHE6IDNcbiAgfVxufSkpLCBcImluc3RydWN0aW9uc1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLCB7XG4gIGdlb21ldHJ5OiBbJ3JhZGl1cycsICd0dWJlJywgJ3JhZGlhbFNlZ21lbnRzJywgJ3R1YnVsYXJTZWdtZW50cycsICdwJywgJ3EnXVxufSkpO1xuXG4vKipcbiAqIEBjbGFzcyBUdWJlXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBUdWJlIGNsYXNzIG1ha2VzIGEgdHViZSB0aGF0IGV4dHJ1ZGVzIGFsb25nIGEgM2QgY3VydmUuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9pbmRleC5odG1sI2FwaS9nZW9tZXRyaWVzL1R1YmVHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgVHViZSBmcm9tIGEgdGhyZWUuanMgQ3VydmUsIGFuZCBhZGRpbmcgaXQgdG8gYXBwPC9jYXB0aW9uPlxuICogY29uc3QgQ3VzdG9tU2luQ3VydmUgPSBUSFJFRS5DdXJ2ZS5jcmVhdGUoXG4gKiAgIGZ1bmN0aW9uIChzY2FsZSkgeyAvLyBjdXN0b20gY3VydmUgY29uc3RydWN0b3JcbiAqICAgICB0aGlzLnNjYWxlID0gKHNjYWxlID09PSB1bmRlZmluZWQpID8gMSA6IHNjYWxlO1xuICogICB9LFxuICpcbiAqICAgZnVuY3Rpb24gKHQpIHsgLy8gZ2V0UG9pbnQ6IHQgaXMgYmV0d2VlbiAwLTFcbiAqICAgICBjb25zdCB0eCA9IHQgKiAzIC0gMS41LFxuICogICAgIHR5ID0gTWF0aC5zaW4oIDIgKiBNYXRoLlBJICogdCApLFxuICogICAgIHR6ID0gMDtcbiAqXG4gKiAgICAgcmV0dXJuIG5ldyBUSFJFRS5WZWN0b3IzKHR4LCB0eSwgdHopLm11bHRpcGx5U2NhbGFyKHRoaXMuc2NhbGUpO1xuICogICB9XG4gKiApO1xuICpcbiAqIGNvbnN0IHBhdGggPSBuZXcgQ3VzdG9tU2luQ3VydmUoMTApO1xuICpcbiAqIG5ldyBUdWJlKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICBwYXRoOiBwYXRoXG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSlcbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIFR1YmUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9NZXNoQ29tcG9uZW50KSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5UdWJlI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICBwYXRoOiBuZXcgVEhSRUUuTGluZUN1cnZlMyhuZXcgVmVjdG9yMygwLCAwLCAwKSwgbmV3IFZlY3RvcjMoMCwgMCwgMSkpLFxuICAgKiAgICAgc2VnbWVudHM6IDIwLFxuICAgKiAgICAgcmFkaXVzOiAyLFxuICAgKiAgICAgcmFkaXVzU2VnbWVudHM6IDgsXG4gICAqICAgICBjbG9zZWQ6IGZhbHNlXG4gICAqICAgfVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlR1YmUjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiBbXG4gICAqICAgICAncGF0aCcsXG4gICAqICAgICAnc2VnbWVudHMnLFxuICAgKiAgICAgJ3JhZGl1cycsXG4gICAqICAgICAncmFkaXVzU2VnbWVudHMnLFxuICAgKiAgICAgJ2Nsb3NlZCdcbiAgICogICBdXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBmdW5jdGlvbiBUdWJlKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVHViZSk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihUdWJlKS5jYWxsKHRoaXMsIHBhcmFtcywgVHViZS5kZWZhdWx0cywgVHViZS5pbnN0cnVjdGlvbnMpKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIF90aGlzLmJ1aWxkKHBhcmFtcyk7XG5cbiAgICAgIGdldCQzKGdldFByb3RvdHlwZU9mJDIoVHViZS5wcm90b3R5cGUpLCBcIndyYXBcIiwgYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSkuY2FsbChhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5UdWJlXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoVHViZSwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLnBhcmFtcztcblxuICAgICAgdmFyIF90aGlzJGFwcGx5QnJpZGdlID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgfSksXG4gICAgICAgICAgZ2VvbWV0cnkgPSBfdGhpcyRhcHBseUJyaWRnZS5nZW9tZXRyeSxcbiAgICAgICAgICBtYXRlcmlhbCA9IF90aGlzJGFwcGx5QnJpZGdlLm1hdGVyaWFsO1xuXG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIG1lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbClcbiAgICAgIH0pLm1lc2g7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJ1aWxkR2VvbWV0cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRHZW9tZXRyeSgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgdmFyIGdlb21ldHJ5ID0gbmV3IChwYXJhbXMuYnVmZmVyID8gVHViZUJ1ZmZlckdlb21ldHJ5IDogVHViZUdlb21ldHJ5KShwYXJhbXMuZ2VvbWV0cnkucGF0aCwgcGFyYW1zLmdlb21ldHJ5LnNlZ21lbnRzLCBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzLCBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzU2VnbWVudHMsIHBhcmFtcy5nZW9tZXRyeS5jbG9zZWQpO1xuICAgICAgcmV0dXJuIGdlb21ldHJ5O1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFR1YmUsIF9NZXNoQ29tcG9uZW50KTtcblxuICByZXR1cm4gVHViZTtcbn0oTWVzaENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhUdWJlLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5kZWZhdWx0cywge1xuICBnZW9tZXRyeToge1xuICAgIHBhdGg6IG5ldyBMaW5lQ3VydmUzKG5ldyBWZWN0b3IzKDAsIDAsIDApLCBuZXcgVmVjdG9yMygwLCAwLCAxKSksXG4gICAgc2VnbWVudHM6IDIwLFxuICAgIHJhZGl1czogMixcbiAgICByYWRpdXNTZWdtZW50czogOCxcbiAgICBjbG9zZWQ6IGZhbHNlXG4gIH1cbn0pKSwgXCJpbnN0cnVjdGlvbnNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucywge1xuICBnZW9tZXRyeTogWydwYXRoJywgJ3NlZ21lbnRzJywgJ3JhZGl1cycsICdyYWRpdXNTZWdtZW50cycsICdjbG9zZWQnXVxufSkpO1xuXG4vKipcbiAqIEBjbGFzcyBHcm91cFxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gU29tZXRpbWVzIHlvdSBuZWVkIHRvIG1ha2UgZ3JvdXBzIG9mIG9iamVjdHMgKGl0J3Mgbm90IGNvbnZlbmllbnRseSB0byBhcHBseSB0cmFuc2Zvcm1zIHRvIGVhY2ggb2JqZWN0IHdoZW4gY2FuIG1ha2UganVzdCBvbmUgdG8gYSBncm91cCkuPGJyLz5cbiAqIEluIFRocmVlLmpzIHlvdSBtYWtlIGl0IHVzaW5nIGBUSFJFRS5PYmplY3QzRGAgYW5kIGl0J3MgY2hpbGRyZW4uIDxici8+PGJyLz5cbiAqIEluIHdocy5qcyB3ZSBoYXZlIGBHcm91cGBcbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkFwcHJvYWNoIDIgLSBBZGRpbmcgb2JqZWN0cyB0byBhbiBlbXB0eSBncm91cDwvY2FwdGlvbj5cbiAqIGNvbnN0IHNwaGVyZSA9IG5ldyBTcGhlcmUoKTtcbiAqIGNvbnN0IGJveCA9IG5ldyBCb3goKTtcbiAqIGNvbnN0IGdyb3VwID0gbmV3IEdyb3VwKCk7XG4gKlxuICogc3BoZXJlLmFkZFRvKGdyb3VwKTtcbiAqIGJveC5hZGRUbyhncm91cCk7XG4qIEBleGFtcGxlIDxjYXB0aW9uPkFwcHJvYWNoIDIgLSBNYWtpbmcgYSBncm91cCBmcm9tIG9iamVjdHM8L2NhcHRpb24+XG4gKiBjb25zdCBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG4gKiBjb25zdCBib3ggPSBuZXcgQm94KCk7XG4gKiBjb25zdCBncm91cCA9IG5ldyBHcm91cChib3gsIHNwaGVyZSk7XG4gKiAvLyBPUjogY29uc3QgZ3JvdXAgPSBuZXcgR3JvdXAoW2JveCwgc3BoZXJlXSk7XG4gKi9cblxudmFyIEdyb3VwJDEgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9NZXNoQ29tcG9uZW50KSB7XG4gIGZ1bmN0aW9uIEdyb3VwJCQxKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEdyb3VwJCQxKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKEdyb3VwJCQxKS5jYWxsKHRoaXMsIHt9KSk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG9iaiA9IGkgPCAwIHx8IGFyZ3VtZW50cy5sZW5ndGggPD0gaSA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1tpXTtcbiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDb21wb25lbnQpIG9iai5hZGRUbyhhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSkpO2Vsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE9iamVjdDNEKSBfdGhpcy5uYXRpdmUuYWRkKG9iaik7XG4gICAgfVxuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoR3JvdXAkJDEsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgcmV0dXJuIG5ldyBPYmplY3QzRCgpO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKEdyb3VwJCQxLCBfTWVzaENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIEdyb3VwJCQxO1xufShNZXNoQ29tcG9uZW50KTtcblxuLyoqIEBtb2R1bGUgY29tcG9uZW50cy9tZXNoZXMgKi9cblxuLyoqXG4gKiBAY2xhc3MgRWxlbWVudE1vZHVsZVxuICogQGNhdGVnb3J5IG1vZHVsZXMvYXBwXG4gKiBAcGFyYW0ge09iamVjdH0gW2NvbnRhaW5lcj1kb2N1bWVudC5ib2R5XSBjb250YWluZXIgaXMgdGhlIERPTSBvYmplY3QgdG8gd2hpY2ggYXBwbGljYXRpb24ncyBjYW52YXMgd2lsbCBiZSBhZGRlZCB0by5cbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHBcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGFuIGVsZW1lbnQgbW9kdWxlLCBwYXNzaW5nIGl0IHRvIHRoZSBBcHA8L2NhcHRpb24+XG4gKiBuZXcgQXBwKFtcbiAqICAgbmV3IEVsZW1lbnRNb2R1bGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcCcpKVxuICogXSk7XG4gKi9cbnZhciBFbGVtZW50TW9kdWxlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRWxlbWVudE1vZHVsZSgpIHtcbiAgICB2YXIgY29udGFpbmVyID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBkb2N1bWVudC5ib2R5O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRWxlbWVudE1vZHVsZSk7XG5cbiAgICBpZiAoY29udGFpbmVyLmNvbnRhaW5lcikge1xuICAgICAgY29uc29sZS53YXJuKCdFbGVtZW50TW9kdWxlIG5vdyBhY2NlcHRzIG9ubHkgYXJndW1lbnQgd2hpY2ggaXMgYSBET00gb2JqZWN0LCBub3QgYSBwYXJhbXMgb2JqZWN0LicpO1xuICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXIuY29udGFpbmVyO1xuICAgIH0gZWxzZSB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcblxuICAgIHRoaXMuY3JlYXRlRWxlbWVudCgpO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGNyZWF0ZUVsZW1lbnRcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgY2FudmFzIGVsZW1lbnQuXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuRWxlbWVudE1vZHVsZVxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKEVsZW1lbnRNb2R1bGUsIFt7XG4gICAga2V5OiBcImNyZWF0ZUVsZW1lbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlRWxlbWVudCgpIHtcbiAgICAgIHRoaXMuZWxlbWVudCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMuZWxlbWVudC5jbGFzc05hbWUgPSAnd2hzLWFwcCc7XG4gICAgICB0aGlzLmVsZW1lbnQuc3R5bGUud2lkdGggPSAnaW5oZXJpdCc7XG4gICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJ2luaGVyaXQnO1xuICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWFuYWdlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYW5hZ2VyKF9tYW5hZ2VyKSB7XG4gICAgICBfbWFuYWdlci5zZXQoJ2VsZW1lbnQnLCB0aGlzLmVsZW1lbnQpO1xuXG4gICAgICBfbWFuYWdlci5zZXQoJ2NvbnRhaW5lcicsIHRoaXMuY29udGFpbmVyKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW50ZWdyYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludGVncmF0ZShzZWxmKSB7XG4gICAgICBzZWxmLmNvbnRhaW5lci5hcHBlbmRDaGlsZChzZWxmLmVsZW1lbnQpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBFbGVtZW50TW9kdWxlO1xufSgpO1xuXG4vKipcbiAqIEBjbGFzcyBSZW5kZXJpbmdNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj4gQ3JlYXRpbmcgYSByZW5kZXJpbmcgbW9kdWxlIGFuZCBwYXNzaW5nIGl0IHRvIEFwcCdzIG1vZHVsZXM8L2NhcHRpb24+XG4gKiBuZXcgQXBwKFtcbiAqICAgbmV3IEVsZW1lbnRNb2R1bGUoKSxcbiAqICAgbmV3IFNjZW5lTW9kdWxlKCksXG4gKiAgIG5ldyBEZWZpbmVNb2R1bGUoJ2NhbWVyYScsIG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSh7XG4gKiAgICAgcG9zaXRpb246IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDYsIDE4KSxcbiAqICAgICBmYXI6IDEwMDAwXG4gKiAgIH0pKSxcbiAqICAgbmV3IFJlbmRlcmluZ01vZHVsZSh7XG4gKiAgICAgYmdDb2xvcjogMHgxNjIxMjksXG4gKlxuICogICAgIHJlbmRlcmVyOiB7XG4gKiAgICAgICBhbnRpYWxpYXM6IHRydWVcbiAqICAgICB9XG4gKiAgIH0sIHtzaGFkb3c6IHRydWV9KVxuICogXSk7XG4gKi9cblxudmFyIFJlbmRlcmluZ01vZHVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBhZGRpdGlvbmFsXG4gICAqIEBkZXNjcmlwdGlvbiBjb2xsZWN0aW9uIG9mIGFkZGl0aW9uYWwgc2NyaXB0c1xuICAgKiBAc3RhdGljXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvcmUuQXBwI2FkZGl0aW9uYWxcbiAgICogQHB1YmxpY1xuICAgKi9cblxuICAvKipcbiAgICogZW5hYmxlZFxuICAgKiBAc3RhdGljXG4gICAqIEBtZW1iZXIge0Jvb2xlYW59IG1vZHVsZTpjb3JlLkFwcCNlbmFibGVkXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGZ1bmN0aW9uIFJlbmRlcmluZ01vZHVsZSgpIHtcbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICB2YXIgYWRkaXRpb25hbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUmVuZGVyaW5nTW9kdWxlKTtcblxuICAgIGRlZmluZVByb3BlcnR5JDModGhpcywgXCJlbmFibGVkXCIsIHRydWUpO1xuXG4gICAgdGhpcy5wYXJhbXMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIHdpZHRoOiB3aW5kb3cuaW5uZXJXaWR0aCxcbiAgICAgIGhlaWdodDogd2luZG93LmlubmVySGVpZ2h0LFxuICAgICAgcmVzb2x1dGlvbjogbmV3IFZlY3RvcjIoMSwgMSksXG4gICAgICBwaXhlbFJhdGlvOiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgIGJnQ29sb3I6IDB4MDAwMDAwLFxuICAgICAgYmdPcGFjaXR5OiAxLFxuICAgICAgcmVuZGVyZXI6IHt9LFxuICAgICAgZml4OiBmdW5jdGlvbiBmaXgoKSB7fVxuICAgIH0sIHBhcmFtcyk7XG4gICAgdmFyIF90aGlzJHBhcmFtcyA9IHRoaXMucGFyYW1zLFxuICAgICAgICBiZ0NvbG9yID0gX3RoaXMkcGFyYW1zLmJnQ29sb3IsXG4gICAgICAgIGJnT3BhY2l0eSA9IF90aGlzJHBhcmFtcy5iZ09wYWNpdHksXG4gICAgICAgIF9yZW5kZXJlciA9IF90aGlzJHBhcmFtcy5yZW5kZXJlcixcbiAgICAgICAgcGl4ZWxSYXRpbyA9IF90aGlzJHBhcmFtcy5waXhlbFJhdGlvLFxuICAgICAgICB3aWR0aCA9IF90aGlzJHBhcmFtcy53aWR0aCxcbiAgICAgICAgaGVpZ2h0ID0gX3RoaXMkcGFyYW1zLmhlaWdodCxcbiAgICAgICAgcmVzb2x1dGlvbiA9IF90aGlzJHBhcmFtcy5yZXNvbHV0aW9uLFxuICAgICAgICBmaXggPSBfdGhpcyRwYXJhbXMuZml4O1xuICAgIHRoaXMucmVuZGVyZXIgPSBuZXcgV2ViR0xSZW5kZXJlcihfcmVuZGVyZXIpO1xuICAgIHRoaXMuZWZmZWN0cyA9IFtdO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0Q2xlYXJDb2xvcihiZ0NvbG9yLCBiZ09wYWNpdHkpO1xuICAgIGlmIChwaXhlbFJhdGlvKSB0aGlzLnJlbmRlcmVyLnNldFBpeGVsUmF0aW8ocGl4ZWxSYXRpbyk7XG4gICAgdGhpcy5zZXRTaXplKE51bWJlcih3aWR0aCAqIHJlc29sdXRpb24ueCkudG9GaXhlZCgpLCBOdW1iZXIoaGVpZ2h0ICogcmVzb2x1dGlvbi55KS50b0ZpeGVkKCkpO1xuXG4gICAgZm9yICh2YXIga2V5IGluIGFkZGl0aW9uYWwpIHtcbiAgICAgIGlmIChhZGRpdGlvbmFsW2tleV0pIHRoaXMuYXBwbHlBZGRpdGlvbmFsKGtleSk7XG4gICAgfVxuXG4gICAgZml4KHRoaXMucmVuZGVyZXIpO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGFwcGx5QWRkaXRpb25hbFxuICAgKiBAZGVzY3JpcHRpb24gQXBwbHkgYWRkaXRpb25hbCBzY3JpcHQgZnJvbSBSZW5kZXJpbmdNb2R1bGUuYWRkaXRpb25hbFxuICAgKiBAcGFyYW0ge1N0aXJuZ30gbmFtZSBTY3JpcHQgbmFtZVxuICAgKiBAcmV0dXJuIHt0aGlzfVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlJlbmRlcmluZ01vZHVsZVxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFJlbmRlcmluZ01vZHVsZSwgW3tcbiAgICBrZXk6IFwiYXBwbHlBZGRpdGlvbmFsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGx5QWRkaXRpb25hbChuYW1lKSB7XG4gICAgICBSZW5kZXJpbmdNb2R1bGUuYWRkaXRpb25hbFtuYW1lXS5hcHBseSh0aGlzLCBbdGhpcy5yZW5kZXJlcl0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGludGVncmF0ZVJlbmRlcmVyXG4gICAgICogQGRlc2NyaXB0aW9uIEludGVncmF0ZSByZW5kZXJlclxuICAgICAqIEBwYXJhbSB7Tm9kZUVsZW1lbnR9IGVsZW1lbnQgRE9NIG9iamVjdFxuICAgICAqIEBwYXJhbSB7VEhSRUUuU2NlbmV9IHNjZW5lIHVzZWQgc2NlbmVcbiAgICAgKiBAcGFyYW0ge1RIUkVFLkNhbWVyYX0gY2FtZXJhIHVzZWQgY2FtZXJhXG4gICAgICogQHJldHVybiB7TG9vcH0gcmVuZGVyTG9vcFxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVuZGVyaW5nTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpbnRlZ3JhdGVSZW5kZXJlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnRlZ3JhdGVSZW5kZXJlcihlbGVtZW50LCBzY2VuZSwgY2FtZXJhKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB0aGlzLnNjZW5lID0gc2NlbmU7XG4gICAgICB0aGlzLmNhbWVyYSA9IGNhbWVyYTtcbiAgICAgIHRoaXMuYXR0YWNoVG9DYW52YXMoZWxlbWVudCk7XG4gICAgICByZXR1cm4gbmV3IExvb3AoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3RoaXMucmVuZGVyZXIucmVuZGVyKF90aGlzLnNjZW5lLCBfdGhpcy5jYW1lcmEpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgZWZmZWN0XG4gICAgICogQGRlc2NyaXB0aW9uIEFkZCB0aHJlZS5qcyBlZmZlY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZWZmZWN0IHRocmVlLmpzIGVmZmVjdFxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGVmZmVjdExvb3AgdXBkYXRlIGZ1bmN0aW9uIGZvciBlZmZlY3RcbiAgICAgKiBAcmV0dXJuIHt0aGlzfVxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVuZGVyaW5nTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJlZmZlY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZWZmZWN0KF9lZmZlY3QpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgZWZmZWN0TG9vcCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBfZWZmZWN0LnJlbmRlcihfdGhpczIuc2NlbmUsIF90aGlzMi5jYW1lcmEpO1xuICAgICAgfTtcbiAgICAgIHRoaXMucmVuZGVyTG9vcC5zdG9wKCk7XG4gICAgICB2YXIgc2l6ZSA9IHRoaXMucmVuZGVyZXIuZ2V0U2l6ZSgpO1xuXG4gICAgICBfZWZmZWN0LnNldFNpemUoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpO1xuXG4gICAgICB2YXIgbG9vcCA9IG5ldyBMb29wKGVmZmVjdExvb3ApO1xuICAgICAgdGhpcy5lZmZlY3RzLnB1c2gobG9vcCk7XG4gICAgICBpZiAodGhpcy5lbmFibGVkKSBsb29wLnN0YXJ0KHRoaXMuYXBwKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHNldFNpemVcbiAgICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlIHJlbmRlciB0YXJnZXQgd2lkdGggYW5kIGhlaWdodC5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gd2lkdGhcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5SZW5kZXJpbmdNb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFNpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICBpZiAodGhpcy5yZW5kZXJlcikgdGhpcy5yZW5kZXJlci5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGF0dGFjaFRvQ2FudmFzXG4gICAgICogQGRlc2NyaXB0aW9uIEF0dGFjaCByZW5kZXJlci5kb21FbGVtZW50IHRvIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge05vZGVFbGVtZW50fSBlbGVtZW50IERPTSBvYmplY3RcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlJlbmRlcmluZ01vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYXR0YWNoVG9DYW52YXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXR0YWNoVG9DYW52YXMoZWxlbWVudCkge1xuICAgICAgdmFyIGNhbnZhcyA9IHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudDsgLy8gYXR0YWNoIHRvIG5ldyBwYXJlbnQgd29ybGQgZG9tXG5cbiAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2FudmFzKTtcbiAgICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgIGNhbnZhcy5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2Qgc3RvcFxuICAgICAqIEBkZXNjcmlwdGlvbiBTdG9wcyByZW5kZXJMb29wIGFuZCBlZmZlY3QgbG9vcHNcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlJlbmRlcmluZ01vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic3RvcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdG9wKCkge1xuICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2U7XG4gICAgICB0aGlzLnJlbmRlckxvb3Auc3RvcCgpO1xuICAgICAgdGhpcy5lZmZlY3RzLmZvckVhY2goZnVuY3Rpb24gKGxvb3ApIHtcbiAgICAgICAgcmV0dXJuIGxvb3Auc3RvcCgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgcGxheVxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXN1bWVzIHJlbmRlckxvb3AgYW5kIGVmZmVjdCBsb29wc1xuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVuZGVyaW5nTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJwbGF5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBsYXkoKSB7XG4gICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlO1xuICAgICAgdGhpcy5yZW5kZXJMb29wLnN0YXJ0KCk7XG4gICAgICB0aGlzLmVmZmVjdHMuZm9yRWFjaChmdW5jdGlvbiAobG9vcCkge1xuICAgICAgICByZXR1cm4gbG9vcC5zdGFydCgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm1hbmFnZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFuYWdlcihfbWFuYWdlcikge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIF9tYW5hZ2VyLmRlZmluZSgncmVuZGVyaW5nJyk7XG5cbiAgICAgIF9tYW5hZ2VyLnNldCgncmVuZGVyZXInLCB0aGlzLnJlbmRlcmVyKTtcblxuICAgICAgdGhpcy5hcHAgPSBfbWFuYWdlci5oYW5kbGVyO1xuICAgICAgdGhpcy5yZW5kZXJMb29wID0gdGhpcy5pbnRlZ3JhdGVSZW5kZXJlcihfbWFuYWdlci5nZXQoJ2VsZW1lbnQnKSwgX21hbmFnZXIuZ2V0KCdzY2VuZScpLCBfbWFuYWdlci5nZXQoJ2NhbWVyYScpLm5hdGl2ZSk7XG5cbiAgICAgIF9tYW5hZ2VyLnVwZGF0ZSh7XG4gICAgICAgIGVsZW1lbnQ6IGZ1bmN0aW9uIGVsZW1lbnQoX2VsZW1lbnQpIHtcbiAgICAgICAgICBfdGhpczMuYXR0YWNoVG9DYW52YXMoX2VsZW1lbnQpO1xuICAgICAgICB9LFxuICAgICAgICBzY2VuZTogZnVuY3Rpb24gc2NlbmUoX3NjZW5lKSB7XG4gICAgICAgICAgX3RoaXMzLnNjZW5lID0gX3NjZW5lO1xuICAgICAgICB9LFxuICAgICAgICBjYW1lcmE6IGZ1bmN0aW9uIGNhbWVyYShfY2FtZXJhKSB7XG4gICAgICAgICAgX3RoaXMzLmNhbWVyYSA9IF9jYW1lcmEubmF0aXZlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW50ZWdyYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludGVncmF0ZShzZWxmKSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgc2VsZi5yZW5kZXJMb29wLnN0YXJ0KHRoaXMpO1xuICAgICAgc2VsZi5lZmZlY3RzLmZvckVhY2goZnVuY3Rpb24gKGxvb3ApIHtcbiAgICAgICAgcmV0dXJuIGxvb3Auc3RhcnQoX3RoaXM0KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGRpc3Bvc2VcbiAgICAgKiBAZGVzY3JpcHRpb24gRGlzcG9zZSByZW5kZXJpbmcgY29udGV4dFxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVuZGVyaW5nTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkaXNwb3NlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgICB0aGlzLnN0b3AoKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuZm9yY2VDb250ZXh0TG9zcygpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSZW5kZXJpbmdNb2R1bGU7XG59KCk7XG5cbmRlZmluZVByb3BlcnR5JDMoUmVuZGVyaW5nTW9kdWxlLCBcImFkZGl0aW9uYWxcIiwge1xuICBzaGFkb3c6IGZ1bmN0aW9uIHNoYWRvdyhyZW5kZXJlcikge1xuICAgIHJlbmRlcmVyLnNoYWRvd01hcC5lbmFibGVkID0gdHJ1ZTtcbiAgfVxufSk7XG5cbnZhciBTWU1CT0xfQ0hJTERSRU5fRk9SX1NDRU5FID0gU3ltYm9sKCdTWU1CT0xfQ0hJTERSRU5fRk9SX1NDRU5FJyk7XG4vKipcbiAqIEBjbGFzcyBTY2VuZU1vZHVsZVxuICogQGNhdGVnb3J5IG1vZHVsZXMvYXBwXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFt3aWxsU2NlbmVCZVJlcGxhY2VkPWZhbHNlXSB3aWxsU2NlbmVCZVJlcGxhY2VkIHNob3VsZCBiZSB0cnVlIG9ubHkgaWYgeW91IGFyZSBnb2luZyB0byBvdmVyd3JpdGUgc2NlbmUgZGVwZW5kZW5jeSBldmVuIHdpdGhvdXQgdGhlIHVzZSBvZiBkZWZhdWx0IG9uZS5cbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHBcbiAqL1xuXG52YXIgU2NlbmVNb2R1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTY2VuZU1vZHVsZSgpIHtcbiAgICB2YXIgd2lsbFNjZW5lQmVSZXBsYWNlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTY2VuZU1vZHVsZSk7XG5cbiAgICB0aGlzLnNjZW5lID0gd2lsbFNjZW5lQmVSZXBsYWNlZCA/IG51bGwgOiBuZXcgU2NlbmUoKTtcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKFNjZW5lTW9kdWxlLCBbe1xuICAgIGtleTogXCJtYW5hZ2VyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hbmFnZXIoX21hbmFnZXIpIHtcbiAgICAgIF9tYW5hZ2VyLnNldCgnc2NlbmUnLCB0aGlzLnNjZW5lKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW50ZWdyYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludGVncmF0ZShzZWxmKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMsIHtcbiAgICAgICAgYWRkOiBmdW5jdGlvbiBhZGQob2JqZWN0KSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgICAgIHJldHVybiBhc3luY1RvR2VuZXJhdG9yKFxuICAgICAgICAgIC8qI19fUFVSRV9fKi9cbiAgICAgICAgICByZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmplY3QucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5wYXJlbnQucmVtb3ZlKG9iamVjdCk7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Qud2FpdCgpO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QubmF0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDc7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29tcG9zaXRpb25FcnJvcignU2NlbmVNb2R1bGUnLCAndGhlcmUgaXMgbm8gb2JqZWN0Lm5hdGl2ZScsIF90aGlzKTtcblxuICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICBvYmplY3QucGFyZW50ID0gX3RoaXM7XG4gICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgICAgICAgICAgICAgICBvbkFkZDogb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIH0pLm9uQWRkO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICBzZWxmLnNjZW5lLmFkZChvYmplY3QubmF0aXZlKTtcblxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5jaGlsZHJlbi5wdXNoKG9iamVjdCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCBvYmplY3QpO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgX2NhbGxlZSwgdGhpcyk7XG4gICAgICAgICAgfSkpKCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKG9iamVjdCkge1xuICAgICAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICAgICAgcmV0dXJuIGFzeW5jVG9HZW5lcmF0b3IoXG4gICAgICAgICAgLyojX19QVVJFX18qL1xuICAgICAgICAgIHJlZ2VuZXJhdG9yLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3Iud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7XG4gICAgICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGlmICghKG9iamVjdC5wYXJlbnQgIT09IF90aGlzMikpIHtcbiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiKTtcblxuICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Qud2FpdCgpO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIG9iamVjdC5wYXJlbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnNjZW5lLnJlbW92ZShvYmplY3QubmF0aXZlKTtcblxuICAgICAgICAgICAgICAgICAgICBfdGhpczIuY2hpbGRyZW4uc3BsaWNlKF90aGlzMi5jaGlsZHJlbi5pbmRleE9mKG9iamVjdCksIDEpO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgX2NhbGxlZTIsIHRoaXMpO1xuICAgICAgICAgIH0pKSgpO1xuICAgICAgICB9LFxuICAgICAgICBfc2V0U2NlbmU6IGZ1bmN0aW9uIF9zZXRTY2VuZShzY2VuZSkge1xuICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSBzY2VuZVtTWU1CT0xfQ0hJTERSRU5fRk9SX1NDRU5FXSA9IHNjZW5lW1NZTUJPTF9DSElMRFJFTl9GT1JfU0NFTkVdIHx8IFtdO1xuICAgICAgICAgIHNlbGYuc2NlbmUgPSBzY2VuZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0U2NlbmU6IGZ1bmN0aW9uIHNldFNjZW5lKHNjZW5lKSB7XG4gICAgICAgICAgdGhpcy5fc2V0U2NlbmUoc2NlbmUpO1xuXG4gICAgICAgICAgdGhpcy5tYW5hZ2VyLnNldCgnc2NlbmUnLCBzY2VuZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFNjZW5lOiBmdW5jdGlvbiBnZXRTY2VuZSgpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5zY2VuZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoc2VsZi5zY2VuZSkgdGhpcy5fc2V0U2NlbmUoc2VsZi5zY2VuZSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFNjZW5lTW9kdWxlO1xufSgpO1xuXG4vLyBpbXBvcnQge2FkZFJlc2l6ZUxpc3RlbmVyfSBmcm9tICdkZXRlY3QtZWxlbWVudC1yZXNpemUnO1xuXG4vKipcbiAqIEBjbGFzcyBSZXNpemVNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXM9e2F1dG86IHRydWV9XSAtIElmIGF1dG8gaXMgc2V0IHRvIHRydWUgLSByZXNpemUgd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiBjb250YWluZXIgcmVzaXplc1xuICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcFxuICovXG52YXIgUmVzaXplTW9kdWxlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUmVzaXplTW9kdWxlKCkge1xuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUmVzaXplTW9kdWxlKTtcblxuICAgIHRoaXMucGFyYW1zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBhdXRvOiB0cnVlXG4gICAgfSwgcGFyYW1zKTtcbiAgICB0aGlzLmNhbGxiYWNrcyA9IFt0aGlzLnNldFNpemUuYmluZCh0aGlzKV07XG4gIH1cbiAgLyoqXG4gICAqIEBmdW5jdGlvbiBzZXRTaXplXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBwcm92aWRlZCB3aWR0aCAmIGhlaWdodCB0byB0aGUgcmVuZGVyZXIgb2JqZWN0LlxuICAgKiBAcGFyYW0ge051bWJlcn0gW3dpZHRoPTFdIC0gVGhlIHByb21pc2UgdGhhdCBzaG91bGQgYmUgYWRkZWQgdG8gYSBxdWV1ZS5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtoZWlnaHQ9MV0gLSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gYWxsIHByb21pc2VzIGNvbXBsZXRlZC5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5SZXNpemVNb2R1bGVcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhSZXNpemVNb2R1bGUsIFt7XG4gICAga2V5OiBcInNldFNpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2l6ZSgpIHtcbiAgICAgIHZhciB3aWR0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMTtcbiAgICAgIHZhciBoZWlnaHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDE7XG4gICAgICB0aGlzLmNhbWVyYS5uYXRpdmUuYXNwZWN0ID0gd2lkdGggLyBoZWlnaHQ7XG4gICAgICB0aGlzLmNhbWVyYS5uYXRpdmUudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuICAgICAgaWYgKHRoaXMucmVuZGVyaW5nKSB0aGlzLnJlbmRlcmluZy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHRyaWdnZXJcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gVHJpZ2dlcnMgcmVzaXplIHdoZW4gY2FsbGVkLiB3aWR0aCAmIGhlaWdodCBhcmUgZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5XG4gICAgICogVGhpcyBpbnZva2VzIGVhY2ggY2FsbGJhY2tzIHdpdGggdGhlIG5ldyB3aWR0aCBhbmQgaGVpZ2h0IGFzIHBhcmFtc1xuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVzaXplTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ0cmlnZ2VyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRyaWdnZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkY29udGFpbmVyID0gdGhpcy5jb250YWluZXIsXG4gICAgICAgICAgb2Zmc2V0V2lkdGggPSBfdGhpcyRjb250YWluZXIub2Zmc2V0V2lkdGgsXG4gICAgICAgICAgb2Zmc2V0SGVpZ2h0ID0gX3RoaXMkY29udGFpbmVyLm9mZnNldEhlaWdodCxcbiAgICAgICAgICByZXNvbHV0aW9uID0gdGhpcy5yZXNvbHV0aW9uO1xuICAgICAgdmFyIHdpZHRoID0gTnVtYmVyKG9mZnNldFdpZHRoICogcmVzb2x1dGlvbi54KS50b0ZpeGVkKCk7XG4gICAgICB2YXIgaGVpZ2h0ID0gTnVtYmVyKG9mZnNldEhlaWdodCAqIHJlc29sdXRpb24ueSkudG9GaXhlZCgpO1xuICAgICAgdGhpcy5jYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgY2Iod2lkdGgsIGhlaWdodCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBhZGRBdXRvcmVzaXplXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIFNldHMgbW9kdWxlIHRvIGF1dG9yZXNpemUsIHRoaXMgYWRkcyBhbiBldmVudCBsaXN0ZW5lIG9uIHdpbmRvdyByZXNpemUgdG8gdHJpZ2dlciB0aGUgcmVzaXplXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5SZXNpemVNb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImFkZEF1dG9yZXNpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkQXV0b3Jlc2l6ZSgpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXIoKTtcbiAgICAgIHRoaXMucmVzb2x1dGlvbiA9IHRoaXMuZ2V0UmVzb2x1dGlvbigpO1xuICAgICAgaWYgKHRoaXMucGFyYW1zLmF1dG8pIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnRyaWdnZXIuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgYWRkQ2FsbGJhY2tcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gQWRkcyBhIGNhbGwgYmFjayBmdW5jdGlvbiB0byB0aGUgZXhpc3RpbmcgY2FsbGJhY2tzIGxpc3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBhZGRcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlJlc2l6ZU1vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkQ2FsbGJhY2tcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkQ2FsbGJhY2soZnVuYykge1xuICAgICAgdGhpcy5jYWxsYmFja3MucHVzaChmdW5jKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWFuYWdlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYW5hZ2VyKF9tYW5hZ2VyKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBfbWFuYWdlci5kZWZpbmUoJ3Jlc2l6ZScpO1xuXG4gICAgICB0aGlzLnJlbmRlcmluZyA9IF9tYW5hZ2VyLmdldCgncmVuZGVyZXInKTtcbiAgICAgIHRoaXMuY2FtZXJhID0gX21hbmFnZXIuZ2V0KCdjYW1lcmEnKTtcblxuICAgICAgdGhpcy5nZXRSZXNvbHV0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX21hbmFnZXIudXNlKCdyZW5kZXJpbmcnKS5wYXJhbXMucmVzb2x1dGlvbjtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuZ2V0Q29udGFpbmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX21hbmFnZXIuZ2V0KCdjb250YWluZXInKTtcbiAgICAgIH07XG5cbiAgICAgIF9tYW5hZ2VyLnVwZGF0ZSh7XG4gICAgICAgIGNvbnRhaW5lcjogZnVuY3Rpb24gY29udGFpbmVyKF9jb250YWluZXIpIHtcbiAgICAgICAgICBfdGhpcy5jb250YWluZXIgPSBfY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5hZGRBdXRvcmVzaXplKCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFJlc2l6ZU1vZHVsZTtcbn0oKTtcblxudmFyIGZyYWdtZW50ID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0UHJldmlvdXNMdW07XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdEN1cnJlbnRMdW07XFxyXFxudW5pZm9ybSBmbG9hdCBtaW5MdW1pbmFuY2U7XFxyXFxudW5pZm9ybSBmbG9hdCBkZWx0YTtcXHJcXG51bmlmb3JtIGZsb2F0IHRhdTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHRmbG9hdCBwcmV2aW91c0x1bSA9IHRleHR1cmUyRCh0UHJldmlvdXNMdW0sIHZVdiwgTUlQX0xFVkVMXzFYMSkucjtcXHJcXG5cXHRmbG9hdCBjdXJyZW50THVtID0gdGV4dHVyZTJEKHRDdXJyZW50THVtLCB2VXYsIE1JUF9MRVZFTF8xWDEpLnI7XFxyXFxuXFxyXFxuXFx0cHJldmlvdXNMdW0gPSBtYXgobWluTHVtaW5hbmNlLCBwcmV2aW91c0x1bSk7XFxyXFxuXFx0Y3VycmVudEx1bSA9IG1heChtaW5MdW1pbmFuY2UsIGN1cnJlbnRMdW0pO1xcclxcblxcclxcblxcdC8vIEFkYXB0IHRoZSBsdW1pbmFuY2UgdXNpbmcgUGF0dGFuYWlrJ3MgdGVjaG5pcXVlLlxcclxcblxcdGZsb2F0IGFkYXB0ZWRMdW0gPSBwcmV2aW91c0x1bSArIChjdXJyZW50THVtIC0gcHJldmlvdXNMdW0pICogKDEuMCAtIGV4cCgtZGVsdGEgKiB0YXUpKTtcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IuciA9IGFkYXB0ZWRMdW07XFxyXFxuXFxyXFxufVxcclxcblwiO1xudmFyIHZlcnRleCA9IFwidmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG4vKipcclxuICogQW4gYWRhcHRpdmUgbHVtaW5vc2l0eSBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqL1xuXG52YXIgQWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9TaGFkZXJNYXRlcmlhbCkge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGFkYXB0aXZlIGx1bWlub3NpdHkgbWF0ZXJpYWwuXHJcbiAgICovXG4gIGZ1bmN0aW9uIEFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsKCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsKTtcblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoQWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwpLmNhbGwodGhpcywge1xuICAgICAgdHlwZTogXCJBZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbFwiLFxuICAgICAgZGVmaW5lczoge1xuICAgICAgICBNSVBfTEVWRUxfMVgxOiBcIjAuMFwiXG4gICAgICB9LFxuICAgICAgdW5pZm9ybXM6IHtcbiAgICAgICAgdFByZXZpb3VzTHVtOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgdEN1cnJlbnRMdW06IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICBtaW5MdW1pbmFuY2U6IG5ldyBVbmlmb3JtKDAuMDEpLFxuICAgICAgICBkZWx0YTogbmV3IFVuaWZvcm0oMC4wKSxcbiAgICAgICAgdGF1OiBuZXcgVW5pZm9ybSgxLjApXG4gICAgICB9LFxuICAgICAgZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50LFxuICAgICAgdmVydGV4U2hhZGVyOiB2ZXJ0ZXgsXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcbiAgICAgIGRlcHRoVGVzdDogZmFsc2VcbiAgICB9KSk7XG4gIH1cblxuICBpbmhlcml0cyhBZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbCwgX1NoYWRlck1hdGVyaWFsKTtcblxuICByZXR1cm4gQWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWw7XG59KFNoYWRlck1hdGVyaWFsKTtcblxudmFyIGZyYWdtZW50JDEgPSBcInVuaWZvcm0gc2FtcGxlcjJEIHREaWZmdXNlO1xcclxcbnVuaWZvcm0gc2FtcGxlcjJEIHREZXB0aDtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IGZvY3VzO1xcclxcbnVuaWZvcm0gZmxvYXQgZG9mO1xcclxcbnVuaWZvcm0gZmxvYXQgYXNwZWN0O1xcclxcbnVuaWZvcm0gZmxvYXQgYXBlcnR1cmU7XFxyXFxudW5pZm9ybSBmbG9hdCBtYXhCbHVyO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxuI2lmbmRlZiBVU0VfTE9HREVQVEhCVUZcXHJcXG5cXHJcXG5cXHQjaW5jbHVkZSA8cGFja2luZz5cXHJcXG5cXHJcXG5cXHR1bmlmb3JtIGZsb2F0IGNhbWVyYU5lYXI7XFxyXFxuXFx0dW5pZm9ybSBmbG9hdCBjYW1lcmFGYXI7XFxyXFxuXFxyXFxuXFx0ZmxvYXQgcmVhZERlcHRoKHNhbXBsZXIyRCBkZXB0aFNhbXBsZXIsIHZlYzIgY29vcmQpIHtcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBmcmFnQ29vcmRaID0gdGV4dHVyZTJEKGRlcHRoU2FtcGxlciwgY29vcmQpLng7XFxyXFxuXFx0XFx0ZmxvYXQgdmlld1ogPSBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WihmcmFnQ29vcmRaLCBjYW1lcmFOZWFyLCBjYW1lcmFGYXIpO1xcclxcblxcclxcblxcdFxcdHJldHVybiB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGgodmlld1osIGNhbWVyYU5lYXIsIGNhbWVyYUZhcik7XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcbiNlbmRpZlxcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWMyIGFzcGVjdENvcnJlY3Rpb24gPSB2ZWMyKDEuMCwgYXNwZWN0KTtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgZGVwdGggPSB0ZXh0dXJlMkQodERlcHRoLCB2VXYpLng7XFxyXFxuXFxyXFxuXFx0I2Vsc2VcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBkZXB0aCA9IHJlYWREZXB0aCh0RGVwdGgsIHZVdik7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0ZmxvYXQgZm9jdXNOZWFyID0gY2xhbXAoZm9jdXMgLSBkb2YsIDAuMCwgMS4wKTtcXHJcXG5cXHRmbG9hdCBmb2N1c0ZhciA9IGNsYW1wKGZvY3VzICsgZG9mLCAwLjAsIDEuMCk7XFxyXFxuXFxyXFxuXFx0Ly8gQ2FsY3VsYXRlIGEgRG9GIG1hc2suXFxyXFxuXFx0ZmxvYXQgbG93ID0gc3RlcChkZXB0aCwgZm9jdXNOZWFyKTtcXHJcXG5cXHRmbG9hdCBoaWdoID0gc3RlcChmb2N1c0ZhciwgZGVwdGgpO1xcclxcblxcclxcblxcdGZsb2F0IGZhY3RvciA9IChkZXB0aCAtIGZvY3VzTmVhcikgKiBsb3cgKyAoZGVwdGggLSBmb2N1c0ZhcikgKiBoaWdoO1xcclxcblxcclxcblxcdHZlYzIgZG9mQmx1ciA9IHZlYzIoY2xhbXAoZmFjdG9yICogYXBlcnR1cmUsIC1tYXhCbHVyLCBtYXhCbHVyKSk7XFxyXFxuXFxyXFxuXFx0dmVjMiBkb2ZibHVyOSA9IGRvZkJsdXIgKiAwLjk7XFxyXFxuXFx0dmVjMiBkb2ZibHVyNyA9IGRvZkJsdXIgKiAwLjc7XFxyXFxuXFx0dmVjMiBkb2ZibHVyNCA9IGRvZkJsdXIgKiAwLjQ7XFxyXFxuXFxyXFxuXFx0dmVjNCBjb2xvciA9IHZlYzQoMC4wKTtcXHJcXG5cXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4wLCAgIDAuNCApICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjE1LCAgMC4zNykgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMjksICAwLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMigtMC4zNywgIDAuMTUpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjQwLCAgMC4wICkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMzcsIC0wLjE1KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4yOSwgLTAuMjkpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjE1LCAtMC4zNykgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMCwgIC0wLjQgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMigtMC4xNSwgIDAuMzcpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjI5LCAgMC4yOSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMzcsICAwLjE1KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMigtMC40LCAgIDAuMCApICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjM3LCAtMC4xNSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMjksIC0wLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4xNSwgLTAuMzcpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjE1LCAgMC4zNykgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZmJsdXI5KTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjM3LCAgMC4xNSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZmJsdXI5KTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjM3LCAtMC4xNSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZmJsdXI5KTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjE1LCAtMC4zNykgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZmJsdXI5KTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjE1LCAgMC4zNykgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZmJsdXI5KTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjM3LCAgMC4xNSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZmJsdXI5KTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjM3LCAtMC4xNSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZmJsdXI5KTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjE1LCAtMC4zNykgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZmJsdXI5KTtcXHJcXG5cXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjI5LCAgMC4yOSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZmJsdXI3KTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjQwLCAgMC4wICkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZmJsdXI3KTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjI5LCAtMC4yOSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZmJsdXI3KTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjAsICAtMC40ICkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZmJsdXI3KTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjI5LCAgMC4yOSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZmJsdXI3KTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjQsICAgMC4wICkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZmJsdXI3KTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjI5LCAtMC4yOSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZmJsdXI3KTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjAsICAgMC40ICkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZmJsdXI3KTtcXHJcXG5cXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjI5LCAgMC4yOSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZmJsdXI0KTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjQsICAgMC4wICkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZmJsdXI0KTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjI5LCAtMC4yOSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZmJsdXI0KTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjAsICAtMC40ICkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZmJsdXI0KTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjI5LCAgMC4yOSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZmJsdXI0KTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjQsICAgMC4wICkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZmJsdXI0KTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjI5LCAtMC4yOSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZmJsdXI0KTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjAsICAgMC40ICkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZmJsdXI0KTtcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSBjb2xvciAvIDQxLjA7XFxyXFxuXFxyXFxufVxcclxcblwiO1xudmFyIHZlcnRleCQxID0gXCJ2YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbi8qKlxyXG4gKiBEZXB0aCBvZiBGaWVsZCBzaGFkZXIgKEJva2VoKS5cclxuICpcclxuICogT3JpZ2luYWwgc2hhZGVyIGNvZGUgYnkgTWFydGlucyBVcGl0aXM6XHJcbiAqICBodHRwOi8vYXJ0bWFydGluc2guYmxvZ3Nwb3QuY29tLzIwMTAvMDIvZ2xzbC1sZW5zLWJsdXItZmlsdGVyLXdpdGgtYm9rZWguaHRtbFxyXG4gKi9cblxudmFyIEJva2VoTWF0ZXJpYWwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9TaGFkZXJNYXRlcmlhbCkge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGJva2VoIG1hdGVyaWFsLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtQZXJzcGVjdGl2ZUNhbWVyYX0gW2NhbWVyYV0gLSBBIGNhbWVyYS5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmZvY3VzPTEuMF0gLSBUaGUgZm9jdXMgZGlzdGFuY2UsIGNvcnJlc3BvbmRzIGRpcmVjdGx5IHdpdGggdGhlIHNjZW5lIGRlcHRoLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kb2Y9MC4wMl0gLSBEZXB0aCBvZiBmaWVsZC4gQW4gYXJlYSBpbiBmcm9udCBvZiBhbmQgYmVoaW5kIHRoZSBmb2N1cyBwb2ludCB0aGF0IHN0aWxsIGFwcGVhcnMgc2hhcnAuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmFwZXJ0dXJlPTAuMDI1XSAtIENhbWVyYSBhcGVydHVyZSBzY2FsZS4gQmlnZ2VyIHZhbHVlcyBmb3Igc3Ryb25nZXIgYmx1ciBhbmQgc2hhbGxvd2VyIGRlcHRoIG9mIGZpZWxkLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhCbHVyPTEuMF0gLSBNYXhpbXVtIGJsdXIgc3RyZW5ndGguXHJcbiAgICovXG4gIGZ1bmN0aW9uIEJva2VoTWF0ZXJpYWwoY2FtZXJhKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQm9rZWhNYXRlcmlhbCk7XG5cbiAgICB2YXIgc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIGZvY3VzOiAxLjAsXG4gICAgICBkb2Y6IDAuMDIsXG4gICAgICBhcGVydHVyZTogMC4wMjUsXG4gICAgICBtYXhCbHVyOiAxLjBcbiAgICB9LCBvcHRpb25zKTtcbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihCb2tlaE1hdGVyaWFsKS5jYWxsKHRoaXMsIHtcbiAgICAgIHR5cGU6IFwiQm9rZWhNYXRlcmlhbFwiLFxuICAgICAgdW5pZm9ybXM6IHtcbiAgICAgICAgY2FtZXJhTmVhcjogbmV3IFVuaWZvcm0oMC4xKSxcbiAgICAgICAgY2FtZXJhRmFyOiBuZXcgVW5pZm9ybSgyMDAwKSxcbiAgICAgICAgYXNwZWN0OiBuZXcgVW5pZm9ybSgxLjApLFxuICAgICAgICB0RGlmZnVzZTogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIHREZXB0aDogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIGZvY3VzOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5mb2N1cyksXG4gICAgICAgIGRvZjogbmV3IFVuaWZvcm0oc2V0dGluZ3MuZG9mKSxcbiAgICAgICAgYXBlcnR1cmU6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmFwZXJ0dXJlKSxcbiAgICAgICAgbWF4Qmx1cjogbmV3IFVuaWZvcm0oc2V0dGluZ3MubWF4Qmx1cilcbiAgICAgIH0sXG4gICAgICBmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQkMSxcbiAgICAgIHZlcnRleFNoYWRlcjogdmVydGV4JDEsXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcbiAgICAgIGRlcHRoVGVzdDogZmFsc2VcbiAgICB9KSk7XG5cbiAgICBfdGhpcy5hZG9wdENhbWVyYVNldHRpbmdzKGNhbWVyYSk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogQWRvcHRzIHRoZSBzZXR0aW5ncyBvZiB0aGUgZ2l2ZW4gY2FtZXJhLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtQZXJzcGVjdGl2ZUNhbWVyYX0gW2NhbWVyYT1udWxsXSAtIEEgY2FtZXJhLlxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoQm9rZWhNYXRlcmlhbCwgW3tcbiAgICBrZXk6IFwiYWRvcHRDYW1lcmFTZXR0aW5nc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZG9wdENhbWVyYVNldHRpbmdzKCkge1xuICAgICAgdmFyIGNhbWVyYSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbnVsbDtcblxuICAgICAgaWYgKGNhbWVyYSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLnVuaWZvcm1zLmNhbWVyYU5lYXIudmFsdWUgPSBjYW1lcmEubmVhcjtcbiAgICAgICAgdGhpcy51bmlmb3Jtcy5jYW1lcmFGYXIudmFsdWUgPSBjYW1lcmEuZmFyO1xuICAgICAgICB0aGlzLnVuaWZvcm1zLmFzcGVjdC52YWx1ZSA9IGNhbWVyYS5hc3BlY3Q7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoQm9rZWhNYXRlcmlhbCwgX1NoYWRlck1hdGVyaWFsKTtcblxuICByZXR1cm4gQm9rZWhNYXRlcmlhbDtcbn0oU2hhZGVyTWF0ZXJpYWwpO1xuXG52YXIgZnJhZ21lbnQkMiA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG52YXJ5aW5nIHZlYzQgdk9mZnNldFszXTtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0Y29uc3QgdmVjMiB0aHJlc2hvbGQgPSB2ZWMyKEVER0VfVEhSRVNIT0xEKTtcXHJcXG5cXHJcXG5cXHQvLyBDYWxjdWxhdGUgY29sb3IgZGVsdGFzLlxcclxcblxcdHZlYzQgZGVsdGE7XFxyXFxuXFx0dmVjMyBjID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYpLnJnYjtcXHJcXG5cXHJcXG5cXHR2ZWMzIGNMZWZ0ID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2T2Zmc2V0WzBdLnh5KS5yZ2I7XFxyXFxuXFx0dmVjMyB0ID0gYWJzKGMgLSBjTGVmdCk7XFxyXFxuXFx0ZGVsdGEueCA9IG1heChtYXgodC5yLCB0LmcpLCB0LmIpO1xcclxcblxcclxcblxcdHZlYzMgY1RvcCA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdk9mZnNldFswXS56dykucmdiO1xcclxcblxcdHQgPSBhYnMoYyAtIGNUb3ApO1xcclxcblxcdGRlbHRhLnkgPSBtYXgobWF4KHQuciwgdC5nKSwgdC5iKTtcXHJcXG5cXHJcXG5cXHQvLyBXZSBkbyB0aGUgdXN1YWwgdGhyZXNob2xkLlxcclxcblxcdHZlYzIgZWRnZXMgPSBzdGVwKHRocmVzaG9sZCwgZGVsdGEueHkpO1xcclxcblxcclxcblxcdC8vIFRoZW4gZGlzY2FyZCBpZiB0aGVyZSBpcyBubyBlZGdlLlxcclxcblxcdGlmKGRvdChlZGdlcywgdmVjMigxLjApKSA9PSAwLjApIHtcXHJcXG5cXHJcXG5cXHRcXHRkaXNjYXJkO1xcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG5cXHQvLyBDYWxjdWxhdGUgcmlnaHQgYW5kIGJvdHRvbSBkZWx0YXMuXFxyXFxuXFx0dmVjMyBjUmlnaHQgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZPZmZzZXRbMV0ueHkpLnJnYjtcXHJcXG5cXHR0ID0gYWJzKGMgLSBjUmlnaHQpO1xcclxcblxcdGRlbHRhLnogPSBtYXgobWF4KHQuciwgdC5nKSwgdC5iKTtcXHJcXG5cXHJcXG5cXHR2ZWMzIGNCb3R0b20gPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZPZmZzZXRbMV0uencpLnJnYjtcXHJcXG5cXHR0ID0gYWJzKGMgLSBjQm90dG9tKTtcXHJcXG5cXHRkZWx0YS53ID0gbWF4KG1heCh0LnIsIHQuZyksIHQuYik7XFxyXFxuXFxyXFxuXFx0Ly8gQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIGRlbHRhIGluIHRoZSBkaXJlY3QgbmVpZ2hib3Job29kLlxcclxcblxcdGZsb2F0IG1heERlbHRhID0gbWF4KG1heChtYXgoZGVsdGEueCwgZGVsdGEueSksIGRlbHRhLnopLCBkZWx0YS53KTtcXHJcXG5cXHJcXG5cXHQvLyBDYWxjdWxhdGUgbGVmdC1sZWZ0IGFuZCB0b3AtdG9wIGRlbHRhcy5cXHJcXG5cXHR2ZWMzIGNMZWZ0TGVmdCA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdk9mZnNldFsyXS54eSkucmdiO1xcclxcblxcdHQgPSBhYnMoYyAtIGNMZWZ0TGVmdCk7XFxyXFxuXFx0ZGVsdGEueiA9IG1heChtYXgodC5yLCB0LmcpLCB0LmIpO1xcclxcblxcclxcblxcdHZlYzMgY1RvcFRvcCA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdk9mZnNldFsyXS56dykucmdiO1xcclxcblxcdHQgPSBhYnMoYyAtIGNUb3BUb3ApO1xcclxcblxcdGRlbHRhLncgPSBtYXgobWF4KHQuciwgdC5nKSwgdC5iKTtcXHJcXG5cXHJcXG5cXHQvLyBDYWxjdWxhdGUgdGhlIGZpbmFsIG1heGltdW0gZGVsdGEuXFxyXFxuXFx0bWF4RGVsdGEgPSBtYXgobWF4KG1heERlbHRhLCBkZWx0YS56KSwgZGVsdGEudyk7XFxyXFxuXFxyXFxuXFx0Ly8gTG9jYWwgY29udHJhc3QgYWRhcHRhdGlvbiBpbiBhY3Rpb24uXFxyXFxuXFx0ZWRnZXMueHkgKj0gc3RlcCgwLjUgKiBtYXhEZWx0YSwgZGVsdGEueHkpO1xcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoZWRnZXMsIDAuMCwgMC4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG52YXIgdmVydGV4JDIgPSBcInVuaWZvcm0gdmVjMiB0ZXhlbFNpemU7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG52YXJ5aW5nIHZlYzQgdk9mZnNldFszXTtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFxyXFxuXFx0dk9mZnNldFswXSA9IHV2Lnh5eHkgKyB0ZXhlbFNpemUueHl4eSAqIHZlYzQoLTEuMCwgMC4wLCAwLjAsIDEuMCk7IC8vIENoYW5nZWQgc2lnbiBpbiBXIGNvbXBvbmVudC5cXHJcXG5cXHR2T2Zmc2V0WzFdID0gdXYueHl4eSArIHRleGVsU2l6ZS54eXh5ICogdmVjNCgxLjAsIDAuMCwgMC4wLCAtMS4wKTsgLy8gQ2hhbmdlZCBzaWduIGluIFcgY29tcG9uZW50LlxcclxcblxcdHZPZmZzZXRbMl0gPSB1di54eXh5ICsgdGV4ZWxTaXplLnh5eHkgKiB2ZWM0KC0yLjAsIDAuMCwgMC4wLCAyLjApOyAvLyBDaGFuZ2VkIHNpZ24gaW4gVyBjb21wb25lbnQuXFxyXFxuXFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG4vKipcclxuICogQSBtYXRlcmlhbCB0aGF0IGRldGVjdHMgZWRnZXMgaW4gYSBjb2xvciB0ZXh0dXJlLlxyXG4gKlxyXG4gKiBNYWlubHkgdXNlZCBmb3IgU3VicGl4ZWwgTW9ycGhvbG9naWNhbCBBbnRpYWxpYXNpbmcuXHJcbiAqL1xuXG52YXIgQ29sb3JFZGdlc01hdGVyaWFsID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfU2hhZGVyTWF0ZXJpYWwpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBjb2xvciBlZGdlcyBtYXRlcmlhbC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7VmVjdG9yMn0gW3RleGVsU2l6ZV0gLSBUaGUgYWJzb2x1dGUgc2NyZWVuIHRleGVsIHNpemUuXHJcbiAgICovXG4gIGZ1bmN0aW9uIENvbG9yRWRnZXNNYXRlcmlhbCgpIHtcbiAgICB2YXIgdGV4ZWxTaXplID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBuZXcgVmVjdG9yMigpO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29sb3JFZGdlc01hdGVyaWFsKTtcblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoQ29sb3JFZGdlc01hdGVyaWFsKS5jYWxsKHRoaXMsIHtcbiAgICAgIHR5cGU6IFwiQ29sb3JFZGdlc01hdGVyaWFsXCIsXG4gICAgICBkZWZpbmVzOiB7XG4gICAgICAgIEVER0VfVEhSRVNIT0xEOiBcIjAuMVwiXG4gICAgICB9LFxuICAgICAgdW5pZm9ybXM6IHtcbiAgICAgICAgdERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICB0ZXhlbFNpemU6IG5ldyBVbmlmb3JtKHRleGVsU2l6ZSlcbiAgICAgIH0sXG4gICAgICBmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQkMixcbiAgICAgIHZlcnRleFNoYWRlcjogdmVydGV4JDIsXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcbiAgICAgIGRlcHRoVGVzdDogZmFsc2VcbiAgICB9KSk7XG4gIH1cbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgZWRnZSBkZXRlY3Rpb24gc2Vuc2l0aXZpdHkuXHJcbiAgICpcclxuICAgKiBBIGxvd2VyIHZhbHVlIHJlc3VsdHMgaW4gbW9yZSBlZGdlcyBiZWluZyBkZXRlY3RlZCBhdCB0aGUgZXhwZW5zZSBvZlxyXG4gICAqIHBlcmZvcm1hbmNlLlxyXG4gICAqXHJcbiAgICogMC4xIGlzIGEgcmVhc29uYWJsZSB2YWx1ZSwgYW5kIGFsbG93cyB0byBjYXRjaCBtb3N0IHZpc2libGUgZWRnZXMuXHJcbiAgICogMC4wNSBpcyBhIHJhdGhlciBvdmVya2lsbCB2YWx1ZSwgdGhhdCBhbGxvd3MgdG8gY2F0Y2ggJ2VtIGFsbC5cclxuICAgKlxyXG4gICAqIElmIHRlbXBvcmFsIHN1cGVyc2FtcGxpbmcgaXMgdXNlZCwgMC4yIGNvdWxkIGJlIGEgcmVhc29uYWJsZSB2YWx1ZSxcclxuICAgKiBhcyBsb3cgY29udHJhc3QgZWRnZXMgYXJlIHByb3Blcmx5IGZpbHRlcmVkIGJ5IGp1c3QgMnguXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge051bWJlcn0gdGhyZXNob2xkIC0gVGhlIGVkZ2UgZGV0ZWN0aW9uIHNlbnNpdGl2aXR5LiBSYW5nZTogWzAsIDAuNV0uXHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhDb2xvckVkZ2VzTWF0ZXJpYWwsIFt7XG4gICAga2V5OiBcInNldEVkZ2VEZXRlY3Rpb25UaHJlc2hvbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0RWRnZURldGVjdGlvblRocmVzaG9sZCh0aHJlc2hvbGQpIHtcbiAgICAgIHRoaXMuZGVmaW5lcy5FREdFX1RIUkVTSE9MRCA9IHRocmVzaG9sZC50b0ZpeGVkKFwiMlwiKTtcbiAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKENvbG9yRWRnZXNNYXRlcmlhbCwgX1NoYWRlck1hdGVyaWFsKTtcblxuICByZXR1cm4gQ29sb3JFZGdlc01hdGVyaWFsO1xufShTaGFkZXJNYXRlcmlhbCk7XG5cbnZhciBmcmFnbWVudCQzID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlMTtcXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlMjtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHkxO1xcclxcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTI7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjNCB0ZXhlbDEgPSBvcGFjaXR5MSAqIHRleHR1cmUyRCh0ZXh0dXJlMSwgdlV2KTtcXHJcXG5cXHR2ZWM0IHRleGVsMiA9IG9wYWNpdHkyICogdGV4dHVyZTJEKHRleHR1cmUyLCB2VXYpO1xcclxcblxcclxcblxcdCNpZmRlZiBTQ1JFRU5fTU9ERVxcclxcblxcclxcblxcdFxcdHZlYzMgaW52VGV4ZWwxID0gdmVjMygxLjApIC0gdGV4ZWwxLnJnYjtcXHJcXG5cXHRcXHR2ZWMzIGludlRleGVsMiA9IHZlYzMoMS4wKSAtIHRleGVsMi5yZ2I7XFxyXFxuXFxyXFxuXFx0XFx0dmVjNCBjb2xvciA9IHZlYzQoXFxyXFxuXFx0XFx0XFx0dmVjMygxLjApIC0gaW52VGV4ZWwxICogaW52VGV4ZWwyLFxcclxcblxcdFxcdFxcdHRleGVsMS5hICsgdGV4ZWwyLmFcXHJcXG5cXHRcXHQpO1xcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0dmVjNCBjb2xvciA9IHRleGVsMSArIHRleGVsMjtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSBjb2xvcjtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG52YXIgdmVydGV4JDMgPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xuLyoqXHJcbiAqIEEgbWF0ZXJpYWwgZm9yIGNvbWJpbmluZyB0d28gdGV4dHVyZXMuXHJcbiAqXHJcbiAqIFRoaXMgbWF0ZXJpYWwgc3VwcG9ydHMgdGhlIHR3byBibGVuZCBtb2RlcyBBZGQgYW5kIFNjcmVlbi5cclxuICpcclxuICogSW4gU2NyZWVuIG1vZGUsIHRoZSB0d28gdGV4dHVyZXMgYXJlIGVmZmVjdGl2ZWx5IHByb2plY3RlZCBvbiBhIHdoaXRlIHNjcmVlblxyXG4gKiBzaW11bHRhbmVvdXNseS4gSW4gQWRkIG1vZGUsIHRoZSB0ZXh0dXJlcyBhcmUgc2ltcGx5IGFkZGVkIHRvZ2V0aGVyIHdoaWNoXHJcbiAqIG9mdGVuIHByb2R1Y2VzIHVuZGVzaXJlZCwgd2FzaGVkIG91dCByZXN1bHRzLlxyXG4gKi9cblxudmFyIENvbWJpbmVNYXRlcmlhbCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1NoYWRlck1hdGVyaWFsKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgY29tYmluZSBtYXRlcmlhbC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3NjcmVlbk1vZGU9ZmFsc2VdIC0gV2hldGhlciB0aGUgc2NyZWVuIGJsZW5kIG1vZGUgc2hvdWxkIGJlIHVzZWQuXHJcbiAgICovXG4gIGZ1bmN0aW9uIENvbWJpbmVNYXRlcmlhbCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgc2NyZWVuTW9kZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDb21iaW5lTWF0ZXJpYWwpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoQ29tYmluZU1hdGVyaWFsKS5jYWxsKHRoaXMsIHtcbiAgICAgIHR5cGU6IFwiQ29tYmluZU1hdGVyaWFsXCIsXG4gICAgICB1bmlmb3Jtczoge1xuICAgICAgICB0ZXh0dXJlMTogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIHRleHR1cmUyOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgb3BhY2l0eTE6IG5ldyBVbmlmb3JtKDEuMCksXG4gICAgICAgIG9wYWNpdHkyOiBuZXcgVW5pZm9ybSgxLjApXG4gICAgICB9LFxuICAgICAgZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50JDMsXG4gICAgICB2ZXJ0ZXhTaGFkZXI6IHZlcnRleCQzLFxuICAgICAgZGVwdGhXcml0ZTogZmFsc2UsXG4gICAgICBkZXB0aFRlc3Q6IGZhbHNlXG4gICAgfSkpO1xuXG4gICAgX3RoaXMuc2V0U2NyZWVuTW9kZUVuYWJsZWQoc2NyZWVuTW9kZSk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgU2NyZWVuIGJsZW5kIG1vZGUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBTY3JlZW4gYmxlbmQgbW9kZSBzaG91bGQgYmUgZW5hYmxlZC5cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKENvbWJpbmVNYXRlcmlhbCwgW3tcbiAgICBrZXk6IFwic2V0U2NyZWVuTW9kZUVuYWJsZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2NyZWVuTW9kZUVuYWJsZWQoZW5hYmxlZCkge1xuICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlNDUkVFTl9NT0RFID0gXCIxXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdGhpcy5kZWZpbmVzLlNDUkVFTl9NT0RFO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhDb21iaW5lTWF0ZXJpYWwsIF9TaGFkZXJNYXRlcmlhbCk7XG5cbiAgcmV0dXJuIENvbWJpbmVNYXRlcmlhbDtcbn0oU2hhZGVyTWF0ZXJpYWwpO1xuXG52YXIgZnJhZ21lbnQkNCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXHJcXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxyXFxuXFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjA7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjE7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjI7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjM7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdC8vIFNhbXBsZSB0b3AgbGVmdCB0ZXhlbC5cXHJcXG5cXHR2ZWM0IHN1bSA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2MCk7XFxyXFxuXFxyXFxuXFx0Ly8gU2FtcGxlIHRvcCByaWdodCB0ZXhlbC5cXHJcXG5cXHRzdW0gKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYxKTtcXHJcXG5cXHJcXG5cXHQvLyBTYW1wbGUgYm90dG9tIHJpZ2h0IHRleGVsLlxcclxcblxcdHN1bSArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdjIpO1xcclxcblxcclxcblxcdC8vIFNhbXBsZSBib3R0b20gbGVmdCB0ZXhlbC5cXHJcXG5cXHRzdW0gKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYzKTtcXHJcXG5cXHJcXG5cXHQvLyBDb21wdXRlIHRoZSBhdmVyYWdlLlxcclxcblxcdGdsX0ZyYWdDb2xvciA9IHN1bSAqIDAuMjU7XFxyXFxuXFxyXFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXHJcXG5cXHJcXG59XFxyXFxuXCI7XG52YXIgdmVydGV4JDQgPSBcInVuaWZvcm0gdmVjMiB0ZXhlbFNpemU7XFxyXFxudW5pZm9ybSB2ZWMyIGhhbGZUZXhlbFNpemU7XFxyXFxudW5pZm9ybSBmbG9hdCBrZXJuZWw7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjA7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjE7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjI7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjM7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZlYzIgZFV2ID0gKHRleGVsU2l6ZSAqIHZlYzIoa2VybmVsKSkgKyBoYWxmVGV4ZWxTaXplO1xcclxcblxcclxcblxcdHZVdjAgPSB2ZWMyKHV2LnggLSBkVXYueCwgdXYueSArIGRVdi55KTtcXHJcXG5cXHR2VXYxID0gdmVjMih1di54ICsgZFV2LngsIHV2LnkgKyBkVXYueSk7XFxyXFxuXFx0dlV2MiA9IHZlYzIodXYueCArIGRVdi54LCB1di55IC0gZFV2LnkpO1xcclxcblxcdHZVdjMgPSB2ZWMyKHV2LnggLSBkVXYueCwgdXYueSAtIGRVdi55KTtcXHJcXG5cXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbi8qKlxyXG4gKiBBbiBvcHRpbWlzZWQgY29udm9sdXRpb24gc2hhZGVyIG1hdGVyaWFsLlxyXG4gKlxyXG4gKiBUaGlzIG1hdGVyaWFsIHN1cHBvcnRzIGRpdGhlcmluZy5cclxuICpcclxuICogQmFzZWQgb24gdGhlIEdEQzIwMDMgUHJlc2VudGF0aW9uIGJ5IE1hc2FraSBLYXdhc2UsIEJ1bmthc2hhIEdhbWVzOlxyXG4gKiAgRnJhbWUgQnVmZmVyIFBvc3Rwcm9jZXNzaW5nIEVmZmVjdHMgaW4gRE9VQkxFLVMuVC5FLkEuTCAoV3JlY2tsZXNzKVxyXG4gKiBhbmQgYW4gYXJ0aWNsZSBieSBGaWxpcCBTdHJ1Z2FyLCBJbnRlbDpcclxuICogIEFuIGludmVzdGlnYXRpb24gb2YgZmFzdCByZWFsLXRpbWUgR1BVLWJhc2VkIGltYWdlIGJsdXIgYWxnb3JpdGhtc1xyXG4gKlxyXG4gKiBGdXJ0aGVyIG1vZGlmaWVkIGFjY29yZGluZyB0byBBcHBsZSdzXHJcbiAqIFtCZXN0IFByYWN0aWNlcyBmb3IgU2hhZGVyc10oaHR0cHM6Ly9nb28uZ2wvbG1Sb001KS5cclxuICovXG5cbnZhciBDb252b2x1dGlvbk1hdGVyaWFsID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfU2hhZGVyTWF0ZXJpYWwpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBjb252b2x1dGlvbiBtYXRlcmlhbC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7VmVjdG9yMn0gW3RleGVsU2l6ZV0gLSBUaGUgYWJzb2x1dGUgc2NyZWVuIHRleGVsIHNpemUuXHJcbiAgICovXG4gIGZ1bmN0aW9uIENvbnZvbHV0aW9uTWF0ZXJpYWwoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHRleGVsU2l6ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbmV3IFZlY3RvcjIoKTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIENvbnZvbHV0aW9uTWF0ZXJpYWwpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoQ29udm9sdXRpb25NYXRlcmlhbCkuY2FsbCh0aGlzLCB7XG4gICAgICB0eXBlOiBcIkNvbnZvbHV0aW9uTWF0ZXJpYWxcIixcbiAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgIHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgdGV4ZWxTaXplOiBuZXcgVW5pZm9ybShuZXcgVmVjdG9yMigpKSxcbiAgICAgICAgaGFsZlRleGVsU2l6ZTogbmV3IFVuaWZvcm0obmV3IFZlY3RvcjIoKSksXG4gICAgICAgIGtlcm5lbDogbmV3IFVuaWZvcm0oMC4wKVxuICAgICAgfSxcbiAgICAgIGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCQ0LFxuICAgICAgdmVydGV4U2hhZGVyOiB2ZXJ0ZXgkNCxcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgICAgZGVwdGhUZXN0OiBmYWxzZVxuICAgIH0pKTtcblxuICAgIF90aGlzLnNldFRleGVsU2l6ZSh0ZXhlbFNpemUueCwgdGV4ZWxTaXplLnkpO1xuICAgIC8qKlxyXG4gICAgICogVGhlIGN1cnJlbnQga2VybmVsIHNpemUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0tlcm5lbFNpemV9XHJcbiAgICAgKiBAZGVmYXVsdCBLZXJuZWxTaXplLkxBUkdFXHJcbiAgICAgKi9cblxuXG4gICAgX3RoaXMua2VybmVsU2l6ZSA9IEtlcm5lbFNpemUuTEFSR0U7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGtlcm5lbC5cclxuICAgKlxyXG4gICAqIEByZXR1cm4ge0Zsb2F0MzJBcnJheX0gVGhlIGtlcm5lbC5cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKENvbnZvbHV0aW9uTWF0ZXJpYWwsIFt7XG4gICAga2V5OiBcImdldEtlcm5lbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRLZXJuZWwoKSB7XG4gICAgICByZXR1cm4ga2VybmVsUHJlc2V0c1t0aGlzLmtlcm5lbFNpemVdO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHRleGVsIHNpemUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHggLSBUaGUgdGV4ZWwgd2lkdGguXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0geSAtIFRoZSB0ZXhlbCBoZWlnaHQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFRleGVsU2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRUZXhlbFNpemUoeCwgeSkge1xuICAgICAgdGhpcy51bmlmb3Jtcy50ZXhlbFNpemUudmFsdWUuc2V0KHgsIHkpO1xuICAgICAgdGhpcy51bmlmb3Jtcy5oYWxmVGV4ZWxTaXplLnZhbHVlLnNldCh4LCB5KS5tdWx0aXBseVNjYWxhcigwLjUpO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKENvbnZvbHV0aW9uTWF0ZXJpYWwsIF9TaGFkZXJNYXRlcmlhbCk7XG5cbiAgcmV0dXJuIENvbnZvbHV0aW9uTWF0ZXJpYWw7XG59KFNoYWRlck1hdGVyaWFsKTtcbi8qKlxyXG4gKiBUaGUgS2F3YXNlIGJsdXIga2VybmVsIHByZXNldHMuXHJcbiAqXHJcbiAqIEB0eXBlIHtGbG9hdDMyQXJyYXlbXX1cclxuICogQHByaXZhdGVcclxuICovXG5cbnZhciBrZXJuZWxQcmVzZXRzID0gW25ldyBGbG9hdDMyQXJyYXkoWzAuMCwgMC4wXSksIG5ldyBGbG9hdDMyQXJyYXkoWzAuMCwgMS4wLCAxLjBdKSwgbmV3IEZsb2F0MzJBcnJheShbMC4wLCAxLjAsIDEuMCwgMi4wXSksIG5ldyBGbG9hdDMyQXJyYXkoWzAuMCwgMS4wLCAyLjAsIDIuMCwgMy4wXSksIG5ldyBGbG9hdDMyQXJyYXkoWzAuMCwgMS4wLCAyLjAsIDMuMCwgNC4wLCA0LjAsIDUuMF0pLCBuZXcgRmxvYXQzMkFycmF5KFswLjAsIDEuMCwgMi4wLCAzLjAsIDQuMCwgNS4wLCA3LjAsIDguMCwgOS4wLCAxMC4wXSldO1xuLyoqXHJcbiAqIEEga2VybmVsIHNpemUgZW51bWVyYXRpb24uXHJcbiAqXHJcbiAqIEB0eXBlIHtPYmplY3R9XHJcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBWRVJZX1NNQUxMIC0gQSB2ZXJ5IHNtYWxsIGtlcm5lbCB0aGF0IG1hdGNoZXMgYSA3eDcgR2F1c3MgYmx1ciBrZXJuZWwuXHJcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBTTUFMTCAtIEEgc21hbGwga2VybmVsIHRoYXQgbWF0Y2hlcyBhIDE1eDE1IEdhdXNzIGJsdXIga2VybmVsLlxyXG4gKiBAcHJvcGVydHkge051bWJlcn0gTUVESVVNIC0gQSBtZWRpdW0gc2l6ZWQga2VybmVsIHRoYXQgbWF0Y2hlcyBhIDIzeDIzIEdhdXNzIGJsdXIga2VybmVsLlxyXG4gKiBAcHJvcGVydHkge051bWJlcn0gTEFSR0UgLSBBIGxhcmdlIGtlcm5lbCB0aGF0IG1hdGNoZXMgYSAzNXgzNSBHYXVzcyBibHVyIGtlcm5lbC5cclxuICogQHByb3BlcnR5IHtOdW1iZXJ9IFZFUllfTEFSR0UgLSBBIHZlcnkgbGFyZ2Uga2VybmVsIHRoYXQgbWF0Y2hlcyBhIDYzeDYzIEdhdXNzIGJsdXIga2VybmVsLlxyXG4gKiBAcHJvcGVydHkge051bWJlcn0gSFVHRSAtIEEgaHVnZSBrZXJuZWwgdGhhdCBtYXRjaGVzIGEgMTI3eDEyNyBHYXVzcyBibHVyIGtlcm5lbC5cclxuICovXG5cbnZhciBLZXJuZWxTaXplID0ge1xuICBWRVJZX1NNQUxMOiAwLFxuICBTTUFMTDogMSxcbiAgTUVESVVNOiAyLFxuICBMQVJHRTogMyxcbiAgVkVSWV9MQVJHRTogNCxcbiAgSFVHRTogNVxufTtcblxudmFyIGZyYWdtZW50JDUgPSBcInVuaWZvcm0gc2FtcGxlcjJEIHREaWZmdXNlO1xcclxcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWM0IHRleGVsID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYpO1xcclxcblxcdGdsX0ZyYWdDb2xvciA9IG9wYWNpdHkgKiB0ZXhlbDtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG52YXIgdmVydGV4JDUgPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xuLyoqXHJcbiAqIEEgc2ltcGxlIGNvcHkgc2hhZGVyIG1hdGVyaWFsLlxyXG4gKi9cblxudmFyIENvcHlNYXRlcmlhbCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1NoYWRlck1hdGVyaWFsKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgY29weSBtYXRlcmlhbC5cclxuICAgKi9cbiAgZnVuY3Rpb24gQ29weU1hdGVyaWFsKCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIENvcHlNYXRlcmlhbCk7XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKENvcHlNYXRlcmlhbCkuY2FsbCh0aGlzLCB7XG4gICAgICB0eXBlOiBcIkNvcHlNYXRlcmlhbFwiLFxuICAgICAgdW5pZm9ybXM6IHtcbiAgICAgICAgdERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICBvcGFjaXR5OiBuZXcgVW5pZm9ybSgxLjApXG4gICAgICB9LFxuICAgICAgZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50JDUsXG4gICAgICB2ZXJ0ZXhTaGFkZXI6IHZlcnRleCQ1LFxuICAgICAgZGVwdGhXcml0ZTogZmFsc2UsXG4gICAgICBkZXB0aFRlc3Q6IGZhbHNlXG4gICAgfSkpO1xuICB9XG5cbiAgaW5oZXJpdHMoQ29weU1hdGVyaWFsLCBfU2hhZGVyTWF0ZXJpYWwpO1xuXG4gIHJldHVybiBDb3B5TWF0ZXJpYWw7XG59KFNoYWRlck1hdGVyaWFsKTtcblxudmFyIGZyYWdtZW50JDYgPSBcIiNpbmNsdWRlIDxwYWNraW5nPlxcclxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXHJcXG5cXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGVwdGg7XFxyXFxudW5pZm9ybSBmbG9hdCBjYW1lcmFOZWFyO1xcclxcbnVuaWZvcm0gZmxvYXQgY2FtZXJhRmFyO1xcclxcblxcclxcbnZhcnlpbmcgZmxvYXQgdlZpZXdaO1xcclxcbnZhcnlpbmcgdmVjNCB2UHJvalRleENvb3JkO1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcclxcblxcclxcblxcdC8vIFRyYW5zZm9ybSBpbnRvIENhcnRlc2lhbiBjb29yZGluYXRlIChub3QgbWlycm9yZWQpLlxcclxcblxcdHZlYzIgcHJvalRleENvb3JkID0gKHZQcm9qVGV4Q29vcmQueHkgLyB2UHJvalRleENvb3JkLncpICogMC41ICsgMC41O1xcclxcblxcdHByb2pUZXhDb29yZCA9IGNsYW1wKHByb2pUZXhDb29yZCwgMC4wMDIsIDAuOTk4KTtcXHJcXG5cXHJcXG5cXHRmbG9hdCBmcmFnQ29vcmRaID0gdW5wYWNrUkdCQVRvRGVwdGgodGV4dHVyZTJEKHREZXB0aCwgcHJvalRleENvb3JkKSk7XFxyXFxuXFxyXFxuXFx0I2lmZGVmIFBFUlNQRUNUSVZFX0NBTUVSQVxcclxcblxcclxcblxcdFxcdGZsb2F0IHZpZXdaID0gcGVyc3BlY3RpdmVEZXB0aFRvVmlld1ooZnJhZ0Nvb3JkWiwgY2FtZXJhTmVhciwgY2FtZXJhRmFyKTtcXHJcXG5cXHJcXG5cXHQjZWxzZVxcclxcblxcclxcblxcdFxcdGZsb2F0IHZpZXdaID0gb3J0aG9ncmFwaGljRGVwdGhUb1ZpZXdaKGZyYWdDb29yZFosIGNhbWVyYU5lYXIsIGNhbWVyYUZhcik7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0ZmxvYXQgZGVwdGhUZXN0ID0gKC12Vmlld1ogPiAtdmlld1opID8gMS4wIDogMC4wO1xcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvci5yZ2IgPSB2ZWMzKDAuMCwgZGVwdGhUZXN0LCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbnZhciB2ZXJ0ZXgkNiA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXHJcXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxyXFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcclxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxyXFxuXFxyXFxudmFyeWluZyBmbG9hdCB2Vmlld1o7XFxyXFxudmFyeWluZyB2ZWM0IHZQcm9qVGV4Q29vcmQ7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxyXFxuXFxyXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXHJcXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcclxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxyXFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcclxcblxcclxcblxcdHZWaWV3WiA9IG12UG9zaXRpb24uejtcXHJcXG5cXHR2UHJvalRleENvb3JkID0gZ2xfUG9zaXRpb247XFxyXFxuXFxyXFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxyXFxuXFxyXFxufVxcclxcblwiO1xuLyoqXHJcbiAqIEEgZGVwdGggY29tcGFyaXNvbiBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqL1xuXG52YXIgRGVwdGhDb21wYXJpc29uTWF0ZXJpYWwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9TaGFkZXJNYXRlcmlhbCkge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGRlcHRoIGNvbXBhcmlzb24gbWF0ZXJpYWwuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1RleHR1cmV9IFtkZXB0aFRleHR1cmU9bnVsbF0gLSBBIGRlcHRoIHRleHR1cmUuXHJcbiAgICogQHBhcmFtIHtQZXJzcGVjdGl2ZUNhbWVyYX0gW2NhbWVyYV0gLSBBIGNhbWVyYS5cclxuICAgKi9cbiAgZnVuY3Rpb24gRGVwdGhDb21wYXJpc29uTWF0ZXJpYWwoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIGRlcHRoVGV4dHVyZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbnVsbDtcbiAgICB2YXIgY2FtZXJhID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBEZXB0aENvbXBhcmlzb25NYXRlcmlhbCk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihEZXB0aENvbXBhcmlzb25NYXRlcmlhbCkuY2FsbCh0aGlzLCB7XG4gICAgICB0eXBlOiBcIkRlcHRoQ29tcGFyaXNvbk1hdGVyaWFsXCIsXG4gICAgICB1bmlmb3Jtczoge1xuICAgICAgICB0RGVwdGg6IG5ldyBVbmlmb3JtKGRlcHRoVGV4dHVyZSksXG4gICAgICAgIGNhbWVyYU5lYXI6IG5ldyBVbmlmb3JtKDAuMSksXG4gICAgICAgIGNhbWVyYUZhcjogbmV3IFVuaWZvcm0oMjAwMClcbiAgICAgIH0sXG4gICAgICBmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQkNixcbiAgICAgIHZlcnRleFNoYWRlcjogdmVydGV4JDYsXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcbiAgICAgIGRlcHRoVGVzdDogZmFsc2UsXG4gICAgICBtb3JwaFRhcmdldHM6IHRydWUsXG4gICAgICBza2lubmluZzogdHJ1ZVxuICAgIH0pKTtcblxuICAgIF90aGlzLmFkb3B0Q2FtZXJhU2V0dGluZ3MoY2FtZXJhKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBBZG9wdHMgdGhlIHNldHRpbmdzIG9mIHRoZSBnaXZlbiBjYW1lcmEuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0NhbWVyYX0gW2NhbWVyYT1udWxsXSAtIEEgY2FtZXJhLlxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoRGVwdGhDb21wYXJpc29uTWF0ZXJpYWwsIFt7XG4gICAga2V5OiBcImFkb3B0Q2FtZXJhU2V0dGluZ3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRvcHRDYW1lcmFTZXR0aW5ncygpIHtcbiAgICAgIHZhciBjYW1lcmEgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG5cbiAgICAgIGlmIChjYW1lcmEgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy51bmlmb3Jtcy5jYW1lcmFOZWFyLnZhbHVlID0gY2FtZXJhLm5lYXI7XG4gICAgICAgIHRoaXMudW5pZm9ybXMuY2FtZXJhRmFyLnZhbHVlID0gY2FtZXJhLmZhcjtcblxuICAgICAgICBpZiAoY2FtZXJhIGluc3RhbmNlb2YgUGVyc3BlY3RpdmVDYW1lcmEpIHtcbiAgICAgICAgICB0aGlzLmRlZmluZXMuUEVSU1BFQ1RJVkVfQ0FNRVJBID0gXCIxXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuZGVmaW5lcy5QRVJTUEVDVElWRV9DQU1FUkE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhEZXB0aENvbXBhcmlzb25NYXRlcmlhbCwgX1NoYWRlck1hdGVyaWFsKTtcblxuICByZXR1cm4gRGVwdGhDb21wYXJpc29uTWF0ZXJpYWw7XG59KFNoYWRlck1hdGVyaWFsKTtcblxudmFyIGZyYWdtZW50JDcgPSBcInVuaWZvcm0gc2FtcGxlcjJEIHREaWZmdXNlO1xcclxcblxcclxcbnVuaWZvcm0gZmxvYXQgYW5nbGU7XFxyXFxudW5pZm9ybSBmbG9hdCBzY2FsZTtcXHJcXG51bmlmb3JtIGZsb2F0IGludGVuc2l0eTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcbnZhcnlpbmcgdmVjMiB2VXZQYXR0ZXJuO1xcclxcblxcclxcbmZsb2F0IHBhdHRlcm4oKSB7XFxyXFxuXFxyXFxuXFx0ZmxvYXQgcyA9IHNpbihhbmdsZSk7XFxyXFxuXFx0ZmxvYXQgYyA9IGNvcyhhbmdsZSk7XFxyXFxuXFxyXFxuXFx0dmVjMiBwb2ludCA9IHZlYzIoYyAqIHZVdlBhdHRlcm4ueCAtIHMgKiB2VXZQYXR0ZXJuLnksIHMgKiB2VXZQYXR0ZXJuLnggKyBjICogdlV2UGF0dGVybi55KSAqIHNjYWxlO1xcclxcblxcclxcblxcdHJldHVybiAoc2luKHBvaW50LngpICogc2luKHBvaW50LnkpKSAqIDQuMDtcXHJcXG5cXHJcXG59XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZlYzQgdGV4ZWwgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdik7XFxyXFxuXFx0dmVjMyBjb2xvciA9IHRleGVsLnJnYjtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgQVZFUkFHRVxcclxcblxcclxcblxcdFxcdGNvbG9yID0gdmVjMygoY29sb3IuciArIGNvbG9yLmcgKyBjb2xvci5iKSAvIDMuMCk7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0Y29sb3IgPSB2ZWMzKGNvbG9yICogMTAuMCAtIDUuMCArIHBhdHRlcm4oKSk7XFxyXFxuXFx0Y29sb3IgPSB0ZXhlbC5yZ2IgKyAoY29sb3IgLSB0ZXhlbC5yZ2IpICogaW50ZW5zaXR5O1xcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoY29sb3IsIHRleGVsLmEpO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbnZhciB2ZXJ0ZXgkNyA9IFwidW5pZm9ybSB2ZWM0IG9mZnNldFJlcGVhdDtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcbnZhcnlpbmcgdmVjMiB2VXZQYXR0ZXJuO1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHR2VXZQYXR0ZXJuID0gdXYgKiBvZmZzZXRSZXBlYXQuencgKyBvZmZzZXRSZXBlYXQueHk7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG4vKipcclxuICogQSBkb3Qgc2NyZWVuIHNoYWRlciBtYXRlcmlhbC5cclxuICovXG5cbnZhciBEb3RTY3JlZW5NYXRlcmlhbCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1NoYWRlck1hdGVyaWFsKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgZG90IHNjcmVlbiBtYXRlcmlhbC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hdmVyYWdlPWZhbHNlXSAtIFdoZXRoZXIgdGhlIHNoYWRlciBzaG91bGQgb3V0cHV0IHRoZSBjb2xvdXIgYXZlcmFnZSAoYmxhY2sgYW5kIHdoaXRlKS5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmFuZ2xlPTEuNTddIC0gVGhlIGFuZ2xlIG9mIHRoZSBkb3QgcGF0dGVybi5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNjYWxlPTEuMF0gLSBUaGUgc2NhbGUgb2YgdGhlIGRvdCBwYXR0ZXJuLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaW50ZW5zaXR5PTEuMF0gLSBUaGUgaW50ZW5zaXR5IG9mIHRoZSBlZmZlY3QuXHJcbiAgICovXG4gIGZ1bmN0aW9uIERvdFNjcmVlbk1hdGVyaWFsKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIERvdFNjcmVlbk1hdGVyaWFsKTtcblxuICAgIHZhciBzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgYXZlcmFnZTogZmFsc2UsXG4gICAgICBhbmdsZTogMS41NyxcbiAgICAgIHNjYWxlOiAxLjAsXG4gICAgICBpbnRlbnNpdHk6IDEuMFxuICAgIH0sIG9wdGlvbnMpO1xuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKERvdFNjcmVlbk1hdGVyaWFsKS5jYWxsKHRoaXMsIHtcbiAgICAgIHR5cGU6IFwiRG90U2NyZWVuTWF0ZXJpYWxcIixcbiAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgIHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgYW5nbGU6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmFuZ2xlKSxcbiAgICAgICAgc2NhbGU6IG5ldyBVbmlmb3JtKHNldHRpbmdzLnNjYWxlKSxcbiAgICAgICAgaW50ZW5zaXR5OiBuZXcgVW5pZm9ybShzZXR0aW5ncy5pbnRlbnNpdHkpLFxuICAgICAgICBvZmZzZXRSZXBlYXQ6IG5ldyBVbmlmb3JtKG5ldyBWZWN0b3I0KDAuNSwgMC41LCAxLjAsIDEuMCkpXG4gICAgICB9LFxuICAgICAgZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50JDcsXG4gICAgICB2ZXJ0ZXhTaGFkZXI6IHZlcnRleCQ3LFxuICAgICAgZGVwdGhXcml0ZTogZmFsc2UsXG4gICAgICBkZXB0aFRlc3Q6IGZhbHNlXG4gICAgfSkpO1xuXG4gICAgX3RoaXMuc2V0QXZlcmFnZUVuYWJsZWQoc2V0dGluZ3MuYXZlcmFnZSk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgU2NyZWVuIGJsZW5kIG1vZGUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBTY3JlZW4gYmxlbmQgbW9kZSBzaG91bGQgYmUgZW5hYmxlZC5cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKERvdFNjcmVlbk1hdGVyaWFsLCBbe1xuICAgIGtleTogXCJzZXRBdmVyYWdlRW5hYmxlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRBdmVyYWdlRW5hYmxlZChlbmFibGVkKSB7XG4gICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmRlZmluZXMuQVZFUkFHRSA9IFwiMVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGVmaW5lcy5BVkVSQUdFO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhEb3RTY3JlZW5NYXRlcmlhbCwgX1NoYWRlck1hdGVyaWFsKTtcblxuICByZXR1cm4gRG90U2NyZWVuTWF0ZXJpYWw7XG59KFNoYWRlck1hdGVyaWFsKTtcblxudmFyIGZyYWdtZW50JDggPSBcInVuaWZvcm0gc2FtcGxlcjJEIHREaWZmdXNlO1xcclxcbnVuaWZvcm0gZmxvYXQgdGltZTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbiNpZmRlZiBOT0lTRVxcclxcblxcclxcblxcdHVuaWZvcm0gZmxvYXQgbm9pc2VJbnRlbnNpdHk7XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxuI2lmZGVmIFNDQU5MSU5FU1xcclxcblxcclxcblxcdHVuaWZvcm0gZmxvYXQgc2NhbmxpbmVJbnRlbnNpdHk7XFxyXFxuXFx0dW5pZm9ybSBmbG9hdCBzY2FubGluZUNvdW50O1xcclxcblxcclxcbiNlbmRpZlxcclxcblxcclxcbiNpZmRlZiBHUklEXFxyXFxuXFxyXFxuXFx0dW5pZm9ybSBmbG9hdCBncmlkSW50ZW5zaXR5O1xcclxcblxcdHVuaWZvcm0gdmVjMiBncmlkU2NhbGU7XFxyXFxuXFx0dW5pZm9ybSBmbG9hdCBncmlkTGluZVdpZHRoO1xcclxcblxcclxcbiNlbmRpZlxcclxcblxcclxcbiNpZmRlZiBHUkVZU0NBTEVcXHJcXG5cXHJcXG5cXHQjaW5jbHVkZSA8Y29tbW9uPlxcclxcblxcclxcblxcdHVuaWZvcm0gZmxvYXQgZ3JleXNjYWxlSW50ZW5zaXR5O1xcclxcblxcclxcbiNlbGlmIGRlZmluZWQoU0VQSUEpXFxyXFxuXFxyXFxuXFx0dW5pZm9ybSBmbG9hdCBzZXBpYUludGVuc2l0eTtcXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG4jaWZkZWYgVklHTkVUVEVcXHJcXG5cXHJcXG5cXHR1bmlmb3JtIGZsb2F0IHZpZ25ldHRlT2Zmc2V0O1xcclxcblxcdHVuaWZvcm0gZmxvYXQgdmlnbmV0dGVEYXJrbmVzcztcXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjNCB0ZXhlbCA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2KTtcXHJcXG5cXHR2ZWMzIGNvbG9yID0gdGV4ZWwucmdiO1xcclxcblxcclxcblxcdCNpZmRlZiBTQ1JFRU5fTU9ERVxcclxcblxcclxcblxcdFxcdHZlYzMgaW52Q29sb3I7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0I2lmZGVmIE5PSVNFXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgeCA9IHZVdi54ICogdlV2LnkgKiB0aW1lICogMTAwMC4wO1xcclxcblxcdFxcdHggPSBtb2QoeCwgMTMuMCkgKiBtb2QoeCwgMTIzLjApO1xcclxcblxcdFxcdHggPSBtb2QoeCwgMC4wMSk7XFxyXFxuXFxyXFxuXFx0XFx0dmVjMyBub2lzZSA9IHRleGVsLnJnYiAqIGNsYW1wKDAuMSArIHggKiAxMDAuMCwgMC4wLCAxLjApICogbm9pc2VJbnRlbnNpdHk7XFxyXFxuXFxyXFxuXFx0XFx0I2lmZGVmIFNDUkVFTl9NT0RFXFxyXFxuXFxyXFxuXFx0XFx0XFx0aW52Q29sb3IgPSB2ZWMzKDEuMCkgLSBjb2xvcjtcXHJcXG5cXHRcXHRcXHR2ZWMzIGludk5vaXNlID0gdmVjMygxLjApIC0gbm9pc2U7XFxyXFxuXFxyXFxuXFx0XFx0XFx0Y29sb3IgPSB2ZWMzKDEuMCkgLSBpbnZDb2xvciAqIGludk5vaXNlO1xcclxcblxcclxcblxcdFxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0XFx0Y29sb3IgKz0gbm9pc2U7XFxyXFxuXFxyXFxuXFx0XFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0I2lmZGVmIFNDQU5MSU5FU1xcclxcblxcclxcblxcdFxcdHZlYzIgc2wgPSB2ZWMyKHNpbih2VXYueSAqIHNjYW5saW5lQ291bnQpLCBjb3ModlV2LnkgKiBzY2FubGluZUNvdW50KSk7XFxyXFxuXFx0XFx0dmVjMyBzY2FubGluZXMgPSB0ZXhlbC5yZ2IgKiB2ZWMzKHNsLngsIHNsLnksIHNsLngpICogc2NhbmxpbmVJbnRlbnNpdHk7XFxyXFxuXFxyXFxuXFx0XFx0I2lmZGVmIFNDUkVFTl9NT0RFXFxyXFxuXFxyXFxuXFx0XFx0XFx0aW52Q29sb3IgPSB2ZWMzKDEuMCkgLSBjb2xvcjtcXHJcXG5cXHRcXHRcXHR2ZWMzIGludlNjYW5saW5lcyA9IHZlYzMoMS4wKSAtIHNjYW5saW5lcztcXHJcXG5cXHJcXG5cXHRcXHRcXHRjb2xvciA9IHZlYzMoMS4wKSAtIGludkNvbG9yICogaW52U2NhbmxpbmVzO1xcclxcblxcclxcblxcdFxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0XFx0Y29sb3IgKz0gc2NhbmxpbmVzO1xcclxcblxcclxcblxcdFxcdCNlbmRpZlxcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdCNpZmRlZiBHUklEXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgZ3JpZCA9IDAuNSAtIG1heChhYnMobW9kKHZVdi54ICogZ3JpZFNjYWxlLngsIDEuMCkgLSAwLjUpLCBhYnMobW9kKHZVdi55ICogZ3JpZFNjYWxlLnksIDEuMCkgLSAwLjUpKTtcXHJcXG5cXHRcXHRjb2xvciAqPSAoMS4wIC0gZ3JpZEludGVuc2l0eSkgKyB2ZWMzKHNtb290aHN0ZXAoMC4wLCBncmlkTGluZVdpZHRoLCBncmlkKSkgKiBncmlkSW50ZW5zaXR5O1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdCNpZmRlZiBHUkVZU0NBTEVcXHJcXG5cXHJcXG5cXHRcXHRjb2xvciA9IG1peChjb2xvciwgdmVjMyhsaW5lYXJUb1JlbGF0aXZlTHVtaW5hbmNlKGNvbG9yKSksIGdyZXlzY2FsZUludGVuc2l0eSk7XFxyXFxuXFxyXFxuXFx0I2VsaWYgZGVmaW5lZChTRVBJQSlcXHJcXG5cXHJcXG5cXHRcXHR2ZWMzIGMgPSBjb2xvci5yZ2I7XFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IuciA9IGRvdChjLCB2ZWMzKDEuMCAtIDAuNjA3ICogc2VwaWFJbnRlbnNpdHksIDAuNzY5ICogc2VwaWFJbnRlbnNpdHksIDAuMTg5ICogc2VwaWFJbnRlbnNpdHkpKTtcXHJcXG5cXHRcXHRjb2xvci5nID0gZG90KGMsIHZlYzMoMC4zNDkgKiBzZXBpYUludGVuc2l0eSwgMS4wIC0gMC4zMTQgKiBzZXBpYUludGVuc2l0eSwgMC4xNjggKiBzZXBpYUludGVuc2l0eSkpO1xcclxcblxcdFxcdGNvbG9yLmIgPSBkb3QoYywgdmVjMygwLjI3MiAqIHNlcGlhSW50ZW5zaXR5LCAwLjUzNCAqIHNlcGlhSW50ZW5zaXR5LCAxLjAgLSAwLjg2OSAqIHNlcGlhSW50ZW5zaXR5KSk7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0I2lmZGVmIFZJR05FVFRFXFxyXFxuXFxyXFxuXFx0XFx0Y29uc3QgdmVjMiBjZW50ZXIgPSB2ZWMyKDAuNSk7XFxyXFxuXFxyXFxuXFx0XFx0I2lmZGVmIEVTS0lMXFxyXFxuXFxyXFxuXFx0XFx0XFx0dmVjMiB1diA9ICh2VXYgLSBjZW50ZXIpICogdmVjMih2aWduZXR0ZU9mZnNldCk7XFxyXFxuXFx0XFx0XFx0Y29sb3IgPSBtaXgoY29sb3IucmdiLCB2ZWMzKDEuMCAtIHZpZ25ldHRlRGFya25lc3MpLCBkb3QodXYsIHV2KSk7XFxyXFxuXFxyXFxuXFx0XFx0I2Vsc2VcXHJcXG5cXHJcXG5cXHRcXHRcXHRmbG9hdCBkaXN0ID0gZGlzdGFuY2UodlV2LCBjZW50ZXIpO1xcclxcblxcdFxcdFxcdGNvbG9yICo9IHNtb290aHN0ZXAoMC44LCB2aWduZXR0ZU9mZnNldCAqIDAuNzk5LCBkaXN0ICogKHZpZ25ldHRlRGFya25lc3MgKyB2aWduZXR0ZU9mZnNldCkpO1xcclxcblxcclxcblxcdFxcdCNlbmRpZlxcdFxcdFxcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoY2xhbXAoY29sb3IsIDAuMCwgMS4wKSwgdGV4ZWwuYSk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xudmFyIHZlcnRleCQ4ID0gXCJ2YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbi8qKlxyXG4gKiBBIGNpbmVtYXRpYyBzaGFkZXIgdGhhdCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGVmZmVjdHM6XHJcbiAqICAtIEZpbG0gR3JhaW5cclxuICogIC0gU2NhbmxpbmVzXHJcbiAqICAtIFZpZ25ldHRlXHJcbiAqICAtIEdyZXlzY2FsZVxyXG4gKiAgLSBTZXBpYVxyXG4gKlxyXG4gKiBPcmlnaW5hbCBzY2FubGluZXMgYWxnb3JpdGhtIGJ5IFBhdCBcIkhhd3Rob3JuZVwiIFNoZWFyb24uXHJcbiAqICBodHRwOi8vd3d3LnRydWV2aXNpb24zZC5jb20vZm9ydW1zL3Nob3djYXNlL3N0YXRpY25vaXNlX2NvbG9yYmxhY2t3aGl0ZV9zY2FubGluZV9zaGFkZXJzLXQxODY5OC4wLmh0bWxcclxuICpcclxuICogT3B0aW1pc2VkIHNjYW5saW5lcyBhbmQgbm9pc2Ugd2l0aCBpbnRlbnNpdHkgc2NhbGluZyBieSBHZW9yZyBcIkxldmlhdGhhblwiXHJcbiAqIFN0ZWlucm9oZGVyLiBUaGlzIHZlcnNpb24gd2FzIHByb3ZpZGVkIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvblxyXG4gKiAzLjAgTGljZW5zZTogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLlxyXG4gKlxyXG4gKiBUaGUgc2VwaWEgZWZmZWN0IGlzIGJhc2VkIG9uOlxyXG4gKiAgaHR0cHM6Ly9naXRodWIuY29tL2V2YW53L2dsZnguanNcclxuICpcclxuICogVGhlIHZpZ25ldHRlIGNvZGUgaXMgYmFzZWQgb24gUGFpbnRFZmZlY3QgcG9zdHByb2Nlc3MgZnJvbSByby5tZTpcclxuICogIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC8zLWRyZWFtcy1vZi1ibGFjay9zb3VyY2UvYnJvd3NlL2RlcGxveS9qcy9lZmZlY3RzL1BhaW50RWZmZWN0LmpzXHJcbiAqL1xuXG52YXIgRmlsbU1hdGVyaWFsID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfU2hhZGVyTWF0ZXJpYWwpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBmaWxtIG1hdGVyaWFsLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLiBEaXNhYmxlZCBlZmZlY3RzIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBmaW5hbCBzaGFkZXIgYW5kIGhhdmUgbm8gbmVnYXRpdmUgaW1wYWN0IG9uIHBlcmZvcm1hbmNlLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZ3JleXNjYWxlPWZhbHNlXSAtIEVuYWJsZSBncmV5c2NhbGUgZWZmZWN0LiBHcmV5c2NhbGUgYW5kIHNlcGlhIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zZXBpYT1mYWxzZV0gLSBFbmFibGUgc2VwaWEgZWZmZWN0LiBHcmV5c2NhbGUgYW5kIHNlcGlhIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy52aWduZXR0ZT1mYWxzZV0gLSBBcHBseSB2aWduZXR0ZSBlZmZlY3QuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5lc2tpbD1mYWxzZV0gLSBVc2UgRXNraWwncyB2aWduZXR0ZSBhcHByb2FjaC4gVGhlIGRlZmF1bHQgbG9va3MgZHVzdHkgd2hpbGUgRXNraWwgbG9va3MgYnVybmVkIG91dC5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNjcmVlbk1vZGU9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBzY3JlZW4gYmxlbmQgbW9kZSBzaG91bGQgYmUgdXNlZCBmb3Igbm9pc2UgYW5kIHNjYW5saW5lcy4gQm90aCBvZiB0aGVzZSBlZmZlY3RzIGFyZSBjb21wdXRlZCBpbmRlcGVuZGVudGx5LlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubm9pc2U9dHJ1ZV0gLSBTaG93IG5vaXNlLWJhc2VkIGZpbG0gZ3JhaW4uXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zY2FubGluZXM9dHJ1ZV0gLSBTaG93IHNjYW5saW5lcy5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmdyaWQ9dHJ1ZV0gLSBTaG93IGEgZ3JpZC5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubm9pc2VJbnRlbnNpdHk9MC41XSAtIFRoZSBub2lzZSBpbnRlbnNpdHkuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnNjYW5saW5lSW50ZW5zaXR5PTAuMDVdIC0gVGhlIHNjYW5saW5lIGludGVuc2l0eS5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZ3JpZEludGVuc2l0eT0xLjBdIC0gVGhlIGdyaWQgc3RyZW5ndGguIDAuMCB0byAxLjAuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmdyZXlzY2FsZUludGVuc2l0eT0xLjBdIC0gVGhlIGludGVuc2l0eSBvZiB0aGUgZ3JleXNjYWxlIGVmZmVjdC4gMC4wIHRvIDEuMC5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc2VwaWFJbnRlbnNpdHk9MS4wXSAtIFRoZSBpbnRlbnNpdHkgb2YgdGhlIHNlcGlhIGVmZmVjdC4gMC4wIHRvIDEuMC5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudmlnbmV0dGVPZmZzZXQ9MS4wXSAtIFRoZSBvZmZzZXQgb2YgdGhlIHZpZ25ldHRlIGVmZmVjdC4gMC4wIHRvIDEuMC5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudmlnbmV0dGVEYXJrbmVzcz0xLjBdIC0gVGhlIGRhcmtuZXNzIG9mIHRoZSB2aWduZXR0ZSBlZmZlY3QuIDAuMCB0byAxLjAuXHJcbiAgICovXG4gIGZ1bmN0aW9uIEZpbG1NYXRlcmlhbCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBGaWxtTWF0ZXJpYWwpO1xuXG4gICAgdmFyIHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBzY3JlZW5Nb2RlOiB0cnVlLFxuICAgICAgbm9pc2U6IHRydWUsXG4gICAgICBzY2FubGluZXM6IHRydWUsXG4gICAgICBncmlkOiBmYWxzZSxcbiAgICAgIGdyZXlzY2FsZTogZmFsc2UsXG4gICAgICBzZXBpYTogZmFsc2UsXG4gICAgICB2aWduZXR0ZTogZmFsc2UsXG4gICAgICBlc2tpbDogZmFsc2UsXG4gICAgICBub2lzZUludGVuc2l0eTogMC41LFxuICAgICAgc2NhbmxpbmVJbnRlbnNpdHk6IDAuMDUsXG4gICAgICBncmlkSW50ZW5zaXR5OiAxLjAsXG4gICAgICBncmV5c2NhbGVJbnRlbnNpdHk6IDEuMCxcbiAgICAgIHNlcGlhSW50ZW5zaXR5OiAxLjAsXG4gICAgICB2aWduZXR0ZU9mZnNldDogMS4wLFxuICAgICAgdmlnbmV0dGVEYXJrbmVzczogMS4wXG4gICAgfSwgb3B0aW9ucyk7XG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoRmlsbU1hdGVyaWFsKS5jYWxsKHRoaXMsIHtcbiAgICAgIHR5cGU6IFwiRmlsbU1hdGVyaWFsXCIsXG4gICAgICB1bmlmb3Jtczoge1xuICAgICAgICB0RGlmZnVzZTogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIHRpbWU6IG5ldyBVbmlmb3JtKDAuMCksXG4gICAgICAgIG5vaXNlSW50ZW5zaXR5OiBuZXcgVW5pZm9ybShzZXR0aW5ncy5ub2lzZUludGVuc2l0eSksXG4gICAgICAgIHNjYW5saW5lSW50ZW5zaXR5OiBuZXcgVW5pZm9ybShzZXR0aW5ncy5zY2FubGluZUludGVuc2l0eSksXG4gICAgICAgIGdyaWRJbnRlbnNpdHk6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmdyaWRJbnRlbnNpdHkpLFxuICAgICAgICBzY2FubGluZUNvdW50OiBuZXcgVW5pZm9ybSgwLjApLFxuICAgICAgICBncmlkU2NhbGU6IG5ldyBVbmlmb3JtKG5ldyBWZWN0b3IyKCkpLFxuICAgICAgICBncmlkTGluZVdpZHRoOiBuZXcgVW5pZm9ybSgwLjApLFxuICAgICAgICBncmV5c2NhbGVJbnRlbnNpdHk6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmdyZXlzY2FsZUludGVuc2l0eSksXG4gICAgICAgIHNlcGlhSW50ZW5zaXR5OiBuZXcgVW5pZm9ybShzZXR0aW5ncy5zZXBpYUludGVuc2l0eSksXG4gICAgICAgIHZpZ25ldHRlT2Zmc2V0OiBuZXcgVW5pZm9ybShzZXR0aW5ncy52aWduZXR0ZU9mZnNldCksXG4gICAgICAgIHZpZ25ldHRlRGFya25lc3M6IG5ldyBVbmlmb3JtKHNldHRpbmdzLnZpZ25ldHRlRGFya25lc3MpXG4gICAgICB9LFxuICAgICAgZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50JDgsXG4gICAgICB2ZXJ0ZXhTaGFkZXI6IHZlcnRleCQ4LFxuICAgICAgZGVwdGhXcml0ZTogZmFsc2UsXG4gICAgICBkZXB0aFRlc3Q6IGZhbHNlXG4gICAgfSkpO1xuXG4gICAgX3RoaXMuc2V0U2NyZWVuTW9kZUVuYWJsZWQoc2V0dGluZ3Muc2NyZWVuTW9kZSk7XG5cbiAgICBfdGhpcy5zZXROb2lzZUVuYWJsZWQoc2V0dGluZ3Mubm9pc2UpO1xuXG4gICAgX3RoaXMuc2V0U2NhbmxpbmVzRW5hYmxlZChzZXR0aW5ncy5zY2FubGluZXMpO1xuXG4gICAgX3RoaXMuc2V0R3JpZEVuYWJsZWQoc2V0dGluZ3MuZ3JpZCk7XG5cbiAgICBfdGhpcy5zZXRHcmV5c2NhbGVFbmFibGVkKHNldHRpbmdzLmdyZXlzY2FsZSk7XG5cbiAgICBfdGhpcy5zZXRTZXBpYUVuYWJsZWQoc2V0dGluZ3Muc2VwaWEpO1xuXG4gICAgX3RoaXMuc2V0VmlnbmV0dGVFbmFibGVkKHNldHRpbmdzLnZpZ25ldHRlKTtcblxuICAgIF90aGlzLnNldEVza2lsRW5hYmxlZChzZXR0aW5ncy5lc2tpbCk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgU2NyZWVuIGJsZW5kIG1vZGUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBTY3JlZW4gYmxlbmQgbW9kZSBzaG91bGQgYmUgZW5hYmxlZC5cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKEZpbG1NYXRlcmlhbCwgW3tcbiAgICBrZXk6IFwic2V0U2NyZWVuTW9kZUVuYWJsZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2NyZWVuTW9kZUVuYWJsZWQoZW5hYmxlZCkge1xuICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlNDUkVFTl9NT0RFID0gXCIxXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdGhpcy5kZWZpbmVzLlNDUkVFTl9NT0RFO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBub2lzZSBlZmZlY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0aGUgbm9pc2UgZWZmZWN0IHNob3VsZCBiZSBlbmFibGVkLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXROb2lzZUVuYWJsZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Tm9pc2VFbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5OT0lTRSA9IFwiMVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGVmaW5lcy5OT0lTRTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc2NhbmxpbmVzIGVmZmVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBzY2FubGluZXMgZWZmZWN0IHNob3VsZCBiZSBlbmFibGVkLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRTY2FubGluZXNFbmFibGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNjYW5saW5lc0VuYWJsZWQoZW5hYmxlZCkge1xuICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlNDQU5MSU5FUyA9IFwiMVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGVmaW5lcy5TQ0FOTElORVM7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGdyaWQgZWZmZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIGdyaWQgZWZmZWN0IHNob3VsZCBiZSBlbmFibGVkLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRHcmlkRW5hYmxlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRHcmlkRW5hYmxlZChlbmFibGVkKSB7XG4gICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmRlZmluZXMuR1JJRCA9IFwiMVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGVmaW5lcy5HUklEO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBncmV5c2NhbGUgZWZmZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIGdyZXlzY2FsZSBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldEdyZXlzY2FsZUVuYWJsZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0R3JleXNjYWxlRW5hYmxlZChlbmFibGVkKSB7XG4gICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmRlZmluZXMuR1JFWVNDQUxFID0gXCIxXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdGhpcy5kZWZpbmVzLkdSRVlTQ0FMRTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc2VwaWEgZWZmZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIHNlcGlhIGVmZmVjdCBzaG91bGQgYmUgZW5hYmxlZC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0U2VwaWFFbmFibGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNlcGlhRW5hYmxlZChlbmFibGVkKSB7XG4gICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmRlZmluZXMuU0VQSUEgPSBcIjFcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRlZmluZXMuU0VQSUE7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFZpZ25ldHRlIGVmZmVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBWaWduZXR0ZSBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFZpZ25ldHRlRW5hYmxlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRWaWduZXR0ZUVuYWJsZWQoZW5hYmxlZCkge1xuICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlZJR05FVFRFID0gXCIxXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdGhpcy5kZWZpbmVzLlZJR05FVFRFO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBFc2tpbCBWaWduZXR0ZSBlZmZlY3QuXHJcbiAgICAgKlxyXG4gICAgICogSGFzIG5vIGVmZmVjdCBpZiBWaWduZXR0ZSBpcyBkaXNhYmxlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBFc2tpbCBWaWduZXR0ZSBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldEVza2lsRW5hYmxlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRFc2tpbEVuYWJsZWQoZW5hYmxlZCkge1xuICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kZWZpbmVzLkVTS0lMID0gXCIxXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdGhpcy5kZWZpbmVzLkVTS0lMO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhGaWxtTWF0ZXJpYWwsIF9TaGFkZXJNYXRlcmlhbCk7XG5cbiAgcmV0dXJuIEZpbG1NYXRlcmlhbDtcbn0oU2hhZGVyTWF0ZXJpYWwpO1xuXG52YXIgZnJhZ21lbnQkOSA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdFBlcnR1cmI7XFxyXFxuXFxyXFxudW5pZm9ybSBib29sIGFjdGl2ZTtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IGFtb3VudDtcXHJcXG51bmlmb3JtIGZsb2F0IGFuZ2xlO1xcclxcbnVuaWZvcm0gZmxvYXQgc2VlZDtcXHJcXG51bmlmb3JtIGZsb2F0IHNlZWRYO1xcclxcbnVuaWZvcm0gZmxvYXQgc2VlZFk7XFxyXFxudW5pZm9ybSBmbG9hdCBkaXN0b3J0aW9uWDtcXHJcXG51bmlmb3JtIGZsb2F0IGRpc3RvcnRpb25ZO1xcclxcbnVuaWZvcm0gZmxvYXQgY29sUztcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbmZsb2F0IHJhbmQodmVjMiB0Yykge1xcclxcblxcclxcblxcdGNvbnN0IGZsb2F0IGEgPSAxMi45ODk4O1xcclxcblxcdGNvbnN0IGZsb2F0IGIgPSA3OC4yMzM7XFxyXFxuXFx0Y29uc3QgZmxvYXQgYyA9IDQzNzU4LjU0NTM7XFxyXFxuXFxyXFxuXFx0ZmxvYXQgZHQgPSBkb3QodGMsIHZlYzIoYSwgYikpO1xcclxcblxcdGZsb2F0IHNuID0gbW9kKGR0LCAzLjE0KTtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gZnJhY3Qoc2luKHNuKSAqIGMpO1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjMiBjb29yZCA9IHZVdjtcXHJcXG5cXHJcXG5cXHRmbG9hdCB4cywgeXM7XFxyXFxuXFx0dmVjNCBub3JtYWw7XFxyXFxuXFxyXFxuXFx0dmVjMiBvZmZzZXQ7XFxyXFxuXFx0dmVjNCBjciwgY2dhLCBjYjtcXHJcXG5cXHR2ZWM0IHNub3csIGNvbG9yO1xcclxcblxcclxcblxcdGZsb2F0IHN4LCBzeTtcXHJcXG5cXHJcXG5cXHRpZihhY3RpdmUpIHtcXHJcXG5cXHJcXG5cXHRcXHR4cyA9IGZsb29yKGdsX0ZyYWdDb29yZC54IC8gMC41KTtcXHJcXG5cXHRcXHR5cyA9IGZsb29yKGdsX0ZyYWdDb29yZC55IC8gMC41KTtcXHJcXG5cXHJcXG5cXHRcXHRub3JtYWwgPSB0ZXh0dXJlMkQodFBlcnR1cmIsIGNvb3JkICogc2VlZCAqIHNlZWQpO1xcclxcblxcclxcblxcdFxcdGlmKGNvb3JkLnkgPCBkaXN0b3J0aW9uWCArIGNvbFMgJiYgY29vcmQueSA+IGRpc3RvcnRpb25YIC0gY29sUyAqIHNlZWQpIHtcXHJcXG5cXHJcXG5cXHRcXHRcXHRzeCA9IGNsYW1wKGNlaWwoc2VlZFgpLCAwLjAsIDEuMCk7XFxyXFxuXFx0XFx0XFx0Y29vcmQueSA9IHN4ICogKDEuMCAtIChjb29yZC55ICsgZGlzdG9ydGlvblkpKSArICgxLjAgLSBzeCkgKiBkaXN0b3J0aW9uWTtcXHJcXG5cXHJcXG5cXHRcXHR9XFxyXFxuXFxyXFxuXFx0XFx0aWYoY29vcmQueCA8IGRpc3RvcnRpb25ZICsgY29sUyAmJiBjb29yZC54ID4gZGlzdG9ydGlvblkgLSBjb2xTICogc2VlZCkge1xcclxcblxcclxcblxcdFxcdFxcdHN5ID0gY2xhbXAoY2VpbChzZWVkWSksIDAuMCwgMS4wKTtcXHJcXG5cXHRcXHRcXHRjb29yZC54ID0gc3kgKiBkaXN0b3J0aW9uWCArICgxLjAgLSBzeSkgKiAoMS4wIC0gKGNvb3JkLnggKyBkaXN0b3J0aW9uWCkpO1xcclxcblxcclxcblxcdFxcdH1cXHJcXG5cXHJcXG5cXHRcXHRjb29yZC54ICs9IG5vcm1hbC54ICogc2VlZFggKiAoc2VlZCAvIDUuMCk7XFxyXFxuXFx0XFx0Y29vcmQueSArPSBub3JtYWwueSAqIHNlZWRZICogKHNlZWQgLyA1LjApO1xcclxcblxcclxcblxcdFxcdG9mZnNldCA9IGFtb3VudCAqIHZlYzIoY29zKGFuZ2xlKSwgc2luKGFuZ2xlKSk7XFxyXFxuXFxyXFxuXFx0XFx0Y3IgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIGNvb3JkICsgb2Zmc2V0KTtcXHJcXG5cXHRcXHRjZ2EgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIGNvb3JkKTtcXHJcXG5cXHRcXHRjYiA9IHRleHR1cmUyRCh0RGlmZnVzZSwgY29vcmQgLSBvZmZzZXQpO1xcclxcblxcclxcblxcdFxcdGNvbG9yID0gdmVjNChjci5yLCBjZ2EuZywgY2IuYiwgY2dhLmEpO1xcclxcblxcdFxcdHNub3cgPSAyMDAuMCAqIGFtb3VudCAqIHZlYzQocmFuZCh2ZWMyKHhzICogc2VlZCwgeXMgKiBzZWVkICogNTAuMCkpICogMC4yKTtcXHJcXG5cXHRcXHRjb2xvciArPSBzbm93O1xcclxcblxcclxcblxcdH0gZWxzZSB7XFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdik7XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IGNvbG9yO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbnZhciB2ZXJ0ZXgkOSA9IFwidmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG4vKipcclxuICogQSBnbGl0Y2ggc2hhZGVyIG1hdGVyaWFsLlxyXG4gKlxyXG4gKiBSZWZlcmVuY2U6XHJcbiAqICBodHRwczovL2dpdGh1Yi5jb20vc3RhZmZhbnRhbi91bml0eWdsaXRjaFxyXG4gKi9cblxudmFyIEdsaXRjaE1hdGVyaWFsID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfU2hhZGVyTWF0ZXJpYWwpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBnbGl0Y2ggbWF0ZXJpYWwuXHJcbiAgICovXG4gIGZ1bmN0aW9uIEdsaXRjaE1hdGVyaWFsKCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEdsaXRjaE1hdGVyaWFsKTtcblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoR2xpdGNoTWF0ZXJpYWwpLmNhbGwodGhpcywge1xuICAgICAgdHlwZTogXCJHbGl0Y2hNYXRlcmlhbFwiLFxuICAgICAgdW5pZm9ybXM6IHtcbiAgICAgICAgdERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICB0UGVydHVyYjogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIGFjdGl2ZTogbmV3IFVuaWZvcm0oMSksXG4gICAgICAgIGFtb3VudDogbmV3IFVuaWZvcm0oMC44KSxcbiAgICAgICAgYW5nbGU6IG5ldyBVbmlmb3JtKDAuMDIpLFxuICAgICAgICBzZWVkOiBuZXcgVW5pZm9ybSgwLjAyKSxcbiAgICAgICAgc2VlZFg6IG5ldyBVbmlmb3JtKDAuMDIpLFxuICAgICAgICBzZWVkWTogbmV3IFVuaWZvcm0oMC4wMiksXG4gICAgICAgIGRpc3RvcnRpb25YOiBuZXcgVW5pZm9ybSgwLjUpLFxuICAgICAgICBkaXN0b3J0aW9uWTogbmV3IFVuaWZvcm0oMC42KSxcbiAgICAgICAgY29sUzogbmV3IFVuaWZvcm0oMC4wNSlcbiAgICAgIH0sXG4gICAgICBmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQkOSxcbiAgICAgIHZlcnRleFNoYWRlcjogdmVydGV4JDksXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcbiAgICAgIGRlcHRoVGVzdDogZmFsc2VcbiAgICB9KSk7XG4gIH1cblxuICBpbmhlcml0cyhHbGl0Y2hNYXRlcmlhbCwgX1NoYWRlck1hdGVyaWFsKTtcblxuICByZXR1cm4gR2xpdGNoTWF0ZXJpYWw7XG59KFNoYWRlck1hdGVyaWFsKTtcblxudmFyIGZyYWdtZW50JDEwID0gXCIjaW5jbHVkZSA8Y29tbW9uPlxcclxcbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cXHJcXG5cXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIHZlYzMgbGlnaHRQb3NpdGlvbjtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IGV4cG9zdXJlO1xcclxcbnVuaWZvcm0gZmxvYXQgZGVjYXk7XFxyXFxudW5pZm9ybSBmbG9hdCBkZW5zaXR5O1xcclxcbnVuaWZvcm0gZmxvYXQgd2VpZ2h0O1xcclxcbnVuaWZvcm0gZmxvYXQgY2xhbXBNYXg7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjMiB0ZXhDb29yZCA9IHZVdjtcXHJcXG5cXHJcXG5cXHQvLyBDYWxjdWxhdGUgdmVjdG9yIGZyb20gcGl4ZWwgdG8gbGlnaHQgc291cmNlIGluIHNjcmVlbiBzcGFjZS5cXHJcXG5cXHR2ZWMyIGRlbHRhVGV4Q29vcmQgPSB0ZXhDb29yZCAtIGxpZ2h0UG9zaXRpb24uc3Q7XFxyXFxuXFx0ZGVsdGFUZXhDb29yZCAqPSAxLjAgLyBOVU1fU0FNUExFU19GTE9BVCAqIGRlbnNpdHk7XFxyXFxuXFxyXFxuXFx0Ly8gQSBkZWNyZWFzaW5nIGlsbHVtaW5hdGlvbiBmYWN0b3IuXFxyXFxuXFx0ZmxvYXQgaWxsdW1pbmF0aW9uRGVjYXkgPSAxLjA7XFxyXFxuXFxyXFxuXFx0dmVjNCBzYW1wbGU7XFxyXFxuXFx0dmVjNCBjb2xvciA9IHZlYzQoMC4wKTtcXHJcXG5cXHJcXG5cXHQvLyBFc3RpbWF0ZSB0aGUgcHJvYmFiaWxpdHkgb2Ygb2NjbHVzaW9uIGF0IGVhY2ggcGl4ZWwgYnkgc3VtbWluZyBzYW1wbGVzIGFsb25nIGEgcmF5IHRvIHRoZSBsaWdodCBzb3VyY2UuXFxyXFxuXFx0Zm9yKGludCBpID0gMDsgaSA8IE5VTV9TQU1QTEVTX0lOVDsgKytpKSB7XFxyXFxuXFxyXFxuXFx0XFx0dGV4Q29vcmQgLT0gZGVsdGFUZXhDb29yZDtcXHJcXG5cXHRcXHRzYW1wbGUgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHRleENvb3JkKTtcXHJcXG5cXHJcXG5cXHRcXHQvLyBBcHBseSBzYW1wbGUgYXR0ZW51YXRpb24gc2NhbGUvZGVjYXkgZmFjdG9ycy5cXHJcXG5cXHRcXHRzYW1wbGUgKj0gaWxsdW1pbmF0aW9uRGVjYXkgKiB3ZWlnaHQ7XFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IgKz0gc2FtcGxlO1xcclxcblxcclxcblxcdFxcdC8vIFVwZGF0ZSBleHBvbmVudGlhbCBkZWNheSBmYWN0b3IuXFxyXFxuXFx0XFx0aWxsdW1pbmF0aW9uRGVjYXkgKj0gZGVjYXk7XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IGNsYW1wKGNvbG9yICogZXhwb3N1cmUsIDAuMCwgY2xhbXBNYXgpO1xcclxcblxcclxcblxcdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XFxyXFxuXFxyXFxufVxcclxcblwiO1xudmFyIHZlcnRleCQxMCA9IFwidmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG4vKipcclxuICogQSBjcmVwdXNjdWxhciByYXlzIHNoYWRlciBtYXRlcmlhbC5cclxuICpcclxuICogVGhpcyBtYXRlcmlhbCBzdXBwb3J0cyBkaXRoZXJpbmcuXHJcbiAqXHJcbiAqIFJlZmVyZW5jZXM6XHJcbiAqXHJcbiAqIFRoaWJhdXQgRGVzcG91bGFpbiwgMjAxMjpcclxuICogIFsoV2ViR0wpIFZvbHVtZXRyaWMgTGlnaHQgQXBwcm94aW1hdGlvbiBpbiBUaHJlZS5qc10oXHJcbiAqICBodHRwOi8vYmtjb3JlLmNvbS9ibG9nLzNkL3dlYmdsLXRocmVlLWpzLXZvbHVtZXRyaWMtbGlnaHQtZ29kcmF5cy5odG1sKVxyXG4gKlxyXG4gKiBOdmlkaWEsIEdQVSBHZW1zIDMsIDIwMDg6XHJcbiAqICBbQ2hhcHRlciAxMy4gVm9sdW1ldHJpYyBMaWdodCBTY2F0dGVyaW5nIGFzIGEgUG9zdC1Qcm9jZXNzXShcclxuICogIGh0dHBzOi8vZGV2ZWxvcGVyLm52aWRpYS5jb20vZ3B1Z2Vtcy9HUFVHZW1zMy9ncHVnZW1zM19jaDEzLmh0bWwpXHJcbiAqL1xuXG52YXIgR29kUmF5c01hdGVyaWFsID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfU2hhZGVyTWF0ZXJpYWwpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBnb2QgcmF5cyBtYXRlcmlhbC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBUaGUgb3B0aW9ucy5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZGVuc2l0eT0wLjk2XSAtIFRoZSBkZW5zaXR5IG9mIHRoZSBsaWdodCByYXlzLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kZWNheT0wLjkzXSAtIEFuIGlsbHVtaW5hdGlvbiBkZWNheSBmYWN0b3IuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLndlaWdodD0wLjRdIC0gQSBsaWdodCByYXkgd2VpZ2h0IGZhY3Rvci5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZXhwb3N1cmU9MC42XSAtIEEgY29uc3RhbnQgYXR0ZW51YXRpb24gY29lZmZpY2llbnQuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmNsYW1wTWF4PTEuMF0gLSBBbiB1cHBlciBib3VuZCBmb3IgdGhlIHNhdHVyYXRpb24gb2YgdGhlIG92ZXJhbGwgZWZmZWN0LlxyXG4gICAqL1xuICBmdW5jdGlvbiBHb2RSYXlzTWF0ZXJpYWwoKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgR29kUmF5c01hdGVyaWFsKTtcblxuICAgIHZhciBzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgZXhwb3N1cmU6IDAuNixcbiAgICAgIGRlbnNpdHk6IDAuOTMsXG4gICAgICBkZWNheTogMC45NixcbiAgICAgIHdlaWdodDogMC40LFxuICAgICAgY2xhbXBNYXg6IDEuMFxuICAgIH0sIG9wdGlvbnMpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoR29kUmF5c01hdGVyaWFsKS5jYWxsKHRoaXMsIHtcbiAgICAgIHR5cGU6IFwiR29kUmF5c01hdGVyaWFsXCIsXG4gICAgICBkZWZpbmVzOiB7XG4gICAgICAgIE5VTV9TQU1QTEVTX0ZMT0FUOiBcIjYwLjBcIixcbiAgICAgICAgTlVNX1NBTVBMRVNfSU5UOiBcIjYwXCJcbiAgICAgIH0sXG4gICAgICB1bmlmb3Jtczoge1xuICAgICAgICB0RGlmZnVzZTogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIGxpZ2h0UG9zaXRpb246IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICBleHBvc3VyZTogbmV3IFVuaWZvcm0oc2V0dGluZ3MuZXhwb3N1cmUpLFxuICAgICAgICBkZWNheTogbmV3IFVuaWZvcm0oc2V0dGluZ3MuZGVjYXkpLFxuICAgICAgICBkZW5zaXR5OiBuZXcgVW5pZm9ybShzZXR0aW5ncy5kZW5zaXR5KSxcbiAgICAgICAgd2VpZ2h0OiBuZXcgVW5pZm9ybShzZXR0aW5ncy53ZWlnaHQpLFxuICAgICAgICBjbGFtcE1heDogbmV3IFVuaWZvcm0oc2V0dGluZ3MuY2xhbXBNYXgpXG4gICAgICB9LFxuICAgICAgZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50JDEwLFxuICAgICAgdmVydGV4U2hhZGVyOiB2ZXJ0ZXgkMTAsXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcbiAgICAgIGRlcHRoVGVzdDogZmFsc2VcbiAgICB9KSk7XG4gIH1cblxuICBpbmhlcml0cyhHb2RSYXlzTWF0ZXJpYWwsIF9TaGFkZXJNYXRlcmlhbCk7XG5cbiAgcmV0dXJuIEdvZFJheXNNYXRlcmlhbDtcbn0oU2hhZGVyTWF0ZXJpYWwpO1xuXG52YXIgZnJhZ21lbnQkMTEgPSBcIiNpbmNsdWRlIDxjb21tb24+XFxyXFxuXFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBmbG9hdCBkaXN0aW5jdGlvbjtcXHJcXG51bmlmb3JtIHZlYzIgcmFuZ2U7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjNCB0ZXhlbCA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2KTtcXHJcXG5cXHRmbG9hdCBsID0gbGluZWFyVG9SZWxhdGl2ZUx1bWluYW5jZSh0ZXhlbC5yZ2IpO1xcclxcblxcclxcblxcdCNpZmRlZiBSQU5HRVxcclxcblxcclxcblxcdFxcdGZsb2F0IGxvdyA9IHN0ZXAocmFuZ2UueCwgbCk7XFxyXFxuXFx0XFx0ZmxvYXQgaGlnaCA9IHN0ZXAobCwgcmFuZ2UueSk7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gQXBwbHkgdGhlIG1hc2suXFxyXFxuXFx0XFx0bCAqPSBsb3cgKiBoaWdoO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdGwgPSBwb3coYWJzKGwpLCBkaXN0aW5jdGlvbik7XFxyXFxuXFxyXFxuXFx0I2lmZGVmIENPTE9SXFxyXFxuXFxyXFxuXFx0XFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCh0ZXhlbC5yZ2IgKiBsLCB0ZXhlbC5hKTtcXHJcXG5cXHJcXG5cXHQjZWxzZVxcclxcblxcclxcblxcdFxcdGdsX0ZyYWdDb2xvciA9IHZlYzQobCwgbCwgbCwgdGV4ZWwuYSk7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxufVxcclxcblwiO1xudmFyIHZlcnRleCQxMSA9IFwidmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG4vKipcclxuICogQSBsdW1pbm9zaXR5IHNoYWRlciBtYXRlcmlhbC5cclxuICpcclxuICogVGhpcyBzaGFkZXIgcHJvZHVjZXMgYSBncmV5c2NhbGUgbHVtaW5hbmNlIG1hcCB0aGF0IGRlc2NyaWJlcyB0aGUgYWJzb2x1dGVcclxuICogYW1vdW50IG9mIGxpZ2h0IGVtaXR0ZWQgYnkgYSBzY2VuZS4gSXQgY2FuIGFsc28gYmUgY29uZmlndXJlZCB0byBvdXRwdXRcclxuICogY29sb3VycyB0aGF0IGFyZSBzY2FsZWQgd2l0aCB0aGVpciByZXNwZWN0aXZlIGx1bWluYW5jZSB2YWx1ZS4gQWRkaXRpb25hbGx5LFxyXG4gKiBhIHJhbmdlIG1heSBiZSBwcm92aWRlZCB0byBtYXNrIG91dCB1bmRlc2lyZWQgdGV4ZWxzLlxyXG4gKlxyXG4gKiBUaGUgYWxwaGEgY2hhbm5lbCB3aWxsIHJlbWFpbiB1bmFmZmVjdGVkIGluIGFsbCBjYXNlcy5cclxuICpcclxuICogT24gbHVtaW5hbmNlIGNvZWZmaWNpZW50czpcclxuICogIGh0dHA6Ly93d3cucG95bnRvbi5jb20vbm90ZXMvY29sb3VyX2FuZF9nYW1tYS9Db2xvckZBUS5odG1sI1JURlRvQzlcclxuICpcclxuICogQ29lZmZpY2llbnRzIGZvciBkaWZmZXJlbnQgY29sb3VyIHNwYWNlczpcclxuICogIGh0dHBzOi8vaHN0by5vcmcvZ2V0cHJvL2hhYnIvcG9zdF9pbWFnZXMvMmFiLzY5ZC8wODQvMmFiNjlkMDg0ZjlhNTk3ZTAzMjYyNGJjZDc0ZDU3YTcucG5nXHJcbiAqXHJcbiAqIEx1bWluYW5jZSByYW5nZSByZWZlcmVuY2U6XHJcbiAqICBodHRwczovL2N5Y2xpbmc3NC5jb20vMjAwNy8wNS8yMy95b3VyLWZpcnN0LXNoYWRlci8jLlZ0eTlGZmtyTDRaXHJcbiAqL1xuXG52YXIgTHVtaW5vc2l0eU1hdGVyaWFsID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfU2hhZGVyTWF0ZXJpYWwpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBsdW1pbm9zaXR5IG1hdGVyaWFsLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbY29sb3JPdXRwdXQ9ZmFsc2VdIC0gRGVmaW5lcyB3aGV0aGVyIHRoZSBzaGFkZXIgc2hvdWxkIG91dHB1dCBjb2xvdXJzIHNjYWxlZCB3aXRoIHRoZWlyIGx1bWluYW5jZSB2YWx1ZS5cclxuICAgKiBAcGFyYW0ge1ZlY3RvcjJ9IFtsdW1pbmFuY2VSYW5nZV0gLSBJZiBwcm92aWRlZCwgdGhlIHNoYWRlciB3aWxsIG1hc2sgb3V0IHRleGVscyB0aGF0IGFyZW4ndCBpbiB0aGUgc3BlY2lmaWVkIGx1bWluYW5jZSByYW5nZS5cclxuICAgKi9cbiAgZnVuY3Rpb24gTHVtaW5vc2l0eU1hdGVyaWFsKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBjb2xvck91dHB1dCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG4gICAgdmFyIGx1bWluYW5jZVJhbmdlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgTHVtaW5vc2l0eU1hdGVyaWFsKTtcblxuICAgIHZhciBtYXNrTHVtaW5hbmNlID0gbHVtaW5hbmNlUmFuZ2UgIT09IG51bGw7XG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoTHVtaW5vc2l0eU1hdGVyaWFsKS5jYWxsKHRoaXMsIHtcbiAgICAgIHR5cGU6IFwiTHVtaW5vc2l0eU1hdGVyaWFsXCIsXG4gICAgICB1bmlmb3Jtczoge1xuICAgICAgICB0RGlmZnVzZTogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIGRpc3RpbmN0aW9uOiBuZXcgVW5pZm9ybSgxLjApLFxuICAgICAgICByYW5nZTogbmV3IFVuaWZvcm0obWFza0x1bWluYW5jZSA/IGx1bWluYW5jZVJhbmdlIDogbmV3IFZlY3RvcjIoKSlcbiAgICAgIH0sXG4gICAgICBmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQkMTEsXG4gICAgICB2ZXJ0ZXhTaGFkZXI6IHZlcnRleCQxMVxuICAgIH0pKTtcblxuICAgIF90aGlzLnNldENvbG9yT3V0cHV0RW5hYmxlZChjb2xvck91dHB1dCk7XG5cbiAgICBfdGhpcy5zZXRMdW1pbmFuY2VSYW5nZUVuYWJsZWQobWFza0x1bWluYW5jZSk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBjb2xvciBvdXRwdXQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIGNvbG9yIG91dHB1dCBzaG91bGQgYmUgZW5hYmxlZC5cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKEx1bWlub3NpdHlNYXRlcmlhbCwgW3tcbiAgICBrZXk6IFwic2V0Q29sb3JPdXRwdXRFbmFibGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldENvbG9yT3V0cHV0RW5hYmxlZChlbmFibGVkKSB7XG4gICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmRlZmluZXMuQ09MT1IgPSBcIjFcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRlZmluZXMuQ09MT1I7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGx1bWluYW5jZSBtYXNrLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIGx1bWluYW5jZSBtYXNrIHNob3VsZCBiZSBlbmFibGVkLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRMdW1pbmFuY2VSYW5nZUVuYWJsZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0THVtaW5hbmNlUmFuZ2VFbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5SQU5HRSA9IFwiMVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGVmaW5lcy5SQU5HRTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoTHVtaW5vc2l0eU1hdGVyaWFsLCBfU2hhZGVyTWF0ZXJpYWwpO1xuXG4gIHJldHVybiBMdW1pbm9zaXR5TWF0ZXJpYWw7XG59KFNoYWRlck1hdGVyaWFsKTtcblxudmFyIGZyYWdtZW50JDEyID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0TWFzaztcXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RWRnZXM7XFxyXFxuXFxyXFxudW5pZm9ybSB2ZWMzIHZpc2libGVFZGdlQ29sb3I7XFxyXFxudW5pZm9ybSB2ZWMzIGhpZGRlbkVkZ2VDb2xvcjtcXHJcXG51bmlmb3JtIGZsb2F0IHB1bHNlO1xcclxcbnVuaWZvcm0gZmxvYXQgZWRnZVN0cmVuZ3RoO1xcclxcblxcclxcbiNpZmRlZiBVU0VfUEFUVEVSTlxcclxcblxcclxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIHRQYXR0ZXJuO1xcclxcblxcdHZhcnlpbmcgdmVjMiB2UGF0dGVybkNvb3JkO1xcclxcblxcclxcbiNlbmRpZlxcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZlYzQgY29sb3IgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdik7XFxyXFxuXFx0dmVjMiBlZGdlID0gdGV4dHVyZTJEKHRFZGdlcywgdlV2KS5yZztcXHJcXG5cXHR2ZWMyIG1hc2sgPSB0ZXh0dXJlMkQodE1hc2ssIHZVdikucmc7XFxyXFxuXFxyXFxuXFx0I2lmbmRlZiBYX1JBWVxcclxcblxcclxcblxcdFxcdGVkZ2UueSA9IDAuMDtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRlZGdlICo9IChlZGdlU3RyZW5ndGggKiBtYXNrLnggKiBwdWxzZSk7XFxyXFxuXFx0dmVjMyBvdXRsaW5lQ29sb3IgPSBlZGdlLnggKiB2aXNpYmxlRWRnZUNvbG9yICsgZWRnZS55ICogaGlkZGVuRWRnZUNvbG9yO1xcclxcblxcclxcblxcdCNpZmRlZiBBTFBIQV9CTEVORElOR1xcclxcblxcclxcblxcdFxcdGNvbG9yLnJnYiA9IG1peChjb2xvci5yZ2IsIG91dGxpbmVDb2xvciwgbWF4KGVkZ2UueCwgZWRnZS55KSk7XFxyXFxuXFxyXFxuXFx0I2Vsc2VcXHJcXG5cXHJcXG5cXHRcXHRjb2xvci5yZ2IgKz0gb3V0bGluZUNvbG9yO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdCNpZmRlZiBVU0VfUEFUVEVSTlxcclxcblxcclxcblxcdFxcdHZlYzMgcGF0dGVybkNvbG9yID0gdGV4dHVyZTJEKHRQYXR0ZXJuLCB2UGF0dGVybkNvb3JkKS5yZ2I7XFxyXFxuXFxyXFxuXFx0XFx0I2lmZGVmIFhfUkFZXFxyXFxuXFxyXFxuXFx0XFx0XFx0ZmxvYXQgaGlkZGVuRmFjdG9yID0gMC41O1xcclxcblxcclxcblxcdFxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0XFx0ZmxvYXQgaGlkZGVuRmFjdG9yID0gMC4wO1xcclxcblxcclxcblxcdFxcdCNlbmRpZlxcclxcblxcclxcblxcdFxcdGZsb2F0IHZpc2liaWxpdHlGYWN0b3IgPSAoMS4wIC0gbWFzay55ID4gMC4wKSA/IDEuMCA6IGhpZGRlbkZhY3RvcjtcXHJcXG5cXHJcXG5cXHRcXHRjb2xvci5yZ2IgKz0gdmlzaWJpbGl0eUZhY3RvciAqICgxLjAgLSBtYXNrLngpICogKDEuMCAtIHBhdHRlcm5Db2xvcik7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gY29sb3I7XFxyXFxuXFxyXFxufVxcclxcblwiO1xudmFyIHZlcnRleCQxMiA9IFwiI2lmZGVmIFVTRV9QQVRURVJOXFxyXFxuXFxyXFxuXFx0dW5pZm9ybSBmbG9hdCBhc3BlY3Q7XFxyXFxuXFx0dW5pZm9ybSBmbG9hdCBwYXR0ZXJuU2NhbGU7XFxyXFxuXFx0dmFyeWluZyB2ZWMyIHZQYXR0ZXJuQ29vcmQ7XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0I2lmZGVmIFVTRV9QQVRURVJOXFxyXFxuXFxyXFxuXFx0XFx0dmVjMiBhc3BlY3RDb3JyZWN0aW9uID0gdmVjMihhc3BlY3QsIDEuMCk7XFxyXFxuXFx0XFx0dlBhdHRlcm5Db29yZCA9IHV2ICogYXNwZWN0Q29ycmVjdGlvbiAqIHBhdHRlcm5TY2FsZTtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbi8qKlxyXG4gKiBBbiBvdXRsaW5lIGJsZW5kIHNoYWRlciBtYXRlcmlhbC5cclxuICovXG5cbnZhciBPdXRsaW5lQmxlbmRNYXRlcmlhbCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1NoYWRlck1hdGVyaWFsKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgb3V0bGluZSBibGVuZCBtYXRlcmlhbC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBUaGUgb3B0aW9ucy5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZWRnZVN0cmVuZ3RoPTEuMF0gLSBUaGUgZWRnZSBzdHJlbmd0aC5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMucGF0dGVyblNjYWxlPTEuMF0gLSBUaGUgc2NhbGUgb2YgdGhlIHBhdHRlcm4gdGV4dHVyZS5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudmlzaWJsZUVkZ2VDb2xvcj0weGZmZmZmZl0gLSBUaGUgY29sb3Igb2YgdmlzaWJsZSBlZGdlcy5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaGlkZGVuRWRnZUNvbG9yPTB4MjIwOTBBXSAtIFRoZSBjb2xvciBvZiBoaWRkZW4gZWRnZXMuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbYWxwaGFCbGVuZGluZz1mYWxzZV0gLSBXaGV0aGVyIHRoZSBvdXRsaW5lIHNob3VsZCBiZSBibGVuZGVkIHVzaW5nIGFscGhhLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3hSYXk9dHJ1ZV0gLSBXaGV0aGVyIGhpZGRlbiBwYXJ0cyBvZiBzZWxlY3RlZCBvYmplY3RzIHNob3VsZCBiZSB2aXNpYmxlLlxyXG4gICAqL1xuICBmdW5jdGlvbiBPdXRsaW5lQmxlbmRNYXRlcmlhbCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBPdXRsaW5lQmxlbmRNYXRlcmlhbCk7XG5cbiAgICB2YXIgc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIGVkZ2VTdHJlbmd0aDogMS4wLFxuICAgICAgcGF0dGVyblNjYWxlOiAxLjAsXG4gICAgICB2aXNpYmxlRWRnZUNvbG9yOiAweGZmZmZmZixcbiAgICAgIGhpZGRlbkVkZ2VDb2xvcjogMHgyMjA5MEEsXG4gICAgICBhbHBoYUJsZW5kaW5nOiBmYWxzZSxcbiAgICAgIHhSYXk6IHRydWVcbiAgICB9LCBvcHRpb25zKTtcbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihPdXRsaW5lQmxlbmRNYXRlcmlhbCkuY2FsbCh0aGlzLCB7XG4gICAgICB0eXBlOiBcIk91dGxpbmVCbGVuZE1hdGVyaWFsXCIsXG4gICAgICB1bmlmb3Jtczoge1xuICAgICAgICBwdWxzZTogbmV3IFVuaWZvcm0oMS4wKSxcbiAgICAgICAgYXNwZWN0OiBuZXcgVW5pZm9ybSgxLjApLFxuICAgICAgICB0RGlmZnVzZTogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIHRNYXNrOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgdEVkZ2VzOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgdFBhdHRlcm46IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICBlZGdlU3RyZW5ndGg6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmVkZ2VTdHJlbmd0aCksXG4gICAgICAgIHBhdHRlcm5TY2FsZTogbmV3IFVuaWZvcm0oc2V0dGluZ3MucGF0dGVyblNjYWxlKSxcbiAgICAgICAgdmlzaWJsZUVkZ2VDb2xvcjogbmV3IFVuaWZvcm0obmV3IENvbG9yKHNldHRpbmdzLnZpc2libGVFZGdlQ29sb3IpKSxcbiAgICAgICAgaGlkZGVuRWRnZUNvbG9yOiBuZXcgVW5pZm9ybShuZXcgQ29sb3Ioc2V0dGluZ3MuaGlkZGVuRWRnZUNvbG9yKSlcbiAgICAgIH0sXG4gICAgICBmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQkMTIsXG4gICAgICB2ZXJ0ZXhTaGFkZXI6IHZlcnRleCQxMixcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgICAgZGVwdGhUZXN0OiBmYWxzZVxuICAgIH0pKTtcblxuICAgIF90aGlzLnNldEFscGhhQmxlbmRpbmdFbmFibGVkKHNldHRpbmdzLmFscGhhQmxlbmRpbmcpO1xuXG4gICAgX3RoaXMuc2V0WFJheUVuYWJsZWQoc2V0dGluZ3MueFJheSk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgYWxwaGEgYmxlbmRpbmcuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBhbHBoYSBibGVuZGluZyBzaG91bGQgYmUgZW5hYmxlZC5cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKE91dGxpbmVCbGVuZE1hdGVyaWFsLCBbe1xuICAgIGtleTogXCJzZXRBbHBoYUJsZW5kaW5nRW5hYmxlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRBbHBoYUJsZW5kaW5nRW5hYmxlZChlbmFibGVkKSB7XG4gICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmRlZmluZXMuQUxQSEFfQkxFTkRJTkcgPSBcIjFcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRlZmluZXMuQUxQSEFfQkxFTkRJTkc7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIERlZmluZXMgd2hldGhlciBoaWRkZW4gcGFydHMgb2Ygc2VsZWN0ZWQgb2JqZWN0cyBzaG91bGQgYmUgdmlzaWJsZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIGhpZGRlbiBwYXJ0cyBvZiBzZWxlY3RlZCBvYmplY3RzIHNob3VsZCBiZSB2aXNpYmxlLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRYUmF5RW5hYmxlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRYUmF5RW5hYmxlZChlbmFibGVkKSB7XG4gICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmRlZmluZXMuWF9SQVkgPSBcIjFcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRlZmluZXMuWF9SQVk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFNldHMgYSBwYXR0ZXJuIHRleHR1cmUgdG8gdXNlIGFzIG92ZXJsYXkuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtUZXh0dXJlfSBbdGV4dHVyZT1udWxsXSAtIEEgcGF0dGVybiB0ZXh0dXJlLiBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBwYXR0ZXJuLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRQYXR0ZXJuVGV4dHVyZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRQYXR0ZXJuVGV4dHVyZSgpIHtcbiAgICAgIHZhciB0ZXh0dXJlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBudWxsO1xuXG4gICAgICBpZiAodGV4dHVyZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmRlZmluZXMuVVNFX1BBVFRFUk4gPSBcIjFcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRlZmluZXMuVVNFX1BBVFRFUk47XG4gICAgICB9XG5cbiAgICAgIHRoaXMudW5pZm9ybXMudFBhdHRlcm4udmFsdWUgPSB0ZXh0dXJlO1xuICAgICAgdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoT3V0bGluZUJsZW5kTWF0ZXJpYWwsIF9TaGFkZXJNYXRlcmlhbCk7XG5cbiAgcmV0dXJuIE91dGxpbmVCbGVuZE1hdGVyaWFsO1xufShTaGFkZXJNYXRlcmlhbCk7XG5cbnZhciBmcmFnbWVudCQxMyA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdE1hc2s7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjA7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjE7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjI7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjM7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZlYzIgYzAgPSB0ZXh0dXJlMkQodE1hc2ssIHZVdjApLnJnO1xcclxcblxcdHZlYzIgYzEgPSB0ZXh0dXJlMkQodE1hc2ssIHZVdjEpLnJnO1xcclxcblxcdHZlYzIgYzIgPSB0ZXh0dXJlMkQodE1hc2ssIHZVdjIpLnJnO1xcclxcblxcdHZlYzIgYzMgPSB0ZXh0dXJlMkQodE1hc2ssIHZVdjMpLnJnO1xcclxcblxcclxcblxcdGZsb2F0IGQwID0gKGMwLnggLSBjMS54KSAqIDAuNTtcXHJcXG5cXHRmbG9hdCBkMSA9IChjMi54IC0gYzMueCkgKiAwLjU7XFxyXFxuXFx0ZmxvYXQgZCA9IGxlbmd0aCh2ZWMyKGQwLCBkMSkpO1xcclxcblxcclxcblxcdGZsb2F0IGEwID0gbWluKGMwLnksIGMxLnkpO1xcclxcblxcdGZsb2F0IGExID0gbWluKGMyLnksIGMzLnkpO1xcclxcblxcdGZsb2F0IHZpc2liaWxpdHlGYWN0b3IgPSBtaW4oYTAsIGExKTtcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IucmcgPSAoMS4wIC0gdmlzaWJpbGl0eUZhY3RvciA+IDAuMDAxKSA/IHZlYzIoZCwgMC4wKSA6IHZlYzIoMC4wLCBkKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG52YXIgdmVydGV4JDEzID0gXCJ1bmlmb3JtIHZlYzIgdGV4ZWxTaXplO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXYwO1xcclxcbnZhcnlpbmcgdmVjMiB2VXYxO1xcclxcbnZhcnlpbmcgdmVjMiB2VXYyO1xcclxcbnZhcnlpbmcgdmVjMiB2VXYzO1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYwID0gdmVjMih1di54ICsgdGV4ZWxTaXplLngsIHV2LnkpO1xcclxcblxcdHZVdjEgPSB2ZWMyKHV2LnggLSB0ZXhlbFNpemUueCwgdXYueSk7XFxyXFxuXFx0dlV2MiA9IHZlYzIodXYueCwgdXYueSArIHRleGVsU2l6ZS55KTtcXHJcXG5cXHR2VXYzID0gdmVjMih1di54LCB1di55IC0gdGV4ZWxTaXplLnkpO1xcclxcblxcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xuLyoqXHJcbiAqIEFuIG91dGxpbmUgZWRnZSBkZXRlY3Rpb24gc2hhZGVyIG1hdGVyaWFsLlxyXG4gKi9cblxudmFyIE91dGxpbmVFZGdlc01hdGVyaWFsID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfU2hhZGVyTWF0ZXJpYWwpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBvdXRsaW5lIGVkZ2UgZGV0ZWN0aW9uIG1hdGVyaWFsLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtWZWN0b3IyfSBbdGV4ZWxTaXplXSAtIFRoZSBhYnNvbHV0ZSBzY3JlZW4gdGV4ZWwgc2l6ZS5cclxuICAgKi9cbiAgZnVuY3Rpb24gT3V0bGluZUVkZ2VzTWF0ZXJpYWwoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHRleGVsU2l6ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbmV3IFZlY3RvcjIoKTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIE91dGxpbmVFZGdlc01hdGVyaWFsKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKE91dGxpbmVFZGdlc01hdGVyaWFsKS5jYWxsKHRoaXMsIHtcbiAgICAgIHR5cGU6IFwiT3V0bGluZUVkZ2VzTWF0ZXJpYWxcIixcbiAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgIHRNYXNrOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgdGV4ZWxTaXplOiBuZXcgVW5pZm9ybShuZXcgVmVjdG9yMigpKVxuICAgICAgfSxcbiAgICAgIGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCQxMyxcbiAgICAgIHZlcnRleFNoYWRlcjogdmVydGV4JDEzLFxuICAgICAgZGVwdGhXcml0ZTogZmFsc2UsXG4gICAgICBkZXB0aFRlc3Q6IGZhbHNlXG4gICAgfSkpO1xuXG4gICAgX3RoaXMuc2V0VGV4ZWxTaXplKHRleGVsU2l6ZS54LCB0ZXhlbFNpemUueSk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgdGV4ZWwgc2l6ZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB4IC0gVGhlIHRleGVsIHdpZHRoLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB5IC0gVGhlIHRleGVsIGhlaWdodC5cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKE91dGxpbmVFZGdlc01hdGVyaWFsLCBbe1xuICAgIGtleTogXCJzZXRUZXhlbFNpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0VGV4ZWxTaXplKHgsIHkpIHtcbiAgICAgIHRoaXMudW5pZm9ybXMudGV4ZWxTaXplLnZhbHVlLnNldCh4LCB5KTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhPdXRsaW5lRWRnZXNNYXRlcmlhbCwgX1NoYWRlck1hdGVyaWFsKTtcblxuICByZXR1cm4gT3V0bGluZUVkZ2VzTWF0ZXJpYWw7XG59KFNoYWRlck1hdGVyaWFsKTtcblxudmFyIGZyYWdtZW50JDE0ID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIGZsb2F0IGdyYW51bGFyaXR5O1xcclxcbnVuaWZvcm0gZmxvYXQgZHg7XFxyXFxudW5pZm9ybSBmbG9hdCBkeTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWM0IHRleGVsO1xcclxcblxcclxcblxcdGlmKGdyYW51bGFyaXR5ID4gMC4wKSB7XFxyXFxuXFxyXFxuXFx0XFx0dmVjMiBjb29yZCA9IHZlYzIoXFxyXFxuXFx0XFx0XFx0ZHggKiAoZmxvb3IodlV2LnggLyBkeCkgKyAwLjUpLFxcclxcblxcdFxcdFxcdGR5ICogKGZsb29yKHZVdi55IC8gZHkpICsgMC41KVxcclxcblxcdFxcdCk7XFxyXFxuXFxyXFxuXFx0XFx0dGV4ZWwgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIGNvb3JkKTtcXHJcXG5cXHJcXG5cXHR9IGVsc2Uge1xcclxcblxcclxcblxcdFxcdHRleGVsID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYpO1xcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSB0ZXhlbDtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG52YXIgdmVydGV4JDE0ID0gXCJ2YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbi8qKlxyXG4gKiBBIHBpeGVsYXRpb24gc2hhZGVyIG1hdGVyaWFsLlxyXG4gKlxyXG4gKiBPcmlnaW5hbCBzaGFkZXIgY29kZSBieSBSb2JlcnQgQ2FzYW5vdmE6XHJcbiAqICBodHRwczovL2dpdGh1Yi5jb20vcm9iZXJ0Y2FzYW5vdmEvcGl4ZWxhdGUtc2hhZGVyXHJcbiAqL1xuXG52YXIgUGl4ZWxhdGlvbk1hdGVyaWFsID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfU2hhZGVyTWF0ZXJpYWwpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBwaXhlbGF0aW9uIG1hdGVyaWFsLlxyXG4gICAqL1xuICBmdW5jdGlvbiBQaXhlbGF0aW9uTWF0ZXJpYWwoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUGl4ZWxhdGlvbk1hdGVyaWFsKTtcblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoUGl4ZWxhdGlvbk1hdGVyaWFsKS5jYWxsKHRoaXMsIHtcbiAgICAgIHR5cGU6IFwiUGl4ZWxhdGlvbk1hdGVyaWFsXCIsXG4gICAgICB1bmlmb3Jtczoge1xuICAgICAgICB0RGlmZnVzZTogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIGdyYW51bGFyaXR5OiBuZXcgVW5pZm9ybSgxLjApLFxuICAgICAgICByZXNvbHV0aW9uOiBuZXcgVW5pZm9ybShuZXcgVmVjdG9yMigxLjAsIDEuMCkpLFxuICAgICAgICBkeDogbmV3IFVuaWZvcm0oMS4wKSxcbiAgICAgICAgZHk6IG5ldyBVbmlmb3JtKDEuMClcbiAgICAgIH0sXG4gICAgICBmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQkMTQsXG4gICAgICB2ZXJ0ZXhTaGFkZXI6IHZlcnRleCQxNCxcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgICAgZGVwdGhUZXN0OiBmYWxzZVxuICAgIH0pKTtcbiAgfVxuICAvKipcclxuICAgKiBUaGUgcGl4ZWwgZ3JhbnVsYXJpdHkuXHJcbiAgICpcclxuICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoUGl4ZWxhdGlvbk1hdGVyaWFsLCBbe1xuICAgIGtleTogXCJzZXRSZXNvbHV0aW9uXCIsXG5cbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHJlc29sdXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0UmVzb2x1dGlvbih3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICB0aGlzLnVuaWZvcm1zLnJlc29sdXRpb24udmFsdWUuc2V0KHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5ncmFudWxhcml0eSA9IHRoaXMuZ3JhbnVsYXJpdHk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdyYW51bGFyaXR5XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy51bmlmb3Jtcy5ncmFudWxhcml0eS52YWx1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBBIGhpZ2hlciB2YWx1ZSB5aWVsZHMgY29hcnNlciB2aXN1YWxzLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoeCkge1xuICAgICAgdmFyIHVuaWZvcm1zID0gdGhpcy51bmlmb3JtcztcbiAgICAgIHZhciByZXNvbHV0aW9uID0gdW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZTtcbiAgICAgIHVuaWZvcm1zLmdyYW51bGFyaXR5LnZhbHVlID0geDtcbiAgICAgIHVuaWZvcm1zLmR4LnZhbHVlID0geCAvIHJlc29sdXRpb24ueDtcbiAgICAgIHVuaWZvcm1zLmR5LnZhbHVlID0geCAvIHJlc29sdXRpb24ueTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhQaXhlbGF0aW9uTWF0ZXJpYWwsIF9TaGFkZXJNYXRlcmlhbCk7XG5cbiAgcmV0dXJuIFBpeGVsYXRpb25NYXRlcmlhbDtcbn0oU2hhZGVyTWF0ZXJpYWwpO1xuXG52YXIgZnJhZ21lbnQkMTUgPSBcIiNpbmNsdWRlIDxjb21tb24+XFxyXFxuXFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdERlcHRoO1xcclxcblxcclxcbnVuaWZvcm0gdmVjMiB0ZXhlbFNpemU7XFxyXFxudW5pZm9ybSB2ZWMyIGhhbGZUZXhlbFNpemU7XFxyXFxuXFxyXFxudW5pZm9ybSBmbG9hdCBjYW1lcmFOZWFyO1xcclxcbnVuaWZvcm0gZmxvYXQgY2FtZXJhRmFyO1xcclxcblxcclxcbnVuaWZvcm0gZmxvYXQgZm9jYWxMZW5ndGg7XFxyXFxudW5pZm9ybSBmbG9hdCBmb2NhbFN0b3A7XFxyXFxuXFxyXFxudW5pZm9ybSBmbG9hdCBtYXhCbHVyO1xcclxcbnVuaWZvcm0gZmxvYXQgbHVtaW5hbmNlVGhyZXNob2xkO1xcclxcbnVuaWZvcm0gZmxvYXQgbHVtaW5hbmNlR2FpbjtcXHJcXG51bmlmb3JtIGZsb2F0IGJpYXM7XFxyXFxudW5pZm9ybSBmbG9hdCBmcmluZ2U7XFxyXFxudW5pZm9ybSBmbG9hdCBkaXRoZXJTdHJlbmd0aDtcXHJcXG5cXHJcXG4jaWZkZWYgU0hBREVSX0ZPQ1VTXFxyXFxuXFxyXFxuXFx0dW5pZm9ybSB2ZWMyIGZvY3VzQ29vcmRzO1xcclxcblxcclxcbiNlbHNlXFxyXFxuXFxyXFxuXFx0dW5pZm9ybSBmbG9hdCBmb2NhbERlcHRoO1xcclxcblxcclxcbiNlbmRpZlxcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxuI2lmbmRlZiBVU0VfTE9HREVQVEhCVUZcXHJcXG5cXHJcXG5cXHQjaW5jbHVkZSA8cGFja2luZz5cXHJcXG5cXHJcXG5cXHRmbG9hdCByZWFkRGVwdGgoc2FtcGxlcjJEIGRlcHRoU2FtcGxlciwgdmVjMiBjb29yZCkge1xcclxcblxcclxcblxcdFxcdGZsb2F0IGZyYWdDb29yZFogPSB0ZXh0dXJlMkQoZGVwdGhTYW1wbGVyLCBjb29yZCkueDtcXHJcXG5cXHRcXHRmbG9hdCB2aWV3WiA9IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKGZyYWdDb29yZFosIGNhbWVyYU5lYXIsIGNhbWVyYUZhcik7XFxyXFxuXFxyXFxuXFx0XFx0cmV0dXJuIHZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aCh2aWV3WiwgY2FtZXJhTmVhciwgY2FtZXJhRmFyKTtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxuI2lmZGVmIFBFTlRBR09OXFxyXFxuXFxyXFxuXFx0ZmxvYXQgcGVudGEodmVjMiBjb29yZHMpIHtcXHJcXG5cXHJcXG5cXHRcXHRjb25zdCB2ZWM0IEhTMCA9IHZlYzQoIDEuMCwgICAgICAgICAgMC4wLCAgICAgICAgIDAuMCwgMS4wKTtcXHJcXG5cXHRcXHRjb25zdCB2ZWM0IEhTMSA9IHZlYzQoIDAuMzA5MDE2OTk0LCAgMC45NTEwNTY1MTYsIDAuMCwgMS4wKTtcXHJcXG5cXHRcXHRjb25zdCB2ZWM0IEhTMiA9IHZlYzQoLTAuODA5MDE2OTk0LCAgMC41ODc3ODUyNTIsIDAuMCwgMS4wKTtcXHJcXG5cXHRcXHRjb25zdCB2ZWM0IEhTMyA9IHZlYzQoLTAuODA5MDE2OTk0LCAtMC41ODc3ODUyNTIsIDAuMCwgMS4wKTtcXHJcXG5cXHRcXHRjb25zdCB2ZWM0IEhTNCA9IHZlYzQoIDAuMzA5MDE2OTk0LCAtMC45NTEwNTY1MTYsIDAuMCwgMS4wKTtcXHJcXG5cXHRcXHRjb25zdCB2ZWM0IEhTNSA9IHZlYzQoIDAuMCwgICAgICAgICAgMC4wLCAgICAgICAgIDEuMCwgMS4wKTtcXHJcXG5cXHJcXG5cXHRcXHRjb25zdCB2ZWM0IE9ORSA9IHZlYzQoMS4wKTtcXHJcXG5cXHJcXG5cXHRcXHRjb25zdCBmbG9hdCBQX0ZFQVRIRVIgPSAwLjQ7XFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgTl9GRUFUSEVSID0gLVBfRkVBVEhFUjtcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBpbk9yT3V0ID0gLTQuMDtcXHJcXG5cXHJcXG5cXHRcXHR2ZWM0IFAgPSB2ZWM0KGNvb3JkcywgdmVjMihSSU5HU19GTE9BVCAtIDEuMykpO1xcclxcblxcclxcblxcdFxcdHZlYzQgZGlzdCA9IHZlYzQoXFxyXFxuXFx0XFx0XFx0ZG90KFAsIEhTMCksXFxyXFxuXFx0XFx0XFx0ZG90KFAsIEhTMSksXFxyXFxuXFx0XFx0XFx0ZG90KFAsIEhTMiksXFxyXFxuXFx0XFx0XFx0ZG90KFAsIEhTMylcXHJcXG5cXHRcXHQpO1xcclxcblxcclxcblxcdFxcdGRpc3QgPSBzbW9vdGhzdGVwKE5fRkVBVEhFUiwgUF9GRUFUSEVSLCBkaXN0KTtcXHJcXG5cXHJcXG5cXHRcXHRpbk9yT3V0ICs9IGRvdChkaXN0LCBPTkUpO1xcclxcblxcclxcblxcdFxcdGRpc3QueCA9IGRvdChQLCBIUzQpO1xcclxcblxcdFxcdGRpc3QueSA9IEhTNS53IC0gYWJzKFAueik7XFxyXFxuXFxyXFxuXFx0XFx0ZGlzdCA9IHNtb290aHN0ZXAoTl9GRUFUSEVSLCBQX0ZFQVRIRVIsIGRpc3QpO1xcclxcblxcdFxcdGluT3JPdXQgKz0gZGlzdC54O1xcclxcblxcclxcblxcdFxcdHJldHVybiBjbGFtcChpbk9yT3V0LCAwLjAsIDEuMCk7XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcbiNlbmRpZlxcclxcblxcclxcbiNpZmRlZiBTSE9XX0ZPQ1VTXFxyXFxuXFxyXFxuXFx0dmVjMyBkZWJ1Z0ZvY3VzKHZlYzMgYywgZmxvYXQgYmx1ciwgZmxvYXQgZGVwdGgpIHtcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBlZGdlID0gMC4wMDIgKiBkZXB0aDtcXHJcXG5cXHRcXHRmbG9hdCBtID0gY2xhbXAoc21vb3Roc3RlcCgwLjAsIGVkZ2UsIGJsdXIpLCAwLjAsIDEuMCk7XFxyXFxuXFx0XFx0ZmxvYXQgZSA9IGNsYW1wKHNtb290aHN0ZXAoMS4wIC0gZWRnZSwgMS4wLCBibHVyKSwgMC4wLCAxLjApO1xcclxcblxcclxcblxcdFxcdGMgPSBtaXgoYywgdmVjMygxLjAsIDAuNSwgMC4wKSwgKDEuMCAtIG0pICogMC42KTtcXHJcXG5cXHRcXHRjID0gbWl4KGMsIHZlYzMoMC4wLCAwLjUsIDEuMCksICgoMS4wIC0gZSkgLSAoMS4wIC0gbSkpICogMC4yKTtcXHJcXG5cXHJcXG5cXHRcXHRyZXR1cm4gYztcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxuI2lmZGVmIFZJR05FVFRFXFxyXFxuXFxyXFxuXFx0ZmxvYXQgdmlnbmV0dGUoKSB7XFxyXFxuXFxyXFxuXFx0XFx0Y29uc3QgdmVjMiBDRU5URVIgPSB2ZWMyKDAuNSk7XFxyXFxuXFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgVklHTkVUVEVfT1VUID0gMS4zO1xcclxcblxcdFxcdGNvbnN0IGZsb2F0IFZJR05FVFRFX0lOID0gMC4wO1xcclxcblxcdFxcdGNvbnN0IGZsb2F0IFZJR05FVFRFX0ZBREUgPSAyMi4wOyBcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBkID0gZGlzdGFuY2UodlV2LCBDRU5URVIpO1xcclxcblxcdFxcdGQgPSBzbW9vdGhzdGVwKFZJR05FVFRFX09VVCArIChmb2NhbFN0b3AgLyBWSUdORVRURV9GQURFKSwgVklHTkVUVEVfSU4gKyAoZm9jYWxTdG9wIC8gVklHTkVUVEVfRkFERSksIGQpO1xcclxcblxcclxcblxcdFxcdHJldHVybiBjbGFtcChkLCAwLjAsIDEuMCk7XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcbiNlbmRpZlxcclxcblxcclxcbnZlYzIgcmFuZDIodmVjMiBjb29yZCkge1xcclxcblxcclxcblxcdHZlYzIgbm9pc2U7XFxyXFxuXFxyXFxuXFx0I2lmZGVmIE5PSVNFXFxyXFxuXFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgYSA9IDEyLjk4OTg7XFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgYiA9IDc4LjIzMztcXHJcXG5cXHRcXHRjb25zdCBmbG9hdCBjID0gNDM3NTguNTQ1MztcXHJcXG5cXHJcXG5cXHRcXHRub2lzZS54ID0gY2xhbXAoZnJhY3Qoc2luKG1vZChkb3QoY29vcmQsIHZlYzIoYSwgYikpLCAzLjE0KSkgKiBjKSwgMC4wLCAxLjApICogMi4wIC0gMS4wO1xcclxcblxcdFxcdG5vaXNlLnkgPSBjbGFtcChmcmFjdChzaW4obW9kKGRvdChjb29yZCwgdmVjMihhLCBiKSAqIDIuMCksIDMuMTQpKSAqIGMpLCAwLjAsIDEuMCkgKiAyLjAgLSAxLjA7XFxyXFxuXFxyXFxuXFx0I2Vsc2VcXHJcXG5cXHJcXG5cXHRcXHRub2lzZS54ID0gKChmcmFjdCgxLjAgLSBjb29yZC5zICogaGFsZlRleGVsU2l6ZS54KSAqIDAuMjUpICsgKGZyYWN0KGNvb3JkLnQgKiBoYWxmVGV4ZWxTaXplLnkpICogMC43NSkpICogMi4wIC0gMS4wO1xcclxcblxcdFxcdG5vaXNlLnkgPSAoKGZyYWN0KDEuMCAtIGNvb3JkLnMgKiBoYWxmVGV4ZWxTaXplLngpICogMC43NSkgKyAoZnJhY3QoY29vcmQudCAqIGhhbGZUZXhlbFNpemUueSkgKiAwLjI1KSkgKiAyLjAgLSAxLjA7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0cmV0dXJuIG5vaXNlO1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG52ZWMzIHByb2Nlc3NUZXhlbCh2ZWMyIGNvb3JkcywgZmxvYXQgYmx1cikge1xcclxcblxcclxcblxcdHZlYzMgYztcXHJcXG5cXHRjLnIgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIGNvb3JkcyArIHZlYzIoMC4wLCAxLjApICogdGV4ZWxTaXplICogZnJpbmdlICogYmx1cikucjtcXHJcXG5cXHRjLmcgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIGNvb3JkcyArIHZlYzIoLTAuODY2LCAtMC41KSAqIHRleGVsU2l6ZSAqIGZyaW5nZSAqIGJsdXIpLmc7XFxyXFxuXFx0Yy5iID0gdGV4dHVyZTJEKHREaWZmdXNlLCBjb29yZHMgKyB2ZWMyKDAuODY2LCAtMC41KSAqIHRleGVsU2l6ZSAqIGZyaW5nZSAqIGJsdXIpLmI7XFxyXFxuXFxyXFxuXFx0Ly8gQ2FsY3VsYXRlIHRoZSBsdW1pbmFuY2Ugb2YgdGhlIGNvbnN0cnVjdGVkIGNvbG91ci5cXHJcXG5cXHRmbG9hdCBsdW1pbmFuY2UgPSBsaW5lYXJUb1JlbGF0aXZlTHVtaW5hbmNlKGMpO1xcclxcblxcdGZsb2F0IHRocmVzaG9sZCA9IG1heCgobHVtaW5hbmNlIC0gbHVtaW5hbmNlVGhyZXNob2xkKSAqIGx1bWluYW5jZUdhaW4sIDAuMCk7XFxyXFxuXFxyXFxuXFx0cmV0dXJuIGMgKyBtaXgodmVjMygwLjApLCBjLCB0aHJlc2hvbGQgKiBibHVyKTtcXHJcXG5cXHJcXG59XFxyXFxuXFxyXFxuZmxvYXQgbGluZWFyaXplKGZsb2F0IGRlcHRoKSB7XFxyXFxuXFxyXFxuXFx0cmV0dXJuIC1jYW1lcmFGYXIgKiBjYW1lcmFOZWFyIC8gKGRlcHRoICogKGNhbWVyYUZhciAtIGNhbWVyYU5lYXIpIC0gY2FtZXJhRmFyKTtcXHJcXG5cXHJcXG59XFxyXFxuXFxyXFxuZmxvYXQgZ2F0aGVyKGZsb2F0IGksIGZsb2F0IGosIGZsb2F0IHJpbmdTYW1wbGVzLCBpbm91dCB2ZWMzIGNvbG9yLCBmbG9hdCB3LCBmbG9hdCBoLCBmbG9hdCBibHVyKSB7XFxyXFxuXFxyXFxuXFx0Y29uc3QgZmxvYXQgVFdPX1BJID0gNi4yODMxODUzMTtcXHJcXG5cXHJcXG5cXHRmbG9hdCBzdGVwID0gVFdPX1BJIC8gcmluZ1NhbXBsZXM7XFxyXFxuXFx0ZmxvYXQgcHcgPSBjb3MoaiAqIHN0ZXApICogaTtcXHJcXG5cXHRmbG9hdCBwaCA9IHNpbihqICogc3RlcCkgKiBpO1xcclxcblxcclxcblxcdCNpZmRlZiBQRU5UQUdPTlxcclxcblxcclxcblxcdFxcdGZsb2F0IHAgPSBwZW50YSh2ZWMyKHB3LCBwaCkpO1xcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgcCA9IDEuMDtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRjb2xvciArPSBwcm9jZXNzVGV4ZWwodlV2ICsgdmVjMihwdyAqIHcsIHBoICogaCksIGJsdXIpICogbWl4KDEuMCwgaSAvIFJJTkdTX0ZMT0FULCBiaWFzKSAqIHA7XFxyXFxuXFxyXFxuXFx0cmV0dXJuIG1peCgxLjAsIGkgLyBSSU5HU19GTE9BVCwgYmlhcykgKiBwO1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0I2lmZGVmIFVTRV9MT0dERVBUSEJVRlxcclxcblxcclxcblxcdFxcdGZsb2F0IGRlcHRoID0gbGluZWFyaXplKHRleHR1cmUyRCh0RGVwdGgsIHZVdikueCk7XFxyXFxuXFxyXFxuXFx0I2Vsc2VcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBkZXB0aCA9IGxpbmVhcml6ZShyZWFkRGVwdGgodERlcHRoLCB2VXYpKTtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjaWZkZWYgU0hBREVSX0ZPQ1VTXFxyXFxuXFxyXFxuXFx0XFx0I2lmZGVmIFVTRV9MT0dERVBUSEJVRlxcclxcblxcclxcblxcdFxcdFxcdGZsb2F0IGZEZXB0aCA9IGxpbmVhcml6ZSh0ZXh0dXJlMkQodERlcHRoLCBmb2N1c0Nvb3JkcykueCk7XFxyXFxuXFxyXFxuXFx0XFx0I2Vsc2VcXHJcXG5cXHJcXG5cXHRcXHRcXHRmbG9hdCBmRGVwdGggPSBsaW5lYXJpemUocmVhZERlcHRoKHREZXB0aCwgZm9jdXNDb29yZHMpKTtcXHJcXG5cXHJcXG5cXHRcXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjZWxzZVxcclxcblxcclxcblxcdFxcdGZsb2F0IGZEZXB0aCA9IGZvY2FsRGVwdGg7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0I2lmZGVmIE1BTlVBTF9ET0ZcXHJcXG5cXHJcXG5cXHRcXHRjb25zdCBmbG9hdCBuRG9GU3RhcnQgPSAxLjA7IFxcclxcblxcdFxcdGNvbnN0IGZsb2F0IG5Eb0ZEaXN0ID0gMi4wO1xcclxcblxcdFxcdGNvbnN0IGZsb2F0IGZEb0ZTdGFydCA9IDEuMDtcXHJcXG5cXHRcXHRjb25zdCBmbG9hdCBmRG9GRGlzdCA9IDMuMDtcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBmb2NhbFBsYW5lID0gZGVwdGggLSBmRGVwdGg7XFxyXFxuXFx0XFx0ZmxvYXQgZmFyRG9GID0gKGZvY2FsUGxhbmUgLSBmRG9GU3RhcnQpIC8gZkRvRkRpc3Q7XFxyXFxuXFx0XFx0ZmxvYXQgbmVhckRvRiA9ICgtZm9jYWxQbGFuZSAtIG5Eb0ZTdGFydCkgLyBuRG9GRGlzdDtcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBibHVyID0gKGZvY2FsUGxhbmUgPiAwLjApID8gZmFyRG9GIDogbmVhckRvRjtcXHJcXG5cXHJcXG5cXHQjZWxzZVxcclxcblxcclxcblxcdFxcdGNvbnN0IGZsb2F0IENJUkNMRV9PRl9DT05GVVNJT04gPSAwLjAzOyAvLyAzNW1tIGZpbG0gPSAwLjAzbW0gQ29DLlxcclxcblxcclxcblxcdFxcdGZsb2F0IGZvY2FsUGxhbmVNTSA9IGZEZXB0aCAqIDEwMDAuMDtcXHJcXG5cXHRcXHRmbG9hdCBkZXB0aE1NID0gZGVwdGggKiAxMDAwLjA7XFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgZm9jYWxQbGFuZSA9IChkZXB0aE1NICogZm9jYWxMZW5ndGgpIC8gKGRlcHRoTU0gLSBmb2NhbExlbmd0aCk7XFxyXFxuXFx0XFx0ZmxvYXQgZmFyRG9GID0gKGZvY2FsUGxhbmVNTSAqIGZvY2FsTGVuZ3RoKSAvIChmb2NhbFBsYW5lTU0gLSBmb2NhbExlbmd0aCk7XFxyXFxuXFx0XFx0ZmxvYXQgbmVhckRvRiA9IChmb2NhbFBsYW5lTU0gLSBmb2NhbExlbmd0aCkgLyAoZm9jYWxQbGFuZU1NICogZm9jYWxTdG9wICogQ0lSQ0xFX09GX0NPTkZVU0lPTik7XFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgYmx1ciA9IGFicyhmb2NhbFBsYW5lIC0gZmFyRG9GKSAqIG5lYXJEb0Y7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0Ymx1ciA9IGNsYW1wKGJsdXIsIDAuMCwgMS4wKTtcXHJcXG5cXHJcXG5cXHQvLyBEaXRoZXJpbmcuXFxyXFxuXFx0dmVjMiBub2lzZSA9IHJhbmQyKHZVdikgKiBkaXRoZXJTdHJlbmd0aCAqIGJsdXI7XFxyXFxuXFxyXFxuXFx0ZmxvYXQgYmx1ckZhY3RvclggPSB0ZXhlbFNpemUueCAqIGJsdXIgKiBtYXhCbHVyICsgbm9pc2UueDtcXHJcXG5cXHRmbG9hdCBibHVyRmFjdG9yWSA9IHRleGVsU2l6ZS55ICogYmx1ciAqIG1heEJsdXIgKyBub2lzZS55O1xcclxcblxcclxcblxcdGNvbnN0IGludCBNQVhfUklOR19TQU1QTEVTID0gUklOR1NfSU5UICogU0FNUExFU19JTlQ7XFxyXFxuXFxyXFxuXFx0Ly8gQ2FsY3VsYXRpb24gb2YgZmluYWwgY29sb3IuXFxyXFxuXFx0dmVjNCBjb2xvcjtcXHJcXG5cXHJcXG5cXHRpZihibHVyIDwgMC4wNSkge1xcclxcblxcclxcblxcdFxcdGNvbG9yID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYpO1xcclxcblxcclxcblxcdH0gZWxzZSB7XFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdik7XFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgcyA9IDEuMDtcXHJcXG5cXHRcXHRpbnQgcmluZ1NhbXBsZXM7XFxyXFxuXFxyXFxuXFx0XFx0Zm9yKGludCBpID0gMTsgaSA8PSBSSU5HU19JTlQ7ICsraSkge1xcclxcblxcclxcblxcdFxcdFxcdHJpbmdTYW1wbGVzID0gaSAqIFNBTVBMRVNfSU5UO1xcclxcblxcclxcblxcdFxcdFxcdC8vIENvbnN0YW50IGxvb3AuXFxyXFxuXFx0XFx0XFx0Zm9yKGludCBqID0gMDsgaiA8IE1BWF9SSU5HX1NBTVBMRVM7ICsraikge1xcclxcblxcclxcblxcdFxcdFxcdFxcdC8vIEJyZWFrIGVhcmxpZXIuXFxyXFxuXFx0XFx0XFx0XFx0aWYoaiA+PSByaW5nU2FtcGxlcykgeyBicmVhazsgfVxcclxcblxcclxcblxcdFxcdFxcdFxcdHMgKz0gZ2F0aGVyKGZsb2F0KGkpLCBmbG9hdChqKSwgZmxvYXQocmluZ1NhbXBsZXMpLCBjb2xvci5yZ2IsIGJsdXJGYWN0b3JYLCBibHVyRmFjdG9yWSwgYmx1cik7XFxyXFxuXFxyXFxuXFx0XFx0XFx0fVxcclxcblxcclxcblxcdFxcdH1cXHJcXG5cXHJcXG5cXHRcXHRjb2xvci5yZ2IgLz0gczsgLy8gRGl2aWRlIGJ5IHNhbXBsZSBjb3VudC5cXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0I2lmZGVmIFNIT1dfRk9DVVNcXHJcXG5cXHJcXG5cXHRcXHRjb2xvci5yZ2IgPSBkZWJ1Z0ZvY3VzKGNvbG9yLnJnYiwgYmx1ciwgZGVwdGgpO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdCNpZmRlZiBWSUdORVRURVxcclxcblxcclxcblxcdFxcdGNvbG9yLnJnYiAqPSB2aWduZXR0ZSgpO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IGNvbG9yO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbnZhciB2ZXJ0ZXgkMTUgPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xuLyoqXHJcbiAqIERlcHRoIG9mIEZpZWxkIHNoYWRlciB2Mi40LlxyXG4gKlxyXG4gKiBPcmlnaW5hbCBzaGFkZXIgY29kZSBieSBNYXJ0aW5zIFVwaXRpczpcclxuICogIGh0dHA6Ly9ibGVuZGVyYXJ0aXN0cy5vcmcvZm9ydW0vc2hvd3RocmVhZC5waHA/MjM3NDg4LUdMU0wtZGVwdGgtb2YtZmllbGQtd2l0aC1ib2tlaC12Mi00LSh1cGRhdGUpXHJcbiAqL1xuXG52YXIgUmVhbGlzdGljQm9rZWhNYXRlcmlhbCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1NoYWRlck1hdGVyaWFsKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgYm9rZWgyIG1hdGVyaWFsLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtQZXJzcGVjdGl2ZUNhbWVyYX0gW2NhbWVyYV0gLSBUaGUgbWFpbiBjYW1lcmEuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIEFkZGl0aW9uYWwgb3B0aW9ucy5cclxuICAgKiBAcGFyYW0ge1ZlY3RvcjJ9IFtvcHRpb25zLnRleGVsU2l6ZV0gLSBUaGUgYWJzb2x1dGUgc2NyZWVuIHRleGVsIHNpemUuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yaW5ncz0zXSAtIFRoZSBudW1iZXIgb2YgYmx1cnJpbmcgaXRlcmF0aW9ucy5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNhbXBsZXM9Ml0gLSBUaGUgYW1vdW50IG9mIHNhbXBsZXMgdGFrZW4gcGVyIHJpbmcuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zaG93Rm9jdXM9ZmFsc2VdIC0gV2hldGhlciB0aGUgZm9jdXMgcG9pbnQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubWFudWFsRG9GPWZhbHNlXSAtIEVuYWJsZXMgbWFudWFsIGRlcHRoIG9mIGZpZWxkIGJsdXIuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy52aWduZXR0ZT1mYWxzZV0gLSBFbmFibGVzIGEgdmlnbmV0dGUgZWZmZWN0LlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucGVudGFnb249ZmFsc2VdIC0gRW5hYmxlIHRvIHVzZSBhIHBlbnRhZ29uYWwgc2hhcGUgdG8gc2NhbGUgZ2F0aGVyZWQgdGV4ZWxzLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2hhZGVyRm9jdXM9dHJ1ZV0gLSBEaXNhYmxlIGlmIHlvdSBjb21wdXRlIHlvdXIgb3duIGZvY2FsRGVwdGggKGluIG1ldHJlcyEpLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubm9pc2U9dHJ1ZV0gLSBEaXNhYmxlIGlmIHlvdSBkb24ndCB3YW50IG5vaXNlIHBhdHRlcm5zIGZvciBkaXRoZXJpbmcuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLm1heEJsdXI9MS4wXSAtIFRoZSBtYXhpbXVtIGJsdXIgc3RyZW5ndGguXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmx1bWluYW5jZVRocmVzaG9sZD0wLjVdIC0gQSBsdW1pbmFuY2UgdGhyZXNob2xkLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5sdW1pbmFuY2VHYWluPTIuMF0gLSBBIGx1bWluYW5jZSBnYWluIGZhY3Rvci5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuYmlhcz0wLjVdIC0gQSBibHVyIGJpYXMuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmZyaW5nZT0wLjddIC0gQSBibHVyIG9mZnNldC5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZGl0aGVyU3RyZW5ndGg9MC4wMDAxXSAtIFRoZSBkaXRoZXIgc3RyZW5ndGguXHJcbiAgICovXG4gIGZ1bmN0aW9uIFJlYWxpc3RpY0Jva2VoTWF0ZXJpYWwoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIGNhbWVyYSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbnVsbDtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBSZWFsaXN0aWNCb2tlaE1hdGVyaWFsKTtcblxuICAgIHZhciBzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgdGV4ZWxTaXplOiBudWxsLFxuICAgICAgcmluZ3M6IDMsXG4gICAgICBzYW1wbGVzOiAyLFxuICAgICAgc2hvd0ZvY3VzOiBmYWxzZSxcbiAgICAgIG1hbnVhbERvRjogZmFsc2UsXG4gICAgICB2aWduZXR0ZTogZmFsc2UsXG4gICAgICBwZW50YWdvbjogZmFsc2UsXG4gICAgICBzaGFkZXJGb2N1czogdHJ1ZSxcbiAgICAgIG5vaXNlOiB0cnVlLFxuICAgICAgbWF4Qmx1cjogMS4wLFxuICAgICAgbHVtaW5hbmNlVGhyZXNob2xkOiAwLjUsXG4gICAgICBsdW1pbmFuY2VHYWluOiAyLjAsXG4gICAgICBiaWFzOiAwLjUsXG4gICAgICBmcmluZ2U6IDAuNyxcbiAgICAgIGRpdGhlclN0cmVuZ3RoOiAwLjAwMDFcbiAgICB9LCBvcHRpb25zKTtcbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihSZWFsaXN0aWNCb2tlaE1hdGVyaWFsKS5jYWxsKHRoaXMsIHtcbiAgICAgIHR5cGU6IFwiUmVhbGlzdGljQm9rZWhNYXRlcmlhbFwiLFxuICAgICAgZGVmaW5lczoge1xuICAgICAgICBSSU5HU19JTlQ6IHNldHRpbmdzLnJpbmdzLnRvRml4ZWQoMCksXG4gICAgICAgIFJJTkdTX0ZMT0FUOiBzZXR0aW5ncy5yaW5ncy50b0ZpeGVkKDEpLFxuICAgICAgICBTQU1QTEVTX0lOVDogc2V0dGluZ3Muc2FtcGxlcy50b0ZpeGVkKDApLFxuICAgICAgICBTQU1QTEVTX0ZMT0FUOiBzZXR0aW5ncy5zYW1wbGVzLnRvRml4ZWQoMSlcbiAgICAgIH0sXG4gICAgICB1bmlmb3Jtczoge1xuICAgICAgICB0RGlmZnVzZTogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIHREZXB0aDogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIHRleGVsU2l6ZTogbmV3IFVuaWZvcm0obmV3IFZlY3RvcjIoKSksXG4gICAgICAgIGhhbGZUZXhlbFNpemU6IG5ldyBVbmlmb3JtKG5ldyBWZWN0b3IyKCkpLFxuICAgICAgICBjYW1lcmFOZWFyOiBuZXcgVW5pZm9ybSgwLjEpLFxuICAgICAgICBjYW1lcmFGYXI6IG5ldyBVbmlmb3JtKDIwMDApLFxuICAgICAgICBmb2NhbExlbmd0aDogbmV3IFVuaWZvcm0oMjQuMCksXG4gICAgICAgIGZvY2FsU3RvcDogbmV3IFVuaWZvcm0oMC45KSxcbiAgICAgICAgbWF4Qmx1cjogbmV3IFVuaWZvcm0oc2V0dGluZ3MubWF4Qmx1ciksXG4gICAgICAgIGx1bWluYW5jZVRocmVzaG9sZDogbmV3IFVuaWZvcm0oc2V0dGluZ3MubHVtaW5hbmNlVGhyZXNob2xkKSxcbiAgICAgICAgbHVtaW5hbmNlR2FpbjogbmV3IFVuaWZvcm0oc2V0dGluZ3MubHVtaW5hbmNlR2FpbiksXG4gICAgICAgIGJpYXM6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmJpYXMpLFxuICAgICAgICBmcmluZ2U6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmZyaW5nZSksXG4gICAgICAgIGRpdGhlclN0cmVuZ3RoOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5kaXRoZXJTdHJlbmd0aCksXG4gICAgICAgIGZvY3VzQ29vcmRzOiBuZXcgVW5pZm9ybShuZXcgVmVjdG9yMigwLjUsIDAuNSkpLFxuICAgICAgICBmb2NhbERlcHRoOiBuZXcgVW5pZm9ybSgxLjApXG4gICAgICB9LFxuICAgICAgZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50JDE1LFxuICAgICAgdmVydGV4U2hhZGVyOiB2ZXJ0ZXgkMTUsXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcbiAgICAgIGRlcHRoVGVzdDogZmFsc2VcbiAgICB9KSk7XG5cbiAgICBfdGhpcy5zZXRTaG93Rm9jdXNFbmFibGVkKHNldHRpbmdzLnNob3dGb2N1cyk7XG5cbiAgICBfdGhpcy5zZXRNYW51YWxEZXB0aE9mRmllbGRFbmFibGVkKHNldHRpbmdzLm1hbnVhbERvRik7XG5cbiAgICBfdGhpcy5zZXRWaWduZXR0ZUVuYWJsZWQoc2V0dGluZ3MudmlnbmV0dGUpO1xuXG4gICAgX3RoaXMuc2V0UGVudGFnb25FbmFibGVkKHNldHRpbmdzLnBlbnRhZ29uKTtcblxuICAgIF90aGlzLnNldFNoYWRlckZvY3VzRW5hYmxlZChzZXR0aW5ncy5zaGFkZXJGb2N1cyk7XG5cbiAgICBfdGhpcy5zZXROb2lzZUVuYWJsZWQoc2V0dGluZ3Mubm9pc2UpO1xuXG4gICAgaWYgKHNldHRpbmdzLnRleGVsU2l6ZSAhPT0gbnVsbCkge1xuICAgICAgX3RoaXMuc2V0VGV4ZWxTaXplKHNldHRpbmdzLnRleGVsU2l6ZS54LCBzZXR0aW5ncy50ZXhlbFNpemUueSk7XG4gICAgfVxuXG4gICAgX3RoaXMuYWRvcHRDYW1lcmFTZXR0aW5ncyhjYW1lcmEpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIERlZmluZXMgd2hldGhlciB0aGUgZm9jdXMgc2hvdWxkIGJlIHNob3duLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gVHJ1ZSBpZiB0aGUgZm9jdXMgc2hvdWxkIGJlIHNob3duLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhSZWFsaXN0aWNCb2tlaE1hdGVyaWFsLCBbe1xuICAgIGtleTogXCJzZXRTaG93Rm9jdXNFbmFibGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNob3dGb2N1c0VuYWJsZWQoZW5hYmxlZCkge1xuICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlNIT1dfRk9DVVMgPSBcIjFcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRlZmluZXMuU0hPV19GT0NVUztcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lcyB3aGV0aGVyIG1hbnVhbCBEZXB0aCBvZiBGaWVsZCBzaG91bGQgYmUgZW5hYmxlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIG1hbnVhbCBEb0Ygc2hvdWxkIGJlIGVuYWJsZWQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldE1hbnVhbERlcHRoT2ZGaWVsZEVuYWJsZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0TWFudWFsRGVwdGhPZkZpZWxkRW5hYmxlZChlbmFibGVkKSB7XG4gICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmRlZmluZXMuTUFOVUFMX0RPRiA9IFwiMVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGVmaW5lcy5NQU5VQUxfRE9GO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBEZWZpbmVzIHdoZXRoZXIgdGhlIFZpZ25ldHRlIGVmZmVjdCBzaG91bGQgYmUgZW5hYmxlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBWaWduZXR0ZSBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFZpZ25ldHRlRW5hYmxlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRWaWduZXR0ZUVuYWJsZWQoZW5hYmxlZCkge1xuICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlZJR05FVFRFID0gXCIxXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdGhpcy5kZWZpbmVzLlZJR05FVFRFO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBEZWZpbmVzIHdoZXRoZXIgdGhlIHBlbnRhZ29uYWwgYmx1ciBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0aGUgcGVudGFnb25hbCBibHVyIGVmZmVjdCBzaG91bGQgYmUgZW5hYmxlZC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0UGVudGFnb25FbmFibGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFBlbnRhZ29uRW5hYmxlZChlbmFibGVkKSB7XG4gICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmRlZmluZXMuUEVOVEFHT04gPSBcIjFcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRlZmluZXMuUEVOVEFHT047XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGF1dG9tYXRpYyBzaGFkZXIgZm9jdXMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0aGUgc2hhZGVyIGZvY3VzIHNob3VsZCBiZSBlbmFibGVkLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRTaGFkZXJGb2N1c0VuYWJsZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2hhZGVyRm9jdXNFbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5TSEFERVJfRk9DVVMgPSBcIjFcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRlZmluZXMuU0hBREVSX0ZPQ1VTO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBEZWZpbmVzIHdoZXRoZXIgdGhlIGRpdGhlcmluZyBzaG91bGQgY29tcHV0ZSBub2lzZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIG5vaXNlLWJhc2VkIGRpdGhlcmluZyBzaG91bGQgYmUgZW5hYmxlZC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Tm9pc2VFbmFibGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldE5vaXNlRW5hYmxlZChlbmFibGVkKSB7XG4gICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmRlZmluZXMuTk9JU0UgPSBcIjFcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRlZmluZXMuTk9JU0U7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHRleGVsIHNpemUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHggLSBUaGUgdGV4ZWwgd2lkdGguXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0geSAtIFRoZSB0ZXhlbCBoZWlnaHQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFRleGVsU2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRUZXhlbFNpemUoeCwgeSkge1xuICAgICAgdGhpcy51bmlmb3Jtcy50ZXhlbFNpemUudmFsdWUuc2V0KHgsIHkpO1xuICAgICAgdGhpcy51bmlmb3Jtcy5oYWxmVGV4ZWxTaXplLnZhbHVlLnNldCh4LCB5KS5tdWx0aXBseVNjYWxhcigwLjUpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEFkb3B0cyB0aGUgbmVhciBhbmQgZmFyIHBsYW5lIGFuZCB0aGUgZm9jYWwgbGVuZ3RoIG9mIHRoZSBnaXZlbiBjYW1lcmEuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQZXJzcGVjdGl2ZUNhbWVyYX0gY2FtZXJhIC0gVGhlIG1haW4gY2FtZXJhLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJhZG9wdENhbWVyYVNldHRpbmdzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkb3B0Q2FtZXJhU2V0dGluZ3MoY2FtZXJhKSB7XG4gICAgICBpZiAoY2FtZXJhICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMudW5pZm9ybXMuY2FtZXJhTmVhci52YWx1ZSA9IGNhbWVyYS5uZWFyO1xuICAgICAgICB0aGlzLnVuaWZvcm1zLmNhbWVyYUZhci52YWx1ZSA9IGNhbWVyYS5mYXI7XG4gICAgICAgIHRoaXMudW5pZm9ybXMuZm9jYWxMZW5ndGgudmFsdWUgPSBjYW1lcmEuZ2V0Rm9jYWxMZW5ndGgoKTsgLy8gdW5pdDogbW0uXG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoUmVhbGlzdGljQm9rZWhNYXRlcmlhbCwgX1NoYWRlck1hdGVyaWFsKTtcblxuICByZXR1cm4gUmVhbGlzdGljQm9rZWhNYXRlcmlhbDtcbn0oU2hhZGVyTWF0ZXJpYWwpO1xuXG52YXIgZnJhZ21lbnQkMTYgPSBcIiNpbmNsdWRlIDxjb21tb24+XFxyXFxuXFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSB2ZWMyIGNlbnRlcjtcXHJcXG51bmlmb3JtIGZsb2F0IGFzcGVjdDtcXHJcXG51bmlmb3JtIGZsb2F0IHdhdmVTaXplO1xcclxcbnVuaWZvcm0gZmxvYXQgcmFkaXVzO1xcclxcbnVuaWZvcm0gZmxvYXQgbWF4UmFkaXVzO1xcclxcbnVuaWZvcm0gZmxvYXQgYW1wbGl0dWRlO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxudmFyeWluZyBmbG9hdCB2U2l6ZTtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjMiBhc3BlY3RDb3JyZWN0aW9uID0gdmVjMihhc3BlY3QsIDEuMCk7XFxyXFxuXFxyXFxuXFx0dmVjMiBkaWZmZXJlbmNlID0gdlV2ICogYXNwZWN0Q29ycmVjdGlvbiAtIGNlbnRlciAqIGFzcGVjdENvcnJlY3Rpb247XFxyXFxuXFx0ZmxvYXQgZGlzdGFuY2UgPSBzcXJ0KGRvdChkaWZmZXJlbmNlLCBkaWZmZXJlbmNlKSkgKiB2U2l6ZTtcXHJcXG5cXHJcXG5cXHR2ZWMyIGRpc3BsYWNlbWVudCA9IHZlYzIoMC4wKTtcXHJcXG5cXHJcXG5cXHRpZihkaXN0YW5jZSA+IHJhZGl1cykge1xcclxcblxcclxcblxcdFxcdGlmKGRpc3RhbmNlIDwgcmFkaXVzICsgd2F2ZVNpemUpIHtcXHJcXG5cXHJcXG5cXHRcXHRcXHRmbG9hdCBhbmdsZSA9IChkaXN0YW5jZSAtIHJhZGl1cykgKiBQSTIgLyB3YXZlU2l6ZTtcXHJcXG5cXHRcXHRcXHRmbG9hdCBjb3NTaW4gPSAoMS4wIC0gY29zKGFuZ2xlKSkgKiAwLjU7XFxyXFxuXFxyXFxuXFx0XFx0XFx0ZmxvYXQgZXh0ZW50ID0gbWF4UmFkaXVzICsgd2F2ZVNpemU7XFxyXFxuXFx0XFx0XFx0ZmxvYXQgZGVjYXkgPSBtYXgoZXh0ZW50IC0gZGlzdGFuY2UgKiBkaXN0YW5jZSwgMC4wKSAvIGV4dGVudDtcXHJcXG5cXHJcXG5cXHRcXHRcXHRkaXNwbGFjZW1lbnQgPSAoKGNvc1NpbiAqIGFtcGxpdHVkZSAqIGRpZmZlcmVuY2UpIC8gZGlzdGFuY2UpICogZGVjYXk7XFxyXFxuXFxyXFxuXFx0XFx0fVxcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiAtIGRpc3BsYWNlbWVudCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xudmFyIHZlcnRleCQxNiA9IFwidW5pZm9ybSBmbG9hdCBzaXplO1xcclxcbnVuaWZvcm0gZmxvYXQgc2NhbGU7XFxyXFxudW5pZm9ybSBmbG9hdCBjYW1lcmFEaXN0YW5jZTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcbnZhcnlpbmcgZmxvYXQgdlNpemU7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdHZTaXplID0gKDAuMSAqIGNhbWVyYURpc3RhbmNlKSAvIHNpemU7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG4vKipcclxuICogQSBzaG9jayB3YXZlIHNoYWRlciBtYXRlcmlhbC5cclxuICpcclxuICogQmFzZWQgb24gYSBHaXN0IGJ5IEplYW4tUGhpbGlwcGUgU2FyZGE6XHJcbiAqICBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9qcHNhcmRhLzMzY2VhNjdhOWYyZWNiMGEwZWRhXHJcbiAqL1xuXG52YXIgU2hvY2tXYXZlTWF0ZXJpYWwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9TaGFkZXJNYXRlcmlhbCkge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHNob2NrIHdhdmUgbWF0ZXJpYWwuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLndhdmVTaXplPTAuMl0gLSBUaGUgd2F2ZSBzaXplLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5hbXBsaXR1ZGU9MC4wNV0gLSBUaGUgZGlzdG9ydGlvbiBhbXBsaXR1ZGUuXHJcbiAgICovXG4gIGZ1bmN0aW9uIFNob2NrV2F2ZU1hdGVyaWFsKCkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFNob2NrV2F2ZU1hdGVyaWFsKTtcblxuICAgIHZhciBzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgbWF4UmFkaXVzOiAxLjAsXG4gICAgICB3YXZlU2l6ZTogMC4yLFxuICAgICAgYW1wbGl0dWRlOiAwLjA1XG4gICAgfSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihTaG9ja1dhdmVNYXRlcmlhbCkuY2FsbCh0aGlzLCB7XG4gICAgICB0eXBlOiBcIlNob2NrV2F2ZU1hdGVyaWFsXCIsXG4gICAgICB1bmlmb3Jtczoge1xuICAgICAgICB0RGlmZnVzZTogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIGNlbnRlcjogbmV3IFVuaWZvcm0obmV3IFZlY3RvcjIoMC41LCAwLjUpKSxcbiAgICAgICAgYXNwZWN0OiBuZXcgVW5pZm9ybSgxLjApLFxuICAgICAgICBjYW1lcmFEaXN0YW5jZTogbmV3IFVuaWZvcm0oMS4wKSxcbiAgICAgICAgc2l6ZTogbmV3IFVuaWZvcm0oMS4wKSxcbiAgICAgICAgcmFkaXVzOiBuZXcgVW5pZm9ybSgtc2V0dGluZ3Mud2F2ZVNpemUpLFxuICAgICAgICBtYXhSYWRpdXM6IG5ldyBVbmlmb3JtKHNldHRpbmdzLm1heFJhZGl1cyksXG4gICAgICAgIHdhdmVTaXplOiBuZXcgVW5pZm9ybShzZXR0aW5ncy53YXZlU2l6ZSksXG4gICAgICAgIGFtcGxpdHVkZTogbmV3IFVuaWZvcm0oc2V0dGluZ3MuYW1wbGl0dWRlKVxuICAgICAgfSxcbiAgICAgIGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCQxNixcbiAgICAgIHZlcnRleFNoYWRlcjogdmVydGV4JDE2LFxuICAgICAgZGVwdGhXcml0ZTogZmFsc2UsXG4gICAgICBkZXB0aFRlc3Q6IGZhbHNlXG4gICAgfSkpO1xuICB9XG5cbiAgaW5oZXJpdHMoU2hvY2tXYXZlTWF0ZXJpYWwsIF9TaGFkZXJNYXRlcmlhbCk7XG5cbiAgcmV0dXJuIFNob2NrV2F2ZU1hdGVyaWFsO1xufShTaGFkZXJNYXRlcmlhbCk7XG5cbnZhciBmcmFnbWVudCQxNyA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdFdlaWdodHM7XFxyXFxuXFxyXFxudW5pZm9ybSB2ZWMyIHRleGVsU2l6ZTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcbnZhcnlpbmcgdmVjNCB2T2Zmc2V0O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHQvLyBGZXRjaCB0aGUgYmxlbmRpbmcgd2VpZ2h0cyBmb3IgY3VycmVudCBwaXhlbC5cXHJcXG5cXHR2ZWM0IGE7XFxyXFxuXFx0YS54eiA9IHRleHR1cmUyRCh0V2VpZ2h0cywgdlV2KS54ejtcXHJcXG5cXHRhLnkgPSB0ZXh0dXJlMkQodFdlaWdodHMsIHZPZmZzZXQuencpLmc7XFxyXFxuXFx0YS53ID0gdGV4dHVyZTJEKHRXZWlnaHRzLCB2T2Zmc2V0Lnh5KS5hO1xcclxcblxcclxcblxcdHZlYzQgY29sb3I7XFxyXFxuXFxyXFxuXFx0Ly8gQ2hlY2sgaWYgdGhlcmUgaXMgYW55IGJsZW5kaW5nIHdlaWdodCB3aXRoIGEgdmFsdWUgZ3JlYXRlciB0aGFuIDAuMC5cXHJcXG5cXHRpZihkb3QoYSwgdmVjNCgxLjApKSA8IDFlLTUpIHtcXHJcXG5cXHJcXG5cXHRcXHRjb2xvciA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2LCAwLjApO1xcclxcblxcclxcblxcdH0gZWxzZSB7XFxyXFxuXFxyXFxuXFx0XFx0LyogVXAgdG8gZm91ciBsaW5lcyBjYW4gYmUgY3Jvc3NpbmcgYSBwaXhlbCAob25lIHRocm91Z2ggZWFjaCBlZGdlKS5cXHJcXG5cXHRcXHQgKiBUaGUgbGluZSB3aXRoIHRoZSBtYXhpbXVtIHdlaWdodCBmb3IgZWFjaCBkaXJlY3Rpb24gaXMgZmF2b3VyZWQuXFxyXFxuXFx0XFx0ICovXFxyXFxuXFxyXFxuXFx0XFx0dmVjMiBvZmZzZXQ7XFxyXFxuXFx0XFx0b2Zmc2V0LnggPSBhLmEgPiBhLmIgPyBhLmEgOiAtYS5iOyAvLyBMZWZ0IHZzLiByaWdodC5cXHJcXG5cXHRcXHRvZmZzZXQueSA9IGEuZyA+IGEuciA/IC1hLmcgOiBhLnI7IC8vIFRvcCB2cy4gYm90dG9tIChjaGFuZ2VkIHNpZ25zKS5cXHJcXG5cXHJcXG5cXHRcXHQvLyBHbyBpbiB0aGUgZGlyZWN0aW9uIHdpdGggdGhlIG1heGltdW0gd2VpZ2h0IChob3Jpem9udGFsIHZzLiB2ZXJ0aWNhbCkuXFxyXFxuXFx0XFx0aWYoYWJzKG9mZnNldC54KSA+IGFicyhvZmZzZXQueSkpIHtcXHJcXG5cXHJcXG5cXHRcXHRcXHRvZmZzZXQueSA9IDAuMDtcXHJcXG5cXHJcXG5cXHRcXHR9IGVsc2Uge1xcclxcblxcclxcblxcdFxcdFxcdG9mZnNldC54ID0gMC4wO1xcclxcblxcclxcblxcdFxcdH1cXHJcXG5cXHJcXG5cXHRcXHQvLyBGZXRjaCB0aGUgb3Bwb3NpdGUgY29sb3IgYW5kIGxlcnAgYnkgaGFuZC5cXHJcXG5cXHRcXHRjb2xvciA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2LCAwLjApO1xcclxcblxcdFxcdHZlYzIgY29vcmQgPSB2VXYgKyBzaWduKG9mZnNldCkgKiB0ZXhlbFNpemU7XFxyXFxuXFx0XFx0dmVjNCBvcHBvc2l0ZUNvbG9yID0gdGV4dHVyZTJEKHREaWZmdXNlLCBjb29yZCwgMC4wKTtcXHJcXG5cXHRcXHRmbG9hdCBzID0gYWJzKG9mZnNldC54KSA+IGFicyhvZmZzZXQueSkgPyBhYnMob2Zmc2V0LngpIDogYWJzKG9mZnNldC55KTtcXHJcXG5cXHJcXG5cXHRcXHQvLyBHYW1tYSBjb3JyZWN0aW9uLlxcclxcblxcdFxcdGNvbG9yLnJnYiA9IHBvdyhhYnMoY29sb3IucmdiKSwgdmVjMygyLjIpKTtcXHJcXG5cXHRcXHRvcHBvc2l0ZUNvbG9yLnJnYiA9IHBvdyhhYnMob3Bwb3NpdGVDb2xvci5yZ2IpLCB2ZWMzKDIuMikpO1xcclxcblxcdFxcdGNvbG9yID0gbWl4KGNvbG9yLCBvcHBvc2l0ZUNvbG9yLCBzKTtcXHJcXG5cXHRcXHRjb2xvci5yZ2IgPSBwb3coYWJzKGNvbG9yLnJnYiksIHZlYzMoMS4wIC8gMi4yKSk7XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IGNvbG9yO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbnZhciB2ZXJ0ZXgkMTcgPSBcInVuaWZvcm0gdmVjMiB0ZXhlbFNpemU7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG52YXJ5aW5nIHZlYzQgdk9mZnNldDtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFxyXFxuXFx0dk9mZnNldCA9IHV2Lnh5eHkgKyB0ZXhlbFNpemUueHl4eSAqIHZlYzQoMS4wLCAwLjAsIDAuMCwgLTEuMCk7IC8vIENoYW5nZWQgc2lnbiBpbiBXIGNvbXBvbmVudC5cXHJcXG5cXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbi8qKlxyXG4gKiBTdWJwaXhlbCBNb3JwaG9sb2dpY2FsIEFudGlhbGlhc2luZy5cclxuICpcclxuICogVGhpcyBtYXRlcmlhbCBpcyB1c2VkIHRvIHJlbmRlciB0aGUgZmluYWwgYW50aWFsaWFzaW5nLlxyXG4gKi9cblxudmFyIFNNQUFCbGVuZE1hdGVyaWFsID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfU2hhZGVyTWF0ZXJpYWwpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBTTUFBIGJsZW5kIG1hdGVyaWFsLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtWZWN0b3IyfSBbdGV4ZWxTaXplXSAtIFRoZSBhYnNvbHV0ZSBzY3JlZW4gdGV4ZWwgc2l6ZS5cclxuICAgKi9cbiAgZnVuY3Rpb24gU01BQUJsZW5kTWF0ZXJpYWwoKSB7XG4gICAgdmFyIHRleGVsU2l6ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbmV3IFZlY3RvcjIoKTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFNNQUFCbGVuZE1hdGVyaWFsKTtcblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoU01BQUJsZW5kTWF0ZXJpYWwpLmNhbGwodGhpcywge1xuICAgICAgdHlwZTogXCJTTUFBQmxlbmRNYXRlcmlhbFwiLFxuICAgICAgdW5pZm9ybXM6IHtcbiAgICAgICAgdERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICB0V2VpZ2h0czogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIHRleGVsU2l6ZTogbmV3IFVuaWZvcm0odGV4ZWxTaXplKVxuICAgICAgfSxcbiAgICAgIGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCQxNyxcbiAgICAgIHZlcnRleFNoYWRlcjogdmVydGV4JDE3LFxuICAgICAgZGVwdGhXcml0ZTogZmFsc2UsXG4gICAgICBkZXB0aFRlc3Q6IGZhbHNlXG4gICAgfSkpO1xuICB9XG5cbiAgaW5oZXJpdHMoU01BQUJsZW5kTWF0ZXJpYWwsIF9TaGFkZXJNYXRlcmlhbCk7XG5cbiAgcmV0dXJuIFNNQUFCbGVuZE1hdGVyaWFsO1xufShTaGFkZXJNYXRlcmlhbCk7XG5cbnZhciBmcmFnbWVudCQxOCA9IFwiI2RlZmluZSBzYW1wbGVMZXZlbFplcm9PZmZzZXQodCwgY29vcmQsIG9mZnNldCkgdGV4dHVyZTJEKHQsIGNvb3JkICsgZmxvYXQob2Zmc2V0KSAqIHRleGVsU2l6ZSwgMC4wKVxcclxcblxcclxcbnVuaWZvcm0gc2FtcGxlcjJEIHREaWZmdXNlO1xcclxcbnVuaWZvcm0gc2FtcGxlcjJEIHRBcmVhO1xcclxcbnVuaWZvcm0gc2FtcGxlcjJEIHRTZWFyY2g7XFxyXFxuXFxyXFxudW5pZm9ybSB2ZWMyIHRleGVsU2l6ZTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcbnZhcnlpbmcgdmVjNCB2T2Zmc2V0WzNdO1xcclxcbnZhcnlpbmcgdmVjMiB2UGl4Q29vcmQ7XFxyXFxuXFxyXFxudmVjMiByb3VuZCh2ZWMyIHgpIHtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gc2lnbih4KSAqIGZsb29yKGFicyh4KSArIDAuNSk7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbmZsb2F0IHNlYXJjaExlbmd0aCh2ZWMyIGUsIGZsb2F0IGJpYXMsIGZsb2F0IHNjYWxlKSB7XFxyXFxuXFxyXFxuXFx0Ly8gTm90IHJlcXVpcmVkIGlmIHRTZWFyY2ggYWNjZXNzZXMgYXJlIHNldCB0byBwb2ludC5cXHJcXG5cXHQvLyBjb25zdCB2ZWMyIFNFQVJDSF9URVhfUElYRUxfU0laRSA9IDEuMCAvIHZlYzIoNjYuMCwgMzMuMCk7XFxyXFxuXFx0Ly8gZSA9IHZlYzIoYmlhcywgMC4wKSArIDAuNSAqIFNFQVJDSF9URVhfUElYRUxfU0laRSArIGUgKiB2ZWMyKHNjYWxlLCAxLjApICogdmVjMig2NC4wLCAzMi4wKSAqIFNFQVJDSF9URVhfUElYRUxfU0laRTtcXHJcXG5cXHJcXG5cXHRlLnIgPSBiaWFzICsgZS5yICogc2NhbGU7XFxyXFxuXFxyXFxuXFx0cmV0dXJuIDI1NS4wICogdGV4dHVyZTJEKHRTZWFyY2gsIGUsIDAuMCkucjtcXHJcXG5cXHJcXG59XFxyXFxuXFxyXFxuZmxvYXQgc2VhcmNoWExlZnQodmVjMiB0ZXhDb29yZCwgZmxvYXQgZW5kKSB7XFxyXFxuXFxyXFxuXFx0LyogQFBTRVVET19HQVRIRVI0XFxyXFxuXFx0ICogVGhpcyB0ZXhDb29yZCBoYXMgYmVlbiBvZmZzZXQgYnkgKC0wLjI1LCAtMC4xMjUpIGluIHRoZSB2ZXJ0ZXggc2hhZGVyIHRvXFxyXFxuXFx0ICogc2FtcGxlIGJldHdlZW4gZWRnZSwgdGh1cyBmZXRjaGluZyBmb3VyIGVkZ2VzIGluIGEgcm93LlxcclxcblxcdCAqIFNhbXBsaW5nIHdpdGggZGlmZmVyZW50IG9mZnNldHMgaW4gZWFjaCBkaXJlY3Rpb24gYWxsb3dzIHRvIGRpc2FtYmlndWF0ZVxcclxcblxcdCAqIHdoaWNoIGVkZ2VzIGFyZSBhY3RpdmUgZnJvbSB0aGUgZm91ciBmZXRjaGVkIG9uZXMuXFxyXFxuXFx0ICovXFxyXFxuXFxyXFxuXFx0dmVjMiBlID0gdmVjMigwLjAsIDEuMCk7XFxyXFxuXFxyXFxuXFx0Zm9yKGludCBpID0gMDsgaSA8IE1BWF9TRUFSQ0hfU1RFUFNfSU5UOyArK2kpIHtcXHJcXG5cXHJcXG5cXHRcXHRlID0gdGV4dHVyZTJEKHREaWZmdXNlLCB0ZXhDb29yZCwgMC4wKS5yZztcXHJcXG5cXHRcXHR0ZXhDb29yZCAtPSB2ZWMyKDIuMCwgMC4wKSAqIHRleGVsU2l6ZTtcXHJcXG5cXHJcXG5cXHRcXHRpZighKHRleENvb3JkLnggPiBlbmQgJiYgZS5nID4gMC44MjgxICYmIGUuciA9PSAwLjApKSB7IGJyZWFrOyB9XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdC8vIENvcnJlY3QgdGhlIHByZXZpb3VzbHkgYXBwbGllZCBvZmZzZXQgKC0wLjI1LCAtMC4xMjUpLlxcclxcblxcdHRleENvb3JkLnggKz0gMC4yNSAqIHRleGVsU2l6ZS54O1xcclxcblxcclxcblxcdC8vIFRoZSBzZWFyY2hlcyBhcmUgYmlhc2VkIGJ5IDEsIHNvIGFkanVzdCB0aGUgY29vcmRzIGFjY29yZGluZ2x5LlxcclxcblxcdHRleENvb3JkLnggKz0gdGV4ZWxTaXplLng7XFxyXFxuXFxyXFxuXFx0Ly8gRGlzYW1iaWd1YXRlIHRoZSBsZW5ndGggYWRkZWQgYnkgdGhlIGxhc3Qgc3RlcC5cXHJcXG5cXHR0ZXhDb29yZC54ICs9IDIuMCAqIHRleGVsU2l6ZS54OyAvLyBVbmRvIGxhc3Qgc3RlcC5cXHJcXG5cXHR0ZXhDb29yZC54IC09IHRleGVsU2l6ZS54ICogc2VhcmNoTGVuZ3RoKGUsIDAuMCwgMC41KTtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gdGV4Q29vcmQueDtcXHJcXG5cXHJcXG59XFxyXFxuXFxyXFxuZmxvYXQgc2VhcmNoWFJpZ2h0KHZlYzIgdGV4Q29vcmQsIGZsb2F0IGVuZCkge1xcclxcblxcclxcblxcdHZlYzIgZSA9IHZlYzIoMC4wLCAxLjApO1xcclxcblxcclxcblxcdGZvcihpbnQgaSA9IDA7IGkgPCBNQVhfU0VBUkNIX1NURVBTX0lOVDsgKytpKSB7XFxyXFxuXFxyXFxuXFx0XFx0ZSA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdGV4Q29vcmQsIDAuMCkucmc7XFxyXFxuXFx0XFx0dGV4Q29vcmQgKz0gdmVjMigyLjAsIDAuMCkgKiB0ZXhlbFNpemU7XFxyXFxuXFxyXFxuXFx0XFx0aWYoISh0ZXhDb29yZC54IDwgZW5kICYmIGUuZyA+IDAuODI4MSAmJiBlLnIgPT0gMC4wKSkgeyBicmVhazsgfVxcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG5cXHR0ZXhDb29yZC54IC09IDAuMjUgKiB0ZXhlbFNpemUueDtcXHJcXG5cXHR0ZXhDb29yZC54IC09IHRleGVsU2l6ZS54O1xcclxcblxcdHRleENvb3JkLnggLT0gMi4wICogdGV4ZWxTaXplLng7XFxyXFxuXFx0dGV4Q29vcmQueCArPSB0ZXhlbFNpemUueCAqIHNlYXJjaExlbmd0aChlLCAwLjUsIDAuNSk7XFxyXFxuXFxyXFxuXFx0cmV0dXJuIHRleENvb3JkLng7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbmZsb2F0IHNlYXJjaFlVcCh2ZWMyIHRleENvb3JkLCBmbG9hdCBlbmQpIHtcXHJcXG5cXHJcXG5cXHR2ZWMyIGUgPSB2ZWMyKDEuMCwgMC4wKTtcXHJcXG5cXHJcXG5cXHRmb3IoaW50IGkgPSAwOyBpIDwgTUFYX1NFQVJDSF9TVEVQU19JTlQ7ICsraSkge1xcclxcblxcclxcblxcdFxcdGUgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHRleENvb3JkLCAwLjApLnJnO1xcclxcblxcdFxcdHRleENvb3JkICs9IHZlYzIoMC4wLCAyLjApICogdGV4ZWxTaXplOyAvLyBDaGFuZ2VkIHNpZ24uXFxyXFxuXFxyXFxuXFx0XFx0aWYoISh0ZXhDb29yZC55ID4gZW5kICYmIGUuciA+IDAuODI4MSAmJiBlLmcgPT0gMC4wKSkgeyBicmVhazsgfVxcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG5cXHR0ZXhDb29yZC55IC09IDAuMjUgKiB0ZXhlbFNpemUueTsgLy8gQ2hhbmdlZCBzaWduLlxcclxcblxcdHRleENvb3JkLnkgLT0gdGV4ZWxTaXplLnk7IC8vIENoYW5nZWQgc2lnbi5cXHJcXG5cXHR0ZXhDb29yZC55IC09IDIuMCAqIHRleGVsU2l6ZS55OyAvLyBDaGFuZ2VkIHNpZ24uXFxyXFxuXFx0dGV4Q29vcmQueSArPSB0ZXhlbFNpemUueSAqIHNlYXJjaExlbmd0aChlLmdyLCAwLjAsIDAuNSk7IC8vIENoYW5nZWQgc2lnbi5cXHJcXG5cXHJcXG5cXHRyZXR1cm4gdGV4Q29vcmQueTtcXHJcXG5cXHJcXG59XFxyXFxuXFxyXFxuZmxvYXQgc2VhcmNoWURvd24odmVjMiB0ZXhDb29yZCwgZmxvYXQgZW5kKSB7XFxyXFxuXFxyXFxuXFx0dmVjMiBlID0gdmVjMigxLjAsIDAuMCk7XFxyXFxuXFxyXFxuXFx0Zm9yKGludCBpID0gMDsgaSA8IE1BWF9TRUFSQ0hfU1RFUFNfSU5UOyArK2kgKSB7XFxyXFxuXFxyXFxuXFx0XFx0ZSA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdGV4Q29vcmQsIDAuMCkucmc7XFxyXFxuXFx0XFx0dGV4Q29vcmQgLT0gdmVjMigwLjAsIDIuMCkgKiB0ZXhlbFNpemU7IC8vIENoYW5nZWQgc2lnbi5cXHJcXG5cXHJcXG5cXHRcXHRpZighKHRleENvb3JkLnkgPCBlbmQgJiYgZS5yID4gMC44MjgxICYmIGUuZyA9PSAwLjApKSB7IGJyZWFrOyB9XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdHRleENvb3JkLnkgKz0gMC4yNSAqIHRleGVsU2l6ZS55OyAvLyBDaGFuZ2VkIHNpZ24uXFxyXFxuXFx0dGV4Q29vcmQueSArPSB0ZXhlbFNpemUueTsgLy8gQ2hhbmdlZCBzaWduLlxcclxcblxcdHRleENvb3JkLnkgKz0gMi4wICogdGV4ZWxTaXplLnk7IC8vIENoYW5nZWQgc2lnbi5cXHJcXG5cXHR0ZXhDb29yZC55IC09IHRleGVsU2l6ZS55ICogc2VhcmNoTGVuZ3RoKGUuZ3IsIDAuNSwgMC41KTsgLy8gQ2hhbmdlZCBzaWduLlxcclxcblxcclxcblxcdHJldHVybiB0ZXhDb29yZC55O1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG52ZWMyIGFyZWEodmVjMiBkaXN0LCBmbG9hdCBlMSwgZmxvYXQgZTIsIGZsb2F0IG9mZnNldCkge1xcclxcblxcclxcblxcdC8vIFJvdW5kaW5nIHByZXZlbnRzIHByZWNpc2lvbiBlcnJvcnMgb2YgYmlsaW5lYXIgZmlsdGVyaW5nLlxcclxcblxcdHZlYzIgdGV4Q29vcmQgPSBBUkVBVEVYX01BWF9ESVNUQU5DRSAqIHJvdW5kKDQuMCAqIHZlYzIoZTEsIGUyKSkgKyBkaXN0O1xcclxcblxcclxcblxcdC8vIFNjYWxlIGFuZCBiaWFzIGZvciB0ZXhlbCBzcGFjZSB0cmFuc2xhdGlvbi5cXHJcXG5cXHR0ZXhDb29yZCA9IEFSRUFURVhfUElYRUxfU0laRSAqIHRleENvb3JkICsgKDAuNSAqIEFSRUFURVhfUElYRUxfU0laRSk7XFxyXFxuXFxyXFxuXFx0Ly8gTW92ZSB0byBwcm9wZXIgcGxhY2UsIGFjY29yZGluZyB0byB0aGUgc3VicGl4ZWwgb2Zmc2V0LlxcclxcblxcdHRleENvb3JkLnkgKz0gQVJFQVRFWF9TVUJURVhfU0laRSAqIG9mZnNldDtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gdGV4dHVyZTJEKHRBcmVhLCB0ZXhDb29yZCwgMC4wKS5yZztcXHJcXG5cXHJcXG59XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZlYzQgd2VpZ2h0cyA9IHZlYzQoMC4wKTtcXHJcXG5cXHR2ZWM0IHN1YnNhbXBsZUluZGljZXMgPSB2ZWM0KDAuMCk7XFxyXFxuXFx0dmVjMiBlID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYpLnJnO1xcclxcblxcclxcblxcdGlmKGUuZyA+IDAuMCkge1xcclxcblxcclxcblxcdFxcdC8vIEVkZ2UgYXQgbm9ydGguXFxyXFxuXFx0XFx0dmVjMiBkO1xcclxcblxcclxcblxcdFxcdC8vIEZpbmQgdGhlIGRpc3RhbmNlIHRvIHRoZSBsZWZ0LlxcclxcblxcdFxcdHZlYzIgY29vcmRzO1xcclxcblxcdFxcdGNvb3Jkcy54ID0gc2VhcmNoWExlZnQodk9mZnNldFswXS54eSwgdk9mZnNldFsyXS54KTtcXHJcXG5cXHRcXHRjb29yZHMueSA9IHZPZmZzZXRbMV0ueTsgLy8gdk9mZnNldFsxXS55ID0gdlV2LnkgLSAwLjI1ICogdGV4ZWxTaXplLnkgKEBDUk9TU0lOR19PRkZTRVQpXFxyXFxuXFx0XFx0ZC54ID0gY29vcmRzLng7XFxyXFxuXFxyXFxuXFx0XFx0LyogTm93IGZldGNoIHRoZSBsZWZ0IGNyb3NzaW5nIGVkZ2VzLCB0d28gYXQgYSB0aW1lIHVzaW5nIGJpbGluZWFyXFxyXFxuXFx0XFx0ZmlsdGVyaW5nLiBTYW1wbGluZyBhdCAtMC4yNSAoc2VlIEBDUk9TU0lOR19PRkZTRVQpIGVuYWJsZXMgdG8gZGlzY2VybiB3aGF0XFxyXFxuXFx0XFx0dmFsdWUgZWFjaCBlZGdlIGhhcy4gKi9cXHJcXG5cXHRcXHRmbG9hdCBlMSA9IHRleHR1cmUyRCh0RGlmZnVzZSwgY29vcmRzLCAwLjApLnI7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRmluZCB0aGUgZGlzdGFuY2UgdG8gdGhlIHJpZ2h0LlxcclxcblxcdFxcdGNvb3Jkcy54ID0gc2VhcmNoWFJpZ2h0KHZPZmZzZXRbMF0uencsIHZPZmZzZXRbMl0ueSk7XFxyXFxuXFx0XFx0ZC55ID0gY29vcmRzLng7XFxyXFxuXFxyXFxuXFx0XFx0LyogVHJhbnNsYXRlIGRpc3RhbmNlcyB0byBwaXhlbCB1bml0cyBmb3IgYmV0dGVyIGludGVybGVhdmUgYXJpdGhtZXRpYyBhbmRcXHJcXG5cXHRcXHRtZW1vcnkgYWNjZXNzZXMuICovXFxyXFxuXFx0XFx0ZCA9IGQgLyB0ZXhlbFNpemUueCAtIHZQaXhDb29yZC54O1xcclxcblxcclxcblxcdFxcdC8vIFRoZSBhcmVhIHRleHR1cmUgaXMgY29tcHJlc3NlZCBxdWFkcmF0aWNhbGx5LlxcclxcblxcdFxcdHZlYzIgc3FydEQgPSBzcXJ0KGFicyhkKSk7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRmV0Y2ggdGhlIHJpZ2h0IGNyb3NzaW5nIGVkZ2VzLlxcclxcblxcdFxcdGNvb3Jkcy55IC09IHRleGVsU2l6ZS55OyAvLyBXZWJHTCBwb3J0IG5vdGU6IEFkZGVkLlxcclxcblxcdFxcdGZsb2F0IGUyID0gc2FtcGxlTGV2ZWxaZXJvT2Zmc2V0KHREaWZmdXNlLCBjb29yZHMsIGl2ZWMyKDEsIDApKS5yO1xcclxcblxcclxcblxcdFxcdC8vIFBhdHRlcm4gcmVjb2duaXNlZCwgbm93IGdldCB0aGUgYWN0dWFsIGFyZWEuXFxyXFxuXFx0XFx0d2VpZ2h0cy5yZyA9IGFyZWEoc3FydEQsIGUxLCBlMiwgc3Vic2FtcGxlSW5kaWNlcy55KTtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0aWYoZS5yID4gMC4wKSB7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRWRnZSBhdCB3ZXN0LlxcclxcblxcdFxcdHZlYzIgZDtcXHJcXG5cXHJcXG5cXHRcXHQvLyBGaW5kIHRoZSBkaXN0YW5jZSB0byB0aGUgdG9wLlxcclxcblxcdFxcdHZlYzIgY29vcmRzO1xcclxcblxcdFxcdGNvb3Jkcy55ID0gc2VhcmNoWVVwKHZPZmZzZXRbMV0ueHksIHZPZmZzZXRbMl0ueik7XFxyXFxuXFx0XFx0Y29vcmRzLnggPSB2T2Zmc2V0WzBdLng7IC8vIHZPZmZzZXRbMV0ueCA9IHZVdi54IC0gMC4yNSAqIHRleGVsU2l6ZS54O1xcclxcblxcdFxcdGQueCA9IGNvb3Jkcy55O1xcclxcblxcclxcblxcdFxcdC8vIEZldGNoIHRoZSB0b3AgY3Jvc3NpbmcgZWRnZXMuXFxyXFxuXFx0XFx0ZmxvYXQgZTEgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIGNvb3JkcywgMC4wKS5nO1xcclxcblxcclxcblxcdFxcdC8vIEZpbmQgdGhlIGRpc3RhbmNlIHRvIHRoZSBib3R0b20uXFxyXFxuXFx0XFx0Y29vcmRzLnkgPSBzZWFyY2hZRG93bih2T2Zmc2V0WzFdLnp3LCB2T2Zmc2V0WzJdLncpO1xcclxcblxcdFxcdGQueSA9IGNvb3Jkcy55O1xcclxcblxcclxcblxcdFxcdC8vIERpc3RhbmNlcyBpbiBwaXhlbCB1bml0cy5cXHJcXG5cXHRcXHRkID0gZCAvIHRleGVsU2l6ZS55IC0gdlBpeENvb3JkLnk7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gVGhlIGFyZWEgdGV4dHVyZSBpcyBjb21wcmVzc2VkIHF1YWRyYXRpY2FsbHkuXFxyXFxuXFx0XFx0dmVjMiBzcXJ0RCA9IHNxcnQoYWJzKGQpKTtcXHJcXG5cXHJcXG5cXHRcXHQvLyBGZXRjaCB0aGUgYm90dG9tIGNyb3NzaW5nIGVkZ2VzLlxcclxcblxcdFxcdGNvb3Jkcy55IC09IHRleGVsU2l6ZS55OyAvLyBXZWJHTCBwb3J0IG5vdGU6IEFkZGVkLlxcclxcblxcdFxcdGZsb2F0IGUyID0gc2FtcGxlTGV2ZWxaZXJvT2Zmc2V0KHREaWZmdXNlLCBjb29yZHMsIGl2ZWMyKDAsIDEpKS5nO1xcclxcblxcclxcblxcdFxcdC8vIEdldCB0aGUgYXJlYSBmb3IgdGhpcyBkaXJlY3Rpb24uXFxyXFxuXFx0XFx0d2VpZ2h0cy5iYSA9IGFyZWEoc3FydEQsIGUxLCBlMiwgc3Vic2FtcGxlSW5kaWNlcy54KTtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gd2VpZ2h0cztcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG52YXIgdmVydGV4JDE4ID0gXCJ1bmlmb3JtIHZlYzIgdGV4ZWxTaXplO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxudmFyeWluZyB2ZWM0IHZPZmZzZXRbM107XFxyXFxudmFyeWluZyB2ZWMyIHZQaXhDb29yZDtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFxyXFxuXFx0dlBpeENvb3JkID0gdXYgLyB0ZXhlbFNpemU7XFxyXFxuXFxyXFxuXFx0Ly8gT2Zmc2V0cyBmb3IgdGhlIHNlYXJjaGVzIChzZWUgQFBTRVVET19HQVRIRVI0KS5cXHJcXG5cXHR2T2Zmc2V0WzBdID0gdXYueHl4eSArIHRleGVsU2l6ZS54eXh5ICogdmVjNCgtMC4yNSwgMC4xMjUsIDEuMjUsIDAuMTI1KTsgLy8gQ2hhbmdlZCBzaWduIGluIFkgYW5kIFcgY29tcG9uZW50cy5cXHJcXG5cXHR2T2Zmc2V0WzFdID0gdXYueHl4eSArIHRleGVsU2l6ZS54eXh5ICogdmVjNCgtMC4xMjUsIDAuMjUsIC0wLjEyNSwgLTEuMjUpOyAvL0NoYW5nZWQgc2lnbiBpbiBZIGFuZCBXIGNvbXBvbmVudHMuXFxyXFxuXFxyXFxuXFx0Ly8gVGhpcyBpbmRpY2F0ZXMgdGhlIGVuZHMgb2YgdGhlIGxvb3BzLlxcclxcblxcdHZPZmZzZXRbMl0gPSB2ZWM0KHZPZmZzZXRbMF0ueHosIHZPZmZzZXRbMV0ueXcpICsgdmVjNCgtMi4wLCAyLjAsIC0yLjAsIDIuMCkgKiB0ZXhlbFNpemUueHh5eSAqIE1BWF9TRUFSQ0hfU1RFUFNfRkxPQVQ7XFxyXFxuXFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG4vKipcclxuICogU3VicGl4ZWwgTW9ycGhvbG9naWNhbCBBbnRpYWxpYXNpbmcuXHJcbiAqXHJcbiAqIFRoaXMgbWF0ZXJpYWwgY29tcHV0ZXMgd2VpZ2h0cyBmb3IgZGV0ZWN0ZWQgZWRnZXMuXHJcbiAqL1xuXG52YXIgU01BQVdlaWdodHNNYXRlcmlhbCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1NoYWRlck1hdGVyaWFsKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgU01BQSB3ZWlnaHRzIG1hdGVyaWFsLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtWZWN0b3IyfSBbdGV4ZWxTaXplXSAtIFRoZSBhYnNvbHV0ZSBzY3JlZW4gdGV4ZWwgc2l6ZS5cclxuICAgKi9cbiAgZnVuY3Rpb24gU01BQVdlaWdodHNNYXRlcmlhbCgpIHtcbiAgICB2YXIgdGV4ZWxTaXplID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBuZXcgVmVjdG9yMigpO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgU01BQVdlaWdodHNNYXRlcmlhbCk7XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFNNQUFXZWlnaHRzTWF0ZXJpYWwpLmNhbGwodGhpcywge1xuICAgICAgdHlwZTogXCJTTUFBV2VpZ2h0c01hdGVyaWFsXCIsXG4gICAgICBkZWZpbmVzOiB7XG4gICAgICAgIC8vIENvbmZpZ3VyYWJsZSBzZXR0aW5nczpcbiAgICAgICAgTUFYX1NFQVJDSF9TVEVQU19JTlQ6IFwiOFwiLFxuICAgICAgICBNQVhfU0VBUkNIX1NURVBTX0ZMT0FUOiBcIjguMFwiLFxuICAgICAgICAvLyBOb24tY29uZmlndXJhYmxlIHNldHRpbmdzOlxuICAgICAgICBBUkVBVEVYX01BWF9ESVNUQU5DRTogXCIxNi4wXCIsXG4gICAgICAgIEFSRUFURVhfUElYRUxfU0laRTogXCIoMS4wIC8gdmVjMigxNjAuMCwgNTYwLjApKVwiLFxuICAgICAgICBBUkVBVEVYX1NVQlRFWF9TSVpFOiBcIigxLjAgLyA3LjApXCIsXG4gICAgICAgIFNFQVJDSFRFWF9TSVpFOiBcInZlYzIoNjYuMCwgMzMuMClcIixcbiAgICAgICAgU0VBUkNIVEVYX1BBQ0tFRF9TSVpFOiBcInZlYzIoNjQuMCwgMTYuMClcIlxuICAgICAgfSxcbiAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgIHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgdEFyZWE6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICB0U2VhcmNoOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgdGV4ZWxTaXplOiBuZXcgVW5pZm9ybSh0ZXhlbFNpemUpXG4gICAgICB9LFxuICAgICAgZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50JDE4LFxuICAgICAgdmVydGV4U2hhZGVyOiB2ZXJ0ZXgkMTgsXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcbiAgICAgIGRlcHRoVGVzdDogZmFsc2VcbiAgICB9KSk7XG4gIH1cbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgbWF4aW11bSBhbW91bnQgb2Ygc3RlcHMgcGVyZm9ybWVkIGluIHRoZSBob3Jpem9udGFsL3ZlcnRpY2FsXHJcbiAgICogcGF0dGVybiBzZWFyY2hlcywgYXQgZWFjaCBzaWRlIG9mIHRoZSBwaXhlbC5cclxuICAgKlxyXG4gICAqIEluIG51bWJlciBvZiBwaXhlbHMsIGl0J3MgYWN0dWFsbHkgdGhlIGRvdWJsZS4gU28gdGhlIG1heGltdW0gbGluZSBsZW5ndGhcclxuICAgKiBwZXJmZWN0bHkgaGFuZGxlZCBieSwgZm9yIGV4YW1wbGUgMTYsIGlzIDY0IChwZXJmZWN0bHkgbWVhbnMgdGhhdCBsb25nZXJcclxuICAgKiBsaW5lcyB3b24ndCBsb29rIGFzIGdvb2QsIGJ1dCBhcmUgc3RpbGwgYW50aWFsaWFzZWQpLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHN0ZXBzIC0gVGhlIHNlYXJjaCBzdGVwcy4gUmFuZ2U6IFswLCAxMTJdLlxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoU01BQVdlaWdodHNNYXRlcmlhbCwgW3tcbiAgICBrZXk6IFwic2V0T3J0aG9nb25hbFNlYXJjaFN0ZXBzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldE9ydGhvZ29uYWxTZWFyY2hTdGVwcyhzdGVwcykge1xuICAgICAgdGhpcy5kZWZpbmVzLk1BWF9TRUFSQ0hfU1RFUFNfSU5UID0gc3RlcHMudG9GaXhlZChcIjBcIik7XG4gICAgICB0aGlzLmRlZmluZXMuTUFYX1NFQVJDSF9TVEVQU19GTE9BVCA9IHN0ZXBzLnRvRml4ZWQoXCIxXCIpO1xuICAgICAgdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoU01BQVdlaWdodHNNYXRlcmlhbCwgX1NoYWRlck1hdGVyaWFsKTtcblxuICByZXR1cm4gU01BQVdlaWdodHNNYXRlcmlhbDtcbn0oU2hhZGVyTWF0ZXJpYWwpO1xuXG52YXIgZnJhZ21lbnQkMTkgPSBcIiNpbmNsdWRlIDxjb21tb24+XFxyXFxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxcclxcblxcclxcbnVuaWZvcm0gc2FtcGxlcjJEIHREaWZmdXNlO1xcclxcbnVuaWZvcm0gZmxvYXQgbWlkZGxlR3JleTtcXHJcXG51bmlmb3JtIGZsb2F0IG1heEx1bWluYW5jZTtcXHJcXG5cXHJcXG4jaWZkZWYgQURBUFRFRF9MVU1JTkFOQ0VcXHJcXG5cXHJcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBsdW1pbmFuY2VNYXA7XFxyXFxuXFxyXFxuI2Vsc2VcXHJcXG5cXHJcXG5cXHR1bmlmb3JtIGZsb2F0IGF2ZXJhZ2VMdW1pbmFuY2U7XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52ZWMzIHRvbmVNYXAodmVjMyBjKSB7XFxyXFxuXFxyXFxuXFx0I2lmZGVmIEFEQVBURURfTFVNSU5BTkNFXFxyXFxuXFxyXFxuXFx0XFx0Ly8gR2V0IHRoZSBjYWxjdWxhdGVkIGF2ZXJhZ2UgbHVtaW5hbmNlIGJ5IHNhbXBsaW5nIHRoZSBjZW50ZXIuXFxyXFxuXFx0XFx0ZmxvYXQgbHVtQXZnID0gdGV4dHVyZTJEKGx1bWluYW5jZU1hcCwgdmVjMigwLjUpKS5yO1xcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgbHVtQXZnID0gYXZlcmFnZUx1bWluYW5jZTtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQvLyBDYWxjdWxhdGUgdGhlIGx1bWluYW5jZSBvZiB0aGUgY3VycmVudCBwaXhlbC5cXHJcXG5cXHRmbG9hdCBsdW1QaXhlbCA9IGxpbmVhclRvUmVsYXRpdmVMdW1pbmFuY2UoYyk7XFxyXFxuXFxyXFxuXFx0Ly8gQXBwbHkgdGhlIG1vZGlmaWVkIG9wZXJhdG9yIChSZWluaGFyZCBFcS4gNCkuXFxyXFxuXFx0ZmxvYXQgbHVtU2NhbGVkID0gKGx1bVBpeGVsICogbWlkZGxlR3JleSkgLyBsdW1Bdmc7XFxyXFxuXFxyXFxuXFx0ZmxvYXQgbHVtQ29tcHJlc3NlZCA9IChsdW1TY2FsZWQgKiAoMS4wICsgKGx1bVNjYWxlZCAvIChtYXhMdW1pbmFuY2UgKiBtYXhMdW1pbmFuY2UpKSkpIC8gKDEuMCArIGx1bVNjYWxlZCk7XFxyXFxuXFxyXFxuXFx0cmV0dXJuIGx1bUNvbXByZXNzZWQgKiBjO1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjNCB0ZXhlbCA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2KTtcXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KHRvbmVNYXAodGV4ZWwucmdiKSwgdGV4ZWwuYSk7XFxyXFxuXFxyXFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXHJcXG5cXHJcXG59XFxyXFxuXCI7XG52YXIgdmVydGV4JDE5ID0gXCJ2YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbi8qKlxyXG4gKiBGdWxsLXNjcmVlbiB0b25lLW1hcHBpbmcgc2hhZGVyIG1hdGVyaWFsLlxyXG4gKlxyXG4gKiBUaGlzIG1hdGVyaWFsIHN1cHBvcnRzIGRpdGhlcmluZy5cclxuICpcclxuICogUmVmZXJlbmNlOlxyXG4gKiAgaHR0cDovL3d3dy5jaXMucml0LmVkdS9wZW9wbGUvZmFjdWx0eS9mZXJ3ZXJkYS9wdWJsaWNhdGlvbnMvc2lnMDJfcGFwZXIucGRmXHJcbiAqL1xuXG52YXIgVG9uZU1hcHBpbmdNYXRlcmlhbCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1NoYWRlck1hdGVyaWFsKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgdG9uZSBtYXBwaW5nIG1hdGVyaWFsLlxyXG4gICAqL1xuICBmdW5jdGlvbiBUb25lTWFwcGluZ01hdGVyaWFsKCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRvbmVNYXBwaW5nTWF0ZXJpYWwpO1xuXG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihUb25lTWFwcGluZ01hdGVyaWFsKS5jYWxsKHRoaXMsIHtcbiAgICAgIHR5cGU6IFwiVG9uZU1hcHBpbmdNYXRlcmlhbFwiLFxuICAgICAgdW5pZm9ybXM6IHtcbiAgICAgICAgdERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICBsdW1pbmFuY2VNYXA6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICBhdmVyYWdlTHVtaW5hbmNlOiBuZXcgVW5pZm9ybSgxLjApLFxuICAgICAgICBtYXhMdW1pbmFuY2U6IG5ldyBVbmlmb3JtKDE2LjApLFxuICAgICAgICBtaWRkbGVHcmV5OiBuZXcgVW5pZm9ybSgwLjYpXG4gICAgICB9LFxuICAgICAgZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50JDE5LFxuICAgICAgdmVydGV4U2hhZGVyOiB2ZXJ0ZXgkMTksXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcbiAgICAgIGRlcHRoVGVzdDogZmFsc2VcbiAgICB9KSk7XG4gIH1cblxuICBpbmhlcml0cyhUb25lTWFwcGluZ01hdGVyaWFsLCBfU2hhZGVyTWF0ZXJpYWwpO1xuXG4gIHJldHVybiBUb25lTWFwcGluZ01hdGVyaWFsO1xufShTaGFkZXJNYXRlcmlhbCk7XG5cbi8qKlxyXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2hhZGVyIG1hdGVyaWFscyB0aGF0IGFyZSB1c2VkIGluIHRoZSBwb3N0IHByb2Nlc3NpbmcgcGFzc2VzLlxyXG4gKlxyXG4gKiBAbW9kdWxlIHBvc3Rwcm9jZXNzaW5nL21hdGVyaWFsc1xyXG4gKi9cblxuLyoqXHJcbiAqIEFuIGFic3RyYWN0IHBhc3MuXHJcbiAqXHJcbiAqIFBhc3NlcyB0aGF0IGRvIG5vdCByZWx5IG9uIHRoZSBkZXB0aCBidWZmZXIgc2hvdWxkIGV4cGxpY2l0bHkgZGlzYWJsZSB0aGVcclxuICogZGVwdGggdGVzdCBhbmQgZGVwdGggd3JpdGUgaW4gdGhlaXIgcmVzcGVjdGl2ZSBzaGFkZXIgbWF0ZXJpYWxzLlxyXG4gKlxyXG4gKiBAaW1wbGVtZW50cyB7UmVzaXphYmxlfVxyXG4gKiBAaW1wbGVtZW50cyB7RGlzcG9zYWJsZX1cclxuICovXG5cbnZhciBQYXNzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBwYXNzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtuYW1lXSAtIFRoZSBuYW1lIG9mIHRoaXMgcGFzcy5cclxuICAgKiBAcGFyYW0ge1NjZW5lfSBbc2NlbmVdIC0gVGhlIHNjZW5lIHRvIHJlbmRlci5cclxuICAgKiBAcGFyYW0ge0NhbWVyYX0gW2NhbWVyYV0gLSBUaGUgY2FtZXJhLlxyXG4gICAqIEBwYXJhbSB7TWVzaH0gW3F1YWRdIC0gQSBxdWFkIHRoYXQgZmlsbHMgdGhlIHNjcmVlbiB0byByZW5kZXIgMkQgZmlsdGVyIGVmZmVjdHMuIFNldCB0aGlzIHRvIG51bGwsIGlmIHlvdSBkb24ndCBuZWVkIGl0IChzZWUge0BsaW5rIFJlbmRlclBhc3N9KS5cclxuICAgKi9cbiAgZnVuY3Rpb24gUGFzcygpIHtcbiAgICB2YXIgbmFtZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogXCJQYXNzXCI7XG4gICAgdmFyIHNjZW5lID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBuZXcgU2NlbmUoKTtcbiAgICB2YXIgY2FtZXJhID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKC0xLCAxLCAxLCAtMSwgMCwgMSk7XG4gICAgdmFyIHF1YWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG5ldyBNZXNoKG5ldyBQbGFuZUJ1ZmZlckdlb21ldHJ5KDIsIDIpLCBudWxsKTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFBhc3MpO1xuXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGlzIHBhc3MuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1N0cmluZ31cclxuICAgICAqL1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc2NlbmUgdG8gcmVuZGVyLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtTY2VuZX1cclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqL1xuXG4gICAgdGhpcy5zY2VuZSA9IHNjZW5lO1xuICAgIC8qKlxyXG4gICAgICogVGhlIGNhbWVyYS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Q2FtZXJhfVxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICovXG5cbiAgICB0aGlzLmNhbWVyYSA9IGNhbWVyYTtcbiAgICAvKipcclxuICAgICAqIEEgcXVhZCBtZXNoIHRoYXQgZmlsbHMgdGhlIHNjcmVlbi5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TWVzaH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIHRoaXMucXVhZCA9IHF1YWQ7XG5cbiAgICBpZiAodGhpcy5xdWFkICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnF1YWQuZnJ1c3R1bUN1bGxlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAodGhpcy5zY2VuZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLnNjZW5lLmFkZCh0aGlzLnF1YWQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgcGFzcyBzaG91bGQgcmVuZGVyIHRvIHNjcmVlbi5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuXG5cbiAgICB0aGlzLnJlbmRlclRvU2NyZWVuID0gZmFsc2U7XG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHBhc3Mgc2hvdWxkIGJlIGV4ZWN1dGVkLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG5cbiAgICB0aGlzLmVuYWJsZWQgPSB0cnVlO1xuICAgIC8qKlxyXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHtAbGluayBFZmZlY3RDb21wb3Nlcn0gc2hvdWxkIHN3YXAgdGhlIGZyYW1lXHJcbiAgICAgKiBidWZmZXJzIGFmdGVyIHRoaXMgcGFzcyBoYXMgZmluaXNoZWQgcmVuZGVyaW5nLlxyXG4gICAgICpcclxuICAgICAqIFNldCB0aGlzIHRvIGBmYWxzZWAgaWYgdGhpcyBwYXNzIGRvZXNuJ3QgcmVuZGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyIG9yXHJcbiAgICAgKiB0aGUgc2NyZWVuLiBPdGhlcndpc2UsIHRoZSBjb250ZW50cyBvZiB0aGUgaW5wdXQgYnVmZmVyIHdpbGwgYmUgbG9zdC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuXG4gICAgdGhpcy5uZWVkc1N3YXAgPSB0cnVlO1xuICB9XG4gIC8qKlxyXG4gICAqIFRoZSBmdWxsc2NyZWVuIG1hdGVyaWFsLlxyXG4gICAqXHJcbiAgICogQHR5cGUge01hdGVyaWFsfVxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoUGFzcywgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG5cbiAgICAvKipcclxuICAgICAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGlzIGFuIGFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgb3ZlcnJpZGRlbi5cclxuICAgICAqXHJcbiAgICAgKiBAYWJzdHJhY3RcclxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBBbiBlcnJvciBpcyB0aHJvd24gaWYgdGhlIG1ldGhvZCBpcyBub3Qgb3ZlcnJpZGRlbi5cclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVuZGVyIG1ldGhvZCBub3QgaW1wbGVtZW50ZWQhXCIpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhpcyBwYXNzIHdpdGggdGhlIHJlbmRlcmVyJ3Mgc2l6ZS5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIGNhc2UgeW91IHdhbnQgdG8gYmUgaW5mb3JtZWQgYWJvdXQgdGhlIG1haW5cclxuICAgICAqIHJlbmRlciBzaXplLlxyXG4gICAgICpcclxuICAgICAqIFRoZSB7QGxpbmsgRWZmZWN0Q29tcG9zZXJ9IGNhbGxzIHRoaXMgbWV0aG9kIGJlZm9yZSB0aGlzIHBhc3MgaXNcclxuICAgICAqIGluaXRpYWxpemVkIGFuZCBldmVyeSB0aW1lIGl0cyBvd24gc2l6ZSBpcyB1cGRhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSByZW5kZXJlcidzIHdpZHRoLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSByZW5kZXJlcidzIGhlaWdodC5cclxuICAgICAqIEBleGFtcGxlIHRoaXMubXlSZW5kZXJUYXJnZXQuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0U2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHt9XG4gICAgLyoqXHJcbiAgICAgKiBQZXJmb3JtcyBpbml0aWFsaXphdGlvbiB0YXNrcy5cclxuICAgICAqXHJcbiAgICAgKiBCeSBvdmVycmlkaW5nIHRoaXMgbWV0aG9kIHlvdSBnYWluIGFjY2VzcyB0byB0aGUgcmVuZGVyZXIuIFlvdSdsbCBhbHNvIGJlXHJcbiAgICAgKiBhYmxlIHRvIGNvbmZpZ3VyZSB5b3VyIGN1c3RvbSByZW5kZXIgdGFyZ2V0cyB0byB1c2UgdGhlIGFwcHJvcHJpYXRlIGZvcm1hdFxyXG4gICAgICogKFJHQiBvciBSR0JBKS5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgcHJvdmlkZWQgcmVuZGVyZXIgY2FuIGJlIHVzZWQgdG8gd2FybSB1cCBzcGVjaWFsIG9mZi1zY3JlZW4gcmVuZGVyXHJcbiAgICAgKiB0YXJnZXRzIGJ5IHBlcmZvcm1pbmcgYSBwcmVsaW1pbmFyeSByZW5kZXIgb3BlcmF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIFRoZSB7QGxpbmsgRWZmZWN0Q29tcG9zZXJ9IGNhbGxzIHRoaXMgbWV0aG9kIHdoZW4gdGhpcyBwYXNzIGlzIGFkZGVkIHRvIGl0c1xyXG4gICAgICogcXVldWUsIGJ1dCBub3QgYmVmb3JlIGl0cyBzaXplIGhhcyBiZWVuIHNldC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhbHBoYSAtIFdoZXRoZXIgdGhlIHJlbmRlcmVyIHVzZXMgdGhlIGFscGhhIGNoYW5uZWwgb3Igbm90LlxyXG4gICAgICogQGV4YW1wbGUgaWYoIWFscGhhKSB7IHRoaXMubXlSZW5kZXJUYXJnZXQudGV4dHVyZS5mb3JtYXQgPSBSR0JGb3JtYXQ7IH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW5pdGlhbGl6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSkge31cbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIGEgc2hhbGxvdyBzZWFyY2ggZm9yIHByb3BlcnRpZXMgdGhhdCBkZWZpbmUgYSBkaXNwb3NlIG1ldGhvZCBhbmRcclxuICAgICAqIGRlbGV0ZXMgdGhlbS4gVGhlIHBhc3Mgd2lsbCBiZSBpbm9wZXJhdGl2ZSBhZnRlciB0aGlzIG1ldGhvZCB3YXMgY2FsbGVkIVxyXG4gICAgICpcclxuICAgICAqIERpc3Bvc2FibGUgb2JqZWN0czpcclxuICAgICAqICAtIHJlbmRlciB0YXJnZXRzXHJcbiAgICAgKiAgLSBtYXRlcmlhbHNcclxuICAgICAqICAtIHRleHR1cmVzXHJcbiAgICAgKlxyXG4gICAgICogVGhlIHtAbGluayBFZmZlY3RDb21wb3Nlcn0gY2FsbHMgdGhpcyBtZXRob2Qgd2hlbiBpdCBpcyBiZWluZyBkZXN0cm95ZWQuXHJcbiAgICAgKiBZb3UgbWF5LCBob3dldmVyLCB1c2UgaXQgaW5kZXBlbmRlbnRseSB0byBmcmVlIG1lbW9yeSB3aGVuIHlvdSBhcmUgY2VydGFpblxyXG4gICAgICogdGhhdCB5b3UgZG9uJ3QgbmVlZCB0aGlzIHBhc3MgYW55bW9yZS5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGlzcG9zZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgdmFyIGtleTtcblxuICAgICAgdmFyIF9hcnIgPSBPYmplY3Qua2V5cyh0aGlzKTtcblxuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IF9hcnIubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIGtleSA9IF9hcnJbX2ldO1xuXG4gICAgICAgIGlmICh0aGlzW2tleV0gIT09IG51bGwgJiYgdHlwZW9mIHRoaXNba2V5XS5kaXNwb3NlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB0aGlzW2tleV0uZGlzcG9zZSgpO1xuICAgICAgICAgIHRoaXNba2V5XSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubWF0ZXJpYWwgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm1hdGVyaWFsXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5xdWFkICE9PSBudWxsID8gdGhpcy5xdWFkLm1hdGVyaWFsIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBmdWxsc2NyZWVuIG1hdGVyaWFsLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBtYXRlcmlhbCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBxdWFkIG1lc2ggdGhhdCBmaWxscyB0aGUgc2NyZWVuLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtNYXRlcmlhbH1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgaWYgKHRoaXMucXVhZCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLnF1YWQubWF0ZXJpYWwgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUGFzcztcbn0oKTtcblxuLyoqXHJcbiAqIEFuIGVmZmljaWVudCwgaW5jcmVtZW50YWwgYmx1ciBwYXNzLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIHBhc3MgYWxsb3dzIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlciB0byBiZSB0aGUgc2FtZS5cclxuICovXG5cbnZhciBCbHVyUGFzcyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1Bhc3MpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBibHVyIHBhc3MuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnJlc29sdXRpb25TY2FsZT0wLjVdIC0gVGhlIHJlbmRlciB0ZXh0dXJlIHJlc29sdXRpb24gc2NhbGUsIHJlbGF0aXZlIHRvIHRoZSBzY3JlZW4gcmVuZGVyIHNpemUuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmtlcm5lbFNpemU9S2VybmVsU2l6ZS5MQVJHRV0gLSBUaGUgYmx1ciBrZXJuZWwgc2l6ZS5cclxuICAgKi9cbiAgZnVuY3Rpb24gQmx1clBhc3MoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQmx1clBhc3MpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoQmx1clBhc3MpLmNhbGwodGhpcywgXCJCbHVyUGFzc1wiKSk7XG4gICAgLyoqXHJcbiAgICAgKiBBIHJlbmRlciB0YXJnZXQuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0WCA9IG5ldyBXZWJHTFJlbmRlclRhcmdldCgxLCAxLCB7XG4gICAgICBtaW5GaWx0ZXI6IExpbmVhckZpbHRlcixcbiAgICAgIG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLFxuICAgICAgc3RlbmNpbEJ1ZmZlcjogZmFsc2UsXG4gICAgICBkZXB0aEJ1ZmZlcjogZmFsc2VcbiAgICB9KTtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRYLnRleHR1cmUubmFtZSA9IFwiQmx1ci5UYXJnZXRYXCI7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0WC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuICAgIC8qKlxyXG4gICAgICogQSBzZWNvbmQgcmVuZGVyIHRhcmdldC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRZID0gX3RoaXMucmVuZGVyVGFyZ2V0WC5jbG9uZSgpO1xuICAgIF90aGlzLnJlbmRlclRhcmdldFkudGV4dHVyZS5uYW1lID0gXCJCbHVyLlRhcmdldFlcIjtcbiAgICAvKipcclxuICAgICAqIFRoZSByZXNvbHV0aW9uIHNjYWxlLlxyXG4gICAgICpcclxuICAgICAqIFlvdSBuZWVkIHRvIGNhbGwge0BsaW5rIEVmZmVjdENvbXBvc2VyI3NldFNpemV9IGFmdGVyIGNoYW5naW5nIHRoaXNcclxuICAgICAqIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cblxuICAgIF90aGlzLnJlc29sdXRpb25TY2FsZSA9IG9wdGlvbnMucmVzb2x1dGlvblNjYWxlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnJlc29sdXRpb25TY2FsZSA6IDAuNTtcbiAgICAvKipcclxuICAgICAqIEEgY29udm9sdXRpb24gc2hhZGVyIG1hdGVyaWFsLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtDb252b2x1dGlvbk1hdGVyaWFsfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMuY29udm9sdXRpb25NYXRlcmlhbCA9IG5ldyBDb252b2x1dGlvbk1hdGVyaWFsKCk7XG4gICAgLyoqXHJcbiAgICAgKiBBIGNvbnZvbHV0aW9uIHNoYWRlciBtYXRlcmlhbCB0aGF0IHVzZXMgZGl0aGVyaW5nLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtDb252b2x1dGlvbk1hdGVyaWFsfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMuZGl0aGVyZWRDb252b2x1dGlvbk1hdGVyaWFsID0gbmV3IENvbnZvbHV0aW9uTWF0ZXJpYWwoKTtcbiAgICBfdGhpcy5kaXRoZXJlZENvbnZvbHV0aW9uTWF0ZXJpYWwuZGl0aGVyaW5nID0gdHJ1ZTtcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgdGhlIGJsdXJyZWQgcmVzdWx0IHNob3VsZCBhbHNvIGJlIGRpdGhlcmVkIHVzaW5nIG5vaXNlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5kaXRoZXJpbmcgPSBmYWxzZTtcbiAgICBfdGhpcy5rZXJuZWxTaXplID0gb3B0aW9ucy5rZXJuZWxTaXplO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBUaGUgYWJzb2x1dGUgd2lkdGggb2YgdGhlIGludGVybmFsIHJlbmRlciB0YXJnZXRzLlxyXG4gICAqXHJcbiAgICogQHR5cGUge051bWJlcn1cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKEJsdXJQYXNzLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcblxuICAgIC8qKlxyXG4gICAgICogQmx1cnMgdGhlIGlucHV0IGJ1ZmZlciBhbmQgd3JpdGVzIHRoZSByZXN1bHQgdG8gdGhlIG91dHB1dCBidWZmZXIuIFRoZVxyXG4gICAgICogaW5wdXQgYnVmZmVyIHJlbWFpbnMgaW50YWN0LCB1bmxlc3MgaXRzIGFsc28gdGhlIG91dHB1dCBidWZmZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XG4gICAgICB2YXIgc2NlbmUgPSB0aGlzLnNjZW5lO1xuICAgICAgdmFyIGNhbWVyYSA9IHRoaXMuY2FtZXJhO1xuICAgICAgdmFyIHJlbmRlclRhcmdldFggPSB0aGlzLnJlbmRlclRhcmdldFg7XG4gICAgICB2YXIgcmVuZGVyVGFyZ2V0WSA9IHRoaXMucmVuZGVyVGFyZ2V0WTtcbiAgICAgIHZhciBtYXRlcmlhbCA9IHRoaXMuY29udm9sdXRpb25NYXRlcmlhbDtcbiAgICAgIHZhciB1bmlmb3JtcyA9IG1hdGVyaWFsLnVuaWZvcm1zO1xuICAgICAgdmFyIGtlcm5lbCA9IG1hdGVyaWFsLmdldEtlcm5lbCgpO1xuICAgICAgdmFyIGxhc3RSVCA9IGlucHV0QnVmZmVyO1xuICAgICAgdmFyIGRlc3RSVDtcbiAgICAgIHZhciBpLCBsO1xuICAgICAgdGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsOyAvLyBBcHBseSB0aGUgbXVsdGktcGFzcyBibHVyLlxuXG4gICAgICBmb3IgKGkgPSAwLCBsID0ga2VybmVsLmxlbmd0aCAtIDE7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgLy8gQWx0ZXJuYXRlIGJldHdlZW4gdGFyZ2V0cy5cbiAgICAgICAgZGVzdFJUID0gaSAlIDIgPT09IDAgPyByZW5kZXJUYXJnZXRYIDogcmVuZGVyVGFyZ2V0WTtcbiAgICAgICAgdW5pZm9ybXMua2VybmVsLnZhbHVlID0ga2VybmVsW2ldO1xuICAgICAgICB1bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGxhc3RSVC50ZXh0dXJlO1xuICAgICAgICByZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYSwgZGVzdFJUKTtcbiAgICAgICAgbGFzdFJUID0gZGVzdFJUO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5kaXRoZXJpbmcpIHtcbiAgICAgICAgbWF0ZXJpYWwgPSB0aGlzLmRpdGhlcmVkQ29udm9sdXRpb25NYXRlcmlhbDtcbiAgICAgICAgdW5pZm9ybXMgPSBtYXRlcmlhbC51bmlmb3JtcztcbiAgICAgICAgdGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuICAgICAgfVxuXG4gICAgICB1bmlmb3Jtcy5rZXJuZWwudmFsdWUgPSBrZXJuZWxbaV07XG4gICAgICB1bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGxhc3RSVC50ZXh0dXJlO1xuICAgICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBzaXplIG9mIHRoaXMgcGFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0U2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcih3aWR0aCAqIHRoaXMucmVzb2x1dGlvblNjYWxlKSk7XG4gICAgICBoZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKGhlaWdodCAqIHRoaXMucmVzb2x1dGlvblNjYWxlKSk7XG4gICAgICB0aGlzLnJlbmRlclRhcmdldFguc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHRoaXMucmVuZGVyVGFyZ2V0WS5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5jb252b2x1dGlvbk1hdGVyaWFsLnNldFRleGVsU2l6ZSgxLjAgLyB3aWR0aCwgMS4wIC8gaGVpZ2h0KTtcbiAgICAgIHRoaXMuZGl0aGVyZWRDb252b2x1dGlvbk1hdGVyaWFsLnNldFRleGVsU2l6ZSgxLjAgLyB3aWR0aCwgMS4wIC8gaGVpZ2h0KTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBQZXJmb3JtcyBpbml0aWFsaXphdGlvbiB0YXNrcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhbHBoYSAtIFdoZXRoZXIgdGhlIHJlbmRlcmVyIHVzZXMgdGhlIGFscGhhIGNoYW5uZWwgb3Igbm90LlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpbml0aWFsaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKSB7XG4gICAgICBpZiAoIWFscGhhKSB7XG4gICAgICAgIHRoaXMucmVuZGVyVGFyZ2V0WC50ZXh0dXJlLmZvcm1hdCA9IFJHQkZvcm1hdDtcbiAgICAgICAgdGhpcy5yZW5kZXJUYXJnZXRZLnRleHR1cmUuZm9ybWF0ID0gUkdCRm9ybWF0O1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ3aWR0aFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyVGFyZ2V0WC53aWR0aDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYWJzb2x1dGUgaGVpZ2h0IG9mIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0cy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJoZWlnaHRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlclRhcmdldFguaGVpZ2h0O1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFRoZSBrZXJuZWwgc2l6ZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7S2VybmVsU2l6ZX1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwia2VybmVsU2l6ZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udm9sdXRpb25NYXRlcmlhbC5rZXJuZWxTaXplO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEB0eXBlIHtLZXJuZWxTaXplfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBLZXJuZWxTaXplLkxBUkdFO1xuICAgICAgdGhpcy5jb252b2x1dGlvbk1hdGVyaWFsLmtlcm5lbFNpemUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuZGl0aGVyZWRDb252b2x1dGlvbk1hdGVyaWFsLmtlcm5lbFNpemUgPSB2YWx1ZTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhCbHVyUGFzcywgX1Bhc3MpO1xuXG4gIHJldHVybiBCbHVyUGFzcztcbn0oUGFzcyk7XG5cbi8qKlxyXG4gKiBBIGJsb29tIHBhc3MuXHJcbiAqXHJcbiAqIFRoaXMgcGFzcyByZW5kZXJzIGEgc2NlbmUgd2l0aCBzdXBlcmltcG9zZWQgYmx1ciBieSB1dGlsaXppbmcgdGhlIGZhc3QgS2F3YXNlXHJcbiAqIGNvbnZvbHV0aW9uIGFwcHJvYWNoLlxyXG4gKi9cblxudmFyIEJsb29tUGFzcyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1Bhc3MpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBibG9vbSBwYXNzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5yZXNvbHV0aW9uU2NhbGU9MC41XSAtIFRoZSByZW5kZXIgdGV4dHVyZSByZXNvbHV0aW9uIHNjYWxlLCByZWxhdGl2ZSB0byB0aGUgc2NyZWVuIHJlbmRlciBzaXplLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5rZXJuZWxTaXplPUtlcm5lbFNpemUuTEFSR0VdIC0gVGhlIGJsdXIga2VybmVsIHNpemUuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmludGVuc2l0eT0xLjBdIC0gVGhlIHN0cmVuZ3RoIG9mIHRoZSBibG9vbSBlZmZlY3QuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRpc3RpbmN0aW9uPTEuMF0gLSBUaGUgbHVtaW5hbmNlIGRpc3RpbmN0aW9uIGZhY3Rvci4gUmFpc2UgdGhpcyB2YWx1ZSB0byBicmluZyBvdXQgdGhlIGJyaWdodGVyIGVsZW1lbnRzIGluIHRoZSBzY2VuZS5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc2NyZWVuTW9kZT10cnVlXSAtIFdoZXRoZXIgdGhlIHNjcmVlbiBibGVuZCBtb2RlIHNob3VsZCBiZSB1c2VkIGZvciBjb21iaW5pbmcgdGhlIGJsb29tIHRleHR1cmUgd2l0aCB0aGUgc2NlbmUgY29sb3JzLlxyXG4gICAqL1xuICBmdW5jdGlvbiBCbG9vbVBhc3MoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQmxvb21QYXNzKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKEJsb29tUGFzcykuY2FsbCh0aGlzLCBcIkJsb29tUGFzc1wiKSk7XG4gICAgLyoqXHJcbiAgICAgKiBBIHJlbmRlciB0YXJnZXQuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0ID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KDEsIDEsIHtcbiAgICAgIG1pbkZpbHRlcjogTGluZWFyRmlsdGVyLFxuICAgICAgbWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG4gICAgICBzdGVuY2lsQnVmZmVyOiBmYWxzZSxcbiAgICAgIGRlcHRoQnVmZmVyOiBmYWxzZVxuICAgIH0pO1xuICAgIF90aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLm5hbWUgPSBcIkJsb29tLlRhcmdldFwiO1xuICAgIF90aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuICAgIC8qKlxyXG4gICAgICogQSBibHVyIHBhc3MuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0JsdXJQYXNzfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMuYmx1clBhc3MgPSBuZXcgQmx1clBhc3Mob3B0aW9ucyk7XG4gICAgLyoqXHJcbiAgICAgKiBBIGNvbWJpbmUgc2hhZGVyIG1hdGVyaWFsLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtDb21iaW5lTWF0ZXJpYWx9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5jb21iaW5lTWF0ZXJpYWwgPSBuZXcgQ29tYmluZU1hdGVyaWFsKG9wdGlvbnMuc2NyZWVuTW9kZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5zY3JlZW5Nb2RlIDogdHJ1ZSk7XG4gICAgX3RoaXMuaW50ZW5zaXR5ID0gb3B0aW9ucy5pbnRlbnNpdHk7XG4gICAgLyoqXHJcbiAgICAgKiBBIGx1bWlub3NpdHkgc2hhZGVyIG1hdGVyaWFsLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtMdW1pbm9zaXR5TWF0ZXJpYWx9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5sdW1pbm9zaXR5TWF0ZXJpYWwgPSBuZXcgTHVtaW5vc2l0eU1hdGVyaWFsKHRydWUpO1xuICAgIF90aGlzLmRpc3RpbmN0aW9uID0gb3B0aW9ucy5kaXN0aW5jdGlvbjtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogVGhlIHJlc29sdXRpb24gc2NhbGUuXHJcbiAgICpcclxuICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoQmxvb21QYXNzLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcblxuICAgIC8qKlxyXG4gICAgICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xuICAgICAgdmFyIHNjZW5lID0gdGhpcy5zY2VuZTtcbiAgICAgIHZhciBjYW1lcmEgPSB0aGlzLmNhbWVyYTtcbiAgICAgIHZhciBibHVyUGFzcyA9IHRoaXMuYmx1clBhc3M7XG4gICAgICB2YXIgbHVtaW5vc2l0eU1hdGVyaWFsID0gdGhpcy5sdW1pbm9zaXR5TWF0ZXJpYWw7XG4gICAgICB2YXIgY29tYmluZU1hdGVyaWFsID0gdGhpcy5jb21iaW5lTWF0ZXJpYWw7XG4gICAgICB2YXIgcmVuZGVyVGFyZ2V0ID0gdGhpcy5yZW5kZXJUYXJnZXQ7IC8vIEx1bWluYW5jZSBmaWx0ZXIuXG5cbiAgICAgIHRoaXMubWF0ZXJpYWwgPSBsdW1pbm9zaXR5TWF0ZXJpYWw7XG4gICAgICBsdW1pbm9zaXR5TWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xuICAgICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldCk7IC8vIENvbnZvbHV0aW9uIHBoYXNlLlxuXG4gICAgICBibHVyUGFzcy5yZW5kZXIocmVuZGVyZXIsIHJlbmRlclRhcmdldCwgcmVuZGVyVGFyZ2V0KTtcblxuICAgICAgaWYgKHRoaXMuYmxlbmQpIHtcbiAgICAgICAgLy8gUmVuZGVyIHRoZSBvcmlnaW5hbCBzY2VuZSB3aXRoIHN1cGVyaW1wb3NlZCBibHVyLlxuICAgICAgICB0aGlzLm1hdGVyaWFsID0gY29tYmluZU1hdGVyaWFsO1xuICAgICAgICBjb21iaW5lTWF0ZXJpYWwudW5pZm9ybXMudGV4dHVyZTEudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xuICAgICAgICBjb21iaW5lTWF0ZXJpYWwudW5pZm9ybXMudGV4dHVyZTIudmFsdWUgPSByZW5kZXJUYXJnZXQudGV4dHVyZTtcbiAgICAgICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBzaXplIG9mIHRoaXMgcGFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0U2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHRoaXMuYmx1clBhc3Muc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHdpZHRoID0gdGhpcy5ibHVyUGFzcy53aWR0aDtcbiAgICAgIGhlaWdodCA9IHRoaXMuYmx1clBhc3MuaGVpZ2h0O1xuICAgICAgdGhpcy5yZW5kZXJUYXJnZXQuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBQZXJmb3JtcyBpbml0aWFsaXphdGlvbiB0YXNrcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhbHBoYSAtIFdoZXRoZXIgdGhlIHJlbmRlcmVyIHVzZXMgdGhlIGFscGhhIGNoYW5uZWwgb3Igbm90LlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpbml0aWFsaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKSB7XG4gICAgICB0aGlzLmJsdXJQYXNzLmluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKTtcblxuICAgICAgaWYgKCFhbHBoYSkge1xuICAgICAgICB0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLmZvcm1hdCA9IFJHQkZvcm1hdDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzb2x1dGlvblNjYWxlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5ibHVyUGFzcy5yZXNvbHV0aW9uU2NhbGU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogWW91IG5lZWQgdG8gY2FsbCB7QGxpbmsgRWZmZWN0Q29tcG9zZXIjc2V0U2l6ZX0gYWZ0ZXIgY2hhbmdpbmcgdGhpcyB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAwLjU7XG4gICAgICB0aGlzLmJsdXJQYXNzLnJlc29sdXRpb25TY2FsZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFRoZSBibHVyIGtlcm5lbCBzaXplLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtLZXJuZWxTaXplfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJrZXJuZWxTaXplXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5ibHVyUGFzcy5rZXJuZWxTaXplO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEB0eXBlIHtLZXJuZWxTaXplfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBLZXJuZWxTaXplLkxBUkdFO1xuICAgICAgdGhpcy5ibHVyUGFzcy5rZXJuZWxTaXplID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVGhlIG92ZXJhbGwgaW50ZW5zaXR5IG9mIHRoZSBlZmZlY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW50ZW5zaXR5XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21iaW5lTWF0ZXJpYWwudW5pZm9ybXMub3BhY2l0eTIudmFsdWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMS4wO1xuICAgICAgdGhpcy5jb21iaW5lTWF0ZXJpYWwudW5pZm9ybXMub3BhY2l0eTIudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbHVtaW5hbmNlIGRpc3RpbmN0aW9uIGZhY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkaXN0aW5jdGlvblwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMubHVtaW5vc2l0eU1hdGVyaWFsLnVuaWZvcm1zLmRpc3RpbmN0aW9uLnZhbHVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDEuMDtcbiAgICAgIHRoaXMubHVtaW5vc2l0eU1hdGVyaWFsLnVuaWZvcm1zLmRpc3RpbmN0aW9uLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgZGl0aGVyaW5nIGlzIGVuYWJsZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRpdGhlcmluZ1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuYmx1clBhc3MuZGl0aGVyaW5nO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIElmIGVuYWJsZWQsIHRoZSByZXN1bHQgd2lsbCBiZSBkaXRoZXJlZCB0byByZW1vdmUgYmFuZGluZyBhcnRpZmFjdHMuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIHRoaXMuYmx1clBhc3MuZGl0aGVyaW5nID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVmZmVjdCBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgaW5wdXQgYnVmZmVyLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJibGVuZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMubmVlZHNTd2FwO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIElmIGRpc2FibGVkLCB0aGUgaW5wdXQgYnVmZmVyIHdpbGwgcmVtYWluIHVuYWZmZWN0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogWW91IG1heSB1c2UgdGhlIHtAbGluayBCbG9vbVBhc3Mjb3ZlcmxheX0gdGV4dHVyZSB0byBhcHBseSB0aGUgZWZmZWN0IHRvXHJcbiAgICAgKiB5b3VyIHNjZW5lLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICB0aGlzLm5lZWRzU3dhcCA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFRoZSBlZmZlY3Qgb3ZlcmxheSB0ZXh0dXJlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtUZXh0dXJlfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvdmVybGF5XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhCbG9vbVBhc3MsIF9QYXNzKTtcblxuICByZXR1cm4gQmxvb21QYXNzO1xufShQYXNzKTtcblxuLyoqXHJcbiAqIEEgRGVwdGggb2YgRmllbGQgKERvRikgcGFzcyB1c2luZyBhIGJva2VoIHNoYWRlci5cclxuICpcclxuICogVGhpcyBwYXNzIHJlcXVpcmVzIGEge0BsaW5rIEVmZmVjdENvbXBvc2VyI2RlcHRoVGV4dHVyZX0uXHJcbiAqL1xuXG52YXIgQm9rZWhQYXNzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUGFzcykge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGJva2VoIHBhc3MuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1BlcnNwZWN0aXZlQ2FtZXJhfSBjYW1lcmEgLSBUaGUgbWFpbiBjYW1lcmEuIFVzZWQgdG8gb2J0YWluIHRoZSBhc3BlY3QgcmF0aW8gYW5kIHRoZSBuZWFyIGFuZCBmYXIgcGxhbmUgc2V0dGluZ3MuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIEFkZGl0aW9uYWwgcGFyYW1ldGVycy4gU2VlIHtAbGluayBCb2tlaE1hdGVyaWFsfSBmb3IgZGV0YWlscy5cclxuICAgKi9cbiAgZnVuY3Rpb24gQm9rZWhQYXNzKGNhbWVyYSkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEJva2VoUGFzcyk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihCb2tlaFBhc3MpLmNhbGwodGhpcywgXCJCb2tlaFBhc3NcIikpO1xuICAgIF90aGlzLm1hdGVyaWFsID0gbmV3IEJva2VoTWF0ZXJpYWwoY2FtZXJhLCBvcHRpb25zKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKEJva2VoUGFzcywgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XG4gICAgICB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcbiAgICAgIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudERlcHRoLnZhbHVlID0gaW5wdXRCdWZmZXIuZGVwdGhUZXh0dXJlO1xuICAgICAgcmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFNpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLmFzcGVjdC52YWx1ZSA9IHdpZHRoIC8gaGVpZ2h0O1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKEJva2VoUGFzcywgX1Bhc3MpO1xuXG4gIHJldHVybiBCb2tlaFBhc3M7XG59KFBhc3MpO1xuXG4vKipcclxuICogQSBwYXNzIHRoYXQgZGlzYWJsZXMgdGhlIHN0ZW5jaWwgdGVzdC5cclxuICovXG5cbnZhciBDbGVhck1hc2tQYXNzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUGFzcykge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGNsZWFyIG1hc2sgcGFzcy5cclxuICAgKi9cbiAgZnVuY3Rpb24gQ2xlYXJNYXNrUGFzcygpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDbGVhck1hc2tQYXNzKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKENsZWFyTWFza1Bhc3MpLmNhbGwodGhpcywgXCJDbGVhck1hc2tQYXNzXCIsIG51bGwsIG51bGwsIG51bGwpKTtcbiAgICBfdGhpcy5uZWVkc1N3YXAgPSBmYWxzZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogRGlzYWJsZXMgdGhlIGdsb2JhbCBzdGVuY2lsIHRlc3QuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoQ2xlYXJNYXNrUGFzcywgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XG4gICAgICByZW5kZXJlci5zdGF0ZS5idWZmZXJzLnN0ZW5jaWwuc2V0VGVzdChmYWxzZSk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoQ2xlYXJNYXNrUGFzcywgX1Bhc3MpO1xuXG4gIHJldHVybiBDbGVhck1hc2tQYXNzO1xufShQYXNzKTtcblxuLyoqXHJcbiAqIFVzZWQgZm9yIHNhdmluZyB0aGUgb3JpZ2luYWwgY2xlYXIgY29sb3Igb2YgdGhlIHJlbmRlcmVyLlxyXG4gKlxyXG4gKiBAdHlwZSB7Q29sb3J9XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG52YXIgY29sb3IgPSBuZXcgQ29sb3IoKTtcbi8qKlxyXG4gKiBBIHBhc3MgdGhhdCBjbGVhcnMgdGhlIGlucHV0IGJ1ZmZlciBvciB0aGUgc2NyZWVuLlxyXG4gKlxyXG4gKiBZb3UgY2FuIHByZXZlbnQgc3BlY2lmaWMgYml0cyBmcm9tIGJlaW5nIGNsZWFyZWQgYnkgc2V0dGluZyBlaXRoZXIgdGhlXHJcbiAqIGF1dG9DbGVhckNvbG9yLCBhdXRvQ2xlYXJTdGVuY2lsIG9yIGF1dG9DbGVhckRlcHRoIHByb3BlcnRpZXMgb2YgdGhlIHJlbmRlcmVyXHJcbiAqIHRvIGZhbHNlLlxyXG4gKi9cblxudmFyIENsZWFyUGFzcyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1Bhc3MpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBjbGVhciBwYXNzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIEFkZGl0aW9uYWwgb3B0aW9ucy5cclxuICAgKiBAcGFyYW0ge0NvbG9yfSBbb3B0aW9ucy5jbGVhckNvbG9yPW51bGxdIC0gQW4gb3ZlcnJpZGUgY2xlYXIgY29sb3IuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmNsZWFyQWxwaGE9MC4wXSAtIEFuIG92ZXJyaWRlIGNsZWFyIGFscGhhLlxyXG4gICAqL1xuICBmdW5jdGlvbiBDbGVhclBhc3MoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2xlYXJQYXNzKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKENsZWFyUGFzcykuY2FsbCh0aGlzLCBcIkNsZWFyUGFzc1wiLCBudWxsLCBudWxsLCBudWxsKSk7XG4gICAgX3RoaXMubmVlZHNTd2FwID0gZmFsc2U7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY2xlYXIgY29sb3IuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0NvbG9yfVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5jbGVhckNvbG9yID0gb3B0aW9ucy5jbGVhckNvbG9yICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmNsZWFyQ29sb3IgOiBudWxsO1xuICAgIC8qKlxyXG4gICAgICogVGhlIGNsZWFyIGFscGhhLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cblxuICAgIF90aGlzLmNsZWFyQWxwaGEgPSBvcHRpb25zLmNsZWFyQWxwaGEgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY2xlYXJBbHBoYSA6IDAuMDtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogQ2xlYXJzIHRoZSBpbnB1dCBidWZmZXIgb3IgdGhlIHNjcmVlbi5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhDbGVhclBhc3MsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xuICAgICAgdmFyIGNsZWFyQ29sb3IgPSB0aGlzLmNsZWFyQ29sb3I7XG4gICAgICB2YXIgY2xlYXJBbHBoYTtcblxuICAgICAgaWYgKGNsZWFyQ29sb3IgIT09IG51bGwpIHtcbiAgICAgICAgY29sb3IuY29weShyZW5kZXJlci5nZXRDbGVhckNvbG9yKCkpO1xuICAgICAgICBjbGVhckFscGhhID0gcmVuZGVyZXIuZ2V0Q2xlYXJBbHBoYSgpO1xuICAgICAgICByZW5kZXJlci5zZXRDbGVhckNvbG9yKGNsZWFyQ29sb3IsIHRoaXMuY2xlYXJBbHBoYSk7XG4gICAgICB9XG5cbiAgICAgIHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCh0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IGlucHV0QnVmZmVyKTtcbiAgICAgIHJlbmRlcmVyLmNsZWFyKCk7XG5cbiAgICAgIGlmIChjbGVhckNvbG9yICE9PSBudWxsKSB7XG4gICAgICAgIHJlbmRlcmVyLnNldENsZWFyQ29sb3IoY29sb3IsIGNsZWFyQWxwaGEpO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKENsZWFyUGFzcywgX1Bhc3MpO1xuXG4gIHJldHVybiBDbGVhclBhc3M7XG59KFBhc3MpO1xuXG4vKipcclxuICogQSBkb3Qgc2NyZWVuIHBhc3MuXHJcbiAqL1xuXG52YXIgRG90U2NyZWVuUGFzcyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1Bhc3MpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBkb3Qgc2NyZWVuIHBhc3MuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hdmVyYWdlPWZhbHNlXSAtIFdoZXRoZXIgdGhlIHNoYWRlciBzaG91bGQgb3V0cHV0IGEgY29sb3VyIGF2ZXJhZ2UgKGJsYWNrIGFuZCB3aGl0ZSkuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmFuZ2xlPTEuNTddIC0gVGhlIGFuZ2xlIG9mIHRoZSBwYXR0ZXJuLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5zY2FsZT0xLjBdIC0gVGhlIHNjYWxlIG9mIHRoZSBvdmVyYWxsIGVmZmVjdC5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaW50ZW5zaXR5PTEuMF0gLSBUaGUgaW50ZW5zaXR5IG9mIHRoZSBlZmZlY3QuXHJcbiAgICovXG4gIGZ1bmN0aW9uIERvdFNjcmVlblBhc3MoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRG90U2NyZWVuUGFzcyk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihEb3RTY3JlZW5QYXNzKS5jYWxsKHRoaXMsIFwiRG90U2NyZWVuUGFzc1wiKSk7XG4gICAgX3RoaXMubWF0ZXJpYWwgPSBuZXcgRG90U2NyZWVuTWF0ZXJpYWwob3B0aW9ucyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhEb3RTY3JlZW5QYXNzLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcbiAgICAgIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xuICAgICAgcmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFNpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICB3aWR0aCA9IE1hdGgubWF4KDEsIHdpZHRoKTtcbiAgICAgIGhlaWdodCA9IE1hdGgubWF4KDEsIGhlaWdodCk7XG4gICAgICB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLm9mZnNldFJlcGVhdC52YWx1ZS56ID0gd2lkdGg7XG4gICAgICB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLm9mZnNldFJlcGVhdC52YWx1ZS53ID0gaGVpZ2h0O1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKERvdFNjcmVlblBhc3MsIF9QYXNzKTtcblxuICByZXR1cm4gRG90U2NyZWVuUGFzcztcbn0oUGFzcyk7XG5cbi8qKlxyXG4gKiBBIGZpbG0gcGFzcy5cclxuICpcclxuICogUHJvdmlkZXMgdmFyaW91cyBjaW5lbWF0aWMgZWZmZWN0cy5cclxuICovXG5cbnZhciBGaWxtUGFzcyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1Bhc3MpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBmaWxtIHBhc3MuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuIFNlZSB7QGxpbmsgRmlsbU1hdGVyaWFsfSBmb3IgbW9yZSBvcHRpb25zLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5zY2FubGluZURlbnNpdHk9MS4yNV0gLSBUaGUgc2NhbmxpbmUgZGVuc2l0eSwgcmVsYXRpdmUgdG8gdGhlIHNjcmVlbiBoZWlnaHQuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmdyaWRTY2FsZT0xLjBdIC0gVGhlIGdyaWQgc2NhbGUsIHJlbGF0aXZlIHRvIHRoZSBzY3JlZW4gaGVpZ2h0LlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5ncmlkTGluZVdpZHRoPTAuMF0gLSBUaGUgZ3JpZCBsaW5lIHdpZHRoLiBUaGlzIHZhbHVlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGJhc2UgbGluZSB3aWR0aC5cclxuICAgKi9cbiAgZnVuY3Rpb24gRmlsbVBhc3MoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRmlsbVBhc3MpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoRmlsbVBhc3MpLmNhbGwodGhpcywgXCJGaWxtUGFzc1wiKSk7XG4gICAgX3RoaXMubWF0ZXJpYWwgPSBuZXcgRmlsbU1hdGVyaWFsKG9wdGlvbnMpO1xuICAgIC8qKlxyXG4gICAgICogVGhlIGFtb3VudCBvZiBzY2FubGluZXMsIHJlbGF0aXZlIHRvIHRoZSBzY3JlZW4gaGVpZ2h0LlxyXG4gICAgICpcclxuICAgICAqIFlvdSBuZWVkIHRvIGNhbGwge0BsaW5rIEVmZmVjdENvbXBvc2VyI3NldFNpemV9IGFmdGVyIGNoYW5naW5nIHRoaXNcclxuICAgICAqIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cblxuICAgIF90aGlzLnNjYW5saW5lRGVuc2l0eSA9IG9wdGlvbnMuc2NhbmxpbmVEZW5zaXR5ID09PSB1bmRlZmluZWQgPyAxLjI1IDogb3B0aW9ucy5zY2FubGluZURlbnNpdHk7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZ3JpZCBzY2FsZSwgcmVsYXRpdmUgdG8gdGhlIHNjcmVlbiBoZWlnaHQuXHJcbiAgICAgKlxyXG4gICAgICogWW91IG5lZWQgdG8gY2FsbCB7QGxpbmsgRWZmZWN0Q29tcG9zZXIjc2V0U2l6ZX0gYWZ0ZXIgY2hhbmdpbmcgdGhpc1xyXG4gICAgICogdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuXG4gICAgX3RoaXMuZ3JpZFNjYWxlID0gb3B0aW9ucy5ncmlkU2NhbGUgPT09IHVuZGVmaW5lZCA/IDEuMCA6IE1hdGgubWF4KG9wdGlvbnMuZ3JpZFNjYWxlLCAxZS02KTtcbiAgICAvKipcclxuICAgICAqIFRoZSBncmlkIGxpbmUgd2lkdGguXHJcbiAgICAgKlxyXG4gICAgICogWW91IG5lZWQgdG8gY2FsbCB7QGxpbmsgRWZmZWN0Q29tcG9zZXIjc2V0U2l6ZX0gYWZ0ZXIgY2hhbmdpbmcgdGhpc1xyXG4gICAgICogdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuXG4gICAgX3RoaXMuZ3JpZExpbmVXaWR0aCA9IG9wdGlvbnMuZ3JpZExpbmVXaWR0aCA9PT0gdW5kZWZpbmVkID8gMC4wIDogTWF0aC5tYXgob3B0aW9ucy5ncmlkTGluZVdpZHRoLCAwLjApO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoRmlsbVBhc3MsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xuICAgICAgdGhpcy5tYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XG4gICAgICB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnRpbWUudmFsdWUgKz0gZGVsdGE7XG4gICAgICByZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBzaXplIG9mIHRoaXMgcGFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0U2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHZhciBhc3BlY3QgPSB3aWR0aCAvIGhlaWdodDtcbiAgICAgIHZhciBncmlkU2NhbGUgPSB0aGlzLmdyaWRTY2FsZSAqIChoZWlnaHQgKiAwLjEyNSk7XG4gICAgICB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnNjYW5saW5lQ291bnQudmFsdWUgPSBNYXRoLnJvdW5kKGhlaWdodCAqIHRoaXMuc2NhbmxpbmVEZW5zaXR5KTtcbiAgICAgIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMuZ3JpZFNjYWxlLnZhbHVlLnNldChhc3BlY3QgKiBncmlkU2NhbGUsIGdyaWRTY2FsZSk7XG4gICAgICB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLmdyaWRMaW5lV2lkdGgudmFsdWUgPSBncmlkU2NhbGUgLyBoZWlnaHQgKyB0aGlzLmdyaWRMaW5lV2lkdGg7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoRmlsbVBhc3MsIF9QYXNzKTtcblxuICByZXR1cm4gRmlsbVBhc3M7XG59KFBhc3MpO1xuXG4vKipcclxuICogUmV0dXJucyBhIHJhbmRvbSBpbnRlZ2VyIGluIHRoZSBzcGVjaWZpZWQgcmFuZ2UuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBsb3cgLSBUaGUgbG93ZXN0IHBvc3NpYmxlIHZhbHVlLlxyXG4gKiBAcGFyYW0ge051bWJlcn0gaGlnaCAtIFRoZSBoaWdoZXN0IHBvc3NpYmxlIHZhbHVlLlxyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSByYW5kb20gdmFsdWUuXHJcbiAqL1xuXG5mdW5jdGlvbiByYW5kb21JbnQobG93LCBoaWdoKSB7XG4gIHJldHVybiBsb3cgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoaGlnaCAtIGxvdyArIDEpKTtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIGEgcmFuZG9tIGZsb2F0IGluIHRoZSBzcGVjaWZpZWQgcmFuZ2UuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBsb3cgLSBUaGUgbG93ZXN0IHBvc3NpYmxlIHZhbHVlLlxyXG4gKiBAcGFyYW0ge051bWJlcn0gaGlnaCAtIFRoZSBoaWdoZXN0IHBvc3NpYmxlIHZhbHVlLlxyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSByYW5kb20gdmFsdWUuXHJcbiAqL1xuXG5cbmZ1bmN0aW9uIHJhbmRvbUZsb2F0KGxvdywgaGlnaCkge1xuICByZXR1cm4gbG93ICsgTWF0aC5yYW5kb20oKSAqIChoaWdoIC0gbG93KTtcbn1cbi8qKlxyXG4gKiBBIGdsaXRjaCBwYXNzLlxyXG4gKi9cblxuXG52YXIgR2xpdGNoUGFzcyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1Bhc3MpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBnbGl0Y2ggcGFzcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBUaGUgb3B0aW9ucy5cclxuICAgKiBAcGFyYW0ge1RleHR1cmV9IFtvcHRpb25zLnBlcnR1cmJNYXBdIC0gQSBwZXJ0dXJiYXRpb24gbWFwLiBJZiBub25lIGlzIHByb3ZpZGVkLCBhIG5vaXNlIHRleHR1cmUgd2lsbCBiZSBjcmVhdGVkLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kdFNpemU9NjRdIC0gVGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBub2lzZSBtYXAuIFdpbGwgYmUgaWdub3JlZCBpZiBhIHBlcnR1cmJhdGlvbiBtYXAgaXMgcHJvdmlkZWQuXHJcbiAgICovXG4gIGZ1bmN0aW9uIEdsaXRjaFBhc3MoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgR2xpdGNoUGFzcyk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihHbGl0Y2hQYXNzKS5jYWxsKHRoaXMsIFwiR2xpdGNoUGFzc1wiKSk7XG4gICAgX3RoaXMubWF0ZXJpYWwgPSBuZXcgR2xpdGNoTWF0ZXJpYWwoKTtcbiAgICAvKipcclxuICAgICAqIEEgcGVydHVyYmF0aW9uIG1hcC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7VGV4dHVyZX1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnRleHR1cmUgPSBudWxsO1xuICAgIF90aGlzLnBlcnR1cmJNYXAgPSBvcHRpb25zLnBlcnR1cmJNYXAgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMucGVydHVyYk1hcCA6IF90aGlzLmdlbmVyYXRlUGVydHVyYk1hcChvcHRpb25zLmR0U2l6ZSk7XG4gICAgX3RoaXMucGVydHVyYk1hcC5uYW1lID0gXCJHbGl0Y2guUGVydHVyYmF0aW9uXCI7XG4gICAgX3RoaXMucGVydHVyYk1hcC5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIFRoZSBlZmZlY3QgbW9kZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7R2xpdGNoTW9kZX1cclxuICAgICAqL1xuXG4gICAgX3RoaXMubW9kZSA9IEdsaXRjaE1vZGUuU1BPUkFESUM7XG4gICAgLyoqXHJcbiAgICAgKiBBIGNvdW50ZXIgZm9yIHRoZSBnbGl0Y2ggYWN0aXZhdGlvbiBhbmQgZGVhY3RpdmF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5jb3VudGVyID0gMDtcbiAgICAvKipcclxuICAgICAqIEEgcmFuZG9tIGJyZWFrIHBvaW50IGZvciB0aGUgc3BvcmFkaWMgZ2xpdGNoIGFjdGl2YXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLmJyZWFrUG9pbnQgPSByYW5kb21JbnQoMTIwLCAyNDApO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBUaGUgY3VycmVudCBwZXJ0dXJiYXRpb24gbWFwLlxyXG4gICAqXHJcbiAgICogQHR5cGUge1RleHR1cmV9XHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhHbGl0Y2hQYXNzLCBbe1xuICAgIGtleTogXCJnZW5lcmF0ZVBlcnR1cmJNYXBcIixcblxuICAgIC8qKlxyXG4gICAgICogRGVzdHJveXMgdGhlIGN1cnJlbnQgcGVydHVyYmF0aW9uIG1hcCBhbmQgcmVwbGFjZXMgaXQgd2l0aCBhIG5ldyBvbmUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtzaXplPTY0XSAtIFRoZSB0ZXh0dXJlIHNpemUuXHJcbiAgICAgKiBAcmV0dXJuIHtEYXRhVGV4dHVyZX0gVGhlIHBlcnR1cmJhdGlvbiB0ZXh0dXJlLlxyXG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdlbmVyYXRlUGVydHVyYk1hcCgpIHtcbiAgICAgIHZhciBzaXplID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiA2NDtcbiAgICAgIHZhciBwaXhlbHMgPSBzaXplICogc2l6ZTtcbiAgICAgIHZhciBkYXRhID0gbmV3IEZsb2F0MzJBcnJheShwaXhlbHMgKiAzKTtcbiAgICAgIHZhciBkdCA9IHRoaXMucGVydHVyYk1hcDtcbiAgICAgIHZhciBpLCB4O1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgcGl4ZWxzOyArK2kpIHtcbiAgICAgICAgeCA9IE1hdGgucmFuZG9tKCk7XG4gICAgICAgIGRhdGFbaSAqIDNdID0geDtcbiAgICAgICAgZGF0YVtpICogMyArIDFdID0geDtcbiAgICAgICAgZGF0YVtpICogMyArIDJdID0geDtcbiAgICAgIH1cblxuICAgICAgaWYgKGR0ICE9PSBudWxsKSB7XG4gICAgICAgIGR0LmRpc3Bvc2UoKTtcbiAgICAgIH1cblxuICAgICAgZHQgPSBuZXcgRGF0YVRleHR1cmUoZGF0YSwgc2l6ZSwgc2l6ZSwgUkdCRm9ybWF0LCBGbG9hdFR5cGUpO1xuICAgICAgZHQubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgICAgdGhpcy5wZXJ0dXJiTWFwID0gZHQ7XG4gICAgICByZXR1cm4gZHQ7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XG4gICAgICB2YXIgbW9kZSA9IHRoaXMubW9kZTtcbiAgICAgIHZhciBjb3VudGVyID0gdGhpcy5jb3VudGVyO1xuICAgICAgdmFyIGJyZWFrUG9pbnQgPSB0aGlzLmJyZWFrUG9pbnQ7XG4gICAgICB2YXIgdW5pZm9ybXMgPSB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zO1xuICAgICAgdW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xuICAgICAgdW5pZm9ybXMuc2VlZC52YWx1ZSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICB1bmlmb3Jtcy5hY3RpdmUudmFsdWUgPSB0cnVlO1xuXG4gICAgICBpZiAoY291bnRlciAlIGJyZWFrUG9pbnQgPT09IDAgfHwgbW9kZSA9PT0gR2xpdGNoTW9kZS5DT05TVEFOVF9XSUxEKSB7XG4gICAgICAgIHVuaWZvcm1zLmFtb3VudC52YWx1ZSA9IE1hdGgucmFuZG9tKCkgLyAzMC4wO1xuICAgICAgICB1bmlmb3Jtcy5hbmdsZS52YWx1ZSA9IHJhbmRvbUZsb2F0KC1NYXRoLlBJLCBNYXRoLlBJKTtcbiAgICAgICAgdW5pZm9ybXMuc2VlZFgudmFsdWUgPSByYW5kb21GbG9hdCgtMS4wLCAxLjApO1xuICAgICAgICB1bmlmb3Jtcy5zZWVkWS52YWx1ZSA9IHJhbmRvbUZsb2F0KC0xLjAsIDEuMCk7XG4gICAgICAgIHVuaWZvcm1zLmRpc3RvcnRpb25YLnZhbHVlID0gcmFuZG9tRmxvYXQoMC4wLCAxLjApO1xuICAgICAgICB1bmlmb3Jtcy5kaXN0b3J0aW9uWS52YWx1ZSA9IHJhbmRvbUZsb2F0KDAuMCwgMS4wKTtcbiAgICAgICAgdGhpcy5icmVha1BvaW50ID0gcmFuZG9tSW50KDEyMCwgMjQwKTtcbiAgICAgICAgdGhpcy5jb3VudGVyID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjb3VudGVyICUgYnJlYWtQb2ludCA8IGJyZWFrUG9pbnQgLyA1IHx8IG1vZGUgPT09IEdsaXRjaE1vZGUuQ09OU1RBTlRfTUlMRCkge1xuICAgICAgICAgIHVuaWZvcm1zLmFtb3VudC52YWx1ZSA9IE1hdGgucmFuZG9tKCkgLyA5MC4wO1xuICAgICAgICAgIHVuaWZvcm1zLmFuZ2xlLnZhbHVlID0gcmFuZG9tRmxvYXQoLU1hdGguUEksIE1hdGguUEkpO1xuICAgICAgICAgIHVuaWZvcm1zLmRpc3RvcnRpb25YLnZhbHVlID0gcmFuZG9tRmxvYXQoMC4wLCAxLjApO1xuICAgICAgICAgIHVuaWZvcm1zLmRpc3RvcnRpb25ZLnZhbHVlID0gcmFuZG9tRmxvYXQoMC4wLCAxLjApO1xuICAgICAgICAgIHVuaWZvcm1zLnNlZWRYLnZhbHVlID0gcmFuZG9tRmxvYXQoLTAuMywgMC4zKTtcbiAgICAgICAgICB1bmlmb3Jtcy5zZWVkWS52YWx1ZSA9IHJhbmRvbUZsb2F0KC0wLjMsIDAuMyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU3BvcmFkaWMuXG4gICAgICAgICAgdW5pZm9ybXMuYWN0aXZlLnZhbHVlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgKyt0aGlzLmNvdW50ZXI7XG4gICAgICByZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGVydHVyYk1hcFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMudGV4dHVyZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBBc3NpZ25pbmcgYSBuZXcgcGVydHVyYmF0aW9uIG1hcCBkb2VzIG5vdCBkZXN0cm95IHRoZSBjdXJyZW50IG9uZSFcclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7VGV4dHVyZX1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgdGhpcy50ZXh0dXJlID0gdmFsdWU7XG4gICAgICB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnRQZXJ0dXJiLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoR2xpdGNoUGFzcywgX1Bhc3MpO1xuXG4gIHJldHVybiBHbGl0Y2hQYXNzO1xufShQYXNzKTtcbi8qKlxyXG4gKiBBIGdsaXRjaCBtb2RlIGVudW1lcmF0aW9uLlxyXG4gKlxyXG4gKiBAdHlwZSB7T2JqZWN0fVxyXG4gKiBAcHJvcGVydHkge051bWJlcn0gU1BPUkFESUMgLSBTcG9yYWRpYyBnbGl0Y2hlcy5cclxuICogQHByb3BlcnR5IHtOdW1iZXJ9IENPTlNUQU5UX01JTEQgLSBDb25zdGFudCBtaWxkIGdsaXRjaGVzLlxyXG4gKiBAcHJvcGVydHkge051bWJlcn0gQ09OU1RBTlRfV0lMRCAtIENvbnN0YW50IHdpbGQgZ2xpdGNoZXMuXHJcbiAqL1xuXG52YXIgR2xpdGNoTW9kZSA9IHtcbiAgU1BPUkFESUM6IDAsXG4gIENPTlNUQU5UX01JTEQ6IDEsXG4gIENPTlNUQU5UX1dJTEQ6IDJcbn07XG5cbi8qKlxyXG4gKiBBIHBhc3MgdGhhdCByZW5kZXJzIGEgZ2l2ZW4gc2NlbmUgZGlyZWN0bHkgb24gc2NyZWVuIG9yIGludG8gdGhlIHJlYWQgYnVmZmVyXHJcbiAqIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuXHJcbiAqL1xuXG52YXIgUmVuZGVyUGFzcyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1Bhc3MpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyByZW5kZXIgcGFzcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lIHRvIHJlbmRlci5cclxuICAgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0byB1c2UgdG8gcmVuZGVyIHRoZSBzY2VuZS5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQWRkaXRpb25hbCBvcHRpb25zLlxyXG4gICAqIEBwYXJhbSB7TWF0ZXJpYWx9IFtvcHRpb25zLm92ZXJyaWRlTWF0ZXJpYWw9bnVsbF0gLSBBbiBvdmVycmlkZSBtYXRlcmlhbCBmb3IgdGhlIHNjZW5lLlxyXG4gICAqIEBwYXJhbSB7Q29sb3J9IFtvcHRpb25zLmNsZWFyQ29sb3I9bnVsbF0gLSBBbiBvdmVycmlkZSBjbGVhciBjb2xvci5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuY2xlYXJBbHBoYT0xLjBdIC0gQW4gb3ZlcnJpZGUgY2xlYXIgYWxwaGEuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jbGVhckRlcHRoPWZhbHNlXSAtIFdoZXRoZXIgZGVwdGggc2hvdWxkIGJlIGNsZWFyZWQgZXhwbGljaXRseS5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmNsZWFyPXRydWVdIC0gV2hldGhlciBhbGwgYnVmZmVycyBzaG91bGQgYmUgY2xlYXJlZC5cclxuICAgKi9cbiAgZnVuY3Rpb24gUmVuZGVyUGFzcyhzY2VuZSwgY2FtZXJhKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUmVuZGVyUGFzcyk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihSZW5kZXJQYXNzKS5jYWxsKHRoaXMsIFwiUmVuZGVyUGFzc1wiLCBzY2VuZSwgY2FtZXJhLCBudWxsKSk7XG4gICAgX3RoaXMubmVlZHNTd2FwID0gZmFsc2U7XG4gICAgLyoqXHJcbiAgICAgKiBBIGNsZWFyIHBhc3MuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0NsZWFyUGFzc31cclxuICAgICAqL1xuXG4gICAgX3RoaXMuY2xlYXJQYXNzID0gbmV3IENsZWFyUGFzcyhvcHRpb25zKTtcbiAgICAvKipcclxuICAgICAqIEFuIG92ZXJyaWRlIG1hdGVyaWFsLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtNYXRlcmlhbH1cclxuICAgICAqL1xuXG4gICAgX3RoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IG9wdGlvbnMub3ZlcnJpZGVNYXRlcmlhbCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5vdmVycmlkZU1hdGVyaWFsIDogbnVsbDtcbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkZXB0aCBidWZmZXIgc2hvdWxkIGJlIGNsZWFyZWQgZXhwbGljaXRseS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuXG4gICAgX3RoaXMuY2xlYXJEZXB0aCA9IG9wdGlvbnMuY2xlYXJEZXB0aCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5jbGVhckRlcHRoIDogZmFsc2U7XG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29sb3IsIGRlcHRoIGFuZCBzdGVuY2lsIGJ1ZmZlcnMgc2hvdWxkIGJlIGNsZWFyZWQuXHJcbiAgICAgKlxyXG4gICAgICogRXZlbiB3aXRoIGNsZWFyIHNldCB0byB0cnVlIHlvdSBjYW4gcHJldmVudCBzcGVjaWZpYyBidWZmZXJzIGZyb20gYmVpbmdcclxuICAgICAqIGNsZWFyZWQgYnkgc2V0dGluZyBlaXRoZXIgdGhlIGF1dG9DbGVhckNvbG9yLCBhdXRvQ2xlYXJTdGVuY2lsIG9yXHJcbiAgICAgKiBhdXRvQ2xlYXJEZXB0aCBwcm9wZXJ0aWVzIG9mIHRoZSByZW5kZXJlciB0byBmYWxzZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuXG4gICAgX3RoaXMuY2xlYXIgPSBvcHRpb25zLmNsZWFyICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmNsZWFyIDogdHJ1ZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogUmVuZGVycyB0aGUgc2NlbmUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoUmVuZGVyUGFzcywgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XG4gICAgICB2YXIgc2NlbmUgPSB0aGlzLnNjZW5lO1xuICAgICAgdmFyIHJlbmRlclRhcmdldCA9IHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogaW5wdXRCdWZmZXI7XG4gICAgICB2YXIgb3ZlcnJpZGVNYXRlcmlhbCA9IHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWw7XG5cbiAgICAgIGlmICh0aGlzLmNsZWFyKSB7XG4gICAgICAgIHRoaXMuY2xlYXJQYXNzLnJlbmRlclRvU2NyZWVuID0gdGhpcy5yZW5kZXJUb1NjcmVlbjtcbiAgICAgICAgdGhpcy5jbGVhclBhc3MucmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlcik7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2xlYXJEZXB0aCkge1xuICAgICAgICByZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQocmVuZGVyVGFyZ2V0KTtcbiAgICAgICAgcmVuZGVyZXIuY2xlYXJEZXB0aCgpO1xuICAgICAgfVxuXG4gICAgICBzY2VuZS5vdmVycmlkZU1hdGVyaWFsID0gdGhpcy5vdmVycmlkZU1hdGVyaWFsO1xuICAgICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCB0aGlzLmNhbWVyYSwgcmVuZGVyVGFyZ2V0KTtcbiAgICAgIHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgPSBvdmVycmlkZU1hdGVyaWFsO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFJlbmRlclBhc3MsIF9QYXNzKTtcblxuICByZXR1cm4gUmVuZGVyUGFzcztcbn0oUGFzcyk7XG5cbi8qKlxyXG4gKiBDbGFtcHMgYSBnaXZlbiB2YWx1ZS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNsYW1wLlxyXG4gKiBAcGFyYW0ge051bWJlcn0gbWluIC0gVGhlIGxvd2VzdCBwb3NzaWJsZSB2YWx1ZS5cclxuICogQHBhcmFtIHtOdW1iZXJ9IG1heCAtIFRoZSBoaWdoZXN0IHBvc3NpYmxlIHZhbHVlLlxyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBjbGFtcGVkIHZhbHVlLlxyXG4gKi9cblxuZnVuY3Rpb24gY2xhbXAodmFsdWUsIG1pbiwgbWF4KSB7XG4gIHJldHVybiBNYXRoLm1heChtaW4sIE1hdGgubWluKG1heCwgdmFsdWUpKTtcbn1cbi8qKlxyXG4gKiBBIGNyZXB1c2N1bGFyIHJheXMgcGFzcy5cclxuICovXG5cblxudmFyIEdvZFJheXNQYXNzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUGFzcykge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGdvZCByYXlzIHBhc3MuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBtYWluIHNjZW5lLlxyXG4gICAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgbWFpbiBjYW1lcmEuXHJcbiAgICogQHBhcmFtIHtPYmplY3QzRH0gbGlnaHRTb3VyY2UgLSBUaGUgbWFpbiBsaWdodCBzb3VyY2UuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kZW5zaXR5PTAuOTZdIC0gVGhlIGRlbnNpdHkgb2YgdGhlIGxpZ2h0IHJheXMuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRlY2F5PTAuOTNdIC0gQW4gaWxsdW1pbmF0aW9uIGRlY2F5IGZhY3Rvci5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMud2VpZ2h0PTAuNF0gLSBBIGxpZ2h0IHJheSB3ZWlnaHQgZmFjdG9yLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5leHBvc3VyZT0wLjZdIC0gQSBjb25zdGFudCBhdHRlbnVhdGlvbiBjb2VmZmljaWVudC5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuY2xhbXBNYXg9MS4wXSAtIEFuIHVwcGVyIGJvdW5kIGZvciB0aGUgc2F0dXJhdGlvbiBvZiB0aGUgb3ZlcmFsbCBlZmZlY3QuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmludGVuc2l0eT0xLjBdIC0gQSBjb25zdGFudCBmYWN0b3IgZm9yIGFkZGl0aXZlIGJsZW5kaW5nLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5yZXNvbHV0aW9uU2NhbGU9MC41XSAtIFRoZSByZW5kZXIgdGV4dHVyZSByZXNvbHV0aW9uIHNjYWxlLCByZWxhdGl2ZSB0byB0aGUgc2NyZWVuIHJlbmRlciBzaXplLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5rZXJuZWxTaXplPUtlcm5lbFNpemUuTEFSR0VdIC0gVGhlIGJsdXIga2VybmVsIHNpemUuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnNhbXBsZXM9NjBdIC0gVGhlIG51bWJlciBvZiBzYW1wbGVzIHBlciBwaXhlbC5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc2NyZWVuTW9kZT10cnVlXSAtIFdoZXRoZXIgdGhlIHNjcmVlbiBibGVuZCBtb2RlIHNob3VsZCBiZSB1c2VkIGZvciBjb21iaW5pbmcgdGhlIGdvZCByYXlzIHRleHR1cmUgd2l0aCB0aGUgc2NlbmUgY29sb3JzLlxyXG4gICAqL1xuICBmdW5jdGlvbiBHb2RSYXlzUGFzcyhzY2VuZSwgY2FtZXJhLCBsaWdodFNvdXJjZSkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEdvZFJheXNQYXNzKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKEdvZFJheXNQYXNzKS5jYWxsKHRoaXMsIFwiR29kUmF5c1Bhc3NcIikpO1xuICAgIC8qKlxyXG4gICAgICogQSBzY2VuZSB0aGF0IG9ubHkgY29udGFpbnMgdGhlIGxpZ2h0IHNvdXJjZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7U2NlbmV9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5saWdodFNjZW5lID0gbmV3IFNjZW5lKCk7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWFpbiBzY2VuZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7U2NlbmV9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5tYWluU2NlbmUgPSBzY2VuZTtcbiAgICAvKipcclxuICAgICAqIFRoZSBtYWluIGNhbWVyYS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Q2FtZXJhfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMubWFpbkNhbWVyYSA9IGNhbWVyYTtcbiAgICAvKipcclxuICAgICAqIEEgcmVuZGVyIHRhcmdldC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRYID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KDEsIDEsIHtcbiAgICAgIG1pbkZpbHRlcjogTGluZWFyRmlsdGVyLFxuICAgICAgbWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG4gICAgICBzdGVuY2lsQnVmZmVyOiBmYWxzZSxcbiAgICAgIGRlcHRoQnVmZmVyOiBmYWxzZVxuICAgIH0pO1xuICAgIF90aGlzLnJlbmRlclRhcmdldFgudGV4dHVyZS5uYW1lID0gXCJHb2RSYXlzLlRhcmdldFhcIjtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRYLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG4gICAgLyoqXHJcbiAgICAgKiBBIHNlY29uZCByZW5kZXIgdGFyZ2V0LlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnJlbmRlclRhcmdldFkgPSBfdGhpcy5yZW5kZXJUYXJnZXRYLmNsb25lKCk7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0WS50ZXh0dXJlLm5hbWUgPSBcIkdvZFJheXMuVGFyZ2V0WVwiO1xuICAgIC8qKlxyXG4gICAgICogQSByZW5kZXIgdGFyZ2V0IGZvciB0aGUgbWFza2VkIGxpZ2h0IHNjZW5lLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnJlbmRlclRhcmdldE1hc2sgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoMSwgMSwge1xuICAgICAgbWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG4gICAgICBtYWdGaWx0ZXI6IExpbmVhckZpbHRlclxuICAgIH0pO1xuICAgIF90aGlzLnJlbmRlclRhcmdldE1hc2sudGV4dHVyZS5uYW1lID0gXCJHb2RSYXlzLk1hc2tcIjtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRNYXNrLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG4gICAgLyoqXHJcbiAgICAgKiBBIHBhc3MgdGhhdCBvbmx5IHJlbmRlcnMgdGhlIGxpZ2h0IHNvdXJjZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7UmVuZGVyUGFzc31cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnJlbmRlclBhc3NMaWdodCA9IG5ldyBSZW5kZXJQYXNzKF90aGlzLmxpZ2h0U2NlbmUsIF90aGlzLm1haW5DYW1lcmEsIHtcbiAgICAgIGNsZWFyQ29sb3I6IG5ldyBDb2xvcigweDAwMDAwMClcbiAgICB9KTtcbiAgICAvKipcclxuICAgICAqIEEgcGFzcyB0aGF0IHJlbmRlcnMgdGhlIG1hc2tlZCBzY2VuZSBvdmVyIHRoZSBsaWdodC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7UmVuZGVyUGFzc31cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnJlbmRlclBhc3NNYXNrID0gbmV3IFJlbmRlclBhc3MoX3RoaXMubWFpblNjZW5lLCBfdGhpcy5tYWluQ2FtZXJhLCB7XG4gICAgICBvdmVycmlkZU1hdGVyaWFsOiBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICAgICAgICBjb2xvcjogMHgwMDAwMDBcbiAgICAgIH0pXG4gICAgfSk7XG4gICAgX3RoaXMucmVuZGVyUGFzc01hc2suY2xlYXIgPSBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIEEgYmx1ciBwYXNzLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCbHVyUGFzc31cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLmJsdXJQYXNzID0gbmV3IEJsdXJQYXNzKG9wdGlvbnMpO1xuICAgIC8qKlxyXG4gICAgICogVGhlIGxpZ2h0IHNvdXJjZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0M0R9XHJcbiAgICAgKi9cblxuICAgIF90aGlzLmxpZ2h0U291cmNlID0gbGlnaHRTb3VyY2U7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbGlnaHQgcG9zaXRpb24gaW4gc2NyZWVuIHNwYWNlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtWZWN0b3IzfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMuc2NyZWVuUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuICAgIC8qKlxyXG4gICAgICogQSBnb2QgcmF5cyBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0dvZFJheXNNYXRlcmlhbH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLmdvZFJheXNNYXRlcmlhbCA9IG5ldyBHb2RSYXlzTWF0ZXJpYWwob3B0aW9ucyk7XG4gICAgX3RoaXMuZ29kUmF5c01hdGVyaWFsLnVuaWZvcm1zLmxpZ2h0UG9zaXRpb24udmFsdWUgPSBfdGhpcy5zY3JlZW5Qb3NpdGlvbjtcbiAgICBfdGhpcy5zYW1wbGVzID0gb3B0aW9ucy5zYW1wbGVzO1xuICAgIC8qKlxyXG4gICAgICogQSBjb21iaW5lIHNoYWRlciBtYXRlcmlhbC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Q29tYmluZU1hdGVyaWFsfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMuY29tYmluZU1hdGVyaWFsID0gbmV3IENvbWJpbmVNYXRlcmlhbChvcHRpb25zLnNjcmVlbk1vZGUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc2NyZWVuTW9kZSA6IHRydWUpO1xuICAgIF90aGlzLmludGVuc2l0eSA9IG9wdGlvbnMuaW50ZW5zaXR5O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBUaGUgcmVzb2x1dGlvbiBzY2FsZS5cclxuICAgKlxyXG4gICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhHb2RSYXlzUGFzcywgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG5cbiAgICAvKipcclxuICAgICAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcbiAgICAgIHZhciBzY2VuZSA9IHRoaXMuc2NlbmU7XG4gICAgICB2YXIgY2FtZXJhID0gdGhpcy5jYW1lcmE7XG4gICAgICB2YXIgbWFpblNjZW5lID0gdGhpcy5tYWluU2NlbmU7XG4gICAgICB2YXIgbGlnaHRTb3VyY2UgPSB0aGlzLmxpZ2h0U291cmNlO1xuICAgICAgdmFyIHNjcmVlblBvc2l0aW9uID0gdGhpcy5zY3JlZW5Qb3NpdGlvbjtcbiAgICAgIHZhciBnb2RSYXlzTWF0ZXJpYWwgPSB0aGlzLmdvZFJheXNNYXRlcmlhbDtcbiAgICAgIHZhciBjb21iaW5lTWF0ZXJpYWwgPSB0aGlzLmNvbWJpbmVNYXRlcmlhbDtcbiAgICAgIHZhciByZW5kZXJUYXJnZXRNYXNrID0gdGhpcy5yZW5kZXJUYXJnZXRNYXNrO1xuICAgICAgdmFyIHJlbmRlclRhcmdldFggPSB0aGlzLnJlbmRlclRhcmdldFg7XG4gICAgICB2YXIgcmVuZGVyVGFyZ2V0WSA9IHRoaXMucmVuZGVyVGFyZ2V0WTtcbiAgICAgIHZhciBiYWNrZ3JvdW5kLCBwYXJlbnQ7IC8vIENvbXB1dGUgdGhlIHNjcmVlbiBsaWdodCBwb3NpdGlvbiBhbmQgdHJhbnNsYXRlIGl0IHRvIFswLjAsIDEuMF0uXG5cbiAgICAgIHNjcmVlblBvc2l0aW9uLmNvcHkobGlnaHRTb3VyY2UucG9zaXRpb24pLnByb2plY3QodGhpcy5tYWluQ2FtZXJhKTtcbiAgICAgIHNjcmVlblBvc2l0aW9uLnggPSBjbGFtcCgoc2NyZWVuUG9zaXRpb24ueCArIDEuMCkgKiAwLjUsIDAuMCwgMS4wKTtcbiAgICAgIHNjcmVlblBvc2l0aW9uLnkgPSBjbGFtcCgoc2NyZWVuUG9zaXRpb24ueSArIDEuMCkgKiAwLjUsIDAuMCwgMS4wKTtcbiAgICAgIHBhcmVudCA9IGxpZ2h0U291cmNlLnBhcmVudDtcbiAgICAgIGJhY2tncm91bmQgPSBtYWluU2NlbmUuYmFja2dyb3VuZDtcbiAgICAgIG1haW5TY2VuZS5iYWNrZ3JvdW5kID0gbnVsbDtcbiAgICAgIHRoaXMubGlnaHRTY2VuZS5hZGQobGlnaHRTb3VyY2UpO1xuICAgICAgLyogRmlyc3QsIHJlbmRlciB0aGUgbGlnaHQgc291cmNlLiBUaGVuIHJlbmRlciB0aGUgc2NlbmUgaW50byB0aGUgc2FtZVxyXG4gICAgICBidWZmZXIgdXNpbmcgYSBtYXNrIG92ZXJyaWRlIG1hdGVyaWFsIHdpdGggZGVwdGggdGVzdCBlbmFibGVkLiAqL1xuXG4gICAgICB0aGlzLnJlbmRlclBhc3NMaWdodC5yZW5kZXIocmVuZGVyZXIsIHJlbmRlclRhcmdldE1hc2spO1xuICAgICAgdGhpcy5yZW5kZXJQYXNzTWFzay5yZW5kZXIocmVuZGVyZXIsIHJlbmRlclRhcmdldE1hc2spO1xuXG4gICAgICBpZiAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIHBhcmVudC5hZGQobGlnaHRTb3VyY2UpO1xuICAgICAgfVxuXG4gICAgICBtYWluU2NlbmUuYmFja2dyb3VuZCA9IGJhY2tncm91bmQ7IC8vIEJsdXIgdGhlIG1hc2tlZCBzY2VuZSB0byByZWR1Y2UgYXJ0aWZhY3RzLlxuXG4gICAgICB0aGlzLmJsdXJQYXNzLnJlbmRlcihyZW5kZXJlciwgdGhpcy5yZW5kZXJUYXJnZXRNYXNrLCByZW5kZXJUYXJnZXRYKTsgLy8gQmx1ciB0aGUgbWFza2VkIHNjZW5lIGFsb25nIHJhZGlhbCBsaW5lcyB0b3dhcmRzIHRoZSBsaWdodCBzb3VyY2UuXG5cbiAgICAgIHRoaXMubWF0ZXJpYWwgPSBnb2RSYXlzTWF0ZXJpYWw7XG4gICAgICBnb2RSYXlzTWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSByZW5kZXJUYXJnZXRYLnRleHR1cmU7XG4gICAgICByZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYSwgcmVuZGVyVGFyZ2V0WSk7XG5cbiAgICAgIGlmICh0aGlzLmJsZW5kKSB7XG4gICAgICAgIC8vIENvbWJpbmUgdGhlIGdvZCByYXlzIHdpdGggdGhlIHNjZW5lIGNvbG9ycy5cbiAgICAgICAgdGhpcy5tYXRlcmlhbCA9IGNvbWJpbmVNYXRlcmlhbDtcbiAgICAgICAgY29tYmluZU1hdGVyaWFsLnVuaWZvcm1zLnRleHR1cmUxLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcbiAgICAgICAgY29tYmluZU1hdGVyaWFsLnVuaWZvcm1zLnRleHR1cmUyLnZhbHVlID0gcmVuZGVyVGFyZ2V0WS50ZXh0dXJlO1xuICAgICAgICByZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNpemUod2lkdGgsIGhlaWdodCkge1xuICAgICAgdGhpcy5yZW5kZXJQYXNzTGlnaHQuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHRoaXMucmVuZGVyUGFzc01hc2suc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHRoaXMuYmx1clBhc3Muc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHdpZHRoID0gdGhpcy5ibHVyUGFzcy53aWR0aDtcbiAgICAgIGhlaWdodCA9IHRoaXMuYmx1clBhc3MuaGVpZ2h0O1xuICAgICAgdGhpcy5yZW5kZXJUYXJnZXRNYXNrLnNldFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLnJlbmRlclRhcmdldFguc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHRoaXMucmVuZGVyVGFyZ2V0WS5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIHRhc2tzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGFscGhhIC0gV2hldGhlciB0aGUgcmVuZGVyZXIgdXNlcyB0aGUgYWxwaGEgY2hhbm5lbCBvciBub3QuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImluaXRpYWxpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpIHtcbiAgICAgIHRoaXMucmVuZGVyUGFzc0xpZ2h0LmluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKTtcbiAgICAgIHRoaXMucmVuZGVyUGFzc01hc2suaW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpO1xuICAgICAgdGhpcy5ibHVyUGFzcy5pbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSk7XG5cbiAgICAgIGlmICghYWxwaGEpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJUYXJnZXRNYXNrLnRleHR1cmUuZm9ybWF0ID0gUkdCRm9ybWF0O1xuICAgICAgICB0aGlzLnJlbmRlclRhcmdldFgudGV4dHVyZS5mb3JtYXQgPSBSR0JGb3JtYXQ7XG4gICAgICAgIHRoaXMucmVuZGVyVGFyZ2V0WS50ZXh0dXJlLmZvcm1hdCA9IFJHQkZvcm1hdDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzb2x1dGlvblNjYWxlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5ibHVyUGFzcy5yZXNvbHV0aW9uU2NhbGU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogWW91IG5lZWQgdG8gY2FsbCB7QGxpbmsgRWZmZWN0Q29tcG9zZXIjc2V0U2l6ZX0gYWZ0ZXIgY2hhbmdpbmcgdGhpcyB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAwLjU7XG4gICAgICB0aGlzLmJsdXJQYXNzLnJlc29sdXRpb25TY2FsZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFRoZSBibHVyIGtlcm5lbCBzaXplLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtLZXJuZWxTaXplfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJrZXJuZWxTaXplXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5ibHVyUGFzcy5rZXJuZWxTaXplO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEB0eXBlIHtLZXJuZWxTaXplfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBLZXJuZWxTaXplLkxBUkdFO1xuICAgICAgdGhpcy5ibHVyUGFzcy5rZXJuZWxTaXplID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVGhlIG92ZXJhbGwgaW50ZW5zaXR5IG9mIHRoZSBlZmZlY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW50ZW5zaXR5XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21iaW5lTWF0ZXJpYWwudW5pZm9ybXMub3BhY2l0eTIudmFsdWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMS4wO1xuICAgICAgdGhpcy5jb21iaW5lTWF0ZXJpYWwudW5pZm9ybXMub3BhY2l0eTIudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIHBpeGVsLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNhbXBsZXNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBOdW1iZXIucGFyc2VJbnQodGhpcy5nb2RSYXlzTWF0ZXJpYWwuZGVmaW5lcy5OVU1fU0FNUExFU19JTlQpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFRoaXMgdmFsdWUgbXVzdCBiZSBjYXJlZnVsbHkgY2hvc2VuLiBBIGhpZ2hlciB2YWx1ZSBkaXJlY3RseSBpbmNyZWFzZXMgdGhlXHJcbiAgICAgKiBHUFUgbG9hZC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiA2MDtcbiAgICAgIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSk7XG4gICAgICB0aGlzLmdvZFJheXNNYXRlcmlhbC5kZWZpbmVzLk5VTV9TQU1QTEVTX0ZMT0FUID0gdmFsdWUudG9GaXhlZCgxKTtcbiAgICAgIHRoaXMuZ29kUmF5c01hdGVyaWFsLmRlZmluZXMuTlVNX1NBTVBMRVNfSU5UID0gdmFsdWUudG9GaXhlZCgwKTtcbiAgICAgIHRoaXMuZ29kUmF5c01hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBkaXRoZXJpbmcgaXMgZW5hYmxlZC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGl0aGVyaW5nXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nb2RSYXlzTWF0ZXJpYWwuZGl0aGVyaW5nO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIElmIGVuYWJsZWQsIHRoZSByZXN1bHQgd2lsbCBiZSBkaXRoZXJlZCB0byByZW1vdmUgYmFuZGluZyBhcnRpZmFjdHMuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIGlmICh0aGlzLmRpdGhlcmluZyAhPT0gdmFsdWUpIHtcbiAgICAgICAgdGhpcy5nb2RSYXlzTWF0ZXJpYWwuZGl0aGVyaW5nID0gdmFsdWU7XG4gICAgICAgIHRoaXMuZ29kUmF5c01hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZWZmZWN0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBpbnB1dCBidWZmZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImJsZW5kXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5uZWVkc1N3YXA7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogSWYgZGlzYWJsZWQsIHRoZSBpbnB1dCBidWZmZXIgd2lsbCByZW1haW4gdW5hZmZlY3RlZC5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgbWF5IHVzZSB0aGUge0BsaW5rIEJsb29tUGFzcyNvdmVybGF5fSB0ZXh0dXJlIHRvIGFwcGx5IHRoZSBlZmZlY3QgdG9cclxuICAgICAqIHlvdXIgc2NlbmUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIHRoaXMubmVlZHNTd2FwID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVGhlIGVmZmVjdCBvdmVybGF5IHRleHR1cmUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1RleHR1cmV9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm92ZXJsYXlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlclRhcmdldFkudGV4dHVyZTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhHb2RSYXlzUGFzcywgX1Bhc3MpO1xuXG4gIHJldHVybiBHb2RSYXlzUGFzcztcbn0oUGFzcyk7XG5cbi8qKlxyXG4gKiBBIG1hc2sgcGFzcy5cclxuICovXG5cbnZhciBNYXNrUGFzcyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1Bhc3MpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBtYXNrIHBhc3MuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBzY2VuZSB0byByZW5kZXIuXHJcbiAgICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgdG8gdXNlLlxyXG4gICAqL1xuICBmdW5jdGlvbiBNYXNrUGFzcyhzY2VuZSwgY2FtZXJhKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgTWFza1Bhc3MpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoTWFza1Bhc3MpLmNhbGwodGhpcywgXCJNYXNrUGFzc1wiLCBzY2VuZSwgY2FtZXJhLCBudWxsKSk7XG4gICAgX3RoaXMubmVlZHNTd2FwID0gZmFsc2U7XG4gICAgLyoqXHJcbiAgICAgKiBJbnZlcnNlIGZsYWcuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cblxuICAgIF90aGlzLmludmVyc2UgPSBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIFN0ZW5jaWwgYnVmZmVyIGNsZWFyIGZsYWcuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cblxuICAgIF90aGlzLmNsZWFyU3RlbmNpbCA9IHRydWU7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhNYXNrUGFzcywgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XG4gICAgICB2YXIgY29udGV4dCA9IHJlbmRlcmVyLmNvbnRleHQ7XG4gICAgICB2YXIgc3RhdGUgPSByZW5kZXJlci5zdGF0ZTtcbiAgICAgIHZhciBzY2VuZSA9IHRoaXMuc2NlbmU7XG4gICAgICB2YXIgY2FtZXJhID0gdGhpcy5jYW1lcmE7XG4gICAgICB2YXIgd3JpdGVWYWx1ZSA9IHRoaXMuaW52ZXJzZSA/IDAgOiAxO1xuICAgICAgdmFyIGNsZWFyVmFsdWUgPSAxIC0gd3JpdGVWYWx1ZTsgLy8gRG9uJ3QgdXBkYXRlIGNvbG9yIG9yIGRlcHRoLlxuXG4gICAgICBzdGF0ZS5idWZmZXJzLmNvbG9yLnNldE1hc2soZmFsc2UpO1xuICAgICAgc3RhdGUuYnVmZmVycy5kZXB0aC5zZXRNYXNrKGZhbHNlKTsgLy8gTG9jayB0aGUgYnVmZmVycy5cblxuICAgICAgc3RhdGUuYnVmZmVycy5jb2xvci5zZXRMb2NrZWQodHJ1ZSk7XG4gICAgICBzdGF0ZS5idWZmZXJzLmRlcHRoLnNldExvY2tlZCh0cnVlKTsgLy8gQ29uZmlndXJlIHRoZSBzdGVuY2lsLlxuXG4gICAgICBzdGF0ZS5idWZmZXJzLnN0ZW5jaWwuc2V0VGVzdCh0cnVlKTtcbiAgICAgIHN0YXRlLmJ1ZmZlcnMuc3RlbmNpbC5zZXRPcChjb250ZXh0LlJFUExBQ0UsIGNvbnRleHQuUkVQTEFDRSwgY29udGV4dC5SRVBMQUNFKTtcbiAgICAgIHN0YXRlLmJ1ZmZlcnMuc3RlbmNpbC5zZXRGdW5jKGNvbnRleHQuQUxXQVlTLCB3cml0ZVZhbHVlLCAweGZmZmZmZmZmKTtcbiAgICAgIHN0YXRlLmJ1ZmZlcnMuc3RlbmNpbC5zZXRDbGVhcihjbGVhclZhbHVlKTsgLy8gQ2xlYXIgdGhlIHN0ZW5jaWwuXG5cbiAgICAgIGlmICh0aGlzLmNsZWFyU3RlbmNpbCkge1xuICAgICAgICBpZiAodGhpcy5yZW5kZXJUb1NjcmVlbikge1xuICAgICAgICAgIHJlbmRlcmVyLnNldFJlbmRlclRhcmdldChudWxsKTtcbiAgICAgICAgICByZW5kZXJlci5jbGVhclN0ZW5jaWwoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoaW5wdXRCdWZmZXIpO1xuICAgICAgICAgIHJlbmRlcmVyLmNsZWFyU3RlbmNpbCgpO1xuICAgICAgICAgIHJlbmRlcmVyLnNldFJlbmRlclRhcmdldChvdXRwdXRCdWZmZXIpO1xuICAgICAgICAgIHJlbmRlcmVyLmNsZWFyU3RlbmNpbCgpO1xuICAgICAgICB9XG4gICAgICB9IC8vIERyYXcgdGhlIG1hc2suXG5cblxuICAgICAgaWYgKHRoaXMucmVuZGVyVG9TY3JlZW4pIHtcbiAgICAgICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIGlucHV0QnVmZmVyKTtcbiAgICAgICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIG91dHB1dEJ1ZmZlcik7XG4gICAgICB9IC8vIFVubG9jayB0aGUgYnVmZmVycy5cblxuXG4gICAgICBzdGF0ZS5idWZmZXJzLmNvbG9yLnNldExvY2tlZChmYWxzZSk7XG4gICAgICBzdGF0ZS5idWZmZXJzLmRlcHRoLnNldExvY2tlZChmYWxzZSk7IC8vIE9ubHkgcmVuZGVyIHdoZXJlIHRoZSBzdGVuY2lsIGlzIHNldCB0byAxLlxuXG4gICAgICBzdGF0ZS5idWZmZXJzLnN0ZW5jaWwuc2V0RnVuYyhjb250ZXh0LkVRVUFMLCAxLCAweGZmZmZmZmZmKTtcbiAgICAgIHN0YXRlLmJ1ZmZlcnMuc3RlbmNpbC5zZXRPcChjb250ZXh0LktFRVAsIGNvbnRleHQuS0VFUCwgY29udGV4dC5LRUVQKTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhNYXNrUGFzcywgX1Bhc3MpO1xuXG4gIHJldHVybiBNYXNrUGFzcztcbn0oUGFzcyk7XG5cbi8qKlxyXG4gKiBBIHNoYWRlciBwYXNzLlxyXG4gKlxyXG4gKiBVc2VkIHRvIHJlbmRlciBhbnkgc2hhZGVyIG1hdGVyaWFsIGFzIGEgMkQgZmlsdGVyLlxyXG4gKi9cblxudmFyIFNoYWRlclBhc3MgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9QYXNzKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgc2hhZGVyIHBhc3MuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1NoYWRlck1hdGVyaWFsfSBtYXRlcmlhbCAtIFRoZSBzaGFkZXIgbWF0ZXJpYWwgdG8gdXNlLlxyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbdGV4dHVyZUlEPVwidERpZmZ1c2VcIl0gLSBUaGUgdGV4dHVyZSB1bmlmb3JtIGlkZW50aWZpZXIuXHJcbiAgICovXG4gIGZ1bmN0aW9uIFNoYWRlclBhc3MobWF0ZXJpYWwpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgdGV4dHVyZUlEID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBcInREaWZmdXNlXCI7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTaGFkZXJQYXNzKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFNoYWRlclBhc3MpLmNhbGwodGhpcywgXCJTaGFkZXJQYXNzXCIpKTtcbiAgICBfdGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuICAgIC8qKlxyXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbG9yIHNhbXBsZXIgdW5pZm9ybSBvZiB0aGUgZ2l2ZW4gbWF0ZXJpYWwuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1N0cmluZ31cclxuICAgICAqL1xuXG4gICAgX3RoaXMudGV4dHVyZUlEID0gdGV4dHVyZUlEO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoU2hhZGVyUGFzcywgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XG4gICAgICBpZiAodGhpcy5tYXRlcmlhbC51bmlmb3Jtc1t0aGlzLnRleHR1cmVJRF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zW3RoaXMudGV4dHVyZUlEXS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XG4gICAgICB9XG5cbiAgICAgIHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFNoYWRlclBhc3MsIF9QYXNzKTtcblxuICByZXR1cm4gU2hhZGVyUGFzcztcbn0oUGFzcyk7XG5cbi8qKlxyXG4gKiBBbiBvdXRsaW5lIHBhc3MuXHJcbiAqL1xuXG52YXIgT3V0bGluZVBhc3MgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9QYXNzKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgb3V0bGluZSBwYXNzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgbWFpbiBzY2VuZS5cclxuICAgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIG1haW4gY2FtZXJhLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBBZGRpdGlvbmFsIHBhcmFtZXRlcnMuIFNlZSB7QGxpbmsgQmx1clBhc3N9LCB7QGxpbmsgT3V0bGluZUJsZW5kTWF0ZXJpYWx9IGFuZCB7QGxpbmsgT3V0bGluZUVkZ2VzTWF0ZXJpYWx9IGZvciBkZXRhaWxzLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5wdWxzZVNwZWVkPTAuMF0gLSBUaGUgcHVsc2Ugc3BlZWQuIEEgdmFsdWUgb2YgemVybyBkaXNhYmxlcyB0aGUgcHVsc2UgZWZmZWN0LlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYmx1cj10cnVlXSAtIFdoZXRoZXIgdGhlIG91dGxpbmUgc2hvdWxkIGJlIGJsdXJyZWQuXHJcbiAgICovXG4gIGZ1bmN0aW9uIE91dGxpbmVQYXNzKHNjZW5lLCBjYW1lcmEpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBPdXRsaW5lUGFzcyk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihPdXRsaW5lUGFzcykuY2FsbCh0aGlzLCBcIk91dGxpbmVQYXNzXCIpKTtcbiAgICAvKipcclxuICAgICAqIFRoZSBtYWluIHNjZW5lLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtTY2VuZX1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLm1haW5TY2VuZSA9IHNjZW5lO1xuICAgIC8qKlxyXG4gICAgICogVGhlIG1haW4gY2FtZXJhLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtDYW1lcmF9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5tYWluQ2FtZXJhID0gY2FtZXJhO1xuICAgIC8qKlxyXG4gICAgICogQSByZW5kZXIgdGFyZ2V0IGZvciBkZXB0aCBpbmZvcm1hdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5yZW5kZXJUYXJnZXREZXB0aCA9IG5ldyBXZWJHTFJlbmRlclRhcmdldCgxLCAxLCB7XG4gICAgICBtaW5GaWx0ZXI6IExpbmVhckZpbHRlcixcbiAgICAgIG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyXG4gICAgfSk7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0RGVwdGgudGV4dHVyZS5uYW1lID0gXCJPdXRsaW5lLkRlcHRoXCI7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0RGVwdGgudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIEEgcmVuZGVyIHRhcmdldCBmb3IgdGhlIG91dGxpbmUgbWFzay5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRNYXNrID0gX3RoaXMucmVuZGVyVGFyZ2V0RGVwdGguY2xvbmUoKTtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRNYXNrLnRleHR1cmUuZm9ybWF0ID0gUkdCRm9ybWF0O1xuICAgIF90aGlzLnJlbmRlclRhcmdldE1hc2sudGV4dHVyZS5uYW1lID0gXCJPdXRsaW5lLk1hc2tcIjtcbiAgICAvKipcclxuICAgICAqIEEgcmVuZGVyIHRhcmdldCBmb3IgdGhlIGVkZ2UgZGV0ZWN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnJlbmRlclRhcmdldEVkZ2VzID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KDEsIDEsIHtcbiAgICAgIG1pbkZpbHRlcjogTGluZWFyRmlsdGVyLFxuICAgICAgbWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG4gICAgICBzdGVuY2lsQnVmZmVyOiBmYWxzZSxcbiAgICAgIGRlcHRoQnVmZmVyOiBmYWxzZSxcbiAgICAgIGZvcm1hdDogUkdCRm9ybWF0XG4gICAgfSk7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0RWRnZXMudGV4dHVyZS5uYW1lID0gXCJPdXRsaW5lLkVkZ2VzXCI7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0RWRnZXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIEEgcmVuZGVyIHRhcmdldCBmb3IgdGhlIGJsdXJyZWQgb3V0bGluZSBvdmVybGF5LlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnJlbmRlclRhcmdldEJsdXJyZWRFZGdlcyA9IF90aGlzLnJlbmRlclRhcmdldEVkZ2VzLmNsb25lKCk7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0Qmx1cnJlZEVkZ2VzLnRleHR1cmUubmFtZSA9IFwiT3V0bGluZS5CbHVycmVkRWRnZXNcIjtcbiAgICAvKipcclxuICAgICAqIEEgZGVwdGggcGFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7UmVuZGVyUGFzc31cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnJlbmRlclBhc3NEZXB0aCA9IG5ldyBSZW5kZXJQYXNzKF90aGlzLm1haW5TY2VuZSwgX3RoaXMubWFpbkNhbWVyYSwge1xuICAgICAgb3ZlcnJpZGVNYXRlcmlhbDogbmV3IE1lc2hEZXB0aE1hdGVyaWFsKHtcbiAgICAgICAgZGVwdGhQYWNraW5nOiBSR0JBRGVwdGhQYWNraW5nLFxuICAgICAgICBtb3JwaFRhcmdldHM6IHRydWUsXG4gICAgICAgIHNraW5uaW5nOiB0cnVlXG4gICAgICB9KSxcbiAgICAgIGNsZWFyQ29sb3I6IG5ldyBDb2xvcigweGZmZmZmZiksXG4gICAgICBjbGVhckFscGhhOiAxLjBcbiAgICB9KTtcbiAgICAvKipcclxuICAgICAqIEEgZGVwdGggY29tcGFyaXNvbiBtYXNrIHBhc3MuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1JlbmRlclBhc3N9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5yZW5kZXJQYXNzTWFzayA9IG5ldyBSZW5kZXJQYXNzKF90aGlzLm1haW5TY2VuZSwgX3RoaXMubWFpbkNhbWVyYSwge1xuICAgICAgb3ZlcnJpZGVNYXRlcmlhbDogbmV3IERlcHRoQ29tcGFyaXNvbk1hdGVyaWFsKF90aGlzLnJlbmRlclRhcmdldERlcHRoLnRleHR1cmUsIF90aGlzLm1haW5DYW1lcmEpLFxuICAgICAgY2xlYXJDb2xvcjogbmV3IENvbG9yKDB4ZmZmZmZmKSxcbiAgICAgIGNsZWFyQWxwaGE6IDEuMFxuICAgIH0pO1xuICAgIC8qKlxyXG4gICAgICogQSBibHVyIHBhc3MuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0JsdXJQYXNzfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMuYmx1clBhc3MgPSBuZXcgQmx1clBhc3Mob3B0aW9ucyk7XG4gICAgX3RoaXMua2VybmVsU2l6ZSA9IG9wdGlvbnMua2VybmVsU2l6ZTtcbiAgICAvKipcclxuICAgICAqIEEgY29weSBwYXNzIHRoYXQgcmVuZGVycyB0aGUgcmVhZCBidWZmZXIgdG8gc2NyZWVuIGlmIG5lZWRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7U2hhZGVyUGFzc31cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLmNvcHlQYXNzID0gbmV3IFNoYWRlclBhc3MobmV3IENvcHlNYXRlcmlhbCgpKTtcbiAgICBfdGhpcy5jb3B5UGFzcy5yZW5kZXJUb1NjcmVlbiA9IHRydWU7XG4gICAgLyoqXHJcbiAgICAgKiBBbiBvdXRsaW5lIGVkZ2UgZGV0ZWN0aW9uIG1hdGVyaWFsLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtPdXRsaW5lRWRnZXNNYXRlcmlhbH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLm91dGxpbmVFZGdlc01hdGVyaWFsID0gbmV3IE91dGxpbmVFZGdlc01hdGVyaWFsKG9wdGlvbnMpO1xuICAgIF90aGlzLm91dGxpbmVFZGdlc01hdGVyaWFsLnVuaWZvcm1zLnRNYXNrLnZhbHVlID0gX3RoaXMucmVuZGVyVGFyZ2V0TWFzay50ZXh0dXJlO1xuICAgIC8qKlxyXG4gICAgICogQW4gb3V0bGluZSBibGVuZCBtYXRlcmlhbC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7T3V0bGluZUJsZW5kTWF0ZXJpYWx9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5vdXRsaW5lQmxlbmRNYXRlcmlhbCA9IG5ldyBPdXRsaW5lQmxlbmRNYXRlcmlhbChvcHRpb25zKTtcbiAgICBfdGhpcy5vdXRsaW5lQmxlbmRNYXRlcmlhbC51bmlmb3Jtcy50TWFzay52YWx1ZSA9IF90aGlzLnJlbmRlclRhcmdldE1hc2sudGV4dHVyZTtcbiAgICBfdGhpcy5ibHVyID0gb3B0aW9ucy5ibHVyICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJsdXIgOiB0cnVlO1xuICAgIC8qKlxyXG4gICAgICogQSBsaXN0IG9mIG9iamVjdHMgdG8gb3V0bGluZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0M0RbXX1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnNlbGVjdGlvbiA9IFtdO1xuICAgIC8qKlxyXG4gICAgICogVGhlIGN1cnJlbnQgYW5pbWF0aW9uIHRpbWUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnRpbWUgPSAwLjA7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcHVsc2Ugc3BlZWQuIEEgdmFsdWUgb2YgemVybyBkaXNhYmxlcyB0aGUgcHVsc2UgZWZmZWN0LlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cblxuICAgIF90aGlzLnB1bHNlU3BlZWQgPSBvcHRpb25zLnB1bHNlU3BlZWQgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMucHVsc2VTcGVlZCA6IDAuMDtcbiAgICAvKipcclxuICAgICAqIEEgZGVkaWNhdGVkIHJlbmRlciBsYXllciBmb3Igc2VsZWN0ZWQgb2JqZWN0cy5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGxheWVyIGlzIHNldCB0byAxMCBieSBkZWZhdWx0LiBJZiB0aGlzIGNvbGxpZGVzIHdpdGggeW91ciBvd24gY3VzdG9tXHJcbiAgICAgKiBsYXllcnMsIHBsZWFzZSBjaGFuZ2UgaXQgdG8gYSBmcmVlIGxheWVyIGJlZm9yZSByZW5kZXJpbmchXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuXG4gICAgX3RoaXMuc2VsZWN0aW9uTGF5ZXIgPSAxMDtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogVGhlIHJlc29sdXRpb24gc2NhbGUuXHJcbiAgICpcclxuICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoT3V0bGluZVBhc3MsIFt7XG4gICAga2V5OiBcInNldFBhdHRlcm5UZXh0dXJlXCIsXG5cbiAgICAvKipcclxuICAgICAqIFNldHMgYSBwYXR0ZXJuIHRleHR1cmUgdG8gdXNlIGFzIGFuIG92ZXJsYXkgZm9yIHNlbGVjdGVkIG9iamVjdHMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtUZXh0dXJlfSBbdGV4dHVyZT1udWxsXSAtIEEgcGF0dGVybiB0ZXh0dXJlLiBTZXQgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBwYXR0ZXJuLlxyXG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFBhdHRlcm5UZXh0dXJlKCkge1xuICAgICAgdmFyIHRleHR1cmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgICB0aGlzLm91dGxpbmVCbGVuZE1hdGVyaWFsLnNldFBhdHRlcm5UZXh0dXJlKHRleHR1cmUpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIENsZWFycyB0aGUgY3VycmVudCBzZWxlY3Rpb24gYW5kIHNlbGVjdHMgYSBsaXN0IG9mIG9iamVjdHMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtPYmplY3QzRFtdfSBvYmplY3RzIC0gVGhlIG9iamVjdHMgdGhhdCBzaG91bGQgYmUgb3V0bGluZWQuIFRoaXMgYXJyYXkgd2lsbCBiZSBjb3BpZWQuXHJcbiAgICAgKiBAcmV0dXJuIHtPdXRsaW5lUGFzc30gVGhpcyBwYXNzLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRTZWxlY3Rpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2VsZWN0aW9uKG9iamVjdHMpIHtcbiAgICAgIHZhciBzZWxlY3Rpb24gPSBvYmplY3RzLnNsaWNlKDApO1xuICAgICAgdmFyIHNlbGVjdGlvbkxheWVyID0gdGhpcy5zZWxlY3Rpb25MYXllcjtcbiAgICAgIHZhciBpLCBsO1xuICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuXG4gICAgICBmb3IgKGkgPSAwLCBsID0gc2VsZWN0aW9uLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICBzZWxlY3Rpb25baV0ubGF5ZXJzLmVuYWJsZShzZWxlY3Rpb25MYXllcik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogQ2xlYXJzIHRoZSBsaXN0IG9mIHNlbGVjdGVkIG9iamVjdHMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7T3V0bGluZVBhc3N9IFRoaXMgcGFzcy5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiY2xlYXJTZWxlY3Rpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXJTZWxlY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb247XG4gICAgICB2YXIgc2VsZWN0aW9uTGF5ZXIgPSB0aGlzLnNlbGVjdGlvbkxheWVyO1xuICAgICAgdmFyIGksIGw7XG5cbiAgICAgIGZvciAoaSA9IDAsIGwgPSBzZWxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgIHNlbGVjdGlvbltpXS5sYXllcnMuZGlzYWJsZShzZWxlY3Rpb25MYXllcik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2VsZWN0aW9uID0gW107XG4gICAgICB0aGlzLnRpbWUgPSAwLjA7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBTZWxlY3RzIGFuIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgb2JqZWN0IHRoYXQgc2hvdWxkIGJlIG91dGxpbmVkLlxyXG4gICAgICogQHJldHVybiB7T3V0bGluZVBhc3N9IFRoaXMgcGFzcy5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2VsZWN0T2JqZWN0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNlbGVjdE9iamVjdChvYmplY3QpIHtcbiAgICAgIG9iamVjdC5sYXllcnMuZW5hYmxlKHRoaXMuc2VsZWN0aW9uTGF5ZXIpO1xuICAgICAgdGhpcy5zZWxlY3Rpb24ucHVzaChvYmplY3QpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogRGVzZWxlY3RzIGFuIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgb2JqZWN0IHRoYXQgc2hvdWxkIG5vIGxvbmdlciBiZSBvdXRsaW5lZC5cclxuICAgICAqIEByZXR1cm4ge091dGxpbmVQYXNzfSBUaGlzIHBhc3MuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlc2VsZWN0T2JqZWN0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc2VsZWN0T2JqZWN0KG9iamVjdCkge1xuICAgICAgdmFyIHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uO1xuICAgICAgdmFyIGluZGV4ID0gc2VsZWN0aW9uLmluZGV4T2Yob2JqZWN0KTtcblxuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgc2VsZWN0aW9uW2luZGV4XS5sYXllcnMuZGlzYWJsZSh0aGlzLnNlbGVjdGlvbkxheWVyKTtcbiAgICAgICAgc2VsZWN0aW9uLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLnRpbWUgPSAwLjA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdmlzaWJpbGl0eSBvZiBhbGwgc2VsZWN0ZWQgb2JqZWN0cy5cclxuICAgICAqXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSB2aXNpYmxlIC0gV2hldGhlciB0aGUgc2VsZWN0ZWQgb2JqZWN0cyBzaG91bGQgYmUgdmlzaWJsZS5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0U2VsZWN0aW9uVmlzaWJsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTZWxlY3Rpb25WaXNpYmxlKHZpc2libGUpIHtcbiAgICAgIHZhciBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbjtcbiAgICAgIHZhciBpLCBsO1xuXG4gICAgICBmb3IgKGkgPSAwLCBsID0gc2VsZWN0aW9uLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICBpZiAodmlzaWJsZSkge1xuICAgICAgICAgIHNlbGVjdGlvbltpXS5sYXllcnMuZW5hYmxlKDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdGlvbltpXS5sYXllcnMuZGlzYWJsZSgwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xuICAgICAgdmFyIG1haW5TY2VuZSA9IHRoaXMubWFpblNjZW5lO1xuICAgICAgdmFyIG1haW5DYW1lcmEgPSB0aGlzLm1haW5DYW1lcmE7XG4gICAgICB2YXIgcHVsc2UgPSB0aGlzLm91dGxpbmVCbGVuZE1hdGVyaWFsLnVuaWZvcm1zLnB1bHNlO1xuICAgICAgdmFyIGJhY2tncm91bmQsIG1hc2s7XG5cbiAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGJhY2tncm91bmQgPSBtYWluU2NlbmUuYmFja2dyb3VuZDtcbiAgICAgICAgbWFzayA9IG1haW5DYW1lcmEubGF5ZXJzLm1hc2s7XG4gICAgICAgIG1haW5TY2VuZS5iYWNrZ3JvdW5kID0gbnVsbDtcbiAgICAgICAgcHVsc2UudmFsdWUgPSAxLjA7XG5cbiAgICAgICAgaWYgKHRoaXMucHVsc2VTcGVlZCA+IDAuMCkge1xuICAgICAgICAgIHB1bHNlLnZhbHVlID0gMC42MjUgKyBNYXRoLmNvcyh0aGlzLnRpbWUgKiB0aGlzLnB1bHNlU3BlZWQgKiAxMC4wKSAqIDAuMzc1O1xuICAgICAgICAgIHRoaXMudGltZSArPSBkZWx0YTtcbiAgICAgICAgfSAvLyBSZW5kZXIgYSBjdXN0b20gZGVwdGggdGV4dHVyZSBhbmQgaWdub3JlIHNlbGVjdGVkIG9iamVjdHMuXG5cblxuICAgICAgICB0aGlzLnNldFNlbGVjdGlvblZpc2libGUoZmFsc2UpO1xuICAgICAgICB0aGlzLnJlbmRlclBhc3NEZXB0aC5yZW5kZXIocmVuZGVyZXIsIHRoaXMucmVuZGVyVGFyZ2V0RGVwdGgpO1xuICAgICAgICB0aGlzLnNldFNlbGVjdGlvblZpc2libGUodHJ1ZSk7IC8vIENyZWF0ZSBhIG1hc2sgZm9yIHRoZSBzZWxlY3RlZCBvYmplY3RzIHVzaW5nIHRoZSBkZXB0aCBpbmZvcm1hdGlvbi5cblxuICAgICAgICBtYWluQ2FtZXJhLmxheWVycy5tYXNrID0gMSA8PCB0aGlzLnNlbGVjdGlvbkxheWVyO1xuICAgICAgICB0aGlzLnJlbmRlclBhc3NNYXNrLnJlbmRlcihyZW5kZXJlciwgdGhpcy5yZW5kZXJUYXJnZXRNYXNrKTsgLy8gUmVzdG9yZSB0aGUgY2FtZXJhIGxheWVyIG1hc2sgYW5kIHRoZSBzY2VuZSBiYWNrZ3JvdW5kLlxuXG4gICAgICAgIG1haW5DYW1lcmEubGF5ZXJzLm1hc2sgPSBtYXNrO1xuICAgICAgICBtYWluU2NlbmUuYmFja2dyb3VuZCA9IGJhY2tncm91bmQ7IC8vIERldGVjdCB0aGUgb3V0bGluZS5cblxuICAgICAgICB0aGlzLm1hdGVyaWFsID0gdGhpcy5vdXRsaW5lRWRnZXNNYXRlcmlhbDtcbiAgICAgICAgcmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRhcmdldEVkZ2VzKTtcblxuICAgICAgICBpZiAodGhpcy5ibHVyUGFzcy5lbmFibGVkKSB7XG4gICAgICAgICAgLy8gQmx1ciB0aGUgZWRnZXMuXG4gICAgICAgICAgdGhpcy5ibHVyUGFzcy5yZW5kZXIocmVuZGVyZXIsIHRoaXMucmVuZGVyVGFyZ2V0RWRnZXMsIHRoaXMucmVuZGVyVGFyZ2V0Qmx1cnJlZEVkZ2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmJsZW5kKSB7XG4gICAgICAgICAgLy8gRHJhdyB0aGUgZmluYWwgb3ZlcmxheSBvbnRvIHRoZSBzY2VuZSBjb2xvdXJzLlxuICAgICAgICAgIHRoaXMubWF0ZXJpYWwgPSB0aGlzLm91dGxpbmVCbGVuZE1hdGVyaWFsO1xuICAgICAgICAgIHRoaXMub3V0bGluZUJsZW5kTWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xuICAgICAgICAgIHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiB0aGlzLm91dHB1dEJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5yZW5kZXJUb1NjcmVlbikge1xuICAgICAgICAvLyBEcmF3IHRoZSByZWFkIGJ1ZmZlciB0byBzY3JlZW4uXG4gICAgICAgIHRoaXMuY29weVBhc3MucmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlcik7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFNpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICB0aGlzLnJlbmRlclRhcmdldERlcHRoLnNldFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLnJlbmRlclRhcmdldE1hc2suc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHRoaXMucmVuZGVyUGFzc0RlcHRoLnNldFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLnJlbmRlclBhc3NNYXNrLnNldFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLmJsdXJQYXNzLnNldFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICB3aWR0aCA9IHRoaXMuYmx1clBhc3Mud2lkdGg7XG4gICAgICBoZWlnaHQgPSB0aGlzLmJsdXJQYXNzLmhlaWdodDtcbiAgICAgIHRoaXMucmVuZGVyVGFyZ2V0RWRnZXMuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHRoaXMucmVuZGVyVGFyZ2V0Qmx1cnJlZEVkZ2VzLnNldFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLm91dGxpbmVCbGVuZE1hdGVyaWFsLnVuaWZvcm1zLmFzcGVjdC52YWx1ZSA9IHdpZHRoIC8gaGVpZ2h0O1xuICAgICAgdGhpcy5vdXRsaW5lRWRnZXNNYXRlcmlhbC5zZXRUZXhlbFNpemUoMS4wIC8gd2lkdGgsIDEuMCAvIGhlaWdodCk7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gdGFza3MuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYWxwaGEgLSBXaGV0aGVyIHRoZSByZW5kZXJlciB1c2VzIHRoZSBhbHBoYSBjaGFubmVsIG9yIG5vdC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW5pdGlhbGl6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSkge1xuICAgICAgdGhpcy5yZW5kZXJQYXNzRGVwdGguaW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpO1xuICAgICAgdGhpcy5yZW5kZXJQYXNzTWFzay5pbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSk7XG4gICAgICB0aGlzLmJsdXJQYXNzLmluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzb2x1dGlvblNjYWxlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5ibHVyUGFzcy5yZXNvbHV0aW9uU2NhbGU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogWW91IG5lZWQgdG8gY2FsbCB7QGxpbmsgRWZmZWN0Q29tcG9zZXIjc2V0U2l6ZX0gYWZ0ZXIgY2hhbmdpbmcgdGhpcyB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAwLjU7XG4gICAgICB0aGlzLmJsdXJQYXNzLnJlc29sdXRpb25TY2FsZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFRoZSBibHVyIGtlcm5lbCBzaXplLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtLZXJuZWxTaXplfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJrZXJuZWxTaXplXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5ibHVyUGFzcy5rZXJuZWxTaXplO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEB0eXBlIHtLZXJuZWxTaXplfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBLZXJuZWxTaXplLlZFUllfU01BTEw7XG4gICAgICB0aGlzLmJsdXJQYXNzLmtlcm5lbFNpemUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgb3V0bGluZSBvdmVybGF5IHNob3VsZCBiZSBibHVycmVkLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJibHVyXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5ibHVyUGFzcy5lbmFibGVkO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICB0aGlzLmJsdXJQYXNzLmVuYWJsZWQgPSB2YWx1ZTtcbiAgICAgIHRoaXMub3V0bGluZUJsZW5kTWF0ZXJpYWwudW5pZm9ybXMudEVkZ2VzLnZhbHVlID0gdmFsdWUgPyB0aGlzLnJlbmRlclRhcmdldEJsdXJyZWRFZGdlcy50ZXh0dXJlIDogdGhpcy5yZW5kZXJUYXJnZXRFZGdlcy50ZXh0dXJlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGRpdGhlcmluZyBpcyBlbmFibGVkLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkaXRoZXJpbmdcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmJsdXJQYXNzLmRpdGhlcmluZztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBJZiBlbmFibGVkLCB0aGUgcmVzdWx0IHdpbGwgYmUgZGl0aGVyZWQgdG8gcmVtb3ZlIGJhbmRpbmcgYXJ0aWZhY3RzLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICB0aGlzLmJsdXJQYXNzLmRpdGhlcmluZyA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlZmZlY3Qgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIGlucHV0IGJ1ZmZlci5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYmxlbmRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm5lZWRzU3dhcDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBJZiBkaXNhYmxlZCwgdGhlIGlucHV0IGJ1ZmZlciB3aWxsIHJlbWFpbiB1bmFmZmVjdGVkLlxyXG4gICAgICpcclxuICAgICAqIFlvdSBtYXkgdXNlIHRoZSB7QGxpbmsgQmxvb21QYXNzI292ZXJsYXl9IHRleHR1cmUgdG8gYXBwbHkgdGhlIGVmZmVjdCB0b1xyXG4gICAgICogeW91ciBzY2VuZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgdGhpcy5uZWVkc1N3YXAgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZWZmZWN0IG92ZXJsYXkgdGV4dHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7VGV4dHVyZX1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwib3ZlcmxheVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMub3V0bGluZUJsZW5kTWF0ZXJpYWwudW5pZm9ybXMudEVkZ2VzLnZhbHVlO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKE91dGxpbmVQYXNzLCBfUGFzcyk7XG5cbiAgcmV0dXJuIE91dGxpbmVQYXNzO1xufShQYXNzKTtcblxuLyoqXHJcbiAqIEEgcGl4ZWxhdGlvbiBwYXNzLlxyXG4gKi9cblxudmFyIFBpeGVsYXRpb25QYXNzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUGFzcykge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHBpeGVsYXRpb24gcGFzcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbZ3JhbnVsYXJpdHk9MzAuMF0gLSBUaGUgaW50ZW5zaXR5IG9mIHRoZSBlZmZlY3QuXHJcbiAgICovXG4gIGZ1bmN0aW9uIFBpeGVsYXRpb25QYXNzKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBncmFudWxhcml0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMzAuMDtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFBpeGVsYXRpb25QYXNzKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFBpeGVsYXRpb25QYXNzKS5jYWxsKHRoaXMsIFwiUGl4ZWxhdGlvblBhc3NcIikpO1xuICAgIF90aGlzLm1hdGVyaWFsID0gbmV3IFBpeGVsYXRpb25NYXRlcmlhbCgpO1xuICAgIF90aGlzLmdyYW51bGFyaXR5ID0gZ3JhbnVsYXJpdHk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIFRoZSBwaXhlbCBncmFudWxhcml0eS5cclxuICAgKlxyXG4gICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhQaXhlbGF0aW9uUGFzcywgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG5cbiAgICAvKipcclxuICAgICAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcbiAgICAgIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xuICAgICAgcmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFNpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICB0aGlzLm1hdGVyaWFsLnNldFJlc29sdXRpb24od2lkdGgsIGhlaWdodCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdyYW51bGFyaXR5XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXRlcmlhbC5ncmFudWxhcml0eTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBBIGhpZ2hlciB2YWx1ZSB5aWVsZHMgY29hcnNlciB2aXN1YWxzLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDMwO1xuICAgICAgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKTtcblxuICAgICAgaWYgKHZhbHVlICUgMiA+IDApIHtcbiAgICAgICAgdmFsdWUgKz0gMTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5tYXRlcmlhbC5ncmFudWxhcml0eSA9IHZhbHVlO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFBpeGVsYXRpb25QYXNzLCBfUGFzcyk7XG5cbiAgcmV0dXJuIFBpeGVsYXRpb25QYXNzO1xufShQYXNzKTtcblxuLyoqXHJcbiAqIEFuIGFkdmFuY2VkIERlcHRoIG9mIEZpZWxkIChEb0YpIHBhc3MuXHJcbiAqXHJcbiAqIFlpZWxkcyBtb3JlIHJlYWxpc3RpYyByZXN1bHRzIGJ1dCBpcyBhbHNvIG1vcmUgZGVtYW5kaW5nLlxyXG4gKlxyXG4gKiBUaGlzIHBhc3MgcmVxdWlyZXMgYSB7QGxpbmsgRWZmZWN0Q29tcG9zZXIjZGVwdGhUZXh0dXJlfS5cclxuICovXG5cbnZhciBSZWFsaXN0aWNCb2tlaFBhc3MgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9QYXNzKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgYm9rZWggcGFzcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UGVyc3BlY3RpdmVDYW1lcmF9IGNhbWVyYSAtIFRoZSBtYWluIGNhbWVyYS4gVXNlZCB0byBvYnRhaW4gdGhlIGZvY2FsIGxlbmd0aCBhbmQgdGhlIG5lYXIgYW5kIGZhciBwbGFuZSBzZXR0aW5ncy5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQWRkaXRpb25hbCBwYXJhbWV0ZXJzLiBTZWUge0BsaW5rIFJlYWxpc3RpY0Jva2VoTWF0ZXJpYWx9IGZvciBkZXRhaWxzLlxyXG4gICAqL1xuICBmdW5jdGlvbiBSZWFsaXN0aWNCb2tlaFBhc3MoY2FtZXJhKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUmVhbGlzdGljQm9rZWhQYXNzKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFJlYWxpc3RpY0Jva2VoUGFzcykuY2FsbCh0aGlzLCBcIlJlYWxpc3RpY0Jva2VoUGFzc1wiKSk7XG4gICAgX3RoaXMubWF0ZXJpYWwgPSBuZXcgUmVhbGlzdGljQm9rZWhNYXRlcmlhbChjYW1lcmEsIG9wdGlvbnMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoUmVhbGlzdGljQm9rZWhQYXNzLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcbiAgICAgIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xuICAgICAgdGhpcy5tYXRlcmlhbC51bmlmb3Jtcy50RGVwdGgudmFsdWUgPSBpbnB1dEJ1ZmZlci5kZXB0aFRleHR1cmU7XG4gICAgICByZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBzaXplIG9mIHRoaXMgcGFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0U2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHRoaXMubWF0ZXJpYWwuc2V0VGV4ZWxTaXplKDEuMCAvIHdpZHRoLCAxLjAgLyBoZWlnaHQpO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFJlYWxpc3RpY0Jva2VoUGFzcywgX1Bhc3MpO1xuXG4gIHJldHVybiBSZWFsaXN0aWNCb2tlaFBhc3M7XG59KFBhc3MpO1xuXG4vKipcclxuICogQSBwYXNzIHRoYXQgcmVuZGVycyB0aGUgcmVzdWx0IGZyb20gYSBwcmV2aW91cyBwYXNzIHRvIGFub3RoZXIgcmVuZGVyIHRhcmdldC5cclxuICovXG5cbnZhciBTYXZlUGFzcyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1Bhc3MpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBzYXZlIHBhc3MuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBbcmVuZGVyVGFyZ2V0XSAtIFRoZSByZW5kZXIgdGFyZ2V0IHRvIHVzZSBmb3Igc2F2aW5nIHRoZSBpbnB1dCBidWZmZXIuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbcmVzaXplPXRydWVdIC0gV2hldGhlciB0aGUgcmVuZGVyIHRhcmdldCBzaG91bGQgYWRqdXN0IHRvIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBidWZmZXIuXHJcbiAgICovXG4gIGZ1bmN0aW9uIFNhdmVQYXNzKHJlbmRlclRhcmdldCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciByZXNpemUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTYXZlUGFzcyk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihTYXZlUGFzcykuY2FsbCh0aGlzLCBcIlNhdmVQYXNzXCIpKTtcbiAgICBfdGhpcy5tYXRlcmlhbCA9IG5ldyBDb3B5TWF0ZXJpYWwoKTtcbiAgICBfdGhpcy5uZWVkc1N3YXAgPSBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIFRoZSByZW5kZXIgdGFyZ2V0LlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuICAgICAqL1xuXG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0ID0gcmVuZGVyVGFyZ2V0ICE9PSB1bmRlZmluZWQgPyByZW5kZXJUYXJnZXQgOiBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoMSwgMSwge1xuICAgICAgbWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG4gICAgICBtYWdGaWx0ZXI6IExpbmVhckZpbHRlcixcbiAgICAgIHN0ZW5jaWxCdWZmZXI6IGZhbHNlLFxuICAgICAgZGVwdGhCdWZmZXI6IGZhbHNlXG4gICAgfSk7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0LnRleHR1cmUubmFtZSA9IFwiU2F2ZS5UYXJnZXRcIjtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSByZW5kZXIgdGFyZ2V0IHNob3VsZCBiZSByZXNpemVkIHdoZW4gdGhlIHNpemUgb2ZcclxuICAgICAqIHRoZSBjb21wb3NlcidzIGZyYW1lIGJ1ZmZlciBjaGFuZ2VzLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5yZXNpemUgPSByZXNpemU7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhTYXZlUGFzcywgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XG4gICAgICB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcbiAgICAgIHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUYXJnZXQpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNpemUod2lkdGgsIGhlaWdodCkge1xuICAgICAgaWYgKHRoaXMucmVzaXplKSB7XG4gICAgICAgIHdpZHRoID0gTWF0aC5tYXgoMSwgd2lkdGgpO1xuICAgICAgICBoZWlnaHQgPSBNYXRoLm1heCgxLCBoZWlnaHQpO1xuICAgICAgICB0aGlzLnJlbmRlclRhcmdldC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIHRhc2tzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGFscGhhIC0gV2hldGhlciB0aGUgcmVuZGVyZXIgdXNlcyB0aGUgYWxwaGEgY2hhbm5lbCBvciBub3QuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImluaXRpYWxpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpIHtcbiAgICAgIGlmICghYWxwaGEpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZS5mb3JtYXQgPSBSR0JGb3JtYXQ7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoU2F2ZVBhc3MsIF9QYXNzKTtcblxuICByZXR1cm4gU2F2ZVBhc3M7XG59KFBhc3MpO1xuXG4vKipcclxuICogSGFsZiBQSS5cclxuICpcclxuICogQHR5cGUge051bWJlcn1cclxuICogQHByaXZhdGVcclxuICovXG5cbnZhciBIQUxGX1BJID0gTWF0aC5QSSAqIDAuNTtcbi8qKlxyXG4gKiBBIHZlY3Rvci5cclxuICpcclxuICogQHR5cGUge1ZlY3RvcjN9XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG52YXIgdiA9IG5ldyBWZWN0b3IzKCk7XG4vKipcclxuICogQSB2ZWN0b3IuXHJcbiAqXHJcbiAqIEB0eXBlIHtWZWN0b3IzfVxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxudmFyIGFiID0gbmV3IFZlY3RvcjMoKTtcbi8qKlxyXG4gKiBBIHNob2NrIHdhdmUgcGFzcy5cclxuICovXG5cbnZhciBTaG9ja1dhdmVQYXNzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUGFzcykge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHNob2NrIHdhdmUgcGFzcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgbWFpbiBjYW1lcmEuXHJcbiAgICogQHBhcmFtIHtWZWN0b3IzfSBbZXBpY2VudGVyXSAtIFRoZSB3b3JsZCBwb3NpdGlvbiBvZiB0aGUgc2hvY2sgd2F2ZSBlcGljZW50ZXIuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5zcGVlZD0xLjBdIC0gVGhlIGFuaW1hdGlvbiBzcGVlZC5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4UmFkaXVzPTEuMF0gLSBUaGUgZXh0ZW50IG9mIHRoZSBzaG9jayB3YXZlLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy53YXZlU2l6ZT0wLjJdIC0gVGhlIHdhdmUgc2l6ZS5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuYW1wbGl0dWRlPTAuMDVdIC0gVGhlIGRpc3RvcnRpb24gYW1wbGl0dWRlLlxyXG4gICAqL1xuICBmdW5jdGlvbiBTaG9ja1dhdmVQYXNzKGNhbWVyYSkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBlcGljZW50ZXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG5ldyBWZWN0b3IzKCk7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgU2hvY2tXYXZlUGFzcyk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihTaG9ja1dhdmVQYXNzKS5jYWxsKHRoaXMsIFwiU2hvY2tXYXZlUGFzc1wiKSk7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWFpbiBjYW1lcmEuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge09iamVjdDNEfVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5tYWluQ2FtZXJhID0gY2FtZXJhO1xuICAgIC8qKlxyXG4gICAgICogVGhlIGVwaWNlbnRlci5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7VmVjdG9yM31cclxuICAgICAqIEBleGFtcGxlIHNob2NrV2F2ZVBhc3MuZXBpY2VudGVyID0gbXlNZXNoLnBvc2l0aW9uO1xyXG4gICAgICovXG5cbiAgICBfdGhpcy5lcGljZW50ZXIgPSBlcGljZW50ZXI7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb2JqZWN0IHBvc2l0aW9uIGluIHNjcmVlbiBzcGFjZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7VmVjdG9yM31cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnNjcmVlblBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcbiAgICAvKipcclxuICAgICAqIFRoZSBzcGVlZCBvZiB0aGUgc2hvY2sgd2F2ZSBhbmltYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuXG4gICAgX3RoaXMuc3BlZWQgPSBvcHRpb25zLnNwZWVkICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnNwZWVkIDogMi4wO1xuICAgIC8qKlxyXG4gICAgICogQSB0aW1lIGFjY3VtdWxhdG9yLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy50aW1lID0gMC4wO1xuICAgIC8qKlxyXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNob2NrIHdhdmUgYW5pbWF0aW9uIGlzIGFjdGl2ZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgIC8qKlxyXG4gICAgICogQSBzaG9jayB3YXZlIHNoYWRlciBtYXRlcmlhbC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7U2hvY2tXYXZlTWF0ZXJpYWx9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5zaG9ja1dhdmVNYXRlcmlhbCA9IG5ldyBTaG9ja1dhdmVNYXRlcmlhbChvcHRpb25zKTtcbiAgICBfdGhpcy5zaG9ja1dhdmVNYXRlcmlhbC51bmlmb3Jtcy5jZW50ZXIudmFsdWUgPSBfdGhpcy5zY3JlZW5Qb3NpdGlvbjtcbiAgICAvKipcclxuICAgICAqIEEgY29weSBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0NvcHlNYXRlcmlhbH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLmNvcHlNYXRlcmlhbCA9IG5ldyBDb3B5TWF0ZXJpYWwoKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogRW1pdHMgdGhlIHNob2NrIHdhdmUuXHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhTaG9ja1dhdmVQYXNzLCBbe1xuICAgIGtleTogXCJleHBsb2RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGV4cGxvZGUoKSB7XG4gICAgICB0aGlzLnRpbWUgPSAwLjA7XG4gICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XG4gICAgICB2YXIgZXBpY2VudGVyID0gdGhpcy5lcGljZW50ZXI7XG4gICAgICB2YXIgbWFpbkNhbWVyYSA9IHRoaXMubWFpbkNhbWVyYTtcbiAgICAgIHZhciBzY3JlZW5Qb3NpdGlvbiA9IHRoaXMuc2NyZWVuUG9zaXRpb247XG4gICAgICB2YXIgc2hvY2tXYXZlTWF0ZXJpYWwgPSB0aGlzLnNob2NrV2F2ZU1hdGVyaWFsO1xuICAgICAgdmFyIHVuaWZvcm1zID0gc2hvY2tXYXZlTWF0ZXJpYWwudW5pZm9ybXM7XG4gICAgICB2YXIgY2VudGVyID0gdW5pZm9ybXMuY2VudGVyO1xuICAgICAgdmFyIHJhZGl1cyA9IHVuaWZvcm1zLnJhZGl1cztcbiAgICAgIHZhciBtYXhSYWRpdXMgPSB1bmlmb3Jtcy5tYXhSYWRpdXM7XG4gICAgICB2YXIgd2F2ZVNpemUgPSB1bmlmb3Jtcy53YXZlU2l6ZTtcbiAgICAgIHRoaXMuY29weU1hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcbiAgICAgIHRoaXMubWF0ZXJpYWwgPSB0aGlzLmNvcHlNYXRlcmlhbDtcblxuICAgICAgaWYgKHRoaXMuYWN0aXZlKSB7XG4gICAgICAgIC8vIENhbGN1bGF0ZSBkaXJlY3Rpb24gdmVjdG9ycy5cbiAgICAgICAgbWFpbkNhbWVyYS5nZXRXb3JsZERpcmVjdGlvbih2KTtcbiAgICAgICAgYWIuY29weShtYWluQ2FtZXJhLnBvc2l0aW9uKS5zdWIoZXBpY2VudGVyKTsgLy8gRG9uJ3QgcmVuZGVyIHRoZSBlZmZlY3QgaWYgdGhlIG9iamVjdCBpcyBiZWhpbmQgdGhlIGNhbWVyYS5cblxuICAgICAgICBpZiAodi5hbmdsZVRvKGFiKSA+IEhBTEZfUEkpIHtcbiAgICAgICAgICAvLyBTY2FsZSB0aGUgZWZmZWN0IGJhc2VkIG9uIGRpc3RhbmNlIHRvIHRoZSBvYmplY3QuXG4gICAgICAgICAgdW5pZm9ybXMuY2FtZXJhRGlzdGFuY2UudmFsdWUgPSBtYWluQ2FtZXJhLnBvc2l0aW9uLmRpc3RhbmNlVG8oZXBpY2VudGVyKTsgLy8gQ2FsY3VsYXRlIHRoZSBzY3JlZW4gcG9zaXRpb24gb2YgdGhlIGVwaWNlbnRlci5cblxuICAgICAgICAgIHNjcmVlblBvc2l0aW9uLmNvcHkoZXBpY2VudGVyKS5wcm9qZWN0KG1haW5DYW1lcmEpO1xuICAgICAgICAgIGNlbnRlci52YWx1ZS54ID0gKHNjcmVlblBvc2l0aW9uLnggKyAxLjApICogMC41O1xuICAgICAgICAgIGNlbnRlci52YWx1ZS55ID0gKHNjcmVlblBvc2l0aW9uLnkgKyAxLjApICogMC41O1xuICAgICAgICAgIHVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcbiAgICAgICAgICB0aGlzLm1hdGVyaWFsID0gc2hvY2tXYXZlTWF0ZXJpYWw7XG4gICAgICAgIH0gLy8gVXBkYXRlIHRoZSBzaG9jayB3YXZlIHJhZGl1cyBiYXNlZCBvbiB0aW1lLlxuXG5cbiAgICAgICAgdGhpcy50aW1lICs9IGRlbHRhICogdGhpcy5zcGVlZDtcbiAgICAgICAgcmFkaXVzLnZhbHVlID0gdGhpcy50aW1lIC0gd2F2ZVNpemUudmFsdWU7XG5cbiAgICAgICAgaWYgKHJhZGl1cy52YWx1ZSA+PSAobWF4UmFkaXVzLnZhbHVlICsgd2F2ZVNpemUudmFsdWUpICogMikge1xuICAgICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFNpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICB0aGlzLnNob2NrV2F2ZU1hdGVyaWFsLnVuaWZvcm1zLmFzcGVjdC52YWx1ZSA9IHdpZHRoIC8gaGVpZ2h0O1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFNob2NrV2F2ZVBhc3MsIF9QYXNzKTtcblxuICByZXR1cm4gU2hvY2tXYXZlUGFzcztcbn0oUGFzcyk7XG5cbi8vIEdlbmVyYXRlZCB3aXRoIFNNQUFTZWFyY2hJbWFnZURhdGEuZ2VuZXJhdGUoKS50b0NhbnZhcygpLnRvRGF0YVVSTCgpLCBub3QgY3JvcHBlZCwgbG93IGR5bmFtaWMgcmFuZ2UuXG52YXIgc2VhcmNoSW1hZ2VEYXRhVVJMID0gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUVJQUFBQWhDQUFBQUFCSVh5TEFBQUFBT0VsRVFWUkl4Mk5nR0FXallCU01nbEV3RUlDUkVZUmdGQlpCcURDU0xBMk1HUFVJVlFFVEU5aU5VQXFMUjVnSWVvUUtSZ3dYandBQUduNEF0YUZlWUxFQUFBQUFTVVZPUks1Q1lJSVwiO1xuXG4vLyBHZW5lcmF0ZWQgd2l0aCBTTUFBQXJlYUltYWdlRGF0YS5nZW5lcmF0ZSgpLnRvQ2FudmFzKCkudG9EYXRhVVJMKCkuXG52YXIgYXJlYUltYWdlRGF0YVVSTCA9IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFLQUFBQUl3Q0FZQUFBQUJObUJIQUFBZ0FFbEVRVlI0WHV5OUNiaGxWMWt0T3ZicHEwOURraUlrVUJJNmt4QVNJSDBEbEFRaUlLMXdSZlNKVHgraTRKWDd2S0lpZ3M4SFhwWHZxVmN2cmNDOWFnUTdJRFRTU1dncUNRUWxpRFJCSktra2hEU2txVlBOcVZPblArOGIvL3JIM1ArZVorMTk5dGx6blZUbHZWcmZ0NysxVDdPYXVlWlk0Mi9tMzdRQUxLTmsyd0hnMXBJVGxCMTdtQytQcDExVzNYL0xIeVQzMnZoZzQ4LzVTT3YrUG53cHNIQTcwSm9HbHVlQjFpS0FwZXF6dk96bjQ0R2F0VEI3Nlh6aGQ3c3VCUjcrV1dBRGdERUF3d0NHL0w1NGIvcG9ETHJIdXZ2bTcwWjJBdmhzYytQVmN4c2NCVThGOEM4QURnNStpcElqRC9QbEd3ZmdqdThCOTI0RTVzZUFSVWZMc2lObXFRVzBJakw4KzdMMk5ZRC83Q09CemZjQ20rYUI4U1ZnZEFrWUlSQ1hLeURheDRFZEFhbkw1UHVOUGxsTnZYRGxBSHdGZ1A4QWNDMkFoUklvRFhic1liNDhkbDVXa1ZGVEUzTEdEY0M5bTRDWkNXQnVGRmdlQVphR0FZSlFRQ1JxREhUK01jSnJWYjh6d0FUVVhIMDJNSFlmTUhFSUdGc0F4Z2pBcFFxQUNZUU9SanRkL0I3QXh0L3o3OXNDMCtjTVBnampsd1B3VndIY0ErRGZBSHpUeGNWZ1dCcm9xTU44K2NZQmVNNzF3SDBUd0tFeFlIWVVXQ0lBSFlSTFRsa0NZZ2NJQmNBZ1UvbjNxeThHUnU0SFJnbkFPV0JrRVJoZGRQQUpoR0pEQnhrdnc3Y3FpbXIrekZNL1pMblpGNjRjZ0w4QllEK0FXd0I4eC9kbFd1V2FnSGlZTDk4NEFKLzBSV0J5MUFFNEFpenlNMXl4WUFjVGlnVzU1eE1iQWt4RWl3RWRrSi9aQ1F4UEFpT0hnQkVDY0tFQzRUQlpjS2tTdittVGllTmNOUE5DMjZtTE5zajQ1UUQ4TFFEVEFPNEdjSnQvN2l3MmJmb0c0V0crdkFHd205RXhpRWc2OXpwZy93Z3dQUUxNamdBTHpuNEU0YUl6b0pqUTlnNDAyNHV5Z2tqK3B5dUFvWDBWQUlmbmdPSDVOZ0NITWhBbThTdjJ5M1hEWmVCaE5JcDhPekpFOE9zQnpBS1lCSEFYZ0R0OC80TytNVlQwajRmNThvMEQ4UHhyZ2YzRHdNd0lNRVBRRVlSa053ZmdzdXVEWkxza2lwME5vMGdXTUQvOUhHRG9BREFrQUM0QXcvd3NBZ1pBZ3MyWjBBQkkwR1U2SVZtS3YrZjI4S0RuSHhrQS9HMEE4eTZHNzNOOWtPQ2pYbmgvRWJiNk92Z3dYNzV4QUY1d0xUQTFWSUhQQURnTUxEajR5SUE1QUFtNmFDVW52NG96NDZlZUR3eE5BVU16d0pBejRCQUJTTkRGVHdTZmc3RERLSEUyM01HNVBxSVk4QTF1L2RJTnM5ZEJkeThBZ25HUE0yTmZVQnJzbnc3ejVSc0g0SVhYQUFjSnZpRmdsdUFieWdCSU5uU0xXT0FqR3hKNHBnT0tEVjB2L09TTEtwOGlHWEJvdmhMQkJPQ1FNMkFDb1RPaG5ZckFkSXRZYkNpajVKRnpSeUlBcVJjY0FuREFRVWpnNlVOUTdoc01YUDBjUlFBZXhzczNEc0NMQ0VDQ0x3Q1F6TWNQd1VpMk13QVNjQUtiZm5ZL1lSTEZROERIWCtJQUpBTVNmRGtBRjEza0x2bGVJamhqUVFIeFVWUzNqamdHcEtlZU56WVZRRWpnVVM4aytQZ2hPTmRoSXdBUDQrWFhCWUNIS0lKYndKeURUZ2FJQWRDQkp4M1EyTTh0WUFIUDltNGRmL3lsUU9zUTBKcXRSTEN4MzBLMXd0TEJnZ1NjUU9nc0tCR2NXSEFKZU93UkMwQlNNMW1RSUtSYmhoK0JqOThKUVA2dDRVMEFQRXlYWHhjQUVueGtRQUZ3b1ZVeElEOWt2UWcrYzFDN3ZpZFJiSURrYzI0Qi8vaFRRR3VtRGNDV0E1RGdNeEFTZE5JRkJVSTVwQ01MOHY4QVBJNXpmRVF4NEJ1ZGdxaWN6dmlTbkpoUXdDUDRCTUNHbCt3TzgrVTdBSmkvVzRPNFlTNitwbUsvMmNpQURzQU9CaFRJSWlBSm5QQjdBdk5qUCswQW5BTmFZa0FIWDJKQkFjK3RZYUpYT3FCWnYyNFZjMzg2WFc1ZHRrSEdXKzRIRkFKb25wT2UrWVlRWkFTaGdLanYzUE52UFFheFZvSTh6SmRmRndBU2ZQek1Vd1MzS3QxdjBVRklsb3M2b0RGZEFHRmNsaU1BUC9yeUFFQUdOd1FSbkRPZ0xiZGxJRXdySXM2QVovUWdrTU1IUUY2WkFLUWNKQXNTWVB3SWVBSWs5d0pnb1BLMWdpNytQd0Y0R0MvZk9BQXZJUVBTczBVUlRQQkovUHAzR1NFR1JIZkJDSVEweG93QnRVYmNBajd5czVYNEpmdTFISUFHUXJJZ1FSWEVzQUZRSU9SREZoaURZL3JNSG1yVTRRVWdSMDhBa2dVakNBVzZDRDZDa3dCc0FJUUM0R0c2ZlBNQTNPWGlOekNnMkk5Z05DTWtzbUFBb2VtRHpvaW1Gd0w0OE04NUFLa2l1UVZNQUFwOENZUlJEQXQ4R1FpSjY3TjZHSk9EQVhBSGxzR2d1c2NBMkFKZzFJUEdZbXhPcEJ4RldrUk45THNBVGdJd1huTnMvdi81ei85WENmOEJPM1lBdHhiYy80Ni9LRHQrNStlYTFZa3UyVlV4SHovejB2MjRGd01HSzFnV3NLMk9VVXhISGRDQmVSVUI2T3hIQUJyNFpJQ0lCZDBRV1NGK1hSZE1UQWpnQ2RUckc5Y0JOd0U0RjhDcERrSUN5WUxHc3VoRnQ2enMrZ0lTd1Vlbjh6RUFqZ013NGNmeDJINk8vOTB5QUZvODRDYmc0SUQzLzlUZkxUdCs1K2ViblJBQmtPRGp4MFN3UGk1ZWMvRnJZcG1xU0F4TThEbjYwQ3NxQUZJNkdmaHFBTWlERS9nb2ttdkVyMEM0UGdEa0JRbTQwd0U4ek1GRVVES0VWb3hJTUxsL0tTNzNtRTdIOWQrdmNLSFFRY2p3VzBZdTluUDhtOHNBbU9JQnVXWTZ3UDIvNHMwZXpqamc4VHV2YVI2QUJKNzB2eFVBcEdybTdFYkdFK2k0NzJCQUIrV0hmcUhTL2VvQWFFd1kyRTkrd0xTWFRxaEk3Q1hnbkI2TENvT0o0QmlTVCtoVG5HMEhjQ3dBZ2xDeDNBUm9aRVZGWG5CUHAvTy9BL2hYQUNjN0NQczkvaTFsQU95SUIrUkRYK1A5LytwYlFqampBTWZ2L1BMNkFGRHMxd0ZBZ3MvOWZnS2ZnZEUvWkVwdWlRbGJ3QWRlNlFBTUJnaVJtc1N3QTlCWTBKZmpvdkdSREJNSDRUbGNYR2hjQk9jNkhrRjBnalBoWmdjaHhUTFpNQWNpLzA0Vy9CNkFiM3QwOUVQWGNQeWZsZ0Z3UlR3Z0oyTU45LzhiZjVxRk02N3grQi9hVzRYUXo0MkZlTDBZclJ5aWt6dFVGdzA3MDRtZjlrWGd4aE9BcWMzQUFzUHlSeHhRQ3MvUGRYT0ZZMFcxS0h5M1FJVUd0eCs2dmRueDF2c0IrZHNUbmNtMkFvZ2dsRmdWRUFsVVdyT01CMlJ5RW1NQ0dRL1k3L0h2S25zNnRmR0FuSlErci85Yjc2b0paMXpEOFdkeVFqWUJoOGFCaFZFSGpFTG91UTh1a1E3VlJTQ0pBQUx3a3Irc0FMaG5HekREM0pBSllKSGc5dWhvaTRieDh5dGtXVXR2SFQvNytaYzRkdzF1WjM2MTJmSDJka1FmN3l4SUVFb2Nrd2tKUW40SVFvcTh1bmhBaG1QUktLRngwdXY0Szh1ZVRzOTR3RDd1Ly9WWDlnaG43T1A0Yys0RzdoOEhwc2VCK2RGMkFLbEZMd3VBSVo4akQ2TlByT2hBZmZtZkE5L1pCdXpaQ2t5UldTZXFCQ1d5b1lHUTV5UXJCcERidW0vTUUxSG9QbzBYRWtTRDJ6bGZibmE4cTYrRVVKY1RDeEtFdEhMNUVRalA2QkVQeUlnWUFaQnZZdDN4SHl4N09xdkdBNjV5LzcvOXdWWENHVmM1L3NsN3F4RDY2ZEVxaVlnUnpBcWhOMUE0Q0JOQUFsRHlBRkkraVo5L04zRExKdUMramNEVUJtQ1d5VW5Pcm1UWUNNSU9rTmNsTGcwQjgvUnNOTGc5K1V2TmpuZDFBUExtbVFwRkh5RUJST3VXQUNRVDhuTitIL0dBdlk3L1ZOblQ2U3Nlc01mMTMvQ3BhaEduWnpoamorUFBtd1gyTVlkRElmUWV4V3lCQXdFVU9RRHJSRE4vOThwM0E3ZHZBTzZmQUE1c3FISkRCRUF5b1VWR2t3RWQ2SFIxMlhVNGt3emZsNmZDWFRaemp5NTd2dm5SNTEzWDdIajdBeUR2Z2dBVWk5RXlGZ2lacU54UFFGNjM0NW5PV2JEMUhRL1k1ZnB2dUxhLzIrODIvdk5IZ0FQREZRRG5ob0Y1ajJDMnFCV0NJOGJ3MWVSdzVDTDVsOTRMM0RFT1RJNERCOFk5T1dtc0V1L3pCSjNyZ3NheWJxQm9iLzdBNEM3anRXY29vUnJjenIrdTJmSDJEMEFPUWdBVUN4S0VQN2FHZ0x5NjQrbTZLZGpXRkE5WWMvMDMvT3NhNGdscmpyK0F1cHFIejFzRXMwY3hHMEJDOUhJZVBMb2l0OWVOa1ZmOUwrRHVVV0J5REpnYXE0eWJHWUxQQVdnaVhtTGVkVUU3ZHdDN3NhTDdDcWZQS1hpNE5ZZGF5a0NENDEwYkFIbERFc05pd1o5d0FQWWJrSmNmejZUMmdtM044WURaOWQvd0h4VUErNzM5ZlB3WFByU0tZR2IrQnVQM2pBRkRFbEZIOUhJV3diekNJR2tCci9vcjRKNFJZTzhvTU9XNlpWY0F1dmkxQ2dvaGEwNEJDd1Q1Z2ZNS0htN05vUmRlMit4NDF3NUEzaFFaa0FEazUrY0dpQWVNeDMrLzdBRU5GQThZcnYvRzcxY0FYRk00WXpqK290T0FhUUxRQTBnWnhhSUladE1ERlRpZ0tKVjhIOUlxNmFaNTlaWEF2U1BBdnBFS2dCVHRCT0RjU0NXQ1plUll0cHpybUx5ZUdOQ0F5RmwxditIZWk4cWViMzcwUmRjMk85N0JBTWk3RWdCLzJRRzQxbmhBSFU5THVXQWJPQjdRci8vR1BSVUExM3I3R3Y5Rlp3SU1vVmNFc3dFd2ZEb2ltRVAwc2hLS3RJcGhhWlFBWHYxK1lNK3dBM0RFZGN2UktrR0pBRFFRRXNRdWhpMVRqdDk1dkJzaDVueDJJTzU5U3NIRHJUbVVPU3ROam5kd0FBcUVyeTBJeUNNSUNrT3lpdUlCTndCdlBGUVFUN2dCdVBqYzlvUllBSUh5T0VMNHZJRkVZVk5hT291NXZDR0UvdFYvQTB3T1ZjbnB6STQ3Tk9yaTNRRklCcFNlYVNEVWRZTE9TV3ZZSW1TR2dmdHBKRGE0TVdKYkFHeGl2R1VBNU1BT2MwQmU2ZVZMajcvNE1rK2h6Q09ZUFlwWkRCaU5rTGgrRy9NM3lGeXYvbHRnTDNXM1lRZmdjRlVoZ1JZMlB3WStaNy9FaEFSMVNGeVhDT2I1N3IyOFFmUUJzSlFCTW41RDR5MEhZTFBqZTlDZDdSSUMwUE0zRWlNb2ZGNGdWQ0JwMVA4NDBpeC9neXo1NnIrdkFNams5R2wzNzVpQjQrQ3p2ZXVaZExra0VQSjhaRWZYLzZSNzN2T2p6VDVTaTlodWNMeEhBVmc0UHdKZ1J3aDlDS09YSzhZQTRaRXFLWlhTUVdoNVArNUFmdFhmQS91R0t2WWpDS243MmNjdGJGclpORUNrYTVMNUNQd0lQdE1IM1RWejE3TUxCNWdkTGdBMk5kNmpBQ3ljSHdMUXhGRVVTUjVBU3ZBUkRCMGg5QVFiOWJYSWdDR2s2bFVmQVBZVGdFUEFJVEtnZzFCT2JrNThzclRKZ0c1OFdNa1dNYUFiUVFUMW5jOHJIR0FOQUpzYzcxRUFGczRQQWFnUWVzdGdDMWxzQko0Qk1DU09LNmREVWN3cXFhRmlRci8wUWVBQUFkankrakJpUVFlZU1TQlpUM25DUFVESWE5eisvTUlCMWdDd3lmRWVCV0RoL0JDQWVRU3pna2pGZkdMQkJENW54UTREeE4wd3YzaFZ4WDVUQkdEd0w1b2J4dlZBNVlxWUw1QmVNTGQ2NllZeEpwUkIwZ0srOTZMQ0FkWUFzTW54SGdWZzRmd0lnTXJoVVBLUTJDK0J6MFBtQlRxQk1RZWhBYkRsSWpqNEY4MEtKZ3VTVlowRnVYcGpvQ09nWGF3TGpBTGhiVDllT01BdUFHeHF2RWNCV0RnL2wxSUUwNUVkMHlnWm55SGR6MFZ3Q3FFUElmTnl4MFFRdnZMREZRQ3ArOG5mWms1dW5kOHRYd0lnV2NIU05YME4yQ0ptbkFsM3Y2UndnTm5obDE3VDdIaVBBckJ3ZmdoQVM3bVYvaGV5MkpTOUZ2TTNCTHBVVWkxWXdEUk1YdmtSWUpvQWxBaDJsMGRjWjA0czZKVVRESWp5QmNybDR5RGMvZExDQWRZQXNNbnhIZ1ZnNGZ4d0tWd0pnR0VKTm1XdHhwUU1wWDlvbjJlUmhWQStPNTZBak1mblArZTNYdmYzTndHNHhJUFRsZWlZNTVicEdoNlViYWZOVTBsMHowcCs1Smg1SHFZSjZiNTFuUDZYUDhjeDEyWE5IUVZnSVFCL2JGUFZnMk9DN1ErV2dWRlduZy9GdnRXTEkwNnVXaDVvZ3VLRWNYVlMvOXNFQUYvL1ZHRDd0NEVURGdKYkY0Q05pOENHWldCczJmUEwvSDZWd3AyS0V0Vms0Zkordi9FSVlQTjl3S2E1cXUrSW5jZlB3WEhWWmUvYU9MM0Vid1M3eHY4QTFyUXZuTzBqOFBBclRnVEdaNEJ4RnY5bUl4aE9DR3N2KzBPUFlEUmdoY0xma1drRXVxMCtHMDB4NE90ZkRHeitkMkRiSG1ETGpMOHNpOEFZUC83Q0dJQWlFRU1URzkyelhxU2JIK2Q5UjJhQTBYbnZPK0pqdGhpSXJPVkRISFBPa0JyelVRQVdBUHNacDNvUERwYS9YYWc2RVZrTEJLKzVyQW5KQzMvbllrL0FQRDcwNFdpRUFWOE9USHdYMkxRSDJEZ0ZiSmdGTnJCaGpkOHI3OWRlR29Fd3NsbGdOQk96eThDZGp3ZUc5d0JqMDhBSUFjaTJENkhhZm15QWs0L1o3U0o3MmhHWVJ3RllBTURMVHdPR3A0RlJGZ0QzSGh6cVJHUWl5ZXVycU9kRzZyMFJtOElFWmp6UmxraXFDV29FZ0s4QXhtNEJKdTRISmh5QWJGaER4bWJER25aTzRqMFNnTEdEa3BpYmdFcTY2VEp3LzFuQTBGNWdkTHBxK3pEcUZmZDVMTWVXcXU1SE5TVDB1Sk9JbGxnK3FnTVdnSStIUHYweHdMQTNnV0hwVzJzQzQ0MWdDRUNibUt6aWFHcm5VZE1PNGFIZWg2TXhBUDRTTUhJN01MNEhHRDhBakh2SEpHTkFncERnWS9jazNzdGlwUmVtdlZoYyt1QVNNUFVFWUdoLzlkSVJnR3g4WStNTmJSLzAwdVZ0SDB3RXg5NGovdjBvQXhhQThFZCtHQmllQVlaWmc1a0FEQzBRV0dPRnpHSmxjR1B6bDFCeE5MWEQ4c2s0eGZ0d05BYkEvd3dNM3dHTVVteE9PUUJuSFh6ZXRJWXZpYm9ubVNpdVlUTmpyaVZnN2dsQWl3QmswZk5aSDYrUG1YOVA2a2ZObUNYR3BmdEo3VGdLd0JJQW5sbjE0QkFBWXhNWW01QzZSakN5Q29PeXIwcWtEL2MrSEkwQjhEWEE4TjNBeUNRd2VzRDFWUUtIN0VjQVNtMVEreTRDa045cFVLaVZGNW5MdnkrZkJiVFVkOFFCYUgxSHZOQlJPaVp2ZnNObnJGNGtjdlB3cGRzQkxCZVUxOE5mN0FCMjNEcDRlY0hDOG9CZ1VsSkplY0xTKzcrV09wRTNnYkUrSEt3K3lvZXZDWWtNR0txUEpyZEVLQVJ1dGFGWVJzMWZpRVowd1A4Q0ROOExETzhGUnFZcTNXMTBwZ0tnZllMYVlDem9vdGdBNktYYVRBOTB5Mzc0VEtCMXNCb3p5Nzd4SEZaNTM2dXRSZ0FtRWF3Nmc1a1VTRlp3U1huQTMzMHFzT2xmZ0hNUERsWmVzTEE4SU9qb0x5cFBXSGovMTFFbkNpVndrejdrQUV4dHNHcmFZVVdkU0RYNVRtc2FnTDhLREJHQTdCZDMwSnNXMG9XaXZuRU9RTlA3eUdUU0JSMTAxQWxaU1V0R3lmZ1pEa0NXWTFIbkpkY0JWZTYzMjVoVHZlbGcyQ1FqWk5EeWdHLzJBbjBqMXdLbkw2eTl2R0JoZVVDOHByUThZZUg5WDM5T1ZRU2M3TWM2ZkNhS3ZBZUhkQ0lWZjR5TVlDeW5UcFgrbmI5N05KbWxTUWI4cjhEUUhtOVlPRlVaVEtPem9YR2hzNkF4RjBISWV4Y0xCdldCdWlITjhzMm5lOThSM3FjNkw0VnliMm9CVmpmbTlNSUZIYmpEQ2g2a1BPQmJRb0crb1c4Q081YldWbDZ3c0R3Z2ZyMjBQR0hoL1gvMWlhRUl1RGNDVElXLzFRNHJGdjhPbllpVzNjK1cyaUt3VWpLYnlqUU53TDF1dVI2c0FFZ0RncTFiclhPbVY4MVB4aE5CNkRVREJTWXpRSndGdHo2MjNYY2t0WDFRMVZXS2FURi96WmhWYXpCVllBMXRYNU1henNHdm9id2UvalFyME5lNkJUaDV1Zi95Z29YbEFmRzYwdktFaGZmL3JTZTFpNERuVFdEVUFDWTFndUZURHFMWWRDQnZmNkRKWVNNWUFUQmZPeDFrTGZqMXYxYXhIMTBuUTNTZDBHVWtCblRmcGVtdEJKZ3NlSUtRQUhMUWNWeGEyVG51TVcwQXF1aTVlczh4QkllZ1ZkVlZFOFZoekhuTGg2NVdNQjlBbitYMThLNmFBbjJ0TzRFVGw2dnFiS3VWRnl3c0R3aGV2cWc4WWVIOTMvUms3MEpFOTBub3d4WmJJSmp2UzNXWU5TR1V3R0hKVHBQeHd3Y2JCdUJyZ1JZQmVLQUNuN1Z0cGRVdS9jME5KeE85Qkl4Y0t1NFRUT0R6YmtvblBMb2FMMHZ5VVFSYjJ5OEhzTDFja2ZXek1ldUZpNDBRZXpxaSt5aVBoeXQ3Rk9qcjYvZ0NGd2dQN1hiNXZzc1RGdDcvblFSZzZNR1JXbURSb2V5VGxwZ3c2OEdSVHdnWmdvMWdHbVhBWDYvOGR0YXlsU0tZL2tveUlEOUJoek1MM3ExZ0FvczJBY09yWllTb3EvcEpwMVZ0T0RSbTlaM0xTLzdXalZrdlhPekV0T3BLeUdybEFUKzRTb0crVlk4dkJHQ3Z5L2RWbnJEdy92ZWU2NU5CSmlBakJJVmNBSlFqT20rRGtDWkVlaUdBTXc2c0F3RFpzSnJBZGhGTTlyUEdoZDQ5MDRDbzVvVnVDWlBWNmtENDBFYzYrOVc4ZEJUQnNmZGMzbmtwdm5CODJmcDJSUGNzNzlkSGdiNTFMQTlvZnNEVjZ2dXQ1LzNQbnhjQW1MVkJpRHFnZXZEYUpMa1lycHVReHpjTndOOEFXZ0lnUmJCOGxvRUJ6WER3bDRjR2lER2Z0NThTQ09XR2VkZ2p2T0orYlB2Z1JraXVBK1pqemhuUVFPaUZOVmJsb2E3bC9mb3MwTGRPNVFFTmdFWGxDZnM4UWJmN0h5TUEzUVZqWWloWWhMRU5nalg5eS9xd3hRbVJVL2FzZmQwWmNMVTJDSFZHeXVzSlFMS2ZWaTk4Q1MxMlQ1ZjdpRUNrSHBzTWtBaENGOCtuc2hXSDJJL2pYc09ZTzE0NEdWLzlBcEFJclMzdnQ0WUNmZXRRSHRBQTJHKy80UFc0LzJQUGJ6TWdtVU1pMk5vZVNDUnhJdDIvRnZ1eFdVUklXQ1hnMzU3Z2ZUakVETklIblRSWFJDcEg1dWdLd0dsM0hwTUJYUWMwdjZXTFlWbS81bGltajA0ckc3NjJLMnVZWTlqQmtyOStySTAzTkw1WmJjelMvZEorTFF5b2dhNG83N2ZHQW4wTmx3ZE1BT3kzdmwvVDkzOEtBY2oxMjF6OEJuK1k5ZVdRSlJ6OFk2a05hZ0RoMmV5NUV2eGp4UUQ4VFdkQXVuZUNDTzRBbjF2dzV2ZHpRTW1ka3R3cTdwTFpRUitkTTM0K1p1bUF4dlkxWTA0dXFPQUo2RnNFeHpldG83emZBQVg2R2l3UGFMV1IxbHJmcjhuN2YvUmwzUUd6bXNpcysvdU83MVY5T0ZnUDJncFBoZ3I3VEdScVJVVDZkeXZyNGFJcy9wbS8yelZVTmJCU3Y2RzhlNXBFdjBDdmVjN1BvNytiVHRqbEJSbGt2QU1Ca0RlUXl2c05XS0N2b2ZLQUNZQnJyZS9YMVAwL29XRUFubkZEMVlkamh0WHhSNzNtWDEwRmZDSEhFOXBWV2NHQUkvUzBnS3NmQTJ5K3R3ckZadzZIeGYvRjBQazhSaS9rcEdTbk11RHg1VDBpQUNnUUhpb28wTmRBZWNCVUhXNlFkc1YyL2NMN3YvQ3lxcjVnbmM0MkNDT2NmWDFWSVovVjhXZTlJRG1UelZYd1BESmlYdUtYUHh0REJtYTgrbHpQNFdBZ0trUHhDVUFQRTR2NUd6RXVNWDBQWUpQTGhCNkZKc2M3TUFNbWtWeGFZQy9LOWdHK0YxKys4QVE3R3diZ2s3OEk3R0ZwWGdJd0ZpUlhPd2FKWlBVYmlSMHlDVURSaytjSGYrWXB3TWo5SGdmSThDbEdQeXZzU2lIMFdTS1J1WWxpdExiL3pITS9KT1NzNUMvWUlDOWNNUURaci9kd3hnT1c5Z3RHWVVCaTB3QThsMzA0dkRRdkFjaGlsRmJwSUJRaFo3RWpxNlpRMC9ZaGlsOHk0ajg5QXhpZTlEQXNENkZYOUhPSzNRdFJPVEZrdmlOODNrRzRmZWxJWThEQ2VMclNlTURTZnNFb3ZBRUNVRnNUakhEK3RjQit0a0ZnY1hLdkJSaXI3cXRGbDlvd21PNFh5LzFHM2JBRmZQclpIb3JGTldCRndIalFBRmN0SWdoajJrQmFydzA2SWYvK01NOVpxVE42RGdzRG9qQ2VyalFlc0xSZk1BcHZvR2tBV2g4T2IvdGdBUFNLV0NwOG5nTlF0YWRqbVRkbHR2TnZuM3BlRlloZ1FRZ2graVVtRWFVQVVvWE0xeVJMbVd1RkxhRTlaK1hJQVdCaFBGMXBQR0JwdjJBVTNrRFRBTHp3bXFvNnF0Vmg5a0pFckF1ZEFCaWEzOFRDNXdKZ1MyeEloQXdCbjN5aEJ5TDRFaHpYZlJYeFlzRFRKNEl2ck5OMkpGTXhaY0J6Vm80Y0FCYkcwNVhHQTViMkMwYmhEVFFOUUxaQllIMUFWc1FTQUFVK2ltSTFvYkh5Ymxuakcva0prM1U4Qkh6OHhWVVFBaG5RSWw1Q3lOZ0tBR3A1TEtTU0NvQXlTaDVKajc5dlRhZ2N4VWFJQmVSTmU3OWc5Z3ErRFhpZzR3R3p5K1BPTmZUN1JXRkE0bm9Ba0dYWlZBaGNCY2tKUWdOZ3JMaWFOYjNwYUlEbzF2SEhYK29BOUxRQmk0RHhKY09VUEpVblRnVTJOSlV5Uk9zOGlyR0FSeFFBQytQcEN0c0ZkNDBIL0FFZjBnTVFrTGdlQUNUNDFQaUdvTE9LcXlySnEzSy9ZYTltTnlyNUZ1c04vdVBMUEllRGE4QmMrdzNydHlsNFZGSGFNWmMzaTlSV0JNOWpqemdBRnNiVEZiWUxSbW0vWUJUZVFOTUF0RDRjQktEWEJUUUdkQUIyTUdCbzhTQ0xtRXVTMUFGVkFKM0EvTmhQdDBQb0NjQThiU0RHNzZYSTdheVNnNkpZdUdmS3dKSEZnSDBFNUIzdWVNQ2UvWTRMK3hWSEFPWis5RUhjRWdRZ3diZWlFWXg2andUZHo0cWZ1N0VoRUpxeEdxcnVmL1JuSElBRW54Z3dCTTBhQzhhVUFZV05CUkNtb0lsbDRIVHFPMTIyUWNaYnJnTVd4dE1WdGd2dU94NndhNy9qd2h0b0dvRFdoNE1CSjE2V040bGZyOEFxSTBUVlYxTzFmYTlCYlF6b3ZrQXk0RWQrTmdDUVVTeFpDRld2Q09hT0ZSRVh5VXdaT1BJQTJHZEEzdUdPQjZ3UGFPeitRUHY1UytNQTNPWGlOOWFjbGdoVytkM0lndXBCRjJwUHF4Y3hHZW5EUHhmU1JoMkFTaUtLaVZQMlBhWlNjdkFLb0EwVkRjNmNPbElCMkdkQTN1R09CMXpSNzdpd1gvRjZBRkI5T05TT1FXMGZyQTUwc0lMVmNja1dKeUlEU2d3UEFWY0pnRmJZdVozRkp2QWxFSGJKM0lzZ0pMR2VkZUJJQStBQUFYbUhPeDZ3bzk5eFliL2k5UUtnMmlBSWZESkVKSHFqNFNFeGJFdHkwZ2tkaEIvNlA5b1piQlpJR2lLWVZiOUdLYU41MGxSSEJMT3ZoRHhoLzVFS3dEVUc1QjN1ZU1CMlFHTS9ncmI3LzZ3SEFQTkdNQVkrR1NHVWpDNTJWWDJmMkNENCtITzBncWtaZmVnWEtnQmFIa2NXdFMwQVdpaTl4RzFJbXJMbE41WFI4TDhmbVFEMDVCVnJtRUVObXBZU1A5UVgrS0hpcWoyLzgyK0hxcURXd25iQlJmR0FUZHpBZWdHd3J1MkRwUnE3TXpxMmZwQWYwTnEwUmwyd0JYemdsWjR5VUFQQW1EU1ZXREJQSFFqTGNnVHFPWjZ6VXZkS0hoNHJ1RENlcm94L0RudTdZcXdYQUMxTkkvUWNFUXVLNldLL2tkZ0NUR0MwUFlBUC9LSURNQmdnbHEraElrck9mc2FDdmlMU29mY0pnSjVBZE03a2tTYUNqL0hxUUtWSUd2RDRzd0Y4YmNCam16anNhUTJINUQvNmFjQmQ5d0FMQjRERldXQjVBVmhlck1wNEdLSVlFT3A3KzI2VUYwYVNmVC94WXVERzd3RGpySXBBRVJ5dFhmMnZhamo3dWVyeVFYU0ZsMTBLL09OM2dJV0R3Q0x2amZHQjhaNTRPK0VlNHZlNjUxM3VCMlIxeXpzcUMrdHdiQzhIY05WaGZBZWFCdURQL1R2d3RTM0EvZVBBSWZZRlZsUHEySEhUdXl1bFpDVGxoYmpoRVRGNXl4VFFHZ1BHaG9IaElXQzRWU1hHRDNuMHRMa01IWEh4dStZeUIrTWxQd0R1WnM1SzZGbHNiQ3pkVk85RHVLZmtITThBRWtQN0I4Zk9rd0RjRCtCN25wNDIrSmtHT3ZLZEFMNEU0SzhQMHp2UWRFVDBiMTREM0RnQjNEMEI3QjhIWmthOVd6ckQ4OE42c0ZtK1ljVWpybjdFMVpEdk10RjlEQmdlQVlhSGdTR0IwUE5IQ0Q0Qkx3TFJzQnlBeVgvaWowL2REVXh1cWxJRzVoaXg3ZUZodkxjT1ZVQXR5UFN5ZEFGbU9RTmU2RVlHVi85WkVTaUtnSUVndGJhRC9nSEFMUUM0b3ZZNXI1S3d0ak9VL1hmVEFIenpMdUNtSWVEdU1XRHZLSEJ3cE1vTjBXUXpOdEFhWVNzMEs0WmxPU0FqR0c5a1BqQ0JSd1owQUJLRUJKZXhZQVpFQVUzQTdPaTFCZUR5bTRFRG5qUTFUd0NHV01XOE1YY0trczBZT3laTmxRT1FqY2dZSVVIbGxFellRMGt0bStyNm96OEc0RjRBWHdYd1JkOC9rTzlBMHdCOHk2NUttUHhnR0pnY3FZSlRLWXBUdjJDQ3p5ZGRRSlJET2pLaXZuK0RlaDhCRjhCbndCdGFDVUErWVlFeUFVOGgrYzZBejlnTkhIUm1yZ09nbURBM2pIUStpV3VwQ2VVQXZOU3JBOUhOd3F4K211azluSlZOZy9DVGZybWJBUHdiZ0s4RCtQY0hrSWliam9iNW8xM0EzWHlwV3NBa0cxY1BBOVBERlFEWk0xaWQwaTFLeHNXZk9yS25BRlhsaWZDRkZNTVJjQVNpZ09jczJNR0FJZkU5aVdYcGxTNk9uN1VibVBhVVVUWFFyZ3NWTXpjUmo1Rm9sZzJWNWF5VUE1QldZS3dPeEtVYWZub3NXamNKd2srN1c1RjJFS3ZsRTN4Y1hhTllmaUNZc0drQS9zbXVxdWc2aGNsZUFuQUltUGJPNll3UnBNZ2pDQVZBbS95UW1LVHY1aE5zQWYvaTdTeU5CU2wyYThRdi80L00xeUYrQlpTWWxOUUNublZycGJDK21Ub0FBQ0FBU1VSQlZKY2FJN3NPU0VZMk5wYURYTHFwUit2RS9PVmtzRGdJbWdHZ2doSG9ZSmJUV2M3b0p0RldjNjUvY2cyQVl2aDJBTHNCM0F6Z1Z2OTVuUy9mNFFkc0lrVDlUM2NCckd0SVRXWmZDNWhxdFFISW5zRUdRbjNVRER2RURFWS9JQ2Y3U3hNT3JBZzhUK2MwMEpHa3ZIR2QyREFCVVlaSUFPTnpDVURwcENGaFN1a0NCc0xRckZ0WmUvSWl4WVFwU3lFb0pvcW51UFdyVlJBdWJRaDgzSE5sWkIyM3o3ajF5d21qNkNJSXFVUHh3MlhldTlieDJqeDEwd3o0WjdzcVRZWmFERDhFSUR1b0UzaE1WRXBoV2c2NkpJcDkwazBzQnhCY3kraVBJSWFUMVJ0RXNIUy95SUFxdytWU05QV1FmZTV0bFZFazhhdVhnVmE1QlVzRUp1VDV1b2xpQWJFNUFHb3RtSUFqQ1BuUjl4REczVFFlcm5ZQVV1cFRkQkdFRk1mODNPa0FwSEcrWGx2VEFQd2Z1eXJnU1pPaGFzM3U2Y3dUc1VCVm4yZ1R3eUZNaTh3akhaQUExTTlmWUdIRFVMSkQxbThDcGE4ZlJ4RGFkK2wrWWtmLzNYTnZkMTFVK3FpTDM5U3hYZXZTc3NoZERGdmdiSTFPMkF3QXRSWk1aelRCUnVERmp4ZTFYZzhRRUlCOHl5ajV5WUlVeGZRSWtma0lSbm1IQ003MTJKb0c0RnNkZ0hIcDNBQ29NSDJHNmpNNGxXem9RYXJTdndRNk1TQi92cG9yVmFGa2grbUNMbHBWUjhaK2RxRFpMb0RPcEhTaVFlQUZEa0JqUHJsZ0NIZ0NVYUZpZmc2N0gvOXVZam40QWkxdnBURVJUQUFTQmFvUUpCQUtlTnFIbEw2bXdQRFpZQU9ST2FnL0VZUmtQWDM0TXdISXZ6VzlyUWNBK1RMcEkyMkc3RWNRS2xKR3NZSUpoQzZDbFVNaVhmQlRiRlVRQWVqNm5QUy9PdUFsOXBPT3FJYzJCTHpnKyszVm1XZ0lFVXo4MmNSdUNBdExJSFFRbTBnTzUydU9BYjIyc0MzSkVXZ1JmUHBaZjJzUUJRSWdMeWRQRUlGR3dQRWo4TWxGMmJTYnN1bGdoTGZ0cXNDWHE5SEdnSHlzem5yR2dpNXF6VFVURkg4RkxoQVVuM2hJSndDTjBITG5jdzM3cWFGMnpvWXZ1S05pdm1RSXVVTmM3R3ZXdDZzSE5zMjZ0d0E2dmh5cThORU1BSGx5bnRGckRDY1FlaHlhUFRsK0Z3QWJYRGNtQUtNUlRoYWtFazhROGtQZzhTUEwwcXpMQmwrQTlRQ2dSNnVaR3MzdmZIejhUdEJadmtnR1FyRVBCVkFVZzJTaWo1MFFBT2ppVktJM3NhQURKUm03ZFNMWVdmU0ZEa0NlbS9kaFplTXk5cFBZNVF2U0RZUXlVSm9ESUs4cU1lemgzd1k2ZlNMNDlQY0dnQ0FBOHBTY0pMSWdBVVlRRW16OFJQQTE3U3R2R29CdjM5VzI0ZVJFaUJvTlFTZ1dOSTFIQmtkZ3hKU3cxQUkrZEZJYmdPWW1ramltUTFyNlhYQzNyQWJDSHljQWd5dG9oZjh2c0IvcjJLUmFScTd6cForRDM3SE1YMHMzRERjQ1VHTFlhdzUzTUo0WVVPRHp1c3FsR0NRQU9RQ2VqdXhBOFVVTFVreEl3QW1NQXA4V2EzcWtOL1I5VytzQndPaElFUGprNVNMcjhIZUtGYlRRZmI3N2NzUElNSEdsLzRNUGJSZXNsUGhOZTQrTWlUcGk5QUZHVjRuSTdNZnZhZ05RTGgvcGZyWW5EQVM4YUpRNDJBMnc0ZW0yY0F5V1FVdUpWUVRHV0xzMXVMN0RHOUoxUmpoQStqdllrNHQzS1hlTXFpanB6cnVkNEF0OXozWHRQMTZ5R2ZqS1ptQ0dvb1loMXRaenZ2OHhYUEZsNFBvSllDOTdrOUZsd1pXRCtBemkvZGVNWldlUDEzZVFDR0V5b0VSdWRDaElqYmIzbUpZd0g3VjBRSUt1Q3dqL2dmTWowYXNuMkkwRlhSU0hYZkwvaVJrTmdMeWVWajhjY01ZLy9KMWZ5eHpUQVhUMit4b1FWaUtZRC8xaERxTHhQaVl4VGdTdlFycGhwaEc5N3R6NFNscWFmbmo3dWsxa0lRRFpydldUdzhCM2p3RVcrUkx4UGdTaUNFUmRQd1BSNyt3Q1BnL2d1bEZnZnJ1RGtPTVFrRmM1eDg0ZTcwOEpBTW1DdVJOQlhpNFRJZzVDR1J6R2lCR0UvRDRFL0MycjJ2Y0FZSm9pZnk2MmkwYUpTTWhCKzJJSG9Od3UwZmtjalE4NXB1M2FjazVuSUJSRXFuZVlGeVdMa0FYSUpIRVNlMDBDeXg1UXllTDZGL3R5RWNEY3JPVzJuN2ZYOGRmMG1NRSsvdlEvUFFqaG95M2d6bzNBSVNZZjgwTVFhUXgxcGVIOXdiN3YybXJ0bUNCa0lNTWVqcDNqSUpEMU1zYXhhTVo4djVOLzY3SU5Bc0IzQkFZVTRKTDREU28xSjE1QUZQQUV3dVFIWkp6a0tmVUF0T0hMSlNPUVJXbmRCWVF2Q1FBMDFjZm5Ob3Bmc2FDSmFEMmJhQm43OVFqU1RpT0VQMUVjYXdJcGtxMmtlZ0JUTmdIV0VwT0tGOFV3cTJOUkZQTTRBcUNmNDYvckEyVTkvdVZEdnVyQjAxenZBSnBpaXdPbDNmRWVjaUNHRitJajExZitRa2JTZk1QZkl6cXc1N21FRlo5RGwzUHM1SFhXQVlCeUhKQUpLVjdOK3MwY0NRUWh3U2xmbTRsR1owS0I4Qy9yQUJnWlVTNlpISVRCU0VoQ293VVlBQWtzRjdjU3RXUkV5eFJ3dHVQcE9sZ3crNXM5c3E2T2FJSklJbFVnRWhBMWVkb1RnSHhhOUhWdzVqaWJaTkYrai85eUdRQS83cGJ1alo0Ynd2MitjV0I2dEZvME56WW5reEZBK2N2RUFvNDNWQm9FbzJlKzQ4RU1YRU9tRDlGNnhoQ0U4UndaRUo4MFZibEt2RGxtendpY2ZxeTkzL28rOEs4VHdCMmpWU2dXMTM4RnJKUVRYQk5sbkpnbXJqWndhbm93OUNCUC9yTDl3RjBqd0FHV0R0RnlvTjlQSHV0bklIVDA1bVBYejkzZE1HUUFQbmlKc2ppQlhpVGJ4RFpGTUY5TkxVUFF4S1I1cWV6ejFZNi9ZWkRIMEQ2R2tkQWtZSkl2UmFsQWRIQU1tUFpvWWhiNk5oRFd2RXlmL21hNzM3Q1hON1IxWkM3aFViUGdjRmdxdC9aWmpBRG5NMXhxRVZoWUJwYjRDVWs1VXNMN2pRdmovLy81YnVEckxlQ09FZUQrWVFjaFl3RzlWSWZ5ZzFOYVpzekZpQ0g2RGtSR0x6ZTUvZGdrOElNV2NNQ2pkQ2lDelI4b2QxQjhPVHd2Sk04SkVTaEZ1dDFmek1oaStlUkpyNkxJN2hZUDJNL3hWTHdLTm9aalVUd1JNQVFRbVl5aFdHUXhzU0FET2ZsWjRrdWtqN1BoWjc1YkVUakJwa0FHYWhNa2NyR2d3aHNYZUN5QkhCajF3bU9CUXd2QXdxS3pvRmVSVjhaYWVyaktZQXVpcm1QWS9vOVg3cTVDeXI3ZkF2WU1BZnRDUEdBRW9ZbEJpVnRGd0xqdHAyVTRpcmo3eU9BTmJpK2NySHlyZkNiVHF1SlY0NE8wRjFGcndRR0lNWkZxZFFEeVAvZ0dTWjhUQzBaUlJzT2xWenpnYXNkL3UrenBNQnlMZWhBZkNnTVFDRHlHWkpIRkNDZ0xaMmY4bWdJNXFhdUVjVng5ZTV2QUNUZ0NUd0VNV3I1VGRJcFdLSmI1TXZybm9vY0Rzd3ZBUEFHNFZMR2c2VUtlcW1pNGl1RHo0ZXIzMG9YMEZQN3U1bW9NdklmN1c4Qitqd2xVTkF6Rm5sWkNJaHZHRlJDZVd6cmdYU1NJQnJlWFRGWlNnVkxIQXA0VUhPRnVvY2lFRXNuMlBKd2wvWEVrMGR6ZlNvamVlckZnMUlPbzVCS0F2ZUlCZXgxUDY3bGdVemdXUWFKd0xBS1JIMDRpMTRJdGdES0V0R3NSbld4NDliMlZrazl3VWVmVEdyS0NGN1IwSnhaTXF4TjhjbVBBeFdjQWN4R0FCS0VBS1BBNXU5bEVhQWJDbUtNSStzRE4xWDN6K3JvMjR3RVpGYzBWRUU2NEFCZ1QxODBQRjlaZEJjRGI2SnBxY1B0UGsrMUFDYm1LakpubGx3eXVJTHVuRUFXalpIa0JzcnNSVW5mRDBxRWlDNUlKZnlpc2dNaHpXaGNQMk8xNFJvNFdiQVNnQU1RSjQ4U0p3Y2htQkNERmE4cXB5QmJTUDdPdlU0UFEwcDJXNytMU25TSlVGT3JJNFY3dzVJb0JUUVFUZko2b1RTWWsybVFjcEdSeUgyc3lHaklGNkVNM1YvZk0rK0MxQ2Z3VUV4aENzbXpDYVFUNDNsWkMzZTFoQnBFSGgzNlhFcXJCN1NjbXE1ZFYwWFp4bVY4V3VERnpBRjlpd2hvdzlzZUFHb0JjR3RLanFBYysxbDlyTGIvMWlnZXNPNTV5c21DckM4ZWk2SXhSTUFLVFdOQmk2WHc5OHhOVEZVaTBqRWNtcFlnUkFQaGRkcFZpOU9JRVBQNWNZRDRDY0xrQ29vSFB3YVc5a1YraXdXclFIVDh1QTFmZDNGN0RGdmdVSFVQMms4alRpb2dBcUxveEZwRGdiTWo5alhTdU43aTlkTElkYXh6QnA1WFZCTUlNZ0ZFbkZBUEtUOXFQZDZBOUJJR0k3TWZQbWY0VSs0MEh6SThuV2dxMlBCeEw0RkVraktKaXhHUlJGeVFRUHp6ZDFpQVV6Q0FRYXMxWU9tQUVvRmp3a2VjREMvUEF3aEt3NkN4SWtDWHdPZFZKTHhUb2JNakJkeUlnZnZpbU52Tko3RXZmNGpXdGRuUllEMVlOR1Z1RzkzVld1V3M0SmYrbWxaQ0NaeHdQL2NuSjZtWFZLazIrdEs4bFFRVkhSVEdjNjRTREFaQjNFeTNKY3h5QUNrVG9KeDR3SGwrWXdxbG9HRElDbVltVEZnTVFGQkVUOHl5WXp5QUcvQWZXWDhtQ0dRZzBCVFJvSHd0OUtWYVBFL0hRODkwQUlmZ1dLK0NSQWFNUlluVmR4SGJoZFk4V3NsdzFWOTNVRHNtUElqOUd4Z2lBaW9SUk1JSk52b3RpK1NXL0lrZDBnd0FVOCtYeEpjYkdJVEpQRHZJNlhkQ0ZSRUZTa25UQjgzeGthNDBIMVBHRjlkbnljQ3hGd3lna0swYkFTSlFTVkFiQVllRDk4eFVBZTVVM2pLSXdCb3NTZ05zdUFCWW9nbDMvSXdnRlByT0lnMVhjNFpycEFzU3J2cnV5a2wydWN5a2Fwa01NaDRDRXhENUR3SmZXQVlBeHdrNE1LUEFKZ09JakdTRUd3dUNha1JoZW13Nll2MFVVd1JmN0wwMEw5cG5zTng2UXg0ZmVZNE84cERFY2l4T2pzb1RLS3BNWWpTRllZak9DOEVxM1dubnIwWVlTKzBUbWkySHlzclBHTHF3QVNOWXpCblQyTXoyUUQ5MWxheExCMGdzMTJHQWg4MWNmL28vT2NIeUorcWowUy96eG5oVVpiU3lZV2FMOCtScTJTMjl3b3dpV2tKUGFuNE12Z3JEREdBbFJlN0tJeXdESWdSM21lRURXZzlIYkpnQXBOVGtYbzhvMGk3b1ZneG5FZ0ZyOEY3akVkblU1R3ZxZkpRS1FLeUVPUGxzTklRdnl2dXBBR0hTL09rdjRxdjlvaCtQSHhNTGs4Z2dCQ1J4dkFtRU4rQWlFenoyaVFmUUJlTm1raDRLNTJoSkJLT2FOZS9GU0xvYkxSWEN6NDNyUW51MnlpOW9NU01EeHMyam84MzAzRVJ6MXdzQ0daRUNGNGtkM0R3RVlZd0pqaG9ObFFyZ0lqbFlvZGJCUHJ3TUFaZkVteXpjSXYyN2dzNlhEekMvSVIxRE9nQTlhNkRSejR3WkFzWitMWVh2UVlzSG9ENHppT0ZrbG5hNllEMytublU2ZFo3YkdEQWNCVUltSUFtRVV3L3piSjFpL3NjR05ESmlMWG1sZTNSaFErbC9hcTU3Z1VRQ1d6d3dCS1BlTHNaL0xGckdnL1NoUlhBZTY0QWprdjMwa0FMQWpGOFIxMUR5M0s3S1J3SmNzVVRhcVdTY0FSb3Uzdy9JTlZuQ0grQTM2bjhSdk0zbkI1WFA0b0Q2REFUQll3R2I1YWpsT0xPaDZYOEphQktSRzc3Kzd5Z0dZcDFibitWMjUvMDFBekJud1ExeXBhbkQ3S1dmQTFRRFlDM3pKSWo3S2dPVXpjOW5GYmV0WC9yK081Yml3Tmh5WDV1U0VEcjVvMHhzSndMcDgvbTRBN0dhSlV2L2ozLzUrSFFGWUozb0ZQUGtoby9oTmVxQmNNa2NCMkJBQTZYcnhtTUJrZkZBY2kvbTBKcHd6WHcwVFh2WHR6cnorUEtjL01sL3Vnek05TURxQ0Fiei9rZVZqakdjUUEvWUx2am9ndW8xbVJzbFJJNlJ3ZnNpQTVucWhMNUQ2bnNjRjhnZlRkZnhwUysvaEx6dldmek1RQ29CMUZxLzhiM1ZXYVBJRFpxc1JWNjREQUxzWkhWSHMxZ0V2c3FGQWVCU0FwUUM4cEhLOTBPcWw0VUVBeXZDd05lR2NCWE5MT1BNTGZ0Z1pzSTc1b3VVcjlvdXNwMlRFeUlKL3NVNEF6QzFlK1dJRnNoeUFIUFpSRVZ3SXRyckQzd0dBaGliVFlCaHhWcGUveGVQeXJOQnVXYW9OcDNEZ0Z3QzgxTytSQWVwSy9hNUxmZTUxanhyN0p3QTgzblBYWWdxMWFzbDB5WDVONDgrZjRWRUdMQVRsSzF2QW81WUIxZ0JTUm1zTStORkU1N2xjZlBENXBQRldDSkltdHl2R2dHZk9BYWNCWU81OXpGZ2xnSGdQZWZac1hWNi9nUFhCWWVDMFJWZ3lKTk9HWXVKalBrYTllSFdnakw5Yld6aFdrMC9uL3dQbitrOGJnRk5tZ1ljc1ZmbFpuQlJtSVNodEpNL203SkdpYkdCb09JSWV6OXdLUFA0QWNOcHlsZmJObEdmZEkrOU5qQmp6OEpWenBwY2tadUorZEJ3NGFRNDRkcms2ajFMSVk5SmtQRDdQNHMybHdWRUdMSHdKbm5jc2NOSWg0Tmg1WU1zU3NIbTVuZE91MUJHRlRoSjgvSzZKclp0b3NsU1QyK1hIQTZmdEIwNVpBRTVjcmdBdXBzNVRmYUw2RUYrVXlJaWYzZ0FjT3d0c1hlcDgyZUlZWTlKa1hwTWdNcC9BZVpRQkMyYjhPZHVCWXc4QzIrYUFMUXZBUmdKd0daaFk3c3dFemJOYTg4SVJ2QVZPMXFrRjkxSjM2RE5PQkU3ZUQyeWZCNDVmcXBoTG5ldnpkR2VCS0JmTDhVWDUvQ1pneXl5d2VSSFlzRnd4WUh6Uk5LNm9ldFNCTURMalVRQVdUUHFQbmdwc25RSzJ6Z0tiQ01BbFlNTVNNRTRBTHJjblI2SllRSXdzb1VuanBEUnN0T0x5N2NCSkI0Q0hVR3d1QXR1VzJuVURWSDFFRlVoeWNTd1dqR0Q2NG1aZzB4eXdjYUVDb0kwejVQM1g1UDZuV2xIZGdIZ1VnQVVBZk9ZT1lNdEJZTk1zc0hFZTJMZ0lUQkNBRGtJelNKWlhwQ09uSWcyNXVQcmhnbnVwTy9UeWh3TEhId1NPbXdXMkxWU2lrMnBDckRzUXNrek5JQkdJcEJkR0krVmZOZ01iNW9FTkN4WDR5UFJqUGo0eGFKMCtXR2VFSFJYQkRVejJNeDRGYkRvSWJKeXBBRGl4VUFGd3pBRkk4S1VKQ2hNVjJTVWFBR2MxY0UveEZKZWYzRllSdGk2NG5rcVdEcnFxRWhicnNtNXp2WkNkUENkOG5IekpPTFp1QUJSejloVEhad1BMN0xuTG5vTk1JWTJWeWFLY2p0WkxIT0FiTmdOUG5nS2U0QmFjZkdGMXBueWREK2hwaFEvOFhWNVVpRXVlTEduRE4xdFdYai8zLzRjVHdBVXp3R1BjUmNGSmlEcFB0M0ZMbWY1dmp3RTJIQVEyelByRXpEdjdPUWc1T1NNK1NjWVF5NVhibzg0NjV1L1pmTFRKN2ZLSEFkdW1LeFZoOHdLd2VhbFNFNmluRW9TeTJNV0NkYlVISWdodjNBcU16d0hqaTlWTFp1RHpEOGNYeHhXWnM1YzdhcG1XMGZNQm5JSEtuNVg3ZDZJNW5wdlJ6OTRPN0xnWHVHSVJlSlNiK1hsMXR6cWZseWJ3UndxZjlpOTdCUVJXb21XSlE3b1pWRnRKb3FEWC9iL29HT0RzdmNCVEFUQjlnc2ZHcW16ZGp0VnorRytQQXlhbWdZbVpDb0RqRkUyYW5DVmcxQ2VKd09NblRSQi9EbVVJTlZra2dpYTN5MDhCdGt3RFcrWXFBRkpGTUQxVkFBdzZYRzYxUjMxTzkvZmRyY0RZUEREbVkwempjMVVqaXZCdUFNeDFRZE1CK1dBWVhVOGRoRVUxNmRPU2twcGJjSEZTcm5nOE1Id25zR01QY041eXBVUkhwMnhNSWE3ekR6Mno4R24va1ZlMFlvbU8wd0V3QllLdWpMN3YvekhBNkMzQXhmT1ZoNThnNUFzWnh4NGZaTTdzZjNoNkJjRHhXV2VHQlorY01FRml3R0VISFJuRHp1bjdPTkhzL2Rqa1JnQnVucWwwVkRPU0hJRFUzY3hTRDRhRWFqaEZYUzRINFMxYmdWR04wVjh3ZTdFMEZoOWpWREc2T2JyMUxKTVJ3bitrT0NhVEVZVDBkc2ZxWkhYbC9wN1ByTGk5d0lZN2dPMEgyeUFnQ0FXQ1dDb3dLcllFOG5NTG4vYTdQUW45WDd6SUpQUGtDY0srNzU4eTd4N2d1TnNCNmw5OGdaakxMWWV0M0F5NW4wc3Y0UitmQ1l4UEEyTU93TEVBUUxJRFB5UDh1QmcyY1JZbXpGd2VBWWlsS2tuK09DOC9GZGgwQ05oRUE0bkdBNDBrZDZGRVMxM1dMTzh2MXFIS0FmaDlCK0RvWWpVMkFrL2pzLzhOQUl3ZzdPVWI3TENDK1dBZkI0Q3BCSm9JaVRSTlJtUzFsMTNrcVdoM0FkdjJBOGNkcXFwMU1CK2FJT1N4V3Y2cHE1RDJra0lBdnQ4ckY3QkxKa3NOL2pNcWZhN3YrNy9BazRCM0E2Y2VxcGFzS01xNWFrQW1sTFdZMzd0OFpXOTdQREIycUFMZzJCeGdBRndBTkVHY25JNUpjckRaUlBsa2FYTDR1MUtKVUFmQWpiVFE1OXg2ZFN2ZExQWEFnR1lzaFpXUjZKSVJhWEIvTndGSThDMVd3TE1Yek1lU3dMZmNYdUtyQTJHK3dyTENEY04vSUlnNEVSUm4wcXZ5eVNBUVg2bUcxWHVBNGZ1QWJUT1Z3a3RSUnIyTUxDb1F5dkVaL1VZL1d3akFqM2p0Rkpaa1U3OWcxZ2hrZ0VCZjk4KzBVbWIvM0EyTTNsa0JsL2ZPY2RNb2syRWprWnl2ODc3M0xBZmdIRERLandOd3hFVXc5eWFpbHB3ZHhCQUVZaEJiQXVHekczYUtrUUVKd0FrQ2tPQ2psYjdZNlNZeWYyVXdsQVMrdktZbkFYamZObURFWDdERWZBNUNqVWNzbnp2YnUxbkR0VU1tQ0RrUlpFRXlHZGxBazZHNmxRVFNhNm0wTVA2SHVZNzNBeE5UbGNKTFo2V09KWUM1L0NOeExwSE1nZEtJS05sNjlRdnU2Lzc1QWpIT2lUVTg3Z0tPT1ZpSmI3NDhCS0NXcm5LL21hVEErNThBak0wQW83UEE2THgveEJBdXBvWURDOW9rQlJBbVBkQlo0N2xOQS9EaHdNUnN4WDdtUGdsK1NybUs1RWFSTlJzbFhGUTlDS0I5RGtBRG43OWNadGtIRmt5c0oxMDNlQmJxbGg5N0RwbVRRVFlnazlWTnh1K3hZYlhLVTNsaEZvSlBPZ2RGR1krbFBrZ1F4b2trZ0Y5WGdqNEF2Zm9Gczg0ZVg0S2U5eDlmSUMrdFJmRHh2dm5paWYzNThzU2lyMkxDajV3TmpCS0FjOENJaTJBeHhMQ3pJQUdZOUw3QWhHSUtncEFUdzRsOHdUb0IwSmpQcmZUa3ArU0xRYkhyT3FtNWpOeWFqUzZWQ01JcEFwREFXd1E0THJHZ1hxeklmbnE1Y3Ywdk4wWlhIVEluTUU1R0JOTGIxREdkT1lRc0k3QWZHS0ZqbGdxdmU4d0p3RzRUK2Z1RkFGeXRYekNMYitWZ1duSC9mSUdZZmM0NkhzN2lIQzhaa1BjZFh4NFZmVlhKdzgrY0E0d0lnTTZBSFNMS1daQ1RFU2ZMZmc3V3NJeVJGM2NraVJRK0hBQ1hrd0hwdHlQNEtIcnBKdktWR25PaFJGOWVCRjl3RTBtVUVvZ3oyd0MrV0dJL3ZWeGlRUUl4QXM5K3JtSEE2RTFZRllCOERKd1FNWmwwT3JMWisraTdzZlQ4enJvWUhMUzlkZjRSQUNXS3hTWnZMWHpHL2ZRTFpxazJncW4yL3ZVQ1VROVVaYU05d0RhUGVTUHJDNEE1QzFLVitOSVRLd0NTL1NpQ1IvalJCRGxMbVA3bkh5bnN4bm8xSVB3SlN5UnBiaU1BRFh6dVBEWWZaZkJURW9BbWN1VlFkaWFXMHp3WHdRc0NZRFltTWFEQTF3RzhUQlN2YW9SMEc3N0VjR1NFVDZoak92VkFwZlJQQVVOMHpqcjQ1SnpWY1NxaVR4RCtWZUd6WGt1LzROcjdKd0RKT2t4Rkl3dDZqNitScVVybGtPNGJYenAxZ0NBQXYwNEF6Z0xERHNCaEt1Z0xGVXZRVWhUd0NFS2JuS0N3MTRId0o5Y0RnR1E5V2VnUmdESThYRWNWRUR2QWw3bFZsZ2xBZ2krSTRDUitaZjFtTEdnTW1ERmhCR0ZmRENpY1JKRkVSdmlTQUJqTFM3RkMwTUZLTVUrMDd3T1BFMGtHdmFvUWdHdnRGOXoxL2lPRGt3bjNWV29FWHhyZXM1aWI5eHgxd1p1ZkJBd0xnQVFleGJBRDBKaVF3Sk91SkJBNjgvSDNaaGs2KzNDaWZxcXdXTk1LTjh3aktnYms2Z1dKZ0MrRk1hQmI1dkpWbXNVYlYydkNxbzNjUldaY0NJQUNvYXg1Myt1bGtxTmQ3aXFPY1UxV2NDOWN4RW01a1FCVWRaK3NUblNML2pFdFRXbmdpMjFqaEpOSkJpdlpCdWtYdk9MK3lZQmtjT3F4S2pKNEFHZ3h6TXJCVndkQU1tSHJaT0FZRjJsNnkvbXdWNnhEMTd6bVdvNk1iUnllV3RPSHd4SjkxSUlocjZycVpTNzBEUFBMWERWVXJmQnd6SEtyMUVVcDYvaDBULzZML0djQ3FzbHQ0SWhvVGN3ZEFxRFNzN0k2MFdRSDZSMzI5cEh1Rnl1WERKbUVqdU9TYmRCK3dTdnVQNWJHVWptc0E1WG9VdmN2QlhLS0FRbkFwVWRYd2FoMGI4alhSMll6SlRzQzBaSEIzM0ZMKzJ5aVgzaC8xWWVEMWZGWkdUODFnL0g2eXFrVmE5WUVwcU1oVEFEbGU4ZXJIQTZ0N01oNmo0WkJYZEJHakZ5TzRDU0ltOXdHQmlCdmdxeHdJQUpRbFhJeUVKTHlJL2kwU2tBRy9GYmhhRXI2QlhmY3YrNWRMS2hDZzR6MUMxSEVCSjgrQk9EUUdaWGZrL3F1QVpDNmtldEFaRVFDVFdBVThQSUp0MGZnd0h6WnZWV05hS3FpN0pMT210RFdGeTQyZzFGeEgvWGZxR2tJSTBDK2EwdG5Ea2ZzR3hRam4zVlBzazd0WG11eStYcDBKaHRvSm9zQWFGY1VBSlVZS2lZSnhjcUhxS0FIOXJQbEcyY01ybUNVYk1YOWd1TUxwR1RjQ01LRGxaR2hNSzhJUG5QSW4xWDVQQTJBd2Vnd0VFWW1ER0JNak9JNXdoR1FQM05QQlQ3VkpsUk5hS3ZGNHQySVdIYkRFcnREbFNrMXA0bEo3L3pkMjQ2dGdsR1pyeUlmckZoUTdwVThXQ0FYMFpFTkcrNTdVMTRaNFlyQ2VMclN4WGRldjZUZkx3cmJ4VDd6bk1yZktRWGZITFFDbnl2bVJJdjBRMzQzMGV6TW1MOThQMzkzRzN3cXo2YW0xTll6em9HbitzdnFSbVRBVTJjaXRjdHFBWC8yRUk4RjlBQ0VtTEhYTFpHb0Z4dFNsMnh5SzJiQVl3cmo2WHIxMisxbm9ML2pVVENEOXZ2RnJuNnUwdjEvbnZHa2FvVkJBUWkwZXVtbU1BdVhRSE1XSkFBN2dDaXhHOFUwZ0ZmY1hkbEJLazRaNnpFTGdBSmZaRUtyeHBDMXhPSWwvK1NrN2prY2RZbFNjbzkweTkrZ0s2dkpyUmlBREQwcGlhZDdSdUZvM3VkTkNnZnQ5NHZDZHJHWG4rdHVqZ1YzUUFjSExjRm5yb2VsaXZIa2NoRUw4dWUwdVE3NFMzZXViQUlUUzNJUWhLa01SakJNb2tnV0czTC8vMnozVlNuUDRWRGdRV3hVRUVVeEFaRkhMMGVSM0hEZm0zSVJiREhrQmZGMHp5NEVJS05oU3ZyOWdvR0VCZHZUei9NSVlRTFFkVnNUd1JURkRqNWpRbWRBclJEWUpRTkRTczk2MVIzdFBoeDVOWG9WZ294bGVIbmFyam9oZ0xlYzNEMkhJNDkyeVFOdkl3dnFPOWZKbTl6S0diQXdudTZGaGFQNXBGdU1nL2I3dFRicEJkdlR6Njhjei96SThhelZqOGlBSFRxZ21GSFhEVUI4OVIyZHRhQzd0VUd3NGtET2dGYjBSMndZUkRHWjhnOU84YVU0WHdQT2N6aGl3R2xNanFxTFdpRllHdTU3MHdBREZzYlR2YXhnOG5rb3c3RThuTS9hdGZLemxuNi8xbVM0WUh2NkJRNCtaMEJicUhjZDBOd3dZYlZEMysxeVdoWEp4UEJyYnE4QXFFL1hBcFNxQXhpQlYyTVovNTRETU9ad0tFMDBybkRVV2NSNUtpVi9icmp0U0FNQUxJeW4rL21DeWVlaGpJWXA2ZmRydlZFTHRoOFJBQ2x5SFh4bWhQaTZyMW04Rk0wdWNnazgreTRSSEMxa0FLLzVYZ1crMmhaWW9mYWZXY1BxMUI1QXFEcUVZc1EzbmVwUjJncWhWMnlpb2wxQ09rRDBDK2FPYW9HeDRhTDdEUUN3TUo3dVZ3b21uNGZtN1ZyWDJ1L1hBbEVMdGgrNXNIUHROK2wvQXA2c1gyZENzWi9waFprSUpndjlsKysxd2JjcSsyV0Z2Mk5YSWpOS0FQenV3N01VQVY4RFR1eW5GSUVzUXk4M1JnVEFoaXYrTmdCQUJhUU9HRS8zbXdXVEx3QXFIbmFRZnI5R253VWJBUmdETkJVbGtwelFib3lZQ3lZRFlkSUxkZjBsNE5kdVc5a0dvYTRnZU5kYXpMRWxLb0EzUHJ4N0RvZmlFVHRDNlh2RTdoR0V6SmxwY2lzM1Fncmo2ZDVVT0pvWURjTWdsclgyK3kwTlB0bDVVWlVqa2Z4L0hxYmVjb2UwT1p6ZEYxZ0hRcmxuOUJoZWU0czNmM1p4bTRNdkFrOVZTRmRVSXcwaStRMlBhQnRJU2lCU1NGZ0NZTWpNVzAwTVA3cHd2dkxEbXdGZ1FUemRIeGNPU0d2QmcvYjdaUlpCeVdZQWxPRVJsdUtNM1JhOUNLV2MwcTczZFRCaE1GVDRad0l3OWw1THJwZXMrSGplQmlHQ1VPS1hldUJ2UGNLVGlFSU9SMGYrUmhEQk1ZaTBMaGVhNEdUYWE1TmJPUUFWRHpoZ1BCMUxhNVJzc1YzcklQMSs3eXk1T0FBRG9BY2hFSEJrRmJLZkdScGl3ZUFQdE1zNUlGTm9reU9Hay83ckFZQzlPaEJGd05YVlkxYXQ1dGZ0Q0JIYVdWUzJBSmRFY0VpbnJETkMrTHVtaXljMUI4QUI0K211TEFSQVhURENXdnI5M2xSNC9aMFh0Nk9ERlFrajhXdHVtRXdIVEtETFFlakFmTjN1ZHMvZGZqb1FkYXRHTHhiOGpRQkFZejYvYm94aUZnQVZ1ZHpOSWMyL3MzeExrMXN6QU9Sb0I0eW4rMkRoYUFUQUdKQ3RicGtDWXE5K3Y0VithQmdBUTRpNjZYdGFDODVZa0RvZy96ZFp2elVnZk4xTjdhNjMzWHF2NmZlOW1zRElIZk5hQjZBeTJKUkUxQUhBRURJZkk1bnpaQ0xlTjROYm05eWFBK0NBOFhTc3VsNnlxVjBySjJXUWZyK3NwbEN5Q1lCUi9ISnlLWDRwaHMwUEtCWjBscU9ZVHB2bmlBaVVBbUFkK0hLam8xY3ZEakhnciszd1BKUXNWQ3ltVVpyUE11UnNSQkRHNEFRQ3N1bnlKdEZHSHdBQUlBQkpSRUZVY2MwQlVKbHhRb0g2MnE4U1Q4Y2dncEtOQUZSR3dDRDlma3V2YndBa3lHZ0pFM0MrTnoxUDFxOS9UM0YxRVpCeHZaaDUwczZBRVlDNXl5VUhYdDUvUTh6STUvS3JBbUFJa2tpcGt5R1BZd1h6MWFSVDh2NVpPNmpKclJ5QXZLT3ZOWGxMYXpzWHM5Ym8venRjMjlQb2hnb3RwNUo0OVJjai9wemZJd0dTLy8zT000Q05kMWRwbnRRcEZVbWpFSDRMWUlnbnluL09Makw4RmVER2h3SmJOZ0ZqSThESUVEQThCQXkxUEZLN0ZTS2Y0M2NOS3J2SHgrOEMvdm14d01nbVlIZ0VhQTM1SjBTdHB2dnpML25QOFJiTEFmaHlUMjA3VENoZ0RSaXUvWkw5RHNmV05BQnZZemJoQ0RCS29CQWsvcEVvYkdXVHFwODE5aHpRMS8wazBQb2FNREVKYkpqeFZaRmdEYWQwU2FVTzVMa3NXVmorWFNjRG13NVVFVURKNlU0ZDBuVmJDOTFTM292ZlZIcDVhbDY0Y2dDK2s3bVpBUDc2OEtDQTBXRDNBL2llTHowOTBDRGNlVm1sQXVoQmxqTGdyZmNBdzZQQXlEQXdQRndCa0NBYkl0TTRhL0ZpTnRFUmpCbDc2VzlmZkQyQWJ3SkRkd0ZqKzZzeUltUlhyZDVZMkZqSVljbnpXUExFcW5zZkMwenNyNnFCTVFtZklEUi9weUo2eE1oS3lNclNEaUtEMnhqYTZUQURUdDAvQUdBczFLY0FVQ0ZyT0xGNnRidGlSVkZhdlQvd3VNQ2E3TWZWVGxIMDk4WUJlQmN3TkFJTUVZQVVsUzR1QlVMT21LM0xDbndPUEFObEVJT1NvRjkrQzREdlZvV1hodmRXWlZPWXFXZ2kzdk9YRFVRaGdpZUIwRUVsVmlNWUowOEh4cWVxbkc4RDRJSURrQXpvNTFES1FRSnZCS1VtS0FDemJNNCs1aFVpdndyZ2l3QzRMenZqbWdDaDZuQmNnaU1UY3Y5QWJvMEQ4RTZnNWVDamZwVUE2QXhvUUl6Z2k4QUxtV3dDNHovL0R4Y1BQd0JhazhEUUZEQjh5SlBwUFpIZUdDeUMwS041REZDQnlmaDkvK09Bc2VrS2dFekNUd0QwNDdYMFNDUE0xSVlRakN2MkUvTUpvR1Z3VVVRb1Bib3EwTWRxa1dWbjdSdERETWFoQjRnK1A2cWhYRnBqVnRrRHRSR0Eybktqb3M3SXlPeUhGVWJJclhlMEZYc1R1eklZZk5iNE8yTTNBVEdJWVFPbVBuNmhHNmdpM2VVa1FRQWVBSVlPQVVPekFMTVZoMnBBbEVTcUdGQkFYQVlPTVFWanhsbDAzaU8veVlLUkFUMEZRWGt3WmtqcDFwejUxTE8yWEFUM0t0RDNBSUF3ajRXZzA1a2ZpdVVIWWxzWEFKTFZuUDBJTkxNME9ZRng3OEF6Y1J5U2VUc3cyQUp1ZUkrRGoyRm5lNEVXS3o1TUEwTXpEa0NDa0FCeVVXcXNKemFyRWFuemoyelh3akVHRkh1R1krcFlzTW9qelpMMUc5RUJleFhvdTMzOUlSQnJDM2xKR21ORHVTSFgrdzdXQzRDbTZ3V3htOERuZ0xUSW1nQzhwQmNHQnVUWGYvMWZYbnlUdWduRnd4VFFPZ2kwQ0VDeUlGbHN2dkpmRW5oMG1oc1lJL3M1dXhGWWkxeFpvZjdvT3FTQWF3d1lqUkdCellHWGJ0V1hhQ0lybHZIVWFnWDZTUC9ydU1WWUNFYkVxRUNYQU1qZnJlZTJIZ0EwRVN1cjEvMHZ0bk53R1NzRzBSc1pNRTIwLysvWFdINk11Z2sveW5nUEFHeTVHRFlBTGppSUhJZ1JVSXJzWmpNN0F4K0JTeDFTNHBmZmZRVkllcDhkTDdkTURzVEdqSkIrQ3ZReFRIbWR0cnc0bDBDb3ZGcnVDMk5PZTk3NWVnRFFzQ1hSSy9lSzYzNEpoQks5MHEyQzdJMWkrR3QwanhGNDBrMWNQSkFCN1VQMm0zTUdKQUFGUXJHZWk5aVVUSDl5QlVEVEhmVTNCNStCT0lLUTQzQld0TnRQY1dJT3pFWkU4Rm9LOUswRENHTnhMaTNGcWFLQTlnVGdlb0Z3UFFBb0kwT3VsV1QxMW9Fd2lGejdjd2JFcnpOeFd0RVlCQitWWTc2Vmg0RFdySDhJT29HUTdPY2cxQ3FNUkxQbHRteHZzMS9TSGFQNGRjQUplUFl5eVVDUkl6clRCOHRFOEZvTDlEVU13bDYxa1FRODdSbXkyUFMycmdCMGExY2kxOFJ1ZEVKSDU3T3NZMDJ5Lys4My9zWmRCS3I0RlhRVEFwQnZwckdnUUNnOVVFQU0raDlGNnVnSkRrQzNnSlBCRXZSR3JZb1lDQlg5SXhFY1M1SzRpNmNaQUhJdzhvWFE0bUxCYjM1WUg1ZDdPZWthZHRUVjFVWlNqYUVJUEg0blF6WU53Z2pBSE53RHVXR1lwWmM3bHpQZlgxY1F1cjVvQm9yZnpEZit6aTB5VlR1U2t1eEJJMlErUGhRRElVRW5NTG8xVEJDWkx1Zkd3L2l4YlFhMEtCOENUT0RqUG9oZFk3OElRbWZEam1XN1lvL2RvQVg2R3FJaUF0REhhWXN3U21lTXViVjgxa3AxMUw2aHkyUGRBY2dibGZzbE9LQzFJaUtSbXlSeFpnVi84KytEUzhCRnJ4WGk1SGQvVTZNZVNLZHFFc0VLaHBCUnNnUk1iQXR1RzRLVS8rOXJ5NWJyelAvbFBWTXYxRVBPUWVnaGFyclZjZ1pVaFZIRnhOUGNwOVZGdGxPV2tMNDM3QzBXQUJXeXBGUkdzVjBzYjVIbjJ6WUJ3dlVHb0tsMTB2MWtuRGdvMHk3WEE4UGZ2MFVBQ25qYUszM0NvOWdKUUFPZTY0RmtOdnRaQUhRZGp6OXYyTnoyR1NhM2pZZWoyVzNLR3VaOWl4R2RJVlNvS1QxM0IyczVBSGtHaGVTVDZxbjBlckh2NUFJZ0FBVStMVmZ3L3dxM0NFQVY3Y2xCS0RER1pHOS81b1ZYeC9veVlBUmN6Y3FINUd5SDhlRnBsVGF3RnZBdHJ0WExHcE5yUURHYmVqdXBCM29tbElIUUdjL0Vyek9jR1NSczh6cmhBYmJ1TDFUY28vSmZiTGxOd0hPbWkya0ljczNvd2Jkd05wWXR5bkRRaHNGY2d2dUc5L1lhcEdGdllYMjJ6WmNBVTAvR3dBMkxKLzRBbUdGOW13RWJCdTk4WTNjTUYrdUFHUUNqMkhWcDNCYlB1bzNJbHF4QXk1d0hBcTRPZkFSbUVCWEdmTklCYTBCSXNHMGVjd0M2N21lckhnUnBaTHdvY3JXYW92dVR4ZXcvVjB0eEpRMkRXZWFlM1dBR2JkaGIyREI0K3dSdzd3NWc4UXB2ODhsaXlHdG9XSHpNaTRDOWZBRUhiQmk4a3dVS3UyeE5BZEJ4YUdCTGJKZFp1eDFMd0FHRUNZQUVtNnd5ZnBlbEpyRWdGblJEeEVTd2d5VXhJVXNWTXdqVnk1QVlPMGJHODlBdXUxLzVCRjM4S3FqQkhsVUFZWHN0ZU5DR3dUZVdOdXd0azRKTWtybHpHTml6QTFobTY5ZzFOaXgrekRPQlcwYUJlUlpaR3FCaDhNNGVtZldOQUREVCt6cU1qUXlFU2RRRkhmRGJaRUNDTFJnZEhlQ1RlOENCYUtKWTFyRG5CUkNJQXVHVzRUWUFaZUZHOFp1TWtHaVExSUV3R0NKdEhaQm15MW9iQnN2Vk1uREQzaklBZXJ0aTNMRUJPTWpHY09wYTNXZkQ0aWM5dDZvdmVEdExmdzdRTUhqbkg2d1BBeWJXNnlhRzQrOEQ0SElRZnZ0RElWdExlanBCRnNWdlVJN05JQkh3M0RValJ6TDNyRFZ0c1lQT2tBU2N1WDNjb05EeW5UMlZZSkNrbitQanF2VUQ4aFZiUzhOZ2pwaEd4Y0FOZThzQUdOb1ZZLzgyNEJDQnRJYUd4UmU4cExLWmRwTWtUdlhpSjJ0b0dIelNOSERQU2NBeXEzZXI0cVB5R2FOYzdKQ1JYV0xUMlRqd0dtQ09lUWFzaHE2K3FTcFptcDh2b2pRcGhlRjU4bmNkWlZqTG5qV1BIcjRWV0tUS3hySEdVcXE5N3FYdTNqcDB3UHkrZUVDL0RZTlpzWkFPNklFYjlwWTlsTkN1R1BjTlY4MzBabWtNOWRtdytPS2ZiZGNYdkpNUGRZME5nMC83R25EWEtjRE1jY0JTN013ZEt6OEtDQUtRSWdZME1XR0N0cjRUT0hBYXNNd09rVHFmNnVueXVMeWtmZDI1NG5rYjdxc3cvaVZnN2poZ21TWDMxVnBkOXlSSGVMeCt6UmhqRUdSYkI2d0RZVDhOZHlteXViekR6Q0NHZnBNSldmU1JZZnI5SFAvYU1nQm03WW94TlFITWJRSG0rSUQ2YUZoOHlTOTN0QXZHUWI3ZGEyZ1lmUG9YZ2J0UEFxYVBBK2EzQUV1YmdHVTFSTTZCMDYwZmdrUm9DemorVGNEKzA0Q0ZFNEJsZFpkUmM0L1l4bHhnakpNZXdTaXdOMXpXZnNPbmdkbGpxM0VtWTA4dm01aS83ajV5SU1xcHZ1cEt5R29OZzlsbmdZb3NsOXdZLzBkWmRyTXpZbDhOZThzQVdOT3UyTUEzencvRjJDb05peTk5WGJ2ZnRyY0xyaXo2UGhzR24zVTljTTl4TU9ET2JRWVdDTUFOd1BKNDlVbGl1VzZTYXFxQm4vZ0dZUDhwd1B5SndOSXh3REs3NmFoRGVONnVYWUN1WXlBQmtFemE0TGJwWTVXRVdkU0x4akYyNi9kUUIwU0o2cjRCeUFONk5ReG1rV2Nxcm5RMDB4MURFREpGalI4Q2NOV0d2V1ZQcDZaZE1RNk9WT0NiM3dBc2NQSjZOQ3krN1BlcmtQNVEzdEJZMVByVDl0RXcrSndiZ1B1MkFsTmJnVmtDY0NPd3RBRlljZ0F1aXdXbE0vWHFEak1FYlA5dDRNQjJZTzU0WUpGTW8vNWdISWNBTFYxVFJaMTdGWE9oUHR2Z3R2a3FmOUg0a3ZIRGx5S0s0bDZWenZWU0JGMjJ1d2pPYjdwYncrQ2Zjd0JTa3llRkVIQVV4L3l3OUpUeUVibzI3QzE3T2wzYUZXTnVBbGdJbjlReE8ydFlmTmxiSzZNdmF4ZU1SWXF1dkw5clRjUGdKMzBUdUg4TGNIQXpNT3VnWDNRQUxvMjFXWEJaTEVId1JGMU9nSFMyZU9nYmdJUEhBN1BIQWV6TnU3UUZXRlo3Sm5YSjVybnF4SEV1bHZsend5Vk5OMyt3ZXJuNVlvdmw3U1hMR3d2bjRyaUxXTzRmZ01SSlhjUGQvK3BtT3ltRUxFaFJ6QnhKQW85Z1ZMNGt3Vm5ic0xjY2dIRXBXaTNlcG9jQ0FNZUJSVTVlVGNQaXkvNnF0bDB3cHZoQSsyZ1lmTzdOd09RbTRPQkdZR2FEcys1RXhZREdncVArY2NBa0lOYVZwQjhHVHY0ZDRPQnh3TncyWUdGcnhZQ21WMFl4TE5ZaGVDWGF1N0VoVjNnYTNMYjhnNCtSNDV1b0dMQURnSFdxaHNCWEE4SzFBWkFEeVJ2dXZ0a0JTQXJoK2k5RHNRaENPdGYwVVVnVy83YWlZVy9aMCtuUnJoaXpveFh3Rmh5QWk1eTRyR0h4VTY2cUFGaFQzckRTSVZkcEdIemVuY0RlamNEQkRjRHNCREJQMXVYMUNNSlJ3RmlRSUJ6eGllTDNLSVkxWVc1TVBPeE53TFJiOGdzMGFnaEFzczFHWjFPK1NGSHNkUlB0MGkvUExIdSsrZEZiL3g0bVhmaGNiV3hoZkN0WU1Gci91V3ZLeGZEYUFjZzdpcFBDdkZPVnB1bzNIckNqWVcvWkErclJydGk2VFM2TVZRK0w0TlBIMm54Njk4R25YRjBCc0thOElhYjRkRlpwR0h6K0pMQnZBcGllcUFBNEo4Q1BPUXVPQkJBT1YwQ1VZYklza1JrQWVjcnZBZE5iWGMvYURDeFNweVQ0Q0VJeVRnUmduZWlMSXAzblA2ZnMrYTRBNE44QjgvNDhDVUMrWkdKQTI5ZnB1TG14SlcrNWg1a05GZzJqaVdIU2kwcjBVdjRwQ29ac3h3OERVZm5oZDRWazBYR2RHdmFXUGFCVjJoVmpkamdBMEJscGtRL0s5Ym1uL0hPVnF0Q2x2S0VCcWxmRDRBdG1nUDNqRHNCeEI2REE3dGRiY3ZZekp2UUpraWkybjROT2VNcGJnSmt0YllQR0FDaUYzd0ZvRXgxWk1OZS80am5QTFh1K0t3RDR0LzVTTy9pTUJjWHVlc0h5bHlBQ01CUERnekdnN29wTThtRUhJR2R3cmZHQTFyQzM3QUgxMGE2NFlyNEFQdnZPU2R3RVBPVmJLeHUrSzJwZEtSVG1kSTNkcWtQUFZnYlNUQkdBWThBc0FUalduaUJkeDBReEp5bE9GQ2NyNkhCaXcxUC9DRGdVM0VnRUlNVzUyTThZa0xvbFFSZGRJTjFBeUtXaUJyZXRmOU1KUU42SHNhQ1B4ZTRydmdEZEhPY094RElBY21ERkRYdkxuazRmN1lxdDYzZ0VJQi9Zb2orNHA5eGFBYkJIZVVQTThxRjJhUmg4NFFRd05RWWNHZ2RteDRDNTBXcUNGbmdOc2dTdlErRHh1NE11aWF3aHdJQVhWazFPK2UvQTdDWmdUaFkxZGNubzFuSEwyb0RJeVpVTHBCc0FGVEJaOXBqVDBRUWduMlY2dWZSaWNTOFFSZ2JzNVpZcEVzRU5EZWpCZnBvTHJ3QU9qZ0l6Wk1CUlowQUhvVUMrU09BNTZ4SndObEV5VEZ3NUZ4QlBlV3ZsenBuYkFOQ2RRMWVTR1RSeWJNdXlkZ01nZ1ZCc0ttdFlvQzZNdDh6blp4c1pNTHpBeG9BT3ZzaCt5ZERxdFh4NEZJRGw4TC9vbVE3QTBRcUE4MlMvRVJkVEkyMm1OZmFUdUJJSXhSNEJoS2UreTYxcHVuUUMrTXl0SS9aei9jOUV1dnlCZWV0TEFmR1o1V09NWjlqMi9ncUFCQjFmTUxzSEFWQnFoZlRjeUg1ZDlNQnlFZHpzK0I1MFo3dm9HWlgrTnpOU3NkOGN3VWNHNUFTUktZYmRIUk5Zd2hoRElIUmdHbU8wZ0ZQK0hKaDE1ak9Yam55S2JsVlQ1Q2Jmb3EreUpPc3pGOFA4K1ZuTlBsSUNrTUF6ZHMvWUx4bFl6bnJKd0lwTzZlZ1RQTXFBNVpOREFCNmlDQ1lBeVlCY0JxVFJRMGU0NjMwU3haeVFKUUl2TUo4bVNlTHJZZStwL0d6R2ZuVHBFSUJ5NlVTL291dCtLMXdnK2Jyczg4ckhtRE9nQVZDTW5yRWZ4eE10ZTFNdDZqN3U5enpLZ0lYemN6RUJPSklCMEJuQ0pvcWdJZkRFaE01OFNXekpFUEdKZTloZlZINDJ1bi9NZnhsOWJnU2lCeVNJQlduQUpCREdFREFCOFFXRkE4d08zL2Erd0g0K3JnNFJMUFlMdWw4dENJOENzSm1KTVFBT3V3RkM5cU1JOWc5WjBDeGhaejY1SzB3ZkZCUHF1N1BFeVZkV0FPVEhWbFRjcHhoWEhaTHoxdzBaQTZFRExoa0Nza1JmMHN3NGRSWUMwUFEvdlZTUkFZUG83UUNkajdHcVZPU01lQlNBelV6TXhaY0RNd0xnY0tYL3pidjQ1U1FsSFhESWdhZ0pjK2JqWkJxQVdoVW9IL1krQjJEMEo3ckZhNkxZRFJtem9tc0FhT2VLcXhFdmJXYWNIUUIwOEprUkl0ZVNYaVNCTFlKT0xCK1g0eHJ6QXpZN3ZnZmQyUzRSQUtrRERnUHpORUFJeE1BU1NXRjM4V3Nna3VYTHlYVFJTUkNlL0RkdVNaTUJNd2U2T2JUZDhKQmoyNEFvdDA3dURPYlBQOVhzSXpVR0ZQczUrSkovTTZvVDRidXhIdjlYN0JlWThLZ09XRGcvWjU4R1RDOVhxNUZ4VFhPdzljM0NtNms1ZlBjamdiSGJnQWx2VkcydEgxVDNPYXZvcTZCbG5pWisxMm41dS8yc0RiT3Zhc3FvRmc4eDJMbmJjZDFHZGhTQWhYTis3cU1yQUM0c0E4c09SSjZ5SHdEMjh6K0Z0NGZkdjhVeXFVRHJEbUNFQmNwWjM5a0xTNmFxOWw0RDJyTGIvS1lzRlRQV2RmYnZoODZ2UXUyczFLL0sreklqVHNYSVZROWE1OUVnczRZNnNaZklBL0VjU3AvakVYdjhCV2NBaHhhQStTVmdTUUFrR0FNSUNjd1ZsTkxscVRjOUdidi9IQUE3TXJMNCtmMVZsWHdyVXE3U3ZDb3lHY3JyV3BHaHV1cjJmTkdZd004WVQ2N2hUM3MxTGFadnFuNU1MTTBiem1ITW1JRlNnZEZOai9tSUJjdDYzTmhGWndFekRzQkZncERQZWFuTmdBVGZDdEdzWDlUSUt3TnJnOXR1VmtobG5nN1RJL1lBclgxVmtYS3JFZTFsMlN5bk4xUkNzRkpzcW5RdjNVSU14aHdJUmpVNUFHTjlRVXRlVnozQlVBdmFodU5nakMzSHhMQU5EN25CcC9jZ09OWEY1d0N6OHhVREdnQ2pLUGJ2ZXZsemNLVUhIMmFnNmNuWXplcFlCQjlaaTJGeERKZGpvWEp2MVdERmlMSjZNS3FLWlV6b1FGVGZqMkhtd1RLY1RwVld2Y3hIS202a0tnb09SQUV2VmNsUEQ2TmR6TFhwTVQ4SVlOUGNMVjd5SkdCMkFWaFlyQUM0U05BNUF4S005cnlEUEU1ZnM2ZWVWS1dHWjJNM1MzTVFmRXlKVUtWOEwxWnBKWHBWSjlwTGlsbWxBeFdrVkpIS3dJaGpqRDlUdFZYVm0xSGRPeS9wSmlhTUZSV00rYm8wcldsNHlNMU43b1BoVEplY0M4d1JnQXR0QmpRV2RCQkdFU3dnU2lWMFBiOURSZ3UwVFkxOU4rTTFtUktoOG5pcUZ4M3JSRHNMcWpnbDl5YUdYVDgwdmNMMXduRTI1MlBBWkN6QUhRQ29pcW9XM3lZV0ZJdDY2NGZVcEthUkVyMU5QYWtINlhrdU9RK1lEd3k0Rk1Td2dVOEdTUlN6MFVKeDNWeC81dkZOYnJzL0VpTFJZK3Y0QUNJVHd3NmlKRW9kUUt3Qkl5QlJ2OXZ3aEt6VVc2ejY2VFVHRXdoRFMzZXpxdXNBeU54bkpuOHhhMUtSUFNGdHM5WWZGQi9RRFpjQW03OENuREJUNVU4ckNxamZjM3loOEduL2hHZC9Nc0tmMStRellKNDg5MUp5ZTEzaXkxY0FFOWNESis2RnBZckVraWR4RE4zT3RYUitGd0JHTWV6b01teEpMT3VtQXVENEo0cnhKcmZkSC9YQ29MR0ZWS2lVYncrTEFQUXFXV2FNTUxyZDYvK0p5Y1NJbTg1dzlsT3B0MWoxTXdBd0ZUaXFBV0VVeGVZSDVFTm4vakluVVZIZU1YUS9mL2pSZVB2Q2E0RGhUd0xIZkJjNGZyR3FxYU5KekxQdzZpWnhWK0hUcGxGR3ZaclhaVDQ1TjM5K0hXM1R1amxadjhENmZwOEhScThEdHM5WElPUjVZdGFrZ0JnZHJycnQ1UXNxOFNzZDBCaFE0SE13bVZpdEFXSEFZL0xiTERRTlFEYVRWSjhRNlc0cVZCNTFPT3FEWkRQVkIzVExPQmVwVzVqbXFhTGJlYzNqR2dCR01TeHZ2ZW1EWWtROUdvS0YxU2hVQ1NLQ3FCZVFydm1mVlpQQzFrZUJqWGNDbXc5MTF0VEo4cTVYZ09MYVFnQSt4L09kV0EyRUdaOThnYmpsZVRIZFFIUU4rMml3bHMzbkszL1poajNWZVFob3ZZemR4bUFyU3dRZ0RSQTNRaVNDSlVyVG5qZmw0S296UkNTQ0NlWW10OTBFb0pKYlZDay8xK0ZpQ3dGWnhMazRkUmZMRmlhNng4TGJZa0Q5djljWHRMRzYrTzRBWVFSZnJnUHlnVkljcXloVFhjV0ZPSkg4Zmgzcno3RUt3blVBcnE4bWNHd0syTUNDMWk3V1k3WmVuaDU2ZmVIVC9qRTN5bGlFNFRabmNkNjM2Z1BGQ0tXYXZHaGNSeDJKK2N2czlNbFN3MFR5M2NDbStjN24wRzBNRXhkVzRCTUliVFhFOVVDeW52eUNDWCtPdm00Z2JCeUEveGlzVmdKUHBYcnpMajRFb1JKakpJWnJXSEFyUzlpcHJLK0tjZWZnaXlCMFhWS0dqT21DbVc5eGhSVk1VU3lSRm5OZUZHRWRJMnErL0hGWGNsa3A5V3NBYmdURzl3R2owOENJNjRXeFJrL09URGNVQXZCSFhTTFF4Y1ZDRE1RU1dienYrMWU3V1ZieitrNXcydEp0c2JjQ1lWNldKWTdobUFzREE3cjFTejNPZ09nb00rS1RPSmJjalNJNXlHSWFORTF1dXdsQUFVL01GK3RGNS8wc0lnaFZMZFZkTTJTMGJTekh4Mk1pK0ZUeFhmOFg5MjVOQzRCeWNLOFF3Zm1nVlgxTGxjRml5a0VNY0wyQm5kSko3YVFmaWpLZnhMR0R3QWhCeU03YUM1VTRxd1B6Tnd1Zk5uTnVPSDRWWmFDUGxQbzJBYWhxRnFvUFZGYzE0Z2EybStXRUVMMGNBejlrZFByT21NdThyMW8vclRzWHo3Zjlvc3dGcytqTzZMQXFrdkMzR2dnNUZnNm13VzAzQ1VJNlgxMmg4bHlmY3ozUUhxcjNESWw2NERicWFRS2M5bUk4N1FYQUNENnZwSnFZMEVWeHoyQ0V5Q0k1ZU1TR1gyZTdWdEk1SjR5VFJ5WmhzY3J2dDFuUXVpdk9BYU5MbFlFU3djeVNnaVZicjM3QmZkMC91MzF5RWdnMkZWYWlQQ2VWT2d1cUFmR292MGlSMFI5SkFCSjBibndrOW5NeHcrZk9oNTVFYmdSaHpvenJCVUExcG9sTjlDTHdvazVIRUVVUUJqRk1RQjdEK2o2NTZQVytJcko4Ty9iQkNvNHNHRmRHZWpxaXlZQ3gzbUtlOS9KdFRpQnZtSTVPRmlUaXNnOUx0SkZGN2daR0RyVWJIS3M3OStoeXU1aFNhVXZoMWZvRnIzci82dlpKQ2lYZ0NEd1ZWRko3TVZtUkxzckdsdHVGQ2M2OHlGZEFDTURBZmx3UjRRTTNIUG9LZ0lFeHQ0Z3o0MlN1YVFiOGhCT0Uyb1ptbHUrS0ZsS1IzUVNzc01KeERQV2JianBmTG9KcnhHOENZVDhNS0daU1ZUQ3hZRlRJYjg0bmtDeENJUExEaWJ5MzBnWEZnaGFGNGMyUmVSNDY2VXUyZnZvRnIzci9mS0FFRnh2cHFNY2Q5eW9uSXJrdUs1TExWN01WQ00rL3VESkN5SUMySjhhMHoxaXdxeUVTZ01sMTVTYTMzUUtnbXRQRUJucDExbXd1WGdPNzBVZDRESFd6ZmdEWUMzekJFT2s3SGxBNlhLeUhRemI4SGdHb0NTUUxxc3hvckl5MUJ4aWU3V3gwckZhZit3cjlYdjMyQys1Ni83SGJKNVZIdFJZVCtHSnJzZWhIY3lhNTdQeUtBUWs2K3ZCa0JaUHBqUEVFeGx3VTU5YXdnM0MyNFc2S0JzQzZ0cUhSK01pZHlWRzNpM3JkQW5Bc0gyVDA5M1hUK3pMcjE5N01UQTgwaDNTZnNaUDJVcXBDclBRNDZvRjMxN1ZycGVpS1hUSjlNaE1Ma2dHZENhY0tHL211cFY5dzEvdm53eUdnQ0RDS1d6SmUzbHFzeXpMV1pXZTYva2Mvb0t6Z0tINGpDN29vbGhkQzRqaXV6TTBXUG8rY1BRMkFzWDFvYkZDVE81SnpuNTY2UHdiUmVpd25mVFdqSTRLdkRvaDFqdWgrYVQrV0tTWUQzaThBcWwyckprK1ZzVlFseTVra2RkdjJGdkhUNjFpY3FPN0ZyNzEvSWtMTlhPaTBGUWpWMDA0Nm9CeTZ3WjkyMlE5NUlDcURFYUw0WFd3M0NPY2Y5TXc3M0RGQjlBcUU2d1pBQVM4WHV6R1FJREtmK29Wa3F4dDAwdHRBYytZVDBQSjlxUkZTQjh4b3llNVh1MVpWZUNTZ0NMYllMVk5zd29uY0h4b2VMd0N6QkdqQk5raS80QlgzejlsWGdVQ3lJSUdtaG92YTgzY1JnTzVUZTl5TGdQM01mbXNCUzh4czgvVTY3ZVBRT3F5OXVtQlVydURjaHFvOHNIU2QzUE1mVDVpZm8rYWNrOGVGSEk2UUVjblQ1R3ZkT25WZFhvZitwdEorQlZQV2NlaWFSSEE4VXMvbmtBQ284bXpxbHFtV3JiRkRwcFQ1QTVVSVptN0NQQTJWZ20zUWZzRWQ5MDlrS0lxQjFxSkFLQ0JHOFpzdFp6M3hIT0FBaXdtcERJZG5nMW1hWlFBa1p6c0haNTM3WWZRcndOeXhvUStIYWtyblMwaDFtVUExQzk2VGRKVG1PUnloQzNvZXFkd1JPaStHRGhrRkk2YllOcmNOREVEZUFrWHdRaXpQUnBtbklzM09kcVpQU2FSRlVjYmNoSGxnaWU2YWdxMmtYN0RkLytkOGxVSlZYdVV6azhFUm1TKzJ2ZmQ0dXZOMlZPVjVyU3diMHkzSmhnSWg5d0plTjNZTVFDSWdSNzhRK25ERVZZQllaVXJVcGJYRm5NN0NPU2RmN040SVB2dERuVDJCWS9oOENoaDEwTVhRZVlHUys3R0dqYVFpQUJwdU5JRmlFQ256ZFdKTUlVSGNhekxwdEM3WWl2c0Y4LzdGZ0xGTXFwaVFMNVR1TmJLZkEvREM0NnJxcUFiQXdJS1dLK3RpbVJVQkVpTkdzT1FzeVFtK0dwamQ0bjA0NmhiVDg0S1B1WWpPbUhIeXA5MmdjZ0RTMk9vSXVWSWVoL3h5VWthVnd5RVdkTHJld0hFM3VCVURjS0l3bnE0MEhwRFhMK24zQ3piYUtkZ3VlbDVWbkZKbDJhd2FnaExRQlR6dGVaMGNqTHEyQTJuME02RVBoMnBDNTdXZzQxcG9MelpzQVpOc28wSHc2ZVZSL0o4YkY5WWpXR21WQ3BHS3dRTEJSQ2NyYmlTeE5MZ1ZBeENGOFhTbDhZREhIRlBXN3hlRkJSd3YvckdxT0tVQmtPRHpxZ2RXUFlBTTUzdlRBU01RdTRCeDlKKzY5T0hJRitONzFGMU8xZ1VCK0FzQmZGcUtDKzRXaTRCV1grQ1lnT1RBVTM2d2RNVk5WS2thM01vQldCaFB4eWl1a28zeGtTWDlmdkdNa3FzRGx6ekhDMU42U1E0RG9JTk9lN0tlbFdXVGhlemlPYmVLQ2RBUkFwRDFBZFZuUkgwNDhnS1VBbUFFWWk2T2g0REpWNFZvR0RXcWpxNFhMYk81bzFqQm9pbUVQaFBKbXd1OUZ2blRMZ2RnWVR3ZDJ3eVhiTXlSS2VuM2kyZVhYQjI0NUZsVllVcFZ4VXBHaUx0bUdCbHJURWhWVXdWOGRFa1ZLQXEzTUhKMXV6UmJSeCtPT2dEV0ZYNk1zWEpVLzM2bEpvRW9BMkFLdnc4K3V3VEVESUJiU3RkT3M4ZGREc0RDZURvbTdaZHN6QklzNmZjTDlyb3IyQzc1VVM5SXhKSnNFc0hkR0ZCaWw0eVl1VXdrbm9mSmdGNFhjRVVmanJ6K1g3ZktvNEVKSi8vUGtNT1JPNkZyVmpRTWVMNWtKaFpNTVh6THdOWkN0MW56REZnWVQ4Y1F3cEx0NGhET04waS9YN3lzNU9yQUpWZTBTL0lTZ0ZZN2o5WnZuUTdJMytseXFwWWFMOThDV3AvTituRGtaZGhpNmJXOEFuMWtQM2ZSVExLVldsd0Y2UlpDSDJMNHpERFIwazFJcWVUTmIyT1FTWU5iT1FNV3h0TXhlcXRrWTZJK255OVZFejZidGZiN3hjK1hYQjI0OUFvWHY4NSt0SUJWZ0pKNm40bGY2b1YrbWZqZERKTk1IMHdBVkZYOTBHTWsxZjVUeGxTM0ZnZ2g5MkR5TjBJT1J5NTY2NUtJZkNrdHNsK0szVnNHdHBWT1dPTWl1RENlcmxTbmpRMnJCK24zQytwSUJkdWx6OHdxb25yTlBMS2d3S2FDNUIzczUzcWhYVnE2b0ROZzZzT2hxdnFoRXIzVjJWTkxCam1uU1NOZHJPTEoxemtBdTZWUFJqRmNGejRmWERKOGk0NWhHOTRHdDNJR2pPRllBOFRUbFFaL3FHSDFvUDErOFp0bFQxTUF0SEs4bVFnMjV6T1pVU0NMSWxpV2Nidzh3Zlc1TG4wNHNzcW5IWDA0ZXVpQ2s2LzNkZTY2TVBwdUFRVlpBRUZrdzJNS0Z3NmExd0VMNCtsU0J2bUFPTWhEOHZrT2tGWDc3ZmVMTncxNFlUL3NzbWM0QTZvT2RIQkVrd1hsZ2pIMms0TmFsNndCNGZJdVg5THpaakFtb3JOZUhNbzVUYzBPZXdId0RUVWg5SFh4ZkdKc1lrQWJBQUFnQUVsRVFWUy91dkNwb0FjZXc2ekJCcmR5QmxRd3dvRHhkTFpXWExERmtIeUY4eEdFL2ZiN3hSOFhYQnlBQVZDMW9CMThIUVlJVCs4dUdmUDc1U0NVczFvNjRoZTh2NGo2Y0lRK0lxa1BoeHJCQ0hqZGpCSDZBYmxRa0FlWTFvbmR1a1NpRUxtc1VQcGpieXA3WHV2RGdBWHhkTlpWdldDTElmbUtnNkJiaHJqdXA5OHYzbFZ3Y1FMdzhncUE1djl6QzlqRXJ1dGx0ZzhnTXhEV1dNQmFNVmttQU5XRnlFVjZSMHVIMkkxSXpXN3lwYmtRT1RQNWYyY2g5S3NGa3dwMGtRbERBT214ekhwc2NHdUdBUXZpNlZENFJnbUFnL2I3eFpWbFQ1TUFUTlh3cVFjNktHd2YyVTJ1R1YydXpnM0Q0dWE3ZkRuUHdaY0tnSWRxOUdhSUJQWmIwWWREN2hneUlGV01YaUgwZVE1dlhTNUhjTWtjKys5bHoydDlHTEFnbnM3S3h4WnNDa2dkdE44dldEK3ZZRE1BVXBjamE3bE9SOWVMVmNJUDR0Y3VvYi8zQU9IQ2RXMDJWVFg2MkFwQjRNdjF2MjRnblB5OUhpSDAzZkozNjZLWUhZVEhzZ0JCZzFzNUF4YkcwK0hMWmFPcDY1aStsbjYvWU01RXdkWUJ3R2oxY21Va0U3KzhUSExOZEFIaHdyVU9YdGNyTy9wd2hGNGNjdDJvTjY4Qk1EQ2Ztc0pNL242UEVQb1lQcDhiSDNrQ2tidGpqaTJ0SkpBOTYyWUFXQkJQWjBXQkNyYllzRm9PZjlwREFpRU5rMTc5Zmt1dmY5blRYZXdLY0JTanNuN2xkb25XYmdRcHgrMjZvdGFMSXdBbGZpMlFRU0pZM1lqeTVpOWRtc0ZNL29FRE1NL1o3VWYwUmlZVUE3SitUb05iT1FDM2UwV0JCbTlxTGFkNkhJQ0cxWksxWEI1UG94bnVPT0ljeFNYZS9PZjh4SFYvUCtGcHdONDdnS1VwWUhtdVN2ZTBwS1pnQ0tTcTV3cW5pV0UxV1p6L3hvdUJtNzRLVE13QkkxN2xWQlh3dFdTcys4L3ZMNDVGZjN2aHBjQW52d29zOGQ0OERaWDNNMmh4OVhJQW51MElJTzBjaHUzNUFPZ0xMMHl1Ry9qT213YmcwMjhHL21OejFZV2RFVGJtNEk1QnJGbG92K0V0RDJ3SW83bCtBdGc4RDJ4WTdpdzNWNWRpRXFPNTRtbmo2WGRNQVljVSs2Z29uN0EzTlNPMnFGamx5WllEa0FYNnVENUlhbTQ0WWFVZlZORE54YUpjTElQWGNHR3BmaTZQblpkVkQxd1BzcFFCWC93bDRPYU53TjZKcWcreHdyeHNsY1ZGdVlKYmxlaGtjWVlaR1BTM0wyMEJ4dWVCY1M4bndnNUg1a1preDZUUVNiWEZaY0NRS2FkeDVDejVtUHVyQUZ4clJhYTE3cEFSMlBGQytFbFNIS1EvMFFqUWNnQ3lHeU05djNTbnNEQlJKZ0w2bXNXQ2Y2SWZXZVVKYWM4VUZscFk4NTAwRGNDZnZnYjQzaGl3Wnd5WVZoZDJEL1ZTcktHQW1JRG5Ca2lhZkVjTjljcHJIZ0tNemdOalMxVjdyUmpSbGNleXJxaWY2S0FrTWdYSU0rNnRBbkRsK3pTTDM2TzkrVThwOWpHSFFvMjg1LzJYQS9BblhlTm5LQW9yRFhIL0FJTHdiU3ZMRXo2UWwyK2NBZi8zWGNDZHc4RGtLSEJ3cE9wRmJFMndhZHpJZHloM2pqTlFpcllXRXdZcSsvekp3TWg4cGYreEtOU3dNNkRaTW16TlJSYk0ySysySWk2VGxGckFXZmQ1VjNpL0Y3SWdUMkxCRjVMYklka3F4TFBXdnR6bEFHUTNScFUzWTdBaWl4TXhMT1VCMnQ3cEtROE0wcUNUbnA4SGtvakpnTnFhTUVKZXNRdjRBUjNJdzhEQjRRcUFzKzZTV1JpcWdKZ1kwSFZEQWRCQTRCYTR4TjduZGxTRkFBakFZWDRJUE81ZEJETUFkUzJpK0p4N1hUZjFlRWRURGZnQVFuUjM0cC93UWtSbWpOQW9CeURUL3VnRnBoWEFtakFFbjhxYVBRQWdaQ3MwbFNja0NObVZpZ0ViRk1zUEJCRTNEY0JYN2dMdWF3SDdob0FEN0VNOERNdzQ4QWhBVHJqdFF3aVhvcWtURXdXZDdMT25lWE5DYno2VGlxL1RJbmIyTThaeklGclRRYkdpeTkyb0d6N3BYbC83anZkQUpuYjI0NzBJYkIzVDc3U2FpK2h5QVA1dm9UcVc2c0t3RkFjL1RBZGM1KzNkdmNzVHJ2UFZZU0s0U1FiOHhWMys2SWFBcVNIZzBGRFZoM2lPSUZUSUZ4dGl0OW9yTDVaL0xEMVE0cytCOE9uSFZ1WHdoaGRkNURvTEdzZ0NDSjA0cTY2WC9KdS92U2FlQXhEUHZiZHRtZHRLRFY5MGdWRVBJbC94eVNrdmlPaG1BRWpybHpTa3dqNDBTbFFaWVozOUkrOEpCTXg4bVpyeWhPc0t3cVlCK0twZFZTREZ2aFl3UFZSOUJEN3V5WDRTd1JTNTluTkkrYlJjay9EekowNXYxMk0wblk4ZkFrOGlXTDVCQjVxQVNQR1JDaThFVmp6djNtcXBrQzlBQ3Jyd2hLdWtCNjdHaHBxUlJvd1FNcUNpWWJqOG9Pb0hlVVdwZFlJQkFVajhjOFdqcmp5aE5JSjF1bnpqRFBqcVhkVWpKQUFQOFRNRXpMWXE5dU9ISUNRQUxlL0V3V2UrUWdkZEFxQ3p6RDgrdmdJZ2cwcXArNW5ZamFEekNnam1uQ1lvbmUwa2xxUDRKU2d2dksrNkxvRlBvRk1sa1BHaCswclBXdGE0UkhUTkpKUXo0TThFQUdvTlRQVlU4b3BTNjRDQzl6b0FXVEZDaGNxN2xDZGNoNnMzTDRKLzJRRklFQktBMVA5bUhJQm1oUGgzQWkzNTRSeUFBbVdzUi9QUnM2dk9SOFo4Rk1QUzk3eXh0SWxZZ1ZCL0k3akMwcklLU2ZMWEYxRUVCK0JGRmpRM2pDTEE0OU9Xc1JUVEVQenZ6UUV3cnk3VnJaNUt3ekFRQVBzc1Q5ancxZGNIZ0NyT1JRQ1MvYmduKzFIc0NZUVN2ZWFIa3p2R3Yxc2NnVS82UjU1WTFZSXhodk9tMUVaZWtRV2w4d1ZEeEpnd2M4OFFpSmM2QUtYL21lSERhd1g5ejE2TS9FbTdiTzhRMDhHQlAvakVrQUVWak1Cb0FGV1hValJBM0t0TndPQlhXM0VrQVpockFMa3RwQzZsS3RUVjRPVTdSSEIrM2tIV2d2L3pybllabDJrQ2tGNHVGOE1HUUdjK01xRVlVQ0EwbjF0a3d4Ync0U2NIQUhyNzFRN1c0KytjOGN6d2NCQW1IVkIvYzdCY2VrOWIzRnV3YmREL2tqR1dnekpqUTN0aEdtVkEzamhmT3lVK1J4QjZGYW1PRnA4TnJoc1RnTHk4Q3B6bTVRbFZwdEFVKzZDaU5nWENhSVEwQmNEWVY4YjBQNHBpMzB2Zkl4RDUrdzcyQzlhbGllZ1c4TUh6cXJtaC9tZXVGaFlpMHBLYnM2RDlmc2gvbjFYRk1yWU1iUGdVQnlDWno2Sit1RWtuREE5QW9ybldGUmIwMVdaRXNBQ29IaE9xeUM3d2RldFQwUUFLMktxT2I1TUNVdlB5aExFMG9ReHpxYVlOWEw1eEJ2eVZYZTEydkJ5TEFEalhBdmd4QnZTUEdGR01JakNtSmJFVzhIZm50eHRRbXhUMGNteHA5VVBBZEtBWjF1cEE2RUI3cWdEbzZvQ1V4WFJ0UFZTcEF3SnBuVWh1eEFxV0NDWUsxTUJFeFpsalk1UzhTWXIrcHhBRkF1QmF5aE5HMjZqdzh1c0NRTFgwU0FBa3d3Y0FFbmd5UWl6YVhvemlJbGkrT2U3LzlrSnZOazFMbUJNZTlFQ08zWFJCN2FQZUYwRVlITlZQZFQ4Z2owMTZZQmNXdEJmQlZZSnV6N21GN1ZnR1kvcE84ZjVXZFExLzdVNjduSUtOUzdqMHdJYkRQRlpzeU5ISFk3b2QveGRsRUhqOENjQzNUZ0NXSGdHQVBTeGlTZHQ0MzEydS84U1BBbDgvRGxoNHBEZVpXMlBENEoxYzkrdXlEYUlEa2dFSlFLblRmRy9OOG5VQW11NUhVbk1XNUFSYlBmRXVJSHkvQUNqUks3Rkw1cE9SNFJheGdUSG9mS2w4ci9TMVpXQm5BR0RLZWZibjNBRklQUlBYQjdzRmlWUWltS1ZnR2RsNW9vTndMUTEvMVUrRFFHU1hROXI1RXZ5MXE5clpiUDFsR1FEWnNQcHpJOEFQSGdYZ29kN3FVeDExWXRCYkZ6QysvQytCTDdTQVd3aGdkb0xrT05TTHF5NW9Mb2dZZnQzWkkxRjdFQUMrcGhzQW5la29raFA0SEl6bWwvUHZ0aFFXbVBCOUxKN2p4a2NTcjE0aldqNC8wd0ZsZ0pENWVvRHc2ZmU0RHpBWVBIb2tXaEhKWjNURlNrbjRoN1lPU09Cd0V0aU1UdjFhWTB1a3RGWVRtSTIvNDNFTVFtQ3VBSm1VRTBnbVZEOEVGZFBwZG54aFZocXpEcjhGNE5NdFlNOUpmZzk4RVZUZU51OVEyT0ZaQlg3dnI5dnRnbS9sY2V6Y3paNjFaTk44REN2aWxZQ2RQWHFORFFwQWxmR1RLbTBNNkFBMFBUQXlvTVN4NjRjUmZQUUhYc25pT1RJK2ZFV0RGR3ArUWI5QmV5U1JCVjJrcGwwUXh4R0FsSERta0k1Nlg2eitFUDdVRFlTZFJnaC9Jb3V3SVozNmxIYWJCRTBHSjByMTBSZ2IveEEvdHQvai82YU1BZis3UjRDeHp1QlhXUkdVTHdCZklyWTZVTmZwdkxhZTduMEkrTE8vcmVvTE1xaVZNYlczOG9VaGtOa1FJelpPN3RJd2VHZVBjbVdsQUZUakFZSFBWR3dYeFdvTFlibEVEa0x1VFQ4TURQaFhMSjRqQUxwYUpCK2dnVTZ4ZmdKa25UN0lLWElRWGg0WTBGWkNvZyt3eGlVVHdTa1hVYlNNVjFyQi9BMzFPWFd1RnBQVWRhL21SSEtpMWU2VStoQTdacTdsK0ErVUFmRHRIZy9McnB0a1FwWjcyN2NSV09MOTU0MlBhM3JPdnVPcWFnVWx0Z3RtSk0wOGo0L1BJTGJJREt6Nnc1UEFIc2JyYVRuTUdkWldJd0l6eElmZUswcm41NzhKM0xBVnVIOENPRFJhaFYvRkZRLzFJdW1JdlhQMVF1ZE5meU5UOG9WcWNIdmlQY0JkNDhBMGcyUkR1b0RxSGRiMlNhbFpBZEc5ZG5mRGtBRTBnWG5INWlqV0NEYktDcTUvTVJpVjBRRDhIZ0hRNjNqRzBoZHNMR3hBM3g5QncxQXNsaTdoTzNCd0FwZ25nL0dqdnEwMUlIclhKN3EzQ3o3RSsrWXppRjJyczFaTForOEg5akpzU29FQ1dYajZpZ21SODdhTGdmYkdxNEd2YmdMdTJnanNId2RtQ0VJUFNJMWgrU2tDUmpwZlVDM2lOV2Nwb1JyY25yWWJ1R3NVT01CbzdRQkN4U1RHL2lneFZjQklWR1BXTTFoMUpZUVBueUtORXhHWk1ESUo5YjY2ZUVCR3hQRFkxWTVuditHQ2pmR0F4RCtERHBpYXdwaEFCV1pQandOek5MQUVJSDRYQ0gwTTcvNWM5M2JCZkk4WWsyY2dWQWR2ZFQxMGlmRGtCV0MvcjlsR0g1MU5oSXNuc1dIT2ZQbUVVS1Q5NFdlQUc4ZUFPOGFBZldQQXdWRUhJU05RbEtRVWdsSmpKRXhxQytINk5xOTNrT3BVZzlzemJ3THVIYTY2UXpGV2thRmllWHhpNmhnVkhPTUNZR1J1Sis1VjRqWUpJREtJOUtsc0F2RkRxOFFEcm5iOE5XVlBoOUV3ZEZrUTc5VGxTTUlzTjBNaTVzOU1vT0dubzRVNmYzWUF2ZWZMN1k3cnZkb0ZMeE9BTlNBOGY3eFNnV21kMGtDUWJtWjZtVExFbkowVXFXTGhVa3hsckJuNm4zd1d1R2tZdUd1a0NzdWZHcTJpb2puUkZwYWZzVTdNRHhFckp1WmhZQ3NKb3NIdFdUY0JlMW9lcStoeGlnSmdYQnJNbVRCUG5KS0xycitWRUQ1NGliSFl2Wm9zOHNPK0ROY3JIckRYOFlWVnlnbEFLdWQwTHRNakZQdE5NejZRTERZN1ZvbUxKZDY3MUFFSDRYdSszZzduV3EyOElTdlg1OC9oZ3VPQmc4dnRGUXZWL2hFenhmcU9ldnVUZnBqcmk4dkFXejhMM05ZQ2ZqQmM2WllIbUJjaXRuRmQwNnB4eWI4VzRnUGxnb25CcWZmVHRkVGc5cHlicWlWTkJzc3lVc2RVRDdlR085YW1uZjNzWHR4UWlwbDdXZy9zRDRBOEF3SEl5Wk1Za3k1MFRwL3hnTjJPTDh5MDUxcXcyaFh6d1JDRWRUMm5tY2sxUnhIRyt3NWplTzlORlFCcFI2bGRNSU1YbEZXZ1ZuZHFGMmRWRnNKenVPZ1J3TUVsQjZEY0k2cnpuZW1EMFJuYndRaVNSUzNnN1ordFZJbDdQQzlrYWhpWVptNklpenVMaWdsaVQvVm9Vb2crcDhQOWwzd0o3cUdFYW5CNzdrM1ZjenJvVVRvV0xDc0FCdWQ0eXBhTENVb3hmOWkvOXc5QURpSUNVTHJRUld1SUI2dzdudVpyd2Fad0xCR3dDbFNxU3l6M0FoSGJhUkdFRkdPbUM0NEQ3MlVWZ2pXMkMyWjRsSUY0QXJqb2RPRFFjcVVHcUF4ZmNwRzRtSlZ1VnFjTDV0YnMyei92ZVYwdFlLL25oVEFxZXNZTkhkTzVQQ0pab3MrV3V6eEhKSVZpdVhGeUp4dXBOTGc5NzZaSzJsaXpVS29kaWxHVWd6eUdob2tGOHl3NU1mK3FSa2pkamZ1RHR3a2ttN0RUa05hQmFRMm94MXEzZU1EOCtCNk8zSDZlbThLeDFDY3g5cHRXbDlpWUlVQUFXckkzSTNuSGdQZE90c081ZU91eFhYQmRqMFYxdk9ML3NvM0N4ZWY2MHRsU3BZd3ZlS2YwcEF1Nm9oZmRKOGs0Q1VxZ3ZyNWpWNlZHVEJLQUxlQ0FoK1ZiWkxUbmg1Z3U2RDQ0QTZIOGNWbGtOSzk1TzFXa0JyZm4zMVI1SFN5K0pDd1BwbEF4UmVnRS8yVCtBbG9HbmNObWJReW9nVVF4L0t3QjRnSGo4WVdOVHdSQU9XMEZJSUluZG9xTmtUQXh6L2JkMDlYREdMQmRNTTYvcExLaTV3aEFYNjBnQ0sydWp4ekVBcUdMMnBRMUppczVBSkVBRkh2VHVqWUFLalJmK1NFdWdtMWQyQ09RTFUvREF3UTQ0Y2FFdzhBdFp6U0lQZ0F2dUtrZHJXTU02TTd4Q01Cb2lCbjRZcENFMk5DZnhXQUE1TUV1d3ZDQ0VJQ3dsbmhBSFYrWU9SZkRzV0pHZ1BwTUt3ZzFiOVFwRm56SGJEMkJLMkpHdWw5czhLa1lXMTd2TEFMUVJUQ0JwelhacFM0Z3RDWFhNQWtkdXVBeThFN1BpalBXcHJYSjVDUjM4eWd3MWZKRG9oaDJCbFJBZ3EyT2VON3VUV2MxRDBBRk50bUw1NEVTQnNDYUpjTGtEYWp4ajVaWFJpQ0lHQTB3YUR3Z2p5OHNrNStIWStYOXBwVWJKU0NwNlRuRkNNWHdueTFXQUZROHJVQWMyd1VyUkw2bVhUQWVmV25GZm56M0ZwYmFnUUtMQXFBem9aakFLa2twWGtOTzVHQ0V2T01MRlhPbm5DNHhJS09qblFHTmRXU00rR3FIUUdkN0pTc3hVZitKelFMd2hUZFY0amUxblF2cjFNa1BHdGxmOXlQMkR5K2dBcVo2clF5dGZ2ZEhTRHhnTHdCRjhBbUFZakhXbHVFRGlLR01pcU9WdnRlalhUQk91UlNZSndESkFBUmdaQUdXTDlOaytJTTNTemdUeWRFNGVlYzFuWkhidERhTkFmMURwZC9TTXgyRU5ENmtEMG9YdEZoQlhtY1krT1k2QUZDaG5LbnpsN05mZE1SM3FDQWFlMkIrVlZNWVhBU3ZEczMvWC96SEpaY0I4NHZ1aXFBQkVvMFFQbmhud3FRTHlSVVJtWkJQeXRud0hkZTBNMXZOMmxSNnBpY29LVUxheEhESUVkSGtXMmlXZzQvN2I1emI3RFNRQVZkMC9ncmlWMkpZb2pmcHdSR0VZc0dCck9CbXgvT2dQNXNBS0FOa2NiRnpOV1RSblgvR1NHSW1NWUgvTFlsaytnR3ZkVCtiVytTV0grSWcxR3FMNVFlVHRSMkVZajVMVkhmancvWkR3TDh5SjZUQjdVVTNWVm9UalRZeFlESytJdnY3ZHpOQVpJeHBaU2lVOGpqS2dJV1RjeWtaa0Jhd0RCQm5RZE1yNVFlVEtJNWlXQ0IwOUFtRWI3K3Vjbk9RL2FUUFduNnd1enlTNHUrUjBPYjZDVUdxSnBJREE5N0FkcUlOYmdSZ0JKNjlDRzRKcDZxL2NralhxQi9SS2xhNFdwa08yT0RnSG95bmlnQTBKaUx3YU5pRXQ5NVlRS0o0RlJDKzdickt6Ukg5alpiTjZpSll1U0htOUk1aU9BT2hITkpmWmtoK2d4c0JLUGJMdTMrSmdhV0Rkb2poTU81a2tEV1NsTlRnNEI2TXB5SUFqZjNJZ2dKZ01ENE1DQVJqRk1VOVFDZ0F5a2hTS25VQ1lIQjlKQjB3eTVhVFJVeG11cDRoK1ExdUFtRHMraHBYZ0ZMbkI2VUxPTk9uNXhBQ05KcXhnaHNjM0lQeFZCR0FpUUc5YUxlaWxXVUpXMUZ2VlhFTjBUS3AxQzZBdDE5VE1TQ0JwejFkSHRUL0pIN045eWF4cDZRa0Y3M0tCeFlJcjEwbkFNcHJvQjQ0cVFHVGo2c2pVcnRPRlB0TGVGUUhMRVM5QWRERnJxMUU2TTEzTWF4VkNUTkFYTkZUaEl5bExjb3I0MHp4dGdEQVBLdVZ3RE1yT0t3K1NCVGJ0UjJNTkQ3c1p3QzdRdm00d3FIYTRUL3VJcmhiKzduMEVnYlFkVGlqb3lnK2FnV1hUOGxsRHNBRldyL0I4cVAxSzdiVDBwdnRWd0hoVzYrdDJDL204c3Z2Wmxhd2kyQ0tlMzduaEZ0YXBrRG5JTFJxQlFBK3YwNEFqTXluNzlFSWtYTy9Ebnp5Q0J3VndlWDR3eHM5QjRyUlpneVBWRnF5a2dEZCs1SlNwQlU1cjB2SHlIeitqc2MzdWIwS0FCc1pNQ3lRZ2VFeEt5RlBWSXozbG1jTTZPZlBBR0NBRFlQRTY3SmZzNmg3RzBvK3h2aTdveUs0Y0xaZk9ncHNYd0MyTHE5TXd1dVZFUm9uS240blNKcmNYblFLY003ZHdNTVhnWWNzVnhrU2ViSmd6T1dQcWRCMWFkMmYzZ3BzbndLMkxYV2VSOW0zZGFuVUlWMWxCU0NQQXJCd3RwKzdEVGh1QnRpNlVEV0RtV0EvRHZYazhMUnB0ZlB0TlVsaWhZWlRPUENpMDRHSDN3RnNud0dPVzZpQXM1bjNHZUpKK0tMb0UrOVZEQ2xROFI2dk9RSFllZ0RZd3VZM1M2SC9pSjhqYjExY2swcTlRaG9jOVFNV2dQQlpKd0ZicG9GTjg4REdSV0JpcVFJZ1d5SlkzbFBvemFHSjFLVEVQaDM2enBUa0pyY1hQUkU0NFM3ZytDbmcyRGxneXlLd2FjbGZGb0l3dkN3eDlabjNRMURtSVB4LzIvc1NhTXV1c3N6dmpmWHExWlJVRWxKa0tzQkVHUXlZaEpDQlNrVXFBVzF0c0JkcHV4RVZhQnpvd1hacWUxZzkwRzJMb3RqUWRtTWpLcXRCeFFFUmRBV1VBa1VsWk5CR2tRUk55SUFFTUFreHBGS3BxamZVRzN0OS8vbS9jLys3MzdualBxOXVWZXFjdGU2NmI3am5ubjMyL3M2Ly8vM3YvLysrVHowZG1EMEt6QzRETTZ2QUZwZC8wTDNHaDZ5VERnbnZMd0t6QVdER2lIL1RoY0MyT1dEckVyQjFwUmdRaXNJUWhBYStBRUQrSEVFWTZ1Tkx5clJuWkxTbDZ0U2JyZ0xPZUJRNDR5aXc4eml3ZmFWNFVHYmRlZ21BNVFNVExGbHFzZm43WGVjRFcrZUFtZVBBbHRYaVhua3VaU0JrUmNtNFVHWHRVMnVvM3hzQVpnejZ5NTRKek13RFd6a2dCT0FxTU1WQkNTQVVPYmg4UXVOL0NpVGdjV0F1eVdoTDFhbXZ2QmJZK1ZneGJXNDc3cGFhN2dJQnFDblVyYlVCaVF1aEFLRFVvdDEzSWJCbER0aXlCRXl2dE81VkR4dnZWZnhXL0prV05GckNlSzhOQUdzWTdCc3ZLUUM0aFFDa0pOYUt5MkxSSXNnNlNKM0lRU2Uxb25LS0MyQ3NPWU1lTiswRHRqME9iRHNHYkZzRVptV3A1Uzc0ZzJJcjJ1QTIyQlNjQUpHQStkSkZ3UFE4TUwwRVRBVUFrZ0RUUHE5emRLLytzTVdwUEYxOU54WXdBNGczUHRzSHhBRTRTUUM2RmRTZ21HV1JSSUpMWkpsbDhFR0tqSGlYMWp3YU4xMEh6RDRCYkQwR3pDNFdyc0tNVzJwTm9iWm9DdTZDTENEZkNUcXpnZzZzcit3RnBoYUFLUWZnWkhLdnBSU1lnN0hONVhDTDJBYkFad1ByWkdhajZpcHBYaGduMGtxbVUxd294bkhlZGc1QUFUdVdIaWcyRkUxdVZSd294b1grV2NiZzg5UzNBcUNLUE9OY0NpOG9QdFZQKzkrK0czaitvU0syeFJCRkRFbFV4YlRTKzNudmM0RnBEc2p4bGxYUW9KZzhGZ2RDUW9HSkpUVGljTGNRNnZQTDZ3Ymc5Y0RNNGNKdjI3b0F6RkE1a3k5L1VPU3ZtZzhvUDg2bjBkSUNCbjI1SndqQVJXRFNBVWdCSE42dmZkYnYxMEFiQVJoOFg5MXZETTJzcytOdkFFQ0tQVkxDc0hveVVnUnFybGJuUndCOTMzT0JjKzREWHJJQzBJRW1pTG5FNzVkaThIc3lBY2p6V1VWR1VpNnVJQ01wVnd3SlZNWGRlT2szWEF4YytIbmcrdlYyZXNBWXcrc1dvUDMxcjNlTGNMd1FCZVFVckVIaDRKbzJoNHZEbUpQdUF5TUxHQWVFbjd1cWJnQitJN0RsU1dCR0N3ZTMxR2I5YUwyMGtHRGIvRUdSeFk2V1R6OGYyd3RNOGw0cGdMMVNnTThlc0hDdnN1eWxNRTRubjljZlFMdGxkZzZUWjBrVUtvckFmaWoyM3ZBUENtcXAzZmNDbDYwWEZJTmlkMVBsWnJmNDEvZG5BcEI2d1NRanV0VWZJREpSOENHSVFPd1dFSDdEeXdwS3JXYzhDRnpxUkxIa1ZZckIyalMyRlFINXZrdUJ5Y1hDQWxJVVVBQWtDTTJpUkJBNitBUkNlN0RqWW1RZHVMWVRsZWlRL1hUVFM0RHBJKzZuTGhaVzJuelZDRUJhTUxkK3NvSUdxakQxYW1wZHVnaVlXQ3BlQktBOWJCSkM5QWN0QWs4TEVTMjZTcXNmdEluTFo0NGRRaWY0SWdkaHltNVdMclBEeXVZSC83SFRDTndEblBrbzhMWHJCY2NqUWFpb2U2QmlLYWQzK1FZL01HVEg2clMzT0J2Q25RRHVBSXlxaGlEa1E5UlgrMjl5RTNvbjhJd2p4UVBJOHprVGlBcEdVM29Wa0QvNGZHRGllQXVBZE13NU1GUWpFZ2cxRFlzVWt1K2EzdUkwVEdCZlY3UG90d0h3YU9FbWJIRUFUdnVESXV0bmk2VUFRb0ZSSUZSWWhmZS9kaEV3N3RiZTlPZjBTaTFnOEhrcndSY2V2RGFqejA3Z0lKN24wNXJZeVdJcGI0eWEvN3Z2OFBSZEZwai9MWERta1FMQW5BNGpDQ09sVEJSTi9yRk1BSktna2tWSHBHVWp5U1NCU0ZlZzcvYXpxazhFZ2JTRXE4VURSQUNMS0RYU3lhUTdCci8vRGNBNExTQ3R3bktoVEVrUWNtQUlRaHRNK1VhYWpsMHVTOU5hdElUWFd6cHpmY2ROQjREcFkrNm5CZ0RhQ3RhbllMTjZmQ2o0dTFheTBRSXF0TUwvRVlDNjF3U0E5dEFKZVA2ZVdzQW9EeXNGcGcxZUIwSElRUkNJSWtWZUNxUWYvMDVQM1dDQitVUEErQ1BBenZtQ2FGV0RLRXVZY2wxeU1OK1kyZGNrcUdUZUhQRXZ2V0RTTmhPQWZiZWZYMEE2clM4Q1V3OFg5MDY2YkZJZmRxTUhKSUQrK0RKZ0xBQ1F1bXljM2d5QUVZUlJLRkNMRDFldTVPRExGNlF2WGVkeDB3M0ExQnd3eGRBSkxUWGpkOHNlUW5Hclo5YlBGeEx5QTdXSUtPTjYzdFl0Q1FCTi9zdjlRUG02QmtMcDB2bDl0L202aWV0UjZmYnlCQTRnblh0T1J3UlJwTm5UdFBwVzZnV0xIODNsS3FjT0ZURW5EaUt0b0h3eThSTkZocmVmeWV6dGJuckJmYldmZ3R0c1Ara0l5TzMyRUxEMWNISHZJbnJsdldzNlRzbkI3cUFVbGcvc3VGdEFXa0U1NXpZUTBRcHFjQUxvTkNYVEV0N0EzS29hRHdHUWZxb0FPRVVCYTdmVWJLY3RsdHdDYWpWYnh2U2l5dm9hc00wQmFCS3d3ZEtiOWZON05mY3FCV0dpU1d5a1dYRVIwdW1lYWNVRW9uUWdDS1JmSWdERmp5YTV5cThXZnNmczhkWWdpdU14Z3BBZy92bk16dTZtRjB6NlpqNUFQZHZQUWVjMFRFb3NudlFvc0dPaGFMdUlZdm53RVlTaXRoRTUyRjFYRkFBMHA1eWlnRDRvdENxeWdGS25wSFVwTFlQME9jS1VSWXY2TWo0TU5SNDMzUWhNMGdMNlFvbmdhd09nKzZybDlDc3dLb1NrRUl4UHlUc3VBUGlnQ1lCbUFYVmZZY1ZmK24wU1JZdzZkUDFZd05nSHNnU2FqaUpQNDI5UnJwV09NNmN4RGlKQjZOSU5NNHc3TGJVR01RVXdCL005bVozZFN5K1lWRzBFb0JpREJTVDVkZForUGtDc0FpSWxRWkRhM0xWYXRKMFdYRzJQYkw5OEFCKzRvbUIzb1AvSGdUVWhtR2dCZlJxV2YyVFRyVVNqRXhEU1AvcVd6UURnZkFGQVd5elI4cmtGdERBS1g3NWpvNm5VZ3VaeFo4TkJ5SGJ2dnFCUTM2VDFzd2NzQmFCQUdHUmc0MElyK3J0OVdVRGhRNVpBVTdFczJlOUxMemdscUhSeE5rYmV1VytvUVJSbHM1amFNam5LMGE5ZWNOZjJSNExBd084MjlrUUIzTFR0RVlRUFV3elFBV2dXMEFHbzhBUUgwbGpwL1YxN3BtMEtSY0VpZkd1Tk9ub2NPMXJBQ1FiS1BYaHM4VHROd1ZyNXVoK242WmYzd0RndTI5ZzJGZE10T2M4QjZQZHBGajA4WkZycGx3K1pBNUZUdkFRUTAvQlQzNkZQRGtScUJUOUphZzd4WWxRSXRZMGY4OGo3OHNaekNjS1BabHJBUWZTQ0s5dXZCNGg1NzdTQ290VWlFSjhvcHE4SVFGbC9QVUJQRW9CTHhiUkU2MkxTcUc0ZEZCOHI1YkhjT3RpT1FTcVQ1VDdSS3pZRGdKeCtCVUNDVHhaUUN3aGFRYzlvS2NFbkVCS2tuajVGc0oxTEFQbzl4b1dXUFdEeSs2SUlvcWJlYU8wVkErekhCMHp4SVFES2tuMUdndFhpUnhNSUF4MFZuMERiK2xrdUZqTFJDdDVXRXdENzFRdnUySDVPZmVrRDVGYWNpUWF5L0dJYkZnQlhyaXdBeUdtSkFEUjFjazNEd1RFM1RRNEIwTGV0ekJKRXJUWUFyMkJCU0kzSFRTOHRMS0JaUG8vZldRRFpwMTk3WjNzY2pHYjVCRHAvTDMrbmpNd2VCNkI4M0dqOXdqM2F0T3NQV2luOVdnWENGbFZPLzNjdGY0aUQ4WGtCa0g1VVNsQVpsTlBaQVFxQVJyNXZ4dTF5am1IMGdpdmJYMFVRS0k2M28wV3VuL3hIdVI4RTRWblBLNUpRTGQ0Vk50dFRCdksydW9pS09VZi9mK0dqd01OQmgwTk1WNkowYzBOcGNSdjdtcll2M2toOC91SHhZcCtiVnB3THAzUjdzdHMyWXpvdVNxM0tHYStxNyt4N0NvNG5hekFlclJLc1ZsVjFRaXRGNTlkeXlGWmFZWTBITXU5bVdMM2d0dlpYTWJ5bUJJRk1aMW92MmgwQitMVExpc3hnVytFcTV1VTkyaVo3MnVkOXZ2Uis0SkZwNE5qa1JoMk9OaTBPQjEvVUJDa3ZFWVJoZnVOczRPbWhoaVBLbkZRbHg2YUFqTW5TWEpVQUFDQUFTVVJCVlBqbXoxdzQxbm53TzRjQ0lCdkJ3WmdUQU9VSFJxM2d5REV4RDR6UkdWWUVucG01THFtUWMwTTVlc0Z0N2FjRmwwU2xIaUJ4dVRrWXh4ZGFpaFVDNFFWWEZ1NUZDVUQ1UXRKbDg1c2pHQTB6aVF4cWV1L2ZlbStodzBGMmZMTFFHeEZsWU1Sdm83djFXbUlWdHB0MURGa1h2T1I3THdKMkhTa3lvWm1FeXBvVlZlOHA3YjZxRU1uaWRHRy9WbC9MMmFQT0l3dUExcEFJUUUzREFtRmE0ajlmN0NQYUZwQ0hLdWpyNXh6WmVzR2RIcUFxS3o1WCtGTFJBbDU4bGUranVpK2tUQkFMTWNnWjczQ0RCa3BOMi83K2JmY1dPaHdVeUNFQWpRVGNBVmhLZGprUGMyUmFqZXdLeXUvbjEvL3FKY0EydWhCTVJHWFFPY245VTZKSU9qWEhRcVNZT3NWb1FwMUhOZ0F2ejh5bnk4MEg1UFZ6OUg2UnFWZDg0OVd0WFEvekEwT3cyYXlHTEo0NzRMMEc3OXZ2YnVsd2tKaThCR0NnNFMwMVNLcW9mb052U0lDKzV6a2hGVXVwVjhyVVRwSk4wNktwYUJrRlFtNU0xSGxrQTNBeU01L3U5WmwzOHpyazZmMGlVNi80aG1zY2dLNUlTVXRDVG93eURxYjdVeHdzcUZKVzNmby92YnVJQkpFWjFZUmd5SHdRS05pMEtFbDFPS1RDWkpkeHRQRG4vL3Y4b29hRGFWZ3FGeWlURDJJS2ZjalpTNEZvKzdnK0hYT1B2ODRqRzRESXpLZkx6UWY4S1ZmSS9GTktyUTZoOTR0Znordk9BOWNHQUFicnB5bFkyU0RsVlRUdCt1Q25WMy9WM2E3RFFRQXlzSkF3b2JaSmdVWGk3OFFheWhkODEyV2VpT0FaekV5VWlBa0hNZXU1QkY1RndaUUFXTFB3a25rTFF5OUNyUE15OCtsSUhaRnp2TjNUK1liVis4WDdjNjRPSEhpeDc0VjZ6SXhCK1JKMHdRK1VVOTkydFlvRnkzZmNYY1REeFFrb1BzQ1VoRkljektWQ2VnU2c1QjhBL1BJTE45Wnd4QlN4dGlLaVVBT2k3SlcwZExUdXN0RjhBR2JtMC8xbzN2ampuU0dkaitsWWxHd2RSTzhYTitjMXdBQklvSGs2azYxeXVTQ0pJVHEzakRZOVZ4MEJxSysrdXdBZlg2SmtJL2hNRTBTQzFFR2d1aVEraXNxY1FSTHJGNi8wak8ydys2Rk1uWmh5WllzUTFXNTBxT0hnUFgxTlhuZHRPRHNmZ013SHpNaW4rMCtaTjBTOVlPbGxNeldmTHdLUVNTMzk2UDNpWTNrTk9MRFBNMXkwNjVINGdPVzNwNHVURGtCOHpXZGI3RmdiZERoRWdKa0NVRFJ2b2dUbWQvdlB2M0JWQVVCdXZ5bE56QUFZaTRoaXNWUW5FSG9JcVdibHJ4cW00TXg4dWpmbGpUK1lqc1dCWWdJT2Mwb0pQc3Exc2xDcEg3MWZLeWJKT0VvQXV1VlRSU0NuWWxtVTZQL1o0aVNKRWNiTHYrWXU5LzFFQWg3SktFWERLeHE0Q2hVaUt5bVJid2pnSGRjVVdUQVJnTFlYSFNyMkxPVStCVjdNVnd6eHdPZmtPV3liWUFHWkQ1aVJUMGVkanB4RDZWaGNPUTZqOTR0UDUxd2RPSEJkTWVYYTlPcVdSY21XWEExWExVSVVINnp5Q3dsQXMzeitZQmtmczF1K1ZJZWpKRUYzY2tyakk5VDB5L2FNQTIrL3RnQWcwOFZVUktUOHZiS01VZ0FNSUd6ekFjT2k1SGtuSFFBejgrbCtNVy84MjlLeGh0SDd0VHoraklNQUpQQ1lNVUxBV2Q2ZnZpK0VZOW91b1pCTS9LeC80TFVCZ0ZMZ05DNW8xNkZyRThKSlZKZ2tpRmhhUVFCdjMrZFZiTXJXVnNDOFV4RlJramphVnNXMkR0UmRPSi92QXlvaFZZSzdBK2JUdlRkajhIbHFUTWNhUnUvWHhIa3pqZ05rSU9XdURyOGpuWVlES0R1dGdwVWhyYTB1QWxBeUNDVUFLOEJYY2pCWGdMQ2svaDBEL2hjQnlEeEZBZEF6b0ZVcVVCWVJKVFVjTVdkUFA3T05MNmk1YkxRZUFMSlJRK2JUL1c3RzRBdUFPWHEvbHNHZGNSZ0FZK2dsTGtZY2xKVlRzYTZwdENYM3VRakFLSU5Rc3RGckFaS0l3V3hRSWhJSnVvdkIvTngrcjJMekZDd2xqOFkwZXZsL01ZazBraWVWdGN2cndHVW5IUUNWampWa1BsM21JdFFzSVB1RWx4OUc3OWRPekRnTWdHa0FXbE55QkpuOHhLcHJCUkMremdFbzRMV1JnY2RWY09DampsTnZteDg0RHJ6TkFhaGFGWldMeWdLV3hVTmliSWhUY1BEOUJNTExhNjVienJlQU1TR1ZvWHZKL0NnaDFXVWZPK1hUWlM1Q0RZRHM5R0gxZm5PcklEY0FrQUJUVERDQ0xZSzBDd2kvNTg2V2NLSlVpRXBDOENDQllEc2lpU3BscVVJVW1PamYrbzJ0SWlLVlVKYmdVNXVTV2w0RFd3WDQrUGNYbnJRQVRCTlMrOHlueTF5RW9wZGNheSs5MzB5NVloZ0FnKzluMk9vVWVJNVRkUWVyKzMyZmRobUdvT0JaYW5CbytnMXlFS1U0ZFlnRlN2cUIvL3ZaQklCdDlSc2hrVGJXOFpaWjJoVWd2REwzaVUzdXV4NExTQk0wWkQ3ZFBSblRIMDhWQUlmVisyWEFPdWNRQU11VmNLZkZTRC8rSUFBQnNFb0d3WUFvSFpJS0VFWXhSSUh3TFM4cFV1aGpGVnM2L1paaElWV3l4VktCQklSWG5iUUFUQk5TKzh5bkk0dEJ6a0VBQ3YrY2hsVVZJS0UvNWNSR3NXbWxLZkl6dWRjM0FQTFFTbGczRTJPQ3lWUmMxa3BVM0RnQm1Lb1FzV3RsQmNzd2pQdStuZlRZdEJMK0dRZGdPZjE2R0NaVzZwWGxCQ3FXU2dxSnlwb09BRmZYWERpZmJ3RkpMdmk1SEFqbG5Vc2lJZTZBak9wNGlRTlFIUmxUMlBsZ0pDVWJiYzJzK3YvaEZ3RmIvcTdnbTZIbFlwQmJtVFYyc3NjUXl5L3FGQmoydjAvY0Fkei9IR0Q3TkRBMUFVeU9PVSsxQ3dXT2V3TmpLajYvTzAzRjEvV3V1Z1c0L1hKZ2ZCb1ltd0RHZEg3SXhCNWtMUElCK0k4QWZOd1pnZ2E1Y2syZkpiRW04Vjl6TldQZnJhc2JnTXVQQWN1c2VKOEV4c2I5RmRCaEErN2dhUU5LQjZUZmNnQ1l1ZytZSlQrZzg5YW9CRE1tSU1TY1AxMnVUS2oxM3VEdjh6c0tpZy91SjF1UU9zbm9qbTNxQjVQNUFDUkJIM09oUHV6elJOOURWODhIcVFMRVdQSm52VHk1bm0vdC8xczRCY3VTcFJadEdBdTRmaSt3dEJWWUV5Y2NyWXduNmhGOC9Ga0pwOWJLeEFLVkZzbi9kOHVyZ2JIUEE5TlBPRU9XbDQrMmNmb0ZIaGZWckpUWlBLSFNqNWRhT3R1cDZKeUNwUHg4ckhXUlZRN1dPbHJZQ014OEFISXpseGtBTFBEOWMwVkIreC9BM0UvK0UyZlVZSFhkRjdLVEd3ZHZUZDBBSFA5cjRQZ1dZRzBLV0JkZnNCZHNNUGZQcktLc29MOVhBVkxBdk8yZkZ5bENFNGNLbGl5ckRWWk5jR1MxQ3FFWWhXRmlBWlYrWG50YVVSZFRMbXBDRWJwY2hUWUxxaTZOcmtNQ3pMenQ1WGM0SHd5Sm1ta0orWjczalFPaDROV2VEVVppSzFLMDhmMEVYdDdDTUhWYXdJazdnYVZwWUpVQTlMSTFBbzhiektYMWN5dG9GdEZmcGRDSVd6N3JnekhndGg4dTBvUEdEd0VUYzhDRU15U1V6RmFpa2d0bHBXMVRhOEpxTmJhN2xWbGpTUmdXK1E2WlAvNTdXUXZqNmZ5ZEJqWGZBaktiZ0V2TUx3V0N2aE5vaXBnTnBuUXNobFM0SUdGV3pJazZ5bFd3QXo5M0VUTHhHV0I1Q2xpZExBQm9JT1M3cG1HZkcrMzNZQUc1bU5EMEc4RjQ2Nzh2a2lQSmN6Tk9BQzRVeVFtMk44dzk0a2lyRmxmSUFsN2k0MDJkNmRiUFdXQXRyc2pPRml1Q3ZBSlpPUUUwcEhURnNja0hZRGVDdmhOZ2lwUU54b0F6OC84SVByNW5idkgyamQrNkFUaEpBRTRBcXdUZFpLRUJMRG9EZ1U0K1lWa1BISUJvUHdhcmVPdC9Ca0RleHNNRkFGbmJ6TkpZbTBJRG5Wd2J0NHV5dXIxa3dMN1RwK2laTS8wOFdUOVJjN0RIVW11WVRyL3grNm80b3Z2dTlmakJiZ1I5SnlBK29td3d4dlpJNVVMZzZaVzd5OUZQZjlRTndLbS9DZ0NjS0FCb3ZoOEJ5VnkvVUN0SnEyZitYMXlZSlBHVTI3bElaTGJ1RVdEc1dCSGVzWmVEejRpVVJMVVdhMVRFNDdMcUsxMmZabWQzT1hpZEZjdHFtOTJLYXRWczFqQUVzTnY2c2R5bWFhMmc4K3hVTDRJK1BuMmJlQ2diTEdXSEkvaDhHM29UcjQ1aUs4NlBPbGJCVTl5S0kvQWNmTFIrb3VRd0g5QmZtbWJMbFRIYm9PblovVDkrNXZhZjhGVWFBVGhYc0ZPUTQ1bVVjZ1pDV1RBeGUwVVErdXJZTU8xLzM3R3R4UW1vTENCdFJTcDMwTHJEcDJTRmR6WU1nay9SK1ZOd3Z3Ujltd1FEc2FzcEdTZkpnWURZTlRicDhwc0NRRkp4RUlCa1FqRHJ4dDhkWENVSVkrQ09INU1WRlBpOFNPbjJuL1FZTFo5R3AwY3hBTklQNUl2QWt6Vnp4aXZSeWRuS056QmE4ZmRkTTg0YjZBRnlBcmlNRjJwYWprOWtZSWVvQ2xYbUEzQVFncjVOUUVITUJxTVZGTU5hSU9heU5STC92aGxIM1Jad21oYlFRVWNBYXNyVlZHejRFdGpDdS8zZGZiL0lEM1BiVDd1S0FaL01oY0lDMHZxUlRvNFcwSUJJRUFtRXRGd0NZcWpXMDNiY21kd0JZZW9XZ2V0VWJyUjhzbnJsb2lSMmRycEFDZityRDREOUV2VFZqSUp1N0hCVis3ODFYNzUyQ3pqOWx3VVprVEVnY1BvTlBwNU52NG9CUmhDRzZkZCsxRGtNejFKSWhSMUJBSEo3endxTzNmSVJSTTV0bURLNUNvUUtzU2dPZUJZQktGWlVMVHFjQjlyNk5pNUtZbWQzV0tEVUEwQmxoTkxNOEViVDFRQlhCVTcyYUk1WmpVY1ZPeHo3V0xrUThkMzd2c2FydC91QTZSY1BzeE5TQXRBWEhEWU5DMUFFcGY5czAxa0t3dUJ3R1U3SGdWdC8xanREMWU2MGZnUWlnU2UvajViUXArS1lwR0IrSDYyalQ3UDgvWnlwQklDOERoY3g4ZVk5d0YwMTVhYmhtbm9BeUo1V1NyS2VOZ0tPOVNIeG5UL0xTYXNKQmltNWxSaldCRUlWZVJPSW5LTDFxdW55YlJhd0xnQVNkRXk3NHFqYU5OekpDZ3FFRVl6Qkd2SzAyOTdtQUZTSEVJQjZlYktEZ2M4SjFrc21WOHQyOWYxZW42TDV2NmN4SUs1aUs2WG5lLzVqQ1RpRmNUcVZuL3IvdFdEUFd3WG5FUFRWZ0lLVUhVN2xqQVNhd0tlZkl3RHBNZFJ4UkIrd0ZnRCtSUkVESkFCcHdTenoyYzBMZnhjelZqa1ZLd2FZZ3RCQmV6dTNTdlgwOGQzOVA1dU8zUUthaFhNUWNpb3VyWlJBR0taV2FyL1laMXhYUlBlOHdRcjJBVUs3VHZiT1ZUWkJYeDRNQkVDUm5Db25VQlNGRVhUNm1mL1RLKy9xbXpBRi8wVUJPUHFCWllGNTJIclRGQ3cyTEg1RzhVQ3pKRWtvNW5acW1SblBoL3VDWG1wblZwRFRzSVBQd0tBcE9hU0EyUUxETFNIZjk3aVB4MHRwSVNMZno3Ymw0aUZmc1VzbmorSFpXRWVPWURDRG5EbUN2WmtFZ2VkY0NqeEdzZUloQll0M3Z4MDQ5SHdNTFJoOGdBOWdoMk1vSDlBQnFLSnp4ZjBNY083WGxTQVU0SHpoWVlGcSs1RDdod0J1Lzk4T1FMbElCQ0tuVzM5U2xYTlkrbnFlaXEyZGtRZytnbkdQYjkvWnBUMGxxNk1WNUQ5NmdMQ3dnRG1Dd2JkbkN2Wm1DZ1kvZHh5NDd4eGc1U1d1VWppZ1lQSEZid0ErZnlHd2ZyMnJYck12UEIrdnAzTDNHSENnaTlKT0hRQ2tSVlBwcGVVQmlnWExGeW15ZWpZVEI0WXNnZkEyMG9mUkFsWUIwRmZBbHZRcVAwL1RzWDVQTE9CNUROdTQ3MWNtSXdpQmFSd3cvRjAxSittejJwcUNoeFVNWnZwSmxtQnYzaVRvY3NXNGR6ZXdmaGtHRml4KzJmZWJYREFlSk8vWUVJTEJCN3BVMWc4TFFGbzk4UUFTVkdZTlE2RFpmRUczZm5FcXJnTGhiZi9IVjE1YW5ia0ZOQ3ZvaFdTbDlYUFEyWFRNLzJzM0k0RHdQSVp3QkVEZmdpdEgwRWs2TjZ4K3UvaUQ3VDRnL1lkQkJZUHBXSEVhSGxxd053K0FRYTRZajU0SnJKTythUURCNHB0K29DQXlZdk9QRUlRRENnWWZlRi85VTNBYkFNWDdJdEFsVnRBc3BLWmR6NVNPbHZBMnBzdHhqRVMzd0orOTJOZ0FHSzJnd2k3OFFvVmZFaEJlUUFDcU5OUDFSZG9BMThrS2RnRGh4a1VJL3pLSVlEQ25xeXpCM2p3QUpuTEZPRUlXN1FFRWkxLzFZMjF5d1ZnbENBY1FERDUvRWZqN000Q1ZyWjVBS2xraHhlUVVheEJJNG52Rnp4ZjhJZkNWQzRIVjdjQzZaRVg1bmVuM1ZYMXZBR0xacTh5c3J2SFkrUUJ3YkdmSTJFNkpwTHZkWCtrc3RocFV2UXJtWC9zVkRHWlZVSlpnYjE3dkpITEZlR1FjbUNkVmI1K0N4ZC81eGpaNlF6ek1MT1FCQklPZlRWMlBzNEhGSFE3Q0xRVVFtVXJWMHJnS0pNc0Nqc3hHQXFUbi9oencwRVhBNHRuQXlnNWdiVFlCb3JLa1V5TG5rQjlZVmhUeHUra1QxM2ljY3d0d2RCZXdQQXVzK2IyYXI5eEpBYWZxZmdNUU80ZGgrSjkrQkhlNWdxWlpaellvazFKSlVjcGFSNmJwOTNQK1cvTjZwMEt1R0llbWdFV0tnUFFoV1B4ZFA3TkJMaGlIS1lIVXAyRHdwWjhyTE9EOHRtSlFWcGxPTHhBcW1iUktDNkVEWUM3L0NlQ1JQY0N4M2NEU3JzSVNyczA0Q1BtOUFyWms1NVV2S0FzcFlMcVBhUGRSNC9IMGc4RFJIY0R5VnIvWDZWYWJMSGsyUGhqcFBWWlk3ZDV4d0Y2Q3dTOXkvNExiYlZ5UXNFS0l1ZkdpS2UwcDJKdlhPeDNraW5GMEdqaE9RWStvTlJ0bGpqaTlUUVBmL2ZPVjlJWlk0R3E0RDhIZ3kvNFcrT28yWUc1YlVVeTA0dlVjTENxU0pWUldzekpiTmd4U21NYXUrcS9BbzJjQlI4OEVqdE9xYmdOV1dhVGtJRnozWWlXckY0bkFqdE4wbkJackpuVSsvOFBBM0N4d2ZNWUI2TFVyYTNvZ2xMMHRwczZ3bFZoYTVyTGlxZDlBZERmQjRKZTZVMHMvMEJYVERZaDgwU3IyRk96TkEyQVh1V0lzekFCTDFKYUtXcTFSK253R2VNMTdPc29GWTVYVFZ3L0I0Q3YrRGpnMEM4eHZMWXFKQ0VDemdzeG1abHE5VDhlMFhHVXlhVWl6YXZQdHhvRnIvenZ3MkJuQTBaM0E4ZTJGVlYzeDZjNHNxd09iY2tleWhpWEFvd1VTQURoRDFYaGNlRE13eDM3bHZVNFh4Vk4ybjNySklvY3lna3IvVmJzN2ZlK0VkQkxjZmFYWFEzSVBXSXJwQkI2WGxud3BSNzZqWUc5ZTcvU1FLemFyeE03cUpGajhtZzhVYXJNVjlJWjRndk5ERDhIZ0t4OEhEczhBOHpNRkFGblBZUVBEbDBDbzJnNGZwRFpMcUtDeFQwLzdmaEo0ZkNkd2JGdmhSaXdSZ0pydUNPd1VnQ3BlQ3ZValptRUZ4aGZrOVc5NjlrVy9COHh2S1FxblZnZytCNkNCME1zSTdQNzBBSGdtZDJuMU5RMHJ2N0Z2QUxJbFZZSzczTW5RQ0RMVGhTR1pvRHB1UDd1Q2V1WDVuOHpyb0I1eXhUaEduUTBDZ3lCTXhZNjNBcS81YUJIRzZFQnZpRGxPTFYwRWcxKzBBQnlaTGdibCtIUnhuWlhKb3FxdHRBNE9Eb3ZsSlpWdVNqVFFGdHErTndOUGJITUF6cmFtZFZwVnM2d0VvUHRkTmczN3dKZnZzWWlKUDlORnF2SFkrN3ZBd2pTd3hBZU54Vk84VDZhTlZSUlJsVDZoSHJKME92YXcwV0RKQ0tuZzdnODZBUHZOQjl3ZzJKdlhPMzNJRldPQmduOEVJZjJuUkxENHRiZTErQVU3eUFXYlplc2tHSHdWZGQybWdBVUNjTktuSmdMUXJaL1Y5L0pubjVKVVltbkFFM2hDbXYzK3Q4QVdRZlN6eVBLL1BPT2dKZ0Rkc2dxQTVuZkpBdkxkTFYrYnowa0s0UnFQWjN3UVdKeHlBUHFEVmhaUXlRcjdneWFYSTlheFdDRlZBR0x2UlVoVjQ2UGdMblVXQnMwSGJCUHN6ZXVkUHVXS3NUUlpBSkRUbzhsOHVpLzQyanVMNXZlUUM3WnBzRW93K09yWlFscVZWdUg0RkxBOFdWeURBT1RBbUhVUUNBV1FrT2xzUUF3RHQvOS9BRThTZ1BRcE5hMDcrQWhBQTZITFhiYjVYcjRJYUFNZnYvZUd2UDVOenlZQTdVR2pCV1RXamg0MHY5ZlN5c2NITHRheGhKV3hGVnNOTkFYSDFraHc5ODMrRFlQbUE1YUN2WGtkTklCY2NlbWZjZW9vQWZoQUFjQSs2QTJ4THVBR3VjeHJ6Z0tPTWV4RGZWOU93YlMyQkIvQkVvcUxTckJvWUdnSjNFOHFMY0lFc1AvbmdDUHVVeTdTMTNMM3diNlBVNTYvbS9YajRQczBUS0NYUUE2QVh1TmVaWTNITXo1UUFOQWVORDFrd2NLWGxqNndPWlErYjdSK1BpMFBEMERlRkFmazU5MENLZzhxbmNmb0Z6SVJWV1ZxZkZmQmhnbjI1dlhPQUhMRldDRGJ2UHN0QnNKWjRMVVB0K2pkZXNnRmcrcVZwdFdxMTFiZzJndGdmdUxpUkFBZ1FlZytvRW1zT3Vqc1hiNVNzQW9DSU4vM3Z4MDRPbE5NNll2MHRkeDFNS3ZLNy9URmpWbWVDRDRIUVFRaGYxNTllVjcvcG1jL2t3Q2NLQUJvZVl2UjBvZXB0N1NFb1pRMFRyMWxQdVBRRmxBdE8wbnlBY1docHp3L0ZTakZ6R2pMeCtSR3Z4em9TZUMxaHdzQTlrbHZhRk41RkF5KzltSmduaGFRMHFxYWdnbEFEbzRjOUFoQ0RwSlBsNVpvbW1RODczOEhjR3c2QUpCVzFWZWNadjBjZVB3T1kwL3dsMWxBRC9XVUN4MG1NbERMcjhiam1iK0R3cDN4NG5rRFliRDB0aElPNWFOdGZtRGkveEdFZVJhd3hoczdWYi9xMmh1QUJRSndBbGh5eTJjQzB4b2dnakFBVUNXV0Fra3NPaUlZOTc4VG1PT3FlcXF3cUF4M1dHaEhLMDZuN1REd09jQVYvaWlwUEFLandnclptMm84bmtVQTBnS21BSFRycCtvOU1UckVZdnE0NG85cFpJT3RnbXU4bWFmQ1Y3MllBS1QvUndBeTVPUE91VmxBQWs5T3VsZTZ4UVJUV1VLbFd0a1UvSXZBSEFIdGk1b0l3REs4NDFaUEZ0Q21kcjBVOFBhQzloVnVsdGQ0Q0lDOFAyWnR0L201L3FDMTFUSlhsSkRHR3BmR0FtWU9EZ0ZvQ3hBQ2tMcHVXaDNLQ2dxRThnTlZaSzRLdHhnakpBQi8yWDFLcmFvMXJmTjdDV1pmM0xTQlQ0dUFFSXlXQlZwaXBMN0dnd0EwQVcyNUdiR0VOQlRSeDNybTFNMnczOW1tckZWd2pUZDFLbitWQVpBTEVFNUx0SUR5TVdVQnZiTE5MR0hnZDVIL1YwN0JEcDdyM3VVK0phZGduM3B0eGVrQTVNQnJpMC9XcDR3ekJqRGJDbmtNV01xVnBFOEdKd0xRcXZmYzBwcWJrVmo1YU5rN2diQ3hnSm5vMzBjQWpudG93dFhOYVoxc3V2U0tOaHNZVGNWS213OUY1eEdFKzk0ZGZFb1ArSlloRC84T0M4ZUlQVXNVSG9rVlZLQjc4WHN6YnpBRjRQdmQvL1BDS1ZHSXBPQXI3OG1uNERaT204WUMxamNvK3c2RUZURERQSnFlQ0VCWkJhNUdmZlZiaG1ROER0Wlc1VFlPdlBoWGlwMEdUdXUyMmxUTUxTdythQVZsOVFoRVdqdXJJL2FRaUxKa1RNTHNYOVIzci95bVo3M2ZwMSszN09VOWh1blhTa2RsN1QzUXJoS0N0bENNNTlrMmk1Q01NU0lBR2RxeEVJd3JtcHR6VHNDRXV0NXlpbEtvSkxBY3hDcTNmZTh0TENEQkZ3Tyt0S2p5dXhTQ01kWUVYb2VEckhjSHZ1MHRUd0x6bXdIQTROL0doNnpOQ3FxZU9TeEMybGI4dFFTaU13YnVxWElxQWNqRmgySmpCS0dKeVNoUUc2eWdWYmZKZWdVTFdCWWNNUjNydmI2b0NSYVF3RlBnbDFNNXJSNy9KdEJaT0laV3gvMCtzNFFlWTV6LzEvWDJ0Rm5BeFBwRkVMYVZrZExOOE1XR1ZyNHBDQnNmTUhOOGJtVEtmQ2paME5jcDQ1Ni94NTh6THpmdzZRZjNBQmQ4cFVnRVltcWs1Ykd5ZWswNklRbDFia1hTY25sTi91OEwyNEdkeDFxVnE5MUtRdnJwZ3dhQUF3OXArd25YUHcxWWp5V01HdERvMkFTT0ZHTVU3U0lFVXpkWUQzNHZNUG1Yd0xiSGdka0ZZQXRsR2lpbTZEcHhKdHZxOUx0bFZyL2FXS0VCOHBVWEFPT1BBRlB6d0JUWjlyMDR2ZFE5VHM0cEFaM2NkK3lIeGdmTUFPSCt2Y0E2OS85VXhpam16L0FlcllwZGFyMWxOU01ZelYrdldZLzM0SThEWTU4R3BoOEJwbzhBMDR2QUZFRklrbklIb2hHVlI2MlFoRlJTWWpRRTZxRnJpMnozaWFQQWhITk5seEt3QXJJMFExSUF4d2ZSZWFjYkM1Z0JQcDY2LzVJQ2dMS0N0cW5zcktLbHJGWlVGUEtPcjdvc01UdGRzeHpxUVJaOTNRMU1QQVJNUGxsb2hVeFJxa0VLNmdTaE9QMFMrZFkyaGxSdjk5eStvdlJpN0lpVG5UdkxxbWc2eERQWXBxQVVnUmdzb1I3TXhnSm1nSEQvYzRFMUZYdTdGUlJidkVnZDdldlhXbGJQcHA5RWdVamlKcHdlNnp3T01sdnBBV0NNVnVzSllQSVlNT2xTRFpScG9HaU54S3piZElRbFhPTk1XSmJHdHc0c3ZkZ3ozRWw0N256VFJ2UHJyS3B0QUpUNlpyemZpbnR2QUpneDR2c3ZkUXZJWEs1VllGM3NVWnhtSlV2Z0ExRk92d0Y4c3BLeUJ0TTF5NkVlcEk0THFWTWVkYkVhVHAwRUlLZFBLaDVGcVlZcVN4Z28yamdGcjEzajZYWEhuT2lTWk9lQlZTdnlDOHFDMnIwNUZWdlZ3OWNBTUFPQTE3OEFXUE1wMkxKYWFla2lDUFhFeHdIdzY2MG4xb0IvbmlHUWF6d09ra1NlcGJKLzcySTF4NENKK2NKNmxZSTFyaWNjclZpY1V1VlNtSVc4MnBrd25ISFZPS2JGc09velFHa0Zrd2V3bkJFUzM3QUJZTWFBWDM5WkFVQ0NiODJuSWxvKzQwcDJnTm52c29LdW54SDF4R3dBL0xPemRRT1FKUEl1SHpWMkdCZzdDb3c3QUkwbDMzWGZqT3N2Nm9Wb2RlczZJU2JCc0FaTVgra0p4VTU2S1k3cGttRlZoT2NpdXZUelN0MDV2MCtyeXVULzlnRHJaTmU0d1BNc0k3VkpQM0djUDdnVU9PZHZnTDFyUllKMFpJNUlWM2hWNC93ckdZUFBVMy9BaVJoWXVzeTJLN21VOTk5UCt6OTBPYkQ3THVCWkswWGRrZXE5TlNYMitvNEhMd2ZXbG9wRkNDMGZnY2lCTXRBRkM4Q0dyWVhWb1ZqblUyRzdyVFhyemg0a2ZSekxZMWt5R3dCb2VpR2NQaVhiNWVBemRYV25helBDU1NjYjRqM3hmbWF2OEN4MnA1MGxBTVcwVlhJTml0Q29nbDJyOUgyZGNjdFd3UXhRc242WlRCYk1OdGNnZEtJYmlaajUxVmNCazM4Q1hQeG9RY2ZDVWc4cGpjWWdaU2N3L21vbUFDblh5cjRsZUJoczVRYUJUSHBmN1g4ZE1QWUpZTzhYZ0F2OWU4UUpsQVpacThENHhTdUFOWUtQSlFuMEFSMkFIS3kxTUFDS2U5bmZGSTZJRXFkdUVXb0hJSjl3bHNWS0xla29NQ2E5RUFlZ1NUWVFlTTRUWGNvMlNFTWtBSEViQlpvajRiYll0ZHlDVnJGcUdYZ1RTeGdYWVRaZUhMaTlBTWpFUVJDVlVYUC9uNEtVYWFUOHZWVGkrUnRnN0dQQXVZY0FXbE1DZ1VWa1FmSjJRMTJ5QnZQWE13SEltaERXd2Y4MWltc1RpTFNFdkhaa3IralkvcDlDUVJENHA4RE9Cd3RlSXRhaTA1cW4zMUZGZGZMbEZ4WVdnQ0RVSWtSa2ovVHhiQ0VpLzg5amZQWjNYMlZxWVNKUWJtVU5RWTNIUVQ3aGJ2MnNMb2VyVndLUUhORUVvQ3NtOFI0TWhQUmpYVUd6VkVJS0lvWTd5YUVZdVk0ZGdHYjVSWHJ1b1NndFNDTExhcmtJQ1E5ZjZRTnlrR2pGZGpzSUJhSTRrR2x0OFcrUmc1ZzBISjhxQXA0N25paEF6RnB1V3RQSU1CWkpsQVNJTHZSNmZRMERDVmJKQ2tKT0pDcW5rNHBHcGI5OXRaOE1vcHlpS0RYN1dXRGl3WUtYaUVRT2VoQ3JnS2grZUpRK0VRSG8xTGJ5L3pSbHlmOFRJYmY5WFM1ZnRJYjhJOTJZdWdINGF5MnBMdXNvcmw3ZEFvb25XdE13UVNUZE9GdVFTTFRHSHlJQzhreFNJUXVBNGh3VTJXVUFvTzQvZ3JCY0Ric2ZXRWxTemcrSkNvWURvRUdNMWl4U2tIemdGL3dHN3k4c0lhM0o3SlBBR1d1RkpTUUlhVTAxaUpIVWlZUDRlMzNCclBPSG1HL0pNYU9mVFpWWVJod0dhdjg3dldLUEo5L3JTSDRJT0dPNXNJVHFnL2dneFhzNFRPYUJBRUNiZW9Pc2dmbCtEclFTaEZxY0VJaHl5dDBNYk11c0VreDc2aUFaWEtNOEJ2WGlaQUdsRitLYUliYWFkWXBlbTRhRGdwSlpRejZZSkFCVjVWY0hBSlowdjRGeFg2S0c1VXBZczBLbnFqaFJ1YWdFVmdQZ2xZQWw5Y2lIZjhtZFVySmgwUXg5dmtEQnpCeXdmYmtZUUlHd2FoQS9rZ2xBVHNIc0R6S0EwQkFUaVB5WjRORUR3SWVvYS91RllLS1hMMmYyNG5Rb0lnZDlSM3lRQ01URnF3SUFmZEJXSTcreUI1WkxFQ1lMRVRkODVZSmwrMllBVU5vc0xJZWwveFlsdTRKc2w2YmhOaEQ2aXQ0V0pDdkEyWmM0R3hvNzNSY2dKZU9xRm1HUjZyY0NoTFlBQ3lHb2ptRVlkajU5S25aK3RJUVJoSDlJdldBMmhpUkVqRGVSSTlDbHk3Zk1GM0V0V1JGYXdoUUlmNUlKd0U1NndkVElZZHQ3dHA5eXMxSzhKbm9Kdm9kOVduNjgyUE5rUDRoVXkxbmRXZ3N0QXRCRE1MWU41LzZQQWM1REdOb0Y0U3JaZk4rNCtJaFQ4anF3ZzJDcDhUaElKNXZmU1dCWEFWQ3JXTjlTTXhESytza2FPdmhvQWM4bWU2NTRwbVVCM2Ywd3l0K0U4RnlSQUdtUGxPRW9pU0QycWd2bUFLb09tNTJmQXVpVERIU3lJUnh4K2xJMFF4eEFEdWJmRjV2ZmZNbVNhanJXbFA3bm1aM2RTeSs0ci9aekFVRUhuUThSNzBIc1hsSytQZ0pzVzY4RzRYWUdaajBFWTJFWUFUQ0FUNnRBaG1FMERYY0M0ZmFhcGN3TWdBSWZMYjBrdXpUOVFtdzV1d0FBSUFCSlJFRlVTaStFZmVBTGtTcnBCb3ZiclFEbmttOHdBbzgvRTNpK0NDc1o5OE5DcEFwOGNVZWtaeUJhdkk0RVQvVG5hQWsvUlFDeUFYeTZ1TlNQQTBpK3dNZUI2ZVBBNUhGZ1pxMndwTkdLM0ZVREFIbXYzZlNDZTdhZlg4Q0I0VU5FRU9vbFZpLzNvYmFzdE53SjljTzVCT0JLRVFNc0FjaWZIV3pSQWlnV1dBbENuNUsyYlFZQU9lMUtNalRJUjJrUlVoS1ZTN0lyTGlhMHYrM3h3SE1aTUNiWU5QMEtmRzc5ekFxSzVEeE92eUV1V3U2VkQ1S1NIeTJZQUVRQWZwYVJkbDVVa3VVY3RJcEJuQ0lJbDRwc0QwM0Z0SUlQMUFEQWxCdUpNNDdFcXFVWDNMWDlrU0JRY3V1eWZ0Szc4eFVrSHlRK1JMcUhaM0Z2MUtjZ0xqNWtBUTFzMFFvNklBMW5IaE5MUXpBOFp4dkJYdU54OERjUzVVWXBObm9ZeHNDblVJcXZabzBGM3dQVE1hN0h2NTNIT0pWYlMvbCs1YnVtWDdkKzVXTEU0NGh4SVJKQjJOTUNxajlpeHd1RTkwc3ZXQ2FJQTZiQXA5NTlFS2VXQ2hBeUEwUFRPVjJ1bkdNUXZlQ083YmZxSGJjUzRySlI3RXdxbnc1QVdoTHVJbWcydUZRQVhBVnM4UkdtbnRXNCtnMmhCM1A3OUwvRUo5ekd2cXJ4T1BpYmlWaWhBT2dyV1FPZi9FQmZCY3NQTkJCcVc5SHY2enpHcUZ6bW9YejNCOUFlUGdYaXE2YmdpdjRZT0I5UUhTOEFmcGtBRk1NanJXQWNRQTBpTzlYSmlReUFub3MydlY3RVNIT09RZldDTzdaZjdGNDBtWkZRU2NSS0FZQmFTVTZ2QVZjVGdON3hYSGlVRnBEVE1LMmRGaDU2OTEyQlRpRGN2cGtBVElYekNMNGczV1hUWjRqcEdmam9GL29paEwrZngrMHlXVUFCTHdJd3RZS0tJYWJnQ3pIUXZpMmdnQktuME1jRVFEYUtUNWNHa0lPbzZTdXlZekVmalFCMEVNNW5aZ0FQb3hlOG9mM3NnU3FDUU0zamtkRkx2cFJ2UjEzKzdVVlJ1aFVGU2F2Tk82b3R3cDg4WlozK3Q0TTZITHRjaDZPVDlBRy9xOWNtdGYvL2dWMUpEWWNuUTJ6WTYvWWFrZlNyVStQZzFNNDVOcVB0M0lFdG9NN1dGSG9reXJXS2tvb2dsQ01XTFlqaVVYTXRLM2c4VXpkMVdMM2dEZTN2UlJDb1VFWUN3R3RZRnh4cWdBMkUvakkyMEY1aGhtUW9kOThCSE5ubHhPVGlnMWFHaURhbk8yMXlWNER5Z1d1QjhZZUI2Zm5DOVdFdGlLVlZLZUUwWkdpWFdjemVKb1dNSWlnNWE5VjVEQTFBTm9LRGVEeWxaOU5TWHh5QXNpS2F3clFxbUN2MkhWZjVlOGFSb3hmYzFuN3hzK2toSXRBVXZvanZ5V3J5eFZjV0paa3NWU3lab1FSQTNkY0FvSHpheDRHajJ3dHU2RlZLTTdnTWd0aTAyamJWNDc2b1VKSnMxai9BYkExbVEzUG04ZVRSc29aRHRSK3haS0NpRUttTVhUSWVYSFBHZGhZQXJYOEZ3RzRER01FbkFISUs0eXZUNThuV0MyYjczY2V4YVpnV1dhRUtnVTFnak5iUFA3UHZPWUdzVVNCa3YzaEJ0bVJXTnp4alRrOVJXa3R2eHA2UE9qMHZBUmpZOXNXa0ZlbDhSV3hlZ2pJRjRSandBT25aV01QQlRHanF2SG1zenhKT0JVRDN4eXpuTDJicVJPdm9QM04zcTg0akc0QzdNL1BwY3ZNQmVmMGN2VjlrNmhYdisyWW5vNVFmR0FyUmJhQ0MwbVd2Mll0RjNlY2VyTkRoa05aSUlzWFFSdjVkbFR0R0FESlN6MmdFRTFFSlFNLy8wMjZIZElFWkxDOEI2QTB0azBnMUphOER1ekpkcGhTODJRQkVaajVkYmo3Z3haTjVlci9JWkkrNjdwc2NnRTdRYURPVU15QzBXYjgrZ1hqdVI0RjVKNllzYVhuRmhCb0FHRVZ2VWhiNjBqSVNnQ1Fub2gvT0xCZ3ZJckw4djdEZEZrRVlNNWR0Tmc5N3R2ejV6SnF6ZGZJQm1KbFBsNXNQK0RKUDV4dFc3eGZmbnplaDdIK1orMytScGt5V1QxWXh1VVJKWVZ0eDZUMGZDVG9jb3VRVjg1VmtIUklHZWdFdUV2L1lLcGtBL0pjZVZtTDhrdjZ0NS85cHU2MnRmaVBXY0ZRVkVhMERaOVdjTEpFUHdNeDh1dmZualQ5SWdaeWo5NHQvbGRlQS9TOXRNYUdhOVNOZG1zSXhidlZzY1ZKMUdTY29NdDRVUHdoQXNtTVowYVh6UUJzdmRHUkJqUXowRlVwRUpSQUpRT3E0S0FuQmR6K3NmaVBKM2JPWW44ZnN5a3lWV01maU4zQk96Y2tTK1FETXpLZTdPVy84OGFxUXpzZkU1a0gxZnZHamVRMHdBRG9kbVZHd09laU1zVXFIckdPblM0VUZ5OVAvd0FFb2prRW5JK0lxT0lKUU5MZ3BDWGhjbUxBdEQvRCtrZ1FFMjM1TDkzdGorWUJxZ1RYOUJpQ2VXL05lZFQ0QW1RK1lrVS8zc2J6eEJ5bVF1WmhtOGcxVCtRYlYrd1dGZGpLTy9UZTJtRUZObENiNmdQRjcwOFZKMVRYSGdLZDkxR25acERmaTFrL2dNMnZxVTNEVW5DdUJtTlFlM1A5dnc2cGUyMjlLT3ZCMEsxaytaUytybnJmTTJBbEEzSk1adGFoL0VaS1pUM2RyeHVEejFPL3l4QXd1OUpnSnhyM2xRZlIrOGFhOEJ1eS93ZFdRWkFWbCtaekNyRzNxOWMvWXJrbUh5M0lSWXJ5QUFxQWtFQklsb3BKeE5OVWJFUitmQS9IKy8rQUFkUDlQbVM5ZGF6aWNKeWJtN21sQjhuUjJkSTFIdmdWa09sWkdQdDJuTTI5R0NhbWNHWmpBd2xRK3Z2clYrOFgvekdzQUFVaUxWUHAvd2QremFUTUZXdysva0FBMEdRUW5wQ3c1bURzQU1JcmNSQjVtQy8rTUFmZlR3Z2Z3S1kyS2ZtQ1o2WklrVVNocnhYeEJYNHlZYVY4SHptY24xM2pVQThDTWZEcVdZZVFjU2toVk9sOFU2dXhIN3hla3JzZzQ5aDhvaUNFTmdDNVRVRzV2S3h4VDhmMmFSdE90Y0FLUTFzOHNvUHVPVlVJd3BjaE5sRUVJT3lOU0lycnZ2M2h3bmNrV0laUFpzbmJjRHl6VHB2ZzNsVThtcFpRcW96eWZLNzRhajN3QUtoMUxncnNENXRNeGl6L25rR0Qxc0hxL1lORk94a0VBY3VXN29xbVhsaXN1UU9UN1ZWMmp3aS9rVGdqMVJrb1poQmplOFo4M1NDQUVFSlpXMEMzZ2ZmOHRBREN0NFZBU2FXSUJLMEhJOXE4QkY1eVVBTXpJcDh0Tng1Smc5YkI2di9qZERQU1JuczBCV0laZVVpdElvOUloSG1oWFR2ekNQUWRkY2NuWjc2VTFWL0l2QzRTQkNGeWcyNkRGTmc3YysrTWhoYjZxaUNpa1Q3V1ZVbXI2bFluMm5SS3lyZFo1MUdNQmxaSWMwN0dVQmRNam55NlhDaVVtcEE2ajk0dk1aYmdCTUZvNTUycHUyN1BYQXFYVHlBVVFjaXRPUWpBbTl4WDBOOXBJd0lQbVNDbUg1UXVQcUVSMEw0a0RZZ3A5ek9VTDZmWXhrYlpjRmNleUFyZUFGM0dsVitOUkR3QXo4dWtzblQzamlJTFZTbXBXTmxoTXplK2s5NHZNWmZnR0FQSmVIRGpwQ3JnTTAxVGRyeTlPenZtWUF6QXFMVldJd0VTaHd6YlJ3d1NFbitNcVA2YlFLNXRabFd5aGpDQ0NzQzE5WHY3Z09uQlJiZ3A3Y3UvNUFPeVZqcVZNbUE3NWRKWjluSEYweW9oV05saE14S25TKzBYbU10d0FtRnE0aW1uWWJyRXFOSlBjKzlrZmQ2MlJLaDBPbjhxVjloWFo5YXNrRVBnQWZJNTZ6aW9jVWdWYnpHVDI4bEV0Uk1vS3RnN2xCSHR6bmZaTkErQ1ErWFFXTThrNHVnbFdLL05MWUt6Uys4VTlHUmVYRDBnL1R5dmg0TmUxN1liNFpicjZnNnk3L2FOV2NvUHBqS1JUc0pJYWdzNUlKd2tFQXY2ZW4wNVM2R1VCZlJXc1VFeFp5VlpWUUNRd3JnTjdXZmRkNDFHUEJjeklwOE9EZVhmVFNiQmE2WVl4bFk4L3AzcS91ZGMzQytqVGJ0dnF0Mm9hZG5CMm00b05nTW4wVzBwK2hZV0hXYndnOXlVLzBLYjlFSXkrNXkyaGlDaXQ0VWdLeVRlQWtOOFZhbGs0TGUvbGRsT05SejRBV1dCUk02ZmRJUGZIc3R3L0crU0U1ck1uVlEva0E1QWtMSFMwYWs3VjdyZVhmaGdBQ2FCcUR0RDNlL25tYzVrOWtBL0E4MEpSZXErVTM4ekdWcDNPYkpvL0J2QU9EM2R0d2lXYXI5ekVIc2dISUdsRnVicVN4NytKamEzNmFuTExjRHZ2Z3dBK05EcERmSUx2K3FsenVYd0FYdVNqcmtLZW1sTzJlM1UxdVdVWW5MOGR3Qi81ZTJhcGNhOUxOdit2c1FmeUFVaGVYNFZndUIrbXpJc2FHOW50cXhoRjRYYmUzUUQrbjcvdUhMQVc5d1ExdGJsTVJRL1VBMENhSEM3cGxYRWgrcTRUME9XY2ZobGVZVFNIQkswRUgvbWkrZmNSdUtRbjRJNmZXcGVvQjRBZXZDejNIT09tOXliM0Y1bUJsWkJOY2xZQ2oxYVJmeWZyYmdQQ1RSNkF6Syt2RDRDeWdsWDdqcG1ON0hZNjZkMUUwY3RkSXJFRUU0d0VJTWxhbStQazdZRjZBTWo3RXdBVmJVODJ2VGVyQ3doQVhvcEpOOXpWSStBWXJPZVVMTFpnRXJZMng4blpBL2tBSkdXcjBuYVVXZEZweTJjVCtvQ1dqcGRqTEZ4RTVVellJQkJwRVVYNW5Mbmx2QWt0Yjc2U1BWQWZBT1VIcGlBTW05NmJzVnRDQU1hS0FMSUNNeXhEcTZjWGZ5Y0ErYi9tT0xsNm9GNEFpcUJSSUV6QnA3L1gyQWYwK2ZpMVhJaW9NSWxBSStBSVBJR1BtZVJPV1YzajFadXZ5dTJCK2dIb0ZmWmlEUzJsQzBMaVk1MldVQURrUW9UVE1IMUJGU1lSZEhvUmZLU3U1djlxcml6TUhZUFQrdng2QVJoU3VEY0F6em1EbzVaR0hUMVBBS1lNd1F4TUUyamlTby9nRXdCcnJxK3U0MVpPeSsrb0Q0QmFDY3NYVFBpU0kzZXk4czRLR29HOFF3Q01GTSswZ2dRaExSMEJGMTlTWHVEL2F5YWt6N3VSMC9Uc01jeGczU2pmcVdOQTBoc3JnYS9vamFxLzhXUGNDK1lJazRLZTRDTVN1QjJYVmh0MU9qOHpJZlhsVThCdFU4RGhtWVJYV2RmcmRGMWZncjMrUzhBdDQ4Q0QwNERWalhRU0RPNzBQVFVuYUo1dU9Dd3NJSUZIU1NGeTFwS1BXQ0RzWnhDcHc4VVZnS1NQeExYTTkzN096eHhBbGp6Y1BBYmNzd1U0UWg0VjNVTjhtS29lS20vYnU3OElmS0pRYThWRDQ4Q3lsSFFpTDNPMy9xZzVSZjMwQktBQ010SlhqWEtRY2ZCU0s4RGZxYzNLVkN3dU4yVkZHUm5tL3lLWnRxNFJlNWlmeVFRZ00yQStCZUIzR0hhWkJvNU1BSXVlMGw3S3QzY0M0eGh3KzVlTDdUdUNrSmsxakJ0eWVyYlVmWUc1RXhqWi9wcXJ4RTVmQU9yT3E1U21vd1ZJclJwMUl5VDJSNitmZzBiZ1ZZRzRDc3laZTJVc2FpT0dLWHI0U2ZwOWs4Q3hDWUFGU0t5dlhlWTFvMUJ4UXV4OTF5TXRmc0hQdXRnbm55VXVVdmhjMFpzZ1VYaWIrblZrcTYrWkthQUJJSHNnVlpudXdEOXNWbzY2cnJSNEltZGhMR1NROHpQTC9KZ0JReGVVMW91V2tPOVBUZ0R6YmdtWHhyek1rYXRsM2tlaXZmRzV4NHI0SVJjejVCZmtPNXZFWjBrZ3BJZkJaOHlLamxMMTdzeXkwdE1OY09uOWRsNEZ5NmRMRmFiajFNcHZvdzlJZnkrSTRObG85WHQrWnFVOVZkSnBxWmg0UUREeXhVeVlPWUp3SERnK0RoZ0kvV1VWWmw3YVNFdDkzK0dPOUlhMml1WktPZkE3bGhwOUpwdkFWeTYxdzJtT3dPNWhtQ2dNSEMxSDlPMjRndTZVRDlqUCtabWJ0TFJhU3NlaTlTTDRYRFBiQUVoL2tHUS9wU1VjYzBsYkFwRldiNjdsUVVocFZuTEJzb0txcVpjbEZNbVV0cnhQY3d4bDNYN3ZPQ0F0WUxTQ2N1Z0ZRbXFoZHNzSDdIVStSem5qaU9sWVhBOHdxa09ma0l0VEFvbStvS3lnY2E0RVM4alkrTjN6N2ZTRzRoZlV0cDNpaFVIcnVWU3NGeTFpUnZOUCsxTjdBNUJkSkFDbVZwQWdaUGhHT3lDaWdFamxQTHVkbjdrdkZ0T3h1QjRnNk9qRDhVV0xSa0NaRlJ3ckxDRVhKUVFocDJLKzM3bFFlQkNSWDFBN0tQUXRvMXByRkVtU1luMm1COUVBc08ra1lmazhLUWhaRjh5alZ6NWdwL016dHlPVWppVzliQ1VoRUJoS1JDQ2dTaXM0NXVRL1BoWC94ZkZXTWdPbld1Mmd4QjBURi9vMGtFWi9rQ0RNMVRzKzNSSFlud1ZVTDZYaERGckFzd2ZJQjZ3NlAxTXJUdWxZMHN1bTFWSUNnbEt3Q0VBQ3F2UUZDVUszZ0hjc0ZRQ00vSUxheXFQMWs5SnNoVnFybmNNYWxPWVl2Z2NHQXlDdkl3dW9kOFlCSlFtWnBtR0pleVJ3a0d3NG44akpPSlFOdzNpZExGaE1STkIwU2dBU1RKeUtveS80aWVYQ2VGZkpCVWVWMlNvQWNsRnlSMGJibTFPSFRVaU4wL0RUQXdEN3pRZU01MmRxajhWc0dFa1ZFMmpLZXRHN0FFaFEwZnJKQXY2UkMwdHJDMXNrbCtJV2xOaW5HTGJTYVpnN01jMHhmQThNYmdGMUxRVjF6MDhBMkc4K29NN1BWRjlNczJHVUUwZ1F5cCtMd3UyeWFnTGdSOVphWXBrU3lwUTZhNlEyRENxenBrdmlldFhJRmRvWmZ1aWVHbWNPRDBEZVAwSEViQmhOd1lQbUEvTDh6SlFzQVRBS25ndUVxUytYVHFrRTRZZldXd0NVRlpUa3NZQVl3WmZJQmVOOVR3MGNqT3d1OGdESVpxc29TU3ZoRWVRRGlpR1lGb3lXaVNEUnlwV2dpNjlVUDVzYzVmSWNxdVNDTmVYcWUyWDlaQUhmTTdLaGUycGNPQitBVDQxK2FPNWlSRDNRQUhCRUhkOWN0dWlCQm9BTkVrYmFBdzBBUjlyOXpjVWJBRFlZR0drUE5BQWNhZmMzRjI4QTJHQmdwRDNRQUhDazNkOWN2QUZnZzRHUjlrQUR3SkYyZjNQeEJvQU5Ca2JhQXcwQVI5cjl6Y1ViQURZWUdHa1BOQUFjYWZjM0YyOEEyR0JncEQzUUFIQ2szZDljZk94cVlKMmF1OVJkUHRkcC9raG9FT2xnbERZVDM5VjFQelFGWExzTVhBbGd0OVBDeEpLUGJ1ZnlmOC9LSElQZkJQQVpBQmY3OVhjNVhRMFpRMVE3MzYwTmJ4b0hybHNEdnM1WlJzZ28wdW5lMDZieTZYMW1adnRQOTlQTkFwNEY0THNCWEE1Z2p3OEVHVGVxYUdGNFFoelFGODBDWDdjQXZHSWRlRFlBZmhkWjJzVEtVY1ZycEU3bmQzMU41Z2o4ZTJkSW8yb3NrN05acE1kSzBaMTl0ditiSjRGOUs4RDFBQ2o4eWZOU2lrSGVnKzVaOTY5bTU3WS84L1pQK2RQTEtaaFAvcmNBK0FZQUY3ZzFvUlVoRU1VekZNdDZlU0pmWDc4YjJEa1BmTTBpOEdJQVgrdVdsQU1wcHJlVVVFcm44cDJnelRsKzJmbGcvc0RiVGt2SU9paytDUDIwLy9tendBWHp3RGNDdU5UUEplRlhwRXBNNlFFaklIbS96VEY4RDdUNWdBVFlOUUNlNjlhQWxvUlRHdWxmQkVTQlNZTnl4UjVnL0JodzdoS3dad2w0dms5TG5NNUptc0J6VXlER0FYM0I4RzIzTXovZzlCdVVhLzBJaXV0Zk1rajd6d0ttbmdBdVhTdk9wVXZBV1lCdEY0QlRuc3BJai9POHpQYWY3cWR2V0lUdzZlWkEwSkxRRWhLRUdneFpoVWovZHozTnpTS3diUjQ0ZXhuWXZWS2N5K21NNUttMEpoeEluVXRyR2ttekNQaWNnM1c1TE1Ha1FpWlpUbTl4UzlaMys0bTJvOEM1YzRYMTVwVEtXMkxiK2ZDeDdXTHRqWXh6cWlxbDI5SWN3L2RBNVNxWWY2UlRUaWxnK2xZQ0lYbUlDS1E0SUs5d3hmU0pZOEFaSzhDdUZXRG5hbkV1YTlaVEFNc2FDb2czRHQ5Mk8vTXZuUkdCdEd3a3FLUm1NRWtxQ2FhKzJrKzBMUURUaDRyUDg4VUhqNzRrRjFXYUFUbzlRSFE3bW1QNEh1Z1lodEVLajRQQjZaUStGUzBoUWFocGxkUHlhMWtYVE9xTlk4RHNjZ0crSGF2QXR0VUN2QnhJbml0cmtnTDRsY08zM2M3c3BCZE0za0F1U25xMm54OWdRZkFoNEp5Vnd2cnh3ZWwyejNwNGFNbHpINkRNMnovbFQrOGFCK1EvT1Q0RUVxY2tXUVNCa0dENkVRS1FuRENMd0JTbllnY2YzMmZYaW9HVUZhd0M0ZXN5dTdDWFhuRFA5dE9Dc3lENEtMQjFybWd2WDd6ZmJ1MldHL0p0bWUwLzNVL3ZLeEJOQU1vaTBLY2prQVRDTjNIT0VyM1VBakRyd09QNzFyWGl4WUVrZUtNRmxTWDhvY3dSNktVWFRKN0FhTkUydEY4V2ZBNFllN0t3MW13dlgveVpuK2VLbnZjcmZ6QzZJSy9PYlAvcGZucGZBR1FueVNvSVNCcVVYeUFBU1MxQUswSmZhZ1dZY1JET3JBRjY2VHhaUVU3akJPRWJNMGVnSDcxZ2NnWFNGWkFWNTROUXRqOVljTklwYk9OQ3loOFlnaThDVm9zcEFwRHVCNjNnOTJXMi8zUS92VzhBc3FNNGdMSUtCQklIOGJjSndNQ05NWDY4QlRxQmI4czZzR1d0c0lBNmp3RGs2NjJaSTlDdlhqQTVBNk5WYTJ0L0lBaWNuQy9hR1YrOFQ3NElRUG0vQW1HdUJjKzgvVlArOUlFQXlMc2xBS01WL0xnQXlJVUluZm5qd1BRcU1PT2dJL0RzdFE1TXI3VUFxTUY4VjJZWERxb1hYTmwrRVFRNk45djI5YUtkZXNVcFdKWmJBUHlQbWUwLzNVOGZHSURzc0RpZC9wVUFTQ3ZDYVhnSm1GZ3VBRWZnRVhUMjdnRGt1d2FVZy9uYm1TTXdqRjd3aHZiTGhTREw1VHd3dmRScW85b3FIekFDa0NCOFUyYjdUL2ZUaHdJZ08wMVQxSU1Db0FaeEdSaGJLb0FYUVVjUVRqa0krYTRCNWU1RnpqR3NYdkNHOWdkcXJMR0ZZcnBWRy9VdUh6Qk93Mi9MYVh4emJoNDNES2VvSndsQUhxTG5kU3M0dWRvQ29JQkhRRTQ1RVBrM0R1aXRtWU9Rb3hkY3RwOCtyRndJV3NHRllpRkZvTEdOY2hjRVFDNmUrT0pDNUoyWjdUL2RUeC9hQXBZZEozN0F5SksvREl3dkZ4WXZXcjBJd0VuL0gxT3BjbzVzdmVEVWhTQUFGNEhKcFFKa1dpeHA2azJuNElZZk1HZjBhbURIZXYySTgrbDQvVWJ2Tnc4RW96dzcyd0plUE9KOHVuZDdFa0tqOXp0S0dBMS83V3dBVG80NG40NXBXSTNlNy9BQUdQV1oyUUJrWUhDVStYVE1mR0dRbVlJeGpkN3ZxT0UwK1BYekFUamlmRHJLdFRaNnY0TVAvTWx5Umo0QVI1eFBGK1ZhcVpMSkYxVXpLZFBWNlAyZUxERHIzSTU4QUk0NG4wN1pNQVJiby9kNzhnTXViV0UrQUVlY1Q4ZTlZT24yVWhldTBmczl0VUNZRDhBUjU5TXBHNmJSK3oyMWdLZlcxZ05BejRnZVJUNWRURVpvOUg1UFBSRG1BekJtUk04Qkp6cWZMaVlqU0tLcjBmczlkWUJZRHdCSG1FOVh0UmZNc0l6MDRhUVoxK2o5bnB5Z3JBK0FrcXM4d2ZsMEJDQ1RXUnE5MzVNVFlMMWFWUThBbzF6bEFuQWk4K2tFUUdaVE5YcS92WWI3NVB0L2ZRQWNVVDVkQkdDajkzdnlBYXhYaStvRG9GTHlUM0ErM1JjYXZkOWVZM3hTL3o4ZmdDUVgvTFBSM1NPemtvbjU1amcxZXlBZmdEOE00TmNBUEQ2YURtQnRCMWU0Tk1ETmNlcjFRRDRBYndid3h3RGU0VXZSRTl3SFpHMWdOU1hETGx3TE5jZXAxUVA1QVB4enp3ajlJSUFQblhoVDVPUmM1RVlDQTlITmNXcjFRRDRBbVJINkZRQk1UU1paSDk4Wm1ENUJoNWcxRm9waU5uczF4Nm5UQS9rQXZBZkFFd0R1ZG5JK0V2UXhQZmtFellmYUNYUlNCbHVRTUI3WUhLZEdEK1FEc0JOQkgvOStBa0FvYnFUQURHSzdJbncxeDhuZkEva0E3RVhRdDhrZ3JHQUdNZkJ4WjVDdjVqaTVleUFmZ0wwSStyNjh1UjBRbVVGb0JRVTh2Zk52elhIeTlrQTlBT1JvTXc3Q2RHUUNqb1VaRHdMNGt2Lys4T1oxZ0poQklqR0RnTWgzdlRhdkJjMDM1L1JBUGdEN0plZ2pPRGZoaU13Z29xZUp3TlBQVGFCNkV6cS9ocStzQjRBY1hlWEVQK1poR1ZvOXZSaW1JUUQ1djVvUEFaQ3VwZ0RJOXdnOC9xei8xWHo1NXVzeWV5QWZnTU1ROUdVMk9wNGVBY2hwT0lKUVFFei9WdVBsbTYvSzdJSDZBTWpnR3pkbDZRdHlYNWpXanBRRmV2RjNscTN4ZjZ5aHJPbElBVWdRQ29qUjhnbUUrbDlObDIrK0pyTUg2Z0VnUjVVQTVLWXNjK0FabUNiUUNEaStJdmdFUU1vYjFYQkVBSElhamdCTUxWKzBrQ2R3czZhR3UzenFma1Y5QUdUd2pmdGczSlJWVlJBdEhRRVhYL3diQWNvWFA1ZDVDSUQ4R29KS3ZxREFsb0tPb0l6L3k3eDhjM3BtRDR6aGFxd2pSekNZeVFnNWdyMlpnc0ZUTHdlV3I4WFFnc1hqYndMV3JuTnRNbEtnTm9MQm1aQWE3UFRDQXVZSUJsTXZsV1Fzd3dyMlVsVXc0NWpkRFN4OEhiRCtDdGQrSFZDd2VQS2JnSlY5YUFTRE04WWc1OVRXRkR5c1lQQnRtWUs5MUliTk9IYVBBL003Z1VYS1hBNGhXRHo3OWNBOCtXMGF3ZUNNVVJqKzFIWWZjQmpCWU81NE1NWTN0R0R2OEkzbm1XU0hPellPTEowTExQR1hBUVdMejNvQjhNUVVzRWExNmtZd09HOHdoamg3NHlKa1VNRmdic05sQ2ZZTzBlcHdpc3NWWTM0YnNIdzJzRUlSa0FFRWkvZGNVMFNQNXFoRjFnZ0c1dzNHRUdkWHI0TDUxMzRGZzRrQWp1RFFncjFEdERxY1VtWkVUd0FyWndBcnU0QlZxc3YwS1ZoOC9vM0Y0djBRWFpCR01EaHZNSVk0dTNNWWh2OTVaaCtDdTF4QmN4dU9VL0hmZURJcTVjdjdGdXdkb3RYaGxDQlhqT1haQW55ck80QlY2aW4wSVZoOHdTdEx1V0NzVUF5dkVRek9HNUFCeis0ZUIrUi9ld251L2tPUC8zRy9sNGtKVEVSbGxqUXRJb3QyZTUzL0l3TzJPUGw0Rkx0Y25DcUFwOWNhaFQ1NkNCWmYrTHBTTGhoejFONXFCSVB6Qm1UQXMvc0xSSGNUREtiaU5IZEJHR3ltT0MvM2hnbEV2Z2pBbm9LOUE3WTQrWGdpVjR6VldZREFzL2V0eGF1YllQRkZQMVFrTHRDSVA4bmVhQVNEOHdaa3dMUDdBeUMvdEpOZzhML3hMTkJ1K1lCZEJYc0hiSEVGQUlOY01WYW1nZFdaQW9ScmZQZFhtOEtpdExkbWdZdmVXQXErMnk3aU1xZnVSakE0YjFBR09MdC9BUEpMcXdTRDMreTVUMXlJMEFvU2JBeE1NekdWMW84L015MnJvMkR2QUsydCtHZ2lWNHpqNCszQUl3RFh0d0JyVkpldUVDemUrOWFXNER1dDRQeGtJaFlzZGV0R01EaHZvRHFjUFJnQStTV3A0TzR2ZVE1VXYvbUFHd1I3OCs2clFxNFlxOVBBT2kyZkE0L3ZCa0t1ZEtWVTdWWnc3N3VLdldGdVpidGNNTmI1djBZd09HOWcrang3Y0FEeWk2UGc3Z2NjZ0l4bGNBNVRLaGFEMDF5WUtCbVZGcEJaTWZ4L20yQnZueTN0OExHcW9xVGxpWmJWSStnTWdId25NQW5DSUZpODk3Y0xBQVo2UXl6Rnp6U0N3WGtEMU9QczRRRElMNVhnTG1rNUpIay9TRDVnS2RpYmQzOFZjc1ZZR211QlRhQXpFSExIZ3lDY2Fva0I3LzFJa1VFVDVJS3h3RjVwQklQekJxYlBzNGNISUMvQWFlcXZQTDlwbUh4QUUrenRzNlZkTENEL2xjZ1ZZM1V5V0QwQmoxWndxZ0NnZ1hBN3NQZldBb0FKdmFFdFpCckI0THl4NmVmc1BBRHlDdG1DdmYwMHMvTm5Pc2dWWTNtOEJUUlpQWnVHQlVBQ2RBclkrNWxXRHFHbVliSXJMSEV4MGdnRzV3MU9IMmZuQTdDUGl6UWZhWHFnVXc4MEFHeXdNZEllYUFBNDB1NXZMdDRBc01IQVNIdWdBZUJJdTcrNWVBUEFCZ01qN1lFR2dDUHQvdWJpRFFBYkRJeTBCeG9BanJUN200czNBR3d3TU5JZWFBQTQwdTV2THQ0QXNNSEFTSHVnQWVCSXU3KzVlQVBBQmdNajdZRUdnQ1B0L3ViaURRQWJESXkwQjhaWU5NYmtYK1pla3B1SWlPUXJQYXIreHM4ODlISmc2alpnNWpBd3ZWWjhCK2xsOVBsTzUvRmMvbytFQ2puSGZpOHpZZmt2TTV1bG1wNHFKWFZxeDVkZUQ0emZBa3cvQ0d4ZEFaZ29IZnVoMTMxUWthSTVodThCczREczhCMEFXTG5JUkdDQnNGZm44N0pmZkRNd2RqT3c1UjVnOGdpd1phMzRqblFRVXdEbzk5d0JmSjRUTTdDT2lOZGxhajJyQS9qZVYvdmZEZUFUQVA0VUdIOEkyTHJjNmdjK1NIcVk0b01aNzRWU0tNMHhmQStVVXpCL29CVVVDS01sNnpTUS9Qc1hxWkQ1S1FDL0Ewdy9ERXdjQWNZWGdZblZ3cHB3QUR1QmtlZm5DaW05MEZtQldYd25LODdVZW41M0JJOHNidXdxYXo5cDVVZ25RaEJTK1pOMXpFOEFrMHV0dmlDd3E4REk4L254NWhpK0J6YjRnSnpLWkUxU0VGWlpnUzkvMnBXUi9nVEFKNEhKUThERU1XQjhBUmhmQnNhV0N3RHF1d1FLdnZOZ0hYdk9jWVZiUEZKUGt3K2REeEMvVzFZNHRXRHB3L1JsZ280bG8xVDQvS3hUaWhETnBKd2ozL1VpTUxYZW1wcmpmZkM3ZVdwekROOERsWXNRRGlLdFZ4ekVxb0hreVg5SFJpelcrbklnYVFudkFpYWVCQ2JtQzBzNHRnU011MnJNZVBBUjlYMjUyalhrbGFURlUxMDhLME1IYXYvbnZKNlp4VlZrOU9JN0dSMklab0dRTmMvSGdiSGdJd3FJTElWdWp1RjdvT01xV0Zhd0NvUnhrZkVJQjVDV2drUkVCQ05mOXdNVGM4QTRRY2lCV3lvR3oxNnJ3TmdhTUw1ZVdLcGN0WVpMM04rVFdMWDBndnR1UDBISGsybjE2SkR5eFhtVmhmVTBxeXdiSmJyNUdTdVhLeEEvc1Y1WTlVWVdkbmp3eVMzcUtLZ2FyV0E2OVdnNmZqUU9JSzBIYWRuSWpQVkZCK0FpTUU0QXVpVWtDRm5FU3lDU2ttQXVVN0NqbTE1d1grMlgyaWZCUm45QThtS2NXMlVGalVMVlFjZ1ZEbDgwdTQwU1loNzYzRmZ2cXVoTEN4aXRvQllVc29KZmpYS3R0QnlNcTlDS2NIbjRzUHVDYmdYTkp3eVdrRUNjejVRMzc2VVgzTE5uY1p5UUFBQURFa2xFUVZUOWZGZ0lKczZsQkJ3dG4zVHQ2RnBJejRSV251UXhQaDJYSUd6bTRDd1E5aFdJRmdCVEswZ1FIaUlBSmRkS3EwRUxRaCtLTDFxVVI0TXZTRXNvRU5JS3JnQUxITmlNb3grOTRLN3RsOXFubk1pbzhNU2Y2U053R3BZVmpDRGsvSnU3aXNxNDk2ZkNxWDBCa0RlcWxXd0t3aWMxZ0FRU3B6R1JFbkZnUkV6MDFlQUxMdnZxMktmaTQ1bTZjZjNxQlhkc2Z4UmJKTWhvOGRpbXFPaEVLOGNYUVJyOVFWcHZQb0ROTVhRUDlBM0FDRUxGeFBoK2pBQ2tQMGZMSUtGQ0NSUnFLdVBVZHFqbEM5bzA3Slp3S1ZOSGVCQzk0RFFjWk8wWEFBa21nb3RBazlRWXJSOWYvQnZCeVlmTVNBVERWTXp3VFhNTTNRTURBVkFnVkhDWjcvTWFRSzRRWlVIaU5DYkJRbHFVdzc0WUNiN2djbVlrZWxDOVlGbHd2VnY3UlJBb3JUdUJrRUNVOWFzQ0lEOS94OUI5MzV6WXp5S2txcGZpTkh4Y0EwZ0xRZ3ZCQWFQVmtDcW0zaDJBdEM1bS9SeUVxencvNHhoR0wzaEQrK01tc2xncUNiZ1VmTEtBY1JybVRsQnpETjBEQTF0QVhVbFdjRG0xSU9JSUpBamxUL0ZkMDVsYkZRRndqZHRnR2Nld2VzRnQ3UmMvR3g4aVdqVUNqR0NUMVl2V1QxTXdnVXFyZjNORzQ1dFRiY3UwYXhpbVd4OXhFTmNFUUhHYmNZQUV3dFNYU3FZMGduQ2RnZXVNSTBjdnVHeC9GVUdnRmh3RVlyUjgwUWNrV04rWDBmam0xRHdBV3Y4UmdKRmlsSlpCem56MHBRZytBWkFBbFZXaDFHdkdrYTBYekIwY0NRaTMwYVNHVmE5QUY2MmZMT0I3TWhyZm5Kb1B3UEVSNTlQeCtvM2U3Nm1MNUt3cDJHNTd4UGwwa3hjM2VyK25MdnlLdExtaGZVQzc4UkhuMDgxT05ucS9wemNBUjV4UFI5bVJSdS8zMUlWZ3ZnVWNjVDRkTmFvYnZkL1RHWUFqenFlanVtcWo5M3M2QTNERStYUlVnMlZTQ2pkYUdyM2ZVdytJK1ZQd2lQUHBxSmpPOEoxTnc0M2U3eW1Id0hvQUtNRmQ3UUVyQWVFRTVOTkpNYjNSK3ozbHNHY056Z2ZnaVBQcG9tSjZvL2Q3Nm9Hd1BnQ09LSjh1S3FZM2VyK25Ld0JIbUUrbm9xUkc3L2ZVQTE5OVUvQUk4K2tFd0VidjkzUUhvRWhaVG5BK25ZcVNHcjNmQm9BdGFpcUJVSW1kbTVoUEp3QTJlcituS3dCSG5FK1gxZ1V6U2JuUit6MTF3UGovQWVDcFBERDN0N3J2QUFBQUFFbEZUa1N1UW1DQ1wiO1xuXG4vKipcclxuICogU3VicGl4ZWwgTW9ycGhvbG9naWNhbCBBbnRpYWxpYXNpbmcgKFNNQUEpIHYyLjguXHJcbiAqXHJcbiAqIFByZXNldDogU01BQSAxeCBNZWRpdW0gKHdpdGggY29sb3IgZWRnZSBkZXRlY3Rpb24pLlxyXG4gKiAgaHR0cHM6Ly9naXRodWIuY29tL2lyeW9rdS9zbWFhL3JlbGVhc2VzL3RhZy92Mi44XHJcbiAqL1xuXG52YXIgU01BQVBhc3MgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9QYXNzKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgU01BQSBwYXNzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtJbWFnZX0gc2VhcmNoSW1hZ2UgLSBUaGUgU01BQSBzZWFyY2ggaW1hZ2UuIFByZWxvYWQgdGhpcyBpbWFnZSB1c2luZyB0aGUge0BsaW5rIHNlYXJjaEltYWdlRGF0YVVSTH0uXHJcbiAgICogQHBhcmFtIHtJbWFnZX0gYXJlYUltYWdlIC0gVGhlIFNNQUEgYXJlYSBpbWFnZS4gUHJlbG9hZCB0aGlzIGltYWdlIHVzaW5nIHRoZSB7QGxpbmsgYXJlYUltYWdlRGF0YVVSTH0uXHJcbiAgICovXG4gIGZ1bmN0aW9uIFNNQUFQYXNzKHNlYXJjaEltYWdlLCBhcmVhSW1hZ2UpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTTUFBUGFzcyk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihTTUFBUGFzcykuY2FsbCh0aGlzLCBcIlNNQUFQYXNzXCIpKTtcbiAgICAvKipcclxuICAgICAqIEEgY2xlYXIgcGFzcyBmb3IgdGhlIGNvbG9yIGVkZ2VzIGJ1ZmZlci5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Q2xlYXJQYXNzfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMuY2xlYXJQYXNzID0gbmV3IENsZWFyUGFzcyh7XG4gICAgICBjbGVhckNvbG9yOiBuZXcgQ29sb3IoMHgwMDAwMDApLFxuICAgICAgY2xlYXJBbHBoYTogMS4wXG4gICAgfSk7XG4gICAgLyoqXHJcbiAgICAgKiBBIHJlbmRlciB0YXJnZXQgZm9yIHRoZSBjb2xvciBlZGdlIGRldGVjdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRDb2xvckVkZ2VzID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KDEsIDEsIHtcbiAgICAgIG1pbkZpbHRlcjogTGluZWFyRmlsdGVyLFxuICAgICAgZm9ybWF0OiBSR0JGb3JtYXQsXG4gICAgICBzdGVuY2lsQnVmZmVyOiBmYWxzZSxcbiAgICAgIGRlcHRoQnVmZmVyOiBmYWxzZVxuICAgIH0pO1xuICAgIF90aGlzLnJlbmRlclRhcmdldENvbG9yRWRnZXMudGV4dHVyZS5uYW1lID0gXCJTTUFBLkNvbG9yRWRnZXNcIjtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRDb2xvckVkZ2VzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG4gICAgLyoqXHJcbiAgICAgKiBBIHJlbmRlciB0YXJnZXQgZm9yIHRoZSBTTUFBIHdlaWdodHMuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0V2VpZ2h0cyA9IF90aGlzLnJlbmRlclRhcmdldENvbG9yRWRnZXMuY2xvbmUoKTtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRXZWlnaHRzLnRleHR1cmUubmFtZSA9IFwiU01BQS5XZWlnaHRzXCI7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0V2VpZ2h0cy50ZXh0dXJlLmZvcm1hdCA9IFJHQkFGb3JtYXQ7XG4gICAgLyoqXHJcbiAgICAgKiBDb2xvciBlZGdlIGRldGVjdGlvbiBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0NvbG9yRWRnZXNNYXRlcmlhbH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLmNvbG9yRWRnZXNNYXRlcmlhbCA9IG5ldyBDb2xvckVkZ2VzTWF0ZXJpYWwoKTtcbiAgICAvKipcclxuICAgICAqIFNNQUEgd2VpZ2h0cyBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1NNQUFXZWlnaHRzTWF0ZXJpYWx9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy53ZWlnaHRzTWF0ZXJpYWwgPSBuZXcgU01BQVdlaWdodHNNYXRlcmlhbCgpO1xuICAgIF90aGlzLndlaWdodHNNYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IF90aGlzLnJlbmRlclRhcmdldENvbG9yRWRnZXMudGV4dHVyZTtcbiAgICAvKipcclxuICAgICAqIFRoZSBTTUFBIHNlYXJjaCB0ZXh0dXJlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtUZXh0dXJlfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMuc2VhcmNoVGV4dHVyZSA9IG5ldyBUZXh0dXJlKHNlYXJjaEltYWdlKTtcbiAgICBfdGhpcy5zZWFyY2hUZXh0dXJlLm5hbWUgPSBcIlNNQUEuU2VhcmNoXCI7XG4gICAgX3RoaXMuc2VhcmNoVGV4dHVyZS5tYWdGaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xuICAgIF90aGlzLnNlYXJjaFRleHR1cmUubWluRmlsdGVyID0gTmVhcmVzdEZpbHRlcjtcbiAgICBfdGhpcy5zZWFyY2hUZXh0dXJlLmZvcm1hdCA9IFJHQkFGb3JtYXQ7XG4gICAgX3RoaXMuc2VhcmNoVGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcbiAgICBfdGhpcy5zZWFyY2hUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICBfdGhpcy5zZWFyY2hUZXh0dXJlLmZsaXBZID0gZmFsc2U7XG4gICAgX3RoaXMud2VpZ2h0c01hdGVyaWFsLnVuaWZvcm1zLnRTZWFyY2gudmFsdWUgPSBfdGhpcy5zZWFyY2hUZXh0dXJlO1xuICAgIC8qKlxyXG4gICAgICogVGhlIFNNQUEgYXJlYSB0ZXh0dXJlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtUZXh0dXJlfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMuYXJlYVRleHR1cmUgPSBuZXcgVGV4dHVyZShhcmVhSW1hZ2UpO1xuICAgIF90aGlzLmFyZWFUZXh0dXJlLm5hbWUgPSBcIlNNQUEuQXJlYVwiO1xuICAgIF90aGlzLmFyZWFUZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcbiAgICBfdGhpcy5hcmVhVGV4dHVyZS5mb3JtYXQgPSBSR0JBRm9ybWF0O1xuICAgIF90aGlzLmFyZWFUZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuICAgIF90aGlzLmFyZWFUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICBfdGhpcy5hcmVhVGV4dHVyZS5mbGlwWSA9IGZhbHNlO1xuICAgIF90aGlzLndlaWdodHNNYXRlcmlhbC51bmlmb3Jtcy50QXJlYS52YWx1ZSA9IF90aGlzLmFyZWFUZXh0dXJlO1xuICAgIC8qKlxyXG4gICAgICogU01BQSBibGVuZCBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1NNQUFCbGVuZE1hdGVyaWFsfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMuYmxlbmRNYXRlcmlhbCA9IG5ldyBTTUFBQmxlbmRNYXRlcmlhbCgpO1xuICAgIF90aGlzLmJsZW5kTWF0ZXJpYWwudW5pZm9ybXMudFdlaWdodHMudmFsdWUgPSBfdGhpcy5yZW5kZXJUYXJnZXRXZWlnaHRzLnRleHR1cmU7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhTTUFBUGFzcywgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XG4gICAgICAvLyBEZXRlY3QgY29sb3IgZWRnZXMuXG4gICAgICB0aGlzLm1hdGVyaWFsID0gdGhpcy5jb2xvckVkZ2VzTWF0ZXJpYWw7XG4gICAgICB0aGlzLmNvbG9yRWRnZXNNYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XG4gICAgICB0aGlzLmNsZWFyUGFzcy5yZW5kZXIocmVuZGVyZXIsIHRoaXMucmVuZGVyVGFyZ2V0Q29sb3JFZGdlcyk7XG4gICAgICByZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVGFyZ2V0Q29sb3JFZGdlcyk7IC8vIENvbXB1dGUgZWRnZSB3ZWlnaHRzLlxuXG4gICAgICB0aGlzLm1hdGVyaWFsID0gdGhpcy53ZWlnaHRzTWF0ZXJpYWw7XG4gICAgICByZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVGFyZ2V0V2VpZ2h0cyk7IC8vIEFwcGx5IHRoZSBhbnRpYWxpYXNpbmcgZmlsdGVyIHRvIHRoZSBjb2xvcnMuXG5cbiAgICAgIHRoaXMubWF0ZXJpYWwgPSB0aGlzLmJsZW5kTWF0ZXJpYWw7XG4gICAgICB0aGlzLmJsZW5kTWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xuICAgICAgcmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFNpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICB0aGlzLnJlbmRlclRhcmdldENvbG9yRWRnZXMuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHRoaXMucmVuZGVyVGFyZ2V0V2VpZ2h0cy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5jb2xvckVkZ2VzTWF0ZXJpYWwudW5pZm9ybXMudGV4ZWxTaXplLnZhbHVlLmNvcHkodGhpcy53ZWlnaHRzTWF0ZXJpYWwudW5pZm9ybXMudGV4ZWxTaXplLnZhbHVlLmNvcHkodGhpcy5ibGVuZE1hdGVyaWFsLnVuaWZvcm1zLnRleGVsU2l6ZS52YWx1ZS5zZXQoMS4wIC8gd2lkdGgsIDEuMCAvIGhlaWdodCkpKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgU01BQSBzZWFyY2ggaW1hZ2UsIGVuY29kZWQgYXMgYSBiYXNlNjQgZGF0YSBVUkwuXHJcbiAgICAgKlxyXG4gICAgICogVXNlIHRoaXMgaW1hZ2UgZGF0YSB0byBjcmVhdGUgYW4gSW1hZ2UgaW5zdGFuY2UgYW5kIHVzZSBpdCB0b2dldGhlciB3aXRoXHJcbiAgICAgKiB0aGUgYXJlYSBpbWFnZSB0byBjcmVhdGUgYW4gU01BQVBhc3MuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1N0cmluZ31cclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBjb25zdCBzZWFyY2hJbWFnZSA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICogc2VhcmNoSW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgcHJvZ3Jlc3MpO1xyXG4gICAgICogc2VhcmNoSW1hZ2Uuc3JjID0gU01BQVBhc3Muc2VhcmNoSW1hZ2VEYXRhVVJMO1xyXG4gICAgICovXG5cbiAgfV0sIFt7XG4gICAga2V5OiBcInNlYXJjaEltYWdlRGF0YVVSTFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHNlYXJjaEltYWdlRGF0YVVSTDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgU01BQSBhcmVhIGltYWdlLCBlbmNvZGVkIGFzIGEgYmFzZTY0IGRhdGEgVVJMLlxyXG4gICAgICpcclxuICAgICAqIFVzZSB0aGlzIGltYWdlIGRhdGEgdG8gY3JlYXRlIGFuIEltYWdlIGluc3RhbmNlIGFuZCB1c2UgaXQgdG9nZXRoZXIgd2l0aFxyXG4gICAgICogdGhlIHNlYXJjaCBpbWFnZSB0byBjcmVhdGUgYW4gU01BQVBhc3MuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1N0cmluZ31cclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBjb25zdCBhcmVhSW1hZ2UgPSBuZXcgSW1hZ2UoKTtcclxuICAgICAqIGFyZWFJbWFnZS5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCBwcm9ncmVzcyk7XHJcbiAgICAgKiBhcmVhSW1hZ2Uuc3JjID0gU01BQVBhc3MuYXJlYUltYWdlRGF0YVVSTDtcclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYXJlYUltYWdlRGF0YVVSTFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGFyZWFJbWFnZURhdGFVUkw7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoU01BQVBhc3MsIF9QYXNzKTtcblxuICByZXR1cm4gU01BQVBhc3M7XG59KFBhc3MpO1xuXG4vKipcclxuICogQSBwYXNzIHRoYXQgcmVuZGVycyBhIGdpdmVuIHRleHR1cmUuXHJcbiAqL1xuXG52YXIgVGV4dHVyZVBhc3MgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9QYXNzKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgdGV4dHVyZSBwYXNzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcGFjaXR5PTEuMF0gLSBUaGUgdGV4dHVyZSBvcGFjaXR5LlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3NjcmVlbk1vZGU9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBzY3JlZW4gYmxlbmQgbW9kZSBzaG91bGQgYmUgdXNlZCBmb3IgY29tYmluaW5nIHRoZSB0ZXh0dXJlIHdpdGggdGhlIHNjZW5lIGNvbG9ycy5cclxuICAgKi9cbiAgZnVuY3Rpb24gVGV4dHVyZVBhc3ModGV4dHVyZSkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBvcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAxLjA7XG4gICAgdmFyIHNjcmVlbk1vZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHRydWU7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBUZXh0dXJlUGFzcyk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihUZXh0dXJlUGFzcykuY2FsbCh0aGlzLCBcIlRleHR1cmVQYXNzXCIpKTtcbiAgICBfdGhpcy5tYXRlcmlhbCA9IG5ldyBDb21iaW5lTWF0ZXJpYWwoc2NyZWVuTW9kZSk7XG4gICAgX3RoaXMudGV4dHVyZSA9IHRleHR1cmU7XG4gICAgX3RoaXMub3BhY2l0eVNvdXJjZSA9IG9wYWNpdHk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIFRoZSB0ZXh0dXJlLlxyXG4gICAqXHJcbiAgICogQHR5cGUge1RleHR1cmV9XHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhUZXh0dXJlUGFzcywgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG5cbiAgICAvKipcclxuICAgICAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcbiAgICAgIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudGV4dHVyZTEudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xuICAgICAgcmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRleHR1cmVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnRleHR1cmUyLnZhbHVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEB0eXBlIHtUZXh0dXJlfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnRleHR1cmUyLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVGhlIG9wYWNpdHkgb2YgdGhlIGlucHV0IGJ1ZmZlci5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgZGVzdGluYXRpb24gY29sb3IgaXMgdGhlIGNvbG9yIGZyb20gdGhlIGltYWdlIGluIHRoZSBpbnB1dCBidWZmZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwib3BhY2l0eURlc3RpbmF0aW9uXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5vcGFjaXR5MS52YWx1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAxLjA7XG4gICAgICB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLm9wYWNpdHkxLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVGhlIG9wYWNpdHkgb2YgdGhlIHRleHR1cmUuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIHNvdXJjZSBjb2xvciBpcyB0aGUgY29sb3IgZnJvbSB0aGUgdGV4dHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvcGFjaXR5U291cmNlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5vcGFjaXR5Mi52YWx1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAxLjA7XG4gICAgICB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLm9wYWNpdHkyLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoVGV4dHVyZVBhc3MsIF9QYXNzKTtcblxuICByZXR1cm4gVGV4dHVyZVBhc3M7XG59KFBhc3MpO1xuXG4vKipcclxuICogQSB0b25lIG1hcHBpbmcgcGFzcyB0aGF0IHN1cHBvcnRzIGFkYXB0aXZlIGx1bWlub3NpdHkuXHJcbiAqXHJcbiAqIElmIGFkYXB0aXZpdHkgaXMgZW5hYmxlZCwgdGhpcyBwYXNzIGdlbmVyYXRlcyBhIHRleHR1cmUgdGhhdCByZXByZXNlbnRzIHRoZVxyXG4gKiBsdW1pbm9zaXR5IG9mIHRoZSBjdXJyZW50IHNjZW5lIGFuZCBhZGp1c3RzIGl0IG92ZXIgdGltZSB0byBzaW11bGF0ZSB0aGVcclxuICogb3B0aWMgbmVydmUgcmVzcG9uZGluZyB0byB0aGUgYW1vdW50IG9mIGxpZ2h0IGl0IGlzIHJlY2VpdmluZy5cclxuICpcclxuICogUmVmZXJlbmNlOlxyXG4gKiAgR0RDMjAwNyAtIFdvbGZnYW5nIEVuZ2VsLCBQb3N0LVByb2Nlc3NpbmcgUGlwZWxpbmVcclxuICogIGh0dHA6Ly9wZXJzby51bml2LWx5b24xLmZyL2plYW4tY2xhdWRlLmllaGwvUHVibGljL2VkdWMvR0FNQS8yMDA3L2dkYzA3L1Bvc3QtUHJvY2Vzc2luZ19QaXBlbGluZS5wZGZcclxuICovXG5cbnZhciBUb25lTWFwcGluZ1Bhc3MgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9QYXNzKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgdG9uZSBtYXBwaW5nIHBhc3MuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hZGFwdGl2ZT10cnVlXSAtIFdoZXRoZXIgdGhlIHRvbmUgbWFwcGluZyBzaG91bGQgdXNlIGFuIGFkYXB0aXZlIGx1bWluYW5jZSBtYXAuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnJlc29sdXRpb249MjU2XSAtIFRoZSByZW5kZXIgdGV4dHVyZSByZXNvbHV0aW9uLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kaXN0aW5jdGlvbj0xLjBdIC0gQSBsdW1pbmFuY2UgZGlzdGluY3Rpb24gZmFjdG9yLlxyXG4gICAqL1xuICBmdW5jdGlvbiBUb25lTWFwcGluZ1Bhc3MoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVG9uZU1hcHBpbmdQYXNzKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFRvbmVNYXBwaW5nUGFzcykuY2FsbCh0aGlzLCBcIlRvbmVNYXBwaW5nUGFzc1wiKSk7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcmVuZGVyIHRhcmdldCBmb3IgdGhlIGN1cnJlbnQgbHVtaW5vc2l0eS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHRvZG8gVXNlIFJFRCBmb3JtYXQgaW4gV2ViR0wgMi4wLlxyXG4gICAgICovXG5cbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRMdW1pbm9zaXR5ID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KDEsIDEsIHtcbiAgICAgIG1pbkZpbHRlcjogTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyLFxuICAgICAgbWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG4gICAgICBmb3JtYXQ6IFJHQkZvcm1hdCxcbiAgICAgIHN0ZW5jaWxCdWZmZXI6IGZhbHNlLFxuICAgICAgZGVwdGhCdWZmZXI6IGZhbHNlXG4gICAgfSk7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0THVtaW5vc2l0eS50ZXh0dXJlLm5hbWUgPSBcIlRvbmVNYXBwaW5nLkx1bWlub3NpdHlcIjtcbiAgICAvKipcclxuICAgICAqIFRoZSByZW5kZXIgdGFyZ2V0IGZvciBhZGFwdGVkIGx1bWlub3NpdHkuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0QWRhcHRlZCA9IF90aGlzLnJlbmRlclRhcmdldEx1bWlub3NpdHkuY2xvbmUoKTtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRBZGFwdGVkLnRleHR1cmUubmFtZSA9IFwiVG9uZU1hcHBpbmcuQWRhcHRlZEx1bWlub3NpdHlcIjtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRBZGFwdGVkLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0QWRhcHRlZC50ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcbiAgICAvKipcclxuICAgICAqIEEgcmVuZGVyIHRhcmdldCB0aGF0IGhvbGRzIGEgY29weSBvZiB0aGUgYWRhcHRlZCBsaW1vbm9zaXR5LlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnJlbmRlclRhcmdldFByZXZpb3VzID0gX3RoaXMucmVuZGVyVGFyZ2V0QWRhcHRlZC5jbG9uZSgpO1xuICAgIF90aGlzLnJlbmRlclRhcmdldFByZXZpb3VzLnRleHR1cmUubmFtZSA9IFwiVG9uZU1hcHBpbmcuUHJldmlvdXNMdW1pbm9zaXR5XCI7XG4gICAgLyoqXHJcbiAgICAgKiBDb3B5IHNoYWRlciBtYXRlcmlhbCB1c2VkIGZvciBzYXZpbmcgdGhlIGx1bWluYW5jZSBtYXAuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0NvcHlNYXRlcmlhbH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLmNvcHlNYXRlcmlhbCA9IG5ldyBDb3B5TWF0ZXJpYWwoKTtcbiAgICAvKipcclxuICAgICAqIEEgbHVtaW5vc2l0eSBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0x1bWlub3NpdHlNYXRlcmlhbH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLmx1bWlub3NpdHlNYXRlcmlhbCA9IG5ldyBMdW1pbm9zaXR5TWF0ZXJpYWwoKTtcbiAgICBfdGhpcy5sdW1pbm9zaXR5TWF0ZXJpYWwudW5pZm9ybXMuZGlzdGluY3Rpb24udmFsdWUgPSBvcHRpb25zLmRpc3RpbmN0aW9uICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmRpc3RpbmN0aW9uIDogMS4wO1xuICAgIC8qKlxyXG4gICAgICogQW4gYWRhcHRpdmUgbHVtaW5hbmNlIHNoYWRlciBtYXRlcmlhbC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7QWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWx9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5hZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbCA9IG5ldyBBZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbCgpO1xuICAgIF90aGlzLnJlc29sdXRpb24gPSBvcHRpb25zLnJlc29sdXRpb247XG4gICAgLyoqXHJcbiAgICAgKiBBIHRvbmUgbWFwcGluZyBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1RvbmVNYXBwaW5nTWF0ZXJpYWx9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy50b25lTWFwcGluZ01hdGVyaWFsID0gbmV3IFRvbmVNYXBwaW5nTWF0ZXJpYWwoKTtcbiAgICBfdGhpcy5hZGFwdGl2ZSA9IG9wdGlvbnMuYWRhcHRpdmU7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIFRoZSByZXNvbHV0aW9uIG9mIHRoZSByZW5kZXIgdGFyZ2V0cy5cclxuICAgKlxyXG4gICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhUb25lTWFwcGluZ1Bhc3MsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuXG4gICAgLyoqXHJcbiAgICAgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XG4gICAgICB2YXIgc2NlbmUgPSB0aGlzLnNjZW5lO1xuICAgICAgdmFyIGNhbWVyYSA9IHRoaXMuY2FtZXJhO1xuICAgICAgdmFyIGFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsID0gdGhpcy5hZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbDtcbiAgICAgIHZhciBsdW1pbm9zaXR5TWF0ZXJpYWwgPSB0aGlzLmx1bWlub3NpdHlNYXRlcmlhbDtcbiAgICAgIHZhciB0b25lTWFwcGluZ01hdGVyaWFsID0gdGhpcy50b25lTWFwcGluZ01hdGVyaWFsO1xuICAgICAgdmFyIGNvcHlNYXRlcmlhbCA9IHRoaXMuY29weU1hdGVyaWFsO1xuICAgICAgdmFyIHJlbmRlclRhcmdldFByZXZpb3VzID0gdGhpcy5yZW5kZXJUYXJnZXRQcmV2aW91cztcbiAgICAgIHZhciByZW5kZXJUYXJnZXRMdW1pbm9zaXR5ID0gdGhpcy5yZW5kZXJUYXJnZXRMdW1pbm9zaXR5O1xuICAgICAgdmFyIHJlbmRlclRhcmdldEFkYXB0ZWQgPSB0aGlzLnJlbmRlclRhcmdldEFkYXB0ZWQ7XG5cbiAgICAgIGlmICh0aGlzLmFkYXB0aXZlKSB7XG4gICAgICAgIC8vIFJlbmRlciB0aGUgbHVtaW5hbmNlIG9mIHRoZSBjdXJyZW50IHNjZW5lIGludG8gYSByZW5kZXIgdGFyZ2V0IHdpdGggbWlwbWFwcGluZyBlbmFibGVkLlxuICAgICAgICB0aGlzLm1hdGVyaWFsID0gbHVtaW5vc2l0eU1hdGVyaWFsO1xuICAgICAgICBsdW1pbm9zaXR5TWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xuICAgICAgICByZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYSwgcmVuZGVyVGFyZ2V0THVtaW5vc2l0eSk7IC8vIFVzZSB0aGUgbmV3IGx1bWluYW5jZSB2YWx1ZXMsIHRoZSBwcmV2aW91cyBsdW1pbmFuY2UgYW5kIHRoZSBmcmFtZSBkZWx0YSB0byBhZGFwdCB0aGUgbHVtaW5hbmNlIG92ZXIgdGltZS5cblxuICAgICAgICB0aGlzLm1hdGVyaWFsID0gYWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWw7XG4gICAgICAgIGFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsLnVuaWZvcm1zLmRlbHRhLnZhbHVlID0gZGVsdGE7XG4gICAgICAgIGFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsLnVuaWZvcm1zLnRQcmV2aW91c0x1bS52YWx1ZSA9IHJlbmRlclRhcmdldFByZXZpb3VzLnRleHR1cmU7XG4gICAgICAgIGFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsLnVuaWZvcm1zLnRDdXJyZW50THVtLnZhbHVlID0gcmVuZGVyVGFyZ2V0THVtaW5vc2l0eS50ZXh0dXJlO1xuICAgICAgICByZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYSwgcmVuZGVyVGFyZ2V0QWRhcHRlZCk7IC8vIENvcHkgdGhlIG5ldyBhZGFwdGVkIGx1bWluYW5jZSB2YWx1ZSBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGJ5IHRoZSBuZXh0IGZyYW1lLlxuXG4gICAgICAgIHRoaXMubWF0ZXJpYWwgPSBjb3B5TWF0ZXJpYWw7XG4gICAgICAgIGNvcHlNYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IHJlbmRlclRhcmdldEFkYXB0ZWQudGV4dHVyZTtcbiAgICAgICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldFByZXZpb3VzKTtcbiAgICAgIH0gLy8gQXBwbHkgdGhlIHRvbmUgbWFwcGluZyB0byB0aGUgY29sb3Vycy5cblxuXG4gICAgICB0aGlzLm1hdGVyaWFsID0gdG9uZU1hcHBpbmdNYXRlcmlhbDtcbiAgICAgIHRvbmVNYXBwaW5nTWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xuICAgICAgcmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gdGFza3MuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYWxwaGEgLSBXaGV0aGVyIHRoZSByZW5kZXJlciB1c2VzIHRoZSBhbHBoYSBjaGFubmVsIG9yIG5vdC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW5pdGlhbGl6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSkge1xuICAgICAgdGhpcy5tYXRlcmlhbCA9IG5ldyBNZXNoQmFzaWNNYXRlcmlhbCh7XG4gICAgICAgIGNvbG9yOiAweDdmZmZmZlxuICAgICAgfSk7XG4gICAgICByZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVGFyZ2V0UHJldmlvdXMpO1xuICAgICAgdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlc29sdXRpb25cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlclRhcmdldEx1bWlub3NpdHkud2lkdGg7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVGhlIHJlc29sdXRpb24gb2YgdGhlIHJlbmRlciB0YXJnZXRzLiBNdXN0IGJlIGEgcG93ZXIgb2YgdHdvIGZvciBtaXBtYXBzLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDI1NjtcbiAgICAgIC8vIFJvdW5kIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgbmV4dCBwb3dlciBvZiB0d28uXG4gICAgICB2YXIgZXhwb25lbnQgPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoTWF0aC5sb2cyKHZhbHVlKSkpO1xuICAgICAgdmFsdWUgPSBNYXRoLnBvdygyLCBleHBvbmVudCk7XG4gICAgICB0aGlzLnJlbmRlclRhcmdldEx1bWlub3NpdHkuc2V0U2l6ZSh2YWx1ZSwgdmFsdWUpO1xuICAgICAgdGhpcy5yZW5kZXJUYXJnZXRQcmV2aW91cy5zZXRTaXplKHZhbHVlLCB2YWx1ZSk7XG4gICAgICB0aGlzLnJlbmRlclRhcmdldEFkYXB0ZWQuc2V0U2l6ZSh2YWx1ZSwgdmFsdWUpO1xuICAgICAgdGhpcy5hZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbC5kZWZpbmVzLk1JUF9MRVZFTF8xWDEgPSBleHBvbmVudC50b0ZpeGVkKDEpO1xuICAgICAgdGhpcy5hZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB0aGlzIHBhc3MgdXNlcyBhZGFwdGl2ZSBsdW1pbm9zaXR5LlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJhZGFwdGl2ZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9uZU1hcHBpbmdNYXRlcmlhbC5kZWZpbmVzLkFEQVBURURfTFVNSU5BTkNFICE9PSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB0aGlzIHBhc3Mgc2hvdWxkIHVzZSBhZGFwdGl2ZSBsdW1pbm9zaXR5LlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlO1xuXG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy50b25lTWFwcGluZ01hdGVyaWFsLmRlZmluZXMuQURBUFRFRF9MVU1JTkFOQ0UgPSBcIjFcIjtcbiAgICAgICAgdGhpcy50b25lTWFwcGluZ01hdGVyaWFsLnVuaWZvcm1zLmx1bWluYW5jZU1hcC52YWx1ZSA9IHRoaXMucmVuZGVyVGFyZ2V0QWRhcHRlZC50ZXh0dXJlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMudG9uZU1hcHBpbmdNYXRlcmlhbC5kZWZpbmVzLkFEQVBURURfTFVNSU5BTkNFO1xuICAgICAgICB0aGlzLnRvbmVNYXBwaW5nTWF0ZXJpYWwudW5pZm9ybXMubHVtaW5hbmNlTWFwLnZhbHVlID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdGhpcy50b25lTWFwcGluZ01hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBkaXRoZXJpbmcgaXMgZW5hYmxlZC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGl0aGVyaW5nXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy50b25lTWFwcGluZ01hdGVyaWFsLmRpdGhlcmluZztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBJZiBlbmFibGVkLCB0aGUgcmVzdWx0IHdpbGwgYmUgZGl0aGVyZWQgdG8gcmVtb3ZlIGJhbmRpbmcgYXJ0aWZhY3RzLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5kaXRoZXJpbmcgIT09IHZhbHVlKSB7XG4gICAgICAgIHRoaXMudG9uZU1hcHBpbmdNYXRlcmlhbC5kaXRoZXJpbmcgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy50b25lTWFwcGluZ01hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhUb25lTWFwcGluZ1Bhc3MsIF9QYXNzKTtcblxuICByZXR1cm4gVG9uZU1hcHBpbmdQYXNzO1xufShQYXNzKTtcblxuLyoqXHJcbiAqIEEgY29tcGlsYXRpb24gb2YgdGhlIHBvc3QgcHJvY2Vzc2luZyBwYXNzZXMuXHJcbiAqXHJcbiAqIEBtb2R1bGUgcG9zdHByb2Nlc3NpbmcvcGFzc2VzXHJcbiAqL1xuXG4vKipcclxuICogVGhlIEVmZmVjdENvbXBvc2VyIG1heSBiZSB1c2VkIGluIHBsYWNlIG9mIGEgbm9ybWFsIFdlYkdMUmVuZGVyZXIuXHJcbiAqXHJcbiAqIFRoZSBhdXRvIGNsZWFyIGJlaGF2aW91ciBvZiB0aGUgcHJvdmlkZWQgcmVuZGVyZXIgd2lsbCBiZSBkaXNhYmxlZCB0byBwcmV2ZW50XHJcbiAqIHVubmVjZXNzYXJ5IGNsZWFyIG9wZXJhdGlvbnMuXHJcbiAqXHJcbiAqIEl0IGlzIGNvbW1vbiBwcmFjdGljZSB0byB1c2UgYSB7QGxpbmsgUmVuZGVyUGFzc30gYXMgdGhlIGZpcnN0IHBhc3MgdG9cclxuICogYXV0b21hdGljYWxseSBjbGVhciB0aGUgc2NyZWVuIGFuZCByZW5kZXIgdGhlIHNjZW5lIHRvIGEgdGV4dHVyZSBmb3IgZnVydGhlclxyXG4gKiBwcm9jZXNzaW5nLlxyXG4gKlxyXG4gKiBAaW1wbGVtZW50cyB7UmVzaXphYmxlfVxyXG4gKiBAaW1wbGVtZW50cyB7RGlzcG9zYWJsZX1cclxuICovXG5cbnZhciBFZmZlY3RDb21wb3NlciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgZWZmZWN0IGNvbXBvc2VyLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSBbcmVuZGVyZXJdIC0gVGhlIHJlbmRlcmVyIHRoYXQgc2hvdWxkIGJlIHVzZWQuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZGVwdGhCdWZmZXI9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBtYWluIHJlbmRlciB0YXJnZXRzIHNob3VsZCBoYXZlIGEgZGVwdGggYnVmZmVyLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc3RlbmNpbEJ1ZmZlcj1mYWxzZV0gLSBXaGV0aGVyIHRoZSBtYWluIHJlbmRlciB0YXJnZXRzIHNob3VsZCBoYXZlIGEgc3RlbmNpbCBidWZmZXIuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5kZXB0aFRleHR1cmU9ZmFsc2VdIC0gU2V0IHRvIHRydWUgaWYgb25lIG9mIHlvdXIgcGFzc2VzIHJlbGllcyBvbiBhIGRlcHRoIHRleHR1cmUuXHJcbiAgICovXG4gIGZ1bmN0aW9uIEVmZmVjdENvbXBvc2VyKCkge1xuICAgIHZhciByZW5kZXJlciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbnVsbDtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBFZmZlY3RDb21wb3Nlcik7XG5cbiAgICAvKipcclxuICAgICAqIFRoZSByZW5kZXJlci5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgbWF5IHJlcGxhY2UgdGhlIHJlbmRlcmVyIGF0IGFueSB0aW1lIGJ5IHVzaW5nXHJcbiAgICAgKiB7QGxpbmsgRWZmZWN0Q29tcG9zZXIjcmVwbGFjZVJlbmRlcmVyfS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7V2ViR0xSZW5kZXJlcn1cclxuICAgICAqL1xuICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAvKipcclxuICAgICAqIFRoZSBpbnB1dCBidWZmZXIuXHJcbiAgICAgKlxyXG4gICAgICogUmVhZGluZyBmcm9tIGFuZCB3cml0aW5nIHRvIHRoZSBzYW1lIHJlbmRlciB0YXJnZXQgc2hvdWxkIGJlIGF2b2lkZWQuXHJcbiAgICAgKiBUaGVyZWZvcmUsIHR3byBzZXBlcmF0ZSB5ZXQgaWRlbnRpY2FsIGJ1ZmZlcnMgYXJlIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgdGhpcy5pbnB1dEJ1ZmZlciA9IG51bGw7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb3V0cHV0IGJ1ZmZlci5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLm91dHB1dEJ1ZmZlciA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5yZW5kZXJlciAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5hdXRvQ2xlYXIgPSBmYWxzZTtcbiAgICAgIHRoaXMuaW5wdXRCdWZmZXIgPSB0aGlzLmNyZWF0ZUJ1ZmZlcihvcHRpb25zLmRlcHRoQnVmZmVyICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmRlcHRoQnVmZmVyIDogdHJ1ZSwgb3B0aW9ucy5zdGVuY2lsQnVmZmVyICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnN0ZW5jaWxCdWZmZXIgOiBmYWxzZSwgb3B0aW9ucy5kZXB0aFRleHR1cmUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVwdGhUZXh0dXJlIDogZmFsc2UpO1xuICAgICAgdGhpcy5vdXRwdXRCdWZmZXIgPSB0aGlzLmlucHV0QnVmZmVyLmNsb25lKCk7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogQSBjb3B5IHBhc3MgdXNlZCBmb3IgY29weWluZyBtYXNrZWQgc2NlbmVzLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtTaGFkZXJQYXNzfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG5cbiAgICB0aGlzLmNvcHlQYXNzID0gbmV3IFNoYWRlclBhc3MobmV3IENvcHlNYXRlcmlhbCgpKTtcbiAgICAvKipcclxuICAgICAqIFRoZSBwYXNzZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1Bhc3NbXX1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIHRoaXMucGFzc2VzID0gW107XG4gIH1cbiAgLyoqXHJcbiAgICogVGhlIGRlcHRoIHRleHR1cmUgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycy5cclxuICAgKlxyXG4gICAqIEB0eXBlIHtEZXB0aFRleHR1cmV9XHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhFZmZlY3RDb21wb3NlciwgW3tcbiAgICBrZXk6IFwicmVwbGFjZVJlbmRlcmVyXCIsXG5cbiAgICAvKipcclxuICAgICAqIFJlcGxhY2VzIHRoZSBjdXJyZW50IHJlbmRlcmVyIHdpdGggdGhlIGdpdmVuIG9uZS4gVGhlIERPTSBlbGVtZW50IG9mIHRoZVxyXG4gICAgICogY3VycmVudCByZW5kZXJlciB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQgbm9kZSBhbmQgdGhlXHJcbiAgICAgKiBET00gZWxlbWVudCBvZiB0aGUgbmV3IHJlbmRlcmVyIHdpbGwgdGFrZSBpdHMgcGxhY2UuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGF1dG8gY2xlYXIgbWVjaGFuaXNtIG9mIHRoZSBwcm92aWRlZCByZW5kZXJlciB3aWxsIGJlIGRpc2FibGVkLlxyXG4gICAgICpcclxuICAgICAqIFN3aXRjaGluZyBiZXR3ZWVuIHJlbmRlcmVycyBhbGxvd3MgeW91IHRvIGR5bmFtaWNhbGx5IGVuYWJsZSBvciBkaXNhYmxlXHJcbiAgICAgKiBhbnRpYWxpYXNpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSBuZXcgcmVuZGVyZXIuXHJcbiAgICAgKiBAcmV0dXJuIHtXZWJHTFJlbmRlcmVyfSBUaGUgb2xkIHJlbmRlcmVyLlxyXG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlcGxhY2VSZW5kZXJlcihyZW5kZXJlcikge1xuICAgICAgdmFyIG9sZFJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcjtcbiAgICAgIHZhciBwYXJlbnQsIG9sZFNpemUsIG5ld1NpemU7XG5cbiAgICAgIGlmIChvbGRSZW5kZXJlciAhPT0gbnVsbCAmJiBvbGRSZW5kZXJlciAhPT0gcmVuZGVyZXIpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmF1dG9DbGVhciA9IGZhbHNlO1xuICAgICAgICBwYXJlbnQgPSBvbGRSZW5kZXJlci5kb21FbGVtZW50LnBhcmVudE5vZGU7XG4gICAgICAgIG9sZFNpemUgPSBvbGRSZW5kZXJlci5nZXRTaXplKCk7XG4gICAgICAgIG5ld1NpemUgPSByZW5kZXJlci5nZXRTaXplKCk7XG5cbiAgICAgICAgaWYgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChvbGRSZW5kZXJlci5kb21FbGVtZW50KTtcbiAgICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQocmVuZGVyZXIuZG9tRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob2xkU2l6ZS53aWR0aCAhPT0gbmV3U2l6ZS53aWR0aCB8fCBvbGRTaXplLmhlaWdodCAhPT0gbmV3U2l6ZS5oZWlnaHQpIHtcbiAgICAgICAgICB0aGlzLnNldFNpemUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2xkUmVuZGVyZXI7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyByZW5kZXIgdGFyZ2V0IGJ5IHJlcGxpY2F0aW5nIHRoZSByZW5kZXJlcidzIGNhbnZhcy5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgY3JlYXRlZCByZW5kZXIgdGFyZ2V0IHVzZXMgYSBsaW5lYXIgZmlsdGVyIGZvciB0ZXhlbCBtaW5pZmljYXRpb24gYW5kXHJcbiAgICAgKiBtYWduaWZpY2F0aW9uLiBJdHMgcmVuZGVyIHRleHR1cmUgZm9ybWF0IGRlcGVuZHMgb24gd2hldGhlciB0aGUgcmVuZGVyZXJcclxuICAgICAqIHVzZXMgdGhlIGFscGhhIGNoYW5uZWwuIE1pcG1hcHMgYXJlIGRpc2FibGVkLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVwdGhCdWZmZXIgLSBXaGV0aGVyIHRoZSByZW5kZXIgdGFyZ2V0IHNob3VsZCBoYXZlIGEgZGVwdGggYnVmZmVyLlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBzdGVuY2lsQnVmZmVyIC0gV2hldGhlciB0aGUgcmVuZGVyIHRhcmdldCBzaG91bGQgaGF2ZSBhIHN0ZW5jaWwgYnVmZmVyLlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBkZXB0aFRleHR1cmUgLSBXaGV0aGVyIHRoZSByZW5kZXIgdGFyZ2V0IHNob3VsZCBoYXZlIGEgZGVwdGggdGV4dHVyZS5cclxuICAgICAqIEByZXR1cm4ge1dlYkdMUmVuZGVyVGFyZ2V0fSBBIG5ldyByZW5kZXIgdGFyZ2V0IHRoYXQgZXF1YWxzIHRoZSByZW5kZXJlcidzIGNhbnZhcy5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiY3JlYXRlQnVmZmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlcihkZXB0aEJ1ZmZlciwgc3RlbmNpbEJ1ZmZlciwgZGVwdGhUZXh0dXJlKSB7XG4gICAgICB2YXIgZHJhd2luZ0J1ZmZlclNpemUgPSB0aGlzLnJlbmRlcmVyLmdldERyYXdpbmdCdWZmZXJTaXplKCk7XG4gICAgICB2YXIgYWxwaGEgPSB0aGlzLnJlbmRlcmVyLmNvbnRleHQuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKS5hbHBoYTtcbiAgICAgIHZhciByZW5kZXJUYXJnZXQgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoZHJhd2luZ0J1ZmZlclNpemUud2lkdGgsIGRyYXdpbmdCdWZmZXJTaXplLmhlaWdodCwge1xuICAgICAgICBtaW5GaWx0ZXI6IExpbmVhckZpbHRlcixcbiAgICAgICAgbWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG4gICAgICAgIGZvcm1hdDogYWxwaGEgPyBSR0JBRm9ybWF0IDogUkdCRm9ybWF0LFxuICAgICAgICBkZXB0aEJ1ZmZlcjogZGVwdGhCdWZmZXIsXG4gICAgICAgIHN0ZW5jaWxCdWZmZXI6IHN0ZW5jaWxCdWZmZXIsXG4gICAgICAgIGRlcHRoVGV4dHVyZTogZGVwdGhUZXh0dXJlID8gbmV3IERlcHRoVGV4dHVyZSgpIDogbnVsbFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChkZXB0aFRleHR1cmUgJiYgc3RlbmNpbEJ1ZmZlcikge1xuICAgICAgICByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmZvcm1hdCA9IERlcHRoU3RlbmNpbEZvcm1hdDtcbiAgICAgICAgcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS50eXBlID0gVW5zaWduZWRJbnQyNDhUeXBlO1xuICAgICAgfVxuXG4gICAgICByZW5kZXJUYXJnZXQudGV4dHVyZS5uYW1lID0gXCJFZmZlY3RDb21wb3Nlci5CdWZmZXJcIjtcbiAgICAgIHJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHJlbmRlclRhcmdldDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgcGFzcywgb3B0aW9uYWxseSBhdCBhIHNwZWNpZmljIGluZGV4LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGFzc30gcGFzcyAtIEEgbmV3IHBhc3MuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW2luZGV4XSAtIEFuIGluZGV4IGF0IHdoaWNoIHRoZSBwYXNzIHNob3VsZCBiZSBpbnNlcnRlZC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkUGFzc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRQYXNzKHBhc3MsIGluZGV4KSB7XG4gICAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyO1xuICAgICAgdmFyIGRyYXdpbmdCdWZmZXJTaXplID0gcmVuZGVyZXIuZ2V0RHJhd2luZ0J1ZmZlclNpemUoKTtcbiAgICAgIHBhc3Muc2V0U2l6ZShkcmF3aW5nQnVmZmVyU2l6ZS53aWR0aCwgZHJhd2luZ0J1ZmZlclNpemUuaGVpZ2h0KTtcbiAgICAgIHBhc3MuaW5pdGlhbGl6ZShyZW5kZXJlciwgcmVuZGVyZXIuY29udGV4dC5nZXRDb250ZXh0QXR0cmlidXRlcygpLmFscGhhKTtcblxuICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5wYXNzZXMuc3BsaWNlKGluZGV4LCAwLCBwYXNzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucGFzc2VzLnB1c2gocGFzcyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIHBhc3MuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQYXNzfSBwYXNzIC0gVGhlIHBhc3MuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZVBhc3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlUGFzcyhwYXNzKSB7XG4gICAgICB0aGlzLnBhc3Nlcy5zcGxpY2UodGhpcy5wYXNzZXMuaW5kZXhPZihwYXNzKSwgMSk7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmVuZGVycyBhbGwgZW5hYmxlZCBwYXNzZXMgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSBhZGRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZGVsdGEgLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcihkZWx0YSkge1xuICAgICAgdmFyIHBhc3NlcyA9IHRoaXMucGFzc2VzO1xuICAgICAgdmFyIGNvcHlQYXNzID0gdGhpcy5jb3B5UGFzcztcbiAgICAgIHZhciByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XG4gICAgICB2YXIgaW5wdXRCdWZmZXIgPSB0aGlzLmlucHV0QnVmZmVyO1xuICAgICAgdmFyIG91dHB1dEJ1ZmZlciA9IHRoaXMub3V0cHV0QnVmZmVyO1xuICAgICAgdmFyIHN0ZW5jaWxUZXN0ID0gZmFsc2U7XG4gICAgICB2YXIgcGFzcywgY29udGV4dCwgc3RhdGUsIGJ1ZmZlcjtcbiAgICAgIHZhciBpLCBsO1xuXG4gICAgICBmb3IgKGkgPSAwLCBsID0gcGFzc2VzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICBwYXNzID0gcGFzc2VzW2ldO1xuXG4gICAgICAgIGlmIChwYXNzLmVuYWJsZWQpIHtcbiAgICAgICAgICBwYXNzLnJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KTtcblxuICAgICAgICAgIGlmIChwYXNzLm5lZWRzU3dhcCkge1xuICAgICAgICAgICAgaWYgKHN0ZW5jaWxUZXN0KSB7XG4gICAgICAgICAgICAgIGNvcHlQYXNzLnJlbmRlclRvU2NyZWVuID0gcGFzcy5yZW5kZXJUb1NjcmVlbjtcbiAgICAgICAgICAgICAgY29udGV4dCA9IHJlbmRlcmVyLmNvbnRleHQ7XG4gICAgICAgICAgICAgIHN0YXRlID0gcmVuZGVyZXIuc3RhdGU7IC8vIFByZXNlcnZlIHRoZSB1bmFmZmVjdGVkIHBpeGVscy5cblxuICAgICAgICAgICAgICBzdGF0ZS5idWZmZXJzLnN0ZW5jaWwuc2V0RnVuYyhjb250ZXh0Lk5PVEVRVUFMLCAxLCAweGZmZmZmZmZmKTtcbiAgICAgICAgICAgICAgY29weVBhc3MucmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpO1xuICAgICAgICAgICAgICBzdGF0ZS5idWZmZXJzLnN0ZW5jaWwuc2V0RnVuYyhjb250ZXh0LkVRVUFMLCAxLCAweGZmZmZmZmZmKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnVmZmVyID0gaW5wdXRCdWZmZXI7XG4gICAgICAgICAgICBpbnB1dEJ1ZmZlciA9IG91dHB1dEJ1ZmZlcjtcbiAgICAgICAgICAgIG91dHB1dEJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocGFzcyBpbnN0YW5jZW9mIE1hc2tQYXNzKSB7XG4gICAgICAgICAgICBzdGVuY2lsVGVzdCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChwYXNzIGluc3RhbmNlb2YgQ2xlYXJNYXNrUGFzcykge1xuICAgICAgICAgICAgc3RlbmNpbFRlc3QgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBidWZmZXJzIGFuZCB0aGUgcmVuZGVyZXIncyBvdXRwdXQgY2FudmFzLlxyXG4gICAgICpcclxuICAgICAqIEV2ZXJ5IHBhc3Mgd2lsbCBiZSBpbmZvcm1lZCBvZiB0aGUgbmV3IHNpemUuIEl0J3MgdXAgdG8gZWFjaCBwYXNzIGhvdyB0aGF0XHJcbiAgICAgKiBpbmZvcm1hdGlvbiBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIElmIG5vIHdpZHRoIG9yIGhlaWdodCBpcyBzcGVjaWZpZWQsIHRoZSByZW5kZXIgdGFyZ2V0cyBhbmQgcGFzc2VzIHdpbGwgYmVcclxuICAgICAqIHVwZGF0ZWQgd2l0aCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSByZW5kZXJlci5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW3dpZHRoXSAtIFRoZSB3aWR0aC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbaGVpZ2h0XSAtIFRoZSBoZWlnaHQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFNpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICB2YXIgcGFzc2VzID0gdGhpcy5wYXNzZXM7XG4gICAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyO1xuICAgICAgdmFyIHNpemUsIGRyYXdpbmdCdWZmZXJTaXplO1xuICAgICAgdmFyIGksIGw7XG5cbiAgICAgIGlmICh3aWR0aCA9PT0gdW5kZWZpbmVkIHx8IGhlaWdodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNpemUgPSByZW5kZXJlci5nZXRTaXplKCk7XG4gICAgICAgIHdpZHRoID0gc2l6ZS53aWR0aDtcbiAgICAgICAgaGVpZ2h0ID0gc2l6ZS5oZWlnaHQ7XG4gICAgICB9IC8vIFVwZGF0ZSB0aGUgbG9naWNhbCByZW5kZXIgc2l6ZS5cblxuXG4gICAgICByZW5kZXJlci5zZXRTaXplKHdpZHRoLCBoZWlnaHQpOyAvLyBUaGUgZHJhd2luZyBidWZmZXIgc2l6ZSB0YWtlcyB0aGUgZGV2aWNlIHBpeGVsIHJhdGlvIGludG8gYWNjb3VudC5cblxuICAgICAgZHJhd2luZ0J1ZmZlclNpemUgPSByZW5kZXJlci5nZXREcmF3aW5nQnVmZmVyU2l6ZSgpO1xuICAgICAgdGhpcy5pbnB1dEJ1ZmZlci5zZXRTaXplKGRyYXdpbmdCdWZmZXJTaXplLndpZHRoLCBkcmF3aW5nQnVmZmVyU2l6ZS5oZWlnaHQpO1xuICAgICAgdGhpcy5vdXRwdXRCdWZmZXIuc2V0U2l6ZShkcmF3aW5nQnVmZmVyU2l6ZS53aWR0aCwgZHJhd2luZ0J1ZmZlclNpemUuaGVpZ2h0KTtcblxuICAgICAgZm9yIChpID0gMCwgbCA9IHBhc3Nlcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgcGFzc2VzW2ldLnNldFNpemUoZHJhd2luZ0J1ZmZlclNpemUud2lkdGgsIGRyYXdpbmdCdWZmZXJTaXplLmhlaWdodCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIHRoaXMgY29tcG9zZXIgYnkgZGVsZXRpbmcgYWxsIHBhc3NlcyBhbmQgY3JlYXRpbmcgbmV3IGJ1ZmZlcnMuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInJlc2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgdmFyIHJlbmRlclRhcmdldCA9IHRoaXMuY3JlYXRlQnVmZmVyKHRoaXMuaW5wdXRCdWZmZXIuZGVwdGhCdWZmZXIsIHRoaXMuaW5wdXRCdWZmZXIuc3RlbmNpbEJ1ZmZlciwgdGhpcy5pbnB1dEJ1ZmZlci5kZXB0aFRleHR1cmUgIT09IG51bGwpO1xuICAgICAgdGhpcy5kaXNwb3NlKCk7IC8vIFJlYW5pbWF0ZS5cblxuICAgICAgdGhpcy5pbnB1dEJ1ZmZlciA9IHJlbmRlclRhcmdldDtcbiAgICAgIHRoaXMub3V0cHV0QnVmZmVyID0gcmVuZGVyVGFyZ2V0LmNsb25lKCk7XG4gICAgICB0aGlzLmNvcHlQYXNzID0gbmV3IFNoYWRlclBhc3MobmV3IENvcHlNYXRlcmlhbCgpKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGlzIGNvbXBvc2VyIGFuZCBhbGwgcGFzc2VzLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgbWV0aG9kIGRlYWxsb2NhdGVzIGFsbCBkaXNwb3NhYmxlIG9iamVjdHMgY3JlYXRlZCBieSB0aGUgcGFzc2VzLiBJdFxyXG4gICAgICogYWxzbyBkZWxldGVzIHRoZSBtYWluIGZyYW1lIGJ1ZmZlcnMgb2YgdGhpcyBjb21wb3Nlci5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGlzcG9zZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgdmFyIHBhc3NlcyA9IHRoaXMucGFzc2VzO1xuICAgICAgdmFyIGksIGw7XG5cbiAgICAgIGZvciAoaSA9IDAsIGwgPSBwYXNzZXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgIHBhc3Nlc1tpXS5kaXNwb3NlKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucGFzc2VzID0gW107XG5cbiAgICAgIGlmICh0aGlzLmlucHV0QnVmZmVyICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuaW5wdXRCdWZmZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmlucHV0QnVmZmVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3V0cHV0QnVmZmVyICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMub3V0cHV0QnVmZmVyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5vdXRwdXRCdWZmZXIgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNvcHlQYXNzLmRpc3Bvc2UoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVwdGhUZXh0dXJlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnB1dEJ1ZmZlci5kZXB0aFRleHR1cmU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBzaGFyZSBhIHNpbmdsZSBkZXB0aCB0ZXh0dXJlLiBEZXB0aCB3aWxsIGJlXHJcbiAgICAgKiB3cml0dGVuIHRvIHRoaXMgdGV4dHVyZSB3aGVuIHNvbWV0aGluZyBpcyByZW5kZXJlZCBpbnRvIG9uZSBvZiB0aGUgYnVmZmVyc1xyXG4gICAgICogYW5kIHRoZSBpbnZvbHZlZCBtYXRlcmlhbHMgaGF2ZSBkZXB0aCB3cml0ZSBlbmFibGVkLlxyXG4gICAgICpcclxuICAgICAqIFlvdSBtYXkgZW5hYmxlIHRoaXMgbWVjaGFuaXNtIGR1cmluZyB0aGUgaW5zdGFudGlhdGlvbiBvZiB0aGUgY29tcG9zZXIgb3JcclxuICAgICAqIGJ5IGFzc2lnbmluZyBhIERlcHRoVGV4dHVyZSBpbnN0YW5jZSBsYXRlciBvbi4gWW91IG1heSBhbHNvIGRpc2FibGUgaXQgYnlcclxuICAgICAqIGFzc2lnbmluZyBudWxsLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtEZXB0aFRleHR1cmV9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoeCkge1xuICAgICAgdGhpcy5pbnB1dEJ1ZmZlci5kZXB0aFRleHR1cmUgPSB4O1xuICAgICAgdGhpcy5vdXRwdXRCdWZmZXIuZGVwdGhUZXh0dXJlID0geDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRWZmZWN0Q29tcG9zZXI7XG59KCk7XG5cbnZhciBwb2x5ZmlsbCA9IGZ1bmN0aW9uIHBvbHlmaWxsKG9iamVjdCwgbWV0aG9kKSB7XG4gIHZhciBzaG93V2FybiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdHJ1ZTtcbiAgaWYgKG9iamVjdFttZXRob2RdKSByZXR1cm47XG4gIGlmIChzaG93V2FybikgY29uc29sZS53YXJuKFwiQFBvc3RQcm9jZXNzb3JNb2R1bGU6IHBhc3MuXCIuY29uY2F0KG1ldGhvZCwgXCIoKSB3YXMgbm90IGZvdW5kLlwiKSwgb2JqZWN0KTtcblxuICBvYmplY3RbbWV0aG9kXSA9IGZ1bmN0aW9uICgpIHt9O1xufTtcbi8qKlxuICogQGNsYXNzIFBvc3RQcm9jZXNzb3JNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj4gQ3JlYXRpbmcgYSByZW5kZXJpbmcgbW9kdWxlIGFuZCBwYXNzaW5nIGl0IHRvIEFwcCdzIG1vZHVsZXM8L2NhcHRpb24+XG4gKiBuZXcgQXBwKFtcbiAqICAgbmV3IEVsZW1lbnRNb2R1bGUoKSxcbiAqICAgbmV3IFNjZW5lTW9kdWxlKCksXG4gKiAgIG5ldyBEZWZpbmVNb2R1bGUoJ2NhbWVyYScsIG5ldyBXSFMuUGVyc3BlY3RpdmVDYW1lcmEoe1xuICogICAgIHBvc2l0aW9uOiBuZXcgVEhSRUUuVmVjdG9yMygwLCA2LCAxOCksXG4gKiAgICAgZmFyOiAxMDAwMFxuICogICB9KSksXG4gKiAgIG5ldyBSZW5kZXJpbmdNb2R1bGUoKSxcbiAqICAgbmV3IFBvc3RQcm9jZXNzb3JNb2R1bGUoKVxuICogXSk7XG4gKlxuICogY29uc3QgcHJvY2Vzc29yID0gYXBwLnVzZSgncG9zdHByb2Nlc3NvcicpO1xuICpcbiAqIHByb2Nlc3NvclxuICogICAucmVuZGVyKClcbiAqICAgLnBhc3MobmV3IEdsaXRjaFBhc3MoKSlcbiAqICAgLnJlbmRlclRvU2NyZWVuKClcbiAqL1xuXG5cbnZhciBQb3N0UHJvY2Vzc29yTW9kdWxlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUG9zdFByb2Nlc3Nvck1vZHVsZSgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogUG9zdFByb2Nlc3Nvck1vZHVsZS5kZWZhdWx0cztcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFBvc3RQcm9jZXNzb3JNb2R1bGUpO1xuXG4gICAgZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKHRoaXMsIFwiY3VycmVudFBhc3NcIiwgbnVsbCksIFwiZGVmZXJcIiwgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgIF90aGlzLnJlc29sdmUgPSByZXNvbHZlO1xuICAgIH0pKTtcblxuICAgIHRoaXMuZGVidWcgPSBwYXJhbXMuZGVidWc7XG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhQb3N0UHJvY2Vzc29yTW9kdWxlLCBbe1xuICAgIGtleTogXCJtYW5hZ2VyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hbmFnZXIoX21hbmFnZXIpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBfbWFuYWdlci5kZWZpbmUoJ3Bvc3Rwcm9jZXNzb3InKTtcblxuICAgICAgdGhpcy5lZmZlY3RzID0gX21hbmFnZXIudXNlKCdyZW5kZXJpbmcnKS5lZmZlY3RzO1xuICAgICAgdGhpcy5yZW5kZXJlciA9IF9tYW5hZ2VyLmdldCgncmVuZGVyZXInKTtcbiAgICAgIHRoaXMuc2NlbmUgPSBfbWFuYWdlci5nZXQoJ3NjZW5lJyk7XG4gICAgICB0aGlzLmNhbWVyYSA9IF9tYW5hZ2VyLmdldCgnY2FtZXJhJyk7XG4gICAgICB0aGlzLmNvbXBvc2VyID0gbmV3IEVmZmVjdENvbXBvc2VyKHRoaXMucmVuZGVyZXIsIHRoaXMucGFyYW1zKTtcblxuICAgICAgX21hbmFnZXIudXNlKCdyZW5kZXJpbmcnKS5zdG9wKCk7XG5cbiAgICAgIHZhciBjb21wb3NlciA9IHRoaXMuY29tcG9zZXI7XG4gICAgICB0aGlzLnJlbmRlckxvb3AgPSBuZXcgTG9vcChmdW5jdGlvbiAoY2xvY2spIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2VyLnJlbmRlcihjbG9jay5nZXREZWx0YSgpKTtcbiAgICAgIH0pLnN0YXJ0KF9tYW5hZ2VyLmhhbmRsZXIpO1xuXG4gICAgICBfbWFuYWdlci51cGRhdGUoe1xuICAgICAgICByZW5kZXJlcjogZnVuY3Rpb24gcmVuZGVyZXIoX3JlbmRlcmVyKSB7XG4gICAgICAgICAgX3RoaXMyLmNvbXBvc2VyLnJlcGxhY2VSZW5kZXJlcihfcmVuZGVyZXIpO1xuICAgICAgICB9LFxuICAgICAgICBzY2VuZTogZnVuY3Rpb24gc2NlbmUoX3NjZW5lKSB7XG4gICAgICAgICAgX3RoaXMyLnNjZW5lID0gX3NjZW5lO1xuICAgICAgICB9LFxuICAgICAgICBjYW1lcmE6IGZ1bmN0aW9uIGNhbWVyYShfY2FtZXJhKSB7XG4gICAgICAgICAgX3RoaXMyLmNhbWVyYSA9IF9jYW1lcmE7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJlc29sdmUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCByZW5kZXJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWRkcyBSZW5kZXJQYXNzXG4gICAgICogQHJldHVybiB7dGhpc31cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlBvc3RQcm9jZXNzb3JNb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdGhpcy5kZWZlci50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHBhc3MgPSBuZXcgUmVuZGVyUGFzcyhfdGhpczMuc2NlbmUsIF90aGlzMy5jYW1lcmEubmF0aXZlKTsgLy8gVE9ETzogU3VwcG9ydCBmb3IgZWZmZWN0cy5cblxuICAgICAgICBfdGhpczMuY29tcG9zZXIuYWRkUGFzcyhwYXNzKTtcblxuICAgICAgICBfdGhpczMuY3VycmVudFBhc3MgPSBwYXNzO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBwYXNzXG4gICAgICogQGRlc2NyaXB0aW9uIEFkZHMgeW91ciBjdXN0b20gcGFzc1xuICAgICAqIEBwYXJhbSB7UGFzc30gcGFzcyBBIGN1c3RvbSBwYXNzXG4gICAgICogQHJldHVybiB7dGhpc31cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlBvc3RQcm9jZXNzb3JNb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInBhc3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFzcyhfcGFzcykge1xuICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICAgIHRoaXMuZGVmZXIudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHBvbHlmaWxsKF9wYXNzLCAnc2V0U2l6ZScsIF90aGlzNC5kZWJ1Zyk7XG4gICAgICAgIHBvbHlmaWxsKF9wYXNzLCAnaW5pdGlhbGlzZScsIF90aGlzNC5kZWJ1Zyk7XG5cbiAgICAgICAgX3RoaXM0LmNvbXBvc2VyLmFkZFBhc3MoX3Bhc3MpO1xuXG4gICAgICAgIF90aGlzNC5jdXJyZW50UGFzcyA9IF9wYXNzO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBzaGFkZXJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWRkcyBhIHBhc3MgbWFkZSBmcm9tIHNoYWRlciBtYXRlcmlhbFxuICAgICAqIEBwYXJhbSB7TWF0ZXJpYWx9IG1hdGVyaWFsIEEgU2hhZGVyTWF0ZXJpYWxcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dHVyZUlEIE5hbWUgb2YgdGhlIHJlYWRCdWZmZXIgdW5pZm9ybVxuICAgICAqIEByZXR1cm4ge3RoaXN9XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5Qb3N0UHJvY2Vzc29yTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzaGFkZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hhZGVyKG1hdGVyaWFsKSB7XG4gICAgICB2YXIgX3RoaXM1ID0gdGhpcztcblxuICAgICAgdmFyIHRleHR1cmVJRCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogJ3JlYWRCdWZmZXInO1xuICAgICAgdGhpcy5kZWZlci50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFtYXRlcmlhbC51bmlmb3Jtc1t0ZXh0dXJlSURdKSBtYXRlcmlhbC51bmlmb3Jtc1t0ZXh0dXJlSURdID0ge1xuICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgIH07XG4gICAgICAgIHZhciBwYXNzID0gbmV3IFNoYWRlclBhc3MobWF0ZXJpYWwsIHRleHR1cmVJRCk7XG5cbiAgICAgICAgX3RoaXM1LmNvbXBvc2VyLmFkZFBhc3MocGFzcyk7XG5cbiAgICAgICAgX3RoaXM1LmN1cnJlbnRQYXNzID0gcGFzcztcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgZ2V0XG4gICAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgYSBwYXNzIGJ5IHRoZSBnaXZlbiBuYW1lXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHBhc3NcbiAgICAgKiBAcmV0dXJuIHt0aGlzfVxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUG9zdFByb2Nlc3Nvck1vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldChuYW1lKSB7XG4gICAgICByZXR1cm4gbmFtZSA/IHRoaXMuY29tcG9zZXIucGFzc2VzLmZpbHRlcihmdW5jdGlvbiAocGFzcykge1xuICAgICAgICByZXR1cm4gcGFzcy5uYW1lID09PSBuYW1lO1xuICAgICAgfSlbMF0gOiB0aGlzLmN1cnJlbnRQYXNzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHJlbmRlclRvU2NyZWVuXG4gICAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHJlbmRlclRvU2NyZWVuIHByb3BlcnR5IG9mIGN1cnJlbnRQYXNzXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtuYW1lPXRydWVdIFRoZSBuYW1lIG9mIHRoZSBwYXNzXG4gICAgICogQHJldHVybiB7dGhpc31cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlBvc3RQcm9jZXNzb3JNb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclRvU2NyZWVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlclRvU2NyZWVuKCkge1xuICAgICAgdmFyIF90aGlzNiA9IHRoaXM7XG5cbiAgICAgIHZhciBib29sID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlO1xuICAgICAgdGhpcy5kZWZlci50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXM2LmN1cnJlbnRQYXNzLnJlbmRlclRvU2NyZWVuID0gYm9vbDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBvc3RQcm9jZXNzb3JNb2R1bGU7XG59KCk7XG5cbmRlZmluZVByb3BlcnR5JDMoUG9zdFByb2Nlc3Nvck1vZHVsZSwgXCJkZWZhdWx0c1wiLCB7XG4gIGRlYnVnOiB0cnVlXG59KTtcblxuLyoqXG4gKiBAY2xhc3MgRXZlbnRzUGF0Y2hNb2R1bGVcbiAqIEBkZXNjcmlwdGlvbiBUaGlzIG9uZSBpcyB1c2VkIGluIHRoZSBjb3JlIHRvIGhhbmRsZSBldmVudHMgdXNlZCBieSBtb2R1bGVzLiBJZiB5b3Ugd2FudCB0byBtYWtlIGN1c3RvbSBldmVudHMgLSBwbGVhc2UgbWFrZSBhIHNpbWlsYXIgb25lLlxuICogQGNhdGVnb3J5IG1vZHVsZXMvYXBwXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKi9cbnZhciBFdmVudHNQYXRjaE1vZHVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEV2ZW50c1BhdGNoTW9kdWxlKCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEV2ZW50c1BhdGNoTW9kdWxlKTtcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKEV2ZW50c1BhdGNoTW9kdWxlLCBbe1xuICAgIGtleTogXCJtYW5hZ2VyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hbmFnZXIoX21hbmFnZXIpIHtcbiAgICAgIF9tYW5hZ2VyLmRlZmluZSgnZXZlbnRzJyk7XG5cbiAgICAgIHRoaXMuZWxlbWVudCA9IF9tYW5hZ2VyLmdldCgncmVuZGVyZXInKS5kb21FbGVtZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb24gcGF0Y2hFdmVudHNcbiAgICAgKiBAZGVzY3JpcHRpb24gVGhpcyBtZXRob2RzIHBhdGNoZXMgdGhlIGxpc3Qgb2YgZXZlbnRzIG9uIHNwZWNpZmljIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gb3JpZ2luT2JqZWN0IC0gVGhlIG9iamVjdCB0aGF0IGdpdmVzIGV2ZW50cy5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW2Rlc3RPYmplY3Q9dGhpc10gLSBUaGUgb2JqZWN0IHRoYXQgdGFrZXMgZXZlbnRzLlxuICAgICAqIEBwYXJhbSB7QXJyYXlbU3RyaW5nc119IFtldmVudHM9W11dIC0gVGhlIGxpc3Qgb2YgZXZlbnRzIGJ5IG5hbWVzLlxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuRXZlbnRzUGF0Y2hNb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInBhdGNoRXZlbnRzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdGNoRXZlbnRzKG9yaWdpbk9iamVjdCkge1xuICAgICAgdmFyIGRlc3RPYmplY3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRoaXM7XG4gICAgICB2YXIgZXZlbnRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBbXTtcbiAgICAgIGV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICByZXR1cm4gb3JpZ2luT2JqZWN0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgcmV0dXJuIGRlc3RPYmplY3QuZW1pdChldmVudCwgZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImludGVncmF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnRlZ3JhdGUoc2VsZikge1xuICAgICAgdmFyIGVsZW1lbnQgPSBzZWxmLmVsZW1lbnQsXG4gICAgICAgICAgcGF0Y2hFdmVudHMgPSBzZWxmLnBhdGNoRXZlbnRzO1xuICAgICAgcGF0Y2hFdmVudHMoZWxlbWVudCwgdGhpcywgWydtb3VzZW1vdmUnLCAnbW91c2V1cCcsICdjb250ZXh0bWVudScsICdtb3VzZWRvd24nLCAnY2xpY2snLCAnd2hlZWwnLCAndG91Y2hzdGFydCcsICd0b3VjaGVuZCcsICd0b3VjaG1vdmUnLCAna2V5ZG93bicsICdrZXl1cCcsICdrZXlwcmVzcyddKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRXZlbnRzUGF0Y2hNb2R1bGU7XG59KCk7XG5cbi8qKlxuICogQGNsYXNzIFZpcnR1YWxNb3VzZU1vZHVsZVxuICogQGNhdGVnb3J5IG1vZHVsZXMvYXBwXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtnbG9iYWxNb3ZlbWVudD1mYWxzZV1cbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHBcbiAqIEBleHRlbmRzIEV2ZW50c1xuICovXG5cbnZhciBWaXJ0dWFsTW91c2VNb2R1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9FdmVudHMpIHtcbiAgZnVuY3Rpb24gVmlydHVhbE1vdXNlTW9kdWxlKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBnbG9iYWxNb3ZlbWVudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBWaXJ0dWFsTW91c2VNb2R1bGUpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoVmlydHVhbE1vdXNlTW9kdWxlKS5jYWxsKHRoaXMpKTtcblxuICAgIGRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSksIFwibW91c2VcIiwgbmV3IFZlY3RvcjIoKSksIFwicmF5Y2FzdGVyXCIsIG5ldyBSYXljYXN0ZXIoKSksIFwid29ybGRcIiwgbnVsbCksIFwiY2FudmFzXCIsIG51bGwpLCBcInByb2plY3Rpb25QbGFuZVwiLCBuZXcgUGxhbmUobmV3IFZlY3RvcjMoMCwgMCwgMSksIDApKTtcblxuICAgIF90aGlzLmdsb2JhbE1vdmVtZW50ID0gZ2xvYmFsTW92ZW1lbnQ7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoVmlydHVhbE1vdXNlTW9kdWxlLCBbe1xuICAgIGtleTogXCJ1cGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlKGUsIGN1c3RvbVgsIGN1c3RvbVkpIHtcbiAgICAgIHZhciByZWN0ID0gdGhpcy5jYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB2YXIgeCA9IGN1c3RvbVggfHwgZS5jbGllbnRYO1xuICAgICAgdmFyIHkgPSBjdXN0b21ZIHx8IGUuY2xpZW50WTtcbiAgICAgIHRoaXMubW91c2UueCA9ICh4IC0gcmVjdC5sZWZ0KSAvIChyZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0KSAqIDIgLSAxO1xuICAgICAgdGhpcy5tb3VzZS55ID0gLSgoeSAtIHJlY3QudG9wKSAvIChyZWN0LmJvdHRvbSAtIHJlY3QudG9wKSkgKiAyICsgMTtcbiAgICAgIHRoaXMucHJvamVjdGlvblBsYW5lLm5vcm1hbC5jb3B5KHRoaXMuY2FtZXJhLmdldFdvcmxkRGlyZWN0aW9uKCkpO1xuICAgICAgdGhpcy5yYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSh0aGlzLm1vdXNlLCB0aGlzLmNhbWVyYSk7XG4gICAgICB0aGlzLmVtaXQoJ21vdmUnKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWFuYWdlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYW5hZ2VyKF9tYW5hZ2VyKSB7XG4gICAgICBfbWFuYWdlci5kZWZpbmUoJ21vdXNlJyk7XG5cbiAgICAgIF9tYW5hZ2VyLnJlcXVpcmUoJ2V2ZW50cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFdmVudHNQYXRjaE1vZHVsZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuY2FudmFzID0gX21hbmFnZXIuZ2V0KCdyZW5kZXJlcicpLmRvbUVsZW1lbnQ7XG4gICAgICB0aGlzLmNhbWVyYSA9IF9tYW5hZ2VyLmdldCgnY2FtZXJhJykubmF0aXZlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnRlZ3JhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW50ZWdyYXRlKHNlbGYpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBbJ2NsaWNrJywgJ21vdXNlZG93bicsICdtb3VzZXVwJywgJ21vdXNlbW92ZSddLmZvckVhY2goZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIHJldHVybiBfdGhpczIub24oZXYsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuZW1pdChldiwgZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBzZWxmLmdsb2JhbFggPSAwO1xuICAgICAgc2VsZi5nbG9iYWxZID0gMDtcbiAgICAgIHRoaXMub24oJ21vdXNlbW92ZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmIChkb2N1bWVudC5wb2ludGVyTG9ja0VsZW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICBzZWxmLmdsb2JhbFggKz0gZS5tb3ZlbWVudFg7XG4gICAgICAgICAgc2VsZi5nbG9iYWxZICs9IGUubW92ZW1lbnRZO1xuICAgICAgICAgIHNlbGYudXBkYXRlKGUsIHNlbGYuZ2xvYmFsWCwgc2VsZi5nbG9iYWxZKTtcbiAgICAgICAgfSBlbHNlIHNlbGYudXBkYXRlKGUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgdHJhY2tcbiAgICAgKiBAZGVzY3JpcHRpb24gU3RhcnRzIHRyYWNraW5nIGV2ZW50cyBvbiBhIGNvbXBvbmVudFxuICAgICAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wb25lbnQgQSBjb21wb25lbnQsIHRoYXQgc2hvdWxkIGJlIHRyYWNrZWQgYnkgdGhlIG1vdXNlXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBuZXN0ZWQgV2hldGhlciBjb21wb25lbnQncyBjaGlsZHJlbiBzaG91bGQgYmUgdHJhY2tlZCBvciBub3RcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlZpcnR1YWxNb3VzZU1vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwidHJhY2tcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdHJhY2soY29tcG9uZW50KSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdmFyIG5lc3RlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgICAgIHZhciBpc0hvdmVyZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMub24oJ21vdmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChfdGhpczMuaG92ZXJzKGNvbXBvbmVudCwgbmVzdGVkKSkge1xuICAgICAgICAgIGlmIChpc0hvdmVyZWQpIGNvbXBvbmVudC5lbWl0KCdtb3VzZW1vdmUnKTtlbHNlIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0KCdtb3VzZW92ZXInKTtcbiAgICAgICAgICAgIGlzSG92ZXJlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzSG92ZXJlZCkge1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0KCdtb3VzZW91dCcpO1xuICAgICAgICAgIGlzSG92ZXJlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaXNIb3ZlcmVkKSBjb21wb25lbnQuZW1pdCgnY2xpY2snKTtlbHNlIGNvbXBvbmVudC5lbWl0KCdvZmZDbGljaycpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm9uKCdtb3VzZWRvd24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpc0hvdmVyZWQpIGNvbXBvbmVudC5lbWl0KCdtb3VzZWRvd24nKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5vbignbW91c2V1cCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGlzSG92ZXJlZCkgY29tcG9uZW50LmVtaXQoJ21vdXNldXAnKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGludGVyc2VjdGlvblxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGFuIGludGVyc2VjdGlvbiBkYXRhXG4gICAgICogQHBhcmFtIHtDb21wb25lbnR9IGNvbXBvbmVudCBBIGNvbXBvbmVudCB0aGF0IGludGVyc2VjdHMgd2l0aCBtb3VzZSByYXkgKG9yIGRvZXNuJ3QpXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBuZXN0ZWQgV2hldGhlciBjb21wb25lbnQncyBjaGlsZHJlbiBzaG91bGQgYmUgdHJhY2tlZCBvciBub3RcbiAgICAgKiBAcmV0dXJuIHtBcnJheX0gaW50ZXJzZWN0aW9uIGRhdGEuXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5WaXJ0dWFsTW91c2VNb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImludGVyc2VjdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnRlcnNlY3Rpb24oX3JlZikge1xuICAgICAgdmFyIG5hdGl2ZSA9IF9yZWYubmF0aXZlO1xuICAgICAgdmFyIG5lc3RlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcblxuICAgICAgaWYgKG5hdGl2ZS5jaGlsZHJlbi5sZW5ndGggPiAwICYmIG5lc3RlZCkge1xuICAgICAgICB2YXIgb2JqZWN0cyA9IFtdO1xuICAgICAgICBuYXRpdmUudHJhdmVyc2UoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgcmV0dXJuIG9iamVjdHMucHVzaChjaGlsZCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5yYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0cyhvYmplY3RzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdChuYXRpdmUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHByb2plY3RcbiAgICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIHZlY3RvciBiYXNlZCBvbiBtb3VzZSByYXkgaW50ZXJzZWN0aW9uIHdpdGggcGxhbmVcbiAgICAgKiBAcGFyYW0ge1RIUkVFLlBsYW5lfSBbcGxhbmU9dGhpcy5wcm9qZWN0aW9uUGxhbmVdIE1hdGggcGxhbmUgdGhhdCBpcyB1c2VkXG4gICAgICogQHBhcmFtIHtWZWN0b3IzfSBbdGFyZ2V0XSBPcHRpb25hbCB0YXJnZXRcbiAgICAgKiBAcmV0dXJuIHtWZWN0b3IzfSBBbiBpbnRlcnNlY3Rpb24gcG9pbnQuXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5WaXJ0dWFsTW91c2VNb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInByb2plY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHJvamVjdCgpIHtcbiAgICAgIHZhciBwbGFuZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy5wcm9qZWN0aW9uUGxhbmU7XG4gICAgICB2YXIgdGFyZ2V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gdGhpcy5yYXljYXN0ZXIucmF5LmludGVyc2VjdFBsYW5lKHBsYW5lLCB0YXJnZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGhvdmVyc1xuICAgICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGEgYm9vbGVhbiBiYXNlZCBvbiBpbnRlcnNlY3Rpb24gZGF0YSAoV2hldGhlciBtb3VzZSBob3ZlcnMgdGhlIGNvbXBvbmVudClcbiAgICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gY29tcG9uZW50IEEgY29tcG9uZW50IHRoYXQgaW50ZXJzZWN0cyB3aXRoIG1vdXNlIHJheSAob3IgZG9lc24ndClcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IG5lc3RlZCBXaGV0aGVyIGNvbXBvbmVudCdzIGNoaWxkcmVuIHNob3VsZCBiZSB0cmFja2VkIG9yIG5vdFxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBob3ZlcmVkLlxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuVmlydHVhbE1vdXNlTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJob3ZlcnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaG92ZXJzKGNvbXBvbmVudCkge1xuICAgICAgdmFyIG5lc3RlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzLmludGVyc2VjdGlvbihjb21wb25lbnQsIG5lc3RlZCkubGVuZ3RoID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTW91c2UgcmF5XG4gICAgICogQG1lbWJlciB7VEhSRUUuUmF5fSBtb2R1bGU6bW9kdWxlcy9hcHAuVmlydHVhbE1vdXNlTW9kdWxlI3JheVxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInJheVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMucmF5Y2FzdGVyLnJheTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTW91c2UgeCBbLTE7IDFdXG4gICAgICogQG1lbWJlciB7TnVtYmVyfSBtb2R1bGU6bW9kdWxlcy9hcHAuVmlydHVhbE1vdXNlTW9kdWxlI3hcbiAgICAgKiBAcHVibGljXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ4XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tb3VzZS54O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNb3VzZSB5IFstMTsgMV1cbiAgICAgKiBAbWVtYmVyIHtOdW1iZXJ9IG1vZHVsZTptb2R1bGVzL2FwcC5WaXJ0dWFsTW91c2VNb2R1bGUjeVxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1vdXNlLnk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoVmlydHVhbE1vdXNlTW9kdWxlLCBfRXZlbnRzKTtcblxuICByZXR1cm4gVmlydHVhbE1vdXNlTW9kdWxlO1xufShtaW5pdmVudHNfY29tbW9uanMpO1xuXG4vKipcbiAqIEBjbGFzcyBDb250cm9sc01vZHVsZVxuICogQGNhdGVnb3J5IG1vZHVsZXMvYXBwXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc11cbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHBcbiAqIEBleGFtcGxlIDxjYXB0aW9uPiBDcmVhdGluZyBhIHJlbmRlcmluZyBtb2R1bGUgYW5kIHBhc3NpbmcgaXQgdG8gQXBwJ3MgbW9kdWxlczwvY2FwdGlvbj5cbiAqIG5ldyBBcHAoW1xuICogICBuZXcgRWxlbWVudE1vZHVsZSgpLFxuICogICBuZXcgU2NlbmVNb2R1bGUoKSxcbiAqICAgbmV3IERlZmluZU1vZHVsZSgnY2FtZXJhJywgbmV3IFdIUy5QZXJzcGVjdGl2ZUNhbWVyYSh7XG4gKiAgICAgcG9zaXRpb246IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDYsIDE4KSxcbiAqICAgICBmYXI6IDEwMDAwXG4gKiAgIH0pKSxcbiAqICAgbmV3IFJlbmRlcmluZ01vZHVsZSgpLFxuICogICBuZXcgQ29udHJvbHNNb2R1bGUuZnJvbShuZXcgVEhSRUUuVHJhY2tiYWxsQ29udHJvbHMoKSlcbiAqIF0pO1xuICovXG5cbnZhciBDb250cm9sc01vZHVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGNyZWF0ZUNsYXNzKENvbnRyb2xzTW9kdWxlLCBudWxsLCBbe1xuICAgIGtleTogXCJmcm9tXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZyb20oY29udHJvbHMpIHtcbiAgICAgIHJldHVybiBuZXcgQ29udHJvbHNNb2R1bGUoe1xuICAgICAgICBjb250cm9sczogY29udHJvbHNcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuXG4gIGZ1bmN0aW9uIENvbnRyb2xzTW9kdWxlKCkge1xuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29udHJvbHNNb2R1bGUpO1xuXG4gICAgdGhpcy5wYXJhbXMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIGNvbnRyb2xzOiBmYWxzZSxcbiAgICAgIGZpeDogZnVuY3Rpb24gZml4KGNvbnRyb2xzKSB7XG4gICAgICAgIHJldHVybiBjb250cm9scztcbiAgICAgIH0sXG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShjKSB7XG4gICAgICAgIHRoaXMuY29udHJvbHMudXBkYXRlKGMuZ2V0RGVsdGEoKSk7XG4gICAgICB9XG4gICAgfSwgcGFyYW1zKTtcbiAgICB0aGlzLmNvbnRyb2xzID0gdGhpcy5wYXJhbXMuY29udHJvbHM7XG4gICAgdGhpcy51cGRhdGUgPSB0aGlzLnBhcmFtcy51cGRhdGU7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhDb250cm9sc01vZHVsZSwgW3tcbiAgICBrZXk6IFwibWFuYWdlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYW5hZ2VyKF9tYW5hZ2VyKSB7XG4gICAgICBfbWFuYWdlci5kZWZpbmUoJ2NvbnRyb2xzJyk7XG5cbiAgICAgIF9tYW5hZ2VyLnJlcXVpcmUoJ2V2ZW50cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFdmVudHNQYXRjaE1vZHVsZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2Qgc2V0Q29udHJvbHNcbiAgICAgKiBAZGVzY3JpcHRpb24gU2V0IHdvcmtpbmcgY29udHJvbHNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29udHJvbHMgV29ya2luZyB0aHJlZS5qcyBjb250cm9scyBvYmplY3QuXG4gICAgICogQHJldHVybiB7dGhpc31cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLkNvbnRyb2xzTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRDb250cm9sc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRDb250cm9scyhjb250cm9scykge1xuICAgICAgdGhpcy5jb250cm9scyA9IGNvbnRyb2xzO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2Qgc2V0VXBkYXRlXG4gICAgICogQGRlc2NyaXB0aW9uIFNldCBjb250cm9scyB1cGRhdGUgZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGUgVXBkYXRlIGZ1bmN0aW9uXG4gICAgICogQHJldHVybiB7dGhpc31cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLkNvbnRyb2xzTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0VXBkYXRlKHVwZGF0ZSkge1xuICAgICAgdGhpcy51cGRhdGUgPSB1cGRhdGU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW50ZWdyYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludGVncmF0ZShzZWxmKSB7XG4gICAgICBzZWxmLnVwZGF0ZUxvb3AgPSBuZXcgTG9vcChzZWxmLnVwZGF0ZS5iaW5kKHNlbGYpKTtcbiAgICAgIHNlbGYudXBkYXRlTG9vcC5zdGFydCh0aGlzKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ29udHJvbHNNb2R1bGU7XG59KCk7XG5cbi8qKlxuICogQGNsYXNzIEZvZ01vZHVsZVxuICogQGNhdGVnb3J5IG1vZHVsZXMvYXBwXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcz17Y29sb3I6IDB4ZWZkMWI1LCBkZW5zaXR5OiAwLjAyMCwgbmVhcjogMTAsIGZhcjogMTAwMH1dIC0gVGhlIHBhcmFtZXRlcnMgb2JqZWN0LlxuICogQHBhcmFtIHtTdHJpbmd9IFt0eXBlPWV4cDJdIC0gVGhlIHR5cGUgb2YgZm9nIC0gZXhwMiBvciBsaW5lYXJcbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHBcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkhvdyB0byBjcmVhdGUgYW5kIGFwcGx5IGEgRm9nTW9kdWxlPC9jYXB0aW9uPlxuICogY29uc3QgZm9nTW9kdWxlID0gbmV3IEZvZ01vZHVsZSh7XG4gKiAgICBjb2xvcjogMHhmZmZmZmYsXG4gKiAgICBkZW5zaXR5OiAwLjAzLFxuICogICAgbmVhcjogMjAsXG4gKiAgICBmYXI6IDIwMFxuICogIH0sICdleHAyJyk7XG4gKlxuICogbmV3IEFwcChbXG4gKiAgLi4uLFxuICogIGZvZ01vZHVsZVxuICogXSk7XG4gKi9cblxudmFyIEZvZ01vZHVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEZvZ01vZHVsZSgpIHtcbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICB2YXIgdHlwZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRm9nTW9kdWxlKTtcblxuICAgIHRoaXMucGFyYW1zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBjb2xvcjogMHhlZmQxYjUsXG4gICAgICBkZW5zaXR5OiAwLjAyMCxcbiAgICAgIG5lYXI6IDEwLFxuICAgICAgZmFyOiAxMDAwXG4gICAgfSwgcGFyYW1zKTtcbiAgICBpZiAoIXR5cGUgfHwgdHlwZSA9PT0gJ2V4cDInKSB0aGlzLmZvZyA9IG5ldyBGb2dFeHAyKHRoaXMucGFyYW1zLmNvbG9yLCB0aGlzLnBhcmFtcy5kZW5zaXR5KTtlbHNlIGlmICh0eXBlID09PSAnbGluZWFyJykgdGhpcy5mb2cgPSBuZXcgRm9nKHRoaXMucGFyYW1zLmNvbG9yLCB0aGlzLnBhcmFtcy5uZWFyLCB0aGlzLnBhcmFtcy5mYXIpO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoRm9nTW9kdWxlLCBbe1xuICAgIGtleTogXCJtYW5hZ2VyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hbmFnZXIoX21hbmFnZXIpIHtcbiAgICAgIF9tYW5hZ2VyLnNldCgnZm9nJywgdGhpcy5mb2cpO1xuXG4gICAgICBfbWFuYWdlci5nZXQoJ3NjZW5lJykuZm9nID0gdGhpcy5mb2c7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEZvZ01vZHVsZTtcbn0oKTtcblxudmFyIGlzRXF1YWxEZWZhdWx0ID0gZnVuY3Rpb24gaXNFcXVhbERlZmF1bHQoYSwgYikge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7ZWxzZSBpZiAoYSAmJiBhLmVxdWFscyAmJiBhLmVxdWFscyhiKSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn07XG4vKipcbiAqIEBjbGFzcyBTdGF0ZU1vZHVsZVxuICogQGRlc2NyaXB0aW9uIGBTdGF0ZU1vZHVsZWAgaXMgdXNlZnVsIGZvciBhcHBzLCB3aGVyZSB5b3UgbmVlZCBzdGF0ZSBtYW5pcHVsYXRpb24uXG4gKiBUaGlzIGNhbiBiZTogX3RyYW5zaXRpb25zIGJldHdlZW4gc2NyZWVucywgZ2FtZXMsIGRldmVsb3BtZW50IG1vbWVudHNfLlxuICogWW91IGNhbiBjaGVjayBbYmFzaWMvc3RhdGVdKGh0dHBzOi8vd2hzLWRldi5zdXJnZS5zaC9leGFtcGxlcy8/YmFzaWMvc3RhdGUpIGV4YW1wbGUuXG4gKiBAY2F0ZWdvcnkgbW9kdWxlcy9hcHBcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXVxuICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcFxuICogQGV4YW1wbGUgPGNhcHRpb24+IENyZWF0aW5nIGEgc3RhdGUgbW9kdWxlPC9jYXB0aW9uPlxuICogbmV3IEFwcChbXG4gKiAgIC8vIC4uLlxuICogICBuZXcgU3RhdGVNb2R1bGUoKS5kZWZhdWx0KHtcbiAqICAgICBzcGhlcmVDb2xvcjogMHhmZjAwMDBcbiAqICAgfSlcbiAqIF0pO1xuICovXG5cblxudmFyIFN0YXRlTW9kdWxlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgY3JlYXRlQ2xhc3MoU3RhdGVNb2R1bGUsIG51bGwsIFt7XG4gICAga2V5OiBcImFjdGlvbkdlbmVyYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFjdGlvbkdlbmVyYXRlKGlzRXF1YWwpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW3t9LCAnJ107XG5cbiAgICAgICAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGtleSA9IF9yZWYua2V5LFxuICAgICAgICAgICAgZGF0YSA9IF9yZWYuZGF0YTtcblxuICAgICAgICBpZiAoaXNFcXVhbChzdGF0ZVswXVtrZXldLCBkYXRhKSkgcmV0dXJuIHN0YXRlO1xuICAgICAgICBzdGF0ZVswXVtrZXldID0gZGF0YTtcbiAgICAgICAgc3RhdGVbMV0gPSBrZXk7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH07XG4gICAgfVxuICB9XSk7XG5cbiAgZnVuY3Rpb24gU3RhdGVNb2R1bGUoKSB7XG4gICAgdmFyIGVxdWFsQ2hlY2sgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGlzRXF1YWxEZWZhdWx0O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgU3RhdGVNb2R1bGUpO1xuXG4gICAgdGhpcy5zdG9yZSA9IGNyZWF0ZVN0b3JlKFN0YXRlTW9kdWxlLmFjdGlvbkdlbmVyYXRlKGVxdWFsQ2hlY2spKTtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSB7fTtcbiAgICB0aGlzLmN1cnJlbnRDb25maWcgPSAnZGVmYXVsdCc7XG4gICAgdGhpcy5wcmV2Q29uZmlnID0gJ2RlZmF1bHQnO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGRlZmF1bHRcbiAgICogQGRlc2NyaXB0aW9uIEFkZCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIENvbmZpZ3VyYXRpb24gc2V0dXBcbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5TdGF0ZU1vZHVsZVxuICAgKiBAZXhhbXBsZVxuICAgKiBuZXcgV0hTLlN0YXRlTW9kdWxlKCkuZGVmYXVsdCh7XG4gICAqICAgc3BoZXJlQ29sb3I6IFVUSUxTLiRjb2xvcnMubWVzaCxcbiAgICogICBwbGFuZUNvbG9yOiAweDQ0N0Y4QlxuICAgKiB9KVxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFN0YXRlTW9kdWxlLCBbe1xuICAgIGtleTogXCJkZWZhdWx0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9kZWZhdWx0KGRhdGEpIHtcbiAgICAgIHRoaXMuY29uZmlnKHtcbiAgICAgICAgZGVmYXVsdDogZGF0YVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBzZXRFcXVhbENoZWNrXG4gICAgICogQGRlc2NyaXB0aW9uIFNldHMgYW4gZXF1YWxDaGVjayBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgZXF1YWwgY2hlY2tcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlN0YXRlTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRFcXVhbENoZWNrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEVxdWFsQ2hlY2soZnVuYykge1xuICAgICAgdGhpcy5zdG9yZS5yZXBsYWNlUmVkdWNlcihTdGF0ZU1vZHVsZS5hY3Rpb25HZW5lcmF0ZShmdW5jKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm1hbmFnZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFuYWdlcihfbWFuYWdlcikge1xuICAgICAgX21hbmFnZXIuZGVmaW5lKCdzdGF0ZScpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGNvbmZpZ1xuICAgICAqIEBkZXNjcmlwdGlvbiBMb2FkIGNvbmZpZ3VyYXRpb25zIGZyb20gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWdzIENvbmZpZ3VyYXRpb24gZGF0YVxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuU3RhdGVNb2R1bGVcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj4gQWRkaW5nIGBncmVlbmAgY29uZmlndXJhdGlvbjwvY2FwdGlvbj5cbiAgICAgKiBzdGF0ZS5jb25maWcoe1xuICAgICAqICAgZ3JlZW46IHtcbiAgICAgKiAgICAgc3BoZXJlQ29sb3I6IDB4MDBmZjAwLFxuICAgICAqICAgICBwbGFuZUNvbG9yOiAweDAwZmYwMFxuICAgICAqICAgfVxuICAgICAqIH0pO1xuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiY29uZmlnXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbmZpZyhjb25maWdzKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gY29uZmlncykge1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uW2tleV0gPSBrZXkgPT09ICdkZWZhdWx0JyA/IGNvbmZpZ3Nba2V5XSA6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0LCBjb25maWdzW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgdXBkYXRlXG4gICAgICogQGRlc2NyaXB0aW9uIExvYWQgdXBkYXRlcyBmcm9tIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdXBkYXRlcyBVcGRhdGVzIGRhdGFcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlN0YXRlTW9kdWxlXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+IFVwZGF0ZSBjYWxsYmFjayBmb3IgYHNwaGVyZUNvbG9yYDwvY2FwdGlvbj5cbiAgICAgKiBzdGF0ZS51cGRhdGUoe1xuICAgICAqICAgc3BoZXJlQ29sb3I6IGNvbG9yID0+IHNwaGVyZS5tYXRlcmlhbC5jb2xvci5zZXRIZXgoY29sb3IpXG4gICAgICogfSk7XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIHVwZGF0ZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgdGhpcy5zdG9yZS5zdWJzY3JpYmUoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMkc3RvcmUkZ2V0U3RhdGUgPSBfdGhpcy5zdG9yZS5nZXRTdGF0ZSgpLFxuICAgICAgICAgICAgX3RoaXMkc3RvcmUkZ2V0U3RhdGUyID0gc2xpY2VkVG9BcnJheShfdGhpcyRzdG9yZSRnZXRTdGF0ZSwgMiksXG4gICAgICAgICAgICBkYXRhID0gX3RoaXMkc3RvcmUkZ2V0U3RhdGUyWzBdLFxuICAgICAgICAgICAgY2hhbmdlZEtleSA9IF90aGlzJHN0b3JlJGdldFN0YXRlMlsxXTtcblxuICAgICAgICB2YXIgY2FsbGJhY2sgPSB1cGRhdGVzW2NoYW5nZWRLZXldO1xuICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKGRhdGFbY2hhbmdlZEtleV0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgdG9cbiAgICAgKiBAZGVzY3JpcHRpb24gU3dpdGNoIHRvIGNvbmZpZ3VyYXRpb24uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGNvbmZpZ05hbWUgQ29uZmlndXJhdGlvbiBuYW1lLlxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuU3RhdGVNb2R1bGVcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj4gQ2hhbmdlcyBjb25maWd1cmF0aW9uIHRvIGBncmVlbmA8L2NhcHRpb24+XG4gICAgICogc3RhdGUudG8oJ2dyZWVuJyk7XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ0b1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0byhjb25maWdOYW1lKSB7XG4gICAgICB0aGlzLnByZXZDb25maWcgPSB0aGlzLmN1cnJlbnRDb25maWc7XG4gICAgICB0aGlzLmN1cnJlbnRDb25maWcgPSBjb25maWdOYW1lO1xuICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuY29uZmlndXJhdGlvbltjb25maWdOYW1lXSA/IHRoaXMuY29uZmlndXJhdGlvbltjb25maWdOYW1lXSA6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0O1xuICAgICAgdGhpcy5zZXQoY29uZmlnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBzZXRcbiAgICAgKiBAZGVzY3JpcHRpb24gU2V0IGN1cnJlbnQgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5TdGF0ZU1vZHVsZVxuICAgICAqIEBleGFtcGxlXG4gICAgICogc3RhdGUuc2V0KHtcbiAgICAgKiAgIHNwaGVyZUNvbG9yOiAweDAwZmYwMFxuICAgICAqIH0pO1xuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldChkYXRhKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xuICAgICAgICBpZiAoa2V5KSB0aGlzLnN0b3JlLmRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiAnQUREJyxcbiAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgZ2V0XG4gICAgICogQGRlc2NyaXB0aW9uIFJldHVybiBkYXRhIG9mIHBhcmFtZXRlci5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IFBhcmFtZXRlciBuYW1lLlxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuU3RhdGVNb2R1bGVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHN0YXRlLmdldCgnc3BoZXJlQ29sb3InKTsgLy8gMHgwMGZmMDBcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRTdGF0ZSgpWzBdW2tleV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgcHJldlxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXR1cm4gYHRydWVWYWxgIGlmIGBjb25maWdgIG1hdGNoIHByZXZpb3VzIGNvbmZpZ3VyYXRpb24sIGluIG90aGVyIGNhc2UgLSByZXR1cm4gYGZhbHNlVmFsYC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29uZmlnIENvbmZpZ3VyYXRpb24gbmFtZS5cbiAgICAgKiBAcGFyYW0ge0FueX0gdHJ1ZVZhbCBWYWx1ZSByZXR1cm5lZCBpZiBjb25kaXRpb24gaXMgdHJ1dGh5LlxuICAgICAqIEBwYXJhbSB7QW55fSBmYWxzZVZhbCBWYWx1ZSByZXR1cm5lZCBpZiBjb25kaXRpb24gaXMgZmFsc3kuXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5TdGF0ZU1vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicHJldlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwcmV2KGNvbmZpZywgdHJ1ZVZhbCwgZmFsc2VWYWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnByZXZDb25maWcgPT09IGNvbmZpZyA/IHRydWVWYWwgOiBmYWxzZVZhbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBjdXJyZW50XG4gICAgICogQGRlc2NyaXB0aW9uIFJldHVybiBgdHJ1ZVZhbGAgaWYgYGNvbmZpZ2AgbWF0Y2ggY3VycmVudCBjb25maWd1cmF0aW9uLCBpbiBvdGhlciBjYXNlIC0gcmV0dXJuIGBmYWxzZVZhbGAuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGNvbmZpZyBDb25maWd1cmF0aW9uIG5hbWUuXG4gICAgICogQHBhcmFtIHtBbnl9IHRydWVWYWwgVmFsdWUgcmV0dXJuZWQgaWYgY29uZGl0aW9uIGlzIHRydXRoeS5cbiAgICAgKiBAcGFyYW0ge0FueX0gZmFsc2VWYWwgVmFsdWUgcmV0dXJuZWQgaWYgY29uZGl0aW9uIGlzIGZhbHN5LlxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuU3RhdGVNb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImN1cnJlbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY3VycmVudChjb25maWcsIHRydWVWYWwsIGZhbHNlVmFsKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyZW50Q29uZmlnID09PSBjb25maWcgPyB0cnVlVmFsIDogZmFsc2VWYWw7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFN0YXRlTW9kdWxlO1xufSgpO1xuXG4vLyBVbmxpa2UgVHJhY2tiYWxsQ29udHJvbHMsIGl0IG1haW50YWlucyB0aGUgXCJ1cFwiIGRpcmVjdGlvbiBvYmplY3QudXAgKCtZIGJ5IGRlZmF1bHQpLlxuLy9cbi8vICAgIE9yYml0IC0gbGVmdCBtb3VzZSAvIHRvdWNoOiBvbmUgZmluZ2VyIG1vdmVcbi8vICAgIFpvb20gLSBtaWRkbGUgbW91c2UsIG9yIG1vdXNld2hlZWwgLyB0b3VjaDogdHdvIGZpbmdlciBzcHJlYWQgb3Igc3F1aXNoXG4vLyAgICBQYW4gLSByaWdodCBtb3VzZSwgb3IgYXJyb3cga2V5cyAvIHRvdWNoOiB0aHJlZSBmaW50ZXIgc3dpcGVcblxudmFyIFRocmVlT3JiaXRDb250cm9scyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0V2ZW50RGlzcGF0Y2hlcikge1xuICBmdW5jdGlvbiBUaHJlZU9yYml0Q29udHJvbHMob2JqZWN0LCBkb21FbGVtZW50LCBldmVudEhhbmRsZXIpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBUaHJlZU9yYml0Q29udHJvbHMpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoVGhyZWVPcmJpdENvbnRyb2xzKS5jYWxsKHRoaXMpKTtcbiAgICBfdGhpcy5vYmplY3QgPSBvYmplY3Q7XG4gICAgX3RoaXMuZG9tRWxlbWVudCA9IGRvbUVsZW1lbnQgPT09IHVuZGVmaW5lZCA/IGRvY3VtZW50IDogZG9tRWxlbWVudDtcbiAgICBfdGhpcy5ldmVudEhhbmRsZXIgPSBldmVudEhhbmRsZXI7IC8vIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHRoaXMgY29udHJvbFxuXG4gICAgX3RoaXMuZW5hYmxlZCA9IHRydWU7IC8vIFwidGFyZ2V0XCIgc2V0cyB0aGUgbG9jYXRpb24gb2YgZm9jdXMsIHdoZXJlIHRoZSBvYmplY3Qgb3JiaXRzIGFyb3VuZFxuXG4gICAgX3RoaXMudGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTsgLy8gSG93IGZhciB5b3UgY2FuIGRvbGx5IGluIGFuZCBvdXQgKCBQZXJzcGVjdGl2ZUNhbWVyYSBvbmx5IClcblxuICAgIF90aGlzLm1pbkRpc3RhbmNlID0gMDtcbiAgICBfdGhpcy5tYXhEaXN0YW5jZSA9IEluZmluaXR5OyAvLyBIb3cgZmFyIHlvdSBjYW4gem9vbSBpbiBhbmQgb3V0ICggT3J0aG9ncmFwaGljQ2FtZXJhIG9ubHkgKVxuXG4gICAgX3RoaXMubWluWm9vbSA9IDA7XG4gICAgX3RoaXMubWF4Wm9vbSA9IEluZmluaXR5OyAvLyBIb3cgZmFyIHlvdSBjYW4gb3JiaXQgdmVydGljYWxseSwgdXBwZXIgYW5kIGxvd2VyIGxpbWl0cy5cbiAgICAvLyBSYW5nZSBpcyAwIHRvIE1hdGguUEkgcmFkaWFucy5cblxuICAgIF90aGlzLm1pblBvbGFyQW5nbGUgPSAwOyAvLyByYWRpYW5zXG5cbiAgICBfdGhpcy5tYXhQb2xhckFuZ2xlID0gTWF0aC5QSTsgLy8gcmFkaWFuc1xuICAgIC8vIEhvdyBmYXIgeW91IGNhbiBvcmJpdCBob3Jpem9udGFsbHksIHVwcGVyIGFuZCBsb3dlciBsaW1pdHMuXG4gICAgLy8gSWYgc2V0LCBtdXN0IGJlIGEgc3ViLWludGVydmFsIG9mIHRoZSBpbnRlcnZhbCBbIC0gTWF0aC5QSSwgTWF0aC5QSSBdLlxuXG4gICAgX3RoaXMubWluQXppbXV0aEFuZ2xlID0gLUluZmluaXR5OyAvLyByYWRpYW5zXG5cbiAgICBfdGhpcy5tYXhBemltdXRoQW5nbGUgPSBJbmZpbml0eTsgLy8gcmFkaWFuc1xuICAgIC8vIFNldCB0byB0cnVlIHRvIGVuYWJsZSBkYW1waW5nIChpbmVydGlhKVxuICAgIC8vIElmIGRhbXBpbmcgaXMgZW5hYmxlZCwgeW91IG11c3QgY2FsbCBjb250cm9scy51cGRhdGUoKSBpbiB5b3VyIGFuaW1hdGlvbiBsb29wXG5cbiAgICBfdGhpcy5lbmFibGVEYW1waW5nID0gZmFsc2U7XG4gICAgX3RoaXMuZGFtcGluZ0ZhY3RvciA9IDAuMjU7IC8vIFRoaXMgb3B0aW9uIGFjdHVhbGx5IGVuYWJsZXMgZG9sbHlpbmcgaW4gYW5kIG91dDsgbGVmdCBhcyBcInpvb21cIiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgLy8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgem9vbWluZ1xuXG4gICAgX3RoaXMuZW5hYmxlWm9vbSA9IHRydWU7XG4gICAgX3RoaXMuem9vbVNwZWVkID0gMS4wOyAvLyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSByb3RhdGluZ1xuXG4gICAgX3RoaXMuZW5hYmxlUm90YXRlID0gdHJ1ZTtcbiAgICBfdGhpcy5yb3RhdGVTcGVlZCA9IDEuMDsgLy8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgcGFubmluZ1xuXG4gICAgX3RoaXMuZW5hYmxlUGFuID0gdHJ1ZTtcbiAgICBfdGhpcy5rZXlQYW5TcGVlZCA9IDcuMDsgLy8gcGl4ZWxzIG1vdmVkIHBlciBhcnJvdyBrZXkgcHVzaFxuICAgIC8vIFNldCB0byB0cnVlIHRvIGF1dG9tYXRpY2FsbHkgcm90YXRlIGFyb3VuZCB0aGUgdGFyZ2V0XG4gICAgLy8gSWYgYXV0by1yb3RhdGUgaXMgZW5hYmxlZCwgeW91IG11c3QgY2FsbCBjb250cm9scy51cGRhdGUoKSBpbiB5b3VyIGFuaW1hdGlvbiBsb29wXG5cbiAgICBfdGhpcy5hdXRvUm90YXRlID0gZmFsc2U7XG4gICAgX3RoaXMuYXV0b1JvdGF0ZVNwZWVkID0gMi4wOyAvLyAzMCBzZWNvbmRzIHBlciByb3VuZCB3aGVuIGZwcyBpcyA2MFxuICAgIC8vIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHVzZSBvZiB0aGUga2V5c1xuXG4gICAgX3RoaXMuZW5hYmxlS2V5cyA9IHRydWU7IC8vIFRoZSBmb3VyIGFycm93IGtleXNcblxuICAgIF90aGlzLmtleXMgPSB7XG4gICAgICBMRUZUOiAzNyxcbiAgICAgIFVQOiAzOCxcbiAgICAgIFJJR0hUOiAzOSxcbiAgICAgIEJPVFRPTTogNDBcbiAgICB9OyAvLyBNb3VzZSBidXR0b25zXG5cbiAgICBfdGhpcy5tb3VzZUJ1dHRvbnMgPSB7XG4gICAgICBPUkJJVDogTU9VU0UuTEVGVCxcbiAgICAgIFpPT006IE1PVVNFLk1JRERMRSxcbiAgICAgIFBBTjogTU9VU0UuUklHSFRcbiAgICB9OyAvLyBmb3IgcmVzZXRcblxuICAgIF90aGlzLnRhcmdldDAgPSBfdGhpcy50YXJnZXQuY2xvbmUoKTtcbiAgICBfdGhpcy5wb3NpdGlvbjAgPSBfdGhpcy5vYmplY3QucG9zaXRpb24uY2xvbmUoKTtcbiAgICBfdGhpcy56b29tMCA9IF90aGlzLm9iamVjdC56b29tOyAvL1xuICAgIC8vIHB1YmxpYyBtZXRob2RzXG4gICAgLy9cblxuICAgIF90aGlzLmdldFBvbGFyQW5nbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gc3BoZXJpY2FsLnBoaTtcbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0QXppbXV0aGFsQW5nbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gc3BoZXJpY2FsLnRoZXRhO1xuICAgIH07XG5cbiAgICBfdGhpcy5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLnRhcmdldC5jb3B5KF90aGlzLnRhcmdldDApO1xuXG4gICAgICBfdGhpcy5vYmplY3QucG9zaXRpb24uY29weShfdGhpcy5wb3NpdGlvbjApO1xuXG4gICAgICBfdGhpcy5vYmplY3Quem9vbSA9IF90aGlzLnpvb20wO1xuXG4gICAgICBfdGhpcy5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG4gICAgICBfdGhpcy5kaXNwYXRjaEV2ZW50KGNoYW5nZUV2ZW50KTtcblxuICAgICAgX3RoaXMudXBkYXRlKCk7XG5cbiAgICAgIHN0YXRlID0gU1RBVEUuTk9ORTtcbiAgICB9OyAvLyB0aGlzIG1ldGhvZCBpcyBleHBvc2VkLCBidXQgcGVyaGFwcyBpdCB3b3VsZCBiZSBiZXR0ZXIgaWYgd2UgY2FuIG1ha2UgaXQgcHJpdmF0ZS4uLlxuXG5cbiAgICBfdGhpcy51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgb2Zmc2V0ID0gbmV3IFZlY3RvcjMoKTsgLy8gc28gY2FtZXJhLnVwIGlzIHRoZSBvcmJpdCBheGlzXG5cbiAgICAgIHZhciBxdWF0ID0gbmV3IFF1YXRlcm5pb24oKS5zZXRGcm9tVW5pdFZlY3RvcnMob2JqZWN0LnVwLCBuZXcgVmVjdG9yMygwLCAxLCAwKSk7XG4gICAgICB2YXIgcXVhdEludmVyc2UgPSBxdWF0LmNsb25lKCkuaW52ZXJzZSgpO1xuICAgICAgdmFyIGxhc3RQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG4gICAgICB2YXIgbGFzdFF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gX3RoaXMub2JqZWN0LnBvc2l0aW9uO1xuICAgICAgICBvZmZzZXQuY29weShwb3NpdGlvbikuc3ViKF90aGlzLnRhcmdldCk7IC8vIHJvdGF0ZSBvZmZzZXQgdG8gXCJ5LWF4aXMtaXMtdXBcIiBzcGFjZVxuXG4gICAgICAgIG9mZnNldC5hcHBseVF1YXRlcm5pb24ocXVhdCk7IC8vIGFuZ2xlIGZyb20gei1heGlzIGFyb3VuZCB5LWF4aXNcblxuICAgICAgICBzcGhlcmljYWwuc2V0RnJvbVZlY3RvcjMob2Zmc2V0KTtcbiAgICAgICAgaWYgKF90aGlzLmF1dG9Sb3RhdGUgJiYgc3RhdGUgPT09IFNUQVRFLk5PTkUpIHJvdGF0ZUxlZnQoZ2V0QXV0b1JvdGF0aW9uQW5nbGUoKSk7XG4gICAgICAgIHNwaGVyaWNhbC50aGV0YSArPSBzcGhlcmljYWxEZWx0YS50aGV0YTtcbiAgICAgICAgc3BoZXJpY2FsLnBoaSArPSBzcGhlcmljYWxEZWx0YS5waGk7IC8vIHJlc3RyaWN0IHRoZXRhIHRvIGJlIGJldHdlZW4gZGVzaXJlZCBsaW1pdHNcblxuICAgICAgICBzcGhlcmljYWwudGhldGEgPSBNYXRoLm1heChfdGhpcy5taW5BemltdXRoQW5nbGUsIE1hdGgubWluKF90aGlzLm1heEF6aW11dGhBbmdsZSwgc3BoZXJpY2FsLnRoZXRhKSk7IC8vIHJlc3RyaWN0IHBoaSB0byBiZSBiZXR3ZWVuIGRlc2lyZWQgbGltaXRzXG5cbiAgICAgICAgc3BoZXJpY2FsLnBoaSA9IE1hdGgubWF4KF90aGlzLm1pblBvbGFyQW5nbGUsIE1hdGgubWluKF90aGlzLm1heFBvbGFyQW5nbGUsIHNwaGVyaWNhbC5waGkpKTtcbiAgICAgICAgc3BoZXJpY2FsLm1ha2VTYWZlKCk7XG4gICAgICAgIHNwaGVyaWNhbC5yYWRpdXMgKj0gc2NhbGU7IC8vIHJlc3RyaWN0IHJhZGl1cyB0byBiZSBiZXR3ZWVuIGRlc2lyZWQgbGltaXRzXG5cbiAgICAgICAgc3BoZXJpY2FsLnJhZGl1cyA9IE1hdGgubWF4KF90aGlzLm1pbkRpc3RhbmNlLCBNYXRoLm1pbihfdGhpcy5tYXhEaXN0YW5jZSwgc3BoZXJpY2FsLnJhZGl1cykpOyAvLyBtb3ZlIHRhcmdldCB0byBwYW5uZWQgbG9jYXRpb25cblxuICAgICAgICBfdGhpcy50YXJnZXQuYWRkKHBhbk9mZnNldCk7XG5cbiAgICAgICAgb2Zmc2V0LnNldEZyb21TcGhlcmljYWwoc3BoZXJpY2FsKTsgLy8gcm90YXRlIG9mZnNldCBiYWNrIHRvIFwiY2FtZXJhLXVwLXZlY3Rvci1pcy11cFwiIHNwYWNlXG5cbiAgICAgICAgb2Zmc2V0LmFwcGx5UXVhdGVybmlvbihxdWF0SW52ZXJzZSk7XG4gICAgICAgIHBvc2l0aW9uLmNvcHkoX3RoaXMudGFyZ2V0KS5hZGQob2Zmc2V0KTtcblxuICAgICAgICBfdGhpcy5vYmplY3QubG9va0F0KF90aGlzLnRhcmdldCk7XG5cbiAgICAgICAgaWYgKF90aGlzLmVuYWJsZURhbXBpbmcgPT09IHRydWUpIHtcbiAgICAgICAgICBzcGhlcmljYWxEZWx0YS50aGV0YSAqPSAxIC0gX3RoaXMuZGFtcGluZ0ZhY3RvcjtcbiAgICAgICAgICBzcGhlcmljYWxEZWx0YS5waGkgKj0gMSAtIF90aGlzLmRhbXBpbmdGYWN0b3I7XG4gICAgICAgIH0gZWxzZSBzcGhlcmljYWxEZWx0YS5zZXQoMCwgMCwgMCk7XG5cbiAgICAgICAgc2NhbGUgPSAxO1xuICAgICAgICBwYW5PZmZzZXQuc2V0KDAsIDAsIDApOyAvLyB1cGRhdGUgY29uZGl0aW9uIGlzOlxuICAgICAgICAvLyBtaW4oY2FtZXJhIGRpc3BsYWNlbWVudCwgY2FtZXJhIHJvdGF0aW9uIGluIHJhZGlhbnMpXjIgPiBFUFNcbiAgICAgICAgLy8gdXNpbmcgc21hbGwtYW5nbGUgYXBwcm94aW1hdGlvbiBjb3MoeC8yKSA9IDEgLSB4XjIgLyA4XG5cbiAgICAgICAgaWYgKHpvb21DaGFuZ2VkIHx8IGxhc3RQb3NpdGlvbi5kaXN0YW5jZVRvU3F1YXJlZChfdGhpcy5vYmplY3QucG9zaXRpb24pID4gRVBTIHx8IDggKiAoMSAtIGxhc3RRdWF0ZXJuaW9uLmRvdChfdGhpcy5vYmplY3QucXVhdGVybmlvbikpID4gRVBTKSB7XG4gICAgICAgICAgX3RoaXMuZGlzcGF0Y2hFdmVudChjaGFuZ2VFdmVudCk7XG5cbiAgICAgICAgICBsYXN0UG9zaXRpb24uY29weShfdGhpcy5vYmplY3QucG9zaXRpb24pO1xuICAgICAgICAgIGxhc3RRdWF0ZXJuaW9uLmNvcHkoX3RoaXMub2JqZWN0LnF1YXRlcm5pb24pO1xuICAgICAgICAgIHpvb21DaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KCk7XG4gICAgfTtcblxuICAgIF90aGlzLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jywgb25Db250ZXh0TWVudSwgZmFsc2UpO1xuXG4gICAgICBfdGhpcy5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uTW91c2VEb3duLCBmYWxzZSk7XG5cbiAgICAgIF90aGlzLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBvbk1vdXNlV2hlZWwsIGZhbHNlKTtcblxuICAgICAgX3RoaXMuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgb25Ub3VjaFN0YXJ0LCBmYWxzZSk7XG5cbiAgICAgIF90aGlzLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvblRvdWNoRW5kLCBmYWxzZSk7XG5cbiAgICAgIF90aGlzLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Ub3VjaE1vdmUsIGZhbHNlKTtcblxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUsIGZhbHNlKTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXAsIGZhbHNlKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlEb3duLCBmYWxzZSk7IC8vIHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApOyAvLyBzaG91bGQgdGhpcyBiZSBhZGRlZCBoZXJlP1xuICAgIH07IC8vXG4gICAgLy8gaW50ZXJuYWxzXG4gICAgLy9cblxuXG4gICAgdmFyIGNoYW5nZUV2ZW50ID0ge1xuICAgICAgdHlwZTogJ2NoYW5nZSdcbiAgICB9O1xuICAgIHZhciBzdGFydEV2ZW50ID0ge1xuICAgICAgdHlwZTogJ3N0YXJ0J1xuICAgIH07XG4gICAgdmFyIGVuZEV2ZW50ID0ge1xuICAgICAgdHlwZTogJ2VuZCdcbiAgICB9O1xuICAgIHZhciBTVEFURSA9IHtcbiAgICAgIE5PTkU6IC0xLFxuICAgICAgUk9UQVRFOiAwLFxuICAgICAgRE9MTFk6IDEsXG4gICAgICBQQU46IDIsXG4gICAgICBUT1VDSF9ST1RBVEU6IDMsXG4gICAgICBUT1VDSF9ET0xMWTogNCxcbiAgICAgIFRPVUNIX1BBTjogNVxuICAgIH07XG4gICAgdmFyIHN0YXRlID0gU1RBVEUuTk9ORTtcbiAgICB2YXIgRVBTID0gMC4wMDAwMDE7IC8vIGN1cnJlbnQgcG9zaXRpb24gaW4gc3BoZXJpY2FsIGNvb3JkaW5hdGVzXG5cbiAgICB2YXIgc3BoZXJpY2FsID0gbmV3IFNwaGVyaWNhbCgpO1xuICAgIHZhciBzcGhlcmljYWxEZWx0YSA9IG5ldyBTcGhlcmljYWwoKTtcbiAgICB2YXIgc2NhbGUgPSAxO1xuICAgIHZhciBwYW5PZmZzZXQgPSBuZXcgVmVjdG9yMygpO1xuICAgIHZhciB6b29tQ2hhbmdlZCA9IGZhbHNlO1xuICAgIHZhciByb3RhdGVTdGFydCA9IG5ldyBWZWN0b3IyKCk7XG4gICAgdmFyIHJvdGF0ZUVuZCA9IG5ldyBWZWN0b3IyKCk7XG4gICAgdmFyIHJvdGF0ZURlbHRhID0gbmV3IFZlY3RvcjIoKTtcbiAgICB2YXIgcGFuU3RhcnQgPSBuZXcgVmVjdG9yMigpO1xuICAgIHZhciBwYW5FbmQgPSBuZXcgVmVjdG9yMigpO1xuICAgIHZhciBwYW5EZWx0YSA9IG5ldyBWZWN0b3IyKCk7XG4gICAgdmFyIGRvbGx5U3RhcnQgPSBuZXcgVmVjdG9yMigpO1xuICAgIHZhciBkb2xseUVuZCA9IG5ldyBWZWN0b3IyKCk7XG4gICAgdmFyIGRvbGx5RGVsdGEgPSBuZXcgVmVjdG9yMigpO1xuXG4gICAgdmFyIGdldEF1dG9Sb3RhdGlvbkFuZ2xlID0gZnVuY3Rpb24gZ2V0QXV0b1JvdGF0aW9uQW5nbGUoKSB7XG4gICAgICByZXR1cm4gMiAqIE1hdGguUEkgLyA2MCAvIDYwICogX3RoaXMuYXV0b1JvdGF0ZVNwZWVkO1xuICAgIH07XG5cbiAgICB2YXIgZ2V0Wm9vbVNjYWxlID0gZnVuY3Rpb24gZ2V0Wm9vbVNjYWxlKCkge1xuICAgICAgcmV0dXJuIE1hdGgucG93KDAuOTUsIF90aGlzLnpvb21TcGVlZCk7XG4gICAgfTtcblxuICAgIHZhciByb3RhdGVMZWZ0ID0gZnVuY3Rpb24gcm90YXRlTGVmdChhbmdsZSkge1xuICAgICAgc3BoZXJpY2FsRGVsdGEudGhldGEgLT0gYW5nbGU7XG4gICAgfTtcblxuICAgIHZhciByb3RhdGVVcCA9IGZ1bmN0aW9uIHJvdGF0ZVVwKGFuZ2xlKSB7XG4gICAgICBzcGhlcmljYWxEZWx0YS5waGkgLT0gYW5nbGU7XG4gICAgfTtcblxuICAgIHZhciBwYW5MZWZ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHYgPSBuZXcgVmVjdG9yMygpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChkaXN0YW5jZSwgb2JqZWN0TWF0cml4KSB7XG4gICAgICAgIHYuc2V0RnJvbU1hdHJpeENvbHVtbihvYmplY3RNYXRyaXgsIDApOyAvLyBnZXQgWCBjb2x1bW4gb2Ygb2JqZWN0TWF0cml4XG5cbiAgICAgICAgdi5tdWx0aXBseVNjYWxhcigtZGlzdGFuY2UpO1xuICAgICAgICBwYW5PZmZzZXQuYWRkKHYpO1xuICAgICAgfTtcbiAgICB9KCk7XG5cbiAgICB2YXIgcGFuVXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdiA9IG5ldyBWZWN0b3IzKCk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGRpc3RhbmNlLCBvYmplY3RNYXRyaXgpIHtcbiAgICAgICAgdi5zZXRGcm9tTWF0cml4Q29sdW1uKG9iamVjdE1hdHJpeCwgMSk7IC8vIGdldCBZIGNvbHVtbiBvZiBvYmplY3RNYXRyaXhcblxuICAgICAgICB2Lm11bHRpcGx5U2NhbGFyKGRpc3RhbmNlKTtcbiAgICAgICAgcGFuT2Zmc2V0LmFkZCh2KTtcbiAgICAgIH07XG4gICAgfSgpOyAvLyBkZWx0YVggYW5kIGRlbHRhWSBhcmUgaW4gcGl4ZWxzOyByaWdodCBhbmQgZG93biBhcmUgcG9zaXRpdmVcblxuXG4gICAgdmFyIHBhbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBvZmZzZXQgPSBuZXcgVmVjdG9yMygpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChkZWx0YVgsIGRlbHRhWSkge1xuICAgICAgICB2YXIgZWxlbWVudCA9IF90aGlzLmRvbUVsZW1lbnQgPT09IGRvY3VtZW50ID8gX3RoaXMuZG9tRWxlbWVudC5ib2R5IDogX3RoaXMuZG9tRWxlbWVudDtcblxuICAgICAgICBpZiAoX3RoaXMub2JqZWN0IGluc3RhbmNlb2YgUGVyc3BlY3RpdmVDYW1lcmEpIHtcbiAgICAgICAgICAvLyBwZXJzcGVjdGl2ZVxuICAgICAgICAgIHZhciBwb3NpdGlvbiA9IF90aGlzLm9iamVjdC5wb3NpdGlvbjtcbiAgICAgICAgICBvZmZzZXQuY29weShwb3NpdGlvbikuc3ViKF90aGlzLnRhcmdldCk7XG4gICAgICAgICAgdmFyIHRhcmdldERpc3RhbmNlID0gb2Zmc2V0Lmxlbmd0aCgpOyAvLyBoYWxmIG9mIHRoZSBmb3YgaXMgY2VudGVyIHRvIHRvcCBvZiBzY3JlZW5cblxuICAgICAgICAgIHRhcmdldERpc3RhbmNlICo9IE1hdGgudGFuKF90aGlzLm9iamVjdC5mb3YgLyAyICogTWF0aC5QSSAvIDE4MC4wKTsgLy8gd2UgYWN0dWFsbHkgZG9uJ3QgdXNlIHNjcmVlbldpZHRoLCBzaW5jZSBwZXJzcGVjdGl2ZSBjYW1lcmEgaXMgZml4ZWQgdG8gc2NyZWVuIGhlaWdodFxuXG4gICAgICAgICAgcGFuTGVmdCgyICogZGVsdGFYICogdGFyZ2V0RGlzdGFuY2UgLyBlbGVtZW50LmNsaWVudEhlaWdodCwgX3RoaXMub2JqZWN0Lm1hdHJpeCk7XG4gICAgICAgICAgcGFuVXAoMiAqIGRlbHRhWSAqIHRhcmdldERpc3RhbmNlIC8gZWxlbWVudC5jbGllbnRIZWlnaHQsIF90aGlzLm9iamVjdC5tYXRyaXgpO1xuICAgICAgICB9IGVsc2UgaWYgKF90aGlzLm9iamVjdCBpbnN0YW5jZW9mIE9ydGhvZ3JhcGhpY0NhbWVyYSkge1xuICAgICAgICAgIC8vIG9ydGhvZ3JhcGhpY1xuICAgICAgICAgIHBhbkxlZnQoZGVsdGFYICogKF90aGlzLm9iamVjdC5yaWdodCAtIF90aGlzLm9iamVjdC5sZWZ0KSAvIF90aGlzLm9iamVjdC56b29tIC8gZWxlbWVudC5jbGllbnRXaWR0aCwgX3RoaXMub2JqZWN0Lm1hdHJpeCk7XG4gICAgICAgICAgcGFuVXAoZGVsdGFZICogKF90aGlzLm9iamVjdC50b3AgLSBfdGhpcy5vYmplY3QuYm90dG9tKSAvIF90aGlzLm9iamVjdC56b29tIC8gZWxlbWVudC5jbGllbnRIZWlnaHQsIF90aGlzLm9iamVjdC5tYXRyaXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGNhbWVyYSBuZWl0aGVyIG9ydGhvZ3JhcGhpYyBub3IgcGVyc3BlY3RpdmVcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1dBUk5JTkc6IE9yYml0Q29udHJvbHNNb2R1bGUuanMgZW5jb3VudGVyZWQgYW4gdW5rbm93biBjYW1lcmEgdHlwZSAtIHBhbiBkaXNhYmxlZC4nKTtcbiAgICAgICAgICBfdGhpcy5lbmFibGVQYW4gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KCk7XG5cbiAgICB2YXIgZG9sbHlJbiA9IGZ1bmN0aW9uIGRvbGx5SW4oZG9sbHlTY2FsZSkge1xuICAgICAgaWYgKF90aGlzLm9iamVjdCBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlQ2FtZXJhKSBzY2FsZSAvPSBkb2xseVNjYWxlO2Vsc2UgaWYgKF90aGlzLm9iamVjdCBpbnN0YW5jZW9mIE9ydGhvZ3JhcGhpY0NhbWVyYSkge1xuICAgICAgICBfdGhpcy5vYmplY3Quem9vbSA9IE1hdGgubWF4KF90aGlzLm1pblpvb20sIE1hdGgubWluKF90aGlzLm1heFpvb20sIF90aGlzLm9iamVjdC56b29tICogZG9sbHlTY2FsZSkpO1xuXG4gICAgICAgIF90aGlzLm9iamVjdC51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cbiAgICAgICAgem9vbUNoYW5nZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdXQVJOSU5HOiBPcmJpdENvbnRyb2xzTW9kdWxlLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBkb2xseS96b29tIGRpc2FibGVkLicpO1xuICAgICAgICBfdGhpcy5lbmFibGVab29tID0gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBkb2xseU91dCA9IGZ1bmN0aW9uIGRvbGx5T3V0KGRvbGx5U2NhbGUpIHtcbiAgICAgIGlmIChfdGhpcy5vYmplY3QgaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZUNhbWVyYSkgc2NhbGUgKj0gZG9sbHlTY2FsZTtlbHNlIGlmIChfdGhpcy5vYmplY3QgaW5zdGFuY2VvZiBPcnRob2dyYXBoaWNDYW1lcmEpIHtcbiAgICAgICAgX3RoaXMub2JqZWN0Lnpvb20gPSBNYXRoLm1heChfdGhpcy5taW5ab29tLCBNYXRoLm1pbihfdGhpcy5tYXhab29tLCBfdGhpcy5vYmplY3Quem9vbSAvIGRvbGx5U2NhbGUpKTtcblxuICAgICAgICBfdGhpcy5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG4gICAgICAgIHpvb21DaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignV0FSTklORzogT3JiaXRDb250cm9sc01vZHVsZS5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlIC0gZG9sbHkvem9vbSBkaXNhYmxlZC4nKTtcbiAgICAgICAgX3RoaXMuZW5hYmxlWm9vbSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH07IC8vXG4gICAgLy8gZXZlbnQgY2FsbGJhY2tzIC0gdXBkYXRlIHRoZSBvYmplY3Qgc3RhdGVcbiAgICAvL1xuXG5cbiAgICB2YXIgaGFuZGxlTW91c2VEb3duUm90YXRlID0gZnVuY3Rpb24gaGFuZGxlTW91c2VEb3duUm90YXRlKGV2ZW50KSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlRG93blJvdGF0ZScgKTtcbiAgICAgIHJvdGF0ZVN0YXJ0LnNldChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcbiAgICB9O1xuXG4gICAgdmFyIGhhbmRsZU1vdXNlRG93bkRvbGx5ID0gZnVuY3Rpb24gaGFuZGxlTW91c2VEb3duRG9sbHkoZXZlbnQpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCAnaGFuZGxlTW91c2VEb3duRG9sbHknICk7XG4gICAgICBkb2xseVN0YXJ0LnNldChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcbiAgICB9O1xuXG4gICAgdmFyIGhhbmRsZU1vdXNlRG93blBhbiA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlRG93blBhbihldmVudCkge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVNb3VzZURvd25QYW4nICk7XG4gICAgICBwYW5TdGFydC5zZXQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgfTtcblxuICAgIHZhciBoYW5kbGVNb3VzZU1vdmVSb3RhdGUgPSBmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmVSb3RhdGUoZXZlbnQpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCAnaGFuZGxlTW91c2VNb3ZlUm90YXRlJyApO1xuICAgICAgcm90YXRlRW5kLnNldChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcbiAgICAgIHJvdGF0ZURlbHRhLnN1YlZlY3RvcnMocm90YXRlRW5kLCByb3RhdGVTdGFydCk7XG4gICAgICB2YXIgZWxlbWVudCA9IF90aGlzLmRvbUVsZW1lbnQgPT09IGRvY3VtZW50ID8gX3RoaXMuZG9tRWxlbWVudC5ib2R5IDogX3RoaXMuZG9tRWxlbWVudDsgLy8gcm90YXRpbmcgYWNyb3NzIHdob2xlIHNjcmVlbiBnb2VzIDM2MCBkZWdyZWVzIGFyb3VuZFxuXG4gICAgICByb3RhdGVMZWZ0KDIgKiBNYXRoLlBJICogcm90YXRlRGVsdGEueCAvIGVsZW1lbnQuY2xpZW50V2lkdGggKiBfdGhpcy5yb3RhdGVTcGVlZCk7IC8vIHJvdGF0aW5nIHVwIGFuZCBkb3duIGFsb25nIHdob2xlIHNjcmVlbiBhdHRlbXB0cyB0byBnbyAzNjAsIGJ1dCBsaW1pdGVkIHRvIDE4MFxuXG4gICAgICByb3RhdGVVcCgyICogTWF0aC5QSSAqIHJvdGF0ZURlbHRhLnkgLyBlbGVtZW50LmNsaWVudEhlaWdodCAqIF90aGlzLnJvdGF0ZVNwZWVkKTtcbiAgICAgIHJvdGF0ZVN0YXJ0LmNvcHkocm90YXRlRW5kKTtcblxuICAgICAgX3RoaXMudXBkYXRlKCk7XG4gICAgfTtcblxuICAgIHZhciBoYW5kbGVNb3VzZU1vdmVEb2xseSA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlTW92ZURvbGx5KGV2ZW50KSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlTW92ZURvbGx5JyApO1xuICAgICAgZG9sbHlFbmQuc2V0KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgICAgZG9sbHlEZWx0YS5zdWJWZWN0b3JzKGRvbGx5RW5kLCBkb2xseVN0YXJ0KTtcbiAgICAgIGlmIChkb2xseURlbHRhLnkgPiAwKSBkb2xseUluKGdldFpvb21TY2FsZSgpKTtlbHNlIGlmIChkb2xseURlbHRhLnkgPCAwKSBkb2xseU91dChnZXRab29tU2NhbGUoKSk7XG4gICAgICBkb2xseVN0YXJ0LmNvcHkoZG9sbHlFbmQpO1xuXG4gICAgICBfdGhpcy51cGRhdGUoKTtcbiAgICB9O1xuXG4gICAgdmFyIGhhbmRsZU1vdXNlTW92ZVBhbiA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlTW92ZVBhbihldmVudCkge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVNb3VzZU1vdmVQYW4nICk7XG4gICAgICBwYW5FbmQuc2V0KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgICAgcGFuRGVsdGEuc3ViVmVjdG9ycyhwYW5FbmQsIHBhblN0YXJ0KTtcbiAgICAgIHBhbihwYW5EZWx0YS54LCBwYW5EZWx0YS55KTtcbiAgICAgIHBhblN0YXJ0LmNvcHkocGFuRW5kKTtcblxuICAgICAgX3RoaXMudXBkYXRlKCk7XG4gICAgfTtcblxuICAgIHZhciBoYW5kbGVNb3VzZVdoZWVsID0gZnVuY3Rpb24gaGFuZGxlTW91c2VXaGVlbChldmVudCkge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVNb3VzZVdoZWVsJyApO1xuICAgICAgaWYgKGV2ZW50LmRlbHRhWSA8IDApIGRvbGx5T3V0KGdldFpvb21TY2FsZSgpKTtlbHNlIGlmIChldmVudC5kZWx0YVkgPiAwKSBkb2xseUluKGdldFpvb21TY2FsZSgpKTtcblxuICAgICAgX3RoaXMudXBkYXRlKCk7XG4gICAgfTtcblxuICAgIHZhciBoYW5kbGVLZXlEb3duID0gZnVuY3Rpb24gaGFuZGxlS2V5RG93bihldmVudCkge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVLZXlEb3duJyApO1xuICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XG4gICAgICAgIGNhc2UgX3RoaXMua2V5cy5VUDpcbiAgICAgICAgICBwYW4oMCwgX3RoaXMua2V5UGFuU3BlZWQpO1xuXG4gICAgICAgICAgX3RoaXMudXBkYXRlKCk7XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIF90aGlzLmtleXMuQk9UVE9NOlxuICAgICAgICAgIHBhbigwLCAtX3RoaXMua2V5UGFuU3BlZWQpO1xuXG4gICAgICAgICAgX3RoaXMudXBkYXRlKCk7XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIF90aGlzLmtleXMuTEVGVDpcbiAgICAgICAgICBwYW4oX3RoaXMua2V5UGFuU3BlZWQsIDApO1xuXG4gICAgICAgICAgX3RoaXMudXBkYXRlKCk7XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIF90aGlzLmtleXMuUklHSFQ6XG4gICAgICAgICAgcGFuKC1fdGhpcy5rZXlQYW5TcGVlZCwgMCk7XG5cbiAgICAgICAgICBfdGhpcy51cGRhdGUoKTtcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgaGFuZGxlVG91Y2hTdGFydFJvdGF0ZSA9IGZ1bmN0aW9uIGhhbmRsZVRvdWNoU3RhcnRSb3RhdGUoZXZlbnQpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCAnaGFuZGxlVG91Y2hTdGFydFJvdGF0ZScgKTtcbiAgICAgIHJvdGF0ZVN0YXJ0LnNldChldmVudC50b3VjaGVzWzBdLnBhZ2VYLCBldmVudC50b3VjaGVzWzBdLnBhZ2VZKTtcbiAgICB9O1xuXG4gICAgdmFyIGhhbmRsZVRvdWNoU3RhcnREb2xseSA9IGZ1bmN0aW9uIGhhbmRsZVRvdWNoU3RhcnREb2xseShldmVudCkge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVUb3VjaFN0YXJ0RG9sbHknICk7XG4gICAgICB2YXIgZHggPSBldmVudC50b3VjaGVzWzBdLnBhZ2VYIC0gZXZlbnQudG91Y2hlc1sxXS5wYWdlWDtcbiAgICAgIHZhciBkeSA9IGV2ZW50LnRvdWNoZXNbMF0ucGFnZVkgLSBldmVudC50b3VjaGVzWzFdLnBhZ2VZO1xuICAgICAgdmFyIGRpc3RhbmNlID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTtcbiAgICAgIGRvbGx5U3RhcnQuc2V0KDAsIGRpc3RhbmNlKTtcbiAgICB9O1xuXG4gICAgdmFyIGhhbmRsZVRvdWNoU3RhcnRQYW4gPSBmdW5jdGlvbiBoYW5kbGVUb3VjaFN0YXJ0UGFuKGV2ZW50KSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZVRvdWNoU3RhcnRQYW4nICk7XG4gICAgICBwYW5TdGFydC5zZXQoZXZlbnQudG91Y2hlc1swXS5wYWdlWCwgZXZlbnQudG91Y2hlc1swXS5wYWdlWSk7XG4gICAgfTtcblxuICAgIHZhciBoYW5kbGVUb3VjaE1vdmVSb3RhdGUgPSBmdW5jdGlvbiBoYW5kbGVUb3VjaE1vdmVSb3RhdGUoZXZlbnQpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCAnaGFuZGxlVG91Y2hNb3ZlUm90YXRlJyApO1xuICAgICAgcm90YXRlRW5kLnNldChldmVudC50b3VjaGVzWzBdLnBhZ2VYLCBldmVudC50b3VjaGVzWzBdLnBhZ2VZKTtcbiAgICAgIHJvdGF0ZURlbHRhLnN1YlZlY3RvcnMocm90YXRlRW5kLCByb3RhdGVTdGFydCk7XG4gICAgICB2YXIgZWxlbWVudCA9IF90aGlzLmRvbUVsZW1lbnQgPT09IGRvY3VtZW50ID8gX3RoaXMuZG9tRWxlbWVudC5ib2R5IDogX3RoaXMuZG9tRWxlbWVudDsgLy8gcm90YXRpbmcgYWNyb3NzIHdob2xlIHNjcmVlbiBnb2VzIDM2MCBkZWdyZWVzIGFyb3VuZFxuXG4gICAgICByb3RhdGVMZWZ0KDIgKiBNYXRoLlBJICogcm90YXRlRGVsdGEueCAvIGVsZW1lbnQuY2xpZW50V2lkdGggKiBfdGhpcy5yb3RhdGVTcGVlZCk7IC8vIHJvdGF0aW5nIHVwIGFuZCBkb3duIGFsb25nIHdob2xlIHNjcmVlbiBhdHRlbXB0cyB0byBnbyAzNjAsIGJ1dCBsaW1pdGVkIHRvIDE4MFxuXG4gICAgICByb3RhdGVVcCgyICogTWF0aC5QSSAqIHJvdGF0ZURlbHRhLnkgLyBlbGVtZW50LmNsaWVudEhlaWdodCAqIF90aGlzLnJvdGF0ZVNwZWVkKTtcbiAgICAgIHJvdGF0ZVN0YXJ0LmNvcHkocm90YXRlRW5kKTtcblxuICAgICAgX3RoaXMudXBkYXRlKCk7XG4gICAgfTtcblxuICAgIHZhciBoYW5kbGVUb3VjaE1vdmVEb2xseSA9IGZ1bmN0aW9uIGhhbmRsZVRvdWNoTW92ZURvbGx5KGV2ZW50KSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZVRvdWNoTW92ZURvbGx5JyApO1xuICAgICAgdmFyIGR4ID0gZXZlbnQudG91Y2hlc1swXS5wYWdlWCAtIGV2ZW50LnRvdWNoZXNbMV0ucGFnZVg7XG4gICAgICB2YXIgZHkgPSBldmVudC50b3VjaGVzWzBdLnBhZ2VZIC0gZXZlbnQudG91Y2hlc1sxXS5wYWdlWTtcbiAgICAgIHZhciBkaXN0YW5jZSA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XG4gICAgICBkb2xseUVuZC5zZXQoMCwgZGlzdGFuY2UpO1xuICAgICAgZG9sbHlEZWx0YS5zdWJWZWN0b3JzKGRvbGx5RW5kLCBkb2xseVN0YXJ0KTtcbiAgICAgIGlmIChkb2xseURlbHRhLnkgPiAwKSBkb2xseU91dChnZXRab29tU2NhbGUoKSk7ZWxzZSBpZiAoZG9sbHlEZWx0YS55IDwgMCkgZG9sbHlJbihnZXRab29tU2NhbGUoKSk7XG4gICAgICBkb2xseVN0YXJ0LmNvcHkoZG9sbHlFbmQpO1xuXG4gICAgICBfdGhpcy51cGRhdGUoKTtcbiAgICB9O1xuXG4gICAgdmFyIGhhbmRsZVRvdWNoTW92ZVBhbiA9IGZ1bmN0aW9uIGhhbmRsZVRvdWNoTW92ZVBhbihldmVudCkge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVUb3VjaE1vdmVQYW4nICk7XG4gICAgICBwYW5FbmQuc2V0KGV2ZW50LnRvdWNoZXNbMF0ucGFnZVgsIGV2ZW50LnRvdWNoZXNbMF0ucGFnZVkpO1xuICAgICAgcGFuRGVsdGEuc3ViVmVjdG9ycyhwYW5FbmQsIHBhblN0YXJ0KTtcbiAgICAgIHBhbihwYW5EZWx0YS54LCBwYW5EZWx0YS55KTtcbiAgICAgIHBhblN0YXJ0LmNvcHkocGFuRW5kKTtcblxuICAgICAgX3RoaXMudXBkYXRlKCk7XG4gICAgfTtcbiAgICAvLyBldmVudCBoYW5kbGVycyAtIEZTTTogbGlzdGVuIGZvciBldmVudHMgYW5kIHJlc2V0IHN0YXRlXG4gICAgLy9cblxuXG4gICAgdmFyIG9uTW91c2VEb3duID0gZnVuY3Rpb24gb25Nb3VzZURvd24oZXZlbnQpIHtcbiAgICAgIGlmIChfdGhpcy5lbmFibGVkID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gX3RoaXMubW91c2VCdXR0b25zLk9SQklUKSB7XG4gICAgICAgIGlmIChfdGhpcy5lbmFibGVSb3RhdGUgPT09IGZhbHNlKSByZXR1cm47XG4gICAgICAgIGhhbmRsZU1vdXNlRG93blJvdGF0ZShldmVudCk7XG4gICAgICAgIHN0YXRlID0gU1RBVEUuUk9UQVRFO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5idXR0b24gPT09IF90aGlzLm1vdXNlQnV0dG9ucy5aT09NKSB7XG4gICAgICAgIGlmIChfdGhpcy5lbmFibGVab29tID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgICBoYW5kbGVNb3VzZURvd25Eb2xseShldmVudCk7XG4gICAgICAgIHN0YXRlID0gU1RBVEUuRE9MTFk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gX3RoaXMubW91c2VCdXR0b25zLlBBTikge1xuICAgICAgICBpZiAoX3RoaXMuZW5hYmxlUGFuID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgICBoYW5kbGVNb3VzZURvd25QYW4oZXZlbnQpO1xuICAgICAgICBzdGF0ZSA9IFNUQVRFLlBBTjtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlICE9PSBTVEFURS5OT05FKSB7XG4gICAgICAgIF90aGlzLmV2ZW50SGFuZGxlci5vbignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUsIGZhbHNlKTtcblxuICAgICAgICBfdGhpcy5ldmVudEhhbmRsZXIub24oJ21vdXNldXAnLCBvbk1vdXNlVXAsIGZhbHNlKTtcblxuICAgICAgICBfdGhpcy5kaXNwYXRjaEV2ZW50KHN0YXJ0RXZlbnQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgb25Nb3VzZU1vdmUgPSBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudCkge1xuICAgICAgaWYgKF90aGlzLmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm47XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBpZiAoc3RhdGUgPT09IFNUQVRFLlJPVEFURSkge1xuICAgICAgICBpZiAoX3RoaXMuZW5hYmxlUm90YXRlID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgICBoYW5kbGVNb3VzZU1vdmVSb3RhdGUoZXZlbnQpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gU1RBVEUuRE9MTFkpIHtcbiAgICAgICAgaWYgKF90aGlzLmVuYWJsZVpvb20gPT09IGZhbHNlKSByZXR1cm47XG4gICAgICAgIGhhbmRsZU1vdXNlTW92ZURvbGx5KGV2ZW50KTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IFNUQVRFLlBBTikge1xuICAgICAgICBpZiAoX3RoaXMuZW5hYmxlUGFuID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgICBoYW5kbGVNb3VzZU1vdmVQYW4oZXZlbnQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgb25Nb3VzZVVwID0gZnVuY3Rpb24gb25Nb3VzZVVwKGV2ZW50KSB7XG4gICAgICBpZiAoX3RoaXMuZW5hYmxlZCA9PT0gZmFsc2UpIHJldHVybjtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlLCBmYWxzZSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwLCBmYWxzZSk7XG5cbiAgICAgIF90aGlzLmRpc3BhdGNoRXZlbnQoZW5kRXZlbnQpO1xuXG4gICAgICBzdGF0ZSA9IFNUQVRFLk5PTkU7XG4gICAgfTtcblxuICAgIHZhciBvbk1vdXNlV2hlZWwgPSBmdW5jdGlvbiBvbk1vdXNlV2hlZWwoZXZlbnQpIHtcbiAgICAgIGlmIChfdGhpcy5lbmFibGVkID09PSBmYWxzZSB8fCBfdGhpcy5lbmFibGVab29tID09PSBmYWxzZSB8fCBzdGF0ZSAhPT0gU1RBVEUuTk9ORSAmJiBzdGF0ZSAhPT0gU1RBVEUuUk9UQVRFKSByZXR1cm47XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBoYW5kbGVNb3VzZVdoZWVsKGV2ZW50KTtcblxuICAgICAgX3RoaXMuZGlzcGF0Y2hFdmVudChzdGFydEV2ZW50KTsgLy8gbm90IHN1cmUgd2h5IHRoZXNlIGFyZSBoZXJlLi4uXG5cblxuICAgICAgX3RoaXMuZGlzcGF0Y2hFdmVudChlbmRFdmVudCk7XG4gICAgfTtcblxuICAgIHZhciBvbktleURvd24gPSBmdW5jdGlvbiBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIGlmIChfdGhpcy5lbmFibGVkID09PSBmYWxzZSB8fCBfdGhpcy5lbmFibGVLZXlzID09PSBmYWxzZSB8fCBfdGhpcy5lbmFibGVQYW4gPT09IGZhbHNlKSByZXR1cm47XG4gICAgICBoYW5kbGVLZXlEb3duKGV2ZW50KTtcbiAgICB9O1xuXG4gICAgdmFyIG9uVG91Y2hTdGFydCA9IGZ1bmN0aW9uIG9uVG91Y2hTdGFydChldmVudCkge1xuICAgICAgaWYgKF90aGlzLmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgIHN3aXRjaCAoZXZlbnQudG91Y2hlcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIC8vIG9uZS1maW5nZXJlZCB0b3VjaDogcm90YXRlXG4gICAgICAgICAgaWYgKF90aGlzLmVuYWJsZVJvdGF0ZSA9PT0gZmFsc2UpIHJldHVybjtcbiAgICAgICAgICBoYW5kbGVUb3VjaFN0YXJ0Um90YXRlKGV2ZW50KTtcbiAgICAgICAgICBzdGF0ZSA9IFNUQVRFLlRPVUNIX1JPVEFURTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgLy8gdHdvLWZpbmdlcmVkIHRvdWNoOiBkb2xseVxuICAgICAgICAgIGlmIChfdGhpcy5lbmFibGVab29tID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgICAgIGhhbmRsZVRvdWNoU3RhcnREb2xseShldmVudCk7XG4gICAgICAgICAgc3RhdGUgPSBTVEFURS5UT1VDSF9ET0xMWTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgLy8gdGhyZWUtZmluZ2VyZWQgdG91Y2g6IHBhblxuICAgICAgICAgIGlmIChfdGhpcy5lbmFibGVQYW4gPT09IGZhbHNlKSByZXR1cm47XG4gICAgICAgICAgaGFuZGxlVG91Y2hTdGFydFBhbihldmVudCk7XG4gICAgICAgICAgc3RhdGUgPSBTVEFURS5UT1VDSF9QQU47XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBzdGF0ZSA9IFNUQVRFLk5PTkU7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSAhPT0gU1RBVEUuTk9ORSkgX3RoaXMuZGlzcGF0Y2hFdmVudChzdGFydEV2ZW50KTtcbiAgICB9O1xuXG4gICAgdmFyIG9uVG91Y2hNb3ZlID0gZnVuY3Rpb24gb25Ub3VjaE1vdmUoZXZlbnQpIHtcbiAgICAgIGlmIChfdGhpcy5lbmFibGVkID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBzd2l0Y2ggKGV2ZW50LnRvdWNoZXMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAvLyBvbmUtZmluZ2VyZWQgdG91Y2g6IHJvdGF0ZVxuICAgICAgICAgIGlmIChfdGhpcy5lbmFibGVSb3RhdGUgPT09IGZhbHNlKSByZXR1cm47XG4gICAgICAgICAgaWYgKHN0YXRlICE9PSBTVEFURS5UT1VDSF9ST1RBVEUpIHJldHVybjsgLy8gaXMgdGhpcyBuZWVkZWQ/Li4uXG5cbiAgICAgICAgICBoYW5kbGVUb3VjaE1vdmVSb3RhdGUoZXZlbnQpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAvLyB0d28tZmluZ2VyZWQgdG91Y2g6IGRvbGx5XG4gICAgICAgICAgaWYgKF90aGlzLmVuYWJsZVpvb20gPT09IGZhbHNlKSByZXR1cm47XG4gICAgICAgICAgaWYgKHN0YXRlICE9PSBTVEFURS5UT1VDSF9ET0xMWSkgcmV0dXJuOyAvLyBpcyB0aGlzIG5lZWRlZD8uLi5cblxuICAgICAgICAgIGhhbmRsZVRvdWNoTW92ZURvbGx5KGV2ZW50KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgLy8gdGhyZWUtZmluZ2VyZWQgdG91Y2g6IHBhblxuICAgICAgICAgIGlmIChfdGhpcy5lbmFibGVQYW4gPT09IGZhbHNlKSByZXR1cm47XG4gICAgICAgICAgaWYgKHN0YXRlICE9PSBTVEFURS5UT1VDSF9QQU4pIHJldHVybjsgLy8gaXMgdGhpcyBuZWVkZWQ/Li4uXG5cbiAgICAgICAgICBoYW5kbGVUb3VjaE1vdmVQYW4oZXZlbnQpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgc3RhdGUgPSBTVEFURS5OT05FO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgb25Ub3VjaEVuZCA9IGZ1bmN0aW9uIG9uVG91Y2hFbmQoZXZlbnQpIHtcbiAgICAgIGlmIChfdGhpcy5lbmFibGVkID09PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgICBfdGhpcy5kaXNwYXRjaEV2ZW50KGVuZEV2ZW50KTtcblxuICAgICAgc3RhdGUgPSBTVEFURS5OT05FO1xuICAgIH07XG5cbiAgICB2YXIgb25Db250ZXh0TWVudSA9IGZ1bmN0aW9uIG9uQ29udGV4dE1lbnUoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTsgLy9cblxuXG4gICAgX3RoaXMuZXZlbnRIYW5kbGVyLm9uKCdjb250ZXh0bWVudScsIG9uQ29udGV4dE1lbnUsIGZhbHNlKTtcblxuICAgIF90aGlzLmV2ZW50SGFuZGxlci5vbignbW91c2Vkb3duJywgb25Nb3VzZURvd24sIGZhbHNlKTtcblxuICAgIF90aGlzLmV2ZW50SGFuZGxlci5vbignd2hlZWwnLCBvbk1vdXNlV2hlZWwsIGZhbHNlKTtcblxuICAgIF90aGlzLmV2ZW50SGFuZGxlci5vbigndG91Y2hzdGFydCcsIG9uVG91Y2hTdGFydCwgZmFsc2UpO1xuXG4gICAgX3RoaXMuZXZlbnRIYW5kbGVyLm9uKCd0b3VjaGVuZCcsIG9uVG91Y2hFbmQsIGZhbHNlKTtcblxuICAgIF90aGlzLmV2ZW50SGFuZGxlci5vbigndG91Y2htb3ZlJywgb25Ub3VjaE1vdmUsIGZhbHNlKTtcblxuICAgIF90aGlzLmV2ZW50SGFuZGxlci5vbigna2V5ZG93bicsIG9uS2V5RG93biwgZmFsc2UpOyAvLyBmb3JjZSBhbiB1cGRhdGUgYXQgc3RhcnRcblxuXG4gICAgX3RoaXMudXBkYXRlKCk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhUaHJlZU9yYml0Q29udHJvbHMsIFt7XG4gICAga2V5OiBcImNlbnRlclwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAuY2VudGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnRhcmdldCcpO1xuICAgICAgcmV0dXJuIHRoaXMudGFyZ2V0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJub1pvb21cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGNvbnNvbGUud2FybignT3JiaXRDb250cm9sczogLm5vWm9vbSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZVpvb20gaW5zdGVhZC4nKTtcbiAgICAgIHJldHVybiAhdGhpcy5lbmFibGVab29tO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIGNvbnNvbGUud2FybignT3JiaXRDb250cm9sczogLm5vWm9vbSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZVpvb20gaW5zdGVhZC4nKTtcbiAgICAgIHRoaXMuZW5hYmxlWm9vbSA9ICF2YWx1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibm9Sb3RhdGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGNvbnNvbGUud2FybignT3JiaXRDb250cm9sczogLm5vUm90YXRlIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlUm90YXRlIGluc3RlYWQuJyk7XG4gICAgICByZXR1cm4gIXRoaXMuZW5hYmxlUm90YXRlO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIGNvbnNvbGUud2FybignT3JiaXRDb250cm9sczogLm5vUm90YXRlIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlUm90YXRlIGluc3RlYWQuJyk7XG4gICAgICB0aGlzLmVuYWJsZVJvdGF0ZSA9ICF2YWx1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibm9QYW5cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGNvbnNvbGUud2FybignT3JiaXRDb250cm9sczogLm5vUGFuIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlUGFuIGluc3RlYWQuJyk7XG4gICAgICByZXR1cm4gIXRoaXMuZW5hYmxlUGFuO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIGNvbnNvbGUud2FybignT3JiaXRDb250cm9sczogLm5vUGFuIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlUGFuIGluc3RlYWQuJyk7XG4gICAgICB0aGlzLmVuYWJsZVBhbiA9ICF2YWx1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibm9LZXlzXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ09yYml0Q29udHJvbHM6IC5ub0tleXMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVLZXlzIGluc3RlYWQuJyk7XG4gICAgICByZXR1cm4gIXRoaXMuZW5hYmxlS2V5cztcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ09yYml0Q29udHJvbHM6IC5ub0tleXMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVLZXlzIGluc3RlYWQuJyk7XG4gICAgICB0aGlzLmVuYWJsZUtleXMgPSAhdmFsdWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN0YXRpY01vdmluZ1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAuc3RhdGljTW92aW5nIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlRGFtcGluZyBpbnN0ZWFkLicpO1xuICAgICAgcmV0dXJuICF0aGlzLmVuYWJsZURhbXBpbmc7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAuc3RhdGljTW92aW5nIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlRGFtcGluZyBpbnN0ZWFkLicpO1xuICAgICAgdGhpcy5lbmFibGVEYW1waW5nID0gIXZhbHVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkeW5hbWljRGFtcGluZ0ZhY3RvclwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAuZHluYW1pY0RhbXBpbmdGYWN0b3IgaGFzIGJlZW4gcmVuYW1lZC4gVXNlIC5kYW1waW5nRmFjdG9yIGluc3RlYWQuJyk7XG4gICAgICByZXR1cm4gdGhpcy5kYW1waW5nRmFjdG9yO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIGNvbnNvbGUud2FybignT3JiaXRDb250cm9sczogLmR5bmFtaWNEYW1waW5nRmFjdG9yIGhhcyBiZWVuIHJlbmFtZWQuIFVzZSAuZGFtcGluZ0ZhY3RvciBpbnN0ZWFkLicpO1xuICAgICAgdGhpcy5kYW1waW5nRmFjdG9yID0gdmFsdWU7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoVGhyZWVPcmJpdENvbnRyb2xzLCBfRXZlbnREaXNwYXRjaGVyKTtcblxuICByZXR1cm4gVGhyZWVPcmJpdENvbnRyb2xzO1xufShFdmVudERpc3BhdGNoZXIpO1xuXG4vKipcbiAqIEBjbGFzcyBPcmJpdENvbnRyb2xzTW9kdWxlXG4gKiBAY2F0ZWdvcnkgbW9kdWxlcy9hcHBcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXVxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXMub2JqZWN0PWNhbWVyYV0gT2JqZWN0IHRvIHdoaWNoIGNvbnRyb2xzIGFyZSBhcHBsaWVkLlxuICogQHBhcmFtIHtUSFJFRS5WZWN0b3IzfSBbcGFyYW1zLnRhcmdldD1uZXcgVmVjdG9yMygpXSBDb250cm9scyBjZW50ZXIgdmVjdG9yLlxuICogQHBhcmFtIHtCb29sZWFufSBbcGFyYW1zLmZvbGxvdz1mYWxzZV0gRm9sbG93IHRoZSB0YXJnZXRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHBcbiAqIEBleGFtcGxlIDxjYXB0aW9uPiBDcmVhdGluZyBhIHJlbmRlcmluZyBtb2R1bGUgYW5kIHBhc3NpbmcgaXQgdG8gQXBwJ3MgbW9kdWxlczwvY2FwdGlvbj5cbiAqIG5ldyBBcHAoW1xuICogICBuZXcgRWxlbWVudE1vZHVsZSgpLFxuICogICBuZXcgU2NlbmVNb2R1bGUoKSxcbiAqICAgbmV3IERlZmluZU1vZHVsZSgnY2FtZXJhJywgbmV3IFdIUy5QZXJzcGVjdGl2ZUNhbWVyYSh7XG4gKiAgICAgcG9zaXRpb246IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDYsIDE4KSxcbiAqICAgICBmYXI6IDEwMDAwXG4gKiAgIH0pKSxcbiAqICAgbmV3IFJlbmRlcmluZ01vZHVsZSgpLFxuICogICBuZXcgT3JiaXRDb250cm9sc01vZHVsZSgpXG4gKiBdKTtcbiAqL1xuXG52YXIgT3JiaXRDb250cm9sc01vZHVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0NvbnRyb2xzTW9kdWxlKSB7XG4gIGZ1bmN0aW9uIE9yYml0Q29udHJvbHNNb2R1bGUoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBPcmJpdENvbnRyb2xzTW9kdWxlKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKE9yYml0Q29udHJvbHNNb2R1bGUpLmNhbGwodGhpcywgcGFyYW1zKSk7XG4gICAgX3RoaXMucGFyYW1zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBmb2xsb3c6IGZhbHNlLFxuICAgICAgb2JqZWN0OiBudWxsLFxuICAgICAgdGFyZ2V0OiBuZXcgVmVjdG9yMygpXG4gICAgfSwgcGFyYW1zKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhPcmJpdENvbnRyb2xzTW9kdWxlLCBbe1xuICAgIGtleTogXCJtYW5hZ2VyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hbmFnZXIoX21hbmFnZXIpIHtcbiAgICAgIGdldCQzKGdldFByb3RvdHlwZU9mJDIoT3JiaXRDb250cm9sc01vZHVsZS5wcm90b3R5cGUpLCBcIm1hbmFnZXJcIiwgdGhpcykuY2FsbCh0aGlzLCBfbWFuYWdlcik7XG5cbiAgICAgIHZhciBfdGhpcyRwYXJhbXMgPSB0aGlzLnBhcmFtcyxcbiAgICAgICAgICBvYmogPSBfdGhpcyRwYXJhbXMub2JqZWN0LFxuICAgICAgICAgIGZvbGxvdyA9IF90aGlzJHBhcmFtcy5mb2xsb3csXG4gICAgICAgICAgdGFyZ2V0ID0gX3RoaXMkcGFyYW1zLnRhcmdldDtcbiAgICAgIHZhciBvYmplY3QgPSBvYmogPyBvYmoubmF0aXZlIDogX21hbmFnZXIuZ2V0KCdjYW1lcmEnKS5uYXRpdmU7XG4gICAgICB2YXIgY29udHJvbHMgPSBuZXcgVGhyZWVPcmJpdENvbnRyb2xzKG9iamVjdCwgX21hbmFnZXIuZ2V0KCdlbGVtZW50JyksIF9tYW5hZ2VyLmhhbmRsZXIpO1xuICAgICAgdmFyIHVwZGF0ZVByb2Nlc3NvciA9IGZvbGxvdyA/IGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIGNvbnRyb2xzLnVwZGF0ZShjLmdldERlbHRhKCkpO1xuICAgICAgICBjb250cm9scy50YXJnZXQuY29weSh0YXJnZXQpO1xuICAgICAgfSA6IGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIGNvbnRyb2xzLnVwZGF0ZShjLmdldERlbHRhKCkpO1xuICAgICAgfTtcbiAgICAgIHRoaXMuc2V0Q29udHJvbHMoY29udHJvbHMpO1xuICAgICAgdGhpcy5zZXRVcGRhdGUodXBkYXRlUHJvY2Vzc29yKTtcblxuICAgICAgX21hbmFnZXIudXBkYXRlKHtcbiAgICAgICAgY2FtZXJhOiBmdW5jdGlvbiBjYW1lcmEoX2NhbWVyYSkge1xuICAgICAgICAgIGlmIChvYmopIHJldHVybjtcbiAgICAgICAgICBjb250cm9scy5vYmplY3QgPSBfY2FtZXJhLm5hdGl2ZTtcbiAgICAgICAgfSxcbiAgICAgICAgZWxlbWVudDogZnVuY3Rpb24gZWxlbWVudChfZWxlbWVudCkge1xuICAgICAgICAgIGNvbnRyb2xzLmRvbUVsZW1lbnQgPSBfZWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnRyb2xzLnRhcmdldC5jb3B5KHRhcmdldCk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoT3JiaXRDb250cm9sc01vZHVsZSwgX0NvbnRyb2xzTW9kdWxlKTtcblxuICByZXR1cm4gT3JiaXRDb250cm9sc01vZHVsZTtcbn0oQ29udHJvbHNNb2R1bGUpO1xuXG4vKiogQG1vZHVsZSBtb2R1bGVzL2FwcC9jb250cm9scyAqL1xuXG4vKiogQG1vZHVsZSBtb2R1bGVzL2FwcCAqL1xuXG4vKipcbiAqIEBjbGFzcyBEeW5hbWljR2VvbWV0cnlNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL21lc2hcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zPXthdHRyaWJ1dGVzOiBmYWxzZX1dIC0gcGFyYW1zXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtwYXRjaEV2ZW50cz10cnVlXVxuICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL21lc2hcbiAqL1xudmFyIER5bmFtaWNHZW9tZXRyeU1vZHVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIER5bmFtaWNHZW9tZXRyeU1vZHVsZSgpIHtcbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIER5bmFtaWNHZW9tZXRyeU1vZHVsZSk7XG5cbiAgICB0aGlzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgYXR0cmlidXRlczogZmFsc2VcbiAgICB9LCBwYXJhbXMpO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoRHluYW1pY0dlb21ldHJ5TW9kdWxlLCBbe1xuICAgIGtleTogXCJpbnRlZ3JhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW50ZWdyYXRlKHNlbGYpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBwYXJhbXMgPSBzZWxmLnBhcmFtcztcblxuICAgICAgdGhpcy5nXyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICAgICAgaWYgKHRoaXMuYnVpbGRHZW9tZXRyeSkge1xuICAgICAgICAgIHRoaXMubmF0aXZlLmdlb21ldHJ5ID0gdGhpcy5idWlsZEdlb21ldHJ5KHRoaXMudXBkYXRlUGFyYW1zKHtcbiAgICAgICAgICAgIGdlb21ldHJ5OiBwYXJhbXNcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChwYXJhbXMuYXR0cmlidXRlcykge1xuICAgICAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChrZXkpIHtcbiAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwiZ19cIi5jb25jYXQoa2V5KSwge1xuICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmUuZ2VvbWV0cnkucGFyYW1ldGVyc1trZXldO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlLmdlb21ldHJ5ID0gdGhpcy5idWlsZEdlb21ldHJ5KHRoaXMudXBkYXRlUGFyYW1zKHtcbiAgICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBkZWZpbmVQcm9wZXJ0eSQzKHt9LCBrZXksIHZhbHVlKVxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMucGFyYW1zLmdlb21ldHJ5KSB7XG4gICAgICAgICAgX2xvb3Aoa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBEeW5hbWljR2VvbWV0cnlNb2R1bGU7XG59KCk7XG5cbnZhciBsb2FkZXIgPSBuZXcgVGV4dHVyZUxvYWRlcigpO1xuLyoqXG4gKiBAY2xhc3MgVGV4dHVyZU1vZHVsZVxuICogQGNhdGVnb3J5IG1vZHVsZXMvbWVzaFxuICogQGRlc2NyaXB0aW9uIEEgVGV4dHVyZU1vZHVsZSBjYW4gYmUgYXBwbGllZCB0byBhbnkgTWVzaCBvciBNb2RlbC5cbiAqIEBwYXJhbSB7QXJyYXl9IFt0ZXh0dXJlc10gLSBhcnJheSBvZiB0ZXh0dXJlIG9iamVjdHNcbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9tZXNoXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhbiBpbnN0YW5jZS4gdXJsIHRha2VzIGEgcGF0aCwgb3IgYSBkYXRhIG9iamVjdC48L2NhcHRpb24+XG4gKiB2YXIgd29vZFRleHR1cmUgPSBuZXcgVGV4dHVyZU1vZHVsZSh7XG4gKiAgIHVybDogYCR7cHJvY2Vzcy5hc3NldHNQYXRofS90ZXh0dXJlcy93b29kLmpwZ2BcbiAqIH0pO1xuICogQGV4YW1wbGUgPGNhcHRpb24+TW9yZSBjb21wcmVoZW5zaXZlIGV4YW1wbGUsIHdvb2QgdGV4dHVyZSBhcHBsaWVkIHRvIGEgQm94LjwvY2FwdGlvbj5cbiAqIG5ldyBCb3goe1xuICogICBnZW9tZXRyeToge1xuICogICAgIHdpZHRoOiAyLFxuICogICAgIGhlaWdodDogMixcbiAqICAgICBkZXB0aDogMlxuICogICB9LFxuICogICBtb2R1bGVzOiBbXG4gKiAgICAgbmV3IFRleHR1cmVNb2R1bGUoe1xuICogICAgICAgdXJsOiBgcGF0aC90by90ZXh0dXJlLmpwZ2AsXG4gKiAgICAgICByZXBlYXQ6IG5ldyBUSFJFRS5WZWN0b3IyKDEsIDEpIC8vIG9wdGlvbmFsXG4gKiAgICAgfSlcbiAqICAgXSxcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICogICBwb3NpdGlvbjogWzUwLCA2MCwgNzBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBUZXh0dXJlTW9kdWxlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgY3JlYXRlQ2xhc3MoVGV4dHVyZU1vZHVsZSwgbnVsbCwgW3tcbiAgICBrZXk6IFwibG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkKHVybCkge1xuICAgICAgcmV0dXJuIG5ldyBUZXh0dXJlTW9kdWxlKHtcbiAgICAgICAgdXJsOiB1cmxcbiAgICAgIH0pLnRleHR1cmVzWzBdWzFdO1xuICAgIH1cbiAgfV0pO1xuXG4gIGZ1bmN0aW9uIFRleHR1cmVNb2R1bGUoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHR1cmVNb2R1bGUpO1xuXG4gICAgZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKHRoaXMsIFwidGV4dHVyZXNcIiwgW10pLCBcImJyaWRnZVwiLCB7XG4gICAgICBtYXRlcmlhbDogZnVuY3Rpb24gbWF0ZXJpYWwoX21hdGVyaWFsLCBzZWxmKSB7XG4gICAgICAgIHNlbGYudGV4dHVyZXMuZm9yRWFjaChmdW5jdGlvbiAodGV4dHVyZSkge1xuICAgICAgICAgIF9tYXRlcmlhbFt0ZXh0dXJlWzBdXSA9IHRleHR1cmVbMV07XG4gICAgICAgIH0pO1xuICAgICAgICBfbWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgICAgICByZXR1cm4gX21hdGVyaWFsO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHRleHR1cmVzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgdGV4dHVyZXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgdGV4dHVyZXMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIHVybCA9IF9yZWYudXJsLFxuICAgICAgICAgIF9yZWYkdHlwZSA9IF9yZWYudHlwZSxcbiAgICAgICAgICB0eXBlID0gX3JlZiR0eXBlID09PSB2b2lkIDAgPyAnbWFwJyA6IF9yZWYkdHlwZSxcbiAgICAgICAgICBfcmVmJG9mZnNldCA9IF9yZWYub2Zmc2V0LFxuICAgICAgICAgIG9mZnNldCA9IF9yZWYkb2Zmc2V0ID09PSB2b2lkIDAgPyBuZXcgVmVjdG9yMigwLCAwKSA6IF9yZWYkb2Zmc2V0LFxuICAgICAgICAgIF9yZWYkcmVwZWF0ID0gX3JlZi5yZXBlYXQsXG4gICAgICAgICAgcmVwZWF0ID0gX3JlZiRyZXBlYXQgPT09IHZvaWQgMCA/IG5ldyBWZWN0b3IyKDEsIDEpIDogX3JlZiRyZXBlYXQsXG4gICAgICAgICAgX3JlZiR3cmFwID0gX3JlZi53cmFwLFxuICAgICAgICAgIHdyYXAgPSBfcmVmJHdyYXAgPT09IHZvaWQgMCA/IFJlcGVhdFdyYXBwaW5nIDogX3JlZiR3cmFwLFxuICAgICAgICAgIF9yZWYkbWFwcGluZyA9IF9yZWYubWFwcGluZyxcbiAgICAgICAgICBtYXBwaW5nID0gX3JlZiRtYXBwaW5nID09PSB2b2lkIDAgPyBVVk1hcHBpbmcgOiBfcmVmJG1hcHBpbmcsXG4gICAgICAgICAgX3JlZiRmaXggPSBfcmVmLmZpeCxcbiAgICAgICAgICBmaXggPSBfcmVmJGZpeCA9PT0gdm9pZCAwID8gZnVuY3Rpb24gKHRleCkge1xuICAgICAgICByZXR1cm4gdGV4O1xuICAgICAgfSA6IF9yZWYkZml4O1xuICAgICAgdmFyIHRleHR1cmUgPSBsb2FkZXIubG9hZCh1cmwpO1xuXG4gICAgICBpZiAod3JhcC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRleHR1cmUud3JhcFMgPSB3cmFwWzBdO1xuICAgICAgICB0ZXh0dXJlLndyYXBUID0gd3JhcFsxXTtcbiAgICAgIH0gZWxzZSB0ZXh0dXJlLndyYXBTID0gdGV4dHVyZS53cmFwVCA9IHdyYXA7XG5cbiAgICAgIHRleHR1cmUubWFwcGluZyA9IG1hcHBpbmc7XG4gICAgICB0ZXh0dXJlLm9mZnNldC5jb3B5KG9mZnNldCk7XG4gICAgICB0ZXh0dXJlLnJlcGVhdC5jb3B5KHJlcGVhdCk7XG4gICAgICB0ZXh0dXJlLm1hZ0ZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7XG4gICAgICB0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhck1pcE1hcExpbmVhckZpbHRlcjtcblxuICAgICAgX3RoaXMudGV4dHVyZXMucHVzaChbdHlwZSwgZml4KHRleHR1cmUpXSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gVGV4dHVyZU1vZHVsZTtcbn0oKTtcblxuLyoqXG4gKiBAY2xhc3MgQW5pbWF0aW9uTW9kdWxlXG4gKiBAY2F0ZWdvcnkgbW9kdWxlcy9tZXNoXG4gKiBAZGVzY3JpcHRpb24gQ29udmVuaWVuY2UgbW9kdWxlIHRoYXQgd3JhcHMgdGhlIDxhIGhyZWY9J2h0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy8jbWFudWFsL2ludHJvZHVjdGlvbi9BbmltYXRpb24tc3lzdGVtJz50aHJlZS5qcyBhbmltYXRpb24gc3lzdGVtPC9hPlxuICogQHBhcmFtIHtBcHB9IGFwcCAtIHRoZSBhcHBcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2lzRGVmZXJyZWQ9ZmFsc2VdIC0gc2V0IHRvIHRydWUgaWYgYW5pbWF0aW9uIHNob3VsZCBub3Qgc3RhcnQgYXV0b21hdGljYWxseVxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXM9e3NwZWVkOiAxfV0gLSB0aGUgcGFyYW1zXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvbWVzaFxuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRlIGFuaW1hdGlvbiBtb2R1bGUgYW5kIHBsYXkgYSBnaXZlbiBjbGlwIG9mIGFuIGltcG9ydGVkIG1vZGVsPC9jYXB0aW9uPlxuICogY29uc3QgYW5pbWF0aW9uTW9kdWxlID0gbmV3IEFuaW1hdGlvbk1vZHVsZShhcHAsIGZhbHNlLCB7XG4gKiAgIHNwZWVkOiAxLjIgLy8gc3BlZWQgdXAgYW5pbWF0aW9uIGJ5IDIwJVxuICogfSk7XG4gKlxuICogbmV3IEltcG9ydGVyKHtcbiAqICAgcGFyc2VyKGdlb21ldHJ5LCBtYXRlcmlhbHMpIHtcbiAqICAgICAvLyBPdmVycmlkZSBwYXJzZSB0byBnZW5lcmF0ZSBhIHNraW5uZWRNZXNoLCBuZWVkZWQgZm9yIHNraW5uZWQgbW9kZWxzXG4gKiAgICAgcmV0dXJuIG5ldyBUSFJFRS5Ta2lubmVkTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWxzKTtcbiAqICAgfSxcbiAqXG4gKiAgIHVybDogYHBhdGgvdG8vbW9kZWwuanNvbmAsXG4gKiAgIHVzZUN1c3RvbU1hdGVyaWFsOiB0cnVlLFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7XG4gKiAgICAgc2tpbm5pbmc6IHRydWVcbiAqICAgfSksXG4gKlxuICogICBtb2R1bGVzOiBbYW5pbWF0aW9uTW9kdWxlXVxuICogfSkuYWRkVG8oYXBwKS50aGVuKCgpID0+IHtcbiAqICAgLy8gYWRkaW5nIG1vZGVsIHRvIGFwcCByZXR1cm5zIGEgcHJvbWlzZSwgc28gcGlwZSB0aGUgZnVuY3Rpb24gdG8ga2ljayBvZmYgdGhlIGFuaW1hdGlvbiBjbGlwXG4gKiAgIGFuaW1hdGlvbk1vZHVsZS5wbGF5KCdjbGlwTmFtZScpO1xuICogfSk7XG4gKi9cblxudmFyIEFuaW1hdGlvbk1vZHVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEFuaW1hdGlvbk1vZHVsZShhcHAsIGlzRGVmZXJyZWQpIHtcbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEFuaW1hdGlvbk1vZHVsZSk7XG5cbiAgICBkZWZpbmVQcm9wZXJ0eSQzKHRoaXMsIFwiYnJpZGdlXCIsIHtcbiAgICAgIG1lc2g6IGZ1bmN0aW9uIG1lc2goX21lc2gsIHNlbGYpIHtcbiAgICAgICAgX21lc2guZ2VvbWV0cnkuc2tlbGV0b24gPSBfbWVzaC5za2VsZXRvbjtcbiAgICAgICAgc2VsZi5taXhlciA9IG5ldyBBbmltYXRpb25NaXhlcihfbWVzaC5nZW9tZXRyeSk7XG4gICAgICAgIHNlbGYuY2xpcHMgPSBfbWVzaC5nZW9tZXRyeS5hbmltYXRpb25zO1xuICAgICAgICByZXR1cm4gX21lc2g7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgc3BlZWQ6IDFcbiAgICB9LCBwYXJhbXMpO1xuICAgIHRoaXMuY2xvY2sgPSBuZXcgQ2xvY2soKTtcbiAgICB0aGlzLmFwcCA9IGFwcDtcbiAgICB0aGlzLmlzRGVmZXJyZWQgPSBpc0RlZmVycmVkO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIHBsYXlcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBQbGF5cyB0aGUgZ2l2ZW4gY2xpcCBuYW1lXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjbGlwTmFtZSAtIHRoZSBjbGlwIHRvIHBsYXlcbiAgICogQHJldHVybiB7VEhSRUUuQW5pbWF0aW9uQWN0aW9ufSBQbGF5aW5nIGFjdGlvbiBcbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL21lc2guQW5pbWF0aW9uTW9kdWxlXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoQW5pbWF0aW9uTW9kdWxlLCBbe1xuICAgIGtleTogXCJwbGF5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBsYXkoY2xpcE5hbWUpIHtcbiAgICAgIHZhciBjbGlwID0gQW5pbWF0aW9uQ2xpcC5maW5kQnlOYW1lKHRoaXMuY2xpcHMsIGNsaXBOYW1lKTtcbiAgICAgIHJldHVybiB0aGlzLm1peGVyLmNsaXBBY3Rpb24oY2xpcCkucGxheSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHVwZGF0ZVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBVcGRhdGUgdGhlIG1peGVyIChiZWluZyBjYWxsZWQgb24gZnJhbWUgYW5pbWF0aW9uIGxvb3ApXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL21lc2guQW5pbWF0aW9uTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgICAgaWYgKHRoaXMubWl4ZXIpIHRoaXMubWl4ZXIudXBkYXRlKHRoaXMuY2xvY2suZ2V0RGVsdGEoKSAqIHRoaXMucGFyYW1zLnNwZWVkKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW50ZWdyYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludGVncmF0ZShzZWxmKSB7XG4gICAgICBzZWxmLmxvb3AgPSBuZXcgTG9vcChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYudXBkYXRlKCk7XG4gICAgICB9KTtcbiAgICAgIGlmICghc2VsZi5pc0RlZmVycmVkKSBzZWxmLmxvb3Auc3RhcnQoc2VsZi5hcHApO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJtYW5hZ2VyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hbmFnZXIoX21hbmFnZXIpIHtcbiAgICAgIF9tYW5hZ2VyLmRlZmluZSgnYW5pbWF0aW9uJyk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEFuaW1hdGlvbk1vZHVsZTtcbn0oKTtcblxuLyoqIEBtb2R1bGUgbW9kdWxlcy9tZXNoICovXG5cbi8qKlxuICogQGNsYXNzIERlZmluZU1vZHVsZVxuICogQGNhdGVnb3J5IG1vZHVsZXNcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj4gQ3JlYXRpbmcgYSBEZWZpbmVNb2R1bGUgd2l0aCBQZXJzcGVjdGl2ZUNhbWVyYSBhcyBjYW1lcmEgbW9kdWxlIGFuZCBwYXNzaW5nIGl0IHRvIEFwcCdzIG1vZHVsZXM8L2NhcHRpb24+XG4gKiBuZXcgQXBwKFtcbiAqICAgLy8gLi4uXG4gKiAgIG5ldyBEZWZpbmVNb2R1bGUoJ2NhbWVyYScsIG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpKVxuICogXSk7XG4gKi9cbnZhciBEZWZpbmVNb2R1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBEZWZpbmVNb2R1bGUobmFtZSwgZGF0YSkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIERlZmluZU1vZHVsZSk7XG5cbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhEZWZpbmVNb2R1bGUsIFt7XG4gICAga2V5OiBcIm1hbmFnZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFuYWdlcihfbWFuYWdlcikge1xuICAgICAgX21hbmFnZXIuc2V0KHRoaXMubmFtZSwgdGhpcy5kYXRhKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRGVmaW5lTW9kdWxlO1xufSgpO1xuXG4vKiogQG1vZHVsZSBtb2R1bGVzICovXG5cbnZhciBNb2RlbCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0ltcG9ydGVyKSB7XG4gIGZ1bmN0aW9uIE1vZGVsKHBhcmFtcykge1xuICAgIHZhciBfZ2V0UHJvdG90eXBlT2YyO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgTW9kZWwpO1xuXG4gICAgY29uc29sZS53YXJuKCdNb2RlbCBpcyBkZXByZWNhdGVkLiBVc2UgSW1wb3J0ZXIgaW5zdGVhZC4nKTtcblxuICAgIGlmIChwYXJhbXMuZ2VvbWV0cnkpIHtcbiAgICAgIHBhcmFtcy51cmwgPSBwYXJhbXMuZ2VvbWV0cnkucGF0aDtcbiAgICAgIHBhcmFtcy5sb2FkZXIgPSBwYXJhbXMuZ2VvbWV0cnkubG9hZGVyO1xuICAgIH1cblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhZGRpdGlvbmFsID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFkZGl0aW9uYWxbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChfZ2V0UHJvdG90eXBlT2YyID0gZ2V0UHJvdG90eXBlT2YkMihNb2RlbCkpLmNhbGwuYXBwbHkoX2dldFByb3RvdHlwZU9mMiwgW3RoaXMsIHBhcmFtc10uY29uY2F0KGFkZGl0aW9uYWwpKSk7XG4gIH1cblxuICBpbmhlcml0cyhNb2RlbCwgX0ltcG9ydGVyKTtcblxuICByZXR1cm4gTW9kZWw7XG59KEltcG9ydGVyKTtcbnZhciBDYW1lcmFNb2R1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDYW1lcmFNb2R1bGUoKSB7XG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDYW1lcmFNb2R1bGUpO1xuXG4gICAgY29uc29sZS53YXJuKCdDYW1lcmFNb2R1bGUgaXMgZGVwcmVjYXRlZC4gVXNlIERlZmluZU1vZHVsZSBpbnN0ZWFkLicpO1xuICAgIHRoaXMuY2FtZXJhID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhJDEocGFyYW1zKTtcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKENhbWVyYU1vZHVsZSwgW3tcbiAgICBrZXk6IFwiaW50ZWdyYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludGVncmF0ZShzZWxmKSB7XG4gICAgICB0aGlzLmFkZChzZWxmLmNhbWVyYSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm1hbmFnZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFuYWdlcihfbWFuYWdlcikge1xuICAgICAgX21hbmFnZXIuc2V0KCdjYW1lcmEnLCB0aGlzLmNhbWVyYSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIENhbWVyYU1vZHVsZTtcbn0oKTtcblxuLyoqXG4gKiBOYW1lc3BhY2UgY29udGFpbmluZyBhbGwgY2xhc3NlcyBmcm9tIGFsbCBtb2R1bGVzLiBVc2VkIGFzIGdsb2JhbCBpbiBVTUQgcGF0dGVybi5cbiAqIEBuYW1lc3BhY2UgV0hTXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5UaGUgdXNlIG9mIFdIUyBuYW1lc3BhY2UuPC9jYXB0aW9uPlxuICogbmV3IFdIUy5BcHAoKSAvLyBjb3JlXG4gKiBuZXcgV0hTLlBlcnNwZWN0aXZlQ2FtZXJhKCkgLy8gY29tcG9uZW50c1xuICogbmV3IFdIUy5SZXNpemVNb2R1bGUoKSAvLyBtb2R1bGVzXG4gKiBXSFMuZXh0ZW5kKCkgLy8gdXRpbHNcbiAqL1xuXG5leHBvcnQgeyBDb21wb25lbnQsIE1lc2hDb21wb25lbnQsIExpZ2h0Q29tcG9uZW50LCBDYW1lcmFDb21wb25lbnQsIEFwcCwgTG9vcCwgTW9kdWxlTWFuYWdlciwgQW1iaWVudExpZ2h0JDEgYXMgQW1iaWVudExpZ2h0LCBEaXJlY3Rpb25hbExpZ2h0JDEgYXMgRGlyZWN0aW9uYWxMaWdodCwgSGVtaXNwaGVyZUxpZ2h0JDEgYXMgSGVtaXNwaGVyZUxpZ2h0LCBQb2ludExpZ2h0JDEgYXMgUG9pbnRMaWdodCwgU3BvdExpZ2h0JDEgYXMgU3BvdExpZ2h0LCBBcmVhTGlnaHQsIEN1YmVDYW1lcmEkMSBhcyBDdWJlQ2FtZXJhLCBPcnRob2dyYXBoaWNDYW1lcmEkMSBhcyBPcnRob2dyYXBoaWNDYW1lcmEsIFBlcnNwZWN0aXZlQ2FtZXJhJDEgYXMgUGVyc3BlY3RpdmVDYW1lcmEsIEJveCwgQ2lyY2xlLCBDb25lLCBDeWxpbmRlciwgRG9kZWNhaGVkcm9uLCBFeHRydWRlLCBJY29zYWhlZHJvbiwgTGF0aGUsIExpbmUkMSBhcyBMaW5lLCBJbXBvcnRlciwgT2N0YWhlZHJvbiwgUGFyYW1ldHJpYywgUGxhbmUkMSBhcyBQbGFuZSwgUG9seWhlZHJvbiwgUmluZywgU2hhcGUkMSBhcyBTaGFwZSwgU3BoZXJlJDEgYXMgU3BoZXJlLCBUZXRyYWhlZHJvbiwgVGV4dCwgVG9ydXMsIFRvcnVza25vdCwgVHViZSwgR3JvdXAkMSBhcyBHcm91cCwgZXh0ZW5kLCBpbnN0cnVjdCwgdHJhbnNmb3JtRGF0YSwgdG9BcnJheSwgRWxlbWVudE1vZHVsZSwgUmVuZGVyaW5nTW9kdWxlLCBTY2VuZU1vZHVsZSwgUmVzaXplTW9kdWxlLCBQb3N0UHJvY2Vzc29yTW9kdWxlLCBWaXJ0dWFsTW91c2VNb2R1bGUsIEV2ZW50c1BhdGNoTW9kdWxlLCBDb250cm9sc01vZHVsZSwgRm9nTW9kdWxlLCBTdGF0ZU1vZHVsZSwgT3JiaXRDb250cm9sc01vZHVsZSwgRHluYW1pY0dlb21ldHJ5TW9kdWxlLCBUZXh0dXJlTW9kdWxlLCBBbmltYXRpb25Nb2R1bGUsIERlZmluZU1vZHVsZSwgTW9kZWwsIENhbWVyYU1vZHVsZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2hzLm1vZHVsZS5qcy5tYXBcbiIsIi8vIFBvbHlmaWxsc1xuXG5pZiAoIE51bWJlci5FUFNJTE9OID09PSB1bmRlZmluZWQgKSB7XG5cblx0TnVtYmVyLkVQU0lMT04gPSBNYXRoLnBvdyggMiwgLSA1MiApO1xuXG59XG5cbmlmICggTnVtYmVyLmlzSW50ZWdlciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdC8vIE1pc3NpbmcgaW4gSUVcblx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTnVtYmVyL2lzSW50ZWdlclxuXG5cdE51bWJlci5pc0ludGVnZXIgPSBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoIHZhbHVlICkgJiYgTWF0aC5mbG9vciggdmFsdWUgKSA9PT0gdmFsdWU7XG5cblx0fTtcblxufVxuXG4vL1xuXG5pZiAoIE1hdGguc2lnbiA9PT0gdW5kZWZpbmVkICkge1xuXG5cdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hdGgvc2lnblxuXG5cdE1hdGguc2lnbiA9IGZ1bmN0aW9uICggeCApIHtcblxuXHRcdHJldHVybiAoIHggPCAwICkgPyAtIDEgOiAoIHggPiAwICkgPyAxIDogKyB4O1xuXG5cdH07XG5cbn1cblxuaWYgKCBGdW5jdGlvbi5wcm90b3R5cGUubmFtZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdC8vIE1pc3NpbmcgaW4gSUVcblx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRnVuY3Rpb24vbmFtZVxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggRnVuY3Rpb24ucHJvdG90eXBlLCAnbmFtZScsIHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy50b1N0cmluZygpLm1hdGNoKCAvXlxccypmdW5jdGlvblxccyooW15cXChcXHNdKikvIClbIDEgXTtcblxuXHRcdH1cblxuXHR9ICk7XG5cbn1cblxuaWYgKCBPYmplY3QuYXNzaWduID09PSB1bmRlZmluZWQgKSB7XG5cblx0Ly8gTWlzc2luZyBpbiBJRVxuXHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvYXNzaWduXG5cblx0KCBmdW5jdGlvbiAoKSB7XG5cblx0XHRPYmplY3QuYXNzaWduID0gZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRcdCd1c2Ugc3RyaWN0JztcblxuXHRcdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCB8fCB0YXJnZXQgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvciggJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgb3V0cHV0ID0gT2JqZWN0KCB0YXJnZXQgKTtcblxuXHRcdFx0Zm9yICggdmFyIGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCArKyApIHtcblxuXHRcdFx0XHR2YXIgc291cmNlID0gYXJndW1lbnRzWyBpbmRleCBdO1xuXG5cdFx0XHRcdGlmICggc291cmNlICE9PSB1bmRlZmluZWQgJiYgc291cmNlICE9PSBudWxsICkge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIG5leHRLZXkgaW4gc291cmNlICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCggc291cmNlLCBuZXh0S2V5ICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0b3V0cHV0WyBuZXh0S2V5IF0gPSBzb3VyY2VbIG5leHRLZXkgXTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb3V0cHV0O1xuXG5cdFx0fTtcblxuXHR9ICkoKTtcblxufVxuXG4vKipcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvZXZlbnRkaXNwYXRjaGVyLmpzL1xuICovXG5cbmZ1bmN0aW9uIEV2ZW50RGlzcGF0Y2hlcigpIHt9XG5cbk9iamVjdC5hc3NpZ24oIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUsIHtcblxuXHRhZGRFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAoIHR5cGUsIGxpc3RlbmVyICkge1xuXG5cdFx0aWYgKCB0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xuXG5cdFx0dmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcblxuXHRcdGlmICggbGlzdGVuZXJzWyB0eXBlIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bGlzdGVuZXJzWyB0eXBlIF0gPSBbXTtcblxuXHRcdH1cblxuXHRcdGlmICggbGlzdGVuZXJzWyB0eXBlIF0uaW5kZXhPZiggbGlzdGVuZXIgKSA9PT0gLSAxICkge1xuXG5cdFx0XHRsaXN0ZW5lcnNbIHR5cGUgXS5wdXNoKCBsaXN0ZW5lciApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0aGFzRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gKCB0eXBlLCBsaXN0ZW5lciApIHtcblxuXHRcdGlmICggdGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSByZXR1cm4gZmFsc2U7XG5cblx0XHR2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xuXG5cdFx0cmV0dXJuIGxpc3RlbmVyc1sgdHlwZSBdICE9PSB1bmRlZmluZWQgJiYgbGlzdGVuZXJzWyB0eXBlIF0uaW5kZXhPZiggbGlzdGVuZXIgKSAhPT0gLSAxO1xuXG5cdH0sXG5cblx0cmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gKCB0eXBlLCBsaXN0ZW5lciApIHtcblxuXHRcdGlmICggdGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSByZXR1cm47XG5cblx0XHR2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xuXHRcdHZhciBsaXN0ZW5lckFycmF5ID0gbGlzdGVuZXJzWyB0eXBlIF07XG5cblx0XHRpZiAoIGxpc3RlbmVyQXJyYXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIGluZGV4ID0gbGlzdGVuZXJBcnJheS5pbmRleE9mKCBsaXN0ZW5lciApO1xuXG5cdFx0XHRpZiAoIGluZGV4ICE9PSAtIDEgKSB7XG5cblx0XHRcdFx0bGlzdGVuZXJBcnJheS5zcGxpY2UoIGluZGV4LCAxICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdGRpc3BhdGNoRXZlbnQ6IGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRpZiAoIHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0dmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcblx0XHR2YXIgbGlzdGVuZXJBcnJheSA9IGxpc3RlbmVyc1sgZXZlbnQudHlwZSBdO1xuXG5cdFx0aWYgKCBsaXN0ZW5lckFycmF5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGV2ZW50LnRhcmdldCA9IHRoaXM7XG5cblx0XHRcdHZhciBhcnJheSA9IFtdLCBpID0gMDtcblx0XHRcdHZhciBsZW5ndGggPSBsaXN0ZW5lckFycmF5Lmxlbmd0aDtcblxuXHRcdFx0Zm9yICggaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0YXJyYXlbIGkgXSA9IGxpc3RlbmVyQXJyYXlbIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRhcnJheVsgaSBdLmNhbGwoIHRoaXMsIGV2ZW50ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxudmFyIFJFVklTSU9OID0gJzg1JztcbnZhciBNT1VTRSA9IHsgTEVGVDogMCwgTUlERExFOiAxLCBSSUdIVDogMiB9O1xudmFyIEN1bGxGYWNlTm9uZSA9IDA7XG52YXIgQ3VsbEZhY2VCYWNrID0gMTtcbnZhciBDdWxsRmFjZUZyb250ID0gMjtcbnZhciBDdWxsRmFjZUZyb250QmFjayA9IDM7XG52YXIgRnJvbnRGYWNlRGlyZWN0aW9uQ1cgPSAwO1xudmFyIEZyb250RmFjZURpcmVjdGlvbkNDVyA9IDE7XG52YXIgQmFzaWNTaGFkb3dNYXAgPSAwO1xudmFyIFBDRlNoYWRvd01hcCA9IDE7XG52YXIgUENGU29mdFNoYWRvd01hcCA9IDI7XG52YXIgRnJvbnRTaWRlID0gMDtcbnZhciBCYWNrU2lkZSA9IDE7XG52YXIgRG91YmxlU2lkZSA9IDI7XG52YXIgRmxhdFNoYWRpbmcgPSAxO1xudmFyIFNtb290aFNoYWRpbmcgPSAyO1xudmFyIE5vQ29sb3JzID0gMDtcbnZhciBGYWNlQ29sb3JzID0gMTtcbnZhciBWZXJ0ZXhDb2xvcnMgPSAyO1xudmFyIE5vQmxlbmRpbmcgPSAwO1xudmFyIE5vcm1hbEJsZW5kaW5nID0gMTtcbnZhciBBZGRpdGl2ZUJsZW5kaW5nID0gMjtcbnZhciBTdWJ0cmFjdGl2ZUJsZW5kaW5nID0gMztcbnZhciBNdWx0aXBseUJsZW5kaW5nID0gNDtcbnZhciBDdXN0b21CbGVuZGluZyA9IDU7XG52YXIgQWRkRXF1YXRpb24gPSAxMDA7XG52YXIgU3VidHJhY3RFcXVhdGlvbiA9IDEwMTtcbnZhciBSZXZlcnNlU3VidHJhY3RFcXVhdGlvbiA9IDEwMjtcbnZhciBNaW5FcXVhdGlvbiA9IDEwMztcbnZhciBNYXhFcXVhdGlvbiA9IDEwNDtcbnZhciBaZXJvRmFjdG9yID0gMjAwO1xudmFyIE9uZUZhY3RvciA9IDIwMTtcbnZhciBTcmNDb2xvckZhY3RvciA9IDIwMjtcbnZhciBPbmVNaW51c1NyY0NvbG9yRmFjdG9yID0gMjAzO1xudmFyIFNyY0FscGhhRmFjdG9yID0gMjA0O1xudmFyIE9uZU1pbnVzU3JjQWxwaGFGYWN0b3IgPSAyMDU7XG52YXIgRHN0QWxwaGFGYWN0b3IgPSAyMDY7XG52YXIgT25lTWludXNEc3RBbHBoYUZhY3RvciA9IDIwNztcbnZhciBEc3RDb2xvckZhY3RvciA9IDIwODtcbnZhciBPbmVNaW51c0RzdENvbG9yRmFjdG9yID0gMjA5O1xudmFyIFNyY0FscGhhU2F0dXJhdGVGYWN0b3IgPSAyMTA7XG52YXIgTmV2ZXJEZXB0aCA9IDA7XG52YXIgQWx3YXlzRGVwdGggPSAxO1xudmFyIExlc3NEZXB0aCA9IDI7XG52YXIgTGVzc0VxdWFsRGVwdGggPSAzO1xudmFyIEVxdWFsRGVwdGggPSA0O1xudmFyIEdyZWF0ZXJFcXVhbERlcHRoID0gNTtcbnZhciBHcmVhdGVyRGVwdGggPSA2O1xudmFyIE5vdEVxdWFsRGVwdGggPSA3O1xudmFyIE11bHRpcGx5T3BlcmF0aW9uID0gMDtcbnZhciBNaXhPcGVyYXRpb24gPSAxO1xudmFyIEFkZE9wZXJhdGlvbiA9IDI7XG52YXIgTm9Ub25lTWFwcGluZyA9IDA7XG52YXIgTGluZWFyVG9uZU1hcHBpbmcgPSAxO1xudmFyIFJlaW5oYXJkVG9uZU1hcHBpbmcgPSAyO1xudmFyIFVuY2hhcnRlZDJUb25lTWFwcGluZyA9IDM7XG52YXIgQ2luZW9uVG9uZU1hcHBpbmcgPSA0O1xudmFyIFVWTWFwcGluZyA9IDMwMDtcbnZhciBDdWJlUmVmbGVjdGlvbk1hcHBpbmcgPSAzMDE7XG52YXIgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nID0gMzAyO1xudmFyIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nID0gMzAzO1xudmFyIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nID0gMzA0O1xudmFyIFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nID0gMzA1O1xudmFyIEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nID0gMzA2O1xudmFyIEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nID0gMzA3O1xudmFyIFJlcGVhdFdyYXBwaW5nID0gMTAwMDtcbnZhciBDbGFtcFRvRWRnZVdyYXBwaW5nID0gMTAwMTtcbnZhciBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nID0gMTAwMjtcbnZhciBOZWFyZXN0RmlsdGVyID0gMTAwMztcbnZhciBOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlciA9IDEwMDQ7XG52YXIgTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciA9IDEwMDU7XG52YXIgTGluZWFyRmlsdGVyID0gMTAwNjtcbnZhciBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyID0gMTAwNztcbnZhciBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXIgPSAxMDA4O1xudmFyIFVuc2lnbmVkQnl0ZVR5cGUgPSAxMDA5O1xudmFyIEJ5dGVUeXBlID0gMTAxMDtcbnZhciBTaG9ydFR5cGUgPSAxMDExO1xudmFyIFVuc2lnbmVkU2hvcnRUeXBlID0gMTAxMjtcbnZhciBJbnRUeXBlID0gMTAxMztcbnZhciBVbnNpZ25lZEludFR5cGUgPSAxMDE0O1xudmFyIEZsb2F0VHlwZSA9IDEwMTU7XG52YXIgSGFsZkZsb2F0VHlwZSA9IDEwMTY7XG52YXIgVW5zaWduZWRTaG9ydDQ0NDRUeXBlID0gMTAxNztcbnZhciBVbnNpZ25lZFNob3J0NTU1MVR5cGUgPSAxMDE4O1xudmFyIFVuc2lnbmVkU2hvcnQ1NjVUeXBlID0gMTAxOTtcbnZhciBVbnNpZ25lZEludDI0OFR5cGUgPSAxMDIwO1xudmFyIEFscGhhRm9ybWF0ID0gMTAyMTtcbnZhciBSR0JGb3JtYXQgPSAxMDIyO1xudmFyIFJHQkFGb3JtYXQgPSAxMDIzO1xudmFyIEx1bWluYW5jZUZvcm1hdCA9IDEwMjQ7XG52YXIgTHVtaW5hbmNlQWxwaGFGb3JtYXQgPSAxMDI1O1xudmFyIFJHQkVGb3JtYXQgPSBSR0JBRm9ybWF0O1xudmFyIERlcHRoRm9ybWF0ID0gMTAyNjtcbnZhciBEZXB0aFN0ZW5jaWxGb3JtYXQgPSAxMDI3O1xudmFyIFJHQl9TM1RDX0RYVDFfRm9ybWF0ID0gMjAwMTtcbnZhciBSR0JBX1MzVENfRFhUMV9Gb3JtYXQgPSAyMDAyO1xudmFyIFJHQkFfUzNUQ19EWFQzX0Zvcm1hdCA9IDIwMDM7XG52YXIgUkdCQV9TM1RDX0RYVDVfRm9ybWF0ID0gMjAwNDtcbnZhciBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCA9IDIxMDA7XG52YXIgUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQgPSAyMTAxO1xudmFyIFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdCA9IDIxMDI7XG52YXIgUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0ID0gMjEwMztcbnZhciBSR0JfRVRDMV9Gb3JtYXQgPSAyMTUxO1xudmFyIExvb3BPbmNlID0gMjIwMDtcbnZhciBMb29wUmVwZWF0ID0gMjIwMTtcbnZhciBMb29wUGluZ1BvbmcgPSAyMjAyO1xudmFyIEludGVycG9sYXRlRGlzY3JldGUgPSAyMzAwO1xudmFyIEludGVycG9sYXRlTGluZWFyID0gMjMwMTtcbnZhciBJbnRlcnBvbGF0ZVNtb290aCA9IDIzMDI7XG52YXIgWmVyb0N1cnZhdHVyZUVuZGluZyA9IDI0MDA7XG52YXIgWmVyb1Nsb3BlRW5kaW5nID0gMjQwMTtcbnZhciBXcmFwQXJvdW5kRW5kaW5nID0gMjQwMjtcbnZhciBUcmlhbmdsZXNEcmF3TW9kZSA9IDA7XG52YXIgVHJpYW5nbGVTdHJpcERyYXdNb2RlID0gMTtcbnZhciBUcmlhbmdsZUZhbkRyYXdNb2RlID0gMjtcbnZhciBMaW5lYXJFbmNvZGluZyA9IDMwMDA7XG52YXIgc1JHQkVuY29kaW5nID0gMzAwMTtcbnZhciBHYW1tYUVuY29kaW5nID0gMzAwNztcbnZhciBSR0JFRW5jb2RpbmcgPSAzMDAyO1xudmFyIExvZ0x1dkVuY29kaW5nID0gMzAwMztcbnZhciBSR0JNN0VuY29kaW5nID0gMzAwNDtcbnZhciBSR0JNMTZFbmNvZGluZyA9IDMwMDU7XG52YXIgUkdCREVuY29kaW5nID0gMzAwNjtcbnZhciBCYXNpY0RlcHRoUGFja2luZyA9IDMyMDA7XG52YXIgUkdCQURlcHRoUGFja2luZyA9IDMyMDE7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxudmFyIF9NYXRoID0ge1xuXG5cdERFRzJSQUQ6IE1hdGguUEkgLyAxODAsXG5cdFJBRDJERUc6IDE4MCAvIE1hdGguUEksXG5cblx0Z2VuZXJhdGVVVUlEOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBodHRwOi8vd3d3LmJyb29mYS5jb20vVG9vbHMvTWF0aC51dWlkLmh0bVxuXG5cdFx0dmFyIGNoYXJzID0gJzAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Jy5zcGxpdCggJycgKTtcblx0XHR2YXIgdXVpZCA9IG5ldyBBcnJheSggMzYgKTtcblx0XHR2YXIgcm5kID0gMCwgcjtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZW5lcmF0ZVVVSUQoKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDM2OyBpICsrICkge1xuXG5cdFx0XHRcdGlmICggaSA9PT0gOCB8fCBpID09PSAxMyB8fCBpID09PSAxOCB8fCBpID09PSAyMyApIHtcblxuXHRcdFx0XHRcdHV1aWRbIGkgXSA9ICctJztcblxuXHRcdFx0XHR9IGVsc2UgaWYgKCBpID09PSAxNCApIHtcblxuXHRcdFx0XHRcdHV1aWRbIGkgXSA9ICc0JztcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aWYgKCBybmQgPD0gMHgwMiApIHJuZCA9IDB4MjAwMDAwMCArICggTWF0aC5yYW5kb20oKSAqIDB4MTAwMDAwMCApIHwgMDtcblx0XHRcdFx0XHRyID0gcm5kICYgMHhmO1xuXHRcdFx0XHRcdHJuZCA9IHJuZCA+PiA0O1xuXHRcdFx0XHRcdHV1aWRbIGkgXSA9IGNoYXJzWyAoIGkgPT09IDE5ICkgPyAoIHIgJiAweDMgKSB8IDB4OCA6IHIgXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHV1aWQuam9pbiggJycgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNsYW1wOiBmdW5jdGlvbiAoIHZhbHVlLCBtaW4sIG1heCApIHtcblxuXHRcdHJldHVybiBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCB2YWx1ZSApICk7XG5cblx0fSxcblxuXHQvLyBjb21wdXRlIGV1Y2xpZGlhbiBtb2R1bG8gb2YgbSAlIG5cblx0Ly8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTW9kdWxvX29wZXJhdGlvblxuXG5cdGV1Y2xpZGVhbk1vZHVsbzogZnVuY3Rpb24gKCBuLCBtICkge1xuXG5cdFx0cmV0dXJuICggKCBuICUgbSApICsgbSApICUgbTtcblxuXHR9LFxuXG5cdC8vIExpbmVhciBtYXBwaW5nIGZyb20gcmFuZ2UgPGExLCBhMj4gdG8gcmFuZ2UgPGIxLCBiMj5cblxuXHRtYXBMaW5lYXI6IGZ1bmN0aW9uICggeCwgYTEsIGEyLCBiMSwgYjIgKSB7XG5cblx0XHRyZXR1cm4gYjEgKyAoIHggLSBhMSApICogKCBiMiAtIGIxICkgLyAoIGEyIC0gYTEgKTtcblxuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpbmVhcl9pbnRlcnBvbGF0aW9uXG5cblx0bGVycDogZnVuY3Rpb24gKCB4LCB5LCB0ICkge1xuXG5cdFx0cmV0dXJuICggMSAtIHQgKSAqIHggKyB0ICogeTtcblxuXHR9LFxuXG5cdC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU21vb3Roc3RlcFxuXG5cdHNtb290aHN0ZXA6IGZ1bmN0aW9uICggeCwgbWluLCBtYXggKSB7XG5cblx0XHRpZiAoIHggPD0gbWluICkgcmV0dXJuIDA7XG5cdFx0aWYgKCB4ID49IG1heCApIHJldHVybiAxO1xuXG5cdFx0eCA9ICggeCAtIG1pbiApIC8gKCBtYXggLSBtaW4gKTtcblxuXHRcdHJldHVybiB4ICogeCAqICggMyAtIDIgKiB4ICk7XG5cblx0fSxcblxuXHRzbW9vdGhlcnN0ZXA6IGZ1bmN0aW9uICggeCwgbWluLCBtYXggKSB7XG5cblx0XHRpZiAoIHggPD0gbWluICkgcmV0dXJuIDA7XG5cdFx0aWYgKCB4ID49IG1heCApIHJldHVybiAxO1xuXG5cdFx0eCA9ICggeCAtIG1pbiApIC8gKCBtYXggLSBtaW4gKTtcblxuXHRcdHJldHVybiB4ICogeCAqIHggKiAoIHggKiAoIHggKiA2IC0gMTUgKSArIDEwICk7XG5cblx0fSxcblxuXHQvLyBSYW5kb20gaW50ZWdlciBmcm9tIDxsb3csIGhpZ2g+IGludGVydmFsXG5cblx0cmFuZEludDogZnVuY3Rpb24gKCBsb3csIGhpZ2ggKSB7XG5cblx0XHRyZXR1cm4gbG93ICsgTWF0aC5mbG9vciggTWF0aC5yYW5kb20oKSAqICggaGlnaCAtIGxvdyArIDEgKSApO1xuXG5cdH0sXG5cblx0Ly8gUmFuZG9tIGZsb2F0IGZyb20gPGxvdywgaGlnaD4gaW50ZXJ2YWxcblxuXHRyYW5kRmxvYXQ6IGZ1bmN0aW9uICggbG93LCBoaWdoICkge1xuXG5cdFx0cmV0dXJuIGxvdyArIE1hdGgucmFuZG9tKCkgKiAoIGhpZ2ggLSBsb3cgKTtcblxuXHR9LFxuXG5cdC8vIFJhbmRvbSBmbG9hdCBmcm9tIDwtcmFuZ2UvMiwgcmFuZ2UvMj4gaW50ZXJ2YWxcblxuXHRyYW5kRmxvYXRTcHJlYWQ6IGZ1bmN0aW9uICggcmFuZ2UgKSB7XG5cblx0XHRyZXR1cm4gcmFuZ2UgKiAoIDAuNSAtIE1hdGgucmFuZG9tKCkgKTtcblxuXHR9LFxuXG5cdGRlZ1RvUmFkOiBmdW5jdGlvbiAoIGRlZ3JlZXMgKSB7XG5cblx0XHRyZXR1cm4gZGVncmVlcyAqIF9NYXRoLkRFRzJSQUQ7XG5cblx0fSxcblxuXHRyYWRUb0RlZzogZnVuY3Rpb24gKCByYWRpYW5zICkge1xuXG5cdFx0cmV0dXJuIHJhZGlhbnMgKiBfTWF0aC5SQUQyREVHO1xuXG5cdH0sXG5cblx0aXNQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0cmV0dXJuICggdmFsdWUgJiAoIHZhbHVlIC0gMSApICkgPT09IDAgJiYgdmFsdWUgIT09IDA7XG5cblx0fSxcblxuXHRuZWFyZXN0UG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHJldHVybiBNYXRoLnBvdyggMiwgTWF0aC5yb3VuZCggTWF0aC5sb2coIHZhbHVlICkgLyBNYXRoLkxOMiApICk7XG5cblx0fSxcblxuXHRuZXh0UG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHZhbHVlIC0tO1xuXHRcdHZhbHVlIHw9IHZhbHVlID4+IDE7XG5cdFx0dmFsdWUgfD0gdmFsdWUgPj4gMjtcblx0XHR2YWx1ZSB8PSB2YWx1ZSA+PiA0O1xuXHRcdHZhbHVlIHw9IHZhbHVlID4+IDg7XG5cdFx0dmFsdWUgfD0gdmFsdWUgPj4gMTY7XG5cdFx0dmFsdWUgKys7XG5cblx0XHRyZXR1cm4gdmFsdWU7XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIHBoaWxvZ2IgLyBodHRwOi8vYmxvZy50aGVqaXQub3JnL1xuICogQGF1dGhvciBlZ3JhZXRoZXIgLyBodHRwOi8vZWdyYWV0aGVyLmNvbS9cbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqL1xuXG5mdW5jdGlvbiBWZWN0b3IyKCB4LCB5ICkge1xuXG5cdHRoaXMueCA9IHggfHwgMDtcblx0dGhpcy55ID0geSB8fCAwO1xuXG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBWZWN0b3IyLnByb3RvdHlwZSwge1xuXG5cdFwid2lkdGhcIiA6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy54O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy54ID0gdmFsdWU7XG5cblx0XHR9XG5cblx0fSxcblxuXHRcImhlaWdodFwiIDoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnk7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLnkgPSB2YWx1ZTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yMi5wcm90b3R5cGUsIHtcblxuXHRpc1ZlY3RvcjI6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHkgKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXHRcdHRoaXMueSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnggPSBzY2FsYXI7XG5cdFx0dGhpcy55ID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYOiBmdW5jdGlvbiAoIHggKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRZOiBmdW5jdGlvbiAoIHkgKSB7XG5cblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXgsIHZhbHVlICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogdGhpcy54ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAxOiB0aGlzLnkgPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRzd2l0Y2ggKCBpbmRleCApIHtcblxuXHRcdFx0Y2FzZSAwOiByZXR1cm4gdGhpcy54O1xuXHRcdFx0Y2FzZSAxOiByZXR1cm4gdGhpcy55O1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMueCwgdGhpcy55ICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSB2Lng7XG5cdFx0dGhpcy55ID0gdi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGQ6IGZ1bmN0aW9uICggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuYWRkVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ICs9IHYueDtcblx0XHR0aGlzLnkgKz0gdi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMueCArPSBzO1xuXHRcdHRoaXMueSArPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggKyBiLng7XG5cdFx0dGhpcy55ID0gYS55ICsgYi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsZWRWZWN0b3I6IGZ1bmN0aW9uICggdiwgcyApIHtcblxuXHRcdHRoaXMueCArPSB2LnggKiBzO1xuXHRcdHRoaXMueSArPSB2LnkgKiBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWI6IGZ1bmN0aW9uICggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54IC09IHYueDtcblx0XHR0aGlzLnkgLT0gdi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWJTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMueCAtPSBzO1xuXHRcdHRoaXMueSAtPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWJWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggLSBiLng7XG5cdFx0dGhpcy55ID0gYS55IC0gYi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ICo9IHYueDtcblx0XHR0aGlzLnkgKj0gdi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnggKj0gc2NhbGFyO1xuXHRcdHRoaXMueSAqPSBzY2FsYXI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpdmlkZTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54IC89IHYueDtcblx0XHR0aGlzLnkgLz0gdi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXZpZGVTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoIDEgLyBzY2FsYXIgKTtcblxuXHR9LFxuXG5cdG1pbjogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5taW4oIHRoaXMueCwgdi54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5taW4oIHRoaXMueSwgdi55ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1heDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5tYXgoIHRoaXMueCwgdi54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5tYXgoIHRoaXMueSwgdi55ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsYW1wOiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0Ly8gVGhpcyBmdW5jdGlvbiBhc3N1bWVzIG1pbiA8IG1heCwgaWYgdGhpcyBhc3N1bXB0aW9uIGlzbid0IHRydWUgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHlcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCBtaW4ueCwgTWF0aC5taW4oIG1heC54LCB0aGlzLnggKSApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCBtaW4ueSwgTWF0aC5taW4oIG1heC55LCB0aGlzLnkgKSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbGFtcFNjYWxhcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1pbiA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0dmFyIG1heCA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2xhbXBTY2FsYXIoIG1pblZhbCwgbWF4VmFsICkge1xuXG5cdFx0XHRtaW4uc2V0KCBtaW5WYWwsIG1pblZhbCApO1xuXHRcdFx0bWF4LnNldCggbWF4VmFsLCBtYXhWYWwgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuY2xhbXAoIG1pbiwgbWF4ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbGFtcExlbmd0aDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCgpO1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoIE1hdGgubWF4KCBtaW4sIE1hdGgubWluKCBtYXgsIGxlbmd0aCApICkgLyBsZW5ndGggKTtcblxuXHR9LFxuXG5cdGZsb29yOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLmZsb29yKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLmZsb29yKCB0aGlzLnkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2VpbDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5jZWlsKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLmNlaWwoIHRoaXMueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3VuZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5yb3VuZCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5yb3VuZCggdGhpcy55ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kVG9aZXJvOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSAoIHRoaXMueCA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy54ICkgOiBNYXRoLmZsb29yKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSAoIHRoaXMueSA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy55ICkgOiBNYXRoLmZsb29yKCB0aGlzLnkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bmVnYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSAtIHRoaXMueDtcblx0XHR0aGlzLnkgPSAtIHRoaXMueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZG90OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdi54ICsgdGhpcy55ICogdi55O1xuXG5cdH0sXG5cblx0bGVuZ3RoU3E6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnk7XG5cblx0fSxcblxuXHRsZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSApO1xuXG5cdH0sXG5cblx0bGVuZ3RoTWFuaGF0dGFuOiBmdW5jdGlvbigpIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54ICkgKyBNYXRoLmFicyggdGhpcy55ICk7XG5cblx0fSxcblxuXHRub3JtYWxpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggdGhpcy5sZW5ndGgoKSApO1xuXG5cdH0sXG5cblx0YW5nbGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIGNvbXB1dGVzIHRoZSBhbmdsZSBpbiByYWRpYW5zIHdpdGggcmVzcGVjdCB0byB0aGUgcG9zaXRpdmUgeC1heGlzXG5cblx0XHR2YXIgYW5nbGUgPSBNYXRoLmF0YW4yKCB0aGlzLnksIHRoaXMueCApO1xuXG5cdFx0aWYgKCBhbmdsZSA8IDAgKSBhbmdsZSArPSAyICogTWF0aC5QSTtcblxuXHRcdHJldHVybiBhbmdsZTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG86IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQoIHYgKSApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1NxdWFyZWQ6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHZhciBkeCA9IHRoaXMueCAtIHYueCwgZHkgPSB0aGlzLnkgLSB2Lnk7XG5cdFx0cmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb01hbmhhdHRhbjogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggLSB2LnggKSArIE1hdGguYWJzKCB0aGlzLnkgLSB2LnkgKTtcblxuXHR9LFxuXG5cdHNldExlbmd0aDogZnVuY3Rpb24gKCBsZW5ndGggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhciggbGVuZ3RoIC8gdGhpcy5sZW5ndGgoKSApO1xuXG5cdH0sXG5cblx0bGVycDogZnVuY3Rpb24gKCB2LCBhbHBoYSApIHtcblxuXHRcdHRoaXMueCArPSAoIHYueCAtIHRoaXMueCApICogYWxwaGE7XG5cdFx0dGhpcy55ICs9ICggdi55IC0gdGhpcy55ICkgKiBhbHBoYTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bGVycFZlY3RvcnM6IGZ1bmN0aW9uICggdjEsIHYyLCBhbHBoYSApIHtcblxuXHRcdHJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYyLCB2MSApLm11bHRpcGx5U2NhbGFyKCBhbHBoYSApLmFkZCggdjEgKTtcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuICggKCB2LnggPT09IHRoaXMueCApICYmICggdi55ID09PSB0aGlzLnkgKSApO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMueCA9IGFycmF5WyBvZmZzZXQgXTtcblx0XHR0aGlzLnkgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy54O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLnk7XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fSxcblxuXHRmcm9tQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjI6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTtcblx0XHR0aGlzLnkgPSBhdHRyaWJ1dGUuZ2V0WSggaW5kZXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm90YXRlQXJvdW5kOiBmdW5jdGlvbiAoIGNlbnRlciwgYW5nbGUgKSB7XG5cblx0XHR2YXIgYyA9IE1hdGguY29zKCBhbmdsZSApLCBzID0gTWF0aC5zaW4oIGFuZ2xlICk7XG5cblx0XHR2YXIgeCA9IHRoaXMueCAtIGNlbnRlci54O1xuXHRcdHZhciB5ID0gdGhpcy55IC0gY2VudGVyLnk7XG5cblx0XHR0aGlzLnggPSB4ICogYyAtIHkgKiBzICsgY2VudGVyLng7XG5cdFx0dGhpcy55ID0geCAqIHMgKyB5ICogYyArIGNlbnRlci55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIHN6aW1layAvIGh0dHBzOi8vZ2l0aHViLmNvbS9zemltZWsvXG4gKi9cblxudmFyIHRleHR1cmVJZCA9IDA7XG5cbmZ1bmN0aW9uIFRleHR1cmUoIGltYWdlLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICkge1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogdGV4dHVyZUlkICsrIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLm5hbWUgPSAnJztcblxuXHR0aGlzLmltYWdlID0gaW1hZ2UgIT09IHVuZGVmaW5lZCA/IGltYWdlIDogVGV4dHVyZS5ERUZBVUxUX0lNQUdFO1xuXHR0aGlzLm1pcG1hcHMgPSBbXTtcblxuXHR0aGlzLm1hcHBpbmcgPSBtYXBwaW5nICE9PSB1bmRlZmluZWQgPyBtYXBwaW5nIDogVGV4dHVyZS5ERUZBVUxUX01BUFBJTkc7XG5cblx0dGhpcy53cmFwUyA9IHdyYXBTICE9PSB1bmRlZmluZWQgPyB3cmFwUyA6IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cdHRoaXMud3JhcFQgPSB3cmFwVCAhPT0gdW5kZWZpbmVkID8gd3JhcFQgOiBDbGFtcFRvRWRnZVdyYXBwaW5nO1xuXG5cdHRoaXMubWFnRmlsdGVyID0gbWFnRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtYWdGaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7XG5cdHRoaXMubWluRmlsdGVyID0gbWluRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtaW5GaWx0ZXIgOiBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXI7XG5cblx0dGhpcy5hbmlzb3Ryb3B5ID0gYW5pc290cm9weSAhPT0gdW5kZWZpbmVkID8gYW5pc290cm9weSA6IDE7XG5cblx0dGhpcy5mb3JtYXQgPSBmb3JtYXQgIT09IHVuZGVmaW5lZCA/IGZvcm1hdCA6IFJHQkFGb3JtYXQ7XG5cdHRoaXMudHlwZSA9IHR5cGUgIT09IHVuZGVmaW5lZCA/IHR5cGUgOiBVbnNpZ25lZEJ5dGVUeXBlO1xuXG5cdHRoaXMub2Zmc2V0ID0gbmV3IFZlY3RvcjIoIDAsIDAgKTtcblx0dGhpcy5yZXBlYXQgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gdHJ1ZTtcblx0dGhpcy5wcmVtdWx0aXBseUFscGhhID0gZmFsc2U7XG5cdHRoaXMuZmxpcFkgPSB0cnVlO1xuXHR0aGlzLnVucGFja0FsaWdubWVudCA9IDQ7XHQvLyB2YWxpZCB2YWx1ZXM6IDEsIDIsIDQsIDggKHNlZSBodHRwOi8vd3d3Lmtocm9ub3Mub3JnL29wZW5nbGVzL3Nkay9kb2NzL21hbi94aHRtbC9nbFBpeGVsU3RvcmVpLnhtbClcblxuXHQvLyBWYWx1ZXMgb2YgZW5jb2RpbmcgIT09IFRIUkVFLkxpbmVhckVuY29kaW5nIG9ubHkgc3VwcG9ydGVkIG9uIG1hcCwgZW52TWFwIGFuZCBlbWlzc2l2ZU1hcC5cblx0Ly9cblx0Ly8gQWxzbyBjaGFuZ2luZyB0aGUgZW5jb2RpbmcgYWZ0ZXIgYWxyZWFkeSB1c2VkIGJ5IGEgTWF0ZXJpYWwgd2lsbCBub3QgYXV0b21hdGljYWxseSBtYWtlIHRoZSBNYXRlcmlhbFxuXHQvLyB1cGRhdGUuICBZb3UgbmVlZCB0byBleHBsaWNpdGx5IGNhbGwgTWF0ZXJpYWwubmVlZHNVcGRhdGUgdG8gdHJpZ2dlciBpdCB0byByZWNvbXBpbGUuXG5cdHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZyAhPT0gdW5kZWZpbmVkID8gZW5jb2RpbmcgOiBMaW5lYXJFbmNvZGluZztcblxuXHR0aGlzLnZlcnNpb24gPSAwO1xuXHR0aGlzLm9uVXBkYXRlID0gbnVsbDtcblxufVxuXG5UZXh0dXJlLkRFRkFVTFRfSU1BR0UgPSB1bmRlZmluZWQ7XG5UZXh0dXJlLkRFRkFVTFRfTUFQUElORyA9IFVWTWFwcGluZztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KCBUZXh0dXJlLnByb3RvdHlwZSwgXCJuZWVkc1VwZGF0ZVwiLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKztcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVGV4dHVyZS5wcm90b3R5cGUsIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUsIHtcblxuXHRjb25zdHJ1Y3RvcjogVGV4dHVyZSxcblxuXHRpc1RleHR1cmU6IHRydWUsXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHR0aGlzLmltYWdlID0gc291cmNlLmltYWdlO1xuXHRcdHRoaXMubWlwbWFwcyA9IHNvdXJjZS5taXBtYXBzLnNsaWNlKCAwICk7XG5cblx0XHR0aGlzLm1hcHBpbmcgPSBzb3VyY2UubWFwcGluZztcblxuXHRcdHRoaXMud3JhcFMgPSBzb3VyY2Uud3JhcFM7XG5cdFx0dGhpcy53cmFwVCA9IHNvdXJjZS53cmFwVDtcblxuXHRcdHRoaXMubWFnRmlsdGVyID0gc291cmNlLm1hZ0ZpbHRlcjtcblx0XHR0aGlzLm1pbkZpbHRlciA9IHNvdXJjZS5taW5GaWx0ZXI7XG5cblx0XHR0aGlzLmFuaXNvdHJvcHkgPSBzb3VyY2UuYW5pc290cm9weTtcblxuXHRcdHRoaXMuZm9ybWF0ID0gc291cmNlLmZvcm1hdDtcblx0XHR0aGlzLnR5cGUgPSBzb3VyY2UudHlwZTtcblxuXHRcdHRoaXMub2Zmc2V0LmNvcHkoIHNvdXJjZS5vZmZzZXQgKTtcblx0XHR0aGlzLnJlcGVhdC5jb3B5KCBzb3VyY2UucmVwZWF0ICk7XG5cblx0XHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IHNvdXJjZS5nZW5lcmF0ZU1pcG1hcHM7XG5cdFx0dGhpcy5wcmVtdWx0aXBseUFscGhhID0gc291cmNlLnByZW11bHRpcGx5QWxwaGE7XG5cdFx0dGhpcy5mbGlwWSA9IHNvdXJjZS5mbGlwWTtcblx0XHR0aGlzLnVucGFja0FsaWdubWVudCA9IHNvdXJjZS51bnBhY2tBbGlnbm1lbnQ7XG5cdFx0dGhpcy5lbmNvZGluZyA9IHNvdXJjZS5lbmNvZGluZztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHRpZiAoIG1ldGEudGV4dHVyZXNbIHRoaXMudXVpZCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHJldHVybiBtZXRhLnRleHR1cmVzWyB0aGlzLnV1aWQgXTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdldERhdGFVUkwoIGltYWdlICkge1xuXG5cdFx0XHR2YXIgY2FudmFzO1xuXG5cdFx0XHRpZiAoIGltYWdlLnRvRGF0YVVSTCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNhbnZhcyA9IGltYWdlO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFzJyApO1xuXHRcdFx0XHRjYW52YXMud2lkdGggPSBpbWFnZS53aWR0aDtcblx0XHRcdFx0Y2FudmFzLmhlaWdodCA9IGltYWdlLmhlaWdodDtcblxuXHRcdFx0XHRjYW52YXMuZ2V0Q29udGV4dCggJzJkJyApLmRyYXdJbWFnZSggaW1hZ2UsIDAsIDAsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGNhbnZhcy53aWR0aCA+IDIwNDggfHwgY2FudmFzLmhlaWdodCA+IDIwNDggKSB7XG5cblx0XHRcdFx0cmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoICdpbWFnZS9qcGVnJywgMC42ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoICdpbWFnZS9wbmcnICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBvdXRwdXQgPSB7XG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdUZXh0dXJlJyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnVGV4dHVyZS50b0pTT04nXG5cdFx0XHR9LFxuXG5cdFx0XHR1dWlkOiB0aGlzLnV1aWQsXG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsXG5cblx0XHRcdG1hcHBpbmc6IHRoaXMubWFwcGluZyxcblxuXHRcdFx0cmVwZWF0OiBbIHRoaXMucmVwZWF0LngsIHRoaXMucmVwZWF0LnkgXSxcblx0XHRcdG9mZnNldDogWyB0aGlzLm9mZnNldC54LCB0aGlzLm9mZnNldC55IF0sXG5cdFx0XHR3cmFwOiBbIHRoaXMud3JhcFMsIHRoaXMud3JhcFQgXSxcblxuXHRcdFx0bWluRmlsdGVyOiB0aGlzLm1pbkZpbHRlcixcblx0XHRcdG1hZ0ZpbHRlcjogdGhpcy5tYWdGaWx0ZXIsXG5cdFx0XHRhbmlzb3Ryb3B5OiB0aGlzLmFuaXNvdHJvcHksXG5cblx0XHRcdGZsaXBZOiB0aGlzLmZsaXBZXG5cdFx0fTtcblxuXHRcdGlmICggdGhpcy5pbWFnZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBUT0RPOiBNb3ZlIHRvIFRIUkVFLkltYWdlXG5cblx0XHRcdHZhciBpbWFnZSA9IHRoaXMuaW1hZ2U7XG5cblx0XHRcdGlmICggaW1hZ2UudXVpZCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGltYWdlLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTsgLy8gVUdIXG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBtZXRhLmltYWdlc1sgaW1hZ2UudXVpZCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bWV0YS5pbWFnZXNbIGltYWdlLnV1aWQgXSA9IHtcblx0XHRcdFx0XHR1dWlkOiBpbWFnZS51dWlkLFxuXHRcdFx0XHRcdHVybDogZ2V0RGF0YVVSTCggaW1hZ2UgKVxuXHRcdFx0XHR9O1xuXG5cdFx0XHR9XG5cblx0XHRcdG91dHB1dC5pbWFnZSA9IGltYWdlLnV1aWQ7XG5cblx0XHR9XG5cblx0XHRtZXRhLnRleHR1cmVzWyB0aGlzLnV1aWQgXSA9IG91dHB1dDtcblxuXHRcdHJldHVybiBvdXRwdXQ7XG5cblx0fSxcblxuXHRkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcblxuXHR9LFxuXG5cdHRyYW5zZm9ybVV2OiBmdW5jdGlvbiAoIHV2ICkge1xuXG5cdFx0aWYgKCB0aGlzLm1hcHBpbmcgIT09IFVWTWFwcGluZyApIHJldHVybjtcblxuXHRcdHV2Lm11bHRpcGx5KCB0aGlzLnJlcGVhdCApO1xuXHRcdHV2LmFkZCggdGhpcy5vZmZzZXQgKTtcblxuXHRcdGlmICggdXYueCA8IDAgfHwgdXYueCA+IDEgKSB7XG5cblx0XHRcdHN3aXRjaCAoIHRoaXMud3JhcFMgKSB7XG5cblx0XHRcdFx0Y2FzZSBSZXBlYXRXcmFwcGluZzpcblxuXHRcdFx0XHRcdHV2LnggPSB1di54IC0gTWF0aC5mbG9vciggdXYueCApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgQ2xhbXBUb0VkZ2VXcmFwcGluZzpcblxuXHRcdFx0XHRcdHV2LnggPSB1di54IDwgMCA/IDAgOiAxO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWlycm9yZWRSZXBlYXRXcmFwcGluZzpcblxuXHRcdFx0XHRcdGlmICggTWF0aC5hYnMoIE1hdGguZmxvb3IoIHV2LnggKSAlIDIgKSA9PT0gMSApIHtcblxuXHRcdFx0XHRcdFx0dXYueCA9IE1hdGguY2VpbCggdXYueCApIC0gdXYueDtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHV2LnggPSB1di54IC0gTWF0aC5mbG9vciggdXYueCApO1xuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHV2LnkgPCAwIHx8IHV2LnkgPiAxICkge1xuXG5cdFx0XHRzd2l0Y2ggKCB0aGlzLndyYXBUICkge1xuXG5cdFx0XHRcdGNhc2UgUmVwZWF0V3JhcHBpbmc6XG5cblx0XHRcdFx0XHR1di55ID0gdXYueSAtIE1hdGguZmxvb3IoIHV2LnkgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIENsYW1wVG9FZGdlV3JhcHBpbmc6XG5cblx0XHRcdFx0XHR1di55ID0gdXYueSA8IDAgPyAwIDogMTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmc6XG5cblx0XHRcdFx0XHRpZiAoIE1hdGguYWJzKCBNYXRoLmZsb29yKCB1di55ICkgJSAyICkgPT09IDEgKSB7XG5cblx0XHRcdFx0XHRcdHV2LnkgPSBNYXRoLmNlaWwoIHV2LnkgKSAtIHV2Lnk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHR1di55ID0gdXYueSAtIE1hdGguZmxvb3IoIHV2LnkgKTtcblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmZsaXBZICkge1xuXG5cdFx0XHR1di55ID0gMSAtIHV2Lnk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBzdXBlcmVnZ2JlcnQgLyBodHRwOi8vd3d3LnBhdWxicnVudC5jby51ay9cbiAqIEBhdXRob3IgcGhpbG9nYiAvIGh0dHA6Ly9ibG9nLnRoZWppdC5vcmcvXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBlZ3JhZXRoZXIgLyBodHRwOi8vZWdyYWV0aGVyLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cbmZ1bmN0aW9uIFZlY3RvcjQoIHgsIHksIHosIHcgKSB7XG5cblx0dGhpcy54ID0geCB8fCAwO1xuXHR0aGlzLnkgPSB5IHx8IDA7XG5cdHRoaXMueiA9IHogfHwgMDtcblx0dGhpcy53ID0gKCB3ICE9PSB1bmRlZmluZWQgKSA/IHcgOiAxO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFZlY3RvcjQucHJvdG90eXBlLCB7XG5cblx0aXNWZWN0b3I0OiB0cnVlLFxuXG5cdHNldDogZnVuY3Rpb24gKCB4LCB5LCB6LCB3ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblx0XHR0aGlzLnkgPSB5O1xuXHRcdHRoaXMueiA9IHo7XG5cdFx0dGhpcy53ID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCA9IHNjYWxhcjtcblx0XHR0aGlzLnkgPSBzY2FsYXI7XG5cdFx0dGhpcy56ID0gc2NhbGFyO1xuXHRcdHRoaXMudyA9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WDogZnVuY3Rpb24gKCB4ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WTogZnVuY3Rpb24gKCB5ICkge1xuXG5cdFx0dGhpcy55ID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WjogZnVuY3Rpb24gKCB6ICkge1xuXG5cdFx0dGhpcy56ID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0VzogZnVuY3Rpb24gKCB3ICkge1xuXG5cdFx0dGhpcy53ID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4LCB2YWx1ZSApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHRoaXMueCA9IHZhbHVlOyBicmVhaztcblx0XHRcdGNhc2UgMTogdGhpcy55ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAyOiB0aGlzLnogPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDM6IHRoaXMudyA9IHZhbHVlOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHJldHVybiB0aGlzLng7XG5cdFx0XHRjYXNlIDE6IHJldHVybiB0aGlzLnk7XG5cdFx0XHRjYXNlIDI6IHJldHVybiB0aGlzLno7XG5cdFx0XHRjYXNlIDM6IHJldHVybiB0aGlzLnc7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy54LCB0aGlzLnksIHRoaXMueiwgdGhpcy53ICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSB2Lng7XG5cdFx0dGhpcy55ID0gdi55O1xuXHRcdHRoaXMueiA9IHYuejtcblx0XHR0aGlzLncgPSAoIHYudyAhPT0gdW5kZWZpbmVkICkgPyB2LncgOiAxO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGQ6IGZ1bmN0aW9uICggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3I0OiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuYWRkVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ICs9IHYueDtcblx0XHR0aGlzLnkgKz0gdi55O1xuXHRcdHRoaXMueiArPSB2Lno7XG5cdFx0dGhpcy53ICs9IHYudztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gcztcblx0XHR0aGlzLnkgKz0gcztcblx0XHR0aGlzLnogKz0gcztcblx0XHR0aGlzLncgKz0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54ICsgYi54O1xuXHRcdHRoaXMueSA9IGEueSArIGIueTtcblx0XHR0aGlzLnogPSBhLnogKyBiLno7XG5cdFx0dGhpcy53ID0gYS53ICsgYi53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsZWRWZWN0b3I6IGZ1bmN0aW9uICggdiwgcyApIHtcblxuXHRcdHRoaXMueCArPSB2LnggKiBzO1xuXHRcdHRoaXMueSArPSB2LnkgKiBzO1xuXHRcdHRoaXMueiArPSB2LnogKiBzO1xuXHRcdHRoaXMudyArPSB2LncgKiBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWI6IGZ1bmN0aW9uICggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3I0OiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54IC09IHYueDtcblx0XHR0aGlzLnkgLT0gdi55O1xuXHRcdHRoaXMueiAtPSB2Lno7XG5cdFx0dGhpcy53IC09IHYudztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggLT0gcztcblx0XHR0aGlzLnkgLT0gcztcblx0XHR0aGlzLnogLT0gcztcblx0XHR0aGlzLncgLT0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54IC0gYi54O1xuXHRcdHRoaXMueSA9IGEueSAtIGIueTtcblx0XHR0aGlzLnogPSBhLnogLSBiLno7XG5cdFx0dGhpcy53ID0gYS53IC0gYi53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnggKj0gc2NhbGFyO1xuXHRcdHRoaXMueSAqPSBzY2FsYXI7XG5cdFx0dGhpcy56ICo9IHNjYWxhcjtcblx0XHR0aGlzLncgKj0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56LCB3ID0gdGhpcy53O1xuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgOCBdICogeiArIGVbIDEyIF0gKiB3O1xuXHRcdHRoaXMueSA9IGVbIDEgXSAqIHggKyBlWyA1IF0gKiB5ICsgZVsgOSBdICogeiArIGVbIDEzIF0gKiB3O1xuXHRcdHRoaXMueiA9IGVbIDIgXSAqIHggKyBlWyA2IF0gKiB5ICsgZVsgMTAgXSAqIHogKyBlWyAxNCBdICogdztcblx0XHR0aGlzLncgPSBlWyAzIF0gKiB4ICsgZVsgNyBdICogeSArIGVbIDExIF0gKiB6ICsgZVsgMTUgXSAqIHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpdmlkZVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhciggMSAvIHNjYWxhciApO1xuXG5cdH0sXG5cblx0c2V0QXhpc0FuZ2xlRnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHtcblxuXHRcdC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2dlb21ldHJ5L3JvdGF0aW9ucy9jb252ZXJzaW9ucy9xdWF0ZXJuaW9uVG9BbmdsZS9pbmRleC5odG1cblxuXHRcdC8vIHEgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXG5cblx0XHR0aGlzLncgPSAyICogTWF0aC5hY29zKCBxLncgKTtcblxuXHRcdHZhciBzID0gTWF0aC5zcXJ0KCAxIC0gcS53ICogcS53ICk7XG5cblx0XHRpZiAoIHMgPCAwLjAwMDEgKSB7XG5cblx0XHRcdCB0aGlzLnggPSAxO1xuXHRcdFx0IHRoaXMueSA9IDA7XG5cdFx0XHQgdGhpcy56ID0gMDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdCB0aGlzLnggPSBxLnggLyBzO1xuXHRcdFx0IHRoaXMueSA9IHEueSAvIHM7XG5cdFx0XHQgdGhpcy56ID0gcS56IC8gcztcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0QXhpc0FuZ2xlRnJvbVJvdGF0aW9uTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvbWF0cml4VG9BbmdsZS9pbmRleC5odG1cblxuXHRcdC8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpXG5cblx0XHR2YXIgYW5nbGUsIHgsIHksIHosXHRcdC8vIHZhcmlhYmxlcyBmb3IgcmVzdWx0XG5cdFx0XHRlcHNpbG9uID0gMC4wMSxcdFx0Ly8gbWFyZ2luIHRvIGFsbG93IGZvciByb3VuZGluZyBlcnJvcnNcblx0XHRcdGVwc2lsb24yID0gMC4xLFx0XHQvLyBtYXJnaW4gdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiAwIGFuZCAxODAgZGVncmVlc1xuXG5cdFx0XHR0ZSA9IG0uZWxlbWVudHMsXG5cblx0XHRcdG0xMSA9IHRlWyAwIF0sIG0xMiA9IHRlWyA0IF0sIG0xMyA9IHRlWyA4IF0sXG5cdFx0XHRtMjEgPSB0ZVsgMSBdLCBtMjIgPSB0ZVsgNSBdLCBtMjMgPSB0ZVsgOSBdLFxuXHRcdFx0bTMxID0gdGVbIDIgXSwgbTMyID0gdGVbIDYgXSwgbTMzID0gdGVbIDEwIF07XG5cblx0XHRpZiAoICggTWF0aC5hYnMoIG0xMiAtIG0yMSApIDwgZXBzaWxvbiApICYmXG5cdFx0ICAgICAoIE1hdGguYWJzKCBtMTMgLSBtMzEgKSA8IGVwc2lsb24gKSAmJlxuXHRcdCAgICAgKCBNYXRoLmFicyggbTIzIC0gbTMyICkgPCBlcHNpbG9uICkgKSB7XG5cblx0XHRcdC8vIHNpbmd1bGFyaXR5IGZvdW5kXG5cdFx0XHQvLyBmaXJzdCBjaGVjayBmb3IgaWRlbnRpdHkgbWF0cml4IHdoaWNoIG11c3QgaGF2ZSArMSBmb3IgYWxsIHRlcm1zXG5cdFx0XHQvLyBpbiBsZWFkaW5nIGRpYWdvbmFsIGFuZCB6ZXJvIGluIG90aGVyIHRlcm1zXG5cblx0XHRcdGlmICggKCBNYXRoLmFicyggbTEyICsgbTIxICkgPCBlcHNpbG9uMiApICYmXG5cdFx0XHQgICAgICggTWF0aC5hYnMoIG0xMyArIG0zMSApIDwgZXBzaWxvbjIgKSAmJlxuXHRcdFx0ICAgICAoIE1hdGguYWJzKCBtMjMgKyBtMzIgKSA8IGVwc2lsb24yICkgJiZcblx0XHRcdCAgICAgKCBNYXRoLmFicyggbTExICsgbTIyICsgbTMzIC0gMyApIDwgZXBzaWxvbjIgKSApIHtcblxuXHRcdFx0XHQvLyB0aGlzIHNpbmd1bGFyaXR5IGlzIGlkZW50aXR5IG1hdHJpeCBzbyBhbmdsZSA9IDBcblxuXHRcdFx0XHR0aGlzLnNldCggMSwgMCwgMCwgMCApO1xuXG5cdFx0XHRcdHJldHVybiB0aGlzOyAvLyB6ZXJvIGFuZ2xlLCBhcmJpdHJhcnkgYXhpc1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIG90aGVyd2lzZSB0aGlzIHNpbmd1bGFyaXR5IGlzIGFuZ2xlID0gMTgwXG5cblx0XHRcdGFuZ2xlID0gTWF0aC5QSTtcblxuXHRcdFx0dmFyIHh4ID0gKCBtMTEgKyAxICkgLyAyO1xuXHRcdFx0dmFyIHl5ID0gKCBtMjIgKyAxICkgLyAyO1xuXHRcdFx0dmFyIHp6ID0gKCBtMzMgKyAxICkgLyAyO1xuXHRcdFx0dmFyIHh5ID0gKCBtMTIgKyBtMjEgKSAvIDQ7XG5cdFx0XHR2YXIgeHogPSAoIG0xMyArIG0zMSApIC8gNDtcblx0XHRcdHZhciB5eiA9ICggbTIzICsgbTMyICkgLyA0O1xuXG5cdFx0XHRpZiAoICggeHggPiB5eSApICYmICggeHggPiB6eiApICkge1xuXG5cdFx0XHRcdC8vIG0xMSBpcyB0aGUgbGFyZ2VzdCBkaWFnb25hbCB0ZXJtXG5cblx0XHRcdFx0aWYgKCB4eCA8IGVwc2lsb24gKSB7XG5cblx0XHRcdFx0XHR4ID0gMDtcblx0XHRcdFx0XHR5ID0gMC43MDcxMDY3ODE7XG5cdFx0XHRcdFx0eiA9IDAuNzA3MTA2NzgxO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR4ID0gTWF0aC5zcXJ0KCB4eCApO1xuXHRcdFx0XHRcdHkgPSB4eSAvIHg7XG5cdFx0XHRcdFx0eiA9IHh6IC8geDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIHl5ID4genogKSB7XG5cblx0XHRcdFx0Ly8gbTIyIGlzIHRoZSBsYXJnZXN0IGRpYWdvbmFsIHRlcm1cblxuXHRcdFx0XHRpZiAoIHl5IDwgZXBzaWxvbiApIHtcblxuXHRcdFx0XHRcdHggPSAwLjcwNzEwNjc4MTtcblx0XHRcdFx0XHR5ID0gMDtcblx0XHRcdFx0XHR6ID0gMC43MDcxMDY3ODE7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHkgPSBNYXRoLnNxcnQoIHl5ICk7XG5cdFx0XHRcdFx0eCA9IHh5IC8geTtcblx0XHRcdFx0XHR6ID0geXogLyB5O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBtMzMgaXMgdGhlIGxhcmdlc3QgZGlhZ29uYWwgdGVybSBzbyBiYXNlIHJlc3VsdCBvbiB0aGlzXG5cblx0XHRcdFx0aWYgKCB6eiA8IGVwc2lsb24gKSB7XG5cblx0XHRcdFx0XHR4ID0gMC43MDcxMDY3ODE7XG5cdFx0XHRcdFx0eSA9IDAuNzA3MTA2NzgxO1xuXHRcdFx0XHRcdHogPSAwO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR6ID0gTWF0aC5zcXJ0KCB6eiApO1xuXHRcdFx0XHRcdHggPSB4eiAvIHo7XG5cdFx0XHRcdFx0eSA9IHl6IC8gejtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zZXQoIHgsIHksIHosIGFuZ2xlICk7XG5cblx0XHRcdHJldHVybiB0aGlzOyAvLyByZXR1cm4gMTgwIGRlZyByb3RhdGlvblxuXG5cdFx0fVxuXG5cdFx0Ly8gYXMgd2UgaGF2ZSByZWFjaGVkIGhlcmUgdGhlcmUgYXJlIG5vIHNpbmd1bGFyaXRpZXMgc28gd2UgY2FuIGhhbmRsZSBub3JtYWxseVxuXG5cdFx0dmFyIHMgPSBNYXRoLnNxcnQoICggbTMyIC0gbTIzICkgKiAoIG0zMiAtIG0yMyApICtcblx0XHQgICAgICAgICAgICAgICAgICAgKCBtMTMgLSBtMzEgKSAqICggbTEzIC0gbTMxICkgK1xuXHRcdCAgICAgICAgICAgICAgICAgICAoIG0yMSAtIG0xMiApICogKCBtMjEgLSBtMTIgKSApOyAvLyB1c2VkIHRvIG5vcm1hbGl6ZVxuXG5cdFx0aWYgKCBNYXRoLmFicyggcyApIDwgMC4wMDEgKSBzID0gMTtcblxuXHRcdC8vIHByZXZlbnQgZGl2aWRlIGJ5IHplcm8sIHNob3VsZCBub3QgaGFwcGVuIGlmIG1hdHJpeCBpcyBvcnRob2dvbmFsIGFuZCBzaG91bGQgYmVcblx0XHQvLyBjYXVnaHQgYnkgc2luZ3VsYXJpdHkgdGVzdCBhYm92ZSwgYnV0IEkndmUgbGVmdCBpdCBpbiBqdXN0IGluIGNhc2VcblxuXHRcdHRoaXMueCA9ICggbTMyIC0gbTIzICkgLyBzO1xuXHRcdHRoaXMueSA9ICggbTEzIC0gbTMxICkgLyBzO1xuXHRcdHRoaXMueiA9ICggbTIxIC0gbTEyICkgLyBzO1xuXHRcdHRoaXMudyA9IE1hdGguYWNvcyggKCBtMTEgKyBtMjIgKyBtMzMgLSAxICkgLyAyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1pbjogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5taW4oIHRoaXMueCwgdi54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5taW4oIHRoaXMueSwgdi55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5taW4oIHRoaXMueiwgdi56ICk7XG5cdFx0dGhpcy53ID0gTWF0aC5taW4oIHRoaXMudywgdi53ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1heDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5tYXgoIHRoaXMueCwgdi54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5tYXgoIHRoaXMueSwgdi55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5tYXgoIHRoaXMueiwgdi56ICk7XG5cdFx0dGhpcy53ID0gTWF0aC5tYXgoIHRoaXMudywgdi53ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsYW1wOiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0Ly8gVGhpcyBmdW5jdGlvbiBhc3N1bWVzIG1pbiA8IG1heCwgaWYgdGhpcyBhc3N1bXB0aW9uIGlzbid0IHRydWUgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHlcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCBtaW4ueCwgTWF0aC5taW4oIG1heC54LCB0aGlzLnggKSApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCBtaW4ueSwgTWF0aC5taW4oIG1heC55LCB0aGlzLnkgKSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWF4KCBtaW4ueiwgTWF0aC5taW4oIG1heC56LCB0aGlzLnogKSApO1xuXHRcdHRoaXMudyA9IE1hdGgubWF4KCBtaW4udywgTWF0aC5taW4oIG1heC53LCB0aGlzLncgKSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbGFtcFNjYWxhcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1pbiA9IG5ldyBWZWN0b3I0KCk7XG5cdFx0dmFyIG1heCA9IG5ldyBWZWN0b3I0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2xhbXBTY2FsYXIoIG1pblZhbCwgbWF4VmFsICkge1xuXG5cdFx0XHRtaW4uc2V0KCBtaW5WYWwsIG1pblZhbCwgbWluVmFsLCBtaW5WYWwgKTtcblx0XHRcdG1heC5zZXQoIG1heFZhbCwgbWF4VmFsLCBtYXhWYWwsIG1heFZhbCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5jbGFtcCggbWluLCBtYXggKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGZsb29yOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLmZsb29yKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLmZsb29yKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLmZsb29yKCB0aGlzLnogKTtcblx0XHR0aGlzLncgPSBNYXRoLmZsb29yKCB0aGlzLncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2VpbDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5jZWlsKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLmNlaWwoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9IE1hdGguY2VpbCggdGhpcy56ICk7XG5cdFx0dGhpcy53ID0gTWF0aC5jZWlsKCB0aGlzLncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm91bmQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGgucm91bmQoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGgucm91bmQoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9IE1hdGgucm91bmQoIHRoaXMueiApO1xuXHRcdHRoaXMudyA9IE1hdGgucm91bmQoIHRoaXMudyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3VuZFRvWmVybzogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gKCB0aGlzLnggPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueCApIDogTWF0aC5mbG9vciggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gKCB0aGlzLnkgPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueSApIDogTWF0aC5mbG9vciggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gKCB0aGlzLnogPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueiApIDogTWF0aC5mbG9vciggdGhpcy56ICk7XG5cdFx0dGhpcy53ID0gKCB0aGlzLncgPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMudyApIDogTWF0aC5mbG9vciggdGhpcy53ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG5lZ2F0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gLSB0aGlzLng7XG5cdFx0dGhpcy55ID0gLSB0aGlzLnk7XG5cdFx0dGhpcy56ID0gLSB0aGlzLno7XG5cdFx0dGhpcy53ID0gLSB0aGlzLnc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRvdDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHYueCArIHRoaXMueSAqIHYueSArIHRoaXMueiAqIHYueiArIHRoaXMudyAqIHYudztcblxuXHR9LFxuXG5cdGxlbmd0aFNxOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56ICsgdGhpcy53ICogdGhpcy53O1xuXG5cdH0sXG5cblx0bGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKyB0aGlzLncgKiB0aGlzLncgKTtcblxuXHR9LFxuXG5cdGxlbmd0aE1hbmhhdHRhbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGguYWJzKCB0aGlzLnkgKSArIE1hdGguYWJzKCB0aGlzLnogKSArIE1hdGguYWJzKCB0aGlzLncgKTtcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCB0aGlzLmxlbmd0aCgpICk7XG5cblx0fSxcblxuXHRzZXRMZW5ndGg6IGZ1bmN0aW9uICggbGVuZ3RoICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoIGxlbmd0aCAvIHRoaXMubGVuZ3RoKCkgKTtcblxuXHR9LFxuXG5cdGxlcnA6IGZ1bmN0aW9uICggdiwgYWxwaGEgKSB7XG5cblx0XHR0aGlzLnggKz0gKCB2LnggLSB0aGlzLnggKSAqIGFscGhhO1xuXHRcdHRoaXMueSArPSAoIHYueSAtIHRoaXMueSApICogYWxwaGE7XG5cdFx0dGhpcy56ICs9ICggdi56IC0gdGhpcy56ICkgKiBhbHBoYTtcblx0XHR0aGlzLncgKz0gKCB2LncgLSB0aGlzLncgKSAqIGFscGhhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRsZXJwVmVjdG9yczogZnVuY3Rpb24gKCB2MSwgdjIsIGFscGhhICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdjIsIHYxICkubXVsdGlwbHlTY2FsYXIoIGFscGhhICkuYWRkKCB2MSApO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gKCAoIHYueCA9PT0gdGhpcy54ICkgJiYgKCB2LnkgPT09IHRoaXMueSApICYmICggdi56ID09PSB0aGlzLnogKSAmJiAoIHYudyA9PT0gdGhpcy53ICkgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLnggPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy55ID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblx0XHR0aGlzLnogPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXHRcdHRoaXMudyA9IGFycmF5WyBvZmZzZXQgKyAzIF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLng7XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMueTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy56O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLnc7XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fSxcblxuXHRmcm9tQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTtcblx0XHR0aGlzLnkgPSBhdHRyaWJ1dGUuZ2V0WSggaW5kZXggKTtcblx0XHR0aGlzLnogPSBhdHRyaWJ1dGUuZ2V0WiggaW5kZXggKTtcblx0XHR0aGlzLncgPSBhdHRyaWJ1dGUuZ2V0VyggaW5kZXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3Igc3ppbWVrIC8gaHR0cHM6Ly9naXRodWIuY29tL3N6aW1lay9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIE1hcml1cyBLaW50ZWwgLyBodHRwczovL2dpdGh1Yi5jb20va2ludGVsXG4gKi9cblxuLypcbiBJbiBvcHRpb25zLCB3ZSBjYW4gc3BlY2lmeTpcbiAqIFRleHR1cmUgcGFyYW1ldGVycyBmb3IgYW4gYXV0by1nZW5lcmF0ZWQgdGFyZ2V0IHRleHR1cmVcbiAqIGRlcHRoQnVmZmVyL3N0ZW5jaWxCdWZmZXI6IEJvb2xlYW5zIHRvIGluZGljYXRlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSB0aGVzZSBidWZmZXJzXG4qL1xuZnVuY3Rpb24gV2ViR0xSZW5kZXJUYXJnZXQoIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKSB7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy53aWR0aCA9IHdpZHRoO1xuXHR0aGlzLmhlaWdodCA9IGhlaWdodDtcblxuXHR0aGlzLnNjaXNzb3IgPSBuZXcgVmVjdG9yNCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXHR0aGlzLnNjaXNzb3JUZXN0ID0gZmFsc2U7XG5cblx0dGhpcy52aWV3cG9ydCA9IG5ldyBWZWN0b3I0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cblx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0aWYgKCBvcHRpb25zLm1pbkZpbHRlciA9PT0gdW5kZWZpbmVkICkgb3B0aW9ucy5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7XG5cblx0dGhpcy50ZXh0dXJlID0gbmV3IFRleHR1cmUoIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBvcHRpb25zLndyYXBTLCBvcHRpb25zLndyYXBULCBvcHRpb25zLm1hZ0ZpbHRlciwgb3B0aW9ucy5taW5GaWx0ZXIsIG9wdGlvbnMuZm9ybWF0LCBvcHRpb25zLnR5cGUsIG9wdGlvbnMuYW5pc290cm9weSwgb3B0aW9ucy5lbmNvZGluZyApO1xuXG5cdHRoaXMuZGVwdGhCdWZmZXIgPSBvcHRpb25zLmRlcHRoQnVmZmVyICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmRlcHRoQnVmZmVyIDogdHJ1ZTtcblx0dGhpcy5zdGVuY2lsQnVmZmVyID0gb3B0aW9ucy5zdGVuY2lsQnVmZmVyICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnN0ZW5jaWxCdWZmZXIgOiB0cnVlO1xuXHR0aGlzLmRlcHRoVGV4dHVyZSA9IG9wdGlvbnMuZGVwdGhUZXh0dXJlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmRlcHRoVGV4dHVyZSA6IG51bGw7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggV2ViR0xSZW5kZXJUYXJnZXQucHJvdG90eXBlLCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlLCB7XG5cblx0aXNXZWJHTFJlbmRlclRhcmdldDogdHJ1ZSxcblxuXHRzZXRTaXplOiBmdW5jdGlvbiAoIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRpZiAoIHRoaXMud2lkdGggIT09IHdpZHRoIHx8IHRoaXMuaGVpZ2h0ICE9PSBoZWlnaHQgKSB7XG5cblx0XHRcdHRoaXMud2lkdGggPSB3aWR0aDtcblx0XHRcdHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdFx0XHR0aGlzLmRpc3Bvc2UoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMudmlld3BvcnQuc2V0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cdFx0dGhpcy5zY2lzc29yLnNldCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy53aWR0aCA9IHNvdXJjZS53aWR0aDtcblx0XHR0aGlzLmhlaWdodCA9IHNvdXJjZS5oZWlnaHQ7XG5cblx0XHR0aGlzLnZpZXdwb3J0LmNvcHkoIHNvdXJjZS52aWV3cG9ydCApO1xuXG5cdFx0dGhpcy50ZXh0dXJlID0gc291cmNlLnRleHR1cmUuY2xvbmUoKTtcblxuXHRcdHRoaXMuZGVwdGhCdWZmZXIgPSBzb3VyY2UuZGVwdGhCdWZmZXI7XG5cdFx0dGhpcy5zdGVuY2lsQnVmZmVyID0gc291cmNlLnN0ZW5jaWxCdWZmZXI7XG5cdFx0dGhpcy5kZXB0aFRleHR1cmUgPSBzb3VyY2UuZGVwdGhUZXh0dXJlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJUYXJnZXRDdWJlKCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zICkge1xuXG5cdFdlYkdMUmVuZGVyVGFyZ2V0LmNhbGwoIHRoaXMsIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKTtcblxuXHR0aGlzLmFjdGl2ZUN1YmVGYWNlID0gMDsgLy8gUFggMCwgTlggMSwgUFkgMiwgTlkgMywgUFogNCwgTlogNVxuXHR0aGlzLmFjdGl2ZU1pcE1hcExldmVsID0gMDtcblxufVxuXG5XZWJHTFJlbmRlclRhcmdldEN1YmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggV2ViR0xSZW5kZXJUYXJnZXQucHJvdG90eXBlICk7XG5XZWJHTFJlbmRlclRhcmdldEN1YmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gV2ViR0xSZW5kZXJUYXJnZXRDdWJlO1xuXG5XZWJHTFJlbmRlclRhcmdldEN1YmUucHJvdG90eXBlLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlID0gdHJ1ZTtcblxuLyoqXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICovXG5cbmZ1bmN0aW9uIFF1YXRlcm5pb24oIHgsIHksIHosIHcgKSB7XG5cblx0dGhpcy5feCA9IHggfHwgMDtcblx0dGhpcy5feSA9IHkgfHwgMDtcblx0dGhpcy5feiA9IHogfHwgMDtcblx0dGhpcy5fdyA9ICggdyAhPT0gdW5kZWZpbmVkICkgPyB3IDogMTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBRdWF0ZXJuaW9uLCB7XG5cblx0c2xlcnA6IGZ1bmN0aW9uICggcWEsIHFiLCBxbSwgdCApIHtcblxuXHRcdHJldHVybiBxbS5jb3B5KCBxYSApLnNsZXJwKCBxYiwgdCApO1xuXG5cdH0sXG5cblx0c2xlcnBGbGF0OiBmdW5jdGlvbiAoIGRzdCwgZHN0T2Zmc2V0LCBzcmMwLCBzcmNPZmZzZXQwLCBzcmMxLCBzcmNPZmZzZXQxLCB0ICkge1xuXG5cdFx0Ly8gZnV6ei1mcmVlLCBhcnJheS1iYXNlZCBRdWF0ZXJuaW9uIFNMRVJQIG9wZXJhdGlvblxuXG5cdFx0dmFyIHgwID0gc3JjMFsgc3JjT2Zmc2V0MCArIDAgXSxcblx0XHRcdHkwID0gc3JjMFsgc3JjT2Zmc2V0MCArIDEgXSxcblx0XHRcdHowID0gc3JjMFsgc3JjT2Zmc2V0MCArIDIgXSxcblx0XHRcdHcwID0gc3JjMFsgc3JjT2Zmc2V0MCArIDMgXSxcblxuXHRcdFx0eDEgPSBzcmMxWyBzcmNPZmZzZXQxICsgMCBdLFxuXHRcdFx0eTEgPSBzcmMxWyBzcmNPZmZzZXQxICsgMSBdLFxuXHRcdFx0ejEgPSBzcmMxWyBzcmNPZmZzZXQxICsgMiBdLFxuXHRcdFx0dzEgPSBzcmMxWyBzcmNPZmZzZXQxICsgMyBdO1xuXG5cdFx0aWYgKCB3MCAhPT0gdzEgfHwgeDAgIT09IHgxIHx8IHkwICE9PSB5MSB8fCB6MCAhPT0gejEgKSB7XG5cblx0XHRcdHZhciBzID0gMSAtIHQsXG5cblx0XHRcdFx0Y29zID0geDAgKiB4MSArIHkwICogeTEgKyB6MCAqIHoxICsgdzAgKiB3MSxcblxuXHRcdFx0XHRkaXIgPSAoIGNvcyA+PSAwID8gMSA6IC0gMSApLFxuXHRcdFx0XHRzcXJTaW4gPSAxIC0gY29zICogY29zO1xuXG5cdFx0XHQvLyBTa2lwIHRoZSBTbGVycCBmb3IgdGlueSBzdGVwcyB0byBhdm9pZCBudW1lcmljIHByb2JsZW1zOlxuXHRcdFx0aWYgKCBzcXJTaW4gPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHR2YXIgc2luID0gTWF0aC5zcXJ0KCBzcXJTaW4gKSxcblx0XHRcdFx0XHRsZW4gPSBNYXRoLmF0YW4yKCBzaW4sIGNvcyAqIGRpciApO1xuXG5cdFx0XHRcdHMgPSBNYXRoLnNpbiggcyAqIGxlbiApIC8gc2luO1xuXHRcdFx0XHR0ID0gTWF0aC5zaW4oIHQgKiBsZW4gKSAvIHNpbjtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgdERpciA9IHQgKiBkaXI7XG5cblx0XHRcdHgwID0geDAgKiBzICsgeDEgKiB0RGlyO1xuXHRcdFx0eTAgPSB5MCAqIHMgKyB5MSAqIHREaXI7XG5cdFx0XHR6MCA9IHowICogcyArIHoxICogdERpcjtcblx0XHRcdHcwID0gdzAgKiBzICsgdzEgKiB0RGlyO1xuXG5cdFx0XHQvLyBOb3JtYWxpemUgaW4gY2FzZSB3ZSBqdXN0IGRpZCBhIGxlcnA6XG5cdFx0XHRpZiAoIHMgPT09IDEgLSB0ICkge1xuXG5cdFx0XHRcdHZhciBmID0gMSAvIE1hdGguc3FydCggeDAgKiB4MCArIHkwICogeTAgKyB6MCAqIHowICsgdzAgKiB3MCApO1xuXG5cdFx0XHRcdHgwICo9IGY7XG5cdFx0XHRcdHkwICo9IGY7XG5cdFx0XHRcdHowICo9IGY7XG5cdFx0XHRcdHcwICo9IGY7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGRzdFsgZHN0T2Zmc2V0IF0gPSB4MDtcblx0XHRkc3RbIGRzdE9mZnNldCArIDEgXSA9IHkwO1xuXHRcdGRzdFsgZHN0T2Zmc2V0ICsgMiBdID0gejA7XG5cdFx0ZHN0WyBkc3RPZmZzZXQgKyAzIF0gPSB3MDtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFF1YXRlcm5pb24ucHJvdG90eXBlLCB7XG5cblx0eDoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLl94O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy5feCA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR5OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3k7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl95ID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHo6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fejtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3ogPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dzoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLl93O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy5fdyA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFF1YXRlcm5pb24ucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHksIHosIHcgKSB7XG5cblx0XHR0aGlzLl94ID0geDtcblx0XHR0aGlzLl95ID0geTtcblx0XHR0aGlzLl96ID0gejtcblx0XHR0aGlzLl93ID0gdztcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLl94LCB0aGlzLl95LCB0aGlzLl96LCB0aGlzLl93ICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHF1YXRlcm5pb24gKSB7XG5cblx0XHR0aGlzLl94ID0gcXVhdGVybmlvbi54O1xuXHRcdHRoaXMuX3kgPSBxdWF0ZXJuaW9uLnk7XG5cdFx0dGhpcy5feiA9IHF1YXRlcm5pb24uejtcblx0XHR0aGlzLl93ID0gcXVhdGVybmlvbi53O1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21FdWxlcjogZnVuY3Rpb24gKCBldWxlciwgdXBkYXRlICkge1xuXG5cdFx0aWYgKCAoIGV1bGVyICYmIGV1bGVyLmlzRXVsZXIgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLlF1YXRlcm5pb246IC5zZXRGcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLicgKTtcblxuXHRcdH1cblxuXHRcdHZhciB4ID0gZXVsZXIuX3gsIHkgPSBldWxlci5feSwgeiA9IGV1bGVyLl96LCBvcmRlciA9IGV1bGVyLm9yZGVyO1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5tYXRod29ya3MuY29tL21hdGxhYmNlbnRyYWwvZmlsZWV4Y2hhbmdlL1xuXHRcdC8vIFx0MjA2OTYtZnVuY3Rpb24tdG8tY29udmVydC1iZXR3ZWVuLWRjbS1ldWxlci1hbmdsZXMtcXVhdGVybmlvbnMtYW5kLWV1bGVyLXZlY3RvcnMvXG5cdFx0Ly9cdGNvbnRlbnQvU3BpbkNhbGMubVxuXG5cdFx0dmFyIGNvcyA9IE1hdGguY29zO1xuXHRcdHZhciBzaW4gPSBNYXRoLnNpbjtcblxuXHRcdHZhciBjMSA9IGNvcyggeCAvIDIgKTtcblx0XHR2YXIgYzIgPSBjb3MoIHkgLyAyICk7XG5cdFx0dmFyIGMzID0gY29zKCB6IC8gMiApO1xuXG5cdFx0dmFyIHMxID0gc2luKCB4IC8gMiApO1xuXHRcdHZhciBzMiA9IHNpbiggeSAvIDIgKTtcblx0XHR2YXIgczMgPSBzaW4oIHogLyAyICk7XG5cblx0XHRpZiAoIG9yZGVyID09PSAnWFlaJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMztcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWVhaJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzIC0gczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMztcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWlhZJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMztcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWllYJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzIC0gczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMztcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWVpYJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzIC0gczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMztcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWFpZJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMztcblxuXHRcdH1cblxuXHRcdGlmICggdXBkYXRlICE9PSBmYWxzZSApIHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tQXhpc0FuZ2xlOiBmdW5jdGlvbiAoIGF4aXMsIGFuZ2xlICkge1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL2FuZ2xlVG9RdWF0ZXJuaW9uL2luZGV4Lmh0bVxuXG5cdFx0Ly8gYXNzdW1lcyBheGlzIGlzIG5vcm1hbGl6ZWRcblxuXHRcdHZhciBoYWxmQW5nbGUgPSBhbmdsZSAvIDIsIHMgPSBNYXRoLnNpbiggaGFsZkFuZ2xlICk7XG5cblx0XHR0aGlzLl94ID0gYXhpcy54ICogcztcblx0XHR0aGlzLl95ID0gYXhpcy55ICogcztcblx0XHR0aGlzLl96ID0gYXhpcy56ICogcztcblx0XHR0aGlzLl93ID0gTWF0aC5jb3MoIGhhbGZBbmdsZSApO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Sb3RhdGlvbk1hdHJpeDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL21hdHJpeFRvUXVhdGVybmlvbi9pbmRleC5odG1cblxuXHRcdC8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpXG5cblx0XHR2YXIgdGUgPSBtLmVsZW1lbnRzLFxuXG5cdFx0XHRtMTEgPSB0ZVsgMCBdLCBtMTIgPSB0ZVsgNCBdLCBtMTMgPSB0ZVsgOCBdLFxuXHRcdFx0bTIxID0gdGVbIDEgXSwgbTIyID0gdGVbIDUgXSwgbTIzID0gdGVbIDkgXSxcblx0XHRcdG0zMSA9IHRlWyAyIF0sIG0zMiA9IHRlWyA2IF0sIG0zMyA9IHRlWyAxMCBdLFxuXG5cdFx0XHR0cmFjZSA9IG0xMSArIG0yMiArIG0zMyxcblx0XHRcdHM7XG5cblx0XHRpZiAoIHRyYWNlID4gMCApIHtcblxuXHRcdFx0cyA9IDAuNSAvIE1hdGguc3FydCggdHJhY2UgKyAxLjAgKTtcblxuXHRcdFx0dGhpcy5fdyA9IDAuMjUgLyBzO1xuXHRcdFx0dGhpcy5feCA9ICggbTMyIC0gbTIzICkgKiBzO1xuXHRcdFx0dGhpcy5feSA9ICggbTEzIC0gbTMxICkgKiBzO1xuXHRcdFx0dGhpcy5feiA9ICggbTIxIC0gbTEyICkgKiBzO1xuXG5cdFx0fSBlbHNlIGlmICggbTExID4gbTIyICYmIG0xMSA+IG0zMyApIHtcblxuXHRcdFx0cyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTExIC0gbTIyIC0gbTMzICk7XG5cblx0XHRcdHRoaXMuX3cgPSAoIG0zMiAtIG0yMyApIC8gcztcblx0XHRcdHRoaXMuX3ggPSAwLjI1ICogcztcblx0XHRcdHRoaXMuX3kgPSAoIG0xMiArIG0yMSApIC8gcztcblx0XHRcdHRoaXMuX3ogPSAoIG0xMyArIG0zMSApIC8gcztcblxuXHRcdH0gZWxzZSBpZiAoIG0yMiA+IG0zMyApIHtcblxuXHRcdFx0cyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTIyIC0gbTExIC0gbTMzICk7XG5cblx0XHRcdHRoaXMuX3cgPSAoIG0xMyAtIG0zMSApIC8gcztcblx0XHRcdHRoaXMuX3ggPSAoIG0xMiArIG0yMSApIC8gcztcblx0XHRcdHRoaXMuX3kgPSAwLjI1ICogcztcblx0XHRcdHRoaXMuX3ogPSAoIG0yMyArIG0zMiApIC8gcztcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHMgPSAyLjAgKiBNYXRoLnNxcnQoIDEuMCArIG0zMyAtIG0xMSAtIG0yMiApO1xuXG5cdFx0XHR0aGlzLl93ID0gKCBtMjEgLSBtMTIgKSAvIHM7XG5cdFx0XHR0aGlzLl94ID0gKCBtMTMgKyBtMzEgKSAvIHM7XG5cdFx0XHR0aGlzLl95ID0gKCBtMjMgKyBtMzIgKSAvIHM7XG5cdFx0XHR0aGlzLl96ID0gMC4yNSAqIHM7XG5cblx0XHR9XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVVuaXRWZWN0b3JzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBhc3N1bWVzIGRpcmVjdGlvbiB2ZWN0b3JzIHZGcm9tIGFuZCB2VG8gYXJlIG5vcm1hbGl6ZWRcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHI7XG5cblx0XHR2YXIgRVBTID0gMC4wMDAwMDE7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbVVuaXRWZWN0b3JzKCB2RnJvbSwgdlRvICkge1xuXG5cdFx0XHRpZiAoIHYxID09PSB1bmRlZmluZWQgKSB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdHIgPSB2RnJvbS5kb3QoIHZUbyApICsgMTtcblxuXHRcdFx0aWYgKCByIDwgRVBTICkge1xuXG5cdFx0XHRcdHIgPSAwO1xuXG5cdFx0XHRcdGlmICggTWF0aC5hYnMoIHZGcm9tLnggKSA+IE1hdGguYWJzKCB2RnJvbS56ICkgKSB7XG5cblx0XHRcdFx0XHR2MS5zZXQoIC0gdkZyb20ueSwgdkZyb20ueCwgMCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR2MS5zZXQoIDAsIC0gdkZyb20ueiwgdkZyb20ueSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR2MS5jcm9zc1ZlY3RvcnMoIHZGcm9tLCB2VG8gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl94ID0gdjEueDtcblx0XHRcdHRoaXMuX3kgPSB2MS55O1xuXHRcdFx0dGhpcy5feiA9IHYxLno7XG5cdFx0XHR0aGlzLl93ID0gcjtcblxuXHRcdFx0cmV0dXJuIHRoaXMubm9ybWFsaXplKCk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRpbnZlcnNlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5jb25qdWdhdGUoKS5ub3JtYWxpemUoKTtcblxuXHR9LFxuXG5cdGNvbmp1Z2F0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5feCAqPSAtIDE7XG5cdFx0dGhpcy5feSAqPSAtIDE7XG5cdFx0dGhpcy5feiAqPSAtIDE7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZG90OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5feCAqIHYuX3ggKyB0aGlzLl95ICogdi5feSArIHRoaXMuX3ogKiB2Ll96ICsgdGhpcy5fdyAqIHYuX3c7XG5cblx0fSxcblxuXHRsZW5ndGhTcTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3ggKiB0aGlzLl94ICsgdGhpcy5feSAqIHRoaXMuX3kgKyB0aGlzLl96ICogdGhpcy5feiArIHRoaXMuX3cgKiB0aGlzLl93O1xuXG5cdH0sXG5cblx0bGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLl94ICogdGhpcy5feCArIHRoaXMuX3kgKiB0aGlzLl95ICsgdGhpcy5feiAqIHRoaXMuX3ogKyB0aGlzLl93ICogdGhpcy5fdyApO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbCA9IHRoaXMubGVuZ3RoKCk7XG5cblx0XHRpZiAoIGwgPT09IDAgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSAwO1xuXHRcdFx0dGhpcy5feSA9IDA7XG5cdFx0XHR0aGlzLl96ID0gMDtcblx0XHRcdHRoaXMuX3cgPSAxO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bCA9IDEgLyBsO1xuXG5cdFx0XHR0aGlzLl94ID0gdGhpcy5feCAqIGw7XG5cdFx0XHR0aGlzLl95ID0gdGhpcy5feSAqIGw7XG5cdFx0XHR0aGlzLl96ID0gdGhpcy5feiAqIGw7XG5cdFx0XHR0aGlzLl93ID0gdGhpcy5fdyAqIGw7XG5cblx0XHR9XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggcSwgcCApIHtcblxuXHRcdGlmICggcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseVF1YXRlcm5pb25zKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKCBxLCBwICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKCB0aGlzLCBxICk7XG5cblx0fSxcblxuXHRwcmVtdWx0aXBseTogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyggcSwgdGhpcyApO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlRdWF0ZXJuaW9uczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0Ly8gZnJvbSBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL3JlYWxOb3JtZWRBbGdlYnJhL3F1YXRlcm5pb25zL2NvZGUvaW5kZXguaHRtXG5cblx0XHR2YXIgcWF4ID0gYS5feCwgcWF5ID0gYS5feSwgcWF6ID0gYS5feiwgcWF3ID0gYS5fdztcblx0XHR2YXIgcWJ4ID0gYi5feCwgcWJ5ID0gYi5feSwgcWJ6ID0gYi5feiwgcWJ3ID0gYi5fdztcblxuXHRcdHRoaXMuX3ggPSBxYXggKiBxYncgKyBxYXcgKiBxYnggKyBxYXkgKiBxYnogLSBxYXogKiBxYnk7XG5cdFx0dGhpcy5feSA9IHFheSAqIHFidyArIHFhdyAqIHFieSArIHFheiAqIHFieCAtIHFheCAqIHFiejtcblx0XHR0aGlzLl96ID0gcWF6ICogcWJ3ICsgcWF3ICogcWJ6ICsgcWF4ICogcWJ5IC0gcWF5ICogcWJ4O1xuXHRcdHRoaXMuX3cgPSBxYXcgKiBxYncgLSBxYXggKiBxYnggLSBxYXkgKiBxYnkgLSBxYXogKiBxYno7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2xlcnA6IGZ1bmN0aW9uICggcWIsIHQgKSB7XG5cblx0XHRpZiAoIHQgPT09IDAgKSByZXR1cm4gdGhpcztcblx0XHRpZiAoIHQgPT09IDEgKSByZXR1cm4gdGhpcy5jb3B5KCBxYiApO1xuXG5cdFx0dmFyIHggPSB0aGlzLl94LCB5ID0gdGhpcy5feSwgeiA9IHRoaXMuX3osIHcgPSB0aGlzLl93O1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9yZWFsTm9ybWVkQWxnZWJyYS9xdWF0ZXJuaW9ucy9zbGVycC9cblxuXHRcdHZhciBjb3NIYWxmVGhldGEgPSB3ICogcWIuX3cgKyB4ICogcWIuX3ggKyB5ICogcWIuX3kgKyB6ICogcWIuX3o7XG5cblx0XHRpZiAoIGNvc0hhbGZUaGV0YSA8IDAgKSB7XG5cblx0XHRcdHRoaXMuX3cgPSAtIHFiLl93O1xuXHRcdFx0dGhpcy5feCA9IC0gcWIuX3g7XG5cdFx0XHR0aGlzLl95ID0gLSBxYi5feTtcblx0XHRcdHRoaXMuX3ogPSAtIHFiLl96O1xuXG5cdFx0XHRjb3NIYWxmVGhldGEgPSAtIGNvc0hhbGZUaGV0YTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuY29weSggcWIgKTtcblxuXHRcdH1cblxuXHRcdGlmICggY29zSGFsZlRoZXRhID49IDEuMCApIHtcblxuXHRcdFx0dGhpcy5fdyA9IHc7XG5cdFx0XHR0aGlzLl94ID0geDtcblx0XHRcdHRoaXMuX3kgPSB5O1xuXHRcdFx0dGhpcy5feiA9IHo7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHNpbkhhbGZUaGV0YSA9IE1hdGguc3FydCggMS4wIC0gY29zSGFsZlRoZXRhICogY29zSGFsZlRoZXRhICk7XG5cblx0XHRpZiAoIE1hdGguYWJzKCBzaW5IYWxmVGhldGEgKSA8IDAuMDAxICkge1xuXG5cdFx0XHR0aGlzLl93ID0gMC41ICogKCB3ICsgdGhpcy5fdyApO1xuXHRcdFx0dGhpcy5feCA9IDAuNSAqICggeCArIHRoaXMuX3ggKTtcblx0XHRcdHRoaXMuX3kgPSAwLjUgKiAoIHkgKyB0aGlzLl95ICk7XG5cdFx0XHR0aGlzLl96ID0gMC41ICogKCB6ICsgdGhpcy5feiApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblxuXHRcdHZhciBoYWxmVGhldGEgPSBNYXRoLmF0YW4yKCBzaW5IYWxmVGhldGEsIGNvc0hhbGZUaGV0YSApO1xuXHRcdHZhciByYXRpb0EgPSBNYXRoLnNpbiggKCAxIC0gdCApICogaGFsZlRoZXRhICkgLyBzaW5IYWxmVGhldGEsXG5cdFx0XHRyYXRpb0IgPSBNYXRoLnNpbiggdCAqIGhhbGZUaGV0YSApIC8gc2luSGFsZlRoZXRhO1xuXG5cdFx0dGhpcy5fdyA9ICggdyAqIHJhdGlvQSArIHRoaXMuX3cgKiByYXRpb0IgKTtcblx0XHR0aGlzLl94ID0gKCB4ICogcmF0aW9BICsgdGhpcy5feCAqIHJhdGlvQiApO1xuXHRcdHRoaXMuX3kgPSAoIHkgKiByYXRpb0EgKyB0aGlzLl95ICogcmF0aW9CICk7XG5cdFx0dGhpcy5feiA9ICggeiAqIHJhdGlvQSArIHRoaXMuX3ogKiByYXRpb0IgKTtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggcXVhdGVybmlvbiApIHtcblxuXHRcdHJldHVybiAoIHF1YXRlcm5pb24uX3ggPT09IHRoaXMuX3ggKSAmJiAoIHF1YXRlcm5pb24uX3kgPT09IHRoaXMuX3kgKSAmJiAoIHF1YXRlcm5pb24uX3ogPT09IHRoaXMuX3ogKSAmJiAoIHF1YXRlcm5pb24uX3cgPT09IHRoaXMuX3cgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLl94ID0gYXJyYXlbIG9mZnNldCBdO1xuXHRcdHRoaXMuX3kgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMuX3ogPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXHRcdHRoaXMuX3cgPSBhcnJheVsgb2Zmc2V0ICsgMyBdO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLl94O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLl95O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLl96O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLl93O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0b25DaGFuZ2U6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0b25DaGFuZ2VDYWxsYmFjazogZnVuY3Rpb24gKCkge31cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yICpraWxlIC8gaHR0cDovL2tpbGUuc3RyYXZhZ2FuemEub3JnL1xuICogQGF1dGhvciBwaGlsb2diIC8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGVncmFldGhlciAvIGh0dHA6Ly9lZ3JhZXRoZXIuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gVmVjdG9yMyggeCwgeSwgeiApIHtcblxuXHR0aGlzLnggPSB4IHx8IDA7XG5cdHRoaXMueSA9IHkgfHwgMDtcblx0dGhpcy56ID0geiB8fCAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFZlY3RvcjMucHJvdG90eXBlLCB7XG5cblx0aXNWZWN0b3IzOiB0cnVlLFxuXG5cdHNldDogZnVuY3Rpb24gKCB4LCB5LCB6ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblx0XHR0aGlzLnkgPSB5O1xuXHRcdHRoaXMueiA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnggPSBzY2FsYXI7XG5cdFx0dGhpcy55ID0gc2NhbGFyO1xuXHRcdHRoaXMueiA9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WDogZnVuY3Rpb24gKCB4ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WTogZnVuY3Rpb24gKCB5ICkge1xuXG5cdFx0dGhpcy55ID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WjogZnVuY3Rpb24gKCB6ICkge1xuXG5cdFx0dGhpcy56ID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4LCB2YWx1ZSApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHRoaXMueCA9IHZhbHVlOyBicmVhaztcblx0XHRcdGNhc2UgMTogdGhpcy55ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAyOiB0aGlzLnogPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRzd2l0Y2ggKCBpbmRleCApIHtcblxuXHRcdFx0Y2FzZSAwOiByZXR1cm4gdGhpcy54O1xuXHRcdFx0Y2FzZSAxOiByZXR1cm4gdGhpcy55O1xuXHRcdFx0Y2FzZSAyOiByZXR1cm4gdGhpcy56O1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMueCwgdGhpcy55LCB0aGlzLnogKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IHYueDtcblx0XHR0aGlzLnkgPSB2Lnk7XG5cdFx0dGhpcy56ID0gdi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGQ6IGZ1bmN0aW9uICggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuYWRkVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ICs9IHYueDtcblx0XHR0aGlzLnkgKz0gdi55O1xuXHRcdHRoaXMueiArPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFNjYWxhcjogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0dGhpcy54ICs9IHM7XG5cdFx0dGhpcy55ICs9IHM7XG5cdFx0dGhpcy56ICs9IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFZlY3RvcnM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHRoaXMueCA9IGEueCArIGIueDtcblx0XHR0aGlzLnkgPSBhLnkgKyBiLnk7XG5cdFx0dGhpcy56ID0gYS56ICsgYi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsZWRWZWN0b3I6IGZ1bmN0aW9uICggdiwgcyApIHtcblxuXHRcdHRoaXMueCArPSB2LnggKiBzO1xuXHRcdHRoaXMueSArPSB2LnkgKiBzO1xuXHRcdHRoaXMueiArPSB2LnogKiBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWI6IGZ1bmN0aW9uICggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54IC09IHYueDtcblx0XHR0aGlzLnkgLT0gdi55O1xuXHRcdHRoaXMueiAtPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YlNjYWxhcjogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0dGhpcy54IC09IHM7XG5cdFx0dGhpcy55IC09IHM7XG5cdFx0dGhpcy56IC09IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YlZlY3RvcnM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHRoaXMueCA9IGEueCAtIGIueDtcblx0XHR0aGlzLnkgPSBhLnkgLSBiLnk7XG5cdFx0dGhpcy56ID0gYS56IC0gYi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseTogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5VmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggKj0gdi54O1xuXHRcdHRoaXMueSAqPSB2Lnk7XG5cdFx0dGhpcy56ICo9IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ICo9IHNjYWxhcjtcblx0XHR0aGlzLnkgKj0gc2NhbGFyO1xuXHRcdHRoaXMueiAqPSBzY2FsYXI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5VmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54ICogYi54O1xuXHRcdHRoaXMueSA9IGEueSAqIGIueTtcblx0XHR0aGlzLnogPSBhLnogKiBiLno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5RXVsZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBhcHBseUV1bGVyKCBldWxlciApIHtcblxuXHRcdFx0aWYgKCAoIGV1bGVyICYmIGV1bGVyLmlzRXVsZXIgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlZlY3RvcjM6IC5hcHBseUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4nICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uLnNldEZyb21FdWxlciggZXVsZXIgKSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0YXBwbHlBeGlzQW5nbGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBhcHBseUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRhcHBseU1hdHJpeDM6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56O1xuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyAzIF0gKiB5ICsgZVsgNiBdICogejtcblx0XHR0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDcgXSAqIHo7XG5cdFx0dGhpcy56ID0gZVsgMiBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA4IF0gKiB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56O1xuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgOCBdICAqIHogKyBlWyAxMiBdO1xuXHRcdHRoaXMueSA9IGVbIDEgXSAqIHggKyBlWyA1IF0gKiB5ICsgZVsgOSBdICAqIHogKyBlWyAxMyBdO1xuXHRcdHRoaXMueiA9IGVbIDIgXSAqIHggKyBlWyA2IF0gKiB5ICsgZVsgMTAgXSAqIHogKyBlWyAxNCBdO1xuXHRcdHZhciB3ID0gIGVbIDMgXSAqIHggKyBlWyA3IF0gKiB5ICsgZVsgMTEgXSAqIHogKyBlWyAxNSBdO1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCB3ICk7XG5cblx0fSxcblxuXHRhcHBseVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHtcblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56O1xuXHRcdHZhciBxeCA9IHEueCwgcXkgPSBxLnksIHF6ID0gcS56LCBxdyA9IHEudztcblxuXHRcdC8vIGNhbGN1bGF0ZSBxdWF0ICogdmVjdG9yXG5cblx0XHR2YXIgaXggPSAgcXcgKiB4ICsgcXkgKiB6IC0gcXogKiB5O1xuXHRcdHZhciBpeSA9ICBxdyAqIHkgKyBxeiAqIHggLSBxeCAqIHo7XG5cdFx0dmFyIGl6ID0gIHF3ICogeiArIHF4ICogeSAtIHF5ICogeDtcblx0XHR2YXIgaXcgPSAtIHF4ICogeCAtIHF5ICogeSAtIHF6ICogejtcblxuXHRcdC8vIGNhbGN1bGF0ZSByZXN1bHQgKiBpbnZlcnNlIHF1YXRcblxuXHRcdHRoaXMueCA9IGl4ICogcXcgKyBpdyAqIC0gcXggKyBpeSAqIC0gcXogLSBpeiAqIC0gcXk7XG5cdFx0dGhpcy55ID0gaXkgKiBxdyArIGl3ICogLSBxeSArIGl6ICogLSBxeCAtIGl4ICogLSBxejtcblx0XHR0aGlzLnogPSBpeiAqIHF3ICsgaXcgKiAtIHF6ICsgaXggKiAtIHF5IC0gaXkgKiAtIHF4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRwcm9qZWN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBwcm9qZWN0KCBjYW1lcmEgKSB7XG5cblx0XHRcdG1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCwgbWF0cml4LmdldEludmVyc2UoIGNhbWVyYS5tYXRyaXhXb3JsZCApICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dW5wcm9qZWN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB1bnByb2plY3QoIGNhbWVyYSApIHtcblxuXHRcdFx0bWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5tYXRyaXhXb3JsZCwgbWF0cml4LmdldEludmVyc2UoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICkgKTtcblx0XHRcdHJldHVybiB0aGlzLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0cmFuc2Zvcm1EaXJlY3Rpb246IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdC8vIGlucHV0OiBUSFJFRS5NYXRyaXg0IGFmZmluZSBtYXRyaXhcblx0XHQvLyB2ZWN0b3IgaW50ZXJwcmV0ZWQgYXMgYSBkaXJlY3Rpb25cblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56O1xuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgOCBdICAqIHo7XG5cdFx0dGhpcy55ID0gZVsgMSBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA5IF0gICogejtcblx0XHR0aGlzLnogPSBlWyAyIF0gKiB4ICsgZVsgNiBdICogeSArIGVbIDEwIF0gKiB6O1xuXG5cdFx0cmV0dXJuIHRoaXMubm9ybWFsaXplKCk7XG5cblx0fSxcblxuXHRkaXZpZGU6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCAvPSB2Lng7XG5cdFx0dGhpcy55IC89IHYueTtcblx0XHR0aGlzLnogLz0gdi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXZpZGVTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoIDEgLyBzY2FsYXIgKTtcblxuXHR9LFxuXG5cdG1pbjogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5taW4oIHRoaXMueCwgdi54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5taW4oIHRoaXMueSwgdi55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5taW4oIHRoaXMueiwgdi56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1heDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5tYXgoIHRoaXMueCwgdi54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5tYXgoIHRoaXMueSwgdi55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5tYXgoIHRoaXMueiwgdi56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsYW1wOiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0Ly8gVGhpcyBmdW5jdGlvbiBhc3N1bWVzIG1pbiA8IG1heCwgaWYgdGhpcyBhc3N1bXB0aW9uIGlzbid0IHRydWUgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHlcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCBtaW4ueCwgTWF0aC5taW4oIG1heC54LCB0aGlzLnggKSApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCBtaW4ueSwgTWF0aC5taW4oIG1heC55LCB0aGlzLnkgKSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWF4KCBtaW4ueiwgTWF0aC5taW4oIG1heC56LCB0aGlzLnogKSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbGFtcFNjYWxhcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1pbiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIG1heCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2xhbXBTY2FsYXIoIG1pblZhbCwgbWF4VmFsICkge1xuXG5cdFx0XHRtaW4uc2V0KCBtaW5WYWwsIG1pblZhbCwgbWluVmFsICk7XG5cdFx0XHRtYXguc2V0KCBtYXhWYWwsIG1heFZhbCwgbWF4VmFsICk7XG5cblx0XHRcdHJldHVybiB0aGlzLmNsYW1wKCBtaW4sIG1heCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xhbXBMZW5ndGg6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHR2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGgoKTtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCBsZW5ndGggKSApIC8gbGVuZ3RoICk7XG5cblx0fSxcblxuXHRmbG9vcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5mbG9vciggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5mbG9vciggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5mbG9vciggdGhpcy56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNlaWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguY2VpbCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5jZWlsKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLmNlaWwoIHRoaXMueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3VuZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5yb3VuZCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5yb3VuZCggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5yb3VuZCggdGhpcy56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kVG9aZXJvOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSAoIHRoaXMueCA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy54ICkgOiBNYXRoLmZsb29yKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSAoIHRoaXMueSA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy55ICkgOiBNYXRoLmZsb29yKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSAoIHRoaXMueiA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy56ICkgOiBNYXRoLmZsb29yKCB0aGlzLnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bmVnYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSAtIHRoaXMueDtcblx0XHR0aGlzLnkgPSAtIHRoaXMueTtcblx0XHR0aGlzLnogPSAtIHRoaXMuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZG90OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdi54ICsgdGhpcy55ICogdi55ICsgdGhpcy56ICogdi56O1xuXG5cdH0sXG5cblx0Ly8gVE9ETyBsZW5ndGhTcXVhcmVkP1xuXG5cdGxlbmd0aFNxOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56O1xuXG5cdH0sXG5cblx0bGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKTtcblxuXHR9LFxuXG5cdGxlbmd0aE1hbmhhdHRhbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGguYWJzKCB0aGlzLnkgKSArIE1hdGguYWJzKCB0aGlzLnogKTtcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCB0aGlzLmxlbmd0aCgpICk7XG5cblx0fSxcblxuXHRzZXRMZW5ndGg6IGZ1bmN0aW9uICggbGVuZ3RoICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoIGxlbmd0aCAvIHRoaXMubGVuZ3RoKCkgKTtcblxuXHR9LFxuXG5cdGxlcnA6IGZ1bmN0aW9uICggdiwgYWxwaGEgKSB7XG5cblx0XHR0aGlzLnggKz0gKCB2LnggLSB0aGlzLnggKSAqIGFscGhhO1xuXHRcdHRoaXMueSArPSAoIHYueSAtIHRoaXMueSApICogYWxwaGE7XG5cdFx0dGhpcy56ICs9ICggdi56IC0gdGhpcy56ICkgKiBhbHBoYTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bGVycFZlY3RvcnM6IGZ1bmN0aW9uICggdjEsIHYyLCBhbHBoYSApIHtcblxuXHRcdHJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYyLCB2MSApLm11bHRpcGx5U2NhbGFyKCBhbHBoYSApLmFkZCggdjEgKTtcblxuXHR9LFxuXG5cdGNyb3NzOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmNyb3NzKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuY3Jvc3NWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5jcm9zc1ZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56O1xuXG5cdFx0dGhpcy54ID0geSAqIHYueiAtIHogKiB2Lnk7XG5cdFx0dGhpcy55ID0geiAqIHYueCAtIHggKiB2Lno7XG5cdFx0dGhpcy56ID0geCAqIHYueSAtIHkgKiB2Lng7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNyb3NzVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dmFyIGF4ID0gYS54LCBheSA9IGEueSwgYXogPSBhLno7XG5cdFx0dmFyIGJ4ID0gYi54LCBieSA9IGIueSwgYnogPSBiLno7XG5cblx0XHR0aGlzLnggPSBheSAqIGJ6IC0gYXogKiBieTtcblx0XHR0aGlzLnkgPSBheiAqIGJ4IC0gYXggKiBiejtcblx0XHR0aGlzLnogPSBheCAqIGJ5IC0gYXkgKiBieDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cHJvamVjdE9uVmVjdG9yOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdHZhciBzY2FsYXIgPSB2ZWN0b3IuZG90KCB0aGlzICkgLyB2ZWN0b3IubGVuZ3RoU3EoKTtcblxuXHRcdHJldHVybiB0aGlzLmNvcHkoIHZlY3RvciApLm11bHRpcGx5U2NhbGFyKCBzY2FsYXIgKTtcblxuXHR9LFxuXG5cdHByb2plY3RPblBsYW5lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHByb2plY3RPblBsYW5lKCBwbGFuZU5vcm1hbCApIHtcblxuXHRcdFx0djEuY29weSggdGhpcyApLnByb2plY3RPblZlY3RvciggcGxhbmVOb3JtYWwgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc3ViKCB2MSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cmVmbGVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcmVmbGVjdCBpbmNpZGVudCB2ZWN0b3Igb2ZmIHBsYW5lIG9ydGhvZ29uYWwgdG8gbm9ybWFsXG5cdFx0Ly8gbm9ybWFsIGlzIGFzc3VtZWQgdG8gaGF2ZSB1bml0IGxlbmd0aFxuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByZWZsZWN0KCBub3JtYWwgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnN1YiggdjEuY29weSggbm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIDIgKiB0aGlzLmRvdCggbm9ybWFsICkgKSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0YW5nbGVUbzogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIHRoZXRhID0gdGhpcy5kb3QoIHYgKSAvICggTWF0aC5zcXJ0KCB0aGlzLmxlbmd0aFNxKCkgKiB2Lmxlbmd0aFNxKCkgKSApO1xuXG5cdFx0Ly8gY2xhbXAsIHRvIGhhbmRsZSBudW1lcmljYWwgcHJvYmxlbXNcblxuXHRcdHJldHVybiBNYXRoLmFjb3MoIF9NYXRoLmNsYW1wKCB0aGV0YSwgLSAxLCAxICkgKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG86IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQoIHYgKSApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1NxdWFyZWQ6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHZhciBkeCA9IHRoaXMueCAtIHYueCwgZHkgPSB0aGlzLnkgLSB2LnksIGR6ID0gdGhpcy56IC0gdi56O1xuXG5cdFx0cmV0dXJuIGR4ICogZHggKyBkeSAqIGR5ICsgZHogKiBkejtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9NYW5oYXR0YW46IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54IC0gdi54ICkgKyBNYXRoLmFicyggdGhpcy55IC0gdi55ICkgKyBNYXRoLmFicyggdGhpcy56IC0gdi56ICk7XG5cblx0fSxcblxuXHRzZXRGcm9tU3BoZXJpY2FsOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR2YXIgc2luUGhpUmFkaXVzID0gTWF0aC5zaW4oIHMucGhpICkgKiBzLnJhZGl1cztcblxuXHRcdHRoaXMueCA9IHNpblBoaVJhZGl1cyAqIE1hdGguc2luKCBzLnRoZXRhICk7XG5cdFx0dGhpcy55ID0gTWF0aC5jb3MoIHMucGhpICkgKiBzLnJhZGl1cztcblx0XHR0aGlzLnogPSBzaW5QaGlSYWRpdXMgKiBNYXRoLmNvcyggcy50aGV0YSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tQ3lsaW5kcmljYWw6IGZ1bmN0aW9uICggYyApIHtcblxuXHRcdHRoaXMueCA9IGMucmFkaXVzICogTWF0aC5zaW4oIGMudGhldGEgKTtcblx0XHR0aGlzLnkgPSBjLnk7XG5cdFx0dGhpcy56ID0gYy5yYWRpdXMgKiBNYXRoLmNvcyggYy50aGV0YSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tTWF0cml4UG9zaXRpb246IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHJldHVybiB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDMgKTtcblxuXHR9LFxuXG5cdHNldEZyb21NYXRyaXhTY2FsZTogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHN4ID0gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAwICkubGVuZ3RoKCk7XG5cdFx0dmFyIHN5ID0gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAxICkubGVuZ3RoKCk7XG5cdFx0dmFyIHN6ID0gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAyICkubGVuZ3RoKCk7XG5cblx0XHR0aGlzLnggPSBzeDtcblx0XHR0aGlzLnkgPSBzeTtcblx0XHR0aGlzLnogPSBzejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbU1hdHJpeENvbHVtbjogZnVuY3Rpb24gKCBtLCBpbmRleCApIHtcblxuXG5cdFx0cmV0dXJuIHRoaXMuZnJvbUFycmF5KCBtLmVsZW1lbnRzLCBpbmRleCAqIDQgKTtcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuICggKCB2LnggPT09IHRoaXMueCApICYmICggdi55ID09PSB0aGlzLnkgKSAmJiAoIHYueiA9PT0gdGhpcy56ICkgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLnggPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy55ID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblx0XHR0aGlzLnogPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy54O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLnk7XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuejtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdGZyb21CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCA9IGF0dHJpYnV0ZS5nZXRYKCBpbmRleCApO1xuXHRcdHRoaXMueSA9IGF0dHJpYnV0ZS5nZXRZKCBpbmRleCApO1xuXHRcdHRoaXMueiA9IGF0dHJpYnV0ZS5nZXRaKCBpbmRleCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3Igc3VwZXJlZ2diZXJ0IC8gaHR0cDovL3d3dy5wYXVsYnJ1bnQuY28udWsvXG4gKiBAYXV0aG9yIHBoaWxvZ2IgLyBodHRwOi8vYmxvZy50aGVqaXQub3JnL1xuICogQGF1dGhvciBqb3JkaV9yb3MgLyBodHRwOi8vcGxhdHRzb2Z0LmNvbVxuICogQGF1dGhvciBEMXBsbzFkIC8gaHR0cDovL2dpdGh1Yi5jb20vRDFwbG8xZFxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIHRpbWtuaXAgLyBodHRwOi8vd3d3LmZsb29ycGxhbm5lci5jb20vXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBNYXRyaXg0KCkge1xuXG5cdHRoaXMuZWxlbWVudHMgPSBbXG5cblx0XHQxLCAwLCAwLCAwLFxuXHRcdDAsIDEsIDAsIDAsXG5cdFx0MCwgMCwgMSwgMCxcblx0XHQwLCAwLCAwLCAxXG5cblx0XTtcblxuXHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAwICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IHRoZSBjb25zdHJ1Y3RvciBubyBsb25nZXIgcmVhZHMgYXJndW1lbnRzLiB1c2UgLnNldCgpIGluc3RlYWQuJyApO1xuXG5cdH1cblxufVxuXG5PYmplY3QuYXNzaWduKCBNYXRyaXg0LnByb3RvdHlwZSwge1xuXG5cdGlzTWF0cml4NDogdHJ1ZSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggbjExLCBuMTIsIG4xMywgbjE0LCBuMjEsIG4yMiwgbjIzLCBuMjQsIG4zMSwgbjMyLCBuMzMsIG4zNCwgbjQxLCBuNDIsIG40MywgbjQ0ICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gPSBuMTE7IHRlWyA0IF0gPSBuMTI7IHRlWyA4IF0gPSBuMTM7IHRlWyAxMiBdID0gbjE0O1xuXHRcdHRlWyAxIF0gPSBuMjE7IHRlWyA1IF0gPSBuMjI7IHRlWyA5IF0gPSBuMjM7IHRlWyAxMyBdID0gbjI0O1xuXHRcdHRlWyAyIF0gPSBuMzE7IHRlWyA2IF0gPSBuMzI7IHRlWyAxMCBdID0gbjMzOyB0ZVsgMTQgXSA9IG4zNDtcblx0XHR0ZVsgMyBdID0gbjQxOyB0ZVsgNyBdID0gbjQyOyB0ZVsgMTEgXSA9IG40MzsgdGVbIDE1IF0gPSBuNDQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGlkZW50aXR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0MSwgMCwgMCwgMCxcblx0XHRcdDAsIDEsIDAsIDAsXG5cdFx0XHQwLCAwLCAxLCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgTWF0cml4NCgpLmZyb21BcnJheSggdGhpcy5lbGVtZW50cyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSA9IG1lWyAwIF07IHRlWyAxIF0gPSBtZVsgMSBdOyB0ZVsgMiBdID0gbWVbIDIgXTsgdGVbIDMgXSA9IG1lWyAzIF07XG5cdFx0dGVbIDQgXSA9IG1lWyA0IF07IHRlWyA1IF0gPSBtZVsgNSBdOyB0ZVsgNiBdID0gbWVbIDYgXTsgdGVbIDcgXSA9IG1lWyA3IF07XG5cdFx0dGVbIDggXSA9IG1lWyA4IF07IHRlWyA5IF0gPSBtZVsgOSBdOyB0ZVsgMTAgXSA9IG1lWyAxMCBdOyB0ZVsgMTEgXSA9IG1lWyAxMSBdO1xuXHRcdHRlWyAxMiBdID0gbWVbIDEyIF07IHRlWyAxMyBdID0gbWVbIDEzIF07IHRlWyAxNCBdID0gbWVbIDE0IF07IHRlWyAxNSBdID0gbWVbIDE1IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlQb3NpdGlvbjogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cywgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDEyIF0gPSBtZVsgMTIgXTtcblx0XHR0ZVsgMTMgXSA9IG1lWyAxMyBdO1xuXHRcdHRlWyAxNCBdID0gbWVbIDE0IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGV4dHJhY3RCYXNpczogZnVuY3Rpb24gKCB4QXhpcywgeUF4aXMsIHpBeGlzICkge1xuXG5cdFx0eEF4aXMuc2V0RnJvbU1hdHJpeENvbHVtbiggdGhpcywgMCApO1xuXHRcdHlBeGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIHRoaXMsIDEgKTtcblx0XHR6QXhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VCYXNpczogZnVuY3Rpb24gKCB4QXhpcywgeUF4aXMsIHpBeGlzICkge1xuXG5cdFx0dGhpcy5zZXQoXG5cdFx0XHR4QXhpcy54LCB5QXhpcy54LCB6QXhpcy54LCAwLFxuXHRcdFx0eEF4aXMueSwgeUF4aXMueSwgekF4aXMueSwgMCxcblx0XHRcdHhBeGlzLnosIHlBeGlzLnosIHpBeGlzLnosIDAsXG5cdFx0XHQwLCAgICAgICAwLCAgICAgICAwLCAgICAgICAxXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXh0cmFjdFJvdGF0aW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGV4dHJhY3RSb3RhdGlvbiggbSApIHtcblxuXHRcdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHRcdHZhciBtZSA9IG0uZWxlbWVudHM7XG5cblx0XHRcdHZhciBzY2FsZVggPSAxIC8gdjEuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMCApLmxlbmd0aCgpO1xuXHRcdFx0dmFyIHNjYWxlWSA9IDEgLyB2MS5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAxICkubGVuZ3RoKCk7XG5cdFx0XHR2YXIgc2NhbGVaID0gMSAvIHYxLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDIgKS5sZW5ndGgoKTtcblxuXHRcdFx0dGVbIDAgXSA9IG1lWyAwIF0gKiBzY2FsZVg7XG5cdFx0XHR0ZVsgMSBdID0gbWVbIDEgXSAqIHNjYWxlWDtcblx0XHRcdHRlWyAyIF0gPSBtZVsgMiBdICogc2NhbGVYO1xuXG5cdFx0XHR0ZVsgNCBdID0gbWVbIDQgXSAqIHNjYWxlWTtcblx0XHRcdHRlWyA1IF0gPSBtZVsgNSBdICogc2NhbGVZO1xuXHRcdFx0dGVbIDYgXSA9IG1lWyA2IF0gKiBzY2FsZVk7XG5cblx0XHRcdHRlWyA4IF0gPSBtZVsgOCBdICogc2NhbGVaO1xuXHRcdFx0dGVbIDkgXSA9IG1lWyA5IF0gKiBzY2FsZVo7XG5cdFx0XHR0ZVsgMTAgXSA9IG1lWyAxMCBdICogc2NhbGVaO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdG1ha2VSb3RhdGlvbkZyb21FdWxlcjogZnVuY3Rpb24gKCBldWxlciApIHtcblxuXHRcdGlmICggKCBldWxlciAmJiBldWxlci5pc0V1bGVyICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4OiAubWFrZVJvdGF0aW9uRnJvbUV1bGVyKCkgbm93IGV4cGVjdHMgYSBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLicgKTtcblxuXHRcdH1cblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgeCA9IGV1bGVyLngsIHkgPSBldWxlci55LCB6ID0gZXVsZXIuejtcblx0XHR2YXIgYSA9IE1hdGguY29zKCB4ICksIGIgPSBNYXRoLnNpbiggeCApO1xuXHRcdHZhciBjID0gTWF0aC5jb3MoIHkgKSwgZCA9IE1hdGguc2luKCB5ICk7XG5cdFx0dmFyIGUgPSBNYXRoLmNvcyggeiApLCBmID0gTWF0aC5zaW4oIHogKTtcblxuXHRcdGlmICggZXVsZXIub3JkZXIgPT09ICdYWVonICkge1xuXG5cdFx0XHR2YXIgYWUgPSBhICogZSwgYWYgPSBhICogZiwgYmUgPSBiICogZSwgYmYgPSBiICogZjtcblxuXHRcdFx0dGVbIDAgXSA9IGMgKiBlO1xuXHRcdFx0dGVbIDQgXSA9IC0gYyAqIGY7XG5cdFx0XHR0ZVsgOCBdID0gZDtcblxuXHRcdFx0dGVbIDEgXSA9IGFmICsgYmUgKiBkO1xuXHRcdFx0dGVbIDUgXSA9IGFlIC0gYmYgKiBkO1xuXHRcdFx0dGVbIDkgXSA9IC0gYiAqIGM7XG5cblx0XHRcdHRlWyAyIF0gPSBiZiAtIGFlICogZDtcblx0XHRcdHRlWyA2IF0gPSBiZSArIGFmICogZDtcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XG5cblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1lYWicgKSB7XG5cblx0XHRcdHZhciBjZSA9IGMgKiBlLCBjZiA9IGMgKiBmLCBkZSA9IGQgKiBlLCBkZiA9IGQgKiBmO1xuXG5cdFx0XHR0ZVsgMCBdID0gY2UgKyBkZiAqIGI7XG5cdFx0XHR0ZVsgNCBdID0gZGUgKiBiIC0gY2Y7XG5cdFx0XHR0ZVsgOCBdID0gYSAqIGQ7XG5cblx0XHRcdHRlWyAxIF0gPSBhICogZjtcblx0XHRcdHRlWyA1IF0gPSBhICogZTtcblx0XHRcdHRlWyA5IF0gPSAtIGI7XG5cblx0XHRcdHRlWyAyIF0gPSBjZiAqIGIgLSBkZTtcblx0XHRcdHRlWyA2IF0gPSBkZiArIGNlICogYjtcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XG5cblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1pYWScgKSB7XG5cblx0XHRcdHZhciBjZSA9IGMgKiBlLCBjZiA9IGMgKiBmLCBkZSA9IGQgKiBlLCBkZiA9IGQgKiBmO1xuXG5cdFx0XHR0ZVsgMCBdID0gY2UgLSBkZiAqIGI7XG5cdFx0XHR0ZVsgNCBdID0gLSBhICogZjtcblx0XHRcdHRlWyA4IF0gPSBkZSArIGNmICogYjtcblxuXHRcdFx0dGVbIDEgXSA9IGNmICsgZGUgKiBiO1xuXHRcdFx0dGVbIDUgXSA9IGEgKiBlO1xuXHRcdFx0dGVbIDkgXSA9IGRmIC0gY2UgKiBiO1xuXG5cdFx0XHR0ZVsgMiBdID0gLSBhICogZDtcblx0XHRcdHRlWyA2IF0gPSBiO1xuXHRcdFx0dGVbIDEwIF0gPSBhICogYztcblxuXHRcdH0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWllYJyApIHtcblxuXHRcdFx0dmFyIGFlID0gYSAqIGUsIGFmID0gYSAqIGYsIGJlID0gYiAqIGUsIGJmID0gYiAqIGY7XG5cblx0XHRcdHRlWyAwIF0gPSBjICogZTtcblx0XHRcdHRlWyA0IF0gPSBiZSAqIGQgLSBhZjtcblx0XHRcdHRlWyA4IF0gPSBhZSAqIGQgKyBiZjtcblxuXHRcdFx0dGVbIDEgXSA9IGMgKiBmO1xuXHRcdFx0dGVbIDUgXSA9IGJmICogZCArIGFlO1xuXHRcdFx0dGVbIDkgXSA9IGFmICogZCAtIGJlO1xuXG5cdFx0XHR0ZVsgMiBdID0gLSBkO1xuXHRcdFx0dGVbIDYgXSA9IGIgKiBjO1xuXHRcdFx0dGVbIDEwIF0gPSBhICogYztcblxuXHRcdH0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWVpYJyApIHtcblxuXHRcdFx0dmFyIGFjID0gYSAqIGMsIGFkID0gYSAqIGQsIGJjID0gYiAqIGMsIGJkID0gYiAqIGQ7XG5cblx0XHRcdHRlWyAwIF0gPSBjICogZTtcblx0XHRcdHRlWyA0IF0gPSBiZCAtIGFjICogZjtcblx0XHRcdHRlWyA4IF0gPSBiYyAqIGYgKyBhZDtcblxuXHRcdFx0dGVbIDEgXSA9IGY7XG5cdFx0XHR0ZVsgNSBdID0gYSAqIGU7XG5cdFx0XHR0ZVsgOSBdID0gLSBiICogZTtcblxuXHRcdFx0dGVbIDIgXSA9IC0gZCAqIGU7XG5cdFx0XHR0ZVsgNiBdID0gYWQgKiBmICsgYmM7XG5cdFx0XHR0ZVsgMTAgXSA9IGFjIC0gYmQgKiBmO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdYWlknICkge1xuXG5cdFx0XHR2YXIgYWMgPSBhICogYywgYWQgPSBhICogZCwgYmMgPSBiICogYywgYmQgPSBiICogZDtcblxuXHRcdFx0dGVbIDAgXSA9IGMgKiBlO1xuXHRcdFx0dGVbIDQgXSA9IC0gZjtcblx0XHRcdHRlWyA4IF0gPSBkICogZTtcblxuXHRcdFx0dGVbIDEgXSA9IGFjICogZiArIGJkO1xuXHRcdFx0dGVbIDUgXSA9IGEgKiBlO1xuXHRcdFx0dGVbIDkgXSA9IGFkICogZiAtIGJjO1xuXG5cdFx0XHR0ZVsgMiBdID0gYmMgKiBmIC0gYWQ7XG5cdFx0XHR0ZVsgNiBdID0gYiAqIGU7XG5cdFx0XHR0ZVsgMTAgXSA9IGJkICogZiArIGFjO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbGFzdCBjb2x1bW5cblx0XHR0ZVsgMyBdID0gMDtcblx0XHR0ZVsgNyBdID0gMDtcblx0XHR0ZVsgMTEgXSA9IDA7XG5cblx0XHQvLyBib3R0b20gcm93XG5cdFx0dGVbIDEyIF0gPSAwO1xuXHRcdHRlWyAxMyBdID0gMDtcblx0XHR0ZVsgMTQgXSA9IDA7XG5cdFx0dGVbIDE1IF0gPSAxO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciB4ID0gcS5feCwgeSA9IHEuX3ksIHogPSBxLl96LCB3ID0gcS5fdztcblx0XHR2YXIgeDIgPSB4ICsgeCwgeTIgPSB5ICsgeSwgejIgPSB6ICsgejtcblx0XHR2YXIgeHggPSB4ICogeDIsIHh5ID0geCAqIHkyLCB4eiA9IHggKiB6Mjtcblx0XHR2YXIgeXkgPSB5ICogeTIsIHl6ID0geSAqIHoyLCB6eiA9IHogKiB6Mjtcblx0XHR2YXIgd3ggPSB3ICogeDIsIHd5ID0gdyAqIHkyLCB3eiA9IHcgKiB6MjtcblxuXHRcdHRlWyAwIF0gPSAxIC0gKCB5eSArIHp6ICk7XG5cdFx0dGVbIDQgXSA9IHh5IC0gd3o7XG5cdFx0dGVbIDggXSA9IHh6ICsgd3k7XG5cblx0XHR0ZVsgMSBdID0geHkgKyB3ejtcblx0XHR0ZVsgNSBdID0gMSAtICggeHggKyB6eiApO1xuXHRcdHRlWyA5IF0gPSB5eiAtIHd4O1xuXG5cdFx0dGVbIDIgXSA9IHh6IC0gd3k7XG5cdFx0dGVbIDYgXSA9IHl6ICsgd3g7XG5cdFx0dGVbIDEwIF0gPSAxIC0gKCB4eCArIHl5ICk7XG5cblx0XHQvLyBsYXN0IGNvbHVtblxuXHRcdHRlWyAzIF0gPSAwO1xuXHRcdHRlWyA3IF0gPSAwO1xuXHRcdHRlWyAxMSBdID0gMDtcblxuXHRcdC8vIGJvdHRvbSByb3dcblx0XHR0ZVsgMTIgXSA9IDA7XG5cdFx0dGVbIDEzIF0gPSAwO1xuXHRcdHRlWyAxNCBdID0gMDtcblx0XHR0ZVsgMTUgXSA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxvb2tBdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHggPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB5ID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgeiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gbG9va0F0KCBleWUsIHRhcmdldCwgdXAgKSB7XG5cblx0XHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRcdHouc3ViVmVjdG9ycyggZXllLCB0YXJnZXQgKTtcblxuXHRcdFx0aWYgKCB6Lmxlbmd0aFNxKCkgPT09IDAgKSB7XG5cblx0XHRcdFx0Ly8gZXllIGFuZCB0YXJnZXQgYXJlIGluIHRoZSBzYW1lIHBvc2l0aW9uXG5cblx0XHRcdFx0ei56ID0gMTtcblxuXHRcdFx0fVxuXG5cdFx0XHR6Lm5vcm1hbGl6ZSgpO1xuXHRcdFx0eC5jcm9zc1ZlY3RvcnMoIHVwLCB6ICk7XG5cblx0XHRcdGlmICggeC5sZW5ndGhTcSgpID09PSAwICkge1xuXG5cdFx0XHRcdC8vIGV5ZSBhbmQgdGFyZ2V0IGFyZSBpbiB0aGUgc2FtZSB2ZXJ0aWNhbFxuXG5cdFx0XHRcdHoueiArPSAwLjAwMDE7XG5cdFx0XHRcdHguY3Jvc3NWZWN0b3JzKCB1cCwgeiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHgubm9ybWFsaXplKCk7XG5cdFx0XHR5LmNyb3NzVmVjdG9ycyggeiwgeCApO1xuXG5cdFx0XHR0ZVsgMCBdID0geC54OyB0ZVsgNCBdID0geS54OyB0ZVsgOCBdID0gei54O1xuXHRcdFx0dGVbIDEgXSA9IHgueTsgdGVbIDUgXSA9IHkueTsgdGVbIDkgXSA9IHoueTtcblx0XHRcdHRlWyAyIF0gPSB4Lno7IHRlWyA2IF0gPSB5Lno7IHRlWyAxMCBdID0gei56O1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdG11bHRpcGx5OiBmdW5jdGlvbiAoIG0sIG4gKSB7XG5cblx0XHRpZiAoIG4gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlNYXRyaWNlcyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggbSwgbiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggdGhpcywgbSApO1xuXG5cdH0sXG5cblx0cHJlbXVsdGlwbHk6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIG0sIHRoaXMgKTtcblxuXHR9LFxuXG5cdG11bHRpcGx5TWF0cmljZXM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHZhciBhZSA9IGEuZWxlbWVudHM7XG5cdFx0dmFyIGJlID0gYi5lbGVtZW50cztcblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIGExMSA9IGFlWyAwIF0sIGExMiA9IGFlWyA0IF0sIGExMyA9IGFlWyA4IF0sIGExNCA9IGFlWyAxMiBdO1xuXHRcdHZhciBhMjEgPSBhZVsgMSBdLCBhMjIgPSBhZVsgNSBdLCBhMjMgPSBhZVsgOSBdLCBhMjQgPSBhZVsgMTMgXTtcblx0XHR2YXIgYTMxID0gYWVbIDIgXSwgYTMyID0gYWVbIDYgXSwgYTMzID0gYWVbIDEwIF0sIGEzNCA9IGFlWyAxNCBdO1xuXHRcdHZhciBhNDEgPSBhZVsgMyBdLCBhNDIgPSBhZVsgNyBdLCBhNDMgPSBhZVsgMTEgXSwgYTQ0ID0gYWVbIDE1IF07XG5cblx0XHR2YXIgYjExID0gYmVbIDAgXSwgYjEyID0gYmVbIDQgXSwgYjEzID0gYmVbIDggXSwgYjE0ID0gYmVbIDEyIF07XG5cdFx0dmFyIGIyMSA9IGJlWyAxIF0sIGIyMiA9IGJlWyA1IF0sIGIyMyA9IGJlWyA5IF0sIGIyNCA9IGJlWyAxMyBdO1xuXHRcdHZhciBiMzEgPSBiZVsgMiBdLCBiMzIgPSBiZVsgNiBdLCBiMzMgPSBiZVsgMTAgXSwgYjM0ID0gYmVbIDE0IF07XG5cdFx0dmFyIGI0MSA9IGJlWyAzIF0sIGI0MiA9IGJlWyA3IF0sIGI0MyA9IGJlWyAxMSBdLCBiNDQgPSBiZVsgMTUgXTtcblxuXHRcdHRlWyAwIF0gPSBhMTEgKiBiMTEgKyBhMTIgKiBiMjEgKyBhMTMgKiBiMzEgKyBhMTQgKiBiNDE7XG5cdFx0dGVbIDQgXSA9IGExMSAqIGIxMiArIGExMiAqIGIyMiArIGExMyAqIGIzMiArIGExNCAqIGI0Mjtcblx0XHR0ZVsgOCBdID0gYTExICogYjEzICsgYTEyICogYjIzICsgYTEzICogYjMzICsgYTE0ICogYjQzO1xuXHRcdHRlWyAxMiBdID0gYTExICogYjE0ICsgYTEyICogYjI0ICsgYTEzICogYjM0ICsgYTE0ICogYjQ0O1xuXG5cdFx0dGVbIDEgXSA9IGEyMSAqIGIxMSArIGEyMiAqIGIyMSArIGEyMyAqIGIzMSArIGEyNCAqIGI0MTtcblx0XHR0ZVsgNSBdID0gYTIxICogYjEyICsgYTIyICogYjIyICsgYTIzICogYjMyICsgYTI0ICogYjQyO1xuXHRcdHRlWyA5IF0gPSBhMjEgKiBiMTMgKyBhMjIgKiBiMjMgKyBhMjMgKiBiMzMgKyBhMjQgKiBiNDM7XG5cdFx0dGVbIDEzIF0gPSBhMjEgKiBiMTQgKyBhMjIgKiBiMjQgKyBhMjMgKiBiMzQgKyBhMjQgKiBiNDQ7XG5cblx0XHR0ZVsgMiBdID0gYTMxICogYjExICsgYTMyICogYjIxICsgYTMzICogYjMxICsgYTM0ICogYjQxO1xuXHRcdHRlWyA2IF0gPSBhMzEgKiBiMTIgKyBhMzIgKiBiMjIgKyBhMzMgKiBiMzIgKyBhMzQgKiBiNDI7XG5cdFx0dGVbIDEwIF0gPSBhMzEgKiBiMTMgKyBhMzIgKiBiMjMgKyBhMzMgKiBiMzMgKyBhMzQgKiBiNDM7XG5cdFx0dGVbIDE0IF0gPSBhMzEgKiBiMTQgKyBhMzIgKiBiMjQgKyBhMzMgKiBiMzQgKyBhMzQgKiBiNDQ7XG5cblx0XHR0ZVsgMyBdID0gYTQxICogYjExICsgYTQyICogYjIxICsgYTQzICogYjMxICsgYTQ0ICogYjQxO1xuXHRcdHRlWyA3IF0gPSBhNDEgKiBiMTIgKyBhNDIgKiBiMjIgKyBhNDMgKiBiMzIgKyBhNDQgKiBiNDI7XG5cdFx0dGVbIDExIF0gPSBhNDEgKiBiMTMgKyBhNDIgKiBiMjMgKyBhNDMgKiBiMzMgKyBhNDQgKiBiNDM7XG5cdFx0dGVbIDE1IF0gPSBhNDEgKiBiMTQgKyBhNDIgKiBiMjQgKyBhNDMgKiBiMzQgKyBhNDQgKiBiNDQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSAqPSBzOyB0ZVsgNCBdICo9IHM7IHRlWyA4IF0gKj0gczsgdGVbIDEyIF0gKj0gcztcblx0XHR0ZVsgMSBdICo9IHM7IHRlWyA1IF0gKj0gczsgdGVbIDkgXSAqPSBzOyB0ZVsgMTMgXSAqPSBzO1xuXHRcdHRlWyAyIF0gKj0gczsgdGVbIDYgXSAqPSBzOyB0ZVsgMTAgXSAqPSBzOyB0ZVsgMTQgXSAqPSBzO1xuXHRcdHRlWyAzIF0gKj0gczsgdGVbIDcgXSAqPSBzOyB0ZVsgMTEgXSAqPSBzOyB0ZVsgMTUgXSAqPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseVRvQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gYXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2MS54ID0gYXR0cmlidXRlLmdldFgoIGkgKTtcblx0XHRcdFx0djEueSA9IGF0dHJpYnV0ZS5nZXRZKCBpICk7XG5cdFx0XHRcdHYxLnogPSBhdHRyaWJ1dGUuZ2V0WiggaSApO1xuXG5cdFx0XHRcdHYxLmFwcGx5TWF0cml4NCggdGhpcyApO1xuXG5cdFx0XHRcdGF0dHJpYnV0ZS5zZXRYWVooIGksIHYxLngsIHYxLnksIHYxLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gYXR0cmlidXRlO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0ZGV0ZXJtaW5hbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgbjExID0gdGVbIDAgXSwgbjEyID0gdGVbIDQgXSwgbjEzID0gdGVbIDggXSwgbjE0ID0gdGVbIDEyIF07XG5cdFx0dmFyIG4yMSA9IHRlWyAxIF0sIG4yMiA9IHRlWyA1IF0sIG4yMyA9IHRlWyA5IF0sIG4yNCA9IHRlWyAxMyBdO1xuXHRcdHZhciBuMzEgPSB0ZVsgMiBdLCBuMzIgPSB0ZVsgNiBdLCBuMzMgPSB0ZVsgMTAgXSwgbjM0ID0gdGVbIDE0IF07XG5cdFx0dmFyIG40MSA9IHRlWyAzIF0sIG40MiA9IHRlWyA3IF0sIG40MyA9IHRlWyAxMSBdLCBuNDQgPSB0ZVsgMTUgXTtcblxuXHRcdC8vVE9ETzogbWFrZSB0aGlzIG1vcmUgZWZmaWNpZW50XG5cdFx0Ly8oIGJhc2VkIG9uIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvbWF0cml4L2Z1bmN0aW9ucy9pbnZlcnNlL2ZvdXJEL2luZGV4Lmh0bSApXG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0bjQxICogKFxuXHRcdFx0XHQrIG4xNCAqIG4yMyAqIG4zMlxuXHRcdFx0XHQgLSBuMTMgKiBuMjQgKiBuMzJcblx0XHRcdFx0IC0gbjE0ICogbjIyICogbjMzXG5cdFx0XHRcdCArIG4xMiAqIG4yNCAqIG4zM1xuXHRcdFx0XHQgKyBuMTMgKiBuMjIgKiBuMzRcblx0XHRcdFx0IC0gbjEyICogbjIzICogbjM0XG5cdFx0XHQpICtcblx0XHRcdG40MiAqIChcblx0XHRcdFx0KyBuMTEgKiBuMjMgKiBuMzRcblx0XHRcdFx0IC0gbjExICogbjI0ICogbjMzXG5cdFx0XHRcdCArIG4xNCAqIG4yMSAqIG4zM1xuXHRcdFx0XHQgLSBuMTMgKiBuMjEgKiBuMzRcblx0XHRcdFx0ICsgbjEzICogbjI0ICogbjMxXG5cdFx0XHRcdCAtIG4xNCAqIG4yMyAqIG4zMVxuXHRcdFx0KSArXG5cdFx0XHRuNDMgKiAoXG5cdFx0XHRcdCsgbjExICogbjI0ICogbjMyXG5cdFx0XHRcdCAtIG4xMSAqIG4yMiAqIG4zNFxuXHRcdFx0XHQgLSBuMTQgKiBuMjEgKiBuMzJcblx0XHRcdFx0ICsgbjEyICogbjIxICogbjM0XG5cdFx0XHRcdCArIG4xNCAqIG4yMiAqIG4zMVxuXHRcdFx0XHQgLSBuMTIgKiBuMjQgKiBuMzFcblx0XHRcdCkgK1xuXHRcdFx0bjQ0ICogKFxuXHRcdFx0XHQtIG4xMyAqIG4yMiAqIG4zMVxuXHRcdFx0XHQgLSBuMTEgKiBuMjMgKiBuMzJcblx0XHRcdFx0ICsgbjExICogbjIyICogbjMzXG5cdFx0XHRcdCArIG4xMyAqIG4yMSAqIG4zMlxuXHRcdFx0XHQgLSBuMTIgKiBuMjEgKiBuMzNcblx0XHRcdFx0ICsgbjEyICogbjIzICogbjMxXG5cdFx0XHQpXG5cblx0XHQpO1xuXG5cdH0sXG5cblx0dHJhbnNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciB0bXA7XG5cblx0XHR0bXAgPSB0ZVsgMSBdOyB0ZVsgMSBdID0gdGVbIDQgXTsgdGVbIDQgXSA9IHRtcDtcblx0XHR0bXAgPSB0ZVsgMiBdOyB0ZVsgMiBdID0gdGVbIDggXTsgdGVbIDggXSA9IHRtcDtcblx0XHR0bXAgPSB0ZVsgNiBdOyB0ZVsgNiBdID0gdGVbIDkgXTsgdGVbIDkgXSA9IHRtcDtcblxuXHRcdHRtcCA9IHRlWyAzIF07IHRlWyAzIF0gPSB0ZVsgMTIgXTsgdGVbIDEyIF0gPSB0bXA7XG5cdFx0dG1wID0gdGVbIDcgXTsgdGVbIDcgXSA9IHRlWyAxMyBdOyB0ZVsgMTMgXSA9IHRtcDtcblx0XHR0bXAgPSB0ZVsgMTEgXTsgdGVbIDExIF0gPSB0ZVsgMTQgXTsgdGVbIDE0IF0gPSB0bXA7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFBvc2l0aW9uOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDEyIF0gPSB2Lng7XG5cdFx0dGVbIDEzIF0gPSB2Lnk7XG5cdFx0dGVbIDE0IF0gPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEludmVyc2U6IGZ1bmN0aW9uICggbSwgdGhyb3dPbkRlZ2VuZXJhdGUgKSB7XG5cblx0XHQvLyBiYXNlZCBvbiBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL21hdHJpeC9mdW5jdGlvbnMvaW52ZXJzZS9mb3VyRC9pbmRleC5odG1cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzLFxuXHRcdFx0bWUgPSBtLmVsZW1lbnRzLFxuXG5cdFx0XHRuMTEgPSBtZVsgMCBdLCBuMjEgPSBtZVsgMSBdLCBuMzEgPSBtZVsgMiBdLCBuNDEgPSBtZVsgMyBdLFxuXHRcdFx0bjEyID0gbWVbIDQgXSwgbjIyID0gbWVbIDUgXSwgbjMyID0gbWVbIDYgXSwgbjQyID0gbWVbIDcgXSxcblx0XHRcdG4xMyA9IG1lWyA4IF0sIG4yMyA9IG1lWyA5IF0sIG4zMyA9IG1lWyAxMCBdLCBuNDMgPSBtZVsgMTEgXSxcblx0XHRcdG4xNCA9IG1lWyAxMiBdLCBuMjQgPSBtZVsgMTMgXSwgbjM0ID0gbWVbIDE0IF0sIG40NCA9IG1lWyAxNSBdLFxuXG5cdFx0XHR0MTEgPSBuMjMgKiBuMzQgKiBuNDIgLSBuMjQgKiBuMzMgKiBuNDIgKyBuMjQgKiBuMzIgKiBuNDMgLSBuMjIgKiBuMzQgKiBuNDMgLSBuMjMgKiBuMzIgKiBuNDQgKyBuMjIgKiBuMzMgKiBuNDQsXG5cdFx0XHR0MTIgPSBuMTQgKiBuMzMgKiBuNDIgLSBuMTMgKiBuMzQgKiBuNDIgLSBuMTQgKiBuMzIgKiBuNDMgKyBuMTIgKiBuMzQgKiBuNDMgKyBuMTMgKiBuMzIgKiBuNDQgLSBuMTIgKiBuMzMgKiBuNDQsXG5cdFx0XHR0MTMgPSBuMTMgKiBuMjQgKiBuNDIgLSBuMTQgKiBuMjMgKiBuNDIgKyBuMTQgKiBuMjIgKiBuNDMgLSBuMTIgKiBuMjQgKiBuNDMgLSBuMTMgKiBuMjIgKiBuNDQgKyBuMTIgKiBuMjMgKiBuNDQsXG5cdFx0XHR0MTQgPSBuMTQgKiBuMjMgKiBuMzIgLSBuMTMgKiBuMjQgKiBuMzIgLSBuMTQgKiBuMjIgKiBuMzMgKyBuMTIgKiBuMjQgKiBuMzMgKyBuMTMgKiBuMjIgKiBuMzQgLSBuMTIgKiBuMjMgKiBuMzQ7XG5cblx0XHR2YXIgZGV0ID0gbjExICogdDExICsgbjIxICogdDEyICsgbjMxICogdDEzICsgbjQxICogdDE0O1xuXG5cdFx0aWYgKCBkZXQgPT09IDAgKSB7XG5cblx0XHRcdHZhciBtc2cgPSBcIlRIUkVFLk1hdHJpeDQuZ2V0SW52ZXJzZSgpOiBjYW4ndCBpbnZlcnQgbWF0cml4LCBkZXRlcm1pbmFudCBpcyAwXCI7XG5cblx0XHRcdGlmICggdGhyb3dPbkRlZ2VuZXJhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCBtc2cgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oIG1zZyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLmlkZW50aXR5KCk7XG5cblx0XHR9XG5cblx0XHR2YXIgZGV0SW52ID0gMSAvIGRldDtcblxuXHRcdHRlWyAwIF0gPSB0MTEgKiBkZXRJbnY7XG5cdFx0dGVbIDEgXSA9ICggbjI0ICogbjMzICogbjQxIC0gbjIzICogbjM0ICogbjQxIC0gbjI0ICogbjMxICogbjQzICsgbjIxICogbjM0ICogbjQzICsgbjIzICogbjMxICogbjQ0IC0gbjIxICogbjMzICogbjQ0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDIgXSA9ICggbjIyICogbjM0ICogbjQxIC0gbjI0ICogbjMyICogbjQxICsgbjI0ICogbjMxICogbjQyIC0gbjIxICogbjM0ICogbjQyIC0gbjIyICogbjMxICogbjQ0ICsgbjIxICogbjMyICogbjQ0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDMgXSA9ICggbjIzICogbjMyICogbjQxIC0gbjIyICogbjMzICogbjQxIC0gbjIzICogbjMxICogbjQyICsgbjIxICogbjMzICogbjQyICsgbjIyICogbjMxICogbjQzIC0gbjIxICogbjMyICogbjQzICkgKiBkZXRJbnY7XG5cblx0XHR0ZVsgNCBdID0gdDEyICogZGV0SW52O1xuXHRcdHRlWyA1IF0gPSAoIG4xMyAqIG4zNCAqIG40MSAtIG4xNCAqIG4zMyAqIG40MSArIG4xNCAqIG4zMSAqIG40MyAtIG4xMSAqIG4zNCAqIG40MyAtIG4xMyAqIG4zMSAqIG40NCArIG4xMSAqIG4zMyAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyA2IF0gPSAoIG4xNCAqIG4zMiAqIG40MSAtIG4xMiAqIG4zNCAqIG40MSAtIG4xNCAqIG4zMSAqIG40MiArIG4xMSAqIG4zNCAqIG40MiArIG4xMiAqIG4zMSAqIG40NCAtIG4xMSAqIG4zMiAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyA3IF0gPSAoIG4xMiAqIG4zMyAqIG40MSAtIG4xMyAqIG4zMiAqIG40MSArIG4xMyAqIG4zMSAqIG40MiAtIG4xMSAqIG4zMyAqIG40MiAtIG4xMiAqIG4zMSAqIG40MyArIG4xMSAqIG4zMiAqIG40MyApICogZGV0SW52O1xuXG5cdFx0dGVbIDggXSA9IHQxMyAqIGRldEludjtcblx0XHR0ZVsgOSBdID0gKCBuMTQgKiBuMjMgKiBuNDEgLSBuMTMgKiBuMjQgKiBuNDEgLSBuMTQgKiBuMjEgKiBuNDMgKyBuMTEgKiBuMjQgKiBuNDMgKyBuMTMgKiBuMjEgKiBuNDQgLSBuMTEgKiBuMjMgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgMTAgXSA9ICggbjEyICogbjI0ICogbjQxIC0gbjE0ICogbjIyICogbjQxICsgbjE0ICogbjIxICogbjQyIC0gbjExICogbjI0ICogbjQyIC0gbjEyICogbjIxICogbjQ0ICsgbjExICogbjIyICogbjQ0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDExIF0gPSAoIG4xMyAqIG4yMiAqIG40MSAtIG4xMiAqIG4yMyAqIG40MSAtIG4xMyAqIG4yMSAqIG40MiArIG4xMSAqIG4yMyAqIG40MiArIG4xMiAqIG4yMSAqIG40MyAtIG4xMSAqIG4yMiAqIG40MyApICogZGV0SW52O1xuXG5cdFx0dGVbIDEyIF0gPSB0MTQgKiBkZXRJbnY7XG5cdFx0dGVbIDEzIF0gPSAoIG4xMyAqIG4yNCAqIG4zMSAtIG4xNCAqIG4yMyAqIG4zMSArIG4xNCAqIG4yMSAqIG4zMyAtIG4xMSAqIG4yNCAqIG4zMyAtIG4xMyAqIG4yMSAqIG4zNCArIG4xMSAqIG4yMyAqIG4zNCApICogZGV0SW52O1xuXHRcdHRlWyAxNCBdID0gKCBuMTQgKiBuMjIgKiBuMzEgLSBuMTIgKiBuMjQgKiBuMzEgLSBuMTQgKiBuMjEgKiBuMzIgKyBuMTEgKiBuMjQgKiBuMzIgKyBuMTIgKiBuMjEgKiBuMzQgLSBuMTEgKiBuMjIgKiBuMzQgKSAqIGRldEludjtcblx0XHR0ZVsgMTUgXSA9ICggbjEyICogbjIzICogbjMxIC0gbjEzICogbjIyICogbjMxICsgbjEzICogbjIxICogbjMyIC0gbjExICogbjIzICogbjMyIC0gbjEyICogbjIxICogbjMzICsgbjExICogbjIyICogbjMzICkgKiBkZXRJbnY7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNjYWxlOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciB4ID0gdi54LCB5ID0gdi55LCB6ID0gdi56O1xuXG5cdFx0dGVbIDAgXSAqPSB4OyB0ZVsgNCBdICo9IHk7IHRlWyA4IF0gKj0gejtcblx0XHR0ZVsgMSBdICo9IHg7IHRlWyA1IF0gKj0geTsgdGVbIDkgXSAqPSB6O1xuXHRcdHRlWyAyIF0gKj0geDsgdGVbIDYgXSAqPSB5OyB0ZVsgMTAgXSAqPSB6O1xuXHRcdHRlWyAzIF0gKj0geDsgdGVbIDcgXSAqPSB5OyB0ZVsgMTEgXSAqPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRNYXhTY2FsZU9uQXhpczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciBzY2FsZVhTcSA9IHRlWyAwIF0gKiB0ZVsgMCBdICsgdGVbIDEgXSAqIHRlWyAxIF0gKyB0ZVsgMiBdICogdGVbIDIgXTtcblx0XHR2YXIgc2NhbGVZU3EgPSB0ZVsgNCBdICogdGVbIDQgXSArIHRlWyA1IF0gKiB0ZVsgNSBdICsgdGVbIDYgXSAqIHRlWyA2IF07XG5cdFx0dmFyIHNjYWxlWlNxID0gdGVbIDggXSAqIHRlWyA4IF0gKyB0ZVsgOSBdICogdGVbIDkgXSArIHRlWyAxMCBdICogdGVbIDEwIF07XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCBNYXRoLm1heCggc2NhbGVYU3EsIHNjYWxlWVNxLCBzY2FsZVpTcSApICk7XG5cblx0fSxcblxuXHRtYWtlVHJhbnNsYXRpb246IGZ1bmN0aW9uICggeCwgeSwgeiApIHtcblxuXHRcdHRoaXMuc2V0KFxuXG5cdFx0XHQxLCAwLCAwLCB4LFxuXHRcdFx0MCwgMSwgMCwgeSxcblx0XHRcdDAsIDAsIDEsIHosXG5cdFx0XHQwLCAwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlUm90YXRpb25YOiBmdW5jdGlvbiAoIHRoZXRhICkge1xuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggdGhldGEgKSwgcyA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIDAsICAwLCAwLFxuXHRcdFx0MCwgYywgLSBzLCAwLFxuXHRcdFx0MCwgcywgIGMsIDAsXG5cdFx0XHQwLCAwLCAgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVJvdGF0aW9uWTogZnVuY3Rpb24gKCB0aGV0YSApIHtcblxuXHRcdHZhciBjID0gTWF0aC5jb3MoIHRoZXRhICksIHMgPSBNYXRoLnNpbiggdGhldGEgKTtcblxuXHRcdHRoaXMuc2V0KFxuXG5cdFx0XHQgYywgMCwgcywgMCxcblx0XHRcdCAwLCAxLCAwLCAwLFxuXHRcdFx0LSBzLCAwLCBjLCAwLFxuXHRcdFx0IDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VSb3RhdGlvblo6IGZ1bmN0aW9uICggdGhldGEgKSB7XG5cblx0XHR2YXIgYyA9IE1hdGguY29zKCB0aGV0YSApLCBzID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0YywgLSBzLCAwLCAwLFxuXHRcdFx0cywgIGMsIDAsIDAsXG5cdFx0XHQwLCAgMCwgMSwgMCxcblx0XHRcdDAsICAwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlUm90YXRpb25BeGlzOiBmdW5jdGlvbiAoIGF4aXMsIGFuZ2xlICkge1xuXG5cdFx0Ly8gQmFzZWQgb24gaHR0cDovL3d3dy5nYW1lZGV2Lm5ldC9yZWZlcmVuY2UvYXJ0aWNsZXMvYXJ0aWNsZTExOTkuYXNwXG5cblx0XHR2YXIgYyA9IE1hdGguY29zKCBhbmdsZSApO1xuXHRcdHZhciBzID0gTWF0aC5zaW4oIGFuZ2xlICk7XG5cdFx0dmFyIHQgPSAxIC0gYztcblx0XHR2YXIgeCA9IGF4aXMueCwgeSA9IGF4aXMueSwgeiA9IGF4aXMuejtcblx0XHR2YXIgdHggPSB0ICogeCwgdHkgPSB0ICogeTtcblxuXHRcdHRoaXMuc2V0KFxuXG5cdFx0XHR0eCAqIHggKyBjLCB0eCAqIHkgLSBzICogeiwgdHggKiB6ICsgcyAqIHksIDAsXG5cdFx0XHR0eCAqIHkgKyBzICogeiwgdHkgKiB5ICsgYywgdHkgKiB6IC0gcyAqIHgsIDAsXG5cdFx0XHR0eCAqIHogLSBzICogeSwgdHkgKiB6ICsgcyAqIHgsIHQgKiB6ICogeiArIGMsIDAsXG5cdFx0XHQwLCAwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0IHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVNjYWxlOiBmdW5jdGlvbiAoIHgsIHksIHogKSB7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0eCwgMCwgMCwgMCxcblx0XHRcdDAsIHksIDAsIDAsXG5cdFx0XHQwLCAwLCB6LCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVNoZWFyOiBmdW5jdGlvbiAoIHgsIHksIHogKSB7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0MSwgeSwgeiwgMCxcblx0XHRcdHgsIDEsIHosIDAsXG5cdFx0XHR4LCB5LCAxLCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29tcG9zZTogZnVuY3Rpb24gKCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgc2NhbGUgKSB7XG5cblx0XHR0aGlzLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7XG5cdFx0dGhpcy5zY2FsZSggc2NhbGUgKTtcblx0XHR0aGlzLnNldFBvc2l0aW9uKCBwb3NpdGlvbiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkZWNvbXBvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBtYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGRlY29tcG9zZSggcG9zaXRpb24sIHF1YXRlcm5pb24sIHNjYWxlICkge1xuXG5cdFx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0XHR2YXIgc3ggPSB2ZWN0b3Iuc2V0KCB0ZVsgMCBdLCB0ZVsgMSBdLCB0ZVsgMiBdICkubGVuZ3RoKCk7XG5cdFx0XHR2YXIgc3kgPSB2ZWN0b3Iuc2V0KCB0ZVsgNCBdLCB0ZVsgNSBdLCB0ZVsgNiBdICkubGVuZ3RoKCk7XG5cdFx0XHR2YXIgc3ogPSB2ZWN0b3Iuc2V0KCB0ZVsgOCBdLCB0ZVsgOSBdLCB0ZVsgMTAgXSApLmxlbmd0aCgpO1xuXG5cdFx0XHQvLyBpZiBkZXRlcm1pbmUgaXMgbmVnYXRpdmUsIHdlIG5lZWQgdG8gaW52ZXJ0IG9uZSBzY2FsZVxuXHRcdFx0dmFyIGRldCA9IHRoaXMuZGV0ZXJtaW5hbnQoKTtcblx0XHRcdGlmICggZGV0IDwgMCApIHN4ID0gLSBzeDtcblxuXHRcdFx0cG9zaXRpb24ueCA9IHRlWyAxMiBdO1xuXHRcdFx0cG9zaXRpb24ueSA9IHRlWyAxMyBdO1xuXHRcdFx0cG9zaXRpb24ueiA9IHRlWyAxNCBdO1xuXG5cdFx0XHQvLyBzY2FsZSB0aGUgcm90YXRpb24gcGFydFxuXHRcdFx0bWF0cml4LmNvcHkoIHRoaXMgKTtcblxuXHRcdFx0dmFyIGludlNYID0gMSAvIHN4O1xuXHRcdFx0dmFyIGludlNZID0gMSAvIHN5O1xuXHRcdFx0dmFyIGludlNaID0gMSAvIHN6O1xuXG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDAgXSAqPSBpbnZTWDtcblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgMSBdICo9IGludlNYO1xuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyAyIF0gKj0gaW52U1g7XG5cblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgNCBdICo9IGludlNZO1xuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyA1IF0gKj0gaW52U1k7XG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDYgXSAqPSBpbnZTWTtcblxuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyA4IF0gKj0gaW52U1o7XG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDkgXSAqPSBpbnZTWjtcblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgMTAgXSAqPSBpbnZTWjtcblxuXHRcdFx0cXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoIG1hdHJpeCApO1xuXG5cdFx0XHRzY2FsZS54ID0gc3g7XG5cdFx0XHRzY2FsZS55ID0gc3k7XG5cdFx0XHRzY2FsZS56ID0gc3o7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0bWFrZVBlcnNwZWN0aXZlOiBmdW5jdGlvbiAoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICkge1xuXG5cdFx0aWYgKCBmYXIgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm1ha2VQZXJzcGVjdGl2ZSgpIGhhcyBiZWVuIHJlZGVmaW5lZCBhbmQgaGFzIGEgbmV3IHNpZ25hdHVyZS4gUGxlYXNlIGNoZWNrIHRoZSBkb2NzLicgKTtcblxuXHRcdH1cblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIHggPSAyICogbmVhciAvICggcmlnaHQgLSBsZWZ0ICk7XG5cdFx0dmFyIHkgPSAyICogbmVhciAvICggdG9wIC0gYm90dG9tICk7XG5cblx0XHR2YXIgYSA9ICggcmlnaHQgKyBsZWZ0ICkgLyAoIHJpZ2h0IC0gbGVmdCApO1xuXHRcdHZhciBiID0gKCB0b3AgKyBib3R0b20gKSAvICggdG9wIC0gYm90dG9tICk7XG5cdFx0dmFyIGMgPSAtICggZmFyICsgbmVhciApIC8gKCBmYXIgLSBuZWFyICk7XG5cdFx0dmFyIGQgPSAtIDIgKiBmYXIgKiBuZWFyIC8gKCBmYXIgLSBuZWFyICk7XG5cblx0XHR0ZVsgMCBdID0geDtcdHRlWyA0IF0gPSAwO1x0dGVbIDggXSA9IGE7XHR0ZVsgMTIgXSA9IDA7XG5cdFx0dGVbIDEgXSA9IDA7XHR0ZVsgNSBdID0geTtcdHRlWyA5IF0gPSBiO1x0dGVbIDEzIF0gPSAwO1xuXHRcdHRlWyAyIF0gPSAwO1x0dGVbIDYgXSA9IDA7XHR0ZVsgMTAgXSA9IGM7XHR0ZVsgMTQgXSA9IGQ7XG5cdFx0dGVbIDMgXSA9IDA7XHR0ZVsgNyBdID0gMDtcdHRlWyAxMSBdID0gLSAxO1x0dGVbIDE1IF0gPSAwO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlT3J0aG9ncmFwaGljOiBmdW5jdGlvbiAoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgdyA9IDEuMCAvICggcmlnaHQgLSBsZWZ0ICk7XG5cdFx0dmFyIGggPSAxLjAgLyAoIHRvcCAtIGJvdHRvbSApO1xuXHRcdHZhciBwID0gMS4wIC8gKCBmYXIgLSBuZWFyICk7XG5cblx0XHR2YXIgeCA9ICggcmlnaHQgKyBsZWZ0ICkgKiB3O1xuXHRcdHZhciB5ID0gKCB0b3AgKyBib3R0b20gKSAqIGg7XG5cdFx0dmFyIHogPSAoIGZhciArIG5lYXIgKSAqIHA7XG5cblx0XHR0ZVsgMCBdID0gMiAqIHc7XHR0ZVsgNCBdID0gMDtcdHRlWyA4IF0gPSAwO1x0dGVbIDEyIF0gPSAtIHg7XG5cdFx0dGVbIDEgXSA9IDA7XHR0ZVsgNSBdID0gMiAqIGg7XHR0ZVsgOSBdID0gMDtcdHRlWyAxMyBdID0gLSB5O1xuXHRcdHRlWyAyIF0gPSAwO1x0dGVbIDYgXSA9IDA7XHR0ZVsgMTAgXSA9IC0gMiAqIHA7XHR0ZVsgMTQgXSA9IC0gejtcblx0XHR0ZVsgMyBdID0gMDtcdHRlWyA3IF0gPSAwO1x0dGVbIDExIF0gPSAwO1x0dGVbIDE1IF0gPSAxO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgbWUgPSBtYXRyaXguZWxlbWVudHM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCAxNjsgaSArKyApIHtcblxuXHRcdFx0aWYgKCB0ZVsgaSBdICE9PSBtZVsgaSBdICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fSxcblxuXHRmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgMTY7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZWxlbWVudHNbIGkgXSA9IGFycmF5WyBpICsgb2Zmc2V0IF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGVbIDAgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGVbIDEgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGVbIDIgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGVbIDMgXTtcblxuXHRcdGFycmF5WyBvZmZzZXQgKyA0IF0gPSB0ZVsgNCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA1IF0gPSB0ZVsgNSBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA2IF0gPSB0ZVsgNiBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA3IF0gPSB0ZVsgNyBdO1xuXG5cdFx0YXJyYXlbIG9mZnNldCArIDggXSA9IHRlWyA4IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDkgXSA9IHRlWyA5IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDEwIF0gPSB0ZVsgMTAgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTEgXSA9IHRlWyAxMSBdO1xuXG5cdFx0YXJyYXlbIG9mZnNldCArIDEyIF0gPSB0ZVsgMTIgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTMgXSA9IHRlWyAxMyBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxNCBdID0gdGVbIDE0IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDE1IF0gPSB0ZVsgMTUgXTtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIERhdGFUZXh0dXJlKCBkYXRhLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGFuaXNvdHJvcHksIGVuY29kaW5nICkge1xuXG5cdFRleHR1cmUuY2FsbCggdGhpcywgbnVsbCwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApO1xuXG5cdHRoaXMuaW1hZ2UgPSB7IGRhdGE6IGRhdGEsIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcblxuXHR0aGlzLm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWFnRmlsdGVyIDogTmVhcmVzdEZpbHRlcjtcblx0dGhpcy5taW5GaWx0ZXIgPSBtaW5GaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1pbkZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7XG5cblx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblx0dGhpcy5mbGlwWSA9IGZhbHNlO1xuXHR0aGlzLnVucGFja0FsaWdubWVudCA9IDE7XG5cbn1cblxuRGF0YVRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkRhdGFUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERhdGFUZXh0dXJlO1xuXG5EYXRhVGV4dHVyZS5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZSA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBDdWJlVGV4dHVyZSggaW1hZ2VzLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICkge1xuXG5cdGltYWdlcyA9IGltYWdlcyAhPT0gdW5kZWZpbmVkID8gaW1hZ2VzIDogW107XG5cdG1hcHBpbmcgPSBtYXBwaW5nICE9PSB1bmRlZmluZWQgPyBtYXBwaW5nIDogQ3ViZVJlZmxlY3Rpb25NYXBwaW5nO1xuXG5cdFRleHR1cmUuY2FsbCggdGhpcywgaW1hZ2VzLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICk7XG5cblx0dGhpcy5mbGlwWSA9IGZhbHNlO1xuXG59XG5cbkN1YmVUZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7XG5DdWJlVGV4dHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDdWJlVGV4dHVyZTtcblxuQ3ViZVRleHR1cmUucHJvdG90eXBlLmlzQ3ViZVRleHR1cmUgPSB0cnVlO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoIEN1YmVUZXh0dXJlLnByb3RvdHlwZSwgJ2ltYWdlcycsIHtcblxuXHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmltYWdlO1xuXG5cdH0sXG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5pbWFnZSA9IHZhbHVlO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgdHNjaHdcbiAqXG4gKiBVbmlmb3JtcyBvZiBhIHByb2dyYW0uXG4gKiBUaG9zZSBmb3JtIGEgdHJlZSBzdHJ1Y3R1cmUgd2l0aCBhIHNwZWNpYWwgdG9wLWxldmVsIGNvbnRhaW5lciBmb3IgdGhlIHJvb3QsXG4gKiB3aGljaCB5b3UgZ2V0IGJ5IGNhbGxpbmcgJ25ldyBXZWJHTFVuaWZvcm1zKCBnbCwgcHJvZ3JhbSwgcmVuZGVyZXIgKScuXG4gKlxuICpcbiAqIFByb3BlcnRpZXMgb2YgaW5uZXIgbm9kZXMgaW5jbHVkaW5nIHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyOlxuICpcbiAqIC5zZXEgLSBhcnJheSBvZiBuZXN0ZWQgdW5pZm9ybXNcbiAqIC5tYXAgLSBuZXN0ZWQgdW5pZm9ybXMgYnkgbmFtZVxuICpcbiAqXG4gKiBNZXRob2RzIG9mIGFsbCBub2RlcyBleGNlcHQgdGhlIHRvcC1sZXZlbCBjb250YWluZXI6XG4gKlxuICogLnNldFZhbHVlKCBnbCwgdmFsdWUsIFtyZW5kZXJlcl0gKVxuICpcbiAqIFx0XHR1cGxvYWRzIGEgdW5pZm9ybSB2YWx1ZShzKVxuICogIFx0dGhlICdyZW5kZXJlcicgcGFyYW1ldGVyIGlzIG5lZWRlZCBmb3Igc2FtcGxlciB1bmlmb3Jtc1xuICpcbiAqXG4gKiBTdGF0aWMgbWV0aG9kcyBvZiB0aGUgdG9wLWxldmVsIGNvbnRhaW5lciAocmVuZGVyZXIgZmFjdG9yaXphdGlvbnMpOlxuICpcbiAqIC51cGxvYWQoIGdsLCBzZXEsIHZhbHVlcywgcmVuZGVyZXIgKVxuICpcbiAqIFx0XHRzZXRzIHVuaWZvcm1zIGluICdzZXEnIHRvICd2YWx1ZXNbaWRdLnZhbHVlJ1xuICpcbiAqIC5zZXFXaXRoVmFsdWUoIHNlcSwgdmFsdWVzICkgOiBmaWx0ZXJlZFNlcVxuICpcbiAqIFx0XHRmaWx0ZXJzICdzZXEnIGVudHJpZXMgd2l0aCBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHZhbHVlc1xuICpcbiAqXG4gKiBNZXRob2RzIG9mIHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyIChyZW5kZXJlciBmYWN0b3JpemF0aW9ucyk6XG4gKlxuICogLnNldFZhbHVlKCBnbCwgbmFtZSwgdmFsdWUgKVxuICpcbiAqIFx0XHRzZXRzIHVuaWZvcm0gd2l0aCAgbmFtZSAnbmFtZScgdG8gJ3ZhbHVlJ1xuICpcbiAqIC5zZXQoIGdsLCBvYmosIHByb3AgKVxuICpcbiAqIFx0XHRzZXRzIHVuaWZvcm0gZnJvbSBvYmplY3QgYW5kIHByb3BlcnR5IHdpdGggc2FtZSBuYW1lIHRoYW4gdW5pZm9ybVxuICpcbiAqIC5zZXRPcHRpb25hbCggZ2wsIG9iaiwgcHJvcCApXG4gKlxuICogXHRcdGxpa2UgLnNldCBmb3IgYW4gb3B0aW9uYWwgcHJvcGVydHkgb2YgdGhlIG9iamVjdFxuICpcbiAqL1xuXG52YXIgZW1wdHlUZXh0dXJlID0gbmV3IFRleHR1cmUoKTtcbnZhciBlbXB0eUN1YmVUZXh0dXJlID0gbmV3IEN1YmVUZXh0dXJlKCk7XG5cbi8vIC0tLSBCYXNlIGZvciBpbm5lciBub2RlcyAoaW5jbHVkaW5nIHRoZSByb290KSAtLS1cblxuZnVuY3Rpb24gVW5pZm9ybUNvbnRhaW5lcigpIHtcblxuXHR0aGlzLnNlcSA9IFtdO1xuXHR0aGlzLm1hcCA9IHt9O1xuXG59XG5cbi8vIC0tLSBVdGlsaXRpZXMgLS0tXG5cbi8vIEFycmF5IENhY2hlcyAocHJvdmlkZSB0eXBlZCBhcnJheXMgZm9yIHRlbXBvcmFyeSBieSBzaXplKVxuXG52YXIgYXJyYXlDYWNoZUYzMiA9IFtdO1xudmFyIGFycmF5Q2FjaGVJMzIgPSBbXTtcblxuLy8gRmxvYXQzMkFycmF5IGNhY2hlcyB1c2VkIGZvciB1cGxvYWRpbmcgTWF0cml4IHVuaWZvcm1zXG5cbnZhciBtYXQ0YXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCAxNiApO1xudmFyIG1hdDNhcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIDkgKTtcblxuLy8gRmxhdHRlbmluZyBmb3IgYXJyYXlzIG9mIHZlY3RvcnMgYW5kIG1hdHJpY2VzXG5cbmZ1bmN0aW9uIGZsYXR0ZW4oIGFycmF5LCBuQmxvY2tzLCBibG9ja1NpemUgKSB7XG5cblx0dmFyIGZpcnN0RWxlbSA9IGFycmF5WyAwIF07XG5cblx0aWYgKCBmaXJzdEVsZW0gPD0gMCB8fCBmaXJzdEVsZW0gPiAwICkgcmV0dXJuIGFycmF5O1xuXHQvLyB1bm9wdGltaXplZDogISBpc05hTiggZmlyc3RFbGVtIClcblx0Ly8gc2VlIGh0dHA6Ly9qYWNrc29uZHVuc3Rhbi5jb20vYXJ0aWNsZXMvOTgzXG5cblx0dmFyIG4gPSBuQmxvY2tzICogYmxvY2tTaXplLFxuXHRcdHIgPSBhcnJheUNhY2hlRjMyWyBuIF07XG5cblx0aWYgKCByID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRyID0gbmV3IEZsb2F0MzJBcnJheSggbiApO1xuXHRcdGFycmF5Q2FjaGVGMzJbIG4gXSA9IHI7XG5cblx0fVxuXG5cdGlmICggbkJsb2NrcyAhPT0gMCApIHtcblxuXHRcdGZpcnN0RWxlbS50b0FycmF5KCByLCAwICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDEsIG9mZnNldCA9IDA7IGkgIT09IG5CbG9ja3M7ICsrIGkgKSB7XG5cblx0XHRcdG9mZnNldCArPSBibG9ja1NpemU7XG5cdFx0XHRhcnJheVsgaSBdLnRvQXJyYXkoIHIsIG9mZnNldCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4gcjtcblxufVxuXG4vLyBUZXh0dXJlIHVuaXQgYWxsb2NhdGlvblxuXG5mdW5jdGlvbiBhbGxvY1RleFVuaXRzKCByZW5kZXJlciwgbiApIHtcblxuXHR2YXIgciA9IGFycmF5Q2FjaGVJMzJbIG4gXTtcblxuXHRpZiAoIHIgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdHIgPSBuZXcgSW50MzJBcnJheSggbiApO1xuXHRcdGFycmF5Q2FjaGVJMzJbIG4gXSA9IHI7XG5cblx0fVxuXG5cdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbjsgKysgaSApXG5cdFx0clsgaSBdID0gcmVuZGVyZXIuYWxsb2NUZXh0dXJlVW5pdCgpO1xuXG5cdHJldHVybiByO1xuXG59XG5cbi8vIC0tLSBTZXR0ZXJzIC0tLVxuXG4vLyBOb3RlOiBEZWZpbmluZyB0aGVzZSBtZXRob2RzIGV4dGVybmFsbHksIGJlY2F1c2UgdGhleSBjb21lIGluIGEgYnVuY2hcbi8vIGFuZCB0aGlzIHdheSB0aGVpciBuYW1lcyBtaW5pZnkuXG5cbi8vIFNpbmdsZSBzY2FsYXJcblxuZnVuY3Rpb24gc2V0VmFsdWUxZiggZ2wsIHYgKSB7IGdsLnVuaWZvcm0xZiggdGhpcy5hZGRyLCB2ICk7IH1cbmZ1bmN0aW9uIHNldFZhbHVlMWkoIGdsLCB2ICkgeyBnbC51bmlmb3JtMWkoIHRoaXMuYWRkciwgdiApOyB9XG5cbi8vIFNpbmdsZSBmbG9hdCB2ZWN0b3IgKGZyb20gZmxhdCBhcnJheSBvciBUSFJFRS5WZWN0b3JOKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTJmdiggZ2wsIHYgKSB7XG5cblx0aWYgKCB2LnggPT09IHVuZGVmaW5lZCApIGdsLnVuaWZvcm0yZnYoIHRoaXMuYWRkciwgdiApO1xuXHRlbHNlIGdsLnVuaWZvcm0yZiggdGhpcy5hZGRyLCB2LngsIHYueSApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlM2Z2KCBnbCwgdiApIHtcblxuXHRpZiAoIHYueCAhPT0gdW5kZWZpbmVkIClcblx0XHRnbC51bmlmb3JtM2YoIHRoaXMuYWRkciwgdi54LCB2LnksIHYueiApO1xuXHRlbHNlIGlmICggdi5yICE9PSB1bmRlZmluZWQgKVxuXHRcdGdsLnVuaWZvcm0zZiggdGhpcy5hZGRyLCB2LnIsIHYuZywgdi5iICk7XG5cdGVsc2Vcblx0XHRnbC51bmlmb3JtM2Z2KCB0aGlzLmFkZHIsIHYgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTRmdiggZ2wsIHYgKSB7XG5cblx0aWYgKCB2LnggPT09IHVuZGVmaW5lZCApIGdsLnVuaWZvcm00ZnYoIHRoaXMuYWRkciwgdiApO1xuXHRlbHNlIGdsLnVuaWZvcm00ZiggdGhpcy5hZGRyLCB2LngsIHYueSwgdi56LCB2LncgKTtcblxufVxuXG4vLyBTaW5nbGUgbWF0cml4IChmcm9tIGZsYXQgYXJyYXkgb3IgTWF0cml4TilcblxuZnVuY3Rpb24gc2V0VmFsdWUyZm0oIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm1NYXRyaXgyZnYoIHRoaXMuYWRkciwgZmFsc2UsIHYuZWxlbWVudHMgfHwgdiApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlM2ZtKCBnbCwgdiApIHtcblxuXHRpZiAoIHYuZWxlbWVudHMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGdsLnVuaWZvcm1NYXRyaXgzZnYoIHRoaXMuYWRkciwgZmFsc2UsIHYgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0bWF0M2FycmF5LnNldCggdi5lbGVtZW50cyApO1xuXHRcdGdsLnVuaWZvcm1NYXRyaXgzZnYoIHRoaXMuYWRkciwgZmFsc2UsIG1hdDNhcnJheSApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTRmbSggZ2wsIHYgKSB7XG5cblx0aWYgKCB2LmVsZW1lbnRzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRnbC51bmlmb3JtTWF0cml4NGZ2KCB0aGlzLmFkZHIsIGZhbHNlLCB2ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdG1hdDRhcnJheS5zZXQoIHYuZWxlbWVudHMgKTtcblx0XHRnbC51bmlmb3JtTWF0cml4NGZ2KCB0aGlzLmFkZHIsIGZhbHNlLCBtYXQ0YXJyYXkgKTtcblxuXHR9XG5cbn1cblxuLy8gU2luZ2xlIHRleHR1cmUgKDJEIC8gQ3ViZSlcblxuZnVuY3Rpb24gc2V0VmFsdWVUMSggZ2wsIHYsIHJlbmRlcmVyICkge1xuXG5cdHZhciB1bml0ID0gcmVuZGVyZXIuYWxsb2NUZXh0dXJlVW5pdCgpO1xuXHRnbC51bmlmb3JtMWkoIHRoaXMuYWRkciwgdW5pdCApO1xuXHRyZW5kZXJlci5zZXRUZXh0dXJlMkQoIHYgfHwgZW1wdHlUZXh0dXJlLCB1bml0ICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVUNiggZ2wsIHYsIHJlbmRlcmVyICkge1xuXG5cdHZhciB1bml0ID0gcmVuZGVyZXIuYWxsb2NUZXh0dXJlVW5pdCgpO1xuXHRnbC51bmlmb3JtMWkoIHRoaXMuYWRkciwgdW5pdCApO1xuXHRyZW5kZXJlci5zZXRUZXh0dXJlQ3ViZSggdiB8fCBlbXB0eUN1YmVUZXh0dXJlLCB1bml0ICk7XG5cbn1cblxuLy8gSW50ZWdlciAvIEJvb2xlYW4gdmVjdG9ycyBvciBhcnJheXMgdGhlcmVvZiAoYWx3YXlzIGZsYXQgYXJyYXlzKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTJpdiggZ2wsIHYgKSB7IGdsLnVuaWZvcm0yaXYoIHRoaXMuYWRkciwgdiApOyB9XG5mdW5jdGlvbiBzZXRWYWx1ZTNpdiggZ2wsIHYgKSB7IGdsLnVuaWZvcm0zaXYoIHRoaXMuYWRkciwgdiApOyB9XG5mdW5jdGlvbiBzZXRWYWx1ZTRpdiggZ2wsIHYgKSB7IGdsLnVuaWZvcm00aXYoIHRoaXMuYWRkciwgdiApOyB9XG5cbi8vIEhlbHBlciB0byBwaWNrIHRoZSByaWdodCBzZXR0ZXIgZm9yIHRoZSBzaW5ndWxhciBjYXNlXG5cbmZ1bmN0aW9uIGdldFNpbmd1bGFyU2V0dGVyKCB0eXBlICkge1xuXG5cdHN3aXRjaCAoIHR5cGUgKSB7XG5cblx0XHRjYXNlIDB4MTQwNjogcmV0dXJuIHNldFZhbHVlMWY7IC8vIEZMT0FUXG5cdFx0Y2FzZSAweDhiNTA6IHJldHVybiBzZXRWYWx1ZTJmdjsgLy8gX1ZFQzJcblx0XHRjYXNlIDB4OGI1MTogcmV0dXJuIHNldFZhbHVlM2Z2OyAvLyBfVkVDM1xuXHRcdGNhc2UgMHg4YjUyOiByZXR1cm4gc2V0VmFsdWU0ZnY7IC8vIF9WRUM0XG5cblx0XHRjYXNlIDB4OGI1YTogcmV0dXJuIHNldFZhbHVlMmZtOyAvLyBfTUFUMlxuXHRcdGNhc2UgMHg4YjViOiByZXR1cm4gc2V0VmFsdWUzZm07IC8vIF9NQVQzXG5cdFx0Y2FzZSAweDhiNWM6IHJldHVybiBzZXRWYWx1ZTRmbTsgLy8gX01BVDRcblxuXHRcdGNhc2UgMHg4YjVlOiByZXR1cm4gc2V0VmFsdWVUMTsgLy8gU0FNUExFUl8yRFxuXHRcdGNhc2UgMHg4YjYwOiByZXR1cm4gc2V0VmFsdWVUNjsgLy8gU0FNUExFUl9DVUJFXG5cblx0XHRjYXNlIDB4MTQwNDogY2FzZSAweDhiNTY6IHJldHVybiBzZXRWYWx1ZTFpOyAvLyBJTlQsIEJPT0xcblx0XHRjYXNlIDB4OGI1MzogY2FzZSAweDhiNTc6IHJldHVybiBzZXRWYWx1ZTJpdjsgLy8gX1ZFQzJcblx0XHRjYXNlIDB4OGI1NDogY2FzZSAweDhiNTg6IHJldHVybiBzZXRWYWx1ZTNpdjsgLy8gX1ZFQzNcblx0XHRjYXNlIDB4OGI1NTogY2FzZSAweDhiNTk6IHJldHVybiBzZXRWYWx1ZTRpdjsgLy8gX1ZFQzRcblxuXHR9XG5cbn1cblxuLy8gQXJyYXkgb2Ygc2NhbGFyc1xuXG5mdW5jdGlvbiBzZXRWYWx1ZTFmdiggZ2wsIHYgKSB7IGdsLnVuaWZvcm0xZnYoIHRoaXMuYWRkciwgdiApOyB9XG5mdW5jdGlvbiBzZXRWYWx1ZTFpdiggZ2wsIHYgKSB7IGdsLnVuaWZvcm0xaXYoIHRoaXMuYWRkciwgdiApOyB9XG5cbi8vIEFycmF5IG9mIHZlY3RvcnMgKGZsYXQgb3IgZnJvbSBUSFJFRSBjbGFzc2VzKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVYyYSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTJmdiggdGhpcy5hZGRyLCBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDIgKSApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlVjNhKCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtM2Z2KCB0aGlzLmFkZHIsIGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgMyApICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVWNGEoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm00ZnYoIHRoaXMuYWRkciwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCA0ICkgKTtcblxufVxuXG4vLyBBcnJheSBvZiBtYXRyaWNlcyAoZmxhdCBvciBmcm9tIFRIUkVFIGNsYXNlcylcblxuZnVuY3Rpb24gc2V0VmFsdWVNMmEoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm1NYXRyaXgyZnYoIHRoaXMuYWRkciwgZmFsc2UsIGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgNCApICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVNM2EoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm1NYXRyaXgzZnYoIHRoaXMuYWRkciwgZmFsc2UsIGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgOSApICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVNNGEoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm1NYXRyaXg0ZnYoIHRoaXMuYWRkciwgZmFsc2UsIGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgMTYgKSApO1xuXG59XG5cbi8vIEFycmF5IG9mIHRleHR1cmVzICgyRCAvIEN1YmUpXG5cbmZ1bmN0aW9uIHNldFZhbHVlVDFhKCBnbCwgdiwgcmVuZGVyZXIgKSB7XG5cblx0dmFyIG4gPSB2Lmxlbmd0aCxcblx0XHR1bml0cyA9IGFsbG9jVGV4VW5pdHMoIHJlbmRlcmVyLCBuICk7XG5cblx0Z2wudW5pZm9ybTFpdiggdGhpcy5hZGRyLCB1bml0cyApO1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdHJlbmRlcmVyLnNldFRleHR1cmUyRCggdlsgaSBdIHx8IGVtcHR5VGV4dHVyZSwgdW5pdHNbIGkgXSApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVQ2YSggZ2wsIHYsIHJlbmRlcmVyICkge1xuXG5cdHZhciBuID0gdi5sZW5ndGgsXG5cdFx0dW5pdHMgPSBhbGxvY1RleFVuaXRzKCByZW5kZXJlciwgbiApO1xuXG5cdGdsLnVuaWZvcm0xaXYoIHRoaXMuYWRkciwgdW5pdHMgKTtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRyZW5kZXJlci5zZXRUZXh0dXJlQ3ViZSggdlsgaSBdIHx8IGVtcHR5Q3ViZVRleHR1cmUsIHVuaXRzWyBpIF0gKTtcblxuXHR9XG5cbn1cblxuLy8gSGVscGVyIHRvIHBpY2sgdGhlIHJpZ2h0IHNldHRlciBmb3IgYSBwdXJlIChib3R0b20tbGV2ZWwpIGFycmF5XG5cbmZ1bmN0aW9uIGdldFB1cmVBcnJheVNldHRlciggdHlwZSApIHtcblxuXHRzd2l0Y2ggKCB0eXBlICkge1xuXG5cdFx0Y2FzZSAweDE0MDY6IHJldHVybiBzZXRWYWx1ZTFmdjsgLy8gRkxPQVRcblx0XHRjYXNlIDB4OGI1MDogcmV0dXJuIHNldFZhbHVlVjJhOyAvLyBfVkVDMlxuXHRcdGNhc2UgMHg4YjUxOiByZXR1cm4gc2V0VmFsdWVWM2E7IC8vIF9WRUMzXG5cdFx0Y2FzZSAweDhiNTI6IHJldHVybiBzZXRWYWx1ZVY0YTsgLy8gX1ZFQzRcblxuXHRcdGNhc2UgMHg4YjVhOiByZXR1cm4gc2V0VmFsdWVNMmE7IC8vIF9NQVQyXG5cdFx0Y2FzZSAweDhiNWI6IHJldHVybiBzZXRWYWx1ZU0zYTsgLy8gX01BVDNcblx0XHRjYXNlIDB4OGI1YzogcmV0dXJuIHNldFZhbHVlTTRhOyAvLyBfTUFUNFxuXG5cdFx0Y2FzZSAweDhiNWU6IHJldHVybiBzZXRWYWx1ZVQxYTsgLy8gU0FNUExFUl8yRFxuXHRcdGNhc2UgMHg4YjYwOiByZXR1cm4gc2V0VmFsdWVUNmE7IC8vIFNBTVBMRVJfQ1VCRVxuXG5cdFx0Y2FzZSAweDE0MDQ6IGNhc2UgMHg4YjU2OiByZXR1cm4gc2V0VmFsdWUxaXY7IC8vIElOVCwgQk9PTFxuXHRcdGNhc2UgMHg4YjUzOiBjYXNlIDB4OGI1NzogcmV0dXJuIHNldFZhbHVlMml2OyAvLyBfVkVDMlxuXHRcdGNhc2UgMHg4YjU0OiBjYXNlIDB4OGI1ODogcmV0dXJuIHNldFZhbHVlM2l2OyAvLyBfVkVDM1xuXHRcdGNhc2UgMHg4YjU1OiBjYXNlIDB4OGI1OTogcmV0dXJuIHNldFZhbHVlNGl2OyAvLyBfVkVDNFxuXG5cdH1cblxufVxuXG4vLyAtLS0gVW5pZm9ybSBDbGFzc2VzIC0tLVxuXG5mdW5jdGlvbiBTaW5nbGVVbmlmb3JtKCBpZCwgYWN0aXZlSW5mbywgYWRkciApIHtcblxuXHR0aGlzLmlkID0gaWQ7XG5cdHRoaXMuYWRkciA9IGFkZHI7XG5cdHRoaXMuc2V0VmFsdWUgPSBnZXRTaW5ndWxhclNldHRlciggYWN0aXZlSW5mby50eXBlICk7XG5cblx0Ly8gdGhpcy5wYXRoID0gYWN0aXZlSW5mby5uYW1lOyAvLyBERUJVR1xuXG59XG5cbmZ1bmN0aW9uIFB1cmVBcnJheVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkge1xuXG5cdHRoaXMuaWQgPSBpZDtcblx0dGhpcy5hZGRyID0gYWRkcjtcblx0dGhpcy5zaXplID0gYWN0aXZlSW5mby5zaXplO1xuXHR0aGlzLnNldFZhbHVlID0gZ2V0UHVyZUFycmF5U2V0dGVyKCBhY3RpdmVJbmZvLnR5cGUgKTtcblxuXHQvLyB0aGlzLnBhdGggPSBhY3RpdmVJbmZvLm5hbWU7IC8vIERFQlVHXG5cbn1cblxuZnVuY3Rpb24gU3RydWN0dXJlZFVuaWZvcm0oIGlkICkge1xuXG5cdHRoaXMuaWQgPSBpZDtcblxuXHRVbmlmb3JtQ29udGFpbmVyLmNhbGwoIHRoaXMgKTsgLy8gbWl4LWluXG5cbn1cblxuU3RydWN0dXJlZFVuaWZvcm0ucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24gKCBnbCwgdmFsdWUgKSB7XG5cblx0Ly8gTm90ZTogRG9uJ3QgbmVlZCBhbiBleHRyYSAncmVuZGVyZXInIHBhcmFtZXRlciwgc2luY2Ugc2FtcGxlcnNcblx0Ly8gYXJlIG5vdCBhbGxvd2VkIGluIHN0cnVjdHVyZWQgdW5pZm9ybXMuXG5cblx0dmFyIHNlcSA9IHRoaXMuc2VxO1xuXG5cdGZvciAoIHZhciBpID0gMCwgbiA9IHNlcS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHR2YXIgdSA9IHNlcVsgaSBdO1xuXHRcdHUuc2V0VmFsdWUoIGdsLCB2YWx1ZVsgdS5pZCBdICk7XG5cblx0fVxuXG59O1xuXG4vLyAtLS0gVG9wLWxldmVsIC0tLVxuXG4vLyBQYXJzZXIgLSBidWlsZHMgdXAgdGhlIHByb3BlcnR5IHRyZWUgZnJvbSB0aGUgcGF0aCBzdHJpbmdzXG5cbnZhciBSZVBhdGhQYXJ0ID0gLyhbXFx3XFxkX10rKShcXF0pPyhcXFt8XFwuKT8vZztcblxuLy8gZXh0cmFjdHNcbi8vIFx0LSB0aGUgaWRlbnRpZmllciAobWVtYmVyIG5hbWUgb3IgYXJyYXkgaW5kZXgpXG4vLyAgLSBmb2xsb3dlZCBieSBhbiBvcHRpb25hbCByaWdodCBicmFja2V0IChmb3VuZCB3aGVuIGFycmF5IGluZGV4KVxuLy8gIC0gZm9sbG93ZWQgYnkgYW4gb3B0aW9uYWwgbGVmdCBicmFja2V0IG9yIGRvdCAodHlwZSBvZiBzdWJzY3JpcHQpXG4vL1xuLy8gTm90ZTogVGhlc2UgcG9ydGlvbnMgY2FuIGJlIHJlYWQgaW4gYSBub24tb3ZlcmxhcHBpbmcgZmFzaGlvbiBhbmRcbi8vIGFsbG93IHN0cmFpZ2h0Zm9yd2FyZCBwYXJzaW5nIG9mIHRoZSBoaWVyYXJjaHkgdGhhdCBXZWJHTCBlbmNvZGVzXG4vLyBpbiB0aGUgdW5pZm9ybSBuYW1lcy5cblxuZnVuY3Rpb24gYWRkVW5pZm9ybSggY29udGFpbmVyLCB1bmlmb3JtT2JqZWN0ICkge1xuXG5cdGNvbnRhaW5lci5zZXEucHVzaCggdW5pZm9ybU9iamVjdCApO1xuXHRjb250YWluZXIubWFwWyB1bmlmb3JtT2JqZWN0LmlkIF0gPSB1bmlmb3JtT2JqZWN0O1xuXG59XG5cbmZ1bmN0aW9uIHBhcnNlVW5pZm9ybSggYWN0aXZlSW5mbywgYWRkciwgY29udGFpbmVyICkge1xuXG5cdHZhciBwYXRoID0gYWN0aXZlSW5mby5uYW1lLFxuXHRcdHBhdGhMZW5ndGggPSBwYXRoLmxlbmd0aDtcblxuXHQvLyByZXNldCBSZWdFeHAgb2JqZWN0LCBiZWNhdXNlIG9mIHRoZSBlYXJseSBleGl0IG9mIGEgcHJldmlvdXMgcnVuXG5cdFJlUGF0aFBhcnQubGFzdEluZGV4ID0gMDtcblxuXHRmb3IgKCA7IDsgKSB7XG5cblx0XHR2YXIgbWF0Y2ggPSBSZVBhdGhQYXJ0LmV4ZWMoIHBhdGggKSxcblx0XHRcdG1hdGNoRW5kID0gUmVQYXRoUGFydC5sYXN0SW5kZXgsXG5cblx0XHRcdGlkID0gbWF0Y2hbIDEgXSxcblx0XHRcdGlkSXNJbmRleCA9IG1hdGNoWyAyIF0gPT09ICddJyxcblx0XHRcdHN1YnNjcmlwdCA9IG1hdGNoWyAzIF07XG5cblx0XHRpZiAoIGlkSXNJbmRleCApIGlkID0gaWQgfCAwOyAvLyBjb252ZXJ0IHRvIGludGVnZXJcblxuXHRcdGlmICggc3Vic2NyaXB0ID09PSB1bmRlZmluZWQgfHwgc3Vic2NyaXB0ID09PSAnWycgJiYgbWF0Y2hFbmQgKyAyID09PSBwYXRoTGVuZ3RoICkge1xuXG5cdFx0XHQvLyBiYXJlIG5hbWUgb3IgXCJwdXJlXCIgYm90dG9tLWxldmVsIGFycmF5IFwiWzBdXCIgc3VmZml4XG5cblx0XHRcdGFkZFVuaWZvcm0oIGNvbnRhaW5lciwgc3Vic2NyaXB0ID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRcdG5ldyBTaW5nbGVVbmlmb3JtKCBpZCwgYWN0aXZlSW5mbywgYWRkciApIDpcblx0XHRcdFx0XHRuZXcgUHVyZUFycmF5VW5pZm9ybSggaWQsIGFjdGl2ZUluZm8sIGFkZHIgKSApO1xuXG5cdFx0XHRicmVhaztcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIHN0ZXAgaW50byBpbm5lciBub2RlIC8gY3JlYXRlIGl0IGluIGNhc2UgaXQgZG9lc24ndCBleGlzdFxuXG5cdFx0XHR2YXIgbWFwID0gY29udGFpbmVyLm1hcCwgbmV4dCA9IG1hcFsgaWQgXTtcblxuXHRcdFx0aWYgKCBuZXh0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bmV4dCA9IG5ldyBTdHJ1Y3R1cmVkVW5pZm9ybSggaWQgKTtcblx0XHRcdFx0YWRkVW5pZm9ybSggY29udGFpbmVyLCBuZXh0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Y29udGFpbmVyID0gbmV4dDtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuLy8gUm9vdCBDb250YWluZXJcblxuZnVuY3Rpb24gV2ViR0xVbmlmb3JtcyggZ2wsIHByb2dyYW0sIHJlbmRlcmVyICkge1xuXG5cdFVuaWZvcm1Db250YWluZXIuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcblxuXHR2YXIgbiA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW0sIGdsLkFDVElWRV9VTklGT1JNUyApO1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSA8IG47ICsrIGkgKSB7XG5cblx0XHR2YXIgaW5mbyA9IGdsLmdldEFjdGl2ZVVuaWZvcm0oIHByb2dyYW0sIGkgKSxcblx0XHRcdHBhdGggPSBpbmZvLm5hbWUsXG5cdFx0XHRhZGRyID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCBwYXRoICk7XG5cblx0XHRwYXJzZVVuaWZvcm0oIGluZm8sIGFkZHIsIHRoaXMgKTtcblxuXHR9XG5cbn1cblxuV2ViR0xVbmlmb3Jtcy5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAoIGdsLCBuYW1lLCB2YWx1ZSApIHtcblxuXHR2YXIgdSA9IHRoaXMubWFwWyBuYW1lIF07XG5cblx0aWYgKCB1ICE9PSB1bmRlZmluZWQgKSB1LnNldFZhbHVlKCBnbCwgdmFsdWUsIHRoaXMucmVuZGVyZXIgKTtcblxufTtcblxuV2ViR0xVbmlmb3Jtcy5wcm90b3R5cGUuc2V0T3B0aW9uYWwgPSBmdW5jdGlvbiAoIGdsLCBvYmplY3QsIG5hbWUgKSB7XG5cblx0dmFyIHYgPSBvYmplY3RbIG5hbWUgXTtcblxuXHRpZiAoIHYgIT09IHVuZGVmaW5lZCApIHRoaXMuc2V0VmFsdWUoIGdsLCBuYW1lLCB2ICk7XG5cbn07XG5cblxuLy8gU3RhdGljIGludGVyZmFjZVxuXG5XZWJHTFVuaWZvcm1zLnVwbG9hZCA9IGZ1bmN0aW9uICggZ2wsIHNlcSwgdmFsdWVzLCByZW5kZXJlciApIHtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBzZXEubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0dmFyIHUgPSBzZXFbIGkgXSxcblx0XHRcdHYgPSB2YWx1ZXNbIHUuaWQgXTtcblxuXHRcdGlmICggdi5uZWVkc1VwZGF0ZSAhPT0gZmFsc2UgKSB7XG5cblx0XHRcdC8vIG5vdGU6IGFsd2F5cyB1cGRhdGluZyB3aGVuIC5uZWVkc1VwZGF0ZSBpcyB1bmRlZmluZWRcblx0XHRcdHUuc2V0VmFsdWUoIGdsLCB2LnZhbHVlLCByZW5kZXJlciApO1xuXG5cdFx0fVxuXG5cdH1cblxufTtcblxuV2ViR0xVbmlmb3Jtcy5zZXFXaXRoVmFsdWUgPSBmdW5jdGlvbiAoIHNlcSwgdmFsdWVzICkge1xuXG5cdHZhciByID0gW107XG5cblx0Zm9yICggdmFyIGkgPSAwLCBuID0gc2VxLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdHZhciB1ID0gc2VxWyBpIF07XG5cdFx0aWYgKCB1LmlkIGluIHZhbHVlcyApIHIucHVzaCggdSApO1xuXG5cdH1cblxuXHRyZXR1cm4gcjtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbnZhciBDb2xvcktleXdvcmRzID0geyAnYWxpY2VibHVlJzogMHhGMEY4RkYsICdhbnRpcXVld2hpdGUnOiAweEZBRUJENywgJ2FxdWEnOiAweDAwRkZGRiwgJ2FxdWFtYXJpbmUnOiAweDdGRkZENCwgJ2F6dXJlJzogMHhGMEZGRkYsXG5cdCdiZWlnZSc6IDB4RjVGNURDLCAnYmlzcXVlJzogMHhGRkU0QzQsICdibGFjayc6IDB4MDAwMDAwLCAnYmxhbmNoZWRhbG1vbmQnOiAweEZGRUJDRCwgJ2JsdWUnOiAweDAwMDBGRiwgJ2JsdWV2aW9sZXQnOiAweDhBMkJFMixcblx0J2Jyb3duJzogMHhBNTJBMkEsICdidXJseXdvb2QnOiAweERFQjg4NywgJ2NhZGV0Ymx1ZSc6IDB4NUY5RUEwLCAnY2hhcnRyZXVzZSc6IDB4N0ZGRjAwLCAnY2hvY29sYXRlJzogMHhEMjY5MUUsICdjb3JhbCc6IDB4RkY3RjUwLFxuXHQnY29ybmZsb3dlcmJsdWUnOiAweDY0OTVFRCwgJ2Nvcm5zaWxrJzogMHhGRkY4REMsICdjcmltc29uJzogMHhEQzE0M0MsICdjeWFuJzogMHgwMEZGRkYsICdkYXJrYmx1ZSc6IDB4MDAwMDhCLCAnZGFya2N5YW4nOiAweDAwOEI4Qixcblx0J2Rhcmtnb2xkZW5yb2QnOiAweEI4ODYwQiwgJ2RhcmtncmF5JzogMHhBOUE5QTksICdkYXJrZ3JlZW4nOiAweDAwNjQwMCwgJ2RhcmtncmV5JzogMHhBOUE5QTksICdkYXJra2hha2knOiAweEJEQjc2QiwgJ2RhcmttYWdlbnRhJzogMHg4QjAwOEIsXG5cdCdkYXJrb2xpdmVncmVlbic6IDB4NTU2QjJGLCAnZGFya29yYW5nZSc6IDB4RkY4QzAwLCAnZGFya29yY2hpZCc6IDB4OTkzMkNDLCAnZGFya3JlZCc6IDB4OEIwMDAwLCAnZGFya3NhbG1vbic6IDB4RTk5NjdBLCAnZGFya3NlYWdyZWVuJzogMHg4RkJDOEYsXG5cdCdkYXJrc2xhdGVibHVlJzogMHg0ODNEOEIsICdkYXJrc2xhdGVncmF5JzogMHgyRjRGNEYsICdkYXJrc2xhdGVncmV5JzogMHgyRjRGNEYsICdkYXJrdHVycXVvaXNlJzogMHgwMENFRDEsICdkYXJrdmlvbGV0JzogMHg5NDAwRDMsXG5cdCdkZWVwcGluayc6IDB4RkYxNDkzLCAnZGVlcHNreWJsdWUnOiAweDAwQkZGRiwgJ2RpbWdyYXknOiAweDY5Njk2OSwgJ2RpbWdyZXknOiAweDY5Njk2OSwgJ2RvZGdlcmJsdWUnOiAweDFFOTBGRiwgJ2ZpcmVicmljayc6IDB4QjIyMjIyLFxuXHQnZmxvcmFsd2hpdGUnOiAweEZGRkFGMCwgJ2ZvcmVzdGdyZWVuJzogMHgyMjhCMjIsICdmdWNoc2lhJzogMHhGRjAwRkYsICdnYWluc2Jvcm8nOiAweERDRENEQywgJ2dob3N0d2hpdGUnOiAweEY4RjhGRiwgJ2dvbGQnOiAweEZGRDcwMCxcblx0J2dvbGRlbnJvZCc6IDB4REFBNTIwLCAnZ3JheSc6IDB4ODA4MDgwLCAnZ3JlZW4nOiAweDAwODAwMCwgJ2dyZWVueWVsbG93JzogMHhBREZGMkYsICdncmV5JzogMHg4MDgwODAsICdob25leWRldyc6IDB4RjBGRkYwLCAnaG90cGluayc6IDB4RkY2OUI0LFxuXHQnaW5kaWFucmVkJzogMHhDRDVDNUMsICdpbmRpZ28nOiAweDRCMDA4MiwgJ2l2b3J5JzogMHhGRkZGRjAsICdraGFraSc6IDB4RjBFNjhDLCAnbGF2ZW5kZXInOiAweEU2RTZGQSwgJ2xhdmVuZGVyYmx1c2gnOiAweEZGRjBGNSwgJ2xhd25ncmVlbic6IDB4N0NGQzAwLFxuXHQnbGVtb25jaGlmZm9uJzogMHhGRkZBQ0QsICdsaWdodGJsdWUnOiAweEFERDhFNiwgJ2xpZ2h0Y29yYWwnOiAweEYwODA4MCwgJ2xpZ2h0Y3lhbic6IDB4RTBGRkZGLCAnbGlnaHRnb2xkZW5yb2R5ZWxsb3cnOiAweEZBRkFEMiwgJ2xpZ2h0Z3JheSc6IDB4RDNEM0QzLFxuXHQnbGlnaHRncmVlbic6IDB4OTBFRTkwLCAnbGlnaHRncmV5JzogMHhEM0QzRDMsICdsaWdodHBpbmsnOiAweEZGQjZDMSwgJ2xpZ2h0c2FsbW9uJzogMHhGRkEwN0EsICdsaWdodHNlYWdyZWVuJzogMHgyMEIyQUEsICdsaWdodHNreWJsdWUnOiAweDg3Q0VGQSxcblx0J2xpZ2h0c2xhdGVncmF5JzogMHg3Nzg4OTksICdsaWdodHNsYXRlZ3JleSc6IDB4Nzc4ODk5LCAnbGlnaHRzdGVlbGJsdWUnOiAweEIwQzRERSwgJ2xpZ2h0eWVsbG93JzogMHhGRkZGRTAsICdsaW1lJzogMHgwMEZGMDAsICdsaW1lZ3JlZW4nOiAweDMyQ0QzMixcblx0J2xpbmVuJzogMHhGQUYwRTYsICdtYWdlbnRhJzogMHhGRjAwRkYsICdtYXJvb24nOiAweDgwMDAwMCwgJ21lZGl1bWFxdWFtYXJpbmUnOiAweDY2Q0RBQSwgJ21lZGl1bWJsdWUnOiAweDAwMDBDRCwgJ21lZGl1bW9yY2hpZCc6IDB4QkE1NUQzLFxuXHQnbWVkaXVtcHVycGxlJzogMHg5MzcwREIsICdtZWRpdW1zZWFncmVlbic6IDB4M0NCMzcxLCAnbWVkaXVtc2xhdGVibHVlJzogMHg3QjY4RUUsICdtZWRpdW1zcHJpbmdncmVlbic6IDB4MDBGQTlBLCAnbWVkaXVtdHVycXVvaXNlJzogMHg0OEQxQ0MsXG5cdCdtZWRpdW12aW9sZXRyZWQnOiAweEM3MTU4NSwgJ21pZG5pZ2h0Ymx1ZSc6IDB4MTkxOTcwLCAnbWludGNyZWFtJzogMHhGNUZGRkEsICdtaXN0eXJvc2UnOiAweEZGRTRFMSwgJ21vY2Nhc2luJzogMHhGRkU0QjUsICduYXZham93aGl0ZSc6IDB4RkZERUFELFxuXHQnbmF2eSc6IDB4MDAwMDgwLCAnb2xkbGFjZSc6IDB4RkRGNUU2LCAnb2xpdmUnOiAweDgwODAwMCwgJ29saXZlZHJhYic6IDB4NkI4RTIzLCAnb3JhbmdlJzogMHhGRkE1MDAsICdvcmFuZ2VyZWQnOiAweEZGNDUwMCwgJ29yY2hpZCc6IDB4REE3MEQ2LFxuXHQncGFsZWdvbGRlbnJvZCc6IDB4RUVFOEFBLCAncGFsZWdyZWVuJzogMHg5OEZCOTgsICdwYWxldHVycXVvaXNlJzogMHhBRkVFRUUsICdwYWxldmlvbGV0cmVkJzogMHhEQjcwOTMsICdwYXBheWF3aGlwJzogMHhGRkVGRDUsICdwZWFjaHB1ZmYnOiAweEZGREFCOSxcblx0J3BlcnUnOiAweENEODUzRiwgJ3BpbmsnOiAweEZGQzBDQiwgJ3BsdW0nOiAweEREQTBERCwgJ3Bvd2RlcmJsdWUnOiAweEIwRTBFNiwgJ3B1cnBsZSc6IDB4ODAwMDgwLCAncmVkJzogMHhGRjAwMDAsICdyb3N5YnJvd24nOiAweEJDOEY4Rixcblx0J3JveWFsYmx1ZSc6IDB4NDE2OUUxLCAnc2FkZGxlYnJvd24nOiAweDhCNDUxMywgJ3NhbG1vbic6IDB4RkE4MDcyLCAnc2FuZHlicm93bic6IDB4RjRBNDYwLCAnc2VhZ3JlZW4nOiAweDJFOEI1NywgJ3NlYXNoZWxsJzogMHhGRkY1RUUsXG5cdCdzaWVubmEnOiAweEEwNTIyRCwgJ3NpbHZlcic6IDB4QzBDMEMwLCAnc2t5Ymx1ZSc6IDB4ODdDRUVCLCAnc2xhdGVibHVlJzogMHg2QTVBQ0QsICdzbGF0ZWdyYXknOiAweDcwODA5MCwgJ3NsYXRlZ3JleSc6IDB4NzA4MDkwLCAnc25vdyc6IDB4RkZGQUZBLFxuXHQnc3ByaW5nZ3JlZW4nOiAweDAwRkY3RiwgJ3N0ZWVsYmx1ZSc6IDB4NDY4MkI0LCAndGFuJzogMHhEMkI0OEMsICd0ZWFsJzogMHgwMDgwODAsICd0aGlzdGxlJzogMHhEOEJGRDgsICd0b21hdG8nOiAweEZGNjM0NywgJ3R1cnF1b2lzZSc6IDB4NDBFMEQwLFxuXHQndmlvbGV0JzogMHhFRTgyRUUsICd3aGVhdCc6IDB4RjVERUIzLCAnd2hpdGUnOiAweEZGRkZGRiwgJ3doaXRlc21va2UnOiAweEY1RjVGNSwgJ3llbGxvdyc6IDB4RkZGRjAwLCAneWVsbG93Z3JlZW4nOiAweDlBQ0QzMiB9O1xuXG5mdW5jdGlvbiBDb2xvciggciwgZywgYiApIHtcblxuXHRpZiAoIGcgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHQvLyByIGlzIFRIUkVFLkNvbG9yLCBoZXggb3Igc3RyaW5nXG5cdFx0cmV0dXJuIHRoaXMuc2V0KCByICk7XG5cblx0fVxuXG5cdHJldHVybiB0aGlzLnNldFJHQiggciwgZywgYiApO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIENvbG9yLnByb3RvdHlwZSwge1xuXG5cdGlzQ29sb3I6IHRydWUsXG5cblx0cjogMSwgZzogMSwgYjogMSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHZhbHVlICYmIHZhbHVlLmlzQ29sb3IgKSB7XG5cblx0XHRcdHRoaXMuY29weSggdmFsdWUgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgKSB7XG5cblx0XHRcdHRoaXMuc2V0SGV4KCB2YWx1ZSApO1xuXG5cdFx0fSBlbHNlIGlmICggdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyApIHtcblxuXHRcdFx0dGhpcy5zZXRTdHlsZSggdmFsdWUgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMuciA9IHNjYWxhcjtcblx0XHR0aGlzLmcgPSBzY2FsYXI7XG5cdFx0dGhpcy5iID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRIZXg6IGZ1bmN0aW9uICggaGV4ICkge1xuXG5cdFx0aGV4ID0gTWF0aC5mbG9vciggaGV4ICk7XG5cblx0XHR0aGlzLnIgPSAoIGhleCA+PiAxNiAmIDI1NSApIC8gMjU1O1xuXHRcdHRoaXMuZyA9ICggaGV4ID4+IDggJiAyNTUgKSAvIDI1NTtcblx0XHR0aGlzLmIgPSAoIGhleCAmIDI1NSApIC8gMjU1O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRSR0I6IGZ1bmN0aW9uICggciwgZywgYiApIHtcblxuXHRcdHRoaXMuciA9IHI7XG5cdFx0dGhpcy5nID0gZztcblx0XHR0aGlzLmIgPSBiO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRIU0w6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGZ1bmN0aW9uIGh1ZTJyZ2IoIHAsIHEsIHQgKSB7XG5cblx0XHRcdGlmICggdCA8IDAgKSB0ICs9IDE7XG5cdFx0XHRpZiAoIHQgPiAxICkgdCAtPSAxO1xuXHRcdFx0aWYgKCB0IDwgMSAvIDYgKSByZXR1cm4gcCArICggcSAtIHAgKSAqIDYgKiB0O1xuXHRcdFx0aWYgKCB0IDwgMSAvIDIgKSByZXR1cm4gcTtcblx0XHRcdGlmICggdCA8IDIgLyAzICkgcmV0dXJuIHAgKyAoIHEgLSBwICkgKiA2ICogKCAyIC8gMyAtIHQgKTtcblx0XHRcdHJldHVybiBwO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldEhTTCggaCwgcywgbCApIHtcblxuXHRcdFx0Ly8gaCxzLGwgcmFuZ2VzIGFyZSBpbiAwLjAgLSAxLjBcblx0XHRcdGggPSBfTWF0aC5ldWNsaWRlYW5Nb2R1bG8oIGgsIDEgKTtcblx0XHRcdHMgPSBfTWF0aC5jbGFtcCggcywgMCwgMSApO1xuXHRcdFx0bCA9IF9NYXRoLmNsYW1wKCBsLCAwLCAxICk7XG5cblx0XHRcdGlmICggcyA9PT0gMCApIHtcblxuXHRcdFx0XHR0aGlzLnIgPSB0aGlzLmcgPSB0aGlzLmIgPSBsO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZhciBwID0gbCA8PSAwLjUgPyBsICogKCAxICsgcyApIDogbCArIHMgLSAoIGwgKiBzICk7XG5cdFx0XHRcdHZhciBxID0gKCAyICogbCApIC0gcDtcblxuXHRcdFx0XHR0aGlzLnIgPSBodWUycmdiKCBxLCBwLCBoICsgMSAvIDMgKTtcblx0XHRcdFx0dGhpcy5nID0gaHVlMnJnYiggcSwgcCwgaCApO1xuXHRcdFx0XHR0aGlzLmIgPSBodWUycmdiKCBxLCBwLCBoIC0gMSAvIDMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHNldFN0eWxlOiBmdW5jdGlvbiAoIHN0eWxlICkge1xuXG5cdFx0ZnVuY3Rpb24gaGFuZGxlQWxwaGEoIHN0cmluZyApIHtcblxuXHRcdFx0aWYgKCBzdHJpbmcgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdFx0aWYgKCBwYXJzZUZsb2F0KCBzdHJpbmcgKSA8IDEgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAnICsgc3R5bGUgKyAnIHdpbGwgYmUgaWdub3JlZC4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXG5cdFx0dmFyIG07XG5cblx0XHRpZiAoIG0gPSAvXigoPzpyZ2J8aHNsKWE/KVxcKFxccyooW15cXCldKilcXCkvLmV4ZWMoIHN0eWxlICkgKSB7XG5cblx0XHRcdC8vIHJnYiAvIGhzbFxuXG5cdFx0XHR2YXIgY29sb3I7XG5cdFx0XHR2YXIgbmFtZSA9IG1bIDEgXTtcblx0XHRcdHZhciBjb21wb25lbnRzID0gbVsgMiBdO1xuXG5cdFx0XHRzd2l0Y2ggKCBuYW1lICkge1xuXG5cdFx0XHRcdGNhc2UgJ3JnYic6XG5cdFx0XHRcdGNhc2UgJ3JnYmEnOlxuXG5cdFx0XHRcdFx0aWYgKCBjb2xvciA9IC9eKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKigsXFxzKihbMC05XSpcXC4/WzAtOV0rKVxccyopPyQvLmV4ZWMoIGNvbXBvbmVudHMgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmdiKDI1NSwwLDApIHJnYmEoMjU1LDAsMCwwLjUpXG5cdFx0XHRcdFx0XHR0aGlzLnIgPSBNYXRoLm1pbiggMjU1LCBwYXJzZUludCggY29sb3JbIDEgXSwgMTAgKSApIC8gMjU1O1xuXHRcdFx0XHRcdFx0dGhpcy5nID0gTWF0aC5taW4oIDI1NSwgcGFyc2VJbnQoIGNvbG9yWyAyIF0sIDEwICkgKSAvIDI1NTtcblx0XHRcdFx0XHRcdHRoaXMuYiA9IE1hdGgubWluKCAyNTUsIHBhcnNlSW50KCBjb2xvclsgMyBdLCAxMCApICkgLyAyNTU7XG5cblx0XHRcdFx0XHRcdGhhbmRsZUFscGhhKCBjb2xvclsgNSBdICk7XG5cblx0XHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBjb2xvciA9IC9eKFxcZCspXFwlXFxzKixcXHMqKFxcZCspXFwlXFxzKixcXHMqKFxcZCspXFwlXFxzKigsXFxzKihbMC05XSpcXC4/WzAtOV0rKVxccyopPyQvLmV4ZWMoIGNvbXBvbmVudHMgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmdiKDEwMCUsMCUsMCUpIHJnYmEoMTAwJSwwJSwwJSwwLjUpXG5cdFx0XHRcdFx0XHR0aGlzLnIgPSBNYXRoLm1pbiggMTAwLCBwYXJzZUludCggY29sb3JbIDEgXSwgMTAgKSApIC8gMTAwO1xuXHRcdFx0XHRcdFx0dGhpcy5nID0gTWF0aC5taW4oIDEwMCwgcGFyc2VJbnQoIGNvbG9yWyAyIF0sIDEwICkgKSAvIDEwMDtcblx0XHRcdFx0XHRcdHRoaXMuYiA9IE1hdGgubWluKCAxMDAsIHBhcnNlSW50KCBjb2xvclsgMyBdLCAxMCApICkgLyAxMDA7XG5cblx0XHRcdFx0XHRcdGhhbmRsZUFscGhhKCBjb2xvclsgNSBdICk7XG5cblx0XHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnaHNsJzpcblx0XHRcdFx0Y2FzZSAnaHNsYSc6XG5cblx0XHRcdFx0XHRpZiAoIGNvbG9yID0gL14oWzAtOV0qXFwuP1swLTldKylcXHMqLFxccyooXFxkKylcXCVcXHMqLFxccyooXFxkKylcXCVcXHMqKCxcXHMqKFswLTldKlxcLj9bMC05XSspXFxzKik/JC8uZXhlYyggY29tcG9uZW50cyApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBoc2woMTIwLDUwJSw1MCUpIGhzbGEoMTIwLDUwJSw1MCUsMC41KVxuXHRcdFx0XHRcdFx0dmFyIGggPSBwYXJzZUZsb2F0KCBjb2xvclsgMSBdICkgLyAzNjA7XG5cdFx0XHRcdFx0XHR2YXIgcyA9IHBhcnNlSW50KCBjb2xvclsgMiBdLCAxMCApIC8gMTAwO1xuXHRcdFx0XHRcdFx0dmFyIGwgPSBwYXJzZUludCggY29sb3JbIDMgXSwgMTAgKSAvIDEwMDtcblxuXHRcdFx0XHRcdFx0aGFuZGxlQWxwaGEoIGNvbG9yWyA1IF0gKTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0SFNMKCBoLCBzLCBsICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggbSA9IC9eXFwjKFtBLUZhLWYwLTldKykkLy5leGVjKCBzdHlsZSApICkge1xuXG5cdFx0XHQvLyBoZXggY29sb3JcblxuXHRcdFx0dmFyIGhleCA9IG1bIDEgXTtcblx0XHRcdHZhciBzaXplID0gaGV4Lmxlbmd0aDtcblxuXHRcdFx0aWYgKCBzaXplID09PSAzICkge1xuXG5cdFx0XHRcdC8vICNmZjBcblx0XHRcdFx0dGhpcy5yID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDAgKSArIGhleC5jaGFyQXQoIDAgKSwgMTYgKSAvIDI1NTtcblx0XHRcdFx0dGhpcy5nID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDEgKSArIGhleC5jaGFyQXQoIDEgKSwgMTYgKSAvIDI1NTtcblx0XHRcdFx0dGhpcy5iID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDIgKSArIGhleC5jaGFyQXQoIDIgKSwgMTYgKSAvIDI1NTtcblxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdFx0fSBlbHNlIGlmICggc2l6ZSA9PT0gNiApIHtcblxuXHRcdFx0XHQvLyAjZmYwMDAwXG5cdFx0XHRcdHRoaXMuciA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAwICkgKyBoZXguY2hhckF0KCAxICksIDE2ICkgLyAyNTU7XG5cdFx0XHRcdHRoaXMuZyA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAyICkgKyBoZXguY2hhckF0KCAzICksIDE2ICkgLyAyNTU7XG5cdFx0XHRcdHRoaXMuYiA9IHBhcnNlSW50KCBoZXguY2hhckF0KCA0ICkgKyBoZXguY2hhckF0KCA1ICksIDE2ICkgLyAyNTU7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggc3R5bGUgJiYgc3R5bGUubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0Ly8gY29sb3Iga2V5d29yZHNcblx0XHRcdHZhciBoZXggPSBDb2xvcktleXdvcmRzWyBzdHlsZSBdO1xuXG5cdFx0XHRpZiAoIGhleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIHJlZFxuXHRcdFx0XHR0aGlzLnNldEhleCggaGV4ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gdW5rbm93biBjb2xvclxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciAnICsgc3R5bGUgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLnIsIHRoaXMuZywgdGhpcy5iICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIGNvbG9yICkge1xuXG5cdFx0dGhpcy5yID0gY29sb3Iucjtcblx0XHR0aGlzLmcgPSBjb2xvci5nO1xuXHRcdHRoaXMuYiA9IGNvbG9yLmI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlHYW1tYVRvTGluZWFyOiBmdW5jdGlvbiAoIGNvbG9yLCBnYW1tYUZhY3RvciApIHtcblxuXHRcdGlmICggZ2FtbWFGYWN0b3IgPT09IHVuZGVmaW5lZCApIGdhbW1hRmFjdG9yID0gMi4wO1xuXG5cdFx0dGhpcy5yID0gTWF0aC5wb3coIGNvbG9yLnIsIGdhbW1hRmFjdG9yICk7XG5cdFx0dGhpcy5nID0gTWF0aC5wb3coIGNvbG9yLmcsIGdhbW1hRmFjdG9yICk7XG5cdFx0dGhpcy5iID0gTWF0aC5wb3coIGNvbG9yLmIsIGdhbW1hRmFjdG9yICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlMaW5lYXJUb0dhbW1hOiBmdW5jdGlvbiAoIGNvbG9yLCBnYW1tYUZhY3RvciApIHtcblxuXHRcdGlmICggZ2FtbWFGYWN0b3IgPT09IHVuZGVmaW5lZCApIGdhbW1hRmFjdG9yID0gMi4wO1xuXG5cdFx0dmFyIHNhZmVJbnZlcnNlID0gKCBnYW1tYUZhY3RvciA+IDAgKSA/ICggMS4wIC8gZ2FtbWFGYWN0b3IgKSA6IDEuMDtcblxuXHRcdHRoaXMuciA9IE1hdGgucG93KCBjb2xvci5yLCBzYWZlSW52ZXJzZSApO1xuXHRcdHRoaXMuZyA9IE1hdGgucG93KCBjb2xvci5nLCBzYWZlSW52ZXJzZSApO1xuXHRcdHRoaXMuYiA9IE1hdGgucG93KCBjb2xvci5iLCBzYWZlSW52ZXJzZSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb252ZXJ0R2FtbWFUb0xpbmVhcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHIgPSB0aGlzLnIsIGcgPSB0aGlzLmcsIGIgPSB0aGlzLmI7XG5cblx0XHR0aGlzLnIgPSByICogcjtcblx0XHR0aGlzLmcgPSBnICogZztcblx0XHR0aGlzLmIgPSBiICogYjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29udmVydExpbmVhclRvR2FtbWE6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuciA9IE1hdGguc3FydCggdGhpcy5yICk7XG5cdFx0dGhpcy5nID0gTWF0aC5zcXJ0KCB0aGlzLmcgKTtcblx0XHR0aGlzLmIgPSBNYXRoLnNxcnQoIHRoaXMuYiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRIZXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiAoIHRoaXMuciAqIDI1NSApIDw8IDE2IF4gKCB0aGlzLmcgKiAyNTUgKSA8PCA4IF4gKCB0aGlzLmIgKiAyNTUgKSA8PCAwO1xuXG5cdH0sXG5cblx0Z2V0SGV4U3RyaW5nOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gKCAnMDAwMDAwJyArIHRoaXMuZ2V0SGV4KCkudG9TdHJpbmcoIDE2ICkgKS5zbGljZSggLSA2ICk7XG5cblx0fSxcblxuXHRnZXRIU0w6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHQvLyBoLHMsbCByYW5nZXMgYXJlIGluIDAuMCAtIDEuMFxuXG5cdFx0dmFyIGhzbCA9IG9wdGlvbmFsVGFyZ2V0IHx8IHsgaDogMCwgczogMCwgbDogMCB9O1xuXG5cdFx0dmFyIHIgPSB0aGlzLnIsIGcgPSB0aGlzLmcsIGIgPSB0aGlzLmI7XG5cblx0XHR2YXIgbWF4ID0gTWF0aC5tYXgoIHIsIGcsIGIgKTtcblx0XHR2YXIgbWluID0gTWF0aC5taW4oIHIsIGcsIGIgKTtcblxuXHRcdHZhciBodWUsIHNhdHVyYXRpb247XG5cdFx0dmFyIGxpZ2h0bmVzcyA9ICggbWluICsgbWF4ICkgLyAyLjA7XG5cblx0XHRpZiAoIG1pbiA9PT0gbWF4ICkge1xuXG5cdFx0XHRodWUgPSAwO1xuXHRcdFx0c2F0dXJhdGlvbiA9IDA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgZGVsdGEgPSBtYXggLSBtaW47XG5cblx0XHRcdHNhdHVyYXRpb24gPSBsaWdodG5lc3MgPD0gMC41ID8gZGVsdGEgLyAoIG1heCArIG1pbiApIDogZGVsdGEgLyAoIDIgLSBtYXggLSBtaW4gKTtcblxuXHRcdFx0c3dpdGNoICggbWF4ICkge1xuXG5cdFx0XHRcdGNhc2UgcjogaHVlID0gKCBnIC0gYiApIC8gZGVsdGEgKyAoIGcgPCBiID8gNiA6IDAgKTsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgZzogaHVlID0gKCBiIC0gciApIC8gZGVsdGEgKyAyOyBicmVhaztcblx0XHRcdFx0Y2FzZSBiOiBodWUgPSAoIHIgLSBnICkgLyBkZWx0YSArIDQ7IGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdGh1ZSAvPSA2O1xuXG5cdFx0fVxuXG5cdFx0aHNsLmggPSBodWU7XG5cdFx0aHNsLnMgPSBzYXR1cmF0aW9uO1xuXHRcdGhzbC5sID0gbGlnaHRuZXNzO1xuXG5cdFx0cmV0dXJuIGhzbDtcblxuXHR9LFxuXG5cdGdldFN0eWxlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gJ3JnYignICsgKCAoIHRoaXMuciAqIDI1NSApIHwgMCApICsgJywnICsgKCAoIHRoaXMuZyAqIDI1NSApIHwgMCApICsgJywnICsgKCAoIHRoaXMuYiAqIDI1NSApIHwgMCApICsgJyknO1xuXG5cdH0sXG5cblx0b2Zmc2V0SFNMOiBmdW5jdGlvbiAoIGgsIHMsIGwgKSB7XG5cblx0XHR2YXIgaHNsID0gdGhpcy5nZXRIU0woKTtcblxuXHRcdGhzbC5oICs9IGg7IGhzbC5zICs9IHM7IGhzbC5sICs9IGw7XG5cblx0XHR0aGlzLnNldEhTTCggaHNsLmgsIGhzbC5zLCBoc2wubCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGQ6IGZ1bmN0aW9uICggY29sb3IgKSB7XG5cblx0XHR0aGlzLnIgKz0gY29sb3Iucjtcblx0XHR0aGlzLmcgKz0gY29sb3IuZztcblx0XHR0aGlzLmIgKz0gY29sb3IuYjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkQ29sb3JzOiBmdW5jdGlvbiAoIGNvbG9yMSwgY29sb3IyICkge1xuXG5cdFx0dGhpcy5yID0gY29sb3IxLnIgKyBjb2xvcjIucjtcblx0XHR0aGlzLmcgPSBjb2xvcjEuZyArIGNvbG9yMi5nO1xuXHRcdHRoaXMuYiA9IGNvbG9yMS5iICsgY29sb3IyLmI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFNjYWxhcjogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0dGhpcy5yICs9IHM7XG5cdFx0dGhpcy5nICs9IHM7XG5cdFx0dGhpcy5iICs9IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YjogZnVuY3Rpb24oIGNvbG9yICkge1xuXG5cdFx0dGhpcy5yID0gTWF0aC5tYXgoIDAsIHRoaXMuciAtIGNvbG9yLnIgKTtcblx0XHR0aGlzLmcgPSBNYXRoLm1heCggMCwgdGhpcy5nIC0gY29sb3IuZyApO1xuXHRcdHRoaXMuYiA9IE1hdGgubWF4KCAwLCB0aGlzLmIgLSBjb2xvci5iICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5OiBmdW5jdGlvbiAoIGNvbG9yICkge1xuXG5cdFx0dGhpcy5yICo9IGNvbG9yLnI7XG5cdFx0dGhpcy5nICo9IGNvbG9yLmc7XG5cdFx0dGhpcy5iICo9IGNvbG9yLmI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnIgKj0gcztcblx0XHR0aGlzLmcgKj0gcztcblx0XHR0aGlzLmIgKj0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bGVycDogZnVuY3Rpb24gKCBjb2xvciwgYWxwaGEgKSB7XG5cblx0XHR0aGlzLnIgKz0gKCBjb2xvci5yIC0gdGhpcy5yICkgKiBhbHBoYTtcblx0XHR0aGlzLmcgKz0gKCBjb2xvci5nIC0gdGhpcy5nICkgKiBhbHBoYTtcblx0XHR0aGlzLmIgKz0gKCBjb2xvci5iIC0gdGhpcy5iICkgKiBhbHBoYTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIGMgKSB7XG5cblx0XHRyZXR1cm4gKCBjLnIgPT09IHRoaXMuciApICYmICggYy5nID09PSB0aGlzLmcgKSAmJiAoIGMuYiA9PT0gdGhpcy5iICk7XG5cblx0fSxcblxuXHRmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dGhpcy5yID0gYXJyYXlbIG9mZnNldCBdO1xuXHRcdHRoaXMuZyA9IGFycmF5WyBvZmZzZXQgKyAxIF07XG5cdFx0dGhpcy5iID0gYXJyYXlbIG9mZnNldCArIDIgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMucjtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy5nO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLmI7XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmdldEhleCgpO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIFVuaWZvcm1zIGxpYnJhcnkgZm9yIHNoYXJlZCB3ZWJnbCBzaGFkZXJzXG4gKi9cblxudmFyIFVuaWZvcm1zTGliID0ge1xuXG5cdGNvbW1vbjoge1xuXG5cdFx0ZGlmZnVzZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweGVlZWVlZSApIH0sXG5cdFx0b3BhY2l0eTogeyB2YWx1ZTogMS4wIH0sXG5cblx0XHRtYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRvZmZzZXRSZXBlYXQ6IHsgdmFsdWU6IG5ldyBWZWN0b3I0KCAwLCAwLCAxLCAxICkgfSxcblxuXHRcdHNwZWN1bGFyTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0YWxwaGFNYXA6IHsgdmFsdWU6IG51bGwgfSxcblxuXHRcdGVudk1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGZsaXBFbnZNYXA6IHsgdmFsdWU6IC0gMSB9LFxuXHRcdHJlZmxlY3Rpdml0eTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0cmVmcmFjdGlvblJhdGlvOiB7IHZhbHVlOiAwLjk4IH1cblxuXHR9LFxuXG5cdGFvbWFwOiB7XG5cblx0XHRhb01hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGFvTWFwSW50ZW5zaXR5OiB7IHZhbHVlOiAxIH1cblxuXHR9LFxuXG5cdGxpZ2h0bWFwOiB7XG5cblx0XHRsaWdodE1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGxpZ2h0TWFwSW50ZW5zaXR5OiB7IHZhbHVlOiAxIH1cblxuXHR9LFxuXG5cdGVtaXNzaXZlbWFwOiB7XG5cblx0XHRlbWlzc2l2ZU1hcDogeyB2YWx1ZTogbnVsbCB9XG5cblx0fSxcblxuXHRidW1wbWFwOiB7XG5cblx0XHRidW1wTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0YnVtcFNjYWxlOiB7IHZhbHVlOiAxIH1cblxuXHR9LFxuXG5cdG5vcm1hbG1hcDoge1xuXG5cdFx0bm9ybWFsTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0bm9ybWFsU2NhbGU6IHsgdmFsdWU6IG5ldyBWZWN0b3IyKCAxLCAxICkgfVxuXG5cdH0sXG5cblx0ZGlzcGxhY2VtZW50bWFwOiB7XG5cblx0XHRkaXNwbGFjZW1lbnRNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRkaXNwbGFjZW1lbnRTY2FsZTogeyB2YWx1ZTogMSB9LFxuXHRcdGRpc3BsYWNlbWVudEJpYXM6IHsgdmFsdWU6IDAgfVxuXG5cdH0sXG5cblx0cm91Z2huZXNzbWFwOiB7XG5cblx0XHRyb3VnaG5lc3NNYXA6IHsgdmFsdWU6IG51bGwgfVxuXG5cdH0sXG5cblx0bWV0YWxuZXNzbWFwOiB7XG5cblx0XHRtZXRhbG5lc3NNYXA6IHsgdmFsdWU6IG51bGwgfVxuXG5cdH0sXG5cblx0Z3JhZGllbnRtYXA6IHtcblxuXHRcdGdyYWRpZW50TWFwOiB7IHZhbHVlOiBudWxsIH1cblxuXHR9LFxuXG5cdGZvZzoge1xuXG5cdFx0Zm9nRGVuc2l0eTogeyB2YWx1ZTogMC4wMDAyNSB9LFxuXHRcdGZvZ05lYXI6IHsgdmFsdWU6IDEgfSxcblx0XHRmb2dGYXI6IHsgdmFsdWU6IDIwMDAgfSxcblx0XHRmb2dDb2xvcjogeyB2YWx1ZTogbmV3IENvbG9yKCAweGZmZmZmZiApIH1cblxuXHR9LFxuXG5cdGxpZ2h0czoge1xuXG5cdFx0YW1iaWVudExpZ2h0Q29sb3I6IHsgdmFsdWU6IFtdIH0sXG5cblx0XHRkaXJlY3Rpb25hbExpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdGRpcmVjdGlvbjoge30sXG5cdFx0XHRjb2xvcjoge30sXG5cblx0XHRcdHNoYWRvdzoge30sXG5cdFx0XHRzaGFkb3dCaWFzOiB7fSxcblx0XHRcdHNoYWRvd1JhZGl1czoge30sXG5cdFx0XHRzaGFkb3dNYXBTaXplOiB7fVxuXHRcdH0gfSxcblxuXHRcdGRpcmVjdGlvbmFsU2hhZG93TWFwOiB7IHZhbHVlOiBbXSB9LFxuXHRcdGRpcmVjdGlvbmFsU2hhZG93TWF0cml4OiB7IHZhbHVlOiBbXSB9LFxuXG5cdFx0c3BvdExpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdGNvbG9yOiB7fSxcblx0XHRcdHBvc2l0aW9uOiB7fSxcblx0XHRcdGRpcmVjdGlvbjoge30sXG5cdFx0XHRkaXN0YW5jZToge30sXG5cdFx0XHRjb25lQ29zOiB7fSxcblx0XHRcdHBlbnVtYnJhQ29zOiB7fSxcblx0XHRcdGRlY2F5OiB7fSxcblxuXHRcdFx0c2hhZG93OiB7fSxcblx0XHRcdHNoYWRvd0JpYXM6IHt9LFxuXHRcdFx0c2hhZG93UmFkaXVzOiB7fSxcblx0XHRcdHNoYWRvd01hcFNpemU6IHt9XG5cdFx0fSB9LFxuXG5cdFx0c3BvdFNoYWRvd01hcDogeyB2YWx1ZTogW10gfSxcblx0XHRzcG90U2hhZG93TWF0cml4OiB7IHZhbHVlOiBbXSB9LFxuXG5cdFx0cG9pbnRMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7XG5cdFx0XHRjb2xvcjoge30sXG5cdFx0XHRwb3NpdGlvbjoge30sXG5cdFx0XHRkZWNheToge30sXG5cdFx0XHRkaXN0YW5jZToge30sXG5cblx0XHRcdHNoYWRvdzoge30sXG5cdFx0XHRzaGFkb3dCaWFzOiB7fSxcblx0XHRcdHNoYWRvd1JhZGl1czoge30sXG5cdFx0XHRzaGFkb3dNYXBTaXplOiB7fVxuXHRcdH0gfSxcblxuXHRcdHBvaW50U2hhZG93TWFwOiB7IHZhbHVlOiBbXSB9LFxuXHRcdHBvaW50U2hhZG93TWF0cml4OiB7IHZhbHVlOiBbXSB9LFxuXG5cdFx0aGVtaXNwaGVyZUxpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdGRpcmVjdGlvbjoge30sXG5cdFx0XHRza3lDb2xvcjoge30sXG5cdFx0XHRncm91bmRDb2xvcjoge31cblx0XHR9IH0sXG5cblx0XHQvLyBUT0RPIChhYmVsbmF0aW9uKTogUmVjdEFyZWFMaWdodCBCUkRGIGRhdGEgbmVlZHMgdG8gYmUgbW92ZWQgZnJvbSBleGFtcGxlIHRvIG1haW4gc3JjXG5cdFx0cmVjdEFyZWFMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7XG5cdFx0XHRjb2xvcjoge30sXG5cdFx0XHRwb3NpdGlvbjoge30sXG5cdFx0XHR3aWR0aDoge30sXG5cdFx0XHRoZWlnaHQ6IHt9XG5cdFx0fSB9XG5cblx0fSxcblxuXHRwb2ludHM6IHtcblxuXHRcdGRpZmZ1c2U6IHsgdmFsdWU6IG5ldyBDb2xvciggMHhlZWVlZWUgKSB9LFxuXHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9LFxuXHRcdHNpemU6IHsgdmFsdWU6IDEuMCB9LFxuXHRcdHNjYWxlOiB7IHZhbHVlOiAxLjAgfSxcblx0XHRtYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRvZmZzZXRSZXBlYXQ6IHsgdmFsdWU6IG5ldyBWZWN0b3I0KCAwLCAwLCAxLCAxICkgfVxuXG5cdH1cblxufTtcblxuLyoqXG4gKiBVbmlmb3JtIFV0aWxpdGllc1xuICovXG5cbnZhciBVbmlmb3Jtc1V0aWxzID0ge1xuXG5cdG1lcmdlOiBmdW5jdGlvbiAoIHVuaWZvcm1zICkge1xuXG5cdFx0dmFyIG1lcmdlZCA9IHt9O1xuXG5cdFx0Zm9yICggdmFyIHUgPSAwOyB1IDwgdW5pZm9ybXMubGVuZ3RoOyB1ICsrICkge1xuXG5cdFx0XHR2YXIgdG1wID0gdGhpcy5jbG9uZSggdW5pZm9ybXNbIHUgXSApO1xuXG5cdFx0XHRmb3IgKCB2YXIgcCBpbiB0bXAgKSB7XG5cblx0XHRcdFx0bWVyZ2VkWyBwIF0gPSB0bXBbIHAgXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1lcmdlZDtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoIHVuaWZvcm1zX3NyYyApIHtcblxuXHRcdHZhciB1bmlmb3Jtc19kc3QgPSB7fTtcblxuXHRcdGZvciAoIHZhciB1IGluIHVuaWZvcm1zX3NyYyApIHtcblxuXHRcdFx0dW5pZm9ybXNfZHN0WyB1IF0gPSB7fTtcblxuXHRcdFx0Zm9yICggdmFyIHAgaW4gdW5pZm9ybXNfc3JjWyB1IF0gKSB7XG5cblx0XHRcdFx0dmFyIHBhcmFtZXRlcl9zcmMgPSB1bmlmb3Jtc19zcmNbIHUgXVsgcCBdO1xuXG5cdFx0XHRcdGlmICggcGFyYW1ldGVyX3NyYyAmJiAoIHBhcmFtZXRlcl9zcmMuaXNDb2xvciB8fFxuXHRcdFx0XHRcdHBhcmFtZXRlcl9zcmMuaXNNYXRyaXgzIHx8IHBhcmFtZXRlcl9zcmMuaXNNYXRyaXg0IHx8XG5cdFx0XHRcdFx0cGFyYW1ldGVyX3NyYy5pc1ZlY3RvcjIgfHwgcGFyYW1ldGVyX3NyYy5pc1ZlY3RvcjMgfHwgcGFyYW1ldGVyX3NyYy5pc1ZlY3RvcjQgfHxcblx0XHRcdFx0XHRwYXJhbWV0ZXJfc3JjLmlzVGV4dHVyZSApICkge1xuXG5cdFx0XHRcdFx0dW5pZm9ybXNfZHN0WyB1IF1bIHAgXSA9IHBhcmFtZXRlcl9zcmMuY2xvbmUoKTtcblxuXHRcdFx0XHR9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KCBwYXJhbWV0ZXJfc3JjICkgKSB7XG5cblx0XHRcdFx0XHR1bmlmb3Jtc19kc3RbIHUgXVsgcCBdID0gcGFyYW1ldGVyX3NyYy5zbGljZSgpO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR1bmlmb3Jtc19kc3RbIHUgXVsgcCBdID0gcGFyYW1ldGVyX3NyYztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB1bmlmb3Jtc19kc3Q7XG5cblx0fVxuXG59O1xuXG52YXIgYWxwaGFtYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQUxQSEFNQVBcXG5cXHRkaWZmdXNlQ29sb3IuYSAqPSB0ZXh0dXJlMkQoIGFscGhhTWFwLCB2VXYgKS5nO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgYWxwaGFtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9BTFBIQU1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgYWxwaGF0ZXN0X2ZyYWdtZW50ID0gXCIjaWZkZWYgQUxQSEFURVNUXFxuXFx0aWYgKCBkaWZmdXNlQ29sb3IuYSA8IEFMUEhBVEVTVCApIGRpc2NhcmQ7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBhb21hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9BT01BUFxcblxcdGZsb2F0IGFtYmllbnRPY2NsdXNpb24gPSAoIHRleHR1cmUyRCggYW9NYXAsIHZVdjIgKS5yIC0gMS4wICkgKiBhb01hcEludGVuc2l0eSArIDEuMDtcXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gYW1iaWVudE9jY2x1c2lvbjtcXG5cXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFBIWVNJQ0FMIClcXG5cXHRcXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciAqPSBjb21wdXRlU3BlY3VsYXJPY2NsdXNpb24oIGRvdE5WLCBhbWJpZW50T2NjbHVzaW9uLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgYW9tYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9BT01BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGFvTWFwO1xcblxcdHVuaWZvcm0gZmxvYXQgYW9NYXBJbnRlbnNpdHk7XFxuI2VuZGlmXCI7XG5cbnZhciBiZWdpbl92ZXJ0ZXggPSBcIlxcbnZlYzMgdHJhbnNmb3JtZWQgPSB2ZWMzKCBwb3NpdGlvbiApO1xcblwiO1xuXG52YXIgYmVnaW5ub3JtYWxfdmVydGV4ID0gXCJcXG52ZWMzIG9iamVjdE5vcm1hbCA9IHZlYzMoIG5vcm1hbCApO1xcblwiO1xuXG52YXIgYnNkZnMgPSBcImZsb2F0IHB1bmN0dWFsTGlnaHRJbnRlbnNpdHlUb0lycmFkaWFuY2VGYWN0b3IoIGNvbnN0IGluIGZsb2F0IGxpZ2h0RGlzdGFuY2UsIGNvbnN0IGluIGZsb2F0IGN1dG9mZkRpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBkZWNheUV4cG9uZW50ICkge1xcblxcdGlmKCBkZWNheUV4cG9uZW50ID4gMC4wICkge1xcbiNpZiBkZWZpbmVkICggUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUUyApXFxuXFx0XFx0ZmxvYXQgZGlzdGFuY2VGYWxsb2ZmID0gMS4wIC8gbWF4KCBwb3coIGxpZ2h0RGlzdGFuY2UsIGRlY2F5RXhwb25lbnQgKSwgMC4wMSApO1xcblxcdFxcdGZsb2F0IG1heERpc3RhbmNlQ3V0b2ZmRmFjdG9yID0gcG93Miggc2F0dXJhdGUoIDEuMCAtIHBvdzQoIGxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSApICkgKTtcXG5cXHRcXHRyZXR1cm4gZGlzdGFuY2VGYWxsb2ZmICogbWF4RGlzdGFuY2VDdXRvZmZGYWN0b3I7XFxuI2Vsc2VcXG5cXHRcXHRyZXR1cm4gcG93KCBzYXR1cmF0ZSggLWxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSArIDEuMCApLCBkZWNheUV4cG9uZW50ICk7XFxuI2VuZGlmXFxuXFx0fVxcblxcdHJldHVybiAxLjA7XFxufVxcbnZlYzMgQlJERl9EaWZmdXNlX0xhbWJlcnQoIGNvbnN0IGluIHZlYzMgZGlmZnVzZUNvbG9yICkge1xcblxcdHJldHVybiBSRUNJUFJPQ0FMX1BJICogZGlmZnVzZUNvbG9yO1xcbn1cXG52ZWMzIEZfU2NobGljayggY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBkb3RMSCApIHtcXG5cXHRmbG9hdCBmcmVzbmVsID0gZXhwMiggKCAtNS41NTQ3MyAqIGRvdExIIC0gNi45ODMxNiApICogZG90TEggKTtcXG5cXHRyZXR1cm4gKCAxLjAgLSBzcGVjdWxhckNvbG9yICkgKiBmcmVzbmVsICsgc3BlY3VsYXJDb2xvcjtcXG59XFxuZmxvYXQgR19HR1hfU21pdGgoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XFxuXFx0ZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApO1xcblxcdGZsb2F0IGdsID0gZG90TkwgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5MICkgKTtcXG5cXHRmbG9hdCBndiA9IGRvdE5WICsgc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROViApICk7XFxuXFx0cmV0dXJuIDEuMCAvICggZ2wgKiBndiApO1xcbn1cXG5mbG9hdCBHX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XFxuXFx0ZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApO1xcblxcdGZsb2F0IGd2ID0gZG90TkwgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcXG5cXHRmbG9hdCBnbCA9IGRvdE5WICogc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XFxuXFx0cmV0dXJuIDAuNSAvIG1heCggZ3YgKyBnbCwgRVBTSUxPTiApO1xcbn1cXG5mbG9hdCBEX0dHWCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkge1xcblxcdGZsb2F0IGEyID0gcG93MiggYWxwaGEgKTtcXG5cXHRmbG9hdCBkZW5vbSA9IHBvdzIoIGRvdE5IICkgKiAoIGEyIC0gMS4wICkgKyAxLjA7XFxuXFx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBhMiAvIHBvdzIoIGRlbm9tICk7XFxufVxcbnZlYzMgQlJERl9TcGVjdWxhcl9HR1goIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XFxuXFx0ZmxvYXQgYWxwaGEgPSBwb3cyKCByb3VnaG5lc3MgKTtcXG5cXHR2ZWMzIGhhbGZEaXIgPSBub3JtYWxpemUoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uICsgZ2VvbWV0cnkudmlld0RpciApO1xcblxcdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiApICk7XFxuXFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGdlb21ldHJ5LnZpZXdEaXIgKSApO1xcblxcdGZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoYWxmRGlyICkgKTtcXG5cXHRmbG9hdCBkb3RMSCA9IHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcXG5cXHR2ZWMzIEYgPSBGX1NjaGxpY2soIHNwZWN1bGFyQ29sb3IsIGRvdExIICk7XFxuXFx0ZmxvYXQgRyA9IEdfR0dYX1NtaXRoQ29ycmVsYXRlZCggYWxwaGEsIGRvdE5MLCBkb3ROViApO1xcblxcdGZsb2F0IEQgPSBEX0dHWCggYWxwaGEsIGRvdE5IICk7XFxuXFx0cmV0dXJuIEYgKiAoIEcgKiBEICk7XFxufVxcbnZlYzIgTFRDX1V2KCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xcblxcdGNvbnN0IGZsb2F0IExVVF9TSVpFICA9IDY0LjA7XFxuXFx0Y29uc3QgZmxvYXQgTFVUX1NDQUxFID0gKCBMVVRfU0laRSAtIDEuMCApIC8gTFVUX1NJWkU7XFxuXFx0Y29uc3QgZmxvYXQgTFVUX0JJQVMgID0gMC41IC8gTFVUX1NJWkU7XFxuXFx0ZmxvYXQgdGhldGEgPSBhY29zKCBkb3QoIE4sIFYgKSApO1xcblxcdHZlYzIgdXYgPSB2ZWMyKFxcblxcdFxcdHNxcnQoIHNhdHVyYXRlKCByb3VnaG5lc3MgKSApLFxcblxcdFxcdHNhdHVyYXRlKCB0aGV0YSAvICggMC41ICogUEkgKSApICk7XFxuXFx0dXYgPSB1diAqIExVVF9TQ0FMRSArIExVVF9CSUFTO1xcblxcdHJldHVybiB1djtcXG59XFxuZmxvYXQgTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIGYgKSB7XFxuXFx0ZmxvYXQgbCA9IGxlbmd0aCggZiApO1xcblxcdHJldHVybiBtYXgoICggbCAqIGwgKyBmLnogKSAvICggbCArIDEuMCApLCAwLjAgKTtcXG59XFxudmVjMyBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvbnN0IGluIHZlYzMgdjEsIGNvbnN0IGluIHZlYzMgdjIgKSB7XFxuXFx0ZmxvYXQgeCA9IGRvdCggdjEsIHYyICk7XFxuXFx0ZmxvYXQgeSA9IGFicyggeCApO1xcblxcdGZsb2F0IGEgPSAwLjg2MjY3ICsgKDAuNDk3ODggKyAwLjAxNDM2ICogeSApICogeTtcXG5cXHRmbG9hdCBiID0gMy40NTA2OCArICg0LjE4ODE0ICsgeSkgKiB5O1xcblxcdGZsb2F0IHYgPSBhIC8gYjtcXG5cXHRmbG9hdCB0aGV0YV9zaW50aGV0YSA9ICh4ID4gMC4wKSA/IHYgOiAwLjUgKiBpbnZlcnNlc3FydCggMS4wIC0geCAqIHggKSAtIHY7XFxuXFx0cmV0dXJuIGNyb3NzKCB2MSwgdjIgKSAqIHRoZXRhX3NpbnRoZXRhO1xcbn1cXG52ZWMzIExUQ19FdmFsdWF0ZSggY29uc3QgaW4gdmVjMyBOLCBjb25zdCBpbiB2ZWMzIFYsIGNvbnN0IGluIHZlYzMgUCwgY29uc3QgaW4gbWF0MyBtSW52LCBjb25zdCBpbiB2ZWMzIHJlY3RDb29yZHNbIDQgXSApIHtcXG5cXHR2ZWMzIHYxID0gcmVjdENvb3Jkc1sgMSBdIC0gcmVjdENvb3Jkc1sgMCBdO1xcblxcdHZlYzMgdjIgPSByZWN0Q29vcmRzWyAzIF0gLSByZWN0Q29vcmRzWyAwIF07XFxuXFx0dmVjMyBsaWdodE5vcm1hbCA9IGNyb3NzKCB2MSwgdjIgKTtcXG5cXHRpZiggZG90KCBsaWdodE5vcm1hbCwgUCAtIHJlY3RDb29yZHNbIDAgXSApIDwgMC4wICkgcmV0dXJuIHZlYzMoIDAuMCApO1xcblxcdHZlYzMgVDEsIFQyO1xcblxcdFQxID0gbm9ybWFsaXplKCBWIC0gTiAqIGRvdCggViwgTiApICk7XFxuXFx0VDIgPSAtIGNyb3NzKCBOLCBUMSApO1xcblxcdG1hdDMgbWF0ID0gbUludiAqIHRyYW5zcG9zZSggbWF0MyggVDEsIFQyLCBOICkgKTtcXG5cXHR2ZWMzIGNvb3Jkc1sgNCBdO1xcblxcdGNvb3Jkc1sgMCBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAwIF0gLSBQICk7XFxuXFx0Y29vcmRzWyAxIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDEgXSAtIFAgKTtcXG5cXHRjb29yZHNbIDIgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMiBdIC0gUCApO1xcblxcdGNvb3Jkc1sgMyBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAzIF0gLSBQICk7XFxuXFx0Y29vcmRzWyAwIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMCBdICk7XFxuXFx0Y29vcmRzWyAxIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMSBdICk7XFxuXFx0Y29vcmRzWyAyIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMiBdICk7XFxuXFx0Y29vcmRzWyAzIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMyBdICk7XFxuXFx0dmVjMyB2ZWN0b3JGb3JtRmFjdG9yID0gdmVjMyggMC4wICk7XFxuXFx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMCBdLCBjb29yZHNbIDEgXSApO1xcblxcdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDEgXSwgY29vcmRzWyAyIF0gKTtcXG5cXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAyIF0sIGNvb3Jkc1sgMyBdICk7XFxuXFx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMyBdLCBjb29yZHNbIDAgXSApO1xcblxcdHZlYzMgcmVzdWx0ID0gdmVjMyggTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCB2ZWN0b3JGb3JtRmFjdG9yICkgKTtcXG5cXHRyZXR1cm4gcmVzdWx0O1xcbn1cXG52ZWMzIEJSREZfU3BlY3VsYXJfR0dYX0Vudmlyb25tZW50KCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcXG5cXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XFxuXFx0Y29uc3QgdmVjNCBjMCA9IHZlYzQoIC0gMSwgLSAwLjAyNzUsIC0gMC41NzIsIDAuMDIyICk7XFxuXFx0Y29uc3QgdmVjNCBjMSA9IHZlYzQoIDEsIDAuMDQyNSwgMS4wNCwgLSAwLjA0ICk7XFxuXFx0dmVjNCByID0gcm91Z2huZXNzICogYzAgKyBjMTtcXG5cXHRmbG9hdCBhMDA0ID0gbWluKCByLnggKiByLngsIGV4cDIoIC0gOS4yOCAqIGRvdE5WICkgKSAqIHIueCArIHIueTtcXG5cXHR2ZWMyIEFCID0gdmVjMiggLTEuMDQsIDEuMDQgKSAqIGEwMDQgKyByLnp3O1xcblxcdHJldHVybiBzcGVjdWxhckNvbG9yICogQUIueCArIEFCLnk7XFxufVxcbmZsb2F0IEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKSB7XFxuXFx0cmV0dXJuIDAuMjU7XFxufVxcbmZsb2F0IERfQmxpbm5QaG9uZyggY29uc3QgaW4gZmxvYXQgc2hpbmluZXNzLCBjb25zdCBpbiBmbG9hdCBkb3ROSCApIHtcXG5cXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqICggc2hpbmluZXNzICogMC41ICsgMS4wICkgKiBwb3coIGRvdE5ILCBzaGluaW5lc3MgKTtcXG59XFxudmVjMyBCUkRGX1NwZWN1bGFyX0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzaGluaW5lc3MgKSB7XFxuXFx0dmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiArIGdlb21ldHJ5LnZpZXdEaXIgKTtcXG5cXHRmbG9hdCBkb3ROSCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgaGFsZkRpciApICk7XFxuXFx0ZmxvYXQgZG90TEggPSBzYXR1cmF0ZSggZG90KCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiwgaGFsZkRpciApICk7XFxuXFx0dmVjMyBGID0gRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCBkb3RMSCApO1xcblxcdGZsb2F0IEcgPSBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICk7XFxuXFx0ZmxvYXQgRCA9IERfQmxpbm5QaG9uZyggc2hpbmluZXNzLCBkb3ROSCApO1xcblxcdHJldHVybiBGICogKCBHICogRCApO1xcbn1cXG5mbG9hdCBHR1hSb3VnaG5lc3NUb0JsaW5uRXhwb25lbnQoIGNvbnN0IGluIGZsb2F0IGdneFJvdWdobmVzcyApIHtcXG5cXHRyZXR1cm4gKCAyLjAgLyBwb3cyKCBnZ3hSb3VnaG5lc3MgKyAwLjAwMDEgKSAtIDIuMCApO1xcbn1cXG5mbG9hdCBCbGlubkV4cG9uZW50VG9HR1hSb3VnaG5lc3MoIGNvbnN0IGluIGZsb2F0IGJsaW5uRXhwb25lbnQgKSB7XFxuXFx0cmV0dXJuIHNxcnQoIDIuMCAvICggYmxpbm5FeHBvbmVudCArIDIuMCApICk7XFxufVxcblwiO1xuXG52YXIgYnVtcG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0JVTVBNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBidW1wTWFwO1xcblxcdHVuaWZvcm0gZmxvYXQgYnVtcFNjYWxlO1xcblxcdHZlYzIgZEhkeHlfZndkKCkge1xcblxcdFxcdHZlYzIgZFNUZHggPSBkRmR4KCB2VXYgKTtcXG5cXHRcXHR2ZWMyIGRTVGR5ID0gZEZkeSggdlV2ICk7XFxuXFx0XFx0ZmxvYXQgSGxsID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2VXYgKS54O1xcblxcdFxcdGZsb2F0IGRCeCA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICsgZFNUZHggKS54IC0gSGxsO1xcblxcdFxcdGZsb2F0IGRCeSA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICsgZFNUZHkgKS54IC0gSGxsO1xcblxcdFxcdHJldHVybiB2ZWMyKCBkQngsIGRCeSApO1xcblxcdH1cXG5cXHR2ZWMzIHBlcnR1cmJOb3JtYWxBcmIoIHZlYzMgc3VyZl9wb3MsIHZlYzMgc3VyZl9ub3JtLCB2ZWMyIGRIZHh5ICkge1xcblxcdFxcdHZlYzMgdlNpZ21hWCA9IGRGZHgoIHN1cmZfcG9zICk7XFxuXFx0XFx0dmVjMyB2U2lnbWFZID0gZEZkeSggc3VyZl9wb3MgKTtcXG5cXHRcXHR2ZWMzIHZOID0gc3VyZl9ub3JtO1xcblxcdFxcdHZlYzMgUjEgPSBjcm9zcyggdlNpZ21hWSwgdk4gKTtcXG5cXHRcXHR2ZWMzIFIyID0gY3Jvc3MoIHZOLCB2U2lnbWFYICk7XFxuXFx0XFx0ZmxvYXQgZkRldCA9IGRvdCggdlNpZ21hWCwgUjEgKTtcXG5cXHRcXHR2ZWMzIHZHcmFkID0gc2lnbiggZkRldCApICogKCBkSGR4eS54ICogUjEgKyBkSGR4eS55ICogUjIgKTtcXG5cXHRcXHRyZXR1cm4gbm9ybWFsaXplKCBhYnMoIGZEZXQgKSAqIHN1cmZfbm9ybSAtIHZHcmFkICk7XFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50ID0gXCIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBVTklPTl9DTElQUElOR19QTEFORVM7ICsrIGkgKSB7XFxuXFx0XFx0dmVjNCBwbGFuZSA9IGNsaXBwaW5nUGxhbmVzWyBpIF07XFxuXFx0XFx0aWYgKCBkb3QoIHZWaWV3UG9zaXRpb24sIHBsYW5lLnh5eiApID4gcGxhbmUudyApIGRpc2NhcmQ7XFxuXFx0fVxcblxcdFxcdFxcblxcdCNpZiBVTklPTl9DTElQUElOR19QTEFORVMgPCBOVU1fQ0xJUFBJTkdfUExBTkVTXFxuXFx0XFx0Ym9vbCBjbGlwcGVkID0gdHJ1ZTtcXG5cXHRcXHRmb3IgKCBpbnQgaSA9IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSA8IE5VTV9DTElQUElOR19QTEFORVM7ICsrIGkgKSB7XFxuXFx0XFx0XFx0dmVjNCBwbGFuZSA9IGNsaXBwaW5nUGxhbmVzWyBpIF07XFxuXFx0XFx0XFx0Y2xpcHBlZCA9ICggZG90KCB2Vmlld1Bvc2l0aW9uLCBwbGFuZS54eXogKSA+IHBsYW5lLncgKSAmJiBjbGlwcGVkO1xcblxcdFxcdH1cXG5cXHRcXHRpZiAoIGNsaXBwZWQgKSBkaXNjYXJkO1xcblxcdFxcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQgPSBcIiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMFxcblxcdCNpZiAhIGRlZmluZWQoIFBIWVNJQ0FMICkgJiYgISBkZWZpbmVkKCBQSE9ORyApXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuXFx0I2VuZGlmXFxuXFx0dW5pZm9ybSB2ZWM0IGNsaXBwaW5nUGxhbmVzWyBOVU1fQ0xJUFBJTkdfUExBTkVTIF07XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXggPSBcIiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMCAmJiAhIGRlZmluZWQoIFBIWVNJQ0FMICkgJiYgISBkZWZpbmVkKCBQSE9ORyApXFxuXFx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBjbGlwcGluZ19wbGFuZXNfdmVydGV4ID0gXCIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDAgJiYgISBkZWZpbmVkKCBQSFlTSUNBTCApICYmICEgZGVmaW5lZCggUEhPTkcgKVxcblxcdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xcbiNlbmRpZlxcblwiO1xuXG52YXIgY29sb3JfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQ09MT1JcXG5cXHRkaWZmdXNlQ29sb3IucmdiICo9IHZDb2xvcjtcXG4jZW5kaWZcIjtcblxudmFyIGNvbG9yX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQ09MT1JcXG5cXHR2YXJ5aW5nIHZlYzMgdkNvbG9yO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgY29sb3JfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfQ09MT1JcXG5cXHR2YXJ5aW5nIHZlYzMgdkNvbG9yO1xcbiNlbmRpZlwiO1xuXG52YXIgY29sb3JfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0NPTE9SXFxuXFx0dkNvbG9yLnh5eiA9IGNvbG9yLnh5ejtcXG4jZW5kaWZcIjtcblxudmFyIGNvbW1vbiA9IFwiI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU5XFxuI2RlZmluZSBQSTIgNi4yODMxODUzMDcxOFxcbiNkZWZpbmUgUElfSEFMRiAxLjU3MDc5NjMyNjc5NDlcXG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkgMC4zMTgzMDk4ODYxOFxcbiNkZWZpbmUgUkVDSVBST0NBTF9QSTIgMC4xNTkxNTQ5NFxcbiNkZWZpbmUgTE9HMiAxLjQ0MjY5NVxcbiNkZWZpbmUgRVBTSUxPTiAxZS02XFxuI2RlZmluZSBzYXR1cmF0ZShhKSBjbGFtcCggYSwgMC4wLCAxLjAgKVxcbiNkZWZpbmUgd2hpdGVDb21wbGltZW50KGEpICggMS4wIC0gc2F0dXJhdGUoIGEgKSApXFxuZmxvYXQgcG93MiggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeDsgfVxcbmZsb2F0IHBvdzMoIGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4KngqeDsgfVxcbmZsb2F0IHBvdzQoIGNvbnN0IGluIGZsb2F0IHggKSB7IGZsb2F0IHgyID0geCp4OyByZXR1cm4geDIqeDI7IH1cXG5mbG9hdCBhdmVyYWdlKCBjb25zdCBpbiB2ZWMzIGNvbG9yICkgeyByZXR1cm4gZG90KCBjb2xvciwgdmVjMyggMC4zMzMzICkgKTsgfVxcbmhpZ2hwIGZsb2F0IHJhbmQoIGNvbnN0IGluIHZlYzIgdXYgKSB7XFxuXFx0Y29uc3QgaGlnaHAgZmxvYXQgYSA9IDEyLjk4OTgsIGIgPSA3OC4yMzMsIGMgPSA0Mzc1OC41NDUzO1xcblxcdGhpZ2hwIGZsb2F0IGR0ID0gZG90KCB1di54eSwgdmVjMiggYSxiICkgKSwgc24gPSBtb2QoIGR0LCBQSSApO1xcblxcdHJldHVybiBmcmFjdChzaW4oc24pICogYyk7XFxufVxcbnN0cnVjdCBJbmNpZGVudExpZ2h0IHtcXG5cXHR2ZWMzIGNvbG9yO1xcblxcdHZlYzMgZGlyZWN0aW9uO1xcblxcdGJvb2wgdmlzaWJsZTtcXG59O1xcbnN0cnVjdCBSZWZsZWN0ZWRMaWdodCB7XFxuXFx0dmVjMyBkaXJlY3REaWZmdXNlO1xcblxcdHZlYzMgZGlyZWN0U3BlY3VsYXI7XFxuXFx0dmVjMyBpbmRpcmVjdERpZmZ1c2U7XFxuXFx0dmVjMyBpbmRpcmVjdFNwZWN1bGFyO1xcbn07XFxuc3RydWN0IEdlb21ldHJpY0NvbnRleHQge1xcblxcdHZlYzMgcG9zaXRpb247XFxuXFx0dmVjMyBub3JtYWw7XFxuXFx0dmVjMyB2aWV3RGlyO1xcbn07XFxudmVjMyB0cmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcXG5cXHRyZXR1cm4gbm9ybWFsaXplKCAoIG1hdHJpeCAqIHZlYzQoIGRpciwgMC4wICkgKS54eXogKTtcXG59XFxudmVjMyBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7XFxuXFx0cmV0dXJuIG5vcm1hbGl6ZSggKCB2ZWM0KCBkaXIsIDAuMCApICogbWF0cml4ICkueHl6ICk7XFxufVxcbnZlYzMgcHJvamVjdE9uUGxhbmUoaW4gdmVjMyBwb2ludCwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XFxuXFx0ZmxvYXQgZGlzdGFuY2UgPSBkb3QoIHBsYW5lTm9ybWFsLCBwb2ludCAtIHBvaW50T25QbGFuZSApO1xcblxcdHJldHVybiAtIGRpc3RhbmNlICogcGxhbmVOb3JtYWwgKyBwb2ludDtcXG59XFxuZmxvYXQgc2lkZU9mUGxhbmUoIGluIHZlYzMgcG9pbnQsIGluIHZlYzMgcG9pbnRPblBsYW5lLCBpbiB2ZWMzIHBsYW5lTm9ybWFsICkge1xcblxcdHJldHVybiBzaWduKCBkb3QoIHBvaW50IC0gcG9pbnRPblBsYW5lLCBwbGFuZU5vcm1hbCApICk7XFxufVxcbnZlYzMgbGluZVBsYW5lSW50ZXJzZWN0KCBpbiB2ZWMzIHBvaW50T25MaW5lLCBpbiB2ZWMzIGxpbmVEaXJlY3Rpb24sIGluIHZlYzMgcG9pbnRPblBsYW5lLCBpbiB2ZWMzIHBsYW5lTm9ybWFsICkge1xcblxcdHJldHVybiBsaW5lRGlyZWN0aW9uICogKCBkb3QoIHBsYW5lTm9ybWFsLCBwb2ludE9uUGxhbmUgLSBwb2ludE9uTGluZSApIC8gZG90KCBwbGFuZU5vcm1hbCwgbGluZURpcmVjdGlvbiApICkgKyBwb2ludE9uTGluZTtcXG59XFxubWF0MyB0cmFuc3Bvc2UoIGNvbnN0IGluIG1hdDMgdiApIHtcXG5cXHRtYXQzIHRtcDtcXG5cXHR0bXBbMF0gPSB2ZWMzKHZbMF0ueCwgdlsxXS54LCB2WzJdLngpO1xcblxcdHRtcFsxXSA9IHZlYzModlswXS55LCB2WzFdLnksIHZbMl0ueSk7XFxuXFx0dG1wWzJdID0gdmVjMyh2WzBdLnosIHZbMV0ueiwgdlsyXS56KTtcXG5cXHRyZXR1cm4gdG1wO1xcbn1cXG5cIjtcblxudmFyIGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudCA9IFwiI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVfVVZcXG4jZGVmaW5lIGN1YmVVVl90ZXh0dXJlU2l6ZSAoMTAyNC4wKVxcbmludCBnZXRGYWNlRnJvbURpcmVjdGlvbih2ZWMzIGRpcmVjdGlvbikge1xcblxcdHZlYzMgYWJzRGlyZWN0aW9uID0gYWJzKGRpcmVjdGlvbik7XFxuXFx0aW50IGZhY2UgPSAtMTtcXG5cXHRpZiggYWJzRGlyZWN0aW9uLnggPiBhYnNEaXJlY3Rpb24ueiApIHtcXG5cXHRcXHRpZihhYnNEaXJlY3Rpb24ueCA+IGFic0RpcmVjdGlvbi55IClcXG5cXHRcXHRcXHRmYWNlID0gZGlyZWN0aW9uLnggPiAwLjAgPyAwIDogMztcXG5cXHRcXHRlbHNlXFxuXFx0XFx0XFx0ZmFjZSA9IGRpcmVjdGlvbi55ID4gMC4wID8gMSA6IDQ7XFxuXFx0fVxcblxcdGVsc2Uge1xcblxcdFxcdGlmKGFic0RpcmVjdGlvbi56ID4gYWJzRGlyZWN0aW9uLnkgKVxcblxcdFxcdFxcdGZhY2UgPSBkaXJlY3Rpb24ueiA+IDAuMCA/IDIgOiA1O1xcblxcdFxcdGVsc2VcXG5cXHRcXHRcXHRmYWNlID0gZGlyZWN0aW9uLnkgPiAwLjAgPyAxIDogNDtcXG5cXHR9XFxuXFx0cmV0dXJuIGZhY2U7XFxufVxcbiNkZWZpbmUgY3ViZVVWX21heExvZHMxICAobG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAxLjApXFxuI2RlZmluZSBjdWJlVVZfcmFuZ2VDbGFtcCAoZXhwMigoNi4wIC0gMS4wKSAqIDIuMCkpXFxudmVjMiBNaXBMZXZlbEluZm8oIHZlYzMgdmVjLCBmbG9hdCByb3VnaG5lc3NMZXZlbCwgZmxvYXQgcm91Z2huZXNzICkge1xcblxcdGZsb2F0IHNjYWxlID0gZXhwMihjdWJlVVZfbWF4TG9kczEgLSByb3VnaG5lc3NMZXZlbCk7XFxuXFx0ZmxvYXQgZHhSb3VnaG5lc3MgPSBkRmR4KHJvdWdobmVzcyk7XFxuXFx0ZmxvYXQgZHlSb3VnaG5lc3MgPSBkRmR5KHJvdWdobmVzcyk7XFxuXFx0dmVjMyBkeCA9IGRGZHgoIHZlYyAqIHNjYWxlICogZHhSb3VnaG5lc3MgKTtcXG5cXHR2ZWMzIGR5ID0gZEZkeSggdmVjICogc2NhbGUgKiBkeVJvdWdobmVzcyApO1xcblxcdGZsb2F0IGQgPSBtYXgoIGRvdCggZHgsIGR4ICksIGRvdCggZHksIGR5ICkgKTtcXG5cXHRkID0gY2xhbXAoZCwgMS4wLCBjdWJlVVZfcmFuZ2VDbGFtcCk7XFxuXFx0ZmxvYXQgbWlwTGV2ZWwgPSAwLjUgKiBsb2cyKGQpO1xcblxcdHJldHVybiB2ZWMyKGZsb29yKG1pcExldmVsKSwgZnJhY3QobWlwTGV2ZWwpKTtcXG59XFxuI2RlZmluZSBjdWJlVVZfbWF4TG9kczIgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMi4wKVxcbiNkZWZpbmUgY3ViZVVWX3JjcFRleHR1cmVTaXplICgxLjAgLyBjdWJlVVZfdGV4dHVyZVNpemUpXFxudmVjMiBnZXRDdWJlVVYodmVjMyBkaXJlY3Rpb24sIGZsb2F0IHJvdWdobmVzc0xldmVsLCBmbG9hdCBtaXBMZXZlbCkge1xcblxcdG1pcExldmVsID0gcm91Z2huZXNzTGV2ZWwgPiBjdWJlVVZfbWF4TG9kczIgLSAzLjAgPyAwLjAgOiBtaXBMZXZlbDtcXG5cXHRmbG9hdCBhID0gMTYuMCAqIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZTtcXG5cXHR2ZWMyIGV4cDJfcGFja2VkID0gZXhwMiggdmVjMiggcm91Z2huZXNzTGV2ZWwsIG1pcExldmVsICkgKTtcXG5cXHR2ZWMyIHJjcF9leHAyX3BhY2tlZCA9IHZlYzIoIDEuMCApIC8gZXhwMl9wYWNrZWQ7XFxuXFx0ZmxvYXQgcG93U2NhbGUgPSBleHAyX3BhY2tlZC54ICogZXhwMl9wYWNrZWQueTtcXG5cXHRmbG9hdCBzY2FsZSA9IHJjcF9leHAyX3BhY2tlZC54ICogcmNwX2V4cDJfcGFja2VkLnkgKiAwLjI1O1xcblxcdGZsb2F0IG1pcE9mZnNldCA9IDAuNzUqKDEuMCAtIHJjcF9leHAyX3BhY2tlZC55KSAqIHJjcF9leHAyX3BhY2tlZC54O1xcblxcdGJvb2wgYlJlcyA9IG1pcExldmVsID09IDAuMDtcXG5cXHRzY2FsZSA9ICBiUmVzICYmIChzY2FsZSA8IGEpID8gYSA6IHNjYWxlO1xcblxcdHZlYzMgcjtcXG5cXHR2ZWMyIG9mZnNldDtcXG5cXHRpbnQgZmFjZSA9IGdldEZhY2VGcm9tRGlyZWN0aW9uKGRpcmVjdGlvbik7XFxuXFx0ZmxvYXQgcmNwUG93U2NhbGUgPSAxLjAgLyBwb3dTY2FsZTtcXG5cXHRpZiggZmFjZSA9PSAwKSB7XFxuXFx0XFx0ciA9IHZlYzMoZGlyZWN0aW9uLngsIC1kaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkpO1xcblxcdFxcdG9mZnNldCA9IHZlYzIoMC4wK21pcE9mZnNldCwwLjc1ICogcmNwUG93U2NhbGUpO1xcblxcdFxcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyBhIDogb2Zmc2V0Lnk7XFxuXFx0fVxcblxcdGVsc2UgaWYoIGZhY2UgPT0gMSkge1xcblxcdFxcdHIgPSB2ZWMzKGRpcmVjdGlvbi55LCBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnopO1xcblxcdFxcdG9mZnNldCA9IHZlYzIoc2NhbGUrbWlwT2Zmc2V0LCAwLjc1ICogcmNwUG93U2NhbGUpO1xcblxcdFxcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyBhIDogb2Zmc2V0Lnk7XFxuXFx0fVxcblxcdGVsc2UgaWYoIGZhY2UgPT0gMikge1xcblxcdFxcdHIgPSB2ZWMzKGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkpO1xcblxcdFxcdG9mZnNldCA9IHZlYzIoMi4wKnNjYWxlK21pcE9mZnNldCwgMC43NSAqIHJjcFBvd1NjYWxlKTtcXG5cXHRcXHRvZmZzZXQueSA9IGJSZXMgJiYgKG9mZnNldC55IDwgMi4wKmEpID8gYSA6IG9mZnNldC55O1xcblxcdH1cXG5cXHRlbHNlIGlmKCBmYWNlID09IDMpIHtcXG5cXHRcXHRyID0gdmVjMyhkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnosIGRpcmVjdGlvbi55KTtcXG5cXHRcXHRvZmZzZXQgPSB2ZWMyKDAuMCttaXBPZmZzZXQsMC41ICogcmNwUG93U2NhbGUpO1xcblxcdFxcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcXG5cXHR9XFxuXFx0ZWxzZSBpZiggZmFjZSA9PSA0KSB7XFxuXFx0XFx0ciA9IHZlYzMoZGlyZWN0aW9uLnksIGRpcmVjdGlvbi54LCAtZGlyZWN0aW9uLnopO1xcblxcdFxcdG9mZnNldCA9IHZlYzIoc2NhbGUrbWlwT2Zmc2V0LCAwLjUgKiByY3BQb3dTY2FsZSk7XFxuXFx0XFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8IDIuMCphKSA/IDAuMCA6IG9mZnNldC55O1xcblxcdH1cXG5cXHRlbHNlIHtcXG5cXHRcXHRyID0gdmVjMyhkaXJlY3Rpb24ueiwgLWRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSk7XFxuXFx0XFx0b2Zmc2V0ID0gdmVjMigyLjAqc2NhbGUrbWlwT2Zmc2V0LCAwLjUgKiByY3BQb3dTY2FsZSk7XFxuXFx0XFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8IDIuMCphKSA/IDAuMCA6IG9mZnNldC55O1xcblxcdH1cXG5cXHRyID0gbm9ybWFsaXplKHIpO1xcblxcdGZsb2F0IHRleGVsT2Zmc2V0ID0gMC41ICogY3ViZVVWX3JjcFRleHR1cmVTaXplO1xcblxcdHZlYzIgcyA9ICggci55eiAvIGFicyggci54ICkgKyB2ZWMyKCAxLjAgKSApICogMC41O1xcblxcdHZlYzIgYmFzZSA9IG9mZnNldCArIHZlYzIoIHRleGVsT2Zmc2V0ICk7XFxuXFx0cmV0dXJuIGJhc2UgKyBzICogKCBzY2FsZSAtIDIuMCAqIHRleGVsT2Zmc2V0ICk7XFxufVxcbiNkZWZpbmUgY3ViZVVWX21heExvZHMzIChsb2cyKGN1YmVVVl90ZXh0dXJlU2l6ZSowLjI1KSAtIDMuMClcXG52ZWM0IHRleHR1cmVDdWJlVVYodmVjMyByZWZsZWN0ZWREaXJlY3Rpb24sIGZsb2F0IHJvdWdobmVzcyApIHtcXG5cXHRmbG9hdCByb3VnaG5lc3NWYWwgPSByb3VnaG5lc3MqIGN1YmVVVl9tYXhMb2RzMztcXG5cXHRmbG9hdCByMSA9IGZsb29yKHJvdWdobmVzc1ZhbCk7XFxuXFx0ZmxvYXQgcjIgPSByMSArIDEuMDtcXG5cXHRmbG9hdCB0ID0gZnJhY3Qocm91Z2huZXNzVmFsKTtcXG5cXHR2ZWMyIG1pcEluZm8gPSBNaXBMZXZlbEluZm8ocmVmbGVjdGVkRGlyZWN0aW9uLCByMSwgcm91Z2huZXNzKTtcXG5cXHRmbG9hdCBzID0gbWlwSW5mby55O1xcblxcdGZsb2F0IGxldmVsMCA9IG1pcEluZm8ueDtcXG5cXHRmbG9hdCBsZXZlbDEgPSBsZXZlbDAgKyAxLjA7XFxuXFx0bGV2ZWwxID0gbGV2ZWwxID4gNS4wID8gNS4wIDogbGV2ZWwxO1xcblxcdGxldmVsMCArPSBtaW4oIGZsb29yKCBzICsgMC41ICksIDUuMCApO1xcblxcdHZlYzIgdXZfMTAgPSBnZXRDdWJlVVYocmVmbGVjdGVkRGlyZWN0aW9uLCByMSwgbGV2ZWwwKTtcXG5cXHR2ZWM0IGNvbG9yMTAgPSBlbnZNYXBUZXhlbFRvTGluZWFyKHRleHR1cmUyRChlbnZNYXAsIHV2XzEwKSk7XFxuXFx0dmVjMiB1dl8yMCA9IGdldEN1YmVVVihyZWZsZWN0ZWREaXJlY3Rpb24sIHIyLCBsZXZlbDApO1xcblxcdHZlYzQgY29sb3IyMCA9IGVudk1hcFRleGVsVG9MaW5lYXIodGV4dHVyZTJEKGVudk1hcCwgdXZfMjApKTtcXG5cXHR2ZWM0IHJlc3VsdCA9IG1peChjb2xvcjEwLCBjb2xvcjIwLCB0KTtcXG5cXHRyZXR1cm4gdmVjNChyZXN1bHQucmdiLCAxLjApO1xcbn1cXG4jZW5kaWZcXG5cIjtcblxudmFyIGRlZmF1bHRub3JtYWxfdmVydGV4ID0gXCIjaWZkZWYgRkxJUF9TSURFRFxcblxcdG9iamVjdE5vcm1hbCA9IC1vYmplY3ROb3JtYWw7XFxuI2VuZGlmXFxudmVjMyB0cmFuc2Zvcm1lZE5vcm1hbCA9IG5vcm1hbE1hdHJpeCAqIG9iamVjdE5vcm1hbDtcXG5cIjtcblxudmFyIGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBkaXNwbGFjZW1lbnRNYXA7XFxuXFx0dW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRTY2FsZTtcXG5cXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudEJpYXM7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBkaXNwbGFjZW1lbnRtYXBfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxcblxcdHRyYW5zZm9ybWVkICs9IG5vcm1hbCAqICggdGV4dHVyZTJEKCBkaXNwbGFjZW1lbnRNYXAsIHV2ICkueCAqIGRpc3BsYWNlbWVudFNjYWxlICsgZGlzcGxhY2VtZW50QmlhcyApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZW1pc3NpdmVtYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfRU1JU1NJVkVNQVBcXG5cXHR2ZWM0IGVtaXNzaXZlQ29sb3IgPSB0ZXh0dXJlMkQoIGVtaXNzaXZlTWFwLCB2VXYgKTtcXG5cXHRlbWlzc2l2ZUNvbG9yLnJnYiA9IGVtaXNzaXZlTWFwVGV4ZWxUb0xpbmVhciggZW1pc3NpdmVDb2xvciApLnJnYjtcXG5cXHR0b3RhbEVtaXNzaXZlUmFkaWFuY2UgKj0gZW1pc3NpdmVDb2xvci5yZ2I7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0VNSVNTSVZFTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgZW1pc3NpdmVNYXA7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBlbmNvZGluZ3NfZnJhZ21lbnQgPSBcIiAgZ2xfRnJhZ0NvbG9yID0gbGluZWFyVG9PdXRwdXRUZXhlbCggZ2xfRnJhZ0NvbG9yICk7XFxuXCI7XG5cbnZhciBlbmNvZGluZ3NfcGFyc19mcmFnbWVudCA9IFwiXFxudmVjNCBMaW5lYXJUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRyZXR1cm4gdmFsdWU7XFxufVxcbnZlYzQgR2FtbWFUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHBvdyggdmFsdWUueHl6LCB2ZWMzKCBnYW1tYUZhY3RvciApICksIHZhbHVlLncgKTtcXG59XFxudmVjNCBMaW5lYXJUb0dhbW1hKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBnYW1tYUZhY3RvciApIHtcXG5cXHRyZXR1cm4gdmVjNCggcG93KCB2YWx1ZS54eXosIHZlYzMoIDEuMCAvIGdhbW1hRmFjdG9yICkgKSwgdmFsdWUudyApO1xcbn1cXG52ZWM0IHNSR0JUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiAqIDAuOTQ3ODY3Mjk4NiArIHZlYzMoIDAuMDUyMTMyNzAxNCApLCB2ZWMzKCAyLjQgKSApLCB2YWx1ZS5yZ2IgKiAwLjA3NzM5OTM4MDgsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wNDA0NSApICkgKSApLCB2YWx1ZS53ICk7XFxufVxcbnZlYzQgTGluZWFyVG9zUkdCKCBpbiB2ZWM0IHZhbHVlICkge1xcblxcdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCAwLjQxNjY2ICkgKSAqIDEuMDU1IC0gdmVjMyggMC4wNTUgKSwgdmFsdWUucmdiICogMTIuOTIsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wMDMxMzA4ICkgKSApICksIHZhbHVlLncgKTtcXG59XFxudmVjNCBSR0JFVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqIGV4cDIoIHZhbHVlLmEgKiAyNTUuMCAtIDEyOC4wICksIDEuMCApO1xcbn1cXG52ZWM0IExpbmVhclRvUkdCRSggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRmbG9hdCBtYXhDb21wb25lbnQgPSBtYXgoIG1heCggdmFsdWUuciwgdmFsdWUuZyApLCB2YWx1ZS5iICk7XFxuXFx0ZmxvYXQgZkV4cCA9IGNsYW1wKCBjZWlsKCBsb2cyKCBtYXhDb21wb25lbnQgKSApLCAtMTI4LjAsIDEyNy4wICk7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAvIGV4cDIoIGZFeHAgKSwgKCBmRXhwICsgMTI4LjAgKSAvIDI1NS4wICk7XFxufVxcbnZlYzQgUkdCTVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUueHl6ICogdmFsdWUudyAqIG1heFJhbmdlLCAxLjAgKTtcXG59XFxudmVjNCBMaW5lYXJUb1JHQk0oIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xcblxcdGZsb2F0IG1heFJHQiA9IG1heCggdmFsdWUueCwgbWF4KCB2YWx1ZS5nLCB2YWx1ZS5iICkgKTtcXG5cXHRmbG9hdCBNICAgICAgPSBjbGFtcCggbWF4UkdCIC8gbWF4UmFuZ2UsIDAuMCwgMS4wICk7XFxuXFx0TSAgICAgICAgICAgID0gY2VpbCggTSAqIDI1NS4wICkgLyAyNTUuMDtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiIC8gKCBNICogbWF4UmFuZ2UgKSwgTSApO1xcbn1cXG52ZWM0IFJHQkRUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqICggKCBtYXhSYW5nZSAvIDI1NS4wICkgLyB2YWx1ZS5hICksIDEuMCApO1xcbn1cXG52ZWM0IExpbmVhclRvUkdCRCggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XFxuXFx0ZmxvYXQgbWF4UkdCID0gbWF4KCB2YWx1ZS54LCBtYXgoIHZhbHVlLmcsIHZhbHVlLmIgKSApO1xcblxcdGZsb2F0IEQgICAgICA9IG1heCggbWF4UmFuZ2UgLyBtYXhSR0IsIDEuMCApO1xcblxcdEQgICAgICAgICAgICA9IG1pbiggZmxvb3IoIEQgKSAvIDI1NS4wLCAxLjAgKTtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogKCBEICogKCAyNTUuMCAvIG1heFJhbmdlICkgKSwgRCApO1xcbn1cXG5jb25zdCBtYXQzIGNMb2dMdXZNID0gbWF0MyggMC4yMjA5LCAwLjMzOTAsIDAuNDE4NCwgMC4xMTM4LCAwLjY3ODAsIDAuNzMxOSwgMC4wMTAyLCAwLjExMzAsIDAuMjk2OSApO1xcbnZlYzQgTGluZWFyVG9Mb2dMdXYoIGluIHZlYzQgdmFsdWUgKSAge1xcblxcdHZlYzMgWHBfWV9YWVpwID0gdmFsdWUucmdiICogY0xvZ0x1dk07XFxuXFx0WHBfWV9YWVpwID0gbWF4KFhwX1lfWFlacCwgdmVjMygxZS02LCAxZS02LCAxZS02KSk7XFxuXFx0dmVjNCB2UmVzdWx0O1xcblxcdHZSZXN1bHQueHkgPSBYcF9ZX1hZWnAueHkgLyBYcF9ZX1hZWnAuejtcXG5cXHRmbG9hdCBMZSA9IDIuMCAqIGxvZzIoWHBfWV9YWVpwLnkpICsgMTI3LjA7XFxuXFx0dlJlc3VsdC53ID0gZnJhY3QoTGUpO1xcblxcdHZSZXN1bHQueiA9IChMZSAtIChmbG9vcih2UmVzdWx0LncqMjU1LjApKS8yNTUuMCkvMjU1LjA7XFxuXFx0cmV0dXJuIHZSZXN1bHQ7XFxufVxcbmNvbnN0IG1hdDMgY0xvZ0x1dkludmVyc2VNID0gbWF0MyggNi4wMDE0LCAtMi43MDA4LCAtMS43OTk2LCAtMS4zMzIwLCAzLjEwMjksIC01Ljc3MjEsIDAuMzAwOCwgLTEuMDg4MiwgNS42MjY4ICk7XFxudmVjNCBMb2dMdXZUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRmbG9hdCBMZSA9IHZhbHVlLnogKiAyNTUuMCArIHZhbHVlLnc7XFxuXFx0dmVjMyBYcF9ZX1hZWnA7XFxuXFx0WHBfWV9YWVpwLnkgPSBleHAyKChMZSAtIDEyNy4wKSAvIDIuMCk7XFxuXFx0WHBfWV9YWVpwLnogPSBYcF9ZX1hZWnAueSAvIHZhbHVlLnk7XFxuXFx0WHBfWV9YWVpwLnggPSB2YWx1ZS54ICogWHBfWV9YWVpwLno7XFxuXFx0dmVjMyB2UkdCID0gWHBfWV9YWVpwLnJnYiAqIGNMb2dMdXZJbnZlcnNlTTtcXG5cXHRyZXR1cm4gdmVjNCggbWF4KHZSR0IsIDAuMCksIDEuMCApO1xcbn1cXG5cIjtcblxudmFyIGVudm1hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9FTlZNQVBcXG5cXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKVxcblxcdFxcdHZlYzMgY2FtZXJhVG9WZXJ0ZXggPSBub3JtYWxpemUoIHZXb3JsZFBvc2l0aW9uIC0gY2FtZXJhUG9zaXRpb24gKTtcXG5cXHRcXHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7XFxuXFx0XFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTtcXG5cXHRcXHQjZWxzZVxcblxcdFxcdFxcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZnJhY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0I2Vsc2VcXG5cXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSB2UmVmbGVjdDtcXG5cXHQjZW5kaWZcXG5cXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxcblxcdFxcdHZlYzQgZW52Q29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCBmbGlwTm9ybWFsICogdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApICk7XFxuXFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfRVFVSVJFQyApXFxuXFx0XFx0dmVjMiBzYW1wbGVVVjtcXG5cXHRcXHRzYW1wbGVVVi55ID0gc2F0dXJhdGUoIGZsaXBOb3JtYWwgKiByZWZsZWN0VmVjLnkgKiAwLjUgKyAwLjUgKTtcXG5cXHRcXHRzYW1wbGVVVi54ID0gYXRhbiggZmxpcE5vcm1hbCAqIHJlZmxlY3RWZWMueiwgZmxpcE5vcm1hbCAqIHJlZmxlY3RWZWMueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XFxuXFx0XFx0dmVjNCBlbnZDb2xvciA9IHRleHR1cmUyRCggZW52TWFwLCBzYW1wbGVVViApO1xcblxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX1NQSEVSRSApXFxuXFx0XFx0dmVjMyByZWZsZWN0VmlldyA9IGZsaXBOb3JtYWwgKiBub3JtYWxpemUoICggdmlld01hdHJpeCAqIHZlYzQoIHJlZmxlY3RWZWMsIDAuMCApICkueHl6ICsgdmVjMyggMC4wLCAwLjAsIDEuMCApICk7XFxuXFx0XFx0dmVjNCBlbnZDb2xvciA9IHRleHR1cmUyRCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSApO1xcblxcdCNlbHNlXFxuXFx0XFx0dmVjNCBlbnZDb2xvciA9IHZlYzQoIDAuMCApO1xcblxcdCNlbmRpZlxcblxcdGVudkNvbG9yID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52Q29sb3IgKTtcXG5cXHQjaWZkZWYgRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZXFxuXFx0XFx0b3V0Z29pbmdMaWdodCA9IG1peCggb3V0Z29pbmdMaWdodCwgb3V0Z29pbmdMaWdodCAqIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApO1xcblxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19NSVggKVxcblxcdFxcdG91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApO1xcblxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19BREQgKVxcblxcdFxcdG91dGdvaW5nTGlnaHQgKz0gZW52Q29sb3IueHl6ICogc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIGVudm1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQoIFBIWVNJQ0FMIClcXG5cXHR1bmlmb3JtIGZsb2F0IHJlZmxlY3Rpdml0eTtcXG5cXHR1bmlmb3JtIGZsb2F0IGVudk1hcEludGVuc2l0eTtcXG4jZW5kaWZcXG4jaWZkZWYgVVNFX0VOVk1BUFxcblxcdCNpZiAhIGRlZmluZWQoIFBIWVNJQ0FMICkgJiYgKCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApIClcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XFxuXFx0I2VuZGlmXFxuXFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcXG5cXHRcXHR1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDtcXG5cXHQjZWxzZVxcblxcdFxcdHVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDtcXG5cXHQjZW5kaWZcXG5cXHR1bmlmb3JtIGZsb2F0IGZsaXBFbnZNYXA7XFxuXFx0I2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HICkgfHwgZGVmaW5lZCggUEhZU0lDQUwgKVxcblxcdFxcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xcblxcdCNlbHNlXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgZW52bWFwX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0VOVk1BUFxcblxcdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcblxcdCNlbHNlXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xcblxcdFxcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgZW52bWFwX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9FTlZNQVBcXG5cXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKVxcblxcdFxcdHZXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbi54eXo7XFxuXFx0I2Vsc2VcXG5cXHRcXHR2ZWMzIGNhbWVyYVRvVmVydGV4ID0gbm9ybWFsaXplKCB3b3JsZFBvc2l0aW9uLnh5eiAtIGNhbWVyYVBvc2l0aW9uICk7XFxuXFx0XFx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHRyYW5zZm9ybWVkTm9ybWFsLCB2aWV3TWF0cml4ICk7XFxuXFx0XFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cXG5cXHRcXHRcXHR2UmVmbGVjdCA9IHJlZmxlY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCApO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0dlJlZmxlY3QgPSByZWZyYWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApO1xcblxcdFxcdCNlbmRpZlxcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgZm9nX3ZlcnRleCA9IFwiXFxuI2lmZGVmIFVTRV9GT0dcXG5mb2dEZXB0aCA9IC1tdlBvc2l0aW9uLno7XFxuI2VuZGlmXCI7XG5cbnZhciBmb2dfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfRk9HXFxuICB2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZm9nX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0ZPR1xcblxcdCNpZmRlZiBGT0dfRVhQMlxcblxcdFxcdGZsb2F0IGZvZ0ZhY3RvciA9IHdoaXRlQ29tcGxpbWVudCggZXhwMiggLSBmb2dEZW5zaXR5ICogZm9nRGVuc2l0eSAqIGZvZ0RlcHRoICogZm9nRGVwdGggKiBMT0cyICkgKTtcXG5cXHQjZWxzZVxcblxcdFxcdGZsb2F0IGZvZ0ZhY3RvciA9IHNtb290aHN0ZXAoIGZvZ05lYXIsIGZvZ0ZhciwgZm9nRGVwdGggKTtcXG5cXHQjZW5kaWZcXG5cXHRnbF9GcmFnQ29sb3IucmdiID0gbWl4KCBnbF9GcmFnQ29sb3IucmdiLCBmb2dDb2xvciwgZm9nRmFjdG9yICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBmb2dfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9GT0dcXG5cXHR1bmlmb3JtIHZlYzMgZm9nQ29sb3I7XFxuXFx0dmFyeWluZyBmbG9hdCBmb2dEZXB0aDtcXG5cXHQjaWZkZWYgRk9HX0VYUDJcXG5cXHRcXHR1bmlmb3JtIGZsb2F0IGZvZ0RlbnNpdHk7XFxuXFx0I2Vsc2VcXG5cXHRcXHR1bmlmb3JtIGZsb2F0IGZvZ05lYXI7XFxuXFx0XFx0dW5pZm9ybSBmbG9hdCBmb2dGYXI7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVE9PTlxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGdyYWRpZW50TWFwO1xcblxcdHZlYzMgZ2V0R3JhZGllbnRJcnJhZGlhbmNlKCB2ZWMzIG5vcm1hbCwgdmVjMyBsaWdodERpcmVjdGlvbiApIHtcXG5cXHRcXHRmbG9hdCBkb3ROTCA9IGRvdCggbm9ybWFsLCBsaWdodERpcmVjdGlvbiApO1xcblxcdFxcdHZlYzIgY29vcmQgPSB2ZWMyKCBkb3ROTCAqIDAuNSArIDAuNSwgMC4wICk7XFxuXFx0XFx0I2lmZGVmIFVTRV9HUkFESUVOVE1BUFxcblxcdFxcdFxcdHJldHVybiB0ZXh0dXJlMkQoIGdyYWRpZW50TWFwLCBjb29yZCApLnJnYjtcXG5cXHRcXHQjZWxzZVxcblxcdFxcdFxcdHJldHVybiAoIGNvb3JkLnggPCAwLjcgKSA/IHZlYzMoIDAuNyApIDogdmVjMyggMS4wICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgbGlnaHRtYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTElHSFRNQVBcXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gUEkgKiB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0xJR0hUTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbGlnaHRNYXA7XFxuXFx0dW5pZm9ybSBmbG9hdCBsaWdodE1hcEludGVuc2l0eTtcXG4jZW5kaWZcIjtcblxudmFyIGxpZ2h0c19sYW1iZXJ0X3ZlcnRleCA9IFwidmVjMyBkaWZmdXNlID0gdmVjMyggMS4wICk7XFxuR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeTtcXG5nZW9tZXRyeS5wb3NpdGlvbiA9IG12UG9zaXRpb24ueHl6O1xcbmdlb21ldHJ5Lm5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcXG5nZW9tZXRyeS52aWV3RGlyID0gbm9ybWFsaXplKCAtbXZQb3NpdGlvbi54eXogKTtcXG5HZW9tZXRyaWNDb250ZXh0IGJhY2tHZW9tZXRyeTtcXG5iYWNrR2VvbWV0cnkucG9zaXRpb24gPSBnZW9tZXRyeS5wb3NpdGlvbjtcXG5iYWNrR2VvbWV0cnkubm9ybWFsID0gLWdlb21ldHJ5Lm5vcm1hbDtcXG5iYWNrR2VvbWV0cnkudmlld0RpciA9IGdlb21ldHJ5LnZpZXdEaXI7XFxudkxpZ2h0RnJvbnQgPSB2ZWMzKCAwLjAgKTtcXG4jaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0dkxpZ2h0QmFjayA9IHZlYzMoIDAuMCApO1xcbiNlbmRpZlxcbkluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQ7XFxuZmxvYXQgZG90Tkw7XFxudmVjMyBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuI2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggcG9pbnRMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0ZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XFxuXFx0XFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlID0gUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHRcXHR2TGlnaHRGcm9udCArPSBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG5cXHRcXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0XFx0dkxpZ2h0QmFjayArPSBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xcblxcdFxcdGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIHNwb3RMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0ZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XFxuXFx0XFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlID0gUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHRcXHR2TGlnaHRGcm9udCArPSBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG5cXHRcXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0XFx0dkxpZ2h0QmFjayArPSBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBOVU1fRElSX0xJR0hUUyA+IDBcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0ZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XFxuXFx0XFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlID0gUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHRcXHR2TGlnaHRGcm9udCArPSBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG5cXHRcXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0XFx0dkxpZ2h0QmFjayArPSBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBOVU1fSEVNSV9MSUdIVFMgPiAwXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0hFTUlfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHZMaWdodEZyb250ICs9IGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgZ2VvbWV0cnkgKTtcXG5cXHRcXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0XFx0dkxpZ2h0QmFjayArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGJhY2tHZW9tZXRyeSApO1xcblxcdFxcdCNlbmRpZlxcblxcdH1cXG4jZW5kaWZcXG5cIjtcblxudmFyIGxpZ2h0c19wYXJzID0gXCJ1bmlmb3JtIHZlYzMgYW1iaWVudExpZ2h0Q29sb3I7XFxudmVjMyBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIGFtYmllbnRMaWdodENvbG9yICkge1xcblxcdHZlYzMgaXJyYWRpYW5jZSA9IGFtYmllbnRMaWdodENvbG9yO1xcblxcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xcblxcdFxcdGlycmFkaWFuY2UgKj0gUEk7XFxuXFx0I2VuZGlmXFxuXFx0cmV0dXJuIGlycmFkaWFuY2U7XFxufVxcbiNpZiBOVU1fRElSX0xJR0hUUyA+IDBcXG5cXHRzdHJ1Y3QgRGlyZWN0aW9uYWxMaWdodCB7XFxuXFx0XFx0dmVjMyBkaXJlY3Rpb247XFxuXFx0XFx0dmVjMyBjb2xvcjtcXG5cXHRcXHRpbnQgc2hhZG93O1xcblxcdFxcdGZsb2F0IHNoYWRvd0JpYXM7XFxuXFx0XFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xcblxcdFxcdHZlYzIgc2hhZG93TWFwU2l6ZTtcXG5cXHR9O1xcblxcdHVuaWZvcm0gRGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0c1sgTlVNX0RJUl9MSUdIVFMgXTtcXG5cXHR2b2lkIGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICkge1xcblxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yID0gZGlyZWN0aW9uYWxMaWdodC5jb2xvcjtcXG5cXHRcXHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gPSBkaXJlY3Rpb25hbExpZ2h0LmRpcmVjdGlvbjtcXG5cXHRcXHRkaXJlY3RMaWdodC52aXNpYmxlID0gdHJ1ZTtcXG5cXHR9XFxuI2VuZGlmXFxuI2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXFxuXFx0c3RydWN0IFBvaW50TGlnaHQge1xcblxcdFxcdHZlYzMgcG9zaXRpb247XFxuXFx0XFx0dmVjMyBjb2xvcjtcXG5cXHRcXHRmbG9hdCBkaXN0YW5jZTtcXG5cXHRcXHRmbG9hdCBkZWNheTtcXG5cXHRcXHRpbnQgc2hhZG93O1xcblxcdFxcdGZsb2F0IHNoYWRvd0JpYXM7XFxuXFx0XFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xcblxcdFxcdHZlYzIgc2hhZG93TWFwU2l6ZTtcXG5cXHR9O1xcblxcdHVuaWZvcm0gUG9pbnRMaWdodCBwb2ludExpZ2h0c1sgTlVNX1BPSU5UX0xJR0hUUyBdO1xcblxcdHZvaWQgZ2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIFBvaW50TGlnaHQgcG9pbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgKSB7XFxuXFx0XFx0dmVjMyBsVmVjdG9yID0gcG9pbnRMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5LnBvc2l0aW9uO1xcblxcdFxcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggbFZlY3RvciApO1xcblxcdFxcdGZsb2F0IGxpZ2h0RGlzdGFuY2UgPSBsZW5ndGgoIGxWZWN0b3IgKTtcXG5cXHRcXHRkaXJlY3RMaWdodC5jb2xvciA9IHBvaW50TGlnaHQuY29sb3I7XFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggbGlnaHREaXN0YW5jZSwgcG9pbnRMaWdodC5kaXN0YW5jZSwgcG9pbnRMaWdodC5kZWNheSApO1xcblxcdFxcdGRpcmVjdExpZ2h0LnZpc2libGUgPSAoIGRpcmVjdExpZ2h0LmNvbG9yICE9IHZlYzMoIDAuMCApICk7XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXFxuXFx0c3RydWN0IFNwb3RMaWdodCB7XFxuXFx0XFx0dmVjMyBwb3NpdGlvbjtcXG5cXHRcXHR2ZWMzIGRpcmVjdGlvbjtcXG5cXHRcXHR2ZWMzIGNvbG9yO1xcblxcdFxcdGZsb2F0IGRpc3RhbmNlO1xcblxcdFxcdGZsb2F0IGRlY2F5O1xcblxcdFxcdGZsb2F0IGNvbmVDb3M7XFxuXFx0XFx0ZmxvYXQgcGVudW1icmFDb3M7XFxuXFx0XFx0aW50IHNoYWRvdztcXG5cXHRcXHRmbG9hdCBzaGFkb3dCaWFzO1xcblxcdFxcdGZsb2F0IHNoYWRvd1JhZGl1cztcXG5cXHRcXHR2ZWMyIHNoYWRvd01hcFNpemU7XFxuXFx0fTtcXG5cXHR1bmlmb3JtIFNwb3RMaWdodCBzcG90TGlnaHRzWyBOVU1fU1BPVF9MSUdIVFMgXTtcXG5cXHR2b2lkIGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIFNwb3RMaWdodCBzcG90TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICApIHtcXG5cXHRcXHR2ZWMzIGxWZWN0b3IgPSBzcG90TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeS5wb3NpdGlvbjtcXG5cXHRcXHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gPSBub3JtYWxpemUoIGxWZWN0b3IgKTtcXG5cXHRcXHRmbG9hdCBsaWdodERpc3RhbmNlID0gbGVuZ3RoKCBsVmVjdG9yICk7XFxuXFx0XFx0ZmxvYXQgYW5nbGVDb3MgPSBkb3QoIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiwgc3BvdExpZ2h0LmRpcmVjdGlvbiApO1xcblxcdFxcdGlmICggYW5nbGVDb3MgPiBzcG90TGlnaHQuY29uZUNvcyApIHtcXG5cXHRcXHRcXHRmbG9hdCBzcG90RWZmZWN0ID0gc21vb3Roc3RlcCggc3BvdExpZ2h0LmNvbmVDb3MsIHNwb3RMaWdodC5wZW51bWJyYUNvcywgYW5nbGVDb3MgKTtcXG5cXHRcXHRcXHRkaXJlY3RMaWdodC5jb2xvciA9IHNwb3RMaWdodC5jb2xvcjtcXG5cXHRcXHRcXHRkaXJlY3RMaWdodC5jb2xvciAqPSBzcG90RWZmZWN0ICogcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggbGlnaHREaXN0YW5jZSwgc3BvdExpZ2h0LmRpc3RhbmNlLCBzcG90TGlnaHQuZGVjYXkgKTtcXG5cXHRcXHRcXHRkaXJlY3RMaWdodC52aXNpYmxlID0gdHJ1ZTtcXG5cXHRcXHR9IGVsc2Uge1xcblxcdFxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yID0gdmVjMyggMC4wICk7XFxuXFx0XFx0XFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9IGZhbHNlO1xcblxcdFxcdH1cXG5cXHR9XFxuI2VuZGlmXFxuI2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMFxcblxcdHN0cnVjdCBSZWN0QXJlYUxpZ2h0IHtcXG5cXHRcXHR2ZWMzIGNvbG9yO1xcblxcdFxcdHZlYzMgcG9zaXRpb247XFxuXFx0XFx0dmVjMyBoYWxmV2lkdGg7XFxuXFx0XFx0dmVjMyBoYWxmSGVpZ2h0O1xcblxcdH07XFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbHRjTWF0O1xcdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y01hZztcXG5cXHR1bmlmb3JtIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodHNbIE5VTV9SRUNUX0FSRUFfTElHSFRTIF07XFxuI2VuZGlmXFxuI2lmIE5VTV9IRU1JX0xJR0hUUyA+IDBcXG5cXHRzdHJ1Y3QgSGVtaXNwaGVyZUxpZ2h0IHtcXG5cXHRcXHR2ZWMzIGRpcmVjdGlvbjtcXG5cXHRcXHR2ZWMzIHNreUNvbG9yO1xcblxcdFxcdHZlYzMgZ3JvdW5kQ29sb3I7XFxuXFx0fTtcXG5cXHR1bmlmb3JtIEhlbWlzcGhlcmVMaWdodCBoZW1pc3BoZXJlTGlnaHRzWyBOVU1fSEVNSV9MSUdIVFMgXTtcXG5cXHR2ZWMzIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIEhlbWlzcGhlcmVMaWdodCBoZW1pTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnkgKSB7XFxuXFx0XFx0ZmxvYXQgZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgaGVtaUxpZ2h0LmRpcmVjdGlvbiApO1xcblxcdFxcdGZsb2F0IGhlbWlEaWZmdXNlV2VpZ2h0ID0gMC41ICogZG90TkwgKyAwLjU7XFxuXFx0XFx0dmVjMyBpcnJhZGlhbmNlID0gbWl4KCBoZW1pTGlnaHQuZ3JvdW5kQ29sb3IsIGhlbWlMaWdodC5za3lDb2xvciwgaGVtaURpZmZ1c2VXZWlnaHQgKTtcXG5cXHRcXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcXG5cXHRcXHRcXHRpcnJhZGlhbmNlICo9IFBJO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdHJldHVybiBpcnJhZGlhbmNlO1xcblxcdH1cXG4jZW5kaWZcXG4jaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFBIWVNJQ0FMIClcXG5cXHR2ZWMzIGdldExpZ2h0UHJvYmVJbmRpcmVjdElycmFkaWFuY2UoIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcXG5cXHRcXHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggZ2VvbWV0cnkubm9ybWFsLCB2aWV3TWF0cml4ICk7XFxuXFx0XFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcXG5cXHRcXHRcXHR2ZWMzIHF1ZXJ5VmVjID0gdmVjMyggZmxpcEVudk1hcCAqIHdvcmxkTm9ybWFsLngsIHdvcmxkTm9ybWFsLnl6ICk7XFxuXFx0XFx0XFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZUxvZEVYVCggZW52TWFwLCBxdWVyeVZlYywgZmxvYXQoIG1heE1JUExldmVsICkgKTtcXG5cXHRcXHRcXHQjZWxzZVxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCBxdWVyeVZlYywgZmxvYXQoIG1heE1JUExldmVsICkgKTtcXG5cXHRcXHRcXHQjZW5kaWZcXG5cXHRcXHRcXHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcXG5cXHRcXHRcXHR2ZWMzIHF1ZXJ5VmVjID0gdmVjMyggZmxpcEVudk1hcCAqIHdvcmxkTm9ybWFsLngsIHdvcmxkTm9ybWFsLnl6ICk7XFxuXFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlVVYoIHF1ZXJ5VmVjLCAxLjAgKTtcXG5cXHRcXHQjZWxzZVxcblxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB2ZWM0KCAwLjAgKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRyZXR1cm4gUEkgKiBlbnZNYXBDb2xvci5yZ2IgKiBlbnZNYXBJbnRlbnNpdHk7XFxuXFx0fVxcblxcdGZsb2F0IGdldFNwZWN1bGFyTUlQTGV2ZWwoIGNvbnN0IGluIGZsb2F0IGJsaW5uU2hpbmluZXNzRXhwb25lbnQsIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcXG5cXHRcXHRmbG9hdCBtYXhNSVBMZXZlbFNjYWxhciA9IGZsb2F0KCBtYXhNSVBMZXZlbCApO1xcblxcdFxcdGZsb2F0IGRlc2lyZWRNSVBMZXZlbCA9IG1heE1JUExldmVsU2NhbGFyIC0gMC43OTI0OCAtIDAuNSAqIGxvZzIoIHBvdzIoIGJsaW5uU2hpbmluZXNzRXhwb25lbnQgKSArIDEuMCApO1xcblxcdFxcdHJldHVybiBjbGFtcCggZGVzaXJlZE1JUExldmVsLCAwLjAsIG1heE1JUExldmVsU2NhbGFyICk7XFxuXFx0fVxcblxcdHZlYzMgZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIGZsb2F0IGJsaW5uU2hpbmluZXNzRXhwb25lbnQsIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcXG5cXHRcXHQjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTlxcblxcdFxcdFxcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZmxlY3QoIC1nZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5ub3JtYWwgKTtcXG5cXHRcXHQjZWxzZVxcblxcdFxcdFxcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZnJhY3QoIC1nZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5ub3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdHJlZmxlY3RWZWMgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCByZWZsZWN0VmVjLCB2aWV3TWF0cml4ICk7XFxuXFx0XFx0ZmxvYXQgc3BlY3VsYXJNSVBMZXZlbCA9IGdldFNwZWN1bGFyTUlQTGV2ZWwoIGJsaW5uU2hpbmluZXNzRXhwb25lbnQsIG1heE1JUExldmVsICk7XFxuXFx0XFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcXG5cXHRcXHRcXHR2ZWMzIHF1ZXJ5UmVmbGVjdFZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKTtcXG5cXHRcXHRcXHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXFxuXFx0XFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlTG9kRVhUKCBlbnZNYXAsIHF1ZXJ5UmVmbGVjdFZlYywgc3BlY3VsYXJNSVBMZXZlbCApO1xcblxcdFxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIHF1ZXJ5UmVmbGVjdFZlYywgc3BlY3VsYXJNSVBMZXZlbCApO1xcblxcdFxcdFxcdCNlbmRpZlxcblxcdFxcdFxcdGVudk1hcENvbG9yLnJnYiA9IGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xcblxcdFxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxcblxcdFxcdFxcdHZlYzMgcXVlcnlSZWZsZWN0VmVjID0gdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApO1xcblxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZVVWKHF1ZXJ5UmVmbGVjdFZlYywgQmxpbm5FeHBvbmVudFRvR0dYUm91Z2huZXNzKGJsaW5uU2hpbmluZXNzRXhwb25lbnQpKTtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9FUVVJUkVDIClcXG5cXHRcXHRcXHR2ZWMyIHNhbXBsZVVWO1xcblxcdFxcdFxcdHNhbXBsZVVWLnkgPSBzYXR1cmF0ZSggcmVmbGVjdFZlYy55ICogMC41ICsgMC41ICk7XFxuXFx0XFx0XFx0c2FtcGxlVVYueCA9IGF0YW4oIHJlZmxlY3RWZWMueiwgcmVmbGVjdFZlYy54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtcXG5cXHRcXHRcXHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXFxuXFx0XFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmUyRExvZEVYVCggZW52TWFwLCBzYW1wbGVVViwgc3BlY3VsYXJNSVBMZXZlbCApO1xcblxcdFxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmUyRCggZW52TWFwLCBzYW1wbGVVViwgc3BlY3VsYXJNSVBMZXZlbCApO1xcblxcdFxcdFxcdCNlbmRpZlxcblxcdFxcdFxcdGVudk1hcENvbG9yLnJnYiA9IGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xcblxcdFxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX1NQSEVSRSApXFxuXFx0XFx0XFx0dmVjMyByZWZsZWN0VmlldyA9IG5vcm1hbGl6ZSggKCB2aWV3TWF0cml4ICogdmVjNCggcmVmbGVjdFZlYywgMC4wICkgKS54eXogKyB2ZWMzKCAwLjAsMC4wLDEuMCApICk7XFxuXFx0XFx0XFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlMkRMb2RFWFQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZWxzZVxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlMkQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZW5kaWZcXG5cXHRcXHRcXHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRyZXR1cm4gZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xcblxcdH1cXG4jZW5kaWZcXG5cIjtcblxudmFyIGxpZ2h0c19waG9uZ19mcmFnbWVudCA9IFwiQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsO1xcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2I7XFxubWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IHNwZWN1bGFyO1xcbm1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzID0gc2hpbmluZXNzO1xcbm1hdGVyaWFsLnNwZWN1bGFyU3RyZW5ndGggPSBzcGVjdWxhclN0cmVuZ3RoO1xcblwiO1xuXG52YXIgbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQgPSBcInZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG5zdHJ1Y3QgQmxpbm5QaG9uZ01hdGVyaWFsIHtcXG5cXHR2ZWMzXFx0ZGlmZnVzZUNvbG9yO1xcblxcdHZlYzNcXHRzcGVjdWxhckNvbG9yO1xcblxcdGZsb2F0XFx0c3BlY3VsYXJTaGluaW5lc3M7XFxuXFx0ZmxvYXRcXHRzcGVjdWxhclN0cmVuZ3RoO1xcbn07XFxuI2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMFxcblxcdHZvaWQgUkVfRGlyZWN0X1JlY3RBcmVhX0JsaW5uUGhvbmcoIGNvbnN0IGluIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcXG5cXHRcXHR2ZWMzIG5vcm1hbCA9IGdlb21ldHJ5Lm5vcm1hbDtcXG5cXHRcXHR2ZWMzIHZpZXdEaXIgPSBnZW9tZXRyeS52aWV3RGlyO1xcblxcdFxcdHZlYzMgcG9zaXRpb24gPSBnZW9tZXRyeS5wb3NpdGlvbjtcXG5cXHRcXHR2ZWMzIGxpZ2h0UG9zID0gcmVjdEFyZWFMaWdodC5wb3NpdGlvbjtcXG5cXHRcXHR2ZWMzIGhhbGZXaWR0aCA9IHJlY3RBcmVhTGlnaHQuaGFsZldpZHRoO1xcblxcdFxcdHZlYzMgaGFsZkhlaWdodCA9IHJlY3RBcmVhTGlnaHQuaGFsZkhlaWdodDtcXG5cXHRcXHR2ZWMzIGxpZ2h0Q29sb3IgPSByZWN0QXJlYUxpZ2h0LmNvbG9yO1xcblxcdFxcdGZsb2F0IHJvdWdobmVzcyA9IEJsaW5uRXhwb25lbnRUb0dHWFJvdWdobmVzcyggbWF0ZXJpYWwuc3BlY3VsYXJTaGluaW5lc3MgKTtcXG5cXHRcXHR2ZWMzIHJlY3RDb29yZHNbIDQgXTtcXG5cXHRcXHRyZWN0Q29vcmRzWyAwIF0gPSBsaWdodFBvcyAtIGhhbGZXaWR0aCAtIGhhbGZIZWlnaHQ7XFx0XFx0cmVjdENvb3Jkc1sgMSBdID0gbGlnaHRQb3MgKyBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1xcblxcdFxcdHJlY3RDb29yZHNbIDIgXSA9IGxpZ2h0UG9zICsgaGFsZldpZHRoICsgaGFsZkhlaWdodDtcXG5cXHRcXHRyZWN0Q29vcmRzWyAzIF0gPSBsaWdodFBvcyAtIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7XFxuXFx0XFx0dmVjMiB1diA9IExUQ19Vdiggbm9ybWFsLCB2aWV3RGlyLCByb3VnaG5lc3MgKTtcXG5cXHRcXHRmbG9hdCBub3JtID0gdGV4dHVyZTJEKCBsdGNNYWcsIHV2ICkuYTtcXG5cXHRcXHR2ZWM0IHQgPSB0ZXh0dXJlMkQoIGx0Y01hdCwgdXYgKTtcXG5cXHRcXHRtYXQzIG1JbnYgPSBtYXQzKFxcblxcdFxcdFxcdHZlYzMoICAgMSwgICAwLCB0LnkgKSxcXG5cXHRcXHRcXHR2ZWMzKCAgIDAsIHQueiwgICAwICksXFxuXFx0XFx0XFx0dmVjMyggdC53LCAgIDAsIHQueCApXFxuXFx0XFx0KTtcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBsaWdodENvbG9yICogbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciAqIG5vcm0gKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1JbnYsIHJlY3RDb29yZHMgKTtcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGxpZ2h0Q29sb3IgKiBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1hdDMoIDEgKSwgcmVjdENvb3JkcyApO1xcblxcdH1cXG4jZW5kaWZcXG52b2lkIFJFX0RpcmVjdF9CbGlublBob25nKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xcblxcdCNpZmRlZiBUT09OXFxuXFx0XFx0dmVjMyBpcnJhZGlhbmNlID0gZ2V0R3JhZGllbnRJcnJhZGlhbmNlKCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0I2Vsc2VcXG5cXHRcXHRmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcXG5cXHRcXHR2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xcblxcdCNlbmRpZlxcblxcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xcblxcdFxcdGlycmFkaWFuY2UgKj0gUEk7XFxuXFx0I2VuZGlmXFxuXFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xcblxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9IGlycmFkaWFuY2UgKiBCUkRGX1NwZWN1bGFyX0JsaW5uUGhvbmcoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJTaGluaW5lc3MgKSAqIG1hdGVyaWFsLnNwZWN1bGFyU3RyZW5ndGg7XFxufVxcbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmcoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcXG59XFxuI2RlZmluZSBSRV9EaXJlY3RcXHRcXHRcXHRcXHRSRV9EaXJlY3RfQmxpbm5QaG9uZ1xcbiNkZWZpbmUgUkVfRGlyZWN0X1JlY3RBcmVhXFx0XFx0UkVfRGlyZWN0X1JlY3RBcmVhX0JsaW5uUGhvbmdcXG4jZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZVxcdFxcdFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nXFxuI2RlZmluZSBNYXRlcmlhbF9MaWdodFByb2JlTE9EKCBtYXRlcmlhbCApXFx0KDApXFxuXCI7XG5cbnZhciBsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQgPSBcIlBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWw7XFxubWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYiAqICggMS4wIC0gbWV0YWxuZXNzRmFjdG9yICk7XFxubWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgPSBjbGFtcCggcm91Z2huZXNzRmFjdG9yLCAwLjA0LCAxLjAgKTtcXG4jaWZkZWYgU1RBTkRBUkRcXG5cXHRtYXRlcmlhbC5zcGVjdWxhckNvbG9yID0gbWl4KCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApO1xcbiNlbHNlXFxuXFx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IG1peCggdmVjMyggTUFYSU1VTV9TUEVDVUxBUl9DT0VGRklDSUVOVCAqIHBvdzIoIHJlZmxlY3Rpdml0eSApICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApO1xcblxcdG1hdGVyaWFsLmNsZWFyQ29hdCA9IHNhdHVyYXRlKCBjbGVhckNvYXQgKTtcXHRtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MgPSBjbGFtcCggY2xlYXJDb2F0Um91Z2huZXNzLCAwLjA0LCAxLjAgKTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50ID0gXCJzdHJ1Y3QgUGh5c2ljYWxNYXRlcmlhbCB7XFxuXFx0dmVjM1xcdGRpZmZ1c2VDb2xvcjtcXG5cXHRmbG9hdFxcdHNwZWN1bGFyUm91Z2huZXNzO1xcblxcdHZlYzNcXHRzcGVjdWxhckNvbG9yO1xcblxcdCNpZm5kZWYgU1RBTkRBUkRcXG5cXHRcXHRmbG9hdCBjbGVhckNvYXQ7XFxuXFx0XFx0ZmxvYXQgY2xlYXJDb2F0Um91Z2huZXNzO1xcblxcdCNlbmRpZlxcbn07XFxuI2RlZmluZSBNQVhJTVVNX1NQRUNVTEFSX0NPRUZGSUNJRU5UIDAuMTZcXG4jZGVmaW5lIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgMC4wNFxcbmZsb2F0IGNsZWFyQ29hdERIUkFwcHJveCggY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiBmbG9hdCBkb3ROTCApIHtcXG5cXHRyZXR1cm4gREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCArICggMS4wIC0gREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApICogKCBwb3coIDEuMCAtIGRvdE5MLCA1LjAgKSAqIHBvdyggMS4wIC0gcm91Z2huZXNzLCAyLjAgKSApO1xcbn1cXG4jaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwXFxuXFx0dm9pZCBSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWwoIGNvbnN0IGluIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0XFx0dmVjMyBub3JtYWwgPSBnZW9tZXRyeS5ub3JtYWw7XFxuXFx0XFx0dmVjMyB2aWV3RGlyID0gZ2VvbWV0cnkudmlld0RpcjtcXG5cXHRcXHR2ZWMzIHBvc2l0aW9uID0gZ2VvbWV0cnkucG9zaXRpb247XFxuXFx0XFx0dmVjMyBsaWdodFBvcyA9IHJlY3RBcmVhTGlnaHQucG9zaXRpb247XFxuXFx0XFx0dmVjMyBoYWxmV2lkdGggPSByZWN0QXJlYUxpZ2h0LmhhbGZXaWR0aDtcXG5cXHRcXHR2ZWMzIGhhbGZIZWlnaHQgPSByZWN0QXJlYUxpZ2h0LmhhbGZIZWlnaHQ7XFxuXFx0XFx0dmVjMyBsaWdodENvbG9yID0gcmVjdEFyZWFMaWdodC5jb2xvcjtcXG5cXHRcXHRmbG9hdCByb3VnaG5lc3MgPSBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcztcXG5cXHRcXHR2ZWMzIHJlY3RDb29yZHNbIDQgXTtcXG5cXHRcXHRyZWN0Q29vcmRzWyAwIF0gPSBsaWdodFBvcyAtIGhhbGZXaWR0aCAtIGhhbGZIZWlnaHQ7XFx0XFx0cmVjdENvb3Jkc1sgMSBdID0gbGlnaHRQb3MgKyBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1xcblxcdFxcdHJlY3RDb29yZHNbIDIgXSA9IGxpZ2h0UG9zICsgaGFsZldpZHRoICsgaGFsZkhlaWdodDtcXG5cXHRcXHRyZWN0Q29vcmRzWyAzIF0gPSBsaWdodFBvcyAtIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7XFxuXFx0XFx0dmVjMiB1diA9IExUQ19Vdiggbm9ybWFsLCB2aWV3RGlyLCByb3VnaG5lc3MgKTtcXG5cXHRcXHRmbG9hdCBub3JtID0gdGV4dHVyZTJEKCBsdGNNYWcsIHV2ICkuYTtcXG5cXHRcXHR2ZWM0IHQgPSB0ZXh0dXJlMkQoIGx0Y01hdCwgdXYgKTtcXG5cXHRcXHRtYXQzIG1JbnYgPSBtYXQzKFxcblxcdFxcdFxcdHZlYzMoICAgMSwgICAwLCB0LnkgKSxcXG5cXHRcXHRcXHR2ZWMzKCAgIDAsIHQueiwgICAwICksXFxuXFx0XFx0XFx0dmVjMyggdC53LCAgIDAsIHQueCApXFxuXFx0XFx0KTtcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBsaWdodENvbG9yICogbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciAqIG5vcm0gKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1JbnYsIHJlY3RDb29yZHMgKTtcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGxpZ2h0Q29sb3IgKiBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1hdDMoIDEgKSwgcmVjdENvb3JkcyApO1xcblxcdH1cXG4jZW5kaWZcXG52b2lkIFJFX0RpcmVjdF9QaHlzaWNhbCggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0ZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XFxuXFx0dmVjMyBpcnJhZGlhbmNlID0gZG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcXG5cXHRcXHRpcnJhZGlhbmNlICo9IFBJO1xcblxcdCNlbmRpZlxcblxcdCNpZm5kZWYgU1RBTkRBUkRcXG5cXHRcXHRmbG9hdCBjbGVhckNvYXRESFIgPSBtYXRlcmlhbC5jbGVhckNvYXQgKiBjbGVhckNvYXRESFJBcHByb3goIG1hdGVyaWFsLmNsZWFyQ29hdFJvdWdobmVzcywgZG90TkwgKTtcXG5cXHQjZWxzZVxcblxcdFxcdGZsb2F0IGNsZWFyQ29hdERIUiA9IDAuMDtcXG5cXHQjZW5kaWZcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSAoIDEuMCAtIGNsZWFyQ29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfR0dYKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzICk7XFxuXFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSAoIDEuMCAtIGNsZWFyQ29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcXG5cXHQjaWZuZGVmIFNUQU5EQVJEXFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gaXJyYWRpYW5jZSAqIG1hdGVyaWFsLmNsZWFyQ29hdCAqIEJSREZfU3BlY3VsYXJfR0dYKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzICk7XFxuXFx0I2VuZGlmXFxufVxcbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX1BoeXNpY2FsKCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xcbn1cXG52b2lkIFJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgcmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgY2xlYXJDb2F0UmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xcblxcdCNpZm5kZWYgU1RBTkRBUkRcXG5cXHRcXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XFxuXFx0XFx0ZmxvYXQgZG90TkwgPSBkb3ROVjtcXG5cXHRcXHRmbG9hdCBjbGVhckNvYXRESFIgPSBtYXRlcmlhbC5jbGVhckNvYXQgKiBjbGVhckNvYXRESFJBcHByb3goIG1hdGVyaWFsLmNsZWFyQ29hdFJvdWdobmVzcywgZG90TkwgKTtcXG5cXHQjZWxzZVxcblxcdFxcdGZsb2F0IGNsZWFyQ29hdERIUiA9IDAuMDtcXG5cXHQjZW5kaWZcXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9ICggMS4wIC0gY2xlYXJDb2F0REhSICkgKiByYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfR0dYX0Vudmlyb25tZW50KCBnZW9tZXRyeSwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgKTtcXG5cXHQjaWZuZGVmIFNUQU5EQVJEXFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArPSBjbGVhckNvYXRSYWRpYW5jZSAqIG1hdGVyaWFsLmNsZWFyQ29hdCAqIEJSREZfU3BlY3VsYXJfR0dYX0Vudmlyb25tZW50KCBnZW9tZXRyeSwgdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MgKTtcXG5cXHQjZW5kaWZcXG59XFxuI2RlZmluZSBSRV9EaXJlY3RcXHRcXHRcXHRcXHRSRV9EaXJlY3RfUGh5c2ljYWxcXG4jZGVmaW5lIFJFX0RpcmVjdF9SZWN0QXJlYVxcdFxcdFJFX0RpcmVjdF9SZWN0QXJlYV9QaHlzaWNhbFxcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXFx0XFx0UkVfSW5kaXJlY3REaWZmdXNlX1BoeXNpY2FsXFxuI2RlZmluZSBSRV9JbmRpcmVjdFNwZWN1bGFyXFx0XFx0UkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbFxcbiNkZWZpbmUgTWF0ZXJpYWxfQmxpbm5TaGluaW5lc3NFeHBvbmVudCggbWF0ZXJpYWwgKSAgIEdHWFJvdWdobmVzc1RvQmxpbm5FeHBvbmVudCggbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgKVxcbiNkZWZpbmUgTWF0ZXJpYWxfQ2xlYXJDb2F0X0JsaW5uU2hpbmluZXNzRXhwb25lbnQoIG1hdGVyaWFsICkgICBHR1hSb3VnaG5lc3NUb0JsaW5uRXhwb25lbnQoIG1hdGVyaWFsLmNsZWFyQ29hdFJvdWdobmVzcyApXFxuZmxvYXQgY29tcHV0ZVNwZWN1bGFyT2NjbHVzaW9uKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgYW1iaWVudE9jY2x1c2lvbiwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xcblxcdHJldHVybiBzYXR1cmF0ZSggcG93KCBkb3ROViArIGFtYmllbnRPY2NsdXNpb24sIGV4cDIoIC0gMTYuMCAqIHJvdWdobmVzcyAtIDEuMCApICkgLSAxLjAgKyBhbWJpZW50T2NjbHVzaW9uICk7XFxufVxcblwiO1xuXG52YXIgbGlnaHRzX3RlbXBsYXRlID0gXCJcXG5HZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5O1xcbmdlb21ldHJ5LnBvc2l0aW9uID0gLSB2Vmlld1Bvc2l0aW9uO1xcbmdlb21ldHJ5Lm5vcm1hbCA9IG5vcm1hbDtcXG5nZW9tZXRyeS52aWV3RGlyID0gbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7XFxuSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodDtcXG4jaWYgKCBOVU1fUE9JTlRfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApXFxuXFx0UG9pbnRMaWdodCBwb2ludExpZ2h0O1xcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0cG9pbnRMaWdodCA9IHBvaW50TGlnaHRzWyBpIF07XFxuXFx0XFx0Z2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIHBvaW50TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdCNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gYWxsKCBidmVjMiggcG9pbnRMaWdodC5zaGFkb3csIGRpcmVjdExpZ2h0LnZpc2libGUgKSApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodC5zaGFkb3dCaWFzLCBwb2ludExpZ2h0LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG5cXHR9XFxuI2VuZGlmXFxuI2lmICggTlVNX1NQT1RfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApXFxuXFx0U3BvdExpZ2h0IHNwb3RMaWdodDtcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0c3BvdExpZ2h0ID0gc3BvdExpZ2h0c1sgaSBdO1xcblxcdFxcdGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIHNwb3RMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0I2lmZGVmIFVTRV9TSEFET1dNQVBcXG5cXHRcXHRkaXJlY3RMaWdodC5jb2xvciAqPSBhbGwoIGJ2ZWMyKCBzcG90TGlnaHQuc2hhZG93LCBkaXJlY3RMaWdodC52aXNpYmxlICkgKSA/IGdldFNoYWRvdyggc3BvdFNoYWRvd01hcFsgaSBdLCBzcG90TGlnaHQuc2hhZG93TWFwU2l6ZSwgc3BvdExpZ2h0LnNoYWRvd0JpYXMsIHNwb3RMaWdodC5zaGFkb3dSYWRpdXMsIHZTcG90U2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG5cXHR9XFxuI2VuZGlmXFxuI2lmICggTlVNX0RJUl9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcXG5cXHREaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQ7XFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0ZGlyZWN0aW9uYWxMaWdodCA9IGRpcmVjdGlvbmFsTGlnaHRzWyBpIF07XFxuXFx0XFx0Z2V0RGlyZWN0aW9uYWxEaXJlY3RMaWdodElycmFkaWFuY2UoIGRpcmVjdGlvbmFsTGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdCNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gYWxsKCBidmVjMiggZGlyZWN0aW9uYWxMaWdodC5zaGFkb3csIGRpcmVjdExpZ2h0LnZpc2libGUgKSApID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93QmlhcywgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dSYWRpdXMsIHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiAoIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdF9SZWN0QXJlYSApXFxuXFx0UmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0O1xcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9SRUNUX0FSRUFfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHJlY3RBcmVhTGlnaHQgPSByZWN0QXJlYUxpZ2h0c1sgaSBdO1xcblxcdFxcdFJFX0RpcmVjdF9SZWN0QXJlYSggcmVjdEFyZWFMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xcblxcdH1cXG4jZW5kaWZcXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlIClcXG5cXHR2ZWMzIGlycmFkaWFuY2UgPSBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xcblxcdCNpZmRlZiBVU0VfTElHSFRNQVBcXG5cXHRcXHR2ZWMzIGxpZ2h0TWFwSXJyYWRpYW5jZSA9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKS54eXogKiBsaWdodE1hcEludGVuc2l0eTtcXG5cXHRcXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcXG5cXHRcXHRcXHRsaWdodE1hcElycmFkaWFuY2UgKj0gUEk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0aXJyYWRpYW5jZSArPSBsaWdodE1hcElycmFkaWFuY2U7XFxuXFx0I2VuZGlmXFxuXFx0I2lmICggTlVNX0hFTUlfTElHSFRTID4gMCApXFxuXFx0XFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0hFTUlfTElHSFRTOyBpICsrICkge1xcblxcdFxcdFxcdGlycmFkaWFuY2UgKz0gZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBnZW9tZXRyeSApO1xcblxcdFxcdH1cXG5cXHQjZW5kaWZcXG5cXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFBIWVNJQ0FMICkgJiYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXFxuXFx0XFx0aXJyYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSW5kaXJlY3RJcnJhZGlhbmNlKCBnZW9tZXRyeSwgOCApO1xcblxcdCNlbmRpZlxcblxcdFJFX0luZGlyZWN0RGlmZnVzZSggaXJyYWRpYW5jZSwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xcbiNlbmRpZlxcbiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXFxuXFx0dmVjMyByYWRpYW5jZSA9IGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBnZW9tZXRyeSwgTWF0ZXJpYWxfQmxpbm5TaGluaW5lc3NFeHBvbmVudCggbWF0ZXJpYWwgKSwgOCApO1xcblxcdCNpZm5kZWYgU1RBTkRBUkRcXG5cXHRcXHR2ZWMzIGNsZWFyQ29hdFJhZGlhbmNlID0gZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGdlb21ldHJ5LCBNYXRlcmlhbF9DbGVhckNvYXRfQmxpbm5TaGluaW5lc3NFeHBvbmVudCggbWF0ZXJpYWwgKSwgOCApO1xcblxcdCNlbHNlXFxuXFx0XFx0dmVjMyBjbGVhckNvYXRSYWRpYW5jZSA9IHZlYzMoIDAuMCApO1xcblxcdCNlbmRpZlxcblxcdFJFX0luZGlyZWN0U3BlY3VsYXIoIHJhZGlhbmNlLCBjbGVhckNvYXRSYWRpYW5jZSwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbG9nZGVwdGhidWZfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKFVTRV9MT0dERVBUSEJVRikgJiYgZGVmaW5lZChVU0VfTE9HREVQVEhCVUZfRVhUKVxcblxcdGdsX0ZyYWdEZXB0aEVYVCA9IGxvZzIodkZyYWdEZXB0aCkgKiBsb2dEZXB0aEJ1ZkZDICogMC41O1xcbiNlbmRpZlwiO1xuXG52YXIgbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxcblxcdHVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQztcXG5cXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxcblxcdFxcdHZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXFxuXFx0I2lmZGVmIFVTRV9MT0dERVBUSEJVRl9FWFRcXG5cXHRcXHR2YXJ5aW5nIGZsb2F0IHZGcmFnRGVwdGg7XFxuXFx0I2VuZGlmXFxuXFx0dW5pZm9ybSBmbG9hdCBsb2dEZXB0aEJ1ZkZDO1xcbiNlbmRpZlwiO1xuXG52YXIgbG9nZGVwdGhidWZfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXFxuXFx0Z2xfUG9zaXRpb24ueiA9IGxvZzIobWF4KCBFUFNJTE9OLCBnbF9Qb3NpdGlvbi53ICsgMS4wICkpICogbG9nRGVwdGhCdWZGQztcXG5cXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxcblxcdFxcdHZGcmFnRGVwdGggPSAxLjAgKyBnbF9Qb3NpdGlvbi53O1xcblxcdCNlbHNlXFxuXFx0XFx0Z2xfUG9zaXRpb24ueiA9IChnbF9Qb3NpdGlvbi56IC0gMS4wKSAqIGdsX1Bvc2l0aW9uLnc7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBtYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTUFQXFxuXFx0dmVjNCB0ZXhlbENvbG9yID0gdGV4dHVyZTJEKCBtYXAsIHZVdiApO1xcblxcdHRleGVsQ29sb3IgPSBtYXBUZXhlbFRvTGluZWFyKCB0ZXhlbENvbG9yICk7XFxuXFx0ZGlmZnVzZUNvbG9yICo9IHRleGVsQ29sb3I7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9NQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBtYXBfcGFydGljbGVfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTUFQXFxuXFx0dmVjNCBtYXBUZXhlbCA9IHRleHR1cmUyRCggbWFwLCB2ZWMyKCBnbF9Qb2ludENvb3JkLngsIDEuMCAtIGdsX1BvaW50Q29vcmQueSApICogb2Zmc2V0UmVwZWF0Lnp3ICsgb2Zmc2V0UmVwZWF0Lnh5ICk7XFxuXFx0ZGlmZnVzZUNvbG9yICo9IG1hcFRleGVsVG9MaW5lYXIoIG1hcFRleGVsICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9NQVBcXG5cXHR1bmlmb3JtIHZlYzQgb2Zmc2V0UmVwZWF0O1xcblxcdHVuaWZvcm0gc2FtcGxlcjJEIG1hcDtcXG4jZW5kaWZcXG5cIjtcblxudmFyIG1ldGFsbmVzc21hcF9mcmFnbWVudCA9IFwiZmxvYXQgbWV0YWxuZXNzRmFjdG9yID0gbWV0YWxuZXNzO1xcbiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQXFxuXFx0dmVjNCB0ZXhlbE1ldGFsbmVzcyA9IHRleHR1cmUyRCggbWV0YWxuZXNzTWFwLCB2VXYgKTtcXG5cXHRtZXRhbG5lc3NGYWN0b3IgKj0gdGV4ZWxNZXRhbG5lc3MuYjtcXG4jZW5kaWZcXG5cIjtcblxudmFyIG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX01FVEFMTkVTU01BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIG1ldGFsbmVzc01hcDtcXG4jZW5kaWZcIjtcblxudmFyIG1vcnBobm9ybWFsX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9NT1JQSE5PUk1BTFNcXG5cXHRvYmplY3ROb3JtYWwgKz0gKCBtb3JwaE5vcm1hbDAgLSBub3JtYWwgKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMCBdO1xcblxcdG9iamVjdE5vcm1hbCArPSAoIG1vcnBoTm9ybWFsMSAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAxIF07XFxuXFx0b2JqZWN0Tm9ybWFsICs9ICggbW9ycGhOb3JtYWwyIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDIgXTtcXG5cXHRvYmplY3ROb3JtYWwgKz0gKCBtb3JwaE5vcm1hbDMgLSBub3JtYWwgKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMyBdO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXFxuXFx0I2lmbmRlZiBVU0VfTU9SUEhOT1JNQUxTXFxuXFx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDggXTtcXG5cXHQjZWxzZVxcblxcdHVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA0IF07XFxuXFx0I2VuZGlmXFxuI2VuZGlmXCI7XG5cbnZhciBtb3JwaHRhcmdldF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXFxuXFx0dHJhbnNmb3JtZWQgKz0gKCBtb3JwaFRhcmdldDAgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAwIF07XFxuXFx0dHJhbnNmb3JtZWQgKz0gKCBtb3JwaFRhcmdldDEgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAxIF07XFxuXFx0dHJhbnNmb3JtZWQgKz0gKCBtb3JwaFRhcmdldDIgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XFxuXFx0dHJhbnNmb3JtZWQgKz0gKCBtb3JwaFRhcmdldDMgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAzIF07XFxuXFx0I2lmbmRlZiBVU0VfTU9SUEhOT1JNQUxTXFxuXFx0dHJhbnNmb3JtZWQgKz0gKCBtb3JwaFRhcmdldDQgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA0IF07XFxuXFx0dHJhbnNmb3JtZWQgKz0gKCBtb3JwaFRhcmdldDUgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA1IF07XFxuXFx0dHJhbnNmb3JtZWQgKz0gKCBtb3JwaFRhcmdldDYgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA2IF07XFxuXFx0dHJhbnNmb3JtZWQgKz0gKCBtb3JwaFRhcmdldDcgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA3IF07XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBub3JtYWxfZmxpcCA9IFwiI2lmZGVmIERPVUJMRV9TSURFRFxcblxcdGZsb2F0IGZsaXBOb3JtYWwgPSAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XFxuI2Vsc2VcXG5cXHRmbG9hdCBmbGlwTm9ybWFsID0gMS4wO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbm9ybWFsX2ZyYWdtZW50ID0gXCIjaWZkZWYgRkxBVF9TSEFERURcXG5cXHR2ZWMzIGZkeCA9IHZlYzMoIGRGZHgoIHZWaWV3UG9zaXRpb24ueCApLCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnkgKSwgZEZkeCggdlZpZXdQb3NpdGlvbi56ICkgKTtcXG5cXHR2ZWMzIGZkeSA9IHZlYzMoIGRGZHkoIHZWaWV3UG9zaXRpb24ueCApLCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnkgKSwgZEZkeSggdlZpZXdQb3NpdGlvbi56ICkgKTtcXG5cXHR2ZWMzIG5vcm1hbCA9IG5vcm1hbGl6ZSggY3Jvc3MoIGZkeCwgZmR5ICkgKTtcXG4jZWxzZVxcblxcdHZlYzMgbm9ybWFsID0gbm9ybWFsaXplKCB2Tm9ybWFsICkgKiBmbGlwTm9ybWFsO1xcbiNlbmRpZlxcbiNpZmRlZiBVU0VfTk9STUFMTUFQXFxuXFx0bm9ybWFsID0gcGVydHVyYk5vcm1hbDJBcmIoIC12Vmlld1Bvc2l0aW9uLCBub3JtYWwgKTtcXG4jZWxpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApXFxuXFx0bm9ybWFsID0gcGVydHVyYk5vcm1hbEFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCwgZEhkeHlfZndkKCkgKTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX05PUk1BTE1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIG5vcm1hbE1hcDtcXG5cXHR1bmlmb3JtIHZlYzIgbm9ybWFsU2NhbGU7XFxuXFx0dmVjMyBwZXJ0dXJiTm9ybWFsMkFyYiggdmVjMyBleWVfcG9zLCB2ZWMzIHN1cmZfbm9ybSApIHtcXG5cXHRcXHR2ZWMzIHEwID0gZEZkeCggZXllX3Bvcy54eXogKTtcXG5cXHRcXHR2ZWMzIHExID0gZEZkeSggZXllX3Bvcy54eXogKTtcXG5cXHRcXHR2ZWMyIHN0MCA9IGRGZHgoIHZVdi5zdCApO1xcblxcdFxcdHZlYzIgc3QxID0gZEZkeSggdlV2LnN0ICk7XFxuXFx0XFx0dmVjMyBTID0gbm9ybWFsaXplKCBxMCAqIHN0MS50IC0gcTEgKiBzdDAudCApO1xcblxcdFxcdHZlYzMgVCA9IG5vcm1hbGl6ZSggLXEwICogc3QxLnMgKyBxMSAqIHN0MC5zICk7XFxuXFx0XFx0dmVjMyBOID0gbm9ybWFsaXplKCBzdXJmX25vcm0gKTtcXG5cXHRcXHR2ZWMzIG1hcE4gPSB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xcblxcdFxcdG1hcE4ueHkgPSBub3JtYWxTY2FsZSAqIG1hcE4ueHk7XFxuXFx0XFx0bWF0MyB0c24gPSBtYXQzKCBTLCBULCBOICk7XFxuXFx0XFx0cmV0dXJuIG5vcm1hbGl6ZSggdHNuICogbWFwTiApO1xcblxcdH1cXG4jZW5kaWZcXG5cIjtcblxudmFyIHBhY2tpbmcgPSBcInZlYzMgcGFja05vcm1hbFRvUkdCKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCApIHtcXG5cXHRyZXR1cm4gbm9ybWFsaXplKCBub3JtYWwgKSAqIDAuNSArIDAuNTtcXG59XFxudmVjMyB1bnBhY2tSR0JUb05vcm1hbCggY29uc3QgaW4gdmVjMyByZ2IgKSB7XFxuXFx0cmV0dXJuIDEuMCAtIDIuMCAqIHJnYi54eXo7XFxufVxcbmNvbnN0IGZsb2F0IFBhY2tVcHNjYWxlID0gMjU2LiAvIDI1NS47Y29uc3QgZmxvYXQgVW5wYWNrRG93bnNjYWxlID0gMjU1LiAvIDI1Ni47XFxuY29uc3QgdmVjMyBQYWNrRmFjdG9ycyA9IHZlYzMoIDI1Ni4gKiAyNTYuICogMjU2LiwgMjU2LiAqIDI1Ni4sICAyNTYuICk7XFxuY29uc3QgdmVjNCBVbnBhY2tGYWN0b3JzID0gVW5wYWNrRG93bnNjYWxlIC8gdmVjNCggUGFja0ZhY3RvcnMsIDEuICk7XFxuY29uc3QgZmxvYXQgU2hpZnRSaWdodDggPSAxLiAvIDI1Ni47XFxudmVjNCBwYWNrRGVwdGhUb1JHQkEoIGNvbnN0IGluIGZsb2F0IHYgKSB7XFxuXFx0dmVjNCByID0gdmVjNCggZnJhY3QoIHYgKiBQYWNrRmFjdG9ycyApLCB2ICk7XFxuXFx0ci55encgLT0gci54eXogKiBTaGlmdFJpZ2h0ODtcXHRyZXR1cm4gciAqIFBhY2tVcHNjYWxlO1xcbn1cXG5mbG9hdCB1bnBhY2tSR0JBVG9EZXB0aCggY29uc3QgaW4gdmVjNCB2ICkge1xcblxcdHJldHVybiBkb3QoIHYsIFVucGFja0ZhY3RvcnMgKTtcXG59XFxuZmxvYXQgdmlld1pUb09ydGhvZ3JhcGhpY0RlcHRoKCBjb25zdCBpbiBmbG9hdCB2aWV3WiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xcblxcdHJldHVybiAoIHZpZXdaICsgbmVhciApIC8gKCBuZWFyIC0gZmFyICk7XFxufVxcbmZsb2F0IG9ydGhvZ3JhcGhpY0RlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgbGluZWFyQ2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcXG5cXHRyZXR1cm4gbGluZWFyQ2xpcFogKiAoIG5lYXIgLSBmYXIgKSAtIG5lYXI7XFxufVxcbmZsb2F0IHZpZXdaVG9QZXJzcGVjdGl2ZURlcHRoKCBjb25zdCBpbiBmbG9hdCB2aWV3WiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xcblxcdHJldHVybiAoKCBuZWFyICsgdmlld1ogKSAqIGZhciApIC8gKCggZmFyIC0gbmVhciApICogdmlld1ogKTtcXG59XFxuZmxvYXQgcGVyc3BlY3RpdmVEZXB0aFRvVmlld1ooIGNvbnN0IGluIGZsb2F0IGludkNsaXBaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XFxuXFx0cmV0dXJuICggbmVhciAqIGZhciApIC8gKCAoIGZhciAtIG5lYXIgKSAqIGludkNsaXBaIC0gZmFyICk7XFxufVxcblwiO1xuXG52YXIgcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudCA9IFwiI2lmZGVmIFBSRU1VTFRJUExJRURfQUxQSEFcXG5cXHRnbF9GcmFnQ29sb3IucmdiICo9IGdsX0ZyYWdDb2xvci5hO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgcHJvamVjdF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0tJTk5JTkdcXG5cXHR2ZWM0IG12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiBza2lubmVkO1xcbiNlbHNlXFxuXFx0dmVjNCBtdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xcbiNlbmRpZlxcbmdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG12UG9zaXRpb247XFxuXCI7XG5cbnZhciBkaXRoZXJpbmdfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBESVRIRVJJTkcgKVxcbiAgZ2xfRnJhZ0NvbG9yLnJnYiA9IGRpdGhlcmluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBESVRIRVJJTkcgKVxcblxcdHZlYzMgZGl0aGVyaW5nKCB2ZWMzIGNvbG9yICkge1xcblxcdFxcdGZsb2F0IGdyaWRfcG9zaXRpb24gPSByYW5kKCBnbF9GcmFnQ29vcmQueHkgKTtcXG5cXHRcXHR2ZWMzIGRpdGhlcl9zaGlmdF9SR0IgPSB2ZWMzKCAwLjI1IC8gMjU1LjAsIC0wLjI1IC8gMjU1LjAsIDAuMjUgLyAyNTUuMCApO1xcblxcdFxcdGRpdGhlcl9zaGlmdF9SR0IgPSBtaXgoIDIuMCAqIGRpdGhlcl9zaGlmdF9SR0IsIC0yLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCBncmlkX3Bvc2l0aW9uICk7XFxuXFx0XFx0cmV0dXJuIGNvbG9yICsgZGl0aGVyX3NoaWZ0X1JHQjtcXG5cXHR9XFxuI2VuZGlmXFxuXCI7XG5cbnZhciByb3VnaG5lc3NtYXBfZnJhZ21lbnQgPSBcImZsb2F0IHJvdWdobmVzc0ZhY3RvciA9IHJvdWdobmVzcztcXG4jaWZkZWYgVVNFX1JPVUdITkVTU01BUFxcblxcdHZlYzQgdGV4ZWxSb3VnaG5lc3MgPSB0ZXh0dXJlMkQoIHJvdWdobmVzc01hcCwgdlV2ICk7XFxuXFx0cm91Z2huZXNzRmFjdG9yICo9IHRleGVsUm91Z2huZXNzLmc7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciByb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCByb3VnaG5lc3NNYXA7XFxuI2VuZGlmXCI7XG5cbnZhciBzaGFkb3dtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9TSEFET1dNQVBcXG5cXHQjaWYgTlVNX0RJUl9MSUdIVFMgPiAwXFxuXFx0XFx0dW5pZm9ybSBzYW1wbGVyMkQgZGlyZWN0aW9uYWxTaGFkb3dNYXBbIE5VTV9ESVJfTElHSFRTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUUyBdO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXFxuXFx0XFx0dW5pZm9ybSBzYW1wbGVyMkQgc3BvdFNoYWRvd01hcFsgTlVNX1NQT1RfTElHSFRTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZTcG90U2hhZG93Q29vcmRbIE5VTV9TUE9UX0xJR0hUUyBdO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxcblxcdFxcdHVuaWZvcm0gc2FtcGxlcjJEIHBvaW50U2hhZG93TWFwWyBOVU1fUE9JTlRfTElHSFRTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRTIF07XFxuXFx0I2VuZGlmXFxuXFx0ZmxvYXQgdGV4dHVyZTJEQ29tcGFyZSggc2FtcGxlcjJEIGRlcHRocywgdmVjMiB1diwgZmxvYXQgY29tcGFyZSApIHtcXG5cXHRcXHRyZXR1cm4gc3RlcCggY29tcGFyZSwgdW5wYWNrUkdCQVRvRGVwdGgoIHRleHR1cmUyRCggZGVwdGhzLCB1diApICkgKTtcXG5cXHR9XFxuXFx0ZmxvYXQgdGV4dHVyZTJEU2hhZG93TGVycCggc2FtcGxlcjJEIGRlcHRocywgdmVjMiBzaXplLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkge1xcblxcdFxcdGNvbnN0IHZlYzIgb2Zmc2V0ID0gdmVjMiggMC4wLCAxLjAgKTtcXG5cXHRcXHR2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gc2l6ZTtcXG5cXHRcXHR2ZWMyIGNlbnRyb2lkVVYgPSBmbG9vciggdXYgKiBzaXplICsgMC41ICkgLyBzaXplO1xcblxcdFxcdGZsb2F0IGxiID0gdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnh4LCBjb21wYXJlICk7XFxuXFx0XFx0ZmxvYXQgbHQgPSB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueHksIGNvbXBhcmUgKTtcXG5cXHRcXHRmbG9hdCByYiA9IHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC55eCwgY29tcGFyZSApO1xcblxcdFxcdGZsb2F0IHJ0ID0gdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnl5LCBjb21wYXJlICk7XFxuXFx0XFx0dmVjMiBmID0gZnJhY3QoIHV2ICogc2l6ZSArIDAuNSApO1xcblxcdFxcdGZsb2F0IGEgPSBtaXgoIGxiLCBsdCwgZi55ICk7XFxuXFx0XFx0ZmxvYXQgYiA9IG1peCggcmIsIHJ0LCBmLnkgKTtcXG5cXHRcXHRmbG9hdCBjID0gbWl4KCBhLCBiLCBmLnggKTtcXG5cXHRcXHRyZXR1cm4gYztcXG5cXHR9XFxuXFx0ZmxvYXQgZ2V0U2hhZG93KCBzYW1wbGVyMkQgc2hhZG93TWFwLCB2ZWMyIHNoYWRvd01hcFNpemUsIGZsb2F0IHNoYWRvd0JpYXMsIGZsb2F0IHNoYWRvd1JhZGl1cywgdmVjNCBzaGFkb3dDb29yZCApIHtcXG5cXHRcXHRzaGFkb3dDb29yZC54eXogLz0gc2hhZG93Q29vcmQudztcXG5cXHRcXHRzaGFkb3dDb29yZC56ICs9IHNoYWRvd0JpYXM7XFxuXFx0XFx0YnZlYzQgaW5GcnVzdHVtVmVjID0gYnZlYzQgKCBzaGFkb3dDb29yZC54ID49IDAuMCwgc2hhZG93Q29vcmQueCA8PSAxLjAsIHNoYWRvd0Nvb3JkLnkgPj0gMC4wLCBzaGFkb3dDb29yZC55IDw9IDEuMCApO1xcblxcdFxcdGJvb2wgaW5GcnVzdHVtID0gYWxsKCBpbkZydXN0dW1WZWMgKTtcXG5cXHRcXHRidmVjMiBmcnVzdHVtVGVzdFZlYyA9IGJ2ZWMyKCBpbkZydXN0dW0sIHNoYWRvd0Nvb3JkLnogPD0gMS4wICk7XFxuXFx0XFx0Ym9vbCBmcnVzdHVtVGVzdCA9IGFsbCggZnJ1c3R1bVRlc3RWZWMgKTtcXG5cXHRcXHRpZiAoIGZydXN0dW1UZXN0ICkge1xcblxcdFxcdCNpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0YgKVxcblxcdFxcdFxcdHZlYzIgdGV4ZWxTaXplID0gdmVjMiggMS4wICkgLyBzaGFkb3dNYXBTaXplO1xcblxcdFxcdFxcdGZsb2F0IGR4MCA9IC0gdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0ZmxvYXQgZHkwID0gLSB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRmbG9hdCBkeDEgPSArIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdGZsb2F0IGR5MSA9ICsgdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0cmV0dXJuIChcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MSApLCBzaGFkb3dDb29yZC56IClcXG5cXHRcXHRcXHQpICogKCAxLjAgLyA5LjAgKTtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApXFxuXFx0XFx0XFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XFxuXFx0XFx0XFx0ZmxvYXQgZHgwID0gLSB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRmbG9hdCBkeTAgPSAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdGZsb2F0IGR4MSA9ICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0ZmxvYXQgZHkxID0gKyB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRyZXR1cm4gKFxcblxcdFxcdFxcdFxcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkxICksIHNoYWRvd0Nvb3JkLnogKVxcblxcdFxcdFxcdCkgKiAoIDEuMCAvIDkuMCApO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0cmV0dXJuIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHR9XFxuXFx0XFx0cmV0dXJuIDEuMDtcXG5cXHR9XFxuXFx0dmVjMiBjdWJlVG9VViggdmVjMyB2LCBmbG9hdCB0ZXhlbFNpemVZICkge1xcblxcdFxcdHZlYzMgYWJzViA9IGFicyggdiApO1xcblxcdFxcdGZsb2F0IHNjYWxlVG9DdWJlID0gMS4wIC8gbWF4KCBhYnNWLngsIG1heCggYWJzVi55LCBhYnNWLnogKSApO1xcblxcdFxcdGFic1YgKj0gc2NhbGVUb0N1YmU7XFxuXFx0XFx0diAqPSBzY2FsZVRvQ3ViZSAqICggMS4wIC0gMi4wICogdGV4ZWxTaXplWSApO1xcblxcdFxcdHZlYzIgcGxhbmFyID0gdi54eTtcXG5cXHRcXHRmbG9hdCBhbG1vc3RBVGV4ZWwgPSAxLjUgKiB0ZXhlbFNpemVZO1xcblxcdFxcdGZsb2F0IGFsbW9zdE9uZSA9IDEuMCAtIGFsbW9zdEFUZXhlbDtcXG5cXHRcXHRpZiAoIGFic1YueiA+PSBhbG1vc3RPbmUgKSB7XFxuXFx0XFx0XFx0aWYgKCB2LnogPiAwLjAgKVxcblxcdFxcdFxcdFxcdHBsYW5hci54ID0gNC4wIC0gdi54O1xcblxcdFxcdH0gZWxzZSBpZiAoIGFic1YueCA+PSBhbG1vc3RPbmUgKSB7XFxuXFx0XFx0XFx0ZmxvYXQgc2lnblggPSBzaWduKCB2LnggKTtcXG5cXHRcXHRcXHRwbGFuYXIueCA9IHYueiAqIHNpZ25YICsgMi4wICogc2lnblg7XFxuXFx0XFx0fSBlbHNlIGlmICggYWJzVi55ID49IGFsbW9zdE9uZSApIHtcXG5cXHRcXHRcXHRmbG9hdCBzaWduWSA9IHNpZ24oIHYueSApO1xcblxcdFxcdFxcdHBsYW5hci54ID0gdi54ICsgMi4wICogc2lnblkgKyAyLjA7XFxuXFx0XFx0XFx0cGxhbmFyLnkgPSB2LnogKiBzaWduWSAtIDIuMDtcXG5cXHRcXHR9XFxuXFx0XFx0cmV0dXJuIHZlYzIoIDAuMTI1LCAwLjI1ICkgKiBwbGFuYXIgKyB2ZWMyKCAwLjM3NSwgMC43NSApO1xcblxcdH1cXG5cXHRmbG9hdCBnZXRQb2ludFNoYWRvdyggc2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQgKSB7XFxuXFx0XFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvICggc2hhZG93TWFwU2l6ZSAqIHZlYzIoIDQuMCwgMi4wICkgKTtcXG5cXHRcXHR2ZWMzIGxpZ2h0VG9Qb3NpdGlvbiA9IHNoYWRvd0Nvb3JkLnh5ejtcXG5cXHRcXHR2ZWMzIGJkM0QgPSBub3JtYWxpemUoIGxpZ2h0VG9Qb3NpdGlvbiApO1xcblxcdFxcdGZsb2F0IGRwID0gKCBsZW5ndGgoIGxpZ2h0VG9Qb3NpdGlvbiApIC0gc2hhZG93QmlhcyApIC8gMTAwMC4wO1xcblxcdFxcdCNpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0YgKSB8fCBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApXFxuXFx0XFx0XFx0dmVjMiBvZmZzZXQgPSB2ZWMyKCAtIDEsIDEgKSAqIHNoYWRvd1JhZGl1cyAqIHRleGVsU2l6ZS55O1xcblxcdFxcdFxcdHJldHVybiAoXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXksIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl5LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh5eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eXgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHh5LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXh4LCB0ZXhlbFNpemUueSApLCBkcCApXFxuXFx0XFx0XFx0KSAqICggMS4wIC8gOS4wICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRyZXR1cm4gdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCwgdGV4ZWxTaXplLnkgKSwgZHAgKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHR9XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBzaGFkb3dtYXBfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0I2lmIE5VTV9ESVJfTElHSFRTID4gMFxcblxcdFxcdHVuaWZvcm0gbWF0NCBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgTlVNX0RJUl9MSUdIVFMgXTtcXG5cXHRcXHR2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRTIF07XFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9TUE9UX0xJR0hUUyA+IDBcXG5cXHRcXHR1bmlmb3JtIG1hdDQgc3BvdFNoYWRvd01hdHJpeFsgTlVNX1NQT1RfTElHSFRTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZTcG90U2hhZG93Q29vcmRbIE5VTV9TUE9UX0xJR0hUUyBdO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxcblxcdFxcdHVuaWZvcm0gbWF0NCBwb2ludFNoYWRvd01hdHJpeFsgTlVNX1BPSU5UX0xJR0hUUyBdO1xcblxcdFxcdHZhcnlpbmcgdmVjNCB2UG9pbnRTaGFkb3dDb29yZFsgTlVNX1BPSU5UX0xJR0hUUyBdO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgc2hhZG93bWFwX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9TSEFET1dNQVBcXG5cXHQjaWYgTlVNX0RJUl9MSUdIVFMgPiAwXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0dkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSA9IGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xcblxcdH1cXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1NQT1RfTElHSFRTID4gMFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHR2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gPSBzcG90U2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xcblxcdH1cXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHZQb2ludFNoYWRvd0Nvb3JkWyBpIF0gPSBwb2ludFNoYWRvd01hdHJpeFsgaSBdICogd29ybGRQb3NpdGlvbjtcXG5cXHR9XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQgPSBcImZsb2F0IGdldFNoYWRvd01hc2soKSB7XFxuXFx0ZmxvYXQgc2hhZG93ID0gMS4wO1xcblxcdCNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0I2lmIE5VTV9ESVJfTElHSFRTID4gMFxcblxcdERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodDtcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRkaXJlY3Rpb25hbExpZ2h0ID0gZGlyZWN0aW9uYWxMaWdodHNbIGkgXTtcXG5cXHRcXHRzaGFkb3cgKj0gYm9vbCggZGlyZWN0aW9uYWxMaWdodC5zaGFkb3cgKSA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XFxuXFx0fVxcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXFxuXFx0U3BvdExpZ2h0IHNwb3RMaWdodDtcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0c3BvdExpZ2h0ID0gc3BvdExpZ2h0c1sgaSBdO1xcblxcdFxcdHNoYWRvdyAqPSBib29sKCBzcG90TGlnaHQuc2hhZG93ICkgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodC5zaGFkb3dCaWFzLCBzcG90TGlnaHQuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcXG5cXHR9XFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXFxuXFx0UG9pbnRMaWdodCBwb2ludExpZ2h0O1xcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0cG9pbnRMaWdodCA9IHBvaW50TGlnaHRzWyBpIF07XFxuXFx0XFx0c2hhZG93ICo9IGJvb2woIHBvaW50TGlnaHQuc2hhZG93ICkgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGlnaHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XFxuXFx0fVxcblxcdCNlbmRpZlxcblxcdCNlbmRpZlxcblxcdHJldHVybiBzaGFkb3c7XFxufVxcblwiO1xuXG52YXIgc2tpbmJhc2VfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NLSU5OSU5HXFxuXFx0bWF0NCBib25lTWF0WCA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC54ICk7XFxuXFx0bWF0NCBib25lTWF0WSA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC55ICk7XFxuXFx0bWF0NCBib25lTWF0WiA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC56ICk7XFxuXFx0bWF0NCBib25lTWF0VyA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC53ICk7XFxuI2VuZGlmXCI7XG5cbnZhciBza2lubmluZ19wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9TS0lOTklOR1xcblxcdHVuaWZvcm0gbWF0NCBiaW5kTWF0cml4O1xcblxcdHVuaWZvcm0gbWF0NCBiaW5kTWF0cml4SW52ZXJzZTtcXG5cXHQjaWZkZWYgQk9ORV9URVhUVVJFXFxuXFx0XFx0dW5pZm9ybSBzYW1wbGVyMkQgYm9uZVRleHR1cmU7XFxuXFx0XFx0dW5pZm9ybSBpbnQgYm9uZVRleHR1cmVTaXplO1xcblxcdFxcdG1hdDQgZ2V0Qm9uZU1hdHJpeCggY29uc3QgaW4gZmxvYXQgaSApIHtcXG5cXHRcXHRcXHRmbG9hdCBqID0gaSAqIDQuMDtcXG5cXHRcXHRcXHRmbG9hdCB4ID0gbW9kKCBqLCBmbG9hdCggYm9uZVRleHR1cmVTaXplICkgKTtcXG5cXHRcXHRcXHRmbG9hdCB5ID0gZmxvb3IoIGogLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICkgKTtcXG5cXHRcXHRcXHRmbG9hdCBkeCA9IDEuMCAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKTtcXG5cXHRcXHRcXHRmbG9hdCBkeSA9IDEuMCAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKTtcXG5cXHRcXHRcXHR5ID0gZHkgKiAoIHkgKyAwLjUgKTtcXG5cXHRcXHRcXHR2ZWM0IHYxID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAwLjUgKSwgeSApICk7XFxuXFx0XFx0XFx0dmVjNCB2MiA9IHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMS41ICksIHkgKSApO1xcblxcdFxcdFxcdHZlYzQgdjMgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDIuNSApLCB5ICkgKTtcXG5cXHRcXHRcXHR2ZWM0IHY0ID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAzLjUgKSwgeSApICk7XFxuXFx0XFx0XFx0bWF0NCBib25lID0gbWF0NCggdjEsIHYyLCB2MywgdjQgKTtcXG5cXHRcXHRcXHRyZXR1cm4gYm9uZTtcXG5cXHRcXHR9XFxuXFx0I2Vsc2VcXG5cXHRcXHR1bmlmb3JtIG1hdDQgYm9uZU1hdHJpY2VzWyBNQVhfQk9ORVMgXTtcXG5cXHRcXHRtYXQ0IGdldEJvbmVNYXRyaXgoIGNvbnN0IGluIGZsb2F0IGkgKSB7XFxuXFx0XFx0XFx0bWF0NCBib25lID0gYm9uZU1hdHJpY2VzWyBpbnQoaSkgXTtcXG5cXHRcXHRcXHRyZXR1cm4gYm9uZTtcXG5cXHRcXHR9XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBza2lubmluZ192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0tJTk5JTkdcXG5cXHR2ZWM0IHNraW5WZXJ0ZXggPSBiaW5kTWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xcblxcdHZlYzQgc2tpbm5lZCA9IHZlYzQoIDAuMCApO1xcblxcdHNraW5uZWQgKz0gYm9uZU1hdFggKiBza2luVmVydGV4ICogc2tpbldlaWdodC54O1xcblxcdHNraW5uZWQgKz0gYm9uZU1hdFkgKiBza2luVmVydGV4ICogc2tpbldlaWdodC55O1xcblxcdHNraW5uZWQgKz0gYm9uZU1hdFogKiBza2luVmVydGV4ICogc2tpbldlaWdodC56O1xcblxcdHNraW5uZWQgKz0gYm9uZU1hdFcgKiBza2luVmVydGV4ICogc2tpbldlaWdodC53O1xcblxcdHNraW5uZWQgID0gYmluZE1hdHJpeEludmVyc2UgKiBza2lubmVkO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgc2tpbm5vcm1hbF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0tJTk5JTkdcXG5cXHRtYXQ0IHNraW5NYXRyaXggPSBtYXQ0KCAwLjAgKTtcXG5cXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQueCAqIGJvbmVNYXRYO1xcblxcdHNraW5NYXRyaXggKz0gc2tpbldlaWdodC55ICogYm9uZU1hdFk7XFxuXFx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnogKiBib25lTWF0WjtcXG5cXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQudyAqIGJvbmVNYXRXO1xcblxcdHNraW5NYXRyaXggID0gYmluZE1hdHJpeEludmVyc2UgKiBza2luTWF0cml4ICogYmluZE1hdHJpeDtcXG5cXHRvYmplY3ROb3JtYWwgPSB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0Tm9ybWFsLCAwLjAgKSApLnh5ejtcXG4jZW5kaWZcXG5cIjtcblxudmFyIHNwZWN1bGFybWFwX2ZyYWdtZW50ID0gXCJmbG9hdCBzcGVjdWxhclN0cmVuZ3RoO1xcbiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVBcXG5cXHR2ZWM0IHRleGVsU3BlY3VsYXIgPSB0ZXh0dXJlMkQoIHNwZWN1bGFyTWFwLCB2VXYgKTtcXG5cXHRzcGVjdWxhclN0cmVuZ3RoID0gdGV4ZWxTcGVjdWxhci5yO1xcbiNlbHNlXFxuXFx0c3BlY3VsYXJTdHJlbmd0aCA9IDEuMDtcXG4jZW5kaWZcIjtcblxudmFyIHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhck1hcDtcXG4jZW5kaWZcIjtcblxudmFyIHRvbmVtYXBwaW5nX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVE9ORV9NQVBQSU5HIClcXG4gIGdsX0ZyYWdDb2xvci5yZ2IgPSB0b25lTWFwcGluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgdG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudCA9IFwiI2RlZmluZSBzYXR1cmF0ZShhKSBjbGFtcCggYSwgMC4wLCAxLjAgKVxcbnVuaWZvcm0gZmxvYXQgdG9uZU1hcHBpbmdFeHBvc3VyZTtcXG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nV2hpdGVQb2ludDtcXG52ZWMzIExpbmVhclRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xcblxcdHJldHVybiB0b25lTWFwcGluZ0V4cG9zdXJlICogY29sb3I7XFxufVxcbnZlYzMgUmVpbmhhcmRUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcXG5cXHRjb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlO1xcblxcdHJldHVybiBzYXR1cmF0ZSggY29sb3IgLyAoIHZlYzMoIDEuMCApICsgY29sb3IgKSApO1xcbn1cXG4jZGVmaW5lIFVuY2hhcnRlZDJIZWxwZXIoIHggKSBtYXgoICggKCB4ICogKCAwLjE1ICogeCArIDAuMTAgKiAwLjUwICkgKyAwLjIwICogMC4wMiApIC8gKCB4ICogKCAwLjE1ICogeCArIDAuNTAgKSArIDAuMjAgKiAwLjMwICkgKSAtIDAuMDIgLyAwLjMwLCB2ZWMzKCAwLjAgKSApXFxudmVjMyBVbmNoYXJ0ZWQyVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XFxuXFx0Y29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTtcXG5cXHRyZXR1cm4gc2F0dXJhdGUoIFVuY2hhcnRlZDJIZWxwZXIoIGNvbG9yICkgLyBVbmNoYXJ0ZWQySGVscGVyKCB2ZWMzKCB0b25lTWFwcGluZ1doaXRlUG9pbnQgKSApICk7XFxufVxcbnZlYzMgT3B0aW1pemVkQ2luZW9uVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XFxuXFx0Y29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTtcXG5cXHRjb2xvciA9IG1heCggdmVjMyggMC4wICksIGNvbG9yIC0gMC4wMDQgKTtcXG5cXHRyZXR1cm4gcG93KCAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDAuNSApICkgLyAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDEuNyApICsgMC4wNiApLCB2ZWMzKCAyLjIgKSApO1xcbn1cXG5cIjtcblxudmFyIHV2X3BhcnNfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggVVNFX1NQRUNVTEFSTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQICkgfHwgZGVmaW5lZCggVVNFX0VNSVNTSVZFTUFQICkgfHwgZGVmaW5lZCggVVNFX1JPVUdITkVTU01BUCApIHx8IGRlZmluZWQoIFVTRV9NRVRBTE5FU1NNQVAgKVxcblxcdHZhcnlpbmcgdmVjMiB2VXY7XFxuI2VuZGlmXCI7XG5cbnZhciB1dl9wYXJzX3ZlcnRleCA9IFwiI2lmIGRlZmluZWQoIFVTRV9NQVAgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBVU0VfU1BFQ1VMQVJNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQUxQSEFNQVAgKSB8fCBkZWZpbmVkKCBVU0VfRU1JU1NJVkVNQVAgKSB8fCBkZWZpbmVkKCBVU0VfUk9VR0hORVNTTUFQICkgfHwgZGVmaW5lZCggVVNFX01FVEFMTkVTU01BUCApXFxuXFx0dmFyeWluZyB2ZWMyIHZVdjtcXG5cXHR1bmlmb3JtIHZlYzQgb2Zmc2V0UmVwZWF0O1xcbiNlbmRpZlxcblwiO1xuXG52YXIgdXZfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFVTRV9TUEVDVUxBUk1BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApIHx8IGRlZmluZWQoIFVTRV9FTUlTU0lWRU1BUCApIHx8IGRlZmluZWQoIFVTRV9ST1VHSE5FU1NNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTUVUQUxORVNTTUFQIClcXG5cXHR2VXYgPSB1diAqIG9mZnNldFJlcGVhdC56dyArIG9mZnNldFJlcGVhdC54eTtcXG4jZW5kaWZcIjtcblxudmFyIHV2Ml9wYXJzX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcXG5cXHR2YXJ5aW5nIHZlYzIgdlV2MjtcXG4jZW5kaWZcIjtcblxudmFyIHV2Ml9wYXJzX3ZlcnRleCA9IFwiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXFxuXFx0YXR0cmlidXRlIHZlYzIgdXYyO1xcblxcdHZhcnlpbmcgdmVjMiB2VXYyO1xcbiNlbmRpZlwiO1xuXG52YXIgdXYyX3ZlcnRleCA9IFwiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXFxuXFx0dlV2MiA9IHV2MjtcXG4jZW5kaWZcIjtcblxudmFyIHdvcmxkcG9zX3ZlcnRleCA9IFwiI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApIHx8IGRlZmluZWQoIFBIWVNJQ0FMICkgfHwgZGVmaW5lZCggTEFNQkVSVCApIHx8IGRlZmluZWQgKCBVU0VfU0hBRE9XTUFQIClcXG5cXHQjaWZkZWYgVVNFX1NLSU5OSU5HXFxuXFx0XFx0dmVjNCB3b3JsZFBvc2l0aW9uID0gbW9kZWxNYXRyaXggKiBza2lubmVkO1xcblxcdCNlbHNlXFxuXFx0XFx0dmVjNCB3b3JsZFBvc2l0aW9uID0gbW9kZWxNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBjdWJlX2ZyYWcgPSBcInVuaWZvcm0gc2FtcGxlckN1YmUgdEN1YmU7XFxudW5pZm9ybSBmbG9hdCB0RmxpcDtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxudm9pZCBtYWluKCkge1xcblxcdGdsX0ZyYWdDb2xvciA9IHRleHR1cmVDdWJlKCB0Q3ViZSwgdmVjMyggdEZsaXAgKiB2V29ybGRQb3NpdGlvbi54LCB2V29ybGRQb3NpdGlvbi55eiApICk7XFxuXFx0Z2xfRnJhZ0NvbG9yLmEgKj0gb3BhY2l0eTtcXG59XFxuXCI7XG5cbnZhciBjdWJlX3ZlcnQgPSBcInZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbnZvaWQgbWFpbigpIHtcXG5cXHR2V29ybGRQb3NpdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgZGVwdGhfZnJhZyA9IFwiI2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMFxcblxcdHVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCAxLjAgKTtcXG5cXHQjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXFxuXFx0XFx0ZGlmZnVzZUNvbG9yLmEgPSBvcGFjaXR5O1xcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxcblxcdCNpZiBERVBUSF9QQUNLSU5HID09IDMyMDBcXG5cXHRcXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCB2ZWMzKCBnbF9GcmFnQ29vcmQueiApLCBvcGFjaXR5ICk7XFxuXFx0I2VsaWYgREVQVEhfUEFDS0lORyA9PSAzMjAxXFxuXFx0XFx0Z2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBnbF9GcmFnQ29vcmQueiApO1xcblxcdCNlbmRpZlxcbn1cXG5cIjtcblxudmFyIGRlcHRoX3ZlcnQgPSBcIiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIGRpc3RhbmNlUkdCQV9mcmFnID0gXCJ1bmlmb3JtIHZlYzMgbGlnaHRQb3M7XFxudmFyeWluZyB2ZWM0IHZXb3JsZFBvc2l0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbiAoKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHRnbF9GcmFnQ29sb3IgPSBwYWNrRGVwdGhUb1JHQkEoIGxlbmd0aCggdldvcmxkUG9zaXRpb24ueHl6IC0gbGlnaHRQb3MueHl6ICkgLyAxMDAwLjAgKTtcXG59XFxuXCI7XG5cbnZhciBkaXN0YW5jZVJHQkFfdmVydCA9IFwidmFyeWluZyB2ZWM0IHZXb3JsZFBvc2l0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdHZXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbjtcXG59XFxuXCI7XG5cbnZhciBlcXVpcmVjdF9mcmFnID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0RXF1aXJlY3Q7XFxudW5pZm9ybSBmbG9hdCB0RmxpcDtcXG52YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG52b2lkIG1haW4oKSB7XFxuXFx0dmVjMyBkaXJlY3Rpb24gPSBub3JtYWxpemUoIHZXb3JsZFBvc2l0aW9uICk7XFxuXFx0dmVjMiBzYW1wbGVVVjtcXG5cXHRzYW1wbGVVVi55ID0gc2F0dXJhdGUoIHRGbGlwICogZGlyZWN0aW9uLnkgKiAtMC41ICsgMC41ICk7XFxuXFx0c2FtcGxlVVYueCA9IGF0YW4oIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKCB0RXF1aXJlY3QsIHNhbXBsZVVWICk7XFxufVxcblwiO1xuXG52YXIgZXF1aXJlY3RfdmVydCA9IFwidmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxudm9pZCBtYWluKCkge1xcblxcdHZXb3JsZFBvc2l0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG59XFxuXCI7XG5cbnZhciBsaW5lZGFzaGVkX2ZyYWcgPSBcInVuaWZvcm0gdmVjMyBkaWZmdXNlO1xcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG51bmlmb3JtIGZsb2F0IGRhc2hTaXplO1xcbnVuaWZvcm0gZmxvYXQgdG90YWxTaXplO1xcbnZhcnlpbmcgZmxvYXQgdkxpbmVEaXN0YW5jZTtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0aWYgKCBtb2QoIHZMaW5lRGlzdGFuY2UsIHRvdGFsU2l6ZSApID4gZGFzaFNpemUgKSB7XFxuXFx0XFx0ZGlzY2FyZDtcXG5cXHR9XFxuXFx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gdmVjMyggMC4wICk7XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHRvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYjtcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxufVxcblwiO1xuXG52YXIgbGluZWRhc2hlZF92ZXJ0ID0gXCJ1bmlmb3JtIGZsb2F0IHNjYWxlO1xcbmF0dHJpYnV0ZSBmbG9hdCBsaW5lRGlzdGFuY2U7XFxudmFyeWluZyBmbG9hdCB2TGluZURpc3RhbmNlO1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XFxuXFx0dkxpbmVEaXN0YW5jZSA9IHNjYWxlICogbGluZURpc3RhbmNlO1xcblxcdHZlYzQgbXZQb3NpdGlvbiA9IG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgbWVzaGJhc2ljX2ZyYWcgPSBcInVuaWZvcm0gdmVjMyBkaWZmdXNlO1xcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxlbnZtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XFxuXFx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcXG5cXHQjaWZkZWYgVVNFX0xJR0hUTUFQXFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKS54eXogKiBsaWdodE1hcEludGVuc2l0eTtcXG5cXHQjZWxzZVxcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSB2ZWMzKCAxLjAgKTtcXG5cXHQjZW5kaWZcXG5cXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICo9IGRpZmZ1c2VDb2xvci5yZ2I7XFxuXFx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlO1xcblxcdCNpbmNsdWRlIDxub3JtYWxfZmxpcD5cXG5cXHQjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PlxcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBtZXNoYmFzaWNfdmVydCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpZmRlZiBVU0VfRU5WTUFQXFxuXFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XFxuXCI7XG5cbnZhciBtZXNobGFtYmVydF9mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbnZhcnlpbmcgdmVjMyB2TGlnaHRGcm9udDtcXG4jaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZMaWdodEJhY2s7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJzZGZzPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFycz5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XFxuXFx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgPSBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xcblxcdCNpbmNsdWRlIDxsaWdodG1hcF9mcmFnbWVudD5cXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gQlJERl9EaWZmdXNlX0xhbWJlcnQoIGRpZmZ1c2VDb2xvci5yZ2IgKTtcXG5cXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSA9ICggZ2xfRnJvbnRGYWNpbmcgKSA/IHZMaWdodEZyb250IDogdkxpZ2h0QmFjaztcXG5cXHQjZWxzZVxcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgPSB2TGlnaHRGcm9udDtcXG5cXHQjZW5kaWZcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICo9IEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBkaWZmdXNlQ29sb3IucmdiICkgKiBnZXRTaGFkb3dNYXNrKCk7XFxuXFx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mbGlwPlxcblxcdCNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcXG5cXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XFxufVxcblwiO1xuXG52YXIgbWVzaGxhbWJlcnRfdmVydCA9IFwiI2RlZmluZSBMQU1CRVJUXFxudmFyeWluZyB2ZWMzIHZMaWdodEZyb250O1xcbiNpZmRlZiBET1VCTEVfU0lERURcXG5cXHR2YXJ5aW5nIHZlYzMgdkxpZ2h0QmFjaztcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGJzZGZzPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFycz5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19sYW1iZXJ0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XFxuXCI7XG5cbnZhciBtZXNocGhvbmdfZnJhZyA9IFwiI2RlZmluZSBQSE9OR1xcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xcbnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTtcXG51bmlmb3JtIHZlYzMgc3BlY3VsYXI7XFxudW5pZm9ybSBmbG9hdCBzaGluaW5lc3M7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1djJfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnNkZnM+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzPlxcbiNpbmNsdWRlIDxsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XFxuXFx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxub3JtYWxfZmxpcD5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX3Bob25nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxsaWdodHNfdGVtcGxhdGU+XFxuXFx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XFxuXFx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBtZXNocGhvbmdfdmVydCA9IFwiI2RlZmluZSBQSE9OR1xcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xcbiNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgbWVzaHBoeXNpY2FsX2ZyYWcgPSBcIiNkZWZpbmUgUEhZU0lDQUxcXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XFxudW5pZm9ybSBmbG9hdCByb3VnaG5lc3M7XFxudW5pZm9ybSBmbG9hdCBtZXRhbG5lc3M7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpZm5kZWYgU1RBTkRBUkRcXG5cXHR1bmlmb3JtIGZsb2F0IGNsZWFyQ29hdDtcXG5cXHR1bmlmb3JtIGZsb2F0IGNsZWFyQ29hdFJvdWdobmVzcztcXG4jZW5kaWZcXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxic2Rmcz5cXG4jaW5jbHVkZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsaWdodHNfcGFycz5cXG4jaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XFxuXFx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxyb3VnaG5lc3NtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1ldGFsbmVzc21hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZsaXA+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX3RlbXBsYXRlPlxcblxcdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Plxcbn1cXG5cIjtcblxudmFyIG1lc2hwaHlzaWNhbF92ZXJ0ID0gXCIjZGVmaW5lIFBIWVNJQ0FMXFxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xcbiNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgbm9ybWFsX2ZyYWcgPSBcIiNkZWZpbmUgTk9STUFMXFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApXFxuXFx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2VuZGlmXFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mbGlwPlxcblxcdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnQ+XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggcGFja05vcm1hbFRvUkdCKCBub3JtYWwgKSwgb3BhY2l0eSApO1xcbn1cXG5cIjtcblxudmFyIG5vcm1hbF92ZXJ0ID0gXCIjZGVmaW5lIE5PUk1BTFxcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApXFxuXFx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2VuZGlmXFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XFxuI2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQIClcXG5cXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcXG4jZW5kaWZcXG59XFxuXCI7XG5cbnZhciBwb2ludHNfZnJhZyA9IFwidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApO1xcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX3BhcnRpY2xlX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxcblxcdG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiO1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBwb2ludHNfdmVydCA9IFwidW5pZm9ybSBmbG9hdCBzaXplO1xcbnVuaWZvcm0gZmxvYXQgc2NhbGU7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpZmRlZiBVU0VfU0laRUFUVEVOVUFUSU9OXFxuXFx0XFx0Z2xfUG9pbnRTaXplID0gc2l6ZSAqICggc2NhbGUgLyAtIG12UG9zaXRpb24ueiApO1xcblxcdCNlbHNlXFxuXFx0XFx0Z2xfUG9pbnRTaXplID0gc2l6ZTtcXG5cXHQjZW5kaWZcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgc2hhZG93X2ZyYWcgPSBcInVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDxic2Rmcz5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnM+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIDAuMCwgMC4wLCAwLjAsIG9wYWNpdHkgKiAoIDEuMCAtIGdldFNoYWRvd01hc2soKSApICk7XFxufVxcblwiO1xuXG52YXIgc2hhZG93X3ZlcnQgPSBcIiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgU2hhZGVyQ2h1bmsgPSB7XG5cdGFscGhhbWFwX2ZyYWdtZW50OiBhbHBoYW1hcF9mcmFnbWVudCxcblx0YWxwaGFtYXBfcGFyc19mcmFnbWVudDogYWxwaGFtYXBfcGFyc19mcmFnbWVudCxcblx0YWxwaGF0ZXN0X2ZyYWdtZW50OiBhbHBoYXRlc3RfZnJhZ21lbnQsXG5cdGFvbWFwX2ZyYWdtZW50OiBhb21hcF9mcmFnbWVudCxcblx0YW9tYXBfcGFyc19mcmFnbWVudDogYW9tYXBfcGFyc19mcmFnbWVudCxcblx0YmVnaW5fdmVydGV4OiBiZWdpbl92ZXJ0ZXgsXG5cdGJlZ2lubm9ybWFsX3ZlcnRleDogYmVnaW5ub3JtYWxfdmVydGV4LFxuXHRic2RmczogYnNkZnMsXG5cdGJ1bXBtYXBfcGFyc19mcmFnbWVudDogYnVtcG1hcF9wYXJzX2ZyYWdtZW50LFxuXHRjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ6IGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudCxcblx0Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ6IGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50LFxuXHRjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg6IGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleCxcblx0Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleDogY2xpcHBpbmdfcGxhbmVzX3ZlcnRleCxcblx0Y29sb3JfZnJhZ21lbnQ6IGNvbG9yX2ZyYWdtZW50LFxuXHRjb2xvcl9wYXJzX2ZyYWdtZW50OiBjb2xvcl9wYXJzX2ZyYWdtZW50LFxuXHRjb2xvcl9wYXJzX3ZlcnRleDogY29sb3JfcGFyc192ZXJ0ZXgsXG5cdGNvbG9yX3ZlcnRleDogY29sb3JfdmVydGV4LFxuXHRjb21tb246IGNvbW1vbixcblx0Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50OiBjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQsXG5cdGRlZmF1bHRub3JtYWxfdmVydGV4OiBkZWZhdWx0bm9ybWFsX3ZlcnRleCxcblx0ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4OiBkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXgsXG5cdGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg6IGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXgsXG5cdGVtaXNzaXZlbWFwX2ZyYWdtZW50OiBlbWlzc2l2ZW1hcF9mcmFnbWVudCxcblx0ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudDogZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudCxcblx0ZW5jb2RpbmdzX2ZyYWdtZW50OiBlbmNvZGluZ3NfZnJhZ21lbnQsXG5cdGVuY29kaW5nc19wYXJzX2ZyYWdtZW50OiBlbmNvZGluZ3NfcGFyc19mcmFnbWVudCxcblx0ZW52bWFwX2ZyYWdtZW50OiBlbnZtYXBfZnJhZ21lbnQsXG5cdGVudm1hcF9wYXJzX2ZyYWdtZW50OiBlbnZtYXBfcGFyc19mcmFnbWVudCxcblx0ZW52bWFwX3BhcnNfdmVydGV4OiBlbnZtYXBfcGFyc192ZXJ0ZXgsXG5cdGVudm1hcF92ZXJ0ZXg6IGVudm1hcF92ZXJ0ZXgsXG5cdGZvZ192ZXJ0ZXg6IGZvZ192ZXJ0ZXgsXG5cdGZvZ19wYXJzX3ZlcnRleDogZm9nX3BhcnNfdmVydGV4LFxuXHRmb2dfZnJhZ21lbnQ6IGZvZ19mcmFnbWVudCxcblx0Zm9nX3BhcnNfZnJhZ21lbnQ6IGZvZ19wYXJzX2ZyYWdtZW50LFxuXHRncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50OiBncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50LFxuXHRsaWdodG1hcF9mcmFnbWVudDogbGlnaHRtYXBfZnJhZ21lbnQsXG5cdGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ6IGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQsXG5cdGxpZ2h0c19sYW1iZXJ0X3ZlcnRleDogbGlnaHRzX2xhbWJlcnRfdmVydGV4LFxuXHRsaWdodHNfcGFyczogbGlnaHRzX3BhcnMsXG5cdGxpZ2h0c19waG9uZ19mcmFnbWVudDogbGlnaHRzX3Bob25nX2ZyYWdtZW50LFxuXHRsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudDogbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQsXG5cdGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudDogbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50LFxuXHRsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudDogbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQsXG5cdGxpZ2h0c190ZW1wbGF0ZTogbGlnaHRzX3RlbXBsYXRlLFxuXHRsb2dkZXB0aGJ1Zl9mcmFnbWVudDogbG9nZGVwdGhidWZfZnJhZ21lbnQsXG5cdGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ6IGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQsXG5cdGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4OiBsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleCxcblx0bG9nZGVwdGhidWZfdmVydGV4OiBsb2dkZXB0aGJ1Zl92ZXJ0ZXgsXG5cdG1hcF9mcmFnbWVudDogbWFwX2ZyYWdtZW50LFxuXHRtYXBfcGFyc19mcmFnbWVudDogbWFwX3BhcnNfZnJhZ21lbnQsXG5cdG1hcF9wYXJ0aWNsZV9mcmFnbWVudDogbWFwX3BhcnRpY2xlX2ZyYWdtZW50LFxuXHRtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudDogbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQsXG5cdG1ldGFsbmVzc21hcF9mcmFnbWVudDogbWV0YWxuZXNzbWFwX2ZyYWdtZW50LFxuXHRtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudDogbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQsXG5cdG1vcnBobm9ybWFsX3ZlcnRleDogbW9ycGhub3JtYWxfdmVydGV4LFxuXHRtb3JwaHRhcmdldF9wYXJzX3ZlcnRleDogbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXgsXG5cdG1vcnBodGFyZ2V0X3ZlcnRleDogbW9ycGh0YXJnZXRfdmVydGV4LFxuXHRub3JtYWxfZmxpcDogbm9ybWFsX2ZsaXAsXG5cdG5vcm1hbF9mcmFnbWVudDogbm9ybWFsX2ZyYWdtZW50LFxuXHRub3JtYWxtYXBfcGFyc19mcmFnbWVudDogbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQsXG5cdHBhY2tpbmc6IHBhY2tpbmcsXG5cdHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ6IHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQsXG5cdHByb2plY3RfdmVydGV4OiBwcm9qZWN0X3ZlcnRleCxcblx0ZGl0aGVyaW5nX2ZyYWdtZW50OiBkaXRoZXJpbmdfZnJhZ21lbnQsXG5cdGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50OiBkaXRoZXJpbmdfcGFyc19mcmFnbWVudCxcblx0cm91Z2huZXNzbWFwX2ZyYWdtZW50OiByb3VnaG5lc3NtYXBfZnJhZ21lbnQsXG5cdHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50OiByb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudCxcblx0c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ6IHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50LFxuXHRzaGFkb3dtYXBfcGFyc192ZXJ0ZXg6IHNoYWRvd21hcF9wYXJzX3ZlcnRleCxcblx0c2hhZG93bWFwX3ZlcnRleDogc2hhZG93bWFwX3ZlcnRleCxcblx0c2hhZG93bWFza19wYXJzX2ZyYWdtZW50OiBzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQsXG5cdHNraW5iYXNlX3ZlcnRleDogc2tpbmJhc2VfdmVydGV4LFxuXHRza2lubmluZ19wYXJzX3ZlcnRleDogc2tpbm5pbmdfcGFyc192ZXJ0ZXgsXG5cdHNraW5uaW5nX3ZlcnRleDogc2tpbm5pbmdfdmVydGV4LFxuXHRza2lubm9ybWFsX3ZlcnRleDogc2tpbm5vcm1hbF92ZXJ0ZXgsXG5cdHNwZWN1bGFybWFwX2ZyYWdtZW50OiBzcGVjdWxhcm1hcF9mcmFnbWVudCxcblx0c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudDogc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudCxcblx0dG9uZW1hcHBpbmdfZnJhZ21lbnQ6IHRvbmVtYXBwaW5nX2ZyYWdtZW50LFxuXHR0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50OiB0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50LFxuXHR1dl9wYXJzX2ZyYWdtZW50OiB1dl9wYXJzX2ZyYWdtZW50LFxuXHR1dl9wYXJzX3ZlcnRleDogdXZfcGFyc192ZXJ0ZXgsXG5cdHV2X3ZlcnRleDogdXZfdmVydGV4LFxuXHR1djJfcGFyc19mcmFnbWVudDogdXYyX3BhcnNfZnJhZ21lbnQsXG5cdHV2Ml9wYXJzX3ZlcnRleDogdXYyX3BhcnNfdmVydGV4LFxuXHR1djJfdmVydGV4OiB1djJfdmVydGV4LFxuXHR3b3JsZHBvc192ZXJ0ZXg6IHdvcmxkcG9zX3ZlcnRleCxcblxuXHRjdWJlX2ZyYWc6IGN1YmVfZnJhZyxcblx0Y3ViZV92ZXJ0OiBjdWJlX3ZlcnQsXG5cdGRlcHRoX2ZyYWc6IGRlcHRoX2ZyYWcsXG5cdGRlcHRoX3ZlcnQ6IGRlcHRoX3ZlcnQsXG5cdGRpc3RhbmNlUkdCQV9mcmFnOiBkaXN0YW5jZVJHQkFfZnJhZyxcblx0ZGlzdGFuY2VSR0JBX3ZlcnQ6IGRpc3RhbmNlUkdCQV92ZXJ0LFxuXHRlcXVpcmVjdF9mcmFnOiBlcXVpcmVjdF9mcmFnLFxuXHRlcXVpcmVjdF92ZXJ0OiBlcXVpcmVjdF92ZXJ0LFxuXHRsaW5lZGFzaGVkX2ZyYWc6IGxpbmVkYXNoZWRfZnJhZyxcblx0bGluZWRhc2hlZF92ZXJ0OiBsaW5lZGFzaGVkX3ZlcnQsXG5cdG1lc2hiYXNpY19mcmFnOiBtZXNoYmFzaWNfZnJhZyxcblx0bWVzaGJhc2ljX3ZlcnQ6IG1lc2hiYXNpY192ZXJ0LFxuXHRtZXNobGFtYmVydF9mcmFnOiBtZXNobGFtYmVydF9mcmFnLFxuXHRtZXNobGFtYmVydF92ZXJ0OiBtZXNobGFtYmVydF92ZXJ0LFxuXHRtZXNocGhvbmdfZnJhZzogbWVzaHBob25nX2ZyYWcsXG5cdG1lc2hwaG9uZ192ZXJ0OiBtZXNocGhvbmdfdmVydCxcblx0bWVzaHBoeXNpY2FsX2ZyYWc6IG1lc2hwaHlzaWNhbF9mcmFnLFxuXHRtZXNocGh5c2ljYWxfdmVydDogbWVzaHBoeXNpY2FsX3ZlcnQsXG5cdG5vcm1hbF9mcmFnOiBub3JtYWxfZnJhZyxcblx0bm9ybWFsX3ZlcnQ6IG5vcm1hbF92ZXJ0LFxuXHRwb2ludHNfZnJhZzogcG9pbnRzX2ZyYWcsXG5cdHBvaW50c192ZXJ0OiBwb2ludHNfdmVydCxcblx0c2hhZG93X2ZyYWc6IHNoYWRvd19mcmFnLFxuXHRzaGFkb3dfdmVydDogc2hhZG93X3ZlcnRcbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICovXG5cbnZhciBTaGFkZXJMaWIgPSB7XG5cblx0YmFzaWM6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5hb21hcCxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nXG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNoYmFzaWNfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaGJhc2ljX2ZyYWdcblxuXHR9LFxuXG5cdGxhbWJlcnQ6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5hb21hcCxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW1pc3NpdmVtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2csXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodHMsXG5cdFx0XHR7XG5cdFx0XHRcdGVtaXNzaXZlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MDAwMDAwICkgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaGxhbWJlcnRfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaGxhbWJlcnRfZnJhZ1xuXG5cdH0sXG5cblx0cGhvbmc6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5hb21hcCxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW1pc3NpdmVtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZ3JhZGllbnRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2csXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodHMsXG5cdFx0XHR7XG5cdFx0XHRcdGVtaXNzaXZlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MDAwMDAwICkgfSxcblx0XHRcdFx0c3BlY3VsYXI6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgxMTExMTEgKSB9LFxuXHRcdFx0XHRzaGluaW5lc3M6IHsgdmFsdWU6IDMwIH1cblx0XHRcdH1cblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaG9uZ192ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGhvbmdfZnJhZ1xuXG5cdH0sXG5cblx0c3RhbmRhcmQ6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5hb21hcCxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW1pc3NpdmVtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIucm91Z2huZXNzbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubWV0YWxuZXNzbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRzLFxuXHRcdFx0e1xuXHRcdFx0XHRlbWlzc2l2ZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweDAwMDAwMCApIH0sXG5cdFx0XHRcdHJvdWdobmVzczogeyB2YWx1ZTogMC41IH0sXG5cdFx0XHRcdG1ldGFsbmVzczogeyB2YWx1ZTogMC41IH0sXG5cdFx0XHRcdGVudk1hcEludGVuc2l0eTogeyB2YWx1ZTogMSB9IC8vIHRlbXBvcmFyeVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF9mcmFnXG5cblx0fSxcblxuXHRwb2ludHM6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5wb2ludHMsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2dcblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLnBvaW50c192ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5wb2ludHNfZnJhZ1xuXG5cdH0sXG5cblx0ZGFzaGVkOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxuXHRcdFx0e1xuXHRcdFx0XHRzY2FsZTogeyB2YWx1ZTogMSB9LFxuXHRcdFx0XHRkYXNoU2l6ZTogeyB2YWx1ZTogMSB9LFxuXHRcdFx0XHR0b3RhbFNpemU6IHsgdmFsdWU6IDIgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubGluZWRhc2hlZF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5saW5lZGFzaGVkX2ZyYWdcblxuXHR9LFxuXG5cdGRlcHRoOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwXG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5kZXB0aF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5kZXB0aF9mcmFnXG5cblx0fSxcblxuXHRub3JtYWw6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0e1xuXHRcdFx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubm9ybWFsX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm5vcm1hbF9mcmFnXG5cblx0fSxcblxuXHQvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vXHRDdWJlIG1hcCBzaGFkZXJcblx0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHRjdWJlOiB7XG5cblx0XHR1bmlmb3Jtczoge1xuXHRcdFx0dEN1YmU6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRcdHRGbGlwOiB7IHZhbHVlOiAtIDEgfSxcblx0XHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9XG5cdFx0fSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuY3ViZV92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5jdWJlX2ZyYWdcblxuXHR9LFxuXG5cdC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly9cdEN1YmUgbWFwIHNoYWRlclxuXHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdGVxdWlyZWN0OiB7XG5cblx0XHR1bmlmb3Jtczoge1xuXHRcdFx0dEVxdWlyZWN0OiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0XHR0RmxpcDogeyB2YWx1ZTogLSAxIH1cblx0XHR9LFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5lcXVpcmVjdF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5lcXVpcmVjdF9mcmFnXG5cblx0fSxcblxuXHRkaXN0YW5jZVJHQkE6IHtcblxuXHRcdHVuaWZvcm1zOiB7XG5cdFx0XHRsaWdodFBvczogeyB2YWx1ZTogbmV3IFZlY3RvcjMoKSB9XG5cdFx0fSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuZGlzdGFuY2VSR0JBX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmRpc3RhbmNlUkdCQV9mcmFnXG5cblx0fVxuXG59O1xuXG5TaGFkZXJMaWIucGh5c2ljYWwgPSB7XG5cblx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRTaGFkZXJMaWIuc3RhbmRhcmQudW5pZm9ybXMsXG5cdFx0e1xuXHRcdFx0Y2xlYXJDb2F0OiB7IHZhbHVlOiAwIH0sXG5cdFx0XHRjbGVhckNvYXRSb3VnaG5lc3M6IHsgdmFsdWU6IDAgfVxuXHRcdH1cblx0XSApLFxuXG5cdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX3ZlcnQsXG5cdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGh5c2ljYWxfZnJhZ1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBCb3gyKCBtaW4sIG1heCApIHtcblxuXHR0aGlzLm1pbiA9ICggbWluICE9PSB1bmRlZmluZWQgKSA/IG1pbiA6IG5ldyBWZWN0b3IyKCArIEluZmluaXR5LCArIEluZmluaXR5ICk7XG5cdHRoaXMubWF4ID0gKCBtYXggIT09IHVuZGVmaW5lZCApID8gbWF4IDogbmV3IFZlY3RvcjIoIC0gSW5maW5pdHksIC0gSW5maW5pdHkgKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBCb3gyLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdHRoaXMubWluLmNvcHkoIG1pbiApO1xuXHRcdHRoaXMubWF4LmNvcHkoIG1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tUG9pbnRzOiBmdW5jdGlvbiAoIHBvaW50cyApIHtcblxuXHRcdHRoaXMubWFrZUVtcHR5KCk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmV4cGFuZEJ5UG9pbnQoIHBvaW50c1sgaSBdICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21DZW50ZXJBbmRTaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldEZyb21DZW50ZXJBbmRTaXplKCBjZW50ZXIsIHNpemUgKSB7XG5cblx0XHRcdHZhciBoYWxmU2l6ZSA9IHYxLmNvcHkoIHNpemUgKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cdFx0XHR0aGlzLm1pbi5jb3B5KCBjZW50ZXIgKS5zdWIoIGhhbGZTaXplICk7XG5cdFx0XHR0aGlzLm1heC5jb3B5KCBjZW50ZXIgKS5hZGQoIGhhbGZTaXplICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0dGhpcy5taW4uY29weSggYm94Lm1pbiApO1xuXHRcdHRoaXMubWF4LmNvcHkoIGJveC5tYXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZUVtcHR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLm1pbi54ID0gdGhpcy5taW4ueSA9ICsgSW5maW5pdHk7XG5cdFx0dGhpcy5tYXgueCA9IHRoaXMubWF4LnkgPSAtIEluZmluaXR5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRpc0VtcHR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyB0aGlzIGlzIGEgbW9yZSByb2J1c3QgY2hlY2sgZm9yIGVtcHR5IHRoYW4gKCB2b2x1bWUgPD0gMCApIGJlY2F1c2Ugdm9sdW1lIGNhbiBnZXQgcG9zaXRpdmUgd2l0aCB0d28gbmVnYXRpdmUgYXhlc1xuXG5cdFx0cmV0dXJuICggdGhpcy5tYXgueCA8IHRoaXMubWluLnggKSB8fCAoIHRoaXMubWF4LnkgPCB0aGlzLm1pbi55ICk7XG5cblx0fSxcblxuXHRnZXRDZW50ZXI6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTtcblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyByZXN1bHQuc2V0KCAwLCAwICkgOiByZXN1bHQuYWRkVmVjdG9ycyggdGhpcy5taW4sIHRoaXMubWF4ICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xuXG5cdH0sXG5cblx0Z2V0U2l6ZTogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHJlc3VsdC5zZXQoIDAsIDAgKSA6IHJlc3VsdC5zdWJWZWN0b3JzKCB0aGlzLm1heCwgdGhpcy5taW4gKTtcblxuXHR9LFxuXG5cdGV4cGFuZEJ5UG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHR0aGlzLm1pbi5taW4oIHBvaW50ICk7XG5cdFx0dGhpcy5tYXgubWF4KCBwb2ludCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRleHBhbmRCeVZlY3RvcjogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHR0aGlzLm1pbi5zdWIoIHZlY3RvciApO1xuXHRcdHRoaXMubWF4LmFkZCggdmVjdG9yICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGV4cGFuZEJ5U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMubWluLmFkZFNjYWxhciggLSBzY2FsYXIgKTtcblx0XHR0aGlzLm1heC5hZGRTY2FsYXIoIHNjYWxhciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb250YWluc1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0cmV0dXJuIHBvaW50LnggPCB0aGlzLm1pbi54IHx8IHBvaW50LnggPiB0aGlzLm1heC54IHx8XG5cdFx0XHRwb2ludC55IDwgdGhpcy5taW4ueSB8fCBwb2ludC55ID4gdGhpcy5tYXgueSA/IGZhbHNlIDogdHJ1ZTtcblxuXHR9LFxuXG5cdGNvbnRhaW5zQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHJldHVybiB0aGlzLm1pbi54IDw9IGJveC5taW4ueCAmJiBib3gubWF4LnggPD0gdGhpcy5tYXgueCAmJlxuXHRcdFx0dGhpcy5taW4ueSA8PSBib3gubWluLnkgJiYgYm94Lm1heC55IDw9IHRoaXMubWF4Lnk7XG5cblx0fSxcblxuXHRnZXRQYXJhbWV0ZXI6IGZ1bmN0aW9uICggcG9pbnQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Ly8gVGhpcyBjYW4gcG90ZW50aWFsbHkgaGF2ZSBhIGRpdmlkZSBieSB6ZXJvIGlmIHRoZSBib3hcblx0XHQvLyBoYXMgYSBzaXplIGRpbWVuc2lvbiBvZiAwLlxuXG5cdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IyKCk7XG5cblx0XHRyZXR1cm4gcmVzdWx0LnNldChcblx0XHRcdCggcG9pbnQueCAtIHRoaXMubWluLnggKSAvICggdGhpcy5tYXgueCAtIHRoaXMubWluLnggKSxcblx0XHRcdCggcG9pbnQueSAtIHRoaXMubWluLnkgKSAvICggdGhpcy5tYXgueSAtIHRoaXMubWluLnkgKVxuXHRcdCk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdC8vIHVzaW5nIDQgc3BsaXR0aW5nIHBsYW5lcyB0byBydWxlIG91dCBpbnRlcnNlY3Rpb25zXG5cblx0XHRyZXR1cm4gYm94Lm1heC54IDwgdGhpcy5taW4ueCB8fCBib3gubWluLnggPiB0aGlzLm1heC54IHx8XG5cdFx0XHRib3gubWF4LnkgPCB0aGlzLm1pbi55IHx8IGJveC5taW4ueSA+IHRoaXMubWF4LnkgPyBmYWxzZSA6IHRydWU7XG5cblx0fSxcblxuXHRjbGFtcFBvaW50OiBmdW5jdGlvbiAoIHBvaW50LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXHRcdHJldHVybiByZXN1bHQuY29weSggcG9pbnQgKS5jbGFtcCggdGhpcy5taW4sIHRoaXMubWF4ICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHtcblxuXHRcdFx0dmFyIGNsYW1wZWRQb2ludCA9IHYxLmNvcHkoIHBvaW50ICkuY2xhbXAoIHRoaXMubWluLCB0aGlzLm1heCApO1xuXHRcdFx0cmV0dXJuIGNsYW1wZWRQb2ludC5zdWIoIHBvaW50ICkubGVuZ3RoKCk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRpbnRlcnNlY3Q6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0dGhpcy5taW4ubWF4KCBib3gubWluICk7XG5cdFx0dGhpcy5tYXgubWluKCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHVuaW9uOiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHRoaXMubWluLm1pbiggYm94Lm1pbiApO1xuXHRcdHRoaXMubWF4Lm1heCggYm94Lm1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICggb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5taW4uYWRkKCBvZmZzZXQgKTtcblx0XHR0aGlzLm1heC5hZGQoIG9mZnNldCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5taW4uZXF1YWxzKCB0aGlzLm1pbiApICYmIGJveC5tYXguZXF1YWxzKCB0aGlzLm1heCApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIExlbnNGbGFyZVBsdWdpbiggcmVuZGVyZXIsIGZsYXJlcyApIHtcblxuXHR2YXIgZ2wgPSByZW5kZXJlci5jb250ZXh0O1xuXHR2YXIgc3RhdGUgPSByZW5kZXJlci5zdGF0ZTtcblxuXHR2YXIgdmVydGV4QnVmZmVyLCBlbGVtZW50QnVmZmVyO1xuXHR2YXIgc2hhZGVyLCBwcm9ncmFtLCBhdHRyaWJ1dGVzLCB1bmlmb3JtcztcblxuXHR2YXIgdGVtcFRleHR1cmUsIG9jY2x1c2lvblRleHR1cmU7XG5cblx0ZnVuY3Rpb24gaW5pdCgpIHtcblxuXHRcdHZhciB2ZXJ0aWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIFtcblx0XHRcdC0gMSwgLSAxLCAgMCwgMCxcblx0XHRcdCAxLCAtIDEsICAxLCAwLFxuXHRcdFx0IDEsICAxLCAgMSwgMSxcblx0XHRcdC0gMSwgIDEsICAwLCAxXG5cdFx0XSApO1xuXG5cdFx0dmFyIGZhY2VzID0gbmV3IFVpbnQxNkFycmF5KCBbXG5cdFx0XHQwLCAxLCAyLFxuXHRcdFx0MCwgMiwgM1xuXHRcdF0gKTtcblxuXHRcdC8vIGJ1ZmZlcnNcblxuXHRcdHZlcnRleEJ1ZmZlciAgICAgPSBnbC5jcmVhdGVCdWZmZXIoKTtcblx0XHRlbGVtZW50QnVmZmVyICAgID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBnbC5BUlJBWV9CVUZGRVIsIHZlcnRleEJ1ZmZlciApO1xuXHRcdGdsLmJ1ZmZlckRhdGEoIGdsLkFSUkFZX0JVRkZFUiwgdmVydGljZXMsIGdsLlNUQVRJQ19EUkFXICk7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZWxlbWVudEJ1ZmZlciApO1xuXHRcdGdsLmJ1ZmZlckRhdGEoIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBmYWNlcywgZ2wuU1RBVElDX0RSQVcgKTtcblxuXHRcdC8vIHRleHR1cmVzXG5cblx0XHR0ZW1wVGV4dHVyZSAgICAgID0gZ2wuY3JlYXRlVGV4dHVyZSgpO1xuXHRcdG9jY2x1c2lvblRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG5cblx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggZ2wuVEVYVFVSRV8yRCwgdGVtcFRleHR1cmUgKTtcblx0XHRnbC50ZXhJbWFnZTJEKCBnbC5URVhUVVJFXzJELCAwLCBnbC5SR0IsIDE2LCAxNiwgMCwgZ2wuUkdCLCBnbC5VTlNJR05FRF9CWVRFLCBudWxsICk7XG5cdFx0Z2wudGV4UGFyYW1ldGVyaSggZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UgKTtcblx0XHRnbC50ZXhQYXJhbWV0ZXJpKCBnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSApO1xuXHRcdGdsLnRleFBhcmFtZXRlcmkoIGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCApO1xuXHRcdGdsLnRleFBhcmFtZXRlcmkoIGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCApO1xuXG5cdFx0c3RhdGUuYmluZFRleHR1cmUoIGdsLlRFWFRVUkVfMkQsIG9jY2x1c2lvblRleHR1cmUgKTtcblx0XHRnbC50ZXhJbWFnZTJEKCBnbC5URVhUVVJFXzJELCAwLCBnbC5SR0JBLCAxNiwgMTYsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIG51bGwgKTtcblx0XHRnbC50ZXhQYXJhbWV0ZXJpKCBnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSApO1xuXHRcdGdsLnRleFBhcmFtZXRlcmkoIGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFICk7XG5cdFx0Z2wudGV4UGFyYW1ldGVyaSggZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5ORUFSRVNUICk7XG5cdFx0Z2wudGV4UGFyYW1ldGVyaSggZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5ORUFSRVNUICk7XG5cblx0XHRzaGFkZXIgPSB7XG5cblx0XHRcdHZlcnRleFNoYWRlcjogW1xuXG5cdFx0XHRcdFwidW5pZm9ybSBsb3dwIGludCByZW5kZXJUeXBlO1wiLFxuXG5cdFx0XHRcdFwidW5pZm9ybSB2ZWMzIHNjcmVlblBvc2l0aW9uO1wiLFxuXHRcdFx0XHRcInVuaWZvcm0gdmVjMiBzY2FsZTtcIixcblx0XHRcdFx0XCJ1bmlmb3JtIGZsb2F0IHJvdGF0aW9uO1wiLFxuXG5cdFx0XHRcdFwidW5pZm9ybSBzYW1wbGVyMkQgb2NjbHVzaW9uTWFwO1wiLFxuXG5cdFx0XHRcdFwiYXR0cmlidXRlIHZlYzIgcG9zaXRpb247XCIsXG5cdFx0XHRcdFwiYXR0cmlidXRlIHZlYzIgdXY7XCIsXG5cblx0XHRcdFx0XCJ2YXJ5aW5nIHZlYzIgdlVWO1wiLFxuXHRcdFx0XHRcInZhcnlpbmcgZmxvYXQgdlZpc2liaWxpdHk7XCIsXG5cblx0XHRcdFx0XCJ2b2lkIG1haW4oKSB7XCIsXG5cblx0XHRcdFx0XHRcInZVViA9IHV2O1wiLFxuXG5cdFx0XHRcdFx0XCJ2ZWMyIHBvcyA9IHBvc2l0aW9uO1wiLFxuXG5cdFx0XHRcdFx0XCJpZiAoIHJlbmRlclR5cGUgPT0gMiApIHtcIixcblxuXHRcdFx0XHRcdFx0XCJ2ZWM0IHZpc2liaWxpdHkgPSB0ZXh0dXJlMkQoIG9jY2x1c2lvbk1hcCwgdmVjMiggMC4xLCAwLjEgKSApO1wiLFxuXHRcdFx0XHRcdFx0XCJ2aXNpYmlsaXR5ICs9IHRleHR1cmUyRCggb2NjbHVzaW9uTWFwLCB2ZWMyKCAwLjUsIDAuMSApICk7XCIsXG5cdFx0XHRcdFx0XHRcInZpc2liaWxpdHkgKz0gdGV4dHVyZTJEKCBvY2NsdXNpb25NYXAsIHZlYzIoIDAuOSwgMC4xICkgKTtcIixcblx0XHRcdFx0XHRcdFwidmlzaWJpbGl0eSArPSB0ZXh0dXJlMkQoIG9jY2x1c2lvbk1hcCwgdmVjMiggMC45LCAwLjUgKSApO1wiLFxuXHRcdFx0XHRcdFx0XCJ2aXNpYmlsaXR5ICs9IHRleHR1cmUyRCggb2NjbHVzaW9uTWFwLCB2ZWMyKCAwLjksIDAuOSApICk7XCIsXG5cdFx0XHRcdFx0XHRcInZpc2liaWxpdHkgKz0gdGV4dHVyZTJEKCBvY2NsdXNpb25NYXAsIHZlYzIoIDAuNSwgMC45ICkgKTtcIixcblx0XHRcdFx0XHRcdFwidmlzaWJpbGl0eSArPSB0ZXh0dXJlMkQoIG9jY2x1c2lvbk1hcCwgdmVjMiggMC4xLCAwLjkgKSApO1wiLFxuXHRcdFx0XHRcdFx0XCJ2aXNpYmlsaXR5ICs9IHRleHR1cmUyRCggb2NjbHVzaW9uTWFwLCB2ZWMyKCAwLjEsIDAuNSApICk7XCIsXG5cdFx0XHRcdFx0XHRcInZpc2liaWxpdHkgKz0gdGV4dHVyZTJEKCBvY2NsdXNpb25NYXAsIHZlYzIoIDAuNSwgMC41ICkgKTtcIixcblxuXHRcdFx0XHRcdFx0XCJ2VmlzaWJpbGl0eSA9ICAgICAgICB2aXNpYmlsaXR5LnIgLyA5LjA7XCIsXG5cdFx0XHRcdFx0XHRcInZWaXNpYmlsaXR5ICo9IDEuMCAtIHZpc2liaWxpdHkuZyAvIDkuMDtcIixcblx0XHRcdFx0XHRcdFwidlZpc2liaWxpdHkgKj0gICAgICAgdmlzaWJpbGl0eS5iIC8gOS4wO1wiLFxuXHRcdFx0XHRcdFx0XCJ2VmlzaWJpbGl0eSAqPSAxLjAgLSB2aXNpYmlsaXR5LmEgLyA5LjA7XCIsXG5cblx0XHRcdFx0XHRcdFwicG9zLnggPSBjb3MoIHJvdGF0aW9uICkgKiBwb3NpdGlvbi54IC0gc2luKCByb3RhdGlvbiApICogcG9zaXRpb24ueTtcIixcblx0XHRcdFx0XHRcdFwicG9zLnkgPSBzaW4oIHJvdGF0aW9uICkgKiBwb3NpdGlvbi54ICsgY29zKCByb3RhdGlvbiApICogcG9zaXRpb24ueTtcIixcblxuXHRcdFx0XHRcdFwifVwiLFxuXG5cdFx0XHRcdFx0XCJnbF9Qb3NpdGlvbiA9IHZlYzQoICggcG9zICogc2NhbGUgKyBzY3JlZW5Qb3NpdGlvbi54eSApLnh5LCBzY3JlZW5Qb3NpdGlvbi56LCAxLjAgKTtcIixcblxuXHRcdFx0XHRcIn1cIlxuXG5cdFx0XHRdLmpvaW4oIFwiXFxuXCIgKSxcblxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IFtcblxuXHRcdFx0XHRcInVuaWZvcm0gbG93cCBpbnQgcmVuZGVyVHlwZTtcIixcblxuXHRcdFx0XHRcInVuaWZvcm0gc2FtcGxlcjJEIG1hcDtcIixcblx0XHRcdFx0XCJ1bmlmb3JtIGZsb2F0IG9wYWNpdHk7XCIsXG5cdFx0XHRcdFwidW5pZm9ybSB2ZWMzIGNvbG9yO1wiLFxuXG5cdFx0XHRcdFwidmFyeWluZyB2ZWMyIHZVVjtcIixcblx0XHRcdFx0XCJ2YXJ5aW5nIGZsb2F0IHZWaXNpYmlsaXR5O1wiLFxuXG5cdFx0XHRcdFwidm9pZCBtYWluKCkge1wiLFxuXG5cdFx0XHRcdFx0Ly8gcGluayBzcXVhcmVcblxuXHRcdFx0XHRcdFwiaWYgKCByZW5kZXJUeXBlID09IDAgKSB7XCIsXG5cblx0XHRcdFx0XHRcdFwiZ2xfRnJhZ0NvbG9yID0gdmVjNCggMS4wLCAwLjAsIDEuMCwgMC4wICk7XCIsXG5cblx0XHRcdFx0XHQvLyByZXN0b3JlXG5cblx0XHRcdFx0XHRcIn0gZWxzZSBpZiAoIHJlbmRlclR5cGUgPT0gMSApIHtcIixcblxuXHRcdFx0XHRcdFx0XCJnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoIG1hcCwgdlVWICk7XCIsXG5cblx0XHRcdFx0XHQvLyBmbGFyZVxuXG5cdFx0XHRcdFx0XCJ9IGVsc2Uge1wiLFxuXG5cdFx0XHRcdFx0XHRcInZlYzQgdGV4dHVyZSA9IHRleHR1cmUyRCggbWFwLCB2VVYgKTtcIixcblx0XHRcdFx0XHRcdFwidGV4dHVyZS5hICo9IG9wYWNpdHkgKiB2VmlzaWJpbGl0eTtcIixcblx0XHRcdFx0XHRcdFwiZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTtcIixcblx0XHRcdFx0XHRcdFwiZ2xfRnJhZ0NvbG9yLnJnYiAqPSBjb2xvcjtcIixcblxuXHRcdFx0XHRcdFwifVwiLFxuXG5cdFx0XHRcdFwifVwiXG5cblx0XHRcdF0uam9pbiggXCJcXG5cIiApXG5cblx0XHR9O1xuXG5cdFx0cHJvZ3JhbSA9IGNyZWF0ZVByb2dyYW0oIHNoYWRlciApO1xuXG5cdFx0YXR0cmlidXRlcyA9IHtcblx0XHRcdHZlcnRleDogZ2wuZ2V0QXR0cmliTG9jYXRpb24gKCBwcm9ncmFtLCBcInBvc2l0aW9uXCIgKSxcblx0XHRcdHV2OiAgICAgZ2wuZ2V0QXR0cmliTG9jYXRpb24gKCBwcm9ncmFtLCBcInV2XCIgKVxuXHRcdH07XG5cblx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdHJlbmRlclR5cGU6ICAgICBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sIFwicmVuZGVyVHlwZVwiICksXG5cdFx0XHRtYXA6ICAgICAgICAgICAgZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCBcIm1hcFwiICksXG5cdFx0XHRvY2NsdXNpb25NYXA6ICAgZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCBcIm9jY2x1c2lvbk1hcFwiICksXG5cdFx0XHRvcGFjaXR5OiAgICAgICAgZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCBcIm9wYWNpdHlcIiApLFxuXHRcdFx0Y29sb3I6ICAgICAgICAgIGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgXCJjb2xvclwiICksXG5cdFx0XHRzY2FsZTogICAgICAgICAgZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCBcInNjYWxlXCIgKSxcblx0XHRcdHJvdGF0aW9uOiAgICAgICBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sIFwicm90YXRpb25cIiApLFxuXHRcdFx0c2NyZWVuUG9zaXRpb246IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgXCJzY3JlZW5Qb3NpdGlvblwiIClcblx0XHR9O1xuXG5cdH1cblxuXHQvKlxuXHQgKiBSZW5kZXIgbGVucyBmbGFyZXNcblx0ICogTWV0aG9kOiByZW5kZXJzIDE2eDE2IDB4ZmYwMGZmLWNvbG9yZWQgcG9pbnRzIHNjYXR0ZXJlZCBvdmVyIHRoZSBsaWdodCBzb3VyY2UgYXJlYSxcblx0ICogICAgICAgICByZWFkcyB0aGVzZSBiYWNrIGFuZCBjYWxjdWxhdGVzIG9jY2x1c2lvbi5cblx0ICovXG5cblx0dGhpcy5yZW5kZXIgPSBmdW5jdGlvbiAoIHNjZW5lLCBjYW1lcmEsIHZpZXdwb3J0ICkge1xuXG5cdFx0aWYgKCBmbGFyZXMubGVuZ3RoID09PSAwICkgcmV0dXJuO1xuXG5cdFx0dmFyIHRlbXBQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgaW52QXNwZWN0ID0gdmlld3BvcnQudyAvIHZpZXdwb3J0LnosXG5cdFx0XHRoYWxmVmlld3BvcnRXaWR0aCA9IHZpZXdwb3J0LnogKiAwLjUsXG5cdFx0XHRoYWxmVmlld3BvcnRIZWlnaHQgPSB2aWV3cG9ydC53ICogMC41O1xuXG5cdFx0dmFyIHNpemUgPSAxNiAvIHZpZXdwb3J0LncsXG5cdFx0XHRzY2FsZSA9IG5ldyBWZWN0b3IyKCBzaXplICogaW52QXNwZWN0LCBzaXplICk7XG5cblx0XHR2YXIgc2NyZWVuUG9zaXRpb24gPSBuZXcgVmVjdG9yMyggMSwgMSwgMCApLFxuXHRcdFx0c2NyZWVuUG9zaXRpb25QaXhlbHMgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdFx0dmFyIHZhbGlkQXJlYSA9IG5ldyBCb3gyKCk7XG5cblx0XHR2YWxpZEFyZWEubWluLnNldCggdmlld3BvcnQueCwgdmlld3BvcnQueSApO1xuXHRcdHZhbGlkQXJlYS5tYXguc2V0KCB2aWV3cG9ydC54ICsgKCB2aWV3cG9ydC56IC0gMTYgKSwgdmlld3BvcnQueSArICggdmlld3BvcnQudyAtIDE2ICkgKTtcblxuXHRcdGlmICggcHJvZ3JhbSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpbml0KCk7XG5cblx0XHR9XG5cblx0XHRnbC51c2VQcm9ncmFtKCBwcm9ncmFtICk7XG5cblx0XHRzdGF0ZS5pbml0QXR0cmlidXRlcygpO1xuXHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggYXR0cmlidXRlcy52ZXJ0ZXggKTtcblx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZXMudXYgKTtcblx0XHRzdGF0ZS5kaXNhYmxlVW51c2VkQXR0cmlidXRlcygpO1xuXG5cdFx0Ly8gbG9vcCB0aHJvdWdoIGFsbCBsZW5zIGZsYXJlcyB0byB1cGRhdGUgdGhlaXIgb2NjbHVzaW9uIGFuZCBwb3NpdGlvbnNcblx0XHQvLyBzZXR1cCBnbCBhbmQgY29tbW9uIHVzZWQgYXR0cmlicy91bmlmb3Jtc1xuXG5cdFx0Z2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5vY2NsdXNpb25NYXAsIDAgKTtcblx0XHRnbC51bmlmb3JtMWkoIHVuaWZvcm1zLm1hcCwgMSApO1xuXG5cdFx0Z2wuYmluZEJ1ZmZlciggZ2wuQVJSQVlfQlVGRkVSLCB2ZXJ0ZXhCdWZmZXIgKTtcblx0XHRnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBhdHRyaWJ1dGVzLnZlcnRleCwgMiwgZ2wuRkxPQVQsIGZhbHNlLCAyICogOCwgMCApO1xuXHRcdGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoIGF0dHJpYnV0ZXMudXYsIDIsIGdsLkZMT0FULCBmYWxzZSwgMiAqIDgsIDggKTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBlbGVtZW50QnVmZmVyICk7XG5cblx0XHRzdGF0ZS5kaXNhYmxlKCBnbC5DVUxMX0ZBQ0UgKTtcblx0XHRzdGF0ZS5idWZmZXJzLmRlcHRoLnNldE1hc2soIGZhbHNlICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBmbGFyZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0c2l6ZSA9IDE2IC8gdmlld3BvcnQudztcblx0XHRcdHNjYWxlLnNldCggc2l6ZSAqIGludkFzcGVjdCwgc2l6ZSApO1xuXG5cdFx0XHQvLyBjYWxjIG9iamVjdCBzY3JlZW4gcG9zaXRpb25cblxuXHRcdFx0dmFyIGZsYXJlID0gZmxhcmVzWyBpIF07XG5cblx0XHRcdHRlbXBQb3NpdGlvbi5zZXQoIGZsYXJlLm1hdHJpeFdvcmxkLmVsZW1lbnRzWyAxMiBdLCBmbGFyZS5tYXRyaXhXb3JsZC5lbGVtZW50c1sgMTMgXSwgZmxhcmUubWF0cml4V29ybGQuZWxlbWVudHNbIDE0IF0gKTtcblxuXHRcdFx0dGVtcFBvc2l0aW9uLmFwcGx5TWF0cml4NCggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXHRcdFx0dGVtcFBvc2l0aW9uLmFwcGx5TWF0cml4NCggY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdFx0Ly8gc2V0dXAgYXJyYXlzIGZvciBnbCBwcm9ncmFtc1xuXG5cdFx0XHRzY3JlZW5Qb3NpdGlvbi5jb3B5KCB0ZW1wUG9zaXRpb24gKTtcblxuXHRcdFx0Ly8gaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgY29vcmRpbmF0ZSBvZiB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHBpeGVscyB0byBjb3B5XG5cblx0XHRcdHNjcmVlblBvc2l0aW9uUGl4ZWxzLnggPSB2aWV3cG9ydC54ICsgKCBzY3JlZW5Qb3NpdGlvbi54ICogaGFsZlZpZXdwb3J0V2lkdGggKSArIGhhbGZWaWV3cG9ydFdpZHRoIC0gODtcblx0XHRcdHNjcmVlblBvc2l0aW9uUGl4ZWxzLnkgPSB2aWV3cG9ydC55ICsgKCBzY3JlZW5Qb3NpdGlvbi55ICogaGFsZlZpZXdwb3J0SGVpZ2h0ICkgKyBoYWxmVmlld3BvcnRIZWlnaHQgLSA4O1xuXG5cdFx0XHQvLyBzY3JlZW4gY3VsbFxuXG5cdFx0XHRpZiAoIHZhbGlkQXJlYS5jb250YWluc1BvaW50KCBzY3JlZW5Qb3NpdGlvblBpeGVscyApID09PSB0cnVlICkge1xuXG5cdFx0XHRcdC8vIHNhdmUgY3VycmVudCBSR0IgdG8gdGVtcCB0ZXh0dXJlXG5cblx0XHRcdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggZ2wuVEVYVFVSRTAgKTtcblx0XHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIGdsLlRFWFRVUkVfMkQsIG51bGwgKTtcblx0XHRcdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggZ2wuVEVYVFVSRTEgKTtcblx0XHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIGdsLlRFWFRVUkVfMkQsIHRlbXBUZXh0dXJlICk7XG5cdFx0XHRcdGdsLmNvcHlUZXhJbWFnZTJEKCBnbC5URVhUVVJFXzJELCAwLCBnbC5SR0IsIHNjcmVlblBvc2l0aW9uUGl4ZWxzLngsIHNjcmVlblBvc2l0aW9uUGl4ZWxzLnksIDE2LCAxNiwgMCApO1xuXG5cblx0XHRcdFx0Ly8gcmVuZGVyIHBpbmsgcXVhZFxuXG5cdFx0XHRcdGdsLnVuaWZvcm0xaSggdW5pZm9ybXMucmVuZGVyVHlwZSwgMCApO1xuXHRcdFx0XHRnbC51bmlmb3JtMmYoIHVuaWZvcm1zLnNjYWxlLCBzY2FsZS54LCBzY2FsZS55ICk7XG5cdFx0XHRcdGdsLnVuaWZvcm0zZiggdW5pZm9ybXMuc2NyZWVuUG9zaXRpb24sIHNjcmVlblBvc2l0aW9uLngsIHNjcmVlblBvc2l0aW9uLnksIHNjcmVlblBvc2l0aW9uLnogKTtcblxuXHRcdFx0XHRzdGF0ZS5kaXNhYmxlKCBnbC5CTEVORCApO1xuXHRcdFx0XHRzdGF0ZS5lbmFibGUoIGdsLkRFUFRIX1RFU1QgKTtcblxuXHRcdFx0XHRnbC5kcmF3RWxlbWVudHMoIGdsLlRSSUFOR0xFUywgNiwgZ2wuVU5TSUdORURfU0hPUlQsIDAgKTtcblxuXG5cdFx0XHRcdC8vIGNvcHkgcmVzdWx0IHRvIG9jY2x1c2lvbk1hcFxuXG5cdFx0XHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIGdsLlRFWFRVUkUwICk7XG5cdFx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBnbC5URVhUVVJFXzJELCBvY2NsdXNpb25UZXh0dXJlICk7XG5cdFx0XHRcdGdsLmNvcHlUZXhJbWFnZTJEKCBnbC5URVhUVVJFXzJELCAwLCBnbC5SR0JBLCBzY3JlZW5Qb3NpdGlvblBpeGVscy54LCBzY3JlZW5Qb3NpdGlvblBpeGVscy55LCAxNiwgMTYsIDAgKTtcblxuXG5cdFx0XHRcdC8vIHJlc3RvcmUgZ3JhcGhpY3NcblxuXHRcdFx0XHRnbC51bmlmb3JtMWkoIHVuaWZvcm1zLnJlbmRlclR5cGUsIDEgKTtcblx0XHRcdFx0c3RhdGUuZGlzYWJsZSggZ2wuREVQVEhfVEVTVCApO1xuXG5cdFx0XHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIGdsLlRFWFRVUkUxICk7XG5cdFx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBnbC5URVhUVVJFXzJELCB0ZW1wVGV4dHVyZSApO1xuXHRcdFx0XHRnbC5kcmF3RWxlbWVudHMoIGdsLlRSSUFOR0xFUywgNiwgZ2wuVU5TSUdORURfU0hPUlQsIDAgKTtcblxuXG5cdFx0XHRcdC8vIHVwZGF0ZSBvYmplY3QgcG9zaXRpb25zXG5cblx0XHRcdFx0ZmxhcmUucG9zaXRpb25TY3JlZW4uY29weSggc2NyZWVuUG9zaXRpb24gKTtcblxuXHRcdFx0XHRpZiAoIGZsYXJlLmN1c3RvbVVwZGF0ZUNhbGxiYWNrICkge1xuXG5cdFx0XHRcdFx0ZmxhcmUuY3VzdG9tVXBkYXRlQ2FsbGJhY2soIGZsYXJlICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGZsYXJlLnVwZGF0ZUxlbnNGbGFyZXMoKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gcmVuZGVyIGZsYXJlc1xuXG5cdFx0XHRcdGdsLnVuaWZvcm0xaSggdW5pZm9ybXMucmVuZGVyVHlwZSwgMiApO1xuXHRcdFx0XHRzdGF0ZS5lbmFibGUoIGdsLkJMRU5EICk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGZsYXJlLmxlbnNGbGFyZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgc3ByaXRlID0gZmxhcmUubGVuc0ZsYXJlc1sgaiBdO1xuXG5cdFx0XHRcdFx0aWYgKCBzcHJpdGUub3BhY2l0eSA+IDAuMDAxICYmIHNwcml0ZS5zY2FsZSA+IDAuMDAxICkge1xuXG5cdFx0XHRcdFx0XHRzY3JlZW5Qb3NpdGlvbi54ID0gc3ByaXRlLng7XG5cdFx0XHRcdFx0XHRzY3JlZW5Qb3NpdGlvbi55ID0gc3ByaXRlLnk7XG5cdFx0XHRcdFx0XHRzY3JlZW5Qb3NpdGlvbi56ID0gc3ByaXRlLno7XG5cblx0XHRcdFx0XHRcdHNpemUgPSBzcHJpdGUuc2l6ZSAqIHNwcml0ZS5zY2FsZSAvIHZpZXdwb3J0Lnc7XG5cblx0XHRcdFx0XHRcdHNjYWxlLnggPSBzaXplICogaW52QXNwZWN0O1xuXHRcdFx0XHRcdFx0c2NhbGUueSA9IHNpemU7XG5cblx0XHRcdFx0XHRcdGdsLnVuaWZvcm0zZiggdW5pZm9ybXMuc2NyZWVuUG9zaXRpb24sIHNjcmVlblBvc2l0aW9uLngsIHNjcmVlblBvc2l0aW9uLnksIHNjcmVlblBvc2l0aW9uLnogKTtcblx0XHRcdFx0XHRcdGdsLnVuaWZvcm0yZiggdW5pZm9ybXMuc2NhbGUsIHNjYWxlLngsIHNjYWxlLnkgKTtcblx0XHRcdFx0XHRcdGdsLnVuaWZvcm0xZiggdW5pZm9ybXMucm90YXRpb24sIHNwcml0ZS5yb3RhdGlvbiApO1xuXG5cdFx0XHRcdFx0XHRnbC51bmlmb3JtMWYoIHVuaWZvcm1zLm9wYWNpdHksIHNwcml0ZS5vcGFjaXR5ICk7XG5cdFx0XHRcdFx0XHRnbC51bmlmb3JtM2YoIHVuaWZvcm1zLmNvbG9yLCBzcHJpdGUuY29sb3Iuciwgc3ByaXRlLmNvbG9yLmcsIHNwcml0ZS5jb2xvci5iICk7XG5cblx0XHRcdFx0XHRcdHN0YXRlLnNldEJsZW5kaW5nKCBzcHJpdGUuYmxlbmRpbmcsIHNwcml0ZS5ibGVuZEVxdWF0aW9uLCBzcHJpdGUuYmxlbmRTcmMsIHNwcml0ZS5ibGVuZERzdCApO1xuXHRcdFx0XHRcdFx0cmVuZGVyZXIuc2V0VGV4dHVyZTJEKCBzcHJpdGUudGV4dHVyZSwgMSApO1xuXG5cdFx0XHRcdFx0XHRnbC5kcmF3RWxlbWVudHMoIGdsLlRSSUFOR0xFUywgNiwgZ2wuVU5TSUdORURfU0hPUlQsIDAgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIHJlc3RvcmUgZ2xcblxuXHRcdHN0YXRlLmVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cdFx0c3RhdGUuZW5hYmxlKCBnbC5ERVBUSF9URVNUICk7XG5cdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRNYXNrKCB0cnVlICk7XG5cblx0XHRyZW5kZXJlci5yZXNldEdMU3RhdGUoKTtcblxuXHR9O1xuXG5cdGZ1bmN0aW9uIGNyZWF0ZVByb2dyYW0oIHNoYWRlciApIHtcblxuXHRcdHZhciBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpO1xuXG5cdFx0dmFyIGZyYWdtZW50U2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKCBnbC5GUkFHTUVOVF9TSEFERVIgKTtcblx0XHR2YXIgdmVydGV4U2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKCBnbC5WRVJURVhfU0hBREVSICk7XG5cblx0XHR2YXIgcHJlZml4ID0gXCJwcmVjaXNpb24gXCIgKyByZW5kZXJlci5nZXRQcmVjaXNpb24oKSArIFwiIGZsb2F0O1xcblwiO1xuXG5cdFx0Z2wuc2hhZGVyU291cmNlKCBmcmFnbWVudFNoYWRlciwgcHJlZml4ICsgc2hhZGVyLmZyYWdtZW50U2hhZGVyICk7XG5cdFx0Z2wuc2hhZGVyU291cmNlKCB2ZXJ0ZXhTaGFkZXIsIHByZWZpeCArIHNoYWRlci52ZXJ0ZXhTaGFkZXIgKTtcblxuXHRcdGdsLmNvbXBpbGVTaGFkZXIoIGZyYWdtZW50U2hhZGVyICk7XG5cdFx0Z2wuY29tcGlsZVNoYWRlciggdmVydGV4U2hhZGVyICk7XG5cblx0XHRnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIGZyYWdtZW50U2hhZGVyICk7XG5cdFx0Z2wuYXR0YWNoU2hhZGVyKCBwcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIgKTtcblxuXHRcdGdsLmxpbmtQcm9ncmFtKCBwcm9ncmFtICk7XG5cblx0XHRyZXR1cm4gcHJvZ3JhbTtcblxuXHR9XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTcHJpdGVQbHVnaW4oIHJlbmRlcmVyLCBzcHJpdGVzICkge1xuXG5cdHZhciBnbCA9IHJlbmRlcmVyLmNvbnRleHQ7XG5cdHZhciBzdGF0ZSA9IHJlbmRlcmVyLnN0YXRlO1xuXG5cdHZhciB2ZXJ0ZXhCdWZmZXIsIGVsZW1lbnRCdWZmZXI7XG5cdHZhciBwcm9ncmFtLCBhdHRyaWJ1dGVzLCB1bmlmb3JtcztcblxuXHR2YXIgdGV4dHVyZTtcblxuXHQvLyBkZWNvbXBvc2UgbWF0cml4V29ybGRcblxuXHR2YXIgc3ByaXRlUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgc3ByaXRlUm90YXRpb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXHR2YXIgc3ByaXRlU2NhbGUgPSBuZXcgVmVjdG9yMygpO1xuXG5cdGZ1bmN0aW9uIGluaXQoKSB7XG5cblx0XHR2YXIgdmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KCBbXG5cdFx0XHQtIDAuNSwgLSAwLjUsICAwLCAwLFxuXHRcdFx0ICAwLjUsIC0gMC41LCAgMSwgMCxcblx0XHRcdCAgMC41LCAgIDAuNSwgIDEsIDEsXG5cdFx0XHQtIDAuNSwgICAwLjUsICAwLCAxXG5cdFx0XSApO1xuXG5cdFx0dmFyIGZhY2VzID0gbmV3IFVpbnQxNkFycmF5KCBbXG5cdFx0XHQwLCAxLCAyLFxuXHRcdFx0MCwgMiwgM1xuXHRcdF0gKTtcblxuXHRcdHZlcnRleEJ1ZmZlciAgPSBnbC5jcmVhdGVCdWZmZXIoKTtcblx0XHRlbGVtZW50QnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBnbC5BUlJBWV9CVUZGRVIsIHZlcnRleEJ1ZmZlciApO1xuXHRcdGdsLmJ1ZmZlckRhdGEoIGdsLkFSUkFZX0JVRkZFUiwgdmVydGljZXMsIGdsLlNUQVRJQ19EUkFXICk7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZWxlbWVudEJ1ZmZlciApO1xuXHRcdGdsLmJ1ZmZlckRhdGEoIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBmYWNlcywgZ2wuU1RBVElDX0RSQVcgKTtcblxuXHRcdHByb2dyYW0gPSBjcmVhdGVQcm9ncmFtKCk7XG5cblx0XHRhdHRyaWJ1dGVzID0ge1xuXHRcdFx0cG9zaXRpb246XHRcdFx0Z2wuZ2V0QXR0cmliTG9jYXRpb24gKCBwcm9ncmFtLCAncG9zaXRpb24nICksXG5cdFx0XHR1djpcdFx0XHRcdFx0Z2wuZ2V0QXR0cmliTG9jYXRpb24gKCBwcm9ncmFtLCAndXYnIClcblx0XHR9O1xuXG5cdFx0dW5pZm9ybXMgPSB7XG5cdFx0XHR1dk9mZnNldDpcdFx0XHRnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICd1dk9mZnNldCcgKSxcblx0XHRcdHV2U2NhbGU6XHRcdFx0Z2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAndXZTY2FsZScgKSxcblxuXHRcdFx0cm90YXRpb246XHRcdFx0Z2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAncm90YXRpb24nICksXG5cdFx0XHRzY2FsZTpcdFx0XHRcdGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ3NjYWxlJyApLFxuXG5cdFx0XHRjb2xvcjpcdFx0XHRcdGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ2NvbG9yJyApLFxuXHRcdFx0bWFwOlx0XHRcdFx0Z2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnbWFwJyApLFxuXHRcdFx0b3BhY2l0eTpcdFx0XHRnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdvcGFjaXR5JyApLFxuXG5cdFx0XHRtb2RlbFZpZXdNYXRyaXg6IFx0Z2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnbW9kZWxWaWV3TWF0cml4JyApLFxuXHRcdFx0cHJvamVjdGlvbk1hdHJpeDpcdGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ3Byb2plY3Rpb25NYXRyaXgnICksXG5cblx0XHRcdGZvZ1R5cGU6XHRcdFx0Z2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nVHlwZScgKSxcblx0XHRcdGZvZ0RlbnNpdHk6XHRcdFx0Z2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nRGVuc2l0eScgKSxcblx0XHRcdGZvZ05lYXI6XHRcdFx0Z2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nTmVhcicgKSxcblx0XHRcdGZvZ0ZhcjpcdFx0XHRcdGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ2ZvZ0ZhcicgKSxcblx0XHRcdGZvZ0NvbG9yOlx0XHRcdGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ2ZvZ0NvbG9yJyApLFxuXG5cdFx0XHRhbHBoYVRlc3Q6XHRcdFx0Z2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnYWxwaGFUZXN0JyApXG5cdFx0fTtcblxuXHRcdHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKTtcblx0XHRjYW52YXMud2lkdGggPSA4O1xuXHRcdGNhbnZhcy5oZWlnaHQgPSA4O1xuXG5cdFx0dmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCggJzJkJyApO1xuXHRcdGNvbnRleHQuZmlsbFN0eWxlID0gJ3doaXRlJztcblx0XHRjb250ZXh0LmZpbGxSZWN0KCAwLCAwLCA4LCA4ICk7XG5cblx0XHR0ZXh0dXJlID0gbmV3IFRleHR1cmUoIGNhbnZhcyApO1xuXHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdH1cblxuXHR0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggc2NlbmUsIGNhbWVyYSApIHtcblxuXHRcdGlmICggc3ByaXRlcy5sZW5ndGggPT09IDAgKSByZXR1cm47XG5cblx0XHQvLyBzZXR1cCBnbFxuXG5cdFx0aWYgKCBwcm9ncmFtID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGluaXQoKTtcblxuXHRcdH1cblxuXHRcdGdsLnVzZVByb2dyYW0oIHByb2dyYW0gKTtcblxuXHRcdHN0YXRlLmluaXRBdHRyaWJ1dGVzKCk7XG5cdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBhdHRyaWJ1dGVzLnBvc2l0aW9uICk7XG5cdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBhdHRyaWJ1dGVzLnV2ICk7XG5cdFx0c3RhdGUuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKTtcblxuXHRcdHN0YXRlLmRpc2FibGUoIGdsLkNVTExfRkFDRSApO1xuXHRcdHN0YXRlLmVuYWJsZSggZ2wuQkxFTkQgKTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLkFSUkFZX0JVRkZFUiwgdmVydGV4QnVmZmVyICk7XG5cdFx0Z2wudmVydGV4QXR0cmliUG9pbnRlciggYXR0cmlidXRlcy5wb3NpdGlvbiwgMiwgZ2wuRkxPQVQsIGZhbHNlLCAyICogOCwgMCApO1xuXHRcdGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoIGF0dHJpYnV0ZXMudXYsIDIsIGdsLkZMT0FULCBmYWxzZSwgMiAqIDgsIDggKTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBlbGVtZW50QnVmZmVyICk7XG5cblx0XHRnbC51bmlmb3JtTWF0cml4NGZ2KCB1bmlmb3Jtcy5wcm9qZWN0aW9uTWF0cml4LCBmYWxzZSwgY2FtZXJhLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMgKTtcblxuXHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIGdsLlRFWFRVUkUwICk7XG5cdFx0Z2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5tYXAsIDAgKTtcblxuXHRcdHZhciBvbGRGb2dUeXBlID0gMDtcblx0XHR2YXIgc2NlbmVGb2dUeXBlID0gMDtcblx0XHR2YXIgZm9nID0gc2NlbmUuZm9nO1xuXG5cdFx0aWYgKCBmb2cgKSB7XG5cblx0XHRcdGdsLnVuaWZvcm0zZiggdW5pZm9ybXMuZm9nQ29sb3IsIGZvZy5jb2xvci5yLCBmb2cuY29sb3IuZywgZm9nLmNvbG9yLmIgKTtcblxuXHRcdFx0aWYgKCBmb2cuaXNGb2cgKSB7XG5cblx0XHRcdFx0Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5mb2dOZWFyLCBmb2cubmVhciApO1xuXHRcdFx0XHRnbC51bmlmb3JtMWYoIHVuaWZvcm1zLmZvZ0ZhciwgZm9nLmZhciApO1xuXG5cdFx0XHRcdGdsLnVuaWZvcm0xaSggdW5pZm9ybXMuZm9nVHlwZSwgMSApO1xuXHRcdFx0XHRvbGRGb2dUeXBlID0gMTtcblx0XHRcdFx0c2NlbmVGb2dUeXBlID0gMTtcblxuXHRcdFx0fSBlbHNlIGlmICggZm9nLmlzRm9nRXhwMiApIHtcblxuXHRcdFx0XHRnbC51bmlmb3JtMWYoIHVuaWZvcm1zLmZvZ0RlbnNpdHksIGZvZy5kZW5zaXR5ICk7XG5cblx0XHRcdFx0Z2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5mb2dUeXBlLCAyICk7XG5cdFx0XHRcdG9sZEZvZ1R5cGUgPSAyO1xuXHRcdFx0XHRzY2VuZUZvZ1R5cGUgPSAyO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRnbC51bmlmb3JtMWkoIHVuaWZvcm1zLmZvZ1R5cGUsIDAgKTtcblx0XHRcdG9sZEZvZ1R5cGUgPSAwO1xuXHRcdFx0c2NlbmVGb2dUeXBlID0gMDtcblxuXHRcdH1cblxuXG5cdFx0Ly8gdXBkYXRlIHBvc2l0aW9ucyBhbmQgc29ydFxuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc3ByaXRlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgc3ByaXRlID0gc3ByaXRlc1sgaSBdO1xuXG5cdFx0XHRzcHJpdGUubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsIHNwcml0ZS5tYXRyaXhXb3JsZCApO1xuXHRcdFx0c3ByaXRlLnogPSAtIHNwcml0ZS5tb2RlbFZpZXdNYXRyaXguZWxlbWVudHNbIDE0IF07XG5cblx0XHR9XG5cblx0XHRzcHJpdGVzLnNvcnQoIHBhaW50ZXJTb3J0U3RhYmxlICk7XG5cblx0XHQvLyByZW5kZXIgYWxsIHNwcml0ZXNcblxuXHRcdHZhciBzY2FsZSA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc3ByaXRlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgc3ByaXRlID0gc3ByaXRlc1sgaSBdO1xuXHRcdFx0dmFyIG1hdGVyaWFsID0gc3ByaXRlLm1hdGVyaWFsO1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLnZpc2libGUgPT09IGZhbHNlICkgY29udGludWU7XG5cblx0XHRcdGdsLnVuaWZvcm0xZiggdW5pZm9ybXMuYWxwaGFUZXN0LCBtYXRlcmlhbC5hbHBoYVRlc3QgKTtcblx0XHRcdGdsLnVuaWZvcm1NYXRyaXg0ZnYoIHVuaWZvcm1zLm1vZGVsVmlld01hdHJpeCwgZmFsc2UsIHNwcml0ZS5tb2RlbFZpZXdNYXRyaXguZWxlbWVudHMgKTtcblxuXHRcdFx0c3ByaXRlLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggc3ByaXRlUG9zaXRpb24sIHNwcml0ZVJvdGF0aW9uLCBzcHJpdGVTY2FsZSApO1xuXG5cdFx0XHRzY2FsZVsgMCBdID0gc3ByaXRlU2NhbGUueDtcblx0XHRcdHNjYWxlWyAxIF0gPSBzcHJpdGVTY2FsZS55O1xuXG5cdFx0XHR2YXIgZm9nVHlwZSA9IDA7XG5cblx0XHRcdGlmICggc2NlbmUuZm9nICYmIG1hdGVyaWFsLmZvZyApIHtcblxuXHRcdFx0XHRmb2dUeXBlID0gc2NlbmVGb2dUeXBlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggb2xkRm9nVHlwZSAhPT0gZm9nVHlwZSApIHtcblxuXHRcdFx0XHRnbC51bmlmb3JtMWkoIHVuaWZvcm1zLmZvZ1R5cGUsIGZvZ1R5cGUgKTtcblx0XHRcdFx0b2xkRm9nVHlwZSA9IGZvZ1R5cGU7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5tYXAgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0Z2wudW5pZm9ybTJmKCB1bmlmb3Jtcy51dk9mZnNldCwgbWF0ZXJpYWwubWFwLm9mZnNldC54LCBtYXRlcmlhbC5tYXAub2Zmc2V0LnkgKTtcblx0XHRcdFx0Z2wudW5pZm9ybTJmKCB1bmlmb3Jtcy51dlNjYWxlLCBtYXRlcmlhbC5tYXAucmVwZWF0LngsIG1hdGVyaWFsLm1hcC5yZXBlYXQueSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGdsLnVuaWZvcm0yZiggdW5pZm9ybXMudXZPZmZzZXQsIDAsIDAgKTtcblx0XHRcdFx0Z2wudW5pZm9ybTJmKCB1bmlmb3Jtcy51dlNjYWxlLCAxLCAxICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5vcGFjaXR5LCBtYXRlcmlhbC5vcGFjaXR5ICk7XG5cdFx0XHRnbC51bmlmb3JtM2YoIHVuaWZvcm1zLmNvbG9yLCBtYXRlcmlhbC5jb2xvci5yLCBtYXRlcmlhbC5jb2xvci5nLCBtYXRlcmlhbC5jb2xvci5iICk7XG5cblx0XHRcdGdsLnVuaWZvcm0xZiggdW5pZm9ybXMucm90YXRpb24sIG1hdGVyaWFsLnJvdGF0aW9uICk7XG5cdFx0XHRnbC51bmlmb3JtMmZ2KCB1bmlmb3Jtcy5zY2FsZSwgc2NhbGUgKTtcblxuXHRcdFx0c3RhdGUuc2V0QmxlbmRpbmcoIG1hdGVyaWFsLmJsZW5kaW5nLCBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uLCBtYXRlcmlhbC5ibGVuZFNyYywgbWF0ZXJpYWwuYmxlbmREc3QgKTtcblx0XHRcdHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCggbWF0ZXJpYWwuZGVwdGhUZXN0ICk7XG5cdFx0XHRzdGF0ZS5idWZmZXJzLmRlcHRoLnNldE1hc2soIG1hdGVyaWFsLmRlcHRoV3JpdGUgKTtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5tYXAgKSB7XG5cblx0XHRcdFx0cmVuZGVyZXIuc2V0VGV4dHVyZTJEKCBtYXRlcmlhbC5tYXAsIDAgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZW5kZXJlci5zZXRUZXh0dXJlMkQoIHRleHR1cmUsIDAgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnbC5kcmF3RWxlbWVudHMoIGdsLlRSSUFOR0xFUywgNiwgZ2wuVU5TSUdORURfU0hPUlQsIDAgKTtcblxuXHRcdH1cblxuXHRcdC8vIHJlc3RvcmUgZ2xcblxuXHRcdHN0YXRlLmVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cblx0XHRyZW5kZXJlci5yZXNldEdMU3RhdGUoKTtcblxuXHR9O1xuXG5cdGZ1bmN0aW9uIGNyZWF0ZVByb2dyYW0oKSB7XG5cblx0XHR2YXIgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTtcblxuXHRcdHZhciB2ZXJ0ZXhTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoIGdsLlZFUlRFWF9TSEFERVIgKTtcblx0XHR2YXIgZnJhZ21lbnRTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoIGdsLkZSQUdNRU5UX1NIQURFUiApO1xuXG5cdFx0Z2wuc2hhZGVyU291cmNlKCB2ZXJ0ZXhTaGFkZXIsIFtcblxuXHRcdFx0J3ByZWNpc2lvbiAnICsgcmVuZGVyZXIuZ2V0UHJlY2lzaW9uKCkgKyAnIGZsb2F0OycsXG5cblx0XHRcdCd1bmlmb3JtIG1hdDQgbW9kZWxWaWV3TWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIGZsb2F0IHJvdGF0aW9uOycsXG5cdFx0XHQndW5pZm9ybSB2ZWMyIHNjYWxlOycsXG5cdFx0XHQndW5pZm9ybSB2ZWMyIHV2T2Zmc2V0OycsXG5cdFx0XHQndW5pZm9ybSB2ZWMyIHV2U2NhbGU7JyxcblxuXHRcdFx0J2F0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uOycsXG5cdFx0XHQnYXR0cmlidXRlIHZlYzIgdXY7JyxcblxuXHRcdFx0J3ZhcnlpbmcgdmVjMiB2VVY7JyxcblxuXHRcdFx0J3ZvaWQgbWFpbigpIHsnLFxuXG5cdFx0XHRcdCd2VVYgPSB1dk9mZnNldCArIHV2ICogdXZTY2FsZTsnLFxuXG5cdFx0XHRcdCd2ZWMyIGFsaWduZWRQb3NpdGlvbiA9IHBvc2l0aW9uICogc2NhbGU7JyxcblxuXHRcdFx0XHQndmVjMiByb3RhdGVkUG9zaXRpb247Jyxcblx0XHRcdFx0J3JvdGF0ZWRQb3NpdGlvbi54ID0gY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnggLSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTsnLFxuXHRcdFx0XHQncm90YXRlZFBvc2l0aW9uLnkgPSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCArIGNvcyggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55OycsXG5cblx0XHRcdFx0J3ZlYzQgZmluYWxQb3NpdGlvbjsnLFxuXG5cdFx0XHRcdCdmaW5hbFBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7Jyxcblx0XHRcdFx0J2ZpbmFsUG9zaXRpb24ueHkgKz0gcm90YXRlZFBvc2l0aW9uOycsXG5cdFx0XHRcdCdmaW5hbFBvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIGZpbmFsUG9zaXRpb247JyxcblxuXHRcdFx0XHQnZ2xfUG9zaXRpb24gPSBmaW5hbFBvc2l0aW9uOycsXG5cblx0XHRcdCd9J1xuXG5cdFx0XS5qb2luKCAnXFxuJyApICk7XG5cblx0XHRnbC5zaGFkZXJTb3VyY2UoIGZyYWdtZW50U2hhZGVyLCBbXG5cblx0XHRcdCdwcmVjaXNpb24gJyArIHJlbmRlcmVyLmdldFByZWNpc2lvbigpICsgJyBmbG9hdDsnLFxuXG5cdFx0XHQndW5pZm9ybSB2ZWMzIGNvbG9yOycsXG5cdFx0XHQndW5pZm9ybSBzYW1wbGVyMkQgbWFwOycsXG5cdFx0XHQndW5pZm9ybSBmbG9hdCBvcGFjaXR5OycsXG5cblx0XHRcdCd1bmlmb3JtIGludCBmb2dUeXBlOycsXG5cdFx0XHQndW5pZm9ybSB2ZWMzIGZvZ0NvbG9yOycsXG5cdFx0XHQndW5pZm9ybSBmbG9hdCBmb2dEZW5zaXR5OycsXG5cdFx0XHQndW5pZm9ybSBmbG9hdCBmb2dOZWFyOycsXG5cdFx0XHQndW5pZm9ybSBmbG9hdCBmb2dGYXI7Jyxcblx0XHRcdCd1bmlmb3JtIGZsb2F0IGFscGhhVGVzdDsnLFxuXG5cdFx0XHQndmFyeWluZyB2ZWMyIHZVVjsnLFxuXG5cdFx0XHQndm9pZCBtYWluKCkgeycsXG5cblx0XHRcdFx0J3ZlYzQgdGV4dHVyZSA9IHRleHR1cmUyRCggbWFwLCB2VVYgKTsnLFxuXG5cdFx0XHRcdCdpZiAoIHRleHR1cmUuYSA8IGFscGhhVGVzdCApIGRpc2NhcmQ7JyxcblxuXHRcdFx0XHQnZ2xfRnJhZ0NvbG9yID0gdmVjNCggY29sb3IgKiB0ZXh0dXJlLnh5eiwgdGV4dHVyZS5hICogb3BhY2l0eSApOycsXG5cblx0XHRcdFx0J2lmICggZm9nVHlwZSA+IDAgKSB7JyxcblxuXHRcdFx0XHRcdCdmbG9hdCBkZXB0aCA9IGdsX0ZyYWdDb29yZC56IC8gZ2xfRnJhZ0Nvb3JkLnc7Jyxcblx0XHRcdFx0XHQnZmxvYXQgZm9nRmFjdG9yID0gMC4wOycsXG5cblx0XHRcdFx0XHQnaWYgKCBmb2dUeXBlID09IDEgKSB7JyxcblxuXHRcdFx0XHRcdFx0J2ZvZ0ZhY3RvciA9IHNtb290aHN0ZXAoIGZvZ05lYXIsIGZvZ0ZhciwgZGVwdGggKTsnLFxuXG5cdFx0XHRcdFx0J30gZWxzZSB7JyxcblxuXHRcdFx0XHRcdFx0J2NvbnN0IGZsb2F0IExPRzIgPSAxLjQ0MjY5NTsnLFxuXHRcdFx0XHRcdFx0J2ZvZ0ZhY3RvciA9IGV4cDIoIC0gZm9nRGVuc2l0eSAqIGZvZ0RlbnNpdHkgKiBkZXB0aCAqIGRlcHRoICogTE9HMiApOycsXG5cdFx0XHRcdFx0XHQnZm9nRmFjdG9yID0gMS4wIC0gY2xhbXAoIGZvZ0ZhY3RvciwgMC4wLCAxLjAgKTsnLFxuXG5cdFx0XHRcdFx0J30nLFxuXG5cdFx0XHRcdFx0J2dsX0ZyYWdDb2xvciA9IG1peCggZ2xfRnJhZ0NvbG9yLCB2ZWM0KCBmb2dDb2xvciwgZ2xfRnJhZ0NvbG9yLncgKSwgZm9nRmFjdG9yICk7JyxcblxuXHRcdFx0XHQnfScsXG5cblx0XHRcdCd9J1xuXG5cdFx0XS5qb2luKCAnXFxuJyApICk7XG5cblx0XHRnbC5jb21waWxlU2hhZGVyKCB2ZXJ0ZXhTaGFkZXIgKTtcblx0XHRnbC5jb21waWxlU2hhZGVyKCBmcmFnbWVudFNoYWRlciApO1xuXG5cdFx0Z2wuYXR0YWNoU2hhZGVyKCBwcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIgKTtcblx0XHRnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIGZyYWdtZW50U2hhZGVyICk7XG5cblx0XHRnbC5saW5rUHJvZ3JhbSggcHJvZ3JhbSApO1xuXG5cdFx0cmV0dXJuIHByb2dyYW07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHBhaW50ZXJTb3J0U3RhYmxlKCBhLCBiICkge1xuXG5cdFx0aWYgKCBhLnJlbmRlck9yZGVyICE9PSBiLnJlbmRlck9yZGVyICkge1xuXG5cdFx0XHRyZXR1cm4gYS5yZW5kZXJPcmRlciAtIGIucmVuZGVyT3JkZXI7XG5cblx0XHR9IGVsc2UgaWYgKCBhLnogIT09IGIueiApIHtcblxuXHRcdFx0cmV0dXJuIGIueiAtIGEuejtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJldHVybiBiLmlkIC0gYS5pZDtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG52YXIgbWF0ZXJpYWxJZCA9IDA7XG5cbmZ1bmN0aW9uIE1hdGVyaWFsKCkge1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogbWF0ZXJpYWxJZCArKyB9ICk7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cdHRoaXMudHlwZSA9ICdNYXRlcmlhbCc7XG5cblx0dGhpcy5mb2cgPSB0cnVlO1xuXHR0aGlzLmxpZ2h0cyA9IHRydWU7XG5cblx0dGhpcy5ibGVuZGluZyA9IE5vcm1hbEJsZW5kaW5nO1xuXHR0aGlzLnNpZGUgPSBGcm9udFNpZGU7XG5cdHRoaXMuc2hhZGluZyA9IFNtb290aFNoYWRpbmc7IC8vIFRIUkVFLkZsYXRTaGFkaW5nLCBUSFJFRS5TbW9vdGhTaGFkaW5nXG5cdHRoaXMudmVydGV4Q29sb3JzID0gTm9Db2xvcnM7IC8vIFRIUkVFLk5vQ29sb3JzLCBUSFJFRS5WZXJ0ZXhDb2xvcnMsIFRIUkVFLkZhY2VDb2xvcnNcblxuXHR0aGlzLm9wYWNpdHkgPSAxO1xuXHR0aGlzLnRyYW5zcGFyZW50ID0gZmFsc2U7XG5cblx0dGhpcy5ibGVuZFNyYyA9IFNyY0FscGhhRmFjdG9yO1xuXHR0aGlzLmJsZW5kRHN0ID0gT25lTWludXNTcmNBbHBoYUZhY3Rvcjtcblx0dGhpcy5ibGVuZEVxdWF0aW9uID0gQWRkRXF1YXRpb247XG5cdHRoaXMuYmxlbmRTcmNBbHBoYSA9IG51bGw7XG5cdHRoaXMuYmxlbmREc3RBbHBoYSA9IG51bGw7XG5cdHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhID0gbnVsbDtcblxuXHR0aGlzLmRlcHRoRnVuYyA9IExlc3NFcXVhbERlcHRoO1xuXHR0aGlzLmRlcHRoVGVzdCA9IHRydWU7XG5cdHRoaXMuZGVwdGhXcml0ZSA9IHRydWU7XG5cblx0dGhpcy5jbGlwcGluZ1BsYW5lcyA9IG51bGw7XG5cdHRoaXMuY2xpcEludGVyc2VjdGlvbiA9IGZhbHNlO1xuXHR0aGlzLmNsaXBTaGFkb3dzID0gZmFsc2U7XG5cblx0dGhpcy5jb2xvcldyaXRlID0gdHJ1ZTtcblxuXHR0aGlzLnByZWNpc2lvbiA9IG51bGw7IC8vIG92ZXJyaWRlIHRoZSByZW5kZXJlcidzIGRlZmF1bHQgcHJlY2lzaW9uIGZvciB0aGlzIG1hdGVyaWFsXG5cblx0dGhpcy5wb2x5Z29uT2Zmc2V0ID0gZmFsc2U7XG5cdHRoaXMucG9seWdvbk9mZnNldEZhY3RvciA9IDA7XG5cdHRoaXMucG9seWdvbk9mZnNldFVuaXRzID0gMDtcblxuXHR0aGlzLmRpdGhlcmluZyA9IGZhbHNlO1xuXG5cdHRoaXMuYWxwaGFUZXN0ID0gMDtcblx0dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEgPSBmYWxzZTtcblxuXHR0aGlzLm92ZXJkcmF3ID0gMDsgLy8gT3ZlcmRyYXduIHBpeGVscyAodHlwaWNhbGx5IGJldHdlZW4gMCBhbmQgMSkgZm9yIGZpeGluZyBhbnRpYWxpYXNpbmcgZ2FwcyBpbiBDYW52YXNSZW5kZXJlclxuXG5cdHRoaXMudmlzaWJsZSA9IHRydWU7XG5cblx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggTWF0ZXJpYWwucHJvdG90eXBlLCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlLCB7XG5cblx0aXNNYXRlcmlhbDogdHJ1ZSxcblxuXHRzZXRWYWx1ZXM6IGZ1bmN0aW9uICggdmFsdWVzICkge1xuXG5cdFx0aWYgKCB2YWx1ZXMgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdGZvciAoIHZhciBrZXkgaW4gdmFsdWVzICkge1xuXG5cdFx0XHR2YXIgbmV3VmFsdWUgPSB2YWx1ZXNbIGtleSBdO1xuXG5cdFx0XHRpZiAoIG5ld1ZhbHVlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLk1hdGVyaWFsOiAnXCIgKyBrZXkgKyBcIicgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZC5cIiApO1xuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgY3VycmVudFZhbHVlID0gdGhpc1sga2V5IF07XG5cblx0XHRcdGlmICggY3VycmVudFZhbHVlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLlwiICsgdGhpcy50eXBlICsgXCI6ICdcIiArIGtleSArIFwiJyBpcyBub3QgYSBwcm9wZXJ0eSBvZiB0aGlzIG1hdGVyaWFsLlwiICk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggY3VycmVudFZhbHVlICYmIGN1cnJlbnRWYWx1ZS5pc0NvbG9yICkge1xuXG5cdFx0XHRcdGN1cnJlbnRWYWx1ZS5zZXQoIG5ld1ZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoICggY3VycmVudFZhbHVlICYmIGN1cnJlbnRWYWx1ZS5pc1ZlY3RvcjMgKSAmJiAoIG5ld1ZhbHVlICYmIG5ld1ZhbHVlLmlzVmVjdG9yMyApICkge1xuXG5cdFx0XHRcdGN1cnJlbnRWYWx1ZS5jb3B5KCBuZXdWYWx1ZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBrZXkgPT09ICdvdmVyZHJhdycgKSB7XG5cblx0XHRcdFx0Ly8gZW5zdXJlIG92ZXJkcmF3IGlzIGJhY2t3YXJkcy1jb21wYXRpYmxlIHdpdGggbGVnYWN5IGJvb2xlYW4gdHlwZVxuXHRcdFx0XHR0aGlzWyBrZXkgXSA9IE51bWJlciggbmV3VmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzWyBrZXkgXSA9IG5ld1ZhbHVlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRcdHZhciBpc1Jvb3QgPSBtZXRhID09PSB1bmRlZmluZWQ7XG5cblx0XHRpZiAoIGlzUm9vdCApIHtcblxuXHRcdFx0bWV0YSA9IHtcblx0XHRcdFx0dGV4dHVyZXM6IHt9LFxuXHRcdFx0XHRpbWFnZXM6IHt9XG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0dmFyIGRhdGEgPSB7XG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdNYXRlcmlhbCcsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ01hdGVyaWFsLnRvSlNPTidcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gc3RhbmRhcmQgTWF0ZXJpYWwgc2VyaWFsaXphdGlvblxuXHRcdGRhdGEudXVpZCA9IHRoaXMudXVpZDtcblx0XHRkYXRhLnR5cGUgPSB0aGlzLnR5cGU7XG5cblx0XHRpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBkYXRhLm5hbWUgPSB0aGlzLm5hbWU7XG5cblx0XHRpZiAoIHRoaXMuY29sb3IgJiYgdGhpcy5jb2xvci5pc0NvbG9yICkgZGF0YS5jb2xvciA9IHRoaXMuY29sb3IuZ2V0SGV4KCk7XG5cblx0XHRpZiAoIHRoaXMucm91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLnJvdWdobmVzcyA9IHRoaXMucm91Z2huZXNzO1xuXHRcdGlmICggdGhpcy5tZXRhbG5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEubWV0YWxuZXNzID0gdGhpcy5tZXRhbG5lc3M7XG5cblx0XHRpZiAoIHRoaXMuZW1pc3NpdmUgJiYgdGhpcy5lbWlzc2l2ZS5pc0NvbG9yICkgZGF0YS5lbWlzc2l2ZSA9IHRoaXMuZW1pc3NpdmUuZ2V0SGV4KCk7XG5cdFx0aWYgKCB0aGlzLnNwZWN1bGFyICYmIHRoaXMuc3BlY3VsYXIuaXNDb2xvciApIGRhdGEuc3BlY3VsYXIgPSB0aGlzLnNwZWN1bGFyLmdldEhleCgpO1xuXHRcdGlmICggdGhpcy5zaGluaW5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEuc2hpbmluZXNzID0gdGhpcy5zaGluaW5lc3M7XG5cdFx0aWYgKCB0aGlzLmNsZWFyQ29hdCAhPT0gdW5kZWZpbmVkICkgZGF0YS5jbGVhckNvYXQgPSB0aGlzLmNsZWFyQ29hdDtcblx0XHRpZiAoIHRoaXMuY2xlYXJDb2F0Um91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLmNsZWFyQ29hdFJvdWdobmVzcyA9IHRoaXMuY2xlYXJDb2F0Um91Z2huZXNzO1xuXG5cdFx0aWYgKCB0aGlzLm1hcCAmJiB0aGlzLm1hcC5pc1RleHR1cmUgKSBkYXRhLm1hcCA9IHRoaXMubWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0aWYgKCB0aGlzLmFscGhhTWFwICYmIHRoaXMuYWxwaGFNYXAuaXNUZXh0dXJlICkgZGF0YS5hbHBoYU1hcCA9IHRoaXMuYWxwaGFNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRpZiAoIHRoaXMubGlnaHRNYXAgJiYgdGhpcy5saWdodE1hcC5pc1RleHR1cmUgKSBkYXRhLmxpZ2h0TWFwID0gdGhpcy5saWdodE1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdGlmICggdGhpcy5idW1wTWFwICYmIHRoaXMuYnVtcE1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEuYnVtcE1hcCA9IHRoaXMuYnVtcE1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdFx0ZGF0YS5idW1wU2NhbGUgPSB0aGlzLmJ1bXBTY2FsZTtcblxuXHRcdH1cblx0XHRpZiAoIHRoaXMubm9ybWFsTWFwICYmIHRoaXMubm9ybWFsTWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5ub3JtYWxNYXAgPSB0aGlzLm5vcm1hbE1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdFx0ZGF0YS5ub3JtYWxTY2FsZSA9IHRoaXMubm9ybWFsU2NhbGUudG9BcnJheSgpO1xuXG5cdFx0fVxuXHRcdGlmICggdGhpcy5kaXNwbGFjZW1lbnRNYXAgJiYgdGhpcy5kaXNwbGFjZW1lbnRNYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRkYXRhLmRpc3BsYWNlbWVudE1hcCA9IHRoaXMuZGlzcGxhY2VtZW50TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLmRpc3BsYWNlbWVudFNjYWxlID0gdGhpcy5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdGRhdGEuZGlzcGxhY2VtZW50QmlhcyA9IHRoaXMuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblx0XHRpZiAoIHRoaXMucm91Z2huZXNzTWFwICYmIHRoaXMucm91Z2huZXNzTWFwLmlzVGV4dHVyZSApIGRhdGEucm91Z2huZXNzTWFwID0gdGhpcy5yb3VnaG5lc3NNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRpZiAoIHRoaXMubWV0YWxuZXNzTWFwICYmIHRoaXMubWV0YWxuZXNzTWFwLmlzVGV4dHVyZSApIGRhdGEubWV0YWxuZXNzTWFwID0gdGhpcy5tZXRhbG5lc3NNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblxuXHRcdGlmICggdGhpcy5lbWlzc2l2ZU1hcCAmJiB0aGlzLmVtaXNzaXZlTWFwLmlzVGV4dHVyZSApIGRhdGEuZW1pc3NpdmVNYXAgPSB0aGlzLmVtaXNzaXZlTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0aWYgKCB0aGlzLnNwZWN1bGFyTWFwICYmIHRoaXMuc3BlY3VsYXJNYXAuaXNUZXh0dXJlICkgZGF0YS5zcGVjdWxhck1hcCA9IHRoaXMuc3BlY3VsYXJNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblxuXHRcdGlmICggdGhpcy5lbnZNYXAgJiYgdGhpcy5lbnZNYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRkYXRhLmVudk1hcCA9IHRoaXMuZW52TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLnJlZmxlY3Rpdml0eSA9IHRoaXMucmVmbGVjdGl2aXR5OyAvLyBTY2FsZSBiZWhpbmQgZW52TWFwXG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuZ3JhZGllbnRNYXAgJiYgdGhpcy5ncmFkaWVudE1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEuZ3JhZGllbnRNYXAgPSB0aGlzLmdyYWRpZW50TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuc2l6ZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5zaXplID0gdGhpcy5zaXplO1xuXHRcdGlmICggdGhpcy5zaXplQXR0ZW51YXRpb24gIT09IHVuZGVmaW5lZCApIGRhdGEuc2l6ZUF0dGVudWF0aW9uID0gdGhpcy5zaXplQXR0ZW51YXRpb247XG5cblx0XHRpZiAoIHRoaXMuYmxlbmRpbmcgIT09IE5vcm1hbEJsZW5kaW5nICkgZGF0YS5ibGVuZGluZyA9IHRoaXMuYmxlbmRpbmc7XG5cdFx0aWYgKCB0aGlzLnNoYWRpbmcgIT09IFNtb290aFNoYWRpbmcgKSBkYXRhLnNoYWRpbmcgPSB0aGlzLnNoYWRpbmc7XG5cdFx0aWYgKCB0aGlzLnNpZGUgIT09IEZyb250U2lkZSApIGRhdGEuc2lkZSA9IHRoaXMuc2lkZTtcblx0XHRpZiAoIHRoaXMudmVydGV4Q29sb3JzICE9PSBOb0NvbG9ycyApIGRhdGEudmVydGV4Q29sb3JzID0gdGhpcy52ZXJ0ZXhDb2xvcnM7XG5cblx0XHRpZiAoIHRoaXMub3BhY2l0eSA8IDEgKSBkYXRhLm9wYWNpdHkgPSB0aGlzLm9wYWNpdHk7XG5cdFx0aWYgKCB0aGlzLnRyYW5zcGFyZW50ID09PSB0cnVlICkgZGF0YS50cmFuc3BhcmVudCA9IHRoaXMudHJhbnNwYXJlbnQ7XG5cblx0XHRkYXRhLmRlcHRoRnVuYyA9IHRoaXMuZGVwdGhGdW5jO1xuXHRcdGRhdGEuZGVwdGhUZXN0ID0gdGhpcy5kZXB0aFRlc3Q7XG5cdFx0ZGF0YS5kZXB0aFdyaXRlID0gdGhpcy5kZXB0aFdyaXRlO1xuXG5cdFx0aWYgKCB0aGlzLmFscGhhVGVzdCA+IDAgKSBkYXRhLmFscGhhVGVzdCA9IHRoaXMuYWxwaGFUZXN0O1xuXHRcdGlmICggdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEgPT09IHRydWUgKSBkYXRhLnByZW11bHRpcGxpZWRBbHBoYSA9IHRoaXMucHJlbXVsdGlwbGllZEFscGhhO1xuXHRcdGlmICggdGhpcy53aXJlZnJhbWUgPT09IHRydWUgKSBkYXRhLndpcmVmcmFtZSA9IHRoaXMud2lyZWZyYW1lO1xuXHRcdGlmICggdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPiAxICkgZGF0YS53aXJlZnJhbWVMaW5ld2lkdGggPSB0aGlzLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lTGluZWNhcCAhPT0gJ3JvdW5kJyApIGRhdGEud2lyZWZyYW1lTGluZWNhcCA9IHRoaXMud2lyZWZyYW1lTGluZWNhcDtcblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lTGluZWpvaW4gIT09ICdyb3VuZCcgKSBkYXRhLndpcmVmcmFtZUxpbmVqb2luID0gdGhpcy53aXJlZnJhbWVMaW5lam9pbjtcblxuXHRcdGRhdGEuc2tpbm5pbmcgPSB0aGlzLnNraW5uaW5nO1xuXHRcdGRhdGEubW9ycGhUYXJnZXRzID0gdGhpcy5tb3JwaFRhcmdldHM7XG5cblx0XHRkYXRhLmRpdGhlcmluZyA9IHRoaXMuZGl0aGVyaW5nO1xuXG5cdFx0Ly8gVE9ETzogQ29waWVkIGZyb20gT2JqZWN0M0QudG9KU09OXG5cblx0XHRmdW5jdGlvbiBleHRyYWN0RnJvbUNhY2hlKCBjYWNoZSApIHtcblxuXHRcdFx0dmFyIHZhbHVlcyA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIga2V5IGluIGNhY2hlICkge1xuXG5cdFx0XHRcdHZhciBkYXRhID0gY2FjaGVbIGtleSBdO1xuXHRcdFx0XHRkZWxldGUgZGF0YS5tZXRhZGF0YTtcblx0XHRcdFx0dmFsdWVzLnB1c2goIGRhdGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdmFsdWVzO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBpc1Jvb3QgKSB7XG5cblx0XHRcdHZhciB0ZXh0dXJlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEudGV4dHVyZXMgKTtcblx0XHRcdHZhciBpbWFnZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLmltYWdlcyApO1xuXG5cdFx0XHRpZiAoIHRleHR1cmVzLmxlbmd0aCA+IDAgKSBkYXRhLnRleHR1cmVzID0gdGV4dHVyZXM7XG5cdFx0XHRpZiAoIGltYWdlcy5sZW5ndGggPiAwICkgZGF0YS5pbWFnZXMgPSBpbWFnZXM7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lO1xuXG5cdFx0dGhpcy5mb2cgPSBzb3VyY2UuZm9nO1xuXHRcdHRoaXMubGlnaHRzID0gc291cmNlLmxpZ2h0cztcblxuXHRcdHRoaXMuYmxlbmRpbmcgPSBzb3VyY2UuYmxlbmRpbmc7XG5cdFx0dGhpcy5zaWRlID0gc291cmNlLnNpZGU7XG5cdFx0dGhpcy5zaGFkaW5nID0gc291cmNlLnNoYWRpbmc7XG5cdFx0dGhpcy52ZXJ0ZXhDb2xvcnMgPSBzb3VyY2UudmVydGV4Q29sb3JzO1xuXG5cdFx0dGhpcy5vcGFjaXR5ID0gc291cmNlLm9wYWNpdHk7XG5cdFx0dGhpcy50cmFuc3BhcmVudCA9IHNvdXJjZS50cmFuc3BhcmVudDtcblxuXHRcdHRoaXMuYmxlbmRTcmMgPSBzb3VyY2UuYmxlbmRTcmM7XG5cdFx0dGhpcy5ibGVuZERzdCA9IHNvdXJjZS5ibGVuZERzdDtcblx0XHR0aGlzLmJsZW5kRXF1YXRpb24gPSBzb3VyY2UuYmxlbmRFcXVhdGlvbjtcblx0XHR0aGlzLmJsZW5kU3JjQWxwaGEgPSBzb3VyY2UuYmxlbmRTcmNBbHBoYTtcblx0XHR0aGlzLmJsZW5kRHN0QWxwaGEgPSBzb3VyY2UuYmxlbmREc3RBbHBoYTtcblx0XHR0aGlzLmJsZW5kRXF1YXRpb25BbHBoYSA9IHNvdXJjZS5ibGVuZEVxdWF0aW9uQWxwaGE7XG5cblx0XHR0aGlzLmRlcHRoRnVuYyA9IHNvdXJjZS5kZXB0aEZ1bmM7XG5cdFx0dGhpcy5kZXB0aFRlc3QgPSBzb3VyY2UuZGVwdGhUZXN0O1xuXHRcdHRoaXMuZGVwdGhXcml0ZSA9IHNvdXJjZS5kZXB0aFdyaXRlO1xuXG5cdFx0dGhpcy5jb2xvcldyaXRlID0gc291cmNlLmNvbG9yV3JpdGU7XG5cblx0XHR0aGlzLnByZWNpc2lvbiA9IHNvdXJjZS5wcmVjaXNpb247XG5cblx0XHR0aGlzLnBvbHlnb25PZmZzZXQgPSBzb3VyY2UucG9seWdvbk9mZnNldDtcblx0XHR0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IgPSBzb3VyY2UucG9seWdvbk9mZnNldEZhY3Rvcjtcblx0XHR0aGlzLnBvbHlnb25PZmZzZXRVbml0cyA9IHNvdXJjZS5wb2x5Z29uT2Zmc2V0VW5pdHM7XG5cblx0XHR0aGlzLmRpdGhlcmluZyA9IHNvdXJjZS5kaXRoZXJpbmc7XG5cblx0XHR0aGlzLmFscGhhVGVzdCA9IHNvdXJjZS5hbHBoYVRlc3Q7XG5cblx0XHR0aGlzLnByZW11bHRpcGxpZWRBbHBoYSA9IHNvdXJjZS5wcmVtdWx0aXBsaWVkQWxwaGE7XG5cblx0XHR0aGlzLm92ZXJkcmF3ID0gc291cmNlLm92ZXJkcmF3O1xuXG5cdFx0dGhpcy52aXNpYmxlID0gc291cmNlLnZpc2libGU7XG5cdFx0dGhpcy5jbGlwU2hhZG93cyA9IHNvdXJjZS5jbGlwU2hhZG93cztcblx0XHR0aGlzLmNsaXBJbnRlcnNlY3Rpb24gPSBzb3VyY2UuY2xpcEludGVyc2VjdGlvbjtcblxuXHRcdHZhciBzcmNQbGFuZXMgPSBzb3VyY2UuY2xpcHBpbmdQbGFuZXMsXG5cdFx0XHRkc3RQbGFuZXMgPSBudWxsO1xuXG5cdFx0aWYgKCBzcmNQbGFuZXMgIT09IG51bGwgKSB7XG5cblx0XHRcdHZhciBuID0gc3JjUGxhbmVzLmxlbmd0aDtcblx0XHRcdGRzdFBsYW5lcyA9IG5ldyBBcnJheSggbiApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG47ICsrIGkgKVxuXHRcdFx0XHRkc3RQbGFuZXNbIGkgXSA9IHNyY1BsYW5lc1sgaSBdLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmNsaXBwaW5nUGxhbmVzID0gZHN0UGxhbmVzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgZGVmaW5lczogeyBcImxhYmVsXCIgOiBcInZhbHVlXCIgfSxcbiAqICB1bmlmb3JtczogeyBcInBhcmFtZXRlcjFcIjogeyB2YWx1ZTogMS4wIH0sIFwicGFyYW1ldGVyMlwiOiB7IHZhbHVlMjogMiB9IH0sXG4gKlxuICogIGZyYWdtZW50U2hhZGVyOiA8c3RyaW5nPixcbiAqICB2ZXJ0ZXhTaGFkZXI6IDxzdHJpbmc+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sXG4gKlxuICogIGxpZ2h0czogPGJvb2w+LFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LFxuICogIG1vcnBoTm9ybWFsczogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gU2hhZGVyTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTaGFkZXJNYXRlcmlhbCc7XG5cblx0dGhpcy5kZWZpbmVzID0ge307XG5cdHRoaXMudW5pZm9ybXMgPSB7fTtcblxuXHR0aGlzLnZlcnRleFNoYWRlciA9ICd2b2lkIG1haW4oKSB7XFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNCggcG9zaXRpb24sIDEuMCApO1xcbn0nO1xuXHR0aGlzLmZyYWdtZW50U2hhZGVyID0gJ3ZvaWQgbWFpbigpIHtcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCAxLjAsIDAuMCwgMC4wLCAxLjAgKTtcXG59JztcblxuXHR0aGlzLmxpbmV3aWR0aCA9IDE7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXG5cdHRoaXMuZm9nID0gZmFsc2U7IC8vIHNldCB0byB1c2Ugc2NlbmUgZm9nXG5cdHRoaXMubGlnaHRzID0gZmFsc2U7IC8vIHNldCB0byB1c2Ugc2NlbmUgbGlnaHRzXG5cdHRoaXMuY2xpcHBpbmcgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSB1c2VyLWRlZmluZWQgY2xpcHBpbmcgcGxhbmVzXG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHNraW5uaW5nIGF0dHJpYnV0ZSBzdHJlYW1zXG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7IC8vIHNldCB0byB1c2UgbW9ycGggdGFyZ2V0c1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIG1vcnBoIG5vcm1hbHNcblxuXHR0aGlzLmV4dGVuc2lvbnMgPSB7XG5cdFx0ZGVyaXZhdGl2ZXM6IGZhbHNlLCAvLyBzZXQgdG8gdXNlIGRlcml2YXRpdmVzXG5cdFx0ZnJhZ0RlcHRoOiBmYWxzZSwgLy8gc2V0IHRvIHVzZSBmcmFnbWVudCBkZXB0aCB2YWx1ZXNcblx0XHRkcmF3QnVmZmVyczogZmFsc2UsIC8vIHNldCB0byB1c2UgZHJhdyBidWZmZXJzXG5cdFx0c2hhZGVyVGV4dHVyZUxPRDogZmFsc2UgLy8gc2V0IHRvIHVzZSBzaGFkZXIgdGV4dHVyZSBMT0Rcblx0fTtcblxuXHQvLyBXaGVuIHJlbmRlcmVkIGdlb21ldHJ5IGRvZXNuJ3QgaW5jbHVkZSB0aGVzZSBhdHRyaWJ1dGVzIGJ1dCB0aGUgbWF0ZXJpYWwgZG9lcyxcblx0Ly8gdXNlIHRoZXNlIGRlZmF1bHQgdmFsdWVzIGluIFdlYkdMLiBUaGlzIGF2b2lkcyBlcnJvcnMgd2hlbiBidWZmZXIgZGF0YSBpcyBtaXNzaW5nLlxuXHR0aGlzLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXMgPSB7XG5cdFx0J2NvbG9yJzogWyAxLCAxLCAxIF0sXG5cdFx0J3V2JzogWyAwLCAwIF0sXG5cdFx0J3V2Mic6IFsgMCwgMCBdXG5cdH07XG5cblx0dGhpcy5pbmRleDBBdHRyaWJ1dGVOYW1lID0gdW5kZWZpbmVkO1xuXG5cdGlmICggcGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLmF0dHJpYnV0ZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNoYWRlck1hdGVyaWFsOiBhdHRyaWJ1dGVzIHNob3VsZCBub3cgYmUgZGVmaW5lZCBpbiBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cblx0fVxuXG59XG5cblNoYWRlck1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2hhZGVyTWF0ZXJpYWw7XG5cblNoYWRlck1hdGVyaWFsLnByb3RvdHlwZS5pc1NoYWRlck1hdGVyaWFsID0gdHJ1ZTtcblxuU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmZyYWdtZW50U2hhZGVyID0gc291cmNlLmZyYWdtZW50U2hhZGVyO1xuXHR0aGlzLnZlcnRleFNoYWRlciA9IHNvdXJjZS52ZXJ0ZXhTaGFkZXI7XG5cblx0dGhpcy51bmlmb3JtcyA9IFVuaWZvcm1zVXRpbHMuY2xvbmUoIHNvdXJjZS51bmlmb3JtcyApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHNvdXJjZS5kZWZpbmVzO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXG5cdHRoaXMubGlnaHRzID0gc291cmNlLmxpZ2h0cztcblx0dGhpcy5jbGlwcGluZyA9IHNvdXJjZS5jbGlwcGluZztcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXG5cdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzO1xuXG5cdHRoaXMuZXh0ZW5zaW9ucyA9IHNvdXJjZS5leHRlbnNpb25zO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5TaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdHZhciBkYXRhID0gTWF0ZXJpYWwucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7XG5cblx0ZGF0YS51bmlmb3JtcyA9IHRoaXMudW5pZm9ybXM7XG5cdGRhdGEudmVydGV4U2hhZGVyID0gdGhpcy52ZXJ0ZXhTaGFkZXI7XG5cdGRhdGEuZnJhZ21lbnRTaGFkZXIgPSB0aGlzLmZyYWdtZW50U2hhZGVyO1xuXG5cdHJldHVybiBkYXRhO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHBzOi8vY2xhcmEuaW9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKlxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKlxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PixcbiAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoRGVwdGhNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ01lc2hEZXB0aE1hdGVyaWFsJztcblxuXHR0aGlzLmRlcHRoUGFja2luZyA9IEJhc2ljRGVwdGhQYWNraW5nO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcblxuXHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cblx0dGhpcy5mb2cgPSBmYWxzZTtcblx0dGhpcy5saWdodHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hEZXB0aE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaERlcHRoTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaERlcHRoTWF0ZXJpYWw7XG5cbk1lc2hEZXB0aE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hEZXB0aE1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaERlcHRoTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmRlcHRoUGFja2luZyA9IHNvdXJjZS5kZXB0aFBhY2tpbmc7XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXG5cdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gQm94MyggbWluLCBtYXggKSB7XG5cblx0dGhpcy5taW4gPSAoIG1pbiAhPT0gdW5kZWZpbmVkICkgPyBtaW4gOiBuZXcgVmVjdG9yMyggKyBJbmZpbml0eSwgKyBJbmZpbml0eSwgKyBJbmZpbml0eSApO1xuXHR0aGlzLm1heCA9ICggbWF4ICE9PSB1bmRlZmluZWQgKSA/IG1heCA6IG5ldyBWZWN0b3IzKCAtIEluZmluaXR5LCAtIEluZmluaXR5LCAtIEluZmluaXR5ICk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQm94My5wcm90b3R5cGUsIHtcblxuXHRpc0JveDM6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0dGhpcy5taW4uY29weSggbWluICk7XG5cdFx0dGhpcy5tYXguY29weSggbWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdHZhciBtaW5YID0gKyBJbmZpbml0eTtcblx0XHR2YXIgbWluWSA9ICsgSW5maW5pdHk7XG5cdFx0dmFyIG1pblogPSArIEluZmluaXR5O1xuXG5cdFx0dmFyIG1heFggPSAtIEluZmluaXR5O1xuXHRcdHZhciBtYXhZID0gLSBJbmZpbml0eTtcblx0XHR2YXIgbWF4WiA9IC0gSW5maW5pdHk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdHZhciB4ID0gYXJyYXlbIGkgXTtcblx0XHRcdHZhciB5ID0gYXJyYXlbIGkgKyAxIF07XG5cdFx0XHR2YXIgeiA9IGFycmF5WyBpICsgMiBdO1xuXG5cdFx0XHRpZiAoIHggPCBtaW5YICkgbWluWCA9IHg7XG5cdFx0XHRpZiAoIHkgPCBtaW5ZICkgbWluWSA9IHk7XG5cdFx0XHRpZiAoIHogPCBtaW5aICkgbWluWiA9IHo7XG5cblx0XHRcdGlmICggeCA+IG1heFggKSBtYXhYID0geDtcblx0XHRcdGlmICggeSA+IG1heFkgKSBtYXhZID0geTtcblx0XHRcdGlmICggeiA+IG1heFogKSBtYXhaID0gejtcblxuXHRcdH1cblxuXHRcdHRoaXMubWluLnNldCggbWluWCwgbWluWSwgbWluWiApO1xuXHRcdHRoaXMubWF4LnNldCggbWF4WCwgbWF4WSwgbWF4WiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSApIHtcblxuXHRcdHZhciBtaW5YID0gKyBJbmZpbml0eTtcblx0XHR2YXIgbWluWSA9ICsgSW5maW5pdHk7XG5cdFx0dmFyIG1pblogPSArIEluZmluaXR5O1xuXG5cdFx0dmFyIG1heFggPSAtIEluZmluaXR5O1xuXHRcdHZhciBtYXhZID0gLSBJbmZpbml0eTtcblx0XHR2YXIgbWF4WiA9IC0gSW5maW5pdHk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgeCA9IGF0dHJpYnV0ZS5nZXRYKCBpICk7XG5cdFx0XHR2YXIgeSA9IGF0dHJpYnV0ZS5nZXRZKCBpICk7XG5cdFx0XHR2YXIgeiA9IGF0dHJpYnV0ZS5nZXRaKCBpICk7XG5cblx0XHRcdGlmICggeCA8IG1pblggKSBtaW5YID0geDtcblx0XHRcdGlmICggeSA8IG1pblkgKSBtaW5ZID0geTtcblx0XHRcdGlmICggeiA8IG1pblogKSBtaW5aID0gejtcblxuXHRcdFx0aWYgKCB4ID4gbWF4WCApIG1heFggPSB4O1xuXHRcdFx0aWYgKCB5ID4gbWF4WSApIG1heFkgPSB5O1xuXHRcdFx0aWYgKCB6ID4gbWF4WiApIG1heFogPSB6O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5taW4uc2V0KCBtaW5YLCBtaW5ZLCBtaW5aICk7XG5cdFx0dGhpcy5tYXguc2V0KCBtYXhYLCBtYXhZLCBtYXhaICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZXhwYW5kQnlQb2ludCggcG9pbnRzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUNlbnRlckFuZFNpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbUNlbnRlckFuZFNpemUoIGNlbnRlciwgc2l6ZSApIHtcblxuXHRcdFx0dmFyIGhhbGZTaXplID0gdjEuY29weSggc2l6ZSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHRcdFx0dGhpcy5taW4uY29weSggY2VudGVyICkuc3ViKCBoYWxmU2l6ZSApO1xuXHRcdFx0dGhpcy5tYXguY29weSggY2VudGVyICkuYWRkKCBoYWxmU2l6ZSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHNldEZyb21PYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdHJldHVybiB0aGlzLmV4cGFuZEJ5T2JqZWN0KCBvYmplY3QgKTtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHRoaXMubWluLmNvcHkoIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5jb3B5KCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VFbXB0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5taW4ueCA9IHRoaXMubWluLnkgPSB0aGlzLm1pbi56ID0gKyBJbmZpbml0eTtcblx0XHR0aGlzLm1heC54ID0gdGhpcy5tYXgueSA9IHRoaXMubWF4LnogPSAtIEluZmluaXR5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRpc0VtcHR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyB0aGlzIGlzIGEgbW9yZSByb2J1c3QgY2hlY2sgZm9yIGVtcHR5IHRoYW4gKCB2b2x1bWUgPD0gMCApIGJlY2F1c2Ugdm9sdW1lIGNhbiBnZXQgcG9zaXRpdmUgd2l0aCB0d28gbmVnYXRpdmUgYXhlc1xuXG5cdFx0cmV0dXJuICggdGhpcy5tYXgueCA8IHRoaXMubWluLnggKSB8fCAoIHRoaXMubWF4LnkgPCB0aGlzLm1pbi55ICkgfHwgKCB0aGlzLm1heC56IDwgdGhpcy5taW4ueiApO1xuXG5cdH0sXG5cblx0Z2V0Q2VudGVyOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cdFx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpID8gcmVzdWx0LnNldCggMCwgMCwgMCApIDogcmVzdWx0LmFkZFZlY3RvcnMoIHRoaXMubWluLCB0aGlzLm1heCApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHR9LFxuXG5cdGdldFNpemU6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyByZXN1bHQuc2V0KCAwLCAwLCAwICkgOiByZXN1bHQuc3ViVmVjdG9ycyggdGhpcy5tYXgsIHRoaXMubWluICk7XG5cblx0fSxcblxuXHRleHBhbmRCeVBvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0dGhpcy5taW4ubWluKCBwb2ludCApO1xuXHRcdHRoaXMubWF4Lm1heCggcG9pbnQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlWZWN0b3I6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0dGhpcy5taW4uc3ViKCB2ZWN0b3IgKTtcblx0XHR0aGlzLm1heC5hZGQoIHZlY3RvciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRleHBhbmRCeVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLm1pbi5hZGRTY2FsYXIoIC0gc2NhbGFyICk7XG5cdFx0dGhpcy5tYXguYWRkU2NhbGFyKCBzY2FsYXIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlPYmplY3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIENvbXB1dGVzIHRoZSB3b3JsZC1heGlzLWFsaWduZWQgYm91bmRpbmcgYm94IG9mIGFuIG9iamVjdCAoaW5jbHVkaW5nIGl0cyBjaGlsZHJlbiksXG5cdFx0Ly8gYWNjb3VudGluZyBmb3IgYm90aCB0aGUgb2JqZWN0J3MsIGFuZCBjaGlsZHJlbidzLCB3b3JsZCB0cmFuc2Zvcm1zXG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGV4cGFuZEJ5T2JqZWN0KCBvYmplY3QgKSB7XG5cblx0XHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHRcdG9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0XHRvYmplY3QudHJhdmVyc2UoIGZ1bmN0aW9uICggbm9kZSApIHtcblxuXHRcdFx0XHR2YXIgaSwgbDtcblxuXHRcdFx0XHR2YXIgZ2VvbWV0cnkgPSBub2RlLmdlb21ldHJ5O1xuXG5cdFx0XHRcdGlmICggZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHRcdFx0dmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHR2MS5jb3B5KCB2ZXJ0aWNlc1sgaSBdICk7XG5cdFx0XHRcdFx0XHRcdHYxLmFwcGx5TWF0cml4NCggbm9kZS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdFx0XHRcdHNjb3BlLmV4cGFuZEJ5UG9pbnQoIHYxICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBhdHRyaWJ1dGUgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gYXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRcdHYxLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaSApLmFwcGx5TWF0cml4NCggbm9kZS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdFx0XHRcdFx0c2NvcGUuZXhwYW5kQnlQb2ludCggdjEgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjb250YWluc1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0cmV0dXJuIHBvaW50LnggPCB0aGlzLm1pbi54IHx8IHBvaW50LnggPiB0aGlzLm1heC54IHx8XG5cdFx0XHRwb2ludC55IDwgdGhpcy5taW4ueSB8fCBwb2ludC55ID4gdGhpcy5tYXgueSB8fFxuXHRcdFx0cG9pbnQueiA8IHRoaXMubWluLnogfHwgcG9pbnQueiA+IHRoaXMubWF4LnogPyBmYWxzZSA6IHRydWU7XG5cblx0fSxcblxuXHRjb250YWluc0JveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5taW4ueCA8PSBib3gubWluLnggJiYgYm94Lm1heC54IDw9IHRoaXMubWF4LnggJiZcblx0XHRcdHRoaXMubWluLnkgPD0gYm94Lm1pbi55ICYmIGJveC5tYXgueSA8PSB0aGlzLm1heC55ICYmXG5cdFx0XHR0aGlzLm1pbi56IDw9IGJveC5taW4ueiAmJiBib3gubWF4LnogPD0gdGhpcy5tYXguejtcblxuXHR9LFxuXG5cdGdldFBhcmFtZXRlcjogZnVuY3Rpb24gKCBwb2ludCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHQvLyBUaGlzIGNhbiBwb3RlbnRpYWxseSBoYXZlIGEgZGl2aWRlIGJ5IHplcm8gaWYgdGhlIGJveFxuXHRcdC8vIGhhcyBhIHNpemUgZGltZW5zaW9uIG9mIDAuXG5cblx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiByZXN1bHQuc2V0KFxuXHRcdFx0KCBwb2ludC54IC0gdGhpcy5taW4ueCApIC8gKCB0aGlzLm1heC54IC0gdGhpcy5taW4ueCApLFxuXHRcdFx0KCBwb2ludC55IC0gdGhpcy5taW4ueSApIC8gKCB0aGlzLm1heC55IC0gdGhpcy5taW4ueSApLFxuXHRcdFx0KCBwb2ludC56IC0gdGhpcy5taW4ueiApIC8gKCB0aGlzLm1heC56IC0gdGhpcy5taW4ueiApXG5cdFx0KTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0Ly8gdXNpbmcgNiBzcGxpdHRpbmcgcGxhbmVzIHRvIHJ1bGUgb3V0IGludGVyc2VjdGlvbnMuXG5cdFx0cmV0dXJuIGJveC5tYXgueCA8IHRoaXMubWluLnggfHwgYm94Lm1pbi54ID4gdGhpcy5tYXgueCB8fFxuXHRcdFx0Ym94Lm1heC55IDwgdGhpcy5taW4ueSB8fCBib3gubWluLnkgPiB0aGlzLm1heC55IHx8XG5cdFx0XHRib3gubWF4LnogPCB0aGlzLm1pbi56IHx8IGJveC5taW4ueiA+IHRoaXMubWF4LnogPyBmYWxzZSA6IHRydWU7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzU3BoZXJlOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBjbG9zZXN0UG9pbnQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApIHtcblxuXHRcdFx0Ly8gRmluZCB0aGUgcG9pbnQgb24gdGhlIEFBQkIgY2xvc2VzdCB0byB0aGUgc3BoZXJlIGNlbnRlci5cblx0XHRcdHRoaXMuY2xhbXBQb2ludCggc3BoZXJlLmNlbnRlciwgY2xvc2VzdFBvaW50ICk7XG5cblx0XHRcdC8vIElmIHRoYXQgcG9pbnQgaXMgaW5zaWRlIHRoZSBzcGhlcmUsIHRoZSBBQUJCIGFuZCBzcGhlcmUgaW50ZXJzZWN0LlxuXHRcdFx0cmV0dXJuIGNsb3Nlc3RQb2ludC5kaXN0YW5jZVRvU3F1YXJlZCggc3BoZXJlLmNlbnRlciApIDw9ICggc3BoZXJlLnJhZGl1cyAqIHNwaGVyZS5yYWRpdXMgKTtcblxuXHRcdH07XG5cblx0fSApKCksXG5cblx0aW50ZXJzZWN0c1BsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkge1xuXG5cdFx0Ly8gV2UgY29tcHV0ZSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBkb3QgcHJvZHVjdCB2YWx1ZXMuIElmIHRob3NlIHZhbHVlc1xuXHRcdC8vIGFyZSBvbiB0aGUgc2FtZSBzaWRlIChiYWNrIG9yIGZyb250KSBvZiB0aGUgcGxhbmUsIHRoZW4gdGhlcmUgaXMgbm8gaW50ZXJzZWN0aW9uLlxuXG5cdFx0dmFyIG1pbiwgbWF4O1xuXG5cdFx0aWYgKCBwbGFuZS5ub3JtYWwueCA+IDAgKSB7XG5cblx0XHRcdG1pbiA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5taW4ueDtcblx0XHRcdG1heCA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5tYXgueDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdG1pbiA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5tYXgueDtcblx0XHRcdG1heCA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5taW4ueDtcblxuXHRcdH1cblxuXHRcdGlmICggcGxhbmUubm9ybWFsLnkgPiAwICkge1xuXG5cdFx0XHRtaW4gKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1pbi55O1xuXHRcdFx0bWF4ICs9IHBsYW5lLm5vcm1hbC55ICogdGhpcy5tYXgueTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdG1pbiArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWF4Lnk7XG5cdFx0XHRtYXggKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1pbi55O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwbGFuZS5ub3JtYWwueiA+IDAgKSB7XG5cblx0XHRcdG1pbiArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWluLno7XG5cdFx0XHRtYXggKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1heC56O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bWluICs9IHBsYW5lLm5vcm1hbC56ICogdGhpcy5tYXguejtcblx0XHRcdG1heCArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWluLno7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gKCBtaW4gPD0gcGxhbmUuY29uc3RhbnQgJiYgbWF4ID49IHBsYW5lLmNvbnN0YW50ICk7XG5cblx0fSxcblxuXHRjbGFtcFBvaW50OiBmdW5jdGlvbiAoIHBvaW50LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXHRcdHJldHVybiByZXN1bHQuY29weSggcG9pbnQgKS5jbGFtcCggdGhpcy5taW4sIHRoaXMubWF4ICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHtcblxuXHRcdFx0dmFyIGNsYW1wZWRQb2ludCA9IHYxLmNvcHkoIHBvaW50ICkuY2xhbXAoIHRoaXMubWluLCB0aGlzLm1heCApO1xuXHRcdFx0cmV0dXJuIGNsYW1wZWRQb2ludC5zdWIoIHBvaW50ICkubGVuZ3RoKCk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRnZXRCb3VuZGluZ1NwaGVyZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRCb3VuZGluZ1NwaGVyZSggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgU3BoZXJlKCk7XG5cblx0XHRcdHRoaXMuZ2V0Q2VudGVyKCByZXN1bHQuY2VudGVyICk7XG5cblx0XHRcdHJlc3VsdC5yYWRpdXMgPSB0aGlzLmdldFNpemUoIHYxICkubGVuZ3RoKCkgKiAwLjU7XG5cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRpbnRlcnNlY3Q6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0dGhpcy5taW4ubWF4KCBib3gubWluICk7XG5cdFx0dGhpcy5tYXgubWluKCBib3gubWF4ICk7XG5cblx0XHQvLyBlbnN1cmUgdGhhdCBpZiB0aGVyZSBpcyBubyBvdmVybGFwLCB0aGUgcmVzdWx0IGlzIGZ1bGx5IGVtcHR5LCBub3Qgc2xpZ2h0bHkgZW1wdHkgd2l0aCBub24taW5mLytpbmYgdmFsdWVzIHRoYXQgd2lsbCBjYXVzZSBzdWJzZXF1ZW5jZSBpbnRlcnNlY3RzIHRvIGVycm9uZW91c2x5IHJldHVybiB2YWxpZCB2YWx1ZXMuXG5cdFx0aWYoIHRoaXMuaXNFbXB0eSgpICkgdGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dW5pb246IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0dGhpcy5taW4ubWluKCBib3gubWluICk7XG5cdFx0dGhpcy5tYXgubWF4KCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHBvaW50cyA9IFtcblx0XHRcdG5ldyBWZWN0b3IzKCksXG5cdFx0XHRuZXcgVmVjdG9yMygpLFxuXHRcdFx0bmV3IFZlY3RvcjMoKSxcblx0XHRcdG5ldyBWZWN0b3IzKCksXG5cdFx0XHRuZXcgVmVjdG9yMygpLFxuXHRcdFx0bmV3IFZlY3RvcjMoKSxcblx0XHRcdG5ldyBWZWN0b3IzKCksXG5cdFx0XHRuZXcgVmVjdG9yMygpXG5cdFx0XTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBhcHBseU1hdHJpeDQoIG1hdHJpeCApIHtcblxuXHRcdFx0Ly8gdHJhbnNmb3JtIG9mIGVtcHR5IGJveCBpcyBhbiBlbXB0eSBib3guXG5cdFx0XHRpZiggdGhpcy5pc0VtcHR5KCkgKSByZXR1cm4gdGhpcztcblxuXHRcdFx0Ly8gTk9URTogSSBhbSB1c2luZyBhIGJpbmFyeSBwYXR0ZXJuIHRvIHNwZWNpZnkgYWxsIDJeMyBjb21iaW5hdGlvbnMgYmVsb3dcblx0XHRcdHBvaW50c1sgMCBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5taW4ueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAwMFxuXHRcdFx0cG9pbnRzWyAxIF0uc2V0KCB0aGlzLm1pbi54LCB0aGlzLm1pbi55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMDAxXG5cdFx0XHRwb2ludHNbIDIgXS5zZXQoIHRoaXMubWluLngsIHRoaXMubWF4LnksIHRoaXMubWluLnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAwMTBcblx0XHRcdHBvaW50c1sgMyBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5tYXgueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAxMVxuXHRcdFx0cG9pbnRzWyA0IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1pbi55LCB0aGlzLm1pbi56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMTAwXG5cdFx0XHRwb2ludHNbIDUgXS5zZXQoIHRoaXMubWF4LngsIHRoaXMubWluLnksIHRoaXMubWF4LnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAxMDFcblx0XHRcdHBvaW50c1sgNiBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5tYXgueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDExMFxuXHRcdFx0cG9pbnRzWyA3IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1heC55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcdC8vIDExMVxuXG5cdFx0XHR0aGlzLnNldEZyb21Qb2ludHMoIHBvaW50cyApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLm1pbi5hZGQoIG9mZnNldCApO1xuXHRcdHRoaXMubWF4LmFkZCggb2Zmc2V0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRyZXR1cm4gYm94Lm1pbi5lcXVhbHMoIHRoaXMubWluICkgJiYgYm94Lm1heC5lcXVhbHMoIHRoaXMubWF4ICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTcGhlcmUoIGNlbnRlciwgcmFkaXVzICkge1xuXG5cdHRoaXMuY2VudGVyID0gKCBjZW50ZXIgIT09IHVuZGVmaW5lZCApID8gY2VudGVyIDogbmV3IFZlY3RvcjMoKTtcblx0dGhpcy5yYWRpdXMgPSAoIHJhZGl1cyAhPT0gdW5kZWZpbmVkICkgPyByYWRpdXMgOiAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFNwaGVyZS5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggY2VudGVyLCByYWRpdXMgKSB7XG5cblx0XHR0aGlzLmNlbnRlci5jb3B5KCBjZW50ZXIgKTtcblx0XHR0aGlzLnJhZGl1cyA9IHJhZGl1cztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJveCA9IG5ldyBCb3gzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbVBvaW50cyggcG9pbnRzLCBvcHRpb25hbENlbnRlciApIHtcblxuXHRcdFx0dmFyIGNlbnRlciA9IHRoaXMuY2VudGVyO1xuXG5cdFx0XHRpZiAoIG9wdGlvbmFsQ2VudGVyICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y2VudGVyLmNvcHkoIG9wdGlvbmFsQ2VudGVyICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ym94LnNldEZyb21Qb2ludHMoIHBvaW50cyApLmdldENlbnRlciggY2VudGVyICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG1heFJhZGl1c1NxID0gMDtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRtYXhSYWRpdXNTcSA9IE1hdGgubWF4KCBtYXhSYWRpdXNTcSwgY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludHNbIGkgXSApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5yYWRpdXMgPSBNYXRoLnNxcnQoIG1heFJhZGl1c1NxICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0dGhpcy5jZW50ZXIuY29weSggc3BoZXJlLmNlbnRlciApO1xuXHRcdHRoaXMucmFkaXVzID0gc3BoZXJlLnJhZGl1cztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiAoIHRoaXMucmFkaXVzIDw9IDAgKTtcblxuXHR9LFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gKCBwb2ludC5kaXN0YW5jZVRvU3F1YXJlZCggdGhpcy5jZW50ZXIgKSA8PSAoIHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXMgKSApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0cmV0dXJuICggcG9pbnQuZGlzdGFuY2VUbyggdGhpcy5jZW50ZXIgKSAtIHRoaXMucmFkaXVzICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHtcblxuXHRcdHZhciByYWRpdXNTdW0gPSB0aGlzLnJhZGl1cyArIHNwaGVyZS5yYWRpdXM7XG5cblx0XHRyZXR1cm4gc3BoZXJlLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCggdGhpcy5jZW50ZXIgKSA8PSAoIHJhZGl1c1N1bSAqIHJhZGl1c1N1bSApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c0JveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRyZXR1cm4gYm94LmludGVyc2VjdHNTcGhlcmUoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNQbGFuZTogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdC8vIFdlIHVzZSB0aGUgZm9sbG93aW5nIGVxdWF0aW9uIHRvIGNvbXB1dGUgdGhlIHNpZ25lZCBkaXN0YW5jZSBmcm9tXG5cdFx0Ly8gdGhlIGNlbnRlciBvZiB0aGUgc3BoZXJlIHRvIHRoZSBwbGFuZS5cblx0XHQvL1xuXHRcdC8vIGRpc3RhbmNlID0gcSAqIG4gLSBkXG5cdFx0Ly9cblx0XHQvLyBJZiB0aGlzIGRpc3RhbmNlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcmFkaXVzIG9mIHRoZSBzcGhlcmUsXG5cdFx0Ly8gdGhlbiB0aGVyZSBpcyBubyBpbnRlcnNlY3Rpb24uXG5cblx0XHRyZXR1cm4gTWF0aC5hYnMoIHRoaXMuY2VudGVyLmRvdCggcGxhbmUubm9ybWFsICkgLSBwbGFuZS5jb25zdGFudCApIDw9IHRoaXMucmFkaXVzO1xuXG5cdH0sXG5cblx0Y2xhbXBQb2ludDogZnVuY3Rpb24gKCBwb2ludCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgZGVsdGFMZW5ndGhTcSA9IHRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludCApO1xuXG5cdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXN1bHQuY29weSggcG9pbnQgKTtcblxuXHRcdGlmICggZGVsdGFMZW5ndGhTcSA+ICggdGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cyApICkge1xuXG5cdFx0XHRyZXN1bHQuc3ViKCB0aGlzLmNlbnRlciApLm5vcm1hbGl6ZSgpO1xuXHRcdFx0cmVzdWx0Lm11bHRpcGx5U2NhbGFyKCB0aGlzLnJhZGl1cyApLmFkZCggdGhpcy5jZW50ZXIgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fSxcblxuXHRnZXRCb3VuZGluZ0JveDogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciBib3ggPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgQm94MygpO1xuXG5cdFx0Ym94LnNldCggdGhpcy5jZW50ZXIsIHRoaXMuY2VudGVyICk7XG5cdFx0Ym94LmV4cGFuZEJ5U2NhbGFyKCB0aGlzLnJhZGl1cyApO1xuXG5cdFx0cmV0dXJuIGJveDtcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR0aGlzLmNlbnRlci5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXHRcdHRoaXMucmFkaXVzID0gdGhpcy5yYWRpdXMgKiBtYXRyaXguZ2V0TWF4U2NhbGVPbkF4aXMoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoIG9mZnNldCApIHtcblxuXHRcdHRoaXMuY2VudGVyLmFkZCggb2Zmc2V0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHRyZXR1cm4gc3BoZXJlLmNlbnRlci5lcXVhbHMoIHRoaXMuY2VudGVyICkgJiYgKCBzcGhlcmUucmFkaXVzID09PSB0aGlzLnJhZGl1cyApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBNYXRyaXgzKCkge1xuXG5cdHRoaXMuZWxlbWVudHMgPSBbXG5cblx0XHQxLCAwLCAwLFxuXHRcdDAsIDEsIDAsXG5cdFx0MCwgMCwgMVxuXG5cdF07XG5cblx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID4gMCApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXgzOiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLicgKTtcblxuXHR9XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggTWF0cml4My5wcm90b3R5cGUsIHtcblxuXHRpc01hdHJpeDM6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIG4xMSwgbjEyLCBuMTMsIG4yMSwgbjIyLCBuMjMsIG4zMSwgbjMyLCBuMzMgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSA9IG4xMTsgdGVbIDEgXSA9IG4yMTsgdGVbIDIgXSA9IG4zMTtcblx0XHR0ZVsgMyBdID0gbjEyOyB0ZVsgNCBdID0gbjIyOyB0ZVsgNSBdID0gbjMyO1xuXHRcdHRlWyA2IF0gPSBuMTM7IHRlWyA3IF0gPSBuMjM7IHRlWyA4IF0gPSBuMzM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGlkZW50aXR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0MSwgMCwgMCxcblx0XHRcdDAsIDEsIDAsXG5cdFx0XHQwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuZnJvbUFycmF5KCB0aGlzLmVsZW1lbnRzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciBtZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdID0gbWVbIDAgXTsgdGVbIDEgXSA9IG1lWyAxIF07IHRlWyAyIF0gPSBtZVsgMiBdO1xuXHRcdHRlWyAzIF0gPSBtZVsgMyBdOyB0ZVsgNCBdID0gbWVbIDQgXTsgdGVbIDUgXSA9IG1lWyA1IF07XG5cdFx0dGVbIDYgXSA9IG1lWyA2IF07IHRlWyA3IF0gPSBtZVsgNyBdOyB0ZVsgOCBdID0gbWVbIDggXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbU1hdHJpeDQ6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciBtZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0bWVbIDAgXSwgbWVbIDQgXSwgbWVbICA4IF0sXG5cdFx0XHRtZVsgMSBdLCBtZVsgNSBdLCBtZVsgIDkgXSxcblx0XHRcdG1lWyAyIF0sIG1lWyA2IF0sIG1lWyAxMCBdXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseVRvQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gYXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2MS54ID0gYXR0cmlidXRlLmdldFgoIGkgKTtcblx0XHRcdFx0djEueSA9IGF0dHJpYnV0ZS5nZXRZKCBpICk7XG5cdFx0XHRcdHYxLnogPSBhdHRyaWJ1dGUuZ2V0WiggaSApO1xuXG5cdFx0XHRcdHYxLmFwcGx5TWF0cml4MyggdGhpcyApO1xuXG5cdFx0XHRcdGF0dHJpYnV0ZS5zZXRYWVooIGksIHYxLngsIHYxLnksIHYxLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gYXR0cmlidXRlO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIHRoaXMsIG0gKTtcblxuXHR9LFxuXG5cdHByZW11bHRpcGx5OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCBtLCB0aGlzICk7XG5cblx0fSxcblxuXHRtdWx0aXBseU1hdHJpY2VzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR2YXIgYWUgPSBhLmVsZW1lbnRzO1xuXHRcdHZhciBiZSA9IGIuZWxlbWVudHM7XG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciBhMTEgPSBhZVsgMCBdLCBhMTIgPSBhZVsgMyBdLCBhMTMgPSBhZVsgNiBdO1xuXHRcdHZhciBhMjEgPSBhZVsgMSBdLCBhMjIgPSBhZVsgNCBdLCBhMjMgPSBhZVsgNyBdO1xuXHRcdHZhciBhMzEgPSBhZVsgMiBdLCBhMzIgPSBhZVsgNSBdLCBhMzMgPSBhZVsgOCBdO1xuXG5cdFx0dmFyIGIxMSA9IGJlWyAwIF0sIGIxMiA9IGJlWyAzIF0sIGIxMyA9IGJlWyA2IF07XG5cdFx0dmFyIGIyMSA9IGJlWyAxIF0sIGIyMiA9IGJlWyA0IF0sIGIyMyA9IGJlWyA3IF07XG5cdFx0dmFyIGIzMSA9IGJlWyAyIF0sIGIzMiA9IGJlWyA1IF0sIGIzMyA9IGJlWyA4IF07XG5cblx0XHR0ZVsgMCBdID0gYTExICogYjExICsgYTEyICogYjIxICsgYTEzICogYjMxO1xuXHRcdHRlWyAzIF0gPSBhMTEgKiBiMTIgKyBhMTIgKiBiMjIgKyBhMTMgKiBiMzI7XG5cdFx0dGVbIDYgXSA9IGExMSAqIGIxMyArIGExMiAqIGIyMyArIGExMyAqIGIzMztcblxuXHRcdHRlWyAxIF0gPSBhMjEgKiBiMTEgKyBhMjIgKiBiMjEgKyBhMjMgKiBiMzE7XG5cdFx0dGVbIDQgXSA9IGEyMSAqIGIxMiArIGEyMiAqIGIyMiArIGEyMyAqIGIzMjtcblx0XHR0ZVsgNyBdID0gYTIxICogYjEzICsgYTIyICogYjIzICsgYTIzICogYjMzO1xuXG5cdFx0dGVbIDIgXSA9IGEzMSAqIGIxMSArIGEzMiAqIGIyMSArIGEzMyAqIGIzMTtcblx0XHR0ZVsgNSBdID0gYTMxICogYjEyICsgYTMyICogYjIyICsgYTMzICogYjMyO1xuXHRcdHRlWyA4IF0gPSBhMzEgKiBiMTMgKyBhMzIgKiBiMjMgKyBhMzMgKiBiMzM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSAqPSBzOyB0ZVsgMyBdICo9IHM7IHRlWyA2IF0gKj0gcztcblx0XHR0ZVsgMSBdICo9IHM7IHRlWyA0IF0gKj0gczsgdGVbIDcgXSAqPSBzO1xuXHRcdHRlWyAyIF0gKj0gczsgdGVbIDUgXSAqPSBzOyB0ZVsgOCBdICo9IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRldGVybWluYW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIGEgPSB0ZVsgMCBdLCBiID0gdGVbIDEgXSwgYyA9IHRlWyAyIF0sXG5cdFx0XHRkID0gdGVbIDMgXSwgZSA9IHRlWyA0IF0sIGYgPSB0ZVsgNSBdLFxuXHRcdFx0ZyA9IHRlWyA2IF0sIGggPSB0ZVsgNyBdLCBpID0gdGVbIDggXTtcblxuXHRcdHJldHVybiBhICogZSAqIGkgLSBhICogZiAqIGggLSBiICogZCAqIGkgKyBiICogZiAqIGcgKyBjICogZCAqIGggLSBjICogZSAqIGc7XG5cblx0fSxcblxuXHRnZXRJbnZlcnNlOiBmdW5jdGlvbiAoIG1hdHJpeCwgdGhyb3dPbkRlZ2VuZXJhdGUgKSB7XG5cblx0XHRpZiAoIG1hdHJpeCAmJiBtYXRyaXguaXNNYXRyaXg0ICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCBcIlRIUkVFLk1hdHJpeDMuZ2V0SW52ZXJzZSBubyBsb25nZXIgdGFrZXMgYSBNYXRyaXg0IGFyZ3VtZW50LlwiICk7XG5cblx0XHR9XG5cblx0XHR2YXIgbWUgPSBtYXRyaXguZWxlbWVudHMsXG5cdFx0XHR0ZSA9IHRoaXMuZWxlbWVudHMsXG5cblx0XHRcdG4xMSA9IG1lWyAwIF0sIG4yMSA9IG1lWyAxIF0sIG4zMSA9IG1lWyAyIF0sXG5cdFx0XHRuMTIgPSBtZVsgMyBdLCBuMjIgPSBtZVsgNCBdLCBuMzIgPSBtZVsgNSBdLFxuXHRcdFx0bjEzID0gbWVbIDYgXSwgbjIzID0gbWVbIDcgXSwgbjMzID0gbWVbIDggXSxcblxuXHRcdFx0dDExID0gbjMzICogbjIyIC0gbjMyICogbjIzLFxuXHRcdFx0dDEyID0gbjMyICogbjEzIC0gbjMzICogbjEyLFxuXHRcdFx0dDEzID0gbjIzICogbjEyIC0gbjIyICogbjEzLFxuXG5cdFx0XHRkZXQgPSBuMTEgKiB0MTEgKyBuMjEgKiB0MTIgKyBuMzEgKiB0MTM7XG5cblx0XHRpZiAoIGRldCA9PT0gMCApIHtcblxuXHRcdFx0dmFyIG1zZyA9IFwiVEhSRUUuTWF0cml4My5nZXRJbnZlcnNlKCk6IGNhbid0IGludmVydCBtYXRyaXgsIGRldGVybWluYW50IGlzIDBcIjtcblxuXHRcdFx0aWYgKCB0aHJvd09uRGVnZW5lcmF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoIG1zZyApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggbXNnICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMuaWRlbnRpdHkoKTtcblxuXHRcdH1cblxuXHRcdHZhciBkZXRJbnYgPSAxIC8gZGV0O1xuXG5cdFx0dGVbIDAgXSA9IHQxMSAqIGRldEludjtcblx0XHR0ZVsgMSBdID0gKCBuMzEgKiBuMjMgLSBuMzMgKiBuMjEgKSAqIGRldEludjtcblx0XHR0ZVsgMiBdID0gKCBuMzIgKiBuMjEgLSBuMzEgKiBuMjIgKSAqIGRldEludjtcblxuXHRcdHRlWyAzIF0gPSB0MTIgKiBkZXRJbnY7XG5cdFx0dGVbIDQgXSA9ICggbjMzICogbjExIC0gbjMxICogbjEzICkgKiBkZXRJbnY7XG5cdFx0dGVbIDUgXSA9ICggbjMxICogbjEyIC0gbjMyICogbjExICkgKiBkZXRJbnY7XG5cblx0XHR0ZVsgNiBdID0gdDEzICogZGV0SW52O1xuXHRcdHRlWyA3IF0gPSAoIG4yMSAqIG4xMyAtIG4yMyAqIG4xMSApICogZGV0SW52O1xuXHRcdHRlWyA4IF0gPSAoIG4yMiAqIG4xMSAtIG4yMSAqIG4xMiApICogZGV0SW52O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0cmFuc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0bXAsIG0gPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dG1wID0gbVsgMSBdOyBtWyAxIF0gPSBtWyAzIF07IG1bIDMgXSA9IHRtcDtcblx0XHR0bXAgPSBtWyAyIF07IG1bIDIgXSA9IG1bIDYgXTsgbVsgNiBdID0gdG1wO1xuXHRcdHRtcCA9IG1bIDUgXTsgbVsgNSBdID0gbVsgNyBdOyBtWyA3IF0gPSB0bXA7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldE5vcm1hbE1hdHJpeDogZnVuY3Rpb24gKCBtYXRyaXg0ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeDQoIG1hdHJpeDQgKS5nZXRJbnZlcnNlKCB0aGlzICkudHJhbnNwb3NlKCk7XG5cblx0fSxcblxuXHR0cmFuc3Bvc2VJbnRvQXJyYXk6IGZ1bmN0aW9uICggciApIHtcblxuXHRcdHZhciBtID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHJbIDAgXSA9IG1bIDAgXTtcblx0XHRyWyAxIF0gPSBtWyAzIF07XG5cdFx0clsgMiBdID0gbVsgNiBdO1xuXHRcdHJbIDMgXSA9IG1bIDEgXTtcblx0XHRyWyA0IF0gPSBtWyA0IF07XG5cdFx0clsgNSBdID0gbVsgNyBdO1xuXHRcdHJbIDYgXSA9IG1bIDIgXTtcblx0XHRyWyA3IF0gPSBtWyA1IF07XG5cdFx0clsgOCBdID0gbVsgOCBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgbWUgPSBtYXRyaXguZWxlbWVudHM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA5OyBpICsrICkge1xuXG5cdFx0XHRpZiAoIHRlWyBpIF0gIT09IG1lWyBpIF0gKSByZXR1cm4gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA5OyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmVsZW1lbnRzWyBpIF0gPSBhcnJheVsgaSArIG9mZnNldCBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRlWyAwIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRlWyAxIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRlWyAyIF07XG5cblx0XHRhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGVbIDMgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNCBdID0gdGVbIDQgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNSBdID0gdGVbIDUgXTtcblxuXHRcdGFycmF5WyBvZmZzZXQgKyA2IF0gPSB0ZVsgNiBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA3IF0gPSB0ZVsgNyBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA4IF0gPSB0ZVsgOCBdO1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBQbGFuZSggbm9ybWFsLCBjb25zdGFudCApIHtcblxuXHR0aGlzLm5vcm1hbCA9ICggbm9ybWFsICE9PSB1bmRlZmluZWQgKSA/IG5vcm1hbCA6IG5ldyBWZWN0b3IzKCAxLCAwLCAwICk7XG5cdHRoaXMuY29uc3RhbnQgPSAoIGNvbnN0YW50ICE9PSB1bmRlZmluZWQgKSA/IGNvbnN0YW50IDogMDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBQbGFuZS5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggbm9ybWFsLCBjb25zdGFudCApIHtcblxuXHRcdHRoaXMubm9ybWFsLmNvcHkoIG5vcm1hbCApO1xuXHRcdHRoaXMuY29uc3RhbnQgPSBjb25zdGFudDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Q29tcG9uZW50czogZnVuY3Rpb24gKCB4LCB5LCB6LCB3ICkge1xuXG5cdFx0dGhpcy5ub3JtYWwuc2V0KCB4LCB5LCB6ICk7XG5cdFx0dGhpcy5jb25zdGFudCA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50OiBmdW5jdGlvbiAoIG5vcm1hbCwgcG9pbnQgKSB7XG5cblx0XHR0aGlzLm5vcm1hbC5jb3B5KCBub3JtYWwgKTtcblx0XHR0aGlzLmNvbnN0YW50ID0gLSBwb2ludC5kb3QoIHRoaXMubm9ybWFsICk7XHQvLyBtdXN0IGJlIHRoaXMubm9ybWFsLCBub3Qgbm9ybWFsLCBhcyB0aGlzLm5vcm1hbCBpcyBub3JtYWxpemVkXG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Db3BsYW5hclBvaW50czogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldEZyb21Db3BsYW5hclBvaW50cyggYSwgYiwgYyApIHtcblxuXHRcdFx0dmFyIG5vcm1hbCA9IHYxLnN1YlZlY3RvcnMoIGMsIGIgKS5jcm9zcyggdjIuc3ViVmVjdG9ycyggYSwgYiApICkubm9ybWFsaXplKCk7XG5cblx0XHRcdC8vIFE6IHNob3VsZCBhbiBlcnJvciBiZSB0aHJvd24gaWYgbm9ybWFsIGlzIHplcm8gKGUuZy4gZGVnZW5lcmF0ZSBwbGFuZSk/XG5cblx0XHRcdHRoaXMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQoIG5vcm1hbCwgYSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHBsYW5lICkge1xuXG5cdFx0dGhpcy5ub3JtYWwuY29weSggcGxhbmUubm9ybWFsICk7XG5cdFx0dGhpcy5jb25zdGFudCA9IHBsYW5lLmNvbnN0YW50O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRub3JtYWxpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIE5vdGU6IHdpbGwgbGVhZCB0byBhIGRpdmlkZSBieSB6ZXJvIGlmIHRoZSBwbGFuZSBpcyBpbnZhbGlkLlxuXG5cdFx0dmFyIGludmVyc2VOb3JtYWxMZW5ndGggPSAxLjAgLyB0aGlzLm5vcm1hbC5sZW5ndGgoKTtcblx0XHR0aGlzLm5vcm1hbC5tdWx0aXBseVNjYWxhciggaW52ZXJzZU5vcm1hbExlbmd0aCApO1xuXHRcdHRoaXMuY29uc3RhbnQgKj0gaW52ZXJzZU5vcm1hbExlbmd0aDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bmVnYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNvbnN0YW50ICo9IC0gMTtcblx0XHR0aGlzLm5vcm1hbC5uZWdhdGUoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubm9ybWFsLmRvdCggcG9pbnQgKSArIHRoaXMuY29uc3RhbnQ7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHtcblxuXHRcdHJldHVybiB0aGlzLmRpc3RhbmNlVG9Qb2ludCggc3BoZXJlLmNlbnRlciApIC0gc3BoZXJlLnJhZGl1cztcblxuXHR9LFxuXG5cdHByb2plY3RQb2ludDogZnVuY3Rpb24gKCBwb2ludCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5vcnRob1BvaW50KCBwb2ludCwgb3B0aW9uYWxUYXJnZXQgKS5zdWIoIHBvaW50ICkubmVnYXRlKCk7XG5cblx0fSxcblxuXHRvcnRob1BvaW50OiBmdW5jdGlvbiAoIHBvaW50LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciBwZXJwZW5kaWN1bGFyTWFnbml0dWRlID0gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIHBvaW50ICk7XG5cblx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblx0XHRyZXR1cm4gcmVzdWx0LmNvcHkoIHRoaXMubm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIHBlcnBlbmRpY3VsYXJNYWduaXR1ZGUgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdExpbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0TGluZSggbGluZSwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHR2YXIgZGlyZWN0aW9uID0gbGluZS5kZWx0YSggdjEgKTtcblxuXHRcdFx0dmFyIGRlbm9taW5hdG9yID0gdGhpcy5ub3JtYWwuZG90KCBkaXJlY3Rpb24gKTtcblxuXHRcdFx0aWYgKCBkZW5vbWluYXRvciA9PT0gMCApIHtcblxuXHRcdFx0XHQvLyBsaW5lIGlzIGNvcGxhbmFyLCByZXR1cm4gb3JpZ2luXG5cdFx0XHRcdGlmICggdGhpcy5kaXN0YW5jZVRvUG9pbnQoIGxpbmUuc3RhcnQgKSA9PT0gMCApIHtcblxuXHRcdFx0XHRcdHJldHVybiByZXN1bHQuY29weSggbGluZS5zdGFydCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBVbnN1cmUgaWYgdGhpcyBpcyB0aGUgY29ycmVjdCBtZXRob2QgdG8gaGFuZGxlIHRoaXMgY2FzZS5cblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgdCA9IC0gKCBsaW5lLnN0YXJ0LmRvdCggdGhpcy5ub3JtYWwgKSArIHRoaXMuY29uc3RhbnQgKSAvIGRlbm9taW5hdG9yO1xuXG5cdFx0XHRpZiAoIHQgPCAwIHx8IHQgPiAxICkge1xuXG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHJlc3VsdC5jb3B5KCBkaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggdCApLmFkZCggbGluZS5zdGFydCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW50ZXJzZWN0c0xpbmU6IGZ1bmN0aW9uICggbGluZSApIHtcblxuXHRcdC8vIE5vdGU6IHRoaXMgdGVzdHMgaWYgYSBsaW5lIGludGVyc2VjdHMgdGhlIHBsYW5lLCBub3Qgd2hldGhlciBpdCAob3IgaXRzIGVuZC1wb2ludHMpIGFyZSBjb3BsYW5hciB3aXRoIGl0LlxuXG5cdFx0dmFyIHN0YXJ0U2lnbiA9IHRoaXMuZGlzdGFuY2VUb1BvaW50KCBsaW5lLnN0YXJ0ICk7XG5cdFx0dmFyIGVuZFNpZ24gPSB0aGlzLmRpc3RhbmNlVG9Qb2ludCggbGluZS5lbmQgKTtcblxuXHRcdHJldHVybiAoIHN0YXJ0U2lnbiA8IDAgJiYgZW5kU2lnbiA+IDAgKSB8fCAoIGVuZFNpZ24gPCAwICYmIHN0YXJ0U2lnbiA+IDAgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5pbnRlcnNlY3RzUGxhbmUoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHNwaGVyZS5pbnRlcnNlY3RzUGxhbmUoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcGxhbmFyUG9pbnQ6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblx0XHRyZXR1cm4gcmVzdWx0LmNvcHkoIHRoaXMubm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIC0gdGhpcy5jb25zdGFudCApO1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXgzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gYXBwbHlNYXRyaXg0KCBtYXRyaXgsIG9wdGlvbmFsTm9ybWFsTWF0cml4ICkge1xuXG5cdFx0XHR2YXIgcmVmZXJlbmNlUG9pbnQgPSB0aGlzLmNvcGxhbmFyUG9pbnQoIHYxICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHRcdFx0Ly8gdHJhbnNmb3JtIG5vcm1hbCBiYXNlZCBvbiB0aGVvcnkgaGVyZTpcblx0XHRcdC8vIGh0dHA6Ly93d3cuc29uZ2hvLmNhL29wZW5nbC9nbF9ub3JtYWx0cmFuc2Zvcm0uaHRtbFxuXHRcdFx0dmFyIG5vcm1hbE1hdHJpeCA9IG9wdGlvbmFsTm9ybWFsTWF0cml4IHx8IG0xLmdldE5vcm1hbE1hdHJpeCggbWF0cml4ICk7XG5cdFx0XHR2YXIgbm9ybWFsID0gdGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0Ly8gcmVjYWxjdWxhdGUgY29uc3RhbnQgKGxpa2UgaW4gc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQpXG5cdFx0XHR0aGlzLmNvbnN0YW50ID0gLSByZWZlcmVuY2VQb2ludC5kb3QoIG5vcm1hbCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmNvbnN0YW50ID0gdGhpcy5jb25zdGFudCAtIG9mZnNldC5kb3QoIHRoaXMubm9ybWFsICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdHJldHVybiBwbGFuZS5ub3JtYWwuZXF1YWxzKCB0aGlzLm5vcm1hbCApICYmICggcGxhbmUuY29uc3RhbnQgPT09IHRoaXMuY29uc3RhbnQgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBGcnVzdHVtKCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1ICkge1xuXG5cdHRoaXMucGxhbmVzID0gW1xuXG5cdFx0KCBwMCAhPT0gdW5kZWZpbmVkICkgPyBwMCA6IG5ldyBQbGFuZSgpLFxuXHRcdCggcDEgIT09IHVuZGVmaW5lZCApID8gcDEgOiBuZXcgUGxhbmUoKSxcblx0XHQoIHAyICE9PSB1bmRlZmluZWQgKSA/IHAyIDogbmV3IFBsYW5lKCksXG5cdFx0KCBwMyAhPT0gdW5kZWZpbmVkICkgPyBwMyA6IG5ldyBQbGFuZSgpLFxuXHRcdCggcDQgIT09IHVuZGVmaW5lZCApID8gcDQgOiBuZXcgUGxhbmUoKSxcblx0XHQoIHA1ICE9PSB1bmRlZmluZWQgKSA/IHA1IDogbmV3IFBsYW5lKClcblxuXHRdO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEZydXN0dW0ucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUgKSB7XG5cblx0XHR2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7XG5cblx0XHRwbGFuZXNbIDAgXS5jb3B5KCBwMCApO1xuXHRcdHBsYW5lc1sgMSBdLmNvcHkoIHAxICk7XG5cdFx0cGxhbmVzWyAyIF0uY29weSggcDIgKTtcblx0XHRwbGFuZXNbIDMgXS5jb3B5KCBwMyApO1xuXHRcdHBsYW5lc1sgNCBdLmNvcHkoIHA0ICk7XG5cdFx0cGxhbmVzWyA1IF0uY29weSggcDUgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggZnJ1c3R1bSApIHtcblxuXHRcdHZhciBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdHBsYW5lc1sgaSBdLmNvcHkoIGZydXN0dW0ucGxhbmVzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbU1hdHJpeDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXHRcdHZhciBtZSA9IG0uZWxlbWVudHM7XG5cdFx0dmFyIG1lMCA9IG1lWyAwIF0sIG1lMSA9IG1lWyAxIF0sIG1lMiA9IG1lWyAyIF0sIG1lMyA9IG1lWyAzIF07XG5cdFx0dmFyIG1lNCA9IG1lWyA0IF0sIG1lNSA9IG1lWyA1IF0sIG1lNiA9IG1lWyA2IF0sIG1lNyA9IG1lWyA3IF07XG5cdFx0dmFyIG1lOCA9IG1lWyA4IF0sIG1lOSA9IG1lWyA5IF0sIG1lMTAgPSBtZVsgMTAgXSwgbWUxMSA9IG1lWyAxMSBdO1xuXHRcdHZhciBtZTEyID0gbWVbIDEyIF0sIG1lMTMgPSBtZVsgMTMgXSwgbWUxNCA9IG1lWyAxNCBdLCBtZTE1ID0gbWVbIDE1IF07XG5cblx0XHRwbGFuZXNbIDAgXS5zZXRDb21wb25lbnRzKCBtZTMgLSBtZTAsIG1lNyAtIG1lNCwgbWUxMSAtIG1lOCwgbWUxNSAtIG1lMTIgKS5ub3JtYWxpemUoKTtcblx0XHRwbGFuZXNbIDEgXS5zZXRDb21wb25lbnRzKCBtZTMgKyBtZTAsIG1lNyArIG1lNCwgbWUxMSArIG1lOCwgbWUxNSArIG1lMTIgKS5ub3JtYWxpemUoKTtcblx0XHRwbGFuZXNbIDIgXS5zZXRDb21wb25lbnRzKCBtZTMgKyBtZTEsIG1lNyArIG1lNSwgbWUxMSArIG1lOSwgbWUxNSArIG1lMTMgKS5ub3JtYWxpemUoKTtcblx0XHRwbGFuZXNbIDMgXS5zZXRDb21wb25lbnRzKCBtZTMgLSBtZTEsIG1lNyAtIG1lNSwgbWUxMSAtIG1lOSwgbWUxNSAtIG1lMTMgKS5ub3JtYWxpemUoKTtcblx0XHRwbGFuZXNbIDQgXS5zZXRDb21wb25lbnRzKCBtZTMgLSBtZTIsIG1lNyAtIG1lNiwgbWUxMSAtIG1lMTAsIG1lMTUgLSBtZTE0ICkubm9ybWFsaXplKCk7XG5cdFx0cGxhbmVzWyA1IF0uc2V0Q29tcG9uZW50cyggbWUzICsgbWUyLCBtZTcgKyBtZTYsIG1lMTEgKyBtZTEwLCBtZTE1ICsgbWUxNCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzT2JqZWN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdHNPYmplY3QoIG9iamVjdCApIHtcblxuXHRcdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsIClcblx0XHRcdFx0Z2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRcdHNwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApXG5cdFx0XHRcdC5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdHNTcHJpdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0c1Nwcml0ZSggc3ByaXRlICkge1xuXG5cdFx0XHRzcGhlcmUuY2VudGVyLnNldCggMCwgMCwgMCApO1xuXHRcdFx0c3BoZXJlLnJhZGl1cyA9IDAuNzA3MTA2NzgxMTg2NTQ3Njtcblx0XHRcdHNwaGVyZS5hcHBseU1hdHJpeDQoIHNwcml0ZS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXHRcdHZhciBjZW50ZXIgPSBzcGhlcmUuY2VudGVyO1xuXHRcdHZhciBuZWdSYWRpdXMgPSAtIHNwaGVyZS5yYWRpdXM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHR2YXIgZGlzdGFuY2UgPSBwbGFuZXNbIGkgXS5kaXN0YW5jZVRvUG9pbnQoIGNlbnRlciApO1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgbmVnUmFkaXVzICkge1xuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzQm94OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcDEgPSBuZXcgVmVjdG9yMygpLFxuXHRcdFx0cDIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdHNCb3goIGJveCApIHtcblxuXHRcdFx0dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBwbGFuZSA9IHBsYW5lc1sgaSBdO1xuXG5cdFx0XHRcdHAxLnggPSBwbGFuZS5ub3JtYWwueCA+IDAgPyBib3gubWluLnggOiBib3gubWF4Lng7XG5cdFx0XHRcdHAyLnggPSBwbGFuZS5ub3JtYWwueCA+IDAgPyBib3gubWF4LnggOiBib3gubWluLng7XG5cdFx0XHRcdHAxLnkgPSBwbGFuZS5ub3JtYWwueSA+IDAgPyBib3gubWluLnkgOiBib3gubWF4Lnk7XG5cdFx0XHRcdHAyLnkgPSBwbGFuZS5ub3JtYWwueSA+IDAgPyBib3gubWF4LnkgOiBib3gubWluLnk7XG5cdFx0XHRcdHAxLnogPSBwbGFuZS5ub3JtYWwueiA+IDAgPyBib3gubWluLnogOiBib3gubWF4Lno7XG5cdFx0XHRcdHAyLnogPSBwbGFuZS5ub3JtYWwueiA+IDAgPyBib3gubWF4LnogOiBib3gubWluLno7XG5cblx0XHRcdFx0dmFyIGQxID0gcGxhbmUuZGlzdGFuY2VUb1BvaW50KCBwMSApO1xuXHRcdFx0XHR2YXIgZDIgPSBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHAyICk7XG5cblx0XHRcdFx0Ly8gaWYgYm90aCBvdXRzaWRlIHBsYW5lLCBubyBpbnRlcnNlY3Rpb25cblxuXHRcdFx0XHRpZiAoIGQxIDwgMCAmJiBkMiA8IDAgKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHZhciBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdGlmICggcGxhbmVzWyBpIF0uZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIDwgMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMU2hhZG93TWFwKCBfcmVuZGVyZXIsIF9saWdodHMsIF9vYmplY3RzLCBjYXBhYmlsaXRpZXMgKSB7XG5cblx0dmFyIF9nbCA9IF9yZW5kZXJlci5jb250ZXh0LFxuXHRcdF9zdGF0ZSA9IF9yZW5kZXJlci5zdGF0ZSxcblx0XHRfZnJ1c3R1bSA9IG5ldyBGcnVzdHVtKCksXG5cdFx0X3Byb2pTY3JlZW5NYXRyaXggPSBuZXcgTWF0cml4NCgpLFxuXG5cdFx0X2xpZ2h0U2hhZG93cyA9IF9saWdodHMuc2hhZG93cyxcblxuXHRcdF9zaGFkb3dNYXBTaXplID0gbmV3IFZlY3RvcjIoKSxcblx0XHRfbWF4U2hhZG93TWFwU2l6ZSA9IG5ldyBWZWN0b3IyKCBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZVNpemUsIGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlU2l6ZSApLFxuXG5cdFx0X2xvb2tUYXJnZXQgPSBuZXcgVmVjdG9yMygpLFxuXHRcdF9saWdodFBvc2l0aW9uV29ybGQgPSBuZXcgVmVjdG9yMygpLFxuXG5cdFx0X01vcnBoaW5nRmxhZyA9IDEsXG5cdFx0X1NraW5uaW5nRmxhZyA9IDIsXG5cblx0XHRfTnVtYmVyT2ZNYXRlcmlhbFZhcmlhbnRzID0gKCBfTW9ycGhpbmdGbGFnIHwgX1NraW5uaW5nRmxhZyApICsgMSxcblxuXHRcdF9kZXB0aE1hdGVyaWFscyA9IG5ldyBBcnJheSggX051bWJlck9mTWF0ZXJpYWxWYXJpYW50cyApLFxuXHRcdF9kaXN0YW5jZU1hdGVyaWFscyA9IG5ldyBBcnJheSggX051bWJlck9mTWF0ZXJpYWxWYXJpYW50cyApLFxuXG5cdFx0X21hdGVyaWFsQ2FjaGUgPSB7fTtcblxuXHR2YXIgY3ViZURpcmVjdGlvbnMgPSBbXG5cdFx0bmV3IFZlY3RvcjMoIDEsIDAsIDAgKSwgbmV3IFZlY3RvcjMoIC0gMSwgMCwgMCApLCBuZXcgVmVjdG9yMyggMCwgMCwgMSApLFxuXHRcdG5ldyBWZWN0b3IzKCAwLCAwLCAtIDEgKSwgbmV3IFZlY3RvcjMoIDAsIDEsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIC0gMSwgMCApXG5cdF07XG5cblx0dmFyIGN1YmVVcHMgPSBbXG5cdFx0bmV3IFZlY3RvcjMoIDAsIDEsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDEsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDEsIDAgKSxcblx0XHRuZXcgVmVjdG9yMyggMCwgMSwgMCApLCBuZXcgVmVjdG9yMyggMCwgMCwgMSApLFx0bmV3IFZlY3RvcjMoIDAsIDAsIC0gMSApXG5cdF07XG5cblx0dmFyIGN1YmUyRFZpZXdQb3J0cyA9IFtcblx0XHRuZXcgVmVjdG9yNCgpLCBuZXcgVmVjdG9yNCgpLCBuZXcgVmVjdG9yNCgpLFxuXHRcdG5ldyBWZWN0b3I0KCksIG5ldyBWZWN0b3I0KCksIG5ldyBWZWN0b3I0KClcblx0XTtcblxuXHQvLyBpbml0XG5cblx0dmFyIGRlcHRoTWF0ZXJpYWxUZW1wbGF0ZSA9IG5ldyBNZXNoRGVwdGhNYXRlcmlhbCgpO1xuXHRkZXB0aE1hdGVyaWFsVGVtcGxhdGUuZGVwdGhQYWNraW5nID0gUkdCQURlcHRoUGFja2luZztcblx0ZGVwdGhNYXRlcmlhbFRlbXBsYXRlLmNsaXBwaW5nID0gdHJ1ZTtcblxuXHR2YXIgZGlzdGFuY2VTaGFkZXIgPSBTaGFkZXJMaWJbIFwiZGlzdGFuY2VSR0JBXCIgXTtcblx0dmFyIGRpc3RhbmNlVW5pZm9ybXMgPSBVbmlmb3Jtc1V0aWxzLmNsb25lKCBkaXN0YW5jZVNoYWRlci51bmlmb3JtcyApO1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSAhPT0gX051bWJlck9mTWF0ZXJpYWxWYXJpYW50czsgKysgaSApIHtcblxuXHRcdHZhciB1c2VNb3JwaGluZyA9ICggaSAmIF9Nb3JwaGluZ0ZsYWcgKSAhPT0gMDtcblx0XHR2YXIgdXNlU2tpbm5pbmcgPSAoIGkgJiBfU2tpbm5pbmdGbGFnICkgIT09IDA7XG5cblx0XHR2YXIgZGVwdGhNYXRlcmlhbCA9IGRlcHRoTWF0ZXJpYWxUZW1wbGF0ZS5jbG9uZSgpO1xuXHRcdGRlcHRoTWF0ZXJpYWwubW9ycGhUYXJnZXRzID0gdXNlTW9ycGhpbmc7XG5cdFx0ZGVwdGhNYXRlcmlhbC5za2lubmluZyA9IHVzZVNraW5uaW5nO1xuXG5cdFx0X2RlcHRoTWF0ZXJpYWxzWyBpIF0gPSBkZXB0aE1hdGVyaWFsO1xuXG5cdFx0dmFyIGRpc3RhbmNlTWF0ZXJpYWwgPSBuZXcgU2hhZGVyTWF0ZXJpYWwoIHtcblx0XHRcdGRlZmluZXM6IHtcblx0XHRcdFx0J1VTRV9TSEFET1dNQVAnOiAnJ1xuXHRcdFx0fSxcblx0XHRcdHVuaWZvcm1zOiBkaXN0YW5jZVVuaWZvcm1zLFxuXHRcdFx0dmVydGV4U2hhZGVyOiBkaXN0YW5jZVNoYWRlci52ZXJ0ZXhTaGFkZXIsXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZGlzdGFuY2VTaGFkZXIuZnJhZ21lbnRTaGFkZXIsXG5cdFx0XHRtb3JwaFRhcmdldHM6IHVzZU1vcnBoaW5nLFxuXHRcdFx0c2tpbm5pbmc6IHVzZVNraW5uaW5nLFxuXHRcdFx0Y2xpcHBpbmc6IHRydWVcblx0XHR9ICk7XG5cblx0XHRfZGlzdGFuY2VNYXRlcmlhbHNbIGkgXSA9IGRpc3RhbmNlTWF0ZXJpYWw7XG5cblx0fVxuXG5cdC8vXG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHR0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblxuXHR0aGlzLmF1dG9VcGRhdGUgPSB0cnVlO1xuXHR0aGlzLm5lZWRzVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy50eXBlID0gUENGU2hhZG93TWFwO1xuXG5cdHRoaXMucmVuZGVyUmV2ZXJzZVNpZGVkID0gdHJ1ZTtcblx0dGhpcy5yZW5kZXJTaW5nbGVTaWRlZCA9IHRydWU7XG5cblx0dGhpcy5yZW5kZXIgPSBmdW5jdGlvbiAoIHNjZW5lLCBjYW1lcmEgKSB7XG5cblx0XHRpZiAoIHNjb3BlLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuO1xuXHRcdGlmICggc2NvcGUuYXV0b1VwZGF0ZSA9PT0gZmFsc2UgJiYgc2NvcGUubmVlZHNVcGRhdGUgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0aWYgKCBfbGlnaHRTaGFkb3dzLmxlbmd0aCA9PT0gMCApIHJldHVybjtcblxuXHRcdC8vIFNldCBHTCBzdGF0ZSBmb3IgZGVwdGggbWFwLlxuXHRcdF9zdGF0ZS5kaXNhYmxlKCBfZ2wuQkxFTkQgKTtcblx0XHRfc3RhdGUuYnVmZmVycy5jb2xvci5zZXRDbGVhciggMSwgMSwgMSwgMSApO1xuXHRcdF9zdGF0ZS5idWZmZXJzLmRlcHRoLnNldFRlc3QoIHRydWUgKTtcblx0XHRfc3RhdGUuc2V0U2Npc3NvclRlc3QoIGZhbHNlICk7XG5cblx0XHQvLyByZW5kZXIgZGVwdGggbWFwXG5cblx0XHR2YXIgZmFjZUNvdW50LCBpc1BvaW50TGlnaHQ7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gX2xpZ2h0U2hhZG93cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGxpZ2h0ID0gX2xpZ2h0U2hhZG93c1sgaSBdO1xuXHRcdFx0dmFyIHNoYWRvdyA9IGxpZ2h0LnNoYWRvdztcblxuXHRcdFx0aWYgKCBzaGFkb3cgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFNoYWRvd01hcDonLCBsaWdodCwgJ2hhcyBubyBzaGFkb3cuJyApO1xuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgc2hhZG93Q2FtZXJhID0gc2hhZG93LmNhbWVyYTtcblx0XHRcdHZhciBzaGFkb3dNYXRyaXggPSBzaGFkb3cubWF0cml4O1xuXG5cdFx0XHRfbGlnaHRQb3NpdGlvbldvcmxkLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdHNoYWRvd0NhbWVyYS5wb3NpdGlvbi5jb3B5KCBfbGlnaHRQb3NpdGlvbldvcmxkICk7XG5cblx0XHRcdF9zaGFkb3dNYXBTaXplLmNvcHkoIHNoYWRvdy5tYXBTaXplICk7XG5cdFx0XHRfc2hhZG93TWFwU2l6ZS5taW4oIF9tYXhTaGFkb3dNYXBTaXplICk7XG5cblx0XHRcdGlmICggbGlnaHQgJiYgbGlnaHQuaXNQb2ludExpZ2h0ICkge1xuXG5cdFx0XHRcdGZhY2VDb3VudCA9IDY7XG5cdFx0XHRcdGlzUG9pbnRMaWdodCA9IHRydWU7XG5cblx0XHRcdFx0dmFyIHZwV2lkdGggPSBfc2hhZG93TWFwU2l6ZS54O1xuXHRcdFx0XHR2YXIgdnBIZWlnaHQgPSBfc2hhZG93TWFwU2l6ZS55O1xuXG5cdFx0XHRcdC8vIFRoZXNlIHZpZXdwb3J0cyBtYXAgYSBjdWJlLW1hcCBvbnRvIGEgMkQgdGV4dHVyZSB3aXRoIHRoZVxuXHRcdFx0XHQvLyBmb2xsb3dpbmcgb3JpZW50YXRpb246XG5cdFx0XHRcdC8vXG5cdFx0XHRcdC8vICB4elhaXG5cdFx0XHRcdC8vICAgeSBZXG5cdFx0XHRcdC8vXG5cdFx0XHRcdC8vIFggLSBQb3NpdGl2ZSB4IGRpcmVjdGlvblxuXHRcdFx0XHQvLyB4IC0gTmVnYXRpdmUgeCBkaXJlY3Rpb25cblx0XHRcdFx0Ly8gWSAtIFBvc2l0aXZlIHkgZGlyZWN0aW9uXG5cdFx0XHRcdC8vIHkgLSBOZWdhdGl2ZSB5IGRpcmVjdGlvblxuXHRcdFx0XHQvLyBaIC0gUG9zaXRpdmUgeiBkaXJlY3Rpb25cblx0XHRcdFx0Ly8geiAtIE5lZ2F0aXZlIHogZGlyZWN0aW9uXG5cblx0XHRcdFx0Ly8gcG9zaXRpdmUgWFxuXHRcdFx0XHRjdWJlMkRWaWV3UG9ydHNbIDAgXS5zZXQoIHZwV2lkdGggKiAyLCB2cEhlaWdodCwgdnBXaWR0aCwgdnBIZWlnaHQgKTtcblx0XHRcdFx0Ly8gbmVnYXRpdmUgWFxuXHRcdFx0XHRjdWJlMkRWaWV3UG9ydHNbIDEgXS5zZXQoIDAsIHZwSGVpZ2h0LCB2cFdpZHRoLCB2cEhlaWdodCApO1xuXHRcdFx0XHQvLyBwb3NpdGl2ZSBaXG5cdFx0XHRcdGN1YmUyRFZpZXdQb3J0c1sgMiBdLnNldCggdnBXaWR0aCAqIDMsIHZwSGVpZ2h0LCB2cFdpZHRoLCB2cEhlaWdodCApO1xuXHRcdFx0XHQvLyBuZWdhdGl2ZSBaXG5cdFx0XHRcdGN1YmUyRFZpZXdQb3J0c1sgMyBdLnNldCggdnBXaWR0aCwgdnBIZWlnaHQsIHZwV2lkdGgsIHZwSGVpZ2h0ICk7XG5cdFx0XHRcdC8vIHBvc2l0aXZlIFlcblx0XHRcdFx0Y3ViZTJEVmlld1BvcnRzWyA0IF0uc2V0KCB2cFdpZHRoICogMywgMCwgdnBXaWR0aCwgdnBIZWlnaHQgKTtcblx0XHRcdFx0Ly8gbmVnYXRpdmUgWVxuXHRcdFx0XHRjdWJlMkRWaWV3UG9ydHNbIDUgXS5zZXQoIHZwV2lkdGgsIDAsIHZwV2lkdGgsIHZwSGVpZ2h0ICk7XG5cblx0XHRcdFx0X3NoYWRvd01hcFNpemUueCAqPSA0LjA7XG5cdFx0XHRcdF9zaGFkb3dNYXBTaXplLnkgKj0gMi4wO1xuXG5cblx0XHRcdFx0Ly8gZm9yIHBvaW50IGxpZ2h0cyB3ZSBzZXQgdGhlIHNoYWRvdyBtYXRyaXggdG8gYmUgYSB0cmFuc2xhdGlvbi1vbmx5IG1hdHJpeFxuXHRcdFx0XHQvLyBlcXVhbCB0byBpbnZlcnNlIG9mIHRoZSBsaWdodCdzIHBvc2l0aW9uXG5cblx0XHRcdFx0c2hhZG93TWF0cml4Lm1ha2VUcmFuc2xhdGlvbiggLSBfbGlnaHRQb3NpdGlvbldvcmxkLngsIC0gX2xpZ2h0UG9zaXRpb25Xb3JsZC55LCAtIF9saWdodFBvc2l0aW9uV29ybGQueiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZhY2VDb3VudCA9IDE7XG5cdFx0XHRcdGlzUG9pbnRMaWdodCA9IGZhbHNlO1xuXG5cdFx0XHRcdF9sb29rVGFyZ2V0LnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHNoYWRvd0NhbWVyYS5sb29rQXQoIF9sb29rVGFyZ2V0ICk7XG5cdFx0XHRcdHNoYWRvd0NhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXHRcdFx0XHRzaGFkb3dDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLmdldEludmVyc2UoIHNoYWRvd0NhbWVyYS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdC8vIGNvbXB1dGUgc2hhZG93IG1hdHJpeFxuXG5cdFx0XHRcdHNoYWRvd01hdHJpeC5zZXQoXG5cdFx0XHRcdFx0MC41LCAwLjAsIDAuMCwgMC41LFxuXHRcdFx0XHRcdDAuMCwgMC41LCAwLjAsIDAuNSxcblx0XHRcdFx0XHQwLjAsIDAuMCwgMC41LCAwLjUsXG5cdFx0XHRcdFx0MC4wLCAwLjAsIDAuMCwgMS4wXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0c2hhZG93TWF0cml4Lm11bHRpcGx5KCBzaGFkb3dDYW1lcmEucHJvamVjdGlvbk1hdHJpeCApO1xuXHRcdFx0XHRzaGFkb3dNYXRyaXgubXVsdGlwbHkoIHNoYWRvd0NhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNoYWRvdy5tYXAgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0dmFyIHBhcnMgPSB7IG1pbkZpbHRlcjogTmVhcmVzdEZpbHRlciwgbWFnRmlsdGVyOiBOZWFyZXN0RmlsdGVyLCBmb3JtYXQ6IFJHQkFGb3JtYXQgfTtcblxuXHRcdFx0XHRzaGFkb3cubWFwID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KCBfc2hhZG93TWFwU2l6ZS54LCBfc2hhZG93TWFwU2l6ZS55LCBwYXJzICk7XG5cdFx0XHRcdHNoYWRvdy5tYXAudGV4dHVyZS5uYW1lID0gbGlnaHQubmFtZSArIFwiLnNoYWRvd01hcFwiO1xuXG5cdFx0XHRcdHNoYWRvd0NhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBzaGFkb3cuaXNTcG90TGlnaHRTaGFkb3cgKSB7XG5cblx0XHRcdFx0c2hhZG93LnVwZGF0ZSggbGlnaHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgc2hhZG93TWFwID0gc2hhZG93Lm1hcDtcblxuXHRcdFx0X3JlbmRlcmVyLnNldFJlbmRlclRhcmdldCggc2hhZG93TWFwICk7XG5cdFx0XHRfcmVuZGVyZXIuY2xlYXIoKTtcblxuXHRcdFx0Ly8gcmVuZGVyIHNoYWRvdyBtYXAgZm9yIGVhY2ggY3ViZSBmYWNlIChpZiBvbW5pLWRpcmVjdGlvbmFsKSBvclxuXHRcdFx0Ly8gcnVuIGEgc2luZ2xlIHBhc3MgaWYgbm90XG5cblx0XHRcdGZvciAoIHZhciBmYWNlID0gMDsgZmFjZSA8IGZhY2VDb3VudDsgZmFjZSArKyApIHtcblxuXHRcdFx0XHRpZiAoIGlzUG9pbnRMaWdodCApIHtcblxuXHRcdFx0XHRcdF9sb29rVGFyZ2V0LmNvcHkoIHNoYWRvd0NhbWVyYS5wb3NpdGlvbiApO1xuXHRcdFx0XHRcdF9sb29rVGFyZ2V0LmFkZCggY3ViZURpcmVjdGlvbnNbIGZhY2UgXSApO1xuXHRcdFx0XHRcdHNoYWRvd0NhbWVyYS51cC5jb3B5KCBjdWJlVXBzWyBmYWNlIF0gKTtcblx0XHRcdFx0XHRzaGFkb3dDYW1lcmEubG9va0F0KCBfbG9va1RhcmdldCApO1xuXHRcdFx0XHRcdHNoYWRvd0NhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXHRcdFx0XHRcdHNoYWRvd0NhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSggc2hhZG93Q2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0XHR2YXIgdnBEaW1lbnNpb25zID0gY3ViZTJEVmlld1BvcnRzWyBmYWNlIF07XG5cdFx0XHRcdFx0X3N0YXRlLnZpZXdwb3J0KCB2cERpbWVuc2lvbnMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gdXBkYXRlIGNhbWVyYSBtYXRyaWNlcyBhbmQgZnJ1c3R1bVxuXG5cdFx0XHRcdF9wcm9qU2NyZWVuTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIHNoYWRvd0NhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBzaGFkb3dDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XG5cdFx0XHRcdF9mcnVzdHVtLnNldEZyb21NYXRyaXgoIF9wcm9qU2NyZWVuTWF0cml4ICk7XG5cblx0XHRcdFx0Ly8gc2V0IG9iamVjdCBtYXRyaWNlcyAmIGZydXN0dW0gY3VsbGluZ1xuXG5cdFx0XHRcdHJlbmRlck9iamVjdCggc2NlbmUsIGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBpc1BvaW50TGlnaHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gUmVzdG9yZSBHTCBzdGF0ZS5cblx0XHR2YXIgY2xlYXJDb2xvciA9IF9yZW5kZXJlci5nZXRDbGVhckNvbG9yKCk7XG5cdFx0dmFyIGNsZWFyQWxwaGEgPSBfcmVuZGVyZXIuZ2V0Q2xlYXJBbHBoYSgpO1xuXHRcdF9yZW5kZXJlci5zZXRDbGVhckNvbG9yKCBjbGVhckNvbG9yLCBjbGVhckFscGhhICk7XG5cblx0XHRzY29wZS5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdH07XG5cblx0ZnVuY3Rpb24gZ2V0RGVwdGhNYXRlcmlhbCggb2JqZWN0LCBtYXRlcmlhbCwgaXNQb2ludExpZ2h0LCBsaWdodFBvc2l0aW9uV29ybGQgKSB7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XG5cblx0XHR2YXIgcmVzdWx0ID0gbnVsbDtcblxuXHRcdHZhciBtYXRlcmlhbFZhcmlhbnRzID0gX2RlcHRoTWF0ZXJpYWxzO1xuXHRcdHZhciBjdXN0b21NYXRlcmlhbCA9IG9iamVjdC5jdXN0b21EZXB0aE1hdGVyaWFsO1xuXG5cdFx0aWYgKCBpc1BvaW50TGlnaHQgKSB7XG5cblx0XHRcdG1hdGVyaWFsVmFyaWFudHMgPSBfZGlzdGFuY2VNYXRlcmlhbHM7XG5cdFx0XHRjdXN0b21NYXRlcmlhbCA9IG9iamVjdC5jdXN0b21EaXN0YW5jZU1hdGVyaWFsO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCAhIGN1c3RvbU1hdGVyaWFsICkge1xuXG5cdFx0XHR2YXIgdXNlTW9ycGhpbmcgPSBmYWxzZTtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5tb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdFx0aWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRcdFx0dXNlTW9ycGhpbmcgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMgJiYgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uICYmIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbi5sZW5ndGggPiAwO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0XHR1c2VNb3JwaGluZyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cyAmJiBnZW9tZXRyeS5tb3JwaFRhcmdldHMubGVuZ3RoID4gMDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBvYmplY3QuaXNTa2lubmVkTWVzaCAmJiBtYXRlcmlhbC5za2lubmluZyA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xTaGFkb3dNYXA6IFRIUkVFLlNraW5uZWRNZXNoIHdpdGggbWF0ZXJpYWwuc2tpbm5pbmcgc2V0IHRvIGZhbHNlOicsIG9iamVjdCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciB1c2VTa2lubmluZyA9IG9iamVjdC5pc1NraW5uZWRNZXNoICYmIG1hdGVyaWFsLnNraW5uaW5nO1xuXG5cdFx0XHR2YXIgdmFyaWFudEluZGV4ID0gMDtcblxuXHRcdFx0aWYgKCB1c2VNb3JwaGluZyApIHZhcmlhbnRJbmRleCB8PSBfTW9ycGhpbmdGbGFnO1xuXHRcdFx0aWYgKCB1c2VTa2lubmluZyApIHZhcmlhbnRJbmRleCB8PSBfU2tpbm5pbmdGbGFnO1xuXG5cdFx0XHRyZXN1bHQgPSBtYXRlcmlhbFZhcmlhbnRzWyB2YXJpYW50SW5kZXggXTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJlc3VsdCA9IGN1c3RvbU1hdGVyaWFsO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBfcmVuZGVyZXIubG9jYWxDbGlwcGluZ0VuYWJsZWQgJiZcblx0XHRcdFx0bWF0ZXJpYWwuY2xpcFNoYWRvd3MgPT09IHRydWUgJiZcblx0XHRcdFx0bWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXMubGVuZ3RoICE9PSAwICkge1xuXG5cdFx0XHQvLyBpbiB0aGlzIGNhc2Ugd2UgbmVlZCBhIHVuaXF1ZSBtYXRlcmlhbCBpbnN0YW5jZSByZWZsZWN0aW5nIHRoZVxuXHRcdFx0Ly8gYXBwcm9wcmlhdGUgc3RhdGVcblxuXHRcdFx0dmFyIGtleUEgPSByZXN1bHQudXVpZCwga2V5QiA9IG1hdGVyaWFsLnV1aWQ7XG5cblx0XHRcdHZhciBtYXRlcmlhbHNGb3JWYXJpYW50ID0gX21hdGVyaWFsQ2FjaGVbIGtleUEgXTtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbHNGb3JWYXJpYW50ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWxzRm9yVmFyaWFudCA9IHt9O1xuXHRcdFx0XHRfbWF0ZXJpYWxDYWNoZVsga2V5QSBdID0gbWF0ZXJpYWxzRm9yVmFyaWFudDtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgY2FjaGVkTWF0ZXJpYWwgPSBtYXRlcmlhbHNGb3JWYXJpYW50WyBrZXlCIF07XG5cblx0XHRcdGlmICggY2FjaGVkTWF0ZXJpYWwgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjYWNoZWRNYXRlcmlhbCA9IHJlc3VsdC5jbG9uZSgpO1xuXHRcdFx0XHRtYXRlcmlhbHNGb3JWYXJpYW50WyBrZXlCIF0gPSBjYWNoZWRNYXRlcmlhbDtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXN1bHQgPSBjYWNoZWRNYXRlcmlhbDtcblxuXHRcdH1cblxuXHRcdHJlc3VsdC52aXNpYmxlID0gbWF0ZXJpYWwudmlzaWJsZTtcblx0XHRyZXN1bHQud2lyZWZyYW1lID0gbWF0ZXJpYWwud2lyZWZyYW1lO1xuXG5cdFx0dmFyIHNpZGUgPSBtYXRlcmlhbC5zaWRlO1xuXG5cdFx0aWYgKCBzY29wZS5yZW5kZXJTaW5nbGVTaWRlZCAmJiBzaWRlID09IERvdWJsZVNpZGUgKSB7XG5cblx0XHRcdHNpZGUgPSBGcm9udFNpZGU7XG5cblx0XHR9XG5cblx0XHRpZiAoIHNjb3BlLnJlbmRlclJldmVyc2VTaWRlZCApIHtcblxuXHRcdFx0aWYgKCBzaWRlID09PSBGcm9udFNpZGUgKSBzaWRlID0gQmFja1NpZGU7XG5cdFx0XHRlbHNlIGlmICggc2lkZSA9PT0gQmFja1NpZGUgKSBzaWRlID0gRnJvbnRTaWRlO1xuXG5cdFx0fVxuXG5cdFx0cmVzdWx0LnNpZGUgPSBzaWRlO1xuXG5cdFx0cmVzdWx0LmNsaXBTaGFkb3dzID0gbWF0ZXJpYWwuY2xpcFNoYWRvd3M7XG5cdFx0cmVzdWx0LmNsaXBwaW5nUGxhbmVzID0gbWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXM7XG5cblx0XHRyZXN1bHQud2lyZWZyYW1lTGluZXdpZHRoID0gbWF0ZXJpYWwud2lyZWZyYW1lTGluZXdpZHRoO1xuXHRcdHJlc3VsdC5saW5ld2lkdGggPSBtYXRlcmlhbC5saW5ld2lkdGg7XG5cblx0XHRpZiAoIGlzUG9pbnRMaWdodCAmJiByZXN1bHQudW5pZm9ybXMubGlnaHRQb3MgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmVzdWx0LnVuaWZvcm1zLmxpZ2h0UG9zLnZhbHVlLmNvcHkoIGxpZ2h0UG9zaXRpb25Xb3JsZCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVyT2JqZWN0KCBvYmplY3QsIGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBpc1BvaW50TGlnaHQgKSB7XG5cblx0XHRpZiAoIG9iamVjdC52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdHZhciB2aXNpYmxlID0gb2JqZWN0LmxheWVycy50ZXN0KCBjYW1lcmEubGF5ZXJzICk7XG5cblx0XHRpZiAoIHZpc2libGUgJiYgKCBvYmplY3QuaXNNZXNoIHx8IG9iamVjdC5pc0xpbmUgfHwgb2JqZWN0LmlzUG9pbnRzICkgKSB7XG5cblx0XHRcdGlmICggb2JqZWN0LmNhc3RTaGFkb3cgJiYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVkIHx8IF9mcnVzdHVtLmludGVyc2VjdHNPYmplY3QoIG9iamVjdCApICkgKSB7XG5cblx0XHRcdFx0b2JqZWN0Lm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBzaGFkb3dDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLCBvYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR2YXIgZ2VvbWV0cnkgPSBfb2JqZWN0cy51cGRhdGUoIG9iamVjdCApO1xuXHRcdFx0XHR2YXIgbWF0ZXJpYWwgPSBvYmplY3QubWF0ZXJpYWw7XG5cblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApICkge1xuXG5cdFx0XHRcdFx0dmFyIGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcblxuXHRcdFx0XHRcdGZvciAoIHZhciBrID0gMCwga2wgPSBncm91cHMubGVuZ3RoOyBrIDwga2w7IGsgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgayBdO1xuXHRcdFx0XHRcdFx0dmFyIGdyb3VwTWF0ZXJpYWwgPSBtYXRlcmlhbFsgZ3JvdXAubWF0ZXJpYWxJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGdyb3VwTWF0ZXJpYWwgJiYgZ3JvdXBNYXRlcmlhbC52aXNpYmxlICkge1xuXG5cdFx0XHRcdFx0XHRcdHZhciBkZXB0aE1hdGVyaWFsID0gZ2V0RGVwdGhNYXRlcmlhbCggb2JqZWN0LCBncm91cE1hdGVyaWFsLCBpc1BvaW50TGlnaHQsIF9saWdodFBvc2l0aW9uV29ybGQgKTtcblx0XHRcdFx0XHRcdFx0X3JlbmRlcmVyLnJlbmRlckJ1ZmZlckRpcmVjdCggc2hhZG93Q2FtZXJhLCBudWxsLCBnZW9tZXRyeSwgZGVwdGhNYXRlcmlhbCwgb2JqZWN0LCBncm91cCApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwudmlzaWJsZSApIHtcblxuXHRcdFx0XHRcdHZhciBkZXB0aE1hdGVyaWFsID0gZ2V0RGVwdGhNYXRlcmlhbCggb2JqZWN0LCBtYXRlcmlhbCwgaXNQb2ludExpZ2h0LCBfbGlnaHRQb3NpdGlvbldvcmxkICk7XG5cdFx0XHRcdFx0X3JlbmRlcmVyLnJlbmRlckJ1ZmZlckRpcmVjdCggc2hhZG93Q2FtZXJhLCBudWxsLCBnZW9tZXRyeSwgZGVwdGhNYXRlcmlhbCwgb2JqZWN0LCBudWxsICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRyZW5kZXJPYmplY3QoIGNoaWxkcmVuWyBpIF0sIGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBpc1BvaW50TGlnaHQgKTtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuZnVuY3Rpb24gUmF5KCBvcmlnaW4sIGRpcmVjdGlvbiApIHtcblxuXHR0aGlzLm9yaWdpbiA9ICggb3JpZ2luICE9PSB1bmRlZmluZWQgKSA/IG9yaWdpbiA6IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMuZGlyZWN0aW9uID0gKCBkaXJlY3Rpb24gIT09IHVuZGVmaW5lZCApID8gZGlyZWN0aW9uIDogbmV3IFZlY3RvcjMoKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBSYXkucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIG9yaWdpbiwgZGlyZWN0aW9uICkge1xuXG5cdFx0dGhpcy5vcmlnaW4uY29weSggb3JpZ2luICk7XG5cdFx0dGhpcy5kaXJlY3Rpb24uY29weSggZGlyZWN0aW9uICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHJheSApIHtcblxuXHRcdHRoaXMub3JpZ2luLmNvcHkoIHJheS5vcmlnaW4gKTtcblx0XHR0aGlzLmRpcmVjdGlvbi5jb3B5KCByYXkuZGlyZWN0aW9uICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGF0OiBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gcmVzdWx0LmNvcHkoIHRoaXMuZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMub3JpZ2luICk7XG5cblx0fSxcblxuXHRsb29rQXQ6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMuZGlyZWN0aW9uLmNvcHkoIHYgKS5zdWIoIHRoaXMub3JpZ2luICkubm9ybWFsaXplKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJlY2FzdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByZWNhc3QoIHQgKSB7XG5cblx0XHRcdHRoaXMub3JpZ2luLmNvcHkoIHRoaXMuYXQoIHQsIHYxICkgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbG9zZXN0UG9pbnRUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXHRcdHJlc3VsdC5zdWJWZWN0b3JzKCBwb2ludCwgdGhpcy5vcmlnaW4gKTtcblx0XHR2YXIgZGlyZWN0aW9uRGlzdGFuY2UgPSByZXN1bHQuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXG5cdFx0aWYgKCBkaXJlY3Rpb25EaXN0YW5jZSA8IDAgKSB7XG5cblx0XHRcdHJldHVybiByZXN1bHQuY29weSggdGhpcy5vcmlnaW4gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggZGlyZWN0aW9uRGlzdGFuY2UgKS5hZGQoIHRoaXMub3JpZ2luICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLmRpc3RhbmNlU3FUb1BvaW50KCBwb2ludCApICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVNxVG9Qb2ludDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBkaXN0YW5jZVNxVG9Qb2ludCggcG9pbnQgKSB7XG5cblx0XHRcdHZhciBkaXJlY3Rpb25EaXN0YW5jZSA9IHYxLnN1YlZlY3RvcnMoIHBvaW50LCB0aGlzLm9yaWdpbiApLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblxuXHRcdFx0Ly8gcG9pbnQgYmVoaW5kIHRoZSByYXlcblxuXHRcdFx0aWYgKCBkaXJlY3Rpb25EaXN0YW5jZSA8IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXMub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHYxLmNvcHkoIHRoaXMuZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIGRpcmVjdGlvbkRpc3RhbmNlICkuYWRkKCB0aGlzLm9yaWdpbiApO1xuXG5cdFx0XHRyZXR1cm4gdjEuZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRkaXN0YW5jZVNxVG9TZWdtZW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc2VnQ2VudGVyID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgc2VnRGlyID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgZGlmZiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZGlzdGFuY2VTcVRvU2VnbWVudCggdjAsIHYxLCBvcHRpb25hbFBvaW50T25SYXksIG9wdGlvbmFsUG9pbnRPblNlZ21lbnQgKSB7XG5cblx0XHRcdC8vIGZyb20gaHR0cDovL3d3dy5nZW9tZXRyaWN0b29scy5jb20vR1RFbmdpbmUvSW5jbHVkZS9NYXRoZW1hdGljcy9HdGVEaXN0UmF5U2VnbWVudC5oXG5cdFx0XHQvLyBJdCByZXR1cm5zIHRoZSBtaW4gZGlzdGFuY2UgYmV0d2VlbiB0aGUgcmF5IGFuZCB0aGUgc2VnbWVudFxuXHRcdFx0Ly8gZGVmaW5lZCBieSB2MCBhbmQgdjFcblx0XHRcdC8vIEl0IGNhbiBhbHNvIHNldCB0d28gb3B0aW9uYWwgdGFyZ2V0cyA6XG5cdFx0XHQvLyAtIFRoZSBjbG9zZXN0IHBvaW50IG9uIHRoZSByYXlcblx0XHRcdC8vIC0gVGhlIGNsb3Nlc3QgcG9pbnQgb24gdGhlIHNlZ21lbnRcblxuXHRcdFx0c2VnQ2VudGVyLmNvcHkoIHYwICkuYWRkKCB2MSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblx0XHRcdHNlZ0Rpci5jb3B5KCB2MSApLnN1YiggdjAgKS5ub3JtYWxpemUoKTtcblx0XHRcdGRpZmYuY29weSggdGhpcy5vcmlnaW4gKS5zdWIoIHNlZ0NlbnRlciApO1xuXG5cdFx0XHR2YXIgc2VnRXh0ZW50ID0gdjAuZGlzdGFuY2VUbyggdjEgKSAqIDAuNTtcblx0XHRcdHZhciBhMDEgPSAtIHRoaXMuZGlyZWN0aW9uLmRvdCggc2VnRGlyICk7XG5cdFx0XHR2YXIgYjAgPSBkaWZmLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblx0XHRcdHZhciBiMSA9IC0gZGlmZi5kb3QoIHNlZ0RpciApO1xuXHRcdFx0dmFyIGMgPSBkaWZmLmxlbmd0aFNxKCk7XG5cdFx0XHR2YXIgZGV0ID0gTWF0aC5hYnMoIDEgLSBhMDEgKiBhMDEgKTtcblx0XHRcdHZhciBzMCwgczEsIHNxckRpc3QsIGV4dERldDtcblxuXHRcdFx0aWYgKCBkZXQgPiAwICkge1xuXG5cdFx0XHRcdC8vIFRoZSByYXkgYW5kIHNlZ21lbnQgYXJlIG5vdCBwYXJhbGxlbC5cblxuXHRcdFx0XHRzMCA9IGEwMSAqIGIxIC0gYjA7XG5cdFx0XHRcdHMxID0gYTAxICogYjAgLSBiMTtcblx0XHRcdFx0ZXh0RGV0ID0gc2VnRXh0ZW50ICogZGV0O1xuXG5cdFx0XHRcdGlmICggczAgPj0gMCApIHtcblxuXHRcdFx0XHRcdGlmICggczEgPj0gLSBleHREZXQgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggczEgPD0gZXh0RGV0ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIHJlZ2lvbiAwXG5cdFx0XHRcdFx0XHRcdC8vIE1pbmltdW0gYXQgaW50ZXJpb3IgcG9pbnRzIG9mIHJheSBhbmQgc2VnbWVudC5cblxuXHRcdFx0XHRcdFx0XHR2YXIgaW52RGV0ID0gMSAvIGRldDtcblx0XHRcdFx0XHRcdFx0czAgKj0gaW52RGV0O1xuXHRcdFx0XHRcdFx0XHRzMSAqPSBpbnZEZXQ7XG5cdFx0XHRcdFx0XHRcdHNxckRpc3QgPSBzMCAqICggczAgKyBhMDEgKiBzMSArIDIgKiBiMCApICsgczEgKiAoIGEwMSAqIHMwICsgczEgKyAyICogYjEgKSArIGM7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDFcblxuXHRcdFx0XHRcdFx0XHRzMSA9IHNlZ0V4dGVudDtcblx0XHRcdFx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHMxICsgYjAgKSApO1xuXHRcdFx0XHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHQvLyByZWdpb24gNVxuXG5cdFx0XHRcdFx0XHRzMSA9IC0gc2VnRXh0ZW50O1xuXHRcdFx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHMxICsgYjAgKSApO1xuXHRcdFx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aWYgKCBzMSA8PSAtIGV4dERldCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDRcblxuXHRcdFx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIC0gYTAxICogc2VnRXh0ZW50ICsgYjAgKSApO1xuXHRcdFx0XHRcdFx0czEgPSAoIHMwID4gMCApID8gLSBzZWdFeHRlbnQgOiBNYXRoLm1pbiggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApO1xuXHRcdFx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIHMxIDw9IGV4dERldCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDNcblxuXHRcdFx0XHRcdFx0czAgPSAwO1xuXHRcdFx0XHRcdFx0czEgPSBNYXRoLm1pbiggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApO1xuXHRcdFx0XHRcdFx0c3FyRGlzdCA9IHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdC8vIHJlZ2lvbiAyXG5cblx0XHRcdFx0XHRcdHMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzZWdFeHRlbnQgKyBiMCApICk7XG5cdFx0XHRcdFx0XHRzMSA9ICggczAgPiAwICkgPyBzZWdFeHRlbnQgOiBNYXRoLm1pbiggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApO1xuXHRcdFx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gUmF5IGFuZCBzZWdtZW50IGFyZSBwYXJhbGxlbC5cblxuXHRcdFx0XHRzMSA9ICggYTAxID4gMCApID8gLSBzZWdFeHRlbnQgOiBzZWdFeHRlbnQ7XG5cdFx0XHRcdHMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzMSArIGIwICkgKTtcblx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG9wdGlvbmFsUG9pbnRPblJheSApIHtcblxuXHRcdFx0XHRvcHRpb25hbFBvaW50T25SYXkuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggczAgKS5hZGQoIHRoaXMub3JpZ2luICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBvcHRpb25hbFBvaW50T25TZWdtZW50ICkge1xuXG5cdFx0XHRcdG9wdGlvbmFsUG9pbnRPblNlZ21lbnQuY29weSggc2VnRGlyICkubXVsdGlwbHlTY2FsYXIoIHMxICkuYWRkKCBzZWdDZW50ZXIgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gc3FyRGlzdDtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdFNwaGVyZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RTcGhlcmUoIHNwaGVyZSwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRcdHYxLnN1YlZlY3RvcnMoIHNwaGVyZS5jZW50ZXIsIHRoaXMub3JpZ2luICk7XG5cdFx0XHR2YXIgdGNhID0gdjEuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXHRcdFx0dmFyIGQyID0gdjEuZG90KCB2MSApIC0gdGNhICogdGNhO1xuXHRcdFx0dmFyIHJhZGl1czIgPSBzcGhlcmUucmFkaXVzICogc3BoZXJlLnJhZGl1cztcblxuXHRcdFx0aWYgKCBkMiA+IHJhZGl1czIgKSByZXR1cm4gbnVsbDtcblxuXHRcdFx0dmFyIHRoYyA9IE1hdGguc3FydCggcmFkaXVzMiAtIGQyICk7XG5cblx0XHRcdC8vIHQwID0gZmlyc3QgaW50ZXJzZWN0IHBvaW50IC0gZW50cmFuY2Ugb24gZnJvbnQgb2Ygc3BoZXJlXG5cdFx0XHR2YXIgdDAgPSB0Y2EgLSB0aGM7XG5cblx0XHRcdC8vIHQxID0gc2Vjb25kIGludGVyc2VjdCBwb2ludCAtIGV4aXQgcG9pbnQgb24gYmFjayBvZiBzcGhlcmVcblx0XHRcdHZhciB0MSA9IHRjYSArIHRoYztcblxuXHRcdFx0Ly8gdGVzdCB0byBzZWUgaWYgYm90aCB0MCBhbmQgdDEgYXJlIGJlaGluZCB0aGUgcmF5IC0gaWYgc28sIHJldHVybiBudWxsXG5cdFx0XHRpZiAoIHQwIDwgMCAmJiB0MSA8IDAgKSByZXR1cm4gbnVsbDtcblxuXHRcdFx0Ly8gdGVzdCB0byBzZWUgaWYgdDAgaXMgYmVoaW5kIHRoZSByYXk6XG5cdFx0XHQvLyBpZiBpdCBpcywgdGhlIHJheSBpcyBpbnNpZGUgdGhlIHNwaGVyZSwgc28gcmV0dXJuIHRoZSBzZWNvbmQgZXhpdCBwb2ludCBzY2FsZWQgYnkgdDEsXG5cdFx0XHQvLyBpbiBvcmRlciB0byBhbHdheXMgcmV0dXJuIGFuIGludGVyc2VjdCBwb2ludCB0aGF0IGlzIGluIGZyb250IG9mIHRoZSByYXkuXG5cdFx0XHRpZiAoIHQwIDwgMCApIHJldHVybiB0aGlzLmF0KCB0MSwgb3B0aW9uYWxUYXJnZXQgKTtcblxuXHRcdFx0Ly8gZWxzZSB0MCBpcyBpbiBmcm9udCBvZiB0aGUgcmF5LCBzbyByZXR1cm4gdGhlIGZpcnN0IGNvbGxpc2lvbiBwb2ludCBzY2FsZWQgYnkgdDBcblx0XHRcdHJldHVybiB0aGlzLmF0KCB0MCwgb3B0aW9uYWxUYXJnZXQgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBzcGhlcmUuY2VudGVyICkgPD0gc3BoZXJlLnJhZGl1cztcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9QbGFuZTogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdHZhciBkZW5vbWluYXRvciA9IHBsYW5lLm5vcm1hbC5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XG5cblx0XHRpZiAoIGRlbm9taW5hdG9yID09PSAwICkge1xuXG5cdFx0XHQvLyBsaW5lIGlzIGNvcGxhbmFyLCByZXR1cm4gb3JpZ2luXG5cdFx0XHRpZiAoIHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggdGhpcy5vcmlnaW4gKSA9PT0gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gMDtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBOdWxsIGlzIHByZWZlcmFibGUgdG8gdW5kZWZpbmVkIHNpbmNlIHVuZGVmaW5lZCBtZWFucy4uLi4gaXQgaXMgdW5kZWZpbmVkXG5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHQgPSAtICggdGhpcy5vcmlnaW4uZG90KCBwbGFuZS5ub3JtYWwgKSArIHBsYW5lLmNvbnN0YW50ICkgLyBkZW5vbWluYXRvcjtcblxuXHRcdC8vIFJldHVybiBpZiB0aGUgcmF5IG5ldmVyIGludGVyc2VjdHMgdGhlIHBsYW5lXG5cblx0XHRyZXR1cm4gdCA+PSAwID8gdCA6ICBudWxsO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0UGxhbmU6IGZ1bmN0aW9uICggcGxhbmUsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHQgPSB0aGlzLmRpc3RhbmNlVG9QbGFuZSggcGxhbmUgKTtcblxuXHRcdGlmICggdCA9PT0gbnVsbCApIHtcblxuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5hdCggdCwgb3B0aW9uYWxUYXJnZXQgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNQbGFuZTogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdC8vIGNoZWNrIGlmIHRoZSByYXkgbGllcyBvbiB0aGUgcGxhbmUgZmlyc3RcblxuXHRcdHZhciBkaXN0VG9Qb2ludCA9IHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggdGhpcy5vcmlnaW4gKTtcblxuXHRcdGlmICggZGlzdFRvUG9pbnQgPT09IDAgKSB7XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGRlbm9taW5hdG9yID0gcGxhbmUubm9ybWFsLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblxuXHRcdGlmICggZGVub21pbmF0b3IgKiBkaXN0VG9Qb2ludCA8IDAgKSB7XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0Ly8gcmF5IG9yaWdpbiBpcyBiZWhpbmQgdGhlIHBsYW5lIChhbmQgaXMgcG9pbnRpbmcgYmVoaW5kIGl0KVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0Qm94OiBmdW5jdGlvbiAoIGJveCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgdG1pbiwgdG1heCwgdHltaW4sIHR5bWF4LCB0em1pbiwgdHptYXg7XG5cblx0XHR2YXIgaW52ZGlyeCA9IDEgLyB0aGlzLmRpcmVjdGlvbi54LFxuXHRcdFx0aW52ZGlyeSA9IDEgLyB0aGlzLmRpcmVjdGlvbi55LFxuXHRcdFx0aW52ZGlyeiA9IDEgLyB0aGlzLmRpcmVjdGlvbi56O1xuXG5cdFx0dmFyIG9yaWdpbiA9IHRoaXMub3JpZ2luO1xuXG5cdFx0aWYgKCBpbnZkaXJ4ID49IDAgKSB7XG5cblx0XHRcdHRtaW4gPSAoIGJveC5taW4ueCAtIG9yaWdpbi54ICkgKiBpbnZkaXJ4O1xuXHRcdFx0dG1heCA9ICggYm94Lm1heC54IC0gb3JpZ2luLnggKSAqIGludmRpcng7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0bWluID0gKCBib3gubWF4LnggLSBvcmlnaW4ueCApICogaW52ZGlyeDtcblx0XHRcdHRtYXggPSAoIGJveC5taW4ueCAtIG9yaWdpbi54ICkgKiBpbnZkaXJ4O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBpbnZkaXJ5ID49IDAgKSB7XG5cblx0XHRcdHR5bWluID0gKCBib3gubWluLnkgLSBvcmlnaW4ueSApICogaW52ZGlyeTtcblx0XHRcdHR5bWF4ID0gKCBib3gubWF4LnkgLSBvcmlnaW4ueSApICogaW52ZGlyeTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHR5bWluID0gKCBib3gubWF4LnkgLSBvcmlnaW4ueSApICogaW52ZGlyeTtcblx0XHRcdHR5bWF4ID0gKCBib3gubWluLnkgLSBvcmlnaW4ueSApICogaW52ZGlyeTtcblxuXHRcdH1cblxuXHRcdGlmICggKCB0bWluID4gdHltYXggKSB8fCAoIHR5bWluID4gdG1heCApICkgcmV0dXJuIG51bGw7XG5cblx0XHQvLyBUaGVzZSBsaW5lcyBhbHNvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0bWluIG9yIHRtYXggaXMgTmFOXG5cdFx0Ly8gKHJlc3VsdCBvZiAwICogSW5maW5pdHkpLiB4ICE9PSB4IHJldHVybnMgdHJ1ZSBpZiB4IGlzIE5hTlxuXG5cdFx0aWYgKCB0eW1pbiA+IHRtaW4gfHwgdG1pbiAhPT0gdG1pbiApIHRtaW4gPSB0eW1pbjtcblxuXHRcdGlmICggdHltYXggPCB0bWF4IHx8IHRtYXggIT09IHRtYXggKSB0bWF4ID0gdHltYXg7XG5cblx0XHRpZiAoIGludmRpcnogPj0gMCApIHtcblxuXHRcdFx0dHptaW4gPSAoIGJveC5taW4ueiAtIG9yaWdpbi56ICkgKiBpbnZkaXJ6O1xuXHRcdFx0dHptYXggPSAoIGJveC5tYXgueiAtIG9yaWdpbi56ICkgKiBpbnZkaXJ6O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dHptaW4gPSAoIGJveC5tYXgueiAtIG9yaWdpbi56ICkgKiBpbnZkaXJ6O1xuXHRcdFx0dHptYXggPSAoIGJveC5taW4ueiAtIG9yaWdpbi56ICkgKiBpbnZkaXJ6O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCAoIHRtaW4gPiB0em1heCApIHx8ICggdHptaW4gPiB0bWF4ICkgKSByZXR1cm4gbnVsbDtcblxuXHRcdGlmICggdHptaW4gPiB0bWluIHx8IHRtaW4gIT09IHRtaW4gKSB0bWluID0gdHptaW47XG5cblx0XHRpZiAoIHR6bWF4IDwgdG1heCB8fCB0bWF4ICE9PSB0bWF4ICkgdG1heCA9IHR6bWF4O1xuXG5cdFx0Ly9yZXR1cm4gcG9pbnQgY2xvc2VzdCB0byB0aGUgcmF5IChwb3NpdGl2ZSBzaWRlKVxuXG5cdFx0aWYgKCB0bWF4IDwgMCApIHJldHVybiBudWxsO1xuXG5cdFx0cmV0dXJuIHRoaXMuYXQoIHRtaW4gPj0gMCA/IHRtaW4gOiB0bWF4LCBvcHRpb25hbFRhcmdldCApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c0JveDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0c0JveCggYm94ICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RCb3goIGJveCwgdiApICE9PSBudWxsO1xuXG5cdFx0fTtcblxuXHR9ICkoKSxcblxuXHRpbnRlcnNlY3RUcmlhbmdsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gQ29tcHV0ZSB0aGUgb2Zmc2V0IG9yaWdpbiwgZWRnZXMsIGFuZCBub3JtYWwuXG5cdFx0dmFyIGRpZmYgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBlZGdlMSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGVkZ2UyID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RUcmlhbmdsZSggYSwgYiwgYywgYmFja2ZhY2VDdWxsaW5nLCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdFx0Ly8gZnJvbSBodHRwOi8vd3d3Lmdlb21ldHJpY3Rvb2xzLmNvbS9HVEVuZ2luZS9JbmNsdWRlL01hdGhlbWF0aWNzL0d0ZUludHJSYXkzVHJpYW5nbGUzLmhcblxuXHRcdFx0ZWRnZTEuc3ViVmVjdG9ycyggYiwgYSApO1xuXHRcdFx0ZWRnZTIuc3ViVmVjdG9ycyggYywgYSApO1xuXHRcdFx0bm9ybWFsLmNyb3NzVmVjdG9ycyggZWRnZTEsIGVkZ2UyICk7XG5cblx0XHRcdC8vIFNvbHZlIFEgKyB0KkQgPSBiMSpFMSArIGIyKkUyIChRID0ga0RpZmYsIEQgPSByYXkgZGlyZWN0aW9uLFxuXHRcdFx0Ly8gRTEgPSBrRWRnZTEsIEUyID0ga0VkZ2UyLCBOID0gQ3Jvc3MoRTEsRTIpKSBieVxuXHRcdFx0Ly8gICB8RG90KEQsTil8KmIxID0gc2lnbihEb3QoRCxOKSkqRG90KEQsQ3Jvc3MoUSxFMikpXG5cdFx0XHQvLyAgIHxEb3QoRCxOKXwqYjIgPSBzaWduKERvdChELE4pKSpEb3QoRCxDcm9zcyhFMSxRKSlcblx0XHRcdC8vICAgfERvdChELE4pfCp0ID0gLXNpZ24oRG90KEQsTikpKkRvdChRLE4pXG5cdFx0XHR2YXIgRGROID0gdGhpcy5kaXJlY3Rpb24uZG90KCBub3JtYWwgKTtcblx0XHRcdHZhciBzaWduO1xuXG5cdFx0XHRpZiAoIERkTiA+IDAgKSB7XG5cblx0XHRcdFx0aWYgKCBiYWNrZmFjZUN1bGxpbmcgKSByZXR1cm4gbnVsbDtcblx0XHRcdFx0c2lnbiA9IDE7XG5cblx0XHRcdH0gZWxzZSBpZiAoIERkTiA8IDAgKSB7XG5cblx0XHRcdFx0c2lnbiA9IC0gMTtcblx0XHRcdFx0RGROID0gLSBEZE47XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH1cblxuXHRcdFx0ZGlmZi5zdWJWZWN0b3JzKCB0aGlzLm9yaWdpbiwgYSApO1xuXHRcdFx0dmFyIERkUXhFMiA9IHNpZ24gKiB0aGlzLmRpcmVjdGlvbi5kb3QoIGVkZ2UyLmNyb3NzVmVjdG9ycyggZGlmZiwgZWRnZTIgKSApO1xuXG5cdFx0XHQvLyBiMSA8IDAsIG5vIGludGVyc2VjdGlvblxuXHRcdFx0aWYgKCBEZFF4RTIgPCAwICkge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBEZEUxeFEgPSBzaWduICogdGhpcy5kaXJlY3Rpb24uZG90KCBlZGdlMS5jcm9zcyggZGlmZiApICk7XG5cblx0XHRcdC8vIGIyIDwgMCwgbm8gaW50ZXJzZWN0aW9uXG5cdFx0XHRpZiAoIERkRTF4USA8IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gYjErYjIgPiAxLCBubyBpbnRlcnNlY3Rpb25cblx0XHRcdGlmICggRGRReEUyICsgRGRFMXhRID4gRGROICkge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIExpbmUgaW50ZXJzZWN0cyB0cmlhbmdsZSwgY2hlY2sgaWYgcmF5IGRvZXMuXG5cdFx0XHR2YXIgUWROID0gLSBzaWduICogZGlmZi5kb3QoIG5vcm1hbCApO1xuXG5cdFx0XHQvLyB0IDwgMCwgbm8gaW50ZXJzZWN0aW9uXG5cdFx0XHRpZiAoIFFkTiA8IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gUmF5IGludGVyc2VjdHMgdHJpYW5nbGUuXG5cdFx0XHRyZXR1cm4gdGhpcy5hdCggUWROIC8gRGROLCBvcHRpb25hbFRhcmdldCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoIG1hdHJpeDQgKSB7XG5cblx0XHR0aGlzLmRpcmVjdGlvbi5hZGQoIHRoaXMub3JpZ2luICkuYXBwbHlNYXRyaXg0KCBtYXRyaXg0ICk7XG5cdFx0dGhpcy5vcmlnaW4uYXBwbHlNYXRyaXg0KCBtYXRyaXg0ICk7XG5cdFx0dGhpcy5kaXJlY3Rpb24uc3ViKCB0aGlzLm9yaWdpbiApO1xuXHRcdHRoaXMuZGlyZWN0aW9uLm5vcm1hbGl6ZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggcmF5ICkge1xuXG5cdFx0cmV0dXJuIHJheS5vcmlnaW4uZXF1YWxzKCB0aGlzLm9yaWdpbiApICYmIHJheS5kaXJlY3Rpb24uZXF1YWxzKCB0aGlzLmRpcmVjdGlvbiApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBFdWxlciggeCwgeSwgeiwgb3JkZXIgKSB7XG5cblx0dGhpcy5feCA9IHggfHwgMDtcblx0dGhpcy5feSA9IHkgfHwgMDtcblx0dGhpcy5feiA9IHogfHwgMDtcblx0dGhpcy5fb3JkZXIgPSBvcmRlciB8fCBFdWxlci5EZWZhdWx0T3JkZXI7XG5cbn1cblxuRXVsZXIuUm90YXRpb25PcmRlcnMgPSBbICdYWVonLCAnWVpYJywgJ1pYWScsICdYWlknLCAnWVhaJywgJ1pZWCcgXTtcblxuRXVsZXIuRGVmYXVsdE9yZGVyID0gJ1hZWic7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBFdWxlci5wcm90b3R5cGUsIHtcblxuXHR4OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3g7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl94ID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHk6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5feTtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3kgPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0ejoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLl96O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy5feiA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRvcmRlcjoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLl9vcmRlcjtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX29yZGVyID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggRXVsZXIucHJvdG90eXBlLCB7XG5cblx0aXNFdWxlcjogdHJ1ZSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggeCwgeSwgeiwgb3JkZXIgKSB7XG5cblx0XHR0aGlzLl94ID0geDtcblx0XHR0aGlzLl95ID0geTtcblx0XHR0aGlzLl96ID0gejtcblx0XHR0aGlzLl9vcmRlciA9IG9yZGVyIHx8IHRoaXMuX29yZGVyO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3osIHRoaXMuX29yZGVyICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIGV1bGVyICkge1xuXG5cdFx0dGhpcy5feCA9IGV1bGVyLl94O1xuXHRcdHRoaXMuX3kgPSBldWxlci5feTtcblx0XHR0aGlzLl96ID0gZXVsZXIuX3o7XG5cdFx0dGhpcy5fb3JkZXIgPSBldWxlci5fb3JkZXI7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVJvdGF0aW9uTWF0cml4OiBmdW5jdGlvbiAoIG0sIG9yZGVyLCB1cGRhdGUgKSB7XG5cblx0XHR2YXIgY2xhbXAgPSBfTWF0aC5jbGFtcDtcblxuXHRcdC8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpXG5cblx0XHR2YXIgdGUgPSBtLmVsZW1lbnRzO1xuXHRcdHZhciBtMTEgPSB0ZVsgMCBdLCBtMTIgPSB0ZVsgNCBdLCBtMTMgPSB0ZVsgOCBdO1xuXHRcdHZhciBtMjEgPSB0ZVsgMSBdLCBtMjIgPSB0ZVsgNSBdLCBtMjMgPSB0ZVsgOSBdO1xuXHRcdHZhciBtMzEgPSB0ZVsgMiBdLCBtMzIgPSB0ZVsgNiBdLCBtMzMgPSB0ZVsgMTAgXTtcblxuXHRcdG9yZGVyID0gb3JkZXIgfHwgdGhpcy5fb3JkZXI7XG5cblx0XHRpZiAoIG9yZGVyID09PSAnWFlaJyApIHtcblxuXHRcdFx0dGhpcy5feSA9IE1hdGguYXNpbiggY2xhbXAoIG0xMywgLSAxLCAxICkgKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbTEzICkgPCAwLjk5OTk5ICkge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCAtIG0yMywgbTMzICk7XG5cdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCAtIG0xMiwgbTExICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIG0zMiwgbTIyICk7XG5cdFx0XHRcdHRoaXMuX3ogPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1lYWicgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSBNYXRoLmFzaW4oIC0gY2xhbXAoIG0yMywgLSAxLCAxICkgKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbTIzICkgPCAwLjk5OTk5ICkge1xuXG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCBtMTMsIG0zMyApO1xuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggbTIxLCBtMjIgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggLSBtMzEsIG0xMSApO1xuXHRcdFx0XHR0aGlzLl96ID0gMDtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdaWFknICkge1xuXG5cdFx0XHR0aGlzLl94ID0gTWF0aC5hc2luKCBjbGFtcCggbTMyLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBtMzIgKSA8IDAuOTk5OTkgKSB7XG5cblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIC0gbTMxLCBtMzMgKTtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIC0gbTEyLCBtMjIgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLl95ID0gMDtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIG0yMSwgbTExICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWllYJyApIHtcblxuXHRcdFx0dGhpcy5feSA9IE1hdGguYXNpbiggLSBjbGFtcCggbTMxLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBtMzEgKSA8IDAuOTk5OTkgKSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIG0zMiwgbTMzICk7XG5cdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCBtMjEsIG0xMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSAwO1xuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggLSBtMTIsIG0yMiApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1laWCcgKSB7XG5cblx0XHRcdHRoaXMuX3ogPSBNYXRoLmFzaW4oIGNsYW1wKCBtMjEsIC0gMSwgMSApICk7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIG0yMSApIDwgMC45OTk5OSApIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggLSBtMjMsIG0yMiApO1xuXHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggLSBtMzEsIG0xMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSAwO1xuXHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggbTEzLCBtMzMgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdYWlknICkge1xuXG5cdFx0XHR0aGlzLl96ID0gTWF0aC5hc2luKCAtIGNsYW1wKCBtMTIsIC0gMSwgMSApICk7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIG0xMiApIDwgMC45OTk5OSApIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggbTMyLCBtMjIgKTtcblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIG0xMywgbTExICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIC0gbTIzLCBtMzMgKTtcblx0XHRcdFx0dGhpcy5feSA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkV1bGVyOiAuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgZ2l2ZW4gdW5zdXBwb3J0ZWQgb3JkZXI6ICcgKyBvcmRlciApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5fb3JkZXIgPSBvcmRlcjtcblxuXHRcdGlmICggdXBkYXRlICE9PSBmYWxzZSApIHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbVF1YXRlcm5pb24oIHEsIG9yZGVyLCB1cGRhdGUgKSB7XG5cblx0XHRcdG1hdHJpeC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbiggcSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tUm90YXRpb25NYXRyaXgoIG1hdHJpeCwgb3JkZXIsIHVwZGF0ZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0c2V0RnJvbVZlY3RvcjM6IGZ1bmN0aW9uICggdiwgb3JkZXIgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXQoIHYueCwgdi55LCB2LnosIG9yZGVyIHx8IHRoaXMuX29yZGVyICk7XG5cblx0fSxcblxuXHRyZW9yZGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBXQVJOSU5HOiB0aGlzIGRpc2NhcmRzIHJldm9sdXRpb24gaW5mb3JtYXRpb24gLWJob3VzdG9uXG5cblx0XHR2YXIgcSA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmVvcmRlciggbmV3T3JkZXIgKSB7XG5cblx0XHRcdHEuc2V0RnJvbUV1bGVyKCB0aGlzICk7XG5cblx0XHRcdHJldHVybiB0aGlzLnNldEZyb21RdWF0ZXJuaW9uKCBxLCBuZXdPcmRlciApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIGV1bGVyICkge1xuXG5cdFx0cmV0dXJuICggZXVsZXIuX3ggPT09IHRoaXMuX3ggKSAmJiAoIGV1bGVyLl95ID09PSB0aGlzLl95ICkgJiYgKCBldWxlci5feiA9PT0gdGhpcy5feiApICYmICggZXVsZXIuX29yZGVyID09PSB0aGlzLl9vcmRlciApO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5ICkge1xuXG5cdFx0dGhpcy5feCA9IGFycmF5WyAwIF07XG5cdFx0dGhpcy5feSA9IGFycmF5WyAxIF07XG5cdFx0dGhpcy5feiA9IGFycmF5WyAyIF07XG5cdFx0aWYgKCBhcnJheVsgMyBdICE9PSB1bmRlZmluZWQgKSB0aGlzLl9vcmRlciA9IGFycmF5WyAzIF07XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMuX3g7XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMuX3k7XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuX3o7XG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRoaXMuX29yZGVyO1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0dG9WZWN0b3IzOiBmdW5jdGlvbiAoIG9wdGlvbmFsUmVzdWx0ICkge1xuXG5cdFx0aWYgKCBvcHRpb25hbFJlc3VsdCApIHtcblxuXHRcdFx0cmV0dXJuIG9wdGlvbmFsUmVzdWx0LnNldCggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmV0dXJuIG5ldyBWZWN0b3IzKCB0aGlzLl94LCB0aGlzLl95LCB0aGlzLl96ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRvbkNoYW5nZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRvbkNoYW5nZUNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMYXllcnMoKSB7XG5cblx0dGhpcy5tYXNrID0gMSB8IDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggTGF5ZXJzLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBjaGFubmVsICkge1xuXG5cdFx0dGhpcy5tYXNrID0gMSA8PCBjaGFubmVsIHwgMDtcblxuXHR9LFxuXG5cdGVuYWJsZTogZnVuY3Rpb24gKCBjaGFubmVsICkge1xuXG5cdFx0dGhpcy5tYXNrIHw9IDEgPDwgY2hhbm5lbCB8IDA7XG5cblx0fSxcblxuXHR0b2dnbGU6IGZ1bmN0aW9uICggY2hhbm5lbCApIHtcblxuXHRcdHRoaXMubWFzayBePSAxIDw8IGNoYW5uZWwgfCAwO1xuXG5cdH0sXG5cblx0ZGlzYWJsZTogZnVuY3Rpb24gKCBjaGFubmVsICkge1xuXG5cdFx0dGhpcy5tYXNrICY9IH4gKCAxIDw8IGNoYW5uZWwgfCAwICk7XG5cblx0fSxcblxuXHR0ZXN0OiBmdW5jdGlvbiAoIGxheWVycyApIHtcblxuXHRcdHJldHVybiAoIHRoaXMubWFzayAmIGxheWVycy5tYXNrICkgIT09IDA7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIGVsZXBoYW50YXR3b3JrIC8gd3d3LmVsZXBoYW50YXR3b3JrLmNoXG4gKi9cblxudmFyIG9iamVjdDNESWQgPSAwO1xuXG5mdW5jdGlvbiBPYmplY3QzRCgpIHtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IG9iamVjdDNESWQgKysgfSApO1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXHR0aGlzLnR5cGUgPSAnT2JqZWN0M0QnO1xuXG5cdHRoaXMucGFyZW50ID0gbnVsbDtcblx0dGhpcy5jaGlsZHJlbiA9IFtdO1xuXG5cdHRoaXMudXAgPSBPYmplY3QzRC5EZWZhdWx0VXAuY2xvbmUoKTtcblxuXHR2YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgcm90YXRpb24gPSBuZXcgRXVsZXIoKTtcblx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXHR2YXIgc2NhbGUgPSBuZXcgVmVjdG9yMyggMSwgMSwgMSApO1xuXG5cdGZ1bmN0aW9uIG9uUm90YXRpb25DaGFuZ2UoKSB7XG5cblx0XHRxdWF0ZXJuaW9uLnNldEZyb21FdWxlciggcm90YXRpb24sIGZhbHNlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIG9uUXVhdGVybmlvbkNoYW5nZSgpIHtcblxuXHRcdHJvdGF0aW9uLnNldEZyb21RdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uLCB1bmRlZmluZWQsIGZhbHNlICk7XG5cblx0fVxuXG5cdHJvdGF0aW9uLm9uQ2hhbmdlKCBvblJvdGF0aW9uQ2hhbmdlICk7XG5cdHF1YXRlcm5pb24ub25DaGFuZ2UoIG9uUXVhdGVybmlvbkNoYW5nZSApO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7XG5cdFx0cG9zaXRpb246IHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHR2YWx1ZTogcG9zaXRpb25cblx0XHR9LFxuXHRcdHJvdGF0aW9uOiB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IHJvdGF0aW9uXG5cdFx0fSxcblx0XHRxdWF0ZXJuaW9uOiB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IHF1YXRlcm5pb25cblx0XHR9LFxuXHRcdHNjYWxlOiB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IHNjYWxlXG5cdFx0fSxcblx0XHRtb2RlbFZpZXdNYXRyaXg6IHtcblx0XHRcdHZhbHVlOiBuZXcgTWF0cml4NCgpXG5cdFx0fSxcblx0XHRub3JtYWxNYXRyaXg6IHtcblx0XHRcdHZhbHVlOiBuZXcgTWF0cml4MygpXG5cdFx0fVxuXHR9ICk7XG5cblx0dGhpcy5tYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHR0aGlzLm1hdHJpeFdvcmxkID0gbmV3IE1hdHJpeDQoKTtcblxuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBPYmplY3QzRC5EZWZhdWx0TWF0cml4QXV0b1VwZGF0ZTtcblx0dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy5sYXllcnMgPSBuZXcgTGF5ZXJzKCk7XG5cdHRoaXMudmlzaWJsZSA9IHRydWU7XG5cblx0dGhpcy5jYXN0U2hhZG93ID0gZmFsc2U7XG5cdHRoaXMucmVjZWl2ZVNoYWRvdyA9IGZhbHNlO1xuXG5cdHRoaXMuZnJ1c3R1bUN1bGxlZCA9IHRydWU7XG5cdHRoaXMucmVuZGVyT3JkZXIgPSAwO1xuXG5cdHRoaXMudXNlckRhdGEgPSB7fTtcblxuXHR0aGlzLm9uQmVmb3JlUmVuZGVyID0gZnVuY3Rpb24gKCkge307XG5cdHRoaXMub25BZnRlclJlbmRlciA9IGZ1bmN0aW9uICgpIHt9O1xuXG59XG5cbk9iamVjdDNELkRlZmF1bHRVcCA9IG5ldyBWZWN0b3IzKCAwLCAxLCAwICk7XG5PYmplY3QzRC5EZWZhdWx0TWF0cml4QXV0b1VwZGF0ZSA9IHRydWU7XG5cbk9iamVjdC5hc3NpZ24oIE9iamVjdDNELnByb3RvdHlwZSwgRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSwge1xuXG5cdGlzT2JqZWN0M0Q6IHRydWUsXG5cblx0YXBwbHlNYXRyaXg6IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdFx0dGhpcy5tYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggbWF0cml4LCB0aGlzLm1hdHJpeCApO1xuXG5cdFx0dGhpcy5tYXRyaXguZGVjb21wb3NlKCB0aGlzLnBvc2l0aW9uLCB0aGlzLnF1YXRlcm5pb24sIHRoaXMuc2NhbGUgKTtcblxuXHR9LFxuXG5cdHNldFJvdGF0aW9uRnJvbUF4aXNBbmdsZTogZnVuY3Rpb24gKCBheGlzLCBhbmdsZSApIHtcblxuXHRcdC8vIGFzc3VtZXMgYXhpcyBpcyBub3JtYWxpemVkXG5cblx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKTtcblxuXHR9LFxuXG5cdHNldFJvdGF0aW9uRnJvbUV1bGVyOiBmdW5jdGlvbiAoIGV1bGVyICkge1xuXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21FdWxlciggZXVsZXIsIHRydWUgKTtcblxuXHR9LFxuXG5cdHNldFJvdGF0aW9uRnJvbU1hdHJpeDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Ly8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZClcblxuXHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoIG0gKTtcblxuXHR9LFxuXG5cdHNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHtcblxuXHRcdC8vIGFzc3VtZXMgcSBpcyBub3JtYWxpemVkXG5cblx0XHR0aGlzLnF1YXRlcm5pb24uY29weSggcSApO1xuXG5cdH0sXG5cblx0cm90YXRlT25BeGlzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyByb3RhdGUgb2JqZWN0IG9uIGF4aXMgaW4gb2JqZWN0IHNwYWNlXG5cdFx0Ly8gYXhpcyBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdHZhciBxMSA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlT25BeGlzKCBheGlzLCBhbmdsZSApIHtcblxuXHRcdFx0cTEuc2V0RnJvbUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKTtcblxuXHRcdFx0dGhpcy5xdWF0ZXJuaW9uLm11bHRpcGx5KCBxMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCAxLCAwLCAwICk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWCggYW5nbGUgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyggdjEsIGFuZ2xlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyb3RhdGVZOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMyggMCwgMSwgMCApO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVkoIGFuZ2xlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoIHYxLCBhbmdsZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlWjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoIDAsIDAsIDEgKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVaKCBhbmdsZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKCB2MSwgYW5nbGUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZU9uQXhpczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gdHJhbnNsYXRlIG9iamVjdCBieSBkaXN0YW5jZSBhbG9uZyBheGlzIGluIG9iamVjdCBzcGFjZVxuXHRcdC8vIGF4aXMgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFuY2UgKSB7XG5cblx0XHRcdHYxLmNvcHkoIGF4aXMgKS5hcHBseVF1YXRlcm5pb24oIHRoaXMucXVhdGVybmlvbiApO1xuXG5cdFx0XHR0aGlzLnBvc2l0aW9uLmFkZCggdjEubXVsdGlwbHlTY2FsYXIoIGRpc3RhbmNlICkgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0cmFuc2xhdGVYOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMyggMSwgMCwgMCApO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZVgoIGRpc3RhbmNlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIHYxLCBkaXN0YW5jZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlWTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoIDAsIDEsIDAgKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB0cmFuc2xhdGVZKCBkaXN0YW5jZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCB2MSwgZGlzdGFuY2UgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZVo6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCAwLCAwLCAxICk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlWiggZGlzdGFuY2UgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggdjEsIGRpc3RhbmNlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRsb2NhbFRvV29ybGQ6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHR9LFxuXG5cdHdvcmxkVG9Mb2NhbDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB3b3JsZFRvTG9jYWwoIHZlY3RvciApIHtcblxuXHRcdFx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIG0xLmdldEludmVyc2UoIHRoaXMubWF0cml4V29ybGQgKSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0bG9va0F0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBUaGlzIHJvdXRpbmUgZG9lcyBub3Qgc3VwcG9ydCBvYmplY3RzIHdpdGggcm90YXRlZCBhbmQvb3IgdHJhbnNsYXRlZCBwYXJlbnQocylcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gbG9va0F0KCB2ZWN0b3IgKSB7XG5cblx0XHRcdGlmICggdGhpcy5pc0NhbWVyYSApIHtcblxuXHRcdFx0XHRtMS5sb29rQXQoIHRoaXMucG9zaXRpb24sIHZlY3RvciwgdGhpcy51cCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdG0xLmxvb2tBdCggdmVjdG9yLCB0aGlzLnBvc2l0aW9uLCB0aGlzLnVwICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggbTEgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGFkZDogZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHRoaXMuYWRkKCBhcmd1bWVudHNbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QgPT09IHRoaXMgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoIFwiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3QgY2FuJ3QgYmUgYWRkZWQgYXMgYSBjaGlsZCBvZiBpdHNlbGYuXCIsIG9iamVjdCApO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHRpZiAoICggb2JqZWN0ICYmIG9iamVjdC5pc09iamVjdDNEICkgKSB7XG5cblx0XHRcdGlmICggb2JqZWN0LnBhcmVudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRvYmplY3QucGFyZW50LnJlbW92ZSggb2JqZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0b2JqZWN0LnBhcmVudCA9IHRoaXM7XG5cdFx0XHRvYmplY3QuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnYWRkZWQnIH0gKTtcblxuXHRcdFx0dGhpcy5jaGlsZHJlbi5wdXNoKCBvYmplY3QgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoIFwiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3Qgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLk9iamVjdDNELlwiLCBvYmplY3QgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0dGhpcy5yZW1vdmUoIGFyZ3VtZW50c1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBpbmRleCA9IHRoaXMuY2hpbGRyZW4uaW5kZXhPZiggb2JqZWN0ICk7XG5cblx0XHRpZiAoIGluZGV4ICE9PSAtIDEgKSB7XG5cblx0XHRcdG9iamVjdC5wYXJlbnQgPSBudWxsO1xuXG5cdFx0XHRvYmplY3QuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAncmVtb3ZlZCcgfSApO1xuXG5cdFx0XHR0aGlzLmNoaWxkcmVuLnNwbGljZSggaW5kZXgsIDEgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGdldE9iamVjdEJ5SWQ6IGZ1bmN0aW9uICggaWQgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCAnaWQnLCBpZCApO1xuXG5cdH0sXG5cblx0Z2V0T2JqZWN0QnlOYW1lOiBmdW5jdGlvbiAoIG5hbWUgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCAnbmFtZScsIG5hbWUgKTtcblxuXHR9LFxuXG5cdGdldE9iamVjdEJ5UHJvcGVydHk6IGZ1bmN0aW9uICggbmFtZSwgdmFsdWUgKSB7XG5cblx0XHRpZiAoIHRoaXNbIG5hbWUgXSA9PT0gdmFsdWUgKSByZXR1cm4gdGhpcztcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlblsgaSBdO1xuXHRcdFx0dmFyIG9iamVjdCA9IGNoaWxkLmdldE9iamVjdEJ5UHJvcGVydHkoIG5hbWUsIHZhbHVlICk7XG5cblx0XHRcdGlmICggb2JqZWN0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG9iamVjdDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHR9LFxuXG5cdGdldFdvcmxkUG9zaXRpb246IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblxuXHRcdHRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcblxuXHRcdHJldHVybiByZXN1bHQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0fSxcblxuXHRnZXRXb3JsZFF1YXRlcm5pb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHNjYWxlID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRXb3JsZFF1YXRlcm5pb24oIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdFx0dGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0XHR0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggcG9zaXRpb24sIHJlc3VsdCwgc2NhbGUgKTtcblxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGdldFdvcmxkUm90YXRpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRXb3JsZFJvdGF0aW9uKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBFdWxlcigpO1xuXG5cdFx0XHR0aGlzLmdldFdvcmxkUXVhdGVybmlvbiggcXVhdGVybmlvbiApO1xuXG5cdFx0XHRyZXR1cm4gcmVzdWx0LnNldEZyb21RdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uLCB0aGlzLnJvdGF0aW9uLm9yZGVyLCBmYWxzZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Z2V0V29ybGRTY2FsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2V0V29ybGRTY2FsZSggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHR0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRcdHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgcmVzdWx0ICk7XG5cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRnZXRXb3JsZERpcmVjdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldFdvcmxkRGlyZWN0aW9uKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdHRoaXMuZ2V0V29ybGRRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7XG5cblx0XHRcdHJldHVybiByZXN1bHQuc2V0KCAwLCAwLCAxICkuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyYXljYXN0OiBmdW5jdGlvbiAoKSB7fSxcblxuXHR0cmF2ZXJzZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdGNhbGxiYWNrKCB0aGlzICk7XG5cblx0XHR2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y2hpbGRyZW5bIGkgXS50cmF2ZXJzZSggY2FsbGJhY2sgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHRyYXZlcnNlVmlzaWJsZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdGlmICggdGhpcy52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdGNhbGxiYWNrKCB0aGlzICk7XG5cblx0XHR2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y2hpbGRyZW5bIGkgXS50cmF2ZXJzZVZpc2libGUoIGNhbGxiYWNrICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR0cmF2ZXJzZUFuY2VzdG9yczogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcblxuXHRcdGlmICggcGFyZW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRjYWxsYmFjayggcGFyZW50ICk7XG5cblx0XHRcdHBhcmVudC50cmF2ZXJzZUFuY2VzdG9ycyggY2FsbGJhY2sgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5tYXRyaXguY29tcG9zZSggdGhpcy5wb3NpdGlvbiwgdGhpcy5xdWF0ZXJuaW9uLCB0aGlzLnNjYWxlICk7XG5cblx0XHR0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdH0sXG5cblx0dXBkYXRlTWF0cml4V29ybGQ6IGZ1bmN0aW9uICggZm9yY2UgKSB7XG5cblx0XHRpZiAoIHRoaXMubWF0cml4QXV0b1VwZGF0ZSApIHRoaXMudXBkYXRlTWF0cml4KCk7XG5cblx0XHRpZiAoIHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSB8fCBmb3JjZSApIHtcblxuXHRcdFx0aWYgKCB0aGlzLnBhcmVudCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHR0aGlzLm1hdHJpeFdvcmxkLmNvcHkoIHRoaXMubWF0cml4ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCwgdGhpcy5tYXRyaXggKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSBmYWxzZTtcblxuXHRcdFx0Zm9yY2UgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXBkYXRlIGNoaWxkcmVuXG5cblx0XHR2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y2hpbGRyZW5bIGkgXS51cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0Ly8gbWV0YSBpcyAnJyB3aGVuIGNhbGxlZCBmcm9tIEpTT04uc3RyaW5naWZ5XG5cdFx0dmFyIGlzUm9vdE9iamVjdCA9ICggbWV0YSA9PT0gdW5kZWZpbmVkIHx8IG1ldGEgPT09ICcnICk7XG5cblx0XHR2YXIgb3V0cHV0ID0ge307XG5cblx0XHQvLyBtZXRhIGlzIGEgaGFzaCB1c2VkIHRvIGNvbGxlY3QgZ2VvbWV0cmllcywgbWF0ZXJpYWxzLlxuXHRcdC8vIG5vdCBwcm92aWRpbmcgaXQgaW1wbGllcyB0aGF0IHRoaXMgaXMgdGhlIHJvb3Qgb2JqZWN0XG5cdFx0Ly8gYmVpbmcgc2VyaWFsaXplZC5cblx0XHRpZiAoIGlzUm9vdE9iamVjdCApIHtcblxuXHRcdFx0Ly8gaW5pdGlhbGl6ZSBtZXRhIG9ialxuXHRcdFx0bWV0YSA9IHtcblx0XHRcdFx0Z2VvbWV0cmllczoge30sXG5cdFx0XHRcdG1hdGVyaWFsczoge30sXG5cdFx0XHRcdHRleHR1cmVzOiB7fSxcblx0XHRcdFx0aW1hZ2VzOiB7fVxuXHRcdFx0fTtcblxuXHRcdFx0b3V0cHV0Lm1ldGFkYXRhID0ge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdPYmplY3QnLFxuXHRcdFx0XHRnZW5lcmF0b3I6ICdPYmplY3QzRC50b0pTT04nXG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0Ly8gc3RhbmRhcmQgT2JqZWN0M0Qgc2VyaWFsaXphdGlvblxuXG5cdFx0dmFyIG9iamVjdCA9IHt9O1xuXG5cdFx0b2JqZWN0LnV1aWQgPSB0aGlzLnV1aWQ7XG5cdFx0b2JqZWN0LnR5cGUgPSB0aGlzLnR5cGU7XG5cblx0XHRpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBvYmplY3QubmFtZSA9IHRoaXMubmFtZTtcblx0XHRpZiAoIEpTT04uc3RyaW5naWZ5KCB0aGlzLnVzZXJEYXRhICkgIT09ICd7fScgKSBvYmplY3QudXNlckRhdGEgPSB0aGlzLnVzZXJEYXRhO1xuXHRcdGlmICggdGhpcy5jYXN0U2hhZG93ID09PSB0cnVlICkgb2JqZWN0LmNhc3RTaGFkb3cgPSB0cnVlO1xuXHRcdGlmICggdGhpcy5yZWNlaXZlU2hhZG93ID09PSB0cnVlICkgb2JqZWN0LnJlY2VpdmVTaGFkb3cgPSB0cnVlO1xuXHRcdGlmICggdGhpcy52aXNpYmxlID09PSBmYWxzZSApIG9iamVjdC52aXNpYmxlID0gZmFsc2U7XG5cblx0XHRvYmplY3QubWF0cml4ID0gdGhpcy5tYXRyaXgudG9BcnJheSgpO1xuXG5cdFx0Ly9cblxuXHRcdGZ1bmN0aW9uIHNlcmlhbGl6ZSggbGlicmFyeSwgZWxlbWVudCApIHtcblxuXHRcdFx0aWYgKCBsaWJyYXJ5WyBlbGVtZW50LnV1aWQgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGxpYnJhcnlbIGVsZW1lbnQudXVpZCBdID0gZWxlbWVudC50b0pTT04oIG1ldGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbWVudC51dWlkO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmdlb21ldHJ5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG9iamVjdC5nZW9tZXRyeSA9IHNlcmlhbGl6ZSggbWV0YS5nZW9tZXRyaWVzLCB0aGlzLmdlb21ldHJ5ICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMubWF0ZXJpYWwgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCB0aGlzLm1hdGVyaWFsICkgKSB7XG5cblx0XHRcdFx0dmFyIHV1aWRzID0gW107XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5tYXRlcmlhbC5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dXVpZHMucHVzaCggc2VyaWFsaXplKCBtZXRhLm1hdGVyaWFscywgdGhpcy5tYXRlcmlhbFsgaSBdICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0b2JqZWN0Lm1hdGVyaWFsID0gdXVpZHM7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0b2JqZWN0Lm1hdGVyaWFsID0gc2VyaWFsaXplKCBtZXRhLm1hdGVyaWFscywgdGhpcy5tYXRlcmlhbCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0aWYgKCB0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdG9iamVjdC5jaGlsZHJlbiA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRvYmplY3QuY2hpbGRyZW4ucHVzaCggdGhpcy5jaGlsZHJlblsgaSBdLnRvSlNPTiggbWV0YSApLm9iamVjdCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIGlzUm9vdE9iamVjdCApIHtcblxuXHRcdFx0dmFyIGdlb21ldHJpZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLmdlb21ldHJpZXMgKTtcblx0XHRcdHZhciBtYXRlcmlhbHMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLm1hdGVyaWFscyApO1xuXHRcdFx0dmFyIHRleHR1cmVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS50ZXh0dXJlcyApO1xuXHRcdFx0dmFyIGltYWdlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuaW1hZ2VzICk7XG5cblx0XHRcdGlmICggZ2VvbWV0cmllcy5sZW5ndGggPiAwICkgb3V0cHV0Lmdlb21ldHJpZXMgPSBnZW9tZXRyaWVzO1xuXHRcdFx0aWYgKCBtYXRlcmlhbHMubGVuZ3RoID4gMCApIG91dHB1dC5tYXRlcmlhbHMgPSBtYXRlcmlhbHM7XG5cdFx0XHRpZiAoIHRleHR1cmVzLmxlbmd0aCA+IDAgKSBvdXRwdXQudGV4dHVyZXMgPSB0ZXh0dXJlcztcblx0XHRcdGlmICggaW1hZ2VzLmxlbmd0aCA+IDAgKSBvdXRwdXQuaW1hZ2VzID0gaW1hZ2VzO1xuXG5cdFx0fVxuXG5cdFx0b3V0cHV0Lm9iamVjdCA9IG9iamVjdDtcblxuXHRcdHJldHVybiBvdXRwdXQ7XG5cblx0XHQvLyBleHRyYWN0IGRhdGEgZnJvbSB0aGUgY2FjaGUgaGFzaFxuXHRcdC8vIHJlbW92ZSBtZXRhZGF0YSBvbiBlYWNoIGl0ZW1cblx0XHQvLyBhbmQgcmV0dXJuIGFzIGFycmF5XG5cdFx0ZnVuY3Rpb24gZXh0cmFjdEZyb21DYWNoZSggY2FjaGUgKSB7XG5cblx0XHRcdHZhciB2YWx1ZXMgPSBbXTtcblx0XHRcdGZvciAoIHZhciBrZXkgaW4gY2FjaGUgKSB7XG5cblx0XHRcdFx0dmFyIGRhdGEgPSBjYWNoZVsga2V5IF07XG5cdFx0XHRcdGRlbGV0ZSBkYXRhLm1ldGFkYXRhO1xuXHRcdFx0XHR2YWx1ZXMucHVzaCggZGF0YSApO1xuXG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdmFsdWVzO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICggcmVjdXJzaXZlICkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcywgcmVjdXJzaXZlICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0aWYgKCByZWN1cnNpdmUgPT09IHVuZGVmaW5lZCApIHJlY3Vyc2l2ZSA9IHRydWU7XG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblxuXHRcdHRoaXMudXAuY29weSggc291cmNlLnVwICk7XG5cblx0XHR0aGlzLnBvc2l0aW9uLmNvcHkoIHNvdXJjZS5wb3NpdGlvbiApO1xuXHRcdHRoaXMucXVhdGVybmlvbi5jb3B5KCBzb3VyY2UucXVhdGVybmlvbiApO1xuXHRcdHRoaXMuc2NhbGUuY29weSggc291cmNlLnNjYWxlICk7XG5cblx0XHR0aGlzLm1hdHJpeC5jb3B5KCBzb3VyY2UubWF0cml4ICk7XG5cdFx0dGhpcy5tYXRyaXhXb3JsZC5jb3B5KCBzb3VyY2UubWF0cml4V29ybGQgKTtcblxuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhBdXRvVXBkYXRlO1xuXHRcdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlO1xuXG5cdFx0dGhpcy5sYXllcnMubWFzayA9IHNvdXJjZS5sYXllcnMubWFzaztcblx0XHR0aGlzLnZpc2libGUgPSBzb3VyY2UudmlzaWJsZTtcblxuXHRcdHRoaXMuY2FzdFNoYWRvdyA9IHNvdXJjZS5jYXN0U2hhZG93O1xuXHRcdHRoaXMucmVjZWl2ZVNoYWRvdyA9IHNvdXJjZS5yZWNlaXZlU2hhZG93O1xuXG5cdFx0dGhpcy5mcnVzdHVtQ3VsbGVkID0gc291cmNlLmZydXN0dW1DdWxsZWQ7XG5cdFx0dGhpcy5yZW5kZXJPcmRlciA9IHNvdXJjZS5yZW5kZXJPcmRlcjtcblxuXHRcdHRoaXMudXNlckRhdGEgPSBKU09OLnBhcnNlKCBKU09OLnN0cmluZ2lmeSggc291cmNlLnVzZXJEYXRhICkgKTtcblxuXHRcdGlmICggcmVjdXJzaXZlID09PSB0cnVlICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBzb3VyY2UuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBjaGlsZCA9IHNvdXJjZS5jaGlsZHJlblsgaSBdO1xuXHRcdFx0XHR0aGlzLmFkZCggY2hpbGQuY2xvbmUoKSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuZnVuY3Rpb24gTGluZTMoIHN0YXJ0LCBlbmQgKSB7XG5cblx0dGhpcy5zdGFydCA9ICggc3RhcnQgIT09IHVuZGVmaW5lZCApID8gc3RhcnQgOiBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLmVuZCA9ICggZW5kICE9PSB1bmRlZmluZWQgKSA/IGVuZCA6IG5ldyBWZWN0b3IzKCk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggTGluZTMucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHN0YXJ0LCBlbmQgKSB7XG5cblx0XHR0aGlzLnN0YXJ0LmNvcHkoIHN0YXJ0ICk7XG5cdFx0dGhpcy5lbmQuY29weSggZW5kICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIGxpbmUgKSB7XG5cblx0XHR0aGlzLnN0YXJ0LmNvcHkoIGxpbmUuc3RhcnQgKTtcblx0XHR0aGlzLmVuZC5jb3B5KCBsaW5lLmVuZCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRDZW50ZXI6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblx0XHRyZXR1cm4gcmVzdWx0LmFkZFZlY3RvcnMoIHRoaXMuc3RhcnQsIHRoaXMuZW5kICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xuXG5cdH0sXG5cblx0ZGVsdGE6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblx0XHRyZXR1cm4gcmVzdWx0LnN1YlZlY3RvcnMoIHRoaXMuZW5kLCB0aGlzLnN0YXJ0ICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVNxOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvU3F1YXJlZCggdGhpcy5lbmQgKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvKCB0aGlzLmVuZCApO1xuXG5cdH0sXG5cblx0YXQ6IGZ1bmN0aW9uICggdCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiB0aGlzLmRlbHRhKCByZXN1bHQgKS5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy5zdGFydCApO1xuXG5cdH0sXG5cblx0Y2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHN0YXJ0UCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHN0YXJ0RW5kID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKCBwb2ludCwgY2xhbXBUb0xpbmUgKSB7XG5cblx0XHRcdHN0YXJ0UC5zdWJWZWN0b3JzKCBwb2ludCwgdGhpcy5zdGFydCApO1xuXHRcdFx0c3RhcnRFbmQuc3ViVmVjdG9ycyggdGhpcy5lbmQsIHRoaXMuc3RhcnQgKTtcblxuXHRcdFx0dmFyIHN0YXJ0RW5kMiA9IHN0YXJ0RW5kLmRvdCggc3RhcnRFbmQgKTtcblx0XHRcdHZhciBzdGFydEVuZF9zdGFydFAgPSBzdGFydEVuZC5kb3QoIHN0YXJ0UCApO1xuXG5cdFx0XHR2YXIgdCA9IHN0YXJ0RW5kX3N0YXJ0UCAvIHN0YXJ0RW5kMjtcblxuXHRcdFx0aWYgKCBjbGFtcFRvTGluZSApIHtcblxuXHRcdFx0XHR0ID0gX01hdGguY2xhbXAoIHQsIDAsIDEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdDtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIGNsYW1wVG9MaW5lLCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciB0ID0gdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKCBwb2ludCwgY2xhbXBUb0xpbmUgKTtcblxuXHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZGVsdGEoIHJlc3VsdCApLm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLnN0YXJ0ICk7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdFx0dGhpcy5zdGFydC5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXHRcdHRoaXMuZW5kLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBsaW5lICkge1xuXG5cdFx0cmV0dXJuIGxpbmUuc3RhcnQuZXF1YWxzKCB0aGlzLnN0YXJ0ICkgJiYgbGluZS5lbmQuZXF1YWxzKCB0aGlzLmVuZCApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gVHJpYW5nbGUoIGEsIGIsIGMgKSB7XG5cblx0dGhpcy5hID0gKCBhICE9PSB1bmRlZmluZWQgKSA/IGEgOiBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLmIgPSAoIGIgIT09IHVuZGVmaW5lZCApID8gYiA6IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMuYyA9ICggYyAhPT0gdW5kZWZpbmVkICkgPyBjIDogbmV3IFZlY3RvcjMoKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBUcmlhbmdsZSwge1xuXG5cdG5vcm1hbDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYwID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBub3JtYWwoIGEsIGIsIGMsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0cmVzdWx0LnN1YlZlY3RvcnMoIGMsIGIgKTtcblx0XHRcdHYwLnN1YlZlY3RvcnMoIGEsIGIgKTtcblx0XHRcdHJlc3VsdC5jcm9zcyggdjAgKTtcblxuXHRcdFx0dmFyIHJlc3VsdExlbmd0aFNxID0gcmVzdWx0Lmxlbmd0aFNxKCk7XG5cdFx0XHRpZiAoIHJlc3VsdExlbmd0aFNxID4gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0Lm11bHRpcGx5U2NhbGFyKCAxIC8gTWF0aC5zcXJ0KCByZXN1bHRMZW5ndGhTcSApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHJlc3VsdC5zZXQoIDAsIDAsIDAgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdC8vIHN0YXRpYy9pbnN0YW5jZSBtZXRob2QgdG8gY2FsY3VsYXRlIGJhcnljZW50cmljIGNvb3JkaW5hdGVzXG5cdC8vIGJhc2VkIG9uOiBodHRwOi8vd3d3LmJsYWNrcGF3bi5jb20vdGV4dHMvcG9pbnRpbnBvbHkvZGVmYXVsdC5odG1sXG5cdGJhcnljb29yZEZyb21Qb2ludDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYwID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2MiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gYmFyeWNvb3JkRnJvbVBvaW50KCBwb2ludCwgYSwgYiwgYywgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRcdHYwLnN1YlZlY3RvcnMoIGMsIGEgKTtcblx0XHRcdHYxLnN1YlZlY3RvcnMoIGIsIGEgKTtcblx0XHRcdHYyLnN1YlZlY3RvcnMoIHBvaW50LCBhICk7XG5cblx0XHRcdHZhciBkb3QwMCA9IHYwLmRvdCggdjAgKTtcblx0XHRcdHZhciBkb3QwMSA9IHYwLmRvdCggdjEgKTtcblx0XHRcdHZhciBkb3QwMiA9IHYwLmRvdCggdjIgKTtcblx0XHRcdHZhciBkb3QxMSA9IHYxLmRvdCggdjEgKTtcblx0XHRcdHZhciBkb3QxMiA9IHYxLmRvdCggdjIgKTtcblxuXHRcdFx0dmFyIGRlbm9tID0gKCBkb3QwMCAqIGRvdDExIC0gZG90MDEgKiBkb3QwMSApO1xuXG5cdFx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0Ly8gY29sbGluZWFyIG9yIHNpbmd1bGFyIHRyaWFuZ2xlXG5cdFx0XHRpZiAoIGRlbm9tID09PSAwICkge1xuXG5cdFx0XHRcdC8vIGFyYml0cmFyeSBsb2NhdGlvbiBvdXRzaWRlIG9mIHRyaWFuZ2xlP1xuXHRcdFx0XHQvLyBub3Qgc3VyZSBpZiB0aGlzIGlzIHRoZSBiZXN0IGlkZWEsIG1heWJlIHNob3VsZCBiZSByZXR1cm5pbmcgdW5kZWZpbmVkXG5cdFx0XHRcdHJldHVybiByZXN1bHQuc2V0KCAtIDIsIC0gMSwgLSAxICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGludkRlbm9tID0gMSAvIGRlbm9tO1xuXHRcdFx0dmFyIHUgPSAoIGRvdDExICogZG90MDIgLSBkb3QwMSAqIGRvdDEyICkgKiBpbnZEZW5vbTtcblx0XHRcdHZhciB2ID0gKCBkb3QwMCAqIGRvdDEyIC0gZG90MDEgKiBkb3QwMiApICogaW52RGVub207XG5cblx0XHRcdC8vIGJhcnljZW50cmljIGNvb3JkaW5hdGVzIG11c3QgYWx3YXlzIHN1bSB0byAxXG5cdFx0XHRyZXR1cm4gcmVzdWx0LnNldCggMSAtIHUgLSB2LCB2LCB1ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjb250YWluc1BvaW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNvbnRhaW5zUG9pbnQoIHBvaW50LCBhLCBiLCBjICkge1xuXG5cdFx0XHR2YXIgcmVzdWx0ID0gVHJpYW5nbGUuYmFyeWNvb3JkRnJvbVBvaW50KCBwb2ludCwgYSwgYiwgYywgdjEgKTtcblxuXHRcdFx0cmV0dXJuICggcmVzdWx0LnggPj0gMCApICYmICggcmVzdWx0LnkgPj0gMCApICYmICggKCByZXN1bHQueCArIHJlc3VsdC55ICkgPD0gMSApO1xuXG5cdFx0fTtcblxuXHR9KClcblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBUcmlhbmdsZS5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggYSwgYiwgYyApIHtcblxuXHRcdHRoaXMuYS5jb3B5KCBhICk7XG5cdFx0dGhpcy5iLmNvcHkoIGIgKTtcblx0XHR0aGlzLmMuY29weSggYyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tUG9pbnRzQW5kSW5kaWNlczogZnVuY3Rpb24gKCBwb2ludHMsIGkwLCBpMSwgaTIgKSB7XG5cblx0XHR0aGlzLmEuY29weSggcG9pbnRzWyBpMCBdICk7XG5cdFx0dGhpcy5iLmNvcHkoIHBvaW50c1sgaTEgXSApO1xuXHRcdHRoaXMuYy5jb3B5KCBwb2ludHNbIGkyIF0gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggdHJpYW5nbGUgKSB7XG5cblx0XHR0aGlzLmEuY29weSggdHJpYW5nbGUuYSApO1xuXHRcdHRoaXMuYi5jb3B5KCB0cmlhbmdsZS5iICk7XG5cdFx0dGhpcy5jLmNvcHkoIHRyaWFuZ2xlLmMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXJlYTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYwID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGFyZWEoKSB7XG5cblx0XHRcdHYwLnN1YlZlY3RvcnMoIHRoaXMuYywgdGhpcy5iICk7XG5cdFx0XHR2MS5zdWJWZWN0b3JzKCB0aGlzLmEsIHRoaXMuYiApO1xuXG5cdFx0XHRyZXR1cm4gdjAuY3Jvc3MoIHYxICkubGVuZ3RoKCkgKiAwLjU7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRtaWRwb2ludDogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXHRcdHJldHVybiByZXN1bHQuYWRkVmVjdG9ycyggdGhpcy5hLCB0aGlzLmIgKS5hZGQoIHRoaXMuYyApLm11bHRpcGx5U2NhbGFyKCAxIC8gMyApO1xuXG5cdH0sXG5cblx0bm9ybWFsOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0cmV0dXJuIFRyaWFuZ2xlLm5vcm1hbCggdGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgb3B0aW9uYWxUYXJnZXQgKTtcblxuXHR9LFxuXG5cdHBsYW5lOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBQbGFuZSgpO1xuXG5cdFx0cmV0dXJuIHJlc3VsdC5zZXRGcm9tQ29wbGFuYXJQb2ludHMoIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMgKTtcblxuXHR9LFxuXG5cdGJhcnljb29yZEZyb21Qb2ludDogZnVuY3Rpb24gKCBwb2ludCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRyZXR1cm4gVHJpYW5nbGUuYmFyeWNvb3JkRnJvbVBvaW50KCBwb2ludCwgdGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgb3B0aW9uYWxUYXJnZXQgKTtcblxuXHR9LFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gVHJpYW5nbGUuY29udGFpbnNQb2ludCggcG9pbnQsIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMgKTtcblxuXHR9LFxuXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBwbGFuZSA9IG5ldyBQbGFuZSgpO1xuXHRcdHZhciBlZGdlTGlzdCA9IFsgbmV3IExpbmUzKCksIG5ldyBMaW5lMygpLCBuZXcgTGluZTMoKSBdO1xuXHRcdHZhciBwcm9qZWN0ZWRQb2ludCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGNsb3Nlc3RQb2ludCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2xvc2VzdFBvaW50VG9Qb2ludCggcG9pbnQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblx0XHRcdHZhciBtaW5EaXN0YW5jZSA9IEluZmluaXR5O1xuXG5cdFx0XHQvLyBwcm9qZWN0IHRoZSBwb2ludCBvbnRvIHRoZSBwbGFuZSBvZiB0aGUgdHJpYW5nbGVcblxuXHRcdFx0cGxhbmUuc2V0RnJvbUNvcGxhbmFyUG9pbnRzKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jICk7XG5cdFx0XHRwbGFuZS5wcm9qZWN0UG9pbnQoIHBvaW50LCBwcm9qZWN0ZWRQb2ludCApO1xuXG5cdFx0XHQvLyBjaGVjayBpZiB0aGUgcHJvamVjdGlvbiBsaWVzIHdpdGhpbiB0aGUgdHJpYW5nbGVcblxuXHRcdFx0aWYoIHRoaXMuY29udGFpbnNQb2ludCggcHJvamVjdGVkUG9pbnQgKSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHQvLyBpZiBzbywgdGhpcyBpcyB0aGUgY2xvc2VzdCBwb2ludFxuXG5cdFx0XHRcdHJlc3VsdC5jb3B5KCBwcm9qZWN0ZWRQb2ludCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIGlmIG5vdCwgdGhlIHBvaW50IGZhbGxzIG91dHNpZGUgdGhlIHRyaWFuZ2xlLiB0aGUgcmVzdWx0IGlzIHRoZSBjbG9zZXN0IHBvaW50IHRvIHRoZSB0cmlhbmdsZSdzIGVkZ2VzIG9yIHZlcnRpY2VzXG5cblx0XHRcdFx0ZWRnZUxpc3RbIDAgXS5zZXQoIHRoaXMuYSwgdGhpcy5iICk7XG5cdFx0XHRcdGVkZ2VMaXN0WyAxIF0uc2V0KCB0aGlzLmIsIHRoaXMuYyApO1xuXHRcdFx0XHRlZGdlTGlzdFsgMiBdLnNldCggdGhpcy5jLCB0aGlzLmEgKTtcblxuXHRcdFx0XHRmb3IoIHZhciBpID0gMDsgaSA8IGVkZ2VMaXN0Lmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGVkZ2VMaXN0WyBpIF0uY2xvc2VzdFBvaW50VG9Qb2ludCggcHJvamVjdGVkUG9pbnQsIHRydWUsIGNsb3Nlc3RQb2ludCApO1xuXG5cdFx0XHRcdFx0dmFyIGRpc3RhbmNlID0gcHJvamVjdGVkUG9pbnQuZGlzdGFuY2VUb1NxdWFyZWQoIGNsb3Nlc3RQb2ludCApO1xuXG5cdFx0XHRcdFx0aWYoIGRpc3RhbmNlIDwgbWluRGlzdGFuY2UgKSB7XG5cblx0XHRcdFx0XHRcdG1pbkRpc3RhbmNlID0gZGlzdGFuY2U7XG5cblx0XHRcdFx0XHRcdHJlc3VsdC5jb3B5KCBjbG9zZXN0UG9pbnQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCB0cmlhbmdsZSApIHtcblxuXHRcdHJldHVybiB0cmlhbmdsZS5hLmVxdWFscyggdGhpcy5hICkgJiYgdHJpYW5nbGUuYi5lcXVhbHMoIHRoaXMuYiApICYmIHRyaWFuZ2xlLmMuZXF1YWxzKCB0aGlzLmMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBGYWNlMyggYSwgYiwgYywgbm9ybWFsLCBjb2xvciwgbWF0ZXJpYWxJbmRleCApIHtcblxuXHR0aGlzLmEgPSBhO1xuXHR0aGlzLmIgPSBiO1xuXHR0aGlzLmMgPSBjO1xuXG5cdHRoaXMubm9ybWFsID0gKCBub3JtYWwgJiYgbm9ybWFsLmlzVmVjdG9yMyApID8gbm9ybWFsIDogbmV3IFZlY3RvcjMoKTtcblx0dGhpcy52ZXJ0ZXhOb3JtYWxzID0gQXJyYXkuaXNBcnJheSggbm9ybWFsICkgPyBub3JtYWwgOiBbXTtcblxuXHR0aGlzLmNvbG9yID0gKCBjb2xvciAmJiBjb2xvci5pc0NvbG9yICkgPyBjb2xvciA6IG5ldyBDb2xvcigpO1xuXHR0aGlzLnZlcnRleENvbG9ycyA9IEFycmF5LmlzQXJyYXkoIGNvbG9yICkgPyBjb2xvciA6IFtdO1xuXG5cdHRoaXMubWF0ZXJpYWxJbmRleCA9IG1hdGVyaWFsSW5kZXggIT09IHVuZGVmaW5lZCA/IG1hdGVyaWFsSW5kZXggOiAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEZhY2UzLnByb3RvdHlwZSwge1xuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHRoaXMuYSA9IHNvdXJjZS5hO1xuXHRcdHRoaXMuYiA9IHNvdXJjZS5iO1xuXHRcdHRoaXMuYyA9IHNvdXJjZS5jO1xuXG5cdFx0dGhpcy5ub3JtYWwuY29weSggc291cmNlLm5vcm1hbCApO1xuXHRcdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0XHR0aGlzLm1hdGVyaWFsSW5kZXggPSBzb3VyY2UubWF0ZXJpYWxJbmRleDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBzb3VyY2UudmVydGV4Tm9ybWFscy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy52ZXJ0ZXhOb3JtYWxzWyBpIF0gPSBzb3VyY2UudmVydGV4Tm9ybWFsc1sgaSBdLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gc291cmNlLnZlcnRleENvbG9ycy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy52ZXJ0ZXhDb2xvcnNbIGkgXSA9IHNvdXJjZS52ZXJ0ZXhDb2xvcnNbIGkgXS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIHNwZWN1bGFyTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgZW52TWFwOiBuZXcgVEhSRUUuVGV4dHVyZUN1YmUoIFtwb3N4LCBuZWd4LCBwb3N5LCBuZWd5LCBwb3N6LCBuZWd6XSApLFxuICogIGNvbWJpbmU6IFRIUkVFLk11bHRpcGx5LFxuICogIHJlZmxlY3Rpdml0eTogPGZsb2F0PixcbiAqICByZWZyYWN0aW9uUmF0aW86IDxmbG9hdD4sXG4gKlxuICogIHNoYWRpbmc6IFRIUkVFLlNtb290aFNoYWRpbmcsXG4gKiAgZGVwdGhUZXN0OiA8Ym9vbD4sXG4gKiAgZGVwdGhXcml0ZTogPGJvb2w+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoQmFzaWNNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ01lc2hCYXNpY01hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOyAvLyBlbWlzc2l2ZVxuXG5cdHRoaXMubWFwID0gbnVsbDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gbnVsbDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLmFvTWFwID0gbnVsbDtcblx0dGhpcy5hb01hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLnNwZWN1bGFyTWFwID0gbnVsbDtcblxuXHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHR0aGlzLmVudk1hcCA9IG51bGw7XG5cdHRoaXMuY29tYmluZSA9IE11bHRpcGx5T3BlcmF0aW9uO1xuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IDE7XG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gMC45ODtcblxuXHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAncm91bmQnO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblxuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaEJhc2ljTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoQmFzaWNNYXRlcmlhbDtcblxuTWVzaEJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaEJhc2ljTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBzb3VyY2UubGlnaHRNYXA7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5hb01hcCA9IHNvdXJjZS5hb01hcDtcblx0dGhpcy5hb01hcEludGVuc2l0eSA9IHNvdXJjZS5hb01hcEludGVuc2l0eTtcblxuXHR0aGlzLnNwZWN1bGFyTWFwID0gc291cmNlLnNwZWN1bGFyTWFwO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0dGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwO1xuXHR0aGlzLmNvbWJpbmUgPSBzb3VyY2UuY29tYmluZTtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSBzb3VyY2UucmVmbGVjdGl2aXR5O1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IHNvdXJjZS5yZWZyYWN0aW9uUmF0aW87XG5cblx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHNvdXJjZS53aXJlZnJhbWVMaW5lY2FwO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gc291cmNlLndpcmVmcmFtZUxpbmVqb2luO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdGlmICggQXJyYXkuaXNBcnJheSggYXJyYXkgKSApIHtcblxuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNob3VsZCBiZSBhIFR5cGVkIEFycmF5LicgKTtcblxuXHR9XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy5hcnJheSA9IGFycmF5O1xuXHR0aGlzLml0ZW1TaXplID0gaXRlbVNpemU7XG5cdHRoaXMuY291bnQgPSBhcnJheSAhPT0gdW5kZWZpbmVkID8gYXJyYXkubGVuZ3RoIC8gaXRlbVNpemUgOiAwO1xuXHR0aGlzLm5vcm1hbGl6ZWQgPSBub3JtYWxpemVkID09PSB0cnVlO1xuXG5cdHRoaXMuZHluYW1pYyA9IGZhbHNlO1xuXHR0aGlzLnVwZGF0ZVJhbmdlID0geyBvZmZzZXQ6IDAsIGNvdW50OiAtIDEgfTtcblxuXHR0aGlzLm9uVXBsb2FkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTtcblxuXHR0aGlzLnZlcnNpb24gPSAwO1xuXG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwgJ25lZWRzVXBkYXRlJywge1xuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHtcblxuXHRpc0J1ZmZlckF0dHJpYnV0ZTogdHJ1ZSxcblxuXHRzZXRBcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggYXJyYXkgKSApIHtcblxuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvciggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jb3VudCA9IGFycmF5ICE9PSB1bmRlZmluZWQgPyBhcnJheS5sZW5ndGggLyB0aGlzLml0ZW1TaXplIDogMDtcblx0XHR0aGlzLmFycmF5ID0gYXJyYXk7XG5cblx0fSxcblxuXHRzZXREeW5hbWljOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5keW5hbWljID0gdmFsdWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5hcnJheSA9IG5ldyBzb3VyY2UuYXJyYXkuY29uc3RydWN0b3IoIHNvdXJjZS5hcnJheSApO1xuXHRcdHRoaXMuaXRlbVNpemUgPSBzb3VyY2UuaXRlbVNpemU7XG5cdFx0dGhpcy5jb3VudCA9IHNvdXJjZS5jb3VudDtcblx0XHR0aGlzLm5vcm1hbGl6ZWQgPSBzb3VyY2Uubm9ybWFsaXplZDtcblxuXHRcdHRoaXMuZHluYW1pYyA9IHNvdXJjZS5keW5hbWljO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5QXQ6IGZ1bmN0aW9uICggaW5kZXgxLCBhdHRyaWJ1dGUsIGluZGV4MiApIHtcblxuXHRcdGluZGV4MSAqPSB0aGlzLml0ZW1TaXplO1xuXHRcdGluZGV4MiAqPSBhdHRyaWJ1dGUuaXRlbVNpemU7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLml0ZW1TaXplOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5hcnJheVsgaW5kZXgxICsgaSBdID0gYXR0cmlidXRlLmFycmF5WyBpbmRleDIgKyBpIF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlBcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdHRoaXMuYXJyYXkuc2V0KCBhcnJheSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5Q29sb3JzQXJyYXk6IGZ1bmN0aW9uICggY29sb3JzICkge1xuXG5cdFx0dmFyIGFycmF5ID0gdGhpcy5hcnJheSwgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNvbG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY29sb3IgPSBjb2xvcnNbIGkgXTtcblxuXHRcdFx0aWYgKCBjb2xvciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5Q29sb3JzQXJyYXkoKTogY29sb3IgaXMgdW5kZWZpbmVkJywgaSApO1xuXHRcdFx0XHRjb2xvciA9IG5ldyBDb2xvcigpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IGNvbG9yLnI7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSBjb2xvci5nO1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gY29sb3IuYjtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weUluZGljZXNBcnJheTogZnVuY3Rpb24gKCBpbmRpY2VzICkge1xuXG5cdFx0dmFyIGFycmF5ID0gdGhpcy5hcnJheSwgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGluZGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGluZGV4ID0gaW5kaWNlc1sgaSBdO1xuXG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSBpbmRleC5hO1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gaW5kZXguYjtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IGluZGV4LmM7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlWZWN0b3Iyc0FycmF5OiBmdW5jdGlvbiAoIHZlY3RvcnMgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdmVjdG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVjdG9yID0gdmVjdG9yc1sgaSBdO1xuXG5cdFx0XHRpZiAoIHZlY3RvciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yMnNBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkJywgaSApO1xuXHRcdFx0XHR2ZWN0b3IgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci54O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLnk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlWZWN0b3Izc0FycmF5OiBmdW5jdGlvbiAoIHZlY3RvcnMgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdmVjdG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVjdG9yID0gdmVjdG9yc1sgaSBdO1xuXG5cdFx0XHRpZiAoIHZlY3RvciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkJywgaSApO1xuXHRcdFx0XHR2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci54O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLnk7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IuejtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weVZlY3RvcjRzQXJyYXk6IGZ1bmN0aW9uICggdmVjdG9ycyApIHtcblxuXHRcdHZhciBhcnJheSA9IHRoaXMuYXJyYXksIG9mZnNldCA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB2ZWN0b3JzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciB2ZWN0b3IgPSB2ZWN0b3JzWyBpIF07XG5cblx0XHRcdGlmICggdmVjdG9yID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3I0c0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQnLCBpICk7XG5cdFx0XHRcdHZlY3RvciA9IG5ldyBWZWN0b3I0KCk7XG5cblx0XHRcdH1cblxuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLng7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueTtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci56O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLnc7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLmFycmF5LnNldCggdmFsdWUsIG9mZnNldCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRYOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSBdO1xuXG5cdH0sXG5cblx0c2V0WDogZnVuY3Rpb24gKCBpbmRleCwgeCApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSBdID0geDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0WTogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAxIF07XG5cblx0fSxcblxuXHRzZXRZOiBmdW5jdGlvbiAoIGluZGV4LCB5ICkge1xuXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMSBdID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0WjogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAyIF07XG5cblx0fSxcblxuXHRzZXRaOiBmdW5jdGlvbiAoIGluZGV4LCB6ICkge1xuXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMiBdID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0VzogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAzIF07XG5cblx0fSxcblxuXHRzZXRXOiBmdW5jdGlvbiAoIGluZGV4LCB3ICkge1xuXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMyBdID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WFk6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHkgKSB7XG5cblx0XHRpbmRleCAqPSB0aGlzLml0ZW1TaXplO1xuXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMSBdID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WFlaOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5LCB6ICkge1xuXG5cdFx0aW5kZXggKj0gdGhpcy5pdGVtU2l6ZTtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAyIF0gPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYWVpXOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5LCB6LCB3ICkge1xuXG5cdFx0aW5kZXggKj0gdGhpcy5pdGVtU2l6ZTtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAyIF0gPSB6O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMyBdID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0b25VcGxvYWQ6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHR0aGlzLm9uVXBsb2FkQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5hcnJheSwgdGhpcy5pdGVtU2l6ZSApLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLy9cblxuZnVuY3Rpb24gSW50OEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgSW50OEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSApO1xuXG59XG5cbkludDhCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuSW50OEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbnQ4QnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIFVpbnQ4QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50OEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSApO1xuXG59XG5cblVpbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcblVpbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFVpbnQ4QnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgVWludDhDbGFtcGVkQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplICk7XG5cbn1cblxuVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcblVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gSW50MTZCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEludDE2QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplICk7XG5cbn1cblxuSW50MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuSW50MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50MTZCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gVWludDE2QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50MTZBcnJheSggYXJyYXkgKSwgaXRlbVNpemUgKTtcblxufVxuXG5VaW50MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuVWludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBJbnQzMkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgSW50MzJBcnJheSggYXJyYXkgKSwgaXRlbVNpemUgKTtcblxufVxuXG5JbnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5JbnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbnQzMkJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBVaW50MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IFVpbnQzMkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSApO1xuXG59XG5cblVpbnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5VaW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVWludDMyQnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEZsb2F0MzJBcnJheSggYXJyYXkgKSwgaXRlbVNpemUgKTtcblxufVxuXG5GbG9hdDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcbkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBGbG9hdDY0QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBGbG9hdDY0QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplICk7XG5cbn1cblxuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5GbG9hdDY0QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGU7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBEaXJlY3RHZW9tZXRyeSgpIHtcblxuXHR0aGlzLmluZGljZXMgPSBbXTtcblx0dGhpcy52ZXJ0aWNlcyA9IFtdO1xuXHR0aGlzLm5vcm1hbHMgPSBbXTtcblx0dGhpcy5jb2xvcnMgPSBbXTtcblx0dGhpcy51dnMgPSBbXTtcblx0dGhpcy51dnMyID0gW107XG5cblx0dGhpcy5ncm91cHMgPSBbXTtcblxuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHt9O1xuXG5cdHRoaXMuc2tpbldlaWdodHMgPSBbXTtcblx0dGhpcy5za2luSW5kaWNlcyA9IFtdO1xuXG5cdC8vIHRoaXMubGluZURpc3RhbmNlcyA9IFtdO1xuXG5cdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xuXHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDtcblxuXHQvLyB1cGRhdGUgZmxhZ3NcblxuXHR0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMuY29sb3JzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLnV2c05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5ncm91cHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRGlyZWN0R2VvbWV0cnkucHJvdG90eXBlLCB7XG5cblx0Y29tcHV0ZUdyb3VwczogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHtcblxuXHRcdHZhciBncm91cDtcblx0XHR2YXIgZ3JvdXBzID0gW107XG5cdFx0dmFyIG1hdGVyaWFsSW5kZXggPSB1bmRlZmluZWQ7XG5cblx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGZhY2VzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHQvLyBtYXRlcmlhbHNcblxuXHRcdFx0aWYgKCBmYWNlLm1hdGVyaWFsSW5kZXggIT09IG1hdGVyaWFsSW5kZXggKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWxJbmRleCA9IGZhY2UubWF0ZXJpYWxJbmRleDtcblxuXHRcdFx0XHRpZiAoIGdyb3VwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRncm91cC5jb3VudCA9ICggaSAqIDMgKSAtIGdyb3VwLnN0YXJ0O1xuXHRcdFx0XHRcdGdyb3Vwcy5wdXNoKCBncm91cCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRncm91cCA9IHtcblx0XHRcdFx0XHRzdGFydDogaSAqIDMsXG5cdFx0XHRcdFx0bWF0ZXJpYWxJbmRleDogbWF0ZXJpYWxJbmRleFxuXHRcdFx0XHR9O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIGdyb3VwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGdyb3VwLmNvdW50ID0gKCBpICogMyApIC0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRncm91cHMucHVzaCggZ3JvdXAgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuZ3JvdXBzID0gZ3JvdXBzO1xuXG5cdH0sXG5cblx0ZnJvbUdlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIGZhY2VzID0gZ2VvbWV0cnkuZmFjZXM7XG5cdFx0dmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7XG5cdFx0dmFyIGZhY2VWZXJ0ZXhVdnMgPSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzO1xuXG5cdFx0dmFyIGhhc0ZhY2VWZXJ0ZXhVdiA9IGZhY2VWZXJ0ZXhVdnNbIDAgXSAmJiBmYWNlVmVydGV4VXZzWyAwIF0ubGVuZ3RoID4gMDtcblx0XHR2YXIgaGFzRmFjZVZlcnRleFV2MiA9IGZhY2VWZXJ0ZXhVdnNbIDEgXSAmJiBmYWNlVmVydGV4VXZzWyAxIF0ubGVuZ3RoID4gMDtcblxuXHRcdC8vIG1vcnBoc1xuXG5cdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cztcblx0XHR2YXIgbW9ycGhUYXJnZXRzTGVuZ3RoID0gbW9ycGhUYXJnZXRzLmxlbmd0aDtcblxuXHRcdHZhciBtb3JwaFRhcmdldHNQb3NpdGlvbjtcblxuXHRcdGlmICggbW9ycGhUYXJnZXRzTGVuZ3RoID4gMCApIHtcblxuXHRcdFx0bW9ycGhUYXJnZXRzUG9zaXRpb24gPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbW9ycGhUYXJnZXRzTGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdG1vcnBoVGFyZ2V0c1Bvc2l0aW9uWyBpIF0gPSBbXTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0cy5wb3NpdGlvbiA9IG1vcnBoVGFyZ2V0c1Bvc2l0aW9uO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG1vcnBoTm9ybWFscyA9IGdlb21ldHJ5Lm1vcnBoTm9ybWFscztcblx0XHR2YXIgbW9ycGhOb3JtYWxzTGVuZ3RoID0gbW9ycGhOb3JtYWxzLmxlbmd0aDtcblxuXHRcdHZhciBtb3JwaFRhcmdldHNOb3JtYWw7XG5cblx0XHRpZiAoIG1vcnBoTm9ybWFsc0xlbmd0aCA+IDAgKSB7XG5cblx0XHRcdG1vcnBoVGFyZ2V0c05vcm1hbCA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBtb3JwaE5vcm1hbHNMZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0bW9ycGhUYXJnZXRzTm9ybWFsWyBpIF0gPSBbXTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0cy5ub3JtYWwgPSBtb3JwaFRhcmdldHNOb3JtYWw7XG5cblx0XHR9XG5cblx0XHQvLyBza2luc1xuXG5cdFx0dmFyIHNraW5JbmRpY2VzID0gZ2VvbWV0cnkuc2tpbkluZGljZXM7XG5cdFx0dmFyIHNraW5XZWlnaHRzID0gZ2VvbWV0cnkuc2tpbldlaWdodHM7XG5cblx0XHR2YXIgaGFzU2tpbkluZGljZXMgPSBza2luSW5kaWNlcy5sZW5ndGggPT09IHZlcnRpY2VzLmxlbmd0aDtcblx0XHR2YXIgaGFzU2tpbldlaWdodHMgPSBza2luV2VpZ2h0cy5sZW5ndGggPT09IHZlcnRpY2VzLmxlbmd0aDtcblxuXHRcdC8vXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBmYWNlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdFx0dGhpcy52ZXJ0aWNlcy5wdXNoKCB2ZXJ0aWNlc1sgZmFjZS5hIF0sIHZlcnRpY2VzWyBmYWNlLmIgXSwgdmVydGljZXNbIGZhY2UuYyBdICk7XG5cblx0XHRcdHZhciB2ZXJ0ZXhOb3JtYWxzID0gZmFjZS52ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRpZiAoIHZlcnRleE5vcm1hbHMubGVuZ3RoID09PSAzICkge1xuXG5cdFx0XHRcdHRoaXMubm9ybWFscy5wdXNoKCB2ZXJ0ZXhOb3JtYWxzWyAwIF0sIHZlcnRleE5vcm1hbHNbIDEgXSwgdmVydGV4Tm9ybWFsc1sgMiBdICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmFyIG5vcm1hbCA9IGZhY2Uubm9ybWFsO1xuXG5cdFx0XHRcdHRoaXMubm9ybWFscy5wdXNoKCBub3JtYWwsIG5vcm1hbCwgbm9ybWFsICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHZlcnRleENvbG9ycyA9IGZhY2UudmVydGV4Q29sb3JzO1xuXG5cdFx0XHRpZiAoIHZlcnRleENvbG9ycy5sZW5ndGggPT09IDMgKSB7XG5cblx0XHRcdFx0dGhpcy5jb2xvcnMucHVzaCggdmVydGV4Q29sb3JzWyAwIF0sIHZlcnRleENvbG9yc1sgMSBdLCB2ZXJ0ZXhDb2xvcnNbIDIgXSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZhciBjb2xvciA9IGZhY2UuY29sb3I7XG5cblx0XHRcdFx0dGhpcy5jb2xvcnMucHVzaCggY29sb3IsIGNvbG9yLCBjb2xvciApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZVZlcnRleFV2ID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHZhciB2ZXJ0ZXhVdnMgPSBmYWNlVmVydGV4VXZzWyAwIF1bIGkgXTtcblxuXHRcdFx0XHRpZiAoIHZlcnRleFV2cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGhpcy51dnMucHVzaCggdmVydGV4VXZzWyAwIF0sIHZlcnRleFV2c1sgMSBdLCB2ZXJ0ZXhVdnNbIDIgXSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5EaXJlY3RHZW9tZXRyeS5mcm9tR2VvbWV0cnkoKTogVW5kZWZpbmVkIHZlcnRleFV2ICcsIGkgKTtcblxuXHRcdFx0XHRcdHRoaXMudXZzLnB1c2goIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4VXYyID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHZhciB2ZXJ0ZXhVdnMgPSBmYWNlVmVydGV4VXZzWyAxIF1bIGkgXTtcblxuXHRcdFx0XHRpZiAoIHZlcnRleFV2cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGhpcy51dnMyLnB1c2goIHZlcnRleFV2c1sgMCBdLCB2ZXJ0ZXhVdnNbIDEgXSwgdmVydGV4VXZzWyAyIF0gKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRGlyZWN0R2VvbWV0cnkuZnJvbUdlb21ldHJ5KCk6IFVuZGVmaW5lZCB2ZXJ0ZXhVdjIgJywgaSApO1xuXG5cdFx0XHRcdFx0dGhpcy51dnMyLnB1c2goIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gbW9ycGhzXG5cblx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IG1vcnBoVGFyZ2V0c0xlbmd0aDsgaiArKyApIHtcblxuXHRcdFx0XHR2YXIgbW9ycGhUYXJnZXQgPSBtb3JwaFRhcmdldHNbIGogXS52ZXJ0aWNlcztcblxuXHRcdFx0XHRtb3JwaFRhcmdldHNQb3NpdGlvblsgaiBdLnB1c2goIG1vcnBoVGFyZ2V0WyBmYWNlLmEgXSwgbW9ycGhUYXJnZXRbIGZhY2UuYiBdLCBtb3JwaFRhcmdldFsgZmFjZS5jIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCBtb3JwaE5vcm1hbHNMZW5ndGg7IGogKysgKSB7XG5cblx0XHRcdFx0dmFyIG1vcnBoTm9ybWFsID0gbW9ycGhOb3JtYWxzWyBqIF0udmVydGV4Tm9ybWFsc1sgaSBdO1xuXG5cdFx0XHRcdG1vcnBoVGFyZ2V0c05vcm1hbFsgaiBdLnB1c2goIG1vcnBoTm9ybWFsLmEsIG1vcnBoTm9ybWFsLmIsIG1vcnBoTm9ybWFsLmMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBza2luc1xuXG5cdFx0XHRpZiAoIGhhc1NraW5JbmRpY2VzICkge1xuXG5cdFx0XHRcdHRoaXMuc2tpbkluZGljZXMucHVzaCggc2tpbkluZGljZXNbIGZhY2UuYSBdLCBza2luSW5kaWNlc1sgZmFjZS5iIF0sIHNraW5JbmRpY2VzWyBmYWNlLmMgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzU2tpbldlaWdodHMgKSB7XG5cblx0XHRcdFx0dGhpcy5za2luV2VpZ2h0cy5wdXNoKCBza2luV2VpZ2h0c1sgZmFjZS5hIF0sIHNraW5XZWlnaHRzWyBmYWNlLmIgXSwgc2tpbldlaWdodHNbIGZhY2UuYyBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuY29tcHV0ZUdyb3VwcyggZ2VvbWV0cnkgKTtcblxuXHRcdHRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gZ2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlO1xuXHRcdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSBnZW9tZXRyeS5ub3JtYWxzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLmNvbG9yc05lZWRVcGRhdGUgPSBnZW9tZXRyeS5jb2xvcnNOZWVkVXBkYXRlO1xuXHRcdHRoaXMudXZzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LnV2c05lZWRVcGRhdGU7XG5cdFx0dGhpcy5ncm91cHNOZWVkVXBkYXRlID0gZ2VvbWV0cnkuZ3JvdXBzTmVlZFVwZGF0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG5mdW5jdGlvbiBhcnJheU1heCggYXJyYXkgKSB7XG5cblx0aWYgKCBhcnJheS5sZW5ndGggPT09IDAgKSByZXR1cm4gLSBJbmZpbml0eTtcblxuXHR2YXIgbWF4ID0gYXJyYXlbIDAgXTtcblxuXHRmb3IgKCB2YXIgaSA9IDEsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyArKyBpICkge1xuXG5cdFx0aWYgKCBhcnJheVsgaSBdID4gbWF4ICkgbWF4ID0gYXJyYXlbIGkgXTtcblxuXHR9XG5cblx0cmV0dXJuIG1heDtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGtpbGUgLyBodHRwOi8va2lsZS5zdHJhdmFnYW56YS5vcmcvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG52YXIgY291bnQgPSAwO1xuZnVuY3Rpb24gR2VvbWV0cnlJZENvdW50KCkgeyByZXR1cm4gY291bnQrKzsgfVxuXG5mdW5jdGlvbiBHZW9tZXRyeSgpIHtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IEdlb21ldHJ5SWRDb3VudCgpIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLm5hbWUgPSAnJztcblx0dGhpcy50eXBlID0gJ0dlb21ldHJ5JztcblxuXHR0aGlzLnZlcnRpY2VzID0gW107XG5cdHRoaXMuY29sb3JzID0gW107XG5cdHRoaXMuZmFjZXMgPSBbXTtcblx0dGhpcy5mYWNlVmVydGV4VXZzID0gW1tdXTtcblxuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IFtdO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IFtdO1xuXG5cdHRoaXMuc2tpbldlaWdodHMgPSBbXTtcblx0dGhpcy5za2luSW5kaWNlcyA9IFtdO1xuXG5cdHRoaXMubGluZURpc3RhbmNlcyA9IFtdO1xuXG5cdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xuXHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDtcblxuXHQvLyB1cGRhdGUgZmxhZ3NcblxuXHR0aGlzLmVsZW1lbnRzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLnV2c05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLmNvbG9yc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBHZW9tZXRyeS5wcm90b3R5cGUsIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUsIHtcblxuXHRpc0dlb21ldHJ5OiB0cnVlLFxuXG5cdGFwcGx5TWF0cml4OiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdHZhciBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpLmdldE5vcm1hbE1hdHJpeCggbWF0cml4ICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlcnRleCA9IHRoaXMudmVydGljZXNbIGkgXTtcblx0XHRcdHZlcnRleC5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gdGhpcy5mYWNlc1sgaSBdO1xuXHRcdFx0ZmFjZS5ub3JtYWwuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGZhY2UudmVydGV4Tm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRmYWNlLnZlcnRleE5vcm1hbHNbIGogXS5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IHRydWU7XG5cdFx0dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IHRydWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdGF0ZVg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgeC1heGlzXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVgoIGFuZ2xlICkge1xuXG5cdFx0XHRtMS5tYWtlUm90YXRpb25YKCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgeS1heGlzXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVkoIGFuZ2xlICkge1xuXG5cdFx0XHRtMS5tYWtlUm90YXRpb25ZKCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVo6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgei1heGlzXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVooIGFuZ2xlICkge1xuXG5cdFx0XHRtMS5tYWtlUm90YXRpb25aKCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gdHJhbnNsYXRlIGdlb21ldHJ5XG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZSggeCwgeSwgeiApIHtcblxuXHRcdFx0bTEubWFrZVRyYW5zbGF0aW9uKCB4LCB5LCB6ICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0c2NhbGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHNjYWxlIGdlb21ldHJ5XG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNjYWxlKCB4LCB5LCB6ICkge1xuXG5cdFx0XHRtMS5tYWtlU2NhbGUoIHgsIHksIHogKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRsb29rQXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvYmogPSBuZXcgT2JqZWN0M0QoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBsb29rQXQoIHZlY3RvciApIHtcblxuXHRcdFx0b2JqLmxvb2tBdCggdmVjdG9yICk7XG5cblx0XHRcdG9iai51cGRhdGVNYXRyaXgoKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggb2JqLm1hdHJpeCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0ZnJvbUJ1ZmZlckdlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBpbmRpY2VzID0gZ2VvbWV0cnkuaW5kZXggIT09IG51bGwgPyBnZW9tZXRyeS5pbmRleC5hcnJheSA6IHVuZGVmaW5lZDtcblx0XHR2YXIgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cblx0XHR2YXIgcG9zaXRpb25zID0gYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcblx0XHR2YXIgbm9ybWFscyA9IGF0dHJpYnV0ZXMubm9ybWFsICE9PSB1bmRlZmluZWQgPyBhdHRyaWJ1dGVzLm5vcm1hbC5hcnJheSA6IHVuZGVmaW5lZDtcblx0XHR2YXIgY29sb3JzID0gYXR0cmlidXRlcy5jb2xvciAhPT0gdW5kZWZpbmVkID8gYXR0cmlidXRlcy5jb2xvci5hcnJheSA6IHVuZGVmaW5lZDtcblx0XHR2YXIgdXZzID0gYXR0cmlidXRlcy51diAhPT0gdW5kZWZpbmVkID8gYXR0cmlidXRlcy51di5hcnJheSA6IHVuZGVmaW5lZDtcblx0XHR2YXIgdXZzMiA9IGF0dHJpYnV0ZXMudXYyICE9PSB1bmRlZmluZWQgPyBhdHRyaWJ1dGVzLnV2Mi5hcnJheSA6IHVuZGVmaW5lZDtcblxuXHRcdGlmICggdXZzMiAhPT0gdW5kZWZpbmVkICkgdGhpcy5mYWNlVmVydGV4VXZzWyAxIF0gPSBbXTtcblxuXHRcdHZhciB0ZW1wTm9ybWFscyA9IFtdO1xuXHRcdHZhciB0ZW1wVVZzID0gW107XG5cdFx0dmFyIHRlbXBVVnMyID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGogPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSArPSAzLCBqICs9IDIgKSB7XG5cblx0XHRcdHNjb3BlLnZlcnRpY2VzLnB1c2goIG5ldyBWZWN0b3IzKCBwb3NpdGlvbnNbIGkgXSwgcG9zaXRpb25zWyBpICsgMSBdLCBwb3NpdGlvbnNbIGkgKyAyIF0gKSApO1xuXG5cdFx0XHRpZiAoIG5vcm1hbHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0ZW1wTm9ybWFscy5wdXNoKCBuZXcgVmVjdG9yMyggbm9ybWFsc1sgaSBdLCBub3JtYWxzWyBpICsgMSBdLCBub3JtYWxzWyBpICsgMiBdICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGNvbG9ycyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHNjb3BlLmNvbG9ycy5wdXNoKCBuZXcgQ29sb3IoIGNvbG9yc1sgaSBdLCBjb2xvcnNbIGkgKyAxIF0sIGNvbG9yc1sgaSArIDIgXSApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB1dnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0ZW1wVVZzLnB1c2goIG5ldyBWZWN0b3IyKCB1dnNbIGogXSwgdXZzWyBqICsgMSBdICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHV2czIgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0ZW1wVVZzMi5wdXNoKCBuZXcgVmVjdG9yMiggdXZzMlsgaiBdLCB1dnMyWyBqICsgMSBdICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gYWRkRmFjZSggYSwgYiwgYywgbWF0ZXJpYWxJbmRleCApIHtcblxuXHRcdFx0dmFyIHZlcnRleE5vcm1hbHMgPSBub3JtYWxzICE9PSB1bmRlZmluZWQgPyBbIHRlbXBOb3JtYWxzWyBhIF0uY2xvbmUoKSwgdGVtcE5vcm1hbHNbIGIgXS5jbG9uZSgpLCB0ZW1wTm9ybWFsc1sgYyBdLmNsb25lKCkgXSA6IFtdO1xuXHRcdFx0dmFyIHZlcnRleENvbG9ycyA9IGNvbG9ycyAhPT0gdW5kZWZpbmVkID8gWyBzY29wZS5jb2xvcnNbIGEgXS5jbG9uZSgpLCBzY29wZS5jb2xvcnNbIGIgXS5jbG9uZSgpLCBzY29wZS5jb2xvcnNbIGMgXS5jbG9uZSgpIF0gOiBbXTtcblxuXHRcdFx0dmFyIGZhY2UgPSBuZXcgRmFjZTMoIGEsIGIsIGMsIHZlcnRleE5vcm1hbHMsIHZlcnRleENvbG9ycywgbWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0XHRzY29wZS5mYWNlcy5wdXNoKCBmYWNlICk7XG5cblx0XHRcdGlmICggdXZzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0c2NvcGUuZmFjZVZlcnRleFV2c1sgMCBdLnB1c2goIFsgdGVtcFVWc1sgYSBdLmNsb25lKCksIHRlbXBVVnNbIGIgXS5jbG9uZSgpLCB0ZW1wVVZzWyBjIF0uY2xvbmUoKSBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB1dnMyICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0c2NvcGUuZmFjZVZlcnRleFV2c1sgMSBdLnB1c2goIFsgdGVtcFVWczJbIGEgXS5jbG9uZSgpLCB0ZW1wVVZzMlsgYiBdLmNsb25lKCksIHRlbXBVVnMyWyBjIF0uY2xvbmUoKSBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cblx0XHRpZiAoIGdyb3Vwcy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgaSBdO1xuXG5cdFx0XHRcdHZhciBzdGFydCA9IGdyb3VwLnN0YXJ0O1xuXHRcdFx0XHR2YXIgY291bnQgPSBncm91cC5jb3VudDtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IHN0YXJ0LCBqbCA9IHN0YXJ0ICsgY291bnQ7IGogPCBqbDsgaiArPSAzICkge1xuXG5cdFx0XHRcdFx0aWYgKCBpbmRpY2VzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdGFkZEZhY2UoIGluZGljZXNbIGogXSwgaW5kaWNlc1sgaiArIDEgXSwgaW5kaWNlc1sgaiArIDIgXSwgZ3JvdXAubWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0YWRkRmFjZSggaiwgaiArIDEsIGogKyAyLCBncm91cC5tYXRlcmlhbEluZGV4ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRpZiAoIGluZGljZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0YWRkRmFjZSggaW5kaWNlc1sgaSBdLCBpbmRpY2VzWyBpICsgMSBdLCBpbmRpY2VzWyBpICsgMiBdICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGggLyAzOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0XHRhZGRGYWNlKCBpLCBpICsgMSwgaSArIDIgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuY29tcHV0ZUZhY2VOb3JtYWxzKCk7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gZ2VvbWV0cnkuYm91bmRpbmdCb3guY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjZW50ZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cblx0XHR2YXIgb2Zmc2V0ID0gdGhpcy5ib3VuZGluZ0JveC5nZXRDZW50ZXIoKS5uZWdhdGUoKTtcblxuXHRcdHRoaXMudHJhbnNsYXRlKCBvZmZzZXQueCwgb2Zmc2V0LnksIG9mZnNldC56ICk7XG5cblx0XHRyZXR1cm4gb2Zmc2V0O1xuXG5cdH0sXG5cblx0bm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0dmFyIGNlbnRlciA9IHRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyO1xuXHRcdHZhciByYWRpdXMgPSB0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cztcblxuXHRcdHZhciBzID0gcmFkaXVzID09PSAwID8gMSA6IDEuMCAvIHJhZGl1cztcblxuXHRcdHZhciBtYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHRcdG1hdHJpeC5zZXQoXG5cdFx0XHRzLCAwLCAwLCAtIHMgKiBjZW50ZXIueCxcblx0XHRcdDAsIHMsIDAsIC0gcyAqIGNlbnRlci55LFxuXHRcdFx0MCwgMCwgcywgLSBzICogY2VudGVyLnosXG5cdFx0XHQwLCAwLCAwLCAxXG5cdFx0KTtcblxuXHRcdHRoaXMuYXBwbHlNYXRyaXgoIG1hdHJpeCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb21wdXRlRmFjZU5vcm1hbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBjYiA9IG5ldyBWZWN0b3IzKCksIGFiID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdGZvciAoIHZhciBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0dmFyIHZBID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5hIF07XG5cdFx0XHR2YXIgdkIgPSB0aGlzLnZlcnRpY2VzWyBmYWNlLmIgXTtcblx0XHRcdHZhciB2QyA9IHRoaXMudmVydGljZXNbIGZhY2UuYyBdO1xuXG5cdFx0XHRjYi5zdWJWZWN0b3JzKCB2QywgdkIgKTtcblx0XHRcdGFiLnN1YlZlY3RvcnMoIHZBLCB2QiApO1xuXHRcdFx0Y2IuY3Jvc3MoIGFiICk7XG5cblx0XHRcdGNiLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRmYWNlLm5vcm1hbC5jb3B5KCBjYiApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y29tcHV0ZVZlcnRleE5vcm1hbHM6IGZ1bmN0aW9uICggYXJlYVdlaWdodGVkICkge1xuXG5cdFx0aWYgKCBhcmVhV2VpZ2h0ZWQgPT09IHVuZGVmaW5lZCApIGFyZWFXZWlnaHRlZCA9IHRydWU7XG5cblx0XHR2YXIgdiwgdmwsIGYsIGZsLCBmYWNlLCB2ZXJ0aWNlcztcblxuXHRcdHZlcnRpY2VzID0gbmV3IEFycmF5KCB0aGlzLnZlcnRpY2VzLmxlbmd0aCApO1xuXG5cdFx0Zm9yICggdiA9IDAsIHZsID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IHYgPCB2bDsgdiArKyApIHtcblxuXHRcdFx0dmVydGljZXNbIHYgXSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGFyZWFXZWlnaHRlZCApIHtcblxuXHRcdFx0Ly8gdmVydGV4IG5vcm1hbHMgd2VpZ2h0ZWQgYnkgdHJpYW5nbGUgYXJlYXNcblx0XHRcdC8vIGh0dHA6Ly93d3cuaXF1aWxlemxlcy5vcmcvd3d3L2FydGljbGVzL25vcm1hbHMvbm9ybWFscy5odG1cblxuXHRcdFx0dmFyIHZBLCB2QiwgdkM7XG5cdFx0XHR2YXIgY2IgPSBuZXcgVmVjdG9yMygpLCBhYiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0XHR2QSA9IHRoaXMudmVydGljZXNbIGZhY2UuYSBdO1xuXHRcdFx0XHR2QiA9IHRoaXMudmVydGljZXNbIGZhY2UuYiBdO1xuXHRcdFx0XHR2QyA9IHRoaXMudmVydGljZXNbIGZhY2UuYyBdO1xuXG5cdFx0XHRcdGNiLnN1YlZlY3RvcnMoIHZDLCB2QiApO1xuXHRcdFx0XHRhYi5zdWJWZWN0b3JzKCB2QSwgdkIgKTtcblx0XHRcdFx0Y2IuY3Jvc3MoIGFiICk7XG5cblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYSBdLmFkZCggY2IgKTtcblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYiBdLmFkZCggY2IgKTtcblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYyBdLmFkZCggY2IgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblxuXHRcdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHRcdHZlcnRpY2VzWyBmYWNlLmEgXS5hZGQoIGZhY2Uubm9ybWFsICk7XG5cdFx0XHRcdHZlcnRpY2VzWyBmYWNlLmIgXS5hZGQoIGZhY2Uubm9ybWFsICk7XG5cdFx0XHRcdHZlcnRpY2VzWyBmYWNlLmMgXS5hZGQoIGZhY2Uubm9ybWFsICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZvciAoIHYgPSAwLCB2bCA9IHRoaXMudmVydGljZXMubGVuZ3RoOyB2IDwgdmw7IHYgKysgKSB7XG5cblx0XHRcdHZlcnRpY2VzWyB2IF0ubm9ybWFsaXplKCk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHR2YXIgdmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFscztcblxuXHRcdFx0aWYgKCB2ZXJ0ZXhOb3JtYWxzLmxlbmd0aCA9PT0gMyApIHtcblxuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAwIF0uY29weSggdmVydGljZXNbIGZhY2UuYSBdICk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDEgXS5jb3B5KCB2ZXJ0aWNlc1sgZmFjZS5iIF0gKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMiBdLmNvcHkoIHZlcnRpY2VzWyBmYWNlLmMgXSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDAgXSA9IHZlcnRpY2VzWyBmYWNlLmEgXS5jbG9uZSgpO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAxIF0gPSB2ZXJ0aWNlc1sgZmFjZS5iIF0uY2xvbmUoKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMiBdID0gdmVydGljZXNbIGZhY2UuYyBdLmNsb25lKCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5mYWNlcy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNvbXB1dGVGbGF0VmVydGV4Tm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGYsIGZsLCBmYWNlO1xuXG5cdFx0dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblxuXHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdHZhciB2ZXJ0ZXhOb3JtYWxzID0gZmFjZS52ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRpZiAoIHZlcnRleE5vcm1hbHMubGVuZ3RoID09PSAzICkge1xuXG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDAgXS5jb3B5KCBmYWNlLm5vcm1hbCApO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAxIF0uY29weSggZmFjZS5ub3JtYWwgKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMiBdLmNvcHkoIGZhY2Uubm9ybWFsICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMCBdID0gZmFjZS5ub3JtYWwuY2xvbmUoKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMSBdID0gZmFjZS5ub3JtYWwuY2xvbmUoKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMiBdID0gZmFjZS5ub3JtYWwuY2xvbmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmZhY2VzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y29tcHV0ZU1vcnBoTm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGksIGlsLCBmLCBmbCwgZmFjZTtcblxuXHRcdC8vIHNhdmUgb3JpZ2luYWwgbm9ybWFsc1xuXHRcdC8vIC0gY3JlYXRlIHRlbXAgdmFyaWFibGVzIG9uIGZpcnN0IGFjY2Vzc1xuXHRcdC8vICAgb3RoZXJ3aXNlIGp1c3QgY29weSAoZm9yIGZhc3RlciByZXBlYXRlZCBjYWxscylcblxuXHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdGlmICggISBmYWNlLl9fb3JpZ2luYWxGYWNlTm9ybWFsICkge1xuXG5cdFx0XHRcdGZhY2UuX19vcmlnaW5hbEZhY2VOb3JtYWwgPSBmYWNlLm5vcm1hbC5jbG9uZSgpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZhY2UuX19vcmlnaW5hbEZhY2VOb3JtYWwuY29weSggZmFjZS5ub3JtYWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoICEgZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFscyApIGZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHMgPSBbXTtcblxuXHRcdFx0Zm9yICggaSA9IDAsIGlsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdGlmICggISBmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzWyBpIF0gKSB7XG5cblx0XHRcdFx0XHRmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzWyBpIF0gPSBmYWNlLnZlcnRleE5vcm1hbHNbIGkgXS5jbG9uZSgpO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzWyBpIF0uY29weSggZmFjZS52ZXJ0ZXhOb3JtYWxzWyBpIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIHVzZSB0ZW1wIGdlb21ldHJ5IHRvIGNvbXB1dGUgZmFjZSBhbmQgdmVydGV4IG5vcm1hbHMgZm9yIGVhY2ggbW9ycGhcblxuXHRcdHZhciB0bXBHZW8gPSBuZXcgR2VvbWV0cnkoKTtcblx0XHR0bXBHZW8uZmFjZXMgPSB0aGlzLmZhY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy5tb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdC8vIGNyZWF0ZSBvbiBmaXJzdCBhY2Nlc3NcblxuXHRcdFx0aWYgKCAhIHRoaXMubW9ycGhOb3JtYWxzWyBpIF0gKSB7XG5cblx0XHRcdFx0dGhpcy5tb3JwaE5vcm1hbHNbIGkgXSA9IHt9O1xuXHRcdFx0XHR0aGlzLm1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3JtYWxzID0gW107XG5cdFx0XHRcdHRoaXMubW9ycGhOb3JtYWxzWyBpIF0udmVydGV4Tm9ybWFscyA9IFtdO1xuXG5cdFx0XHRcdHZhciBkc3ROb3JtYWxzRmFjZSA9IHRoaXMubW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHM7XG5cdFx0XHRcdHZhciBkc3ROb3JtYWxzVmVydGV4ID0gdGhpcy5tb3JwaE5vcm1hbHNbIGkgXS52ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRcdHZhciBmYWNlTm9ybWFsLCB2ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdFx0XHRmYWNlTm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzID0geyBhOiBuZXcgVmVjdG9yMygpLCBiOiBuZXcgVmVjdG9yMygpLCBjOiBuZXcgVmVjdG9yMygpIH07XG5cblx0XHRcdFx0XHRkc3ROb3JtYWxzRmFjZS5wdXNoKCBmYWNlTm9ybWFsICk7XG5cdFx0XHRcdFx0ZHN0Tm9ybWFsc1ZlcnRleC5wdXNoKCB2ZXJ0ZXhOb3JtYWxzICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBtb3JwaE5vcm1hbHMgPSB0aGlzLm1vcnBoTm9ybWFsc1sgaSBdO1xuXG5cdFx0XHQvLyBzZXQgdmVydGljZXMgdG8gbW9ycGggdGFyZ2V0XG5cblx0XHRcdHRtcEdlby52ZXJ0aWNlcyA9IHRoaXMubW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXM7XG5cblx0XHRcdC8vIGNvbXB1dGUgbW9ycGggbm9ybWFsc1xuXG5cdFx0XHR0bXBHZW8uY29tcHV0ZUZhY2VOb3JtYWxzKCk7XG5cdFx0XHR0bXBHZW8uY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcblxuXHRcdFx0Ly8gc3RvcmUgbW9ycGggbm9ybWFsc1xuXG5cdFx0XHR2YXIgZmFjZU5vcm1hbCwgdmVydGV4Tm9ybWFscztcblxuXHRcdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHRcdGZhY2VOb3JtYWwgPSBtb3JwaE5vcm1hbHMuZmFjZU5vcm1hbHNbIGYgXTtcblx0XHRcdFx0dmVydGV4Tm9ybWFscyA9IG1vcnBoTm9ybWFscy52ZXJ0ZXhOb3JtYWxzWyBmIF07XG5cblx0XHRcdFx0ZmFjZU5vcm1hbC5jb3B5KCBmYWNlLm5vcm1hbCApO1xuXG5cdFx0XHRcdHZlcnRleE5vcm1hbHMuYS5jb3B5KCBmYWNlLnZlcnRleE5vcm1hbHNbIDAgXSApO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzLmIuY29weSggZmFjZS52ZXJ0ZXhOb3JtYWxzWyAxIF0gKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFscy5jLmNvcHkoIGZhY2UudmVydGV4Tm9ybWFsc1sgMiBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIHJlc3RvcmUgb3JpZ2luYWwgbm9ybWFsc1xuXG5cdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0ZmFjZS5ub3JtYWwgPSBmYWNlLl9fb3JpZ2luYWxGYWNlTm9ybWFsO1xuXHRcdFx0ZmFjZS52ZXJ0ZXhOb3JtYWxzID0gZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFscztcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNvbXB1dGVMaW5lRGlzdGFuY2VzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZCA9IDA7XG5cdFx0dmFyIHZlcnRpY2VzID0gdGhpcy52ZXJ0aWNlcztcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB2ZXJ0aWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0aWYgKCBpID4gMCApIHtcblxuXHRcdFx0XHRkICs9IHZlcnRpY2VzWyBpIF0uZGlzdGFuY2VUbyggdmVydGljZXNbIGkgLSAxIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmxpbmVEaXN0YW5jZXNbIGkgXSA9IGQ7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjb21wdXRlQm91bmRpbmdCb3g6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5ib3VuZGluZ0JveCA9PT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IG5ldyBCb3gzKCk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmJvdW5kaW5nQm94LnNldEZyb21Qb2ludHMoIHRoaXMudmVydGljZXMgKTtcblxuXHR9LFxuXG5cdGNvbXB1dGVCb3VuZGluZ1NwaGVyZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5ib3VuZGluZ1NwaGVyZS5zZXRGcm9tUG9pbnRzKCB0aGlzLnZlcnRpY2VzICk7XG5cblx0fSxcblxuXHRtZXJnZTogZnVuY3Rpb24gKCBnZW9tZXRyeSwgbWF0cml4LCBtYXRlcmlhbEluZGV4T2Zmc2V0ICkge1xuXG5cdFx0aWYgKCAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5HZW9tZXRyeS5tZXJnZSgpOiBnZW9tZXRyeSBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuR2VvbWV0cnkuJywgZ2VvbWV0cnkgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBub3JtYWxNYXRyaXgsXG5cdFx0XHR2ZXJ0ZXhPZmZzZXQgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aCxcblx0XHRcdHZlcnRpY2VzMSA9IHRoaXMudmVydGljZXMsXG5cdFx0XHR2ZXJ0aWNlczIgPSBnZW9tZXRyeS52ZXJ0aWNlcyxcblx0XHRcdGZhY2VzMSA9IHRoaXMuZmFjZXMsXG5cdFx0XHRmYWNlczIgPSBnZW9tZXRyeS5mYWNlcyxcblx0XHRcdHV2czEgPSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDAgXSxcblx0XHRcdHV2czIgPSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyAwIF0sXG5cdFx0XHRjb2xvcnMxID0gdGhpcy5jb2xvcnMsXG5cdFx0XHRjb2xvcnMyID0gZ2VvbWV0cnkuY29sb3JzO1xuXG5cdFx0aWYgKCBtYXRlcmlhbEluZGV4T2Zmc2V0ID09PSB1bmRlZmluZWQgKSBtYXRlcmlhbEluZGV4T2Zmc2V0ID0gMDtcblxuXHRcdGlmICggbWF0cml4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCkuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTtcblxuXHRcdH1cblxuXHRcdC8vIHZlcnRpY2VzXG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdmVydGljZXMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVydGV4ID0gdmVydGljZXMyWyBpIF07XG5cblx0XHRcdHZhciB2ZXJ0ZXhDb3B5ID0gdmVydGV4LmNsb25lKCk7XG5cblx0XHRcdGlmICggbWF0cml4ICE9PSB1bmRlZmluZWQgKSB2ZXJ0ZXhDb3B5LmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHRcdHZlcnRpY2VzMS5wdXNoKCB2ZXJ0ZXhDb3B5ICk7XG5cblx0XHR9XG5cblx0XHQvLyBjb2xvcnNcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBjb2xvcnMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRjb2xvcnMxLnB1c2goIGNvbG9yczJbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBmYWNlc1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gZmFjZXMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IGZhY2VzMlsgaSBdLCBmYWNlQ29weSwgbm9ybWFsLCBjb2xvcixcblx0XHRcdFx0ZmFjZVZlcnRleE5vcm1hbHMgPSBmYWNlLnZlcnRleE5vcm1hbHMsXG5cdFx0XHRcdGZhY2VWZXJ0ZXhDb2xvcnMgPSBmYWNlLnZlcnRleENvbG9ycztcblxuXHRcdFx0ZmFjZUNvcHkgPSBuZXcgRmFjZTMoIGZhY2UuYSArIHZlcnRleE9mZnNldCwgZmFjZS5iICsgdmVydGV4T2Zmc2V0LCBmYWNlLmMgKyB2ZXJ0ZXhPZmZzZXQgKTtcblx0XHRcdGZhY2VDb3B5Lm5vcm1hbC5jb3B5KCBmYWNlLm5vcm1hbCApO1xuXG5cdFx0XHRpZiAoIG5vcm1hbE1hdHJpeCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGZhY2VDb3B5Lm5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBmYWNlVmVydGV4Tm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRub3JtYWwgPSBmYWNlVmVydGV4Tm9ybWFsc1sgaiBdLmNsb25lKCk7XG5cblx0XHRcdFx0aWYgKCBub3JtYWxNYXRyaXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdG5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmYWNlQ29weS52ZXJ0ZXhOb3JtYWxzLnB1c2goIG5vcm1hbCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZhY2VDb3B5LmNvbG9yLmNvcHkoIGZhY2UuY29sb3IgKTtcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGZhY2VWZXJ0ZXhDb2xvcnMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0Y29sb3IgPSBmYWNlVmVydGV4Q29sb3JzWyBqIF07XG5cdFx0XHRcdGZhY2VDb3B5LnZlcnRleENvbG9ycy5wdXNoKCBjb2xvci5jbG9uZSgpICk7XG5cblx0XHRcdH1cblxuXHRcdFx0ZmFjZUNvcHkubWF0ZXJpYWxJbmRleCA9IGZhY2UubWF0ZXJpYWxJbmRleCArIG1hdGVyaWFsSW5kZXhPZmZzZXQ7XG5cblx0XHRcdGZhY2VzMS5wdXNoKCBmYWNlQ29weSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXZzXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB1dnMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdXYgPSB1dnMyWyBpIF0sIHV2Q29weSA9IFtdO1xuXG5cdFx0XHRpZiAoIHV2ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IHV2Lmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdHV2Q29weS5wdXNoKCB1dlsgaiBdLmNsb25lKCkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR1dnMxLnB1c2goIHV2Q29weSApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0bWVyZ2VNZXNoOiBmdW5jdGlvbiAoIG1lc2ggKSB7XG5cblx0XHRpZiAoICggbWVzaCAmJiBtZXNoLmlzTWVzaCApID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkdlb21ldHJ5Lm1lcmdlTWVzaCgpOiBtZXNoIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5NZXNoLicsIG1lc2ggKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdG1lc2gubWF0cml4QXV0b1VwZGF0ZSAmJiBtZXNoLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0dGhpcy5tZXJnZSggbWVzaC5nZW9tZXRyeSwgbWVzaC5tYXRyaXggKTtcblxuXHR9LFxuXG5cdC8qXG5cdCAqIENoZWNrcyBmb3IgZHVwbGljYXRlIHZlcnRpY2VzIHdpdGggaGFzaG1hcC5cblx0ICogRHVwbGljYXRlZCB2ZXJ0aWNlcyBhcmUgcmVtb3ZlZFxuXHQgKiBhbmQgZmFjZXMnIHZlcnRpY2VzIGFyZSB1cGRhdGVkLlxuXHQgKi9cblxuXHRtZXJnZVZlcnRpY2VzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdmVydGljZXNNYXAgPSB7fTsgLy8gSGFzaG1hcCBmb3IgbG9va2luZyB1cCB2ZXJ0aWNlcyBieSBwb3NpdGlvbiBjb29yZGluYXRlcyAoYW5kIG1ha2luZyBzdXJlIHRoZXkgYXJlIHVuaXF1ZSlcblx0XHR2YXIgdW5pcXVlID0gW10sIGNoYW5nZXMgPSBbXTtcblxuXHRcdHZhciB2LCBrZXk7XG5cdFx0dmFyIHByZWNpc2lvblBvaW50cyA9IDQ7IC8vIG51bWJlciBvZiBkZWNpbWFsIHBvaW50cywgZS5nLiA0IGZvciBlcHNpbG9uIG9mIDAuMDAwMVxuXHRcdHZhciBwcmVjaXNpb24gPSBNYXRoLnBvdyggMTAsIHByZWNpc2lvblBvaW50cyApO1xuXHRcdHZhciBpLCBpbCwgZmFjZTtcblx0XHR2YXIgaW5kaWNlcywgaiwgamw7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2ID0gdGhpcy52ZXJ0aWNlc1sgaSBdO1xuXHRcdFx0a2V5ID0gTWF0aC5yb3VuZCggdi54ICogcHJlY2lzaW9uICkgKyAnXycgKyBNYXRoLnJvdW5kKCB2LnkgKiBwcmVjaXNpb24gKSArICdfJyArIE1hdGgucm91bmQoIHYueiAqIHByZWNpc2lvbiApO1xuXG5cdFx0XHRpZiAoIHZlcnRpY2VzTWFwWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHZlcnRpY2VzTWFwWyBrZXkgXSA9IGk7XG5cdFx0XHRcdHVuaXF1ZS5wdXNoKCB0aGlzLnZlcnRpY2VzWyBpIF0gKTtcblx0XHRcdFx0Y2hhbmdlc1sgaSBdID0gdW5pcXVlLmxlbmd0aCAtIDE7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly9jb25zb2xlLmxvZygnRHVwbGljYXRlIHZlcnRleCBmb3VuZC4gJywgaSwgJyBjb3VsZCBiZSB1c2luZyAnLCB2ZXJ0aWNlc01hcFtrZXldKTtcblx0XHRcdFx0Y2hhbmdlc1sgaSBdID0gY2hhbmdlc1sgdmVydGljZXNNYXBbIGtleSBdIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXG5cdFx0Ly8gaWYgZmFjZXMgYXJlIGNvbXBsZXRlbHkgZGVnZW5lcmF0ZSBhZnRlciBtZXJnaW5nIHZlcnRpY2VzLCB3ZVxuXHRcdC8vIGhhdmUgdG8gcmVtb3ZlIHRoZW0gZnJvbSB0aGUgZ2VvbWV0cnkuXG5cdFx0dmFyIGZhY2VJbmRpY2VzVG9SZW1vdmUgPSBbXTtcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBpIF07XG5cblx0XHRcdGZhY2UuYSA9IGNoYW5nZXNbIGZhY2UuYSBdO1xuXHRcdFx0ZmFjZS5iID0gY2hhbmdlc1sgZmFjZS5iIF07XG5cdFx0XHRmYWNlLmMgPSBjaGFuZ2VzWyBmYWNlLmMgXTtcblxuXHRcdFx0aW5kaWNlcyA9IFsgZmFjZS5hLCBmYWNlLmIsIGZhY2UuYyBdO1xuXG5cdFx0XHQvLyBpZiBhbnkgZHVwbGljYXRlIHZlcnRpY2VzIGFyZSBmb3VuZCBpbiBhIEZhY2UzXG5cdFx0XHQvLyB3ZSBoYXZlIHRvIHJlbW92ZSB0aGUgZmFjZSBhcyBub3RoaW5nIGNhbiBiZSBzYXZlZFxuXHRcdFx0Zm9yICggdmFyIG4gPSAwOyBuIDwgMzsgbiArKyApIHtcblxuXHRcdFx0XHRpZiAoIGluZGljZXNbIG4gXSA9PT0gaW5kaWNlc1sgKCBuICsgMSApICUgMyBdICkge1xuXG5cdFx0XHRcdFx0ZmFjZUluZGljZXNUb1JlbW92ZS5wdXNoKCBpICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmb3IgKCBpID0gZmFjZUluZGljZXNUb1JlbW92ZS5sZW5ndGggLSAxOyBpID49IDA7IGkgLS0gKSB7XG5cblx0XHRcdHZhciBpZHggPSBmYWNlSW5kaWNlc1RvUmVtb3ZlWyBpIF07XG5cblx0XHRcdHRoaXMuZmFjZXMuc3BsaWNlKCBpZHgsIDEgKTtcblxuXHRcdFx0Zm9yICggaiA9IDAsIGpsID0gdGhpcy5mYWNlVmVydGV4VXZzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdHRoaXMuZmFjZVZlcnRleFV2c1sgaiBdLnNwbGljZSggaWR4LCAxICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIFVzZSB1bmlxdWUgc2V0IG9mIHZlcnRpY2VzXG5cblx0XHR2YXIgZGlmZiA9IHRoaXMudmVydGljZXMubGVuZ3RoIC0gdW5pcXVlLmxlbmd0aDtcblx0XHR0aGlzLnZlcnRpY2VzID0gdW5pcXVlO1xuXHRcdHJldHVybiBkaWZmO1xuXG5cdH0sXG5cblx0c29ydEZhY2VzQnlNYXRlcmlhbEluZGV4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZmFjZXMgPSB0aGlzLmZhY2VzO1xuXHRcdHZhciBsZW5ndGggPSBmYWNlcy5sZW5ndGg7XG5cblx0XHQvLyB0YWcgZmFjZXNcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0ZmFjZXNbIGkgXS5faWQgPSBpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc29ydCBmYWNlc1xuXG5cdFx0ZnVuY3Rpb24gbWF0ZXJpYWxJbmRleFNvcnQoIGEsIGIgKSB7XG5cblx0XHRcdHJldHVybiBhLm1hdGVyaWFsSW5kZXggLSBiLm1hdGVyaWFsSW5kZXg7XG5cblx0XHR9XG5cblx0XHRmYWNlcy5zb3J0KCBtYXRlcmlhbEluZGV4U29ydCApO1xuXG5cdFx0Ly8gc29ydCB1dnNcblxuXHRcdHZhciB1dnMxID0gdGhpcy5mYWNlVmVydGV4VXZzWyAwIF07XG5cdFx0dmFyIHV2czIgPSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDEgXTtcblxuXHRcdHZhciBuZXdVdnMxLCBuZXdVdnMyO1xuXG5cdFx0aWYgKCB1dnMxICYmIHV2czEubGVuZ3RoID09PSBsZW5ndGggKSBuZXdVdnMxID0gW107XG5cdFx0aWYgKCB1dnMyICYmIHV2czIubGVuZ3RoID09PSBsZW5ndGggKSBuZXdVdnMyID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBpZCA9IGZhY2VzWyBpIF0uX2lkO1xuXG5cdFx0XHRpZiAoIG5ld1V2czEgKSBuZXdVdnMxLnB1c2goIHV2czFbIGlkIF0gKTtcblx0XHRcdGlmICggbmV3VXZzMiApIG5ld1V2czIucHVzaCggdXZzMlsgaWQgXSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBuZXdVdnMxICkgdGhpcy5mYWNlVmVydGV4VXZzWyAwIF0gPSBuZXdVdnMxO1xuXHRcdGlmICggbmV3VXZzMiApIHRoaXMuZmFjZVZlcnRleFV2c1sgMSBdID0gbmV3VXZzMjtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGRhdGEgPSB7XG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdHZW9tZXRyeScsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ0dlb21ldHJ5LnRvSlNPTidcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gc3RhbmRhcmQgR2VvbWV0cnkgc2VyaWFsaXphdGlvblxuXG5cdFx0ZGF0YS51dWlkID0gdGhpcy51dWlkO1xuXHRcdGRhdGEudHlwZSA9IHRoaXMudHlwZTtcblx0XHRpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBkYXRhLm5hbWUgPSB0aGlzLm5hbWU7XG5cblx0XHRpZiAoIHRoaXMucGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycztcblxuXHRcdFx0Zm9yICggdmFyIGtleSBpbiBwYXJhbWV0ZXJzICkge1xuXG5cdFx0XHRcdGlmICggcGFyYW1ldGVyc1sga2V5IF0gIT09IHVuZGVmaW5lZCApIGRhdGFbIGtleSBdID0gcGFyYW1ldGVyc1sga2V5IF07XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cblx0XHR9XG5cblx0XHR2YXIgdmVydGljZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMudmVydGljZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVydGV4ID0gdGhpcy52ZXJ0aWNlc1sgaSBdO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGZhY2VzID0gW107XG5cdFx0dmFyIG5vcm1hbHMgPSBbXTtcblx0XHR2YXIgbm9ybWFsc0hhc2ggPSB7fTtcblx0XHR2YXIgY29sb3JzID0gW107XG5cdFx0dmFyIGNvbG9yc0hhc2ggPSB7fTtcblx0XHR2YXIgdXZzID0gW107XG5cdFx0dmFyIHV2c0hhc2ggPSB7fTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMuZmFjZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IHRoaXMuZmFjZXNbIGkgXTtcblxuXHRcdFx0dmFyIGhhc01hdGVyaWFsID0gdHJ1ZTtcblx0XHRcdHZhciBoYXNGYWNlVXYgPSBmYWxzZTsgLy8gZGVwcmVjYXRlZFxuXHRcdFx0dmFyIGhhc0ZhY2VWZXJ0ZXhVdiA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdWyBpIF0gIT09IHVuZGVmaW5lZDtcblx0XHRcdHZhciBoYXNGYWNlTm9ybWFsID0gZmFjZS5ub3JtYWwubGVuZ3RoKCkgPiAwO1xuXHRcdFx0dmFyIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgPSBmYWNlLnZlcnRleE5vcm1hbHMubGVuZ3RoID4gMDtcblx0XHRcdHZhciBoYXNGYWNlQ29sb3IgPSBmYWNlLmNvbG9yLnIgIT09IDEgfHwgZmFjZS5jb2xvci5nICE9PSAxIHx8IGZhY2UuY29sb3IuYiAhPT0gMTtcblx0XHRcdHZhciBoYXNGYWNlVmVydGV4Q29sb3IgPSBmYWNlLnZlcnRleENvbG9ycy5sZW5ndGggPiAwO1xuXG5cdFx0XHR2YXIgZmFjZVR5cGUgPSAwO1xuXG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDAsIDAgKTsgLy8gaXNRdWFkXG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDEsIGhhc01hdGVyaWFsICk7XG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDIsIGhhc0ZhY2VVdiApO1xuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAzLCBoYXNGYWNlVmVydGV4VXYgKTtcblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgNCwgaGFzRmFjZU5vcm1hbCApO1xuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCA1LCBoYXNGYWNlVmVydGV4Tm9ybWFsICk7XG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDYsIGhhc0ZhY2VDb2xvciApO1xuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCA3LCBoYXNGYWNlVmVydGV4Q29sb3IgKTtcblxuXHRcdFx0ZmFjZXMucHVzaCggZmFjZVR5cGUgKTtcblx0XHRcdGZhY2VzLnB1c2goIGZhY2UuYSwgZmFjZS5iLCBmYWNlLmMgKTtcblx0XHRcdGZhY2VzLnB1c2goIGZhY2UubWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhVdiApIHtcblxuXHRcdFx0XHR2YXIgZmFjZVZlcnRleFV2cyA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdWyBpIF07XG5cblx0XHRcdFx0ZmFjZXMucHVzaChcblx0XHRcdFx0XHRnZXRVdkluZGV4KCBmYWNlVmVydGV4VXZzWyAwIF0gKSxcblx0XHRcdFx0XHRnZXRVdkluZGV4KCBmYWNlVmVydGV4VXZzWyAxIF0gKSxcblx0XHRcdFx0XHRnZXRVdkluZGV4KCBmYWNlVmVydGV4VXZzWyAyIF0gKVxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZU5vcm1hbCApIHtcblxuXHRcdFx0XHRmYWNlcy5wdXNoKCBnZXROb3JtYWxJbmRleCggZmFjZS5ub3JtYWwgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZVZlcnRleE5vcm1hbCApIHtcblxuXHRcdFx0XHR2YXIgdmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFscztcblxuXHRcdFx0XHRmYWNlcy5wdXNoKFxuXHRcdFx0XHRcdGdldE5vcm1hbEluZGV4KCB2ZXJ0ZXhOb3JtYWxzWyAwIF0gKSxcblx0XHRcdFx0XHRnZXROb3JtYWxJbmRleCggdmVydGV4Tm9ybWFsc1sgMSBdICksXG5cdFx0XHRcdFx0Z2V0Tm9ybWFsSW5kZXgoIHZlcnRleE5vcm1hbHNbIDIgXSApXG5cdFx0XHRcdCk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNGYWNlQ29sb3IgKSB7XG5cblx0XHRcdFx0ZmFjZXMucHVzaCggZ2V0Q29sb3JJbmRleCggZmFjZS5jb2xvciApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4Q29sb3IgKSB7XG5cblx0XHRcdFx0dmFyIHZlcnRleENvbG9ycyA9IGZhY2UudmVydGV4Q29sb3JzO1xuXG5cdFx0XHRcdGZhY2VzLnB1c2goXG5cdFx0XHRcdFx0Z2V0Q29sb3JJbmRleCggdmVydGV4Q29sb3JzWyAwIF0gKSxcblx0XHRcdFx0XHRnZXRDb2xvckluZGV4KCB2ZXJ0ZXhDb2xvcnNbIDEgXSApLFxuXHRcdFx0XHRcdGdldENvbG9ySW5kZXgoIHZlcnRleENvbG9yc1sgMiBdIClcblx0XHRcdFx0KTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gc2V0Qml0KCB2YWx1ZSwgcG9zaXRpb24sIGVuYWJsZWQgKSB7XG5cblx0XHRcdHJldHVybiBlbmFibGVkID8gdmFsdWUgfCAoIDEgPDwgcG9zaXRpb24gKSA6IHZhbHVlICYgKCB+ICggMSA8PCBwb3NpdGlvbiApICk7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXROb3JtYWxJbmRleCggbm9ybWFsICkge1xuXG5cdFx0XHR2YXIgaGFzaCA9IG5vcm1hbC54LnRvU3RyaW5nKCkgKyBub3JtYWwueS50b1N0cmluZygpICsgbm9ybWFsLnoudG9TdHJpbmcoKTtcblxuXHRcdFx0aWYgKCBub3JtYWxzSGFzaFsgaGFzaCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG5vcm1hbHNIYXNoWyBoYXNoIF07XG5cblx0XHRcdH1cblxuXHRcdFx0bm9ybWFsc0hhc2hbIGhhc2ggXSA9IG5vcm1hbHMubGVuZ3RoIC8gMztcblx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHRyZXR1cm4gbm9ybWFsc0hhc2hbIGhhc2ggXTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdldENvbG9ySW5kZXgoIGNvbG9yICkge1xuXG5cdFx0XHR2YXIgaGFzaCA9IGNvbG9yLnIudG9TdHJpbmcoKSArIGNvbG9yLmcudG9TdHJpbmcoKSArIGNvbG9yLmIudG9TdHJpbmcoKTtcblxuXHRcdFx0aWYgKCBjb2xvcnNIYXNoWyBoYXNoIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gY29sb3JzSGFzaFsgaGFzaCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbG9yc0hhc2hbIGhhc2ggXSA9IGNvbG9ycy5sZW5ndGg7XG5cdFx0XHRjb2xvcnMucHVzaCggY29sb3IuZ2V0SGV4KCkgKTtcblxuXHRcdFx0cmV0dXJuIGNvbG9yc0hhc2hbIGhhc2ggXTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdldFV2SW5kZXgoIHV2ICkge1xuXG5cdFx0XHR2YXIgaGFzaCA9IHV2LngudG9TdHJpbmcoKSArIHV2LnkudG9TdHJpbmcoKTtcblxuXHRcdFx0aWYgKCB1dnNIYXNoWyBoYXNoIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gdXZzSGFzaFsgaGFzaCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdHV2c0hhc2hbIGhhc2ggXSA9IHV2cy5sZW5ndGggLyAyO1xuXHRcdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcblxuXHRcdFx0cmV0dXJuIHV2c0hhc2hbIGhhc2ggXTtcblxuXHRcdH1cblxuXHRcdGRhdGEuZGF0YSA9IHt9O1xuXG5cdFx0ZGF0YS5kYXRhLnZlcnRpY2VzID0gdmVydGljZXM7XG5cdFx0ZGF0YS5kYXRhLm5vcm1hbHMgPSBub3JtYWxzO1xuXHRcdGlmICggY29sb3JzLmxlbmd0aCA+IDAgKSBkYXRhLmRhdGEuY29sb3JzID0gY29sb3JzO1xuXHRcdGlmICggdXZzLmxlbmd0aCA+IDAgKSBkYXRhLmRhdGEudXZzID0gWyB1dnMgXTsgLy8gdGVtcG9yYWwgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuXHRcdGRhdGEuZGF0YS5mYWNlcyA9IGZhY2VzO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Lypcblx0XHQgLy8gSGFuZGxlIHByaW1pdGl2ZXNcblxuXHRcdCB2YXIgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycztcblxuXHRcdCBpZiAoIHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdCB2YXIgdmFsdWVzID0gW107XG5cblx0XHQgZm9yICggdmFyIGtleSBpbiBwYXJhbWV0ZXJzICkge1xuXG5cdFx0IHZhbHVlcy5wdXNoKCBwYXJhbWV0ZXJzWyBrZXkgXSApO1xuXG5cdFx0IH1cblxuXHRcdCB2YXIgZ2VvbWV0cnkgPSBPYmplY3QuY3JlYXRlKCB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSApO1xuXHRcdCB0aGlzLmNvbnN0cnVjdG9yLmFwcGx5KCBnZW9tZXRyeSwgdmFsdWVzICk7XG5cdFx0IHJldHVybiBnZW9tZXRyeTtcblxuXHRcdCB9XG5cblx0XHQgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXHRcdCAqL1xuXG5cdFx0cmV0dXJuIG5ldyBHZW9tZXRyeSgpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dmFyIGksIGlsLCBqLCBqbCwgaywga2w7XG5cblx0XHQvLyByZXNldFxuXG5cdFx0dGhpcy52ZXJ0aWNlcyA9IFtdO1xuXHRcdHRoaXMuY29sb3JzID0gW107XG5cdFx0dGhpcy5mYWNlcyA9IFtdO1xuXHRcdHRoaXMuZmFjZVZlcnRleFV2cyA9IFtbXV07XG5cdFx0dGhpcy5tb3JwaFRhcmdldHMgPSBbXTtcblx0XHR0aGlzLm1vcnBoTm9ybWFscyA9IFtdO1xuXHRcdHRoaXMuc2tpbldlaWdodHMgPSBbXTtcblx0XHR0aGlzLnNraW5JbmRpY2VzID0gW107XG5cdFx0dGhpcy5saW5lRGlzdGFuY2VzID0gW107XG5cdFx0dGhpcy5ib3VuZGluZ0JveCA9IG51bGw7XG5cdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XG5cblx0XHQvLyBuYW1lXG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblxuXHRcdC8vIHZlcnRpY2VzXG5cblx0XHR2YXIgdmVydGljZXMgPSBzb3VyY2UudmVydGljZXM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB2ZXJ0aWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy52ZXJ0aWNlcy5wdXNoKCB2ZXJ0aWNlc1sgaSBdLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGNvbG9yc1xuXG5cdFx0dmFyIGNvbG9ycyA9IHNvdXJjZS5jb2xvcnM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBjb2xvcnMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuY29sb3JzLnB1c2goIGNvbG9yc1sgaSBdLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGZhY2VzXG5cblx0XHR2YXIgZmFjZXMgPSBzb3VyY2UuZmFjZXM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBmYWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5mYWNlcy5wdXNoKCBmYWNlc1sgaSBdLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGZhY2UgdmVydGV4IHV2c1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gc291cmNlLmZhY2VWZXJ0ZXhVdnMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlVmVydGV4VXZzID0gc291cmNlLmZhY2VWZXJ0ZXhVdnNbIGkgXTtcblxuXHRcdFx0aWYgKCB0aGlzLmZhY2VWZXJ0ZXhVdnNbIGkgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRoaXMuZmFjZVZlcnRleFV2c1sgaSBdID0gW107XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggaiA9IDAsIGpsID0gZmFjZVZlcnRleFV2cy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHR2YXIgdXZzID0gZmFjZVZlcnRleFV2c1sgaiBdLCB1dnNDb3B5ID0gW107XG5cblx0XHRcdFx0Zm9yICggayA9IDAsIGtsID0gdXZzLmxlbmd0aDsgayA8IGtsOyBrICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIHV2ID0gdXZzWyBrIF07XG5cblx0XHRcdFx0XHR1dnNDb3B5LnB1c2goIHV2LmNsb25lKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5mYWNlVmVydGV4VXZzWyBpIF0ucHVzaCggdXZzQ29weSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBtb3JwaCB0YXJnZXRzXG5cblx0XHR2YXIgbW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIG1vcnBoVGFyZ2V0ID0ge307XG5cdFx0XHRtb3JwaFRhcmdldC5uYW1lID0gbW9ycGhUYXJnZXRzWyBpIF0ubmFtZTtcblxuXHRcdFx0Ly8gdmVydGljZXNcblxuXHRcdFx0aWYgKCBtb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1vcnBoVGFyZ2V0LnZlcnRpY2VzID0gW107XG5cblx0XHRcdFx0Zm9yICggaiA9IDAsIGpsID0gbW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRtb3JwaFRhcmdldC52ZXJ0aWNlcy5wdXNoKCBtb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlc1sgaiBdLmNsb25lKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gbm9ybWFsc1xuXG5cdFx0XHRpZiAoIG1vcnBoVGFyZ2V0c1sgaSBdLm5vcm1hbHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtb3JwaFRhcmdldC5ub3JtYWxzID0gW107XG5cblx0XHRcdFx0Zm9yICggaiA9IDAsIGpsID0gbW9ycGhUYXJnZXRzWyBpIF0ubm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRcdG1vcnBoVGFyZ2V0Lm5vcm1hbHMucHVzaCggbW9ycGhUYXJnZXRzWyBpIF0ubm9ybWFsc1sgaiBdLmNsb25lKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5tb3JwaFRhcmdldHMucHVzaCggbW9ycGhUYXJnZXQgKTtcblxuXHRcdH1cblxuXHRcdC8vIG1vcnBoIG5vcm1hbHNcblxuXHRcdHZhciBtb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gbW9ycGhOb3JtYWxzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgbW9ycGhOb3JtYWwgPSB7fTtcblxuXHRcdFx0Ly8gdmVydGV4IG5vcm1hbHNcblxuXHRcdFx0aWYgKCBtb3JwaE5vcm1hbHNbIGkgXS52ZXJ0ZXhOb3JtYWxzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bW9ycGhOb3JtYWwudmVydGV4Tm9ybWFscyA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGogPSAwLCBqbCA9IG1vcnBoTm9ybWFsc1sgaSBdLnZlcnRleE5vcm1hbHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgc3JjVmVydGV4Tm9ybWFsID0gbW9ycGhOb3JtYWxzWyBpIF0udmVydGV4Tm9ybWFsc1sgaiBdO1xuXHRcdFx0XHRcdHZhciBkZXN0VmVydGV4Tm9ybWFsID0ge307XG5cblx0XHRcdFx0XHRkZXN0VmVydGV4Tm9ybWFsLmEgPSBzcmNWZXJ0ZXhOb3JtYWwuYS5jbG9uZSgpO1xuXHRcdFx0XHRcdGRlc3RWZXJ0ZXhOb3JtYWwuYiA9IHNyY1ZlcnRleE5vcm1hbC5iLmNsb25lKCk7XG5cdFx0XHRcdFx0ZGVzdFZlcnRleE5vcm1hbC5jID0gc3JjVmVydGV4Tm9ybWFsLmMuY2xvbmUoKTtcblxuXHRcdFx0XHRcdG1vcnBoTm9ybWFsLnZlcnRleE5vcm1hbHMucHVzaCggZGVzdFZlcnRleE5vcm1hbCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBmYWNlIG5vcm1hbHNcblxuXHRcdFx0aWYgKCBtb3JwaE5vcm1hbHNbIGkgXS5mYWNlTm9ybWFscyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1vcnBoTm9ybWFsLmZhY2VOb3JtYWxzID0gW107XG5cblx0XHRcdFx0Zm9yICggaiA9IDAsIGpsID0gbW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRtb3JwaE5vcm1hbC5mYWNlTm9ybWFscy5wdXNoKCBtb3JwaE5vcm1hbHNbIGkgXS5mYWNlTm9ybWFsc1sgaiBdLmNsb25lKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5tb3JwaE5vcm1hbHMucHVzaCggbW9ycGhOb3JtYWwgKTtcblxuXHRcdH1cblxuXHRcdC8vIHNraW4gd2VpZ2h0c1xuXG5cdFx0dmFyIHNraW5XZWlnaHRzID0gc291cmNlLnNraW5XZWlnaHRzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gc2tpbldlaWdodHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuc2tpbldlaWdodHMucHVzaCggc2tpbldlaWdodHNbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBza2luIGluZGljZXNcblxuXHRcdHZhciBza2luSW5kaWNlcyA9IHNvdXJjZS5za2luSW5kaWNlcztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHNraW5JbmRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnNraW5JbmRpY2VzLnB1c2goIHNraW5JbmRpY2VzWyBpIF0uY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbGluZSBkaXN0YW5jZXNcblxuXHRcdHZhciBsaW5lRGlzdGFuY2VzID0gc291cmNlLmxpbmVEaXN0YW5jZXM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBsaW5lRGlzdGFuY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmxpbmVEaXN0YW5jZXMucHVzaCggbGluZURpc3RhbmNlc1sgaSBdICk7XG5cblx0XHR9XG5cblx0XHQvLyBib3VuZGluZyBib3hcblxuXHRcdHZhciBib3VuZGluZ0JveCA9IHNvdXJjZS5ib3VuZGluZ0JveDtcblxuXHRcdGlmICggYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBib3VuZGluZ0JveC5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYm91bmRpbmcgc3BoZXJlXG5cblx0XHR2YXIgYm91bmRpbmdTcGhlcmUgPSBzb3VyY2UuYm91bmRpbmdTcGhlcmU7XG5cblx0XHRpZiAoIGJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gYm91bmRpbmdTcGhlcmUuY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdC8vIHVwZGF0ZSBmbGFnc1xuXG5cdFx0dGhpcy5lbGVtZW50c05lZWRVcGRhdGUgPSBzb3VyY2UuZWxlbWVudHNOZWVkVXBkYXRlO1xuXHRcdHRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gc291cmNlLnZlcnRpY2VzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLnV2c05lZWRVcGRhdGUgPSBzb3VyY2UudXZzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gc291cmNlLm5vcm1hbHNOZWVkVXBkYXRlO1xuXHRcdHRoaXMuY29sb3JzTmVlZFVwZGF0ZSA9IHNvdXJjZS5jb2xvcnNOZWVkVXBkYXRlO1xuXHRcdHRoaXMubGluZURpc3RhbmNlc05lZWRVcGRhdGUgPSBzb3VyY2UubGluZURpc3RhbmNlc05lZWRVcGRhdGU7XG5cdFx0dGhpcy5ncm91cHNOZWVkVXBkYXRlID0gc291cmNlLmdyb3Vwc05lZWRVcGRhdGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlckdlb21ldHJ5KCkge1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogR2VvbWV0cnlJZENvdW50KCkgfSApO1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXHR0aGlzLnR5cGUgPSAnQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMuaW5kZXggPSBudWxsO1xuXHR0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcblxuXHR0aGlzLm1vcnBoQXR0cmlidXRlcyA9IHt9O1xuXG5cdHRoaXMuZ3JvdXBzID0gW107XG5cblx0dGhpcy5ib3VuZGluZ0JveCA9IG51bGw7XG5cdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xuXG5cdHRoaXMuZHJhd1JhbmdlID0geyBzdGFydDogMCwgY291bnQ6IEluZmluaXR5IH07XG5cbn1cblxuQnVmZmVyR2VvbWV0cnkuTWF4SW5kZXggPSA2NTUzNTtcblxuT2JqZWN0LmFzc2lnbiggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlLCB7XG5cblx0aXNCdWZmZXJHZW9tZXRyeTogdHJ1ZSxcblxuXHRnZXRJbmRleDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuaW5kZXg7XG5cblx0fSxcblxuXHRzZXRJbmRleDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggaW5kZXggKSApIHtcblxuXHRcdFx0dGhpcy5pbmRleCA9IG5ldyAoIGFycmF5TWF4KCBpbmRleCApID4gNjU1MzUgPyBVaW50MzJCdWZmZXJBdHRyaWJ1dGUgOiBVaW50MTZCdWZmZXJBdHRyaWJ1dGUgKSggaW5kZXgsIDEgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuaW5kZXggPSBpbmRleDtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGFkZEF0dHJpYnV0ZTogZnVuY3Rpb24gKCBuYW1lLCBhdHRyaWJ1dGUgKSB7XG5cblx0XHRpZiAoICggYXR0cmlidXRlICYmIGF0dHJpYnV0ZS5pc0J1ZmZlckF0dHJpYnV0ZSApID09PSBmYWxzZSAmJiAoIGF0dHJpYnV0ZSAmJiBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRBdHRyaWJ1dGUoKSBub3cgZXhwZWN0cyAoIG5hbWUsIGF0dHJpYnV0ZSApLicgKTtcblxuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoIG5hbWUsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGFyZ3VtZW50c1sgMSBdLCBhcmd1bWVudHNbIDIgXSApICk7XG5cblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggbmFtZSA9PT0gJ2luZGV4JyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuYWRkQXR0cmlidXRlOiBVc2UgLnNldEluZGV4KCkgZm9yIGluZGV4IGF0dHJpYnV0ZS4nICk7XG5cdFx0XHR0aGlzLnNldEluZGV4KCBhdHRyaWJ1dGUgKTtcblxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF0gPSBhdHRyaWJ1dGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEF0dHJpYnV0ZTogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuYXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdH0sXG5cblx0cmVtb3ZlQXR0cmlidXRlOiBmdW5jdGlvbiAoIG5hbWUgKSB7XG5cblx0XHRkZWxldGUgdGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZEdyb3VwOiBmdW5jdGlvbiAoIHN0YXJ0LCBjb3VudCwgbWF0ZXJpYWxJbmRleCApIHtcblxuXHRcdHRoaXMuZ3JvdXBzLnB1c2goIHtcblxuXHRcdFx0c3RhcnQ6IHN0YXJ0LFxuXHRcdFx0Y291bnQ6IGNvdW50LFxuXHRcdFx0bWF0ZXJpYWxJbmRleDogbWF0ZXJpYWxJbmRleCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWxJbmRleCA6IDBcblxuXHRcdH0gKTtcblxuXHR9LFxuXG5cdGNsZWFyR3JvdXBzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmdyb3VwcyA9IFtdO1xuXG5cdH0sXG5cblx0c2V0RHJhd1JhbmdlOiBmdW5jdGlvbiAoIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdHRoaXMuZHJhd1JhbmdlLnN0YXJ0ID0gc3RhcnQ7XG5cdFx0dGhpcy5kcmF3UmFuZ2UuY291bnQgPSBjb3VudDtcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4OiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdHZhciBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uICk7XG5cdFx0XHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHR2YXIgbm9ybWFsID0gdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtcblxuXHRcdGlmICggbm9ybWFsICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpLmdldE5vcm1hbE1hdHJpeCggbWF0cml4ICk7XG5cblx0XHRcdG5vcm1hbE1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBub3JtYWwgKTtcblx0XHRcdG5vcm1hbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdGF0ZVg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgeC1heGlzXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVgoIGFuZ2xlICkge1xuXG5cdFx0XHRtMS5tYWtlUm90YXRpb25YKCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgeS1heGlzXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVkoIGFuZ2xlICkge1xuXG5cdFx0XHRtMS5tYWtlUm90YXRpb25ZKCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVo6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgei1heGlzXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVooIGFuZ2xlICkge1xuXG5cdFx0XHRtMS5tYWtlUm90YXRpb25aKCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gdHJhbnNsYXRlIGdlb21ldHJ5XG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZSggeCwgeSwgeiApIHtcblxuXHRcdFx0bTEubWFrZVRyYW5zbGF0aW9uKCB4LCB5LCB6ICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0c2NhbGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHNjYWxlIGdlb21ldHJ5XG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNjYWxlKCB4LCB5LCB6ICkge1xuXG5cdFx0XHRtMS5tYWtlU2NhbGUoIHgsIHksIHogKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRsb29rQXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvYmogPSBuZXcgT2JqZWN0M0QoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBsb29rQXQoIHZlY3RvciApIHtcblxuXHRcdFx0b2JqLmxvb2tBdCggdmVjdG9yICk7XG5cblx0XHRcdG9iai51cGRhdGVNYXRyaXgoKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggb2JqLm1hdHJpeCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2VudGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO1xuXG5cdFx0dmFyIG9mZnNldCA9IHRoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKCkubmVnYXRlKCk7XG5cblx0XHR0aGlzLnRyYW5zbGF0ZSggb2Zmc2V0LngsIG9mZnNldC55LCBvZmZzZXQueiApO1xuXG5cdFx0cmV0dXJuIG9mZnNldDtcblxuXHR9LFxuXG5cdHNldEZyb21PYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0Ly8gY29uc29sZS5sb2coICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5zZXRGcm9tT2JqZWN0KCkuIENvbnZlcnRpbmcnLCBvYmplY3QsIHRoaXMgKTtcblxuXHRcdHZhciBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTtcblxuXHRcdGlmICggb2JqZWN0LmlzUG9pbnRzIHx8IG9iamVjdC5pc0xpbmUgKSB7XG5cblx0XHRcdHZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoICogMywgMyApO1xuXHRcdFx0dmFyIGNvbG9ycyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS5jb2xvcnMubGVuZ3RoICogMywgMyApO1xuXG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgcG9zaXRpb25zLmNvcHlWZWN0b3Izc0FycmF5KCBnZW9tZXRyeS52ZXJ0aWNlcyApICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgY29sb3JzLmNvcHlDb2xvcnNBcnJheSggZ2VvbWV0cnkuY29sb3JzICkgKTtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5saW5lRGlzdGFuY2VzICYmIGdlb21ldHJ5LmxpbmVEaXN0YW5jZXMubGVuZ3RoID09PSBnZW9tZXRyeS52ZXJ0aWNlcy5sZW5ndGggKSB7XG5cblx0XHRcdFx0dmFyIGxpbmVEaXN0YW5jZXMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkubGluZURpc3RhbmNlcy5sZW5ndGgsIDEgKTtcblxuXHRcdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ2xpbmVEaXN0YW5jZScsIGxpbmVEaXN0YW5jZXMuY29weUFycmF5KCBnZW9tZXRyeS5saW5lRGlzdGFuY2VzICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IGdlb21ldHJ5LmJvdW5kaW5nQm94LmNsb25lKCk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc01lc2ggKSB7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR0aGlzLmZyb21HZW9tZXRyeSggZ2VvbWV0cnkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR1cGRhdGVGcm9tT2JqZWN0OiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTtcblxuXHRcdGlmICggb2JqZWN0LmlzTWVzaCApIHtcblxuXHRcdFx0dmFyIGRpcmVjdCA9IGdlb21ldHJ5Ll9fZGlyZWN0R2VvbWV0cnk7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuZWxlbWVudHNOZWVkVXBkYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRcdGRpcmVjdCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0Z2VvbWV0cnkuZWxlbWVudHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBkaXJlY3QgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gdGhpcy5mcm9tR2VvbWV0cnkoIGdlb21ldHJ5ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0ZGlyZWN0LnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZTtcblx0XHRcdGRpcmVjdC5ub3JtYWxzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5Lm5vcm1hbHNOZWVkVXBkYXRlO1xuXHRcdFx0ZGlyZWN0LmNvbG9yc05lZWRVcGRhdGUgPSBnZW9tZXRyeS5jb2xvcnNOZWVkVXBkYXRlO1xuXHRcdFx0ZGlyZWN0LnV2c05lZWRVcGRhdGUgPSBnZW9tZXRyeS51dnNOZWVkVXBkYXRlO1xuXHRcdFx0ZGlyZWN0Lmdyb3Vwc05lZWRVcGRhdGUgPSBnZW9tZXRyeS5ncm91cHNOZWVkVXBkYXRlO1xuXG5cdFx0XHRnZW9tZXRyeS52ZXJ0aWNlc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0XHRcdGdlb21ldHJ5Lm5vcm1hbHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdFx0XHRnZW9tZXRyeS5jb2xvcnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdFx0XHRnZW9tZXRyeS51dnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdFx0XHRnZW9tZXRyeS5ncm91cHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHRcdGdlb21ldHJ5ID0gZGlyZWN0O1xuXG5cdFx0fVxuXG5cdFx0dmFyIGF0dHJpYnV0ZTtcblxuXHRcdGlmICggZ2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRhdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRcdGlmICggYXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlLmNvcHlWZWN0b3Izc0FycmF5KCBnZW9tZXRyeS52ZXJ0aWNlcyApO1xuXHRcdFx0XHRhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5ub3JtYWxzTmVlZFVwZGF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0YXR0cmlidXRlID0gdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5Lm5vcm1hbHMgKTtcblx0XHRcdFx0YXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeS5ub3JtYWxzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5jb2xvcnNOZWVkVXBkYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRhdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXMuY29sb3I7XG5cblx0XHRcdGlmICggYXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlLmNvcHlDb2xvcnNBcnJheSggZ2VvbWV0cnkuY29sb3JzICk7XG5cdFx0XHRcdGF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkuY29sb3JzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS51dnNOZWVkVXBkYXRlICkge1xuXG5cdFx0XHRhdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXMudXY7XG5cblx0XHRcdGlmICggYXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlLmNvcHlWZWN0b3Iyc0FycmF5KCBnZW9tZXRyeS51dnMgKTtcblx0XHRcdFx0YXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeS51dnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlICkge1xuXG5cdFx0XHRhdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXMubGluZURpc3RhbmNlO1xuXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGF0dHJpYnV0ZS5jb3B5QXJyYXkoIGdlb21ldHJ5LmxpbmVEaXN0YW5jZXMgKTtcblx0XHRcdFx0YXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeS5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5ncm91cHNOZWVkVXBkYXRlICkge1xuXG5cdFx0XHRnZW9tZXRyeS5jb21wdXRlR3JvdXBzKCBvYmplY3QuZ2VvbWV0cnkgKTtcblx0XHRcdHRoaXMuZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXG5cdFx0XHRnZW9tZXRyeS5ncm91cHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGZyb21HZW9tZXRyeTogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHtcblxuXHRcdGdlb21ldHJ5Ll9fZGlyZWN0R2VvbWV0cnkgPSBuZXcgRGlyZWN0R2VvbWV0cnkoKS5mcm9tR2VvbWV0cnkoIGdlb21ldHJ5ICk7XG5cblx0XHRyZXR1cm4gdGhpcy5mcm9tRGlyZWN0R2VvbWV0cnkoIGdlb21ldHJ5Ll9fZGlyZWN0R2VvbWV0cnkgKTtcblxuXHR9LFxuXG5cdGZyb21EaXJlY3RHZW9tZXRyeTogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHtcblxuXHRcdHZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KCBnZW9tZXRyeS52ZXJ0aWNlcy5sZW5ndGggKiAzICk7XG5cdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9ucywgMyApLmNvcHlWZWN0b3Izc0FycmF5KCBnZW9tZXRyeS52ZXJ0aWNlcyApICk7XG5cblx0XHRpZiAoIGdlb21ldHJ5Lm5vcm1hbHMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIG5vcm1hbHMgPSBuZXcgRmxvYXQzMkFycmF5KCBnZW9tZXRyeS5ub3JtYWxzLmxlbmd0aCAqIDMgKTtcblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApLmNvcHlWZWN0b3Izc0FycmF5KCBnZW9tZXRyeS5ub3JtYWxzICkgKTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkuY29sb3JzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkFycmF5KCBnZW9tZXRyeS5jb2xvcnMubGVuZ3RoICogMyApO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApLmNvcHlDb2xvcnNBcnJheSggZ2VvbWV0cnkuY29sb3JzICkgKTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkudXZzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZhciB1dnMgPSBuZXcgRmxvYXQzMkFycmF5KCBnZW9tZXRyeS51dnMubGVuZ3RoICogMiApO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApLmNvcHlWZWN0b3Iyc0FycmF5KCBnZW9tZXRyeS51dnMgKSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS51dnMyLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZhciB1dnMyID0gbmV3IEZsb2F0MzJBcnJheSggZ2VvbWV0cnkudXZzMi5sZW5ndGggKiAyICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2MicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHV2czIsIDIgKS5jb3B5VmVjdG9yMnNBcnJheSggZ2VvbWV0cnkudXZzMiApICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LmluZGljZXMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIFR5cGVBcnJheSA9IGFycmF5TWF4KCBnZW9tZXRyeS5pbmRpY2VzICkgPiA2NTUzNSA/IFVpbnQzMkFycmF5IDogVWludDE2QXJyYXk7XG5cdFx0XHR2YXIgaW5kaWNlcyA9IG5ldyBUeXBlQXJyYXkoIGdlb21ldHJ5LmluZGljZXMubGVuZ3RoICogMyApO1xuXHRcdFx0dGhpcy5zZXRJbmRleCggbmV3IEJ1ZmZlckF0dHJpYnV0ZSggaW5kaWNlcywgMSApLmNvcHlJbmRpY2VzQXJyYXkoIGdlb21ldHJ5LmluZGljZXMgKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZ3JvdXBzXG5cblx0XHR0aGlzLmdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcblxuXHRcdC8vIG1vcnBoc1xuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gZ2VvbWV0cnkubW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBbXTtcblx0XHRcdHZhciBtb3JwaFRhcmdldHMgPSBnZW9tZXRyeS5tb3JwaFRhcmdldHNbIG5hbWUgXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIG1vcnBoVGFyZ2V0ID0gbW9ycGhUYXJnZXRzWyBpIF07XG5cblx0XHRcdFx0dmFyIGF0dHJpYnV0ZSA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBtb3JwaFRhcmdldC5sZW5ndGggKiAzLCAzICk7XG5cblx0XHRcdFx0YXJyYXkucHVzaCggYXR0cmlidXRlLmNvcHlWZWN0b3Izc0FycmF5KCBtb3JwaFRhcmdldCApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5tb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXSA9IGFycmF5O1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2tpbm5pbmdcblxuXHRcdGlmICggZ2VvbWV0cnkuc2tpbkluZGljZXMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIHNraW5JbmRpY2VzID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCAqIDQsIDQgKTtcblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAnc2tpbkluZGV4Jywgc2tpbkluZGljZXMuY29weVZlY3RvcjRzQXJyYXkoIGdlb21ldHJ5LnNraW5JbmRpY2VzICkgKTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkuc2tpbldlaWdodHMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIHNraW5XZWlnaHRzID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LnNraW5XZWlnaHRzLmxlbmd0aCAqIDQsIDQgKTtcblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAnc2tpbldlaWdodCcsIHNraW5XZWlnaHRzLmNvcHlWZWN0b3I0c0FycmF5KCBnZW9tZXRyeS5za2luV2VpZ2h0cyApICk7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gZ2VvbWV0cnkuYm91bmRpbmdCb3guY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29tcHV0ZUJvdW5kaW5nQm94OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdCb3ggPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBuZXcgQm94MygpO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHBvc2l0aW9uID0gdGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0aWYgKCBwb3NpdGlvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBpc05hTiggdGhpcy5ib3VuZGluZ0JveC5taW4ueCApIHx8IGlzTmFOKCB0aGlzLmJvdW5kaW5nQm94Lm1pbi55ICkgfHwgaXNOYU4oIHRoaXMuYm91bmRpbmdCb3gubWluLnogKSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveDogQ29tcHV0ZWQgbWluL21heCBoYXZlIE5hTiB2YWx1ZXMuIFRoZSBcInBvc2l0aW9uXCIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJywgdGhpcyApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y29tcHV0ZUJvdW5kaW5nU3BoZXJlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYm94ID0gbmV3IEJveDMoKTtcblx0XHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjb21wdXRlQm91bmRpbmdTcGhlcmUoKSB7XG5cblx0XHRcdGlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdFx0aWYgKCBwb3NpdGlvbiApIHtcblxuXHRcdFx0XHR2YXIgY2VudGVyID0gdGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7XG5cblx0XHRcdFx0Ym94LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uICk7XG5cdFx0XHRcdGJveC5nZXRDZW50ZXIoIGNlbnRlciApO1xuXG5cdFx0XHRcdC8vIGhvcGluZyB0byBmaW5kIGEgYm91bmRpbmdTcGhlcmUgd2l0aCBhIHJhZGl1cyBzbWFsbGVyIHRoYW4gdGhlXG5cdFx0XHRcdC8vIGJvdW5kaW5nU3BoZXJlIG9mIHRoZSBib3VuZGluZ0JveDogc3FydCgzKSBzbWFsbGVyIGluIHRoZSBiZXN0IGNhc2VcblxuXHRcdFx0XHR2YXIgbWF4UmFkaXVzU3EgPSAwO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBwb3NpdGlvbi5jb3VudDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmVjdG9yLnggPSBwb3NpdGlvbi5nZXRYKCBpICk7XG5cdFx0XHRcdFx0dmVjdG9yLnkgPSBwb3NpdGlvbi5nZXRZKCBpICk7XG5cdFx0XHRcdFx0dmVjdG9yLnogPSBwb3NpdGlvbi5nZXRaKCBpICk7XG5cdFx0XHRcdFx0bWF4UmFkaXVzU3EgPSBNYXRoLm1heCggbWF4UmFkaXVzU3EsIGNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCggdmVjdG9yICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXMgPSBNYXRoLnNxcnQoIG1heFJhZGl1c1NxICk7XG5cblx0XHRcdFx0aWYgKCBpc05hTiggdGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXMgKSApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogQ29tcHV0ZWQgcmFkaXVzIGlzIE5hTi4gVGhlIFwicG9zaXRpb25cIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLCB0aGlzICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjb21wdXRlRmFjZU5vcm1hbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cblx0fSxcblxuXHRjb21wdXRlVmVydGV4Tm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGluZGV4ID0gdGhpcy5pbmRleDtcblx0XHR2YXIgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcblx0XHR2YXIgZ3JvdXBzID0gdGhpcy5ncm91cHM7XG5cblx0XHRpZiAoIGF0dHJpYnV0ZXMucG9zaXRpb24gKSB7XG5cblx0XHRcdHZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZXMubm9ybWFsID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBuZXcgRmxvYXQzMkFycmF5KCBwb3NpdGlvbnMubGVuZ3RoICksIDMgKSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIHJlc2V0IGV4aXN0aW5nIG5vcm1hbHMgdG8gemVyb1xuXG5cdFx0XHRcdHZhciBhcnJheSA9IGF0dHJpYnV0ZXMubm9ybWFsLmFycmF5O1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBhcnJheS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGFycmF5WyBpIF0gPSAwO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgbm9ybWFscyA9IGF0dHJpYnV0ZXMubm9ybWFsLmFycmF5O1xuXG5cdFx0XHR2YXIgdkEsIHZCLCB2Qztcblx0XHRcdHZhciBwQSA9IG5ldyBWZWN0b3IzKCksIHBCID0gbmV3IFZlY3RvcjMoKSwgcEMgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0dmFyIGNiID0gbmV3IFZlY3RvcjMoKSwgYWIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHQvLyBpbmRleGVkIGVsZW1lbnRzXG5cblx0XHRcdGlmICggaW5kZXggKSB7XG5cblx0XHRcdFx0dmFyIGluZGljZXMgPSBpbmRleC5hcnJheTtcblxuXHRcdFx0XHRpZiAoIGdyb3Vwcy5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdFx0XHR0aGlzLmFkZEdyb3VwKCAwLCBpbmRpY2VzLmxlbmd0aCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gZ3JvdXBzLmxlbmd0aDsgaiA8IGpsOyArKyBqICkge1xuXG5cdFx0XHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBqIF07XG5cblx0XHRcdFx0XHR2YXIgc3RhcnQgPSBncm91cC5zdGFydDtcblx0XHRcdFx0XHR2YXIgY291bnQgPSBncm91cC5jb3VudDtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gc3RhcnQsIGlsID0gc3RhcnQgKyBjb3VudDsgaSA8IGlsOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0XHRcdHZBID0gaW5kaWNlc1sgaSArIDAgXSAqIDM7XG5cdFx0XHRcdFx0XHR2QiA9IGluZGljZXNbIGkgKyAxIF0gKiAzO1xuXHRcdFx0XHRcdFx0dkMgPSBpbmRpY2VzWyBpICsgMiBdICogMztcblxuXHRcdFx0XHRcdFx0cEEuZnJvbUFycmF5KCBwb3NpdGlvbnMsIHZBICk7XG5cdFx0XHRcdFx0XHRwQi5mcm9tQXJyYXkoIHBvc2l0aW9ucywgdkIgKTtcblx0XHRcdFx0XHRcdHBDLmZyb21BcnJheSggcG9zaXRpb25zLCB2QyApO1xuXG5cdFx0XHRcdFx0XHRjYi5zdWJWZWN0b3JzKCBwQywgcEIgKTtcblx0XHRcdFx0XHRcdGFiLnN1YlZlY3RvcnMoIHBBLCBwQiApO1xuXHRcdFx0XHRcdFx0Y2IuY3Jvc3MoIGFiICk7XG5cblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZBIF0gKz0gY2IueDtcblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZBICsgMSBdICs9IGNiLnk7XG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QSArIDIgXSArPSBjYi56O1xuXG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QiBdICs9IGNiLng7XG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QiArIDEgXSArPSBjYi55O1xuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkIgKyAyIF0gKz0gY2IuejtcblxuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkMgXSArPSBjYi54O1xuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkMgKyAxIF0gKz0gY2IueTtcblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZDICsgMiBdICs9IGNiLno7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIG5vbi1pbmRleGVkIGVsZW1lbnRzICh1bmNvbm5lY3RlZCB0cmlhbmdsZSBzb3VwKVxuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBwb3NpdGlvbnMubGVuZ3RoOyBpIDwgaWw7IGkgKz0gOSApIHtcblxuXHRcdFx0XHRcdHBBLmZyb21BcnJheSggcG9zaXRpb25zLCBpICk7XG5cdFx0XHRcdFx0cEIuZnJvbUFycmF5KCBwb3NpdGlvbnMsIGkgKyAzICk7XG5cdFx0XHRcdFx0cEMuZnJvbUFycmF5KCBwb3NpdGlvbnMsIGkgKyA2ICk7XG5cblx0XHRcdFx0XHRjYi5zdWJWZWN0b3JzKCBwQywgcEIgKTtcblx0XHRcdFx0XHRhYi5zdWJWZWN0b3JzKCBwQSwgcEIgKTtcblx0XHRcdFx0XHRjYi5jcm9zcyggYWIgKTtcblxuXHRcdFx0XHRcdG5vcm1hbHNbIGkgXSA9IGNiLng7XG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDEgXSA9IGNiLnk7XG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDIgXSA9IGNiLno7XG5cblx0XHRcdFx0XHRub3JtYWxzWyBpICsgMyBdID0gY2IueDtcblx0XHRcdFx0XHRub3JtYWxzWyBpICsgNCBdID0gY2IueTtcblx0XHRcdFx0XHRub3JtYWxzWyBpICsgNSBdID0gY2IuejtcblxuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyA2IF0gPSBjYi54O1xuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyA3IF0gPSBjYi55O1xuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyA4IF0gPSBjYi56O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKTtcblxuXHRcdFx0YXR0cmlidXRlcy5ub3JtYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0bWVyZ2U6IGZ1bmN0aW9uICggZ2VvbWV0cnksIG9mZnNldCApIHtcblxuXHRcdGlmICggKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkubWVyZ2UoKTogZ2VvbWV0cnkgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkJ1ZmZlckdlb21ldHJ5LicsIGdlb21ldHJ5ICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggdmFyIGtleSBpbiBhdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmF0dHJpYnV0ZXNbIGtleSBdID09PSB1bmRlZmluZWQgKSBjb250aW51ZTtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZTEgPSBhdHRyaWJ1dGVzWyBrZXkgXTtcblx0XHRcdHZhciBhdHRyaWJ1dGVBcnJheTEgPSBhdHRyaWJ1dGUxLmFycmF5O1xuXG5cdFx0XHR2YXIgYXR0cmlidXRlMiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXNbIGtleSBdO1xuXHRcdFx0dmFyIGF0dHJpYnV0ZUFycmF5MiA9IGF0dHJpYnV0ZTIuYXJyYXk7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGVTaXplID0gYXR0cmlidXRlMi5pdGVtU2l6ZTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBqID0gYXR0cmlidXRlU2l6ZSAqIG9mZnNldDsgaSA8IGF0dHJpYnV0ZUFycmF5Mi5sZW5ndGg7IGkgKyssIGogKysgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlQXJyYXkxWyBqIF0gPSBhdHRyaWJ1dGVBcnJheTJbIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRub3JtYWxpemVOb3JtYWxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbm9ybWFscyA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7XG5cblx0XHR2YXIgeCwgeSwgeiwgbjtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBub3JtYWxzLmNvdW50OyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHggPSBub3JtYWxzLmdldFgoIGkgKTtcblx0XHRcdHkgPSBub3JtYWxzLmdldFkoIGkgKTtcblx0XHRcdHogPSBub3JtYWxzLmdldFooIGkgKTtcblxuXHRcdFx0biA9IDEuMCAvIE1hdGguc3FydCggeCAqIHggKyB5ICogeSArIHogKiB6ICk7XG5cblx0XHRcdG5vcm1hbHMuc2V0WFlaKCBpLCB4ICogbiwgeSAqIG4sIHogKiBuICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR0b05vbkluZGV4ZWQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5pbmRleCA9PT0gbnVsbCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkudG9Ob25JbmRleGVkKCk6IEdlb21ldHJ5IGlzIGFscmVhZHkgbm9uLWluZGV4ZWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHR2YXIgZ2VvbWV0cnkyID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0XHR2YXIgaW5kaWNlcyA9IHRoaXMuaW5kZXguYXJyYXk7XG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCB2YXIgbmFtZSBpbiBhdHRyaWJ1dGVzICkge1xuXG5cdFx0XHR2YXIgYXR0cmlidXRlID0gYXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBhdHRyaWJ1dGUuYXJyYXk7XG5cdFx0XHR2YXIgaXRlbVNpemUgPSBhdHRyaWJ1dGUuaXRlbVNpemU7XG5cblx0XHRcdHZhciBhcnJheTIgPSBuZXcgYXJyYXkuY29uc3RydWN0b3IoIGluZGljZXMubGVuZ3RoICogaXRlbVNpemUgKTtcblxuXHRcdFx0dmFyIGluZGV4ID0gMCwgaW5kZXgyID0gMDtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gaW5kaWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGluZGV4ID0gaW5kaWNlc1sgaSBdICogaXRlbVNpemU7XG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwOyBqIDwgaXRlbVNpemU7IGogKysgKSB7XG5cblx0XHRcdFx0XHRhcnJheTJbIGluZGV4MiArKyBdID0gYXJyYXlbIGluZGV4ICsrIF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5Mi5hZGRBdHRyaWJ1dGUoIG5hbWUsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGFycmF5MiwgaXRlbVNpemUgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGdlb21ldHJ5MjtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGRhdGEgPSB7XG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdCdWZmZXJHZW9tZXRyeScsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ0J1ZmZlckdlb21ldHJ5LnRvSlNPTidcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gc3RhbmRhcmQgQnVmZmVyR2VvbWV0cnkgc2VyaWFsaXphdGlvblxuXG5cdFx0ZGF0YS51dWlkID0gdGhpcy51dWlkO1xuXHRcdGRhdGEudHlwZSA9IHRoaXMudHlwZTtcblx0XHRpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBkYXRhLm5hbWUgPSB0aGlzLm5hbWU7XG5cblx0XHRpZiAoIHRoaXMucGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycztcblxuXHRcdFx0Zm9yICggdmFyIGtleSBpbiBwYXJhbWV0ZXJzICkge1xuXG5cdFx0XHRcdGlmICggcGFyYW1ldGVyc1sga2V5IF0gIT09IHVuZGVmaW5lZCApIGRhdGFbIGtleSBdID0gcGFyYW1ldGVyc1sga2V5IF07XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cblx0XHR9XG5cblx0XHRkYXRhLmRhdGEgPSB7IGF0dHJpYnV0ZXM6IHt9IH07XG5cblx0XHR2YXIgaW5kZXggPSB0aGlzLmluZGV4O1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGluZGV4LmFycmF5ICk7XG5cblx0XHRcdGRhdGEuZGF0YS5pbmRleCA9IHtcblx0XHRcdFx0dHlwZTogaW5kZXguYXJyYXkuY29uc3RydWN0b3IubmFtZSxcblx0XHRcdFx0YXJyYXk6IGFycmF5XG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCB2YXIga2V5IGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBrZXkgXTtcblxuXHRcdFx0dmFyIGFycmF5ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGF0dHJpYnV0ZS5hcnJheSApO1xuXG5cdFx0XHRkYXRhLmRhdGEuYXR0cmlidXRlc1sga2V5IF0gPSB7XG5cdFx0XHRcdGl0ZW1TaXplOiBhdHRyaWJ1dGUuaXRlbVNpemUsXG5cdFx0XHRcdHR5cGU6IGF0dHJpYnV0ZS5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLFxuXHRcdFx0XHRhcnJheTogYXJyYXksXG5cdFx0XHRcdG5vcm1hbGl6ZWQ6IGF0dHJpYnV0ZS5ub3JtYWxpemVkXG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0dmFyIGdyb3VwcyA9IHRoaXMuZ3JvdXBzO1xuXG5cdFx0aWYgKCBncm91cHMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0ZGF0YS5kYXRhLmdyb3VwcyA9IEpTT04ucGFyc2UoIEpTT04uc3RyaW5naWZ5KCBncm91cHMgKSApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGJvdW5kaW5nU3BoZXJlID0gdGhpcy5ib3VuZGluZ1NwaGVyZTtcblxuXHRcdGlmICggYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdGRhdGEuZGF0YS5ib3VuZGluZ1NwaGVyZSA9IHtcblx0XHRcdFx0Y2VudGVyOiBib3VuZGluZ1NwaGVyZS5jZW50ZXIudG9BcnJheSgpLFxuXHRcdFx0XHRyYWRpdXM6IGJvdW5kaW5nU3BoZXJlLnJhZGl1c1xuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8qXG5cdFx0IC8vIEhhbmRsZSBwcmltaXRpdmVzXG5cblx0XHQgdmFyIHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7XG5cblx0XHQgaWYgKCBwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHQgdmFyIHZhbHVlcyA9IFtdO1xuXG5cdFx0IGZvciAoIHZhciBrZXkgaW4gcGFyYW1ldGVycyApIHtcblxuXHRcdCB2YWx1ZXMucHVzaCggcGFyYW1ldGVyc1sga2V5IF0gKTtcblxuXHRcdCB9XG5cblx0XHQgdmFyIGdlb21ldHJ5ID0gT2JqZWN0LmNyZWF0ZSggdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgKTtcblx0XHQgdGhpcy5jb25zdHJ1Y3Rvci5hcHBseSggZ2VvbWV0cnksIHZhbHVlcyApO1xuXHRcdCByZXR1cm4gZ2VvbWV0cnk7XG5cblx0XHQgfVxuXG5cdFx0IHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblx0XHQgKi9cblxuXHRcdHJldHVybiBuZXcgQnVmZmVyR2VvbWV0cnkoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHZhciBuYW1lLCBpLCBsO1xuXG5cdFx0Ly8gcmVzZXRcblxuXHRcdHRoaXMuaW5kZXggPSBudWxsO1xuXHRcdHRoaXMuYXR0cmlidXRlcyA9IHt9O1xuXHRcdHRoaXMubW9ycGhBdHRyaWJ1dGVzID0ge307XG5cdFx0dGhpcy5ncm91cHMgPSBbXTtcblx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDtcblx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDtcblxuXHRcdC8vIG5hbWVcblxuXHRcdHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lO1xuXG5cdFx0Ly8gaW5kZXhcblxuXHRcdHZhciBpbmRleCA9IHNvdXJjZS5pbmRleDtcblxuXHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuc2V0SW5kZXgoIGluZGV4LmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGF0dHJpYnV0ZXNcblxuXHRcdHZhciBhdHRyaWJ1dGVzID0gc291cmNlLmF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCBuYW1lIGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBuYW1lIF07XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggbmFtZSwgYXR0cmlidXRlLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIG1vcnBoIGF0dHJpYnV0ZXNcblxuXHRcdHZhciBtb3JwaEF0dHJpYnV0ZXMgPSBzb3VyY2UubW9ycGhBdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggbmFtZSBpbiBtb3JwaEF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdHZhciBhcnJheSA9IFtdO1xuXHRcdFx0dmFyIG1vcnBoQXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF07IC8vIG1vcnBoQXR0cmlidXRlOiBhcnJheSBvZiBGbG9hdDMyQnVmZmVyQXR0cmlidXRlc1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9IG1vcnBoQXR0cmlidXRlLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0YXJyYXkucHVzaCggbW9ycGhBdHRyaWJ1dGVbIGkgXS5jbG9uZSgpICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5tb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXSA9IGFycmF5O1xuXG5cdFx0fVxuXG5cdFx0Ly8gZ3JvdXBzXG5cblx0XHR2YXIgZ3JvdXBzID0gc291cmNlLmdyb3VwcztcblxuXHRcdGZvciAoIGkgPSAwLCBsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgaSBdO1xuXHRcdFx0dGhpcy5hZGRHcm91cCggZ3JvdXAuc3RhcnQsIGdyb3VwLmNvdW50LCBncm91cC5tYXRlcmlhbEluZGV4ICk7XG5cblx0XHR9XG5cblx0XHQvLyBib3VuZGluZyBib3hcblxuXHRcdHZhciBib3VuZGluZ0JveCA9IHNvdXJjZS5ib3VuZGluZ0JveDtcblxuXHRcdGlmICggYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBib3VuZGluZ0JveC5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYm91bmRpbmcgc3BoZXJlXG5cblx0XHR2YXIgYm91bmRpbmdTcGhlcmUgPSBzb3VyY2UuYm91bmRpbmdTcGhlcmU7XG5cblx0XHRpZiAoIGJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gYm91bmRpbmdTcGhlcmUuY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdC8vIGRyYXcgcmFuZ2VcblxuXHRcdHRoaXMuZHJhd1JhbmdlLnN0YXJ0ID0gc291cmNlLmRyYXdSYW5nZS5zdGFydDtcblx0XHR0aGlzLmRyYXdSYW5nZS5jb3VudCA9IHNvdXJjZS5kcmF3UmFuZ2UuY291bnQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3Igam9ub2JyMSAvIGh0dHA6Ly9qb25vYnIxLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoJztcblxuXHR0aGlzLmdlb21ldHJ5ID0gZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCA/IGdlb21ldHJ5IDogbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWwgOiBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZiB9ICk7XG5cblx0dGhpcy5kcmF3TW9kZSA9IFRyaWFuZ2xlc0RyYXdNb2RlO1xuXG5cdHRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCk7XG5cbn1cblxuTWVzaC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBNZXNoLFxuXG5cdGlzTWVzaDogdHJ1ZSxcblxuXHRzZXREcmF3TW9kZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuZHJhd01vZGUgPSB2YWx1ZTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmRyYXdNb2RlID0gc291cmNlLmRyYXdNb2RlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR1cGRhdGVNb3JwaFRhcmdldHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtb3JwaFRhcmdldHMgPSB0aGlzLmdlb21ldHJ5Lm1vcnBoVGFyZ2V0cztcblxuXHRcdGlmICggbW9ycGhUYXJnZXRzICE9PSB1bmRlZmluZWQgJiYgbW9ycGhUYXJnZXRzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzID0gW107XG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IHt9O1xuXG5cdFx0XHRmb3IgKCB2YXIgbSA9IDAsIG1sID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgbSA8IG1sOyBtICsrICkge1xuXG5cdFx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goIDAgKTtcblx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbIG1vcnBoVGFyZ2V0c1sgbSBdLm5hbWUgXSA9IG07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdHJheWNhc3Q6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGludmVyc2VNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHRcdHZhciByYXkgPSBuZXcgUmF5KCk7XG5cdFx0dmFyIHNwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdHZhciB2QSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHZCID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdkMgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIHRlbXBBID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdGVtcEIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB0ZW1wQyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgdXZBID0gbmV3IFZlY3RvcjIoKTtcblx0XHR2YXIgdXZCID0gbmV3IFZlY3RvcjIoKTtcblx0XHR2YXIgdXZDID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdHZhciBiYXJ5Y29vcmQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIGludGVyc2VjdGlvblBvaW50ID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgaW50ZXJzZWN0aW9uUG9pbnRXb3JsZCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRmdW5jdGlvbiB1dkludGVyc2VjdGlvbiggcG9pbnQsIHAxLCBwMiwgcDMsIHV2MSwgdXYyLCB1djMgKSB7XG5cblx0XHRcdFRyaWFuZ2xlLmJhcnljb29yZEZyb21Qb2ludCggcG9pbnQsIHAxLCBwMiwgcDMsIGJhcnljb29yZCApO1xuXG5cdFx0XHR1djEubXVsdGlwbHlTY2FsYXIoIGJhcnljb29yZC54ICk7XG5cdFx0XHR1djIubXVsdGlwbHlTY2FsYXIoIGJhcnljb29yZC55ICk7XG5cdFx0XHR1djMubXVsdGlwbHlTY2FsYXIoIGJhcnljb29yZC56ICk7XG5cblx0XHRcdHV2MS5hZGQoIHV2MiApLmFkZCggdXYzICk7XG5cblx0XHRcdHJldHVybiB1djEuY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGNoZWNrSW50ZXJzZWN0aW9uKCBvYmplY3QsIHJheWNhc3RlciwgcmF5LCBwQSwgcEIsIHBDLCBwb2ludCApIHtcblxuXHRcdFx0dmFyIGludGVyc2VjdDtcblx0XHRcdHZhciBtYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApIHtcblxuXHRcdFx0XHRpbnRlcnNlY3QgPSByYXkuaW50ZXJzZWN0VHJpYW5nbGUoIHBDLCBwQiwgcEEsIHRydWUsIHBvaW50ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0aW50ZXJzZWN0ID0gcmF5LmludGVyc2VjdFRyaWFuZ2xlKCBwQSwgcEIsIHBDLCBtYXRlcmlhbC5zaWRlICE9PSBEb3VibGVTaWRlLCBwb2ludCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaW50ZXJzZWN0ID09PSBudWxsICkgcmV0dXJuIG51bGw7XG5cblx0XHRcdGludGVyc2VjdGlvblBvaW50V29ybGQuY29weSggcG9pbnQgKTtcblx0XHRcdGludGVyc2VjdGlvblBvaW50V29ybGQuYXBwbHlNYXRyaXg0KCBvYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdFx0dmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJzZWN0aW9uUG9pbnRXb3JsZCApO1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgcmV0dXJuIG51bGw7XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdFx0cG9pbnQ6IGludGVyc2VjdGlvblBvaW50V29ybGQuY2xvbmUoKSxcblx0XHRcdFx0b2JqZWN0OiBvYmplY3Rcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBjaGVja0J1ZmZlckdlb21ldHJ5SW50ZXJzZWN0aW9uKCBvYmplY3QsIHJheWNhc3RlciwgcmF5LCBwb3NpdGlvbiwgdXYsIGEsIGIsIGMgKSB7XG5cblx0XHRcdHZBLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBhICk7XG5cdFx0XHR2Qi5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgYiApO1xuXHRcdFx0dkMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGMgKTtcblxuXHRcdFx0dmFyIGludGVyc2VjdGlvbiA9IGNoZWNrSW50ZXJzZWN0aW9uKCBvYmplY3QsIHJheWNhc3RlciwgcmF5LCB2QSwgdkIsIHZDLCBpbnRlcnNlY3Rpb25Qb2ludCApO1xuXG5cdFx0XHRpZiAoIGludGVyc2VjdGlvbiApIHtcblxuXHRcdFx0XHRpZiAoIHV2ICkge1xuXG5cdFx0XHRcdFx0dXZBLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHV2LCBhICk7XG5cdFx0XHRcdFx0dXZCLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHV2LCBiICk7XG5cdFx0XHRcdFx0dXZDLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHV2LCBjICk7XG5cblx0XHRcdFx0XHRpbnRlcnNlY3Rpb24udXYgPSB1dkludGVyc2VjdGlvbiggaW50ZXJzZWN0aW9uUG9pbnQsIHZBLCB2QiwgdkMsIHV2QSwgdXZCLCB1dkMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2UgPSBuZXcgRmFjZTMoIGEsIGIsIGMsIFRyaWFuZ2xlLm5vcm1hbCggdkEsIHZCLCB2QyApICk7XG5cdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBhO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBpbnRlcnNlY3Rpb247XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdFx0dmFyIG1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbDtcblx0XHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdFx0Ly8gQ2hlY2tpbmcgYm91bmRpbmdTcGhlcmUgZGlzdGFuY2UgdG8gcmF5XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdFx0c3BoZXJlLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICk7XG5cdFx0XHRzcGhlcmUuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRpZiAoIHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0XHQvL1xuXG5cdFx0XHRpbnZlcnNlTWF0cml4LmdldEludmVyc2UoIG1hdHJpeFdvcmxkICk7XG5cdFx0XHRyYXkuY29weSggcmF5Y2FzdGVyLnJheSApLmFwcGx5TWF0cml4NCggaW52ZXJzZU1hdHJpeCApO1xuXG5cdFx0XHQvLyBDaGVjayBib3VuZGluZ0JveCBiZWZvcmUgY29udGludWluZ1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdGlmICggcmF5LmludGVyc2VjdHNCb3goIGdlb21ldHJ5LmJvdW5kaW5nQm94ICkgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBpbnRlcnNlY3Rpb247XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgYSwgYiwgYztcblx0XHRcdFx0dmFyIGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0XHRcdHZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0XHRcdHZhciB1diA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMudXY7XG5cdFx0XHRcdHZhciBpLCBsO1xuXG5cdFx0XHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHQvLyBpbmRleGVkIGJ1ZmZlciBnZW9tZXRyeVxuXG5cdFx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBpbmRleC5jb3VudDsgaSA8IGw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdFx0YSA9IGluZGV4LmdldFgoIGkgKTtcblx0XHRcdFx0XHRcdGIgPSBpbmRleC5nZXRYKCBpICsgMSApO1xuXHRcdFx0XHRcdFx0YyA9IGluZGV4LmdldFgoIGkgKyAyICk7XG5cblx0XHRcdFx0XHRcdGludGVyc2VjdGlvbiA9IGNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNlY3Rpb24oIHRoaXMsIHJheWNhc3RlciwgcmF5LCBwb3NpdGlvbiwgdXYsIGEsIGIsIGMgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2VJbmRleCA9IE1hdGguZmxvb3IoIGkgLyAzICk7IC8vIHRyaWFuZ2xlIG51bWJlciBpbiBpbmRpY2VzIGJ1ZmZlciBzZW1hbnRpY3Ncblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyBub24taW5kZXhlZCBidWZmZXIgZ2VvbWV0cnlcblxuXHRcdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gcG9zaXRpb24uY291bnQ7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0XHRcdGEgPSBpO1xuXHRcdFx0XHRcdFx0YiA9IGkgKyAxO1xuXHRcdFx0XHRcdFx0YyA9IGkgKyAyO1xuXG5cdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24gPSBjaGVja0J1ZmZlckdlb21ldHJ5SW50ZXJzZWN0aW9uKCB0aGlzLCByYXljYXN0ZXIsIHJheSwgcG9zaXRpb24sIHV2LCBhLCBiLCBjICk7XG5cblx0XHRcdFx0XHRcdGlmICggaW50ZXJzZWN0aW9uICkge1xuXG5cdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5pbmRleCA9IGE7IC8vIHRyaWFuZ2xlIG51bWJlciBpbiBwb3NpdGlvbnMgYnVmZmVyIHNlbWFudGljc1xuXHRcdFx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIGludGVyc2VjdGlvbiApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRcdHZhciBmdkEsIGZ2QiwgZnZDO1xuXHRcdFx0XHR2YXIgaXNNdWx0aU1hdGVyaWFsID0gQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwgKTtcblxuXHRcdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblx0XHRcdFx0dmFyIGZhY2VzID0gZ2VvbWV0cnkuZmFjZXM7XG5cdFx0XHRcdHZhciB1dnM7XG5cblx0XHRcdFx0dmFyIGZhY2VWZXJ0ZXhVdnMgPSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyAwIF07XG5cdFx0XHRcdGlmICggZmFjZVZlcnRleFV2cy5sZW5ndGggPiAwICkgdXZzID0gZmFjZVZlcnRleFV2cztcblxuXHRcdFx0XHRmb3IgKCB2YXIgZiA9IDAsIGZsID0gZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgZmFjZSA9IGZhY2VzWyBmIF07XG5cdFx0XHRcdFx0dmFyIGZhY2VNYXRlcmlhbCA9IGlzTXVsdGlNYXRlcmlhbCA/IG1hdGVyaWFsWyBmYWNlLm1hdGVyaWFsSW5kZXggXSA6IG1hdGVyaWFsO1xuXG5cdFx0XHRcdFx0aWYgKCBmYWNlTWF0ZXJpYWwgPT09IHVuZGVmaW5lZCApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0ZnZBID0gdmVydGljZXNbIGZhY2UuYSBdO1xuXHRcdFx0XHRcdGZ2QiA9IHZlcnRpY2VzWyBmYWNlLmIgXTtcblx0XHRcdFx0XHRmdkMgPSB2ZXJ0aWNlc1sgZmFjZS5jIF07XG5cblx0XHRcdFx0XHRpZiAoIGZhY2VNYXRlcmlhbC5tb3JwaFRhcmdldHMgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBtb3JwaFRhcmdldHMgPSBnZW9tZXRyeS5tb3JwaFRhcmdldHM7XG5cdFx0XHRcdFx0XHR2YXIgbW9ycGhJbmZsdWVuY2VzID0gdGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM7XG5cblx0XHRcdFx0XHRcdHZBLnNldCggMCwgMCwgMCApO1xuXHRcdFx0XHRcdFx0dkIuc2V0KCAwLCAwLCAwICk7XG5cdFx0XHRcdFx0XHR2Qy5zZXQoIDAsIDAsIDAgKTtcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIHQgPSAwLCB0bCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7IHQgPCB0bDsgdCArKyApIHtcblxuXHRcdFx0XHRcdFx0XHR2YXIgaW5mbHVlbmNlID0gbW9ycGhJbmZsdWVuY2VzWyB0IF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBpbmZsdWVuY2UgPT09IDAgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdFx0XHR2YXIgdGFyZ2V0cyA9IG1vcnBoVGFyZ2V0c1sgdCBdLnZlcnRpY2VzO1xuXG5cdFx0XHRcdFx0XHRcdHZBLmFkZFNjYWxlZFZlY3RvciggdGVtcEEuc3ViVmVjdG9ycyggdGFyZ2V0c1sgZmFjZS5hIF0sIGZ2QSApLCBpbmZsdWVuY2UgKTtcblx0XHRcdFx0XHRcdFx0dkIuYWRkU2NhbGVkVmVjdG9yKCB0ZW1wQi5zdWJWZWN0b3JzKCB0YXJnZXRzWyBmYWNlLmIgXSwgZnZCICksIGluZmx1ZW5jZSApO1xuXHRcdFx0XHRcdFx0XHR2Qy5hZGRTY2FsZWRWZWN0b3IoIHRlbXBDLnN1YlZlY3RvcnMoIHRhcmdldHNbIGZhY2UuYyBdLCBmdkMgKSwgaW5mbHVlbmNlICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0dkEuYWRkKCBmdkEgKTtcblx0XHRcdFx0XHRcdHZCLmFkZCggZnZCICk7XG5cdFx0XHRcdFx0XHR2Qy5hZGQoIGZ2QyApO1xuXG5cdFx0XHRcdFx0XHRmdkEgPSB2QTtcblx0XHRcdFx0XHRcdGZ2QiA9IHZCO1xuXHRcdFx0XHRcdFx0ZnZDID0gdkM7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpbnRlcnNlY3Rpb24gPSBjaGVja0ludGVyc2VjdGlvbiggdGhpcywgcmF5Y2FzdGVyLCByYXksIGZ2QSwgZnZCLCBmdkMsIGludGVyc2VjdGlvblBvaW50ICk7XG5cblx0XHRcdFx0XHRpZiAoIGludGVyc2VjdGlvbiApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCB1dnMgJiYgdXZzWyBmIF0gKSB7XG5cblx0XHRcdFx0XHRcdFx0dmFyIHV2c19mID0gdXZzWyBmIF07XG5cdFx0XHRcdFx0XHRcdHV2QS5jb3B5KCB1dnNfZlsgMCBdICk7XG5cdFx0XHRcdFx0XHRcdHV2Qi5jb3B5KCB1dnNfZlsgMSBdICk7XG5cdFx0XHRcdFx0XHRcdHV2Qy5jb3B5KCB1dnNfZlsgMiBdICk7XG5cblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uLnV2ID0gdXZJbnRlcnNlY3Rpb24oIGludGVyc2VjdGlvblBvaW50LCBmdkEsIGZ2QiwgZnZDLCB1dkEsIHV2QiwgdXZDICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2UgPSBmYWNlO1xuXHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2VJbmRleCA9IGY7XG5cdFx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIGludGVyc2VjdGlvbiApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9KCkgKSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLmdlb21ldHJ5LCB0aGlzLm1hdGVyaWFsICkuY29weSggdGhpcyApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIEJveEdlb21ldHJ5XG5cbmZ1bmN0aW9uIEJveEdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIGRlcHRoU2VnbWVudHMgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdCb3hHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHdpZHRoOiB3aWR0aCxcblx0XHRoZWlnaHQ6IGhlaWdodCxcblx0XHRkZXB0aDogZGVwdGgsXG5cdFx0d2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0ZGVwdGhTZWdtZW50czogZGVwdGhTZWdtZW50c1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgQm94QnVmZmVyR2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgZGVwdGhTZWdtZW50cyApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbkJveEdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuQm94R2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQm94R2VvbWV0cnk7XG5cbi8vIEJveEJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIEJveEJ1ZmZlckdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIGRlcHRoU2VnbWVudHMgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdCb3hCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHdpZHRoOiB3aWR0aCxcblx0XHRoZWlnaHQ6IGhlaWdodCxcblx0XHRkZXB0aDogZGVwdGgsXG5cdFx0d2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0ZGVwdGhTZWdtZW50czogZGVwdGhTZWdtZW50c1xuXHR9O1xuXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0Ly8gc2VnbWVudHNcblxuXHR3aWR0aFNlZ21lbnRzID0gTWF0aC5mbG9vciggd2lkdGhTZWdtZW50cyApIHx8IDE7XG5cdGhlaWdodFNlZ21lbnRzID0gTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVudHMgKSB8fCAxO1xuXHRkZXB0aFNlZ21lbnRzID0gTWF0aC5mbG9vciggZGVwdGhTZWdtZW50cyApIHx8IDE7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBudW1iZXJPZlZlcnRpY2VzID0gMDtcblx0dmFyIGdyb3VwU3RhcnQgPSAwO1xuXG5cdC8vIGJ1aWxkIGVhY2ggc2lkZSBvZiB0aGUgYm94IGdlb21ldHJ5XG5cblx0YnVpbGRQbGFuZSggJ3onLCAneScsICd4JywgLSAxLCAtIDEsIGRlcHRoLCBoZWlnaHQsICAgd2lkdGgsICBkZXB0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgMCApOyAvLyBweFxuXHRidWlsZFBsYW5lKCAneicsICd5JywgJ3gnLCAgIDEsIC0gMSwgZGVwdGgsIGhlaWdodCwgLSB3aWR0aCwgIGRlcHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCAxICk7IC8vIG54XG5cdGJ1aWxkUGxhbmUoICd4JywgJ3onLCAneScsICAgMSwgICAxLCB3aWR0aCwgZGVwdGgsICAgIGhlaWdodCwgd2lkdGhTZWdtZW50cywgZGVwdGhTZWdtZW50cywgIDIgKTsgLy8gcHlcblx0YnVpbGRQbGFuZSggJ3gnLCAneicsICd5JywgICAxLCAtIDEsIHdpZHRoLCBkZXB0aCwgIC0gaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzLCAgMyApOyAvLyBueVxuXHRidWlsZFBsYW5lKCAneCcsICd5JywgJ3onLCAgIDEsIC0gMSwgd2lkdGgsIGhlaWdodCwgICBkZXB0aCwgIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCA0ICk7IC8vIHB6XG5cdGJ1aWxkUGxhbmUoICd4JywgJ3knLCAneicsIC0gMSwgLSAxLCB3aWR0aCwgaGVpZ2h0LCAtIGRlcHRoLCAgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIDUgKTsgLy8gbnpcblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0ZnVuY3Rpb24gYnVpbGRQbGFuZSggdSwgdiwgdywgdWRpciwgdmRpciwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGdyaWRYLCBncmlkWSwgbWF0ZXJpYWxJbmRleCApIHtcblxuXHRcdHZhciBzZWdtZW50V2lkdGggPSB3aWR0aCAvIGdyaWRYO1xuXHRcdHZhciBzZWdtZW50SGVpZ2h0ID0gaGVpZ2h0IC8gZ3JpZFk7XG5cblx0XHR2YXIgd2lkdGhIYWxmID0gd2lkdGggLyAyO1xuXHRcdHZhciBoZWlnaHRIYWxmID0gaGVpZ2h0IC8gMjtcblx0XHR2YXIgZGVwdGhIYWxmID0gZGVwdGggLyAyO1xuXG5cdFx0dmFyIGdyaWRYMSA9IGdyaWRYICsgMTtcblx0XHR2YXIgZ3JpZFkxID0gZ3JpZFkgKyAxO1xuXG5cdFx0dmFyIHZlcnRleENvdW50ZXIgPSAwO1xuXHRcdHZhciBncm91cENvdW50ID0gMDtcblxuXHRcdHZhciBpeCwgaXk7XG5cblx0XHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRcdGZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTE7IGl5ICsrICkge1xuXG5cdFx0XHR2YXIgeSA9IGl5ICogc2VnbWVudEhlaWdodCAtIGhlaWdodEhhbGY7XG5cblx0XHRcdGZvciAoIGl4ID0gMDsgaXggPCBncmlkWDE7IGl4ICsrICkge1xuXG5cdFx0XHRcdHZhciB4ID0gaXggKiBzZWdtZW50V2lkdGggLSB3aWR0aEhhbGY7XG5cblx0XHRcdFx0Ly8gc2V0IHZhbHVlcyB0byBjb3JyZWN0IHZlY3RvciBjb21wb25lbnRcblxuXHRcdFx0XHR2ZWN0b3JbIHUgXSA9IHggKiB1ZGlyO1xuXHRcdFx0XHR2ZWN0b3JbIHYgXSA9IHkgKiB2ZGlyO1xuXHRcdFx0XHR2ZWN0b3JbIHcgXSA9IGRlcHRoSGFsZjtcblxuXHRcdFx0XHQvLyBub3cgYXBwbHkgdmVjdG9yIHRvIHZlcnRleCBidWZmZXJcblxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7XG5cblx0XHRcdFx0Ly8gc2V0IHZhbHVlcyB0byBjb3JyZWN0IHZlY3RvciBjb21wb25lbnRcblxuXHRcdFx0XHR2ZWN0b3JbIHUgXSA9IDA7XG5cdFx0XHRcdHZlY3RvclsgdiBdID0gMDtcblx0XHRcdFx0dmVjdG9yWyB3IF0gPSBkZXB0aCA+IDAgPyAxIDogLSAxO1xuXG5cdFx0XHRcdC8vIG5vdyBhcHBseSB2ZWN0b3IgdG8gbm9ybWFsIGJ1ZmZlclxuXG5cdFx0XHRcdG5vcm1hbHMucHVzaCggdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApO1xuXG5cdFx0XHRcdC8vIHV2c1xuXG5cdFx0XHRcdHV2cy5wdXNoKCBpeCAvIGdyaWRYICk7XG5cdFx0XHRcdHV2cy5wdXNoKCAxIC0gKCBpeSAvIGdyaWRZICkgKTtcblxuXHRcdFx0XHQvLyBjb3VudGVyc1xuXG5cdFx0XHRcdHZlcnRleENvdW50ZXIgKz0gMTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gaW5kaWNlc1xuXG5cdFx0Ly8gMS4geW91IG5lZWQgdGhyZWUgaW5kaWNlcyB0byBkcmF3IGEgc2luZ2xlIGZhY2Vcblx0XHQvLyAyLiBhIHNpbmdsZSBzZWdtZW50IGNvbnNpc3RzIG9mIHR3byBmYWNlc1xuXHRcdC8vIDMuIHNvIHdlIG5lZWQgdG8gZ2VuZXJhdGUgc2l4ICgyKjMpIGluZGljZXMgcGVyIHNlZ21lbnRcblxuXHRcdGZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTsgaXkgKysgKSB7XG5cblx0XHRcdGZvciAoIGl4ID0gMDsgaXggPCBncmlkWDsgaXggKysgKSB7XG5cblx0XHRcdFx0dmFyIGEgPSBudW1iZXJPZlZlcnRpY2VzICsgaXggKyBncmlkWDEgKiBpeTtcblx0XHRcdFx0dmFyIGIgPSBudW1iZXJPZlZlcnRpY2VzICsgaXggKyBncmlkWDEgKiAoIGl5ICsgMSApO1xuXHRcdFx0XHR2YXIgYyA9IG51bWJlck9mVmVydGljZXMgKyAoIGl4ICsgMSApICsgZ3JpZFgxICogKCBpeSArIDEgKTtcblx0XHRcdFx0dmFyIGQgPSBudW1iZXJPZlZlcnRpY2VzICsgKCBpeCArIDEgKSArIGdyaWRYMSAqIGl5O1xuXG5cdFx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0XHRcdC8vIGluY3JlYXNlIGNvdW50ZXJcblxuXHRcdFx0XHRncm91cENvdW50ICs9IDY7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGFkZCBhIGdyb3VwIHRvIHRoZSBnZW9tZXRyeS4gdGhpcyB3aWxsIGVuc3VyZSBtdWx0aSBtYXRlcmlhbCBzdXBwb3J0XG5cblx0XHRzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgbWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0Ly8gY2FsY3VsYXRlIG5ldyBzdGFydCB2YWx1ZSBmb3IgZ3JvdXBzXG5cblx0XHRncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7XG5cblx0XHQvLyB1cGRhdGUgdG90YWwgbnVtYmVyIG9mIHZlcnRpY2VzXG5cblx0XHRudW1iZXJPZlZlcnRpY2VzICs9IHZlcnRleENvdW50ZXI7XG5cblx0fVxuXG59XG5cbkJveEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuQm94QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQm94QnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gUGxhbmVHZW9tZXRyeVxuXG5mdW5jdGlvbiBQbGFuZUdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BsYW5lR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR3aWR0aDogd2lkdGgsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0d2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHNcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFBsYW5lQnVmZmVyR2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuUGxhbmVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBsYW5lR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGxhbmVHZW9tZXRyeTtcblxuLy8gUGxhbmVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBQbGFuZUJ1ZmZlckdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cyApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BsYW5lQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR3aWR0aDogd2lkdGgsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0d2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHNcblx0fTtcblxuXHR2YXIgd2lkdGhfaGFsZiA9IHdpZHRoIC8gMjtcblx0dmFyIGhlaWdodF9oYWxmID0gaGVpZ2h0IC8gMjtcblxuXHR2YXIgZ3JpZFggPSBNYXRoLmZsb29yKCB3aWR0aFNlZ21lbnRzICkgfHwgMTtcblx0dmFyIGdyaWRZID0gTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVudHMgKSB8fCAxO1xuXG5cdHZhciBncmlkWDEgPSBncmlkWCArIDE7XG5cdHZhciBncmlkWTEgPSBncmlkWSArIDE7XG5cblx0dmFyIHNlZ21lbnRfd2lkdGggPSB3aWR0aCAvIGdyaWRYO1xuXHR2YXIgc2VnbWVudF9oZWlnaHQgPSBoZWlnaHQgLyBncmlkWTtcblxuXHR2YXIgaXgsIGl5O1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRmb3IgKCBpeSA9IDA7IGl5IDwgZ3JpZFkxOyBpeSArKyApIHtcblxuXHRcdHZhciB5ID0gaXkgKiBzZWdtZW50X2hlaWdodCAtIGhlaWdodF9oYWxmO1xuXG5cdFx0Zm9yICggaXggPSAwOyBpeCA8IGdyaWRYMTsgaXggKysgKSB7XG5cblx0XHRcdHZhciB4ID0gaXggKiBzZWdtZW50X3dpZHRoIC0gd2lkdGhfaGFsZjtcblxuXHRcdFx0dmVydGljZXMucHVzaCggeCwgLSB5LCAwICk7XG5cblx0XHRcdG5vcm1hbHMucHVzaCggMCwgMCwgMSApO1xuXG5cdFx0XHR1dnMucHVzaCggaXggLyBncmlkWCApO1xuXHRcdFx0dXZzLnB1c2goIDEgLSAoIGl5IC8gZ3JpZFkgKSApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBpbmRpY2VzXG5cblx0Zm9yICggaXkgPSAwOyBpeSA8IGdyaWRZOyBpeSArKyApIHtcblxuXHRcdGZvciAoIGl4ID0gMDsgaXggPCBncmlkWDsgaXggKysgKSB7XG5cblx0XHRcdHZhciBhID0gaXggKyBncmlkWDEgKiBpeTtcblx0XHRcdHZhciBiID0gaXggKyBncmlkWDEgKiAoIGl5ICsgMSApO1xuXHRcdFx0dmFyIGMgPSAoIGl4ICsgMSApICsgZ3JpZFgxICogKCBpeSArIDEgKTtcblx0XHRcdHZhciBkID0gKCBpeCArIDEgKSArIGdyaWRYMSAqIGl5O1xuXG5cdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cbn1cblxuUGxhbmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBsYW5lQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGxhbmVCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuKi9cblxuZnVuY3Rpb24gQ2FtZXJhKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ2FtZXJhJztcblxuXHR0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7XG5cdHRoaXMucHJvamVjdGlvbk1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cbn1cblxuQ2FtZXJhLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IENhbWVyYSxcblxuXHRpc0NhbWVyYTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5tYXRyaXhXb3JsZEludmVyc2UuY29weSggc291cmNlLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXHRcdHRoaXMucHJvamVjdGlvbk1hdHJpeC5jb3B5KCBzb3VyY2UucHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRXb3JsZERpcmVjdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldFdvcmxkRGlyZWN0aW9uKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdHRoaXMuZ2V0V29ybGRRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7XG5cblx0XHRcdHJldHVybiByZXN1bHQuc2V0KCAwLCAwLCAtIDEgKS5hcHBseVF1YXRlcm5pb24oIHF1YXRlcm5pb24gKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgZ3JlZ2dtYW4gLyBodHRwOi8vZ2FtZXMuZ3JlZ2dtYW4uY29tL1xuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICkge1xuXG5cdENhbWVyYS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BlcnNwZWN0aXZlQ2FtZXJhJztcblxuXHR0aGlzLmZvdiA9IGZvdiAhPT0gdW5kZWZpbmVkID8gZm92IDogNTA7XG5cdHRoaXMuem9vbSA9IDE7XG5cblx0dGhpcy5uZWFyID0gbmVhciAhPT0gdW5kZWZpbmVkID8gbmVhciA6IDAuMTtcblx0dGhpcy5mYXIgPSBmYXIgIT09IHVuZGVmaW5lZCA/IGZhciA6IDIwMDA7XG5cdHRoaXMuZm9jdXMgPSAxMDtcblxuXHR0aGlzLmFzcGVjdCA9IGFzcGVjdCAhPT0gdW5kZWZpbmVkID8gYXNwZWN0IDogMTtcblx0dGhpcy52aWV3ID0gbnVsbDtcblxuXHR0aGlzLmZpbG1HYXVnZSA9IDM1O1x0Ly8gd2lkdGggb2YgdGhlIGZpbG0gKGRlZmF1bHQgaW4gbWlsbGltZXRlcnMpXG5cdHRoaXMuZmlsbU9mZnNldCA9IDA7XHQvLyBob3Jpem9udGFsIGZpbG0gb2Zmc2V0IChzYW1lIHVuaXQgYXMgZ2F1Z2UpXG5cblx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cbn1cblxuUGVyc3BlY3RpdmVDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQ2FtZXJhLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFBlcnNwZWN0aXZlQ2FtZXJhLFxuXG5cdGlzUGVyc3BlY3RpdmVDYW1lcmE6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRDYW1lcmEucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmZvdiA9IHNvdXJjZS5mb3Y7XG5cdFx0dGhpcy56b29tID0gc291cmNlLnpvb207XG5cblx0XHR0aGlzLm5lYXIgPSBzb3VyY2UubmVhcjtcblx0XHR0aGlzLmZhciA9IHNvdXJjZS5mYXI7XG5cdFx0dGhpcy5mb2N1cyA9IHNvdXJjZS5mb2N1cztcblxuXHRcdHRoaXMuYXNwZWN0ID0gc291cmNlLmFzcGVjdDtcblx0XHR0aGlzLnZpZXcgPSBzb3VyY2UudmlldyA9PT0gbnVsbCA/IG51bGwgOiBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnZpZXcgKTtcblxuXHRcdHRoaXMuZmlsbUdhdWdlID0gc291cmNlLmZpbG1HYXVnZTtcblx0XHR0aGlzLmZpbG1PZmZzZXQgPSBzb3VyY2UuZmlsbU9mZnNldDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIEZPViBieSBmb2NhbCBsZW5ndGggaW4gcmVzcGVjdCB0byB0aGUgY3VycmVudCAuZmlsbUdhdWdlLlxuXHQgKlxuXHQgKiBUaGUgZGVmYXVsdCBmaWxtIGdhdWdlIGlzIDM1LCBzbyB0aGF0IHRoZSBmb2NhbCBsZW5ndGggY2FuIGJlIHNwZWNpZmllZCBmb3Jcblx0ICogYSAzNW1tIChmdWxsIGZyYW1lKSBjYW1lcmEuXG5cdCAqXG5cdCAqIFZhbHVlcyBmb3IgZm9jYWwgbGVuZ3RoIGFuZCBmaWxtIGdhdWdlIG11c3QgaGF2ZSB0aGUgc2FtZSB1bml0LlxuXHQgKi9cblx0c2V0Rm9jYWxMZW5ndGg6IGZ1bmN0aW9uICggZm9jYWxMZW5ndGggKSB7XG5cblx0XHQvLyBzZWUgaHR0cDovL3d3dy5ib2JhdGtpbnMuY29tL3Bob3RvZ3JhcGh5L3RlY2huaWNhbC9maWVsZF9vZl92aWV3Lmh0bWxcblx0XHR2YXIgdkV4dGVudFNsb3BlID0gMC41ICogdGhpcy5nZXRGaWxtSGVpZ2h0KCkgLyBmb2NhbExlbmd0aDtcblxuXHRcdHRoaXMuZm92ID0gX01hdGguUkFEMkRFRyAqIDIgKiBNYXRoLmF0YW4oIHZFeHRlbnRTbG9wZSApO1xuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGN1bGF0ZXMgdGhlIGZvY2FsIGxlbmd0aCBmcm9tIHRoZSBjdXJyZW50IC5mb3YgYW5kIC5maWxtR2F1Z2UuXG5cdCAqL1xuXHRnZXRGb2NhbExlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHZFeHRlbnRTbG9wZSA9IE1hdGgudGFuKCBfTWF0aC5ERUcyUkFEICogMC41ICogdGhpcy5mb3YgKTtcblxuXHRcdHJldHVybiAwLjUgKiB0aGlzLmdldEZpbG1IZWlnaHQoKSAvIHZFeHRlbnRTbG9wZTtcblxuXHR9LFxuXG5cdGdldEVmZmVjdGl2ZUZPVjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9NYXRoLlJBRDJERUcgKiAyICogTWF0aC5hdGFuKFxuXHRcdFx0XHRNYXRoLnRhbiggX01hdGguREVHMlJBRCAqIDAuNSAqIHRoaXMuZm92ICkgLyB0aGlzLnpvb20gKTtcblxuXHR9LFxuXG5cdGdldEZpbG1XaWR0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gZmlsbSBub3QgY29tcGxldGVseSBjb3ZlcmVkIGluIHBvcnRyYWl0IGZvcm1hdCAoYXNwZWN0IDwgMSlcblx0XHRyZXR1cm4gdGhpcy5maWxtR2F1Z2UgKiBNYXRoLm1pbiggdGhpcy5hc3BlY3QsIDEgKTtcblxuXHR9LFxuXG5cdGdldEZpbG1IZWlnaHQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIGZpbG0gbm90IGNvbXBsZXRlbHkgY292ZXJlZCBpbiBsYW5kc2NhcGUgZm9ybWF0IChhc3BlY3QgPiAxKVxuXHRcdHJldHVybiB0aGlzLmZpbG1HYXVnZSAvIE1hdGgubWF4KCB0aGlzLmFzcGVjdCwgMSApO1xuXG5cdH0sXG5cblx0LyoqXG5cdCAqIFNldHMgYW4gb2Zmc2V0IGluIGEgbGFyZ2VyIGZydXN0dW0uIFRoaXMgaXMgdXNlZnVsIGZvciBtdWx0aS13aW5kb3cgb3Jcblx0ICogbXVsdGktbW9uaXRvci9tdWx0aS1tYWNoaW5lIHNldHVwcy5cblx0ICpcblx0ICogRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIDN4MiBtb25pdG9ycyBhbmQgZWFjaCBtb25pdG9yIGlzIDE5MjB4MTA4MCBhbmRcblx0ICogdGhlIG1vbml0b3JzIGFyZSBpbiBncmlkIGxpa2UgdGhpc1xuXHQgKlxuXHQgKiAgICstLS0rLS0tKy0tLStcblx0ICogICB8IEEgfCBCIHwgQyB8XG5cdCAqICAgKy0tLSstLS0rLS0tK1xuXHQgKiAgIHwgRCB8IEUgfCBGIHxcblx0ICogICArLS0tKy0tLSstLS0rXG5cdCAqXG5cdCAqIHRoZW4gZm9yIGVhY2ggbW9uaXRvciB5b3Ugd291bGQgY2FsbCBpdCBsaWtlIHRoaXNcblx0ICpcblx0ICogICB2YXIgdyA9IDE5MjA7XG5cdCAqICAgdmFyIGggPSAxMDgwO1xuXHQgKiAgIHZhciBmdWxsV2lkdGggPSB3ICogMztcblx0ICogICB2YXIgZnVsbEhlaWdodCA9IGggKiAyO1xuXHQgKlxuXHQgKiAgIC0tQS0tXG5cdCAqICAgY2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMCwgaCAqIDAsIHcsIGggKTtcblx0ICogICAtLUItLVxuXHQgKiAgIGNhbWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDEsIGggKiAwLCB3LCBoICk7XG5cdCAqICAgLS1DLS1cblx0ICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAyLCBoICogMCwgdywgaCApO1xuXHQgKiAgIC0tRC0tXG5cdCAqICAgY2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMCwgaCAqIDEsIHcsIGggKTtcblx0ICogICAtLUUtLVxuXHQgKiAgIGNhbWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDEsIGggKiAxLCB3LCBoICk7XG5cdCAqICAgLS1GLS1cblx0ICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAyLCBoICogMSwgdywgaCApO1xuXHQgKlxuXHQgKiAgIE5vdGUgdGhlcmUgaXMgbm8gcmVhc29uIG1vbml0b3JzIGhhdmUgdG8gYmUgdGhlIHNhbWUgc2l6ZSBvciBpbiBhIGdyaWQuXG5cdCAqL1xuXHRzZXRWaWV3T2Zmc2V0OiBmdW5jdGlvbiAoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcblxuXHRcdHRoaXMuYXNwZWN0ID0gZnVsbFdpZHRoIC8gZnVsbEhlaWdodDtcblxuXHRcdHRoaXMudmlldyA9IHtcblx0XHRcdGZ1bGxXaWR0aDogZnVsbFdpZHRoLFxuXHRcdFx0ZnVsbEhlaWdodDogZnVsbEhlaWdodCxcblx0XHRcdG9mZnNldFg6IHgsXG5cdFx0XHRvZmZzZXRZOiB5LFxuXHRcdFx0d2lkdGg6IHdpZHRoLFxuXHRcdFx0aGVpZ2h0OiBoZWlnaHRcblx0XHR9O1xuXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fSxcblxuXHRjbGVhclZpZXdPZmZzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMudmlldyA9IG51bGw7XG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fSxcblxuXHR1cGRhdGVQcm9qZWN0aW9uTWF0cml4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbmVhciA9IHRoaXMubmVhcixcblx0XHRcdHRvcCA9IG5lYXIgKiBNYXRoLnRhbihcblx0XHRcdFx0XHRfTWF0aC5ERUcyUkFEICogMC41ICogdGhpcy5mb3YgKSAvIHRoaXMuem9vbSxcblx0XHRcdGhlaWdodCA9IDIgKiB0b3AsXG5cdFx0XHR3aWR0aCA9IHRoaXMuYXNwZWN0ICogaGVpZ2h0LFxuXHRcdFx0bGVmdCA9IC0gMC41ICogd2lkdGgsXG5cdFx0XHR2aWV3ID0gdGhpcy52aWV3O1xuXG5cdFx0aWYgKCB2aWV3ICE9PSBudWxsICkge1xuXG5cdFx0XHR2YXIgZnVsbFdpZHRoID0gdmlldy5mdWxsV2lkdGgsXG5cdFx0XHRcdGZ1bGxIZWlnaHQgPSB2aWV3LmZ1bGxIZWlnaHQ7XG5cblx0XHRcdGxlZnQgKz0gdmlldy5vZmZzZXRYICogd2lkdGggLyBmdWxsV2lkdGg7XG5cdFx0XHR0b3AgLT0gdmlldy5vZmZzZXRZICogaGVpZ2h0IC8gZnVsbEhlaWdodDtcblx0XHRcdHdpZHRoICo9IHZpZXcud2lkdGggLyBmdWxsV2lkdGg7XG5cdFx0XHRoZWlnaHQgKj0gdmlldy5oZWlnaHQgLyBmdWxsSGVpZ2h0O1xuXG5cdFx0fVxuXG5cdFx0dmFyIHNrZXcgPSB0aGlzLmZpbG1PZmZzZXQ7XG5cdFx0aWYgKCBza2V3ICE9PSAwICkgbGVmdCArPSBuZWFyICogc2tldyAvIHRoaXMuZ2V0RmlsbVdpZHRoKCk7XG5cblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXgubWFrZVBlcnNwZWN0aXZlKCBsZWZ0LCBsZWZ0ICsgd2lkdGgsIHRvcCwgdG9wIC0gaGVpZ2h0LCBuZWFyLCB0aGlzLmZhciApO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0ZGF0YS5vYmplY3QuZm92ID0gdGhpcy5mb3Y7XG5cdFx0ZGF0YS5vYmplY3Quem9vbSA9IHRoaXMuem9vbTtcblxuXHRcdGRhdGEub2JqZWN0Lm5lYXIgPSB0aGlzLm5lYXI7XG5cdFx0ZGF0YS5vYmplY3QuZmFyID0gdGhpcy5mYXI7XG5cdFx0ZGF0YS5vYmplY3QuZm9jdXMgPSB0aGlzLmZvY3VzO1xuXG5cdFx0ZGF0YS5vYmplY3QuYXNwZWN0ID0gdGhpcy5hc3BlY3Q7XG5cblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCApIGRhdGEub2JqZWN0LnZpZXcgPSBPYmplY3QuYXNzaWduKCB7fSwgdGhpcy52aWV3ICk7XG5cblx0XHRkYXRhLm9iamVjdC5maWxtR2F1Z2UgPSB0aGlzLmZpbG1HYXVnZTtcblx0XHRkYXRhLm9iamVjdC5maWxtT2Zmc2V0ID0gdGhpcy5maWxtT2Zmc2V0O1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgYXJvc2UgLyBodHRwOi8vZ2l0aHViLmNvbS9hcm9zZVxuICovXG5cbmZ1bmN0aW9uIE9ydGhvZ3JhcGhpY0NhbWVyYSggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSB7XG5cblx0Q2FtZXJhLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnT3J0aG9ncmFwaGljQ2FtZXJhJztcblxuXHR0aGlzLnpvb20gPSAxO1xuXHR0aGlzLnZpZXcgPSBudWxsO1xuXG5cdHRoaXMubGVmdCA9IGxlZnQ7XG5cdHRoaXMucmlnaHQgPSByaWdodDtcblx0dGhpcy50b3AgPSB0b3A7XG5cdHRoaXMuYm90dG9tID0gYm90dG9tO1xuXG5cdHRoaXMubmVhciA9ICggbmVhciAhPT0gdW5kZWZpbmVkICkgPyBuZWFyIDogMC4xO1xuXHR0aGlzLmZhciA9ICggZmFyICE9PSB1bmRlZmluZWQgKSA/IGZhciA6IDIwMDA7XG5cblx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cbn1cblxuT3J0aG9ncmFwaGljQ2FtZXJhLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIENhbWVyYS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBPcnRob2dyYXBoaWNDYW1lcmEsXG5cblx0aXNPcnRob2dyYXBoaWNDYW1lcmE6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRDYW1lcmEucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmxlZnQgPSBzb3VyY2UubGVmdDtcblx0XHR0aGlzLnJpZ2h0ID0gc291cmNlLnJpZ2h0O1xuXHRcdHRoaXMudG9wID0gc291cmNlLnRvcDtcblx0XHR0aGlzLmJvdHRvbSA9IHNvdXJjZS5ib3R0b207XG5cdFx0dGhpcy5uZWFyID0gc291cmNlLm5lYXI7XG5cdFx0dGhpcy5mYXIgPSBzb3VyY2UuZmFyO1xuXG5cdFx0dGhpcy56b29tID0gc291cmNlLnpvb207XG5cdFx0dGhpcy52aWV3ID0gc291cmNlLnZpZXcgPT09IG51bGwgPyBudWxsIDogT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS52aWV3ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFZpZXdPZmZzZXQ6IGZ1bmN0aW9uKCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHR0aGlzLnZpZXcgPSB7XG5cdFx0XHRmdWxsV2lkdGg6IGZ1bGxXaWR0aCxcblx0XHRcdGZ1bGxIZWlnaHQ6IGZ1bGxIZWlnaHQsXG5cdFx0XHRvZmZzZXRYOiB4LFxuXHRcdFx0b2Zmc2V0WTogeSxcblx0XHRcdHdpZHRoOiB3aWR0aCxcblx0XHRcdGhlaWdodDogaGVpZ2h0XG5cdFx0fTtcblxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdH0sXG5cblx0Y2xlYXJWaWV3T2Zmc2V0OiBmdW5jdGlvbigpIHtcblxuXHRcdHRoaXMudmlldyA9IG51bGw7XG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fSxcblxuXHR1cGRhdGVQcm9qZWN0aW9uTWF0cml4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZHggPSAoIHRoaXMucmlnaHQgLSB0aGlzLmxlZnQgKSAvICggMiAqIHRoaXMuem9vbSApO1xuXHRcdHZhciBkeSA9ICggdGhpcy50b3AgLSB0aGlzLmJvdHRvbSApIC8gKCAyICogdGhpcy56b29tICk7XG5cdFx0dmFyIGN4ID0gKCB0aGlzLnJpZ2h0ICsgdGhpcy5sZWZ0ICkgLyAyO1xuXHRcdHZhciBjeSA9ICggdGhpcy50b3AgKyB0aGlzLmJvdHRvbSApIC8gMjtcblxuXHRcdHZhciBsZWZ0ID0gY3ggLSBkeDtcblx0XHR2YXIgcmlnaHQgPSBjeCArIGR4O1xuXHRcdHZhciB0b3AgPSBjeSArIGR5O1xuXHRcdHZhciBib3R0b20gPSBjeSAtIGR5O1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgIT09IG51bGwgKSB7XG5cblx0XHRcdHZhciB6b29tVyA9IHRoaXMuem9vbSAvICggdGhpcy52aWV3LndpZHRoIC8gdGhpcy52aWV3LmZ1bGxXaWR0aCApO1xuXHRcdFx0dmFyIHpvb21IID0gdGhpcy56b29tIC8gKCB0aGlzLnZpZXcuaGVpZ2h0IC8gdGhpcy52aWV3LmZ1bGxIZWlnaHQgKTtcblx0XHRcdHZhciBzY2FsZVcgPSAoIHRoaXMucmlnaHQgLSB0aGlzLmxlZnQgKSAvIHRoaXMudmlldy53aWR0aDtcblx0XHRcdHZhciBzY2FsZUggPSAoIHRoaXMudG9wIC0gdGhpcy5ib3R0b20gKSAvIHRoaXMudmlldy5oZWlnaHQ7XG5cblx0XHRcdGxlZnQgKz0gc2NhbGVXICogKCB0aGlzLnZpZXcub2Zmc2V0WCAvIHpvb21XICk7XG5cdFx0XHRyaWdodCA9IGxlZnQgKyBzY2FsZVcgKiAoIHRoaXMudmlldy53aWR0aCAvIHpvb21XICk7XG5cdFx0XHR0b3AgLT0gc2NhbGVIICogKCB0aGlzLnZpZXcub2Zmc2V0WSAvIHpvb21IICk7XG5cdFx0XHRib3R0b20gPSB0b3AgLSBzY2FsZUggKiAoIHRoaXMudmlldy5oZWlnaHQgLyB6b29tSCApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VPcnRob2dyYXBoaWMoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgdGhpcy5uZWFyLCB0aGlzLmZhciApO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0ZGF0YS5vYmplY3Quem9vbSA9IHRoaXMuem9vbTtcblx0XHRkYXRhLm9iamVjdC5sZWZ0ID0gdGhpcy5sZWZ0O1xuXHRcdGRhdGEub2JqZWN0LnJpZ2h0ID0gdGhpcy5yaWdodDtcblx0XHRkYXRhLm9iamVjdC50b3AgPSB0aGlzLnRvcDtcblx0XHRkYXRhLm9iamVjdC5ib3R0b20gPSB0aGlzLmJvdHRvbTtcblx0XHRkYXRhLm9iamVjdC5uZWFyID0gdGhpcy5uZWFyO1xuXHRcdGRhdGEub2JqZWN0LmZhciA9IHRoaXMuZmFyO1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgIT09IG51bGwgKSBkYXRhLm9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIHRoaXMudmlldyApO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTEF0dHJpYnV0ZXMoIGdsICkge1xuXG5cdHZhciBidWZmZXJzID0ge307XG5cblx0ZnVuY3Rpb24gY3JlYXRlQnVmZmVyKCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSBhdHRyaWJ1dGUuYXJyYXk7XG5cdFx0dmFyIHVzYWdlID0gYXR0cmlidXRlLmR5bmFtaWMgPyBnbC5EWU5BTUlDX0RSQVcgOiBnbC5TVEFUSUNfRFJBVztcblxuXHRcdHZhciBidWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGJ1ZmZlclR5cGUsIGJ1ZmZlciApO1xuXHRcdGdsLmJ1ZmZlckRhdGEoIGJ1ZmZlclR5cGUsIGFycmF5LCB1c2FnZSApO1xuXG5cdFx0YXR0cmlidXRlLm9uVXBsb2FkQ2FsbGJhY2soKTtcblxuXHRcdHZhciB0eXBlID0gZ2wuRkxPQVQ7XG5cblx0XHRpZiAoIGFycmF5IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuRkxPQVQ7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCBcIlVuc3VwcG9ydGVkIGRhdGEgYnVmZmVyIGZvcm1hdDogRmxvYXQ2NEFycmF5XCIgKTtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgVWludDE2QXJyYXkgKSB7XG5cblx0XHRcdHR5cGUgPSBnbC5VTlNJR05FRF9TSE9SVDtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgSW50MTZBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IGdsLlNIT1JUO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBVaW50MzJBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IGdsLlVOU0lHTkVEX0lOVDtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgSW50MzJBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IGdsLklOVDtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgSW50OEFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuQllURTtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgVWludDhBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IGdsLlVOU0lHTkVEX0JZVEU7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0YnVmZmVyOiBidWZmZXIsXG5cdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0Ynl0ZXNQZXJFbGVtZW50OiBhcnJheS5CWVRFU19QRVJfRUxFTUVOVCxcblx0XHRcdHZlcnNpb246IGF0dHJpYnV0ZS52ZXJzaW9uXG5cdFx0fTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlQnVmZmVyKCBidWZmZXIsIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApIHtcblxuXHRcdHZhciBhcnJheSA9IGF0dHJpYnV0ZS5hcnJheTtcblx0XHR2YXIgdXBkYXRlUmFuZ2UgPSBhdHRyaWJ1dGUudXBkYXRlUmFuZ2U7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBidWZmZXJUeXBlLCBidWZmZXIgKTtcblxuXHRcdGlmICggYXR0cmlidXRlLmR5bmFtaWMgPT09IGZhbHNlICkge1xuXG5cdFx0XHRnbC5idWZmZXJEYXRhKCBidWZmZXJUeXBlLCBhcnJheSwgZ2wuU1RBVElDX0RSQVcgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHVwZGF0ZVJhbmdlLmNvdW50ID09PSAtIDEgKSB7XG5cblx0XHRcdC8vIE5vdCB1c2luZyB1cGRhdGUgcmFuZ2VzXG5cblx0XHRcdGdsLmJ1ZmZlclN1YkRhdGEoIGJ1ZmZlclR5cGUsIDAsIGFycmF5ICk7XG5cblx0XHR9IGVsc2UgaWYgKCB1cGRhdGVSYW5nZS5jb3VudCA9PT0gMCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMT2JqZWN0cy51cGRhdGVCdWZmZXI6IGR5bmFtaWMgVEhSRUUuQnVmZmVyQXR0cmlidXRlIG1hcmtlZCBhcyBuZWVkc1VwZGF0ZSBidXQgdXBkYXRlUmFuZ2UuY291bnQgaXMgMCwgZW5zdXJlIHlvdSBhcmUgdXNpbmcgc2V0IG1ldGhvZHMgb3IgdXBkYXRpbmcgbWFudWFsbHkuJyApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Z2wuYnVmZmVyU3ViRGF0YSggYnVmZmVyVHlwZSwgdXBkYXRlUmFuZ2Uub2Zmc2V0ICogYXJyYXkuQllURVNfUEVSX0VMRU1FTlQsXG5cdFx0XHRcdGFycmF5LnN1YmFycmF5KCB1cGRhdGVSYW5nZS5vZmZzZXQsIHVwZGF0ZVJhbmdlLm9mZnNldCArIHVwZGF0ZVJhbmdlLmNvdW50ICkgKTtcblxuXHRcdFx0dXBkYXRlUmFuZ2UuY291bnQgPSAwOyAvLyByZXNldCByYW5nZVxuXG5cdFx0fVxuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIGdldCggYXR0cmlidXRlICkge1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5kYXRhO1xuXG5cdFx0cmV0dXJuIGJ1ZmZlcnNbIGF0dHJpYnV0ZS51dWlkIF07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbW92ZSggYXR0cmlidXRlICkge1xuXG5cdFx0dmFyIGRhdGEgPSBidWZmZXJzWyBhdHRyaWJ1dGUudXVpZCBdO1xuXG5cdFx0aWYgKCBkYXRhICkge1xuXG5cdFx0XHRnbC5kZWxldGVCdWZmZXIoIGRhdGEuYnVmZmVyICk7XG5cblx0XHRcdGRlbGV0ZSBidWZmZXJzWyBhdHRyaWJ1dGUudXVpZCBdO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGUoIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApIHtcblxuXHRcdGlmICggYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuZGF0YTtcblxuXHRcdHZhciBkYXRhID0gYnVmZmVyc1sgYXR0cmlidXRlLnV1aWQgXTtcblxuXHRcdGlmICggZGF0YSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRidWZmZXJzWyBhdHRyaWJ1dGUudXVpZCBdID0gY3JlYXRlQnVmZmVyKCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKTtcblxuXHRcdH0gZWxzZSBpZiAoIGRhdGEudmVyc2lvbiA8IGF0dHJpYnV0ZS52ZXJzaW9uICkge1xuXG5cdFx0XHR1cGRhdGVCdWZmZXIoIGRhdGEuYnVmZmVyLCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKTtcblxuXHRcdFx0ZGF0YS52ZXJzaW9uID0gYXR0cmlidXRlLnZlcnNpb247XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRnZXQ6IGdldCxcblx0XHRyZW1vdmU6IHJlbW92ZSxcblx0XHR1cGRhdGU6IHVwZGF0ZVxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIHBhaW50ZXJTb3J0U3RhYmxlKCBhLCBiICkge1xuXG5cdGlmICggYS5yZW5kZXJPcmRlciAhPT0gYi5yZW5kZXJPcmRlciApIHtcblxuXHRcdHJldHVybiBhLnJlbmRlck9yZGVyIC0gYi5yZW5kZXJPcmRlcjtcblxuXHR9IGVsc2UgaWYgKCBhLnByb2dyYW0gJiYgYi5wcm9ncmFtICYmIGEucHJvZ3JhbSAhPT0gYi5wcm9ncmFtICkge1xuXG5cdFx0cmV0dXJuIGEucHJvZ3JhbS5pZCAtIGIucHJvZ3JhbS5pZDtcblxuXHR9IGVsc2UgaWYgKCBhLm1hdGVyaWFsLmlkICE9PSBiLm1hdGVyaWFsLmlkICkge1xuXG5cdFx0cmV0dXJuIGEubWF0ZXJpYWwuaWQgLSBiLm1hdGVyaWFsLmlkO1xuXG5cdH0gZWxzZSBpZiAoIGEueiAhPT0gYi56ICkge1xuXG5cdFx0cmV0dXJuIGEueiAtIGIuejtcblxuXHR9IGVsc2Uge1xuXG5cdFx0cmV0dXJuIGEuaWQgLSBiLmlkO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiByZXZlcnNlUGFpbnRlclNvcnRTdGFibGUoIGEsIGIgKSB7XG5cblx0aWYgKCBhLnJlbmRlck9yZGVyICE9PSBiLnJlbmRlck9yZGVyICkge1xuXG5cdFx0cmV0dXJuIGEucmVuZGVyT3JkZXIgLSBiLnJlbmRlck9yZGVyO1xuXG5cdH0gaWYgKCBhLnogIT09IGIueiApIHtcblxuXHRcdHJldHVybiBiLnogLSBhLno7XG5cblx0fSBlbHNlIHtcblxuXHRcdHJldHVybiBhLmlkIC0gYi5pZDtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJMaXN0KCkge1xuXG5cdHZhciBvcGFxdWUgPSBbXTtcblx0dmFyIG9wYXF1ZUxhc3RJbmRleCA9IC0gMTtcblxuXHR2YXIgdHJhbnNwYXJlbnQgPSBbXTtcblx0dmFyIHRyYW5zcGFyZW50TGFzdEluZGV4ID0gLSAxO1xuXG5cdGZ1bmN0aW9uIGluaXQoKSB7XG5cblx0XHRvcGFxdWVMYXN0SW5kZXggPSAtIDE7XG5cdFx0dHJhbnNwYXJlbnRMYXN0SW5kZXggPSAtIDE7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHB1c2goIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCB6LCBncm91cCApIHtcblxuXHRcdHZhciBhcnJheSwgaW5kZXg7XG5cblx0XHQvLyBhbGxvY2F0ZSB0aGUgbmV4dCBwb3NpdGlvbiBpbiB0aGUgYXBwcm9wcmlhdGUgYXJyYXlcblxuXHRcdGlmICggbWF0ZXJpYWwudHJhbnNwYXJlbnQgKSB7XG5cblx0XHRcdGFycmF5ID0gdHJhbnNwYXJlbnQ7XG5cdFx0XHRpbmRleCA9ICsrIHRyYW5zcGFyZW50TGFzdEluZGV4O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0YXJyYXkgPSBvcGFxdWU7XG5cdFx0XHRpbmRleCA9ICsrIG9wYXF1ZUxhc3RJbmRleDtcblxuXHRcdH1cblxuXHRcdC8vIHJlY3ljbGUgZXhpc3RpbmcgcmVuZGVyIGl0ZW0gb3IgZ3JvdyB0aGUgYXJyYXlcblxuXHRcdHZhciByZW5kZXJJdGVtID0gYXJyYXlbIGluZGV4IF07XG5cblx0XHRpZiAoIHJlbmRlckl0ZW0gKSB7XG5cblx0XHRcdHJlbmRlckl0ZW0uaWQgPSBvYmplY3QuaWQ7XG5cdFx0XHRyZW5kZXJJdGVtLm9iamVjdCA9IG9iamVjdDtcblx0XHRcdHJlbmRlckl0ZW0uZ2VvbWV0cnkgPSBnZW9tZXRyeTtcblx0XHRcdHJlbmRlckl0ZW0ubWF0ZXJpYWwgPSBtYXRlcmlhbDtcblx0XHRcdHJlbmRlckl0ZW0ucHJvZ3JhbSA9IG1hdGVyaWFsLnByb2dyYW07XG5cdFx0XHRyZW5kZXJJdGVtLnJlbmRlck9yZGVyID0gb2JqZWN0LnJlbmRlck9yZGVyO1xuXHRcdFx0cmVuZGVySXRlbS56ID0gejtcblx0XHRcdHJlbmRlckl0ZW0uZ3JvdXAgPSBncm91cDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJlbmRlckl0ZW0gPSB7XG5cdFx0XHRcdGlkOiBvYmplY3QuaWQsXG5cdFx0XHRcdG9iamVjdDogb2JqZWN0LFxuXHRcdFx0XHRnZW9tZXRyeTogZ2VvbWV0cnksXG5cdFx0XHRcdG1hdGVyaWFsOiBtYXRlcmlhbCxcblx0XHRcdFx0cHJvZ3JhbTogbWF0ZXJpYWwucHJvZ3JhbSxcblx0XHRcdFx0cmVuZGVyT3JkZXI6IG9iamVjdC5yZW5kZXJPcmRlcixcblx0XHRcdFx0ejogeixcblx0XHRcdFx0Z3JvdXA6IGdyb3VwXG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBhc3NlcnQoIGluZGV4ID09PSBhcnJheS5sZW5ndGggKTtcblx0XHRcdGFycmF5LnB1c2goIHJlbmRlckl0ZW0gKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZmluaXNoKCkge1xuXG5cdFx0b3BhcXVlLmxlbmd0aCA9IG9wYXF1ZUxhc3RJbmRleCArIDE7XG5cdFx0dHJhbnNwYXJlbnQubGVuZ3RoID0gdHJhbnNwYXJlbnRMYXN0SW5kZXggKyAxO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzb3J0KCkge1xuXG5cdFx0b3BhcXVlLnNvcnQoIHBhaW50ZXJTb3J0U3RhYmxlICk7XG5cdFx0dHJhbnNwYXJlbnQuc29ydCggcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlICk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0b3BhcXVlOiBvcGFxdWUsXG5cdFx0dHJhbnNwYXJlbnQ6IHRyYW5zcGFyZW50LFxuXG5cdFx0aW5pdDogaW5pdCxcblx0XHRwdXNoOiBwdXNoLFxuXHRcdGZpbmlzaDogZmluaXNoLFxuXG5cdFx0c29ydDogc29ydFxuXHR9O1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMUmVuZGVyTGlzdHMoKSB7XG5cblx0dmFyIGxpc3RzID0ge307XG5cblx0ZnVuY3Rpb24gZ2V0KCBzY2VuZSwgY2FtZXJhICkge1xuXG5cdFx0dmFyIGhhc2ggPSBzY2VuZS5pZCArICcsJyArIGNhbWVyYS5pZDtcblx0XHR2YXIgbGlzdCA9IGxpc3RzWyBoYXNoIF07XG5cblx0XHRpZiAoIGxpc3QgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gY29uc29sZS5sb2coICdUSFJFRS5XZWJHTFJlbmRlckxpc3RzOicsIGhhc2ggKTtcblxuXHRcdFx0bGlzdCA9IG5ldyBXZWJHTFJlbmRlckxpc3QoKTtcblx0XHRcdGxpc3RzWyBoYXNoIF0gPSBsaXN0O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGxpc3Q7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG5cblx0XHRsaXN0cyA9IHt9O1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGdldDogZ2V0LFxuXHRcdGRpc3Bvc2U6IGRpc3Bvc2Vcblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXIoIGdsLCBleHRlbnNpb25zLCBpbmZvUmVuZGVyICkge1xuXG5cdHZhciBtb2RlO1xuXG5cdGZ1bmN0aW9uIHNldE1vZGUoIHZhbHVlICkge1xuXG5cdFx0bW9kZSA9IHZhbHVlO1xuXG5cdH1cblxuXHR2YXIgdHlwZSwgc2l6ZTtcblxuXHRmdW5jdGlvbiBzZXRJbmRleCggaW5kZXggKSB7XG5cblx0XHRpZiAoIGluZGV4LmFycmF5IGluc3RhbmNlb2YgVWludDMyQXJyYXkgJiYgZXh0ZW5zaW9ucy5nZXQoICdPRVNfZWxlbWVudF9pbmRleF91aW50JyApICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuVU5TSUdORURfSU5UO1xuXHRcdFx0c2l6ZSA9IDQ7XG5cblx0XHR9IGVsc2UgaWYgKCBpbmRleC5hcnJheSBpbnN0YW5jZW9mIFVpbnQxNkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuVU5TSUdORURfU0hPUlQ7XG5cdFx0XHRzaXplID0gMjtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHR5cGUgPSBnbC5VTlNJR05FRF9CWVRFO1xuXHRcdFx0c2l6ZSA9IDE7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlciggc3RhcnQsIGNvdW50ICkge1xuXG5cdFx0Z2wuZHJhd0VsZW1lbnRzKCBtb2RlLCBjb3VudCwgdHlwZSwgc3RhcnQgKiBzaXplICk7XG5cblx0XHRpbmZvUmVuZGVyLmNhbGxzICsrO1xuXHRcdGluZm9SZW5kZXIudmVydGljZXMgKz0gY291bnQ7XG5cblx0XHRpZiAoIG1vZGUgPT09IGdsLlRSSUFOR0xFUyApIGluZm9SZW5kZXIuZmFjZXMgKz0gY291bnQgLyAzO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXJJbnN0YW5jZXMoIGdlb21ldHJ5LCBzdGFydCwgY291bnQgKSB7XG5cblx0XHR2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApO1xuXG5cdFx0aWYgKCBleHRlbnNpb24gPT09IG51bGwgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlcjogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0ZXh0ZW5zaW9uLmRyYXdFbGVtZW50c0luc3RhbmNlZEFOR0xFKCBtb2RlLCBjb3VudCwgdHlwZSwgc3RhcnQgKiBzaXplLCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCApO1xuXG5cdFx0aW5mb1JlbmRlci5jYWxscyArKztcblx0XHRpbmZvUmVuZGVyLnZlcnRpY2VzICs9IGNvdW50ICogZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQ7XG5cblx0XHRpZiAoIG1vZGUgPT09IGdsLlRSSUFOR0xFUyApIGluZm9SZW5kZXIuZmFjZXMgKz0gZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgKiBjb3VudCAvIDM7XG5cblx0fVxuXG5cdC8vXG5cblx0dGhpcy5zZXRNb2RlID0gc2V0TW9kZTtcblx0dGhpcy5zZXRJbmRleCA9IHNldEluZGV4O1xuXHR0aGlzLnJlbmRlciA9IHJlbmRlcjtcblx0dGhpcy5yZW5kZXJJbnN0YW5jZXMgPSByZW5kZXJJbnN0YW5jZXM7XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMQnVmZmVyUmVuZGVyZXIoIGdsLCBleHRlbnNpb25zLCBpbmZvUmVuZGVyICkge1xuXG5cdHZhciBtb2RlO1xuXG5cdGZ1bmN0aW9uIHNldE1vZGUoIHZhbHVlICkge1xuXG5cdFx0bW9kZSA9IHZhbHVlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXIoIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdGdsLmRyYXdBcnJheXMoIG1vZGUsIHN0YXJ0LCBjb3VudCApO1xuXG5cdFx0aW5mb1JlbmRlci5jYWxscyArKztcblx0XHRpbmZvUmVuZGVyLnZlcnRpY2VzICs9IGNvdW50O1xuXG5cdFx0aWYgKCBtb2RlID09PSBnbC5UUklBTkdMRVMgKSBpbmZvUmVuZGVyLmZhY2VzICs9IGNvdW50IC8gMztcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVySW5zdGFuY2VzKCBnZW9tZXRyeSwgc3RhcnQsIGNvdW50ICkge1xuXG5cdFx0dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcblxuXHRcdGlmICggZXh0ZW5zaW9uID09PSBudWxsICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xCdWZmZXJSZW5kZXJlcjogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdGlmICggcG9zaXRpb24uaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0Y291bnQgPSBwb3NpdGlvbi5kYXRhLmNvdW50O1xuXG5cdFx0XHRleHRlbnNpb24uZHJhd0FycmF5c0luc3RhbmNlZEFOR0xFKCBtb2RlLCAwLCBjb3VudCwgZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGV4dGVuc2lvbi5kcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUoIG1vZGUsIHN0YXJ0LCBjb3VudCwgZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgKTtcblxuXHRcdH1cblxuXHRcdGluZm9SZW5kZXIuY2FsbHMgKys7XG5cdFx0aW5mb1JlbmRlci52ZXJ0aWNlcyArPSBjb3VudCAqIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50O1xuXG5cdFx0aWYgKCBtb2RlID09PSBnbC5UUklBTkdMRVMgKSBpbmZvUmVuZGVyLmZhY2VzICs9IGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICogY291bnQgLyAzO1xuXG5cdH1cblxuXHQvL1xuXG5cdHRoaXMuc2V0TW9kZSA9IHNldE1vZGU7XG5cdHRoaXMucmVuZGVyID0gcmVuZGVyO1xuXHR0aGlzLnJlbmRlckluc3RhbmNlcyA9IHJlbmRlckluc3RhbmNlcztcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xHZW9tZXRyaWVzKCBnbCwgYXR0cmlidXRlcywgaW5mb01lbW9yeSApIHtcblxuXHR2YXIgZ2VvbWV0cmllcyA9IHt9O1xuXHR2YXIgd2lyZWZyYW1lQXR0cmlidXRlcyA9IHt9O1xuXG5cdGZ1bmN0aW9uIG9uR2VvbWV0cnlEaXNwb3NlKCBldmVudCApIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IGV2ZW50LnRhcmdldDtcblx0XHR2YXIgYnVmZmVyZ2VvbWV0cnkgPSBnZW9tZXRyaWVzWyBnZW9tZXRyeS5pZCBdO1xuXG5cdFx0aWYgKCBidWZmZXJnZW9tZXRyeS5pbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0YXR0cmlidXRlcy5yZW1vdmUoIGJ1ZmZlcmdlb21ldHJ5LmluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgbmFtZSBpbiBidWZmZXJnZW9tZXRyeS5hdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnJlbW92ZSggYnVmZmVyZ2VvbWV0cnkuYXR0cmlidXRlc1sgbmFtZSBdICk7XG5cblx0XHR9XG5cblx0XHRnZW9tZXRyeS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uR2VvbWV0cnlEaXNwb3NlICk7XG5cblx0XHRkZWxldGUgZ2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdC8vIFRPRE8gUmVtb3ZlIGR1cGxpY2F0ZSBjb2RlXG5cblx0XHR2YXIgYXR0cmlidXRlID0gd2lyZWZyYW1lQXR0cmlidXRlc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggYXR0cmlidXRlICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnJlbW92ZSggYXR0cmlidXRlICk7XG5cdFx0XHRkZWxldGUgd2lyZWZyYW1lQXR0cmlidXRlc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdH1cblxuXHRcdGF0dHJpYnV0ZSA9IHdpcmVmcmFtZUF0dHJpYnV0ZXNbIGJ1ZmZlcmdlb21ldHJ5LmlkIF07XG5cblx0XHRpZiAoIGF0dHJpYnV0ZSApIHtcblxuXHRcdFx0YXR0cmlidXRlcy5yZW1vdmUoIGF0dHJpYnV0ZSApO1xuXHRcdFx0ZGVsZXRlIHdpcmVmcmFtZUF0dHJpYnV0ZXNbIGJ1ZmZlcmdlb21ldHJ5LmlkIF07XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0aW5mb01lbW9yeS5nZW9tZXRyaWVzIC0tO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXQoIG9iamVjdCwgZ2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgYnVmZmVyZ2VvbWV0cnkgPSBnZW9tZXRyaWVzWyBnZW9tZXRyeS5pZCBdO1xuXG5cdFx0aWYgKCBidWZmZXJnZW9tZXRyeSApIHJldHVybiBidWZmZXJnZW9tZXRyeTtcblxuXHRcdGdlb21ldHJ5LmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25HZW9tZXRyeURpc3Bvc2UgKTtcblxuXHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0YnVmZmVyZ2VvbWV0cnkgPSBnZW9tZXRyeTtcblxuXHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuX2J1ZmZlckdlb21ldHJ5ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Z2VvbWV0cnkuX2J1ZmZlckdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCkuc2V0RnJvbU9iamVjdCggb2JqZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0YnVmZmVyZ2VvbWV0cnkgPSBnZW9tZXRyeS5fYnVmZmVyR2VvbWV0cnk7XG5cblx0XHR9XG5cblx0XHRnZW9tZXRyaWVzWyBnZW9tZXRyeS5pZCBdID0gYnVmZmVyZ2VvbWV0cnk7XG5cblx0XHRpbmZvTWVtb3J5Lmdlb21ldHJpZXMgKys7XG5cblx0XHRyZXR1cm4gYnVmZmVyZ2VvbWV0cnk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZSggZ2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcblx0XHR2YXIgZ2VvbWV0cnlBdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblxuXHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZXMudXBkYXRlKCBpbmRleCwgZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIgKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBuYW1lIGluIGdlb21ldHJ5QXR0cmlidXRlcyApIHtcblxuXHRcdFx0YXR0cmlidXRlcy51cGRhdGUoIGdlb21ldHJ5QXR0cmlidXRlc1sgbmFtZSBdLCBnbC5BUlJBWV9CVUZGRVIgKTtcblxuXHRcdH1cblxuXHRcdC8vIG1vcnBoIHRhcmdldHNcblxuXHRcdHZhciBtb3JwaEF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCB2YXIgbmFtZSBpbiBtb3JwaEF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdHZhciBhcnJheSA9IG1vcnBoQXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGF0dHJpYnV0ZXMudXBkYXRlKCBhcnJheVsgaSBdLCBnbC5BUlJBWV9CVUZGRVIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRXaXJlZnJhbWVBdHRyaWJ1dGUoIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIGF0dHJpYnV0ZSA9IHdpcmVmcmFtZUF0dHJpYnV0ZXNbIGdlb21ldHJ5LmlkIF07XG5cblx0XHRpZiAoIGF0dHJpYnV0ZSApIHJldHVybiBhdHRyaWJ1dGU7XG5cblx0XHR2YXIgaW5kaWNlcyA9IFtdO1xuXG5cdFx0dmFyIGdlb21ldHJ5SW5kZXggPSBnZW9tZXRyeS5pbmRleDtcblx0XHR2YXIgZ2VvbWV0cnlBdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblxuXHRcdC8vIGNvbnNvbGUudGltZSggJ3dpcmVmcmFtZScgKTtcblxuXHRcdGlmICggZ2VvbWV0cnlJbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gZ2VvbWV0cnlJbmRleC5hcnJheTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdHZhciBhID0gYXJyYXlbIGkgKyAwIF07XG5cdFx0XHRcdHZhciBiID0gYXJyYXlbIGkgKyAxIF07XG5cdFx0XHRcdHZhciBjID0gYXJyYXlbIGkgKyAyIF07XG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBiLCBjLCBjLCBhICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHZhciBhcnJheSA9IGdlb21ldHJ5QXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gKCBhcnJheS5sZW5ndGggLyAzICkgLSAxOyBpIDwgbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdHZhciBhID0gaSArIDA7XG5cdFx0XHRcdHZhciBiID0gaSArIDE7XG5cdFx0XHRcdHZhciBjID0gaSArIDI7XG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBiLCBjLCBjLCBhICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGNvbnNvbGUudGltZUVuZCggJ3dpcmVmcmFtZScgKTtcblxuXHRcdGF0dHJpYnV0ZSA9IG5ldyAoIGFycmF5TWF4KCBpbmRpY2VzICkgPiA2NTUzNSA/IFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSA6IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSApKCBpbmRpY2VzLCAxICk7XG5cblx0XHRhdHRyaWJ1dGVzLnVwZGF0ZSggYXR0cmlidXRlLCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiApO1xuXG5cdFx0d2lyZWZyYW1lQXR0cmlidXRlc1sgZ2VvbWV0cnkuaWQgXSA9IGF0dHJpYnV0ZTtcblxuXHRcdHJldHVybiBhdHRyaWJ1dGU7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRnZXQ6IGdldCxcblx0XHR1cGRhdGU6IHVwZGF0ZSxcblxuXHRcdGdldFdpcmVmcmFtZUF0dHJpYnV0ZTogZ2V0V2lyZWZyYW1lQXR0cmlidXRlXG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xMaWdodHMoKSB7XG5cblx0dmFyIGxpZ2h0cyA9IHt9O1xuXG5cdHJldHVybiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICggbGlnaHQgKSB7XG5cblx0XHRcdGlmICggbGlnaHRzWyBsaWdodC5pZCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGxpZ2h0c1sgbGlnaHQuaWQgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgdW5pZm9ybXM7XG5cblx0XHRcdHN3aXRjaCAoIGxpZ2h0LnR5cGUgKSB7XG5cblx0XHRcdFx0Y2FzZSAnRGlyZWN0aW9uYWxMaWdodCc6XG5cdFx0XHRcdFx0dW5pZm9ybXMgPSB7XG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKCksXG5cblx0XHRcdFx0XHRcdHNoYWRvdzogZmFsc2UsXG5cdFx0XHRcdFx0XHRzaGFkb3dCaWFzOiAwLFxuXHRcdFx0XHRcdFx0c2hhZG93UmFkaXVzOiAxLFxuXHRcdFx0XHRcdFx0c2hhZG93TWFwU2l6ZTogbmV3IFZlY3RvcjIoKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnU3BvdExpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdHBvc2l0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0Y29sb3I6IG5ldyBDb2xvcigpLFxuXHRcdFx0XHRcdFx0ZGlzdGFuY2U6IDAsXG5cdFx0XHRcdFx0XHRjb25lQ29zOiAwLFxuXHRcdFx0XHRcdFx0cGVudW1icmFDb3M6IDAsXG5cdFx0XHRcdFx0XHRkZWNheTogMCxcblxuXHRcdFx0XHRcdFx0c2hhZG93OiBmYWxzZSxcblx0XHRcdFx0XHRcdHNoYWRvd0JpYXM6IDAsXG5cdFx0XHRcdFx0XHRzaGFkb3dSYWRpdXM6IDEsXG5cdFx0XHRcdFx0XHRzaGFkb3dNYXBTaXplOiBuZXcgVmVjdG9yMigpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdQb2ludExpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdHBvc2l0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0Y29sb3I6IG5ldyBDb2xvcigpLFxuXHRcdFx0XHRcdFx0ZGlzdGFuY2U6IDAsXG5cdFx0XHRcdFx0XHRkZWNheTogMCxcblxuXHRcdFx0XHRcdFx0c2hhZG93OiBmYWxzZSxcblx0XHRcdFx0XHRcdHNoYWRvd0JpYXM6IDAsXG5cdFx0XHRcdFx0XHRzaGFkb3dSYWRpdXM6IDEsXG5cdFx0XHRcdFx0XHRzaGFkb3dNYXBTaXplOiBuZXcgVmVjdG9yMigpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdIZW1pc3BoZXJlTGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0c2t5Q29sb3I6IG5ldyBDb2xvcigpLFxuXHRcdFx0XHRcdFx0Z3JvdW5kQ29sb3I6IG5ldyBDb2xvcigpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdSZWN0QXJlYUxpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdGNvbG9yOiBuZXcgQ29sb3IoKSxcblx0XHRcdFx0XHRcdHBvc2l0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0aGFsZldpZHRoOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0aGFsZkhlaWdodDogbmV3IFZlY3RvcjMoKVxuXHRcdFx0XHRcdFx0Ly8gVE9ETyAoYWJlbG5hdGlvbik6IHNldCBSZWN0QXJlYUxpZ2h0IHNoYWRvdyB1bmlmb3Jtc1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdFx0bGlnaHRzWyBsaWdodC5pZCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdHJldHVybiB1bmlmb3JtcztcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTE9iamVjdHMoIGdsLCBnZW9tZXRyaWVzLCBpbmZvUmVuZGVyICkge1xuXG5cdHZhciB1cGRhdGVMaXN0ID0ge307XG5cblx0ZnVuY3Rpb24gdXBkYXRlKCBvYmplY3QgKSB7XG5cblx0XHR2YXIgZnJhbWUgPSBpbmZvUmVuZGVyLmZyYW1lO1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXHRcdHZhciBidWZmZXJnZW9tZXRyeSA9IGdlb21ldHJpZXMuZ2V0KCBvYmplY3QsIGdlb21ldHJ5ICk7XG5cblx0XHQvLyBVcGRhdGUgb25jZSBwZXIgZnJhbWVcblxuXHRcdGlmICggdXBkYXRlTGlzdFsgYnVmZmVyZ2VvbWV0cnkuaWQgXSAhPT0gZnJhbWUgKSB7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHRidWZmZXJnZW9tZXRyeS51cGRhdGVGcm9tT2JqZWN0KCBvYmplY3QgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyaWVzLnVwZGF0ZSggYnVmZmVyZ2VvbWV0cnkgKTtcblxuXHRcdFx0dXBkYXRlTGlzdFsgYnVmZmVyZ2VvbWV0cnkuaWQgXSA9IGZyYW1lO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGJ1ZmZlcmdlb21ldHJ5O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBjbGVhcigpIHtcblxuXHRcdHVwZGF0ZUxpc3QgPSB7fTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdHVwZGF0ZTogdXBkYXRlLFxuXHRcdGNsZWFyOiBjbGVhclxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIGFkZExpbmVOdW1iZXJzKCBzdHJpbmcgKSB7XG5cblx0dmFyIGxpbmVzID0gc3RyaW5nLnNwbGl0KCAnXFxuJyApO1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdGxpbmVzWyBpIF0gPSAoIGkgKyAxICkgKyAnOiAnICsgbGluZXNbIGkgXTtcblxuXHR9XG5cblx0cmV0dXJuIGxpbmVzLmpvaW4oICdcXG4nICk7XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xTaGFkZXIoIGdsLCB0eXBlLCBzdHJpbmcgKSB7XG5cblx0dmFyIHNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlciggdHlwZSApO1xuXG5cdGdsLnNoYWRlclNvdXJjZSggc2hhZGVyLCBzdHJpbmcgKTtcblx0Z2wuY29tcGlsZVNoYWRlciggc2hhZGVyICk7XG5cblx0aWYgKCBnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoIHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xTaGFkZXI6IFNoYWRlciBjb3VsZG5cXCd0IGNvbXBpbGUuJyApO1xuXG5cdH1cblxuXHRpZiAoIGdsLmdldFNoYWRlckluZm9Mb2coIHNoYWRlciApICE9PSAnJyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMU2hhZGVyOiBnbC5nZXRTaGFkZXJJbmZvTG9nKCknLCB0eXBlID09PSBnbC5WRVJURVhfU0hBREVSID8gJ3ZlcnRleCcgOiAnZnJhZ21lbnQnLCBnbC5nZXRTaGFkZXJJbmZvTG9nKCBzaGFkZXIgKSwgYWRkTGluZU51bWJlcnMoIHN0cmluZyApICk7XG5cblx0fVxuXG5cdC8vIC0tZW5hYmxlLXByaXZpbGVnZWQtd2ViZ2wtZXh0ZW5zaW9uXG5cdC8vIGNvbnNvbGUubG9nKCB0eXBlLCBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9kZWJ1Z19zaGFkZXJzJyApLmdldFRyYW5zbGF0ZWRTaGFkZXJTb3VyY2UoIHNoYWRlciApICk7XG5cblx0cmV0dXJuIHNoYWRlcjtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxudmFyIHByb2dyYW1JZENvdW50ID0gMDtcblxuZnVuY3Rpb24gZ2V0RW5jb2RpbmdDb21wb25lbnRzKCBlbmNvZGluZyApIHtcblxuXHRzd2l0Y2ggKCBlbmNvZGluZyApIHtcblxuXHRcdGNhc2UgTGluZWFyRW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnTGluZWFyJywnKCB2YWx1ZSApJyBdO1xuXHRcdGNhc2Ugc1JHQkVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ3NSR0InLCcoIHZhbHVlICknIF07XG5cdFx0Y2FzZSBSR0JFRW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnUkdCRScsJyggdmFsdWUgKScgXTtcblx0XHRjYXNlIFJHQk03RW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnUkdCTScsJyggdmFsdWUsIDcuMCApJyBdO1xuXHRcdGNhc2UgUkdCTTE2RW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnUkdCTScsJyggdmFsdWUsIDE2LjAgKScgXTtcblx0XHRjYXNlIFJHQkRFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdSR0JEJywnKCB2YWx1ZSwgMjU2LjAgKScgXTtcblx0XHRjYXNlIEdhbW1hRW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnR2FtbWEnLCcoIHZhbHVlLCBmbG9hdCggR0FNTUFfRkFDVE9SICkgKScgXTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAndW5zdXBwb3J0ZWQgZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oIGZ1bmN0aW9uTmFtZSwgZW5jb2RpbmcgKSB7XG5cblx0dmFyIGNvbXBvbmVudHMgPSBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGVuY29kaW5nICk7XG5cdHJldHVybiBcInZlYzQgXCIgKyBmdW5jdGlvbk5hbWUgKyBcIiggdmVjNCB2YWx1ZSApIHsgcmV0dXJuIFwiICsgY29tcG9uZW50c1sgMCBdICsgXCJUb0xpbmVhclwiICsgY29tcG9uZW50c1sgMSBdICsgXCI7IH1cIjtcblxufVxuXG5mdW5jdGlvbiBnZXRUZXhlbEVuY29kaW5nRnVuY3Rpb24oIGZ1bmN0aW9uTmFtZSwgZW5jb2RpbmcgKSB7XG5cblx0dmFyIGNvbXBvbmVudHMgPSBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGVuY29kaW5nICk7XG5cdHJldHVybiBcInZlYzQgXCIgKyBmdW5jdGlvbk5hbWUgKyBcIiggdmVjNCB2YWx1ZSApIHsgcmV0dXJuIExpbmVhclRvXCIgKyBjb21wb25lbnRzWyAwIF0gKyBjb21wb25lbnRzWyAxIF0gKyBcIjsgfVwiO1xuXG59XG5cbmZ1bmN0aW9uIGdldFRvbmVNYXBwaW5nRnVuY3Rpb24oIGZ1bmN0aW9uTmFtZSwgdG9uZU1hcHBpbmcgKSB7XG5cblx0dmFyIHRvbmVNYXBwaW5nTmFtZTtcblxuXHRzd2l0Y2ggKCB0b25lTWFwcGluZyApIHtcblxuXHRcdGNhc2UgTGluZWFyVG9uZU1hcHBpbmc6XG5cdFx0XHR0b25lTWFwcGluZ05hbWUgPSBcIkxpbmVhclwiO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFJlaW5oYXJkVG9uZU1hcHBpbmc6XG5cdFx0XHR0b25lTWFwcGluZ05hbWUgPSBcIlJlaW5oYXJkXCI7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVW5jaGFydGVkMlRvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gXCJVbmNoYXJ0ZWQyXCI7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgQ2luZW9uVG9uZU1hcHBpbmc6XG5cdFx0XHR0b25lTWFwcGluZ05hbWUgPSBcIk9wdGltaXplZENpbmVvblwiO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAndW5zdXBwb3J0ZWQgdG9uZU1hcHBpbmc6ICcgKyB0b25lTWFwcGluZyApO1xuXG5cdH1cblxuXHRyZXR1cm4gXCJ2ZWMzIFwiICsgZnVuY3Rpb25OYW1lICsgXCIoIHZlYzMgY29sb3IgKSB7IHJldHVybiBcIiArIHRvbmVNYXBwaW5nTmFtZSArIFwiVG9uZU1hcHBpbmcoIGNvbG9yICk7IH1cIjtcblxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoIGV4dGVuc2lvbnMsIHBhcmFtZXRlcnMsIHJlbmRlcmVyRXh0ZW5zaW9ucyApIHtcblxuXHRleHRlbnNpb25zID0gZXh0ZW5zaW9ucyB8fCB7fTtcblxuXHR2YXIgY2h1bmtzID0gW1xuXHRcdCggZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcyB8fCBwYXJhbWV0ZXJzLmVudk1hcEN1YmVVViB8fCBwYXJhbWV0ZXJzLmJ1bXBNYXAgfHwgcGFyYW1ldGVycy5ub3JtYWxNYXAgfHwgcGFyYW1ldGVycy5mbGF0U2hhZGluZyApID8gJyNleHRlbnNpb24gR0xfT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIDogZW5hYmxlJyA6ICcnLFxuXHRcdCggZXh0ZW5zaW9ucy5mcmFnRGVwdGggfHwgcGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICkgJiYgcmVuZGVyZXJFeHRlbnNpb25zLmdldCggJ0VYVF9mcmFnX2RlcHRoJyApID8gJyNleHRlbnNpb24gR0xfRVhUX2ZyYWdfZGVwdGggOiBlbmFibGUnIDogJycsXG5cdFx0KCBleHRlbnNpb25zLmRyYXdCdWZmZXJzICkgJiYgcmVuZGVyZXJFeHRlbnNpb25zLmdldCggJ1dFQkdMX2RyYXdfYnVmZmVycycgKSA/ICcjZXh0ZW5zaW9uIEdMX0VYVF9kcmF3X2J1ZmZlcnMgOiByZXF1aXJlJyA6ICcnLFxuXHRcdCggZXh0ZW5zaW9ucy5zaGFkZXJUZXh0dXJlTE9EIHx8IHBhcmFtZXRlcnMuZW52TWFwICkgJiYgcmVuZGVyZXJFeHRlbnNpb25zLmdldCggJ0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QnICkgPyAnI2V4dGVuc2lvbiBHTF9FWFRfc2hhZGVyX3RleHR1cmVfbG9kIDogZW5hYmxlJyA6ICcnXG5cdF07XG5cblx0cmV0dXJuIGNodW5rcy5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcXG4nICk7XG5cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVEZWZpbmVzKCBkZWZpbmVzICkge1xuXG5cdHZhciBjaHVua3MgPSBbXTtcblxuXHRmb3IgKCB2YXIgbmFtZSBpbiBkZWZpbmVzICkge1xuXG5cdFx0dmFyIHZhbHVlID0gZGVmaW5lc1sgbmFtZSBdO1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSBjb250aW51ZTtcblxuXHRcdGNodW5rcy5wdXNoKCAnI2RlZmluZSAnICsgbmFtZSArICcgJyArIHZhbHVlICk7XG5cblx0fVxuXG5cdHJldHVybiBjaHVua3Muam9pbiggJ1xcbicgKTtcblxufVxuXG5mdW5jdGlvbiBmZXRjaEF0dHJpYnV0ZUxvY2F0aW9ucyggZ2wsIHByb2dyYW0sIGlkZW50aWZpZXJzICkge1xuXG5cdHZhciBhdHRyaWJ1dGVzID0ge307XG5cblx0dmFyIG4gPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCBnbC5BQ1RJVkVfQVRUUklCVVRFUyApO1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSA8IG47IGkgKysgKSB7XG5cblx0XHR2YXIgaW5mbyA9IGdsLmdldEFjdGl2ZUF0dHJpYiggcHJvZ3JhbSwgaSApO1xuXHRcdHZhciBuYW1lID0gaW5mby5uYW1lO1xuXG5cdFx0Ly8gY29uc29sZS5sb2coXCJUSFJFRS5XZWJHTFByb2dyYW06IEFDVElWRSBWRVJURVggQVRUUklCVVRFOlwiLCBuYW1lLCBpICk7XG5cblx0XHRhdHRyaWJ1dGVzWyBuYW1lIF0gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgbmFtZSApO1xuXG5cdH1cblxuXHRyZXR1cm4gYXR0cmlidXRlcztcblxufVxuXG5mdW5jdGlvbiBmaWx0ZXJFbXB0eUxpbmUoIHN0cmluZyApIHtcblxuXHRyZXR1cm4gc3RyaW5nICE9PSAnJztcblxufVxuXG5mdW5jdGlvbiByZXBsYWNlTGlnaHROdW1zKCBzdHJpbmcsIHBhcmFtZXRlcnMgKSB7XG5cblx0cmV0dXJuIHN0cmluZ1xuXHRcdC5yZXBsYWNlKCAvTlVNX0RJUl9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1EaXJMaWdodHMgKVxuXHRcdC5yZXBsYWNlKCAvTlVNX1NQT1RfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtU3BvdExpZ2h0cyApXG5cdFx0LnJlcGxhY2UoIC9OVU1fUkVDVF9BUkVBX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bVJlY3RBcmVhTGlnaHRzIClcblx0XHQucmVwbGFjZSggL05VTV9QT0lOVF9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1Qb2ludExpZ2h0cyApXG5cdFx0LnJlcGxhY2UoIC9OVU1fSEVNSV9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1IZW1pTGlnaHRzICk7XG5cbn1cblxuZnVuY3Rpb24gcGFyc2VJbmNsdWRlcyggc3RyaW5nICkge1xuXG5cdHZhciBwYXR0ZXJuID0gL15bIFxcdF0qI2luY2x1ZGUgKzwoW1xcd1xcZC5dKyk+L2dtO1xuXG5cdGZ1bmN0aW9uIHJlcGxhY2UoIG1hdGNoLCBpbmNsdWRlICkge1xuXG5cdFx0dmFyIHJlcGxhY2UgPSBTaGFkZXJDaHVua1sgaW5jbHVkZSBdO1xuXG5cdFx0aWYgKCByZXBsYWNlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRocm93IG5ldyBFcnJvciggJ0NhbiBub3QgcmVzb2x2ZSAjaW5jbHVkZSA8JyArIGluY2x1ZGUgKyAnPicgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBwYXJzZUluY2x1ZGVzKCByZXBsYWNlICk7XG5cblx0fVxuXG5cdHJldHVybiBzdHJpbmcucmVwbGFjZSggcGF0dGVybiwgcmVwbGFjZSApO1xuXG59XG5cbmZ1bmN0aW9uIHVucm9sbExvb3BzKCBzdHJpbmcgKSB7XG5cblx0dmFyIHBhdHRlcm4gPSAvZm9yIFxcKCBpbnQgaSBcXD0gKFxcZCspXFw7IGkgPCAoXFxkKylcXDsgaSBcXCtcXCsgXFwpIFxceyhbXFxzXFxTXSs/KSg/PVxcfSlcXH0vZztcblxuXHRmdW5jdGlvbiByZXBsYWNlKCBtYXRjaCwgc3RhcnQsIGVuZCwgc25pcHBldCApIHtcblxuXHRcdHZhciB1bnJvbGwgPSAnJztcblxuXHRcdGZvciAoIHZhciBpID0gcGFyc2VJbnQoIHN0YXJ0ICk7IGkgPCBwYXJzZUludCggZW5kICk7IGkgKysgKSB7XG5cblx0XHRcdHVucm9sbCArPSBzbmlwcGV0LnJlcGxhY2UoIC9cXFsgaSBcXF0vZywgJ1sgJyArIGkgKyAnIF0nICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdW5yb2xsO1xuXG5cdH1cblxuXHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHBhdHRlcm4sIHJlcGxhY2UgKTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTFByb2dyYW0oIHJlbmRlcmVyLCBjb2RlLCBtYXRlcmlhbCwgcGFyYW1ldGVycyApIHtcblxuXHR2YXIgZ2wgPSByZW5kZXJlci5jb250ZXh0O1xuXG5cdHZhciBleHRlbnNpb25zID0gbWF0ZXJpYWwuZXh0ZW5zaW9ucztcblx0dmFyIGRlZmluZXMgPSBtYXRlcmlhbC5kZWZpbmVzO1xuXG5cdHZhciB2ZXJ0ZXhTaGFkZXIgPSBtYXRlcmlhbC5fX3dlYmdsU2hhZGVyLnZlcnRleFNoYWRlcjtcblx0dmFyIGZyYWdtZW50U2hhZGVyID0gbWF0ZXJpYWwuX193ZWJnbFNoYWRlci5mcmFnbWVudFNoYWRlcjtcblxuXHR2YXIgc2hhZG93TWFwVHlwZURlZmluZSA9ICdTSEFET1dNQVBfVFlQRV9CQVNJQyc7XG5cblx0aWYgKCBwYXJhbWV0ZXJzLnNoYWRvd01hcFR5cGUgPT09IFBDRlNoYWRvd01hcCApIHtcblxuXHRcdHNoYWRvd01hcFR5cGVEZWZpbmUgPSAnU0hBRE9XTUFQX1RZUEVfUENGJztcblxuXHR9IGVsc2UgaWYgKCBwYXJhbWV0ZXJzLnNoYWRvd01hcFR5cGUgPT09IFBDRlNvZnRTaGFkb3dNYXAgKSB7XG5cblx0XHRzaGFkb3dNYXBUeXBlRGVmaW5lID0gJ1NIQURPV01BUF9UWVBFX1BDRl9TT0ZUJztcblxuXHR9XG5cblx0dmFyIGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfQ1VCRSc7XG5cdHZhciBlbnZNYXBNb2RlRGVmaW5lID0gJ0VOVk1BUF9NT0RFX1JFRkxFQ1RJT04nO1xuXHR2YXIgZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZJztcblxuXHRpZiAoIHBhcmFtZXRlcnMuZW52TWFwICkge1xuXG5cdFx0c3dpdGNoICggbWF0ZXJpYWwuZW52TWFwLm1hcHBpbmcgKSB7XG5cblx0XHRcdGNhc2UgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nOlxuXHRcdFx0Y2FzZSBDdWJlUmVmcmFjdGlvbk1hcHBpbmc6XG5cdFx0XHRcdGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfQ1VCRSc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nOlxuXHRcdFx0Y2FzZSBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZzpcblx0XHRcdFx0ZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9DVUJFX1VWJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmc6XG5cdFx0XHRjYXNlIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOlxuXHRcdFx0XHRlbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX0VRVUlSRUMnO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZzpcblx0XHRcdFx0ZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9TUEhFUkUnO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdH1cblxuXHRcdHN3aXRjaCAoIG1hdGVyaWFsLmVudk1hcC5tYXBwaW5nICkge1xuXG5cdFx0XHRjYXNlIEN1YmVSZWZyYWN0aW9uTWFwcGluZzpcblx0XHRcdGNhc2UgRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6XG5cdFx0XHRcdGVudk1hcE1vZGVEZWZpbmUgPSAnRU5WTUFQX01PREVfUkVGUkFDVElPTic7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXG5cdFx0c3dpdGNoICggbWF0ZXJpYWwuY29tYmluZSApIHtcblxuXHRcdFx0Y2FzZSBNdWx0aXBseU9wZXJhdGlvbjpcblx0XHRcdFx0ZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgTWl4T3BlcmF0aW9uOlxuXHRcdFx0XHRlbnZNYXBCbGVuZGluZ0RlZmluZSA9ICdFTlZNQVBfQkxFTkRJTkdfTUlYJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgQWRkT3BlcmF0aW9uOlxuXHRcdFx0XHRlbnZNYXBCbGVuZGluZ0RlZmluZSA9ICdFTlZNQVBfQkxFTkRJTkdfQUREJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0fVxuXG5cdHZhciBnYW1tYUZhY3RvckRlZmluZSA9ICggcmVuZGVyZXIuZ2FtbWFGYWN0b3IgPiAwICkgPyByZW5kZXJlci5nYW1tYUZhY3RvciA6IDEuMDtcblxuXHQvLyBjb25zb2xlLmxvZyggJ2J1aWxkaW5nIG5ldyBwcm9ncmFtICcgKTtcblxuXHQvL1xuXG5cdHZhciBjdXN0b21FeHRlbnNpb25zID0gZ2VuZXJhdGVFeHRlbnNpb25zKCBleHRlbnNpb25zLCBwYXJhbWV0ZXJzLCByZW5kZXJlci5leHRlbnNpb25zICk7XG5cblx0dmFyIGN1c3RvbURlZmluZXMgPSBnZW5lcmF0ZURlZmluZXMoIGRlZmluZXMgKTtcblxuXHQvL1xuXG5cdHZhciBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpO1xuXG5cdHZhciBwcmVmaXhWZXJ0ZXgsIHByZWZpeEZyYWdtZW50O1xuXG5cdGlmICggbWF0ZXJpYWwuaXNSYXdTaGFkZXJNYXRlcmlhbCApIHtcblxuXHRcdHByZWZpeFZlcnRleCA9IFtcblxuXHRcdFx0Y3VzdG9tRGVmaW5lcyxcblxuXHRcdFx0J1xcbidcblxuXHRcdF0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xuXG5cdFx0cHJlZml4RnJhZ21lbnQgPSBbXG5cblx0XHRcdGN1c3RvbUV4dGVuc2lvbnMsXG5cdFx0XHRjdXN0b21EZWZpbmVzLFxuXG5cdFx0XHQnXFxuJ1xuXG5cdFx0XS5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcXG4nICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdHByZWZpeFZlcnRleCA9IFtcblxuXHRcdFx0J3ByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGZsb2F0OycsXG5cdFx0XHQncHJlY2lzaW9uICcgKyBwYXJhbWV0ZXJzLnByZWNpc2lvbiArICcgaW50OycsXG5cblx0XHRcdCcjZGVmaW5lIFNIQURFUl9OQU1FICcgKyBtYXRlcmlhbC5fX3dlYmdsU2hhZGVyLm5hbWUsXG5cblx0XHRcdGN1c3RvbURlZmluZXMsXG5cblx0XHRcdHBhcmFtZXRlcnMuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyA/ICcjZGVmaW5lIFZFUlRFWF9URVhUVVJFUycgOiAnJyxcblxuXHRcdFx0JyNkZWZpbmUgR0FNTUFfRkFDVE9SICcgKyBnYW1tYUZhY3RvckRlZmluZSxcblxuXHRcdFx0JyNkZWZpbmUgTUFYX0JPTkVTICcgKyBwYXJhbWV0ZXJzLm1heEJvbmVzLFxuXHRcdFx0KCBwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZyApID8gJyNkZWZpbmUgVVNFX0ZPRycgOiAnJyxcblx0XHRcdCggcGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2dFeHAgKSA/ICcjZGVmaW5lIEZPR19FWFAyJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLm1hcCA/ICcjZGVmaW5lIFVTRV9NQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lIFVTRV9FTlZNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBNb2RlRGVmaW5lIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmxpZ2h0TWFwID8gJyNkZWZpbmUgVVNFX0xJR0hUTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5hb01hcCA/ICcjZGVmaW5lIFVTRV9BT01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW1pc3NpdmVNYXAgPyAnI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmJ1bXBNYXAgPyAnI2RlZmluZSBVU0VfQlVNUE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubm9ybWFsTWFwID8gJyNkZWZpbmUgVVNFX05PUk1BTE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZGlzcGxhY2VtZW50TWFwICYmIHBhcmFtZXRlcnMuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyA/ICcjZGVmaW5lIFVTRV9ESVNQTEFDRU1FTlRNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnNwZWN1bGFyTWFwID8gJyNkZWZpbmUgVVNFX1NQRUNVTEFSTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5yb3VnaG5lc3NNYXAgPyAnI2RlZmluZSBVU0VfUk9VR0hORVNTTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5tZXRhbG5lc3NNYXAgPyAnI2RlZmluZSBVU0VfTUVUQUxORVNTTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5hbHBoYU1hcCA/ICcjZGVmaW5lIFVTRV9BTFBIQU1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMudmVydGV4Q29sb3JzID8gJyNkZWZpbmUgVVNFX0NPTE9SJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmZsYXRTaGFkaW5nID8gJyNkZWZpbmUgRkxBVF9TSEFERUQnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuc2tpbm5pbmcgPyAnI2RlZmluZSBVU0VfU0tJTk5JTkcnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnVzZVZlcnRleFRleHR1cmUgPyAnI2RlZmluZSBCT05FX1RFWFRVUkUnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMubW9ycGhUYXJnZXRzID8gJyNkZWZpbmUgVVNFX01PUlBIVEFSR0VUUycgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubW9ycGhOb3JtYWxzICYmIHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPT09IGZhbHNlID8gJyNkZWZpbmUgVVNFX01PUlBITk9STUFMUycgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZG91YmxlU2lkZWQgPyAnI2RlZmluZSBET1VCTEVfU0lERUQnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmZsaXBTaWRlZCA/ICcjZGVmaW5lIEZMSVBfU0lERUQnIDogJycsXG5cblx0XHRcdCcjZGVmaW5lIE5VTV9DTElQUElOR19QTEFORVMgJyArIHBhcmFtZXRlcnMubnVtQ2xpcHBpbmdQbGFuZXMsXG5cblx0XHRcdHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lIFVTRV9TSEFET1dNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnNoYWRvd01hcEVuYWJsZWQgPyAnI2RlZmluZSAnICsgc2hhZG93TWFwVHlwZURlZmluZSA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnNpemVBdHRlbnVhdGlvbiA/ICcjZGVmaW5lIFVTRV9TSVpFQVRURU5VQVRJT04nIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA/ICcjZGVmaW5lIFVTRV9MT0dERVBUSEJVRicgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciAmJiByZW5kZXJlci5leHRlbnNpb25zLmdldCggJ0VYVF9mcmFnX2RlcHRoJyApID8gJyNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGX0VYVCcgOiAnJyxcblxuXHRcdFx0J3VuaWZvcm0gbWF0NCBtb2RlbE1hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gbWF0NCB2aWV3TWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSBtYXQzIG5vcm1hbE1hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsnLFxuXG5cdFx0XHQnYXR0cmlidXRlIHZlYzMgcG9zaXRpb247Jyxcblx0XHRcdCdhdHRyaWJ1dGUgdmVjMyBub3JtYWw7Jyxcblx0XHRcdCdhdHRyaWJ1dGUgdmVjMiB1djsnLFxuXG5cdFx0XHQnI2lmZGVmIFVTRV9DT0xPUicsXG5cblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWMzIGNvbG9yOycsXG5cblx0XHRcdCcjZW5kaWYnLFxuXG5cdFx0XHQnI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFMnLFxuXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDA7Jyxcblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MTsnLFxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQyOycsXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDM7JyxcblxuXHRcdFx0J1x0I2lmZGVmIFVTRV9NT1JQSE5PUk1BTFMnLFxuXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMDsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDE7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwyOycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMzsnLFxuXG5cdFx0XHQnXHQjZWxzZScsXG5cblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ0OycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NTsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDY7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ3OycsXG5cblx0XHRcdCdcdCNlbmRpZicsXG5cblx0XHRcdCcjZW5kaWYnLFxuXG5cdFx0XHQnI2lmZGVmIFVTRV9TS0lOTklORycsXG5cblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWM0IHNraW5JbmRleDsnLFxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzQgc2tpbldlaWdodDsnLFxuXG5cdFx0XHQnI2VuZGlmJyxcblxuXHRcdFx0J1xcbidcblxuXHRcdF0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xuXG5cdFx0cHJlZml4RnJhZ21lbnQgPSBbXG5cblx0XHRcdGN1c3RvbUV4dGVuc2lvbnMsXG5cblx0XHRcdCdwcmVjaXNpb24gJyArIHBhcmFtZXRlcnMucHJlY2lzaW9uICsgJyBmbG9hdDsnLFxuXHRcdFx0J3ByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGludDsnLFxuXG5cdFx0XHQnI2RlZmluZSBTSEFERVJfTkFNRSAnICsgbWF0ZXJpYWwuX193ZWJnbFNoYWRlci5uYW1lLFxuXG5cdFx0XHRjdXN0b21EZWZpbmVzLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmFscGhhVGVzdCA/ICcjZGVmaW5lIEFMUEhBVEVTVCAnICsgcGFyYW1ldGVycy5hbHBoYVRlc3QgOiAnJyxcblxuXHRcdFx0JyNkZWZpbmUgR0FNTUFfRkFDVE9SICcgKyBnYW1tYUZhY3RvckRlZmluZSxcblxuXHRcdFx0KCBwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZyApID8gJyNkZWZpbmUgVVNFX0ZPRycgOiAnJyxcblx0XHRcdCggcGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2dFeHAgKSA/ICcjZGVmaW5lIEZPR19FWFAyJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLm1hcCA/ICcjZGVmaW5lIFVTRV9NQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lIFVTRV9FTlZNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBUeXBlRGVmaW5lIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBNb2RlRGVmaW5lIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBCbGVuZGluZ0RlZmluZSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5saWdodE1hcCA/ICcjZGVmaW5lIFVTRV9MSUdIVE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYW9NYXAgPyAnI2RlZmluZSBVU0VfQU9NQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwID8gJyNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5idW1wTWFwID8gJyNkZWZpbmUgVVNFX0JVTVBNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm5vcm1hbE1hcCA/ICcjZGVmaW5lIFVTRV9OT1JNQUxNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnNwZWN1bGFyTWFwID8gJyNkZWZpbmUgVVNFX1NQRUNVTEFSTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5yb3VnaG5lc3NNYXAgPyAnI2RlZmluZSBVU0VfUk9VR0hORVNTTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5tZXRhbG5lc3NNYXAgPyAnI2RlZmluZSBVU0VfTUVUQUxORVNTTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5hbHBoYU1hcCA/ICcjZGVmaW5lIFVTRV9BTFBIQU1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMudmVydGV4Q29sb3JzID8gJyNkZWZpbmUgVVNFX0NPTE9SJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmdyYWRpZW50TWFwID8gJyNkZWZpbmUgVVNFX0dSQURJRU5UTUFQJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmZsYXRTaGFkaW5nID8gJyNkZWZpbmUgRkxBVF9TSEFERUQnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZG91YmxlU2lkZWQgPyAnI2RlZmluZSBET1VCTEVfU0lERUQnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmZsaXBTaWRlZCA/ICcjZGVmaW5lIEZMSVBfU0lERUQnIDogJycsXG5cblx0XHRcdCcjZGVmaW5lIE5VTV9DTElQUElOR19QTEFORVMgJyArIHBhcmFtZXRlcnMubnVtQ2xpcHBpbmdQbGFuZXMsXG5cdFx0XHQnI2RlZmluZSBVTklPTl9DTElQUElOR19QTEFORVMgJyArIChwYXJhbWV0ZXJzLm51bUNsaXBwaW5nUGxhbmVzIC0gcGFyYW1ldGVycy5udW1DbGlwSW50ZXJzZWN0aW9uKSxcblxuXHRcdFx0cGFyYW1ldGVycy5zaGFkb3dNYXBFbmFibGVkID8gJyNkZWZpbmUgVVNFX1NIQURPV01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lICcgKyBzaGFkb3dNYXBUeXBlRGVmaW5lIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMucHJlbXVsdGlwbGllZEFscGhhID8gXCIjZGVmaW5lIFBSRU1VTFRJUExJRURfQUxQSEFcIiA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzID8gXCIjZGVmaW5lIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcIiA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPyAnI2RlZmluZSBVU0VfTE9HREVQVEhCVUYnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgJiYgcmVuZGVyZXIuZXh0ZW5zaW9ucy5nZXQoICdFWFRfZnJhZ19kZXB0aCcgKSA/ICcjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwICYmIHJlbmRlcmVyLmV4dGVuc2lvbnMuZ2V0KCAnRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCcgKSA/ICcjZGVmaW5lIFRFWFRVUkVfTE9EX0VYVCcgOiAnJyxcblxuXHRcdFx0J3VuaWZvcm0gbWF0NCB2aWV3TWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOycsXG5cblx0XHRcdCggcGFyYW1ldGVycy50b25lTWFwcGluZyAhPT0gTm9Ub25lTWFwcGluZyApID8gXCIjZGVmaW5lIFRPTkVfTUFQUElOR1wiIDogJycsXG5cdFx0XHQoIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgIT09IE5vVG9uZU1hcHBpbmcgKSA/IFNoYWRlckNodW5rWyAndG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudCcgXSA6ICcnLCAgLy8gdGhpcyBjb2RlIGlzIHJlcXVpcmVkIGhlcmUgYmVjYXVzZSBpdCBpcyB1c2VkIGJ5IHRoZSB0b25lTWFwcGluZygpIGZ1bmN0aW9uIGRlZmluZWQgYmVsb3dcblx0XHRcdCggcGFyYW1ldGVycy50b25lTWFwcGluZyAhPT0gTm9Ub25lTWFwcGluZyApID8gZ2V0VG9uZU1hcHBpbmdGdW5jdGlvbiggXCJ0b25lTWFwcGluZ1wiLCBwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nICkgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5kaXRoZXJpbmcgPyAnI2RlZmluZSBESVRIRVJJTkcnIDogJycsXG5cblx0XHRcdCggcGFyYW1ldGVycy5vdXRwdXRFbmNvZGluZyB8fCBwYXJhbWV0ZXJzLm1hcEVuY29kaW5nIHx8IHBhcmFtZXRlcnMuZW52TWFwRW5jb2RpbmcgfHwgcGFyYW1ldGVycy5lbWlzc2l2ZU1hcEVuY29kaW5nICkgPyBTaGFkZXJDaHVua1sgJ2VuY29kaW5nc19wYXJzX2ZyYWdtZW50JyBdIDogJycsIC8vIHRoaXMgY29kZSBpcyByZXF1aXJlZCBoZXJlIGJlY2F1c2UgaXQgaXMgdXNlZCBieSB0aGUgdmFyaW91cyBlbmNvZGluZy9kZWNvZGluZyBmdW5jdGlvbiBkZWZpbmVkIGJlbG93XG5cdFx0XHRwYXJhbWV0ZXJzLm1hcEVuY29kaW5nID8gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCAnbWFwVGV4ZWxUb0xpbmVhcicsIHBhcmFtZXRlcnMubWFwRW5jb2RpbmcgKSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXBFbmNvZGluZyA/IGdldFRleGVsRGVjb2RpbmdGdW5jdGlvbiggJ2Vudk1hcFRleGVsVG9MaW5lYXInLCBwYXJhbWV0ZXJzLmVudk1hcEVuY29kaW5nICkgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW1pc3NpdmVNYXBFbmNvZGluZyA/IGdldFRleGVsRGVjb2RpbmdGdW5jdGlvbiggJ2VtaXNzaXZlTWFwVGV4ZWxUb0xpbmVhcicsIHBhcmFtZXRlcnMuZW1pc3NpdmVNYXBFbmNvZGluZyApIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm91dHB1dEVuY29kaW5nID8gZ2V0VGV4ZWxFbmNvZGluZ0Z1bmN0aW9uKCBcImxpbmVhclRvT3V0cHV0VGV4ZWxcIiwgcGFyYW1ldGVycy5vdXRwdXRFbmNvZGluZyApIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZGVwdGhQYWNraW5nID8gXCIjZGVmaW5lIERFUFRIX1BBQ0tJTkcgXCIgKyBtYXRlcmlhbC5kZXB0aFBhY2tpbmcgOiAnJyxcblxuXHRcdFx0J1xcbidcblxuXHRcdF0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xuXG5cdH1cblxuXHR2ZXJ0ZXhTaGFkZXIgPSBwYXJzZUluY2x1ZGVzKCB2ZXJ0ZXhTaGFkZXIsIHBhcmFtZXRlcnMgKTtcblx0dmVydGV4U2hhZGVyID0gcmVwbGFjZUxpZ2h0TnVtcyggdmVydGV4U2hhZGVyLCBwYXJhbWV0ZXJzICk7XG5cblx0ZnJhZ21lbnRTaGFkZXIgPSBwYXJzZUluY2x1ZGVzKCBmcmFnbWVudFNoYWRlciwgcGFyYW1ldGVycyApO1xuXHRmcmFnbWVudFNoYWRlciA9IHJlcGxhY2VMaWdodE51bXMoIGZyYWdtZW50U2hhZGVyLCBwYXJhbWV0ZXJzICk7XG5cblx0aWYgKCAhIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgKSB7XG5cblx0XHR2ZXJ0ZXhTaGFkZXIgPSB1bnJvbGxMb29wcyggdmVydGV4U2hhZGVyICk7XG5cdFx0ZnJhZ21lbnRTaGFkZXIgPSB1bnJvbGxMb29wcyggZnJhZ21lbnRTaGFkZXIgKTtcblxuXHR9XG5cblx0dmFyIHZlcnRleEdsc2wgPSBwcmVmaXhWZXJ0ZXggKyB2ZXJ0ZXhTaGFkZXI7XG5cdHZhciBmcmFnbWVudEdsc2wgPSBwcmVmaXhGcmFnbWVudCArIGZyYWdtZW50U2hhZGVyO1xuXG5cdC8vIGNvbnNvbGUubG9nKCAnKlZFUlRFWConLCB2ZXJ0ZXhHbHNsICk7XG5cdC8vIGNvbnNvbGUubG9nKCAnKkZSQUdNRU5UKicsIGZyYWdtZW50R2xzbCApO1xuXG5cdHZhciBnbFZlcnRleFNoYWRlciA9IFdlYkdMU2hhZGVyKCBnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdmVydGV4R2xzbCApO1xuXHR2YXIgZ2xGcmFnbWVudFNoYWRlciA9IFdlYkdMU2hhZGVyKCBnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCBmcmFnbWVudEdsc2wgKTtcblxuXHRnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIGdsVmVydGV4U2hhZGVyICk7XG5cdGdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbSwgZ2xGcmFnbWVudFNoYWRlciApO1xuXG5cdC8vIEZvcmNlIGEgcGFydGljdWxhciBhdHRyaWJ1dGUgdG8gaW5kZXggMC5cblxuXHRpZiAoIG1hdGVyaWFsLmluZGV4MEF0dHJpYnV0ZU5hbWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGdsLmJpbmRBdHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgMCwgbWF0ZXJpYWwuaW5kZXgwQXR0cmlidXRlTmFtZSApO1xuXG5cdH0gZWxzZSBpZiAoIHBhcmFtZXRlcnMubW9ycGhUYXJnZXRzID09PSB0cnVlICkge1xuXG5cdFx0Ly8gcHJvZ3JhbXMgd2l0aCBtb3JwaFRhcmdldHMgZGlzcGxhY2UgcG9zaXRpb24gb3V0IG9mIGF0dHJpYnV0ZSAwXG5cdFx0Z2wuYmluZEF0dHJpYkxvY2F0aW9uKCBwcm9ncmFtLCAwLCAncG9zaXRpb24nICk7XG5cblx0fVxuXG5cdGdsLmxpbmtQcm9ncmFtKCBwcm9ncmFtICk7XG5cblx0dmFyIHByb2dyYW1Mb2cgPSBnbC5nZXRQcm9ncmFtSW5mb0xvZyggcHJvZ3JhbSApO1xuXHR2YXIgdmVydGV4TG9nID0gZ2wuZ2V0U2hhZGVySW5mb0xvZyggZ2xWZXJ0ZXhTaGFkZXIgKTtcblx0dmFyIGZyYWdtZW50TG9nID0gZ2wuZ2V0U2hhZGVySW5mb0xvZyggZ2xGcmFnbWVudFNoYWRlciApO1xuXG5cdHZhciBydW5uYWJsZSA9IHRydWU7XG5cdHZhciBoYXZlRGlhZ25vc3RpY3MgPSB0cnVlO1xuXG5cdC8vIGNvbnNvbGUubG9nKCAnKipWRVJURVgqKicsIGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2RlYnVnX3NoYWRlcnMnICkuZ2V0VHJhbnNsYXRlZFNoYWRlclNvdXJjZSggZ2xWZXJ0ZXhTaGFkZXIgKSApO1xuXHQvLyBjb25zb2xlLmxvZyggJyoqRlJBR01FTlQqKicsIGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2RlYnVnX3NoYWRlcnMnICkuZ2V0VHJhbnNsYXRlZFNoYWRlclNvdXJjZSggZ2xGcmFnbWVudFNoYWRlciApICk7XG5cblx0aWYgKCBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUyApID09PSBmYWxzZSApIHtcblxuXHRcdHJ1bm5hYmxlID0gZmFsc2U7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBzaGFkZXIgZXJyb3I6ICcsIGdsLmdldEVycm9yKCksICdnbC5WQUxJREFURV9TVEFUVVMnLCBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCBnbC5WQUxJREFURV9TVEFUVVMgKSwgJ2dsLmdldFByb2dyYW1JbmZvTG9nJywgcHJvZ3JhbUxvZywgdmVydGV4TG9nLCBmcmFnbWVudExvZyApO1xuXG5cdH0gZWxzZSBpZiAoIHByb2dyYW1Mb2cgIT09ICcnICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBnbC5nZXRQcm9ncmFtSW5mb0xvZygpJywgcHJvZ3JhbUxvZyApO1xuXG5cdH0gZWxzZSBpZiAoIHZlcnRleExvZyA9PT0gJycgfHwgZnJhZ21lbnRMb2cgPT09ICcnICkge1xuXG5cdFx0aGF2ZURpYWdub3N0aWNzID0gZmFsc2U7XG5cblx0fVxuXG5cdGlmICggaGF2ZURpYWdub3N0aWNzICkge1xuXG5cdFx0dGhpcy5kaWFnbm9zdGljcyA9IHtcblxuXHRcdFx0cnVubmFibGU6IHJ1bm5hYmxlLFxuXHRcdFx0bWF0ZXJpYWw6IG1hdGVyaWFsLFxuXG5cdFx0XHRwcm9ncmFtTG9nOiBwcm9ncmFtTG9nLFxuXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHtcblxuXHRcdFx0XHRsb2c6IHZlcnRleExvZyxcblx0XHRcdFx0cHJlZml4OiBwcmVmaXhWZXJ0ZXhcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IHtcblxuXHRcdFx0XHRsb2c6IGZyYWdtZW50TG9nLFxuXHRcdFx0XHRwcmVmaXg6IHByZWZpeEZyYWdtZW50XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fVxuXG5cdC8vIGNsZWFuIHVwXG5cblx0Z2wuZGVsZXRlU2hhZGVyKCBnbFZlcnRleFNoYWRlciApO1xuXHRnbC5kZWxldGVTaGFkZXIoIGdsRnJhZ21lbnRTaGFkZXIgKTtcblxuXHQvLyBzZXQgdXAgY2FjaGluZyBmb3IgdW5pZm9ybSBsb2NhdGlvbnNcblxuXHR2YXIgY2FjaGVkVW5pZm9ybXM7XG5cblx0dGhpcy5nZXRVbmlmb3JtcyA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0aWYgKCBjYWNoZWRVbmlmb3JtcyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjYWNoZWRVbmlmb3JtcyA9XG5cdFx0XHRcdG5ldyBXZWJHTFVuaWZvcm1zKCBnbCwgcHJvZ3JhbSwgcmVuZGVyZXIgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBjYWNoZWRVbmlmb3JtcztcblxuXHR9O1xuXG5cdC8vIHNldCB1cCBjYWNoaW5nIGZvciBhdHRyaWJ1dGUgbG9jYXRpb25zXG5cblx0dmFyIGNhY2hlZEF0dHJpYnV0ZXM7XG5cblx0dGhpcy5nZXRBdHRyaWJ1dGVzID0gZnVuY3Rpb24oKSB7XG5cblx0XHRpZiAoIGNhY2hlZEF0dHJpYnV0ZXMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y2FjaGVkQXR0cmlidXRlcyA9IGZldGNoQXR0cmlidXRlTG9jYXRpb25zKCBnbCwgcHJvZ3JhbSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNhY2hlZEF0dHJpYnV0ZXM7XG5cblx0fTtcblxuXHQvLyBmcmVlIHJlc291cmNlXG5cblx0dGhpcy5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG5cblx0XHRnbC5kZWxldGVQcm9ncmFtKCBwcm9ncmFtICk7XG5cdFx0dGhpcy5wcm9ncmFtID0gdW5kZWZpbmVkO1xuXG5cdH07XG5cblx0Ly8gREVQUkVDQVRFRFxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7XG5cblx0XHR1bmlmb3Jtczoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFByb2dyYW06IC51bmlmb3JtcyBpcyBub3cgLmdldFVuaWZvcm1zKCkuJyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRVbmlmb3JtcygpO1xuXG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGF0dHJpYnV0ZXM6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiAuYXR0cmlidXRlcyBpcyBub3cgLmdldEF0dHJpYnV0ZXMoKS4nICk7XG5cdFx0XHRcdHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKTtcblxuXHRcdFx0fVxuXHRcdH1cblxuXHR9ICk7XG5cblxuXHQvL1xuXG5cdHRoaXMuaWQgPSBwcm9ncmFtSWRDb3VudCArKztcblx0dGhpcy5jb2RlID0gY29kZTtcblx0dGhpcy51c2VkVGltZXMgPSAxO1xuXHR0aGlzLnByb2dyYW0gPSBwcm9ncmFtO1xuXHR0aGlzLnZlcnRleFNoYWRlciA9IGdsVmVydGV4U2hhZGVyO1xuXHR0aGlzLmZyYWdtZW50U2hhZGVyID0gZ2xGcmFnbWVudFNoYWRlcjtcblxuXHRyZXR1cm4gdGhpcztcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xQcm9ncmFtcyggcmVuZGVyZXIsIGNhcGFiaWxpdGllcyApIHtcblxuXHR2YXIgcHJvZ3JhbXMgPSBbXTtcblxuXHR2YXIgc2hhZGVySURzID0ge1xuXHRcdE1lc2hEZXB0aE1hdGVyaWFsOiAnZGVwdGgnLFxuXHRcdE1lc2hOb3JtYWxNYXRlcmlhbDogJ25vcm1hbCcsXG5cdFx0TWVzaEJhc2ljTWF0ZXJpYWw6ICdiYXNpYycsXG5cdFx0TWVzaExhbWJlcnRNYXRlcmlhbDogJ2xhbWJlcnQnLFxuXHRcdE1lc2hQaG9uZ01hdGVyaWFsOiAncGhvbmcnLFxuXHRcdE1lc2hUb29uTWF0ZXJpYWw6ICdwaG9uZycsXG5cdFx0TWVzaFN0YW5kYXJkTWF0ZXJpYWw6ICdwaHlzaWNhbCcsXG5cdFx0TWVzaFBoeXNpY2FsTWF0ZXJpYWw6ICdwaHlzaWNhbCcsXG5cdFx0TGluZUJhc2ljTWF0ZXJpYWw6ICdiYXNpYycsXG5cdFx0TGluZURhc2hlZE1hdGVyaWFsOiAnZGFzaGVkJyxcblx0XHRQb2ludHNNYXRlcmlhbDogJ3BvaW50cydcblx0fTtcblxuXHR2YXIgcGFyYW1ldGVyTmFtZXMgPSBbXG5cdFx0XCJwcmVjaXNpb25cIiwgXCJzdXBwb3J0c1ZlcnRleFRleHR1cmVzXCIsIFwibWFwXCIsIFwibWFwRW5jb2RpbmdcIiwgXCJlbnZNYXBcIiwgXCJlbnZNYXBNb2RlXCIsIFwiZW52TWFwRW5jb2RpbmdcIixcblx0XHRcImxpZ2h0TWFwXCIsIFwiYW9NYXBcIiwgXCJlbWlzc2l2ZU1hcFwiLCBcImVtaXNzaXZlTWFwRW5jb2RpbmdcIiwgXCJidW1wTWFwXCIsIFwibm9ybWFsTWFwXCIsIFwiZGlzcGxhY2VtZW50TWFwXCIsIFwic3BlY3VsYXJNYXBcIixcblx0XHRcInJvdWdobmVzc01hcFwiLCBcIm1ldGFsbmVzc01hcFwiLCBcImdyYWRpZW50TWFwXCIsXG5cdFx0XCJhbHBoYU1hcFwiLCBcImNvbWJpbmVcIiwgXCJ2ZXJ0ZXhDb2xvcnNcIiwgXCJmb2dcIiwgXCJ1c2VGb2dcIiwgXCJmb2dFeHBcIixcblx0XHRcImZsYXRTaGFkaW5nXCIsIFwic2l6ZUF0dGVudWF0aW9uXCIsIFwibG9nYXJpdGhtaWNEZXB0aEJ1ZmZlclwiLCBcInNraW5uaW5nXCIsXG5cdFx0XCJtYXhCb25lc1wiLCBcInVzZVZlcnRleFRleHR1cmVcIiwgXCJtb3JwaFRhcmdldHNcIiwgXCJtb3JwaE5vcm1hbHNcIixcblx0XHRcIm1heE1vcnBoVGFyZ2V0c1wiLCBcIm1heE1vcnBoTm9ybWFsc1wiLCBcInByZW11bHRpcGxpZWRBbHBoYVwiLFxuXHRcdFwibnVtRGlyTGlnaHRzXCIsIFwibnVtUG9pbnRMaWdodHNcIiwgXCJudW1TcG90TGlnaHRzXCIsIFwibnVtSGVtaUxpZ2h0c1wiLCBcIm51bVJlY3RBcmVhTGlnaHRzXCIsXG5cdFx0XCJzaGFkb3dNYXBFbmFibGVkXCIsIFwic2hhZG93TWFwVHlwZVwiLCBcInRvbmVNYXBwaW5nXCIsICdwaHlzaWNhbGx5Q29ycmVjdExpZ2h0cycsXG5cdFx0XCJhbHBoYVRlc3RcIiwgXCJkb3VibGVTaWRlZFwiLCBcImZsaXBTaWRlZFwiLCBcIm51bUNsaXBwaW5nUGxhbmVzXCIsIFwibnVtQ2xpcEludGVyc2VjdGlvblwiLCBcImRlcHRoUGFja2luZ1wiLCBcImRpdGhlcmluZ1wiXG5cdF07XG5cblxuXHRmdW5jdGlvbiBhbGxvY2F0ZUJvbmVzKCBvYmplY3QgKSB7XG5cblx0XHR2YXIgc2tlbGV0b24gPSBvYmplY3Quc2tlbGV0b247XG5cdFx0dmFyIGJvbmVzID0gc2tlbGV0b24uYm9uZXM7XG5cblx0XHRpZiAoIGNhcGFiaWxpdGllcy5mbG9hdFZlcnRleFRleHR1cmVzICkge1xuXG5cdFx0XHRyZXR1cm4gMTAyNDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGRlZmF1bHQgZm9yIHdoZW4gb2JqZWN0IGlzIG5vdCBzcGVjaWZpZWRcblx0XHRcdC8vICggZm9yIGV4YW1wbGUgd2hlbiBwcmVidWlsZGluZyBzaGFkZXIgdG8gYmUgdXNlZCB3aXRoIG11bHRpcGxlIG9iamVjdHMgKVxuXHRcdFx0Ly9cblx0XHRcdC8vICAtIGxlYXZlIHNvbWUgZXh0cmEgc3BhY2UgZm9yIG90aGVyIHVuaWZvcm1zXG5cdFx0XHQvLyAgLSBsaW1pdCBoZXJlIGlzIEFOR0xFJ3MgMjU0IG1heCB1bmlmb3JtIHZlY3RvcnNcblx0XHRcdC8vICAgICh1cCB0byA1NCBzaG91bGQgYmUgc2FmZSlcblxuXHRcdFx0dmFyIG5WZXJ0ZXhVbmlmb3JtcyA9IGNhcGFiaWxpdGllcy5tYXhWZXJ0ZXhVbmlmb3Jtcztcblx0XHRcdHZhciBuVmVydGV4TWF0cmljZXMgPSBNYXRoLmZsb29yKCAoIG5WZXJ0ZXhVbmlmb3JtcyAtIDIwICkgLyA0ICk7XG5cblx0XHRcdHZhciBtYXhCb25lcyA9IE1hdGgubWluKCBuVmVydGV4TWF0cmljZXMsIGJvbmVzLmxlbmd0aCApO1xuXG5cdFx0XHRpZiAoIG1heEJvbmVzIDwgYm9uZXMubGVuZ3RoICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFNrZWxldG9uIGhhcyAnICsgYm9uZXMubGVuZ3RoICsgJyBib25lcy4gVGhpcyBHUFUgc3VwcG9ydHMgJyArIG1heEJvbmVzICsgJy4nICk7XG5cdFx0XHRcdHJldHVybiAwO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXhCb25lcztcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWFwLCBnYW1tYU92ZXJyaWRlTGluZWFyICkge1xuXG5cdFx0dmFyIGVuY29kaW5nO1xuXG5cdFx0aWYgKCAhIG1hcCApIHtcblxuXHRcdFx0ZW5jb2RpbmcgPSBMaW5lYXJFbmNvZGluZztcblxuXHRcdH0gZWxzZSBpZiAoIG1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGVuY29kaW5nID0gbWFwLmVuY29kaW5nO1xuXG5cdFx0fSBlbHNlIGlmICggbWFwLmlzV2ViR0xSZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5XZWJHTFByb2dyYW1zLmdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXA6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuXCIgKTtcblx0XHRcdGVuY29kaW5nID0gbWFwLnRleHR1cmUuZW5jb2Rpbmc7XG5cblx0XHR9XG5cblx0XHQvLyBhZGQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIFdlYkdMUmVuZGVyZXIuZ2FtbWFJbnB1dC9nYW1tYU91dHB1dCBwYXJhbWV0ZXIsIHNob3VsZCBwcm9iYWJseSBiZSByZW1vdmVkIGF0IHNvbWUgcG9pbnQuXG5cdFx0aWYgKCBlbmNvZGluZyA9PT0gTGluZWFyRW5jb2RpbmcgJiYgZ2FtbWFPdmVycmlkZUxpbmVhciApIHtcblxuXHRcdFx0ZW5jb2RpbmcgPSBHYW1tYUVuY29kaW5nO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVuY29kaW5nO1xuXG5cdH1cblxuXHR0aGlzLmdldFBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoIG1hdGVyaWFsLCBsaWdodHMsIGZvZywgbkNsaXBQbGFuZXMsIG5DbGlwSW50ZXJzZWN0aW9uLCBvYmplY3QgKSB7XG5cblx0XHR2YXIgc2hhZGVySUQgPSBzaGFkZXJJRHNbIG1hdGVyaWFsLnR5cGUgXTtcblxuXHRcdC8vIGhldXJpc3RpY3MgdG8gY3JlYXRlIHNoYWRlciBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBsaWdodHMgaW4gdGhlIHNjZW5lXG5cdFx0Ly8gKG5vdCB0byBibG93IG92ZXIgbWF4TGlnaHRzIGJ1ZGdldClcblxuXHRcdHZhciBtYXhCb25lcyA9IG9iamVjdC5pc1NraW5uZWRNZXNoID8gYWxsb2NhdGVCb25lcyggb2JqZWN0ICkgOiAwO1xuXHRcdHZhciBwcmVjaXNpb24gPSByZW5kZXJlci5nZXRQcmVjaXNpb24oKTtcblxuXHRcdGlmICggbWF0ZXJpYWwucHJlY2lzaW9uICE9PSBudWxsICkge1xuXG5cdFx0XHRwcmVjaXNpb24gPSBjYXBhYmlsaXRpZXMuZ2V0TWF4UHJlY2lzaW9uKCBtYXRlcmlhbC5wcmVjaXNpb24gKTtcblxuXHRcdFx0aWYgKCBwcmVjaXNpb24gIT09IG1hdGVyaWFsLnByZWNpc2lvbiApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFByb2dyYW0uZ2V0UGFyYW1ldGVyczonLCBtYXRlcmlhbC5wcmVjaXNpb24sICdub3Qgc3VwcG9ydGVkLCB1c2luZycsIHByZWNpc2lvbiwgJ2luc3RlYWQuJyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgY3VycmVudFJlbmRlclRhcmdldCA9IHJlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpO1xuXG5cdFx0dmFyIHBhcmFtZXRlcnMgPSB7XG5cblx0XHRcdHNoYWRlcklEOiBzaGFkZXJJRCxcblxuXHRcdFx0cHJlY2lzaW9uOiBwcmVjaXNpb24sXG5cdFx0XHRzdXBwb3J0c1ZlcnRleFRleHR1cmVzOiBjYXBhYmlsaXRpZXMudmVydGV4VGV4dHVyZXMsXG5cdFx0XHRvdXRwdXRFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggKCAhIGN1cnJlbnRSZW5kZXJUYXJnZXQgKSA/IG51bGwgOiBjdXJyZW50UmVuZGVyVGFyZ2V0LnRleHR1cmUsIHJlbmRlcmVyLmdhbW1hT3V0cHV0ICksXG5cdFx0XHRtYXA6ICEhIG1hdGVyaWFsLm1hcCxcblx0XHRcdG1hcEVuY29kaW5nOiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXRlcmlhbC5tYXAsIHJlbmRlcmVyLmdhbW1hSW5wdXQgKSxcblx0XHRcdGVudk1hcDogISEgbWF0ZXJpYWwuZW52TWFwLFxuXHRcdFx0ZW52TWFwTW9kZTogbWF0ZXJpYWwuZW52TWFwICYmIG1hdGVyaWFsLmVudk1hcC5tYXBwaW5nLFxuXHRcdFx0ZW52TWFwRW5jb2Rpbmc6IGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoIG1hdGVyaWFsLmVudk1hcCwgcmVuZGVyZXIuZ2FtbWFJbnB1dCApLFxuXHRcdFx0ZW52TWFwQ3ViZVVWOiAoICEhIG1hdGVyaWFsLmVudk1hcCApICYmICggKCBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyA9PT0gQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcgKSB8fCAoIG1hdGVyaWFsLmVudk1hcC5tYXBwaW5nID09PSBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZyApICksXG5cdFx0XHRsaWdodE1hcDogISEgbWF0ZXJpYWwubGlnaHRNYXAsXG5cdFx0XHRhb01hcDogISEgbWF0ZXJpYWwuYW9NYXAsXG5cdFx0XHRlbWlzc2l2ZU1hcDogISEgbWF0ZXJpYWwuZW1pc3NpdmVNYXAsXG5cdFx0XHRlbWlzc2l2ZU1hcEVuY29kaW5nOiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCwgcmVuZGVyZXIuZ2FtbWFJbnB1dCApLFxuXHRcdFx0YnVtcE1hcDogISEgbWF0ZXJpYWwuYnVtcE1hcCxcblx0XHRcdG5vcm1hbE1hcDogISEgbWF0ZXJpYWwubm9ybWFsTWFwLFxuXHRcdFx0ZGlzcGxhY2VtZW50TWFwOiAhISBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAsXG5cdFx0XHRyb3VnaG5lc3NNYXA6ICEhIG1hdGVyaWFsLnJvdWdobmVzc01hcCxcblx0XHRcdG1ldGFsbmVzc01hcDogISEgbWF0ZXJpYWwubWV0YWxuZXNzTWFwLFxuXHRcdFx0c3BlY3VsYXJNYXA6ICEhIG1hdGVyaWFsLnNwZWN1bGFyTWFwLFxuXHRcdFx0YWxwaGFNYXA6ICEhIG1hdGVyaWFsLmFscGhhTWFwLFxuXG5cdFx0XHRncmFkaWVudE1hcDogISEgbWF0ZXJpYWwuZ3JhZGllbnRNYXAsXG5cblx0XHRcdGNvbWJpbmU6IG1hdGVyaWFsLmNvbWJpbmUsXG5cblx0XHRcdHZlcnRleENvbG9yczogbWF0ZXJpYWwudmVydGV4Q29sb3JzLFxuXG5cdFx0XHRmb2c6ICEhIGZvZyxcblx0XHRcdHVzZUZvZzogbWF0ZXJpYWwuZm9nLFxuXHRcdFx0Zm9nRXhwOiAoIGZvZyAmJiBmb2cuaXNGb2dFeHAyICksXG5cblx0XHRcdGZsYXRTaGFkaW5nOiBtYXRlcmlhbC5zaGFkaW5nID09PSBGbGF0U2hhZGluZyxcblxuXHRcdFx0c2l6ZUF0dGVudWF0aW9uOiBtYXRlcmlhbC5zaXplQXR0ZW51YXRpb24sXG5cdFx0XHRsb2dhcml0aG1pY0RlcHRoQnVmZmVyOiBjYXBhYmlsaXRpZXMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcixcblxuXHRcdFx0c2tpbm5pbmc6IG1hdGVyaWFsLnNraW5uaW5nICYmIG1heEJvbmVzID4gMCxcblx0XHRcdG1heEJvbmVzOiBtYXhCb25lcyxcblx0XHRcdHVzZVZlcnRleFRleHR1cmU6IGNhcGFiaWxpdGllcy5mbG9hdFZlcnRleFRleHR1cmVzLFxuXG5cdFx0XHRtb3JwaFRhcmdldHM6IG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyxcblx0XHRcdG1vcnBoTm9ybWFsczogbWF0ZXJpYWwubW9ycGhOb3JtYWxzLFxuXHRcdFx0bWF4TW9ycGhUYXJnZXRzOiByZW5kZXJlci5tYXhNb3JwaFRhcmdldHMsXG5cdFx0XHRtYXhNb3JwaE5vcm1hbHM6IHJlbmRlcmVyLm1heE1vcnBoTm9ybWFscyxcblxuXHRcdFx0bnVtRGlyTGlnaHRzOiBsaWdodHMuZGlyZWN0aW9uYWwubGVuZ3RoLFxuXHRcdFx0bnVtUG9pbnRMaWdodHM6IGxpZ2h0cy5wb2ludC5sZW5ndGgsXG5cdFx0XHRudW1TcG90TGlnaHRzOiBsaWdodHMuc3BvdC5sZW5ndGgsXG5cdFx0XHRudW1SZWN0QXJlYUxpZ2h0czogbGlnaHRzLnJlY3RBcmVhLmxlbmd0aCxcblx0XHRcdG51bUhlbWlMaWdodHM6IGxpZ2h0cy5oZW1pLmxlbmd0aCxcblxuXHRcdFx0bnVtQ2xpcHBpbmdQbGFuZXM6IG5DbGlwUGxhbmVzLFxuXHRcdFx0bnVtQ2xpcEludGVyc2VjdGlvbjogbkNsaXBJbnRlcnNlY3Rpb24sXG5cblx0XHRcdGRpdGhlcmluZzogbWF0ZXJpYWwuZGl0aGVyaW5nLFxuXG5cdFx0XHRzaGFkb3dNYXBFbmFibGVkOiByZW5kZXJlci5zaGFkb3dNYXAuZW5hYmxlZCAmJiBvYmplY3QucmVjZWl2ZVNoYWRvdyAmJiBsaWdodHMuc2hhZG93cy5sZW5ndGggPiAwLFxuXHRcdFx0c2hhZG93TWFwVHlwZTogcmVuZGVyZXIuc2hhZG93TWFwLnR5cGUsXG5cblx0XHRcdHRvbmVNYXBwaW5nOiByZW5kZXJlci50b25lTWFwcGluZyxcblx0XHRcdHBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzOiByZW5kZXJlci5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyxcblxuXHRcdFx0cHJlbXVsdGlwbGllZEFscGhhOiBtYXRlcmlhbC5wcmVtdWx0aXBsaWVkQWxwaGEsXG5cblx0XHRcdGFscGhhVGVzdDogbWF0ZXJpYWwuYWxwaGFUZXN0LFxuXHRcdFx0ZG91YmxlU2lkZWQ6IG1hdGVyaWFsLnNpZGUgPT09IERvdWJsZVNpZGUsXG5cdFx0XHRmbGlwU2lkZWQ6IG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlLFxuXG5cdFx0XHRkZXB0aFBhY2tpbmc6ICggbWF0ZXJpYWwuZGVwdGhQYWNraW5nICE9PSB1bmRlZmluZWQgKSA/IG1hdGVyaWFsLmRlcHRoUGFja2luZyA6IGZhbHNlXG5cblx0XHR9O1xuXG5cdFx0cmV0dXJuIHBhcmFtZXRlcnM7XG5cblx0fTtcblxuXHR0aGlzLmdldFByb2dyYW1Db2RlID0gZnVuY3Rpb24gKCBtYXRlcmlhbCwgcGFyYW1ldGVycyApIHtcblxuXHRcdHZhciBhcnJheSA9IFtdO1xuXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLnNoYWRlcklEICkge1xuXG5cdFx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLnNoYWRlcklEICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRhcnJheS5wdXNoKCBtYXRlcmlhbC5mcmFnbWVudFNoYWRlciApO1xuXHRcdFx0YXJyYXkucHVzaCggbWF0ZXJpYWwudmVydGV4U2hhZGVyICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmRlZmluZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggdmFyIG5hbWUgaW4gbWF0ZXJpYWwuZGVmaW5lcyApIHtcblxuXHRcdFx0XHRhcnJheS5wdXNoKCBuYW1lICk7XG5cdFx0XHRcdGFycmF5LnB1c2goIG1hdGVyaWFsLmRlZmluZXNbIG5hbWUgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBwYXJhbWV0ZXJOYW1lcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnNbIHBhcmFtZXRlck5hbWVzWyBpIF0gXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFycmF5LmpvaW4oKTtcblxuXHR9O1xuXG5cdHRoaXMuYWNxdWlyZVByb2dyYW0gPSBmdW5jdGlvbiAoIG1hdGVyaWFsLCBwYXJhbWV0ZXJzLCBjb2RlICkge1xuXG5cdFx0dmFyIHByb2dyYW07XG5cblx0XHQvLyBDaGVjayBpZiBjb2RlIGhhcyBiZWVuIGFscmVhZHkgY29tcGlsZWRcblx0XHRmb3IgKCB2YXIgcCA9IDAsIHBsID0gcHJvZ3JhbXMubGVuZ3RoOyBwIDwgcGw7IHAgKysgKSB7XG5cblx0XHRcdHZhciBwcm9ncmFtSW5mbyA9IHByb2dyYW1zWyBwIF07XG5cblx0XHRcdGlmICggcHJvZ3JhbUluZm8uY29kZSA9PT0gY29kZSApIHtcblxuXHRcdFx0XHRwcm9ncmFtID0gcHJvZ3JhbUluZm87XG5cdFx0XHRcdCsrIHByb2dyYW0udXNlZFRpbWVzO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHByb2dyYW0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cHJvZ3JhbSA9IG5ldyBXZWJHTFByb2dyYW0oIHJlbmRlcmVyLCBjb2RlLCBtYXRlcmlhbCwgcGFyYW1ldGVycyApO1xuXHRcdFx0cHJvZ3JhbXMucHVzaCggcHJvZ3JhbSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByb2dyYW07XG5cblx0fTtcblxuXHR0aGlzLnJlbGVhc2VQcm9ncmFtID0gZnVuY3Rpb24gKCBwcm9ncmFtICkge1xuXG5cdFx0aWYgKCAtLSBwcm9ncmFtLnVzZWRUaW1lcyA9PT0gMCApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGZyb20gdW5vcmRlcmVkIHNldFxuXHRcdFx0dmFyIGkgPSBwcm9ncmFtcy5pbmRleE9mKCBwcm9ncmFtICk7XG5cdFx0XHRwcm9ncmFtc1sgaSBdID0gcHJvZ3JhbXNbIHByb2dyYW1zLmxlbmd0aCAtIDEgXTtcblx0XHRcdHByb2dyYW1zLnBvcCgpO1xuXG5cdFx0XHQvLyBGcmVlIFdlYkdMIHJlc291cmNlc1xuXHRcdFx0cHJvZ3JhbS5kZXN0cm95KCk7XG5cblx0XHR9XG5cblx0fTtcblxuXHQvLyBFeHBvc2VkIGZvciByZXNvdXJjZSBtb25pdG9yaW5nICYgZXJyb3IgZmVlZGJhY2sgdmlhIHJlbmRlcmVyLmluZm86XG5cdHRoaXMucHJvZ3JhbXMgPSBwcm9ncmFtcztcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xUZXh0dXJlcyggX2dsLCBleHRlbnNpb25zLCBzdGF0ZSwgcHJvcGVydGllcywgY2FwYWJpbGl0aWVzLCBwYXJhbVRocmVlVG9HTCwgaW5mb01lbW9yeSApIHtcblxuXHR2YXIgX2lzV2ViR0wyID0gKCB0eXBlb2YgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCAhPT0gJ3VuZGVmaW5lZCcgJiYgX2dsIGluc3RhbmNlb2YgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCApO1xuXG5cdC8vXG5cblx0ZnVuY3Rpb24gY2xhbXBUb01heFNpemUoIGltYWdlLCBtYXhTaXplICkge1xuXG5cdFx0aWYgKCBpbWFnZS53aWR0aCA+IG1heFNpemUgfHwgaW1hZ2UuaGVpZ2h0ID4gbWF4U2l6ZSApIHtcblxuXHRcdFx0Ly8gV2FybmluZzogU2NhbGluZyB0aHJvdWdoIHRoZSBjYW52YXMgd2lsbCBvbmx5IHdvcmsgd2l0aCBpbWFnZXMgdGhhdCB1c2Vcblx0XHRcdC8vIHByZW11bHRpcGxpZWQgYWxwaGEuXG5cblx0XHRcdHZhciBzY2FsZSA9IG1heFNpemUgLyBNYXRoLm1heCggaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCApO1xuXG5cdFx0XHR2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICk7XG5cdFx0XHRjYW52YXMud2lkdGggPSBNYXRoLmZsb29yKCBpbWFnZS53aWR0aCAqIHNjYWxlICk7XG5cdFx0XHRjYW52YXMuaGVpZ2h0ID0gTWF0aC5mbG9vciggaW1hZ2UuaGVpZ2h0ICogc2NhbGUgKTtcblxuXHRcdFx0dmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCggJzJkJyApO1xuXHRcdFx0Y29udGV4dC5kcmF3SW1hZ2UoIGltYWdlLCAwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCAwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQgKTtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogaW1hZ2UgaXMgdG9vIGJpZyAoJyArIGltYWdlLndpZHRoICsgJ3gnICsgaW1hZ2UuaGVpZ2h0ICsgJykuIFJlc2l6ZWQgdG8gJyArIGNhbnZhcy53aWR0aCArICd4JyArIGNhbnZhcy5oZWlnaHQsIGltYWdlICk7XG5cblx0XHRcdHJldHVybiBjYW52YXM7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gaW1hZ2U7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGlzUG93ZXJPZlR3byggaW1hZ2UgKSB7XG5cblx0XHRyZXR1cm4gX01hdGguaXNQb3dlck9mVHdvKCBpbWFnZS53aWR0aCApICYmIF9NYXRoLmlzUG93ZXJPZlR3byggaW1hZ2UuaGVpZ2h0ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIG1ha2VQb3dlck9mVHdvKCBpbWFnZSApIHtcblxuXHRcdGlmICggaW1hZ2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50IHx8IGltYWdlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgKSB7XG5cblx0XHRcdHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKTtcblx0XHRcdGNhbnZhcy53aWR0aCA9IF9NYXRoLm5lYXJlc3RQb3dlck9mVHdvKCBpbWFnZS53aWR0aCApO1xuXHRcdFx0Y2FudmFzLmhlaWdodCA9IF9NYXRoLm5lYXJlc3RQb3dlck9mVHdvKCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdFx0dmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCggJzJkJyApO1xuXHRcdFx0Y29udGV4dC5kcmF3SW1hZ2UoIGltYWdlLCAwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQgKTtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogaW1hZ2UgaXMgbm90IHBvd2VyIG9mIHR3byAoJyArIGltYWdlLndpZHRoICsgJ3gnICsgaW1hZ2UuaGVpZ2h0ICsgJykuIFJlc2l6ZWQgdG8gJyArIGNhbnZhcy53aWR0aCArICd4JyArIGNhbnZhcy5oZWlnaHQsIGltYWdlICk7XG5cblx0XHRcdHJldHVybiBjYW52YXM7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gaW1hZ2U7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHRleHR1cmVOZWVkc1Bvd2VyT2ZUd28oIHRleHR1cmUgKSB7XG5cblx0XHRyZXR1cm4gKCB0ZXh0dXJlLndyYXBTICE9PSBDbGFtcFRvRWRnZVdyYXBwaW5nIHx8IHRleHR1cmUud3JhcFQgIT09IENsYW1wVG9FZGdlV3JhcHBpbmcgKSB8fFxuXHRcdFx0KCB0ZXh0dXJlLm1pbkZpbHRlciAhPT0gTmVhcmVzdEZpbHRlciAmJiB0ZXh0dXJlLm1pbkZpbHRlciAhPT0gTGluZWFyRmlsdGVyICk7XG5cblx0fVxuXG5cdC8vIEZhbGxiYWNrIGZpbHRlcnMgZm9yIG5vbi1wb3dlci1vZi0yIHRleHR1cmVzXG5cblx0ZnVuY3Rpb24gZmlsdGVyRmFsbGJhY2soIGYgKSB7XG5cblx0XHRpZiAoIGYgPT09IE5lYXJlc3RGaWx0ZXIgfHwgZiA9PT0gTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIgfHwgZiA9PT0gTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciApIHtcblxuXHRcdFx0cmV0dXJuIF9nbC5ORUFSRVNUO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIF9nbC5MSU5FQVI7XG5cblx0fVxuXG5cdC8vXG5cblx0ZnVuY3Rpb24gb25UZXh0dXJlRGlzcG9zZSggZXZlbnQgKSB7XG5cblx0XHR2YXIgdGV4dHVyZSA9IGV2ZW50LnRhcmdldDtcblxuXHRcdHRleHR1cmUucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7XG5cblx0XHRkZWFsbG9jYXRlVGV4dHVyZSggdGV4dHVyZSApO1xuXG5cdFx0aW5mb01lbW9yeS50ZXh0dXJlcyAtLTtcblxuXG5cdH1cblxuXHRmdW5jdGlvbiBvblJlbmRlclRhcmdldERpc3Bvc2UoIGV2ZW50ICkge1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldCA9IGV2ZW50LnRhcmdldDtcblxuXHRcdHJlbmRlclRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uUmVuZGVyVGFyZ2V0RGlzcG9zZSApO1xuXG5cdFx0ZGVhbGxvY2F0ZVJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRpbmZvTWVtb3J5LnRleHR1cmVzIC0tO1xuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIGRlYWxsb2NhdGVUZXh0dXJlKCB0ZXh0dXJlICkge1xuXG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZS5pbWFnZSAmJiB0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193ZWJnbFRleHR1cmVDdWJlICkge1xuXG5cdFx0XHQvLyBjdWJlIHRleHR1cmVcblxuXHRcdFx0X2dsLmRlbGV0ZVRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLl9faW1hZ2VfX3dlYmdsVGV4dHVyZUN1YmUgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIDJEIHRleHR1cmVcblxuXHRcdFx0aWYgKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsSW5pdCA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0XHRfZ2wuZGVsZXRlVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblxuXHRcdH1cblxuXHRcdC8vIHJlbW92ZSBhbGwgd2ViZ2wgcHJvcGVydGllc1xuXHRcdHByb3BlcnRpZXMucmVtb3ZlKCB0ZXh0dXJlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGRlYWxsb2NhdGVSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdHZhciByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApO1xuXHRcdHZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQudGV4dHVyZSApO1xuXG5cdFx0aWYgKCAhIHJlbmRlclRhcmdldCApIHJldHVybjtcblxuXHRcdGlmICggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0X2dsLmRlbGV0ZVRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgKSB7XG5cblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuZGlzcG9zZSgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0X2dsLmRlbGV0ZUZyYW1lYnVmZmVyKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlclsgaSBdICk7XG5cdFx0XHRcdGlmICggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgKSBfZ2wuZGVsZXRlUmVuZGVyYnVmZmVyKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlclsgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdF9nbC5kZWxldGVGcmFtZWJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgKTtcblx0XHRcdGlmICggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgKSBfZ2wuZGVsZXRlUmVuZGVyYnVmZmVyKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciApO1xuXG5cdFx0fVxuXG5cdFx0cHJvcGVydGllcy5yZW1vdmUoIHJlbmRlclRhcmdldC50ZXh0dXJlICk7XG5cdFx0cHJvcGVydGllcy5yZW1vdmUoIHJlbmRlclRhcmdldCApO1xuXG5cdH1cblxuXHQvL1xuXG5cblxuXHRmdW5jdGlvbiBzZXRUZXh0dXJlMkQoIHRleHR1cmUsIHNsb3QgKSB7XG5cblx0XHR2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLnZlcnNpb24gPiAwICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uICkge1xuXG5cdFx0XHR2YXIgaW1hZ2UgPSB0ZXh0dXJlLmltYWdlO1xuXG5cdFx0XHRpZiAoIGltYWdlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgaW1hZ2UgaXMgdW5kZWZpbmVkJywgdGV4dHVyZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbWFnZS5jb21wbGV0ZSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgaW1hZ2UgaXMgaW5jb21wbGV0ZScsIHRleHR1cmUgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR1cGxvYWRUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcywgdGV4dHVyZSwgc2xvdCApO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIF9nbC5URVhUVVJFMCArIHNsb3QgKTtcblx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFRleHR1cmVDdWJlKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZS5pbWFnZS5sZW5ndGggPT09IDYgKSB7XG5cblx0XHRcdGlmICggdGV4dHVyZS52ZXJzaW9uID4gMCAmJiB0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gIT09IHRleHR1cmUudmVyc2lvbiApIHtcblxuXHRcdFx0XHRpZiAoICEgdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7XG5cblx0XHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193ZWJnbFRleHR1cmVDdWJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTtcblxuXHRcdFx0XHRcdGluZm9NZW1vcnkudGV4dHVyZXMgKys7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIF9nbC5URVhUVVJFMCArIHNsb3QgKTtcblx0XHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193ZWJnbFRleHR1cmVDdWJlICk7XG5cblx0XHRcdFx0X2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX0ZMSVBfWV9XRUJHTCwgdGV4dHVyZS5mbGlwWSApO1xuXG5cdFx0XHRcdHZhciBpc0NvbXByZXNzZWQgPSAoIHRleHR1cmUgJiYgdGV4dHVyZS5pc0NvbXByZXNzZWRUZXh0dXJlICk7XG5cdFx0XHRcdHZhciBpc0RhdGFUZXh0dXJlID0gKCB0ZXh0dXJlLmltYWdlWyAwIF0gJiYgdGV4dHVyZS5pbWFnZVsgMCBdLmlzRGF0YVRleHR1cmUgKTtcblxuXHRcdFx0XHR2YXIgY3ViZUltYWdlID0gW107XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRcdGlmICggISBpc0NvbXByZXNzZWQgJiYgISBpc0RhdGFUZXh0dXJlICkge1xuXG5cdFx0XHRcdFx0XHRjdWJlSW1hZ2VbIGkgXSA9IGNsYW1wVG9NYXhTaXplKCB0ZXh0dXJlLmltYWdlWyBpIF0sIGNhcGFiaWxpdGllcy5tYXhDdWJlbWFwU2l6ZSApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Y3ViZUltYWdlWyBpIF0gPSBpc0RhdGFUZXh0dXJlID8gdGV4dHVyZS5pbWFnZVsgaSBdLmltYWdlIDogdGV4dHVyZS5pbWFnZVsgaSBdO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgaW1hZ2UgPSBjdWJlSW1hZ2VbIDAgXSxcblx0XHRcdFx0aXNQb3dlck9mVHdvSW1hZ2UgPSBpc1Bvd2VyT2ZUd28oIGltYWdlICksXG5cdFx0XHRcdGdsRm9ybWF0ID0gcGFyYW1UaHJlZVRvR0woIHRleHR1cmUuZm9ybWF0ICksXG5cdFx0XHRcdGdsVHlwZSA9IHBhcmFtVGhyZWVUb0dMKCB0ZXh0dXJlLnR5cGUgKTtcblxuXHRcdFx0XHRzZXRUZXh0dXJlUGFyYW1ldGVycyggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHRleHR1cmUsIGlzUG93ZXJPZlR3b0ltYWdlICk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRcdGlmICggISBpc0NvbXByZXNzZWQgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggaXNEYXRhVGV4dHVyZSApIHtcblxuXHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgMCwgZ2xGb3JtYXQsIGN1YmVJbWFnZVsgaSBdLndpZHRoLCBjdWJlSW1hZ2VbIGkgXS5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIGN1YmVJbWFnZVsgaSBdLmRhdGEgKTtcblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgMCwgZ2xGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIGN1YmVJbWFnZVsgaSBdICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHZhciBtaXBtYXAsIG1pcG1hcHMgPSBjdWJlSW1hZ2VbIGkgXS5taXBtYXBzO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gbWlwbWFwcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRtaXBtYXAgPSBtaXBtYXBzWyBqIF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCQUZvcm1hdCAmJiB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCRm9ybWF0ICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBzdGF0ZS5nZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMoKS5pbmRleE9mKCBnbEZvcm1hdCApID4gLSAxICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRzdGF0ZS5jb21wcmVzc2VkVGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIGosIGdsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIG1pcG1hcC5kYXRhICk7XG5cblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byBsb2FkIHVuc3VwcG9ydGVkIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQgaW4gLnNldFRleHR1cmVDdWJlKClcIiApO1xuXG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgaiwgZ2xGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmRhdGEgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyAmJiBpc1Bvd2VyT2ZUd29JbWFnZSApIHtcblxuXHRcdFx0XHRcdF9nbC5nZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRVUkVfQ1VCRV9NQVAgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uID0gdGV4dHVyZS52ZXJzaW9uO1xuXG5cdFx0XHRcdGlmICggdGV4dHVyZS5vblVwZGF0ZSApIHRleHR1cmUub25VcGRhdGUoIHRleHR1cmUgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7XG5cdFx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFRleHR1cmVDdWJlRHluYW1pYyggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIF9nbC5URVhUVVJFMCArIHNsb3QgKTtcblx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX193ZWJnbFRleHR1cmUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0VGV4dHVyZVBhcmFtZXRlcnMoIHRleHR1cmVUeXBlLCB0ZXh0dXJlLCBpc1Bvd2VyT2ZUd29JbWFnZSApIHtcblxuXHRcdHZhciBleHRlbnNpb247XG5cblx0XHRpZiAoIGlzUG93ZXJPZlR3b0ltYWdlICkge1xuXG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfUywgcGFyYW1UaHJlZVRvR0woIHRleHR1cmUud3JhcFMgKSApO1xuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9XUkFQX1QsIHBhcmFtVGhyZWVUb0dMKCB0ZXh0dXJlLndyYXBUICkgKTtcblxuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBwYXJhbVRocmVlVG9HTCggdGV4dHVyZS5tYWdGaWx0ZXIgKSApO1xuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBwYXJhbVRocmVlVG9HTCggdGV4dHVyZS5taW5GaWx0ZXIgKSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9XUkFQX1MsIF9nbC5DTEFNUF9UT19FREdFICk7XG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfVCwgX2dsLkNMQU1QX1RPX0VER0UgKTtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlLndyYXBTICE9PSBDbGFtcFRvRWRnZVdyYXBwaW5nIHx8IHRleHR1cmUud3JhcFQgIT09IENsYW1wVG9FZGdlV3JhcHBpbmcgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBpcyBub3QgcG93ZXIgb2YgdHdvLiBUZXh0dXJlLndyYXBTIGFuZCBUZXh0dXJlLndyYXBUIHNob3VsZCBiZSBzZXQgdG8gVEhSRUUuQ2xhbXBUb0VkZ2VXcmFwcGluZy4nLCB0ZXh0dXJlICk7XG5cblx0XHRcdH1cblxuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBmaWx0ZXJGYWxsYmFjayggdGV4dHVyZS5tYWdGaWx0ZXIgKSApO1xuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBmaWx0ZXJGYWxsYmFjayggdGV4dHVyZS5taW5GaWx0ZXIgKSApO1xuXG5cdFx0XHRpZiAoIHRleHR1cmUubWluRmlsdGVyICE9PSBOZWFyZXN0RmlsdGVyICYmIHRleHR1cmUubWluRmlsdGVyICE9PSBMaW5lYXJGaWx0ZXIgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBpcyBub3QgcG93ZXIgb2YgdHdvLiBUZXh0dXJlLm1pbkZpbHRlciBzaG91bGQgYmUgc2V0IHRvIFRIUkVFLk5lYXJlc3RGaWx0ZXIgb3IgVEhSRUUuTGluZWFyRmlsdGVyLicsIHRleHR1cmUgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICk7XG5cblx0XHRpZiAoIGV4dGVuc2lvbiApIHtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgPT09IEZsb2F0VHlwZSAmJiBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0X2xpbmVhcicgKSA9PT0gbnVsbCApIHJldHVybjtcblx0XHRcdGlmICggdGV4dHVyZS50eXBlID09PSBIYWxmRmxvYXRUeXBlICYmIGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXInICkgPT09IG51bGwgKSByZXR1cm47XG5cblx0XHRcdGlmICggdGV4dHVyZS5hbmlzb3Ryb3B5ID4gMSB8fCBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApLl9fY3VycmVudEFuaXNvdHJvcHkgKSB7XG5cblx0XHRcdFx0X2dsLnRleFBhcmFtZXRlcmYoIHRleHR1cmVUeXBlLCBleHRlbnNpb24uVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQsIE1hdGgubWluKCB0ZXh0dXJlLmFuaXNvdHJvcHksIGNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCkgKSApO1xuXHRcdFx0XHRwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApLl9fY3VycmVudEFuaXNvdHJvcHkgPSB0ZXh0dXJlLmFuaXNvdHJvcHk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBsb2FkVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUsIHNsb3QgKSB7XG5cblx0XHRpZiAoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xJbml0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xJbml0ID0gdHJ1ZTtcblxuXHRcdFx0dGV4dHVyZS5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uVGV4dHVyZURpc3Bvc2UgKTtcblxuXHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgPSBfZ2wuY3JlYXRlVGV4dHVyZSgpO1xuXG5cdFx0XHRpbmZvTWVtb3J5LnRleHR1cmVzICsrO1xuXG5cdFx0fVxuXG5cdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggX2dsLlRFWFRVUkUwICsgc2xvdCApO1xuXHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblxuXHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19GTElQX1lfV0VCR0wsIHRleHR1cmUuZmxpcFkgKTtcblx0XHRfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIHRleHR1cmUucHJlbXVsdGlwbHlBbHBoYSApO1xuXHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19BTElHTk1FTlQsIHRleHR1cmUudW5wYWNrQWxpZ25tZW50ICk7XG5cblx0XHR2YXIgaW1hZ2UgPSBjbGFtcFRvTWF4U2l6ZSggdGV4dHVyZS5pbWFnZSwgY2FwYWJpbGl0aWVzLm1heFRleHR1cmVTaXplICk7XG5cblx0XHRpZiAoIHRleHR1cmVOZWVkc1Bvd2VyT2ZUd28oIHRleHR1cmUgKSAmJiBpc1Bvd2VyT2ZUd28oIGltYWdlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRpbWFnZSA9IG1ha2VQb3dlck9mVHdvKCBpbWFnZSApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGlzUG93ZXJPZlR3b0ltYWdlID0gaXNQb3dlck9mVHdvKCBpbWFnZSApLFxuXHRcdGdsRm9ybWF0ID0gcGFyYW1UaHJlZVRvR0woIHRleHR1cmUuZm9ybWF0ICksXG5cdFx0Z2xUeXBlID0gcGFyYW1UaHJlZVRvR0woIHRleHR1cmUudHlwZSApO1xuXG5cdFx0c2V0VGV4dHVyZVBhcmFtZXRlcnMoIF9nbC5URVhUVVJFXzJELCB0ZXh0dXJlLCBpc1Bvd2VyT2ZUd29JbWFnZSApO1xuXG5cdFx0dmFyIG1pcG1hcCwgbWlwbWFwcyA9IHRleHR1cmUubWlwbWFwcztcblxuXHRcdGlmICggdGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApIHtcblxuXHRcdFx0Ly8gcG9wdWxhdGUgZGVwdGggdGV4dHVyZSB3aXRoIGR1bW15IGRhdGFcblxuXHRcdFx0dmFyIGludGVybmFsRm9ybWF0ID0gX2dsLkRFUFRIX0NPTVBPTkVOVDtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgPT09IEZsb2F0VHlwZSApIHtcblxuXHRcdFx0XHRpZiAoICFfaXNXZWJHTDIgKSB0aHJvdyBuZXcgRXJyb3IoJ0Zsb2F0IERlcHRoIFRleHR1cmUgb25seSBzdXBwb3J0ZWQgaW4gV2ViR0wyLjAnKTtcblx0XHRcdFx0aW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEhfQ09NUE9ORU5UMzJGO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBfaXNXZWJHTDIgKSB7XG5cblx0XHRcdFx0Ly8gV2ViR0wgMi4wIHJlcXVpcmVzIHNpZ25lZCBpbnRlcm5hbGZvcm1hdCBmb3IgZ2xUZXhJbWFnZTJEXG5cdFx0XHRcdGludGVybmFsRm9ybWF0ID0gX2dsLkRFUFRIX0NPTVBPTkVOVDE2O1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdGV4dHVyZS5mb3JtYXQgPT09IERlcHRoRm9ybWF0ICYmIGludGVybmFsRm9ybWF0ID09PSBfZ2wuREVQVEhfQ09NUE9ORU5UICkge1xuXG5cdFx0XHRcdC8vIFRoZSBlcnJvciBJTlZBTElEX09QRVJBVElPTiBpcyBnZW5lcmF0ZWQgYnkgdGV4SW1hZ2UyRCBpZiBmb3JtYXQgYW5kIGludGVybmFsZm9ybWF0IGFyZVxuXHRcdFx0XHQvLyBERVBUSF9DT01QT05FTlQgYW5kIHR5cGUgaXMgbm90IFVOU0lHTkVEX1NIT1JUIG9yIFVOU0lHTkVEX0lOVFxuXHRcdFx0XHQvLyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvZXh0ZW5zaW9ucy9XRUJHTF9kZXB0aF90ZXh0dXJlLylcblx0XHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgIT09IFVuc2lnbmVkU2hvcnRUeXBlICYmIHRleHR1cmUudHlwZSAhPT0gVW5zaWduZWRJbnRUeXBlICkge1xuXG5cdFx0XHRcdCAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVXNlIFVuc2lnbmVkU2hvcnRUeXBlIG9yIFVuc2lnbmVkSW50VHlwZSBmb3IgRGVwdGhGb3JtYXQgRGVwdGhUZXh0dXJlLicgKTtcblxuXHRcdFx0XHRcdHRleHR1cmUudHlwZSA9IFVuc2lnbmVkU2hvcnRUeXBlO1xuXHRcdFx0XHRcdGdsVHlwZSA9IHBhcmFtVGhyZWVUb0dMKCB0ZXh0dXJlLnR5cGUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gRGVwdGggc3RlbmNpbCB0ZXh0dXJlcyBuZWVkIHRoZSBERVBUSF9TVEVOQ0lMIGludGVybmFsIGZvcm1hdFxuXHRcdFx0Ly8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3dlYmdsL2V4dGVuc2lvbnMvV0VCR0xfZGVwdGhfdGV4dHVyZS8pXG5cdFx0XHRpZiAoIHRleHR1cmUuZm9ybWF0ID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSB7XG5cblx0XHRcdFx0aW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEhfU1RFTkNJTDtcblxuXHRcdFx0XHQvLyBUaGUgZXJyb3IgSU5WQUxJRF9PUEVSQVRJT04gaXMgZ2VuZXJhdGVkIGJ5IHRleEltYWdlMkQgaWYgZm9ybWF0IGFuZCBpbnRlcm5hbGZvcm1hdCBhcmVcblx0XHRcdFx0Ly8gREVQVEhfU1RFTkNJTCBhbmQgdHlwZSBpcyBub3QgVU5TSUdORURfSU5UXzI0XzhfV0VCR0wuXG5cdFx0XHRcdC8vIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9leHRlbnNpb25zL1dFQkdMX2RlcHRoX3RleHR1cmUvKVxuXHRcdFx0XHRpZiAoIHRleHR1cmUudHlwZSAhPT0gVW5zaWduZWRJbnQyNDhUeXBlICkge1xuXG5cdFx0XHRcdCAgICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVXNlIFVuc2lnbmVkSW50MjQ4VHlwZSBmb3IgRGVwdGhTdGVuY2lsRm9ybWF0IERlcHRoVGV4dHVyZS4nICk7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLnR5cGUgPSBVbnNpZ25lZEludDI0OFR5cGU7XG5cdFx0XHRcdFx0Z2xUeXBlID0gcGFyYW1UaHJlZVRvR0woIHRleHR1cmUudHlwZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgMCwgaW50ZXJuYWxGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG51bGwgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNEYXRhVGV4dHVyZSApIHtcblxuXHRcdFx0Ly8gdXNlIG1hbnVhbGx5IGNyZWF0ZWQgbWlwbWFwcyBpZiBhdmFpbGFibGVcblx0XHRcdC8vIGlmIHRoZXJlIGFyZSBubyBtYW51YWwgbWlwbWFwc1xuXHRcdFx0Ly8gc2V0IDAgbGV2ZWwgbWlwbWFwIGFuZCB0aGVuIHVzZSBHTCB0byBnZW5lcmF0ZSBvdGhlciBtaXBtYXAgbGV2ZWxzXG5cblx0XHRcdGlmICggbWlwbWFwcy5sZW5ndGggPiAwICYmIGlzUG93ZXJPZlR3b0ltYWdlICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBtaXBtYXBzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0bWlwbWFwID0gbWlwbWFwc1sgaSBdO1xuXHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBpLCBnbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuZGF0YSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCAwLCBnbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UuZGF0YSApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzQ29tcHJlc3NlZFRleHR1cmUgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBtaXBtYXBzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdG1pcG1hcCA9IG1pcG1hcHNbIGkgXTtcblxuXHRcdFx0XHRpZiAoIHRleHR1cmUuZm9ybWF0ICE9PSBSR0JBRm9ybWF0ICYmIHRleHR1cmUuZm9ybWF0ICE9PSBSR0JGb3JtYXQgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHN0YXRlLmdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cygpLmluZGV4T2YoIGdsRm9ybWF0ICkgPiAtIDEgKSB7XG5cblx0XHRcdFx0XHRcdHN0YXRlLmNvbXByZXNzZWRUZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgaSwgZ2xGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgbWlwbWFwLmRhdGEgKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAudXBsb2FkVGV4dHVyZSgpXCIgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGksIGdsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyByZWd1bGFyIFRleHR1cmUgKGltYWdlLCB2aWRlbywgY2FudmFzKVxuXG5cdFx0XHQvLyB1c2UgbWFudWFsbHkgY3JlYXRlZCBtaXBtYXBzIGlmIGF2YWlsYWJsZVxuXHRcdFx0Ly8gaWYgdGhlcmUgYXJlIG5vIG1hbnVhbCBtaXBtYXBzXG5cdFx0XHQvLyBzZXQgMCBsZXZlbCBtaXBtYXAgYW5kIHRoZW4gdXNlIEdMIHRvIGdlbmVyYXRlIG90aGVyIG1pcG1hcCBsZXZlbHNcblxuXHRcdFx0aWYgKCBtaXBtYXBzLmxlbmd0aCA+IDAgJiYgaXNQb3dlck9mVHdvSW1hZ2UgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IG1pcG1hcHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRtaXBtYXAgPSBtaXBtYXBzWyBpIF07XG5cdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGksIGdsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgMCwgZ2xGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgJiYgaXNQb3dlck9mVHdvSW1hZ2UgKSBfZ2wuZ2VuZXJhdGVNaXBtYXAoIF9nbC5URVhUVVJFXzJEICk7XG5cblx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gPSB0ZXh0dXJlLnZlcnNpb247XG5cblx0XHRpZiAoIHRleHR1cmUub25VcGRhdGUgKSB0ZXh0dXJlLm9uVXBkYXRlKCB0ZXh0dXJlICk7XG5cblx0fVxuXG5cdC8vIFJlbmRlciB0YXJnZXRzXG5cblx0Ly8gU2V0dXAgc3RvcmFnZSBmb3IgdGFyZ2V0IHRleHR1cmUgYW5kIGJpbmQgaXQgdG8gY29ycmVjdCBmcmFtZWJ1ZmZlclxuXHRmdW5jdGlvbiBzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSggZnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCwgYXR0YWNobWVudCwgdGV4dHVyZVRhcmdldCApIHtcblxuXHRcdHZhciBnbEZvcm1hdCA9IHBhcmFtVGhyZWVUb0dMKCByZW5kZXJUYXJnZXQudGV4dHVyZS5mb3JtYXQgKTtcblx0XHR2YXIgZ2xUeXBlID0gcGFyYW1UaHJlZVRvR0woIHJlbmRlclRhcmdldC50ZXh0dXJlLnR5cGUgKTtcblx0XHRzdGF0ZS50ZXhJbWFnZTJEKCB0ZXh0dXJlVGFyZ2V0LCAwLCBnbEZvcm1hdCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBudWxsICk7XG5cdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlciApO1xuXHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBhdHRhY2htZW50LCB0ZXh0dXJlVGFyZ2V0LCBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZSwgMCApO1xuXHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgbnVsbCApO1xuXG5cdH1cblxuXHQvLyBTZXR1cCBzdG9yYWdlIGZvciBpbnRlcm5hbCBkZXB0aC9zdGVuY2lsIGJ1ZmZlcnMgYW5kIGJpbmQgdG8gY29ycmVjdCBmcmFtZWJ1ZmZlclxuXHRmdW5jdGlvbiBzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UoIHJlbmRlcmJ1ZmZlciwgcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0X2dsLmJpbmRSZW5kZXJidWZmZXIoIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgJiYgISByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciApIHtcblxuXHRcdFx0X2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoIF9nbC5SRU5ERVJCVUZGRVIsIF9nbC5ERVBUSF9DT01QT05FTlQxNiwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cdFx0XHRfZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkRFUFRIX0FUVEFDSE1FTlQsIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xuXG5cdFx0fSBlbHNlIGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICYmIHJlbmRlclRhcmdldC5zdGVuY2lsQnVmZmVyICkge1xuXG5cdFx0XHRfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZSggX2dsLlJFTkRFUkJVRkZFUiwgX2dsLkRFUFRIX1NURU5DSUwsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xuXHRcdFx0X2dsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQsIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gRklYTUU6IFdlIGRvbid0IHN1cHBvcnQgIWRlcHRoICFzdGVuY2lsXG5cdFx0XHRfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZSggX2dsLlJFTkRFUkJVRkZFUiwgX2dsLlJHQkE0LCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcblxuXHRcdH1cblxuXHRcdF9nbC5iaW5kUmVuZGVyYnVmZmVyKCBfZ2wuUkVOREVSQlVGRkVSLCBudWxsICk7XG5cblx0fVxuXG5cdC8vIFNldHVwIHJlc291cmNlcyBmb3IgYSBEZXB0aCBUZXh0dXJlIGZvciBhIEZCTyAobmVlZHMgYW4gZXh0ZW5zaW9uKVxuXHRmdW5jdGlvbiBzZXR1cERlcHRoVGV4dHVyZSggZnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCApIHtcblxuXHRcdHZhciBpc0N1YmUgPSAoIHJlbmRlclRhcmdldCAmJiByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgKTtcblx0XHRpZiAoIGlzQ3ViZSApIHRocm93IG5ldyBFcnJvcignRGVwdGggVGV4dHVyZSB3aXRoIGN1YmUgcmVuZGVyIHRhcmdldHMgaXMgbm90IHN1cHBvcnRlZCEnKTtcblxuXHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIgKTtcblxuXHRcdGlmICggISggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSAmJiByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmlzRGVwdGhUZXh0dXJlICkgKSB7XG5cblx0XHRcdHRocm93IG5ldyBFcnJvcigncmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFRIUkVFLkRlcHRoVGV4dHVyZScpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXBsb2FkIGFuIGVtcHR5IGRlcHRoIHRleHR1cmUgd2l0aCBmcmFtZWJ1ZmZlciBzaXplXG5cdFx0aWYgKCAhcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZSB8fFxuXHRcdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoICE9PSByZW5kZXJUYXJnZXQud2lkdGggfHxcblx0XHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pbWFnZS5oZWlnaHQgIT09IHJlbmRlclRhcmdldC5oZWlnaHQgKSB7XG5cdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoID0gcmVuZGVyVGFyZ2V0LndpZHRoO1xuXHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pbWFnZS5oZWlnaHQgPSByZW5kZXJUYXJnZXQuaGVpZ2h0O1xuXHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0c2V0VGV4dHVyZTJEKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLCAwICk7XG5cblx0XHR2YXIgd2ViZ2xEZXB0aFRleHR1cmUgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhGb3JtYXQgKSB7XG5cblx0XHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfQVRUQUNITUVOVCwgX2dsLlRFWFRVUkVfMkQsIHdlYmdsRGVwdGhUZXh0dXJlLCAwICk7XG5cblx0XHR9IGVsc2UgaWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkge1xuXG5cdFx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCwgX2dsLlRFWFRVUkVfMkQsIHdlYmdsRGVwdGhUZXh0dXJlLCAwICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZGVwdGhUZXh0dXJlIGZvcm1hdCcpXG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIFNldHVwIEdMIHJlc291cmNlcyBmb3IgYSBub24tdGV4dHVyZSBkZXB0aCBidWZmZXJcblx0ZnVuY3Rpb24gc2V0dXBEZXB0aFJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR2YXIgaXNDdWJlID0gKCByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgPT09IHRydWUgKTtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApIHtcblxuXHRcdFx0aWYgKCBpc0N1YmUgKSB0aHJvdyBuZXcgRXJyb3IoJ3RhcmdldC5kZXB0aFRleHR1cmUgbm90IHN1cHBvcnRlZCBpbiBDdWJlIHJlbmRlciB0YXJnZXRzJyk7XG5cblx0XHRcdHNldHVwRGVwdGhUZXh0dXJlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRpZiAoIGlzQ3ViZSApIHtcblxuXHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0gKTtcblx0XHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlclsgaSBdID0gX2dsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO1xuXHRcdFx0XHRcdHNldHVwUmVuZGVyQnVmZmVyU3RvcmFnZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXJbIGkgXSwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgKTtcblx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgPSBfZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKCk7XG5cdFx0XHRcdHNldHVwUmVuZGVyQnVmZmVyU3RvcmFnZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIsIHJlbmRlclRhcmdldCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIG51bGwgKTtcblxuXHR9XG5cblx0Ly8gU2V0IHVwIEdMIHJlc291cmNlcyBmb3IgdGhlIHJlbmRlciB0YXJnZXRcblx0ZnVuY3Rpb24gc2V0dXBSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdHZhciByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApO1xuXHRcdHZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQudGV4dHVyZSApO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25SZW5kZXJUYXJnZXREaXNwb3NlICk7XG5cblx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSA9IF9nbC5jcmVhdGVUZXh0dXJlKCk7XG5cblx0XHRpbmZvTWVtb3J5LnRleHR1cmVzICsrO1xuXG5cdFx0dmFyIGlzQ3ViZSA9ICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlID09PSB0cnVlICk7XG5cdFx0dmFyIGlzVGFyZ2V0UG93ZXJPZlR3byA9IGlzUG93ZXJPZlR3byggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHQvLyBTZXR1cCBmcmFtZWJ1ZmZlclxuXG5cdFx0aWYgKCBpc0N1YmUgKSB7XG5cblx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSA9IF9nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9IF9nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gU2V0dXAgY29sb3IgYnVmZmVyXG5cblx0XHRpZiAoIGlzQ3ViZSApIHtcblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXHRcdFx0c2V0VGV4dHVyZVBhcmFtZXRlcnMoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCByZW5kZXJUYXJnZXQudGV4dHVyZSwgaXNUYXJnZXRQb3dlck9mVHdvICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0c2V0dXBGcmFtZUJ1ZmZlclRleHR1cmUoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0sIHJlbmRlclRhcmdldCwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggcmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzICYmIGlzVGFyZ2V0UG93ZXJPZlR3byApIF9nbC5nZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRVUkVfQ1VCRV9NQVAgKTtcblx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgbnVsbCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFXzJELCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXHRcdFx0c2V0VGV4dHVyZVBhcmFtZXRlcnMoIF9nbC5URVhUVVJFXzJELCByZW5kZXJUYXJnZXQudGV4dHVyZSwgaXNUYXJnZXRQb3dlck9mVHdvICk7XG5cdFx0XHRzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBfZ2wuVEVYVFVSRV8yRCApO1xuXG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyAmJiBpc1RhcmdldFBvd2VyT2ZUd28gKSBfZ2wuZ2VuZXJhdGVNaXBtYXAoIF9nbC5URVhUVVJFXzJEICk7XG5cdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfMkQsIG51bGwgKTtcblxuXHRcdH1cblxuXHRcdC8vIFNldHVwIGRlcHRoIGFuZCBzdGVuY2lsIGJ1ZmZlcnNcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICkge1xuXG5cdFx0XHRzZXR1cERlcHRoUmVuZGVyYnVmZmVyKCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHR2YXIgdGV4dHVyZSA9IHJlbmRlclRhcmdldC50ZXh0dXJlO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyAmJiBpc1Bvd2VyT2ZUd28oIHJlbmRlclRhcmdldCApICYmXG5cdFx0XHRcdHRleHR1cmUubWluRmlsdGVyICE9PSBOZWFyZXN0RmlsdGVyICYmXG5cdFx0XHRcdHRleHR1cmUubWluRmlsdGVyICE9PSBMaW5lYXJGaWx0ZXIgKSB7XG5cblx0XHRcdHZhciB0YXJnZXQgPSAocmVuZGVyVGFyZ2V0ICYmIHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSkgPyBfZ2wuVEVYVFVSRV9DVUJFX01BUCA6IF9nbC5URVhUVVJFXzJEO1xuXHRcdFx0dmFyIHdlYmdsVGV4dHVyZSA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX193ZWJnbFRleHR1cmU7XG5cblx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCB0YXJnZXQsIHdlYmdsVGV4dHVyZSApO1xuXHRcdFx0X2dsLmdlbmVyYXRlTWlwbWFwKCB0YXJnZXQgKTtcblx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCB0YXJnZXQsIG51bGwgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0dGhpcy5zZXRUZXh0dXJlMkQgPSBzZXRUZXh0dXJlMkQ7XG5cdHRoaXMuc2V0VGV4dHVyZUN1YmUgPSBzZXRUZXh0dXJlQ3ViZTtcblx0dGhpcy5zZXRUZXh0dXJlQ3ViZUR5bmFtaWMgPSBzZXRUZXh0dXJlQ3ViZUR5bmFtaWM7XG5cdHRoaXMuc2V0dXBSZW5kZXJUYXJnZXQgPSBzZXR1cFJlbmRlclRhcmdldDtcblx0dGhpcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAgPSB1cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXA7XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIGZvcmRhY2lvdXMgLyBmb3JkYWNpb3VzLmdpdGh1Yi5pb1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMUHJvcGVydGllcygpIHtcblxuXHR2YXIgcHJvcGVydGllcyA9IHt9O1xuXG5cdGZ1bmN0aW9uIGdldCggb2JqZWN0ICkge1xuXG5cdFx0dmFyIHV1aWQgPSBvYmplY3QudXVpZDtcblx0XHR2YXIgbWFwID0gcHJvcGVydGllc1sgdXVpZCBdO1xuXG5cdFx0aWYgKCBtYXAgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bWFwID0ge307XG5cdFx0XHRwcm9wZXJ0aWVzWyB1dWlkIF0gPSBtYXA7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbWFwO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW1vdmUoIG9iamVjdCApIHtcblxuXHRcdGRlbGV0ZSBwcm9wZXJ0aWVzWyBvYmplY3QudXVpZCBdO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBjbGVhcigpIHtcblxuXHRcdHByb3BlcnRpZXMgPSB7fTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRnZXQ6IGdldCxcblx0XHRyZW1vdmU6IHJlbW92ZSxcblx0XHRjbGVhcjogY2xlYXJcblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xTdGF0ZSggZ2wsIGV4dGVuc2lvbnMsIHBhcmFtVGhyZWVUb0dMICkge1xuXG5cdGZ1bmN0aW9uIENvbG9yQnVmZmVyKCkge1xuXG5cdFx0dmFyIGxvY2tlZCA9IGZhbHNlO1xuXG5cdFx0dmFyIGNvbG9yID0gbmV3IFZlY3RvcjQoKTtcblx0XHR2YXIgY3VycmVudENvbG9yTWFzayA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnRDb2xvckNsZWFyID0gbmV3IFZlY3RvcjQoKTtcblxuXHRcdHJldHVybiB7XG5cblx0XHRcdHNldE1hc2s6IGZ1bmN0aW9uICggY29sb3JNYXNrICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudENvbG9yTWFzayAhPT0gY29sb3JNYXNrICYmICEgbG9ja2VkICkge1xuXG5cdFx0XHRcdFx0Z2wuY29sb3JNYXNrKCBjb2xvck1hc2ssIGNvbG9yTWFzaywgY29sb3JNYXNrLCBjb2xvck1hc2sgKTtcblx0XHRcdFx0XHRjdXJyZW50Q29sb3JNYXNrID0gY29sb3JNYXNrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0TG9ja2VkOiBmdW5jdGlvbiAoIGxvY2sgKSB7XG5cblx0XHRcdFx0bG9ja2VkID0gbG9jaztcblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0Q2xlYXI6IGZ1bmN0aW9uICggciwgZywgYiwgYSwgcHJlbXVsdGlwbGllZEFscGhhICkge1xuXG5cdFx0XHRcdGlmICggcHJlbXVsdGlwbGllZEFscGhhID09PSB0cnVlICkge1xuXG5cdFx0XHRcdFx0ciAqPSBhOyBnICo9IGE7IGIgKj0gYTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29sb3Iuc2V0KCByLCBnLCBiLCBhICk7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50Q29sb3JDbGVhci5lcXVhbHMoIGNvbG9yICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0Z2wuY2xlYXJDb2xvciggciwgZywgYiwgYSApO1xuXHRcdFx0XHRcdGN1cnJlbnRDb2xvckNsZWFyLmNvcHkoIGNvbG9yICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRyZXNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdGxvY2tlZCA9IGZhbHNlO1xuXG5cdFx0XHRcdGN1cnJlbnRDb2xvck1hc2sgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50Q29sb3JDbGVhci5zZXQoIDAsIDAsIDAsIDEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gRGVwdGhCdWZmZXIoKSB7XG5cblx0XHR2YXIgbG9ja2VkID0gZmFsc2U7XG5cblx0XHR2YXIgY3VycmVudERlcHRoTWFzayA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnREZXB0aEZ1bmMgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50RGVwdGhDbGVhciA9IG51bGw7XG5cblx0XHRyZXR1cm4ge1xuXG5cdFx0XHRzZXRUZXN0OiBmdW5jdGlvbiAoIGRlcHRoVGVzdCApIHtcblxuXHRcdFx0XHRpZiAoIGRlcHRoVGVzdCApIHtcblxuXHRcdFx0XHRcdGVuYWJsZSggZ2wuREVQVEhfVEVTVCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRkaXNhYmxlKCBnbC5ERVBUSF9URVNUICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRNYXNrOiBmdW5jdGlvbiAoIGRlcHRoTWFzayApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnREZXB0aE1hc2sgIT09IGRlcHRoTWFzayAmJiAhIGxvY2tlZCApIHtcblxuXHRcdFx0XHRcdGdsLmRlcHRoTWFzayggZGVwdGhNYXNrICk7XG5cdFx0XHRcdFx0Y3VycmVudERlcHRoTWFzayA9IGRlcHRoTWFzaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldEZ1bmM6IGZ1bmN0aW9uICggZGVwdGhGdW5jICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudERlcHRoRnVuYyAhPT0gZGVwdGhGdW5jICkge1xuXG5cdFx0XHRcdFx0aWYgKCBkZXB0aEZ1bmMgKSB7XG5cblx0XHRcdFx0XHRcdHN3aXRjaCAoIGRlcHRoRnVuYyApIHtcblxuXHRcdFx0XHRcdFx0XHRjYXNlIE5ldmVyRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLk5FVkVSICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBBbHdheXNEZXB0aDpcblxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuQUxXQVlTICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBMZXNzRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkxFU1MgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIExlc3NFcXVhbERlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5MRVFVQUwgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIEVxdWFsRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkVRVUFMICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBHcmVhdGVyRXF1YWxEZXB0aDpcblxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuR0VRVUFMICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBHcmVhdGVyRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkdSRUFURVIgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIE5vdEVxdWFsRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLk5PVEVRVUFMICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuTEVRVUFMICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuTEVRVUFMICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjdXJyZW50RGVwdGhGdW5jID0gZGVwdGhGdW5jO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0TG9ja2VkOiBmdW5jdGlvbiAoIGxvY2sgKSB7XG5cblx0XHRcdFx0bG9ja2VkID0gbG9jaztcblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0Q2xlYXI6IGZ1bmN0aW9uICggZGVwdGggKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50RGVwdGhDbGVhciAhPT0gZGVwdGggKSB7XG5cblx0XHRcdFx0XHRnbC5jbGVhckRlcHRoKCBkZXB0aCApO1xuXHRcdFx0XHRcdGN1cnJlbnREZXB0aENsZWFyID0gZGVwdGg7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRyZXNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdGxvY2tlZCA9IGZhbHNlO1xuXG5cdFx0XHRcdGN1cnJlbnREZXB0aE1hc2sgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50RGVwdGhGdW5jID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudERlcHRoQ2xlYXIgPSBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBTdGVuY2lsQnVmZmVyKCkge1xuXG5cdFx0dmFyIGxvY2tlZCA9IGZhbHNlO1xuXG5cdFx0dmFyIGN1cnJlbnRTdGVuY2lsTWFzayA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnRTdGVuY2lsRnVuYyA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnRTdGVuY2lsUmVmID0gbnVsbDtcblx0XHR2YXIgY3VycmVudFN0ZW5jaWxGdW5jTWFzayA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnRTdGVuY2lsRmFpbCA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnRTdGVuY2lsWkZhaWwgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbFpQYXNzID0gbnVsbDtcblx0XHR2YXIgY3VycmVudFN0ZW5jaWxDbGVhciA9IG51bGw7XG5cblx0XHRyZXR1cm4ge1xuXG5cdFx0XHRzZXRUZXN0OiBmdW5jdGlvbiAoIHN0ZW5jaWxUZXN0ICkge1xuXG5cdFx0XHRcdGlmICggc3RlbmNpbFRlc3QgKSB7XG5cblx0XHRcdFx0XHRlbmFibGUoIGdsLlNURU5DSUxfVEVTVCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRkaXNhYmxlKCBnbC5TVEVOQ0lMX1RFU1QgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldE1hc2s6IGZ1bmN0aW9uICggc3RlbmNpbE1hc2sgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50U3RlbmNpbE1hc2sgIT09IHN0ZW5jaWxNYXNrICYmICEgbG9ja2VkICkge1xuXG5cdFx0XHRcdFx0Z2wuc3RlbmNpbE1hc2soIHN0ZW5jaWxNYXNrICk7XG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxNYXNrID0gc3RlbmNpbE1hc2s7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRGdW5jOiBmdW5jdGlvbiAoIHN0ZW5jaWxGdW5jLCBzdGVuY2lsUmVmLCBzdGVuY2lsTWFzayApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRTdGVuY2lsRnVuYyAhPT0gc3RlbmNpbEZ1bmMgfHxcblx0XHRcdFx0ICAgICBjdXJyZW50U3RlbmNpbFJlZiBcdCE9PSBzdGVuY2lsUmVmIFx0fHxcblx0XHRcdFx0ICAgICBjdXJyZW50U3RlbmNpbEZ1bmNNYXNrICE9PSBzdGVuY2lsTWFzayApIHtcblxuXHRcdFx0XHRcdGdsLnN0ZW5jaWxGdW5jKCBzdGVuY2lsRnVuYywgc3RlbmNpbFJlZiwgc3RlbmNpbE1hc2sgKTtcblxuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsRnVuYyA9IHN0ZW5jaWxGdW5jO1xuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsUmVmID0gc3RlbmNpbFJlZjtcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbEZ1bmNNYXNrID0gc3RlbmNpbE1hc2s7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRPcDogZnVuY3Rpb24gKCBzdGVuY2lsRmFpbCwgc3RlbmNpbFpGYWlsLCBzdGVuY2lsWlBhc3MgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50U3RlbmNpbEZhaWxcdCAhPT0gc3RlbmNpbEZhaWwgXHR8fFxuXHRcdFx0XHQgICAgIGN1cnJlbnRTdGVuY2lsWkZhaWwgIT09IHN0ZW5jaWxaRmFpbCB8fFxuXHRcdFx0XHQgICAgIGN1cnJlbnRTdGVuY2lsWlBhc3MgIT09IHN0ZW5jaWxaUGFzcyApIHtcblxuXHRcdFx0XHRcdGdsLnN0ZW5jaWxPcCggc3RlbmNpbEZhaWwsIHN0ZW5jaWxaRmFpbCwgc3RlbmNpbFpQYXNzICk7XG5cblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbEZhaWwgPSBzdGVuY2lsRmFpbDtcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbFpGYWlsID0gc3RlbmNpbFpGYWlsO1xuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsWlBhc3MgPSBzdGVuY2lsWlBhc3M7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRMb2NrZWQ6IGZ1bmN0aW9uICggbG9jayApIHtcblxuXHRcdFx0XHRsb2NrZWQgPSBsb2NrO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRDbGVhcjogZnVuY3Rpb24gKCBzdGVuY2lsICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudFN0ZW5jaWxDbGVhciAhPT0gc3RlbmNpbCApIHtcblxuXHRcdFx0XHRcdGdsLmNsZWFyU3RlbmNpbCggc3RlbmNpbCApO1xuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsQ2xlYXIgPSBzdGVuY2lsO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0cmVzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRsb2NrZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRjdXJyZW50U3RlbmNpbE1hc2sgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50U3RlbmNpbEZ1bmMgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50U3RlbmNpbFJlZiA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsRnVuY01hc2sgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50U3RlbmNpbEZhaWwgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50U3RlbmNpbFpGYWlsID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxaUGFzcyA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsQ2xlYXIgPSBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH1cblxuXHQvL1xuXG5cdHZhciBjb2xvckJ1ZmZlciA9IG5ldyBDb2xvckJ1ZmZlcigpO1xuXHR2YXIgZGVwdGhCdWZmZXIgPSBuZXcgRGVwdGhCdWZmZXIoKTtcblx0dmFyIHN0ZW5jaWxCdWZmZXIgPSBuZXcgU3RlbmNpbEJ1ZmZlcigpO1xuXG5cdHZhciBtYXhWZXJ0ZXhBdHRyaWJ1dGVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkVSVEVYX0FUVFJJQlMgKTtcblx0dmFyIG5ld0F0dHJpYnV0ZXMgPSBuZXcgVWludDhBcnJheSggbWF4VmVydGV4QXR0cmlidXRlcyApO1xuXHR2YXIgZW5hYmxlZEF0dHJpYnV0ZXMgPSBuZXcgVWludDhBcnJheSggbWF4VmVydGV4QXR0cmlidXRlcyApO1xuXHR2YXIgYXR0cmlidXRlRGl2aXNvcnMgPSBuZXcgVWludDhBcnJheSggbWF4VmVydGV4QXR0cmlidXRlcyApO1xuXG5cdHZhciBjYXBhYmlsaXRpZXMgPSB7fTtcblxuXHR2YXIgY29tcHJlc3NlZFRleHR1cmVGb3JtYXRzID0gbnVsbDtcblxuXHR2YXIgY3VycmVudEJsZW5kaW5nID0gbnVsbDtcblx0dmFyIGN1cnJlbnRCbGVuZEVxdWF0aW9uID0gbnVsbDtcblx0dmFyIGN1cnJlbnRCbGVuZFNyYyA9IG51bGw7XG5cdHZhciBjdXJyZW50QmxlbmREc3QgPSBudWxsO1xuXHR2YXIgY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSA9IG51bGw7XG5cdHZhciBjdXJyZW50QmxlbmRTcmNBbHBoYSA9IG51bGw7XG5cdHZhciBjdXJyZW50QmxlbmREc3RBbHBoYSA9IG51bGw7XG5cdHZhciBjdXJyZW50UHJlbXVsdGlwbGVkQWxwaGEgPSBmYWxzZTtcblxuXHR2YXIgY3VycmVudEZsaXBTaWRlZCA9IG51bGw7XG5cdHZhciBjdXJyZW50Q3VsbEZhY2UgPSBudWxsO1xuXG5cdHZhciBjdXJyZW50TGluZVdpZHRoID0gbnVsbDtcblxuXHR2YXIgY3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgPSBudWxsO1xuXHR2YXIgY3VycmVudFBvbHlnb25PZmZzZXRVbml0cyA9IG51bGw7XG5cblx0dmFyIGN1cnJlbnRTY2lzc29yVGVzdCA9IG51bGw7XG5cblx0dmFyIG1heFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVEVYVFVSRV9JTUFHRV9VTklUUyApO1xuXG5cdHZhciB2ZXJzaW9uID0gcGFyc2VGbG9hdCggL15XZWJHTFxcIChbMC05XSkvLmV4ZWMoIGdsLmdldFBhcmFtZXRlciggZ2wuVkVSU0lPTiApIClbIDEgXSApO1xuXHR2YXIgbGluZVdpZHRoQXZhaWxhYmxlID0gcGFyc2VGbG9hdCggdmVyc2lvbiApID49IDEuMDtcblxuXHR2YXIgY3VycmVudFRleHR1cmVTbG90ID0gbnVsbDtcblx0dmFyIGN1cnJlbnRCb3VuZFRleHR1cmVzID0ge307XG5cblx0dmFyIGN1cnJlbnRTY2lzc29yID0gbmV3IFZlY3RvcjQoKTtcblx0dmFyIGN1cnJlbnRWaWV3cG9ydCA9IG5ldyBWZWN0b3I0KCk7XG5cblx0ZnVuY3Rpb24gY3JlYXRlVGV4dHVyZSggdHlwZSwgdGFyZ2V0LCBjb3VudCApIHtcblxuXHRcdHZhciBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoIDQgKTsgLy8gNCBpcyByZXF1aXJlZCB0byBtYXRjaCBkZWZhdWx0IHVucGFjayBhbGlnbm1lbnQgb2YgNC5cblx0XHR2YXIgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcblxuXHRcdGdsLmJpbmRUZXh0dXJlKCB0eXBlLCB0ZXh0dXJlICk7XG5cdFx0Z2wudGV4UGFyYW1ldGVyaSggdHlwZSwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5ORUFSRVNUICk7XG5cdFx0Z2wudGV4UGFyYW1ldGVyaSggdHlwZSwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5ORUFSRVNUICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSArKyApIHtcblxuXHRcdFx0Z2wudGV4SW1hZ2UyRCggdGFyZ2V0ICsgaSwgMCwgZ2wuUkdCQSwgMSwgMSwgMCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgZGF0YSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fVxuXG5cdHZhciBlbXB0eVRleHR1cmVzID0ge307XG5cdGVtcHR5VGV4dHVyZXNbIGdsLlRFWFRVUkVfMkQgXSA9IGNyZWF0ZVRleHR1cmUoIGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfMkQsIDEgKTtcblx0ZW1wdHlUZXh0dXJlc1sgZ2wuVEVYVFVSRV9DVUJFX01BUCBdID0gY3JlYXRlVGV4dHVyZSggZ2wuVEVYVFVSRV9DVUJFX01BUCwgZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YLCA2ICk7XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBpbml0KCkge1xuXG5cdFx0Y29sb3JCdWZmZXIuc2V0Q2xlYXIoIDAsIDAsIDAsIDEgKTtcblx0XHRkZXB0aEJ1ZmZlci5zZXRDbGVhciggMSApO1xuXHRcdHN0ZW5jaWxCdWZmZXIuc2V0Q2xlYXIoIDAgKTtcblxuXHRcdGVuYWJsZSggZ2wuREVQVEhfVEVTVCApO1xuXHRcdGRlcHRoQnVmZmVyLnNldEZ1bmMoIExlc3NFcXVhbERlcHRoICk7XG5cblx0XHRzZXRGbGlwU2lkZWQoIGZhbHNlICk7XG5cdFx0c2V0Q3VsbEZhY2UoIEN1bGxGYWNlQmFjayApO1xuXHRcdGVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cblx0XHRlbmFibGUoIGdsLkJMRU5EICk7XG5cdFx0c2V0QmxlbmRpbmcoIE5vcm1hbEJsZW5kaW5nICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGluaXRBdHRyaWJ1dGVzKCkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbmV3QXR0cmlidXRlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRuZXdBdHRyaWJ1dGVzWyBpIF0gPSAwO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBlbmFibGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcblxuXHRcdG5ld0F0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID0gMTtcblxuXHRcdGlmICggZW5hYmxlZEF0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID09PSAwICkge1xuXG5cdFx0XHRnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSggYXR0cmlidXRlICk7XG5cdFx0XHRlbmFibGVkQXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPSAxO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBhdHRyaWJ1dGVEaXZpc29yc1sgYXR0cmlidXRlIF0gIT09IDAgKSB7XG5cblx0XHRcdHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cblx0XHRcdGV4dGVuc2lvbi52ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUoIGF0dHJpYnV0ZSwgMCApO1xuXHRcdFx0YXR0cmlidXRlRGl2aXNvcnNbIGF0dHJpYnV0ZSBdID0gMDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciggYXR0cmlidXRlLCBtZXNoUGVyQXR0cmlidXRlICkge1xuXG5cdFx0bmV3QXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPSAxO1xuXG5cdFx0aWYgKCBlbmFibGVkQXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPT09IDAgKSB7XG5cblx0XHRcdGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KCBhdHRyaWJ1dGUgKTtcblx0XHRcdGVuYWJsZWRBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9IDE7XG5cblx0XHR9XG5cblx0XHRpZiAoIGF0dHJpYnV0ZURpdmlzb3JzWyBhdHRyaWJ1dGUgXSAhPT0gbWVzaFBlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcblxuXHRcdFx0ZXh0ZW5zaW9uLnZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRSggYXR0cmlidXRlLCBtZXNoUGVyQXR0cmlidXRlICk7XG5cdFx0XHRhdHRyaWJ1dGVEaXZpc29yc1sgYXR0cmlidXRlIF0gPSBtZXNoUGVyQXR0cmlidXRlO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNhYmxlVW51c2VkQXR0cmlidXRlcygpIHtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGVuYWJsZWRBdHRyaWJ1dGVzLmxlbmd0aDsgaSAhPT0gbDsgKysgaSApIHtcblxuXHRcdFx0aWYgKCBlbmFibGVkQXR0cmlidXRlc1sgaSBdICE9PSBuZXdBdHRyaWJ1dGVzWyBpIF0gKSB7XG5cblx0XHRcdFx0Z2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KCBpICk7XG5cdFx0XHRcdGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGVuYWJsZSggaWQgKSB7XG5cblx0XHRpZiAoIGNhcGFiaWxpdGllc1sgaWQgXSAhPT0gdHJ1ZSApIHtcblxuXHRcdFx0Z2wuZW5hYmxlKCBpZCApO1xuXHRcdFx0Y2FwYWJpbGl0aWVzWyBpZCBdID0gdHJ1ZTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZGlzYWJsZSggaWQgKSB7XG5cblx0XHRpZiAoIGNhcGFiaWxpdGllc1sgaWQgXSAhPT0gZmFsc2UgKSB7XG5cblx0XHRcdGdsLmRpc2FibGUoIGlkICk7XG5cdFx0XHRjYXBhYmlsaXRpZXNbIGlkIF0gPSBmYWxzZTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkge1xuXG5cdFx0aWYgKCBjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMgPT09IG51bGwgKSB7XG5cblx0XHRcdGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9IFtdO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApIHx8XG5cdFx0XHQgICAgIGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICkgfHxcblx0XHRcdCAgICAgZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMScgKSApIHtcblxuXHRcdFx0XHR2YXIgZm9ybWF0cyA9IGdsLmdldFBhcmFtZXRlciggZ2wuQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgKTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBmb3JtYXRzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cy5wdXNoKCBmb3JtYXRzWyBpIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHM7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldEJsZW5kaW5nKCBibGVuZGluZywgYmxlbmRFcXVhdGlvbiwgYmxlbmRTcmMsIGJsZW5kRHN0LCBibGVuZEVxdWF0aW9uQWxwaGEsIGJsZW5kU3JjQWxwaGEsIGJsZW5kRHN0QWxwaGEsIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRcdGlmICggYmxlbmRpbmcgIT09IE5vQmxlbmRpbmcgKSB7XG5cblx0XHRcdGVuYWJsZSggZ2wuQkxFTkQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGRpc2FibGUoIGdsLkJMRU5EICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGJsZW5kaW5nICE9PSBjdXJyZW50QmxlbmRpbmcgfHwgcHJlbXVsdGlwbGllZEFscGhhICE9PSBjdXJyZW50UHJlbXVsdGlwbGVkQWxwaGEgKSB7XG5cblx0XHRcdGlmICggYmxlbmRpbmcgPT09IEFkZGl0aXZlQmxlbmRpbmcgKSB7XG5cblx0XHRcdFx0aWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XG5cblx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBnbC5PTkUsIGdsLk9ORSwgZ2wuT05FLCBnbC5PTkUgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvbiggZ2wuRlVOQ19BREQgKTtcblx0XHRcdFx0XHRnbC5ibGVuZEZ1bmMoIGdsLlNSQ19BTFBIQSwgZ2wuT05FICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBibGVuZGluZyA9PT0gU3VidHJhY3RpdmVCbGVuZGluZyApIHtcblxuXHRcdFx0XHRpZiAoIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb25TZXBhcmF0ZSggZ2wuRlVOQ19BREQsIGdsLkZVTkNfQUREICk7XG5cdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLlpFUk8sIGdsLlpFUk8sIGdsLk9ORV9NSU5VU19TUkNfQ09MT1IsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvbiggZ2wuRlVOQ19BREQgKTtcblx0XHRcdFx0XHRnbC5ibGVuZEZ1bmMoIGdsLlpFUk8sIGdsLk9ORV9NSU5VU19TUkNfQ09MT1IgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIGJsZW5kaW5nID09PSBNdWx0aXBseUJsZW5kaW5nICkge1xuXG5cdFx0XHRcdGlmICggcHJlbXVsdGlwbGllZEFscGhhICkge1xuXG5cdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBnbC5GVU5DX0FERCwgZ2wuRlVOQ19BREQgKTtcblx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuWkVSTywgZ2wuU1JDX0NPTE9SLCBnbC5aRVJPLCBnbC5TUkNfQUxQSEEgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvbiggZ2wuRlVOQ19BREQgKTtcblx0XHRcdFx0XHRnbC5ibGVuZEZ1bmMoIGdsLlpFUk8sIGdsLlNSQ19DT0xPUiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRpZiAoIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb25TZXBhcmF0ZSggZ2wuRlVOQ19BREQsIGdsLkZVTkNfQUREICk7XG5cdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSwgZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb25TZXBhcmF0ZSggZ2wuRlVOQ19BREQsIGdsLkZVTkNfQUREICk7XG5cdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLlNSQ19BTFBIQSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSwgZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGN1cnJlbnRCbGVuZGluZyA9IGJsZW5kaW5nO1xuXHRcdFx0Y3VycmVudFByZW11bHRpcGxlZEFscGhhID0gcHJlbXVsdGlwbGllZEFscGhhO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBibGVuZGluZyA9PT0gQ3VzdG9tQmxlbmRpbmcgKSB7XG5cblx0XHRcdGJsZW5kRXF1YXRpb25BbHBoYSA9IGJsZW5kRXF1YXRpb25BbHBoYSB8fCBibGVuZEVxdWF0aW9uO1xuXHRcdFx0YmxlbmRTcmNBbHBoYSA9IGJsZW5kU3JjQWxwaGEgfHwgYmxlbmRTcmM7XG5cdFx0XHRibGVuZERzdEFscGhhID0gYmxlbmREc3RBbHBoYSB8fCBibGVuZERzdDtcblxuXHRcdFx0aWYgKCBibGVuZEVxdWF0aW9uICE9PSBjdXJyZW50QmxlbmRFcXVhdGlvbiB8fCBibGVuZEVxdWF0aW9uQWxwaGEgIT09IGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgKSB7XG5cblx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBwYXJhbVRocmVlVG9HTCggYmxlbmRFcXVhdGlvbiApLCBwYXJhbVRocmVlVG9HTCggYmxlbmRFcXVhdGlvbkFscGhhICkgKTtcblxuXHRcdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbiA9IGJsZW5kRXF1YXRpb247XG5cdFx0XHRcdGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBibGVuZEVxdWF0aW9uQWxwaGE7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBibGVuZFNyYyAhPT0gY3VycmVudEJsZW5kU3JjIHx8IGJsZW5kRHN0ICE9PSBjdXJyZW50QmxlbmREc3QgfHwgYmxlbmRTcmNBbHBoYSAhPT0gY3VycmVudEJsZW5kU3JjQWxwaGEgfHwgYmxlbmREc3RBbHBoYSAhPT0gY3VycmVudEJsZW5kRHN0QWxwaGEgKSB7XG5cblx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIHBhcmFtVGhyZWVUb0dMKCBibGVuZFNyYyApLCBwYXJhbVRocmVlVG9HTCggYmxlbmREc3QgKSwgcGFyYW1UaHJlZVRvR0woIGJsZW5kU3JjQWxwaGEgKSwgcGFyYW1UaHJlZVRvR0woIGJsZW5kRHN0QWxwaGEgKSApO1xuXG5cdFx0XHRcdGN1cnJlbnRCbGVuZFNyYyA9IGJsZW5kU3JjO1xuXHRcdFx0XHRjdXJyZW50QmxlbmREc3QgPSBibGVuZERzdDtcblx0XHRcdFx0Y3VycmVudEJsZW5kU3JjQWxwaGEgPSBibGVuZFNyY0FscGhhO1xuXHRcdFx0XHRjdXJyZW50QmxlbmREc3RBbHBoYSA9IGJsZW5kRHN0QWxwaGE7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGN1cnJlbnRCbGVuZEVxdWF0aW9uID0gbnVsbDtcblx0XHRcdGN1cnJlbnRCbGVuZFNyYyA9IG51bGw7XG5cdFx0XHRjdXJyZW50QmxlbmREc3QgPSBudWxsO1xuXHRcdFx0Y3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSA9IG51bGw7XG5cdFx0XHRjdXJyZW50QmxlbmRTcmNBbHBoYSA9IG51bGw7XG5cdFx0XHRjdXJyZW50QmxlbmREc3RBbHBoYSA9IG51bGw7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldE1hdGVyaWFsKCBtYXRlcmlhbCApIHtcblxuXHRcdG1hdGVyaWFsLnNpZGUgPT09IERvdWJsZVNpZGVcblx0XHRcdD8gZGlzYWJsZSggZ2wuQ1VMTF9GQUNFIClcblx0XHRcdDogZW5hYmxlKCBnbC5DVUxMX0ZBQ0UgKTtcblxuXHRcdHNldEZsaXBTaWRlZCggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKTtcblxuXHRcdG1hdGVyaWFsLnRyYW5zcGFyZW50ID09PSB0cnVlXG5cdFx0XHQ/IHNldEJsZW5kaW5nKCBtYXRlcmlhbC5ibGVuZGluZywgbWF0ZXJpYWwuYmxlbmRFcXVhdGlvbiwgbWF0ZXJpYWwuYmxlbmRTcmMsIG1hdGVyaWFsLmJsZW5kRHN0LCBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uQWxwaGEsIG1hdGVyaWFsLmJsZW5kU3JjQWxwaGEsIG1hdGVyaWFsLmJsZW5kRHN0QWxwaGEsIG1hdGVyaWFsLnByZW11bHRpcGxpZWRBbHBoYSApXG5cdFx0XHQ6IHNldEJsZW5kaW5nKCBOb0JsZW5kaW5nICk7XG5cblx0XHRkZXB0aEJ1ZmZlci5zZXRGdW5jKCBtYXRlcmlhbC5kZXB0aEZ1bmMgKTtcblx0XHRkZXB0aEJ1ZmZlci5zZXRUZXN0KCBtYXRlcmlhbC5kZXB0aFRlc3QgKTtcblx0XHRkZXB0aEJ1ZmZlci5zZXRNYXNrKCBtYXRlcmlhbC5kZXB0aFdyaXRlICk7XG5cdFx0Y29sb3JCdWZmZXIuc2V0TWFzayggbWF0ZXJpYWwuY29sb3JXcml0ZSApO1xuXG5cdFx0c2V0UG9seWdvbk9mZnNldCggbWF0ZXJpYWwucG9seWdvbk9mZnNldCwgbWF0ZXJpYWwucG9seWdvbk9mZnNldEZhY3RvciwgbWF0ZXJpYWwucG9seWdvbk9mZnNldFVuaXRzICk7XG5cblx0fVxuXG5cdC8vXG5cblx0ZnVuY3Rpb24gc2V0RmxpcFNpZGVkKCBmbGlwU2lkZWQgKSB7XG5cblx0XHRpZiAoIGN1cnJlbnRGbGlwU2lkZWQgIT09IGZsaXBTaWRlZCApIHtcblxuXHRcdFx0aWYgKCBmbGlwU2lkZWQgKSB7XG5cblx0XHRcdFx0Z2wuZnJvbnRGYWNlKCBnbC5DVyApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGdsLmZyb250RmFjZSggZ2wuQ0NXICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Y3VycmVudEZsaXBTaWRlZCA9IGZsaXBTaWRlZDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0Q3VsbEZhY2UoIGN1bGxGYWNlICkge1xuXG5cdFx0aWYgKCBjdWxsRmFjZSAhPT0gQ3VsbEZhY2VOb25lICkge1xuXG5cdFx0XHRlbmFibGUoIGdsLkNVTExfRkFDRSApO1xuXG5cdFx0XHRpZiAoIGN1bGxGYWNlICE9PSBjdXJyZW50Q3VsbEZhY2UgKSB7XG5cblx0XHRcdFx0aWYgKCBjdWxsRmFjZSA9PT0gQ3VsbEZhY2VCYWNrICkge1xuXG5cdFx0XHRcdFx0Z2wuY3VsbEZhY2UoIGdsLkJBQ0sgKTtcblxuXHRcdFx0XHR9IGVsc2UgaWYgKCBjdWxsRmFjZSA9PT0gQ3VsbEZhY2VGcm9udCApIHtcblxuXHRcdFx0XHRcdGdsLmN1bGxGYWNlKCBnbC5GUk9OVCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRnbC5jdWxsRmFjZSggZ2wuRlJPTlRfQU5EX0JBQ0sgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGRpc2FibGUoIGdsLkNVTExfRkFDRSApO1xuXG5cdFx0fVxuXG5cdFx0Y3VycmVudEN1bGxGYWNlID0gY3VsbEZhY2U7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldExpbmVXaWR0aCggd2lkdGggKSB7XG5cblx0XHRpZiAoIHdpZHRoICE9PSBjdXJyZW50TGluZVdpZHRoICkge1xuXG5cdFx0XHRpZiAoIGxpbmVXaWR0aEF2YWlsYWJsZSApIGdsLmxpbmVXaWR0aCggd2lkdGggKTtcblxuXHRcdFx0Y3VycmVudExpbmVXaWR0aCA9IHdpZHRoO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRQb2x5Z29uT2Zmc2V0KCBwb2x5Z29uT2Zmc2V0LCBmYWN0b3IsIHVuaXRzICkge1xuXG5cdFx0aWYgKCBwb2x5Z29uT2Zmc2V0ICkge1xuXG5cdFx0XHRlbmFibGUoIGdsLlBPTFlHT05fT0ZGU0VUX0ZJTEwgKTtcblxuXHRcdFx0aWYgKCBjdXJyZW50UG9seWdvbk9mZnNldEZhY3RvciAhPT0gZmFjdG9yIHx8IGN1cnJlbnRQb2x5Z29uT2Zmc2V0VW5pdHMgIT09IHVuaXRzICkge1xuXG5cdFx0XHRcdGdsLnBvbHlnb25PZmZzZXQoIGZhY3RvciwgdW5pdHMgKTtcblxuXHRcdFx0XHRjdXJyZW50UG9seWdvbk9mZnNldEZhY3RvciA9IGZhY3Rvcjtcblx0XHRcdFx0Y3VycmVudFBvbHlnb25PZmZzZXRVbml0cyA9IHVuaXRzO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRkaXNhYmxlKCBnbC5QT0xZR09OX09GRlNFVF9GSUxMICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldFNjaXNzb3JUZXN0KCkge1xuXG5cdFx0cmV0dXJuIGN1cnJlbnRTY2lzc29yVGVzdDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0U2Npc3NvclRlc3QoIHNjaXNzb3JUZXN0ICkge1xuXG5cdFx0Y3VycmVudFNjaXNzb3JUZXN0ID0gc2Npc3NvclRlc3Q7XG5cblx0XHRpZiAoIHNjaXNzb3JUZXN0ICkge1xuXG5cdFx0XHRlbmFibGUoIGdsLlNDSVNTT1JfVEVTVCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGlzYWJsZSggZ2wuU0NJU1NPUl9URVNUICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIHRleHR1cmVcblxuXHRmdW5jdGlvbiBhY3RpdmVUZXh0dXJlKCB3ZWJnbFNsb3QgKSB7XG5cblx0XHRpZiAoIHdlYmdsU2xvdCA9PT0gdW5kZWZpbmVkICkgd2ViZ2xTbG90ID0gZ2wuVEVYVFVSRTAgKyBtYXhUZXh0dXJlcyAtIDE7XG5cblx0XHRpZiAoIGN1cnJlbnRUZXh0dXJlU2xvdCAhPT0gd2ViZ2xTbG90ICkge1xuXG5cdFx0XHRnbC5hY3RpdmVUZXh0dXJlKCB3ZWJnbFNsb3QgKTtcblx0XHRcdGN1cnJlbnRUZXh0dXJlU2xvdCA9IHdlYmdsU2xvdDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gYmluZFRleHR1cmUoIHdlYmdsVHlwZSwgd2ViZ2xUZXh0dXJlICkge1xuXG5cdFx0aWYgKCBjdXJyZW50VGV4dHVyZVNsb3QgPT09IG51bGwgKSB7XG5cblx0XHRcdGFjdGl2ZVRleHR1cmUoKTtcblxuXHRcdH1cblxuXHRcdHZhciBib3VuZFRleHR1cmUgPSBjdXJyZW50Qm91bmRUZXh0dXJlc1sgY3VycmVudFRleHR1cmVTbG90IF07XG5cblx0XHRpZiAoIGJvdW5kVGV4dHVyZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRib3VuZFRleHR1cmUgPSB7IHR5cGU6IHVuZGVmaW5lZCwgdGV4dHVyZTogdW5kZWZpbmVkIH07XG5cdFx0XHRjdXJyZW50Qm91bmRUZXh0dXJlc1sgY3VycmVudFRleHR1cmVTbG90IF0gPSBib3VuZFRleHR1cmU7XG5cblx0XHR9XG5cblx0XHRpZiAoIGJvdW5kVGV4dHVyZS50eXBlICE9PSB3ZWJnbFR5cGUgfHwgYm91bmRUZXh0dXJlLnRleHR1cmUgIT09IHdlYmdsVGV4dHVyZSApIHtcblxuXHRcdFx0Z2wuYmluZFRleHR1cmUoIHdlYmdsVHlwZSwgd2ViZ2xUZXh0dXJlIHx8IGVtcHR5VGV4dHVyZXNbIHdlYmdsVHlwZSBdICk7XG5cblx0XHRcdGJvdW5kVGV4dHVyZS50eXBlID0gd2ViZ2xUeXBlO1xuXHRcdFx0Ym91bmRUZXh0dXJlLnRleHR1cmUgPSB3ZWJnbFRleHR1cmU7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGNvbXByZXNzZWRUZXhJbWFnZTJEKCkge1xuXG5cdFx0dHJ5IHtcblxuXHRcdFx0Z2wuY29tcHJlc3NlZFRleEltYWdlMkQuYXBwbHkoIGdsLCBhcmd1bWVudHMgKTtcblxuXHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggZXJyb3IgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdGV4SW1hZ2UyRCgpIHtcblxuXHRcdHRyeSB7XG5cblx0XHRcdGdsLnRleEltYWdlMkQuYXBwbHkoIGdsLCBhcmd1bWVudHMgKTtcblxuXHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggZXJyb3IgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBzY2lzc29yKCBzY2lzc29yICkge1xuXG5cdFx0aWYgKCBjdXJyZW50U2Npc3Nvci5lcXVhbHMoIHNjaXNzb3IgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGdsLnNjaXNzb3IoIHNjaXNzb3IueCwgc2Npc3Nvci55LCBzY2lzc29yLnosIHNjaXNzb3IudyApO1xuXHRcdFx0Y3VycmVudFNjaXNzb3IuY29weSggc2Npc3NvciApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiB2aWV3cG9ydCggdmlld3BvcnQgKSB7XG5cblx0XHRpZiAoIGN1cnJlbnRWaWV3cG9ydC5lcXVhbHMoIHZpZXdwb3J0ICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRnbC52aWV3cG9ydCggdmlld3BvcnQueCwgdmlld3BvcnQueSwgdmlld3BvcnQueiwgdmlld3BvcnQudyApO1xuXHRcdFx0Y3VycmVudFZpZXdwb3J0LmNvcHkoIHZpZXdwb3J0ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vXG5cblx0ZnVuY3Rpb24gcmVzZXQoKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBlbmFibGVkQXR0cmlidXRlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGlmICggZW5hYmxlZEF0dHJpYnV0ZXNbIGkgXSA9PT0gMSApIHtcblxuXHRcdFx0XHRnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoIGkgKTtcblx0XHRcdFx0ZW5hYmxlZEF0dHJpYnV0ZXNbIGkgXSA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGNhcGFiaWxpdGllcyA9IHt9O1xuXG5cdFx0Y29tcHJlc3NlZFRleHR1cmVGb3JtYXRzID0gbnVsbDtcblxuXHRcdGN1cnJlbnRUZXh0dXJlU2xvdCA9IG51bGw7XG5cdFx0Y3VycmVudEJvdW5kVGV4dHVyZXMgPSB7fTtcblxuXHRcdGN1cnJlbnRCbGVuZGluZyA9IG51bGw7XG5cblx0XHRjdXJyZW50RmxpcFNpZGVkID0gbnVsbDtcblx0XHRjdXJyZW50Q3VsbEZhY2UgPSBudWxsO1xuXG5cdFx0Y29sb3JCdWZmZXIucmVzZXQoKTtcblx0XHRkZXB0aEJ1ZmZlci5yZXNldCgpO1xuXHRcdHN0ZW5jaWxCdWZmZXIucmVzZXQoKTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdGJ1ZmZlcnM6IHtcblx0XHRcdGNvbG9yOiBjb2xvckJ1ZmZlcixcblx0XHRcdGRlcHRoOiBkZXB0aEJ1ZmZlcixcblx0XHRcdHN0ZW5jaWw6IHN0ZW5jaWxCdWZmZXJcblx0XHR9LFxuXG5cdFx0aW5pdDogaW5pdCxcblx0XHRpbml0QXR0cmlidXRlczogaW5pdEF0dHJpYnV0ZXMsXG5cdFx0ZW5hYmxlQXR0cmlidXRlOiBlbmFibGVBdHRyaWJ1dGUsXG5cdFx0ZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvcjogZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvcixcblx0XHRkaXNhYmxlVW51c2VkQXR0cmlidXRlczogZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMsXG5cdFx0ZW5hYmxlOiBlbmFibGUsXG5cdFx0ZGlzYWJsZTogZGlzYWJsZSxcblx0XHRnZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHM6IGdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyxcblxuXHRcdHNldEJsZW5kaW5nOiBzZXRCbGVuZGluZyxcblx0XHRzZXRNYXRlcmlhbDogc2V0TWF0ZXJpYWwsXG5cblx0XHRzZXRGbGlwU2lkZWQ6IHNldEZsaXBTaWRlZCxcblx0XHRzZXRDdWxsRmFjZTogc2V0Q3VsbEZhY2UsXG5cblx0XHRzZXRMaW5lV2lkdGg6IHNldExpbmVXaWR0aCxcblx0XHRzZXRQb2x5Z29uT2Zmc2V0OiBzZXRQb2x5Z29uT2Zmc2V0LFxuXG5cdFx0Z2V0U2Npc3NvclRlc3Q6IGdldFNjaXNzb3JUZXN0LFxuXHRcdHNldFNjaXNzb3JUZXN0OiBzZXRTY2lzc29yVGVzdCxcblxuXHRcdGFjdGl2ZVRleHR1cmU6IGFjdGl2ZVRleHR1cmUsXG5cdFx0YmluZFRleHR1cmU6IGJpbmRUZXh0dXJlLFxuXHRcdGNvbXByZXNzZWRUZXhJbWFnZTJEOiBjb21wcmVzc2VkVGV4SW1hZ2UyRCxcblx0XHR0ZXhJbWFnZTJEOiB0ZXhJbWFnZTJELFxuXG5cdFx0c2Npc3Nvcjogc2Npc3Nvcixcblx0XHR2aWV3cG9ydDogdmlld3BvcnQsXG5cblx0XHRyZXNldDogcmVzZXRcblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTENhcGFiaWxpdGllcyggZ2wsIGV4dGVuc2lvbnMsIHBhcmFtZXRlcnMgKSB7XG5cblx0dmFyIG1heEFuaXNvdHJvcHk7XG5cblx0ZnVuY3Rpb24gZ2V0TWF4QW5pc290cm9weSgpIHtcblxuXHRcdGlmICggbWF4QW5pc290cm9weSAhPT0gdW5kZWZpbmVkICkgcmV0dXJuIG1heEFuaXNvdHJvcHk7XG5cblx0XHR2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICk7XG5cblx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0bWF4QW5pc290cm9weSA9IGdsLmdldFBhcmFtZXRlciggZXh0ZW5zaW9uLk1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bWF4QW5pc290cm9weSA9IDA7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF4QW5pc290cm9weTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0TWF4UHJlY2lzaW9uKCBwcmVjaXNpb24gKSB7XG5cblx0XHRpZiAoIHByZWNpc2lvbiA9PT0gJ2hpZ2hwJyApIHtcblxuXHRcdFx0aWYgKCBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIGdsLlZFUlRFWF9TSEFERVIsIGdsLkhJR0hfRkxPQVQgKS5wcmVjaXNpb24gPiAwICYmXG5cdFx0XHQgICAgIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggZ2wuRlJBR01FTlRfU0hBREVSLCBnbC5ISUdIX0ZMT0FUICkucHJlY2lzaW9uID4gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gJ2hpZ2hwJztcblxuXHRcdFx0fVxuXG5cdFx0XHRwcmVjaXNpb24gPSAnbWVkaXVtcCc7XG5cblx0XHR9XG5cblx0XHRpZiAoIHByZWNpc2lvbiA9PT0gJ21lZGl1bXAnICkge1xuXG5cdFx0XHRpZiAoIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggZ2wuVkVSVEVYX1NIQURFUiwgZ2wuTUVESVVNX0ZMT0FUICkucHJlY2lzaW9uID4gMCAmJlxuXHRcdFx0ICAgICBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIGdsLkZSQUdNRU5UX1NIQURFUiwgZ2wuTUVESVVNX0ZMT0FUICkucHJlY2lzaW9uID4gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gJ21lZGl1bXAnO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gJ2xvd3AnO1xuXG5cdH1cblxuXHR2YXIgcHJlY2lzaW9uID0gcGFyYW1ldGVycy5wcmVjaXNpb24gIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMucHJlY2lzaW9uIDogJ2hpZ2hwJztcblx0dmFyIG1heFByZWNpc2lvbiA9IGdldE1heFByZWNpc2lvbiggcHJlY2lzaW9uICk7XG5cblx0aWYgKCBtYXhQcmVjaXNpb24gIT09IHByZWNpc2lvbiApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6JywgcHJlY2lzaW9uLCAnbm90IHN1cHBvcnRlZCwgdXNpbmcnLCBtYXhQcmVjaXNpb24sICdpbnN0ZWFkLicgKTtcblx0XHRwcmVjaXNpb24gPSBtYXhQcmVjaXNpb247XG5cblx0fVxuXG5cdHZhciBsb2dhcml0aG1pY0RlcHRoQnVmZmVyID0gcGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID09PSB0cnVlICYmICEhIGV4dGVuc2lvbnMuZ2V0KCAnRVhUX2ZyYWdfZGVwdGgnICk7XG5cblx0dmFyIG1heFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVEVYVFVSRV9JTUFHRV9VTklUUyApO1xuXHR2YXIgbWF4VmVydGV4VGV4dHVyZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUyApO1xuXHR2YXIgbWF4VGV4dHVyZVNpemUgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9URVhUVVJFX1NJWkUgKTtcblx0dmFyIG1heEN1YmVtYXBTaXplID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFICk7XG5cblx0dmFyIG1heEF0dHJpYnV0ZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9WRVJURVhfQVRUUklCUyApO1xuXHR2YXIgbWF4VmVydGV4VW5pZm9ybXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTICk7XG5cdHZhciBtYXhWYXJ5aW5ncyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1ZBUllJTkdfVkVDVE9SUyApO1xuXHR2YXIgbWF4RnJhZ21lbnRVbmlmb3JtcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUyApO1xuXG5cdHZhciB2ZXJ0ZXhUZXh0dXJlcyA9IG1heFZlcnRleFRleHR1cmVzID4gMDtcblx0dmFyIGZsb2F0RnJhZ21lbnRUZXh0dXJlcyA9ICEhIGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXQnICk7XG5cdHZhciBmbG9hdFZlcnRleFRleHR1cmVzID0gdmVydGV4VGV4dHVyZXMgJiYgZmxvYXRGcmFnbWVudFRleHR1cmVzO1xuXG5cdHJldHVybiB7XG5cblx0XHRnZXRNYXhBbmlzb3Ryb3B5OiBnZXRNYXhBbmlzb3Ryb3B5LFxuXHRcdGdldE1heFByZWNpc2lvbjogZ2V0TWF4UHJlY2lzaW9uLFxuXG5cdFx0cHJlY2lzaW9uOiBwcmVjaXNpb24sXG5cdFx0bG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjogbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcixcblxuXHRcdG1heFRleHR1cmVzOiBtYXhUZXh0dXJlcyxcblx0XHRtYXhWZXJ0ZXhUZXh0dXJlczogbWF4VmVydGV4VGV4dHVyZXMsXG5cdFx0bWF4VGV4dHVyZVNpemU6IG1heFRleHR1cmVTaXplLFxuXHRcdG1heEN1YmVtYXBTaXplOiBtYXhDdWJlbWFwU2l6ZSxcblxuXHRcdG1heEF0dHJpYnV0ZXM6IG1heEF0dHJpYnV0ZXMsXG5cdFx0bWF4VmVydGV4VW5pZm9ybXM6IG1heFZlcnRleFVuaWZvcm1zLFxuXHRcdG1heFZhcnlpbmdzOiBtYXhWYXJ5aW5ncyxcblx0XHRtYXhGcmFnbWVudFVuaWZvcm1zOiBtYXhGcmFnbWVudFVuaWZvcm1zLFxuXG5cdFx0dmVydGV4VGV4dHVyZXM6IHZlcnRleFRleHR1cmVzLFxuXHRcdGZsb2F0RnJhZ21lbnRUZXh0dXJlczogZmxvYXRGcmFnbWVudFRleHR1cmVzLFxuXHRcdGZsb2F0VmVydGV4VGV4dHVyZXM6IGZsb2F0VmVydGV4VGV4dHVyZXNcblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTEV4dGVuc2lvbnMoIGdsICkge1xuXG5cdHZhciBleHRlbnNpb25zID0ge307XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbnNbIG5hbWUgXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBleHRlbnNpb25zWyBuYW1lIF07XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGV4dGVuc2lvbjtcblxuXHRcdFx0c3dpdGNoICggbmFtZSApIHtcblxuXHRcdFx0XHRjYXNlICdXRUJHTF9kZXB0aF90ZXh0dXJlJzpcblx0XHRcdFx0XHRleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9kZXB0aF90ZXh0dXJlJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ01PWl9XRUJHTF9kZXB0aF90ZXh0dXJlJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9XRUJHTF9kZXB0aF90ZXh0dXJlJyApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyc6XG5cdFx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ01PWl9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCS0lUX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0Yyc6XG5cdFx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnTU9aX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnOlxuXHRcdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMxJzpcblx0XHRcdFx0XHRleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMScgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggbmFtZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uID09PSBudWxsICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6ICcgKyBuYW1lICsgJyBleHRlbnNpb24gbm90IHN1cHBvcnRlZC4nICk7XG5cblx0XHRcdH1cblxuXHRcdFx0ZXh0ZW5zaW9uc1sgbmFtZSBdID0gZXh0ZW5zaW9uO1xuXG5cdFx0XHRyZXR1cm4gZXh0ZW5zaW9uO1xuXG5cdFx0fVxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gV2ViR0xDbGlwcGluZygpIHtcblxuXHR2YXIgc2NvcGUgPSB0aGlzLFxuXG5cdFx0Z2xvYmFsU3RhdGUgPSBudWxsLFxuXHRcdG51bUdsb2JhbFBsYW5lcyA9IDAsXG5cdFx0bG9jYWxDbGlwcGluZ0VuYWJsZWQgPSBmYWxzZSxcblx0XHRyZW5kZXJpbmdTaGFkb3dzID0gZmFsc2UsXG5cblx0XHRwbGFuZSA9IG5ldyBQbGFuZSgpLFxuXHRcdHZpZXdOb3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpLFxuXG5cdFx0dW5pZm9ybSA9IHsgdmFsdWU6IG51bGwsIG5lZWRzVXBkYXRlOiBmYWxzZSB9O1xuXG5cdHRoaXMudW5pZm9ybSA9IHVuaWZvcm07XG5cdHRoaXMubnVtUGxhbmVzID0gMDtcblx0dGhpcy5udW1JbnRlcnNlY3Rpb24gPSAwO1xuXG5cdHRoaXMuaW5pdCA9IGZ1bmN0aW9uKCBwbGFuZXMsIGVuYWJsZUxvY2FsQ2xpcHBpbmcsIGNhbWVyYSApIHtcblxuXHRcdHZhciBlbmFibGVkID1cblx0XHRcdHBsYW5lcy5sZW5ndGggIT09IDAgfHxcblx0XHRcdGVuYWJsZUxvY2FsQ2xpcHBpbmcgfHxcblx0XHRcdC8vIGVuYWJsZSBzdGF0ZSBvZiBwcmV2aW91cyBmcmFtZSAtIHRoZSBjbGlwcGluZyBjb2RlIGhhcyB0b1xuXHRcdFx0Ly8gcnVuIGFub3RoZXIgZnJhbWUgaW4gb3JkZXIgdG8gcmVzZXQgdGhlIHN0YXRlOlxuXHRcdFx0bnVtR2xvYmFsUGxhbmVzICE9PSAwIHx8XG5cdFx0XHRsb2NhbENsaXBwaW5nRW5hYmxlZDtcblxuXHRcdGxvY2FsQ2xpcHBpbmdFbmFibGVkID0gZW5hYmxlTG9jYWxDbGlwcGluZztcblxuXHRcdGdsb2JhbFN0YXRlID0gcHJvamVjdFBsYW5lcyggcGxhbmVzLCBjYW1lcmEsIDAgKTtcblx0XHRudW1HbG9iYWxQbGFuZXMgPSBwbGFuZXMubGVuZ3RoO1xuXG5cdFx0cmV0dXJuIGVuYWJsZWQ7XG5cblx0fTtcblxuXHR0aGlzLmJlZ2luU2hhZG93cyA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0cmVuZGVyaW5nU2hhZG93cyA9IHRydWU7XG5cdFx0cHJvamVjdFBsYW5lcyggbnVsbCApO1xuXG5cdH07XG5cblx0dGhpcy5lbmRTaGFkb3dzID0gZnVuY3Rpb24oKSB7XG5cblx0XHRyZW5kZXJpbmdTaGFkb3dzID0gZmFsc2U7XG5cdFx0cmVzZXRHbG9iYWxTdGF0ZSgpO1xuXG5cdH07XG5cblx0dGhpcy5zZXRTdGF0ZSA9IGZ1bmN0aW9uKCBwbGFuZXMsIGNsaXBJbnRlcnNlY3Rpb24sIGNsaXBTaGFkb3dzLCBjYW1lcmEsIGNhY2hlLCBmcm9tQ2FjaGUgKSB7XG5cblx0XHRpZiAoICEgbG9jYWxDbGlwcGluZ0VuYWJsZWQgfHxcblx0XHRcdFx0cGxhbmVzID09PSBudWxsIHx8IHBsYW5lcy5sZW5ndGggPT09IDAgfHxcblx0XHRcdFx0cmVuZGVyaW5nU2hhZG93cyAmJiAhIGNsaXBTaGFkb3dzICkge1xuXHRcdFx0Ly8gdGhlcmUncyBubyBsb2NhbCBjbGlwcGluZ1xuXG5cdFx0XHRpZiAoIHJlbmRlcmluZ1NoYWRvd3MgKSB7XG5cdFx0XHRcdC8vIHRoZXJlJ3Mgbm8gZ2xvYmFsIGNsaXBwaW5nXG5cblx0XHRcdFx0cHJvamVjdFBsYW5lcyggbnVsbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJlc2V0R2xvYmFsU3RhdGUoKTtcblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHZhciBuR2xvYmFsID0gcmVuZGVyaW5nU2hhZG93cyA/IDAgOiBudW1HbG9iYWxQbGFuZXMsXG5cdFx0XHRcdGxHbG9iYWwgPSBuR2xvYmFsICogNCxcblxuXHRcdFx0XHRkc3RBcnJheSA9IGNhY2hlLmNsaXBwaW5nU3RhdGUgfHwgbnVsbDtcblxuXHRcdFx0dW5pZm9ybS52YWx1ZSA9IGRzdEFycmF5OyAvLyBlbnN1cmUgdW5pcXVlIHN0YXRlXG5cblx0XHRcdGRzdEFycmF5ID0gcHJvamVjdFBsYW5lcyggcGxhbmVzLCBjYW1lcmEsIGxHbG9iYWwsIGZyb21DYWNoZSApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IGxHbG9iYWw7ICsrIGkgKSB7XG5cblx0XHRcdFx0ZHN0QXJyYXlbIGkgXSA9IGdsb2JhbFN0YXRlWyBpIF07XG5cblx0XHRcdH1cblxuXHRcdFx0Y2FjaGUuY2xpcHBpbmdTdGF0ZSA9IGRzdEFycmF5O1xuXHRcdFx0dGhpcy5udW1JbnRlcnNlY3Rpb24gPSBjbGlwSW50ZXJzZWN0aW9uID8gdGhpcy5udW1QbGFuZXMgOiAwO1xuXHRcdFx0dGhpcy5udW1QbGFuZXMgKz0gbkdsb2JhbDtcblxuXHRcdH1cblxuXG5cdH07XG5cblx0ZnVuY3Rpb24gcmVzZXRHbG9iYWxTdGF0ZSgpIHtcblxuXHRcdGlmICggdW5pZm9ybS52YWx1ZSAhPT0gZ2xvYmFsU3RhdGUgKSB7XG5cblx0XHRcdHVuaWZvcm0udmFsdWUgPSBnbG9iYWxTdGF0ZTtcblx0XHRcdHVuaWZvcm0ubmVlZHNVcGRhdGUgPSBudW1HbG9iYWxQbGFuZXMgPiAwO1xuXG5cdFx0fVxuXG5cdFx0c2NvcGUubnVtUGxhbmVzID0gbnVtR2xvYmFsUGxhbmVzO1xuXHRcdHNjb3BlLm51bUludGVyc2VjdGlvbiA9IDA7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHByb2plY3RQbGFuZXMoIHBsYW5lcywgY2FtZXJhLCBkc3RPZmZzZXQsIHNraXBUcmFuc2Zvcm0gKSB7XG5cblx0XHR2YXIgblBsYW5lcyA9IHBsYW5lcyAhPT0gbnVsbCA/IHBsYW5lcy5sZW5ndGggOiAwLFxuXHRcdFx0ZHN0QXJyYXkgPSBudWxsO1xuXG5cdFx0aWYgKCBuUGxhbmVzICE9PSAwICkge1xuXG5cdFx0XHRkc3RBcnJheSA9IHVuaWZvcm0udmFsdWU7XG5cblx0XHRcdGlmICggc2tpcFRyYW5zZm9ybSAhPT0gdHJ1ZSB8fCBkc3RBcnJheSA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHR2YXIgZmxhdFNpemUgPSBkc3RPZmZzZXQgKyBuUGxhbmVzICogNCxcblx0XHRcdFx0XHR2aWV3TWF0cml4ID0gY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZTtcblxuXHRcdFx0XHR2aWV3Tm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdGlmICggZHN0QXJyYXkgPT09IG51bGwgfHwgZHN0QXJyYXkubGVuZ3RoIDwgZmxhdFNpemUgKSB7XG5cblx0XHRcdFx0XHRkc3RBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIGZsYXRTaXplICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaTQgPSBkc3RPZmZzZXQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRpICE9PSBuUGxhbmVzOyArKyBpLCBpNCArPSA0ICkge1xuXG5cdFx0XHRcdFx0cGxhbmUuY29weSggcGxhbmVzWyBpIF0gKS5cblx0XHRcdFx0XHRcdFx0YXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4LCB2aWV3Tm9ybWFsTWF0cml4ICk7XG5cblx0XHRcdFx0XHRwbGFuZS5ub3JtYWwudG9BcnJheSggZHN0QXJyYXksIGk0ICk7XG5cdFx0XHRcdFx0ZHN0QXJyYXlbIGk0ICsgMyBdID0gcGxhbmUuY29uc3RhbnQ7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHVuaWZvcm0udmFsdWUgPSBkc3RBcnJheTtcblx0XHRcdHVuaWZvcm0ubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0c2NvcGUubnVtUGxhbmVzID0gblBsYW5lcztcblx0XHRcblx0XHRyZXR1cm4gZHN0QXJyYXk7XG5cblx0fVxuXG59XG5cbi8vIGltcG9ydCB7IFNwaGVyZSB9IGZyb20gJy4uL21hdGgvU3BoZXJlJztcbi8qKlxuICogQGF1dGhvciBzdXBlcmVnZ2JlcnQgLyBodHRwOi8vd3d3LnBhdWxicnVudC5jby51ay9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBzemltZWsgLyBodHRwczovL2dpdGh1Yi5jb20vc3ppbWVrL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMUmVuZGVyZXIoIHBhcmFtZXRlcnMgKSB7XG5cblx0Y29uc29sZS5sb2coICdUSFJFRS5XZWJHTFJlbmRlcmVyJywgUkVWSVNJT04gKTtcblxuXHRwYXJhbWV0ZXJzID0gcGFyYW1ldGVycyB8fCB7fTtcblxuXHR2YXIgX2NhbnZhcyA9IHBhcmFtZXRlcnMuY2FudmFzICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmNhbnZhcyA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFzJyApLFxuXHRcdF9jb250ZXh0ID0gcGFyYW1ldGVycy5jb250ZXh0ICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmNvbnRleHQgOiBudWxsLFxuXG5cdFx0X2FscGhhID0gcGFyYW1ldGVycy5hbHBoYSAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5hbHBoYSA6IGZhbHNlLFxuXHRcdF9kZXB0aCA9IHBhcmFtZXRlcnMuZGVwdGggIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuZGVwdGggOiB0cnVlLFxuXHRcdF9zdGVuY2lsID0gcGFyYW1ldGVycy5zdGVuY2lsICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnN0ZW5jaWwgOiB0cnVlLFxuXHRcdF9hbnRpYWxpYXMgPSBwYXJhbWV0ZXJzLmFudGlhbGlhcyAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5hbnRpYWxpYXMgOiBmYWxzZSxcblx0XHRfcHJlbXVsdGlwbGllZEFscGhhID0gcGFyYW1ldGVycy5wcmVtdWx0aXBsaWVkQWxwaGEgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMucHJlbXVsdGlwbGllZEFscGhhIDogdHJ1ZSxcblx0XHRfcHJlc2VydmVEcmF3aW5nQnVmZmVyID0gcGFyYW1ldGVycy5wcmVzZXJ2ZURyYXdpbmdCdWZmZXIgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMucHJlc2VydmVEcmF3aW5nQnVmZmVyIDogZmFsc2U7XG5cblx0dmFyIGxpZ2h0cyA9IFtdO1xuXG5cdHZhciBjdXJyZW50UmVuZGVyTGlzdCA9IG51bGw7XG5cblx0dmFyIG1vcnBoSW5mbHVlbmNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIDggKTtcblxuXHR2YXIgc3ByaXRlcyA9IFtdO1xuXHR2YXIgbGVuc0ZsYXJlcyA9IFtdO1xuXG5cdC8vIHB1YmxpYyBwcm9wZXJ0aWVzXG5cblx0dGhpcy5kb21FbGVtZW50ID0gX2NhbnZhcztcblx0dGhpcy5jb250ZXh0ID0gbnVsbDtcblxuXHQvLyBjbGVhcmluZ1xuXG5cdHRoaXMuYXV0b0NsZWFyID0gdHJ1ZTtcblx0dGhpcy5hdXRvQ2xlYXJDb2xvciA9IHRydWU7XG5cdHRoaXMuYXV0b0NsZWFyRGVwdGggPSB0cnVlO1xuXHR0aGlzLmF1dG9DbGVhclN0ZW5jaWwgPSB0cnVlO1xuXG5cdC8vIHNjZW5lIGdyYXBoXG5cblx0dGhpcy5zb3J0T2JqZWN0cyA9IHRydWU7XG5cblx0Ly8gdXNlci1kZWZpbmVkIGNsaXBwaW5nXG5cblx0dGhpcy5jbGlwcGluZ1BsYW5lcyA9IFtdO1xuXHR0aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkID0gZmFsc2U7XG5cblx0Ly8gcGh5c2ljYWxseSBiYXNlZCBzaGFkaW5nXG5cblx0dGhpcy5nYW1tYUZhY3RvciA9IDIuMDtcdC8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXHR0aGlzLmdhbW1hSW5wdXQgPSBmYWxzZTtcblx0dGhpcy5nYW1tYU91dHB1dCA9IGZhbHNlO1xuXG5cdC8vIHBoeXNpY2FsIGxpZ2h0c1xuXG5cdHRoaXMucGh5c2ljYWxseUNvcnJlY3RMaWdodHMgPSBmYWxzZTtcblxuXHQvLyB0b25lIG1hcHBpbmdcblxuXHR0aGlzLnRvbmVNYXBwaW5nID0gTGluZWFyVG9uZU1hcHBpbmc7XG5cdHRoaXMudG9uZU1hcHBpbmdFeHBvc3VyZSA9IDEuMDtcblx0dGhpcy50b25lTWFwcGluZ1doaXRlUG9pbnQgPSAxLjA7XG5cblx0Ly8gbW9ycGhzXG5cblx0dGhpcy5tYXhNb3JwaFRhcmdldHMgPSA4O1xuXHR0aGlzLm1heE1vcnBoTm9ybWFscyA9IDQ7XG5cblx0Ly8gaW50ZXJuYWwgcHJvcGVydGllc1xuXG5cdHZhciBfdGhpcyA9IHRoaXMsXG5cblx0XHQvLyBpbnRlcm5hbCBzdGF0ZSBjYWNoZVxuXG5cdFx0X2N1cnJlbnRQcm9ncmFtID0gbnVsbCxcblx0XHRfY3VycmVudFJlbmRlclRhcmdldCA9IG51bGwsXG5cdFx0X2N1cnJlbnRGcmFtZWJ1ZmZlciA9IG51bGwsXG5cdFx0X2N1cnJlbnRNYXRlcmlhbElkID0gLSAxLFxuXHRcdF9jdXJyZW50R2VvbWV0cnlQcm9ncmFtID0gJycsXG5cdFx0X2N1cnJlbnRDYW1lcmEgPSBudWxsLFxuXG5cdFx0X2N1cnJlbnRTY2lzc29yID0gbmV3IFZlY3RvcjQoKSxcblx0XHRfY3VycmVudFNjaXNzb3JUZXN0ID0gbnVsbCxcblxuXHRcdF9jdXJyZW50Vmlld3BvcnQgPSBuZXcgVmVjdG9yNCgpLFxuXG5cdFx0Ly9cblxuXHRcdF91c2VkVGV4dHVyZVVuaXRzID0gMCxcblxuXHRcdC8vXG5cblx0XHRfY2xlYXJDb2xvciA9IG5ldyBDb2xvciggMHgwMDAwMDAgKSxcblx0XHRfY2xlYXJBbHBoYSA9IDAsXG5cblx0XHRfd2lkdGggPSBfY2FudmFzLndpZHRoLFxuXHRcdF9oZWlnaHQgPSBfY2FudmFzLmhlaWdodCxcblxuXHRcdF9waXhlbFJhdGlvID0gMSxcblxuXHRcdF9zY2lzc29yID0gbmV3IFZlY3RvcjQoIDAsIDAsIF93aWR0aCwgX2hlaWdodCApLFxuXHRcdF9zY2lzc29yVGVzdCA9IGZhbHNlLFxuXG5cdFx0X3ZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoIDAsIDAsIF93aWR0aCwgX2hlaWdodCApLFxuXG5cdFx0Ly8gZnJ1c3R1bVxuXG5cdFx0X2ZydXN0dW0gPSBuZXcgRnJ1c3R1bSgpLFxuXG5cdFx0Ly8gY2xpcHBpbmdcblxuXHRcdF9jbGlwcGluZyA9IG5ldyBXZWJHTENsaXBwaW5nKCksXG5cdFx0X2NsaXBwaW5nRW5hYmxlZCA9IGZhbHNlLFxuXHRcdF9sb2NhbENsaXBwaW5nRW5hYmxlZCA9IGZhbHNlLFxuXG5cdFx0Ly8gY2FtZXJhIG1hdHJpY2VzIGNhY2hlXG5cblx0XHRfcHJvalNjcmVlbk1hdHJpeCA9IG5ldyBNYXRyaXg0KCksXG5cblx0XHRfdmVjdG9yMyA9IG5ldyBWZWN0b3IzKCksXG5cdFx0X21hdHJpeDQgPSBuZXcgTWF0cml4NCgpLFxuXHRcdF9tYXRyaXg0MiA9IG5ldyBNYXRyaXg0KCksXG5cblx0XHQvLyBsaWdodCBhcnJheXMgY2FjaGVcblxuXHRcdF9saWdodHMgPSB7XG5cblx0XHRcdGhhc2g6ICcnLFxuXG5cdFx0XHRhbWJpZW50OiBbIDAsIDAsIDAgXSxcblx0XHRcdGRpcmVjdGlvbmFsOiBbXSxcblx0XHRcdGRpcmVjdGlvbmFsU2hhZG93TWFwOiBbXSxcblx0XHRcdGRpcmVjdGlvbmFsU2hhZG93TWF0cml4OiBbXSxcblx0XHRcdHNwb3Q6IFtdLFxuXHRcdFx0c3BvdFNoYWRvd01hcDogW10sXG5cdFx0XHRzcG90U2hhZG93TWF0cml4OiBbXSxcblx0XHRcdHJlY3RBcmVhOiBbXSxcblx0XHRcdHBvaW50OiBbXSxcblx0XHRcdHBvaW50U2hhZG93TWFwOiBbXSxcblx0XHRcdHBvaW50U2hhZG93TWF0cml4OiBbXSxcblx0XHRcdGhlbWk6IFtdLFxuXG5cdFx0XHRzaGFkb3dzOiBbXVxuXG5cdFx0fSxcblxuXHRcdC8vIGluZm9cblxuXHRcdF9pbmZvTWVtb3J5ID0ge1xuXHRcdFx0Z2VvbWV0cmllczogMCxcblx0XHRcdHRleHR1cmVzOiAwXG5cdFx0fSxcblxuXHRcdF9pbmZvUmVuZGVyID0ge1xuXG5cdFx0XHRmcmFtZTogMCxcblx0XHRcdGNhbGxzOiAwLFxuXHRcdFx0dmVydGljZXM6IDAsXG5cdFx0XHRmYWNlczogMCxcblx0XHRcdHBvaW50czogMFxuXG5cdFx0fTtcblxuXHR0aGlzLmluZm8gPSB7XG5cblx0XHRyZW5kZXI6IF9pbmZvUmVuZGVyLFxuXHRcdG1lbW9yeTogX2luZm9NZW1vcnksXG5cdFx0cHJvZ3JhbXM6IG51bGxcblxuXHR9O1xuXG5cblx0Ly8gaW5pdGlhbGl6ZVxuXG5cdHZhciBfZ2w7XG5cblx0dHJ5IHtcblxuXHRcdHZhciBjb250ZXh0QXR0cmlidXRlcyA9IHtcblx0XHRcdGFscGhhOiBfYWxwaGEsXG5cdFx0XHRkZXB0aDogX2RlcHRoLFxuXHRcdFx0c3RlbmNpbDogX3N0ZW5jaWwsXG5cdFx0XHRhbnRpYWxpYXM6IF9hbnRpYWxpYXMsXG5cdFx0XHRwcmVtdWx0aXBsaWVkQWxwaGE6IF9wcmVtdWx0aXBsaWVkQWxwaGEsXG5cdFx0XHRwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IF9wcmVzZXJ2ZURyYXdpbmdCdWZmZXJcblx0XHR9O1xuXG5cdFx0X2dsID0gX2NvbnRleHQgfHwgX2NhbnZhcy5nZXRDb250ZXh0KCAnd2ViZ2wnLCBjb250ZXh0QXR0cmlidXRlcyApIHx8IF9jYW52YXMuZ2V0Q29udGV4dCggJ2V4cGVyaW1lbnRhbC13ZWJnbCcsIGNvbnRleHRBdHRyaWJ1dGVzICk7XG5cblx0XHRpZiAoIF9nbCA9PT0gbnVsbCApIHtcblxuXHRcdFx0aWYgKCBfY2FudmFzLmdldENvbnRleHQoICd3ZWJnbCcgKSAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHR0aHJvdyAnRXJyb3IgY3JlYXRpbmcgV2ViR0wgY29udGV4dCB3aXRoIHlvdXIgc2VsZWN0ZWQgYXR0cmlidXRlcy4nO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRocm93ICdFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0Lic7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIFNvbWUgZXhwZXJpbWVudGFsLXdlYmdsIGltcGxlbWVudGF0aW9ucyBkbyBub3QgaGF2ZSBnZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXRcblxuXHRcdGlmICggX2dsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRfZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdHJldHVybiB7ICdyYW5nZU1pbic6IDEsICdyYW5nZU1heCc6IDEsICdwcmVjaXNpb24nOiAxIH07XG5cblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHRfY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoICd3ZWJnbGNvbnRleHRsb3N0Jywgb25Db250ZXh0TG9zdCwgZmFsc2UgKTtcblxuXHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogJyArIGVycm9yICk7XG5cblx0fVxuXG5cdHZhciBleHRlbnNpb25zID0gbmV3IFdlYkdMRXh0ZW5zaW9ucyggX2dsICk7XG5cblx0ZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9kZXB0aF90ZXh0dXJlJyApO1xuXHRleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApO1xuXHRleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0X2xpbmVhcicgKTtcblx0ZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0JyApO1xuXHRleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyJyApO1xuXHRleHRlbnNpb25zLmdldCggJ09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcycgKTtcblx0ZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApO1xuXG5cdGlmICggZXh0ZW5zaW9ucy5nZXQoICdPRVNfZWxlbWVudF9pbmRleF91aW50JyApICkge1xuXG5cdFx0QnVmZmVyR2VvbWV0cnkuTWF4SW5kZXggPSA0Mjk0OTY3Mjk2O1xuXG5cdH1cblxuXHR2YXIgY2FwYWJpbGl0aWVzID0gbmV3IFdlYkdMQ2FwYWJpbGl0aWVzKCBfZ2wsIGV4dGVuc2lvbnMsIHBhcmFtZXRlcnMgKTtcblxuXHR2YXIgc3RhdGUgPSBuZXcgV2ViR0xTdGF0ZSggX2dsLCBleHRlbnNpb25zLCBwYXJhbVRocmVlVG9HTCApO1xuXG5cdHZhciBwcm9wZXJ0aWVzID0gbmV3IFdlYkdMUHJvcGVydGllcygpO1xuXHR2YXIgdGV4dHVyZXMgPSBuZXcgV2ViR0xUZXh0dXJlcyggX2dsLCBleHRlbnNpb25zLCBzdGF0ZSwgcHJvcGVydGllcywgY2FwYWJpbGl0aWVzLCBwYXJhbVRocmVlVG9HTCwgX2luZm9NZW1vcnkgKTtcblx0dmFyIGF0dHJpYnV0ZXMgPSBuZXcgV2ViR0xBdHRyaWJ1dGVzKCBfZ2wgKTtcblx0dmFyIGdlb21ldHJpZXMgPSBuZXcgV2ViR0xHZW9tZXRyaWVzKCBfZ2wsIGF0dHJpYnV0ZXMsIF9pbmZvTWVtb3J5ICk7XG5cdHZhciBvYmplY3RzID0gbmV3IFdlYkdMT2JqZWN0cyggX2dsLCBnZW9tZXRyaWVzLCBfaW5mb1JlbmRlciApO1xuXHR2YXIgcHJvZ3JhbUNhY2hlID0gbmV3IFdlYkdMUHJvZ3JhbXMoIHRoaXMsIGNhcGFiaWxpdGllcyApO1xuXHR2YXIgbGlnaHRDYWNoZSA9IG5ldyBXZWJHTExpZ2h0cygpO1xuXHR2YXIgcmVuZGVyTGlzdHMgPSBuZXcgV2ViR0xSZW5kZXJMaXN0cygpO1xuXG5cdHRoaXMuaW5mby5wcm9ncmFtcyA9IHByb2dyYW1DYWNoZS5wcm9ncmFtcztcblxuXHR2YXIgYnVmZmVyUmVuZGVyZXIgPSBuZXcgV2ViR0xCdWZmZXJSZW5kZXJlciggX2dsLCBleHRlbnNpb25zLCBfaW5mb1JlbmRlciApO1xuXHR2YXIgaW5kZXhlZEJ1ZmZlclJlbmRlcmVyID0gbmV3IFdlYkdMSW5kZXhlZEJ1ZmZlclJlbmRlcmVyKCBfZ2wsIGV4dGVuc2lvbnMsIF9pbmZvUmVuZGVyICk7XG5cblx0Ly9cblxuXHR2YXIgYmFja2dyb3VuZFBsYW5lQ2FtZXJhLCBiYWNrZ3JvdW5kUGxhbmVNZXNoO1xuXHR2YXIgYmFja2dyb3VuZEJveENhbWVyYSwgYmFja2dyb3VuZEJveE1lc2g7XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBnZXRUYXJnZXRQaXhlbFJhdGlvKCkge1xuXG5cdFx0cmV0dXJuIF9jdXJyZW50UmVuZGVyVGFyZ2V0ID09PSBudWxsID8gX3BpeGVsUmF0aW8gOiAxO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXREZWZhdWx0R0xTdGF0ZSgpIHtcblxuXHRcdHN0YXRlLmluaXQoKTtcblxuXHRcdHN0YXRlLnNjaXNzb3IoIF9jdXJyZW50U2Npc3Nvci5jb3B5KCBfc2Npc3NvciApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApICk7XG5cdFx0c3RhdGUudmlld3BvcnQoIF9jdXJyZW50Vmlld3BvcnQuY29weSggX3ZpZXdwb3J0ICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkgKTtcblxuXHRcdHN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoIF9jbGVhckNvbG9yLnIsIF9jbGVhckNvbG9yLmcsIF9jbGVhckNvbG9yLmIsIF9jbGVhckFscGhhLCBfcHJlbXVsdGlwbGllZEFscGhhICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlc2V0R0xTdGF0ZSgpIHtcblxuXHRcdF9jdXJyZW50UHJvZ3JhbSA9IG51bGw7XG5cdFx0X2N1cnJlbnRDYW1lcmEgPSBudWxsO1xuXG5cdFx0X2N1cnJlbnRHZW9tZXRyeVByb2dyYW0gPSAnJztcblx0XHRfY3VycmVudE1hdGVyaWFsSWQgPSAtIDE7XG5cblx0XHRzdGF0ZS5yZXNldCgpO1xuXG5cdH1cblxuXHRzZXREZWZhdWx0R0xTdGF0ZSgpO1xuXG5cdHRoaXMuY29udGV4dCA9IF9nbDtcblx0dGhpcy5jYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXM7XG5cdHRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7XG5cdHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG5cdHRoaXMuc3RhdGUgPSBzdGF0ZTtcblxuXHQvLyBzaGFkb3cgbWFwXG5cblx0dmFyIHNoYWRvd01hcCA9IG5ldyBXZWJHTFNoYWRvd01hcCggdGhpcywgX2xpZ2h0cywgb2JqZWN0cywgY2FwYWJpbGl0aWVzICk7XG5cblx0dGhpcy5zaGFkb3dNYXAgPSBzaGFkb3dNYXA7XG5cblxuXHQvLyBQbHVnaW5zXG5cblx0dmFyIHNwcml0ZVBsdWdpbiA9IG5ldyBTcHJpdGVQbHVnaW4oIHRoaXMsIHNwcml0ZXMgKTtcblx0dmFyIGxlbnNGbGFyZVBsdWdpbiA9IG5ldyBMZW5zRmxhcmVQbHVnaW4oIHRoaXMsIGxlbnNGbGFyZXMgKTtcblxuXHQvLyBBUElcblxuXHR0aGlzLmdldENvbnRleHQgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gX2dsO1xuXG5cdH07XG5cblx0dGhpcy5nZXRDb250ZXh0QXR0cmlidXRlcyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfZ2wuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKTtcblxuXHR9O1xuXG5cdHRoaXMuZm9yY2VDb250ZXh0TG9zcyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2xvc2VfY29udGV4dCcgKTtcblx0XHRpZiAoIGV4dGVuc2lvbiApIGV4dGVuc2lvbi5sb3NlQ29udGV4dCgpO1xuXG5cdH07XG5cblx0dGhpcy5nZXRNYXhBbmlzb3Ryb3B5ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIGNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCk7XG5cblx0fTtcblxuXHR0aGlzLmdldFByZWNpc2lvbiA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBjYXBhYmlsaXRpZXMucHJlY2lzaW9uO1xuXG5cdH07XG5cblx0dGhpcy5nZXRQaXhlbFJhdGlvID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9waXhlbFJhdGlvO1xuXG5cdH07XG5cblx0dGhpcy5zZXRQaXhlbFJhdGlvID0gZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdF9waXhlbFJhdGlvID0gdmFsdWU7XG5cblx0XHR0aGlzLnNldFNpemUoIF92aWV3cG9ydC56LCBfdmlld3BvcnQudywgZmFsc2UgKTtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0U2l6ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB7XG5cdFx0XHR3aWR0aDogX3dpZHRoLFxuXHRcdFx0aGVpZ2h0OiBfaGVpZ2h0XG5cdFx0fTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0U2l6ZSA9IGZ1bmN0aW9uICggd2lkdGgsIGhlaWdodCwgdXBkYXRlU3R5bGUgKSB7XG5cblx0XHRfd2lkdGggPSB3aWR0aDtcblx0XHRfaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdFx0X2NhbnZhcy53aWR0aCA9IHdpZHRoICogX3BpeGVsUmF0aW87XG5cdFx0X2NhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBfcGl4ZWxSYXRpbztcblxuXHRcdGlmICggdXBkYXRlU3R5bGUgIT09IGZhbHNlICkge1xuXG5cdFx0XHRfY2FudmFzLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xuXHRcdFx0X2NhbnZhcy5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5zZXRWaWV3cG9ydCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXG5cdH07XG5cblx0dGhpcy5zZXRWaWV3cG9ydCA9IGZ1bmN0aW9uICggeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcblxuXHRcdHN0YXRlLnZpZXdwb3J0KCBfdmlld3BvcnQuc2V0KCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkgKTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0U2Npc3NvciA9IGZ1bmN0aW9uICggeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcblxuXHRcdHN0YXRlLnNjaXNzb3IoIF9zY2lzc29yLnNldCggeCwgeSwgd2lkdGgsIGhlaWdodCApICk7XG5cblx0fTtcblxuXHR0aGlzLnNldFNjaXNzb3JUZXN0ID0gZnVuY3Rpb24gKCBib29sZWFuICkge1xuXG5cdFx0c3RhdGUuc2V0U2Npc3NvclRlc3QoIF9zY2lzc29yVGVzdCA9IGJvb2xlYW4gKTtcblxuXHR9O1xuXG5cdC8vIENsZWFyaW5nXG5cblx0dGhpcy5nZXRDbGVhckNvbG9yID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9jbGVhckNvbG9yO1xuXG5cdH07XG5cblx0dGhpcy5zZXRDbGVhckNvbG9yID0gZnVuY3Rpb24gKCBjb2xvciwgYWxwaGEgKSB7XG5cblx0XHRfY2xlYXJDb2xvci5zZXQoIGNvbG9yICk7XG5cblx0XHRfY2xlYXJBbHBoYSA9IGFscGhhICE9PSB1bmRlZmluZWQgPyBhbHBoYSA6IDE7XG5cblx0XHRzdGF0ZS5idWZmZXJzLmNvbG9yLnNldENsZWFyKCBfY2xlYXJDb2xvci5yLCBfY2xlYXJDb2xvci5nLCBfY2xlYXJDb2xvci5iLCBfY2xlYXJBbHBoYSwgX3ByZW11bHRpcGxpZWRBbHBoYSApO1xuXG5cdH07XG5cblx0dGhpcy5nZXRDbGVhckFscGhhID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9jbGVhckFscGhhO1xuXG5cdH07XG5cblx0dGhpcy5zZXRDbGVhckFscGhhID0gZnVuY3Rpb24gKCBhbHBoYSApIHtcblxuXHRcdF9jbGVhckFscGhhID0gYWxwaGE7XG5cblx0XHRzdGF0ZS5idWZmZXJzLmNvbG9yLnNldENsZWFyKCBfY2xlYXJDb2xvci5yLCBfY2xlYXJDb2xvci5nLCBfY2xlYXJDb2xvci5iLCBfY2xlYXJBbHBoYSwgX3ByZW11bHRpcGxpZWRBbHBoYSApO1xuXG5cdH07XG5cblx0dGhpcy5jbGVhciA9IGZ1bmN0aW9uICggY29sb3IsIGRlcHRoLCBzdGVuY2lsICkge1xuXG5cdFx0dmFyIGJpdHMgPSAwO1xuXG5cdFx0aWYgKCBjb2xvciA9PT0gdW5kZWZpbmVkIHx8IGNvbG9yICkgYml0cyB8PSBfZ2wuQ09MT1JfQlVGRkVSX0JJVDtcblx0XHRpZiAoIGRlcHRoID09PSB1bmRlZmluZWQgfHwgZGVwdGggKSBiaXRzIHw9IF9nbC5ERVBUSF9CVUZGRVJfQklUO1xuXHRcdGlmICggc3RlbmNpbCA9PT0gdW5kZWZpbmVkIHx8IHN0ZW5jaWwgKSBiaXRzIHw9IF9nbC5TVEVOQ0lMX0JVRkZFUl9CSVQ7XG5cblx0XHRfZ2wuY2xlYXIoIGJpdHMgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXJDb2xvciA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY2xlYXIoIHRydWUsIGZhbHNlLCBmYWxzZSApO1xuXG5cdH07XG5cblx0dGhpcy5jbGVhckRlcHRoID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5jbGVhciggZmFsc2UsIHRydWUsIGZhbHNlICk7XG5cblx0fTtcblxuXHR0aGlzLmNsZWFyU3RlbmNpbCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY2xlYXIoIGZhbHNlLCBmYWxzZSwgdHJ1ZSApO1xuXG5cdH07XG5cblx0dGhpcy5jbGVhclRhcmdldCA9IGZ1bmN0aW9uICggcmVuZGVyVGFyZ2V0LCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKSB7XG5cblx0XHR0aGlzLnNldFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cdFx0dGhpcy5jbGVhciggY29sb3IsIGRlcHRoLCBzdGVuY2lsICk7XG5cblx0fTtcblxuXHQvLyBSZXNldFxuXG5cdHRoaXMucmVzZXRHTFN0YXRlID0gcmVzZXRHTFN0YXRlO1xuXG5cdHRoaXMuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdF9jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dGxvc3QnLCBvbkNvbnRleHRMb3N0LCBmYWxzZSApO1xuXG5cdFx0cmVuZGVyTGlzdHMuZGlzcG9zZSgpO1xuXG5cdH07XG5cblx0Ly8gRXZlbnRzXG5cblx0ZnVuY3Rpb24gb25Db250ZXh0TG9zdCggZXZlbnQgKSB7XG5cblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0cmVzZXRHTFN0YXRlKCk7XG5cdFx0c2V0RGVmYXVsdEdMU3RhdGUoKTtcblxuXHRcdHByb3BlcnRpZXMuY2xlYXIoKTtcblx0XHRvYmplY3RzLmNsZWFyKCk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIG9uTWF0ZXJpYWxEaXNwb3NlKCBldmVudCApIHtcblxuXHRcdHZhciBtYXRlcmlhbCA9IGV2ZW50LnRhcmdldDtcblxuXHRcdG1hdGVyaWFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25NYXRlcmlhbERpc3Bvc2UgKTtcblxuXHRcdGRlYWxsb2NhdGVNYXRlcmlhbCggbWF0ZXJpYWwgKTtcblxuXHR9XG5cblx0Ly8gQnVmZmVyIGRlYWxsb2NhdGlvblxuXG5cdGZ1bmN0aW9uIGRlYWxsb2NhdGVNYXRlcmlhbCggbWF0ZXJpYWwgKSB7XG5cblx0XHRyZWxlYXNlTWF0ZXJpYWxQcm9ncmFtUmVmZXJlbmNlKCBtYXRlcmlhbCApO1xuXG5cdFx0cHJvcGVydGllcy5yZW1vdmUoIG1hdGVyaWFsICk7XG5cblx0fVxuXG5cblx0ZnVuY3Rpb24gcmVsZWFzZU1hdGVyaWFsUHJvZ3JhbVJlZmVyZW5jZSggbWF0ZXJpYWwgKSB7XG5cblx0XHR2YXIgcHJvZ3JhbUluZm8gPSBwcm9wZXJ0aWVzLmdldCggbWF0ZXJpYWwgKS5wcm9ncmFtO1xuXG5cdFx0bWF0ZXJpYWwucHJvZ3JhbSA9IHVuZGVmaW5lZDtcblxuXHRcdGlmICggcHJvZ3JhbUluZm8gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cHJvZ3JhbUNhY2hlLnJlbGVhc2VQcm9ncmFtKCBwcm9ncmFtSW5mbyApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBCdWZmZXIgcmVuZGVyaW5nXG5cblx0ZnVuY3Rpb24gcmVuZGVyT2JqZWN0SW1tZWRpYXRlKCBvYmplY3QsIHByb2dyYW0sIG1hdGVyaWFsICkge1xuXG5cdFx0b2JqZWN0LnJlbmRlciggZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRcdF90aGlzLnJlbmRlckJ1ZmZlckltbWVkaWF0ZSggb2JqZWN0LCBwcm9ncmFtLCBtYXRlcmlhbCApO1xuXG5cdFx0fSApO1xuXG5cdH1cblxuXHR0aGlzLnJlbmRlckJ1ZmZlckltbWVkaWF0ZSA9IGZ1bmN0aW9uICggb2JqZWN0LCBwcm9ncmFtLCBtYXRlcmlhbCApIHtcblxuXHRcdHN0YXRlLmluaXRBdHRyaWJ1dGVzKCk7XG5cblx0XHR2YXIgYnVmZmVycyA9IHByb3BlcnRpZXMuZ2V0KCBvYmplY3QgKTtcblxuXHRcdGlmICggb2JqZWN0Lmhhc1Bvc2l0aW9ucyAmJiAhIGJ1ZmZlcnMucG9zaXRpb24gKSBidWZmZXJzLnBvc2l0aW9uID0gX2dsLmNyZWF0ZUJ1ZmZlcigpO1xuXHRcdGlmICggb2JqZWN0Lmhhc05vcm1hbHMgJiYgISBidWZmZXJzLm5vcm1hbCApIGJ1ZmZlcnMubm9ybWFsID0gX2dsLmNyZWF0ZUJ1ZmZlcigpO1xuXHRcdGlmICggb2JqZWN0Lmhhc1V2cyAmJiAhIGJ1ZmZlcnMudXYgKSBidWZmZXJzLnV2ID0gX2dsLmNyZWF0ZUJ1ZmZlcigpO1xuXHRcdGlmICggb2JqZWN0Lmhhc0NvbG9ycyAmJiAhIGJ1ZmZlcnMuY29sb3IgKSBidWZmZXJzLmNvbG9yID0gX2dsLmNyZWF0ZUJ1ZmZlcigpO1xuXG5cdFx0dmFyIHByb2dyYW1BdHRyaWJ1dGVzID0gcHJvZ3JhbS5nZXRBdHRyaWJ1dGVzKCk7XG5cblx0XHRpZiAoIG9iamVjdC5oYXNQb3NpdGlvbnMgKSB7XG5cblx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXJzLnBvc2l0aW9uICk7XG5cdFx0XHRfZ2wuYnVmZmVyRGF0YSggX2dsLkFSUkFZX0JVRkZFUiwgb2JqZWN0LnBvc2l0aW9uQXJyYXksIF9nbC5EWU5BTUlDX0RSQVcgKTtcblxuXHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlcy5wb3NpdGlvbiApO1xuXHRcdFx0X2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGVzLnBvc2l0aW9uLCAzLCBfZ2wuRkxPQVQsIGZhbHNlLCAwLCAwICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG9iamVjdC5oYXNOb3JtYWxzICkge1xuXG5cdFx0XHRfZ2wuYmluZEJ1ZmZlciggX2dsLkFSUkFZX0JVRkZFUiwgYnVmZmVycy5ub3JtYWwgKTtcblxuXHRcdFx0aWYgKCAhIG1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgJiZcblx0XHRcdFx0ISBtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsICYmXG5cdFx0XHRcdCEgbWF0ZXJpYWwuaXNNZXNoTm9ybWFsTWF0ZXJpYWwgJiZcblx0XHRcdFx0bWF0ZXJpYWwuc2hhZGluZyA9PT0gRmxhdFNoYWRpbmcgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gb2JqZWN0LmNvdW50ICogMzsgaSA8IGw7IGkgKz0gOSApIHtcblxuXHRcdFx0XHRcdHZhciBhcnJheSA9IG9iamVjdC5ub3JtYWxBcnJheTtcblxuXHRcdFx0XHRcdHZhciBueCA9ICggYXJyYXlbIGkgKyAwIF0gKyBhcnJheVsgaSArIDMgXSArIGFycmF5WyBpICsgNiBdICkgLyAzO1xuXHRcdFx0XHRcdHZhciBueSA9ICggYXJyYXlbIGkgKyAxIF0gKyBhcnJheVsgaSArIDQgXSArIGFycmF5WyBpICsgNyBdICkgLyAzO1xuXHRcdFx0XHRcdHZhciBueiA9ICggYXJyYXlbIGkgKyAyIF0gKyBhcnJheVsgaSArIDUgXSArIGFycmF5WyBpICsgOCBdICkgLyAzO1xuXG5cdFx0XHRcdFx0YXJyYXlbIGkgKyAwIF0gPSBueDtcblx0XHRcdFx0XHRhcnJheVsgaSArIDEgXSA9IG55O1xuXHRcdFx0XHRcdGFycmF5WyBpICsgMiBdID0gbno7XG5cblx0XHRcdFx0XHRhcnJheVsgaSArIDMgXSA9IG54O1xuXHRcdFx0XHRcdGFycmF5WyBpICsgNCBdID0gbnk7XG5cdFx0XHRcdFx0YXJyYXlbIGkgKyA1IF0gPSBuejtcblxuXHRcdFx0XHRcdGFycmF5WyBpICsgNiBdID0gbng7XG5cdFx0XHRcdFx0YXJyYXlbIGkgKyA3IF0gPSBueTtcblx0XHRcdFx0XHRhcnJheVsgaSArIDggXSA9IG56O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRfZ2wuYnVmZmVyRGF0YSggX2dsLkFSUkFZX0JVRkZFUiwgb2JqZWN0Lm5vcm1hbEFycmF5LCBfZ2wuRFlOQU1JQ19EUkFXICk7XG5cblx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZXMubm9ybWFsICk7XG5cblx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlcy5ub3JtYWwsIDMsIF9nbC5GTE9BVCwgZmFsc2UsIDAsIDAgKTtcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0Lmhhc1V2cyAmJiBtYXRlcmlhbC5tYXAgKSB7XG5cblx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXJzLnV2ICk7XG5cdFx0XHRfZ2wuYnVmZmVyRGF0YSggX2dsLkFSUkFZX0JVRkZFUiwgb2JqZWN0LnV2QXJyYXksIF9nbC5EWU5BTUlDX0RSQVcgKTtcblxuXHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlcy51diApO1xuXG5cdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggYXR0cmlidXRlcy51diwgMiwgX2dsLkZMT0FULCBmYWxzZSwgMCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QuaGFzQ29sb3JzICYmIG1hdGVyaWFsLnZlcnRleENvbG9ycyAhPT0gTm9Db2xvcnMgKSB7XG5cblx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXJzLmNvbG9yICk7XG5cdFx0XHRfZ2wuYnVmZmVyRGF0YSggX2dsLkFSUkFZX0JVRkZFUiwgb2JqZWN0LmNvbG9yQXJyYXksIF9nbC5EWU5BTUlDX0RSQVcgKTtcblxuXHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlcy5jb2xvciApO1xuXG5cdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZXMuY29sb3IsIDMsIF9nbC5GTE9BVCwgZmFsc2UsIDAsIDAgKTtcblxuXHRcdH1cblxuXHRcdHN0YXRlLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCk7XG5cblx0XHRfZ2wuZHJhd0FycmF5cyggX2dsLlRSSUFOR0xFUywgMCwgb2JqZWN0LmNvdW50ICk7XG5cblx0XHRvYmplY3QuY291bnQgPSAwO1xuXG5cdH07XG5cblx0ZnVuY3Rpb24gYWJzTnVtZXJpY2FsU29ydCggYSwgYiApIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggYlsgMCBdICkgLSBNYXRoLmFicyggYVsgMCBdICk7XG5cblx0fVxuXG5cdHRoaXMucmVuZGVyQnVmZmVyRGlyZWN0ID0gZnVuY3Rpb24gKCBjYW1lcmEsIGZvZywgZ2VvbWV0cnksIG1hdGVyaWFsLCBvYmplY3QsIGdyb3VwICkge1xuXG5cdFx0c3RhdGUuc2V0TWF0ZXJpYWwoIG1hdGVyaWFsICk7XG5cblx0XHR2YXIgcHJvZ3JhbSA9IHNldFByb2dyYW0oIGNhbWVyYSwgZm9nLCBtYXRlcmlhbCwgb2JqZWN0ICk7XG5cdFx0dmFyIGdlb21ldHJ5UHJvZ3JhbSA9IGdlb21ldHJ5LmlkICsgJ18nICsgcHJvZ3JhbS5pZCArICdfJyArICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICk7XG5cblx0XHR2YXIgdXBkYXRlQnVmZmVycyA9IGZhbHNlO1xuXG5cdFx0aWYgKCBnZW9tZXRyeVByb2dyYW0gIT09IF9jdXJyZW50R2VvbWV0cnlQcm9ncmFtICkge1xuXG5cdFx0XHRfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9IGdlb21ldHJ5UHJvZ3JhbTtcblx0XHRcdHVwZGF0ZUJ1ZmZlcnMgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbW9ycGggdGFyZ2V0c1xuXG5cdFx0dmFyIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IG9iamVjdC5tb3JwaFRhcmdldEluZmx1ZW5jZXM7XG5cblx0XHRpZiAoIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBUT0RPIFJlbW92ZSBhbGxvY2F0aW9uc1xuXG5cdFx0XHR2YXIgYWN0aXZlSW5mbHVlbmNlcyA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBtb3JwaFRhcmdldEluZmx1ZW5jZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgaW5mbHVlbmNlID0gbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF07XG5cdFx0XHRcdGFjdGl2ZUluZmx1ZW5jZXMucHVzaCggWyBpbmZsdWVuY2UsIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGFjdGl2ZUluZmx1ZW5jZXMuc29ydCggYWJzTnVtZXJpY2FsU29ydCApO1xuXG5cdFx0XHRpZiAoIGFjdGl2ZUluZmx1ZW5jZXMubGVuZ3RoID4gOCApIHtcblxuXHRcdFx0XHRhY3RpdmVJbmZsdWVuY2VzLmxlbmd0aCA9IDg7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG1vcnBoQXR0cmlidXRlcyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcztcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gYWN0aXZlSW5mbHVlbmNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBpbmZsdWVuY2UgPSBhY3RpdmVJbmZsdWVuY2VzWyBpIF07XG5cdFx0XHRcdG1vcnBoSW5mbHVlbmNlc1sgaSBdID0gaW5mbHVlbmNlWyAwIF07XG5cblx0XHRcdFx0aWYgKCBpbmZsdWVuY2VbIDAgXSAhPT0gMCApIHtcblxuXHRcdFx0XHRcdHZhciBpbmRleCA9IGluZmx1ZW5jZVsgMSBdO1xuXG5cdFx0XHRcdFx0aWYgKCBtYXRlcmlhbC5tb3JwaFRhcmdldHMgPT09IHRydWUgJiYgbW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uICkgZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnbW9ycGhUYXJnZXQnICsgaSwgbW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uWyBpbmRleCBdICk7XG5cdFx0XHRcdFx0aWYgKCBtYXRlcmlhbC5tb3JwaE5vcm1hbHMgPT09IHRydWUgJiYgbW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCApIGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ21vcnBoTm9ybWFsJyArIGksIG1vcnBoQXR0cmlidXRlcy5ub3JtYWxbIGluZGV4IF0gKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aWYgKCBtYXRlcmlhbC5tb3JwaFRhcmdldHMgPT09IHRydWUgKSBnZW9tZXRyeS5yZW1vdmVBdHRyaWJ1dGUoICdtb3JwaFRhcmdldCcgKyBpICk7XG5cdFx0XHRcdFx0aWYgKCBtYXRlcmlhbC5tb3JwaE5vcm1hbHMgPT09IHRydWUgKSBnZW9tZXRyeS5yZW1vdmVBdHRyaWJ1dGUoICdtb3JwaE5vcm1hbCcgKyBpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIHZhciBpID0gYWN0aXZlSW5mbHVlbmNlcy5sZW5ndGgsIGlsID0gbW9ycGhJbmZsdWVuY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdG1vcnBoSW5mbHVlbmNlc1sgaSBdID0gMC4wO1xuXG5cdFx0XHR9XG5cblx0XHRcdHByb2dyYW0uZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZSggX2dsLCAnbW9ycGhUYXJnZXRJbmZsdWVuY2VzJywgbW9ycGhJbmZsdWVuY2VzICk7XG5cblx0XHRcdHVwZGF0ZUJ1ZmZlcnMgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdHZhciBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdHZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0dmFyIHJhbmdlRmFjdG9yID0gMTtcblxuXHRcdGlmICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICkge1xuXG5cdFx0XHRpbmRleCA9IGdlb21ldHJpZXMuZ2V0V2lyZWZyYW1lQXR0cmlidXRlKCBnZW9tZXRyeSApO1xuXHRcdFx0cmFuZ2VGYWN0b3IgPSAyO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHJlbmRlcmVyID0gYnVmZmVyUmVuZGVyZXI7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRyZW5kZXJlciA9IGluZGV4ZWRCdWZmZXJSZW5kZXJlcjtcblx0XHRcdHJlbmRlcmVyLnNldEluZGV4KCBpbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB1cGRhdGVCdWZmZXJzICkge1xuXG5cdFx0XHRzZXR1cFZlcnRleEF0dHJpYnV0ZXMoIG1hdGVyaWFsLCBwcm9ncmFtLCBnZW9tZXRyeSApO1xuXG5cdFx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGF0dHJpYnV0ZXMuZ2V0KCBpbmRleCApLmJ1ZmZlciApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0dmFyIGRhdGFDb3VudCA9IDA7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRkYXRhQ291bnQgPSBpbmRleC5jb3VudDtcblxuXHRcdH0gZWxzZSBpZiAoIHBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGRhdGFDb3VudCA9IHBvc2l0aW9uLmNvdW50O1xuXG5cdFx0fVxuXG5cdFx0dmFyIHJhbmdlU3RhcnQgPSBnZW9tZXRyeS5kcmF3UmFuZ2Uuc3RhcnQgKiByYW5nZUZhY3Rvcjtcblx0XHR2YXIgcmFuZ2VDb3VudCA9IGdlb21ldHJ5LmRyYXdSYW5nZS5jb3VudCAqIHJhbmdlRmFjdG9yO1xuXG5cdFx0dmFyIGdyb3VwU3RhcnQgPSBncm91cCAhPT0gbnVsbCA/IGdyb3VwLnN0YXJ0ICogcmFuZ2VGYWN0b3IgOiAwO1xuXHRcdHZhciBncm91cENvdW50ID0gZ3JvdXAgIT09IG51bGwgPyBncm91cC5jb3VudCAqIHJhbmdlRmFjdG9yIDogSW5maW5pdHk7XG5cblx0XHR2YXIgZHJhd1N0YXJ0ID0gTWF0aC5tYXgoIHJhbmdlU3RhcnQsIGdyb3VwU3RhcnQgKTtcblx0XHR2YXIgZHJhd0VuZCA9IE1hdGgubWluKCBkYXRhQ291bnQsIHJhbmdlU3RhcnQgKyByYW5nZUNvdW50LCBncm91cFN0YXJ0ICsgZ3JvdXBDb3VudCApIC0gMTtcblxuXHRcdHZhciBkcmF3Q291bnQgPSBNYXRoLm1heCggMCwgZHJhd0VuZCAtIGRyYXdTdGFydCArIDEgKTtcblxuXHRcdGlmICggZHJhd0NvdW50ID09PSAwICkgcmV0dXJuO1xuXG5cdFx0Ly9cblxuXHRcdGlmICggb2JqZWN0LmlzTWVzaCApIHtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC53aXJlZnJhbWUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0c3RhdGUuc2V0TGluZVdpZHRoKCBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGggKiBnZXRUYXJnZXRQaXhlbFJhdGlvKCkgKTtcblx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLkxJTkVTICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0c3dpdGNoICggb2JqZWN0LmRyYXdNb2RlICkge1xuXG5cdFx0XHRcdFx0Y2FzZSBUcmlhbmdsZXNEcmF3TW9kZTpcblx0XHRcdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5UUklBTkdMRVMgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSBUcmlhbmdsZVN0cmlwRHJhd01vZGU6XG5cdFx0XHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuVFJJQU5HTEVfU1RSSVAgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSBUcmlhbmdsZUZhbkRyYXdNb2RlOlxuXHRcdFx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLlRSSUFOR0xFX0ZBTiApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblxuXHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0xpbmUgKSB7XG5cblx0XHRcdHZhciBsaW5lV2lkdGggPSBtYXRlcmlhbC5saW5ld2lkdGg7XG5cblx0XHRcdGlmICggbGluZVdpZHRoID09PSB1bmRlZmluZWQgKSBsaW5lV2lkdGggPSAxOyAvLyBOb3QgdXNpbmcgTGluZSpNYXRlcmlhbFxuXG5cdFx0XHRzdGF0ZS5zZXRMaW5lV2lkdGgoIGxpbmVXaWR0aCAqIGdldFRhcmdldFBpeGVsUmF0aW8oKSApO1xuXG5cdFx0XHRpZiAoIG9iamVjdC5pc0xpbmVTZWdtZW50cyApIHtcblxuXHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuTElORVMgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTGluZUxvb3AgKSB7XG5cblx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLkxJTkVfTE9PUCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5MSU5FX1NUUklQICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc1BvaW50cyApIHtcblxuXHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLlBPSU5UUyApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ID4gMCApIHtcblxuXHRcdFx0XHRyZW5kZXJlci5yZW5kZXJJbnN0YW5jZXMoIGdlb21ldHJ5LCBkcmF3U3RhcnQsIGRyYXdDb3VudCApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZW5kZXJlci5yZW5kZXIoIGRyYXdTdGFydCwgZHJhd0NvdW50ICk7XG5cblx0XHR9XG5cblx0fTtcblxuXHRmdW5jdGlvbiBzZXR1cFZlcnRleEF0dHJpYnV0ZXMoIG1hdGVyaWFsLCBwcm9ncmFtLCBnZW9tZXRyeSwgc3RhcnRJbmRleCApIHtcblxuXHRcdGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0aWYgKCBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICkgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIuc2V0dXBWZXJ0ZXhBdHRyaWJ1dGVzOiB1c2luZyBUSFJFRS5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSBidXQgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBleHRlbnNpb24gQU5HTEVfaW5zdGFuY2VkX2FycmF5cy4nICk7XG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBzdGFydEluZGV4ID09PSB1bmRlZmluZWQgKSBzdGFydEluZGV4ID0gMDtcblxuXHRcdHN0YXRlLmluaXRBdHRyaWJ1dGVzKCk7XG5cblx0XHR2YXIgZ2VvbWV0cnlBdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblxuXHRcdHZhciBwcm9ncmFtQXR0cmlidXRlcyA9IHByb2dyYW0uZ2V0QXR0cmlidXRlcygpO1xuXG5cdFx0dmFyIG1hdGVyaWFsRGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyA9IG1hdGVyaWFsLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM7XG5cblx0XHRmb3IgKCB2YXIgbmFtZSBpbiBwcm9ncmFtQXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIHByb2dyYW1BdHRyaWJ1dGUgPSBwcm9ncmFtQXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdFx0XHRpZiAoIHByb2dyYW1BdHRyaWJ1dGUgPj0gMCApIHtcblxuXHRcdFx0XHR2YXIgZ2VvbWV0cnlBdHRyaWJ1dGUgPSBnZW9tZXRyeUF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5QXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR2YXIgbm9ybWFsaXplZCA9IGdlb21ldHJ5QXR0cmlidXRlLm5vcm1hbGl6ZWQ7XG5cdFx0XHRcdFx0dmFyIHNpemUgPSBnZW9tZXRyeUF0dHJpYnV0ZS5pdGVtU2l6ZTtcblxuXHRcdFx0XHRcdHZhciBhdHRyaWJ1dGVQcm9wZXJ0aWVzID0gYXR0cmlidXRlcy5nZXQoIGdlb21ldHJ5QXR0cmlidXRlICk7XG5cblx0XHRcdFx0XHR2YXIgYnVmZmVyID0gYXR0cmlidXRlUHJvcGVydGllcy5idWZmZXI7XG5cdFx0XHRcdFx0dmFyIHR5cGUgPSBhdHRyaWJ1dGVQcm9wZXJ0aWVzLnR5cGU7XG5cdFx0XHRcdFx0dmFyIGJ5dGVzUGVyRWxlbWVudCA9IGF0dHJpYnV0ZVByb3BlcnRpZXMuYnl0ZXNQZXJFbGVtZW50O1xuXG5cdFx0XHRcdFx0aWYgKCBnZW9tZXRyeUF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgZGF0YSA9IGdlb21ldHJ5QXR0cmlidXRlLmRhdGE7XG5cdFx0XHRcdFx0XHR2YXIgc3RyaWRlID0gZGF0YS5zdHJpZGU7XG5cdFx0XHRcdFx0XHR2YXIgb2Zmc2V0ID0gZ2VvbWV0cnlBdHRyaWJ1dGUub2Zmc2V0O1xuXG5cdFx0XHRcdFx0XHRpZiAoIGRhdGEgJiYgZGF0YS5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyICkge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoIHByb2dyYW1BdHRyaWJ1dGUsIGRhdGEubWVzaFBlckF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ID0gZGF0YS5tZXNoUGVyQXR0cmlidXRlICogZGF0YS5jb3VudDtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0X2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlciApO1xuXHRcdFx0XHRcdFx0X2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGUsIHNpemUsIHR5cGUsIG5vcm1hbGl6ZWQsIHN0cmlkZSAqIGJ5dGVzUGVyRWxlbWVudCwgKCBzdGFydEluZGV4ICogc3RyaWRlICsgb2Zmc2V0ICkgKiBieXRlc1BlckVsZW1lbnQgKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciggcHJvZ3JhbUF0dHJpYnV0ZSwgZ2VvbWV0cnlBdHRyaWJ1dGUubWVzaFBlckF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ID0gZ2VvbWV0cnlBdHRyaWJ1dGUubWVzaFBlckF0dHJpYnV0ZSAqIGdlb21ldHJ5QXR0cmlidXRlLmNvdW50O1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGUgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRfZ2wuYmluZEJ1ZmZlciggX2dsLkFSUkFZX0JVRkZFUiwgYnVmZmVyICk7XG5cdFx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZSwgc2l6ZSwgdHlwZSwgbm9ybWFsaXplZCwgMCwgc3RhcnRJbmRleCAqIHNpemUgKiBieXRlc1BlckVsZW1lbnQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbERlZmF1bHRBdHRyaWJ1dGVWYWx1ZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHZhciB2YWx1ZSA9IG1hdGVyaWFsRGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1sgbmFtZSBdO1xuXG5cdFx0XHRcdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRzd2l0Y2ggKCB2YWx1ZS5sZW5ndGggKSB7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSAyOlxuXHRcdFx0XHRcdFx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWIyZnYoIHByb2dyYW1BdHRyaWJ1dGUsIHZhbHVlICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSAzOlxuXHRcdFx0XHRcdFx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWIzZnYoIHByb2dyYW1BdHRyaWJ1dGUsIHZhbHVlICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSA0OlxuXHRcdFx0XHRcdFx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWI0ZnYoIHByb2dyYW1BdHRyaWJ1dGUsIHZhbHVlICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliMWZ2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRzdGF0ZS5kaXNhYmxlVW51c2VkQXR0cmlidXRlcygpO1xuXG5cdH1cblxuXHQvLyBDb21waWxlXG5cblx0dGhpcy5jb21waWxlID0gZnVuY3Rpb24gKCBzY2VuZSwgY2FtZXJhICkge1xuXG5cdFx0bGlnaHRzID0gW107XG5cblx0XHRzY2VuZS50cmF2ZXJzZSggZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRcdGlmICggb2JqZWN0LmlzTGlnaHQgKSB7XG5cblx0XHRcdFx0bGlnaHRzLnB1c2goIG9iamVjdCApO1xuXG5cdFx0XHR9XG5cblx0XHR9ICk7XG5cblx0XHRzZXR1cExpZ2h0cyggbGlnaHRzLCBjYW1lcmEgKTtcblxuXHRcdHNjZW5lLnRyYXZlcnNlKCBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdFx0aWYgKCBvYmplY3QubWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBvYmplY3QubWF0ZXJpYWwgKSApIHtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IG9iamVjdC5tYXRlcmlhbC5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGluaXRNYXRlcmlhbCggb2JqZWN0Lm1hdGVyaWFsWyBpIF0sIHNjZW5lLmZvZywgb2JqZWN0ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGluaXRNYXRlcmlhbCggb2JqZWN0Lm1hdGVyaWFsLCBzY2VuZS5mb2csIG9iamVjdCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSApO1xuXG5cdH07XG5cblx0Ly8gUmVuZGVyaW5nXG5cblx0dGhpcy5yZW5kZXIgPSBmdW5jdGlvbiAoIHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldCwgZm9yY2VDbGVhciApIHtcblxuXHRcdGlmICggY2FtZXJhICE9PSB1bmRlZmluZWQgJiYgY2FtZXJhLmlzQ2FtZXJhICE9PSB0cnVlICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXI6IGNhbWVyYSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQ2FtZXJhLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdC8vIHJlc2V0IGNhY2hpbmcgZm9yIHRoaXMgZnJhbWVcblxuXHRcdF9jdXJyZW50R2VvbWV0cnlQcm9ncmFtID0gJyc7XG5cdFx0X2N1cnJlbnRNYXRlcmlhbElkID0gLSAxO1xuXHRcdF9jdXJyZW50Q2FtZXJhID0gbnVsbDtcblxuXHRcdC8vIHVwZGF0ZSBzY2VuZSBncmFwaFxuXG5cdFx0aWYgKCBzY2VuZS5hdXRvVXBkYXRlID09PSB0cnVlICkgc2NlbmUudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHRcdC8vIHVwZGF0ZSBjYW1lcmEgbWF0cmljZXMgYW5kIGZydXN0dW1cblxuXHRcdGNhbWVyYS5vbkJlZm9yZVJlbmRlciggX3RoaXMgKTtcblxuXHRcdGlmICggY2FtZXJhLnBhcmVudCA9PT0gbnVsbCApIGNhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0Y2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNlKCBjYW1lcmEubWF0cml4V29ybGQgKTtcblxuXHRcdF9wcm9qU2NyZWVuTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XG5cdFx0X2ZydXN0dW0uc2V0RnJvbU1hdHJpeCggX3Byb2pTY3JlZW5NYXRyaXggKTtcblxuXHRcdGxpZ2h0cy5sZW5ndGggPSAwO1xuXHRcdHNwcml0ZXMubGVuZ3RoID0gMDtcblx0XHRsZW5zRmxhcmVzLmxlbmd0aCA9IDA7XG5cblx0XHRfbG9jYWxDbGlwcGluZ0VuYWJsZWQgPSB0aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkO1xuXHRcdF9jbGlwcGluZ0VuYWJsZWQgPSBfY2xpcHBpbmcuaW5pdCggdGhpcy5jbGlwcGluZ1BsYW5lcywgX2xvY2FsQ2xpcHBpbmdFbmFibGVkLCBjYW1lcmEgKTtcblxuXHRcdGN1cnJlbnRSZW5kZXJMaXN0ID0gcmVuZGVyTGlzdHMuZ2V0KCBzY2VuZSwgY2FtZXJhICk7XG5cdFx0Y3VycmVudFJlbmRlckxpc3QuaW5pdCgpO1xuXG5cdFx0cHJvamVjdE9iamVjdCggc2NlbmUsIGNhbWVyYSwgX3RoaXMuc29ydE9iamVjdHMgKTtcblxuXHRcdGN1cnJlbnRSZW5kZXJMaXN0LmZpbmlzaCgpO1xuXG5cdFx0aWYgKCBfdGhpcy5zb3J0T2JqZWN0cyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0Y3VycmVudFJlbmRlckxpc3Quc29ydCgpO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGlmICggX2NsaXBwaW5nRW5hYmxlZCApIF9jbGlwcGluZy5iZWdpblNoYWRvd3MoKTtcblxuXHRcdHNldHVwU2hhZG93cyggbGlnaHRzICk7XG5cblx0XHRzaGFkb3dNYXAucmVuZGVyKCBzY2VuZSwgY2FtZXJhICk7XG5cblx0XHRzZXR1cExpZ2h0cyggbGlnaHRzLCBjYW1lcmEgKTtcblxuXHRcdGlmICggX2NsaXBwaW5nRW5hYmxlZCApIF9jbGlwcGluZy5lbmRTaGFkb3dzKCk7XG5cblx0XHQvL1xuXG5cdFx0X2luZm9SZW5kZXIuZnJhbWUgKys7XG5cdFx0X2luZm9SZW5kZXIuY2FsbHMgPSAwO1xuXHRcdF9pbmZvUmVuZGVyLnZlcnRpY2VzID0gMDtcblx0XHRfaW5mb1JlbmRlci5mYWNlcyA9IDA7XG5cdFx0X2luZm9SZW5kZXIucG9pbnRzID0gMDtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHJlbmRlclRhcmdldCA9IG51bGw7XG5cblx0XHR9XG5cblx0XHR0aGlzLnNldFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHQvL1xuXG5cdFx0dmFyIGJhY2tncm91bmQgPSBzY2VuZS5iYWNrZ3JvdW5kO1xuXG5cdFx0aWYgKCBiYWNrZ3JvdW5kID09PSBudWxsICkge1xuXG5cdFx0XHRzdGF0ZS5idWZmZXJzLmNvbG9yLnNldENsZWFyKCBfY2xlYXJDb2xvci5yLCBfY2xlYXJDb2xvci5nLCBfY2xlYXJDb2xvci5iLCBfY2xlYXJBbHBoYSwgX3ByZW11bHRpcGxpZWRBbHBoYSApO1xuXG5cdFx0fSBlbHNlIGlmICggYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzQ29sb3IgKSB7XG5cblx0XHRcdHN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoIGJhY2tncm91bmQuciwgYmFja2dyb3VuZC5nLCBiYWNrZ3JvdW5kLmIsIDEsIF9wcmVtdWx0aXBsaWVkQWxwaGEgKTtcblx0XHRcdGZvcmNlQ2xlYXIgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmF1dG9DbGVhciB8fCBmb3JjZUNsZWFyICkge1xuXG5cdFx0XHR0aGlzLmNsZWFyKCB0aGlzLmF1dG9DbGVhckNvbG9yLCB0aGlzLmF1dG9DbGVhckRlcHRoLCB0aGlzLmF1dG9DbGVhclN0ZW5jaWwgKTtcblxuXHRcdH1cblxuXHRcdGlmICggYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzQ3ViZVRleHR1cmUgKSB7XG5cblx0XHRcdGlmICggYmFja2dyb3VuZEJveENhbWVyYSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGJhY2tncm91bmRCb3hDYW1lcmEgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTtcblxuXHRcdFx0XHRiYWNrZ3JvdW5kQm94TWVzaCA9IG5ldyBNZXNoKFxuXHRcdFx0XHRcdG5ldyBCb3hCdWZmZXJHZW9tZXRyeSggNSwgNSwgNSApLFxuXHRcdFx0XHRcdG5ldyBTaGFkZXJNYXRlcmlhbCgge1xuXHRcdFx0XHRcdFx0dW5pZm9ybXM6IFNoYWRlckxpYi5jdWJlLnVuaWZvcm1zLFxuXHRcdFx0XHRcdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJMaWIuY3ViZS52ZXJ0ZXhTaGFkZXIsXG5cdFx0XHRcdFx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyTGliLmN1YmUuZnJhZ21lbnRTaGFkZXIsXG5cdFx0XHRcdFx0XHRzaWRlOiBCYWNrU2lkZSxcblx0XHRcdFx0XHRcdGRlcHRoVGVzdDogZmFsc2UsXG5cdFx0XHRcdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcblx0XHRcdFx0XHRcdGZvZzogZmFsc2Vcblx0XHRcdFx0XHR9IClcblx0XHRcdFx0KTtcblxuXHRcdFx0fVxuXG5cdFx0XHRiYWNrZ3JvdW5kQm94Q2FtZXJhLnByb2plY3Rpb25NYXRyaXguY29weSggY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdFx0YmFja2dyb3VuZEJveENhbWVyYS5tYXRyaXhXb3JsZC5leHRyYWN0Um90YXRpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApO1xuXHRcdFx0YmFja2dyb3VuZEJveENhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSggYmFja2dyb3VuZEJveENhbWVyYS5tYXRyaXhXb3JsZCApO1xuXG5cblx0XHRcdGJhY2tncm91bmRCb3hNZXNoLm1hdGVyaWFsLnVuaWZvcm1zWyBcInRDdWJlXCIgXS52YWx1ZSA9IGJhY2tncm91bmQ7XG5cdFx0XHRiYWNrZ3JvdW5kQm94TWVzaC5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggYmFja2dyb3VuZEJveENhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsIGJhY2tncm91bmRCb3hNZXNoLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdG9iamVjdHMudXBkYXRlKCBiYWNrZ3JvdW5kQm94TWVzaCApO1xuXG5cdFx0XHRfdGhpcy5yZW5kZXJCdWZmZXJEaXJlY3QoIGJhY2tncm91bmRCb3hDYW1lcmEsIG51bGwsIGJhY2tncm91bmRCb3hNZXNoLmdlb21ldHJ5LCBiYWNrZ3JvdW5kQm94TWVzaC5tYXRlcmlhbCwgYmFja2dyb3VuZEJveE1lc2gsIG51bGwgKTtcblxuXHRcdH0gZWxzZSBpZiAoIGJhY2tncm91bmQgJiYgYmFja2dyb3VuZC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGlmICggYmFja2dyb3VuZFBsYW5lQ2FtZXJhID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0YmFja2dyb3VuZFBsYW5lQ2FtZXJhID0gbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSggLSAxLCAxLCAxLCAtIDEsIDAsIDEgKTtcblxuXHRcdFx0XHRiYWNrZ3JvdW5kUGxhbmVNZXNoID0gbmV3IE1lc2goXG5cdFx0XHRcdFx0bmV3IFBsYW5lQnVmZmVyR2VvbWV0cnkoIDIsIDIgKSxcblx0XHRcdFx0XHRuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgZGVwdGhUZXN0OiBmYWxzZSwgZGVwdGhXcml0ZTogZmFsc2UsIGZvZzogZmFsc2UgfSApXG5cdFx0XHRcdCk7XG5cblx0XHRcdH1cblxuXHRcdFx0YmFja2dyb3VuZFBsYW5lTWVzaC5tYXRlcmlhbC5tYXAgPSBiYWNrZ3JvdW5kO1xuXG5cdFx0XHRvYmplY3RzLnVwZGF0ZSggYmFja2dyb3VuZFBsYW5lTWVzaCApO1xuXG5cdFx0XHRfdGhpcy5yZW5kZXJCdWZmZXJEaXJlY3QoIGJhY2tncm91bmRQbGFuZUNhbWVyYSwgbnVsbCwgYmFja2dyb3VuZFBsYW5lTWVzaC5nZW9tZXRyeSwgYmFja2dyb3VuZFBsYW5lTWVzaC5tYXRlcmlhbCwgYmFja2dyb3VuZFBsYW5lTWVzaCwgbnVsbCApO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdHZhciBvcGFxdWVPYmplY3RzID0gY3VycmVudFJlbmRlckxpc3Qub3BhcXVlO1xuXHRcdHZhciB0cmFuc3BhcmVudE9iamVjdHMgPSBjdXJyZW50UmVuZGVyTGlzdC50cmFuc3BhcmVudDtcblxuXHRcdGlmICggc2NlbmUub3ZlcnJpZGVNYXRlcmlhbCApIHtcblxuXHRcdFx0dmFyIG92ZXJyaWRlTWF0ZXJpYWwgPSBzY2VuZS5vdmVycmlkZU1hdGVyaWFsO1xuXG5cdFx0XHRpZiAoIG9wYXF1ZU9iamVjdHMubGVuZ3RoICkgcmVuZGVyT2JqZWN0cyggb3BhcXVlT2JqZWN0cywgc2NlbmUsIGNhbWVyYSwgb3ZlcnJpZGVNYXRlcmlhbCApO1xuXHRcdFx0aWYgKCB0cmFuc3BhcmVudE9iamVjdHMubGVuZ3RoICkgcmVuZGVyT2JqZWN0cyggdHJhbnNwYXJlbnRPYmplY3RzLCBzY2VuZSwgY2FtZXJhLCBvdmVycmlkZU1hdGVyaWFsICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBvcGFxdWUgcGFzcyAoZnJvbnQtdG8tYmFjayBvcmRlcilcblxuXHRcdFx0aWYgKCBvcGFxdWVPYmplY3RzLmxlbmd0aCApIHJlbmRlck9iamVjdHMoIG9wYXF1ZU9iamVjdHMsIHNjZW5lLCBjYW1lcmEgKTtcblxuXHRcdFx0Ly8gdHJhbnNwYXJlbnQgcGFzcyAoYmFjay10by1mcm9udCBvcmRlcilcblxuXHRcdFx0aWYgKCB0cmFuc3BhcmVudE9iamVjdHMubGVuZ3RoICkgcmVuZGVyT2JqZWN0cyggdHJhbnNwYXJlbnRPYmplY3RzLCBzY2VuZSwgY2FtZXJhICk7XG5cblx0XHR9XG5cblx0XHQvLyBjdXN0b20gcmVuZGVyIHBsdWdpbnMgKHBvc3QgcGFzcylcblxuXHRcdHNwcml0ZVBsdWdpbi5yZW5kZXIoIHNjZW5lLCBjYW1lcmEgKTtcblx0XHRsZW5zRmxhcmVQbHVnaW4ucmVuZGVyKCBzY2VuZSwgY2FtZXJhLCBfY3VycmVudFZpZXdwb3J0ICk7XG5cblx0XHQvLyBHZW5lcmF0ZSBtaXBtYXAgaWYgd2UncmUgdXNpbmcgYW55IGtpbmQgb2YgbWlwbWFwIGZpbHRlcmluZ1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRcdHRleHR1cmVzLnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR9XG5cblx0XHQvLyBFbnN1cmUgZGVwdGggYnVmZmVyIHdyaXRpbmcgaXMgZW5hYmxlZCBzbyBpdCBjYW4gYmUgY2xlYXJlZCBvbiBuZXh0IHJlbmRlclxuXG5cdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCB0cnVlICk7XG5cdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRNYXNrKCB0cnVlICk7XG5cdFx0c3RhdGUuYnVmZmVycy5jb2xvci5zZXRNYXNrKCB0cnVlICk7XG5cblx0XHRpZiAoIGNhbWVyYS5pc0FycmF5Q2FtZXJhICYmIGNhbWVyYS5lbmFibGVkICkge1xuXG5cdFx0XHRfdGhpcy5zZXRTY2lzc29yVGVzdCggZmFsc2UgKTtcblxuXHRcdH1cblxuXHRcdGNhbWVyYS5vbkFmdGVyUmVuZGVyKCBfdGhpcyApO1xuXG5cdFx0Ly8gX2dsLmZpbmlzaCgpO1xuXG5cdH07XG5cblx0Lypcblx0Ly8gVE9ETyBEdXBsaWNhdGVkIGNvZGUgKEZydXN0dW0pXG5cblx0dmFyIF9zcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0ZnVuY3Rpb24gaXNPYmplY3RWaWV3YWJsZSggb2JqZWN0ICkge1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApXG5cdFx0XHRnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdF9zcGhlcmUuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKS5cblx0XHRhcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0cmV0dXJuIGlzU3BoZXJlVmlld2FibGUoIF9zcGhlcmUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gaXNTcHJpdGVWaWV3YWJsZSggc3ByaXRlICkge1xuXG5cdFx0X3NwaGVyZS5jZW50ZXIuc2V0KCAwLCAwLCAwICk7XG5cdFx0X3NwaGVyZS5yYWRpdXMgPSAwLjcwNzEwNjc4MTE4NjU0NzY7XG5cdFx0X3NwaGVyZS5hcHBseU1hdHJpeDQoIHNwcml0ZS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0cmV0dXJuIGlzU3BoZXJlVmlld2FibGUoIF9zcGhlcmUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gaXNTcGhlcmVWaWV3YWJsZSggc3BoZXJlICkge1xuXG5cdFx0aWYgKCAhIF9mcnVzdHVtLmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0dmFyIG51bVBsYW5lcyA9IF9jbGlwcGluZy5udW1QbGFuZXM7XG5cblx0XHRpZiAoIG51bVBsYW5lcyA9PT0gMCApIHJldHVybiB0cnVlO1xuXG5cdFx0dmFyIHBsYW5lcyA9IF90aGlzLmNsaXBwaW5nUGxhbmVzLFxuXG5cdFx0XHRjZW50ZXIgPSBzcGhlcmUuY2VudGVyLFxuXHRcdFx0bmVnUmFkID0gLSBzcGhlcmUucmFkaXVzLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRkbyB7XG5cblx0XHRcdC8vIG91dCB3aGVuIGRlZXBlciB0aGFuIHJhZGl1cyBpbiB0aGUgbmVnYXRpdmUgaGFsZnNwYWNlXG5cdFx0XHRpZiAoIHBsYW5lc1sgaSBdLmRpc3RhbmNlVG9Qb2ludCggY2VudGVyICkgPCBuZWdSYWQgKSByZXR1cm4gZmFsc2U7XG5cblx0XHR9IHdoaWxlICggKysgaSAhPT0gbnVtUGxhbmVzICk7XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblxuXHR9XG5cdCovXG5cblx0ZnVuY3Rpb24gcHJvamVjdE9iamVjdCggb2JqZWN0LCBjYW1lcmEsIHNvcnRPYmplY3RzICkge1xuXG5cdFx0aWYgKCAhIG9iamVjdC52aXNpYmxlICkgcmV0dXJuO1xuXG5cdFx0dmFyIHZpc2libGUgPSBvYmplY3QubGF5ZXJzLnRlc3QoIGNhbWVyYS5sYXllcnMgKTtcblxuXHRcdGlmICggdmlzaWJsZSApIHtcblxuXHRcdFx0aWYgKCBvYmplY3QuaXNMaWdodCApIHtcblxuXHRcdFx0XHRsaWdodHMucHVzaCggb2JqZWN0ICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc1Nwcml0ZSApIHtcblxuXHRcdFx0XHRpZiAoICEgb2JqZWN0LmZydXN0dW1DdWxsZWQgfHwgX2ZydXN0dW0uaW50ZXJzZWN0c1Nwcml0ZSggb2JqZWN0ICkgKSB7XG5cblx0XHRcdFx0XHRzcHJpdGVzLnB1c2goIG9iamVjdCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTGVuc0ZsYXJlICkge1xuXG5cdFx0XHRcdGxlbnNGbGFyZXMucHVzaCggb2JqZWN0ICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0ltbWVkaWF0ZVJlbmRlck9iamVjdCApIHtcblxuXHRcdFx0XHRpZiAoIHNvcnRPYmplY3RzICkge1xuXG5cdFx0XHRcdFx0X3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBvYmplY3QubWF0cml4V29ybGQgKVxuXHRcdFx0XHRcdFx0LmFwcGx5TWF0cml4NCggX3Byb2pTY3JlZW5NYXRyaXggKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBudWxsLCBvYmplY3QubWF0ZXJpYWwsIF92ZWN0b3IzLnosIG51bGwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTWVzaCB8fCBvYmplY3QuaXNMaW5lIHx8IG9iamVjdC5pc1BvaW50cyApIHtcblxuXHRcdFx0XHRpZiAoIG9iamVjdC5pc1NraW5uZWRNZXNoICkge1xuXG5cdFx0XHRcdFx0b2JqZWN0LnNrZWxldG9uLnVwZGF0ZSgpO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoICEgb2JqZWN0LmZydXN0dW1DdWxsZWQgfHwgX2ZydXN0dW0uaW50ZXJzZWN0c09iamVjdCggb2JqZWN0ICkgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHNvcnRPYmplY3RzICkge1xuXG5cdFx0XHRcdFx0XHRfdmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG9iamVjdC5tYXRyaXhXb3JsZCApXG5cdFx0XHRcdFx0XHRcdC5hcHBseU1hdHJpeDQoIF9wcm9qU2NyZWVuTWF0cml4ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3RzLnVwZGF0ZSggb2JqZWN0ICk7XG5cdFx0XHRcdFx0dmFyIG1hdGVyaWFsID0gb2JqZWN0Lm1hdGVyaWFsO1xuXG5cdFx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBncm91cHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHR2YXIgZ3JvdXAgPSBncm91cHNbIGkgXTtcblx0XHRcdFx0XHRcdFx0dmFyIGdyb3VwTWF0ZXJpYWwgPSBtYXRlcmlhbFsgZ3JvdXAubWF0ZXJpYWxJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggZ3JvdXBNYXRlcmlhbCAmJiBncm91cE1hdGVyaWFsLnZpc2libGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRjdXJyZW50UmVuZGVyTGlzdC5wdXNoKCBvYmplY3QsIGdlb21ldHJ5LCBncm91cE1hdGVyaWFsLCBfdmVjdG9yMy56LCBncm91cCApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwudmlzaWJsZSApIHtcblxuXHRcdFx0XHRcdFx0Y3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIF92ZWN0b3IzLnosIG51bGwgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHByb2plY3RPYmplY3QoIGNoaWxkcmVuWyBpIF0sIGNhbWVyYSwgc29ydE9iamVjdHMgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVyT2JqZWN0cyggcmVuZGVyTGlzdCwgc2NlbmUsIGNhbWVyYSwgb3ZlcnJpZGVNYXRlcmlhbCApIHtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHJlbmRlckxpc3QubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHJlbmRlckl0ZW0gPSByZW5kZXJMaXN0WyBpIF07XG5cblx0XHRcdHZhciBvYmplY3QgPSByZW5kZXJJdGVtLm9iamVjdDtcblx0XHRcdHZhciBnZW9tZXRyeSA9IHJlbmRlckl0ZW0uZ2VvbWV0cnk7XG5cdFx0XHR2YXIgbWF0ZXJpYWwgPSBvdmVycmlkZU1hdGVyaWFsID09PSB1bmRlZmluZWQgPyByZW5kZXJJdGVtLm1hdGVyaWFsIDogb3ZlcnJpZGVNYXRlcmlhbDtcblx0XHRcdHZhciBncm91cCA9IHJlbmRlckl0ZW0uZ3JvdXA7XG5cblx0XHRcdG9iamVjdC5vbkJlZm9yZVJlbmRlciggX3RoaXMsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblxuXHRcdFx0aWYgKCBjYW1lcmEuaXNBcnJheUNhbWVyYSAmJiBjYW1lcmEuZW5hYmxlZCApIHtcblxuXHRcdFx0XHR2YXIgY2FtZXJhcyA9IGNhbWVyYS5jYW1lcmFzO1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBjYW1lcmFzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIGNhbWVyYTIgPSBjYW1lcmFzWyBqIF07XG5cdFx0XHRcdFx0dmFyIGJvdW5kcyA9IGNhbWVyYTIuYm91bmRzO1xuXG5cdFx0XHRcdFx0X3RoaXMuc2V0Vmlld3BvcnQoXG5cdFx0XHRcdFx0XHRib3VuZHMueCAqIF93aWR0aCAqIF9waXhlbFJhdGlvLCBib3VuZHMueSAqIF9oZWlnaHQgKiBfcGl4ZWxSYXRpbyxcblx0XHRcdFx0XHRcdGJvdW5kcy56ICogX3dpZHRoICogX3BpeGVsUmF0aW8sIGJvdW5kcy53ICogX2hlaWdodCAqIF9waXhlbFJhdGlvXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRfdGhpcy5zZXRTY2lzc29yKFxuXHRcdFx0XHRcdFx0Ym91bmRzLnggKiBfd2lkdGggKiBfcGl4ZWxSYXRpbywgYm91bmRzLnkgKiBfaGVpZ2h0ICogX3BpeGVsUmF0aW8sXG5cdFx0XHRcdFx0XHRib3VuZHMueiAqIF93aWR0aCAqIF9waXhlbFJhdGlvLCBib3VuZHMudyAqIF9oZWlnaHQgKiBfcGl4ZWxSYXRpb1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0X3RoaXMuc2V0U2Npc3NvclRlc3QoIHRydWUgKTtcblxuXHRcdFx0XHRcdHJlbmRlck9iamVjdCggb2JqZWN0LCBzY2VuZSwgY2FtZXJhMiwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdG9iamVjdC5vbkFmdGVyUmVuZGVyKCBfdGhpcywgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApIHtcblxuXHRcdG9iamVjdC5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cdFx0b2JqZWN0Lm5vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIG9iamVjdC5tb2RlbFZpZXdNYXRyaXggKTtcblxuXHRcdGlmICggb2JqZWN0LmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0ICkge1xuXG5cdFx0XHRzdGF0ZS5zZXRNYXRlcmlhbCggbWF0ZXJpYWwgKTtcblxuXHRcdFx0dmFyIHByb2dyYW0gPSBzZXRQcm9ncmFtKCBjYW1lcmEsIHNjZW5lLmZvZywgbWF0ZXJpYWwsIG9iamVjdCApO1xuXG5cdFx0XHRfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9ICcnO1xuXG5cdFx0XHRyZW5kZXJPYmplY3RJbW1lZGlhdGUoIG9iamVjdCwgcHJvZ3JhbSwgbWF0ZXJpYWwgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdF90aGlzLnJlbmRlckJ1ZmZlckRpcmVjdCggY2FtZXJhLCBzY2VuZS5mb2csIGdlb21ldHJ5LCBtYXRlcmlhbCwgb2JqZWN0LCBncm91cCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBpbml0TWF0ZXJpYWwoIG1hdGVyaWFsLCBmb2csIG9iamVjdCApIHtcblxuXHRcdHZhciBtYXRlcmlhbFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggbWF0ZXJpYWwgKTtcblxuXHRcdHZhciBwYXJhbWV0ZXJzID0gcHJvZ3JhbUNhY2hlLmdldFBhcmFtZXRlcnMoXG5cdFx0XHRtYXRlcmlhbCwgX2xpZ2h0cywgZm9nLCBfY2xpcHBpbmcubnVtUGxhbmVzLCBfY2xpcHBpbmcubnVtSW50ZXJzZWN0aW9uLCBvYmplY3QgKTtcblxuXHRcdHZhciBjb2RlID0gcHJvZ3JhbUNhY2hlLmdldFByb2dyYW1Db2RlKCBtYXRlcmlhbCwgcGFyYW1ldGVycyApO1xuXG5cdFx0dmFyIHByb2dyYW0gPSBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbTtcblx0XHR2YXIgcHJvZ3JhbUNoYW5nZSA9IHRydWU7XG5cblx0XHRpZiAoIHByb2dyYW0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gbmV3IG1hdGVyaWFsXG5cdFx0XHRtYXRlcmlhbC5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uTWF0ZXJpYWxEaXNwb3NlICk7XG5cblx0XHR9IGVsc2UgaWYgKCBwcm9ncmFtLmNvZGUgIT09IGNvZGUgKSB7XG5cblx0XHRcdC8vIGNoYW5nZWQgZ2xzbCBvciBwYXJhbWV0ZXJzXG5cdFx0XHRyZWxlYXNlTWF0ZXJpYWxQcm9ncmFtUmVmZXJlbmNlKCBtYXRlcmlhbCApO1xuXG5cdFx0fSBlbHNlIGlmICggcGFyYW1ldGVycy5zaGFkZXJJRCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBzYW1lIGdsc2wgYW5kIHVuaWZvcm0gbGlzdFxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gb25seSByZWJ1aWxkIHVuaWZvcm0gbGlzdFxuXHRcdFx0cHJvZ3JhbUNoYW5nZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwcm9ncmFtQ2hhbmdlICkge1xuXG5cdFx0XHRpZiAoIHBhcmFtZXRlcnMuc2hhZGVySUQgKSB7XG5cblx0XHRcdFx0dmFyIHNoYWRlciA9IFNoYWRlckxpYlsgcGFyYW1ldGVycy5zaGFkZXJJRCBdO1xuXG5cdFx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5fX3dlYmdsU2hhZGVyID0ge1xuXHRcdFx0XHRcdG5hbWU6IG1hdGVyaWFsLnR5cGUsXG5cdFx0XHRcdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMuY2xvbmUoIHNoYWRlci51bmlmb3JtcyApLFxuXHRcdFx0XHRcdHZlcnRleFNoYWRlcjogc2hhZGVyLnZlcnRleFNoYWRlcixcblx0XHRcdFx0XHRmcmFnbWVudFNoYWRlcjogc2hhZGVyLmZyYWdtZW50U2hhZGVyXG5cdFx0XHRcdH07XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLl9fd2ViZ2xTaGFkZXIgPSB7XG5cdFx0XHRcdFx0bmFtZTogbWF0ZXJpYWwudHlwZSxcblx0XHRcdFx0XHR1bmlmb3JtczogbWF0ZXJpYWwudW5pZm9ybXMsXG5cdFx0XHRcdFx0dmVydGV4U2hhZGVyOiBtYXRlcmlhbC52ZXJ0ZXhTaGFkZXIsXG5cdFx0XHRcdFx0ZnJhZ21lbnRTaGFkZXI6IG1hdGVyaWFsLmZyYWdtZW50U2hhZGVyXG5cdFx0XHRcdH07XG5cblx0XHRcdH1cblxuXHRcdFx0bWF0ZXJpYWwuX193ZWJnbFNoYWRlciA9IG1hdGVyaWFsUHJvcGVydGllcy5fX3dlYmdsU2hhZGVyO1xuXG5cdFx0XHRwcm9ncmFtID0gcHJvZ3JhbUNhY2hlLmFjcXVpcmVQcm9ncmFtKCBtYXRlcmlhbCwgcGFyYW1ldGVycywgY29kZSApO1xuXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbSA9IHByb2dyYW07XG5cdFx0XHRtYXRlcmlhbC5wcm9ncmFtID0gcHJvZ3JhbTtcblxuXHRcdH1cblxuXHRcdHZhciBwcm9ncmFtQXR0cmlidXRlcyA9IHByb2dyYW0uZ2V0QXR0cmlidXRlcygpO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5tb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdG1hdGVyaWFsLm51bVN1cHBvcnRlZE1vcnBoVGFyZ2V0cyA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IF90aGlzLm1heE1vcnBoVGFyZ2V0czsgaSArKyApIHtcblxuXHRcdFx0XHRpZiAoIHByb2dyYW1BdHRyaWJ1dGVzWyAnbW9ycGhUYXJnZXQnICsgaSBdID49IDAgKSB7XG5cblx0XHRcdFx0XHRtYXRlcmlhbC5udW1TdXBwb3J0ZWRNb3JwaFRhcmdldHMgKys7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1vcnBoTm9ybWFscyApIHtcblxuXHRcdFx0bWF0ZXJpYWwubnVtU3VwcG9ydGVkTW9ycGhOb3JtYWxzID0gMDtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgX3RoaXMubWF4TW9ycGhOb3JtYWxzOyBpICsrICkge1xuXG5cdFx0XHRcdGlmICggcHJvZ3JhbUF0dHJpYnV0ZXNbICdtb3JwaE5vcm1hbCcgKyBpIF0gPj0gMCApIHtcblxuXHRcdFx0XHRcdG1hdGVyaWFsLm51bVN1cHBvcnRlZE1vcnBoTm9ybWFscyArKztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciB1bmlmb3JtcyA9IG1hdGVyaWFsUHJvcGVydGllcy5fX3dlYmdsU2hhZGVyLnVuaWZvcm1zO1xuXG5cdFx0aWYgKCAhIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgJiZcblx0XHRcdCEgbWF0ZXJpYWwuaXNSYXdTaGFkZXJNYXRlcmlhbCB8fFxuXHRcdFx0bWF0ZXJpYWwuY2xpcHBpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5udW1DbGlwcGluZ1BsYW5lcyA9IF9jbGlwcGluZy5udW1QbGFuZXM7XG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMubnVtSW50ZXJzZWN0aW9uID0gX2NsaXBwaW5nLm51bUludGVyc2VjdGlvbjtcblx0XHRcdHVuaWZvcm1zLmNsaXBwaW5nUGxhbmVzID0gX2NsaXBwaW5nLnVuaWZvcm07XG5cblx0XHR9XG5cblx0XHRtYXRlcmlhbFByb3BlcnRpZXMuZm9nID0gZm9nO1xuXG5cdFx0Ly8gc3RvcmUgdGhlIGxpZ2h0IHNldHVwIGl0IHdhcyBjcmVhdGVkIGZvclxuXG5cdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLmxpZ2h0c0hhc2ggPSBfbGlnaHRzLmhhc2g7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmxpZ2h0cyApIHtcblxuXHRcdFx0Ly8gd2lyZSB1cCB0aGUgbWF0ZXJpYWwgdG8gdGhpcyByZW5kZXJlcidzIGxpZ2h0aW5nIHN0YXRlXG5cblx0XHRcdHVuaWZvcm1zLmFtYmllbnRMaWdodENvbG9yLnZhbHVlID0gX2xpZ2h0cy5hbWJpZW50O1xuXHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uYWxMaWdodHMudmFsdWUgPSBfbGlnaHRzLmRpcmVjdGlvbmFsO1xuXHRcdFx0dW5pZm9ybXMuc3BvdExpZ2h0cy52YWx1ZSA9IF9saWdodHMuc3BvdDtcblx0XHRcdHVuaWZvcm1zLnJlY3RBcmVhTGlnaHRzLnZhbHVlID0gX2xpZ2h0cy5yZWN0QXJlYTtcblx0XHRcdHVuaWZvcm1zLnBvaW50TGlnaHRzLnZhbHVlID0gX2xpZ2h0cy5wb2ludDtcblx0XHRcdHVuaWZvcm1zLmhlbWlzcGhlcmVMaWdodHMudmFsdWUgPSBfbGlnaHRzLmhlbWk7XG5cblx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbmFsU2hhZG93TWFwLnZhbHVlID0gX2xpZ2h0cy5kaXJlY3Rpb25hbFNoYWRvd01hcDtcblx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4LnZhbHVlID0gX2xpZ2h0cy5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeDtcblx0XHRcdHVuaWZvcm1zLnNwb3RTaGFkb3dNYXAudmFsdWUgPSBfbGlnaHRzLnNwb3RTaGFkb3dNYXA7XG5cdFx0XHR1bmlmb3Jtcy5zcG90U2hhZG93TWF0cml4LnZhbHVlID0gX2xpZ2h0cy5zcG90U2hhZG93TWF0cml4O1xuXHRcdFx0dW5pZm9ybXMucG9pbnRTaGFkb3dNYXAudmFsdWUgPSBfbGlnaHRzLnBvaW50U2hhZG93TWFwO1xuXHRcdFx0dW5pZm9ybXMucG9pbnRTaGFkb3dNYXRyaXgudmFsdWUgPSBfbGlnaHRzLnBvaW50U2hhZG93TWF0cml4O1xuXHRcdFx0Ly8gVE9ETyAoYWJlbG5hdGlvbik6IGFkZCBhcmVhIGxpZ2h0cyBzaGFkb3cgaW5mbyB0byB1bmlmb3Jtc1xuXG5cdFx0fVxuXG5cdFx0dmFyIHByb2dVbmlmb3JtcyA9IG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtLmdldFVuaWZvcm1zKCksXG5cdFx0XHR1bmlmb3Jtc0xpc3QgPVxuXHRcdFx0XHRXZWJHTFVuaWZvcm1zLnNlcVdpdGhWYWx1ZSggcHJvZ1VuaWZvcm1zLnNlcSwgdW5pZm9ybXMgKTtcblxuXHRcdG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3Jtc0xpc3QgPSB1bmlmb3Jtc0xpc3Q7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFByb2dyYW0oIGNhbWVyYSwgZm9nLCBtYXRlcmlhbCwgb2JqZWN0ICkge1xuXG5cdFx0X3VzZWRUZXh0dXJlVW5pdHMgPSAwO1xuXG5cdFx0dmFyIG1hdGVyaWFsUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApO1xuXG5cdFx0aWYgKCBfY2xpcHBpbmdFbmFibGVkICkge1xuXG5cdFx0XHRpZiAoIF9sb2NhbENsaXBwaW5nRW5hYmxlZCB8fCBjYW1lcmEgIT09IF9jdXJyZW50Q2FtZXJhICkge1xuXG5cdFx0XHRcdHZhciB1c2VDYWNoZSA9XG5cdFx0XHRcdFx0Y2FtZXJhID09PSBfY3VycmVudENhbWVyYSAmJlxuXHRcdFx0XHRcdG1hdGVyaWFsLmlkID09PSBfY3VycmVudE1hdGVyaWFsSWQ7XG5cblx0XHRcdFx0Ly8gd2UgbWlnaHQgd2FudCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBzb21lIENsaXBwaW5nR3JvdXBcblx0XHRcdFx0Ly8gb2JqZWN0IGluc3RlYWQgb2YgdGhlIG1hdGVyaWFsLCBvbmNlIGl0IGJlY29tZXMgZmVhc2libGVcblx0XHRcdFx0Ly8gKCM4NDY1LCAjODM3OSlcblx0XHRcdFx0X2NsaXBwaW5nLnNldFN0YXRlKFxuXHRcdFx0XHRcdG1hdGVyaWFsLmNsaXBwaW5nUGxhbmVzLCBtYXRlcmlhbC5jbGlwSW50ZXJzZWN0aW9uLCBtYXRlcmlhbC5jbGlwU2hhZG93cyxcblx0XHRcdFx0XHRjYW1lcmEsIG1hdGVyaWFsUHJvcGVydGllcywgdXNlQ2FjaGUgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLnByb2dyYW0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmZvZyAmJiBtYXRlcmlhbFByb3BlcnRpZXMuZm9nICE9PSBmb2cgKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5saWdodHMgJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLmxpZ2h0c0hhc2ggIT09IF9saWdodHMuaGFzaCApIHtcblxuXHRcdFx0XHRtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsUHJvcGVydGllcy5udW1DbGlwcGluZ1BsYW5lcyAhPT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdCggbWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUNsaXBwaW5nUGxhbmVzICE9PSBfY2xpcHBpbmcubnVtUGxhbmVzIHx8XG5cdFx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5udW1JbnRlcnNlY3Rpb24gIT09IF9jbGlwcGluZy5udW1JbnRlcnNlY3Rpb24gKSApIHtcblxuXHRcdFx0XHRtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubmVlZHNVcGRhdGUgKSB7XG5cblx0XHRcdGluaXRNYXRlcmlhbCggbWF0ZXJpYWwsIGZvZywgb2JqZWN0ICk7XG5cdFx0XHRtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHJlZnJlc2hQcm9ncmFtID0gZmFsc2U7XG5cdFx0dmFyIHJlZnJlc2hNYXRlcmlhbCA9IGZhbHNlO1xuXHRcdHZhciByZWZyZXNoTGlnaHRzID0gZmFsc2U7XG5cblx0XHR2YXIgcHJvZ3JhbSA9IG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtLFxuXHRcdFx0cF91bmlmb3JtcyA9IHByb2dyYW0uZ2V0VW5pZm9ybXMoKSxcblx0XHRcdG1fdW5pZm9ybXMgPSBtYXRlcmlhbFByb3BlcnRpZXMuX193ZWJnbFNoYWRlci51bmlmb3JtcztcblxuXHRcdGlmICggcHJvZ3JhbS5pZCAhPT0gX2N1cnJlbnRQcm9ncmFtICkge1xuXG5cdFx0XHRfZ2wudXNlUHJvZ3JhbSggcHJvZ3JhbS5wcm9ncmFtICk7XG5cdFx0XHRfY3VycmVudFByb2dyYW0gPSBwcm9ncmFtLmlkO1xuXG5cdFx0XHRyZWZyZXNoUHJvZ3JhbSA9IHRydWU7XG5cdFx0XHRyZWZyZXNoTWF0ZXJpYWwgPSB0cnVlO1xuXHRcdFx0cmVmcmVzaExpZ2h0cyA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmlkICE9PSBfY3VycmVudE1hdGVyaWFsSWQgKSB7XG5cblx0XHRcdF9jdXJyZW50TWF0ZXJpYWxJZCA9IG1hdGVyaWFsLmlkO1xuXG5cdFx0XHRyZWZyZXNoTWF0ZXJpYWwgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCByZWZyZXNoUHJvZ3JhbSB8fCBjYW1lcmEgIT09IF9jdXJyZW50Q2FtZXJhICkge1xuXG5cdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdwcm9qZWN0aW9uTWF0cml4JywgY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdFx0aWYgKCBjYXBhYmlsaXRpZXMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciApIHtcblxuXHRcdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdsb2dEZXB0aEJ1ZkZDJyxcblx0XHRcdFx0XHQyLjAgLyAoIE1hdGgubG9nKCBjYW1lcmEuZmFyICsgMS4wICkgLyBNYXRoLkxOMiApICk7XG5cblx0XHRcdH1cblxuXG5cdFx0XHRpZiAoIGNhbWVyYSAhPT0gX2N1cnJlbnRDYW1lcmEgKSB7XG5cblx0XHRcdFx0X2N1cnJlbnRDYW1lcmEgPSBjYW1lcmE7XG5cblx0XHRcdFx0Ly8gbGlnaHRpbmcgdW5pZm9ybXMgZGVwZW5kIG9uIHRoZSBjYW1lcmEgc28gZW5mb3JjZSBhbiB1cGRhdGVcblx0XHRcdFx0Ly8gbm93LCBpbiBjYXNlIHRoaXMgbWF0ZXJpYWwgc3VwcG9ydHMgbGlnaHRzIC0gb3IgbGF0ZXIsIHdoZW5cblx0XHRcdFx0Ly8gdGhlIG5leHQgbWF0ZXJpYWwgdGhhdCBkb2VzIGdldHMgYWN0aXZhdGVkOlxuXG5cdFx0XHRcdHJlZnJlc2hNYXRlcmlhbCA9IHRydWU7XHRcdC8vIHNldCB0byB0cnVlIG9uIG1hdGVyaWFsIGNoYW5nZVxuXHRcdFx0XHRyZWZyZXNoTGlnaHRzID0gdHJ1ZTtcdFx0Ly8gcmVtYWlucyBzZXQgdW50aWwgdXBkYXRlIGRvbmVcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBsb2FkIG1hdGVyaWFsIHNwZWNpZmljIHVuaWZvcm1zXG5cdFx0XHQvLyAoc2hhZGVyIG1hdGVyaWFsIGFsc28gZ2V0cyB0aGVtIGZvciB0aGUgc2FrZSBvZiBnZW5lcmljaXR5KVxuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmVudk1hcCApIHtcblxuXHRcdFx0XHR2YXIgdUNhbVBvcyA9IHBfdW5pZm9ybXMubWFwLmNhbWVyYVBvc2l0aW9uO1xuXG5cdFx0XHRcdGlmICggdUNhbVBvcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dUNhbVBvcy5zZXRWYWx1ZSggX2dsLFxuXHRcdFx0XHRcdFx0X3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaEJhc2ljTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLnNraW5uaW5nICkge1xuXG5cdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3ZpZXdNYXRyaXgnLCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAndG9uZU1hcHBpbmdFeHBvc3VyZScsIF90aGlzLnRvbmVNYXBwaW5nRXhwb3N1cmUgKTtcblx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3RvbmVNYXBwaW5nV2hpdGVQb2ludCcsIF90aGlzLnRvbmVNYXBwaW5nV2hpdGVQb2ludCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2tpbm5pbmcgdW5pZm9ybXMgbXVzdCBiZSBzZXQgZXZlbiBpZiBtYXRlcmlhbCBkaWRuJ3QgY2hhbmdlXG5cdFx0Ly8gYXV0by1zZXR0aW5nIG9mIHRleHR1cmUgdW5pdCBmb3IgYm9uZSB0ZXh0dXJlIG11c3QgZ28gYmVmb3JlIG90aGVyIHRleHR1cmVzXG5cdFx0Ly8gbm90IHN1cmUgd2h5LCBidXQgb3RoZXJ3aXNlIHdlaXJkIHRoaW5ncyBoYXBwZW5cblxuXHRcdGlmICggbWF0ZXJpYWwuc2tpbm5pbmcgKSB7XG5cblx0XHRcdHBfdW5pZm9ybXMuc2V0T3B0aW9uYWwoIF9nbCwgb2JqZWN0LCAnYmluZE1hdHJpeCcgKTtcblx0XHRcdHBfdW5pZm9ybXMuc2V0T3B0aW9uYWwoIF9nbCwgb2JqZWN0LCAnYmluZE1hdHJpeEludmVyc2UnICk7XG5cblx0XHRcdHZhciBza2VsZXRvbiA9IG9iamVjdC5za2VsZXRvbjtcblxuXHRcdFx0aWYgKCBza2VsZXRvbiApIHtcblxuXHRcdFx0XHR2YXIgYm9uZXMgPSBza2VsZXRvbi5ib25lcztcblxuXHRcdFx0XHRpZiAoIGNhcGFiaWxpdGllcy5mbG9hdFZlcnRleFRleHR1cmVzICkge1xuXG5cdFx0XHRcdFx0aWYgKCBza2VsZXRvbi5ib25lVGV4dHVyZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHQvLyBsYXlvdXQgKDEgbWF0cml4ID0gNCBwaXhlbHMpXG5cdFx0XHRcdFx0XHQvLyAgICAgIFJHQkEgUkdCQSBSR0JBIFJHQkEgKD0+IGNvbHVtbjEsIGNvbHVtbjIsIGNvbHVtbjMsIGNvbHVtbjQpXG5cdFx0XHRcdFx0XHQvLyAgd2l0aCAgOHg4ICBwaXhlbCB0ZXh0dXJlIG1heCAgIDE2IGJvbmVzICogNCBwaXhlbHMgPSAgKDggKiA4KVxuXHRcdFx0XHRcdFx0Ly8gICAgICAgMTZ4MTYgcGl4ZWwgdGV4dHVyZSBtYXggICA2NCBib25lcyAqIDQgcGl4ZWxzID0gKDE2ICogMTYpXG5cdFx0XHRcdFx0XHQvLyAgICAgICAzMngzMiBwaXhlbCB0ZXh0dXJlIG1heCAgMjU2IGJvbmVzICogNCBwaXhlbHMgPSAoMzIgKiAzMilcblx0XHRcdFx0XHRcdC8vICAgICAgIDY0eDY0IHBpeGVsIHRleHR1cmUgbWF4IDEwMjQgYm9uZXMgKiA0IHBpeGVscyA9ICg2NCAqIDY0KVxuXG5cblx0XHRcdFx0XHRcdHZhciBzaXplID0gTWF0aC5zcXJ0KCBib25lcy5sZW5ndGggKiA0ICk7IC8vIDQgcGl4ZWxzIG5lZWRlZCBmb3IgMSBtYXRyaXhcblx0XHRcdFx0XHRcdHNpemUgPSBfTWF0aC5uZXh0UG93ZXJPZlR3byggTWF0aC5jZWlsKCBzaXplICkgKTtcblx0XHRcdFx0XHRcdHNpemUgPSBNYXRoLm1heCggc2l6ZSwgNCApO1xuXG5cdFx0XHRcdFx0XHR2YXIgYm9uZU1hdHJpY2VzID0gbmV3IEZsb2F0MzJBcnJheSggc2l6ZSAqIHNpemUgKiA0ICk7IC8vIDQgZmxvYXRzIHBlciBSR0JBIHBpeGVsXG5cdFx0XHRcdFx0XHRib25lTWF0cmljZXMuc2V0KCBza2VsZXRvbi5ib25lTWF0cmljZXMgKTsgLy8gY29weSBjdXJyZW50IHZhbHVlc1xuXG5cdFx0XHRcdFx0XHR2YXIgYm9uZVRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoIGJvbmVNYXRyaWNlcywgc2l6ZSwgc2l6ZSwgUkdCQUZvcm1hdCwgRmxvYXRUeXBlICk7XG5cblx0XHRcdFx0XHRcdHNrZWxldG9uLmJvbmVNYXRyaWNlcyA9IGJvbmVNYXRyaWNlcztcblx0XHRcdFx0XHRcdHNrZWxldG9uLmJvbmVUZXh0dXJlID0gYm9uZVRleHR1cmU7XG5cdFx0XHRcdFx0XHRza2VsZXRvbi5ib25lVGV4dHVyZVNpemUgPSBzaXplO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnYm9uZVRleHR1cmUnLCBza2VsZXRvbi5ib25lVGV4dHVyZSApO1xuXHRcdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2JvbmVUZXh0dXJlU2l6ZScsIHNrZWxldG9uLmJvbmVUZXh0dXJlU2l6ZSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRwX3VuaWZvcm1zLnNldE9wdGlvbmFsKCBfZ2wsIHNrZWxldG9uLCAnYm9uZU1hdHJpY2VzJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCByZWZyZXNoTWF0ZXJpYWwgKSB7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwubGlnaHRzICkge1xuXG5cdFx0XHRcdC8vIHRoZSBjdXJyZW50IG1hdGVyaWFsIHJlcXVpcmVzIGxpZ2h0aW5nIGluZm9cblxuXHRcdFx0XHQvLyBub3RlOiBhbGwgbGlnaHRpbmcgdW5pZm9ybXMgYXJlIGFsd2F5cyBzZXQgY29ycmVjdGx5XG5cdFx0XHRcdC8vIHRoZXkgc2ltcGx5IHJlZmVyZW5jZSB0aGUgcmVuZGVyZXIncyBzdGF0ZSBmb3IgdGhlaXJcblx0XHRcdFx0Ly8gdmFsdWVzXG5cdFx0XHRcdC8vXG5cdFx0XHRcdC8vIHVzZSB0aGUgY3VycmVudCBtYXRlcmlhbCdzIC5uZWVkc1VwZGF0ZSBmbGFncyB0byBzZXRcblx0XHRcdFx0Ly8gdGhlIEdMIHN0YXRlIHdoZW4gcmVxdWlyZWRcblxuXHRcdFx0XHRtYXJrVW5pZm9ybXNMaWdodHNOZWVkc1VwZGF0ZSggbV91bmlmb3JtcywgcmVmcmVzaExpZ2h0cyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHJlZnJlc2ggdW5pZm9ybXMgY29tbW9uIHRvIHNldmVyYWwgbWF0ZXJpYWxzXG5cblx0XHRcdGlmICggZm9nICYmIG1hdGVyaWFsLmZvZyApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNGb2coIG1fdW5pZm9ybXMsIGZvZyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggbWF0ZXJpYWwuaXNNZXNoQmFzaWNNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hMYW1iZXJ0TWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaE5vcm1hbE1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaERlcHRoTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHJlZnJlc2ggc2luZ2xlIG1hdGVyaWFsIHNwZWNpZmljIHVuaWZvcm1zXG5cblx0XHRcdGlmICggbWF0ZXJpYWwuaXNMaW5lQmFzaWNNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNMaW5lKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc0xpbmVEYXNoZWRNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNMaW5lKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNEYXNoKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc1BvaW50c01hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc1BvaW50cyggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0xhbWJlcnQoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaFRvb25NYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNUb29uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hQaG9uZ01hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc1Bob25nKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hQaHlzaWNhbE1hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc1BoeXNpY2FsKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc1N0YW5kYXJkKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hEZXB0aE1hdGVyaWFsICkge1xuXG5cdFx0XHRcdGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkge1xuXG5cdFx0XHRcdFx0bV91bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0XHRcdFx0bV91bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0XHRcdG1fdW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hOb3JtYWxNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNOb3JtYWwoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVjdEFyZWFMaWdodCBUZXh0dXJlXG5cdFx0XHQvLyBUT0RPIChtcmRvb2IpOiBGaW5kIGEgbmljZXIgaW1wbGVtZW50YXRpb25cblxuXHRcdFx0aWYgKCBtX3VuaWZvcm1zLmx0Y01hdCAhPT0gdW5kZWZpbmVkICkgbV91bmlmb3Jtcy5sdGNNYXQudmFsdWUgPSBVbmlmb3Jtc0xpYi5MVENfTUFUX1RFWFRVUkU7XG5cdFx0XHRpZiAoIG1fdW5pZm9ybXMubHRjTWFnICE9PSB1bmRlZmluZWQgKSBtX3VuaWZvcm1zLmx0Y01hZy52YWx1ZSA9IFVuaWZvcm1zTGliLkxUQ19NQUdfVEVYVFVSRTtcblxuXHRcdFx0V2ViR0xVbmlmb3Jtcy51cGxvYWQoXG5cdFx0XHRcdF9nbCwgbWF0ZXJpYWxQcm9wZXJ0aWVzLnVuaWZvcm1zTGlzdCwgbV91bmlmb3JtcywgX3RoaXMgKTtcblxuXHRcdH1cblxuXG5cdFx0Ly8gY29tbW9uIG1hdHJpY2VzXG5cblx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdtb2RlbFZpZXdNYXRyaXgnLCBvYmplY3QubW9kZWxWaWV3TWF0cml4ICk7XG5cdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnbm9ybWFsTWF0cml4Jywgb2JqZWN0Lm5vcm1hbE1hdHJpeCApO1xuXHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ21vZGVsTWF0cml4Jywgb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cblx0XHRyZXR1cm4gcHJvZ3JhbTtcblxuXHR9XG5cblx0Ly8gVW5pZm9ybXMgKHJlZnJlc2ggdW5pZm9ybXMgb2JqZWN0cylcblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNDb21tb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSBtYXRlcmlhbC5vcGFjaXR5O1xuXG5cdFx0dW5pZm9ybXMuZGlmZnVzZS52YWx1ZSA9IG1hdGVyaWFsLmNvbG9yO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5lbWlzc2l2ZSApIHtcblxuXHRcdFx0dW5pZm9ybXMuZW1pc3NpdmUudmFsdWUuY29weSggbWF0ZXJpYWwuZW1pc3NpdmUgKS5tdWx0aXBseVNjYWxhciggbWF0ZXJpYWwuZW1pc3NpdmVJbnRlbnNpdHkgKTtcblxuXHRcdH1cblxuXHRcdHVuaWZvcm1zLm1hcC52YWx1ZSA9IG1hdGVyaWFsLm1hcDtcblx0XHR1bmlmb3Jtcy5zcGVjdWxhck1hcC52YWx1ZSA9IG1hdGVyaWFsLnNwZWN1bGFyTWFwO1xuXHRcdHVuaWZvcm1zLmFscGhhTWFwLnZhbHVlID0gbWF0ZXJpYWwuYWxwaGFNYXA7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmxpZ2h0TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5saWdodE1hcC52YWx1ZSA9IG1hdGVyaWFsLmxpZ2h0TWFwO1xuXHRcdFx0dW5pZm9ybXMubGlnaHRNYXBJbnRlbnNpdHkudmFsdWUgPSBtYXRlcmlhbC5saWdodE1hcEludGVuc2l0eTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYW9NYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmFvTWFwLnZhbHVlID0gbWF0ZXJpYWwuYW9NYXA7XG5cdFx0XHR1bmlmb3Jtcy5hb01hcEludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLmFvTWFwSW50ZW5zaXR5O1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXYgcmVwZWF0IGFuZCBvZmZzZXQgc2V0dGluZyBwcmlvcml0aWVzXG5cdFx0Ly8gMS4gY29sb3IgbWFwXG5cdFx0Ly8gMi4gc3BlY3VsYXIgbWFwXG5cdFx0Ly8gMy4gbm9ybWFsIG1hcFxuXHRcdC8vIDQuIGJ1bXAgbWFwXG5cdFx0Ly8gNS4gYWxwaGEgbWFwXG5cdFx0Ly8gNi4gZW1pc3NpdmUgbWFwXG5cblx0XHR2YXIgdXZTY2FsZU1hcDtcblxuXHRcdGlmICggbWF0ZXJpYWwubWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwubWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuc3BlY3VsYXJNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5zcGVjdWxhck1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLm5vcm1hbE1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5idW1wTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwucm91Z2huZXNzTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwucm91Z2huZXNzTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwubWV0YWxuZXNzTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwubWV0YWxuZXNzTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuYWxwaGFNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5hbHBoYU1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuZW1pc3NpdmVNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIHV2U2NhbGVNYXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblx0XHRcdGlmICggdXZTY2FsZU1hcC5pc1dlYkdMUmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHRcdHV2U2NhbGVNYXAgPSB1dlNjYWxlTWFwLnRleHR1cmU7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG9mZnNldCA9IHV2U2NhbGVNYXAub2Zmc2V0O1xuXHRcdFx0dmFyIHJlcGVhdCA9IHV2U2NhbGVNYXAucmVwZWF0O1xuXG5cdFx0XHR1bmlmb3Jtcy5vZmZzZXRSZXBlYXQudmFsdWUuc2V0KCBvZmZzZXQueCwgb2Zmc2V0LnksIHJlcGVhdC54LCByZXBlYXQueSApO1xuXG5cdFx0fVxuXG5cdFx0dW5pZm9ybXMuZW52TWFwLnZhbHVlID0gbWF0ZXJpYWwuZW52TWFwO1xuXG5cdFx0Ly8gZG9uJ3QgZmxpcCBDdWJlVGV4dHVyZSBlbnZNYXBzLCBmbGlwIGV2ZXJ5dGhpbmcgZWxzZTpcblx0XHQvLyAgV2ViR0xSZW5kZXJUYXJnZXRDdWJlIHdpbGwgYmUgZmxpcHBlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblx0XHQvLyAgV2ViR0xSZW5kZXJUYXJnZXRDdWJlLnRleHR1cmUgd2lsbCBiZSBmbGlwcGVkIGJlY2F1c2UgaXQncyBhIFRleHR1cmUgYW5kIE5PVCBhIEN1YmVUZXh0dXJlXG5cdFx0Ly8gdGhpcyBjaGVjayBtdXN0IGJlIGhhbmRsZWQgZGlmZmVyZW50bHksIG9yIHJlbW92ZWQgZW50aXJlbHksIGlmIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZSB1c2VzIGEgQ3ViZVRleHR1cmUgaW4gdGhlIGZ1dHVyZVxuXHRcdHVuaWZvcm1zLmZsaXBFbnZNYXAudmFsdWUgPSAoICEgKCBtYXRlcmlhbC5lbnZNYXAgJiYgbWF0ZXJpYWwuZW52TWFwLmlzQ3ViZVRleHR1cmUgKSApID8gMSA6IC0gMTtcblxuXHRcdHVuaWZvcm1zLnJlZmxlY3Rpdml0eS52YWx1ZSA9IG1hdGVyaWFsLnJlZmxlY3Rpdml0eTtcblx0XHR1bmlmb3Jtcy5yZWZyYWN0aW9uUmF0aW8udmFsdWUgPSBtYXRlcmlhbC5yZWZyYWN0aW9uUmF0aW87XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0xpbmUoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLmRpZmZ1c2UudmFsdWUgPSBtYXRlcmlhbC5jb2xvcjtcblx0XHR1bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gbWF0ZXJpYWwub3BhY2l0eTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zRGFzaCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMuZGFzaFNpemUudmFsdWUgPSBtYXRlcmlhbC5kYXNoU2l6ZTtcblx0XHR1bmlmb3Jtcy50b3RhbFNpemUudmFsdWUgPSBtYXRlcmlhbC5kYXNoU2l6ZSArIG1hdGVyaWFsLmdhcFNpemU7XG5cdFx0dW5pZm9ybXMuc2NhbGUudmFsdWUgPSBtYXRlcmlhbC5zY2FsZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zUG9pbnRzKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlID0gbWF0ZXJpYWwuY29sb3I7XG5cdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XG5cdFx0dW5pZm9ybXMuc2l6ZS52YWx1ZSA9IG1hdGVyaWFsLnNpemUgKiBfcGl4ZWxSYXRpbztcblx0XHR1bmlmb3Jtcy5zY2FsZS52YWx1ZSA9IF9oZWlnaHQgKiAwLjU7XG5cblx0XHR1bmlmb3Jtcy5tYXAudmFsdWUgPSBtYXRlcmlhbC5tYXA7XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1hcCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dmFyIG9mZnNldCA9IG1hdGVyaWFsLm1hcC5vZmZzZXQ7XG5cdFx0XHR2YXIgcmVwZWF0ID0gbWF0ZXJpYWwubWFwLnJlcGVhdDtcblxuXHRcdFx0dW5pZm9ybXMub2Zmc2V0UmVwZWF0LnZhbHVlLnNldCggb2Zmc2V0LngsIG9mZnNldC55LCByZXBlYXQueCwgcmVwZWF0LnkgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zRm9nKCB1bmlmb3JtcywgZm9nICkge1xuXG5cdFx0dW5pZm9ybXMuZm9nQ29sb3IudmFsdWUgPSBmb2cuY29sb3I7XG5cblx0XHRpZiAoIGZvZy5pc0ZvZyApIHtcblxuXHRcdFx0dW5pZm9ybXMuZm9nTmVhci52YWx1ZSA9IGZvZy5uZWFyO1xuXHRcdFx0dW5pZm9ybXMuZm9nRmFyLnZhbHVlID0gZm9nLmZhcjtcblxuXHRcdH0gZWxzZSBpZiAoIGZvZy5pc0ZvZ0V4cDIgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmZvZ0RlbnNpdHkudmFsdWUgPSBmb2cuZGVuc2l0eTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zTGFtYmVydCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZW1pc3NpdmVNYXAudmFsdWUgPSBtYXRlcmlhbC5lbWlzc2l2ZU1hcDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zUGhvbmcoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLnNwZWN1bGFyLnZhbHVlID0gbWF0ZXJpYWwuc3BlY3VsYXI7XG5cdFx0dW5pZm9ybXMuc2hpbmluZXNzLnZhbHVlID0gTWF0aC5tYXgoIG1hdGVyaWFsLnNoaW5pbmVzcywgMWUtNCApOyAvLyB0byBwcmV2ZW50IHBvdyggMC4wLCAwLjAgKVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZW1pc3NpdmVNYXAudmFsdWUgPSBtYXRlcmlhbC5lbWlzc2l2ZU1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYnVtcE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuYnVtcE1hcC52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBNYXA7XG5cdFx0XHR1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgPSBtYXRlcmlhbC5idW1wU2NhbGU7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubm9ybWFsTWFwLnZhbHVlID0gbWF0ZXJpYWwubm9ybWFsTWFwO1xuXHRcdFx0dW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUuY29weSggbWF0ZXJpYWwubm9ybWFsU2NhbGUgKTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1Rvb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHJlZnJlc2hVbmlmb3Jtc1Bob25nKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdGlmICggbWF0ZXJpYWwuZ3JhZGllbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmdyYWRpZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZ3JhZGllbnRNYXA7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1N0YW5kYXJkKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5yb3VnaG5lc3MudmFsdWUgPSBtYXRlcmlhbC5yb3VnaG5lc3M7XG5cdFx0dW5pZm9ybXMubWV0YWxuZXNzLnZhbHVlID0gbWF0ZXJpYWwubWV0YWxuZXNzO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5yb3VnaG5lc3NNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLnJvdWdobmVzc01hcC52YWx1ZSA9IG1hdGVyaWFsLnJvdWdobmVzc01hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubWV0YWxuZXNzTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5tZXRhbG5lc3NNYXAudmFsdWUgPSBtYXRlcmlhbC5tZXRhbG5lc3NNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5lbWlzc2l2ZU1hcC52YWx1ZSA9IG1hdGVyaWFsLmVtaXNzaXZlTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5idW1wTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5idW1wTWFwLnZhbHVlID0gbWF0ZXJpYWwuYnVtcE1hcDtcblx0XHRcdHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBTY2FsZTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5ub3JtYWxNYXA7XG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZW52TWFwICkge1xuXG5cdFx0XHQvL3VuaWZvcm1zLmVudk1hcC52YWx1ZSA9IG1hdGVyaWFsLmVudk1hcDsgLy8gcGFydCBvZiB1bmlmb3JtcyBjb21tb25cblx0XHRcdHVuaWZvcm1zLmVudk1hcEludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLmVudk1hcEludGVuc2l0eTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zUGh5c2ljYWwoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLmNsZWFyQ29hdC52YWx1ZSA9IG1hdGVyaWFsLmNsZWFyQ29hdDtcblx0XHR1bmlmb3Jtcy5jbGVhckNvYXRSb3VnaG5lc3MudmFsdWUgPSBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3M7XG5cblx0XHRyZWZyZXNoVW5pZm9ybXNTdGFuZGFyZCggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc05vcm1hbCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5idW1wTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5idW1wTWFwLnZhbHVlID0gbWF0ZXJpYWwuYnVtcE1hcDtcblx0XHRcdHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBTY2FsZTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5ub3JtYWxNYXA7XG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gSWYgdW5pZm9ybXMgYXJlIG1hcmtlZCBhcyBjbGVhbiwgdGhleSBkb24ndCBuZWVkIHRvIGJlIGxvYWRlZCB0byB0aGUgR1BVLlxuXG5cdGZ1bmN0aW9uIG1hcmtVbmlmb3Jtc0xpZ2h0c05lZWRzVXBkYXRlKCB1bmlmb3JtcywgdmFsdWUgKSB7XG5cblx0XHR1bmlmb3Jtcy5hbWJpZW50TGlnaHRDb2xvci5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXG5cdFx0dW5pZm9ybXMuZGlyZWN0aW9uYWxMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblx0XHR1bmlmb3Jtcy5wb2ludExpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXHRcdHVuaWZvcm1zLnNwb3RMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblx0XHR1bmlmb3Jtcy5yZWN0QXJlYUxpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXHRcdHVuaWZvcm1zLmhlbWlzcGhlcmVMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblxuXHR9XG5cblx0Ly8gTGlnaHRpbmdcblxuXHRmdW5jdGlvbiBzZXR1cFNoYWRvd3MoIGxpZ2h0cyApIHtcblxuXHRcdHZhciBsaWdodFNoYWRvd3NMZW5ndGggPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbGlnaHRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBsaWdodCA9IGxpZ2h0c1sgaSBdO1xuXG5cdFx0XHRpZiAoIGxpZ2h0LmNhc3RTaGFkb3cgKSB7XG5cblx0XHRcdFx0X2xpZ2h0cy5zaGFkb3dzWyBsaWdodFNoYWRvd3NMZW5ndGggXSA9IGxpZ2h0O1xuXHRcdFx0XHRsaWdodFNoYWRvd3NMZW5ndGggKys7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdF9saWdodHMuc2hhZG93cy5sZW5ndGggPSBsaWdodFNoYWRvd3NMZW5ndGg7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldHVwTGlnaHRzKCBsaWdodHMsIGNhbWVyYSApIHtcblxuXHRcdHZhciBsLCBsbCwgbGlnaHQsIHNoYWRvdyxcblx0XHRcdHIgPSAwLCBnID0gMCwgYiA9IDAsXG5cdFx0XHRjb2xvcixcblx0XHRcdGludGVuc2l0eSxcblx0XHRcdGRpc3RhbmNlLFxuXHRcdFx0c2hhZG93TWFwLFxuXG5cdFx0XHR2aWV3TWF0cml4ID0gY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSxcblxuXHRcdFx0ZGlyZWN0aW9uYWxMZW5ndGggPSAwLFxuXHRcdFx0cG9pbnRMZW5ndGggPSAwLFxuXHRcdFx0c3BvdExlbmd0aCA9IDAsXG5cdFx0XHRyZWN0QXJlYUxlbmd0aCA9IDAsXG5cdFx0XHRoZW1pTGVuZ3RoID0gMDtcblxuXHRcdGZvciAoIGwgPSAwLCBsbCA9IGxpZ2h0cy5sZW5ndGg7IGwgPCBsbDsgbCArKyApIHtcblxuXHRcdFx0bGlnaHQgPSBsaWdodHNbIGwgXTtcblxuXHRcdFx0Y29sb3IgPSBsaWdodC5jb2xvcjtcblx0XHRcdGludGVuc2l0eSA9IGxpZ2h0LmludGVuc2l0eTtcblx0XHRcdGRpc3RhbmNlID0gbGlnaHQuZGlzdGFuY2U7XG5cblx0XHRcdHNoYWRvd01hcCA9ICggbGlnaHQuc2hhZG93ICYmIGxpZ2h0LnNoYWRvdy5tYXAgKSA/IGxpZ2h0LnNoYWRvdy5tYXAudGV4dHVyZSA6IG51bGw7XG5cblx0XHRcdGlmICggbGlnaHQuaXNBbWJpZW50TGlnaHQgKSB7XG5cblx0XHRcdFx0ciArPSBjb2xvci5yICogaW50ZW5zaXR5O1xuXHRcdFx0XHRnICs9IGNvbG9yLmcgKiBpbnRlbnNpdHk7XG5cdFx0XHRcdGIgKz0gY29sb3IuYiAqIGludGVuc2l0eTtcblxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNEaXJlY3Rpb25hbExpZ2h0ICkge1xuXG5cdFx0XHRcdHZhciB1bmlmb3JtcyA9IGxpZ2h0Q2FjaGUuZ2V0KCBsaWdodCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmNvbG9yLmNvcHkoIGxpZ2h0LmNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGxpZ2h0LmludGVuc2l0eSApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHRfdmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24uc3ViKCBfdmVjdG9yMyApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuc2hhZG93ID0gbGlnaHQuY2FzdFNoYWRvdztcblxuXHRcdFx0XHRpZiAoIGxpZ2h0LmNhc3RTaGFkb3cgKSB7XG5cblx0XHRcdFx0XHRzaGFkb3cgPSBsaWdodC5zaGFkb3c7XG5cblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dCaWFzID0gc2hhZG93LmJpYXM7XG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93UmFkaXVzID0gc2hhZG93LnJhZGl1cztcblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dNYXBTaXplID0gc2hhZG93Lm1hcFNpemU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdF9saWdodHMuZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGRpcmVjdGlvbmFsTGVuZ3RoIF0gPSBzaGFkb3dNYXA7XG5cdFx0XHRcdF9saWdodHMuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIGRpcmVjdGlvbmFsTGVuZ3RoIF0gPSBsaWdodC5zaGFkb3cubWF0cml4O1xuXHRcdFx0XHRfbGlnaHRzLmRpcmVjdGlvbmFsWyBkaXJlY3Rpb25hbExlbmd0aCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdFx0ZGlyZWN0aW9uYWxMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzU3BvdExpZ2h0ICkge1xuXG5cdFx0XHRcdHZhciB1bmlmb3JtcyA9IGxpZ2h0Q2FjaGUuZ2V0KCBsaWdodCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuY29sb3IuY29weSggY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5ICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpc3RhbmNlID0gZGlzdGFuY2U7XG5cblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0X3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnN1YiggX3ZlY3RvcjMgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmNvbmVDb3MgPSBNYXRoLmNvcyggbGlnaHQuYW5nbGUgKTtcblx0XHRcdFx0dW5pZm9ybXMucGVudW1icmFDb3MgPSBNYXRoLmNvcyggbGlnaHQuYW5nbGUgKiAoIDEgLSBsaWdodC5wZW51bWJyYSApICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRlY2F5ID0gKCBsaWdodC5kaXN0YW5jZSA9PT0gMCApID8gMC4wIDogbGlnaHQuZGVjYXk7XG5cblx0XHRcdFx0dW5pZm9ybXMuc2hhZG93ID0gbGlnaHQuY2FzdFNoYWRvdztcblxuXHRcdFx0XHRpZiAoIGxpZ2h0LmNhc3RTaGFkb3cgKSB7XG5cblx0XHRcdFx0XHRzaGFkb3cgPSBsaWdodC5zaGFkb3c7XG5cblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dCaWFzID0gc2hhZG93LmJpYXM7XG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93UmFkaXVzID0gc2hhZG93LnJhZGl1cztcblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dNYXBTaXplID0gc2hhZG93Lm1hcFNpemU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdF9saWdodHMuc3BvdFNoYWRvd01hcFsgc3BvdExlbmd0aCBdID0gc2hhZG93TWFwO1xuXHRcdFx0XHRfbGlnaHRzLnNwb3RTaGFkb3dNYXRyaXhbIHNwb3RMZW5ndGggXSA9IGxpZ2h0LnNoYWRvdy5tYXRyaXg7XG5cdFx0XHRcdF9saWdodHMuc3BvdFsgc3BvdExlbmd0aCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdFx0c3BvdExlbmd0aCArKztcblxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNSZWN0QXJlYUxpZ2h0ICkge1xuXG5cdFx0XHRcdHZhciB1bmlmb3JtcyA9IGxpZ2h0Q2FjaGUuZ2V0KCBsaWdodCApO1xuXG5cdFx0XHRcdC8vIChhKSBpbnRlbnNpdHkgY29udHJvbHMgaXJyYWRpYW5jZSBvZiBlbnRpcmUgbGlnaHRcblx0XHRcdFx0dW5pZm9ybXMuY29sb3Jcblx0XHRcdFx0XHQuY29weSggY29sb3IgKVxuXHRcdFx0XHRcdC5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5IC8gKCBsaWdodC53aWR0aCAqIGxpZ2h0LmhlaWdodCApICk7XG5cblx0XHRcdFx0Ly8gKGIpIGludGVuc2l0eSBjb250cm9scyB0aGUgcmFkaWFuY2UgcGVyIGxpZ2h0IGFyZWFcblx0XHRcdFx0Ly8gdW5pZm9ybXMuY29sb3IuY29weSggY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXggKTtcblxuXHRcdFx0XHQvLyBleHRyYWN0IGxvY2FsIHJvdGF0aW9uIG9mIGxpZ2h0IHRvIGRlcml2ZSB3aWR0aC9oZWlnaHQgaGFsZiB2ZWN0b3JzXG5cdFx0XHRcdF9tYXRyaXg0Mi5pZGVudGl0eSgpO1xuXHRcdFx0XHRfbWF0cml4NC5jb3B5KCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHRfbWF0cml4NC5wcmVtdWx0aXBseSggdmlld01hdHJpeCApO1xuXHRcdFx0XHRfbWF0cml4NDIuZXh0cmFjdFJvdGF0aW9uKCBfbWF0cml4NCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmhhbGZXaWR0aC5zZXQoIGxpZ2h0LndpZHRoICogMC41LCAgICAgICAgICAgICAgICAwLjAsIDAuMCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5oYWxmSGVpZ2h0LnNldCggICAgICAgICAgICAgIDAuMCwgbGlnaHQuaGVpZ2h0ICogMC41LCAwLjAgKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5oYWxmV2lkdGguYXBwbHlNYXRyaXg0KCBfbWF0cml4NDIgKTtcblx0XHRcdFx0dW5pZm9ybXMuaGFsZkhlaWdodC5hcHBseU1hdHJpeDQoIF9tYXRyaXg0MiApO1xuXG5cdFx0XHRcdC8vIFRPRE8gKGFiZWxuYXRpb24pOiBSZWN0QXJlYUxpZ2h0IGRpc3RhbmNlP1xuXHRcdFx0XHQvLyB1bmlmb3Jtcy5kaXN0YW5jZSA9IGRpc3RhbmNlO1xuXG5cdFx0XHRcdF9saWdodHMucmVjdEFyZWFbIHJlY3RBcmVhTGVuZ3RoIF0gPSB1bmlmb3JtcztcblxuXHRcdFx0XHRyZWN0QXJlYUxlbmd0aCArKztcblxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNQb2ludExpZ2h0ICkge1xuXG5cdFx0XHRcdHZhciB1bmlmb3JtcyA9IGxpZ2h0Q2FjaGUuZ2V0KCBsaWdodCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuY29sb3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggbGlnaHQuaW50ZW5zaXR5ICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpc3RhbmNlID0gbGlnaHQuZGlzdGFuY2U7XG5cdFx0XHRcdHVuaWZvcm1zLmRlY2F5ID0gKCBsaWdodC5kaXN0YW5jZSA9PT0gMCApID8gMC4wIDogbGlnaHQuZGVjYXk7XG5cblx0XHRcdFx0dW5pZm9ybXMuc2hhZG93ID0gbGlnaHQuY2FzdFNoYWRvdztcblxuXHRcdFx0XHRpZiAoIGxpZ2h0LmNhc3RTaGFkb3cgKSB7XG5cblx0XHRcdFx0XHRzaGFkb3cgPSBsaWdodC5zaGFkb3c7XG5cblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dCaWFzID0gc2hhZG93LmJpYXM7XG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93UmFkaXVzID0gc2hhZG93LnJhZGl1cztcblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dNYXBTaXplID0gc2hhZG93Lm1hcFNpemU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdF9saWdodHMucG9pbnRTaGFkb3dNYXBbIHBvaW50TGVuZ3RoIF0gPSBzaGFkb3dNYXA7XG5cdFx0XHRcdF9saWdodHMucG9pbnRTaGFkb3dNYXRyaXhbIHBvaW50TGVuZ3RoIF0gPSBsaWdodC5zaGFkb3cubWF0cml4O1xuXHRcdFx0XHRfbGlnaHRzLnBvaW50WyBwb2ludExlbmd0aCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdFx0cG9pbnRMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzSGVtaXNwaGVyZUxpZ2h0ICkge1xuXG5cdFx0XHRcdHZhciB1bmlmb3JtcyA9IGxpZ2h0Q2FjaGUuZ2V0KCBsaWdodCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oIHZpZXdNYXRyaXggKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRcdHVuaWZvcm1zLnNreUNvbG9yLmNvcHkoIGxpZ2h0LmNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApO1xuXHRcdFx0XHR1bmlmb3Jtcy5ncm91bmRDb2xvci5jb3B5KCBsaWdodC5ncm91bmRDb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgKTtcblxuXHRcdFx0XHRfbGlnaHRzLmhlbWlbIGhlbWlMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdGhlbWlMZW5ndGggKys7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdF9saWdodHMuYW1iaWVudFsgMCBdID0gcjtcblx0XHRfbGlnaHRzLmFtYmllbnRbIDEgXSA9IGc7XG5cdFx0X2xpZ2h0cy5hbWJpZW50WyAyIF0gPSBiO1xuXG5cdFx0X2xpZ2h0cy5kaXJlY3Rpb25hbC5sZW5ndGggPSBkaXJlY3Rpb25hbExlbmd0aDtcblx0XHRfbGlnaHRzLnNwb3QubGVuZ3RoID0gc3BvdExlbmd0aDtcblx0XHRfbGlnaHRzLnJlY3RBcmVhLmxlbmd0aCA9IHJlY3RBcmVhTGVuZ3RoO1xuXHRcdF9saWdodHMucG9pbnQubGVuZ3RoID0gcG9pbnRMZW5ndGg7XG5cdFx0X2xpZ2h0cy5oZW1pLmxlbmd0aCA9IGhlbWlMZW5ndGg7XG5cblx0XHQvLyBUT0RPIChzYW0tZy1zdGVlbCkgd2h5IGFyZW4ndCB3ZSB1c2luZyBqb2luXG5cdFx0X2xpZ2h0cy5oYXNoID0gZGlyZWN0aW9uYWxMZW5ndGggKyAnLCcgKyBwb2ludExlbmd0aCArICcsJyArIHNwb3RMZW5ndGggKyAnLCcgKyByZWN0QXJlYUxlbmd0aCArICcsJyArIGhlbWlMZW5ndGggKyAnLCcgKyBfbGlnaHRzLnNoYWRvd3MubGVuZ3RoO1xuXG5cdH1cblxuXHQvLyBHTCBzdGF0ZSBzZXR0aW5nXG5cblx0dGhpcy5zZXRGYWNlQ3VsbGluZyA9IGZ1bmN0aW9uICggY3VsbEZhY2UsIGZyb250RmFjZURpcmVjdGlvbiApIHtcblxuXHRcdHN0YXRlLnNldEN1bGxGYWNlKCBjdWxsRmFjZSApO1xuXHRcdHN0YXRlLnNldEZsaXBTaWRlZCggZnJvbnRGYWNlRGlyZWN0aW9uID09PSBGcm9udEZhY2VEaXJlY3Rpb25DVyApO1xuXG5cdH07XG5cblx0Ly8gVGV4dHVyZXNcblxuXHRmdW5jdGlvbiBhbGxvY1RleHR1cmVVbml0KCkge1xuXG5cdFx0dmFyIHRleHR1cmVVbml0ID0gX3VzZWRUZXh0dXJlVW5pdHM7XG5cblx0XHRpZiAoIHRleHR1cmVVbml0ID49IGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlcyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnV2ViR0xSZW5kZXJlcjogdHJ5aW5nIHRvIHVzZSAnICsgdGV4dHVyZVVuaXQgKyAnIHRleHR1cmUgdW5pdHMgd2hpbGUgdGhpcyBHUFUgc3VwcG9ydHMgb25seSAnICsgY2FwYWJpbGl0aWVzLm1heFRleHR1cmVzICk7XG5cblx0XHR9XG5cblx0XHRfdXNlZFRleHR1cmVVbml0cyArPSAxO1xuXG5cdFx0cmV0dXJuIHRleHR1cmVVbml0O1xuXG5cdH1cblxuXHR0aGlzLmFsbG9jVGV4dHVyZVVuaXQgPSBhbGxvY1RleHR1cmVVbml0O1xuXG5cdC8vIHRoaXMuc2V0VGV4dHVyZTJEID0gc2V0VGV4dHVyZTJEO1xuXHR0aGlzLnNldFRleHR1cmUyRCA9ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHdhcm5lZCA9IGZhbHNlO1xuXG5cdFx0Ly8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6IHBlZWwgdGV4dHVyZS50ZXh0dXJlXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldFRleHR1cmUyRCggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNXZWJHTFJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0XHRpZiAoICEgd2FybmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLldlYkdMUmVuZGVyZXIuc2V0VGV4dHVyZTJEOiBkb24ndCB1c2UgcmVuZGVyIHRhcmdldHMgYXMgdGV4dHVyZXMuIFVzZSB0aGVpciAudGV4dHVyZSBwcm9wZXJ0eSBpbnN0ZWFkLlwiICk7XG5cdFx0XHRcdFx0d2FybmVkID0gdHJ1ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZSA9IHRleHR1cmUudGV4dHVyZTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlMkQoIHRleHR1cmUsIHNsb3QgKTtcblxuXHRcdH07XG5cblx0fSgpICk7XG5cblx0dGhpcy5zZXRUZXh0dXJlID0gKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgd2FybmVkID0gZmFsc2U7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0VGV4dHVyZSggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdFx0aWYgKCAhIHdhcm5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldFRleHR1cmUgaXMgZGVwcmVjYXRlZCwgdXNlIHNldFRleHR1cmUyRCBpbnN0ZWFkLlwiICk7XG5cdFx0XHRcdHdhcm5lZCA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCBzbG90ICk7XG5cblx0XHR9O1xuXG5cdH0oKSApO1xuXG5cdHRoaXMuc2V0VGV4dHVyZUN1YmUgPSAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB3YXJuZWQgPSBmYWxzZTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRUZXh0dXJlQ3ViZSggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdFx0Ly8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6IHBlZWwgdGV4dHVyZS50ZXh0dXJlXG5cdFx0XHRpZiAoIHRleHR1cmUgJiYgdGV4dHVyZS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSApIHtcblxuXHRcdFx0XHRpZiAoICEgd2FybmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLldlYkdMUmVuZGVyZXIuc2V0VGV4dHVyZUN1YmU6IGRvbid0IHVzZSBjdWJlIHJlbmRlciB0YXJnZXRzIGFzIHRleHR1cmVzLiBVc2UgdGhlaXIgLnRleHR1cmUgcHJvcGVydHkgaW5zdGVhZC5cIiApO1xuXHRcdFx0XHRcdHdhcm5lZCA9IHRydWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRleHR1cmUgPSB0ZXh0dXJlLnRleHR1cmU7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gY3VycmVudGx5IHJlbHlpbmcgb24gdGhlIGZhY3QgdGhhdCBXZWJHTFJlbmRlclRhcmdldEN1YmUudGV4dHVyZSBpcyBhIFRleHR1cmUgYW5kIE5PVCBhIEN1YmVUZXh0dXJlXG5cdFx0XHQvLyBUT0RPOiB1bmlmeSB0aGVzZSBjb2RlIHBhdGhzXG5cdFx0XHRpZiAoICggdGV4dHVyZSAmJiB0ZXh0dXJlLmlzQ3ViZVRleHR1cmUgKSB8fFxuXHRcdFx0XHQoIEFycmF5LmlzQXJyYXkoIHRleHR1cmUuaW1hZ2UgKSAmJiB0ZXh0dXJlLmltYWdlLmxlbmd0aCA9PT0gNiApICkge1xuXG5cdFx0XHRcdC8vIENvbXByZXNzZWRUZXh0dXJlIGNhbiBoYXZlIEFycmF5IGluIGltYWdlIDovXG5cblx0XHRcdFx0Ly8gdGhpcyBmdW5jdGlvbiBhbG9uZSBzaG91bGQgdGFrZSBjYXJlIG9mIGN1YmUgdGV4dHVyZXNcblx0XHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZUN1YmUoIHRleHR1cmUsIHNsb3QgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBhc3N1bWVkOiB0ZXh0dXJlIHByb3BlcnR5IG9mIFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0Q3ViZVxuXG5cdFx0XHRcdHRleHR1cmVzLnNldFRleHR1cmVDdWJlRHluYW1pYyggdGV4dHVyZSwgc2xvdCApO1xuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0oKSApO1xuXG5cdHRoaXMuZ2V0UmVuZGVyVGFyZ2V0ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9jdXJyZW50UmVuZGVyVGFyZ2V0O1xuXG5cdH07XG5cblx0dGhpcy5zZXRSZW5kZXJUYXJnZXQgPSBmdW5jdGlvbiAoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdF9jdXJyZW50UmVuZGVyVGFyZ2V0ID0gcmVuZGVyVGFyZ2V0O1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgJiYgcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0ZXh0dXJlcy5zZXR1cFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR9XG5cblx0XHR2YXIgaXNDdWJlID0gKCByZW5kZXJUYXJnZXQgJiYgcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlICk7XG5cdFx0dmFyIGZyYW1lYnVmZmVyO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRcdHZhciByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0XHRpZiAoIGlzQ3ViZSApIHtcblxuXHRcdFx0XHRmcmFtZWJ1ZmZlciA9IHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyByZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgXTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRmcmFtZWJ1ZmZlciA9IHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyO1xuXG5cdFx0XHR9XG5cblx0XHRcdF9jdXJyZW50U2Npc3Nvci5jb3B5KCByZW5kZXJUYXJnZXQuc2Npc3NvciApO1xuXHRcdFx0X2N1cnJlbnRTY2lzc29yVGVzdCA9IHJlbmRlclRhcmdldC5zY2lzc29yVGVzdDtcblxuXHRcdFx0X2N1cnJlbnRWaWV3cG9ydC5jb3B5KCByZW5kZXJUYXJnZXQudmlld3BvcnQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGZyYW1lYnVmZmVyID0gbnVsbDtcblxuXHRcdFx0X2N1cnJlbnRTY2lzc29yLmNvcHkoIF9zY2lzc29yICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICk7XG5cdFx0XHRfY3VycmVudFNjaXNzb3JUZXN0ID0gX3NjaXNzb3JUZXN0O1xuXG5cdFx0XHRfY3VycmVudFZpZXdwb3J0LmNvcHkoIF92aWV3cG9ydCApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBfY3VycmVudEZyYW1lYnVmZmVyICE9PSBmcmFtZWJ1ZmZlciApIHtcblxuXHRcdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlciApO1xuXHRcdFx0X2N1cnJlbnRGcmFtZWJ1ZmZlciA9IGZyYW1lYnVmZmVyO1xuXG5cdFx0fVxuXG5cdFx0c3RhdGUuc2Npc3NvciggX2N1cnJlbnRTY2lzc29yICk7XG5cdFx0c3RhdGUuc2V0U2Npc3NvclRlc3QoIF9jdXJyZW50U2Npc3NvclRlc3QgKTtcblxuXHRcdHN0YXRlLnZpZXdwb3J0KCBfY3VycmVudFZpZXdwb3J0ICk7XG5cblx0XHRpZiAoIGlzQ3ViZSApIHtcblxuXHRcdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC50ZXh0dXJlICk7XG5cdFx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgcmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSwgcmVuZGVyVGFyZ2V0LmFjdGl2ZU1pcE1hcExldmVsICk7XG5cblx0XHR9XG5cblx0fTtcblxuXHR0aGlzLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHMgPSBmdW5jdGlvbiAoIHJlbmRlclRhcmdldCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgYnVmZmVyICkge1xuXG5cdFx0aWYgKCAoIHJlbmRlclRhcmdldCAmJiByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldCApID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBUSFJFRS5XZWJHTFJlbmRlclRhcmdldC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR2YXIgZnJhbWVidWZmZXIgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICkuX193ZWJnbEZyYW1lYnVmZmVyO1xuXG5cdFx0aWYgKCBmcmFtZWJ1ZmZlciApIHtcblxuXHRcdFx0dmFyIHJlc3RvcmUgPSBmYWxzZTtcblxuXHRcdFx0aWYgKCBmcmFtZWJ1ZmZlciAhPT0gX2N1cnJlbnRGcmFtZWJ1ZmZlciApIHtcblxuXHRcdFx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyICk7XG5cblx0XHRcdFx0cmVzdG9yZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0dHJ5IHtcblxuXHRcdFx0XHR2YXIgdGV4dHVyZSA9IHJlbmRlclRhcmdldC50ZXh0dXJlO1xuXHRcdFx0XHR2YXIgdGV4dHVyZUZvcm1hdCA9IHRleHR1cmUuZm9ybWF0O1xuXHRcdFx0XHR2YXIgdGV4dHVyZVR5cGUgPSB0ZXh0dXJlLnR5cGU7XG5cblx0XHRcdFx0aWYgKCB0ZXh0dXJlRm9ybWF0ICE9PSBSR0JBRm9ybWF0ICYmIHBhcmFtVGhyZWVUb0dMKCB0ZXh0dXJlRm9ybWF0ICkgIT09IF9nbC5nZXRQYXJhbWV0ZXIoIF9nbC5JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVCApICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBSR0JBIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgZm9ybWF0LicgKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdGV4dHVyZVR5cGUgIT09IFVuc2lnbmVkQnl0ZVR5cGUgJiYgcGFyYW1UaHJlZVRvR0woIHRleHR1cmVUeXBlICkgIT09IF9nbC5nZXRQYXJhbWV0ZXIoIF9nbC5JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEUgKSAmJiAvLyBJRTExLCBFZGdlIGFuZCBDaHJvbWUgTWFjIDwgNTIgKCM5NTEzKVxuXHRcdFx0XHRcdCEgKCB0ZXh0dXJlVHlwZSA9PT0gRmxvYXRUeXBlICYmICggZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdCcgKSB8fCBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbG9yX2J1ZmZlcl9mbG9hdCcgKSApICkgJiYgLy8gQ2hyb21lIE1hYyA+PSA1MiBhbmQgRmlyZWZveFxuXHRcdFx0XHRcdCEgKCB0ZXh0dXJlVHlwZSA9PT0gSGFsZkZsb2F0VHlwZSAmJiBleHRlbnNpb25zLmdldCggJ0VYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCcgKSApICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4nICk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIF9nbC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKCBfZ2wuRlJBTUVCVUZGRVIgKSA9PT0gX2dsLkZSQU1FQlVGRkVSX0NPTVBMRVRFICkge1xuXG5cdFx0XHRcdFx0Ly8gdGhlIGZvbGxvd2luZyBpZiBzdGF0ZW1lbnQgZW5zdXJlcyB2YWxpZCByZWFkIHJlcXVlc3RzIChubyBvdXQtb2YtYm91bmRzIHBpeGVscywgc2VlICM4NjA0KVxuXG5cdFx0XHRcdFx0aWYgKCAoIHggPj0gMCAmJiB4IDw9ICggcmVuZGVyVGFyZ2V0LndpZHRoIC0gd2lkdGggKSApICYmICggeSA+PSAwICYmIHkgPD0gKCByZW5kZXJUYXJnZXQuaGVpZ2h0IC0gaGVpZ2h0ICkgKSApIHtcblxuXHRcdFx0XHRcdFx0X2dsLnJlYWRQaXhlbHMoIHgsIHksIHdpZHRoLCBoZWlnaHQsIHBhcmFtVGhyZWVUb0dMKCB0ZXh0dXJlRm9ybWF0ICksIHBhcmFtVGhyZWVUb0dMKCB0ZXh0dXJlVHlwZSApLCBidWZmZXIgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVhZFBpeGVscyBmcm9tIHJlbmRlclRhcmdldCBmYWlsZWQuIEZyYW1lYnVmZmVyIG5vdCBjb21wbGV0ZS4nICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGZpbmFsbHkge1xuXG5cdFx0XHRcdGlmICggcmVzdG9yZSApIHtcblxuXHRcdFx0XHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgX2N1cnJlbnRGcmFtZWJ1ZmZlciApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH07XG5cblx0Ly8gTWFwIHRocmVlLmpzIGNvbnN0YW50cyB0byBXZWJHTCBjb25zdGFudHNcblxuXHRmdW5jdGlvbiBwYXJhbVRocmVlVG9HTCggcCApIHtcblxuXHRcdHZhciBleHRlbnNpb247XG5cblx0XHRpZiAoIHAgPT09IFJlcGVhdFdyYXBwaW5nICkgcmV0dXJuIF9nbC5SRVBFQVQ7XG5cdFx0aWYgKCBwID09PSBDbGFtcFRvRWRnZVdyYXBwaW5nICkgcmV0dXJuIF9nbC5DTEFNUF9UT19FREdFO1xuXHRcdGlmICggcCA9PT0gTWlycm9yZWRSZXBlYXRXcmFwcGluZyApIHJldHVybiBfZ2wuTUlSUk9SRURfUkVQRUFUO1xuXG5cdFx0aWYgKCBwID09PSBOZWFyZXN0RmlsdGVyICkgcmV0dXJuIF9nbC5ORUFSRVNUO1xuXHRcdGlmICggcCA9PT0gTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIgKSByZXR1cm4gX2dsLk5FQVJFU1RfTUlQTUFQX05FQVJFU1Q7XG5cdFx0aWYgKCBwID09PSBOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyICkgcmV0dXJuIF9nbC5ORUFSRVNUX01JUE1BUF9MSU5FQVI7XG5cblx0XHRpZiAoIHAgPT09IExpbmVhckZpbHRlciApIHJldHVybiBfZ2wuTElORUFSO1xuXHRcdGlmICggcCA9PT0gTGluZWFyTWlwTWFwTmVhcmVzdEZpbHRlciApIHJldHVybiBfZ2wuTElORUFSX01JUE1BUF9ORUFSRVNUO1xuXHRcdGlmICggcCA9PT0gTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyICkgcmV0dXJuIF9nbC5MSU5FQVJfTUlQTUFQX0xJTkVBUjtcblxuXHRcdGlmICggcCA9PT0gVW5zaWduZWRCeXRlVHlwZSApIHJldHVybiBfZ2wuVU5TSUdORURfQllURTtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnQ0NDQ0VHlwZSApIHJldHVybiBfZ2wuVU5TSUdORURfU0hPUlRfNF80XzRfNDtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSApIHJldHVybiBfZ2wuVU5TSUdORURfU0hPUlRfNV81XzVfMTtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnQ1NjVUeXBlICkgcmV0dXJuIF9nbC5VTlNJR05FRF9TSE9SVF81XzZfNTtcblxuXHRcdGlmICggcCA9PT0gQnl0ZVR5cGUgKSByZXR1cm4gX2dsLkJZVEU7XG5cdFx0aWYgKCBwID09PSBTaG9ydFR5cGUgKSByZXR1cm4gX2dsLlNIT1JUO1xuXHRcdGlmICggcCA9PT0gVW5zaWduZWRTaG9ydFR5cGUgKSByZXR1cm4gX2dsLlVOU0lHTkVEX1NIT1JUO1xuXHRcdGlmICggcCA9PT0gSW50VHlwZSApIHJldHVybiBfZ2wuSU5UO1xuXHRcdGlmICggcCA9PT0gVW5zaWduZWRJbnRUeXBlICkgcmV0dXJuIF9nbC5VTlNJR05FRF9JTlQ7XG5cdFx0aWYgKCBwID09PSBGbG9hdFR5cGUgKSByZXR1cm4gX2dsLkZMT0FUO1xuXG5cdFx0aWYgKCBwID09PSBIYWxmRmxvYXRUeXBlICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXQnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkgcmV0dXJuIGV4dGVuc2lvbi5IQUxGX0ZMT0FUX09FUztcblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gQWxwaGFGb3JtYXQgKSByZXR1cm4gX2dsLkFMUEhBO1xuXHRcdGlmICggcCA9PT0gUkdCRm9ybWF0ICkgcmV0dXJuIF9nbC5SR0I7XG5cdFx0aWYgKCBwID09PSBSR0JBRm9ybWF0ICkgcmV0dXJuIF9nbC5SR0JBO1xuXHRcdGlmICggcCA9PT0gTHVtaW5hbmNlRm9ybWF0ICkgcmV0dXJuIF9nbC5MVU1JTkFOQ0U7XG5cdFx0aWYgKCBwID09PSBMdW1pbmFuY2VBbHBoYUZvcm1hdCApIHJldHVybiBfZ2wuTFVNSU5BTkNFX0FMUEhBO1xuXHRcdGlmICggcCA9PT0gRGVwdGhGb3JtYXQgKSByZXR1cm4gX2dsLkRFUFRIX0NPTVBPTkVOVDtcblx0XHRpZiAoIHAgPT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHJldHVybiBfZ2wuREVQVEhfU1RFTkNJTDtcblxuXHRcdGlmICggcCA9PT0gQWRkRXF1YXRpb24gKSByZXR1cm4gX2dsLkZVTkNfQUREO1xuXHRcdGlmICggcCA9PT0gU3VidHJhY3RFcXVhdGlvbiApIHJldHVybiBfZ2wuRlVOQ19TVUJUUkFDVDtcblx0XHRpZiAoIHAgPT09IFJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uICkgcmV0dXJuIF9nbC5GVU5DX1JFVkVSU0VfU1VCVFJBQ1Q7XG5cblx0XHRpZiAoIHAgPT09IFplcm9GYWN0b3IgKSByZXR1cm4gX2dsLlpFUk87XG5cdFx0aWYgKCBwID09PSBPbmVGYWN0b3IgKSByZXR1cm4gX2dsLk9ORTtcblx0XHRpZiAoIHAgPT09IFNyY0NvbG9yRmFjdG9yICkgcmV0dXJuIF9nbC5TUkNfQ09MT1I7XG5cdFx0aWYgKCBwID09PSBPbmVNaW51c1NyY0NvbG9yRmFjdG9yICkgcmV0dXJuIF9nbC5PTkVfTUlOVVNfU1JDX0NPTE9SO1xuXHRcdGlmICggcCA9PT0gU3JjQWxwaGFGYWN0b3IgKSByZXR1cm4gX2dsLlNSQ19BTFBIQTtcblx0XHRpZiAoIHAgPT09IE9uZU1pbnVzU3JjQWxwaGFGYWN0b3IgKSByZXR1cm4gX2dsLk9ORV9NSU5VU19TUkNfQUxQSEE7XG5cdFx0aWYgKCBwID09PSBEc3RBbHBoYUZhY3RvciApIHJldHVybiBfZ2wuRFNUX0FMUEhBO1xuXHRcdGlmICggcCA9PT0gT25lTWludXNEc3RBbHBoYUZhY3RvciApIHJldHVybiBfZ2wuT05FX01JTlVTX0RTVF9BTFBIQTtcblxuXHRcdGlmICggcCA9PT0gRHN0Q29sb3JGYWN0b3IgKSByZXR1cm4gX2dsLkRTVF9DT0xPUjtcblx0XHRpZiAoIHAgPT09IE9uZU1pbnVzRHN0Q29sb3JGYWN0b3IgKSByZXR1cm4gX2dsLk9ORV9NSU5VU19EU1RfQ09MT1I7XG5cdFx0aWYgKCBwID09PSBTcmNBbHBoYVNhdHVyYXRlRmFjdG9yICkgcmV0dXJuIF9nbC5TUkNfQUxQSEFfU0FUVVJBVEU7XG5cblx0XHRpZiAoIHAgPT09IFJHQl9TM1RDX0RYVDFfRm9ybWF0IHx8IHAgPT09IFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCB8fFxuXHRcdFx0cCA9PT0gUkdCQV9TM1RDX0RYVDNfRm9ybWF0IHx8IHAgPT09IFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdCApIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdFx0aWYgKCBwID09PSBSR0JfUzNUQ19EWFQxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVDtcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUzNUQ19EWFQzX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQ7XG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9TM1RDX0RYVDVfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBwID09PSBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCB8fCBwID09PSBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCB8fFxuXHRcdFx0cCA9PT0gUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0IHx8IHAgPT09IFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCApIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xuXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCX1BWUlRDXzRCUFBWMV9JTUc7XG5cdFx0XHRcdGlmICggcCA9PT0gUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCX1BWUlRDXzJCUFBWMV9JTUc7XG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRztcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjFfSU1HO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IFJHQl9FVEMxX0Zvcm1hdCApIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMScgKTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCX0VUQzFfV0VCR0w7XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IE1pbkVxdWF0aW9uIHx8IHAgPT09IE1heEVxdWF0aW9uICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0VYVF9ibGVuZF9taW5tYXgnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xuXG5cdFx0XHRcdGlmICggcCA9PT0gTWluRXF1YXRpb24gKSByZXR1cm4gZXh0ZW5zaW9uLk1JTl9FWFQ7XG5cdFx0XHRcdGlmICggcCA9PT0gTWF4RXF1YXRpb24gKSByZXR1cm4gZXh0ZW5zaW9uLk1BWF9FWFQ7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gVW5zaWduZWRJbnQyNDhUeXBlICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2RlcHRoX3RleHR1cmUnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkgcmV0dXJuIGV4dGVuc2lvbi5VTlNJR05FRF9JTlRfMjRfOF9XRUJHTDtcblxuXHRcdH1cblxuXHRcdHJldHVybiAwO1xuXG5cdH1cblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEZvZ0V4cDIgKCBjb2xvciwgZGVuc2l0eSApIHtcblxuXHR0aGlzLm5hbWUgPSAnJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCBjb2xvciApO1xuXHR0aGlzLmRlbnNpdHkgPSAoIGRlbnNpdHkgIT09IHVuZGVmaW5lZCApID8gZGVuc2l0eSA6IDAuMDAwMjU7XG5cbn1cblxuRm9nRXhwMi5wcm90b3R5cGUuaXNGb2dFeHAyID0gdHJ1ZTtcblxuRm9nRXhwMi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0cmV0dXJuIG5ldyBGb2dFeHAyKCB0aGlzLmNvbG9yLmdldEhleCgpLCB0aGlzLmRlbnNpdHkgKTtcblxufTtcblxuRm9nRXhwMi5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdHJldHVybiB7XG5cdFx0dHlwZTogJ0ZvZ0V4cDInLFxuXHRcdGNvbG9yOiB0aGlzLmNvbG9yLmdldEhleCgpLFxuXHRcdGRlbnNpdHk6IHRoaXMuZGVuc2l0eVxuXHR9O1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEZvZyAoIGNvbG9yLCBuZWFyLCBmYXIgKSB7XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggY29sb3IgKTtcblxuXHR0aGlzLm5lYXIgPSAoIG5lYXIgIT09IHVuZGVmaW5lZCApID8gbmVhciA6IDE7XG5cdHRoaXMuZmFyID0gKCBmYXIgIT09IHVuZGVmaW5lZCApID8gZmFyIDogMTAwMDtcblxufVxuXG5Gb2cucHJvdG90eXBlLmlzRm9nID0gdHJ1ZTtcblxuRm9nLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRyZXR1cm4gbmV3IEZvZyggdGhpcy5jb2xvci5nZXRIZXgoKSwgdGhpcy5uZWFyLCB0aGlzLmZhciApO1xuXG59O1xuXG5Gb2cucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRyZXR1cm4ge1xuXHRcdHR5cGU6ICdGb2cnLFxuXHRcdGNvbG9yOiB0aGlzLmNvbG9yLmdldEhleCgpLFxuXHRcdG5lYXI6IHRoaXMubmVhcixcblx0XHRmYXI6IHRoaXMuZmFyXG5cdH07XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTY2VuZSAoKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTY2VuZSc7XG5cblx0dGhpcy5iYWNrZ3JvdW5kID0gbnVsbDtcblx0dGhpcy5mb2cgPSBudWxsO1xuXHR0aGlzLm92ZXJyaWRlTWF0ZXJpYWwgPSBudWxsO1xuXG5cdHRoaXMuYXV0b1VwZGF0ZSA9IHRydWU7IC8vIGNoZWNrZWQgYnkgdGhlIHJlbmRlcmVyXG5cbn1cblxuU2NlbmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogU2NlbmUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSwgcmVjdXJzaXZlICk7XG5cblx0XHRpZiAoIHNvdXJjZS5iYWNrZ3JvdW5kICE9PSBudWxsICkgdGhpcy5iYWNrZ3JvdW5kID0gc291cmNlLmJhY2tncm91bmQuY2xvbmUoKTtcblx0XHRpZiAoIHNvdXJjZS5mb2cgIT09IG51bGwgKSB0aGlzLmZvZyA9IHNvdXJjZS5mb2cuY2xvbmUoKTtcblx0XHRpZiAoIHNvdXJjZS5vdmVycmlkZU1hdGVyaWFsICE9PSBudWxsICkgdGhpcy5vdmVycmlkZU1hdGVyaWFsID0gc291cmNlLm92ZXJyaWRlTWF0ZXJpYWwuY2xvbmUoKTtcblxuXHRcdHRoaXMuYXV0b1VwZGF0ZSA9IHNvdXJjZS5hdXRvVXBkYXRlO1xuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhBdXRvVXBkYXRlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRcdHZhciBkYXRhID0gT2JqZWN0M0QucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7XG5cblx0XHRpZiAoIHRoaXMuYmFja2dyb3VuZCAhPT0gbnVsbCApIGRhdGEub2JqZWN0LmJhY2tncm91bmQgPSB0aGlzLmJhY2tncm91bmQudG9KU09OKCBtZXRhICk7XG5cdFx0aWYgKCB0aGlzLmZvZyAhPT0gbnVsbCApIGRhdGEub2JqZWN0LmZvZyA9IHRoaXMuZm9nLnRvSlNPTigpO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gTGVuc0ZsYXJlKCB0ZXh0dXJlLCBzaXplLCBkaXN0YW5jZSwgYmxlbmRpbmcsIGNvbG9yICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmxlbnNGbGFyZXMgPSBbXTtcblxuXHR0aGlzLnBvc2l0aW9uU2NyZWVuID0gbmV3IFZlY3RvcjMoKTtcblx0dGhpcy5jdXN0b21VcGRhdGVDYWxsYmFjayA9IHVuZGVmaW5lZDtcblxuXHRpZiAoIHRleHR1cmUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdHRoaXMuYWRkKCB0ZXh0dXJlLCBzaXplLCBkaXN0YW5jZSwgYmxlbmRpbmcsIGNvbG9yICk7XG5cblx0fVxuXG59XG5cbkxlbnNGbGFyZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMZW5zRmxhcmUsXG5cblx0aXNMZW5zRmxhcmU6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMucG9zaXRpb25TY3JlZW4uY29weSggc291cmNlLnBvc2l0aW9uU2NyZWVuICk7XG5cdFx0dGhpcy5jdXN0b21VcGRhdGVDYWxsYmFjayA9IHNvdXJjZS5jdXN0b21VcGRhdGVDYWxsYmFjaztcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHNvdXJjZS5sZW5zRmxhcmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMubGVuc0ZsYXJlcy5wdXNoKCBzb3VyY2UubGVuc0ZsYXJlc1sgaSBdICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCB0ZXh0dXJlLCBzaXplLCBkaXN0YW5jZSwgYmxlbmRpbmcsIGNvbG9yLCBvcGFjaXR5ICkge1xuXG5cdFx0aWYgKCBzaXplID09PSB1bmRlZmluZWQgKSBzaXplID0gLSAxO1xuXHRcdGlmICggZGlzdGFuY2UgPT09IHVuZGVmaW5lZCApIGRpc3RhbmNlID0gMDtcblx0XHRpZiAoIG9wYWNpdHkgPT09IHVuZGVmaW5lZCApIG9wYWNpdHkgPSAxO1xuXHRcdGlmICggY29sb3IgPT09IHVuZGVmaW5lZCApIGNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApO1xuXHRcdGlmICggYmxlbmRpbmcgPT09IHVuZGVmaW5lZCApIGJsZW5kaW5nID0gTm9ybWFsQmxlbmRpbmc7XG5cblx0XHRkaXN0YW5jZSA9IE1hdGgubWluKCBkaXN0YW5jZSwgTWF0aC5tYXgoIDAsIGRpc3RhbmNlICkgKTtcblxuXHRcdHRoaXMubGVuc0ZsYXJlcy5wdXNoKCB7XG5cdFx0XHR0ZXh0dXJlOiB0ZXh0dXJlLFx0Ly8gVEhSRUUuVGV4dHVyZVxuXHRcdFx0c2l6ZTogc2l6ZSwgXHRcdC8vIHNpemUgaW4gcGl4ZWxzICgtMSA9IHVzZSB0ZXh0dXJlLndpZHRoKVxuXHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLCBcdC8vIGRpc3RhbmNlICgwLTEpIGZyb20gbGlnaHQgc291cmNlICgwPWF0IGxpZ2h0IHNvdXJjZSlcblx0XHRcdHg6IDAsIHk6IDAsIHo6IDAsXHQvLyBzY3JlZW4gcG9zaXRpb24gKC0xID0+IDEpIHogPSAwIGlzIGluIGZyb250IHogPSAxIGlzIGJhY2tcblx0XHRcdHNjYWxlOiAxLCBcdFx0Ly8gc2NhbGVcblx0XHRcdHJvdGF0aW9uOiAwLCBcdFx0Ly8gcm90YXRpb25cblx0XHRcdG9wYWNpdHk6IG9wYWNpdHksXHQvLyBvcGFjaXR5XG5cdFx0XHRjb2xvcjogY29sb3IsXHRcdC8vIGNvbG9yXG5cdFx0XHRibGVuZGluZzogYmxlbmRpbmdcdC8vIGJsZW5kaW5nXG5cdFx0fSApO1xuXG5cdH0sXG5cblx0Lypcblx0ICogVXBkYXRlIGxlbnMgZmxhcmVzIHVwZGF0ZSBwb3NpdGlvbnMgb24gYWxsIGZsYXJlcyBiYXNlZCBvbiB0aGUgc2NyZWVuIHBvc2l0aW9uXG5cdCAqIFNldCBteUxlbnNGbGFyZS5jdXN0b21VcGRhdGVDYWxsYmFjayB0byBhbHRlciB0aGUgZmxhcmVzIGluIHlvdXIgcHJvamVjdCBzcGVjaWZpYyB3YXkuXG5cdCAqL1xuXG5cdHVwZGF0ZUxlbnNGbGFyZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBmLCBmbCA9IHRoaXMubGVuc0ZsYXJlcy5sZW5ndGg7XG5cdFx0dmFyIGZsYXJlO1xuXHRcdHZhciB2ZWNYID0gLSB0aGlzLnBvc2l0aW9uU2NyZWVuLnggKiAyO1xuXHRcdHZhciB2ZWNZID0gLSB0aGlzLnBvc2l0aW9uU2NyZWVuLnkgKiAyO1xuXG5cdFx0Zm9yICggZiA9IDA7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0ZmxhcmUgPSB0aGlzLmxlbnNGbGFyZXNbIGYgXTtcblxuXHRcdFx0ZmxhcmUueCA9IHRoaXMucG9zaXRpb25TY3JlZW4ueCArIHZlY1ggKiBmbGFyZS5kaXN0YW5jZTtcblx0XHRcdGZsYXJlLnkgPSB0aGlzLnBvc2l0aW9uU2NyZWVuLnkgKyB2ZWNZICogZmxhcmUuZGlzdGFuY2U7XG5cblx0XHRcdGZsYXJlLndhbnRlZFJvdGF0aW9uID0gZmxhcmUueCAqIE1hdGguUEkgKiAwLjI1O1xuXHRcdFx0ZmxhcmUucm90YXRpb24gKz0gKCBmbGFyZS53YW50ZWRSb3RhdGlvbiAtIGZsYXJlLnJvdGF0aW9uICkgKiAwLjI1O1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICpcdHV2T2Zmc2V0OiBuZXcgVEhSRUUuVmVjdG9yMigpLFxuICpcdHV2U2NhbGU6IG5ldyBUSFJFRS5WZWN0b3IyKClcbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBTcHJpdGVNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1Nwcml0ZU1hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApO1xuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5yb3RhdGlvbiA9IDA7XG5cblx0dGhpcy5mb2cgPSBmYWxzZTtcblx0dGhpcy5saWdodHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cblNwcml0ZU1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuU3ByaXRlTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ByaXRlTWF0ZXJpYWw7XG5TcHJpdGVNYXRlcmlhbC5wcm90b3R5cGUuaXNTcHJpdGVNYXRlcmlhbCA9IHRydWU7XG5cblNwcml0ZU1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMucm90YXRpb24gPSBzb3VyY2Uucm90YXRpb247XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gU3ByaXRlKCBtYXRlcmlhbCApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1Nwcml0ZSc7XG5cblx0dGhpcy5tYXRlcmlhbCA9ICggbWF0ZXJpYWwgIT09IHVuZGVmaW5lZCApID8gbWF0ZXJpYWwgOiBuZXcgU3ByaXRlTWF0ZXJpYWwoKTtcblxufVxuXG5TcHJpdGUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogU3ByaXRlLFxuXG5cdGlzU3ByaXRlOiB0cnVlLFxuXG5cdHJheWNhc3Q6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGludGVyc2VjdFBvaW50ID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgd29ybGRQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHdvcmxkU2NhbGUgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcblxuXHRcdFx0d29ybGRQb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTtcblx0XHRcdHJheWNhc3Rlci5yYXkuY2xvc2VzdFBvaW50VG9Qb2ludCggd29ybGRQb3NpdGlvbiwgaW50ZXJzZWN0UG9pbnQgKTtcblxuXHRcdFx0d29ybGRTY2FsZS5zZXRGcm9tTWF0cml4U2NhbGUoIHRoaXMubWF0cml4V29ybGQgKTtcblx0XHRcdHZhciBndWVzc1NpemVTcSA9IHdvcmxkU2NhbGUueCAqIHdvcmxkU2NhbGUueSAvIDQ7XG5cblx0XHRcdGlmICggd29ybGRQb3NpdGlvbi5kaXN0YW5jZVRvU3F1YXJlZCggaW50ZXJzZWN0UG9pbnQgKSA+IGd1ZXNzU2l6ZVNxICkgcmV0dXJuO1xuXG5cdFx0XHR2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlcnNlY3RQb2ludCApO1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgcmV0dXJuO1xuXG5cdFx0XHRpbnRlcnNlY3RzLnB1c2goIHtcblxuXHRcdFx0XHRkaXN0YW5jZTogZGlzdGFuY2UsXG5cdFx0XHRcdHBvaW50OiBpbnRlcnNlY3RQb2ludC5jbG9uZSgpLFxuXHRcdFx0XHRmYWNlOiBudWxsLFxuXHRcdFx0XHRvYmplY3Q6IHRoaXNcblxuXHRcdFx0fSApO1xuXG5cdFx0fTtcblxuXHR9KCkgKSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLm1hdGVyaWFsICkuY29weSggdGhpcyApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMT0QoKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMT0QnO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7XG5cdFx0bGV2ZWxzOiB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IFtdXG5cdFx0fVxuXHR9ICk7XG5cbn1cblxuTE9ELnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExPRCxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSwgZmFsc2UgKTtcblxuXHRcdHZhciBsZXZlbHMgPSBzb3VyY2UubGV2ZWxzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBsZXZlbCA9IGxldmVsc1sgaSBdO1xuXG5cdFx0XHR0aGlzLmFkZExldmVsKCBsZXZlbC5vYmplY3QuY2xvbmUoKSwgbGV2ZWwuZGlzdGFuY2UgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkTGV2ZWw6IGZ1bmN0aW9uICggb2JqZWN0LCBkaXN0YW5jZSApIHtcblxuXHRcdGlmICggZGlzdGFuY2UgPT09IHVuZGVmaW5lZCApIGRpc3RhbmNlID0gMDtcblxuXHRcdGRpc3RhbmNlID0gTWF0aC5hYnMoIGRpc3RhbmNlICk7XG5cblx0XHR2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XG5cblx0XHRmb3IgKCB2YXIgbCA9IDA7IGwgPCBsZXZlbHMubGVuZ3RoOyBsICsrICkge1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgbGV2ZWxzWyBsIF0uZGlzdGFuY2UgKSB7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGxldmVscy5zcGxpY2UoIGwsIDAsIHsgZGlzdGFuY2U6IGRpc3RhbmNlLCBvYmplY3Q6IG9iamVjdCB9ICk7XG5cblx0XHR0aGlzLmFkZCggb2JqZWN0ICk7XG5cblx0fSxcblxuXHRnZXRPYmplY3RGb3JEaXN0YW5jZTogZnVuY3Rpb24gKCBkaXN0YW5jZSApIHtcblxuXHRcdHZhciBsZXZlbHMgPSB0aGlzLmxldmVscztcblxuXHRcdGZvciAoIHZhciBpID0gMSwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgbGV2ZWxzWyBpIF0uZGlzdGFuY2UgKSB7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBsZXZlbHNbIGkgLSAxIF0ub2JqZWN0O1xuXG5cdH0sXG5cblx0cmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWF0cml4UG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcblxuXHRcdFx0bWF0cml4UG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIG1hdHJpeFBvc2l0aW9uICk7XG5cblx0XHRcdHRoaXMuZ2V0T2JqZWN0Rm9yRGlzdGFuY2UoIGRpc3RhbmNlICkucmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICk7XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdHVwZGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSggY2FtZXJhICkge1xuXG5cdFx0XHR2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XG5cblx0XHRcdGlmICggbGV2ZWxzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdFx0djEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcblx0XHRcdFx0djIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0dmFyIGRpc3RhbmNlID0gdjEuZGlzdGFuY2VUbyggdjIgKTtcblxuXHRcdFx0XHRsZXZlbHNbIDAgXS5vYmplY3QudmlzaWJsZSA9IHRydWU7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGRpc3RhbmNlID49IGxldmVsc1sgaSBdLmRpc3RhbmNlICkge1xuXG5cdFx0XHRcdFx0XHRsZXZlbHNbIGkgLSAxIF0ub2JqZWN0LnZpc2libGUgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGxldmVsc1sgaSBdLm9iamVjdC52aXNpYmxlID0gdHJ1ZTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0bGV2ZWxzWyBpIF0ub2JqZWN0LnZpc2libGUgPSBmYWxzZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGRhdGEub2JqZWN0LmxldmVscyA9IFtdO1xuXG5cdFx0dmFyIGxldmVscyA9IHRoaXMubGV2ZWxzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBsZXZlbCA9IGxldmVsc1sgaSBdO1xuXG5cdFx0XHRkYXRhLm9iamVjdC5sZXZlbHMucHVzaCgge1xuXHRcdFx0XHRvYmplY3Q6IGxldmVsLm9iamVjdC51dWlkLFxuXHRcdFx0XHRkaXN0YW5jZTogbGV2ZWwuZGlzdGFuY2Vcblx0XHRcdH0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtaWNoYWVsIGd1ZXJyZXJvIC8gaHR0cDovL3JlYWxpdHltZWx0ZG93bi5jb21cbiAqIEBhdXRob3IgaWtlcnIgLyBodHRwOi8vdmVyb2xkLmNvbVxuICovXG5cbmZ1bmN0aW9uIFNrZWxldG9uKCBib25lcywgYm9uZUludmVyc2VzICkge1xuXG5cdC8vIGNvcHkgdGhlIGJvbmUgYXJyYXlcblxuXHRib25lcyA9IGJvbmVzIHx8IFtdO1xuXG5cdHRoaXMuYm9uZXMgPSBib25lcy5zbGljZSggMCApO1xuXHR0aGlzLmJvbmVNYXRyaWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIHRoaXMuYm9uZXMubGVuZ3RoICogMTYgKTtcblxuXHQvLyB1c2UgdGhlIHN1cHBsaWVkIGJvbmUgaW52ZXJzZXMgb3IgY2FsY3VsYXRlIHRoZSBpbnZlcnNlc1xuXG5cdGlmICggYm9uZUludmVyc2VzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHR0aGlzLmNhbGN1bGF0ZUludmVyc2VzKCk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGlmICggdGhpcy5ib25lcy5sZW5ndGggPT09IGJvbmVJbnZlcnNlcy5sZW5ndGggKSB7XG5cblx0XHRcdHRoaXMuYm9uZUludmVyc2VzID0gYm9uZUludmVyc2VzLnNsaWNlKCAwICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Ta2VsZXRvbiBib25lSW52ZXJzZXMgaXMgdGhlIHdyb25nIGxlbmd0aC4nICk7XG5cblx0XHRcdHRoaXMuYm9uZUludmVyc2VzID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdHRoaXMuYm9uZUludmVyc2VzLnB1c2goIG5ldyBNYXRyaXg0KCkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5PYmplY3QuYXNzaWduKCBTa2VsZXRvbi5wcm90b3R5cGUsIHtcblxuXHRjYWxjdWxhdGVJbnZlcnNlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5ib25lSW52ZXJzZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgaW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRcdGlmICggdGhpcy5ib25lc1sgaSBdICkge1xuXG5cdFx0XHRcdGludmVyc2UuZ2V0SW52ZXJzZSggdGhpcy5ib25lc1sgaSBdLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5ib25lSW52ZXJzZXMucHVzaCggaW52ZXJzZSApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0cG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJvbmUsIGksIGlsO1xuXG5cdFx0Ly8gcmVjb3ZlciB0aGUgYmluZC10aW1lIHdvcmxkIG1hdHJpY2VzXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRib25lID0gdGhpcy5ib25lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGJvbmUgKSB7XG5cblx0XHRcdFx0Ym9uZS5tYXRyaXhXb3JsZC5nZXRJbnZlcnNlKCB0aGlzLmJvbmVJbnZlcnNlc1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGNvbXB1dGUgdGhlIGxvY2FsIG1hdHJpY2VzLCBwb3NpdGlvbnMsIHJvdGF0aW9ucyBhbmQgc2NhbGVzXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRib25lID0gdGhpcy5ib25lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGJvbmUgKSB7XG5cblx0XHRcdFx0aWYgKCBib25lLnBhcmVudCAmJiBib25lLnBhcmVudC5pc0JvbmUgKSB7XG5cblx0XHRcdFx0XHRib25lLm1hdHJpeC5nZXRJbnZlcnNlKCBib25lLnBhcmVudC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHRcdGJvbmUubWF0cml4Lm11bHRpcGx5KCBib25lLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGJvbmUubWF0cml4LmNvcHkoIGJvbmUubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ym9uZS5tYXRyaXguZGVjb21wb3NlKCBib25lLnBvc2l0aW9uLCBib25lLnF1YXRlcm5pb24sIGJvbmUuc2NhbGUgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0dXBkYXRlOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvZmZzZXRNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHRcdHZhciBpZGVudGl0eU1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0XHR2YXIgYm9uZXMgPSB0aGlzLmJvbmVzO1xuXHRcdFx0dmFyIGJvbmVJbnZlcnNlcyA9IHRoaXMuYm9uZUludmVyc2VzO1xuXHRcdFx0dmFyIGJvbmVNYXRyaWNlcyA9IHRoaXMuYm9uZU1hdHJpY2VzO1xuXHRcdFx0dmFyIGJvbmVUZXh0dXJlID0gdGhpcy5ib25lVGV4dHVyZTtcblxuXHRcdFx0Ly8gZmxhdHRlbiBib25lIG1hdHJpY2VzIHRvIGFycmF5XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHQvLyBjb21wdXRlIHRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgY3VycmVudCBhbmQgdGhlIG9yaWdpbmFsIHRyYW5zZm9ybVxuXG5cdFx0XHRcdHZhciBtYXRyaXggPSBib25lc1sgaSBdID8gYm9uZXNbIGkgXS5tYXRyaXhXb3JsZCA6IGlkZW50aXR5TWF0cml4O1xuXG5cdFx0XHRcdG9mZnNldE1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXgsIGJvbmVJbnZlcnNlc1sgaSBdICk7XG5cdFx0XHRcdG9mZnNldE1hdHJpeC50b0FycmF5KCBib25lTWF0cmljZXMsIGkgKiAxNiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggYm9uZVRleHR1cmUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRib25lVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSApKCksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgU2tlbGV0b24oIHRoaXMuYm9uZXMsIHRoaXMuYm9uZUludmVyc2VzICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIGlrZXJyIC8gaHR0cDovL3Zlcm9sZC5jb21cbiAqL1xuXG5mdW5jdGlvbiBCb25lKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQm9uZSc7XG5cbn1cblxuQm9uZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBCb25lLFxuXG5cdGlzQm9uZTogdHJ1ZVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIGlrZXJyIC8gaHR0cDovL3Zlcm9sZC5jb21cbiAqL1xuXG5mdW5jdGlvbiBTa2lubmVkTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdE1lc2guY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy50eXBlID0gJ1NraW5uZWRNZXNoJztcblxuXHR0aGlzLmJpbmRNb2RlID0gJ2F0dGFjaGVkJztcblx0dGhpcy5iaW5kTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0dmFyIGJvbmVzID0gdGhpcy5pbml0Qm9uZXMoKTtcblx0dmFyIHNrZWxldG9uID0gbmV3IFNrZWxldG9uKCBib25lcyApO1xuXG5cdHRoaXMuYmluZCggc2tlbGV0b24sIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHR0aGlzLm5vcm1hbGl6ZVNraW5XZWlnaHRzKCk7XG5cbn1cblxuU2tpbm5lZE1lc2gucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTWVzaC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTa2lubmVkTWVzaCxcblxuXHRpc1NraW5uZWRNZXNoOiB0cnVlLFxuXG5cdGluaXRCb25lczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJvbmVzID0gW10sIGJvbmUsIGdib25lO1xuXHRcdHZhciBpLCBpbDtcblxuXHRcdGlmICggdGhpcy5nZW9tZXRyeSAmJiB0aGlzLmdlb21ldHJ5LmJvbmVzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIGZpcnN0LCBjcmVhdGUgYXJyYXkgb2YgJ0JvbmUnIG9iamVjdHMgZnJvbSBnZW9tZXRyeSBkYXRhXG5cblx0XHRcdGZvciAoIGkgPSAwLCBpbCA9IHRoaXMuZ2VvbWV0cnkuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0Z2JvbmUgPSB0aGlzLmdlb21ldHJ5LmJvbmVzWyBpIF07XG5cblx0XHRcdFx0Ly8gY3JlYXRlIG5ldyAnQm9uZScgb2JqZWN0XG5cblx0XHRcdFx0Ym9uZSA9IG5ldyBCb25lKCk7XG5cdFx0XHRcdGJvbmVzLnB1c2goIGJvbmUgKTtcblxuXHRcdFx0XHQvLyBhcHBseSB2YWx1ZXNcblxuXHRcdFx0XHRib25lLm5hbWUgPSBnYm9uZS5uYW1lO1xuXHRcdFx0XHRib25lLnBvc2l0aW9uLmZyb21BcnJheSggZ2JvbmUucG9zICk7XG5cdFx0XHRcdGJvbmUucXVhdGVybmlvbi5mcm9tQXJyYXkoIGdib25lLnJvdHEgKTtcblx0XHRcdFx0aWYgKCBnYm9uZS5zY2wgIT09IHVuZGVmaW5lZCApIGJvbmUuc2NhbGUuZnJvbUFycmF5KCBnYm9uZS5zY2wgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBzZWNvbmQsIGNyZWF0ZSBib25lIGhpZXJhcmNoeVxuXG5cdFx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmdlb21ldHJ5LmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdGdib25lID0gdGhpcy5nZW9tZXRyeS5ib25lc1sgaSBdO1xuXG5cdFx0XHRcdGlmICggKCBnYm9uZS5wYXJlbnQgIT09IC0gMSApICYmICggZ2JvbmUucGFyZW50ICE9PSBudWxsICkgJiYgKCBib25lc1sgZ2JvbmUucGFyZW50IF0gIT09IHVuZGVmaW5lZCApICkge1xuXG5cdFx0XHRcdFx0Ly8gc3Vic2VxdWVudCBib25lcyBpbiB0aGUgaGllcmFyY2h5XG5cblx0XHRcdFx0XHRib25lc1sgZ2JvbmUucGFyZW50IF0uYWRkKCBib25lc1sgaSBdICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIHRvcG1vc3QgYm9uZSwgaW1tZWRpYXRlIGNoaWxkIG9mIHRoZSBza2lubmVkIG1lc2hcblxuXHRcdFx0XHRcdHRoaXMuYWRkKCBib25lc1sgaSBdICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBub3cgdGhlIGJvbmVzIGFyZSBwYXJ0IG9mIHRoZSBzY2VuZSBncmFwaCBhbmQgY2hpbGRyZW4gb2YgdGhlIHNraW5uZWQgbWVzaC5cblx0XHQvLyBsZXQncyB1cGRhdGUgdGhlIGNvcnJlc3BvbmRpbmcgbWF0cmljZXNcblxuXHRcdHRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcblxuXHRcdHJldHVybiBib25lcztcblxuXHR9LFxuXG5cdGJpbmQ6IGZ1bmN0aW9uICggc2tlbGV0b24sIGJpbmRNYXRyaXggKSB7XG5cblx0XHR0aGlzLnNrZWxldG9uID0gc2tlbGV0b247XG5cblx0XHRpZiAoIGJpbmRNYXRyaXggPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0XHR0aGlzLnNrZWxldG9uLmNhbGN1bGF0ZUludmVyc2VzKCk7XG5cblx0XHRcdGJpbmRNYXRyaXggPSB0aGlzLm1hdHJpeFdvcmxkO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5iaW5kTWF0cml4LmNvcHkoIGJpbmRNYXRyaXggKTtcblx0XHR0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmdldEludmVyc2UoIGJpbmRNYXRyaXggKTtcblxuXHR9LFxuXG5cdHBvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuc2tlbGV0b24ucG9zZSgpO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplU2tpbldlaWdodHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzY2FsZSwgaTtcblxuXHRcdGlmICggdGhpcy5nZW9tZXRyeSAmJiB0aGlzLmdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdGZvciAoIGkgPSAwOyBpIDwgdGhpcy5nZW9tZXRyeS5za2luV2VpZ2h0cy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIHN3ID0gdGhpcy5nZW9tZXRyeS5za2luV2VpZ2h0c1sgaSBdO1xuXG5cdFx0XHRcdHNjYWxlID0gMS4wIC8gc3cubGVuZ3RoTWFuaGF0dGFuKCk7XG5cblx0XHRcdFx0aWYgKCBzY2FsZSAhPT0gSW5maW5pdHkgKSB7XG5cblx0XHRcdFx0XHRzdy5tdWx0aXBseVNjYWxhciggc2NhbGUgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0c3cuc2V0KCAxLCAwLCAwLCAwICk7IC8vIGRvIHNvbWV0aGluZyByZWFzb25hYmxlXG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCB0aGlzLmdlb21ldHJ5ICYmIHRoaXMuZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0dmFyIHZlYyA9IG5ldyBWZWN0b3I0KCk7XG5cblx0XHRcdHZhciBza2luV2VpZ2h0ID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnNraW5XZWlnaHQ7XG5cblx0XHRcdGZvciAoIGkgPSAwOyBpIDwgc2tpbldlaWdodC5jb3VudDsgaSArKyApIHtcblxuXHRcdFx0XHR2ZWMueCA9IHNraW5XZWlnaHQuZ2V0WCggaSApO1xuXHRcdFx0XHR2ZWMueSA9IHNraW5XZWlnaHQuZ2V0WSggaSApO1xuXHRcdFx0XHR2ZWMueiA9IHNraW5XZWlnaHQuZ2V0WiggaSApO1xuXHRcdFx0XHR2ZWMudyA9IHNraW5XZWlnaHQuZ2V0VyggaSApO1xuXG5cdFx0XHRcdHNjYWxlID0gMS4wIC8gdmVjLmxlbmd0aE1hbmhhdHRhbigpO1xuXG5cdFx0XHRcdGlmICggc2NhbGUgIT09IEluZmluaXR5ICkge1xuXG5cdFx0XHRcdFx0dmVjLm11bHRpcGx5U2NhbGFyKCBzY2FsZSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR2ZWMuc2V0KCAxLCAwLCAwLCAwICk7IC8vIGRvIHNvbWV0aGluZyByZWFzb25hYmxlXG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHNraW5XZWlnaHQuc2V0WFlaVyggaSwgdmVjLngsIHZlYy55LCB2ZWMueiwgdmVjLncgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0dXBkYXRlTWF0cml4V29ybGQ6IGZ1bmN0aW9uICggZm9yY2UgKSB7XG5cblx0XHRNZXNoLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3JjZSApO1xuXG5cdFx0aWYgKCB0aGlzLmJpbmRNb2RlID09PSAnYXR0YWNoZWQnICkge1xuXG5cdFx0XHR0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmdldEludmVyc2UoIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHRoaXMuYmluZE1vZGUgPT09ICdkZXRhY2hlZCcgKSB7XG5cblx0XHRcdHRoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZSggdGhpcy5iaW5kTWF0cml4ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Ta2lubmVkTWVzaDogVW5yZWNvZ25pemVkIGJpbmRNb2RlOiAnICsgdGhpcy5iaW5kTW9kZSApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5nZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBsaW5ld2lkdGg6IDxmbG9hdD4sXG4gKiAgbGluZWNhcDogXCJyb3VuZFwiLFxuICogIGxpbmVqb2luOiBcInJvdW5kXCJcbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBMaW5lQmFzaWNNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVCYXNpY01hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApO1xuXG5cdHRoaXMubGluZXdpZHRoID0gMTtcblx0dGhpcy5saW5lY2FwID0gJ3JvdW5kJztcblx0dGhpcy5saW5lam9pbiA9ICdyb3VuZCc7XG5cblx0dGhpcy5saWdodHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbkxpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTGluZUJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGluZUJhc2ljTWF0ZXJpYWw7XG5cbkxpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5pc0xpbmVCYXNpY01hdGVyaWFsID0gdHJ1ZTtcblxuTGluZUJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdHRoaXMubGluZXdpZHRoID0gc291cmNlLmxpbmV3aWR0aDtcblx0dGhpcy5saW5lY2FwID0gc291cmNlLmxpbmVjYXA7XG5cdHRoaXMubGluZWpvaW4gPSBzb3VyY2UubGluZWpvaW47XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwsIG1vZGUgKSB7XG5cblx0aWYgKCBtb2RlID09PSAxICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZTogcGFyYW1ldGVyIFRIUkVFLkxpbmVQaWVjZXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gQ3JlYXRlZCBUSFJFRS5MaW5lU2VnbWVudHMgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIG5ldyBMaW5lU2VnbWVudHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdH1cblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmUnO1xuXG5cdHRoaXMuZ2VvbWV0cnkgPSBnZW9tZXRyeSAhPT0gdW5kZWZpbmVkID8gZ2VvbWV0cnkgOiBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsICE9PSB1bmRlZmluZWQgPyBtYXRlcmlhbCA6IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmIH0gKTtcblxufVxuXG5MaW5lLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExpbmUsXG5cblx0aXNMaW5lOiB0cnVlLFxuXG5cdHJheWNhc3Q6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGludmVyc2VNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHRcdHZhciByYXkgPSBuZXcgUmF5KCk7XG5cdFx0dmFyIHNwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XG5cblx0XHRcdHZhciBwcmVjaXNpb24gPSByYXljYXN0ZXIubGluZVByZWNpc2lvbjtcblx0XHRcdHZhciBwcmVjaXNpb25TcSA9IHByZWNpc2lvbiAqIHByZWNpc2lvbjtcblxuXHRcdFx0dmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblx0XHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7XG5cblx0XHRcdC8vIENoZWNraW5nIGJvdW5kaW5nU3BoZXJlIGRpc3RhbmNlIHRvIHJheVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRcdHNwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApO1xuXHRcdFx0c3BoZXJlLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcblxuXHRcdFx0aWYgKCByYXljYXN0ZXIucmF5LmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdFx0Ly9cblxuXHRcdFx0aW52ZXJzZU1hdHJpeC5nZXRJbnZlcnNlKCBtYXRyaXhXb3JsZCApO1xuXHRcdFx0cmF5LmNvcHkoIHJheWNhc3Rlci5yYXkgKS5hcHBseU1hdHJpeDQoIGludmVyc2VNYXRyaXggKTtcblxuXHRcdFx0dmFyIHZTdGFydCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHR2YXIgdkVuZCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHR2YXIgaW50ZXJTZWdtZW50ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdHZhciBpbnRlclJheSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHR2YXIgc3RlcCA9ICh0aGlzICYmIHRoaXMuaXNMaW5lU2VnbWVudHMpID8gMiA6IDE7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcblx0XHRcdFx0dmFyIGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXHRcdFx0XHR2YXIgcG9zaXRpb25zID0gYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcblxuXHRcdFx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdFx0dmFyIGluZGljZXMgPSBpbmRleC5hcnJheTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGluZGljZXMubGVuZ3RoIC0gMTsgaSA8IGw7IGkgKz0gc3RlcCApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGEgPSBpbmRpY2VzWyBpIF07XG5cdFx0XHRcdFx0XHR2YXIgYiA9IGluZGljZXNbIGkgKyAxIF07XG5cblx0XHRcdFx0XHRcdHZTdGFydC5mcm9tQXJyYXkoIHBvc2l0aW9ucywgYSAqIDMgKTtcblx0XHRcdFx0XHRcdHZFbmQuZnJvbUFycmF5KCBwb3NpdGlvbnMsIGIgKiAzICk7XG5cblx0XHRcdFx0XHRcdHZhciBkaXN0U3EgPSByYXkuZGlzdGFuY2VTcVRvU2VnbWVudCggdlN0YXJ0LCB2RW5kLCBpbnRlclJheSwgaW50ZXJTZWdtZW50ICk7XG5cblx0XHRcdFx0XHRcdGlmICggZGlzdFNxID4gcHJlY2lzaW9uU3EgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdFx0aW50ZXJSYXkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICk7IC8vTW92ZSBiYWNrIHRvIHdvcmxkIHNwYWNlIGZvciBkaXN0YW5jZSBjYWxjdWxhdGlvblxuXG5cdFx0XHRcdFx0XHR2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlclJheSApO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgY29udGludWU7XG5cblx0XHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCgge1xuXG5cdFx0XHRcdFx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdFx0XHRcdFx0Ly8gV2hhdCBkbyB3ZSB3YW50PyBpbnRlcnNlY3Rpb24gcG9pbnQgb24gdGhlIHJheSBvciBvbiB0aGUgc2VnbWVudD8/XG5cdFx0XHRcdFx0XHRcdC8vIHBvaW50OiByYXljYXN0ZXIucmF5LmF0KCBkaXN0YW5jZSApLFxuXHRcdFx0XHRcdFx0XHRwb2ludDogaW50ZXJTZWdtZW50LmNsb25lKCkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICksXG5cdFx0XHRcdFx0XHRcdGluZGV4OiBpLFxuXHRcdFx0XHRcdFx0XHRmYWNlOiBudWxsLFxuXHRcdFx0XHRcdFx0XHRmYWNlSW5kZXg6IG51bGwsXG5cdFx0XHRcdFx0XHRcdG9iamVjdDogdGhpc1xuXG5cdFx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHBvc2l0aW9ucy5sZW5ndGggLyAzIC0gMTsgaSA8IGw7IGkgKz0gc3RlcCApIHtcblxuXHRcdFx0XHRcdFx0dlN0YXJ0LmZyb21BcnJheSggcG9zaXRpb25zLCAzICogaSApO1xuXHRcdFx0XHRcdFx0dkVuZC5mcm9tQXJyYXkoIHBvc2l0aW9ucywgMyAqIGkgKyAzICk7XG5cblx0XHRcdFx0XHRcdHZhciBkaXN0U3EgPSByYXkuZGlzdGFuY2VTcVRvU2VnbWVudCggdlN0YXJ0LCB2RW5kLCBpbnRlclJheSwgaW50ZXJTZWdtZW50ICk7XG5cblx0XHRcdFx0XHRcdGlmICggZGlzdFNxID4gcHJlY2lzaW9uU3EgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdFx0aW50ZXJSYXkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICk7IC8vTW92ZSBiYWNrIHRvIHdvcmxkIHNwYWNlIGZvciBkaXN0YW5jZSBjYWxjdWxhdGlvblxuXG5cdFx0XHRcdFx0XHR2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlclJheSApO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgY29udGludWU7XG5cblx0XHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCgge1xuXG5cdFx0XHRcdFx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdFx0XHRcdFx0Ly8gV2hhdCBkbyB3ZSB3YW50PyBpbnRlcnNlY3Rpb24gcG9pbnQgb24gdGhlIHJheSBvciBvbiB0aGUgc2VnbWVudD8/XG5cdFx0XHRcdFx0XHRcdC8vIHBvaW50OiByYXljYXN0ZXIucmF5LmF0KCBkaXN0YW5jZSApLFxuXHRcdFx0XHRcdFx0XHRwb2ludDogaW50ZXJTZWdtZW50LmNsb25lKCkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICksXG5cdFx0XHRcdFx0XHRcdGluZGV4OiBpLFxuXHRcdFx0XHRcdFx0XHRmYWNlOiBudWxsLFxuXHRcdFx0XHRcdFx0XHRmYWNlSW5kZXg6IG51bGwsXG5cdFx0XHRcdFx0XHRcdG9iamVjdDogdGhpc1xuXG5cdFx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRcdHZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzO1xuXHRcdFx0XHR2YXIgbmJWZXJ0aWNlcyA9IHZlcnRpY2VzLmxlbmd0aDtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBuYlZlcnRpY2VzIC0gMTsgaSArPSBzdGVwICkge1xuXG5cdFx0XHRcdFx0dmFyIGRpc3RTcSA9IHJheS5kaXN0YW5jZVNxVG9TZWdtZW50KCB2ZXJ0aWNlc1sgaSBdLCB2ZXJ0aWNlc1sgaSArIDEgXSwgaW50ZXJSYXksIGludGVyU2VnbWVudCApO1xuXG5cdFx0XHRcdFx0aWYgKCBkaXN0U3EgPiBwcmVjaXNpb25TcSApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aW50ZXJSYXkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICk7IC8vTW92ZSBiYWNrIHRvIHdvcmxkIHNwYWNlIGZvciBkaXN0YW5jZSBjYWxjdWxhdGlvblxuXG5cdFx0XHRcdFx0dmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJSYXkgKTtcblxuXHRcdFx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCgge1xuXG5cdFx0XHRcdFx0XHRkaXN0YW5jZTogZGlzdGFuY2UsXG5cdFx0XHRcdFx0XHQvLyBXaGF0IGRvIHdlIHdhbnQ/IGludGVyc2VjdGlvbiBwb2ludCBvbiB0aGUgcmF5IG9yIG9uIHRoZSBzZWdtZW50Pz9cblx0XHRcdFx0XHRcdC8vIHBvaW50OiByYXljYXN0ZXIucmF5LmF0KCBkaXN0YW5jZSApLFxuXHRcdFx0XHRcdFx0cG9pbnQ6IGludGVyU2VnbWVudC5jbG9uZSgpLmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApLFxuXHRcdFx0XHRcdFx0aW5kZXg6IGksXG5cdFx0XHRcdFx0XHRmYWNlOiBudWxsLFxuXHRcdFx0XHRcdFx0ZmFjZUluZGV4OiBudWxsLFxuXHRcdFx0XHRcdFx0b2JqZWN0OiB0aGlzXG5cblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMaW5lU2VnbWVudHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRMaW5lLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lU2VnbWVudHMnO1xuXG59XG5cbkxpbmVTZWdtZW50cy5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaW5lLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExpbmVTZWdtZW50cyxcblxuXHRpc0xpbmVTZWdtZW50czogdHJ1ZVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtZ3JldGVyIC8gaHR0cDovL2dpdGh1Yi5jb20vbWdyZXRlclxuICovXG5cbmZ1bmN0aW9uIExpbmVMb29wKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7XG5cblx0TGluZS5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGluZUxvb3AnO1xuXG59XG5cbkxpbmVMb29wLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpbmUucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTGluZUxvb3AsXG5cblx0aXNMaW5lTG9vcDogdHJ1ZSxcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBzaXplOiA8ZmxvYXQ+LFxuICogIHNpemVBdHRlbnVhdGlvbjogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gUG9pbnRzTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdQb2ludHNNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5zaXplID0gMTtcblx0dGhpcy5zaXplQXR0ZW51YXRpb24gPSB0cnVlO1xuXG5cdHRoaXMubGlnaHRzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5Qb2ludHNNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcblBvaW50c01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvaW50c01hdGVyaWFsO1xuXG5Qb2ludHNNYXRlcmlhbC5wcm90b3R5cGUuaXNQb2ludHNNYXRlcmlhbCA9IHRydWU7XG5cblBvaW50c01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5zaXplID0gc291cmNlLnNpemU7XG5cdHRoaXMuc2l6ZUF0dGVudWF0aW9uID0gc291cmNlLnNpemVBdHRlbnVhdGlvbjtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIFBvaW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUG9pbnRzJztcblxuXHR0aGlzLmdlb21ldHJ5ID0gZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCA/IGdlb21ldHJ5IDogbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWwgOiBuZXcgUG9pbnRzTWF0ZXJpYWwoIHsgY29sb3I6IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZiB9ICk7XG5cbn1cblxuUG9pbnRzLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFBvaW50cyxcblxuXHRpc1BvaW50czogdHJ1ZSxcblxuXHRyYXljYXN0OiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpbnZlcnNlTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0XHR2YXIgcmF5ID0gbmV3IFJheSgpO1xuXHRcdHZhciBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gdGhpcztcblx0XHRcdHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cdFx0XHR2YXIgbWF0cml4V29ybGQgPSB0aGlzLm1hdHJpeFdvcmxkO1xuXHRcdFx0dmFyIHRocmVzaG9sZCA9IHJheWNhc3Rlci5wYXJhbXMuUG9pbnRzLnRocmVzaG9sZDtcblxuXHRcdFx0Ly8gQ2hlY2tpbmcgYm91bmRpbmdTcGhlcmUgZGlzdGFuY2UgdG8gcmF5XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdFx0c3BoZXJlLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICk7XG5cdFx0XHRzcGhlcmUuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXHRcdFx0c3BoZXJlLnJhZGl1cyArPSB0aHJlc2hvbGQ7XG5cblx0XHRcdGlmICggcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHRcdC8vXG5cblx0XHRcdGludmVyc2VNYXRyaXguZ2V0SW52ZXJzZSggbWF0cml4V29ybGQgKTtcblx0XHRcdHJheS5jb3B5KCByYXljYXN0ZXIucmF5ICkuYXBwbHlNYXRyaXg0KCBpbnZlcnNlTWF0cml4ICk7XG5cblx0XHRcdHZhciBsb2NhbFRocmVzaG9sZCA9IHRocmVzaG9sZCAvICggKCB0aGlzLnNjYWxlLnggKyB0aGlzLnNjYWxlLnkgKyB0aGlzLnNjYWxlLnogKSAvIDMgKTtcblx0XHRcdHZhciBsb2NhbFRocmVzaG9sZFNxID0gbG9jYWxUaHJlc2hvbGQgKiBsb2NhbFRocmVzaG9sZDtcblx0XHRcdHZhciBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdGZ1bmN0aW9uIHRlc3RQb2ludCggcG9pbnQsIGluZGV4ICkge1xuXG5cdFx0XHRcdHZhciByYXlQb2ludERpc3RhbmNlU3EgPSByYXkuZGlzdGFuY2VTcVRvUG9pbnQoIHBvaW50ICk7XG5cblx0XHRcdFx0aWYgKCByYXlQb2ludERpc3RhbmNlU3EgPCBsb2NhbFRocmVzaG9sZFNxICkge1xuXG5cdFx0XHRcdFx0dmFyIGludGVyc2VjdFBvaW50ID0gcmF5LmNsb3Nlc3RQb2ludFRvUG9pbnQoIHBvaW50ICk7XG5cdFx0XHRcdFx0aW50ZXJzZWN0UG9pbnQuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdFx0dmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJzZWN0UG9pbnQgKTtcblxuXHRcdFx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm47XG5cblx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIHtcblxuXHRcdFx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRcdFx0ZGlzdGFuY2VUb1JheTogTWF0aC5zcXJ0KCByYXlQb2ludERpc3RhbmNlU3EgKSxcblx0XHRcdFx0XHRcdHBvaW50OiBpbnRlcnNlY3RQb2ludC5jbG9uZSgpLFxuXHRcdFx0XHRcdFx0aW5kZXg6IGluZGV4LFxuXHRcdFx0XHRcdFx0ZmFjZTogbnVsbCxcblx0XHRcdFx0XHRcdG9iamVjdDogb2JqZWN0XG5cblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcblx0XHRcdFx0dmFyIGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXHRcdFx0XHR2YXIgcG9zaXRpb25zID0gYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcblxuXHRcdFx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdFx0dmFyIGluZGljZXMgPSBpbmRleC5hcnJheTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBpbmRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgYSA9IGluZGljZXNbIGkgXTtcblxuXHRcdFx0XHRcdFx0cG9zaXRpb24uZnJvbUFycmF5KCBwb3NpdGlvbnMsIGEgKiAzICk7XG5cblx0XHRcdFx0XHRcdHRlc3RQb2ludCggcG9zaXRpb24sIGEgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9zaXRpb25zLmxlbmd0aCAvIDM7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRwb3NpdGlvbi5mcm9tQXJyYXkoIHBvc2l0aW9ucywgaSAqIDMgKTtcblxuXHRcdFx0XHRcdFx0dGVzdFBvaW50KCBwb3NpdGlvbiwgaSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB2ZXJ0aWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dGVzdFBvaW50KCB2ZXJ0aWNlc1sgaSBdLCBpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBHcm91cCgpIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0dyb3VwJztcblxufVxuXG5Hcm91cC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBHcm91cFxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBWaWRlb1RleHR1cmUoIHZpZGVvLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKSB7XG5cblx0VGV4dHVyZS5jYWxsKCB0aGlzLCB2aWRlbywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICk7XG5cblx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblxuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblxuXHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSggdXBkYXRlICk7XG5cblx0XHRpZiAoIHZpZGVvLnJlYWR5U3RhdGUgPj0gdmlkZW8uSEFWRV9DVVJSRU5UX0RBVEEgKSB7XG5cblx0XHRcdHNjb3BlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHR9XG5cblx0dXBkYXRlKCk7XG5cbn1cblxuVmlkZW9UZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7XG5WaWRlb1RleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVmlkZW9UZXh0dXJlO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gQ29tcHJlc3NlZFRleHR1cmUoIG1pcG1hcHMsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgYW5pc290cm9weSwgZW5jb2RpbmcgKSB7XG5cblx0VGV4dHVyZS5jYWxsKCB0aGlzLCBudWxsLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICk7XG5cblx0dGhpcy5pbWFnZSA9IHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xuXHR0aGlzLm1pcG1hcHMgPSBtaXBtYXBzO1xuXG5cdC8vIG5vIGZsaXBwaW5nIGZvciBjdWJlIHRleHR1cmVzXG5cdC8vIChhbHNvIGZsaXBwaW5nIGRvZXNuJ3Qgd29yayBmb3IgY29tcHJlc3NlZCB0ZXh0dXJlcyApXG5cblx0dGhpcy5mbGlwWSA9IGZhbHNlO1xuXG5cdC8vIGNhbid0IGdlbmVyYXRlIG1pcG1hcHMgZm9yIGNvbXByZXNzZWQgdGV4dHVyZXNcblx0Ly8gbWlwcyBtdXN0IGJlIGVtYmVkZGVkIGluIEREUyBmaWxlc1xuXG5cdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG5cbn1cblxuQ29tcHJlc3NlZFRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkNvbXByZXNzZWRUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbXByZXNzZWRUZXh0dXJlO1xuXG5Db21wcmVzc2VkVGV4dHVyZS5wcm90b3R5cGUuaXNDb21wcmVzc2VkVGV4dHVyZSA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBDYW52YXNUZXh0dXJlKCBjYW52YXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApIHtcblxuXHRUZXh0dXJlLmNhbGwoIHRoaXMsIGNhbnZhcywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICk7XG5cblx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cbn1cblxuQ2FudmFzVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApO1xuQ2FudmFzVGV4dHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDYW52YXNUZXh0dXJlO1xuXG4vKipcbiAqIEBhdXRob3IgTWF0dCBEZXNMYXVyaWVycyAvIEBtYXR0ZGVzbFxuICogQGF1dGhvciBhdGl4IC8gYXJ0aHVyc2lsYmVyLmRlXG4gKi9cblxuZnVuY3Rpb24gRGVwdGhUZXh0dXJlKCB3aWR0aCwgaGVpZ2h0LCB0eXBlLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBhbmlzb3Ryb3B5LCBmb3JtYXQgKSB7XG5cblx0Zm9ybWF0ID0gZm9ybWF0ICE9PSB1bmRlZmluZWQgPyBmb3JtYXQgOiBEZXB0aEZvcm1hdDtcblxuXHRpZiAoIGZvcm1hdCAhPT0gRGVwdGhGb3JtYXQgJiYgZm9ybWF0ICE9PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSB7XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoICdEZXB0aFRleHR1cmUgZm9ybWF0IG11c3QgYmUgZWl0aGVyIFRIUkVFLkRlcHRoRm9ybWF0IG9yIFRIUkVFLkRlcHRoU3RlbmNpbEZvcm1hdCcgKVxuXG5cdH1cblxuXHRpZiAoIHR5cGUgPT09IHVuZGVmaW5lZCAmJiBmb3JtYXQgPT09IERlcHRoRm9ybWF0ICkgdHlwZSA9IFVuc2lnbmVkU2hvcnRUeXBlO1xuXHRpZiAoIHR5cGUgPT09IHVuZGVmaW5lZCAmJiBmb3JtYXQgPT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHR5cGUgPSBVbnNpZ25lZEludDI0OFR5cGU7XG5cblx0VGV4dHVyZS5jYWxsKCB0aGlzLCBudWxsLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKTtcblxuXHR0aGlzLmltYWdlID0geyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XG5cblx0dGhpcy5tYWdGaWx0ZXIgPSBtYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1hZ0ZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7XG5cdHRoaXMubWluRmlsdGVyID0gbWluRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtaW5GaWx0ZXIgOiBOZWFyZXN0RmlsdGVyO1xuXG5cdHRoaXMuZmxpcFkgPSBmYWxzZTtcblx0dGhpcy5nZW5lcmF0ZU1pcG1hcHNcdD0gZmFsc2U7XG5cbn1cblxuRGVwdGhUZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7XG5EZXB0aFRleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRGVwdGhUZXh0dXJlO1xuRGVwdGhUZXh0dXJlLnByb3RvdHlwZS5pc0RlcHRoVGV4dHVyZSA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuZnVuY3Rpb24gV2lyZWZyYW1lR2VvbWV0cnkoIGdlb21ldHJ5ICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnV2lyZWZyYW1lR2VvbWV0cnknO1xuXG5cdC8vIGJ1ZmZlclxuXG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgaSwgaiwgbCwgbywgb2w7XG5cdHZhciBlZGdlID0gWyAwLCAwIF0sIGVkZ2VzID0ge30sIGUsIGVkZ2UxLCBlZGdlMjtcblx0dmFyIGtleSwga2V5cyA9IFsgJ2EnLCAnYicsICdjJyBdO1xuXHR2YXIgdmVydGV4O1xuXG5cdC8vIGRpZmZlcmVudCBsb2dpYyBmb3IgR2VvbWV0cnkgYW5kIEJ1ZmZlckdlb21ldHJ5XG5cblx0aWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0Ly8gY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwgZWRnZXMgd2l0aG91dCBkdXBsaWNhdGVzXG5cblx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblxuXHRcdGZvciAoIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHRmb3IgKCBqID0gMDsgaiA8IDM7IGogKysgKSB7XG5cblx0XHRcdFx0ZWRnZTEgPSBmYWNlWyBrZXlzWyBqIF0gXTtcblx0XHRcdFx0ZWRnZTIgPSBmYWNlWyBrZXlzWyAoIGogKyAxICkgJSAzIF0gXTtcblx0XHRcdFx0ZWRnZVsgMCBdID0gTWF0aC5taW4oIGVkZ2UxLCBlZGdlMiApOyAvLyBzb3J0aW5nIHByZXZlbnRzIGR1cGxpY2F0ZXNcblx0XHRcdFx0ZWRnZVsgMSBdID0gTWF0aC5tYXgoIGVkZ2UxLCBlZGdlMiApO1xuXG5cdFx0XHRcdGtleSA9IGVkZ2VbIDAgXSArICcsJyArIGVkZ2VbIDEgXTtcblxuXHRcdFx0XHRpZiAoIGVkZ2VzWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0ZWRnZXNbIGtleSBdID0geyBpbmRleDE6IGVkZ2VbIDAgXSwgaW5kZXgyOiBlZGdlWyAxIF0gfTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzXG5cblx0XHRmb3IgKCBrZXkgaW4gZWRnZXMgKSB7XG5cblx0XHRcdGUgPSBlZGdlc1sga2V5IF07XG5cblx0XHRcdHZlcnRleCA9IGdlb21ldHJ5LnZlcnRpY2VzWyBlLmluZGV4MSBdO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHR2ZXJ0ZXggPSBnZW9tZXRyeS52ZXJ0aWNlc1sgZS5pbmRleDIgXTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdH1cblxuXHR9IGVsc2UgaWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIHBvc2l0aW9uLCBpbmRpY2VzLCBncm91cHM7XG5cdFx0dmFyIGdyb3VwLCBzdGFydCwgY291bnQ7XG5cdFx0dmFyIGluZGV4MSwgaW5kZXgyO1xuXG5cdFx0dmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdGlmICggZ2VvbWV0cnkuaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdC8vIGluZGV4ZWQgQnVmZmVyR2VvbWV0cnlcblxuXHRcdFx0cG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdFx0aW5kaWNlcyA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdFx0Z3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXG5cdFx0XHRpZiAoIGdyb3Vwcy5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdFx0Z3JvdXBzID0gWyB7IHN0YXJ0OiAwLCBjb3VudDogaW5kaWNlcy5jb3VudCwgbWF0ZXJpYWxJbmRleDogMCB9IF07XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwgZWdlcyB3aXRob3V0IGR1cGxpY2F0ZXNcblxuXHRcdFx0Zm9yICggbyA9IDAsIG9sID0gZ3JvdXBzLmxlbmd0aDsgbyA8IG9sOyArKyBvICkge1xuXG5cdFx0XHRcdGdyb3VwID0gZ3JvdXBzWyBvIF07XG5cblx0XHRcdFx0c3RhcnQgPSBncm91cC5zdGFydDtcblx0XHRcdFx0Y291bnQgPSBncm91cC5jb3VudDtcblxuXHRcdFx0XHRmb3IgKCBpID0gc3RhcnQsIGwgPSAoIHN0YXJ0ICsgY291bnQgKTsgaSA8IGw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdGZvciAoIGogPSAwOyBqIDwgMzsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0ZWRnZTEgPSBpbmRpY2VzLmdldFgoIGkgKyBqICk7XG5cdFx0XHRcdFx0XHRlZGdlMiA9IGluZGljZXMuZ2V0WCggaSArICggaiArIDEgKSAlIDMgKTtcblx0XHRcdFx0XHRcdGVkZ2VbIDAgXSA9IE1hdGgubWluKCBlZGdlMSwgZWRnZTIgKTsgLy8gc29ydGluZyBwcmV2ZW50cyBkdXBsaWNhdGVzXG5cdFx0XHRcdFx0XHRlZGdlWyAxIF0gPSBNYXRoLm1heCggZWRnZTEsIGVkZ2UyICk7XG5cblx0XHRcdFx0XHRcdGtleSA9IGVkZ2VbIDAgXSArICcsJyArIGVkZ2VbIDEgXTtcblxuXHRcdFx0XHRcdFx0aWYgKCBlZGdlc1sga2V5IF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRlZGdlc1sga2V5IF0gPSB7IGluZGV4MTogZWRnZVsgMCBdLCBpbmRleDI6IGVkZ2VbIDEgXSB9O1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzXG5cblx0XHRcdGZvciAoIGtleSBpbiBlZGdlcyApIHtcblxuXHRcdFx0XHRlID0gZWRnZXNbIGtleSBdO1xuXG5cdFx0XHRcdHZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgZS5pbmRleDEgKTtcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdHZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgZS5pbmRleDIgKTtcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeVxuXG5cdFx0XHRwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRcdGZvciAoIGkgPSAwLCBsID0gKCBwb3NpdGlvbi5jb3VudCAvIDMgKTsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0Zm9yICggaiA9IDA7IGogPCAzOyBqICsrICkge1xuXG5cdFx0XHRcdFx0Ly8gdGhyZWUgZWRnZXMgcGVyIHRyaWFuZ2xlLCBhbiBlZGdlIGlzIHJlcHJlc2VudGVkIGFzIChpbmRleDEsIGluZGV4Milcblx0XHRcdFx0XHQvLyBlLmcuIHRoZSBmaXJzdCB0cmlhbmdsZSBoYXMgdGhlIGZvbGxvd2luZyBlZGdlczogKDAsMSksKDEsMiksKDIsMClcblxuXHRcdFx0XHRcdGluZGV4MSA9IDMgKiBpICsgajtcblx0XHRcdFx0XHR2ZXJ0ZXguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGluZGV4MSApO1xuXHRcdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0XHRcdGluZGV4MiA9IDMgKiBpICsgKCAoIGogKyAxICkgJSAzICk7XG5cdFx0XHRcdFx0dmVydGV4LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBpbmRleDIgKTtcblx0XHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cbn1cblxuV2lyZWZyYW1lR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5XaXJlZnJhbWVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBXaXJlZnJhbWVHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwczovL2dpdGh1Yi5jb20veno4NVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqXG4gKiBQYXJhbWV0cmljIFN1cmZhY2VzIEdlb21ldHJ5XG4gKiBiYXNlZCBvbiB0aGUgYnJpbGxpYW50IGFydGljbGUgYnkgQHByaWRlb3V0IGh0dHA6Ly9wcmlkZW91dC5uZXQvYmxvZy8/cD00NFxuICovXG5cbi8vIFBhcmFtZXRyaWNHZW9tZXRyeVxuXG5mdW5jdGlvbiBQYXJhbWV0cmljR2VvbWV0cnkoIGZ1bmMsIHNsaWNlcywgc3RhY2tzICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGFyYW1ldHJpY0dlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0ZnVuYzogZnVuYyxcblx0XHRzbGljZXM6IHNsaWNlcyxcblx0XHRzdGFja3M6IHN0YWNrc1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5KCBmdW5jLCBzbGljZXMsIHN0YWNrcyApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblBhcmFtZXRyaWNHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBhcmFtZXRyaWNHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQYXJhbWV0cmljR2VvbWV0cnk7XG5cbi8vIFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkoIGZ1bmMsIHNsaWNlcywgc3RhY2tzICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0ZnVuYzogZnVuYyxcblx0XHRzbGljZXM6IHNsaWNlcyxcblx0XHRzdGFja3M6IHN0YWNrc1xuXHR9O1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdHZhciBFUFMgPSAwLjAwMDAxO1xuXG5cdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBwMCA9IG5ldyBWZWN0b3IzKCksIHAxID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHB1ID0gbmV3IFZlY3RvcjMoKSwgcHYgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBpLCBqO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHR2YXIgc2xpY2VDb3VudCA9IHNsaWNlcyArIDE7XG5cblx0Zm9yICggaSA9IDA7IGkgPD0gc3RhY2tzOyBpICsrICkge1xuXG5cdFx0dmFyIHYgPSBpIC8gc3RhY2tzO1xuXG5cdFx0Zm9yICggaiA9IDA7IGogPD0gc2xpY2VzOyBqICsrICkge1xuXG5cdFx0XHR2YXIgdSA9IGogLyBzbGljZXM7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHRwMCA9IGZ1bmMoIHUsIHYsIHAwICk7XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCBwMC54LCBwMC55LCBwMC56ICk7XG5cblx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHQvLyBhcHByb3hpbWF0ZSB0YW5nZW50IHZlY3RvcnMgdmlhIGZpbml0ZSBkaWZmZXJlbmNlc1xuXG5cdFx0XHRpZiAoIHUgLSBFUFMgPj0gMCApIHtcblxuXHRcdFx0XHRwMSA9IGZ1bmMoIHUgLSBFUFMsIHYsIHAxICk7XG5cdFx0XHRcdHB1LnN1YlZlY3RvcnMoIHAwLCBwMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHAxID0gZnVuYyggdSArIEVQUywgdiwgcDEgKTtcblx0XHRcdFx0cHUuc3ViVmVjdG9ycyggcDEsIHAwICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB2IC0gRVBTID49IDAgKSB7XG5cblx0XHRcdFx0cDEgPSBmdW5jKCB1LCB2IC0gRVBTLCBwMSApO1xuXHRcdFx0XHRwdi5zdWJWZWN0b3JzKCBwMCwgcDEgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRwMSA9IGZ1bmMoIHUsIHYgKyBFUFMsIHAxICk7XG5cdFx0XHRcdHB2LnN1YlZlY3RvcnMoIHAxLCBwMCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGNyb3NzIHByb2R1Y3Qgb2YgdGFuZ2VudCB2ZWN0b3JzIHJldHVybnMgc3VyZmFjZSBub3JtYWxcblxuXHRcdFx0bm9ybWFsLmNyb3NzVmVjdG9ycyggcHUsIHB2ICkubm9ybWFsaXplKCk7XG5cdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0Ly8gdXZcblxuXHRcdFx0dXZzLnB1c2goIHUsIHYgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xuXG5cdGZvciAoIGkgPSAwOyBpIDwgc3RhY2tzOyBpICsrICkge1xuXG5cdFx0Zm9yICggaiA9IDA7IGogPCBzbGljZXM7IGogKysgKSB7XG5cblx0XHRcdHZhciBhID0gaSAqIHNsaWNlQ291bnQgKyBqO1xuXHRcdFx0dmFyIGIgPSBpICogc2xpY2VDb3VudCArIGogKyAxO1xuXHRcdFx0dmFyIGMgPSAoIGkgKyAxICkgKiBzbGljZUNvdW50ICsgaiArIDE7XG5cdFx0XHR2YXIgZCA9ICggaSArIDEgKSAqIHNsaWNlQ291bnQgKyBqO1xuXG5cdFx0XHQvLyBmYWNlcyBvbmUgYW5kIHR3b1xuXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cbn1cblxuUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIGNsb2Nrd29ya2dlZWsgLyBodHRwczovL2dpdGh1Yi5jb20vY2xvY2t3b3JrZ2Vla1xuICogQGF1dGhvciB0aW1vdGh5cHJhdGxleSAvIGh0dHBzOi8vZ2l0aHViLmNvbS90aW1vdGh5cHJhdGxleVxuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIFBvbHloZWRyb25HZW9tZXRyeVxuXG5mdW5jdGlvbiBQb2x5aGVkcm9uR2VvbWV0cnkoIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BvbHloZWRyb25HZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHZlcnRpY2VzOiB2ZXJ0aWNlcyxcblx0XHRpbmRpY2VzOiBpbmRpY2VzLFxuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkoIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblBvbHloZWRyb25HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBvbHloZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2x5aGVkcm9uR2VvbWV0cnk7XG5cbi8vIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkoIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BvbHloZWRyb25CdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHZlcnRpY2VzOiB2ZXJ0aWNlcyxcblx0XHRpbmRpY2VzOiBpbmRpY2VzLFxuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cblx0cmFkaXVzID0gcmFkaXVzIHx8IDE7XG5cdGRldGFpbCA9IGRldGFpbCB8fCAwO1xuXG5cdC8vIGRlZmF1bHQgYnVmZmVyIGRhdGFcblxuXHR2YXIgdmVydGV4QnVmZmVyID0gW107XG5cdHZhciB1dkJ1ZmZlciA9IFtdO1xuXG5cdC8vIHRoZSBzdWJkaXZpc2lvbiBjcmVhdGVzIHRoZSB2ZXJ0ZXggYnVmZmVyIGRhdGFcblxuXHRzdWJkaXZpZGUoIGRldGFpbCApO1xuXG5cdC8vIGFsbCB2ZXJ0aWNlcyBzaG91bGQgbGllIG9uIGEgY29uY2VwdHVhbCBzcGhlcmUgd2l0aCBhIGdpdmVuIHJhZGl1c1xuXG5cdGFwcHBseVJhZGl1cyggcmFkaXVzICk7XG5cblx0Ly8gZmluYWxseSwgY3JlYXRlIHRoZSB1diBkYXRhXG5cblx0Z2VuZXJhdGVVVnMoKTtcblxuXHQvLyBidWlsZCBub24taW5kZXhlZCBnZW9tZXRyeVxuXG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGV4QnVmZmVyLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGV4QnVmZmVyLnNsaWNlKCksIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2QnVmZmVyLCAyICkgKTtcblx0dGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7XG5cblx0Ly8gaGVscGVyIGZ1bmN0aW9uc1xuXG5cdGZ1bmN0aW9uIHN1YmRpdmlkZSggZGV0YWlsICkge1xuXG5cdFx0dmFyIGEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBiID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgYyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHQvLyBpdGVyYXRlIG92ZXIgYWxsIGZhY2VzIGFuZCBhcHBseSBhIHN1YmRpdmlzb24gd2l0aCB0aGUgZ2l2ZW4gZGV0YWlsIHZhbHVlXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSArPSAzICkge1xuXG5cdFx0XHQvLyBnZXQgdGhlIHZlcnRpY2VzIG9mIHRoZSBmYWNlXG5cblx0XHRcdGdldFZlcnRleEJ5SW5kZXgoIGluZGljZXNbIGkgKyAwIF0sIGEgKTtcblx0XHRcdGdldFZlcnRleEJ5SW5kZXgoIGluZGljZXNbIGkgKyAxIF0sIGIgKTtcblx0XHRcdGdldFZlcnRleEJ5SW5kZXgoIGluZGljZXNbIGkgKyAyIF0sIGMgKTtcblxuXHRcdFx0Ly8gcGVyZm9ybSBzdWJkaXZpc2lvblxuXG5cdFx0XHRzdWJkaXZpZGVGYWNlKCBhLCBiLCBjLCBkZXRhaWwgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gc3ViZGl2aWRlRmFjZSggYSwgYiwgYywgZGV0YWlsICkge1xuXG5cdFx0dmFyIGNvbHMgPSBNYXRoLnBvdyggMiwgZGV0YWlsICk7XG5cblx0XHQvLyB3ZSB1c2UgdGhpcyBtdWx0aWRpbWVuc2lvbmFsIGFycmF5IGFzIGEgZGF0YSBzdHJ1Y3R1cmUgZm9yIGNyZWF0aW5nIHRoZSBzdWJkaXZpc2lvblxuXG5cdFx0dmFyIHYgPSBbXTtcblxuXHRcdHZhciBpLCBqO1xuXG5cdFx0Ly8gY29uc3RydWN0IGFsbCBvZiB0aGUgdmVydGljZXMgZm9yIHRoaXMgc3ViZGl2aXNpb25cblxuXHRcdGZvciAoIGkgPSAwOyBpIDw9IGNvbHM7IGkgKysgKSB7XG5cblx0XHRcdHZbIGkgXSA9IFtdO1xuXG5cdFx0XHR2YXIgYWogPSBhLmNsb25lKCkubGVycCggYywgaSAvIGNvbHMgKTtcblx0XHRcdHZhciBiaiA9IGIuY2xvbmUoKS5sZXJwKCBjLCBpIC8gY29scyApO1xuXG5cdFx0XHR2YXIgcm93cyA9IGNvbHMgLSBpO1xuXG5cdFx0XHRmb3IgKCBqID0gMDsgaiA8PSByb3dzOyBqICsrICkge1xuXG5cdFx0XHRcdGlmICggaiA9PT0gMCAmJiBpID09PSBjb2xzICkge1xuXG5cdFx0XHRcdFx0dlsgaSBdWyBqIF0gPSBhajtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dlsgaSBdWyBqIF0gPSBhai5jbG9uZSgpLmxlcnAoIGJqLCBqIC8gcm93cyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gY29uc3RydWN0IGFsbCBvZiB0aGUgZmFjZXNcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgY29sczsgaSArKyApIHtcblxuXHRcdFx0Zm9yICggaiA9IDA7IGogPCAyICogKCBjb2xzIC0gaSApIC0gMTsgaiArKyApIHtcblxuXHRcdFx0XHR2YXIgayA9IE1hdGguZmxvb3IoIGogLyAyICk7XG5cblx0XHRcdFx0aWYgKCBqICUgMiA9PT0gMCApIHtcblxuXHRcdFx0XHRcdHB1c2hWZXJ0ZXgoIHZbIGkgXVsgayArIDEgXSApO1xuXHRcdFx0XHRcdHB1c2hWZXJ0ZXgoIHZbIGkgKyAxIF1bIGsgXSApO1xuXHRcdFx0XHRcdHB1c2hWZXJ0ZXgoIHZbIGkgXVsgayBdICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHB1c2hWZXJ0ZXgoIHZbIGkgXVsgayArIDEgXSApO1xuXHRcdFx0XHRcdHB1c2hWZXJ0ZXgoIHZbIGkgKyAxIF1bIGsgKyAxIF0gKTtcblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpICsgMSBdWyBrIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gYXBwcGx5UmFkaXVzKCByYWRpdXMgKSB7XG5cblx0XHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdC8vIGl0ZXJhdGUgb3ZlciB0aGUgZW50aXJlIGJ1ZmZlciBhbmQgYXBwbHkgdGhlIHJhZGl1cyB0byBlYWNoIHZlcnRleFxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdmVydGV4QnVmZmVyLmxlbmd0aDsgaSArPSAzICkge1xuXG5cdFx0XHR2ZXJ0ZXgueCA9IHZlcnRleEJ1ZmZlclsgaSArIDAgXTtcblx0XHRcdHZlcnRleC55ID0gdmVydGV4QnVmZmVyWyBpICsgMSBdO1xuXHRcdFx0dmVydGV4LnogPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF07XG5cblx0XHRcdHZlcnRleC5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggcmFkaXVzICk7XG5cblx0XHRcdHZlcnRleEJ1ZmZlclsgaSArIDAgXSA9IHZlcnRleC54O1xuXHRcdFx0dmVydGV4QnVmZmVyWyBpICsgMSBdID0gdmVydGV4Lnk7XG5cdFx0XHR2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF0gPSB2ZXJ0ZXguejtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVVVnMoKSB7XG5cblx0XHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHZlcnRleEJ1ZmZlci5sZW5ndGg7IGkgKz0gMyApIHtcblxuXHRcdFx0dmVydGV4LnggPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF07XG5cdFx0XHR2ZXJ0ZXgueSA9IHZlcnRleEJ1ZmZlclsgaSArIDEgXTtcblx0XHRcdHZlcnRleC56ID0gdmVydGV4QnVmZmVyWyBpICsgMiBdO1xuXG5cdFx0XHR2YXIgdSA9IGF6aW11dGgoIHZlcnRleCApIC8gMiAvIE1hdGguUEkgKyAwLjU7XG5cdFx0XHR2YXIgdiA9IGluY2xpbmF0aW9uKCB2ZXJ0ZXggKSAvIE1hdGguUEkgKyAwLjU7XG5cdFx0XHR1dkJ1ZmZlci5wdXNoKCB1LCAxIC0gdiApO1xuXG5cdFx0fVxuXG5cdFx0Y29ycmVjdFVWcygpO1xuXG5cdFx0Y29ycmVjdFNlYW0oKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gY29ycmVjdFNlYW0oKSB7XG5cblx0XHQvLyBoYW5kbGUgY2FzZSB3aGVuIGZhY2Ugc3RyYWRkbGVzIHRoZSBzZWFtLCBzZWUgIzMyNjlcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHV2QnVmZmVyLmxlbmd0aDsgaSArPSA2ICkge1xuXG5cdFx0XHQvLyB1diBkYXRhIG9mIGEgc2luZ2xlIGZhY2VcblxuXHRcdFx0dmFyIHgwID0gdXZCdWZmZXJbIGkgKyAwIF07XG5cdFx0XHR2YXIgeDEgPSB1dkJ1ZmZlclsgaSArIDIgXTtcblx0XHRcdHZhciB4MiA9IHV2QnVmZmVyWyBpICsgNCBdO1xuXG5cdFx0XHR2YXIgbWF4ID0gTWF0aC5tYXgoIHgwLCB4MSwgeDIgKTtcblx0XHRcdHZhciBtaW4gPSBNYXRoLm1pbiggeDAsIHgxLCB4MiApO1xuXG5cdFx0XHQvLyAwLjkgaXMgc29tZXdoYXQgYXJiaXRyYXJ5XG5cblx0XHRcdGlmICggbWF4ID4gMC45ICYmIG1pbiA8IDAuMSApIHtcblxuXHRcdFx0XHRpZiAoIHgwIDwgMC4yICkgdXZCdWZmZXJbIGkgKyAwIF0gKz0gMTtcblx0XHRcdFx0aWYgKCB4MSA8IDAuMiApIHV2QnVmZmVyWyBpICsgMiBdICs9IDE7XG5cdFx0XHRcdGlmICggeDIgPCAwLjIgKSB1dkJ1ZmZlclsgaSArIDQgXSArPSAxO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHB1c2hWZXJ0ZXgoIHZlcnRleCApIHtcblxuXHRcdHZlcnRleEJ1ZmZlci5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldFZlcnRleEJ5SW5kZXgoIGluZGV4LCB2ZXJ0ZXggKSB7XG5cblx0XHR2YXIgc3RyaWRlID0gaW5kZXggKiAzO1xuXG5cdFx0dmVydGV4LnggPSB2ZXJ0aWNlc1sgc3RyaWRlICsgMCBdO1xuXHRcdHZlcnRleC55ID0gdmVydGljZXNbIHN0cmlkZSArIDEgXTtcblx0XHR2ZXJ0ZXgueiA9IHZlcnRpY2VzWyBzdHJpZGUgKyAyIF07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGNvcnJlY3RVVnMoKSB7XG5cblx0XHR2YXIgYSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBjID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBjZW50cm9pZCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgdXZBID0gbmV3IFZlY3RvcjIoKTtcblx0XHR2YXIgdXZCID0gbmV3IFZlY3RvcjIoKTtcblx0XHR2YXIgdXZDID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaiA9IDA7IGkgPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpICs9IDksIGogKz0gNiApIHtcblxuXHRcdFx0YS5zZXQoIHZlcnRleEJ1ZmZlclsgaSArIDAgXSwgdmVydGV4QnVmZmVyWyBpICsgMSBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF0gKTtcblx0XHRcdGIuc2V0KCB2ZXJ0ZXhCdWZmZXJbIGkgKyAzIF0sIHZlcnRleEJ1ZmZlclsgaSArIDQgXSwgdmVydGV4QnVmZmVyWyBpICsgNSBdICk7XG5cdFx0XHRjLnNldCggdmVydGV4QnVmZmVyWyBpICsgNiBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA3IF0sIHZlcnRleEJ1ZmZlclsgaSArIDggXSApO1xuXG5cdFx0XHR1dkEuc2V0KCB1dkJ1ZmZlclsgaiArIDAgXSwgdXZCdWZmZXJbIGogKyAxIF0gKTtcblx0XHRcdHV2Qi5zZXQoIHV2QnVmZmVyWyBqICsgMiBdLCB1dkJ1ZmZlclsgaiArIDMgXSApO1xuXHRcdFx0dXZDLnNldCggdXZCdWZmZXJbIGogKyA0IF0sIHV2QnVmZmVyWyBqICsgNSBdICk7XG5cblx0XHRcdGNlbnRyb2lkLmNvcHkoIGEgKS5hZGQoIGIgKS5hZGQoIGMgKS5kaXZpZGVTY2FsYXIoIDMgKTtcblxuXHRcdFx0dmFyIGF6aSA9IGF6aW11dGgoIGNlbnRyb2lkICk7XG5cblx0XHRcdGNvcnJlY3RVViggdXZBLCBqICsgMCwgYSwgYXppICk7XG5cdFx0XHRjb3JyZWN0VVYoIHV2QiwgaiArIDIsIGIsIGF6aSApO1xuXHRcdFx0Y29ycmVjdFVWKCB1dkMsIGogKyA0LCBjLCBhemkgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gY29ycmVjdFVWKCB1diwgc3RyaWRlLCB2ZWN0b3IsIGF6aW11dGggKSB7XG5cblx0XHRpZiAoICggYXppbXV0aCA8IDAgKSAmJiAoIHV2LnggPT09IDEgKSApIHtcblxuXHRcdFx0dXZCdWZmZXJbIHN0cmlkZSBdID0gdXYueCAtIDE7XG5cblx0XHR9XG5cblx0XHRpZiAoICggdmVjdG9yLnggPT09IDAgKSAmJiAoIHZlY3Rvci56ID09PSAwICkgKSB7XG5cblx0XHRcdHV2QnVmZmVyWyBzdHJpZGUgXSA9IGF6aW11dGggLyAyIC8gTWF0aC5QSSArIDAuNTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gQW5nbGUgYXJvdW5kIHRoZSBZIGF4aXMsIGNvdW50ZXItY2xvY2t3aXNlIHdoZW4gbG9va2luZyBmcm9tIGFib3ZlLlxuXG5cdGZ1bmN0aW9uIGF6aW11dGgoIHZlY3RvciApIHtcblxuXHRcdHJldHVybiBNYXRoLmF0YW4yKCB2ZWN0b3IueiwgLSB2ZWN0b3IueCApO1xuXG5cdH1cblxuXG5cdC8vIEFuZ2xlIGFib3ZlIHRoZSBYWiBwbGFuZS5cblxuXHRmdW5jdGlvbiBpbmNsaW5hdGlvbiggdmVjdG9yICkge1xuXG5cdFx0cmV0dXJuIE1hdGguYXRhbjIoIC0gdmVjdG9yLnksIE1hdGguc3FydCggKCB2ZWN0b3IueCAqIHZlY3Rvci54ICkgKyAoIHZlY3Rvci56ICogdmVjdG9yLnogKSApICk7XG5cblx0fVxuXG59XG5cblBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciB0aW1vdGh5cHJhdGxleSAvIGh0dHBzOi8vZ2l0aHViLmNvbS90aW1vdGh5cHJhdGxleVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBUZXRyYWhlZHJvbkdlb21ldHJ5XG5cbmZ1bmN0aW9uIFRldHJhaGVkcm9uR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVGV0cmFoZWRyb25HZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblRldHJhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5UZXRyYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRldHJhaGVkcm9uR2VvbWV0cnk7XG5cbi8vIFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0dmFyIHZlcnRpY2VzID0gW1xuXHRcdDEsICAxLCAgMSwgICAtIDEsIC0gMSwgIDEsICAgLSAxLCAgMSwgLSAxLCAgICAxLCAtIDEsIC0gMVxuXHRdO1xuXG5cdHZhciBpbmRpY2VzID0gW1xuXHRcdDIsICAxLCAgMCwgICAgMCwgIDMsICAyLCAgICAxLCAgMywgIDAsICAgIDIsICAzLCAgMVxuXHRdO1xuXG5cdFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTtcblxuXHR0aGlzLnR5cGUgPSAnVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cbn1cblxuVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5UZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciB0aW1vdGh5cHJhdGxleSAvIGh0dHBzOi8vZ2l0aHViLmNvbS90aW1vdGh5cHJhdGxleVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBPY3RhaGVkcm9uR2VvbWV0cnlcblxuZnVuY3Rpb24gT2N0YWhlZHJvbkdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ09jdGFoZWRyb25HZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuT2N0YWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuT2N0YWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE9jdGFoZWRyb25HZW9tZXRyeTtcblxuLy8gT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0dmFyIHZlcnRpY2VzID0gW1xuXHRcdDEsIDAsIDAsICAgLSAxLCAwLCAwLCAgICAwLCAxLCAwLCAgICAwLCAtIDEsIDAsICAgIDAsIDAsIDEsICAgIDAsIDAsIC0gMVxuXHRdO1xuXG5cdHZhciBpbmRpY2VzID0gW1xuXHRcdDAsIDIsIDQsICAgIDAsIDQsIDMsICAgIDAsIDMsIDUsICAgIDAsIDUsIDIsICAgIDEsIDIsIDUsICAgIDEsIDUsIDMsICAgIDEsIDMsIDQsICAgIDEsIDQsIDJcblx0XTtcblxuXHRQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7XG5cblx0dGhpcy50eXBlID0gJ09jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cbn1cblxuT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbk9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciB0aW1vdGh5cHJhdGxleSAvIGh0dHBzOi8vZ2l0aHViLmNvbS90aW1vdGh5cHJhdGxleVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBJY29zYWhlZHJvbkdlb21ldHJ5XG5cbmZ1bmN0aW9uIEljb3NhaGVkcm9uR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG4gXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0ljb3NhaGVkcm9uR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5JY29zYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuSWNvc2FoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJY29zYWhlZHJvbkdlb21ldHJ5O1xuXG4vLyBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdHZhciB0ID0gKCAxICsgTWF0aC5zcXJ0KCA1ICkgKSAvIDI7XG5cblx0dmFyIHZlcnRpY2VzID0gW1xuXHRcdC0gMSwgIHQsICAwLCAgICAxLCAgdCwgIDAsICAgLSAxLCAtIHQsICAwLCAgICAxLCAtIHQsICAwLFxuXHRcdCAwLCAtIDEsICB0LCAgICAwLCAgMSwgIHQsICAgIDAsIC0gMSwgLSB0LCAgICAwLCAgMSwgLSB0LFxuXHRcdCB0LCAgMCwgLSAxLCAgICB0LCAgMCwgIDEsICAgLSB0LCAgMCwgLSAxLCAgIC0gdCwgIDAsICAxXG5cdF07XG5cblx0dmFyIGluZGljZXMgPSBbXG5cdFx0IDAsIDExLCAgNSwgICAgMCwgIDUsICAxLCAgICAwLCAgMSwgIDcsICAgIDAsICA3LCAxMCwgICAgMCwgMTAsIDExLFxuXHRcdCAxLCAgNSwgIDksICAgIDUsIDExLCAgNCwgICAxMSwgMTAsICAyLCAgIDEwLCAgNywgIDYsICAgIDcsICAxLCAgOCxcblx0XHQgMywgIDksICA0LCAgICAzLCAgNCwgIDIsICAgIDMsICAyLCAgNiwgICAgMywgIDYsICA4LCAgICAzLCAgOCwgIDksXG5cdFx0IDQsICA5LCAgNSwgICAgMiwgIDQsIDExLCAgICA2LCAgMiwgMTAsICAgIDgsICA2LCAgNywgICAgOSwgIDgsICAxXG5cdF07XG5cblx0UG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApO1xuXG5cdHRoaXMudHlwZSA9ICdJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxufVxuXG5JY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIEFiZSBQYXpvcyAvIGh0dHBzOi8vaGFtb2lkLmNvbVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBEb2RlY2FoZWRyb25HZW9tZXRyeVxuXG5mdW5jdGlvbiBEb2RlY2FoZWRyb25HZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdEb2RlY2FoZWRyb25HZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5Eb2RlY2FoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkRvZGVjYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERvZGVjYWhlZHJvbkdlb21ldHJ5O1xuXG4vLyBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0dmFyIHQgPSAoIDEgKyBNYXRoLnNxcnQoIDUgKSApIC8gMjtcblx0dmFyIHIgPSAxIC8gdDtcblxuXHR2YXIgdmVydGljZXMgPSBbXG5cblx0XHQvLyAowrExLCDCsTEsIMKxMSlcblx0XHQtIDEsIC0gMSwgLSAxLCAgICAtIDEsIC0gMSwgIDEsXG5cdFx0LSAxLCAgMSwgLSAxLCAgICAtIDEsICAxLCAgMSxcblx0XHQgIDEsIC0gMSwgLSAxLCAgICAgMSwgLSAxLCAgMSxcblx0XHQgIDEsICAxLCAtIDEsICAgICAxLCAgMSwgIDEsXG5cblx0XHQvLyAoMCwgwrExL8+GLCDCsc+GKVxuXHRcdCAwLCAtIHIsIC0gdCwgICAgIDAsIC0gciwgIHQsXG5cdFx0IDAsICByLCAtIHQsICAgICAwLCAgciwgIHQsXG5cblx0XHQvLyAowrExL8+GLCDCsc+GLCAwKVxuXHRcdC0gciwgLSB0LCAgMCwgICAgLSByLCAgdCwgIDAsXG5cdFx0IHIsIC0gdCwgIDAsICAgICByLCAgdCwgIDAsXG5cblx0XHQvLyAowrHPhiwgMCwgwrExL8+GKVxuXHRcdC0gdCwgIDAsIC0gciwgICAgIHQsICAwLCAtIHIsXG5cdFx0LSB0LCAgMCwgIHIsICAgICB0LCAgMCwgIHJcblx0XTtcblxuXHR2YXIgaW5kaWNlcyA9IFtcblx0XHQgMywgMTEsICA3LCAgICAgIDMsICA3LCAxNSwgICAgICAzLCAxNSwgMTMsXG5cdFx0IDcsIDE5LCAxNywgICAgICA3LCAxNywgIDYsICAgICAgNywgIDYsIDE1LFxuXHRcdDE3LCAgNCwgIDgsICAgICAxNywgIDgsIDEwLCAgICAgMTcsIDEwLCAgNixcblx0XHQgOCwgIDAsIDE2LCAgICAgIDgsIDE2LCAgMiwgICAgICA4LCAgMiwgMTAsXG5cdFx0IDAsIDEyLCAgMSwgICAgICAwLCAgMSwgMTgsICAgICAgMCwgMTgsIDE2LFxuXHRcdCA2LCAxMCwgIDIsICAgICAgNiwgIDIsIDEzLCAgICAgIDYsIDEzLCAxNSxcblx0XHQgMiwgMTYsIDE4LCAgICAgIDIsIDE4LCAgMywgICAgICAyLCAgMywgMTMsXG5cdFx0MTgsICAxLCAgOSwgICAgIDE4LCAgOSwgMTEsICAgICAxOCwgMTEsICAzLFxuXHRcdCA0LCAxNCwgMTIsICAgICAgNCwgMTIsICAwLCAgICAgIDQsICAwLCAgOCxcblx0XHQxMSwgIDksICA1LCAgICAgMTEsICA1LCAxOSwgICAgIDExLCAxOSwgIDcsXG5cdFx0MTksICA1LCAxNCwgICAgIDE5LCAxNCwgIDQsICAgICAxOSwgIDQsIDE3LFxuXHRcdCAxLCAxMiwgMTQsICAgICAgMSwgMTQsICA1LCAgICAgIDEsICA1LCAgOVxuXHRdO1xuXG5cdFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTtcblxuXHR0aGlzLnR5cGUgPSAnRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG59XG5cbkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3Igb29zbW94aWVjb2RlIC8gaHR0cHM6Ly9naXRodWIuY29tL29vc21veGllY29kZVxuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHBzOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciB6ejg1IC8gaHR0cHM6Ly9naXRodWIuY29tL3p6ODVcbiAqIEBhdXRob3IgbWluaW5nb2xkIC8gaHR0cHM6Ly9naXRodWIuY29tL21pbmluZ29sZFxuICogQGF1dGhvciBqb25vYnIxIC8gaHR0cHM6Ly9naXRodWIuY29tL2pvbm9icjFcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKlxuICovXG5cbi8vIFR1YmVHZW9tZXRyeVxuXG5mdW5jdGlvbiBUdWJlR2VvbWV0cnkoIHBhdGgsIHR1YnVsYXJTZWdtZW50cywgcmFkaXVzLCByYWRpYWxTZWdtZW50cywgY2xvc2VkLCB0YXBlciApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1R1YmVHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHBhdGg6IHBhdGgsXG5cdFx0dHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsXG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGNsb3NlZDogY2xvc2VkXG5cdH07XG5cblx0aWYgKCB0YXBlciAhPT0gdW5kZWZpbmVkICkgY29uc29sZS53YXJuKCAnVEhSRUUuVHViZUdlb21ldHJ5OiB0YXBlciBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR2YXIgYnVmZmVyR2VvbWV0cnkgPSBuZXcgVHViZUJ1ZmZlckdlb21ldHJ5KCBwYXRoLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGl1cywgcmFkaWFsU2VnbWVudHMsIGNsb3NlZCApO1xuXG5cdC8vIGV4cG9zZSBpbnRlcm5hbHNcblxuXHR0aGlzLnRhbmdlbnRzID0gYnVmZmVyR2VvbWV0cnkudGFuZ2VudHM7XG5cdHRoaXMubm9ybWFscyA9IGJ1ZmZlckdlb21ldHJ5Lm5vcm1hbHM7XG5cdHRoaXMuYmlub3JtYWxzID0gYnVmZmVyR2VvbWV0cnkuYmlub3JtYWxzO1xuXG5cdC8vIGNyZWF0ZSBnZW9tZXRyeVxuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBidWZmZXJHZW9tZXRyeSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5UdWJlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5UdWJlR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVHViZUdlb21ldHJ5O1xuXG4vLyBUdWJlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gVHViZUJ1ZmZlckdlb21ldHJ5KCBwYXRoLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGl1cywgcmFkaWFsU2VnbWVudHMsIGNsb3NlZCApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1R1YmVCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHBhdGg6IHBhdGgsXG5cdFx0dHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsXG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGNsb3NlZDogY2xvc2VkXG5cdH07XG5cblx0dHVidWxhclNlZ21lbnRzID0gdHVidWxhclNlZ21lbnRzIHx8IDY0O1xuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTtcblx0cmFkaWFsU2VnbWVudHMgPSByYWRpYWxTZWdtZW50cyB8fCA4O1xuXHRjbG9zZWQgPSBjbG9zZWQgfHwgZmFsc2U7XG5cblx0dmFyIGZyYW1lcyA9IHBhdGguY29tcHV0ZUZyZW5ldEZyYW1lcyggdHVidWxhclNlZ21lbnRzLCBjbG9zZWQgKTtcblxuXHQvLyBleHBvc2UgaW50ZXJuYWxzXG5cblx0dGhpcy50YW5nZW50cyA9IGZyYW1lcy50YW5nZW50cztcblx0dGhpcy5ub3JtYWxzID0gZnJhbWVzLm5vcm1hbHM7XG5cdHRoaXMuYmlub3JtYWxzID0gZnJhbWVzLmJpbm9ybWFscztcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdXYgPSBuZXcgVmVjdG9yMigpO1xuXG5cdHZhciBpLCBqO1xuXG5cdC8vIGJ1ZmZlclxuXG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cdHZhciBpbmRpY2VzID0gW107XG5cblx0Ly8gY3JlYXRlIGJ1ZmZlciBkYXRhXG5cblx0Z2VuZXJhdGVCdWZmZXJEYXRhKCk7XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cdC8vIGZ1bmN0aW9uc1xuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlQnVmZmVyRGF0YSgpIHtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgdHVidWxhclNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRnZW5lcmF0ZVNlZ21lbnQoIGkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGlmIHRoZSBnZW9tZXRyeSBpcyBub3QgY2xvc2VkLCBnZW5lcmF0ZSB0aGUgbGFzdCByb3cgb2YgdmVydGljZXMgYW5kIG5vcm1hbHNcblx0XHQvLyBhdCB0aGUgcmVndWxhciBwb3NpdGlvbiBvbiB0aGUgZ2l2ZW4gcGF0aFxuXHRcdC8vXG5cdFx0Ly8gaWYgdGhlIGdlb21ldHJ5IGlzIGNsb3NlZCwgZHVwbGljYXRlIHRoZSBmaXJzdCByb3cgb2YgdmVydGljZXMgYW5kIG5vcm1hbHMgKHV2cyB3aWxsIGRpZmZlcilcblxuXHRcdGdlbmVyYXRlU2VnbWVudCggKCBjbG9zZWQgPT09IGZhbHNlICkgPyB0dWJ1bGFyU2VnbWVudHMgOiAwICk7XG5cblx0XHQvLyB1dnMgYXJlIGdlbmVyYXRlZCBpbiBhIHNlcGFyYXRlIGZ1bmN0aW9uLlxuXHRcdC8vIHRoaXMgbWFrZXMgaXQgZWFzeSBjb21wdXRlIGNvcnJlY3QgdmFsdWVzIGZvciBjbG9zZWQgZ2VvbWV0cmllc1xuXG5cdFx0Z2VuZXJhdGVVVnMoKTtcblxuXHRcdC8vIGZpbmFsbHkgY3JlYXRlIGZhY2VzXG5cblx0XHRnZW5lcmF0ZUluZGljZXMoKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVTZWdtZW50KCBpICkge1xuXG5cdFx0Ly8gd2UgdXNlIGdldFBvaW50QXQgdG8gc2FtcGxlIGV2ZW5seSBkaXN0cmlidXRlZCBwb2ludHMgZnJvbSB0aGUgZ2l2ZW4gcGF0aFxuXG5cdFx0dmFyIFAgPSBwYXRoLmdldFBvaW50QXQoIGkgLyB0dWJ1bGFyU2VnbWVudHMgKTtcblxuXHRcdC8vIHJldHJpZXZlIGNvcnJlc3BvbmRpbmcgbm9ybWFsIGFuZCBiaW5vcm1hbFxuXG5cdFx0dmFyIE4gPSBmcmFtZXMubm9ybWFsc1sgaSBdO1xuXHRcdHZhciBCID0gZnJhbWVzLmJpbm9ybWFsc1sgaSBdO1xuXG5cdFx0Ly8gZ2VuZXJhdGUgbm9ybWFscyBhbmQgdmVydGljZXMgZm9yIHRoZSBjdXJyZW50IHNlZ21lbnRcblxuXHRcdGZvciAoIGogPSAwOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0XHR2YXIgdiA9IGogLyByYWRpYWxTZWdtZW50cyAqIE1hdGguUEkgKiAyO1xuXG5cdFx0XHR2YXIgc2luID0gICBNYXRoLnNpbiggdiApO1xuXHRcdFx0dmFyIGNvcyA9IC0gTWF0aC5jb3MoIHYgKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdG5vcm1hbC54ID0gKCBjb3MgKiBOLnggKyBzaW4gKiBCLnggKTtcblx0XHRcdG5vcm1hbC55ID0gKCBjb3MgKiBOLnkgKyBzaW4gKiBCLnkgKTtcblx0XHRcdG5vcm1hbC56ID0gKCBjb3MgKiBOLnogKyBzaW4gKiBCLnogKTtcblx0XHRcdG5vcm1hbC5ub3JtYWxpemUoKTtcblxuXHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHR2ZXJ0ZXgueCA9IFAueCArIHJhZGl1cyAqIG5vcm1hbC54O1xuXHRcdFx0dmVydGV4LnkgPSBQLnkgKyByYWRpdXMgKiBub3JtYWwueTtcblx0XHRcdHZlcnRleC56ID0gUC56ICsgcmFkaXVzICogbm9ybWFsLno7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVJbmRpY2VzKCkge1xuXG5cdFx0Zm9yICggaiA9IDE7IGogPD0gdHVidWxhclNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0XHRmb3IgKCBpID0gMTsgaSA8PSByYWRpYWxTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgYSA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyAoIGkgLSAxICk7XG5cdFx0XHRcdHZhciBiID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyAoIGkgLSAxICk7XG5cdFx0XHRcdHZhciBjID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyBpO1xuXHRcdFx0XHR2YXIgZCA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyBpO1xuXG5cdFx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlVVZzKCkge1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPD0gdHVidWxhclNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRmb3IgKCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHtcblxuXHRcdFx0XHR1di54ID0gaSAvIHR1YnVsYXJTZWdtZW50cztcblx0XHRcdFx0dXYueSA9IGogLyByYWRpYWxTZWdtZW50cztcblxuXHRcdFx0XHR1dnMucHVzaCggdXYueCwgdXYueSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG59XG5cblR1YmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblR1YmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUdWJlQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBvb3Ntb3hpZWNvZGVcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKlxuICogYmFzZWQgb24gaHR0cDovL3d3dy5ibGFja3Bhd24uY29tL3RleHRzL3BxdG9ydXMvXG4gKi9cblxuLy8gVG9ydXNLbm90R2VvbWV0cnlcblxuZnVuY3Rpb24gVG9ydXNLbm90R2VvbWV0cnkoIHJhZGl1cywgdHViZSwgdHVidWxhclNlZ21lbnRzLCByYWRpYWxTZWdtZW50cywgcCwgcSwgaGVpZ2h0U2NhbGUgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUb3J1c0tub3RHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHR1YmU6IHR1YmUsXG5cdFx0dHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdHA6IHAsXG5cdFx0cTogcVxuXHR9O1xuXG5cdGlmICggaGVpZ2h0U2NhbGUgIT09IHVuZGVmaW5lZCApIGNvbnNvbGUud2FybiggJ1RIUkVFLlRvcnVzS25vdEdlb21ldHJ5OiBoZWlnaHRTY2FsZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnNjYWxlKCB4LCB5LCB6ICkgaW5zdGVhZC4nICk7XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGlhbFNlZ21lbnRzLCBwLCBxICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuVG9ydXNLbm90R2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5Ub3J1c0tub3RHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb3J1c0tub3RHZW9tZXRyeTtcblxuLy8gVG9ydXNLbm90QnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgdHViZSwgdHVidWxhclNlZ21lbnRzLCByYWRpYWxTZWdtZW50cywgcCwgcSApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1RvcnVzS25vdEJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0dHViZTogdHViZSxcblx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0cDogcCxcblx0XHRxOiBxXG5cdH07XG5cblx0cmFkaXVzID0gcmFkaXVzIHx8IDEwMDtcblx0dHViZSA9IHR1YmUgfHwgNDA7XG5cdHR1YnVsYXJTZWdtZW50cyA9IE1hdGguZmxvb3IoIHR1YnVsYXJTZWdtZW50cyApIHx8IDY0O1xuXHRyYWRpYWxTZWdtZW50cyA9IE1hdGguZmxvb3IoIHJhZGlhbFNlZ21lbnRzICkgfHwgODtcblx0cCA9IHAgfHwgMjtcblx0cSA9IHEgfHwgMztcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIGksIGo7XG5cblx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBQMSA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBQMiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIEIgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgVCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBOID0gbmV3IFZlY3RvcjMoKTtcblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0Zm9yICggaSA9IDA7IGkgPD0gdHVidWxhclNlZ21lbnRzOyArKyBpICkge1xuXG5cdFx0Ly8gdGhlIHJhZGlhbiBcInVcIiBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb24gdGhlIHRvcnVzIGN1cnZlIG9mIHRoZSBjdXJyZW50IHR1YnVsYXIgc2VnZW1lbnRcblxuXHRcdHZhciB1ID0gaSAvIHR1YnVsYXJTZWdtZW50cyAqIHAgKiBNYXRoLlBJICogMjtcblxuXHRcdC8vIG5vdyB3ZSBjYWxjdWxhdGUgdHdvIHBvaW50cy4gUDEgaXMgb3VyIGN1cnJlbnQgcG9zaXRpb24gb24gdGhlIGN1cnZlLCBQMiBpcyBhIGxpdHRsZSBmYXJ0aGVyIGFoZWFkLlxuXHRcdC8vIHRoZXNlIHBvaW50cyBhcmUgdXNlZCB0byBjcmVhdGUgYSBzcGVjaWFsIFwiY29vcmRpbmF0ZSBzcGFjZVwiLCB3aGljaCBpcyBuZWNlc3NhcnkgdG8gY2FsY3VsYXRlIHRoZSBjb3JyZWN0IHZlcnRleCBwb3NpdGlvbnNcblxuXHRcdGNhbGN1bGF0ZVBvc2l0aW9uT25DdXJ2ZSggdSwgcCwgcSwgcmFkaXVzLCBQMSApO1xuXHRcdGNhbGN1bGF0ZVBvc2l0aW9uT25DdXJ2ZSggdSArIDAuMDEsIHAsIHEsIHJhZGl1cywgUDIgKTtcblxuXHRcdC8vIGNhbGN1bGF0ZSBvcnRob25vcm1hbCBiYXNpc1xuXG5cdFx0VC5zdWJWZWN0b3JzKCBQMiwgUDEgKTtcblx0XHROLmFkZFZlY3RvcnMoIFAyLCBQMSApO1xuXHRcdEIuY3Jvc3NWZWN0b3JzKCBULCBOICk7XG5cdFx0Ti5jcm9zc1ZlY3RvcnMoIEIsIFQgKTtcblxuXHRcdC8vIG5vcm1hbGl6ZSBCLCBOLiBUIGNhbiBiZSBpZ25vcmVkLCB3ZSBkb24ndCB1c2UgaXRcblxuXHRcdEIubm9ybWFsaXplKCk7XG5cdFx0Ti5ub3JtYWxpemUoKTtcblxuXHRcdGZvciAoIGogPSAwOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyArKyBqICkge1xuXG5cdFx0XHQvLyBub3cgY2FsY3VsYXRlIHRoZSB2ZXJ0aWNlcy4gdGhleSBhcmUgbm90aGluZyBtb3JlIHRoYW4gYW4gZXh0cnVzaW9uIG9mIHRoZSB0b3J1cyBjdXJ2ZS5cblx0XHRcdC8vIGJlY2F1c2Ugd2UgZXh0cnVkZSBhIHNoYXBlIGluIHRoZSB4eS1wbGFuZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBjYWxjdWxhdGUgYSB6LXZhbHVlLlxuXG5cdFx0XHR2YXIgdiA9IGogLyByYWRpYWxTZWdtZW50cyAqIE1hdGguUEkgKiAyO1xuXHRcdFx0dmFyIGN4ID0gLSB0dWJlICogTWF0aC5jb3MoIHYgKTtcblx0XHRcdHZhciBjeSA9IHR1YmUgKiBNYXRoLnNpbiggdiApO1xuXG5cdFx0XHQvLyBub3cgY2FsY3VsYXRlIHRoZSBmaW5hbCB2ZXJ0ZXggcG9zaXRpb24uXG5cdFx0XHQvLyBmaXJzdCB3ZSBvcmllbnQgdGhlIGV4dHJ1c2lvbiB3aXRoIG91ciBiYXNpcyB2ZWN0b3MsIHRoZW4gd2UgYWRkIGl0IHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZVxuXG5cdFx0XHR2ZXJ0ZXgueCA9IFAxLnggKyAoIGN4ICogTi54ICsgY3kgKiBCLnggKTtcblx0XHRcdHZlcnRleC55ID0gUDEueSArICggY3ggKiBOLnkgKyBjeSAqIEIueSApO1xuXHRcdFx0dmVydGV4LnogPSBQMS56ICsgKCBjeCAqIE4ueiArIGN5ICogQi56ICk7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0Ly8gbm9ybWFsIChQMSBpcyBhbHdheXMgdGhlIGNlbnRlci9vcmlnaW4gb2YgdGhlIGV4dHJ1c2lvbiwgdGh1cyB3ZSBjYW4gdXNlIGl0IHRvIGNhbGN1bGF0ZSB0aGUgbm9ybWFsKVxuXG5cdFx0XHRub3JtYWwuc3ViVmVjdG9ycyggdmVydGV4LCBQMSApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0Ly8gdXZcblxuXHRcdFx0dXZzLnB1c2goIGkgLyB0dWJ1bGFyU2VnbWVudHMgKTtcblx0XHRcdHV2cy5wdXNoKCBqIC8gcmFkaWFsU2VnbWVudHMgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xuXG5cdGZvciAoIGogPSAxOyBqIDw9IHR1YnVsYXJTZWdtZW50czsgaiArKyApIHtcblxuXHRcdGZvciAoIGkgPSAxOyBpIDw9IHJhZGlhbFNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHQvLyBpbmRpY2VzXG5cblx0XHRcdHZhciBhID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArICggaSAtIDEgKTtcblx0XHRcdHZhciBiID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyAoIGkgLSAxICk7XG5cdFx0XHR2YXIgYyA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiBqICsgaTtcblx0XHRcdHZhciBkID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGk7XG5cblx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXHQvLyB0aGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGN1cnJlbnQgcG9zaXRpb24gb24gdGhlIHRvcnVzIGN1cnZlXG5cblx0ZnVuY3Rpb24gY2FsY3VsYXRlUG9zaXRpb25PbkN1cnZlKCB1LCBwLCBxLCByYWRpdXMsIHBvc2l0aW9uICkge1xuXG5cdFx0dmFyIGN1ID0gTWF0aC5jb3MoIHUgKTtcblx0XHR2YXIgc3UgPSBNYXRoLnNpbiggdSApO1xuXHRcdHZhciBxdU92ZXJQID0gcSAvIHAgKiB1O1xuXHRcdHZhciBjcyA9IE1hdGguY29zKCBxdU92ZXJQICk7XG5cblx0XHRwb3NpdGlvbi54ID0gcmFkaXVzICogKCAyICsgY3MgKSAqIDAuNSAqIGN1O1xuXHRcdHBvc2l0aW9uLnkgPSByYWRpdXMgKiAoIDIgKyBjcyApICogc3UgKiAwLjU7XG5cdFx0cG9zaXRpb24ueiA9IHJhZGl1cyAqIE1hdGguc2luKCBxdU92ZXJQICkgKiAwLjU7XG5cblx0fVxuXG59XG5cblRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVG9ydXNLbm90QnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBvb3Ntb3hpZWNvZGVcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIFRvcnVzR2VvbWV0cnlcblxuZnVuY3Rpb24gVG9ydXNHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCByYWRpYWxTZWdtZW50cywgdHVidWxhclNlZ21lbnRzLCBhcmMgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUb3J1c0dlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0dHViZTogdHViZSxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0dHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsXG5cdFx0YXJjOiBhcmNcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFRvcnVzQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgdHViZSwgcmFkaWFsU2VnbWVudHMsIHR1YnVsYXJTZWdtZW50cywgYXJjICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuVG9ydXNHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRvcnVzR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVG9ydXNHZW9tZXRyeTtcblxuLy8gVG9ydXNCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBUb3J1c0J1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHJhZGlhbFNlZ21lbnRzLCB0dWJ1bGFyU2VnbWVudHMsIGFyYyApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1RvcnVzQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHR0dWJlOiB0dWJlLFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcblx0XHRhcmM6IGFyY1xuXHR9O1xuXG5cdHJhZGl1cyA9IHJhZGl1cyB8fCAxMDA7XG5cdHR1YmUgPSB0dWJlIHx8IDQwO1xuXHRyYWRpYWxTZWdtZW50cyA9IE1hdGguZmxvb3IoIHJhZGlhbFNlZ21lbnRzICkgfHwgODtcblx0dHVidWxhclNlZ21lbnRzID0gTWF0aC5mbG9vciggdHVidWxhclNlZ21lbnRzICkgfHwgNjtcblx0YXJjID0gYXJjIHx8IE1hdGguUEkgKiAyO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgY2VudGVyID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBqLCBpO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRmb3IgKCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0dmFyIHUgPSBpIC8gdHVidWxhclNlZ21lbnRzICogYXJjO1xuXHRcdFx0dmFyIHYgPSBqIC8gcmFkaWFsU2VnbWVudHMgKiBNYXRoLlBJICogMjtcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRleC54ID0gKCByYWRpdXMgKyB0dWJlICogTWF0aC5jb3MoIHYgKSApICogTWF0aC5jb3MoIHUgKTtcblx0XHRcdHZlcnRleC55ID0gKCByYWRpdXMgKyB0dWJlICogTWF0aC5jb3MoIHYgKSApICogTWF0aC5zaW4oIHUgKTtcblx0XHRcdHZlcnRleC56ID0gdHViZSAqIE1hdGguc2luKCB2ICk7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdGNlbnRlci54ID0gcmFkaXVzICogTWF0aC5jb3MoIHUgKTtcblx0XHRcdGNlbnRlci55ID0gcmFkaXVzICogTWF0aC5zaW4oIHUgKTtcblx0XHRcdG5vcm1hbC5zdWJWZWN0b3JzKCB2ZXJ0ZXgsIGNlbnRlciApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0Ly8gdXZcblxuXHRcdFx0dXZzLnB1c2goIGkgLyB0dWJ1bGFyU2VnbWVudHMgKTtcblx0XHRcdHV2cy5wdXNoKCBqIC8gcmFkaWFsU2VnbWVudHMgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xuXG5cdGZvciAoIGogPSAxOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0Zm9yICggaSA9IDE7IGkgPD0gdHVidWxhclNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHQvLyBpbmRpY2VzXG5cblx0XHRcdHZhciBhID0gKCB0dWJ1bGFyU2VnbWVudHMgKyAxICkgKiBqICsgaSAtIDE7XG5cdFx0XHR2YXIgYiA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaSAtIDE7XG5cdFx0XHR2YXIgYyA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaTtcblx0XHRcdHZhciBkID0gKCB0dWJ1bGFyU2VnbWVudHMgKyAxICkgKiBqICsgaTtcblxuXHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG59XG5cblRvcnVzQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5Ub3J1c0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRvcnVzQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICovXG5cbnZhciBTaGFwZVV0aWxzID0ge1xuXG5cdC8vIGNhbGN1bGF0ZSBhcmVhIG9mIHRoZSBjb250b3VyIHBvbHlnb25cblxuXHRhcmVhOiBmdW5jdGlvbiAoIGNvbnRvdXIgKSB7XG5cblx0XHR2YXIgbiA9IGNvbnRvdXIubGVuZ3RoO1xuXHRcdHZhciBhID0gMC4wO1xuXG5cdFx0Zm9yICggdmFyIHAgPSBuIC0gMSwgcSA9IDA7IHEgPCBuOyBwID0gcSArKyApIHtcblxuXHRcdFx0YSArPSBjb250b3VyWyBwIF0ueCAqIGNvbnRvdXJbIHEgXS55IC0gY29udG91clsgcSBdLnggKiBjb250b3VyWyBwIF0ueTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBhICogMC41O1xuXG5cdH0sXG5cblx0dHJpYW5ndWxhdGU6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0LyoqXG5cdFx0ICogVGhpcyBjb2RlIGlzIGEgcXVpY2sgcG9ydCBvZiBjb2RlIHdyaXR0ZW4gaW4gQysrIHdoaWNoIHdhcyBzdWJtaXR0ZWQgdG9cblx0XHQgKiBmbGlwY29kZS5jb20gYnkgSm9obiBXLiBSYXRjbGlmZiAgLy8gSnVseSAyMiwgMjAwMFxuXHRcdCAqIFNlZSBvcmlnaW5hbCBjb2RlIGFuZCBtb3JlIGluZm9ybWF0aW9uIGhlcmU6XG5cdFx0ICogaHR0cDovL3d3dy5mbGlwY29kZS5jb20vYXJjaGl2ZXMvRWZmaWNpZW50X1BvbHlnb25fVHJpYW5ndWxhdGlvbi5zaHRtbFxuXHRcdCAqXG5cdFx0ICogcG9ydGVkIHRvIGFjdGlvbnNjcmlwdCBieSBaZXZhbiBSb3NzZXJcblx0XHQgKiB3d3cuYWN0aW9uc25pcHBldC5jb21cblx0XHQgKlxuXHRcdCAqIHBvcnRlZCB0byBqYXZhc2NyaXB0IGJ5IEpvc2h1YSBLb29cblx0XHQgKiBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG5cdFx0ICpcblx0XHQgKi9cblxuXHRcdGZ1bmN0aW9uIHNuaXAoIGNvbnRvdXIsIHUsIHYsIHcsIG4sIHZlcnRzICkge1xuXG5cdFx0XHR2YXIgcDtcblx0XHRcdHZhciBheCwgYXksIGJ4LCBieTtcblx0XHRcdHZhciBjeCwgY3ksIHB4LCBweTtcblxuXHRcdFx0YXggPSBjb250b3VyWyB2ZXJ0c1sgdSBdIF0ueDtcblx0XHRcdGF5ID0gY29udG91clsgdmVydHNbIHUgXSBdLnk7XG5cblx0XHRcdGJ4ID0gY29udG91clsgdmVydHNbIHYgXSBdLng7XG5cdFx0XHRieSA9IGNvbnRvdXJbIHZlcnRzWyB2IF0gXS55O1xuXG5cdFx0XHRjeCA9IGNvbnRvdXJbIHZlcnRzWyB3IF0gXS54O1xuXHRcdFx0Y3kgPSBjb250b3VyWyB2ZXJ0c1sgdyBdIF0ueTtcblxuXHRcdFx0aWYgKCAoIGJ4IC0gYXggKSAqICggY3kgLSBheSApIC0gKCBieSAtIGF5ICkgKiAoIGN4IC0gYXggKSA8PSAwICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0XHR2YXIgYVgsIGFZLCBiWCwgYlksIGNYLCBjWTtcblx0XHRcdHZhciBhcHgsIGFweSwgYnB4LCBicHksIGNweCwgY3B5O1xuXHRcdFx0dmFyIGNDUk9TU2FwLCBiQ1JPU1NjcCwgYUNST1NTYnA7XG5cblx0XHRcdGFYID0gY3ggLSBieDsgIGFZID0gY3kgLSBieTtcblx0XHRcdGJYID0gYXggLSBjeDsgIGJZID0gYXkgLSBjeTtcblx0XHRcdGNYID0gYnggLSBheDsgIGNZID0gYnkgLSBheTtcblxuXHRcdFx0Zm9yICggcCA9IDA7IHAgPCBuOyBwICsrICkge1xuXG5cdFx0XHRcdHB4ID0gY29udG91clsgdmVydHNbIHAgXSBdLng7XG5cdFx0XHRcdHB5ID0gY29udG91clsgdmVydHNbIHAgXSBdLnk7XG5cblx0XHRcdFx0aWYgKCAoICggcHggPT09IGF4ICkgJiYgKCBweSA9PT0gYXkgKSApIHx8XG5cdFx0XHRcdFx0ICggKCBweCA9PT0gYnggKSAmJiAoIHB5ID09PSBieSApICkgfHxcblx0XHRcdFx0XHQgKCAoIHB4ID09PSBjeCApICYmICggcHkgPT09IGN5ICkgKSApXHRjb250aW51ZTtcblxuXHRcdFx0XHRhcHggPSBweCAtIGF4OyAgYXB5ID0gcHkgLSBheTtcblx0XHRcdFx0YnB4ID0gcHggLSBieDsgIGJweSA9IHB5IC0gYnk7XG5cdFx0XHRcdGNweCA9IHB4IC0gY3g7ICBjcHkgPSBweSAtIGN5O1xuXG5cdFx0XHRcdC8vIHNlZSBpZiBwIGlzIGluc2lkZSB0cmlhbmdsZSBhYmNcblxuXHRcdFx0XHRhQ1JPU1NicCA9IGFYICogYnB5IC0gYVkgKiBicHg7XG5cdFx0XHRcdGNDUk9TU2FwID0gY1ggKiBhcHkgLSBjWSAqIGFweDtcblx0XHRcdFx0YkNST1NTY3AgPSBiWCAqIGNweSAtIGJZICogY3B4O1xuXG5cdFx0XHRcdGlmICggKCBhQ1JPU1NicCA+PSAtIE51bWJlci5FUFNJTE9OICkgJiYgKCBiQ1JPU1NjcCA+PSAtIE51bWJlci5FUFNJTE9OICkgJiYgKCBjQ1JPU1NhcCA+PSAtIE51bWJlci5FUFNJTE9OICkgKSByZXR1cm4gZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cblx0XHR9XG5cblx0XHQvLyB0YWtlcyBpbiBhbiBjb250b3VyIGFycmF5IGFuZCByZXR1cm5zXG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdHJpYW5ndWxhdGUoIGNvbnRvdXIsIGluZGljZXMgKSB7XG5cblx0XHRcdHZhciBuID0gY29udG91ci5sZW5ndGg7XG5cblx0XHRcdGlmICggbiA8IDMgKSByZXR1cm4gbnVsbDtcblxuXHRcdFx0dmFyIHJlc3VsdCA9IFtdLFxuXHRcdFx0XHR2ZXJ0cyA9IFtdLFxuXHRcdFx0XHR2ZXJ0SW5kaWNlcyA9IFtdO1xuXG5cdFx0XHQvKiB3ZSB3YW50IGEgY291bnRlci1jbG9ja3dpc2UgcG9seWdvbiBpbiB2ZXJ0cyAqL1xuXG5cdFx0XHR2YXIgdSwgdiwgdztcblxuXHRcdFx0aWYgKCBTaGFwZVV0aWxzLmFyZWEoIGNvbnRvdXIgKSA+IDAuMCApIHtcblxuXHRcdFx0XHRmb3IgKCB2ID0gMDsgdiA8IG47IHYgKysgKSB2ZXJ0c1sgdiBdID0gdjtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRmb3IgKCB2ID0gMDsgdiA8IG47IHYgKysgKSB2ZXJ0c1sgdiBdID0gKCBuIC0gMSApIC0gdjtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgbnYgPSBuO1xuXG5cdFx0XHQvKiAgcmVtb3ZlIG52IC0gMiB2ZXJ0aWNlcywgY3JlYXRpbmcgMSB0cmlhbmdsZSBldmVyeSB0aW1lICovXG5cblx0XHRcdHZhciBjb3VudCA9IDIgKiBudjsgICAvKiBlcnJvciBkZXRlY3Rpb24gKi9cblxuXHRcdFx0Zm9yICggdiA9IG52IC0gMTsgbnYgPiAyOyApIHtcblxuXHRcdFx0XHQvKiBpZiB3ZSBsb29wLCBpdCBpcyBwcm9iYWJseSBhIG5vbi1zaW1wbGUgcG9seWdvbiAqL1xuXG5cdFx0XHRcdGlmICggKCBjb3VudCAtLSApIDw9IDAgKSB7XG5cblx0XHRcdFx0XHQvLyoqIFRyaWFuZ3VsYXRlOiBFUlJPUiAtIHByb2JhYmxlIGJhZCBwb2x5Z29uIVxuXG5cdFx0XHRcdFx0Ly90aHJvdyAoIFwiV2FybmluZywgdW5hYmxlIHRvIHRyaWFuZ3VsYXRlIHBvbHlnb24hXCIgKTtcblx0XHRcdFx0XHQvL3JldHVybiBudWxsO1xuXHRcdFx0XHRcdC8vIFNvbWV0aW1lcyB3YXJuaW5nIGlzIGZpbmUsIGVzcGVjaWFsbHkgcG9seWdvbnMgYXJlIHRyaWFuZ3VsYXRlZCBpbiByZXZlcnNlLlxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlVXRpbHM6IFVuYWJsZSB0byB0cmlhbmd1bGF0ZSBwb2x5Z29uISBpbiB0cmlhbmd1bGF0ZSgpJyApO1xuXG5cdFx0XHRcdFx0aWYgKCBpbmRpY2VzICkgcmV0dXJuIHZlcnRJbmRpY2VzO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8qIHRocmVlIGNvbnNlY3V0aXZlIHZlcnRpY2VzIGluIGN1cnJlbnQgcG9seWdvbiwgPHUsdix3PiAqL1xuXG5cdFx0XHRcdHUgPSB2OyBcdCBcdGlmICggbnYgPD0gdSApIHUgPSAwOyAgICAgLyogcHJldmlvdXMgKi9cblx0XHRcdFx0diA9IHUgKyAxOyAgaWYgKCBudiA8PSB2ICkgdiA9IDA7ICAgICAvKiBuZXcgdiAgICAqL1xuXHRcdFx0XHR3ID0gdiArIDE7ICBpZiAoIG52IDw9IHcgKSB3ID0gMDsgICAgIC8qIG5leHQgICAgICovXG5cblx0XHRcdFx0aWYgKCBzbmlwKCBjb250b3VyLCB1LCB2LCB3LCBudiwgdmVydHMgKSApIHtcblxuXHRcdFx0XHRcdHZhciBhLCBiLCBjLCBzLCB0O1xuXG5cdFx0XHRcdFx0LyogdHJ1ZSBuYW1lcyBvZiB0aGUgdmVydGljZXMgKi9cblxuXHRcdFx0XHRcdGEgPSB2ZXJ0c1sgdSBdO1xuXHRcdFx0XHRcdGIgPSB2ZXJ0c1sgdiBdO1xuXHRcdFx0XHRcdGMgPSB2ZXJ0c1sgdyBdO1xuXG5cdFx0XHRcdFx0Lyogb3V0cHV0IFRyaWFuZ2xlICovXG5cblx0XHRcdFx0XHRyZXN1bHQucHVzaCggWyBjb250b3VyWyBhIF0sXG5cdFx0XHRcdFx0XHRjb250b3VyWyBiIF0sXG5cdFx0XHRcdFx0XHRjb250b3VyWyBjIF0gXSApO1xuXG5cblx0XHRcdFx0XHR2ZXJ0SW5kaWNlcy5wdXNoKCBbIHZlcnRzWyB1IF0sIHZlcnRzWyB2IF0sIHZlcnRzWyB3IF0gXSApO1xuXG5cdFx0XHRcdFx0LyogcmVtb3ZlIHYgZnJvbSB0aGUgcmVtYWluaW5nIHBvbHlnb24gKi9cblxuXHRcdFx0XHRcdGZvciAoIHMgPSB2LCB0ID0gdiArIDE7IHQgPCBudjsgcyArKywgdCArKyApIHtcblxuXHRcdFx0XHRcdFx0dmVydHNbIHMgXSA9IHZlcnRzWyB0IF07XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRudiAtLTtcblxuXHRcdFx0XHRcdC8qIHJlc2V0IGVycm9yIGRldGVjdGlvbiBjb3VudGVyICovXG5cblx0XHRcdFx0XHRjb3VudCA9IDIgKiBudjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBpbmRpY2VzICkgcmV0dXJuIHZlcnRJbmRpY2VzO1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblxuXHRcdH1cblxuXHR9ICkoKSxcblxuXHR0cmlhbmd1bGF0ZVNoYXBlOiBmdW5jdGlvbiAoIGNvbnRvdXIsIGhvbGVzICkge1xuXG5cdFx0ZnVuY3Rpb24gcmVtb3ZlRHVwRW5kUHRzKHBvaW50cykge1xuXG5cdFx0XHR2YXIgbCA9IHBvaW50cy5sZW5ndGg7XG5cblx0XHRcdGlmICggbCA+IDIgJiYgcG9pbnRzWyBsIC0gMSBdLmVxdWFscyggcG9pbnRzWyAwIF0gKSApIHtcblxuXHRcdFx0XHRwb2ludHMucG9wKCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJlbW92ZUR1cEVuZFB0cyggY29udG91ciApO1xuXHRcdGhvbGVzLmZvckVhY2goIHJlbW92ZUR1cEVuZFB0cyApO1xuXG5cdFx0ZnVuY3Rpb24gcG9pbnRfaW5fc2VnbWVudF8yRF9jb2xpbiggaW5TZWdQdDEsIGluU2VnUHQyLCBpbk90aGVyUHQgKSB7XG5cblx0XHRcdC8vIGluT3RoZXJQdCBuZWVkcyB0byBiZSBjb2xsaW5lYXIgdG8gdGhlIGluU2VnbWVudFxuXHRcdFx0aWYgKCBpblNlZ1B0MS54ICE9PSBpblNlZ1B0Mi54ICkge1xuXG5cdFx0XHRcdGlmICggaW5TZWdQdDEueCA8IGluU2VnUHQyLnggKSB7XG5cblx0XHRcdFx0XHRyZXR1cm5cdCggKCBpblNlZ1B0MS54IDw9IGluT3RoZXJQdC54ICkgJiYgKCBpbk90aGVyUHQueCA8PSBpblNlZ1B0Mi54ICkgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0cmV0dXJuXHQoICggaW5TZWdQdDIueCA8PSBpbk90aGVyUHQueCApICYmICggaW5PdGhlclB0LnggPD0gaW5TZWdQdDEueCApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGlmICggaW5TZWdQdDEueSA8IGluU2VnUHQyLnkgKSB7XG5cblx0XHRcdFx0XHRyZXR1cm5cdCggKCBpblNlZ1B0MS55IDw9IGluT3RoZXJQdC55ICkgJiYgKCBpbk90aGVyUHQueSA8PSBpblNlZ1B0Mi55ICkgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0cmV0dXJuXHQoICggaW5TZWdQdDIueSA8PSBpbk90aGVyUHQueSApICYmICggaW5PdGhlclB0LnkgPD0gaW5TZWdQdDEueSApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBpbnRlcnNlY3Rfc2VnbWVudHNfMkQoIGluU2VnMVB0MSwgaW5TZWcxUHQyLCBpblNlZzJQdDEsIGluU2VnMlB0MiwgaW5FeGNsdWRlQWRqYWNlbnRTZWdzICkge1xuXG5cdFx0XHR2YXIgc2VnMWR4ID0gaW5TZWcxUHQyLnggLSBpblNlZzFQdDEueCwgICBzZWcxZHkgPSBpblNlZzFQdDIueSAtIGluU2VnMVB0MS55O1xuXHRcdFx0dmFyIHNlZzJkeCA9IGluU2VnMlB0Mi54IC0gaW5TZWcyUHQxLngsICAgc2VnMmR5ID0gaW5TZWcyUHQyLnkgLSBpblNlZzJQdDEueTtcblxuXHRcdFx0dmFyIHNlZzFzZWcyZHggPSBpblNlZzFQdDEueCAtIGluU2VnMlB0MS54O1xuXHRcdFx0dmFyIHNlZzFzZWcyZHkgPSBpblNlZzFQdDEueSAtIGluU2VnMlB0MS55O1xuXG5cdFx0XHR2YXIgbGltaXRcdFx0PSBzZWcxZHkgKiBzZWcyZHggLSBzZWcxZHggKiBzZWcyZHk7XG5cdFx0XHR2YXIgcGVycFNlZzFcdD0gc2VnMWR5ICogc2VnMXNlZzJkeCAtIHNlZzFkeCAqIHNlZzFzZWcyZHk7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIGxpbWl0ICkgPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHQvLyBub3QgcGFyYWxsZWxcblxuXHRcdFx0XHR2YXIgcGVycFNlZzI7XG5cdFx0XHRcdGlmICggbGltaXQgPiAwICkge1xuXG5cdFx0XHRcdFx0aWYgKCAoIHBlcnBTZWcxIDwgMCApIHx8ICggcGVycFNlZzEgPiBsaW1pdCApICkgXHRcdHJldHVybiBbXTtcblx0XHRcdFx0XHRwZXJwU2VnMiA9IHNlZzJkeSAqIHNlZzFzZWcyZHggLSBzZWcyZHggKiBzZWcxc2VnMmR5O1xuXHRcdFx0XHRcdGlmICggKCBwZXJwU2VnMiA8IDAgKSB8fCAoIHBlcnBTZWcyID4gbGltaXQgKSApIFx0XHRyZXR1cm4gW107XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGlmICggKCBwZXJwU2VnMSA+IDAgKSB8fCAoIHBlcnBTZWcxIDwgbGltaXQgKSApIFx0XHRyZXR1cm4gW107XG5cdFx0XHRcdFx0cGVycFNlZzIgPSBzZWcyZHkgKiBzZWcxc2VnMmR4IC0gc2VnMmR4ICogc2VnMXNlZzJkeTtcblx0XHRcdFx0XHRpZiAoICggcGVycFNlZzIgPiAwICkgfHwgKCBwZXJwU2VnMiA8IGxpbWl0ICkgKSBcdFx0cmV0dXJuIFtdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBpLmUuIHRvIHJlZHVjZSByb3VuZGluZyBlcnJvcnNcblx0XHRcdFx0Ly8gaW50ZXJzZWN0aW9uIGF0IGVuZHBvaW50IG9mIHNlZ21lbnQjMT9cblx0XHRcdFx0aWYgKCBwZXJwU2VnMiA9PT0gMCApIHtcblxuXHRcdFx0XHRcdGlmICggKCBpbkV4Y2x1ZGVBZGphY2VudFNlZ3MgKSAmJlxuXHRcdFx0XHRcdFx0ICggKCBwZXJwU2VnMSA9PT0gMCApIHx8ICggcGVycFNlZzEgPT09IGxpbWl0ICkgKSApXHRcdHJldHVybiBbXTtcblx0XHRcdFx0XHRyZXR1cm4gWyBpblNlZzFQdDEgXTtcblxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggcGVycFNlZzIgPT09IGxpbWl0ICkge1xuXG5cdFx0XHRcdFx0aWYgKCAoIGluRXhjbHVkZUFkamFjZW50U2VncyApICYmXG5cdFx0XHRcdFx0XHQgKCAoIHBlcnBTZWcxID09PSAwICkgfHwgKCBwZXJwU2VnMSA9PT0gbGltaXQgKSApIClcdFx0cmV0dXJuIFtdO1xuXHRcdFx0XHRcdHJldHVybiBbIGluU2VnMVB0MiBdO1xuXG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gaW50ZXJzZWN0aW9uIGF0IGVuZHBvaW50IG9mIHNlZ21lbnQjMj9cblx0XHRcdFx0aWYgKCBwZXJwU2VnMSA9PT0gMCApXHRcdHJldHVybiBbIGluU2VnMlB0MSBdO1xuXHRcdFx0XHRpZiAoIHBlcnBTZWcxID09PSBsaW1pdCApXHRyZXR1cm4gWyBpblNlZzJQdDIgXTtcblxuXHRcdFx0XHQvLyByZXR1cm4gcmVhbCBpbnRlcnNlY3Rpb24gcG9pbnRcblx0XHRcdFx0dmFyIGZhY3RvclNlZzEgPSBwZXJwU2VnMiAvIGxpbWl0O1xuXHRcdFx0XHRyZXR1cm5cdFsgeyB4OiBpblNlZzFQdDEueCArIGZhY3RvclNlZzEgKiBzZWcxZHgsXG5cdFx0XHRcdFx0XHRcdHk6IGluU2VnMVB0MS55ICsgZmFjdG9yU2VnMSAqIHNlZzFkeSB9IF07XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gcGFyYWxsZWwgb3IgY29sbGluZWFyXG5cdFx0XHRcdGlmICggKCBwZXJwU2VnMSAhPT0gMCApIHx8XG5cdFx0XHRcdFx0ICggc2VnMmR5ICogc2VnMXNlZzJkeCAhPT0gc2VnMmR4ICogc2VnMXNlZzJkeSApICkgXHRcdFx0cmV0dXJuIFtdO1xuXG5cdFx0XHRcdC8vIHRoZXkgYXJlIGNvbGxpbmVhciBvciBkZWdlbmVyYXRlXG5cdFx0XHRcdHZhciBzZWcxUHQgPSAoICggc2VnMWR4ID09PSAwICkgJiYgKCBzZWcxZHkgPT09IDAgKSApO1x0Ly8gc2VnbWVudDEgaXMganVzdCBhIHBvaW50P1xuXHRcdFx0XHR2YXIgc2VnMlB0ID0gKCAoIHNlZzJkeCA9PT0gMCApICYmICggc2VnMmR5ID09PSAwICkgKTtcdC8vIHNlZ21lbnQyIGlzIGp1c3QgYSBwb2ludD9cblx0XHRcdFx0Ly8gYm90aCBzZWdtZW50cyBhcmUgcG9pbnRzXG5cdFx0XHRcdGlmICggc2VnMVB0ICYmIHNlZzJQdCApIHtcblxuXHRcdFx0XHRcdGlmICggKCBpblNlZzFQdDEueCAhPT0gaW5TZWcyUHQxLnggKSB8fFxuXHRcdFx0XHRcdFx0ICggaW5TZWcxUHQxLnkgIT09IGluU2VnMlB0MS55ICkgKVx0XHRyZXR1cm4gW107XHQvLyB0aGV5IGFyZSBkaXN0aW5jdCAgcG9pbnRzXG5cdFx0XHRcdFx0cmV0dXJuIFsgaW5TZWcxUHQxIF07ICAgICAgICAgICAgICAgICBcdFx0XHRcdFx0XHQvLyB0aGV5IGFyZSB0aGUgc2FtZSBwb2ludFxuXG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gc2VnbWVudCMxICBpcyBhIHNpbmdsZSBwb2ludFxuXHRcdFx0XHRpZiAoIHNlZzFQdCApIHtcblxuXHRcdFx0XHRcdGlmICggISBwb2ludF9pbl9zZWdtZW50XzJEX2NvbGluKCBpblNlZzJQdDEsIGluU2VnMlB0MiwgaW5TZWcxUHQxICkgKVx0XHRyZXR1cm4gW107XHRcdC8vIGJ1dCBub3QgaW4gc2VnbWVudCMyXG5cdFx0XHRcdFx0cmV0dXJuIFsgaW5TZWcxUHQxIF07XG5cblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBzZWdtZW50IzIgIGlzIGEgc2luZ2xlIHBvaW50XG5cdFx0XHRcdGlmICggc2VnMlB0ICkge1xuXG5cdFx0XHRcdFx0aWYgKCAhIHBvaW50X2luX3NlZ21lbnRfMkRfY29saW4oIGluU2VnMVB0MSwgaW5TZWcxUHQyLCBpblNlZzJQdDEgKSApXHRcdHJldHVybiBbXTtcdFx0Ly8gYnV0IG5vdCBpbiBzZWdtZW50IzFcblx0XHRcdFx0XHRyZXR1cm4gWyBpblNlZzJQdDEgXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gdGhleSBhcmUgY29sbGluZWFyIHNlZ21lbnRzLCB3aGljaCBtaWdodCBvdmVybGFwXG5cdFx0XHRcdHZhciBzZWcxbWluLCBzZWcxbWF4LCBzZWcxbWluVmFsLCBzZWcxbWF4VmFsO1xuXHRcdFx0XHR2YXIgc2VnMm1pbiwgc2VnMm1heCwgc2VnMm1pblZhbCwgc2VnMm1heFZhbDtcblx0XHRcdFx0aWYgKCBzZWcxZHggIT09IDAgKSB7XG5cblx0XHRcdFx0XHQvLyB0aGUgc2VnbWVudHMgYXJlIE5PVCBvbiBhIHZlcnRpY2FsIGxpbmVcblx0XHRcdFx0XHRpZiAoIGluU2VnMVB0MS54IDwgaW5TZWcxUHQyLnggKSB7XG5cblx0XHRcdFx0XHRcdHNlZzFtaW4gPSBpblNlZzFQdDE7IHNlZzFtaW5WYWwgPSBpblNlZzFQdDEueDtcblx0XHRcdFx0XHRcdHNlZzFtYXggPSBpblNlZzFQdDI7IHNlZzFtYXhWYWwgPSBpblNlZzFQdDIueDtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHNlZzFtaW4gPSBpblNlZzFQdDI7IHNlZzFtaW5WYWwgPSBpblNlZzFQdDIueDtcblx0XHRcdFx0XHRcdHNlZzFtYXggPSBpblNlZzFQdDE7IHNlZzFtYXhWYWwgPSBpblNlZzFQdDEueDtcblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIGluU2VnMlB0MS54IDwgaW5TZWcyUHQyLnggKSB7XG5cblx0XHRcdFx0XHRcdHNlZzJtaW4gPSBpblNlZzJQdDE7IHNlZzJtaW5WYWwgPSBpblNlZzJQdDEueDtcblx0XHRcdFx0XHRcdHNlZzJtYXggPSBpblNlZzJQdDI7IHNlZzJtYXhWYWwgPSBpblNlZzJQdDIueDtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHNlZzJtaW4gPSBpblNlZzJQdDI7IHNlZzJtaW5WYWwgPSBpblNlZzJQdDIueDtcblx0XHRcdFx0XHRcdHNlZzJtYXggPSBpblNlZzJQdDE7IHNlZzJtYXhWYWwgPSBpblNlZzJQdDEueDtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gdGhlIHNlZ21lbnRzIGFyZSBvbiBhIHZlcnRpY2FsIGxpbmVcblx0XHRcdFx0XHRpZiAoIGluU2VnMVB0MS55IDwgaW5TZWcxUHQyLnkgKSB7XG5cblx0XHRcdFx0XHRcdHNlZzFtaW4gPSBpblNlZzFQdDE7IHNlZzFtaW5WYWwgPSBpblNlZzFQdDEueTtcblx0XHRcdFx0XHRcdHNlZzFtYXggPSBpblNlZzFQdDI7IHNlZzFtYXhWYWwgPSBpblNlZzFQdDIueTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHNlZzFtaW4gPSBpblNlZzFQdDI7IHNlZzFtaW5WYWwgPSBpblNlZzFQdDIueTtcblx0XHRcdFx0XHRcdHNlZzFtYXggPSBpblNlZzFQdDE7IHNlZzFtYXhWYWwgPSBpblNlZzFQdDEueTtcblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIGluU2VnMlB0MS55IDwgaW5TZWcyUHQyLnkgKSB7XG5cblx0XHRcdFx0XHRcdHNlZzJtaW4gPSBpblNlZzJQdDE7IHNlZzJtaW5WYWwgPSBpblNlZzJQdDEueTtcblx0XHRcdFx0XHRcdHNlZzJtYXggPSBpblNlZzJQdDI7IHNlZzJtYXhWYWwgPSBpblNlZzJQdDIueTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHNlZzJtaW4gPSBpblNlZzJQdDI7IHNlZzJtaW5WYWwgPSBpblNlZzJQdDIueTtcblx0XHRcdFx0XHRcdHNlZzJtYXggPSBpblNlZzJQdDE7IHNlZzJtYXhWYWwgPSBpblNlZzJQdDEueTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggc2VnMW1pblZhbCA8PSBzZWcybWluVmFsICkge1xuXG5cdFx0XHRcdFx0aWYgKCBzZWcxbWF4VmFsIDwgIHNlZzJtaW5WYWwgKVx0cmV0dXJuIFtdO1xuXHRcdFx0XHRcdGlmICggc2VnMW1heFZhbCA9PT0gc2VnMm1pblZhbCApXHR7XG5cblx0XHRcdFx0XHRcdGlmICggaW5FeGNsdWRlQWRqYWNlbnRTZWdzIClcdFx0cmV0dXJuIFtdO1xuXHRcdFx0XHRcdFx0cmV0dXJuIFsgc2VnMm1pbiBdO1xuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggc2VnMW1heFZhbCA8PSBzZWcybWF4VmFsIClcdHJldHVybiBbIHNlZzJtaW4sIHNlZzFtYXggXTtcblx0XHRcdFx0XHRyZXR1cm5cdFsgc2VnMm1pbiwgc2VnMm1heCBdO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRpZiAoIHNlZzFtaW5WYWwgPiAgc2VnMm1heFZhbCApXHRyZXR1cm4gW107XG5cdFx0XHRcdFx0aWYgKCBzZWcxbWluVmFsID09PSBzZWcybWF4VmFsIClcdHtcblxuXHRcdFx0XHRcdFx0aWYgKCBpbkV4Y2x1ZGVBZGphY2VudFNlZ3MgKVx0XHRyZXR1cm4gW107XG5cdFx0XHRcdFx0XHRyZXR1cm4gWyBzZWcxbWluIF07XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBzZWcxbWF4VmFsIDw9IHNlZzJtYXhWYWwgKVx0cmV0dXJuIFsgc2VnMW1pbiwgc2VnMW1heCBdO1xuXHRcdFx0XHRcdHJldHVyblx0WyBzZWcxbWluLCBzZWcybWF4IF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBpc1BvaW50SW5zaWRlQW5nbGUoIGluVmVydGV4LCBpbkxlZ0Zyb21QdCwgaW5MZWdUb1B0LCBpbk90aGVyUHQgKSB7XG5cblx0XHRcdC8vIFRoZSBvcmRlciBvZiBsZWdzIGlzIGltcG9ydGFudFxuXG5cdFx0XHQvLyB0cmFuc2xhdGlvbiBvZiBhbGwgcG9pbnRzLCBzbyB0aGF0IFZlcnRleCBpcyBhdCAoMCwwKVxuXHRcdFx0dmFyIGxlZ0Zyb21QdFhcdD0gaW5MZWdGcm9tUHQueCAtIGluVmVydGV4LngsICBsZWdGcm9tUHRZXHQ9IGluTGVnRnJvbVB0LnkgLSBpblZlcnRleC55O1xuXHRcdFx0dmFyIGxlZ1RvUHRYXHQ9IGluTGVnVG9QdC54XHQtIGluVmVydGV4LngsICBsZWdUb1B0WVx0XHQ9IGluTGVnVG9QdC55XHQtIGluVmVydGV4Lnk7XG5cdFx0XHR2YXIgb3RoZXJQdFhcdD0gaW5PdGhlclB0LnhcdC0gaW5WZXJ0ZXgueCwgIG90aGVyUHRZXHRcdD0gaW5PdGhlclB0LnlcdC0gaW5WZXJ0ZXgueTtcblxuXHRcdFx0Ly8gbWFpbiBhbmdsZSA+MDogPCAxODAgZGVnLjsgMDogMTgwIGRlZy47IDwwOiA+IDE4MCBkZWcuXG5cdFx0XHR2YXIgZnJvbTJ0b0FuZ2xlXHQ9IGxlZ0Zyb21QdFggKiBsZWdUb1B0WSAtIGxlZ0Zyb21QdFkgKiBsZWdUb1B0WDtcblx0XHRcdHZhciBmcm9tMm90aGVyQW5nbGVcdD0gbGVnRnJvbVB0WCAqIG90aGVyUHRZIC0gbGVnRnJvbVB0WSAqIG90aGVyUHRYO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBmcm9tMnRvQW5nbGUgKSA+IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdC8vIGFuZ2xlICE9IDE4MCBkZWcuXG5cblx0XHRcdFx0dmFyIG90aGVyMnRvQW5nbGVcdFx0PSBvdGhlclB0WCAqIGxlZ1RvUHRZIC0gb3RoZXJQdFkgKiBsZWdUb1B0WDtcblx0XHRcdFx0Ly8gY29uc29sZS5sb2coIFwiZnJvbTJ0bzogXCIgKyBmcm9tMnRvQW5nbGUgKyBcIiwgZnJvbTJvdGhlcjogXCIgKyBmcm9tMm90aGVyQW5nbGUgKyBcIiwgb3RoZXIydG86IFwiICsgb3RoZXIydG9BbmdsZSApO1xuXG5cdFx0XHRcdGlmICggZnJvbTJ0b0FuZ2xlID4gMCApIHtcblxuXHRcdFx0XHRcdC8vIG1haW4gYW5nbGUgPCAxODAgZGVnLlxuXHRcdFx0XHRcdHJldHVyblx0KCAoIGZyb20yb3RoZXJBbmdsZSA+PSAwICkgJiYgKCBvdGhlcjJ0b0FuZ2xlID49IDAgKSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyBtYWluIGFuZ2xlID4gMTgwIGRlZy5cblx0XHRcdFx0XHRyZXR1cm5cdCggKCBmcm9tMm90aGVyQW5nbGUgPj0gMCApIHx8ICggb3RoZXIydG9BbmdsZSA+PSAwICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gYW5nbGUgPT0gMTgwIGRlZy5cblx0XHRcdFx0Ly8gY29uc29sZS5sb2coIFwiZnJvbTJ0bzogMTgwIGRlZy4sIGZyb20yb3RoZXI6IFwiICsgZnJvbTJvdGhlckFuZ2xlICApO1xuXHRcdFx0XHRyZXR1cm5cdCggZnJvbTJvdGhlckFuZ2xlID4gMCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblxuXHRcdGZ1bmN0aW9uIHJlbW92ZUhvbGVzKCBjb250b3VyLCBob2xlcyApIHtcblxuXHRcdFx0dmFyIHNoYXBlID0gY29udG91ci5jb25jYXQoKTsgLy8gd29yayBvbiB0aGlzIHNoYXBlXG5cdFx0XHR2YXIgaG9sZTtcblxuXHRcdFx0ZnVuY3Rpb24gaXNDdXRMaW5lSW5zaWRlQW5nbGVzKCBpblNoYXBlSWR4LCBpbkhvbGVJZHggKSB7XG5cblx0XHRcdFx0Ly8gQ2hlY2sgaWYgaG9sZSBwb2ludCBsaWVzIHdpdGhpbiBhbmdsZSBhcm91bmQgc2hhcGUgcG9pbnRcblx0XHRcdFx0dmFyIGxhc3RTaGFwZUlkeCA9IHNoYXBlLmxlbmd0aCAtIDE7XG5cblx0XHRcdFx0dmFyIHByZXZTaGFwZUlkeCA9IGluU2hhcGVJZHggLSAxO1xuXHRcdFx0XHRpZiAoIHByZXZTaGFwZUlkeCA8IDAgKVx0XHRcdHByZXZTaGFwZUlkeCA9IGxhc3RTaGFwZUlkeDtcblxuXHRcdFx0XHR2YXIgbmV4dFNoYXBlSWR4ID0gaW5TaGFwZUlkeCArIDE7XG5cdFx0XHRcdGlmICggbmV4dFNoYXBlSWR4ID4gbGFzdFNoYXBlSWR4IClcdG5leHRTaGFwZUlkeCA9IDA7XG5cblx0XHRcdFx0dmFyIGluc2lkZUFuZ2xlID0gaXNQb2ludEluc2lkZUFuZ2xlKCBzaGFwZVsgaW5TaGFwZUlkeCBdLCBzaGFwZVsgcHJldlNoYXBlSWR4IF0sIHNoYXBlWyBuZXh0U2hhcGVJZHggXSwgaG9sZVsgaW5Ib2xlSWR4IF0gKTtcblx0XHRcdFx0aWYgKCAhIGluc2lkZUFuZ2xlICkge1xuXG5cdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coIFwiVmVydGV4IChTaGFwZSk6IFwiICsgaW5TaGFwZUlkeCArIFwiLCBQb2ludDogXCIgKyBob2xlW2luSG9sZUlkeF0ueCArIFwiL1wiICsgaG9sZVtpbkhvbGVJZHhdLnkgKTtcblx0XHRcdFx0XHRyZXR1cm5cdGZhbHNlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDaGVjayBpZiBzaGFwZSBwb2ludCBsaWVzIHdpdGhpbiBhbmdsZSBhcm91bmQgaG9sZSBwb2ludFxuXHRcdFx0XHR2YXIgbGFzdEhvbGVJZHggPSBob2xlLmxlbmd0aCAtIDE7XG5cblx0XHRcdFx0dmFyIHByZXZIb2xlSWR4ID0gaW5Ib2xlSWR4IC0gMTtcblx0XHRcdFx0aWYgKCBwcmV2SG9sZUlkeCA8IDAgKVx0XHRcdHByZXZIb2xlSWR4ID0gbGFzdEhvbGVJZHg7XG5cblx0XHRcdFx0dmFyIG5leHRIb2xlSWR4ID0gaW5Ib2xlSWR4ICsgMTtcblx0XHRcdFx0aWYgKCBuZXh0SG9sZUlkeCA+IGxhc3RIb2xlSWR4IClcdG5leHRIb2xlSWR4ID0gMDtcblxuXHRcdFx0XHRpbnNpZGVBbmdsZSA9IGlzUG9pbnRJbnNpZGVBbmdsZSggaG9sZVsgaW5Ib2xlSWR4IF0sIGhvbGVbIHByZXZIb2xlSWR4IF0sIGhvbGVbIG5leHRIb2xlSWR4IF0sIHNoYXBlWyBpblNoYXBlSWR4IF0gKTtcblx0XHRcdFx0aWYgKCAhIGluc2lkZUFuZ2xlICkge1xuXG5cdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coIFwiVmVydGV4IChIb2xlKTogXCIgKyBpbkhvbGVJZHggKyBcIiwgUG9pbnQ6IFwiICsgc2hhcGVbaW5TaGFwZUlkeF0ueCArIFwiL1wiICsgc2hhcGVbaW5TaGFwZUlkeF0ueSApO1xuXHRcdFx0XHRcdHJldHVyblx0ZmFsc2U7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVyblx0dHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiBpbnRlcnNlY3RzU2hhcGVFZGdlKCBpblNoYXBlUHQsIGluSG9sZVB0ICkge1xuXG5cdFx0XHRcdC8vIGNoZWNrcyBmb3IgaW50ZXJzZWN0aW9ucyB3aXRoIHNoYXBlIGVkZ2VzXG5cdFx0XHRcdHZhciBzSWR4LCBuZXh0SWR4LCBpbnRlcnNlY3Rpb247XG5cdFx0XHRcdGZvciAoIHNJZHggPSAwOyBzSWR4IDwgc2hhcGUubGVuZ3RoOyBzSWR4ICsrICkge1xuXG5cdFx0XHRcdFx0bmV4dElkeCA9IHNJZHggKyAxOyBuZXh0SWR4ICU9IHNoYXBlLmxlbmd0aDtcblx0XHRcdFx0XHRpbnRlcnNlY3Rpb24gPSBpbnRlcnNlY3Rfc2VnbWVudHNfMkQoIGluU2hhcGVQdCwgaW5Ib2xlUHQsIHNoYXBlWyBzSWR4IF0sIHNoYXBlWyBuZXh0SWR4IF0sIHRydWUgKTtcblx0XHRcdFx0XHRpZiAoIGludGVyc2VjdGlvbi5sZW5ndGggPiAwIClcdFx0cmV0dXJuXHR0cnVlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm5cdGZhbHNlO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBpbmRlcEhvbGVzID0gW107XG5cblx0XHRcdGZ1bmN0aW9uIGludGVyc2VjdHNIb2xlRWRnZSggaW5TaGFwZVB0LCBpbkhvbGVQdCApIHtcblxuXHRcdFx0XHQvLyBjaGVja3MgZm9yIGludGVyc2VjdGlvbnMgd2l0aCBob2xlIGVkZ2VzXG5cdFx0XHRcdHZhciBpaElkeCwgY2hrSG9sZSxcblx0XHRcdFx0XHRoSWR4LCBuZXh0SWR4LCBpbnRlcnNlY3Rpb247XG5cdFx0XHRcdGZvciAoIGloSWR4ID0gMDsgaWhJZHggPCBpbmRlcEhvbGVzLmxlbmd0aDsgaWhJZHggKysgKSB7XG5cblx0XHRcdFx0XHRjaGtIb2xlID0gaG9sZXNbIGluZGVwSG9sZXNbIGloSWR4IF1dO1xuXHRcdFx0XHRcdGZvciAoIGhJZHggPSAwOyBoSWR4IDwgY2hrSG9sZS5sZW5ndGg7IGhJZHggKysgKSB7XG5cblx0XHRcdFx0XHRcdG5leHRJZHggPSBoSWR4ICsgMTsgbmV4dElkeCAlPSBjaGtIb2xlLmxlbmd0aDtcblx0XHRcdFx0XHRcdGludGVyc2VjdGlvbiA9IGludGVyc2VjdF9zZWdtZW50c18yRCggaW5TaGFwZVB0LCBpbkhvbGVQdCwgY2hrSG9sZVsgaElkeCBdLCBjaGtIb2xlWyBuZXh0SWR4IF0sIHRydWUgKTtcblx0XHRcdFx0XHRcdGlmICggaW50ZXJzZWN0aW9uLmxlbmd0aCA+IDAgKVx0XHRyZXR1cm5cdHRydWU7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm5cdGZhbHNlO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBob2xlSW5kZXgsIHNoYXBlSW5kZXgsXG5cdFx0XHRcdHNoYXBlUHQsIGhvbGVQdCxcblx0XHRcdFx0aG9sZUlkeCwgY3V0S2V5LCBmYWlsZWRDdXRzID0gW10sXG5cdFx0XHRcdHRtcFNoYXBlMSwgdG1wU2hhcGUyLFxuXHRcdFx0XHR0bXBIb2xlMSwgdG1wSG9sZTI7XG5cblx0XHRcdGZvciAoIHZhciBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0XHRpbmRlcEhvbGVzLnB1c2goIGggKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgbWluU2hhcGVJbmRleCA9IDA7XG5cdFx0XHR2YXIgY291bnRlciA9IGluZGVwSG9sZXMubGVuZ3RoICogMjtcblx0XHRcdHdoaWxlICggaW5kZXBIb2xlcy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdGNvdW50ZXIgLS07XG5cdFx0XHRcdGlmICggY291bnRlciA8IDAgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmxvZyggXCJJbmZpbml0ZSBMb29wISBIb2xlcyBsZWZ0OlwiICsgaW5kZXBIb2xlcy5sZW5ndGggKyBcIiwgUHJvYmFibHkgSG9sZSBvdXRzaWRlIFNoYXBlIVwiICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIHNlYXJjaCBmb3Igc2hhcGUtdmVydGV4IGFuZCBob2xlLXZlcnRleCxcblx0XHRcdFx0Ly8gd2hpY2ggY2FuIGJlIGNvbm5lY3RlZCB3aXRob3V0IGludGVyc2VjdGlvbnNcblx0XHRcdFx0Zm9yICggc2hhcGVJbmRleCA9IG1pblNoYXBlSW5kZXg7IHNoYXBlSW5kZXggPCBzaGFwZS5sZW5ndGg7IHNoYXBlSW5kZXggKysgKSB7XG5cblx0XHRcdFx0XHRzaGFwZVB0ID0gc2hhcGVbIHNoYXBlSW5kZXggXTtcblx0XHRcdFx0XHRob2xlSW5kZXhcdD0gLSAxO1xuXG5cdFx0XHRcdFx0Ly8gc2VhcmNoIGZvciBob2xlIHdoaWNoIGNhbiBiZSByZWFjaGVkIHdpdGhvdXQgaW50ZXJzZWN0aW9uc1xuXHRcdFx0XHRcdGZvciAoIHZhciBoID0gMDsgaCA8IGluZGVwSG9sZXMubGVuZ3RoOyBoICsrICkge1xuXG5cdFx0XHRcdFx0XHRob2xlSWR4ID0gaW5kZXBIb2xlc1sgaCBdO1xuXG5cdFx0XHRcdFx0XHQvLyBwcmV2ZW50IG11bHRpcGxlIGNoZWNrc1xuXHRcdFx0XHRcdFx0Y3V0S2V5ID0gc2hhcGVQdC54ICsgXCI6XCIgKyBzaGFwZVB0LnkgKyBcIjpcIiArIGhvbGVJZHg7XG5cdFx0XHRcdFx0XHRpZiAoIGZhaWxlZEN1dHNbIGN1dEtleSBdICE9PSB1bmRlZmluZWQgKVx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRob2xlID0gaG9sZXNbIGhvbGVJZHggXTtcblx0XHRcdFx0XHRcdGZvciAoIHZhciBoMiA9IDA7IGgyIDwgaG9sZS5sZW5ndGg7IGgyICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdGhvbGVQdCA9IGhvbGVbIGgyIF07XG5cdFx0XHRcdFx0XHRcdGlmICggISBpc0N1dExpbmVJbnNpZGVBbmdsZXMoIHNoYXBlSW5kZXgsIGgyICkgKVx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3RzU2hhcGVFZGdlKCBzaGFwZVB0LCBob2xlUHQgKSApXHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0XHRpZiAoIGludGVyc2VjdHNIb2xlRWRnZSggc2hhcGVQdCwgaG9sZVB0ICkgKVx0XHRjb250aW51ZTtcblxuXHRcdFx0XHRcdFx0XHRob2xlSW5kZXggPSBoMjtcblx0XHRcdFx0XHRcdFx0aW5kZXBIb2xlcy5zcGxpY2UoIGgsIDEgKTtcblxuXHRcdFx0XHRcdFx0XHR0bXBTaGFwZTEgPSBzaGFwZS5zbGljZSggMCwgc2hhcGVJbmRleCArIDEgKTtcblx0XHRcdFx0XHRcdFx0dG1wU2hhcGUyID0gc2hhcGUuc2xpY2UoIHNoYXBlSW5kZXggKTtcblx0XHRcdFx0XHRcdFx0dG1wSG9sZTEgPSBob2xlLnNsaWNlKCBob2xlSW5kZXggKTtcblx0XHRcdFx0XHRcdFx0dG1wSG9sZTIgPSBob2xlLnNsaWNlKCAwLCBob2xlSW5kZXggKyAxICk7XG5cblx0XHRcdFx0XHRcdFx0c2hhcGUgPSB0bXBTaGFwZTEuY29uY2F0KCB0bXBIb2xlMSApLmNvbmNhdCggdG1wSG9sZTIgKS5jb25jYXQoIHRtcFNoYXBlMiApO1xuXG5cdFx0XHRcdFx0XHRcdG1pblNoYXBlSW5kZXggPSBzaGFwZUluZGV4O1xuXG5cdFx0XHRcdFx0XHRcdC8vIERlYnVnIG9ubHksIHRvIHNob3cgdGhlIHNlbGVjdGVkIGN1dHNcblx0XHRcdFx0XHRcdFx0Ly8gZ2xvYl9DdXRMaW5lcy5wdXNoKCBbIHNoYXBlUHQsIGhvbGVQdCBdICk7XG5cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmICggaG9sZUluZGV4ID49IDAgKVx0YnJlYWs7XHRcdC8vIGhvbGUtdmVydGV4IGZvdW5kXG5cblx0XHRcdFx0XHRcdGZhaWxlZEN1dHNbIGN1dEtleSBdID0gdHJ1ZTtcdFx0XHQvLyByZW1lbWJlciBmYWlsdXJlXG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBob2xlSW5kZXggPj0gMCApXHRicmVhaztcdFx0Ly8gaG9sZS12ZXJ0ZXggZm91bmRcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNoYXBlOyBcdFx0XHQvKiBzaGFwZSB3aXRoIG5vIGhvbGVzICovXG5cblx0XHR9XG5cblxuXHRcdHZhciBpLCBpbCwgZiwgZmFjZSxcblx0XHRcdGtleSwgaW5kZXgsXG5cdFx0XHRhbGxQb2ludHNNYXAgPSB7fTtcblxuXHRcdC8vIFRvIG1haW50YWluIHJlZmVyZW5jZSB0byBvbGQgc2hhcGUsIG9uZSBtdXN0IG1hdGNoIGNvb3JkaW5hdGVzLCBvciBvZmZzZXQgdGhlIGluZGljZXMgZnJvbSBvcmlnaW5hbCBhcnJheXMuIEl0J3MgcHJvYmFibHkgZWFzaWVyIHRvIGRvIHRoZSBmaXJzdC5cblxuXHRcdHZhciBhbGxwb2ludHMgPSBjb250b3VyLmNvbmNhdCgpO1xuXG5cdFx0Zm9yICggdmFyIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkge1xuXG5cdFx0XHRBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSggYWxscG9pbnRzLCBob2xlc1sgaCBdICk7XG5cblx0XHR9XG5cblx0XHQvL2NvbnNvbGUubG9nKCBcImFsbHBvaW50c1wiLGFsbHBvaW50cywgYWxscG9pbnRzLmxlbmd0aCApO1xuXG5cdFx0Ly8gcHJlcGFyZSBhbGwgcG9pbnRzIG1hcFxuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gYWxscG9pbnRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRrZXkgPSBhbGxwb2ludHNbIGkgXS54ICsgXCI6XCIgKyBhbGxwb2ludHNbIGkgXS55O1xuXG5cdFx0XHRpZiAoIGFsbFBvaW50c01hcFsga2V5IF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuU2hhcGVVdGlsczogRHVwbGljYXRlIHBvaW50XCIsIGtleSwgaSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGFsbFBvaW50c01hcFsga2V5IF0gPSBpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gcmVtb3ZlIGhvbGVzIGJ5IGN1dHRpbmcgcGF0aHMgdG8gaG9sZXMgYW5kIGFkZGluZyB0aGVtIHRvIHRoZSBzaGFwZVxuXHRcdHZhciBzaGFwZVdpdGhvdXRIb2xlcyA9IHJlbW92ZUhvbGVzKCBjb250b3VyLCBob2xlcyApO1xuXG5cdFx0dmFyIHRyaWFuZ2xlcyA9IFNoYXBlVXRpbHMudHJpYW5ndWxhdGUoIHNoYXBlV2l0aG91dEhvbGVzLCBmYWxzZSApOyAvLyBUcnVlIHJldHVybnMgaW5kaWNlcyBmb3IgcG9pbnRzIG9mIHNwb29sZWQgc2hhcGVcblx0XHQvL2NvbnNvbGUubG9nKCBcInRyaWFuZ2xlc1wiLHRyaWFuZ2xlcywgdHJpYW5nbGVzLmxlbmd0aCApO1xuXG5cdFx0Ly8gY2hlY2sgYWxsIGZhY2UgdmVydGljZXMgYWdhaW5zdCBhbGwgcG9pbnRzIG1hcFxuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdHJpYW5nbGVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRmYWNlID0gdHJpYW5nbGVzWyBpIF07XG5cblx0XHRcdGZvciAoIGYgPSAwOyBmIDwgMzsgZiArKyApIHtcblxuXHRcdFx0XHRrZXkgPSBmYWNlWyBmIF0ueCArIFwiOlwiICsgZmFjZVsgZiBdLnk7XG5cblx0XHRcdFx0aW5kZXggPSBhbGxQb2ludHNNYXBbIGtleSBdO1xuXG5cdFx0XHRcdGlmICggaW5kZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGZhY2VbIGYgXSA9IGluZGV4O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRyaWFuZ2xlcy5jb25jYXQoKTtcblxuXHR9LFxuXG5cdGlzQ2xvY2tXaXNlOiBmdW5jdGlvbiAoIHB0cyApIHtcblxuXHRcdHJldHVybiBTaGFwZVV0aWxzLmFyZWEoIHB0cyApIDwgMDtcblxuXHR9XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICpcbiAqIENyZWF0ZXMgZXh0cnVkZWQgZ2VvbWV0cnkgZnJvbSBhIHBhdGggc2hhcGUuXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqXG4gKiAgY3VydmVTZWdtZW50czogPGludD4sIC8vIG51bWJlciBvZiBwb2ludHMgb24gdGhlIGN1cnZlc1xuICogIHN0ZXBzOiA8aW50PiwgLy8gbnVtYmVyIG9mIHBvaW50cyBmb3Igei1zaWRlIGV4dHJ1c2lvbnMgLyB1c2VkIGZvciBzdWJkaXZpZGluZyBzZWdtZW50cyBvZiBleHRydWRlIHNwbGluZSB0b29cbiAqICBhbW91bnQ6IDxpbnQ+LCAvLyBEZXB0aCB0byBleHRydWRlIHRoZSBzaGFwZVxuICpcbiAqICBiZXZlbEVuYWJsZWQ6IDxib29sPiwgLy8gdHVybiBvbiBiZXZlbFxuICogIGJldmVsVGhpY2tuZXNzOiA8ZmxvYXQ+LCAvLyBob3cgZGVlcCBpbnRvIHRoZSBvcmlnaW5hbCBzaGFwZSBiZXZlbCBnb2VzXG4gKiAgYmV2ZWxTaXplOiA8ZmxvYXQ+LCAvLyBob3cgZmFyIGZyb20gc2hhcGUgb3V0bGluZSBpcyBiZXZlbFxuICogIGJldmVsU2VnbWVudHM6IDxpbnQ+LCAvLyBudW1iZXIgb2YgYmV2ZWwgbGF5ZXJzXG4gKlxuICogIGV4dHJ1ZGVQYXRoOiA8VEhSRUUuQ3VydmU+IC8vIGN1cnZlIHRvIGV4dHJ1ZGUgc2hhcGUgYWxvbmdcbiAqICBmcmFtZXM6IDxPYmplY3Q+IC8vIGNvbnRhaW5pbmcgYXJyYXlzIG9mIHRhbmdlbnRzLCBub3JtYWxzLCBiaW5vcm1hbHNcbiAqXG4gKiAgVVZHZW5lcmF0b3I6IDxPYmplY3Q+IC8vIG9iamVjdCB0aGF0IHByb3ZpZGVzIFVWIGdlbmVyYXRvciBmdW5jdGlvbnNcbiAqXG4gKiB9XG4gKi9cblxuLy8gRXh0cnVkZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIEV4dHJ1ZGVHZW9tZXRyeSggc2hhcGVzLCBvcHRpb25zICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnRXh0cnVkZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0c2hhcGVzOiBzaGFwZXMsXG5cdFx0b3B0aW9uczogb3B0aW9uc1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgRXh0cnVkZUJ1ZmZlckdlb21ldHJ5KCBzaGFwZXMsIG9wdGlvbnMgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5FeHRydWRlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5FeHRydWRlR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRXh0cnVkZUdlb21ldHJ5O1xuXG4vLyBFeHRydWRlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gRXh0cnVkZUJ1ZmZlckdlb21ldHJ5KCBzaGFwZXMsIG9wdGlvbnMgKSB7XG5cblx0aWYgKCB0eXBlb2YgKCBzaGFwZXMgKSA9PT0gXCJ1bmRlZmluZWRcIiApIHtcblxuXHRcdHNoYXBlcyA9IFtdO1xuXHRcdHJldHVybjtcblxuXHR9XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdFeHRydWRlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHNoYXBlcyA9IEFycmF5LmlzQXJyYXkoIHNoYXBlcyApID8gc2hhcGVzIDogWyBzaGFwZXMgXTtcblxuXHR0aGlzLmFkZFNoYXBlTGlzdCggc2hhcGVzLCBvcHRpb25zICk7XG5cblx0dGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xuXG5cdC8vIGNhbid0IHJlYWxseSB1c2UgYXV0b21hdGljIHZlcnRleCBub3JtYWxzXG5cdC8vIGFzIHRoZW4gZnJvbnQgYW5kIGJhY2sgc2lkZXMgZ2V0IHNtb290aGVkIHRvb1xuXHQvLyBzaG91bGQgZG8gc2VwYXJhdGUgc21vb3RoaW5nIGp1c3QgZm9yIHNpZGVzXG5cblx0Ly90aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7XG5cblx0Ly9jb25zb2xlLmxvZyggXCJ0b29rXCIsICggRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSApICk7XG5cbn1cblxuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTtcblxuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5nZXRBcnJheXMgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHBvc2l0aW9uQXR0cmlidXRlID0gdGhpcy5nZXRBdHRyaWJ1dGUoIFwicG9zaXRpb25cIiApO1xuXHR2YXIgdmVydGljZXNBcnJheSA9IHBvc2l0aW9uQXR0cmlidXRlID8gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIHBvc2l0aW9uQXR0cmlidXRlLmFycmF5ICkgOiBbXTtcblxuXHR2YXIgdXZBdHRyaWJ1dGUgPSB0aGlzLmdldEF0dHJpYnV0ZSggXCJ1dlwiICk7XG5cdHZhciB1dkFycmF5ID0gdXZBdHRyaWJ1dGUgPyBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggdXZBdHRyaWJ1dGUuYXJyYXkgKSA6IFtdO1xuXG5cdHZhciBJbmRleEF0dHJpYnV0ZSA9IHRoaXMuaW5kZXg7XG5cdHZhciBpbmRpY2VzQXJyYXkgPSBJbmRleEF0dHJpYnV0ZSA/IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBJbmRleEF0dHJpYnV0ZS5hcnJheSApIDogW107XG5cblx0cmV0dXJuIHtcblx0XHRwb3NpdGlvbjogdmVydGljZXNBcnJheSxcblx0XHR1djogdXZBcnJheSxcblx0XHRpbmRleDogaW5kaWNlc0FycmF5XG5cdH07XG5cbn07XG5cbkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuYWRkU2hhcGVMaXN0ID0gZnVuY3Rpb24gKCBzaGFwZXMsIG9wdGlvbnMgKSB7XG5cblx0dmFyIHNsID0gc2hhcGVzLmxlbmd0aDtcblx0b3B0aW9ucy5hcnJheXMgPSB0aGlzLmdldEFycmF5cygpO1xuXG5cdGZvciAoIHZhciBzID0gMDsgcyA8IHNsOyBzICsrICkge1xuXG5cdFx0dmFyIHNoYXBlID0gc2hhcGVzWyBzIF07XG5cdFx0dGhpcy5hZGRTaGFwZSggc2hhcGUsIG9wdGlvbnMgKTtcblxuXHR9XG5cblx0dGhpcy5zZXRJbmRleCggb3B0aW9ucy5hcnJheXMuaW5kZXggKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBvcHRpb25zLmFycmF5cy5wb3NpdGlvbiwgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggb3B0aW9ucy5hcnJheXMudXYsIDIgKSApO1xuXG59O1xuXG5FeHRydWRlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmFkZFNoYXBlID0gZnVuY3Rpb24gKCBzaGFwZSwgb3B0aW9ucyApIHtcblxuXHR2YXIgYXJyYXlzID0gb3B0aW9ucy5hcnJheXMgPyBvcHRpb25zLmFycmF5cyA6IHRoaXMuZ2V0QXJyYXlzKCk7XG5cdHZhciB2ZXJ0aWNlc0FycmF5ID0gYXJyYXlzLnBvc2l0aW9uO1xuXHR2YXIgaW5kaWNlc0FycmF5ID0gYXJyYXlzLmluZGV4O1xuXHR2YXIgdXZBcnJheSA9IGFycmF5cy51djtcblxuXHR2YXIgcGxhY2Vob2xkZXIgPSBbXTtcblxuXG5cdHZhciBhbW91bnQgPSBvcHRpb25zLmFtb3VudCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5hbW91bnQgOiAxMDA7XG5cblx0dmFyIGJldmVsVGhpY2tuZXNzID0gb3B0aW9ucy5iZXZlbFRoaWNrbmVzcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5iZXZlbFRoaWNrbmVzcyA6IDY7IC8vIDEwXG5cdHZhciBiZXZlbFNpemUgPSBvcHRpb25zLmJldmVsU2l6ZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5iZXZlbFNpemUgOiBiZXZlbFRoaWNrbmVzcyAtIDI7IC8vIDhcblx0dmFyIGJldmVsU2VnbWVudHMgPSBvcHRpb25zLmJldmVsU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxTZWdtZW50cyA6IDM7XG5cblx0dmFyIGJldmVsRW5hYmxlZCA9IG9wdGlvbnMuYmV2ZWxFbmFibGVkICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsRW5hYmxlZCA6IHRydWU7IC8vIGZhbHNlXG5cblx0dmFyIGN1cnZlU2VnbWVudHMgPSBvcHRpb25zLmN1cnZlU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY3VydmVTZWdtZW50cyA6IDEyO1xuXG5cdHZhciBzdGVwcyA9IG9wdGlvbnMuc3RlcHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc3RlcHMgOiAxO1xuXG5cdHZhciBleHRydWRlUGF0aCA9IG9wdGlvbnMuZXh0cnVkZVBhdGg7XG5cdHZhciBleHRydWRlUHRzLCBleHRydWRlQnlQYXRoID0gZmFsc2U7XG5cblx0Ly8gVXNlIGRlZmF1bHQgV29ybGRVVkdlbmVyYXRvciBpZiBubyBVViBnZW5lcmF0b3JzIGFyZSBzcGVjaWZpZWQuXG5cdHZhciB1dmdlbiA9IG9wdGlvbnMuVVZHZW5lcmF0b3IgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuVVZHZW5lcmF0b3IgOiBFeHRydWRlR2VvbWV0cnkuV29ybGRVVkdlbmVyYXRvcjtcblxuXHR2YXIgc3BsaW5lVHViZSwgYmlub3JtYWwsIG5vcm1hbCwgcG9zaXRpb24yO1xuXHRpZiAoIGV4dHJ1ZGVQYXRoICkge1xuXG5cdFx0ZXh0cnVkZVB0cyA9IGV4dHJ1ZGVQYXRoLmdldFNwYWNlZFBvaW50cyggc3RlcHMgKTtcblxuXHRcdGV4dHJ1ZGVCeVBhdGggPSB0cnVlO1xuXHRcdGJldmVsRW5hYmxlZCA9IGZhbHNlOyAvLyBiZXZlbHMgbm90IHN1cHBvcnRlZCBmb3IgcGF0aCBleHRydXNpb25cblxuXHRcdC8vIFNFVFVQIFROQiB2YXJpYWJsZXNcblxuXHRcdC8vIFRPRE8xIC0gaGF2ZSBhIC5pc0Nsb3NlZCBpbiBzcGxpbmU/XG5cblx0XHRzcGxpbmVUdWJlID0gb3B0aW9ucy5mcmFtZXMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZnJhbWVzIDogZXh0cnVkZVBhdGguY29tcHV0ZUZyZW5ldEZyYW1lcyggc3RlcHMsIGZhbHNlICk7XG5cblx0XHQvLyBjb25zb2xlLmxvZyhzcGxpbmVUdWJlLCAnc3BsaW5lVHViZScsIHNwbGluZVR1YmUubm9ybWFscy5sZW5ndGgsICdzdGVwcycsIHN0ZXBzLCAnZXh0cnVkZVB0cycsIGV4dHJ1ZGVQdHMubGVuZ3RoKTtcblxuXHRcdGJpbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0XHRub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHBvc2l0aW9uMiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0fVxuXG5cdC8vIFNhZmVndWFyZHMgaWYgYmV2ZWxzIGFyZSBub3QgZW5hYmxlZFxuXG5cdGlmICggISBiZXZlbEVuYWJsZWQgKSB7XG5cblx0XHRiZXZlbFNlZ21lbnRzID0gMDtcblx0XHRiZXZlbFRoaWNrbmVzcyA9IDA7XG5cdFx0YmV2ZWxTaXplID0gMDtcblxuXHR9XG5cblx0Ly8gVmFyaWFibGVzIGluaXRpYWxpemF0aW9uXG5cblx0dmFyIGFob2xlLCBoLCBobDsgLy8gbG9vcGluZyBvZiBob2xlc1xuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdHZhciBzaGFwZVBvaW50cyA9IHNoYXBlLmV4dHJhY3RQb2ludHMoIGN1cnZlU2VnbWVudHMgKTtcblxuXHR2YXIgdmVydGljZXMgPSBzaGFwZVBvaW50cy5zaGFwZTtcblx0dmFyIGhvbGVzID0gc2hhcGVQb2ludHMuaG9sZXM7XG5cblx0dmFyIHJldmVyc2UgPSAhIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIHZlcnRpY2VzICk7XG5cblx0aWYgKCByZXZlcnNlICkge1xuXG5cdFx0dmVydGljZXMgPSB2ZXJ0aWNlcy5yZXZlcnNlKCk7XG5cblx0XHQvLyBNYXliZSB3ZSBzaG91bGQgYWxzbyBjaGVjayBpZiBob2xlcyBhcmUgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiwganVzdCB0byBiZSBzYWZlIC4uLlxuXG5cdFx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdGFob2xlID0gaG9sZXNbIGggXTtcblxuXHRcdFx0aWYgKCBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCBhaG9sZSApICkge1xuXG5cdFx0XHRcdGhvbGVzWyBoIF0gPSBhaG9sZS5yZXZlcnNlKCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldmVyc2UgPSBmYWxzZTsgLy8gSWYgdmVydGljZXMgYXJlIGluIG9yZGVyIG5vdywgd2Ugc2hvdWxkbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhlbSBhZ2FpbiAoaG9wZWZ1bGx5KSFcblxuXHR9XG5cblxuXHR2YXIgZmFjZXMgPSBTaGFwZVV0aWxzLnRyaWFuZ3VsYXRlU2hhcGUoIHZlcnRpY2VzLCBob2xlcyApO1xuXG5cdC8qIFZlcnRpY2VzICovXG5cblx0dmFyIGNvbnRvdXIgPSB2ZXJ0aWNlczsgLy8gdmVydGljZXMgaGFzIGFsbCBwb2ludHMgYnV0IGNvbnRvdXIgaGFzIG9ubHkgcG9pbnRzIG9mIGNpcmN1bWZlcmVuY2VcblxuXHRmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdGFob2xlID0gaG9sZXNbIGggXTtcblxuXHRcdHZlcnRpY2VzID0gdmVydGljZXMuY29uY2F0KCBhaG9sZSApO1xuXG5cdH1cblxuXG5cdGZ1bmN0aW9uIHNjYWxlUHQyKCBwdCwgdmVjLCBzaXplICkge1xuXG5cdFx0aWYgKCAhIHZlYyApIGNvbnNvbGUuZXJyb3IoIFwiVEhSRUUuRXh0cnVkZUdlb21ldHJ5OiB2ZWMgZG9lcyBub3QgZXhpc3RcIiApO1xuXG5cdFx0cmV0dXJuIHZlYy5jbG9uZSgpLm11bHRpcGx5U2NhbGFyKCBzaXplICkuYWRkKCBwdCApO1xuXG5cdH1cblxuXHR2YXIgYiwgYnMsIHQsIHosXG5cdFx0dmVydCwgdmxlbiA9IHZlcnRpY2VzLmxlbmd0aCxcblx0XHRmYWNlLCBmbGVuID0gZmFjZXMubGVuZ3RoO1xuXG5cblx0Ly8gRmluZCBkaXJlY3Rpb25zIGZvciBwb2ludCBtb3ZlbWVudFxuXG5cblx0ZnVuY3Rpb24gZ2V0QmV2ZWxWZWMoIGluUHQsIGluUHJldiwgaW5OZXh0ICkge1xuXG5cdFx0Ly8gY29tcHV0ZXMgZm9yIGluUHQgdGhlIGNvcnJlc3BvbmRpbmcgcG9pbnQgaW5QdCcgb24gYSBuZXcgY29udG91clxuXHRcdC8vICAgc2hpZnRlZCBieSAxIHVuaXQgKGxlbmd0aCBvZiBub3JtYWxpemVkIHZlY3RvcikgdG8gdGhlIGxlZnRcblx0XHQvLyBpZiB3ZSB3YWxrIGFsb25nIGNvbnRvdXIgY2xvY2t3aXNlLCB0aGlzIG5ldyBjb250b3VyIGlzIG91dHNpZGUgdGhlIG9sZCBvbmVcblx0XHQvL1xuXHRcdC8vIGluUHQnIGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBsaW5lcyBwYXJhbGxlbCB0byB0aGUgdHdvXG5cdFx0Ly8gIGFkamFjZW50IGVkZ2VzIG9mIGluUHQgYXQgYSBkaXN0YW5jZSBvZiAxIHVuaXQgb24gdGhlIGxlZnQgc2lkZS5cblxuXHRcdHZhciB2X3RyYW5zX3gsIHZfdHJhbnNfeSwgc2hyaW5rX2J5ID0gMTsgLy8gcmVzdWx0aW5nIHRyYW5zbGF0aW9uIHZlY3RvciBmb3IgaW5QdFxuXG5cdFx0Ly8gZ29vZCByZWFkaW5nIGZvciBnZW9tZXRyeSBhbGdvcml0aG1zIChoZXJlOiBsaW5lLWxpbmUgaW50ZXJzZWN0aW9uKVxuXHRcdC8vIGh0dHA6Ly9nZW9tYWxnb3JpdGhtcy5jb20vYTA1LV9pbnRlcnNlY3QtMS5odG1sXG5cblx0XHR2YXIgdl9wcmV2X3ggPSBpblB0LnggLSBpblByZXYueCxcblx0XHRcdHZfcHJldl95ID0gaW5QdC55IC0gaW5QcmV2Lnk7XG5cdFx0dmFyIHZfbmV4dF94ID0gaW5OZXh0LnggLSBpblB0LngsXG5cdFx0XHR2X25leHRfeSA9IGluTmV4dC55IC0gaW5QdC55O1xuXG5cdFx0dmFyIHZfcHJldl9sZW5zcSA9ICggdl9wcmV2X3ggKiB2X3ByZXZfeCArIHZfcHJldl95ICogdl9wcmV2X3kgKTtcblxuXHRcdC8vIGNoZWNrIGZvciBjb2xsaW5lYXIgZWRnZXNcblx0XHR2YXIgY29sbGluZWFyMCA9ICggdl9wcmV2X3ggKiB2X25leHRfeSAtIHZfcHJldl95ICogdl9uZXh0X3ggKTtcblxuXHRcdGlmICggTWF0aC5hYnMoIGNvbGxpbmVhcjAgKSA+IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHQvLyBub3QgY29sbGluZWFyXG5cblx0XHRcdC8vIGxlbmd0aCBvZiB2ZWN0b3JzIGZvciBub3JtYWxpemluZ1xuXG5cdFx0XHR2YXIgdl9wcmV2X2xlbiA9IE1hdGguc3FydCggdl9wcmV2X2xlbnNxICk7XG5cdFx0XHR2YXIgdl9uZXh0X2xlbiA9IE1hdGguc3FydCggdl9uZXh0X3ggKiB2X25leHRfeCArIHZfbmV4dF95ICogdl9uZXh0X3kgKTtcblxuXHRcdFx0Ly8gc2hpZnQgYWRqYWNlbnQgcG9pbnRzIGJ5IHVuaXQgdmVjdG9ycyB0byB0aGUgbGVmdFxuXG5cdFx0XHR2YXIgcHRQcmV2U2hpZnRfeCA9ICggaW5QcmV2LnggLSB2X3ByZXZfeSAvIHZfcHJldl9sZW4gKTtcblx0XHRcdHZhciBwdFByZXZTaGlmdF95ID0gKCBpblByZXYueSArIHZfcHJldl94IC8gdl9wcmV2X2xlbiApO1xuXG5cdFx0XHR2YXIgcHROZXh0U2hpZnRfeCA9ICggaW5OZXh0LnggLSB2X25leHRfeSAvIHZfbmV4dF9sZW4gKTtcblx0XHRcdHZhciBwdE5leHRTaGlmdF95ID0gKCBpbk5leHQueSArIHZfbmV4dF94IC8gdl9uZXh0X2xlbiApO1xuXG5cdFx0XHQvLyBzY2FsaW5nIGZhY3RvciBmb3Igdl9wcmV2IHRvIGludGVyc2VjdGlvbiBwb2ludFxuXG5cdFx0XHR2YXIgc2YgPSAoICggcHROZXh0U2hpZnRfeCAtIHB0UHJldlNoaWZ0X3ggKSAqIHZfbmV4dF95IC1cblx0XHRcdFx0XHQoIHB0TmV4dFNoaWZ0X3kgLSBwdFByZXZTaGlmdF95ICkgKiB2X25leHRfeCApIC9cblx0XHRcdFx0KCB2X3ByZXZfeCAqIHZfbmV4dF95IC0gdl9wcmV2X3kgKiB2X25leHRfeCApO1xuXG5cdFx0XHQvLyB2ZWN0b3IgZnJvbSBpblB0IHRvIGludGVyc2VjdGlvbiBwb2ludFxuXG5cdFx0XHR2X3RyYW5zX3ggPSAoIHB0UHJldlNoaWZ0X3ggKyB2X3ByZXZfeCAqIHNmIC0gaW5QdC54ICk7XG5cdFx0XHR2X3RyYW5zX3kgPSAoIHB0UHJldlNoaWZ0X3kgKyB2X3ByZXZfeSAqIHNmIC0gaW5QdC55ICk7XG5cblx0XHRcdC8vIERvbid0IG5vcm1hbGl6ZSEsIG90aGVyd2lzZSBzaGFycCBjb3JuZXJzIGJlY29tZSB1Z2x5XG5cdFx0XHQvLyAgYnV0IHByZXZlbnQgY3Jhenkgc3Bpa2VzXG5cdFx0XHR2YXIgdl90cmFuc19sZW5zcSA9ICggdl90cmFuc194ICogdl90cmFuc194ICsgdl90cmFuc195ICogdl90cmFuc195ICk7XG5cdFx0XHRpZiAoIHZfdHJhbnNfbGVuc3EgPD0gMiApIHtcblxuXHRcdFx0XHRyZXR1cm4gbmV3IFZlY3RvcjIoIHZfdHJhbnNfeCwgdl90cmFuc195ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0c2hyaW5rX2J5ID0gTWF0aC5zcXJ0KCB2X3RyYW5zX2xlbnNxIC8gMiApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIGNvbGxpbmVhciBlZGdlc1xuXG5cdFx0XHR2YXIgZGlyZWN0aW9uX2VxID0gZmFsc2U7IC8vIGFzc3VtZXM6IG9wcG9zaXRlXG5cdFx0XHRpZiAoIHZfcHJldl94ID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0aWYgKCB2X25leHRfeCA+IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdFx0ZGlyZWN0aW9uX2VxID0gdHJ1ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0aWYgKCB2X3ByZXZfeCA8IC0gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0XHRpZiAoIHZfbmV4dF94IDwgLSBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uX2VxID0gdHJ1ZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aWYgKCBNYXRoLnNpZ24oIHZfcHJldl95ICkgPT09IE1hdGguc2lnbiggdl9uZXh0X3kgKSApIHtcblxuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uX2VxID0gdHJ1ZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBkaXJlY3Rpb25fZXEgKSB7XG5cblx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJXYXJuaW5nOiBsaW5lcyBhcmUgYSBzdHJhaWdodCBzZXF1ZW5jZVwiKTtcblx0XHRcdFx0dl90cmFuc194ID0gLSB2X3ByZXZfeTtcblx0XHRcdFx0dl90cmFuc195ID0gdl9wcmV2X3g7XG5cdFx0XHRcdHNocmlua19ieSA9IE1hdGguc3FydCggdl9wcmV2X2xlbnNxICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJXYXJuaW5nOiBsaW5lcyBhcmUgYSBzdHJhaWdodCBzcGlrZVwiKTtcblx0XHRcdFx0dl90cmFuc194ID0gdl9wcmV2X3g7XG5cdFx0XHRcdHZfdHJhbnNfeSA9IHZfcHJldl95O1xuXHRcdFx0XHRzaHJpbmtfYnkgPSBNYXRoLnNxcnQoIHZfcHJldl9sZW5zcSAvIDIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBWZWN0b3IyKCB2X3RyYW5zX3ggLyBzaHJpbmtfYnksIHZfdHJhbnNfeSAvIHNocmlua19ieSApO1xuXG5cdH1cblxuXG5cdHZhciBjb250b3VyTW92ZW1lbnRzID0gW107XG5cblx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGNvbnRvdXIubGVuZ3RoLCBqID0gaWwgLSAxLCBrID0gaSArIDE7IGkgPCBpbDsgaSArKywgaiArKywgayArKyApIHtcblxuXHRcdGlmICggaiA9PT0gaWwgKSBqID0gMDtcblx0XHRpZiAoIGsgPT09IGlsICkgayA9IDA7XG5cblx0XHQvLyAgKGopLS0tKGkpLS0tKGspXG5cdFx0Ly8gY29uc29sZS5sb2coJ2ksaixrJywgaSwgaiAsIGspXG5cblx0XHRjb250b3VyTW92ZW1lbnRzWyBpIF0gPSBnZXRCZXZlbFZlYyggY29udG91clsgaSBdLCBjb250b3VyWyBqIF0sIGNvbnRvdXJbIGsgXSApO1xuXG5cdH1cblxuXHR2YXIgaG9sZXNNb3ZlbWVudHMgPSBbXSxcblx0XHRvbmVIb2xlTW92ZW1lbnRzLCB2ZXJ0aWNlc01vdmVtZW50cyA9IGNvbnRvdXJNb3ZlbWVudHMuY29uY2F0KCk7XG5cblx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRhaG9sZSA9IGhvbGVzWyBoIF07XG5cblx0XHRvbmVIb2xlTW92ZW1lbnRzID0gW107XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBhaG9sZS5sZW5ndGgsIGogPSBpbCAtIDEsIGsgPSBpICsgMTsgaSA8IGlsOyBpICsrLCBqICsrLCBrICsrICkge1xuXG5cdFx0XHRpZiAoIGogPT09IGlsICkgaiA9IDA7XG5cdFx0XHRpZiAoIGsgPT09IGlsICkgayA9IDA7XG5cblx0XHRcdC8vICAoaiktLS0oaSktLS0oaylcblx0XHRcdG9uZUhvbGVNb3ZlbWVudHNbIGkgXSA9IGdldEJldmVsVmVjKCBhaG9sZVsgaSBdLCBhaG9sZVsgaiBdLCBhaG9sZVsgayBdICk7XG5cblx0XHR9XG5cblx0XHRob2xlc01vdmVtZW50cy5wdXNoKCBvbmVIb2xlTW92ZW1lbnRzICk7XG5cdFx0dmVydGljZXNNb3ZlbWVudHMgPSB2ZXJ0aWNlc01vdmVtZW50cy5jb25jYXQoIG9uZUhvbGVNb3ZlbWVudHMgKTtcblxuXHR9XG5cblxuXHQvLyBMb29wIGJldmVsU2VnbWVudHMsIDEgZm9yIHRoZSBmcm9udCwgMSBmb3IgdGhlIGJhY2tcblxuXHRmb3IgKCBiID0gMDsgYiA8IGJldmVsU2VnbWVudHM7IGIgKysgKSB7XG5cblx0XHQvL2ZvciAoIGIgPSBiZXZlbFNlZ21lbnRzOyBiID4gMDsgYiAtLSApIHtcblxuXHRcdHQgPSBiIC8gYmV2ZWxTZWdtZW50cztcblx0XHR6ID0gYmV2ZWxUaGlja25lc3MgKiBNYXRoLmNvcyggdCAqIE1hdGguUEkgLyAyICk7XG5cdFx0YnMgPSBiZXZlbFNpemUgKiBNYXRoLnNpbiggdCAqIE1hdGguUEkgLyAyICk7XG5cblx0XHQvLyBjb250cmFjdCBzaGFwZVxuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gY29udG91ci5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmVydCA9IHNjYWxlUHQyKCBjb250b3VyWyBpIF0sIGNvbnRvdXJNb3ZlbWVudHNbIGkgXSwgYnMgKTtcblxuXHRcdFx0diggdmVydC54LCB2ZXJ0LnksIC0geiApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZXhwYW5kIGhvbGVzXG5cblx0XHRmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0YWhvbGUgPSBob2xlc1sgaCBdO1xuXHRcdFx0b25lSG9sZU1vdmVtZW50cyA9IGhvbGVzTW92ZW1lbnRzWyBoIF07XG5cblx0XHRcdGZvciAoIGkgPSAwLCBpbCA9IGFob2xlLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdHZlcnQgPSBzY2FsZVB0MiggYWhvbGVbIGkgXSwgb25lSG9sZU1vdmVtZW50c1sgaSBdLCBicyApO1xuXG5cdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCAtIHogKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRicyA9IGJldmVsU2l6ZTtcblxuXHQvLyBCYWNrIGZhY2luZyB2ZXJ0aWNlc1xuXG5cdGZvciAoIGkgPSAwOyBpIDwgdmxlbjsgaSArKyApIHtcblxuXHRcdHZlcnQgPSBiZXZlbEVuYWJsZWQgPyBzY2FsZVB0MiggdmVydGljZXNbIGkgXSwgdmVydGljZXNNb3ZlbWVudHNbIGkgXSwgYnMgKSA6IHZlcnRpY2VzWyBpIF07XG5cblx0XHRpZiAoICEgZXh0cnVkZUJ5UGF0aCApIHtcblxuXHRcdFx0diggdmVydC54LCB2ZXJ0LnksIDAgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIHYoIHZlcnQueCwgdmVydC55ICsgZXh0cnVkZVB0c1sgMCBdLnksIGV4dHJ1ZGVQdHNbIDAgXS54ICk7XG5cblx0XHRcdG5vcm1hbC5jb3B5KCBzcGxpbmVUdWJlLm5vcm1hbHNbIDAgXSApLm11bHRpcGx5U2NhbGFyKCB2ZXJ0LnggKTtcblx0XHRcdGJpbm9ybWFsLmNvcHkoIHNwbGluZVR1YmUuYmlub3JtYWxzWyAwIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC55ICk7XG5cblx0XHRcdHBvc2l0aW9uMi5jb3B5KCBleHRydWRlUHRzWyAwIF0gKS5hZGQoIG5vcm1hbCApLmFkZCggYmlub3JtYWwgKTtcblxuXHRcdFx0diggcG9zaXRpb24yLngsIHBvc2l0aW9uMi55LCBwb3NpdGlvbjIueiApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBBZGQgc3RlcHBlZCB2ZXJ0aWNlcy4uLlxuXHQvLyBJbmNsdWRpbmcgZnJvbnQgZmFjaW5nIHZlcnRpY2VzXG5cblx0dmFyIHM7XG5cblx0Zm9yICggcyA9IDE7IHMgPD0gc3RlcHM7IHMgKysgKSB7XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IHZsZW47IGkgKysgKSB7XG5cblx0XHRcdHZlcnQgPSBiZXZlbEVuYWJsZWQgPyBzY2FsZVB0MiggdmVydGljZXNbIGkgXSwgdmVydGljZXNNb3ZlbWVudHNbIGkgXSwgYnMgKSA6IHZlcnRpY2VzWyBpIF07XG5cblx0XHRcdGlmICggISBleHRydWRlQnlQYXRoICkge1xuXG5cdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCBhbW91bnQgLyBzdGVwcyAqIHMgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyB2KCB2ZXJ0LngsIHZlcnQueSArIGV4dHJ1ZGVQdHNbIHMgLSAxIF0ueSwgZXh0cnVkZVB0c1sgcyAtIDEgXS54ICk7XG5cblx0XHRcdFx0bm9ybWFsLmNvcHkoIHNwbGluZVR1YmUubm9ybWFsc1sgcyBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQueCApO1xuXHRcdFx0XHRiaW5vcm1hbC5jb3B5KCBzcGxpbmVUdWJlLmJpbm9ybWFsc1sgcyBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQueSApO1xuXG5cdFx0XHRcdHBvc2l0aW9uMi5jb3B5KCBleHRydWRlUHRzWyBzIF0gKS5hZGQoIG5vcm1hbCApLmFkZCggYmlub3JtYWwgKTtcblxuXHRcdFx0XHR2KCBwb3NpdGlvbjIueCwgcG9zaXRpb24yLnksIHBvc2l0aW9uMi56ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblxuXHQvLyBBZGQgYmV2ZWwgc2VnbWVudHMgcGxhbmVzXG5cblx0Ly9mb3IgKCBiID0gMTsgYiA8PSBiZXZlbFNlZ21lbnRzOyBiICsrICkge1xuXHRmb3IgKCBiID0gYmV2ZWxTZWdtZW50cyAtIDE7IGIgPj0gMDsgYiAtLSApIHtcblxuXHRcdHQgPSBiIC8gYmV2ZWxTZWdtZW50cztcblx0XHR6ID0gYmV2ZWxUaGlja25lc3MgKiBNYXRoLmNvcyggdCAqIE1hdGguUEkgLyAyICk7XG5cdFx0YnMgPSBiZXZlbFNpemUgKiBNYXRoLnNpbiggdCAqIE1hdGguUEkgLyAyICk7XG5cblx0XHQvLyBjb250cmFjdCBzaGFwZVxuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gY29udG91ci5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmVydCA9IHNjYWxlUHQyKCBjb250b3VyWyBpIF0sIGNvbnRvdXJNb3ZlbWVudHNbIGkgXSwgYnMgKTtcblx0XHRcdHYoIHZlcnQueCwgdmVydC55LCBhbW91bnQgKyB6ICk7XG5cblx0XHR9XG5cblx0XHQvLyBleHBhbmQgaG9sZXNcblxuXHRcdGZvciAoIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkge1xuXG5cdFx0XHRhaG9sZSA9IGhvbGVzWyBoIF07XG5cdFx0XHRvbmVIb2xlTW92ZW1lbnRzID0gaG9sZXNNb3ZlbWVudHNbIGggXTtcblxuXHRcdFx0Zm9yICggaSA9IDAsIGlsID0gYWhvbGUubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmVydCA9IHNjYWxlUHQyKCBhaG9sZVsgaSBdLCBvbmVIb2xlTW92ZW1lbnRzWyBpIF0sIGJzICk7XG5cblx0XHRcdFx0aWYgKCAhIGV4dHJ1ZGVCeVBhdGggKSB7XG5cblx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgYW1vdW50ICsgeiApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSArIGV4dHJ1ZGVQdHNbIHN0ZXBzIC0gMSBdLnksIGV4dHJ1ZGVQdHNbIHN0ZXBzIC0gMSBdLnggKyB6ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdC8qIEZhY2VzICovXG5cblx0Ly8gVG9wIGFuZCBib3R0b20gZmFjZXNcblxuXHRidWlsZExpZEZhY2VzKCk7XG5cblx0Ly8gU2lkZXMgZmFjZXNcblxuXHRidWlsZFNpZGVGYWNlcygpO1xuXG5cblx0Ly8vLy8gIEludGVybmFsIGZ1bmN0aW9uc1xuXG5cdGZ1bmN0aW9uIGJ1aWxkTGlkRmFjZXMoKSB7XG5cblx0XHR2YXIgc3RhcnQgPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aC8zO1xuXG5cdFx0aWYgKCBiZXZlbEVuYWJsZWQgKSB7XG5cblx0XHRcdHZhciBsYXllciA9IDA7IC8vIHN0ZXBzICsgMVxuXHRcdFx0dmFyIG9mZnNldCA9IHZsZW4gKiBsYXllcjtcblxuXHRcdFx0Ly8gQm90dG9tIGZhY2VzXG5cblx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHtcblxuXHRcdFx0XHRmYWNlID0gZmFjZXNbIGkgXTtcblx0XHRcdFx0ZjMoIGZhY2VbIDIgXSArIG9mZnNldCwgZmFjZVsgMSBdICsgb2Zmc2V0LCBmYWNlWyAwIF0gKyBvZmZzZXQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRsYXllciA9IHN0ZXBzICsgYmV2ZWxTZWdtZW50cyAqIDI7XG5cdFx0XHRvZmZzZXQgPSB2bGVuICogbGF5ZXI7XG5cblx0XHRcdC8vIFRvcCBmYWNlc1xuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0ZmFjZSA9IGZhY2VzWyBpIF07XG5cdFx0XHRcdGYzKCBmYWNlWyAwIF0gKyBvZmZzZXQsIGZhY2VbIDEgXSArIG9mZnNldCwgZmFjZVsgMiBdICsgb2Zmc2V0ICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIEJvdHRvbSBmYWNlc1xuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0ZmFjZSA9IGZhY2VzWyBpIF07XG5cdFx0XHRcdGYzKCBmYWNlWyAyIF0sIGZhY2VbIDEgXSwgZmFjZVsgMCBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gVG9wIGZhY2VzXG5cblx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHtcblxuXHRcdFx0XHRmYWNlID0gZmFjZXNbIGkgXTtcblx0XHRcdFx0ZjMoIGZhY2VbIDAgXSArIHZsZW4gKiBzdGVwcywgZmFjZVsgMSBdICsgdmxlbiAqIHN0ZXBzLCBmYWNlWyAyIF0gKyB2bGVuICogc3RlcHMgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0c2NvcGUuYWRkR3JvdXAoIHN0YXJ0LCB2ZXJ0aWNlc0FycmF5Lmxlbmd0aC8zIC1zdGFydCwgb3B0aW9ucy5tYXRlcmlhbCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5tYXRlcmlhbCA6IDApO1xuXG5cdH1cblxuXHQvLyBDcmVhdGUgZmFjZXMgZm9yIHRoZSB6LXNpZGVzIG9mIHRoZSBzaGFwZVxuXG5cdGZ1bmN0aW9uIGJ1aWxkU2lkZUZhY2VzKCkge1xuXG5cdFx0dmFyIHN0YXJ0ID0gdmVydGljZXNBcnJheS5sZW5ndGgvMztcblx0XHR2YXIgbGF5ZXJvZmZzZXQgPSAwO1xuXHRcdHNpZGV3YWxscyggY29udG91ciwgbGF5ZXJvZmZzZXQgKTtcblx0XHRsYXllcm9mZnNldCArPSBjb250b3VyLmxlbmd0aDtcblxuXHRcdGZvciAoIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkge1xuXG5cdFx0XHRhaG9sZSA9IGhvbGVzWyBoIF07XG5cdFx0XHRzaWRld2FsbHMoIGFob2xlLCBsYXllcm9mZnNldCApO1xuXG5cdFx0XHQvLywgdHJ1ZVxuXHRcdFx0bGF5ZXJvZmZzZXQgKz0gYWhvbGUubGVuZ3RoO1xuXG5cdFx0fVxuXG5cblx0XHRzY29wZS5hZGRHcm91cCggc3RhcnQsIHZlcnRpY2VzQXJyYXkubGVuZ3RoLzMgLXN0YXJ0LCBvcHRpb25zLmV4dHJ1ZGVNYXRlcmlhbCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5leHRydWRlTWF0ZXJpYWwgOiAxKTtcblxuXG5cdH1cblxuXHRmdW5jdGlvbiBzaWRld2FsbHMoIGNvbnRvdXIsIGxheWVyb2Zmc2V0ICkge1xuXG5cdFx0dmFyIGosIGs7XG5cdFx0aSA9IGNvbnRvdXIubGVuZ3RoO1xuXG5cdFx0d2hpbGUgKCAtLSBpID49IDAgKSB7XG5cblx0XHRcdGogPSBpO1xuXHRcdFx0ayA9IGkgLSAxO1xuXHRcdFx0aWYgKCBrIDwgMCApIGsgPSBjb250b3VyLmxlbmd0aCAtIDE7XG5cblx0XHRcdC8vY29uc29sZS5sb2coJ2InLCBpLGosIGktMSwgayx2ZXJ0aWNlcy5sZW5ndGgpO1xuXG5cdFx0XHR2YXIgcyA9IDAsXG5cdFx0XHRcdHNsID0gc3RlcHMgKyBiZXZlbFNlZ21lbnRzICogMjtcblxuXHRcdFx0Zm9yICggcyA9IDA7IHMgPCBzbDsgcyArKyApIHtcblxuXHRcdFx0XHR2YXIgc2xlbjEgPSB2bGVuICogcztcblx0XHRcdFx0dmFyIHNsZW4yID0gdmxlbiAqICggcyArIDEgKTtcblxuXHRcdFx0XHR2YXIgYSA9IGxheWVyb2Zmc2V0ICsgaiArIHNsZW4xLFxuXHRcdFx0XHRcdGIgPSBsYXllcm9mZnNldCArIGsgKyBzbGVuMSxcblx0XHRcdFx0XHRjID0gbGF5ZXJvZmZzZXQgKyBrICsgc2xlbjIsXG5cdFx0XHRcdFx0ZCA9IGxheWVyb2Zmc2V0ICsgaiArIHNsZW4yO1xuXG5cdFx0XHRcdGY0KCBhLCBiLCBjLCBkLCBjb250b3VyLCBzLCBzbCwgaiwgayApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHYoIHgsIHksIHogKSB7XG5cblx0XHRwbGFjZWhvbGRlci5wdXNoKCB4ICk7XG5cdFx0cGxhY2Vob2xkZXIucHVzaCggeSApO1xuXHRcdHBsYWNlaG9sZGVyLnB1c2goIHogKTtcblxuXHR9XG5cblxuXHRmdW5jdGlvbiBmMyggYSwgYiwgYyApIHtcblxuXHRcdGFkZFZlcnRleCggYSApO1xuXHRcdGFkZFZlcnRleCggYiApO1xuXHRcdGFkZFZlcnRleCggYyApO1xuXG5cdFx0dmFyIG5leHRJbmRleCA9IHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMztcblx0XHR2YXIgdXZzID0gdXZnZW4uZ2VuZXJhdGVUb3BVViggc2NvcGUsIHZlcnRpY2VzQXJyYXksIG5leHRJbmRleCAtIDMsIG5leHRJbmRleCAtIDIsIG5leHRJbmRleCAtIDEgKTtcblxuXHRcdGFkZFVWKCB1dnNbIDAgXSApO1xuXHRcdGFkZFVWKCB1dnNbIDEgXSApO1xuXHRcdGFkZFVWKCB1dnNbIDIgXSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBmNCggYSwgYiwgYywgZCwgd2FsbENvbnRvdXIsIHN0ZXBJbmRleCwgc3RlcHNMZW5ndGgsIGNvbnRvdXJJbmRleDEsIGNvbnRvdXJJbmRleDIgKSB7XG5cblx0XHRhZGRWZXJ0ZXgoIGEgKTtcblx0XHRhZGRWZXJ0ZXgoIGIgKTtcblx0XHRhZGRWZXJ0ZXgoIGQgKTtcblxuXHRcdGFkZFZlcnRleCggYiApO1xuXHRcdGFkZFZlcnRleCggYyApO1xuXHRcdGFkZFZlcnRleCggZCApO1xuXG5cblx0XHR2YXIgbmV4dEluZGV4ID0gdmVydGljZXNBcnJheS5sZW5ndGggLyAzO1xuXHRcdHZhciB1dnMgPSB1dmdlbi5nZW5lcmF0ZVNpZGVXYWxsVVYoIHNjb3BlLCB2ZXJ0aWNlc0FycmF5LCBuZXh0SW5kZXggLSA2LCBuZXh0SW5kZXggLSAzLCBuZXh0SW5kZXggLSAyLCBuZXh0SW5kZXggLSAxICk7XG5cblx0XHRhZGRVViggdXZzWyAwIF0gKTtcblx0XHRhZGRVViggdXZzWyAxIF0gKTtcblx0XHRhZGRVViggdXZzWyAzIF0gKTtcblxuXHRcdGFkZFVWKCB1dnNbIDEgXSApO1xuXHRcdGFkZFVWKCB1dnNbIDIgXSApO1xuXHRcdGFkZFVWKCB1dnNbIDMgXSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBhZGRWZXJ0ZXgoIGluZGV4ICkge1xuXG5cdFx0aW5kaWNlc0FycmF5LnB1c2goIHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMyApO1xuXHRcdHZlcnRpY2VzQXJyYXkucHVzaCggcGxhY2Vob2xkZXJbIGluZGV4ICogMyArIDAgXSApO1xuXHRcdHZlcnRpY2VzQXJyYXkucHVzaCggcGxhY2Vob2xkZXJbIGluZGV4ICogMyArIDEgXSApO1xuXHRcdHZlcnRpY2VzQXJyYXkucHVzaCggcGxhY2Vob2xkZXJbIGluZGV4ICogMyArIDIgXSApO1xuXG5cdH1cblxuXG5cdGZ1bmN0aW9uIGFkZFVWKCB2ZWN0b3IyICkge1xuXG5cdFx0dXZBcnJheS5wdXNoKCB2ZWN0b3IyLnggKTtcblx0XHR1dkFycmF5LnB1c2goIHZlY3RvcjIueSApO1xuXG5cdH1cblxuXHRpZiAoICEgb3B0aW9ucy5hcnJheXMgKSB7XG5cblx0XHR0aGlzLnNldEluZGV4KCBpbmRpY2VzQXJyYXkgKTtcblx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzQXJyYXksIDMgKSApO1xuXHRcdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggb3B0aW9ucy5hcnJheXMudXYsIDIgKSApO1xuXG5cdH1cblxufTtcblxuRXh0cnVkZUdlb21ldHJ5LldvcmxkVVZHZW5lcmF0b3IgPSB7XG5cblx0Z2VuZXJhdGVUb3BVVjogZnVuY3Rpb24gKCBnZW9tZXRyeSwgdmVydGljZXMsIGluZGV4QSwgaW5kZXhCLCBpbmRleEMgKSB7XG5cblx0XHR2YXIgYV94ID0gdmVydGljZXNbIGluZGV4QSAqIDMgXTtcblx0XHR2YXIgYV95ID0gdmVydGljZXNbIGluZGV4QSAqIDMgKyAxIF07XG5cdFx0dmFyIGJfeCA9IHZlcnRpY2VzWyBpbmRleEIgKiAzIF07XG5cdFx0dmFyIGJfeSA9IHZlcnRpY2VzWyBpbmRleEIgKiAzICsgMSBdO1xuXHRcdHZhciBjX3ggPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyBdO1xuXHRcdHZhciBjX3kgPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyArIDEgXTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHRuZXcgVmVjdG9yMiggYV94LCBhX3kgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBiX3gsIGJfeSApLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGNfeCwgY195IClcblx0XHRdO1xuXG5cdH0sXG5cblx0Z2VuZXJhdGVTaWRlV2FsbFVWOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCB2ZXJ0aWNlcywgaW5kZXhBLCBpbmRleEIsIGluZGV4QywgaW5kZXhEICkge1xuXG5cdFx0dmFyIGFfeCA9IHZlcnRpY2VzWyBpbmRleEEgKiAzIF07XG5cdFx0dmFyIGFfeSA9IHZlcnRpY2VzWyBpbmRleEEgKiAzICsgMSBdO1xuXHRcdHZhciBhX3ogPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyArIDIgXTtcblx0XHR2YXIgYl94ID0gdmVydGljZXNbIGluZGV4QiAqIDMgXTtcblx0XHR2YXIgYl95ID0gdmVydGljZXNbIGluZGV4QiAqIDMgKyAxIF07XG5cdFx0dmFyIGJfeiA9IHZlcnRpY2VzWyBpbmRleEIgKiAzICsgMiBdO1xuXHRcdHZhciBjX3ggPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyBdO1xuXHRcdHZhciBjX3kgPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyArIDEgXTtcblx0XHR2YXIgY196ID0gdmVydGljZXNbIGluZGV4QyAqIDMgKyAyIF07XG5cdFx0dmFyIGRfeCA9IHZlcnRpY2VzWyBpbmRleEQgKiAzIF07XG5cdFx0dmFyIGRfeSA9IHZlcnRpY2VzWyBpbmRleEQgKiAzICsgMSBdO1xuXHRcdHZhciBkX3ogPSB2ZXJ0aWNlc1sgaW5kZXhEICogMyArIDIgXTtcblxuXHRcdGlmICggTWF0aC5hYnMoIGFfeSAtIGJfeSApIDwgMC4wMSApIHtcblxuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGFfeCwgMSAtIGFfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggYl94LCAxIC0gYl96ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBjX3gsIDEgLSBjX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGRfeCwgMSAtIGRfeiApXG5cdFx0XHRdO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGFfeSwgMSAtIGFfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggYl95LCAxIC0gYl96ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBjX3ksIDEgLSBjX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGRfeSwgMSAtIGRfeiApXG5cdFx0XHRdO1xuXG5cdFx0fVxuXG5cdH1cbn07XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBUZXh0ID0gM0QgVGV4dFxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgZm9udDogPFRIUkVFLkZvbnQ+LCAvLyBmb250XG4gKlxuICogIHNpemU6IDxmbG9hdD4sIC8vIHNpemUgb2YgdGhlIHRleHRcbiAqICBoZWlnaHQ6IDxmbG9hdD4sIC8vIHRoaWNrbmVzcyB0byBleHRydWRlIHRleHRcbiAqICBjdXJ2ZVNlZ21lbnRzOiA8aW50PiwgLy8gbnVtYmVyIG9mIHBvaW50cyBvbiB0aGUgY3VydmVzXG4gKlxuICogIGJldmVsRW5hYmxlZDogPGJvb2w+LCAvLyB0dXJuIG9uIGJldmVsXG4gKiAgYmV2ZWxUaGlja25lc3M6IDxmbG9hdD4sIC8vIGhvdyBkZWVwIGludG8gdGV4dCBiZXZlbCBnb2VzXG4gKiAgYmV2ZWxTaXplOiA8ZmxvYXQ+IC8vIGhvdyBmYXIgZnJvbSB0ZXh0IG91dGxpbmUgaXMgYmV2ZWxcbiAqIH1cbiAqL1xuXG4vLyBUZXh0R2VvbWV0cnlcblxuZnVuY3Rpb24gVGV4dEdlb21ldHJ5KCAgdGV4dCwgcGFyYW1ldGVycyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1RleHRHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHRleHQ6IHRleHQsXG5cdFx0cGFyYW1ldGVyczogcGFyYW1ldGVyc1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgVGV4dEJ1ZmZlckdlb21ldHJ5KCB0ZXh0LCBwYXJhbWV0ZXJzICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuVGV4dEdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuVGV4dEdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRleHRHZW9tZXRyeTtcblxuLy8gVGV4dEJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFRleHRCdWZmZXJHZW9tZXRyeSggdGV4dCwgcGFyYW1ldGVycyApIHtcblxuXHRwYXJhbWV0ZXJzID0gcGFyYW1ldGVycyB8fCB7fTtcblxuXHR2YXIgZm9udCA9IHBhcmFtZXRlcnMuZm9udDtcblxuXHRpZiAoICggZm9udCAmJiBmb250LmlzRm9udCApID09PSBmYWxzZSApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5UZXh0R2VvbWV0cnk6IGZvbnQgcGFyYW1ldGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5Gb250LicgKTtcblx0XHRyZXR1cm4gbmV3IEdlb21ldHJ5KCk7XG5cblx0fVxuXG5cdHZhciBzaGFwZXMgPSBmb250LmdlbmVyYXRlU2hhcGVzKCB0ZXh0LCBwYXJhbWV0ZXJzLnNpemUsIHBhcmFtZXRlcnMuY3VydmVTZWdtZW50cyApO1xuXG5cdC8vIHRyYW5zbGF0ZSBwYXJhbWV0ZXJzIHRvIEV4dHJ1ZGVHZW9tZXRyeSBBUElcblxuXHRwYXJhbWV0ZXJzLmFtb3VudCA9IHBhcmFtZXRlcnMuaGVpZ2h0ICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmhlaWdodCA6IDUwO1xuXG5cdC8vIGRlZmF1bHRzXG5cblx0aWYgKCBwYXJhbWV0ZXJzLmJldmVsVGhpY2tuZXNzID09PSB1bmRlZmluZWQgKSBwYXJhbWV0ZXJzLmJldmVsVGhpY2tuZXNzID0gMTA7XG5cdGlmICggcGFyYW1ldGVycy5iZXZlbFNpemUgPT09IHVuZGVmaW5lZCApIHBhcmFtZXRlcnMuYmV2ZWxTaXplID0gODtcblx0aWYgKCBwYXJhbWV0ZXJzLmJldmVsRW5hYmxlZCA9PT0gdW5kZWZpbmVkICkgcGFyYW1ldGVycy5iZXZlbEVuYWJsZWQgPSBmYWxzZTtcblxuXHRFeHRydWRlQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgc2hhcGVzLCBwYXJhbWV0ZXJzICk7XG5cblx0dGhpcy50eXBlID0gJ1RleHRCdWZmZXJHZW9tZXRyeSc7XG5cbn1cblxuVGV4dEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRleHRCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXh0QnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtc1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBTcGhlcmVHZW9tZXRyeVxuXG5mdW5jdGlvbiBTcGhlcmVHZW9tZXRyeSggcmFkaXVzLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTcGhlcmVHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdHBoaVN0YXJ0OiBwaGlTdGFydCxcblx0XHRwaGlMZW5ndGg6IHBoaUxlbmd0aCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgU3BoZXJlQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGgsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuU3BoZXJlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5TcGhlcmVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcGhlcmVHZW9tZXRyeTtcblxuLy8gU3BoZXJlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gU3BoZXJlQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGgsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU3BoZXJlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRwaGlTdGFydDogcGhpU3RhcnQsXG5cdFx0cGhpTGVuZ3RoOiBwaGlMZW5ndGgsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgNTA7XG5cblx0d2lkdGhTZWdtZW50cyA9IE1hdGgubWF4KCAzLCBNYXRoLmZsb29yKCB3aWR0aFNlZ21lbnRzICkgfHwgOCApO1xuXHRoZWlnaHRTZWdtZW50cyA9IE1hdGgubWF4KCAyLCBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApIHx8IDYgKTtcblxuXHRwaGlTdGFydCA9IHBoaVN0YXJ0ICE9PSB1bmRlZmluZWQgPyBwaGlTdGFydCA6IDA7XG5cdHBoaUxlbmd0aCA9IHBoaUxlbmd0aCAhPT0gdW5kZWZpbmVkID8gcGhpTGVuZ3RoIDogTWF0aC5QSSAqIDI7XG5cblx0dGhldGFTdGFydCA9IHRoZXRhU3RhcnQgIT09IHVuZGVmaW5lZCA/IHRoZXRhU3RhcnQgOiAwO1xuXHR0aGV0YUxlbmd0aCA9IHRoZXRhTGVuZ3RoICE9PSB1bmRlZmluZWQgPyB0aGV0YUxlbmd0aCA6IE1hdGguUEk7XG5cblx0dmFyIHRoZXRhRW5kID0gdGhldGFTdGFydCArIHRoZXRhTGVuZ3RoO1xuXG5cdHZhciBpeCwgaXk7XG5cblx0dmFyIGluZGV4ID0gMDtcblx0dmFyIGdyaWQgPSBbXTtcblxuXHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdGZvciAoIGl5ID0gMDsgaXkgPD0gaGVpZ2h0U2VnbWVudHM7IGl5ICsrICkge1xuXG5cdFx0dmFyIHZlcnRpY2VzUm93ID0gW107XG5cblx0XHR2YXIgdiA9IGl5IC8gaGVpZ2h0U2VnbWVudHM7XG5cblx0XHRmb3IgKCBpeCA9IDA7IGl4IDw9IHdpZHRoU2VnbWVudHM7IGl4ICsrICkge1xuXG5cdFx0XHR2YXIgdSA9IGl4IC8gd2lkdGhTZWdtZW50cztcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRleC54ID0gLSByYWRpdXMgKiBNYXRoLmNvcyggcGhpU3RhcnQgKyB1ICogcGhpTGVuZ3RoICkgKiBNYXRoLnNpbiggdGhldGFTdGFydCArIHYgKiB0aGV0YUxlbmd0aCApO1xuXHRcdFx0dmVydGV4LnkgPSByYWRpdXMgKiBNYXRoLmNvcyggdGhldGFTdGFydCArIHYgKiB0aGV0YUxlbmd0aCApO1xuXHRcdFx0dmVydGV4LnogPSByYWRpdXMgKiBNYXRoLnNpbiggcGhpU3RhcnQgKyB1ICogcGhpTGVuZ3RoICkgKiBNYXRoLnNpbiggdGhldGFTdGFydCArIHYgKiB0aGV0YUxlbmd0aCApO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRub3JtYWwuc2V0KCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICkubm9ybWFsaXplKCk7XG5cdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0Ly8gdXZcblxuXHRcdFx0dXZzLnB1c2goIHUsIDEgLSB2ICk7XG5cblx0XHRcdHZlcnRpY2VzUm93LnB1c2goIGluZGV4ICsrICk7XG5cblx0XHR9XG5cblx0XHRncmlkLnB1c2goIHZlcnRpY2VzUm93ICk7XG5cblx0fVxuXG5cdC8vIGluZGljZXNcblxuXHRmb3IgKCBpeSA9IDA7IGl5IDwgaGVpZ2h0U2VnbWVudHM7IGl5ICsrICkge1xuXG5cdFx0Zm9yICggaXggPSAwOyBpeCA8IHdpZHRoU2VnbWVudHM7IGl4ICsrICkge1xuXG5cdFx0XHR2YXIgYSA9IGdyaWRbIGl5IF1bIGl4ICsgMSBdO1xuXHRcdFx0dmFyIGIgPSBncmlkWyBpeSBdWyBpeCBdO1xuXHRcdFx0dmFyIGMgPSBncmlkWyBpeSArIDEgXVsgaXggXTtcblx0XHRcdHZhciBkID0gZ3JpZFsgaXkgKyAxIF1bIGl4ICsgMSBdO1xuXG5cdFx0XHRpZiAoIGl5ICE9PSAwIHx8IHRoZXRhU3RhcnQgPiAwICkgaW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpZiAoIGl5ICE9PSBoZWlnaHRTZWdtZW50cyAtIDEgfHwgdGhldGFFbmQgPCBNYXRoLlBJICkgaW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5TcGhlcmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblNwaGVyZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNwaGVyZUJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgS2FsZWIgTXVycGh5XG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIFJpbmdHZW9tZXRyeVxuXG5mdW5jdGlvbiBSaW5nR2VvbWV0cnkoIGlubmVyUmFkaXVzLCBvdXRlclJhZGl1cywgdGhldGFTZWdtZW50cywgcGhpU2VnbWVudHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUmluZ0dlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0aW5uZXJSYWRpdXM6IGlubmVyUmFkaXVzLFxuXHRcdG91dGVyUmFkaXVzOiBvdXRlclJhZGl1cyxcblx0XHR0aGV0YVNlZ21lbnRzOiB0aGV0YVNlZ21lbnRzLFxuXHRcdHBoaVNlZ21lbnRzOiBwaGlTZWdtZW50cyxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgUmluZ0J1ZmZlckdlb21ldHJ5KCBpbm5lclJhZGl1cywgb3V0ZXJSYWRpdXMsIHRoZXRhU2VnbWVudHMsIHBoaVNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblJpbmdHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblJpbmdHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSaW5nR2VvbWV0cnk7XG5cbi8vIFJpbmdCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBSaW5nQnVmZmVyR2VvbWV0cnkoIGlubmVyUmFkaXVzLCBvdXRlclJhZGl1cywgdGhldGFTZWdtZW50cywgcGhpU2VnbWVudHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUmluZ0J1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0aW5uZXJSYWRpdXM6IGlubmVyUmFkaXVzLFxuXHRcdG91dGVyUmFkaXVzOiBvdXRlclJhZGl1cyxcblx0XHR0aGV0YVNlZ21lbnRzOiB0aGV0YVNlZ21lbnRzLFxuXHRcdHBoaVNlZ21lbnRzOiBwaGlTZWdtZW50cyxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdGlubmVyUmFkaXVzID0gaW5uZXJSYWRpdXMgfHwgMjA7XG5cdG91dGVyUmFkaXVzID0gb3V0ZXJSYWRpdXMgfHwgNTA7XG5cblx0dGhldGFTdGFydCA9IHRoZXRhU3RhcnQgIT09IHVuZGVmaW5lZCA/IHRoZXRhU3RhcnQgOiAwO1xuXHR0aGV0YUxlbmd0aCA9IHRoZXRhTGVuZ3RoICE9PSB1bmRlZmluZWQgPyB0aGV0YUxlbmd0aCA6IE1hdGguUEkgKiAyO1xuXG5cdHRoZXRhU2VnbWVudHMgPSB0aGV0YVNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBNYXRoLm1heCggMywgdGhldGFTZWdtZW50cyApIDogODtcblx0cGhpU2VnbWVudHMgPSBwaGlTZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gTWF0aC5tYXgoIDEsIHBoaVNlZ21lbnRzICkgOiAxO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIHNvbWUgaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBzZWdtZW50O1xuXHR2YXIgcmFkaXVzID0gaW5uZXJSYWRpdXM7XG5cdHZhciByYWRpdXNTdGVwID0gKCAoIG91dGVyUmFkaXVzIC0gaW5uZXJSYWRpdXMgKSAvIHBoaVNlZ21lbnRzICk7XG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdXYgPSBuZXcgVmVjdG9yMigpO1xuXHR2YXIgaiwgaTtcblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0Zm9yICggaiA9IDA7IGogPD0gcGhpU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8PSB0aGV0YVNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHQvLyB2YWx1ZXMgYXJlIGdlbmVyYXRlIGZyb20gdGhlIGluc2lkZSBvZiB0aGUgcmluZyB0byB0aGUgb3V0c2lkZVxuXG5cdFx0XHRzZWdtZW50ID0gdGhldGFTdGFydCArIGkgLyB0aGV0YVNlZ21lbnRzICogdGhldGFMZW5ndGg7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHR2ZXJ0ZXgueCA9IHJhZGl1cyAqIE1hdGguY29zKCBzZWdtZW50ICk7XG5cdFx0XHR2ZXJ0ZXgueSA9IHJhZGl1cyAqIE1hdGguc2luKCBzZWdtZW50ICk7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdG5vcm1hbHMucHVzaCggMCwgMCwgMSApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1di54ID0gKCB2ZXJ0ZXgueCAvIG91dGVyUmFkaXVzICsgMSApIC8gMjtcblx0XHRcdHV2LnkgPSAoIHZlcnRleC55IC8gb3V0ZXJSYWRpdXMgKyAxICkgLyAyO1xuXG5cdFx0XHR1dnMucHVzaCggdXYueCwgdXYueSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gaW5jcmVhc2UgdGhlIHJhZGl1cyBmb3IgbmV4dCByb3cgb2YgdmVydGljZXNcblxuXHRcdHJhZGl1cyArPSByYWRpdXNTdGVwO1xuXG5cdH1cblxuXHQvLyBpbmRpY2VzXG5cblx0Zm9yICggaiA9IDA7IGogPCBwaGlTZWdtZW50czsgaiArKyApIHtcblxuXHRcdHZhciB0aGV0YVNlZ21lbnRMZXZlbCA9IGogKiAoIHRoZXRhU2VnbWVudHMgKyAxICk7XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IHRoZXRhU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdHNlZ21lbnQgPSBpICsgdGhldGFTZWdtZW50TGV2ZWw7XG5cblx0XHRcdHZhciBhID0gc2VnbWVudDtcblx0XHRcdHZhciBiID0gc2VnbWVudCArIHRoZXRhU2VnbWVudHMgKyAxO1xuXHRcdFx0dmFyIGMgPSBzZWdtZW50ICsgdGhldGFTZWdtZW50cyArIDI7XG5cdFx0XHR2YXIgZCA9IHNlZ21lbnQgKyAxO1xuXG5cdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cbn1cblxuUmluZ0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuUmluZ0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJpbmdCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIGFzdHJvZHVkIC8gaHR0cDovL2FzdHJvZHVkLmlzZ3JlYXQub3JnL1xuICogQGF1dGhvciB6ejg1IC8gaHR0cHM6Ly9naXRodWIuY29tL3p6ODVcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gTGF0aGVHZW9tZXRyeVxuXG5mdW5jdGlvbiBMYXRoZUdlb21ldHJ5KCBwb2ludHMsIHNlZ21lbnRzLCBwaGlTdGFydCwgcGhpTGVuZ3RoICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGF0aGVHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHBvaW50czogcG9pbnRzLFxuXHRcdHNlZ21lbnRzOiBzZWdtZW50cyxcblx0XHRwaGlTdGFydDogcGhpU3RhcnQsXG5cdFx0cGhpTGVuZ3RoOiBwaGlMZW5ndGhcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IExhdGhlQnVmZmVyR2VvbWV0cnkoIHBvaW50cywgc2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGggKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5MYXRoZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuTGF0aGVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMYXRoZUdlb21ldHJ5O1xuXG4vLyBMYXRoZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIExhdGhlQnVmZmVyR2VvbWV0cnkoIHBvaW50cywgc2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGggKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMYXRoZUJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cG9pbnRzOiBwb2ludHMsXG5cdFx0c2VnbWVudHM6IHNlZ21lbnRzLFxuXHRcdHBoaVN0YXJ0OiBwaGlTdGFydCxcblx0XHRwaGlMZW5ndGg6IHBoaUxlbmd0aFxuXHR9O1xuXG5cdHNlZ21lbnRzID0gTWF0aC5mbG9vciggc2VnbWVudHMgKSB8fCAxMjtcblx0cGhpU3RhcnQgPSBwaGlTdGFydCB8fCAwO1xuXHRwaGlMZW5ndGggPSBwaGlMZW5ndGggfHwgTWF0aC5QSSAqIDI7XG5cblx0Ly8gY2xhbXAgcGhpTGVuZ3RoIHNvIGl0J3MgaW4gcmFuZ2Ugb2YgWyAwLCAyUEkgXVxuXG5cdHBoaUxlbmd0aCA9IF9NYXRoLmNsYW1wKCBwaGlMZW5ndGgsIDAsIE1hdGguUEkgKiAyICk7XG5cblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIGJhc2U7XG5cdHZhciBpbnZlcnNlU2VnbWVudHMgPSAxLjAgLyBzZWdtZW50cztcblx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB1diA9IG5ldyBWZWN0b3IyKCk7XG5cdHZhciBpLCBqO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzIGFuZCB1dnNcblxuXHRmb3IgKCBpID0gMDsgaSA8PSBzZWdtZW50czsgaSArKyApIHtcblxuXHRcdHZhciBwaGkgPSBwaGlTdGFydCArIGkgKiBpbnZlcnNlU2VnbWVudHMgKiBwaGlMZW5ndGg7XG5cblx0XHR2YXIgc2luID0gTWF0aC5zaW4oIHBoaSApO1xuXHRcdHZhciBjb3MgPSBNYXRoLmNvcyggcGhpICk7XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8PSAoIHBvaW50cy5sZW5ndGggLSAxICk7IGogKysgKSB7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHR2ZXJ0ZXgueCA9IHBvaW50c1sgaiBdLnggKiBzaW47XG5cdFx0XHR2ZXJ0ZXgueSA9IHBvaW50c1sgaiBdLnk7XG5cdFx0XHR2ZXJ0ZXgueiA9IHBvaW50c1sgaiBdLnggKiBjb3M7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0Ly8gdXZcblxuXHRcdFx0dXYueCA9IGkgLyBzZWdtZW50cztcblx0XHRcdHV2LnkgPSBqIC8gKCBwb2ludHMubGVuZ3RoIC0gMSApO1xuXG5cdFx0XHR1dnMucHVzaCggdXYueCwgdXYueSApO1xuXG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGluZGljZXNcblxuXHRmb3IgKCBpID0gMDsgaSA8IHNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0Zm9yICggaiA9IDA7IGogPCAoIHBvaW50cy5sZW5ndGggLSAxICk7IGogKysgKSB7XG5cblx0XHRcdGJhc2UgPSBqICsgaSAqIHBvaW50cy5sZW5ndGg7XG5cblx0XHRcdHZhciBhID0gYmFzZTtcblx0XHRcdHZhciBiID0gYmFzZSArIHBvaW50cy5sZW5ndGg7XG5cdFx0XHR2YXIgYyA9IGJhc2UgKyBwb2ludHMubGVuZ3RoICsgMTtcblx0XHRcdHZhciBkID0gYmFzZSArIDE7XG5cblx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cdC8vIGdlbmVyYXRlIG5vcm1hbHNcblxuXHR0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7XG5cblx0Ly8gaWYgdGhlIGdlb21ldHJ5IGlzIGNsb3NlZCwgd2UgbmVlZCB0byBhdmVyYWdlIHRoZSBub3JtYWxzIGFsb25nIHRoZSBzZWFtLlxuXHQvLyBiZWNhdXNlIHRoZSBjb3JyZXNwb25kaW5nIHZlcnRpY2VzIGFyZSBpZGVudGljYWwgKGJ1dCBzdGlsbCBoYXZlIGRpZmZlcmVudCBVVnMpLlxuXG5cdGlmICggcGhpTGVuZ3RoID09PSBNYXRoLlBJICogMiApIHtcblxuXHRcdHZhciBub3JtYWxzID0gdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbC5hcnJheTtcblx0XHR2YXIgbjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBuMiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIG4gPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Ly8gdGhpcyBpcyB0aGUgYnVmZmVyIG9mZnNldCBmb3IgdGhlIGxhc3QgbGluZSBvZiB2ZXJ0aWNlc1xuXG5cdFx0YmFzZSA9IHNlZ21lbnRzICogcG9pbnRzLmxlbmd0aCAqIDM7XG5cblx0XHRmb3IgKCBpID0gMCwgaiA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpICsrLCBqICs9IDMgKSB7XG5cblx0XHRcdC8vIHNlbGVjdCB0aGUgbm9ybWFsIG9mIHRoZSB2ZXJ0ZXggaW4gdGhlIGZpcnN0IGxpbmVcblxuXHRcdFx0bjEueCA9IG5vcm1hbHNbIGogKyAwIF07XG5cdFx0XHRuMS55ID0gbm9ybWFsc1sgaiArIDEgXTtcblx0XHRcdG4xLnogPSBub3JtYWxzWyBqICsgMiBdO1xuXG5cdFx0XHQvLyBzZWxlY3QgdGhlIG5vcm1hbCBvZiB0aGUgdmVydGV4IGluIHRoZSBsYXN0IGxpbmVcblxuXHRcdFx0bjIueCA9IG5vcm1hbHNbIGJhc2UgKyBqICsgMCBdO1xuXHRcdFx0bjIueSA9IG5vcm1hbHNbIGJhc2UgKyBqICsgMSBdO1xuXHRcdFx0bjIueiA9IG5vcm1hbHNbIGJhc2UgKyBqICsgMiBdO1xuXG5cdFx0XHQvLyBhdmVyYWdlIG5vcm1hbHNcblxuXHRcdFx0bi5hZGRWZWN0b3JzKCBuMSwgbjIgKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0Ly8gYXNzaWduIHRoZSBuZXcgdmFsdWVzIHRvIGJvdGggbm9ybWFsc1xuXG5cdFx0XHRub3JtYWxzWyBqICsgMCBdID0gbm9ybWFsc1sgYmFzZSArIGogKyAwIF0gPSBuLng7XG5cdFx0XHRub3JtYWxzWyBqICsgMSBdID0gbm9ybWFsc1sgYmFzZSArIGogKyAxIF0gPSBuLnk7XG5cdFx0XHRub3JtYWxzWyBqICsgMiBdID0gbm9ybWFsc1sgYmFzZSArIGogKyAyIF0gPSBuLno7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbkxhdGhlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5MYXRoZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExhdGhlQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBqb25vYnIxIC8gaHR0cDovL2pvbm9icjEuY29tXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIFNoYXBlR2VvbWV0cnlcblxuZnVuY3Rpb24gU2hhcGVHZW9tZXRyeSggc2hhcGVzLCBjdXJ2ZVNlZ21lbnRzICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU2hhcGVHZW9tZXRyeSc7XG5cblx0aWYgKCB0eXBlb2YgY3VydmVTZWdtZW50cyA9PT0gJ29iamVjdCcgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TaGFwZUdlb21ldHJ5OiBPcHRpb25zIHBhcmFtZXRlciBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHRcdGN1cnZlU2VnbWVudHMgPSBjdXJ2ZVNlZ21lbnRzLmN1cnZlU2VnbWVudHM7XG5cblx0fVxuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRzaGFwZXM6IHNoYXBlcyxcblx0XHRjdXJ2ZVNlZ21lbnRzOiBjdXJ2ZVNlZ21lbnRzXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBTaGFwZUJ1ZmZlckdlb21ldHJ5KCBzaGFwZXMsIGN1cnZlU2VnbWVudHMgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5TaGFwZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuU2hhcGVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTaGFwZUdlb21ldHJ5O1xuXG4vLyBTaGFwZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFNoYXBlQnVmZmVyR2VvbWV0cnkoIHNoYXBlcywgY3VydmVTZWdtZW50cyApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NoYXBlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRzaGFwZXM6IHNoYXBlcyxcblx0XHRjdXJ2ZVNlZ21lbnRzOiBjdXJ2ZVNlZ21lbnRzXG5cdH07XG5cblx0Y3VydmVTZWdtZW50cyA9IGN1cnZlU2VnbWVudHMgfHwgMTI7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBncm91cFN0YXJ0ID0gMDtcblx0dmFyIGdyb3VwQ291bnQgPSAwO1xuXG5cdC8vIGFsbG93IHNpbmdsZSBhbmQgYXJyYXkgdmFsdWVzIGZvciBcInNoYXBlc1wiIHBhcmFtZXRlclxuXG5cdGlmICggQXJyYXkuaXNBcnJheSggc2hhcGVzICkgPT09IGZhbHNlICkge1xuXG5cdFx0YWRkU2hhcGUoIHNoYXBlcyApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBzaGFwZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRhZGRTaGFwZSggc2hhcGVzWyBpIF0gKTtcblxuXHRcdFx0dGhpcy5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgaSApOyAvLyBlbmFibGVzIE11bHRpTWF0ZXJpYWwgc3VwcG9ydFxuXG5cdFx0XHRncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7XG5cdFx0XHRncm91cENvdW50ID0gMDtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cblx0Ly8gaGVscGVyIGZ1bmN0aW9uc1xuXG5cdGZ1bmN0aW9uIGFkZFNoYXBlKCBzaGFwZSApIHtcblxuXHRcdHZhciBpLCBsLCBzaGFwZUhvbGU7XG5cblx0XHR2YXIgaW5kZXhPZmZzZXQgPSB2ZXJ0aWNlcy5sZW5ndGggLyAzO1xuXHRcdHZhciBwb2ludHMgPSBzaGFwZS5leHRyYWN0UG9pbnRzKCBjdXJ2ZVNlZ21lbnRzICk7XG5cblx0XHR2YXIgc2hhcGVWZXJ0aWNlcyA9IHBvaW50cy5zaGFwZTtcblx0XHR2YXIgc2hhcGVIb2xlcyA9IHBvaW50cy5ob2xlcztcblxuXHRcdC8vIGNoZWNrIGRpcmVjdGlvbiBvZiB2ZXJ0aWNlc1xuXG5cdFx0aWYgKCBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCBzaGFwZVZlcnRpY2VzICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRzaGFwZVZlcnRpY2VzID0gc2hhcGVWZXJ0aWNlcy5yZXZlcnNlKCk7XG5cblx0XHRcdC8vIGFsc28gY2hlY2sgaWYgaG9sZXMgYXJlIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb25cblxuXHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzaGFwZUhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0c2hhcGVIb2xlID0gc2hhcGVIb2xlc1sgaSBdO1xuXG5cdFx0XHRcdGlmICggU2hhcGVVdGlscy5pc0Nsb2NrV2lzZSggc2hhcGVIb2xlICkgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHRzaGFwZUhvbGVzWyBpIF0gPSBzaGFwZUhvbGUucmV2ZXJzZSgpO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGZhY2VzID0gU2hhcGVVdGlscy50cmlhbmd1bGF0ZVNoYXBlKCBzaGFwZVZlcnRpY2VzLCBzaGFwZUhvbGVzICk7XG5cblx0XHQvLyBqb2luIHZlcnRpY2VzIG9mIGlubmVyIGFuZCBvdXRlciBwYXRocyB0byBhIHNpbmdsZSBhcnJheVxuXG5cdFx0Zm9yICggaSA9IDAsIGwgPSBzaGFwZUhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHNoYXBlSG9sZSA9IHNoYXBlSG9sZXNbIGkgXTtcblx0XHRcdHNoYXBlVmVydGljZXMgPSBzaGFwZVZlcnRpY2VzLmNvbmNhdCggc2hhcGVIb2xlICk7XG5cblx0XHR9XG5cblx0XHQvLyB2ZXJ0aWNlcywgbm9ybWFscywgdXZzXG5cblx0XHRmb3IgKCBpID0gMCwgbCA9IHNoYXBlVmVydGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlcnRleCA9IHNoYXBlVmVydGljZXNbIGkgXTtcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCAwICk7XG5cdFx0XHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcblx0XHRcdHV2cy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnkgKTsgLy8gd29ybGQgdXZzXG5cblx0XHR9XG5cblx0XHQvLyBpbmNpZGVzXG5cblx0XHRmb3IgKCBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdFx0dmFyIGEgPSBmYWNlWyAwIF0gKyBpbmRleE9mZnNldDtcblx0XHRcdHZhciBiID0gZmFjZVsgMSBdICsgaW5kZXhPZmZzZXQ7XG5cdFx0XHR2YXIgYyA9IGZhY2VbIDIgXSArIGluZGV4T2Zmc2V0O1xuXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGMgKTtcblx0XHRcdGdyb3VwQ291bnQgKz0gMztcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuU2hhcGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblNoYXBlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2hhcGVCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuZnVuY3Rpb24gRWRnZXNHZW9tZXRyeSggZ2VvbWV0cnksIHRocmVzaG9sZEFuZ2xlICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnRWRnZXNHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHRocmVzaG9sZEFuZ2xlOiB0aHJlc2hvbGRBbmdsZVxuXHR9O1xuXG5cdHRocmVzaG9sZEFuZ2xlID0gKCB0aHJlc2hvbGRBbmdsZSAhPT0gdW5kZWZpbmVkICkgPyB0aHJlc2hvbGRBbmdsZSA6IDE7XG5cblx0Ly8gYnVmZmVyXG5cblx0dmFyIHZlcnRpY2VzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciB0aHJlc2hvbGREb3QgPSBNYXRoLmNvcyggX01hdGguREVHMlJBRCAqIHRocmVzaG9sZEFuZ2xlICk7XG5cdHZhciBlZGdlID0gWyAwLCAwIF0sIGVkZ2VzID0ge30sIGVkZ2UxLCBlZGdlMjtcblx0dmFyIGtleSwga2V5cyA9IFsgJ2EnLCAnYicsICdjJyBdO1xuXG5cdC8vIHByZXBhcmUgc291cmNlIGdlb21ldHJ5XG5cblx0dmFyIGdlb21ldHJ5MjtcblxuXHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRnZW9tZXRyeTIgPSBuZXcgR2VvbWV0cnkoKTtcblx0XHRnZW9tZXRyeTIuZnJvbUJ1ZmZlckdlb21ldHJ5KCBnZW9tZXRyeSApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRnZW9tZXRyeTIgPSBnZW9tZXRyeS5jbG9uZSgpO1xuXG5cdH1cblxuXHRnZW9tZXRyeTIubWVyZ2VWZXJ0aWNlcygpO1xuXHRnZW9tZXRyeTIuY29tcHV0ZUZhY2VOb3JtYWxzKCk7XG5cblx0dmFyIHNvdXJjZVZlcnRpY2VzID0gZ2VvbWV0cnkyLnZlcnRpY2VzO1xuXHR2YXIgZmFjZXMgPSBnZW9tZXRyeTIuZmFjZXM7XG5cblx0Ly8gbm93IGNyZWF0ZSBhIGRhdGEgc3RydWN0dXJlIHdoZXJlIGVhY2ggZW50cnkgcmVwcmVzZW50cyBhbiBlZGdlIHdpdGggaXRzIGFkam9pbmluZyBmYWNlc1xuXG5cdGZvciAoIHZhciBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHR2YXIgZmFjZSA9IGZhY2VzWyBpIF07XG5cblx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCAzOyBqICsrICkge1xuXG5cdFx0XHRlZGdlMSA9IGZhY2VbIGtleXNbIGogXSBdO1xuXHRcdFx0ZWRnZTIgPSBmYWNlWyBrZXlzWyAoIGogKyAxICkgJSAzIF0gXTtcblx0XHRcdGVkZ2VbIDAgXSA9IE1hdGgubWluKCBlZGdlMSwgZWRnZTIgKTtcblx0XHRcdGVkZ2VbIDEgXSA9IE1hdGgubWF4KCBlZGdlMSwgZWRnZTIgKTtcblxuXHRcdFx0a2V5ID0gZWRnZVsgMCBdICsgJywnICsgZWRnZVsgMSBdO1xuXG5cdFx0XHRpZiAoIGVkZ2VzWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGVkZ2VzWyBrZXkgXSA9IHsgaW5kZXgxOiBlZGdlWyAwIF0sIGluZGV4MjogZWRnZVsgMSBdLCBmYWNlMTogaSwgZmFjZTI6IHVuZGVmaW5lZCB9O1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGVkZ2VzWyBrZXkgXS5mYWNlMiA9IGk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXNcblxuXHRmb3IgKCBrZXkgaW4gZWRnZXMgKSB7XG5cblx0XHR2YXIgZSA9IGVkZ2VzWyBrZXkgXTtcblxuXHRcdC8vIGFuIGVkZ2UgaXMgb25seSByZW5kZXJlZCBpZiB0aGUgYW5nbGUgKGluIGRlZ3JlZXMpIGJldHdlZW4gdGhlIGZhY2Ugbm9ybWFscyBvZiB0aGUgYWRqb2luaW5nIGZhY2VzIGV4Y2VlZHMgdGhpcyB2YWx1ZS4gZGVmYXVsdCA9IDEgZGVncmVlLlxuXG5cdFx0aWYgKCBlLmZhY2UyID09PSB1bmRlZmluZWQgfHwgZmFjZXNbIGUuZmFjZTEgXS5ub3JtYWwuZG90KCBmYWNlc1sgZS5mYWNlMiBdLm5vcm1hbCApIDw9IHRocmVzaG9sZERvdCApIHtcblxuXHRcdFx0dmFyIHZlcnRleCA9IHNvdXJjZVZlcnRpY2VzWyBlLmluZGV4MSBdO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHR2ZXJ0ZXggPSBzb3VyY2VWZXJ0aWNlc1sgZS5pbmRleDIgXTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblxufVxuXG5FZGdlc0dlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuRWRnZXNHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBFZGdlc0dlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIEN5bGluZGVyR2VvbWV0cnlcblxuZnVuY3Rpb24gQ3lsaW5kZXJHZW9tZXRyeSggcmFkaXVzVG9wLCByYWRpdXNCb3R0b20sIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ3lsaW5kZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1c1RvcDogcmFkaXVzVG9wLFxuXHRcdHJhZGl1c0JvdHRvbTogcmFkaXVzQm90dG9tLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0b3BlbkVuZGVkOiBvcGVuRW5kZWQsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IEN5bGluZGVyQnVmZmVyR2VvbWV0cnkoIHJhZGl1c1RvcCwgcmFkaXVzQm90dG9tLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbkN5bGluZGVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5DeWxpbmRlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN5bGluZGVyR2VvbWV0cnk7XG5cbi8vIEN5bGluZGVyQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSggcmFkaXVzVG9wLCByYWRpdXNCb3R0b20sIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1c1RvcDogcmFkaXVzVG9wLFxuXHRcdHJhZGl1c0JvdHRvbTogcmFkaXVzQm90dG9tLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0b3BlbkVuZGVkOiBvcGVuRW5kZWQsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdHJhZGl1c1RvcCA9IHJhZGl1c1RvcCAhPT0gdW5kZWZpbmVkID8gcmFkaXVzVG9wIDogMjA7XG5cdHJhZGl1c0JvdHRvbSA9IHJhZGl1c0JvdHRvbSAhPT0gdW5kZWZpbmVkID8gcmFkaXVzQm90dG9tIDogMjA7XG5cdGhlaWdodCA9IGhlaWdodCAhPT0gdW5kZWZpbmVkID8gaGVpZ2h0IDogMTAwO1xuXG5cdHJhZGlhbFNlZ21lbnRzID0gTWF0aC5mbG9vciggcmFkaWFsU2VnbWVudHMgKSB8fCA4O1xuXHRoZWlnaHRTZWdtZW50cyA9IE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICkgfHwgMTtcblxuXHRvcGVuRW5kZWQgPSBvcGVuRW5kZWQgIT09IHVuZGVmaW5lZCA/IG9wZW5FbmRlZCA6IGZhbHNlO1xuXHR0aGV0YVN0YXJ0ID0gdGhldGFTdGFydCAhPT0gdW5kZWZpbmVkID8gdGhldGFTdGFydCA6IDAuMDtcblx0dGhldGFMZW5ndGggPSB0aGV0YUxlbmd0aCAhPT0gdW5kZWZpbmVkID8gdGhldGFMZW5ndGggOiAyLjAgKiBNYXRoLlBJO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgaW5kZXggPSAwO1xuXHR2YXIgaW5kZXhBcnJheSA9IFtdO1xuXHR2YXIgaGFsZkhlaWdodCA9IGhlaWdodCAvIDI7XG5cdHZhciBncm91cFN0YXJ0ID0gMDtcblxuXHQvLyBnZW5lcmF0ZSBnZW9tZXRyeVxuXG5cdGdlbmVyYXRlVG9yc28oKTtcblxuXHRpZiAoIG9wZW5FbmRlZCA9PT0gZmFsc2UgKSB7XG5cblx0XHRpZiAoIHJhZGl1c1RvcCA+IDAgKSBnZW5lcmF0ZUNhcCggdHJ1ZSApO1xuXHRcdGlmICggcmFkaXVzQm90dG9tID4gMCApIGdlbmVyYXRlQ2FwKCBmYWxzZSApO1xuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVUb3JzbygpIHtcblxuXHRcdHZhciB4LCB5O1xuXHRcdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIGdyb3VwQ291bnQgPSAwO1xuXG5cdFx0Ly8gdGhpcyB3aWxsIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBub3JtYWxcblx0XHR2YXIgc2xvcGUgPSAoIHJhZGl1c0JvdHRvbSAtIHJhZGl1c1RvcCApIC8gaGVpZ2h0O1xuXG5cdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdFx0Zm9yICggeSA9IDA7IHkgPD0gaGVpZ2h0U2VnbWVudHM7IHkgKysgKSB7XG5cblx0XHRcdHZhciBpbmRleFJvdyA9IFtdO1xuXG5cdFx0XHR2YXIgdiA9IHkgLyBoZWlnaHRTZWdtZW50cztcblxuXHRcdFx0Ly8gY2FsY3VsYXRlIHRoZSByYWRpdXMgb2YgdGhlIGN1cnJlbnQgcm93XG5cblx0XHRcdHZhciByYWRpdXMgPSB2ICogKCByYWRpdXNCb3R0b20gLSByYWRpdXNUb3AgKSArIHJhZGl1c1RvcDtcblxuXHRcdFx0Zm9yICggeCA9IDA7IHggPD0gcmFkaWFsU2VnbWVudHM7IHggKysgKSB7XG5cblx0XHRcdFx0dmFyIHUgPSB4IC8gcmFkaWFsU2VnbWVudHM7XG5cblx0XHRcdFx0dmFyIHRoZXRhID0gdSAqIHRoZXRhTGVuZ3RoICsgdGhldGFTdGFydDtcblxuXHRcdFx0XHR2YXIgc2luVGhldGEgPSBNYXRoLnNpbiggdGhldGEgKTtcblx0XHRcdFx0dmFyIGNvc1RoZXRhID0gTWF0aC5jb3MoIHRoZXRhICk7XG5cblx0XHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdFx0dmVydGV4LnggPSByYWRpdXMgKiBzaW5UaGV0YTtcblx0XHRcdFx0dmVydGV4LnkgPSAtIHYgKiBoZWlnaHQgKyBoYWxmSGVpZ2h0O1xuXHRcdFx0XHR2ZXJ0ZXgueiA9IHJhZGl1cyAqIGNvc1RoZXRhO1xuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdFx0bm9ybWFsLnNldCggc2luVGhldGEsIHNsb3BlLCBjb3NUaGV0YSApLm5vcm1hbGl6ZSgpO1xuXHRcdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0XHQvLyB1dlxuXG5cdFx0XHRcdHV2cy5wdXNoKCB1LCAxIC0gdiApO1xuXG5cdFx0XHRcdC8vIHNhdmUgaW5kZXggb2YgdmVydGV4IGluIHJlc3BlY3RpdmUgcm93XG5cblx0XHRcdFx0aW5kZXhSb3cucHVzaCggaW5kZXggKysgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBub3cgc2F2ZSB2ZXJ0aWNlcyBvZiB0aGUgcm93IGluIG91ciBpbmRleCBhcnJheVxuXG5cdFx0XHRpbmRleEFycmF5LnB1c2goIGluZGV4Um93ICk7XG5cblx0XHR9XG5cblx0XHQvLyBnZW5lcmF0ZSBpbmRpY2VzXG5cblx0XHRmb3IgKCB4ID0gMDsgeCA8IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xuXG5cdFx0XHRmb3IgKCB5ID0gMDsgeSA8IGhlaWdodFNlZ21lbnRzOyB5ICsrICkge1xuXG5cdFx0XHRcdC8vIHdlIHVzZSB0aGUgaW5kZXggYXJyYXkgdG8gYWNjZXNzIHRoZSBjb3JyZWN0IGluZGljZXNcblxuXHRcdFx0XHR2YXIgYSA9IGluZGV4QXJyYXlbIHkgXVsgeCBdO1xuXHRcdFx0XHR2YXIgYiA9IGluZGV4QXJyYXlbIHkgKyAxIF1bIHggXTtcblx0XHRcdFx0dmFyIGMgPSBpbmRleEFycmF5WyB5ICsgMSBdWyB4ICsgMSBdO1xuXHRcdFx0XHR2YXIgZCA9IGluZGV4QXJyYXlbIHkgXVsgeCArIDEgXTtcblxuXHRcdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdFx0XHQvLyB1cGRhdGUgZ3JvdXAgY291bnRlclxuXG5cdFx0XHRcdGdyb3VwQ291bnQgKz0gNjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gYWRkIGEgZ3JvdXAgdG8gdGhlIGdlb21ldHJ5LiB0aGlzIHdpbGwgZW5zdXJlIG11bHRpIG1hdGVyaWFsIHN1cHBvcnRcblxuXHRcdHNjb3BlLmFkZEdyb3VwKCBncm91cFN0YXJ0LCBncm91cENvdW50LCAwICk7XG5cblx0XHQvLyBjYWxjdWxhdGUgbmV3IHN0YXJ0IHZhbHVlIGZvciBncm91cHNcblxuXHRcdGdyb3VwU3RhcnQgKz0gZ3JvdXBDb3VudDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVDYXAoIHRvcCApIHtcblxuXHRcdHZhciB4LCBjZW50ZXJJbmRleFN0YXJ0LCBjZW50ZXJJbmRleEVuZDtcblxuXHRcdHZhciB1diA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgZ3JvdXBDb3VudCA9IDA7XG5cblx0XHR2YXIgcmFkaXVzID0gKCB0b3AgPT09IHRydWUgKSA/IHJhZGl1c1RvcCA6IHJhZGl1c0JvdHRvbTtcblx0XHR2YXIgc2lnbiA9ICggdG9wID09PSB0cnVlICkgPyAxIDogLSAxO1xuXG5cdFx0Ly8gc2F2ZSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNlbnRlciB2ZXJ0ZXhcblx0XHRjZW50ZXJJbmRleFN0YXJ0ID0gaW5kZXg7XG5cblx0XHQvLyBmaXJzdCB3ZSBnZW5lcmF0ZSB0aGUgY2VudGVyIHZlcnRleCBkYXRhIG9mIHRoZSBjYXAuXG5cdFx0Ly8gYmVjYXVzZSB0aGUgZ2VvbWV0cnkgbmVlZHMgb25lIHNldCBvZiB1dnMgcGVyIGZhY2UsXG5cdFx0Ly8gd2UgbXVzdCBnZW5lcmF0ZSBhIGNlbnRlciB2ZXJ0ZXggcGVyIGZhY2Uvc2VnbWVudFxuXG5cdFx0Zm9yICggeCA9IDE7IHggPD0gcmFkaWFsU2VnbWVudHM7IHggKysgKSB7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCBoYWxmSGVpZ2h0ICogc2lnbiwgMCApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0bm9ybWFscy5wdXNoKCAwLCBzaWduLCAwICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2cy5wdXNoKCAwLjUsIDAuNSApO1xuXG5cdFx0XHQvLyBpbmNyZWFzZSBpbmRleFxuXG5cdFx0XHRpbmRleCArKztcblxuXHRcdH1cblxuXHRcdC8vIHNhdmUgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNlbnRlciB2ZXJ0ZXhcblxuXHRcdGNlbnRlckluZGV4RW5kID0gaW5kZXg7XG5cblx0XHQvLyBub3cgd2UgZ2VuZXJhdGUgdGhlIHN1cnJvdW5kaW5nIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRcdGZvciAoIHggPSAwOyB4IDw9IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xuXG5cdFx0XHR2YXIgdSA9IHggLyByYWRpYWxTZWdtZW50cztcblx0XHRcdHZhciB0aGV0YSA9IHUgKiB0aGV0YUxlbmd0aCArIHRoZXRhU3RhcnQ7XG5cblx0XHRcdHZhciBjb3NUaGV0YSA9IE1hdGguY29zKCB0aGV0YSApO1xuXHRcdFx0dmFyIHNpblRoZXRhID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHR2ZXJ0ZXgueCA9IHJhZGl1cyAqIHNpblRoZXRhO1xuXHRcdFx0dmVydGV4LnkgPSBoYWxmSGVpZ2h0ICogc2lnbjtcblx0XHRcdHZlcnRleC56ID0gcmFkaXVzICogY29zVGhldGE7XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRub3JtYWxzLnB1c2goIDAsIHNpZ24sIDAgKTtcblxuXHRcdFx0Ly8gdXZcblxuXHRcdFx0dXYueCA9ICggY29zVGhldGEgKiAwLjUgKSArIDAuNTtcblx0XHRcdHV2LnkgPSAoIHNpblRoZXRhICogMC41ICogc2lnbiApICsgMC41O1xuXHRcdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcblxuXHRcdFx0Ly8gaW5jcmVhc2UgaW5kZXhcblxuXHRcdFx0aW5kZXggKys7XG5cblx0XHR9XG5cblx0XHQvLyBnZW5lcmF0ZSBpbmRpY2VzXG5cblx0XHRmb3IgKCB4ID0gMDsgeCA8IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xuXG5cdFx0XHR2YXIgYyA9IGNlbnRlckluZGV4U3RhcnQgKyB4O1xuXHRcdFx0dmFyIGkgPSBjZW50ZXJJbmRleEVuZCArIHg7XG5cblx0XHRcdGlmICggdG9wID09PSB0cnVlICkge1xuXG5cdFx0XHRcdC8vIGZhY2UgdG9wXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBpLCBpICsgMSwgYyApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIGZhY2UgYm90dG9tXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBpICsgMSwgaSwgYyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdyb3VwQ291bnQgKz0gMztcblxuXHRcdH1cblxuXHRcdC8vIGFkZCBhIGdyb3VwIHRvIHRoZSBnZW9tZXRyeS4gdGhpcyB3aWxsIGVuc3VyZSBtdWx0aSBtYXRlcmlhbCBzdXBwb3J0XG5cblx0XHRzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgdG9wID09PSB0cnVlID8gMSA6IDIgKTtcblxuXHRcdC8vIGNhbGN1bGF0ZSBuZXcgc3RhcnQgdmFsdWUgZm9yIGdyb3Vwc1xuXG5cdFx0Z3JvdXBTdGFydCArPSBncm91cENvdW50O1xuXG5cdH1cblxufVxuXG5DeWxpbmRlckJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgYWJlbG5hdGlvbiAvIGh0dHA6Ly9naXRodWIuY29tL2FiZWxuYXRpb25cbiAqL1xuXG4vLyBDb25lR2VvbWV0cnlcblxuZnVuY3Rpb24gQ29uZUdlb21ldHJ5KCByYWRpdXMsIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEN5bGluZGVyR2VvbWV0cnkuY2FsbCggdGhpcywgMCwgcmFkaXVzLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApO1xuXG5cdHRoaXMudHlwZSA9ICdDb25lR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRoZWlnaHQ6IGhlaWdodCxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdG9wZW5FbmRlZDogb3BlbkVuZGVkLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cbn1cblxuQ29uZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN5bGluZGVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5Db25lR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29uZUdlb21ldHJ5O1xuXG4vLyBDb25lQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gQ29uZUJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEN5bGluZGVyQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgMCwgcmFkaXVzLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApO1xuXG5cdHRoaXMudHlwZSA9ICdDb25lQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRoZWlnaHQ6IGhlaWdodCxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdG9wZW5FbmRlZDogb3BlbkVuZGVkLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cbn1cblxuQ29uZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN5bGluZGVyQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5Db25lQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29uZUJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtc1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqIEBhdXRob3IgaHVnaGVzXG4gKi9cblxuLy8gQ2lyY2xlR2VvbWV0cnlcblxuZnVuY3Rpb24gQ2lyY2xlR2VvbWV0cnkoIHJhZGl1cywgc2VnbWVudHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ2lyY2xlR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRzZWdtZW50czogc2VnbWVudHMsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IENpcmNsZUJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbkNpcmNsZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuQ2lyY2xlR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2lyY2xlR2VvbWV0cnk7XG5cbi8vIENpcmNsZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIENpcmNsZUJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0NpcmNsZUJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0c2VnbWVudHM6IHNlZ21lbnRzLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0cmFkaXVzID0gcmFkaXVzIHx8IDUwO1xuXHRzZWdtZW50cyA9IHNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBNYXRoLm1heCggMywgc2VnbWVudHMgKSA6IDg7XG5cblx0dGhldGFTdGFydCA9IHRoZXRhU3RhcnQgIT09IHVuZGVmaW5lZCA/IHRoZXRhU3RhcnQgOiAwO1xuXHR0aGV0YUxlbmd0aCA9IHRoZXRhTGVuZ3RoICE9PSB1bmRlZmluZWQgPyB0aGV0YUxlbmd0aCA6IE1hdGguUEkgKiAyO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgaSwgcztcblx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB1diA9IG5ldyBWZWN0b3IyKCk7XG5cblx0Ly8gY2VudGVyIHBvaW50XG5cblx0dmVydGljZXMucHVzaCggMCwgMCwgMCApO1xuXHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcblx0dXZzLnB1c2goIDAuNSwgMC41ICk7XG5cblx0Zm9yICggcyA9IDAsIGkgPSAzOyBzIDw9IHNlZ21lbnRzOyBzICsrLCBpICs9IDMgKSB7XG5cblx0XHR2YXIgc2VnbWVudCA9IHRoZXRhU3RhcnQgKyBzIC8gc2VnbWVudHMgKiB0aGV0YUxlbmd0aDtcblxuXHRcdC8vIHZlcnRleFxuXG5cdFx0dmVydGV4LnggPSByYWRpdXMgKiBNYXRoLmNvcyggc2VnbWVudCApO1xuXHRcdHZlcnRleC55ID0gcmFkaXVzICogTWF0aC5zaW4oIHNlZ21lbnQgKTtcblxuXHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdC8vIG5vcm1hbFxuXG5cdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cblx0XHQvLyB1dnNcblxuXHRcdHV2LnggPSAoIHZlcnRpY2VzWyBpIF0gLyByYWRpdXMgKyAxICkgLyAyO1xuXHRcdHV2LnkgPSAoIHZlcnRpY2VzWyBpICsgMSBdIC8gcmFkaXVzICsgMSApIC8gMjtcblxuXHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0fVxuXG5cdC8vIGluZGljZXNcblxuXHRmb3IgKCBpID0gMTsgaSA8PSBzZWdtZW50czsgaSArKyApIHtcblxuXHRcdGluZGljZXMucHVzaCggaSwgaSArIDEsIDAgKTtcblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG59XG5cbkNpcmNsZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuQ2lyY2xlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2lyY2xlQnVmZmVyR2VvbWV0cnk7XG5cblxuXG52YXIgR2VvbWV0cmllcyA9IE9iamVjdC5mcmVlemUoe1xuXHRXaXJlZnJhbWVHZW9tZXRyeTogV2lyZWZyYW1lR2VvbWV0cnksXG5cdFBhcmFtZXRyaWNHZW9tZXRyeTogUGFyYW1ldHJpY0dlb21ldHJ5LFxuXHRQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnk6IFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSxcblx0VGV0cmFoZWRyb25HZW9tZXRyeTogVGV0cmFoZWRyb25HZW9tZXRyeSxcblx0VGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeTogVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSxcblx0T2N0YWhlZHJvbkdlb21ldHJ5OiBPY3RhaGVkcm9uR2VvbWV0cnksXG5cdE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeTogT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5LFxuXHRJY29zYWhlZHJvbkdlb21ldHJ5OiBJY29zYWhlZHJvbkdlb21ldHJ5LFxuXHRJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LFxuXHREb2RlY2FoZWRyb25HZW9tZXRyeTogRG9kZWNhaGVkcm9uR2VvbWV0cnksXG5cdERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSxcblx0UG9seWhlZHJvbkdlb21ldHJ5OiBQb2x5aGVkcm9uR2VvbWV0cnksXG5cdFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeTogUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LFxuXHRUdWJlR2VvbWV0cnk6IFR1YmVHZW9tZXRyeSxcblx0VHViZUJ1ZmZlckdlb21ldHJ5OiBUdWJlQnVmZmVyR2VvbWV0cnksXG5cdFRvcnVzS25vdEdlb21ldHJ5OiBUb3J1c0tub3RHZW9tZXRyeSxcblx0VG9ydXNLbm90QnVmZmVyR2VvbWV0cnk6IFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5LFxuXHRUb3J1c0dlb21ldHJ5OiBUb3J1c0dlb21ldHJ5LFxuXHRUb3J1c0J1ZmZlckdlb21ldHJ5OiBUb3J1c0J1ZmZlckdlb21ldHJ5LFxuXHRUZXh0R2VvbWV0cnk6IFRleHRHZW9tZXRyeSxcblx0VGV4dEJ1ZmZlckdlb21ldHJ5OiBUZXh0QnVmZmVyR2VvbWV0cnksXG5cdFNwaGVyZUdlb21ldHJ5OiBTcGhlcmVHZW9tZXRyeSxcblx0U3BoZXJlQnVmZmVyR2VvbWV0cnk6IFNwaGVyZUJ1ZmZlckdlb21ldHJ5LFxuXHRSaW5nR2VvbWV0cnk6IFJpbmdHZW9tZXRyeSxcblx0UmluZ0J1ZmZlckdlb21ldHJ5OiBSaW5nQnVmZmVyR2VvbWV0cnksXG5cdFBsYW5lR2VvbWV0cnk6IFBsYW5lR2VvbWV0cnksXG5cdFBsYW5lQnVmZmVyR2VvbWV0cnk6IFBsYW5lQnVmZmVyR2VvbWV0cnksXG5cdExhdGhlR2VvbWV0cnk6IExhdGhlR2VvbWV0cnksXG5cdExhdGhlQnVmZmVyR2VvbWV0cnk6IExhdGhlQnVmZmVyR2VvbWV0cnksXG5cdFNoYXBlR2VvbWV0cnk6IFNoYXBlR2VvbWV0cnksXG5cdFNoYXBlQnVmZmVyR2VvbWV0cnk6IFNoYXBlQnVmZmVyR2VvbWV0cnksXG5cdEV4dHJ1ZGVHZW9tZXRyeTogRXh0cnVkZUdlb21ldHJ5LFxuXHRFeHRydWRlQnVmZmVyR2VvbWV0cnk6IEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSxcblx0RWRnZXNHZW9tZXRyeTogRWRnZXNHZW9tZXRyeSxcblx0Q29uZUdlb21ldHJ5OiBDb25lR2VvbWV0cnksXG5cdENvbmVCdWZmZXJHZW9tZXRyeTogQ29uZUJ1ZmZlckdlb21ldHJ5LFxuXHRDeWxpbmRlckdlb21ldHJ5OiBDeWxpbmRlckdlb21ldHJ5LFxuXHRDeWxpbmRlckJ1ZmZlckdlb21ldHJ5OiBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5LFxuXHRDaXJjbGVHZW9tZXRyeTogQ2lyY2xlR2VvbWV0cnksXG5cdENpcmNsZUJ1ZmZlckdlb21ldHJ5OiBDaXJjbGVCdWZmZXJHZW9tZXRyeSxcblx0Qm94R2VvbWV0cnk6IEJveEdlb21ldHJ5LFxuXHRCb3hCdWZmZXJHZW9tZXRyeTogQm94QnVmZmVyR2VvbWV0cnlcbn0pO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gU2hhZG93TWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0U2hhZGVyTWF0ZXJpYWwuY2FsbCggdGhpcywge1xuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodHMsXG5cdFx0XHR7XG5cdFx0XHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9XG5cdFx0XHR9XG5cdFx0XSApLFxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmtbICdzaGFkb3dfdmVydCcgXSxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmtbICdzaGFkb3dfZnJhZycgXVxuXHR9ICk7XG5cblx0dGhpcy5saWdodHMgPSB0cnVlO1xuXHR0aGlzLnRyYW5zcGFyZW50ID0gdHJ1ZTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyggdGhpcywge1xuXHRcdG9wYWNpdHk6IHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMudW5pZm9ybXMub3BhY2l0eS52YWx1ZTtcblx0XHRcdH0sXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cdFx0XHRcdHRoaXMudW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IHZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fSApO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuU2hhZG93TWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlICk7XG5TaGFkb3dNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTaGFkb3dNYXRlcmlhbDtcblxuU2hhZG93TWF0ZXJpYWwucHJvdG90eXBlLmlzU2hhZG93TWF0ZXJpYWwgPSB0cnVlO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gUmF3U2hhZGVyTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0U2hhZGVyTWF0ZXJpYWwuY2FsbCggdGhpcywgcGFyYW1ldGVycyApO1xuXG5cdHRoaXMudHlwZSA9ICdSYXdTaGFkZXJNYXRlcmlhbCc7XG5cbn1cblxuUmF3U2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlICk7XG5SYXdTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSYXdTaGFkZXJNYXRlcmlhbDtcblxuUmF3U2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmlzUmF3U2hhZGVyTWF0ZXJpYWwgPSB0cnVlO1xuXG4vKipcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIHJvdWdobmVzczogPGZsb2F0PixcbiAqICBtZXRhbG5lc3M6IDxmbG9hdD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBsaWdodE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBhb01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBlbWlzc2l2ZTogPGhleD4sXG4gKiAgZW1pc3NpdmVJbnRlbnNpdHk6IDxmbG9hdD5cbiAqICBlbWlzc2l2ZU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYnVtcE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBidW1wU2NhbGU6IDxmbG9hdD4sXG4gKlxuICogIG5vcm1hbE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBub3JtYWxTY2FsZTogPFZlY3RvcjI+LFxuICpcbiAqICBkaXNwbGFjZW1lbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgZGlzcGxhY2VtZW50U2NhbGU6IDxmbG9hdD4sXG4gKiAgZGlzcGxhY2VtZW50QmlhczogPGZsb2F0PixcbiAqXG4gKiAgcm91Z2huZXNzTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBtZXRhbG5lc3NNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBlbnZNYXA6IG5ldyBUSFJFRS5DdWJlVGV4dHVyZSggW3Bvc3gsIG5lZ3gsIHBvc3ksIG5lZ3ksIHBvc3osIG5lZ3pdICksXG4gKiAgZW52TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIHJlZnJhY3Rpb25SYXRpbzogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LFxuICogIG1vcnBoTm9ybWFsczogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaFN0YW5kYXJkTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHsgJ1NUQU5EQVJEJzogJycgfTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaFN0YW5kYXJkTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2Vcblx0dGhpcy5yb3VnaG5lc3MgPSAwLjU7XG5cdHRoaXMubWV0YWxuZXNzID0gMC41O1xuXG5cdHRoaXMubWFwID0gbnVsbDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gbnVsbDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLmFvTWFwID0gbnVsbDtcblx0dGhpcy5hb01hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLmVtaXNzaXZlID0gbmV3IENvbG9yKCAweDAwMDAwMCApO1xuXHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS4wO1xuXHR0aGlzLmVtaXNzaXZlTWFwID0gbnVsbDtcblxuXHR0aGlzLmJ1bXBNYXAgPSBudWxsO1xuXHR0aGlzLmJ1bXBTY2FsZSA9IDE7XG5cblx0dGhpcy5ub3JtYWxNYXAgPSBudWxsO1xuXHR0aGlzLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xuXG5cdHRoaXMucm91Z2huZXNzTWFwID0gbnVsbDtcblxuXHR0aGlzLm1ldGFsbmVzc01hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHR0aGlzLmVudk1hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hTdGFuZGFyZE1hdGVyaWFsO1xuXG5NZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5kZWZpbmVzID0geyAnU1RBTkRBUkQnOiAnJyB9O1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cdHRoaXMucm91Z2huZXNzID0gc291cmNlLnJvdWdobmVzcztcblx0dGhpcy5tZXRhbG5lc3MgPSBzb3VyY2UubWV0YWxuZXNzO1xuXG5cdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5lbWlzc2l2ZS5jb3B5KCBzb3VyY2UuZW1pc3NpdmUgKTtcblx0dGhpcy5lbWlzc2l2ZU1hcCA9IHNvdXJjZS5lbWlzc2l2ZU1hcDtcblx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVuc2l0eTtcblxuXHR0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDtcblx0dGhpcy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlO1xuXG5cdHRoaXMubm9ybWFsTWFwID0gc291cmNlLm5vcm1hbE1hcDtcblx0dGhpcy5ub3JtYWxTY2FsZS5jb3B5KCBzb3VyY2Uubm9ybWFsU2NhbGUgKTtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdHRoaXMucm91Z2huZXNzTWFwID0gc291cmNlLnJvdWdobmVzc01hcDtcblxuXHR0aGlzLm1ldGFsbmVzc01hcCA9IHNvdXJjZS5tZXRhbG5lc3NNYXA7XG5cblx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHR0aGlzLmVudk1hcCA9IHNvdXJjZS5lbnZNYXA7XG5cdHRoaXMuZW52TWFwSW50ZW5zaXR5ID0gc291cmNlLmVudk1hcEludGVuc2l0eTtcblxuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IHNvdXJjZS5yZWZyYWN0aW9uUmF0aW87XG5cblx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHNvdXJjZS53aXJlZnJhbWVMaW5lY2FwO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gc291cmNlLndpcmVmcmFtZUxpbmVqb2luO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgcmVmbGVjdGl2aXR5OiA8ZmxvYXQ+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaFBoeXNpY2FsTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWVzaFN0YW5kYXJkTWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHsgJ1BIWVNJQ0FMJzogJycgfTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaFBoeXNpY2FsTWF0ZXJpYWwnO1xuXG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gMC41OyAvLyBtYXBzIHRvIEYwID0gMC4wNFxuXG5cdHRoaXMuY2xlYXJDb2F0ID0gMC4wO1xuXHR0aGlzLmNsZWFyQ29hdFJvdWdobmVzcyA9IDAuMDtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hQaHlzaWNhbE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaFBoeXNpY2FsTWF0ZXJpYWw7XG5cbk1lc2hQaHlzaWNhbE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hQaHlzaWNhbE1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmRlZmluZXMgPSB7ICdQSFlTSUNBTCc6ICcnIH07XG5cblx0dGhpcy5yZWZsZWN0aXZpdHkgPSBzb3VyY2UucmVmbGVjdGl2aXR5O1xuXG5cdHRoaXMuY2xlYXJDb2F0ID0gc291cmNlLmNsZWFyQ29hdDtcblx0dGhpcy5jbGVhckNvYXRSb3VnaG5lc3MgPSBzb3VyY2UuY2xlYXJDb2F0Um91Z2huZXNzO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIHNwZWN1bGFyOiA8aGV4PixcbiAqICBzaGluaW5lc3M6IDxmbG9hdD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBsaWdodE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBhb01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBlbWlzc2l2ZTogPGhleD4sXG4gKiAgZW1pc3NpdmVJbnRlbnNpdHk6IDxmbG9hdD5cbiAqICBlbWlzc2l2ZU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYnVtcE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBidW1wU2NhbGU6IDxmbG9hdD4sXG4gKlxuICogIG5vcm1hbE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBub3JtYWxTY2FsZTogPFZlY3RvcjI+LFxuICpcbiAqICBkaXNwbGFjZW1lbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgZGlzcGxhY2VtZW50U2NhbGU6IDxmbG9hdD4sXG4gKiAgZGlzcGxhY2VtZW50QmlhczogPGZsb2F0PixcbiAqXG4gKiAgc3BlY3VsYXJNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBlbnZNYXA6IG5ldyBUSFJFRS5UZXh0dXJlQ3ViZSggW3Bvc3gsIG5lZ3gsIHBvc3ksIG5lZ3ksIHBvc3osIG5lZ3pdICksXG4gKiAgY29tYmluZTogVEhSRUUuTXVsdGlwbHksXG4gKiAgcmVmbGVjdGl2aXR5OiA8ZmxvYXQ+LFxuICogIHJlZnJhY3Rpb25SYXRpbzogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LFxuICogIG1vcnBoTm9ybWFsczogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaFBob25nTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoUGhvbmdNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZGlmZnVzZVxuXHR0aGlzLnNwZWN1bGFyID0gbmV3IENvbG9yKCAweDExMTExMSApO1xuXHR0aGlzLnNoaW5pbmVzcyA9IDMwO1xuXG5cdHRoaXMubWFwID0gbnVsbDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gbnVsbDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLmFvTWFwID0gbnVsbDtcblx0dGhpcy5hb01hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLmVtaXNzaXZlID0gbmV3IENvbG9yKCAweDAwMDAwMCApO1xuXHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS4wO1xuXHR0aGlzLmVtaXNzaXZlTWFwID0gbnVsbDtcblxuXHR0aGlzLmJ1bXBNYXAgPSBudWxsO1xuXHR0aGlzLmJ1bXBTY2FsZSA9IDE7XG5cblx0dGhpcy5ub3JtYWxNYXAgPSBudWxsO1xuXHR0aGlzLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xuXG5cdHRoaXMuc3BlY3VsYXJNYXAgPSBudWxsO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xuXG5cdHRoaXMuZW52TWFwID0gbnVsbDtcblx0dGhpcy5jb21iaW5lID0gTXVsdGlwbHlPcGVyYXRpb247XG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gMTtcblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSAwLjk4O1xuXG5cdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJztcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7XG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaFBob25nTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoUGhvbmdNYXRlcmlhbDtcblxuTWVzaFBob25nTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFBob25nTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cdHRoaXMuc3BlY3VsYXIuY29weSggc291cmNlLnNwZWN1bGFyICk7XG5cdHRoaXMuc2hpbmluZXNzID0gc291cmNlLnNoaW5pbmVzcztcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcblxuXHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0dGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7XG5cdHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7XG5cdHRoaXMubm9ybWFsU2NhbGUuY29weSggc291cmNlLm5vcm1hbFNjYWxlICk7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcblxuXHR0aGlzLnNwZWN1bGFyTWFwID0gc291cmNlLnNwZWN1bGFyTWFwO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0dGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwO1xuXHR0aGlzLmNvbWJpbmUgPSBzb3VyY2UuY29tYmluZTtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSBzb3VyY2UucmVmbGVjdGl2aXR5O1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IHNvdXJjZS5yZWZyYWN0aW9uUmF0aW87XG5cblx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHNvdXJjZS53aXJlZnJhbWVMaW5lY2FwO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gc291cmNlLndpcmVmcmFtZUxpbmVqb2luO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgdGFrYWhpcm94IC8gaHR0cDovL2dpdGh1Yi5jb20vdGFrYWhpcm94XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBncmFkaWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKVxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hUb29uTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWVzaFBob25nTWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHsgJ1RPT04nOiAnJyB9O1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoVG9vbk1hdGVyaWFsJztcblxuXHR0aGlzLmdyYWRpZW50TWFwID0gbnVsbDtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hUb29uTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWVzaFBob25nTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoVG9vbk1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hUb29uTWF0ZXJpYWw7XG5cbk1lc2hUb29uTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFRvb25NYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hUb29uTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmdyYWRpZW50TWFwID0gc291cmNlLmdyYWRpZW50TWFwO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKlxuICogIGJ1bXBNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgYnVtcFNjYWxlOiA8ZmxvYXQ+LFxuICpcbiAqICBub3JtYWxNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgbm9ybWFsU2NhbGU6IDxWZWN0b3IyPixcbiAqXG4gKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LFxuICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PlxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LFxuICogIG1vcnBoTm9ybWFsczogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaE5vcm1hbE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMsIHBhcmFtZXRlcnMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaE5vcm1hbE1hdGVyaWFsJztcblxuXHR0aGlzLmJ1bXBNYXAgPSBudWxsO1xuXHR0aGlzLmJ1bXBTY2FsZSA9IDE7XG5cblx0dGhpcy5ub3JtYWxNYXAgPSBudWxsO1xuXHR0aGlzLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblxuXHR0aGlzLmZvZyA9IGZhbHNlO1xuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hOb3JtYWxNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hOb3JtYWxNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoTm9ybWFsTWF0ZXJpYWw7XG5cbk1lc2hOb3JtYWxNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoTm9ybWFsTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoTm9ybWFsTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDtcblx0dGhpcy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlO1xuXG5cdHRoaXMubm9ybWFsTWFwID0gc291cmNlLm5vcm1hbE1hcDtcblx0dGhpcy5ub3JtYWxTY2FsZS5jb3B5KCBzb3VyY2Uubm9ybWFsU2NhbGUgKTtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKlxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgbGlnaHRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgbGlnaHRNYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgYW9NYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgYW9NYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgZW1pc3NpdmU6IDxoZXg+LFxuICogIGVtaXNzaXZlSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKiAgZW1pc3NpdmVNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIHNwZWN1bGFyTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgZW52TWFwOiBuZXcgVEhSRUUuVGV4dHVyZUN1YmUoIFtwb3N4LCBuZWd4LCBwb3N5LCBuZWd5LCBwb3N6LCBuZWd6XSApLFxuICogIGNvbWJpbmU6IFRIUkVFLk11bHRpcGx5LFxuICogIHJlZmxlY3Rpdml0eTogPGZsb2F0PixcbiAqICByZWZyYWN0aW9uUmF0aW86IDxmbG9hdD4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PixcbiAqXG4gKiAgc2tpbm5pbmc6IDxib29sPixcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPixcbiAqICBtb3JwaE5vcm1hbHM6IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hMYW1iZXJ0TWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoTGFtYmVydE1hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOyAvLyBkaWZmdXNlXG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBudWxsO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuYW9NYXAgPSBudWxsO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuZW1pc3NpdmUgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSAxLjA7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsO1xuXG5cdHRoaXMuc3BlY3VsYXJNYXAgPSBudWxsO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xuXG5cdHRoaXMuZW52TWFwID0gbnVsbDtcblx0dGhpcy5jb21iaW5lID0gTXVsdGlwbHlPcGVyYXRpb247XG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gMTtcblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSAwLjk4O1xuXG5cdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJztcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7XG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaExhbWJlcnRNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hMYW1iZXJ0TWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaExhbWJlcnRNYXRlcmlhbDtcblxuTWVzaExhbWJlcnRNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoTGFtYmVydE1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaExhbWJlcnRNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBzb3VyY2UubGlnaHRNYXA7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5hb01hcCA9IHNvdXJjZS5hb01hcDtcblx0dGhpcy5hb01hcEludGVuc2l0eSA9IHNvdXJjZS5hb01hcEludGVuc2l0eTtcblxuXHR0aGlzLmVtaXNzaXZlLmNvcHkoIHNvdXJjZS5lbWlzc2l2ZSApO1xuXHR0aGlzLmVtaXNzaXZlTWFwID0gc291cmNlLmVtaXNzaXZlTWFwO1xuXHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gc291cmNlLmVtaXNzaXZlSW50ZW5zaXR5O1xuXG5cdHRoaXMuc3BlY3VsYXJNYXAgPSBzb3VyY2Uuc3BlY3VsYXJNYXA7XG5cblx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHR0aGlzLmVudk1hcCA9IHNvdXJjZS5lbnZNYXA7XG5cdHRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lO1xuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7XG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gc291cmNlLnJlZnJhY3Rpb25SYXRpbztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBsaW5ld2lkdGg6IDxmbG9hdD4sXG4gKlxuICogIHNjYWxlOiA8ZmxvYXQ+LFxuICogIGRhc2hTaXplOiA8ZmxvYXQ+LFxuICogIGdhcFNpemU6IDxmbG9hdD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBMaW5lRGFzaGVkTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lRGFzaGVkTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7XG5cblx0dGhpcy5saW5ld2lkdGggPSAxO1xuXG5cdHRoaXMuc2NhbGUgPSAxO1xuXHR0aGlzLmRhc2hTaXplID0gMztcblx0dGhpcy5nYXBTaXplID0gMTtcblxuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVEYXNoZWRNYXRlcmlhbDtcblxuTGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZS5pc0xpbmVEYXNoZWRNYXRlcmlhbCA9IHRydWU7XG5cbkxpbmVEYXNoZWRNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0dGhpcy5saW5ld2lkdGggPSBzb3VyY2UubGluZXdpZHRoO1xuXG5cdHRoaXMuc2NhbGUgPSBzb3VyY2Uuc2NhbGU7XG5cdHRoaXMuZGFzaFNpemUgPSBzb3VyY2UuZGFzaFNpemU7XG5cdHRoaXMuZ2FwU2l6ZSA9IHNvdXJjZS5nYXBTaXplO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5cblxudmFyIE1hdGVyaWFscyA9IE9iamVjdC5mcmVlemUoe1xuXHRTaGFkb3dNYXRlcmlhbDogU2hhZG93TWF0ZXJpYWwsXG5cdFNwcml0ZU1hdGVyaWFsOiBTcHJpdGVNYXRlcmlhbCxcblx0UmF3U2hhZGVyTWF0ZXJpYWw6IFJhd1NoYWRlck1hdGVyaWFsLFxuXHRTaGFkZXJNYXRlcmlhbDogU2hhZGVyTWF0ZXJpYWwsXG5cdFBvaW50c01hdGVyaWFsOiBQb2ludHNNYXRlcmlhbCxcblx0TWVzaFBoeXNpY2FsTWF0ZXJpYWw6IE1lc2hQaHlzaWNhbE1hdGVyaWFsLFxuXHRNZXNoU3RhbmRhcmRNYXRlcmlhbDogTWVzaFN0YW5kYXJkTWF0ZXJpYWwsXG5cdE1lc2hQaG9uZ01hdGVyaWFsOiBNZXNoUGhvbmdNYXRlcmlhbCxcblx0TWVzaFRvb25NYXRlcmlhbDogTWVzaFRvb25NYXRlcmlhbCxcblx0TWVzaE5vcm1hbE1hdGVyaWFsOiBNZXNoTm9ybWFsTWF0ZXJpYWwsXG5cdE1lc2hMYW1iZXJ0TWF0ZXJpYWw6IE1lc2hMYW1iZXJ0TWF0ZXJpYWwsXG5cdE1lc2hEZXB0aE1hdGVyaWFsOiBNZXNoRGVwdGhNYXRlcmlhbCxcblx0TWVzaEJhc2ljTWF0ZXJpYWw6IE1lc2hCYXNpY01hdGVyaWFsLFxuXHRMaW5lRGFzaGVkTWF0ZXJpYWw6IExpbmVEYXNoZWRNYXRlcmlhbCxcblx0TGluZUJhc2ljTWF0ZXJpYWw6IExpbmVCYXNpY01hdGVyaWFsLFxuXHRNYXRlcmlhbDogTWF0ZXJpYWxcbn0pO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxudmFyIENhY2hlID0ge1xuXG5cdGVuYWJsZWQ6IGZhbHNlLFxuXG5cdGZpbGVzOiB7fSxcblxuXHRhZGQ6IGZ1bmN0aW9uICgga2V5LCBmaWxlICkge1xuXG5cdFx0aWYgKCB0aGlzLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0Ly8gY29uc29sZS5sb2coICdUSFJFRS5DYWNoZScsICdBZGRpbmcga2V5OicsIGtleSApO1xuXG5cdFx0dGhpcy5maWxlc1sga2V5IF0gPSBmaWxlO1xuXG5cdH0sXG5cblx0Z2V0OiBmdW5jdGlvbiAoIGtleSApIHtcblxuXHRcdGlmICggdGhpcy5lbmFibGVkID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdC8vIGNvbnNvbGUubG9nKCAnVEhSRUUuQ2FjaGUnLCAnQ2hlY2tpbmcga2V5OicsIGtleSApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsZXNbIGtleSBdO1xuXG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiAoIGtleSApIHtcblxuXHRcdGRlbGV0ZSB0aGlzLmZpbGVzWyBrZXkgXTtcblxuXHR9LFxuXG5cdGNsZWFyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmZpbGVzID0ge307XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gTG9hZGluZ01hbmFnZXIoIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdHZhciBpc0xvYWRpbmcgPSBmYWxzZSwgaXRlbXNMb2FkZWQgPSAwLCBpdGVtc1RvdGFsID0gMDtcblxuXHR0aGlzLm9uU3RhcnQgPSB1bmRlZmluZWQ7XG5cdHRoaXMub25Mb2FkID0gb25Mb2FkO1xuXHR0aGlzLm9uUHJvZ3Jlc3MgPSBvblByb2dyZXNzO1xuXHR0aGlzLm9uRXJyb3IgPSBvbkVycm9yO1xuXG5cdHRoaXMuaXRlbVN0YXJ0ID0gZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHRpdGVtc1RvdGFsICsrO1xuXG5cdFx0aWYgKCBpc0xvYWRpbmcgPT09IGZhbHNlICkge1xuXG5cdFx0XHRpZiAoIHNjb3BlLm9uU3RhcnQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzY29wZS5vblN0YXJ0KCB1cmwsIGl0ZW1zTG9hZGVkLCBpdGVtc1RvdGFsICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlzTG9hZGluZyA9IHRydWU7XG5cblx0fTtcblxuXHR0aGlzLml0ZW1FbmQgPSBmdW5jdGlvbiAoIHVybCApIHtcblxuXHRcdGl0ZW1zTG9hZGVkICsrO1xuXG5cdFx0aWYgKCBzY29wZS5vblByb2dyZXNzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHNjb3BlLm9uUHJvZ3Jlc3MoIHVybCwgaXRlbXNMb2FkZWQsIGl0ZW1zVG90YWwgKTtcblxuXHRcdH1cblxuXHRcdGlmICggaXRlbXNMb2FkZWQgPT09IGl0ZW1zVG90YWwgKSB7XG5cblx0XHRcdGlzTG9hZGluZyA9IGZhbHNlO1xuXG5cdFx0XHRpZiAoIHNjb3BlLm9uTG9hZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHNjb3BlLm9uTG9hZCgpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fTtcblxuXHR0aGlzLml0ZW1FcnJvciA9IGZ1bmN0aW9uICggdXJsICkge1xuXG5cdFx0aWYgKCBzY29wZS5vbkVycm9yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHNjb3BlLm9uRXJyb3IoIHVybCApO1xuXG5cdFx0fVxuXG5cdH07XG5cbn1cblxudmFyIERlZmF1bHRMb2FkaW5nTWFuYWdlciA9IG5ldyBMb2FkaW5nTWFuYWdlcigpO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gRmlsZUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxufVxuXG5PYmplY3QuYXNzaWduKCBGaWxlTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHRpZiAoIHVybCA9PT0gdW5kZWZpbmVkICkgdXJsID0gJyc7XG5cblx0XHRpZiAoIHRoaXMucGF0aCAhPT0gdW5kZWZpbmVkICkgdXJsID0gdGhpcy5wYXRoICsgdXJsO1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBjYWNoZWQgPSBDYWNoZS5nZXQoIHVybCApO1xuXG5cdFx0aWYgKCBjYWNoZWQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0XHRzZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIGNhY2hlZCApO1xuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdH0sIDAgKTtcblxuXHRcdFx0cmV0dXJuIGNhY2hlZDtcblxuXHRcdH1cblxuXHRcdC8vIENoZWNrIGZvciBkYXRhOiBVUklcblx0XHR2YXIgZGF0YVVyaVJlZ2V4ID0gL15kYXRhOiguKj8pKDtiYXNlNjQpPywoLiopJC87XG5cdFx0dmFyIGRhdGFVcmlSZWdleFJlc3VsdCA9IHVybC5tYXRjaCggZGF0YVVyaVJlZ2V4ICk7XG5cblx0XHQvLyBTYWZhcmkgY2FuIG5vdCBoYW5kbGUgRGF0YSBVUklzIHRocm91Z2ggWE1MSHR0cFJlcXVlc3Qgc28gcHJvY2VzcyBtYW51YWxseVxuXHRcdGlmICggZGF0YVVyaVJlZ2V4UmVzdWx0ICkge1xuXG5cdFx0XHR2YXIgbWltZVR5cGUgPSBkYXRhVXJpUmVnZXhSZXN1bHRbIDEgXTtcblx0XHRcdHZhciBpc0Jhc2U2NCA9ICEhIGRhdGFVcmlSZWdleFJlc3VsdFsgMiBdO1xuXHRcdFx0dmFyIGRhdGEgPSBkYXRhVXJpUmVnZXhSZXN1bHRbIDMgXTtcblxuXHRcdFx0ZGF0YSA9IHdpbmRvdy5kZWNvZGVVUklDb21wb25lbnQoIGRhdGEgKTtcblxuXHRcdFx0aWYgKCBpc0Jhc2U2NCApIGRhdGEgPSB3aW5kb3cuYXRvYiggZGF0YSApO1xuXG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdHZhciByZXNwb25zZTtcblx0XHRcdFx0dmFyIHJlc3BvbnNlVHlwZSA9ICggdGhpcy5yZXNwb25zZVR5cGUgfHwgJycgKS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHRcdHN3aXRjaCAoIHJlc3BvbnNlVHlwZSApIHtcblxuXHRcdFx0XHRcdGNhc2UgJ2FycmF5YnVmZmVyJzpcblx0XHRcdFx0XHRjYXNlICdibG9iJzpcblxuXHRcdFx0XHRcdCBcdHJlc3BvbnNlID0gbmV3IEFycmF5QnVmZmVyKCBkYXRhLmxlbmd0aCApO1xuXG5cdFx0XHRcdFx0XHR2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KCByZXNwb25zZSApO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHR2aWV3WyBpIF0gPSBkYXRhLmNoYXJDb2RlQXQoIGkgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoIHJlc3BvbnNlVHlwZSA9PT0gJ2Jsb2InICkge1xuXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlID0gbmV3IEJsb2IoIFsgcmVzcG9uc2UgXSwgeyB0eXBlOiBtaW1lVHlwZSB9ICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdkb2N1bWVudCc6XG5cblx0XHRcdFx0XHRcdHZhciBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG5cdFx0XHRcdFx0XHRyZXNwb25zZSA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoIGRhdGEsIG1pbWVUeXBlICk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnanNvbic6XG5cblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gSlNPTi5wYXJzZSggZGF0YSApO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGRlZmF1bHQ6IC8vICd0ZXh0JyBvciBvdGhlclxuXG5cdFx0XHRcdFx0XHRyZXNwb25zZSA9IGRhdGE7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXYWl0IGZvciBuZXh0IGJyb3dzZXIgdGlja1xuXHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHJlc3BvbnNlICk7XG5cblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHRcdH0sIDAgKTtcblxuXHRcdFx0fSBjYXRjaCAoIGVycm9yICkge1xuXG5cdFx0XHRcdC8vIFdhaXQgZm9yIG5leHQgYnJvd3NlciB0aWNrXG5cdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0XHRpZiAoIG9uRXJyb3IgKSBvbkVycm9yKCBlcnJvciApO1xuXG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XG5cblx0XHRcdFx0fSwgMCApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXHRcdFx0cmVxdWVzdC5vcGVuKCAnR0VUJywgdXJsLCB0cnVlICk7XG5cblx0XHRcdHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0XHRcdHZhciByZXNwb25zZSA9IGV2ZW50LnRhcmdldC5yZXNwb25zZTtcblxuXHRcdFx0XHRDYWNoZS5hZGQoIHVybCwgcmVzcG9uc2UgKTtcblxuXHRcdFx0XHRpZiAoIHRoaXMuc3RhdHVzID09PSAyMDAgKSB7XG5cblx0XHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggcmVzcG9uc2UgKTtcblxuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdFx0fSBlbHNlIGlmICggdGhpcy5zdGF0dXMgPT09IDAgKSB7XG5cblx0XHRcdFx0XHQvLyBTb21lIGJyb3dzZXJzIHJldHVybiBIVFRQIFN0YXR1cyAwIHdoZW4gdXNpbmcgbm9uLWh0dHAgcHJvdG9jb2xcblx0XHRcdFx0XHQvLyBlLmcuICdmaWxlOi8vJyBvciAnZGF0YTovLycuIEhhbmRsZSBhcyBzdWNjZXNzLlxuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRmlsZUxvYWRlcjogSFRUUCBTdGF0dXMgMCByZWNlaXZlZC4nICk7XG5cblx0XHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggcmVzcG9uc2UgKTtcblxuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGlmICggb25FcnJvciApIG9uRXJyb3IoIGV2ZW50ICk7XG5cblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sIGZhbHNlICk7XG5cblx0XHRcdGlmICggb25Qcm9ncmVzcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lciggJ3Byb2dyZXNzJywgZnVuY3Rpb24gKCBldmVudCApIHtcblxuXHRcdFx0XHRcdG9uUHJvZ3Jlc3MoIGV2ZW50ICk7XG5cblx0XHRcdFx0fSwgZmFsc2UgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoICdlcnJvcicsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRcdFx0aWYgKCBvbkVycm9yICkgb25FcnJvciggZXZlbnQgKTtcblxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XG5cblx0XHRcdH0sIGZhbHNlICk7XG5cblx0XHRcdGlmICggdGhpcy5yZXNwb25zZVR5cGUgIT09IHVuZGVmaW5lZCApIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gdGhpcy5yZXNwb25zZVR5cGU7XG5cdFx0XHRpZiAoIHRoaXMud2l0aENyZWRlbnRpYWxzICE9PSB1bmRlZmluZWQgKSByZXF1ZXN0LndpdGhDcmVkZW50aWFscyA9IHRoaXMud2l0aENyZWRlbnRpYWxzO1xuXG5cdFx0XHRpZiAoIHJlcXVlc3Qub3ZlcnJpZGVNaW1lVHlwZSApIHJlcXVlc3Qub3ZlcnJpZGVNaW1lVHlwZSggdGhpcy5taW1lVHlwZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5taW1lVHlwZSA6ICd0ZXh0L3BsYWluJyApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaGVhZGVyIGluIHRoaXMucmVxdWVzdEhlYWRlciApIHtcblxuXHRcdFx0XHRyZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoIGhlYWRlciwgdGhpcy5yZXF1ZXN0SGVhZGVyWyBoZWFkZXIgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJlcXVlc3Quc2VuZCggbnVsbCApO1xuXG5cdFx0fVxuXG5cdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0cmV0dXJuIHJlcXVlc3Q7XG5cblx0fSxcblxuXHRzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYXRoID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRSZXNwb25zZVR5cGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnJlc3BvbnNlVHlwZSA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0V2l0aENyZWRlbnRpYWxzOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy53aXRoQ3JlZGVudGlhbHMgPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldE1pbWVUeXBlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5taW1lVHlwZSA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucmVxdWVzdEhlYWRlciA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKlxuICogQWJzdHJhY3QgQmFzZSBjbGFzcyB0byBibG9jayBiYXNlZCB0ZXh0dXJlcyBsb2FkZXIgKGRkcywgcHZyLCAuLi4pXG4gKi9cblxuZnVuY3Rpb24gQ29tcHJlc3NlZFRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cblx0Ly8gb3ZlcnJpZGUgaW4gc3ViIGNsYXNzZXNcblx0dGhpcy5fcGFyc2VyID0gbnVsbDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBDb21wcmVzc2VkVGV4dHVyZUxvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBpbWFnZXMgPSBbXTtcblxuXHRcdHZhciB0ZXh0dXJlID0gbmV3IENvbXByZXNzZWRUZXh0dXJlKCk7XG5cdFx0dGV4dHVyZS5pbWFnZSA9IGltYWdlcztcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXHRcdGxvYWRlci5zZXRSZXNwb25zZVR5cGUoICdhcnJheWJ1ZmZlcicgKTtcblxuXHRcdGZ1bmN0aW9uIGxvYWRUZXh0dXJlKCBpICkge1xuXG5cdFx0XHRsb2FkZXIubG9hZCggdXJsWyBpIF0sIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0XHRcdHZhciB0ZXhEYXRhcyA9IHNjb3BlLl9wYXJzZXIoIGJ1ZmZlciwgdHJ1ZSApO1xuXG5cdFx0XHRcdGltYWdlc1sgaSBdID0ge1xuXHRcdFx0XHRcdHdpZHRoOiB0ZXhEYXRhcy53aWR0aCxcblx0XHRcdFx0XHRoZWlnaHQ6IHRleERhdGFzLmhlaWdodCxcblx0XHRcdFx0XHRmb3JtYXQ6IHRleERhdGFzLmZvcm1hdCxcblx0XHRcdFx0XHRtaXBtYXBzOiB0ZXhEYXRhcy5taXBtYXBzXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0bG9hZGVkICs9IDE7XG5cblx0XHRcdFx0aWYgKCBsb2FkZWQgPT09IDYgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHRleERhdGFzLm1pcG1hcENvdW50ID09PSAxIClcblx0XHRcdFx0XHRcdHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyRmlsdGVyO1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7XG5cdFx0XHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggdGV4dHVyZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB1cmwgKSApIHtcblxuXHRcdFx0dmFyIGxvYWRlZCA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB1cmwubGVuZ3RoOyBpIDwgaWw7ICsrIGkgKSB7XG5cblx0XHRcdFx0bG9hZFRleHR1cmUoIGkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gY29tcHJlc3NlZCBjdWJlbWFwIHRleHR1cmUgc3RvcmVkIGluIGEgc2luZ2xlIEREUyBmaWxlXG5cblx0XHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0XHRcdHZhciB0ZXhEYXRhcyA9IHNjb3BlLl9wYXJzZXIoIGJ1ZmZlciwgdHJ1ZSApO1xuXG5cdFx0XHRcdGlmICggdGV4RGF0YXMuaXNDdWJlbWFwICkge1xuXG5cdFx0XHRcdFx0dmFyIGZhY2VzID0gdGV4RGF0YXMubWlwbWFwcy5sZW5ndGggLyB0ZXhEYXRhcy5taXBtYXBDb3VudDtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBmID0gMDsgZiA8IGZhY2VzOyBmICsrICkge1xuXG5cdFx0XHRcdFx0XHRpbWFnZXNbIGYgXSA9IHsgbWlwbWFwcyA6IFtdIH07XG5cblx0XHRcdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRleERhdGFzLm1pcG1hcENvdW50OyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdGltYWdlc1sgZiBdLm1pcG1hcHMucHVzaCggdGV4RGF0YXMubWlwbWFwc1sgZiAqIHRleERhdGFzLm1pcG1hcENvdW50ICsgaSBdICk7XG5cdFx0XHRcdFx0XHRcdGltYWdlc1sgZiBdLmZvcm1hdCA9IHRleERhdGFzLmZvcm1hdDtcblx0XHRcdFx0XHRcdFx0aW1hZ2VzWyBmIF0ud2lkdGggPSB0ZXhEYXRhcy53aWR0aDtcblx0XHRcdFx0XHRcdFx0aW1hZ2VzWyBmIF0uaGVpZ2h0ID0gdGV4RGF0YXMuaGVpZ2h0O1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHRleHR1cmUuaW1hZ2Uud2lkdGggPSB0ZXhEYXRhcy53aWR0aDtcblx0XHRcdFx0XHR0ZXh0dXJlLmltYWdlLmhlaWdodCA9IHRleERhdGFzLmhlaWdodDtcblx0XHRcdFx0XHR0ZXh0dXJlLm1pcG1hcHMgPSB0ZXhEYXRhcy5taXBtYXBzO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHRleERhdGFzLm1pcG1hcENvdW50ID09PSAxICkge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRleHR1cmUuZm9ybWF0ID0gdGV4RGF0YXMuZm9ybWF0O1xuXHRcdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggdGV4dHVyZSApO1xuXG5cdFx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGV4dHVyZTtcblxuXHR9LFxuXG5cdHNldFBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhdGggPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIE5pa29zIE0uIC8gaHR0cHM6Ly9naXRodWIuY29tL2ZvbzEyMy9cbiAqXG4gKiBBYnN0cmFjdCBCYXNlIGNsYXNzIHRvIGxvYWQgZ2VuZXJpYyBiaW5hcnkgdGV4dHVyZXMgZm9ybWF0cyAocmdiZSwgaGRyLCAuLi4pXG4gKi9cblxuZnVuY3Rpb24gRGF0YVRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cblx0Ly8gb3ZlcnJpZGUgaW4gc3ViIGNsYXNzZXNcblx0dGhpcy5fcGFyc2VyID0gbnVsbDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBEYXRhVGV4dHVyZUxvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciB0ZXh0dXJlID0gbmV3IERhdGFUZXh0dXJlKCk7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApO1xuXHRcdGxvYWRlci5zZXRSZXNwb25zZVR5cGUoICdhcnJheWJ1ZmZlcicgKTtcblxuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0XHR2YXIgdGV4RGF0YSA9IHNjb3BlLl9wYXJzZXIoIGJ1ZmZlciApO1xuXG5cdFx0XHRpZiAoICEgdGV4RGF0YSApIHJldHVybjtcblxuXHRcdFx0aWYgKCB1bmRlZmluZWQgIT09IHRleERhdGEuaW1hZ2UgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5pbWFnZSA9IHRleERhdGEuaW1hZ2U7XG5cblx0XHRcdH0gZWxzZSBpZiAoIHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5kYXRhICkge1xuXG5cdFx0XHRcdHRleHR1cmUuaW1hZ2Uud2lkdGggPSB0ZXhEYXRhLndpZHRoO1xuXHRcdFx0XHR0ZXh0dXJlLmltYWdlLmhlaWdodCA9IHRleERhdGEuaGVpZ2h0O1xuXHRcdFx0XHR0ZXh0dXJlLmltYWdlLmRhdGEgPSB0ZXhEYXRhLmRhdGE7XG5cblx0XHRcdH1cblxuXHRcdFx0dGV4dHVyZS53cmFwUyA9IHVuZGVmaW5lZCAhPT0gdGV4RGF0YS53cmFwUyA/IHRleERhdGEud3JhcFMgOiBDbGFtcFRvRWRnZVdyYXBwaW5nO1xuXHRcdFx0dGV4dHVyZS53cmFwVCA9IHVuZGVmaW5lZCAhPT0gdGV4RGF0YS53cmFwVCA/IHRleERhdGEud3JhcFQgOiBDbGFtcFRvRWRnZVdyYXBwaW5nO1xuXG5cdFx0XHR0ZXh0dXJlLm1hZ0ZpbHRlciA9IHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5tYWdGaWx0ZXIgPyB0ZXhEYXRhLm1hZ0ZpbHRlciA6IExpbmVhckZpbHRlcjtcblx0XHRcdHRleHR1cmUubWluRmlsdGVyID0gdW5kZWZpbmVkICE9PSB0ZXhEYXRhLm1pbkZpbHRlciA/IHRleERhdGEubWluRmlsdGVyIDogTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyO1xuXG5cdFx0XHR0ZXh0dXJlLmFuaXNvdHJvcHkgPSB1bmRlZmluZWQgIT09IHRleERhdGEuYW5pc290cm9weSA/IHRleERhdGEuYW5pc290cm9weSA6IDE7XG5cblx0XHRcdGlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLmZvcm1hdCApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLmZvcm1hdCA9IHRleERhdGEuZm9ybWF0O1xuXG5cdFx0XHR9XG5cdFx0XHRpZiAoIHVuZGVmaW5lZCAhPT0gdGV4RGF0YS50eXBlICkge1xuXG5cdFx0XHRcdHRleHR1cmUudHlwZSA9IHRleERhdGEudHlwZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5taXBtYXBzICkge1xuXG5cdFx0XHRcdHRleHR1cmUubWlwbWFwcyA9IHRleERhdGEubWlwbWFwcztcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIDEgPT09IHRleERhdGEubWlwbWFwQ291bnQgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7XG5cblx0XHRcdH1cblxuXHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlLCB0ZXhEYXRhICk7XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gSW1hZ2VMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggSW1hZ2VMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGlmICggdXJsID09PSB1bmRlZmluZWQgKSB1cmwgPSAnJztcblxuXHRcdGlmICggdGhpcy5wYXRoICE9PSB1bmRlZmluZWQgKSB1cmwgPSB0aGlzLnBhdGggKyB1cmw7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGNhY2hlZCA9IENhY2hlLmdldCggdXJsICk7XG5cblx0XHRpZiAoIGNhY2hlZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggY2FjaGVkICk7XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0fSwgMCApO1xuXG5cdFx0XHRyZXR1cm4gY2FjaGVkO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdpbWcnICk7XG5cblx0XHRpbWFnZS5hZGRFdmVudExpc3RlbmVyKCAnbG9hZCcsIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Q2FjaGUuYWRkKCB1cmwsIHRoaXMgKTtcblxuXHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRoaXMgKTtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdH0sIGZhbHNlICk7XG5cblx0XHQvKlxuXHRcdGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoICdwcm9ncmVzcycsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRcdGlmICggb25Qcm9ncmVzcyApIG9uUHJvZ3Jlc3MoIGV2ZW50ICk7XG5cblx0XHR9LCBmYWxzZSApO1xuXHRcdCovXG5cblx0XHRpbWFnZS5hZGRFdmVudExpc3RlbmVyKCAnZXJyb3InLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0XHRpZiAoIG9uRXJyb3IgKSBvbkVycm9yKCBldmVudCApO1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0fSwgZmFsc2UgKTtcblxuXHRcdGlmICggdXJsLnN1YnN0ciggMCwgNSApICE9PSAnZGF0YTonICkge1xuXG5cdFx0XHRpZiAoIHRoaXMuY3Jvc3NPcmlnaW4gIT09IHVuZGVmaW5lZCApIGltYWdlLmNyb3NzT3JpZ2luID0gdGhpcy5jcm9zc09yaWdpbjtcblxuXHRcdH1cblxuXHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcblxuXHRcdGltYWdlLnNyYyA9IHVybDtcblxuXHRcdHJldHVybiBpbWFnZTtcblxuXHR9LFxuXG5cdHNldENyb3NzT3JpZ2luOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5jcm9zc09yaWdpbiA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQ3ViZVRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQ3ViZVRleHR1cmVMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmxzLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgdGV4dHVyZSA9IG5ldyBDdWJlVGV4dHVyZSgpO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXG5cdFx0dmFyIGxvYWRlZCA9IDA7XG5cblx0XHRmdW5jdGlvbiBsb2FkVGV4dHVyZSggaSApIHtcblxuXHRcdFx0bG9hZGVyLmxvYWQoIHVybHNbIGkgXSwgZnVuY3Rpb24gKCBpbWFnZSApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLmltYWdlc1sgaSBdID0gaW1hZ2U7XG5cblx0XHRcdFx0bG9hZGVkICsrO1xuXG5cdFx0XHRcdGlmICggbG9hZGVkID09PSA2ICkge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggdGV4dHVyZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSwgdW5kZWZpbmVkLCBvbkVycm9yICk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgKysgaSApIHtcblxuXHRcdFx0bG9hZFRleHR1cmUoIGkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH0sXG5cblx0c2V0Q3Jvc3NPcmlnaW46IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmNyb3NzT3JpZ2luID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYXRoID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFRleHR1cmVMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoIHRoaXMubWFuYWdlciApO1xuXHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xuXHRcdGxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTtcblxuXHRcdHZhciB0ZXh0dXJlID0gbmV3IFRleHR1cmUoKTtcblx0XHR0ZXh0dXJlLmltYWdlID0gbG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCkge1xuXG5cdFx0XHQvLyBKUEVHcyBjYW4ndCBoYXZlIGFuIGFscGhhIGNoYW5uZWwsIHNvIG1lbW9yeSBjYW4gYmUgc2F2ZWQgYnkgc3RvcmluZyB0aGVtIGFzIFJHQi5cblx0XHRcdHZhciBpc0pQRUcgPSB1cmwuc2VhcmNoKCAvXFwuKGpwZ3xqcGVnKSQvICkgPiAwIHx8IHVybC5zZWFyY2goIC9eZGF0YVxcOmltYWdlXFwvanBlZy8gKSA9PT0gMDtcblxuXHRcdFx0dGV4dHVyZS5mb3JtYXQgPSBpc0pQRUcgPyBSR0JGb3JtYXQgOiBSR0JBRm9ybWF0O1xuXHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdGlmICggb25Mb2FkICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0b25Mb2FkKCB0ZXh0dXJlICk7XG5cblx0XHRcdH1cblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH0sXG5cblx0c2V0Q3Jvc3NPcmlnaW46IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmNyb3NzT3JpZ2luID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYXRoID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gTGlnaHQoIGNvbG9yLCBpbnRlbnNpdHkgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMaWdodCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggY29sb3IgKTtcblx0dGhpcy5pbnRlbnNpdHkgPSBpbnRlbnNpdHkgIT09IHVuZGVmaW5lZCA/IGludGVuc2l0eSA6IDE7XG5cblx0dGhpcy5yZWNlaXZlU2hhZG93ID0gdW5kZWZpbmVkO1xuXG59XG5cbkxpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExpZ2h0LFxuXG5cdGlzTGlnaHQ6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cdFx0dGhpcy5pbnRlbnNpdHkgPSBzb3VyY2UuaW50ZW5zaXR5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRcdHZhciBkYXRhID0gT2JqZWN0M0QucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7XG5cblx0XHRkYXRhLm9iamVjdC5jb2xvciA9IHRoaXMuY29sb3IuZ2V0SGV4KCk7XG5cdFx0ZGF0YS5vYmplY3QuaW50ZW5zaXR5ID0gdGhpcy5pbnRlbnNpdHk7XG5cblx0XHRpZiAoIHRoaXMuZ3JvdW5kQ29sb3IgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0Lmdyb3VuZENvbG9yID0gdGhpcy5ncm91bmRDb2xvci5nZXRIZXgoKTtcblxuXHRcdGlmICggdGhpcy5kaXN0YW5jZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QuZGlzdGFuY2UgPSB0aGlzLmRpc3RhbmNlO1xuXHRcdGlmICggdGhpcy5hbmdsZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QuYW5nbGUgPSB0aGlzLmFuZ2xlO1xuXHRcdGlmICggdGhpcy5kZWNheSAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QuZGVjYXkgPSB0aGlzLmRlY2F5O1xuXHRcdGlmICggdGhpcy5wZW51bWJyYSAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QucGVudW1icmEgPSB0aGlzLnBlbnVtYnJhO1xuXG5cdFx0aWYgKCB0aGlzLnNoYWRvdyAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3Quc2hhZG93ID0gdGhpcy5zaGFkb3cudG9KU09OKCk7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEhlbWlzcGhlcmVMaWdodCggc2t5Q29sb3IsIGdyb3VuZENvbG9yLCBpbnRlbnNpdHkgKSB7XG5cblx0TGlnaHQuY2FsbCggdGhpcywgc2t5Q29sb3IsIGludGVuc2l0eSApO1xuXG5cdHRoaXMudHlwZSA9ICdIZW1pc3BoZXJlTGlnaHQnO1xuXG5cdHRoaXMuY2FzdFNoYWRvdyA9IHVuZGVmaW5lZDtcblxuXHR0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNELkRlZmF1bHRVcCApO1xuXHR0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdHRoaXMuZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IoIGdyb3VuZENvbG9yICk7XG5cbn1cblxuSGVtaXNwaGVyZUxpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEhlbWlzcGhlcmVMaWdodCxcblxuXHRpc0hlbWlzcGhlcmVMaWdodDogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdExpZ2h0LnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5ncm91bmRDb2xvci5jb3B5KCBzb3VyY2UuZ3JvdW5kQ29sb3IgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gTGlnaHRTaGFkb3coIGNhbWVyYSApIHtcblxuXHR0aGlzLmNhbWVyYSA9IGNhbWVyYTtcblxuXHR0aGlzLmJpYXMgPSAwO1xuXHR0aGlzLnJhZGl1cyA9IDE7XG5cblx0dGhpcy5tYXBTaXplID0gbmV3IFZlY3RvcjIoIDUxMiwgNTEyICk7XG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXHR0aGlzLm1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggTGlnaHRTaGFkb3cucHJvdG90eXBlLCB7XG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLmNhbWVyYSA9IHNvdXJjZS5jYW1lcmEuY2xvbmUoKTtcblxuXHRcdHRoaXMuYmlhcyA9IHNvdXJjZS5iaWFzO1xuXHRcdHRoaXMucmFkaXVzID0gc291cmNlLnJhZGl1cztcblxuXHRcdHRoaXMubWFwU2l6ZS5jb3B5KCBzb3VyY2UubWFwU2l6ZSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb2JqZWN0ID0ge307XG5cblx0XHRpZiAoIHRoaXMuYmlhcyAhPT0gMCApIG9iamVjdC5iaWFzID0gdGhpcy5iaWFzO1xuXHRcdGlmICggdGhpcy5yYWRpdXMgIT09IDEgKSBvYmplY3QucmFkaXVzID0gdGhpcy5yYWRpdXM7XG5cdFx0aWYgKCB0aGlzLm1hcFNpemUueCAhPT0gNTEyIHx8IHRoaXMubWFwU2l6ZS55ICE9PSA1MTIgKSBvYmplY3QubWFwU2l6ZSA9IHRoaXMubWFwU2l6ZS50b0FycmF5KCk7XG5cblx0XHRvYmplY3QuY2FtZXJhID0gdGhpcy5jYW1lcmEudG9KU09OKCBmYWxzZSApLm9iamVjdDtcblx0XHRkZWxldGUgb2JqZWN0LmNhbWVyYS5tYXRyaXg7XG5cblx0XHRyZXR1cm4gb2JqZWN0O1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gU3BvdExpZ2h0U2hhZG93KCkge1xuXG5cdExpZ2h0U2hhZG93LmNhbGwoIHRoaXMsIG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggNTAsIDEsIDAuNSwgNTAwICkgKTtcblxufVxuXG5TcG90TGlnaHRTaGFkb3cucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHRTaGFkb3cucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogU3BvdExpZ2h0U2hhZG93LFxuXG5cdGlzU3BvdExpZ2h0U2hhZG93OiB0cnVlLFxuXG5cdHVwZGF0ZTogZnVuY3Rpb24gKCBsaWdodCApIHtcblxuXHRcdHZhciBjYW1lcmEgPSB0aGlzLmNhbWVyYTtcblxuXHRcdHZhciBmb3YgPSBfTWF0aC5SQUQyREVHICogMiAqIGxpZ2h0LmFuZ2xlO1xuXHRcdHZhciBhc3BlY3QgPSB0aGlzLm1hcFNpemUud2lkdGggLyB0aGlzLm1hcFNpemUuaGVpZ2h0O1xuXHRcdHZhciBmYXIgPSBsaWdodC5kaXN0YW5jZSB8fCBjYW1lcmEuZmFyO1xuXG5cdFx0aWYgKCBmb3YgIT09IGNhbWVyYS5mb3YgfHwgYXNwZWN0ICE9PSBjYW1lcmEuYXNwZWN0IHx8IGZhciAhPT0gY2FtZXJhLmZhciApIHtcblxuXHRcdFx0Y2FtZXJhLmZvdiA9IGZvdjtcblx0XHRcdGNhbWVyYS5hc3BlY3QgPSBhc3BlY3Q7XG5cdFx0XHRjYW1lcmEuZmFyID0gZmFyO1xuXHRcdFx0Y2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIFNwb3RMaWdodCggY29sb3IsIGludGVuc2l0eSwgZGlzdGFuY2UsIGFuZ2xlLCBwZW51bWJyYSwgZGVjYXkgKSB7XG5cblx0TGlnaHQuY2FsbCggdGhpcywgY29sb3IsIGludGVuc2l0eSApO1xuXG5cdHRoaXMudHlwZSA9ICdTcG90TGlnaHQnO1xuXG5cdHRoaXMucG9zaXRpb24uY29weSggT2JqZWN0M0QuRGVmYXVsdFVwICk7XG5cdHRoaXMudXBkYXRlTWF0cml4KCk7XG5cblx0dGhpcy50YXJnZXQgPSBuZXcgT2JqZWN0M0QoKTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdwb3dlcicsIHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdC8vIGludGVuc2l0eSA9IHBvd2VyIHBlciBzb2xpZCBhbmdsZS5cblx0XHRcdC8vIHJlZjogZXF1YXRpb24gKDE3KSBmcm9tIGh0dHA6Ly93d3cuZnJvc3RiaXRlLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAxNC8xMS9jb3Vyc2Vfbm90ZXNfbW92aW5nX2Zyb3N0Yml0ZV90b19wYnIucGRmXG5cdFx0XHRyZXR1cm4gdGhpcy5pbnRlbnNpdHkgKiBNYXRoLlBJO1xuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHBvd2VyICkge1xuXHRcdFx0Ly8gaW50ZW5zaXR5ID0gcG93ZXIgcGVyIHNvbGlkIGFuZ2xlLlxuXHRcdFx0Ly8gcmVmOiBlcXVhdGlvbiAoMTcpIGZyb20gaHR0cDovL3d3dy5mcm9zdGJpdGUuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE0LzExL2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3RvX3Bici5wZGZcblx0XHRcdHRoaXMuaW50ZW5zaXR5ID0gcG93ZXIgLyBNYXRoLlBJO1xuXHRcdH1cblx0fSApO1xuXG5cdHRoaXMuZGlzdGFuY2UgPSAoIGRpc3RhbmNlICE9PSB1bmRlZmluZWQgKSA/IGRpc3RhbmNlIDogMDtcblx0dGhpcy5hbmdsZSA9ICggYW5nbGUgIT09IHVuZGVmaW5lZCApID8gYW5nbGUgOiBNYXRoLlBJIC8gMztcblx0dGhpcy5wZW51bWJyYSA9ICggcGVudW1icmEgIT09IHVuZGVmaW5lZCApID8gcGVudW1icmEgOiAwO1xuXHR0aGlzLmRlY2F5ID0gKCBkZWNheSAhPT0gdW5kZWZpbmVkICkgPyBkZWNheSA6IDE7XHQvLyBmb3IgcGh5c2ljYWxseSBjb3JyZWN0IGxpZ2h0cywgc2hvdWxkIGJlIDIuXG5cblx0dGhpcy5zaGFkb3cgPSBuZXcgU3BvdExpZ2h0U2hhZG93KCk7XG5cbn1cblxuU3BvdExpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFNwb3RMaWdodCxcblxuXHRpc1Nwb3RMaWdodDogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdExpZ2h0LnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5kaXN0YW5jZSA9IHNvdXJjZS5kaXN0YW5jZTtcblx0XHR0aGlzLmFuZ2xlID0gc291cmNlLmFuZ2xlO1xuXHRcdHRoaXMucGVudW1icmEgPSBzb3VyY2UucGVudW1icmE7XG5cdFx0dGhpcy5kZWNheSA9IHNvdXJjZS5kZWNheTtcblxuXHRcdHRoaXMudGFyZ2V0ID0gc291cmNlLnRhcmdldC5jbG9uZSgpO1xuXG5cdFx0dGhpcy5zaGFkb3cgPSBzb3VyY2Uuc2hhZG93LmNsb25lKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cblxuZnVuY3Rpb24gUG9pbnRMaWdodCggY29sb3IsIGludGVuc2l0eSwgZGlzdGFuY2UsIGRlY2F5ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnUG9pbnRMaWdodCc7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAncG93ZXInLCB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHQvLyBpbnRlbnNpdHkgPSBwb3dlciBwZXIgc29saWQgYW5nbGUuXG5cdFx0XHQvLyByZWY6IGVxdWF0aW9uICgxNSkgZnJvbSBodHRwOi8vd3d3LmZyb3N0Yml0ZS5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMTQvMTEvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyLnBkZlxuXHRcdFx0cmV0dXJuIHRoaXMuaW50ZW5zaXR5ICogNCAqIE1hdGguUEk7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCBwb3dlciApIHtcblx0XHRcdC8vIGludGVuc2l0eSA9IHBvd2VyIHBlciBzb2xpZCBhbmdsZS5cblx0XHRcdC8vIHJlZjogZXF1YXRpb24gKDE1KSBmcm9tIGh0dHA6Ly93d3cuZnJvc3RiaXRlLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAxNC8xMS9jb3Vyc2Vfbm90ZXNfbW92aW5nX2Zyb3N0Yml0ZV90b19wYnIucGRmXG5cdFx0XHR0aGlzLmludGVuc2l0eSA9IHBvd2VyIC8gKCA0ICogTWF0aC5QSSApO1xuXHRcdH1cblx0fSApO1xuXG5cdHRoaXMuZGlzdGFuY2UgPSAoIGRpc3RhbmNlICE9PSB1bmRlZmluZWQgKSA/IGRpc3RhbmNlIDogMDtcblx0dGhpcy5kZWNheSA9ICggZGVjYXkgIT09IHVuZGVmaW5lZCApID8gZGVjYXkgOiAxO1x0Ly8gZm9yIHBoeXNpY2FsbHkgY29ycmVjdCBsaWdodHMsIHNob3VsZCBiZSAyLlxuXG5cdHRoaXMuc2hhZG93ID0gbmV3IExpZ2h0U2hhZG93KCBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIDkwLCAxLCAwLjUsIDUwMCApICk7XG5cbn1cblxuUG9pbnRMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBQb2ludExpZ2h0LFxuXG5cdGlzUG9pbnRMaWdodDogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdExpZ2h0LnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5kaXN0YW5jZSA9IHNvdXJjZS5kaXN0YW5jZTtcblx0XHR0aGlzLmRlY2F5ID0gc291cmNlLmRlY2F5O1xuXG5cdFx0dGhpcy5zaGFkb3cgPSBzb3VyY2Uuc2hhZG93LmNsb25lKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIERpcmVjdGlvbmFsTGlnaHRTaGFkb3coICkge1xuXG5cdExpZ2h0U2hhZG93LmNhbGwoIHRoaXMsIG5ldyBPcnRob2dyYXBoaWNDYW1lcmEoIC0gNSwgNSwgNSwgLSA1LCAwLjUsIDUwMCApICk7XG5cbn1cblxuRGlyZWN0aW9uYWxMaWdodFNoYWRvdy5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodFNoYWRvdy5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBEaXJlY3Rpb25hbExpZ2h0U2hhZG93XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBEaXJlY3Rpb25hbExpZ2h0KCBjb2xvciwgaW50ZW5zaXR5ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnRGlyZWN0aW9uYWxMaWdodCc7XG5cblx0dGhpcy5wb3NpdGlvbi5jb3B5KCBPYmplY3QzRC5EZWZhdWx0VXAgKTtcblx0dGhpcy51cGRhdGVNYXRyaXgoKTtcblxuXHR0aGlzLnRhcmdldCA9IG5ldyBPYmplY3QzRCgpO1xuXG5cdHRoaXMuc2hhZG93ID0gbmV3IERpcmVjdGlvbmFsTGlnaHRTaGFkb3coKTtcblxufVxuXG5EaXJlY3Rpb25hbExpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IERpcmVjdGlvbmFsTGlnaHQsXG5cblx0aXNEaXJlY3Rpb25hbExpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0TGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLnRhcmdldCA9IHNvdXJjZS50YXJnZXQuY2xvbmUoKTtcblxuXHRcdHRoaXMuc2hhZG93ID0gc291cmNlLnNoYWRvdy5jbG9uZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBBbWJpZW50TGlnaHQoIGNvbG9yLCBpbnRlbnNpdHkgKSB7XG5cblx0TGlnaHQuY2FsbCggdGhpcywgY29sb3IsIGludGVuc2l0eSApO1xuXG5cdHRoaXMudHlwZSA9ICdBbWJpZW50TGlnaHQnO1xuXG5cdHRoaXMuY2FzdFNoYWRvdyA9IHVuZGVmaW5lZDtcblxufVxuXG5BbWJpZW50TGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQW1iaWVudExpZ2h0LFxuXG5cdGlzQW1iaWVudExpZ2h0OiB0cnVlXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFiZWxuYXRpb24gLyBodHRwOi8vZ2l0aHViLmNvbS9hYmVsbmF0aW9uXG4gKi9cblxuZnVuY3Rpb24gUmVjdEFyZWFMaWdodCggY29sb3IsIGludGVuc2l0eSwgd2lkdGgsIGhlaWdodCApIHtcblxuXHRMaWdodC5jYWxsKCB0aGlzLCBjb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0dGhpcy50eXBlID0gJ1JlY3RBcmVhTGlnaHQnO1xuXG5cdHRoaXMucG9zaXRpb24uc2V0KCAwLCAxLCAwICk7XG5cdHRoaXMudXBkYXRlTWF0cml4KCk7XG5cblx0dGhpcy53aWR0aCA9ICggd2lkdGggIT09IHVuZGVmaW5lZCApID8gd2lkdGggOiAxMDtcblx0dGhpcy5oZWlnaHQgPSAoIGhlaWdodCAhPT0gdW5kZWZpbmVkICkgPyBoZWlnaHQgOiAxMDtcblxuXHQvLyBUT0RPIChhYmVsbmF0aW9uKTogZGlzdGFuY2UvZGVjYXlcblxuXHQvLyBUT0RPIChhYmVsbmF0aW9uKTogdXBkYXRlIG1ldGhvZCBmb3IgUmVjdEFyZWFMaWdodCB0byB1cGRhdGUgdHJhbnNmb3JtIHRvIGxvb2thdCB0YXJnZXRcblxuXHQvLyBUT0RPIChhYmVsbmF0aW9uKTogc2hhZG93c1xuXG59XG5cbi8vIFRPRE8gKGFiZWxuYXRpb24pOiBSZWN0QXJlYUxpZ2h0IHVwZGF0ZSB3aGVuIGxpZ2h0IHNoYXBlIGlzIGNoYW5nZWRcblJlY3RBcmVhTGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogUmVjdEFyZWFMaWdodCxcblxuXHRpc1JlY3RBcmVhTGlnaHQ6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMud2lkdGggPSBzb3VyY2Uud2lkdGg7XG5cdFx0dGhpcy5oZWlnaHQgPSBzb3VyY2UuaGVpZ2h0O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRcdHZhciBkYXRhID0gTGlnaHQucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7XG5cblx0XHRkYXRhLm9iamVjdC53aWR0aCA9IHRoaXMud2lkdGg7XG5cdFx0ZGF0YS5vYmplY3QuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKi9cblxudmFyIEFuaW1hdGlvblV0aWxzID0ge1xuXG5cdC8vIHNhbWUgYXMgQXJyYXkucHJvdG90eXBlLnNsaWNlLCBidXQgYWxzbyB3b3JrcyBvbiB0eXBlZCBhcnJheXNcblx0YXJyYXlTbGljZTogZnVuY3Rpb24gKCBhcnJheSwgZnJvbSwgdG8gKSB7XG5cblx0XHRpZiAoIEFuaW1hdGlvblV0aWxzLmlzVHlwZWRBcnJheSggYXJyYXkgKSApIHtcblxuXHRcdFx0Ly8gaW4gaW9zOSBhcnJheS5zdWJhcnJheShmcm9tLCB1bmRlZmluZWQpIHdpbGwgcmV0dXJuIGVtcHR5IGFycmF5XG5cdFx0XHQvLyBidXQgYXJyYXkuc3ViYXJyYXkoZnJvbSkgb3IgYXJyYXkuc3ViYXJyYXkoZnJvbSwgbGVuKSBpcyBjb3JyZWN0XG5cdFx0XHRyZXR1cm4gbmV3IGFycmF5LmNvbnN0cnVjdG9yKCBhcnJheS5zdWJhcnJheSggZnJvbSwgdG8gIT09IHVuZGVmaW5lZCA/IHRvIDogYXJyYXkubGVuZ3RoICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBhcnJheS5zbGljZSggZnJvbSwgdG8gKTtcblxuXHR9LFxuXG5cdC8vIGNvbnZlcnRzIGFuIGFycmF5IHRvIGEgc3BlY2lmaWMgdHlwZVxuXHRjb252ZXJ0QXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIHR5cGUsIGZvcmNlQ2xvbmUgKSB7XG5cblx0XHRpZiAoICEgYXJyYXkgfHwgLy8gbGV0ICd1bmRlZmluZWQnIGFuZCAnbnVsbCcgcGFzc1xuXHRcdFx0XHQhIGZvcmNlQ2xvbmUgJiYgYXJyYXkuY29uc3RydWN0b3IgPT09IHR5cGUgKSByZXR1cm4gYXJyYXk7XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlLkJZVEVTX1BFUl9FTEVNRU5UID09PSAnbnVtYmVyJyApIHtcblxuXHRcdFx0cmV0dXJuIG5ldyB0eXBlKCBhcnJheSApOyAvLyBjcmVhdGUgdHlwZWQgYXJyYXlcblxuXHRcdH1cblxuXHRcdHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJyYXkgKTsgLy8gY3JlYXRlIEFycmF5XG5cblx0fSxcblxuXHRpc1R5cGVkQXJyYXk6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyggb2JqZWN0ICkgJiZcblx0XHRcdFx0ISAoIG9iamVjdCBpbnN0YW5jZW9mIERhdGFWaWV3ICk7XG5cblx0fSxcblxuXHQvLyByZXR1cm5zIGFuIGFycmF5IGJ5IHdoaWNoIHRpbWVzIGFuZCB2YWx1ZXMgY2FuIGJlIHNvcnRlZFxuXHRnZXRLZXlmcmFtZU9yZGVyOiBmdW5jdGlvbiAoIHRpbWVzICkge1xuXG5cdFx0ZnVuY3Rpb24gY29tcGFyZVRpbWUoIGksIGogKSB7XG5cblx0XHRcdHJldHVybiB0aW1lc1sgaSBdIC0gdGltZXNbIGogXTtcblxuXHRcdH1cblxuXHRcdHZhciBuID0gdGltZXMubGVuZ3RoO1xuXHRcdHZhciByZXN1bHQgPSBuZXcgQXJyYXkoIG4gKTtcblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG47ICsrIGkgKSByZXN1bHRbIGkgXSA9IGk7XG5cblx0XHRyZXN1bHQuc29ydCggY29tcGFyZVRpbWUgKTtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fSxcblxuXHQvLyB1c2VzIHRoZSBhcnJheSBwcmV2aW91c2x5IHJldHVybmVkIGJ5ICdnZXRLZXlmcmFtZU9yZGVyJyB0byBzb3J0IGRhdGFcblx0c29ydGVkQXJyYXk6IGZ1bmN0aW9uICggdmFsdWVzLCBzdHJpZGUsIG9yZGVyICkge1xuXG5cdFx0dmFyIG5WYWx1ZXMgPSB2YWx1ZXMubGVuZ3RoO1xuXHRcdHZhciByZXN1bHQgPSBuZXcgdmFsdWVzLmNvbnN0cnVjdG9yKCBuVmFsdWVzICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGRzdE9mZnNldCA9IDA7IGRzdE9mZnNldCAhPT0gblZhbHVlczsgKysgaSApIHtcblxuXHRcdFx0dmFyIHNyY09mZnNldCA9IG9yZGVyWyBpIF0gKiBzdHJpZGU7XG5cblx0XHRcdGZvciAoIHZhciBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqICkge1xuXG5cdFx0XHRcdHJlc3VsdFsgZHN0T2Zmc2V0ICsrIF0gPSB2YWx1ZXNbIHNyY09mZnNldCArIGogXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9LFxuXG5cdC8vIGZ1bmN0aW9uIGZvciBwYXJzaW5nIEFPUyBrZXlmcmFtZSBmb3JtYXRzXG5cdGZsYXR0ZW5KU09OOiBmdW5jdGlvbiAoIGpzb25LZXlzLCB0aW1lcywgdmFsdWVzLCB2YWx1ZVByb3BlcnR5TmFtZSApIHtcblxuXHRcdHZhciBpID0gMSwga2V5ID0ganNvbktleXNbIDAgXTtcblxuXHRcdHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgJiYga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGtleSA9IGpzb25LZXlzWyBpICsrIF07XG5cblx0XHR9XG5cblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuOyAvLyBubyBkYXRhXG5cblx0XHR2YXIgdmFsdWUgPSBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF07XG5cdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuOyAvLyBubyBkYXRhXG5cblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cblx0XHRcdGRvIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aW1lcy5wdXNoKCBrZXkudGltZSApO1xuXHRcdFx0XHRcdHZhbHVlcy5wdXNoLmFwcGx5KCB2YWx1ZXMsIHZhbHVlICk7IC8vIHB1c2ggYWxsIGVsZW1lbnRzXG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGtleSA9IGpzb25LZXlzWyBpICsrIF07XG5cblx0XHRcdH0gd2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCApO1xuXG5cdFx0fSBlbHNlIGlmICggdmFsdWUudG9BcnJheSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyAuLi5hc3N1bWUgVEhSRUUuTWF0aC1pc2hcblxuXHRcdFx0ZG8ge1xuXG5cdFx0XHRcdHZhbHVlID0ga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRpbWVzLnB1c2goIGtleS50aW1lICk7XG5cdFx0XHRcdFx0dmFsdWUudG9BcnJheSggdmFsdWVzLCB2YWx1ZXMubGVuZ3RoICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGtleSA9IGpzb25LZXlzWyBpICsrIF07XG5cblx0XHRcdH0gd2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gb3RoZXJ3aXNlIHB1c2ggYXMtaXNcblxuXHRcdFx0ZG8ge1xuXG5cdFx0XHRcdHZhbHVlID0ga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRpbWVzLnB1c2goIGtleS50aW1lICk7XG5cdFx0XHRcdFx0dmFsdWVzLnB1c2goIHZhbHVlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGtleSA9IGpzb25LZXlzWyBpICsrIF07XG5cblx0XHRcdH0gd2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCApO1xuXG5cdFx0fVxuXG5cdH1cblxufTtcblxuLyoqXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIG9mIGludGVycG9sYW50cyBvdmVyIHBhcmFtZXRyaWMgc2FtcGxlcy5cbiAqXG4gKiBUaGUgcGFyYW1ldGVyIGRvbWFpbiBpcyBvbmUgZGltZW5zaW9uYWwsIHR5cGljYWxseSB0aGUgdGltZSBvciBhIHBhdGhcbiAqIGFsb25nIGEgY3VydmUgZGVmaW5lZCBieSB0aGUgZGF0YS5cbiAqXG4gKiBUaGUgc2FtcGxlIHZhbHVlcyBjYW4gaGF2ZSBhbnkgZGltZW5zaW9uYWxpdHkgYW5kIGRlcml2ZWQgY2xhc3NlcyBtYXlcbiAqIGFwcGx5IHNwZWNpYWwgaW50ZXJwcmV0YXRpb25zIHRvIHRoZSBkYXRhLlxuICpcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIGludGVydmFsIHNlZWsgaW4gYSBUZW1wbGF0ZSBNZXRob2QsIGRlZmVycmluZ1xuICogdGhlIGFjdHVhbCBpbnRlcnBvbGF0aW9uIHRvIGRlcml2ZWQgY2xhc3Nlcy5cbiAqXG4gKiBUaW1lIGNvbXBsZXhpdHkgaXMgTygxKSBmb3IgbGluZWFyIGFjY2VzcyBjcm9zc2luZyBhdCBtb3N0IHR3byBwb2ludHNcbiAqIGFuZCBPKGxvZyBOKSBmb3IgcmFuZG9tIGFjY2Vzcywgd2hlcmUgTiBpcyB0aGUgbnVtYmVyIG9mIHBvc2l0aW9ucy5cbiAqXG4gKiBSZWZlcmVuY2VzOlxuICpcbiAqIFx0XHRodHRwOi8vd3d3Lm9vZGVzaWduLmNvbS90ZW1wbGF0ZS1tZXRob2QtcGF0dGVybi5odG1sXG4gKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIEludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkge1xuXG5cdHRoaXMucGFyYW1ldGVyUG9zaXRpb25zID0gcGFyYW1ldGVyUG9zaXRpb25zO1xuXHR0aGlzLl9jYWNoZWRJbmRleCA9IDA7XG5cblx0dGhpcy5yZXN1bHRCdWZmZXIgPSByZXN1bHRCdWZmZXIgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRyZXN1bHRCdWZmZXIgOiBuZXcgc2FtcGxlVmFsdWVzLmNvbnN0cnVjdG9yKCBzYW1wbGVTaXplICk7XG5cdHRoaXMuc2FtcGxlVmFsdWVzID0gc2FtcGxlVmFsdWVzO1xuXHR0aGlzLnZhbHVlU2l6ZSA9IHNhbXBsZVNpemU7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggSW50ZXJwb2xhbnQucHJvdG90eXBlLCB7XG5cblx0ZXZhbHVhdGU6IGZ1bmN0aW9uKCB0ICkge1xuXG5cdFx0dmFyIHBwID0gdGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMsXG5cdFx0XHRpMSA9IHRoaXMuX2NhY2hlZEluZGV4LFxuXG5cdFx0XHR0MSA9IHBwWyAgIGkxICAgXSxcblx0XHRcdHQwID0gcHBbIGkxIC0gMSBdO1xuXG5cdFx0dmFsaWRhdGVfaW50ZXJ2YWw6IHtcblxuXHRcdFx0c2Vlazoge1xuXG5cdFx0XHRcdHZhciByaWdodDtcblxuXHRcdFx0XHRsaW5lYXJfc2Nhbjoge1xuXHRcdFx0XHRcdC8vLSBTZWUgaHR0cDovL2pzcGVyZi5jb20vY29tcGFyaXNvbi10by11bmRlZmluZWQvM1xuXHRcdFx0XHRcdC8vLSBzbG93ZXIgY29kZTpcblx0XHRcdFx0XHQvLy1cblx0XHRcdFx0XHQvLy0gXHRcdFx0XHRpZiAoIHQgPj0gdDEgfHwgdDEgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRmb3J3YXJkX3NjYW46IGlmICggISAoIHQgPCB0MSApICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgZ2l2ZVVwQXQgPSBpMSArIDI7IDspIHtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHQxID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoIHQgPCB0MCApIGJyZWFrIGZvcndhcmRfc2NhbjtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIGFmdGVyIGVuZFxuXG5cdFx0XHRcdFx0XHRcdFx0aTEgPSBwcC5sZW5ndGg7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSBpMTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5hZnRlckVuZF8oIGkxIC0gMSwgdCwgdDAgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBpMSA9PT0gZ2l2ZVVwQXQgKSBicmVhazsgLy8gdGhpcyBsb29wXG5cblx0XHRcdFx0XHRcdFx0dDAgPSB0MTtcblx0XHRcdFx0XHRcdFx0dDEgPSBwcFsgKysgaTEgXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHQgPCB0MSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIHdlIGhhdmUgYXJyaXZlZCBhdCB0aGUgc291Z2h0IGludGVydmFsXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWsgc2VlaztcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gcHJlcGFyZSBiaW5hcnkgc2VhcmNoIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBpbmRleFxuXHRcdFx0XHRcdFx0cmlnaHQgPSBwcC5sZW5ndGg7XG5cdFx0XHRcdFx0XHRicmVhayBsaW5lYXJfc2NhbjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vLSBzbG93ZXIgY29kZTpcblx0XHRcdFx0XHQvLy1cdFx0XHRcdFx0aWYgKCB0IDwgdDAgfHwgdDAgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRpZiAoICEgKCB0ID49IHQwICkgKSB7XG5cblx0XHRcdFx0XHRcdC8vIGxvb3Bpbmc/XG5cblx0XHRcdFx0XHRcdHZhciB0MWdsb2JhbCA9IHBwWyAxIF07XG5cblx0XHRcdFx0XHRcdGlmICggdCA8IHQxZ2xvYmFsICkge1xuXG5cdFx0XHRcdFx0XHRcdGkxID0gMjsgLy8gKyAxLCB1c2luZyB0aGUgc2NhbiBmb3IgdGhlIGRldGFpbHNcblx0XHRcdFx0XHRcdFx0dDAgPSB0MWdsb2JhbDtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBsaW5lYXIgcmV2ZXJzZSBzY2FuXG5cblx0XHRcdFx0XHRcdGZvciAoIHZhciBnaXZlVXBBdCA9IGkxIC0gMjsgOykge1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdDAgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIGJlZm9yZSBzdGFydFxuXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSAwO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLmJlZm9yZVN0YXJ0XyggMCwgdCwgdDEgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBpMSA9PT0gZ2l2ZVVwQXQgKSBicmVhazsgLy8gdGhpcyBsb29wXG5cblx0XHRcdFx0XHRcdFx0dDEgPSB0MDtcblx0XHRcdFx0XHRcdFx0dDAgPSBwcFsgLS0gaTEgLSAxIF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0ID49IHQwICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gd2UgaGF2ZSBhcnJpdmVkIGF0IHRoZSBzb3VnaHQgaW50ZXJ2YWxcblx0XHRcdFx0XHRcdFx0XHRicmVhayBzZWVrO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBwcmVwYXJlIGJpbmFyeSBzZWFyY2ggb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgaW5kZXhcblx0XHRcdFx0XHRcdHJpZ2h0ID0gaTE7XG5cdFx0XHRcdFx0XHRpMSA9IDA7XG5cdFx0XHRcdFx0XHRicmVhayBsaW5lYXJfc2NhbjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIHRoZSBpbnRlcnZhbCBpcyB2YWxpZFxuXG5cdFx0XHRcdFx0YnJlYWsgdmFsaWRhdGVfaW50ZXJ2YWw7XG5cblx0XHRcdFx0fSAvLyBsaW5lYXIgc2NhblxuXG5cdFx0XHRcdC8vIGJpbmFyeSBzZWFyY2hcblxuXHRcdFx0XHR3aGlsZSAoIGkxIDwgcmlnaHQgKSB7XG5cblx0XHRcdFx0XHR2YXIgbWlkID0gKCBpMSArIHJpZ2h0ICkgPj4+IDE7XG5cblx0XHRcdFx0XHRpZiAoIHQgPCBwcFsgbWlkIF0gKSB7XG5cblx0XHRcdFx0XHRcdHJpZ2h0ID0gbWlkO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0aTEgPSBtaWQgKyAxO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0MSA9IHBwWyAgIGkxICAgXTtcblx0XHRcdFx0dDAgPSBwcFsgaTEgLSAxIF07XG5cblx0XHRcdFx0Ly8gY2hlY2sgYm91bmRhcnkgY2FzZXMsIGFnYWluXG5cblx0XHRcdFx0aWYgKCB0MCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSAwO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmJlZm9yZVN0YXJ0XyggMCwgdCwgdDEgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCB0MSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0aTEgPSBwcC5sZW5ndGg7XG5cdFx0XHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSBpMTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5hZnRlckVuZF8oIGkxIC0gMSwgdDAsIHQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gLy8gc2Vla1xuXG5cdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IGkxO1xuXG5cdFx0XHR0aGlzLmludGVydmFsQ2hhbmdlZF8oIGkxLCB0MCwgdDEgKTtcblxuXHRcdH0gLy8gdmFsaWRhdGVfaW50ZXJ2YWxcblxuXHRcdHJldHVybiB0aGlzLmludGVycG9sYXRlXyggaTEsIHQwLCB0LCB0MSApO1xuXG5cdH0sXG5cblx0c2V0dGluZ3M6IG51bGwsIC8vIG9wdGlvbmFsLCBzdWJjbGFzcy1zcGVjaWZpYyBzZXR0aW5ncyBzdHJ1Y3R1cmVcblx0Ly8gTm90ZTogVGhlIGluZGlyZWN0aW9uIGFsbG93cyBjZW50cmFsIGNvbnRyb2wgb2YgbWFueSBpbnRlcnBvbGFudHMuXG5cblx0Ly8gLS0tIFByb3RlY3RlZCBpbnRlcmZhY2VcblxuXHREZWZhdWx0U2V0dGluZ3NfOiB7fSxcblxuXHRnZXRTZXR0aW5nc186IGZ1bmN0aW9uKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0dGluZ3MgfHwgdGhpcy5EZWZhdWx0U2V0dGluZ3NfO1xuXG5cdH0sXG5cblx0Y29weVNhbXBsZVZhbHVlXzogZnVuY3Rpb24oIGluZGV4ICkge1xuXG5cdFx0Ly8gY29waWVzIGEgc2FtcGxlIHZhbHVlIHRvIHRoZSByZXN1bHQgYnVmZmVyXG5cblx0XHR2YXIgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcyxcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxuXHRcdFx0b2Zmc2V0ID0gaW5kZXggKiBzdHJpZGU7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcblxuXHRcdFx0cmVzdWx0WyBpIF0gPSB2YWx1ZXNbIG9mZnNldCArIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fSxcblxuXHQvLyBUZW1wbGF0ZSBtZXRob2RzIGZvciBkZXJpdmVkIGNsYXNzZXM6XG5cblx0aW50ZXJwb2xhdGVfOiBmdW5jdGlvbiggaTEsIHQwLCB0LCB0MSApIHtcblxuXHRcdHRocm93IG5ldyBFcnJvciggXCJjYWxsIHRvIGFic3RyYWN0IG1ldGhvZFwiICk7XG5cdFx0Ly8gaW1wbGVtZW50YXRpb25zIHNoYWxsIHJldHVybiB0aGlzLnJlc3VsdEJ1ZmZlclxuXG5cdH0sXG5cblx0aW50ZXJ2YWxDaGFuZ2VkXzogZnVuY3Rpb24oIGkxLCB0MCwgdDEgKSB7XG5cblx0XHQvLyBlbXB0eVxuXG5cdH1cblxufSApO1xuXG4vLyFcXCBERUNMQVJFIEFMSUFTIEFGVEVSIGFzc2lnbiBwcm90b3R5cGUgIVxuT2JqZWN0LmFzc2lnbiggSW50ZXJwb2xhbnQucHJvdG90eXBlLCB7XG5cblx0Ly8oIDAsIHQsIHQwICksIHJldHVybnMgdGhpcy5yZXN1bHRCdWZmZXJcblx0YmVmb3JlU3RhcnRfOiBJbnRlcnBvbGFudC5wcm90b3R5cGUuY29weVNhbXBsZVZhbHVlXyxcblxuXHQvLyggTi0xLCB0Ti0xLCB0ICksIHJldHVybnMgdGhpcy5yZXN1bHRCdWZmZXJcblx0YWZ0ZXJFbmRfOiBJbnRlcnBvbGFudC5wcm90b3R5cGUuY29weVNhbXBsZVZhbHVlXyxcblxufSApO1xuXG4vKipcbiAqIEZhc3QgYW5kIHNpbXBsZSBjdWJpYyBzcGxpbmUgaW50ZXJwb2xhbnQuXG4gKlxuICogSXQgd2FzIGRlcml2ZWQgZnJvbSBhIEhlcm1pdGlhbiBjb25zdHJ1Y3Rpb24gc2V0dGluZyB0aGUgZmlyc3QgZGVyaXZhdGl2ZVxuICogYXQgZWFjaCBzYW1wbGUgcG9zaXRpb24gdG8gdGhlIGxpbmVhciBzbG9wZSBiZXR3ZWVuIG5laWdoYm9yaW5nIHBvc2l0aW9uc1xuICogb3ZlciB0aGVpciBwYXJhbWV0ZXIgaW50ZXJ2YWwuXG4gKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIEN1YmljSW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0SW50ZXJwb2xhbnQuY2FsbChcblx0XHRcdHRoaXMsIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKTtcblxuXHR0aGlzLl93ZWlnaHRQcmV2ID0gLTA7XG5cdHRoaXMuX29mZnNldFByZXYgPSAtMDtcblx0dGhpcy5fd2VpZ2h0TmV4dCA9IC0wO1xuXHR0aGlzLl9vZmZzZXROZXh0ID0gLTA7XG5cbn1cblxuQ3ViaWNJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBDdWJpY0ludGVycG9sYW50LFxuXG5cdERlZmF1bHRTZXR0aW5nc186IHtcblxuXHRcdGVuZGluZ1N0YXJ0OiBcdFplcm9DdXJ2YXR1cmVFbmRpbmcsXG5cdFx0ZW5kaW5nRW5kOlx0XHRaZXJvQ3VydmF0dXJlRW5kaW5nXG5cblx0fSxcblxuXHRpbnRlcnZhbENoYW5nZWRfOiBmdW5jdGlvbiggaTEsIHQwLCB0MSApIHtcblxuXHRcdHZhciBwcCA9IHRoaXMucGFyYW1ldGVyUG9zaXRpb25zLFxuXHRcdFx0aVByZXYgPSBpMSAtIDIsXG5cdFx0XHRpTmV4dCA9IGkxICsgMSxcblxuXHRcdFx0dFByZXYgPSBwcFsgaVByZXYgXSxcblx0XHRcdHROZXh0ID0gcHBbIGlOZXh0IF07XG5cblx0XHRpZiAoIHRQcmV2ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHN3aXRjaCAoIHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nU3RhcnQgKSB7XG5cblx0XHRcdFx0Y2FzZSBaZXJvU2xvcGVFbmRpbmc6XG5cblx0XHRcdFx0XHQvLyBmJyh0MCkgPSAwXG5cdFx0XHRcdFx0aVByZXYgPSBpMTtcblx0XHRcdFx0XHR0UHJldiA9IDIgKiB0MCAtIHQxO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBXcmFwQXJvdW5kRW5kaW5nOlxuXG5cdFx0XHRcdFx0Ly8gdXNlIHRoZSBvdGhlciBlbmQgb2YgdGhlIGN1cnZlXG5cdFx0XHRcdFx0aVByZXYgPSBwcC5sZW5ndGggLSAyO1xuXHRcdFx0XHRcdHRQcmV2ID0gdDAgKyBwcFsgaVByZXYgXSAtIHBwWyBpUHJldiArIDEgXTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6IC8vIFplcm9DdXJ2YXR1cmVFbmRpbmdcblxuXHRcdFx0XHRcdC8vIGYnJyh0MCkgPSAwIGEuay5hLiBOYXR1cmFsIFNwbGluZVxuXHRcdFx0XHRcdGlQcmV2ID0gaTE7XG5cdFx0XHRcdFx0dFByZXYgPSB0MTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0TmV4dCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzd2l0Y2ggKCB0aGlzLmdldFNldHRpbmdzXygpLmVuZGluZ0VuZCApIHtcblxuXHRcdFx0XHRjYXNlIFplcm9TbG9wZUVuZGluZzpcblxuXHRcdFx0XHRcdC8vIGYnKHROKSA9IDBcblx0XHRcdFx0XHRpTmV4dCA9IGkxO1xuXHRcdFx0XHRcdHROZXh0ID0gMiAqIHQxIC0gdDA7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFdyYXBBcm91bmRFbmRpbmc6XG5cblx0XHRcdFx0XHQvLyB1c2UgdGhlIG90aGVyIGVuZCBvZiB0aGUgY3VydmVcblx0XHRcdFx0XHRpTmV4dCA9IDE7XG5cdFx0XHRcdFx0dE5leHQgPSB0MSArIHBwWyAxIF0gLSBwcFsgMCBdO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0ZGVmYXVsdDogLy8gWmVyb0N1cnZhdHVyZUVuZGluZ1xuXG5cdFx0XHRcdFx0Ly8gZicnKHROKSA9IDAsIGEuay5hLiBOYXR1cmFsIFNwbGluZVxuXHRcdFx0XHRcdGlOZXh0ID0gaTEgLSAxO1xuXHRcdFx0XHRcdHROZXh0ID0gdDA7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBoYWxmRHQgPSAoIHQxIC0gdDAgKSAqIDAuNSxcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplO1xuXG5cdFx0dGhpcy5fd2VpZ2h0UHJldiA9IGhhbGZEdCAvICggdDAgLSB0UHJldiApO1xuXHRcdHRoaXMuX3dlaWdodE5leHQgPSBoYWxmRHQgLyAoIHROZXh0IC0gdDEgKTtcblx0XHR0aGlzLl9vZmZzZXRQcmV2ID0gaVByZXYgKiBzdHJpZGU7XG5cdFx0dGhpcy5fb2Zmc2V0TmV4dCA9IGlOZXh0ICogc3RyaWRlO1xuXG5cdH0sXG5cblx0aW50ZXJwb2xhdGVfOiBmdW5jdGlvbiggaTEsIHQwLCB0LCB0MSApIHtcblxuXHRcdHZhciByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cblx0XHRcdG8xID0gaTEgKiBzdHJpZGUsXHRcdG8wID0gbzEgLSBzdHJpZGUsXG5cdFx0XHRvUCA9IHRoaXMuX29mZnNldFByZXYsIFx0b04gPSB0aGlzLl9vZmZzZXROZXh0LFxuXHRcdFx0d1AgPSB0aGlzLl93ZWlnaHRQcmV2LFx0d04gPSB0aGlzLl93ZWlnaHROZXh0LFxuXG5cdFx0XHRwID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApLFxuXHRcdFx0cHAgPSBwICogcCxcblx0XHRcdHBwcCA9IHBwICogcDtcblxuXHRcdC8vIGV2YWx1YXRlIHBvbHlub21pYWxzXG5cblx0XHR2YXIgc1AgPSAgICAgLSB3UCAgICogcHBwICAgKyAgICAgICAgIDIgKiB3UCAgICAqIHBwICAgIC0gICAgICAgICAgd1AgICAqIHA7XG5cdFx0dmFyIHMwID0gKCAxICsgd1AgKSAqIHBwcCAgICsgKC0xLjUgLSAyICogd1AgKSAgKiBwcCAgICArICggLTAuNSArIHdQICkgKiBwICAgICArIDE7XG5cdFx0dmFyIHMxID0gKC0xIC0gd04gKSAqIHBwcCAgICsgKCAxLjUgKyAgIHdOICAgKSAgKiBwcCAgICArICAgIDAuNSAgICAgICAgKiBwO1xuXHRcdHZhciBzTiA9ICAgICAgIHdOICAgKiBwcHAgICAtICAgICAgICAgICB3TiAgICAgICogcHA7XG5cblx0XHQvLyBjb21iaW5lIGRhdGEgbGluZWFybHlcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHRyZXN1bHRbIGkgXSA9XG5cdFx0XHRcdFx0c1AgKiB2YWx1ZXNbIG9QICsgaSBdICtcblx0XHRcdFx0XHRzMCAqIHZhbHVlc1sgbzAgKyBpIF0gK1xuXHRcdFx0XHRcdHMxICogdmFsdWVzWyBvMSArIGkgXSArXG5cdFx0XHRcdFx0c04gKiB2YWx1ZXNbIG9OICsgaSBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gTGluZWFySW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0SW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xuXG59XG5cbkxpbmVhckludGVycG9sYW50LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEludGVycG9sYW50LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExpbmVhckludGVycG9sYW50LFxuXG5cdGludGVycG9sYXRlXzogZnVuY3Rpb24oIGkxLCB0MCwgdCwgdDEgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcyxcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxuXG5cdFx0XHRvZmZzZXQxID0gaTEgKiBzdHJpZGUsXG5cdFx0XHRvZmZzZXQwID0gb2Zmc2V0MSAtIHN0cmlkZSxcblxuXHRcdFx0d2VpZ2h0MSA9ICggdCAtIHQwICkgLyAoIHQxIC0gdDAgKSxcblx0XHRcdHdlaWdodDAgPSAxIC0gd2VpZ2h0MTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHRyZXN1bHRbIGkgXSA9XG5cdFx0XHRcdFx0dmFsdWVzWyBvZmZzZXQwICsgaSBdICogd2VpZ2h0MCArXG5cdFx0XHRcdFx0dmFsdWVzWyBvZmZzZXQxICsgaSBdICogd2VpZ2h0MTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEludGVycG9sYW50IHRoYXQgZXZhbHVhdGVzIHRvIHRoZSBzYW1wbGUgdmFsdWUgYXQgdGhlIHBvc2l0aW9uIHByZWNlZWRpbmdcbiAqIHRoZSBwYXJhbWV0ZXIuXG4gKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIERpc2NyZXRlSW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0SW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xuXG59XG5cbkRpc2NyZXRlSW50ZXJwb2xhbnQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggSW50ZXJwb2xhbnQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogRGlzY3JldGVJbnRlcnBvbGFudCxcblxuXHRpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uKCBpMSwgdDAsIHQsIHQxICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuY29weVNhbXBsZVZhbHVlXyggaTEgLSAxICk7XG5cblx0fVxuXG59ICk7XG5cbnZhciBLZXlmcmFtZVRyYWNrUHJvdG90eXBlO1xuXG5LZXlmcmFtZVRyYWNrUHJvdG90eXBlID0ge1xuXG5cdFRpbWVCdWZmZXJUeXBlOiBGbG9hdDMyQXJyYXksXG5cdFZhbHVlQnVmZmVyVHlwZTogRmxvYXQzMkFycmF5LFxuXG5cdERlZmF1bHRJbnRlcnBvbGF0aW9uOiBJbnRlcnBvbGF0ZUxpbmVhcixcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTogZnVuY3Rpb24gKCByZXN1bHQgKSB7XG5cblx0XHRyZXR1cm4gbmV3IERpc2NyZXRlSW50ZXJwb2xhbnQoXG5cdFx0XHRcdHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTtcblxuXHR9LFxuXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjogZnVuY3Rpb24gKCByZXN1bHQgKSB7XG5cblx0XHRyZXR1cm4gbmV3IExpbmVhckludGVycG9sYW50KFxuXHRcdFx0XHR0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVzdWx0ICk7XG5cblx0fSxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6IGZ1bmN0aW9uICggcmVzdWx0ICkge1xuXG5cdFx0cmV0dXJuIG5ldyBDdWJpY0ludGVycG9sYW50KFxuXHRcdFx0XHR0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVzdWx0ICk7XG5cblx0fSxcblxuXHRzZXRJbnRlcnBvbGF0aW9uOiBmdW5jdGlvbiAoIGludGVycG9sYXRpb24gKSB7XG5cblx0XHR2YXIgZmFjdG9yeU1ldGhvZDtcblxuXHRcdHN3aXRjaCAoIGludGVycG9sYXRpb24gKSB7XG5cblx0XHRcdGNhc2UgSW50ZXJwb2xhdGVEaXNjcmV0ZTpcblxuXHRcdFx0XHRmYWN0b3J5TWV0aG9kID0gdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBJbnRlcnBvbGF0ZUxpbmVhcjpcblxuXHRcdFx0XHRmYWN0b3J5TWV0aG9kID0gdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgSW50ZXJwb2xhdGVTbW9vdGg6XG5cblx0XHRcdFx0ZmFjdG9yeU1ldGhvZCA9IHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBmYWN0b3J5TWV0aG9kID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBtZXNzYWdlID0gXCJ1bnN1cHBvcnRlZCBpbnRlcnBvbGF0aW9uIGZvciBcIiArXG5cdFx0XHRcdFx0dGhpcy5WYWx1ZVR5cGVOYW1lICsgXCIga2V5ZnJhbWUgdHJhY2sgbmFtZWQgXCIgKyB0aGlzLm5hbWU7XG5cblx0XHRcdGlmICggdGhpcy5jcmVhdGVJbnRlcnBvbGFudCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIGZhbGwgYmFjayB0byBkZWZhdWx0LCB1bmxlc3MgdGhlIGRlZmF1bHQgaXRzZWxmIGlzIG1lc3NlZCB1cFxuXHRcdFx0XHRpZiAoIGludGVycG9sYXRpb24gIT09IHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24gKSB7XG5cblx0XHRcdFx0XHR0aGlzLnNldEludGVycG9sYXRpb24oIHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24gKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCBtZXNzYWdlICk7IC8vIGZhdGFsLCBpbiB0aGlzIGNhc2VcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Y29uc29sZS53YXJuKCBtZXNzYWdlICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR0aGlzLmNyZWF0ZUludGVycG9sYW50ID0gZmFjdG9yeU1ldGhvZDtcblxuXHR9LFxuXG5cdGdldEludGVycG9sYXRpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHN3aXRjaCAoIHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQgKSB7XG5cblx0XHRcdGNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTpcblxuXHRcdFx0XHRyZXR1cm4gSW50ZXJwb2xhdGVEaXNjcmV0ZTtcblxuXHRcdFx0Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjpcblxuXHRcdFx0XHRyZXR1cm4gSW50ZXJwb2xhdGVMaW5lYXI7XG5cblx0XHRcdGNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6XG5cblx0XHRcdFx0cmV0dXJuIEludGVycG9sYXRlU21vb3RoO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Z2V0VmFsdWVTaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy52YWx1ZXMubGVuZ3RoIC8gdGhpcy50aW1lcy5sZW5ndGg7XG5cblx0fSxcblxuXHQvLyBtb3ZlIGFsbCBrZXlmcmFtZXMgZWl0aGVyIGZvcndhcmRzIG9yIGJhY2t3YXJkcyBpbiB0aW1lXG5cdHNoaWZ0OiBmdW5jdGlvbiAoIHRpbWVPZmZzZXQgKSB7XG5cblx0XHRpZiAoIHRpbWVPZmZzZXQgIT09IDAuMCApIHtcblxuXHRcdFx0dmFyIHRpbWVzID0gdGhpcy50aW1lcztcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gdGltZXMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHRpbWVzWyBpIF0gKz0gdGltZU9mZnNldDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBzY2FsZSBhbGwga2V5ZnJhbWUgdGltZXMgYnkgYSBmYWN0b3IgKHVzZWZ1bCBmb3IgZnJhbWUgPC0+IHNlY29uZHMgY29udmVyc2lvbnMpXG5cdHNjYWxlOiBmdW5jdGlvbiAoIHRpbWVTY2FsZSApIHtcblxuXHRcdGlmICggdGltZVNjYWxlICE9PSAxLjAgKSB7XG5cblx0XHRcdHZhciB0aW1lcyA9IHRoaXMudGltZXM7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IHRpbWVzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHR0aW1lc1sgaSBdICo9IHRpbWVTY2FsZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyByZW1vdmVzIGtleWZyYW1lcyBiZWZvcmUgYW5kIGFmdGVyIGFuaW1hdGlvbiB3aXRob3V0IGNoYW5naW5nIGFueSB2YWx1ZXMgd2l0aGluIHRoZSByYW5nZSBbc3RhcnRUaW1lLCBlbmRUaW1lXS5cblx0Ly8gSU1QT1JUQU5UOiBXZSBkbyBub3Qgc2hpZnQgYXJvdW5kIGtleXMgdG8gdGhlIHN0YXJ0IG9mIHRoZSB0cmFjayB0aW1lLCBiZWNhdXNlIGZvciBpbnRlcnBvbGF0ZWQga2V5cyB0aGlzIHdpbGwgY2hhbmdlIHRoZWlyIHZhbHVlc1xuXHR0cmltOiBmdW5jdGlvbiAoIHN0YXJ0VGltZSwgZW5kVGltZSApIHtcblxuXHRcdHZhciB0aW1lcyA9IHRoaXMudGltZXMsXG5cdFx0XHRuS2V5cyA9IHRpbWVzLmxlbmd0aCxcblx0XHRcdGZyb20gPSAwLFxuXHRcdFx0dG8gPSBuS2V5cyAtIDE7XG5cblx0XHR3aGlsZSAoIGZyb20gIT09IG5LZXlzICYmIHRpbWVzWyBmcm9tIF0gPCBzdGFydFRpbWUgKSArKyBmcm9tO1xuXHRcdHdoaWxlICggdG8gIT09IC0gMSAmJiB0aW1lc1sgdG8gXSA+IGVuZFRpbWUgKSAtLSB0bztcblxuXHRcdCsrIHRvOyAvLyBpbmNsdXNpdmUgLT4gZXhjbHVzaXZlIGJvdW5kXG5cblx0XHRpZiAoIGZyb20gIT09IDAgfHwgdG8gIT09IG5LZXlzICkge1xuXG5cdFx0XHQvLyBlbXB0eSB0cmFja3MgYXJlIGZvcmJpZGRlbiwgc28ga2VlcCBhdCBsZWFzdCBvbmUga2V5ZnJhbWVcblx0XHRcdGlmICggZnJvbSA+PSB0byApIHRvID0gTWF0aC5tYXgoIHRvLCAxICksIGZyb20gPSB0byAtIDE7XG5cblx0XHRcdHZhciBzdHJpZGUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpO1xuXHRcdFx0dGhpcy50aW1lcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRpbWVzLCBmcm9tLCB0byApO1xuXHRcdFx0dGhpcy52YWx1ZXMgPSBBbmltYXRpb25VdGlscy5cblx0XHRcdFx0XHRhcnJheVNsaWNlKCB0aGlzLnZhbHVlcywgZnJvbSAqIHN0cmlkZSwgdG8gKiBzdHJpZGUgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gZW5zdXJlIHdlIGRvIG5vdCBnZXQgYSBHYXJiYWdlSW5HYXJiYWdlT3V0IHNpdHVhdGlvbiwgbWFrZSBzdXJlIHRyYWNrcyBhcmUgYXQgbGVhc3QgbWluaW1hbGx5IHZpYWJsZVxuXHR2YWxpZGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHZhbGlkID0gdHJ1ZTtcblxuXHRcdHZhciB2YWx1ZVNpemUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpO1xuXHRcdGlmICggdmFsdWVTaXplIC0gTWF0aC5mbG9vciggdmFsdWVTaXplICkgIT09IDAgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoIFwiaW52YWxpZCB2YWx1ZSBzaXplIGluIHRyYWNrXCIsIHRoaXMgKTtcblx0XHRcdHZhbGlkID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHR2YXIgdGltZXMgPSB0aGlzLnRpbWVzLFxuXHRcdFx0dmFsdWVzID0gdGhpcy52YWx1ZXMsXG5cblx0XHRcdG5LZXlzID0gdGltZXMubGVuZ3RoO1xuXG5cdFx0aWYgKCBuS2V5cyA9PT0gMCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggXCJ0cmFjayBpcyBlbXB0eVwiLCB0aGlzICk7XG5cdFx0XHR2YWxpZCA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHByZXZUaW1lID0gbnVsbDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbktleXM7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjdXJyVGltZSA9IHRpbWVzWyBpIF07XG5cblx0XHRcdGlmICggdHlwZW9mIGN1cnJUaW1lID09PSAnbnVtYmVyJyAmJiBpc05hTiggY3VyclRpbWUgKSApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCBcInRpbWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyXCIsIHRoaXMsIGksIGN1cnJUaW1lICk7XG5cdFx0XHRcdHZhbGlkID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggcHJldlRpbWUgIT09IG51bGwgJiYgcHJldlRpbWUgPiBjdXJyVGltZSApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCBcIm91dCBvZiBvcmRlciBrZXlzXCIsIHRoaXMsIGksIGN1cnJUaW1lLCBwcmV2VGltZSApO1xuXHRcdFx0XHR2YWxpZCA9IGZhbHNlO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0XHRwcmV2VGltZSA9IGN1cnJUaW1lO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB2YWx1ZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0aWYgKCBBbmltYXRpb25VdGlscy5pc1R5cGVkQXJyYXkoIHZhbHVlcyApICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IHZhbHVlcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0XHR2YXIgdmFsdWUgPSB2YWx1ZXNbIGkgXTtcblxuXHRcdFx0XHRcdGlmICggaXNOYU4oIHZhbHVlICkgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoIFwidmFsdWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyXCIsIHRoaXMsIGksIHZhbHVlICk7XG5cdFx0XHRcdFx0XHR2YWxpZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsaWQ7XG5cblx0fSxcblxuXHQvLyByZW1vdmVzIGVxdWl2YWxlbnQgc2VxdWVudGlhbCBrZXlzIGFzIGNvbW1vbiBpbiBtb3JwaCB0YXJnZXQgc2VxdWVuY2VzXG5cdC8vICgwLDAsMCwwLDEsMSwxLDAsMCwwLDAsMCwwLDApIC0tPiAoMCwwLDEsMSwwLDApXG5cdG9wdGltaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdGltZXMgPSB0aGlzLnRpbWVzLFxuXHRcdFx0dmFsdWVzID0gdGhpcy52YWx1ZXMsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpLFxuXG5cdFx0XHRzbW9vdGhJbnRlcnBvbGF0aW9uID0gdGhpcy5nZXRJbnRlcnBvbGF0aW9uKCkgPT09IEludGVycG9sYXRlU21vb3RoLFxuXG5cdFx0XHR3cml0ZUluZGV4ID0gMSxcblx0XHRcdGxhc3RJbmRleCA9IHRpbWVzLmxlbmd0aCAtIDE7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDE7IGkgPCBsYXN0SW5kZXg7ICsrIGkgKSB7XG5cblx0XHRcdHZhciBrZWVwID0gZmFsc2U7XG5cblx0XHRcdHZhciB0aW1lID0gdGltZXNbIGkgXTtcblx0XHRcdHZhciB0aW1lTmV4dCA9IHRpbWVzWyBpICsgMSBdO1xuXG5cdFx0XHQvLyByZW1vdmUgYWRqYWNlbnQga2V5ZnJhbWVzIHNjaGVkdWxlZCBhdCB0aGUgc2FtZSB0aW1lXG5cblx0XHRcdGlmICggdGltZSAhPT0gdGltZU5leHQgJiYgKCBpICE9PSAxIHx8IHRpbWUgIT09IHRpbWVbIDAgXSApICkge1xuXG5cdFx0XHRcdGlmICggISBzbW9vdGhJbnRlcnBvbGF0aW9uICkge1xuXG5cdFx0XHRcdFx0Ly8gcmVtb3ZlIHVubmVjZXNzYXJ5IGtleWZyYW1lcyBzYW1lIGFzIHRoZWlyIG5laWdoYm9yc1xuXG5cdFx0XHRcdFx0dmFyIG9mZnNldCA9IGkgKiBzdHJpZGUsXG5cdFx0XHRcdFx0XHRvZmZzZXRQID0gb2Zmc2V0IC0gc3RyaWRlLFxuXHRcdFx0XHRcdFx0b2Zmc2V0TiA9IG9mZnNldCArIHN0cmlkZTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgdmFsdWUgPSB2YWx1ZXNbIG9mZnNldCArIGogXTtcblxuXHRcdFx0XHRcdFx0aWYgKCB2YWx1ZSAhPT0gdmFsdWVzWyBvZmZzZXRQICsgaiBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0dmFsdWUgIT09IHZhbHVlc1sgb2Zmc2V0TiArIGogXSApIHtcblxuXHRcdFx0XHRcdFx0XHRrZWVwID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uga2VlcCA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gaW4tcGxhY2UgY29tcGFjdGlvblxuXG5cdFx0XHRpZiAoIGtlZXAgKSB7XG5cblx0XHRcdFx0aWYgKCBpICE9PSB3cml0ZUluZGV4ICkge1xuXG5cdFx0XHRcdFx0dGltZXNbIHdyaXRlSW5kZXggXSA9IHRpbWVzWyBpIF07XG5cblx0XHRcdFx0XHR2YXIgcmVhZE9mZnNldCA9IGkgKiBzdHJpZGUsXG5cdFx0XHRcdFx0XHR3cml0ZU9mZnNldCA9IHdyaXRlSW5kZXggKiBzdHJpZGU7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApXG5cblx0XHRcdFx0XHRcdHZhbHVlc1sgd3JpdGVPZmZzZXQgKyBqIF0gPSB2YWx1ZXNbIHJlYWRPZmZzZXQgKyBqIF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdCsrIHdyaXRlSW5kZXg7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGZsdXNoIGxhc3Qga2V5ZnJhbWUgKGNvbXBhY3Rpb24gbG9va3MgYWhlYWQpXG5cblx0XHRpZiAoIGxhc3RJbmRleCA+IDAgKSB7XG5cblx0XHRcdHRpbWVzWyB3cml0ZUluZGV4IF0gPSB0aW1lc1sgbGFzdEluZGV4IF07XG5cblx0XHRcdGZvciAoIHZhciByZWFkT2Zmc2V0ID0gbGFzdEluZGV4ICogc3RyaWRlLCB3cml0ZU9mZnNldCA9IHdyaXRlSW5kZXggKiBzdHJpZGUsIGogPSAwOyBqICE9PSBzdHJpZGU7ICsrIGogKVxuXG5cdFx0XHRcdHZhbHVlc1sgd3JpdGVPZmZzZXQgKyBqIF0gPSB2YWx1ZXNbIHJlYWRPZmZzZXQgKyBqIF07XG5cblx0XHRcdCsrIHdyaXRlSW5kZXg7XG5cblx0XHR9XG5cblx0XHRpZiAoIHdyaXRlSW5kZXggIT09IHRpbWVzLmxlbmd0aCApIHtcblxuXHRcdFx0dGhpcy50aW1lcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRpbWVzLCAwLCB3cml0ZUluZGV4ICk7XG5cdFx0XHR0aGlzLnZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHZhbHVlcywgMCwgd3JpdGVJbmRleCAqIHN0cmlkZSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59O1xuXG5mdW5jdGlvbiBLZXlmcmFtZVRyYWNrQ29uc3RydWN0b3IoIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XG5cblx0aWYgKCBuYW1lID09PSB1bmRlZmluZWQgKSB0aHJvdyBuZXcgRXJyb3IoIFwidHJhY2sgbmFtZSBpcyB1bmRlZmluZWRcIiApO1xuXG5cdGlmICggdGltZXMgPT09IHVuZGVmaW5lZCB8fCB0aW1lcy5sZW5ndGggPT09IDAgKSB7XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoIFwibm8ga2V5ZnJhbWVzIGluIHRyYWNrIG5hbWVkIFwiICsgbmFtZSApO1xuXG5cdH1cblxuXHR0aGlzLm5hbWUgPSBuYW1lO1xuXG5cdHRoaXMudGltZXMgPSBBbmltYXRpb25VdGlscy5jb252ZXJ0QXJyYXkoIHRpbWVzLCB0aGlzLlRpbWVCdWZmZXJUeXBlICk7XG5cdHRoaXMudmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB2YWx1ZXMsIHRoaXMuVmFsdWVCdWZmZXJUeXBlICk7XG5cblx0dGhpcy5zZXRJbnRlcnBvbGF0aW9uKCBpbnRlcnBvbGF0aW9uIHx8IHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24gKTtcblxuXHR0aGlzLnZhbGlkYXRlKCk7XG5cdHRoaXMub3B0aW1pemUoKTtcblxufVxuXG4vKipcbiAqXG4gKiBBIFRyYWNrIG9mIHZlY3RvcmVkIGtleWZyYW1lIHZhbHVlcy5cbiAqXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFZlY3RvcktleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XG5cblx0S2V5ZnJhbWVUcmFja0NvbnN0cnVjdG9yLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTtcblxufVxuXG5WZWN0b3JLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9XG5cdFx0T2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggS2V5ZnJhbWVUcmFja1Byb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFZlY3RvcktleWZyYW1lVHJhY2ssXG5cblx0VmFsdWVUeXBlTmFtZTogJ3ZlY3RvcidcblxuXHQvLyBWYWx1ZUJ1ZmZlclR5cGUgaXMgaW5oZXJpdGVkXG5cblx0Ly8gRGVmYXVsdEludGVycG9sYXRpb24gaXMgaW5oZXJpdGVkXG5cbn0gKTtcblxuLyoqXG4gKiBTcGhlcmljYWwgbGluZWFyIHVuaXQgcXVhdGVybmlvbiBpbnRlcnBvbGFudC5cbiAqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkge1xuXG5cdEludGVycG9sYW50LmNhbGwoIHRoaXMsIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKTtcblxufVxuXG5RdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggSW50ZXJwb2xhbnQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50LFxuXG5cdGludGVycG9sYXRlXzogZnVuY3Rpb24oIGkxLCB0MCwgdCwgdDEgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcyxcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxuXG5cdFx0XHRvZmZzZXQgPSBpMSAqIHN0cmlkZSxcblxuXHRcdFx0YWxwaGEgPSAoIHQgLSB0MCApIC8gKCB0MSAtIHQwICk7XG5cblx0XHRmb3IgKCB2YXIgZW5kID0gb2Zmc2V0ICsgc3RyaWRlOyBvZmZzZXQgIT09IGVuZDsgb2Zmc2V0ICs9IDQgKSB7XG5cblx0XHRcdFF1YXRlcm5pb24uc2xlcnBGbGF0KCByZXN1bHQsIDAsXG5cdFx0XHRcdFx0dmFsdWVzLCBvZmZzZXQgLSBzdHJpZGUsIHZhbHVlcywgb2Zmc2V0LCBhbHBoYSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSBUcmFjayBvZiBxdWF0ZXJuaW9uIGtleWZyYW1lIHZhbHVlcy5cbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gUXVhdGVybmlvbktleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XG5cblx0S2V5ZnJhbWVUcmFja0NvbnN0cnVjdG9yLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTtcblxufVxuXG5RdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPVxuXHRcdE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2tQcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjayxcblxuXHRWYWx1ZVR5cGVOYW1lOiAncXVhdGVybmlvbicsXG5cblx0Ly8gVmFsdWVCdWZmZXJUeXBlIGlzIGluaGVyaXRlZFxuXG5cdERlZmF1bHRJbnRlcnBvbGF0aW9uOiBJbnRlcnBvbGF0ZUxpbmVhcixcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cblx0XHRyZXR1cm4gbmV3IFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudChcblx0XHRcdFx0dGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApO1xuXG5cdH0sXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOiB1bmRlZmluZWQgLy8gbm90IHlldCBpbXBsZW1lbnRlZFxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgb2YgbnVtZXJpYyBrZXlmcmFtZSB2YWx1ZXMuXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIE51bWJlcktleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XG5cblx0S2V5ZnJhbWVUcmFja0NvbnN0cnVjdG9yLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTtcblxufVxuXG5OdW1iZXJLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9XG5cdFx0T2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggS2V5ZnJhbWVUcmFja1Byb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IE51bWJlcktleWZyYW1lVHJhY2ssXG5cblx0VmFsdWVUeXBlTmFtZTogJ251bWJlcidcblxuXHQvLyBWYWx1ZUJ1ZmZlclR5cGUgaXMgaW5oZXJpdGVkXG5cblx0Ly8gRGVmYXVsdEludGVycG9sYXRpb24gaXMgaW5oZXJpdGVkXG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSBUcmFjayB0aGF0IGludGVycG9sYXRlcyBTdHJpbmdzXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBTdHJpbmdLZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdEtleWZyYW1lVHJhY2tDb25zdHJ1Y3Rvci5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7XG5cbn1cblxuU3RyaW5nS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPVxuXHRcdE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2tQcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTdHJpbmdLZXlmcmFtZVRyYWNrLFxuXG5cdFZhbHVlVHlwZU5hbWU6ICdzdHJpbmcnLFxuXHRWYWx1ZUJ1ZmZlclR5cGU6IEFycmF5LFxuXG5cdERlZmF1bHRJbnRlcnBvbGF0aW9uOiBJbnRlcnBvbGF0ZURpc2NyZXRlLFxuXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjogdW5kZWZpbmVkLFxuXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDogdW5kZWZpbmVkXG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSBUcmFjayBvZiBCb29sZWFuIGtleWZyYW1lIHZhbHVlcy5cbiAqXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIEJvb2xlYW5LZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzICkge1xuXG5cdEtleWZyYW1lVHJhY2tDb25zdHJ1Y3Rvci5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzICk7XG5cbn1cblxuQm9vbGVhbktleWZyYW1lVHJhY2sucHJvdG90eXBlID1cblx0XHRPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrUHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQm9vbGVhbktleWZyYW1lVHJhY2ssXG5cblx0VmFsdWVUeXBlTmFtZTogJ2Jvb2wnLFxuXHRWYWx1ZUJ1ZmZlclR5cGU6IEFycmF5LFxuXG5cdERlZmF1bHRJbnRlcnBvbGF0aW9uOiBJbnRlcnBvbGF0ZURpc2NyZXRlLFxuXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjogdW5kZWZpbmVkLFxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6IHVuZGVmaW5lZFxuXG5cdC8vIE5vdGU6IEFjdHVhbGx5IHRoaXMgdHJhY2sgY291bGQgaGF2ZSBhIG9wdGltaXplZCAvIGNvbXByZXNzZWRcblx0Ly8gcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgdmFsdWUgYW5kIGEgY3VzdG9tIGludGVycG9sYW50IHRoYXRcblx0Ly8gY29tcHV0ZXMgXCJmaXJzdFZhbHVlIF4gaXNPZGQoIGluZGV4IClcIi5cblxufSApO1xuXG4vKipcbiAqXG4gKiBBIFRyYWNrIG9mIGtleWZyYW1lIHZhbHVlcyB0aGF0IHJlcHJlc2VudCBjb2xvci5cbiAqXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIENvbG9yS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRLZXlmcmFtZVRyYWNrQ29uc3RydWN0b3IuY2FsbCggdGhpcywgbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApO1xuXG59XG5cbkNvbG9yS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPVxuXHRcdE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2tQcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBDb2xvcktleWZyYW1lVHJhY2ssXG5cblx0VmFsdWVUeXBlTmFtZTogJ2NvbG9yJ1xuXG5cdC8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcblxuXHQvLyBEZWZhdWx0SW50ZXJwb2xhdGlvbiBpcyBpbmhlcml0ZWRcblxuXG5cdC8vIE5vdGU6IFZlcnkgYmFzaWMgaW1wbGVtZW50YXRpb24gYW5kIG5vdGhpbmcgc3BlY2lhbCB5ZXQuXG5cdC8vIEhvd2V2ZXIsIHRoaXMgaXMgdGhlIHBsYWNlIGZvciBjb2xvciBzcGFjZSBwYXJhbWV0ZXJpemF0aW9uLlxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgdGltZWQgc2VxdWVuY2Ugb2Yga2V5ZnJhbWVzIGZvciBhIHNwZWNpZmljIHByb3BlcnR5LlxuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRLZXlmcmFtZVRyYWNrQ29uc3RydWN0b3IuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXG59XG5cbktleWZyYW1lVHJhY2sucHJvdG90eXBlID0gS2V5ZnJhbWVUcmFja1Byb3RvdHlwZTtcbktleWZyYW1lVHJhY2tQcm90b3R5cGUuY29uc3RydWN0b3IgPSBLZXlmcmFtZVRyYWNrO1xuXG4vLyBTdGF0aWMgbWV0aG9kczpcblxuT2JqZWN0LmFzc2lnbiggS2V5ZnJhbWVUcmFjaywge1xuXG5cdC8vIFNlcmlhbGl6YXRpb24gKGluIHN0YXRpYyBjb250ZXh0LCBiZWNhdXNlIG9mIGNvbnN0cnVjdG9yIGludm9jYXRpb25cblx0Ly8gYW5kIGF1dG9tYXRpYyBpbnZvY2F0aW9uIG9mIC50b0pTT04pOlxuXG5cdHBhcnNlOiBmdW5jdGlvbigganNvbiApIHtcblxuXHRcdGlmKCBqc29uLnR5cGUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCBcInRyYWNrIHR5cGUgdW5kZWZpbmVkLCBjYW4gbm90IHBhcnNlXCIgKTtcblxuXHRcdH1cblxuXHRcdHZhciB0cmFja1R5cGUgPSBLZXlmcmFtZVRyYWNrLl9nZXRUcmFja1R5cGVGb3JWYWx1ZVR5cGVOYW1lKCBqc29uLnR5cGUgKTtcblxuXHRcdGlmICgganNvbi50aW1lcyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgdGltZXMgPSBbXSwgdmFsdWVzID0gW107XG5cblx0XHRcdEFuaW1hdGlvblV0aWxzLmZsYXR0ZW5KU09OKCBqc29uLmtleXMsIHRpbWVzLCB2YWx1ZXMsICd2YWx1ZScgKTtcblxuXHRcdFx0anNvbi50aW1lcyA9IHRpbWVzO1xuXHRcdFx0anNvbi52YWx1ZXMgPSB2YWx1ZXM7XG5cblx0XHR9XG5cblx0XHQvLyBkZXJpdmVkIGNsYXNzZXMgY2FuIGRlZmluZSBhIHN0YXRpYyBwYXJzZSBtZXRob2Rcblx0XHRpZiAoIHRyYWNrVHlwZS5wYXJzZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRyZXR1cm4gdHJhY2tUeXBlLnBhcnNlKCBqc29uICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBieSBkZWZhdWx0LCB3ZSBhc3NzdW1lIGEgY29uc3RydWN0b3IgY29tcGF0aWJsZSB3aXRoIHRoZSBiYXNlXG5cdFx0XHRyZXR1cm4gbmV3IHRyYWNrVHlwZShcblx0XHRcdFx0XHRqc29uLm5hbWUsIGpzb24udGltZXMsIGpzb24udmFsdWVzLCBqc29uLmludGVycG9sYXRpb24gKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24oIHRyYWNrICkge1xuXG5cdFx0dmFyIHRyYWNrVHlwZSA9IHRyYWNrLmNvbnN0cnVjdG9yO1xuXG5cdFx0dmFyIGpzb247XG5cblx0XHQvLyBkZXJpdmVkIGNsYXNzZXMgY2FuIGRlZmluZSBhIHN0YXRpYyB0b0pTT04gbWV0aG9kXG5cdFx0aWYgKCB0cmFja1R5cGUudG9KU09OICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGpzb24gPSB0cmFja1R5cGUudG9KU09OKCB0cmFjayApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gYnkgZGVmYXVsdCwgd2UgYXNzdW1lIHRoZSBkYXRhIGNhbiBiZSBzZXJpYWxpemVkIGFzLWlzXG5cdFx0XHRqc29uID0ge1xuXG5cdFx0XHRcdCduYW1lJzogdHJhY2submFtZSxcblx0XHRcdFx0J3RpbWVzJzogQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB0cmFjay50aW1lcywgQXJyYXkgKSxcblx0XHRcdFx0J3ZhbHVlcyc6IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdHJhY2sudmFsdWVzLCBBcnJheSApXG5cblx0XHRcdH07XG5cblx0XHRcdHZhciBpbnRlcnBvbGF0aW9uID0gdHJhY2suZ2V0SW50ZXJwb2xhdGlvbigpO1xuXG5cdFx0XHRpZiAoIGludGVycG9sYXRpb24gIT09IHRyYWNrLkRlZmF1bHRJbnRlcnBvbGF0aW9uICkge1xuXG5cdFx0XHRcdGpzb24uaW50ZXJwb2xhdGlvbiA9IGludGVycG9sYXRpb247XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGpzb24udHlwZSA9IHRyYWNrLlZhbHVlVHlwZU5hbWU7IC8vIG1hbmRhdG9yeVxuXG5cdFx0cmV0dXJuIGpzb247XG5cblx0fSxcblxuXHRfZ2V0VHJhY2tUeXBlRm9yVmFsdWVUeXBlTmFtZTogZnVuY3Rpb24oIHR5cGVOYW1lICkge1xuXG5cdFx0c3dpdGNoKCB0eXBlTmFtZS50b0xvd2VyQ2FzZSgpICkge1xuXG5cdFx0XHRjYXNlIFwic2NhbGFyXCI6XG5cdFx0XHRjYXNlIFwiZG91YmxlXCI6XG5cdFx0XHRjYXNlIFwiZmxvYXRcIjpcblx0XHRcdGNhc2UgXCJudW1iZXJcIjpcblx0XHRcdGNhc2UgXCJpbnRlZ2VyXCI6XG5cblx0XHRcdFx0cmV0dXJuIE51bWJlcktleWZyYW1lVHJhY2s7XG5cblx0XHRcdGNhc2UgXCJ2ZWN0b3JcIjpcblx0XHRcdGNhc2UgXCJ2ZWN0b3IyXCI6XG5cdFx0XHRjYXNlIFwidmVjdG9yM1wiOlxuXHRcdFx0Y2FzZSBcInZlY3RvcjRcIjpcblxuXHRcdFx0XHRyZXR1cm4gVmVjdG9yS2V5ZnJhbWVUcmFjaztcblxuXHRcdFx0Y2FzZSBcImNvbG9yXCI6XG5cblx0XHRcdFx0cmV0dXJuIENvbG9yS2V5ZnJhbWVUcmFjaztcblxuXHRcdFx0Y2FzZSBcInF1YXRlcm5pb25cIjpcblxuXHRcdFx0XHRyZXR1cm4gUXVhdGVybmlvbktleWZyYW1lVHJhY2s7XG5cblx0XHRcdGNhc2UgXCJib29sXCI6XG5cdFx0XHRjYXNlIFwiYm9vbGVhblwiOlxuXG5cdFx0XHRcdHJldHVybiBCb29sZWFuS2V5ZnJhbWVUcmFjaztcblxuXHRcdFx0Y2FzZSBcInN0cmluZ1wiOlxuXG5cdFx0XHRcdHJldHVybiBTdHJpbmdLZXlmcmFtZVRyYWNrO1xuXG5cdFx0fVxuXG5cdFx0dGhyb3cgbmV3IEVycm9yKCBcIlVuc3VwcG9ydGVkIHR5cGVOYW1lOiBcIiArIHR5cGVOYW1lICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIFJldXNhYmxlIHNldCBvZiBUcmFja3MgdGhhdCByZXByZXNlbnQgYW4gYW5pbWF0aW9uLlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqL1xuXG5mdW5jdGlvbiBBbmltYXRpb25DbGlwKCBuYW1lLCBkdXJhdGlvbiwgdHJhY2tzICkge1xuXG5cdHRoaXMubmFtZSA9IG5hbWU7XG5cdHRoaXMudHJhY2tzID0gdHJhY2tzO1xuXHR0aGlzLmR1cmF0aW9uID0gKCBkdXJhdGlvbiAhPT0gdW5kZWZpbmVkICkgPyBkdXJhdGlvbiA6IC0gMTtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHQvLyB0aGlzIG1lYW5zIGl0IHNob3VsZCBmaWd1cmUgb3V0IGl0cyBkdXJhdGlvbiBieSBzY2FubmluZyB0aGUgdHJhY2tzXG5cdGlmICggdGhpcy5kdXJhdGlvbiA8IDAgKSB7XG5cblx0XHR0aGlzLnJlc2V0RHVyYXRpb24oKTtcblxuXHR9XG5cblx0dGhpcy5vcHRpbWl6ZSgpO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEFuaW1hdGlvbkNsaXAsIHtcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0dmFyIHRyYWNrcyA9IFtdLFxuXHRcdFx0anNvblRyYWNrcyA9IGpzb24udHJhY2tzLFxuXHRcdFx0ZnJhbWVUaW1lID0gMS4wIC8gKCBqc29uLmZwcyB8fCAxLjAgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGpzb25UcmFja3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR0cmFja3MucHVzaCggS2V5ZnJhbWVUcmFjay5wYXJzZSgganNvblRyYWNrc1sgaSBdICkuc2NhbGUoIGZyYW1lVGltZSApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbmV3IEFuaW1hdGlvbkNsaXAoIGpzb24ubmFtZSwganNvbi5kdXJhdGlvbiwgdHJhY2tzICk7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggY2xpcCApIHtcblxuXHRcdHZhciB0cmFja3MgPSBbXSxcblx0XHRcdGNsaXBUcmFja3MgPSBjbGlwLnRyYWNrcztcblxuXHRcdHZhciBqc29uID0ge1xuXG5cdFx0XHQnbmFtZSc6IGNsaXAubmFtZSxcblx0XHRcdCdkdXJhdGlvbic6IGNsaXAuZHVyYXRpb24sXG5cdFx0XHQndHJhY2tzJzogdHJhY2tzXG5cblx0XHR9O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gY2xpcFRyYWNrcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHRyYWNrcy5wdXNoKCBLZXlmcmFtZVRyYWNrLnRvSlNPTiggY2xpcFRyYWNrc1sgaSBdICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBqc29uO1xuXG5cdH0sXG5cblx0Q3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2U6IGZ1bmN0aW9uICggbmFtZSwgbW9ycGhUYXJnZXRTZXF1ZW5jZSwgZnBzLCBub0xvb3AgKSB7XG5cblx0XHR2YXIgbnVtTW9ycGhUYXJnZXRzID0gbW9ycGhUYXJnZXRTZXF1ZW5jZS5sZW5ndGg7XG5cdFx0dmFyIHRyYWNrcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbnVtTW9ycGhUYXJnZXRzOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdGltZXMgPSBbXTtcblx0XHRcdHZhciB2YWx1ZXMgPSBbXTtcblxuXHRcdFx0dGltZXMucHVzaChcblx0XHRcdFx0XHQoIGkgKyBudW1Nb3JwaFRhcmdldHMgLSAxICkgJSBudW1Nb3JwaFRhcmdldHMsXG5cdFx0XHRcdFx0aSxcblx0XHRcdFx0XHQoIGkgKyAxICkgJSBudW1Nb3JwaFRhcmdldHMgKTtcblxuXHRcdFx0dmFsdWVzLnB1c2goIDAsIDEsIDAgKTtcblxuXHRcdFx0dmFyIG9yZGVyID0gQW5pbWF0aW9uVXRpbHMuZ2V0S2V5ZnJhbWVPcmRlciggdGltZXMgKTtcblx0XHRcdHRpbWVzID0gQW5pbWF0aW9uVXRpbHMuc29ydGVkQXJyYXkoIHRpbWVzLCAxLCBvcmRlciApO1xuXHRcdFx0dmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuc29ydGVkQXJyYXkoIHZhbHVlcywgMSwgb3JkZXIgKTtcblxuXHRcdFx0Ly8gaWYgdGhlcmUgaXMgYSBrZXkgYXQgdGhlIGZpcnN0IGZyYW1lLCBkdXBsaWNhdGUgaXQgYXMgdGhlXG5cdFx0XHQvLyBsYXN0IGZyYW1lIGFzIHdlbGwgZm9yIHBlcmZlY3QgbG9vcC5cblx0XHRcdGlmICggISBub0xvb3AgJiYgdGltZXNbIDAgXSA9PT0gMCApIHtcblxuXHRcdFx0XHR0aW1lcy5wdXNoKCBudW1Nb3JwaFRhcmdldHMgKTtcblx0XHRcdFx0dmFsdWVzLnB1c2goIHZhbHVlc1sgMCBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dHJhY2tzLnB1c2goXG5cdFx0XHRcdFx0bmV3IE51bWJlcktleWZyYW1lVHJhY2soXG5cdFx0XHRcdFx0XHQnLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1snICsgbW9ycGhUYXJnZXRTZXF1ZW5jZVsgaSBdLm5hbWUgKyAnXScsXG5cdFx0XHRcdFx0XHR0aW1lcywgdmFsdWVzXG5cdFx0XHRcdFx0KS5zY2FsZSggMS4wIC8gZnBzICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBuZXcgQW5pbWF0aW9uQ2xpcCggbmFtZSwgLSAxLCB0cmFja3MgKTtcblxuXHR9LFxuXG5cdGZpbmRCeU5hbWU6IGZ1bmN0aW9uICggb2JqZWN0T3JDbGlwQXJyYXksIG5hbWUgKSB7XG5cblx0XHR2YXIgY2xpcEFycmF5ID0gb2JqZWN0T3JDbGlwQXJyYXk7XG5cblx0XHRpZiAoICEgQXJyYXkuaXNBcnJheSggb2JqZWN0T3JDbGlwQXJyYXkgKSApIHtcblxuXHRcdFx0dmFyIG8gPSBvYmplY3RPckNsaXBBcnJheTtcblx0XHRcdGNsaXBBcnJheSA9IG8uZ2VvbWV0cnkgJiYgby5nZW9tZXRyeS5hbmltYXRpb25zIHx8IG8uYW5pbWF0aW9ucztcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGNsaXBBcnJheS5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGlmICggY2xpcEFycmF5WyBpIF0ubmFtZSA9PT0gbmFtZSApIHtcblxuXHRcdFx0XHRyZXR1cm4gY2xpcEFycmF5WyBpIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdH0sXG5cblx0Q3JlYXRlQ2xpcHNGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZXM6IGZ1bmN0aW9uICggbW9ycGhUYXJnZXRzLCBmcHMsIG5vTG9vcCApIHtcblxuXHRcdHZhciBhbmltYXRpb25Ub01vcnBoVGFyZ2V0cyA9IHt9O1xuXG5cdFx0Ly8gdGVzdGVkIHdpdGggaHR0cHM6Ly9yZWdleDEwMS5jb20vIG9uIHRyaWNrIHNlcXVlbmNlc1xuXHRcdC8vIHN1Y2ggZmxhbWluZ29fZmx5QV8wMDMsIGZsYW1pbmdvX3J1bjFfMDAzLCBjcmRlYXRoMDA1OVxuXHRcdHZhciBwYXR0ZXJuID0gL14oW1xcdy1dKj8pKFtcXGRdKykkLztcblxuXHRcdC8vIHNvcnQgbW9ycGggdGFyZ2V0IG5hbWVzIGludG8gYW5pbWF0aW9uIGdyb3VwcyBiYXNlZFxuXHRcdC8vIHBhdHRlcm5zIGxpa2UgV2Fsa18wMDEsIFdhbGtfMDAyLCBSdW5fMDAxLCBSdW5fMDAyXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIG1vcnBoVGFyZ2V0ID0gbW9ycGhUYXJnZXRzWyBpIF07XG5cdFx0XHR2YXIgcGFydHMgPSBtb3JwaFRhcmdldC5uYW1lLm1hdGNoKCBwYXR0ZXJuICk7XG5cblx0XHRcdGlmICggcGFydHMgJiYgcGFydHMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0XHR2YXIgbmFtZSA9IHBhcnRzWyAxIF07XG5cblx0XHRcdFx0dmFyIGFuaW1hdGlvbk1vcnBoVGFyZ2V0cyA9IGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzWyBuYW1lIF07XG5cdFx0XHRcdGlmICggISBhbmltYXRpb25Nb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdFx0XHRhbmltYXRpb25Ub01vcnBoVGFyZ2V0c1sgbmFtZSBdID0gYW5pbWF0aW9uTW9ycGhUYXJnZXRzID0gW107XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGFuaW1hdGlvbk1vcnBoVGFyZ2V0cy5wdXNoKCBtb3JwaFRhcmdldCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgY2xpcHMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBuYW1lIGluIGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRjbGlwcy5wdXNoKCBBbmltYXRpb25DbGlwLkNyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlKCBuYW1lLCBhbmltYXRpb25Ub01vcnBoVGFyZ2V0c1sgbmFtZSBdLCBmcHMsIG5vTG9vcCApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY2xpcHM7XG5cblx0fSxcblxuXHQvLyBwYXJzZSB0aGUgYW5pbWF0aW9uLmhpZXJhcmNoeSBmb3JtYXRcblx0cGFyc2VBbmltYXRpb246IGZ1bmN0aW9uICggYW5pbWF0aW9uLCBib25lcyApIHtcblxuXHRcdGlmICggISBhbmltYXRpb24gKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoIFwiICBubyBhbmltYXRpb24gaW4gSlNPTkxvYWRlciBkYXRhXCIgKTtcblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGFkZE5vbmVtcHR5VHJhY2sgPSBmdW5jdGlvbiAoIHRyYWNrVHlwZSwgdHJhY2tOYW1lLCBhbmltYXRpb25LZXlzLCBwcm9wZXJ0eU5hbWUsIGRlc3RUcmFja3MgKSB7XG5cblx0XHRcdC8vIG9ubHkgcmV0dXJuIHRyYWNrIGlmIHRoZXJlIGFyZSBhY3R1YWxseSBrZXlzLlxuXHRcdFx0aWYgKCBhbmltYXRpb25LZXlzLmxlbmd0aCAhPT0gMCApIHtcblxuXHRcdFx0XHR2YXIgdGltZXMgPSBbXTtcblx0XHRcdFx0dmFyIHZhbHVlcyA9IFtdO1xuXG5cdFx0XHRcdEFuaW1hdGlvblV0aWxzLmZsYXR0ZW5KU09OKCBhbmltYXRpb25LZXlzLCB0aW1lcywgdmFsdWVzLCBwcm9wZXJ0eU5hbWUgKTtcblxuXHRcdFx0XHQvLyBlbXB0eSBrZXlzIGFyZSBmaWx0ZXJlZCBvdXQsIHNvIGNoZWNrIGFnYWluXG5cdFx0XHRcdGlmICggdGltZXMubGVuZ3RoICE9PSAwICkge1xuXG5cdFx0XHRcdFx0ZGVzdFRyYWNrcy5wdXNoKCBuZXcgdHJhY2tUeXBlKCB0cmFja05hbWUsIHRpbWVzLCB2YWx1ZXMgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHRcdHZhciB0cmFja3MgPSBbXTtcblxuXHRcdHZhciBjbGlwTmFtZSA9IGFuaW1hdGlvbi5uYW1lIHx8ICdkZWZhdWx0Jztcblx0XHQvLyBhdXRvbWF0aWMgbGVuZ3RoIGRldGVybWluYXRpb24gaW4gQW5pbWF0aW9uQ2xpcC5cblx0XHR2YXIgZHVyYXRpb24gPSBhbmltYXRpb24ubGVuZ3RoIHx8IC0gMTtcblx0XHR2YXIgZnBzID0gYW5pbWF0aW9uLmZwcyB8fCAzMDtcblxuXHRcdHZhciBoaWVyYXJjaHlUcmFja3MgPSBhbmltYXRpb24uaGllcmFyY2h5IHx8IFtdO1xuXG5cdFx0Zm9yICggdmFyIGggPSAwOyBoIDwgaGllcmFyY2h5VHJhY2tzLmxlbmd0aDsgaCArKyApIHtcblxuXHRcdFx0dmFyIGFuaW1hdGlvbktleXMgPSBoaWVyYXJjaHlUcmFja3NbIGggXS5rZXlzO1xuXG5cdFx0XHQvLyBza2lwIGVtcHR5IHRyYWNrc1xuXHRcdFx0aWYgKCAhIGFuaW1hdGlvbktleXMgfHwgYW5pbWF0aW9uS2V5cy5sZW5ndGggPT09IDAgKSBjb250aW51ZTtcblxuXHRcdFx0Ly8gcHJvY2VzcyBtb3JwaCB0YXJnZXRzIGluIGEgd2F5IGV4YWN0bHkgY29tcGF0aWJsZVxuXHRcdFx0Ly8gd2l0aCBBbmltYXRpb25IYW5kbGVyLmluaXQoIGFuaW1hdGlvbiApXG5cdFx0XHRpZiAoIGFuaW1hdGlvbktleXNbIDAgXS5tb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdFx0Ly8gZmlndXJlIG91dCBhbGwgbW9ycGggdGFyZ2V0cyB1c2VkIGluIHRoaXMgdHJhY2tcblx0XHRcdFx0dmFyIG1vcnBoVGFyZ2V0TmFtZXMgPSB7fTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgayA9IDA7IGsgPCBhbmltYXRpb25LZXlzLmxlbmd0aDsgayArKyApIHtcblxuXHRcdFx0XHRcdGlmICggYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIG0gPSAwOyBtIDwgYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7IG0gKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0bW9ycGhUYXJnZXROYW1lc1sgYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0c1sgbSBdIF0gPSAtIDE7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gY3JlYXRlIGEgdHJhY2sgZm9yIGVhY2ggbW9ycGggdGFyZ2V0IHdpdGggYWxsIHplcm9cblx0XHRcdFx0Ly8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGV4Y2VwdCBmb3IgdGhlIGtleXMgaW4gd2hpY2hcblx0XHRcdFx0Ly8gdGhlIG1vcnBoVGFyZ2V0IGlzIG5hbWVkLlxuXHRcdFx0XHRmb3IgKCB2YXIgbW9ycGhUYXJnZXROYW1lIGluIG1vcnBoVGFyZ2V0TmFtZXMgKSB7XG5cblx0XHRcdFx0XHR2YXIgdGltZXMgPSBbXTtcblx0XHRcdFx0XHR2YXIgdmFsdWVzID0gW107XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgbSA9IDA7IG0gIT09IGFuaW1hdGlvbktleXNbIGsgXS5tb3JwaFRhcmdldHMubGVuZ3RoOyArKyBtICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgYW5pbWF0aW9uS2V5ID0gYW5pbWF0aW9uS2V5c1sgayBdO1xuXG5cdFx0XHRcdFx0XHR0aW1lcy5wdXNoKCBhbmltYXRpb25LZXkudGltZSApO1xuXHRcdFx0XHRcdFx0dmFsdWVzLnB1c2goICggYW5pbWF0aW9uS2V5Lm1vcnBoVGFyZ2V0ID09PSBtb3JwaFRhcmdldE5hbWUgKSA/IDEgOiAwICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0cmFja3MucHVzaCggbmV3IE51bWJlcktleWZyYW1lVHJhY2soICcubW9ycGhUYXJnZXRJbmZsdWVuY2VbJyArIG1vcnBoVGFyZ2V0TmFtZSArICddJywgdGltZXMsIHZhbHVlcyApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGR1cmF0aW9uID0gbW9ycGhUYXJnZXROYW1lcy5sZW5ndGggKiAoIGZwcyB8fCAxLjAgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyAuLi5hc3N1bWUgc2tlbGV0YWwgYW5pbWF0aW9uXG5cblx0XHRcdFx0dmFyIGJvbmVOYW1lID0gJy5ib25lc1snICsgYm9uZXNbIGggXS5uYW1lICsgJ10nO1xuXG5cdFx0XHRcdGFkZE5vbmVtcHR5VHJhY2soXG5cdFx0XHRcdFx0XHRWZWN0b3JLZXlmcmFtZVRyYWNrLCBib25lTmFtZSArICcucG9zaXRpb24nLFxuXHRcdFx0XHRcdFx0YW5pbWF0aW9uS2V5cywgJ3BvcycsIHRyYWNrcyApO1xuXG5cdFx0XHRcdGFkZE5vbmVtcHR5VHJhY2soXG5cdFx0XHRcdFx0XHRRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjaywgYm9uZU5hbWUgKyAnLnF1YXRlcm5pb24nLFxuXHRcdFx0XHRcdFx0YW5pbWF0aW9uS2V5cywgJ3JvdCcsIHRyYWNrcyApO1xuXG5cdFx0XHRcdGFkZE5vbmVtcHR5VHJhY2soXG5cdFx0XHRcdFx0XHRWZWN0b3JLZXlmcmFtZVRyYWNrLCBib25lTmFtZSArICcuc2NhbGUnLFxuXHRcdFx0XHRcdFx0YW5pbWF0aW9uS2V5cywgJ3NjbCcsIHRyYWNrcyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRyYWNrcy5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGNsaXAgPSBuZXcgQW5pbWF0aW9uQ2xpcCggY2xpcE5hbWUsIGR1cmF0aW9uLCB0cmFja3MgKTtcblxuXHRcdHJldHVybiBjbGlwO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBBbmltYXRpb25DbGlwLnByb3RvdHlwZSwge1xuXG5cdHJlc2V0RHVyYXRpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0cmFja3MgPSB0aGlzLnRyYWNrcywgZHVyYXRpb24gPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gdHJhY2tzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dmFyIHRyYWNrID0gdGhpcy50cmFja3NbIGkgXTtcblxuXHRcdFx0ZHVyYXRpb24gPSBNYXRoLm1heCggZHVyYXRpb24sIHRyYWNrLnRpbWVzWyB0cmFjay50aW1lcy5sZW5ndGggLSAxIF0gKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjtcblxuXHR9LFxuXG5cdHRyaW06IGZ1bmN0aW9uICgpIHtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy50cmFja3NbIGkgXS50cmltKCAwLCB0aGlzLmR1cmF0aW9uICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG9wdGltaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMudHJhY2tzWyBpIF0ub3B0aW1pemUoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gTWF0ZXJpYWxMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cdHRoaXMudGV4dHVyZXMgPSB7fTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBNYXRlcmlhbExvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggc2NvcGUubWFuYWdlciApO1xuXHRcdGxvYWRlci5zZXRSZXNwb25zZVR5cGUoICdqc29uJyApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdFx0b25Mb2FkKCBzY29wZS5wYXJzZSgganNvbiApICk7XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fSxcblxuXHRzZXRUZXh0dXJlczogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMudGV4dHVyZXMgPSB2YWx1ZTtcblxuXHR9LFxuXG5cdHBhcnNlOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR2YXIgdGV4dHVyZXMgPSB0aGlzLnRleHR1cmVzO1xuXG5cdFx0ZnVuY3Rpb24gZ2V0VGV4dHVyZSggbmFtZSApIHtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlc1sgbmFtZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWxMb2FkZXI6IFVuZGVmaW5lZCB0ZXh0dXJlJywgbmFtZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0ZXh0dXJlc1sgbmFtZSBdO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG1hdGVyaWFsID0gbmV3IE1hdGVyaWFsc1sganNvbi50eXBlIF0oKTtcblxuXHRcdGlmICgganNvbi51dWlkICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC51dWlkID0ganNvbi51dWlkO1xuXHRcdGlmICgganNvbi5uYW1lICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5uYW1lID0ganNvbi5uYW1lO1xuXHRcdGlmICgganNvbi5jb2xvciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY29sb3Iuc2V0SGV4KCBqc29uLmNvbG9yICk7XG5cdFx0aWYgKCBqc29uLnJvdWdobmVzcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucm91Z2huZXNzID0ganNvbi5yb3VnaG5lc3M7XG5cdFx0aWYgKCBqc29uLm1ldGFsbmVzcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubWV0YWxuZXNzID0ganNvbi5tZXRhbG5lc3M7XG5cdFx0aWYgKCBqc29uLmVtaXNzaXZlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbWlzc2l2ZS5zZXRIZXgoIGpzb24uZW1pc3NpdmUgKTtcblx0XHRpZiAoIGpzb24uc3BlY3VsYXIgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNwZWN1bGFyLnNldEhleCgganNvbi5zcGVjdWxhciApO1xuXHRcdGlmICgganNvbi5zaGluaW5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNoaW5pbmVzcyA9IGpzb24uc2hpbmluZXNzO1xuXHRcdGlmICgganNvbi5jbGVhckNvYXQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNsZWFyQ29hdCA9IGpzb24uY2xlYXJDb2F0O1xuXHRcdGlmICgganNvbi5jbGVhckNvYXRSb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNsZWFyQ29hdFJvdWdobmVzcyA9IGpzb24uY2xlYXJDb2F0Um91Z2huZXNzO1xuXHRcdGlmICgganNvbi51bmlmb3JtcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudW5pZm9ybXMgPSBqc29uLnVuaWZvcm1zO1xuXHRcdGlmICgganNvbi52ZXJ0ZXhTaGFkZXIgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnZlcnRleFNoYWRlciA9IGpzb24udmVydGV4U2hhZGVyO1xuXHRcdGlmICgganNvbi5mcmFnbWVudFNoYWRlciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZnJhZ21lbnRTaGFkZXIgPSBqc29uLmZyYWdtZW50U2hhZGVyO1xuXHRcdGlmICgganNvbi52ZXJ0ZXhDb2xvcnMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnZlcnRleENvbG9ycyA9IGpzb24udmVydGV4Q29sb3JzO1xuXHRcdGlmICgganNvbi5mb2cgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZvZyA9IGpzb24uZm9nO1xuXHRcdGlmICgganNvbi5zaGFkaW5nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaGFkaW5nID0ganNvbi5zaGFkaW5nO1xuXHRcdGlmICgganNvbi5ibGVuZGluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYmxlbmRpbmcgPSBqc29uLmJsZW5kaW5nO1xuXHRcdGlmICgganNvbi5zaWRlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaWRlID0ganNvbi5zaWRlO1xuXHRcdGlmICgganNvbi5vcGFjaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5vcGFjaXR5ID0ganNvbi5vcGFjaXR5O1xuXHRcdGlmICgganNvbi50cmFuc3BhcmVudCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudHJhbnNwYXJlbnQgPSBqc29uLnRyYW5zcGFyZW50O1xuXHRcdGlmICgganNvbi5hbHBoYVRlc3QgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFscGhhVGVzdCA9IGpzb24uYWxwaGFUZXN0O1xuXHRcdGlmICgganNvbi5kZXB0aFRlc3QgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRlcHRoVGVzdCA9IGpzb24uZGVwdGhUZXN0O1xuXHRcdGlmICgganNvbi5kZXB0aFdyaXRlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kZXB0aFdyaXRlID0ganNvbi5kZXB0aFdyaXRlO1xuXHRcdGlmICgganNvbi5jb2xvcldyaXRlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jb2xvcldyaXRlID0ganNvbi5jb2xvcldyaXRlO1xuXHRcdGlmICgganNvbi53aXJlZnJhbWUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLndpcmVmcmFtZSA9IGpzb24ud2lyZWZyYW1lO1xuXHRcdGlmICgganNvbi53aXJlZnJhbWVMaW5ld2lkdGggIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLndpcmVmcmFtZUxpbmV3aWR0aCA9IGpzb24ud2lyZWZyYW1lTGluZXdpZHRoO1xuXHRcdGlmICgganNvbi53aXJlZnJhbWVMaW5lY2FwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWVMaW5lY2FwID0ganNvbi53aXJlZnJhbWVMaW5lY2FwO1xuXHRcdGlmICgganNvbi53aXJlZnJhbWVMaW5lam9pbiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwud2lyZWZyYW1lTGluZWpvaW4gPSBqc29uLndpcmVmcmFtZUxpbmVqb2luO1xuXHRcdGlmICgganNvbi5za2lubmluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2tpbm5pbmcgPSBqc29uLnNraW5uaW5nO1xuXHRcdGlmICgganNvbi5tb3JwaFRhcmdldHMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyA9IGpzb24ubW9ycGhUYXJnZXRzO1xuXG5cdFx0Ly8gZm9yIFBvaW50c01hdGVyaWFsXG5cblx0XHRpZiAoIGpzb24uc2l6ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2l6ZSA9IGpzb24uc2l6ZTtcblx0XHRpZiAoIGpzb24uc2l6ZUF0dGVudWF0aW9uICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaXplQXR0ZW51YXRpb24gPSBqc29uLnNpemVBdHRlbnVhdGlvbjtcblxuXHRcdC8vIG1hcHNcblxuXHRcdGlmICgganNvbi5tYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1hcCA9IGdldFRleHR1cmUoIGpzb24ubWFwICk7XG5cblx0XHRpZiAoIGpzb24uYWxwaGFNYXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bWF0ZXJpYWwuYWxwaGFNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmFscGhhTWFwICk7XG5cdFx0XHRtYXRlcmlhbC50cmFuc3BhcmVudCA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIGpzb24uYnVtcE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYnVtcE1hcCA9IGdldFRleHR1cmUoIGpzb24uYnVtcE1hcCApO1xuXHRcdGlmICgganNvbi5idW1wU2NhbGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJ1bXBTY2FsZSA9IGpzb24uYnVtcFNjYWxlO1xuXG5cdFx0aWYgKCBqc29uLm5vcm1hbE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubm9ybWFsTWFwID0gZ2V0VGV4dHVyZSgganNvbi5ub3JtYWxNYXAgKTtcblx0XHRpZiAoIGpzb24ubm9ybWFsU2NhbGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIG5vcm1hbFNjYWxlID0ganNvbi5ub3JtYWxTY2FsZTtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBub3JtYWxTY2FsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHQvLyBCbGVuZGVyIGV4cG9ydGVyIHVzZWQgdG8gZXhwb3J0IGEgc2NhbGFyLiBTZWUgIzc0NTlcblxuXHRcdFx0XHRub3JtYWxTY2FsZSA9IFsgbm9ybWFsU2NhbGUsIG5vcm1hbFNjYWxlIF07XG5cblx0XHRcdH1cblxuXHRcdFx0bWF0ZXJpYWwubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMigpLmZyb21BcnJheSggbm9ybWFsU2NhbGUgKTtcblxuXHRcdH1cblxuXHRcdGlmICgganNvbi5kaXNwbGFjZW1lbnRNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCA9IGdldFRleHR1cmUoIGpzb24uZGlzcGxhY2VtZW50TWFwICk7XG5cdFx0aWYgKCBqc29uLmRpc3BsYWNlbWVudFNjYWxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZSA9IGpzb24uZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0aWYgKCBqc29uLmRpc3BsYWNlbWVudEJpYXMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXMgPSBqc29uLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHRpZiAoIGpzb24ucm91Z2huZXNzTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5yb3VnaG5lc3NNYXAgPSBnZXRUZXh0dXJlKCBqc29uLnJvdWdobmVzc01hcCApO1xuXHRcdGlmICgganNvbi5tZXRhbG5lc3NNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1ldGFsbmVzc01hcCA9IGdldFRleHR1cmUoIGpzb24ubWV0YWxuZXNzTWFwICk7XG5cblx0XHRpZiAoIGpzb24uZW1pc3NpdmVNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVtaXNzaXZlTWFwID0gZ2V0VGV4dHVyZSgganNvbi5lbWlzc2l2ZU1hcCApO1xuXHRcdGlmICgganNvbi5lbWlzc2l2ZUludGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW1pc3NpdmVJbnRlbnNpdHkgPSBqc29uLmVtaXNzaXZlSW50ZW5zaXR5O1xuXG5cdFx0aWYgKCBqc29uLnNwZWN1bGFyTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zcGVjdWxhck1hcCA9IGdldFRleHR1cmUoIGpzb24uc3BlY3VsYXJNYXAgKTtcblxuXHRcdGlmICgganNvbi5lbnZNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVudk1hcCA9IGdldFRleHR1cmUoIGpzb24uZW52TWFwICk7XG5cblx0XHRpZiAoIGpzb24ucmVmbGVjdGl2aXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5yZWZsZWN0aXZpdHkgPSBqc29uLnJlZmxlY3Rpdml0eTtcblxuXHRcdGlmICgganNvbi5saWdodE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubGlnaHRNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmxpZ2h0TWFwICk7XG5cdFx0aWYgKCBqc29uLmxpZ2h0TWFwSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5saWdodE1hcEludGVuc2l0eSA9IGpzb24ubGlnaHRNYXBJbnRlbnNpdHk7XG5cblx0XHRpZiAoIGpzb24uYW9NYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFvTWFwID0gZ2V0VGV4dHVyZSgganNvbi5hb01hcCApO1xuXHRcdGlmICgganNvbi5hb01hcEludGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYW9NYXBJbnRlbnNpdHkgPSBqc29uLmFvTWFwSW50ZW5zaXR5O1xuXG5cdFx0aWYgKCBqc29uLmdyYWRpZW50TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ncmFkaWVudE1hcCA9IGdldFRleHR1cmUoIGpzb24uZ3JhZGllbnRNYXAgKTtcblxuXHRcdHJldHVybiBtYXRlcmlhbDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlckdlb21ldHJ5TG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEJ1ZmZlckdlb21ldHJ5TG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFJlc3BvbnNlVHlwZSggJ2pzb24nICk7XG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0XHRvbkxvYWQoIHNjb3BlLnBhcnNlKCBqc29uICkgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHR9LFxuXG5cdHBhcnNlOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHRcdHZhciBpbmRleCA9IGpzb24uZGF0YS5pbmRleDtcblxuXHRcdGlmICggaW5kZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIHR5cGVkQXJyYXkgPSBuZXcgVFlQRURfQVJSQVlTWyBpbmRleC50eXBlIF0oIGluZGV4LmFycmF5ICk7XG5cdFx0XHRnZW9tZXRyeS5zZXRJbmRleCggbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdHlwZWRBcnJheSwgMSApICk7XG5cblx0XHR9XG5cblx0XHR2YXIgYXR0cmlidXRlcyA9IGpzb24uZGF0YS5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggdmFyIGtleSBpbiBhdHRyaWJ1dGVzICkge1xuXG5cdFx0XHR2YXIgYXR0cmlidXRlID0gYXR0cmlidXRlc1sga2V5IF07XG5cdFx0XHR2YXIgdHlwZWRBcnJheSA9IG5ldyBUWVBFRF9BUlJBWVNbIGF0dHJpYnV0ZS50eXBlIF0oIGF0dHJpYnV0ZS5hcnJheSApO1xuXG5cdFx0XHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoIGtleSwgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdHlwZWRBcnJheSwgYXR0cmlidXRlLml0ZW1TaXplLCBhdHRyaWJ1dGUubm9ybWFsaXplZCApICk7XG5cblx0XHR9XG5cblx0XHR2YXIgZ3JvdXBzID0ganNvbi5kYXRhLmdyb3VwcyB8fCBqc29uLmRhdGEuZHJhd2NhbGxzIHx8IGpzb24uZGF0YS5vZmZzZXRzO1xuXG5cdFx0aWYgKCBncm91cHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gZ3JvdXBzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHR2YXIgZ3JvdXAgPSBncm91cHNbIGkgXTtcblxuXHRcdFx0XHRnZW9tZXRyeS5hZGRHcm91cCggZ3JvdXAuc3RhcnQsIGdyb3VwLmNvdW50LCBncm91cC5tYXRlcmlhbEluZGV4ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBib3VuZGluZ1NwaGVyZSA9IGpzb24uZGF0YS5ib3VuZGluZ1NwaGVyZTtcblxuXHRcdGlmICggYm91bmRpbmdTcGhlcmUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIGNlbnRlciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdGlmICggYm91bmRpbmdTcGhlcmUuY2VudGVyICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y2VudGVyLmZyb21BcnJheSggYm91bmRpbmdTcGhlcmUuY2VudGVyICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlKCBjZW50ZXIsIGJvdW5kaW5nU3BoZXJlLnJhZGl1cyApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGdlb21ldHJ5O1xuXG5cdH1cblxufSApO1xuXG52YXIgVFlQRURfQVJSQVlTID0ge1xuXHRJbnQ4QXJyYXk6IEludDhBcnJheSxcblx0VWludDhBcnJheTogVWludDhBcnJheSxcblx0VWludDhDbGFtcGVkQXJyYXk6IFVpbnQ4Q2xhbXBlZEFycmF5LFxuXHRJbnQxNkFycmF5OiBJbnQxNkFycmF5LFxuXHRVaW50MTZBcnJheTogVWludDE2QXJyYXksXG5cdEludDMyQXJyYXk6IEludDMyQXJyYXksXG5cdFVpbnQzMkFycmF5OiBVaW50MzJBcnJheSxcblx0RmxvYXQzMkFycmF5OiBGbG9hdDMyQXJyYXksXG5cdEZsb2F0NjRBcnJheTogRmxvYXQ2NEFycmF5XG59O1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gTG9hZGVyKCkge1xuXG5cdHRoaXMub25Mb2FkU3RhcnQgPSBmdW5jdGlvbiAoKSB7fTtcblx0dGhpcy5vbkxvYWRQcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHt9O1xuXHR0aGlzLm9uTG9hZENvbXBsZXRlID0gZnVuY3Rpb24gKCkge307XG5cbn1cblxuTG9hZGVyLkhhbmRsZXJzID0ge1xuXG5cdGhhbmRsZXJzOiBbXSxcblxuXHRhZGQ6IGZ1bmN0aW9uICggcmVnZXgsIGxvYWRlciApIHtcblxuXHRcdHRoaXMuaGFuZGxlcnMucHVzaCggcmVnZXgsIGxvYWRlciApO1xuXG5cdH0sXG5cblx0Z2V0OiBmdW5jdGlvbiAoIGZpbGUgKSB7XG5cblx0XHR2YXIgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gaGFuZGxlcnMubGVuZ3RoOyBpIDwgbDsgaSArPSAyICkge1xuXG5cdFx0XHR2YXIgcmVnZXggPSBoYW5kbGVyc1sgaSBdO1xuXHRcdFx0dmFyIGxvYWRlciA9IGhhbmRsZXJzWyBpICsgMSBdO1xuXG5cdFx0XHRpZiAoIHJlZ2V4LnRlc3QoIGZpbGUgKSApIHtcblxuXHRcdFx0XHRyZXR1cm4gbG9hZGVyO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblxuXHR9XG5cbn07XG5cbk9iamVjdC5hc3NpZ24oIExvYWRlci5wcm90b3R5cGUsIHtcblxuXHRjcm9zc09yaWdpbjogdW5kZWZpbmVkLFxuXG5cdGV4dHJhY3RVcmxCYXNlOiBmdW5jdGlvbiAoIHVybCApIHtcblxuXHRcdHZhciBwYXJ0cyA9IHVybC5zcGxpdCggJy8nICk7XG5cblx0XHRpZiAoIHBhcnRzLmxlbmd0aCA9PT0gMSApIHJldHVybiAnLi8nO1xuXG5cdFx0cGFydHMucG9wKCk7XG5cblx0XHRyZXR1cm4gcGFydHMuam9pbiggJy8nICkgKyAnLyc7XG5cblx0fSxcblxuXHRpbml0TWF0ZXJpYWxzOiBmdW5jdGlvbiAoIG1hdGVyaWFscywgdGV4dHVyZVBhdGgsIGNyb3NzT3JpZ2luICkge1xuXG5cdFx0dmFyIGFycmF5ID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBtYXRlcmlhbHMubGVuZ3RoOyArKyBpICkge1xuXG5cdFx0XHRhcnJheVsgaSBdID0gdGhpcy5jcmVhdGVNYXRlcmlhbCggbWF0ZXJpYWxzWyBpIF0sIHRleHR1cmVQYXRoLCBjcm9zc09yaWdpbiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0Y3JlYXRlTWF0ZXJpYWw6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIEJsZW5kaW5nTW9kZSA9IHtcblx0XHRcdE5vQmxlbmRpbmc6IE5vQmxlbmRpbmcsXG5cdFx0XHROb3JtYWxCbGVuZGluZzogTm9ybWFsQmxlbmRpbmcsXG5cdFx0XHRBZGRpdGl2ZUJsZW5kaW5nOiBBZGRpdGl2ZUJsZW5kaW5nLFxuXHRcdFx0U3VidHJhY3RpdmVCbGVuZGluZzogU3VidHJhY3RpdmVCbGVuZGluZyxcblx0XHRcdE11bHRpcGx5QmxlbmRpbmc6IE11bHRpcGx5QmxlbmRpbmcsXG5cdFx0XHRDdXN0b21CbGVuZGluZzogQ3VzdG9tQmxlbmRpbmdcblx0XHR9O1xuXG5cdFx0dmFyIGNvbG9yID0gbmV3IENvbG9yKCk7XG5cdFx0dmFyIHRleHR1cmVMb2FkZXIgPSBuZXcgVGV4dHVyZUxvYWRlcigpO1xuXHRcdHZhciBtYXRlcmlhbExvYWRlciA9IG5ldyBNYXRlcmlhbExvYWRlcigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZU1hdGVyaWFsKCBtLCB0ZXh0dXJlUGF0aCwgY3Jvc3NPcmlnaW4gKSB7XG5cblx0XHRcdC8vIGNvbnZlcnQgZnJvbSBvbGQgbWF0ZXJpYWwgZm9ybWF0XG5cblx0XHRcdHZhciB0ZXh0dXJlcyA9IHt9O1xuXG5cdFx0XHRmdW5jdGlvbiBsb2FkVGV4dHVyZSggcGF0aCwgcmVwZWF0LCBvZmZzZXQsIHdyYXAsIGFuaXNvdHJvcHkgKSB7XG5cblx0XHRcdFx0dmFyIGZ1bGxQYXRoID0gdGV4dHVyZVBhdGggKyBwYXRoO1xuXHRcdFx0XHR2YXIgbG9hZGVyID0gTG9hZGVyLkhhbmRsZXJzLmdldCggZnVsbFBhdGggKTtcblxuXHRcdFx0XHR2YXIgdGV4dHVyZTtcblxuXHRcdFx0XHRpZiAoIGxvYWRlciAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUgPSBsb2FkZXIubG9hZCggZnVsbFBhdGggKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dGV4dHVyZUxvYWRlci5zZXRDcm9zc09yaWdpbiggY3Jvc3NPcmlnaW4gKTtcblx0XHRcdFx0XHR0ZXh0dXJlID0gdGV4dHVyZUxvYWRlci5sb2FkKCBmdWxsUGF0aCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHJlcGVhdCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5yZXBlYXQuZnJvbUFycmF5KCByZXBlYXQgKTtcblxuXHRcdFx0XHRcdGlmICggcmVwZWF0WyAwIF0gIT09IDEgKSB0ZXh0dXJlLndyYXBTID0gUmVwZWF0V3JhcHBpbmc7XG5cdFx0XHRcdFx0aWYgKCByZXBlYXRbIDEgXSAhPT0gMSApIHRleHR1cmUud3JhcFQgPSBSZXBlYXRXcmFwcGluZztcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBvZmZzZXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUub2Zmc2V0LmZyb21BcnJheSggb2Zmc2V0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggd3JhcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0aWYgKCB3cmFwWyAwIF0gPT09ICdyZXBlYXQnICkgdGV4dHVyZS53cmFwUyA9IFJlcGVhdFdyYXBwaW5nO1xuXHRcdFx0XHRcdGlmICggd3JhcFsgMCBdID09PSAnbWlycm9yJyApIHRleHR1cmUud3JhcFMgPSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nO1xuXG5cdFx0XHRcdFx0aWYgKCB3cmFwWyAxIF0gPT09ICdyZXBlYXQnICkgdGV4dHVyZS53cmFwVCA9IFJlcGVhdFdyYXBwaW5nO1xuXHRcdFx0XHRcdGlmICggd3JhcFsgMSBdID09PSAnbWlycm9yJyApIHRleHR1cmUud3JhcFQgPSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIGFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUuYW5pc290cm9weSA9IGFuaXNvdHJvcHk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciB1dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0XHRcdFx0dGV4dHVyZXNbIHV1aWQgXSA9IHRleHR1cmU7XG5cblx0XHRcdFx0cmV0dXJuIHV1aWQ7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly9cblxuXHRcdFx0dmFyIGpzb24gPSB7XG5cdFx0XHRcdHV1aWQ6IF9NYXRoLmdlbmVyYXRlVVVJRCgpLFxuXHRcdFx0XHR0eXBlOiAnTWVzaExhbWJlcnRNYXRlcmlhbCdcblx0XHRcdH07XG5cblx0XHRcdGZvciAoIHZhciBuYW1lIGluIG0gKSB7XG5cblx0XHRcdFx0dmFyIHZhbHVlID0gbVsgbmFtZSBdO1xuXG5cdFx0XHRcdHN3aXRjaCAoIG5hbWUgKSB7XG5cblx0XHRcdFx0XHRjYXNlICdEYmdDb2xvcic6XG5cdFx0XHRcdFx0Y2FzZSAnRGJnSW5kZXgnOlxuXHRcdFx0XHRcdGNhc2UgJ29wdGljYWxEZW5zaXR5Jzpcblx0XHRcdFx0XHRjYXNlICdpbGx1bWluYXRpb24nOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnRGJnTmFtZSc6XG5cdFx0XHRcdFx0XHRqc29uLm5hbWUgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2JsZW5kaW5nJzpcblx0XHRcdFx0XHRcdGpzb24uYmxlbmRpbmcgPSBCbGVuZGluZ01vZGVbIHZhbHVlIF07XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdjb2xvckFtYmllbnQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEFtYmllbnQnOlxuXHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTG9hZGVyLmNyZWF0ZU1hdGVyaWFsOicsIG5hbWUsICdpcyBubyBsb25nZXIgc3VwcG9ydGVkLicgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NvbG9yRGlmZnVzZSc6XG5cdFx0XHRcdFx0XHRqc29uLmNvbG9yID0gY29sb3IuZnJvbUFycmF5KCB2YWx1ZSApLmdldEhleCgpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29sb3JTcGVjdWxhcic6XG5cdFx0XHRcdFx0XHRqc29uLnNwZWN1bGFyID0gY29sb3IuZnJvbUFycmF5KCB2YWx1ZSApLmdldEhleCgpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29sb3JFbWlzc2l2ZSc6XG5cdFx0XHRcdFx0XHRqc29uLmVtaXNzaXZlID0gY29sb3IuZnJvbUFycmF5KCB2YWx1ZSApLmdldEhleCgpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc3BlY3VsYXJDb2VmJzpcblx0XHRcdFx0XHRcdGpzb24uc2hpbmluZXNzID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdzaGFkaW5nJzpcblx0XHRcdFx0XHRcdGlmICggdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ2Jhc2ljJyApIGpzb24udHlwZSA9ICdNZXNoQmFzaWNNYXRlcmlhbCc7XG5cdFx0XHRcdFx0XHRpZiAoIHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICdwaG9uZycgKSBqc29uLnR5cGUgPSAnTWVzaFBob25nTWF0ZXJpYWwnO1xuXHRcdFx0XHRcdFx0aWYgKCB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAnc3RhbmRhcmQnICkganNvbi50eXBlID0gJ01lc2hTdGFuZGFyZE1hdGVyaWFsJztcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcERpZmZ1c2UnOlxuXHRcdFx0XHRcdFx0anNvbi5tYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwRGlmZnVzZVJlcGVhdCwgbS5tYXBEaWZmdXNlT2Zmc2V0LCBtLm1hcERpZmZ1c2VXcmFwLCBtLm1hcERpZmZ1c2VBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBEaWZmdXNlUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBEaWZmdXNlT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBEaWZmdXNlV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRGlmZnVzZUFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRW1pc3NpdmUnOlxuXHRcdFx0XHRcdFx0anNvbi5lbWlzc2l2ZU1hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBFbWlzc2l2ZVJlcGVhdCwgbS5tYXBFbWlzc2l2ZU9mZnNldCwgbS5tYXBFbWlzc2l2ZVdyYXAsIG0ubWFwRW1pc3NpdmVBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBFbWlzc2l2ZVJlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRW1pc3NpdmVPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEVtaXNzaXZlV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRW1pc3NpdmVBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcExpZ2h0Jzpcblx0XHRcdFx0XHRcdGpzb24ubGlnaHRNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwTGlnaHRSZXBlYXQsIG0ubWFwTGlnaHRPZmZzZXQsIG0ubWFwTGlnaHRXcmFwLCBtLm1hcExpZ2h0QW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTGlnaHRSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcExpZ2h0T2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBMaWdodFdyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcExpZ2h0QW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBBTyc6XG5cdFx0XHRcdFx0XHRqc29uLmFvTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcEFPUmVwZWF0LCBtLm1hcEFPT2Zmc2V0LCBtLm1hcEFPV3JhcCwgbS5tYXBBT0FuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEFPUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBBT09mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQU9XcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBBT0FuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQnVtcCc6XG5cdFx0XHRcdFx0XHRqc29uLmJ1bXBNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwQnVtcFJlcGVhdCwgbS5tYXBCdW1wT2Zmc2V0LCBtLm1hcEJ1bXBXcmFwLCBtLm1hcEJ1bXBBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBCdW1wU2NhbGUnOlxuXHRcdFx0XHRcdFx0anNvbi5idW1wU2NhbGUgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEJ1bXBSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEJ1bXBPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEJ1bXBXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBCdW1wQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBOb3JtYWwnOlxuXHRcdFx0XHRcdFx0anNvbi5ub3JtYWxNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwTm9ybWFsUmVwZWF0LCBtLm1hcE5vcm1hbE9mZnNldCwgbS5tYXBOb3JtYWxXcmFwLCBtLm1hcE5vcm1hbEFuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcE5vcm1hbEZhY3Rvcic6XG5cdFx0XHRcdFx0XHRqc29uLm5vcm1hbFNjYWxlID0gWyB2YWx1ZSwgdmFsdWUgXTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcE5vcm1hbFJlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTm9ybWFsT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBOb3JtYWxXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBOb3JtYWxBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcFNwZWN1bGFyJzpcblx0XHRcdFx0XHRcdGpzb24uc3BlY3VsYXJNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwU3BlY3VsYXJSZXBlYXQsIG0ubWFwU3BlY3VsYXJPZmZzZXQsIG0ubWFwU3BlY3VsYXJXcmFwLCBtLm1hcFNwZWN1bGFyQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwU3BlY3VsYXJSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcFNwZWN1bGFyT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBTcGVjdWxhcldyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcFNwZWN1bGFyQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBNZXRhbG5lc3MnOlxuXHRcdFx0XHRcdFx0anNvbi5tZXRhbG5lc3NNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwTWV0YWxuZXNzUmVwZWF0LCBtLm1hcE1ldGFsbmVzc09mZnNldCwgbS5tYXBNZXRhbG5lc3NXcmFwLCBtLm1hcE1ldGFsbmVzc0FuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcE1ldGFsbmVzc1JlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTWV0YWxuZXNzT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBNZXRhbG5lc3NXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBNZXRhbG5lc3NBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcFJvdWdobmVzcyc6XG5cdFx0XHRcdFx0XHRqc29uLnJvdWdobmVzc01hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBSb3VnaG5lc3NSZXBlYXQsIG0ubWFwUm91Z2huZXNzT2Zmc2V0LCBtLm1hcFJvdWdobmVzc1dyYXAsIG0ubWFwUm91Z2huZXNzQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwUm91Z2huZXNzUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBSb3VnaG5lc3NPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcFJvdWdobmVzc1dyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcFJvdWdobmVzc0FuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQWxwaGEnOlxuXHRcdFx0XHRcdFx0anNvbi5hbHBoYU1hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBBbHBoYVJlcGVhdCwgbS5tYXBBbHBoYU9mZnNldCwgbS5tYXBBbHBoYVdyYXAsIG0ubWFwQWxwaGFBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBBbHBoYVJlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQWxwaGFPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEFscGhhV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQWxwaGFBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2ZsaXBTaWRlZCc6XG5cdFx0XHRcdFx0XHRqc29uLnNpZGUgPSBCYWNrU2lkZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2RvdWJsZVNpZGVkJzpcblx0XHRcdFx0XHRcdGpzb24uc2lkZSA9IERvdWJsZVNpZGU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICd0cmFuc3BhcmVuY3knOlxuXHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTG9hZGVyLmNyZWF0ZU1hdGVyaWFsOiB0cmFuc3BhcmVuY3kgaGFzIGJlZW4gcmVuYW1lZCB0byBvcGFjaXR5JyApO1xuXHRcdFx0XHRcdFx0anNvbi5vcGFjaXR5ID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdkZXB0aFRlc3QnOlxuXHRcdFx0XHRcdGNhc2UgJ2RlcHRoV3JpdGUnOlxuXHRcdFx0XHRcdGNhc2UgJ2NvbG9yV3JpdGUnOlxuXHRcdFx0XHRcdGNhc2UgJ29wYWNpdHknOlxuXHRcdFx0XHRcdGNhc2UgJ3JlZmxlY3Rpdml0eSc6XG5cdFx0XHRcdFx0Y2FzZSAndHJhbnNwYXJlbnQnOlxuXHRcdFx0XHRcdGNhc2UgJ3Zpc2libGUnOlxuXHRcdFx0XHRcdGNhc2UgJ3dpcmVmcmFtZSc6XG5cdFx0XHRcdFx0XHRqc29uWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3ZlcnRleENvbG9ycyc6XG5cdFx0XHRcdFx0XHRpZiAoIHZhbHVlID09PSB0cnVlICkganNvbi52ZXJ0ZXhDb2xvcnMgPSBWZXJ0ZXhDb2xvcnM7XG5cdFx0XHRcdFx0XHRpZiAoIHZhbHVlID09PSAnZmFjZScgKSBqc29uLnZlcnRleENvbG9ycyA9IEZhY2VDb2xvcnM7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkxvYWRlci5jcmVhdGVNYXRlcmlhbDogVW5zdXBwb3J0ZWQnLCBuYW1lLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICgganNvbi50eXBlID09PSAnTWVzaEJhc2ljTWF0ZXJpYWwnICkgZGVsZXRlIGpzb24uZW1pc3NpdmU7XG5cdFx0XHRpZiAoIGpzb24udHlwZSAhPT0gJ01lc2hQaG9uZ01hdGVyaWFsJyApIGRlbGV0ZSBqc29uLnNwZWN1bGFyO1xuXG5cdFx0XHRpZiAoIGpzb24ub3BhY2l0eSA8IDEgKSBqc29uLnRyYW5zcGFyZW50ID0gdHJ1ZTtcblxuXHRcdFx0bWF0ZXJpYWxMb2FkZXIuc2V0VGV4dHVyZXMoIHRleHR1cmVzICk7XG5cblx0XHRcdHJldHVybiBtYXRlcmlhbExvYWRlci5wYXJzZSgganNvbiApO1xuXG5cdFx0fTtcblxuXHR9ICkoKVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gSlNPTkxvYWRlciggbWFuYWdlciApIHtcblxuXHRpZiAoIHR5cGVvZiBtYW5hZ2VyID09PSAnYm9vbGVhbicgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5KU09OTG9hZGVyOiBzaG93U3RhdHVzIHBhcmFtZXRlciBoYXMgYmVlbiByZW1vdmVkIGZyb20gY29uc3RydWN0b3IuJyApO1xuXHRcdG1hbmFnZXIgPSB1bmRlZmluZWQ7XG5cblx0fVxuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG5cdHRoaXMud2l0aENyZWRlbnRpYWxzID0gZmFsc2U7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggSlNPTkxvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciB0ZXh0dXJlUGF0aCA9IHRoaXMudGV4dHVyZVBhdGggJiYgKCB0eXBlb2YgdGhpcy50ZXh0dXJlUGF0aCA9PT0gXCJzdHJpbmdcIiApID8gdGhpcy50ZXh0dXJlUGF0aCA6IExvYWRlci5wcm90b3R5cGUuZXh0cmFjdFVybEJhc2UoIHVybCApO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0UmVzcG9uc2VUeXBlKCAnanNvbicgKTtcblx0XHRsb2FkZXIuc2V0V2l0aENyZWRlbnRpYWxzKCB0aGlzLndpdGhDcmVkZW50aWFscyApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdFx0dmFyIG1ldGFkYXRhID0ganNvbi5tZXRhZGF0YTtcblxuXHRcdFx0aWYgKCBtZXRhZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHZhciB0eXBlID0gbWV0YWRhdGEudHlwZTtcblxuXHRcdFx0XHRpZiAoIHR5cGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGlmICggdHlwZS50b0xvd2VyQ2FzZSgpID09PSAnb2JqZWN0JyApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkpTT05Mb2FkZXI6ICcgKyB1cmwgKyAnIHNob3VsZCBiZSBsb2FkZWQgd2l0aCBUSFJFRS5PYmplY3RMb2FkZXIgaW5zdGVhZC4nICk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIHR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ3NjZW5lJyApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkpTT05Mb2FkZXI6ICcgKyB1cmwgKyAnIHNob3VsZCBiZSBsb2FkZWQgd2l0aCBUSFJFRS5TY2VuZUxvYWRlciBpbnN0ZWFkLicgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG9iamVjdCA9IHNjb3BlLnBhcnNlKCBqc29uLCB0ZXh0dXJlUGF0aCApO1xuXHRcdFx0b25Mb2FkKCBvYmplY3QuZ2VvbWV0cnksIG9iamVjdC5tYXRlcmlhbHMgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHR9LFxuXG5cdHNldFRleHR1cmVQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy50ZXh0dXJlUGF0aCA9IHZhbHVlO1xuXG5cdH0sXG5cblx0cGFyc2U6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0ZnVuY3Rpb24gcGFyc2VNb2RlbCgganNvbiwgZ2VvbWV0cnkgKSB7XG5cblx0XHRcdGZ1bmN0aW9uIGlzQml0U2V0KCB2YWx1ZSwgcG9zaXRpb24gKSB7XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlICYgKCAxIDw8IHBvc2l0aW9uICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGksIGosIGZpLFxuXG5cdFx0XHRcdG9mZnNldCwgekxlbmd0aCxcblxuXHRcdFx0XHRjb2xvckluZGV4LCBub3JtYWxJbmRleCwgdXZJbmRleCwgbWF0ZXJpYWxJbmRleCxcblxuXHRcdFx0XHR0eXBlLFxuXHRcdFx0XHRpc1F1YWQsXG5cdFx0XHRcdGhhc01hdGVyaWFsLFxuXHRcdFx0XHRoYXNGYWNlVmVydGV4VXYsXG5cdFx0XHRcdGhhc0ZhY2VOb3JtYWwsIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwsXG5cdFx0XHRcdGhhc0ZhY2VDb2xvciwgaGFzRmFjZVZlcnRleENvbG9yLFxuXG5cdFx0XHRcdHZlcnRleCwgZmFjZSwgZmFjZUEsIGZhY2VCLCBoZXgsIG5vcm1hbCxcblxuXHRcdFx0XHR1dkxheWVyLCB1diwgdSwgdixcblxuXHRcdFx0XHRmYWNlcyA9IGpzb24uZmFjZXMsXG5cdFx0XHRcdHZlcnRpY2VzID0ganNvbi52ZXJ0aWNlcyxcblx0XHRcdFx0bm9ybWFscyA9IGpzb24ubm9ybWFscyxcblx0XHRcdFx0Y29sb3JzID0ganNvbi5jb2xvcnMsXG5cblx0XHRcdFx0c2NhbGUgPSBqc29uLnNjYWxlLFxuXG5cdFx0XHRcdG5VdkxheWVycyA9IDA7XG5cblxuXHRcdFx0aWYgKCBqc29uLnV2cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIGRpc3JlZ2FyZCBlbXB0eSBhcnJheXNcblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGpzb24udXZzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGlmICgganNvbi51dnNbIGkgXS5sZW5ndGggKSBuVXZMYXllcnMgKys7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgblV2TGF5ZXJzOyBpICsrICkge1xuXG5cdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdID0gW107XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdG9mZnNldCA9IDA7XG5cdFx0XHR6TGVuZ3RoID0gdmVydGljZXMubGVuZ3RoO1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldCA8IHpMZW5ndGggKSB7XG5cblx0XHRcdFx0dmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0XHR2ZXJ0ZXgueCA9IHZlcnRpY2VzWyBvZmZzZXQgKysgXSAqIHNjYWxlO1xuXHRcdFx0XHR2ZXJ0ZXgueSA9IHZlcnRpY2VzWyBvZmZzZXQgKysgXSAqIHNjYWxlO1xuXHRcdFx0XHR2ZXJ0ZXgueiA9IHZlcnRpY2VzWyBvZmZzZXQgKysgXSAqIHNjYWxlO1xuXG5cdFx0XHRcdGdlb21ldHJ5LnZlcnRpY2VzLnB1c2goIHZlcnRleCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdG9mZnNldCA9IDA7XG5cdFx0XHR6TGVuZ3RoID0gZmFjZXMubGVuZ3RoO1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldCA8IHpMZW5ndGggKSB7XG5cblx0XHRcdFx0dHlwZSA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHRpc1F1YWQgPSBpc0JpdFNldCggdHlwZSwgMCApO1xuXHRcdFx0XHRoYXNNYXRlcmlhbCA9IGlzQml0U2V0KCB0eXBlLCAxICk7XG5cdFx0XHRcdGhhc0ZhY2VWZXJ0ZXhVdiA9IGlzQml0U2V0KCB0eXBlLCAzICk7XG5cdFx0XHRcdGhhc0ZhY2VOb3JtYWwgPSBpc0JpdFNldCggdHlwZSwgNCApO1xuXHRcdFx0XHRoYXNGYWNlVmVydGV4Tm9ybWFsID0gaXNCaXRTZXQoIHR5cGUsIDUgKTtcblx0XHRcdFx0aGFzRmFjZUNvbG9yID0gaXNCaXRTZXQoIHR5cGUsIDYgKTtcblx0XHRcdFx0aGFzRmFjZVZlcnRleENvbG9yID0gaXNCaXRTZXQoIHR5cGUsIDcgKTtcblxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcInR5cGVcIiwgdHlwZSwgXCJiaXRzXCIsIGlzUXVhZCwgaGFzTWF0ZXJpYWwsIGhhc0ZhY2VWZXJ0ZXhVdiwgaGFzRmFjZU5vcm1hbCwgaGFzRmFjZVZlcnRleE5vcm1hbCwgaGFzRmFjZUNvbG9yLCBoYXNGYWNlVmVydGV4Q29sb3IpO1xuXG5cdFx0XHRcdGlmICggaXNRdWFkICkge1xuXG5cdFx0XHRcdFx0ZmFjZUEgPSBuZXcgRmFjZTMoKTtcblx0XHRcdFx0XHRmYWNlQS5hID0gZmFjZXNbIG9mZnNldCBdO1xuXHRcdFx0XHRcdGZhY2VBLmIgPSBmYWNlc1sgb2Zmc2V0ICsgMSBdO1xuXHRcdFx0XHRcdGZhY2VBLmMgPSBmYWNlc1sgb2Zmc2V0ICsgMyBdO1xuXG5cdFx0XHRcdFx0ZmFjZUIgPSBuZXcgRmFjZTMoKTtcblx0XHRcdFx0XHRmYWNlQi5hID0gZmFjZXNbIG9mZnNldCArIDEgXTtcblx0XHRcdFx0XHRmYWNlQi5iID0gZmFjZXNbIG9mZnNldCArIDIgXTtcblx0XHRcdFx0XHRmYWNlQi5jID0gZmFjZXNbIG9mZnNldCArIDMgXTtcblxuXHRcdFx0XHRcdG9mZnNldCArPSA0O1xuXG5cdFx0XHRcdFx0aWYgKCBoYXNNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRcdFx0bWF0ZXJpYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRcdGZhY2VBLm1hdGVyaWFsSW5kZXggPSBtYXRlcmlhbEluZGV4O1xuXHRcdFx0XHRcdFx0ZmFjZUIubWF0ZXJpYWxJbmRleCA9IG1hdGVyaWFsSW5kZXg7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyB0byBnZXQgZmFjZSA8PT4gdXYgaW5kZXggY29ycmVzcG9uZGVuY2VcblxuXHRcdFx0XHRcdGZpID0gZ2VvbWV0cnkuZmFjZXMubGVuZ3RoO1xuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4VXYgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgblV2TGF5ZXJzOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHV2TGF5ZXIgPSBqc29uLnV2c1sgaSBdO1xuXG5cdFx0XHRcdFx0XHRcdGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgXSA9IFtdO1xuXHRcdFx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpICsgMSBdID0gW107XG5cblx0XHRcdFx0XHRcdFx0Zm9yICggaiA9IDA7IGogPCA0OyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0dXZJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHRcdFx0XHRcdHUgPSB1dkxheWVyWyB1dkluZGV4ICogMiBdO1xuXHRcdFx0XHRcdFx0XHRcdHYgPSB1dkxheWVyWyB1dkluZGV4ICogMiArIDEgXTtcblxuXHRcdFx0XHRcdFx0XHRcdHV2ID0gbmV3IFZlY3RvcjIoIHUsIHYgKTtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICggaiAhPT0gMiApIGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgXS5wdXNoKCB1diApO1xuXHRcdFx0XHRcdFx0XHRcdGlmICggaiAhPT0gMCApIGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgKyAxIF0ucHVzaCggdXYgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZU5vcm1hbCApIHtcblxuXHRcdFx0XHRcdFx0bm9ybWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF0gKiAzO1xuXG5cdFx0XHRcdFx0XHRmYWNlQS5ub3JtYWwuc2V0KFxuXHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCBdXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRmYWNlQi5ub3JtYWwuY29weSggZmFjZUEubm9ybWFsICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgNDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRub3JtYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXSAqIDM7XG5cblx0XHRcdFx0XHRcdFx0bm9ybWFsID0gbmV3IFZlY3RvcjMoXG5cdFx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4IF1cblx0XHRcdFx0XHRcdFx0KTtcblxuXG5cdFx0XHRcdFx0XHRcdGlmICggaSAhPT0gMiApIGZhY2VBLnZlcnRleE5vcm1hbHMucHVzaCggbm9ybWFsICk7XG5cdFx0XHRcdFx0XHRcdGlmICggaSAhPT0gMCApIGZhY2VCLnZlcnRleE5vcm1hbHMucHVzaCggbm9ybWFsICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlQ29sb3IgKSB7XG5cblx0XHRcdFx0XHRcdGNvbG9ySW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0XHRoZXggPSBjb2xvcnNbIGNvbG9ySW5kZXggXTtcblxuXHRcdFx0XHRcdFx0ZmFjZUEuY29sb3Iuc2V0SGV4KCBoZXggKTtcblx0XHRcdFx0XHRcdGZhY2VCLmNvbG9yLnNldEhleCggaGV4ICk7XG5cblx0XHRcdFx0XHR9XG5cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZVZlcnRleENvbG9yICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IDQ7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0Y29sb3JJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRcdFx0aGV4ID0gY29sb3JzWyBjb2xvckluZGV4IF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBpICE9PSAyICkgZmFjZUEudmVydGV4Q29sb3JzLnB1c2goIG5ldyBDb2xvciggaGV4ICkgKTtcblx0XHRcdFx0XHRcdFx0aWYgKCBpICE9PSAwICkgZmFjZUIudmVydGV4Q29sb3JzLnB1c2goIG5ldyBDb2xvciggaGV4ICkgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZXMucHVzaCggZmFjZUEgKTtcblx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlcy5wdXNoKCBmYWNlQiApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRmYWNlID0gbmV3IEZhY2UzKCk7XG5cdFx0XHRcdFx0ZmFjZS5hID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXHRcdFx0XHRcdGZhY2UuYiA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRmYWNlLmMgPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0XHRpZiAoIGhhc01hdGVyaWFsICkge1xuXG5cdFx0XHRcdFx0XHRtYXRlcmlhbEluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXHRcdFx0XHRcdFx0ZmFjZS5tYXRlcmlhbEluZGV4ID0gbWF0ZXJpYWxJbmRleDtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIHRvIGdldCBmYWNlIDw9PiB1diBpbmRleCBjb3JyZXNwb25kZW5jZVxuXG5cdFx0XHRcdFx0ZmkgPSBnZW9tZXRyeS5mYWNlcy5sZW5ndGg7XG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhVdiApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBuVXZMYXllcnM7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dXZMYXllciA9IGpzb24udXZzWyBpIF07XG5cblx0XHRcdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdWyBmaSBdID0gW107XG5cblx0XHRcdFx0XHRcdFx0Zm9yICggaiA9IDA7IGogPCAzOyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0dXZJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHRcdFx0XHRcdHUgPSB1dkxheWVyWyB1dkluZGV4ICogMiBdO1xuXHRcdFx0XHRcdFx0XHRcdHYgPSB1dkxheWVyWyB1dkluZGV4ICogMiArIDEgXTtcblxuXHRcdFx0XHRcdFx0XHRcdHV2ID0gbmV3IFZlY3RvcjIoIHUsIHYgKTtcblxuXHRcdFx0XHRcdFx0XHRcdGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgXS5wdXNoKCB1diApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlTm9ybWFsICkge1xuXG5cdFx0XHRcdFx0XHRub3JtYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXSAqIDM7XG5cblx0XHRcdFx0XHRcdGZhY2Uubm9ybWFsLnNldChcblx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggXVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZVZlcnRleE5vcm1hbCApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCAzOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdG5vcm1hbEluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdICogMztcblxuXHRcdFx0XHRcdFx0XHRub3JtYWwgPSBuZXcgVmVjdG9yMyhcblx0XHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sXG5cdFx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggXVxuXHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdGZhY2UudmVydGV4Tm9ybWFscy5wdXNoKCBub3JtYWwgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VDb2xvciApIHtcblxuXHRcdFx0XHRcdFx0Y29sb3JJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRcdGZhY2UuY29sb3Iuc2V0SGV4KCBjb2xvcnNbIGNvbG9ySW5kZXggXSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhDb2xvciApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCAzOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdGNvbG9ySW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0XHRcdGZhY2UudmVydGV4Q29sb3JzLnB1c2goIG5ldyBDb2xvciggY29sb3JzWyBjb2xvckluZGV4IF0gKSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlcy5wdXNoKCBmYWNlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBwYXJzZVNraW4oIGpzb24sIGdlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgaW5mbHVlbmNlc1BlclZlcnRleCA9ICgganNvbi5pbmZsdWVuY2VzUGVyVmVydGV4ICE9PSB1bmRlZmluZWQgKSA/IGpzb24uaW5mbHVlbmNlc1BlclZlcnRleCA6IDI7XG5cblx0XHRcdGlmICgganNvbi5za2luV2VpZ2h0cyApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLnNraW5XZWlnaHRzLmxlbmd0aDsgaSA8IGw7IGkgKz0gaW5mbHVlbmNlc1BlclZlcnRleCApIHtcblxuXHRcdFx0XHRcdHZhciB4ID0ganNvbi5za2luV2VpZ2h0c1sgaSBdO1xuXHRcdFx0XHRcdHZhciB5ID0gKCBpbmZsdWVuY2VzUGVyVmVydGV4ID4gMSApID8ganNvbi5za2luV2VpZ2h0c1sgaSArIDEgXSA6IDA7XG5cdFx0XHRcdFx0dmFyIHogPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAyICkgPyBqc29uLnNraW5XZWlnaHRzWyBpICsgMiBdIDogMDtcblx0XHRcdFx0XHR2YXIgdyA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDMgKSA/IGpzb24uc2tpbldlaWdodHNbIGkgKyAzIF0gOiAwO1xuXG5cdFx0XHRcdFx0Z2VvbWV0cnkuc2tpbldlaWdodHMucHVzaCggbmV3IFZlY3RvcjQoIHgsIHksIHosIHcgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGpzb24uc2tpbkluZGljZXMgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5za2luSW5kaWNlcy5sZW5ndGg7IGkgPCBsOyBpICs9IGluZmx1ZW5jZXNQZXJWZXJ0ZXggKSB7XG5cblx0XHRcdFx0XHR2YXIgYSA9IGpzb24uc2tpbkluZGljZXNbIGkgXTtcblx0XHRcdFx0XHR2YXIgYiA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDEgKSA/IGpzb24uc2tpbkluZGljZXNbIGkgKyAxIF0gOiAwO1xuXHRcdFx0XHRcdHZhciBjID0gKCBpbmZsdWVuY2VzUGVyVmVydGV4ID4gMiApID8ganNvbi5za2luSW5kaWNlc1sgaSArIDIgXSA6IDA7XG5cdFx0XHRcdFx0dmFyIGQgPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAzICkgPyBqc29uLnNraW5JbmRpY2VzWyBpICsgMyBdIDogMDtcblxuXHRcdFx0XHRcdGdlb21ldHJ5LnNraW5JbmRpY2VzLnB1c2goIG5ldyBWZWN0b3I0KCBhLCBiLCBjLCBkICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkuYm9uZXMgPSBqc29uLmJvbmVzO1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvbmVzICYmIGdlb21ldHJ5LmJvbmVzLmxlbmd0aCA+IDAgJiYgKCBnZW9tZXRyeS5za2luV2VpZ2h0cy5sZW5ndGggIT09IGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCB8fCBnZW9tZXRyeS5za2luSW5kaWNlcy5sZW5ndGggIT09IGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCApICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1doZW4gc2tpbm5pbmcsIG51bWJlciBvZiB2ZXJ0aWNlcyAoJyArIGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCArICcpLCBza2luSW5kaWNlcyAoJyArXG5cdFx0XHRcdFx0Z2VvbWV0cnkuc2tpbkluZGljZXMubGVuZ3RoICsgJyksIGFuZCBza2luV2VpZ2h0cyAoJyArIGdlb21ldHJ5LnNraW5XZWlnaHRzLmxlbmd0aCArICcpIHNob3VsZCBtYXRjaC4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHBhcnNlTW9ycGhpbmcoIGpzb24sIGdlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgc2NhbGUgPSBqc29uLnNjYWxlO1xuXG5cdFx0XHRpZiAoIGpzb24ubW9ycGhUYXJnZXRzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5tb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1sgaSBdID0ge307XG5cdFx0XHRcdFx0Z2VvbWV0cnkubW9ycGhUYXJnZXRzWyBpIF0ubmFtZSA9IGpzb24ubW9ycGhUYXJnZXRzWyBpIF0ubmFtZTtcblx0XHRcdFx0XHRnZW9tZXRyeS5tb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlcyA9IFtdO1xuXG5cdFx0XHRcdFx0dmFyIGRzdFZlcnRpY2VzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXM7XG5cdFx0XHRcdFx0dmFyIHNyY1ZlcnRpY2VzID0ganNvbi5tb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlcztcblxuXHRcdFx0XHRcdGZvciAoIHZhciB2ID0gMCwgdmwgPSBzcmNWZXJ0aWNlcy5sZW5ndGg7IHYgPCB2bDsgdiArPSAzICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdFx0XHRcdHZlcnRleC54ID0gc3JjVmVydGljZXNbIHYgXSAqIHNjYWxlO1xuXHRcdFx0XHRcdFx0dmVydGV4LnkgPSBzcmNWZXJ0aWNlc1sgdiArIDEgXSAqIHNjYWxlO1xuXHRcdFx0XHRcdFx0dmVydGV4LnogPSBzcmNWZXJ0aWNlc1sgdiArIDIgXSAqIHNjYWxlO1xuXG5cdFx0XHRcdFx0XHRkc3RWZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXggKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBqc29uLm1vcnBoQ29sb3JzICE9PSB1bmRlZmluZWQgJiYganNvbi5tb3JwaENvbG9ycy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkpTT05Mb2FkZXI6IFwibW9ycGhDb2xvcnNcIiBubyBsb25nZXIgc3VwcG9ydGVkLiBVc2luZyB0aGVtIGFzIGZhY2UgY29sb3JzLicgKTtcblxuXHRcdFx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblx0XHRcdFx0dmFyIG1vcnBoQ29sb3JzID0ganNvbi5tb3JwaENvbG9yc1sgMCBdLmNvbG9ycztcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0ZmFjZXNbIGkgXS5jb2xvci5mcm9tQXJyYXkoIG1vcnBoQ29sb3JzLCBpICogMyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gcGFyc2VBbmltYXRpb25zKCBqc29uLCBnZW9tZXRyeSApIHtcblxuXHRcdFx0dmFyIG91dHB1dEFuaW1hdGlvbnMgPSBbXTtcblxuXHRcdFx0Ly8gcGFyc2Ugb2xkIHN0eWxlIEJvbmUvSGllcmFyY2h5IGFuaW1hdGlvbnNcblx0XHRcdHZhciBhbmltYXRpb25zID0gW107XG5cblx0XHRcdGlmICgganNvbi5hbmltYXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhbmltYXRpb25zLnB1c2goIGpzb24uYW5pbWF0aW9uICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBqc29uLmFuaW1hdGlvbnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpZiAoIGpzb24uYW5pbWF0aW9ucy5sZW5ndGggKSB7XG5cblx0XHRcdFx0XHRhbmltYXRpb25zID0gYW5pbWF0aW9ucy5jb25jYXQoIGpzb24uYW5pbWF0aW9ucyApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRhbmltYXRpb25zLnB1c2goIGpzb24uYW5pbWF0aW9ucyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBhbmltYXRpb25zLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgY2xpcCA9IEFuaW1hdGlvbkNsaXAucGFyc2VBbmltYXRpb24oIGFuaW1hdGlvbnNbIGkgXSwgZ2VvbWV0cnkuYm9uZXMgKTtcblx0XHRcdFx0aWYgKCBjbGlwICkgb3V0cHV0QW5pbWF0aW9ucy5wdXNoKCBjbGlwICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gcGFyc2UgaW1wbGljaXQgbW9ycGggYW5pbWF0aW9uc1xuXHRcdFx0aWYgKCBnZW9tZXRyeS5tb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdFx0Ly8gVE9ETzogRmlndXJlIG91dCB3aGF0IGFuIGFwcHJvcHJhaXRlIEZQUyBpcyBmb3IgbW9ycGggdGFyZ2V0IGFuaW1hdGlvbnMgLS0gZGVmYXVsdGluZyB0byAxMCwgYnV0IHJlYWxseSBpdCBpcyBjb21wbGV0ZWx5IGFyYml0cmFyeS5cblx0XHRcdFx0dmFyIG1vcnBoQW5pbWF0aW9uQ2xpcHMgPSBBbmltYXRpb25DbGlwLkNyZWF0ZUNsaXBzRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2VzKCBnZW9tZXRyeS5tb3JwaFRhcmdldHMsIDEwICk7XG5cdFx0XHRcdG91dHB1dEFuaW1hdGlvbnMgPSBvdXRwdXRBbmltYXRpb25zLmNvbmNhdCggbW9ycGhBbmltYXRpb25DbGlwcyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggb3V0cHV0QW5pbWF0aW9ucy5sZW5ndGggPiAwICkgZ2VvbWV0cnkuYW5pbWF0aW9ucyA9IG91dHB1dEFuaW1hdGlvbnM7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gKCBqc29uLCB0ZXh0dXJlUGF0aCApIHtcblxuXHRcdFx0aWYgKCBqc29uLmRhdGEgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyBHZW9tZXRyeSA0LjAgc3BlY1xuXHRcdFx0XHRqc29uID0ganNvbi5kYXRhO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICgganNvbi5zY2FsZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGpzb24uc2NhbGUgPSAxLjAgLyBqc29uLnNjYWxlO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGpzb24uc2NhbGUgPSAxLjA7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGdlb21ldHJ5ID0gbmV3IEdlb21ldHJ5KCk7XG5cblx0XHRcdHBhcnNlTW9kZWwoIGpzb24sIGdlb21ldHJ5ICk7XG5cdFx0XHRwYXJzZVNraW4oIGpzb24sIGdlb21ldHJ5ICk7XG5cdFx0XHRwYXJzZU1vcnBoaW5nKCBqc29uLCBnZW9tZXRyeSApO1xuXHRcdFx0cGFyc2VBbmltYXRpb25zKCBqc29uLCBnZW9tZXRyeSApO1xuXG5cdFx0XHRnZW9tZXRyeS5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblx0XHRcdGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0XHRpZiAoIGpzb24ubWF0ZXJpYWxzID09PSB1bmRlZmluZWQgfHwganNvbi5tYXRlcmlhbHMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRcdHJldHVybiB7IGdlb21ldHJ5OiBnZW9tZXRyeSB9O1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZhciBtYXRlcmlhbHMgPSBMb2FkZXIucHJvdG90eXBlLmluaXRNYXRlcmlhbHMoIGpzb24ubWF0ZXJpYWxzLCB0ZXh0dXJlUGF0aCwgdGhpcy5jcm9zc09yaWdpbiApO1xuXG5cdFx0XHRcdHJldHVybiB7IGdlb21ldHJ5OiBnZW9tZXRyeSwgbWF0ZXJpYWxzOiBtYXRlcmlhbHMgfTtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9ICkoKVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBPYmplY3RMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cdHRoaXMudGV4dHVyZVBhdGggPSAnJztcblxufVxuXG5PYmplY3QuYXNzaWduKCBPYmplY3RMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGlmICggdGhpcy50ZXh0dXJlUGF0aCA9PT0gJycgKSB7XG5cblx0XHRcdHRoaXMudGV4dHVyZVBhdGggPSB1cmwuc3Vic3RyaW5nKCAwLCB1cmwubGFzdEluZGV4T2YoICcvJyApICsgMSApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggc2NvcGUubWFuYWdlciApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0dmFyIGpzb24gPSBudWxsO1xuXG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdGpzb24gPSBKU09OLnBhcnNlKCB0ZXh0ICk7XG5cblx0XHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcblxuXHRcdFx0XHRpZiAoIG9uRXJyb3IgIT09IHVuZGVmaW5lZCApIG9uRXJyb3IoIGVycm9yICk7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFOk9iamVjdExvYWRlcjogQ2FuXFwndCBwYXJzZSAnICsgdXJsICsgJy4nLCBlcnJvci5tZXNzYWdlICk7XG5cblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBtZXRhZGF0YSA9IGpzb24ubWV0YWRhdGE7XG5cblx0XHRcdGlmICggbWV0YWRhdGEgPT09IHVuZGVmaW5lZCB8fCBtZXRhZGF0YS50eXBlID09PSB1bmRlZmluZWQgfHwgbWV0YWRhdGEudHlwZS50b0xvd2VyQ2FzZSgpID09PSAnZ2VvbWV0cnknICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5PYmplY3RMb2FkZXI6IENhblxcJ3QgbG9hZCAnICsgdXJsICsgJy4gVXNlIFRIUkVFLkpTT05Mb2FkZXIgaW5zdGVhZC4nICk7XG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0XHRzY29wZS5wYXJzZSgganNvbiwgb25Mb2FkICk7XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fSxcblxuXHRzZXRUZXh0dXJlUGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMudGV4dHVyZVBhdGggPSB2YWx1ZTtcblxuXHR9LFxuXG5cdHNldENyb3NzT3JpZ2luOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5jcm9zc09yaWdpbiA9IHZhbHVlO1xuXG5cdH0sXG5cblx0cGFyc2U6IGZ1bmN0aW9uICgganNvbiwgb25Mb2FkICkge1xuXG5cdFx0dmFyIGdlb21ldHJpZXMgPSB0aGlzLnBhcnNlR2VvbWV0cmllcygganNvbi5nZW9tZXRyaWVzICk7XG5cblx0XHR2YXIgaW1hZ2VzID0gdGhpcy5wYXJzZUltYWdlcygganNvbi5pbWFnZXMsIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0aWYgKCBvbkxvYWQgIT09IHVuZGVmaW5lZCApIG9uTG9hZCggb2JqZWN0ICk7XG5cblx0XHR9ICk7XG5cblx0XHR2YXIgdGV4dHVyZXMgPSB0aGlzLnBhcnNlVGV4dHVyZXMoIGpzb24udGV4dHVyZXMsIGltYWdlcyApO1xuXHRcdHZhciBtYXRlcmlhbHMgPSB0aGlzLnBhcnNlTWF0ZXJpYWxzKCBqc29uLm1hdGVyaWFscywgdGV4dHVyZXMgKTtcblxuXHRcdHZhciBvYmplY3QgPSB0aGlzLnBhcnNlT2JqZWN0KCBqc29uLm9iamVjdCwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzICk7XG5cblx0XHRpZiAoIGpzb24uYW5pbWF0aW9ucyApIHtcblxuXHRcdFx0b2JqZWN0LmFuaW1hdGlvbnMgPSB0aGlzLnBhcnNlQW5pbWF0aW9ucygganNvbi5hbmltYXRpb25zICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGpzb24uaW1hZ2VzID09PSB1bmRlZmluZWQgfHwganNvbi5pbWFnZXMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRpZiAoIG9uTG9hZCAhPT0gdW5kZWZpbmVkICkgb25Mb2FkKCBvYmplY3QgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBvYmplY3Q7XG5cblx0fSxcblxuXHRwYXJzZUdlb21ldHJpZXM6IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdHZhciBnZW9tZXRyaWVzID0ge307XG5cblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIGdlb21ldHJ5TG9hZGVyID0gbmV3IEpTT05Mb2FkZXIoKTtcblx0XHRcdHZhciBidWZmZXJHZW9tZXRyeUxvYWRlciA9IG5ldyBCdWZmZXJHZW9tZXRyeUxvYWRlcigpO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGdlb21ldHJ5O1xuXHRcdFx0XHR2YXIgZGF0YSA9IGpzb25bIGkgXTtcblxuXHRcdFx0XHRzd2l0Y2ggKCBkYXRhLnR5cGUgKSB7XG5cblx0XHRcdFx0XHRjYXNlICdQbGFuZUdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdQbGFuZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEud2lkdGgsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLndpZHRoU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0U2VnbWVudHNcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnQm94R2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0JveEJ1ZmZlckdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdDdWJlR2VvbWV0cnknOiAvLyBiYWNrd2FyZHMgY29tcGF0aWJsZVxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS53aWR0aCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHQsXG5cdFx0XHRcdFx0XHRcdGRhdGEuZGVwdGgsXG5cdFx0XHRcdFx0XHRcdGRhdGEud2lkdGhTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5kZXB0aFNlZ21lbnRzXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0NpcmNsZUdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdDaXJjbGVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5zZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YVN0YXJ0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhTGVuZ3RoXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0N5bGluZGVyR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0N5bGluZGVyQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXNUb3AsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzQm90dG9tLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpYWxTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5vcGVuRW5kZWQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdDb25lR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0NvbmVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHQsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaWFsU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0U2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEub3BlbkVuZGVkLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnU3BoZXJlR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1NwaGVyZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLndpZHRoU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0U2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucGhpU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEucGhpTGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnRG9kZWNhaGVkcm9uR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0ljb3NhaGVkcm9uR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ09jdGFoZWRyb25HZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnVGV0cmFoZWRyb25HZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5kZXRhaWxcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnUmluZ0dlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdSaW5nQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5pbm5lclJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5vdXRlclJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YVNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnBoaVNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnVG9ydXNHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnVG9ydXNCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS50dWJlLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGlhbFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnR1YnVsYXJTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5hcmNcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnVG9ydXNLbm90R2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1RvcnVzS25vdEJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnR1YmUsXG5cdFx0XHRcdFx0XHRcdGRhdGEudHVidWxhclNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGlhbFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnAsXG5cdFx0XHRcdFx0XHRcdGRhdGEucVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdMYXRoZUdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdMYXRoZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucG9pbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnBoaVN0YXJ0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnBoaUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gYnVmZmVyR2VvbWV0cnlMb2FkZXIucGFyc2UoIGRhdGEgKTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gZ2VvbWV0cnlMb2FkZXIucGFyc2UoIGRhdGEsIHRoaXMudGV4dHVyZVBhdGggKS5nZW9tZXRyeTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuc3VwcG9ydGVkIGdlb21ldHJ5IHR5cGUgXCInICsgZGF0YS50eXBlICsgJ1wiJyApO1xuXG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Z2VvbWV0cnkudXVpZCA9IGRhdGEudXVpZDtcblxuXHRcdFx0XHRpZiAoIGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkICkgZ2VvbWV0cnkubmFtZSA9IGRhdGEubmFtZTtcblxuXHRcdFx0XHRnZW9tZXRyaWVzWyBkYXRhLnV1aWQgXSA9IGdlb21ldHJ5O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZ2VvbWV0cmllcztcblxuXHR9LFxuXG5cdHBhcnNlTWF0ZXJpYWxzOiBmdW5jdGlvbiAoIGpzb24sIHRleHR1cmVzICkge1xuXG5cdFx0dmFyIG1hdGVyaWFscyA9IHt9O1xuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBsb2FkZXIgPSBuZXcgTWF0ZXJpYWxMb2FkZXIoKTtcblx0XHRcdGxvYWRlci5zZXRUZXh0dXJlcyggdGV4dHVyZXMgKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBkYXRhID0ganNvblsgaSBdO1xuXG5cdFx0XHRcdGlmICggZGF0YS50eXBlID09PSAnTXVsdGlNYXRlcmlhbCcgKSB7XG5cblx0XHRcdFx0XHQvLyBEZXByZWNhdGVkXG5cblx0XHRcdFx0XHR2YXIgYXJyYXkgPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IGRhdGEubWF0ZXJpYWxzLmxlbmd0aDsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0YXJyYXkucHVzaCggbG9hZGVyLnBhcnNlKCBkYXRhLm1hdGVyaWFsc1sgaiBdICkgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG1hdGVyaWFsc1sgZGF0YS51dWlkIF0gPSBhcnJheTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0bWF0ZXJpYWxzWyBkYXRhLnV1aWQgXSA9IGxvYWRlci5wYXJzZSggZGF0YSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hdGVyaWFscztcblxuXHR9LFxuXG5cdHBhcnNlQW5pbWF0aW9uczogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0dmFyIGFuaW1hdGlvbnMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGpzb24ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY2xpcCA9IEFuaW1hdGlvbkNsaXAucGFyc2UoIGpzb25bIGkgXSApO1xuXG5cdFx0XHRhbmltYXRpb25zLnB1c2goIGNsaXAgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBhbmltYXRpb25zO1xuXG5cdH0sXG5cblx0cGFyc2VJbWFnZXM6IGZ1bmN0aW9uICgganNvbiwgb25Mb2FkICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblx0XHR2YXIgaW1hZ2VzID0ge307XG5cblx0XHRmdW5jdGlvbiBsb2FkSW1hZ2UoIHVybCApIHtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0XHRyZXR1cm4gbG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdH0sIHVuZGVmaW5lZCwgZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblxuXHRcdFx0fSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgJiYganNvbi5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR2YXIgbWFuYWdlciA9IG5ldyBMb2FkaW5nTWFuYWdlciggb25Mb2FkICk7XG5cblx0XHRcdHZhciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoIG1hbmFnZXIgKTtcblx0XHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGltYWdlID0ganNvblsgaSBdO1xuXHRcdFx0XHR2YXIgcGF0aCA9IC9eKFxcL1xcLyl8KFthLXpdKzooXFwvXFwvKT8pL2kudGVzdCggaW1hZ2UudXJsICkgPyBpbWFnZS51cmwgOiBzY29wZS50ZXh0dXJlUGF0aCArIGltYWdlLnVybDtcblxuXHRcdFx0XHRpbWFnZXNbIGltYWdlLnV1aWQgXSA9IGxvYWRJbWFnZSggcGF0aCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gaW1hZ2VzO1xuXG5cdH0sXG5cblx0cGFyc2VUZXh0dXJlczogZnVuY3Rpb24gKCBqc29uLCBpbWFnZXMgKSB7XG5cblx0XHRmdW5jdGlvbiBwYXJzZUNvbnN0YW50KCB2YWx1ZSwgdHlwZSApIHtcblxuXHRcdFx0aWYgKCB0eXBlb2YoIHZhbHVlICkgPT09ICdudW1iZXInICkgcmV0dXJuIHZhbHVlO1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VUZXh0dXJlOiBDb25zdGFudCBzaG91bGQgYmUgaW4gbnVtZXJpYyBmb3JtLicsIHZhbHVlICk7XG5cblx0XHRcdHJldHVybiB0eXBlWyB2YWx1ZSBdO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHRleHR1cmVzID0ge307XG5cblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBkYXRhID0ganNvblsgaSBdO1xuXG5cdFx0XHRcdGlmICggZGF0YS5pbWFnZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBObyBcImltYWdlXCIgc3BlY2lmaWVkIGZvcicsIGRhdGEudXVpZCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIGltYWdlc1sgZGF0YS5pbWFnZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBpbWFnZScsIGRhdGEuaW1hZ2UgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIHRleHR1cmUgPSBuZXcgVGV4dHVyZSggaW1hZ2VzWyBkYXRhLmltYWdlIF0gKTtcblx0XHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdFx0dGV4dHVyZS51dWlkID0gZGF0YS51dWlkO1xuXG5cdFx0XHRcdGlmICggZGF0YS5uYW1lICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm5hbWUgPSBkYXRhLm5hbWU7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm1hcHBpbmcgIT09IHVuZGVmaW5lZCApIHRleHR1cmUubWFwcGluZyA9IHBhcnNlQ29uc3RhbnQoIGRhdGEubWFwcGluZywgVEVYVFVSRV9NQVBQSU5HICk7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm9mZnNldCAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5vZmZzZXQuZnJvbUFycmF5KCBkYXRhLm9mZnNldCApO1xuXHRcdFx0XHRpZiAoIGRhdGEucmVwZWF0ICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnJlcGVhdC5mcm9tQXJyYXkoIGRhdGEucmVwZWF0ICk7XG5cdFx0XHRcdGlmICggZGF0YS53cmFwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLndyYXBTID0gcGFyc2VDb25zdGFudCggZGF0YS53cmFwWyAwIF0sIFRFWFRVUkVfV1JBUFBJTkcgKTtcblx0XHRcdFx0XHR0ZXh0dXJlLndyYXBUID0gcGFyc2VDb25zdGFudCggZGF0YS53cmFwWyAxIF0sIFRFWFRVUkVfV1JBUFBJTkcgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBkYXRhLm1pbkZpbHRlciAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5taW5GaWx0ZXIgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1pbkZpbHRlciwgVEVYVFVSRV9GSUxURVIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLm1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5tYWdGaWx0ZXIgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1hZ0ZpbHRlciwgVEVYVFVSRV9GSUxURVIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLmFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuYW5pc290cm9weSA9IGRhdGEuYW5pc290cm9weTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuZmxpcFkgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuZmxpcFkgPSBkYXRhLmZsaXBZO1xuXG5cdFx0XHRcdHRleHR1cmVzWyBkYXRhLnV1aWQgXSA9IHRleHR1cmU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0ZXh0dXJlcztcblxuXHR9LFxuXG5cdHBhcnNlT2JqZWN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBwYXJzZU9iamVjdCggZGF0YSwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0O1xuXG5cdFx0XHRmdW5jdGlvbiBnZXRHZW9tZXRyeSggbmFtZSApIHtcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJpZXNbIG5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgZ2VvbWV0cnknLCBuYW1lICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBnZW9tZXRyaWVzWyBuYW1lIF07XG5cblx0XHRcdH1cblxuXHRcdFx0ZnVuY3Rpb24gZ2V0TWF0ZXJpYWwoIG5hbWUgKSB7XG5cblx0XHRcdFx0aWYgKCBuYW1lID09PSB1bmRlZmluZWQgKSByZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbmFtZSApICkge1xuXG5cdFx0XHRcdFx0dmFyIGFycmF5ID0gW107XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBuYW1lLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciB1dWlkID0gbmFtZVsgaSBdO1xuXG5cdFx0XHRcdFx0XHRpZiAoIG1hdGVyaWFsc1sgdXVpZCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwnLCB1dWlkICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0YXJyYXkucHVzaCggbWF0ZXJpYWxzWyB1dWlkIF0gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBhcnJheTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBtYXRlcmlhbHNbIG5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwnLCBuYW1lICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBtYXRlcmlhbHNbIG5hbWUgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRzd2l0Y2ggKCBkYXRhLnR5cGUgKSB7XG5cblx0XHRcdFx0Y2FzZSAnU2NlbmUnOlxuXG5cdFx0XHRcdFx0b2JqZWN0ID0gbmV3IFNjZW5lKCk7XG5cblx0XHRcdFx0XHRpZiAoIGRhdGEuYmFja2dyb3VuZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIE51bWJlci5pc0ludGVnZXIoIGRhdGEuYmFja2dyb3VuZCApICkge1xuXG5cdFx0XHRcdFx0XHRcdG9iamVjdC5iYWNrZ3JvdW5kID0gbmV3IENvbG9yKCBkYXRhLmJhY2tncm91bmQgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBkYXRhLmZvZyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIGRhdGEuZm9nLnR5cGUgPT09ICdGb2cnICkge1xuXG5cdFx0XHRcdFx0XHRcdG9iamVjdC5mb2cgPSBuZXcgRm9nKCBkYXRhLmZvZy5jb2xvciwgZGF0YS5mb2cubmVhciwgZGF0YS5mb2cuZmFyICk7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGRhdGEuZm9nLnR5cGUgPT09ICdGb2dFeHAyJyApIHtcblxuXHRcdFx0XHRcdFx0XHRvYmplY3QuZm9nID0gbmV3IEZvZ0V4cDIoIGRhdGEuZm9nLmNvbG9yLCBkYXRhLmZvZy5kZW5zaXR5ICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1BlcnNwZWN0aXZlQ2FtZXJhJzpcblxuXHRcdFx0XHRcdG9iamVjdCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZGF0YS5mb3YsIGRhdGEuYXNwZWN0LCBkYXRhLm5lYXIsIGRhdGEuZmFyICk7XG5cblx0XHRcdFx0XHRpZiAoIGRhdGEuZm9jdXMgIT09IHVuZGVmaW5lZCApIG9iamVjdC5mb2N1cyA9IGRhdGEuZm9jdXM7XG5cdFx0XHRcdFx0aWYgKCBkYXRhLnpvb20gIT09IHVuZGVmaW5lZCApIG9iamVjdC56b29tID0gZGF0YS56b29tO1xuXHRcdFx0XHRcdGlmICggZGF0YS5maWxtR2F1Z2UgIT09IHVuZGVmaW5lZCApIG9iamVjdC5maWxtR2F1Z2UgPSBkYXRhLmZpbG1HYXVnZTtcblx0XHRcdFx0XHRpZiAoIGRhdGEuZmlsbU9mZnNldCAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZpbG1PZmZzZXQgPSBkYXRhLmZpbG1PZmZzZXQ7XG5cdFx0XHRcdFx0aWYgKCBkYXRhLnZpZXcgIT09IHVuZGVmaW5lZCApIG9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIGRhdGEudmlldyApO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnT3J0aG9ncmFwaGljQ2FtZXJhJzpcblxuXHRcdFx0XHRcdG9iamVjdCA9IG5ldyBPcnRob2dyYXBoaWNDYW1lcmEoIGRhdGEubGVmdCwgZGF0YS5yaWdodCwgZGF0YS50b3AsIGRhdGEuYm90dG9tLCBkYXRhLm5lYXIsIGRhdGEuZmFyICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdBbWJpZW50TGlnaHQnOlxuXG5cdFx0XHRcdFx0b2JqZWN0ID0gbmV3IEFtYmllbnRMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHkgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ0RpcmVjdGlvbmFsTGlnaHQnOlxuXG5cdFx0XHRcdFx0b2JqZWN0ID0gbmV3IERpcmVjdGlvbmFsTGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5ICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdQb2ludExpZ2h0JzpcblxuXHRcdFx0XHRcdG9iamVjdCA9IG5ldyBQb2ludExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSwgZGF0YS5kaXN0YW5jZSwgZGF0YS5kZWNheSApO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnUmVjdEFyZWFMaWdodCc6XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgUmVjdEFyZWFMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHksIGRhdGEud2lkdGgsIGRhdGEuaGVpZ2h0ICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdTcG90TGlnaHQnOlxuXG5cdFx0XHRcdFx0b2JqZWN0ID0gbmV3IFNwb3RMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHksIGRhdGEuZGlzdGFuY2UsIGRhdGEuYW5nbGUsIGRhdGEucGVudW1icmEsIGRhdGEuZGVjYXkgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ0hlbWlzcGhlcmVMaWdodCc6XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgSGVtaXNwaGVyZUxpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmdyb3VuZENvbG9yLCBkYXRhLmludGVuc2l0eSApO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnU2tpbm5lZE1lc2gnOlxuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyLnBhcnNlT2JqZWN0KCkgZG9lcyBub3Qgc3VwcG9ydCBTa2lubmVkTWVzaCB5ZXQuJyApO1xuXG5cdFx0XHRcdGNhc2UgJ01lc2gnOlxuXG5cdFx0XHRcdFx0dmFyIGdlb21ldHJ5ID0gZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKTtcblx0XHRcdFx0XHR2YXIgbWF0ZXJpYWwgPSBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApO1xuXG5cdFx0XHRcdFx0aWYgKCBnZW9tZXRyeS5ib25lcyAmJiBnZW9tZXRyeS5ib25lcy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdFx0XHRvYmplY3QgPSBuZXcgU2tpbm5lZE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0b2JqZWN0ID0gbmV3IE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnTE9EJzpcblxuXHRcdFx0XHRcdG9iamVjdCA9IG5ldyBMT0QoKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ0xpbmUnOlxuXG5cdFx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmUoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICksIGRhdGEubW9kZSApO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnTGluZUxvb3AnOlxuXG5cdFx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmVMb29wKCBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApLCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdMaW5lU2VnbWVudHMnOlxuXG5cdFx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmVTZWdtZW50cyggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnUG9pbnRDbG91ZCc6XG5cdFx0XHRcdGNhc2UgJ1BvaW50cyc6XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgUG9pbnRzKCBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApLCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdTcHJpdGUnOlxuXG5cdFx0XHRcdFx0b2JqZWN0ID0gbmV3IFNwcml0ZSggZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnR3JvdXAnOlxuXG5cdFx0XHRcdFx0b2JqZWN0ID0gbmV3IEdyb3VwKCk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdFx0b2JqZWN0ID0gbmV3IE9iamVjdDNEKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0b2JqZWN0LnV1aWQgPSBkYXRhLnV1aWQ7XG5cblx0XHRcdGlmICggZGF0YS5uYW1lICE9PSB1bmRlZmluZWQgKSBvYmplY3QubmFtZSA9IGRhdGEubmFtZTtcblx0XHRcdGlmICggZGF0YS5tYXRyaXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtYXRyaXguZnJvbUFycmF5KCBkYXRhLm1hdHJpeCApO1xuXHRcdFx0XHRtYXRyaXguZGVjb21wb3NlKCBvYmplY3QucG9zaXRpb24sIG9iamVjdC5xdWF0ZXJuaW9uLCBvYmplY3Quc2NhbGUgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRpZiAoIGRhdGEucG9zaXRpb24gIT09IHVuZGVmaW5lZCApIG9iamVjdC5wb3NpdGlvbi5mcm9tQXJyYXkoIGRhdGEucG9zaXRpb24gKTtcblx0XHRcdFx0aWYgKCBkYXRhLnJvdGF0aW9uICE9PSB1bmRlZmluZWQgKSBvYmplY3Qucm90YXRpb24uZnJvbUFycmF5KCBkYXRhLnJvdGF0aW9uICk7XG5cdFx0XHRcdGlmICggZGF0YS5xdWF0ZXJuaW9uICE9PSB1bmRlZmluZWQgKSBvYmplY3QucXVhdGVybmlvbi5mcm9tQXJyYXkoIGRhdGEucXVhdGVybmlvbiApO1xuXHRcdFx0XHRpZiAoIGRhdGEuc2NhbGUgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zY2FsZS5mcm9tQXJyYXkoIGRhdGEuc2NhbGUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGRhdGEuY2FzdFNoYWRvdyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmNhc3RTaGFkb3cgPSBkYXRhLmNhc3RTaGFkb3c7XG5cdFx0XHRpZiAoIGRhdGEucmVjZWl2ZVNoYWRvdyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnJlY2VpdmVTaGFkb3cgPSBkYXRhLnJlY2VpdmVTaGFkb3c7XG5cblx0XHRcdGlmICggZGF0YS5zaGFkb3cgKSB7XG5cblx0XHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5iaWFzICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93LmJpYXMgPSBkYXRhLnNoYWRvdy5iaWFzO1xuXHRcdFx0XHRpZiAoIGRhdGEuc2hhZG93LnJhZGl1cyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5yYWRpdXMgPSBkYXRhLnNoYWRvdy5yYWRpdXM7XG5cdFx0XHRcdGlmICggZGF0YS5zaGFkb3cubWFwU2l6ZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5tYXBTaXplLmZyb21BcnJheSggZGF0YS5zaGFkb3cubWFwU2l6ZSApO1xuXHRcdFx0XHRpZiAoIGRhdGEuc2hhZG93LmNhbWVyYSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5jYW1lcmEgPSB0aGlzLnBhcnNlT2JqZWN0KCBkYXRhLnNoYWRvdy5jYW1lcmEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGRhdGEudmlzaWJsZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnZpc2libGUgPSBkYXRhLnZpc2libGU7XG5cdFx0XHRpZiAoIGRhdGEudXNlckRhdGEgIT09IHVuZGVmaW5lZCApIG9iamVjdC51c2VyRGF0YSA9IGRhdGEudXNlckRhdGE7XG5cblx0XHRcdGlmICggZGF0YS5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBjaGlsZCBpbiBkYXRhLmNoaWxkcmVuICkge1xuXG5cdFx0XHRcdFx0b2JqZWN0LmFkZCggdGhpcy5wYXJzZU9iamVjdCggZGF0YS5jaGlsZHJlblsgY2hpbGQgXSwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBkYXRhLnR5cGUgPT09ICdMT0QnICkge1xuXG5cdFx0XHRcdHZhciBsZXZlbHMgPSBkYXRhLmxldmVscztcblxuXHRcdFx0XHRmb3IgKCB2YXIgbCA9IDA7IGwgPCBsZXZlbHMubGVuZ3RoOyBsICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIGxldmVsID0gbGV2ZWxzWyBsIF07XG5cdFx0XHRcdFx0dmFyIGNoaWxkID0gb2JqZWN0LmdldE9iamVjdEJ5UHJvcGVydHkoICd1dWlkJywgbGV2ZWwub2JqZWN0ICk7XG5cblx0XHRcdFx0XHRpZiAoIGNoaWxkICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdG9iamVjdC5hZGRMZXZlbCggY2hpbGQsIGxldmVsLmRpc3RhbmNlICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvYmplY3Q7XG5cblx0XHR9O1xuXG5cdH0oKVxuXG59ICk7XG5cbnZhciBURVhUVVJFX01BUFBJTkcgPSB7XG5cdFVWTWFwcGluZzogVVZNYXBwaW5nLFxuXHRDdWJlUmVmbGVjdGlvbk1hcHBpbmc6IEN1YmVSZWZsZWN0aW9uTWFwcGluZyxcblx0Q3ViZVJlZnJhY3Rpb25NYXBwaW5nOiBDdWJlUmVmcmFjdGlvbk1hcHBpbmcsXG5cdEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nOiBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyxcblx0RXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6IEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nLFxuXHRTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZzogU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nOiBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZyxcblx0Q3ViZVVWUmVmcmFjdGlvbk1hcHBpbmc6IEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nXG59O1xuXG52YXIgVEVYVFVSRV9XUkFQUElORyA9IHtcblx0UmVwZWF0V3JhcHBpbmc6IFJlcGVhdFdyYXBwaW5nLFxuXHRDbGFtcFRvRWRnZVdyYXBwaW5nOiBDbGFtcFRvRWRnZVdyYXBwaW5nLFxuXHRNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOiBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nXG59O1xuXG52YXIgVEVYVFVSRV9GSUxURVIgPSB7XG5cdE5lYXJlc3RGaWx0ZXI6IE5lYXJlc3RGaWx0ZXIsXG5cdE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyOiBOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlcixcblx0TmVhcmVzdE1pcE1hcExpbmVhckZpbHRlcjogTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlcixcblx0TGluZWFyRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG5cdExpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXI6IExpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXIsXG5cdExpbmVhck1pcE1hcExpbmVhckZpbHRlcjogTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyXG59O1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqXG4gKiBCZXppZXIgQ3VydmVzIGZvcm11bGFzIG9idGFpbmVkIGZyb21cbiAqIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQsOpemllcl9jdXJ2ZVxuICovXG5cbmZ1bmN0aW9uIENhdG11bGxSb20oIHQsIHAwLCBwMSwgcDIsIHAzICkge1xuXG5cdHZhciB2MCA9ICggcDIgLSBwMCApICogMC41O1xuXHR2YXIgdjEgPSAoIHAzIC0gcDEgKSAqIDAuNTtcblx0dmFyIHQyID0gdCAqIHQ7XG5cdHZhciB0MyA9IHQgKiB0Mjtcblx0cmV0dXJuICggMiAqIHAxIC0gMiAqIHAyICsgdjAgKyB2MSApICogdDMgKyAoIC0gMyAqIHAxICsgMyAqIHAyIC0gMiAqIHYwIC0gdjEgKSAqIHQyICsgdjAgKiB0ICsgcDE7XG5cbn1cblxuLy9cblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyUDAoIHQsIHAgKSB7XG5cblx0dmFyIGsgPSAxIC0gdDtcblx0cmV0dXJuIGsgKiBrICogcDtcblxufVxuXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJQMSggdCwgcCApIHtcblxuXHRyZXR1cm4gMiAqICggMSAtIHQgKSAqIHQgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllclAyKCB0LCBwICkge1xuXG5cdHJldHVybiB0ICogdCAqIHA7XG5cbn1cblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyKCB0LCBwMCwgcDEsIHAyICkge1xuXG5cdHJldHVybiBRdWFkcmF0aWNCZXppZXJQMCggdCwgcDAgKSArIFF1YWRyYXRpY0JlemllclAxKCB0LCBwMSApICtcblx0XHRRdWFkcmF0aWNCZXppZXJQMiggdCwgcDIgKTtcblxufVxuXG4vL1xuXG5mdW5jdGlvbiBDdWJpY0JlemllclAwKCB0LCBwICkge1xuXG5cdHZhciBrID0gMSAtIHQ7XG5cdHJldHVybiBrICogayAqIGsgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIEN1YmljQmV6aWVyUDEoIHQsIHAgKSB7XG5cblx0dmFyIGsgPSAxIC0gdDtcblx0cmV0dXJuIDMgKiBrICogayAqIHQgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIEN1YmljQmV6aWVyUDIoIHQsIHAgKSB7XG5cblx0cmV0dXJuIDMgKiAoIDEgLSB0ICkgKiB0ICogdCAqIHA7XG5cbn1cblxuZnVuY3Rpb24gQ3ViaWNCZXppZXJQMyggdCwgcCApIHtcblxuXHRyZXR1cm4gdCAqIHQgKiB0ICogcDtcblxufVxuXG5mdW5jdGlvbiBDdWJpY0JlemllciggdCwgcDAsIHAxLCBwMiwgcDMgKSB7XG5cblx0cmV0dXJuIEN1YmljQmV6aWVyUDAoIHQsIHAwICkgKyBDdWJpY0JlemllclAxKCB0LCBwMSApICsgQ3ViaWNCZXppZXJQMiggdCwgcDIgKSArXG5cdFx0Q3ViaWNCZXppZXJQMyggdCwgcDMgKTtcblxufVxuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIEV4dGVuc2libGUgY3VydmUgb2JqZWN0XG4gKlxuICogU29tZSBjb21tb24gb2YgY3VydmUgbWV0aG9kczpcbiAqIC5nZXRQb2ludCh0KSwgZ2V0VGFuZ2VudCh0KVxuICogLmdldFBvaW50QXQodSksIGdldFRhbmdlbnRBdCh1KVxuICogLmdldFBvaW50cygpLCAuZ2V0U3BhY2VkUG9pbnRzKClcbiAqIC5nZXRMZW5ndGgoKVxuICogLnVwZGF0ZUFyY0xlbmd0aHMoKVxuICpcbiAqIFRoaXMgZm9sbG93aW5nIGN1cnZlcyBpbmhlcml0IGZyb20gVEhSRUUuQ3VydmU6XG4gKlxuICogLS0gMkQgY3VydmVzIC0tXG4gKiBUSFJFRS5BcmNDdXJ2ZVxuICogVEhSRUUuQ3ViaWNCZXppZXJDdXJ2ZVxuICogVEhSRUUuRWxsaXBzZUN1cnZlXG4gKiBUSFJFRS5MaW5lQ3VydmVcbiAqIFRIUkVFLlF1YWRyYXRpY0JlemllckN1cnZlXG4gKiBUSFJFRS5TcGxpbmVDdXJ2ZVxuICpcbiAqIC0tIDNEIGN1cnZlcyAtLVxuICogVEhSRUUuQ2F0bXVsbFJvbUN1cnZlM1xuICogVEhSRUUuQ3ViaWNCZXppZXJDdXJ2ZTNcbiAqIFRIUkVFLkxpbmVDdXJ2ZTNcbiAqIFRIUkVFLlF1YWRyYXRpY0JlemllckN1cnZlM1xuICpcbiAqIEEgc2VyaWVzIG9mIGN1cnZlcyBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBUSFJFRS5DdXJ2ZVBhdGguXG4gKlxuICoqL1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqXHRBYnN0cmFjdCBDdXJ2ZSBiYXNlIGNsYXNzXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmZ1bmN0aW9uIEN1cnZlKCkge1xuXG5cdHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zID0gMjAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEN1cnZlLnByb3RvdHlwZSwge1xuXG5cdC8vIFZpcnR1YWwgYmFzZSBjbGFzcyBtZXRob2QgdG8gb3ZlcndyaXRlIGFuZCBpbXBsZW1lbnQgaW4gc3ViY2xhc3Nlc1xuXHQvL1x0LSB0IFswIC4uIDFdXG5cblx0Z2V0UG9pbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlOiAuZ2V0UG9pbnQoKSBub3QgaW1wbGVtZW50ZWQuJyApO1xuXHRcdHJldHVybiBudWxsO1xuXG5cdH0sXG5cblx0Ly8gR2V0IHBvaW50IGF0IHJlbGF0aXZlIHBvc2l0aW9uIGluIGN1cnZlIGFjY29yZGluZyB0byBhcmMgbGVuZ3RoXG5cdC8vIC0gdSBbMCAuLiAxXVxuXG5cdGdldFBvaW50QXQ6IGZ1bmN0aW9uICggdSApIHtcblxuXHRcdHZhciB0ID0gdGhpcy5nZXRVdG9UbWFwcGluZyggdSApO1xuXHRcdHJldHVybiB0aGlzLmdldFBvaW50KCB0ICk7XG5cblx0fSxcblxuXHQvLyBHZXQgc2VxdWVuY2Ugb2YgcG9pbnRzIHVzaW5nIGdldFBvaW50KCB0IClcblxuXHRnZXRQb2ludHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkge1xuXG5cdFx0aWYgKCBkaXZpc2lvbnMgPT09IHVuZGVmaW5lZCApIGRpdmlzaW9ucyA9IDU7XG5cblx0XHR2YXIgcG9pbnRzID0gW107XG5cblx0XHRmb3IgKCB2YXIgZCA9IDA7IGQgPD0gZGl2aXNpb25zOyBkICsrICkge1xuXG5cdFx0XHRwb2ludHMucHVzaCggdGhpcy5nZXRQb2ludCggZCAvIGRpdmlzaW9ucyApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcG9pbnRzO1xuXG5cdH0sXG5cblx0Ly8gR2V0IHNlcXVlbmNlIG9mIHBvaW50cyB1c2luZyBnZXRQb2ludEF0KCB1IClcblxuXHRnZXRTcGFjZWRQb2ludHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkge1xuXG5cdFx0aWYgKCBkaXZpc2lvbnMgPT09IHVuZGVmaW5lZCApIGRpdmlzaW9ucyA9IDU7XG5cblx0XHR2YXIgcG9pbnRzID0gW107XG5cblx0XHRmb3IgKCB2YXIgZCA9IDA7IGQgPD0gZGl2aXNpb25zOyBkICsrICkge1xuXG5cdFx0XHRwb2ludHMucHVzaCggdGhpcy5nZXRQb2ludEF0KCBkIC8gZGl2aXNpb25zICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBwb2ludHM7XG5cblx0fSxcblxuXHQvLyBHZXQgdG90YWwgY3VydmUgYXJjIGxlbmd0aFxuXG5cdGdldExlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGxlbmd0aHMgPSB0aGlzLmdldExlbmd0aHMoKTtcblx0XHRyZXR1cm4gbGVuZ3Roc1sgbGVuZ3Rocy5sZW5ndGggLSAxIF07XG5cblx0fSxcblxuXHQvLyBHZXQgbGlzdCBvZiBjdW11bGF0aXZlIHNlZ21lbnQgbGVuZ3Roc1xuXG5cdGdldExlbmd0aHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkge1xuXG5cdFx0aWYgKCBkaXZpc2lvbnMgPT09IHVuZGVmaW5lZCApIGRpdmlzaW9ucyA9IHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zO1xuXG5cdFx0aWYgKCB0aGlzLmNhY2hlQXJjTGVuZ3RocyAmJlxuXHRcdFx0KCB0aGlzLmNhY2hlQXJjTGVuZ3Rocy5sZW5ndGggPT09IGRpdmlzaW9ucyArIDEgKSAmJlxuXHRcdFx0ISB0aGlzLm5lZWRzVXBkYXRlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM7XG5cblx0XHR9XG5cblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gZmFsc2U7XG5cblx0XHR2YXIgY2FjaGUgPSBbXTtcblx0XHR2YXIgY3VycmVudCwgbGFzdCA9IHRoaXMuZ2V0UG9pbnQoIDAgKTtcblx0XHR2YXIgcCwgc3VtID0gMDtcblxuXHRcdGNhY2hlLnB1c2goIDAgKTtcblxuXHRcdGZvciAoIHAgPSAxOyBwIDw9IGRpdmlzaW9uczsgcCArKyApIHtcblxuXHRcdFx0Y3VycmVudCA9IHRoaXMuZ2V0UG9pbnQoIHAgLyBkaXZpc2lvbnMgKTtcblx0XHRcdHN1bSArPSBjdXJyZW50LmRpc3RhbmNlVG8oIGxhc3QgKTtcblx0XHRcdGNhY2hlLnB1c2goIHN1bSApO1xuXHRcdFx0bGFzdCA9IGN1cnJlbnQ7XG5cblx0XHR9XG5cblx0XHR0aGlzLmNhY2hlQXJjTGVuZ3RocyA9IGNhY2hlO1xuXG5cdFx0cmV0dXJuIGNhY2hlOyAvLyB7IHN1bXM6IGNhY2hlLCBzdW06IHN1bSB9OyBTdW0gaXMgaW4gdGhlIGxhc3QgZWxlbWVudC5cblxuXHR9LFxuXG5cdHVwZGF0ZUFyY0xlbmd0aHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXHRcdHRoaXMuZ2V0TGVuZ3RocygpO1xuXG5cdH0sXG5cblx0Ly8gR2l2ZW4gdSAoIDAgLi4gMSApLCBnZXQgYSB0IHRvIGZpbmQgcC4gVGhpcyBnaXZlcyB5b3UgcG9pbnRzIHdoaWNoIGFyZSBlcXVpZGlzdGFudFxuXG5cdGdldFV0b1RtYXBwaW5nOiBmdW5jdGlvbiAoIHUsIGRpc3RhbmNlICkge1xuXG5cdFx0dmFyIGFyY0xlbmd0aHMgPSB0aGlzLmdldExlbmd0aHMoKTtcblxuXHRcdHZhciBpID0gMCwgaWwgPSBhcmNMZW5ndGhzLmxlbmd0aDtcblxuXHRcdHZhciB0YXJnZXRBcmNMZW5ndGg7IC8vIFRoZSB0YXJnZXRlZCB1IGRpc3RhbmNlIHZhbHVlIHRvIGdldFxuXG5cdFx0aWYgKCBkaXN0YW5jZSApIHtcblxuXHRcdFx0dGFyZ2V0QXJjTGVuZ3RoID0gZGlzdGFuY2U7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0YXJnZXRBcmNMZW5ndGggPSB1ICogYXJjTGVuZ3Roc1sgaWwgLSAxIF07XG5cblx0XHR9XG5cblx0XHQvLyBiaW5hcnkgc2VhcmNoIGZvciB0aGUgaW5kZXggd2l0aCBsYXJnZXN0IHZhbHVlIHNtYWxsZXIgdGhhbiB0YXJnZXQgdSBkaXN0YW5jZVxuXG5cdFx0dmFyIGxvdyA9IDAsIGhpZ2ggPSBpbCAtIDEsIGNvbXBhcmlzb247XG5cblx0XHR3aGlsZSAoIGxvdyA8PSBoaWdoICkge1xuXG5cdFx0XHRpID0gTWF0aC5mbG9vciggbG93ICsgKCBoaWdoIC0gbG93ICkgLyAyICk7IC8vIGxlc3MgbGlrZWx5IHRvIG92ZXJmbG93LCB0aG91Z2ggcHJvYmFibHkgbm90IGlzc3VlIGhlcmUsIEpTIGRvZXNuJ3QgcmVhbGx5IGhhdmUgaW50ZWdlcnMsIGFsbCBudW1iZXJzIGFyZSBmbG9hdHNcblxuXHRcdFx0Y29tcGFyaXNvbiA9IGFyY0xlbmd0aHNbIGkgXSAtIHRhcmdldEFyY0xlbmd0aDtcblxuXHRcdFx0aWYgKCBjb21wYXJpc29uIDwgMCApIHtcblxuXHRcdFx0XHRsb3cgPSBpICsgMTtcblxuXHRcdFx0fSBlbHNlIGlmICggY29tcGFyaXNvbiA+IDAgKSB7XG5cblx0XHRcdFx0aGlnaCA9IGkgLSAxO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGhpZ2ggPSBpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHQvLyBET05FXG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGkgPSBoaWdoO1xuXG5cdFx0aWYgKCBhcmNMZW5ndGhzWyBpIF0gPT09IHRhcmdldEFyY0xlbmd0aCApIHtcblxuXHRcdFx0cmV0dXJuIGkgLyAoIGlsIC0gMSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gd2UgY291bGQgZ2V0IGZpbmVyIGdyYWluIGF0IGxlbmd0aHMsIG9yIHVzZSBzaW1wbGUgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBwb2ludHNcblxuXHRcdHZhciBsZW5ndGhCZWZvcmUgPSBhcmNMZW5ndGhzWyBpIF07XG5cdFx0dmFyIGxlbmd0aEFmdGVyID0gYXJjTGVuZ3Roc1sgaSArIDEgXTtcblxuXHRcdHZhciBzZWdtZW50TGVuZ3RoID0gbGVuZ3RoQWZ0ZXIgLSBsZW5ndGhCZWZvcmU7XG5cblx0XHQvLyBkZXRlcm1pbmUgd2hlcmUgd2UgYXJlIGJldHdlZW4gdGhlICdiZWZvcmUnIGFuZCAnYWZ0ZXInIHBvaW50c1xuXG5cdFx0dmFyIHNlZ21lbnRGcmFjdGlvbiA9ICggdGFyZ2V0QXJjTGVuZ3RoIC0gbGVuZ3RoQmVmb3JlICkgLyBzZWdtZW50TGVuZ3RoO1xuXG5cdFx0Ly8gYWRkIHRoYXQgZnJhY3Rpb25hbCBhbW91bnQgdG8gdFxuXG5cdFx0dmFyIHQgPSAoIGkgKyBzZWdtZW50RnJhY3Rpb24gKSAvICggaWwgLSAxICk7XG5cblx0XHRyZXR1cm4gdDtcblxuXHR9LFxuXG5cdC8vIFJldHVybnMgYSB1bml0IHZlY3RvciB0YW5nZW50IGF0IHRcblx0Ly8gSW4gY2FzZSBhbnkgc3ViIGN1cnZlIGRvZXMgbm90IGltcGxlbWVudCBpdHMgdGFuZ2VudCBkZXJpdmF0aW9uLFxuXHQvLyAyIHBvaW50cyBhIHNtYWxsIGRlbHRhIGFwYXJ0IHdpbGwgYmUgdXNlZCB0byBmaW5kIGl0cyBncmFkaWVudFxuXHQvLyB3aGljaCBzZWVtcyB0byBnaXZlIGEgcmVhc29uYWJsZSBhcHByb3hpbWF0aW9uXG5cblx0Z2V0VGFuZ2VudDogZnVuY3Rpb24gKCB0ICkge1xuXG5cdFx0dmFyIGRlbHRhID0gMC4wMDAxO1xuXHRcdHZhciB0MSA9IHQgLSBkZWx0YTtcblx0XHR2YXIgdDIgPSB0ICsgZGVsdGE7XG5cblx0XHQvLyBDYXBwaW5nIGluIGNhc2Ugb2YgZGFuZ2VyXG5cblx0XHRpZiAoIHQxIDwgMCApIHQxID0gMDtcblx0XHRpZiAoIHQyID4gMSApIHQyID0gMTtcblxuXHRcdHZhciBwdDEgPSB0aGlzLmdldFBvaW50KCB0MSApO1xuXHRcdHZhciBwdDIgPSB0aGlzLmdldFBvaW50KCB0MiApO1xuXG5cdFx0dmFyIHZlYyA9IHB0Mi5jbG9uZSgpLnN1YiggcHQxICk7XG5cdFx0cmV0dXJuIHZlYy5ub3JtYWxpemUoKTtcblxuXHR9LFxuXG5cdGdldFRhbmdlbnRBdDogZnVuY3Rpb24gKCB1ICkge1xuXG5cdFx0dmFyIHQgPSB0aGlzLmdldFV0b1RtYXBwaW5nKCB1ICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudCggdCApO1xuXG5cdH0sXG5cblx0Y29tcHV0ZUZyZW5ldEZyYW1lczogZnVuY3Rpb24gKCBzZWdtZW50cywgY2xvc2VkICkge1xuXG5cdFx0Ly8gc2VlIGh0dHA6Ly93d3cuY3MuaW5kaWFuYS5lZHUvcHViL3RlY2hyZXBvcnRzL1RSNDI1LnBkZlxuXG5cdFx0dmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgdGFuZ2VudHMgPSBbXTtcblx0XHR2YXIgbm9ybWFscyA9IFtdO1xuXHRcdHZhciBiaW5vcm1hbHMgPSBbXTtcblxuXHRcdHZhciB2ZWMgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBtYXQgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0dmFyIGksIHUsIHRoZXRhO1xuXG5cdFx0Ly8gY29tcHV0ZSB0aGUgdGFuZ2VudCB2ZWN0b3JzIGZvciBlYWNoIHNlZ21lbnQgb24gdGhlIGN1cnZlXG5cblx0XHRmb3IgKCBpID0gMDsgaSA8PSBzZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0dSA9IGkgLyBzZWdtZW50cztcblxuXHRcdFx0dGFuZ2VudHNbIGkgXSA9IHRoaXMuZ2V0VGFuZ2VudEF0KCB1ICk7XG5cdFx0XHR0YW5nZW50c1sgaSBdLm5vcm1hbGl6ZSgpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2VsZWN0IGFuIGluaXRpYWwgbm9ybWFsIHZlY3RvciBwZXJwZW5kaWN1bGFyIHRvIHRoZSBmaXJzdCB0YW5nZW50IHZlY3Rvcixcblx0XHQvLyBhbmQgaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgbWluaW11bSB0YW5nZW50IHh5eiBjb21wb25lbnRcblxuXHRcdG5vcm1hbHNbIDAgXSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0Ymlub3JtYWxzWyAwIF0gPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBtaW4gPSBOdW1iZXIuTUFYX1ZBTFVFO1xuXHRcdHZhciB0eCA9IE1hdGguYWJzKCB0YW5nZW50c1sgMCBdLnggKTtcblx0XHR2YXIgdHkgPSBNYXRoLmFicyggdGFuZ2VudHNbIDAgXS55ICk7XG5cdFx0dmFyIHR6ID0gTWF0aC5hYnMoIHRhbmdlbnRzWyAwIF0ueiApO1xuXG5cdFx0aWYgKCB0eCA8PSBtaW4gKSB7XG5cblx0XHRcdG1pbiA9IHR4O1xuXHRcdFx0bm9ybWFsLnNldCggMSwgMCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0eSA8PSBtaW4gKSB7XG5cblx0XHRcdG1pbiA9IHR5O1xuXHRcdFx0bm9ybWFsLnNldCggMCwgMSwgMCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0eiA8PSBtaW4gKSB7XG5cblx0XHRcdG5vcm1hbC5zZXQoIDAsIDAsIDEgKTtcblxuXHRcdH1cblxuXHRcdHZlYy5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyAwIF0sIG5vcm1hbCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0bm9ybWFsc1sgMCBdLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIDAgXSwgdmVjICk7XG5cdFx0Ymlub3JtYWxzWyAwIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgMCBdLCBub3JtYWxzWyAwIF0gKTtcblxuXG5cdFx0Ly8gY29tcHV0ZSB0aGUgc2xvd2x5LXZhcnlpbmcgbm9ybWFsIGFuZCBiaW5vcm1hbCB2ZWN0b3JzIGZvciBlYWNoIHNlZ21lbnQgb24gdGhlIGN1cnZlXG5cblx0XHRmb3IgKCBpID0gMTsgaSA8PSBzZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0bm9ybWFsc1sgaSBdID0gbm9ybWFsc1sgaSAtIDEgXS5jbG9uZSgpO1xuXG5cdFx0XHRiaW5vcm1hbHNbIGkgXSA9IGJpbm9ybWFsc1sgaSAtIDEgXS5jbG9uZSgpO1xuXG5cdFx0XHR2ZWMuY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgaSAtIDEgXSwgdGFuZ2VudHNbIGkgXSApO1xuXG5cdFx0XHRpZiAoIHZlYy5sZW5ndGgoKSA+IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdHZlYy5ub3JtYWxpemUoKTtcblxuXHRcdFx0XHR0aGV0YSA9IE1hdGguYWNvcyggX01hdGguY2xhbXAoIHRhbmdlbnRzWyBpIC0gMSBdLmRvdCggdGFuZ2VudHNbIGkgXSApLCAtIDEsIDEgKSApOyAvLyBjbGFtcCBmb3IgZmxvYXRpbmcgcHQgZXJyb3JzXG5cblx0XHRcdFx0bm9ybWFsc1sgaSBdLmFwcGx5TWF0cml4NCggbWF0Lm1ha2VSb3RhdGlvbkF4aXMoIHZlYywgdGhldGEgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGJpbm9ybWFsc1sgaSBdLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIGkgXSwgbm9ybWFsc1sgaSBdICk7XG5cblx0XHR9XG5cblx0XHQvLyBpZiB0aGUgY3VydmUgaXMgY2xvc2VkLCBwb3N0cHJvY2VzcyB0aGUgdmVjdG9ycyBzbyB0aGUgZmlyc3QgYW5kIGxhc3Qgbm9ybWFsIHZlY3RvcnMgYXJlIHRoZSBzYW1lXG5cblx0XHRpZiAoIGNsb3NlZCA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0dGhldGEgPSBNYXRoLmFjb3MoIF9NYXRoLmNsYW1wKCBub3JtYWxzWyAwIF0uZG90KCBub3JtYWxzWyBzZWdtZW50cyBdICksIC0gMSwgMSApICk7XG5cdFx0XHR0aGV0YSAvPSBzZWdtZW50cztcblxuXHRcdFx0aWYgKCB0YW5nZW50c1sgMCBdLmRvdCggdmVjLmNyb3NzVmVjdG9ycyggbm9ybWFsc1sgMCBdLCBub3JtYWxzWyBzZWdtZW50cyBdICkgKSA+IDAgKSB7XG5cblx0XHRcdFx0dGhldGEgPSAtIHRoZXRhO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIGkgPSAxOyBpIDw9IHNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRcdC8vIHR3aXN0IGEgbGl0dGxlLi4uXG5cdFx0XHRcdG5vcm1hbHNbIGkgXS5hcHBseU1hdHJpeDQoIG1hdC5tYWtlUm90YXRpb25BeGlzKCB0YW5nZW50c1sgaSBdLCB0aGV0YSAqIGkgKSApO1xuXHRcdFx0XHRiaW5vcm1hbHNbIGkgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyBpIF0sIG5vcm1hbHNbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0dGFuZ2VudHM6IHRhbmdlbnRzLFxuXHRcdFx0bm9ybWFsczogbm9ybWFscyxcblx0XHRcdGJpbm9ybWFsczogYmlub3JtYWxzXG5cdFx0fTtcblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gTGluZUN1cnZlKCB2MSwgdjIgKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudjEgPSB2MTtcblx0dGhpcy52MiA9IHYyO1xuXG59XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcbkxpbmVDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMaW5lQ3VydmU7XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUuaXNMaW5lQ3VydmUgPSB0cnVlO1xuXG5MaW5lQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0ICkge1xuXG5cdGlmICggdCA9PT0gMSApIHtcblxuXHRcdHJldHVybiB0aGlzLnYyLmNsb25lKCk7XG5cblx0fVxuXG5cdHZhciBwb2ludCA9IHRoaXMudjIuY2xvbmUoKS5zdWIoIHRoaXMudjEgKTtcblx0cG9pbnQubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMudjEgKTtcblxuXHRyZXR1cm4gcG9pbnQ7XG5cbn07XG5cbi8vIExpbmUgY3VydmUgaXMgbGluZWFyLCBzbyB3ZSBjYW4gb3ZlcndyaXRlIGRlZmF1bHQgZ2V0UG9pbnRBdFxuXG5MaW5lQ3VydmUucHJvdG90eXBlLmdldFBvaW50QXQgPSBmdW5jdGlvbiAoIHUgKSB7XG5cblx0cmV0dXJuIHRoaXMuZ2V0UG9pbnQoIHUgKTtcblxufTtcblxuTGluZUN1cnZlLnByb3RvdHlwZS5nZXRUYW5nZW50ID0gZnVuY3Rpb24gKCB0ICkge1xuXG5cdHZhciB0YW5nZW50ID0gdGhpcy52Mi5jbG9uZSgpLnN1YiggdGhpcy52MSApO1xuXG5cdHJldHVybiB0YW5nZW50Lm5vcm1hbGl6ZSgpO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqXG4gKiovXG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICpcdEN1cnZlZCBQYXRoIC0gYSBjdXJ2ZSBwYXRoIGlzIHNpbXBseSBhIGFycmF5IG9mIGNvbm5lY3RlZFxuICogIGN1cnZlcywgYnV0IHJldGFpbnMgdGhlIGFwaSBvZiBhIGN1cnZlXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmZ1bmN0aW9uIEN1cnZlUGF0aCgpIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5jdXJ2ZXMgPSBbXTtcblxuXHR0aGlzLmF1dG9DbG9zZSA9IGZhbHNlOyAvLyBBdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgcGF0aFxuXG59XG5cbkN1cnZlUGF0aC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBDdXJ2ZVBhdGgsXG5cblx0YWRkOiBmdW5jdGlvbiAoIGN1cnZlICkge1xuXG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcblxuXHR9LFxuXG5cdGNsb3NlUGF0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gQWRkIGEgbGluZSBjdXJ2ZSBpZiBzdGFydCBhbmQgZW5kIG9mIGxpbmVzIGFyZSBub3QgY29ubmVjdGVkXG5cdFx0dmFyIHN0YXJ0UG9pbnQgPSB0aGlzLmN1cnZlc1sgMCBdLmdldFBvaW50KCAwICk7XG5cdFx0dmFyIGVuZFBvaW50ID0gdGhpcy5jdXJ2ZXNbIHRoaXMuY3VydmVzLmxlbmd0aCAtIDEgXS5nZXRQb2ludCggMSApO1xuXG5cdFx0aWYgKCAhIHN0YXJ0UG9pbnQuZXF1YWxzKCBlbmRQb2ludCApICkge1xuXG5cdFx0XHR0aGlzLmN1cnZlcy5wdXNoKCBuZXcgTGluZUN1cnZlKCBlbmRQb2ludCwgc3RhcnRQb2ludCApICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHQvLyBUbyBnZXQgYWNjdXJhdGUgcG9pbnQgd2l0aCByZWZlcmVuY2UgdG9cblx0Ly8gZW50aXJlIHBhdGggZGlzdGFuY2UgYXQgdGltZSB0LFxuXHQvLyBmb2xsb3dpbmcgaGFzIHRvIGJlIGRvbmU6XG5cblx0Ly8gMS4gTGVuZ3RoIG9mIGVhY2ggc3ViIHBhdGggaGF2ZSB0byBiZSBrbm93blxuXHQvLyAyLiBMb2NhdGUgYW5kIGlkZW50aWZ5IHR5cGUgb2YgY3VydmVcblx0Ly8gMy4gR2V0IHQgZm9yIHRoZSBjdXJ2ZVxuXHQvLyA0LiBSZXR1cm4gY3VydmUuZ2V0UG9pbnRBdCh0JylcblxuXHRnZXRQb2ludDogZnVuY3Rpb24gKCB0ICkge1xuXG5cdFx0dmFyIGQgPSB0ICogdGhpcy5nZXRMZW5ndGgoKTtcblx0XHR2YXIgY3VydmVMZW5ndGhzID0gdGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtcblx0XHR2YXIgaSA9IDA7XG5cblx0XHQvLyBUbyB0aGluayBhYm91dCBib3VuZGFyaWVzIHBvaW50cy5cblxuXHRcdHdoaWxlICggaSA8IGN1cnZlTGVuZ3Rocy5sZW5ndGggKSB7XG5cblx0XHRcdGlmICggY3VydmVMZW5ndGhzWyBpIF0gPj0gZCApIHtcblxuXHRcdFx0XHR2YXIgZGlmZiA9IGN1cnZlTGVuZ3Roc1sgaSBdIC0gZDtcblx0XHRcdFx0dmFyIGN1cnZlID0gdGhpcy5jdXJ2ZXNbIGkgXTtcblxuXHRcdFx0XHR2YXIgc2VnbWVudExlbmd0aCA9IGN1cnZlLmdldExlbmd0aCgpO1xuXHRcdFx0XHR2YXIgdSA9IHNlZ21lbnRMZW5ndGggPT09IDAgPyAwIDogMSAtIGRpZmYgLyBzZWdtZW50TGVuZ3RoO1xuXG5cdFx0XHRcdHJldHVybiBjdXJ2ZS5nZXRQb2ludEF0KCB1ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aSArKztcblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdFx0Ly8gbG9vcCB3aGVyZSBzdW0gIT0gMCwgc3VtID4gZCAsIHN1bSsxIDxkXG5cblx0fSxcblxuXHQvLyBXZSBjYW5ub3QgdXNlIHRoZSBkZWZhdWx0IFRIUkVFLkN1cnZlIGdldFBvaW50KCkgd2l0aCBnZXRMZW5ndGgoKSBiZWNhdXNlIGluXG5cdC8vIFRIUkVFLkN1cnZlLCBnZXRMZW5ndGgoKSBkZXBlbmRzIG9uIGdldFBvaW50KCkgYnV0IGluIFRIUkVFLkN1cnZlUGF0aFxuXHQvLyBnZXRQb2ludCgpIGRlcGVuZHMgb24gZ2V0TGVuZ3RoXG5cblx0Z2V0TGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbGVucyA9IHRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7XG5cdFx0cmV0dXJuIGxlbnNbIGxlbnMubGVuZ3RoIC0gMSBdO1xuXG5cdH0sXG5cblx0Ly8gY2FjaGVMZW5ndGhzIG11c3QgYmUgcmVjYWxjdWxhdGVkLlxuXHR1cGRhdGVBcmNMZW5ndGhzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblx0XHR0aGlzLmNhY2hlTGVuZ3RocyA9IG51bGw7XG5cdFx0dGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtcblxuXHR9LFxuXG5cdC8vIENvbXB1dGUgbGVuZ3RocyBhbmQgY2FjaGUgdGhlbVxuXHQvLyBXZSBjYW5ub3Qgb3ZlcndyaXRlIGdldExlbmd0aHMoKSBiZWNhdXNlIFV0b1QgbWFwcGluZyB1c2VzIGl0LlxuXG5cdGdldEN1cnZlTGVuZ3RoczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gV2UgdXNlIGNhY2hlIHZhbHVlcyBpZiBjdXJ2ZXMgYW5kIGNhY2hlIGFycmF5IGFyZSBzYW1lIGxlbmd0aFxuXG5cdFx0aWYgKCB0aGlzLmNhY2hlTGVuZ3RocyAmJiB0aGlzLmNhY2hlTGVuZ3Rocy5sZW5ndGggPT09IHRoaXMuY3VydmVzLmxlbmd0aCApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzO1xuXG5cdFx0fVxuXG5cdFx0Ly8gR2V0IGxlbmd0aCBvZiBzdWItY3VydmVcblx0XHQvLyBQdXNoIHN1bXMgaW50byBjYWNoZWQgYXJyYXlcblxuXHRcdHZhciBsZW5ndGhzID0gW10sIHN1bXMgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5jdXJ2ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0c3VtcyArPSB0aGlzLmN1cnZlc1sgaSBdLmdldExlbmd0aCgpO1xuXHRcdFx0bGVuZ3Rocy5wdXNoKCBzdW1zICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmNhY2hlTGVuZ3RocyA9IGxlbmd0aHM7XG5cblx0XHRyZXR1cm4gbGVuZ3RocztcblxuXHR9LFxuXG5cdGdldFNwYWNlZFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRpZiAoIGRpdmlzaW9ucyA9PT0gdW5kZWZpbmVkICkgZGl2aXNpb25zID0gNDA7XG5cblx0XHR2YXIgcG9pbnRzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPD0gZGl2aXNpb25zOyBpICsrICkge1xuXG5cdFx0XHRwb2ludHMucHVzaCggdGhpcy5nZXRQb2ludCggaSAvIGRpdmlzaW9ucyApICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYXV0b0Nsb3NlICkge1xuXG5cdFx0XHRwb2ludHMucHVzaCggcG9pbnRzWyAwIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBwb2ludHM7XG5cblx0fSxcblxuXHRnZXRQb2ludHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkge1xuXG5cdFx0ZGl2aXNpb25zID0gZGl2aXNpb25zIHx8IDEyO1xuXG5cdFx0dmFyIHBvaW50cyA9IFtdLCBsYXN0O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBjdXJ2ZXMgPSB0aGlzLmN1cnZlczsgaSA8IGN1cnZlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjdXJ2ZSA9IGN1cnZlc1sgaSBdO1xuXHRcdFx0dmFyIHJlc29sdXRpb24gPSAoY3VydmUgJiYgY3VydmUuaXNFbGxpcHNlQ3VydmUpID8gZGl2aXNpb25zICogMlxuXHRcdFx0XHQ6IChjdXJ2ZSAmJiBjdXJ2ZS5pc0xpbmVDdXJ2ZSkgPyAxXG5cdFx0XHRcdDogKGN1cnZlICYmIGN1cnZlLmlzU3BsaW5lQ3VydmUpID8gZGl2aXNpb25zICogY3VydmUucG9pbnRzLmxlbmd0aFxuXHRcdFx0XHQ6IGRpdmlzaW9ucztcblxuXHRcdFx0dmFyIHB0cyA9IGN1cnZlLmdldFBvaW50cyggcmVzb2x1dGlvbiApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCBwdHMubGVuZ3RoOyBqKysgKSB7XG5cblx0XHRcdFx0dmFyIHBvaW50ID0gcHRzWyBqIF07XG5cblx0XHRcdFx0aWYgKCBsYXN0ICYmIGxhc3QuZXF1YWxzKCBwb2ludCApICkgY29udGludWU7IC8vIGVuc3VyZXMgbm8gY29uc2VjdXRpdmUgcG9pbnRzIGFyZSBkdXBsaWNhdGVzXG5cblx0XHRcdFx0cG9pbnRzLnB1c2goIHBvaW50ICk7XG5cdFx0XHRcdGxhc3QgPSBwb2ludDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmF1dG9DbG9zZSAmJiBwb2ludHMubGVuZ3RoID4gMSAmJiAhcG9pbnRzWyBwb2ludHMubGVuZ3RoIC0gMSBdLmVxdWFscyggcG9pbnRzWyAwIF0gKSApIHtcblxuXHRcdFx0cG9pbnRzLnB1c2goIHBvaW50c1sgMCBdICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcG9pbnRzO1xuXG5cdH0sXG5cblx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cdCAqXHRDcmVhdGUgR2VvbWV0cmllcyBIZWxwZXJzXG5cdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuXHQvLy8gR2VuZXJhdGUgZ2VvbWV0cnkgZnJvbSBwYXRoIHBvaW50cyAoZm9yIExpbmUgb3IgUG9pbnRzIG9iamVjdHMpXG5cblx0Y3JlYXRlUG9pbnRzR2VvbWV0cnk6IGZ1bmN0aW9uICggZGl2aXNpb25zICkge1xuXG5cdFx0dmFyIHB0cyA9IHRoaXMuZ2V0UG9pbnRzKCBkaXZpc2lvbnMgKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeSggcHRzICk7XG5cblx0fSxcblxuXHQvLyBHZW5lcmF0ZSBnZW9tZXRyeSBmcm9tIGVxdWlkaXN0YW50IHNhbXBsaW5nIGFsb25nIHRoZSBwYXRoXG5cblx0Y3JlYXRlU3BhY2VkUG9pbnRzR2VvbWV0cnk6IGZ1bmN0aW9uICggZGl2aXNpb25zICkge1xuXG5cdFx0dmFyIHB0cyA9IHRoaXMuZ2V0U3BhY2VkUG9pbnRzKCBkaXZpc2lvbnMgKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeSggcHRzICk7XG5cblx0fSxcblxuXHRjcmVhdGVHZW9tZXRyeTogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cnkoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgcG9pbnQgPSBwb2ludHNbIGkgXTtcblx0XHRcdGdlb21ldHJ5LnZlcnRpY2VzLnB1c2goIG5ldyBWZWN0b3IzKCBwb2ludC54LCBwb2ludC55LCBwb2ludC56IHx8IDAgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGdlb21ldHJ5O1xuXG5cdH1cblxufSApO1xuXG5mdW5jdGlvbiBFbGxpcHNlQ3VydmUoIGFYLCBhWSwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmFYID0gYVg7XG5cdHRoaXMuYVkgPSBhWTtcblxuXHR0aGlzLnhSYWRpdXMgPSB4UmFkaXVzO1xuXHR0aGlzLnlSYWRpdXMgPSB5UmFkaXVzO1xuXG5cdHRoaXMuYVN0YXJ0QW5nbGUgPSBhU3RhcnRBbmdsZTtcblx0dGhpcy5hRW5kQW5nbGUgPSBhRW5kQW5nbGU7XG5cblx0dGhpcy5hQ2xvY2t3aXNlID0gYUNsb2Nrd2lzZTtcblxuXHR0aGlzLmFSb3RhdGlvbiA9IGFSb3RhdGlvbiB8fCAwO1xuXG59XG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBFbGxpcHNlQ3VydmU7XG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuaXNFbGxpcHNlQ3VydmUgPSB0cnVlO1xuXG5FbGxpcHNlQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0ICkge1xuXG5cdHZhciB0d29QaSA9IE1hdGguUEkgKiAyO1xuXHR2YXIgZGVsdGFBbmdsZSA9IHRoaXMuYUVuZEFuZ2xlIC0gdGhpcy5hU3RhcnRBbmdsZTtcblx0dmFyIHNhbWVQb2ludHMgPSBNYXRoLmFicyggZGVsdGFBbmdsZSApIDwgTnVtYmVyLkVQU0lMT047XG5cblx0Ly8gZW5zdXJlcyB0aGF0IGRlbHRhQW5nbGUgaXMgMCAuLiAyIFBJXG5cdHdoaWxlICggZGVsdGFBbmdsZSA8IDAgKSBkZWx0YUFuZ2xlICs9IHR3b1BpO1xuXHR3aGlsZSAoIGRlbHRhQW5nbGUgPiB0d29QaSApIGRlbHRhQW5nbGUgLT0gdHdvUGk7XG5cblx0aWYgKCBkZWx0YUFuZ2xlIDwgTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRpZiAoIHNhbWVQb2ludHMgKSB7XG5cblx0XHRcdGRlbHRhQW5nbGUgPSAwO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGVsdGFBbmdsZSA9IHR3b1BpO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRpZiAoIHRoaXMuYUNsb2Nrd2lzZSA9PT0gdHJ1ZSAmJiAhIHNhbWVQb2ludHMgKSB7XG5cblx0XHRpZiAoIGRlbHRhQW5nbGUgPT09IHR3b1BpICkge1xuXG5cdFx0XHRkZWx0YUFuZ2xlID0gLSB0d29QaTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGRlbHRhQW5nbGUgPSBkZWx0YUFuZ2xlIC0gdHdvUGk7XG5cblx0XHR9XG5cblx0fVxuXG5cdHZhciBhbmdsZSA9IHRoaXMuYVN0YXJ0QW5nbGUgKyB0ICogZGVsdGFBbmdsZTtcblx0dmFyIHggPSB0aGlzLmFYICsgdGhpcy54UmFkaXVzICogTWF0aC5jb3MoIGFuZ2xlICk7XG5cdHZhciB5ID0gdGhpcy5hWSArIHRoaXMueVJhZGl1cyAqIE1hdGguc2luKCBhbmdsZSApO1xuXG5cdGlmICggdGhpcy5hUm90YXRpb24gIT09IDAgKSB7XG5cblx0XHR2YXIgY29zID0gTWF0aC5jb3MoIHRoaXMuYVJvdGF0aW9uICk7XG5cdFx0dmFyIHNpbiA9IE1hdGguc2luKCB0aGlzLmFSb3RhdGlvbiApO1xuXG5cdFx0dmFyIHR4ID0geCAtIHRoaXMuYVg7XG5cdFx0dmFyIHR5ID0geSAtIHRoaXMuYVk7XG5cblx0XHQvLyBSb3RhdGUgdGhlIHBvaW50IGFib3V0IHRoZSBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuXG5cdFx0eCA9IHR4ICogY29zIC0gdHkgKiBzaW4gKyB0aGlzLmFYO1xuXHRcdHkgPSB0eCAqIHNpbiArIHR5ICogY29zICsgdGhpcy5hWTtcblxuXHR9XG5cblx0cmV0dXJuIG5ldyBWZWN0b3IyKCB4LCB5ICk7XG5cbn07XG5cbmZ1bmN0aW9uIFNwbGluZUN1cnZlKCBwb2ludHMgLyogYXJyYXkgb2YgVmVjdG9yMiAqLyApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5wb2ludHMgPSAoIHBvaW50cyA9PT0gdW5kZWZpbmVkICkgPyBbXSA6IHBvaW50cztcblxufVxuXG5TcGxpbmVDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcblNwbGluZUN1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNwbGluZUN1cnZlO1xuXG5TcGxpbmVDdXJ2ZS5wcm90b3R5cGUuaXNTcGxpbmVDdXJ2ZSA9IHRydWU7XG5cblNwbGluZUN1cnZlLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCApIHtcblxuXHR2YXIgcG9pbnRzID0gdGhpcy5wb2ludHM7XG5cdHZhciBwb2ludCA9ICggcG9pbnRzLmxlbmd0aCAtIDEgKSAqIHQ7XG5cblx0dmFyIGludFBvaW50ID0gTWF0aC5mbG9vciggcG9pbnQgKTtcblx0dmFyIHdlaWdodCA9IHBvaW50IC0gaW50UG9pbnQ7XG5cblx0dmFyIHBvaW50MCA9IHBvaW50c1sgaW50UG9pbnQgPT09IDAgPyBpbnRQb2ludCA6IGludFBvaW50IC0gMSBdO1xuXHR2YXIgcG9pbnQxID0gcG9pbnRzWyBpbnRQb2ludCBdO1xuXHR2YXIgcG9pbnQyID0gcG9pbnRzWyBpbnRQb2ludCA+IHBvaW50cy5sZW5ndGggLSAyID8gcG9pbnRzLmxlbmd0aCAtIDEgOiBpbnRQb2ludCArIDEgXTtcblx0dmFyIHBvaW50MyA9IHBvaW50c1sgaW50UG9pbnQgPiBwb2ludHMubGVuZ3RoIC0gMyA/IHBvaW50cy5sZW5ndGggLSAxIDogaW50UG9pbnQgKyAyIF07XG5cblx0cmV0dXJuIG5ldyBWZWN0b3IyKFxuXHRcdENhdG11bGxSb20oIHdlaWdodCwgcG9pbnQwLngsIHBvaW50MS54LCBwb2ludDIueCwgcG9pbnQzLnggKSxcblx0XHRDYXRtdWxsUm9tKCB3ZWlnaHQsIHBvaW50MC55LCBwb2ludDEueSwgcG9pbnQyLnksIHBvaW50My55IClcblx0KTtcblxufTtcblxuZnVuY3Rpb24gQ3ViaWNCZXppZXJDdXJ2ZSggdjAsIHYxLCB2MiwgdjMgKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudjAgPSB2MDtcblx0dGhpcy52MSA9IHYxO1xuXHR0aGlzLnYyID0gdjI7XG5cdHRoaXMudjMgPSB2MztcblxufVxuXG5DdWJpY0JlemllckN1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuQ3ViaWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDdWJpY0JlemllckN1cnZlO1xuXG5DdWJpY0JlemllckN1cnZlLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCApIHtcblxuXHR2YXIgdjAgPSB0aGlzLnYwLCB2MSA9IHRoaXMudjEsIHYyID0gdGhpcy52MiwgdjMgPSB0aGlzLnYzO1xuXG5cdHJldHVybiBuZXcgVmVjdG9yMihcblx0XHRDdWJpY0JlemllciggdCwgdjAueCwgdjEueCwgdjIueCwgdjMueCApLFxuXHRcdEN1YmljQmV6aWVyKCB0LCB2MC55LCB2MS55LCB2Mi55LCB2My55IClcblx0KTtcblxufTtcblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyQ3VydmUoIHYwLCB2MSwgdjIgKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudjAgPSB2MDtcblx0dGhpcy52MSA9IHYxO1xuXHR0aGlzLnYyID0gdjI7XG5cbn1cblxuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5RdWFkcmF0aWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBRdWFkcmF0aWNCZXppZXJDdXJ2ZTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0ICkge1xuXG5cdHZhciB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyO1xuXG5cdHJldHVybiBuZXcgVmVjdG9yMihcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLnggKSxcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnkgKVxuXHQpO1xuXG59O1xuXG52YXIgUGF0aFByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEN1cnZlUGF0aC5wcm90b3R5cGUgKSwge1xuXG5cdGZyb21Qb2ludHM6IGZ1bmN0aW9uICggdmVjdG9ycyApIHtcblxuXHRcdHRoaXMubW92ZVRvKCB2ZWN0b3JzWyAwIF0ueCwgdmVjdG9yc1sgMCBdLnkgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMSwgbCA9IHZlY3RvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5saW5lVG8oIHZlY3RvcnNbIGkgXS54LCB2ZWN0b3JzWyBpIF0ueSApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0bW92ZVRvOiBmdW5jdGlvbiAoIHgsIHkgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5zZXQoIHgsIHkgKTsgLy8gVE9ETyBjb25zaWRlciByZWZlcmVuY2luZyB2ZWN0b3JzIGluc3RlYWQgb2YgY29weWluZz9cblxuXHR9LFxuXG5cdGxpbmVUbzogZnVuY3Rpb24gKCB4LCB5ICkge1xuXG5cdFx0dmFyIGN1cnZlID0gbmV3IExpbmVDdXJ2ZSggdGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSwgbmV3IFZlY3RvcjIoIHgsIHkgKSApO1xuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5zZXQoIHgsIHkgKTtcblxuXHR9LFxuXG5cdHF1YWRyYXRpY0N1cnZlVG86IGZ1bmN0aW9uICggYUNQeCwgYUNQeSwgYVgsIGFZICkge1xuXG5cdFx0dmFyIGN1cnZlID0gbmV3IFF1YWRyYXRpY0JlemllckN1cnZlKFxuXHRcdFx0dGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBhQ1B4LCBhQ1B5ICksXG5cdFx0XHRuZXcgVmVjdG9yMiggYVgsIGFZIClcblx0XHQpO1xuXG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LnNldCggYVgsIGFZICk7XG5cblx0fSxcblxuXHRiZXppZXJDdXJ2ZVRvOiBmdW5jdGlvbiAoIGFDUDF4LCBhQ1AxeSwgYUNQMngsIGFDUDJ5LCBhWCwgYVkgKSB7XG5cblx0XHR2YXIgY3VydmUgPSBuZXcgQ3ViaWNCZXppZXJDdXJ2ZShcblx0XHRcdHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksXG5cdFx0XHRuZXcgVmVjdG9yMiggYUNQMXgsIGFDUDF5ICksXG5cdFx0XHRuZXcgVmVjdG9yMiggYUNQMngsIGFDUDJ5ICksXG5cdFx0XHRuZXcgVmVjdG9yMiggYVgsIGFZIClcblx0XHQpO1xuXG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LnNldCggYVgsIGFZICk7XG5cblx0fSxcblxuXHRzcGxpbmVUaHJ1OiBmdW5jdGlvbiAoIHB0cyAvKkFycmF5IG9mIFZlY3RvciovICkge1xuXG5cdFx0dmFyIG5wdHMgPSBbIHRoaXMuY3VycmVudFBvaW50LmNsb25lKCkgXS5jb25jYXQoIHB0cyApO1xuXG5cdFx0dmFyIGN1cnZlID0gbmV3IFNwbGluZUN1cnZlKCBucHRzICk7XG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LmNvcHkoIHB0c1sgcHRzLmxlbmd0aCAtIDEgXSApO1xuXG5cdH0sXG5cblx0YXJjOiBmdW5jdGlvbiAoIGFYLCBhWSwgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApIHtcblxuXHRcdHZhciB4MCA9IHRoaXMuY3VycmVudFBvaW50Lng7XG5cdFx0dmFyIHkwID0gdGhpcy5jdXJyZW50UG9pbnQueTtcblxuXHRcdHRoaXMuYWJzYXJjKCBhWCArIHgwLCBhWSArIHkwLCBhUmFkaXVzLFxuXHRcdFx0YVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApO1xuXG5cdH0sXG5cblx0YWJzYXJjOiBmdW5jdGlvbiAoIGFYLCBhWSwgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApIHtcblxuXHRcdHRoaXMuYWJzZWxsaXBzZSggYVgsIGFZLCBhUmFkaXVzLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICk7XG5cblx0fSxcblxuXHRlbGxpcHNlOiBmdW5jdGlvbiAoIGFYLCBhWSwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICkge1xuXG5cdFx0dmFyIHgwID0gdGhpcy5jdXJyZW50UG9pbnQueDtcblx0XHR2YXIgeTAgPSB0aGlzLmN1cnJlbnRQb2ludC55O1xuXG5cdFx0dGhpcy5hYnNlbGxpcHNlKCBhWCArIHgwLCBhWSArIHkwLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKTtcblxuXHR9LFxuXG5cdGFic2VsbGlwc2U6IGZ1bmN0aW9uICggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKSB7XG5cblx0XHR2YXIgY3VydmUgPSBuZXcgRWxsaXBzZUN1cnZlKCBhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApO1xuXG5cdFx0aWYgKCB0aGlzLmN1cnZlcy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHQvLyBpZiBhIHByZXZpb3VzIGN1cnZlIGlzIHByZXNlbnQsIGF0dGVtcHQgdG8gam9pblxuXHRcdFx0dmFyIGZpcnN0UG9pbnQgPSBjdXJ2ZS5nZXRQb2ludCggMCApO1xuXG5cdFx0XHRpZiAoICEgZmlyc3RQb2ludC5lcXVhbHMoIHRoaXMuY3VycmVudFBvaW50ICkgKSB7XG5cblx0XHRcdFx0dGhpcy5saW5lVG8oIGZpcnN0UG9pbnQueCwgZmlyc3RQb2ludC55ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XG5cblx0XHR2YXIgbGFzdFBvaW50ID0gY3VydmUuZ2V0UG9pbnQoIDEgKTtcblx0XHR0aGlzLmN1cnJlbnRQb2ludC5jb3B5KCBsYXN0UG9pbnQgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBDcmVhdGVzIGZyZWUgZm9ybSAyZCBwYXRoIHVzaW5nIHNlcmllcyBvZiBwb2ludHMsIGxpbmVzIG9yIGN1cnZlcy5cbiAqKi9cblxuZnVuY3Rpb24gUGF0aCggcG9pbnRzICkge1xuXG5cdEN1cnZlUGF0aC5jYWxsKCB0aGlzICk7XG5cdHRoaXMuY3VycmVudFBvaW50ID0gbmV3IFZlY3RvcjIoKTtcblxuXHRpZiAoIHBvaW50cyApIHtcblxuXHRcdHRoaXMuZnJvbVBvaW50cyggcG9pbnRzICk7XG5cblx0fVxuXG59XG5cblBhdGgucHJvdG90eXBlID0gUGF0aFByb3RvdHlwZTtcblBhdGhQcm90b3R5cGUuY29uc3RydWN0b3IgPSBQYXRoO1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIERlZmluZXMgYSAyZCBzaGFwZSBwbGFuZSB1c2luZyBwYXRocy5cbiAqKi9cblxuLy8gU1RFUCAxIENyZWF0ZSBhIHBhdGguXG4vLyBTVEVQIDIgVHVybiBwYXRoIGludG8gc2hhcGUuXG4vLyBTVEVQIDMgRXh0cnVkZUdlb21ldHJ5IHRha2VzIGluIFNoYXBlL1NoYXBlc1xuLy8gU1RFUCAzYSAtIEV4dHJhY3QgcG9pbnRzIGZyb20gZWFjaCBzaGFwZSwgdHVybiB0byB2ZXJ0aWNlc1xuLy8gU1RFUCAzYiAtIFRyaWFuZ3VsYXRlIGVhY2ggc2hhcGUsIGFkZCBmYWNlcy5cblxuZnVuY3Rpb24gU2hhcGUoKSB7XG5cblx0UGF0aC5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cblx0dGhpcy5ob2xlcyA9IFtdO1xuXG59XG5cblNoYXBlLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIFBhdGhQcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTaGFwZSxcblxuXHRnZXRQb2ludHNIb2xlczogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHR2YXIgaG9sZXNQdHMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0aG9sZXNQdHNbIGkgXSA9IHRoaXMuaG9sZXNbIGkgXS5nZXRQb2ludHMoIGRpdmlzaW9ucyApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGhvbGVzUHRzO1xuXG5cdH0sXG5cblx0Ly8gR2V0IHBvaW50cyBvZiBzaGFwZSBhbmQgaG9sZXMgKGtleXBvaW50cyBiYXNlZCBvbiBzZWdtZW50cyBwYXJhbWV0ZXIpXG5cblx0ZXh0cmFjdEFsbFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRyZXR1cm4ge1xuXG5cdFx0XHRzaGFwZTogdGhpcy5nZXRQb2ludHMoIGRpdmlzaW9ucyApLFxuXHRcdFx0aG9sZXM6IHRoaXMuZ2V0UG9pbnRzSG9sZXMoIGRpdmlzaW9ucyApXG5cblx0XHR9O1xuXG5cdH0sXG5cblx0ZXh0cmFjdFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5leHRyYWN0QWxsUG9pbnRzKCBkaXZpc2lvbnMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBtaW5pbWFsIGNsYXNzIGZvciBwcm94aW5nIGZ1bmN0aW9ucyB0byBQYXRoLiBSZXBsYWNlcyBvbGQgXCJleHRyYWN0U3VicGF0aHMoKVwiXG4gKiovXG5cbmZ1bmN0aW9uIFNoYXBlUGF0aCgpIHtcblxuXHR0aGlzLnN1YlBhdGhzID0gW107XG5cdHRoaXMuY3VycmVudFBhdGggPSBudWxsO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFNoYXBlUGF0aC5wcm90b3R5cGUsIHtcblxuXHRtb3ZlVG86IGZ1bmN0aW9uICggeCwgeSApIHtcblxuXHRcdHRoaXMuY3VycmVudFBhdGggPSBuZXcgUGF0aCgpO1xuXHRcdHRoaXMuc3ViUGF0aHMucHVzaCggdGhpcy5jdXJyZW50UGF0aCApO1xuXHRcdHRoaXMuY3VycmVudFBhdGgubW92ZVRvKCB4LCB5ICk7XG5cblx0fSxcblxuXHRsaW5lVG86IGZ1bmN0aW9uICggeCwgeSApIHtcblxuXHRcdHRoaXMuY3VycmVudFBhdGgubGluZVRvKCB4LCB5ICk7XG5cblx0fSxcblxuXHRxdWFkcmF0aWNDdXJ2ZVRvOiBmdW5jdGlvbiAoIGFDUHgsIGFDUHksIGFYLCBhWSApIHtcblxuXHRcdHRoaXMuY3VycmVudFBhdGgucXVhZHJhdGljQ3VydmVUbyggYUNQeCwgYUNQeSwgYVgsIGFZICk7XG5cblx0fSxcblxuXHRiZXppZXJDdXJ2ZVRvOiBmdW5jdGlvbiAoIGFDUDF4LCBhQ1AxeSwgYUNQMngsIGFDUDJ5LCBhWCwgYVkgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQYXRoLmJlemllckN1cnZlVG8oIGFDUDF4LCBhQ1AxeSwgYUNQMngsIGFDUDJ5LCBhWCwgYVkgKTtcblxuXHR9LFxuXG5cdHNwbGluZVRocnU6IGZ1bmN0aW9uICggcHRzICkge1xuXG5cdFx0dGhpcy5jdXJyZW50UGF0aC5zcGxpbmVUaHJ1KCBwdHMgKTtcblxuXHR9LFxuXG5cdHRvU2hhcGVzOiBmdW5jdGlvbiAoIGlzQ0NXLCBub0hvbGVzICkge1xuXG5cdFx0ZnVuY3Rpb24gdG9TaGFwZXNOb0hvbGVzKCBpblN1YnBhdGhzICkge1xuXG5cdFx0XHR2YXIgc2hhcGVzID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGluU3VicGF0aHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgdG1wUGF0aCA9IGluU3VicGF0aHNbIGkgXTtcblxuXHRcdFx0XHR2YXIgdG1wU2hhcGUgPSBuZXcgU2hhcGUoKTtcblx0XHRcdFx0dG1wU2hhcGUuY3VydmVzID0gdG1wUGF0aC5jdXJ2ZXM7XG5cblx0XHRcdFx0c2hhcGVzLnB1c2goIHRtcFNoYXBlICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNoYXBlcztcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGlzUG9pbnRJbnNpZGVQb2x5Z29uKCBpblB0LCBpblBvbHlnb24gKSB7XG5cblx0XHRcdHZhciBwb2x5TGVuID0gaW5Qb2x5Z29uLmxlbmd0aDtcblxuXHRcdFx0Ly8gaW5QdCBvbiBwb2x5Z29uIGNvbnRvdXIgPT4gaW1tZWRpYXRlIHN1Y2Nlc3MgICAgb3Jcblx0XHRcdC8vIHRvZ2dsaW5nIG9mIGluc2lkZS9vdXRzaWRlIGF0IGV2ZXJ5IHNpbmdsZSEgaW50ZXJzZWN0aW9uIHBvaW50IG9mIGFuIGVkZ2Vcblx0XHRcdC8vICB3aXRoIHRoZSBob3Jpem9udGFsIGxpbmUgdGhyb3VnaCBpblB0LCBsZWZ0IG9mIGluUHRcblx0XHRcdC8vICBub3QgY291bnRpbmcgbG93ZXJZIGVuZHBvaW50cyBvZiBlZGdlcyBhbmQgd2hvbGUgZWRnZXMgb24gdGhhdCBsaW5lXG5cdFx0XHR2YXIgaW5zaWRlID0gZmFsc2U7XG5cdFx0XHRmb3IgKCB2YXIgcCA9IHBvbHlMZW4gLSAxLCBxID0gMDsgcSA8IHBvbHlMZW47IHAgPSBxICsrICkge1xuXG5cdFx0XHRcdHZhciBlZGdlTG93UHQgID0gaW5Qb2x5Z29uWyBwIF07XG5cdFx0XHRcdHZhciBlZGdlSGlnaFB0ID0gaW5Qb2x5Z29uWyBxIF07XG5cblx0XHRcdFx0dmFyIGVkZ2VEeCA9IGVkZ2VIaWdoUHQueCAtIGVkZ2VMb3dQdC54O1xuXHRcdFx0XHR2YXIgZWRnZUR5ID0gZWRnZUhpZ2hQdC55IC0gZWRnZUxvd1B0Lnk7XG5cblx0XHRcdFx0aWYgKCBNYXRoLmFicyggZWRnZUR5ICkgPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRcdC8vIG5vdCBwYXJhbGxlbFxuXHRcdFx0XHRcdGlmICggZWRnZUR5IDwgMCApIHtcblxuXHRcdFx0XHRcdFx0ZWRnZUxvd1B0ICA9IGluUG9seWdvblsgcSBdOyBlZGdlRHggPSAtIGVkZ2VEeDtcblx0XHRcdFx0XHRcdGVkZ2VIaWdoUHQgPSBpblBvbHlnb25bIHAgXTsgZWRnZUR5ID0gLSBlZGdlRHk7XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCAoIGluUHQueSA8IGVkZ2VMb3dQdC55ICkgfHwgKCBpblB0LnkgPiBlZGdlSGlnaFB0LnkgKSApIFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHRcdGlmICggaW5QdC55ID09PSBlZGdlTG93UHQueSApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBpblB0LnggPT09IGVkZ2VMb3dQdC54IClcdFx0cmV0dXJuXHR0cnVlO1x0XHQvLyBpblB0IGlzIG9uIGNvbnRvdXIgP1xuXHRcdFx0XHRcdFx0Ly8gY29udGludWU7XHRcdFx0XHQvLyBubyBpbnRlcnNlY3Rpb24gb3IgZWRnZUxvd1B0ID0+IGRvZXNuJ3QgY291bnQgISEhXG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHR2YXIgcGVycEVkZ2UgPSBlZGdlRHkgKiAoIGluUHQueCAtIGVkZ2VMb3dQdC54ICkgLSBlZGdlRHggKiAoIGluUHQueSAtIGVkZ2VMb3dQdC55ICk7XG5cdFx0XHRcdFx0XHRpZiAoIHBlcnBFZGdlID09PSAwIClcdFx0XHRcdHJldHVyblx0dHJ1ZTtcdFx0Ly8gaW5QdCBpcyBvbiBjb250b3VyID9cblx0XHRcdFx0XHRcdGlmICggcGVycEVkZ2UgPCAwICkgXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdGluc2lkZSA9ICEgaW5zaWRlO1x0XHQvLyB0cnVlIGludGVyc2VjdGlvbiBsZWZ0IG9mIGluUHRcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gcGFyYWxsZWwgb3IgY29sbGluZWFyXG5cdFx0XHRcdFx0aWYgKCBpblB0LnkgIT09IGVkZ2VMb3dQdC55ICkgXHRcdGNvbnRpbnVlO1x0XHRcdC8vIHBhcmFsbGVsXG5cdFx0XHRcdFx0Ly8gZWRnZSBsaWVzIG9uIHRoZSBzYW1lIGhvcml6b250YWwgbGluZSBhcyBpblB0XG5cdFx0XHRcdFx0aWYgKCAoICggZWRnZUhpZ2hQdC54IDw9IGluUHQueCApICYmICggaW5QdC54IDw9IGVkZ2VMb3dQdC54ICkgKSB8fFxuXHRcdFx0XHRcdFx0ICggKCBlZGdlTG93UHQueCA8PSBpblB0LnggKSAmJiAoIGluUHQueCA8PSBlZGdlSGlnaFB0LnggKSApIClcdFx0cmV0dXJuXHR0cnVlO1x0Ly8gaW5QdDogUG9pbnQgb24gY29udG91ciAhXG5cdFx0XHRcdFx0Ly8gY29udGludWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVyblx0aW5zaWRlO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGlzQ2xvY2tXaXNlID0gU2hhcGVVdGlscy5pc0Nsb2NrV2lzZTtcblxuXHRcdHZhciBzdWJQYXRocyA9IHRoaXMuc3ViUGF0aHM7XG5cdFx0aWYgKCBzdWJQYXRocy5sZW5ndGggPT09IDAgKSByZXR1cm4gW107XG5cblx0XHRpZiAoIG5vSG9sZXMgPT09IHRydWUgKVx0cmV0dXJuXHR0b1NoYXBlc05vSG9sZXMoIHN1YlBhdGhzICk7XG5cblxuXHRcdHZhciBzb2xpZCwgdG1wUGF0aCwgdG1wU2hhcGUsIHNoYXBlcyA9IFtdO1xuXG5cdFx0aWYgKCBzdWJQYXRocy5sZW5ndGggPT09IDEgKSB7XG5cblx0XHRcdHRtcFBhdGggPSBzdWJQYXRoc1sgMCBdO1xuXHRcdFx0dG1wU2hhcGUgPSBuZXcgU2hhcGUoKTtcblx0XHRcdHRtcFNoYXBlLmN1cnZlcyA9IHRtcFBhdGguY3VydmVzO1xuXHRcdFx0c2hhcGVzLnB1c2goIHRtcFNoYXBlICk7XG5cdFx0XHRyZXR1cm4gc2hhcGVzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGhvbGVzRmlyc3QgPSAhIGlzQ2xvY2tXaXNlKCBzdWJQYXRoc1sgMCBdLmdldFBvaW50cygpICk7XG5cdFx0aG9sZXNGaXJzdCA9IGlzQ0NXID8gISBob2xlc0ZpcnN0IDogaG9sZXNGaXJzdDtcblxuXHRcdC8vIGNvbnNvbGUubG9nKFwiSG9sZXMgZmlyc3RcIiwgaG9sZXNGaXJzdCk7XG5cblx0XHR2YXIgYmV0dGVyU2hhcGVIb2xlcyA9IFtdO1xuXHRcdHZhciBuZXdTaGFwZXMgPSBbXTtcblx0XHR2YXIgbmV3U2hhcGVIb2xlcyA9IFtdO1xuXHRcdHZhciBtYWluSWR4ID0gMDtcblx0XHR2YXIgdG1wUG9pbnRzO1xuXG5cdFx0bmV3U2hhcGVzWyBtYWluSWR4IF0gPSB1bmRlZmluZWQ7XG5cdFx0bmV3U2hhcGVIb2xlc1sgbWFpbklkeCBdID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBzdWJQYXRocy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR0bXBQYXRoID0gc3ViUGF0aHNbIGkgXTtcblx0XHRcdHRtcFBvaW50cyA9IHRtcFBhdGguZ2V0UG9pbnRzKCk7XG5cdFx0XHRzb2xpZCA9IGlzQ2xvY2tXaXNlKCB0bXBQb2ludHMgKTtcblx0XHRcdHNvbGlkID0gaXNDQ1cgPyAhIHNvbGlkIDogc29saWQ7XG5cblx0XHRcdGlmICggc29saWQgKSB7XG5cblx0XHRcdFx0aWYgKCAoICEgaG9sZXNGaXJzdCApICYmICggbmV3U2hhcGVzWyBtYWluSWR4IF0gKSApXHRtYWluSWR4ICsrO1xuXG5cdFx0XHRcdG5ld1NoYXBlc1sgbWFpbklkeCBdID0geyBzOiBuZXcgU2hhcGUoKSwgcDogdG1wUG9pbnRzIH07XG5cdFx0XHRcdG5ld1NoYXBlc1sgbWFpbklkeCBdLnMuY3VydmVzID0gdG1wUGF0aC5jdXJ2ZXM7XG5cblx0XHRcdFx0aWYgKCBob2xlc0ZpcnN0IClcdG1haW5JZHggKys7XG5cdFx0XHRcdG5ld1NoYXBlSG9sZXNbIG1haW5JZHggXSA9IFtdO1xuXG5cdFx0XHRcdC8vY29uc29sZS5sb2coJ2N3JywgaSk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0bmV3U2hhcGVIb2xlc1sgbWFpbklkeCBdLnB1c2goIHsgaDogdG1wUGF0aCwgcDogdG1wUG9pbnRzWyAwIF0gfSApO1xuXG5cdFx0XHRcdC8vY29uc29sZS5sb2coJ2NjdycsIGkpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBvbmx5IEhvbGVzPyAtPiBwcm9iYWJseSBhbGwgU2hhcGVzIHdpdGggd3Jvbmcgb3JpZW50YXRpb25cblx0XHRpZiAoICEgbmV3U2hhcGVzWyAwIF0gKVx0cmV0dXJuXHR0b1NoYXBlc05vSG9sZXMoIHN1YlBhdGhzICk7XG5cblxuXHRcdGlmICggbmV3U2hhcGVzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdHZhciBhbWJpZ3VvdXMgPSBmYWxzZTtcblx0XHRcdHZhciB0b0NoYW5nZSA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgc0lkeCA9IDAsIHNMZW4gPSBuZXdTaGFwZXMubGVuZ3RoOyBzSWR4IDwgc0xlbjsgc0lkeCArKyApIHtcblxuXHRcdFx0XHRiZXR0ZXJTaGFwZUhvbGVzWyBzSWR4IF0gPSBbXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCB2YXIgc0lkeCA9IDAsIHNMZW4gPSBuZXdTaGFwZXMubGVuZ3RoOyBzSWR4IDwgc0xlbjsgc0lkeCArKyApIHtcblxuXHRcdFx0XHR2YXIgc2hvID0gbmV3U2hhcGVIb2xlc1sgc0lkeCBdO1xuXG5cdFx0XHRcdGZvciAoIHZhciBoSWR4ID0gMDsgaElkeCA8IHNoby5sZW5ndGg7IGhJZHggKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgaG8gPSBzaG9bIGhJZHggXTtcblx0XHRcdFx0XHR2YXIgaG9sZV91bmFzc2lnbmVkID0gdHJ1ZTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBzMklkeCA9IDA7IHMySWR4IDwgbmV3U2hhcGVzLmxlbmd0aDsgczJJZHggKysgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggaXNQb2ludEluc2lkZVBvbHlnb24oIGhvLnAsIG5ld1NoYXBlc1sgczJJZHggXS5wICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBzSWR4ICE9PSBzMklkeCApXHR0b0NoYW5nZS5wdXNoKCB7IGZyb21zOiBzSWR4LCB0b3M6IHMySWR4LCBob2xlOiBoSWR4IH0gKTtcblx0XHRcdFx0XHRcdFx0aWYgKCBob2xlX3VuYXNzaWduZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRob2xlX3VuYXNzaWduZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRiZXR0ZXJTaGFwZUhvbGVzWyBzMklkeCBdLnB1c2goIGhvICk7XG5cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRcdGFtYmlndW91cyA9IHRydWU7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBob2xlX3VuYXNzaWduZWQgKSB7XG5cblx0XHRcdFx0XHRcdGJldHRlclNoYXBlSG9sZXNbIHNJZHggXS5wdXNoKCBobyApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXHRcdFx0Ly8gY29uc29sZS5sb2coXCJhbWJpZ3VvdXM6IFwiLCBhbWJpZ3VvdXMpO1xuXHRcdFx0aWYgKCB0b0NoYW5nZS5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKFwidG8gY2hhbmdlOiBcIiwgdG9DaGFuZ2UpO1xuXHRcdFx0XHRpZiAoICEgYW1iaWd1b3VzIClcdG5ld1NoYXBlSG9sZXMgPSBiZXR0ZXJTaGFwZUhvbGVzO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgdG1wSG9sZXM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gbmV3U2hhcGVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0bXBTaGFwZSA9IG5ld1NoYXBlc1sgaSBdLnM7XG5cdFx0XHRzaGFwZXMucHVzaCggdG1wU2hhcGUgKTtcblx0XHRcdHRtcEhvbGVzID0gbmV3U2hhcGVIb2xlc1sgaSBdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gdG1wSG9sZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0dG1wU2hhcGUuaG9sZXMucHVzaCggdG1wSG9sZXNbIGogXS5oICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vY29uc29sZS5sb2coXCJzaGFwZVwiLCBzaGFwZXMpO1xuXG5cdFx0cmV0dXJuIHNoYXBlcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEZvbnQoIGRhdGEgKSB7XG5cblx0dGhpcy5kYXRhID0gZGF0YTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBGb250LnByb3RvdHlwZSwge1xuXG5cdGlzRm9udDogdHJ1ZSxcblxuXHRnZW5lcmF0ZVNoYXBlczogZnVuY3Rpb24gKCB0ZXh0LCBzaXplLCBkaXZpc2lvbnMgKSB7XG5cblx0XHRmdW5jdGlvbiBjcmVhdGVQYXRocyggdGV4dCApIHtcblxuXHRcdFx0dmFyIGNoYXJzID0gU3RyaW5nKCB0ZXh0ICkuc3BsaXQoICcnICk7XG5cdFx0XHR2YXIgc2NhbGUgPSBzaXplIC8gZGF0YS5yZXNvbHV0aW9uO1xuXHRcdFx0dmFyIGxpbmVfaGVpZ2h0ID0gKCBkYXRhLmJvdW5kaW5nQm94LnlNYXggLSBkYXRhLmJvdW5kaW5nQm94LnlNaW4gKyBkYXRhLnVuZGVybGluZVRoaWNrbmVzcyApICogc2NhbGU7XG5cblx0XHRcdHZhciBvZmZzZXRYID0gMCwgb2Zmc2V0WSA9IDA7XG5cblx0XHRcdHZhciBwYXRocyA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGNoYXIgPSBjaGFyc1sgaSBdO1xuXG5cdFx0XHRcdGlmICggY2hhciA9PT0gJ1xcbicgKSB7XG5cblx0XHRcdFx0XHRvZmZzZXRYID0gMDtcblx0XHRcdFx0XHRvZmZzZXRZIC09IGxpbmVfaGVpZ2h0O1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR2YXIgcmV0ID0gY3JlYXRlUGF0aCggY2hhciwgc2NhbGUsIG9mZnNldFgsIG9mZnNldFkgKTtcblx0XHRcdFx0XHRvZmZzZXRYICs9IHJldC5vZmZzZXRYO1xuXHRcdFx0XHRcdHBhdGhzLnB1c2goIHJldC5wYXRoICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBwYXRocztcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGNyZWF0ZVBhdGgoIGMsIHNjYWxlLCBvZmZzZXRYLCBvZmZzZXRZICkge1xuXG5cdFx0XHR2YXIgZ2x5cGggPSBkYXRhLmdseXBoc1sgYyBdIHx8IGRhdGEuZ2x5cGhzWyAnPycgXTtcblxuXHRcdFx0aWYgKCAhIGdseXBoICkgcmV0dXJuO1xuXG5cdFx0XHR2YXIgcGF0aCA9IG5ldyBTaGFwZVBhdGgoKTtcblxuXHRcdFx0dmFyIHB0cyA9IFtdO1xuXHRcdFx0dmFyIHgsIHksIGNweCwgY3B5LCBjcHgwLCBjcHkwLCBjcHgxLCBjcHkxLCBjcHgyLCBjcHkyLCBsYXN0ZTtcblxuXHRcdFx0aWYgKCBnbHlwaC5vICkge1xuXG5cdFx0XHRcdHZhciBvdXRsaW5lID0gZ2x5cGguX2NhY2hlZE91dGxpbmUgfHwgKCBnbHlwaC5fY2FjaGVkT3V0bGluZSA9IGdseXBoLm8uc3BsaXQoICcgJyApICk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gb3V0bGluZS5sZW5ndGg7IGkgPCBsOyApIHtcblxuXHRcdFx0XHRcdHZhciBhY3Rpb24gPSBvdXRsaW5lWyBpICsrIF07XG5cblx0XHRcdFx0XHRzd2l0Y2ggKCBhY3Rpb24gKSB7XG5cblx0XHRcdFx0XHRcdGNhc2UgJ20nOiAvLyBtb3ZlVG9cblxuXHRcdFx0XHRcdFx0XHR4ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdFx0XHR5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXG5cdFx0XHRcdFx0XHRcdHBhdGgubW92ZVRvKCB4LCB5ICk7XG5cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdGNhc2UgJ2wnOiAvLyBsaW5lVG9cblxuXHRcdFx0XHRcdFx0XHR4ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdFx0XHR5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXG5cdFx0XHRcdFx0XHRcdHBhdGgubGluZVRvKCB4LCB5ICk7XG5cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdGNhc2UgJ3EnOiAvLyBxdWFkcmF0aWNDdXJ2ZVRvXG5cblx0XHRcdFx0XHRcdFx0Y3B4ICA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0XHRcdFx0XHRcdFx0Y3B5ICA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblx0XHRcdFx0XHRcdFx0Y3B4MSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0XHRcdFx0XHRcdFx0Y3B5MSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblxuXHRcdFx0XHRcdFx0XHRwYXRoLnF1YWRyYXRpY0N1cnZlVG8oIGNweDEsIGNweTEsIGNweCwgY3B5ICk7XG5cblx0XHRcdFx0XHRcdFx0bGFzdGUgPSBwdHNbIHB0cy5sZW5ndGggLSAxIF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBsYXN0ZSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGNweDAgPSBsYXN0ZS54O1xuXHRcdFx0XHRcdFx0XHRcdGNweTAgPSBsYXN0ZS55O1xuXG5cdFx0XHRcdFx0XHRcdFx0Zm9yICggdmFyIGkyID0gMTsgaTIgPD0gZGl2aXNpb25zOyBpMiArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIHQgPSBpMiAvIGRpdmlzaW9ucztcblx0XHRcdFx0XHRcdFx0XHRcdFF1YWRyYXRpY0JlemllciggdCwgY3B4MCwgY3B4MSwgY3B4ICk7XG5cdFx0XHRcdFx0XHRcdFx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIGNweTAsIGNweTEsIGNweSApO1xuXG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0Y2FzZSAnYic6IC8vIGJlemllckN1cnZlVG9cblxuXHRcdFx0XHRcdFx0XHRjcHggID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdFx0XHRjcHkgID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXHRcdFx0XHRcdFx0XHRjcHgxID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdFx0XHRjcHkxID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXHRcdFx0XHRcdFx0XHRjcHgyID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdFx0XHRjcHkyID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXG5cdFx0XHRcdFx0XHRcdHBhdGguYmV6aWVyQ3VydmVUbyggY3B4MSwgY3B5MSwgY3B4MiwgY3B5MiwgY3B4LCBjcHkgKTtcblxuXHRcdFx0XHRcdFx0XHRsYXN0ZSA9IHB0c1sgcHRzLmxlbmd0aCAtIDEgXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGxhc3RlICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Y3B4MCA9IGxhc3RlLng7XG5cdFx0XHRcdFx0XHRcdFx0Y3B5MCA9IGxhc3RlLnk7XG5cblx0XHRcdFx0XHRcdFx0XHRmb3IgKCB2YXIgaTIgPSAxOyBpMiA8PSBkaXZpc2lvbnM7IGkyICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgdCA9IGkyIC8gZGl2aXNpb25zO1xuXHRcdFx0XHRcdFx0XHRcdFx0Q3ViaWNCZXppZXIoIHQsIGNweDAsIGNweDEsIGNweDIsIGNweCApO1xuXHRcdFx0XHRcdFx0XHRcdFx0Q3ViaWNCZXppZXIoIHQsIGNweTAsIGNweTEsIGNweTIsIGNweSApO1xuXG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHsgb2Zmc2V0WDogZ2x5cGguaGEgKiBzY2FsZSwgcGF0aDogcGF0aCB9O1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGlmICggc2l6ZSA9PT0gdW5kZWZpbmVkICkgc2l6ZSA9IDEwMDtcblx0XHRpZiAoIGRpdmlzaW9ucyA9PT0gdW5kZWZpbmVkICkgZGl2aXNpb25zID0gNDtcblxuXHRcdHZhciBkYXRhID0gdGhpcy5kYXRhO1xuXG5cdFx0dmFyIHBhdGhzID0gY3JlYXRlUGF0aHMoIHRleHQgKTtcblx0XHR2YXIgc2hhcGVzID0gW107XG5cblx0XHRmb3IgKCB2YXIgcCA9IDAsIHBsID0gcGF0aHMubGVuZ3RoOyBwIDwgcGw7IHAgKysgKSB7XG5cblx0XHRcdEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KCBzaGFwZXMsIHBhdGhzWyBwIF0udG9TaGFwZXMoKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNoYXBlcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEZvbnRMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRm9udExvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkge1xuXG5cdFx0XHR2YXIganNvbjtcblxuXHRcdFx0dHJ5IHtcblxuXHRcdFx0XHRqc29uID0gSlNPTi5wYXJzZSggdGV4dCApO1xuXG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Gb250TG9hZGVyOiB0eXBlZmFjZS5qcyBzdXBwb3J0IGlzIGJlaW5nIGRlcHJlY2F0ZWQuIFVzZSB0eXBlZmFjZS5qc29uIGluc3RlYWQuJyApO1xuXHRcdFx0XHRqc29uID0gSlNPTi5wYXJzZSggdGV4dC5zdWJzdHJpbmcoIDY1LCB0ZXh0Lmxlbmd0aCAtIDIgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBmb250ID0gc2NvcGUucGFyc2UoIGpzb24gKTtcblxuXHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIGZvbnQgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHR9LFxuXG5cdHBhcnNlOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHRyZXR1cm4gbmV3IEZvbnQoIGpzb24gKTtcblxuXHR9XG5cbn0gKTtcblxudmFyIGNvbnRleHQ7XG5cbnZhciBBdWRpb0NvbnRleHQgPSB7XG5cblx0Z2V0Q29udGV4dDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCBjb250ZXh0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnRleHQgPSBuZXcgKCB3aW5kb3cuQXVkaW9Db250ZXh0IHx8IHdpbmRvdy53ZWJraXRBdWRpb0NvbnRleHQgKSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbnRleHQ7XG5cblx0fSxcblxuXHRzZXRDb250ZXh0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0Y29udGV4dCA9IHZhbHVlO1xuXG5cdH1cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIFJlZWNlIEFhcm9uIExlY3JpdmFpbiAvIGh0dHA6Ly9yZWVjZW5vdGVzLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBBdWRpb0xvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxufVxuXG5PYmplY3QuYXNzaWduKCBBdWRpb0xvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0UmVzcG9uc2VUeXBlKCAnYXJyYXlidWZmZXInICk7XG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBidWZmZXIgKSB7XG5cblx0XHRcdHZhciBjb250ZXh0ID0gQXVkaW9Db250ZXh0LmdldENvbnRleHQoKTtcblxuXHRcdFx0Y29udGV4dC5kZWNvZGVBdWRpb0RhdGEoIGJ1ZmZlciwgZnVuY3Rpb24gKCBhdWRpb0J1ZmZlciApIHtcblxuXHRcdFx0XHRvbkxvYWQoIGF1ZGlvQnVmZmVyICk7XG5cblx0XHRcdH0gKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFN0ZXJlb0NhbWVyYSgpIHtcblxuXHR0aGlzLnR5cGUgPSAnU3RlcmVvQ2FtZXJhJztcblxuXHR0aGlzLmFzcGVjdCA9IDE7XG5cblx0dGhpcy5leWVTZXAgPSAwLjA2NDtcblxuXHR0aGlzLmNhbWVyYUwgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTtcblx0dGhpcy5jYW1lcmFMLmxheWVycy5lbmFibGUoIDEgKTtcblx0dGhpcy5jYW1lcmFMLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLmNhbWVyYVIgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTtcblx0dGhpcy5jYW1lcmFSLmxheWVycy5lbmFibGUoIDIgKTtcblx0dGhpcy5jYW1lcmFSLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBTdGVyZW9DYW1lcmEucHJvdG90eXBlLCB7XG5cblx0dXBkYXRlOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpbnN0YW5jZSwgZm9jdXMsIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIsIHpvb20sIGV5ZVNlcDtcblxuXHRcdHZhciBleWVSaWdodCA9IG5ldyBNYXRyaXg0KCk7XG5cdFx0dmFyIGV5ZUxlZnQgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSggY2FtZXJhICkge1xuXG5cdFx0XHR2YXIgbmVlZHNVcGRhdGUgPSBpbnN0YW5jZSAhPT0gdGhpcyB8fCBmb2N1cyAhPT0gY2FtZXJhLmZvY3VzIHx8IGZvdiAhPT0gY2FtZXJhLmZvdiB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXNwZWN0ICE9PSBjYW1lcmEuYXNwZWN0ICogdGhpcy5hc3BlY3QgfHwgbmVhciAhPT0gY2FtZXJhLm5lYXIgfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZhciAhPT0gY2FtZXJhLmZhciB8fCB6b29tICE9PSBjYW1lcmEuem9vbSB8fCBleWVTZXAgIT09IHRoaXMuZXllU2VwO1xuXG5cdFx0XHRpZiAoIG5lZWRzVXBkYXRlICkge1xuXG5cdFx0XHRcdGluc3RhbmNlID0gdGhpcztcblx0XHRcdFx0Zm9jdXMgPSBjYW1lcmEuZm9jdXM7XG5cdFx0XHRcdGZvdiA9IGNhbWVyYS5mb3Y7XG5cdFx0XHRcdGFzcGVjdCA9IGNhbWVyYS5hc3BlY3QgKiB0aGlzLmFzcGVjdDtcblx0XHRcdFx0bmVhciA9IGNhbWVyYS5uZWFyO1xuXHRcdFx0XHRmYXIgPSBjYW1lcmEuZmFyO1xuXHRcdFx0XHR6b29tID0gY2FtZXJhLnpvb207XG5cblx0XHRcdFx0Ly8gT2ZmLWF4aXMgc3RlcmVvc2NvcGljIGVmZmVjdCBiYXNlZCBvblxuXHRcdFx0XHQvLyBodHRwOi8vcGF1bGJvdXJrZS5uZXQvc3RlcmVvZ3JhcGhpY3Mvc3RlcmVvcmVuZGVyL1xuXG5cdFx0XHRcdHZhciBwcm9qZWN0aW9uTWF0cml4ID0gY2FtZXJhLnByb2plY3Rpb25NYXRyaXguY2xvbmUoKTtcblx0XHRcdFx0ZXllU2VwID0gdGhpcy5leWVTZXAgLyAyO1xuXHRcdFx0XHR2YXIgZXllU2VwT25Qcm9qZWN0aW9uID0gZXllU2VwICogbmVhciAvIGZvY3VzO1xuXHRcdFx0XHR2YXIgeW1heCA9ICggbmVhciAqIE1hdGgudGFuKCBfTWF0aC5ERUcyUkFEICogZm92ICogMC41ICkgKSAvIHpvb207XG5cdFx0XHRcdHZhciB4bWluLCB4bWF4O1xuXG5cdFx0XHRcdC8vIHRyYW5zbGF0ZSB4T2Zmc2V0XG5cblx0XHRcdFx0ZXllTGVmdC5lbGVtZW50c1sgMTIgXSA9IC0gZXllU2VwO1xuXHRcdFx0XHRleWVSaWdodC5lbGVtZW50c1sgMTIgXSA9IGV5ZVNlcDtcblxuXHRcdFx0XHQvLyBmb3IgbGVmdCBleWVcblxuXHRcdFx0XHR4bWluID0gLSB5bWF4ICogYXNwZWN0ICsgZXllU2VwT25Qcm9qZWN0aW9uO1xuXHRcdFx0XHR4bWF4ID0geW1heCAqIGFzcGVjdCArIGV5ZVNlcE9uUHJvamVjdGlvbjtcblxuXHRcdFx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyAwIF0gPSAyICogbmVhciAvICggeG1heCAtIHhtaW4gKTtcblx0XHRcdFx0cHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgOCBdID0gKCB4bWF4ICsgeG1pbiApIC8gKCB4bWF4IC0geG1pbiApO1xuXG5cdFx0XHRcdHRoaXMuY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIHByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdFx0XHQvLyBmb3IgcmlnaHQgZXllXG5cblx0XHRcdFx0eG1pbiA9IC0geW1heCAqIGFzcGVjdCAtIGV5ZVNlcE9uUHJvamVjdGlvbjtcblx0XHRcdFx0eG1heCA9IHltYXggKiBhc3BlY3QgLSBleWVTZXBPblByb2plY3Rpb247XG5cblx0XHRcdFx0cHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgMCBdID0gMiAqIG5lYXIgLyAoIHhtYXggLSB4bWluICk7XG5cdFx0XHRcdHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDggXSA9ICggeG1heCArIHhtaW4gKSAvICggeG1heCAtIHhtaW4gKTtcblxuXHRcdFx0XHR0aGlzLmNhbWVyYVIucHJvamVjdGlvbk1hdHJpeC5jb3B5KCBwcm9qZWN0aW9uTWF0cml4ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5jYW1lcmFMLm1hdHJpeFdvcmxkLmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZCApLm11bHRpcGx5KCBleWVMZWZ0ICk7XG5cdFx0XHR0aGlzLmNhbWVyYVIubWF0cml4V29ybGQuY29weSggY2FtZXJhLm1hdHJpeFdvcmxkICkubXVsdGlwbHkoIGV5ZVJpZ2h0ICk7XG5cblx0XHR9O1xuXG5cdH0gKSgpXG5cbn0gKTtcblxuLyoqXG4gKiBDYW1lcmEgZm9yIHJlbmRlcmluZyBjdWJlIG1hcHNcbiAqXHQtIHJlbmRlcnMgc2NlbmUgaW50byBheGlzLWFsaWduZWQgY3ViZVxuICpcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gQ3ViZUNhbWVyYSggbmVhciwgZmFyLCBjdWJlUmVzb2x1dGlvbiApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0N1YmVDYW1lcmEnO1xuXG5cdHZhciBmb3YgPSA5MCwgYXNwZWN0ID0gMTtcblxuXHR2YXIgY2FtZXJhUFggPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcblx0Y2FtZXJhUFgudXAuc2V0KCAwLCAtIDEsIDAgKTtcblx0Y2FtZXJhUFgubG9va0F0KCBuZXcgVmVjdG9yMyggMSwgMCwgMCApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFQWCApO1xuXG5cdHZhciBjYW1lcmFOWCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFOWC51cC5zZXQoIDAsIC0gMSwgMCApO1xuXHRjYW1lcmFOWC5sb29rQXQoIG5ldyBWZWN0b3IzKCAtIDEsIDAsIDAgKSApO1xuXHR0aGlzLmFkZCggY2FtZXJhTlggKTtcblxuXHR2YXIgY2FtZXJhUFkgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcblx0Y2FtZXJhUFkudXAuc2V0KCAwLCAwLCAxICk7XG5cdGNhbWVyYVBZLmxvb2tBdCggbmV3IFZlY3RvcjMoIDAsIDEsIDAgKSApO1xuXHR0aGlzLmFkZCggY2FtZXJhUFkgKTtcblxuXHR2YXIgY2FtZXJhTlkgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcblx0Y2FtZXJhTlkudXAuc2V0KCAwLCAwLCAtIDEgKTtcblx0Y2FtZXJhTlkubG9va0F0KCBuZXcgVmVjdG9yMyggMCwgLSAxLCAwICkgKTtcblx0dGhpcy5hZGQoIGNhbWVyYU5ZICk7XG5cblx0dmFyIGNhbWVyYVBaID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdGNhbWVyYVBaLnVwLnNldCggMCwgLSAxLCAwICk7XG5cdGNhbWVyYVBaLmxvb2tBdCggbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSApO1xuXHR0aGlzLmFkZCggY2FtZXJhUFogKTtcblxuXHR2YXIgY2FtZXJhTlogPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcblx0Y2FtZXJhTloudXAuc2V0KCAwLCAtIDEsIDAgKTtcblx0Y2FtZXJhTloubG9va0F0KCBuZXcgVmVjdG9yMyggMCwgMCwgLSAxICkgKTtcblx0dGhpcy5hZGQoIGNhbWVyYU5aICk7XG5cblx0dmFyIG9wdGlvbnMgPSB7IGZvcm1hdDogUkdCRm9ybWF0LCBtYWdGaWx0ZXI6IExpbmVhckZpbHRlciwgbWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIgfTtcblxuXHR0aGlzLnJlbmRlclRhcmdldCA9IG5ldyBXZWJHTFJlbmRlclRhcmdldEN1YmUoIGN1YmVSZXNvbHV0aW9uLCBjdWJlUmVzb2x1dGlvbiwgb3B0aW9ucyApO1xuXHR0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLm5hbWUgPSBcIkN1YmVDYW1lcmFcIjtcblxuXHR0aGlzLnVwZGF0ZUN1YmVNYXAgPSBmdW5jdGlvbiAoIHJlbmRlcmVyLCBzY2VuZSApIHtcblxuXHRcdGlmICggdGhpcy5wYXJlbnQgPT09IG51bGwgKSB0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHR2YXIgcmVuZGVyVGFyZ2V0ID0gdGhpcy5yZW5kZXJUYXJnZXQ7XG5cdFx0dmFyIGdlbmVyYXRlTWlwbWFwcyA9IHJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztcblxuXHRcdHJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gMDtcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFQWCwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgPSAxO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5YLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDI7XG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhUFksIHJlbmRlclRhcmdldCApO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gMztcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFOWSwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgPSA0O1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYVBaLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdHJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGdlbmVyYXRlTWlwbWFwcztcblxuXHRcdHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDU7XG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhTlosIHJlbmRlclRhcmdldCApO1xuXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBudWxsICk7XG5cblx0fTtcblxufVxuXG5DdWJlQ2FtZXJhLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApO1xuQ3ViZUNhbWVyYS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDdWJlQ2FtZXJhO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQXJyYXlDYW1lcmEoIGFycmF5ICkge1xuXG5cdFBlcnNwZWN0aXZlQ2FtZXJhLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblx0dGhpcy5jYW1lcmFzID0gYXJyYXkgfHwgW107XG5cbn1cblxuQXJyYXlDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggUGVyc3BlY3RpdmVDYW1lcmEucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQXJyYXlDYW1lcmEsXG5cblx0aXNBcnJheUNhbWVyYTogdHJ1ZVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBBdWRpb0xpc3RlbmVyKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQXVkaW9MaXN0ZW5lcic7XG5cblx0dGhpcy5jb250ZXh0ID0gQXVkaW9Db250ZXh0LmdldENvbnRleHQoKTtcblxuXHR0aGlzLmdhaW4gPSB0aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpO1xuXHR0aGlzLmdhaW4uY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cblx0dGhpcy5maWx0ZXIgPSBudWxsO1xuXG59XG5cbkF1ZGlvTGlzdGVuZXIucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQXVkaW9MaXN0ZW5lcixcblxuXHRnZXRJbnB1dDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2FpbjtcblxuXHR9LFxuXG5cdHJlbW92ZUZpbHRlcjogZnVuY3Rpb24gKCApIHtcblxuXHRcdGlmICggdGhpcy5maWx0ZXIgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuZ2Fpbi5kaXNjb25uZWN0KCB0aGlzLmZpbHRlciApO1xuXHRcdFx0dGhpcy5maWx0ZXIuZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cdFx0XHR0aGlzLmdhaW4uY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cdFx0XHR0aGlzLmZpbHRlciA9IG51bGw7XG5cblx0XHR9XG5cblx0fSxcblxuXHRnZXRGaWx0ZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmZpbHRlcjtcblxuXHR9LFxuXG5cdHNldEZpbHRlcjogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdGhpcy5maWx0ZXIgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuZ2Fpbi5kaXNjb25uZWN0KCB0aGlzLmZpbHRlciApO1xuXHRcdFx0dGhpcy5maWx0ZXIuZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmdhaW4uZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmZpbHRlciA9IHZhbHVlO1xuXHRcdHRoaXMuZ2Fpbi5jb25uZWN0KCB0aGlzLmZpbHRlciApO1xuXHRcdHRoaXMuZmlsdGVyLmNvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXG5cdH0sXG5cblx0Z2V0TWFzdGVyVm9sdW1lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nYWluLmdhaW4udmFsdWU7XG5cblx0fSxcblxuXHRzZXRNYXN0ZXJWb2x1bWU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmdhaW4uZ2Fpbi52YWx1ZSA9IHZhbHVlO1xuXG5cdH0sXG5cblx0dXBkYXRlTWF0cml4V29ybGQ6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cdFx0dmFyIHNjYWxlID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBvcmllbnRhdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICkge1xuXG5cdFx0XHRPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxuXHRcdFx0dmFyIGxpc3RlbmVyID0gdGhpcy5jb250ZXh0Lmxpc3RlbmVyO1xuXHRcdFx0dmFyIHVwID0gdGhpcy51cDtcblxuXHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBzY2FsZSApO1xuXG5cdFx0XHRvcmllbnRhdGlvbi5zZXQoIDAsIDAsIC0gMSApLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApO1xuXG5cdFx0XHRpZiAoIGxpc3RlbmVyLnBvc2l0aW9uWCApIHtcblxuXHRcdFx0XHRsaXN0ZW5lci5wb3NpdGlvblguc2V0VmFsdWVBdFRpbWUoIHBvc2l0aW9uLngsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXHRcdFx0XHRsaXN0ZW5lci5wb3NpdGlvblkuc2V0VmFsdWVBdFRpbWUoIHBvc2l0aW9uLnksIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXHRcdFx0XHRsaXN0ZW5lci5wb3NpdGlvblouc2V0VmFsdWVBdFRpbWUoIHBvc2l0aW9uLnosIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXHRcdFx0XHRsaXN0ZW5lci5mb3J3YXJkWC5zZXRWYWx1ZUF0VGltZSggb3JpZW50YXRpb24ueCwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7XG5cdFx0XHRcdGxpc3RlbmVyLmZvcndhcmRZLnNldFZhbHVlQXRUaW1lKCBvcmllbnRhdGlvbi55LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIuZm9yd2FyZFouc2V0VmFsdWVBdFRpbWUoIG9yaWVudGF0aW9uLnosIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXHRcdFx0XHRsaXN0ZW5lci51cFguc2V0VmFsdWVBdFRpbWUoIHVwLngsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXHRcdFx0XHRsaXN0ZW5lci51cFkuc2V0VmFsdWVBdFRpbWUoIHVwLnksIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXHRcdFx0XHRsaXN0ZW5lci51cFouc2V0VmFsdWVBdFRpbWUoIHVwLnosIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGxpc3RlbmVyLnNldFBvc2l0aW9uKCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56ICk7XG5cdFx0XHRcdGxpc3RlbmVyLnNldE9yaWVudGF0aW9uKCBvcmllbnRhdGlvbi54LCBvcmllbnRhdGlvbi55LCBvcmllbnRhdGlvbi56LCB1cC54LCB1cC55LCB1cC56ICk7XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSApKClcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIFJlZWNlIEFhcm9uIExlY3JpdmFpbiAvIGh0dHA6Ly9yZWVjZW5vdGVzLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBBdWRpbyggbGlzdGVuZXIgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdBdWRpbyc7XG5cblx0dGhpcy5jb250ZXh0ID0gbGlzdGVuZXIuY29udGV4dDtcblxuXHR0aGlzLmdhaW4gPSB0aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpO1xuXHR0aGlzLmdhaW4uY29ubmVjdCggbGlzdGVuZXIuZ2V0SW5wdXQoKSApO1xuXG5cdHRoaXMuYXV0b3BsYXkgPSBmYWxzZTtcblxuXHR0aGlzLmJ1ZmZlciA9IG51bGw7XG5cdHRoaXMubG9vcCA9IGZhbHNlO1xuXHR0aGlzLnN0YXJ0VGltZSA9IDA7XG5cdHRoaXMucGxheWJhY2tSYXRlID0gMTtcblx0dGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcblx0dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPSB0cnVlO1xuXHR0aGlzLnNvdXJjZVR5cGUgPSAnZW1wdHknO1xuXG5cdHRoaXMuZmlsdGVycyA9IFtdO1xuXG59XG5cbkF1ZGlvLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEF1ZGlvLFxuXG5cdGdldE91dHB1dDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2FpbjtcblxuXHR9LFxuXG5cdHNldE5vZGVTb3VyY2U6IGZ1bmN0aW9uICggYXVkaW9Ob2RlICkge1xuXG5cdFx0dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPSBmYWxzZTtcblx0XHR0aGlzLnNvdXJjZVR5cGUgPSAnYXVkaW9Ob2RlJztcblx0XHR0aGlzLnNvdXJjZSA9IGF1ZGlvTm9kZTtcblx0XHR0aGlzLmNvbm5lY3QoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0QnVmZmVyOiBmdW5jdGlvbiAoIGF1ZGlvQnVmZmVyICkge1xuXG5cdFx0dGhpcy5idWZmZXIgPSBhdWRpb0J1ZmZlcjtcblx0XHR0aGlzLnNvdXJjZVR5cGUgPSAnYnVmZmVyJztcblxuXHRcdGlmICggdGhpcy5hdXRvcGxheSApIHRoaXMucGxheSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRwbGF5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogQXVkaW8gaXMgYWxyZWFkeSBwbGF5aW5nLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR2YXIgc291cmNlID0gdGhpcy5jb250ZXh0LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO1xuXG5cdFx0c291cmNlLmJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuXHRcdHNvdXJjZS5sb29wID0gdGhpcy5sb29wO1xuXHRcdHNvdXJjZS5vbmVuZGVkID0gdGhpcy5vbkVuZGVkLmJpbmQoIHRoaXMgKTtcblx0XHRzb3VyY2UucGxheWJhY2tSYXRlLnNldFZhbHVlQXRUaW1lKCB0aGlzLnBsYXliYWNrUmF0ZSwgdGhpcy5zdGFydFRpbWUgKTtcblx0XHRzb3VyY2Uuc3RhcnQoIDAsIHRoaXMuc3RhcnRUaW1lICk7XG5cblx0XHR0aGlzLmlzUGxheWluZyA9IHRydWU7XG5cblx0XHR0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblxuXHRcdHJldHVybiB0aGlzLmNvbm5lY3QoKTtcblxuXHR9LFxuXG5cdHBhdXNlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5zb3VyY2Uuc3RvcCgpO1xuXHRcdHRoaXMuc3RhcnRUaW1lID0gdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lO1xuXHRcdHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN0b3A6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR0aGlzLnNvdXJjZS5zdG9wKCk7XG5cdFx0dGhpcy5zdGFydFRpbWUgPSAwO1xuXHRcdHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbm5lY3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5maWx0ZXJzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHRoaXMuc291cmNlLmNvbm5lY3QoIHRoaXMuZmlsdGVyc1sgMCBdICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMSwgbCA9IHRoaXMuZmlsdGVycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHRoaXMuZmlsdGVyc1sgaSAtIDEgXS5jb25uZWN0KCB0aGlzLmZpbHRlcnNbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZmlsdGVyc1sgdGhpcy5maWx0ZXJzLmxlbmd0aCAtIDEgXS5jb25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLnNvdXJjZS5jb25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpc2Nvbm5lY3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5maWx0ZXJzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHRoaXMuc291cmNlLmRpc2Nvbm5lY3QoIHRoaXMuZmlsdGVyc1sgMCBdICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMSwgbCA9IHRoaXMuZmlsdGVycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHRoaXMuZmlsdGVyc1sgaSAtIDEgXS5kaXNjb25uZWN0KCB0aGlzLmZpbHRlcnNbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZmlsdGVyc1sgdGhpcy5maWx0ZXJzLmxlbmd0aCAtIDEgXS5kaXNjb25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLnNvdXJjZS5kaXNjb25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEZpbHRlcnM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmZpbHRlcnM7XG5cblx0fSxcblxuXHRzZXRGaWx0ZXJzOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCAhIHZhbHVlICkgdmFsdWUgPSBbXTtcblxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdHRoaXMuZGlzY29ubmVjdCgpO1xuXHRcdFx0dGhpcy5maWx0ZXJzID0gdmFsdWU7XG5cdFx0XHR0aGlzLmNvbm5lY3QoKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuZmlsdGVycyA9IHZhbHVlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRGaWx0ZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmdldEZpbHRlcnMoKVsgMCBdO1xuXG5cdH0sXG5cblx0c2V0RmlsdGVyOiBmdW5jdGlvbiAoIGZpbHRlciApIHtcblxuXHRcdHJldHVybiB0aGlzLnNldEZpbHRlcnMoIGZpbHRlciA/IFsgZmlsdGVyIF0gOiBbXSApO1xuXG5cdH0sXG5cblx0c2V0UGxheWJhY2tSYXRlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHRoaXMucGxheWJhY2tSYXRlID0gdmFsdWU7XG5cblx0XHRpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkge1xuXG5cdFx0XHR0aGlzLnNvdXJjZS5wbGF5YmFja1JhdGUuc2V0VmFsdWVBdFRpbWUoIHRoaXMucGxheWJhY2tSYXRlLCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0UGxheWJhY2tSYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5wbGF5YmFja1JhdGU7XG5cblx0fSxcblxuXHRvbkVuZGVkOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuXG5cdH0sXG5cblx0Z2V0TG9vcDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmxvb3A7XG5cblx0fSxcblxuXHRzZXRMb29wOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHRoaXMubG9vcCA9IHZhbHVlO1xuXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UubG9vcCA9IHRoaXMubG9vcDtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0Vm9sdW1lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nYWluLmdhaW4udmFsdWU7XG5cblx0fSxcblx0XG5cdHNldFZvbHVtZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuZ2Fpbi5nYWluLnZhbHVlID0gdmFsdWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFBvc2l0aW9uYWxBdWRpbyggbGlzdGVuZXIgKSB7XG5cblx0QXVkaW8uY2FsbCggdGhpcywgbGlzdGVuZXIgKTtcblxuXHR0aGlzLnBhbm5lciA9IHRoaXMuY29udGV4dC5jcmVhdGVQYW5uZXIoKTtcblx0dGhpcy5wYW5uZXIuY29ubmVjdCggdGhpcy5nYWluICk7XG5cbn1cblxuUG9zaXRpb25hbEF1ZGlvLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEF1ZGlvLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFBvc2l0aW9uYWxBdWRpbyxcblxuXHRnZXRPdXRwdXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnBhbm5lcjtcblxuXHR9LFxuXG5cdGdldFJlZkRpc3RhbmNlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5wYW5uZXIucmVmRGlzdGFuY2U7XG5cblx0fSxcblxuXHRzZXRSZWZEaXN0YW5jZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGFubmVyLnJlZkRpc3RhbmNlID0gdmFsdWU7XG5cblx0fSxcblxuXHRnZXRSb2xsb2ZmRmFjdG9yOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5wYW5uZXIucm9sbG9mZkZhY3RvcjtcblxuXHR9LFxuXG5cdHNldFJvbGxvZmZGYWN0b3I6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhbm5lci5yb2xsb2ZmRmFjdG9yID0gdmFsdWU7XG5cblx0fSxcblxuXHRnZXREaXN0YW5jZU1vZGVsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbDtcblxuXHR9LFxuXG5cdHNldERpc3RhbmNlTW9kZWw6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsID0gdmFsdWU7XG5cblx0fSxcblxuXHRnZXRNYXhEaXN0YW5jZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLm1heERpc3RhbmNlO1xuXG5cdH0sXG5cblx0c2V0TWF4RGlzdGFuY2U6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhbm5lci5tYXhEaXN0YW5jZSA9IHZhbHVlO1xuXG5cdH0sXG5cblx0dXBkYXRlTWF0cml4V29ybGQ6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB1cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKSB7XG5cblx0XHRcdE9iamVjdDNELnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3JjZSApO1xuXG5cdFx0XHRwb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHRcdFx0dGhpcy5wYW5uZXIuc2V0UG9zaXRpb24oIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnogKTtcblxuXHRcdH07XG5cblx0fSApKClcblxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBBdWRpb0FuYWx5c2VyKCBhdWRpbywgZmZ0U2l6ZSApIHtcblxuXHR0aGlzLmFuYWx5c2VyID0gYXVkaW8uY29udGV4dC5jcmVhdGVBbmFseXNlcigpO1xuXHR0aGlzLmFuYWx5c2VyLmZmdFNpemUgPSBmZnRTaXplICE9PSB1bmRlZmluZWQgPyBmZnRTaXplIDogMjA0ODtcblxuXHR0aGlzLmRhdGEgPSBuZXcgVWludDhBcnJheSggdGhpcy5hbmFseXNlci5mcmVxdWVuY3lCaW5Db3VudCApO1xuXG5cdGF1ZGlvLmdldE91dHB1dCgpLmNvbm5lY3QoIHRoaXMuYW5hbHlzZXIgKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBBdWRpb0FuYWx5c2VyLnByb3RvdHlwZSwge1xuXG5cdGdldEZyZXF1ZW5jeURhdGE6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuYW5hbHlzZXIuZ2V0Qnl0ZUZyZXF1ZW5jeURhdGEoIHRoaXMuZGF0YSApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZGF0YTtcblxuXHR9LFxuXG5cdGdldEF2ZXJhZ2VGcmVxdWVuY3k6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2YWx1ZSA9IDAsIGRhdGEgPSB0aGlzLmdldEZyZXF1ZW5jeURhdGEoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YWx1ZSArPSBkYXRhWyBpIF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsdWUgLyBkYXRhLmxlbmd0aDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKlxuICogQnVmZmVyZWQgc2NlbmUgZ3JhcGggcHJvcGVydHkgdGhhdCBhbGxvd3Mgd2VpZ2h0ZWQgYWNjdW11bGF0aW9uLlxuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gUHJvcGVydHlNaXhlciggYmluZGluZywgdHlwZU5hbWUsIHZhbHVlU2l6ZSApIHtcblxuXHR0aGlzLmJpbmRpbmcgPSBiaW5kaW5nO1xuXHR0aGlzLnZhbHVlU2l6ZSA9IHZhbHVlU2l6ZTtcblxuXHR2YXIgYnVmZmVyVHlwZSA9IEZsb2F0NjRBcnJheSxcblx0XHRtaXhGdW5jdGlvbjtcblxuXHRzd2l0Y2ggKCB0eXBlTmFtZSApIHtcblxuXHRcdGNhc2UgJ3F1YXRlcm5pb24nOlxuXHRcdFx0bWl4RnVuY3Rpb24gPSB0aGlzLl9zbGVycDtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAnc3RyaW5nJzpcblx0XHRjYXNlICdib29sJzpcblx0XHRcdGJ1ZmZlclR5cGUgPSBBcnJheTtcblx0XHRcdG1peEZ1bmN0aW9uID0gdGhpcy5fc2VsZWN0O1xuXHRcdFx0YnJlYWs7XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0bWl4RnVuY3Rpb24gPSB0aGlzLl9sZXJwO1xuXG5cdH1cblxuXHR0aGlzLmJ1ZmZlciA9IG5ldyBidWZmZXJUeXBlKCB2YWx1ZVNpemUgKiA0ICk7XG5cdC8vIGxheW91dDogWyBpbmNvbWluZyB8IGFjY3UwIHwgYWNjdTEgfCBvcmlnIF1cblx0Ly9cblx0Ly8gaW50ZXJwb2xhdG9ycyBjYW4gdXNlIC5idWZmZXIgYXMgdGhlaXIgLnJlc3VsdFxuXHQvLyB0aGUgZGF0YSB0aGVuIGdvZXMgdG8gJ2luY29taW5nJ1xuXHQvL1xuXHQvLyAnYWNjdTAnIGFuZCAnYWNjdTEnIGFyZSB1c2VkIGZyYW1lLWludGVybGVhdmVkIGZvclxuXHQvLyB0aGUgY3VtdWxhdGl2ZSByZXN1bHQgYW5kIGFyZSBjb21wYXJlZCB0byBkZXRlY3Rcblx0Ly8gY2hhbmdlc1xuXHQvL1xuXHQvLyAnb3JpZycgc3RvcmVzIHRoZSBvcmlnaW5hbCBzdGF0ZSBvZiB0aGUgcHJvcGVydHlcblxuXHR0aGlzLl9taXhCdWZmZXJSZWdpb24gPSBtaXhGdW5jdGlvbjtcblxuXHR0aGlzLmN1bXVsYXRpdmVXZWlnaHQgPSAwO1xuXG5cdHRoaXMudXNlQ291bnQgPSAwO1xuXHR0aGlzLnJlZmVyZW5jZUNvdW50ID0gMDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBQcm9wZXJ0eU1peGVyLnByb3RvdHlwZSwge1xuXG5cdC8vIGFjY3VtdWxhdGUgZGF0YSBpbiB0aGUgJ2luY29taW5nJyByZWdpb24gaW50byAnYWNjdTxpPidcblx0YWNjdW11bGF0ZTogZnVuY3Rpb24gKCBhY2N1SW5kZXgsIHdlaWdodCApIHtcblxuXHRcdC8vIG5vdGU6IGhhcHBpbHkgYWNjdW11bGF0aW5nIG5vdGhpbmcgd2hlbiB3ZWlnaHQgPSAwLCB0aGUgY2FsbGVyIGtub3dzXG5cdFx0Ly8gdGhlIHdlaWdodCBhbmQgc2hvdWxkbid0IGhhdmUgbWFkZSB0aGUgY2FsbCBpbiB0aGUgZmlyc3QgcGxhY2VcblxuXHRcdHZhciBidWZmZXIgPSB0aGlzLmJ1ZmZlcixcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxuXHRcdFx0b2Zmc2V0ID0gYWNjdUluZGV4ICogc3RyaWRlICsgc3RyaWRlLFxuXG5cdFx0XHRjdXJyZW50V2VpZ2h0ID0gdGhpcy5jdW11bGF0aXZlV2VpZ2h0O1xuXG5cdFx0aWYgKCBjdXJyZW50V2VpZ2h0ID09PSAwICkge1xuXG5cdFx0XHQvLyBhY2N1TiA6PSBpbmNvbWluZyAqIHdlaWdodFxuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcblxuXHRcdFx0XHRidWZmZXJbIG9mZnNldCArIGkgXSA9IGJ1ZmZlclsgaSBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGN1cnJlbnRXZWlnaHQgPSB3ZWlnaHQ7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBhY2N1TiA6PSBhY2N1TiArIGluY29taW5nICogd2VpZ2h0XG5cblx0XHRcdGN1cnJlbnRXZWlnaHQgKz0gd2VpZ2h0O1xuXHRcdFx0dmFyIG1peCA9IHdlaWdodCAvIGN1cnJlbnRXZWlnaHQ7XG5cdFx0XHR0aGlzLl9taXhCdWZmZXJSZWdpb24oIGJ1ZmZlciwgb2Zmc2V0LCAwLCBtaXgsIHN0cmlkZSApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gY3VycmVudFdlaWdodDtcblxuXHR9LFxuXG5cdC8vIGFwcGx5IHRoZSBzdGF0ZSBvZiAnYWNjdTxpPicgdG8gdGhlIGJpbmRpbmcgd2hlbiBhY2N1cyBkaWZmZXJcblx0YXBwbHk6IGZ1bmN0aW9uICggYWNjdUluZGV4ICkge1xuXG5cdFx0dmFyIHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxuXHRcdFx0YnVmZmVyID0gdGhpcy5idWZmZXIsXG5cdFx0XHRvZmZzZXQgPSBhY2N1SW5kZXggKiBzdHJpZGUgKyBzdHJpZGUsXG5cblx0XHRcdHdlaWdodCA9IHRoaXMuY3VtdWxhdGl2ZVdlaWdodCxcblxuXHRcdFx0YmluZGluZyA9IHRoaXMuYmluZGluZztcblxuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IDA7XG5cblx0XHRpZiAoIHdlaWdodCA8IDEgKSB7XG5cblx0XHRcdC8vIGFjY3VOIDo9IGFjY3VOICsgb3JpZ2luYWwgKiAoIDEgLSBjdW11bGF0aXZlV2VpZ2h0IClcblxuXHRcdFx0dmFyIG9yaWdpbmFsVmFsdWVPZmZzZXQgPSBzdHJpZGUgKiAzO1xuXG5cdFx0XHR0aGlzLl9taXhCdWZmZXJSZWdpb24oXG5cdFx0XHRcdGJ1ZmZlciwgb2Zmc2V0LCBvcmlnaW5hbFZhbHVlT2Zmc2V0LCAxIC0gd2VpZ2h0LCBzdHJpZGUgKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBpID0gc3RyaWRlLCBlID0gc3RyaWRlICsgc3RyaWRlOyBpICE9PSBlOyArKyBpICkge1xuXG5cdFx0XHRpZiAoIGJ1ZmZlclsgaSBdICE9PSBidWZmZXJbIGkgKyBzdHJpZGUgXSApIHtcblxuXHRcdFx0XHQvLyB2YWx1ZSBoYXMgY2hhbmdlZCAtPiB1cGRhdGUgc2NlbmUgZ3JhcGhcblxuXHRcdFx0XHRiaW5kaW5nLnNldFZhbHVlKCBidWZmZXIsIG9mZnNldCApO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0Ly8gcmVtZW1iZXIgdGhlIHN0YXRlIG9mIHRoZSBib3VuZCBwcm9wZXJ0eSBhbmQgY29weSBpdCB0byBib3RoIGFjY3VzXG5cdHNhdmVPcmlnaW5hbFN0YXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYmluZGluZyA9IHRoaXMuYmluZGluZztcblxuXHRcdHZhciBidWZmZXIgPSB0aGlzLmJ1ZmZlcixcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxuXG5cdFx0XHRvcmlnaW5hbFZhbHVlT2Zmc2V0ID0gc3RyaWRlICogMztcblxuXHRcdGJpbmRpbmcuZ2V0VmFsdWUoIGJ1ZmZlciwgb3JpZ2luYWxWYWx1ZU9mZnNldCApO1xuXG5cdFx0Ly8gYWNjdVswLi4xXSA6PSBvcmlnIC0tIGluaXRpYWxseSBkZXRlY3QgY2hhbmdlcyBhZ2FpbnN0IHRoZSBvcmlnaW5hbFxuXHRcdGZvciAoIHZhciBpID0gc3RyaWRlLCBlID0gb3JpZ2luYWxWYWx1ZU9mZnNldDsgaSAhPT0gZTsgKysgaSApIHtcblxuXHRcdFx0YnVmZmVyWyBpIF0gPSBidWZmZXJbIG9yaWdpbmFsVmFsdWVPZmZzZXQgKyAoIGkgJSBzdHJpZGUgKSBdO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gMDtcblxuXHR9LFxuXG5cdC8vIGFwcGx5IHRoZSBzdGF0ZSBwcmV2aW91c2x5IHRha2VuIHZpYSAnc2F2ZU9yaWdpbmFsU3RhdGUnIHRvIHRoZSBiaW5kaW5nXG5cdHJlc3RvcmVPcmlnaW5hbFN0YXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb3JpZ2luYWxWYWx1ZU9mZnNldCA9IHRoaXMudmFsdWVTaXplICogMztcblx0XHR0aGlzLmJpbmRpbmcuc2V0VmFsdWUoIHRoaXMuYnVmZmVyLCBvcmlnaW5hbFZhbHVlT2Zmc2V0ICk7XG5cblx0fSxcblxuXG5cdC8vIG1peCBmdW5jdGlvbnNcblxuXHRfc2VsZWN0OiBmdW5jdGlvbiAoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBzcmNPZmZzZXQsIHQsIHN0cmlkZSApIHtcblxuXHRcdGlmICggdCA+PSAwLjUgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHRcdGJ1ZmZlclsgZHN0T2Zmc2V0ICsgaSBdID0gYnVmZmVyWyBzcmNPZmZzZXQgKyBpIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdF9zbGVycDogZnVuY3Rpb24gKCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0ICkge1xuXG5cdFx0UXVhdGVybmlvbi5zbGVycEZsYXQoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBidWZmZXIsIGRzdE9mZnNldCwgYnVmZmVyLCBzcmNPZmZzZXQsIHQgKTtcblxuXHR9LFxuXG5cdF9sZXJwOiBmdW5jdGlvbiAoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBzcmNPZmZzZXQsIHQsIHN0cmlkZSApIHtcblxuXHRcdHZhciBzID0gMSAtIHQ7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcblxuXHRcdFx0dmFyIGogPSBkc3RPZmZzZXQgKyBpO1xuXG5cdFx0XHRidWZmZXJbIGogXSA9IGJ1ZmZlclsgaiBdICogcyArIGJ1ZmZlclsgc3JjT2Zmc2V0ICsgaSBdICogdDtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSByZWZlcmVuY2UgdG8gYSByZWFsIHByb3BlcnR5IGluIHRoZSBzY2VuZSBncmFwaC5cbiAqXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIENvbXBvc2l0ZSggdGFyZ2V0R3JvdXAsIHBhdGgsIG9wdGlvbmFsUGFyc2VkUGF0aCApIHtcblxuXHR2YXIgcGFyc2VkUGF0aCA9IG9wdGlvbmFsUGFyc2VkUGF0aCB8fCBQcm9wZXJ0eUJpbmRpbmcucGFyc2VUcmFja05hbWUoIHBhdGggKTtcblxuXHR0aGlzLl90YXJnZXRHcm91cCA9IHRhcmdldEdyb3VwO1xuXHR0aGlzLl9iaW5kaW5ncyA9IHRhcmdldEdyb3VwLnN1YnNjcmliZV8oIHBhdGgsIHBhcnNlZFBhdGggKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBDb21wb3NpdGUucHJvdG90eXBlLCB7XG5cblx0Z2V0VmFsdWU6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdHRoaXMuYmluZCgpOyAvLyBiaW5kIGFsbCBiaW5kaW5nXG5cblx0XHR2YXIgZmlyc3RWYWxpZEluZGV4ID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0YmluZGluZyA9IHRoaXMuX2JpbmRpbmdzWyBmaXJzdFZhbGlkSW5kZXggXTtcblxuXHRcdC8vIGFuZCBvbmx5IGNhbGwgLmdldFZhbHVlIG9uIHRoZSBmaXJzdFxuXHRcdGlmICggYmluZGluZyAhPT0gdW5kZWZpbmVkICkgYmluZGluZy5nZXRWYWx1ZSggYXJyYXksIG9mZnNldCApO1xuXG5cdH0sXG5cblx0c2V0VmFsdWU6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sXG5cdFx0XHRcdCAgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0YmluZGluZ3NbIGkgXS5zZXRWYWx1ZSggYXJyYXksIG9mZnNldCApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0YmluZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7XG5cblx0XHRmb3IgKCB2YXIgaSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdFx0ICBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRiaW5kaW5nc1sgaSBdLmJpbmQoKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHVuYmluZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7XG5cblx0XHRmb3IgKCB2YXIgaSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdFx0ICBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRiaW5kaW5nc1sgaSBdLnVuYmluZCgpO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5cbmZ1bmN0aW9uIFByb3BlcnR5QmluZGluZyggcm9vdE5vZGUsIHBhdGgsIHBhcnNlZFBhdGggKSB7XG5cblx0dGhpcy5wYXRoID0gcGF0aDtcblx0dGhpcy5wYXJzZWRQYXRoID0gcGFyc2VkUGF0aCB8fCBQcm9wZXJ0eUJpbmRpbmcucGFyc2VUcmFja05hbWUoIHBhdGggKTtcblxuXHR0aGlzLm5vZGUgPSBQcm9wZXJ0eUJpbmRpbmcuZmluZE5vZGUoIHJvb3ROb2RlLCB0aGlzLnBhcnNlZFBhdGgubm9kZU5hbWUgKSB8fCByb290Tm9kZTtcblxuXHR0aGlzLnJvb3ROb2RlID0gcm9vdE5vZGU7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUHJvcGVydHlCaW5kaW5nLCB7XG5cblx0Q29tcG9zaXRlOiBDb21wb3NpdGUsXG5cblx0Y3JlYXRlOiBmdW5jdGlvbiAoIHJvb3QsIHBhdGgsIHBhcnNlZFBhdGggKSB7XG5cblx0XHRpZiAoICEgKCByb290ICYmIHJvb3QuaXNBbmltYXRpb25PYmplY3RHcm91cCApICkge1xuXG5cdFx0XHRyZXR1cm4gbmV3IFByb3BlcnR5QmluZGluZyggcm9vdCwgcGF0aCwgcGFyc2VkUGF0aCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmV0dXJuIG5ldyBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlKCByb290LCBwYXRoLCBwYXJzZWRQYXRoICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRwYXJzZVRyYWNrTmFtZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gUGFyZW50IGRpcmVjdG9yaWVzLCBkZWxpbWl0ZWQgYnkgJy8nIG9yICc6Jy4gQ3VycmVudGx5IHVudXNlZCwgYnV0IG11c3Rcblx0XHQvLyBiZSBtYXRjaGVkIHRvIHBhcnNlIHRoZSByZXN0IG9mIHRoZSB0cmFjayBuYW1lLlxuXHRcdHZhciBkaXJlY3RvcnlSZSA9IC8oKD86W1xcdy1dK1tcXC86XSkqKS87XG5cblx0XHQvLyBUYXJnZXQgbm9kZS4gTWF5IGNvbnRhaW4gd29yZCBjaGFyYWN0ZXJzIChhLXpBLVowLTlfKSBhbmQgJy4nIG9yICctJy5cblx0XHR2YXIgbm9kZVJlID0gLyhbXFx3LVxcLl0rKT8vO1xuXG5cdFx0Ly8gT2JqZWN0IG9uIHRhcmdldCBub2RlLCBhbmQgYWNjZXNzb3IuIE5hbWUgbWF5IGNvbnRhaW4gb25seSB3b3JkXG5cdFx0Ly8gY2hhcmFjdGVycy4gQWNjZXNzb3IgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlciBleGNlcHQgY2xvc2luZyBicmFja2V0LlxuXHRcdHZhciBvYmplY3RSZSA9IC8oPzpcXC4oW1xcdy1dKykoPzpcXFsoLispXFxdKT8pPy87XG5cblx0XHQvLyBQcm9wZXJ0eSBhbmQgYWNjZXNzb3IuIE1heSBjb250YWluIG9ubHkgd29yZCBjaGFyYWN0ZXJzLiBBY2Nlc3NvciBtYXlcblx0XHQvLyBjb250YWluIGFueSBub24tYnJhY2tldCBjaGFyYWN0ZXJzLlxuXHRcdHZhciBwcm9wZXJ0eVJlID0gL1xcLihbXFx3LV0rKSg/OlxcWyguKylcXF0pPy87XG5cblx0XHR2YXIgdHJhY2tSZSA9IG5ldyBSZWdFeHAoJydcblx0XHRcdCsgJ14nXG5cdFx0XHQrIGRpcmVjdG9yeVJlLnNvdXJjZVxuXHRcdFx0KyBub2RlUmUuc291cmNlXG5cdFx0XHQrIG9iamVjdFJlLnNvdXJjZVxuXHRcdFx0KyBwcm9wZXJ0eVJlLnNvdXJjZVxuXHRcdFx0KyAnJCdcblx0XHQpO1xuXG5cdFx0dmFyIHN1cHBvcnRlZE9iamVjdE5hbWVzID0gWyAnbWF0ZXJpYWwnLCAnbWF0ZXJpYWxzJywgJ2JvbmVzJyBdO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uICggdHJhY2tOYW1lICkge1xuXG5cdFx0XHRcdHZhciBtYXRjaGVzID0gdHJhY2tSZS5leGVjKCB0cmFja05hbWUgKTtcblxuXHRcdFx0XHRpZiAoICEgbWF0Y2hlcyApIHtcblxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciggJ1Byb3BlcnR5QmluZGluZzogQ2Fubm90IHBhcnNlIHRyYWNrTmFtZTogJyArIHRyYWNrTmFtZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgcmVzdWx0cyA9IHtcblx0XHRcdFx0XHQvLyBkaXJlY3RvcnlOYW1lOiBtYXRjaGVzWyAxIF0sIC8vICh0c2NodykgY3VycmVudGx5IHVudXNlZFxuXHRcdFx0XHRcdG5vZGVOYW1lOiBtYXRjaGVzWyAyIF0sXG5cdFx0XHRcdFx0b2JqZWN0TmFtZTogbWF0Y2hlc1sgMyBdLFxuXHRcdFx0XHRcdG9iamVjdEluZGV4OiBtYXRjaGVzWyA0IF0sXG5cdFx0XHRcdFx0cHJvcGVydHlOYW1lOiBtYXRjaGVzWyA1IF0sICAgICAvLyByZXF1aXJlZFxuXHRcdFx0XHRcdHByb3BlcnR5SW5kZXg6IG1hdGNoZXNbIDYgXVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdHZhciBsYXN0RG90ID0gcmVzdWx0cy5ub2RlTmFtZSAmJiByZXN1bHRzLm5vZGVOYW1lLmxhc3RJbmRleE9mKCAnLicgKTtcblxuXHRcdFx0XHRpZiAoIGxhc3REb3QgIT09IHVuZGVmaW5lZCAmJiBsYXN0RG90ICE9PSAtMSApIHtcblxuXHRcdFx0XHRcdHZhciBvYmplY3ROYW1lID0gcmVzdWx0cy5ub2RlTmFtZS5zdWJzdHJpbmcoIGxhc3REb3QgKyAxICk7XG5cblx0XHRcdFx0XHQvLyBPYmplY3QgbmFtZXMgbXVzdCBiZSBjaGVja2VkIGFnYWluc3QgYSB3aGl0ZWxpc3QuIE90aGVyd2lzZSwgdGhlcmVcblx0XHRcdFx0XHQvLyBpcyBubyB3YXkgdG8gcGFyc2UgJ2Zvby5iYXIuYmF6JzogJ2JheicgbXVzdCBiZSBhIHByb3BlcnR5LCBidXRcblx0XHRcdFx0XHQvLyAnYmFyJyBjb3VsZCBiZSB0aGUgb2JqZWN0TmFtZSwgb3IgcGFydCBvZiBhIG5vZGVOYW1lICh3aGljaCBjYW5cblx0XHRcdFx0XHQvLyBpbmNsdWRlICcuJyBjaGFyYWN0ZXJzKS5cblx0XHRcdFx0XHRpZiAoIHN1cHBvcnRlZE9iamVjdE5hbWVzLmluZGV4T2YoIG9iamVjdE5hbWUgKSAhPT0gLTEgKSB7XG5cblx0XHRcdFx0XHRcdHJlc3VsdHMubm9kZU5hbWUgPSByZXN1bHRzLm5vZGVOYW1lLnN1YnN0cmluZyggMCwgbGFzdERvdCApO1xuXHRcdFx0XHRcdFx0cmVzdWx0cy5vYmplY3ROYW1lID0gb2JqZWN0TmFtZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCByZXN1bHRzLnByb3BlcnR5TmFtZSA9PT0gbnVsbCB8fCByZXN1bHRzLnByb3BlcnR5TmFtZS5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdQcm9wZXJ0eUJpbmRpbmc6IGNhbiBub3QgcGFyc2UgcHJvcGVydHlOYW1lIGZyb20gdHJhY2tOYW1lOiAnICsgdHJhY2tOYW1lICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHR9O1xuXG5cdH0oKSxcblxuXHRmaW5kTm9kZTogZnVuY3Rpb24gKCByb290LCBub2RlTmFtZSApIHtcblxuXHRcdGlmICggISBub2RlTmFtZSB8fCBub2RlTmFtZSA9PT0gXCJcIiB8fCBub2RlTmFtZSA9PT0gXCJyb290XCIgfHwgbm9kZU5hbWUgPT09IFwiLlwiIHx8IG5vZGVOYW1lID09PSAtIDEgfHwgbm9kZU5hbWUgPT09IHJvb3QubmFtZSB8fCBub2RlTmFtZSA9PT0gcm9vdC51dWlkICkge1xuXG5cdFx0XHRyZXR1cm4gcm9vdDtcblxuXHRcdH1cblxuXHRcdC8vIHNlYXJjaCBpbnRvIHNrZWxldG9uIGJvbmVzLlxuXHRcdGlmICggcm9vdC5za2VsZXRvbiApIHtcblxuXHRcdFx0dmFyIHNlYXJjaFNrZWxldG9uID0gZnVuY3Rpb24gKCBza2VsZXRvbiApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBza2VsZXRvbi5ib25lcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgYm9uZSA9IHNrZWxldG9uLmJvbmVzWyBpIF07XG5cblx0XHRcdFx0XHRpZiAoIGJvbmUubmFtZSA9PT0gbm9kZU5hbWUgKSB7XG5cblx0XHRcdFx0XHRcdHJldHVybiBib25lO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdFx0fTtcblxuXHRcdFx0dmFyIGJvbmUgPSBzZWFyY2hTa2VsZXRvbiggcm9vdC5za2VsZXRvbiApO1xuXG5cdFx0XHRpZiAoIGJvbmUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGJvbmU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIHNlYXJjaCBpbnRvIG5vZGUgc3VidHJlZS5cblx0XHRpZiAoIHJvb3QuY2hpbGRyZW4gKSB7XG5cblx0XHRcdHZhciBzZWFyY2hOb2RlU3VidHJlZSA9IGZ1bmN0aW9uICggY2hpbGRyZW4gKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIGNoaWxkTm9kZSA9IGNoaWxkcmVuWyBpIF07XG5cblx0XHRcdFx0XHRpZiAoIGNoaWxkTm9kZS5uYW1lID09PSBub2RlTmFtZSB8fCBjaGlsZE5vZGUudXVpZCA9PT0gbm9kZU5hbWUgKSB7XG5cblx0XHRcdFx0XHRcdHJldHVybiBjaGlsZE5vZGU7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR2YXIgcmVzdWx0ID0gc2VhcmNoTm9kZVN1YnRyZWUoIGNoaWxkTm9kZS5jaGlsZHJlbiApO1xuXG5cdFx0XHRcdFx0aWYgKCByZXN1bHQgKSByZXR1cm4gcmVzdWx0O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdFx0fTtcblxuXHRcdFx0dmFyIHN1YlRyZWVOb2RlID0gc2VhcmNoTm9kZVN1YnRyZWUoIHJvb3QuY2hpbGRyZW4gKTtcblxuXHRcdFx0aWYgKCBzdWJUcmVlTm9kZSApIHtcblxuXHRcdFx0XHRyZXR1cm4gc3ViVHJlZU5vZGU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLCB7IC8vIHByb3RvdHlwZSwgY29udGludWVkXG5cblx0Ly8gdGhlc2UgYXJlIHVzZWQgdG8gXCJiaW5kXCIgYSBub25leGlzdGVudCBwcm9wZXJ0eVxuXHRfZ2V0VmFsdWVfdW5hdmFpbGFibGU6IGZ1bmN0aW9uICgpIHt9LFxuXHRfc2V0VmFsdWVfdW5hdmFpbGFibGU6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdEJpbmRpbmdUeXBlOiB7XG5cdFx0RGlyZWN0OiAwLFxuXHRcdEVudGlyZUFycmF5OiAxLFxuXHRcdEFycmF5RWxlbWVudDogMixcblx0XHRIYXNGcm9tVG9BcnJheTogM1xuXHR9LFxuXG5cdFZlcnNpb25pbmc6IHtcblx0XHROb25lOiAwLFxuXHRcdE5lZWRzVXBkYXRlOiAxLFxuXHRcdE1hdHJpeFdvcmxkTmVlZHNVcGRhdGU6IDJcblx0fSxcblxuXHRHZXR0ZXJCeUJpbmRpbmdUeXBlOiBbXG5cblx0XHRmdW5jdGlvbiBnZXRWYWx1ZV9kaXJlY3QoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRidWZmZXJbIG9mZnNldCBdID0gdGhpcy5ub2RlWyB0aGlzLnByb3BlcnR5TmFtZSBdO1xuXG5cdFx0fSxcblxuXHRcdGZ1bmN0aW9uIGdldFZhbHVlX2FycmF5KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0dmFyIHNvdXJjZSA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gc291cmNlLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRidWZmZXJbIG9mZnNldCArKyBdID0gc291cmNlWyBpIF07XG5cblx0XHRcdH1cblxuXHRcdH0sXG5cblx0XHRmdW5jdGlvbiBnZXRWYWx1ZV9hcnJheUVsZW1lbnQoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRidWZmZXJbIG9mZnNldCBdID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5WyB0aGlzLnByb3BlcnR5SW5kZXggXTtcblxuXHRcdH0sXG5cblx0XHRmdW5jdGlvbiBnZXRWYWx1ZV90b0FycmF5KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5LnRvQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7XG5cblx0XHR9XG5cblx0XSxcblxuXHRTZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZzogW1xuXG5cdFx0W1xuXHRcdFx0Ly8gRGlyZWN0XG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2RpcmVjdCggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy5ub2RlWyB0aGlzLnByb3BlcnR5TmFtZSBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZGlyZWN0X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLm5vZGVbIHRoaXMucHJvcGVydHlOYW1lIF0gPSBidWZmZXJbIG9mZnNldCBdO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2RpcmVjdF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLm5vZGVbIHRoaXMucHJvcGVydHlOYW1lIF0gPSBidWZmZXJbIG9mZnNldCBdO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XSwgW1xuXG5cdFx0XHQvLyBFbnRpcmVBcnJheVxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dmFyIGRlc3QgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gZGVzdC5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0XHRkZXN0WyBpIF0gPSBidWZmZXJbIG9mZnNldCArKyBdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHZhciBkZXN0ID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5O1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGRlc3QubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdFx0ZGVzdFsgaSBdID0gYnVmZmVyWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR2YXIgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBkZXN0Lmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRcdGRlc3RbIGkgXSA9IGJ1ZmZlclsgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRdLCBbXG5cblx0XHRcdC8vIEFycmF5RWxlbWVudFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheUVsZW1lbnQoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF0gPSBidWZmZXJbIG9mZnNldCBdO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF0gPSBidWZmZXJbIG9mZnNldCBdO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2FycmF5RWxlbWVudF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdF0sIFtcblxuXHRcdFx0Ly8gSGFzVG9Gcm9tQXJyYXlcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZnJvbUFycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRdXG5cblx0XSxcblxuXHRnZXRWYWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWVfdW5ib3VuZCggdGFyZ2V0QXJyYXksIG9mZnNldCApIHtcblxuXHRcdHRoaXMuYmluZCgpO1xuXHRcdHRoaXMuZ2V0VmFsdWUoIHRhcmdldEFycmF5LCBvZmZzZXQgKTtcblxuXHRcdC8vIE5vdGU6IFRoaXMgY2xhc3MgdXNlcyBhIFN0YXRlIHBhdHRlcm4gb24gYSBwZXItbWV0aG9kIGJhc2lzOlxuXHRcdC8vICdiaW5kJyBzZXRzICd0aGlzLmdldFZhbHVlJyAvICdzZXRWYWx1ZScgYW5kIHNoYWRvd3MgdGhlXG5cdFx0Ly8gcHJvdG90eXBlIHZlcnNpb24gb2YgdGhlc2UgbWV0aG9kcyB3aXRoIG9uZSB0aGF0IHJlcHJlc2VudHNcblx0XHQvLyB0aGUgYm91bmQgc3RhdGUuIFdoZW4gdGhlIHByb3BlcnR5IGlzIG5vdCBmb3VuZCwgdGhlIG1ldGhvZHNcblx0XHQvLyBiZWNvbWUgbm8tb3BzLlxuXG5cdH0sXG5cblx0c2V0VmFsdWU6IGZ1bmN0aW9uIGdldFZhbHVlX3VuYm91bmQoIHNvdXJjZUFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmJpbmQoKTtcblx0XHR0aGlzLnNldFZhbHVlKCBzb3VyY2VBcnJheSwgb2Zmc2V0ICk7XG5cblx0fSxcblxuXHQvLyBjcmVhdGUgZ2V0dGVyIC8gc2V0dGVyIHBhaXIgZm9yIGEgcHJvcGVydHkgaW4gdGhlIHNjZW5lIGdyYXBoXG5cdGJpbmQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0YXJnZXRPYmplY3QgPSB0aGlzLm5vZGUsXG5cdFx0XHRwYXJzZWRQYXRoID0gdGhpcy5wYXJzZWRQYXRoLFxuXG5cdFx0XHRvYmplY3ROYW1lID0gcGFyc2VkUGF0aC5vYmplY3ROYW1lLFxuXHRcdFx0cHJvcGVydHlOYW1lID0gcGFyc2VkUGF0aC5wcm9wZXJ0eU5hbWUsXG5cdFx0XHRwcm9wZXJ0eUluZGV4ID0gcGFyc2VkUGF0aC5wcm9wZXJ0eUluZGV4O1xuXG5cdFx0aWYgKCAhIHRhcmdldE9iamVjdCApIHtcblxuXHRcdFx0dGFyZ2V0T2JqZWN0ID0gUHJvcGVydHlCaW5kaW5nLmZpbmROb2RlKFxuXHRcdFx0XHRcdHRoaXMucm9vdE5vZGUsIHBhcnNlZFBhdGgubm9kZU5hbWUgKSB8fCB0aGlzLnJvb3ROb2RlO1xuXG5cdFx0XHR0aGlzLm5vZGUgPSB0YXJnZXRPYmplY3Q7XG5cblx0XHR9XG5cblx0XHQvLyBzZXQgZmFpbCBzdGF0ZSBzbyB3ZSBjYW4ganVzdCAncmV0dXJuJyBvbiBlcnJvclxuXHRcdHRoaXMuZ2V0VmFsdWUgPSB0aGlzLl9nZXRWYWx1ZV91bmF2YWlsYWJsZTtcblx0XHR0aGlzLnNldFZhbHVlID0gdGhpcy5fc2V0VmFsdWVfdW5hdmFpbGFibGU7XG5cblx0XHQvLyBlbnN1cmUgdGhlcmUgaXMgYSB2YWx1ZSBub2RlXG5cdFx0aWYgKCAhIHRhcmdldE9iamVjdCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggXCIgIHRyeWluZyB0byB1cGRhdGUgbm9kZSBmb3IgdHJhY2s6IFwiICsgdGhpcy5wYXRoICsgXCIgYnV0IGl0IHdhc24ndCBmb3VuZC5cIiApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3ROYW1lICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0SW5kZXggPSBwYXJzZWRQYXRoLm9iamVjdEluZGV4O1xuXG5cdFx0XHQvLyBzcGVjaWFsIGNhc2VzIHdlcmUgd2UgbmVlZCB0byByZWFjaCBkZWVwZXIgaW50byB0aGUgaGllcmFyY2h5IHRvIGdldCB0aGUgZmFjZSBtYXRlcmlhbHMuLi4uXG5cdFx0XHRzd2l0Y2ggKCBvYmplY3ROYW1lICkge1xuXG5cdFx0XHRcdGNhc2UgJ21hdGVyaWFscyc6XG5cblx0XHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0Lm1hdGVyaWFsICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnICBjYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWwnLCB0aGlzICk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0Lm1hdGVyaWFsLm1hdGVyaWFscyApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJyAgY2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsLm1hdGVyaWFscyBhcyBub2RlLm1hdGVyaWFsIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbHMgYXJyYXknLCB0aGlzICk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3QubWF0ZXJpYWwubWF0ZXJpYWxzO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnYm9uZXMnOlxuXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5za2VsZXRvbiApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJyAgY2FuIG5vdCBiaW5kIHRvIGJvbmVzIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIHNrZWxldG9uJywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gcG90ZW50aWFsIGZ1dHVyZSBvcHRpbWl6YXRpb246IHNraXAgdGhpcyBpZiBwcm9wZXJ0eUluZGV4IGlzIGFscmVhZHkgYW4gaW50ZWdlclxuXHRcdFx0XHRcdC8vIGFuZCBjb252ZXJ0IHRoZSBpbnRlZ2VyIHN0cmluZyB0byBhIHRydWUgaW50ZWdlci5cblxuXHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdC5za2VsZXRvbi5ib25lcztcblxuXHRcdFx0XHRcdC8vIHN1cHBvcnQgcmVzb2x2aW5nIG1vcnBoVGFyZ2V0IG5hbWVzIGludG8gaW5kaWNlcy5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0YXJnZXRPYmplY3QubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdFsgaSBdLm5hbWUgPT09IG9iamVjdEluZGV4ICkge1xuXG5cdFx0XHRcdFx0XHRcdG9iamVjdEluZGV4ID0gaTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6XG5cblx0XHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdFsgb2JqZWN0TmFtZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICcgIGNhbiBub3QgYmluZCB0byBvYmplY3ROYW1lIG9mIG5vZGUsIHVuZGVmaW5lZCcsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdFsgb2JqZWN0TmFtZSBdO1xuXG5cdFx0XHR9XG5cblxuXHRcdFx0aWYgKCBvYmplY3RJbmRleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0WyBvYmplY3RJbmRleCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCBcIiAgdHJ5aW5nIHRvIGJpbmQgdG8gb2JqZWN0SW5kZXggb2Ygb2JqZWN0TmFtZSwgYnV0IGlzIHVuZGVmaW5lZDpcIiwgdGhpcywgdGFyZ2V0T2JqZWN0ICk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3RbIG9iamVjdEluZGV4IF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIHJlc29sdmUgcHJvcGVydHlcblx0XHR2YXIgbm9kZVByb3BlcnR5ID0gdGFyZ2V0T2JqZWN0WyBwcm9wZXJ0eU5hbWUgXTtcblxuXHRcdGlmICggbm9kZVByb3BlcnR5ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBub2RlTmFtZSA9IHBhcnNlZFBhdGgubm9kZU5hbWU7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoIFwiICB0cnlpbmcgdG8gdXBkYXRlIHByb3BlcnR5IGZvciB0cmFjazogXCIgKyBub2RlTmFtZSArXG5cdFx0XHRcdCcuJyArIHByb3BlcnR5TmFtZSArIFwiIGJ1dCBpdCB3YXNuJ3QgZm91bmQuXCIsIHRhcmdldE9iamVjdCApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZGV0ZXJtaW5lIHZlcnNpb25pbmcgc2NoZW1lXG5cdFx0dmFyIHZlcnNpb25pbmcgPSB0aGlzLlZlcnNpb25pbmcuTm9uZTtcblxuXHRcdGlmICggdGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlICE9PSB1bmRlZmluZWQgKSB7IC8vIG1hdGVyaWFsXG5cblx0XHRcdHZlcnNpb25pbmcgPSB0aGlzLlZlcnNpb25pbmcuTmVlZHNVcGRhdGU7XG5cdFx0XHR0aGlzLnRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdDtcblxuXHRcdH0gZWxzZSBpZiAoIHRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlICE9PSB1bmRlZmluZWQgKSB7IC8vIG5vZGUgdHJhbnNmb3JtXG5cblx0XHRcdHZlcnNpb25pbmcgPSB0aGlzLlZlcnNpb25pbmcuTWF0cml4V29ybGROZWVkc1VwZGF0ZTtcblx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0O1xuXG5cdFx0fVxuXG5cdFx0Ly8gZGV0ZXJtaW5lIGhvdyB0aGUgcHJvcGVydHkgZ2V0cyBib3VuZFxuXHRcdHZhciBiaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuRGlyZWN0O1xuXG5cdFx0aWYgKCBwcm9wZXJ0eUluZGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIGFjY2VzcyBhIHN1YiBlbGVtZW50IG9mIHRoZSBwcm9wZXJ0eSBhcnJheSAob25seSBwcmltaXRpdmVzIGFyZSBzdXBwb3J0ZWQgcmlnaHQgbm93KVxuXG5cdFx0XHRpZiAoIHByb3BlcnR5TmFtZSA9PT0gXCJtb3JwaFRhcmdldEluZmx1ZW5jZXNcIiApIHtcblxuXHRcdFx0XHQvLyBwb3RlbnRpYWwgb3B0aW1pemF0aW9uLCBza2lwIHRoaXMgaWYgcHJvcGVydHlJbmRleCBpcyBhbHJlYWR5IGFuIGludGVnZXIsIGFuZCBjb252ZXJ0IHRoZSBpbnRlZ2VyIHN0cmluZyB0byBhIHRydWUgaW50ZWdlci5cblxuXHRcdFx0XHQvLyBzdXBwb3J0IHJlc29sdmluZyBtb3JwaFRhcmdldCBuYW1lcyBpbnRvIGluZGljZXMuXG5cdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3QuZ2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnICBjYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2FzdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5JywgdGhpcyApO1xuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5nZW9tZXRyeS5tb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnICBjYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2FzdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cycsIHRoaXMgKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMubm9kZS5nZW9tZXRyeS5tb3JwaFRhcmdldHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0aWYgKCB0YXJnZXRPYmplY3QuZ2VvbWV0cnkubW9ycGhUYXJnZXRzWyBpIF0ubmFtZSA9PT0gcHJvcGVydHlJbmRleCApIHtcblxuXHRcdFx0XHRcdFx0cHJvcGVydHlJbmRleCA9IGk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0YmluZGluZ1R5cGUgPSB0aGlzLkJpbmRpbmdUeXBlLkFycmF5RWxlbWVudDtcblxuXHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gbm9kZVByb3BlcnR5O1xuXHRcdFx0dGhpcy5wcm9wZXJ0eUluZGV4ID0gcHJvcGVydHlJbmRleDtcblxuXHRcdH0gZWxzZSBpZiAoIG5vZGVQcm9wZXJ0eS5mcm9tQXJyYXkgIT09IHVuZGVmaW5lZCAmJiBub2RlUHJvcGVydHkudG9BcnJheSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBtdXN0IHVzZSBjb3B5IGZvciBPYmplY3QzRC5FdWxlci9RdWF0ZXJuaW9uXG5cblx0XHRcdGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5IYXNGcm9tVG9BcnJheTtcblxuXHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gbm9kZVByb3BlcnR5O1xuXG5cdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggbm9kZVByb3BlcnR5ICkgKSB7XG5cblx0XHRcdGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5FbnRpcmVBcnJheTtcblxuXHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gbm9kZVByb3BlcnR5O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7XG5cblx0XHR9XG5cblx0XHQvLyBzZWxlY3QgZ2V0dGVyIC8gc2V0dGVyXG5cdFx0dGhpcy5nZXRWYWx1ZSA9IHRoaXMuR2V0dGVyQnlCaW5kaW5nVHlwZVsgYmluZGluZ1R5cGUgXTtcblx0XHR0aGlzLnNldFZhbHVlID0gdGhpcy5TZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZ1sgYmluZGluZ1R5cGUgXVsgdmVyc2lvbmluZyBdO1xuXG5cdH0sXG5cblx0dW5iaW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLm5vZGUgPSBudWxsO1xuXG5cdFx0Ly8gYmFjayB0byB0aGUgcHJvdG90eXBlIHZlcnNpb24gb2YgZ2V0VmFsdWUgLyBzZXRWYWx1ZVxuXHRcdC8vIG5vdGU6IGF2b2lkaW5nIHRvIG11dGF0ZSB0aGUgc2hhcGUgb2YgJ3RoaXMnIHZpYSAnZGVsZXRlJ1xuXHRcdHRoaXMuZ2V0VmFsdWUgPSB0aGlzLl9nZXRWYWx1ZV91bmJvdW5kO1xuXHRcdHRoaXMuc2V0VmFsdWUgPSB0aGlzLl9zZXRWYWx1ZV91bmJvdW5kO1xuXG5cdH1cblxufSApO1xuXG4vLyFcXCBERUNMQVJFIEFMSUFTIEFGVEVSIGFzc2lnbiBwcm90b3R5cGUgIVxuT2JqZWN0LmFzc2lnbiggUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZSwge1xuXG5cdC8vIGluaXRpYWwgc3RhdGUgb2YgdGhlc2UgbWV0aG9kcyB0aGF0IGNhbGxzICdiaW5kJ1xuXHRfZ2V0VmFsdWVfdW5ib3VuZDogUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5nZXRWYWx1ZSxcblx0X3NldFZhbHVlX3VuYm91bmQ6IFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuc2V0VmFsdWUsXG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSBncm91cCBvZiBvYmplY3RzIHRoYXQgcmVjZWl2ZXMgYSBzaGFyZWQgYW5pbWF0aW9uIHN0YXRlLlxuICpcbiAqIFVzYWdlOlxuICpcbiAqIFx0LVx0QWRkIG9iamVjdHMgeW91IHdvdWxkIG90aGVyd2lzZSBwYXNzIGFzICdyb290JyB0byB0aGVcbiAqIFx0XHRjb25zdHJ1Y3RvciBvciB0aGUgLmNsaXBBY3Rpb24gbWV0aG9kIG9mIEFuaW1hdGlvbk1peGVyLlxuICpcbiAqIFx0LVx0SW5zdGVhZCBwYXNzIHRoaXMgb2JqZWN0IGFzICdyb290Jy5cbiAqXG4gKiBcdC1cdFlvdSBjYW4gYWxzbyBhZGQgYW5kIHJlbW92ZSBvYmplY3RzIGxhdGVyIHdoZW4gdGhlIG1peGVyXG4gKiBcdFx0aXMgcnVubmluZy5cbiAqXG4gKiBOb3RlOlxuICpcbiAqICBcdE9iamVjdHMgb2YgdGhpcyBjbGFzcyBhcHBlYXIgYXMgb25lIG9iamVjdCB0byB0aGUgbWl4ZXIsXG4gKiAgXHRzbyBjYWNoZSBjb250cm9sIG9mIHRoZSBpbmRpdmlkdWFsIG9iamVjdHMgbXVzdCBiZSBkb25lXG4gKiAgXHRvbiB0aGUgZ3JvdXAuXG4gKlxuICogTGltaXRhdGlvbjpcbiAqXG4gKiBcdC0gXHRUaGUgYW5pbWF0ZWQgcHJvcGVydGllcyBtdXN0IGJlIGNvbXBhdGlibGUgYW1vbmcgdGhlXG4gKiBcdFx0YWxsIG9iamVjdHMgaW4gdGhlIGdyb3VwLlxuICpcbiAqICAtXHRBIHNpbmdsZSBwcm9wZXJ0eSBjYW4gZWl0aGVyIGJlIGNvbnRyb2xsZWQgdGhyb3VnaCBhXG4gKiAgXHR0YXJnZXQgZ3JvdXAgb3IgZGlyZWN0bHksIGJ1dCBub3QgYm90aC5cbiAqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gQW5pbWF0aW9uT2JqZWN0R3JvdXAoIHZhcl9hcmdzICkge1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdC8vIGNhY2hlZCBvYmplY3RzIGZvbGxvd2VkIGJ5IHRoZSBhY3RpdmUgb25lc1xuXHR0aGlzLl9vYmplY3RzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFyZ3VtZW50cyApO1xuXG5cdHRoaXMubkNhY2hlZE9iamVjdHNfID0gMDtcdFx0XHQvLyB0aHJlc2hvbGRcblx0Ly8gbm90ZTogcmVhZCBieSBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlXG5cblx0dmFyIGluZGljZXMgPSB7fTtcblx0dGhpcy5faW5kaWNlc0J5VVVJRCA9IGluZGljZXM7XHRcdC8vIGZvciBib29ra2VlcGluZ1xuXG5cdGZvciAoIHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRpbmRpY2VzWyBhcmd1bWVudHNbIGkgXS51dWlkIF0gPSBpO1xuXG5cdH1cblxuXHR0aGlzLl9wYXRocyA9IFtdO1x0XHRcdFx0XHQvLyBpbnNpZGU6IHN0cmluZ1xuXHR0aGlzLl9wYXJzZWRQYXRocyA9IFtdO1x0XHRcdFx0Ly8gaW5zaWRlOiB7IHdlIGRvbid0IGNhcmUsIGhlcmUgfVxuXHR0aGlzLl9iaW5kaW5ncyA9IFtdOyBcdFx0XHRcdC8vIGluc2lkZTogQXJyYXk8IFByb3BlcnR5QmluZGluZyA+XG5cdHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCA9IHt9OyBcdC8vIGluc2lkZTogaW5kaWNlcyBpbiB0aGVzZSBhcnJheXNcblxuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdHRoaXMuc3RhdHMgPSB7XG5cblx0XHRvYmplY3RzOiB7XG5cdFx0XHRnZXQgdG90YWwoKSB7IHJldHVybiBzY29wZS5fb2JqZWN0cy5sZW5ndGg7IH0sXG5cdFx0XHRnZXQgaW5Vc2UoKSB7IHJldHVybiB0aGlzLnRvdGFsIC0gc2NvcGUubkNhY2hlZE9iamVjdHNfOyB9XG5cdFx0fSxcblxuXHRcdGdldCBiaW5kaW5nc1Blck9iamVjdCgpIHsgcmV0dXJuIHNjb3BlLl9iaW5kaW5ncy5sZW5ndGg7IH1cblxuXHR9O1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEFuaW1hdGlvbk9iamVjdEdyb3VwLnByb3RvdHlwZSwge1xuXG5cdGlzQW5pbWF0aW9uT2JqZWN0R3JvdXA6IHRydWUsXG5cblx0YWRkOiBmdW5jdGlvbiggdmFyX2FyZ3MgKSB7XG5cblx0XHR2YXIgb2JqZWN0cyA9IHRoaXMuX29iamVjdHMsXG5cdFx0XHRuT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoLFxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdGluZGljZXNCeVVVSUQgPSB0aGlzLl9pbmRpY2VzQnlVVUlELFxuXHRcdFx0cGF0aHMgPSB0aGlzLl9wYXRocyxcblx0XHRcdHBhcnNlZFBhdGhzID0gdGhpcy5fcGFyc2VkUGF0aHMsXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0bkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dmFyIG9iamVjdCA9IGFyZ3VtZW50c1sgaSBdLFxuXHRcdFx0XHR1dWlkID0gb2JqZWN0LnV1aWQsXG5cdFx0XHRcdGluZGV4ID0gaW5kaWNlc0J5VVVJRFsgdXVpZCBdLFxuXHRcdFx0XHRrbm93bk9iamVjdCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0aWYgKCBpbmRleCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIHVua25vd24gb2JqZWN0IC0+IGFkZCBpdCB0byB0aGUgQUNUSVZFIHJlZ2lvblxuXG5cdFx0XHRcdGluZGV4ID0gbk9iamVjdHMgKys7XG5cdFx0XHRcdGluZGljZXNCeVVVSURbIHV1aWQgXSA9IGluZGV4O1xuXHRcdFx0XHRvYmplY3RzLnB1c2goIG9iamVjdCApO1xuXG5cdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7XG5cblx0XHRcdFx0XHRiaW5kaW5nc1sgaiBdLnB1c2goXG5cdFx0XHRcdFx0XHRcdG5ldyBQcm9wZXJ0eUJpbmRpbmcoXG5cdFx0XHRcdFx0XHRcdFx0b2JqZWN0LCBwYXRoc1sgaiBdLCBwYXJzZWRQYXRoc1sgaiBdICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIGluZGV4IDwgbkNhY2hlZE9iamVjdHMgKSB7XG5cblx0XHRcdFx0a25vd25PYmplY3QgPSBvYmplY3RzWyBpbmRleCBdO1xuXG5cdFx0XHRcdC8vIG1vdmUgZXhpc3Rpbmcgb2JqZWN0IHRvIHRoZSBBQ1RJVkUgcmVnaW9uXG5cblx0XHRcdFx0dmFyIGZpcnN0QWN0aXZlSW5kZXggPSAtLSBuQ2FjaGVkT2JqZWN0cyxcblx0XHRcdFx0XHRsYXN0Q2FjaGVkT2JqZWN0ID0gb2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdO1xuXG5cdFx0XHRcdGluZGljZXNCeVVVSURbIGxhc3RDYWNoZWRPYmplY3QudXVpZCBdID0gaW5kZXg7XG5cdFx0XHRcdG9iamVjdHNbIGluZGV4IF0gPSBsYXN0Q2FjaGVkT2JqZWN0O1xuXG5cdFx0XHRcdGluZGljZXNCeVVVSURbIHV1aWQgXSA9IGZpcnN0QWN0aXZlSW5kZXg7XG5cdFx0XHRcdG9iamVjdHNbIGZpcnN0QWN0aXZlSW5kZXggXSA9IG9iamVjdDtcblxuXHRcdFx0XHQvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzXG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkge1xuXG5cdFx0XHRcdFx0dmFyIGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF0sXG5cdFx0XHRcdFx0XHRsYXN0Q2FjaGVkID0gYmluZGluZ3NGb3JQYXRoWyBmaXJzdEFjdGl2ZUluZGV4IF0sXG5cdFx0XHRcdFx0XHRiaW5kaW5nID0gYmluZGluZ3NGb3JQYXRoWyBpbmRleCBdO1xuXG5cdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBpbmRleCBdID0gbGFzdENhY2hlZDtcblxuXHRcdFx0XHRcdGlmICggYmluZGluZyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHQvLyBzaW5jZSB3ZSBkbyBub3QgYm90aGVyIHRvIGNyZWF0ZSBuZXcgYmluZGluZ3Ncblx0XHRcdFx0XHRcdC8vIGZvciBvYmplY3RzIHRoYXQgYXJlIGNhY2hlZCwgdGhlIGJpbmRpbmcgbWF5XG5cdFx0XHRcdFx0XHQvLyBvciBtYXkgbm90IGV4aXN0XG5cblx0XHRcdFx0XHRcdGJpbmRpbmcgPSBuZXcgUHJvcGVydHlCaW5kaW5nKFxuXHRcdFx0XHRcdFx0XHRcdG9iamVjdCwgcGF0aHNbIGogXSwgcGFyc2VkUGF0aHNbIGogXSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBiaW5kaW5nO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0c1sgaW5kZXggXSAhPT0ga25vd25PYmplY3QgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggXCJEaWZmZXJlbnQgb2JqZWN0cyB3aXRoIHRoZSBzYW1lIFVVSUQgXCIgK1xuXHRcdFx0XHRcdFx0XCJkZXRlY3RlZC4gQ2xlYW4gdGhlIGNhY2hlcyBvciByZWNyZWF0ZSB5b3VyIFwiICtcblx0XHRcdFx0XHRcdFwiaW5mcmFzdHJ1Y3R1cmUgd2hlbiByZWxvYWRpbmcgc2NlbmVzLi4uXCIgKTtcblxuXHRcdFx0fSAvLyBlbHNlIHRoZSBvYmplY3QgaXMgYWxyZWFkeSB3aGVyZSB3ZSB3YW50IGl0IHRvIGJlXG5cblx0XHR9IC8vIGZvciBhcmd1bWVudHNcblxuXHRcdHRoaXMubkNhY2hlZE9iamVjdHNfID0gbkNhY2hlZE9iamVjdHM7XG5cblx0fSxcblxuXHRyZW1vdmU6IGZ1bmN0aW9uKCB2YXJfYXJncyApIHtcblxuXHRcdHZhciBvYmplY3RzID0gdGhpcy5fb2JqZWN0cyxcblx0XHRcdG5DYWNoZWRPYmplY3RzID0gdGhpcy5uQ2FjaGVkT2JqZWN0c18sXG5cdFx0XHRpbmRpY2VzQnlVVUlEID0gdGhpcy5faW5kaWNlc0J5VVVJRCxcblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRuQmluZGluZ3MgPSBiaW5kaW5ncy5sZW5ndGg7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gYXJndW1lbnRzWyBpIF0sXG5cdFx0XHRcdHV1aWQgPSBvYmplY3QudXVpZCxcblx0XHRcdFx0aW5kZXggPSBpbmRpY2VzQnlVVUlEWyB1dWlkIF07XG5cblx0XHRcdGlmICggaW5kZXggIT09IHVuZGVmaW5lZCAmJiBpbmRleCA+PSBuQ2FjaGVkT2JqZWN0cyApIHtcblxuXHRcdFx0XHQvLyBtb3ZlIGV4aXN0aW5nIG9iamVjdCBpbnRvIHRoZSBDQUNIRUQgcmVnaW9uXG5cblx0XHRcdFx0dmFyIGxhc3RDYWNoZWRJbmRleCA9IG5DYWNoZWRPYmplY3RzICsrLFxuXHRcdFx0XHRcdGZpcnN0QWN0aXZlT2JqZWN0ID0gb2JqZWN0c1sgbGFzdENhY2hlZEluZGV4IF07XG5cblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgZmlyc3RBY3RpdmVPYmplY3QudXVpZCBdID0gaW5kZXg7XG5cdFx0XHRcdG9iamVjdHNbIGluZGV4IF0gPSBmaXJzdEFjdGl2ZU9iamVjdDtcblxuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyB1dWlkIF0gPSBsYXN0Q2FjaGVkSW5kZXg7XG5cdFx0XHRcdG9iamVjdHNbIGxhc3RDYWNoZWRJbmRleCBdID0gb2JqZWN0O1xuXG5cdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7XG5cblx0XHRcdFx0XHR2YXIgYmluZGluZ3NGb3JQYXRoID0gYmluZGluZ3NbIGogXSxcblx0XHRcdFx0XHRcdGZpcnN0QWN0aXZlID0gYmluZGluZ3NGb3JQYXRoWyBsYXN0Q2FjaGVkSW5kZXggXSxcblx0XHRcdFx0XHRcdGJpbmRpbmcgPSBiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF07XG5cblx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF0gPSBmaXJzdEFjdGl2ZTtcblx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGxhc3RDYWNoZWRJbmRleCBdID0gYmluZGluZztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gLy8gZm9yIGFyZ3VtZW50c1xuXG5cdFx0dGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0cztcblxuXHR9LFxuXG5cdC8vIHJlbW92ZSAmIGZvcmdldFxuXHR1bmNhY2hlOiBmdW5jdGlvbiggdmFyX2FyZ3MgKSB7XG5cblx0XHR2YXIgb2JqZWN0cyA9IHRoaXMuX29iamVjdHMsXG5cdFx0XHRuT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoLFxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdGluZGljZXNCeVVVSUQgPSB0aGlzLl9pbmRpY2VzQnlVVUlELFxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdG5CaW5kaW5ncyA9IGJpbmRpbmdzLmxlbmd0aDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHZhciBvYmplY3QgPSBhcmd1bWVudHNbIGkgXSxcblx0XHRcdFx0dXVpZCA9IG9iamVjdC51dWlkLFxuXHRcdFx0XHRpbmRleCA9IGluZGljZXNCeVVVSURbIHV1aWQgXTtcblxuXHRcdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGRlbGV0ZSBpbmRpY2VzQnlVVUlEWyB1dWlkIF07XG5cblx0XHRcdFx0aWYgKCBpbmRleCA8IG5DYWNoZWRPYmplY3RzICkge1xuXG5cdFx0XHRcdFx0Ly8gb2JqZWN0IGlzIGNhY2hlZCwgc2hyaW5rIHRoZSBDQUNIRUQgcmVnaW9uXG5cblx0XHRcdFx0XHR2YXIgZmlyc3RBY3RpdmVJbmRleCA9IC0tIG5DYWNoZWRPYmplY3RzLFxuXHRcdFx0XHRcdFx0bGFzdENhY2hlZE9iamVjdCA9IG9iamVjdHNbIGZpcnN0QWN0aXZlSW5kZXggXSxcblx0XHRcdFx0XHRcdGxhc3RJbmRleCA9IC0tIG5PYmplY3RzLFxuXHRcdFx0XHRcdFx0bGFzdE9iamVjdCA9IG9iamVjdHNbIGxhc3RJbmRleCBdO1xuXG5cdFx0XHRcdFx0Ly8gbGFzdCBjYWNoZWQgb2JqZWN0IHRha2VzIHRoaXMgb2JqZWN0J3MgcGxhY2Vcblx0XHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBsYXN0Q2FjaGVkT2JqZWN0LnV1aWQgXSA9IGluZGV4O1xuXHRcdFx0XHRcdG9iamVjdHNbIGluZGV4IF0gPSBsYXN0Q2FjaGVkT2JqZWN0O1xuXG5cdFx0XHRcdFx0Ly8gbGFzdCBvYmplY3QgZ29lcyB0byB0aGUgYWN0aXZhdGVkIHNsb3QgYW5kIHBvcFxuXHRcdFx0XHRcdGluZGljZXNCeVVVSURbIGxhc3RPYmplY3QudXVpZCBdID0gZmlyc3RBY3RpdmVJbmRleDtcblx0XHRcdFx0XHRvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBsYXN0T2JqZWN0O1xuXHRcdFx0XHRcdG9iamVjdHMucG9wKCk7XG5cblx0XHRcdFx0XHQvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzXG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7XG5cblx0XHRcdFx0XHRcdHZhciBiaW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1sgaiBdLFxuXHRcdFx0XHRcdFx0XHRsYXN0Q2FjaGVkID0gYmluZGluZ3NGb3JQYXRoWyBmaXJzdEFjdGl2ZUluZGV4IF0sXG5cdFx0XHRcdFx0XHRcdGxhc3QgPSBiaW5kaW5nc0ZvclBhdGhbIGxhc3RJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF0gPSBsYXN0Q2FjaGVkO1xuXHRcdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBsYXN0O1xuXHRcdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoLnBvcCgpO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyBvYmplY3QgaXMgYWN0aXZlLCBqdXN0IHN3YXAgd2l0aCB0aGUgbGFzdCBhbmQgcG9wXG5cblx0XHRcdFx0XHR2YXIgbGFzdEluZGV4ID0gLS0gbk9iamVjdHMsXG5cdFx0XHRcdFx0XHRsYXN0T2JqZWN0ID0gb2JqZWN0c1sgbGFzdEluZGV4IF07XG5cblx0XHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBsYXN0T2JqZWN0LnV1aWQgXSA9IGluZGV4O1xuXHRcdFx0XHRcdG9iamVjdHNbIGluZGV4IF0gPSBsYXN0T2JqZWN0O1xuXHRcdFx0XHRcdG9iamVjdHMucG9wKCk7XG5cblx0XHRcdFx0XHQvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzXG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7XG5cblx0XHRcdFx0XHRcdHZhciBiaW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1sgaiBdO1xuXG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF0gPSBiaW5kaW5nc0ZvclBhdGhbIGxhc3RJbmRleCBdO1xuXHRcdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoLnBvcCgpO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gLy8gY2FjaGVkIG9yIGFjdGl2ZVxuXG5cdFx0XHR9IC8vIGlmIG9iamVjdCBpcyBrbm93blxuXG5cdFx0fSAvLyBmb3IgYXJndW1lbnRzXG5cblx0XHR0aGlzLm5DYWNoZWRPYmplY3RzXyA9IG5DYWNoZWRPYmplY3RzO1xuXG5cdH0sXG5cblx0Ly8gSW50ZXJuYWwgaW50ZXJmYWNlIHVzZWQgYnkgYmVmcmllbmRlZCBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlOlxuXG5cdHN1YnNjcmliZV86IGZ1bmN0aW9uICggcGF0aCwgcGFyc2VkUGF0aCApIHtcblxuXHRcdC8vIHJldHVybnMgYW4gYXJyYXkgb2YgYmluZGluZ3MgZm9yIHRoZSBnaXZlbiBwYXRoIHRoYXQgaXMgY2hhbmdlZFxuXHRcdC8vIGFjY29yZGluZyB0byB0aGUgY29udGFpbmVkIG9iamVjdHMgaW4gdGhlIGdyb3VwXG5cblx0XHR2YXIgaW5kaWNlc0J5UGF0aCA9IHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCxcblx0XHRcdGluZGV4ID0gaW5kaWNlc0J5UGF0aFsgcGF0aCBdLFxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGlmICggaW5kZXggIT09IHVuZGVmaW5lZCApIHJldHVybiBiaW5kaW5nc1sgaW5kZXggXTtcblxuXHRcdHZhciBwYXRocyA9IHRoaXMuX3BhdGhzLFxuXHRcdFx0cGFyc2VkUGF0aHMgPSB0aGlzLl9wYXJzZWRQYXRocyxcblx0XHRcdG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLFxuXHRcdFx0bk9iamVjdHMgPSBvYmplY3RzLmxlbmd0aCxcblx0XHRcdG5DYWNoZWRPYmplY3RzID0gdGhpcy5uQ2FjaGVkT2JqZWN0c18sXG5cdFx0XHRiaW5kaW5nc0ZvclBhdGggPSBuZXcgQXJyYXkoIG5PYmplY3RzICk7XG5cblx0XHRpbmRleCA9IGJpbmRpbmdzLmxlbmd0aDtcblxuXHRcdGluZGljZXNCeVBhdGhbIHBhdGggXSA9IGluZGV4O1xuXG5cdFx0cGF0aHMucHVzaCggcGF0aCApO1xuXHRcdHBhcnNlZFBhdGhzLnB1c2goIHBhcnNlZFBhdGggKTtcblx0XHRiaW5kaW5ncy5wdXNoKCBiaW5kaW5nc0ZvclBhdGggKTtcblxuXHRcdGZvciAoIHZhciBpID0gbkNhY2hlZE9iamVjdHMsIG4gPSBvYmplY3RzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dmFyIG9iamVjdCA9IG9iamVjdHNbIGkgXTtcblx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaSBdID0gbmV3IFByb3BlcnR5QmluZGluZyggb2JqZWN0LCBwYXRoLCBwYXJzZWRQYXRoICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYmluZGluZ3NGb3JQYXRoO1xuXG5cdH0sXG5cblx0dW5zdWJzY3JpYmVfOiBmdW5jdGlvbiAoIHBhdGggKSB7XG5cblx0XHQvLyB0ZWxscyB0aGUgZ3JvdXAgdG8gZm9yZ2V0IGFib3V0IGEgcHJvcGVydHkgcGF0aCBhbmQgbm8gbG9uZ2VyXG5cdFx0Ly8gdXBkYXRlIHRoZSBhcnJheSBwcmV2aW91c2x5IG9idGFpbmVkIHdpdGggJ3N1YnNjcmliZV8nXG5cblx0XHR2YXIgaW5kaWNlc0J5UGF0aCA9IHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCxcblx0XHRcdGluZGV4ID0gaW5kaWNlc0J5UGF0aFsgcGF0aCBdO1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgcGF0aHMgPSB0aGlzLl9wYXRocyxcblx0XHRcdFx0cGFyc2VkUGF0aHMgPSB0aGlzLl9wYXJzZWRQYXRocyxcblx0XHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdFx0bGFzdEJpbmRpbmdzSW5kZXggPSBiaW5kaW5ncy5sZW5ndGggLSAxLFxuXHRcdFx0XHRsYXN0QmluZGluZ3MgPSBiaW5kaW5nc1sgbGFzdEJpbmRpbmdzSW5kZXggXSxcblx0XHRcdFx0bGFzdEJpbmRpbmdzUGF0aCA9IHBhdGhbIGxhc3RCaW5kaW5nc0luZGV4IF07XG5cblx0XHRcdGluZGljZXNCeVBhdGhbIGxhc3RCaW5kaW5nc1BhdGggXSA9IGluZGV4O1xuXG5cdFx0XHRiaW5kaW5nc1sgaW5kZXggXSA9IGxhc3RCaW5kaW5ncztcblx0XHRcdGJpbmRpbmdzLnBvcCgpO1xuXG5cdFx0XHRwYXJzZWRQYXRoc1sgaW5kZXggXSA9IHBhcnNlZFBhdGhzWyBsYXN0QmluZGluZ3NJbmRleCBdO1xuXHRcdFx0cGFyc2VkUGF0aHMucG9wKCk7XG5cblx0XHRcdHBhdGhzWyBpbmRleCBdID0gcGF0aHNbIGxhc3RCaW5kaW5nc0luZGV4IF07XG5cdFx0XHRwYXRocy5wb3AoKTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKlxuICogQWN0aW9uIHByb3ZpZGVkIGJ5IEFuaW1hdGlvbk1peGVyIGZvciBzY2hlZHVsaW5nIGNsaXAgcGxheWJhY2sgb24gc3BlY2lmaWNcbiAqIG9iamVjdHMuXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICpcbiAqL1xuXG5mdW5jdGlvbiBBbmltYXRpb25BY3Rpb24oIG1peGVyLCBjbGlwLCBsb2NhbFJvb3QgKSB7XG5cblx0dGhpcy5fbWl4ZXIgPSBtaXhlcjtcblx0dGhpcy5fY2xpcCA9IGNsaXA7XG5cdHRoaXMuX2xvY2FsUm9vdCA9IGxvY2FsUm9vdCB8fCBudWxsO1xuXG5cdHZhciB0cmFja3MgPSBjbGlwLnRyYWNrcyxcblx0XHRuVHJhY2tzID0gdHJhY2tzLmxlbmd0aCxcblx0XHRpbnRlcnBvbGFudHMgPSBuZXcgQXJyYXkoIG5UcmFja3MgKTtcblxuXHR2YXIgaW50ZXJwb2xhbnRTZXR0aW5ncyA9IHtcblx0XHRcdGVuZGluZ1N0YXJ0OiBcdFplcm9DdXJ2YXR1cmVFbmRpbmcsXG5cdFx0XHRlbmRpbmdFbmQ6XHRcdFplcm9DdXJ2YXR1cmVFbmRpbmdcblx0fTtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5UcmFja3M7ICsrIGkgKSB7XG5cblx0XHR2YXIgaW50ZXJwb2xhbnQgPSB0cmFja3NbIGkgXS5jcmVhdGVJbnRlcnBvbGFudCggbnVsbCApO1xuXHRcdGludGVycG9sYW50c1sgaSBdID0gaW50ZXJwb2xhbnQ7XG5cdFx0aW50ZXJwb2xhbnQuc2V0dGluZ3MgPSBpbnRlcnBvbGFudFNldHRpbmdzO1xuXG5cdH1cblxuXHR0aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzID0gaW50ZXJwb2xhbnRTZXR0aW5ncztcblxuXHR0aGlzLl9pbnRlcnBvbGFudHMgPSBpbnRlcnBvbGFudHM7XHQvLyBib3VuZCBieSB0aGUgbWl4ZXJcblxuXHQvLyBpbnNpZGU6IFByb3BlcnR5TWl4ZXIgKG1hbmFnZWQgYnkgdGhlIG1peGVyKVxuXHR0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzID0gbmV3IEFycmF5KCBuVHJhY2tzICk7XG5cblx0dGhpcy5fY2FjaGVJbmRleCA9IG51bGw7XHRcdFx0Ly8gZm9yIHRoZSBtZW1vcnkgbWFuYWdlclxuXHR0aGlzLl9ieUNsaXBDYWNoZUluZGV4ID0gbnVsbDtcdFx0Ly8gZm9yIHRoZSBtZW1vcnkgbWFuYWdlclxuXG5cdHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50ID0gbnVsbDtcblx0dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQgPSBudWxsO1xuXG5cdHRoaXMubG9vcCA9IExvb3BSZXBlYXQ7XG5cdHRoaXMuX2xvb3BDb3VudCA9IC0xO1xuXG5cdC8vIGdsb2JhbCBtaXhlciB0aW1lIHdoZW4gdGhlIGFjdGlvbiBpcyB0byBiZSBzdGFydGVkXG5cdC8vIGl0J3Mgc2V0IGJhY2sgdG8gJ251bGwnIHVwb24gc3RhcnQgb2YgdGhlIGFjdGlvblxuXHR0aGlzLl9zdGFydFRpbWUgPSBudWxsO1xuXG5cdC8vIHNjYWxlZCBsb2NhbCB0aW1lIG9mIHRoZSBhY3Rpb25cblx0Ly8gZ2V0cyBjbGFtcGVkIG9yIHdyYXBwZWQgdG8gMC4uY2xpcC5kdXJhdGlvbiBhY2NvcmRpbmcgdG8gbG9vcFxuXHR0aGlzLnRpbWUgPSAwO1xuXG5cdHRoaXMudGltZVNjYWxlID0gMTtcblx0dGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlID0gMTtcblxuXHR0aGlzLndlaWdodCA9IDE7XG5cdHRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IDE7XG5cblx0dGhpcy5yZXBldGl0aW9ucyA9IEluZmluaXR5OyBcdFx0Ly8gbm8uIG9mIHJlcGV0aXRpb25zIHdoZW4gbG9vcGluZ1xuXG5cdHRoaXMucGF1c2VkID0gZmFsc2U7XHRcdFx0XHQvLyB0cnVlIC0+IHplcm8gZWZmZWN0aXZlIHRpbWUgc2NhbGVcblx0dGhpcy5lbmFibGVkID0gdHJ1ZTtcdFx0XHRcdC8vIGZhbHNlIC0+IHplcm8gZWZmZWN0aXZlIHdlaWdodFxuXG5cdHRoaXMuY2xhbXBXaGVuRmluaXNoZWQgXHQ9IGZhbHNlO1x0Ly8ga2VlcCBmZWVkaW5nIHRoZSBsYXN0IGZyYW1lP1xuXG5cdHRoaXMuemVyb1Nsb3BlQXRTdGFydCBcdD0gdHJ1ZTtcdFx0Ly8gZm9yIHNtb290aCBpbnRlcnBvbGF0aW9uIHcvbyBzZXBhcmF0ZVxuXHR0aGlzLnplcm9TbG9wZUF0RW5kXHRcdD0gdHJ1ZTtcdFx0Ly8gY2xpcHMgZm9yIHN0YXJ0LCBsb29wIGFuZCBlbmRcblxufVxuXG5PYmplY3QuYXNzaWduKCBBbmltYXRpb25BY3Rpb24ucHJvdG90eXBlLCB7XG5cblx0Ly8gU3RhdGUgJiBTY2hlZHVsaW5nXG5cblx0cGxheTogZnVuY3Rpb24oKSB7XG5cblx0XHR0aGlzLl9taXhlci5fYWN0aXZhdGVBY3Rpb24oIHRoaXMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3RvcDogZnVuY3Rpb24oKSB7XG5cblx0XHR0aGlzLl9taXhlci5fZGVhY3RpdmF0ZUFjdGlvbiggdGhpcyApO1xuXG5cdFx0cmV0dXJuIHRoaXMucmVzZXQoKTtcblxuXHR9LFxuXG5cdHJlc2V0OiBmdW5jdGlvbigpIHtcblxuXHRcdHRoaXMucGF1c2VkID0gZmFsc2U7XG5cdFx0dGhpcy5lbmFibGVkID0gdHJ1ZTtcblxuXHRcdHRoaXMudGltZSA9IDA7XHRcdFx0Ly8gcmVzdGFydCBjbGlwXG5cdFx0dGhpcy5fbG9vcENvdW50ID0gLTE7XHQvLyBmb3JnZXQgcHJldmlvdXMgbG9vcHNcblx0XHR0aGlzLl9zdGFydFRpbWUgPSBudWxsO1x0Ly8gZm9yZ2V0IHNjaGVkdWxpbmdcblxuXHRcdHJldHVybiB0aGlzLnN0b3BGYWRpbmcoKS5zdG9wV2FycGluZygpO1xuXG5cdH0sXG5cblx0aXNSdW5uaW5nOiBmdW5jdGlvbigpIHtcblxuXHRcdHJldHVybiB0aGlzLmVuYWJsZWQgJiYgISB0aGlzLnBhdXNlZCAmJiB0aGlzLnRpbWVTY2FsZSAhPT0gMCAmJlxuXHRcdFx0XHR0aGlzLl9zdGFydFRpbWUgPT09IG51bGwgJiYgdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKCB0aGlzICk7XG5cblx0fSxcblxuXHQvLyByZXR1cm4gdHJ1ZSB3aGVuIHBsYXkgaGFzIGJlZW4gY2FsbGVkXG5cdGlzU2NoZWR1bGVkOiBmdW5jdGlvbigpIHtcblxuXHRcdHJldHVybiB0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24oIHRoaXMgKTtcblxuXHR9LFxuXG5cdHN0YXJ0QXQ6IGZ1bmN0aW9uKCB0aW1lICkge1xuXG5cdFx0dGhpcy5fc3RhcnRUaW1lID0gdGltZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0TG9vcDogZnVuY3Rpb24oIG1vZGUsIHJlcGV0aXRpb25zICkge1xuXG5cdFx0dGhpcy5sb29wID0gbW9kZTtcblx0XHR0aGlzLnJlcGV0aXRpb25zID0gcmVwZXRpdGlvbnM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIFdlaWdodFxuXG5cdC8vIHNldCB0aGUgd2VpZ2h0IHN0b3BwaW5nIGFueSBzY2hlZHVsZWQgZmFkaW5nXG5cdC8vIGFsdGhvdWdoIC5lbmFibGVkID0gZmFsc2UgeWllbGRzIGFuIGVmZmVjdGl2ZSB3ZWlnaHQgb2YgemVybywgdGhpc1xuXHQvLyBtZXRob2QgZG9lcyAqbm90KiBjaGFuZ2UgLmVuYWJsZWQsIGJlY2F1c2UgaXQgd291bGQgYmUgY29uZnVzaW5nXG5cdHNldEVmZmVjdGl2ZVdlaWdodDogZnVuY3Rpb24oIHdlaWdodCApIHtcblxuXHRcdHRoaXMud2VpZ2h0ID0gd2VpZ2h0O1xuXG5cdFx0Ly8gbm90ZTogc2FtZSBsb2dpYyBhcyB3aGVuIHVwZGF0ZWQgYXQgcnVudGltZVxuXHRcdHRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IHRoaXMuZW5hYmxlZCA/IHdlaWdodCA6IDA7XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCk7XG5cblx0fSxcblxuXHQvLyByZXR1cm4gdGhlIHdlaWdodCBjb25zaWRlcmluZyBmYWRpbmcgYW5kIC5lbmFibGVkXG5cdGdldEVmZmVjdGl2ZVdlaWdodDogZnVuY3Rpb24oKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fZWZmZWN0aXZlV2VpZ2h0O1xuXG5cdH0sXG5cblx0ZmFkZUluOiBmdW5jdGlvbiggZHVyYXRpb24gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcoIGR1cmF0aW9uLCAwLCAxICk7XG5cblx0fSxcblxuXHRmYWRlT3V0OiBmdW5jdGlvbiggZHVyYXRpb24gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcoIGR1cmF0aW9uLCAxLCAwICk7XG5cblx0fSxcblxuXHRjcm9zc0ZhZGVGcm9tOiBmdW5jdGlvbiggZmFkZU91dEFjdGlvbiwgZHVyYXRpb24sIHdhcnAgKSB7XG5cblx0XHRmYWRlT3V0QWN0aW9uLmZhZGVPdXQoIGR1cmF0aW9uICk7XG5cdFx0dGhpcy5mYWRlSW4oIGR1cmF0aW9uICk7XG5cblx0XHRpZiggd2FycCApIHtcblxuXHRcdFx0dmFyIGZhZGVJbkR1cmF0aW9uID0gdGhpcy5fY2xpcC5kdXJhdGlvbixcblx0XHRcdFx0ZmFkZU91dER1cmF0aW9uID0gZmFkZU91dEFjdGlvbi5fY2xpcC5kdXJhdGlvbixcblxuXHRcdFx0XHRzdGFydEVuZFJhdGlvID0gZmFkZU91dER1cmF0aW9uIC8gZmFkZUluRHVyYXRpb24sXG5cdFx0XHRcdGVuZFN0YXJ0UmF0aW8gPSBmYWRlSW5EdXJhdGlvbiAvIGZhZGVPdXREdXJhdGlvbjtcblxuXHRcdFx0ZmFkZU91dEFjdGlvbi53YXJwKCAxLjAsIHN0YXJ0RW5kUmF0aW8sIGR1cmF0aW9uICk7XG5cdFx0XHR0aGlzLndhcnAoIGVuZFN0YXJ0UmF0aW8sIDEuMCwgZHVyYXRpb24gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y3Jvc3NGYWRlVG86IGZ1bmN0aW9uKCBmYWRlSW5BY3Rpb24sIGR1cmF0aW9uLCB3YXJwICkge1xuXG5cdFx0cmV0dXJuIGZhZGVJbkFjdGlvbi5jcm9zc0ZhZGVGcm9tKCB0aGlzLCBkdXJhdGlvbiwgd2FycCApO1xuXG5cdH0sXG5cblx0c3RvcEZhZGluZzogZnVuY3Rpb24oKSB7XG5cblx0XHR2YXIgd2VpZ2h0SW50ZXJwb2xhbnQgPSB0aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtcblxuXHRcdGlmICggd2VpZ2h0SW50ZXJwb2xhbnQgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuX3dlaWdodEludGVycG9sYW50ID0gbnVsbDtcblx0XHRcdHRoaXMuX21peGVyLl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCggd2VpZ2h0SW50ZXJwb2xhbnQgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gVGltZSBTY2FsZSBDb250cm9sXG5cblx0Ly8gc2V0IHRoZSB0aW1lIHNjYWxlIHN0b3BwaW5nIGFueSBzY2hlZHVsZWQgd2FycGluZ1xuXHQvLyBhbHRob3VnaCAucGF1c2VkID0gdHJ1ZSB5aWVsZHMgYW4gZWZmZWN0aXZlIHRpbWUgc2NhbGUgb2YgemVybywgdGhpc1xuXHQvLyBtZXRob2QgZG9lcyAqbm90KiBjaGFuZ2UgLnBhdXNlZCwgYmVjYXVzZSBpdCB3b3VsZCBiZSBjb25mdXNpbmdcblx0c2V0RWZmZWN0aXZlVGltZVNjYWxlOiBmdW5jdGlvbiggdGltZVNjYWxlICkge1xuXG5cdFx0dGhpcy50aW1lU2NhbGUgPSB0aW1lU2NhbGU7XG5cdFx0dGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlID0gdGhpcy5wYXVzZWQgPyAwIDp0aW1lU2NhbGU7XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpO1xuXG5cdH0sXG5cblx0Ly8gcmV0dXJuIHRoZSB0aW1lIHNjYWxlIGNvbnNpZGVyaW5nIHdhcnBpbmcgYW5kIC5wYXVzZWRcblx0Z2V0RWZmZWN0aXZlVGltZVNjYWxlOiBmdW5jdGlvbigpIHtcblxuXHRcdHJldHVybiB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGU7XG5cblx0fSxcblxuXHRzZXREdXJhdGlvbjogZnVuY3Rpb24oIGR1cmF0aW9uICkge1xuXG5cdFx0dGhpcy50aW1lU2NhbGUgPSB0aGlzLl9jbGlwLmR1cmF0aW9uIC8gZHVyYXRpb247XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpO1xuXG5cdH0sXG5cblx0c3luY1dpdGg6IGZ1bmN0aW9uKCBhY3Rpb24gKSB7XG5cblx0XHR0aGlzLnRpbWUgPSBhY3Rpb24udGltZTtcblx0XHR0aGlzLnRpbWVTY2FsZSA9IGFjdGlvbi50aW1lU2NhbGU7XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpO1xuXG5cdH0sXG5cblx0aGFsdDogZnVuY3Rpb24oIGR1cmF0aW9uICkge1xuXG5cdFx0cmV0dXJuIHRoaXMud2FycCggdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlLCAwLCBkdXJhdGlvbiApO1xuXG5cdH0sXG5cblx0d2FycDogZnVuY3Rpb24oIHN0YXJ0VGltZVNjYWxlLCBlbmRUaW1lU2NhbGUsIGR1cmF0aW9uICkge1xuXG5cdFx0dmFyIG1peGVyID0gdGhpcy5fbWl4ZXIsIG5vdyA9IG1peGVyLnRpbWUsXG5cdFx0XHRpbnRlcnBvbGFudCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50LFxuXG5cdFx0XHR0aW1lU2NhbGUgPSB0aGlzLnRpbWVTY2FsZTtcblxuXHRcdGlmICggaW50ZXJwb2xhbnQgPT09IG51bGwgKSB7XG5cblx0XHRcdGludGVycG9sYW50ID0gbWl4ZXIuX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKTtcblx0XHRcdHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50ID0gaW50ZXJwb2xhbnQ7XG5cblx0XHR9XG5cblx0XHR2YXIgdGltZXMgPSBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnMsXG5cdFx0XHR2YWx1ZXMgPSBpbnRlcnBvbGFudC5zYW1wbGVWYWx1ZXM7XG5cblx0XHR0aW1lc1sgMCBdID0gbm93O1xuXHRcdHRpbWVzWyAxIF0gPSBub3cgKyBkdXJhdGlvbjtcblxuXHRcdHZhbHVlc1sgMCBdID0gc3RhcnRUaW1lU2NhbGUgLyB0aW1lU2NhbGU7XG5cdFx0dmFsdWVzWyAxIF0gPSBlbmRUaW1lU2NhbGUgLyB0aW1lU2NhbGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN0b3BXYXJwaW5nOiBmdW5jdGlvbigpIHtcblxuXHRcdHZhciB0aW1lU2NhbGVJbnRlcnBvbGFudCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O1xuXG5cdFx0aWYgKCB0aW1lU2NhbGVJbnRlcnBvbGFudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBudWxsO1xuXHRcdFx0dGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KCB0aW1lU2NhbGVJbnRlcnBvbGFudCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBPYmplY3QgQWNjZXNzb3JzXG5cblx0Z2V0TWl4ZXI6IGZ1bmN0aW9uKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX21peGVyO1xuXG5cdH0sXG5cblx0Z2V0Q2xpcDogZnVuY3Rpb24oKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fY2xpcDtcblxuXHR9LFxuXG5cdGdldFJvb3Q6IGZ1bmN0aW9uKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX2xvY2FsUm9vdCB8fCB0aGlzLl9taXhlci5fcm9vdDtcblxuXHR9LFxuXG5cdC8vIEludGVybmFcblxuXHRfdXBkYXRlOiBmdW5jdGlvbiggdGltZSwgZGVsdGFUaW1lLCB0aW1lRGlyZWN0aW9uLCBhY2N1SW5kZXggKSB7XG5cblx0XHQvLyBjYWxsZWQgYnkgdGhlIG1peGVyXG5cblx0XHRpZiAoICEgdGhpcy5lbmFibGVkICkge1xuXG5cdFx0XHQvLyBjYWxsIC5fdXBkYXRlV2VpZ2h0KCkgdG8gdXBkYXRlIC5fZWZmZWN0aXZlV2VpZ2h0XG5cblx0XHRcdHRoaXMuX3VwZGF0ZVdlaWdodCggdGltZSApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHN0YXJ0VGltZSA9IHRoaXMuX3N0YXJ0VGltZTtcblxuXHRcdGlmICggc3RhcnRUaW1lICE9PSBudWxsICkge1xuXG5cdFx0XHQvLyBjaGVjayBmb3Igc2NoZWR1bGVkIHN0YXJ0IG9mIGFjdGlvblxuXG5cdFx0XHR2YXIgdGltZVJ1bm5pbmcgPSAoIHRpbWUgLSBzdGFydFRpbWUgKSAqIHRpbWVEaXJlY3Rpb247XG5cdFx0XHRpZiAoIHRpbWVSdW5uaW5nIDwgMCB8fCB0aW1lRGlyZWN0aW9uID09PSAwICkge1xuXG5cdFx0XHRcdHJldHVybjsgLy8geWV0IHRvIGNvbWUgLyBkb24ndCBkZWNpZGUgd2hlbiBkZWx0YSA9IDBcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBzdGFydFxuXG5cdFx0XHR0aGlzLl9zdGFydFRpbWUgPSBudWxsOyAvLyB1bnNjaGVkdWxlXG5cdFx0XHRkZWx0YVRpbWUgPSB0aW1lRGlyZWN0aW9uICogdGltZVJ1bm5pbmc7XG5cblx0XHR9XG5cblx0XHQvLyBhcHBseSB0aW1lIHNjYWxlIGFuZCBhZHZhbmNlIHRpbWVcblxuXHRcdGRlbHRhVGltZSAqPSB0aGlzLl91cGRhdGVUaW1lU2NhbGUoIHRpbWUgKTtcblx0XHR2YXIgY2xpcFRpbWUgPSB0aGlzLl91cGRhdGVUaW1lKCBkZWx0YVRpbWUgKTtcblxuXHRcdC8vIG5vdGU6IF91cGRhdGVUaW1lIG1heSBkaXNhYmxlIHRoZSBhY3Rpb24gcmVzdWx0aW5nIGluXG5cdFx0Ly8gYW4gZWZmZWN0aXZlIHdlaWdodCBvZiAwXG5cblx0XHR2YXIgd2VpZ2h0ID0gdGhpcy5fdXBkYXRlV2VpZ2h0KCB0aW1lICk7XG5cblx0XHRpZiAoIHdlaWdodCA+IDAgKSB7XG5cblx0XHRcdHZhciBpbnRlcnBvbGFudHMgPSB0aGlzLl9pbnRlcnBvbGFudHM7XG5cdFx0XHR2YXIgcHJvcGVydHlNaXhlcnMgPSB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzO1xuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDAsIG0gPSBpbnRlcnBvbGFudHMubGVuZ3RoOyBqICE9PSBtOyArKyBqICkge1xuXG5cdFx0XHRcdGludGVycG9sYW50c1sgaiBdLmV2YWx1YXRlKCBjbGlwVGltZSApO1xuXHRcdFx0XHRwcm9wZXJ0eU1peGVyc1sgaiBdLmFjY3VtdWxhdGUoIGFjY3VJbmRleCwgd2VpZ2h0ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdF91cGRhdGVXZWlnaHQ6IGZ1bmN0aW9uKCB0aW1lICkge1xuXG5cdFx0dmFyIHdlaWdodCA9IDA7XG5cblx0XHRpZiAoIHRoaXMuZW5hYmxlZCApIHtcblxuXHRcdFx0d2VpZ2h0ID0gdGhpcy53ZWlnaHQ7XG5cdFx0XHR2YXIgaW50ZXJwb2xhbnQgPSB0aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtcblxuXHRcdFx0aWYgKCBpbnRlcnBvbGFudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHR2YXIgaW50ZXJwb2xhbnRWYWx1ZSA9IGludGVycG9sYW50LmV2YWx1YXRlKCB0aW1lIClbIDAgXTtcblxuXHRcdFx0XHR3ZWlnaHQgKj0gaW50ZXJwb2xhbnRWYWx1ZTtcblxuXHRcdFx0XHRpZiAoIHRpbWUgPiBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnNbIDEgXSApIHtcblxuXHRcdFx0XHRcdHRoaXMuc3RvcEZhZGluZygpO1xuXG5cdFx0XHRcdFx0aWYgKCBpbnRlcnBvbGFudFZhbHVlID09PSAwICkge1xuXG5cdFx0XHRcdFx0XHQvLyBmYWRlZCBvdXQsIGRpc2FibGVcblx0XHRcdFx0XHRcdHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5fZWZmZWN0aXZlV2VpZ2h0ID0gd2VpZ2h0O1xuXHRcdHJldHVybiB3ZWlnaHQ7XG5cblx0fSxcblxuXHRfdXBkYXRlVGltZVNjYWxlOiBmdW5jdGlvbiggdGltZSApIHtcblxuXHRcdHZhciB0aW1lU2NhbGUgPSAwO1xuXG5cdFx0aWYgKCAhIHRoaXMucGF1c2VkICkge1xuXG5cdFx0XHR0aW1lU2NhbGUgPSB0aGlzLnRpbWVTY2FsZTtcblxuXHRcdFx0dmFyIGludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7XG5cblx0XHRcdGlmICggaW50ZXJwb2xhbnQgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0dmFyIGludGVycG9sYW50VmFsdWUgPSBpbnRlcnBvbGFudC5ldmFsdWF0ZSggdGltZSApWyAwIF07XG5cblx0XHRcdFx0dGltZVNjYWxlICo9IGludGVycG9sYW50VmFsdWU7XG5cblx0XHRcdFx0aWYgKCB0aW1lID4gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zWyAxIF0gKSB7XG5cblx0XHRcdFx0XHR0aGlzLnN0b3BXYXJwaW5nKCk7XG5cblx0XHRcdFx0XHRpZiAoIHRpbWVTY2FsZSA9PT0gMCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gbW90aW9uIGhhcyBoYWx0ZWQsIHBhdXNlXG5cdFx0XHRcdFx0XHR0aGlzLnBhdXNlZCA9IHRydWU7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHQvLyB3YXJwIGRvbmUgLSBhcHBseSBmaW5hbCB0aW1lIHNjYWxlXG5cdFx0XHRcdFx0XHR0aGlzLnRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcblx0XHRyZXR1cm4gdGltZVNjYWxlO1xuXG5cdH0sXG5cblx0X3VwZGF0ZVRpbWU6IGZ1bmN0aW9uKCBkZWx0YVRpbWUgKSB7XG5cblx0XHR2YXIgdGltZSA9IHRoaXMudGltZSArIGRlbHRhVGltZTtcblxuXHRcdGlmICggZGVsdGFUaW1lID09PSAwICkgcmV0dXJuIHRpbWU7XG5cblx0XHR2YXIgZHVyYXRpb24gPSB0aGlzLl9jbGlwLmR1cmF0aW9uLFxuXG5cdFx0XHRsb29wID0gdGhpcy5sb29wLFxuXHRcdFx0bG9vcENvdW50ID0gdGhpcy5fbG9vcENvdW50O1xuXG5cdFx0aWYgKCBsb29wID09PSBMb29wT25jZSApIHtcblxuXHRcdFx0aWYgKCBsb29wQ291bnQgPT09IC0xICkge1xuXHRcdFx0XHQvLyBqdXN0IHN0YXJ0ZWRcblxuXHRcdFx0XHR0aGlzLl9sb29wQ291bnQgPSAwO1xuXHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCB0cnVlLCB0cnVlLCBmYWxzZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGhhbmRsZV9zdG9wOiB7XG5cblx0XHRcdFx0aWYgKCB0aW1lID49IGR1cmF0aW9uICkge1xuXG5cdFx0XHRcdFx0dGltZSA9IGR1cmF0aW9uO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHRpbWUgPCAwICkge1xuXG5cdFx0XHRcdFx0dGltZSA9IDA7XG5cblx0XHRcdFx0fSBlbHNlIGJyZWFrIGhhbmRsZV9zdG9wO1xuXG5cdFx0XHRcdGlmICggdGhpcy5jbGFtcFdoZW5GaW5pc2hlZCApIHRoaXMucGF1c2VkID0gdHJ1ZTtcblx0XHRcdFx0ZWxzZSB0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblxuXHRcdFx0XHR0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KCB7XG5cdFx0XHRcdFx0dHlwZTogJ2ZpbmlzaGVkJywgYWN0aW9uOiB0aGlzLFxuXHRcdFx0XHRcdGRpcmVjdGlvbjogZGVsdGFUaW1lIDwgMCA/IC0xIDogMVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7IC8vIHJlcGV0aXRpdmUgUmVwZWF0IG9yIFBpbmdQb25nXG5cblx0XHRcdHZhciBwaW5nUG9uZyA9ICggbG9vcCA9PT0gTG9vcFBpbmdQb25nICk7XG5cblx0XHRcdGlmICggbG9vcENvdW50ID09PSAtMSApIHtcblx0XHRcdFx0Ly8ganVzdCBzdGFydGVkXG5cblx0XHRcdFx0aWYgKCBkZWx0YVRpbWUgPj0gMCApIHtcblxuXHRcdFx0XHRcdGxvb3BDb3VudCA9IDA7XG5cblx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKFxuXHRcdFx0XHRcdFx0XHR0cnVlLCB0aGlzLnJlcGV0aXRpb25zID09PSAwLCBwaW5nUG9uZyApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyB3aGVuIGxvb3BpbmcgaW4gcmV2ZXJzZSBkaXJlY3Rpb24sIHRoZSBpbml0aWFsXG5cdFx0XHRcdFx0Ly8gdHJhbnNpdGlvbiB0aHJvdWdoIHplcm8gY291bnRzIGFzIGEgcmVwZXRpdGlvbixcblx0XHRcdFx0XHQvLyBzbyBsZWF2ZSBsb29wQ291bnQgYXQgLTFcblxuXHRcdFx0XHRcdHRoaXMuX3NldEVuZGluZ3MoXG5cdFx0XHRcdFx0XHRcdHRoaXMucmVwZXRpdGlvbnMgPT09IDAsIHRydWUsIHBpbmdQb25nICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdGltZSA+PSBkdXJhdGlvbiB8fCB0aW1lIDwgMCApIHtcblx0XHRcdFx0Ly8gd3JhcCBhcm91bmRcblxuXHRcdFx0XHR2YXIgbG9vcERlbHRhID0gTWF0aC5mbG9vciggdGltZSAvIGR1cmF0aW9uICk7IC8vIHNpZ25lZFxuXHRcdFx0XHR0aW1lIC09IGR1cmF0aW9uICogbG9vcERlbHRhO1xuXG5cdFx0XHRcdGxvb3BDb3VudCArPSBNYXRoLmFicyggbG9vcERlbHRhICk7XG5cblx0XHRcdFx0dmFyIHBlbmRpbmcgPSB0aGlzLnJlcGV0aXRpb25zIC0gbG9vcENvdW50O1xuXG5cdFx0XHRcdGlmICggcGVuZGluZyA8IDAgKSB7XG5cdFx0XHRcdFx0Ly8gaGF2ZSB0byBzdG9wIChzd2l0Y2ggc3RhdGUsIGNsYW1wIHRpbWUsIGZpcmUgZXZlbnQpXG5cblx0XHRcdFx0XHRpZiAoIHRoaXMuY2xhbXBXaGVuRmluaXNoZWQgKSB0aGlzLnBhdXNlZCA9IHRydWU7XG5cdFx0XHRcdFx0ZWxzZSB0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRcdHRpbWUgPSBkZWx0YVRpbWUgPiAwID8gZHVyYXRpb24gOiAwO1xuXG5cdFx0XHRcdFx0dGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCgge1xuXHRcdFx0XHRcdFx0dHlwZTogJ2ZpbmlzaGVkJywgYWN0aW9uOiB0aGlzLFxuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBkZWx0YVRpbWUgPiAwID8gMSA6IC0xXG5cdFx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8ga2VlcCBydW5uaW5nXG5cblx0XHRcdFx0XHRpZiAoIHBlbmRpbmcgPT09IDAgKSB7XG5cdFx0XHRcdFx0XHQvLyBlbnRlcmluZyB0aGUgbGFzdCByb3VuZFxuXG5cdFx0XHRcdFx0XHR2YXIgYXRTdGFydCA9IGRlbHRhVGltZSA8IDA7XG5cdFx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCBhdFN0YXJ0LCAhIGF0U3RhcnQsIHBpbmdQb25nICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCBmYWxzZSwgZmFsc2UsIHBpbmdQb25nICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0aGlzLl9sb29wQ291bnQgPSBsb29wQ291bnQ7XG5cblx0XHRcdFx0XHR0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KCB7XG5cdFx0XHRcdFx0XHR0eXBlOiAnbG9vcCcsIGFjdGlvbjogdGhpcywgbG9vcERlbHRhOiBsb29wRGVsdGFcblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggcGluZ1BvbmcgJiYgKCBsb29wQ291bnQgJiAxICkgPT09IDEgKSB7XG5cdFx0XHRcdC8vIGludmVydCB0aW1lIGZvciB0aGUgXCJwb25nIHJvdW5kXCJcblxuXHRcdFx0XHR0aGlzLnRpbWUgPSB0aW1lO1xuXHRcdFx0XHRyZXR1cm4gZHVyYXRpb24gLSB0aW1lO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR0aGlzLnRpbWUgPSB0aW1lO1xuXHRcdHJldHVybiB0aW1lO1xuXG5cdH0sXG5cblx0X3NldEVuZGluZ3M6IGZ1bmN0aW9uKCBhdFN0YXJ0LCBhdEVuZCwgcGluZ1BvbmcgKSB7XG5cblx0XHR2YXIgc2V0dGluZ3MgPSB0aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzO1xuXG5cdFx0aWYgKCBwaW5nUG9uZyApIHtcblxuXHRcdFx0c2V0dGluZ3MuZW5kaW5nU3RhcnQgXHQ9IFplcm9TbG9wZUVuZGluZztcblx0XHRcdHNldHRpbmdzLmVuZGluZ0VuZFx0XHQ9IFplcm9TbG9wZUVuZGluZztcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGFzc3VtaW5nIGZvciBMb29wT25jZSBhdFN0YXJ0ID09IGF0RW5kID09IHRydWVcblxuXHRcdFx0aWYgKCBhdFN0YXJ0ICkge1xuXG5cdFx0XHRcdHNldHRpbmdzLmVuZGluZ1N0YXJ0ID0gdGhpcy56ZXJvU2xvcGVBdFN0YXJ0ID9cblx0XHRcdFx0XHRcdFplcm9TbG9wZUVuZGluZyA6IFplcm9DdXJ2YXR1cmVFbmRpbmc7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0c2V0dGluZ3MuZW5kaW5nU3RhcnQgPSBXcmFwQXJvdW5kRW5kaW5nO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggYXRFbmQgKSB7XG5cblx0XHRcdFx0c2V0dGluZ3MuZW5kaW5nRW5kID0gdGhpcy56ZXJvU2xvcGVBdEVuZCA/XG5cdFx0XHRcdFx0XHRaZXJvU2xvcGVFbmRpbmcgOiBaZXJvQ3VydmF0dXJlRW5kaW5nO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHNldHRpbmdzLmVuZGluZ0VuZCBcdCA9IFdyYXBBcm91bmRFbmRpbmc7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdF9zY2hlZHVsZUZhZGluZzogZnVuY3Rpb24oIGR1cmF0aW9uLCB3ZWlnaHROb3csIHdlaWdodFRoZW4gKSB7XG5cblx0XHR2YXIgbWl4ZXIgPSB0aGlzLl9taXhlciwgbm93ID0gbWl4ZXIudGltZSxcblx0XHRcdGludGVycG9sYW50ID0gdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7XG5cblx0XHRpZiAoIGludGVycG9sYW50ID09PSBudWxsICkge1xuXG5cdFx0XHRpbnRlcnBvbGFudCA9IG1peGVyLl9sZW5kQ29udHJvbEludGVycG9sYW50KCk7XG5cdFx0XHR0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IGludGVycG9sYW50O1xuXG5cdFx0fVxuXG5cdFx0dmFyIHRpbWVzID0gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zLFxuXHRcdFx0dmFsdWVzID0gaW50ZXJwb2xhbnQuc2FtcGxlVmFsdWVzO1xuXG5cdFx0dGltZXNbIDAgXSA9IG5vdzsgXHRcdFx0XHR2YWx1ZXNbIDAgXSA9IHdlaWdodE5vdztcblx0XHR0aW1lc1sgMSBdID0gbm93ICsgZHVyYXRpb247XHR2YWx1ZXNbIDEgXSA9IHdlaWdodFRoZW47XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKlxuICogUGxheWVyIGZvciBBbmltYXRpb25DbGlwcy5cbiAqXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIEFuaW1hdGlvbk1peGVyKCByb290ICkge1xuXG5cdHRoaXMuX3Jvb3QgPSByb290O1xuXHR0aGlzLl9pbml0TWVtb3J5TWFuYWdlcigpO1xuXHR0aGlzLl9hY2N1SW5kZXggPSAwO1xuXG5cdHRoaXMudGltZSA9IDA7XG5cblx0dGhpcy50aW1lU2NhbGUgPSAxLjA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQW5pbWF0aW9uTWl4ZXIucHJvdG90eXBlLCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlLCB7XG5cblx0X2JpbmRBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uLCBwcm90b3R5cGVBY3Rpb24gKSB7XG5cblx0XHR2YXIgcm9vdCA9IGFjdGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QsXG5cdFx0XHR0cmFja3MgPSBhY3Rpb24uX2NsaXAudHJhY2tzLFxuXHRcdFx0blRyYWNrcyA9IHRyYWNrcy5sZW5ndGgsXG5cdFx0XHRiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncyxcblx0XHRcdGludGVycG9sYW50cyA9IGFjdGlvbi5faW50ZXJwb2xhbnRzLFxuXHRcdFx0cm9vdFV1aWQgPSByb290LnV1aWQsXG5cdFx0XHRiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxcblx0XHRcdGJpbmRpbmdzQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHRpZiAoIGJpbmRpbmdzQnlOYW1lID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGJpbmRpbmdzQnlOYW1lID0ge307XG5cdFx0XHRiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXSA9IGJpbmRpbmdzQnlOYW1lO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuVHJhY2tzOyArKyBpICkge1xuXG5cdFx0XHR2YXIgdHJhY2sgPSB0cmFja3NbIGkgXSxcblx0XHRcdFx0dHJhY2tOYW1lID0gdHJhY2submFtZSxcblx0XHRcdFx0YmluZGluZyA9IGJpbmRpbmdzQnlOYW1lWyB0cmFja05hbWUgXTtcblxuXHRcdFx0aWYgKCBiaW5kaW5nICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0YmluZGluZ3NbIGkgXSA9IGJpbmRpbmc7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0YmluZGluZyA9IGJpbmRpbmdzWyBpIF07XG5cblx0XHRcdFx0aWYgKCBiaW5kaW5nICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBleGlzdGluZyBiaW5kaW5nLCBtYWtlIHN1cmUgdGhlIGNhY2hlIGtub3dzXG5cblx0XHRcdFx0XHRpZiAoIGJpbmRpbmcuX2NhY2hlSW5kZXggPT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHRcdCsrIGJpbmRpbmcucmVmZXJlbmNlQ291bnQ7XG5cdFx0XHRcdFx0XHR0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcsIHJvb3RVdWlkLCB0cmFja05hbWUgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgcGF0aCA9IHByb3RvdHlwZUFjdGlvbiAmJiBwcm90b3R5cGVBY3Rpb24uXG5cdFx0XHRcdFx0XHRfcHJvcGVydHlCaW5kaW5nc1sgaSBdLmJpbmRpbmcucGFyc2VkUGF0aDtcblxuXHRcdFx0XHRiaW5kaW5nID0gbmV3IFByb3BlcnR5TWl4ZXIoXG5cdFx0XHRcdFx0UHJvcGVydHlCaW5kaW5nLmNyZWF0ZSggcm9vdCwgdHJhY2tOYW1lLCBwYXRoICksXG5cdFx0XHRcdFx0dHJhY2suVmFsdWVUeXBlTmFtZSwgdHJhY2suZ2V0VmFsdWVTaXplKCkgKTtcblxuXHRcdFx0XHQrKyBiaW5kaW5nLnJlZmVyZW5jZUNvdW50O1xuXHRcdFx0XHR0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcsIHJvb3RVdWlkLCB0cmFja05hbWUgKTtcblxuXHRcdFx0XHRiaW5kaW5nc1sgaSBdID0gYmluZGluZztcblxuXHRcdFx0fVxuXG5cdFx0XHRpbnRlcnBvbGFudHNbIGkgXS5yZXN1bHRCdWZmZXIgPSBiaW5kaW5nLmJ1ZmZlcjtcblxuXHRcdH1cblxuXHR9LFxuXG5cdF9hY3RpdmF0ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHRpZiAoICEgdGhpcy5faXNBY3RpdmVBY3Rpb24oIGFjdGlvbiApICkge1xuXG5cdFx0XHRpZiAoIGFjdGlvbi5fY2FjaGVJbmRleCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHQvLyB0aGlzIGFjdGlvbiBoYXMgYmVlbiBmb3Jnb3R0ZW4gYnkgdGhlIGNhY2hlLCBidXQgdGhlIHVzZXJcblx0XHRcdFx0Ly8gYXBwZWFycyB0byBiZSBzdGlsbCB1c2luZyBpdCAtPiByZWJpbmRcblxuXHRcdFx0XHR2YXIgcm9vdFV1aWQgPSAoIGFjdGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QgKS51dWlkLFxuXHRcdFx0XHRcdGNsaXBVdWlkID0gYWN0aW9uLl9jbGlwLnV1aWQsXG5cdFx0XHRcdFx0YWN0aW9uc0ZvckNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xuXG5cdFx0XHRcdHRoaXMuX2JpbmRBY3Rpb24oIGFjdGlvbixcblx0XHRcdFx0XHRhY3Rpb25zRm9yQ2xpcCAmJiBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnNbIDAgXSApO1xuXG5cdFx0XHRcdHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKCBhY3Rpb24sIGNsaXBVdWlkLCByb290VXVpZCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncztcblxuXHRcdFx0Ly8gaW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudHMgLyBzb3J0IG91dCBzdGF0ZVxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHZhciBiaW5kaW5nID0gYmluZGluZ3NbIGkgXTtcblxuXHRcdFx0XHRpZiAoIGJpbmRpbmcudXNlQ291bnQgKysgPT09IDAgKSB7XG5cblx0XHRcdFx0XHR0aGlzLl9sZW5kQmluZGluZyggYmluZGluZyApO1xuXHRcdFx0XHRcdGJpbmRpbmcuc2F2ZU9yaWdpbmFsU3RhdGUoKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fbGVuZEFjdGlvbiggYWN0aW9uICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRfZGVhY3RpdmF0ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHRpZiAoIHRoaXMuX2lzQWN0aXZlQWN0aW9uKCBhY3Rpb24gKSApIHtcblxuXHRcdFx0dmFyIGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzO1xuXG5cdFx0XHQvLyBkZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50cyAvIHNvcnQgb3V0IHN0YXRlXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0dmFyIGJpbmRpbmcgPSBiaW5kaW5nc1sgaSBdO1xuXG5cdFx0XHRcdGlmICggLS0gYmluZGluZy51c2VDb3VudCA9PT0gMCApIHtcblxuXHRcdFx0XHRcdGJpbmRpbmcucmVzdG9yZU9yaWdpbmFsU3RhdGUoKTtcblx0XHRcdFx0XHR0aGlzLl90YWtlQmFja0JpbmRpbmcoIGJpbmRpbmcgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fdGFrZUJhY2tBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Ly8gTWVtb3J5IG1hbmFnZXJcblxuXHRfaW5pdE1lbW9yeU1hbmFnZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuX2FjdGlvbnMgPSBbXTsgLy8gJ25BY3RpdmVBY3Rpb25zJyBmb2xsb3dlZCBieSBpbmFjdGl2ZSBvbmVzXG5cdFx0dGhpcy5fbkFjdGl2ZUFjdGlvbnMgPSAwO1xuXG5cdFx0dGhpcy5fYWN0aW9uc0J5Q2xpcCA9IHt9O1xuXHRcdC8vIGluc2lkZTpcblx0XHQvLyB7XG5cdFx0Ly8gXHRcdGtub3duQWN0aW9uczogQXJyYXk8IEFuaW1hdGlvbkFjdGlvbiA+XHQtIHVzZWQgYXMgcHJvdG90eXBlc1xuXHRcdC8vIFx0XHRhY3Rpb25CeVJvb3Q6IEFuaW1hdGlvbkFjdGlvblx0XHRcdC0gbG9va3VwXG5cdFx0Ly8gfVxuXG5cblx0XHR0aGlzLl9iaW5kaW5ncyA9IFtdOyAvLyAnbkFjdGl2ZUJpbmRpbmdzJyBmb2xsb3dlZCBieSBpbmFjdGl2ZSBvbmVzXG5cdFx0dGhpcy5fbkFjdGl2ZUJpbmRpbmdzID0gMDtcblxuXHRcdHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSA9IHt9OyAvLyBpbnNpZGU6IE1hcDwgbmFtZSwgUHJvcGVydHlNaXhlciA+XG5cblxuXHRcdHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMgPSBbXTsgLy8gc2FtZSBnYW1lIGFzIGFib3ZlXG5cdFx0dGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMgPSAwO1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHRoaXMuc3RhdHMgPSB7XG5cblx0XHRcdGFjdGlvbnM6IHtcblx0XHRcdFx0Z2V0IHRvdGFsKCkgeyByZXR1cm4gc2NvcGUuX2FjdGlvbnMubGVuZ3RoOyB9LFxuXHRcdFx0XHRnZXQgaW5Vc2UoKSB7IHJldHVybiBzY29wZS5fbkFjdGl2ZUFjdGlvbnM7IH1cblx0XHRcdH0sXG5cdFx0XHRiaW5kaW5nczoge1xuXHRcdFx0XHRnZXQgdG90YWwoKSB7IHJldHVybiBzY29wZS5fYmluZGluZ3MubGVuZ3RoOyB9LFxuXHRcdFx0XHRnZXQgaW5Vc2UoKSB7IHJldHVybiBzY29wZS5fbkFjdGl2ZUJpbmRpbmdzOyB9XG5cdFx0XHR9LFxuXHRcdFx0Y29udHJvbEludGVycG9sYW50czoge1xuXHRcdFx0XHRnZXQgdG90YWwoKSB7IHJldHVybiBzY29wZS5fY29udHJvbEludGVycG9sYW50cy5sZW5ndGg7IH0sXG5cdFx0XHRcdGdldCBpblVzZSgpIHsgcmV0dXJuIHNjb3BlLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50czsgfVxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9LFxuXG5cdC8vIE1lbW9yeSBtYW5hZ2VtZW50IGZvciBBbmltYXRpb25BY3Rpb24gb2JqZWN0c1xuXG5cdF9pc0FjdGl2ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHR2YXIgaW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXg7XG5cdFx0cmV0dXJuIGluZGV4ICE9PSBudWxsICYmIGluZGV4IDwgdGhpcy5fbkFjdGl2ZUFjdGlvbnM7XG5cblx0fSxcblxuXHRfYWRkSW5hY3RpdmVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uLCBjbGlwVXVpZCwgcm9vdFV1aWQgKSB7XG5cblx0XHR2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcCxcblx0XHRcdGFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdGlmICggYWN0aW9uc0ZvckNsaXAgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0YWN0aW9uc0ZvckNsaXAgPSB7XG5cblx0XHRcdFx0a25vd25BY3Rpb25zOiBbIGFjdGlvbiBdLFxuXHRcdFx0XHRhY3Rpb25CeVJvb3Q6IHt9XG5cblx0XHRcdH07XG5cblx0XHRcdGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IDA7XG5cblx0XHRcdGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF0gPSBhY3Rpb25zRm9yQ2xpcDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHZhciBrbm93bkFjdGlvbnMgPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnM7XG5cblx0XHRcdGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IGtub3duQWN0aW9ucy5sZW5ndGg7XG5cdFx0XHRrbm93bkFjdGlvbnMucHVzaCggYWN0aW9uICk7XG5cblx0XHR9XG5cblx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBhY3Rpb25zLmxlbmd0aDtcblx0XHRhY3Rpb25zLnB1c2goIGFjdGlvbiApO1xuXG5cdFx0YWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290WyByb290VXVpZCBdID0gYWN0aW9uO1xuXG5cdH0sXG5cblx0X3JlbW92ZUluYWN0aXZlQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHtcblxuXHRcdHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdGxhc3RJbmFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGFjdGlvbnMubGVuZ3RoIC0gMSBdLFxuXHRcdFx0Y2FjaGVJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleDtcblxuXHRcdGxhc3RJbmFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IGNhY2hlSW5kZXg7XG5cdFx0YWN0aW9uc1sgY2FjaGVJbmRleCBdID0gbGFzdEluYWN0aXZlQWN0aW9uO1xuXHRcdGFjdGlvbnMucG9wKCk7XG5cblx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBudWxsO1xuXG5cblx0XHR2YXIgY2xpcFV1aWQgPSBhY3Rpb24uX2NsaXAudXVpZCxcblx0XHRcdGFjdGlvbnNCeUNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwLFxuXHRcdFx0YWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdLFxuXHRcdFx0a25vd25BY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9ucyxcblxuXHRcdFx0bGFzdEtub3duQWN0aW9uID1cblx0XHRcdFx0a25vd25BY3Rpb25zRm9yQ2xpcFsga25vd25BY3Rpb25zRm9yQ2xpcC5sZW5ndGggLSAxIF0sXG5cblx0XHRcdGJ5Q2xpcENhY2hlSW5kZXggPSBhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXg7XG5cblx0XHRsYXN0S25vd25BY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBieUNsaXBDYWNoZUluZGV4O1xuXHRcdGtub3duQWN0aW9uc0ZvckNsaXBbIGJ5Q2xpcENhY2hlSW5kZXggXSA9IGxhc3RLbm93bkFjdGlvbjtcblx0XHRrbm93bkFjdGlvbnNGb3JDbGlwLnBvcCgpO1xuXG5cdFx0YWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gbnVsbDtcblxuXG5cdFx0dmFyIGFjdGlvbkJ5Um9vdCA9IGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdCxcblx0XHRcdHJvb3RVdWlkID0gKCBhY3Rpb24uX2xvY2FsUm9vdCB8fCB0aGlzLl9yb290ICkudXVpZDtcblxuXHRcdGRlbGV0ZSBhY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHRpZiAoIGtub3duQWN0aW9uc0ZvckNsaXAubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRkZWxldGUgYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdH1cblxuXHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24oIGFjdGlvbiApO1xuXG5cdH0sXG5cblx0X3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0dmFyIGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzO1xuXHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dmFyIGJpbmRpbmcgPSBiaW5kaW5nc1sgaSBdO1xuXG5cdFx0XHRpZiAoIC0tIGJpbmRpbmcucmVmZXJlbmNlQ291bnQgPT09IDAgKSB7XG5cblx0XHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdF9sZW5kQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHtcblxuXHRcdC8vIFsgYWN0aXZlIGFjdGlvbnMgfCAgaW5hY3RpdmUgYWN0aW9ucyAgXVxuXHRcdC8vIFsgIGFjdGl2ZSBhY3Rpb25zID58IGluYWN0aXZlIGFjdGlvbnMgXVxuXHRcdC8vICAgICAgICAgICAgICAgICBzICAgICAgICBhXG5cdFx0Ly8gICAgICAgICAgICAgICAgICA8LXN3YXAtPlxuXHRcdC8vICAgICAgICAgICAgICAgICBhICAgICAgICBzXG5cblx0XHR2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRwcmV2SW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXgsXG5cblx0XHRcdGxhc3RBY3RpdmVJbmRleCA9IHRoaXMuX25BY3RpdmVBY3Rpb25zICsrLFxuXG5cdFx0XHRmaXJzdEluYWN0aXZlQWN0aW9uID0gYWN0aW9uc1sgbGFzdEFjdGl2ZUluZGV4IF07XG5cblx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBsYXN0QWN0aXZlSW5kZXg7XG5cdFx0YWN0aW9uc1sgbGFzdEFjdGl2ZUluZGV4IF0gPSBhY3Rpb247XG5cblx0XHRmaXJzdEluYWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gcHJldkluZGV4O1xuXHRcdGFjdGlvbnNbIHByZXZJbmRleCBdID0gZmlyc3RJbmFjdGl2ZUFjdGlvbjtcblxuXHR9LFxuXG5cdF90YWtlQmFja0FjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHQvLyBbICBhY3RpdmUgYWN0aW9ucyAgfCBpbmFjdGl2ZSBhY3Rpb25zIF1cblx0XHQvLyBbIGFjdGl2ZSBhY3Rpb25zIHw8IGluYWN0aXZlIGFjdGlvbnMgIF1cblx0XHQvLyAgICAgICAgYSAgICAgICAgc1xuXHRcdC8vICAgICAgICAgPC1zd2FwLT5cblx0XHQvLyAgICAgICAgcyAgICAgICAgYVxuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0cHJldkluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4LFxuXG5cdFx0XHRmaXJzdEluYWN0aXZlSW5kZXggPSAtLSB0aGlzLl9uQWN0aXZlQWN0aW9ucyxcblxuXHRcdFx0bGFzdEFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGZpcnN0SW5hY3RpdmVJbmRleCBdO1xuXG5cdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gZmlyc3RJbmFjdGl2ZUluZGV4O1xuXHRcdGFjdGlvbnNbIGZpcnN0SW5hY3RpdmVJbmRleCBdID0gYWN0aW9uO1xuXG5cdFx0bGFzdEFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcblx0XHRhY3Rpb25zWyBwcmV2SW5kZXggXSA9IGxhc3RBY3RpdmVBY3Rpb247XG5cblx0fSxcblxuXHQvLyBNZW1vcnkgbWFuYWdlbWVudCBmb3IgUHJvcGVydHlNaXhlciBvYmplY3RzXG5cblx0X2FkZEluYWN0aXZlQmluZGluZzogZnVuY3Rpb24gKCBiaW5kaW5nLCByb290VXVpZCwgdHJhY2tOYW1lICkge1xuXG5cdFx0dmFyIGJpbmRpbmdzQnlSb290ID0gdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLFxuXHRcdFx0YmluZGluZ0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdLFxuXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xuXG5cdFx0aWYgKCBiaW5kaW5nQnlOYW1lID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGJpbmRpbmdCeU5hbWUgPSB7fTtcblx0XHRcdGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdID0gYmluZGluZ0J5TmFtZTtcblxuXHRcdH1cblxuXHRcdGJpbmRpbmdCeU5hbWVbIHRyYWNrTmFtZSBdID0gYmluZGluZztcblxuXHRcdGJpbmRpbmcuX2NhY2hlSW5kZXggPSBiaW5kaW5ncy5sZW5ndGg7XG5cdFx0YmluZGluZ3MucHVzaCggYmluZGluZyApO1xuXG5cdH0sXG5cblx0X3JlbW92ZUluYWN0aXZlQmluZGluZzogZnVuY3Rpb24gKCBiaW5kaW5nICkge1xuXG5cdFx0dmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRwcm9wQmluZGluZyA9IGJpbmRpbmcuYmluZGluZyxcblx0XHRcdHJvb3RVdWlkID0gcHJvcEJpbmRpbmcucm9vdE5vZGUudXVpZCxcblx0XHRcdHRyYWNrTmFtZSA9IHByb3BCaW5kaW5nLnBhdGgsXG5cdFx0XHRiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxcblx0XHRcdGJpbmRpbmdCeU5hbWUgPSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXSxcblxuXHRcdFx0bGFzdEluYWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBiaW5kaW5ncy5sZW5ndGggLSAxIF0sXG5cdFx0XHRjYWNoZUluZGV4ID0gYmluZGluZy5fY2FjaGVJbmRleDtcblxuXHRcdGxhc3RJbmFjdGl2ZUJpbmRpbmcuX2NhY2hlSW5kZXggPSBjYWNoZUluZGV4O1xuXHRcdGJpbmRpbmdzWyBjYWNoZUluZGV4IF0gPSBsYXN0SW5hY3RpdmVCaW5kaW5nO1xuXHRcdGJpbmRpbmdzLnBvcCgpO1xuXG5cdFx0ZGVsZXRlIGJpbmRpbmdCeU5hbWVbIHRyYWNrTmFtZSBdO1xuXG5cdFx0cmVtb3ZlX2VtcHR5X21hcDoge1xuXG5cdFx0XHRmb3IgKCB2YXIgXyBpbiBiaW5kaW5nQnlOYW1lICkgYnJlYWsgcmVtb3ZlX2VtcHR5X21hcDtcblxuXHRcdFx0ZGVsZXRlIGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0X2xlbmRCaW5kaW5nOiBmdW5jdGlvbiAoIGJpbmRpbmcgKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdHByZXZJbmRleCA9IGJpbmRpbmcuX2NhY2hlSW5kZXgsXG5cblx0XHRcdGxhc3RBY3RpdmVJbmRleCA9IHRoaXMuX25BY3RpdmVCaW5kaW5ncyArKyxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUJpbmRpbmcgPSBiaW5kaW5nc1sgbGFzdEFjdGl2ZUluZGV4IF07XG5cblx0XHRiaW5kaW5nLl9jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4O1xuXHRcdGJpbmRpbmdzWyBsYXN0QWN0aXZlSW5kZXggXSA9IGJpbmRpbmc7XG5cblx0XHRmaXJzdEluYWN0aXZlQmluZGluZy5fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcblx0XHRiaW5kaW5nc1sgcHJldkluZGV4IF0gPSBmaXJzdEluYWN0aXZlQmluZGluZztcblxuXHR9LFxuXG5cdF90YWtlQmFja0JpbmRpbmc6IGZ1bmN0aW9uICggYmluZGluZyApIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0cHJldkluZGV4ID0gYmluZGluZy5fY2FjaGVJbmRleCxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUluZGV4ID0gLS0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzLFxuXG5cdFx0XHRsYXN0QWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBmaXJzdEluYWN0aXZlSW5kZXggXTtcblxuXHRcdGJpbmRpbmcuX2NhY2hlSW5kZXggPSBmaXJzdEluYWN0aXZlSW5kZXg7XG5cdFx0YmluZGluZ3NbIGZpcnN0SW5hY3RpdmVJbmRleCBdID0gYmluZGluZztcblxuXHRcdGxhc3RBY3RpdmVCaW5kaW5nLl9jYWNoZUluZGV4ID0gcHJldkluZGV4O1xuXHRcdGJpbmRpbmdzWyBwcmV2SW5kZXggXSA9IGxhc3RBY3RpdmVCaW5kaW5nO1xuXG5cdH0sXG5cblxuXHQvLyBNZW1vcnkgbWFuYWdlbWVudCBvZiBJbnRlcnBvbGFudHMgZm9yIHdlaWdodCBhbmQgdGltZSBzY2FsZVxuXG5cdF9sZW5kQ29udHJvbEludGVycG9sYW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW50ZXJwb2xhbnRzID0gdGhpcy5fY29udHJvbEludGVycG9sYW50cyxcblx0XHRcdGxhc3RBY3RpdmVJbmRleCA9IHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzICsrLFxuXHRcdFx0aW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudHNbIGxhc3RBY3RpdmVJbmRleCBdO1xuXG5cdFx0aWYgKCBpbnRlcnBvbGFudCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpbnRlcnBvbGFudCA9IG5ldyBMaW5lYXJJbnRlcnBvbGFudChcblx0XHRcdFx0bmV3IEZsb2F0MzJBcnJheSggMiApLCBuZXcgRmxvYXQzMkFycmF5KCAyICksXG5cdFx0XHRcdDEsIHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXIgKTtcblxuXHRcdFx0aW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4O1xuXHRcdFx0aW50ZXJwb2xhbnRzWyBsYXN0QWN0aXZlSW5kZXggXSA9IGludGVycG9sYW50O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGludGVycG9sYW50O1xuXG5cdH0sXG5cblx0X3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50OiBmdW5jdGlvbiAoIGludGVycG9sYW50ICkge1xuXG5cdFx0dmFyIGludGVycG9sYW50cyA9IHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsXG5cdFx0XHRwcmV2SW5kZXggPSBpbnRlcnBvbGFudC5fX2NhY2hlSW5kZXgsXG5cblx0XHRcdGZpcnN0SW5hY3RpdmVJbmRleCA9IC0tIHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzLFxuXG5cdFx0XHRsYXN0QWN0aXZlSW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudHNbIGZpcnN0SW5hY3RpdmVJbmRleCBdO1xuXG5cdFx0aW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gZmlyc3RJbmFjdGl2ZUluZGV4O1xuXHRcdGludGVycG9sYW50c1sgZmlyc3RJbmFjdGl2ZUluZGV4IF0gPSBpbnRlcnBvbGFudDtcblxuXHRcdGxhc3RBY3RpdmVJbnRlcnBvbGFudC5fX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XG5cdFx0aW50ZXJwb2xhbnRzWyBwcmV2SW5kZXggXSA9IGxhc3RBY3RpdmVJbnRlcnBvbGFudDtcblxuXHR9LFxuXG5cdF9jb250cm9sSW50ZXJwb2xhbnRzUmVzdWx0QnVmZmVyOiBuZXcgRmxvYXQzMkFycmF5KCAxICksXG5cblx0Ly8gcmV0dXJuIGFuIGFjdGlvbiBmb3IgYSBjbGlwIG9wdGlvbmFsbHkgdXNpbmcgYSBjdXN0b20gcm9vdCB0YXJnZXRcblx0Ly8gb2JqZWN0ICh0aGlzIG1ldGhvZCBhbGxvY2F0ZXMgYSBsb3Qgb2YgZHluYW1pYyBtZW1vcnkgaW4gY2FzZSBhXG5cdC8vIHByZXZpb3VzbHkgdW5rbm93biBjbGlwL3Jvb3QgY29tYmluYXRpb24gaXMgc3BlY2lmaWVkKVxuXHRjbGlwQWN0aW9uOiBmdW5jdGlvbiAoIGNsaXAsIG9wdGlvbmFsUm9vdCApIHtcblxuXHRcdHZhciByb290ID0gb3B0aW9uYWxSb290IHx8IHRoaXMuX3Jvb3QsXG5cdFx0XHRyb290VXVpZCA9IHJvb3QudXVpZCxcblxuXHRcdFx0Y2xpcE9iamVjdCA9IHR5cGVvZiBjbGlwID09PSAnc3RyaW5nJyA/XG5cdFx0XHRcdEFuaW1hdGlvbkNsaXAuZmluZEJ5TmFtZSggcm9vdCwgY2xpcCApIDogY2xpcCxcblxuXHRcdFx0Y2xpcFV1aWQgPSBjbGlwT2JqZWN0ICE9PSBudWxsID8gY2xpcE9iamVjdC51dWlkIDogY2xpcCxcblxuXHRcdFx0YWN0aW9uc0ZvckNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdLFxuXHRcdFx0cHJvdG90eXBlQWN0aW9uID0gbnVsbDtcblxuXHRcdGlmICggYWN0aW9uc0ZvckNsaXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIGV4aXN0aW5nQWN0aW9uID1cblx0XHRcdFx0XHRhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHRcdGlmICggZXhpc3RpbmdBY3Rpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gZXhpc3RpbmdBY3Rpb247XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gd2Uga25vdyB0aGUgY2xpcCwgc28gd2UgZG9uJ3QgaGF2ZSB0byBwYXJzZSBhbGxcblx0XHRcdC8vIHRoZSBiaW5kaW5ncyBhZ2FpbiBidXQgY2FuIGp1c3QgY29weVxuXHRcdFx0cHJvdG90eXBlQWN0aW9uID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zWyAwIF07XG5cblx0XHRcdC8vIGFsc28sIHRha2UgdGhlIGNsaXAgZnJvbSB0aGUgcHJvdG90eXBlIGFjdGlvblxuXHRcdFx0aWYgKCBjbGlwT2JqZWN0ID09PSBudWxsIClcblx0XHRcdFx0Y2xpcE9iamVjdCA9IHByb3RvdHlwZUFjdGlvbi5fY2xpcDtcblxuXHRcdH1cblxuXHRcdC8vIGNsaXAgbXVzdCBiZSBrbm93biB3aGVuIHNwZWNpZmllZCB2aWEgc3RyaW5nXG5cdFx0aWYgKCBjbGlwT2JqZWN0ID09PSBudWxsICkgcmV0dXJuIG51bGw7XG5cblx0XHQvLyBhbGxvY2F0ZSBhbGwgcmVzb3VyY2VzIHJlcXVpcmVkIHRvIHJ1biBpdFxuXHRcdHZhciBuZXdBY3Rpb24gPSBuZXcgQW5pbWF0aW9uQWN0aW9uKCB0aGlzLCBjbGlwT2JqZWN0LCBvcHRpb25hbFJvb3QgKTtcblxuXHRcdHRoaXMuX2JpbmRBY3Rpb24oIG5ld0FjdGlvbiwgcHJvdG90eXBlQWN0aW9uICk7XG5cblx0XHQvLyBhbmQgbWFrZSB0aGUgYWN0aW9uIGtub3duIHRvIHRoZSBtZW1vcnkgbWFuYWdlclxuXHRcdHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKCBuZXdBY3Rpb24sIGNsaXBVdWlkLCByb290VXVpZCApO1xuXG5cdFx0cmV0dXJuIG5ld0FjdGlvbjtcblxuXHR9LFxuXG5cdC8vIGdldCBhbiBleGlzdGluZyBhY3Rpb25cblx0ZXhpc3RpbmdBY3Rpb246IGZ1bmN0aW9uICggY2xpcCwgb3B0aW9uYWxSb290ICkge1xuXG5cdFx0dmFyIHJvb3QgPSBvcHRpb25hbFJvb3QgfHwgdGhpcy5fcm9vdCxcblx0XHRcdHJvb3RVdWlkID0gcm9vdC51dWlkLFxuXG5cdFx0XHRjbGlwT2JqZWN0ID0gdHlwZW9mIGNsaXAgPT09ICdzdHJpbmcnID9cblx0XHRcdFx0QW5pbWF0aW9uQ2xpcC5maW5kQnlOYW1lKCByb290LCBjbGlwICkgOiBjbGlwLFxuXG5cdFx0XHRjbGlwVXVpZCA9IGNsaXBPYmplY3QgPyBjbGlwT2JqZWN0LnV1aWQgOiBjbGlwLFxuXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHRpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHJldHVybiBhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF0gfHwgbnVsbDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdH0sXG5cblx0Ly8gZGVhY3RpdmF0ZXMgYWxsIHByZXZpb3VzbHkgc2NoZWR1bGVkIGFjdGlvbnNcblx0c3RvcEFsbEFjdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0bkFjdGlvbnMgPSB0aGlzLl9uQWN0aXZlQWN0aW9ucyxcblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRuQmluZGluZ3MgPSB0aGlzLl9uQWN0aXZlQmluZGluZ3M7XG5cblx0XHR0aGlzLl9uQWN0aXZlQWN0aW9ucyA9IDA7XG5cdFx0dGhpcy5fbkFjdGl2ZUJpbmRpbmdzID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbkFjdGlvbnM7ICsrIGkgKSB7XG5cblx0XHRcdGFjdGlvbnNbIGkgXS5yZXNldCgpO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuQmluZGluZ3M7ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0udXNlQ291bnQgPSAwO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBhZHZhbmNlIHRoZSB0aW1lIGFuZCB1cGRhdGUgYXBwbHkgdGhlIGFuaW1hdGlvblxuXHR1cGRhdGU6IGZ1bmN0aW9uICggZGVsdGFUaW1lICkge1xuXG5cdFx0ZGVsdGFUaW1lICo9IHRoaXMudGltZVNjYWxlO1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0bkFjdGlvbnMgPSB0aGlzLl9uQWN0aXZlQWN0aW9ucyxcblxuXHRcdFx0dGltZSA9IHRoaXMudGltZSArPSBkZWx0YVRpbWUsXG5cdFx0XHR0aW1lRGlyZWN0aW9uID0gTWF0aC5zaWduKCBkZWx0YVRpbWUgKSxcblxuXHRcdFx0YWNjdUluZGV4ID0gdGhpcy5fYWNjdUluZGV4IF49IDE7XG5cblx0XHQvLyBydW4gYWN0aXZlIGFjdGlvbnNcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbkFjdGlvbnM7ICsrIGkgKSB7XG5cblx0XHRcdHZhciBhY3Rpb24gPSBhY3Rpb25zWyBpIF07XG5cblx0XHRcdGFjdGlvbi5fdXBkYXRlKCB0aW1lLCBkZWx0YVRpbWUsIHRpbWVEaXJlY3Rpb24sIGFjY3VJbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXBkYXRlIHNjZW5lIGdyYXBoXG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdG5CaW5kaW5ncyA9IHRoaXMuX25BY3RpdmVCaW5kaW5ncztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbkJpbmRpbmdzOyArKyBpICkge1xuXG5cdFx0XHRiaW5kaW5nc1sgaSBdLmFwcGx5KCBhY2N1SW5kZXggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gcmV0dXJuIHRoaXMgbWl4ZXIncyByb290IHRhcmdldCBvYmplY3Rcblx0Z2V0Um9vdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3Jvb3Q7XG5cblx0fSxcblxuXHQvLyBmcmVlIGFsbCByZXNvdXJjZXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIGNsaXBcblx0dW5jYWNoZUNsaXA6IGZ1bmN0aW9uICggY2xpcCApIHtcblxuXHRcdHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdGNsaXBVdWlkID0gY2xpcC51dWlkLFxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHRpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIG5vdGU6IGp1c3QgY2FsbGluZyBfcmVtb3ZlSW5hY3RpdmVBY3Rpb24gd291bGQgbWVzcyB1cCB0aGVcblx0XHRcdC8vIGl0ZXJhdGlvbiBzdGF0ZSBhbmQgYWxzbyByZXF1aXJlIHVwZGF0aW5nIHRoZSBzdGF0ZSB3ZSBjYW5cblx0XHRcdC8vIGp1c3QgdGhyb3cgYXdheVxuXG5cdFx0XHR2YXIgYWN0aW9uc1RvUmVtb3ZlID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBhY3Rpb25zVG9SZW1vdmUubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHZhciBhY3Rpb24gPSBhY3Rpb25zVG9SZW1vdmVbIGkgXTtcblxuXHRcdFx0XHR0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdFx0XHR2YXIgY2FjaGVJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleCxcblx0XHRcdFx0XHRsYXN0SW5hY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBhY3Rpb25zLmxlbmd0aCAtIDEgXTtcblxuXHRcdFx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBudWxsO1xuXHRcdFx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBudWxsO1xuXG5cdFx0XHRcdGxhc3RJbmFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IGNhY2hlSW5kZXg7XG5cdFx0XHRcdGFjdGlvbnNbIGNhY2hlSW5kZXggXSA9IGxhc3RJbmFjdGl2ZUFjdGlvbjtcblx0XHRcdFx0YWN0aW9ucy5wb3AoKTtcblxuXHRcdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRkZWxldGUgYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIGZyZWUgYWxsIHJlc291cmNlcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgcm9vdCB0YXJnZXQgb2JqZWN0XG5cdHVuY2FjaGVSb290OiBmdW5jdGlvbiAoIHJvb3QgKSB7XG5cblx0XHR2YXIgcm9vdFV1aWQgPSByb290LnV1aWQsXG5cdFx0XHRhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcDtcblxuXHRcdGZvciAoIHZhciBjbGlwVXVpZCBpbiBhY3Rpb25zQnlDbGlwICkge1xuXG5cdFx0XHR2YXIgYWN0aW9uQnlSb290ID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXS5hY3Rpb25CeVJvb3QsXG5cdFx0XHRcdGFjdGlvbiA9IGFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXTtcblxuXHRcdFx0aWYgKCBhY3Rpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKTtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgYmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsXG5cdFx0XHRiaW5kaW5nQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHRpZiAoIGJpbmRpbmdCeU5hbWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggdmFyIHRyYWNrTmFtZSBpbiBiaW5kaW5nQnlOYW1lICkge1xuXG5cdFx0XHRcdHZhciBiaW5kaW5nID0gYmluZGluZ0J5TmFtZVsgdHJhY2tOYW1lIF07XG5cdFx0XHRcdGJpbmRpbmcucmVzdG9yZU9yaWdpbmFsU3RhdGUoKTtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIHJlbW92ZSBhIHRhcmdldGVkIGNsaXAgZnJvbSB0aGUgY2FjaGVcblx0dW5jYWNoZUFjdGlvbjogZnVuY3Rpb24gKCBjbGlwLCBvcHRpb25hbFJvb3QgKSB7XG5cblx0XHR2YXIgYWN0aW9uID0gdGhpcy5leGlzdGluZ0FjdGlvbiggY2xpcCwgb3B0aW9uYWxSb290ICk7XG5cblx0XHRpZiAoIGFjdGlvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5fZGVhY3RpdmF0ZUFjdGlvbiggYWN0aW9uICk7XG5cdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUFjdGlvbiggYWN0aW9uICk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBVbmlmb3JtKCB2YWx1ZSApIHtcblxuXHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Vbmlmb3JtOiBUeXBlIHBhcmFtZXRlciBpcyBubyBsb25nZXIgbmVlZGVkLicgKTtcblx0XHR2YWx1ZSA9IGFyZ3VtZW50c1sgMSBdO1xuXG5cdH1cblxuXHR0aGlzLnZhbHVlID0gdmFsdWU7XG5cbn1cblxuVW5pZm9ybS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0cmV0dXJuIG5ldyBVbmlmb3JtKCB0aGlzLnZhbHVlLmNsb25lID09PSB1bmRlZmluZWQgPyB0aGlzLnZhbHVlIDogdGhpcy52YWx1ZS5jbG9uZSgpICk7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKi9cblxuZnVuY3Rpb24gSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkoKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSc7XG5cdHRoaXMubWF4SW5zdGFuY2VkQ291bnQgPSB1bmRlZmluZWQ7XG5cbn1cblxuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnksXG5cblx0aXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeTogdHJ1ZSxcblxuXHRhZGRHcm91cDogZnVuY3Rpb24gKCBzdGFydCwgY291bnQsIG1hdGVyaWFsSW5kZXggKSB7XG5cblx0XHR0aGlzLmdyb3Vwcy5wdXNoKCB7XG5cblx0XHRcdHN0YXJ0OiBzdGFydCxcblx0XHRcdGNvdW50OiBjb3VudCxcblx0XHRcdG1hdGVyaWFsSW5kZXg6IG1hdGVyaWFsSW5kZXhcblxuXHRcdH0gKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dmFyIGluZGV4ID0gc291cmNlLmluZGV4O1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5zZXRJbmRleCggaW5kZXguY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBzb3VyY2UuYXR0cmlidXRlcztcblxuXHRcdGZvciAoIHZhciBuYW1lIGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBuYW1lIF07XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggbmFtZSwgYXR0cmlidXRlLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdHZhciBncm91cHMgPSBzb3VyY2UuZ3JvdXBzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgaSBdO1xuXHRcdFx0dGhpcy5hZGRHcm91cCggZ3JvdXAuc3RhcnQsIGdyb3VwLmNvdW50LCBncm91cC5tYXRlcmlhbEluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqL1xuXG5mdW5jdGlvbiBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSggaW50ZXJsZWF2ZWRCdWZmZXIsIGl0ZW1TaXplLCBvZmZzZXQsIG5vcm1hbGl6ZWQgKSB7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy5kYXRhID0gaW50ZXJsZWF2ZWRCdWZmZXI7XG5cdHRoaXMuaXRlbVNpemUgPSBpdGVtU2l6ZTtcblx0dGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG5cblx0dGhpcy5ub3JtYWxpemVkID0gbm9ybWFsaXplZCA9PT0gdHJ1ZTtcblxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCB7XG5cblx0Y291bnQ6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5kYXRhLmNvdW50O1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0YXJyYXk6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5O1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHtcblxuXHRpc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlOiB0cnVlLFxuXG5cdHNldFg6IGZ1bmN0aW9uICggaW5kZXgsIHggKSB7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0IF0gPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRZOiBmdW5jdGlvbiAoIGluZGV4LCB5ICkge1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFo6IGZ1bmN0aW9uICggaW5kZXgsIHogKSB7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMiBdID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0VzogZnVuY3Rpb24gKCBpbmRleCwgdyApIHtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAzIF0gPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRYOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgXTtcblxuXHR9LFxuXG5cdGdldFk6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDEgXTtcblxuXHR9LFxuXG5cdGdldFo6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDIgXTtcblxuXHR9LFxuXG5cdGdldFc6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDMgXTtcblxuXHR9LFxuXG5cdHNldFhZOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5ICkge1xuXG5cdFx0aW5kZXggPSBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldDtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYWVo6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHksIHogKSB7XG5cblx0XHRpbmRleCA9IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0O1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDIgXSA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZWlc6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHksIHosIHcgKSB7XG5cblx0XHRpbmRleCA9IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0O1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDIgXSA9IHo7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqL1xuXG5mdW5jdGlvbiBJbnRlcmxlYXZlZEJ1ZmZlciggYXJyYXksIHN0cmlkZSApIHtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLmFycmF5ID0gYXJyYXk7XG5cdHRoaXMuc3RyaWRlID0gc3RyaWRlO1xuXHR0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIHN0cmlkZSA6IDA7XG5cblx0dGhpcy5keW5hbWljID0gZmFsc2U7XG5cdHRoaXMudXBkYXRlUmFuZ2UgPSB7IG9mZnNldDogMCwgY291bnQ6IC0gMSB9O1xuXG5cdHRoaXMub25VcGxvYWRDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9O1xuXG5cdHRoaXMudmVyc2lvbiA9IDA7XG5cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KCBJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUsICduZWVkc1VwZGF0ZScsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHZhbHVlID09PSB0cnVlICkgdGhpcy52ZXJzaW9uICsrO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUsIHtcblxuXHRpc0ludGVybGVhdmVkQnVmZmVyOiB0cnVlLFxuXG5cdHNldEFycmF5OiBmdW5jdGlvbiAoIGFycmF5ICkge1xuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCBhcnJheSApICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIHRoaXMuc3RyaWRlIDogMDtcblx0XHR0aGlzLmFycmF5ID0gYXJyYXk7XG5cblx0fSxcblxuXHRzZXREeW5hbWljOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5keW5hbWljID0gdmFsdWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5hcnJheSA9IG5ldyBzb3VyY2UuYXJyYXkuY29uc3RydWN0b3IoIHNvdXJjZS5hcnJheSApO1xuXHRcdHRoaXMuY291bnQgPSBzb3VyY2UuY291bnQ7XG5cdFx0dGhpcy5zdHJpZGUgPSBzb3VyY2Uuc3RyaWRlO1xuXHRcdHRoaXMuZHluYW1pYyA9IHNvdXJjZS5keW5hbWljO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5QXQ6IGZ1bmN0aW9uICggaW5kZXgxLCBhdHRyaWJ1dGUsIGluZGV4MiApIHtcblxuXHRcdGluZGV4MSAqPSB0aGlzLnN0cmlkZTtcblx0XHRpbmRleDIgKj0gYXR0cmlidXRlLnN0cmlkZTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuc3RyaWRlOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5hcnJheVsgaW5kZXgxICsgaSBdID0gYXR0cmlidXRlLmFycmF5WyBpbmRleDIgKyBpIF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLmFycmF5LnNldCggdmFsdWUsIG9mZnNldCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0b25VcGxvYWQ6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHR0aGlzLm9uVXBsb2FkQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtc1xuICovXG5cbmZ1bmN0aW9uIEluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyKCBhcnJheSwgc3RyaWRlLCBtZXNoUGVyQXR0cmlidXRlICkge1xuXG5cdEludGVybGVhdmVkQnVmZmVyLmNhbGwoIHRoaXMsIGFycmF5LCBzdHJpZGUgKTtcblxuXHR0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBtZXNoUGVyQXR0cmlidXRlIHx8IDE7XG5cbn1cblxuSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggSW50ZXJsZWF2ZWRCdWZmZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIsXG5cblx0aXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcjogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5tZXNoUGVyQXR0cmlidXRlID0gc291cmNlLm1lc2hQZXJBdHRyaWJ1dGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqL1xuXG5mdW5jdGlvbiBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbWVzaFBlckF0dHJpYnV0ZSApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgYXJyYXksIGl0ZW1TaXplICk7XG5cblx0dGhpcy5tZXNoUGVyQXR0cmlidXRlID0gbWVzaFBlckF0dHJpYnV0ZSB8fCAxO1xuXG59XG5cbkluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlLFxuXG5cdGlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5tZXNoUGVyQXR0cmlidXRlID0gc291cmNlLm1lc2hQZXJBdHRyaWJ1dGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3Igc3RlcGhvbWkgLyBodHRwOi8vc3RlcGhhbmVnaW5pZXIuY29tL1xuICovXG5cbmZ1bmN0aW9uIFJheWNhc3Rlciggb3JpZ2luLCBkaXJlY3Rpb24sIG5lYXIsIGZhciApIHtcblxuXHR0aGlzLnJheSA9IG5ldyBSYXkoIG9yaWdpbiwgZGlyZWN0aW9uICk7XG5cdC8vIGRpcmVjdGlvbiBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWQgKGZvciBhY2N1cmF0ZSBkaXN0YW5jZSBjYWxjdWxhdGlvbnMpXG5cblx0dGhpcy5uZWFyID0gbmVhciB8fCAwO1xuXHR0aGlzLmZhciA9IGZhciB8fCBJbmZpbml0eTtcblxuXHR0aGlzLnBhcmFtcyA9IHtcblx0XHRNZXNoOiB7fSxcblx0XHRMaW5lOiB7fSxcblx0XHRMT0Q6IHt9LFxuXHRcdFBvaW50czogeyB0aHJlc2hvbGQ6IDEgfSxcblx0XHRTcHJpdGU6IHt9XG5cdH07XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIHRoaXMucGFyYW1zLCB7XG5cdFx0UG9pbnRDbG91ZDoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheWNhc3RlcjogcGFyYW1zLlBvaW50Q2xvdWQgaGFzIGJlZW4gcmVuYW1lZCB0byBwYXJhbXMuUG9pbnRzLicgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuUG9pbnRzO1xuXHRcdFx0fVxuXHRcdH1cblx0fSApO1xuXG59XG5cbmZ1bmN0aW9uIGFzY1NvcnQoIGEsIGIgKSB7XG5cblx0cmV0dXJuIGEuZGlzdGFuY2UgLSBiLmRpc3RhbmNlO1xuXG59XG5cbmZ1bmN0aW9uIGludGVyc2VjdE9iamVjdCggb2JqZWN0LCByYXljYXN0ZXIsIGludGVyc2VjdHMsIHJlY3Vyc2l2ZSApIHtcblxuXHRpZiAoIG9iamVjdC52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRvYmplY3QucmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICk7XG5cblx0aWYgKCByZWN1cnNpdmUgPT09IHRydWUgKSB7XG5cblx0XHR2YXIgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRpbnRlcnNlY3RPYmplY3QoIGNoaWxkcmVuWyBpIF0sIHJheWNhc3RlciwgaW50ZXJzZWN0cywgdHJ1ZSApO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5PYmplY3QuYXNzaWduKCBSYXljYXN0ZXIucHJvdG90eXBlLCB7XG5cblx0bGluZVByZWNpc2lvbjogMSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggb3JpZ2luLCBkaXJlY3Rpb24gKSB7XG5cblx0XHQvLyBkaXJlY3Rpb24gaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkIChmb3IgYWNjdXJhdGUgZGlzdGFuY2UgY2FsY3VsYXRpb25zKVxuXG5cdFx0dGhpcy5yYXkuc2V0KCBvcmlnaW4sIGRpcmVjdGlvbiApO1xuXG5cdH0sXG5cblx0c2V0RnJvbUNhbWVyYTogZnVuY3Rpb24gKCBjb29yZHMsIGNhbWVyYSApIHtcblxuXHRcdGlmICggKCBjYW1lcmEgJiYgY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEgKSApIHtcblxuXHRcdFx0dGhpcy5yYXkub3JpZ2luLnNldEZyb21NYXRyaXhQb3NpdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cdFx0XHR0aGlzLnJheS5kaXJlY3Rpb24uc2V0KCBjb29yZHMueCwgY29vcmRzLnksIDAuNSApLnVucHJvamVjdCggY2FtZXJhICkuc3ViKCB0aGlzLnJheS5vcmlnaW4gKS5ub3JtYWxpemUoKTtcblxuXHRcdH0gZWxzZSBpZiAoICggY2FtZXJhICYmIGNhbWVyYS5pc09ydGhvZ3JhcGhpY0NhbWVyYSApICkge1xuXG5cdFx0XHR0aGlzLnJheS5vcmlnaW4uc2V0KCBjb29yZHMueCwgY29vcmRzLnksICggY2FtZXJhLm5lYXIgKyBjYW1lcmEuZmFyICkgLyAoIGNhbWVyYS5uZWFyIC0gY2FtZXJhLmZhciApICkudW5wcm9qZWN0KCBjYW1lcmEgKTsgLy8gc2V0IG9yaWdpbiBpbiBwbGFuZSBvZiBjYW1lcmFcblx0XHRcdHRoaXMucmF5LmRpcmVjdGlvbi5zZXQoIDAsIDAsIC0gMSApLnRyYW5zZm9ybURpcmVjdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUmF5Y2FzdGVyOiBVbnN1cHBvcnRlZCBjYW1lcmEgdHlwZS4nICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRpbnRlcnNlY3RPYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0LCByZWN1cnNpdmUgKSB7XG5cblx0XHR2YXIgaW50ZXJzZWN0cyA9IFtdO1xuXG5cdFx0aW50ZXJzZWN0T2JqZWN0KCBvYmplY3QsIHRoaXMsIGludGVyc2VjdHMsIHJlY3Vyc2l2ZSApO1xuXG5cdFx0aW50ZXJzZWN0cy5zb3J0KCBhc2NTb3J0ICk7XG5cblx0XHRyZXR1cm4gaW50ZXJzZWN0cztcblxuXHR9LFxuXG5cdGludGVyc2VjdE9iamVjdHM6IGZ1bmN0aW9uICggb2JqZWN0cywgcmVjdXJzaXZlICkge1xuXG5cdFx0dmFyIGludGVyc2VjdHMgPSBbXTtcblxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggb2JqZWN0cyApID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdHM6IG9iamVjdHMgaXMgbm90IGFuIEFycmF5LicgKTtcblx0XHRcdHJldHVybiBpbnRlcnNlY3RzO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gb2JqZWN0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRpbnRlcnNlY3RPYmplY3QoIG9iamVjdHNbIGkgXSwgdGhpcywgaW50ZXJzZWN0cywgcmVjdXJzaXZlICk7XG5cblx0XHR9XG5cblx0XHRpbnRlcnNlY3RzLnNvcnQoIGFzY1NvcnQgKTtcblxuXHRcdHJldHVybiBpbnRlcnNlY3RzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gQ2xvY2soIGF1dG9TdGFydCApIHtcblxuXHR0aGlzLmF1dG9TdGFydCA9ICggYXV0b1N0YXJ0ICE9PSB1bmRlZmluZWQgKSA/IGF1dG9TdGFydCA6IHRydWU7XG5cblx0dGhpcy5zdGFydFRpbWUgPSAwO1xuXHR0aGlzLm9sZFRpbWUgPSAwO1xuXHR0aGlzLmVsYXBzZWRUaW1lID0gMDtcblxuXHR0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBDbG9jay5wcm90b3R5cGUsIHtcblxuXHRzdGFydDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5zdGFydFRpbWUgPSAoIHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ3VuZGVmaW5lZCcgPyBEYXRlIDogcGVyZm9ybWFuY2UgKS5ub3coKTsgLy8gc2VlICMxMDczMlxuXG5cdFx0dGhpcy5vbGRUaW1lID0gdGhpcy5zdGFydFRpbWU7XG5cdFx0dGhpcy5lbGFwc2VkVGltZSA9IDA7XG5cdFx0dGhpcy5ydW5uaW5nID0gdHJ1ZTtcblxuXHR9LFxuXG5cdHN0b3A6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZ2V0RWxhcHNlZFRpbWUoKTtcblx0XHR0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcblxuXHR9LFxuXG5cdGdldEVsYXBzZWRUaW1lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmdldERlbHRhKCk7XG5cdFx0cmV0dXJuIHRoaXMuZWxhcHNlZFRpbWU7XG5cblx0fSxcblxuXHRnZXREZWx0YTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGRpZmYgPSAwO1xuXG5cdFx0aWYgKCB0aGlzLmF1dG9TdGFydCAmJiAhIHRoaXMucnVubmluZyApIHtcblxuXHRcdFx0dGhpcy5zdGFydCgpO1xuXHRcdFx0cmV0dXJuIDA7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMucnVubmluZyApIHtcblxuXHRcdFx0dmFyIG5ld1RpbWUgPSAoIHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ3VuZGVmaW5lZCcgPyBEYXRlIDogcGVyZm9ybWFuY2UgKS5ub3coKTtcblxuXHRcdFx0ZGlmZiA9ICggbmV3VGltZSAtIHRoaXMub2xkVGltZSApIC8gMTAwMDtcblx0XHRcdHRoaXMub2xkVGltZSA9IG5ld1RpbWU7XG5cblx0XHRcdHRoaXMuZWxhcHNlZFRpbWUgKz0gZGlmZjtcblxuXHRcdH1cblxuXHRcdHJldHVybiBkaWZmO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICpcbiAqIFJlZjogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3BoZXJpY2FsX2Nvb3JkaW5hdGVfc3lzdGVtXG4gKlxuICogVGhlIHBvbGVzIChwaGkpIGFyZSBhdCB0aGUgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHkgYXhpcy5cbiAqIFRoZSBlcXVhdG9yIHN0YXJ0cyBhdCBwb3NpdGl2ZSB6LlxuICovXG5cbmZ1bmN0aW9uIFNwaGVyaWNhbCggcmFkaXVzLCBwaGksIHRoZXRhICkge1xuXG5cdHRoaXMucmFkaXVzID0gKCByYWRpdXMgIT09IHVuZGVmaW5lZCApID8gcmFkaXVzIDogMS4wO1xuXHR0aGlzLnBoaSA9ICggcGhpICE9PSB1bmRlZmluZWQgKSA/IHBoaSA6IDA7IC8vIHVwIC8gZG93biB0b3dhcmRzIHRvcCBhbmQgYm90dG9tIHBvbGVcblx0dGhpcy50aGV0YSA9ICggdGhldGEgIT09IHVuZGVmaW5lZCApID8gdGhldGEgOiAwOyAvLyBhcm91bmQgdGhlIGVxdWF0b3Igb2YgdGhlIHNwaGVyZVxuXG5cdHJldHVybiB0aGlzO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFNwaGVyaWNhbC5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggcmFkaXVzLCBwaGksIHRoZXRhICkge1xuXG5cdFx0dGhpcy5yYWRpdXMgPSByYWRpdXM7XG5cdFx0dGhpcy5waGkgPSBwaGk7XG5cdFx0dGhpcy50aGV0YSA9IHRoZXRhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBvdGhlciApIHtcblxuXHRcdHRoaXMucmFkaXVzID0gb3RoZXIucmFkaXVzO1xuXHRcdHRoaXMucGhpID0gb3RoZXIucGhpO1xuXHRcdHRoaXMudGhldGEgPSBvdGhlci50aGV0YTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gcmVzdHJpY3QgcGhpIHRvIGJlIGJldHdlZSBFUFMgYW5kIFBJLUVQU1xuXHRtYWtlU2FmZTogZnVuY3Rpb24oKSB7XG5cblx0XHR2YXIgRVBTID0gMC4wMDAwMDE7XG5cdFx0dGhpcy5waGkgPSBNYXRoLm1heCggRVBTLCBNYXRoLm1pbiggTWF0aC5QSSAtIEVQUywgdGhpcy5waGkgKSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tVmVjdG9yMzogZnVuY3Rpb24oIHZlYzMgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IHZlYzMubGVuZ3RoKCk7XG5cblx0XHRpZiAoIHRoaXMucmFkaXVzID09PSAwICkge1xuXG5cdFx0XHR0aGlzLnRoZXRhID0gMDtcblx0XHRcdHRoaXMucGhpID0gMDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMudGhldGEgPSBNYXRoLmF0YW4yKCB2ZWMzLngsIHZlYzMueiApOyAvLyBlcXVhdG9yIGFuZ2xlIGFyb3VuZCB5LXVwIGF4aXNcblx0XHRcdHRoaXMucGhpID0gTWF0aC5hY29zKCBfTWF0aC5jbGFtcCggdmVjMy55IC8gdGhpcy5yYWRpdXMsIC0gMSwgMSApICk7IC8vIHBvbGFyIGFuZ2xlXG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICpcbiAqIFJlZjogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ3lsaW5kcmljYWxfY29vcmRpbmF0ZV9zeXN0ZW1cbiAqXG4gKi9cblxuZnVuY3Rpb24gQ3lsaW5kcmljYWwoIHJhZGl1cywgdGhldGEsIHkgKSB7XG5cblx0dGhpcy5yYWRpdXMgPSAoIHJhZGl1cyAhPT0gdW5kZWZpbmVkICkgPyByYWRpdXMgOiAxLjA7IC8vIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbiB0byBhIHBvaW50IGluIHRoZSB4LXogcGxhbmVcblx0dGhpcy50aGV0YSA9ICggdGhldGEgIT09IHVuZGVmaW5lZCApID8gdGhldGEgOiAwOyAvLyBjb3VudGVyY2xvY2t3aXNlIGFuZ2xlIGluIHRoZSB4LXogcGxhbmUgbWVhc3VyZWQgaW4gcmFkaWFucyBmcm9tIHRoZSBwb3NpdGl2ZSB6LWF4aXNcblx0dGhpcy55ID0gKCB5ICE9PSB1bmRlZmluZWQgKSA/IHkgOiAwOyAvLyBoZWlnaHQgYWJvdmUgdGhlIHgteiBwbGFuZVxuXG5cdHJldHVybiB0aGlzO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEN5bGluZHJpY2FsLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCByYWRpdXMsIHRoZXRhLCB5ICkge1xuXG5cdFx0dGhpcy5yYWRpdXMgPSByYWRpdXM7XG5cdFx0dGhpcy50aGV0YSA9IHRoZXRhO1xuXHRcdHRoaXMueSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIG90aGVyICkge1xuXG5cdFx0dGhpcy5yYWRpdXMgPSBvdGhlci5yYWRpdXM7XG5cdFx0dGhpcy50aGV0YSA9IG90aGVyLnRoZXRhO1xuXHRcdHRoaXMueSA9IG90aGVyLnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21WZWN0b3IzOiBmdW5jdGlvbiggdmVjMyApIHtcblxuXHRcdHRoaXMucmFkaXVzID0gTWF0aC5zcXJ0KCB2ZWMzLnggKiB2ZWMzLnggKyB2ZWMzLnogKiB2ZWMzLnogKTtcblx0XHR0aGlzLnRoZXRhID0gTWF0aC5hdGFuMiggdmVjMy54LCB2ZWMzLnogKTtcblx0XHR0aGlzLnkgPSB2ZWMzLnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXHJcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gTW9ycGhCbGVuZE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxyXG5cdE1lc2guY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcblxyXG5cdHRoaXMuYW5pbWF0aW9uc01hcCA9IHt9O1xyXG5cdHRoaXMuYW5pbWF0aW9uc0xpc3QgPSBbXTtcclxuXHJcblx0Ly8gcHJlcGFyZSBkZWZhdWx0IGFuaW1hdGlvblxyXG5cdC8vIChhbGwgZnJhbWVzIHBsYXllZCB0b2dldGhlciBpbiAxIHNlY29uZClcclxuXHJcblx0dmFyIG51bUZyYW1lcyA9IHRoaXMuZ2VvbWV0cnkubW9ycGhUYXJnZXRzLmxlbmd0aDtcclxuXHJcblx0dmFyIG5hbWUgPSBcIl9fZGVmYXVsdFwiO1xyXG5cclxuXHR2YXIgc3RhcnRGcmFtZSA9IDA7XHJcblx0dmFyIGVuZEZyYW1lID0gbnVtRnJhbWVzIC0gMTtcclxuXHJcblx0dmFyIGZwcyA9IG51bUZyYW1lcyAvIDE7XHJcblxyXG5cdHRoaXMuY3JlYXRlQW5pbWF0aW9uKCBuYW1lLCBzdGFydEZyYW1lLCBlbmRGcmFtZSwgZnBzICk7XHJcblx0dGhpcy5zZXRBbmltYXRpb25XZWlnaHQoIG5hbWUsIDEgKTtcclxuXHJcbn1cclxuXHJcbk1vcnBoQmxlbmRNZXNoLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1lc2gucHJvdG90eXBlICk7XHJcbk1vcnBoQmxlbmRNZXNoLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1vcnBoQmxlbmRNZXNoO1xyXG5cclxuTW9ycGhCbGVuZE1lc2gucHJvdG90eXBlLmNyZWF0ZUFuaW1hdGlvbiA9IGZ1bmN0aW9uICggbmFtZSwgc3RhcnQsIGVuZCwgZnBzICkge1xyXG5cclxuXHR2YXIgYW5pbWF0aW9uID0ge1xyXG5cclxuXHRcdHN0YXJ0OiBzdGFydCxcclxuXHRcdGVuZDogZW5kLFxyXG5cclxuXHRcdGxlbmd0aDogZW5kIC0gc3RhcnQgKyAxLFxyXG5cclxuXHRcdGZwczogZnBzLFxyXG5cdFx0ZHVyYXRpb246ICggZW5kIC0gc3RhcnQgKSAvIGZwcyxcclxuXHJcblx0XHRsYXN0RnJhbWU6IDAsXHJcblx0XHRjdXJyZW50RnJhbWU6IDAsXHJcblxyXG5cdFx0YWN0aXZlOiBmYWxzZSxcclxuXHJcblx0XHR0aW1lOiAwLFxyXG5cdFx0ZGlyZWN0aW9uOiAxLFxyXG5cdFx0d2VpZ2h0OiAxLFxyXG5cclxuXHRcdGRpcmVjdGlvbkJhY2t3YXJkczogZmFsc2UsXHJcblx0XHRtaXJyb3JlZExvb3A6IGZhbHNlXHJcblxyXG5cdH07XHJcblxyXG5cdHRoaXMuYW5pbWF0aW9uc01hcFsgbmFtZSBdID0gYW5pbWF0aW9uO1xyXG5cdHRoaXMuYW5pbWF0aW9uc0xpc3QucHVzaCggYW5pbWF0aW9uICk7XHJcblxyXG59O1xyXG5cclxuTW9ycGhCbGVuZE1lc2gucHJvdG90eXBlLmF1dG9DcmVhdGVBbmltYXRpb25zID0gZnVuY3Rpb24gKCBmcHMgKSB7XHJcblxyXG5cdHZhciBwYXR0ZXJuID0gLyhbYS16XSspXz8oXFxkKykvaTtcclxuXHJcblx0dmFyIGZpcnN0QW5pbWF0aW9uLCBmcmFtZVJhbmdlcyA9IHt9O1xyXG5cclxuXHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cclxuXHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdHZhciBtb3JwaCA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1sgaSBdO1xyXG5cdFx0dmFyIGNodW5rcyA9IG1vcnBoLm5hbWUubWF0Y2goIHBhdHRlcm4gKTtcclxuXHJcblx0XHRpZiAoIGNodW5rcyAmJiBjaHVua3MubGVuZ3RoID4gMSApIHtcclxuXHJcblx0XHRcdHZhciBuYW1lID0gY2h1bmtzWyAxIF07XHJcblxyXG5cdFx0XHRpZiAoICEgZnJhbWVSYW5nZXNbIG5hbWUgXSApIGZyYW1lUmFuZ2VzWyBuYW1lIF0gPSB7IHN0YXJ0OiBJbmZpbml0eSwgZW5kOiAtIEluZmluaXR5IH07XHJcblxyXG5cdFx0XHR2YXIgcmFuZ2UgPSBmcmFtZVJhbmdlc1sgbmFtZSBdO1xyXG5cclxuXHRcdFx0aWYgKCBpIDwgcmFuZ2Uuc3RhcnQgKSByYW5nZS5zdGFydCA9IGk7XHJcblx0XHRcdGlmICggaSA+IHJhbmdlLmVuZCApIHJhbmdlLmVuZCA9IGk7XHJcblxyXG5cdFx0XHRpZiAoICEgZmlyc3RBbmltYXRpb24gKSBmaXJzdEFuaW1hdGlvbiA9IG5hbWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZvciAoIHZhciBuYW1lIGluIGZyYW1lUmFuZ2VzICkge1xyXG5cclxuXHRcdHZhciByYW5nZSA9IGZyYW1lUmFuZ2VzWyBuYW1lIF07XHJcblx0XHR0aGlzLmNyZWF0ZUFuaW1hdGlvbiggbmFtZSwgcmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCwgZnBzICk7XHJcblxyXG5cdH1cclxuXHJcblx0dGhpcy5maXJzdEFuaW1hdGlvbiA9IGZpcnN0QW5pbWF0aW9uO1xyXG5cclxufTtcclxuXHJcbk1vcnBoQmxlbmRNZXNoLnByb3RvdHlwZS5zZXRBbmltYXRpb25EaXJlY3Rpb25Gb3J3YXJkID0gZnVuY3Rpb24gKCBuYW1lICkge1xyXG5cclxuXHR2YXIgYW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb25zTWFwWyBuYW1lIF07XHJcblxyXG5cdGlmICggYW5pbWF0aW9uICkge1xyXG5cclxuXHRcdGFuaW1hdGlvbi5kaXJlY3Rpb24gPSAxO1xyXG5cdFx0YW5pbWF0aW9uLmRpcmVjdGlvbkJhY2t3YXJkcyA9IGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG59O1xyXG5cclxuTW9ycGhCbGVuZE1lc2gucHJvdG90eXBlLnNldEFuaW1hdGlvbkRpcmVjdGlvbkJhY2t3YXJkID0gZnVuY3Rpb24gKCBuYW1lICkge1xyXG5cclxuXHR2YXIgYW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb25zTWFwWyBuYW1lIF07XHJcblxyXG5cdGlmICggYW5pbWF0aW9uICkge1xyXG5cclxuXHRcdGFuaW1hdGlvbi5kaXJlY3Rpb24gPSAtIDE7XHJcblx0XHRhbmltYXRpb24uZGlyZWN0aW9uQmFja3dhcmRzID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufTtcclxuXHJcbk1vcnBoQmxlbmRNZXNoLnByb3RvdHlwZS5zZXRBbmltYXRpb25GUFMgPSBmdW5jdGlvbiAoIG5hbWUsIGZwcyApIHtcclxuXHJcblx0dmFyIGFuaW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9uc01hcFsgbmFtZSBdO1xyXG5cclxuXHRpZiAoIGFuaW1hdGlvbiApIHtcclxuXHJcblx0XHRhbmltYXRpb24uZnBzID0gZnBzO1xyXG5cdFx0YW5pbWF0aW9uLmR1cmF0aW9uID0gKCBhbmltYXRpb24uZW5kIC0gYW5pbWF0aW9uLnN0YXJ0ICkgLyBhbmltYXRpb24uZnBzO1xyXG5cclxuXHR9XHJcblxyXG59O1xyXG5cclxuTW9ycGhCbGVuZE1lc2gucHJvdG90eXBlLnNldEFuaW1hdGlvbkR1cmF0aW9uID0gZnVuY3Rpb24gKCBuYW1lLCBkdXJhdGlvbiApIHtcclxuXHJcblx0dmFyIGFuaW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9uc01hcFsgbmFtZSBdO1xyXG5cclxuXHRpZiAoIGFuaW1hdGlvbiApIHtcclxuXHJcblx0XHRhbmltYXRpb24uZHVyYXRpb24gPSBkdXJhdGlvbjtcclxuXHRcdGFuaW1hdGlvbi5mcHMgPSAoIGFuaW1hdGlvbi5lbmQgLSBhbmltYXRpb24uc3RhcnQgKSAvIGFuaW1hdGlvbi5kdXJhdGlvbjtcclxuXHJcblx0fVxyXG5cclxufTtcclxuXHJcbk1vcnBoQmxlbmRNZXNoLnByb3RvdHlwZS5zZXRBbmltYXRpb25XZWlnaHQgPSBmdW5jdGlvbiAoIG5hbWUsIHdlaWdodCApIHtcclxuXHJcblx0dmFyIGFuaW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9uc01hcFsgbmFtZSBdO1xyXG5cclxuXHRpZiAoIGFuaW1hdGlvbiApIHtcclxuXHJcblx0XHRhbmltYXRpb24ud2VpZ2h0ID0gd2VpZ2h0O1xyXG5cclxuXHR9XHJcblxyXG59O1xyXG5cclxuTW9ycGhCbGVuZE1lc2gucHJvdG90eXBlLnNldEFuaW1hdGlvblRpbWUgPSBmdW5jdGlvbiAoIG5hbWUsIHRpbWUgKSB7XHJcblxyXG5cdHZhciBhbmltYXRpb24gPSB0aGlzLmFuaW1hdGlvbnNNYXBbIG5hbWUgXTtcclxuXHJcblx0aWYgKCBhbmltYXRpb24gKSB7XHJcblxyXG5cdFx0YW5pbWF0aW9uLnRpbWUgPSB0aW1lO1xyXG5cclxuXHR9XHJcblxyXG59O1xyXG5cclxuTW9ycGhCbGVuZE1lc2gucHJvdG90eXBlLmdldEFuaW1hdGlvblRpbWUgPSBmdW5jdGlvbiAoIG5hbWUgKSB7XHJcblxyXG5cdHZhciB0aW1lID0gMDtcclxuXHJcblx0dmFyIGFuaW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9uc01hcFsgbmFtZSBdO1xyXG5cclxuXHRpZiAoIGFuaW1hdGlvbiApIHtcclxuXHJcblx0XHR0aW1lID0gYW5pbWF0aW9uLnRpbWU7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHRpbWU7XHJcblxyXG59O1xyXG5cclxuTW9ycGhCbGVuZE1lc2gucHJvdG90eXBlLmdldEFuaW1hdGlvbkR1cmF0aW9uID0gZnVuY3Rpb24gKCBuYW1lICkge1xyXG5cclxuXHR2YXIgZHVyYXRpb24gPSAtIDE7XHJcblxyXG5cdHZhciBhbmltYXRpb24gPSB0aGlzLmFuaW1hdGlvbnNNYXBbIG5hbWUgXTtcclxuXHJcblx0aWYgKCBhbmltYXRpb24gKSB7XHJcblxyXG5cdFx0ZHVyYXRpb24gPSBhbmltYXRpb24uZHVyYXRpb247XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGR1cmF0aW9uO1xyXG5cclxufTtcclxuXHJcbk1vcnBoQmxlbmRNZXNoLnByb3RvdHlwZS5wbGF5QW5pbWF0aW9uID0gZnVuY3Rpb24gKCBuYW1lICkge1xyXG5cclxuXHR2YXIgYW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb25zTWFwWyBuYW1lIF07XHJcblxyXG5cdGlmICggYW5pbWF0aW9uICkge1xyXG5cclxuXHRcdGFuaW1hdGlvbi50aW1lID0gMDtcclxuXHRcdGFuaW1hdGlvbi5hY3RpdmUgPSB0cnVlO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5Nb3JwaEJsZW5kTWVzaDogYW5pbWF0aW9uW1wiICsgbmFtZSArIFwiXSB1bmRlZmluZWQgaW4gLnBsYXlBbmltYXRpb24oKVwiICk7XHJcblxyXG5cdH1cclxuXHJcbn07XHJcblxyXG5Nb3JwaEJsZW5kTWVzaC5wcm90b3R5cGUuc3RvcEFuaW1hdGlvbiA9IGZ1bmN0aW9uICggbmFtZSApIHtcclxuXHJcblx0dmFyIGFuaW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9uc01hcFsgbmFtZSBdO1xyXG5cclxuXHRpZiAoIGFuaW1hdGlvbiApIHtcclxuXHJcblx0XHRhbmltYXRpb24uYWN0aXZlID0gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcbn07XHJcblxyXG5Nb3JwaEJsZW5kTWVzaC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCBkZWx0YSApIHtcclxuXHJcblx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHRoaXMuYW5pbWF0aW9uc0xpc3QubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0dmFyIGFuaW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9uc0xpc3RbIGkgXTtcclxuXHJcblx0XHRpZiAoICEgYW5pbWF0aW9uLmFjdGl2ZSApIGNvbnRpbnVlO1xyXG5cclxuXHRcdHZhciBmcmFtZVRpbWUgPSBhbmltYXRpb24uZHVyYXRpb24gLyBhbmltYXRpb24ubGVuZ3RoO1xyXG5cclxuXHRcdGFuaW1hdGlvbi50aW1lICs9IGFuaW1hdGlvbi5kaXJlY3Rpb24gKiBkZWx0YTtcclxuXHJcblx0XHRpZiAoIGFuaW1hdGlvbi5taXJyb3JlZExvb3AgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGFuaW1hdGlvbi50aW1lID4gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IGFuaW1hdGlvbi50aW1lIDwgMCApIHtcclxuXHJcblx0XHRcdFx0YW5pbWF0aW9uLmRpcmVjdGlvbiAqPSAtIDE7XHJcblxyXG5cdFx0XHRcdGlmICggYW5pbWF0aW9uLnRpbWUgPiBhbmltYXRpb24uZHVyYXRpb24gKSB7XHJcblxyXG5cdFx0XHRcdFx0YW5pbWF0aW9uLnRpbWUgPSBhbmltYXRpb24uZHVyYXRpb247XHJcblx0XHRcdFx0XHRhbmltYXRpb24uZGlyZWN0aW9uQmFja3dhcmRzID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIGFuaW1hdGlvbi50aW1lIDwgMCApIHtcclxuXHJcblx0XHRcdFx0XHRhbmltYXRpb24udGltZSA9IDA7XHJcblx0XHRcdFx0XHRhbmltYXRpb24uZGlyZWN0aW9uQmFja3dhcmRzID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0YW5pbWF0aW9uLnRpbWUgPSBhbmltYXRpb24udGltZSAlIGFuaW1hdGlvbi5kdXJhdGlvbjtcclxuXHJcblx0XHRcdGlmICggYW5pbWF0aW9uLnRpbWUgPCAwICkgYW5pbWF0aW9uLnRpbWUgKz0gYW5pbWF0aW9uLmR1cmF0aW9uO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR2YXIga2V5ZnJhbWUgPSBhbmltYXRpb24uc3RhcnQgKyBfTWF0aC5jbGFtcCggTWF0aC5mbG9vciggYW5pbWF0aW9uLnRpbWUgLyBmcmFtZVRpbWUgKSwgMCwgYW5pbWF0aW9uLmxlbmd0aCAtIDEgKTtcclxuXHRcdHZhciB3ZWlnaHQgPSBhbmltYXRpb24ud2VpZ2h0O1xyXG5cclxuXHRcdGlmICgga2V5ZnJhbWUgIT09IGFuaW1hdGlvbi5jdXJyZW50RnJhbWUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgYW5pbWF0aW9uLmxhc3RGcmFtZSBdID0gMDtcclxuXHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXNbIGFuaW1hdGlvbi5jdXJyZW50RnJhbWUgXSA9IDEgKiB3ZWlnaHQ7XHJcblxyXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sga2V5ZnJhbWUgXSA9IDA7XHJcblxyXG5cdFx0XHRhbmltYXRpb24ubGFzdEZyYW1lID0gYW5pbWF0aW9uLmN1cnJlbnRGcmFtZTtcclxuXHRcdFx0YW5pbWF0aW9uLmN1cnJlbnRGcmFtZSA9IGtleWZyYW1lO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR2YXIgbWl4ID0gKCBhbmltYXRpb24udGltZSAlIGZyYW1lVGltZSApIC8gZnJhbWVUaW1lO1xyXG5cclxuXHRcdGlmICggYW5pbWF0aW9uLmRpcmVjdGlvbkJhY2t3YXJkcyApIG1peCA9IDEgLSBtaXg7XHJcblxyXG5cdFx0aWYgKCBhbmltYXRpb24uY3VycmVudEZyYW1lICE9PSBhbmltYXRpb24ubGFzdEZyYW1lICkge1xyXG5cclxuXHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXNbIGFuaW1hdGlvbi5jdXJyZW50RnJhbWUgXSA9IG1peCAqIHdlaWdodDtcclxuXHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXNbIGFuaW1hdGlvbi5sYXN0RnJhbWUgXSA9ICggMSAtIG1peCApICogd2VpZ2h0O1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgYW5pbWF0aW9uLmN1cnJlbnRGcmFtZSBdID0gd2VpZ2h0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEltbWVkaWF0ZVJlbmRlck9iamVjdCggbWF0ZXJpYWwgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcblx0dGhpcy5yZW5kZXIgPSBmdW5jdGlvbiAoIHJlbmRlckNhbGxiYWNrICkge307XG5cbn1cblxuSW1tZWRpYXRlUmVuZGVyT2JqZWN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApO1xuSW1tZWRpYXRlUmVuZGVyT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEltbWVkaWF0ZVJlbmRlck9iamVjdDtcblxuSW1tZWRpYXRlUmVuZGVyT2JqZWN0LnByb3RvdHlwZS5pc0ltbWVkaWF0ZVJlbmRlck9iamVjdCA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuKi9cblxuZnVuY3Rpb24gVmVydGV4Tm9ybWFsc0hlbHBlciggb2JqZWN0LCBzaXplLCBoZXgsIGxpbmV3aWR0aCApIHtcblxuXHR0aGlzLm9iamVjdCA9IG9iamVjdDtcblxuXHR0aGlzLnNpemUgPSAoIHNpemUgIT09IHVuZGVmaW5lZCApID8gc2l6ZSA6IDE7XG5cblx0dmFyIGNvbG9yID0gKCBoZXggIT09IHVuZGVmaW5lZCApID8gaGV4IDogMHhmZjAwMDA7XG5cblx0dmFyIHdpZHRoID0gKCBsaW5ld2lkdGggIT09IHVuZGVmaW5lZCApID8gbGluZXdpZHRoIDogMTtcblxuXHQvL1xuXG5cdHZhciBuTm9ybWFscyA9IDA7XG5cblx0dmFyIG9iakdlb21ldHJ5ID0gdGhpcy5vYmplY3QuZ2VvbWV0cnk7XG5cblx0aWYgKCBvYmpHZW9tZXRyeSAmJiBvYmpHZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0bk5vcm1hbHMgPSBvYmpHZW9tZXRyeS5mYWNlcy5sZW5ndGggKiAzO1xuXG5cdH0gZWxzZSBpZiAoIG9iakdlb21ldHJ5ICYmIG9iakdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRuTm9ybWFscyA9IG9iakdlb21ldHJ5LmF0dHJpYnV0ZXMubm9ybWFsLmNvdW50O1xuXG5cdH1cblxuXHQvL1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdHZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbk5vcm1hbHMgKiAyICogMywgMyApO1xuXG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgcG9zaXRpb25zICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yLCBsaW5ld2lkdGg6IHdpZHRoIH0gKSApO1xuXG5cdC8vXG5cblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5WZXJ0ZXhOb3JtYWxzSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcblZlcnRleE5vcm1hbHNIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVmVydGV4Tm9ybWFsc0hlbHBlcjtcblxuVmVydGV4Tm9ybWFsc0hlbHBlci5wcm90b3R5cGUudXBkYXRlID0gKCBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblxuXHRcdHZhciBrZXlzID0gWyAnYScsICdiJywgJ2MnIF07XG5cblx0XHR0aGlzLm9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0bm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggdGhpcy5vYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkO1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBvYmpHZW9tZXRyeSA9IHRoaXMub2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0aWYgKCBvYmpHZW9tZXRyeSAmJiBvYmpHZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgdmVydGljZXMgPSBvYmpHZW9tZXRyeS52ZXJ0aWNlcztcblxuXHRcdFx0dmFyIGZhY2VzID0gb2JqR2VvbWV0cnkuZmFjZXM7XG5cblx0XHRcdHZhciBpZHggPSAwO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIHZlcnRleCA9IHZlcnRpY2VzWyBmYWNlWyBrZXlzWyBqIF0gXSBdO1xuXG5cdFx0XHRcdFx0dmFyIG5vcm1hbCA9IGZhY2UudmVydGV4Tm9ybWFsc1sgaiBdO1xuXG5cdFx0XHRcdFx0djEuY29weSggdmVydGV4ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdFx0djIuY29weSggbm9ybWFsICkuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggdGhpcy5zaXplICkuYWRkKCB2MSApO1xuXG5cdFx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBpZHgsIHYxLngsIHYxLnksIHYxLnogKTtcblxuXHRcdFx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjIueCwgdjIueSwgdjIueiApO1xuXG5cdFx0XHRcdFx0aWR4ID0gaWR4ICsgMTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9iakdlb21ldHJ5ICYmIG9iakdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciBvYmpQb3MgPSBvYmpHZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0XHR2YXIgb2JqTm9ybSA9IG9iakdlb21ldHJ5LmF0dHJpYnV0ZXMubm9ybWFsO1xuXG5cdFx0XHR2YXIgaWR4ID0gMDtcblxuXHRcdFx0Ly8gZm9yIHNpbXBsaWNpdHksIGlnbm9yZSBpbmRleCBhbmQgZHJhd2NhbGxzLCBhbmQgcmVuZGVyIGV2ZXJ5IG5vcm1hbFxuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gb2JqUG9zLmNvdW50OyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0djEuc2V0KCBvYmpQb3MuZ2V0WCggaiApLCBvYmpQb3MuZ2V0WSggaiApLCBvYmpQb3MuZ2V0WiggaiApICkuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdHYyLnNldCggb2JqTm9ybS5nZXRYKCBqICksIG9iak5vcm0uZ2V0WSggaiApLCBvYmpOb3JtLmdldFooIGogKSApO1xuXG5cdFx0XHRcdHYyLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIHRoaXMuc2l6ZSApLmFkZCggdjEgKTtcblxuXHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjEueCwgdjEueSwgdjEueiApO1xuXG5cdFx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBpZHgsIHYyLngsIHYyLnksIHYyLnogKTtcblxuXHRcdFx0XHRpZHggPSBpZHggKyAxO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0fTtcblxufSgpICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiovXG5cbmZ1bmN0aW9uIFNwb3RMaWdodEhlbHBlciggbGlnaHQgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMubGlnaHQgPSBsaWdodDtcblx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdHZhciBwb3NpdGlvbnMgPSBbXG5cdFx0MCwgMCwgMCwgICAwLCAgIDAsICAgMSxcblx0XHQwLCAwLCAwLCAgIDEsICAgMCwgICAxLFxuXHRcdDAsIDAsIDAsIC0gMSwgICAwLCAgIDEsXG5cdFx0MCwgMCwgMCwgICAwLCAgIDEsICAgMSxcblx0XHQwLCAwLCAwLCAgIDAsIC0gMSwgICAxXG5cdF07XG5cblx0Zm9yICggdmFyIGkgPSAwLCBqID0gMSwgbCA9IDMyOyBpIDwgbDsgaSArKywgaiArKyApIHtcblxuXHRcdHZhciBwMSA9ICggaSAvIGwgKSAqIE1hdGguUEkgKiAyO1xuXHRcdHZhciBwMiA9ICggaiAvIGwgKSAqIE1hdGguUEkgKiAyO1xuXG5cdFx0cG9zaXRpb25zLnB1c2goXG5cdFx0XHRNYXRoLmNvcyggcDEgKSwgTWF0aC5zaW4oIHAxICksIDEsXG5cdFx0XHRNYXRoLmNvcyggcDIgKSwgTWF0aC5zaW4oIHAyICksIDFcblx0XHQpO1xuXG5cdH1cblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApO1xuXG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBmb2c6IGZhbHNlIH0gKTtcblxuXHR0aGlzLmNvbmUgPSBuZXcgTGluZVNlZ21lbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblx0dGhpcy5hZGQoIHRoaXMuY29uZSApO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuU3BvdExpZ2h0SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApO1xuU3BvdExpZ2h0SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNwb3RMaWdodEhlbHBlcjtcblxuU3BvdExpZ2h0SGVscGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXG5cdHRoaXMuY29uZS5nZW9tZXRyeS5kaXNwb3NlKCk7XG5cdHRoaXMuY29uZS5tYXRlcmlhbC5kaXNwb3NlKCk7XG5cbn07XG5cblNwb3RMaWdodEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdmVjdG9yMiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblxuXHRcdHZhciBjb25lTGVuZ3RoID0gdGhpcy5saWdodC5kaXN0YW5jZSA/IHRoaXMubGlnaHQuZGlzdGFuY2UgOiAxMDAwO1xuXHRcdHZhciBjb25lV2lkdGggPSBjb25lTGVuZ3RoICogTWF0aC50YW4oIHRoaXMubGlnaHQuYW5nbGUgKTtcblxuXHRcdHRoaXMuY29uZS5zY2FsZS5zZXQoIGNvbmVXaWR0aCwgY29uZVdpZHRoLCBjb25lTGVuZ3RoICk7XG5cblx0XHR2ZWN0b3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0dmVjdG9yMi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7XG5cblx0XHR0aGlzLmNvbmUubG9va0F0KCB2ZWN0b3IyLnN1YiggdmVjdG9yICkgKTtcblxuXHRcdHRoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9yICk7XG5cblx0fTtcblxufSgpO1xuXG4vKipcbiAqIEBhdXRob3IgU2VhbiBHcmlmZmluIC8gaHR0cDovL3R3aXR0ZXIuY29tL3NncmlmXG4gKiBAYXV0aG9yIE1pY2hhZWwgR3VlcnJlcm8gLyBodHRwOi8vcmVhbGl0eW1lbHRkb3duLmNvbVxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgaWtlcnIgLyBodHRwOi8vdmVyb2xkLmNvbVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBTa2VsZXRvbkhlbHBlciggb2JqZWN0ICkge1xuXG5cdHRoaXMuYm9uZXMgPSB0aGlzLmdldEJvbmVMaXN0KCBvYmplY3QgKTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIGNvbG9ycyA9IFtdO1xuXG5cdHZhciBjb2xvcjEgPSBuZXcgQ29sb3IoIDAsIDAsIDEgKTtcblx0dmFyIGNvbG9yMiA9IG5ldyBDb2xvciggMCwgMSwgMCApO1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMuYm9uZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0dmFyIGJvbmUgPSB0aGlzLmJvbmVzWyBpIF07XG5cblx0XHRpZiAoIGJvbmUucGFyZW50ICYmIGJvbmUucGFyZW50LmlzQm9uZSApIHtcblxuXHRcdFx0dmVydGljZXMucHVzaCggMCwgMCwgMCApO1xuXHRcdFx0dmVydGljZXMucHVzaCggMCwgMCwgMCApO1xuXHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yMS5yLCBjb2xvcjEuZywgY29sb3IxLmIgKTtcblx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvcjIuciwgY29sb3IyLmcsIGNvbG9yMi5iICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiBWZXJ0ZXhDb2xvcnMsIGRlcHRoVGVzdDogZmFsc2UsIGRlcHRoV3JpdGU6IGZhbHNlLCB0cmFuc3BhcmVudDogdHJ1ZSB9ICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdHRoaXMucm9vdCA9IG9iamVjdDtcblxuXHR0aGlzLm1hdHJpeCA9IG9iamVjdC5tYXRyaXhXb3JsZDtcblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5cblNrZWxldG9uSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcblNrZWxldG9uSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNrZWxldG9uSGVscGVyO1xuXG5Ta2VsZXRvbkhlbHBlci5wcm90b3R5cGUuZ2V0Qm9uZUxpc3QgPSBmdW5jdGlvbiggb2JqZWN0ICkge1xuXG5cdHZhciBib25lTGlzdCA9IFtdO1xuXG5cdGlmICggb2JqZWN0ICYmIG9iamVjdC5pc0JvbmUgKSB7XG5cblx0XHRib25lTGlzdC5wdXNoKCBvYmplY3QgKTtcblxuXHR9XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgb2JqZWN0LmNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdGJvbmVMaXN0LnB1c2guYXBwbHkoIGJvbmVMaXN0LCB0aGlzLmdldEJvbmVMaXN0KCBvYmplY3QuY2hpbGRyZW5bIGkgXSApICk7XG5cblx0fVxuXG5cdHJldHVybiBib25lTGlzdDtcblxufTtcblxuU2tlbGV0b25IZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgYm9uZU1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdHZhciBtYXRyaXhXb3JsZEludiA9IG5ldyBNYXRyaXg0KCk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cdFx0dmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICk7XG5cblx0XHRtYXRyaXhXb3JsZEludi5nZXRJbnZlcnNlKCB0aGlzLnJvb3QubWF0cml4V29ybGQgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaiA9IDA7IGkgPCB0aGlzLmJvbmVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGJvbmUgPSB0aGlzLmJvbmVzWyBpIF07XG5cblx0XHRcdGlmICggYm9uZS5wYXJlbnQgJiYgYm9uZS5wYXJlbnQuaXNCb25lICkge1xuXG5cdFx0XHRcdGJvbmVNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggbWF0cml4V29ybGRJbnYsIGJvbmUubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggYm9uZU1hdHJpeCApO1xuXHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGosIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTtcblxuXHRcdFx0XHRib25lTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIG1hdHJpeFdvcmxkSW52LCBib25lLnBhcmVudC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR2ZWN0b3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBib25lTWF0cml4ICk7XG5cdFx0XHRcdHBvc2l0aW9uLnNldFhZWiggaiArIDEsIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTtcblxuXHRcdFx0XHRqICs9IDI7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHR9O1xuXG59KCk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gUG9pbnRMaWdodEhlbHBlciggbGlnaHQsIHNwaGVyZVNpemUgKSB7XG5cblx0dGhpcy5saWdodCA9IGxpZ2h0O1xuXHR0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IFNwaGVyZUJ1ZmZlckdlb21ldHJ5KCBzcGhlcmVTaXplLCA0LCAyICk7XG5cdHZhciBtYXRlcmlhbCA9IG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyB3aXJlZnJhbWU6IHRydWUsIGZvZzogZmFsc2UgfSApO1xuXHRtYXRlcmlhbC5jb2xvci5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9yICk7XG5cblx0TWVzaC5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHR0aGlzLm1hdHJpeCA9IHRoaXMubGlnaHQubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdC8qXG5cdHZhciBkaXN0YW5jZUdlb21ldHJ5ID0gbmV3IFRIUkVFLkljb3NhaGVkcm9uR2VvbWV0cnkoIDEsIDIgKTtcblx0dmFyIGRpc3RhbmNlTWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGhleENvbG9yLCBmb2c6IGZhbHNlLCB3aXJlZnJhbWU6IHRydWUsIG9wYWNpdHk6IDAuMSwgdHJhbnNwYXJlbnQ6IHRydWUgfSApO1xuXG5cdHRoaXMubGlnaHRTcGhlcmUgPSBuZXcgVEhSRUUuTWVzaCggYnVsYkdlb21ldHJ5LCBidWxiTWF0ZXJpYWwgKTtcblx0dGhpcy5saWdodERpc3RhbmNlID0gbmV3IFRIUkVFLk1lc2goIGRpc3RhbmNlR2VvbWV0cnksIGRpc3RhbmNlTWF0ZXJpYWwgKTtcblxuXHR2YXIgZCA9IGxpZ2h0LmRpc3RhbmNlO1xuXG5cdGlmICggZCA9PT0gMC4wICkge1xuXG5cdFx0dGhpcy5saWdodERpc3RhbmNlLnZpc2libGUgPSBmYWxzZTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0dGhpcy5saWdodERpc3RhbmNlLnNjYWxlLnNldCggZCwgZCwgZCApO1xuXG5cdH1cblxuXHR0aGlzLmFkZCggdGhpcy5saWdodERpc3RhbmNlICk7XG5cdCovXG5cbn1cblxuUG9pbnRMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNZXNoLnByb3RvdHlwZSApO1xuUG9pbnRMaWdodEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2ludExpZ2h0SGVscGVyO1xuXG5Qb2ludExpZ2h0SGVscGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXG5cdHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKTtcblxufTtcblxuUG9pbnRMaWdodEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdHRoaXMubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXG5cdC8qXG5cdHZhciBkID0gdGhpcy5saWdodC5kaXN0YW5jZTtcblxuXHRpZiAoIGQgPT09IDAuMCApIHtcblxuXHRcdHRoaXMubGlnaHREaXN0YW5jZS52aXNpYmxlID0gZmFsc2U7XG5cblx0fSBlbHNlIHtcblxuXHRcdHRoaXMubGlnaHREaXN0YW5jZS52aXNpYmxlID0gdHJ1ZTtcblx0XHR0aGlzLmxpZ2h0RGlzdGFuY2Uuc2NhbGUuc2V0KCBkLCBkLCBkICk7XG5cblx0fVxuXHQqL1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgYWJlbG5hdGlvbiAvIGh0dHA6Ly9naXRodWIuY29tL2FiZWxuYXRpb25cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHA6Ly9naXRodWIuY29tL011Z2VuODdcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cbmZ1bmN0aW9uIFJlY3RBcmVhTGlnaHRIZWxwZXIoIGxpZ2h0ICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XG5cdHRoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHR0aGlzLm1hdHJpeCA9IGxpZ2h0Lm1hdHJpeFdvcmxkO1xuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGxpZ2h0LmNvbG9yIH0gKTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIG5ldyBGbG9hdDMyQXJyYXkoIDUgKiAzICksIDMgKSApO1xuXG5cdHRoaXMuYWRkKCBuZXcgTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsICkgKTtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cblJlY3RBcmVhTGlnaHRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5SZWN0QXJlYUxpZ2h0SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlY3RBcmVhTGlnaHRIZWxwZXI7XG5cblJlY3RBcmVhTGlnaHRIZWxwZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0dGhpcy5jaGlsZHJlblsgMCBdLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0dGhpcy5jaGlsZHJlblsgMCBdLm1hdGVyaWFsLmRpc3Bvc2UoKTtcblxufTtcblxuUmVjdEFyZWFMaWdodEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBsaW5lID0gdGhpcy5jaGlsZHJlblsgMCBdO1xuXG5cdC8vIHVwZGF0ZSBtYXRlcmlhbFxuXG5cdGxpbmUubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXG5cdC8vIGNhbGN1bGF0ZSBuZXcgZGltZW5zaW9ucyBvZiB0aGUgaGVscGVyXG5cblx0dmFyIGh4ID0gdGhpcy5saWdodC53aWR0aCAqIDAuNTtcblx0dmFyIGh5ID0gdGhpcy5saWdodC5oZWlnaHQgKiAwLjU7XG5cblx0dmFyIHBvc2l0aW9uID0gbGluZS5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHR2YXIgYXJyYXkgPSBwb3NpdGlvbi5hcnJheTtcblxuXHQvLyB1cGRhdGUgdmVydGljZXNcblxuXHRhcnJheVsgIDAgXSA9ICAgaHg7IGFycmF5WyAgMSBdID0gLSBoeTsgYXJyYXlbICAyIF0gPSAwO1xuXHRhcnJheVsgIDMgXSA9ICAgaHg7IGFycmF5WyAgNCBdID0gICBoeTsgYXJyYXlbICA1IF0gPSAwO1xuXHRhcnJheVsgIDYgXSA9IC0gaHg7IGFycmF5WyAgNyBdID0gICBoeTsgYXJyYXlbICA4IF0gPSAwO1xuXHRhcnJheVsgIDkgXSA9IC0gaHg7IGFycmF5WyAxMCBdID0gLSBoeTsgYXJyYXlbIDExIF0gPSAwO1xuXHRhcnJheVsgMTIgXSA9ICAgaHg7IGFycmF5WyAxMyBdID0gLSBoeTsgYXJyYXlbIDE0IF0gPSAwO1xuXG5cdHBvc2l0aW9uLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuZnVuY3Rpb24gSGVtaXNwaGVyZUxpZ2h0SGVscGVyKCBsaWdodCwgc2l6ZSApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5saWdodCA9IGxpZ2h0O1xuXHR0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0dGhpcy5tYXRyaXggPSBsaWdodC5tYXRyaXhXb3JsZDtcblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSggc2l6ZSApO1xuXHRnZW9tZXRyeS5yb3RhdGVZKCBNYXRoLlBJICogMC41ICk7XG5cblx0dmFyIG1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IHZlcnRleENvbG9yczogVmVydGV4Q29sb3JzLCB3aXJlZnJhbWU6IHRydWUgfSApO1xuXG5cdHZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApO1xuXHR2YXIgY29sb3JzID0gbmV3IEZsb2F0MzJBcnJheSggcG9zaXRpb24uY291bnQgKiAzICk7XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xuXG5cdHRoaXMuYWRkKCBuZXcgTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICkgKTtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cbkhlbWlzcGhlcmVMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcbkhlbWlzcGhlcmVMaWdodEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBIZW1pc3BoZXJlTGlnaHRIZWxwZXI7XG5cbkhlbWlzcGhlcmVMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR0aGlzLmNoaWxkcmVuWyAwIF0uZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0aGlzLmNoaWxkcmVuWyAwIF0ubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG59O1xuXG5IZW1pc3BoZXJlTGlnaHRIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgY29sb3IxID0gbmV3IENvbG9yKCk7XG5cdHZhciBjb2xvcjIgPSBuZXcgQ29sb3IoKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0dmFyIG1lc2ggPSB0aGlzLmNoaWxkcmVuWyAwIF07XG5cblx0XHR2YXIgY29sb3JzID0gbWVzaC5nZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdjb2xvcicgKTtcblxuXHRcdGNvbG9yMS5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9yICk7XG5cdFx0Y29sb3IyLmNvcHkoIHRoaXMubGlnaHQuZ3JvdW5kQ29sb3IgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNvbG9ycy5jb3VudDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjb2xvciA9ICggaSA8ICggbCAvIDIgKSApID8gY29sb3IxIDogY29sb3IyO1xuXG5cdFx0XHRjb2xvcnMuc2V0WFlaKCBpLCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cblx0XHR9XG5cblx0XHRtZXNoLmxvb2tBdCggdmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC5tYXRyaXhXb3JsZCApLm5lZ2F0ZSgpICk7XG5cblx0XHRjb2xvcnMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdH07XG5cbn0oKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEdyaWRIZWxwZXIoIHNpemUsIGRpdmlzaW9ucywgY29sb3IxLCBjb2xvcjIgKSB7XG5cblx0c2l6ZSA9IHNpemUgfHwgMTA7XG5cdGRpdmlzaW9ucyA9IGRpdmlzaW9ucyB8fCAxMDtcblx0Y29sb3IxID0gbmV3IENvbG9yKCBjb2xvcjEgIT09IHVuZGVmaW5lZCA/IGNvbG9yMSA6IDB4NDQ0NDQ0ICk7XG5cdGNvbG9yMiA9IG5ldyBDb2xvciggY29sb3IyICE9PSB1bmRlZmluZWQgPyBjb2xvcjIgOiAweDg4ODg4OCApO1xuXG5cdHZhciBjZW50ZXIgPSBkaXZpc2lvbnMgLyAyO1xuXHR2YXIgc3RlcCA9IHNpemUgLyBkaXZpc2lvbnM7XG5cdHZhciBoYWxmU2l6ZSA9IHNpemUgLyAyO1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtdLCBjb2xvcnMgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGogPSAwLCBrID0gLSBoYWxmU2l6ZTsgaSA8PSBkaXZpc2lvbnM7IGkgKyssIGsgKz0gc3RlcCApIHtcblxuXHRcdHZlcnRpY2VzLnB1c2goIC0gaGFsZlNpemUsIDAsIGssIGhhbGZTaXplLCAwLCBrICk7XG5cdFx0dmVydGljZXMucHVzaCggaywgMCwgLSBoYWxmU2l6ZSwgaywgMCwgaGFsZlNpemUgKTtcblxuXHRcdHZhciBjb2xvciA9IGkgPT09IGNlbnRlciA/IGNvbG9yMSA6IGNvbG9yMjtcblxuXHRcdGNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7XG5cdFx0Y29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMztcblx0XHRjb2xvci50b0FycmF5KCBjb2xvcnMsIGogKTsgaiArPSAzO1xuXHRcdGNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7XG5cblx0fVxuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0dmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IHZlcnRleENvbG9yczogVmVydGV4Q29sb3JzIH0gKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cbn1cblxuR3JpZEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5HcmlkSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdyaWRIZWxwZXI7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHA6Ly9naXRodWIuY29tL011Z2VuODdcbiAqIEBhdXRob3IgSGVjdGF0ZSAvIGh0dHA6Ly93d3cuZ2l0aHViLmNvbS9IZWN0YXRlXG4gKi9cblxuZnVuY3Rpb24gUG9sYXJHcmlkSGVscGVyKCByYWRpdXMsIHJhZGlhbHMsIGNpcmNsZXMsIGRpdmlzaW9ucywgY29sb3IxLCBjb2xvcjIgKSB7XG5cblx0cmFkaXVzID0gcmFkaXVzIHx8IDEwO1xuXHRyYWRpYWxzID0gcmFkaWFscyB8fCAxNjtcblx0Y2lyY2xlcyA9IGNpcmNsZXMgfHwgODtcblx0ZGl2aXNpb25zID0gZGl2aXNpb25zIHx8IDY0O1xuXHRjb2xvcjEgPSBuZXcgQ29sb3IoIGNvbG9yMSAhPT0gdW5kZWZpbmVkID8gY29sb3IxIDogMHg0NDQ0NDQgKTtcblx0Y29sb3IyID0gbmV3IENvbG9yKCBjb2xvcjIgIT09IHVuZGVmaW5lZCA/IGNvbG9yMiA6IDB4ODg4ODg4ICk7XG5cblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBjb2xvcnMgPSBbXTtcblxuXHR2YXIgeCwgejtcblx0dmFyIHYsIGksIGosIHIsIGNvbG9yO1xuXG5cdC8vIGNyZWF0ZSB0aGUgcmFkaWFsc1xuXG5cdGZvciAoIGkgPSAwOyBpIDw9IHJhZGlhbHM7IGkgKysgKSB7XG5cblx0XHR2ID0gKCBpIC8gcmFkaWFscyApICogKCBNYXRoLlBJICogMiApO1xuXG5cdFx0eCA9IE1hdGguc2luKCB2ICkgKiByYWRpdXM7XG5cdFx0eiA9IE1hdGguY29zKCB2ICkgKiByYWRpdXM7XG5cblx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XG5cdFx0dmVydGljZXMucHVzaCggeCwgMCwgeiApO1xuXG5cdFx0Y29sb3IgPSAoIGkgJiAxICkgPyBjb2xvcjEgOiBjb2xvcjI7XG5cblx0XHRjb2xvcnMucHVzaCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xuXHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cblx0fVxuXG5cdC8vIGNyZWF0ZSB0aGUgY2lyY2xlc1xuXG5cdGZvciAoIGkgPSAwOyBpIDw9IGNpcmNsZXM7IGkgKysgKSB7XG5cblx0XHRjb2xvciA9ICggaSAmIDEgKSA/IGNvbG9yMSA6IGNvbG9yMjtcblxuXHRcdHIgPSByYWRpdXMgLSAoIHJhZGl1cyAvIGNpcmNsZXMgKiBpICk7XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8IGRpdmlzaW9uczsgaiArKyApIHtcblxuXHRcdFx0Ly8gZmlyc3QgdmVydGV4XG5cblx0XHRcdHYgPSAoIGogLyBkaXZpc2lvbnMgKSAqICggTWF0aC5QSSAqIDIgKTtcblxuXHRcdFx0eCA9IE1hdGguc2luKCB2ICkgKiByO1xuXHRcdFx0eiA9IE1hdGguY29zKCB2ICkgKiByO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB4LCAwLCB6ICk7XG5cdFx0XHRjb2xvcnMucHVzaCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xuXG5cdFx0XHQvLyBzZWNvbmQgdmVydGV4XG5cblx0XHRcdHYgPSAoICggaiArIDEgKSAvIGRpdmlzaW9ucyApICogKCBNYXRoLlBJICogMiApO1xuXG5cdFx0XHR4ID0gTWF0aC5zaW4oIHYgKSAqIHI7XG5cdFx0XHR6ID0gTWF0aC5jb3MoIHYgKSAqIHI7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHgsIDAsIHogKTtcblx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0dmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IHZlcnRleENvbG9yczogVmVydGV4Q29sb3JzIH0gKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cbn1cblxuUG9sYXJHcmlkSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcblBvbGFyR3JpZEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2xhckdyaWRIZWxwZXI7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuKi9cblxuZnVuY3Rpb24gRmFjZU5vcm1hbHNIZWxwZXIoIG9iamVjdCwgc2l6ZSwgaGV4LCBsaW5ld2lkdGggKSB7XG5cblx0Ly8gRmFjZU5vcm1hbHNIZWxwZXIgb25seSBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeVxuXG5cdHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuXG5cdHRoaXMuc2l6ZSA9ICggc2l6ZSAhPT0gdW5kZWZpbmVkICkgPyBzaXplIDogMTtcblxuXHR2YXIgY29sb3IgPSAoIGhleCAhPT0gdW5kZWZpbmVkICkgPyBoZXggOiAweGZmZmYwMDtcblxuXHR2YXIgd2lkdGggPSAoIGxpbmV3aWR0aCAhPT0gdW5kZWZpbmVkICkgPyBsaW5ld2lkdGggOiAxO1xuXG5cdC8vXG5cblx0dmFyIG5Ob3JtYWxzID0gMDtcblxuXHR2YXIgb2JqR2VvbWV0cnkgPSB0aGlzLm9iamVjdC5nZW9tZXRyeTtcblxuXHRpZiAoIG9iakdlb21ldHJ5ICYmIG9iakdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRuTm9ybWFscyA9IG9iakdlb21ldHJ5LmZhY2VzLmxlbmd0aDtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRmFjZU5vcm1hbHNIZWxwZXI6IG9ubHkgVEhSRUUuR2VvbWV0cnkgaXMgc3VwcG9ydGVkLiBVc2UgVEhSRUUuVmVydGV4Tm9ybWFsc0hlbHBlciwgaW5zdGVhZC4nICk7XG5cblx0fVxuXG5cdC8vXG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0dmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBuTm9ybWFscyAqIDIgKiAzLCAzICk7XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBwb3NpdGlvbnMgKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIGxpbmV3aWR0aDogd2lkdGggfSApICk7XG5cblx0Ly9cblxuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5GYWNlTm9ybWFsc0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5GYWNlTm9ybWFsc0hlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBGYWNlTm9ybWFsc0hlbHBlcjtcblxuRmFjZU5vcm1hbHNIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9ICggZnVuY3Rpb24gKCkge1xuXG5cdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB2MiA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHR0aGlzLm9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0bm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggdGhpcy5vYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkO1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBvYmpHZW9tZXRyeSA9IHRoaXMub2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0dmFyIHZlcnRpY2VzID0gb2JqR2VvbWV0cnkudmVydGljZXM7XG5cblx0XHR2YXIgZmFjZXMgPSBvYmpHZW9tZXRyeS5mYWNlcztcblxuXHRcdHZhciBpZHggPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHR2YXIgbm9ybWFsID0gZmFjZS5ub3JtYWw7XG5cblx0XHRcdHYxLmNvcHkoIHZlcnRpY2VzWyBmYWNlLmEgXSApXG5cdFx0XHRcdC5hZGQoIHZlcnRpY2VzWyBmYWNlLmIgXSApXG5cdFx0XHRcdC5hZGQoIHZlcnRpY2VzWyBmYWNlLmMgXSApXG5cdFx0XHRcdC5kaXZpZGVTY2FsYXIoIDMgKVxuXHRcdFx0XHQuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHR2Mi5jb3B5KCBub3JtYWwgKS5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCB0aGlzLnNpemUgKS5hZGQoIHYxICk7XG5cblx0XHRcdHBvc2l0aW9uLnNldFhZWiggaWR4LCB2MS54LCB2MS55LCB2MS56ICk7XG5cblx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHRcdHBvc2l0aW9uLnNldFhZWiggaWR4LCB2Mi54LCB2Mi55LCB2Mi56ICk7XG5cblx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHR9XG5cblx0XHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0fTtcblxufSgpICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBEaXJlY3Rpb25hbExpZ2h0SGVscGVyKCBsaWdodCwgc2l6ZSApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5saWdodCA9IGxpZ2h0O1xuXHR0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0dGhpcy5tYXRyaXggPSBsaWdodC5tYXRyaXhXb3JsZDtcblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0aWYgKCBzaXplID09PSB1bmRlZmluZWQgKSBzaXplID0gMTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggW1xuXHRcdC0gc2l6ZSwgICBzaXplLCAwLFxuXHRcdCAgc2l6ZSwgICBzaXplLCAwLFxuXHRcdCAgc2l6ZSwgLSBzaXplLCAwLFxuXHRcdC0gc2l6ZSwgLSBzaXplLCAwLFxuXHRcdC0gc2l6ZSwgICBzaXplLCAwXG5cdF0sIDMgKSApO1xuXG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBmb2c6IGZhbHNlIH0gKTtcblxuXHR0aGlzLmFkZCggbmV3IExpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCApICk7XG5cblx0Z2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggWyAwLCAwLCAwLCAwLCAwLCAxIF0sIDMgKSApO1xuXG5cdHRoaXMuYWRkKCBuZXcgTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsICkpO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuRGlyZWN0aW9uYWxMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcbkRpcmVjdGlvbmFsTGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRGlyZWN0aW9uYWxMaWdodEhlbHBlcjtcblxuRGlyZWN0aW9uYWxMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgbGlnaHRQbGFuZSA9IHRoaXMuY2hpbGRyZW5bIDAgXTtcblx0dmFyIHRhcmdldExpbmUgPSB0aGlzLmNoaWxkcmVuWyAxIF07XG5cblx0bGlnaHRQbGFuZS5nZW9tZXRyeS5kaXNwb3NlKCk7XG5cdGxpZ2h0UGxhbmUubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXHR0YXJnZXRMaW5lLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0dGFyZ2V0TGluZS5tYXRlcmlhbC5kaXNwb3NlKCk7XG5cbn07XG5cbkRpcmVjdGlvbmFsTGlnaHRIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdjIgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdjMgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHR2MS5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubGlnaHQubWF0cml4V29ybGQgKTtcblx0XHR2Mi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7XG5cdFx0djMuc3ViVmVjdG9ycyggdjIsIHYxICk7XG5cblx0XHR2YXIgbGlnaHRQbGFuZSA9IHRoaXMuY2hpbGRyZW5bIDAgXTtcblx0XHR2YXIgdGFyZ2V0TGluZSA9IHRoaXMuY2hpbGRyZW5bIDEgXTtcblxuXHRcdGxpZ2h0UGxhbmUubG9va0F0KCB2MyApO1xuXHRcdGxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXG5cdFx0dGFyZ2V0TGluZS5sb29rQXQoIHYzICk7XG5cdFx0dGFyZ2V0TGluZS5zY2FsZS56ID0gdjMubGVuZ3RoKCk7XG5cblx0fTtcblxufSgpO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICpcbiAqXHQtIHNob3dzIGZydXN0dW0sIGxpbmUgb2Ygc2lnaHQgYW5kIHVwIG9mIHRoZSBjYW1lcmFcbiAqXHQtIHN1aXRhYmxlIGZvciBmYXN0IHVwZGF0ZXNcbiAqIFx0LSBiYXNlZCBvbiBmcnVzdHVtIHZpc3VhbGl6YXRpb24gaW4gbGlnaHRnbC5qcyBzaGFkb3dtYXAgZXhhbXBsZVxuICpcdFx0aHR0cDovL2V2YW53LmdpdGh1Yi5jb20vbGlnaHRnbC5qcy90ZXN0cy9zaGFkb3dtYXAuaHRtbFxuICovXG5cbmZ1bmN0aW9uIENhbWVyYUhlbHBlciggY2FtZXJhICkge1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZmZmLCB2ZXJ0ZXhDb2xvcnM6IEZhY2VDb2xvcnMgfSApO1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgY29sb3JzID0gW107XG5cblx0dmFyIHBvaW50TWFwID0ge307XG5cblx0Ly8gY29sb3JzXG5cblx0dmFyIGNvbG9yRnJ1c3R1bSA9IG5ldyBDb2xvciggMHhmZmFhMDAgKTtcblx0dmFyIGNvbG9yQ29uZSA9IG5ldyBDb2xvciggMHhmZjAwMDAgKTtcblx0dmFyIGNvbG9yVXAgPSBuZXcgQ29sb3IoIDB4MDBhYWZmICk7XG5cdHZhciBjb2xvclRhcmdldCA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcblx0dmFyIGNvbG9yQ3Jvc3MgPSBuZXcgQ29sb3IoIDB4MzMzMzMzICk7XG5cblx0Ly8gbmVhclxuXG5cdGFkZExpbmUoIFwibjFcIiwgXCJuMlwiLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggXCJuMlwiLCBcIm40XCIsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCBcIm40XCIsIFwibjNcIiwgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoIFwibjNcIiwgXCJuMVwiLCBjb2xvckZydXN0dW0gKTtcblxuXHQvLyBmYXJcblxuXHRhZGRMaW5lKCBcImYxXCIsIFwiZjJcIiwgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoIFwiZjJcIiwgXCJmNFwiLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggXCJmNFwiLCBcImYzXCIsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCBcImYzXCIsIFwiZjFcIiwgY29sb3JGcnVzdHVtICk7XG5cblx0Ly8gc2lkZXNcblxuXHRhZGRMaW5lKCBcIm4xXCIsIFwiZjFcIiwgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoIFwibjJcIiwgXCJmMlwiLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggXCJuM1wiLCBcImYzXCIsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCBcIm40XCIsIFwiZjRcIiwgY29sb3JGcnVzdHVtICk7XG5cblx0Ly8gY29uZVxuXG5cdGFkZExpbmUoIFwicFwiLCBcIm4xXCIsIGNvbG9yQ29uZSApO1xuXHRhZGRMaW5lKCBcInBcIiwgXCJuMlwiLCBjb2xvckNvbmUgKTtcblx0YWRkTGluZSggXCJwXCIsIFwibjNcIiwgY29sb3JDb25lICk7XG5cdGFkZExpbmUoIFwicFwiLCBcIm40XCIsIGNvbG9yQ29uZSApO1xuXG5cdC8vIHVwXG5cblx0YWRkTGluZSggXCJ1MVwiLCBcInUyXCIsIGNvbG9yVXAgKTtcblx0YWRkTGluZSggXCJ1MlwiLCBcInUzXCIsIGNvbG9yVXAgKTtcblx0YWRkTGluZSggXCJ1M1wiLCBcInUxXCIsIGNvbG9yVXAgKTtcblxuXHQvLyB0YXJnZXRcblxuXHRhZGRMaW5lKCBcImNcIiwgXCJ0XCIsIGNvbG9yVGFyZ2V0ICk7XG5cdGFkZExpbmUoIFwicFwiLCBcImNcIiwgY29sb3JDcm9zcyApO1xuXG5cdC8vIGNyb3NzXG5cblx0YWRkTGluZSggXCJjbjFcIiwgXCJjbjJcIiwgY29sb3JDcm9zcyApO1xuXHRhZGRMaW5lKCBcImNuM1wiLCBcImNuNFwiLCBjb2xvckNyb3NzICk7XG5cblx0YWRkTGluZSggXCJjZjFcIiwgXCJjZjJcIiwgY29sb3JDcm9zcyApO1xuXHRhZGRMaW5lKCBcImNmM1wiLCBcImNmNFwiLCBjb2xvckNyb3NzICk7XG5cblx0ZnVuY3Rpb24gYWRkTGluZSggYSwgYiwgY29sb3IgKSB7XG5cblx0XHRhZGRQb2ludCggYSwgY29sb3IgKTtcblx0XHRhZGRQb2ludCggYiwgY29sb3IgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gYWRkUG9pbnQoIGlkLCBjb2xvciApIHtcblxuXHRcdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcblx0XHRjb2xvcnMucHVzaCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xuXG5cdFx0aWYgKCBwb2ludE1hcFsgaWQgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRwb2ludE1hcFsgaWQgXSA9IFtdO1xuXG5cdFx0fVxuXG5cdFx0cG9pbnRNYXBbIGlkIF0ucHVzaCggKCB2ZXJ0aWNlcy5sZW5ndGggLyAzICkgLSAxICk7XG5cblx0fVxuXG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XG5cdGlmICggdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCApIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHR0aGlzLm1hdHJpeCA9IGNhbWVyYS5tYXRyaXhXb3JsZDtcblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy5wb2ludE1hcCA9IHBvaW50TWFwO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuQ2FtZXJhSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcbkNhbWVyYUhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDYW1lcmFIZWxwZXI7XG5cbkNhbWVyYUhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBnZW9tZXRyeSwgcG9pbnRNYXA7XG5cblx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBjYW1lcmEgPSBuZXcgQ2FtZXJhKCk7XG5cblx0ZnVuY3Rpb24gc2V0UG9pbnQoIHBvaW50LCB4LCB5LCB6ICkge1xuXG5cdFx0dmVjdG9yLnNldCggeCwgeSwgeiApLnVucHJvamVjdCggY2FtZXJhICk7XG5cblx0XHR2YXIgcG9pbnRzID0gcG9pbnRNYXBbIHBvaW50IF07XG5cblx0XHRpZiAoIHBvaW50cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBwb2ludHNbIGkgXSwgdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHRnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cdFx0cG9pbnRNYXAgPSB0aGlzLnBvaW50TWFwO1xuXG5cdFx0dmFyIHcgPSAxLCBoID0gMTtcblxuXHRcdC8vIHdlIG5lZWQganVzdCBjYW1lcmEgcHJvamVjdGlvbiBtYXRyaXhcblx0XHQvLyB3b3JsZCBtYXRyaXggbXVzdCBiZSBpZGVudGl0eVxuXG5cdFx0Y2FtZXJhLnByb2plY3Rpb25NYXRyaXguY29weSggdGhpcy5jYW1lcmEucHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0Ly8gY2VudGVyIC8gdGFyZ2V0XG5cblx0XHRzZXRQb2ludCggXCJjXCIsIDAsIDAsIC0gMSApO1xuXHRcdHNldFBvaW50KCBcInRcIiwgMCwgMCwgIDEgKTtcblxuXHRcdC8vIG5lYXJcblxuXHRcdHNldFBvaW50KCBcIm4xXCIsIC0gdywgLSBoLCAtIDEgKTtcblx0XHRzZXRQb2ludCggXCJuMlwiLCAgIHcsIC0gaCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoIFwibjNcIiwgLSB3LCAgIGgsIC0gMSApO1xuXHRcdHNldFBvaW50KCBcIm40XCIsICAgdywgICBoLCAtIDEgKTtcblxuXHRcdC8vIGZhclxuXG5cdFx0c2V0UG9pbnQoIFwiZjFcIiwgLSB3LCAtIGgsIDEgKTtcblx0XHRzZXRQb2ludCggXCJmMlwiLCAgIHcsIC0gaCwgMSApO1xuXHRcdHNldFBvaW50KCBcImYzXCIsIC0gdywgICBoLCAxICk7XG5cdFx0c2V0UG9pbnQoIFwiZjRcIiwgICB3LCAgIGgsIDEgKTtcblxuXHRcdC8vIHVwXG5cblx0XHRzZXRQb2ludCggXCJ1MVwiLCAgIHcgKiAwLjcsIGggKiAxLjEsIC0gMSApO1xuXHRcdHNldFBvaW50KCBcInUyXCIsIC0gdyAqIDAuNywgaCAqIDEuMSwgLSAxICk7XG5cdFx0c2V0UG9pbnQoIFwidTNcIiwgICAgICAgICAwLCBoICogMiwgICAtIDEgKTtcblxuXHRcdC8vIGNyb3NzXG5cblx0XHRzZXRQb2ludCggXCJjZjFcIiwgLSB3LCAgIDAsIDEgKTtcblx0XHRzZXRQb2ludCggXCJjZjJcIiwgICB3LCAgIDAsIDEgKTtcblx0XHRzZXRQb2ludCggXCJjZjNcIiwgICAwLCAtIGgsIDEgKTtcblx0XHRzZXRQb2ludCggXCJjZjRcIiwgICAwLCAgIGgsIDEgKTtcblxuXHRcdHNldFBvaW50KCBcImNuMVwiLCAtIHcsICAgMCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoIFwiY24yXCIsICAgdywgICAwLCAtIDEgKTtcblx0XHRzZXRQb2ludCggXCJjbjNcIiwgICAwLCAtIGgsIC0gMSApO1xuXHRcdHNldFBvaW50KCBcImNuNFwiLCAgIDAsICAgaCwgLSAxICk7XG5cblx0XHRnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0fTtcblxufSgpO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuZnVuY3Rpb24gQm94SGVscGVyKCBvYmplY3QsIGNvbG9yICkge1xuXG5cdHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuXG5cdGlmICggY29sb3IgPT09IHVuZGVmaW5lZCApIGNvbG9yID0gMHhmZmZmMDA7XG5cblx0dmFyIGluZGljZXMgPSBuZXcgVWludDE2QXJyYXkoIFsgMCwgMSwgMSwgMiwgMiwgMywgMywgMCwgNCwgNSwgNSwgNiwgNiwgNywgNywgNCwgMCwgNCwgMSwgNSwgMiwgNiwgMywgNyBdICk7XG5cdHZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KCA4ICogMyApO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeS5zZXRJbmRleCggbmV3IEJ1ZmZlckF0dHJpYnV0ZSggaW5kaWNlcywgMSApICk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkgKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IgfSApICk7XG5cblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5Cb3hIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuQm94SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJveEhlbHBlcjtcblxuQm94SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSAoIGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgYm94ID0gbmV3IEJveDMoKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCBvYmplY3QgKSB7XG5cblx0XHRpZiAoIG9iamVjdCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3hIZWxwZXI6IC51cGRhdGUoKSBoYXMgbm8gbG9uZ2VyIGFyZ3VtZW50cy4nICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMub2JqZWN0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGJveC5zZXRGcm9tT2JqZWN0KCB0aGlzLm9iamVjdCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBib3guaXNFbXB0eSgpICkgcmV0dXJuO1xuXG5cdFx0dmFyIG1pbiA9IGJveC5taW47XG5cdFx0dmFyIG1heCA9IGJveC5tYXg7XG5cblx0XHQvKlxuXHRcdCAgNV9fX180XG5cdFx0MS9fX18wL3xcblx0XHR8IDZfX3xfN1xuXHRcdDIvX19fMy9cblxuXHRcdDA6IG1heC54LCBtYXgueSwgbWF4Lnpcblx0XHQxOiBtaW4ueCwgbWF4LnksIG1heC56XG5cdFx0MjogbWluLngsIG1pbi55LCBtYXguelxuXHRcdDM6IG1heC54LCBtaW4ueSwgbWF4Lnpcblx0XHQ0OiBtYXgueCwgbWF4LnksIG1pbi56XG5cdFx0NTogbWluLngsIG1heC55LCBtaW4uelxuXHRcdDY6IG1pbi54LCBtaW4ueSwgbWluLnpcblx0XHQ3OiBtYXgueCwgbWluLnksIG1pbi56XG5cdFx0Ki9cblxuXHRcdHZhciBwb3NpdGlvbiA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblx0XHR2YXIgYXJyYXkgPSBwb3NpdGlvbi5hcnJheTtcblxuXHRcdGFycmF5WyAgMCBdID0gbWF4Lng7IGFycmF5WyAgMSBdID0gbWF4Lnk7IGFycmF5WyAgMiBdID0gbWF4Lno7XG5cdFx0YXJyYXlbICAzIF0gPSBtaW4ueDsgYXJyYXlbICA0IF0gPSBtYXgueTsgYXJyYXlbICA1IF0gPSBtYXguejtcblx0XHRhcnJheVsgIDYgXSA9IG1pbi54OyBhcnJheVsgIDcgXSA9IG1pbi55OyBhcnJheVsgIDggXSA9IG1heC56O1xuXHRcdGFycmF5WyAgOSBdID0gbWF4Lng7IGFycmF5WyAxMCBdID0gbWluLnk7IGFycmF5WyAxMSBdID0gbWF4Lno7XG5cdFx0YXJyYXlbIDEyIF0gPSBtYXgueDsgYXJyYXlbIDEzIF0gPSBtYXgueTsgYXJyYXlbIDE0IF0gPSBtaW4uejtcblx0XHRhcnJheVsgMTUgXSA9IG1pbi54OyBhcnJheVsgMTYgXSA9IG1heC55OyBhcnJheVsgMTcgXSA9IG1pbi56O1xuXHRcdGFycmF5WyAxOCBdID0gbWluLng7IGFycmF5WyAxOSBdID0gbWluLnk7IGFycmF5WyAyMCBdID0gbWluLno7XG5cdFx0YXJyYXlbIDIxIF0gPSBtYXgueDsgYXJyYXlbIDIyIF0gPSBtaW4ueTsgYXJyYXlbIDIzIF0gPSBtaW4uejtcblxuXHRcdHBvc2l0aW9uLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdHRoaXMuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0fTtcblxufSApKCk7XG5cbkJveEhlbHBlci5wcm90b3R5cGUuc2V0RnJvbU9iamVjdCA9IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuXHR0aGlzLnVwZGF0ZSgpO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL2dpdGh1Yi5jb20veno4NVxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICpcbiAqIENyZWF0ZXMgYW4gYXJyb3cgZm9yIHZpc3VhbGl6aW5nIGRpcmVjdGlvbnNcbiAqXG4gKiBQYXJhbWV0ZXJzOlxuICogIGRpciAtIFZlY3RvcjNcbiAqICBvcmlnaW4gLSBWZWN0b3IzXG4gKiAgbGVuZ3RoIC0gTnVtYmVyXG4gKiAgY29sb3IgLSBjb2xvciBpbiBoZXggdmFsdWVcbiAqICBoZWFkTGVuZ3RoIC0gTnVtYmVyXG4gKiAgaGVhZFdpZHRoIC0gTnVtYmVyXG4gKi9cblxudmFyIGxpbmVHZW9tZXRyeTtcbnZhciBjb25lR2VvbWV0cnk7XG5cbmZ1bmN0aW9uIEFycm93SGVscGVyKCBkaXIsIG9yaWdpbiwgbGVuZ3RoLCBjb2xvciwgaGVhZExlbmd0aCwgaGVhZFdpZHRoICkge1xuXG5cdC8vIGRpciBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0aWYgKCBjb2xvciA9PT0gdW5kZWZpbmVkICkgY29sb3IgPSAweGZmZmYwMDtcblx0aWYgKCBsZW5ndGggPT09IHVuZGVmaW5lZCApIGxlbmd0aCA9IDE7XG5cdGlmICggaGVhZExlbmd0aCA9PT0gdW5kZWZpbmVkICkgaGVhZExlbmd0aCA9IDAuMiAqIGxlbmd0aDtcblx0aWYgKCBoZWFkV2lkdGggPT09IHVuZGVmaW5lZCApIGhlYWRXaWR0aCA9IDAuMiAqIGhlYWRMZW5ndGg7XG5cblx0aWYgKCBsaW5lR2VvbWV0cnkgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGxpbmVHZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRcdGxpbmVHZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBbIDAsIDAsIDAsIDAsIDEsIDAgXSwgMyApICk7XG5cblx0XHRjb25lR2VvbWV0cnkgPSBuZXcgQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSggMCwgMC41LCAxLCA1LCAxICk7XG5cdFx0Y29uZUdlb21ldHJ5LnRyYW5zbGF0ZSggMCwgLSAwLjUsIDAgKTtcblxuXHR9XG5cblx0dGhpcy5wb3NpdGlvbi5jb3B5KCBvcmlnaW4gKTtcblxuXHR0aGlzLmxpbmUgPSBuZXcgTGluZSggbGluZUdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yIH0gKSApO1xuXHR0aGlzLmxpbmUubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLmFkZCggdGhpcy5saW5lICk7XG5cblx0dGhpcy5jb25lID0gbmV3IE1lc2goIGNvbmVHZW9tZXRyeSwgbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTtcblx0dGhpcy5jb25lLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5hZGQoIHRoaXMuY29uZSApO1xuXG5cdHRoaXMuc2V0RGlyZWN0aW9uKCBkaXIgKTtcblx0dGhpcy5zZXRMZW5ndGgoIGxlbmd0aCwgaGVhZExlbmd0aCwgaGVhZFdpZHRoICk7XG5cbn1cblxuQXJyb3dIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5BcnJvd0hlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBcnJvd0hlbHBlcjtcblxuQXJyb3dIZWxwZXIucHJvdG90eXBlLnNldERpcmVjdGlvbiA9ICggZnVuY3Rpb24gKCkge1xuXG5cdHZhciBheGlzID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHJhZGlhbnM7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHNldERpcmVjdGlvbiggZGlyICkge1xuXG5cdFx0Ly8gZGlyIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXG5cdFx0aWYgKCBkaXIueSA+IDAuOTk5OTkgKSB7XG5cblx0XHRcdHRoaXMucXVhdGVybmlvbi5zZXQoIDAsIDAsIDAsIDEgKTtcblxuXHRcdH0gZWxzZSBpZiAoIGRpci55IDwgLSAwLjk5OTk5ICkge1xuXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24uc2V0KCAxLCAwLCAwLCAwICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRheGlzLnNldCggZGlyLnosIDAsIC0gZGlyLnggKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0cmFkaWFucyA9IE1hdGguYWNvcyggZGlyLnkgKTtcblxuXHRcdFx0dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIHJhZGlhbnMgKTtcblxuXHRcdH1cblxuXHR9O1xuXG59KCkgKTtcblxuQXJyb3dIZWxwZXIucHJvdG90eXBlLnNldExlbmd0aCA9IGZ1bmN0aW9uICggbGVuZ3RoLCBoZWFkTGVuZ3RoLCBoZWFkV2lkdGggKSB7XG5cblx0aWYgKCBoZWFkTGVuZ3RoID09PSB1bmRlZmluZWQgKSBoZWFkTGVuZ3RoID0gMC4yICogbGVuZ3RoO1xuXHRpZiAoIGhlYWRXaWR0aCA9PT0gdW5kZWZpbmVkICkgaGVhZFdpZHRoID0gMC4yICogaGVhZExlbmd0aDtcblxuXHR0aGlzLmxpbmUuc2NhbGUuc2V0KCAxLCBNYXRoLm1heCggMCwgbGVuZ3RoIC0gaGVhZExlbmd0aCApLCAxICk7XG5cdHRoaXMubGluZS51cGRhdGVNYXRyaXgoKTtcblxuXHR0aGlzLmNvbmUuc2NhbGUuc2V0KCBoZWFkV2lkdGgsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApO1xuXHR0aGlzLmNvbmUucG9zaXRpb24ueSA9IGxlbmd0aDtcblx0dGhpcy5jb25lLnVwZGF0ZU1hdHJpeCgpO1xuXG59O1xuXG5BcnJvd0hlbHBlci5wcm90b3R5cGUuc2V0Q29sb3IgPSBmdW5jdGlvbiAoIGNvbG9yICkge1xuXG5cdHRoaXMubGluZS5tYXRlcmlhbC5jb2xvci5jb3B5KCBjb2xvciApO1xuXHR0aGlzLmNvbmUubWF0ZXJpYWwuY29sb3IuY29weSggY29sb3IgKTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIHNyb3VjaGVyYXkgLyBodHRwOi8vc3JvdWNoZXJheS5vcmcvXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEF4aXNIZWxwZXIoIHNpemUgKSB7XG5cblx0c2l6ZSA9IHNpemUgfHwgMTtcblxuXHR2YXIgdmVydGljZXMgPSBbXG5cdFx0MCwgMCwgMCwgIHNpemUsIDAsIDAsXG5cdFx0MCwgMCwgMCwgIDAsIHNpemUsIDAsXG5cdFx0MCwgMCwgMCwgIDAsIDAsIHNpemVcblx0XTtcblxuXHR2YXIgY29sb3JzID0gW1xuXHRcdDEsIDAsIDAsICAxLCAwLjYsIDAsXG5cdFx0MCwgMSwgMCwgIDAuNiwgMSwgMCxcblx0XHQwLCAwLCAxLCAgMCwgMC42LCAxXG5cdF07XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiBWZXJ0ZXhDb2xvcnMgfSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxufVxuXG5BeGlzSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcbkF4aXNIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQXhpc0hlbHBlcjtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgaHR0cHM6Ly9naXRodWIuY29tL3p6ODVcbiAqXG4gKiBDZW50cmlwZXRhbCBDYXRtdWxsUm9tIEN1cnZlIC0gd2hpY2ggaXMgdXNlZnVsIGZvciBhdm9pZGluZ1xuICogY3VzcHMgYW5kIHNlbGYtaW50ZXJzZWN0aW9ucyBpbiBub24tdW5pZm9ybSBjYXRtdWxsIHJvbSBjdXJ2ZXMuXG4gKiBodHRwOi8vd3d3LmNlbXl1a3NlbC5jb20vcmVzZWFyY2gvY2F0bXVsbHJvbV9wYXJhbS9jYXRtdWxscm9tLnBkZlxuICpcbiAqIGN1cnZlLnR5cGUgYWNjZXB0cyBjZW50cmlwZXRhbChkZWZhdWx0KSwgY2hvcmRhbCBhbmQgY2F0bXVsbHJvbVxuICogY3VydmUudGVuc2lvbiBpcyB1c2VkIGZvciBjYXRtdWxscm9tIHdoaWNoIGRlZmF1bHRzIHRvIDAuNVxuICovXG5cblxuLypcbkJhc2VkIG9uIGFuIG9wdGltaXplZCBjKysgc29sdXRpb24gaW5cbiAtIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvOTQ4OTczNi9jYXRtdWxsLXJvbS1jdXJ2ZS13aXRoLW5vLWN1c3BzLWFuZC1uby1zZWxmLWludGVyc2VjdGlvbnMvXG4gLSBodHRwOi8vaWRlb25lLmNvbS9Ob0ViVk1cblxuVGhpcyBDdWJpY1BvbHkgY2xhc3MgY291bGQgYmUgdXNlZCBmb3IgcmV1c2luZyBzb21lIHZhcmlhYmxlcyBhbmQgY2FsY3VsYXRpb25zLFxuYnV0IGZvciB0aHJlZS5qcyBjdXJ2ZSB1c2UsIGl0IGNvdWxkIGJlIHBvc3NpYmxlIGlubGluZWQgYW5kIGZsYXR0ZW4gaW50byBhIHNpbmdsZSBmdW5jdGlvbiBjYWxsXG53aGljaCBjYW4gYmUgcGxhY2VkIGluIEN1cnZlVXRpbHMuXG4qL1xuXG5mdW5jdGlvbiBDdWJpY1BvbHkoKSB7XG5cblx0dmFyIGMwID0gMCwgYzEgPSAwLCBjMiA9IDAsIGMzID0gMDtcblxuXHQvKlxuXHQgKiBDb21wdXRlIGNvZWZmaWNpZW50cyBmb3IgYSBjdWJpYyBwb2x5bm9taWFsXG5cdCAqICAgcChzKSA9IGMwICsgYzEqcyArIGMyKnNeMiArIGMzKnNeM1xuXHQgKiBzdWNoIHRoYXRcblx0ICogICBwKDApID0geDAsIHAoMSkgPSB4MVxuXHQgKiAgYW5kXG5cdCAqICAgcCcoMCkgPSB0MCwgcCcoMSkgPSB0MS5cblx0ICovXG5cdGZ1bmN0aW9uIGluaXQoIHgwLCB4MSwgdDAsIHQxICkge1xuXG5cdFx0YzAgPSB4MDtcblx0XHRjMSA9IHQwO1xuXHRcdGMyID0gLSAzICogeDAgKyAzICogeDEgLSAyICogdDAgLSB0MTtcblx0XHRjMyA9IDIgKiB4MCAtIDIgKiB4MSArIHQwICsgdDE7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRpbml0Q2F0bXVsbFJvbTogZnVuY3Rpb24gKCB4MCwgeDEsIHgyLCB4MywgdGVuc2lvbiApIHtcblxuXHRcdFx0aW5pdCggeDEsIHgyLCB0ZW5zaW9uICogKCB4MiAtIHgwICksIHRlbnNpb24gKiAoIHgzIC0geDEgKSApO1xuXG5cdFx0fSxcblxuXHRcdGluaXROb251bmlmb3JtQ2F0bXVsbFJvbTogZnVuY3Rpb24gKCB4MCwgeDEsIHgyLCB4MywgZHQwLCBkdDEsIGR0MiApIHtcblxuXHRcdFx0Ly8gY29tcHV0ZSB0YW5nZW50cyB3aGVuIHBhcmFtZXRlcml6ZWQgaW4gW3QxLHQyXVxuXHRcdFx0dmFyIHQxID0gKCB4MSAtIHgwICkgLyBkdDAgLSAoIHgyIC0geDAgKSAvICggZHQwICsgZHQxICkgKyAoIHgyIC0geDEgKSAvIGR0MTtcblx0XHRcdHZhciB0MiA9ICggeDIgLSB4MSApIC8gZHQxIC0gKCB4MyAtIHgxICkgLyAoIGR0MSArIGR0MiApICsgKCB4MyAtIHgyICkgLyBkdDI7XG5cblx0XHRcdC8vIHJlc2NhbGUgdGFuZ2VudHMgZm9yIHBhcmFtZXRyaXphdGlvbiBpbiBbMCwxXVxuXHRcdFx0dDEgKj0gZHQxO1xuXHRcdFx0dDIgKj0gZHQxO1xuXG5cdFx0XHRpbml0KCB4MSwgeDIsIHQxLCB0MiApO1xuXG5cdFx0fSxcblxuXHRcdGNhbGM6IGZ1bmN0aW9uICggdCApIHtcblxuXHRcdFx0dmFyIHQyID0gdCAqIHQ7XG5cdFx0XHR2YXIgdDMgPSB0MiAqIHQ7XG5cdFx0XHRyZXR1cm4gYzAgKyBjMSAqIHQgKyBjMiAqIHQyICsgYzMgKiB0MztcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbi8vXG5cbnZhciB0bXAgPSBuZXcgVmVjdG9yMygpO1xudmFyIHB4ID0gbmV3IEN1YmljUG9seSgpO1xudmFyIHB5ID0gbmV3IEN1YmljUG9seSgpO1xudmFyIHB6ID0gbmV3IEN1YmljUG9seSgpO1xuXG5mdW5jdGlvbiBDYXRtdWxsUm9tQ3VydmUzKCBwIC8qIGFycmF5IG9mIFZlY3RvcjMgKi8gKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMucG9pbnRzID0gcCB8fCBbXTtcblx0dGhpcy5jbG9zZWQgPSBmYWxzZTtcblxufVxuXG5DYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDYXRtdWxsUm9tQ3VydmUzO1xuXG5DYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCApIHtcblxuXHR2YXIgcG9pbnRzID0gdGhpcy5wb2ludHM7XG5cdHZhciBsID0gcG9pbnRzLmxlbmd0aDtcblxuXHRpZiAoIGwgPCAyICkgY29uc29sZS5sb2coICdkdWgsIHlvdSBuZWVkIGF0IGxlYXN0IDIgcG9pbnRzJyApO1xuXG5cdHZhciBwb2ludCA9ICggbCAtICggdGhpcy5jbG9zZWQgPyAwIDogMSApICkgKiB0O1xuXHR2YXIgaW50UG9pbnQgPSBNYXRoLmZsb29yKCBwb2ludCApO1xuXHR2YXIgd2VpZ2h0ID0gcG9pbnQgLSBpbnRQb2ludDtcblxuXHRpZiAoIHRoaXMuY2xvc2VkICkge1xuXG5cdFx0aW50UG9pbnQgKz0gaW50UG9pbnQgPiAwID8gMCA6ICggTWF0aC5mbG9vciggTWF0aC5hYnMoIGludFBvaW50ICkgLyBwb2ludHMubGVuZ3RoICkgKyAxICkgKiBwb2ludHMubGVuZ3RoO1xuXG5cdH0gZWxzZSBpZiAoIHdlaWdodCA9PT0gMCAmJiBpbnRQb2ludCA9PT0gbCAtIDEgKSB7XG5cblx0XHRpbnRQb2ludCA9IGwgLSAyO1xuXHRcdHdlaWdodCA9IDE7XG5cblx0fVxuXG5cdHZhciBwMCwgcDEsIHAyLCBwMzsgLy8gNCBwb2ludHNcblxuXHRpZiAoIHRoaXMuY2xvc2VkIHx8IGludFBvaW50ID4gMCApIHtcblxuXHRcdHAwID0gcG9pbnRzWyAoIGludFBvaW50IC0gMSApICUgbCBdO1xuXG5cdH0gZWxzZSB7XG5cblx0XHQvLyBleHRyYXBvbGF0ZSBmaXJzdCBwb2ludFxuXHRcdHRtcC5zdWJWZWN0b3JzKCBwb2ludHNbIDAgXSwgcG9pbnRzWyAxIF0gKS5hZGQoIHBvaW50c1sgMCBdICk7XG5cdFx0cDAgPSB0bXA7XG5cblx0fVxuXG5cdHAxID0gcG9pbnRzWyBpbnRQb2ludCAlIGwgXTtcblx0cDIgPSBwb2ludHNbICggaW50UG9pbnQgKyAxICkgJSBsIF07XG5cblx0aWYgKCB0aGlzLmNsb3NlZCB8fCBpbnRQb2ludCArIDIgPCBsICkge1xuXG5cdFx0cDMgPSBwb2ludHNbICggaW50UG9pbnQgKyAyICkgJSBsIF07XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIGV4dHJhcG9sYXRlIGxhc3QgcG9pbnRcblx0XHR0bXAuc3ViVmVjdG9ycyggcG9pbnRzWyBsIC0gMSBdLCBwb2ludHNbIGwgLSAyIF0gKS5hZGQoIHBvaW50c1sgbCAtIDEgXSApO1xuXHRcdHAzID0gdG1wO1xuXG5cdH1cblxuXHRpZiAoIHRoaXMudHlwZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMudHlwZSA9PT0gJ2NlbnRyaXBldGFsJyB8fCB0aGlzLnR5cGUgPT09ICdjaG9yZGFsJyApIHtcblxuXHRcdC8vIGluaXQgQ2VudHJpcGV0YWwgLyBDaG9yZGFsIENhdG11bGwtUm9tXG5cdFx0dmFyIHBvdyA9IHRoaXMudHlwZSA9PT0gJ2Nob3JkYWwnID8gMC41IDogMC4yNTtcblx0XHR2YXIgZHQwID0gTWF0aC5wb3coIHAwLmRpc3RhbmNlVG9TcXVhcmVkKCBwMSApLCBwb3cgKTtcblx0XHR2YXIgZHQxID0gTWF0aC5wb3coIHAxLmRpc3RhbmNlVG9TcXVhcmVkKCBwMiApLCBwb3cgKTtcblx0XHR2YXIgZHQyID0gTWF0aC5wb3coIHAyLmRpc3RhbmNlVG9TcXVhcmVkKCBwMyApLCBwb3cgKTtcblxuXHRcdC8vIHNhZmV0eSBjaGVjayBmb3IgcmVwZWF0ZWQgcG9pbnRzXG5cdFx0aWYgKCBkdDEgPCAxZS00ICkgZHQxID0gMS4wO1xuXHRcdGlmICggZHQwIDwgMWUtNCApIGR0MCA9IGR0MTtcblx0XHRpZiAoIGR0MiA8IDFlLTQgKSBkdDIgPSBkdDE7XG5cblx0XHRweC5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20oIHAwLngsIHAxLngsIHAyLngsIHAzLngsIGR0MCwgZHQxLCBkdDIgKTtcblx0XHRweS5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20oIHAwLnksIHAxLnksIHAyLnksIHAzLnksIGR0MCwgZHQxLCBkdDIgKTtcblx0XHRwei5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20oIHAwLnosIHAxLnosIHAyLnosIHAzLnosIGR0MCwgZHQxLCBkdDIgKTtcblxuXHR9IGVsc2UgaWYgKCB0aGlzLnR5cGUgPT09ICdjYXRtdWxscm9tJyApIHtcblxuXHRcdHZhciB0ZW5zaW9uID0gdGhpcy50ZW5zaW9uICE9PSB1bmRlZmluZWQgPyB0aGlzLnRlbnNpb24gOiAwLjU7XG5cdFx0cHguaW5pdENhdG11bGxSb20oIHAwLngsIHAxLngsIHAyLngsIHAzLngsIHRlbnNpb24gKTtcblx0XHRweS5pbml0Q2F0bXVsbFJvbSggcDAueSwgcDEueSwgcDIueSwgcDMueSwgdGVuc2lvbiApO1xuXHRcdHB6LmluaXRDYXRtdWxsUm9tKCBwMC56LCBwMS56LCBwMi56LCBwMy56LCB0ZW5zaW9uICk7XG5cblx0fVxuXG5cdHJldHVybiBuZXcgVmVjdG9yMyggcHguY2FsYyggd2VpZ2h0ICksIHB5LmNhbGMoIHdlaWdodCApLCBwei5jYWxjKCB3ZWlnaHQgKSApO1xuXG59O1xuXG5mdW5jdGlvbiBDdWJpY0JlemllckN1cnZlMyggdjAsIHYxLCB2MiwgdjMgKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudjAgPSB2MDtcblx0dGhpcy52MSA9IHYxO1xuXHR0aGlzLnYyID0gdjI7XG5cdHRoaXMudjMgPSB2MztcblxufVxuXG5DdWJpY0JlemllckN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcbkN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1YmljQmV6aWVyQ3VydmUzO1xuXG5DdWJpY0JlemllckN1cnZlMy5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQgKSB7XG5cblx0dmFyIHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2MiA9IHRoaXMudjIsIHYzID0gdGhpcy52MztcblxuXHRyZXR1cm4gbmV3IFZlY3RvcjMoXG5cdFx0Q3ViaWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLngsIHYzLnggKSxcblx0XHRDdWJpY0JlemllciggdCwgdjAueSwgdjEueSwgdjIueSwgdjMueSApLFxuXHRcdEN1YmljQmV6aWVyKCB0LCB2MC56LCB2MS56LCB2Mi56LCB2My56IClcblx0KTtcblxufTtcblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyQ3VydmUzKCB2MCwgdjEsIHYyICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnYwID0gdjA7XG5cdHRoaXMudjEgPSB2MTtcblx0dGhpcy52MiA9IHYyO1xuXG59XG5cblF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcblF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBRdWFkcmF0aWNCZXppZXJDdXJ2ZTM7XG5cblF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQgKSB7XG5cblx0dmFyIHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2MiA9IHRoaXMudjI7XG5cblx0cmV0dXJuIG5ldyBWZWN0b3IzKFxuXHRcdFF1YWRyYXRpY0JlemllciggdCwgdjAueCwgdjEueCwgdjIueCApLFxuXHRcdFF1YWRyYXRpY0JlemllciggdCwgdjAueSwgdjEueSwgdjIueSApLFxuXHRcdFF1YWRyYXRpY0JlemllciggdCwgdjAueiwgdjEueiwgdjIueiApXG5cdCk7XG5cbn07XG5cbmZ1bmN0aW9uIExpbmVDdXJ2ZTMoIHYxLCB2MiApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy52MSA9IHYxO1xuXHR0aGlzLnYyID0gdjI7XG5cbn1cblxuTGluZUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcbkxpbmVDdXJ2ZTMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGluZUN1cnZlMztcblxuTGluZUN1cnZlMy5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQgKSB7XG5cblx0aWYgKCB0ID09PSAxICkge1xuXG5cdFx0cmV0dXJuIHRoaXMudjIuY2xvbmUoKTtcblxuXHR9XG5cblx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmVjdG9yLnN1YlZlY3RvcnMoIHRoaXMudjIsIHRoaXMudjEgKTsgLy8gZGlmZlxuXHR2ZWN0b3IubXVsdGlwbHlTY2FsYXIoIHQgKTtcblx0dmVjdG9yLmFkZCggdGhpcy52MSApO1xuXG5cdHJldHVybiB2ZWN0b3I7XG5cbn07XG5cbmZ1bmN0aW9uIEFyY0N1cnZlKCBhWCwgYVksIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKSB7XG5cblx0RWxsaXBzZUN1cnZlLmNhbGwoIHRoaXMsIGFYLCBhWSwgYVJhZGl1cywgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApO1xuXG59XG5cbkFyY0N1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUgKTtcbkFyY0N1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEFyY0N1cnZlO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxudmFyIFNjZW5lVXRpbHMgPSB7XG5cblx0Y3JlYXRlTXVsdGlNYXRlcmlhbE9iamVjdDogZnVuY3Rpb24gKCBnZW9tZXRyeSwgbWF0ZXJpYWxzICkge1xuXG5cdFx0dmFyIGdyb3VwID0gbmV3IEdyb3VwKCk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBtYXRlcmlhbHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Z3JvdXAuYWRkKCBuZXcgTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsc1sgaSBdICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBncm91cDtcblxuXHR9LFxuXG5cdGRldGFjaDogZnVuY3Rpb24gKCBjaGlsZCwgcGFyZW50LCBzY2VuZSApIHtcblxuXHRcdGNoaWxkLmFwcGx5TWF0cml4KCBwYXJlbnQubWF0cml4V29ybGQgKTtcblx0XHRwYXJlbnQucmVtb3ZlKCBjaGlsZCApO1xuXHRcdHNjZW5lLmFkZCggY2hpbGQgKTtcblxuXHR9LFxuXG5cdGF0dGFjaDogZnVuY3Rpb24gKCBjaGlsZCwgc2NlbmUsIHBhcmVudCApIHtcblxuXHRcdHZhciBtYXRyaXhXb3JsZEludmVyc2UgPSBuZXcgTWF0cml4NCgpO1xuXHRcdG1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNlKCBwYXJlbnQubWF0cml4V29ybGQgKTtcblx0XHRjaGlsZC5hcHBseU1hdHJpeCggbWF0cml4V29ybGRJbnZlcnNlICk7XG5cblx0XHRzY2VuZS5yZW1vdmUoIGNoaWxkICk7XG5cdFx0cGFyZW50LmFkZCggY2hpbGQgKTtcblxuXHR9XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBGYWNlNCggYSwgYiwgYywgZCwgbm9ybWFsLCBjb2xvciwgbWF0ZXJpYWxJbmRleCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5GYWNlNCBoYXMgYmVlbiByZW1vdmVkLiBBIFRIUkVFLkZhY2UzIHdpbGwgYmUgY3JlYXRlZCBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBGYWNlMyggYSwgYiwgYywgbm9ybWFsLCBjb2xvciwgbWF0ZXJpYWxJbmRleCApO1xuXG59XG5cbnZhciBMaW5lU3RyaXAgPSAwO1xuXG52YXIgTGluZVBpZWNlcyA9IDE7XG5cbmZ1bmN0aW9uIE1lc2hGYWNlTWF0ZXJpYWwoIG1hdGVyaWFscyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5NZXNoRmFjZU1hdGVyaWFsIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBhbiBBcnJheSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG1hdGVyaWFscztcblxufVxuXG5mdW5jdGlvbiBNdWx0aU1hdGVyaWFsKCBtYXRlcmlhbHMgKSB7XG5cblx0aWYgKCBtYXRlcmlhbHMgPT09IHVuZGVmaW5lZCApIG1hdGVyaWFscyA9IFtdO1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk11bHRpTWF0ZXJpYWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGFuIEFycmF5IGluc3RlYWQuJyApO1xuXHRtYXRlcmlhbHMuaXNNdWx0aU1hdGVyaWFsID0gdHJ1ZTtcblx0bWF0ZXJpYWxzLm1hdGVyaWFscyA9IG1hdGVyaWFscztcblx0bWF0ZXJpYWxzLmNsb25lID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG1hdGVyaWFscy5zbGljZSgpO1xuXG5cdH07XG5cdHJldHVybiBtYXRlcmlhbHM7XG5cbn1cblxuZnVuY3Rpb24gUG9pbnRDbG91ZCggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBvaW50Q2xvdWQgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHMuJyApO1xuXHRyZXR1cm4gbmV3IFBvaW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cbn1cblxuZnVuY3Rpb24gUGFydGljbGUoIG1hdGVyaWFsICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBhcnRpY2xlIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuU3ByaXRlLicgKTtcblx0cmV0dXJuIG5ldyBTcHJpdGUoIG1hdGVyaWFsICk7XG5cbn1cblxuZnVuY3Rpb24gUGFydGljbGVTeXN0ZW0oIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5QYXJ0aWNsZVN5c3RlbSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50cy4nICk7XG5cdHJldHVybiBuZXcgUG9pbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxufVxuXG5mdW5jdGlvbiBQb2ludENsb3VkTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUG9pbnRDbG91ZE1hdGVyaWFsIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzTWF0ZXJpYWwuJyApO1xuXHRyZXR1cm4gbmV3IFBvaW50c01hdGVyaWFsKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuZnVuY3Rpb24gUGFydGljbGVCYXNpY01hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBhcnRpY2xlQmFzaWNNYXRlcmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLicgKTtcblx0cmV0dXJuIG5ldyBQb2ludHNNYXRlcmlhbCggcGFyYW1ldGVycyApO1xuXG59XG5cbmZ1bmN0aW9uIFBhcnRpY2xlU3lzdGVtTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGFydGljbGVTeXN0ZW1NYXRlcmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLicgKTtcblx0cmV0dXJuIG5ldyBQb2ludHNNYXRlcmlhbCggcGFyYW1ldGVycyApO1xuXG59XG5cbmZ1bmN0aW9uIFZlcnRleCggeCwgeSwgeiApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5WZXJ0ZXggaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLlZlY3RvcjMgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgVmVjdG9yMyggeCwgeSwgeiApO1xuXG59XG5cbi8vXG5cbmZ1bmN0aW9uIER5bmFtaWNCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5EeW5hbWljQnVmZmVyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKCkuc2V0RHluYW1pYyggdHJ1ZSApIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkuc2V0RHluYW1pYyggdHJ1ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEludDhBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5JbnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuSW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEludDhCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIFVpbnQ4QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVWludDhBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IFVpbnQ4QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBVaW50OENsYW1wZWRBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5VaW50OENsYW1wZWRBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEludDE2QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQxNkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEludDE2QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBVaW50MTZBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5VaW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50MTZCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBVaW50MTZCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEludDMyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW50MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEludDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBVaW50MzJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5VaW50MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50MzJCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBVaW50MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEZsb2F0MzJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5GbG9hdDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEZsb2F0NjRBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5GbG9hdDY0QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbi8vXG5cbkN1cnZlLmNyZWF0ZSA9IGZ1bmN0aW9uICggY29uc3RydWN0LCBnZXRQb2ludCApIHtcblxuXHRjb25zb2xlLmxvZyggJ1RIUkVFLkN1cnZlLmNyZWF0ZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQnICk7XG5cblx0Y29uc3RydWN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuXHRjb25zdHJ1Y3QucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0O1xuXHRjb25zdHJ1Y3QucHJvdG90eXBlLmdldFBvaW50ID0gZ2V0UG9pbnQ7XG5cblx0cmV0dXJuIGNvbnN0cnVjdDtcblxufTtcblxuLy9cblxuZnVuY3Rpb24gQ2xvc2VkU3BsaW5lQ3VydmUzKCBwb2ludHMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ2xvc2VkU3BsaW5lQ3VydmUzIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5DYXRtdWxsUm9tQ3VydmUzIGluc3RlYWQuJyApO1xuXG5cdENhdG11bGxSb21DdXJ2ZTMuY2FsbCggdGhpcywgcG9pbnRzICk7XG5cdHRoaXMudHlwZSA9ICdjYXRtdWxscm9tJztcblx0dGhpcy5jbG9zZWQgPSB0cnVlO1xuXG59XG5cbkNsb3NlZFNwbGluZUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZSApO1xuXG4vL1xuXG5mdW5jdGlvbiBTcGxpbmVDdXJ2ZTMoIHBvaW50cyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5TcGxpbmVDdXJ2ZTMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4nICk7XG5cblx0Q2F0bXVsbFJvbUN1cnZlMy5jYWxsKCB0aGlzLCBwb2ludHMgKTtcblx0dGhpcy50eXBlID0gJ2NhdG11bGxyb20nO1xuXG59XG5cblNwbGluZUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZSApO1xuXG4vL1xuXG5mdW5jdGlvbiBTcGxpbmUoIHBvaW50cyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5TcGxpbmUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4nICk7XG5cblx0Q2F0bXVsbFJvbUN1cnZlMy5jYWxsKCB0aGlzLCBwb2ludHMgKTtcblx0dGhpcy50eXBlID0gJ2NhdG11bGxyb20nO1xuXG59XG5cblNwbGluZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZSApO1xuXG5PYmplY3QuYXNzaWduKCBTcGxpbmUucHJvdG90eXBlLCB7XG5cblx0aW5pdEZyb21BcnJheTogZnVuY3Rpb24gKCBhICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNwbGluZTogLmluaXRGcm9tQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRnZXRDb250cm9sUG9pbnRzQXJyYXk6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU3BsaW5lOiAuZ2V0Q29udHJvbFBvaW50c0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0cmVwYXJhbWV0cml6ZUJ5QXJjTGVuZ3RoOiBmdW5jdGlvbiAoIHNhbXBsaW5nQ29lZiApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TcGxpbmU6IC5yZXBhcmFtZXRyaXplQnlBcmNMZW5ndGgoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuLy9cbmZ1bmN0aW9uIEJvdW5kaW5nQm94SGVscGVyKCBvYmplY3QsIGNvbG9yICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkJvdW5kaW5nQm94SGVscGVyIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIENyZWF0aW5nIGEgVEhSRUUuQm94SGVscGVyIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEJveEhlbHBlciggb2JqZWN0LCBjb2xvciApO1xuXG59XG5cbmZ1bmN0aW9uIEVkZ2VzSGVscGVyKCBvYmplY3QsIGhleCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5FZGdlc0hlbHBlciBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRWRnZXNHZW9tZXRyeSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBMaW5lU2VnbWVudHMoIG5ldyBFZGdlc0dlb21ldHJ5KCBvYmplY3QuZ2VvbWV0cnkgKSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBoZXggIT09IHVuZGVmaW5lZCA/IGhleCA6IDB4ZmZmZmZmIH0gKSApO1xuXG59XG5cbkdyaWRIZWxwZXIucHJvdG90eXBlLnNldENvbG9ycyA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuR3JpZEhlbHBlcjogc2V0Q29sb3JzKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCwgcGFzcyB0aGVtIGluIHRoZSBjb25zdHJ1Y3RvciBpbnN0ZWFkLicgKTtcblxufTtcblxuZnVuY3Rpb24gV2lyZWZyYW1lSGVscGVyKCBvYmplY3QsIGhleCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5XaXJlZnJhbWVIZWxwZXIgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLldpcmVmcmFtZUdlb21ldHJ5IGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IExpbmVTZWdtZW50cyggbmV3IFdpcmVmcmFtZUdlb21ldHJ5KCBvYmplY3QuZ2VvbWV0cnkgKSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBoZXggIT09IHVuZGVmaW5lZCA/IGhleCA6IDB4ZmZmZmZmIH0gKSApO1xuXG59XG5cbi8vXG5cbmZ1bmN0aW9uIFhIUkxvYWRlciggbWFuYWdlciApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5YSFJMb2FkZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5GaWxlTG9hZGVyLicgKTtcblx0cmV0dXJuIG5ldyBGaWxlTG9hZGVyKCBtYW5hZ2VyICk7XG5cbn1cblxuZnVuY3Rpb24gQmluYXJ5VGV4dHVyZUxvYWRlciggbWFuYWdlciApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5CaW5hcnlUZXh0dXJlTG9hZGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuRGF0YVRleHR1cmVMb2FkZXIuJyApO1xuXHRyZXR1cm4gbmV3IERhdGFUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICk7XG5cbn1cblxuLy9cblxuT2JqZWN0LmFzc2lnbiggQm94Mi5wcm90b3R5cGUsIHtcblxuXHRjZW50ZXI6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuY2VudGVyKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVyKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldENlbnRlciggb3B0aW9uYWxUYXJnZXQgKTtcblxuXHR9LFxuXHRlbXB0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmVtcHR5KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaXNFbXB0eSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCk7XG5cblx0fSxcblx0aXNJbnRlcnNlY3Rpb25Cb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzQm94KCBib3ggKTtcblxuXHR9LFxuXHRzaXplOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLnNpemUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRTaXplKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldFNpemUoIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0fVxufSApO1xuXG5PYmplY3QuYXNzaWduKCBCb3gzLnByb3RvdHlwZSwge1xuXG5cdGNlbnRlcjogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKCBvcHRpb25hbFRhcmdldCApO1xuXG5cdH0sXG5cdGVtcHR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuZW1wdHkoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pc0VtcHR5KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKTtcblxuXHR9LFxuXHRpc0ludGVyc2VjdGlvbkJveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNCb3goIGJveCApO1xuXG5cdH0sXG5cdGlzSW50ZXJzZWN0aW9uU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5pc0ludGVyc2VjdGlvblNwaGVyZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNTcGhlcmUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICk7XG5cblx0fSxcblx0c2l6ZTogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5zaXplKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0U2l6ZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRTaXplKCBvcHRpb25hbFRhcmdldCApO1xuXG5cdH1cbn0gKTtcblxuTGluZTMucHJvdG90eXBlLmNlbnRlciA9IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZTM6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4nICk7XG5cdHJldHVybiB0aGlzLmdldENlbnRlciggb3B0aW9uYWxUYXJnZXQgKTtcblxufTtcblxuX01hdGgucmFuZG9tMTYgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0aC5yYW5kb20xNigpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBNYXRoLnJhbmRvbSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gTWF0aC5yYW5kb20oKTtcblxufTtcblxuT2JqZWN0LmFzc2lnbiggTWF0cml4My5wcm90b3R5cGUsIHtcblxuXHRmbGF0dGVuVG9BcnJheU9mZnNldDogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLk1hdHJpeDM6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuXCIgKTtcblx0XHRyZXR1cm4gdGhpcy50b0FycmF5KCBhcnJheSwgb2Zmc2V0ICk7XG5cblx0fSxcblx0bXVsdGlwbHlWZWN0b3IzOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4MyggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDMoIHRoaXMgKTtcblxuXHR9LFxuXHRtdWx0aXBseVZlY3RvcjNBcnJheTogZnVuY3Rpb24gKCBhICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4MzogLm11bHRpcGx5VmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVuYW1lZC4gVXNlIG1hdHJpeC5hcHBseVRvVmVjdG9yM0FycmF5KCBhcnJheSApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB0aGlzLmFwcGx5VG9WZWN0b3IzQXJyYXkoIGEgKTtcblxuXHR9LFxuXHRhcHBseVRvQnVmZmVyOiBmdW5jdGlvbiggYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDM6IC5hcHBseVRvQnVmZmVyKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBidWZmZXIgKTtcblxuXHR9LFxuXHRhcHBseVRvVmVjdG9yM0FycmF5OiBmdW5jdGlvbiggYXJyYXksIG9mZnNldCwgbGVuZ3RoICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDM6IC5hcHBseVRvVmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIE1hdHJpeDQucHJvdG90eXBlLCB7XG5cblx0ZXh0cmFjdFBvc2l0aW9uOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuZXh0cmFjdFBvc2l0aW9uKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuY29weVBvc2l0aW9uKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmNvcHlQb3NpdGlvbiggbSApO1xuXG5cdH0sXG5cdGZsYXR0ZW5Ub0FycmF5T2Zmc2V0OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuTWF0cml4NDogLmZsYXR0ZW5Ub0FycmF5T2Zmc2V0KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC50b0FycmF5KCkgaW5zdGVhZC5cIiApO1xuXHRcdHJldHVybiB0aGlzLnRvQXJyYXkoIGFycmF5LCBvZmZzZXQgKTtcblxuXHR9LFxuXHRnZXRQb3NpdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldFBvc2l0aW9uKCkge1xuXG5cdFx0XHRpZiAoIHYxID09PSB1bmRlZmluZWQgKSB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuZ2V0UG9zaXRpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHYxLnNldEZyb21NYXRyaXhDb2x1bW4oIHRoaXMsIDMgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXHRzZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuc2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCBxICk7XG5cblx0fSxcblx0bXVsdGlwbHlUb0FycmF5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlUb0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0bXVsdGlwbHlWZWN0b3IzOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4NCggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMgKTtcblxuXHR9LFxuXHRtdWx0aXBseVZlY3RvcjQ6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yNCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggdGhpcyApO1xuXG5cdH0sXG5cdG11bHRpcGx5VmVjdG9yM0FycmF5OiBmdW5jdGlvbiAoIGEgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW5hbWVkLiBVc2UgbWF0cml4LmFwcGx5VG9WZWN0b3IzQXJyYXkoIGFycmF5ICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHRoaXMuYXBwbHlUb1ZlY3RvcjNBcnJheSggYSApO1xuXG5cdH0sXG5cdHJvdGF0ZUF4aXM6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMudHJhbnNmb3JtRGlyZWN0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0XHR2LnRyYW5zZm9ybURpcmVjdGlvbiggdGhpcyApO1xuXG5cdH0sXG5cdGNyb3NzVmVjdG9yOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5jcm9zc1ZlY3RvcigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggdGhpcyApO1xuXG5cdH0sXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC50cmFuc2xhdGUoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyb3RhdGVYOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnJvdGF0ZVgoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyb3RhdGVZOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnJvdGF0ZVkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyb3RhdGVaOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnJvdGF0ZVooKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyb3RhdGVCeUF4aXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlQnlBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0YXBwbHlUb0J1ZmZlcjogZnVuY3Rpb24oIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGggKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuYXBwbHlUb0J1ZmZlcigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBtYXRyaXguYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHRoaXMuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYnVmZmVyICk7XG5cblx0fSxcblx0YXBwbHlUb1ZlY3RvcjNBcnJheTogZnVuY3Rpb24oIGFycmF5LCBvZmZzZXQsIGxlbmd0aCApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAuYXBwbHlUb1ZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdG1ha2VGcnVzdHVtOiBmdW5jdGlvbiggbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubWFrZUZydXN0dW0oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy5tYWtlUGVyc3BlY3RpdmUoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICk7XG5cblx0fVxuXG59ICk7XG5cblBsYW5lLnByb3RvdHlwZS5pc0ludGVyc2VjdGlvbkxpbmUgPSBmdW5jdGlvbiAoIGxpbmUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGxhbmU6IC5pc0ludGVyc2VjdGlvbkxpbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzTGluZSgpLicgKTtcblx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0xpbmUoIGxpbmUgKTtcblxufTtcblxuUXVhdGVybmlvbi5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3IzID0gZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBpcyBub3cgdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggdGhpcyApO1xuXG59O1xuXG5PYmplY3QuYXNzaWduKCBSYXkucHJvdG90eXBlLCB7XG5cblx0aXNJbnRlcnNlY3Rpb25Cb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNCb3goIGJveCApO1xuXG5cdH0sXG5cdGlzSW50ZXJzZWN0aW9uUGxhbmU6IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvblBsYW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1BsYW5lKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNQbGFuZSggcGxhbmUgKTtcblxuXHR9LFxuXHRpc0ludGVyc2VjdGlvblNwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvblNwaGVyZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNTcGhlcmUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFNoYXBlLnByb3RvdHlwZSwge1xuXG5cdGV4dHJ1ZGU6IGZ1bmN0aW9uICggb3B0aW9ucyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlOiAuZXh0cnVkZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFeHRydWRlR2VvbWV0cnkoKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gbmV3IEV4dHJ1ZGVHZW9tZXRyeSggdGhpcywgb3B0aW9ucyApO1xuXG5cdH0sXG5cdG1ha2VHZW9tZXRyeTogZnVuY3Rpb24gKCBvcHRpb25zICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2hhcGU6IC5tYWtlR2VvbWV0cnkoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgU2hhcGVHZW9tZXRyeSgpIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiBuZXcgU2hhcGVHZW9tZXRyeSggdGhpcywgb3B0aW9ucyApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBWZWN0b3IyLnByb3RvdHlwZSwge1xuXG5cdGZyb21BdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlZlY3RvcjI6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yMy5wcm90b3R5cGUsIHtcblxuXHRzZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlZlY3RvcjM6IC5zZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFdWxlci5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBpbnN0ZWFkLicgKTtcblxuXHR9LFxuXHRzZXRFdWxlckZyb21RdWF0ZXJuaW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuVmVjdG9yMzogLnNldEV1bGVyRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXVsZXIuc2V0RnJvbVF1YXRlcm5pb24oKSBpbnN0ZWFkLicgKTtcblxuXHR9LFxuXHRnZXRQb3NpdGlvbkZyb21NYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5nZXRQb3NpdGlvbkZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4UG9zaXRpb24oKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBtICk7XG5cblx0fSxcblx0Z2V0U2NhbGVGcm9tTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZ2V0U2NhbGVGcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFNjYWxlKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLnNldEZyb21NYXRyaXhTY2FsZSggbSApO1xuXG5cdH0sXG5cdGdldENvbHVtbkZyb21NYXRyaXg6IGZ1bmN0aW9uICggaW5kZXgsIG1hdHJpeCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5nZXRDb2x1bW5Gcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeENvbHVtbigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCBtYXRyaXgsIGluZGV4ICk7XG5cblx0fSxcblx0YXBwbHlQcm9qZWN0aW9uOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuYXBwbHlQcm9qZWN0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5hcHBseU1hdHJpeDQoIG0gKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoIG0gKTtcblxuXHR9LFxuXHRmcm9tQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5WZWN0b3IzOiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFZlY3RvcjQucHJvdG90eXBlLCB7XG5cblx0ZnJvbUF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuVmVjdG9yNDogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApO1xuXG5cdH1cblxufSApO1xuXG4vL1xuXG5HZW9tZXRyeS5wcm90b3R5cGUuY29tcHV0ZVRhbmdlbnRzID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cbn07XG5cbk9iamVjdC5hc3NpZ24oIE9iamVjdDNELnByb3RvdHlwZSwge1xuXG5cdGdldENoaWxkQnlOYW1lOiBmdW5jdGlvbiAoIG5hbWUgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmdldENoaWxkQnlOYW1lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0T2JqZWN0QnlOYW1lKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldE9iamVjdEJ5TmFtZSggbmFtZSApO1xuXG5cdH0sXG5cdHJlbmRlckRlcHRoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLnJlbmRlckRlcHRoIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAucmVuZGVyT3JkZXIsIGluc3RlYWQuJyApO1xuXG5cdH0sXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCBkaXN0YW5jZSwgYXhpcyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAudHJhbnNsYXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC50cmFuc2xhdGVPbkF4aXMoIGF4aXMsIGRpc3RhbmNlICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCBheGlzLCBkaXN0YW5jZSApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggT2JqZWN0M0QucHJvdG90eXBlLCB7XG5cblx0ZXVsZXJPcmRlcjoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmV1bGVyT3JkZXIgaXMgbm93IC5yb3RhdGlvbi5vcmRlci4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5yb3RhdGlvbi5vcmRlcjtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmV1bGVyT3JkZXIgaXMgbm93IC5yb3RhdGlvbi5vcmRlci4nICk7XG5cdFx0XHR0aGlzLnJvdGF0aW9uLm9yZGVyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHVzZVF1YXRlcm5pb246IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1bHQuJyApO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1bHQuJyApO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIExPRC5wcm90b3R5cGUsIHtcblxuXHRvYmplY3RzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxPRDogLm9iamVjdHMgaGFzIGJlZW4gcmVuYW1lZCB0byAubGV2ZWxzLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmxldmVscztcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggU2tlbGV0b24ucHJvdG90eXBlLCAndXNlVmVydGV4VGV4dHVyZScsIHtcblxuXHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNrZWxldG9uOiB1c2VWZXJ0ZXhUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2tlbGV0b246IHVzZVZlcnRleFRleHR1cmUgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggQ3VydmUucHJvdG90eXBlLCAnX19hcmNMZW5ndGhEaXZpc2lvbnMnLCB7XG5cblx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZTogLl9fYXJjTGVuZ3RoRGl2aXNpb25zIGlzIG5vdyAuYXJjTGVuZ3RoRGl2aXNpb25zLicgKTtcblx0XHRyZXR1cm4gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM7XG5cblx0fSxcblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmU6IC5fX2FyY0xlbmd0aERpdmlzaW9ucyBpcyBub3cgLmFyY0xlbmd0aERpdmlzaW9ucy4nICk7XG5cdFx0dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMgPSB2YWx1ZTtcblxuXHR9XG5cbn0gKTtcblxuLy9cblxuUGVyc3BlY3RpdmVDYW1lcmEucHJvdG90eXBlLnNldExlbnMgPSBmdW5jdGlvbiAoIGZvY2FsTGVuZ3RoLCBmaWxtR2F1Z2UgKSB7XG5cblx0Y29uc29sZS53YXJuKCBcIlRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhLnNldExlbnMgaXMgZGVwcmVjYXRlZC4gXCIgK1xuXHRcdFx0XCJVc2UgLnNldEZvY2FsTGVuZ3RoIGFuZCAuZmlsbUdhdWdlIGZvciBhIHBob3RvZ3JhcGhpYyBzZXR1cC5cIiApO1xuXG5cdGlmICggZmlsbUdhdWdlICE9PSB1bmRlZmluZWQgKSB0aGlzLmZpbG1HYXVnZSA9IGZpbG1HYXVnZTtcblx0dGhpcy5zZXRGb2NhbExlbmd0aCggZm9jYWxMZW5ndGggKTtcblxufTtcblxuLy9cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIExpZ2h0LnByb3RvdHlwZSwge1xuXHRvbmx5U2hhZG93OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAub25seVNoYWRvdyBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhRm92OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUZvdiBpcyBub3cgLnNoYWRvdy5jYW1lcmEuZm92LicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5mb3YgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhTGVmdDoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFMZWZ0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5sZWZ0LicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5sZWZ0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYVJpZ2h0OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVJpZ2h0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5yaWdodC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEucmlnaHQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhVG9wOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVRvcCBpcyBub3cgLnNoYWRvdy5jYW1lcmEudG9wLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS50b3AgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhQm90dG9tOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUJvdHRvbSBpcyBub3cgLnNoYWRvdy5jYW1lcmEuYm90dG9tLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5ib3R0b20gPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhTmVhcjoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFOZWFyIGlzIG5vdyAuc2hhZG93LmNhbWVyYS5uZWFyLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5uZWFyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYUZhcjoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZhci4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEuZmFyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYVZpc2libGU6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFWaXNpYmxlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuQ2FtZXJhSGVscGVyKCBsaWdodC5zaGFkb3cuY2FtZXJhICkgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0JpYXM6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93QmlhcyBpcyBub3cgLnNoYWRvdy5iaWFzLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmJpYXMgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93RGFya25lc3M6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dEYXJrbmVzcyBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93TWFwV2lkdGg6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93TWFwV2lkdGggaXMgbm93IC5zaGFkb3cubWFwU2l6ZS53aWR0aC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5tYXBTaXplLndpZHRoID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd01hcEhlaWdodDoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dNYXBIZWlnaHQgaXMgbm93IC5zaGFkb3cubWFwU2l6ZS5oZWlnaHQuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cubWFwU2l6ZS5oZWlnaHQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fVxufSApO1xuXG4vL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwge1xuXG5cdGxlbmd0aDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5sZW5ndGggaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5jb3VudCBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmFycmF5Lmxlbmd0aDtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSwge1xuXG5cdGFkZEluZGV4OiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRJbmRleCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEluZGV4KCkuJyApO1xuXHRcdHRoaXMuc2V0SW5kZXgoIGluZGV4ICk7XG5cblx0fSxcblx0YWRkRHJhd0NhbGw6IGZ1bmN0aW9uICggc3RhcnQsIGNvdW50LCBpbmRleE9mZnNldCApIHtcblxuXHRcdGlmICggaW5kZXhPZmZzZXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGREcmF3Q2FsbCgpIG5vIGxvbmdlciBzdXBwb3J0cyBpbmRleE9mZnNldC4nICk7XG5cblx0XHR9XG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGREcmF3Q2FsbCgpIGlzIG5vdyAuYWRkR3JvdXAoKS4nICk7XG5cdFx0dGhpcy5hZGRHcm91cCggc3RhcnQsIGNvdW50ICk7XG5cblx0fSxcblx0Y2xlYXJEcmF3Q2FsbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY2xlYXJEcmF3Q2FsbHMoKSBpcyBub3cgLmNsZWFyR3JvdXBzKCkuJyApO1xuXHRcdHRoaXMuY2xlYXJHcm91cHMoKTtcblxuXHR9LFxuXHRjb21wdXRlVGFuZ2VudHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0Y29tcHV0ZU9mZnNldHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZU9mZnNldHMoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSwge1xuXG5cdGRyYXdjYWxsczoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5kcmF3Y2FsbHMgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ3JvdXBzLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmdyb3VwcztcblxuXHRcdH1cblx0fSxcblx0b2Zmc2V0czoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLm9mZnNldHMgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ3JvdXBzLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmdyb3VwcztcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBVbmlmb3JtLnByb3RvdHlwZSwge1xuXG5cdGR5bmFtaWM6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVW5pZm9ybTogLmR5bmFtaWMgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG9iamVjdC5vbkJlZm9yZVJlbmRlcigpIGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHRvblVwZGF0ZToge1xuXHRcdHZhbHVlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlVuaWZvcm06IC5vblVwZGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBvYmplY3Qub25CZWZvcmVSZW5kZXIoKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIE1hdGVyaWFsLnByb3RvdHlwZSwge1xuXG5cdHdyYXBBcm91bmQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IC53cmFwQXJvdW5kIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IC53cmFwQXJvdW5kIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHR3cmFwUkdCOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGVyaWFsOiAud3JhcFJHQiBoYXMgYmVlbiByZW1vdmVkLicgKTtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IoKTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBNZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUsIHtcblxuXHRtZXRhbDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbDogLm1ldGFsIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1lc2hQaG9uZ01hdGVyaWFsOiAubWV0YWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsIGluc3RlYWQnICk7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLCB7XG5cblx0ZGVyaXZhdGl2ZXM6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2hhZGVyTWF0ZXJpYWw6IC5kZXJpdmF0aXZlcyBoYXMgYmVlbiBtb3ZlZCB0byAuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcy4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmRlcml2YXRpdmVzO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLiBTaGFkZXJNYXRlcmlhbDogLmRlcml2YXRpdmVzIGhhcyBiZWVuIG1vdmVkIHRvIC5leHRlbnNpb25zLmRlcml2YXRpdmVzLicgKTtcblx0XHRcdHRoaXMuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcyA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmFzc2lnbiggV2ViR0xSZW5kZXJlci5wcm90b3R5cGUsIHtcblxuXHRnZXRDdXJyZW50UmVuZGVyVGFyZ2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0Q3VycmVudFJlbmRlclRhcmdldCgpIGlzIG5vdyAuZ2V0UmVuZGVyVGFyZ2V0KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldFJlbmRlclRhcmdldCgpO1xuXG5cdH0sXG5cblx0c3VwcG9ydHNGbG9hdFRleHR1cmVzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNGbG9hdFRleHR1cmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnT0VTX3RleHR1cmVfZmxvYXRcXCcgKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdCcgKTtcblxuXHR9LFxuXHRzdXBwb3J0c0hhbGZGbG9hdFRleHR1cmVzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ09FU190ZXh0dXJlX2hhbGZfZmxvYXRcXCcgKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0JyApO1xuXG5cdH0sXG5cdHN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ09FU19zdGFuZGFyZF9kZXJpdmF0aXZlc1xcJyApLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcycgKTtcblxuXHR9LFxuXHRzdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUzNUQzogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGNcXCcgKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKTtcblxuXHR9LFxuXHRzdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUFZSVEM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUFZSVEMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGNcXCcgKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICk7XG5cblx0fSxcblx0c3VwcG9ydHNCbGVuZE1pbk1heDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQmxlbmRNaW5NYXgoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdFWFRfYmxlbmRfbWlubWF4XFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnRVhUX2JsZW5kX21pbm1heCcgKTtcblxuXHR9LFxuXHRzdXBwb3J0c1ZlcnRleFRleHR1cmVzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcygpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzLicgKTtcblx0XHRyZXR1cm4gdGhpcy5jYXBhYmlsaXRpZXMudmVydGV4VGV4dHVyZXM7XG5cblx0fSxcblx0c3VwcG9ydHNJbnN0YW5jZWRBcnJheXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0luc3RhbmNlZEFycmF5cygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ0FOR0xFX2luc3RhbmNlZF9hcnJheXNcXCcgKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApO1xuXG5cdH0sXG5cdGVuYWJsZVNjaXNzb3JUZXN0OiBmdW5jdGlvbiAoIGJvb2xlYW4gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZW5hYmxlU2Npc3NvclRlc3QoKSBpcyBub3cgLnNldFNjaXNzb3JUZXN0KCkuJyApO1xuXHRcdHRoaXMuc2V0U2Npc3NvclRlc3QoIGJvb2xlYW4gKTtcblxuXHR9LFxuXHRpbml0TWF0ZXJpYWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5pbml0TWF0ZXJpYWwoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRhZGRQcmVQbHVnaW46IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5hZGRQcmVQbHVnaW4oKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRhZGRQb3N0UGx1Z2luOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWRkUG9zdFBsdWdpbigpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHVwZGF0ZVNoYWRvd01hcDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnVwZGF0ZVNoYWRvd01hcCgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggV2ViR0xSZW5kZXJlci5wcm90b3R5cGUsIHtcblxuXHRzaGFkb3dNYXBFbmFibGVkOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnNoYWRvd01hcC5lbmFibGVkO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBFbmFibGVkIGlzIG5vdyAuc2hhZG93TWFwLmVuYWJsZWQuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3dNYXAuZW5hYmxlZCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dNYXBUeXBlOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnNoYWRvd01hcC50eXBlO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBUeXBlIGlzIG5vdyAuc2hhZG93TWFwLnR5cGUuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3dNYXAudHlwZSA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dNYXBDdWxsRmFjZToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zaGFkb3dNYXAuY3VsbEZhY2U7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEN1bGxGYWNlIGlzIG5vdyAuc2hhZG93TWFwLmN1bGxGYWNlLicgKTtcblx0XHRcdHRoaXMuc2hhZG93TWFwLmN1bGxGYWNlID0gdmFsdWU7XG5cblx0XHR9XG5cdH1cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFdlYkdMU2hhZG93TWFwLnByb3RvdHlwZSwge1xuXG5cdGN1bGxGYWNlOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnJlbmRlclJldmVyc2VTaWRlZCA/IEN1bGxGYWNlRnJvbnQgOiBDdWxsRmFjZUJhY2s7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCBjdWxsRmFjZSApIHtcblxuXHRcdFx0dmFyIHZhbHVlID0gKCBjdWxsRmFjZSAhPT0gQ3VsbEZhY2VCYWNrICk7XG5cdFx0XHRjb25zb2xlLndhcm4oIFwiV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5jdWxsRmFjZSBpcyBkZXByZWNhdGVkLiBTZXQgLnNoYWRvd01hcC5yZW5kZXJSZXZlcnNlU2lkZWQgdG8gXCIgKyB2YWx1ZSArIFwiLlwiICk7XG5cdFx0XHR0aGlzLnJlbmRlclJldmVyc2VTaWRlZCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFdlYkdMUmVuZGVyVGFyZ2V0LnByb3RvdHlwZSwge1xuXG5cdHdyYXBTOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUud3JhcFM7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwUyBpcyBub3cgLnRleHR1cmUud3JhcFMuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLndyYXBTID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHdyYXBUOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0dXJlLndyYXBULicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUud3JhcFQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwVCBpcyBub3cgLnRleHR1cmUud3JhcFQuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLndyYXBUID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdG1hZ0ZpbHRlcjoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUubWFnRmlsdGVyO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWFnRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5tYWdGaWx0ZXIuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLm1hZ0ZpbHRlciA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRtaW5GaWx0ZXI6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5taW5GaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1pbkZpbHRlci4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLm1pbkZpbHRlcjtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1pbkZpbHRlciBpcyBub3cgLnRleHR1cmUubWluRmlsdGVyLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5taW5GaWx0ZXIgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0YW5pc290cm9weToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmFuaXNvdHJvcHkgaXMgbm93IC50ZXh0dXJlLmFuaXNvdHJvcHkuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5hbmlzb3Ryb3B5O1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuYW5pc290cm9weSBpcyBub3cgLnRleHR1cmUuYW5pc290cm9weS4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUuYW5pc290cm9weSA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRvZmZzZXQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5vZmZzZXQgaXMgbm93IC50ZXh0dXJlLm9mZnNldC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLm9mZnNldDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm9mZnNldCBpcyBub3cgLnRleHR1cmUub2Zmc2V0LicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5vZmZzZXQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0cmVwZWF0OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5yZXBlYXQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5yZXBlYXQgaXMgbm93IC50ZXh0dXJlLnJlcGVhdC4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUucmVwZWF0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdGZvcm1hdDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBpcyBub3cgLnRleHR1cmUuZm9ybWF0LicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUuZm9ybWF0O1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZm9ybWF0IGlzIG5vdyAudGV4dHVyZS5mb3JtYXQuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLmZvcm1hdCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHR0eXBlOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLnR5cGU7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC50eXBlIGlzIG5vdyAudGV4dHVyZS50eXBlLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS50eXBlID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdGdlbmVyYXRlTWlwbWFwczoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmdlbmVyYXRlTWlwbWFwcyBpcyBub3cgLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZ2VuZXJhdGVNaXBtYXBzIGlzIG5vdyAudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuQXVkaW8ucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbiAoIGZpbGUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IC5sb2FkIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5BdWRpb0xvYWRlciBpbnN0ZWFkLicgKTtcblx0dmFyIHNjb3BlID0gdGhpcztcblx0dmFyIGF1ZGlvTG9hZGVyID0gbmV3IEF1ZGlvTG9hZGVyKCk7XG5cdGF1ZGlvTG9hZGVyLmxvYWQoIGZpbGUsIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0c2NvcGUuc2V0QnVmZmVyKCBidWZmZXIgKTtcblxuXHR9ICk7XG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5BdWRpb0FuYWx5c2VyLnByb3RvdHlwZS5nZXREYXRhID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvQW5hbHlzZXI6IC5nZXREYXRhKCkgaXMgbm93IC5nZXRGcmVxdWVuY3lEYXRhKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5nZXRGcmVxdWVuY3lEYXRhKCk7XG5cbn07XG5cbi8vXG5cbnZhciBHZW9tZXRyeVV0aWxzID0ge1xuXG5cdG1lcmdlOiBmdW5jdGlvbiAoIGdlb21ldHJ5MSwgZ2VvbWV0cnkyLCBtYXRlcmlhbEluZGV4T2Zmc2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuR2VvbWV0cnlVdGlsczogLm1lcmdlKCkgaGFzIGJlZW4gbW92ZWQgdG8gR2VvbWV0cnkuIFVzZSBnZW9tZXRyeS5tZXJnZSggZ2VvbWV0cnkyLCBtYXRyaXgsIG1hdGVyaWFsSW5kZXhPZmZzZXQgKSBpbnN0ZWFkLicgKTtcblx0XHR2YXIgbWF0cml4O1xuXG5cdFx0aWYgKCBnZW9tZXRyeTIuaXNNZXNoICkge1xuXG5cdFx0XHRnZW9tZXRyeTIubWF0cml4QXV0b1VwZGF0ZSAmJiBnZW9tZXRyeTIudXBkYXRlTWF0cml4KCk7XG5cblx0XHRcdG1hdHJpeCA9IGdlb21ldHJ5Mi5tYXRyaXg7XG5cdFx0XHRnZW9tZXRyeTIgPSBnZW9tZXRyeTIuZ2VvbWV0cnk7XG5cblx0XHR9XG5cblx0XHRnZW9tZXRyeTEubWVyZ2UoIGdlb21ldHJ5MiwgbWF0cml4LCBtYXRlcmlhbEluZGV4T2Zmc2V0ICk7XG5cblx0fSxcblxuXHRjZW50ZXI6IGZ1bmN0aW9uICggZ2VvbWV0cnkgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5HZW9tZXRyeVV0aWxzOiAuY2VudGVyKCkgaGFzIGJlZW4gbW92ZWQgdG8gR2VvbWV0cnkuIFVzZSBnZW9tZXRyeS5jZW50ZXIoKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gZ2VvbWV0cnkuY2VudGVyKCk7XG5cblx0fVxuXG59O1xuXG52YXIgSW1hZ2VVdGlscyA9IHtcblxuXHRjcm9zc09yaWdpbjogdW5kZWZpbmVkLFxuXG5cdGxvYWRUZXh0dXJlOiBmdW5jdGlvbiAoIHVybCwgbWFwcGluZywgb25Mb2FkLCBvbkVycm9yICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW1hZ2VVdGlscy5sb2FkVGV4dHVyZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuVGV4dHVyZUxvYWRlcigpIGluc3RlYWQuJyApO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBUZXh0dXJlTG9hZGVyKCk7XG5cdFx0bG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7XG5cblx0XHR2YXIgdGV4dHVyZSA9IGxvYWRlci5sb2FkKCB1cmwsIG9uTG9hZCwgdW5kZWZpbmVkLCBvbkVycm9yICk7XG5cblx0XHRpZiAoIG1hcHBpbmcgKSB0ZXh0dXJlLm1hcHBpbmcgPSBtYXBwaW5nO1xuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fSxcblxuXHRsb2FkVGV4dHVyZUN1YmU6IGZ1bmN0aW9uICggdXJscywgbWFwcGluZywgb25Mb2FkLCBvbkVycm9yICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW1hZ2VVdGlscy5sb2FkVGV4dHVyZUN1YmUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkN1YmVUZXh0dXJlTG9hZGVyKCkgaW5zdGVhZC4nICk7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEN1YmVUZXh0dXJlTG9hZGVyKCk7XG5cdFx0bG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7XG5cblx0XHR2YXIgdGV4dHVyZSA9IGxvYWRlci5sb2FkKCB1cmxzLCBvbkxvYWQsIHVuZGVmaW5lZCwgb25FcnJvciApO1xuXG5cdFx0aWYgKCBtYXBwaW5nICkgdGV4dHVyZS5tYXBwaW5nID0gbWFwcGluZztcblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH0sXG5cblx0bG9hZENvbXByZXNzZWRUZXh0dXJlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuSW1hZ2VVdGlscy5sb2FkQ29tcHJlc3NlZFRleHR1cmUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkREU0xvYWRlciBpbnN0ZWFkLicgKTtcblxuXHR9LFxuXG5cdGxvYWRDb21wcmVzc2VkVGV4dHVyZUN1YmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5JbWFnZVV0aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZUN1YmUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkREU0xvYWRlciBpbnN0ZWFkLicgKTtcblxuXHR9XG5cbn07XG5cbi8vXG5cbmZ1bmN0aW9uIFByb2plY3RvcigpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvamVjdG9yIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy9yZW5kZXJlcnMvUHJvamVjdG9yLmpzLicgKTtcblxuXHR0aGlzLnByb2plY3RWZWN0b3IgPSBmdW5jdGlvbiAoIHZlY3RvciwgY2FtZXJhICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUHJvamVjdG9yOiAucHJvamVjdFZlY3RvcigpIGlzIG5vdyB2ZWN0b3IucHJvamVjdCgpLicgKTtcblx0XHR2ZWN0b3IucHJvamVjdCggY2FtZXJhICk7XG5cblx0fTtcblxuXHR0aGlzLnVucHJvamVjdFZlY3RvciA9IGZ1bmN0aW9uICggdmVjdG9yLCBjYW1lcmEgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Qcm9qZWN0b3I6IC51bnByb2plY3RWZWN0b3IoKSBpcyBub3cgdmVjdG9yLnVucHJvamVjdCgpLicgKTtcblx0XHR2ZWN0b3IudW5wcm9qZWN0KCBjYW1lcmEgKTtcblxuXHR9O1xuXG5cdHRoaXMucGlja2luZ1JheSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9qZWN0b3I6IC5waWNraW5nUmF5KCkgaXMgbm93IHJheWNhc3Rlci5zZXRGcm9tQ2FtZXJhKCkuJyApO1xuXG5cdH07XG5cbn1cblxuLy9cblxuZnVuY3Rpb24gQ2FudmFzUmVuZGVyZXIoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkNhbnZhc1JlbmRlcmVyIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy9yZW5kZXJlcnMvQ2FudmFzUmVuZGVyZXIuanMnICk7XG5cblx0dGhpcy5kb21FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICk7XG5cdHRoaXMuY2xlYXIgPSBmdW5jdGlvbiAoKSB7fTtcblx0dGhpcy5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7fTtcblx0dGhpcy5zZXRDbGVhckNvbG9yID0gZnVuY3Rpb24gKCkge307XG5cdHRoaXMuc2V0U2l6ZSA9IGZ1bmN0aW9uICgpIHt9O1xuXG59XG5cbmV4cG9ydCB7IFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZSwgV2ViR0xSZW5kZXJUYXJnZXQsIFdlYkdMUmVuZGVyZXIsIFNoYWRlckxpYiwgVW5pZm9ybXNMaWIsIFVuaWZvcm1zVXRpbHMsIFNoYWRlckNodW5rLCBGb2dFeHAyLCBGb2csIFNjZW5lLCBMZW5zRmxhcmUsIFNwcml0ZSwgTE9ELCBTa2lubmVkTWVzaCwgU2tlbGV0b24sIEJvbmUsIE1lc2gsIExpbmVTZWdtZW50cywgTGluZUxvb3AsIExpbmUsIFBvaW50cywgR3JvdXAsIFZpZGVvVGV4dHVyZSwgRGF0YVRleHR1cmUsIENvbXByZXNzZWRUZXh0dXJlLCBDdWJlVGV4dHVyZSwgQ2FudmFzVGV4dHVyZSwgRGVwdGhUZXh0dXJlLCBUZXh0dXJlLCBDb21wcmVzc2VkVGV4dHVyZUxvYWRlciwgRGF0YVRleHR1cmVMb2FkZXIsIEN1YmVUZXh0dXJlTG9hZGVyLCBUZXh0dXJlTG9hZGVyLCBPYmplY3RMb2FkZXIsIE1hdGVyaWFsTG9hZGVyLCBCdWZmZXJHZW9tZXRyeUxvYWRlciwgRGVmYXVsdExvYWRpbmdNYW5hZ2VyLCBMb2FkaW5nTWFuYWdlciwgSlNPTkxvYWRlciwgSW1hZ2VMb2FkZXIsIEZvbnRMb2FkZXIsIEZpbGVMb2FkZXIsIExvYWRlciwgQ2FjaGUsIEF1ZGlvTG9hZGVyLCBTcG90TGlnaHRTaGFkb3csIFNwb3RMaWdodCwgUG9pbnRMaWdodCwgUmVjdEFyZWFMaWdodCwgSGVtaXNwaGVyZUxpZ2h0LCBEaXJlY3Rpb25hbExpZ2h0U2hhZG93LCBEaXJlY3Rpb25hbExpZ2h0LCBBbWJpZW50TGlnaHQsIExpZ2h0U2hhZG93LCBMaWdodCwgU3RlcmVvQ2FtZXJhLCBQZXJzcGVjdGl2ZUNhbWVyYSwgT3J0aG9ncmFwaGljQ2FtZXJhLCBDdWJlQ2FtZXJhLCBBcnJheUNhbWVyYSwgQ2FtZXJhLCBBdWRpb0xpc3RlbmVyLCBQb3NpdGlvbmFsQXVkaW8sIEF1ZGlvQ29udGV4dCwgQXVkaW9BbmFseXNlciwgQXVkaW8sIFZlY3RvcktleWZyYW1lVHJhY2ssIFN0cmluZ0tleWZyYW1lVHJhY2ssIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLCBOdW1iZXJLZXlmcmFtZVRyYWNrLCBDb2xvcktleWZyYW1lVHJhY2ssIEJvb2xlYW5LZXlmcmFtZVRyYWNrLCBQcm9wZXJ0eU1peGVyLCBQcm9wZXJ0eUJpbmRpbmcsIEtleWZyYW1lVHJhY2ssIEFuaW1hdGlvblV0aWxzLCBBbmltYXRpb25PYmplY3RHcm91cCwgQW5pbWF0aW9uTWl4ZXIsIEFuaW1hdGlvbkNsaXAsIFVuaWZvcm0sIEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5LCBCdWZmZXJHZW9tZXRyeSwgR2VvbWV0cnlJZENvdW50LCBHZW9tZXRyeSwgSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUsIEluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyLCBJbnRlcmxlYXZlZEJ1ZmZlciwgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlLCBGYWNlMywgT2JqZWN0M0QsIFJheWNhc3RlciwgTGF5ZXJzLCBFdmVudERpc3BhdGNoZXIsIENsb2NrLCBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQsIExpbmVhckludGVycG9sYW50LCBEaXNjcmV0ZUludGVycG9sYW50LCBDdWJpY0ludGVycG9sYW50LCBJbnRlcnBvbGFudCwgVHJpYW5nbGUsIF9NYXRoIGFzIE1hdGgsIFNwaGVyaWNhbCwgQ3lsaW5kcmljYWwsIFBsYW5lLCBGcnVzdHVtLCBTcGhlcmUsIFJheSwgTWF0cml4NCwgTWF0cml4MywgQm94MywgQm94MiwgTGluZTMsIEV1bGVyLCBWZWN0b3I0LCBWZWN0b3IzLCBWZWN0b3IyLCBRdWF0ZXJuaW9uLCBDb2xvciwgTW9ycGhCbGVuZE1lc2gsIEltbWVkaWF0ZVJlbmRlck9iamVjdCwgVmVydGV4Tm9ybWFsc0hlbHBlciwgU3BvdExpZ2h0SGVscGVyLCBTa2VsZXRvbkhlbHBlciwgUG9pbnRMaWdodEhlbHBlciwgUmVjdEFyZWFMaWdodEhlbHBlciwgSGVtaXNwaGVyZUxpZ2h0SGVscGVyLCBHcmlkSGVscGVyLCBQb2xhckdyaWRIZWxwZXIsIEZhY2VOb3JtYWxzSGVscGVyLCBEaXJlY3Rpb25hbExpZ2h0SGVscGVyLCBDYW1lcmFIZWxwZXIsIEJveEhlbHBlciwgQXJyb3dIZWxwZXIsIEF4aXNIZWxwZXIsIENhdG11bGxSb21DdXJ2ZTMsIEN1YmljQmV6aWVyQ3VydmUzLCBRdWFkcmF0aWNCZXppZXJDdXJ2ZTMsIExpbmVDdXJ2ZTMsIEFyY0N1cnZlLCBFbGxpcHNlQ3VydmUsIFNwbGluZUN1cnZlLCBDdWJpY0JlemllckN1cnZlLCBRdWFkcmF0aWNCZXppZXJDdXJ2ZSwgTGluZUN1cnZlLCBTaGFwZSwgUGF0aCwgU2hhcGVQYXRoLCBGb250LCBDdXJ2ZVBhdGgsIEN1cnZlLCBTaGFwZVV0aWxzLCBTY2VuZVV0aWxzLCBXaXJlZnJhbWVHZW9tZXRyeSwgUGFyYW1ldHJpY0dlb21ldHJ5LCBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnksIFRldHJhaGVkcm9uR2VvbWV0cnksIFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnksIE9jdGFoZWRyb25HZW9tZXRyeSwgT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5LCBJY29zYWhlZHJvbkdlb21ldHJ5LCBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LCBEb2RlY2FoZWRyb25HZW9tZXRyeSwgRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnksIFBvbHloZWRyb25HZW9tZXRyeSwgUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LCBUdWJlR2VvbWV0cnksIFR1YmVCdWZmZXJHZW9tZXRyeSwgVG9ydXNLbm90R2VvbWV0cnksIFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5LCBUb3J1c0dlb21ldHJ5LCBUb3J1c0J1ZmZlckdlb21ldHJ5LCBUZXh0R2VvbWV0cnksIFRleHRCdWZmZXJHZW9tZXRyeSwgU3BoZXJlR2VvbWV0cnksIFNwaGVyZUJ1ZmZlckdlb21ldHJ5LCBSaW5nR2VvbWV0cnksIFJpbmdCdWZmZXJHZW9tZXRyeSwgUGxhbmVHZW9tZXRyeSwgUGxhbmVCdWZmZXJHZW9tZXRyeSwgTGF0aGVHZW9tZXRyeSwgTGF0aGVCdWZmZXJHZW9tZXRyeSwgU2hhcGVHZW9tZXRyeSwgU2hhcGVCdWZmZXJHZW9tZXRyeSwgRXh0cnVkZUdlb21ldHJ5LCBFeHRydWRlQnVmZmVyR2VvbWV0cnksIEVkZ2VzR2VvbWV0cnksIENvbmVHZW9tZXRyeSwgQ29uZUJ1ZmZlckdlb21ldHJ5LCBDeWxpbmRlckdlb21ldHJ5LCBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5LCBDaXJjbGVHZW9tZXRyeSwgQ2lyY2xlQnVmZmVyR2VvbWV0cnksIEJveEdlb21ldHJ5LCBCb3hCdWZmZXJHZW9tZXRyeSwgU2hhZG93TWF0ZXJpYWwsIFNwcml0ZU1hdGVyaWFsLCBSYXdTaGFkZXJNYXRlcmlhbCwgU2hhZGVyTWF0ZXJpYWwsIFBvaW50c01hdGVyaWFsLCBNZXNoUGh5c2ljYWxNYXRlcmlhbCwgTWVzaFN0YW5kYXJkTWF0ZXJpYWwsIE1lc2hQaG9uZ01hdGVyaWFsLCBNZXNoVG9vbk1hdGVyaWFsLCBNZXNoTm9ybWFsTWF0ZXJpYWwsIE1lc2hMYW1iZXJ0TWF0ZXJpYWwsIE1lc2hEZXB0aE1hdGVyaWFsLCBNZXNoQmFzaWNNYXRlcmlhbCwgTGluZURhc2hlZE1hdGVyaWFsLCBMaW5lQmFzaWNNYXRlcmlhbCwgTWF0ZXJpYWwsIEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUsIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUsIFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSwgSW50MzJCdWZmZXJBdHRyaWJ1dGUsIFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSwgSW50MTZCdWZmZXJBdHRyaWJ1dGUsIFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSwgVWludDhCdWZmZXJBdHRyaWJ1dGUsIEludDhCdWZmZXJBdHRyaWJ1dGUsIEJ1ZmZlckF0dHJpYnV0ZSwgUkVWSVNJT04sIE1PVVNFLCBDdWxsRmFjZU5vbmUsIEN1bGxGYWNlQmFjaywgQ3VsbEZhY2VGcm9udCwgQ3VsbEZhY2VGcm9udEJhY2ssIEZyb250RmFjZURpcmVjdGlvbkNXLCBGcm9udEZhY2VEaXJlY3Rpb25DQ1csIEJhc2ljU2hhZG93TWFwLCBQQ0ZTaGFkb3dNYXAsIFBDRlNvZnRTaGFkb3dNYXAsIEZyb250U2lkZSwgQmFja1NpZGUsIERvdWJsZVNpZGUsIEZsYXRTaGFkaW5nLCBTbW9vdGhTaGFkaW5nLCBOb0NvbG9ycywgRmFjZUNvbG9ycywgVmVydGV4Q29sb3JzLCBOb0JsZW5kaW5nLCBOb3JtYWxCbGVuZGluZywgQWRkaXRpdmVCbGVuZGluZywgU3VidHJhY3RpdmVCbGVuZGluZywgTXVsdGlwbHlCbGVuZGluZywgQ3VzdG9tQmxlbmRpbmcsIEFkZEVxdWF0aW9uLCBTdWJ0cmFjdEVxdWF0aW9uLCBSZXZlcnNlU3VidHJhY3RFcXVhdGlvbiwgTWluRXF1YXRpb24sIE1heEVxdWF0aW9uLCBaZXJvRmFjdG9yLCBPbmVGYWN0b3IsIFNyY0NvbG9yRmFjdG9yLCBPbmVNaW51c1NyY0NvbG9yRmFjdG9yLCBTcmNBbHBoYUZhY3RvciwgT25lTWludXNTcmNBbHBoYUZhY3RvciwgRHN0QWxwaGFGYWN0b3IsIE9uZU1pbnVzRHN0QWxwaGFGYWN0b3IsIERzdENvbG9yRmFjdG9yLCBPbmVNaW51c0RzdENvbG9yRmFjdG9yLCBTcmNBbHBoYVNhdHVyYXRlRmFjdG9yLCBOZXZlckRlcHRoLCBBbHdheXNEZXB0aCwgTGVzc0RlcHRoLCBMZXNzRXF1YWxEZXB0aCwgRXF1YWxEZXB0aCwgR3JlYXRlckVxdWFsRGVwdGgsIEdyZWF0ZXJEZXB0aCwgTm90RXF1YWxEZXB0aCwgTXVsdGlwbHlPcGVyYXRpb24sIE1peE9wZXJhdGlvbiwgQWRkT3BlcmF0aW9uLCBOb1RvbmVNYXBwaW5nLCBMaW5lYXJUb25lTWFwcGluZywgUmVpbmhhcmRUb25lTWFwcGluZywgVW5jaGFydGVkMlRvbmVNYXBwaW5nLCBDaW5lb25Ub25lTWFwcGluZywgVVZNYXBwaW5nLCBDdWJlUmVmbGVjdGlvbk1hcHBpbmcsIEN1YmVSZWZyYWN0aW9uTWFwcGluZywgRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcsIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nLCBTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZywgQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcsIEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nLCBSZXBlYXRXcmFwcGluZywgQ2xhbXBUb0VkZ2VXcmFwcGluZywgTWlycm9yZWRSZXBlYXRXcmFwcGluZywgTmVhcmVzdEZpbHRlciwgTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIsIE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXIsIExpbmVhckZpbHRlciwgTGluZWFyTWlwTWFwTmVhcmVzdEZpbHRlciwgTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyLCBVbnNpZ25lZEJ5dGVUeXBlLCBCeXRlVHlwZSwgU2hvcnRUeXBlLCBVbnNpZ25lZFNob3J0VHlwZSwgSW50VHlwZSwgVW5zaWduZWRJbnRUeXBlLCBGbG9hdFR5cGUsIEhhbGZGbG9hdFR5cGUsIFVuc2lnbmVkU2hvcnQ0NDQ0VHlwZSwgVW5zaWduZWRTaG9ydDU1NTFUeXBlLCBVbnNpZ25lZFNob3J0NTY1VHlwZSwgVW5zaWduZWRJbnQyNDhUeXBlLCBBbHBoYUZvcm1hdCwgUkdCRm9ybWF0LCBSR0JBRm9ybWF0LCBMdW1pbmFuY2VGb3JtYXQsIEx1bWluYW5jZUFscGhhRm9ybWF0LCBSR0JFRm9ybWF0LCBEZXB0aEZvcm1hdCwgRGVwdGhTdGVuY2lsRm9ybWF0LCBSR0JfUzNUQ19EWFQxX0Zvcm1hdCwgUkdCQV9TM1RDX0RYVDFfRm9ybWF0LCBSR0JBX1MzVENfRFhUM19Gb3JtYXQsIFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdCwgUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQsIFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0LCBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQsIFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCwgUkdCX0VUQzFfRm9ybWF0LCBMb29wT25jZSwgTG9vcFJlcGVhdCwgTG9vcFBpbmdQb25nLCBJbnRlcnBvbGF0ZURpc2NyZXRlLCBJbnRlcnBvbGF0ZUxpbmVhciwgSW50ZXJwb2xhdGVTbW9vdGgsIFplcm9DdXJ2YXR1cmVFbmRpbmcsIFplcm9TbG9wZUVuZGluZywgV3JhcEFyb3VuZEVuZGluZywgVHJpYW5nbGVzRHJhd01vZGUsIFRyaWFuZ2xlU3RyaXBEcmF3TW9kZSwgVHJpYW5nbGVGYW5EcmF3TW9kZSwgTGluZWFyRW5jb2RpbmcsIHNSR0JFbmNvZGluZywgR2FtbWFFbmNvZGluZywgUkdCRUVuY29kaW5nLCBMb2dMdXZFbmNvZGluZywgUkdCTTdFbmNvZGluZywgUkdCTTE2RW5jb2RpbmcsIFJHQkRFbmNvZGluZywgQmFzaWNEZXB0aFBhY2tpbmcsIFJHQkFEZXB0aFBhY2tpbmcsIEJveEdlb21ldHJ5IGFzIEN1YmVHZW9tZXRyeSwgRmFjZTQsIExpbmVTdHJpcCwgTGluZVBpZWNlcywgTWVzaEZhY2VNYXRlcmlhbCwgTXVsdGlNYXRlcmlhbCwgUG9pbnRDbG91ZCwgUGFydGljbGUsIFBhcnRpY2xlU3lzdGVtLCBQb2ludENsb3VkTWF0ZXJpYWwsIFBhcnRpY2xlQmFzaWNNYXRlcmlhbCwgUGFydGljbGVTeXN0ZW1NYXRlcmlhbCwgVmVydGV4LCBEeW5hbWljQnVmZmVyQXR0cmlidXRlLCBJbnQ4QXR0cmlidXRlLCBVaW50OEF0dHJpYnV0ZSwgVWludDhDbGFtcGVkQXR0cmlidXRlLCBJbnQxNkF0dHJpYnV0ZSwgVWludDE2QXR0cmlidXRlLCBJbnQzMkF0dHJpYnV0ZSwgVWludDMyQXR0cmlidXRlLCBGbG9hdDMyQXR0cmlidXRlLCBGbG9hdDY0QXR0cmlidXRlLCBDbG9zZWRTcGxpbmVDdXJ2ZTMsIFNwbGluZUN1cnZlMywgU3BsaW5lLCBCb3VuZGluZ0JveEhlbHBlciwgRWRnZXNIZWxwZXIsIFdpcmVmcmFtZUhlbHBlciwgWEhSTG9hZGVyLCBCaW5hcnlUZXh0dXJlTG9hZGVyLCBHZW9tZXRyeVV0aWxzLCBJbWFnZVV0aWxzLCBQcm9qZWN0b3IsIENhbnZhc1JlbmRlcmVyIH07XG4iLCIvKipcbiAqIEBhdXRob3IgZG1hcmNvcyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9kbWFyY29zXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tXG4gKlxuICogV2ViVlIgU3BlYzogaHR0cDovL21venZyLmdpdGh1Yi5pby93ZWJ2ci1zcGVjL3dlYnZyLmh0bWxcbiAqXG4gKiBGaXJlZm94OiBodHRwOi8vbW96dnIuY29tL2Rvd25sb2Fkcy9cbiAqIENocm9taXVtOiBodHRwczovL3dlYnZyLmluZm8vZ2V0LWNocm9tZVxuICpcbiAqL1xuXG5pbXBvcnQge1xuICBWZWN0b3IzLFxuICBQZXJzcGVjdGl2ZUNhbWVyYSxcbiAgTWF0cml4NFxufSBmcm9tICd0aHJlZSc7XG5cbmV4cG9ydCBjb25zdCBWUkVmZmVjdCA9IGZ1bmN0aW9uICggcmVuZGVyZXIsIG9uRXJyb3IgKSB7XG5cblx0dmFyIHZyRGlzcGxheSwgdnJEaXNwbGF5cztcblx0dmFyIGV5ZVRyYW5zbGF0aW9uTCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBleWVUcmFuc2xhdGlvblIgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgcmVuZGVyUmVjdEwsIHJlbmRlclJlY3RSO1xuXG5cdHZhciBmcmFtZURhdGEgPSBudWxsO1xuXG5cdGlmICggJ1ZSRnJhbWVEYXRhJyBpbiB3aW5kb3cgKSB7XG5cblx0XHRmcmFtZURhdGEgPSBuZXcgVlJGcmFtZURhdGEoKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ290VlJEaXNwbGF5cyggZGlzcGxheXMgKSB7XG5cblx0XHR2ckRpc3BsYXlzID0gZGlzcGxheXM7XG5cblx0XHRpZiAoIGRpc3BsYXlzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZyRGlzcGxheSA9IGRpc3BsYXlzWyAwIF07XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRpZiAoIG9uRXJyb3IgKSBvbkVycm9yKCAnSE1EIG5vdCBhdmFpbGFibGUnICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGlmICggbmF2aWdhdG9yLmdldFZSRGlzcGxheXMgKSB7XG5cblx0XHRuYXZpZ2F0b3IuZ2V0VlJEaXNwbGF5cygpLnRoZW4oIGdvdFZSRGlzcGxheXMgKS5jYXRjaCAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVlJFZmZlY3Q6IFVuYWJsZSB0byBnZXQgVlIgRGlzcGxheXMnICk7XG5cblx0XHR9ICk7XG5cblx0fVxuXG5cdC8vXG5cblx0dGhpcy5pc1ByZXNlbnRpbmcgPSBmYWxzZTtcblx0dGhpcy5zY2FsZSA9IDE7XG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHR2YXIgcmVuZGVyZXJTaXplID0gcmVuZGVyZXIuZ2V0U2l6ZSgpO1xuXHR2YXIgcmVuZGVyZXJVcGRhdGVTdHlsZSA9IGZhbHNlO1xuXHR2YXIgcmVuZGVyZXJQaXhlbFJhdGlvID0gcmVuZGVyZXIuZ2V0UGl4ZWxSYXRpbygpO1xuXG5cdHRoaXMuZ2V0VlJEaXNwbGF5ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHZyRGlzcGxheTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0VlJEaXNwbGF5ID0gZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHZyRGlzcGxheSA9IHZhbHVlO1xuXG5cdH07XG5cblx0dGhpcy5nZXRWUkRpc3BsYXlzID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVlJFZmZlY3Q6IGdldFZSRGlzcGxheXMoKSBpcyBiZWluZyBkZXByZWNhdGVkLicgKTtcblx0XHRyZXR1cm4gdnJEaXNwbGF5cztcblxuXHR9O1xuXG5cdHRoaXMuc2V0U2l6ZSA9IGZ1bmN0aW9uICggd2lkdGgsIGhlaWdodCwgdXBkYXRlU3R5bGUgKSB7XG5cblx0XHRyZW5kZXJlclNpemUgPSB7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcblx0XHRyZW5kZXJlclVwZGF0ZVN0eWxlID0gdXBkYXRlU3R5bGU7XG5cblx0XHRpZiAoIHNjb3BlLmlzUHJlc2VudGluZyApIHtcblxuXHRcdFx0dmFyIGV5ZVBhcmFtc0wgPSB2ckRpc3BsYXkuZ2V0RXllUGFyYW1ldGVycyggJ2xlZnQnICk7XG5cdFx0XHRyZW5kZXJlci5zZXRQaXhlbFJhdGlvKCAxICk7XG5cdFx0XHRyZW5kZXJlci5zZXRTaXplKCBleWVQYXJhbXNMLnJlbmRlcldpZHRoICogMiwgZXllUGFyYW1zTC5yZW5kZXJIZWlnaHQsIGZhbHNlICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZW5kZXJlci5zZXRQaXhlbFJhdGlvKCByZW5kZXJlclBpeGVsUmF0aW8gKTtcblx0XHRcdHJlbmRlcmVyLnNldFNpemUoIHdpZHRoLCBoZWlnaHQsIHVwZGF0ZVN0eWxlICk7XG5cblx0XHR9XG5cblx0fTtcblxuXHQvLyBmdWxsc2NyZWVuXG5cblx0dmFyIGNhbnZhcyA9IHJlbmRlcmVyLmRvbUVsZW1lbnQ7XG5cdHZhciByZXF1ZXN0RnVsbHNjcmVlbjtcblx0dmFyIGV4aXRGdWxsc2NyZWVuO1xuXHR2YXIgZnVsbHNjcmVlbkVsZW1lbnQ7XG5cdHZhciBkZWZhdWx0TGVmdEJvdW5kcyA9IFsgMC4wLCAwLjAsIDAuNSwgMS4wIF07XG5cdHZhciBkZWZhdWx0UmlnaHRCb3VuZHMgPSBbIDAuNSwgMC4wLCAwLjUsIDEuMCBdO1xuXG5cdGZ1bmN0aW9uIG9uVlJEaXNwbGF5UHJlc2VudENoYW5nZSgpIHtcblxuXHRcdHZhciB3YXNQcmVzZW50aW5nID0gc2NvcGUuaXNQcmVzZW50aW5nO1xuXHRcdHNjb3BlLmlzUHJlc2VudGluZyA9IHZyRGlzcGxheSAhPT0gdW5kZWZpbmVkICYmIHZyRGlzcGxheS5pc1ByZXNlbnRpbmc7XG5cblx0XHRpZiAoIHNjb3BlLmlzUHJlc2VudGluZyApIHtcblxuXHRcdFx0dmFyIGV5ZVBhcmFtc0wgPSB2ckRpc3BsYXkuZ2V0RXllUGFyYW1ldGVycyggJ2xlZnQnICk7XG5cdFx0XHR2YXIgZXllV2lkdGggPSBleWVQYXJhbXNMLnJlbmRlcldpZHRoO1xuXHRcdFx0dmFyIGV5ZUhlaWdodCA9IGV5ZVBhcmFtc0wucmVuZGVySGVpZ2h0O1xuXG5cdFx0XHRpZiAoICF3YXNQcmVzZW50aW5nICkge1xuXG5cdFx0XHRcdHJlbmRlcmVyUGl4ZWxSYXRpbyA9IHJlbmRlcmVyLmdldFBpeGVsUmF0aW8oKTtcblx0XHRcdFx0cmVuZGVyZXJTaXplID0gcmVuZGVyZXIuZ2V0U2l6ZSgpO1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldFBpeGVsUmF0aW8oIDEgKTtcblx0XHRcdFx0cmVuZGVyZXIuc2V0U2l6ZSggZXllV2lkdGggKiAyLCBleWVIZWlnaHQsIGZhbHNlICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIHdhc1ByZXNlbnRpbmcgKSB7XG5cblx0XHRcdHJlbmRlcmVyLnNldFBpeGVsUmF0aW8oIHJlbmRlcmVyUGl4ZWxSYXRpbyApO1xuXHRcdFx0cmVuZGVyZXIuc2V0U2l6ZSggcmVuZGVyZXJTaXplLndpZHRoLCByZW5kZXJlclNpemUuaGVpZ2h0LCByZW5kZXJlclVwZGF0ZVN0eWxlICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAndnJkaXNwbGF5cHJlc2VudGNoYW5nZScsIG9uVlJEaXNwbGF5UHJlc2VudENoYW5nZSwgZmFsc2UgKTtcblxuXHR0aGlzLnNldEZ1bGxTY3JlZW4gPSBmdW5jdGlvbiAoIGJvb2xlYW4gKSB7XG5cblx0XHRyZXR1cm4gbmV3IFByb21pc2UoIGZ1bmN0aW9uICggcmVzb2x2ZSwgcmVqZWN0ICkge1xuXG5cdFx0XHRpZiAoIHZyRGlzcGxheSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJlamVjdCggbmV3IEVycm9yKCAnTm8gVlIgaGFyZHdhcmUgZm91bmQuJyApICk7XG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNjb3BlLmlzUHJlc2VudGluZyA9PT0gYm9vbGVhbiApIHtcblxuXHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGJvb2xlYW4gKSB7XG5cblx0XHRcdFx0cmVzb2x2ZSggdnJEaXNwbGF5LnJlcXVlc3RQcmVzZW50KCBbIHsgc291cmNlOiBjYW52YXMgfSBdICkgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZXNvbHZlKCB2ckRpc3BsYXkuZXhpdFByZXNlbnQoKSApO1xuXG5cdFx0XHR9XG5cblx0XHR9ICk7XG5cblx0fTtcblxuXHR0aGlzLnJlcXVlc3RQcmVzZW50ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0RnVsbFNjcmVlbiggdHJ1ZSApO1xuXG5cdH07XG5cblx0dGhpcy5leGl0UHJlc2VudCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnNldEZ1bGxTY3JlZW4oIGZhbHNlICk7XG5cblx0fTtcblxuXHR0aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uICggZiApIHtcblxuXHRcdGlmICggdnJEaXNwbGF5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHJldHVybiB2ckRpc3BsYXkucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBmICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXR1cm4gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSggZiApO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0dGhpcy5jYW5jZWxBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uICggaCApIHtcblxuXHRcdGlmICggdnJEaXNwbGF5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZyRGlzcGxheS5jYW5jZWxBbmltYXRpb25GcmFtZSggaCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKCBoICk7XG5cblx0XHR9XG5cblx0fTtcblxuXHR0aGlzLnN1Ym1pdEZyYW1lID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB2ckRpc3BsYXkgIT09IHVuZGVmaW5lZCAmJiBzY29wZS5pc1ByZXNlbnRpbmcgKSB7XG5cblx0XHRcdHZyRGlzcGxheS5zdWJtaXRGcmFtZSgpO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0dGhpcy5hdXRvU3VibWl0RnJhbWUgPSB0cnVlO1xuXG5cdC8vIHJlbmRlclxuXG5cdHZhciBjYW1lcmFMID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XG5cdGNhbWVyYUwubGF5ZXJzLmVuYWJsZSggMSApO1xuXG5cdHZhciBjYW1lcmFSID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XG5cdGNhbWVyYVIubGF5ZXJzLmVuYWJsZSggMiApO1xuXG5cdHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCBzY2VuZSwgY2FtZXJhLCByZW5kZXJUYXJnZXQsIGZvcmNlQ2xlYXIgKSB7XG5cblx0XHRpZiAoIHZyRGlzcGxheSAmJiBzY29wZS5pc1ByZXNlbnRpbmcgKSB7XG5cblx0XHRcdHZhciBhdXRvVXBkYXRlID0gc2NlbmUuYXV0b1VwZGF0ZTtcblxuXHRcdFx0aWYgKCBhdXRvVXBkYXRlICkge1xuXG5cdFx0XHRcdHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cdFx0XHRcdHNjZW5lLmF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZXllUGFyYW1zTCA9IHZyRGlzcGxheS5nZXRFeWVQYXJhbWV0ZXJzKCAnbGVmdCcgKTtcblx0XHRcdHZhciBleWVQYXJhbXNSID0gdnJEaXNwbGF5LmdldEV5ZVBhcmFtZXRlcnMoICdyaWdodCcgKTtcblxuXHRcdFx0ZXllVHJhbnNsYXRpb25MLmZyb21BcnJheSggZXllUGFyYW1zTC5vZmZzZXQgKTtcblx0XHRcdGV5ZVRyYW5zbGF0aW9uUi5mcm9tQXJyYXkoIGV5ZVBhcmFtc1Iub2Zmc2V0ICk7XG5cblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggc2NlbmUgKSApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WUkVmZmVjdC5yZW5kZXIoKSBubyBsb25nZXIgc3VwcG9ydHMgYXJyYXlzLiBVc2Ugb2JqZWN0LmxheWVycyBpbnN0ZWFkLicgKTtcblx0XHRcdFx0c2NlbmUgPSBzY2VuZVsgMCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIFdoZW4gcmVuZGVyaW5nIHdlIGRvbid0IGNhcmUgd2hhdCB0aGUgcmVjb21tZW5kZWQgc2l6ZSBpcywgb25seSB3aGF0IHRoZSBhY3R1YWwgc2l6ZVxuXHRcdFx0Ly8gb2YgdGhlIGJhY2tidWZmZXIgaXMuXG5cdFx0XHR2YXIgc2l6ZSA9IHJlbmRlcmVyLmdldFNpemUoKTtcblx0XHRcdHZhciBsYXllcnMgPSB2ckRpc3BsYXkuZ2V0TGF5ZXJzKCk7XG5cdFx0XHR2YXIgbGVmdEJvdW5kcztcblx0XHRcdHZhciByaWdodEJvdW5kcztcblxuXHRcdFx0aWYgKCBsYXllcnMubGVuZ3RoICkge1xuXG5cdFx0XHRcdHZhciBsYXllciA9IGxheWVyc1sgMCBdO1xuXG5cdFx0XHRcdGxlZnRCb3VuZHMgPSBsYXllci5sZWZ0Qm91bmRzICE9PSBudWxsICYmIGxheWVyLmxlZnRCb3VuZHMubGVuZ3RoID09PSA0ID8gbGF5ZXIubGVmdEJvdW5kcyA6IGRlZmF1bHRMZWZ0Qm91bmRzO1xuXHRcdFx0XHRyaWdodEJvdW5kcyA9IGxheWVyLnJpZ2h0Qm91bmRzICE9PSBudWxsICYmIGxheWVyLnJpZ2h0Qm91bmRzLmxlbmd0aCA9PT0gNCA/IGxheWVyLnJpZ2h0Qm91bmRzIDogZGVmYXVsdFJpZ2h0Qm91bmRzO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGxlZnRCb3VuZHMgPSBkZWZhdWx0TGVmdEJvdW5kcztcblx0XHRcdFx0cmlnaHRCb3VuZHMgPSBkZWZhdWx0UmlnaHRCb3VuZHM7XG5cblx0XHRcdH1cblxuXHRcdFx0cmVuZGVyUmVjdEwgPSB7XG5cdFx0XHRcdHg6IE1hdGgucm91bmQoIHNpemUud2lkdGggKiBsZWZ0Qm91bmRzWyAwIF0gKSxcblx0XHRcdFx0eTogTWF0aC5yb3VuZCggc2l6ZS5oZWlnaHQgKiBsZWZ0Qm91bmRzWyAxIF0gKSxcblx0XHRcdFx0d2lkdGg6IE1hdGgucm91bmQoIHNpemUud2lkdGggKiBsZWZ0Qm91bmRzWyAyIF0gKSxcblx0XHRcdFx0aGVpZ2h0OiBNYXRoLnJvdW5kKHNpemUuaGVpZ2h0ICogbGVmdEJvdW5kc1sgMyBdIClcblx0XHRcdH07XG5cdFx0XHRyZW5kZXJSZWN0UiA9IHtcblx0XHRcdFx0eDogTWF0aC5yb3VuZCggc2l6ZS53aWR0aCAqIHJpZ2h0Qm91bmRzWyAwIF0gKSxcblx0XHRcdFx0eTogTWF0aC5yb3VuZCggc2l6ZS5oZWlnaHQgKiByaWdodEJvdW5kc1sgMSBdICksXG5cdFx0XHRcdHdpZHRoOiBNYXRoLnJvdW5kKCBzaXplLndpZHRoICogcmlnaHRCb3VuZHNbIDIgXSApLFxuXHRcdFx0XHRoZWlnaHQ6IE1hdGgucm91bmQoc2l6ZS5oZWlnaHQgKiByaWdodEJvdW5kc1sgMyBdIClcblx0XHRcdH07XG5cblx0XHRcdGlmICggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cdFx0XHRcdHJlbmRlclRhcmdldC5zY2lzc29yVGVzdCA9IHRydWU7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBudWxsICk7XG5cdFx0XHRcdHJlbmRlcmVyLnNldFNjaXNzb3JUZXN0KCB0cnVlICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCByZW5kZXJlci5hdXRvQ2xlYXIgfHwgZm9yY2VDbGVhciApIHJlbmRlcmVyLmNsZWFyKCk7XG5cblx0XHRcdGlmICggY2FtZXJhLnBhcmVudCA9PT0gbnVsbCApIGNhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0XHRjYW1lcmEubWF0cml4V29ybGQuZGVjb21wb3NlKCBjYW1lcmFMLnBvc2l0aW9uLCBjYW1lcmFMLnF1YXRlcm5pb24sIGNhbWVyYUwuc2NhbGUgKTtcblx0XHRcdGNhbWVyYS5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIGNhbWVyYVIucG9zaXRpb24sIGNhbWVyYVIucXVhdGVybmlvbiwgY2FtZXJhUi5zY2FsZSApO1xuXG5cdFx0XHR2YXIgc2NhbGUgPSB0aGlzLnNjYWxlO1xuXHRcdFx0Y2FtZXJhTC50cmFuc2xhdGVPbkF4aXMoIGV5ZVRyYW5zbGF0aW9uTCwgc2NhbGUgKTtcblx0XHRcdGNhbWVyYVIudHJhbnNsYXRlT25BeGlzKCBleWVUcmFuc2xhdGlvblIsIHNjYWxlICk7XG5cblx0XHRcdGlmICggdnJEaXNwbGF5LmdldEZyYW1lRGF0YSApIHtcblxuXHRcdFx0XHR2ckRpc3BsYXkuZGVwdGhOZWFyID0gY2FtZXJhLm5lYXI7XG5cdFx0XHRcdHZyRGlzcGxheS5kZXB0aEZhciA9IGNhbWVyYS5mYXI7XG5cblx0XHRcdFx0dnJEaXNwbGF5LmdldEZyYW1lRGF0YSggZnJhbWVEYXRhICk7XG5cblx0XHRcdFx0Y2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzID0gZnJhbWVEYXRhLmxlZnRQcm9qZWN0aW9uTWF0cml4O1xuXHRcdFx0XHRjYW1lcmFSLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMgPSBmcmFtZURhdGEucmlnaHRQcm9qZWN0aW9uTWF0cml4O1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGNhbWVyYUwucHJvamVjdGlvbk1hdHJpeCA9IGZvdlRvUHJvamVjdGlvbiggZXllUGFyYW1zTC5maWVsZE9mVmlldywgdHJ1ZSwgY2FtZXJhLm5lYXIsIGNhbWVyYS5mYXIgKTtcblx0XHRcdFx0Y2FtZXJhUi5wcm9qZWN0aW9uTWF0cml4ID0gZm92VG9Qcm9qZWN0aW9uKCBleWVQYXJhbXNSLmZpZWxkT2ZWaWV3LCB0cnVlLCBjYW1lcmEubmVhciwgY2FtZXJhLmZhciApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHJlbmRlciBsZWZ0IGV5ZVxuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRcdFx0cmVuZGVyVGFyZ2V0LnZpZXdwb3J0LnNldCggcmVuZGVyUmVjdEwueCwgcmVuZGVyUmVjdEwueSwgcmVuZGVyUmVjdEwud2lkdGgsIHJlbmRlclJlY3RMLmhlaWdodCApO1xuXHRcdFx0XHRyZW5kZXJUYXJnZXQuc2Npc3Nvci5zZXQoIHJlbmRlclJlY3RMLngsIHJlbmRlclJlY3RMLnksIHJlbmRlclJlY3RMLndpZHRoLCByZW5kZXJSZWN0TC5oZWlnaHQgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZW5kZXJlci5zZXRWaWV3cG9ydCggcmVuZGVyUmVjdEwueCwgcmVuZGVyUmVjdEwueSwgcmVuZGVyUmVjdEwud2lkdGgsIHJlbmRlclJlY3RMLmhlaWdodCApO1xuXHRcdFx0XHRyZW5kZXJlci5zZXRTY2lzc29yKCByZW5kZXJSZWN0TC54LCByZW5kZXJSZWN0TC55LCByZW5kZXJSZWN0TC53aWR0aCwgcmVuZGVyUmVjdEwuaGVpZ2h0ICk7XG5cblx0XHRcdH1cblx0XHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYUwsIHJlbmRlclRhcmdldCwgZm9yY2VDbGVhciApO1xuXG5cdFx0XHQvLyByZW5kZXIgcmlnaHQgZXllXG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0XHRyZW5kZXJUYXJnZXQudmlld3BvcnQuc2V0KCByZW5kZXJSZWN0Ui54LCByZW5kZXJSZWN0Ui55LCByZW5kZXJSZWN0Ui53aWR0aCwgcmVuZGVyUmVjdFIuaGVpZ2h0ICk7XG5cdFx0XHRcdHJlbmRlclRhcmdldC5zY2lzc29yLnNldCggcmVuZGVyUmVjdFIueCwgcmVuZGVyUmVjdFIueSwgcmVuZGVyUmVjdFIud2lkdGgsIHJlbmRlclJlY3RSLmhlaWdodCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldFZpZXdwb3J0KCByZW5kZXJSZWN0Ui54LCByZW5kZXJSZWN0Ui55LCByZW5kZXJSZWN0Ui53aWR0aCwgcmVuZGVyUmVjdFIuaGVpZ2h0ICk7XG5cdFx0XHRcdHJlbmRlcmVyLnNldFNjaXNzb3IoIHJlbmRlclJlY3RSLngsIHJlbmRlclJlY3RSLnksIHJlbmRlclJlY3RSLndpZHRoLCByZW5kZXJSZWN0Ui5oZWlnaHQgKTtcblxuXHRcdFx0fVxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhUiwgcmVuZGVyVGFyZ2V0LCBmb3JjZUNsZWFyICk7XG5cblx0XHRcdGlmICggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHRcdHJlbmRlclRhcmdldC52aWV3cG9ydC5zZXQoIDAsIDAsIHNpemUud2lkdGgsIHNpemUuaGVpZ2h0ICk7XG5cdFx0XHRcdHJlbmRlclRhcmdldC5zY2lzc29yLnNldCggMCwgMCwgc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQgKTtcblx0XHRcdFx0cmVuZGVyVGFyZ2V0LnNjaXNzb3JUZXN0ID0gZmFsc2U7XG5cdFx0XHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggbnVsbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldFZpZXdwb3J0KCAwLCAwLCBzaXplLndpZHRoLCBzaXplLmhlaWdodCApO1xuXHRcdFx0XHRyZW5kZXJlci5zZXRTY2lzc29yVGVzdCggZmFsc2UgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGF1dG9VcGRhdGUgKSB7XG5cblx0XHRcdFx0c2NlbmUuYXV0b1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBzY29wZS5hdXRvU3VibWl0RnJhbWUgKSB7XG5cblx0XHRcdFx0c2NvcGUuc3VibWl0RnJhbWUoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHQvLyBSZWd1bGFyIHJlbmRlciBtb2RlIGlmIG5vdCBITURcblxuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYSwgcmVuZGVyVGFyZ2V0LCBmb3JjZUNsZWFyICk7XG5cblx0fTtcblxuXHR0aGlzLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3ZyZGlzcGxheXByZXNlbnRjaGFuZ2UnLCBvblZSRGlzcGxheVByZXNlbnRDaGFuZ2UsIGZhbHNlICk7XG5cblx0fTtcblxuXHQvL1xuXG5cdGZ1bmN0aW9uIGZvdlRvTkRDU2NhbGVPZmZzZXQoIGZvdiApIHtcblxuXHRcdHZhciBweHNjYWxlID0gMi4wIC8gKCBmb3YubGVmdFRhbiArIGZvdi5yaWdodFRhbiApO1xuXHRcdHZhciBweG9mZnNldCA9ICggZm92LmxlZnRUYW4gLSBmb3YucmlnaHRUYW4gKSAqIHB4c2NhbGUgKiAwLjU7XG5cdFx0dmFyIHB5c2NhbGUgPSAyLjAgLyAoIGZvdi51cFRhbiArIGZvdi5kb3duVGFuICk7XG5cdFx0dmFyIHB5b2Zmc2V0ID0gKCBmb3YudXBUYW4gLSBmb3YuZG93blRhbiApICogcHlzY2FsZSAqIDAuNTtcblx0XHRyZXR1cm4geyBzY2FsZTogWyBweHNjYWxlLCBweXNjYWxlIF0sIG9mZnNldDogWyBweG9mZnNldCwgcHlvZmZzZXQgXSB9O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBmb3ZQb3J0VG9Qcm9qZWN0aW9uKCBmb3YsIHJpZ2h0SGFuZGVkLCB6TmVhciwgekZhciApIHtcblxuXHRcdHJpZ2h0SGFuZGVkID0gcmlnaHRIYW5kZWQgPT09IHVuZGVmaW5lZCA/IHRydWUgOiByaWdodEhhbmRlZDtcblx0XHR6TmVhciA9IHpOZWFyID09PSB1bmRlZmluZWQgPyAwLjAxIDogek5lYXI7XG5cdFx0ekZhciA9IHpGYXIgPT09IHVuZGVmaW5lZCA/IDEwMDAwLjAgOiB6RmFyO1xuXG5cdFx0dmFyIGhhbmRlZG5lc3NTY2FsZSA9IHJpZ2h0SGFuZGVkID8gLSAxLjAgOiAxLjA7XG5cblx0XHQvLyBzdGFydCB3aXRoIGFuIGlkZW50aXR5IG1hdHJpeFxuXHRcdHZhciBtb2JqID0gbmV3IE1hdHJpeDQoKTtcblx0XHR2YXIgbSA9IG1vYmouZWxlbWVudHM7XG5cblx0XHQvLyBhbmQgd2l0aCBzY2FsZS9vZmZzZXQgaW5mbyBmb3Igbm9ybWFsaXplZCBkZXZpY2UgY29vcmRzXG5cdFx0dmFyIHNjYWxlQW5kT2Zmc2V0ID0gZm92VG9ORENTY2FsZU9mZnNldCggZm92ICk7XG5cblx0XHQvLyBYIHJlc3VsdCwgbWFwIGNsaXAgZWRnZXMgdG8gWy13LCt3XVxuXHRcdG1bIDAgKiA0ICsgMCBdID0gc2NhbGVBbmRPZmZzZXQuc2NhbGVbIDAgXTtcblx0XHRtWyAwICogNCArIDEgXSA9IDAuMDtcblx0XHRtWyAwICogNCArIDIgXSA9IHNjYWxlQW5kT2Zmc2V0Lm9mZnNldFsgMCBdICogaGFuZGVkbmVzc1NjYWxlO1xuXHRcdG1bIDAgKiA0ICsgMyBdID0gMC4wO1xuXG5cdFx0Ly8gWSByZXN1bHQsIG1hcCBjbGlwIGVkZ2VzIHRvIFstdywrd11cblx0XHQvLyBZIG9mZnNldCBpcyBuZWdhdGVkIGJlY2F1c2UgdGhpcyBwcm9qIG1hdHJpeCB0cmFuc2Zvcm1zIGZyb20gd29ybGQgY29vcmRzIHdpdGggWT11cCxcblx0XHQvLyBidXQgdGhlIE5EQyBzY2FsaW5nIGhhcyBZPWRvd24gKHRoYW5rcyBEM0Q/KVxuXHRcdG1bIDEgKiA0ICsgMCBdID0gMC4wO1xuXHRcdG1bIDEgKiA0ICsgMSBdID0gc2NhbGVBbmRPZmZzZXQuc2NhbGVbIDEgXTtcblx0XHRtWyAxICogNCArIDIgXSA9IC0gc2NhbGVBbmRPZmZzZXQub2Zmc2V0WyAxIF0gKiBoYW5kZWRuZXNzU2NhbGU7XG5cdFx0bVsgMSAqIDQgKyAzIF0gPSAwLjA7XG5cblx0XHQvLyBaIHJlc3VsdCAodXAgdG8gdGhlIGFwcClcblx0XHRtWyAyICogNCArIDAgXSA9IDAuMDtcblx0XHRtWyAyICogNCArIDEgXSA9IDAuMDtcblx0XHRtWyAyICogNCArIDIgXSA9IHpGYXIgLyAoIHpOZWFyIC0gekZhciApICogLSBoYW5kZWRuZXNzU2NhbGU7XG5cdFx0bVsgMiAqIDQgKyAzIF0gPSAoIHpGYXIgKiB6TmVhciApIC8gKCB6TmVhciAtIHpGYXIgKTtcblxuXHRcdC8vIFcgcmVzdWx0ICg9IFogaW4pXG5cdFx0bVsgMyAqIDQgKyAwIF0gPSAwLjA7XG5cdFx0bVsgMyAqIDQgKyAxIF0gPSAwLjA7XG5cdFx0bVsgMyAqIDQgKyAyIF0gPSBoYW5kZWRuZXNzU2NhbGU7XG5cdFx0bVsgMyAqIDQgKyAzIF0gPSAwLjA7XG5cblx0XHRtb2JqLnRyYW5zcG9zZSgpO1xuXG5cdFx0cmV0dXJuIG1vYmo7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGZvdlRvUHJvamVjdGlvbiggZm92LCByaWdodEhhbmRlZCwgek5lYXIsIHpGYXIgKSB7XG5cblx0XHR2YXIgREVHMlJBRCA9IE1hdGguUEkgLyAxODAuMDtcblxuXHRcdHZhciBmb3ZQb3J0ID0ge1xuXHRcdFx0dXBUYW46IE1hdGgudGFuKCBmb3YudXBEZWdyZWVzICogREVHMlJBRCApLFxuXHRcdFx0ZG93blRhbjogTWF0aC50YW4oIGZvdi5kb3duRGVncmVlcyAqIERFRzJSQUQgKSxcblx0XHRcdGxlZnRUYW46IE1hdGgudGFuKCBmb3YubGVmdERlZ3JlZXMgKiBERUcyUkFEICksXG5cdFx0XHRyaWdodFRhbjogTWF0aC50YW4oIGZvdi5yaWdodERlZ3JlZXMgKiBERUcyUkFEIClcblx0XHR9O1xuXG5cdFx0cmV0dXJuIGZvdlBvcnRUb1Byb2plY3Rpb24oIGZvdlBvcnQsIHJpZ2h0SGFuZGVkLCB6TmVhciwgekZhciApO1xuXG5cdH1cblxufTtcbiIsImltcG9ydCB7TWF0cml4NH0gZnJvbSAndGhyZWUnO1xuXG4gICAgLyoqXG4gKiBAYXV0aG9yIGRtYXJjb3MgLyBodHRwczovL2dpdGh1Yi5jb20vZG1hcmNvc1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbVxuICogQGF1dGhvciBoYWx2dmVzIC8gaHR0cHM6Ly9naXRodWIuY29tL2hhbHZ2ZXMgKGkgb25seSBlczYgbW9kdWxlZCBpdClcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWUkNvbnRyb2xzIHtcbiAgY29uc3RydWN0b3IoY2FtZXJhLCBvbkVycm9yKSB7XG4gICAgdGhpcy5jYW1lcmEgPSBjYW1lcmE7XG4gICAgdGhpcy52ckRpc3BsYXk7XG4gICAgdGhpcy52ckRpc3BsYXlzO1xuICAgIHRoaXMuc3RhbmRpbmdNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuICAgIHRoaXMuZnJhbWVEYXRhID0gbnVsbDtcblxuICAgIGlmICgnVlJGcmFtZURhdGEnIGluIHdpbmRvdykge1xuICAgICAgdGhpcy5mcmFtZURhdGEgPSBuZXcgVlJGcmFtZURhdGEoKTtcbiAgICB9XG5cbiAgICBpZiAobmF2aWdhdG9yLmdldFZSRGlzcGxheXMpIHtcbiAgICAgIG5hdmlnYXRvclxuICAgICAgICAuZ2V0VlJEaXNwbGF5cygpXG4gICAgICAgIC50aGVuKChkaXNwbGF5cykgPT4ge1xuICAgICAgICAgIHRoaXMudnJEaXNwbGF5cyA9IGRpc3BsYXlzO1xuICAgICAgICAgIGlmIChkaXNwbGF5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnZyRGlzcGxheSA9IGRpc3BsYXlzWzBdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcignVlIgaW5wdXQgbm90IGF2YWlsYWJsZS4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdWUkNvbnRyb2xzOiBVbmFibGUgdG8gZ2V0IFZSIERpc3BsYXlzJyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHRoZSBSaWZ0IFNESyByZXR1cm5zIHRoZSBwb3NpdGlvbiBpbiBtZXRlcnNcbiAgICAvLyB0aGlzIHNjYWxlIGZhY3RvciBhbGxvd3MgdGhlIHVzZXIgdG8gZGVmaW5lIGhvdyBtZXRlcnNcbiAgICAvLyBhcmUgY29udmVydGVkIHRvIHNjZW5lIHVuaXRzLlxuICAgIHRoaXMuc2NhbGUgPSAxO1xuXG4gICAgLy8gSWYgdHJ1ZSB3aWxsIHVzZSBcInN0YW5kaW5nIHNwYWNlXCIgY29vcmRpbmF0ZSBzeXN0ZW0gd2hlcmUgeT0wIGlzIHRoZVxuICAgIC8vIGZsb29yIGFuZCB4PTAsIHo9MCBpcyB0aGUgY2VudGVyIG9mIHRoZSByb29tLlxuICAgIHRoaXMuc3RhbmRpbmcgPSBmYWxzZTtcblxuICAgIC8vIERpc3RhbmNlIGZyb20gdGhlIHVzZXJzIGV5ZXMgdG8gdGhlIGZsb29yIGluIG1ldGVycy4gVXNlZCB3aGVuXG4gICAgLy8gc3RhbmRpbmc9dHJ1ZSBidXQgdGhlIFZSRGlzcGxheSBkb2Vzbid0IHByb3ZpZGUgc3RhZ2VQYXJhbWV0ZXJzLlxuICAgIHRoaXMudXNlckhlaWdodCA9IDEuNjtcbiAgfVxuXG4gIGdldFZSRGlzcGxheSgpIHtcbiAgICByZXR1cm4gdGhpcy52ckRpc3BsYXk7XG4gIH07XG5cbiAgc2V0VlJEaXNwbGF5KHZhbHVlKSB7XG4gICAgdGhpcy52ckRpc3BsYXkgPSB2YWx1ZTtcbiAgfTtcblxuICBnZXRWUkRpc3BsYXlzKCkge1xuICAgIGNvbnNvbGUud2FybignVlJDb250cm9sczogZ2V0VlJEaXNwbGF5cygpIGlzIGJlaW5nIGRlcHJlY2F0ZWQuJyk7XG4gICAgcmV0dXJuIHRoaXMudnJEaXNwbGF5cztcbiAgfTtcblxuICBnZXRTdGFuZGluZ01hdHJpeCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGFuZGluZ01hdHJpeDtcbiAgfTtcblxuICB1cGRhdGUoKSB7XG4gICAgY29uc3QgY2FtZXJhID0gdGhpcy5jYW1lcmE7XG5cbiAgICBpZiAodGhpcy52ckRpc3BsYXkpIHtcbiAgICAgIGxldCBwb3NlO1xuICAgICAgaWYgKHRoaXMudnJEaXNwbGF5LmdldEZyYW1lRGF0YSkge1xuICAgICAgICB0aGlzLnZyRGlzcGxheS5nZXRGcmFtZURhdGEodGhpcy5mcmFtZURhdGEpO1xuICAgICAgICBwb3NlID0gdGhpcy5mcmFtZURhdGEucG9zZTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy52ckRpc3BsYXkuZ2V0UG9zZSkge1xuICAgICAgICBwb3NlID0gdGhpcy52ckRpc3BsYXkuZ2V0UG9zZSgpO1xuICAgICAgfVxuICAgICAgaWYgKHBvc2Uub3JpZW50YXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgY2FtZXJhLnF1YXRlcm5pb24uZnJvbUFycmF5KHBvc2Uub3JpZW50YXRpb24pO1xuICAgICAgfVxuICAgICAgaWYgKHBvc2UucG9zaXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgY2FtZXJhLnBvc2l0aW9uLmZyb21BcnJheShwb3NlLnBvc2l0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbWVyYS5wb3NpdGlvbi5zZXQoMCwgMCwgMCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zdGFuZGluZykge1xuICAgICAgICBpZiAodGhpcy52ckRpc3BsYXkuc3RhZ2VQYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgY2FtZXJhLnVwZGF0ZU1hdHJpeCgpO1xuICAgICAgICAgIHRoaXMuc3RhbmRpbmdNYXRyaXguZnJvbUFycmF5KHRoaXMudnJEaXNwbGF5LnN0YWdlUGFyYW1ldGVycy5zaXR0aW5nVG9TdGFuZGluZ1RyYW5zZm9ybSk7XG4gICAgICAgICAgY2FtZXJhLmFwcGx5TWF0cml4KHRoaXMuc3RhbmRpbmdNYXRyaXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbWVyYS5wb3NpdGlvbi5zZXRZKGNhbWVyYS5wb3NpdGlvbi55ICsgdGhpcy51c2VySGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FtZXJhLnBvc2l0aW9uLm11bHRpcGx5U2NhbGFyKHRoaXMuc2NhbGUpO1xuICAgIH1cbiAgfTtcblxuICBkaXNwb3NlKCkge1xuICAgIHRoaXMudnJEaXNwbGF5ID0gbnVsbDtcbiAgfTtcbn07XG4iLCIvKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb21cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKlxuICogQmFzZWQgb24gQHRvamlybydzIHZyLXNhbXBsZXMtdXRpbHMuanNcbiAqL1xuXG5leHBvcnQgY29uc3QgV0VCVlIgPSB7XG5cblx0aXNBdmFpbGFibGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1dFQlZSOiBpc0F2YWlsYWJsZSgpIGlzIGJlaW5nIGRlcHJlY2F0ZWQuIFVzZSAuY2hlY2tBdmFpbGFiaWxpdHkoKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gbmF2aWdhdG9yLmdldFZSRGlzcGxheXMgIT09IHVuZGVmaW5lZDtcblxuXHR9LFxuXG5cdGNoZWNrQXZhaWxhYmlsaXR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IFByb21pc2UoIGZ1bmN0aW9uKCByZXNvbHZlLCByZWplY3QgKSB7XG5cblx0XHRcdGlmICggbmF2aWdhdG9yLmdldFZSRGlzcGxheXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRuYXZpZ2F0b3IuZ2V0VlJEaXNwbGF5cygpLnRoZW4oIGZ1bmN0aW9uICggZGlzcGxheXMgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGRpc3BsYXlzLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0XHRcdFx0cmVqZWN0KCAnV2ViVlIgc3VwcG9ydGVkLCBidXQgbm8gVlJEaXNwbGF5cyBmb3VuZC4nICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJlamVjdCggJ1lvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFdlYlZSLiBTZWUgPGEgaHJlZj1cImh0dHBzOi8vd2VidnIuaW5mb1wiPndlYnZyLmluZm88L2E+IGZvciBhc3Npc3RhbmNlLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSApO1xuXG5cdH0sXG5cblx0Z2V0VlJEaXNwbGF5OiBmdW5jdGlvbiAoIG9uRGlzcGxheSApIHtcblxuXHRcdGlmICggJ2dldFZSRGlzcGxheXMnIGluIG5hdmlnYXRvciApIHtcblxuXHRcdFx0bmF2aWdhdG9yLmdldFZSRGlzcGxheXMoKVxuXHRcdFx0XHQudGhlbiggZnVuY3Rpb24gKCBkaXNwbGF5cyApIHtcblx0XHRcdFx0XHRvbkRpc3BsYXkoIGRpc3BsYXlzWyAwIF0gKTtcblx0XHRcdFx0fSApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Z2V0TWVzc2FnZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnV0VCVlI6IGdldE1lc3NhZ2UoKSBpcyBiZWluZyBkZXByZWNhdGVkLiBVc2UgLmdldE1lc3NhZ2VDb250YWluZXIoIG1lc3NhZ2UgKSBpbnN0ZWFkLicgKTtcblxuXHRcdHZhciBtZXNzYWdlO1xuXG5cdFx0aWYgKCBuYXZpZ2F0b3IuZ2V0VlJEaXNwbGF5cyApIHtcblxuXHRcdFx0bmF2aWdhdG9yLmdldFZSRGlzcGxheXMoKS50aGVuKCBmdW5jdGlvbiAoIGRpc3BsYXlzICkge1xuXG5cdFx0XHRcdGlmICggZGlzcGxheXMubGVuZ3RoID09PSAwICkgbWVzc2FnZSA9ICdXZWJWUiBzdXBwb3J0ZWQsIGJ1dCBubyBWUkRpc3BsYXlzIGZvdW5kLic7XG5cblx0XHRcdH0gKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdG1lc3NhZ2UgPSAnWW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgV2ViVlIuIFNlZSA8YSBocmVmPVwiaHR0cDovL3dlYnZyLmluZm9cIj53ZWJ2ci5pbmZvPC9hPiBmb3IgYXNzaXN0YW5jZS4nO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtZXNzYWdlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnZGl2JyApO1xuXHRcdFx0Y29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcblx0XHRcdGNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gJzAnO1xuXHRcdFx0Y29udGFpbmVyLnN0eWxlLnRvcCA9ICcwJztcblx0XHRcdGNvbnRhaW5lci5zdHlsZS5yaWdodCA9ICcwJztcblx0XHRcdGNvbnRhaW5lci5zdHlsZS56SW5kZXggPSAnOTk5Jztcblx0XHRcdGNvbnRhaW5lci5hbGlnbiA9ICdjZW50ZXInO1xuXG5cdFx0XHR2YXIgZXJyb3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnZGl2JyApO1xuXHRcdFx0ZXJyb3Iuc3R5bGUuZm9udEZhbWlseSA9ICdzYW5zLXNlcmlmJztcblx0XHRcdGVycm9yLnN0eWxlLmZvbnRTaXplID0gJzE2cHgnO1xuXHRcdFx0ZXJyb3Iuc3R5bGUuZm9udFN0eWxlID0gJ25vcm1hbCc7XG5cdFx0XHRlcnJvci5zdHlsZS5saW5lSGVpZ2h0ID0gJzI2cHgnO1xuXHRcdFx0ZXJyb3Iuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyNmZmYnO1xuXHRcdFx0ZXJyb3Iuc3R5bGUuY29sb3IgPSAnIzAwMCc7XG5cdFx0XHRlcnJvci5zdHlsZS5wYWRkaW5nID0gJzEwcHggMjBweCc7XG5cdFx0XHRlcnJvci5zdHlsZS5tYXJnaW4gPSAnNTBweCc7XG5cdFx0XHRlcnJvci5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7XG5cdFx0XHRlcnJvci5pbm5lckhUTUwgPSBtZXNzYWdlO1xuXHRcdFx0Y29udGFpbmVyLmFwcGVuZENoaWxkKCBlcnJvciApO1xuXG5cdFx0XHRyZXR1cm4gY29udGFpbmVyO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Z2V0TWVzc2FnZUNvbnRhaW5lcjogZnVuY3Rpb24gKCBtZXNzYWdlICkge1xuXG5cdFx0dmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdkaXYnICk7XG5cdFx0Y29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcblx0XHRjb250YWluZXIuc3R5bGUubGVmdCA9ICcwJztcblx0XHRjb250YWluZXIuc3R5bGUudG9wID0gJzAnO1xuXHRcdGNvbnRhaW5lci5zdHlsZS5yaWdodCA9ICcwJztcblx0XHRjb250YWluZXIuc3R5bGUuekluZGV4ID0gJzk5OSc7XG5cdFx0Y29udGFpbmVyLmFsaWduID0gJ2NlbnRlcic7XG5cblx0XHR2YXIgZXJyb3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnZGl2JyApO1xuXHRcdGVycm9yLnN0eWxlLmZvbnRGYW1pbHkgPSAnc2Fucy1zZXJpZic7XG5cdFx0ZXJyb3Iuc3R5bGUuZm9udFNpemUgPSAnMTZweCc7XG5cdFx0ZXJyb3Iuc3R5bGUuZm9udFN0eWxlID0gJ25vcm1hbCc7XG5cdFx0ZXJyb3Iuc3R5bGUubGluZUhlaWdodCA9ICcyNnB4Jztcblx0XHRlcnJvci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmZic7XG5cdFx0ZXJyb3Iuc3R5bGUuY29sb3IgPSAnIzAwMCc7XG5cdFx0ZXJyb3Iuc3R5bGUucGFkZGluZyA9ICcxMHB4IDIwcHgnO1xuXHRcdGVycm9yLnN0eWxlLm1hcmdpbiA9ICc1MHB4Jztcblx0XHRlcnJvci5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7XG5cdFx0ZXJyb3IuaW5uZXJIVE1MID0gbWVzc2FnZTtcblx0XHRjb250YWluZXIuYXBwZW5kQ2hpbGQoIGVycm9yICk7XG5cblx0XHRyZXR1cm4gY29udGFpbmVyO1xuXG5cdH0sXG5cblx0Z2V0QnV0dG9uOiBmdW5jdGlvbiAoIGRpc3BsYXksIGNhbnZhcyApIHtcblxuXHRcdGlmICggJ1ZSRWZmZWN0JyBpbiBUSFJFRSAmJiBkaXNwbGF5IGluc3RhbmNlb2YgVEhSRUUuVlJFZmZlY3QgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdXZWJWUi5nZXRCdXR0b24oKSBub3cgZXhwZWN0cyBhIFZSRGlzcGxheS4nICk7XG5cdFx0XHRyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2J1dHRvbicgKTtcblxuXHRcdH1cblxuXHRcdHZhciBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnYnV0dG9uJyApO1xuXHRcdGJ1dHRvbi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG5cdFx0YnV0dG9uLnN0eWxlLmxlZnQgPSAnY2FsYyg1MCUgLSA1MHB4KSc7XG5cdFx0YnV0dG9uLnN0eWxlLmJvdHRvbSA9ICcyMHB4Jztcblx0XHRidXR0b24uc3R5bGUud2lkdGggPSAnMTAwcHgnO1xuXHRcdGJ1dHRvbi5zdHlsZS5ib3JkZXIgPSAnMCc7XG5cdFx0YnV0dG9uLnN0eWxlLnBhZGRpbmcgPSAnOHB4Jztcblx0XHRidXR0b24uc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xuXHRcdGJ1dHRvbi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnIzAwMCc7XG5cdFx0YnV0dG9uLnN0eWxlLmNvbG9yID0gJyNmZmYnO1xuXHRcdGJ1dHRvbi5zdHlsZS5mb250RmFtaWx5ID0gJ3NhbnMtc2VyaWYnO1xuXHRcdGJ1dHRvbi5zdHlsZS5mb250U2l6ZSA9ICcxM3B4Jztcblx0XHRidXR0b24uc3R5bGUuZm9udFN0eWxlID0gJ25vcm1hbCc7XG5cdFx0YnV0dG9uLnN0eWxlLnRleHRBbGlnbiA9ICdjZW50ZXInO1xuXHRcdGJ1dHRvbi5zdHlsZS56SW5kZXggPSAnOTk5JztcblxuXHRcdGlmICggZGlzcGxheSApIHtcblxuXHRcdFx0YnV0dG9uLnRleHRDb250ZW50ID0gJ0VOVEVSIFZSJztcblx0XHRcdGJ1dHRvbi5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdGRpc3BsYXkuaXNQcmVzZW50aW5nID8gZGlzcGxheS5leGl0UHJlc2VudCgpIDogZGlzcGxheS5yZXF1ZXN0UHJlc2VudCggWyB7IHNvdXJjZTogY2FudmFzIH0gXSApO1xuXG5cdFx0XHR9O1xuXG5cdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ3ZyZGlzcGxheXByZXNlbnRjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0YnV0dG9uLnRleHRDb250ZW50ID0gZGlzcGxheS5pc1ByZXNlbnRpbmcgPyAnRVhJVCBWUicgOiAnRU5URVIgVlInO1xuXG5cdFx0XHR9LCBmYWxzZSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0YnV0dG9uLnRleHRDb250ZW50ID0gJ05PIFZSIERJU1BMQVknO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGJ1dHRvbjtcblxuXHR9XG5cbn07XG4iLCJpbXBvcnQge0xvb3AsIENvbnRyb2xzTW9kdWxlLCBDYW1lcmFDb21wb25lbnR9IGZyb20gJ3docyc7XG5pbXBvcnQge1JFVklTSU9OfSBmcm9tICd0aHJlZSc7XG5cbmltcG9ydCB7VlJFZmZlY3R9IGZyb20gJy4vdnIvVlJFZmZlY3QnO1xuaW1wb3J0IFZSQ29udHJvbHNOYXRpdmUgZnJvbSAndGhyZWUtdnJjb250cm9scy1tb2R1bGUnO1xuaW1wb3J0IHtXRUJWUn0gZnJvbSAnLi92ci9XZWJWUic7XG5cbmV4cG9ydCB7XG4gIFdFQlZSXG59O1xuXG5leHBvcnQgY2xhc3MgVlJNb2R1bGUge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHRoaXMucGFyYW1zID0gT2JqZWN0LmFzc2lnbihwYXJhbXMsIHtcbiAgICAgIG1lc3NhZ2U6IHRydWUsXG4gICAgICBidXR0b246IHRydWVcbiAgICB9KTtcblxuICAgIHRoaXMuc2NlbmUgPSBudWxsO1xuICAgIHRoaXMuY2FtZXJhID0gbnVsbDtcbiAgICB0aGlzLmVmZmVjdCA9IG51bGw7XG4gIH1cblxuICBtYW5hZ2VyKG1hbmFnZXIpIHtcbiAgICBtYW5hZ2VyLmRlZmluZSgndnInKTtcblxuICAgIGlmIChSRVZJU0lPTiA+IDg2KSBjb25zb2xlLndhcm4oJ1BsZWFzZSB1c2UgVlJNb2R1bGUyIGZvciBUaHJlZS5qcyBeMC44Ny4wIChyODcpJyk7XG5cbiAgICBjb25zdCByZW5kZXJpbmcgPSBtYW5hZ2VyLnVzZSgncmVuZGVyaW5nJyk7XG4gICAgY29uc3QgcmVuZGVyZXIgPSBtYW5hZ2VyLmdldCgncmVuZGVyZXInKTtcblxuICAgIGNvbnN0IHJlc2l6ZSA9IG1hbmFnZXIudXNlKCdyZXNpemUnKTtcblxuICAgIHRoaXMuZWZmZWN0ID0gbmV3IFZSRWZmZWN0KHJlbmRlcmVyKTtcblxuICAgIHRoaXMuc2NlbmUgPSBtYW5hZ2VyLmdldCgnc2NlbmUnKTtcbiAgICB0aGlzLmNhbWVyYSA9IG1hbmFnZXIuZ2V0KCdjYW1lcmEnKTtcblxuICAgIHJlbmRlcmluZy5lZmZlY3QodGhpcy5lZmZlY3QpO1xuXG4gICAgLy8gVE9ETzogRml4IHJlc2l6ZS5cblxuICAgIHJlc2l6ZS5hZGRDYWxsYmFjaygod2lkdGgsIGhlaWdodCkgPT4ge1xuICAgICAgdGhpcy5lZmZlY3Quc2V0U2l6ZSgrd2lkdGgsICtoZWlnaHQpO1xuICAgIH0pO1xuXG4gICAgLy8gV0VCVlJcbiAgICBjb25zdCB7bWVzc2FnZSwgYnV0dG9ufSA9IHRoaXMucGFyYW1zO1xuXG4gICAgaWYgKG1lc3NhZ2UpIFdFQlZSLmNoZWNrQXZhaWxhYmlsaXR5KCkuY2F0Y2gobWVzc2FnZSA9PiB7XG5cdFx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKFdFQlZSLmdldE1lc3NhZ2VDb250YWluZXIobWVzc2FnZSkpO1xuXHRcdH0pO1xuXG4gICAgaWYgKGJ1dHRvbikgV0VCVlIuZ2V0VlJEaXNwbGF5KGRpc3BsYXkgPT4ge1xuICAgICAgY29uc3QgdnJidG4gPSBXRUJWUi5nZXRCdXR0b24oZGlzcGxheSwgcmVuZGVyZXIuZG9tRWxlbWVudCk7XG4gICAgICB2cmJ0bi5jbGFzc05hbWUgPSAndnItYnRuJztcblxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh2cmJ0bik7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFZSMk1vZHVsZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuZGlzcGxheSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gV0VCVlIuZ2V0VlJEaXNwbGF5KGRpc3BsYXkgPT4gcmVzb2x2ZShkaXNwbGF5KSkpO1xuICB9XG5cbiAgbWFuYWdlcihtYW5hZ2VyKSB7XG4gICAgbWFuYWdlci5kZWZpbmUoJ3ZyJyk7XG5cbiAgICBjb25zdCByZW5kZXJlciA9IG1hbmFnZXIuZ2V0KCdyZW5kZXJlcicpO1xuICAgIHJlbmRlcmVyLnZyLmVuYWJsZWQgPSB0cnVlO1xuICAgIGNvbnNvbGUubG9nKFJFVklTSU9OKTtcbiAgICBjb25zb2xlLmxvZygxKTtcblxuICAgIHRoaXMuZGlzcGxheS50aGVuKGRpc3BsYXkgPT4ge1xuICAgICAgcmVuZGVyZXIudnIuc2V0RGV2aWNlKGRpc3BsYXkpO1xuXG4gICAgICBjb25zdCB2cmJ0biA9IFdFQlZSLmdldEJ1dHRvbihkaXNwbGF5LCByZW5kZXJlci5kb21FbGVtZW50KTtcbiAgICAgIHZyYnRuLmNsYXNzTmFtZSA9ICd2ci1idG4nO1xuXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHZyYnRuKTtcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVlJDb250cm9scyBleHRlbmRzIENvbnRyb2xzTW9kdWxlIHtcbiAgY29uc3RydWN0b3Ioe29iamVjdCwgb25FcnJvciwgaW50ZW5zaXR5fSkge1xuICAgIGNvbnN0IGNvbnRyb2xzID0gbmV3IFZSQ29udHJvbHNOYXRpdmUob2JqZWN0Lm5hdGl2ZSwgb25FcnJvcik7XG5cbiAgICBjb250cm9scy5zdGFuZGluZyA9IHRydWU7XG4gICAgY29udHJvbHMuc2NhbGUgPSBpbnRlbnNpdHk7XG5cbiAgICBzdXBlcih7Y29udHJvbHN9KTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbImZuIiwibW9kdWxlIiwiZXhwb3J0cyIsImNyZWF0ZUNvbW1vbmpzTW9kdWxlIiwiZ2xvYmFsIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiT3AiLCJoYXNPd25Qcm9wZXJ0eSIsIlN5bWJvbCIsIiRTeW1ib2wiLCJpdGVyYXRvciIsImFzeW5jSXRlcmF0b3IiLCJ0b1N0cmluZ1RhZyIsInJlZ2VuZXJhdG9yUnVudGltZSIsInJ1bnRpbWUiLCJpbk1vZHVsZSIsImlubmVyRm4iLCJvdXRlckZuIiwic2VsZiIsInRyeUxvY3NMaXN0IiwiR2VuZXJhdG9yIiwiY3JlYXRlIiwicHJvdG9HZW5lcmF0b3IiLCJnZW5lcmF0b3IiLCJfaW52b2tlIiwibWFrZUludm9rZU1ldGhvZCIsImNvbnRleHQiLCJ3cmFwIiwib2JqIiwiYXJnIiwidHlwZSIsImNhbGwiLCJlcnIiLCJJdGVyYXRvclByb3RvdHlwZSIsIml0ZXJhdG9yU3ltYm9sIiwiZ2V0UHJvdG90eXBlT2YiLCJnZXRQcm90byIsInZhbHVlcyIsIk5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlIiwiaGFzT3duIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdwIiwiY29uc3RydWN0b3IiLCJ0b1N0cmluZ1RhZ1N5bWJvbCIsImRpc3BsYXlOYW1lIiwiZm9yRWFjaCIsIm1ldGhvZCIsImlzR2VuZXJhdG9yRnVuY3Rpb24iLCJnZW5GdW4iLCJjdG9yIiwibmFtZSIsIm1hcmsiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImF3cmFwIiwiX19hd2FpdCIsInJlc29sdmUiLCJyZWplY3QiLCJ0cnlDYXRjaCIsInJlY29yZCIsInJlc3VsdCIsInZhbHVlIiwidGhlbiIsImludm9rZSIsInVud3JhcHBlZCIsInByZXZpb3VzUHJvbWlzZSIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwiZW5xdWV1ZSIsImRlZmluZUl0ZXJhdG9yTWV0aG9kcyIsIkFzeW5jSXRlcmF0b3IiLCJhc3luY0l0ZXJhdG9yU3ltYm9sIiwiYXN5bmMiLCJpdGVyIiwibmV4dCIsImRvbmUiLCJHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0Iiwic3RhdGUiLCJHZW5TdGF0ZUV4ZWN1dGluZyIsIkdlblN0YXRlQ29tcGxldGVkIiwiZGVsZWdhdGUiLCJtYXliZUludm9rZURlbGVnYXRlIiwiZGVsZWdhdGVSZXN1bHQiLCJDb250aW51ZVNlbnRpbmVsIiwic2VudCIsIl9zZW50IiwiZGlzcGF0Y2hFeGNlcHRpb24iLCJhYnJ1cHQiLCJHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkIiwidW5kZWZpbmVkIiwicmV0dXJuIiwiaW5mbyIsInJlc3VsdE5hbWUiLCJuZXh0TG9jIiwidG9TdHJpbmciLCJsb2NzIiwidHJ5TG9jIiwiZW50cnkiLCJjYXRjaExvYyIsImZpbmFsbHlMb2MiLCJhZnRlckxvYyIsInRyeUVudHJpZXMiLCJwdXNoIiwiY29tcGxldGlvbiIsInB1c2hUcnlFbnRyeSIsInJlc2V0Iiwia2V5cyIsIm9iamVjdCIsImtleSIsInJldmVyc2UiLCJsZW5ndGgiLCJwb3AiLCJpdGVyYWJsZSIsIml0ZXJhdG9yTWV0aG9kIiwiaXNOYU4iLCJpIiwiZG9uZVJlc3VsdCIsIkNvbnRleHQiLCJza2lwVGVtcFJlc2V0IiwicHJldiIsInJlc2V0VHJ5RW50cnkiLCJjaGFyQXQiLCJzbGljZSIsInN0b3AiLCJyb290RW50cnkiLCJyb290UmVjb3JkIiwicnZhbCIsImV4Y2VwdGlvbiIsImxvYyIsImNhdWdodCIsImhhc0NhdGNoIiwiaGFzRmluYWxseSIsImZpbmFsbHlFbnRyeSIsImNvbXBsZXRlIiwiZmluaXNoIiwiZGVsZWdhdGVZaWVsZCIsIkZ1bmN0aW9uIiwiZyIsImdldE93blByb3BlcnR5TmFtZXMiLCJpbmRleE9mIiwiaGFkUnVudGltZSIsIm9sZFJ1bnRpbWUiLCJlIiwicnVudGltZU1vZHVsZSIsIk1hdGgiLCJjZWlsIiwiZmxvb3IiLCJpdCIsIlRPX1NUUklORyIsInRoYXQiLCJwb3MiLCJTdHJpbmciLCJfZGVmaW5lZCIsIl90b0ludGVnZXIiLCJzIiwiYiIsImwiLCJhIiwiY2hhckNvZGVBdCIsIndpbmRvdyIsIl9fZyIsInZlcnNpb24iLCJfX2UiLCJjb3JlIiwiX2NvcmUiLCJfYUZ1bmN0aW9uIiwiYyIsImFwcGx5IiwiYXJndW1lbnRzIiwiX2lzT2JqZWN0IiwiZXhlYyIsIl9mYWlscyIsImRlZmluZVByb3BlcnR5IiwiZ2V0IiwiX2dsb2JhbCIsImRvY3VtZW50IiwiZG9jdW1lbnQkMSIsImNyZWF0ZUVsZW1lbnQiLCJfZGVzY3JpcHRvcnMiLCJfZG9tQ3JlYXRlIiwiUyIsInZhbCIsInZhbHVlT2YiLCJPIiwiUCIsIkF0dHJpYnV0ZXMiLCJfYW5PYmplY3QiLCJfdG9QcmltaXRpdmUiLCJfaWU4RG9tRGVmaW5lIiwiZiIsImJpdG1hcCIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIl9wcm9wZXJ0eURlc2MiLCJzb3VyY2UiLCIkZXhwb3J0IiwiRiIsIkciLCJCIiwiVyIsIklTX0dMT0JBTCIsIlBST1RPVFlQRSIsIklTX1NUQVRJQyIsIm93biIsIm91dCIsIklTX0ZPUkNFRCIsInRhcmdldCIsIl9oYXMiLCJJU19CSU5EIiwiX2N0eCIsIklTX1dSQVAiLCJDIiwiSVNfUFJPVE8iLCJ2aXJ0dWFsIiwiUiIsImV4cFByb3RvIiwiX2hpZGUiLCJVIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJzcGxpdCIsIm1pbiIsIm1heCIsImluZGV4IiwibWluJDEiLCJJU19JTkNMVURFUyIsIiR0aGlzIiwiZWwiLCJmcm9tSW5kZXgiLCJfdG9Jb2JqZWN0IiwiX3RvTGVuZ3RoIiwiX3RvQWJzb2x1dGVJbmRleCIsIlNIQVJFRCIsInN0b3JlIiwibW9kZSIsIl9saWJyYXJ5IiwiY29weXJpZ2h0IiwicmFuZG9tIiwiY29uY2F0IiwiaWQiLCJweCIsIl9zaGFyZWQiLCJzaGFyZWQiLCJfdWlkIiwiX2FycmF5SW5jbHVkZXMiLCJfc2hhcmVkS2V5IiwibmFtZXMiLCJJRV9QUk9UTyIsImFycmF5SW5kZXhPZiIsIl9lbnVtQnVnS2V5cyIsImRlZmluZVByb3BlcnRpZXMiLCJQcm9wZXJ0aWVzIiwiX29iamVjdEtleXMiLCJfb2JqZWN0RHAiLCJkb2N1bWVudCQyIiwiZG9jdW1lbnRFbGVtZW50IiwiaWZyYW1lIiwic3R5bGUiLCJkaXNwbGF5IiwiX2h0bWwiLCJhcHBlbmRDaGlsZCIsInNyYyIsImlmcmFtZURvY3VtZW50IiwiY29udGVudFdpbmRvdyIsIm9wZW4iLCJ3cml0ZSIsImx0IiwiZ3QiLCJjbG9zZSIsImNyZWF0ZURpY3QiLCJQUk9UT1RZUEUkMSIsIkVtcHR5IiwiSUVfUFJPVE8kMSIsIl9vYmplY3REcHMiLCJVU0VfU1lNQk9MIiwiJGV4cG9ydHMiLCJfd2tzIiwidGFnIiwic3RhdCIsIlRBRyIsImRlZiIsIkNvbnN0cnVjdG9yIiwiTkFNRSIsIl9vYmplY3RDcmVhdGUiLCJfc2V0VG9TdHJpbmdUYWciLCJfdG9PYmplY3QiLCJJRV9QUk9UTyQyIiwiT2JqZWN0UHJvdG8iLCJCYXNlIiwiREVGQVVMVCIsIklTX1NFVCIsIkZPUkNFRCIsIl9pdGVyQ3JlYXRlIiwia2luZCIsIkJVR0dZIiwiVkFMVUVTIiwicHJvdG8iLCJJVEVSQVRPUiIsIkZGX0lURVJBVE9SIiwiJG5hdGl2ZSIsImdldE1ldGhvZCIsIkRFRl9WQUxVRVMiLCIkZGVmYXVsdCIsImVudHJpZXMiLCIkYW55TmF0aXZlIiwiX29iamVjdEdwbyIsIlZBTFVFU19CVUciLCJfaXRlcmF0b3JzIiwicmV0dXJuVGhpcyIsIm1ldGhvZHMiLCJLRVlTIiwiJGVudHJpZXMiLCJfcmVkZWZpbmUiLCJfZXhwb3J0IiwiX3N0cmluZ0F0IiwiX2l0ZXJEZWZpbmUiLCJpdGVyYXRlZCIsIl90IiwiX2kiLCJwb2ludCIsIiRhdCIsIkFycmF5IiwiX2siLCJBcmd1bWVudHMiLCJET01JdGVyYWJsZXMiLCJDb2xsZWN0aW9uIiwiVE9fU1RSSU5HX1RBRyIsIl9jb2YiLCJUIiwidHJ5R2V0IiwiVEFHJDEiLCJBUkciLCJjYWxsZWUiLCJmb3JiaWRkZW5GaWVsZCIsInJldCIsIkFycmF5UHJvdG8iLCJJVEVSQVRPUiQxIiwiZ2V0SXRlcmF0b3JNZXRob2QiLCJJVEVSQVRPUiQyIiwiX2NsYXNzb2YiLCJjb3JlX2dldEl0ZXJhdG9yTWV0aG9kIiwic3RlcCIsIl9pc0FycmF5SXRlciIsIml0ZXJGbiIsIkJSRUFLIiwiUkVUVVJOIiwiX2l0ZXJDYWxsIiwiRCIsIlNQRUNJRVMiLCJhcmdzIiwicHJvY2VzcyIsInNldEltbWVkaWF0ZSIsImNsZWFySW1tZWRpYXRlIiwiTWVzc2FnZUNoYW5uZWwiLCJEaXNwYXRjaCIsImNoYW5uZWwiLCJwb3J0IiwicXVldWUiLCJldmVudCIsInJ1biIsImRhdGEiLCJzZXRUYXNrIiwiY2xlYXJUYXNrIiwiY291bnRlciIsImRlZmVyIiwibmV4dFRpY2siLCJub3ciLCJwb3J0MiIsInBvcnQxIiwib25tZXNzYWdlIiwibGlzdGVuZXIiLCJwb3N0TWVzc2FnZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJpbXBvcnRTY3JpcHRzIiwiT05SRUFEWVNUQVRFQ0hBTkdFIiwicmVtb3ZlQ2hpbGQiLCJzZXRUaW1lb3V0Iiwic2V0IiwiY2xlYXIiLCJfdGFzayIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJXZWJLaXRNdXRhdGlvbk9ic2VydmVyIiwiUHJvbWlzZSIsInByb2Nlc3MkMSIsImxhc3QiLCJub3RpZnkiLCJpc05vZGUiLCJwYXJlbnQiLCJkb21haW4iLCJleGl0IiwiaGVhZCIsImVudGVyIiwiZmx1c2giLCJPYnNlcnZlciIsIm5hdmlnYXRvciIsInN0YW5kYWxvbmUiLCJjcmVhdGVUZXh0Tm9kZSIsIm9ic2VydmUiLCJub2RlIiwiY2hhcmFjdGVyRGF0YSIsInRvZ2dsZSIsIlByb21pc2UkMSIsInByb21pc2UiLCJtYWNyb3Rhc2siLCJ0YXNrIiwiJCRyZXNvbHZlIiwiJCRyZWplY3QiLCJmJDEiLCJ2IiwidXNlckFnZW50IiwieCIsIl9uZXdQcm9taXNlQ2FwYWJpbGl0eSIsInByb21pc2VDYXBhYmlsaXR5Iiwic2FmZSIsIktFWSIsIlNQRUNJRVMkMSIsIklURVJBVE9SJDMiLCJyaXRlciIsIlNBRkVfQ0xPU0lORyIsInNraXBDbG9zaW5nIiwiYXJyIiwiX21pY3JvdGFzayIsIlR5cGVFcnJvciIsInByb2Nlc3MkMiIsInZlcnNpb25zIiwidjgiLCJQUk9NSVNFIiwibmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5IiwiT3duUHJvbWlzZUNhcGFiaWxpdHkiLCJXcmFwcGVyIiwiJFByb21pc2UiLCJlbXB0eSIsImlzTm9kZSQxIiwiX3VzZXJBZ2VudCIsImlzUmVqZWN0IiwiX24iLCJfYyIsIm1pY3JvdGFzayIsIl92IiwiX3MiLCJyZWFjdGlvbiIsIm9rIiwiZmFpbCIsImV4aXRlZCIsImhhbmRsZXIiLCJfaCIsIm9uSGFuZGxlVW5oYW5kbGVkIiwiVHlwZUVycm9yJDEiLCJpc1RoZW5hYmxlIiwiY2hhaW4iLCJvblVuaGFuZGxlZCIsImlzVW5oYW5kbGVkIiwiY29uc29sZSIsInVuaGFuZGxlZCIsIl9wZXJmb3JtIiwiZW1pdCIsIm9udW5oYW5kbGVkcmVqZWN0aW9uIiwicmVhc29uIiwiZXJyb3IiLCJfYSIsIm9ucmVqZWN0aW9uaGFuZGxlZCIsIl9kIiwiX3ciLCIkcmVzb2x2ZSIsIndyYXBwZXIiLCIkcmVqZWN0IiwiVVNFX05BVElWRSIsImV4ZWN1dG9yIiwiX2FuSW5zdGFuY2UiLCJJbnRlcm5hbCIsIl9yZWRlZmluZUFsbCIsIm9uRnVsZmlsbGVkIiwib25SZWplY3RlZCIsIm5ld1Byb21pc2VDYXBhYmlsaXR5IiwiX3NwZWNpZXNDb25zdHJ1Y3RvciIsIl9zZXRTcGVjaWVzIiwiciIsImNhcGFiaWxpdHkiLCJfaXRlckRldGVjdCIsImFsbCIsIl9mb3JPZiIsInJlbWFpbmluZyIsImFscmVhZHlDYWxsZWQiLCIkaW5kZXgiLCJyYWNlIiwib25GaW5hbGx5IiwiaXNGdW5jdGlvbiIsImNhbGxiYWNrZm4iLCJnZW4iLCJwcm9taXNlJDEiLCJfbmV4dCIsIl90aHJvdyIsIl9hc3luY1RvR2VuZXJhdG9yIiwiZiQyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZ09QRCIsIl9vYmplY3RQaWUiLCJmJDMiLCJleHAiLCJfb2JqZWN0R29wZCIsIl9vYmplY3RTYXAiLCJpc0V4dGVuc2libGUiLCJwcmV2ZW50RXh0ZW5zaW9ucyIsInNldERlc2MiLCJNRVRBIiwidyIsInNldE1ldGEiLCJGUkVFWkUiLCJtZXRhIiwiTkVFRCIsImZhc3RLZXkiLCJnZXRXZWFrIiwib25GcmVlemUiLCJfbWV0YSIsImYkNCIsIl93a3NFeHQiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmJDUiLCJfb2JqZWN0R29wcyIsImdldFN5bWJvbHMiLCJzeW1ib2xzIiwiaXNFbnVtIiwiaXNBcnJheSIsImhpZGRlbktleXMiLCJmJDYiLCJfb2JqZWN0R29wbiIsInRvU3RyaW5nJDEiLCJnZXRXaW5kb3dOYW1lcyIsImdPUE4iLCJmJDciLCJfb2JqZWN0R29wbkV4dCIsIkpTT04iLCIkSlNPTiIsInN0cmluZ2lmeSIsIlBST1RPVFlQRSQyIiwiUU9iamVjdCIsImZpbmRDaGlsZCIsImRQJDEiLCJnT1BEJDEiLCJPYmplY3RQcm90byQxIiwicHJvdG9EZXNjIiwiQWxsU3ltYm9scyIsInN5bSIsIlVTRV9OQVRJVkUkMSIsIiRkZWZpbmVQcm9wZXJ0eSIsIk9QU3ltYm9scyIsIkhJRERFTiIsIl9lbnVtS2V5cyIsIiRkZWZpbmVQcm9wZXJ0aWVzIiwiRSIsImdPUE4kMSIsIklTX09QIiwiJHNldCIsInNldFN5bWJvbERlc2MiLCJzZXR0ZXIiLCIkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJDEiLCIkZ2V0T3duUHJvcGVydHlOYW1lcyIsIiRwcm9wZXJ0eUlzRW51bWVyYWJsZSIsIiRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJqIiwiZXM2U3ltYm9scyIsImsiLCJ3ZWxsS25vd25TeW1ib2xzIiwiX3drc0RlZmluZSIsIlN5bWJvbFJlZ2lzdHJ5Iiwia2V5Rm9yIiwiaXNTeW1ib2wiLCJ1c2VTZXR0ZXIiLCJ1c2VTaW1wbGUiLCIkY3JlYXRlIiwiX3N0cmluZ2lmeSIsIiRyZXBsYWNlciIsInJlcGxhY2VyIiwiX2lzQXJyYXkiLCJUT19QUklNSVRJVkUiLCJkZXNjIiwiZGVmaW5lUHJvcGVydHkkMSIsImRlZmluZVByb3BlcnR5JDIiLCJfZGVmaW5lUHJvcGVydHkiLCJrZXlzJDEiLCJvd25LZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzJDEiLCJmaWx0ZXIiLCJkZWZpbmVQcm9wZXJ0eSQzIiwiX29iamVjdFNwcmVhZCIsImluc3RhbmNlIiwiX2NsYXNzQ2FsbENoZWNrIiwidGVzdCIsImJ1Z2d5IiwiY2hlY2siLCJfc2V0UHJvdG8iLCJvIiwicCIsIl9zZXRQcm90b3R5cGVPZiIsInNldFByb3RvdHlwZU9mJDEiLCJzdWJDbGFzcyIsInN1cGVyQ2xhc3MiLCJzZXRQcm90b3R5cGVPZiQyIiwiX2luaGVyaXRzIiwicHJvcHMiLCJkZXNjcmlwdG9yIiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwiX2RlZmluZVByb3BlcnRpZXMiLCJfY3JlYXRlQ2xhc3MiLCJzeW1ib2wiLCJfdHlwZW9mMiIsInN5bWJvbCQxIiwiaXRlcmF0b3IkMSIsIl90eXBlb2YiLCJfYXNzZXJ0VGhpc0luaXRpYWxpemVkIiwiX3R5cGVvZl8xIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJfZ2V0UHJvdG90eXBlT2YiLCJnZXRQcm90b3R5cGVPZiQxIiwiZXh0ZW5zaW9ucyIsIl9sZW4iLCJfa2V5IiwiZXh0ZW5zaW9uIiwiX3N0ZXAiLCJfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uIiwiX2l0ZXJhdG9yIiwicHJvcCIsImV4dGVuZCIsIl9kaWRJdGVyYXRvckVycm9yIiwiX2l0ZXJhdG9yRXJyb3IiLCJhcnJheSIsImluc3RBcnJheSIsInRlbXBPYmplY3QiLCJndWlkZSIsImluc3RydWN0aW9ucyIsImluc3RydWN0IiwidHJhbnNmb3JtRGF0YSIsIk51bWJlciIsIkVQU0lMT04iLCJwb3ciLCJpc0ludGVnZXIiLCJpc0Zpbml0ZSIsInNpZ24iLCJtYXRjaCIsImFzc2lnbiIsIm5leHRLZXkiLCJvdXRwdXQiLCJFdmVudERpc3BhdGNoZXIiLCJfbGlzdGVuZXJzIiwibGlzdGVuZXJzIiwiaGFzRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJsaXN0ZW5lckFycmF5Iiwic3BsaWNlIiwiZGlzcGF0Y2hFdmVudCIsIkxFRlQiLCJNSURETEUiLCJSSUdIVCIsIkRFRzJSQUQiLCJQSSIsIlJBRDJERUciLCJnZW5lcmF0ZVVVSUQiLCJsdXQiLCJkMCIsImQxIiwiZDIiLCJkMyIsInRvVXBwZXJDYXNlIiwiY2xhbXAiLCJldWNsaWRlYW5Nb2R1bG8iLCJuIiwibSIsIm1hcExpbmVhciIsImExIiwiYTIiLCJiMSIsImIyIiwibGVycCIsInkiLCJ0Iiwic21vb3Roc3RlcCIsInNtb290aGVyc3RlcCIsInJhbmRJbnQiLCJsb3ciLCJoaWdoIiwicmFuZEZsb2F0IiwicmFuZEZsb2F0U3ByZWFkIiwicmFuZ2UiLCJkZWdUb1JhZCIsImRlZ3JlZXMiLCJfTWF0aCIsInJhZFRvRGVnIiwicmFkaWFucyIsImlzUG93ZXJPZlR3byIsImNlaWxQb3dlck9mVHdvIiwibG9nIiwiTE4yIiwiZmxvb3JQb3dlck9mVHdvIiwiVmVjdG9yMiIsImlzVmVjdG9yMiIsInNldFNjYWxhciIsInNjYWxhciIsInNldFgiLCJzZXRZIiwic2V0Q29tcG9uZW50IiwiZ2V0Q29tcG9uZW50IiwiY2xvbmUiLCJjb3B5IiwiYWRkIiwid2FybiIsImFkZFZlY3RvcnMiLCJhZGRTY2FsYXIiLCJhZGRTY2FsZWRWZWN0b3IiLCJzdWIiLCJzdWJWZWN0b3JzIiwic3ViU2NhbGFyIiwibXVsdGlwbHkiLCJtdWx0aXBseVNjYWxhciIsImRpdmlkZSIsImRpdmlkZVNjYWxhciIsImFwcGx5TWF0cml4MyIsImVsZW1lbnRzIiwiY2xhbXBTY2FsYXIiLCJtaW5WYWwiLCJtYXhWYWwiLCJjbGFtcExlbmd0aCIsInJvdW5kIiwicm91bmRUb1plcm8iLCJuZWdhdGUiLCJkb3QiLCJsZW5ndGhTcSIsInNxcnQiLCJtYW5oYXR0YW5MZW5ndGgiLCJhYnMiLCJub3JtYWxpemUiLCJhbmdsZSIsImF0YW4yIiwiZGlzdGFuY2VUbyIsImRpc3RhbmNlVG9TcXVhcmVkIiwiZHkiLCJkeCIsIm1hbmhhdHRhbkRpc3RhbmNlVG8iLCJzZXRMZW5ndGgiLCJhbHBoYSIsImxlcnBWZWN0b3JzIiwidjEiLCJ2MiIsImVxdWFscyIsImZyb21BcnJheSIsIm9mZnNldCIsInRvQXJyYXkiLCJmcm9tQnVmZmVyQXR0cmlidXRlIiwiYXR0cmlidXRlIiwiZ2V0WCIsImdldFkiLCJyb3RhdGVBcm91bmQiLCJjZW50ZXIiLCJjb3MiLCJzaW4iLCJNYXRyaXg0IiwiaXNNYXRyaXg0IiwibjExIiwibjEyIiwibjEzIiwibjE0IiwibjIxIiwibjIyIiwibjIzIiwibjI0IiwibjMxIiwibjMyIiwibjMzIiwibjM0IiwibjQxIiwibjQyIiwibjQzIiwibjQ0IiwidGUiLCJpZGVudGl0eSIsIm1lIiwiY29weVBvc2l0aW9uIiwiZXh0cmFjdEJhc2lzIiwieEF4aXMiLCJ5QXhpcyIsInpBeGlzIiwic2V0RnJvbU1hdHJpeENvbHVtbiIsIm1ha2VCYXNpcyIsInoiLCJleHRyYWN0Um90YXRpb24iLCJzY2FsZVgiLCJzY2FsZVkiLCJzY2FsZVoiLCJtYWtlUm90YXRpb25Gcm9tRXVsZXIiLCJldWxlciIsImlzRXVsZXIiLCJkIiwib3JkZXIiLCJhZiIsImJlIiwiYmYiLCJhZSIsImNmIiwiZGUiLCJkZiIsImNlIiwiYWQiLCJiYyIsImJkIiwiYWMiLCJtYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbiIsInEiLCJfeCIsIl95IiwiX3oiLCJ5MiIsInoyIiwieDIiLCJ4eSIsInh6IiwieXoiLCJ6eiIsInd5Iiwid3oiLCJ5eSIsInh4Iiwid3giLCJsb29rQXQiLCJleWUiLCJ1cCIsImNyb3NzVmVjdG9ycyIsIm11bHRpcGx5TWF0cmljZXMiLCJwcmVtdWx0aXBseSIsImExMiIsImExMyIsImExNCIsImEyMiIsImEyMyIsImEyNCIsImEzMiIsImEzMyIsImEzNCIsImE0MiIsImE0MyIsImE0NCIsImIxMiIsImIxMyIsImIxNCIsImIyMiIsImIyMyIsImIyNCIsImIzMiIsImIzMyIsImIzNCIsImI0MiIsImI0MyIsImI0NCIsImExMSIsImIxMSIsImIyMSIsImIzMSIsImI0MSIsImEyMSIsImEzMSIsImE0MSIsImFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUiLCJjb3VudCIsImdldFoiLCJhcHBseU1hdHJpeDQiLCJzZXRYWVoiLCJkZXRlcm1pbmFudCIsInRyYW5zcG9zZSIsInRtcCIsInNldFBvc2l0aW9uIiwiZ2V0SW52ZXJzZSIsInRocm93T25EZWdlbmVyYXRlIiwidDExIiwidDEyIiwidDEzIiwidDE0IiwiZGV0IiwibXNnIiwiZGV0SW52Iiwic2NhbGUiLCJnZXRNYXhTY2FsZU9uQXhpcyIsInNjYWxlWFNxIiwic2NhbGVZU3EiLCJzY2FsZVpTcSIsIm1ha2VUcmFuc2xhdGlvbiIsIm1ha2VSb3RhdGlvblgiLCJ0aGV0YSIsIm1ha2VSb3RhdGlvblkiLCJtYWtlUm90YXRpb25aIiwibWFrZVJvdGF0aW9uQXhpcyIsImF4aXMiLCJ0eSIsInR4IiwibWFrZVNjYWxlIiwibWFrZVNoZWFyIiwiY29tcG9zZSIsInBvc2l0aW9uIiwicXVhdGVybmlvbiIsImRlY29tcG9zZSIsInZlY3RvciIsInN4IiwibWF0cml4Iiwic3kiLCJzeiIsImludlNYIiwiaW52U1kiLCJpbnZTWiIsInNldEZyb21Sb3RhdGlvbk1hdHJpeCIsIm1ha2VQZXJzcGVjdGl2ZSIsImxlZnQiLCJyaWdodCIsInRvcCIsImJvdHRvbSIsIm5lYXIiLCJmYXIiLCJtYWtlT3J0aG9ncmFwaGljIiwiaCIsIlF1YXRlcm5pb24iLCJzbGVycCIsInFhIiwicWIiLCJxbSIsInNsZXJwRmxhdCIsImRzdCIsImRzdE9mZnNldCIsInNyYzAiLCJzcmNPZmZzZXQwIiwic3JjMSIsInNyY09mZnNldDEiLCJ5MCIsInowIiwidzAiLCJ4MSIsInkxIiwiejEiLCJ3MSIsIngwIiwiZGlyIiwic3FyU2luIiwibGVuIiwidERpciIsIm9uQ2hhbmdlQ2FsbGJhY2siLCJzZXRGcm9tRXVsZXIiLCJ1cGRhdGUiLCJzMSIsImMyIiwiYzMiLCJjMSIsInMyIiwiczMiLCJzZXRGcm9tQXhpc0FuZ2xlIiwiaGFsZkFuZ2xlIiwibTExIiwibTEyIiwibTEzIiwibTIxIiwibTIyIiwibTIzIiwibTMxIiwibTMyIiwibTMzIiwidHJhY2UiLCJzZXRGcm9tVW5pdFZlY3RvcnMiLCJ2RnJvbSIsInZUbyIsIkVQUyIsImludmVyc2UiLCJjb25qdWdhdGUiLCJtdWx0aXBseVF1YXRlcm5pb25zIiwicWF5IiwicWF6IiwicWF3IiwicWJ5IiwicWJ6IiwicWJ3IiwicWF4IiwicWJ4IiwiY29zSGFsZlRoZXRhIiwic2luSGFsZlRoZXRhIiwiaGFsZlRoZXRhIiwicmF0aW9CIiwicmF0aW9BIiwib25DaGFuZ2UiLCJjYWxsYmFjayIsIlZlY3RvcjMiLCJpc1ZlY3RvcjMiLCJzZXRaIiwibXVsdGlwbHlWZWN0b3JzIiwiYXBwbHlFdWxlciIsImFwcGx5UXVhdGVybmlvbiIsImFwcGx5QXhpc0FuZ2xlIiwicXkiLCJxeiIsInF3IiwicXgiLCJpeCIsIml3IiwiaXkiLCJpeiIsInByb2plY3QiLCJjYW1lcmEiLCJwcm9qZWN0aW9uTWF0cml4IiwibWF0cml4V29ybGQiLCJ1bnByb2plY3QiLCJ0cmFuc2Zvcm1EaXJlY3Rpb24iLCJjcm9zcyIsImF5IiwiYXoiLCJieSIsImJ6IiwiYngiLCJheCIsInByb2plY3RPblZlY3RvciIsInByb2plY3RPblBsYW5lIiwicGxhbmVOb3JtYWwiLCJyZWZsZWN0Iiwibm9ybWFsIiwiYW5nbGVUbyIsImFjb3MiLCJkeiIsInNldEZyb21TcGhlcmljYWwiLCJwaGkiLCJyYWRpdXMiLCJzaW5QaGlSYWRpdXMiLCJzZXRGcm9tQ3lsaW5kcmljYWwiLCJzZXRGcm9tTWF0cml4UG9zaXRpb24iLCJzZXRGcm9tTWF0cml4U2NhbGUiLCJNYXRyaXgzIiwiaXNNYXRyaXgzIiwic2V0RnJvbU1hdHJpeDQiLCJnZXROb3JtYWxNYXRyaXgiLCJtYXRyaXg0IiwidHJhbnNwb3NlSW50b0FycmF5Iiwic2V0VXZUcmFuc2Zvcm0iLCJyb3RhdGlvbiIsImN4IiwiY3kiLCJyb3RhdGUiLCJ0cmFuc2xhdGUiLCJpbWFnZSIsIm1hcHBpbmciLCJ3cmFwUyIsIndyYXBUIiwibWFnRmlsdGVyIiwibWluRmlsdGVyIiwiZm9ybWF0IiwiYW5pc290cm9weSIsImVuY29kaW5nIiwidGV4dHVyZUlkIiwidXVpZCIsIlRleHR1cmUiLCJERUZBVUxUX0lNQUdFIiwibWlwbWFwcyIsIkRFRkFVTFRfTUFQUElORyIsIkNsYW1wVG9FZGdlV3JhcHBpbmciLCJMaW5lYXJGaWx0ZXIiLCJMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXIiLCJSR0JBRm9ybWF0IiwiVW5zaWduZWRCeXRlVHlwZSIsInJlcGVhdCIsIm1hdHJpeEF1dG9VcGRhdGUiLCJnZW5lcmF0ZU1pcG1hcHMiLCJwcmVtdWx0aXBseUFscGhhIiwiZmxpcFkiLCJ1bnBhY2tBbGlnbm1lbnQiLCJMaW5lYXJFbmNvZGluZyIsIm9uVXBkYXRlIiwiVVZNYXBwaW5nIiwiaXNUZXh0dXJlIiwidXBkYXRlTWF0cml4IiwidG9KU09OIiwiaXNSb290T2JqZWN0IiwidGV4dHVyZXMiLCJjYW52YXMiLCJjcmVhdGVFbGVtZW50TlMiLCJ3aWR0aCIsImhlaWdodCIsImdldENvbnRleHQiLCJwdXRJbWFnZURhdGEiLCJkcmF3SW1hZ2UiLCJ0b0RhdGFVUkwiLCJtZXRhZGF0YSIsImltYWdlcyIsInVybCIsImdldERhdGFVUkwiLCJkaXNwb3NlIiwidHJhbnNmb3JtVXYiLCJ1diIsIlZlY3RvcjQiLCJpc1ZlY3RvcjQiLCJzZXRXIiwic2V0QXhpc0FuZ2xlRnJvbVF1YXRlcm5pb24iLCJzZXRBeGlzQW5nbGVGcm9tUm90YXRpb25NYXRyaXgiLCJlcHNpbG9uIiwiZXBzaWxvbjIiLCJnZXRXIiwib3B0aW9ucyIsInNjaXNzb3IiLCJzY2lzc29yVGVzdCIsInZpZXdwb3J0IiwidGV4dHVyZSIsImRlcHRoQnVmZmVyIiwic3RlbmNpbEJ1ZmZlciIsImRlcHRoVGV4dHVyZSIsIldlYkdMUmVuZGVyVGFyZ2V0IiwiaXNXZWJHTFJlbmRlclRhcmdldCIsInNldFNpemUiLCJhY3RpdmVDdWJlRmFjZSIsImFjdGl2ZU1pcE1hcExldmVsIiwiV2ViR0xSZW5kZXJUYXJnZXRDdWJlIiwiaXNXZWJHTFJlbmRlclRhcmdldEN1YmUiLCJOZWFyZXN0RmlsdGVyIiwiRGF0YVRleHR1cmUiLCJpc0RhdGFUZXh0dXJlIiwiSW5maW5pdHkiLCJCb3gzIiwiaXNCb3gzIiwic2V0RnJvbUFycmF5IiwibWluWCIsIm1pblkiLCJtaW5aIiwibWF4WCIsIm1heFkiLCJtYXhaIiwic2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSIsInNldEZyb21Qb2ludHMiLCJwb2ludHMiLCJtYWtlRW1wdHkiLCJpbCIsImV4cGFuZEJ5UG9pbnQiLCJzZXRGcm9tQ2VudGVyQW5kU2l6ZSIsInNpemUiLCJoYWxmU2l6ZSIsInNldEZyb21PYmplY3QiLCJleHBhbmRCeU9iamVjdCIsImJveCIsImlzRW1wdHkiLCJnZXRDZW50ZXIiLCJnZXRTaXplIiwiZXhwYW5kQnlWZWN0b3IiLCJleHBhbmRCeVNjYWxhciIsImdlb21ldHJ5IiwiaXNHZW9tZXRyeSIsInZlcnRpY2VzIiwic2NvcGUiLCJpc0J1ZmZlckdlb21ldHJ5IiwiYXR0cmlidXRlcyIsInVwZGF0ZU1hdHJpeFdvcmxkIiwidHJhdmVyc2UiLCJjb250YWluc1BvaW50IiwiY29udGFpbnNCb3giLCJnZXRQYXJhbWV0ZXIiLCJpbnRlcnNlY3RzQm94IiwiaW50ZXJzZWN0c1NwaGVyZSIsInNwaGVyZSIsImNsYW1wUG9pbnQiLCJjbG9zZXN0UG9pbnQiLCJpbnRlcnNlY3RzUGxhbmUiLCJwbGFuZSIsImNvbnN0YW50IiwiaW50ZXJzZWN0c1RyaWFuZ2xlIiwiYXhlcyIsInRlc3RBeGlzIiwiZXh0ZW50cyIsInYwIiwicDAiLCJwMSIsInAyIiwidHJpYW5nbGUiLCJmMCIsImYxIiwiZjIiLCJzYXRGb3JBeGVzIiwidHJpYW5nbGVOb3JtYWwiLCJkaXN0YW5jZVRvUG9pbnQiLCJnZXRCb3VuZGluZ1NwaGVyZSIsImludGVyc2VjdCIsInVuaW9uIiwiU3BoZXJlIiwib3B0aW9uYWxDZW50ZXIiLCJtYXhSYWRpdXNTcSIsInJhZGl1c1N1bSIsImRlbHRhTGVuZ3RoU3EiLCJnZXRCb3VuZGluZ0JveCIsIlBsYW5lIiwic2V0Q29tcG9uZW50cyIsInNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50Iiwic2V0RnJvbUNvcGxhbmFyUG9pbnRzIiwiaW52ZXJzZU5vcm1hbExlbmd0aCIsImRpc3RhbmNlVG9TcGhlcmUiLCJwcm9qZWN0UG9pbnQiLCJpbnRlcnNlY3RMaW5lIiwibGluZSIsImRlbHRhIiwiZGlyZWN0aW9uIiwiZGVub21pbmF0b3IiLCJzdGFydCIsImludGVyc2VjdHNMaW5lIiwiZW5kIiwiZW5kU2lnbiIsInN0YXJ0U2lnbiIsImNvcGxhbmFyUG9pbnQiLCJvcHRpb25hbE5vcm1hbE1hdHJpeCIsIm0xIiwibm9ybWFsTWF0cml4IiwicmVmZXJlbmNlUG9pbnQiLCJwMyIsInA0IiwicDUiLCJwbGFuZXMiLCJGcnVzdHVtIiwiZnJ1c3R1bSIsInNldEZyb21NYXRyaXgiLCJtZTEiLCJtZTIiLCJtZTMiLCJtZTUiLCJtZTYiLCJtZTciLCJtZTkiLCJtZTEwIiwibWUxMSIsIm1lMTMiLCJtZTE0IiwibWUxNSIsIm1lMCIsIm1lNCIsIm1lOCIsIm1lMTIiLCJpbnRlcnNlY3RzT2JqZWN0IiwiYm91bmRpbmdTcGhlcmUiLCJjb21wdXRlQm91bmRpbmdTcGhlcmUiLCJpbnRlcnNlY3RzU3ByaXRlIiwic3ByaXRlIiwiZGlzdGFuY2UiLCJuZWdSYWRpdXMiLCJhbHBoYW1hcF9mcmFnbWVudCIsImFscGhhbWFwX3BhcnNfZnJhZ21lbnQiLCJhbHBoYXRlc3RfZnJhZ21lbnQiLCJhb21hcF9mcmFnbWVudCIsImFvbWFwX3BhcnNfZnJhZ21lbnQiLCJiZWdpbl92ZXJ0ZXgiLCJiZWdpbm5vcm1hbF92ZXJ0ZXgiLCJic2RmcyIsImJ1bXBtYXBfcGFyc19mcmFnbWVudCIsImNsaXBwaW5nX3BsYW5lc19mcmFnbWVudCIsImNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50IiwiY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4IiwiY2xpcHBpbmdfcGxhbmVzX3ZlcnRleCIsImNvbG9yX2ZyYWdtZW50IiwiY29sb3JfcGFyc19mcmFnbWVudCIsImNvbG9yX3BhcnNfdmVydGV4IiwiY29sb3JfdmVydGV4IiwiY29tbW9uIiwiY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50IiwiZGVmYXVsdG5vcm1hbF92ZXJ0ZXgiLCJkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXgiLCJkaXNwbGFjZW1lbnRtYXBfdmVydGV4IiwiZW1pc3NpdmVtYXBfZnJhZ21lbnQiLCJlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50IiwiZW5jb2RpbmdzX2ZyYWdtZW50IiwiZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQiLCJlbnZtYXBfZnJhZ21lbnQiLCJlbnZtYXBfcGFyc19mcmFnbWVudCIsImVudm1hcF9wYXJzX3ZlcnRleCIsImVudm1hcF92ZXJ0ZXgiLCJmb2dfdmVydGV4IiwiZm9nX3BhcnNfdmVydGV4IiwiZm9nX2ZyYWdtZW50IiwiZm9nX3BhcnNfZnJhZ21lbnQiLCJncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50IiwibGlnaHRtYXBfZnJhZ21lbnQiLCJsaWdodG1hcF9wYXJzX2ZyYWdtZW50IiwibGlnaHRzX2xhbWJlcnRfdmVydGV4IiwibGlnaHRzX3BhcnNfYmVnaW4iLCJsaWdodHNfcGFyc19tYXBzIiwibGlnaHRzX3Bob25nX2ZyYWdtZW50IiwibGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQiLCJsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQiLCJsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudCIsImxpZ2h0c19mcmFnbWVudF9iZWdpbiIsImxpZ2h0c19mcmFnbWVudF9tYXBzIiwibGlnaHRzX2ZyYWdtZW50X2VuZCIsImxvZ2RlcHRoYnVmX2ZyYWdtZW50IiwibG9nZGVwdGhidWZfcGFyc19mcmFnbWVudCIsImxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4IiwibG9nZGVwdGhidWZfdmVydGV4IiwibWFwX2ZyYWdtZW50IiwibWFwX3BhcnNfZnJhZ21lbnQiLCJtYXBfcGFydGljbGVfZnJhZ21lbnQiLCJtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudCIsIm1ldGFsbmVzc21hcF9mcmFnbWVudCIsIm1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50IiwibW9ycGhub3JtYWxfdmVydGV4IiwibW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXgiLCJtb3JwaHRhcmdldF92ZXJ0ZXgiLCJub3JtYWxfZnJhZ21lbnRfYmVnaW4iLCJub3JtYWxfZnJhZ21lbnRfbWFwcyIsIm5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50IiwicGFja2luZyIsInByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQiLCJwcm9qZWN0X3ZlcnRleCIsImRpdGhlcmluZ19mcmFnbWVudCIsImRpdGhlcmluZ19wYXJzX2ZyYWdtZW50Iiwicm91Z2huZXNzbWFwX2ZyYWdtZW50Iiwicm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQiLCJzaGFkb3dtYXBfcGFyc19mcmFnbWVudCIsInNoYWRvd21hcF9wYXJzX3ZlcnRleCIsInNoYWRvd21hcF92ZXJ0ZXgiLCJzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQiLCJza2luYmFzZV92ZXJ0ZXgiLCJza2lubmluZ19wYXJzX3ZlcnRleCIsInNraW5uaW5nX3ZlcnRleCIsInNraW5ub3JtYWxfdmVydGV4Iiwic3BlY3VsYXJtYXBfZnJhZ21lbnQiLCJzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50IiwidG9uZW1hcHBpbmdfZnJhZ21lbnQiLCJ0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50IiwidXZfcGFyc19mcmFnbWVudCIsInV2X3BhcnNfdmVydGV4IiwidXZfdmVydGV4IiwidXYyX3BhcnNfZnJhZ21lbnQiLCJ1djJfcGFyc192ZXJ0ZXgiLCJ1djJfdmVydGV4Iiwid29ybGRwb3NfdmVydGV4IiwiY3ViZV9mcmFnIiwiY3ViZV92ZXJ0IiwiZGVwdGhfZnJhZyIsImRlcHRoX3ZlcnQiLCJkaXN0YW5jZVJHQkFfZnJhZyIsImRpc3RhbmNlUkdCQV92ZXJ0IiwiZXF1aXJlY3RfZnJhZyIsImVxdWlyZWN0X3ZlcnQiLCJsaW5lZGFzaGVkX2ZyYWciLCJsaW5lZGFzaGVkX3ZlcnQiLCJtZXNoYmFzaWNfZnJhZyIsIm1lc2hiYXNpY192ZXJ0IiwibWVzaGxhbWJlcnRfZnJhZyIsIm1lc2hsYW1iZXJ0X3ZlcnQiLCJtZXNocGhvbmdfZnJhZyIsIm1lc2hwaG9uZ192ZXJ0IiwibWVzaHBoeXNpY2FsX2ZyYWciLCJtZXNocGh5c2ljYWxfdmVydCIsIm5vcm1hbF9mcmFnIiwibm9ybWFsX3ZlcnQiLCJwb2ludHNfZnJhZyIsInBvaW50c192ZXJ0Iiwic2hhZG93X2ZyYWciLCJzaGFkb3dfdmVydCIsIm1lcmdlIiwidW5pZm9ybXMiLCJ1IiwibWVyZ2VkIiwidW5pZm9ybXNfc3JjIiwidW5pZm9ybXNfZHN0IiwicGFyYW1ldGVyX3NyYyIsImlzQ29sb3IiLCJzZXRSR0IiLCJDb2xvciIsInNldEhleCIsInNldFN0eWxlIiwiaGV4Iiwic2V0SFNMIiwiaHVlMnJnYiIsInN0cmluZyIsInBhcnNlRmxvYXQiLCJjb2xvciIsImNvbXBvbmVudHMiLCJwYXJzZUludCIsImhhbmRsZUFscGhhIiwiQ29sb3JLZXl3b3JkcyIsImNvcHlHYW1tYVRvTGluZWFyIiwiZ2FtbWFGYWN0b3IiLCJjb3B5TGluZWFyVG9HYW1tYSIsInNhZmVJbnZlcnNlIiwiY29udmVydEdhbW1hVG9MaW5lYXIiLCJjb252ZXJ0TGluZWFyVG9HYW1tYSIsImdldEhleCIsImdldEhleFN0cmluZyIsImdldEhTTCIsInNhdHVyYXRpb24iLCJodWUiLCJsaWdodG5lc3MiLCJnZXRTdHlsZSIsIm9mZnNldEhTTCIsImhzbCIsImFkZENvbG9ycyIsImNvbG9yMSIsImNvbG9yMiIsImRpZmZ1c2UiLCJvcGFjaXR5IiwibWFwIiwidXZUcmFuc2Zvcm0iLCJhbHBoYU1hcCIsInNwZWN1bGFybWFwIiwic3BlY3VsYXJNYXAiLCJlbnZtYXAiLCJlbnZNYXAiLCJmbGlwRW52TWFwIiwicmVmbGVjdGl2aXR5IiwicmVmcmFjdGlvblJhdGlvIiwibWF4TWlwTGV2ZWwiLCJhb21hcCIsImFvTWFwIiwiYW9NYXBJbnRlbnNpdHkiLCJsaWdodG1hcCIsImxpZ2h0TWFwIiwibGlnaHRNYXBJbnRlbnNpdHkiLCJlbWlzc2l2ZW1hcCIsImVtaXNzaXZlTWFwIiwiYnVtcG1hcCIsImJ1bXBNYXAiLCJidW1wU2NhbGUiLCJub3JtYWxtYXAiLCJub3JtYWxNYXAiLCJub3JtYWxTY2FsZSIsImRpc3BsYWNlbWVudG1hcCIsImRpc3BsYWNlbWVudE1hcCIsImRpc3BsYWNlbWVudFNjYWxlIiwiZGlzcGxhY2VtZW50QmlhcyIsInJvdWdobmVzc21hcCIsInJvdWdobmVzc01hcCIsIm1ldGFsbmVzc21hcCIsIm1ldGFsbmVzc01hcCIsImdyYWRpZW50bWFwIiwiZ3JhZGllbnRNYXAiLCJmb2ciLCJmb2dEZW5zaXR5IiwiZm9nTmVhciIsImZvZ0ZhciIsImZvZ0NvbG9yIiwibGlnaHRzIiwiYW1iaWVudExpZ2h0Q29sb3IiLCJkaXJlY3Rpb25hbExpZ2h0cyIsInByb3BlcnRpZXMiLCJzaGFkb3ciLCJzaGFkb3dCaWFzIiwic2hhZG93UmFkaXVzIiwic2hhZG93TWFwU2l6ZSIsImRpcmVjdGlvbmFsU2hhZG93TWFwIiwiZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgiLCJzcG90TGlnaHRzIiwiY29uZUNvcyIsInBlbnVtYnJhQ29zIiwiZGVjYXkiLCJzcG90U2hhZG93TWFwIiwic3BvdFNoYWRvd01hdHJpeCIsInBvaW50TGlnaHRzIiwic2hhZG93Q2FtZXJhTmVhciIsInNoYWRvd0NhbWVyYUZhciIsInBvaW50U2hhZG93TWFwIiwicG9pbnRTaGFkb3dNYXRyaXgiLCJoZW1pc3BoZXJlTGlnaHRzIiwic2t5Q29sb3IiLCJncm91bmRDb2xvciIsInJlY3RBcmVhTGlnaHRzIiwiYmFzaWMiLCJVbmlmb3Jtc1V0aWxzIiwiVW5pZm9ybXNMaWIiLCJ2ZXJ0ZXhTaGFkZXIiLCJTaGFkZXJDaHVuayIsImZyYWdtZW50U2hhZGVyIiwibGFtYmVydCIsImVtaXNzaXZlIiwicGhvbmciLCJzcGVjdWxhciIsInNoaW5pbmVzcyIsInN0YW5kYXJkIiwicm91Z2huZXNzIiwibWV0YWxuZXNzIiwiZW52TWFwSW50ZW5zaXR5IiwiZGFzaGVkIiwiZGFzaFNpemUiLCJ0b3RhbFNpemUiLCJkZXB0aCIsImN1YmUiLCJ0Q3ViZSIsInRGbGlwIiwiZXF1aXJlY3QiLCJ0RXF1aXJlY3QiLCJkaXN0YW5jZVJHQkEiLCJyZWZlcmVuY2VQb3NpdGlvbiIsIm5lYXJEaXN0YW5jZSIsImZhckRpc3RhbmNlIiwiU2hhZGVyTGliIiwicGh5c2ljYWwiLCJjbGVhckNvYXQiLCJjbGVhckNvYXRSb3VnaG5lc3MiLCJnbCIsImJ1ZmZlclR5cGUiLCJkeW5hbWljIiwiRFlOQU1JQ19EUkFXIiwiU1RBVElDX0RSQVciLCJjcmVhdGVCdWZmZXIiLCJiaW5kQnVmZmVyIiwiYnVmZmVyIiwiYnVmZmVyRGF0YSIsInVzYWdlIiwib25VcGxvYWRDYWxsYmFjayIsIkZMT0FUIiwiVU5TSUdORURfU0hPUlQiLCJTSE9SVCIsIlVOU0lHTkVEX0lOVCIsIklOVCIsIkJZVEUiLCJVTlNJR05FRF9CWVRFIiwiYnl0ZXNQZXJFbGVtZW50IiwiQllURVNfUEVSX0VMRU1FTlQiLCJ1cGRhdGVSYW5nZSIsImJ1ZmZlclN1YkRhdGEiLCJzdWJhcnJheSIsImlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUiLCJidWZmZXJzIiwiZGVsZXRlQnVmZmVyIiwiZGVsZXRlIiwidXBkYXRlQnVmZmVyIiwicmVtb3ZlIiwiX29yZGVyIiwiRXVsZXIiLCJEZWZhdWx0T3JkZXIiLCJSb3RhdGlvbk9yZGVycyIsImFzaW4iLCJzZXRGcm9tUXVhdGVybmlvbiIsInNldEZyb21WZWN0b3IzIiwicmVvcmRlciIsIm5ld09yZGVyIiwidG9WZWN0b3IzIiwib3B0aW9uYWxSZXN1bHQiLCJtYXNrIiwiTGF5ZXJzIiwiZW5hYmxlIiwiZGlzYWJsZSIsImxheWVycyIsIm9iamVjdDNESWQiLCJjaGlsZHJlbiIsIk9iamVjdDNEIiwiRGVmYXVsdFVwIiwib25Sb3RhdGlvbkNoYW5nZSIsIm9uUXVhdGVybmlvbkNoYW5nZSIsIm1vZGVsVmlld01hdHJpeCIsIkRlZmF1bHRNYXRyaXhBdXRvVXBkYXRlIiwibWF0cml4V29ybGROZWVkc1VwZGF0ZSIsInZpc2libGUiLCJjYXN0U2hhZG93IiwicmVjZWl2ZVNoYWRvdyIsImZydXN0dW1DdWxsZWQiLCJyZW5kZXJPcmRlciIsInVzZXJEYXRhIiwiaXNPYmplY3QzRCIsIm9uQmVmb3JlUmVuZGVyIiwib25BZnRlclJlbmRlciIsImFwcGx5TWF0cml4Iiwic2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlIiwic2V0Um90YXRpb25Gcm9tRXVsZXIiLCJzZXRSb3RhdGlvbkZyb21NYXRyaXgiLCJzZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uIiwicm90YXRlT25BeGlzIiwicTEiLCJyb3RhdGVPbldvcmxkQXhpcyIsInJvdGF0ZVgiLCJyb3RhdGVZIiwicm90YXRlWiIsInRyYW5zbGF0ZU9uQXhpcyIsInRyYW5zbGF0ZVgiLCJ0cmFuc2xhdGVZIiwidHJhbnNsYXRlWiIsImxvY2FsVG9Xb3JsZCIsIndvcmxkVG9Mb2NhbCIsImlzQ2FtZXJhIiwiZ2V0T2JqZWN0QnlJZCIsImdldE9iamVjdEJ5UHJvcGVydHkiLCJnZXRPYmplY3RCeU5hbWUiLCJjaGlsZCIsImdldFdvcmxkUG9zaXRpb24iLCJnZXRXb3JsZFF1YXRlcm5pb24iLCJnZXRXb3JsZFNjYWxlIiwiZ2V0V29ybGREaXJlY3Rpb24iLCJyYXljYXN0IiwidHJhdmVyc2VWaXNpYmxlIiwidHJhdmVyc2VBbmNlc3RvcnMiLCJmb3JjZSIsImdlb21ldHJpZXMiLCJtYXRlcmlhbHMiLCJzaGFwZXMiLCJsaWJyYXJ5IiwiZWxlbWVudCIsInNlcmlhbGl6ZSIsInBhcmFtZXRlcnMiLCJzaGFwZSIsIm1hdGVyaWFsIiwidXVpZHMiLCJleHRyYWN0RnJvbUNhY2hlIiwiY2FjaGUiLCJyZWN1cnNpdmUiLCJwYXJzZSIsIm1hdHJpeFdvcmxkSW52ZXJzZSIsIkNhbWVyYSIsInpvb20iLCJ2aWV3IiwidXBkYXRlUHJvamVjdGlvbk1hdHJpeCIsIk9ydGhvZ3JhcGhpY0NhbWVyYSIsImlzT3J0aG9ncmFwaGljQ2FtZXJhIiwic2V0Vmlld09mZnNldCIsImZ1bGxXaWR0aCIsImZ1bGxIZWlnaHQiLCJlbmFibGVkIiwib2Zmc2V0WCIsIm9mZnNldFkiLCJjbGVhclZpZXdPZmZzZXQiLCJzY2FsZVciLCJ6b29tVyIsInNjYWxlSCIsInpvb21IIiwibWF0ZXJpYWxJbmRleCIsInZlcnRleE5vcm1hbHMiLCJ2ZXJ0ZXhDb2xvcnMiLCJGYWNlMyIsImdlb21ldHJ5SWQiLCJjb2xvcnMiLCJmYWNlcyIsImZhY2VWZXJ0ZXhVdnMiLCJtb3JwaFRhcmdldHMiLCJtb3JwaE5vcm1hbHMiLCJza2luV2VpZ2h0cyIsInNraW5JbmRpY2VzIiwibGluZURpc3RhbmNlcyIsImJvdW5kaW5nQm94IiwiZWxlbWVudHNOZWVkVXBkYXRlIiwidmVydGljZXNOZWVkVXBkYXRlIiwidXZzTmVlZFVwZGF0ZSIsIm5vcm1hbHNOZWVkVXBkYXRlIiwiY29sb3JzTmVlZFVwZGF0ZSIsImxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlIiwiZ3JvdXBzTmVlZFVwZGF0ZSIsIkdlb21ldHJ5IiwidmVydGV4IiwiZmFjZSIsImpsIiwiY29tcHV0ZUJvdW5kaW5nQm94IiwiZnJvbUJ1ZmZlckdlb21ldHJ5IiwidXYyIiwidXZzMiIsInBvc2l0aW9ucyIsIm5vcm1hbHMiLCJ0ZW1wTm9ybWFscyIsInV2cyIsInRlbXBVVnMiLCJ0ZW1wVVZzMiIsImdyb3VwcyIsImdyb3VwIiwiaW5kaWNlcyIsImFkZEZhY2UiLCJjb21wdXRlRmFjZU5vcm1hbHMiLCJhYiIsImZsIiwiY2IiLCJ2QyIsInZCIiwidkEiLCJjb21wdXRlVmVydGV4Tm9ybWFscyIsImFyZWFXZWlnaHRlZCIsInZsIiwiY29tcHV0ZUZsYXRWZXJ0ZXhOb3JtYWxzIiwiY29tcHV0ZU1vcnBoTm9ybWFscyIsIl9fb3JpZ2luYWxGYWNlTm9ybWFsIiwiX19vcmlnaW5hbFZlcnRleE5vcm1hbHMiLCJ0bXBHZW8iLCJmYWNlTm9ybWFscyIsImZhY2VOb3JtYWwiLCJkc3ROb3JtYWxzRmFjZSIsImRzdE5vcm1hbHNWZXJ0ZXgiLCJtYXRlcmlhbEluZGV4T2Zmc2V0IiwidmVydGV4T2Zmc2V0IiwidmVydGljZXMxIiwidmVydGljZXMyIiwiZmFjZXMxIiwiZmFjZXMyIiwidXZzMSIsImNvbG9yczEiLCJjb2xvcnMyIiwidmVydGV4Q29weSIsImZhY2VDb3B5IiwiZmFjZVZlcnRleE5vcm1hbHMiLCJmYWNlVmVydGV4Q29sb3JzIiwidXZDb3B5IiwibWVyZ2VNZXNoIiwibWVzaCIsImlzTWVzaCIsIm1lcmdlVmVydGljZXMiLCJjaGFuZ2VzIiwicHJlY2lzaW9uUG9pbnRzIiwicHJlY2lzaW9uIiwidmVydGljZXNNYXAiLCJ1bmlxdWUiLCJmYWNlSW5kaWNlc1RvUmVtb3ZlIiwiaWR4Iiwic29ydEZhY2VzQnlNYXRlcmlhbEluZGV4IiwiX2lkIiwic29ydCIsIm1hdGVyaWFsSW5kZXhTb3J0IiwibmV3VXZzMiIsIm5ld1V2czEiLCJmYWNlVHlwZSIsInNldEJpdCIsImhhc01hdGVyaWFsIiwiaGFzRmFjZVV2IiwiaGFzRmFjZVZlcnRleFV2IiwiaGFzRmFjZU5vcm1hbCIsImhhc0ZhY2VWZXJ0ZXhOb3JtYWwiLCJoYXNGYWNlQ29sb3IiLCJoYXNGYWNlVmVydGV4Q29sb3IiLCJnZXRVdkluZGV4IiwiZ2V0Tm9ybWFsSW5kZXgiLCJnZXRDb2xvckluZGV4Iiwibm9ybWFsc0hhc2giLCJoYXNoIiwiY29sb3JzSGFzaCIsInV2c0hhc2giLCJrbCIsInV2c0NvcHkiLCJtb3JwaFRhcmdldCIsIm1vcnBoTm9ybWFsIiwiZGVzdFZlcnRleE5vcm1hbCIsInNyY1ZlcnRleE5vcm1hbCIsIml0ZW1TaXplIiwibm9ybWFsaXplZCIsIkJ1ZmZlckF0dHJpYnV0ZSIsImlzQnVmZmVyQXR0cmlidXRlIiwic2V0QXJyYXkiLCJzZXREeW5hbWljIiwiY29weUF0IiwiaW5kZXgxIiwiaW5kZXgyIiwiY29weUFycmF5IiwiY29weUNvbG9yc0FycmF5IiwiY29weVZlY3RvcjJzQXJyYXkiLCJ2ZWN0b3JzIiwiY29weVZlY3RvcjNzQXJyYXkiLCJjb3B5VmVjdG9yNHNBcnJheSIsInNldFhZIiwic2V0WFlaVyIsIm9uVXBsb2FkIiwiSW50OEJ1ZmZlckF0dHJpYnV0ZSIsIlVpbnQ4QnVmZmVyQXR0cmlidXRlIiwiVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlIiwiSW50MTZCdWZmZXJBdHRyaWJ1dGUiLCJVaW50MTZCdWZmZXJBdHRyaWJ1dGUiLCJJbnQzMkJ1ZmZlckF0dHJpYnV0ZSIsIlVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSIsIkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUiLCJGbG9hdDY0QnVmZmVyQXR0cmlidXRlIiwiRGlyZWN0R2VvbWV0cnkiLCJjb21wdXRlR3JvdXBzIiwiZnJvbUdlb21ldHJ5IiwibW9ycGhUYXJnZXRzTGVuZ3RoIiwibW9ycGhUYXJnZXRzUG9zaXRpb24iLCJtb3JwaE5vcm1hbHNMZW5ndGgiLCJtb3JwaFRhcmdldHNOb3JtYWwiLCJ2ZXJ0ZXhVdnMiLCJoYXNGYWNlVmVydGV4VXYyIiwiaGFzU2tpbkluZGljZXMiLCJoYXNTa2luV2VpZ2h0cyIsImJ1ZmZlckdlb21ldHJ5SWQiLCJtb3JwaEF0dHJpYnV0ZXMiLCJkcmF3UmFuZ2UiLCJCdWZmZXJHZW9tZXRyeSIsImdldEluZGV4Iiwic2V0SW5kZXgiLCJhcnJheU1heCIsImFkZEF0dHJpYnV0ZSIsImdldEF0dHJpYnV0ZSIsInJlbW92ZUF0dHJpYnV0ZSIsImFkZEdyb3VwIiwiY2xlYXJHcm91cHMiLCJzZXREcmF3UmFuZ2UiLCJuZWVkc1VwZGF0ZSIsImlzUG9pbnRzIiwiaXNMaW5lIiwidXBkYXRlRnJvbU9iamVjdCIsIl9fZGlyZWN0R2VvbWV0cnkiLCJkaXJlY3QiLCJsaW5lRGlzdGFuY2UiLCJmcm9tRGlyZWN0R2VvbWV0cnkiLCJwQiIsInBDIiwicEEiLCJub3JtYWxpemVOb3JtYWxzIiwiYXR0cmlidXRlMSIsImF0dHJpYnV0ZTIiLCJhdHRyaWJ1dGVTaXplIiwiYXR0cmlidXRlQXJyYXkyIiwiYXR0cmlidXRlQXJyYXkxIiwidG9Ob25JbmRleGVkIiwiYXJyYXkyIiwiZ2VvbWV0cnkyIiwibW9ycGhBdHRyaWJ1dGUiLCJ3aWR0aFNlZ21lbnRzIiwiaGVpZ2h0U2VnbWVudHMiLCJkZXB0aFNlZ21lbnRzIiwiQm94R2VvbWV0cnkiLCJidWlsZFBsYW5lIiwidWRpciIsInZkaXIiLCJncmlkWCIsImdyaWRZIiwiZ3JpZFkxIiwic2VnbWVudEhlaWdodCIsImhlaWdodEhhbGYiLCJncmlkWDEiLCJzZWdtZW50V2lkdGgiLCJ3aWR0aEhhbGYiLCJkZXB0aEhhbGYiLCJ2ZXJ0ZXhDb3VudGVyIiwibnVtYmVyT2ZWZXJ0aWNlcyIsImdyb3VwQ291bnQiLCJncm91cFN0YXJ0IiwiQm94QnVmZmVyR2VvbWV0cnkiLCJQbGFuZUdlb21ldHJ5Iiwic2VnbWVudF9oZWlnaHQiLCJoZWlnaHRfaGFsZiIsInNlZ21lbnRfd2lkdGgiLCJ3aWR0aF9oYWxmIiwiUGxhbmVCdWZmZXJHZW9tZXRyeSIsIm1hdGVyaWFsSWQiLCJibGVuZGluZyIsIk5vcm1hbEJsZW5kaW5nIiwic2lkZSIsIkZyb250U2lkZSIsImZsYXRTaGFkaW5nIiwiTm9Db2xvcnMiLCJ0cmFuc3BhcmVudCIsImJsZW5kU3JjIiwiU3JjQWxwaGFGYWN0b3IiLCJibGVuZERzdCIsIk9uZU1pbnVzU3JjQWxwaGFGYWN0b3IiLCJibGVuZEVxdWF0aW9uIiwiQWRkRXF1YXRpb24iLCJibGVuZFNyY0FscGhhIiwiYmxlbmREc3RBbHBoYSIsImJsZW5kRXF1YXRpb25BbHBoYSIsImRlcHRoRnVuYyIsIkxlc3NFcXVhbERlcHRoIiwiZGVwdGhUZXN0IiwiZGVwdGhXcml0ZSIsImNsaXBwaW5nUGxhbmVzIiwiY2xpcEludGVyc2VjdGlvbiIsImNsaXBTaGFkb3dzIiwic2hhZG93U2lkZSIsImNvbG9yV3JpdGUiLCJwb2x5Z29uT2Zmc2V0IiwicG9seWdvbk9mZnNldEZhY3RvciIsInBvbHlnb25PZmZzZXRVbml0cyIsImRpdGhlcmluZyIsImFscGhhVGVzdCIsInByZW11bHRpcGxpZWRBbHBoYSIsIm92ZXJkcmF3IiwiTWF0ZXJpYWwiLCJpc01hdGVyaWFsIiwib25CZWZvcmVDb21waWxlIiwic2V0VmFsdWVzIiwibmV3VmFsdWUiLCJGbGF0U2hhZGluZyIsImN1cnJlbnRWYWx1ZSIsImlzUm9vdCIsImVtaXNzaXZlSW50ZW5zaXR5Iiwic2l6ZUF0dGVudWF0aW9uIiwibGluZXdpZHRoIiwiZ2FwU2l6ZSIsIndpcmVmcmFtZSIsIndpcmVmcmFtZUxpbmV3aWR0aCIsIndpcmVmcmFtZUxpbmVjYXAiLCJ3aXJlZnJhbWVMaW5lam9pbiIsInNraW5uaW5nIiwiZHN0UGxhbmVzIiwic3JjUGxhbmVzIiwiY29tYmluZSIsIk11bHRpcGx5T3BlcmF0aW9uIiwiTWVzaEJhc2ljTWF0ZXJpYWwiLCJpc01lc2hCYXNpY01hdGVyaWFsIiwiZGVmaW5lcyIsImNsaXBwaW5nIiwiZGVyaXZhdGl2ZXMiLCJmcmFnRGVwdGgiLCJkcmF3QnVmZmVycyIsInNoYWRlclRleHR1cmVMT0QiLCJkZWZhdWx0QXR0cmlidXRlVmFsdWVzIiwiaW5kZXgwQXR0cmlidXRlTmFtZSIsInVuaWZvcm1zTmVlZFVwZGF0ZSIsIlNoYWRlck1hdGVyaWFsIiwiaXNTaGFkZXJNYXRlcmlhbCIsIm9yaWdpbiIsIlJheSIsInJheSIsImF0IiwicmVjYXN0IiwiY2xvc2VzdFBvaW50VG9Qb2ludCIsImRpcmVjdGlvbkRpc3RhbmNlIiwiZGlzdGFuY2VTcVRvUG9pbnQiLCJkaXN0YW5jZVNxVG9TZWdtZW50Iiwib3B0aW9uYWxQb2ludE9uUmF5Iiwib3B0aW9uYWxQb2ludE9uU2VnbWVudCIsInNlZ0NlbnRlciIsInNlZ0RpciIsImRpZmYiLCJhMDEiLCJzcXJEaXN0IiwiZXh0RGV0IiwiczAiLCJiMCIsInNlZ0V4dGVudCIsImludkRldCIsImludGVyc2VjdFNwaGVyZSIsInRjYSIsInJhZGl1czIiLCJ0aGMiLCJ0MCIsInQxIiwiZGlzdGFuY2VUb1BsYW5lIiwiaW50ZXJzZWN0UGxhbmUiLCJkaXN0VG9Qb2ludCIsImludGVyc2VjdEJveCIsInRtYXgiLCJ0eW1pbiIsInR5bWF4IiwidHptaW4iLCJ0em1heCIsImludmRpcnkiLCJpbnZkaXJ6IiwiaW52ZGlyeCIsInRtaW4iLCJpbnRlcnNlY3RUcmlhbmdsZSIsImJhY2tmYWNlQ3VsbGluZyIsImVkZ2UxIiwiZWRnZTIiLCJEZE4iLCJEZFF4RTIiLCJEZEUxeFEiLCJRZE4iLCJMaW5lMyIsImRpc3RhbmNlU3EiLCJjbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyIiwiY2xhbXBUb0xpbmUiLCJzdGFydFAiLCJzdGFydEVuZCIsInN0YXJ0RW5kX3N0YXJ0UCIsInN0YXJ0RW5kMiIsIlRyaWFuZ2xlIiwiZ2V0Tm9ybWFsIiwidGFyZ2V0TGVuZ3RoU3EiLCJnZXRCYXJ5Y29vcmQiLCJkb3QwMCIsImRvdDExIiwiZG90MDEiLCJkZW5vbSIsImRvdDAyIiwiZG90MTIiLCJpbnZEZW5vbSIsInNldEZyb21Qb2ludHNBbmRJbmRpY2VzIiwiaTAiLCJpMSIsImkyIiwiZ2V0QXJlYSIsImdldE1pZHBvaW50IiwiZ2V0UGxhbmUiLCJwcm9qZWN0ZWRQb2ludCIsImVkZ2VMaXN0IiwibWluRGlzdGFuY2UiLCJkcmF3TW9kZSIsIlRyaWFuZ2xlc0RyYXdNb2RlIiwidXBkYXRlTW9ycGhUYXJnZXRzIiwiTWVzaCIsInNldERyYXdNb2RlIiwibW9ycGhUYXJnZXRJbmZsdWVuY2VzIiwibW9ycGhUYXJnZXREaWN0aW9uYXJ5IiwibWwiLCJ1djEiLCJ1djMiLCJiYXJ5Y29vcmQiLCJyYXljYXN0ZXIiLCJCYWNrU2lkZSIsIkRvdWJsZVNpZGUiLCJpbnRlcnNlY3Rpb25Qb2ludFdvcmxkIiwiY2hlY2tJbnRlcnNlY3Rpb24iLCJpbnRlcnNlY3Rpb25Qb2ludCIsImludGVyc2VjdGlvbiIsInV2QSIsInV2QiIsInV2QyIsInV2SW50ZXJzZWN0aW9uIiwiZmFjZUluZGV4IiwiaW50ZXJzZWN0cyIsImludmVyc2VNYXRyaXgiLCJjaGVja0J1ZmZlckdlb21ldHJ5SW50ZXJzZWN0aW9uIiwiZnZCIiwiZnZDIiwiaXNNdWx0aU1hdGVyaWFsIiwiZmFjZU1hdGVyaWFsIiwiZnZBIiwidGwiLCJtb3JwaEluZmx1ZW5jZXMiLCJpbmZsdWVuY2UiLCJ0ZW1wQSIsInRhcmdldHMiLCJ0ZW1wQiIsInRlbXBDIiwidXZzX2YiLCJyZW5kZXJlciIsInBsYW5lTWVzaCIsInJlbmRlckxpc3QiLCJzY2VuZSIsImZvcmNlQ2xlYXIiLCJiYWNrZ3JvdW5kIiwic2V0Q2xlYXIiLCJjbGVhckNvbG9yIiwiY2xlYXJBbHBoYSIsImF1dG9DbGVhciIsImF1dG9DbGVhckNvbG9yIiwiYXV0b0NsZWFyRGVwdGgiLCJhdXRvQ2xlYXJTdGVuY2lsIiwiaXNDdWJlVGV4dHVyZSIsImJveE1lc2giLCJwbGFuZUNhbWVyYSIsInJlbmRlckJ1ZmZlckRpcmVjdCIsImdldENsZWFyQ29sb3IiLCJzZXRDbGVhckNvbG9yIiwiZ2V0Q2xlYXJBbHBoYSIsInNldENsZWFyQWxwaGEiLCJyZW5kZXIiLCJkcmF3QXJyYXlzIiwiZHJhd0FycmF5c0luc3RhbmNlZEFOR0xFIiwibWF4SW5zdGFuY2VkQ291bnQiLCJzZXRNb2RlIiwicmVuZGVySW5zdGFuY2VzIiwibWF4QW5pc290cm9weSIsIk1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCIsImdldFNoYWRlclByZWNpc2lvbkZvcm1hdCIsIlZFUlRFWF9TSEFERVIiLCJISUdIX0ZMT0FUIiwiRlJBR01FTlRfU0hBREVSIiwiTUVESVVNX0ZMT0FUIiwiZ2V0TWF4UHJlY2lzaW9uIiwibWF4UHJlY2lzaW9uIiwibG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciIsIk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTIiwiTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTIiwiTUFYX1RFWFRVUkVfU0laRSIsIk1BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUiLCJNQVhfVkVSVEVYX0FUVFJJQlMiLCJNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUyIsIk1BWF9WQVJZSU5HX1ZFQ1RPUlMiLCJNQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTIiwibWF4VmVydGV4VGV4dHVyZXMiLCJ2ZXJ0ZXhUZXh0dXJlcyIsImZsb2F0RnJhZ21lbnRUZXh0dXJlcyIsImdldE1heEFuaXNvdHJvcHkiLCJtYXhUZXh0dXJlcyIsIm1heFRleHR1cmVTaXplIiwibWF4Q3ViZW1hcFNpemUiLCJtYXhBdHRyaWJ1dGVzIiwibWF4VmVydGV4VW5pZm9ybXMiLCJtYXhWYXJ5aW5ncyIsIm1heEZyYWdtZW50VW5pZm9ybXMiLCJmbG9hdFZlcnRleFRleHR1cmVzIiwiZ2xvYmFsU3RhdGUiLCJudW1HbG9iYWxQbGFuZXMiLCJsb2NhbENsaXBwaW5nRW5hYmxlZCIsInJlbmRlcmluZ1NoYWRvd3MiLCJ2aWV3Tm9ybWFsTWF0cml4IiwidW5pZm9ybSIsIm51bVBsYW5lcyIsIm51bUludGVyc2VjdGlvbiIsImluaXQiLCJlbmFibGVMb2NhbENsaXBwaW5nIiwicHJvamVjdFBsYW5lcyIsImJlZ2luU2hhZG93cyIsImVuZFNoYWRvd3MiLCJyZXNldEdsb2JhbFN0YXRlIiwic2V0U3RhdGUiLCJmcm9tQ2FjaGUiLCJsR2xvYmFsIiwibkdsb2JhbCIsImRzdEFycmF5IiwiY2xpcHBpbmdTdGF0ZSIsInNraXBUcmFuc2Zvcm0iLCJuUGxhbmVzIiwidmlld01hdHJpeCIsImZsYXRTaXplIiwiaTQiLCJnZXRFeHRlbnNpb24iLCJidWZmZXJnZW9tZXRyeSIsIm9uR2VvbWV0cnlEaXNwb3NlIiwid2lyZWZyYW1lQXR0cmlidXRlcyIsIm1lbW9yeSIsIl9idWZmZXJHZW9tZXRyeSIsIkVMRU1FTlRfQVJSQVlfQlVGRkVSIiwiZ2VvbWV0cnlBdHRyaWJ1dGVzIiwiQVJSQVlfQlVGRkVSIiwiZ2VvbWV0cnlJbmRleCIsImdldFdpcmVmcmFtZUF0dHJpYnV0ZSIsImRyYXdFbGVtZW50cyIsImRyYXdFbGVtZW50c0luc3RhbmNlZEFOR0xFIiwiZnJhbWUiLCJjYWxscyIsInRyaWFuZ2xlcyIsImxpbmVzIiwiaW5zdGFuY2VDb3VudCIsIlRSSUFOR0xFUyIsIlRSSUFOR0xFX1NUUklQIiwiVFJJQU5HTEVfRkFOIiwiTElORVMiLCJMSU5FX1NUUklQIiwiTElORV9MT09QIiwiUE9JTlRTIiwicHJvZ3JhbXMiLCJhdXRvUmVzZXQiLCJwcm9ncmFtIiwib2JqZWN0SW5mbHVlbmNlcyIsImluZmx1ZW5jZXNMaXN0IiwiaW5mbHVlbmNlcyIsImFic051bWVyaWNhbFNvcnQiLCJnZXRVbmlmb3JtcyIsInNldFZhbHVlIiwidXBkYXRlTGlzdCIsIkN1YmVSZWZsZWN0aW9uTWFwcGluZyIsIkN1YmVUZXh0dXJlIiwic2VxIiwibkJsb2NrcyIsImJsb2NrU2l6ZSIsImZpcnN0RWxlbSIsImFycmF5Q2FjaGVGMzIiLCJhcnJheUNhY2hlSTMyIiwiYWxsb2NUZXh0dXJlVW5pdCIsInVuaWZvcm0xZiIsImFkZHIiLCJ1bmlmb3JtMWkiLCJ1bmlmb3JtMmZ2IiwidW5pZm9ybTJmIiwidW5pZm9ybTNmIiwidW5pZm9ybTNmdiIsInVuaWZvcm00ZnYiLCJ1bmlmb3JtNGYiLCJ1bmlmb3JtTWF0cml4MmZ2IiwidW5pZm9ybU1hdHJpeDNmdiIsIm1hdDNhcnJheSIsInVuaWZvcm1NYXRyaXg0ZnYiLCJtYXQ0YXJyYXkiLCJ1bml0Iiwic2V0VGV4dHVyZTJEIiwiZW1wdHlUZXh0dXJlIiwic2V0VGV4dHVyZUN1YmUiLCJlbXB0eUN1YmVUZXh0dXJlIiwidW5pZm9ybTJpdiIsInVuaWZvcm0zaXYiLCJ1bmlmb3JtNGl2IiwidW5pZm9ybTFmdiIsInVuaWZvcm0xaXYiLCJmbGF0dGVuIiwidW5pdHMiLCJhbGxvY1RleFVuaXRzIiwiYWN0aXZlSW5mbyIsImdldFNpbmd1bGFyU2V0dGVyIiwiZ2V0UHVyZUFycmF5U2V0dGVyIiwiVW5pZm9ybUNvbnRhaW5lciIsIlN0cnVjdHVyZWRVbmlmb3JtIiwiY29udGFpbmVyIiwidW5pZm9ybU9iamVjdCIsInBhdGhMZW5ndGgiLCJwYXRoIiwiUmVQYXRoUGFydCIsImxhc3RJbmRleCIsIm1hdGNoRW5kIiwiaWRJc0luZGV4Iiwic3Vic2NyaXB0IiwiYWRkVW5pZm9ybSIsImdldFByb2dyYW1QYXJhbWV0ZXIiLCJBQ1RJVkVfVU5JRk9STVMiLCJnZXRBY3RpdmVVbmlmb3JtIiwiZ2V0VW5pZm9ybUxvY2F0aW9uIiwicGFyc2VVbmlmb3JtIiwiV2ViR0xVbmlmb3JtcyIsInNldE9wdGlvbmFsIiwidXBsb2FkIiwic2VxV2l0aFZhbHVlIiwiam9pbiIsImNyZWF0ZVNoYWRlciIsInNoYWRlclNvdXJjZSIsInNoYWRlciIsImNvbXBpbGVTaGFkZXIiLCJnZXRTaGFkZXJQYXJhbWV0ZXIiLCJDT01QSUxFX1NUQVRVUyIsImdldFNoYWRlckluZm9Mb2ciLCJhZGRMaW5lTnVtYmVycyIsImZ1bmN0aW9uTmFtZSIsImdldEVuY29kaW5nQ29tcG9uZW50cyIsInRvbmVNYXBwaW5nIiwidG9uZU1hcHBpbmdOYW1lIiwicmVuZGVyZXJFeHRlbnNpb25zIiwiZW52TWFwQ3ViZVVWIiwiZmlsdGVyRW1wdHlMaW5lIiwiY2h1bmtzIiwiQUNUSVZFX0FUVFJJQlVURVMiLCJnZXRBY3RpdmVBdHRyaWIiLCJnZXRBdHRyaWJMb2NhdGlvbiIsInJlcGxhY2UiLCJudW1EaXJMaWdodHMiLCJudW1TcG90TGlnaHRzIiwibnVtUmVjdEFyZWFMaWdodHMiLCJudW1Qb2ludExpZ2h0cyIsIm51bUhlbWlMaWdodHMiLCJudW1DbGlwcGluZ1BsYW5lcyIsIm51bUNsaXBJbnRlcnNlY3Rpb24iLCJpbmNsdWRlIiwicGF0dGVybiIsInNuaXBwZXQiLCJ1bnJvbGwiLCJjb2RlIiwic2hhZG93TWFwVHlwZSIsIlBDRlNoYWRvd01hcCIsInNoYWRvd01hcFR5cGVEZWZpbmUiLCJQQ0ZTb2Z0U2hhZG93TWFwIiwiZW52TWFwVHlwZURlZmluZSIsImVudk1hcE1vZGVEZWZpbmUiLCJlbnZNYXBCbGVuZGluZ0RlZmluZSIsImdlbmVyYXRlRXh0ZW5zaW9ucyIsImdlbmVyYXRlRGVmaW5lcyIsImNyZWF0ZVByb2dyYW0iLCJwcmVmaXhGcmFnbWVudCIsImlzUmF3U2hhZGVyTWF0ZXJpYWwiLCJwcmVmaXhWZXJ0ZXgiLCJjdXN0b21EZWZpbmVzIiwiY3VzdG9tRXh0ZW5zaW9ucyIsInN1cHBvcnRzVmVydGV4VGV4dHVyZXMiLCJnYW1tYUZhY3RvckRlZmluZSIsIm1heEJvbmVzIiwidXNlRm9nIiwiZm9nRXhwIiwidXNlVmVydGV4VGV4dHVyZSIsImRvdWJsZVNpZGVkIiwiZmxpcFNpZGVkIiwic2hhZG93TWFwRW5hYmxlZCIsInBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzIiwiTm9Ub25lTWFwcGluZyIsImdldFRvbmVNYXBwaW5nRnVuY3Rpb24iLCJvdXRwdXRFbmNvZGluZyIsIm1hcEVuY29kaW5nIiwiZW52TWFwRW5jb2RpbmciLCJlbWlzc2l2ZU1hcEVuY29kaW5nIiwiZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uIiwiZ2V0VGV4ZWxFbmNvZGluZ0Z1bmN0aW9uIiwiZGVwdGhQYWNraW5nIiwicGFyc2VJbmNsdWRlcyIsInJlcGxhY2VMaWdodE51bXMiLCJyZXBsYWNlQ2xpcHBpbmdQbGFuZU51bXMiLCJ1bnJvbGxMb29wcyIsIldlYkdMU2hhZGVyIiwidmVydGV4R2xzbCIsImZyYWdtZW50R2xzbCIsImF0dGFjaFNoYWRlciIsImdsVmVydGV4U2hhZGVyIiwiZ2xGcmFnbWVudFNoYWRlciIsImJpbmRBdHRyaWJMb2NhdGlvbiIsImxpbmtQcm9ncmFtIiwiZ2V0UHJvZ3JhbUluZm9Mb2ciLCJ0cmltIiwiTElOS19TVEFUVVMiLCJydW5uYWJsZSIsImdldEVycm9yIiwiVkFMSURBVEVfU1RBVFVTIiwicHJvZ3JhbUxvZyIsInZlcnRleExvZyIsImZyYWdtZW50TG9nIiwiaGF2ZURpYWdub3N0aWNzIiwiZGlhZ25vc3RpY3MiLCJwcmVmaXgiLCJkZWxldGVTaGFkZXIiLCJjYWNoZWRVbmlmb3JtcyIsImdldEF0dHJpYnV0ZXMiLCJjYWNoZWRBdHRyaWJ1dGVzIiwiZmV0Y2hBdHRyaWJ1dGVMb2NhdGlvbnMiLCJkZXN0cm95IiwiZGVsZXRlUHJvZ3JhbSIsInByb2dyYW1JZENvdW50IiwidXNlZFRpbWVzIiwiY2FwYWJpbGl0aWVzIiwiTWVzaERlcHRoTWF0ZXJpYWwiLCJNZXNoRGlzdGFuY2VNYXRlcmlhbCIsIk1lc2hOb3JtYWxNYXRlcmlhbCIsIk1lc2hMYW1iZXJ0TWF0ZXJpYWwiLCJNZXNoUGhvbmdNYXRlcmlhbCIsIk1lc2hUb29uTWF0ZXJpYWwiLCJNZXNoU3RhbmRhcmRNYXRlcmlhbCIsIk1lc2hQaHlzaWNhbE1hdGVyaWFsIiwiTGluZUJhc2ljTWF0ZXJpYWwiLCJMaW5lRGFzaGVkTWF0ZXJpYWwiLCJQb2ludHNNYXRlcmlhbCIsIlNoYWRvd01hdGVyaWFsIiwic2tlbGV0b24iLCJib25lcyIsIm5WZXJ0ZXhVbmlmb3JtcyIsIm5WZXJ0ZXhNYXRyaWNlcyIsImdhbW1hT3ZlcnJpZGVMaW5lYXIiLCJHYW1tYUVuY29kaW5nIiwiZ2V0UGFyYW1ldGVycyIsInNoYWRvd3MiLCJuQ2xpcFBsYW5lcyIsIm5DbGlwSW50ZXJzZWN0aW9uIiwic2hhZGVySURzIiwiaXNTa2lubmVkTWVzaCIsImFsbG9jYXRlQm9uZXMiLCJnZXRSZW5kZXJUYXJnZXQiLCJzaGFkZXJJRCIsImdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAiLCJjdXJyZW50UmVuZGVyVGFyZ2V0IiwiZ2FtbWFPdXRwdXQiLCJnYW1tYUlucHV0IiwiZW52TWFwTW9kZSIsIkN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nIiwiQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmciLCJpc0ZvZ0V4cDIiLCJtYXhNb3JwaFRhcmdldHMiLCJtYXhNb3JwaE5vcm1hbHMiLCJkaXJlY3Rpb25hbCIsInNwb3QiLCJyZWN0QXJlYSIsImhlbWkiLCJzaGFkb3dNYXAiLCJnZXRQcm9ncmFtQ29kZSIsInBhcmFtZXRlck5hbWVzIiwiYWNxdWlyZVByb2dyYW0iLCJwbCIsInByb2dyYW1JbmZvIiwicmVsZWFzZVByb2dyYW0iLCJyZW5kZXJJdGVtc0luZGV4Iiwib3BhcXVlIiwicmVuZGVySXRlbXMiLCJyZW5kZXJJdGVtIiwicGFpbnRlclNvcnRTdGFibGUiLCJyZXZlcnNlUGFpbnRlclNvcnRTdGFibGUiLCJsaXN0cyIsImxpc3QiLCJsaWdodCIsImhhbGZXaWR0aCIsImhhbGZIZWlnaHQiLCJhbWJpZW50IiwiaW50ZW5zaXR5IiwiaXNBbWJpZW50TGlnaHQiLCJpc0RpcmVjdGlvbmFsTGlnaHQiLCJ2ZWN0b3IzIiwiYmlhcyIsIm1hcFNpemUiLCJkaXJlY3Rpb25hbExlbmd0aCIsImlzU3BvdExpZ2h0IiwicGVudW1icmEiLCJzcG90TGVuZ3RoIiwiaXNSZWN0QXJlYUxpZ2h0IiwibWF0cml4NDIiLCJyZWN0QXJlYUxlbmd0aCIsImlzUG9pbnRMaWdodCIsInBvaW50TGVuZ3RoIiwiaXNIZW1pc3BoZXJlTGlnaHQiLCJoZW1pTGVuZ3RoIiwic2V0dXAiLCJsaWdodHNBcnJheSIsInNoYWRvd3NBcnJheSIsInNwcml0ZXNBcnJheSIsInNoYWRvd0xpZ2h0Iiwic2V0dXBMaWdodHMiLCJwdXNoTGlnaHQiLCJwdXNoU2hhZG93IiwicHVzaFNwcml0ZSIsInJlbmRlclN0YXRlcyIsInJlbmRlclN0YXRlIiwiQmFzaWNEZXB0aFBhY2tpbmciLCJpc01lc2hEZXB0aE1hdGVyaWFsIiwiaXNNZXNoRGlzdGFuY2VNYXRlcmlhbCIsIl9yZW5kZXJlciIsIl9vYmplY3RzIiwiX3Byb2pTY3JlZW5NYXRyaXgiLCJfc2hhZG93TWFwU2l6ZSIsIl9tYXhTaGFkb3dNYXBTaXplIiwiX2xvb2tUYXJnZXQiLCJfbGlnaHRQb3NpdGlvbldvcmxkIiwiX01vcnBoaW5nRmxhZyIsIl9Ta2lubmluZ0ZsYWciLCJfTnVtYmVyT2ZNYXRlcmlhbFZhcmlhbnRzIiwiX2RlcHRoTWF0ZXJpYWxzIiwiX2Rpc3RhbmNlTWF0ZXJpYWxzIiwiX21hdGVyaWFsQ2FjaGUiLCJSR0JBRGVwdGhQYWNraW5nIiwidXNlTW9ycGhpbmciLCJ1c2VTa2lubmluZyIsImRlcHRoTWF0ZXJpYWwiLCJkaXN0YW5jZU1hdGVyaWFsIiwiYXV0b1VwZGF0ZSIsIl9zdGF0ZSIsIl9nbCIsIkJMRU5EIiwic2V0VGVzdCIsInNldFNjaXNzb3JUZXN0IiwiY3ViZTJEVmlld1BvcnRzIiwidnBXaWR0aCIsInZwSGVpZ2h0IiwicGFycyIsInNoYWRvd0NhbWVyYSIsImlzU3BvdExpZ2h0U2hhZG93IiwiZmFjZUNvdW50Iiwic2hhZG93TWF0cml4Iiwic2V0UmVuZGVyVGFyZ2V0IiwiY3ViZURpcmVjdGlvbnMiLCJjdWJlVXBzIiwidnBEaW1lbnNpb25zIiwiX2ZydXN0dW0iLCJyZW5kZXJPYmplY3QiLCJsaWdodFBvc2l0aW9uV29ybGQiLCJjdXN0b21EZXB0aE1hdGVyaWFsIiwibWF0ZXJpYWxWYXJpYW50cyIsImN1c3RvbU1hdGVyaWFsIiwiY3VzdG9tRGlzdGFuY2VNYXRlcmlhbCIsInZhcmlhbnRJbmRleCIsImtleUIiLCJrZXlBIiwibWF0ZXJpYWxzRm9yVmFyaWFudCIsImNhY2hlZE1hdGVyaWFsIiwiZ3JvdXBNYXRlcmlhbCIsImdldERlcHRoTWF0ZXJpYWwiLCJDYW52YXNUZXh0dXJlIiwiZWxlbWVudEJ1ZmZlciIsInZlcnRleEJ1ZmZlciIsInV2T2Zmc2V0IiwidXZTY2FsZSIsImZvZ1R5cGUiLCJmb2dEZXB0aCIsImZpbGxTdHlsZSIsImZpbGxSZWN0Iiwic3ByaXRlcyIsInVzZVByb2dyYW0iLCJpbml0QXR0cmlidXRlcyIsImVuYWJsZUF0dHJpYnV0ZSIsImRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzIiwiQ1VMTF9GQUNFIiwidmVydGV4QXR0cmliUG9pbnRlciIsImFjdGl2ZVRleHR1cmUiLCJURVhUVVJFMCIsImlzRm9nIiwib2xkRm9nVHlwZSIsInNjZW5lRm9nVHlwZSIsImRlbnNpdHkiLCJzcHJpdGVQb3NpdGlvbiIsInNwcml0ZVJvdGF0aW9uIiwic3ByaXRlU2NhbGUiLCJzZXRCbGVuZGluZyIsInNldE1hc2siLCJ1dGlscyIsImNvbG9yTWFzayIsImN1cnJlbnRDb2xvck1hc2siLCJsb2NrZWQiLCJzZXRMb2NrZWQiLCJsb2NrIiwiY3VycmVudENvbG9yQ2xlYXIiLCJERVBUSF9URVNUIiwiZGVwdGhNYXNrIiwiY3VycmVudERlcHRoTWFzayIsInNldEZ1bmMiLCJjdXJyZW50RGVwdGhGdW5jIiwiTkVWRVIiLCJBTFdBWVMiLCJMRVNTIiwiTEVRVUFMIiwiRVFVQUwiLCJHRVFVQUwiLCJHUkVBVEVSIiwiTk9URVFVQUwiLCJjdXJyZW50RGVwdGhDbGVhciIsImNsZWFyRGVwdGgiLCJzdGVuY2lsVGVzdCIsIlNURU5DSUxfVEVTVCIsInN0ZW5jaWxNYXNrIiwiY3VycmVudFN0ZW5jaWxNYXNrIiwic3RlbmNpbEZ1bmMiLCJzdGVuY2lsUmVmIiwiY3VycmVudFN0ZW5jaWxGdW5jIiwiY3VycmVudFN0ZW5jaWxSZWYiLCJjdXJyZW50U3RlbmNpbEZ1bmNNYXNrIiwic2V0T3AiLCJzdGVuY2lsRmFpbCIsInN0ZW5jaWxaRmFpbCIsInN0ZW5jaWxaUGFzcyIsImN1cnJlbnRTdGVuY2lsRmFpbCIsImN1cnJlbnRTdGVuY2lsWkZhaWwiLCJjdXJyZW50U3RlbmNpbFpQYXNzIiwic3RlbmNpbE9wIiwic3RlbmNpbCIsImN1cnJlbnRTdGVuY2lsQ2xlYXIiLCJjbGVhclN0ZW5jaWwiLCJtYXhWZXJ0ZXhBdHRyaWJ1dGVzIiwiTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMiLCJWRVJTSU9OIiwiZ2xWZXJzaW9uIiwibGluZVdpZHRoQXZhaWxhYmxlIiwiY3JlYXRlVGV4dHVyZSIsImJpbmRUZXh0dXJlIiwidGV4UGFyYW1ldGVyaSIsIlRFWFRVUkVfTUlOX0ZJTFRFUiIsIk5FQVJFU1QiLCJURVhUVVJFX01BR19GSUxURVIiLCJ0ZXhJbWFnZTJEIiwiUkdCQSIsImVtcHR5VGV4dHVyZXMiLCJURVhUVVJFXzJEIiwiVEVYVFVSRV9DVUJFX01BUCIsIlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCIsImNvbG9yQnVmZmVyIiwic2V0RmxpcFNpZGVkIiwic2V0Q3VsbEZhY2UiLCJDdWxsRmFjZUJhY2siLCJuZXdBdHRyaWJ1dGVzIiwiZW5hYmxlZEF0dHJpYnV0ZXMiLCJlbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSIsImF0dHJpYnV0ZURpdmlzb3JzIiwidmVydGV4QXR0cmliRGl2aXNvckFOR0xFIiwibWVzaFBlckF0dHJpYnV0ZSIsImRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSIsImNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyIsIkNPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTIiwiZm9ybWF0cyIsImN1cnJlbnRQcm9ncmFtIiwiTm9CbGVuZGluZyIsIkN1c3RvbUJsZW5kaW5nIiwiY3VycmVudEJsZW5kaW5nIiwiY3VycmVudFByZW11bHRpcGxlZEFscGhhIiwiYmxlbmRFcXVhdGlvblNlcGFyYXRlIiwiRlVOQ19BREQiLCJibGVuZEZ1bmNTZXBhcmF0ZSIsIk9ORSIsImJsZW5kRnVuYyIsIlNSQ19BTFBIQSIsIlpFUk8iLCJPTkVfTUlOVVNfU1JDX0NPTE9SIiwiT05FX01JTlVTX1NSQ19BTFBIQSIsIlNSQ19DT0xPUiIsImN1cnJlbnRCbGVuZEVxdWF0aW9uIiwiY3VycmVudEJsZW5kU3JjIiwiY3VycmVudEJsZW5kRHN0IiwiY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSIsImN1cnJlbnRCbGVuZFNyY0FscGhhIiwiY3VycmVudEJsZW5kRHN0QWxwaGEiLCJjb252ZXJ0IiwiZnJvbnRGYWNlQ1ciLCJzZXRQb2x5Z29uT2Zmc2V0IiwiY3VycmVudEZsaXBTaWRlZCIsImZyb250RmFjZSIsIkNXIiwiQ0NXIiwiY3VsbEZhY2UiLCJDdWxsRmFjZU5vbmUiLCJjdXJyZW50Q3VsbEZhY2UiLCJCQUNLIiwiQ3VsbEZhY2VGcm9udCIsIkZST05UIiwiRlJPTlRfQU5EX0JBQ0siLCJjdXJyZW50TGluZVdpZHRoIiwibGluZVdpZHRoIiwiZmFjdG9yIiwiUE9MWUdPTl9PRkZTRVRfRklMTCIsImN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yIiwiY3VycmVudFBvbHlnb25PZmZzZXRVbml0cyIsIlNDSVNTT1JfVEVTVCIsIndlYmdsU2xvdCIsImN1cnJlbnRUZXh0dXJlU2xvdCIsIndlYmdsVHlwZSIsIndlYmdsVGV4dHVyZSIsImN1cnJlbnRCb3VuZFRleHR1cmVzIiwiYm91bmRUZXh0dXJlIiwiY29tcHJlc3NlZFRleEltYWdlMkQiLCJjdXJyZW50U2Npc3NvciIsImN1cnJlbnRWaWV3cG9ydCIsImVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IiLCJnZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMiLCJzZXRNYXRlcmlhbCIsInNldExpbmVXaWR0aCIsIm1heFNpemUiLCJfY2FudmFzIiwiZ2VuZXJhdGVNaXBtYXAiLCJ0ZXh0dXJlUHJvcGVydGllcyIsIl9fbWF4TWlwTGV2ZWwiLCJMT0cyRSIsIk5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyIiwiTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciIsIkxJTkVBUiIsIm9uVGV4dHVyZURpc3Bvc2UiLCJkZWFsbG9jYXRlVGV4dHVyZSIsImlzVmlkZW9UZXh0dXJlIiwicmVuZGVyVGFyZ2V0Iiwib25SZW5kZXJUYXJnZXREaXNwb3NlIiwiZGVhbGxvY2F0ZVJlbmRlclRhcmdldCIsIl9faW1hZ2VfX3dlYmdsVGV4dHVyZUN1YmUiLCJkZWxldGVUZXh0dXJlIiwiX193ZWJnbEluaXQiLCJfX3dlYmdsVGV4dHVyZSIsImRlbGV0ZUZyYW1lYnVmZmVyIiwicmVuZGVyVGFyZ2V0UHJvcGVydGllcyIsIl9fd2ViZ2xGcmFtZWJ1ZmZlciIsIl9fd2ViZ2xEZXB0aGJ1ZmZlciIsImRlbGV0ZVJlbmRlcmJ1ZmZlciIsInNsb3QiLCJ1cGRhdGVWaWRlb1RleHR1cmUiLCJfX3ZlcnNpb24iLCJ1cGxvYWRUZXh0dXJlIiwicGl4ZWxTdG9yZWkiLCJVTlBBQ0tfRkxJUF9ZX1dFQkdMIiwiaXNDb21wcmVzc2VkVGV4dHVyZSIsImlzQ29tcHJlc3NlZCIsImN1YmVJbWFnZSIsImNsYW1wVG9NYXhTaXplIiwiaXNQb3dlck9mVHdvSW1hZ2UiLCJnbEZvcm1hdCIsImdsVHlwZSIsInNldFRleHR1cmVQYXJhbWV0ZXJzIiwibWlwbWFwIiwiUkdCRm9ybWF0IiwidGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzIiwidGV4dHVyZVR5cGUiLCJURVhUVVJFX1dSQVBfUyIsIlRFWFRVUkVfV1JBUF9UIiwiQ0xBTVBfVE9fRURHRSIsImZpbHRlckZhbGxiYWNrIiwiRmxvYXRUeXBlIiwiSGFsZkZsb2F0VHlwZSIsIl9fY3VycmVudEFuaXNvdHJvcHkiLCJ0ZXhQYXJhbWV0ZXJmIiwiVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQiLCJVTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wiLCJVTlBBQ0tfQUxJR05NRU5UIiwidGV4dHVyZU5lZWRzUG93ZXJPZlR3byIsIm1ha2VQb3dlck9mVHdvIiwiaXNEZXB0aFRleHR1cmUiLCJERVBUSF9DT01QT05FTlQiLCJfaXNXZWJHTDIiLCJpbnRlcm5hbEZvcm1hdCIsIkRFUFRIX0NPTVBPTkVOVDMyRiIsIkRFUFRIX0NPTVBPTkVOVDE2IiwiRGVwdGhGb3JtYXQiLCJVbnNpZ25lZFNob3J0VHlwZSIsIlVuc2lnbmVkSW50VHlwZSIsIkRlcHRoU3RlbmNpbEZvcm1hdCIsIkRFUFRIX1NURU5DSUwiLCJVbnNpZ25lZEludDI0OFR5cGUiLCJmcmFtZWJ1ZmZlciIsImF0dGFjaG1lbnQiLCJ0ZXh0dXJlVGFyZ2V0IiwiYmluZEZyYW1lYnVmZmVyIiwiRlJBTUVCVUZGRVIiLCJmcmFtZWJ1ZmZlclRleHR1cmUyRCIsInJlbmRlcmJ1ZmZlciIsImJpbmRSZW5kZXJidWZmZXIiLCJSRU5ERVJCVUZGRVIiLCJyZW5kZXJidWZmZXJTdG9yYWdlIiwiZnJhbWVidWZmZXJSZW5kZXJidWZmZXIiLCJERVBUSF9BVFRBQ0hNRU5UIiwiREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UIiwiUkdCQTQiLCJpc0N1YmUiLCJ3ZWJnbERlcHRoVGV4dHVyZSIsInNldHVwRGVwdGhUZXh0dXJlIiwiY3JlYXRlUmVuZGVyYnVmZmVyIiwic2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlIiwiY3JlYXRlRnJhbWVidWZmZXIiLCJpc1RhcmdldFBvd2VyT2ZUd28iLCJzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSIsIkNPTE9SX0FUVEFDSE1FTlQwIiwic2V0dXBEZXB0aFJlbmRlcmJ1ZmZlciIsIl92aWRlb1RleHR1cmVzIiwic2V0VGV4dHVyZUN1YmVEeW5hbWljIiwic2V0dXBSZW5kZXJUYXJnZXQiLCJ1cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAiLCJSZXBlYXRXcmFwcGluZyIsIlJFUEVBVCIsIk1pcnJvcmVkUmVwZWF0V3JhcHBpbmciLCJNSVJST1JFRF9SRVBFQVQiLCJORUFSRVNUX01JUE1BUF9ORUFSRVNUIiwiTkVBUkVTVF9NSVBNQVBfTElORUFSIiwiTGluZWFyTWlwTWFwTmVhcmVzdEZpbHRlciIsIkxJTkVBUl9NSVBNQVBfTkVBUkVTVCIsIkxJTkVBUl9NSVBNQVBfTElORUFSIiwiVW5zaWduZWRTaG9ydDQ0NDRUeXBlIiwiVU5TSUdORURfU0hPUlRfNF80XzRfNCIsIlVuc2lnbmVkU2hvcnQ1NTUxVHlwZSIsIlVOU0lHTkVEX1NIT1JUXzVfNV81XzEiLCJVbnNpZ25lZFNob3J0NTY1VHlwZSIsIlVOU0lHTkVEX1NIT1JUXzVfNl81IiwiQnl0ZVR5cGUiLCJTaG9ydFR5cGUiLCJJbnRUeXBlIiwiSEFMRl9GTE9BVF9PRVMiLCJBbHBoYUZvcm1hdCIsIkFMUEhBIiwiUkdCIiwiTHVtaW5hbmNlRm9ybWF0IiwiTFVNSU5BTkNFIiwiTHVtaW5hbmNlQWxwaGFGb3JtYXQiLCJMVU1JTkFOQ0VfQUxQSEEiLCJTdWJ0cmFjdEVxdWF0aW9uIiwiRlVOQ19TVUJUUkFDVCIsIlJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uIiwiRlVOQ19SRVZFUlNFX1NVQlRSQUNUIiwiWmVyb0ZhY3RvciIsIk9uZUZhY3RvciIsIlNyY0NvbG9yRmFjdG9yIiwiT25lTWludXNTcmNDb2xvckZhY3RvciIsIkRzdEFscGhhRmFjdG9yIiwiRFNUX0FMUEhBIiwiT25lTWludXNEc3RBbHBoYUZhY3RvciIsIk9ORV9NSU5VU19EU1RfQUxQSEEiLCJEc3RDb2xvckZhY3RvciIsIkRTVF9DT0xPUiIsIk9uZU1pbnVzRHN0Q29sb3JGYWN0b3IiLCJPTkVfTUlOVVNfRFNUX0NPTE9SIiwiU3JjQWxwaGFTYXR1cmF0ZUZhY3RvciIsIlNSQ19BTFBIQV9TQVRVUkFURSIsIlJHQl9TM1RDX0RYVDFfRm9ybWF0IiwiUkdCQV9TM1RDX0RYVDFfRm9ybWF0IiwiUkdCQV9TM1RDX0RYVDNfRm9ybWF0IiwiUkdCQV9TM1RDX0RYVDVfRm9ybWF0IiwiQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVCIsIkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUIiwiQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQiLCJDT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVCIsIlJHQl9QVlJUQ180QlBQVjFfRm9ybWF0IiwiUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQiLCJSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQiLCJSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQiLCJDT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HIiwiQ09NUFJFU1NFRF9SR0JfUFZSVENfMkJQUFYxX0lNRyIsIkNPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HIiwiQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUciLCJSR0JfRVRDMV9Gb3JtYXQiLCJDT01QUkVTU0VEX1JHQl9FVEMxX1dFQkdMIiwiUkdCQV9BU1RDXzR4NF9Gb3JtYXQiLCJSR0JBX0FTVENfNXg0X0Zvcm1hdCIsIlJHQkFfQVNUQ181eDVfRm9ybWF0IiwiUkdCQV9BU1RDXzZ4NV9Gb3JtYXQiLCJSR0JBX0FTVENfNng2X0Zvcm1hdCIsIlJHQkFfQVNUQ184eDVfRm9ybWF0IiwiUkdCQV9BU1RDXzh4Nl9Gb3JtYXQiLCJSR0JBX0FTVENfOHg4X0Zvcm1hdCIsIlJHQkFfQVNUQ18xMHg1X0Zvcm1hdCIsIlJHQkFfQVNUQ18xMHg2X0Zvcm1hdCIsIlJHQkFfQVNUQ18xMHg4X0Zvcm1hdCIsIlJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQiLCJSR0JBX0FTVENfMTJ4MTBfRm9ybWF0IiwiUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdCIsIk1pbkVxdWF0aW9uIiwiTWF4RXF1YXRpb24iLCJNSU5fRVhUIiwiTUFYX0VYVCIsIlVOU0lHTkVEX0lOVF8yNF84X1dFQkdMIiwiZm92IiwiYXNwZWN0IiwiZm9jdXMiLCJmaWxtR2F1Z2UiLCJmaWxtT2Zmc2V0IiwiUGVyc3BlY3RpdmVDYW1lcmEiLCJpc1BlcnNwZWN0aXZlQ2FtZXJhIiwic2V0Rm9jYWxMZW5ndGgiLCJmb2NhbExlbmd0aCIsImdldEZpbG1IZWlnaHQiLCJhdGFuIiwidkV4dGVudFNsb3BlIiwiZ2V0Rm9jYWxMZW5ndGgiLCJ0YW4iLCJnZXRFZmZlY3RpdmVGT1YiLCJnZXRGaWxtV2lkdGgiLCJza2V3IiwiY2FtZXJhcyIsIkFycmF5Q2FtZXJhIiwiaXNBcnJheUNhbWVyYSIsImZyYW1lRGF0YSIsIlZSRnJhbWVEYXRhIiwib25WUkRpc3BsYXlQcmVzZW50Q2hhbmdlIiwiY2FtZXJhTCIsImJvdW5kcyIsImNhbWVyYVIiLCJjYW1lcmFWUiIsImRldmljZSIsImlzUHJlc2VudGluZyIsImN1cnJlbnRQaXhlbFJhdGlvIiwiZ2V0RXllUGFyYW1ldGVycyIsImV5ZVBhcmFtZXRlcnMiLCJyZW5kZXJXaWR0aCIsInJlbmRlckhlaWdodCIsImdldFBpeGVsUmF0aW8iLCJjdXJyZW50U2l6ZSIsInNldERyYXdpbmdCdWZmZXJTaXplIiwidXNlckhlaWdodCIsImdldERldmljZSIsInNldERldmljZSIsInNldFBvc2VUYXJnZXQiLCJwb3NlVGFyZ2V0IiwiZ2V0Q2FtZXJhIiwiZGVwdGhOZWFyIiwiZGVwdGhGYXIiLCJnZXRGcmFtZURhdGEiLCJzdGFnZVBhcmFtZXRlcnMiLCJzdGFuZGluZ01hdHJpeCIsInNpdHRpbmdUb1N0YW5kaW5nVHJhbnNmb3JtIiwicG9zZSIsInBvc2VPYmplY3QiLCJvcmllbnRhdGlvbiIsInRlbXBRdWF0ZXJuaW9uIiwidGVtcFBvc2l0aW9uIiwibGVmdFZpZXdNYXRyaXgiLCJyaWdodFZpZXdNYXRyaXgiLCJzdGFuZGluZ01hdHJpeEludmVyc2UiLCJsZWZ0UHJvamVjdGlvbk1hdHJpeCIsInJpZ2h0UHJvamVjdGlvbk1hdHJpeCIsImdldExheWVycyIsImxheWVyIiwibGVmdEJvdW5kcyIsInJpZ2h0Qm91bmRzIiwiZ2V0U3RhbmRpbmdNYXRyaXgiLCJzdWJtaXRGcmFtZSIsIlJFVklTSU9OIiwiX2NvbnRleHQiLCJfYWxwaGEiLCJfZGVwdGgiLCJfc3RlbmNpbCIsIl9hbnRpYWxpYXMiLCJhbnRpYWxpYXMiLCJfcHJlbXVsdGlwbGllZEFscGhhIiwiX3ByZXNlcnZlRHJhd2luZ0J1ZmZlciIsInByZXNlcnZlRHJhd2luZ0J1ZmZlciIsIl9wb3dlclByZWZlcmVuY2UiLCJwb3dlclByZWZlcmVuY2UiLCJkb21FbGVtZW50Iiwic29ydE9iamVjdHMiLCJMaW5lYXJUb25lTWFwcGluZyIsInRvbmVNYXBwaW5nRXhwb3N1cmUiLCJ0b25lTWFwcGluZ1doaXRlUG9pbnQiLCJfaXNDb250ZXh0TG9zdCIsIl9jdXJyZW50UmVuZGVyVGFyZ2V0IiwiX2N1cnJlbnRGcmFtZWJ1ZmZlciIsIl9jdXJyZW50TWF0ZXJpYWxJZCIsIl9jdXJyZW50R2VvbWV0cnlQcm9ncmFtIiwiX2N1cnJlbnRDYW1lcmEiLCJfY3VycmVudEFycmF5Q2FtZXJhIiwiX2N1cnJlbnRWaWV3cG9ydCIsIl9jdXJyZW50U2Npc3NvciIsIl9jdXJyZW50U2Npc3NvclRlc3QiLCJfdXNlZFRleHR1cmVVbml0cyIsIl93aWR0aCIsIl9oZWlnaHQiLCJfcGl4ZWxSYXRpbyIsIl92aWV3cG9ydCIsIl9zY2lzc29yIiwiX3NjaXNzb3JUZXN0IiwiX2NsaXBwaW5nIiwiX2NsaXBwaW5nRW5hYmxlZCIsIl9sb2NhbENsaXBwaW5nRW5hYmxlZCIsIl92ZWN0b3IzIiwib25Db250ZXh0TG9zdCIsIm9uQ29udGV4dFJlc3RvcmUiLCJjb250ZXh0QXR0cmlidXRlcyIsIm1lc3NhZ2UiLCJvYmplY3RzIiwicmVuZGVyTGlzdHMiLCJtb3JwaHRhcmdldHMiLCJidWZmZXJSZW5kZXJlciIsImluZGV4ZWRCdWZmZXJSZW5kZXJlciIsInByb2dyYW1DYWNoZSIsIl90aGlzIiwic3ByaXRlUmVuZGVyZXIiLCJpbml0R0xDb250ZXh0IiwidnIiLCJnZXRDb250ZXh0QXR0cmlidXRlcyIsImZvcmNlQ29udGV4dExvc3MiLCJsb3NlQ29udGV4dCIsImZvcmNlQ29udGV4dFJlc3RvcmUiLCJyZXN0b3JlQ29udGV4dCIsInNldFBpeGVsUmF0aW8iLCJ1cGRhdGVTdHlsZSIsInNldFZpZXdwb3J0IiwiZ2V0RHJhd2luZ0J1ZmZlclNpemUiLCJwaXhlbFJhdGlvIiwiZ2V0Q3VycmVudFZpZXdwb3J0Iiwic2V0U2Npc3NvciIsImJvb2xlYW4iLCJiaXRzIiwiQ09MT1JfQlVGRkVSX0JJVCIsIkRFUFRIX0JVRkZFUl9CSVQiLCJTVEVOQ0lMX0JVRkZFUl9CSVQiLCJjbGVhclRhcmdldCIsInN0b3BBbmltYXRpb24iLCJwcmV2ZW50RGVmYXVsdCIsIm9uTWF0ZXJpYWxEaXNwb3NlIiwiZGVhbGxvY2F0ZU1hdGVyaWFsIiwicmVsZWFzZU1hdGVyaWFsUHJvZ3JhbVJlZmVyZW5jZSIsInJlbmRlckJ1ZmZlckltbWVkaWF0ZSIsImhhc1Bvc2l0aW9ucyIsImhhc05vcm1hbHMiLCJoYXNVdnMiLCJoYXNDb2xvcnMiLCJwb3NpdGlvbkFycmF5IiwicHJvZ3JhbUF0dHJpYnV0ZXMiLCJpc01lc2hQaG9uZ01hdGVyaWFsIiwiaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCIsImlzTWVzaE5vcm1hbE1hdGVyaWFsIiwibm9ybWFsQXJyYXkiLCJueCIsIm55IiwibnoiLCJ1dkFycmF5IiwiY29sb3JBcnJheSIsInNldFByb2dyYW0iLCJnZW9tZXRyeVByb2dyYW0iLCJ1cGRhdGVCdWZmZXJzIiwicmFuZ2VGYWN0b3IiLCJzZXR1cFZlcnRleEF0dHJpYnV0ZXMiLCJkYXRhQ291bnQiLCJyYW5nZVN0YXJ0IiwicmFuZ2VDb3VudCIsImRyYXdFbmQiLCJkcmF3U3RhcnQiLCJkcmF3Q291bnQiLCJnZXRUYXJnZXRQaXhlbFJhdGlvIiwiaXNMaW5lU2VnbWVudHMiLCJpc0xpbmVMb29wIiwiaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSIsInByb2dyYW1BdHRyaWJ1dGUiLCJnZW9tZXRyeUF0dHJpYnV0ZSIsInN0cmlkZSIsImlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIiLCJpc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSIsIm1hdGVyaWFsRGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyIsInZlcnRleEF0dHJpYjJmdiIsInZlcnRleEF0dHJpYjNmdiIsInZlcnRleEF0dHJpYjRmdiIsInZlcnRleEF0dHJpYjFmdiIsImNvbXBpbGUiLCJjdXJyZW50UmVuZGVyU3RhdGUiLCJpc0xpZ2h0IiwiaW5pdE1hdGVyaWFsIiwiaXNBbmltYXRpbmciLCJyZXF1ZXN0QW5pbWF0aW9uTG9vcEZyYW1lIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiYW5pbWF0aW9uTG9vcCIsInRpbWUiLCJvbkFuaW1hdGlvbkZyYW1lIiwiYW5pbWF0ZSIsInN0YXJ0QW5pbWF0aW9uIiwiY3VycmVudFJlbmRlckxpc3QiLCJwcm9qZWN0T2JqZWN0Iiwib3ZlcnJpZGVNYXRlcmlhbCIsIm9wYXF1ZU9iamVjdHMiLCJyZW5kZXJPYmplY3RzIiwidHJhbnNwYXJlbnRPYmplY3RzIiwiaXNTcHJpdGUiLCJpc0ltbWVkaWF0ZVJlbmRlck9iamVjdCIsImNhbWVyYTIiLCJyZW5kZXJPYmplY3RJbW1lZGlhdGUiLCJtYXRlcmlhbFByb3BlcnRpZXMiLCJsaWdodHNIYXNoIiwicHJvZ3JhbUNoYW5nZSIsIm51bVN1cHBvcnRlZE1vcnBoVGFyZ2V0cyIsIm51bVN1cHBvcnRlZE1vcnBoTm9ybWFscyIsInVuaWZvcm1zTGlzdCIsInByb2dVbmlmb3JtcyIsInVzZUNhY2hlIiwicF91bmlmb3JtcyIsIm1fdW5pZm9ybXMiLCJyZWZyZXNoUHJvZ3JhbSIsInJlZnJlc2hNYXRlcmlhbCIsInJlZnJlc2hMaWdodHMiLCJjYW1lcmFQb3NpdGlvbiIsInVDYW1Qb3MiLCJpc01lc2hMYW1iZXJ0TWF0ZXJpYWwiLCJib25lVGV4dHVyZSIsImJvbmVNYXRyaWNlcyIsImJvbmVUZXh0dXJlU2l6ZSIsIm1hcmtVbmlmb3Jtc0xpZ2h0c05lZWRzVXBkYXRlIiwicmVmcmVzaFVuaWZvcm1zRm9nIiwicmVmcmVzaFVuaWZvcm1zQ29tbW9uIiwicmVmcmVzaFVuaWZvcm1zTGFtYmVydCIsImlzTWVzaFRvb25NYXRlcmlhbCIsInJlZnJlc2hVbmlmb3Jtc1Rvb24iLCJyZWZyZXNoVW5pZm9ybXNQaG9uZyIsImlzTWVzaFBoeXNpY2FsTWF0ZXJpYWwiLCJyZWZyZXNoVW5pZm9ybXNQaHlzaWNhbCIsInJlZnJlc2hVbmlmb3Jtc1N0YW5kYXJkIiwicmVmcmVzaFVuaWZvcm1zRGVwdGgiLCJyZWZyZXNoVW5pZm9ybXNEaXN0YW5jZSIsInJlZnJlc2hVbmlmb3Jtc05vcm1hbCIsImlzTGluZUJhc2ljTWF0ZXJpYWwiLCJyZWZyZXNoVW5pZm9ybXNMaW5lIiwiaXNMaW5lRGFzaGVkTWF0ZXJpYWwiLCJyZWZyZXNoVW5pZm9ybXNEYXNoIiwiaXNQb2ludHNNYXRlcmlhbCIsInJlZnJlc2hVbmlmb3Jtc1BvaW50cyIsImlzU2hhZG93TWF0ZXJpYWwiLCJsdGNfMSIsIkxUQ18xIiwibHRjXzIiLCJMVENfMiIsInV2U2NhbGVNYXAiLCJ0ZXh0dXJlVW5pdCIsIndhcm5lZCIsInNldFRleHR1cmUiLCJyZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzIiwicmVzdG9yZSIsInRleHR1cmVGb3JtYXQiLCJJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVCIsIklNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRSIsImNoZWNrRnJhbWVidWZmZXJTdGF0dXMiLCJGUkFNRUJVRkZFUl9DT01QTEVURSIsInJlYWRQaXhlbHMiLCJjb3B5RnJhbWVidWZmZXJUb1RleHR1cmUiLCJsZXZlbCIsImNvcHlUZXhJbWFnZTJEIiwiY29weVRleHR1cmVUb1RleHR1cmUiLCJzcmNUZXh0dXJlIiwiZHN0VGV4dHVyZSIsInRleFN1YkltYWdlMkQiLCJwaXhlbHMiLCJGb2dFeHAyIiwiRm9nIiwiU2NlbmUiLCJTcHJpdGVNYXRlcmlhbCIsImlzU3ByaXRlTWF0ZXJpYWwiLCJTcHJpdGUiLCJ3b3JsZFBvc2l0aW9uIiwiaW50ZXJzZWN0UG9pbnQiLCJ3b3JsZFNjYWxlIiwiZ3Vlc3NTaXplU3EiLCJsZXZlbHMiLCJMT0QiLCJhZGRMZXZlbCIsImdldE9iamVjdEZvckRpc3RhbmNlIiwibWF0cml4UG9zaXRpb24iLCJib25lSW52ZXJzZXMiLCJjYWxjdWxhdGVJbnZlcnNlcyIsIlNrZWxldG9uIiwiYm9uZSIsImlzQm9uZSIsImlkZW50aXR5TWF0cml4Iiwib2Zmc2V0TWF0cml4IiwiZ2V0Qm9uZUJ5TmFtZSIsIkJvbmUiLCJiaW5kTW9kZSIsImJpbmRNYXRyaXgiLCJiaW5kTWF0cml4SW52ZXJzZSIsImluaXRCb25lcyIsImJpbmQiLCJub3JtYWxpemVTa2luV2VpZ2h0cyIsIlNraW5uZWRNZXNoIiwiZ2JvbmUiLCJyb3RxIiwic2NsIiwic3ciLCJza2luV2VpZ2h0IiwidmVjIiwibGluZWNhcCIsImxpbmVqb2luIiwiTGluZSIsImNvbXB1dGVMaW5lRGlzdGFuY2VzIiwicG9zaXRpb25BdHRyaWJ1dGUiLCJsaW5lUHJlY2lzaW9uIiwidlN0YXJ0IiwidkVuZCIsImludGVyUmF5IiwiaW50ZXJTZWdtZW50IiwiZGlzdFNxIiwicHJlY2lzaW9uU3EiLCJuYlZlcnRpY2VzIiwiTGluZVNlZ21lbnRzIiwiTGluZUxvb3AiLCJQb2ludHMiLCJwYXJhbXMiLCJ0aHJlc2hvbGQiLCJsb2NhbFRocmVzaG9sZCIsInJheVBvaW50RGlzdGFuY2VTcSIsImxvY2FsVGhyZXNob2xkU3EiLCJkaXN0YW5jZVRvUmF5IiwidGVzdFBvaW50IiwiR3JvdXAiLCJpc0dyb3VwIiwidmlkZW8iLCJWaWRlb1RleHR1cmUiLCJyZWFkeVN0YXRlIiwiSEFWRV9DVVJSRU5UX0RBVEEiLCJDb21wcmVzc2VkVGV4dHVyZSIsIkRlcHRoVGV4dHVyZSIsIm9sIiwiZWRnZXMiLCJlZGdlIiwiV2lyZWZyYW1lR2VvbWV0cnkiLCJmdW5jIiwic2xpY2VzIiwic3RhY2tzIiwiUGFyYW1ldHJpY0dlb21ldHJ5IiwicHYiLCJwdSIsInNsaWNlQ291bnQiLCJQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkiLCJkZXRhaWwiLCJQb2x5aGVkcm9uR2VvbWV0cnkiLCJzdWJkaXZpZGUiLCJhcHBwbHlSYWRpdXMiLCJnZW5lcmF0ZVVWcyIsInV2QnVmZmVyIiwiZ2V0VmVydGV4QnlJbmRleCIsInN1YmRpdmlkZUZhY2UiLCJjb2xzIiwicm93cyIsImFqIiwiYmoiLCJwdXNoVmVydGV4IiwiYXppbXV0aCIsImluY2xpbmF0aW9uIiwiY29ycmVjdFVWcyIsImNvcnJlY3RTZWFtIiwiY2VudHJvaWQiLCJjb3JyZWN0VVYiLCJhemkiLCJQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkiLCJUZXRyYWhlZHJvbkdlb21ldHJ5IiwiVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSIsIk9jdGFoZWRyb25HZW9tZXRyeSIsIk9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSIsIkljb3NhaGVkcm9uR2VvbWV0cnkiLCJJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IiwiRG9kZWNhaGVkcm9uR2VvbWV0cnkiLCJEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSIsInR1YnVsYXJTZWdtZW50cyIsInJhZGlhbFNlZ21lbnRzIiwiY2xvc2VkIiwidGFwZXIiLCJ0YW5nZW50cyIsImJ1ZmZlckdlb21ldHJ5IiwiYmlub3JtYWxzIiwiVHViZUdlb21ldHJ5IiwiY29tcHV0ZUZyZW5ldEZyYW1lcyIsImZyYW1lcyIsImdlbmVyYXRlQnVmZmVyRGF0YSIsImdlbmVyYXRlU2VnbWVudCIsImdlbmVyYXRlSW5kaWNlcyIsImdldFBvaW50QXQiLCJOIiwiVHViZUJ1ZmZlckdlb21ldHJ5IiwidHViZSIsImhlaWdodFNjYWxlIiwiVG9ydXNLbm90R2VvbWV0cnkiLCJjYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUiLCJQMSIsIlAyIiwicXVPdmVyUCIsImNzIiwiY3UiLCJzdSIsIlRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5IiwiYXJjIiwiVG9ydXNHZW9tZXRyeSIsIlRvcnVzQnVmZmVyR2VvbWV0cnkiLCJ0cmlhbmd1bGF0ZSIsImhvbGVJbmRpY2VzIiwiZGltIiwib3V0ZXJMZW4iLCJoYXNIb2xlcyIsIm91dGVyTm9kZSIsImxpbmtlZExpc3QiLCJpbnZTaXplIiwiZWxpbWluYXRlSG9sZXMiLCJlYXJjdXRMaW5rZWQiLCJjbG9ja3dpc2UiLCJzaWduZWRBcmVhIiwiaW5zZXJ0Tm9kZSIsInJlbW92ZU5vZGUiLCJhZ2FpbiIsInN0ZWluZXIiLCJhcmVhIiwiZWFyIiwicGFzcyIsImluZGV4Q3VydmUiLCJpc0Vhckhhc2hlZCIsImlzRWFyIiwiZmlsdGVyUG9pbnRzIiwiY3VyZUxvY2FsSW50ZXJzZWN0aW9ucyIsInNwbGl0RWFyY3V0IiwicG9pbnRJblRyaWFuZ2xlIiwibWluVFkiLCJtYXhUWCIsIm1heFRZIiwiek9yZGVyIiwibWluVFgiLCJuZXh0WiIsInByZXZaIiwibG9jYWxseUluc2lkZSIsImlzVmFsaWREaWFnb25hbCIsInNwbGl0UG9seWdvbiIsImdldExlZnRtb3N0IiwiY29tcGFyZVgiLCJlbGltaW5hdGVIb2xlIiwiaG9sZSIsImZpbmRIb2xlQnJpZGdlIiwiaHgiLCJoeSIsIm14IiwibXkiLCJ0YW5NaW4iLCJzb3J0TGlua2VkIiwidGFpbCIsIm51bU1lcmdlcyIsInBTaXplIiwicVNpemUiLCJpblNpemUiLCJsZWZ0bW9zdCIsInB5IiwiaW50ZXJzZWN0c1BvbHlnb24iLCJtaWRkbGVJbnNpZGUiLCJxMiIsImluc2lkZSIsImFuIiwiYnAiLCJzdW0iLCJjb250b3VyIiwiaXNDbG9ja1dpc2UiLCJwdHMiLCJ0cmlhbmd1bGF0ZVNoYXBlIiwiaG9sZXMiLCJyZW1vdmVEdXBFbmRQdHMiLCJhZGRDb250b3VyIiwiaG9sZUluZGV4IiwiRWFyY3V0IiwiRXh0cnVkZUdlb21ldHJ5IiwiYWRkU2hhcGUiLCJ2ZXJ0aWNlc0FycmF5IiwiY3VydmVTZWdtZW50cyIsInN0ZXBzIiwiYW1vdW50IiwiYmV2ZWxFbmFibGVkIiwiYmV2ZWxUaGlja25lc3MiLCJiZXZlbFNpemUiLCJiZXZlbFNlZ21lbnRzIiwiZXh0cnVkZVBhdGgiLCJVVkdlbmVyYXRvciIsIldvcmxkVVZHZW5lcmF0b3IiLCJleHRydWRlQnlQYXRoIiwiYmlub3JtYWwiLCJwb3NpdGlvbjIiLCJleHRydWRlUHRzIiwiZ2V0U3BhY2VkUG9pbnRzIiwic3BsaW5lVHViZSIsImhsIiwiZXh0cmFjdFBvaW50cyIsInNoYXBlUG9pbnRzIiwiU2hhcGVVdGlscyIsImFob2xlIiwicHQiLCJicyIsInZlcnQiLCJ2bGVuIiwiZmxlbiIsImluUHQiLCJpblByZXYiLCJpbk5leHQiLCJ2X3RyYW5zX3kiLCJzaHJpbmtfYnkiLCJ2X3ByZXZfeSIsInZfbmV4dF95Iiwidl9wcmV2X3giLCJ2X25leHRfeCIsImNvbGxpbmVhcjAiLCJ2X3ByZXZfbGVuc3EiLCJ2X3ByZXZfbGVuIiwidl9uZXh0X2xlbiIsInB0TmV4dFNoaWZ0X3giLCJwdFByZXZTaGlmdF94IiwicHROZXh0U2hpZnRfeSIsInB0UHJldlNoaWZ0X3kiLCJ2X3RyYW5zX3giLCJzZiIsInZfdHJhbnNfbGVuc3EiLCJkaXJlY3Rpb25fZXEiLCJjb250b3VyTW92ZW1lbnRzIiwiZ2V0QmV2ZWxWZWMiLCJvbmVIb2xlTW92ZW1lbnRzIiwidmVydGljZXNNb3ZlbWVudHMiLCJob2xlc01vdmVtZW50cyIsInNjYWxlUHQyIiwiYnVpbGRMaWRGYWNlcyIsImJ1aWxkU2lkZUZhY2VzIiwiZjMiLCJzaWRld2FsbHMiLCJsYXllcm9mZnNldCIsInNsIiwic2xlbjEiLCJzbGVuMiIsImY0IiwicGxhY2Vob2xkZXIiLCJhZGRWZXJ0ZXgiLCJ1dmdlbiIsImdlbmVyYXRlVG9wVVYiLCJuZXh0SW5kZXgiLCJhZGRVViIsImdlbmVyYXRlU2lkZVdhbGxVViIsInZlY3RvcjIiLCJFeHRydWRlQnVmZmVyR2VvbWV0cnkiLCJpbmRleEEiLCJpbmRleEIiLCJpbmRleEMiLCJhX3giLCJhX3kiLCJiX3giLCJiX3kiLCJjX3giLCJjX3kiLCJpbmRleEQiLCJhX3oiLCJiX3oiLCJjX3oiLCJkX3giLCJkX3oiLCJkX3kiLCJ0ZXh0IiwiVGV4dEdlb21ldHJ5IiwiZm9udCIsImlzRm9udCIsImdlbmVyYXRlU2hhcGVzIiwiVGV4dEJ1ZmZlckdlb21ldHJ5IiwicGhpU3RhcnQiLCJwaGlMZW5ndGgiLCJ0aGV0YVN0YXJ0IiwidGhldGFMZW5ndGgiLCJTcGhlcmVHZW9tZXRyeSIsInZlcnRpY2VzUm93IiwiZ3JpZCIsInRoZXRhRW5kIiwiU3BoZXJlQnVmZmVyR2VvbWV0cnkiLCJpbm5lclJhZGl1cyIsIm91dGVyUmFkaXVzIiwidGhldGFTZWdtZW50cyIsInBoaVNlZ21lbnRzIiwiUmluZ0dlb21ldHJ5Iiwic2VnbWVudCIsInJhZGl1c1N0ZXAiLCJ0aGV0YVNlZ21lbnRMZXZlbCIsIlJpbmdCdWZmZXJHZW9tZXRyeSIsInNlZ21lbnRzIiwiTGF0aGVHZW9tZXRyeSIsImludmVyc2VTZWdtZW50cyIsImJhc2UiLCJuMSIsIm4yIiwiTGF0aGVCdWZmZXJHZW9tZXRyeSIsIlNoYXBlR2VvbWV0cnkiLCJzaGFwZUhvbGUiLCJzaGFwZVZlcnRpY2VzIiwic2hhcGVIb2xlcyIsImluZGV4T2Zmc2V0IiwiU2hhcGVCdWZmZXJHZW9tZXRyeSIsInRocmVzaG9sZEFuZ2xlIiwiZmFjZTEiLCJmYWNlMiIsInRocmVzaG9sZERvdCIsInNvdXJjZVZlcnRpY2VzIiwiRWRnZXNHZW9tZXRyeSIsInJhZGl1c1RvcCIsInJhZGl1c0JvdHRvbSIsIm9wZW5FbmRlZCIsIkN5bGluZGVyR2VvbWV0cnkiLCJnZW5lcmF0ZVRvcnNvIiwiZ2VuZXJhdGVDYXAiLCJzaW5UaGV0YSIsImNvc1RoZXRhIiwic2xvcGUiLCJpbmRleFJvdyIsImluZGV4QXJyYXkiLCJjZW50ZXJJbmRleFN0YXJ0IiwiY2VudGVySW5kZXhFbmQiLCJDeWxpbmRlckJ1ZmZlckdlb21ldHJ5IiwiQ29uZUdlb21ldHJ5IiwiQ29uZUJ1ZmZlckdlb21ldHJ5IiwiQ2lyY2xlR2VvbWV0cnkiLCJDaXJjbGVCdWZmZXJHZW9tZXRyeSIsImZyZWV6ZSIsIlJhd1NoYWRlck1hdGVyaWFsIiwiZmlsZXMiLCJmaWxlIiwib25Mb2FkIiwib25Qcm9ncmVzcyIsIm9uRXJyb3IiLCJvblN0YXJ0IiwiaXRlbVN0YXJ0IiwiaXRlbXNUb3RhbCIsImlzTG9hZGluZyIsIml0ZW1zTG9hZGVkIiwiaXRlbUVuZCIsIml0ZW1FcnJvciIsInJlc29sdmVVUkwiLCJ1cmxNb2RpZmllciIsInNldFVSTE1vZGlmaWVyIiwidHJhbnNmb3JtIiwibWFuYWdlciIsIkRlZmF1bHRMb2FkaW5nTWFuYWdlciIsIkZpbGVMb2FkZXIiLCJsb2FkIiwiQ2FjaGUiLCJjYWNoZWQiLCJsb2FkaW5nIiwiZGF0YVVyaVJlZ2V4IiwiZGF0YVVyaVJlZ2V4UmVzdWx0IiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiaXNCYXNlNjQiLCJhdG9iIiwicmVzcG9uc2VUeXBlIiwidG9Mb3dlckNhc2UiLCJyZXNwb25zZSIsIm1pbWVUeXBlIiwicGFyc2VyIiwicGFyc2VGcm9tU3RyaW5nIiwicmVxdWVzdCIsInN0YXR1cyIsImNhbGxiYWNrcyIsIndpdGhDcmVkZW50aWFscyIsIm92ZXJyaWRlTWltZVR5cGUiLCJyZXF1ZXN0SGVhZGVyIiwic2V0UmVxdWVzdEhlYWRlciIsImhlYWRlciIsInNlbmQiLCJzZXRQYXRoIiwic2V0UmVzcG9uc2VUeXBlIiwic2V0V2l0aENyZWRlbnRpYWxzIiwic2V0TWltZVR5cGUiLCJfcGFyc2VyIiwiQ29tcHJlc3NlZFRleHR1cmVMb2FkZXIiLCJsb2FkZXIiLCJ0ZXhEYXRhcyIsImxvYWRlZCIsIm1pcG1hcENvdW50IiwibG9hZFRleHR1cmUiLCJpc0N1YmVtYXAiLCJEYXRhVGV4dHVyZUxvYWRlciIsInRleERhdGEiLCJJbWFnZUxvYWRlciIsImNyb3NzT3JpZ2luIiwic3Vic3RyIiwic2V0Q3Jvc3NPcmlnaW4iLCJDdWJlVGV4dHVyZUxvYWRlciIsInVybHMiLCJUZXh0dXJlTG9hZGVyIiwic2VhcmNoIiwiaXNKUEVHIiwiYXJjTGVuZ3RoRGl2aXNpb25zIiwiQ3VydmUiLCJnZXRQb2ludCIsIm9wdGlvbmFsVGFyZ2V0IiwiZ2V0VXRvVG1hcHBpbmciLCJnZXRQb2ludHMiLCJkaXZpc2lvbnMiLCJnZXRMZW5ndGgiLCJnZXRMZW5ndGhzIiwibGVuZ3RocyIsImNhY2hlQXJjTGVuZ3RocyIsImN1cnJlbnQiLCJ1cGRhdGVBcmNMZW5ndGhzIiwiYXJjTGVuZ3RocyIsInRhcmdldEFyY0xlbmd0aCIsImNvbXBhcmlzb24iLCJsZW5ndGhBZnRlciIsImxlbmd0aEJlZm9yZSIsInNlZ21lbnRMZW5ndGgiLCJzZWdtZW50RnJhY3Rpb24iLCJnZXRUYW5nZW50IiwidDIiLCJwdDIiLCJwdDEiLCJnZXRUYW5nZW50QXQiLCJNQVhfVkFMVUUiLCJ0eiIsIm1hdCIsImZyb21KU09OIiwianNvbiIsImFYIiwiYVkiLCJ4UmFkaXVzIiwieVJhZGl1cyIsImFTdGFydEFuZ2xlIiwiYUVuZEFuZ2xlIiwiYUNsb2Nrd2lzZSIsImFSb3RhdGlvbiIsIkVsbGlwc2VDdXJ2ZSIsImlzRWxsaXBzZUN1cnZlIiwiZGVsdGFBbmdsZSIsInR3b1BpIiwic2FtZVBvaW50cyIsImFSYWRpdXMiLCJBcmNDdXJ2ZSIsImlzQXJjQ3VydmUiLCJjMCIsImluaXRDYXRtdWxsUm9tIiwieDMiLCJ0ZW5zaW9uIiwiaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tIiwiZHQwIiwiZHQxIiwiZHQyIiwiY2FsYyIsInQzIiwiY3VydmVUeXBlIiwiQ2F0bXVsbFJvbUN1cnZlMyIsImlzQ2F0bXVsbFJvbUN1cnZlMyIsImludFBvaW50Iiwid2VpZ2h0IiwicHgkMSIsInB6IiwiUXVhZHJhdGljQmV6aWVyUDEiLCJRdWFkcmF0aWNCZXppZXJQMiIsIkN1YmljQmV6aWVyUDEiLCJDdWJpY0JlemllclAyIiwiQ3ViaWNCZXppZXJQMyIsInYzIiwiQ3ViaWNCZXppZXJDdXJ2ZSIsImlzQ3ViaWNCZXppZXJDdXJ2ZSIsIkN1YmljQmV6aWVyIiwiQ3ViaWNCZXppZXJDdXJ2ZTMiLCJpc0N1YmljQmV6aWVyQ3VydmUzIiwiTGluZUN1cnZlIiwiaXNMaW5lQ3VydmUiLCJMaW5lQ3VydmUzIiwiaXNMaW5lQ3VydmUzIiwiUXVhZHJhdGljQmV6aWVyQ3VydmUiLCJpc1F1YWRyYXRpY0JlemllckN1cnZlIiwiUXVhZHJhdGljQmV6aWVyIiwiUXVhZHJhdGljQmV6aWVyQ3VydmUzIiwiaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiLCJTcGxpbmVDdXJ2ZSIsImlzU3BsaW5lQ3VydmUiLCJDYXRtdWxsUm9tIiwiY3VydmVzIiwiYXV0b0Nsb3NlIiwiQ3VydmVQYXRoIiwiY3VydmUiLCJjbG9zZVBhdGgiLCJzdGFydFBvaW50IiwiZW5kUG9pbnQiLCJnZXRDdXJ2ZUxlbmd0aHMiLCJjdXJ2ZUxlbmd0aHMiLCJsZW5zIiwiY2FjaGVMZW5ndGhzIiwic3VtcyIsInJlc29sdXRpb24iLCJjdXJyZW50UG9pbnQiLCJQYXRoIiwibW92ZVRvIiwibGluZVRvIiwicXVhZHJhdGljQ3VydmVUbyIsImFDUHgiLCJhQ1B5IiwiYmV6aWVyQ3VydmVUbyIsImFDUDF4IiwiYUNQMXkiLCJhQ1AyeCIsImFDUDJ5Iiwic3BsaW5lVGhydSIsIm5wdHMiLCJhYnNhcmMiLCJhYnNlbGxpcHNlIiwiZWxsaXBzZSIsImZpcnN0UG9pbnQiLCJsYXN0UG9pbnQiLCJTaGFwZSIsImdldFBvaW50c0hvbGVzIiwiaG9sZXNQdHMiLCJMaWdodCIsIkhlbWlzcGhlcmVMaWdodCIsIkxpZ2h0U2hhZG93IiwiU3BvdExpZ2h0U2hhZG93IiwicG93ZXIiLCJTcG90TGlnaHQiLCJQb2ludExpZ2h0IiwiRGlyZWN0aW9uYWxMaWdodFNoYWRvdyIsIkRpcmVjdGlvbmFsTGlnaHQiLCJBbWJpZW50TGlnaHQiLCJSZWN0QXJlYUxpZ2h0IiwidGltZXMiLCJpbnRlcnBvbGF0aW9uIiwiS2V5ZnJhbWVUcmFjayIsIlN0cmluZ0tleWZyYW1lVHJhY2siLCJWYWx1ZVR5cGVOYW1lIiwiVmFsdWVCdWZmZXJUeXBlIiwiRGVmYXVsdEludGVycG9sYXRpb24iLCJJbnRlcnBvbGF0ZURpc2NyZXRlIiwiSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyIiwiSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoIiwiQm9vbGVhbktleWZyYW1lVHJhY2siLCJwYXJhbWV0ZXJQb3NpdGlvbnMiLCJzYW1wbGVWYWx1ZXMiLCJzYW1wbGVTaXplIiwicmVzdWx0QnVmZmVyIiwiX2NhY2hlZEluZGV4IiwidmFsdWVTaXplIiwiSW50ZXJwb2xhbnQiLCJldmFsdWF0ZSIsInBwIiwidmFsaWRhdGVfaW50ZXJ2YWwiLCJzZWVrIiwibGluZWFyX3NjYW4iLCJmb3J3YXJkX3NjYW4iLCJhZnRlckVuZF8iLCJnaXZlVXBBdCIsInQxZ2xvYmFsIiwiYmVmb3JlU3RhcnRfIiwibWlkIiwiaW50ZXJ2YWxDaGFuZ2VkXyIsImludGVycG9sYXRlXyIsInNldHRpbmdzIiwiRGVmYXVsdFNldHRpbmdzXyIsImdldFNldHRpbmdzXyIsImNvcHlTYW1wbGVWYWx1ZV8iLCJRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQiLCJRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjayIsIkludGVycG9sYXRlTGluZWFyIiwiZ2V0VmFsdWVTaXplIiwiQ29sb3JLZXlmcmFtZVRyYWNrIiwiTnVtYmVyS2V5ZnJhbWVUcmFjayIsIl93ZWlnaHRQcmV2IiwiX29mZnNldFByZXYiLCJfd2VpZ2h0TmV4dCIsIl9vZmZzZXROZXh0IiwiQ3ViaWNJbnRlcnBvbGFudCIsImVuZGluZ1N0YXJ0IiwiWmVyb0N1cnZhdHVyZUVuZGluZyIsImVuZGluZ0VuZCIsImlQcmV2IiwiaU5leHQiLCJ0UHJldiIsInROZXh0IiwiaGFsZkR0IiwibzEiLCJvMCIsIm9QIiwib04iLCJ3UCIsIndOIiwicHBwIiwic1AiLCJzTiIsIkxpbmVhckludGVycG9sYW50Iiwib2Zmc2V0MSIsIm9mZnNldDAiLCJ3ZWlnaHQxIiwid2VpZ2h0MCIsIkRpc2NyZXRlSW50ZXJwb2xhbnQiLCJhcnJheVNsaWNlIiwiZnJvbSIsInRvIiwiQW5pbWF0aW9uVXRpbHMiLCJpc1R5cGVkQXJyYXkiLCJjb252ZXJ0QXJyYXkiLCJmb3JjZUNsb25lIiwiaXNWaWV3IiwiZ2V0S2V5ZnJhbWVPcmRlciIsImNvbXBhcmVUaW1lIiwic29ydGVkQXJyYXkiLCJuVmFsdWVzIiwic3JjT2Zmc2V0IiwiZmxhdHRlbkpTT04iLCJqc29uS2V5cyIsInZhbHVlUHJvcGVydHlOYW1lIiwiVGltZUJ1ZmZlclR5cGUiLCJzZXRJbnRlcnBvbGF0aW9uIiwidmFsaWRhdGUiLCJvcHRpbWl6ZSIsIl9nZXRUcmFja1R5cGVGb3JWYWx1ZVR5cGVOYW1lIiwidHJhY2tUeXBlIiwidHJhY2siLCJnZXRJbnRlcnBvbGF0aW9uIiwidHlwZU5hbWUiLCJGbG9hdDMyQXJyYXkiLCJJbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZSIsImZhY3RvcnlNZXRob2QiLCJjcmVhdGVJbnRlcnBvbGFudCIsInNoaWZ0IiwidGltZU9mZnNldCIsInRpbWVTY2FsZSIsInN0YXJ0VGltZSIsImVuZFRpbWUiLCJuS2V5cyIsInZhbGlkIiwiY3VyclRpbWUiLCJwcmV2VGltZSIsInNtb290aEludGVycG9sYXRpb24iLCJJbnRlcnBvbGF0ZVNtb290aCIsIndyaXRlSW5kZXgiLCJ0aW1lTmV4dCIsIm9mZnNldFAiLCJvZmZzZXROIiwia2VlcCIsIndyaXRlT2Zmc2V0IiwicmVhZE9mZnNldCIsIlZlY3RvcktleWZyYW1lVHJhY2siLCJkdXJhdGlvbiIsInRyYWNrcyIsInJlc2V0RHVyYXRpb24iLCJBbmltYXRpb25DbGlwIiwianNvblRyYWNrcyIsImZyYW1lVGltZSIsImZwcyIsImNsaXAiLCJjbGlwVHJhY2tzIiwiQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2UiLCJtb3JwaFRhcmdldFNlcXVlbmNlIiwibm9Mb29wIiwibnVtTW9ycGhUYXJnZXRzIiwiZmluZEJ5TmFtZSIsIm9iamVjdE9yQ2xpcEFycmF5IiwiY2xpcEFycmF5IiwiYW5pbWF0aW9ucyIsIkNyZWF0ZUNsaXBzRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2VzIiwicGFydHMiLCJhbmltYXRpb25Ub01vcnBoVGFyZ2V0cyIsImFuaW1hdGlvbk1vcnBoVGFyZ2V0cyIsImNsaXBzIiwicGFyc2VBbmltYXRpb24iLCJhbmltYXRpb24iLCJ0cmFja05hbWUiLCJhbmltYXRpb25LZXlzIiwicHJvcGVydHlOYW1lIiwiZGVzdFRyYWNrcyIsImhpZXJhcmNoeSIsImhpZXJhcmNoeVRyYWNrcyIsIm1vcnBoVGFyZ2V0TmFtZXMiLCJhbmltYXRpb25LZXkiLCJtb3JwaFRhcmdldE5hbWUiLCJhZGROb25lbXB0eVRyYWNrIiwiYm9uZU5hbWUiLCJjbGlwTmFtZSIsIk1hdGVyaWFsTG9hZGVyIiwic2V0VGV4dHVyZXMiLCJzaGFkaW5nIiwiZ2V0VGV4dHVyZSIsIkJ1ZmZlckdlb21ldHJ5TG9hZGVyIiwidHlwZWRBcnJheSIsImRyYXdjYWxscyIsIm9mZnNldHMiLCJJbnQ4QXJyYXkiLCJVaW50OEFycmF5IiwiVWludDhDbGFtcGVkQXJyYXkiLCJJbnQxNkFycmF5IiwiVWludDE2QXJyYXkiLCJJbnQzMkFycmF5IiwiVWludDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJMb2FkZXIiLCJIYW5kbGVycyIsImhhbmRsZXJzIiwicmVnZXgiLCJvbkxvYWRTdGFydCIsIm9uTG9hZFByb2dyZXNzIiwib25Mb2FkQ29tcGxldGUiLCJpbml0TWF0ZXJpYWxzIiwidGV4dHVyZVBhdGgiLCJjcmVhdGVNYXRlcmlhbCIsIkFkZGl0aXZlQmxlbmRpbmciLCJTdWJ0cmFjdGl2ZUJsZW5kaW5nIiwiTXVsdGlwbHlCbGVuZGluZyIsImZ1bGxQYXRoIiwidGV4dHVyZUxvYWRlciIsIkJsZW5kaW5nTW9kZSIsIm1hcERpZmZ1c2VSZXBlYXQiLCJtYXBEaWZmdXNlT2Zmc2V0IiwibWFwRGlmZnVzZVdyYXAiLCJtYXBEaWZmdXNlQW5pc290cm9weSIsIm1hcEVtaXNzaXZlUmVwZWF0IiwibWFwRW1pc3NpdmVPZmZzZXQiLCJtYXBFbWlzc2l2ZVdyYXAiLCJtYXBFbWlzc2l2ZUFuaXNvdHJvcHkiLCJtYXBMaWdodFJlcGVhdCIsIm1hcExpZ2h0T2Zmc2V0IiwibWFwTGlnaHRXcmFwIiwibWFwTGlnaHRBbmlzb3Ryb3B5IiwibWFwQU9SZXBlYXQiLCJtYXBBT09mZnNldCIsIm1hcEFPV3JhcCIsIm1hcEFPQW5pc290cm9weSIsIm1hcEJ1bXBSZXBlYXQiLCJtYXBCdW1wT2Zmc2V0IiwibWFwQnVtcFdyYXAiLCJtYXBCdW1wQW5pc290cm9weSIsIm1hcE5vcm1hbFJlcGVhdCIsIm1hcE5vcm1hbE9mZnNldCIsIm1hcE5vcm1hbFdyYXAiLCJtYXBOb3JtYWxBbmlzb3Ryb3B5IiwibWFwU3BlY3VsYXJSZXBlYXQiLCJtYXBTcGVjdWxhck9mZnNldCIsIm1hcFNwZWN1bGFyV3JhcCIsIm1hcFNwZWN1bGFyQW5pc290cm9weSIsIm1hcE1ldGFsbmVzc1JlcGVhdCIsIm1hcE1ldGFsbmVzc09mZnNldCIsIm1hcE1ldGFsbmVzc1dyYXAiLCJtYXBNZXRhbG5lc3NBbmlzb3Ryb3B5IiwibWFwUm91Z2huZXNzUmVwZWF0IiwibWFwUm91Z2huZXNzT2Zmc2V0IiwibWFwUm91Z2huZXNzV3JhcCIsIm1hcFJvdWdobmVzc0FuaXNvdHJvcHkiLCJtYXBBbHBoYVJlcGVhdCIsIm1hcEFscGhhT2Zmc2V0IiwibWFwQWxwaGFXcmFwIiwibWFwQWxwaGFBbmlzb3Ryb3B5IiwiVmVydGV4Q29sb3JzIiwiRmFjZUNvbG9ycyIsIm1hdGVyaWFsTG9hZGVyIiwiZGVjb2RlVGV4dCIsImRlY29kZSIsImZyb21DaGFyQ29kZSIsImVzY2FwZSIsImV4dHJhY3RVcmxCYXNlIiwibGFzdEluZGV4T2YiLCJKU09OTG9hZGVyIiwiTG9hZGVyVXRpbHMiLCJzZXRUZXh0dXJlUGF0aCIsImZpIiwiekxlbmd0aCIsImNvbG9ySW5kZXgiLCJub3JtYWxJbmRleCIsInV2SW5kZXgiLCJpc1F1YWQiLCJmYWNlQSIsImZhY2VCIiwidXZMYXllciIsIm5VdkxheWVycyIsImlzQml0U2V0IiwiaW5mbHVlbmNlc1BlclZlcnRleCIsInNyY1ZlcnRpY2VzIiwiZHN0VmVydGljZXMiLCJtb3JwaENvbG9ycyIsIm91dHB1dEFuaW1hdGlvbnMiLCJtb3JwaEFuaW1hdGlvbkNsaXBzIiwicGFyc2VNb2RlbCIsInBhcnNlU2tpbiIsInBhcnNlTW9ycGhpbmciLCJwYXJzZUFuaW1hdGlvbnMiLCJPYmplY3RMb2FkZXIiLCJzdWJzdHJpbmciLCJwYXJzZVNoYXBlIiwicGFyc2VHZW9tZXRyaWVzIiwicGFyc2VJbWFnZXMiLCJwYXJzZVRleHR1cmVzIiwicGFyc2VNYXRlcmlhbHMiLCJwYXJzZU9iamVjdCIsImRldGFpbHMiLCJnZW9tZXRyeVNoYXBlcyIsImJ1ZmZlckdlb21ldHJ5TG9hZGVyIiwiZ2VvbWV0cnlMb2FkZXIiLCJsb2FkSW1hZ2UiLCJwYXJzZUNvbnN0YW50IiwiVEVYVFVSRV9NQVBQSU5HIiwiVEVYVFVSRV9XUkFQUElORyIsIlRFWFRVUkVfRklMVEVSIiwiZ2V0R2VvbWV0cnkiLCJnZXRNYXRlcmlhbCIsIkN1YmVSZWZyYWN0aW9uTWFwcGluZyIsIkVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nIiwiRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmciLCJTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZyIsInN1YlBhdGhzIiwiY3VycmVudFBhdGgiLCJTaGFwZVBhdGgiLCJ0b1NoYXBlcyIsImlzQ0NXIiwibm9Ib2xlcyIsImluU3VicGF0aHMiLCJ0bXBTaGFwZSIsInRtcFBhdGgiLCJpblBvbHlnb24iLCJwb2x5TGVuIiwiZWRnZUhpZ2hQdCIsImVkZ2VMb3dQdCIsImVkZ2VEeSIsImVkZ2VEeCIsInBlcnBFZGdlIiwiaG9sZXNGaXJzdCIsIm5ld1NoYXBlcyIsIm1haW5JZHgiLCJuZXdTaGFwZUhvbGVzIiwidG1wUG9pbnRzIiwic29saWQiLCJzTGVuIiwic0lkeCIsImJldHRlclNoYXBlSG9sZXMiLCJoSWR4Iiwic2hvIiwiczJJZHgiLCJpc1BvaW50SW5zaWRlUG9seWdvbiIsImhvIiwidG9DaGFuZ2UiLCJmcm9tcyIsInRvcyIsImhvbGVfdW5hc3NpZ25lZCIsImFtYmlndW91cyIsInRtcEhvbGVzIiwiRm9udCIsImNyZWF0ZVBhdGhzIiwicGF0aHMiLCJ5TWF4IiwieU1pbiIsInVuZGVybGluZVRoaWNrbmVzcyIsImNoYXJzIiwiY2hhciIsImxpbmVfaGVpZ2h0IiwiY3JlYXRlUGF0aCIsImdseXBocyIsImdseXBoIiwiY3B4IiwiY3B5IiwiY3B4MSIsImNweTEiLCJjcHgyIiwiY3B5MiIsIl9jYWNoZWRPdXRsaW5lIiwib3V0bGluZSIsImFjdGlvbiIsImhhIiwiRm9udExvYWRlciIsIkF1ZGlvQ29udGV4dCIsIndlYmtpdEF1ZGlvQ29udGV4dCIsInNldENvbnRleHQiLCJBdWRpb0xvYWRlciIsImRlY29kZUF1ZGlvRGF0YSIsImF1ZGlvQnVmZmVyIiwiZXllU2VwIiwiU3RlcmVvQ2FtZXJhIiwieG1heCIsImV5ZUxlZnQiLCJleWVSaWdodCIsInhtaW4iLCJ5bWF4IiwiZXllU2VwT25Qcm9qZWN0aW9uIiwiY3ViZVJlc29sdXRpb24iLCJjYW1lcmFQWCIsImNhbWVyYU5YIiwiY2FtZXJhUFkiLCJjYW1lcmFOWSIsImNhbWVyYVBaIiwiY2FtZXJhTloiLCJDdWJlQ2FtZXJhIiwiZ2FpbiIsImNyZWF0ZUdhaW4iLCJjb25uZWN0IiwiZGVzdGluYXRpb24iLCJBdWRpb0xpc3RlbmVyIiwiZ2V0SW5wdXQiLCJyZW1vdmVGaWx0ZXIiLCJkaXNjb25uZWN0IiwiZ2V0RmlsdGVyIiwic2V0RmlsdGVyIiwiZ2V0TWFzdGVyVm9sdW1lIiwic2V0TWFzdGVyVm9sdW1lIiwic2V0VGFyZ2V0QXRUaW1lIiwiY3VycmVudFRpbWUiLCJwb3NpdGlvblgiLCJzZXRWYWx1ZUF0VGltZSIsInBvc2l0aW9uWSIsInBvc2l0aW9uWiIsImZvcndhcmRYIiwiZm9yd2FyZFkiLCJmb3J3YXJkWiIsInVwWCIsInVwWSIsInVwWiIsInNldE9yaWVudGF0aW9uIiwiYXV0b3BsYXkiLCJsb29wIiwicGxheWJhY2tSYXRlIiwiaXNQbGF5aW5nIiwiaGFzUGxheWJhY2tDb250cm9sIiwic291cmNlVHlwZSIsImZpbHRlcnMiLCJBdWRpbyIsImdldE91dHB1dCIsInNldE5vZGVTb3VyY2UiLCJhdWRpb05vZGUiLCJzZXRCdWZmZXIiLCJwbGF5IiwiY3JlYXRlQnVmZmVyU291cmNlIiwib25lbmRlZCIsIm9uRW5kZWQiLCJwYXVzZSIsImdldEZpbHRlcnMiLCJzZXRGaWx0ZXJzIiwic2V0UGxheWJhY2tSYXRlIiwiZ2V0UGxheWJhY2tSYXRlIiwiZ2V0TG9vcCIsInNldExvb3AiLCJnZXRWb2x1bWUiLCJzZXRWb2x1bWUiLCJwYW5uZXIiLCJjcmVhdGVQYW5uZXIiLCJQb3NpdGlvbmFsQXVkaW8iLCJnZXRSZWZEaXN0YW5jZSIsInJlZkRpc3RhbmNlIiwic2V0UmVmRGlzdGFuY2UiLCJnZXRSb2xsb2ZmRmFjdG9yIiwicm9sbG9mZkZhY3RvciIsInNldFJvbGxvZmZGYWN0b3IiLCJnZXREaXN0YW5jZU1vZGVsIiwiZGlzdGFuY2VNb2RlbCIsInNldERpc3RhbmNlTW9kZWwiLCJnZXRNYXhEaXN0YW5jZSIsIm1heERpc3RhbmNlIiwic2V0TWF4RGlzdGFuY2UiLCJhdWRpbyIsImZmdFNpemUiLCJhbmFseXNlciIsImNyZWF0ZUFuYWx5c2VyIiwiZnJlcXVlbmN5QmluQ291bnQiLCJBdWRpb0FuYWx5c2VyIiwiZ2V0RnJlcXVlbmN5RGF0YSIsImdldEJ5dGVGcmVxdWVuY3lEYXRhIiwiZ2V0QXZlcmFnZUZyZXF1ZW5jeSIsImJpbmRpbmciLCJtaXhGdW5jdGlvbiIsIl9zbGVycCIsIl9zZWxlY3QiLCJfbGVycCIsIl9taXhCdWZmZXJSZWdpb24iLCJjdW11bGF0aXZlV2VpZ2h0IiwidXNlQ291bnQiLCJyZWZlcmVuY2VDb3VudCIsIlByb3BlcnR5TWl4ZXIiLCJhY2N1bXVsYXRlIiwiYWNjdUluZGV4IiwiY3VycmVudFdlaWdodCIsIm1peCIsIm9yaWdpbmFsVmFsdWVPZmZzZXQiLCJzYXZlT3JpZ2luYWxTdGF0ZSIsImdldFZhbHVlIiwicmVzdG9yZU9yaWdpbmFsU3RhdGUiLCJ0YXJnZXRHcm91cCIsIm9wdGlvbmFsUGFyc2VkUGF0aCIsIlByb3BlcnR5QmluZGluZyIsInBhcnNlVHJhY2tOYW1lIiwiX3RhcmdldEdyb3VwIiwiX2JpbmRpbmdzIiwic3Vic2NyaWJlXyIsInBhcnNlZFBhdGgiLCJDb21wb3NpdGUiLCJuQ2FjaGVkT2JqZWN0c18iLCJmaXJzdFZhbGlkSW5kZXgiLCJiaW5kaW5ncyIsInVuYmluZCIsInJvb3ROb2RlIiwiZmluZE5vZGUiLCJub2RlTmFtZSIsInJvb3QiLCJpc0FuaW1hdGlvbk9iamVjdEdyb3VwIiwic2FuaXRpemVOb2RlTmFtZSIsIlJFU0VSVkVEX0NIQVJTX1JFIiwicmVzZXJ2ZWRSZSIsIndvcmRDaGFyIiwid29yZENoYXJPckRvdCIsImRpcmVjdG9yeVJlIiwibm9kZVJlIiwib2JqZWN0UmUiLCJwcm9wZXJ0eVJlIiwidHJhY2tSZSIsIm1hdGNoZXMiLCJvYmplY3ROYW1lIiwib2JqZWN0SW5kZXgiLCJwcm9wZXJ0eUluZGV4IiwicmVzdWx0cyIsImxhc3REb3QiLCJzdXBwb3J0ZWRPYmplY3ROYW1lcyIsImNoaWxkTm9kZSIsInNlYXJjaE5vZGVTdWJ0cmVlIiwic3ViVHJlZU5vZGUiLCJfZ2V0VmFsdWVfdW5hdmFpbGFibGUiLCJfc2V0VmFsdWVfdW5hdmFpbGFibGUiLCJCaW5kaW5nVHlwZSIsIkRpcmVjdCIsIkVudGlyZUFycmF5IiwiQXJyYXlFbGVtZW50IiwiSGFzRnJvbVRvQXJyYXkiLCJWZXJzaW9uaW5nIiwiTm9uZSIsIk5lZWRzVXBkYXRlIiwiTWF0cml4V29ybGROZWVkc1VwZGF0ZSIsIkdldHRlckJ5QmluZGluZ1R5cGUiLCJyZXNvbHZlZFByb3BlcnR5IiwiU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmciLCJ0YXJnZXRPYmplY3QiLCJkZXN0IiwidGFyZ2V0QXJyYXkiLCJzb3VyY2VBcnJheSIsIm5vZGVQcm9wZXJ0eSIsInZlcnNpb25pbmciLCJiaW5kaW5nVHlwZSIsIl9nZXRWYWx1ZV91bmJvdW5kIiwiX3NldFZhbHVlX3VuYm91bmQiLCJfaW5kaWNlc0J5VVVJRCIsIl9wYXRocyIsIl9wYXJzZWRQYXRocyIsIl9iaW5kaW5nc0luZGljZXNCeVBhdGgiLCJzdGF0cyIsInRvdGFsIiwiQW5pbWF0aW9uT2JqZWN0R3JvdXAiLCJuT2JqZWN0cyIsIm5DYWNoZWRPYmplY3RzIiwiaW5kaWNlc0J5VVVJRCIsInBhcnNlZFBhdGhzIiwibkJpbmRpbmdzIiwia25vd25PYmplY3QiLCJsYXN0Q2FjaGVkT2JqZWN0IiwiZmlyc3RBY3RpdmVJbmRleCIsImxhc3RDYWNoZWQiLCJiaW5kaW5nc0ZvclBhdGgiLCJmaXJzdEFjdGl2ZU9iamVjdCIsImxhc3RDYWNoZWRJbmRleCIsImZpcnN0QWN0aXZlIiwidW5jYWNoZSIsImxhc3RPYmplY3QiLCJpbmRpY2VzQnlQYXRoIiwidW5zdWJzY3JpYmVfIiwibGFzdEJpbmRpbmdzSW5kZXgiLCJsYXN0QmluZGluZ3MiLCJsYXN0QmluZGluZ3NQYXRoIiwibWl4ZXIiLCJsb2NhbFJvb3QiLCJfbWl4ZXIiLCJfY2xpcCIsIl9sb2NhbFJvb3QiLCJuVHJhY2tzIiwiaW50ZXJwb2xhbnRzIiwiaW50ZXJwb2xhbnQiLCJpbnRlcnBvbGFudFNldHRpbmdzIiwiX2ludGVycG9sYW50U2V0dGluZ3MiLCJfaW50ZXJwb2xhbnRzIiwiX3Byb3BlcnR5QmluZGluZ3MiLCJfY2FjaGVJbmRleCIsIl9ieUNsaXBDYWNoZUluZGV4IiwiX3RpbWVTY2FsZUludGVycG9sYW50IiwiX3dlaWdodEludGVycG9sYW50IiwiTG9vcFJlcGVhdCIsIl9sb29wQ291bnQiLCJfc3RhcnRUaW1lIiwiX2VmZmVjdGl2ZVRpbWVTY2FsZSIsIl9lZmZlY3RpdmVXZWlnaHQiLCJyZXBldGl0aW9ucyIsInBhdXNlZCIsImNsYW1wV2hlbkZpbmlzaGVkIiwiemVyb1Nsb3BlQXRTdGFydCIsInplcm9TbG9wZUF0RW5kIiwiQW5pbWF0aW9uQWN0aW9uIiwiX2FjdGl2YXRlQWN0aW9uIiwiX2RlYWN0aXZhdGVBY3Rpb24iLCJzdG9wRmFkaW5nIiwic3RvcFdhcnBpbmciLCJpc1J1bm5pbmciLCJfaXNBY3RpdmVBY3Rpb24iLCJpc1NjaGVkdWxlZCIsInN0YXJ0QXQiLCJzZXRFZmZlY3RpdmVXZWlnaHQiLCJnZXRFZmZlY3RpdmVXZWlnaHQiLCJmYWRlSW4iLCJfc2NoZWR1bGVGYWRpbmciLCJmYWRlT3V0IiwiY3Jvc3NGYWRlRnJvbSIsImZhZGVPdXRBY3Rpb24iLCJ3YXJwIiwiZmFkZU91dER1cmF0aW9uIiwic3RhcnRFbmRSYXRpbyIsImZhZGVJbkR1cmF0aW9uIiwiZW5kU3RhcnRSYXRpbyIsImNyb3NzRmFkZVRvIiwiZmFkZUluQWN0aW9uIiwid2VpZ2h0SW50ZXJwb2xhbnQiLCJfdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQiLCJzZXRFZmZlY3RpdmVUaW1lU2NhbGUiLCJnZXRFZmZlY3RpdmVUaW1lU2NhbGUiLCJzZXREdXJhdGlvbiIsInN5bmNXaXRoIiwiaGFsdCIsInN0YXJ0VGltZVNjYWxlIiwiZW5kVGltZVNjYWxlIiwiX2xlbmRDb250cm9sSW50ZXJwb2xhbnQiLCJ0aW1lU2NhbGVJbnRlcnBvbGFudCIsImdldE1peGVyIiwiZ2V0Q2xpcCIsImdldFJvb3QiLCJfcm9vdCIsIl91cGRhdGUiLCJkZWx0YVRpbWUiLCJ0aW1lRGlyZWN0aW9uIiwiX3VwZGF0ZVdlaWdodCIsInRpbWVSdW5uaW5nIiwiX3VwZGF0ZVRpbWVTY2FsZSIsIl91cGRhdGVUaW1lIiwiY2xpcFRpbWUiLCJwcm9wZXJ0eU1peGVycyIsImludGVycG9sYW50VmFsdWUiLCJsb29wQ291bnQiLCJMb29wT25jZSIsIl9zZXRFbmRpbmdzIiwiaGFuZGxlX3N0b3AiLCJMb29wUGluZ1BvbmciLCJwaW5nUG9uZyIsImxvb3BEZWx0YSIsInBlbmRpbmciLCJhdFN0YXJ0IiwiYXRFbmQiLCJaZXJvU2xvcGVFbmRpbmciLCJXcmFwQXJvdW5kRW5kaW5nIiwid2VpZ2h0Tm93Iiwid2VpZ2h0VGhlbiIsIl9pbml0TWVtb3J5TWFuYWdlciIsIl9hY2N1SW5kZXgiLCJBbmltYXRpb25NaXhlciIsIl9iaW5kQWN0aW9uIiwicHJvdG90eXBlQWN0aW9uIiwicm9vdFV1aWQiLCJiaW5kaW5nc0J5Um9vdCIsIl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUiLCJiaW5kaW5nc0J5TmFtZSIsIl9hZGRJbmFjdGl2ZUJpbmRpbmciLCJjbGlwVXVpZCIsImFjdGlvbnNGb3JDbGlwIiwiX2FjdGlvbnNCeUNsaXAiLCJrbm93bkFjdGlvbnMiLCJfYWRkSW5hY3RpdmVBY3Rpb24iLCJfbGVuZEJpbmRpbmciLCJfbGVuZEFjdGlvbiIsIl90YWtlQmFja0JpbmRpbmciLCJfdGFrZUJhY2tBY3Rpb24iLCJfYWN0aW9ucyIsIl9uQWN0aXZlQWN0aW9ucyIsIl9uQWN0aXZlQmluZGluZ3MiLCJfY29udHJvbEludGVycG9sYW50cyIsIl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyIsImFjdGlvbnMiLCJjb250cm9sSW50ZXJwb2xhbnRzIiwiYWN0aW9uc0J5Q2xpcCIsImFjdGlvbkJ5Um9vdCIsIl9yZW1vdmVJbmFjdGl2ZUFjdGlvbiIsImxhc3RJbmFjdGl2ZUFjdGlvbiIsImNhY2hlSW5kZXgiLCJrbm93bkFjdGlvbnNGb3JDbGlwIiwibGFzdEtub3duQWN0aW9uIiwiYnlDbGlwQ2FjaGVJbmRleCIsIl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uIiwiX3JlbW92ZUluYWN0aXZlQmluZGluZyIsInByZXZJbmRleCIsImxhc3RBY3RpdmVJbmRleCIsImZpcnN0SW5hY3RpdmVBY3Rpb24iLCJmaXJzdEluYWN0aXZlSW5kZXgiLCJsYXN0QWN0aXZlQWN0aW9uIiwiYmluZGluZ0J5TmFtZSIsInByb3BCaW5kaW5nIiwibGFzdEluYWN0aXZlQmluZGluZyIsInJlbW92ZV9lbXB0eV9tYXAiLCJmaXJzdEluYWN0aXZlQmluZGluZyIsImxhc3RBY3RpdmVCaW5kaW5nIiwiX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXIiLCJfX2NhY2hlSW5kZXgiLCJsYXN0QWN0aXZlSW50ZXJwb2xhbnQiLCJjbGlwQWN0aW9uIiwib3B0aW9uYWxSb290IiwiY2xpcE9iamVjdCIsImV4aXN0aW5nQWN0aW9uIiwibmV3QWN0aW9uIiwic3RvcEFsbEFjdGlvbiIsIm5BY3Rpb25zIiwidW5jYWNoZUNsaXAiLCJhY3Rpb25zVG9SZW1vdmUiLCJ1bmNhY2hlUm9vdCIsInVuY2FjaGVBY3Rpb24iLCJVbmlmb3JtIiwiSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkiLCJpbnRlcmxlYXZlZEJ1ZmZlciIsIkludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlIiwiSW50ZXJsZWF2ZWRCdWZmZXIiLCJpc0ludGVybGVhdmVkQnVmZmVyIiwiSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIiLCJJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUiLCJQb2ludENsb3VkIiwiaW50ZXJzZWN0T2JqZWN0IiwiUmF5Y2FzdGVyIiwic2V0RnJvbUNhbWVyYSIsImNvb3JkcyIsImFzY1NvcnQiLCJpbnRlcnNlY3RPYmplY3RzIiwiYXV0b1N0YXJ0Iiwib2xkVGltZSIsImVsYXBzZWRUaW1lIiwicnVubmluZyIsIkNsb2NrIiwiRGF0ZSIsInBlcmZvcm1hbmNlIiwiZ2V0RWxhcHNlZFRpbWUiLCJnZXREZWx0YSIsIm5ld1RpbWUiLCJTcGhlcmljYWwiLCJvdGhlciIsIm1ha2VTYWZlIiwidmVjMyIsIkN5bGluZHJpY2FsIiwiQm94MiIsIkltbWVkaWF0ZVJlbmRlck9iamVjdCIsIm9iakdlb21ldHJ5Iiwibk5vcm1hbHMiLCJWZXJ0ZXhOb3JtYWxzSGVscGVyIiwib2JqUG9zIiwib2JqTm9ybSIsImNvbmUiLCJTcG90TGlnaHRIZWxwZXIiLCJjb25lTGVuZ3RoIiwiY29uZVdpZHRoIiwiYm9uZUxpc3QiLCJnZXRCb25lTGlzdCIsIlNrZWxldG9uSGVscGVyIiwibWF0cml4V29ybGRJbnYiLCJib25lTWF0cml4Iiwic3BoZXJlU2l6ZSIsIlBvaW50TGlnaHRIZWxwZXIiLCJSZWN0QXJlYUxpZ2h0SGVscGVyIiwiSGVtaXNwaGVyZUxpZ2h0SGVscGVyIiwiR3JpZEhlbHBlciIsInJhZGlhbHMiLCJjaXJjbGVzIiwiUG9sYXJHcmlkSGVscGVyIiwiRmFjZU5vcm1hbHNIZWxwZXIiLCJsaWdodFBsYW5lIiwidGFyZ2V0TGluZSIsIkRpcmVjdGlvbmFsTGlnaHRIZWxwZXIiLCJhZGRMaW5lIiwiY29sb3JGcnVzdHVtIiwiY29sb3JDb25lIiwiY29sb3JVcCIsImNvbG9yVGFyZ2V0IiwiY29sb3JDcm9zcyIsImFkZFBvaW50IiwicG9pbnRNYXAiLCJDYW1lcmFIZWxwZXIiLCJzZXRQb2ludCIsIkJveEhlbHBlciIsIkJveDNIZWxwZXIiLCJwb3NpdGlvbnMyIiwiUGxhbmVIZWxwZXIiLCJoZWFkTGVuZ3RoIiwiaGVhZFdpZHRoIiwibGluZUdlb21ldHJ5IiwiY29uZUdlb21ldHJ5Iiwic2V0RGlyZWN0aW9uIiwiQXJyb3dIZWxwZXIiLCJzZXRDb2xvciIsIkF4ZXNIZWxwZXIiLCJjb25zdHJ1Y3QiLCJjcmVhdGVQb2ludHNHZW9tZXRyeSIsImNyZWF0ZUdlb21ldHJ5IiwiY3JlYXRlU3BhY2VkUG9pbnRzR2VvbWV0cnkiLCJmcm9tUG9pbnRzIiwiU3BsaW5lIiwiaW5pdEZyb21BcnJheSIsImdldENvbnRyb2xQb2ludHNBcnJheSIsInJlcGFyYW1ldHJpemVCeUFyY0xlbmd0aCIsInNldENvbG9ycyIsImlzSW50ZXJzZWN0aW9uQm94IiwiaXNJbnRlcnNlY3Rpb25TcGhlcmUiLCJyYW5kb20xNiIsIm5lYXJlc3RQb3dlck9mVHdvIiwibmV4dFBvd2VyT2ZUd28iLCJmbGF0dGVuVG9BcnJheU9mZnNldCIsIm11bHRpcGx5VmVjdG9yMyIsIm11bHRpcGx5VmVjdG9yM0FycmF5IiwiYXBwbHlUb0J1ZmZlciIsImFwcGx5VG9WZWN0b3IzQXJyYXkiLCJleHRyYWN0UG9zaXRpb24iLCJnZXRQb3NpdGlvbiIsIm11bHRpcGx5VG9BcnJheSIsIm11bHRpcGx5VmVjdG9yNCIsInJvdGF0ZUF4aXMiLCJjcm9zc1ZlY3RvciIsInJvdGF0ZUJ5QXhpcyIsIm1ha2VGcnVzdHVtIiwiaXNJbnRlcnNlY3Rpb25MaW5lIiwiaXNJbnRlcnNlY3Rpb25QbGFuZSIsImJhcnljb29yZEZyb21Qb2ludCIsIm1pZHBvaW50IiwiZXh0cmFjdEFsbFBvaW50cyIsImV4dHJ1ZGUiLCJtYWtlR2VvbWV0cnkiLCJmcm9tQXR0cmlidXRlIiwiZGlzdGFuY2VUb01hbmhhdHRhbiIsImxlbmd0aE1hbmhhdHRhbiIsInNldEV1bGVyRnJvbVJvdGF0aW9uTWF0cml4Iiwic2V0RXVsZXJGcm9tUXVhdGVybmlvbiIsImdldFBvc2l0aW9uRnJvbU1hdHJpeCIsImdldFNjYWxlRnJvbU1hdHJpeCIsImdldENvbHVtbkZyb21NYXRyaXgiLCJhcHBseVByb2plY3Rpb24iLCJjb21wdXRlVGFuZ2VudHMiLCJnZXRDaGlsZEJ5TmFtZSIsInJlbmRlckRlcHRoIiwiZ2V0V29ybGRSb3RhdGlvbiIsImV1bGVyT3JkZXIiLCJ1c2VRdWF0ZXJuaW9uIiwic2V0TGVucyIsIm9ubHlTaGFkb3ciLCJzaGFkb3dDYW1lcmFGb3YiLCJzaGFkb3dDYW1lcmFMZWZ0Iiwic2hhZG93Q2FtZXJhUmlnaHQiLCJzaGFkb3dDYW1lcmFUb3AiLCJzaGFkb3dDYW1lcmFCb3R0b20iLCJzaGFkb3dDYW1lcmFWaXNpYmxlIiwic2hhZG93RGFya25lc3MiLCJzaGFkb3dNYXBXaWR0aCIsInNoYWRvd01hcEhlaWdodCIsImNvcHlJbmRpY2VzQXJyYXkiLCJhZGRJbmRleCIsImFkZERyYXdDYWxsIiwiY2xlYXJEcmF3Q2FsbHMiLCJjb21wdXRlT2Zmc2V0cyIsImdldEFycmF5cyIsImFkZFNoYXBlTGlzdCIsIndyYXBBcm91bmQiLCJ3cmFwUkdCIiwibWV0YWwiLCJXZWJHTFJlbmRlcmVyIiwiZ2V0Q3VycmVudFJlbmRlclRhcmdldCIsImdldFByZWNpc2lvbiIsInJlc2V0R0xTdGF0ZSIsInN1cHBvcnRzRmxvYXRUZXh0dXJlcyIsInN1cHBvcnRzSGFsZkZsb2F0VGV4dHVyZXMiLCJzdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXMiLCJzdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUzNUQyIsInN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQyIsInN1cHBvcnRzQmxlbmRNaW5NYXgiLCJzdXBwb3J0c0luc3RhbmNlZEFycmF5cyIsImVuYWJsZVNjaXNzb3JUZXN0IiwiYWRkUHJlUGx1Z2luIiwiYWRkUG9zdFBsdWdpbiIsInVwZGF0ZVNoYWRvd01hcCIsInNldEZhY2VDdWxsaW5nIiwic2hhZG93TWFwQ3VsbEZhY2UiLCJXZWJHTFNoYWRvd01hcCIsInJlbmRlclJldmVyc2VTaWRlZCIsInJlbmRlclNpbmdsZVNpZGVkIiwiV2ViVlJNYW5hZ2VyIiwic3RhbmRpbmciLCJhdWRpb0xvYWRlciIsImdldERhdGEiLCJ1cGRhdGVDdWJlTWFwIiwib24iLCJjdHgiLCJldmVudHMiLCJvZmYiLCJUWVBFIiwiX2YiLCJnZXRDb25zdHJ1Y3RvciIsIklTX01BUCIsIkFEREVSIiwiX2wiLCJTSVpFIiwiX3ZhbGlkYXRlQ29sbGVjdGlvbiIsImdldEVudHJ5IiwiaGFzIiwiZFAkMiIsInNldFN0cm9uZyIsIm9yaWdpbmFsIiwiU1BFQ0lFUyQyIiwiX2FycmF5U3BlY2llc0NvbnN0cnVjdG9yIiwiSVNfRklORF9JTkRFWCIsIl9hcnJheVNwZWNpZXNDcmVhdGUiLCJfaW9iamVjdCIsIklTX0ZJTFRFUiIsInJlcyIsIk5PX0hPTEVTIiwiSVNfRVZFUlkiLCJJU19TT01FIiwiX2FycmF5TWV0aG9kcyIsIklTX1dFQUsiLCJlYWNoIiwiSVNfQURERVIiLCJkUCQzIiwiX2NvbGxlY3Rpb24iLCJNQVAiLCJfY29sbGVjdGlvblN0cm9uZyIsIl9jb2xsZWN0aW9uVG9Kc29uIiwiQ09MTEVDVElPTiIsIm9mIiwiQSIsIl9zZXRDb2xsZWN0aW9uT2YiLCJtYXBGbiIsIm5leHRJdGVtIiwiX3NldENvbGxlY3Rpb25Gcm9tIiwiTWFwIiwiZmFjdG9yaWVzIiwicGFydEFyZ3MiLCJib3VuZCIsIlJlZmxlY3QiLCJyQ29uc3RydWN0IiwiTkVXX1RBUkdFVF9CVUciLCJBUkdTX0JVRyIsIlRhcmdldCIsIm5ld1RhcmdldCIsIiRhcmdzIiwiX2JpbmQiLCJjb25zdHJ1Y3QkMSIsIlBhcmVudCIsIkNsYXNzIiwiY29uc3RydWN0JDIiLCJfY29uc3RydWN0IiwiX3dyYXBOYXRpdmVTdXBlciIsIl9jYWNoZSIsImNyZWF0ZSQxIiwiZ2V0UHJvdG90eXBlT2YkMiIsIl9FcnJvciIsImNsYXNzSW5zdGFuY2UiLCJjb21wb25lbnQiLCJjbGFzc0NhbGxDaGVjayIsIkNvbXBvc2l0aW9uRXJyb3IiLCJwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIiwic3RhY2siLCJzdGFja0FycmF5IiwiaW5oZXJpdHMiLCJ3cmFwTmF0aXZlU3VwZXIiLCJFcnJvciIsIl9FcnJvcjIiLCJhY3RpdmVNb2R1bGUiLCJEZXBlbmRlbmN5RXJyb3IiLCJfdGhpczIiLCJkZXBlbmRlbmN5TW9kdWxlIiwiX0Vycm9yMyIsIk1hbmFnZXJFcnJvciIsIl90aGlzMyIsIndhcm5EZXBzIiwiX0V2ZW50cyIsIk1vZHVsZVN5c3RlbSIsImNyZWF0ZUNsYXNzIiwibW9kdWxlcyIsImFwcGx5TW9kdWxlIiwiYXBwbHlCcmlkZ2UiLCJvbkNvcHkiLCJicmlkZ2VNYXAiLCJicmlkZ2UiLCJtb2R1bGVTY29wZSIsImFjdGl2ZSIsImludGVncmF0ZSIsImRpc3Bvc2VNb2R1bGUiLCJfbW9kdWxlIiwibWluaXZlbnRzX2NvbW1vbmpzIiwiX2FycmF5V2l0aEhvbGVzIiwiZ2V0SXRlcmF0b3IiLCJjb3JlX2dldEl0ZXJhdG9yIiwiZ2V0SXRlcmF0b3IkMSIsIl9hcnIiLCJfZSIsIl9pdGVyYWJsZVRvQXJyYXlMaW1pdCIsIl9ub25JdGVyYWJsZVJlc3QiLCJpdGVyYWJsZVRvQXJyYXlMaW1pdCIsIm5vbkl0ZXJhYmxlUmVzdCIsIl9zbGljZWRUb0FycmF5Iiwib2JzZXJ2YWJsZSIsInN5bWJvbE9ic2VydmFibGVQb255ZmlsbCIsIklOSVQiLCJSRVBMQUNFIiwicmVkdWNlciIsInByZWxvYWRlZFN0YXRlIiwiZW5oYW5jZXIiLCJjcmVhdGVTdG9yZSIsImN1cnJlbnRMaXN0ZW5lcnMiLCJuZXh0TGlzdGVuZXJzIiwiaXNEaXNwYXRjaGluZyIsImVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMiLCJpc1N1YnNjcmliZWQiLCJpc1BsYWluT2JqZWN0IiwiY3VycmVudFN0YXRlIiwiY3VycmVudFJlZHVjZXIiLCJuZXh0UmVkdWNlciIsImRpc3BhdGNoIiwiQWN0aW9uVHlwZXMiLCJzdWJzY3JpYmUiLCJvYnNlcnZlciIsImdldFN0YXRlIiwib2JzZXJ2ZVN0YXRlIiwib3V0ZXJTdWJzY3JpYmUiLCJ1bnN1YnNjcmliZSIsIl9yZWYiLCJyZXBsYWNlUmVkdWNlciIsIl9yZWYyIiwiTW9kdWxlTWFuYWdlciIsImN1cnJlbnRNb2R1bGUiLCJfdGhpcyRzdG9yZSRnZXRTdGF0ZTIiLCJzbGljZWRUb0FycmF5IiwiX3RoaXMkc3RvcmUkZ2V0U3RhdGUiLCJjaGFuZ2VkS2V5IiwiZGVwc01hcCIsIm1vZHVsZUV4ZWN1dG9yIiwidXNlIiwiX01vZHVsZVN5c3RlbSIsIkNvbXBvbmVudCIsImRlZmF1bHRzIiwiYXNzZXJ0VGhpc0luaXRpYWxpemVkIiwiaW50ZWdyYXRlTW9kdWxlcyIsIl93YWl0IiwiaXNEZWZmZXJlZCIsIndhaXQiLCJjdXN0b21pemUiLCJvYmplY3RTcHJlYWQiLCJuYXRpdmUiLCJhc3luY1RvR2VuZXJhdG9yIiwicmVnZW5lcmF0b3IiLCJvbkFkZCIsIl9jYWxsZWUiLCJfY29udGV4dDIiLCJfY2FsbGVlMiIsIl94MiIsIl9tYW5hZ2VyIiwiX25hdGl2ZSIsInByb3BlcnR5S2V5IiwicmVjZWl2ZXIiLCJnZXQkMSIsInByb3BlcnR5IiwiX3N1cGVyUHJvcEJhc2UiLCJnZXQkMiIsIl9nZXQiLCJzdXBlclByb3BCYXNlIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJDEiLCJtYXBwZXJzIiwibWFwcGVyIiwiZ2V0dGVyIiwiX2xlbjIiLCJfa2V5MiIsIl9sZW4zIiwiX2tleTMiLCJfY2xhc3MiLCJNZXNoQ29tcG9uZW50IiwiX2RlYyIsIm1pcnJvciIsIl9Db21wb25lbnQiLCJnZW9tIiwiX01lc2hDb21wb25lbnQiLCJfY2xhc3MyIiwiX3RoaXMkYXBwbHlCcmlkZ2UiLCJjdXN0b20iLCJidWlsZCIsImFwcGx5Q29tbWFuZCIsIl90aGlzMiRwYXJhbXMiLCJjYXN0IiwicmVjZWl2ZSIsIm9uV3JhcCIsIl9jbGFzcyQxIiwiTGlnaHRDb21wb25lbnQiLCJfZGVjJDEiLCJ3cmFwU2hhZG93IiwiX2NsYXNzJDIiLCJDYW1lcmFDb21wb25lbnQiLCJfZGVjJDIiLCJBcHAiLCJzeXN0ZW0iLCJ3ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJtb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJsb29wcyIsInJlcXVlc3RBbmltRnJhbWUiLCJsbCIsImV4ZWN1dGUiLCJjbG9jayIsIkxvb3AiLCJ1c2VDbG9jayIsIndvcmxkIiwiYWRkTG9vcCIsInJlbW92ZUxvb3AiLCJfTGlnaHRDb21wb25lbnQiLCJBbWJpZW50TGlnaHQkJDEiLCJBbWJpZW50TGlnaHQkMSIsIkRpcmVjdGlvbmFsTGlnaHQkJDEiLCJEaXJlY3Rpb25hbExpZ2h0JDEiLCJIZW1pc3BoZXJlTGlnaHQkJDEiLCJIZW1pc3BoZXJlTGlnaHQkMSIsIlBvaW50TGlnaHQkJDEiLCJQb2ludExpZ2h0JDEiLCJTcG90TGlnaHQkJDEiLCJleHBvbmVudCIsIlNwb3RMaWdodCQxIiwiQXJlYUxpZ2h0IiwiX0NhbWVyYUNvbXBvbmVudCIsIkN1YmVDYW1lcmEkJDEiLCJDdWJlQ2FtZXJhJDEiLCJPcnRob2dyYXBoaWNDYW1lcmEkJDEiLCJPcnRob2dyYXBoaWNDYW1lcmEkMSIsImlubmVyV2lkdGgiLCJpbm5lckhlaWdodCIsIlBlcnNwZWN0aXZlQ2FtZXJhJCQxIiwiUGVyc3BlY3RpdmVDYW1lcmEkMSIsIkJveCIsImJ1aWxkR2VvbWV0cnkiLCJDaXJjbGUiLCJDb25lIiwiZ2V0JDMiLCJyYWRpdXNTZWdtZW50cyIsIkN5bGluZGVyIiwiRG9kZWNhaGVkcm9uIiwiRXh0cnVkZSIsIkljb3NhaGVkcm9uIiwiTGF0aGUiLCJMaW5lJCQxIiwidmVydHMiLCJpMyIsIkxpbmUkMSIsIkltcG9ydGVyIiwiX2ZpbHRlciIsInByb2Nlc3NGaWx0ZXIiLCJ1c2VDdXN0b21NYXRlcmlhbCIsIk9jdGFoZWRyb24iLCJQYXJhbWV0cmljIiwiUGxhbmUkJDEiLCJ3U2VnbWVudHMiLCJoU2VnbWVudHMiLCJQbGFuZSQxIiwiaW5kaWNlc09mRmFjZXMiLCJQb2x5aGVkcm9uIiwidmVydGljZXNPZkN1YmUiLCJSaW5nIiwiU2hhcGUkJDEiLCJTaGFwZSQxIiwiU3BoZXJlJCQxIiwiU3BoZXJlJDEiLCJUZXRyYWhlZHJvbiIsIlRleHQiLCJUb3J1cyIsIlRvcnVza25vdCIsIlR1YmUiLCJHcm91cCQkMSIsImFkZFRvIiwiYm9keSIsIkVsZW1lbnRNb2R1bGUiLCJjbGFzc05hbWUiLCJSZW5kZXJpbmdNb2R1bGUiLCJkZXZpY2VQaXhlbFJhdGlvIiwiYmdDb2xvciIsImJnT3BhY2l0eSIsImZpeCIsIl90aGlzJHBhcmFtcyIsImVmZmVjdHMiLCJ0b0ZpeGVkIiwiYWRkaXRpb25hbCIsImFwcGx5QWRkaXRpb25hbCIsImF0dGFjaFRvQ2FudmFzIiwiX2VmZmVjdCIsInJlbmRlckxvb3AiLCJlZmZlY3RMb29wIiwiYXBwIiwiZGVmaW5lIiwiaW50ZWdyYXRlUmVuZGVyZXIiLCJfZWxlbWVudCIsIl9zY2VuZSIsIl9jYW1lcmEiLCJfdGhpczQiLCJTY2VuZU1vZHVsZSIsIndpbGxTY2VuZUJlUmVwbGFjZWQiLCJfc2V0U2NlbmUiLCJTWU1CT0xfQ0hJTERSRU5fRk9SX1NDRU5FIiwic2V0U2NlbmUiLCJnZXRTY2VuZSIsIlJlc2l6ZU1vZHVsZSIsImF1dG8iLCJyZW5kZXJpbmciLCJvZmZzZXRXaWR0aCIsIl90aGlzJGNvbnRhaW5lciIsIm9mZnNldEhlaWdodCIsImdldENvbnRhaW5lciIsImdldFJlc29sdXRpb24iLCJ0cmlnZ2VyIiwiX2NvbnRhaW5lciIsImFkZEF1dG9yZXNpemUiLCJfU2hhZGVyTWF0ZXJpYWwiLCJBZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbCIsIk1JUF9MRVZFTF8xWDEiLCJ0UHJldmlvdXNMdW0iLCJ0Q3VycmVudEx1bSIsIm1pbkx1bWluYW5jZSIsInRhdSIsImZyYWdtZW50IiwiQm9rZWhNYXRlcmlhbCIsImRvZiIsImFwZXJ0dXJlIiwibWF4Qmx1ciIsImNhbWVyYU5lYXIiLCJjYW1lcmFGYXIiLCJ0RGlmZnVzZSIsInREZXB0aCIsImZyYWdtZW50JDEiLCJ2ZXJ0ZXgkMSIsImFkb3B0Q2FtZXJhU2V0dGluZ3MiLCJDb2xvckVkZ2VzTWF0ZXJpYWwiLCJFREdFX1RIUkVTSE9MRCIsInRleGVsU2l6ZSIsImZyYWdtZW50JDIiLCJ2ZXJ0ZXgkMiIsIkNvbWJpbmVNYXRlcmlhbCIsInRleHR1cmUxIiwidGV4dHVyZTIiLCJvcGFjaXR5MSIsIm9wYWNpdHkyIiwiZnJhZ21lbnQkMyIsInZlcnRleCQzIiwic2V0U2NyZWVuTW9kZUVuYWJsZWQiLCJzY3JlZW5Nb2RlIiwiU0NSRUVOX01PREUiLCJDb252b2x1dGlvbk1hdGVyaWFsIiwiaGFsZlRleGVsU2l6ZSIsImtlcm5lbCIsImZyYWdtZW50JDQiLCJ2ZXJ0ZXgkNCIsInNldFRleGVsU2l6ZSIsImtlcm5lbFNpemUiLCJLZXJuZWxTaXplIiwiTEFSR0UiLCJWRVJZX1NNQUxMIiwiU01BTEwiLCJNRURJVU0iLCJWRVJZX0xBUkdFIiwiSFVHRSIsIkNvcHlNYXRlcmlhbCIsImZyYWdtZW50JDUiLCJ2ZXJ0ZXgkNSIsIkRlcHRoQ29tcGFyaXNvbk1hdGVyaWFsIiwiZnJhZ21lbnQkNiIsInZlcnRleCQ2IiwiUEVSU1BFQ1RJVkVfQ0FNRVJBIiwiRG90U2NyZWVuTWF0ZXJpYWwiLCJhdmVyYWdlIiwib2Zmc2V0UmVwZWF0IiwiZnJhZ21lbnQkNyIsInZlcnRleCQ3Iiwic2V0QXZlcmFnZUVuYWJsZWQiLCJBVkVSQUdFIiwiRmlsbU1hdGVyaWFsIiwibm9pc2UiLCJzY2FubGluZXMiLCJncmV5c2NhbGUiLCJzZXBpYSIsInZpZ25ldHRlIiwiZXNraWwiLCJub2lzZUludGVuc2l0eSIsInNjYW5saW5lSW50ZW5zaXR5IiwiZ3JpZEludGVuc2l0eSIsImdyZXlzY2FsZUludGVuc2l0eSIsInNlcGlhSW50ZW5zaXR5IiwidmlnbmV0dGVPZmZzZXQiLCJ2aWduZXR0ZURhcmtuZXNzIiwic2NhbmxpbmVDb3VudCIsImdyaWRTY2FsZSIsImdyaWRMaW5lV2lkdGgiLCJmcmFnbWVudCQ4IiwidmVydGV4JDgiLCJzZXROb2lzZUVuYWJsZWQiLCJzZXRTY2FubGluZXNFbmFibGVkIiwic2V0R3JpZEVuYWJsZWQiLCJzZXRHcmV5c2NhbGVFbmFibGVkIiwic2V0U2VwaWFFbmFibGVkIiwic2V0VmlnbmV0dGVFbmFibGVkIiwic2V0RXNraWxFbmFibGVkIiwiTk9JU0UiLCJTQ0FOTElORVMiLCJHUklEIiwiR1JFWVNDQUxFIiwiU0VQSUEiLCJWSUdORVRURSIsIkVTS0lMIiwiR2xpdGNoTWF0ZXJpYWwiLCJ0UGVydHVyYiIsInNlZWQiLCJzZWVkWCIsInNlZWRZIiwiZGlzdG9ydGlvblgiLCJkaXN0b3J0aW9uWSIsImNvbFMiLCJmcmFnbWVudCQ5IiwidmVydGV4JDkiLCJHb2RSYXlzTWF0ZXJpYWwiLCJleHBvc3VyZSIsImNsYW1wTWF4IiwiTlVNX1NBTVBMRVNfRkxPQVQiLCJOVU1fU0FNUExFU19JTlQiLCJsaWdodFBvc2l0aW9uIiwiZnJhZ21lbnQkMTAiLCJ2ZXJ0ZXgkMTAiLCJMdW1pbm9zaXR5TWF0ZXJpYWwiLCJsdW1pbmFuY2VSYW5nZSIsImRpc3RpbmN0aW9uIiwibWFza0x1bWluYW5jZSIsImZyYWdtZW50JDExIiwidmVydGV4JDExIiwic2V0Q29sb3JPdXRwdXRFbmFibGVkIiwiY29sb3JPdXRwdXQiLCJzZXRMdW1pbmFuY2VSYW5nZUVuYWJsZWQiLCJDT0xPUiIsIlJBTkdFIiwiT3V0bGluZUJsZW5kTWF0ZXJpYWwiLCJlZGdlU3RyZW5ndGgiLCJwYXR0ZXJuU2NhbGUiLCJ2aXNpYmxlRWRnZUNvbG9yIiwiaGlkZGVuRWRnZUNvbG9yIiwiYWxwaGFCbGVuZGluZyIsInhSYXkiLCJwdWxzZSIsInRNYXNrIiwidEVkZ2VzIiwidFBhdHRlcm4iLCJmcmFnbWVudCQxMiIsInZlcnRleCQxMiIsInNldEFscGhhQmxlbmRpbmdFbmFibGVkIiwic2V0WFJheUVuYWJsZWQiLCJBTFBIQV9CTEVORElORyIsIlhfUkFZIiwiVVNFX1BBVFRFUk4iLCJPdXRsaW5lRWRnZXNNYXRlcmlhbCIsImZyYWdtZW50JDEzIiwidmVydGV4JDEzIiwiUGl4ZWxhdGlvbk1hdGVyaWFsIiwiZ3JhbnVsYXJpdHkiLCJmcmFnbWVudCQxNCIsInZlcnRleCQxNCIsIlJlYWxpc3RpY0Jva2VoTWF0ZXJpYWwiLCJyaW5ncyIsInNhbXBsZXMiLCJzaG93Rm9jdXMiLCJtYW51YWxEb0YiLCJwZW50YWdvbiIsInNoYWRlckZvY3VzIiwibHVtaW5hbmNlVGhyZXNob2xkIiwibHVtaW5hbmNlR2FpbiIsImZyaW5nZSIsImRpdGhlclN0cmVuZ3RoIiwiUklOR1NfSU5UIiwiUklOR1NfRkxPQVQiLCJTQU1QTEVTX0lOVCIsIlNBTVBMRVNfRkxPQVQiLCJmb2NhbFN0b3AiLCJmb2N1c0Nvb3JkcyIsImZvY2FsRGVwdGgiLCJmcmFnbWVudCQxNSIsInZlcnRleCQxNSIsInNldFNob3dGb2N1c0VuYWJsZWQiLCJzZXRNYW51YWxEZXB0aE9mRmllbGRFbmFibGVkIiwic2V0UGVudGFnb25FbmFibGVkIiwic2V0U2hhZGVyRm9jdXNFbmFibGVkIiwiU0hPV19GT0NVUyIsIk1BTlVBTF9ET0YiLCJQRU5UQUdPTiIsIlNIQURFUl9GT0NVUyIsIlNob2NrV2F2ZU1hdGVyaWFsIiwibWF4UmFkaXVzIiwid2F2ZVNpemUiLCJhbXBsaXR1ZGUiLCJjYW1lcmFEaXN0YW5jZSIsImZyYWdtZW50JDE2IiwidmVydGV4JDE2IiwiU01BQUJsZW5kTWF0ZXJpYWwiLCJ0V2VpZ2h0cyIsImZyYWdtZW50JDE3IiwidmVydGV4JDE3IiwiU01BQVdlaWdodHNNYXRlcmlhbCIsIk1BWF9TRUFSQ0hfU1RFUFNfSU5UIiwiTUFYX1NFQVJDSF9TVEVQU19GTE9BVCIsIkFSRUFURVhfTUFYX0RJU1RBTkNFIiwiQVJFQVRFWF9QSVhFTF9TSVpFIiwiQVJFQVRFWF9TVUJURVhfU0laRSIsIlNFQVJDSFRFWF9TSVpFIiwiU0VBUkNIVEVYX1BBQ0tFRF9TSVpFIiwidEFyZWEiLCJ0U2VhcmNoIiwiZnJhZ21lbnQkMTgiLCJ2ZXJ0ZXgkMTgiLCJUb25lTWFwcGluZ01hdGVyaWFsIiwibHVtaW5hbmNlTWFwIiwiYXZlcmFnZUx1bWluYW5jZSIsIm1heEx1bWluYW5jZSIsIm1pZGRsZUdyZXkiLCJmcmFnbWVudCQxOSIsInZlcnRleCQxOSIsIlBhc3MiLCJxdWFkIiwicmVuZGVyVG9TY3JlZW4iLCJuZWVkc1N3YXAiLCJpbnB1dEJ1ZmZlciIsIm91dHB1dEJ1ZmZlciIsIl9QYXNzIiwiQmx1clBhc3MiLCJyZW5kZXJUYXJnZXRYIiwicmVuZGVyVGFyZ2V0WSIsInJlc29sdXRpb25TY2FsZSIsImNvbnZvbHV0aW9uTWF0ZXJpYWwiLCJkaXRoZXJlZENvbnZvbHV0aW9uTWF0ZXJpYWwiLCJnZXRLZXJuZWwiLCJkZXN0UlQiLCJsYXN0UlQiLCJCbG9vbVBhc3MiLCJibHVyUGFzcyIsImNvbWJpbmVNYXRlcmlhbCIsImx1bWlub3NpdHlNYXRlcmlhbCIsImJsZW5kIiwiaW5pdGlhbGl6ZSIsIkJva2VoUGFzcyIsIkNsZWFyTWFza1Bhc3MiLCJDbGVhclBhc3MiLCJEb3RTY3JlZW5QYXNzIiwiRmlsbVBhc3MiLCJzY2FubGluZURlbnNpdHkiLCJHbGl0Y2hQYXNzIiwicGVydHVyYk1hcCIsImdlbmVyYXRlUGVydHVyYk1hcCIsImR0U2l6ZSIsIkdsaXRjaE1vZGUiLCJTUE9SQURJQyIsImJyZWFrUG9pbnQiLCJyYW5kb21JbnQiLCJkdCIsIkNPTlNUQU5UX1dJTEQiLCJyYW5kb21GbG9hdCIsIkNPTlNUQU5UX01JTEQiLCJSZW5kZXJQYXNzIiwiY2xlYXJQYXNzIiwibGlnaHRTb3VyY2UiLCJHb2RSYXlzUGFzcyIsImxpZ2h0U2NlbmUiLCJtYWluU2NlbmUiLCJtYWluQ2FtZXJhIiwicmVuZGVyVGFyZ2V0TWFzayIsInJlbmRlclBhc3NMaWdodCIsInJlbmRlclBhc3NNYXNrIiwic2NyZWVuUG9zaXRpb24iLCJnb2RSYXlzTWF0ZXJpYWwiLCJNYXNrUGFzcyIsIndyaXRlVmFsdWUiLCJjbGVhclZhbHVlIiwiS0VFUCIsIlNoYWRlclBhc3MiLCJ0ZXh0dXJlSUQiLCJPdXRsaW5lUGFzcyIsInJlbmRlclRhcmdldERlcHRoIiwicmVuZGVyVGFyZ2V0RWRnZXMiLCJyZW5kZXJUYXJnZXRCbHVycmVkRWRnZXMiLCJyZW5kZXJQYXNzRGVwdGgiLCJjb3B5UGFzcyIsIm91dGxpbmVFZGdlc01hdGVyaWFsIiwib3V0bGluZUJsZW5kTWF0ZXJpYWwiLCJibHVyIiwic2VsZWN0aW9uIiwicHVsc2VTcGVlZCIsInNlbGVjdGlvbkxheWVyIiwic2V0UGF0dGVyblRleHR1cmUiLCJjbGVhclNlbGVjdGlvbiIsInNldFNlbGVjdGlvblZpc2libGUiLCJQaXhlbGF0aW9uUGFzcyIsInNldFJlc29sdXRpb24iLCJSZWFsaXN0aWNCb2tlaFBhc3MiLCJTYXZlUGFzcyIsInJlc2l6ZSIsIlNob2NrV2F2ZVBhc3MiLCJlcGljZW50ZXIiLCJzcGVlZCIsInNob2NrV2F2ZU1hdGVyaWFsIiwiY29weU1hdGVyaWFsIiwiSEFMRl9QSSIsInNlYXJjaEltYWdlIiwiYXJlYUltYWdlIiwiU01BQVBhc3MiLCJyZW5kZXJUYXJnZXRDb2xvckVkZ2VzIiwicmVuZGVyVGFyZ2V0V2VpZ2h0cyIsImNvbG9yRWRnZXNNYXRlcmlhbCIsIndlaWdodHNNYXRlcmlhbCIsInNlYXJjaFRleHR1cmUiLCJhcmVhVGV4dHVyZSIsImJsZW5kTWF0ZXJpYWwiLCJUZXh0dXJlUGFzcyIsIm9wYWNpdHlTb3VyY2UiLCJUb25lTWFwcGluZ1Bhc3MiLCJyZW5kZXJUYXJnZXRMdW1pbm9zaXR5IiwicmVuZGVyVGFyZ2V0QWRhcHRlZCIsInJlbmRlclRhcmdldFByZXZpb3VzIiwiYWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwiLCJ0b25lTWFwcGluZ01hdGVyaWFsIiwiYWRhcHRpdmUiLCJsb2cyIiwiQURBUFRFRF9MVU1JTkFOQ0UiLCJFZmZlY3RDb21wb3NlciIsInBhc3NlcyIsIm9sZFNpemUiLCJuZXdTaXplIiwib2xkUmVuZGVyZXIiLCJwYXJlbnROb2RlIiwiZHJhd2luZ0J1ZmZlclNpemUiLCJzaG93V2FybiIsIlBvc3RQcm9jZXNzb3JNb2R1bGUiLCJkZWJ1ZyIsImNvbXBvc2VyIiwicmVwbGFjZVJlbmRlcmVyIiwiYWRkUGFzcyIsImN1cnJlbnRQYXNzIiwiX3Bhc3MiLCJwb2x5ZmlsbCIsIl90aGlzNSIsIl90aGlzNiIsImJvb2wiLCJFdmVudHNQYXRjaE1vZHVsZSIsIm9yaWdpbk9iamVjdCIsInBhdGNoRXZlbnRzIiwiVmlydHVhbE1vdXNlTW9kdWxlIiwiZ2xvYmFsTW92ZW1lbnQiLCJjdXN0b21YIiwiY3VzdG9tWSIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImNsaWVudFgiLCJjbGllbnRZIiwibW91c2UiLCJyZWN0IiwicHJvamVjdGlvblBsYW5lIiwicmVxdWlyZSIsImV2IiwiZ2xvYmFsWCIsImdsb2JhbFkiLCJwb2ludGVyTG9ja0VsZW1lbnQiLCJtb3ZlbWVudFgiLCJtb3ZlbWVudFkiLCJob3ZlcnMiLCJuZXN0ZWQiLCJpc0hvdmVyZWQiLCJDb250cm9sc01vZHVsZSIsImNvbnRyb2xzIiwidXBkYXRlTG9vcCIsIkZvZ01vZHVsZSIsIlN0YXRlTW9kdWxlIiwiaXNFcXVhbCIsImlzRXF1YWxEZWZhdWx0IiwiYWN0aW9uR2VuZXJhdGUiLCJlcXVhbENoZWNrIiwiY29uZmlndXJhdGlvbiIsImN1cnJlbnRDb25maWciLCJwcmV2Q29uZmlnIiwiY29uZmlnIiwiZGVmYXVsdCIsImNvbmZpZ3MiLCJ1cGRhdGVzIiwiY29uZmlnTmFtZSIsInRydWVWYWwiLCJmYWxzZVZhbCIsIl9FdmVudERpc3BhdGNoZXIiLCJldmVudEhhbmRsZXIiLCJUaHJlZU9yYml0Q29udHJvbHMiLCJtaW5ab29tIiwibWF4Wm9vbSIsIm1pblBvbGFyQW5nbGUiLCJtYXhQb2xhckFuZ2xlIiwibWluQXppbXV0aEFuZ2xlIiwibWF4QXppbXV0aEFuZ2xlIiwiZW5hYmxlRGFtcGluZyIsImRhbXBpbmdGYWN0b3IiLCJlbmFibGVab29tIiwiem9vbVNwZWVkIiwiZW5hYmxlUm90YXRlIiwicm90YXRlU3BlZWQiLCJlbmFibGVQYW4iLCJrZXlQYW5TcGVlZCIsImF1dG9Sb3RhdGUiLCJhdXRvUm90YXRlU3BlZWQiLCJlbmFibGVLZXlzIiwiVVAiLCJCT1RUT00iLCJtb3VzZUJ1dHRvbnMiLCJPUkJJVCIsIk1PVVNFIiwiWk9PTSIsIlBBTiIsInRhcmdldDAiLCJwb3NpdGlvbjAiLCJ6b29tMCIsImdldFBvbGFyQW5nbGUiLCJnZXRBemltdXRoYWxBbmdsZSIsImNoYW5nZUV2ZW50IiwiU1RBVEUiLCJOT05FIiwicXVhdCIsInNwaGVyaWNhbCIsInJvdGF0ZUxlZnQiLCJnZXRBdXRvUm90YXRpb25BbmdsZSIsInNwaGVyaWNhbERlbHRhIiwicGFuT2Zmc2V0IiwicXVhdEludmVyc2UiLCJ6b29tQ2hhbmdlZCIsImxhc3RQb3NpdGlvbiIsImxhc3RRdWF0ZXJuaW9uIiwib25Db250ZXh0TWVudSIsIm9uTW91c2VEb3duIiwib25Nb3VzZVdoZWVsIiwib25Ub3VjaFN0YXJ0Iiwib25Ub3VjaEVuZCIsIm9uVG91Y2hNb3ZlIiwib25Nb3VzZU1vdmUiLCJvbk1vdXNlVXAiLCJvbktleURvd24iLCJST1RBVEUiLCJET0xMWSIsIlRPVUNIX1JPVEFURSIsIlRPVUNIX0RPTExZIiwiVE9VQ0hfUEFOIiwib2JqZWN0TWF0cml4IiwiZGVsdGFYIiwiZGVsdGFZIiwidGFyZ2V0RGlzdGFuY2UiLCJwYW5MZWZ0IiwiY2xpZW50SGVpZ2h0IiwicGFuVXAiLCJjbGllbnRXaWR0aCIsImRvbGx5U2NhbGUiLCJyb3RhdGVTdGFydCIsImRvbGx5U3RhcnQiLCJwYW5TdGFydCIsInJvdGF0ZUVuZCIsInJvdGF0ZURlbHRhIiwicm90YXRlVXAiLCJkb2xseUVuZCIsImRvbGx5RGVsdGEiLCJkb2xseUluIiwiZ2V0Wm9vbVNjYWxlIiwiZG9sbHlPdXQiLCJwYW5FbmQiLCJwYW5EZWx0YSIsInBhbiIsImtleUNvZGUiLCJ0b3VjaGVzIiwicGFnZVgiLCJwYWdlWSIsImJ1dHRvbiIsImhhbmRsZU1vdXNlRG93blJvdGF0ZSIsImhhbmRsZU1vdXNlRG93bkRvbGx5IiwiaGFuZGxlTW91c2VEb3duUGFuIiwic3RhcnRFdmVudCIsImhhbmRsZU1vdXNlTW92ZVJvdGF0ZSIsImhhbmRsZU1vdXNlTW92ZURvbGx5IiwiaGFuZGxlTW91c2VNb3ZlUGFuIiwiZW5kRXZlbnQiLCJzdG9wUHJvcGFnYXRpb24iLCJoYW5kbGVNb3VzZVdoZWVsIiwiaGFuZGxlS2V5RG93biIsImhhbmRsZVRvdWNoU3RhcnRSb3RhdGUiLCJoYW5kbGVUb3VjaFN0YXJ0RG9sbHkiLCJoYW5kbGVUb3VjaFN0YXJ0UGFuIiwiaGFuZGxlVG91Y2hNb3ZlUm90YXRlIiwiaGFuZGxlVG91Y2hNb3ZlRG9sbHkiLCJoYW5kbGVUb3VjaE1vdmVQYW4iLCJfQ29udHJvbHNNb2R1bGUiLCJPcmJpdENvbnRyb2xzTW9kdWxlIiwiZm9sbG93Iiwic2V0Q29udHJvbHMiLCJzZXRVcGRhdGUiLCJ1cGRhdGVQcm9jZXNzb3IiLCJEeW5hbWljR2VvbWV0cnlNb2R1bGUiLCJnXyIsInVwZGF0ZVBhcmFtcyIsIl9sb29wIiwiVGV4dHVyZU1vZHVsZSIsIl9tYXRlcmlhbCIsIl9yZWYkdHlwZSIsIl9yZWYkb2Zmc2V0IiwiX3JlZiRyZXBlYXQiLCJfcmVmJHdyYXAiLCJfcmVmJG1hcHBpbmciLCJfcmVmJGZpeCIsInRleCIsImlzRGVmZXJyZWQiLCJBbmltYXRpb25Nb2R1bGUiLCJfbWVzaCIsIkRlZmluZU1vZHVsZSIsIl9JbXBvcnRlciIsIk1vZGVsIiwiX2dldFByb3RvdHlwZU9mMiIsIkNhbWVyYU1vZHVsZSIsIk5ldmVyRGVwdGgiLCJBbHdheXNEZXB0aCIsIkxlc3NEZXB0aCIsIkVxdWFsRGVwdGgiLCJHcmVhdGVyRXF1YWxEZXB0aCIsIkdyZWF0ZXJEZXB0aCIsIk5vdEVxdWFsRGVwdGgiLCJNaXhPcGVyYXRpb24iLCJBZGRPcGVyYXRpb24iLCJSZWluaGFyZFRvbmVNYXBwaW5nIiwiVW5jaGFydGVkMlRvbmVNYXBwaW5nIiwiQ2luZW9uVG9uZU1hcHBpbmciLCJUcmlhbmdsZVN0cmlwRHJhd01vZGUiLCJUcmlhbmdsZUZhbkRyYXdNb2RlIiwic1JHQkVuY29kaW5nIiwiUkdCRUVuY29kaW5nIiwiUkdCTTdFbmNvZGluZyIsIlJHQk0xNkVuY29kaW5nIiwiUkdCREVuY29kaW5nIiwic2V0VmFsdWUxZiIsInNldFZhbHVlMWkiLCJzZXRWYWx1ZTJmdiIsInNldFZhbHVlM2Z2Iiwic2V0VmFsdWU0ZnYiLCJzZXRWYWx1ZTJmbSIsInNldFZhbHVlM2ZtIiwic2V0VmFsdWU0Zm0iLCJzZXRWYWx1ZVQxIiwic2V0VmFsdWVUNiIsInNldFZhbHVlMml2Iiwic2V0VmFsdWUzaXYiLCJzZXRWYWx1ZTRpdiIsInNldFZhbHVlMWZ2Iiwic2V0VmFsdWUxaXYiLCJzZXRWYWx1ZVYyYSIsInNldFZhbHVlVjNhIiwic2V0VmFsdWVWNGEiLCJzZXRWYWx1ZU0yYSIsInNldFZhbHVlTTNhIiwic2V0VmFsdWVNNGEiLCJzZXRWYWx1ZVQxYSIsInNldFZhbHVlVDZhIiwiU2luZ2xlVW5pZm9ybSIsIlB1cmVBcnJheVVuaWZvcm0iLCJXZWJHTEF0dHJpYnV0ZXMiLCJXZWJHTFJlbmRlckxpc3QiLCJXZWJHTFJlbmRlckxpc3RzIiwiV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXIiLCJXZWJHTEJ1ZmZlclJlbmRlcmVyIiwiV2ViR0xHZW9tZXRyaWVzIiwiV2ViR0xMaWdodHMiLCJXZWJHTE9iamVjdHMiLCJXZWJHTFByb2dyYW0iLCJXZWJHTFByb2dyYW1zIiwiV2ViR0xUZXh0dXJlcyIsIldlYkdMUHJvcGVydGllcyIsIldlYkdMU3RhdGUiLCJXZWJHTENhcGFiaWxpdGllcyIsIldlYkdMRXh0ZW5zaW9ucyIsIldlYkdMQ2xpcHBpbmciLCJHZW9tZXRyaWVzIiwiTWF0ZXJpYWxzIiwiTG9hZGluZ01hbmFnZXIiLCJUWVBFRF9BUlJBWVMiLCJRdWFkcmF0aWNCZXppZXJQMCIsIkN1YmljQmV6aWVyUDAiLCJDdWJpY1BvbHkiLCJWUkVmZmVjdCIsInZyRGlzcGxheSIsInZyRGlzcGxheXMiLCJleWVUcmFuc2xhdGlvbkwiLCJleWVUcmFuc2xhdGlvblIiLCJyZW5kZXJSZWN0TCIsInJlbmRlclJlY3RSIiwiZ290VlJEaXNwbGF5cyIsImRpc3BsYXlzIiwiZ2V0VlJEaXNwbGF5cyIsImNhdGNoIiwicmVuZGVyZXJTaXplIiwicmVuZGVyZXJVcGRhdGVTdHlsZSIsInJlbmRlcmVyUGl4ZWxSYXRpbyIsImdldFZSRGlzcGxheSIsInNldFZSRGlzcGxheSIsImV5ZVBhcmFtc0wiLCJkZWZhdWx0TGVmdEJvdW5kcyIsImRlZmF1bHRSaWdodEJvdW5kcyIsIndhc1ByZXNlbnRpbmciLCJleWVXaWR0aCIsImV5ZUhlaWdodCIsInNldEZ1bGxTY3JlZW4iLCJyZXF1ZXN0UHJlc2VudCIsImV4aXRQcmVzZW50IiwiY2FuY2VsQW5pbWF0aW9uRnJhbWUiLCJhdXRvU3VibWl0RnJhbWUiLCJleWVQYXJhbXNSIiwiZm92VG9Qcm9qZWN0aW9uIiwiZmllbGRPZlZpZXciLCJmb3ZUb05EQ1NjYWxlT2Zmc2V0IiwicHhzY2FsZSIsImxlZnRUYW4iLCJyaWdodFRhbiIsInB4b2Zmc2V0IiwicHlzY2FsZSIsInVwVGFuIiwiZG93blRhbiIsInB5b2Zmc2V0IiwiZm92UG9ydFRvUHJvamVjdGlvbiIsInJpZ2h0SGFuZGVkIiwiek5lYXIiLCJ6RmFyIiwiaGFuZGVkbmVzc1NjYWxlIiwibW9iaiIsInNjYWxlQW5kT2Zmc2V0IiwiZm92UG9ydCIsInVwRGVncmVlcyIsImRvd25EZWdyZWVzIiwibGVmdERlZ3JlZXMiLCJyaWdodERlZ3JlZXMiLCJXRUJWUiIsIm9uRGlzcGxheSIsInpJbmRleCIsImFsaWduIiwiZm9udEZhbWlseSIsImZvbnRTaXplIiwiZm9udFN0eWxlIiwibGluZUhlaWdodCIsImJhY2tncm91bmRDb2xvciIsInBhZGRpbmciLCJtYXJnaW4iLCJpbm5lckhUTUwiLCJUSFJFRSIsImJvcmRlciIsImN1cnNvciIsInRleHRBbGlnbiIsInRleHRDb250ZW50Iiwib25jbGljayIsIlZSTW9kdWxlIiwiZWZmZWN0IiwiYWRkQ2FsbGJhY2siLCJjaGVja0F2YWlsYWJpbGl0eSIsImdldE1lc3NhZ2VDb250YWluZXIiLCJ2cmJ0biIsImdldEJ1dHRvbiIsIlZSMk1vZHVsZSIsIlZSQ29udHJvbHMiLCJWUkNvbnRyb2xzTmF0aXZlIl0sIm1hcHBpbmdzIjoiO0FBeVJBLFNBQVMsZUFBZSxD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QUFMLENBQVVGLEVBQVYsQ0FBZUYsR0FBS0MsRUFBTCxDQUFVSSxFQUFuQyxDQUNBLEtBQUszSSxFQUFMLENBQVV5SSxHQUFLRixFQUFMLENBQVVJLEVBQVYsQ0FBZUwsR0FBS0ksRUFBTCxDQUFVRixFQUFuQyxDQUNBLEtBQUtuZSxFQUFMLENBQVVvZSxHQUFLRixFQUFMLENBQVVDLEVBQVYsQ0FBZUYsR0FBS0ksRUFBTCxDQUFVQyxFQUFuQyxDQUVBLENBUE0sUUFPSzVKLFFBQVUsS0FBZixDQUF1QixDQUU3QixLQUFLZSxFQUFMLENBQVV3SSxHQUFLQyxFQUFMLENBQVVDLEVBQVYsQ0FBZUMsR0FBS0MsRUFBTCxDQUFVQyxFQUFuQyxDQUNBLEtBQUs1SSxFQUFMLENBQVUwSSxHQUFLQyxFQUFMLENBQVVGLEVBQVYsQ0FBZUYsR0FBS0MsRUFBTCxDQUFVSSxFQUFuQyxDQUNBLEtBQUszSSxFQUFMLENBQVV5SSxHQUFLRixFQUFMLENBQVVJLEVBQVYsQ0FBZUwsR0FBS0ksRUFBTCxDQUFVRixFQUFuQyxDQUNBLEtBQUtuZSxFQUFMLENBQVVvZSxHQUFLRixFQUFMLENBQVVDLEVBQVYsQ0FBZUYsR0FBS0ksRUFBTCxDQUFVQyxFQUFuQyxDQUVBLENBUE0sUUFPSzVKLFFBQVUsS0FBZixDQUF1QixDQUU3QixLQUFLZSxFQUFMLENBQVV3SSxHQUFLQyxFQUFMLENBQVVDLEVBQVYsQ0FBZUMsR0FBS0MsRUFBTCxDQUFVQyxFQUFuQyxDQUNBLEtBQUs1SSxFQUFMLENBQVUwSSxHQUFLQyxFQUFMLENBQVVGLEVBQVYsQ0FBZUYsR0FBS0MsRUFBTCxDQUFVSSxFQUFuQyxDQUNBLEtBQUszSSxFQUFMLENBQVV5SSxHQUFLRixFQUFMLENBQVVJLEVBQVYsQ0FBZUwsR0FBS0ksRUFBTCxDQUFVRixFQUFuQyxDQUNBLEtBQUtuZSxFQUFMLENBQVVvZSxHQUFLRixFQUFMLENBQVVDLEVBQVYsQ0FBZUYsR0FBS0ksRUFBTCxDQUFVQyxFQUFuQyxDQUVBLENBUE0sUUFPSzVKLFFBQVUsS0FBZixDQUF1QixDQUU3QixL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QUFDLENBQUMsQ0FBQztFQUNuQixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNuQixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNuQixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7RUFFbkIsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsZUFBZSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRzs7RUFFbEMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNsQixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7RUFFbEIsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsR0FBRyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRzs7RUFFdEIsS0FBSyxDQUFDLEtBQUssU0FBUyxHQUFHOztHQUV0QixPQUFPLENBQUMsSUFBSSxFQUFFLHVGQUF1RixFQUFFLENBQUM7R0FDeEcsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7R0FFL0I7O0VBRUQsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2QsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOztFQUVkLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELFNBQVMsRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFekIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7RUFDWixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztFQUNaLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0VBQ1osSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7O0VBRVosT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsVUFBVSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRzs7RUFFN0IsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbkIsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbkIsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbkIsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O0VBRW5CLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELGNBQWMsRUFBRSxXQUFXLE1BQU0sR0FBRzs7RUFFbkMsSUFBSSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUM7RUFDakIsSUFBSSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUM7RUFDakIsSUFBSSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUM7RUFDakIsSUFBSSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUM7O0VBRWpCLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELFlBQVksRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFNUIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztFQUNuRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDOztFQUVuQixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDNUQsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQzVELElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUM3RCxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7O0VBRTdELE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELFlBQVksRUFBRSxXQUFXLE1BQU0sR0FBRzs7RUFFakMsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQzs7RUFFekM7O0NBRUQsMEJBQTBCLEVBQUUsV0FBVyxDQUFDLEdBQUc7Ozs7OztFQU0xQyxJQUFJ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LElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7S0FDcEIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7S0FDWCxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzs7S0FFWDs7SUFFRDs7R0FFRCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDOztHQUUzQixPQUFPLElBQUksQ0FBQzs7R0FFWjs7OztFQUlELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxPQUFPLEdBQUcsR0FBRyxHQUFHLEVBQUU7cUJBQzdCLEVBQUUsR0FBRyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsR0FBRyxFQUFFO3FCQUM3QixFQUFFLEdBQUcsR0FBRyxHQUFHLE9BQU8sR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUM7O0VBRW5ELEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Ozs7RUFLbkMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0VBQzNCLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQztFQUMzQixJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7RUFDM0IsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDOztFQUVsRCxPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0VBRW5CLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUNqQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7RUFDakMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0VBQ2pDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFakMsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUVuQixJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7RUFDakMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0VBQ2pDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUNqQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7O0VBRWpDLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELEtBQUssRUFBRSxXQUFXLEdBQUcsRUFBRSxHQUFHLEdBQUc7Ozs7RUFJNUIsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFH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SyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFOUIsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsV0FBVyxFQUFFLFlBQVk7O0VBRXhCLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUNyRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7RUFDckUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO0VBQ3JFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFckUsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsTUFBTSxFQUFFLFlBQVk7O0VBRW5CLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0VBQ2xCLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0VBQ2xCLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0VBQ2xCLElBQUks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SSxFQUFFLFVBQVUsR0FBRyxDQUFDLEVBQUU7R0FDM0IsRUFBRSxHQUFHLElBQUksRUFBRSxVQUFVLEdBQUcsQ0FBQyxFQUFFOztHQUUzQixFQUFFLEdBQUcsSUFBSSxFQUFFLFVBQVUsR0FBRyxDQUFDLEVBQUU7R0FDM0IsRUFBRSxHQUFHLElBQUksRUFBRSxVQUFVLEdBQUcsQ0FBQyxFQUFFO0dBQzNCLEVBQUUsR0FBRyxJQUFJLEVBQUUsVUFBVSxHQUFHLENBQUMsRUFBRTtHQUMzQixFQUFFLEdBQUcsSUFBSSxFQUFFLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7RUFFN0IsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHOztHQUV2RCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQzs7SUFFWixHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7O0lBRTNDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtJQUM1QixNQUFNLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7OztHQUd4QixLQUFLLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxHQUFHOztJQUU5QixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRTtLQUM1QixHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDOztJQUVwQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0lBQzlCLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7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QUMsR0FBRyxDQUFDOztFQUVuQixJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0VBQ3RCLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7RUFDdEIsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7RUFFdEIsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztFQUN0QixJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0VBQ3RCLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0VBRXRCLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRzs7R0FFdEIsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztHQUN0QyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0dBQ3RDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7R0FDdEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7R0FFdEMsTUFBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7O0dBRTdCLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7R0FDdEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztHQUN0QyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0dBQ3RDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0dBRXRDLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztHQUU3QixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0dBQ3RDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7R0FDdEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztHQUN0QyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztHQUV0QyxNQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRzs7R0FFN0IsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztHQUN0QyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0dBQ3RDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7R0FDdEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7R0FFdEMsTUFBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7O0dBRTdCLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7R0FDdEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztHQUN0QyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0dBQ3RDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0dBRXRDLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztHQUU3QixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0dBQ3RDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7R0FDdEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztHQUN0QyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztHQUV0Qzs7RUFFRCxLQUFLLE1BQU0sS0FBSyxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7O0VBRWhELE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELGdCQUFnQixFQUFFLFdBQVcsSUFBSSxFQUFFLEtBQUssR0FBRzs7Ozs7O0VBTTFDLElBQUksU0FBUyxHQUFHLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUM7O0VBRXJELElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDckIsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNyQixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3JCLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQzs7RUFFaEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7O0VBRXhCLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELHFCQUFxQixFQUFFLFdBQVcsQ0FBQyxHQUFHOzs7Ozs7RUFNckMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVE7O0dBRWxCLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRTtHQUMzQyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUU7R0FDM0MsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFOztHQUU1QyxLQUFLLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0dBQ3ZCLENBQUMsQ0FBQzs7RUFFSCxLQUFLLEtBQUssR0FBRyxDQUFDLEdBQUc7O0dBRWhCLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEdBQUcsR0FBRyxFQUFFLENBQUM7O0dBRW5DLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztHQUNuQixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7R0FDNUIsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0dBQzVCLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQzs7R0FFNUIsTUFBTSxLQUFLLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRzs7R0FFcEMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDOztHQUU3QyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7R0FDNUIsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0dBQ25CLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQztHQUM1QixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7O0dBRTVCLE1BQU0sS0FBSyxHQUFHLEdBQUcsR0FBRyxHQUFHOztHQUV2QixDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7O0dBRTdDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxLQUFL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QUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFakUsS0FBSyxZQUFZLEdBQUcsQ0FBQyxHQUFHOztHQUV2QixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztHQUNsQixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztHQUNsQixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztHQUNsQixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7R0FFbEIsWUFBWSxHQUFHLEVBQUUsWUFBWSxDQUFDOztHQUU5QixNQUFNOztHQUVOLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7O0dBRWhCOztFQUVELEtBQUssWUFBWSxJQUFJLEdBQUcsR0FBRzs7R0FFMUIsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7R0FDWixJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztHQUNaLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0dBQ1osSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0dBRVosT0FBTyxJQUFJLENBQUM7O0dBRVo7O0VBRUQsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEdBQUcsWUFBWSxHQUFHLFlBQVksRUFBRSxDQUFDOztFQUVsRSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLEdBQUcsS0FBSyxHQUFHOztHQUV2QyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO0dBQ2hDLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7R0FDaEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztHQUNoQyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDOztHQUVoQyxPQUFPLElBQUksQ0FBQzs7R0FFWjs7RUFFRCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FBQztFQUN6RCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUUsR0FBRyxZQUFZO0dBQzVELE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsR0FBRyxZQUFZLENBQUM7O0VBRW5ELElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDO0VBQzVDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDO0VBQzVDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDO0VBQzVDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDOztFQUU1QyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzs7RUFFeEIsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsTUFBTSxFQUFFLFdBQVcsVUFBVSxHQUFHOztFQUUvQixPQUFPLEVBQUUsVUFBVSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxRQUFRLFVBQVUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLFVBQVUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLFVBQVUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDOztFQUV4STs7Q0FFRCxTQUFTLEVBQUUsV0FBVyxLQUFLLEVBQUUsTUFBTSxHQUFHOztFQUVyQyxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQzs7RUFFdkMsSUFBSSxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7RUFDMUIsSUFBSSxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO0VBQzlCLElBQUksQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztFQUM5QixJQUFJLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0VBRTlCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOztFQUV4QixPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxPQUFPLEVBQUUsV0FBVyxLQUFLLEVBQUUsTUFBTSxHQUFHOztFQUVuQyxLQUFLLEtBQUssS0FBSyxTQUFTLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztFQUN0QyxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQzs7RUFFdkMsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7RUFDMUIsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0VBQzlCLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztFQUM5QixLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7O0VBRTlCLE9BQU8sS0FBSyxDQUFDOztFQUViOztDQUVELFFBQVEsRUFBRSxXQUFXLFFBQVEsR0FBRzs7RUFFL0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQzs7RUFFakMsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFOztDQUVoQyxFQUFFLENBQUM7Ozs7Ozs7Ozs7O0FBV0osU0FBU0EsU0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHOztDQUUzQixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDaEIsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ2hCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7Q0FFaEI7O0FBRUQsTUFBTSxDQUFDLE1BQU0sRUFBRUEsU0FBTyxDQUFDLFNBQVMsRUFBRTs7Q0FFakMsU0FBUyxFQUFFLElBQUk7O0NBRWYsR0FBRyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0VBRXpCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1gsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWCxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7RUFFWCxPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxTQUFTLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0VBRTlCLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO0VBQ2hCLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO0VBQ2hCLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDOztFQUVoQixPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxJQUFJLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0VBRXBCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztFQUVYLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELElBQUksRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFcEIsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O0VBRVgsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsSUFBSSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUVwQixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7RUFFWCxPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxZQUFZLEVBQUUsV0FBVyxLQUFLLEVBQUUsS0FBSyxHQUFHOztFQUV2QyxTQUFTLEtBQUs7O0dBRWIsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxNQUFNO0dBQzlCLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTTtHQUM5QixLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU07R0FDOUIsU0FBUyxNQUFNLElBQUksS0FBSyxFQUFFLHlCQUF5QixHQUFHLEtBQUssRUFBRSxDQUFDOztHQUU5RDs7RUFFRCxPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxZQUFZLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0VBRWhDLFNBQVMsS0FBSzs7R0FFYixLQUFLLENBQUMsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUM7R0FDdEIsS0FBSyxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDO0dBQ3RCLEtBQUssQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQztHQUN0QixTQUFTLE1BQU0sSUFBSSxLQUFLLEVBQUUseUJBQXlCLEdBQUcsS0FBSyxFQUFFLENBQUM7O0dBRTlEOztFQUVEOztDQUVELEtBQUssRUFBRSxZQUFZOztFQUVsQixPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDOztFQUV0RDs7Q0FFRCxJQUFJLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0VBRXBCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNiLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7RUFFYixPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxHQUFHLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHOztFQUV0QixLQUFLLENBQUMsS0FBSyxTQUFTLEdBQUc7O0dBRXRCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsdUZBQXVGLEVBQUUsQ0FBQztHQUN4RyxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUUvQjs7RUFFRCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7O0VBRWQsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsU0FBUyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUV6QixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztFQUNaLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0VBQ1osSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7O0VBRVosT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsVUFBVSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRzs7RUFFN0IsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbkIsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbkIsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O0VBRW5CLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELGVBQWUsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLEdBQUc7O0VBRWxDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbEIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNsQixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztFQUVsQixPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxHQUFHLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHOztFQUV0QixLQUFLLENBQUMsS0FBSyxTQUFTLEdBQUc7O0dBRXRCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsdUZBQXVGLEVBQUUsQ0FBQztHQUN4RyxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUUvQjs7RUFFRCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7O0VBRWQsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsU0FBUyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUV6QixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztFQUNaLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0VBQ1osSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7O0VBRVosT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsVUFBVSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRzs7RUFFN0IsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbkIsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbkIsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O0VBRW5CLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELFFBQVEsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLEdBQUc7O0VBRTNCLEtBQUssQ0FBQyxLQUFLLFNBQVMsR0FBRzs7R0FFdEIsT0FBTyxDQUFDLElBQUksRUFBRSxpR0FBaUcsRUFBRSxDQUFDO0dBQ2xILE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0dBRXBDOztFQUVELElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNkLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7RUFFZCxPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxjQUFjLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0VBRW5DLElBQUksQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDO0VBQ2pCLElBQUksQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDO0VBQ2pCLElBQUksQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDOztFQUVqQixPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxlQUFlLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHOztFQUVsQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNuQixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNuQixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7RUFFbkIsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsVUFBVSxFQUFFLFlBQVk7O0VBRXZCLElBQUksVUFBVSxHQUFHLElBQUluRSxZQUFVLEVBQUUsQ0FBQzs7RUFFbEMsT0FBTyxTQUFTLFVBQVUsRUFBRSxLQUFLLEdBQUc7O0dBRW5DLEtBQUssRUFBRSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sT0FBTyxLQUFLLEdBQUc7O0lBRTNDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsNkZBQTZGLEVBQUUsQ0FBQzs7SUFFL0c7O0dBRUQsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQzs7R0FFaEUsQ0FBQzs7RUFFRixFQUFFOztDQUVILGNBQWMsRUFBRSxZQUFZOztFQUUzQixJQUFJLFVBQVUsR0FBRyxJQUFJQSxZQUFVLEVBQUUsQ0FBQzs7RUFFbEMsT0FBTyxTQUFTLGNBQWMsRUFBRSxJQUFJLEVBQUUsS0FBSyxHQUFHOztHQUU3QyxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDOztHQUUxRSxDQUFDOztFQUVGLEVBQUU7O0NBRUgsWUFBWSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUU1QixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0VBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7O0VBRW5CLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDOUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUM5QyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztFQUU5QyxPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxZQUFZLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0VBRTVCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7RUFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQzs7RUFFbkIsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDekQsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDekQsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDekQsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDOztFQUV6RCxPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRTlCOztDQUVELGVBQWUsRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFL0IsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztFQUN2QyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7O0VBSTNDLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ25DLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ25DLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ25DLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Ozs7RUFJcEMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFB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Q0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUNqQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7RUFDakMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztFQUVqQyxPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0VBRW5CLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUNqQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7RUFDakMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztFQUVqQyxPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxLQUFLLEVBQUUsV0FBVyxHQUFHLEVBQUUsR0FBRyxHQUFHOzs7O0VBSTVCLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztFQUN0RCxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxD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QyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFVixDQUFDOztDQUVGLEtBQUssU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUc7O0VBRTNCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsK0VBQStFLEVBQUUsQ0FBQzs7RUFFakc7O0NBRUQ7O0FBRUQsTUFBTSxDQUFDLE1BQU0sRUFBRUEsU0FBTyxDQUFDLFNBQVMsRUFBRTs7Q0FFakMsU0FBUyxFQUFFLElBQUk7O0NBRWYsR0FBRyxFQUFFLFdBQVcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHOztFQUVoRyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztFQUV2QixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQzVELEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7RUFDNUQsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztFQUM3RCxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDOztFQUU3RCxPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxRQUFRLEVBQUUsWUFBWTs7RUFFckIsSUFBSSxDQUFDLEdBQUc7O0dBRVAsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztHQUNWLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7R0FDVixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0dBQ1YsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7R0FFVixDQUFDOztFQUVGLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELEtBQUssRUFBRSxZQUFZOztFQUVsQixPQUFPLElBQUlBLFNBQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7O0VBRWhEOztDQUVELElBQUksRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFcEIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztFQUN2QixJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDOztFQUVwQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQzNFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDM0UsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUMvRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztFQUVuRixPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxZQUFZLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0VBRTVCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7O0VBRXhDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDcEIsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUNwQixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztFQUVwQixPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxZQUFZLEVBQUUsV0FBVyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRzs7RUFFOUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUNyQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQ3JDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRXJDLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELFNBQVMsRUFBRSxXQUFXLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFHOztFQUUzQyxJQUFJLENBQUMsR0FBRztHQUNQLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7R0FDNUIsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztHQUM1QixLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO0dBQzVCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7R0FDNUIsQ0FBQzs7RUFFRixPQUFPLElBQUksQ0FBQzs7RUFFWjs7Q0FFRCxlQUFlLEVBQUUsWUFBWTs7RUFFNUIsSUFBSSxFQUFFLEdBQUcsSUFBSW9PLFNBQU8sRUFBRSxDQUFDOztFQUV2QixPQUFPLFNBQVMsZUFBZSxFQUFFLENBQUMsR0FBRzs7R0FFcEMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztHQUN2QixJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDOztHQUVwQixJQUFJLE1BQU0sR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLG1CQUFtQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztHQUN6RCxJQUFJLE1BQU0sR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLG1CQUFtQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztHQUN6RCxJQUFJLE1BQU0sR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLG1CQUFtQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7R0FFekQsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUM7R0FDM0IsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUM7R0FDM0IsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUM7O0dBRTNCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDO0dBQzNCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDO0dBQzNCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDOztHQUUzQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQztHQUMzQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQztHQUMzQixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQzs7R0FFN0IsT0FBTyxJQUFJLENBQUM7O0dBRVosQ0FBQzs7RUFFRixFQUFFOztDQUVILHFCQUFxQixFQUFFLFdBQVcsS0FBSyxHQUFHOztFQUV6QyxLQUFLLEVBQUUsS0FBSyxJQUFJLEtBQUssQ0FBQyxPQUFPLE9BQU8sS0FBSyxHQUFHOztHQUUzQyxPQUFPLENBQUMsS0FBSyxFQUFFLHNHQUFzRyxFQUFFLENBQUM7O0dBRXhIOztFQUVELElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7O0VBRXZCLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7RUFDMUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUN6QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQ3pDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRXpDLEtBQUssS0FBSyxDQUFDLEtBQUssS0FBSyxLQUFLLEdBQUc7O0dBRTVCLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0dBRW5ELEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ2hCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDbEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7R0FFWixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7R0FDdEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0dBQ3RCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7O0dBRWxCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztHQUN0QixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7R0FDdEIsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0dBRWpCLE1BQU0sS0FBSyxLQUFLLENBQUMsS0FBSyxLQUFLLEtBQUssR0FBRzs7R0FFbkMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7R0FFbkQsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0dBQ3RCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztHQUN0QixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7R0FFaEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDaEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDaEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDOztHQUVkLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztHQUN0QixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7R0FDdEIsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0dBRWpCLE1BQU0sS0FBSyxLQUFLLENBQUMsS0FBSyxLQUFLLEtBQUssR0FBRzs7R0FFbkMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7R0FFbkQsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0dBQ3RCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDbEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztHQUV0QixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7R0FDdEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDaEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztHQUV0QixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ2xCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7R0FDWixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7R0FFakIsTUFBTSxLQUFLLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxHQUFHOztHQUVuQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztHQUVuRCxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUNoQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7R0FDdEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztHQUV0QixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUNoQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7R0FDdEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztHQUV0QixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7R0FDZCxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUNoQixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7R0FFakIsTUFBTSxLQUFLLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxHQUFHOztHQUVuQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztHQUVuRCxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUNoQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7R0FDdEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztHQUV0QixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0dBQ1osRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDaEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7R0FFbEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUNsQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7R0FDdEIsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztHQUV2QixNQUFNLEtBQUssS0FBSyxDQUFDLEtBQUssS0FBSyxLQUFLLEdBQUc7O0dBRW5DLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0dBRW5ELEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ2hCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztHQUNkLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztHQUVoQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7R0FDdEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDaEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztHQUV0QixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7R0FDdEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDaEIsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztHQUV2Qjs7O0VBR0QsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNaLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDWixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDOzs7RUFHYixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ2IsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNiLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDYixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDOztFQUViLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELDBCQUEwQixFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUUxQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztFQUV2QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0VBQzNDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDdkMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUMxQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQzFDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7O0VBRTFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO0VBQzFCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ2xCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztFQUVsQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNsQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztFQUMxQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFbEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDbEIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDbEIsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7OztFQUczQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ1osRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNaLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7OztFQUdiLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDYixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ2IsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENB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RyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDaEUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0VBQ2hFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUNqRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0VBRWpFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUNoRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDaEUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0VBQ2pFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7RUFFakUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDeEQsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDeEQsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDeEQsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0VBRXpELEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ3hELEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ3hELEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQ3hELEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztFQUV6RCxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUN4RCxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUN4RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUN6RCxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7RUFFekQsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDeEQsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDeEQsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDekQsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0VBRXpELE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELGNBQWMsRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFOUIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7RUFFdkIsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztFQUN4RCxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0VBQ3hELEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7RUFDekQsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQzs7RUFFekQsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsc0JBQXNCLEVBQUUsWUFBWTs7RUFFbkMsSUFBSSxFQUFFLEdBQUcsSUFBSUEsU0FBTyxFQUFFLENBQUM7O0VBRXZCLE9BQU8sU0FBUyxzQkFBc0IsRUFBRSxTQUFTLEdBQUc7O0dBRW5ELE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0lBRW5ELEVBQUUsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUMzQixFQUFFLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDM0IsRUFBRSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztJQUUzQixFQUFFLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDOztJQUV4QixTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDOztJQUV4Qzs7R0FFRCxPQUFPLFNBQVMsQ0FBQzs7R0FFakIsQ0FBQzs7RUFFRixFQUFFOztDQUVILFdBQVcsRUFBRSxZQUFZOztFQUV4QixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztFQUV2QixJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDaEUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0VBQ2hFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUNqRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Ozs7O0VBS2pFO0dBQ0MsR0FBRztJQUNGLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2QsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0lBQ2xCO0dBQ0QsR0FBRztJQUNGLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2QsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0lBQ2xCO0dBQ0QsR0FBRztJQUNGLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2QsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0lBQ2xCO0dBQ0QsR0FBRztJQUNGLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2QsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO09BQ2YsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0lBQ2xCOztJQUVBOztFQUVGOztDQUVELFNBQVMsRUFBRSxZQUFZOztFQUV0QixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0VBQ3ZCLElBQUksR0FBRyxDQUFDOztFQUVSLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztFQUNoRCxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7RUFDaEQsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDOztFQUVoRCxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7RUFDbEQsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQ2xELEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQzs7RUFFcEQsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsV0FBVyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUUzQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztFQUV2QixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O0VBRWYsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsVUFBVSxFQUFFLFdBQVcsQ0FBQyxFQUFFLGlCQUFpQixHQUFHOzs7RUFHN0MsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVE7R0FDckIsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFROztHQUVmLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0dBQzFELEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0dBQzFELEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFO0dBQzVELEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFOztHQUU5RCxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0dBQy9HLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7R0FDL0csR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztHQUMvRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0VBRWpILElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0VBRXhELEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRzs7R0FFaEIsSUFBSSxHQUFHLEdBQUcsbUVBQW1FLENBQUM7O0dBRTlFLEtBQUssaUJBQWlCLEtBQUssSUFBSSxHQUFHOztJQUVqQyxNQUFNLElBQUksS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDOztJQUV2QixNQUFNOztJQUVOLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7O0lBRXBCOztHQUVELE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDOztHQUV2Qjs7RUFFRCxJQUFJLE1BQU0sR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDOztFQUVyQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztFQUN2QixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsS0FBSyxNQUFNLENBQUM7RUFDakksRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDO0VBQ2pJLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQzs7RUFFakksRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUM7RUFDdkIsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDO0VBQ2pJLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztFQUNqSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsS0FBSyxNQUFNLENBQUM7O0VBRWpJLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDO0VBQ3ZCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztFQUNqSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsS0FBSyxNQUFNLENBQUM7RUFDbEksRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDOztFQUVsSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztFQUN4QixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsS0FBSyxNQUFNLENBQUM7RUFDbEksRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDO0VBQ2xJLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQzs7RUFFbEksT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsS0FBSyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUVyQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0VBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O0VBRTlCLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztFQUN6QyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7RUFDekMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0VBQzFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQzs7RUFFMUMsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsaUJBQWlCLEVBQUUsWUFBWTs7RUFFOUIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7RUFFdkIsSUFBSSxRQUFRLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFD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OztFQUUzQixPQUFPLFNBQVMsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsS0FBSyxHQUFHOztHQUV4RCxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztHQUV2QixJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7R0FDMUQsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO0dBQzFELElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7O0dBRzNELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztHQUM3QixLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDOztHQUV6QixRQUFRLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztHQUN0QixRQUFRLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztHQUN0QixRQUFRLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7O0dBR3RCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0dBRXBCLElBQUksS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7R0FDbkIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztHQUNuQixJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztHQUVuQixNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQztHQUM5QixNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQztHQUM5QixNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQzs7R0FFOUIsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUM7R0FDOUIsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUM7R0FDOUIsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUM7O0dBRTlCLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDO0dBQzlCLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDO0dBQzlCLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLElBQUksS0FBSyxDQUFDOztHQUUvQixVQUFVLENBQUMscUJBQXFCLEVBQUUsTUFBTSxFQUFFLENBQUM7O0dBRTNDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0dBQ2IsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7R0FDYixLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7R0FFYixPQUFPLElBQUksQ0FBQzs7R0FFWixDQUFDOztFQUVGLEVBQUU7O0NBRUgsZUFBZSxFQUFFLFdBQVcsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUc7O0VBRWpFLEtBQUssR0FBRyxLQUFLLFNBQVMsR0FBRzs7R0FFeEIsT0FBTyxDQUFDLElBQUksRUFBRSxzR0FBc0csRUFBRSxDQUFDOztHQUV2SDs7RUFFRCxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0VBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEtBQUssS0FBSyxHQUFHLElBQUksRUFBRSxDQUFDO0VBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEtBQUssR0FBRyxHQUFHLE1BQU0sRUFBRSxDQUFDOztFQUVwQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssR0FBRyxJQUFJLE9BQU8sS0FBSyxHQUFHLElBQUksRUFBRSxDQUFDO0VBQzVDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLE1BQU0sT0FBTyxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUM7RUFDNUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLEdBQUcsSUFBSSxFQUFFLEtBQUssR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDO0VBQzFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLEtBQUssR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDOztFQUUxQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ3BELEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDcEQsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNyRCxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7O0VBRXZELE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELGdCQUFnQixFQUFFLFdBQVcsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUc7O0VBRWxFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7RUFDdkIsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLEtBQUssR0FBRyxJQUFJLEVBQUUsQ0FBQztFQUMvQixJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLE1BQU0sRUFBRSxDQUFDO0VBQy9CLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7O0VBRTdCLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUM7RUFDN0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsTUFBTSxLQUFLLENBQUMsQ0FBQztFQUM3QixJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDOztFQUUzQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0VBQzFELEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7RUFDMUQsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0VBQzdELEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7O0VBRXJELE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELE1BQU0sRUFBRSxXQUFXLE1BQU0sR0FBRzs7RUFFM0IsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztFQUN2QixJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDOztFQUV6QixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztHQUUvQixLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsT0FBTyxLQUFLLENBQUM7O0dBRXhDOztFQUVELE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELFNBQVMsRUFBRSxXQUFXLEtBQUssRUFBRSxNQUFNLEdBQUc7O0VBRXJDLEtBQUssTUFBTSxLQUFLLFNBQVMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDOztFQUV2QyxNQUFNLElBQUksQ0FB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R0FBRyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzs7Q0FFdEMsT0FBTyxDQUFDLENBQUM7O0NBRVQ7Ozs7Ozs7OztBQVNELFNBQVM2bEcsWUFBVSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUM5RCxTQUFTQyxZQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFOzs7O0FBSTlELFNBQVNDLGFBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU3QixLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxHQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztNQUNsRCxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRXpDOztBQUVELFNBQVNDLGFBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU3QixLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUztFQUNyQixFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztNQUNyQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUztFQUMxQixFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFekMsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFB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RUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztNQUMzRCxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7TUFDM0QsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDOztNQUUzRCxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O01BRTFCLE9BQU8sSUFBSSxDQUFDOztNQUVaOztLQUVELEtBQUssS0FBSyxHQUFHLHFFQUFxRSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRzs7O01BR3ZHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztNQUMzRCxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7TUFDM0QsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDOztNQUUzRCxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O01BRTFCLE9BQU8sSUFBSSxDQUFDOztNQUVaOztLQUVELE1BQU07O0lBRVAsS0FBSyxLQUFLLENBQUM7SUFDWCxLQUFLLE1BQU07O0tB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QUFJLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDO0VBQzlHLEtBQUssSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQzs7RUFFOUcsS0FBSyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHOztHQUUzQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQztHQUM5QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7O0dBRXRDOztFQUVELEtBQUssSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsR0FBRzs7R0FFckQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUM7O0dBRXhEOztFQUVELEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0VBQ3JELEtBQUssSUFBSSxDQUFDLGVBQWUsS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDOztFQUV0RixLQUFLLElBQUksQ0FBQyxRQUFRLEtBQUs2cEMsZ0JBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7RUFDdEUsS0FBSyxJQUFJLENBQUMsT0FBTyxLQUFLLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFH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QUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOztHQUVsQzs7RUFFRCxLQUFLLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRzs7R0FFekIsR0FBRyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0dBQ25DLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzs7R0FFbkMsTUFBTTs7R0FFTixHQUFHLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7R0FDbkMsR0FBRyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOztHQUVuQzs7RUFFRCxLQUFLLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRzs7R0FFekIsR0FBRyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0dBQ25DLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzs7R0FFbkMsTUFBTTs7R0FFTixHQUFHLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7R0FDbkMsR0FBRyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOztHQUVuQzs7RUFFRCxTQUFTLEdBQUcsSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsUUFBUSxHQUFHOztFQUUxRDs7Q0FFRCxV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LEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUM7R0FDN0UsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQztHQUM3RSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDO0dBQzdFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUM7R0FDN0UsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQztHQUM3RSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFD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QUM7RUFDaEQsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFaEQsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUNoRCxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQ2hELElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRWhELEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUM1QyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDNUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztFQUU1QyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDNUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQzVDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7RUFFNUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQzVDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUM1QyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0VBRTVDLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELGNBQWMsRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFOUIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7RUFFdkIsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0VBQ3pDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztFQUN6QyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7O0VBRXpDLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELFdBQVcsRUFBRSxZ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RyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDOztFQUU3QyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztFQUN2QixFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDO0VBQzdDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsS0FBSyxNQUFNLENBQUM7O0VBRTdDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDO0VBQ3ZCLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsS0FBSyxNQUFNLENBQUM7RUFDN0MsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQzs7RUFFN0MsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsU0FBUyxFQUFFLFlBQVk7O0VBRXRCLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztFQUUzQixHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7RUFDNUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQzVDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMs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SUFBSSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztFQUV2RSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztFQUN2RixNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztFQUN2RixNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztFQUN2RixNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztFQUN2RixNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztFQUN4RixNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FB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R0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDOztNQUUvQyxNQUFNLEtBQUssRUFBRSxJQUFJLE1BQU0sR0FBRzs7OztNQUkxQixFQUFFLEdBQUcsQ0FBQyxDQUFDO01BQ1AsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDO01BQzFELE9BQU8sR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7O01BRW5DLE1BQU07Ozs7TUFJTixFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxHQUFHLEdBQUcsU0FBUyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUM7TUFDL0MsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUM7TUFDbkYsT0FBTyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7O01BRS9DOztLQUVEOztJQUVELE1BQU07Ozs7SUFJTixFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUMzQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDeEMsT0FBTyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtB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QUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDO0dBQzFDLElBQUksR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDOztHQUUxQyxNQUFNOztHQUVOLElBQUksR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDO0dBQzFDLElBQUksR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDOztHQUUxQzs7RUFFRCxLQUFLLE9BQU8sSUFBSSxDQUFDLEdBQUc7O0dBRW5CLEtBQUssR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDO0dBQzNDLEtBQUssR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDOztHQUUzQyxNQUFNOztHQUVOLEtBQUssR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDO0dBQzNDLEtBQUssR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDOztHQUUzQzs7RUFFRCxLQUFLLEVBQUUsSUFBSSxHQUFHLEtBQUssUUFBUSxLQUFLLEdBQUcsSUFBSSxFQUFFLEdBQUcsT0FBTyxJQUFJLENBQUM7Ozs7O0VBS3hELEtBQUssS0FBSyxHQUFHLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLLENBQUM7O0VBRWxELEtBQUssS0FBSyxHQUFHLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLLENBQUM7O0VBRWxE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QUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztJQUVaOztHQUVELE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztHQUU3QixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztHQUU1QyxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsT0FBTyxHQUFHOztJQUVoQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDbkMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztJQUVuQyxNQUFNOztJQUVOLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1osSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7SUFFakM7O0dBRUQsTUFBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7O0dBRTdCLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7R0FFOUMsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU8sR0FBRzs7SUFFaEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNqQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztJQUVqQyxNQUFNOztJQUVOLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lB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QUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztFQUN2QixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztFQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztFQUN0QixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztFQUN0QixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztFQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztFQUN4QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQzs7OztFQUkzQixJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7Ozs7RUFJeEIsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQzs7RUFFL0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0dBRWpELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDOztHQUU1Qzs7OztFQUlELElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7O0VBRTNCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztHQUUvQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQzs7R0FFeEM7Ozs7RUFJRCxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDOztFQUV6QixNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7R0FFOUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7O0dBRXRDOzs7O0VBSUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztHQUU3RCxJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUU5QyxLQUFLLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLEtBQUssU0FBUyxHQUFHOztJQUU1QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7SUFFN0I7O0dBRUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0lBRXRELElBQUksR0FBRyxHQUFHLGFBQWEsRUFBRSxDQUFDLEVBQUUsRUFBRSxPQUFPLEdBQUcsRUFBRSxDQUFDOztJQUUzQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7S0FFNUMsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDOztLQUVsQixPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDOztLQUUzQjs7SUFFRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQzs7SUFFeEM7O0dBRUQ7Ozs7RUFJRCxJQUFJLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDOztFQUV2QyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7R0FFckQsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO0dBQ3JCLFdBQVcsQ0FBQyxJQUFJLEdBQUcsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQzs7OztHQUkxQyxLQUFLLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEtBQUssU0FBUyxHQUFHOztJQUUvQyxXQUFXLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQzs7SUFFMUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztLQUVuRSxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7O0tBRXJFOztJQUVEOzs7O0dBSUQsS0FBSyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxLQUFLLFNBQVMsR0FBRzs7SUFFOUMsV0FBVyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7O0lBRXpCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7S0FFbEUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDOztLQUVuRTs7SUFFRDs7R0FFRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQzs7R0FFdEM7Ozs7RUFJRCxJQUFJLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDOztFQUV2QyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7R0FFckQsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDOzs7O0dBSXJCLEtBQUssWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsS0FBSyxTQUFTLEdBQUc7O0lBRXBELFdBQVcsQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDOztJQUUvQixNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0tBRXhFLElBQUksZUFBZSxHQUFHLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUM7S0FDM0QsSUFBSSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7O0tBRTFCLGdCQUFnQixDQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0tBQy9DLGdCQUFnQixDQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0tBQy9DLGdCQUFnQixDQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDOztLQUUvQyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxDQUFDOztLQUVuRDs7SUFFRDs7OztHQUlELEtBQUssWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQVcsS0FBSyxTQUFTLEdBQUc7O0lBRWxELFdBQVcsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDOztJQUU3QixNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0tBRXRFLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQzs7S0FFM0U7O0lBRUQ7O0dBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7O0dBRXRDOzs7O0VBSUQsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQzs7RUFFckMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0dBRXBELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDOztHQUVsRDs7OztFQUlELElBQUksV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7O0VBRXJDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztHQUVwRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQzs7R0FFbEQ7Ozs7RUFJRCxJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDOztFQUV6QyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7R0FFdEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFF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Ozs7R0FJM0MsS0FBSyxLQUFLLEdBQUc7O0lBRVosSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQzs7SUFFMUIsS0FBSyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsR0FBRzs7S0FFMUIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDOztLQUVuQzs7SUFFRCxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHOztLQUVuRCxJQUFJLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0tBRXhCLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7S0FDeEIsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQzs7S0FFeEIsTUFBTSxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsRUFBRSxHQUFHLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHOztNQUV6RCxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7TUFDMUIsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO01BQzFCLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7TUFFMUIsRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUM7TUFDOUIsRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUM7TUFDOUIsRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUM7O01BRTlCLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO01BQ3hCLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO01BQ3hCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7O01BRWYsT0FBTyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7TUFDdEIsT0FBTyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO01BQzFCLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzs7TUFFMUIsT0FBTyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7TUFDdEIsT0FBTyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO01BQzFCLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzs7TUFFMUIsT0FBTyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7TUFDdEIsT0FBTyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO01BQzFCLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzs7TUFFMUI7O0tBRUQ7O0lBRUQsTUFBTTs7OztJQUlOLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRzs7S0FFeEQsRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7S0FDN0IsRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0tBQ2pDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLENB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Q0FBQztDQUN6QixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7Ozs7Q0FJbkIsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLElBQUksS0FBSyxHQUFHLGFBQWEsRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDakcsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsS0FBSyxHQUFHLGFBQWEsRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDakcsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssS0FBSyxNQUFNLEVBQUUsYUFBYSxFQUFFLGFBQWEsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUNqRyxVQUFVLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLGFBQWEsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUNqRyxVQUFVLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLElBQUksS0FBSyxHQUFHLGFBQWEsRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDakcsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxLQUFLLEdBQUcsYUFBYSxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7OztDQUlqRyxJQUFJLENBQUMsUUFBUSxF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QUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0VBQ3hELElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7RUFDeEQsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDO0VBQ3hDLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQzs7RUFFeEMsSUFBSSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNuQixJQUFJLEtBQUssR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ3BCLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDbEIsSUFBSSxNQUFNLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFckIsS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksR0FBRzs7R0FFekIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0dBQ2xFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztHQUNwRSxJQUFJLE1BQU0sR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztHQUMxRCxJQUFJLE1BQU0sR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7R0FFM0QsSUFBSSxJQUFJLE1BQU0sS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLEVBQUUsQ0FBQztHQUMvQyxLQUFLLEdBQUcsSUFBSSxHQUFHLE1BQU0sS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQztHQUNwRCxHQUFHLElBQUksTUFBTSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssRUFBRSxDQUFDO0dBQzlDLE1BQU0sR0FBRyxHQUFHLEdBQUcsTUFBTSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssRUFBRSxDQUFDOztHQUVyRDs7RUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDOztFQUV4Rjs7Q0FFRCxNQUFNLEVBQUUsV0FBVyxJQUFJLEdBQUc7O0VBRXpCLElBQUksSUFBSSxHQUFHN0QsVUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7RUFFeEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztFQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0VBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7RUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztFQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0VBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7RUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQzs7RUFFM0IsS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7O0VBRTVFLE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELEVBQUUsQ0FBQzs7Ozs7O0FBTUosU0FBU3lzSCxpQkFBZSxFQUFFLEVBQUUsR0FBRzs7Q0FFOUIsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDOztDQUVqQixTQUFTLFlBQVksRUFBRSxTQUFTLEVBQUUsVUFBVSxHQUFHOztFQUU5QyxJQUFJLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO0VBQzVCLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDOztFQUVqRSxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7O0VBRS9CLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDO0VBQ3BDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQzs7RUFFMUMsU0FBUyxDQUFDLGdCQUFnQixFQUFFLENBQUM7O0VBRTdCLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUM7O0VBRXBCLEtBQUssS0FBSyxZQUFZLFlBQVksR0FBRzs7R0FFcEMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUM7O0dBRWhCLE1BQU0sS0FBSyxLQUFLLFlBQVksWUFBWSxHQUFHOztHQUUzQyxPQUFPLENBQUMsSUFBSSxFQUFFLDhDQUE4QyxFQUFFLENBQUM7O0dBRS9ELE1BQU0sS0FBSyxLQUFLLFlBQVksV0FBVyxHQUFHOztHQUUxQyxJQUFJLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQzs7R0FFekIsTUFBTSxLQUFLLEtBQUssWUFBWSxVQUFVLEdBQUc7O0dBRXpDLElBQUksR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDOztHQUVoQixNQUFNLEtBQUssS0FBSyxZQUFZLFdBQVcsR0FBRzs7R0FFMUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUM7O0dBRXZCLE1BQU0sS0FBSyxLQUFLLFlBQVksVUFBVSxHQUFHOztHQUV6QyxJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQzs7R0FFZCxNQUFNLEtBQUssS0FBSyxZQUFZLFNBQVMsR0FBRzs7R0FFeEMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7O0dBRWYsTUFBTSxLQUFLLEtBQUssWUFBWSxVQUFVLEdBQUc7O0dBRXpDLElBQUksR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDOztHQUV4Qjs7RUFFRCxPQUFPO0dBQ04sTUFBTSxFQUFFLE1BQU07R0FDZCxJQUFJLEVBQUUsSUFBSTtHQUNWLGVBQWUsRUFBRSxLQUFLLENBQUMsaUJBQWlCO0dBQ3hDLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTztHQUMxQixDQUFDOztFQUVGOztDQUVELFNBQVMsWUFBWSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxHQUFHOztFQUV0RCxJQUFJLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO0VBQzVCLElBQUksV0FBVyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUM7O0VBRXhDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUVwQyxLQUFLLFNBQVMsQ0FBQyxPQUFPLEtBQUssS0FBSyxHQUFHOztHQUVsQyxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDOztHQUVuRCxNQUFNLEtBQUssV0FBVyxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUMsR0FBRzs7OztHQUl2QyxFQUFFLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7O0dBRXpDLE1BQU0sS0FBSyxXQUFXLENBQUMsS0FBSyxLQUFLLENBQUMsR0FBRzs7R0FFckMsT0FBTyxDQUFDLEtBQUssRUFBRSx5S0FBeUssRUFBRSxDQUFDOztHQUUzTCxNQUFNOztHQUVOLEVBQUUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLGlCQUFpQjtJQUN6RSxLQUFLLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQzs7R0FFaEYsV0FBVyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7O0dBRXRCOztFQUVEOzs7O0NBSUQsU0FBUyxHQUFHLEVBQUUsU0FBUyxHQUFHOztFQUV6QixLQUFLLFNBQVMsQ0FBQyw0QkFBNEIsR0FBRyxTQUFTLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQzs7RUFFekUsT0FBTyxPQUFPLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDOztFQUVqQzs7Q0FFRCxTQUFTLE1BQU0sRUFBRSxTQUFTLEdBQUc7O0VBRTVCLElBQUksSUFBSSxHQUFHLE9BQU8sRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7O0VBRXJDLEtBQUssSUFBSSxHQUFHOztHQUVYLEVBQUUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztHQUUvQixPQUFPLE9BQU8sRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7O0dBRWpDOztFQUVEOztDQUVELFNBQVMsTUFBTSxFQUFFLFNBQVMsRUFBRSxVQUFVLEdBQUc7O0VBRXhDLEtBQUssU0FBUyxDQUFDLDRCQUE0QixHQUFHLFNBQVMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDOztFQUV6RSxJQUFJLElBQUksR0FBRyxPQUFPLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDOztFQUVyQyxLQUFLLElBQUksS0FBSyxTQUFTLEdBQUc7O0dBRXpCLE9BQU8sRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsWUFBWSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQzs7R0FFbEUsTUFBTSxLQUFLLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLE9BQU8sR0FBRzs7R0FFOUMsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDOztHQUVuRCxJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7O0dBRWpDOztFQUVEOztDQUVELE9BQU87O0VBRU4sR0FBRyxFQUFFLEdBQUc7RUFDUixNQUFNLEVBQUUsTUFBTTtFQUNkLE1BQU0sRUFBRSxNQUFNOztFQUVkLENBQUM7O0NBRUY7Ozs7OztBQU1ELFNBQVN4NkYsbUJBQWlCLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFbEMsS0FBSyxDQUFDLENBQUMsV0FBVyxLQUFLLENBQUMsQ0FBQyxXQUFXLEdBQUc7O0VBRXRDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDOztFQUVyQyxNQUFNLEtBQUssQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxDQUFDLE9BQU8sR0FBRzs7RUFFL0QsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzs7RUFFbkMsTUFBTSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFHOztFQUU3QyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDOztFQUVyQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHOztFQUV6QixPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7RUFFakIsTUFBTTs7RUFFTixPQUFPLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFbkI7O0NBRUQ7O0FBRUQsU0FBU0MsMEJBQXdCLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFekMsS0FBSyxDQUFDLENBQUMsV0FBVyxLQUFLLENBQUMsQ0FBQyxXQUFXLEdBQUc7O0VBRXRDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDOztFQUVyQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHOztFQUVwQixPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7RUFFakIsTUFBTTs7RUFFTixPQUFPLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFbkI7O0NBRUQ7O0FBRUQsU0FBU3c2RixpQkFBZSxHQUFHOztDQUUxQixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7Q0FDaEIsSUFBSSxlQUFlLEdBQUcsRUFBRSxDQUFDLENBQUM7O0NBRTFCLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztDQUNyQixJQUFJLG9CQUFvQixHQUFHLEVBQUUsQ0FBQyxDQUFDOztDQUUvQixTQUFTLElBQUksR0FBRzs7RUFFZixlQUFlLEdBQUcsRUFBRSxDQUFDLENBQUM7RUFDdEIsb0JBQW9CLEdBQUcsRUFBRSxDQUFDLENBQUM7O0VBRTNCOztDQUVELFNBQVMsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxLQUFLLEdBQUc7O0VBRXJELElBQUksS0FBSyxFQUFFLEtBQUssQ0FBQzs7OztFQUlqQixLQUFLLFFBQVEsQ0FBQyxXQUFXLEdBQUc7O0dBRTNCLEtBQUssR0FBRyxXQUFXLENBQUM7R0FDcEIsS0FBSyxHQUFHLEdBQUcsb0JBQW9CLENBQUM7O0dBRWhDLE1BQU07O0dBRU4sS0FBSyxHQUFHLE1BQU0sQ0FBQztHQUNmLEtBQUssR0FBRyxHQUFHLGVBQWUsQ0FBQzs7R0FFM0I7Ozs7RUFJRCxJQUFJLFVBQVUsR0FBRyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7O0VBRWhDLEtBQUssVUFBVSxHQUFHOztHQUVqQixVQUFVLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7R0FDMUIsVUFBVSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7R0FDM0IsVUFBVSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7R0FDL0IsVUFBVSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7R0FDL0IsVUFBVSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO0dBQ3RDLFVBQVUsQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztHQUM1QyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUNqQixVQUFVLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzs7R0FFekIsTUFBTTs7R0FFTixVQUFVLEdBQUc7SUFDWixFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUU7SUFDYixNQUFNLEVBQUUsTUFBTTtJQUNkLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztJQUN6QixXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7SUFDL0IsQ0FBQyxFQUFFLENBQUM7SUFDSixLQUFLLEVBQUUsS0FBSztJQUNaLENBQUM7OztHQUdGLEtBQUssQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUM7O0dBRXpCOztFQUVEOztDQUVELFNBQVMsTUFBTSxHQUFHOztFQUVqQixNQUFNLENBQUMsTUFBTSxHQUFHLGVBQWUsR0FBRyxDQUFDLENBQUM7RUFDcEMsV0FBVyxDQUFDLE1BQU0sR0FBRyxvQkFBb0IsR0FBRyxDQUFDLENBQUM7O0VBRTlDOztDQUVELFNBQVMsSUFBSSxHQUFHOztFQUVmLE1BQU0sQ0FBQyxJQUFJLEVBQUV6NkYsbUJBQWlCLEVBQUUsQ0FBQztFQUNqQyxXQUFXLENBQUMsSUFBSSxFQUFFQywwQkFBd0IsRUFBRSxDQUFDOztFQUU3Qzs7Q0FFRCxPQUFPO0VBQ04sTUFBTSxFQUFFLE1BQU07RUFDZCxXQUFXLEVBQUUsV0FBVzs7RUFFeEIsSUFBSSxFQUFFLElBQUk7RUFDVixJQUFJLEVBQUUsSUFBSTtFQUNWLE1BQU0sRUFBRSxNQUFNOztFQUVkLElBQUksRUFBRSxJQUFJO0VBQ1YsQ0FBQzs7Q0FFRjs7QUFFRCxTQUFTeTZGLGtCQUFnQixHQUFHOztDQUUzQixJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7O0NBRWYsU0FBUyxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRzs7RUFFN0IsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztFQUN0QyxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRXpCLEtBQUssSUFBSSxLQUFLLFNBQVMsR0FBRzs7OztHQUl6QixJQUFJLEdBQUcsSUFBSUQsaUJBQWUsRUFBRSxDQUFDO0dBQzdCLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUM7O0dBRXJCOztFQUVELE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELFNBQVMsT0FBTyxHQUFHOztFQUVsQixLQUFLLEdBQUcsRUFBRSxDQUFDOztFQUVYOztDQUVELE9BQU87RUFDTixHQUFHLEVBQUUsR0FBRztFQUNSLE9BQU8sRUFBRSxPQUFPO0VBQ2hCLENBQUM7O0NBRUY7Ozs7OztBQU1ELFNBQVNFLDRCQUEwQixFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsVUFBVSxHQUFHOztDQUVqRSxJQUFJLElBQUksQ0FBQzs7Q0FFVCxTQUFTLE9BQU8sRUFBRSxLQUFLLEdBQUc7O0VBRXpCLElBQUksR0FBRyxLQUFLLENBQUM7O0VBRWI7O0NBRUQsSUFBSSxJQUFJLEVBQUUsSUFBSSxDQUFDOztDQUVmLFNBQVMsUUFBUSxFQUFFLEtBQUssR0FBRzs7RUFFMUIsS0FBSyxLQUFLLENBQUMsS0FBSyxZQUFZLFdBQVcsSUFBSSxVQUFVLENBQUMsR0FBRyxFQUFFLHdCQUF3QixFQUFFLEdBQUc7O0dBRXZGLElBQUksR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDO0dBQ3ZCLElBQUksR0FBRyxDQUFDLENBQUM7O0dBRVQsTUFBTSxLQUFLLEtBQUssQ0FBQyxLQUFLLFlBQVksV0FBVyxHQUFHOztHQUVoRCxJQUFJLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQztHQUN6QixJQUFJLEdBQUcsQ0FBQyxDQUFDOztHQUVULE1BQU07O0dBRU4sSUFBSSxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUM7R0FDeEIsSUFBSSxHQUFHLENBQUMsQ0FBQzs7R0FFVDs7RUFFRDs7Q0FFRCxTQUFTLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFHOztFQUUvQixFQUFFLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssR0FBRyxJQUFJLEVBQUUsQ0FBQzs7RUFFbkQsVUFBVSxDQUFDLEtBQUssR0FBRyxDQUFDO0VBQ3BCLFVBQVUsQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDOztFQUU3QixLQUFLLElBQUksS0FBSyxFQUFFLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQzs7RUFFM0Q7O0NBRUQsU0FBUyxlQUFlLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLEdBQUc7O0VBRWxELElBQUksU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQzs7RUFFM0QsS0FBSyxTQUFTLEtBQUssSUFBSSxHQUFHOztHQUV6QixPQUFPLENBQUMsS0FBSyxFQUFFLHVJQUF1SSxFQUFFLENBQUM7R0FDekosT0FBTzs7R0FFUDs7RUFFRCxTQUFTLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxHQUFHLElBQUksRUFBRSxRQUFRLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzs7RUFFcEcsVUFBVSxDQUFDLEtBQUssR0FBRyxDQUFDO0VBQ3BCLFVBQVUsQ0FBQyxRQUFRLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQzs7RUFFMUQsS0FBSyxJQUFJLEtBQUssRUFBRSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDOztFQUV4Rjs7OztDQUlELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0NBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0NBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0NBQ3JCLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDOztDQUV2Qzs7Ozs7O0FBTUQsU0FBU0MscUJBQW1CLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxVQUFVLEdBQUc7O0NBRTFELElBQUksSUFBSSxDQUFDOztDQUVULFNBQVMsT0FBTyxFQUFFLEtBQUssR0FBRzs7RUFFekIsSUFBSSxHQUFHLEtBQUssQ0FBQzs7RUFFYjs7Q0FFRCxTQUFTLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFHOztFQUUvQixFQUFFLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7O0VBRXBDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsQ0FBQztFQUNwQixVQUFVLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQzs7RUFFN0IsS0FBSyxJQUFJLEtBQUssRUFBRSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7O0VBRTNEOztDQUVELFNBQVMsZUFBZSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFHOztFQUVsRCxJQUFJLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLHdCQUF3QixFQUFFLENBQUM7O0VBRTNELEtBQUssU0FBUyxLQUFLLElBQUksR0FBRzs7R0FFekIsT0FBTyxDQUFDLEtBQUssRUFBRSxnSUFBZ0ksRUFBRSxDQUFDO0dBQ2xKLE9BQU87O0dBRVA7O0VBRUQsSUFBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7O0VBRTVDLEtBQUssUUFBUSxDQUFDLDRCQUE0QixHQUFHOztHQUU1QyxLQUFLLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7O0dBRTVCLFNBQVMsQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzs7R0FFakYsTUFBTTs7R0FFTixTQUFTLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLGlCQUFpQixFQUFFLENBQUM7O0dBRXJGOztFQUVELFVBQVUsQ0FBQyxLQUFLLEdBQUcsQ0FBQztFQUNwQixVQUFVLENBQUMsUUFBUSxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUM7O0VBRTFELEtBQUssSUFBSSxLQUFLLEVBQUUsQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLEtBQUssSUFBSSxRQUFRLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQzs7RUFFeEY7Ozs7Q0FJRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztDQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztDQUNyQixJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQzs7Q0FFdkM7Ozs7OztBQU1ELFNBQVNDLGlCQUFlLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxVQUFVLEdBQUc7O0NBRXRELElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztDQUNwQixJQUFJLG1CQUFtQixHQUFHLEVBQUUsQ0FBQzs7Q0FFN0IsU0FBUyxpQkFBaUIsRUFBRSxLQUFLLEdBQUc7O0VBRW5DLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7RUFDNUIsSUFBSSxjQUFjLEdBQUcsVUFBVSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7RUFFL0MsS0FBSyxjQUFjLENBQUMsS0FBSyxLQUFLLElBQUksR0FBRzs7R0FFcEMsVUFBVSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7O0dBRTFDOztFQUVELE1BQU0sSUFBSSxJQUFJLElBQUksY0FBYyxDQUFDLFVBQVUsR0FBRzs7R0FFN0MsVUFBVSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7O0dBRXZEOztFQUVELFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQzs7RUFFN0QsT0FBTyxVQUFVLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDOzs7O0VBSWpDLElBQUksU0FBUyxHQUFHLG1CQUFtQixFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7RUFFbkQsS0FBSyxTQUFTLEdBQUc7O0dBRWhCLFVBQVUsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUM7R0FDL0IsT0FBTyxtQkFBbUIsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7O0dBRTFDOztFQUVELFNBQVMsR0FBRyxtQkFBbUIsRUFBRSxjQUFjLENBQUMsRUFBRSxFQUFFLENBQUM7O0VBRXJELEtBQUssU0FBUyxHQUFHOztHQUVoQixVQUFVLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO0dBQy9CLE9BQU8sbUJBQW1CLEVBQUUsY0FBYyxDQUFDLEVBQUUsRUFBRSxDQUFDOztHQUVoRDs7OztFQUlELFVBQVUsQ0FBQyxVQUFVLEdBQUcsQ0FBQzs7RUFFekI7O0NBRUQsU0FBUyxHQUFHLEVBQUUsTUFBTSxFQUFFLFFBQVEsR0FBRzs7RUFFaEMsSUFBSSxjQUFjLEdBQUcsVUFBVSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7RUFFL0MsS0FBSyxjQUFjLEdBQUcsT0FBTyxjQUFjLENBQUM7O0VBRTVDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQzs7RUFFMUQsS0FBSyxRQUFRLENBQUMsZ0JBQWdCLEdBQUc7O0dBRWhDLGNBQWMsR0FBRyxRQUFRLENBQUM7O0dBRTFCLE1BQU0sS0FBSyxRQUFRLENBQUMsVUFBVSxHQUFHOztHQUVqQyxLQUFLLFFBQVEsQ0FBQyxlQUFlLEtBQUssU0FBUyxHQUFHOztJQUU3QyxRQUFRLENBQUMsZUFBZSxHQUFHLElBQUl4K0csZ0JBQWMsRUFBRSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7SUFFeEU7O0dBRUQsY0FBYyxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUM7O0dBRTFDOztFQUVELFVBQVUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLEdBQUcsY0FBYyxDQUFDOztFQUUzQyxVQUFVLENBQUMsVUFBVSxHQUFHLENBQUM7O0VBRXpCLE9BQU8sY0FBYyxDQUFDOztFQUV0Qjs7Q0FFRCxTQUFTLE1BQU0sRUFBRSxRQUFRLEdBQUc7O0VBRTNCLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7RUFDM0IsSUFBSSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDOztFQUU3QyxLQUFLLEtBQUssS0FBSyxJQUFJLEdBQUc7O0dBRXJCLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDOztHQUVwRDs7RUFFRCxNQUFNLElBQUksSUFBSSxJQUFJLGtCQUFrQixHQUFHOztHQUV0QyxVQUFVLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQzs7R0FFakU7Ozs7RUFJRCxJQUFJLGVBQWUsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDOztFQUUvQyxNQUFNLElBQUksSUFBSSxJQUFJLGVBQWUsR0FBRzs7R0FFbkMsSUFBSSxLQUFLLEdBQUcsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDOztHQUVwQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztJQUVoRCxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7O0lBRWpEOztHQUVEOztFQUVEOztDQUVELFNBQVMscUJBQXFCLEVBQUUsUUFBUSxHQUFHOztFQUUxQyxJQUFJLFNBQVMsR0FBRyxtQkFBbUIsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7O0VBRW5ELEtBQUssU0FBUyxHQUFHLE9BQU8sU0FBUyxDQUFDOztFQUVsQyxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7O0VBRWpCLElBQUksYUFBYSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7RUFDbkMsSUFBSSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDOzs7O0VBSTdDLEtBQUssYUFBYSxLQUFLLElBQUksR0FBRzs7R0FFN0IsSUFBSSxLQUFLLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQzs7R0FFaEMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHOztJQUVsRCxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQ3ZCLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDdkIsSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7SUFFdkIsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztJQUVqQzs7R0FFRCxNQUFNOztHQUVOLElBQUksS0FBSyxHQUFHLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7O0dBRTlDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUc7O0lBRTlELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7SUFFZCxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0lBRWpDOztHQUVEOzs7O0VBSUQsU0FBUyxHQUFHLE1BQU1HLFVBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxLQUFLLEdBQUdwQix1QkFBcUIsR0FBR0YsdUJBQXFCLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUU5RyxVQUFVLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsb0JBQW9CLEVBQUUsQ0FBQzs7RUFFeEQsbUJBQW1CLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxHQUFHLFNBQVMsQ0FBQzs7RUFFL0MsT0FBTyxTQUFTLENBQUM7O0VBRWpCOztDQUVELE9BQU87O0VBRU4sR0FBRyxFQUFFLEdBQUc7RUFDUixNQUFNLEVBQUUsTUFBTTs7RUFFZCxxQkFBcUIsRUFBRSxxQkFBcUI7O0VBRTVDLENBQUM7O0NBRUY7Ozs7OztBQU1ELFNBQVM0L0csYUFBVyxHQUFHOztDQUV0QixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7O0NBRWhCLE9BQU87O0VBRU4sR0FBRyxFQUFFLFdBQVcsS0FBSyxHQUFHOztHQUV2QixLQUFLLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssU0FBUyxHQUFHOztJQUV2QyxPQUFPLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUM7O0lBRTFCOztHQUVELElBQUksUUFBUSxDQUFDOztHQUViLFNBQVMsS0FBSyxDQUFDLElBQUk7O0lBRWxCLEtBQUssa0JBQWtCO0tBQ3RCLFFBQVEsR0FBRztNQUNWLFNBQVMsRUFBRSxJQUFJdHZJLFNBQU8sRUFBRTtNQUN4QixLQUFLLEVBQUUsSUFBSXNYLE9BQUssRUFBRTs7TUFFbEIsTUFBTSxFQUFFLEtBQUs7TUFDYixVQUFVLEVBQUUsQ0FBQztNQUNiLFlBQVksRUFBRSxDQUFDO01BQ2YsYUFBYSxFQUFFLElBQUl2cEIsU0FBTyxFQUFFO01BQzVCLENBQUM7S0FDRixNQUFNOztJQUVQLEtBQUssV0FBVztLQUNmLFFBQVEsR0FBRztNQUNWLFFBQVEsRUFBRSxJQUFJaVMsU0FBTyxFQUFFO01BQ3ZCLFNBQVMsRUFBRSxJQUFJQSxTQUFPLEVBQUU7TUFDeEIsS0FBSyxFQUFFLElBQUlzWCxPQUFLLEVBQUU7TUFDbEIsUUFBUSxFQUFFLENBQUM7TUFDWCxPQUFPLEVBQUUsQ0FBQztNQUNWLFdBQVcsRUFBRSxDQUFDO01BQ2QsS0FBSyxFQUFFLENBQUM7O01BRVIsTUFBTSxFQUFFLEtBQUs7TUFDYixVQUFVLEVBQUUsQ0FBQztNQUNiLFlBQVksRUFBRSxDQUFDO01BQ2YsYUFBYSxFQUFFLElBQUl2cEIsU0FBTyxFQUFFO01BQzVCLENBQUM7S0FDRixNQUFNOztJQUVQLEtBQUssWUFBWTtLQUNoQixRQUFRLEdBQUc7TUFDVixRQUFRLEVBQUUsSUFBSWlTLFNBQU8sRUFBRTtNQUN2QixLQUFLLEVBQUUsSUFBSXNYLE9BQUssRUFBRTtNQUNsQixRQUFRLEVBQUUsQ0FBQztNQUNYLEtBQUssRUFBRSxDQUFDOztNQUVSLE1BQU0sRUFBRSxLQUFLO01BQ2IsVUFBVSxFQUFFLENBQUM7TUFDYixZQUFZLEVBQUUsQ0FBQztNQUNmLGFBQWEsRUFBRSxJQUFJdnBCLFNBQU8sRUFBRTtNQUM1QixDQUFDO0tBQ0YsTUFBTTs7SUFFUCxLQUFLLGlCQUFpQjtLQUNyQixRQUFRLEdBQUc7TUFDVixTQUFTLEVBQUUsSUFBSWlTLFNBQU8sRUFBRTtNQUN4QixRQUFRLEVBQUUsSUFBSXNYLE9BQUssRUFBRTtNQUNyQixXQUFXLEVBQUUsSUFBSUEsT0FBSyxFQUFFO01BQ3hCLENBQUM7S0FDRixNQUFNOztJQUVQLEtBQUssZUFBZTtLQUNuQixRQUFRLEdBQUc7TUFDVixLQUFLLEVBQUUsSUFBSUEsT0FBSyxFQUFFO01BQ2xCLFFBQVEsRUFBRSxJQUFJdFgsU0FBTyxFQUFFO01BQ3ZCLFNBQVMsRUFBRSxJQUFJQSxTQUFPLEVBQUU7TUFDeEIsVUFBVSxFQUFFLElBQUlBLFNBQU8sRUFBRTs7TUFFekIsQ0FBQztLQUNGLE1BQU07O0lBRVA7O0dBRUQsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxRQUFRLENBQUM7O0dBRTlCLE9BQU8sUUFBUSxDQUFDOztHQUVoQjs7RUFFRCxDQUFDOztDQUVGOzs7Ozs7QUFNRCxTQUFTdXZJLGNBQVksRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLFVBQVUsR0FBRzs7Q0FFbkQsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDOztDQUVwQixTQUFTLE1BQU0sRUFBRSxNQUFNLEdBQUc7O0VBRXpCLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7O0VBRTdCLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7RUFDL0IsSUFBSSxjQUFjLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUM7Ozs7RUFJeEQsS0FBSyxVQUFVLEVBQUUsY0FBYyxDQUFDLEVBQUUsRUFBRSxLQUFLLEtBQUssR0FBRzs7R0FFaEQsS0FBSyxRQUFRLENBQUMsVUFBVSxHQUFHOztJQUUxQixjQUFjLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLENBQUM7O0lBRTFDOztHQUVELFVBQVUsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLENBQUM7O0dBRXBDLFVBQVUsRUFBRSxjQUFjLENBQUMsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDOztHQUV4Qzs7RUFFRCxPQUFPLGNBQWMsQ0FBQzs7RUFFdEI7O0NBRUQsU0FBUyxLQUFLLEdBQUc7O0VBRWhCLFVBQVUsR0FBRyxFQUFFLENBQUM7O0VBRWhCOztDQUVELE9BQU87O0VBRU4sTUFBTSxFQUFFLE1BQU07RUFDZCxLQUFLLEVBQUUsS0FBSzs7RUFFWixDQUFDOztDQUVGOzs7Ozs7QUFNRCxTQUFTaGtHLGdCQUFjLEVBQUUsTUFBTSxHQUFHOztDQUVqQyxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDOztDQUVqQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7RUFFekMsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUUzQzs7Q0FFRCxPQUFPLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTFCOztBQUVELFNBQVMrRCxhQUFXLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEdBQUc7O0NBRXhDLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXJDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO0NBQ2xDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTNCLEtBQUssRUFBRSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsY0FBYyxFQUFFLEtBQUssS0FBSyxHQUFHOztFQUVuRSxPQUFPLENBQUMsS0FBSyxFQUFFLDhDQUE4QyxFQUFFLENBQUM7O0VBRWhFOztDQUVELEtBQUssRUFBRSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRzs7RUFFM0MsT0FBTyxDQUFDLElBQUksRUFBRSwwQ0FBMEMsRUFBRSxJQUFJLEtBQUssRUFBRSxDQUFDLGFBQWEsR0FBRyxRQUFRLEdBQUcsVUFBVSxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsRUFBRS9ELGdCQUFjLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQzs7RUFFdks7Ozs7O0NBS0QsT0FBTyxNQUFNLENBQUM7O0NBRWQ7Ozs7OztBQU1ELElBQUkwRixnQkFBYyxHQUFHLENBQUMsQ0FBQzs7QUFFdkIsU0FBU3hGLHVCQUFxQixFQUFFLFFBQVEsR0FBRzs7Q0FFMUMsU0FBUyxRQUFROztFQUVoQixLQUFLeG1DLGdCQUFjO0dBQ2xCLE9BQU8sRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7RUFDakMsS0FBS2lvSSxjQUFZO0dBQ2hCLE9BQU8sRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7RUFDL0IsS0FBS0MsY0FBWTtHQUNoQixPQUFPLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0VBQy9CLEtBQUtDLGVBQWE7R0FDakIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0VBQ3BDLEtBQUtDLGdCQUFjO0dBQ2xCLE9BQU8sRUFBRSxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztFQUNyQyxLQUFLQyxjQUFZO0dBQ2hCLE9BQU8sRUFBRSxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztFQUN0QyxLQUFLajdGLGVBQWE7R0FDakIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxrQ0FBa0MsRUFBRSxDQUFDO0VBQ3ZEO0dBQ0MsTUFBTSxJQUFJLEtBQUssRUFBRSx3QkFBd0IsR0FBRyxRQUFRLEVBQUUsQ0FBQzs7RUFFeEQ7O0NBRUQ7O0FBRUQsU0FBU3RELDBCQUF3QixFQUFFLFlBQVksRUFBRSxRQUFRLEdBQUc7O0NBRTNELElBQUksVUFBVSxHQUFHdEQsdUJBQXFCLEVBQUUsUUFBUSxFQUFFLENBQUM7Q0FDbkQsT0FBTyxPQUFPLEdBQUcsWUFBWSxHQUFHLDBCQUEwQixHQUFHLFVBQVUsRUFBRSxDQUFDLEVBQUUsR0FBRyxVQUFVLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQzs7Q0FFcEg7O0FBRUQsU0FBU3VELDBCQUF3QixFQUFFLFlBQVksRUFBRSxRQUFRLEdBQUc7O0NBRTNELElBQUksVUFBVSxHQUFHdkQsdUJBQXFCLEVBQUUsUUFBUSxFQUFFLENBQUM7Q0FDbkQsT0FBTyxPQUFPLEdBQUcsWUFBWSxHQUFHLGtDQUFrQyxHQUFHLFVBQVUsRUFBRSxDQUFDLEVBQUUsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDOztDQUUvRzs7QUFFRCxTQUFTaUQsd0JBQXNCLEVBQUUsWUFBWSxFQUFFLFdBQVcsR0FBRzs7Q0FFNUQsSUFBSSxlQUFlLENBQUM7O0NBRXBCLFNBQVMsV0FBVzs7RUFFbkIsS0FBS2lsQixtQkFBaUI7R0FDckIsZUFBZSxHQUFHLFFBQVEsQ0FBQztHQUMzQixNQUFNOztFQUVQLEtBQUtrNUUscUJBQW1CO0dBQ3ZCLGVBQWUsR0FBRyxVQUFVLENBQUM7R0FDN0IsTUFBTTs7RUFFUCxLQUFLQyx1QkFBcUI7R0FDekIsZUFBZSxHQUFHLFlBQVksQ0FBQztHQUMvQixNQUFNOztFQUVQLEtBQUtDLG1CQUFpQjtHQUNyQixlQUFlLEdBQUcsaUJBQWlCLENBQUM7R0FDcEMsTUFBTTs7RUFFUDtHQUNDLE1BQU0sSUFBSSxLQUFLLEVBQUUsMkJBQTJCLEdBQUcsV0FBVyxFQUFFLENBQUM7O0VBRTlEOztDQUVELE9BQU8sT0FBTyxHQUFHLFlBQVksR0FBRywwQkFBMEIsR0FBRyxlQUFlLEdBQUcseUJBQXlCLENBQUM7O0NBRXpHOztBQUVELFNBQVN4L0Ysb0JBQWtCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxrQkFBa0IsR0FBRzs7Q0FFekUsVUFBVSxHQUFHLFVBQVUsSUFBSSxFQUFFLENBQUM7O0NBRTlCLElBQUksTUFBTSxHQUFHO0VBQ1osRUFBRSxVQUFVLENBQUMsV0FBVyxJQUFJLFVBQVUsQ0FBQyxZQUFZLElBQUksVUFBVSxDQUFDLE9BQU8sSUFBSSxVQUFVLENBQUMsU0FBUyxJQUFJLFVBQVUsQ0FBQyxXQUFXLEtBQUssaURBQWlELEdBQUcsRUFBRTtFQUN0TCxFQUFFLFVBQVUsQ0FBQyxTQUFTLElBQUksVUFBVSxDQUFDLHNCQUFzQixNQUFNLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLHVDQUF1QyxHQUFHLEVBQUU7RUFDMUosRUFBRSxVQUFVLENBQUMsV0FBVyxNQUFNLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxvQkFBb0IsRUFBRSxHQUFHLDBDQUEwQyxHQUFHLEVBQUU7RUFDOUgsRUFBRSxVQUFVLENBQUMsZ0JBQWdCLElBQUksVUFBVSxDQUFDLE1BQU0sTUFBTSxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsd0JBQXdCLEVBQUUsR0FBRywrQ0FBK0MsR0FBRyxFQUFFO0VBQ2pLLENBQUM7O0NBRUYsT0FBTyxNQUFNLENBQUMsTUFBTSxFQUFFekIsaUJBQWUsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFckQ7O0FBRUQsU0FBUzBCLGlCQUFlLEVBQUUsT0FBTyxHQUFHOztDQUVuQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7O0NBRWhCLE1BQU0sSUFBSSxJQUFJLElBQUksT0FBTyxHQUFHOztFQUUzQixJQUFJLEtBQUssR0FBRyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRTVCLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxTQUFTOztFQUVoQyxNQUFNLENBQUMsSUFBSSxFQUFFLFVBQVUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEtBQUssRUFBRSxDQUFDOztFQUUvQzs7Q0FFRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTNCOztBQUVELFNBQVNzRCx5QkFBdUIsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFdBQVcsR0FBRzs7Q0FFNUQsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDOztDQUVwQixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDOztDQUVoRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUU5QixJQUFJLElBQUksR0FBRyxFQUFFLENBQUMsZUFBZSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUM1QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDOzs7O0VBSXJCLFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDOztFQUUzRDs7Q0FFRCxPQUFPLFVBQVUsQ0FBQzs7Q0FFbEI7O0FBRUQsU0FBU2hGLGlCQUFlLEVBQUUsTUFBTSxHQUFHOztDQUVsQyxPQUFPLE1BQU0sS0FBSyxFQUFFLENBQUM7O0NBRXJCOztBQUVELFNBQVNxRCxrQkFBZ0IsRUFBRSxNQUFNLEVBQUUsVUFBVSxHQUFHOztDQUUvQyxPQUFPLE1BQU07R0FDWCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLFlBQVksRUFBRTtHQUNyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLGFBQWEsRUFBRTtHQUN2RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsVUFBVSxDQUFDLGlCQUFpQixFQUFFO0dBQ2hFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxVQUFVLENBQUMsY0FBYyxFQUFFO0dBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUM7O0NBRTFEOztBQUVELFNBQVNELGVBQWEsRUFBRSxNQUFNLEdBQUc7O0NBRWhDLElBQUksT0FBTyxHQUFHLGlDQUFpQyxDQUFDOztDQUVoRCxTQUFTLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxHQUFHOztFQUVsQyxJQUFJLE9BQU8sR0FBR3R4QixhQUFXLEVBQUUsT0FBTyxFQUFFLENBQUM7O0VBRXJDLEtBQUssT0FBTyxLQUFLLFNBQVMsR0FBRzs7R0FFNUIsTUFBTSxJQUFJLEtBQUssRUFBRSw0QkFBNEIsR0FBRyxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUM7O0dBRWhFOztFQUVELE9BQU9zeEIsZUFBYSxFQUFFLE9BQU8sRUFBRSxDQUFDOztFQUVoQzs7Q0FFRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDOztDQUUxQzs7QUFFRCxTQUFTRyxhQUFXLEVBQUUsTUFBTSxHQUFHOztDQUU5QixJQUFJLE9BQU8sR0FBRyxxRUFBcUUsQ0FBQzs7Q0FFcEYsU0FBUyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsT0FBTyxHQUFHOztFQUU5QyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7O0VBRWhCLE1BQU0sSUFBSSxDQUFDLEdBQUcsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0dBRTVELE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDOztHQUV6RDs7RUFFRCxPQUFPLE1BQU0sQ0FBQzs7RUFFZDs7Q0FFRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDOztDQUUxQzs7QUFFRCxTQUFTbWdHLGNBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxVQUFVLEdBQUc7O0NBRTdELElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7O0NBRTFCLElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7Q0FDckMsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQzs7Q0FFL0IsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUM7Q0FDdkQsSUFBSSxjQUFjLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUM7O0NBRTNELElBQUksbUJBQW1CLEdBQUcsc0JBQXNCLENBQUM7O0NBRWpELEtBQUssVUFBVSxDQUFDLGFBQWEsS0FBS3ZpRyxjQUFZLEdBQUc7O0VBRWhELG1CQUFtQixHQUFHLG9CQUFvQixDQUFDOztFQUUzQyxNQUFNLEtBQUssVUFBVSxDQUFDLGFBQWEsS0FBS0Usa0JBQWdCLEdBQUc7O0VBRTNELG1CQUFtQixHQUFHLHlCQUF5QixDQUFDOztFQUVoRDs7Q0FFRCxJQUFJLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDO0NBQzFDLElBQUksZ0JBQWdCLEdBQUcsd0JBQXdCLENBQUM7Q0FDaEQsSUFBSSxvQkFBb0IsR0FBRywwQkFBMEIsQ0FBQzs7Q0FFdEQsS0FBSyxVQUFVLENBQUMsTUFBTSxHQUFHOztFQUV4QixTQUFTLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTzs7R0FFL0IsS0FBS2hHLHVCQUFxQixDQUFDO0dBQzNCLEtBQUt3c0QsdUJBQXFCO0lBQ3pCLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDO0lBQ3RDLE1BQU07O0dBRVAsS0FBS3ZnRCx5QkFBdUIsQ0FBQztHQUM3QixLQUFLQyx5QkFBdUI7SUFDM0IsZ0JBQWdCLEdBQUcscUJBQXFCLENBQUM7SUFDekMsTUFBTTs7R0FFUCxLQUFLdWdELGtDQUFnQyxDQUFDO0dBQ3RDLEtBQUtDLGtDQUFnQztJQUNwQyxnQkFBZ0IsR0FBRyxxQkFBcUIsQ0FBQztJQUN6QyxNQUFNOztHQUVQLEtBQUtDLDRCQUEwQjtJQUM5QixnQkFBZ0IsR0FBRyxvQkFBb0IsQ0FBQztJQUN4QyxNQUFNOztHQUVQOztFQUVELFNBQVMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPOztHQUUvQixLQUFLSCx1QkFBcUIsQ0FBQztHQUMzQixLQUFLRSxrQ0FBZ0M7SUFDcEMsZ0JBQWdCLEdBQUcsd0JBQXdCLENBQUM7SUFDNUMsTUFBTTs7R0FFUDs7RUFFRCxTQUFTLFFBQVEsQ0FBQyxPQUFPOztHQUV4QixLQUFLajhELG1CQUFpQjtJQUNyQixvQkFBb0IsR0FBRywwQkFBMEIsQ0FBQztJQUNsRCxNQUFNOztHQUVQLEtBQUsrMEcsY0FBWTtJQUNoQixvQkFBb0IsR0FBRyxxQkFBcUIsQ0FBQztJQUM3QyxNQUFNOztHQUVQLEtBQUtDLGNBQVk7SUFDaEIsb0JBQW9CLEdBQUcscUJBQXFCLENBQUM7SUFDN0MsTUFBTTs7R0FFUDs7RUFFRDs7Q0FFRCxJQUFJLGlCQUFpQixHQUFHLEVBQUUsUUFBUSxDQUFDLFdBQVcsR0FBRyxDQUFDLEtBQUssUUFBUSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7Ozs7OztDQU1sRixJQUFJLGdCQUFnQixHQUFHci9GLG9CQUFrQixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDOztDQUV6RixJQUFJLGFBQWEsR0FBR0MsaUJBQWUsRUFBRSxPQUFPLEVBQUUsQ0FBQzs7OztDQUkvQyxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7O0NBRWpDLElBQUksWUFBWSxFQUFFLGNBQWMsQ0FBQzs7Q0FFakMsS0FBSyxRQUFRLENBQUMsbUJBQW1CLEdBQUc7O0VBRW5DLFlBQVksR0FBRzs7R0FFZCxhQUFhOztHQUViLElBQUk7O0dBRUosQ0FBQyxNQUFNLEVBQUUxQixpQkFBZSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztFQUV6QyxjQUFjLEdBQUc7O0dBRWhCLGdCQUFnQjtHQUNoQixhQUFhOztHQUViLElBQUk7O0dBRUosQ0FBQyxNQUFNLEVBQUVBLGlCQUFlLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRXpDLE1BQU07O0VBRU4sWUFBWSxHQUFHOztHQUVkLFlBQVksR0FBRyxVQUFVLENBQUMsU0FBUyxHQUFHLFNBQVM7R0FDL0MsWUFBWSxHQUFHLFVBQVUsQ0FBQyxTQUFTLEdBQUcsT0FBTzs7R0FFN0Msc0JBQXNCLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJOztHQUVwRCxhQUFhOztHQUViLFVBQVUsQ0FBQyxzQkFBc0IsR0FBRyx5QkFBeUIsR0FBRyxFQUFFOztHQUVsRSx1QkFBdUIsR0FBRyxpQkFBaUI7O0dBRTNDLG9CQUFvQixHQUFHLFVBQVUsQ0FBQyxRQUFRO0dBQzFDLEVBQUUsVUFBVSxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsR0FBRyxLQUFLLGlCQUFpQixHQUFHLEVBQUU7R0FDaEUsRUFBRSxVQUFVLENBQUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssa0JBQWtCLEdBQUcsRUFBRTs7R0FFcEUsVUFBVSxDQUFDLEdBQUcsR0FBRyxpQkFBaUIsR0FBRyxFQUFFO0dBQ3ZDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsb0JBQW9CLEdBQUcsRUFBRTtHQUM3QyxVQUFVLENBQUMsTUFBTSxHQUFHLFVBQVUsR0FBRyxnQkFBZ0IsR0FBRyxFQUFFO0dBQ3RELFVBQVUsQ0FBQyxRQUFRLEdBQUcsc0JBQXNCLEdBQUcsRUFBRTtHQUNqRCxVQUFVLENBQUMsS0FBSyxHQUFHLG1CQUFtQixHQUFHLEVBQUU7R0FDM0MsVUFBVSxDQUFDLFdBQVcsR0FBRyx5QkFBeUIsR0FBRyxFQUFFO0dBQ3ZELFVBQVUsQ0FBQyxPQUFPLEdBQUcscUJBQXFCLEdBQUcsRUFBRTtHQUMvQyxVQUFVLENBQUMsU0FBUyxHQUFHLHVCQUF1QixHQUFHLEVBQUU7R0FDbkQsVUFBVSxDQUFDLGVBQWUsSUFBSSxVQUFVLENBQUMsc0JBQXNCLEdBQUcsNkJBQTZCLEdBQUcsRUFBRTtHQUNwRyxVQUFVLENBQUMsV0FBVyxHQUFHLHlCQUF5QixHQUFHLEVBQUU7R0FDdkQsVUFBVSxDQUFDLFlBQVksR0FBRywwQkFBMEIsR0FBRyxFQUFFO0dBQ3pELFVBQVUsQ0FBQyxZQUFZLEdBQUcsMEJBQTBCLEdBQUcsRUFBRTtHQUN6RCxVQUFVLENBQUMsUUFBUSxHQUFHLHNCQUFzQixHQUFHLEVBQUU7R0FDakQsVUFBVSxDQUFDLFlBQVksR0FBRyxtQkFBbUIsR0FBRyxFQUFFOztHQUVsRCxVQUFVLENBQUMsV0FBVyxHQUFHLHFCQUFxQixHQUFHLEVBQUU7O0dBRW5ELFVBQVUsQ0FBQyxRQUFRLEdBQUcsc0JBQXNCLEdBQUcsRUFBRTtHQUNqRCxVQUFVLENBQUMsZ0JBQWdCLEdBQUcsc0JBQXNCLEdBQUcsRUFBRTs7R0FFekQsVUFBVSxDQUFDLFlBQVksR0FBRywwQkFBMEIsR0FBRyxFQUFFO0dBQ3pELFVBQVUsQ0FBQyxZQUFZLElBQUksVUFBVSxDQUFDLFdBQVcsS0FBSyxLQUFLLEdBQUcsMEJBQTBCLEdBQUcsRUFBRTtHQUM3RixVQUFVLENBQUMsV0FBVyxHQUFHLHNCQUFzQixHQUFHLEVBQUU7R0FDcEQsVUFBVSxDQUFDLFNBQVMsR0FBRyxvQkFBb0IsR0FBRyxFQUFFOztHQUVoRCw4QkFBOEIsR0FBRyxVQUFVLENBQUMsaUJBQWlCOztHQUU3RCxVQUFVLENBQUMsZ0JBQWdCLEdBQUcsdUJBQXVCLEdBQUcsRUFBRTtHQUMxRCxVQUFVLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxHQUFHLG1CQUFtQixHQUFHLEVBQUU7O0dBRW5FLFVBQVUsQ0FBQyxlQUFlLEdBQUcsNkJBQTZCLEdBQUcsRUFBRTs7R0FFL0QsVUFBVSxDQUFDLHNCQUFzQixHQUFHLHlCQUF5QixHQUFHLEVBQUU7R0FDbEUsVUFBVSxDQUFDLHNCQUFzQixJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLGdCQUFnQixFQUFFLEdBQUcsNkJBQTZCLEdBQUcsRUFBRTs7R0FFckgsMkJBQTJCO0dBQzNCLCtCQUErQjtHQUMvQixnQ0FBZ0M7R0FDaEMsMEJBQTBCO0dBQzFCLDRCQUE0QjtHQUM1Qiw4QkFBOEI7O0dBRTlCLDBCQUEwQjtHQUMxQix3QkFBd0I7R0FDeEIsb0JBQW9COztHQUVwQixrQkFBa0I7O0dBRWxCLHdCQUF3Qjs7R0FFeEIsUUFBUTs7R0FFUix5QkFBeUI7O0dBRXpCLCtCQUErQjtHQUMvQiwrQkFBK0I7R0FDL0IsK0JBQStCO0dBQy9CLCtCQUErQjs7R0FFL0IsMEJBQTBCOztHQUUxQixnQ0FBZ0M7R0FDaEMsZ0NBQWdDO0dBQ2hDLGdDQUFnQztHQUNoQyxnQ0FBZ0M7O0dBRWhDLFFBQVE7O0dBRVIsZ0NBQWdDO0dBQ2hDLGdDQUFnQztHQUNoQyxnQ0FBZ0M7R0FDaEMsZ0NBQWdDOztHQUVoQyxTQUFTOztHQUVULFFBQVE7O0dBRVIscUJBQXFCOztHQUVyQiw0QkFBNEI7R0FDNUIsNkJBQTZCOztHQUU3QixRQUFROztHQUVSLElBQUk7O0dBRUosQ0FBQyxNQUFNLEVBQUVBLGlCQUFlLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRXpDLGNBQWMsR0FBRzs7R0FFaEIsZ0JBQWdCOztHQUVoQixZQUFZLEdBQUcsVUFBVSxDQUFDLFNBQVMsR0FBRyxTQUFTO0dBQy9DLFlBQVksR0FBRyxVQUFVLENBQUMsU0FBUyxHQUFHLE9BQU87O0dBRTdDLHNCQUFzQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSTs7R0FFcEQsYUFBYTs7R0FFYixVQUFVLENBQUMsU0FBUyxHQUFHLG9CQUFvQixHQUFHLFVBQVUsQ0FBQyxTQUFTLEdBQUcsRUFBRTs7R0FFdkUsdUJBQXVCLEdBQUcsaUJBQWlCOztHQUUzQyxFQUFFLFVBQVUsQ0FBQyxNQUFNLElBQUksVUFBVSxDQUFDLEdBQUcsS0FBSyxpQkFBaUIsR0FBRyxFQUFFO0dBQ2hFLEVBQUUsVUFBVSxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLGtCQUFrQixHQUFHLEVBQUU7O0dBRXBFLFVBQVUsQ0FBQyxHQUFHLEdBQUcsaUJBQWlCLEdBQUcsRUFBRTtHQUN2QyxVQUFVLENBQUMsTUFBTSxHQUFHLG9CQUFvQixHQUFHLEVBQUU7R0FDN0MsVUFBVSxDQUFDLE1BQU0sR0FBRyxVQUFVLEdBQUcsZ0JBQWdCLEdBQUcsRUFBRTtHQUN0RCxVQUFVLENBQUMsTUFBTSxHQUFHLFVBQVUsR0FBRyxnQkFBZ0IsR0FBRyxFQUFFO0dBQ3RELFVBQVUsQ0FBQyxNQUFNLEdBQUcsVUFBVSxHQUFHLG9CQUFvQixHQUFHLEVBQUU7R0FDMUQsVUFBVSxDQUFDLFFBQVEsR0FBRyxzQkFBc0IsR0FBRyxFQUFFO0dBQ2pELFVBQVUsQ0FBQyxLQUFLLEdBQUcsbUJBQW1CLEdBQUcsRUFBRTtHQUMzQyxVQUFVLENBQUMsV0FBVyxHQUFHLHlCQUF5QixHQUFHLEVBQUU7R0FDdkQsVUFBVSxDQUFDLE9BQU8sR0FBRyxxQkFBcUIsR0FBRyxFQUFFO0dBQy9DLFVBQVUsQ0FBQyxTQUFTLEdBQUcsdUJBQXVCLEdBQUcsRUFBRTtHQUNuRCxVQUFVLENBQUMsV0FBVyxHQUFHLHlCQUF5QixHQUFHLEVBQUU7R0FDdkQsVUFBVSxDQUFDLFlBQVksR0FBRywwQkFBMEIsR0FBRyxFQUFFO0dBQ3pELFVBQVUsQ0FBQyxZQUFZLEdBQUcsMEJBQTBCLEdBQUcsRUFBRTtHQUN6RCxVQUFVLENBQUMsUUFBUSxHQUFHLHNCQUFzQixHQUFHLEVBQUU7R0FDakQsVUFBVSxDQUFDLFlBQVksR0FBRyxtQkFBbUIsR0FBRyxFQUFFOztHQUVsRCxVQUFVLENBQUMsV0FBVyxHQUFHLHlCQUF5QixHQUFHLEVBQUU7O0dBRXZELFVBQVUsQ0FBQyxXQUFXLEdBQUcscUJBQXFCLEdBQUcsRUFBRTs7R0FFbkQsVUFBVSxDQUFDLFdBQVcsR0FBRyxzQkFBc0IsR0FBRyxFQUFFO0dBQ3BELFVBQVUsQ0FBQyxTQUFTLEdBQUcsb0JBQW9CLEdBQUcsRUFBRTs7R0FFaEQsOEJBQThCLEdBQUcsVUFBVSxDQUFDLGlCQUFpQjtHQUM3RCxnQ0FBZ0MsSUFBSSxVQUFVLENBQUMsaUJBQWlCLEdBQUcsVUFBVSxDQUFDLG1CQUFtQixDQUFDOztHQUVsRyxVQUFVLENBQUMsZ0JBQWdCLEdBQUcsdUJBQXVCLEdBQUcsRUFBRTtHQUMxRCxVQUFVLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxHQUFHLG1CQUFtQixHQUFHLEVBQUU7O0dBRW5FLFVBQVUsQ0FBQyxrQkFBa0IsR0FBRyw2QkFBNkIsR0FBRyxFQUFFOztHQUVsRSxVQUFVLENBQUMsdUJBQXVCLEdBQUcsbUNBQW1DLEdBQUcsRUFBRTs7R0FFN0UsVUFBVSxDQUFDLHNCQUFzQixHQUFHLHlCQUF5QixHQUFHLEVBQUU7R0FDbEUsVUFBVSxDQUFDLHNCQUFzQixJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLGdCQUFnQixFQUFFLEdBQUcsNkJBQTZCLEdBQUcsRUFBRTs7R0FFckgsVUFBVSxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSx3QkFBd0IsRUFBRSxHQUFHLHlCQUF5QixHQUFHLEVBQUU7O0dBRXpHLDBCQUEwQjtHQUMxQiw4QkFBOEI7O0dBRTlCLEVBQUUsVUFBVSxDQUFDLFdBQVcsS0FBSzJDLGVBQWEsS0FBSyxzQkFBc0IsR0FBRyxFQUFFO0dBQzFFLEVBQUUsVUFBVSxDQUFDLFdBQVcsS0FBS0EsZUFBYSxLQUFLN3dCLGFBQVcsRUFBRSwyQkFBMkIsRUFBRSxHQUFHLEVBQUU7R0FDOUYsRUFBRSxVQUFVLENBQUMsV0FBVyxLQUFLNndCLGVBQWEsS0FBS0Msd0JBQXNCLEVBQUUsYUFBYSxFQUFFLFVBQVUsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFOztHQUVuSCxVQUFVLENBQUMsU0FBUyxHQUFHLG1CQUFtQixHQUFHLEVBQUU7O0dBRS9DLEVBQUUsVUFBVSxDQUFDLGNBQWMsSUFBSSxVQUFVLENBQUMsV0FBVyxJQUFJLFVBQVUsQ0FBQyxjQUFjLElBQUksVUFBVSxDQUFDLG1CQUFtQixLQUFLOXdCLGFBQVcsRUFBRSx5QkFBeUIsRUFBRSxHQUFHLEVBQUU7R0FDdEssVUFBVSxDQUFDLFdBQVcsR0FBR214QiwwQkFBd0IsRUFBRSxrQkFBa0IsRUFBRSxVQUFVLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRTtHQUNwRyxVQUFVLENBQUMsY0FBYyxHQUFHQSwwQkFBd0IsRUFBRSxxQkFBcUIsRUFBRSxVQUFVLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTtHQUM3RyxVQUFVLENBQUMsbUJBQW1CLEdBQUdBLDBCQUF3QixFQUFFLDBCQUEwQixFQUFFLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUU7R0FDNUgsVUFBVSxDQUFDLGNBQWMsR0FBR0MsMEJBQXdCLEVBQUUscUJBQXFCLEVBQUUsVUFBVSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7O0dBRTdHLFVBQVUsQ0FBQyxZQUFZLEdBQUcsd0JBQXdCLEdBQUcsUUFBUSxDQUFDLFlBQVksR0FBRyxFQUFFOztHQUUvRSxJQUFJOztHQUVKLENBQUMsTUFBTSxFQUFFbEQsaUJBQWUsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7RUFFekM7O0NBRUQsWUFBWSxHQUFHb0QsZUFBYSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsQ0FBQztDQUN6RCxZQUFZLEdBQUdDLGtCQUFnQixFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFNUQsY0FBYyxHQUFHRCxlQUFhLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxDQUFDO0NBQzdELGNBQWMsR0FBR0Msa0JBQWdCLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUVoRSxLQUFLLEVBQUUsUUFBUSxDQUFDLGdCQUFnQixHQUFHOztFQUVsQyxZQUFZLEdBQUdFLGFBQVcsRUFBRSxZQUFZLEVBQUUsQ0FBQztFQUMzQyxjQUFjLEdBQUdBLGFBQVcsRUFBRSxjQUFjLEVBQUUsQ0FBQzs7RUFFL0M7O0NBRUQsSUFBSSxVQUFVLEdBQUcsWUFBWSxHQUFHLFlBQVksQ0FBQztDQUM3QyxJQUFJLFlBQVksR0FBRyxjQUFjLEdBQUcsY0FBYyxDQUFDOzs7OztDQUtuRCxJQUFJLGNBQWMsR0FBR0MsYUFBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxDQUFDO0NBQ3JFLElBQUksZ0JBQWdCLEdBQUdBLGFBQVcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUUsQ0FBQzs7Q0FFM0UsRUFBRSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLENBQUM7Q0FDM0MsRUFBRSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQzs7OztDQUk3QyxLQUFLLFFBQVEsQ0FBQyxtQkFBbUIsS0FBSyxTQUFTLEdBQUc7O0VBRWpELEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDOztFQUVsRSxNQUFNLEtBQUssVUFBVSxDQUFDLFlBQVksS0FBSyxJQUFJLEdBQUc7OztFQUc5QyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQzs7RUFFaEQ7O0NBRUQsRUFBRSxDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsQ0FBQzs7Q0FFMUIsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxDQUFDO0NBQ2pELElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsQ0FBQztDQUN0RCxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQzs7Q0FFMUQsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDO0NBQ3BCLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQzs7Ozs7Q0FLM0IsS0FBSyxFQUFFLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxLQUFLLEdBQUc7O0VBRWxFLFFBQVEsR0FBRyxLQUFLLENBQUM7O0VBRWpCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsb0NBQW9DLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLG9CQUFvQixFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLGVBQWUsRUFBRSxFQUFFLHNCQUFzQixFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLENBQUM7O0VBRTlNLE1BQU0sS0FBSyxVQUFVLEtBQUssRUFBRSxHQUFHOztFQUUvQixPQUFPLENBQUMsSUFBSSxFQUFFLDRDQUE0QyxFQUFFLFVBQVUsRUFBRSxDQUFDOztFQUV6RSxNQUFNLEtBQUssU0FBUyxLQUFLLEVBQUUsSUFBSSxXQUFXLEtBQUssRUFBRSxHQUFHOztFQUVwRCxlQUFlLEdBQUcsS0FBSyxDQUFDOztFQUV4Qjs7Q0FFRCxLQUFLLGVBQWUsR0FBRzs7RUFFdEIsSUFBSSxDQUFDLFdBQVcsR0FBRzs7R0FFbEIsUUFBUSxFQUFFLFFBQVE7R0FDbEIsUUFBUSxFQUFFLFFBQVE7O0dBRWxCLFVBQVUsRUFBRSxVQUFVOztHQUV0QixZQUFZLEVBQUU7O0lBRWIsR0FBRyxFQUFFLFNBQVM7SUFDZCxNQUFNLEVBQUUsWUFBWTs7SUFFcEI7O0dBRUQsY0FBYyxFQUFFOztJQUVmLEdBQUcsRUFBRSxXQUFXO0lBQ2hCLE1BQU0sRUFBRSxjQUFjOztJQUV0Qjs7R0FFRCxDQUFDOztFQUVGOzs7O0NBSUQsRUFBRSxDQUFDLFlBQVksRUFBRSxjQUFjLEVBQUUsQ0FBQztDQUNsQyxFQUFFLENBQUMsWUFBWSxFQUFFLGdCQUFnQixFQUFFLENBQUM7Ozs7Q0FJcEMsSUFBSSxjQUFjLENBQUM7O0NBRW5CLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVzs7RUFFN0IsS0FBSyxjQUFjLEtBQUssU0FBUyxHQUFHOztHQUVuQyxjQUFjO0lBQ2IsSUFBSTNFLGVBQWEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDOztHQUU1Qzs7RUFFRCxPQUFPLGNBQWMsQ0FBQzs7RUFFdEIsQ0FBQzs7OztDQUlGLElBQUksZ0JBQWdCLENBQUM7O0NBRXJCLElBQUksQ0FBQyxhQUFhLEdBQUcsV0FBVzs7RUFFL0IsS0FBSyxnQkFBZ0IsS0FBSyxTQUFTLEdBQUc7O0dBRXJDLGdCQUFnQixHQUFHbUcseUJBQXVCLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDOztHQUUxRDs7RUFFRCxPQUFPLGdCQUFnQixDQUFDOztFQUV4QixDQUFDOzs7O0NBSUYsSUFBSSxDQUFDLE9BQU8sR0FBRyxXQUFXOztFQUV6QixFQUFFLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxDQUFDO0VBQzVCLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDOztFQUV6QixDQUFDOzs7O0NBSUYsTUFBTSxDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRTs7RUFFOUIsUUFBUSxFQUFFO0dBQ1QsR0FBRyxFQUFFLFdBQVc7O0lBRWYsT0FBTyxDQUFDLElBQUksRUFBRSxzREFBc0QsRUFBRSxDQUFDO0lBQ3ZFLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDOztJQUUxQjtHQUNEOztFQUVELFVBQVUsRUFBRTtHQUNYLEdBQUcsRUFBRSxXQUFXOztJQUVmLE9BQU8sQ0FBQyxJQUFJLEVBQUUsMERBQTBELEVBQUUsQ0FBQztJQUMzRSxPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzs7SUFFNUI7R0FDRDs7RUFFRCxFQUFFLENBQUM7Ozs7O0NBS0osSUFBSSxDQUFDLEVBQUUsR0FBR0csZ0JBQWMsR0FBRyxDQUFDO0NBQzVCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0NBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0NBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0NBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsY0FBYyxDQUFDO0NBQ25DLElBQUksQ0FBQyxjQUFjLEdBQUcsZ0JBQWdCLENBQUM7O0NBRXZDLE9BQU8sSUFBSSxDQUFDOztDQUVaOzs7Ozs7QUFNRCxTQUFTdytGLGVBQWEsRUFBRSxRQUFRLEVBQUUsWUFBWSxHQUFHOztDQUVoRCxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7O0NBRWxCLElBQUksU0FBUyxHQUFHO0VBQ2YsaUJBQWlCLEVBQUUsT0FBTztFQUMxQixrQkFBa0IsRUFBRSxRQUFRO0VBQzVCLGlCQUFpQixFQUFFLE9BQU87RUFDMUIsbUJBQW1CLEVBQUUsU0FBUztFQUM5QixpQkFBaUIsRUFBRSxPQUFPO0VBQzFCLGdCQUFnQixFQUFFLE9BQU87RUFDekIsb0JBQW9CLEVBQUUsVUFBVTtFQUNoQyxvQkFBb0IsRUFBRSxVQUFVO0VBQ2hDLGlCQUFpQixFQUFFLE9BQU87RUFDMUIsa0JBQWtCLEVBQUUsUUFBUTtFQUM1QixjQUFjLEVBQUUsUUFBUTtFQUN4QixDQUFDOztDQUVGLElBQUksY0FBYyxHQUFHO0VBQ3BCLFdBQVcsRUFBRSx3QkFBd0IsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCO0VBQ3JHLFVBQVUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLHFCQUFxQixFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsYUFBYTtFQUNuSCxjQUFjLEVBQUUsY0FBYyxFQUFFLGFBQWE7RUFDN0MsVUFBVSxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRO0VBQ2hFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSx3QkFBd0IsRUFBRSxVQUFVO0VBQ3RFLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsY0FBYztFQUM5RCxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0I7RUFDMUQsY0FBYyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsbUJBQW1CO0VBQ3ZGLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUseUJBQXlCO0VBQzdFLFdBQVcsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFFLGNBQWMsRUFBRSxXQUFXO0VBQ2hILENBQUM7OztDQUdGLFNBQVMsYUFBYSxFQUFFLE1BQU0sR0FBRzs7RUFFaEMsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztFQUMvQixJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDOztFQUUzQixLQUFLLFlBQVksQ0FBQyxtQkFBbUIsR0FBRzs7R0FFdkMsT0FBTyxJQUFJLENBQUM7O0dBRVosTUFBTTs7Ozs7Ozs7O0dBU04sSUFBSSxlQUFlLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUFDO0dBQ3JELElBQUksZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxlQUFlLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDOztHQUVqRSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLGVBQWUsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7O0dBRXpELEtBQUssUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUc7O0lBRTlCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsb0NBQW9DLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyw0QkFBNEIsR0FBRyxRQUFRLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDcEgsT0FBTyxDQUFDLENBQUM7O0lBRVQ7O0dBRUQsT0FBTyxRQUFRLENBQUM7O0dBRWhCOztFQUVEOztDQUVELFNBQVMseUJBQXlCLEVBQUUsR0FBRyxFQUFFLG1CQUFtQixHQUFHOztFQUU5RCxJQUFJLFFBQVEsQ0FBQzs7RUFFYixLQUFLLEVBQUUsR0FBRyxHQUFHOztHQUVaLFFBQVEsR0FBR3hxSSxnQkFBYyxDQUFDOztHQUUxQixNQUFNLEtBQUssR0FBRyxDQUFDLFNBQVMsR0FBRzs7R0FFM0IsUUFBUSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7O0dBRXhCLE1BQU0sS0FBSyxHQUFHLENBQUMsbUJBQW1CLEdBQUc7O0dBRXJDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsMkhBQTJILEVBQUUsQ0FBQztHQUM1SSxRQUFRLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7O0dBRWhDOzs7RUFHRCxLQUFLLFFBQVEsS0FBS0EsZ0JBQWMsSUFBSSxtQkFBbUIsR0FBRzs7R0FFekQsUUFBUSxHQUFHb3RDLGVBQWEsQ0FBQzs7R0FFekI7O0VBRUQsT0FBTyxRQUFRLENBQUM7O0VBRWhCOztDQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsV0FBVyxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxHQUFHOztFQUUvRixJQUFJLFFBQVEsR0FBRyxTQUFTLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDOzs7OztFQUsxQyxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsYUFBYSxHQUFHLGFBQWEsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDbEUsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDOztFQUV4QyxLQUFLLFFBQVEsQ0FBQyxTQUFTLEtBQUssSUFBSSxHQUFHOztHQUVsQyxTQUFTLEdBQUcsWUFBWSxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7O0dBRS9ELEtBQUssU0FBUyxLQUFLLFFBQVEsQ0FBQyxTQUFTLEdBQUc7O0lBRXZDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsbUNBQW1DLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUM7O0lBRXZIOztHQUVEOztFQUVELElBQUksbUJBQW1CLEdBQUcsUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDOztFQUVyRCxJQUFJLFVBQVUsR0FBRzs7R0FFaEIsUUFBUSxFQUFFLFFBQVE7O0dBRWxCLFNBQVMsRUFBRSxTQUFTO0dBQ3BCLHNCQUFzQixFQUFFLFlBQVksQ0FBQyxjQUFjO0dBQ25ELGNBQWMsRUFBRSx5QkFBeUIsRUFBRSxFQUFFLEVBQUUsbUJBQW1CLEtBQUssSUFBSSxHQUFHLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFO0dBQ2pJLEdBQUcsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLEdBQUc7R0FDcEIsV0FBVyxFQUFFLHlCQUF5QixFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRTtHQUMzRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxNQUFNO0dBQzFCLFVBQVUsRUFBRSxRQUFRLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTztHQUN0RCxjQUFjLEVBQUUseUJBQXlCLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFFO0dBQ2pGLFlBQVksRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsTUFBTSxRQUFRLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEtBQUtlLHlCQUF1QixRQUFRLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxLQUFLQyx5QkFBdUIsRUFBRSxFQUFFO0dBQzlKLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLFFBQVE7R0FDOUIsS0FBSyxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBSztHQUN4QixXQUFXLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxXQUFXO0dBQ3BDLG1CQUFtQixFQUFFLHlCQUF5QixFQUFFLFFBQVEsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRTtHQUMzRixPQUFPLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxPQUFPO0dBQzVCLFNBQVMsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLFNBQVM7R0FDaEMsZUFBZSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsZUFBZTtHQUM1QyxZQUFZLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxZQUFZO0dBQ3RDLFlBQVksRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLFlBQVk7R0FDdEMsV0FBVyxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsV0FBVztHQUNwQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxRQUFROztHQUU5QixXQUFXLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxXQUFXOztHQUVwQyxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU87O0dBRXpCLFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWTs7R0FFbkMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHO0dBQ1gsTUFBTSxFQUFFLFFBQVEsQ0FBQyxHQUFHO0dBQ3BCLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLFNBQVMsRUFBRTs7R0FFaEMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxPQUFPLEtBQUt4YyxhQUFXOztHQUU3QyxlQUFlLEVBQUUsUUFBUSxDQUFDLGVBQWU7R0FDekMsc0JBQXNCLEVBQUUsWUFBWSxDQUFDLHNCQUFzQjs7R0FFM0QsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRLElBQUksUUFBUSxHQUFHLENBQUM7R0FDM0MsUUFBUSxFQUFFLFFBQVE7R0FDbEIsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLG1CQUFtQjs7R0FFbEQsWUFBWSxFQUFFLFFBQVEsQ0FBQyxZQUFZO0dBQ25DLFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWTtHQUNuQyxlQUFlLEVBQUUsUUFBUSxDQUFDLGVBQWU7R0FDekMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxlQUFlOztHQUV6QyxZQUFZLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNO0dBQ3ZDLGNBQWMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU07R0FDbkMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTTtHQUNqQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU07R0FDekMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTTs7R0FFakMsaUJBQWlCLEVBQUUsV0FBVztHQUM5QixtQkFBbUIsRUFBRSxpQkFBaUI7O0dBRXRDLFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUzs7R0FFN0IsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLGFBQWEsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDO0dBQ2pHLGFBQWEsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUk7O0dBRXRDLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVztHQUNqQyx1QkFBdUIsRUFBRSxRQUFRLENBQUMsdUJBQXVCOztHQUV6RCxrQkFBa0IsRUFBRSxRQUFRLENBQUMsa0JBQWtCOztHQUUvQyxTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVM7R0FDN0IsV0FBVyxFQUFFLFFBQVEsQ0FBQyxJQUFJLEtBQUt1SCxZQUFVO0dBQ3pDLFNBQVMsRUFBRSxRQUFRLENBQUMsSUFBSSxLQUFLRCxVQUFROztHQUVyQyxZQUFZLEVBQUUsRUFBRSxRQUFRLENBQUMsWUFBWSxLQUFLLFNBQVMsS0FBSyxRQUFRLENBQUMsWUFBWSxHQUFHLEtBQUs7O0dBRXJGLENBQUM7O0VBRUYsT0FBTyxVQUFVLENBQUM7O0VBRWxCLENBQUM7O0NBRUYsSUFBSSxDQUFDLGNBQWMsR0FBRyxXQUFXLFFBQVEsRUFBRSxVQUFVLEdBQUc7O0VBRXZELElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQzs7RUFFZixLQUFLLFVBQVUsQ0FBQyxRQUFRLEdBQUc7O0dBRTFCLEtBQUssQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDOztHQUVsQyxNQUFNOztHQUVOLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDO0dBQ3RDLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDOztHQUVwQzs7RUFFRCxLQUFLLFFBQVEsQ0FBQyxPQUFPLEtBQUssU0FBUyxHQUFHOztHQUVyQyxNQUFNLElBQUksSUFBSSxJQUFJLFFBQVEsQ0FBQyxPQUFPLEdBQUc7O0lBRXBDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDbkIsS0FBSyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7O0lBRXZDOztHQUVEOztFQUVELE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHOztHQUVsRCxLQUFLLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDOztHQUVoRDs7RUFFRCxPQUFPLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7RUFFcEIsQ0FBQzs7Q0FFRixJQUFJLENBQUMsY0FBYyxHQUFHLFdBQVcsUUFBUSxFQUFFLFVBQVUsRUFBRSxJQUFJLEdBQUc7O0VBRTdELElBQUksT0FBTyxDQUFDOzs7RUFHWixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztHQUVyRCxJQUFJLFdBQVcsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0dBRWhDLEtBQUssV0FBVyxDQUFDLElBQUksS0FBSyxJQUFJLEdBQUc7O0lBRWhDLE9BQU8sR0FBRyxXQUFXLENBQUM7SUFDdEIsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDOztJQUVyQixNQUFNOztJQUVOOztHQUVEOztFQUVELEtBQUssT0FBTyxLQUFLLFNBQVMsR0FBRzs7R0FFNUIsT0FBTyxHQUFHLElBQUlxeEcsY0FBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDO0dBQ25FLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7O0dBRXpCOztFQUVELE9BQU8sT0FBTyxDQUFDOztFQUVmLENBQUM7O0NBRUYsSUFBSSxDQUFDLGNBQWMsR0FBRyxXQUFXLE9BQU8sR0FBRzs7RUFFMUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxTQUFTLEtBQUssQ0FBQyxHQUFHOzs7R0FHakMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztHQUNwQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEdBQUcsUUFBUSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7R0FDaEQsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDOzs7R0FHZixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7O0dBRWxCOztFQUVELENBQUM7OztDQUdGLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDOztDQUV6Qjs7Ozs7O0FBTUQsU0FBU0UsZUFBYSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLFVBQVUsR0FBRzs7Q0FFdEcsSUFBSSxTQUFTLEtBQUssT0FBTyxzQkFBc0IsS0FBSyxXQUFXLElBQUksR0FBRyxZQUFZLHNCQUFzQixFQUFFLENBQUM7Ozs7Q0FJM0csU0FBUyxjQUFjLEVBQUUsS0FBSyxFQUFFLE9BQU8sR0FBRzs7RUFFekMsS0FBSyxLQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLE9BQU8sR0FBRzs7Ozs7R0FLdEQsSUFBSSxLQUFLLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7O0dBRTVELElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxlQUFlLEVBQUUsOEJBQThCLEVBQUUsUUFBUSxFQUFFLENBQUM7R0FDbEYsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxFQUFFLENBQUM7R0FDakQsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxFQUFFLENBQUM7O0dBRW5ELElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUM7R0FDeEMsT0FBTyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7R0FFL0YsT0FBTyxDQUFDLElBQUksRUFBRSx5Q0FBeUMsR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7O0dBRTVKLE9BQU8sTUFBTSxDQUFDOztHQUVkOztFQUVELE9BQU8sS0FBSyxDQUFDOztFQUViOztDQUVELFNBQVMsWUFBWSxFQUFFLEtBQUssR0FBRzs7RUFFOUIsT0FBT25pSixPQUFLLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSUEsT0FBSyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7O0VBRS9FOztDQUVELFNBQVMsY0FBYyxFQUFFLEtBQUssR0FBRzs7RUFFaEMsS0FBSyxLQUFLLFlBQVksZ0JBQWdCLElBQUksS0FBSyxZQUFZLGlCQUFpQixHQUFHOztHQUU5RSxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsZUFBZSxFQUFFLDhCQUE4QixFQUFFLFFBQVEsRUFBRSxDQUFDO0dBQ2xGLE1BQU0sQ0FBQyxLQUFLLEdBQUdBLE9BQUssQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7R0FDdEQsTUFBTSxDQUFDLE1BQU0sR0FBR0EsT0FBSyxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7R0FFeEQsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQztHQUN4QyxPQUFPLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDOztHQUU5RCxPQUFPLENBQUMsSUFBSSxFQUFFLGtEQUFrRCxHQUFHLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQzs7R0FFckssT0FBTyxNQUFNLENBQUM7O0dBRWQ7O0VBRUQsT0FBTyxLQUFLLENBQUM7O0VBRWI7O0NBRUQsU0FBUyxzQkFBc0IsRUFBRSxPQUFPLEdBQUc7O0VBRTFDLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxLQUFLK1cscUJBQW1CLElBQUksT0FBTyxDQUFDLEtBQUssS0FBS0EscUJBQW1CO0tBQ3BGLE9BQU8sQ0FBQyxTQUFTLEtBQUt5RCxlQUFhLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBS3hELGNBQVksRUFBRSxDQUFDOztFQUUvRTs7OztDQUlELFNBQVMsY0FBYyxFQUFFLENBQUMsR0FBRzs7RUFFNUIsS0FBSyxDQUFDLEtBQUt3RCxlQUFhLElBQUksQ0FBQyxLQUFLbThDLDRCQUEwQixJQUFJLENBQUMsS0FBS0MsMkJBQXlCLEdBQUc7O0dBRWpHLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQzs7R0FFbkI7O0VBRUQsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDOztFQUVsQjs7OztDQUlELFNBQVMsZ0JBQWdCLEVBQUUsS0FBSyxHQUFHOztFQUVsQyxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDOztFQUUzQixPQUFPLENBQUMsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLENBQUM7O0VBRTNELGlCQUFpQixFQUFFLE9BQU8sRUFBRSxDQUFDOztFQUU3QixVQUFVLENBQUMsUUFBUSxHQUFHLENBQUM7OztFQUd2Qjs7Q0FFRCxTQUFTLHFCQUFxQixFQUFFLEtBQUssR0FBRzs7RUFFdkMsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQzs7RUFFaEMsWUFBWSxDQUFDLG1CQUFtQixFQUFFLFNBQVMsRUFBRSxxQkFBcUIsRUFBRSxDQUFDOztFQUVyRSxzQkFBc0IsRUFBRSxZQUFZLEVBQUUsQ0FBQzs7RUFFdkMsVUFBVSxDQUFDLFFBQVEsR0FBRyxDQUFDOztFQUV2Qjs7OztDQUlELFNBQVMsaUJBQWlCLEVBQUUsT0FBTyxHQUFHOztFQUVyQyxJQUFJLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUM7O0VBRWxELEtBQUssT0FBTyxDQUFDLEtBQUssSUFBSSxpQkFBaUIsQ0FBQyx5QkFBeUIsR0FBRzs7OztHQUluRSxHQUFHLENBQUMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLHlCQUF5QixFQUFFLENBQUM7O0dBRWpFLE1BQU07Ozs7R0FJTixLQUFLLGlCQUFpQixDQUFDLFdBQVcsS0FBSyxTQUFTLEdBQUcsT0FBTzs7R0FFMUQsR0FBRyxDQUFDLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQzs7R0FFdEQ7OztFQUdELFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7O0VBRTdCOztDQUVELFNBQVMsc0JBQXNCLEVBQUUsWUFBWSxHQUFHOztFQUUvQyxJQUFJLHNCQUFzQixHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLENBQUM7RUFDNUQsSUFBSSxpQkFBaUIsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7RUFFL0QsS0FBSyxFQUFFLFlBQVksR0FBRyxPQUFPOztFQUU3QixLQUFLLGlCQUFpQixDQUFDLGNBQWMsS0FBSyxTQUFTLEdBQUc7O0dBRXJELEdBQUcsQ0FBQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsY0FBYyxFQUFFLENBQUM7O0dBRXREOztFQUVELEtBQUssWUFBWSxDQUFDLFlBQVksR0FBRzs7R0FFaEMsWUFBWSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7R0FFcEM7O0VBRUQsS0FBSyxZQUFZLENBQUMsdUJBQXVCLEdBQUc7O0dBRTNDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0lBRTlCLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQ3hFLEtBQUssc0JBQXNCLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxDQUFDLGtCQUFrQixFQUFFLHNCQUFzQixDQUFDLGtCQUFrQixFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0lBRTFIOztHQUVELE1BQU07O0dBRU4sR0FBRyxDQUFDLGlCQUFpQixFQUFFLHNCQUFzQixDQUFDLGtCQUFrQixFQUFFLENBQUM7R0FDbkUsS0FBSyxzQkFBc0IsQ0FBQyxrQkFBa0IsR0FBRyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsc0JBQXNCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzs7R0FFckg7O0VBRUQsVUFBVSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7RUFDMUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQzs7RUFFbEM7Ozs7OztDQU1ELFNBQVMsWUFBWSxFQUFFLE9BQU8sRUFBRSxJQUFJLEdBQUc7O0VBRXRDLElBQUksaUJBQWlCLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQzs7RUFFbEQsS0FBSyxPQUFPLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxTQUFTLEtBQUssT0FBTyxDQUFDLE9BQU8sR0FBRzs7R0FFN0UsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQzs7R0FFMUIsS0FBSyxLQUFLLEtBQUssU0FBUyxHQUFHOztJQUUxQixPQUFPLENBQUMsSUFBSSxFQUFFLHVFQUF1RSxFQUFFLE9BQU8sRUFBRSxDQUFDOztJQUVqRyxNQUFNLEtBQUssS0FBSyxDQUFDLFFBQVEsS0FBSyxLQUFLLEdBQUc7O0lBRXRDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsd0VBQXdFLEVBQUUsT0FBTyxFQUFFLENBQUM7O0lBRWxHLE1BQU07O0lBRU4sYUFBYSxFQUFFLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNsRCxPQUFPOztJQUVQOztHQUVEOztFQUVELEtBQUssQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLEVBQUUsQ0FBQztFQUMzQyxLQUFLLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsY0FBYyxFQUFFLENBQUM7O0VBRXRFOztDQUVELFNBQVMsY0FBYyxFQUFFLE9BQU8sRUFBRSxJQUFJLEdBQUc7O0VBRXhDLElBQUksaUJBQWlCLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQzs7RUFFbEQsS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEdBQUc7O0dBRWpDLEtBQUssT0FBTyxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksaUJBQWlCLENBQUMsU0FBUyxLQUFLLE9BQU8sQ0FBQyxPQUFPLEdBQUc7O0lBRTdFLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyx5QkFBeUIsR0FBRzs7S0FFcEQsT0FBTyxDQUFDLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDOztLQUV4RCxpQkFBaUIsQ0FBQyx5QkFBeUIsR0FBRyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7O0tBRWxFLFVBQVUsQ0FBQyxRQUFRLEdBQUcsQ0FBQzs7S0FFdkI7O0lBRUQsS0FBSyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsUUFBUSxHQUFHLElBQUksRUFBRSxDQUFDO0lBQzNDLEtBQUssQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixFQUFFLGlCQUFpQixDQUFDLHlCQUF5QixFQUFFLENBQUM7O0lBRXZGLEdBQUcsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7SUFFMUQsSUFBSSxZQUFZLEtBQUssT0FBTyxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzlELElBQUksYUFBYSxLQUFLLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQzs7SUFFL0UsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDOztJQUVuQixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztLQUU5QixLQUFLLEVBQUUsWUFBWSxJQUFJLEVBQUUsYUFBYSxHQUFHOztNQUV4QyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEdBQUcsY0FBYyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLGNBQWMsRUFBRSxDQUFDOztNQUVuRixNQUFNOztNQUVOLFNBQVMsRUFBRSxDQUFDLEVBQUUsR0FBRyxhQUFhLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7TUFFL0U7O0tBRUQ7O0lBRUQsSUFBSSxLQUFLLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRTtJQUMxQixpQkFBaUIsR0FBRyxZQUFZLEVBQUUsS0FBSyxFQUFFO0lBQ3pDLFFBQVEsR0FBRyxjQUFjLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRTtJQUMzQyxNQUFNLEdBQUcsY0FBYyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7SUFFeEMsb0JBQW9CLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxDQUFDOztJQUV6RSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztLQUU5QixLQUFLLEVBQUUsWUFBWSxHQUFHOztNQUVyQixLQUFLLGFBQWEsR0FBRzs7T0FFcEIsS0FBSyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsMkJBQTJCLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7T0FFNUosTUFBTTs7T0FFTixLQUFLLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQywyQkFBMkIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztPQUV2Rzs7TUFFRCxNQUFNOztNQUVOLElBQUksTUFBTSxFQUFFLE9BQU8sR0FBRyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDOztNQUU3QyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztPQUVwRCxNQUFNLEdBQUcsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDOztPQUV0QixLQUFLLE9BQU8sQ0FBQyxNQUFNLEtBQUsxL0MsWUFBVSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUswaEQsV0FBUyxHQUFHOztRQUVwRSxLQUFLLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRzs7U0FFcEUsS0FBSyxDQUFDLG9CQUFvQixFQUFFLEdBQUcsQ0FBQywyQkFBMkIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7U0FFNUgsTUFBTTs7U0FFTixPQUFPLENBQUMsSUFBSSxFQUFFLGlHQUFpRyxFQUFFLENBQUM7O1NBRWxIOztRQUVELE1BQU07O1FBRU4sS0FBSyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsMkJBQTJCLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7UUFFcEk7O09BRUQ7O01BRUQ7O0tBRUQ7O0lBRUQsS0FBSyxPQUFPLENBQUMsZUFBZSxJQUFJLGlCQUFpQixHQUFHOztLQUVuRCxHQUFHLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOztLQUUzQzs7SUFFRCxpQkFBaUIsQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQzs7SUFFOUMsS0FBSyxPQUFPLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7O0lBRXBELE1BQU07O0lBRU4sS0FBSyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsUUFBUSxHQUFHLElBQUksRUFBRSxDQUFDO0lBQzNDLEtBQUssQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixFQUFFLGlCQUFpQixDQUFDLHlCQUF5QixFQUFFLENBQUM7O0lBRXZGOztHQUVEOztFQUVEOztDQUVELFNBQVMscUJBQXFCLEVBQUUsT0FBTyxFQUFFLElBQUksR0FBRzs7RUFFL0MsS0FBSyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsUUFBUSxHQUFHLElBQUksRUFBRSxDQUFDO0VBQzNDLEtBQUssQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7O0VBRXBGOztDQUVELFNBQVMsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsR0FBRzs7RUFFeEUsSUFBSSxTQUFTLENBQUM7O0VBRWQsS0FBSyxpQkFBaUIsR0FBRzs7R0FFeEIsR0FBRyxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsR0FBRyxDQUFDLGNBQWMsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7R0FDdEYsR0FBRyxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsR0FBRyxDQUFDLGNBQWMsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7O0dBRXRGLEdBQUcsQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7R0FDOUYsR0FBRyxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsR0FBRyxDQUFDLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQzs7R0FFOUYsTUFBTTs7R0FFTixHQUFHLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxHQUFHLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztHQUN4RSxHQUFHLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxHQUFHLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQzs7R0FFeEUsS0FBSyxPQUFPLENBQUMsS0FBSyxLQUFLN2hELHFCQUFtQixJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUtBLHFCQUFtQixHQUFHOztJQUVyRixPQUFPLENBQUMsSUFBSSxFQUFFLCtIQUErSCxFQUFFLE9BQU8sRUFBRSxDQUFDOztJQUV6Sjs7R0FFRCxHQUFHLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxHQUFHLENBQUMsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO0dBQzlGLEdBQUcsQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7O0dBRTlGLEtBQUssT0FBTyxDQUFDLFNBQVMsS0FBS3lELGVBQWEsSUFBSSxPQUFPLENBQUMsU0FBUyxLQUFLeEQsY0FBWSxHQUFHOztJQUVoRixPQUFPLENBQUMsSUFBSSxFQUFFLGlJQUFpSSxFQUFFLE9BQU8sRUFBRSxDQUFDOztJQUUzSjs7R0FFRDs7RUFFRCxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxnQ0FBZ0MsRUFBRSxDQUFDOztFQUUvRCxLQUFLLFNBQVMsR0FBRzs7R0FFaEIsS0FBSyxPQUFPLENBQUMsSUFBSSxLQUFLbWlELFdBQVMsSUFBSSxVQUFVLENBQUMsR0FBRyxFQUFFLDBCQUEwQixFQUFFLEtBQUssSUFBSSxHQUFHLE9BQU87R0FDbEcsS0FBSyxPQUFPLENBQUMsSUFBSSxLQUFLQyxlQUFhLElBQUksVUFBVSxDQUFDLEdBQUcsRUFBRSwrQkFBK0IsRUFBRSxLQUFLLElBQUksR0FBRyxPQUFPOztHQUUzRyxLQUFLLE9BQU8sQ0FBQyxVQUFVLEdBQUcsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsbUJBQW1CLEdBQUc7O0lBRTlFLEdBQUcsQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQywwQkFBMEIsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ3hJLFVBQVUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsbUJBQW1CLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQzs7SUFFbkU7O0dBRUQ7O0VBRUQ7O0NBRUQsU0FBUyxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLElBQUksR0FBRzs7RUFFMUQsS0FBSyxpQkFBaUIsQ0FBQyxXQUFXLEtBQUssU0FBUyxHQUFHOztHQUVsRCxpQkFBaUIsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDOztHQUVyQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLENBQUM7O0dBRXhELGlCQUFpQixDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7O0dBRXZELFVBQVUsQ0FBQyxRQUFRLEdBQUcsQ0FBQzs7R0FFdkI7O0VBRUQsS0FBSyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsUUFBUSxHQUFHLElBQUksRUFBRSxDQUFDO0VBQzNDLEtBQUssQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQzs7RUFFdEUsR0FBRyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0VBQzFELEdBQUcsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLDhCQUE4QixFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0VBQ2hGLEdBQUcsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQzs7RUFFakUsSUFBSSxLQUFLLEdBQUcsY0FBYyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLGNBQWMsRUFBRSxDQUFDOztFQUV6RSxLQUFLLHNCQUFzQixFQUFFLE9BQU8sRUFBRSxJQUFJLFlBQVksRUFBRSxLQUFLLEVBQUUsS0FBSyxLQUFLLEdBQUc7O0dBRTNFLEtBQUssR0FBRyxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUM7O0dBRWhDOztFQUVELElBQUksaUJBQWlCLEdBQUcsWUFBWSxFQUFFLEtBQUssRUFBRTtFQUM3QyxRQUFRLEdBQUcsY0FBYyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUU7RUFDM0MsTUFBTSxHQUFHLGNBQWMsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7O0VBRXhDLG9CQUFvQixFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLENBQUM7O0VBRW5FLElBQUksTUFBTSxFQUFFLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDOztFQUV0QyxLQUFLLE9BQU8sQ0FBQyxjQUFjLEdBQUc7Ozs7R0FJN0IsSUFBSSxjQUFjLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQzs7R0FFekMsS0FBSyxPQUFPLENBQUMsSUFBSSxLQUFLRCxXQUFTLEdBQUc7O0lBRWpDLEtBQUssQ0FBQyxTQUFTLEdBQUcsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0lBQ3BGLGNBQWMsR0FBRyxHQUFHLENBQUMsa0JBQWtCLENBQUM7O0lBRXhDLE1BQU0sS0FBSyxTQUFTLEdBQUc7OztJQUd2QixjQUFjLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixDQUFDOztJQUV2Qzs7R0FFRCxLQUFLLE9BQU8sQ0FBQyxNQUFNLEtBQUtlLGFBQVcsSUFBSSxjQUFjLEtBQUssR0FBRyxDQUFDLGVBQWUsR0FBRzs7Ozs7SUFLL0UsS0FBSyxPQUFPLENBQUMsSUFBSSxLQUFLQyxtQkFBaUIsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLQyxpQkFBZSxHQUFHOztZQUV0RSxPQUFPLENBQUMsSUFBSSxFQUFFLDZGQUE2RixFQUFFLENBQUM7O0tBRXJILE9BQU8sQ0FBQyxJQUFJLEdBQUdELG1CQUFpQixDQUFDO0tBQ2pDLE1BQU0sR0FBRyxjQUFjLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDOztLQUV4Qzs7SUFFRDs7OztHQUlELEtBQUssT0FBTyxDQUFDLE1BQU0sS0FBS0Usb0JBQWtCLEdBQUc7O0lBRTVDLGNBQWMsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDOzs7OztJQUtuQyxLQUFLLE9BQU8sQ0FBQyxJQUFJLEtBQUtFLG9CQUFrQixHQUFHOztZQUVuQyxPQUFPLENBQUMsSUFBSSxFQUFFLGtGQUFrRixFQUFFLENBQUM7O0tBRTFHLE9BQU8sQ0FBQyxJQUFJLEdBQUdBLG9CQUFrQixDQUFDO0tBQ2xDLE1BQU0sR0FBRyxjQUFjLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDOztLQUV4Qzs7SUFFRDs7R0FFRCxLQUFLLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7O0dBRTVHLE1BQU0sS0FBSyxPQUFPLENBQUMsYUFBYSxHQUFHOzs7Ozs7R0FNbkMsS0FBSyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxpQkFBaUIsR0FBRzs7SUFFOUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7S0FFcEQsTUFBTSxHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztLQUN0QixLQUFLLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDOztLQUUvRzs7SUFFRCxPQUFPLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQzs7SUFFaEMsTUFBTTs7SUFFTixLQUFLLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDOztJQUU1Rzs7R0FFRCxNQUFNLEtBQUssT0FBTyxDQUFDLG1CQUFtQixHQUFHOztHQUV6QyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztJQUVwRCxNQUFNLEdBQUcsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDOztJQUV0QixLQUFLLE9BQU8sQ0FBQyxNQUFNLEtBQUtyakQsWUFBVSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUswaEQsV0FBUyxHQUFHOztLQUVwRSxLQUFLLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRzs7TUFFcEUsS0FBSyxDQUFDLG9CQUFvQixFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7TUFFdkcsTUFBTTs7TUFFTixPQUFPLENBQUMsSUFBSSxFQUFFLGdHQUFnRyxFQUFFLENBQUM7O01BRWpIOztLQUVELE1BQU07O0tBRU4sS0FBSyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7S0FFL0c7O0lBRUQ7O0dBRUQsTUFBTTs7Ozs7Ozs7R0FRTixLQUFLLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLGlCQUFpQixHQUFHOztJQUU5QyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztLQUVwRCxNQUFNLEdBQUcsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO0tBQ3RCLEtBQUssQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7O0tBRTFFOztJQUVELE9BQU8sQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDOztJQUVoQyxNQUFNOztJQUVOLEtBQUssQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7O0lBRXpFOztHQUVEOztFQUVELEtBQUssT0FBTyxDQUFDLGVBQWUsSUFBSSxpQkFBaUIsR0FBRyxHQUFHLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQzs7RUFFekYsaUJBQWlCLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7O0VBRTlDLEtBQUssT0FBTyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDOztFQUVwRDs7Ozs7Q0FLRCxTQUFTLHVCQUF1QixFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLGFBQWEsR0FBRzs7RUFFeEYsSUFBSSxRQUFRLEdBQUcsY0FBYyxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7RUFDN0QsSUFBSSxNQUFNLEdBQUcsY0FBYyxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7RUFDekQsS0FBSyxDQUFDLFVBQVUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7RUFDbkgsR0FBRyxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxDQUFDO0VBQ3BELEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQ2pJLEdBQUcsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7RUFFN0M7OztDQUdELFNBQVMsd0JBQXdCLEVBQUUsWUFBWSxFQUFFLFlBQVksR0FBRzs7RUFFL0QsR0FBRyxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLENBQUM7O0VBRXZELEtBQUssWUFBWSxDQUFDLFdBQVcsSUFBSSxFQUFFLFlBQVksQ0FBQyxhQUFhLEdBQUc7O0dBRS9ELEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztHQUM1RyxHQUFHLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7R0FFckcsTUFBTSxLQUFLLFlBQVksQ0FBQyxXQUFXLElBQUksWUFBWSxDQUFDLGFBQWEsR0FBRzs7R0FFcEUsR0FBRyxDQUFDLG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztHQUN4RyxHQUFHLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7R0FFN0csTUFBTTs7O0dBR04sR0FBRyxDQUFDLG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7R0FFaEc7O0VBRUQsR0FBRyxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRS9DOzs7Q0FHRCxTQUFTLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxZQUFZLEdBQUc7O0VBRXZELElBQUksTUFBTSxLQUFLLFlBQVksSUFBSSxZQUFZLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztFQUN0RSxLQUFLLE1BQU0sR0FBRyxNQUFNLElBQUksS0FBSyxDQUFDLDBEQUEwRCxDQUFDLENBQUM7O0VBRTFGLEdBQUcsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQzs7RUFFcEQsS0FBSyxHQUFHLFlBQVksQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsR0FBRzs7R0FFakYsTUFBTSxJQUFJLEtBQUssQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDOztHQUV2Rjs7O0VBR0QsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDLGNBQWM7SUFDOUQsWUFBWSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLFlBQVksQ0FBQyxLQUFLO0lBQzVELFlBQVksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxZQUFZLENBQUMsTUFBTSxHQUFHO0dBQ2xFLFlBQVksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDO0dBQzNELFlBQVksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDO0dBQzdELFlBQVksQ0FBQyxZQUFZLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztHQUM3Qzs7RUFFRCxZQUFZLEVBQUUsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFN0MsSUFBSSxpQkFBaUIsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxjQUFjLENBQUM7O0VBRW5GLEtBQUssWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLEtBQUtzQixhQUFXLEdBQUc7O0dBRXZELEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLGlCQUFpQixFQUFFLENBQUMsRUFBRSxDQUFDOztHQUV4RyxNQUFNLEtBQUssWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLEtBQUtHLG9CQUFrQixHQUFHOztHQUVyRSxHQUFHLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7R0FFaEgsTUFBTTs7R0FFTixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDOztHQUU5Qzs7RUFFRDs7O0NBR0QsU0FBUyxzQkFBc0IsRUFBRSxZQUFZLEdBQUc7O0VBRS9DLElBQUksc0JBQXNCLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxZQUFZLEVBQUUsQ0FBQzs7RUFFNUQsSUFBSSxNQUFNLEtBQUssWUFBWSxDQUFDLHVCQUF1QixLQUFLLElBQUksRUFBRSxDQUFDOztFQUUvRCxLQUFLLFlBQVksQ0FBQyxZQUFZLEdBQUc7O0dBRWhDLEtBQUssTUFBTSxHQUFHLE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELENBQUMsQ0FBQzs7R0FFMUYsaUJBQWlCLEVBQUUsc0JBQXNCLENBQUMsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLENBQUM7O0dBRTdFLE1BQU07O0dBRU4sS0FBSyxNQUFNLEdBQUc7O0lBRWIsc0JBQXNCLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDOztJQUUvQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztLQUU5QixHQUFHLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxXQUFXLEVBQUUsc0JBQXNCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztLQUN2RixzQkFBc0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztLQUMxRSx3QkFBd0IsRUFBRSxzQkFBc0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQzs7S0FFekY7O0lBRUQsTUFBTTs7SUFFTixHQUFHLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxXQUFXLEVBQUUsc0JBQXNCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUNsRixzQkFBc0IsQ0FBQyxrQkFBa0IsR0FBRyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUNyRSx3QkFBd0IsRUFBRSxzQkFBc0IsQ0FBQyxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsQ0FBQzs7SUFFcEY7O0dBRUQ7O0VBRUQsR0FBRyxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDOztFQUU3Qzs7O0NBR0QsU0FBUyxpQkFBaUIsRUFBRSxZQUFZLEdBQUc7O0VBRTFDLElBQUksc0JBQXNCLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxZQUFZLEVBQUUsQ0FBQztFQUM1RCxJQUFJLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDOztFQUUvRCxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLHFCQUFxQixFQUFFLENBQUM7O0VBRWxFLGlCQUFpQixDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7O0VBRXZELFVBQVUsQ0FBQyxRQUFRLEdBQUcsQ0FBQzs7RUFFdkIsSUFBSSxNQUFNLEtBQUssWUFBWSxDQUFDLHVCQUF1QixLQUFLLElBQUksRUFBRSxDQUFDO0VBQy9ELElBQUksa0JBQWtCLEdBQUcsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDOzs7O0VBSXRELEtBQUssTUFBTSxHQUFHOztHQUViLHNCQUFzQixDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQzs7R0FFL0MsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7SUFFOUIsc0JBQXNCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixFQUFFLENBQUM7O0lBRXpFOztHQUVELE1BQU07O0dBRU4sc0JBQXNCLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixFQUFFLENBQUM7O0dBRXBFOzs7O0VBSUQsS0FBSyxNQUFNLEdBQUc7O0dBRWIsS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsaUJBQWlCLENBQUMsY0FBYyxFQUFFLENBQUM7R0FDNUUsb0JBQW9CLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQzs7R0FFdkYsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7SUFFOUIsdUJBQXVCLEVBQUUsc0JBQXNCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsMkJBQTJCLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0lBRXBKOztHQUVELEtBQUssWUFBWSxDQUFDLE9BQU8sQ0FBQyxlQUFlLElBQUksa0JBQWtCLEdBQUcsR0FBRyxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztHQUM3RyxLQUFLLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7R0FFaEQsTUFBTTs7R0FFTixLQUFLLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsY0FBYyxFQUFFLENBQUM7R0FDdEUsb0JBQW9CLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLENBQUM7R0FDakYsdUJBQXVCLEVBQUUsc0JBQXNCLENBQUMsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7O0dBRTFILEtBQUssWUFBWSxDQUFDLE9BQU8sQ0FBQyxlQUFlLElBQUksa0JBQWtCLEdBQUcsR0FBRyxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7R0FDdkcsS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDOztHQUUxQzs7OztFQUlELEtBQUssWUFBWSxDQUFDLFdBQVcsR0FBRzs7R0FFL0Isc0JBQXNCLEVBQUUsWUFBWSxFQUFFLENBQUM7O0dBRXZDOztFQUVEOztDQUVELFNBQVMsd0JBQXdCLEVBQUUsWUFBWSxHQUFHOztFQUVqRCxJQUFJLE9BQU8sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDOztFQUVuQyxLQUFLLE9BQU8sQ0FBQyxlQUFlLElBQUksWUFBWSxFQUFFLFlBQVksRUFBRTtJQUMxRCxPQUFPLENBQUMsU0FBUyxLQUFLNy9DLGVBQWE7SUFDbkMsT0FBTyxDQUFDLFNBQVMsS0FBS3hELGNBQVksR0FBRzs7R0FFdEMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLHVCQUF1QixJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDO0dBQzVHLElBQUksWUFBWSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsY0FBYyxDQUFDOztHQUU1RCxLQUFLLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQztHQUMxQyxHQUFHLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxDQUFDO0dBQzdCLEtBQUssQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDOztHQUVsQzs7RUFFRDs7Q0FFRCxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztDQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztDQUNyQyxJQUFJLENBQUMscUJBQXFCLEdBQUcscUJBQXFCLENBQUM7Q0FDbkQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO0NBQzNDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyx3QkFBd0IsQ0FBQzs7Q0FFekQ7Ozs7OztBQU1ELFNBQVNvckksaUJBQWUsR0FBRzs7Q0FFMUIsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDOztDQUVwQixTQUFTLEdBQUcsRUFBRSxNQUFNLEdBQUc7O0VBRXRCLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7RUFDdkIsSUFBSSxHQUFHLEdBQUcsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDOztFQUU3QixLQUFLLEdBQUcsS0FBSyxTQUFTLEdBQUc7O0dBRXhCLEdBQUcsR0FBRyxFQUFFLENBQUM7R0FDVCxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDOztHQUV6Qjs7RUFFRCxPQUFPLEdBQUcsQ0FBQzs7RUFFWDs7Q0FFRCxTQUFTLE1BQU0sRUFBRSxNQUFNLEdBQUc7O0VBRXpCLE9BQU8sVUFBVSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7RUFFakM7O0NBRUQsU0FBUyxLQUFLLEdBQUc7O0VBRWhCLFVBQVUsR0FBRyxFQUFFLENBQUM7O0VBRWhCOztDQUVELE9BQU87RUFDTixHQUFHLEVBQUUsR0FBRztFQUNSLE1BQU0sRUFBRSxNQUFNO0VBQ2QsS0FBSyxFQUFFLEtBQUs7RUFDWixDQUFDOztDQUVGOzs7Ozs7QUFNRCxTQUFTQyxZQUFVLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxjQUFjLEdBQUc7O0NBRXJELFNBQVMsV0FBVyxHQUFHOztFQUV0QixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7O0VBRW5CLElBQUksS0FBSyxHQUFHLElBQUlwcEksU0FBTyxFQUFFLENBQUM7RUFDMUIsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7RUFDNUIsSUFBSSxpQkFBaUIsR0FBRyxJQUFJQSxTQUFPLEVBQUUsQ0FBQzs7RUFFdEMsT0FBTzs7R0FFTixPQUFPLEVBQUUsV0FBVyxTQUFTLEdBQUc7O0lBRS9CLEtBQUssZ0JBQWdCLEtBQUssU0FBUyxJQUFJLEVBQUUsTUFBTSxHQUFHOztLQUVqRCxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDO0tBQzNELGdCQUFnQixHQUFHLFNBQVMsQ0FBQzs7S0FFN0I7O0lBRUQ7O0dBRUQsU0FBUyxFQUFFLFdBQVcsSUFBSSxHQUFHOztJQUU1QixNQUFNLEdBQUcsSUFBSSxDQUFDOztJQUVkOztHQUVELFFBQVEsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxrQkFBa0IsR0FBRzs7SUFFckQsS0FBSyxrQkFBa0IsS0FBSyxJQUFJLEdBQUc7O0tBRWxDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7S0FFdkI7O0lBRUQsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7SUFFeEIsS0FBSyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssS0FBSyxHQUFHOztLQUVsRCxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0tBQzVCLGlCQUFpQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7S0FFaEM7O0lBRUQ7O0dBRUQsS0FBSyxFQUFFLFlBQVk7O0lBRWxCLE1BQU0sR0FBRyxLQUFLLENBQUM7O0lBRWYsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0lBQ3hCLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7SUFFcEM7O0dBRUQsQ0FBQzs7RUFFRjs7Q0FFRCxTQUFTLFdBQVcsR0FBRzs7RUFFdEIsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDOztFQUVuQixJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQztFQUM1QixJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQztFQUM1QixJQUFJLGlCQUFpQixHQUFHLElBQUksQ0FBQzs7RUFFN0IsT0FBTzs7R0FFTixPQUFPLEVBQUUsV0FBVyxTQUFTLEdBQUc7O0lBRS9CLEtBQUssU0FBUyxHQUFHOztLQUVoQixNQUFNLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDOztLQUV4QixNQUFNOztLQUVOLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUM7O0tBRXpCOztJQUVEOztHQUVELE9BQU8sRUFBRSxXQUFXLFNBQVMsR0FBRzs7SUFFL0IsS0FBSyxnQkFBZ0IsS0FBSyxTQUFTLElBQUksRUFBRSxNQUFNLEdBQUc7O0tBRWpELEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUM7S0FDMUIsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDOztLQUU3Qjs7SUFFRDs7R0FFRCxPQUFPLEVBQUUsV0FBVyxTQUFTLEdBQUc7O0lBRS9CLEtBQUssZ0JBQWdCLEtBQUssU0FBUyxHQUFHOztLQUVyQyxLQUFLLFNBQVMsR0FBRzs7TUFFaEIsU0FBUyxTQUFTOztPQUVqQixLQUFLNGxJLFlBQVU7O1FBRWQsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekIsTUFBTTs7T0FFUCxLQUFLQyxhQUFXOztRQUVmLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzFCLE1BQU07O09BRVAsS0FBS0MsV0FBUzs7UUFFYixFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4QixNQUFNOztPQUVQLEtBQUs3MkcsZ0JBQWM7O1FBRWxCLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzFCLE1BQU07O09BRVAsS0FBSzgyRyxZQUFVOztRQUVkLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLE1BQU07O09BRVAsS0FBS0MsbUJBQWlCOztRQUVyQixFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxQixNQUFNOztPQUVQLEtBQUtDLGNBQVk7O1FBRWhCLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNCLE1BQU07O09BRVAsS0FBS0MsZUFBYTs7UUFFakIsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDNUIsTUFBTTs7T0FFUDs7UUFFQyxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7T0FFM0I7O01BRUQsTUFBTTs7TUFFTixFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7TUFFMUI7O0tBRUQsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDOztLQUU3Qjs7SUFFRDs7R0FFRCxTQUFTLEVBQUUsV0FBVyxJQUFJLEdBQUc7O0lBRTVCLE1BQU0sR0FBRyxJQUFJLENBQUM7O0lBRWQ7O0dBRUQsUUFBUSxFQUFFLFdBQVcsS0FBSyxHQUFHOztJQUU1QixLQUFLLGlCQUFpQixLQUFLLEtBQUssR0FBRzs7S0FFbEMsRUFBRSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQztLQUN2QixpQkFBaUIsR0FBRyxLQUFLLENBQUM7O0tBRTFCOztJQUVEOztHQUVELEtBQUssRUFBRSxZQUFZOztJQUVsQixNQUFNLEdBQUcsS0FBSyxDQUFDOztJQUVmLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUN4QixnQkFBZ0IsR0FBRyxJQUFJLENBQUM7SUFDeEIsaUJBQWlCLEdBQUcsSUFBSSxDQUFDOztJQUV6Qjs7R0FFRCxDQUFDOztFQUVGOztDQUVELFNBQVMsYUFBYSxHQUFHOztFQUV4QixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7O0VBRW5CLElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0VBQzlCLElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0VBQzlCLElBQUksaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0VBQzdCLElBQUksc0JBQXNCLEdBQUcsSUFBSSxDQUFDO0VBQ2xDLElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0VBQzlCLElBQUksbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0VBQy9CLElBQUksbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0VBQy9CLElBQUksbUJBQW1CLEdBQUcsSUFBSSxDQUFDOztFQUUvQixPQUFPOztHQUVOLE9BQU8sRUFBRSxXQUFXLFdBQVcsR0FBRzs7SUFFakMsS0FBSyxXQUFXLEdBQUc7O0tBRWxCLE1BQU0sRUFBRSxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7O0tBRTFCLE1BQU07O0tBRU4sT0FBTyxFQUFFLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQzs7S0FFM0I7O0lBRUQ7O0dBRUQsT0FBTyxFQUFFLFdBQVcsV0FBVyxHQUFHOztJQUVqQyxLQUFLLGtCQUFrQixLQUFLLFdBQVcsSUFBSSxFQUFFLE1BQU0sR0FBRzs7S0FFckQsRUFBRSxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQztLQUM5QixrQkFBa0IsR0FBRyxXQUFXLENBQUM7O0tBRWpDOztJQUVEOztHQUVELE9BQU8sRUFBRSxXQUFXLFdBQVcsRUFBRSxVQUFVLEVBQUUsV0FBVyxHQUFHOztJQUUxRCxLQUFLLGtCQUFrQixLQUFLLFdBQVc7U0FDbEMsaUJBQWlCLE1BQU0sVUFBVTtTQUNqQyxzQkFBc0IsS0FBSyxXQUFXLEdBQUc7O0tBRTdDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsQ0FBQzs7S0FFdkQsa0JBQWtCLEdBQUcsV0FBVyxDQUFDO0tBQ2pDLGlCQUFpQixHQUFHLFVBQVUsQ0FBQztLQUMvQixzQkFBc0IsR0FBRyxXQUFXLENBQUM7O0tBRXJDOztJQUVEOztHQUVELEtBQUssRUFBRSxXQUFXLFdBQVcsRUFBRSxZQUFZLEVBQUUsWUFBWSxHQUFHOztJQUUzRCxLQUFLLGtCQUFrQixNQUFNLFdBQVc7U0FDbkMsbUJBQW1CLEtBQUssWUFBWTtTQUNwQyxtQkFBbUIsS0FBSyxZQUFZLEdBQUc7O0tBRTNDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7S0FFeEQsa0JBQWtCLEdBQUcsV0FBVyxDQUFDO0tBQ2pDLG1CQUFtQixHQUFHLFlBQVksQ0FBQztLQUNuQyxtQkFBbUIsR0FBRyxZQUFZLENBQUM7O0tBRW5DOztJQUVEOztHQUVELFNBQVMsRUFBRSxXQUFXLElBQUksR0FBRzs7SUFFNUIsTUFBTSxHQUFHLElBQUksQ0FBQzs7SUFFZDs7R0FFRCxRQUFRLEVBQUUsV0FBVyxPQUFPLEdBQUc7O0lBRTlCLEtBQUssbUJBQW1CLEtBQUssT0FBTyxHQUFHOztLQUV0QyxFQUFFLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFDO0tBQzNCLG1CQUFtQixHQUFHLE9BQU8sQ0FBQzs7S0FFOUI7O0lBRUQ7O0dBRUQsS0FBSyxFQUFFLFlBQVk7O0lBRWxCLE1BQU0sR0FBRyxLQUFLLENBQUM7O0lBRWYsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0lBQzFCLGtCQUFrQixHQUFHLElBQUksQ0FBQztJQUMxQixpQkFBaUIsR0FBRyxJQUFJLENBQUM7SUFDekIsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO0lBQzlCLGtCQUFrQixHQUFHLElBQUksQ0FBQztJQUMxQixtQkFBbUIsR0FBRyxJQUFJLENBQUM7SUFDM0IsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0lBQzNCLG1CQUFtQixHQUFHLElBQUksQ0FBQzs7SUFFM0I7O0dBRUQsQ0FBQzs7RUFFRjs7OztDQUlELElBQUksV0FBVyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7Q0FDcEMsSUFBSSxXQUFXLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztDQUNwQyxJQUFJLGFBQWEsR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDOztDQUV4QyxJQUFJLG1CQUFtQixHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Q0FDbkUsSUFBSSxhQUFhLEdBQUcsSUFBSSxVQUFVLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQztDQUMxRCxJQUFJLGlCQUFpQixHQUFHLElBQUksVUFBVSxFQUFFLG1CQUFtQixFQUFFLENBQUM7Q0FDOUQsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLFVBQVUsRUFBRSxtQkFBbUIsRUFBRSxDQUFDOztDQUU5RCxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7O0NBRXRCLElBQUksd0JBQXdCLEdBQUcsSUFBSSxDQUFDOztDQUVwQyxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUM7Q0FDM0IsSUFBSSxvQkFBb0IsR0FBRyxJQUFJLENBQUM7Q0FDaEMsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDO0NBQzNCLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQztDQUMzQixJQUFJLHlCQUF5QixHQUFHLElBQUksQ0FBQztDQUNyQyxJQUFJLG9CQUFvQixHQUFHLElBQUksQ0FBQztDQUNoQyxJQUFJLG9CQUFvQixHQUFHLElBQUksQ0FBQztDQUNoQyxJQUFJLHdCQUF3QixHQUFHLEtBQUssQ0FBQzs7Q0FFckMsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7Q0FDNUIsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDOztDQUUzQixJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQzs7Q0FFNUIsSUFBSSwwQkFBMEIsR0FBRyxJQUFJLENBQUM7Q0FDdEMsSUFBSSx5QkFBeUIsR0FBRyxJQUFJLENBQUM7O0NBRXJDLElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDOztDQUU5QixJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDOztDQUVoRSxJQUFJLE9BQU8sR0FBRyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUN6RixJQUFJLGtCQUFrQixHQUFHLFVBQVUsRUFBRSxPQUFPLEVBQUUsSUFBSSxHQUFHLENBQUM7O0NBRXRELElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0NBQzlCLElBQUksb0JBQW9CLEdBQUcsRUFBRSxDQUFDOztDQUU5QixJQUFJLGNBQWMsR0FBRyxJQUFJbG1JLFNBQU8sRUFBRSxDQUFDO0NBQ25DLElBQUksZUFBZSxHQUFHLElBQUlBLFNBQU8sRUFBRSxDQUFDOztDQUVwQyxTQUFTLGFBQWEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssR0FBRzs7RUFFN0MsSUFBSSxJQUFJLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDL0IsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDOztFQUVqQyxFQUFFLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztFQUNoQyxFQUFFLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO0VBQzVELEVBQUUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7O0VBRTVELE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0dBRWxDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUM7O0dBRWxGOztFQUVELE9BQU8sT0FBTyxDQUFDOztFQUVmOztDQUVELElBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQztDQUN2QixhQUFhLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxHQUFHLGFBQWEsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbEYsYUFBYSxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLGFBQWEsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLDJCQUEyQixFQUFFLENBQUMsRUFBRSxDQUFDOzs7O0NBSS9HLFNBQVMsSUFBSSxHQUFHOztFQUVmLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDbkMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUMxQixhQUFhLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUU1QixNQUFNLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO0VBQ3hCLFdBQVcsQ0FBQyxPQUFPLEVBQUVpdkIsZ0JBQWMsRUFBRSxDQUFDOztFQUV0QyxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUM7RUFDdEIsV0FBVyxFQUFFaXFCLGNBQVksRUFBRSxDQUFDO0VBQzVCLE1BQU0sRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7O0VBRXZCLE1BQU0sRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7RUFDbkIsV0FBVyxFQUFFanJCLGdCQUFjLEVBQUUsQ0FBQzs7RUFFOUI7O0NBRUQsU0FBUyxjQUFjLEdBQUc7O0VBRXpCLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0dBRXhELGFBQWEsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0dBRXZCOztFQUVEOztDQUVELFNBQVMsZUFBZSxFQUFFLFNBQVMsR0FBRzs7RUFFckMsYUFBYSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7RUFFL0IsS0FBSyxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLEdBQUc7O0dBRTNDLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsQ0FBQztHQUN4QyxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7O0dBRW5DOztFQUVELEtBQUssaUJBQWlCLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxHQUFHOztHQUUzQyxJQUFJLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLHdCQUF3QixFQUFFLENBQUM7O0dBRTNELFNBQVMsQ0FBQyx3QkFBd0IsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7R0FDbkQsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztHQUVuQzs7RUFFRDs7Q0FFRCxTQUFTLHlCQUF5QixFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsR0FBRzs7RUFFakUsYUFBYSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7RUFFL0IsS0FBSyxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLEdBQUc7O0dBRTNDLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsQ0FBQztHQUN4QyxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7O0dBRW5DOztFQUVELEtBQUssaUJBQWlCLEVBQUUsU0FBUyxFQUFFLEtBQUssZ0JBQWdCLEdBQUc7O0dBRTFELElBQUksU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQzs7R0FFM0QsU0FBUyxDQUFDLHdCQUF3QixFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO0dBQ2xFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxHQUFHLGdCQUFnQixDQUFDOztHQUVsRDs7RUFFRDs7Q0FFRCxTQUFTLHVCQUF1QixHQUFHOztFQUVsQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0dBRTlELEtBQUssaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLEtBQUssYUFBYSxFQUFFLENBQUMsRUFBRSxHQUFHOztJQUVwRCxFQUFFLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDakMsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztJQUUzQjs7R0FFRDs7RUFFRDs7Q0FFRCxTQUFTLE1BQU0sRUFBRSxFQUFFLEdBQUc7O0VBRXJCLEtBQUssWUFBWSxFQUFFLEVBQUUsRUFBRSxLQUFLLElBQUksR0FBRzs7R0FFbEMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQztHQUNoQixZQUFZLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDOztHQUUxQjs7RUFFRDs7Q0FFRCxTQUFTLE9BQU8sRUFBRSxFQUFFLEdBQUc7O0VBRXRCLEtBQUssWUFBWSxFQUFFLEVBQUUsRUFBRSxLQUFLLEtBQUssR0FBRzs7R0FFbkMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQztHQUNqQixZQUFZLEVBQUUsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDOztHQUUzQjs7RUFFRDs7Q0FFRCxTQUFTLDJCQUEyQixHQUFHOztFQUV0QyxLQUFLLHdCQUF3QixLQUFLLElBQUksR0FBRzs7R0FFeEMsd0JBQXdCLEdBQUcsRUFBRSxDQUFDOztHQUU5QixLQUFLLFVBQVUsQ0FBQyxHQUFHLEVBQUUsZ0NBQWdDLEVBQUU7UUFDbEQsVUFBVSxDQUFDLEdBQUcsRUFBRSwrQkFBK0IsRUFBRTtRQUNqRCxVQUFVLENBQUMsR0FBRyxFQUFFLCtCQUErQixFQUFFLEdBQUc7O0lBRXhELElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLDBCQUEwQixFQUFFLENBQUM7O0lBRS9ELE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHOztLQUUzQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0tBRTlDOztJQUVEOztHQUVEOztFQUVELE9BQU8sd0JBQXdCLENBQUM7O0VBRWhDOztDQUVELFNBQVMsV0FBVyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixHQUFHOztFQUV6SSxLQUFLLFFBQVEsS0FBSzZyQixZQUFVLEdBQUc7O0dBRTlCLE1BQU0sRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7O0dBRW5CLE1BQU07O0dBRU4sT0FBTyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7R0FFcEI7O0VBRUQsS0FBSyxRQUFRLEtBQUssZUFBZSxJQUFJLGtCQUFrQixLQUFLLHdCQUF3QixHQUFHOztHQUV0RixLQUFLLFFBQVEsS0FBS210QyxrQkFBZ0IsR0FBRzs7SUFFcEMsS0FBSyxrQkFBa0IsR0FBRzs7S0FFekIsRUFBRSxDQUFDLHFCQUFxQixFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO0tBQ3JELEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7O0tBRXZELE1BQU07O0tBRU4sRUFBRSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7S0FDaEMsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7S0FFckM7O0lBRUQsTUFBTSxLQUFLLFFBQVEsS0FBS0MscUJBQW1CLEdBQUc7O0lBRTlDLEtBQUssa0JBQWtCLEdBQUc7O0tBRXpCLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztLQUNyRCxFQUFFLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsQ0FBQzs7S0FFekYsTUFBTTs7S0FFTixFQUFFLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztLQUNoQyxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLENBQUM7O0tBRWhEOztJQUVELE1BQU0sS0FBSyxRQUFRLEtBQUtDLGtCQUFnQixHQUFHOztJQUUzQyxLQUFLLGtCQUFrQixHQUFHOztLQUV6QixFQUFFLENBQUMscUJBQXFCLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7S0FDckQsRUFBRSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7S0FFckUsTUFBTTs7S0FFTixFQUFFLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztLQUNoQyxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDOztLQUV0Qzs7SUFFRCxNQUFNOztJQUVOLEtBQUssa0JBQWtCLEdBQUc7O0tBRXpCLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztLQUNyRCxFQUFFLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsQ0FBQzs7S0FFdkYsTUFBTTs7S0FFTixFQUFFLENBQUMscUJBQXFCLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7S0FDckQsRUFBRSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLENBQUM7O0tBRTdGOztJQUVEOztHQUVELGVBQWUsR0FBRyxRQUFRLENBQUM7R0FDM0Isd0JBQXdCLEdBQUcsa0JBQWtCLENBQUM7O0dBRTlDOztFQUVELEtBQUssUUFBUSxLQUFLcHRDLGdCQUFjLEdBQUc7O0dBRWxDLGtCQUFrQixHQUFHLGtCQUFrQixJQUFJLGFBQWEsQ0FBQztHQUN6RCxhQUFhLEdBQUcsYUFBYSxJQUFJLFFBQVEsQ0FBQztHQUMxQyxhQUFhLEdBQUcsYUFBYSxJQUFJLFFBQVEsQ0FBQzs7R0FFMUMsS0FBSyxhQUFhLEtBQUssb0JBQW9CLElBQUksa0JBQWtCLEtBQUsseUJBQXlCLEdBQUc7O0lBRWpHLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLEVBQUUsQ0FBQzs7SUFFbEcsb0JBQW9CLEdBQUcsYUFBYSxDQUFDO0lBQ3JDLHlCQUF5QixHQUFHLGtCQUFrQixDQUFDOztJQUUvQzs7R0FFRCxLQUFLLFFBQVEsS0FBSyxlQUFlLElBQUksUUFBUSxLQUFLLGVBQWUsSUFBSSxhQUFhLEtBQUssb0JBQW9CLElBQUksYUFBYSxLQUFLLG9CQUFvQixHQUFHOztJQUV2SixFQUFFLENBQUMsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxFQUFFLENBQUM7O0lBRWpKLGVBQWUsR0FBRyxRQUFRLENBQUM7SUFDM0IsZUFBZSxHQUFHLFFBQVEsQ0FBQztJQUMzQixvQkFBb0IsR0FBRyxhQUFhLENBQUM7SUFDckMsb0JBQW9CLEdBQUcsYUFBYSxDQUFDOztJQUVyQzs7R0FFRCxNQUFNOztHQUVOLG9CQUFvQixHQUFHLElBQUksQ0FBQztHQUM1QixlQUFlLEdBQUcsSUFBSSxDQUFDO0dBQ3ZCLGVBQWUsR0FBRyxJQUFJLENBQUM7R0FDdkIseUJBQXlCLEdBQUcsSUFBSSxDQUFDO0dBQ2pDLG9CQUFvQixHQUFHLElBQUksQ0FBQztHQUM1QixvQkFBb0IsR0FBRyxJQUFJLENBQUM7O0dBRTVCOztFQUVEOztDQUVELFNBQVMsV0FBVyxFQUFFLFFBQVEsR0FBRzs7RUFFaEMsUUFBUSxDQUFDLElBQUksS0FBS25pQixZQUFVO0tBQ3pCLE9BQU8sRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFO0tBQ3ZCLE1BQU0sRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7O0VBRTFCLFlBQVksRUFBRSxRQUFRLENBQUMsSUFBSSxLQUFLRCxVQUFRLEVBQUUsQ0FBQzs7RUFFM0MsUUFBUSxDQUFDLFdBQVcsS0FBSyxJQUFJO0tBQzFCLFdBQVcsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLGtCQUFrQixFQUFFO0tBQ3hNLFdBQVcsRUFBRW1pQixZQUFVLEVBQUUsQ0FBQzs7RUFFN0IsV0FBVyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7RUFDMUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7RUFDMUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7RUFDM0MsV0FBVyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7O0VBRTNDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLG1CQUFtQixFQUFFLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDOztFQUV0Rzs7OztDQUlELFNBQVMsWUFBWSxFQUFFLFNBQVMsR0FBRzs7RUFFbEMsS0FBSyxnQkFBZ0IsS0FBSyxTQUFTLEdBQUc7O0dBRXJDLEtBQUssU0FBUyxHQUFHOztJQUVoQixFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7SUFFdEIsTUFBTTs7SUFFTixFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7SUFFdkI7O0dBRUQsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDOztHQUU3Qjs7RUFFRDs7Q0FFRCxTQUFTLFdBQVcsRUFBRSxRQUFRLEdBQUc7O0VBRWhDLEtBQUssUUFBUSxLQUFLNEIsY0FBWSxHQUFHOztHQUVoQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDOztHQUV2QixLQUFLLFFBQVEsS0FBSyxlQUFlLEdBQUc7O0lBRW5DLEtBQUssUUFBUSxLQUFLeEMsY0FBWSxHQUFHOztLQUVoQyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7S0FFdkIsTUFBTSxLQUFLLFFBQVEsS0FBSzJDLGVBQWEsR0FBRzs7S0FFeEMsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7O0tBRXhCLE1BQU07O0tBRU4sRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7O0tBRWpDOztJQUVEOztHQUVELE1BQU07O0dBRU4sT0FBTyxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7R0FFeEI7O0VBRUQsZUFBZSxHQUFHLFFBQVEsQ0FBQzs7RUFFM0I7O0NBRUQsU0FBUyxZQUFZLEVBQUUsS0FBSyxHQUFHOztFQUU5QixLQUFLLEtBQUssS0FBSyxnQkFBZ0IsR0FBRzs7R0FFakMsS0FBSyxrQkFBa0IsR0FBRyxFQUFFLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDOztHQUVoRCxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7O0dBRXpCOztFQUVEOztDQUVELFNBQVMsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxLQUFLLEdBQUc7O0VBRXpELEtBQUssYUFBYSxHQUFHOztHQUVwQixNQUFNLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLENBQUM7O0dBRWpDLEtBQUssMEJBQTBCLEtBQUssTUFBTSxJQUFJLHlCQUF5QixLQUFLLEtBQUssR0FBRzs7SUFFbkYsRUFBRSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7O0lBRWxDLDBCQUEwQixHQUFHLE1BQU0sQ0FBQztJQUNwQyx5QkFBeUIsR0FBRyxLQUFLLENBQUM7O0lBRWxDOztHQUVELE1BQU07O0dBRU4sT0FBTyxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDOztHQUVsQzs7RUFFRDs7Q0FFRCxTQUFTLGNBQWMsR0FBRzs7RUFFekIsT0FBTyxrQkFBa0IsQ0FBQzs7RUFFMUI7O0NBRUQsU0FBUyxjQUFjLEVBQUUsV0FBVyxHQUFHOztFQUV0QyxrQkFBa0IsR0FBRyxXQUFXLENBQUM7O0VBRWpDLEtBQUssV0FBVyxHQUFHOztHQUVsQixNQUFNLEVBQUUsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDOztHQUUxQixNQUFNOztHQUVOLE9BQU8sRUFBRSxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7O0dBRTNCOztFQUVEOzs7O0NBSUQsU0FBUyxhQUFhLEVBQUUsU0FBUyxHQUFHOztFQUVuQyxLQUFLLFNBQVMsS0FBSyxTQUFTLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxRQUFRLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQzs7RUFFekUsS0FBSyxrQkFBa0IsS0FBSyxTQUFTLEdBQUc7O0dBRXZDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLENBQUM7R0FDOUIsa0JBQWtCLEdBQUcsU0FBUyxDQUFDOztHQUUvQjs7RUFFRDs7Q0FFRCxTQUFTLFdBQVcsRUFBRSxTQUFTLEVBQUUsWUFBWSxHQUFHOztFQUUvQyxLQUFLLGtCQUFrQixLQUFLLElBQUksR0FBRzs7R0FFbEMsYUFBYSxFQUFFLENBQUM7O0dBRWhCOztFQUVELElBQUksWUFBWSxHQUFHLG9CQUFvQixFQUFFLGtCQUFrQixFQUFFLENBQUM7O0VBRTlELEtBQUssWUFBWSxLQUFLLFNBQVMsR0FBRzs7R0FFakMsWUFBWSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUM7R0FDdkQsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxZQUFZLENBQUM7O0dBRTFEOztFQUVELEtBQUssWUFBWSxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksWUFBWSxDQUFDLE9BQU8sS0FBSyxZQUFZLEdBQUc7O0dBRS9FLEVBQUUsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFlBQVksSUFBSSxhQUFhLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQzs7R0FFeEUsWUFBWSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7R0FDOUIsWUFBWSxDQUFDLE9BQU8sR0FBRyxZQUFZLENBQUM7O0dBRXBDOztFQUVEOztDQUVELFNBQVMsb0JBQW9CLEdBQUc7O0VBRS9CLElBQUk7O0dBRUgsRUFBRSxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUM7O0dBRS9DLENBQUMsUUFBUSxLQUFLLEdBQUc7O0dBRWpCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7O0dBRXZCOztFQUVEOztDQUVELFNBQVMsVUFBVSxHQUFHOztFQUVyQixJQUFJOztHQUVILEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQzs7R0FFckMsQ0FBQyxRQUFRLEtBQUssR0FBRzs7R0FFakIsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQzs7R0FFdkI7O0VBRUQ7Ozs7Q0FJRCxTQUFTLE9BQU8sRUFBRSxPQUFPLEdBQUc7O0VBRTNCLEtBQUssY0FBYyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxLQUFLLEdBQUc7O0dBRWpELEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDO0dBQ3pELGNBQWMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7O0dBRS9COztFQUVEOztDQUVELFNBQVMsUUFBUSxFQUFFLFFBQVEsR0FBRzs7RUFFN0IsS0FBSyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEtBQUssR0FBRzs7R0FFbkQsRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUM7R0FDOUQsZUFBZSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQzs7R0FFakM7O0VBRUQ7Ozs7Q0FJRCxTQUFTLEtBQUssR0FBRzs7RUFFaEIsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7R0FFckQsS0FBSyxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUc7O0lBRW5DLEVBQUUsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNqQyxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0lBRTNCOztHQUVEOztFQUVELFlBQVksR0FBRyxFQUFFLENBQUM7O0VBRWxCLHdCQUF3QixHQUFHLElBQUksQ0FBQzs7RUFFaEMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0VBQzFCLG9CQUFvQixHQUFHLEVBQUUsQ0FBQzs7RUFFMUIsZUFBZSxHQUFHLElBQUksQ0FBQzs7RUFFdkIsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0VBQ3hCLGVBQWUsR0FBRyxJQUFJLENBQUM7O0VBRXZCLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztFQUNwQixXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7RUFDcEIsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDOztFQUV0Qjs7Q0FFRCxPQUFPOztFQUVOLE9BQU8sRUFBRTtHQUNSLEtBQUssRUFBRSxXQUFXO0dBQ2xCLEtBQUssRUFBRSxXQUFXO0dBQ2xCLE9BQU8sRUFBRSxhQUFhO0dBQ3RCOztFQUVELElBQUksRUFBRSxJQUFJO0VBQ1YsY0FBYyxFQUFFLGNBQWM7RUFDOUIsZUFBZSxFQUFFLGVBQWU7RUFDaEMseUJBQXlCLEVBQUUseUJBQXlCO0VBQ3BELHVCQUF1QixFQUFFLHVCQUF1QjtFQUNoRCxNQUFNLEVBQUUsTUFBTTtFQUNkLE9BQU8sRUFBRSxPQUFPO0VBQ2hCLDJCQUEyQixFQUFFLDJCQUEyQjs7RUFFeEQsV0FBVyxFQUFFLFdBQVc7RUFDeEIsV0FBVyxFQUFFLFdBQVc7O0VBRXhCLFlBQVksRUFBRSxZQUFZO0VBQzFCLFdBQVcsRUFBRSxXQUFXOztFQUV4QixZQUFZLEVBQUUsWUFBWTtFQUMxQixnQkFBZ0IsRUFBRSxnQkFBZ0I7O0VBRWxDLGNBQWMsRUFBRSxjQUFjO0VBQzlCLGNBQWMsRUFBRSxjQUFjOztFQUU5QixhQUFhLEVBQUUsYUFBYTtFQUM1QixXQUFXLEVBQUUsV0FBVztFQUN4QixvQkFBb0IsRUFBRSxvQkFBb0I7RUFDMUMsVUFBVSxFQUFFLFVBQVU7O0VBRXRCLE9BQU8sRUFBRSxPQUFPO0VBQ2hCLFFBQVEsRUFBRSxRQUFROztFQUVsQixLQUFLLEVBQUUsS0FBSzs7RUFFWixDQUFDOztDQUVGOzs7Ozs7QUFNRCxTQUFTd3RGLG1CQUFpQixFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsVUFBVSxHQUFHOztDQUV4RCxJQUFJLGFBQWEsQ0FBQzs7Q0FFbEIsU0FBUyxnQkFBZ0IsR0FBRzs7RUFFM0IsS0FBSyxhQUFhLEtBQUssU0FBUyxHQUFHLE9BQU8sYUFBYSxDQUFDOztFQUV4RCxJQUFJLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLGdDQUFnQyxFQUFFLENBQUM7O0VBRW5FLEtBQUssU0FBUyxLQUFLLElBQUksR0FBRzs7R0FFekIsYUFBYSxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLDhCQUE4QixFQUFFLENBQUM7O0dBRTVFLE1BQU07O0dBRU4sYUFBYSxHQUFHLENBQUMsQ0FBQzs7R0FFbEI7O0VBRUQsT0FBTyxhQUFhLENBQUM7O0VBRXJCOztDQUVELFNBQVMsZUFBZSxFQUFFLFNBQVMsR0FBRzs7RUFFckMsS0FBSyxTQUFTLEtBQUssT0FBTyxHQUFHOztHQUU1QixLQUFLLEVBQUUsQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxTQUFTLEdBQUcsQ0FBQztRQUM1RSxFQUFFLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsU0FBUyxHQUFHLENBQUMsR0FBRzs7SUFFckYsT0FBTyxPQUFPLENBQUM7O0lBRWY7O0dBRUQsU0FBUyxHQUFHLFNBQVMsQ0FBQzs7R0FFdEI7O0VBRUQsS0FBSyxTQUFTLEtBQUssU0FBUyxHQUFHOztHQUU5QixLQUFLLEVBQUUsQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxTQUFTLEdBQUcsQ0FBQztRQUM5RSxFQUFFLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUMsU0FBUyxHQUFHLENBQUMsR0FBRzs7SUFFdkYsT0FBTyxTQUFTLENBQUM7O0lBRWpCOztHQUVEOztFQUVELE9BQU8sTUFBTSxDQUFDOztFQUVkOztDQUVELElBQUksU0FBUyxHQUFHLFVBQVUsQ0FBQyxTQUFTLEtBQUssU0FBUyxHQUFHLFVBQVUsQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO0NBQ3BGLElBQUksWUFBWSxHQUFHLGVBQWUsRUFBRSxTQUFTLEVBQUUsQ0FBQzs7Q0FFaEQsS0FBSyxZQUFZLEtBQUssU0FBUyxHQUFHOztFQUVqQyxPQUFPLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUM7RUFDcEcsU0FBUyxHQUFHLFlBQVksQ0FBQzs7RUFFekI7O0NBRUQsSUFBSSxzQkFBc0IsR0FBRyxVQUFVLENBQUMsc0JBQXNCLEtBQUssSUFBSSxJQUFJLENBQUMsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGdCQUFnQixFQUFFLENBQUM7O0NBRWpILElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLHVCQUF1QixFQUFFLENBQUM7Q0FDaEUsSUFBSSxpQkFBaUIsR0FBRyxFQUFFLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO0NBQzdFLElBQUksY0FBYyxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Q0FDNUQsSUFBSSxjQUFjLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMseUJBQXlCLEVBQUUsQ0FBQzs7Q0FFckUsSUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztDQUM3RCxJQUFJLGlCQUFpQixHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLDBCQUEwQixFQUFFLENBQUM7Q0FDekUsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztDQUM1RCxJQUFJLG1CQUFtQixHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLDRCQUE0QixFQUFFLENBQUM7O0NBRTdFLElBQUksY0FBYyxHQUFHLGlCQUFpQixHQUFHLENBQUMsQ0FBQztDQUMzQyxJQUFJLHFCQUFxQixHQUFHLENBQUMsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLG1CQUFtQixFQUFFLENBQUM7Q0FDckUsSUFBSSxtQkFBbUIsR0FBRyxjQUFjLElBQUkscUJBQXFCLENBQUM7O0NBRWxFLE9BQU87O0VBRU4sZ0JBQWdCLEVBQUUsZ0JBQWdCO0VBQ2xDLGVBQWUsRUFBRSxlQUFlOztFQUVoQyxTQUFTLEVBQUUsU0FBUztFQUNwQixzQkFBc0IsRUFBRSxzQkFBc0I7O0VBRTlDLFdBQVcsRUFBRSxXQUFXO0VBQ3hCLGlCQUFpQixFQUFFLGlCQUFpQjtFQUNwQyxjQUFjLEVBQUUsY0FBYztFQUM5QixjQUFjLEVBQUUsY0FBYzs7RUFFOUIsYUFBYSxFQUFFLGFBQWE7RUFDNUIsaUJBQWlCLEVBQUUsaUJBQWlCO0VBQ3BDLFdBQVcsRUFBRSxXQUFXO0VBQ3hCLG1CQUFtQixFQUFFLG1CQUFtQjs7RUFFeEMsY0FBYyxFQUFFLGNBQWM7RUFDOUIscUJBQXFCLEVBQUUscUJBQXFCO0VBQzVDLG1CQUFtQixFQUFFLG1CQUFtQjs7RUFFeEMsQ0FBQzs7Q0FFRjs7Ozs7O0FBTUQsU0FBU0MsaUJBQWUsRUFBRSxFQUFFLEdBQUc7O0NBRTlCLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQzs7Q0FFcEIsT0FBTzs7RUFFTixHQUFHLEVBQUUsV0FBVyxJQUFJLEdBQUc7O0dBRXRCLEtBQUssVUFBVSxFQUFFLElBQUksRUFBRSxLQUFLLFNBQVMsR0FBRzs7SUFFdkMsT0FBTyxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUM7O0lBRTFCOztHQUVELElBQUksU0FBUyxDQUFDOztHQUVkLFNBQVMsSUFBSTs7SUFFWixLQUFLLHFCQUFxQjtLQUN6QixTQUFTLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxZQUFZLEVBQUUseUJBQXlCLEVBQUUsSUFBSSxFQUFFLENBQUMsWUFBWSxFQUFFLDRCQUE0QixFQUFFLENBQUM7S0FDeEosTUFBTTs7SUFFUCxLQUFLLGdDQUFnQztLQUNwQyxTQUFTLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSxnQ0FBZ0MsRUFBRSxJQUFJLEVBQUUsQ0FBQyxZQUFZLEVBQUUsb0NBQW9DLEVBQUUsSUFBSSxFQUFFLENBQUMsWUFBWSxFQUFFLHVDQUF1QyxFQUFFLENBQUM7S0FDekwsTUFBTTs7SUFFUCxLQUFLLCtCQUErQjtLQUNuQyxTQUFTLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSwrQkFBK0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxZQUFZLEVBQUUsbUNBQW1DLEVBQUUsSUFBSSxFQUFFLENBQUMsWUFBWSxFQUFFLHNDQUFzQyxFQUFFLENBQUM7S0FDdEwsTUFBTTs7SUFFUCxLQUFLLGdDQUFnQztLQUNwQyxTQUFTLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSxnQ0FBZ0MsRUFBRSxJQUFJLEVBQUUsQ0FBQyxZQUFZLEVBQUUsdUNBQXVDLEVBQUUsQ0FBQztLQUM5SCxNQUFNOztJQUVQLEtBQUssK0JBQStCO0tBQ25DLFNBQVMsR0FBRyxFQUFFLENBQUMsWUFBWSxFQUFFLCtCQUErQixFQUFFLENBQUM7S0FDL0QsTUFBTTs7SUFFUDtLQUNDLFNBQVMsR0FBRyxFQUFFLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDOztJQUVyQzs7R0FFRCxLQUFLLFNBQVMsS0FBSyxJQUFJLEdBQUc7O0lBRXpCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLEdBQUcsSUFBSSxHQUFHLDJCQUEyQixFQUFFLENBQUM7O0lBRTdFOztHQUVELFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUM7O0dBRS9CLE9BQU8sU0FBUyxDQUFDOztHQUVqQjs7RUFFRCxDQUFDOztDQUVGOzs7Ozs7QUFNRCxTQUFTQyxlQUFhLEdBQUc7O0NBRXhCLElBQUksS0FBSyxHQUFHLElBQUk7O0VBRWYsV0FBVyxHQUFHLElBQUk7RUFDbEIsZUFBZSxHQUFHLENBQUM7RUFDbkIsb0JBQW9CLEdBQUcsS0FBSztFQUM1QixnQkFBZ0IsR0FBRyxLQUFLOztFQUV4QixLQUFLLEdBQUcsSUFBSXZqSSxPQUFLLEVBQUU7RUFDbkIsZ0JBQWdCLEdBQUcsSUFBSTdKLFNBQU8sRUFBRTs7RUFFaEMsT0FBTyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRS9DLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0NBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0NBQ25CLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDOztDQUV6QixJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsTUFBTSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sR0FBRzs7RUFFM0QsSUFBSSxPQUFPO0dBQ1YsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO0dBQ25CLG1CQUFtQjs7O0dBR25CLGVBQWUsS0FBSyxDQUFDO0dBQ3JCLG9CQUFvQixDQUFDOztFQUV0QixvQkFBb0IsR0FBRyxtQkFBbUIsQ0FBQzs7RUFFM0MsV0FBVyxHQUFHLGFBQWEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQ2pELGVBQWUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDOztFQUVoQyxPQUFPLE9BQU8sQ0FBQzs7RUFFZixDQUFDOztDQUVGLElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVzs7RUFFOUIsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0VBQ3hCLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7RUFFdEIsQ0FBQzs7Q0FFRixJQUFJLENBQUMsVUFBVSxHQUFHLFdBQVc7O0VBRTVCLGdCQUFnQixHQUFHLEtBQUssQ0FBQztFQUN6QixnQkFBZ0IsRUFBRSxDQUFDOztFQUVuQixDQUFDOztDQUVGLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxHQUFHOztFQUUzRixLQUFLLEVBQUUsb0JBQW9CO0lBQ3pCLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO0lBQ3RDLGdCQUFnQixJQUFJLEVBQUUsV0FBVyxHQUFHOzs7R0FHckMsS0FBSyxnQkFBZ0IsR0FBRzs7O0lBR3ZCLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7SUFFdEIsTUFBTTs7SUFFTixnQkFBZ0IsRUFBRSxDQUFDO0lBQ25COztHQUVELE1BQU07O0dBRU4sSUFBSSxPQUFPLEdBQUcsZ0JBQWdCLEdBQUcsQ0FBQyxHQUFHLGVBQWU7SUFDbkQsT0FBTyxHQUFHLE9BQU8sR0FBRyxDQUFDOztJQUVyQixRQUFRLEdBQUcsS0FBSyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUM7O0dBRXhDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDOztHQUV6QixRQUFRLEdBQUcsYUFBYSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDOztHQUUvRCxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssT0FBTyxFQUFFLEdBQUcsQ0FBQyxHQUFHOztJQUV0QyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEdBQUcsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDOztJQUVqQzs7R0FFRCxLQUFLLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQztHQUMvQixJQUFJLENBQUMsZUFBZSxHQUFHLGdCQUFnQixHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0dBQzdELElBQUksQ0FBQyxTQUFTLElBQUksT0FBTyxDQUFDOztHQUUxQjs7O0VBR0QsQ0FBQzs7Q0FFRixTQUFTLGdCQUFnQixHQUFHOztFQUUzQixLQUFLLE9BQU8sQ0FBQyxLQUFLLEtBQUssV0FBVyxHQUFHOztHQUVwQyxPQUFPLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQztHQUM1QixPQUFPLENBQUMsV0FBVyxHQUFHLGVBQWUsR0FBRyxDQUFDLENBQUM7O0dBRTFDOztFQUVELEtBQUssQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDO0VBQ2xDLEtBQUssQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDOztFQUUxQjs7Q0FFRCxTQUFTLGFBQWEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxhQUFhLEdBQUc7O0VBRWxFLElBQUksT0FBTyxHQUFHLE1BQU0sS0FBSyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO0dBQ2hELFFBQVEsR0FBRyxJQUFJLENBQUM7O0VBRWpCLEtBQUssT0FBTyxLQUFLLENBQUMsR0FBRzs7R0FFcEIsUUFBUSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7O0dBRXpCLEtBQUssYUFBYSxLQUFLLElBQUksSUFBSSxRQUFRLEtBQUssSUFBSSxHQUFHOztJQUVsRCxJQUFJLFFBQVEsR0FBRyxTQUFTLEdBQUcsT0FBTyxHQUFHLENBQUM7S0FDckMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQzs7SUFFeEMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLFVBQVUsRUFBRSxDQUFDOztJQUUvQyxLQUFLLFFBQVEsS0FBSyxJQUFJLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxRQUFRLEdBQUc7O0tBRXRELFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBRSxRQUFRLEVBQUUsQ0FBQzs7S0FFeEM7O0lBRUQsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFNBQVM7U0FDMUIsQ0FBQyxLQUFLLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHOztLQUVuQyxLQUFLLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtPQUN2QixZQUFZLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLENBQUM7O0tBRS9DLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQztLQUNyQyxRQUFRLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7O0tBRXBDOztJQUVEOztHQUVELE9BQU8sQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDO0dBQ3pCLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDOztHQUUzQjs7RUFFRCxLQUFLLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQzs7RUFFMUIsT0FBTyxRQUFRLENBQUM7O0VBRWhCOztDQUVEOzs7Ozs7Ozs7OztBQVdELFNBQVNxMEcsZUFBYSxFQUFFLFVBQVUsR0FBRzs7Q0FFcEMsT0FBTyxDQUFDLEdBQUcsRUFBRSxxQkFBcUIsRUFBRW5rRCxVQUFRLEVBQUUsQ0FBQzs7Q0FFL0MsVUFBVSxHQUFHLFVBQVUsSUFBSSxFQUFFLENBQUM7O0NBRTlCLElBQUksT0FBTyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEtBQUssU0FBUyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLGVBQWUsRUFBRSw4QkFBOEIsRUFBRSxRQUFRLEVBQUU7RUFDdkksUUFBUSxHQUFHLFVBQVUsQ0FBQyxPQUFPLEtBQUssU0FBUyxHQUFHLFVBQVUsQ0FBQyxPQUFPLEdBQUcsSUFBSTs7RUFFdkUsTUFBTSxHQUFHLFVBQVUsQ0FBQyxLQUFLLEtBQUssU0FBUyxHQUFHLFVBQVUsQ0FBQyxLQUFLLEdBQUcsS0FBSztFQUNsRSxNQUFNLEdBQUcsVUFBVSxDQUFDLEtBQUssS0FBSyxTQUFTLEdBQUcsVUFBVSxDQUFDLEtBQUssR0FBRyxJQUFJO0VBQ2pFLFFBQVEsR0FBRyxVQUFVLENBQUMsT0FBTyxLQUFLLFNBQVMsR0FBRyxVQUFVLENBQUMsT0FBTyxHQUFHLElBQUk7RUFDdkUsVUFBVSxHQUFHLFVBQVUsQ0FBQyxTQUFTLEtBQUssU0FBUyxHQUFHLFVBQVUsQ0FBQyxTQUFTLEdBQUcsS0FBSztFQUM5RSxtQkFBbUIsR0FBRyxVQUFVLENBQUMsa0JBQWtCLEtBQUssU0FBUyxHQUFHLFVBQVUsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJO0VBQ3hHLHNCQUFzQixHQUFHLFVBQVUsQ0FBQyxxQkFBcUIsS0FBSyxTQUFTLEdBQUcsVUFBVSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQzs7Q0FFcEgsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDOztDQUVoQixJQUFJLGlCQUFpQixHQUFHLElBQUksQ0FBQzs7Q0FFN0IsSUFBSSxlQUFlLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTVDLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztDQUNqQixJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7Ozs7Q0FJcEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUM7Q0FDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7Ozs7Q0FJcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7Q0FDdEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7Q0FDM0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7Q0FDM0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQzs7OztDQUk3QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7OztDQUl4QixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztDQUN6QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDOzs7O0NBSWxDLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO0NBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0NBQ3hCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDOzs7O0NBSXpCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7Ozs7Q0FJckMsSUFBSSxDQUFDLFdBQVcsR0FBR2MsbUJBQWlCLENBQUM7Q0FDckMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztDQUMvQixJQUFJLENBQUMscUJBQXFCLEdBQUcsR0FBRyxDQUFDOzs7O0NBSWpDLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDO0NBQ3pCLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDOzs7O0NBSXpCLElBQUksS0FBSyxHQUFHLElBQUk7Ozs7RUFJZixlQUFlLEdBQUcsSUFBSTtFQUN0QixvQkFBb0IsR0FBRyxJQUFJO0VBQzNCLG1CQUFtQixHQUFHLElBQUk7RUFDMUIsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0VBQ3hCLHVCQUF1QixHQUFHLEVBQUU7RUFDNUIsY0FBYyxHQUFHLElBQUk7O0VBRXJCLGVBQWUsR0FBRyxJQUFJbnRELFNBQU8sRUFBRTtFQUMvQixtQkFBbUIsR0FBRyxJQUFJOztFQUUxQixnQkFBZ0IsR0FBRyxJQUFJQSxTQUFPLEVBQUU7Ozs7RUFJaEMsaUJBQWlCLEdBQUcsQ0FBQzs7OztFQUlyQixXQUFXLEdBQUcsSUFBSThRLE9BQUssRUFBRSxRQUFRLEVBQUU7RUFDbkMsV0FBVyxHQUFHLENBQUM7O0VBRWYsTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLO0VBQ3RCLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTTs7RUFFeEIsV0FBVyxHQUFHLENBQUM7O0VBRWYsUUFBUSxHQUFHLElBQUk5USxTQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFO0VBQy9DLFlBQVksR0FBRyxLQUFLOztFQUVwQixTQUFTLEdBQUcsSUFBSUEsU0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRTs7OztFQUloRCxRQUFRLEdBQUcsSUFBSTBILFNBQU8sRUFBRTs7OztFQUl4QixTQUFTLEdBQUcsSUFBSTZoSSxlQUFhLEVBQUU7RUFDL0IsZ0JBQWdCLEdBQUcsS0FBSztFQUN4QixxQkFBcUIsR0FBRyxLQUFLOzs7O0VBSTdCLGlCQUFpQixHQUFHLElBQUluK0ksU0FBTyxFQUFFOztFQUVqQyxRQUFRLEdBQUcsSUFBSW9PLFNBQU8sRUFBRTtFQUN4QixRQUFRLEdBQUcsSUFBSXBPLFNBQU8sRUFBRTtFQUN4QixTQUFTLEdBQUcsSUFBSUEsU0FBTyxFQUFFOzs7O0VBSXpCLE9BQU8sR0FBRzs7R0FFVCxJQUFJLEVBQUUsRUFBRTs7R0FFUixPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtHQUNwQixXQUFXLEVBQUUsRUFBRTtHQUNmLG9CQUFvQixFQUFFLEVBQUU7R0FDeEIsdUJBQXVCLEVBQUUsRUFBRTtHQUMzQixJQUFJLEVBQUUsRUFBRTtHQUNSLGFBQWEsRUFBRSxFQUFFO0dBQ2pCLGdCQUFnQixFQUFFLEVBQUU7R0FDcEIsUUFBUSxFQUFFLEVBQUU7R0FDWixLQUFLLEVBQUUsRUFBRTtHQUNULGNBQWMsRUFBRSxFQUFFO0dBQ2xCLGlCQUFpQixFQUFFLEVBQUU7R0FDckIsSUFBSSxFQUFFLEVBQUU7O0dBRVIsT0FBTyxFQUFFLEVBQUU7O0dBRVg7Ozs7RUFJRCxXQUFXLEdBQUc7R0FDYixVQUFVLEVBQUUsQ0FBQztHQUNiLFFBQVEsRUFBRSxDQUFDO0dBQ1g7O0VBRUQsV0FBVyxHQUFHOztHQUViLEtBQUssRUFBRSxDQUFDO0dBQ1IsS0FBSyxFQUFFLENBQUM7R0FDUixRQUFRLEVBQUUsQ0FBQztHQUNYLEtBQUssRUFBRSxDQUFDO0dBQ1IsTUFBTSxFQUFFLENBQUM7O0dBRVQsQ0FBQzs7Q0FFSCxJQUFJLENBQUMsSUFBSSxHQUFHOztFQUVYLE1BQU0sRUFBRSxXQUFXO0VBQ25CLE1BQU0sRUFBRSxXQUFXO0VBQ25CLFFBQVEsRUFBRSxJQUFJOztFQUVkLENBQUM7Ozs7O0NBS0YsSUFBSSxHQUFHLENBQUM7O0NBRVIsSUFBSTs7RUFFSCxJQUFJLGlCQUFpQixHQUFHO0dBQ3ZCLEtBQUssRUFBRSxNQUFNO0dBQ2IsS0FBSyxFQUFFLE1BQU07R0FDYixPQUFPLEVBQUUsUUFBUTtHQUNqQixTQUFTLEVBQUUsVUFBVTtHQUNyQixrQkFBa0IsRUFBRSxtQkFBbUI7R0FDdkMscUJBQXFCLEVBQUUsc0JBQXNCO0dBQzdDLENBQUM7O0VBRUYsR0FBRyxHQUFHLFFBQVEsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQzs7RUFFcEksS0FBSyxHQUFHLEtBQUssSUFBSSxHQUFHOztHQUVuQixLQUFLLE9BQU8sQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssSUFBSSxHQUFHOztJQUU3QyxNQUFNLDZEQUE2RCxDQUFDOztJQUVwRSxNQUFNOztJQUVOLE1BQU0sK0JBQStCLENBQUM7O0lBRXRDOztHQUVEOzs7O0VBSUQsS0FBSyxHQUFHLENBQUMsd0JBQXdCLEtBQUssU0FBUyxHQUFHOztHQUVqRCxHQUFHLENBQUMsd0JBQXdCLEdBQUcsWUFBWTs7SUFFMUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0lBRXhELENBQUM7O0dBRUY7O0VBRUQsT0FBTyxDQUFDLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7RUFFckUsQ0FBQyxRQUFRLEtBQUssR0FBRzs7RUFFakIsT0FBTyxDQUFDLEtBQUssRUFBRSx1QkFBdUIsR0FBRyxLQUFLLEVBQUUsQ0FBQzs7RUFFakQ7O0NBRUQsSUFBSSxVQUFVLEdBQUcsSUFBSWsrSSxpQkFBZSxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUU1QyxVQUFVLENBQUMsR0FBRyxFQUFFLHFCQUFxQixFQUFFLENBQUM7Q0FDeEMsVUFBVSxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsRUFBRSxDQUFDO0NBQ3RDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsMEJBQTBCLEVBQUUsQ0FBQztDQUM3QyxVQUFVLENBQUMsR0FBRyxFQUFFLHdCQUF3QixFQUFFLENBQUM7Q0FDM0MsVUFBVSxDQUFDLEdBQUcsRUFBRSwrQkFBK0IsRUFBRSxDQUFDO0NBQ2xELFVBQVUsQ0FBQyxHQUFHLEVBQUUsMEJBQTBCLEVBQUUsQ0FBQztDQUM3QyxVQUFVLENBQUMsR0FBRyxFQUFFLHdCQUF3QixFQUFFLENBQUM7O0NBRTNDLEtBQUssVUFBVSxDQUFDLEdBQUcsRUFBRSx3QkFBd0IsRUFBRSxHQUFHOztFQUVqRGovRyxnQkFBYyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7O0VBRXJDOztDQUVELElBQUksWUFBWSxHQUFHLElBQUlnL0csbUJBQWlCLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFeEUsSUFBSSxLQUFLLEdBQUcsSUFBSUQsWUFBVSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLENBQUM7O0NBRTlELElBQUksVUFBVSxHQUFHLElBQUlELGlCQUFlLEVBQUUsQ0FBQztDQUN2QyxJQUFJLFFBQVEsR0FBRyxJQUFJRCxlQUFhLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLENBQUM7Q0FDbEgsSUFBSSxVQUFVLEdBQUcsSUFBSVYsaUJBQWUsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUM1QyxJQUFJLFVBQVUsR0FBRyxJQUFJSyxpQkFBZSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLENBQUM7Q0FDckUsSUFBSSxPQUFPLEdBQUcsSUFBSUUsY0FBWSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLENBQUM7Q0FDL0QsSUFBSSxZQUFZLEdBQUcsSUFBSUUsZUFBYSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztDQUMzRCxJQUFJLFVBQVUsR0FBRyxJQUFJSCxhQUFXLEVBQUUsQ0FBQztDQUNuQyxJQUFJLFdBQVcsR0FBRyxJQUFJSixrQkFBZ0IsRUFBRSxDQUFDOztDQUV6QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDOztDQUUzQyxJQUFJLGNBQWMsR0FBRyxJQUFJRSxxQkFBbUIsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxDQUFDO0NBQzdFLElBQUkscUJBQXFCLEdBQUcsSUFBSUQsNEJBQTBCLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsQ0FBQzs7OztDQUkzRixJQUFJLHFCQUFxQixFQUFFLG1CQUFtQixDQUFDO0NBQy9DLElBQUksbUJBQW1CLEVBQUUsaUJBQWlCLENBQUM7Ozs7Q0FJM0MsU0FBUyxtQkFBbUIsR0FBRzs7RUFFOUIsT0FBTyxvQkFBb0IsS0FBSyxJQUFJLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQzs7RUFFdkQ7O0NBRUQsU0FBUyxpQkFBaUIsR0FBRzs7RUFFNUIsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDOztFQUViLEtBQUssQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxjQUFjLEVBQUUsV0FBVyxFQUFFLEVBQUUsQ0FBQztFQUNoRixLQUFLLENBQUMsUUFBUSxFQUFFLGdCQUFnQixDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxjQUFjLEVBQUUsV0FBVyxFQUFFLEVBQUUsQ0FBQzs7RUFFbkYsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxDQUFDOztFQUU5Rzs7Q0FFRCxTQUFTLFlBQVksR0FBRzs7RUFFdkIsZUFBZSxHQUFHLElBQUksQ0FBQztFQUN2QixjQUFjLEdBQUcsSUFBSSxDQUFDOztFQUV0Qix1QkFBdUIsR0FBRyxFQUFFLENBQUM7RUFDN0Isa0JBQWtCLEdBQUcsRUFBRSxDQUFDLENBQUM7O0VBRXpCLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7RUFFZDs7Q0FFRCxpQkFBaUIsRUFBRSxDQUFDOztDQUVwQixJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztDQUNuQixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztDQUNqQyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztDQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztDQUM3QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzs7OztDQUluQixJQUFJLFNBQVMsR0FBRyxJQUFJbDNCLGdCQUFjLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLENBQUM7O0NBRTNFLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDOzs7OztDQUszQixJQUFJLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7Q0FDckQsSUFBSSxlQUFlLEdBQUcsSUFBSSxlQUFlLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDOzs7O0NBSTlELElBQUksQ0FBQyxVQUFVLEdBQUcsWUFBWTs7RUFFN0IsT0FBTyxHQUFHLENBQUM7O0VBRVgsQ0FBQzs7Q0FFRixJQUFJLENBQUMsb0JBQW9CLEdBQUcsWUFBWTs7RUFFdkMsT0FBTyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsQ0FBQzs7RUFFbEMsQ0FBQzs7Q0FFRixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsWUFBWTs7RUFFbkMsSUFBSSxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsRUFBRSxDQUFDO0VBQ3ZELEtBQUssU0FBUyxHQUFHLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7RUFFekMsQ0FBQzs7Q0FFRixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsWUFBWTs7RUFFbkMsT0FBTyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzs7RUFFdkMsQ0FBQzs7Q0FFRixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVk7O0VBRS9CLE9BQU8sWUFBWSxDQUFDLFNBQVMsQ0FBQzs7RUFFOUIsQ0FBQzs7Q0FFRixJQUFJLENBQUMsYUFBYSxHQUFHLFlBQVk7O0VBRWhDLE9BQU8sV0FBVyxDQUFDOztFQUVuQixDQUFDOztDQUVGLElBQUksQ0FBQyxhQUFhLEdBQUcsV0FBVyxLQUFLLEdBQUc7O0VBRXZDLEtBQUssS0FBSyxLQUFLLFNBQVMsR0FBRyxPQUFPOztFQUVsQyxXQUFXLEdBQUcsS0FBSyxDQUFDOztFQUVwQixJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7RUFFaEQsQ0FBQzs7Q0FFRixJQUFJLENBQUMsT0FBTyxHQUFHLFlBQVk7O0VBRTFCLE9BQU87R0FDTixLQUFLLEVBQUUsTUFBTTtHQUNiLE1BQU0sRUFBRSxPQUFPO0dBQ2YsQ0FBQzs7RUFFRixDQUFDOztDQUVGLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxLQUFLLEVBQUUsTUFBTSxFQUFFLFdBQVcsR0FBRzs7RUFFdEQsTUFBTSxHQUFHLEtBQUssQ0FBQztFQUNmLE9BQU8sR0FBRyxNQUFNLENBQUM7O0VBRWpCLE9BQU8sQ0FBQyxLQUFLLEdBQUcsS0FBSyxHQUFHLFdBQVcsQ0FBQztFQUNwQyxPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sR0FBRyxXQUFXLENBQUM7O0VBRXRDLEtBQUssV0FBVyxLQUFLLEtBQUssR0FBRzs7R0FFNUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQztHQUNuQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDOztHQUVyQzs7RUFFRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUV4QyxDQUFDOztDQUVGLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUc7O0VBRW5ELEtBQUssQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDOztFQUV2RCxDQUFDOztDQUVGLElBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUc7O0VBRWxELEtBQUssQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDOztFQUVyRCxDQUFDOztDQUVGLElBQUksQ0FBQyxjQUFjLEdBQUcsV0FBVyxPQUFPLEdBQUc7O0VBRTFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsWUFBWSxHQUFHLE9BQU8sRUFBRSxDQUFDOztFQUUvQyxDQUFDOzs7O0NBSUYsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZOztFQUVoQyxPQUFPLFdBQVcsQ0FBQzs7RUFFbkIsQ0FBQzs7Q0FFRixJQUFJLENBQUMsYUFBYSxHQUFHLFdBQVcsS0FBSyxFQUFFLEtBQUssR0FBRzs7RUFFOUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7RUFFekIsV0FBVyxHQUFHLEtBQUssS0FBSyxTQUFTLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQzs7RUFFOUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxDQUFDOztFQUU5RyxDQUFDOztDQUVGLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWTs7RUFFaEMsT0FBTyxXQUFXLENBQUM7O0VBRW5CLENBQUM7O0NBRUYsSUFBSSxDQUFDLGFBQWEsR0FBRyxXQUFXLEtBQUssR0FBRzs7RUFFdkMsV0FBVyxHQUFHLEtBQUssQ0FBQzs7RUFFcEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxDQUFDOztFQUU5RyxDQUFDOztDQUVGLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sR0FBRzs7RUFFL0MsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDOztFQUViLEtBQUssS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztFQUNqRSxLQUFLLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxHQUFHLENBQUMsZ0JBQWdCLENBQUM7RUFDakUsS0FBSyxPQUFPLEtBQUssU0FBUyxJQUFJLE9BQU8sR0FBRyxJQUFJLElBQUksR0FBRyxDQUFDLGtCQUFrQixDQUFDOztFQUV2RSxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDOztFQUVsQixDQUFDOztDQUVGLElBQUksQ0FBQyxVQUFVLEdBQUcsWUFBWTs7RUFFN0IsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDOztFQUVqQyxDQUFDOztDQUVGLElBQUksQ0FBQyxVQUFVLEdBQUcsWUFBWTs7RUFFN0IsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDOztFQUVqQyxDQUFDOztDQUVGLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWTs7RUFFL0IsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDOztFQUVqQyxDQUFDOztDQUVGLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxZQUFZLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEdBQUc7O0VBRW5FLElBQUksQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLENBQUM7RUFDckMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDOztFQUVwQyxDQUFDOzs7O0NBSUYsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7O0NBRWpDLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWTs7RUFFMUIsT0FBTyxDQUFDLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7RUFFeEUsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDOztFQUV0QixDQUFDOzs7O0NBSUYsU0FBUyxhQUFhLEVBQUUsS0FBSyxHQUFHOztFQUUvQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7O0VBRXZCLFlBQVksRUFBRSxDQUFDO0VBQ2YsaUJBQWlCLEVBQUUsQ0FBQzs7RUFFcEIsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0VBQ25CLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7RUFFaEI7O0NBRUQsU0FBUyxpQkFBaUIsRUFBRSxLQUFLLEdBQUc7O0VBRW5DLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7O0VBRTVCLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQzs7RUFFN0Qsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLENBQUM7O0VBRS9COzs7O0NBSUQsU0FBUyxrQkFBa0IsRUFBRSxRQUFRLEdBQUc7O0VBRXZDLCtCQUErQixFQUFFLFFBQVEsRUFBRSxDQUFDOztFQUU1QyxVQUFVLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDOztFQUU5Qjs7O0NBR0QsU0FBUywrQkFBK0IsRUFBRSxRQUFRLEdBQUc7O0VBRXBELElBQUksV0FBVyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDOztFQUVyRCxRQUFRLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQzs7RUFFN0IsS0FBSyxXQUFXLEtBQUssU0FBUyxHQUFHOztHQUVoQyxZQUFZLENBQUMsY0FBYyxFQUFFLFdBQVcsRUFBRSxDQUFDOztHQUUzQzs7RUFFRDs7OztDQUlELFNBQVMscUJBQXFCLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEdBQUc7O0VBRTNELE1BQU0sQ0FBQyxNQUFNLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0dBRWxDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDOztHQUV6RCxFQUFFLENBQUM7O0VBRUo7O0NBRUQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFdBQVcsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEdBQUc7O0VBRW5FLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQzs7RUFFdkIsSUFBSSxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7RUFFdkMsS0FBSyxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUUsT0FBTyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztFQUN2RixLQUFLLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0VBQ2pGLEtBQUssTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7RUFDckUsS0FBSyxNQUFNLENBQUMsU0FBUyxJQUFJLEVBQUUsT0FBTyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQzs7RUFFOUUsSUFBSSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7O0VBRWhELEtBQUssTUFBTSxDQUFDLFlBQVksR0FBRzs7R0FFMUIsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztHQUNyRCxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7O0dBRTNFLEtBQUssQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLENBQUMsUUFBUSxFQUFFLENBQUM7R0FDcEQsR0FBRyxDQUFDLG1CQUFtQixFQUFFLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUVqRjs7RUFFRCxLQUFLLE1BQU0sQ0FBQyxVQUFVLEdBQUc7O0dBRXhCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7O0dBRW5ELEtBQUssRUFBRSxRQUFRLENBQUMsbUJBQW1CO0lBQ2xDLEVBQUUsUUFBUSxDQUFDLHNCQUFzQjtJQUNqQyxFQUFFLFFBQVEsQ0FBQyxvQkFBb0I7SUFDL0IsUUFBUSxDQUFDLE9BQU8sS0FBS3BoRixhQUFXLEdBQUc7O0lBRW5DLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUc7O0tBRXRELElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7O0tBRS9CLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ2xFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ2xFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDOztLQUVsRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztLQUNwQixLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztLQUNwQixLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7S0FFcEIsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7S0FDcEIsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7S0FDcEIsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7O0tBRXBCLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0tBQ3BCLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0tBQ3BCLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDOztLQUVwQjs7SUFFRDs7R0FFRCxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7O0dBRXpFLEtBQUssQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUM7O0dBRWxELEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7R0FFL0U7O0VBRUQsS0FBSyxNQUFNLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxHQUFHLEdBQUc7O0dBRXBDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUM7R0FDL0MsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDOztHQUVyRSxLQUFLLENBQUMsZUFBZSxFQUFFLGlCQUFpQixDQUFDLEVBQUUsRUFBRSxDQUFDOztHQUU5QyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUVwRTs7RUFFRCxLQUFLLE1BQU0sQ0FBQyxTQUFTLElBQUksUUFBUSxDQUFDLFlBQVksS0FBS2hDLFVBQVEsR0FBRzs7R0FFN0QsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztHQUNsRCxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7O0dBRXhFLEtBQUssQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUM7O0dBRWpELEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7R0FFOUU7O0VBRUQsS0FBSyxDQUFDLHVCQUF1QixFQUFFLENBQUM7O0VBRWhDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDOztFQUVqRCxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQzs7RUFFakIsQ0FBQzs7Q0FFRixTQUFTLGdCQUFnQixFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0VBRWpDLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztFQUUvQzs7Q0FFRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsV0FBVyxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssR0FBRzs7RUFFckYsS0FBSyxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7RUFFOUIsSUFBSSxPQUFPLEdBQUcsVUFBVSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO0VBQzFELElBQUksZUFBZSxHQUFHLFFBQVEsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQyxFQUFFLEdBQUcsR0FBRyxLQUFLLFFBQVEsQ0FBQyxTQUFTLEtBQUssSUFBSSxFQUFFLENBQUM7O0VBRTdGLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQzs7RUFFMUIsS0FBSyxlQUFlLEtBQUssdUJBQXVCLEdBQUc7O0dBRWxELHVCQUF1QixHQUFHLGVBQWUsQ0FBQztHQUMxQyxhQUFhLEdBQUcsSUFBSSxDQUFDOztHQUVyQjs7OztFQUlELElBQUkscUJBQXFCLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDOztFQUV6RCxLQUFLLHFCQUFxQixLQUFLLFNBQVMsR0FBRzs7OztHQUkxQyxJQUFJLGdCQUFnQixHQUFHLEVBQUUsQ0FBQzs7R0FFMUIsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztJQUVoRSxJQUFJLFNBQVMsR0FBRyxxQkFBcUIsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUMzQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7SUFFMUM7O0dBRUQsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLENBQUM7O0dBRTFDLEtBQUssZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRzs7SUFFbEMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzs7SUFFNUI7O0dBRUQsSUFBSSxlQUFlLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQzs7R0FFL0MsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztJQUUzRCxJQUFJLFNBQVMsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUN0QyxlQUFlLEVBQUUsQ0FBQyxFQUFFLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDOztJQUV0QyxLQUFLLFNBQVMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUc7O0tBRTNCLElBQUksS0FBSyxHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7S0FFM0IsS0FBSyxRQUFRLENBQUMsWUFBWSxLQUFLLElBQUksSUFBSSxlQUFlLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxZQUFZLEVBQUUsYUFBYSxHQUFHLENBQUMsRUFBRSxlQUFlLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7S0FDaEosS0FBSyxRQUFRLENBQUMsWUFBWSxLQUFLLElBQUksSUFBSSxlQUFlLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxZQUFZLEVBQUUsYUFBYSxHQUFHLENBQUMsRUFBRSxlQUFlLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7O0tBRTVJLE1BQU07O0tBRU4sS0FBSyxRQUFRLENBQUMsWUFBWSxLQUFLLElBQUksR0FBRyxRQUFRLENBQUMsZUFBZSxFQUFFLGFBQWEsR0FBRyxDQUFDLEVBQUUsQ0FBQztLQUNwRixLQUFLLFFBQVEsQ0FBQyxZQUFZLEtBQUssSUFBSSxHQUFHLFFBQVEsQ0FBQyxlQUFlLEVBQUUsYUFBYSxHQUFHLENBQUMsRUFBRSxDQUFDOztLQUVwRjs7SUFFRDs7R0FFRCxNQUFNLElBQUksQ0FBQyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztJQUVsRixlQUFlLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDOztJQUUzQjs7R0FFRCxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSx1QkFBdUIsRUFBRSxlQUFlLEVBQUUsQ0FBQzs7R0FFaEYsYUFBYSxHQUFHLElBQUksQ0FBQzs7R0FFckI7Ozs7RUFJRCxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO0VBQzNCLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO0VBQzVDLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQzs7RUFFcEIsS0FBSyxRQUFRLENBQUMsU0FBUyxLQUFLLElBQUksR0FBRzs7R0FFbEMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxRQUFRLEVBQUUsQ0FBQztHQUNyRCxXQUFXLEdBQUcsQ0FBQyxDQUFDOztHQUVoQjs7RUFFRCxJQUFJLFFBQVEsR0FBRyxjQUFjLENBQUM7O0VBRTlCLEtBQUssS0FBSyxLQUFLLElBQUksR0FBRzs7R0FFckIsUUFBUSxHQUFHLHFCQUFxQixDQUFDO0dBQ2pDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7O0dBRTNCOztFQUVELEtBQUssYUFBYSxHQUFHOztHQUVwQixxQkFBcUIsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDOztHQUVyRCxLQUFLLEtBQUssS0FBSyxJQUFJLEdBQUc7O0lBRXJCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLG9CQUFvQixFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7O0lBRTNFOztHQUVEOzs7O0VBSUQsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDOztFQUVsQixLQUFLLEtBQUssS0FBSyxJQUFJLEdBQUc7O0dBRXJCLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDOztHQUV4QixNQUFNLEtBQUssUUFBUSxLQUFLLFNBQVMsR0FBRzs7R0FFcEMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7O0dBRTNCOztFQUVELElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQztFQUN4RCxJQUFJLFVBQVUsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUM7O0VBRXhELElBQUksVUFBVSxHQUFHLEtBQUssS0FBSyxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDO0VBQ2hFLElBQUksVUFBVSxHQUFHLEtBQUssS0FBSyxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxXQUFXLEdBQUcsUUFBUSxDQUFDOztFQUV2RSxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsQ0FBQztFQUNuRCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxVQUFVLEdBQUcsVUFBVSxFQUFFLFVBQVUsR0FBRyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7O0VBRTFGLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLE9BQU8sR0FBRyxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0VBRXZELEtBQUssU0FBUyxLQUFLLENBQUMsR0FBRyxPQUFPOzs7O0VBSTlCLEtBQUssTUFBTSxDQUFDLE1BQU0sR0FBRzs7R0FFcEIsS0FBSyxRQUFRLENBQUMsU0FBUyxLQUFLLElBQUksR0FBRzs7SUFFbEMsS0FBSyxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsa0JBQWtCLEdBQUcsbUJBQW1CLEVBQUUsRUFBRSxDQUFDO0lBQzFFLFFBQVEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDOztJQUU5QixNQUFNOztJQUVOLFNBQVMsTUFBTSxDQUFDLFFBQVE7O0tBRXZCLEtBQUsySSxtQkFBaUI7TUFDckIsUUFBUSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7TUFDbEMsTUFBTTs7S0FFUCxLQUFLd3ZHLHVCQUFxQjtNQUN6QixRQUFRLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztNQUN2QyxNQUFNOztLQUVQLEtBQUtDLHFCQUFtQjtNQUN2QixRQUFRLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztNQUNyQyxNQUFNOztLQUVQOztJQUVEOzs7R0FHRCxNQUFNLEtBQUssTUFBTSxDQUFDLE1BQU0sR0FBRzs7R0FFM0IsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQzs7R0FFbkMsS0FBSyxTQUFTLEtBQUssU0FBUyxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUM7O0dBRTdDLEtBQUssQ0FBQyxZQUFZLEVBQUUsU0FBUyxHQUFHLG1CQUFtQixFQUFFLEVBQUUsQ0FBQzs7R0FFeEQsS0FBSyxNQUFNLENBQUMsY0FBYyxHQUFHOztJQUU1QixRQUFRLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7SUFFOUIsTUFBTSxLQUFLLE1BQU0sQ0FBQyxVQUFVLEdBQUc7O0lBRS9CLFFBQVEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDOztJQUVsQyxNQUFNOztJQUVOLFFBQVEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDOztJQUVuQzs7R0FFRCxNQUFNLEtBQUssTUFBTSxDQUFDLFFBQVEsR0FBRzs7R0FFN0IsUUFBUSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7O0dBRS9COztFQUVELEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQyx5QkFBeUIsR0FBRzs7R0FFckQsS0FBSyxRQUFRLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxHQUFHOztJQUVyQyxRQUFRLENBQUMsZUFBZSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUM7O0lBRTNEOztHQUVELE1BQU07O0dBRU4sUUFBUSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUM7O0dBRXhDOztFQUVELENBQUM7O0NBRUYsU0FBUyxxQkFBcUIsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEdBQUc7O0VBRXpFLEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQyx5QkFBeUIsR0FBRzs7R0FFckQsS0FBSyxVQUFVLENBQUMsR0FBRyxFQUFFLHdCQUF3QixFQUFFLEtBQUssSUFBSSxHQUFHOztJQUUxRCxPQUFPLENBQUMsS0FBSyxFQUFFLGdKQUFnSixFQUFFLENBQUM7SUFDbEssT0FBTzs7SUFFUDs7R0FFRDs7RUFFRCxLQUFLLFVBQVUsS0FBSyxTQUFTLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQzs7RUFFL0MsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDOztFQUV2QixJQUFJLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7O0VBRTdDLElBQUksaUJBQWlCLEdBQUcsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDOztFQUVoRCxJQUFJLDhCQUE4QixHQUFHLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQzs7RUFFckUsTUFBTSxJQUFJLElBQUksSUFBSSxpQkFBaUIsR0FBRzs7R0FFckMsSUFBSSxnQkFBZ0IsR0FBRyxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7R0FFakQsS0FBSyxnQkFBZ0IsSUFBSSxDQUFDLEdBQUc7O0lBRTVCLElBQUksaUJBQWlCLEdBQUcsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLENBQUM7O0lBRW5ELEtBQUssaUJBQWlCLEtBQUssU0FBUyxHQUFHOztLQUV0QyxJQUFJLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLENBQUM7S0FDOUMsSUFBSSxJQUFJLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxDQUFDOztLQUV0QyxJQUFJLG1CQUFtQixHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQzs7S0FFOUQsSUFBSSxNQUFNLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDO0tBQ3hDLElBQUksSUFBSSxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQztLQUNwQyxJQUFJLGVBQWUsR0FBRyxtQkFBbUIsQ0FBQyxlQUFlLENBQUM7O0tBRTFELEtBQUssaUJBQWlCLENBQUMsNEJBQTRCLEdBQUc7O01BRXJELElBQUksSUFBSSxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQztNQUNsQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO01BQ3pCLElBQUksTUFBTSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQzs7TUFFdEMsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLDRCQUE0QixHQUFHOztPQUVoRCxLQUFLLENBQUMseUJBQXlCLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7O09BRTNFLEtBQUssUUFBUSxDQUFDLGlCQUFpQixLQUFLLFNBQVMsR0FBRzs7UUFFL0MsUUFBUSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDOztRQUVoRTs7T0FFRCxNQUFNOztPQUVOLEtBQUssQ0FBQyxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQzs7T0FFMUM7O01BRUQsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDO01BQzNDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEdBQUcsZUFBZSxFQUFFLEVBQUUsVUFBVSxHQUFHLE1BQU0sR0FBRyxNQUFNLEtBQUssZUFBZSxFQUFFLENBQUM7O01BRWxKLE1BQU07O01BRU4sS0FBSyxpQkFBaUIsQ0FBQywwQkFBMEIsR0FBRzs7T0FFbkQsS0FBSyxDQUFDLHlCQUF5QixFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixDQUFDLGdCQUFnQixFQUFFLENBQUM7O09BRXhGLEtBQUssUUFBUSxDQUFDLGlCQUFpQixLQUFLLFNBQVMsR0FBRzs7UUFFL0MsUUFBUSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDLGdCQUFnQixHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQzs7UUFFMUY7O09BRUQsTUFBTTs7T0FFTixLQUFLLENBQUMsZUFBZSxFQUFFLGdCQUFnQixFQUFFLENBQUM7O09BRTFDOztNQUVELEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQztNQUMzQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFVBQVUsR0FBRyxJQUFJLEdBQUcsZUFBZSxFQUFFLENBQUM7O01BRTVHOztLQUVELE1BQU0sS0FBSyw4QkFBOEIsS0FBSyxTQUFTLEdBQUc7O0tBRTFELElBQUksS0FBSyxHQUFHLDhCQUE4QixFQUFFLElBQUksRUFBRSxDQUFDOztLQUVuRCxLQUFLLEtBQUssS0FBSyxTQUFTLEdBQUc7O01BRTFCLFNBQVMsS0FBSyxDQUFDLE1BQU07O09BRXBCLEtBQUssQ0FBQztRQUNMLEdBQUcsQ0FBQyxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDL0MsTUFBTTs7T0FFUCxLQUFLLENBQUM7UUFDTCxHQUFHLENBQUMsZUFBZSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxDQUFDO1FBQy9DLE1BQU07O09BRVAsS0FBSyxDQUFDO1FBQ0wsR0FBRyxDQUFDLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUMvQyxNQUFNOztPQUVQO1FBQ0MsR0FBRyxDQUFDLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7T0FFaEQ7O01BRUQ7O0tBRUQ7O0lBRUQ7O0dBRUQ7O0VBRUQsS0FBSyxDQUFDLHVCQUF1QixFQUFFLENBQUM7O0VBRWhDOzs7O0NBSUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxXQUFXLEtBQUssRUFBRSxNQUFNLEdBQUc7O0VBRXpDLE1BQU0sR0FBRyxFQUFFLENBQUM7O0VBRVosS0FBSyxDQUFDLFFBQVEsRUFBRSxXQUFXLE1BQU0sR0FBRzs7R0FFbkMsS0FBSyxNQUFNLENBQUMsT0FBTyxHQUFHOztJQUVyQixNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDOztJQUV0Qjs7R0FFRCxFQUFFLENBQUM7O0VBRUosV0FBVyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQzs7RUFFOUIsS0FBSyxDQUFDLFFBQVEsRUFBRSxXQUFXLE1BQU0sR0FBRzs7R0FFbkMsS0FBSyxNQUFNLENBQUMsUUFBUSxHQUFHOztJQUV0QixLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxHQUFHOztLQUV2QyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O01BRW5ELFlBQVksRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7O01BRXhEOztLQUVELE1BQU07O0tBRU4sWUFBWSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7S0FFbkQ7O0lBRUQ7O0dBRUQsRUFBRSxDQUFDOztFQUVKLENBQUM7Ozs7Q0FJRixJQUFJLENBQUMsTUFBTSxHQUFHLFdBQVcsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsVUFBVSxHQUFHOztFQUVsRSxLQUFLLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJLEdBQUc7O0dBRXZELE9BQU8sQ0FBQyxLQUFLLEVBQUUsd0VBQXdFLEVBQUUsQ0FBQztHQUMxRixPQUFPOztHQUVQOzs7O0VBSUQsdUJBQXVCLEdBQUcsRUFBRSxDQUFDO0VBQzdCLGtCQUFrQixHQUFHLEVBQUUsQ0FBQyxDQUFDO0VBQ3pCLGNBQWMsR0FBRyxJQUFJLENBQUM7Ozs7RUFJdEIsS0FBSyxLQUFLLENBQUMsVUFBVSxLQUFLLElBQUksR0FBRyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzs7OztFQUkzRCxNQUFNLENBQUMsY0FBYyxFQUFFLEtBQUssRUFBRSxDQUFDOztFQUUvQixLQUFLLE1BQU0sQ0FBQyxNQUFNLEtBQUssSUFBSSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDOztFQUV6RCxNQUFNLENBQUMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7RUFFM0QsaUJBQWlCLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0VBQ3pGLFFBQVEsQ0FBQyxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQzs7RUFFNUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7RUFDbEIsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7RUFDbkIsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7O0VBRXRCLHFCQUFxQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztFQUNsRCxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxFQUFFLENBQUM7O0VBRXhGLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO0VBQ3JELGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDOztFQUV6QixhQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7O0VBRWxELGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDOztFQUUzQixLQUFLLEtBQUssQ0FBQyxXQUFXLEtBQUssSUFBSSxHQUFHOztHQUVqQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7R0FFekI7Ozs7RUFJRCxLQUFLLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQzs7RUFFakQsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUV2QixTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQzs7RUFFbEMsV0FBVyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQzs7RUFFOUIsS0FBSyxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7Ozs7RUFJL0MsV0FBVyxDQUFDLEtBQUssR0FBRyxDQUFDO0VBQ3JCLFdBQVcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0VBQ3RCLFdBQVcsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0VBQ3pCLFdBQVcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0VBQ3RCLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDOztFQUV2QixLQUFLLFlBQVksS0FBSyxTQUFTLEdBQUc7O0dBRWpDLFlBQVksR0FBRyxJQUFJLENBQUM7O0dBRXBCOztFQUVELElBQUksQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLENBQUM7Ozs7RUFJckMsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQzs7RUFFbEMsS0FBSyxVQUFVLEtBQUssSUFBSSxHQUFHOztHQUUxQixLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLENBQUM7O0dBRTlHLE1BQU0sS0FBSyxVQUFVLElBQUksVUFBVSxDQUFDLE9BQU8sR0FBRzs7R0FFOUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxDQUFDO0dBQ2pHLFVBQVUsR0FBRyxJQUFJLENBQUM7O0dBRWxCOztFQUVELEtBQUssSUFBSSxDQUFDLFNBQVMsSUFBSSxVQUFVLEdBQUc7O0dBRW5DLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOztHQUU5RTs7RUFFRCxLQUFLLFVBQVUsSUFBSSxVQUFVLENBQUMsYUFBYSxHQUFHOztHQUU3QyxLQUFLLG1CQUFtQixLQUFLLFNBQVMsR0FBRzs7SUFFeEMsbUJBQW1CLEdBQUcsSUFBSWgrRSxtQkFBaUIsRUFBRSxDQUFDOztJQUU5QyxpQkFBaUIsR0FBRyxJQUFJdnhCLE1BQUk7S0FDM0IsSUFBSTFKLG1CQUFpQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0tBQ2hDLElBQUl3RSxnQkFBYyxFQUFFO01BQ25CLFFBQVEsRUFBRXBaLFdBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUTtNQUNqQyxZQUFZLEVBQUVBLFdBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWTtNQUN6QyxjQUFjLEVBQUVBLFdBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYztNQUM3QyxJQUFJLEVBQUUrZSxVQUFRO01BQ2QsU0FBUyxFQUFFLEtBQUs7TUFDaEIsVUFBVSxFQUFFLEtBQUs7TUFDakIsR0FBRyxFQUFFLEtBQUs7TUFDVixFQUFFO0tBQ0gsQ0FBQzs7SUFFRjs7R0FFRCxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7O0dBRXJFLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0dBQ3RFLG1CQUFtQixDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7O0dBR3JGLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQztHQUNsRSxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLEVBQUUsbUJBQW1CLENBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUM7O0dBRTVILE9BQU8sQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQzs7R0FFcEMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLENBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUFDOztHQUV2SSxNQUFNLEtBQUssVUFBVSxJQUFJLFVBQVUsQ0FBQyxTQUFTLEdBQUc7O0dBRWhELEtBQUsscUJBQXFCLEtBQUssU0FBUyxHQUFHOztJQUUxQyxxQkFBcUIsR0FBRyxJQUFJM1gsb0JBQWtCLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0lBRXZFLG1CQUFtQixHQUFHLElBQUlrWCxNQUFJO0tBQzdCLElBQUlwSixxQkFBbUIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0tBQy9CLElBQUl1RCxtQkFBaUIsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUU7S0FDNUUsQ0FBQzs7SUFFRjs7R0FFRCxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQzs7R0FFOUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxDQUFDOztHQUV0QyxLQUFLLENBQUMsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLENBQUM7O0dBRS9JOzs7O0VBSUQsSUFBSSxhQUFhLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDO0VBQzdDLElBQUksa0JBQWtCLEdBQUcsaUJBQWlCLENBQUMsV0FBVyxDQUFDOztFQUV2RCxLQUFLLEtBQUssQ0FBQyxnQkFBZ0IsR0FBRzs7R0FFN0IsSUFBSSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7O0dBRTlDLEtBQUssYUFBYSxDQUFDLE1BQU0sR0FBRyxhQUFhLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztHQUM1RixLQUFLLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxDQUFDOztHQUV0RyxNQUFNOzs7O0dBSU4sS0FBSyxhQUFhLENBQUMsTUFBTSxHQUFHLGFBQWEsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDOzs7O0dBSTFFLEtBQUssa0JBQWtCLENBQUMsTUFBTSxHQUFHLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7O0dBRXBGOzs7O0VBSUQsWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7RUFDckMsZUFBZSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLENBQUM7Ozs7RUFJMUQsS0FBSyxZQUFZLEdBQUc7O0dBRW5CLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxZQUFZLEVBQUUsQ0FBQzs7R0FFbEQ7Ozs7RUFJRCxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7RUFDcEMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO0VBQ3BDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7RUFFcEMsS0FBSyxNQUFNLENBQUMsYUFBYSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEdBQUc7O0dBRTdDLEtBQUssQ0FBQyxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUM7O0dBRTlCOztFQUVELE1BQU0sQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7Ozs7RUFJOUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBeURGLFNBQVMsYUFBYSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxHQUFHOztFQUVyRCxLQUFLLEVBQUUsTUFBTSxDQUFDLE9BQU8sR0FBRyxPQUFPOztFQUUvQixJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7O0VBRWxELEtBQUssT0FBTyxHQUFHOztHQUVkLEtBQUssTUFBTSxDQUFDLE9BQU8sR0FBRzs7SUFFckIsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7SUFFdEIsTUFBTSxLQUFLLE1BQU0sQ0FBQyxRQUFRLEdBQUc7O0lBRTdCLEtBQUssRUFBRSxNQUFNLENBQUMsYUFBYSxJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsR0FBRzs7S0FFcEUsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7S0FFdkI7O0lBRUQsTUFBTSxLQUFLLE1BQU0sQ0FBQyxXQUFXLEdBQUc7O0lBRWhDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7O0lBRTFCLE1BQU0sS0FBSyxNQUFNLENBQUMsdUJBQXVCLEdBQUc7O0lBRTVDLEtBQUssV0FBVyxHQUFHOztLQUVsQixRQUFRLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRTtPQUNsRCxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQzs7S0FFcEM7O0lBRUQsaUJBQWlCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDOztJQUUxRSxNQUFNLEtBQUssTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEdBQUc7O0lBRS9ELEtBQUssTUFBTSxDQUFDLGFBQWEsR0FBRzs7S0FFM0IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7S0FFekI7O0lBRUQsS0FBSyxFQUFFLE1BQU0sQ0FBQyxhQUFhLElBQUksUUFBUSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxHQUFHOztLQUVwRSxLQUFLLFdBQVcsR0FBRzs7TUFFbEIsUUFBUSxDQUFDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUU7UUFDbEQsWUFBWSxFQUFFLGlCQUFpQixFQUFFLENBQUM7O01BRXBDOztLQUVELElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7S0FDeEMsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQzs7S0FFL0IsS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHOztNQUVoQyxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDOztNQUU3QixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztPQUVqRCxJQUFJLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7T0FDeEIsSUFBSSxhQUFhLEdBQUcsUUFBUSxFQUFFLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQzs7T0FFcEQsS0FBSyxhQUFhLElBQUksYUFBYSxDQUFDLE9BQU8sR0FBRzs7UUFFN0MsaUJBQWlCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7O1FBRTdFOztPQUVEOztNQUVELE1BQU0sS0FBSyxRQUFRLENBQUMsT0FBTyxHQUFHOztNQUU5QixpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7TUFFdkU7O0tBRUQ7O0lBRUQ7O0dBRUQ7O0VBRUQsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQzs7RUFFL0IsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7R0FFbkQsYUFBYSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUM7O0dBRXBEOztFQUVEOztDQUVELFNBQVMsYUFBYSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixHQUFHOztFQUVyRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztHQUVyRCxJQUFJLFVBQVUsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0dBRWpDLElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7R0FDL0IsSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztHQUNuQyxJQUFJLFFBQVEsR0FBRyxnQkFBZ0IsS0FBSyxTQUFTLEdBQUcsVUFBVSxDQUFDLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQztHQUN2RixJQUFJLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDOztHQUU3QixNQUFNLENBQUMsY0FBYyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7O0dBRXpFLEtBQUssTUFBTSxDQUFDLGFBQWEsSUFBSSxNQUFNLENBQUMsT0FBTyxHQUFHOztJQUU3QyxJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDOztJQUU3QixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztLQUVwRCxJQUFJLE9BQU8sR0FBRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7S0FDM0IsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQzs7S0FFNUIsS0FBSyxDQUFDLFdBQVc7TUFDaEIsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLFdBQVc7TUFDakUsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLFdBQVc7TUFDakUsQ0FBQztLQUNGLEtBQUssQ0FBQyxVQUFVO01BQ2YsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLFdBQVc7TUFDakUsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLFdBQVc7TUFDakUsQ0FBQztLQUNGLEtBQUssQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUM7O0tBRTdCLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDOztLQUVsRTs7SUFFRCxNQUFNOztJQUVOLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDOztJQUVqRTs7R0FFRCxNQUFNLENBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7O0dBRXhFOztFQUVEOztDQUVELFNBQVMsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxHQUFHOztFQUV6RSxNQUFNLENBQUMsZUFBZSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7RUFDekYsTUFBTSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDOztFQUU5RCxLQUFLLE1BQU0sQ0FBQyx1QkFBdUIsR0FBRzs7R0FFckMsS0FBSyxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7R0FFOUIsSUFBSSxPQUFPLEdBQUcsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7R0FFaEUsdUJBQXVCLEdBQUcsRUFBRSxDQUFDOztHQUU3QixxQkFBcUIsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDOztHQUVuRCxNQUFNOztHQUVOLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQzs7R0FFakY7O0VBRUQ7O0NBRUQsU0FBUyxZQUFZLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxNQUFNLEdBQUc7O0VBRTlDLElBQUksa0JBQWtCLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7RUFFcEQsSUFBSSxVQUFVLEdBQUcsWUFBWSxDQUFDLGFBQWE7R0FDMUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsZUFBZSxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUVsRixJQUFJLElBQUksR0FBRyxZQUFZLENBQUMsY0FBYyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQzs7RUFFL0QsSUFBSSxPQUFPLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDO0VBQ3pDLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQzs7RUFFekIsS0FBSyxPQUFPLEtBQUssU0FBUyxHQUFHOzs7R0FHNUIsUUFBUSxDQUFDLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxDQUFDOztHQUUxRCxNQUFNLEtBQUssT0FBTyxDQUFDLElBQUksS0FBSyxJQUFJLEdBQUc7OztHQUduQywrQkFBK0IsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7R0FFNUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxRQUFRLEtBQUssU0FBUyxHQUFHOzs7R0FHL0MsT0FBTzs7R0FFUCxNQUFNOzs7R0FHTixhQUFhLEdBQUcsS0FBSyxDQUFDOztHQUV0Qjs7RUFFRCxLQUFLLGFBQWEsR0FBRzs7R0FFcEIsS0FBSyxVQUFVLENBQUMsUUFBUSxHQUFHOztJQUUxQixJQUFJLE1BQU0sR0FBR3pZLFdBQVMsRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7O0lBRTlDLGtCQUFrQixDQUFDLGFBQWEsR0FBRztLQUNsQyxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7S0FDbkIsUUFBUSxFQUFFM0IsZUFBYSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFO0tBQ2hELFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWTtLQUNqQyxjQUFjLEVBQUUsTUFBTSxDQUFDLGNBQWM7S0FDckMsQ0FBQzs7SUFFRixNQUFNOztJQUVOLGtCQUFrQixDQUFDLGFBQWEsR0FBRztLQUNsQyxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7S0FDbkIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRO0tBQzNCLFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWTtLQUNuQyxjQUFjLEVBQUUsUUFBUSxDQUFDLGNBQWM7S0FDdkMsQ0FBQzs7SUFFRjs7R0FFRCxRQUFRLENBQUMsYUFBYSxHQUFHLGtCQUFrQixDQUFDLGFBQWEsQ0FBQzs7R0FFMUQsT0FBTyxHQUFHLFlBQVksQ0FBQyxjQUFjLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7R0FFcEUsa0JBQWtCLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztHQUNyQyxRQUFRLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQzs7R0FFM0I7O0VBRUQsSUFBSSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7O0VBRWhELEtBQUssUUFBUSxDQUFDLFlBQVksR0FBRzs7R0FFNUIsUUFBUSxDQUFDLHdCQUF3QixHQUFHLENBQUMsQ0FBQzs7R0FFdEMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0lBRWxELEtBQUssaUJBQWlCLEVBQUUsYUFBYSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRzs7S0FFbEQsUUFBUSxDQUFDLHdCQUF3QixHQUFHLENBQUM7O0tBRXJDOztJQUVEOztHQUVEOztFQUVELEtBQUssUUFBUSxDQUFDLFlBQVksR0FBRzs7R0FFNUIsUUFBUSxDQUFDLHdCQUF3QixHQUFHLENBQUMsQ0FBQzs7R0FFdEMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0lBRWxELEtBQUssaUJBQWlCLEVBQUUsYUFBYSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRzs7S0FFbEQsUUFBUSxDQUFDLHdCQUF3QixHQUFHLENBQUM7O0tBRXJDOztJQUVEOztHQUVEOztFQUVELElBQUksUUFBUSxHQUFHLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7O0VBRXpELEtBQUssRUFBRSxRQUFRLENBQUMsZ0JBQWdCO0dBQy9CLEVBQUUsUUFBUSxDQUFDLG1CQUFtQjtHQUM5QixRQUFRLENBQUMsUUFBUSxLQUFLLElBQUksR0FBRzs7R0FFN0Isa0JBQWtCLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQztHQUMzRCxrQkFBa0IsQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDLGVBQWUsQ0FBQztHQUMvRCxRQUFRLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7O0dBRTVDOztFQUVELGtCQUFrQixDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7Ozs7RUFJN0Isa0JBQWtCLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7O0VBRTdDLEtBQUssUUFBUSxDQUFDLE1BQU0sR0FBRzs7OztHQUl0QixRQUFRLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7R0FDbkQsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDO0dBQ3ZELFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7R0FDekMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztHQUNqRCxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0dBQzNDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQzs7R0FFL0MsUUFBUSxDQUFDLG9CQUFvQixDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUM7R0FDbkUsUUFBUSxDQUFDLHVCQUF1QixDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsdUJBQXVCLENBQUM7R0FDekUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQztHQUNyRCxRQUFRLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztHQUMzRCxRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO0dBQ3ZELFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDOzs7R0FHN0Q7O0VBRUQsSUFBSSxZQUFZLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRTtHQUMxRCxZQUFZO0lBQ1hrdEIsZUFBYSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDOztFQUUzRCxrQkFBa0IsQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDOztFQUUvQzs7Q0FFRCxTQUFTLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLEdBQUc7O0VBRXBELGlCQUFpQixHQUFHLENBQUMsQ0FBQzs7RUFFdEIsSUFBSSxrQkFBa0IsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDOztFQUVwRCxLQUFLLGdCQUFnQixHQUFHOztHQUV2QixLQUFLLHFCQUFxQixJQUFJLE1BQU0sS0FBSyxjQUFjLEdBQUc7O0lBRXpELElBQUksUUFBUTtLQUNYLE1BQU0sS0FBSyxjQUFjO0tBQ3pCLFFBQVEsQ0FBQyxFQUFFLEtBQUssa0JBQWtCLENBQUM7Ozs7O0lBS3BDLFNBQVMsQ0FBQyxRQUFRO0tBQ2pCLFFBQVEsQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxXQUFXO0tBQ3hFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7SUFFeEM7O0dBRUQ7O0VBRUQsS0FBSyxRQUFRLENBQUMsV0FBVyxLQUFLLEtBQUssR0FBRzs7R0FFckMsS0FBSyxrQkFBa0IsQ0FBQyxPQUFPLEtBQUssU0FBUyxHQUFHOztJQUUvQyxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7SUFFNUIsTUFBTSxLQUFLLFFBQVEsQ0FBQyxHQUFHLElBQUksa0JBQWtCLENBQUMsR0FBRyxLQUFLLEdBQUcsR0FBRzs7SUFFNUQsUUFBUSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O0lBRTVCLE1BQU0sS0FBSyxRQUFRLENBQUMsTUFBTSxJQUFJLGtCQUFrQixDQUFDLFVBQVUsS0FBSyxPQUFPLENBQUMsSUFBSSxHQUFHOztJQUUvRSxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7SUFFNUIsTUFBTSxLQUFLLGtCQUFrQixDQUFDLGlCQUFpQixLQUFLLFNBQVM7TUFDM0Qsa0JBQWtCLENBQUMsaUJBQWlCLEtBQUssU0FBUyxDQUFDLFNBQVM7SUFDOUQsa0JBQWtCLENBQUMsZUFBZSxLQUFLLFNBQVMsQ0FBQyxlQUFlLEVBQUUsR0FBRzs7SUFFckUsUUFBUSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O0lBRTVCOztHQUVEOztFQUVELEtBQUssUUFBUSxDQUFDLFdBQVcsR0FBRzs7R0FFM0IsWUFBWSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7R0FDdEMsUUFBUSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7O0dBRTdCOztFQUVELElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQztFQUMzQixJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUM7RUFDNUIsSUFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDOztFQUUxQixJQUFJLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxPQUFPO0dBQ3ZDLFVBQVUsR0FBRyxPQUFPLENBQUMsV0FBVyxFQUFFO0dBQ2xDLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDOztFQUV4RCxLQUFLLE9BQU8sQ0FBQyxFQUFFLEtBQUssZUFBZSxHQUFHOztHQUVyQyxHQUFHLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztHQUNsQyxlQUFlLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQzs7R0FFN0IsY0FBYyxHQUFHLElBQUksQ0FBQztHQUN0QixlQUFlLEdBQUcsSUFBSSxDQUFDO0dBQ3ZCLGFBQWEsR0FBRyxJQUFJLENBQUM7O0dBRXJCOztFQUVELEtBQUssUUFBUSxDQUFDLEVBQUUsS0FBSyxrQkFBa0IsR0FBRzs7R0FFekMsa0JBQWtCLEdBQUcsUUFBUSxDQUFDLEVBQUUsQ0FBQzs7R0FFakMsZUFBZSxHQUFHLElBQUksQ0FBQzs7R0FFdkI7O0VBRUQsS0FBSyxjQUFjLElBQUksTUFBTSxLQUFLLGNBQWMsR0FBRzs7R0FFbEQsVUFBVSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7O0dBRXhFLEtBQUssWUFBWSxDQUFDLHNCQUFzQixHQUFHOztJQUUxQyxVQUFVLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxlQUFlO0tBQ3hDLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7O0lBRXJEOzs7R0FHRCxLQUFLLE1BQU0sS0FBSyxjQUFjLEdBQUc7O0lBRWhDLGNBQWMsR0FBRyxNQUFNLENBQUM7Ozs7OztJQU14QixlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQ3ZCLGFBQWEsR0FBRyxJQUFJLENBQUM7O0lBRXJCOzs7OztHQUtELEtBQUssUUFBUSxDQUFDLGdCQUFnQjtJQUM3QixRQUFRLENBQUMsbUJBQW1CO0lBQzVCLFFBQVEsQ0FBQyxzQkFBc0I7SUFDL0IsUUFBUSxDQUFDLE1BQU0sR0FBRzs7SUFFbEIsSUFBSSxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUM7O0lBRTVDLEtBQUssT0FBTyxLQUFLLFNBQVMsR0FBRzs7S0FFNUIsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHO01BQ3BCLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQzs7S0FFeEQ7O0lBRUQ7O0dBRUQsS0FBSyxRQUFRLENBQUMsbUJBQW1CO0lBQ2hDLFFBQVEsQ0FBQyxxQkFBcUI7SUFDOUIsUUFBUSxDQUFDLG1CQUFtQjtJQUM1QixRQUFRLENBQUMsc0JBQXNCO0lBQy9CLFFBQVEsQ0FBQyxnQkFBZ0I7SUFDekIsUUFBUSxDQUFDLFFBQVEsR0FBRzs7SUFFcEIsVUFBVSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDOztJQUVwRTs7R0FFRCxVQUFVLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxxQkFBcUIsRUFBRSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztHQUM3RSxVQUFVLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSx1QkFBdUIsRUFBRSxLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQzs7R0FFakY7Ozs7OztFQU1ELEtBQUssUUFBUSxDQUFDLFFBQVEsR0FBRzs7R0FFeEIsVUFBVSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDO0dBQ3BELFVBQVUsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxDQUFDOztHQUUzRCxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDOztHQUUvQixLQUFLLFFBQVEsR0FBRzs7SUFFZixJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDOztJQUUzQixLQUFLLFlBQVksQ0FBQyxtQkFBbUIsR0FBRzs7S0FFdkMsS0FBSyxRQUFRLENBQUMsV0FBVyxLQUFLLFNBQVMsR0FBRzs7Ozs7Ozs7OztNQVV6QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7TUFDekMsSUFBSSxHQUFHcDlDLE9BQUssQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO01BQ2pELElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7TUFFM0IsSUFBSSxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztNQUN2RCxZQUFZLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQzs7TUFFMUMsSUFBSSxXQUFXLEdBQUcsSUFBSXlhLGFBQVcsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRXZELFlBQVUsRUFBRWlpRCxXQUFTLEVBQUUsQ0FBQzs7TUFFckYsUUFBUSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7TUFDckMsUUFBUSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7TUFDbkMsUUFBUSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7O01BRWhDOztLQUVELFVBQVUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7S0FDaEUsVUFBVSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDOztLQUV4RSxNQUFNOztLQUVOLFVBQVUsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsQ0FBQzs7S0FFeEQ7O0lBRUQ7O0dBRUQ7O0VBRUQsS0FBSyxlQUFlLEdBQUc7O0dBRXRCLEtBQUssUUFBUSxDQUFDLE1BQU0sR0FBRzs7Ozs7Ozs7Ozs7SUFXdEIsNkJBQTZCLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxDQUFDOztJQUUzRDs7OztHQUlELEtBQUssR0FBRyxJQUFJLFFBQVEsQ0FBQyxHQUFHLEdBQUc7O0lBRTFCLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7SUFFdEM7O0dBRUQsS0FBSyxRQUFRLENBQUMsbUJBQW1CO0lBQ2hDLFFBQVEsQ0FBQyxxQkFBcUI7SUFDOUIsUUFBUSxDQUFDLG1CQUFtQjtJQUM1QixRQUFRLENBQUMsc0JBQXNCO0lBQy9CLFFBQVEsQ0FBQyxvQkFBb0I7SUFDN0IsUUFBUSxDQUFDLG1CQUFtQixHQUFHOztJQUUvQixxQkFBcUIsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUM7O0lBRTlDOzs7O0dBSUQsS0FBSyxRQUFRLENBQUMsbUJBQW1CLEdBQUc7O0lBRW5DLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7SUFFNUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxvQkFBb0IsR0FBRzs7SUFFM0MsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQzVDLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7SUFFNUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxnQkFBZ0IsR0FBRzs7SUFFdkMscUJBQXFCLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDOztJQUU5QyxNQUFNLEtBQUssUUFBUSxDQUFDLHFCQUFxQixHQUFHOztJQUU1QyxzQkFBc0IsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUM7O0lBRS9DLE1BQU0sS0FBSyxRQUFRLENBQUMsa0JBQWtCLEdBQUc7O0lBRXpDLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7SUFFNUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxtQkFBbUIsR0FBRzs7SUFFMUMsb0JBQW9CLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDOztJQUU3QyxNQUFNLEtBQUssUUFBUSxDQUFDLHNCQUFzQixHQUFHOztJQUU3Qyx1QkFBdUIsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUM7O0lBRWhELE1BQU0sS0FBSyxRQUFRLENBQUMsc0JBQXNCLEdBQUc7O0lBRTdDLHVCQUF1QixFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7SUFFaEQsTUFBTSxLQUFLLFFBQVEsQ0FBQyxtQkFBbUIsR0FBRzs7SUFFMUMsS0FBSyxRQUFRLENBQUMsZUFBZSxHQUFHOztLQUUvQixVQUFVLENBQUMsZUFBZSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDO0tBQzVELFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDO0tBQ2hFLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDOztLQUU5RDs7SUFFRCxNQUFNLEtBQUssUUFBUSxDQUFDLG9CQUFvQixHQUFHOztJQUUzQyxxQkFBcUIsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUM7O0lBRTlDOzs7OztHQUtELEtBQUssVUFBVSxDQUFDLE1BQU0sS0FBSyxTQUFTLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUdocEMsYUFBVyxDQUFDLGVBQWUsQ0FBQztHQUM3RixLQUFLLFVBQVUsQ0FBQyxNQUFNLEtBQUssU0FBUyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHQSxhQUFXLENBQUMsZUFBZSxDQUFDOztHQUU3Rml0QixlQUFhLENBQUMsTUFBTTtJQUNuQixHQUFHLEVBQUUsa0JBQWtCLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7R0FFM0Q7Ozs7O0VBS0QsVUFBVSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO0VBQ3RFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7RUFDaEUsVUFBVSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7RUFFOUQsT0FBTyxPQUFPLENBQUM7O0VBRWY7Ozs7Q0FJRCxTQUFTLHFCQUFxQixFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUc7O0VBRXBELFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7O0VBRTFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7O0VBRXhDLEtBQUssUUFBUSxDQUFDLFFBQVEsR0FBRzs7R0FFeEIsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLGlCQUFpQixFQUFFLENBQUM7O0dBRS9GOztFQUVELFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUM7RUFDbEMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztFQUNsRCxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDOztFQUU1QyxLQUFLLFFBQVEsQ0FBQyxRQUFRLEdBQUc7O0dBRXhCLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7R0FDNUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUM7O0dBRTlEOztFQUVELEtBQUssUUFBUSxDQUFDLEtBQUssR0FBRzs7R0FFckIsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztHQUN0QyxRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDOztHQUV4RDs7Ozs7Ozs7OztFQVVELElBQUksVUFBVSxDQUFDOztFQUVmLEtBQUssUUFBUSxDQUFDLEdBQUcsR0FBRzs7R0FFbkIsVUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUM7O0dBRTFCLE1BQU0sS0FBSyxRQUFRLENBQUMsV0FBVyxHQUFHOztHQUVsQyxVQUFVLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQzs7R0FFbEMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxlQUFlLEdBQUc7O0dBRXRDLFVBQVUsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDOztHQUV0QyxNQUFNLEtBQUssUUFBUSxDQUFDLFNBQVMsR0FBRzs7R0FFaEMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7O0dBRWhDLE1BQU0sS0FBSyxRQUFRLENBQUMsT0FBTyxHQUFHOztHQUU5QixVQUFVLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQzs7R0FFOUIsTUFBTSxLQUFLLFFBQVEsQ0FBQyxZQUFZLEdBQUc7O0dBRW5DLFVBQVUsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDOztHQUVuQyxNQUFNLEtBQUssUUFBUSxDQUFDLFlBQVksR0FBRzs7R0FFbkMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7O0dBRW5DLE1BQU0sS0FBSyxRQUFRLENBQUMsUUFBUSxHQUFHOztHQUUvQixVQUFVLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQzs7R0FFL0IsTUFBTSxLQUFLLFFBQVEsQ0FBQyxXQUFXLEdBQUc7O0dBRWxDLFVBQVUsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDOztHQUVsQzs7RUFFRCxLQUFLLFVBQVUsS0FBSyxTQUFTLEdBQUc7OztHQUcvQixLQUFLLFVBQVUsQ0FBQyxtQkFBbUIsR0FBRzs7SUFFckMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7O0lBRWhDOztHQUVELElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7R0FDL0IsSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQzs7R0FFL0IsUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7R0FFMUU7O0VBRUQsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQzs7Ozs7O0VBTXhDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLEVBQUUsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDOztFQUVqRyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDO0VBQ3BELFFBQVEsQ0FBQyxlQUFlLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUM7O0VBRTFEOztDQUVELFNBQVMsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLFFBQVEsR0FBRzs7RUFFbEQsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztFQUN4QyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDOztFQUUxQzs7Q0FFRCxTQUFTLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUc7O0VBRWxELFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7RUFDNUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO0VBQ2hFLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7O0VBRXRDOztDQUVELFNBQVMscUJBQXFCLEVBQUUsUUFBUSxFQUFFLFFBQVEsR0FBRzs7RUFFcEQsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztFQUN4QyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO0VBQzFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDO0VBQ2xELFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sR0FBRyxHQUFHLENBQUM7O0VBRXJDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUM7O0VBRWxDLEtBQUssUUFBUSxDQUFDLEdBQUcsS0FBSyxJQUFJLEdBQUc7O0dBRTVCLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO0dBQ2pDLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDOztHQUVqQyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztHQUUxRTs7RUFFRDs7Q0FFRCxTQUFTLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxHQUFHLEdBQUc7O0VBRTVDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7O0VBRXBDLEtBQUssR0FBRyxDQUFDLEtBQUssR0FBRzs7R0FFaEIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztHQUNsQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDOztHQUVoQyxNQUFNLEtBQUssR0FBRyxDQUFDLFNBQVMsR0FBRzs7R0FFM0IsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQzs7R0FFeEM7O0VBRUQ7O0NBRUQsU0FBUyxzQkFBc0IsRUFBRSxRQUFRLEVBQUUsUUFBUSxHQUFHOztFQUVyRCxLQUFLLFFBQVEsQ0FBQyxXQUFXLEdBQUc7O0dBRTNCLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7O0dBRWxEOztFQUVEOztDQUVELFNBQVMsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLFFBQVEsR0FBRzs7RUFFbkQsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztFQUM1QyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRWhFLEtBQUssUUFBUSxDQUFDLFdBQVcsR0FBRzs7R0FFM0IsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQzs7R0FFbEQ7O0VBRUQsS0FBSyxRQUFRLENBQUMsT0FBTyxHQUFHOztHQUV2QixRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO0dBQzFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7O0dBRTlDOztFQUVELEtBQUssUUFBUSxDQUFDLFNBQVMsR0FBRzs7R0FFekIsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztHQUM5QyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDOztHQUV4RDs7RUFFRCxLQUFLLFFBQVEsQ0FBQyxlQUFlLEdBQUc7O0dBRS9CLFFBQVEsQ0FBQyxlQUFlLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUM7R0FDMUQsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUM7R0FDOUQsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUM7O0dBRTVEOztFQUVEOztDQUVELFNBQVMsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLFFBQVEsR0FBRzs7RUFFbEQsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDOztFQUUzQyxLQUFLLFFBQVEsQ0FBQyxXQUFXLEdBQUc7O0dBRTNCLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7O0dBRWxEOztFQUVEOztDQUVELFNBQVMsdUJBQXVCLEVBQUUsUUFBUSxFQUFFLFFBQVEsR0FBRzs7RUFFdEQsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztFQUM5QyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDOztFQUU5QyxLQUFLLFFBQVEsQ0FBQyxZQUFZLEdBQUc7O0dBRTVCLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7O0dBRXBEOztFQUVELEtBQUssUUFBUSxDQUFDLFlBQVksR0FBRzs7R0FFNUIsUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQzs7R0FFcEQ7O0VBRUQsS0FBSyxRQUFRLENBQUMsV0FBVyxHQUFHOztHQUUzQixRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDOztHQUVsRDs7RUFFRCxLQUFLLFFBQVEsQ0FBQyxPQUFPLEdBQUc7O0dBRXZCLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7R0FDMUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQzs7R0FFOUM7O0VBRUQsS0FBSyxRQUFRLENBQUMsU0FBUyxHQUFHOztHQUV6QixRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDO0dBQzlDLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7O0dBRXhEOztFQUVELEtBQUssUUFBUSxDQUFDLGVBQWUsR0FBRzs7R0FFL0IsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQztHQUMxRCxRQUFRLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztHQUM5RCxRQUFRLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQzs7R0FFNUQ7O0VBRUQsS0FBSyxRQUFRLENBQUMsTUFBTSxHQUFHOzs7R0FHdEIsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQzs7R0FFMUQ7O0VBRUQ7O0NBRUQsU0FBUyx1QkFBdUIsRUFBRSxRQUFRLEVBQUUsUUFBUSxHQUFHOztFQUV0RCxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDO0VBQzlDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixDQUFDOztFQUVoRSx1QkFBdUIsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUM7O0VBRTlDOztDQUVELFNBQVMscUJBQXFCLEVBQUUsUUFBUSxFQUFFLFFBQVEsR0FBRzs7RUFFcEQsS0FBSyxRQUFRLENBQUMsT0FBTyxHQUFHOztHQUV2QixRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO0dBQzFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7O0dBRTlDOztFQUVELEtBQUssUUFBUSxDQUFDLFNBQVMsR0FBRzs7R0FFekIsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztHQUM5QyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDOztHQUV4RDs7RUFFRCxLQUFLLFFBQVEsQ0FBQyxlQUFlLEdBQUc7O0dBRS9CLFFBQVEsQ0FBQyxlQUFlLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUM7R0FDMUQsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUM7R0FDOUQsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUM7O0dBRTVEOztFQUVEOzs7O0NBSUQsU0FBUyw2QkFBNkIsRUFBRSxRQUFRLEVBQUUsS0FBSyxHQUFHOztFQUV6RCxRQUFRLENBQUMsaUJBQWlCLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQzs7RUFFL0MsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7RUFDL0MsUUFBUSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0VBQ3pDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztFQUN4QyxRQUFRLENBQUMsY0FBYyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7RUFDNUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7O0VBRTlDOzs7O0NBSUQsU0FBUyxZQUFZLEVBQUUsTUFBTSxHQUFHOztFQUUvQixJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQzs7RUFFM0IsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7R0FFakQsSUFBSSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUV4QixLQUFLLEtBQUssQ0FBQyxVQUFVLEdBQUc7O0lBRXZCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFDOUMsa0JBQWtCLEdBQUcsQ0FBQzs7SUFFdEI7O0dBRUQ7O0VBRUQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsa0JBQWtCLENBQUM7O0VBRTVDOztDQUVELFNBQVMsV0FBVyxFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQUc7O0VBRXRDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTTtHQUN2QixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7R0FDbkIsS0FBSztHQUNMLFNBQVM7R0FDVCxRQUFRO0dBQ1IsU0FBUzs7R0FFVCxVQUFVLEdBQUcsTUFBTSxDQUFDLGtCQUFrQjs7R0FFdEMsaUJBQWlCLEdBQUcsQ0FBQztHQUNyQixXQUFXLEdBQUcsQ0FBQztHQUNmLFVBQVUsR0FBRyxDQUFDO0dBQ2QsY0FBYyxHQUFHLENBQUM7R0FDbEIsVUFBVSxHQUFHLENBQUMsQ0FBQzs7RUFFaEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0dBRS9DLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0dBRXBCLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO0dBQ3BCLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO0dBQzVCLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDOztHQUUxQixTQUFTLEdBQUcsRUFBRSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7O0dBRW5GLEtBQUssS0FBSyxDQUFDLGNBQWMsR0FBRzs7SUFFM0IsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBQ3pCLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztJQUN6QixDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7O0lBRXpCLE1BQU0sS0FBSyxLQUFLLENBQUMsa0JBQWtCLEdBQUc7O0lBRXRDLElBQUksUUFBUSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUM7O0lBRXZDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3JFLFFBQVEsQ0FBQyxTQUFTLENBQUMscUJBQXFCLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzlELFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzNELFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQ25DLFFBQVEsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLENBQUM7O0lBRXBELFFBQVEsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQzs7SUFFbkMsS0FBSyxLQUFLLENBQUMsVUFBVSxHQUFHOztLQUV2QixNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQzs7S0FFdEIsUUFBUSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0tBQ2xDLFFBQVEsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztLQUN0QyxRQUFRLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7O0tBRXhDOztJQUVELE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxpQkFBaUIsRUFBRSxHQUFHLFNBQVMsQ0FBQztJQUM5RCxPQUFPLENBQUMsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUMzRSxPQUFPLENBQUMsV0FBVyxFQUFFLGlCQUFpQixFQUFFLEdBQUcsUUFBUSxDQUFDOztJQUVwRCxpQkFBaUIsR0FBRyxDQUFDOztJQUVyQixNQUFNLEtBQUssS0FBSyxDQUFDLFdBQVcsR0FBRzs7SUFFL0IsSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7SUFFdkMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDN0QsUUFBUSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUM7O0lBRTdDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLGNBQWMsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUN6RCxRQUFRLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQzs7SUFFN0IsUUFBUSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDOUQsUUFBUSxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDM0QsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDbkMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsQ0FBQzs7SUFFcEQsUUFBUSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMzQyxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEtBQUssS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7SUFDeEUsUUFBUSxDQUFDLEtBQUssR0FBRyxFQUFFLEtBQUssQ0FBQyxRQUFRLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDOztJQUU5RCxRQUFRLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7O0lBRW5DLEtBQUssS0FBSyxDQUFDLFVBQVUsR0FBRzs7S0FFdkIsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7O0tBRXRCLFFBQVEsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztLQUNsQyxRQUFRLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7S0FDdEMsUUFBUSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDOztLQUV4Qzs7SUFFRCxPQUFPLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxHQUFHLFNBQVMsQ0FBQztJQUNoRCxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDN0QsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRyxRQUFRLENBQUM7O0lBRXRDLFVBQVUsR0FBRyxDQUFDOztJQUVkLE1BQU0sS0FBSyxLQUFLLENBQUMsZUFBZSxHQUFHOztJQUVuQyxJQUFJLFFBQVEsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDOzs7SUFHdkMsUUFBUSxDQUFDLEtBQUs7TUFDWixJQUFJLEVBQUUsS0FBSyxFQUFFO01BQ2IsY0FBYyxFQUFFLFNBQVMsS0FBSyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDOzs7OztJQUsvRCxRQUFRLENBQUMsUUFBUSxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM3RCxRQUFRLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsQ0FBQzs7O0lBRzdDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNyQixRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNuQyxRQUFRLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQ25DLFNBQVMsQ0FBQyxlQUFlLEVBQUUsUUFBUSxFQUFFLENBQUM7O0lBRXRDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxpQkFBaUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3JFLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxlQUFlLEdBQUcsRUFBRSxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7SUFFckUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDN0MsUUFBUSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsU0FBUyxFQUFFLENBQUM7Ozs7O0lBSzlDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsY0FBYyxFQUFFLEdBQUcsUUFBUSxDQUFDOztJQUU5QyxjQUFjLEdBQUcsQ0FBQzs7SUFFbEIsTUFBTSxLQUFLLEtBQUssQ0FBQyxZQUFZLEdBQUc7O0lBRWhDLElBQUksUUFBUSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUM7O0lBRXZDLFFBQVEsQ0FBQyxRQUFRLENBQUMscUJBQXFCLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzdELFFBQVEsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxDQUFDOztJQUU3QyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNyRSxRQUFRLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7SUFDbkMsUUFBUSxDQUFDLEtBQUssR0FBRyxFQUFFLEtBQUssQ0FBQyxRQUFRLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDOztJQUU5RCxRQUFRLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7O0lBRW5DLEtBQUssS0FBSyxDQUFDLFVBQVUsR0FBRzs7S0FFdkIsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7O0tBRXRCLFFBQVEsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztLQUNsQyxRQUFRLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7S0FDdEMsUUFBUSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDOztLQUV4Qzs7SUFFRCxPQUFPLENBQUMsY0FBYyxFQUFFLFdBQVcsRUFBRSxHQUFHLFNBQVMsQ0FBQztJQUNsRCxPQUFPLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDL0QsT0FBTyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsR0FBRyxRQUFRLENBQUM7O0lBRXhDLFdBQVcsR0FBRyxDQUFDOztJQUVmLE1BQU0sS0FBSyxLQUFLLENBQUMsaUJBQWlCLEdBQUc7O0lBRXJDLElBQUksUUFBUSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUM7O0lBRXZDLFFBQVEsQ0FBQyxTQUFTLENBQUMscUJBQXFCLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzlELFFBQVEsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLENBQUM7SUFDcEQsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7SUFFL0IsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLGNBQWMsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUNsRSxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsY0FBYyxFQUFFLFNBQVMsRUFBRSxDQUFDOztJQUUzRSxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxHQUFHLFFBQVEsQ0FBQzs7SUFFdEMsVUFBVSxHQUFHLENBQUM7O0lBRWQ7O0dBRUQ7O0VBRUQsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDekIsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDekIsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0VBRXpCLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLGlCQUFpQixDQUFDO0VBQy9DLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQztFQUNqQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUM7RUFDekMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO0VBQ25DLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQzs7O0VBR2pDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLEdBQUcsR0FBRyxHQUFHLFdBQVcsR0FBRyxHQUFHLEdBQUcsVUFBVSxHQUFHLEdBQUcsR0FBRyxjQUFjLEdBQUcsR0FBRyxHQUFHLFVBQVUsR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7O0VBRWpKOzs7O0NBSUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxXQUFXLFFBQVEsRUFBRSxrQkFBa0IsR0FBRzs7RUFFL0QsS0FBSyxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsQ0FBQztFQUM5QixLQUFLLENBQUMsWUFBWSxFQUFFLGtCQUFrQixLQUFLLG9CQUFvQixFQUFFLENBQUM7O0VBRWxFLENBQUM7Ozs7Q0FJRixTQUFTLGdCQUFnQixHQUFHOztFQUUzQixJQUFJLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQzs7RUFFcEMsS0FBSyxXQUFXLElBQUksWUFBWSxDQUFDLFdBQVcsR0FBRzs7R0FFOUMsT0FBTyxDQUFDLElBQUksRUFBRSwrQkFBK0IsR0FBRyxXQUFXLEdBQUcsOENBQThDLEdBQUcsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDOztHQUUxSTs7RUFFRCxpQkFBaUIsSUFBSSxDQUFDLENBQUM7O0VBRXZCLE9BQU8sV0FBVyxDQUFDOztFQUVuQjs7Q0FFRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7OztDQUd6QyxJQUFJLENBQUMsWUFBWSxLQUFLLFlBQVk7O0VBRWpDLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQzs7O0VBR25CLE9BQU8sU0FBUyxZQUFZLEVBQUUsT0FBTyxFQUFFLElBQUksR0FBRzs7R0FFN0MsS0FBSyxPQUFPLElBQUksT0FBTyxDQUFDLG1CQUFtQixHQUFHOztJQUU3QyxLQUFLLEVBQUUsTUFBTSxHQUFHOztLQUVmLE9BQU8sQ0FBQyxJQUFJLEVBQUUsOEdBQThHLEVBQUUsQ0FBQztLQUMvSCxNQUFNLEdBQUcsSUFBSSxDQUFDOztLQUVkOztJQUVELE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDOztJQUUxQjs7R0FFRCxRQUFRLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7R0FFdkMsQ0FBQzs7RUFFRixFQUFFLEVBQUUsQ0FBQzs7Q0FFTixJQUFJLENBQUMsVUFBVSxLQUFLLFlBQVk7O0VBRS9CLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQzs7RUFFbkIsT0FBTyxTQUFTLFVBQVUsRUFBRSxPQUFPLEVBQUUsSUFBSSxHQUFHOztHQUUzQyxLQUFLLEVBQUUsTUFBTSxHQUFHOztJQUVmLE9BQU8sQ0FBQyxJQUFJLEVBQUUsMkVBQTJFLEVBQUUsQ0FBQztJQUM1RixNQUFNLEdBQUcsSUFBSSxDQUFDOztJQUVkOztHQUVELFFBQVEsQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDOztHQUV2QyxDQUFDOztFQUVGLEVBQUUsRUFBRSxDQUFDOztDQUVOLElBQUksQ0FBQyxjQUFjLEtBQUssWUFBWTs7RUFFbkMsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDOztFQUVuQixPQUFPLFNBQVMsY0FBYyxFQUFFLE9BQU8sRUFBRSxJQUFJLEdBQUc7OztHQUcvQyxLQUFLLE9BQU8sSUFBSSxPQUFPLENBQUMsdUJBQXVCLEdBQUc7O0lBRWpELEtBQUssRUFBRSxNQUFNLEdBQUc7O0tBRWYsT0FBTyxDQUFDLElBQUksRUFBRSxxSEFBcUgsRUFBRSxDQUFDO0tBQ3RJLE1BQU0sR0FBRyxJQUFJLENBQUM7O0tBRWQ7O0lBRUQsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7O0lBRTFCOzs7O0dBSUQsS0FBSyxFQUFFLE9BQU8sSUFBSSxPQUFPLENBQUMsYUFBYTtNQUNwQyxLQUFLLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsR0FBRzs7Ozs7SUFLbkUsUUFBUSxDQUFDLGNBQWMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7O0lBRXpDLE1BQU07Ozs7SUFJTixRQUFRLENBQUMscUJBQXFCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDOztJQUVoRDs7R0FFRCxDQUFDOztFQUVGLEVBQUUsRUFBRSxDQUFDOztDQUVOLElBQUksQ0FBQyxlQUFlLEdBQUcsWUFBWTs7RUFFbEMsT0FBTyxvQkFBb0IsQ0FBQzs7RUFFNUIsQ0FBQzs7Q0FFRixJQUFJLENBQUMsZUFBZSxHQUFHLFdBQVcsWUFBWSxHQUFHOztFQUVoRCxvQkFBb0IsR0FBRyxZQUFZLENBQUM7O0VBRXBDLEtBQUssWUFBWSxJQUFJLFVBQVUsQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLENBQUMsa0JBQWtCLEtBQUssU0FBUyxHQUFHOztHQUV0RixRQUFRLENBQUMsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLENBQUM7O0dBRTNDOztFQUVELElBQUksTUFBTSxLQUFLLFlBQVksSUFBSSxZQUFZLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztFQUN0RSxJQUFJLFdBQVcsQ0FBQzs7RUFFaEIsS0FBSyxZQUFZLEdBQUc7O0dBRW5CLElBQUksc0JBQXNCLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxZQUFZLEVBQUUsQ0FBQzs7R0FFNUQsS0FBSyxNQUFNLEdBQUc7O0lBRWIsV0FBVyxHQUFHLHNCQUFzQixDQUFDLGtCQUFrQixFQUFFLFlBQVksQ0FBQyxjQUFjLEVBQUUsQ0FBQzs7SUFFdkYsTUFBTTs7SUFFTixXQUFXLEdBQUcsc0JBQXNCLENBQUMsa0JBQWtCLENBQUM7O0lBRXhEOztHQUVELGVBQWUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO0dBQzdDLG1CQUFtQixHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUM7O0dBRS9DLGdCQUFnQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7O0dBRS9DLE1BQU07O0dBRU4sV0FBVyxHQUFHLElBQUksQ0FBQzs7R0FFbkIsZUFBZSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxjQUFjLEVBQUUsV0FBVyxFQUFFLENBQUM7R0FDL0QsbUJBQW1CLEdBQUcsWUFBWSxDQUFDOztHQUVuQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsY0FBYyxFQUFFLFdBQVcsRUFBRSxDQUFDOztHQUVqRTs7RUFFRCxLQUFLLG1CQUFtQixLQUFLLFdBQVcsR0FBRzs7R0FFMUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxDQUFDO0dBQ3BELG1CQUFtQixHQUFHLFdBQVcsQ0FBQzs7R0FFbEM7O0VBRUQsS0FBSyxDQUFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsQ0FBQztFQUNqQyxLQUFLLENBQUMsY0FBYyxFQUFFLG1CQUFtQixFQUFFLENBQUM7O0VBRTVDLEtBQUssQ0FBQyxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQzs7RUFFbkMsS0FBSyxNQUFNLEdBQUc7O0dBRWIsSUFBSSxpQkFBaUIsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztHQUMvRCxHQUFHLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLDJCQUEyQixHQUFHLFlBQVksQ0FBQyxjQUFjLEVBQUUsaUJBQWlCLENBQUMsY0FBYyxFQUFFLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDOztHQUVwTTs7RUFFRCxDQUFDOztDQUVGLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxXQUFXLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFHOztFQUVwRixLQUFLLEVBQUUsWUFBWSxJQUFJLFlBQVksQ0FBQyxtQkFBbUIsT0FBTyxLQUFLLEdBQUc7O0dBRXJFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsMEZBQTBGLEVBQUUsQ0FBQztHQUM1RyxPQUFPOztHQUVQOztFQUVELElBQUksV0FBVyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLENBQUMsa0JBQWtCLENBQUM7O0VBRXBFLEtBQUssV0FBVyxHQUFHOztHQUVsQixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7O0dBRXBCLEtBQUssV0FBVyxLQUFLLG1CQUFtQixHQUFHOztJQUUxQyxHQUFHLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQUM7O0lBRXBELE9BQU8sR0FBRyxJQUFJLENBQUM7O0lBRWY7O0dBRUQsSUFBSTs7SUFFSCxJQUFJLE9BQU8sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDO0lBQ25DLElBQUksYUFBYSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDbkMsSUFBSSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQzs7SUFFL0IsS0FBSyxhQUFhLEtBQUtsbUMsWUFBVSxJQUFJLGNBQWMsRUFBRSxhQUFhLEVBQUUsS0FBSyxHQUFHLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxnQ0FBZ0MsRUFBRSxHQUFHOztLQUVuSSxPQUFPLENBQUMsS0FBSyxFQUFFLDJHQUEyRyxFQUFFLENBQUM7S0FDN0gsT0FBTzs7S0FFUDs7SUFFRCxLQUFLLFdBQVcsS0FBS0Msa0JBQWdCLElBQUksY0FBYyxFQUFFLFdBQVcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLDhCQUE4QixFQUFFO0tBQ2hJLElBQUksV0FBVyxLQUFLZ2lELFdBQVMsTUFBTSxVQUFVLENBQUMsR0FBRyxFQUFFLG1CQUFtQixFQUFFLElBQUksVUFBVSxDQUFDLEdBQUcsRUFBRSwwQkFBMEIsRUFBRSxFQUFFLEVBQUU7S0FDNUgsSUFBSSxXQUFXLEtBQUtDLGVBQWEsSUFBSSxVQUFVLENBQUMsR0FBRyxFQUFFLDZCQUE2QixFQUFFLEVBQUUsR0FBRzs7S0FFekYsT0FBTyxDQUFDLEtBQUssRUFBRSxxSEFBcUgsRUFBRSxDQUFDO0tBQ3ZJLE9BQU87O0tBRVA7O0lBRUQsS0FBSyxHQUFHLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxvQkFBb0IsR0FBRzs7OztLQUlqRixLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sWUFBWSxDQUFDLEtBQUssR0FBRyxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxZQUFZLENBQUMsTUFBTSxHQUFHLE1BQU0sRUFBRSxFQUFFLEdBQUc7O01BRS9HLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUM7O01BRTlHOztLQUVELE1BQU07O0tBRU4sT0FBTyxDQUFDLEtBQUssRUFBRSw0R0FBNEcsRUFBRSxDQUFDOztLQUU5SDs7SUFFRCxTQUFTOztJQUVULEtBQUssT0FBTyxHQUFHOztLQUVkLEdBQUcsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxDQUFDOztLQUU1RDs7SUFFRDs7R0FFRDs7RUFFRCxDQUFDOzs7O0NBSUYsU0FBUyxjQUFjLEVBQUUsQ0FBQyxHQUFHOztFQUU1QixJQUFJLFNBQVMsQ0FBQzs7RUFFZCxLQUFLLENBQUMsS0FBS2dELGdCQUFjLEdBQUcsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDO0VBQzlDLEtBQUssQ0FBQyxLQUFLcmxELHFCQUFtQixHQUFHLE9BQU8sR0FBRyxDQUFDLGFBQWEsQ0FBQztFQUMxRCxLQUFLLENBQUMsS0FBS3VsRCx3QkFBc0IsR0FBRyxPQUFPLEdBQUcsQ0FBQyxlQUFlLENBQUM7O0VBRS9ELEtBQUssQ0FBQyxLQUFLOWhELGVBQWEsR0FBRyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUM7RUFDOUMsS0FBSyxDQUFDLEtBQUttOEMsNEJBQTBCLEdBQUcsT0FBTyxHQUFHLENBQUMsc0JBQXNCLENBQUM7RUFDMUUsS0FBSyxDQUFDLEtBQUtDLDJCQUF5QixHQUFHLE9BQU8sR0FBRyxDQUFDLHFCQUFxQixDQUFDOztFQUV4RSxLQUFLLENBQUMsS0FBSzUvQyxjQUFZLEdBQUcsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDO0VBQzVDLEtBQUssQ0FBQyxLQUFLMGxELDJCQUF5QixHQUFHLE9BQU8sR0FBRyxDQUFDLHFCQUFxQixDQUFDO0VBQ3hFLEtBQUssQ0FBQyxLQUFLemxELDBCQUF3QixHQUFHLE9BQU8sR0FBRyxDQUFDLG9CQUFvQixDQUFDOztFQUV0RSxLQUFLLENBQUMsS0FBS0Usa0JBQWdCLEdBQUcsT0FBTyxHQUFHLENBQUMsYUFBYSxDQUFDO0VBQ3ZELEtBQUssQ0FBQyxLQUFLMGxELHVCQUFxQixHQUFHLE9BQU8sR0FBRyxDQUFDLHNCQUFzQixDQUFDO0VBQ3JFLEtBQUssQ0FBQyxLQUFLRSx1QkFBcUIsR0FBRyxPQUFPLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQztFQUNyRSxLQUFLLENBQUMsS0FBS0Usc0JBQW9CLEdBQUcsT0FBTyxHQUFHLENBQUMsb0JBQW9CLENBQUM7O0VBRWxFLEtBQUssQ0FBQyxLQUFLRSxVQUFRLEdBQUcsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDO0VBQ3RDLEtBQUssQ0FBQyxLQUFLQyxXQUFTLEdBQUcsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDO0VBQ3hDLEtBQUssQ0FBQyxLQUFLakQsbUJBQWlCLEdBQUcsT0FBTyxHQUFHLENBQUMsY0FBYyxDQUFDO0VBQ3pELEtBQUssQ0FBQyxLQUFLa0QsU0FBTyxHQUFHLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQztFQUNwQyxLQUFLLENBQUMsS0FBS2pELGlCQUFlLEdBQUcsT0FBTyxHQUFHLENBQUMsWUFBWSxDQUFDO0VBQ3JELEtBQUssQ0FBQyxLQUFLakIsV0FBUyxHQUFHLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQzs7RUFFeEMsS0FBSyxDQUFDLEtBQUtDLGVBQWEsR0FBRzs7R0FFMUIsU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQzs7R0FFdkQsS0FBSyxTQUFTLEtBQUssSUFBSSxHQUFHLE9BQU8sU0FBUyxDQUFDLGNBQWMsQ0FBQzs7R0FFMUQ7O0VBRUQsS0FBSyxDQUFDLEtBQUttRSxhQUFXLEdBQUcsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDO0VBQzFDLEtBQUssQ0FBQyxLQUFLM0UsV0FBUyxHQUFHLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQztFQUN0QyxLQUFLLENBQUMsS0FBSzFoRCxZQUFVLEdBQUcsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDO0VBQ3hDLEtBQUssQ0FBQyxLQUFLd21ELGlCQUFlLEdBQUcsT0FBTyxHQUFHLENBQUMsU0FBUyxDQUFDO0VBQ2xELEtBQUssQ0FBQyxLQUFLRSxzQkFBb0IsR0FBRyxPQUFPLEdBQUcsQ0FBQyxlQUFlLENBQUM7RUFDN0QsS0FBSyxDQUFDLEtBQUsxRCxhQUFXLEdBQUcsT0FBTyxHQUFHLENBQUMsZUFBZSxDQUFDO0VBQ3BELEtBQUssQ0FBQyxLQUFLRyxvQkFBa0IsR0FBRyxPQUFPLEdBQUcsQ0FBQyxhQUFhLENBQUM7O0VBRXpELEtBQUssQ0FBQyxLQUFLeHlCLGFBQVcsR0FBRyxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUM7RUFDN0MsS0FBSyxDQUFDLEtBQUtpMkIsa0JBQWdCLEdBQUcsT0FBTyxHQUFHLENBQUMsYUFBYSxDQUFDO0VBQ3ZELEtBQUssQ0FBQyxLQUFLRSx5QkFBdUIsR0FBRyxPQUFPLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQzs7RUFFdEUsS0FBSyxDQUFDLEtBQUtFLFlBQVUsR0FBRyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUM7RUFDeEMsS0FBSyxDQUFDLEtBQUtDLFdBQVMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUM7RUFDdEMsS0FBSyxDQUFDLEtBQUtDLGdCQUFjLEdBQUcsT0FBTyxHQUFHLENBQUMsU0FBUyxDQUFDO0VBQ2pELEtBQUssQ0FBQyxLQUFLQyx3QkFBc0IsR0FBRyxPQUFPLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQztFQUNuRSxLQUFLLENBQUMsS0FBSzUyQixnQkFBYyxHQUFHLE9BQU8sR0FBRyxDQUFDLFNBQVMsQ0FBQztFQUNqRCxLQUFLLENBQUMsS0FBS0Usd0JBQXNCLEdBQUcsT0FBTyxHQUFHLENBQUMsbUJBQW1CLENBQUM7RUFDbkUsS0FBSyxDQUFDLEtBQUsyMkIsZ0JBQWMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUM7RUFDakQsS0FBSyxDQUFDLEtBQUtFLHdCQUFzQixHQUFHLE9BQU8sR0FBRyxDQUFDLG1CQUFtQixDQUFDOztFQUVuRSxLQUFLLENBQUMsS0FBS0UsZ0JBQWMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUM7RUFDakQsS0FBSyxDQUFDLEtBQUtFLHdCQUFzQixHQUFHLE9BQU8sR0FBRyxDQUFDLG1CQUFtQixDQUFDO0VBQ25FLEtBQUssQ0FBQyxLQUFLRSx3QkFBc0IsR0FBRyxPQUFPLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQzs7RUFFbEUsS0FBSyxDQUFDLEtBQUtFLHNCQUFvQixJQUFJLENBQUMsS0FBS0MsdUJBQXFCO0dBQzdELENBQUMsS0FBS0MsdUJBQXFCLElBQUksQ0FBQyxLQUFLQyx1QkFBcUIsR0FBRzs7R0FFN0QsU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsK0JBQStCLEVBQUUsQ0FBQzs7R0FFOUQsS0FBSyxTQUFTLEtBQUssSUFBSSxHQUFHOztJQUV6QixLQUFLLENBQUMsS0FBS0gsc0JBQW9CLEdBQUcsT0FBTyxTQUFTLENBQUMsNEJBQTRCLENBQUM7SUFDaEYsS0FBSyxDQUFDLEtBQUtDLHVCQUFxQixHQUFHLE9BQU8sU0FBUyxDQUFDLDZCQUE2QixDQUFDO0lBQ2xGLEtBQUssQ0FBQyxLQUFLQyx1QkFBcUIsR0FBRyxPQUFPLFNBQVMsQ0FBQyw2QkFBNkIsQ0FBQztJQUNsRixLQUFLLENBQUMsS0FBS0MsdUJBQXFCLEdBQUcsT0FBTyxTQUFTLENBQUMsNkJBQTZCLENBQUM7O0lBRWxGOztHQUVEOztFQUVELEtBQUssQ0FBQyxLQUFLSyx5QkFBdUIsSUFBSSxDQUFDLEtBQUtDLHlCQUF1QjtHQUNsRSxDQUFDLEtBQUtDLDBCQUF3QixJQUFJLENBQUMsS0FBS0MsMEJBQXdCLEdBQUc7O0dBRW5FLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLGdDQUFnQyxFQUFFLENBQUM7O0dBRS9ELEtBQUssU0FBUyxLQUFLLElBQUksR0FBRzs7SUFFekIsS0FBSyxDQUFDLEtBQUtILHlCQUF1QixHQUFHLE9BQU8sU0FBUyxDQUFDLCtCQUErQixDQUFDO0lBQ3RGLEtBQUssQ0FBQyxLQUFLQyx5QkFBdUIsR0FBRyxPQUFPLFNBQVMsQ0FBQywrQkFBK0IsQ0FBQztJQUN0RixLQUFLLENBQUMsS0FBS0MsMEJBQXdCLEdBQUcsT0FBTyxTQUFTLENBQUMsZ0NBQWdDLENBQUM7SUFDeEYsS0FBSyxDQUFDLEtBQUtDLDBCQUF3QixHQUFHLE9BQU8sU0FBUyxDQUFDLGdDQUFnQyxDQUFDOztJQUV4Rjs7R0FFRDs7RUFFRCxLQUFLLENBQUMsS0FBS0ssaUJBQWUsR0FBRzs7R0FFNUIsU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsK0JBQStCLEVBQUUsQ0FBQzs7R0FFOUQsS0FBSyxTQUFTLEtBQUssSUFBSSxHQUFHLE9BQU8sU0FBUyxDQUFDLHlCQUF5QixDQUFDOztHQUVyRTs7RUFFRCxLQUFLLENBQUMsS0FBS2dCLGFBQVcsSUFBSSxDQUFDLEtBQUtDLGFBQVcsR0FBRzs7R0FFN0MsU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQzs7R0FFakQsS0FBSyxTQUFTLEtBQUssSUFBSSxHQUFHOztJQUV6QixLQUFLLENBQUMsS0FBS0QsYUFBVyxHQUFHLE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQztJQUNsRCxLQUFLLENBQUMsS0FBS0MsYUFBVyxHQUFHLE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQzs7SUFFbEQ7O0dBRUQ7O0VBRUQsS0FBSyxDQUFDLEtBQUsxRyxvQkFBa0IsR0FBRzs7R0FFL0IsU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUscUJBQXFCLEVBQUUsQ0FBQzs7R0FFcEQsS0FBSyxTQUFTLEtBQUssSUFBSSxHQUFHLE9BQU8sU0FBUyxDQUFDLHVCQUF1QixDQUFDOztHQUVuRTs7RUFFRCxPQUFPLENBQUMsQ0FBQzs7RUFFVDs7Q0FFRDs7Ozs7OztBQU9ELFNBQVN3WCxTQUFPLEdBQUcsS0FBSyxFQUFFLE9BQU8sR0FBRzs7Q0FFbkMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7O0NBRWYsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJaG9ELE9BQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztDQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsT0FBTyxLQUFLLFNBQVMsS0FBSyxPQUFPLEdBQUcsT0FBTyxDQUFDOztDQUU3RDs7QUFFRGdvRCxTQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7O0FBRW5DQSxTQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxZQUFZOztDQUVyQyxPQUFPLElBQUlBLFNBQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7Q0FFeEQsQ0FBQzs7QUFFRkEsU0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsV0FBVyxJQUFJLEdBQUc7O0NBRTVDLE9BQU87RUFDTixJQUFJLEVBQUUsU0FBUztFQUNmLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtFQUMxQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87RUFDckIsQ0FBQzs7Q0FFRixDQUFDOzs7Ozs7O0FBT0YsU0FBU0MsS0FBRyxHQUFHLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHOztDQUVqQyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQzs7Q0FFZixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUlqb0QsT0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUVoQyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsSUFBSSxLQUFLLFNBQVMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0NBQzlDLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEtBQUssU0FBUyxLQUFLLEdBQUcsR0FBRyxJQUFJLENBQUM7O0NBRTlDOztBQUVEaW9ELEtBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQzs7QUFFM0JBLEtBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFlBQVk7O0NBRWpDLE9BQU8sSUFBSUEsS0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7O0NBRTNELENBQUM7O0FBRUZBLEtBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFdBQVcsSUFBSSxHQUFHOztDQUV4QyxPQUFPO0VBQ04sSUFBSSxFQUFFLEtBQUs7RUFDWCxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7RUFDMUIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO0VBQ2YsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO0VBQ2IsQ0FBQzs7Q0FFRixDQUFDOzs7Ozs7QUFNRixTQUFTQyxPQUFLLElBQUk7O0NBRWpCajlDLFVBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXRCLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDOztDQUVwQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztDQUN2QixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztDQUNoQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDOztDQUU3QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQzs7Q0FFdkI7O0FBRURpOUMsT0FBSyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUVqOUMsVUFBUSxDQUFDLFNBQVMsRUFBRSxFQUFFOztDQUVyRSxXQUFXLEVBQUVpOUMsT0FBSzs7Q0FFbEIsSUFBSSxFQUFFLFdBQVcsTUFBTSxFQUFFLFNBQVMsR0FBRzs7RUFFcENqOUMsVUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUM7O0VBRXhELEtBQUssTUFBTSxDQUFDLFVBQVUsS0FBSyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0VBQzlFLEtBQUssTUFBTSxDQUFDLEdBQUcsS0FBSyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO0VBQ3pELEtBQUssTUFBTSxDQUFDLGdCQUFnQixLQUFLLElBQUksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDOztFQUVoRyxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7RUFDcEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQzs7RUFFaEQsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsTUFBTSxFQUFFLFdBQVcsSUFBSSxHQUFHOztFQUV6QixJQUFJLElBQUksR0FBR0EsVUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7RUFFeEQsS0FBSyxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztFQUN4RixLQUFLLElBQUksQ0FBQyxHQUFHLEtBQUssSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7O0VBRTdELE9BQU8sSUFBSSxDQUFDOztFQUVaOztDQUVELEVBQUUsQ0FBQzs7Ozs7OztBQU9KLFNBQVMsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEdBQUc7O0NBRTlEQSxVQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUV0QixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQzs7Q0FFckIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJdmlCLFNBQU8sRUFBRSxDQUFDO0NBQ3BDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxTQUFTLENBQUM7O0NBRXRDLEtBQUssT0FBTyxLQUFLLFNBQVMsR0FBRzs7RUFFNUIsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7O0VBRXJEOztDQUVEOztBQUVELFNBQVMsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFdWlCLFVBQVEsQ0FBQyxTQUFTLEVBQUUsRUFBRTs7Q0FFekUsV0FBVyxFQUFFLFNBQVM7O0NBRXRCLFdBQVcsRUFBRSxJQUFJOztDQUVqQixJQUFJLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0VBRXpCQSxVQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUU3QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7RUFDbEQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQzs7RUFFeEQsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0dBRTVELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7R0FFL0M7O0VBRUQsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsR0FBRyxFQUFFLFdBQVcsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEdBQUc7O0VBRW5FLEtBQUssSUFBSSxLQUFLLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7RUFDckMsS0FBSyxRQUFRLEtBQUssU0FBUyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFDM0MsS0FBSyxPQUFPLEtBQUssU0FBUyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7RUFDekMsS0FBSyxLQUFLLEtBQUssU0FBUyxHQUFHLEtBQUssR0FBRyxJQUFJakwsT0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDO0VBQ3pELEtBQUssUUFBUSxLQUFLLFNBQVMsR0FBRyxRQUFRLEdBQUdtZCxnQkFBYyxDQUFDOztFQUV4RCxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQzs7RUFFekQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUU7R0FDckIsT0FBTyxFQUFFLE9BQU87R0FDaEIsSUFBSSxFQUFFLElBQUk7R0FDVixRQUFRLEVBQUUsUUFBUTtHQUNsQixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7R0FDaEIsS0FBSyxFQUFFLENBQUM7R0FDUixRQUFRLEVBQUUsQ0FBQztHQUNYLE9BQU8sRUFBRSxPQUFPO0dBQ2hCLEtBQUssRUFBRSxLQUFLO0dBQ1osUUFBUSxFQUFFLFFBQVE7R0FDbEIsRUFBRSxDQUFDOztFQUVKOzs7Ozs7O0NBT0QsZ0JBQWdCLEVBQUUsWUFBWTs7RUFFN0IsSUFBSSxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO0VBQ25DLElBQUksS0FBSyxDQUFDO0VBQ1YsSUFBSSxJQUFJLEdBQUcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDdkMsSUFBSSxJQUFJLEdBQUcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O0VBRXZDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztHQUUzQixLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7R0FFN0IsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztHQUN4RCxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDOztHQUV4RCxLQUFLLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUM7R0FDaEQsS0FBSyxDQUFDLFFBQVEsSUFBSSxFQUFFLEtBQUssQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUM7O0dBRW5FOztFQUVEOztDQUVELEVBQUUsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBZUosU0FBU2dyQyxnQkFBYyxFQUFFLFVBQVUsR0FBRzs7Q0FFckNqcEMsVUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFdEIsSUFBSSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQzs7Q0FFN0IsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJbGYsT0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDO0NBQ25DLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDOztDQUVoQixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQzs7Q0FFbEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUM7Q0FDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7O0NBRXBCLElBQUksQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUM7O0NBRTdCOztBQUVEbW9ELGdCQUFjLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUVqcEMsVUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQy9EaXBDLGdCQUFjLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBR0EsZ0JBQWMsQ0FBQztBQUN0REEsZ0JBQWMsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDOztBQUVqREEsZ0JBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFdBQVcsTUFBTSxHQUFHOztDQUVuRGpwQyxVQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUU3QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7Q0FDaEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDOztDQUV0QixJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7O0NBRWhDLE9BQU8sSUFBSSxDQUFDOztDQUVaLENBQUM7Ozs7Ozs7QUFPRixTQUFTbXBDLFFBQU0sRUFBRSxRQUFRLEdBQUc7O0NBRTNCcDlDLFVBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXRCLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDOztDQUVyQixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsUUFBUSxLQUFLLFNBQVMsS0FBSyxRQUFRLEdBQUcsSUFBSWs5QyxnQkFBYyxFQUFFLENBQUM7O0NBRTdFOztBQUVERSxRQUFNLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRXA5QyxVQUFRLENBQUMsU0FBUyxFQUFFLEVBQUU7O0NBRXRFLFdBQVcsRUFBRW85QyxRQUFNOztDQUVuQixRQUFRLEVBQUUsSUFBSTs7Q0FFZCxPQUFPLElBQUksWUFBWTs7RUFFdEIsSUFBSSxjQUFjLEdBQUcsSUFBSTMvRCxTQUFPLEVBQUUsQ0FBQztFQUNuQyxJQUFJLGFBQWEsR0FBRyxJQUFJQSxTQUFPLEVBQUUsQ0FBQztFQUNsQyxJQUFJLFVBQVUsR0FBRyxJQUFJQSxTQUFPLEVBQUUsQ0FBQzs7RUFFL0IsT0FBTyxTQUFTLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxHQUFHOztHQUVoRCxhQUFhLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0dBQ3hELFNBQVMsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxDQUFDOztHQUVuRSxVQUFVLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0dBQ2xELElBQUksV0FBVyxHQUFHLFVBQVUsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O0dBRWxELEtBQUssYUFBYSxDQUFDLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxHQUFHLFdBQVcsR0FBRyxPQUFPOztHQUU5RSxJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLENBQUM7O0dBRWpFLEtBQUssUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFJLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxHQUFHLEdBQUcsT0FBTzs7R0FFcEUsVUFBVSxDQUFDLElBQUksRUFBRTs7SUFFaEIsUUFBUSxFQUFFLFFBQVE7SUFDbEIsS0FBSyxFQUFFLGNBQWMsQ0FBQyxLQUFLLEVBQUU7SUFDN0IsSUFBSSxFQUFFLElBQUk7SUFDVixNQUFNLEVBQUUsSUFBSTs7SUFFWixFQUFFLENBQUM7O0dBRUosQ0FBQzs7RUFFRixFQUFFLEVBQUU7O0NBRUwsS0FBSyxFQUFFLFlBQVk7O0VBRWxCLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRTFEOztDQUVELEVBQUUsQ0FBQzs7Ozs7Ozs7QUFRSixTQUFTaWdFLEtBQUcsR0FBRzs7Q0FFZDE5QyxVQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUV0QixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQzs7Q0FFbEIsTUFBTSxDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRTtFQUM5QixNQUFNLEVBQUU7R0FDUCxVQUFVLEVBQUUsSUFBSTtHQUNoQixLQUFLLEVBQUUsRUFBRTtHQUNUO0VBQ0QsRUFBRSxDQUFDOztDQUVKOztBQUVEMDlDLEtBQUcsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFMTlDLFVBQVEsQ0FBQyxTQUFTLEVBQUUsRUFBRTs7Q0FFbkUsV0FBVyxFQUFFMDlDLEtBQUc7O0NBRWhCLElBQUksRUFBRSxXQUFXLE1BQU0sR0FBRzs7RUFFekIxOUMsVUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7O0VBRXBELElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7O0VBRTNCLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0dBRWpELElBQUksS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7R0FFeEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7R0FFdEQ7O0VBRUQsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsUUFBUSxFQUFFLFdBQVcsTUFBTSxFQUFFLFFBQVEsR0FBRzs7RUFFdkMsS0FBSyxRQUFRLEtBQUssU0FBUyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUM7O0VBRTNDLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDOztFQUVoQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDOztFQUV6QixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7R0FFMUMsS0FBSyxRQUFRLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsR0FBRzs7SUFFdEMsTUFBTTs7SUFFTjs7R0FFRDs7RUFFRCxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDOztFQUU5RCxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUVuQjs7Q0FFRCxvQkFBb0IsRUFBRSxXQUFXLFFBQVEsR0FBRzs7RUFFM0MsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7RUFFekIsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7R0FFakQsS0FBSyxRQUFRLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsR0FBRzs7SUFFdEMsTUFBTTs7SUFFTjs7R0FFRDs7RUFFRCxPQUFPLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDOztFQUU5Qjs7Q0FFRCxPQUFPLElBQUksWUFBWTs7RUFFdEIsSUFBSSxjQUFjLEdBQUcsSUFBSXZpQixTQUFPLEVBQUUsQ0FBQzs7RUFFbkMsT0FBTyxTQUFTLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxHQUFHOztHQUVoRCxjQUFjLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDOztHQUV6RCxJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLENBQUM7O0dBRWpFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxRQUFRLEVBQUUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDOztHQUV2RSxDQUFDOztFQUVGLEVBQUUsRUFBRTs7Q0FFTCxNQUFNLEVBQUUsWUFBWTs7RUFFbkIsSUFBSSxFQUFFLEdBQUcsSUFBSUEsU0FBTyxFQUFFLENBQUM7RUFDdkIsSUFBSSxFQUFFLEdBQUcsSUFBSUEsU0FBTyxFQUFFLENBQUM7O0VBRXZCLE9BQU8sU0FBUyxNQUFNLEVBQUUsTUFBTSxHQUFHOztHQUVoQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDOztHQUV6QixLQUFLLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHOztJQUV4QixFQUFFLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQy9DLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7O0lBRTdDLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUM7O0lBRW5DLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQzs7SUFFbEMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7S0FFakQsS0FBSyxRQUFRLElBQUksTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsR0FBRzs7TUFFdkMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztNQUN2QyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7O01BRWxDLE1BQU07O01BRU4sTUFBTTs7TUFFTjs7S0FFRDs7SUFFRCxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0tBRXJCLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzs7S0FFbkM7O0lBRUQ7O0dBRUQsQ0FBQzs7RUFFRixFQUFFOztDQUVILE1BQU0sRUFBRSxXQUFXLElBQUksR0FBRzs7RUFFekIsSUFBSSxJQUFJLEdBQUd1aUIsVUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7RUFFeEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDOztFQUV4QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDOztFQUV6QixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztHQUVqRCxJQUFJLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0dBRXhCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRTtJQUN4QixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJO0lBQ3pCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtJQUN4QixFQUFFLENBQUM7O0dBRUo7O0VBRUQsT0FBTyxJQUFJLENBQUM7O0VBRVo7O0NBRUQsRUFBRSxDQUFDOzs7Ozs7Ozs7QUFTSixTQUFTZytDLFVBQVEsRUFBRSxLQUFLLEVBQUUsWUFBWSxHQUFHOzs7O0NBSXhDLEtBQUssR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDOztDQUVwQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQzs7OztDQUkvRCxLQUFLLFlBQVksS0FBSyxTQUFTLEdBQUc7O0VBRWpDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDOztFQUV6QixNQUFNOztFQUVOLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssWUFBWSxDQUFDLE1BQU0sR0FBRzs7R0FFaEQsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUU1QyxNQUFNOztHQUVOLE9BQU8sQ0FBQyxJQUFJLEVBQUUsa0RBQWtELEVBQUUsQ0FBQzs7R0FFbkUsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7O0dBRXZCLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztJQUV2RCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJM3VFLFNBQU8sRUFBRSxFQUFFLENBQUM7O0lBRXhDOztHQUVEOztFQUVEOztDQUVEOztBQUVELE1BQU0sQ0FBQyxNQUFNLEVBQUUydUUsVUFBUSxDQUFDLFNBQVMsRUFBRTs7Q0FFbEMsaUJBQWlCLEVBQUUsWUFBWTs7RUFFOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7O0VBRXZCLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztHQUV2RCxJQUFJLE9BQU8sR0FBRyxJQUFJM3VFLFNBQU8sRUFBRSxDQUFDOztHQUU1QixLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUc7O0lBRXRCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7SUFFbEQ7O0dBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7O0dBRWxDOztFQUVEOztDQUVELElBQUksRUFBRSxZQUFZOztFQUVqQixJQUFJLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOzs7O0VBSWhCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7R0FFbkQsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0dBRXZCLEtBQUssSUFBSSxHQUFHOztJQUVYLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7SUFFdEQ7O0dBRUQ7Ozs7RUFJRCxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0dBRW5ELElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUV2QixLQUFLLElBQUksR0FBRzs7SUFFWCxLQUFLLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUc7O0tBRXhDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7S0FDbEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDOztLQUV6QyxNQUFNOztLQUVOLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7S0FFckM7O0lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7SUFFcEU7O0dBRUQ7O0VBRUQ7O0NBRUQsTUFBTSxFQUFFLEVBQUUsWUFBWTs7RUFFckIsSUFBSSxZQUFZLEdBQUcsSUFBSUEsU0FBTyxFQUFFLENBQUM7RUFDakMsSUFBSSxjQUFjLEdBQUcsSUFBSUEsU0FBTyxFQUFFLENBQUM7O0VBRW5DLE9BQU8sU0FBUyxNQUFNLEdBQUc7O0dBRXhCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7R0FDdkIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztHQUNyQyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO0dBQ3JDLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7Ozs7R0FJbkMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7OztJQUlsRCxJQUFJLE1BQU0sR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUM7O0lBRWxFLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDM0QsWUFBWSxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDOztJQUU3Qzs7R0FFRCxLQUFLLFdBQVcsS0FBSyxTQUFTLEdBQUc7O0lBRWhDLFdBQVcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDOztJQUUvQjs7R0FFRCxDQUFDOztFQUVGLElBQUk7O0NBRUwsS0FBSyxFQUFFLFlBQVk7O0VBRWxCLE9BQU8sSUFBSTJ1RSxVQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7O0VBRXJEOztDQUVELEVBQUUsQ0FBQzs7Ozs7Ozs7QUFRSixTQUFTTSxNQUFJLEdBQUc7O0NBRWZ0K0MsVUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFdEIsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUM7O0NBRW5COztBQUVEcytDLE1BQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFdCtDLFVBQVEsQ0FBQyxTQUFTLEVBQUUsRUFBRTs7Q0FFcEUsV0FBVyxFQUFFcytDLE1BQUk7O0NBRWpCLE1BQU0sRUFBRSxJQUFJOztDQUVaLEVBQUUsQ0FBQzs7Ozs7Ozs7QUFRSixTQUFTTyxhQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsR0FBRzs7Q0FFMUMxakMsTUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUV0QyxJQUFJLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQzs7Q0FFMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7Q0FDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJOXJDLFNBQU8sRUFBRSxDQUFDO0NBQ2hDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJQSxTQUFPLEVBQUUsQ0FBQzs7Q0FFdkMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQzdCLElBQUksUUFBUSxHQUFHLElBQUkydUUsVUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUVyQyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7O0NBRXhDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDOztDQUU1Qjs7QUFFRGEsYUFBVyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUxakMsTUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFOztDQUV2RSxXQUFXLEVBQUUwakMsYUFBVzs7Q0FFeEIsYUFBYSxFQUFFLElBQUk7O0NBRW5CLFNBQVMsRUFBRSxZQUFZOztFQUV0QixJQUFJLEtBQUssR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQztFQUM1QixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7O0VBRVYsS0FBSyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxLQUFLLFNBQVMsR0FBRzs7OztHQUl6RCxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztJQUU1RCxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7Ozs7SUFJakMsSUFBSSxHQUFHLElBQUlQLE1BQUksRUFBRSxDQUFDO0lBQ2xCLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7Ozs7SUFJbkIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNyQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEMsS0FBSyxLQUFLLENBQUMsR0FBRyxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7O0lBRWpFOzs7O0dBSUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7SUFFNUQsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztJQUVqQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUMsUUFBUSxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRSxNQUFNLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssU0FBUyxFQUFFLEdBQUc7Ozs7S0FJdkcsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0tBRXhDLE1BQU07Ozs7S0FJTixJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztLQUV2Qjs7SUFFRDs7R0FFRDs7Ozs7RUFLRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRS9CLE9BQU8sS0FBSyxDQUFDOztFQUViOztDQUVELElBQUksRUFBRSxXQUFXLFFBQVEsRUFBRSxVQUFVLEdBQUc7O0VBRXZDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDOztFQUV6QixLQUFLLFVBQVUsS0FBSyxTQUFTLEdBQUc7O0dBRS9CLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7R0FFL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDOztHQUVsQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQzs7R0FFOUI7O0VBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUM7RUFDbkMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsQ0FBQzs7RUFFaEQ7O0NBRUQsSUFBSSxFQUFFLFlBQVk7O0VBRWpCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7O0VBRXJCOztDQUVELG9CQUFvQixFQUFFLFlBQVk7O0VBRWpDLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQzs7RUFFYixLQUFLLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEdBQUc7O0dBRWhELE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHOztJQUV6RCxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7SUFFeEMsS0FBSyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUM7O0lBRW5DLEtBQUssS0FBSyxLQUFLLFFBQVEsR0FBRzs7S0FFekIsRUFBRSxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7S0FFM0IsTUFBTTs7S0FFTixFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztLQUVyQjs7SUFFRDs7R0FFRCxNQUFNLEtBQUssSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixHQUFHOztHQUU3RCxJQUFJLEdBQUcsR0FBRyxJQUFJcjZELFNBQU8sRUFBRSxDQUFDOztHQUV4QixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7O0dBRXJELE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsR0FBRzs7SUFFekMsR0FBRyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzdCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM3QixHQUFHLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDN0IsR0FBRyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztJQUU3QixLQUFLLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQzs7SUFFcEMsS0FBSyxLQUFLLEtBQUssUUFBUSxHQUFHOztLQUV6QixHQUFHLENBQUMsY0FBYyxFQUFFLEtBQUssRUFBRSxDQUFDOztLQUU1QixNQUFNOztLQUVOLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0tBRXRCOztJQUVELFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7SUFFcEQ7O0dBRUQ7O0VBRUQ7O0NBRUQsaUJBQWlCLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0VBRXJDazNCLE1BQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7RUFFckQsS0FBSyxJQUFJLENBQUMsUUFBUSxLQUFLLFVBQVUsR0FBRzs7R0FFbkMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7O0dBRXRELE1BQU0sS0FBSyxJQUFJLENBQUMsUUFBUSxLQUFLLFVBQVUsR0FBRzs7R0FFMUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7O0dBRXJELE1BQU07O0dBRU4sT0FBTyxDQUFDLElBQUksRUFBRSw0Q0FBNEMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7O0dBRTdFOztFQUVEOztDQUVELEtBQUssRUFBRSxZQUFZOztFQUVsQixPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRXpFOztDQUVELEVBQUUsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQWdCSixTQUFTa1UsbUJBQWlCLEVBQUUsVUFBVSxHQUFHOztDQUV4Q3BiLFVBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXRCLElBQUksQ0FBQyxJQUFJLEdBQUcsbUJBQW1CLENBQUM7O0NBRWhDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSWxmLE9BQUssRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7Q0FDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7Q0FDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7O0NBRXhCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDOztDQUVwQixJQUFJLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUU3Qjs7QUFFRHM2QixtQkFBaUIsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRXBiLFVBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUNsRW9iLG1CQUFpQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUdBLG1CQUFpQixDQUFDOztBQUU1REEsbUJBQWlCLENBQUMsU0FBUyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQzs7QUFFdkRBLG1CQUFpQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsV0FBVyxNQUFNLEdBQUc7O0NBRXREcGIsVUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFN0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDOztDQUVoQyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7Q0FDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0NBQzlCLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQzs7Q0FFaEMsT0FBTyxJQUFJLENBQUM7O0NBRVosQ0FBQzs7Ozs7O0FBTUYsU0FBU3FyQyxNQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEdBQUc7O0NBRXpDLEtBQUssSUFBSSxLQUFLLENBQUMsR0FBRzs7RUFFakIsT0FBTyxDQUFDLElBQUksRUFBRSxpR0FBaUcsRUFBRSxDQUFDO0VBQ2xILE9BQU8sSUFBSVcsY0FBWSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7RUFFOUM7O0NBRURqZ0QsVUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFdEIsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUM7O0NBRW5CLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxLQUFLLFNBQVMsR0FBRyxRQUFRLEdBQUcsSUFBSXNPLGdCQUFjLEVBQUUsQ0FBQztDQUN6RSxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsS0FBSyxTQUFTLEdBQUcsUUFBUSxHQUFHLElBQUkrZ0IsbUJBQWlCLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFFBQVEsRUFBRSxFQUFFLENBQUM7O0NBRWpIOztBQUVEaXdCLE1BQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFdC9DLFVBQVEsQ0FBQyxTQUFTLEVBQUUsRUFBRTs7Q0FFcEUsV0FBVyxFQUFFcy9DLE1BQUk7O0NBRWpCLE1BQU0sRUFBRSxJQUFJOztDQUVaLE9BQU8sSUFBSSxZQUFZOztFQUV0QixJQUFJLGFBQWEsR0FBRyxJQUFJandFLFNBQU8sRUFBRSxDQUFDO0VBQ2xDLElBQUksR0FBRyxHQUFHLElBQUkrbUMsS0FBRyxFQUFFLENBQUM7RUFDcEIsSUFBSSxNQUFNLEdBQUcsSUFBSXpzQixRQUFNLEVBQUUsQ0FBQzs7RUFFMUIsT0FBTyxTQUFTLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxHQUFHOztHQUVoRCxJQUFJLFNBQVMsR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDO0dBQ3hDLElBQUksV0FBVyxHQUFHLFNBQVMsR0FBRyxTQUFTLENBQUM7O0dBRXhDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7R0FDN0IsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQzs7OztHQUluQyxLQUFLLFFBQVEsQ0FBQyxjQUFjLEtBQUssSUFBSSxHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDOztHQUV6RSxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztHQUN2QyxNQUFNLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxDQUFDOztHQUVuQyxLQUFLLFNBQVMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEtBQUssS0FBSyxHQUFHLE9BQU87Ozs7R0FJakUsYUFBYSxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsQ0FBQztHQUN4QyxHQUFHLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLENBQUM7O0dBRXhELElBQUksTUFBTSxHQUFHLElBQUlsTSxTQUFPLEVBQUUsQ0FBQztHQUMzQixJQUFJLElBQUksR0FBRyxJQUFJQSxTQUFPLEVBQUUsQ0FBQztHQUN6QixJQUFJLFlBQVksR0FBRyxJQUFJQSxTQUFPLEVBQUUsQ0FBQztHQUNqQyxJQUFJLFFBQVEsR0FBRyxJQUFJQSxTQUFPLEVBQUUsQ0FBQztHQUM3QixJQUFJLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7O0dBRWpELEtBQUssUUFBUSxDQUFDLGdCQUFnQixHQUFHOztJQUVoQyxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQzNCLElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7SUFDckMsSUFBSSxTQUFTLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7O0lBRTFDLEtBQUssS0FBSyxLQUFLLElBQUksR0FBRzs7S0FFckIsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQzs7S0FFMUIsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksR0FBRzs7TUFFM0QsSUFBSSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO01BQ3JCLElBQUksQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O01BRXpCLE1BQU0sQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztNQUNyQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O01BRW5DLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsQ0FBQzs7TUFFN0UsS0FBSyxNQUFNLEdBQUcsV0FBVyxHQUFHLFNBQVM7O01BRXJDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDOztNQUUxQyxJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUM7O01BRTNELEtBQUssUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFJLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxHQUFHLEdBQUcsU0FBUzs7TUFFdEUsVUFBVSxDQUFDLElBQUksRUFBRTs7T0FFaEIsUUFBUSxFQUFFLFFBQVE7OztPQUdsQixLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFO09BQzVELEtBQUssRUFBRSxDQUFDO09BQ1IsSUFBSSxFQUFFLElBQUk7T0FDVixTQUFTLEVBQUUsSUFBSTtPQUNmLE1BQU0sRUFBRSxJQUFJOztPQUVaLEVBQUUsQ0FBQzs7TUFFSjs7S0FFRCxNQUFNOztLQUVOLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxHQUFHOztNQUVqRSxNQUFNLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7TUFDckMsSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7TUFFdkMsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxDQUFDOztNQUU3RSxLQUFLLE1BQU0sR0FBRyxXQUFXLEdBQUcsU0FBUzs7TUFFckMsUUFBUSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7O01BRTFDLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7TUFFM0QsS0FBSyxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksSUFBSSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsR0FBRyxTQUFTOztNQUV0RSxVQUFVLENBQUMsSUFBSSxFQUFFOztPQUVoQixRQUFRLEVBQUUsUUFBUTs7O09BR2xCLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUU7T0FDNUQsS0FBSyxFQUFFLENBQUM7T0FDUixJQUFJLEVBQUUsSUFBSTtPQUNWLFNBQVMsRUFBRSxJQUFJO09BQ2YsTUFBTSxFQUFFLElBQUk7O09BRVosRUFBRSxDQUFDOztNQUVKOztLQUVEOztJQUVELE1BQU0sS0FBSyxRQUFRLENBQUMsVUFBVSxHQUFHOztJQUVqQyxJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO0lBQ2pDLElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7O0lBRWpDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLEdBQUc7O0tBRWhELElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLENBQUM7O0tBRWpHLEtBQUssTUFBTSxHQUFHLFdBQVcsR0FBRyxTQUFTOztLQUVyQyxRQUFRLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7S0FFMUMsSUFBSSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDOztLQUUzRCxLQUFLLFFBQVEsR0FBRyxTQUFTLENBQUMsSUFBSSxJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUMsR0FBRyxHQUFHLFNBQVM7O0tBRXRFLFVBQVUsQ0FBQyxJQUFJLEVBQUU7O01BRWhCLFFBQVEsRUFBRSxRQUFROzs7TUFHbEIsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRTtNQUM1RCxLQUFLLEVBQUUsQ0FBQztNQUNSLElBQUksRUFBRSxJQUFJO01BQ1YsU0FBUyxFQUFFLElBQUk7TUFDZixNQUFNLEVBQUUsSUFBSTs7TUFFWixFQUFFLENBQUM7O0tBRUo7O0lBRUQ7O0dBRUQsQ0FBQzs7RUFFRixFQUFFLEVBQUU7O0NBRUwsS0FBSyxFQUFFLFlBQVk7O0VBRWxCLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7RUFFekU7O0NBRUQsRUFBRSxDQUFDOzs7Ozs7QUFNSixTQUFTd2lFLGNBQVksRUFBRSxRQUFRLEVBQUUsUUFBUSxHQUFHOztDQUUzQ1gsTUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUV0QyxJQUFJLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQzs7Q0FFM0I7O0FBRURXLGNBQVksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFWCxNQUFJLENBQUMsU0FBUyxFQUFFLEVBQUU7O0NBRXhFLFdBQVcsRUFBRVcsY0FBWTs7Q0FFekIsY0FBYyxFQUFFLElBQUk7O0NBRXBCLEVBQUUsQ0FBQzs7Ozs7O0FBTUosU0FBU0MsVUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUc7O0NBRXZDWixNQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRXRDLElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDOztDQUV2Qjs7QUFFRFksVUFBUSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUVaLE1BQUksQ0FBQyxTQUFTLEVBQUUsRUFBRTs7Q0FFcEUsV0FBVyxFQUFFWSxVQUFROztDQUVyQixVQUFVLEVBQUUsSUFBSTs7Q0FFaEIsRUFBRSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JKLFNBQVMzd0IsZ0JBQWMsRUFBRSxVQUFVLEdBQUc7O0NBRXJDdGIsVUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFdEIsSUFBSSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQzs7Q0FFN0IsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJbGYsT0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUVuQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQzs7Q0FFaEIsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7Q0FDZCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQzs7Q0FFNUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7O0NBRXBCLElBQUksQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUM7O0NBRTdCOztBQUVEdzZCLGdCQUFjLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUV0YixVQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDL0RzYixnQkFBYyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUdBLGdCQUFjLENBQUM7O0FBRXREQSxnQkFBYyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7O0FBRWpEQSxnQkFBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsV0FBVyxNQUFNLEdBQUc7O0NBRW5EdGIsVUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFN0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDOztDQUVoQyxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7O0NBRXRCLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztDQUN4QixJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUM7O0NBRTlDLE9BQU8sSUFBSSxDQUFDOztDQUVaLENBQUM7Ozs7OztBQU1GLFNBQVNrc0MsUUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUc7O0NBRXJDbmdELFVBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXRCLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDOztDQUVyQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsS0FBSyxTQUFTLEdBQUcsUUFBUSxHQUFHLElBQUlzTyxnQkFBYyxFQUFFLENBQUM7Q0FDekUsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLEtBQUssU0FBUyxHQUFHLFFBQVEsR0FBRyxJQUFJaWhCLGdCQUFjLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFFBQVEsRUFBRSxFQUFFLENBQUM7O0NBRTlHOztBQUVENHdCLFFBQU0sQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFbmdELFVBQVEsQ0FBQyxTQUFTLEVBQUUsRUFBRTs7Q0FFdEUsV0FBVyxFQUFFbWdELFFBQU07O0NBRW5CLFFBQVEsRUFBRSxJQUFJOztDQUVkLE9BQU8sSUFBSSxZQUFZOztFQUV0QixJQUFJLGFBQWEsR0FBRyxJQUFJOXdFLFNBQU8sRUFBRSxDQUFDO0VBQ2xDLElBQUksR0FBRyxHQUFHLElBQUkrbUMsS0FBRyxFQUFFLENBQUM7RUFDcEIsSUFBSSxNQUFNLEdBQUcsSUFBSXpzQixRQUFNLEVBQUUsQ0FBQzs7RUFFMUIsT0FBTyxTQUFTLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxHQUFHOztHQUVoRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7R0FDbEIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztHQUM3QixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO0dBQ25DLElBQUksU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQzs7OztHQUlsRCxLQUFLLFFBQVEsQ0FBQyxjQUFjLEtBQUssSUFBSSxHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDOztHQUV6RSxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztHQUN2QyxNQUFNLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxDQUFDO0dBQ25DLE1BQU0sQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDOztHQUUzQixLQUFLLFNBQVMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEtBQUssS0FBSyxHQUFHLE9BQU87Ozs7R0FJakUsYUFBYSxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsQ0FBQztHQUN4QyxHQUFHLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLENBQUM7O0dBRXhELElBQUksY0FBYyxHQUFHLFNBQVMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO0dBQ3hGLElBQUksZ0JBQWdCLEdBQUcsY0FBYyxHQUFHLGNBQWMsQ0FBQztHQUN2RCxJQUFJLFFBQVEsR0FBRyxJQUFJbE0sU0FBTyxFQUFFLENBQUM7O0dBRTdCLFNBQVMsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLEdBQUc7O0lBRWxDLElBQUksa0JBQWtCLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixFQUFFLEtBQUssRUFBRSxDQUFDOztJQUV4RCxLQUFLLGtCQUFrQixHQUFHLGdCQUFnQixHQUFHOztLQUU1QyxJQUFJLGNBQWMsR0FBRyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLENBQUM7S0FDdEQsY0FBYyxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQzs7S0FFM0MsSUFBSSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLGNBQWMsRUFBRSxDQUFDOztLQUVqRSxLQUFLLFFBQVEsR0FBRyxTQUFTLENBQUMsSUFBSSxJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUMsR0FBRyxHQUFHLE9BQU87O0tBRXBFLFVBQVUsQ0FBQyxJQUFJLEVBQUU7O01BRWhCLFFBQVEsRUFBRSxRQUFRO01BQ2xCLGFBQWEsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFO01BQzlDLEtBQUssRUFBRSxjQUFjLENBQUMsS0FBSyxFQUFFO01BQzdCLEtBQUssRUFBRSxLQUFLO01BQ1osSUFBSSxFQUFFLElBQUk7TUFDVixNQUFNLEVBQUUsTUFBTTs7TUFFZCxFQUFFLENBQUM7O0tBRUo7O0lBRUQ7O0dBRUQsS0FBSyxRQUFRLENBQUMsZ0JBQWdCLEdBQUc7O0lBRWhDLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7SUFDM0IsSUFBSSxVQUFVLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQztJQUNyQyxJQUFJLFNBQVMsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQzs7SUFFMUMsS0FBSyxLQUFLLEtBQUssSUFBSSxHQUFHOztLQUVyQixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDOztLQUUxQixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztNQUVwRCxJQUFJLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7O01BRXJCLFFBQVEsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7TUFFdkMsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7TUFFekI7O0tBRUQsTUFBTTs7S0FFTixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7TUFFeEQsUUFBUSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOztNQUV2QyxTQUFTLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDOztNQUV6Qjs7S0FFRDs7SUFFRCxNQUFNOztJQUVOLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7O0lBRWpDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0tBRW5ELFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0tBRTlCOztJQUVEOztHQUVELENBQUM7O0VBRUYsRUFBRSxFQUFFOztDQUVMLEtBQUssRUFBRSxZQUFZOztFQUVsQixPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRXpFOztDQUVELEVBQUUsQ0FBQzs7Ozs7O0FBTUosU0FBU2tqRSxPQUFLLEdBQUc7O0NBRWhCM2dELFVBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXRCLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDOztDQUVwQjs7QUFFRDJnRCxPQUFLLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRTNnRCxVQUFRLENBQUMsU0FBUyxFQUFFLEVBQUU7O0NBRXJFLFdBQVcsRUFBRTJnRCxPQUFLOztDQUVsQixFQUFFLENBQUM7Ozs7OztBQU1KLFNBQVNHLGNBQVksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsR0FBRzs7Q0FFckduL0QsU0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFbkcsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7O0NBRTdCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQzs7Q0FFakIsU0FBUyxNQUFNLEdBQUc7O0VBRWpCLHFCQUFxQixFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUVoQyxLQUFLLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLGlCQUFpQixHQUFHOztHQUVsRCxLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7R0FFekI7O0VBRUQ7O0NBRUQsTUFBTSxFQUFFLENBQUM7O0NBRVQ7O0FBRURtL0QsY0FBWSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFbi9ELFNBQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUM1RG0vRCxjQUFZLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBR0EsY0FBWSxDQUFDOzs7Ozs7QUFNbEQsU0FBU0csbUJBQWlCLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEdBQUc7O0NBRXJJdC9ELFNBQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUU1RyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDOUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7Ozs7O0NBS3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDOzs7OztDQUtuQixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQzs7Q0FFN0I7O0FBRURzL0QsbUJBQWlCLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUV0L0QsU0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ2pFcy9ELG1CQUFpQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUdBLG1CQUFpQixDQUFDOztBQUU1REEsbUJBQWlCLENBQUMsU0FBUyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQzs7Ozs7O0FBTXZELFNBQVN2cEIsZUFBYSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxHQUFHOztDQUV2Ry8xQyxTQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUVwRyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7Q0FFeEI7O0FBRUQrMUMsZUFBYSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLzFDLFNBQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUM3RCsxQyxlQUFhLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBR0EsZUFBYSxDQUFDOzs7Ozs7O0FBT3BELFNBQVN3cEIsY0FBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sR0FBRzs7Q0FFN0csTUFBTSxHQUFHLE1BQU0sS0FBSyxTQUFTLEdBQUcsTUFBTSxHQUFHaGMsYUFBVyxDQUFDOztDQUVyRCxLQUFLLE1BQU0sS0FBS0EsYUFBVyxJQUFJLE1BQU0sS0FBS0csb0JBQWtCLEdBQUc7O0VBRTlELE1BQU0sSUFBSSxLQUFLLEVBQUUsa0ZBQWtGLEVBQUU7O0VBRXJHOztDQUVELEtBQUssSUFBSSxLQUFLLFNBQVMsSUFBSSxNQUFNLEtBQUtILGFBQVcsR0FBRyxJQUFJLEdBQUdDLG1CQUFpQixDQUFDO0NBQzdFLEtBQUssSUFBSSxLQUFLLFNBQVMsSUFBSSxNQUFNLEtBQUtFLG9CQUFrQixHQUFHLElBQUksR0FBR0Usb0JBQWtCLENBQUM7O0NBRXJGNWpELFNBQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUM7O0NBRWxHLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFOUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLEtBQUssU0FBUyxHQUFHLFNBQVMsR0FBRzZELGVBQWEsQ0FBQztDQUNyRSxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsS0FBSyxTQUFTLEdBQUcsU0FBUyxHQUFHQSxlQUFhLENBQUM7O0NBRXJFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0NBQ25CLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDOztDQUU3Qjs7QUFFRDA3RCxjQUFZLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUV2L0QsU0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQzVEdS9ELGNBQVksQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHQSxjQUFZLENBQUM7QUFDbERBLGNBQVksQ0FBQyxTQUFTLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQzs7Ozs7OztBQU83QyxTQUFTSSxtQkFBaUIsRUFBRSxRQUFRLEdBQUc7O0NBRXRDaHpDLGdCQUFjLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU1QixJQUFJLENBQUMsSUFBSSxHQUFHLG1CQUFtQixDQUFDOzs7O0NBSWhDLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQzs7OztDQUlsQixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDbkIsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQztDQUNqRCxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ2xDLElBQUksTUFBTSxDQUFDOzs7O0NBSVgsS0FBSyxRQUFRLElBQUksUUFBUSxDQUFDLFVBQVUsR0FBRzs7OztFQUl0QyxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDOztFQUUzQixNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7R0FFNUMsSUFBSSxJQUFJLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUV0QixNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7SUFFMUIsS0FBSyxHQUFHLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUMxQixLQUFLLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUN0QyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDckMsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDOztJQUVyQyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0lBRWxDLEtBQUssS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLFNBQVMsR0FBRzs7S0FFakMsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0tBRXhEOztJQUVEOztHQUVEOzs7O0VBSUQsTUFBTSxHQUFHLElBQUksS0FBSyxHQUFHOztHQUVwQixDQUFDLEdBQUcsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDOztHQUVqQixNQUFNLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7R0FDdkMsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FB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LEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDOztLQUU5Qzs7SUFFRDs7R0FFRDs7OztFQUlELE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHOztHQUU3QixNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztJQUU3QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7SUFFNUIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRzs7S0FFbEIsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztLQUM5QixVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0tBQzlCLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7S0FFMUIsTUFBTTs7S0FFTixVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO0tBQzlCLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO0tBQ2xDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0tBRTlCOztJQUVEOztHQUVEOztFQUVEOztDQUVELFNBQVMsWUFBWSxFQUFFLE1BQU0sR0FBRzs7RUFFL0IsSUFBSSxNQUFNLEdBQUcsSUFBSUEsU0FBTyxFQUFFLENBQUM7Ozs7RUFJM0IsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRzs7R0FFbEQsTUFBTSxDQUFDLENBQUMsR0FBRyxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0dBQ2pDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztHQUNqQyxNQUFNLENBQUMsQ0FBQyxHQUFHLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0dBRWpDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLENBQUM7O0dBRTVDLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztHQUNqQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7R0FDakMsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDOztHQUVqQzs7RUFFRDs7Q0FFRCxTQUFTLFdBQVcsR0FBRzs7RUFFdEIsSUFBSSxNQUFNLEdBQUcsSUFBSUEsU0FBTyxFQUFFLENBQUM7O0VBRTNCLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUc7O0dBRWxELE1BQU0sQ0FBQyxDQUFDLEdBQUcsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztHQUNqQyxNQUFNLENBQUMsQ0FBQyxHQUFHLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7R0FDakMsTUFBTSxDQUFDLENBQUMsR0FBRyxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOztHQUVqQyxJQUFJLENBQUMsR0FBRyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0dBQzlDLElBQUksQ0FBQyxHQUFHLFdBQVcsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztHQUM5QyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0dBRTFCOztFQUVELFVBQVUsRUFBRSxDQUFDOztFQUViLFdBQVcsRUFBRSxDQUFDOztFQUVkOztDQUVELFNBQVMsV0FBVyxHQUFHOzs7O0VBSXRCLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUc7Ozs7R0FJOUMsSUFBSSxFQUFFLEdBQUcsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztHQUMzQixJQUFJLEVBQUUsR0FBRyxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0dBQzNCLElBQUksRUFBRSxHQUFHLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0dBRTNCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztHQUNqQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Ozs7R0FJakMsS0FBSyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUc7O0lBRTdCLEtBQUssRUFBRSxHQUFHLEdBQUcsR0FBRyxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN2QyxLQUFLLEVBQUUsR0FBRyxHQUFHLEdBQUcsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkMsS0FBSyxFQUFFLEdBQUcsR0FBRyxHQUFHLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDOztJQUV2Qzs7R0FFRDs7RUFFRDs7Q0FFRCxTQUFTLFVBQVUsRUFBRSxNQUFNLEdBQUc7O0VBRTdCLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFbEQ7O0NBRUQsU0FBUyxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHOztFQUUxQyxJQUFJLE1BQU0sR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDOztFQUV2QixNQUFNLENBQUMsQ0FBQyxHQUFHLFFBQVEsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7RUFDbEMsTUFBTSxDQUFDLENBQUMsR0FBRyxRQUFRLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO0VBQ2xDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzs7RUFFbEM7O0NBRUQsU0FBUyxVQUFVLEdBQUc7O0VBRXJCLElBQUksQ0FBQyxHQUFHLElBQUlBLFNBQU8sRUFBRSxDQUFDO0VBQ3RCLElBQUksQ0FBQyxHQUFHLElBQUlBLFNBQU8sRUFBRSxDQUFDO0VBQ3RCLElBQUksQ0FBQyxHQUFHLElBQUlBLFNBQU8sRUFBRSxDQUFDOztFQUV0QixJQUFJLFFBQVEsR0FBRyxJQUFJQSxTQUFPLEVBQUUsQ0FBQzs7RUFFN0IsSUFBSSxHQUFHLEdBQUcsSUFBSWpTLFNBQU8sRUFBRSxDQUFDO0VBQ3hCLElBQUksR0FBRyxHQUFHLElBQUlBLFNBQU8sRUFBRSxDQUFDO0VBQ3hCLElBQUksR0FBRyxHQUFHLElBQUlBLFNBQU8sRUFBRSxDQUFDOztFQUV4QixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRzs7R0FFakUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO0dBQzdFLENBQUMsQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztHQUM3RSxDQUFDLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7O0dBRTdFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7R0FDaEQsR0FBRyxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztHQUNoRCxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDOztHQUVoRCxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUV2RCxJQUFJLEdBQUcsR0FBRyxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7O0dBRTlCLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7R0FDaEMsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztHQUNoQyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDOztHQUVoQzs7RUFFRDs7Q0FFRCxTQUFTLFNBQVMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEdBQUc7O0VBRWpELEtBQUssRUFBRSxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUc7O0dBRXhDLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7R0FFOUI7O0VBRUQsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUc7O0dBRS9DLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDOztHQUVqRDs7RUFFRDs7OztDQUlELFNBQVMsT0FBTyxFQUFFLE1BQU0sR0FBRzs7RUFFMUIsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0VBRTFDOzs7OztDQUtELFNBQVMsV0FBVyxFQUFFLE1BQU0sR0FBRzs7RUFFOUIsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFF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LEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUM7RUFDOUIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0lBQzFCLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUMzQixDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQzs7O0dBRzFCLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQztHQUMzQixDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQzs7O0VBRzFCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztHQUMzQixDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQzs7O0VBRzFCLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztFQUM1QixFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztFQUMxQixDQUFDOztDQUVGLElBQUksT0FBTyxHQUFHO0dBQ1osQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFO0dBQ3pDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtFQUMxQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7R0FDekMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFO0dBQ3pDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRTtHQUN6QyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUU7R0FDekMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFO0VBQzFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQztHQUN6QyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7RUFDMUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDO0VBQzFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRTtHQUN6QyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxH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QUM7RUFDdkIsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDdkIsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Ozs7RUFJdkIsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0VBQ2QsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDOztFQUVkLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksY0FBYyxFQUFFLEdBQUcsQ0FBQyxHQUFHOzs7OztHQUt4QyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsY0FBYyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0dBQ3pDLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7R0FDaEMsSUFBSSxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7Ozs7O0dBSzlCLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0dBQzFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0dBQzFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztHQUUxQyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7Ozs7R0FJOUMsTUFBTSxDQUFDLFVBQVUs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QUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDOztHQUU3QixFQUFFLEdBQUcsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztHQUM3QixFQUFFLEdBQUcsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQzs7R0FFN0IsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLE9BQU8sS0FBSyxDQUFDOztHQUUvRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0dBQzNCLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7R0FDakMsSUFBSSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQzs7R0FFakMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztHQUM1QixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0dBQzVCLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0dBRTVCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztJQUUxQixFQUFFLEdBQUcsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3QixFQUFFLEdBQUcsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQzs7SUFF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QyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsUUFBUSxTQUFTLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRzs7S0FFMUU7O0lBRUQ7O0dBRUQ7O0VBRUQsU0FBUyxxQkFBcUIsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUscUJBQXFCLEdBQUc7O0dBRW5HLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsSUFBSSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDO0dBQzdFLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsSUFBSSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDOztHQUU3RSxJQUFJLFVBQVUsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7R0FDM0MsSUFBSSxVQUFVLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDOztHQUUzQyxJQUFJLEtBQUssSUFBSSxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUM7R0FDL0MsSUFBSSxRQUFRLEdBQUcsTUFBTSxHQUFHLFVBQVUsR0FBRyxNQUFNLEdBQUcsVUFBVSxDQUFDOztHQUV6RCxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRzs7OztJQUl6QyxJQUFJLFFBQVEsQ0FBQztJQUNiLEtBQUssS0FBSyxHQUFHLENBQUMsR0FBRzs7S0FFaEIsS0FBSyxFQUFFLFFBQVEsR0FBRyxDQUFDLFFBQVEsUUFBUSxHQUFHLEtBQUssRUFBRSxLQUFLLE9BQU8sRUFBRSxDQUFDO0tBQzVELFFBQVEsR0FBRyxNQUFNLEdBQUcsVUFBVSxHQUFHLE1BQU0sR0FBRyxVQUFVLENBQUM7S0FDckQsS0FBSyxFQUFFLFFBQVEsR0FBRyxDQUFDLFFBQVEsUUFBUSxHQUFHLEtBQUssRUFBRSxLQUFLLE9BQU8sRUFBRSxDQUFDOztLQUU1RCxNQUFNOztLQUVOLEtBQUssRUFBRSxRQUFRLEdBQUcsQ0FBQyxRQUFRLFFBQVEsR0FBRyxLQUFLLEVBQUUsS0FBSyxPQUFPLEVBQUUsQ0FBQztLQUM1RCxRQUFRLEdBQUcsTUFBTSxHQUFHLFVBQVUsR0FBRyxNQUFNLEdBQUcsVUFBVSxDQUFDO0tBQ3JELEtBQUssRUFBRSxRQUFRLEdBQUcsQ0FBQyxRQUFRLFFBQVEsR0FBRyxLQUFLLEVBQUUsS0FBSyxPQUFPLEVBQUUsQ0FBQzs7S0FFNUQ7Ozs7SUFJRCxLQUFLLFFBQVEsS0FBSyxDQUFDLEdBQUc7O0tBRXJCLEtBQUssRUFBRSxxQkFBcUI7U0FDeEIsRUFBRSxRQUFRLEtBQUssQ0FBQyxRQUFRLFFBQVEsS0FBSyxLQUFLLEVBQUUsRUFBRSxJQUFJLE9BQU8sRUFBRSxDQUFDO0tBQ2hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQzs7S0FFckI7SUFDRCxLQUFLLFFBQVEsS0FBSyxLQUFLLEdBQUc7O0tBRXpCLEtBQUssRUFBRSxxQkFBcUI7U0FDeEIsRUFBRSxRQUFRLEtBQUssQ0FBQyxRQUFRLFFBQVEsS0FBSyxLQUFLLEVBQUUsRUFBRSxJQUFJLE9BQU8sRUFBRSxDQUFDO0tBQ2hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQzs7S0FFckI7O0lBRUQsS0FBSyxRQUFRLEtBQUssQ0FBQyxJQUFJLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUM1QyxLQUFLLFFBQVEsS0FBSyxLQUFLLEdBQUcsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDOzs7SUFHL0MsSUFBSSxVQUFVLEdBQUcsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNsQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyxVQUFVLEdBQUcsTUFBTTtPQUM1QyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyxVQUFVLEdBQUcsTUFBTSxFQUFFLEVBQUUsQ0FBQzs7SUFFNUMsTUFBTTs7O0lBR04sS0FBSyxFQUFFLFFBQVEsS0FBSyxDQUFDO1FBQ2pCLE1BQU0sR0FBRyxVQUFVLEtBQUssTUFBTSxHQUFHLFVBQVUsRUFBRSxNQUFNLE9BQU8sRUFBRSxDQUFDOzs7SUFHakUsSUFBSSxNQUFNLEtBQUssRUFBRSxNQUFNLEtBQUssQ0FBQyxRQUFRLE1BQU0sS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQ3RELElBQUksTUFBTSxLQUFLLEVBQUUsTUFBTSxLQUFLLENBQUMsUUFBUSxNQUFNLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7SUFFdEQsS0FBSyxNQUFNLElBQUksTUFBTSxHQUFHOztLQUV2QixLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQztTQUM5QixTQUFTLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxPQUFPLEVBQUUsQ0FBQztLQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUM7O0tBRXJCOztJQUVELEtBQUssTUFBTSxHQUFHOztLQUViLEtBQUssRUFBRSx5QkFBeUIsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLE9BQU8sRUFBRSxDQUFDO0tBQ2pGLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQzs7S0FFckI7O0lBRUQsS0FBSyxNQUFNLEdBQUc7O0tBRWIsS0FBSyxFQUFFLHlCQUF5QixFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLElBQUksT0FBTyxFQUFFLENBQUM7S0FDakYsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDOztLQUVyQjs7O0lBR0QsSUFBSSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7SUFDN0MsSUFBSSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7SUFDN0MsS0FBSyxNQUFNLEtBQUssQ0FBQyxHQUFHOzs7S0FHbkIsS0FBSyxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUc7O01BRWhDLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQztNQUM5QyxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7O01BRTlDLE1BQU07O01BRU4sT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDO01BQzlDLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQzs7TUFFOUM7S0FDRCxLQUFLLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRzs7TUFFaEMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDO01BQzlDLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQzs7TUFFOUMsTUFBTTs7TUFFTixPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7TUFDOUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDOztNQUU5Qzs7S0FFRCxNQUFNOzs7S0FHTixLQUFLLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRzs7TUFFaEMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDO01BQzlDLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQzs7TUFFOUMsTUFBTTs7TUFFTixPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7TUFDOUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxD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NUYsS0FBSyxFQUFFLGFBQWEsR0FBRzs7SUFFdEIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxNQUFNLEdBQUcsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDOztJQUV4QyxNQUFNOzs7O0lBSU4sTUFBTSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNoRSxRQUFRLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDOztJQUVwRSxTQUFTLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7O0lBRWhFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDOztJQUUzQzs7R0FFRDs7RUFFRDs7Ozs7O0NBTUQsTUFBTSxDQUFDLEdBQUcsYUFBYSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUUzQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLGFBQWEsQ0FBQztFQUN0QixDQUFDLEdBQUcsY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7RUFDakQsRUFBRSxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDOzs7O0VBSTdDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFB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LEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztFQUN4RSxLQUFLLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztFQUN4RSxLQUFLLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztFQUM3RSxLQUFLLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztFQUM3RSxLQUFLLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztFQUN4RSxLQUFLLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztFQUN4RSxLQUFLLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxTQUFTLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztFQUNuRyxLQUFLLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztFQUNyRSxLQUFLLElBQUksQ0FBQyxZQUFZLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztFQUNqRixLQUFLLElBQUksQ0FBQyxjQUFjLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztFQUN2RixLQUFLLElBQUksQ0FBQyxZQUFZLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztFQUNqRixLQUFLLElBQUksQ0FBQyxHQUFHLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztFQUN0RCxLQUFLLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztFQUNsRSxLQUFLLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztFQUNyRSxLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztFQUN6RCxLQUFLLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztFQUNsRSxLQUFLLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztFQUM5RSxLQUFLLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztFQUN4RSxLQUFLLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztFQUN4RSxLQUFLLElBQUksQ0FBQyxVQUFVLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztFQUMzRSxLQUFLLElBQUksQ0FBQyxVQUFVLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztFQUMzRSxLQUFLLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztFQUN4RSxL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QUFFLG1CQUFtQixHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7S0FDcEUsSUFBSSxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztLQUVwRSxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJOVEsU0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0tBRXZEOztJQUVEOztHQUVELEtBQUssSUFBSSxDQUFDLFdBQVcsR0FBRzs7SUFFdkIsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLG1CQUFtQixHQUFHOztLQUUvRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDO0tBQzlCLElBQUksQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztLQUNwRSxJQUFJLENBQUMsR0FBRyxFQUFFLG1CQUFtQixHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7S0FDcEUsSUFBSSxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztLQUVwRSxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJQSxTQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUs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LENBQUM7SUFDNUUsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDbEYsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEcsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDOztJQUV0Rzs7R0FFRCxLQUFLLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxHQUFHLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztHQUNoRSxLQUFLLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7R0FFbkUsS0FBSyxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsR0FBRzs7SUFFbEMsTUFBTSxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHOztLQUVsQyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQzs7S0FFaEY7O0lBRUQ7O0dBRUQsS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssR0FBRzs7SUFFMUIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7SUFFekIsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FB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QUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUNyQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUNyQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFckMsS0FBSyxFQUFFLElBQUksR0FBRyxHQUFHOztHQUVoQixHQUFHLEdBQUcsRUFBRSxDQUFDO0dBQ1QsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUV0Qjs7RUFFRCxLQUFLLEVBQUUsSUFBSSxHQUFHLEdBQUc7O0dBRWhCLEdBQUcsR0FBRyxFQUFFLENBQUM7R0FDVCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0dBRXRCOztFQUVELEtBQUssRUFBRSxJQUFJLEdBQUcsR0FBRzs7R0FFaEIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUV0Qjs7RUFFRCxHQUFHLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7RUFFdEQsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDaEQsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Ozs7O0VBSzNELE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksUUFBUSxFQUFFLENBQUMsR0FBRyxHQUFHOztHQUVsQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7R0FFeEMsU0FBUyxFQUFFLENBQUMsRUFBRSxHQUFHLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7O0dBRTVDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7R0FFckQsS0FBSyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRzs7SUFFcEMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDOztJQUVoQixLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRXpTLE9BQUssQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7SUFFbkYsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7O0lBRWhFOztHQUVELFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztHQUUzRDs7OztFQUlELEtBQUssTUFBTSxLQUFLLElBQUksR0FBRzs7R0FFdEIsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUVBLE9BQUssQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0dBQ3BGLEtBQUssSUFBSSxRQUFRLENBQUM7O0dBRWxCLEtBQUssUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRzs7SUFFckYsS0FBSyxHQUFHLEVBQUUsS0FBSyxDQUFDOztJQUVoQjs7R0FFRCxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFDLEdBQUcsR0FBRzs7O0lBR2xDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUM5RSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7SUFFM0Q7O0dBRUQ7O0VBRUQsT0FBTztHQUNOLFFBQVEsRUFBRSxRQUFRO0dBQ2xCLE9BQU8sRUFBRSxPQUFPO0dBQ2hCLFNBQVMsRUFBRSxTQUFTO0dBQ3BCLENBQUM7O0VBRUY7O0NBRUQsRUFBRSxDQUFDOztBQUVKLFNBQVNxeEYsV0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUc7O0NBRTVCekUsT0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFbkIsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDYixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFYjs7QUFFRHlFLFdBQVMsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRXpFLE9BQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUN2RHlFLFdBQVMsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHQSxXQUFTLENBQUM7O0FBRTVDQSxXQUFTLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O0FBRXZDQSxXQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBRzs7Q0FFN0MsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHOztFQUVkLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7RUFFdkI7O0NBRUQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQzNDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFekMsT0FBTyxLQUFLLENBQUM7O0NBRWIsQ0FBQzs7OztBQUlGQSxXQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUMsR0FBRzs7Q0FFL0MsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUxQixDQUFDOztBQUVGQSxXQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUMsR0FBRzs7Q0FFL0MsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUU3QyxPQUFPLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7Q0FFM0IsQ0FBQzs7Ozs7Ozs7Ozs7O0FBWUYsU0FBU2MsV0FBUyxHQUFHOztDQUVwQnZGLE9BQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRW5CLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDOztDQUVqQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQzs7Q0FFdkI7O0FBRUR1RixXQUFTLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRXZGLE9BQUssQ0FBQyxTQUFTLEVBQUUsRUFBRTs7Q0FFdEUsV0FBVyxFQUFFdUYsV0FBUzs7Q0FFdEIsR0FBRyxFQUFFLFdBQVcsS0FBSyxHQUFHOztFQUV2QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7RUFFMUI7O0NBRUQsU0FBUyxFQUFFLFlBQVk7OztFQUd0QixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUNoRCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFbkUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUc7O0dBRXRDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUlkLFdBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQzs7R0FFMUQ7O0VBRUQ7Ozs7Ozs7Ozs7O0NBV0QsUUFBUSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUV4QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0VBQzdCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztFQUMxQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Ozs7RUFJVixRQUFRLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxHQUFHOztHQUVqQyxLQUFLLFlBQVksRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUc7O0lBRTdCLElBQUksSUFBSSxHQUFHLFlBQVksRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDakMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7SUFFN0IsSUFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3RDLElBQUksQ0FBQyxHQUFHLGFBQWEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsYUFBYSxDQUFDOztJQUUzRCxPQUFPLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0lBRTdCOztHQUVELENBQUMsR0FBRyxDQUFDOztHQUVMOztFQUVELE9BQU8sSUFBSSxDQUFDOzs7O0VBSVo7Ozs7OztDQU1ELFNBQVMsRUFBRSxZQUFZOztFQUV0QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7RUFDbEMsT0FBTyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzs7RUFFL0I7OztDQUdELGdCQUFnQixFQUFFLFlBQVk7O0VBRTdCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0VBQ3hCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO0VBQ3pCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzs7RUFFdkI7Ozs7O0NBS0QsZUFBZSxFQUFFLFlBQVk7Ozs7RUFJNUIsS0FBSyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHOztHQUUzRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7O0dBRXpCOzs7OztFQUtELElBQUksT0FBTyxHQUFHLEVBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDOztFQUUzQixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7R0FFdEQsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7R0FDckMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7R0FFckI7O0VBRUQsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUM7O0VBRTVCLE9BQU8sT0FBTyxDQUFDOztFQUVmOztDQUVELGVBQWUsRUFBRSxXQUFXLFNBQVMsR0FBRzs7RUFFdkMsS0FBSyxTQUFTLEtBQUssU0FBUyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUM7O0VBRTlDLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQzs7RUFFaEIsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7R0FFdkMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsRUFBRSxDQUFDOztHQUU5Qzs7RUFFRCxLQUFLLElBQUksQ0FBQyxTQUFTLEdBQUc7O0dBRXJCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0dBRTNCOztFQUVELE9BQU8sTUFBTSxDQUFDOztFQUVkOztDQUVELFNBQVMsRUFBRSxXQUFXLFNBQVMsR0FBRzs7RUFFakMsU0FBUyxHQUFHLFNBQVMsSUFBSSxFQUFFLENBQUM7O0VBRTVCLElBQUksTUFBTSxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUM7O0VBRXRCLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHOztHQUVoRSxJQUFJLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7R0FDeEIsSUFBSSxVQUFVLEdBQUcsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLGNBQWMsSUFBSSxTQUFTLEdBQUcsQ0FBQztNQUM3RCxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsV0FBVyxJQUFJLENBQUM7TUFDaEMsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLGFBQWEsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNO01BQ2hFLFNBQVMsQ0FBQzs7R0FFYixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDOztHQUV4QyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsR0FBRzs7SUFFdEMsSUFBSSxLQUFLLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDOztJQUVyQixLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLFNBQVM7O0lBRTdDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDckIsSUFBSSxHQUFHLEtBQUssQ0FBQzs7SUFFYjs7R0FFRDs7RUFFRCxLQUFLLElBQUksQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUc7O0dBRWhHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0dBRTNCOztFQUVELE9BQU8sTUFBTSxDQUFDOztFQUVkOzs7Ozs7OztDQVFELG9CQUFvQixFQUFFLFdBQVcsU0FBUyxHQUFHOztFQUU1QyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDO0VBQ3RDLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFbEM7Ozs7Q0FJRCwwQkFBMEIsRUFBRSxXQUFXLFNBQVMsR0FBRzs7RUFFbEQsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxTQUFTLEVBQUUsQ0FBQztFQUM1QyxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFLENBQUM7O0VBRWxDOztDQUVELGNBQWMsRUFBRSxXQUFXLE1BQU0sR0FBRzs7RUFFbkMsSUFBSSxRQUFRLEdBQUcsSUFBSWwyRCxVQUFRLEVBQUUsQ0FBQzs7RUFFOUIsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7R0FFakQsSUFBSSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO0dBQ3hCLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUkxb0IsU0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7O0dBRXhFOztFQUVELE9BQU8sUUFBUSxDQUFDOztFQUVoQjs7Q0FFRCxFQUFFLENBQUM7O0FBRUosU0FBU3c4RSxjQUFZLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsR0FBRzs7Q0FFaEdyQyxPQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUVuQixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUNiLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUViLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0NBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDOztDQUV2QixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztDQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQzs7Q0FFM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7O0NBRTdCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxJQUFJLENBQUMsQ0FBQzs7Q0FFaEM7O0FBRURxQyxjQUFZLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUVyQyxPQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDMURxQyxjQUFZLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBR0EsY0FBWSxDQUFDOztBQUVsREEsY0FBWSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDOztBQUU3Q0EsY0FBWSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUc7O0NBRWhELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3hCLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztDQUNuRCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7OztDQUd6RCxRQUFRLFVBQVUsR0FBRyxDQUFDLEdBQUcsVUFBVSxJQUFJLEtBQUssQ0FBQztDQUM3QyxRQUFRLFVBQVUsR0FBRyxLQUFLLEdBQUcsVUFBVSxJQUFJLEtBQUssQ0FBQzs7Q0FFakQsS0FBSyxVQUFVLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRzs7RUFFbEMsS0FBSyxVQUFVLEdBQUc7O0dBRWpCLFVBQVUsR0FBRyxDQUFDLENBQUM7O0dBRWYsTUFBTTs7R0FFTixVQUFVLEdBQUcsS0FBSyxDQUFDOztHQUVuQjs7RUFFRDs7Q0FFRCxLQUFLLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxJQUFJLEVBQUUsVUFBVSxHQUFHOztFQUUvQyxLQUFLLFVBQVUsS0FBSyxLQUFLLEdBQUc7O0dBRTNCLFVBQVUsR0FBRyxFQUFFLEtBQUssQ0FBQzs7R0FFckIsTUFBTTs7R0FFTixVQUFVLEdBQUcsVUFBVSxHQUFHLEtBQUssQ0FBQzs7R0FFaEM7O0VBRUQ7O0NBRUQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDO0NBQzlDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO0NBQ25ELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUVuRCxLQUFLLElBQUksQ0FBQyxTQUFTLEtBQUssQ0FBQyxHQUFHOztFQUUzQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztFQUNyQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7RUFFckMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7RUFDckIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7OztFQUdyQixDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7RUFDbEMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDOztFQUVsQzs7Q0FFRCxPQUFPLElBQUl6dUYsU0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFM0IsQ0FBQzs7QUFFRixTQUFTc3hGLGFBQVcsRUFBRSxNQUFNLDBCQUEwQjs7Q0FFckRsRixPQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUVuQixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsTUFBTSxLQUFLLFNBQVMsS0FBSyxFQUFFLEdBQUcsTUFBTSxDQUFDOztDQUVyRDs7QUFFRGtGLGFBQVcsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRWxGLE9BQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUN6RGtGLGFBQVcsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHQSxhQUFXLENBQUM7O0FBRWhEQSxhQUFXLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7O0FBRTNDQSxhQUFXLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBRzs7Q0FFL0MsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztDQUN6QixJQUFJLEtBQUssR0FBRyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Q0FFdEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztDQUNuQyxJQUFJLE1BQU0sR0FBRyxLQUFLLEdBQUcsUUFBUSxDQUFDOztDQUU5QixJQUFJLE1BQU0sR0FBRyxNQUFNLEVBQUUsUUFBUSxLQUFLLENBQUMsR0FBRyxRQUFRLEdBQUcsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQ2hFLElBQUksTUFBTSxHQUFHLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQztDQUNoQyxJQUFJLE1BQU0sR0FBRyxNQUFNLEVBQUUsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUN2RixJQUFJLE1BQU0sR0FBRyxNQUFNLEVBQUUsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7Q0FFdkYsT0FBTyxJQUFJdHhGLFNBQU87RUFDakJ3eEYsWUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFO0VBQzVEQSxZQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUU7RUFDNUQsQ0FBQzs7Q0FFRixDQUFDOztBQUVGLFNBQVNoQixrQkFBZ0IsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUc7O0NBRTNDcEUsT0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFbkIsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDYixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUNiLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ2IsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRWI7O0FBRURvRSxrQkFBZ0IsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRXBFLE9BQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUM5RG9FLGtCQUFnQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUdBLGtCQUFnQixDQUFDOztBQUUxREEsa0JBQWdCLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBRzs7Q0FFcEQsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQzs7Q0FFM0QsT0FBTyxJQUFJeHdGLFNBQU87RUFDakIwd0YsYUFBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO0VBQ3hDQSxhQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUU7RUFDeEMsQ0FBQzs7Q0FFRixDQUFDOztBQUVGLFNBQVNPLHNCQUFvQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHOztDQUUzQzdFLE9BQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRW5CLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ2IsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDYixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFYjs7QUFFRDZFLHNCQUFvQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFN0UsT0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ2xFNkUsc0JBQW9CLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBR0Esc0JBQW9CLENBQUM7O0FBRWxFQSxzQkFBb0IsQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLFdBQVcsQ0FBQyxHQUFHOztDQUV4RCxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDOztDQUU3QyxPQUFPLElBQUlqeEYsU0FBTztFQUNqQm14RixpQkFBZSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtFQUN0Q0EsaUJBQWUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUU7RUFDdEMsQ0FBQzs7Q0FFRixDQUFDOztBQUVGLElBQUksYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRVEsV0FBUyxDQUFDLFNBQVMsRUFBRSxFQUFFOztDQUV4RSxVQUFVLEVBQUUsV0FBVyxPQUFPLEdBQUc7O0VBRWhDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7O0VBRTlDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0dBRWxELElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7O0dBRTlDOztFQUVEOztDQUVELE1BQU0sRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLEdBQUc7O0VBRXpCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFOUI7O0NBRUQsTUFBTSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRzs7RUFFekIsSUFBSSxLQUFLLEdBQUcsSUFBSWQsV0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSTd3RixTQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7RUFDNUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7O0VBRTFCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFOUI7O0NBRUQsZ0JBQWdCLEVBQUUsV0FBVyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUc7O0VBRWpELElBQUksS0FBSyxHQUFHLElBQUlpeEYsc0JBQW9CO0dBQ25DLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFO0dBQ3pCLElBQUlqeEYsU0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7R0FDekIsSUFBSUEsU0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7R0FDckIsQ0FBQzs7RUFFRixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7RUFFMUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztFQUVoQzs7Q0FFRCxhQUFhLEVBQUUsV0FBVyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRzs7RUFFOUQsSUFBSSxLQUFLLEdBQUcsSUFBSXd3RixrQkFBZ0I7R0FDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUU7R0FDekIsSUFBSXh3RixTQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRTtHQUMzQixJQUFJQSxTQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRTtHQUMzQixJQUFJQSxTQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtHQUNyQixDQUFDOztFQUVGLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDOztFQUUxQixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0VBRWhDOztDQUVELFVBQVUsRUFBRSxXQUFXLEdBQUcsdUJBQXVCOztFQUVoRCxJQUFJLElBQUksR0FBRyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7O0VBRXZELElBQUksS0FBSyxHQUFHLElBQUlzeEYsYUFBVyxFQUFFLElBQUksRUFBRSxDQUFDO0VBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDOztFQUUxQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDOztFQUVoRDs7Q0FFRCxHQUFHLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsR0FBRzs7RUFFckUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7RUFDN0IsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7O0VBRTdCLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLE9BQU87R0FDckMsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQzs7RUFFdEM7O0NBRUQsTUFBTSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEdBQUc7O0VBRXhFLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUM7O0VBRWhGOztDQUVELE9BQU8sRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEdBQUc7O0VBRTdGLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0VBQzdCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDOztFQUU3QixJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxDQUFDOztFQUVyRzs7Q0FFRCxVQUFVLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxHQUFHOztFQUVoRyxJQUFJLEtBQUssR0FBRyxJQUFJN0MsY0FBWSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsQ0FBQzs7RUFFeEcsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUc7OztHQUc3QixJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUVyQyxLQUFLLEVBQUUsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUc7O0lBRS9DLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUM7O0lBRTFDOztHQUVEOztFQUVELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDOztFQUUxQixJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQ3BDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOztFQUVwQzs7Q0FFRCxFQUFFLENBQUM7Ozs7Ozs7QUFPSixTQUFTOEQsTUFBSSxFQUFFLE1BQU0sR0FBRzs7Q0FFdkJaLFdBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7Q0FDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJM3hGLFNBQU8sRUFBRSxDQUFDOztDQUVsQyxLQUFLLE1BQU0sR0FBRzs7RUFFYixJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUUxQjs7Q0FFRDs7QUFFRHV5RixNQUFJLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQztBQUMvQixhQUFhLENBQUMsV0FBVyxHQUFHQSxNQUFJLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFhakMsU0FBU2tCLE9BQUssR0FBRzs7Q0FFaEJsQixNQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7Q0FFOUIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7O0NBRWhCOztBQUVEa0IsT0FBSyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLEVBQUU7O0NBRWhFLFdBQVcsRUFBRUEsT0FBSzs7Q0FFbEIsY0FBYyxFQUFFLFdBQVcsU0FBUyxHQUFHOztFQUV0QyxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7O0VBRWxCLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztHQUVyRCxRQUFRLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUM7O0dBRXZEOztFQUVELE9BQU8sUUFBUSxDQUFDOztFQUVoQjs7OztDQUlELGdCQUFnQixFQUFFLFdBQVcsU0FBUyxHQUFHOztFQUV4QyxPQUFPOztHQUVOLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRTtHQUNsQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxTQUFTLEVBQUU7O0dBRXZDLENBQUM7O0VBRUY7O0NBRUQsYUFBYSxFQUFFLFdBQVcsU0FBUyxHQUFHOztFQUVyQyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsQ0FBQzs7RUFFMUM7O0NBRUQsRUFBRSxDQUFDOzs7Ozs7O0FBT0osU0FBU3lTLFdBQVMsR0FBRzs7Q0FFcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7Q0FDbkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O0NBRXhCOztBQUVELE1BQU0sQ0FBQyxNQUFNLEVBQUVBLFdBQVMsQ0FBQyxTQUFTLEVBQUU7O0NBRW5DLE1BQU0sRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLEdBQUc7O0VBRXpCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSTNULE1BQUksRUFBRSxDQUFDO0VBQzlCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztFQUN2QyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRWhDOztDQUVELE1BQU0sRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLEdBQUc7O0VBRXpCLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFaEM7O0NBRUQsZ0JBQWdCLEVBQUUsV0FBVyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUc7O0VBRWpELElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0VBRXhEOztDQUVELGFBQWEsRUFBRSxXQUFXLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHOztFQUU5RCxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztFQUVyRTs7Q0FFRCxVQUFVLEVBQUUsV0FBVyxHQUFHLEdBQUc7O0VBRTVCLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDOztFQUVuQzs7Q0FFRCxRQUFRLEVBQUUsV0FBVyxLQUFLLEVBQUUsT0FBTyxHQUFHOztFQUVyQyxTQUFTLGVBQWUs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QVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDOztHQUVwQyxJQUFJLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDOztHQUU5QixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7O0dBRVosTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7SUFFaEQsSUFBSSxJQUFJLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztJQUV0QixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7S0FFL0QsSUFBSSxNQUFNLEdBQUcsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDOztLQUUzQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDOztLQUVyQyxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQzs7S0FFOUMsRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUM7O0tBRWpHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7O0tBRXpDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDOztLQUVkLFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7O0tBRXpDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDOztLQUVkOztJQUVEOztHQUVELE1BQU0sS0FBSyxXQUFXLElBQUksV0FBVyxDQUFDLGdCQUFnQixHQUFHOztHQUV6RCxJQUFJLE1BQU0sR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQzs7R0FFN0MsSUFBSSxPQUFPLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7O0dBRTVDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQzs7OztHQUlaLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0lBRWxELEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUM7O0lBRTNGLEVBQUUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7SUFFbEUsRUFBRSxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7SUFFbEYsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7SUFFekMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7O0lBRWQsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7SUFFekMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7O0lBRWQ7O0dBRUQ7O0VBRUQsUUFBUSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O0VBRTVCLENBQUM7O0NBRUYsRUFBRSxFQUFFLENBQUM7Ozs7Ozs7O0FBUU4sU0FBU290RyxpQkFBZSxFQUFFLEtBQUssR0FBRzs7Q0FFakN4dEYsVUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Q0FDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDOztDQUUvQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7Q0FDaEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQzs7Q0FFOUIsSUFBSSxRQUFRLEdBQUcsSUFBSXNPLGdCQUFjLEVBQUUsQ0FBQzs7Q0FFcEMsSUFBSSxTQUFTLEdBQUc7RUFDZixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7RUFDdEIsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0VBQ3RCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0VBQ3RCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztFQUN0QixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQztFQUN0QixDQUFDOztDQUVGLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUVuRCxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDakMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztFQUVqQyxTQUFTLENBQUMsSUFBSTtHQUNiLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0dBQ2pDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0dBQ2pDLENBQUM7O0VBRUY7O0NBRUQsUUFBUSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsSUFBSWhCLHdCQUFzQixFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVoRixJQUFJLFFBQVEsR0FBRyxJQUFJK2hCLG1CQUFpQixFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7O0NBRXZELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSTR3QixjQUFZLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDO0NBQ25ELElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDOztDQUV0QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRWQ7O0FBRUR1dEMsaUJBQWUsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRXh0RixVQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDaEV3dEYsaUJBQWUsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHQSxpQkFBZSxDQUFDOztBQUV4REEsaUJBQWUsQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLFlBQVk7O0NBRS9DLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0NBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDOztDQUU3QixDQUFDOztBQUVGQSxpQkFBZSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsWUFBWTs7Q0FFOUMsSUFBSSxNQUFNLEdBQUcsSUFBSS92RyxTQUFPLEVBQUUsQ0FBQztDQUMzQixJQUFJLE9BQU8sR0FBRyxJQUFJQSxTQUFPLEVBQUUsQ0FBQzs7Q0FFNUIsT0FBTyxTQUFTLE1BQU0sR0FBRzs7RUFFeEIsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0VBQ2xFLElBQUksU0FBUyxHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7O0VBRTFELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDOztFQUV4RCxNQUFNLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztFQUN2RCxPQUFPLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7O0VBRS9ELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQzs7RUFFMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDOztFQUVsRCxDQUFDOztDQUVGLEVBQUUsQ0FBQzs7Ozs7Ozs7OztBQVVKLFNBQVNvd0csZ0JBQWMsRUFBRSxNQUFNLEdBQUc7O0NBRWpDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFeEMsSUFBSSxRQUFRLEdBQUcsSUFBSXYvRSxnQkFBYyxFQUFFLENBQUM7O0NBRXBDLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztDQUNsQixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7O0NBRWhCLElBQUksTUFBTSxHQUFHLElBQUl2WixPQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNsQyxJQUFJLE1BQU0sR0FBRyxJQUFJQSxPQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFbEMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUU5QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUUzQixLQUFLLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUc7O0dBRXhDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztHQUN6QixRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7R0FDekIsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDO0dBQzVDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7R0FFNUM7O0VBRUQ7O0NBRUQsUUFBUSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsSUFBSXVZLHdCQUFzQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQy9FLFFBQVEsQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLElBQUlBLHdCQUFzQixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUUxRSxJQUFJLFFBQVEsR0FBRyxJQUFJK2hCLG1CQUFpQixFQUFFLEVBQUUsWUFBWSxFQUFFMitDLGNBQVksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7O0NBRS9IL3RCLGNBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFOUMsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUM7O0NBRW5CLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztDQUNqQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDOztDQUU5QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRWQ7OztBQUdENHRDLGdCQUFjLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUU1dEMsY0FBWSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ25FNHRDLGdCQUFjLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBR0EsZ0JBQWMsQ0FBQzs7QUFFdERBLGdCQUFjLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxVQUFVLE1BQU0sR0FBRzs7Q0FFekQsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDOztDQUVsQixLQUFLLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHOztFQUU5QixRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUV4Qjs7Q0FFRCxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRW5ELFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDOztFQUUxRTs7Q0FFRCxPQUFPLFFBQVEsQ0FBQzs7Q0FFaEIsQ0FBQzs7QUFFRkEsZ0JBQWMsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFlBQVk7O0NBRTdDLElBQUksTUFBTSxHQUFHLElBQUlwd0csU0FBTyxFQUFFLENBQUM7O0NBRTNCLElBQUksVUFBVSxHQUFHLElBQUlwTyxTQUFPLEVBQUUsQ0FBQztDQUMvQixJQUFJLGNBQWMsR0FBRyxJQUFJQSxTQUFPLEVBQUUsQ0FBQzs7Q0FFbkMsT0FBTyxTQUFTLE1BQU0sR0FBRzs7RUFFeEIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztFQUM3QixJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxDQUFDOztFQUVuRCxjQUFjLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7O0VBRW5ELE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHOztHQUVyRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUUzQixLQUFLLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUc7O0lBRXhDLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2hFLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxVQUFVLEVBQUUsQ0FBQztJQUMzQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztJQUVuRCxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkUsTUFBTSxDQUFDLHFCQUFxQixFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQzNDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztJQUV2RCxDQUFDLElBQUksQ0FBQyxDQUFDOztJQUVQOztHQUVEOztFQUVELFFBQVEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7RUFFdkQsQ0FBQzs7Q0FFRixFQUFFLENBQUM7Ozs7Ozs7QUFPSixTQUFTNCtHLGtCQUFnQixFQUFFLEtBQUssRUFBRSxVQUFVLEdBQUc7O0NBRTlDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0NBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzs7Q0FFL0IsSUFBSSxRQUFRLEdBQUcsSUFBSXo5QixzQkFBb0IsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzVELElBQUksUUFBUSxHQUFHLElBQUlsN0MsbUJBQWlCLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO0NBQ3hFLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRXhDNkYsTUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUV0QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO0NBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQXdCOUI7O0FBRUQ4eUUsa0JBQWdCLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUU5eUUsTUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQzdEOHlFLGtCQUFnQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUdBLGtCQUFnQixDQUFDOztBQUUxREEsa0JBQWdCLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxZQUFZOztDQUVoRCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0NBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7O0NBRXhCLENBQUM7O0FBRUZBLGtCQUFnQixDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsWUFBWTs7Q0FFL0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBaUI3QyxDQUFDOzs7Ozs7OztBQVFGLFNBQVNDLHFCQUFtQixFQUFFLEtBQUssR0FBRzs7Q0FFckNsdUYsVUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Q0FDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDOztDQUUvQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7Q0FDaEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQzs7Q0FFOUIsSUFBSSxRQUFRLEdBQUcsSUFBSXF2QixtQkFBaUIsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQzs7Q0FFL0QsSUFBSSxRQUFRLEdBQUcsSUFBSS9nQixnQkFBYyxFQUFFLENBQUM7O0NBRXBDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLElBQUl2QyxpQkFBZSxFQUFFLElBQUksWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUV6RixJQUFJLENBQUMsR0FBRyxFQUFFLElBQUl1ekMsTUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDOztDQUUzQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRWQ7O0FBRUQ0dUMscUJBQW1CLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUVsdUYsVUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ3BFa3VGLHFCQUFtQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUdBLHFCQUFtQixDQUFDOztBQUVoRUEscUJBQW1CLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxZQUFZOztDQUVuRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztDQUN0QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7Q0FFdEMsQ0FBQzs7QUFFRkEscUJBQW1CLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxZQUFZOztDQUVsRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDOzs7O0NBSTlCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDOzs7O0NBSTdDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztDQUNoQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7O0NBRWpDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztDQUNqRCxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDOzs7O0NBSTNCLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3hELEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUN4RCxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUN4RCxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3hELEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUV4RCxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7Q0FFNUIsQ0FBQzs7Ozs7Ozs7QUFRRixTQUFTQyx1QkFBcUIsRUFBRSxLQUFLLEVBQUUsSUFBSSxHQUFHOztDQUU3Q251RixVQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUV0QixJQUFJLENBQUMs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QyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFekIsS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxNQUFNLEdBQUcsTUFBTSxDQUFDOztFQUVwQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7RUFDekMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDOztFQUV6Qzs7OztDQUlELE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUVqQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLE1BQU0sR0FBRyxNQUFNLENBQUM7O0VBRXBDLENBQUMsR0FBRyxNQUFNLEtBQUssTUFBTSxHQUFHLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQzs7RUFFdEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxHQUFHLEdBQUc7Ozs7R0FJbEMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLFNBQVMsT0FBTyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDOztHQUV4QyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7R0FDdEIsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztHQUV0QixRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7R0FDekIsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDOzs7O0dBSXpDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLE9BQU8sSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7R0FFaEQsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0dBQ3RCLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7R0FFdEIsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0dBQ3pCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7R0FFekM7O0VBRUQ7O0NBRUQsSUFBSSxRQUFRLEdBQUcsSUFBSXVaLGdCQUFjLEVBQUUsQ0FBQztDQUNwQyxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxJQUFJaEIsd0JBQXNCLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDL0UsUUFBUSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsSUFBSUEsd0JBQXNCLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRTFFLElBQUksUUFBUSxHQUFHLElBQUkraEIsbUJBQWlCLEVBQUUsRUFBRSxZQUFZLEVBQUUyK0MsY0FBWSxFQUFFLEVBQUUsQ0FBQzs7Q0FFdkUvdEIsY0FBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUU5Qzs7QUFFRHN1QyxpQkFBZSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFdHVDLGNBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUNwRXN1QyxpQkFBZSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUdBLGlCQUFlLENBQUM7Ozs7Ozs7QUFPeEQsU0FBU0MsbUJBQWlCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsU0FBUyxHQUFHOzs7O0NBSTFELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDOztDQUVyQixJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsSUFBSSxLQUFLLFNBQVMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxDQUFDOztDQUU5QyxJQUFJLEtBQUssR0FBRyxFQUFFLEdBQUcsS0FBSyxTQUFTLEtBQUssR0FBRyxHQUFHLFFBQVEsQ0FBQzs7Q0FFbkQsSUFBSSxLQUFLLEdBQUcsRUFBRSxTQUFTLEtBQUssU0FBUyxLQUFLLFNBQVMsR0FBRyxDQUFDLENBQUM7Ozs7Q0FJeEQsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDOztDQUVqQixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQzs7Q0FFdkMsS0FBSyxXQUFXLElBQUksV0FBVyxDQUFDLFVBQVUsR0FBRzs7RUFFNUMsUUFBUSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDOztFQUVwQyxNQUFNOztFQUVOLE9BQU8sQ0FBQyxJQUFJLEVBQUUsb0dBQW9HLEVBQUUsQ0FBQzs7RUFFckg7Ozs7Q0FJRCxJQUFJLFFBQVEsR0FBRyxJQUFJbGdGLGdCQUFjLEVBQUUsQ0FBQzs7Q0FFcEMsSUFBSSxTQUFTLEdBQUcsSUFBSWhCLHdCQUFzQixFQUFFLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVsRSxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsQ0FBQzs7Q0FFL0MyeUMsY0FBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUk1d0IsbUJBQWlCLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7Ozs7Q0FJakcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztDQUM5QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRWQ7O0FBRURtL0QsbUJBQWlCLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUV2dUMsY0FBWSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ3RFdXVDLG1CQUFpQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUdBLG1CQUFpQixDQUFDOztBQUU1REEsbUJBQWlCLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxZQUFZOztDQUVsRCxJQUFJLEVBQUUsR0FBRyxJQUFJL3dHLFNBQU8sRUFBRSxDQUFDO0NBQ3ZCLElBQUksRUFBRSxHQUFHLElBQUlBLFNBQU8sRUFBRSxDQUFDO0NBQ3ZCLElBQUksWUFBWSxHQUFHLElBQUkyQyxTQUFPLEVBQUUsQ0FBQzs7Q0FFakMsT0FBTyxTQUFTLE1BQU0sR0FBRzs7RUFFeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7RUFFdEMsWUFBWSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDOztFQUV4RCxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQzs7RUFFMUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDOzs7O0VBSWpELElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDOztFQUV2QyxJQUFJLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDOztFQUVwQyxJQUFJLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDOztFQUU5QixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7O0VBRVosTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7R0FFaEQsSUFBSSxJQUFJLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztHQUV0QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDOztHQUV6QixFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUU7S0FDM0IsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUU7S0FDekIsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUU7S0FDekIsWUFBWSxFQUFFLENBQUMsRUFBRTtLQUNqQixZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUM7O0dBRTlCLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDOztHQUVqRyxRQUFRLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDOztHQUV6QyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQzs7R0FFZCxRQUFRLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDOztHQUV6QyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQzs7R0FFZDs7RUFFRCxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7RUFFNUIsQ0FBQzs7Q0FFRixFQUFFLEVBQUUsQ0FBQzs7Ozs7Ozs7QUFRTixTQUFTdXVHLHdCQUFzQixFQUFFLEtBQUssRUFBRSxJQUFJLEdBQUc7O0NBRTlDM3VGLFVBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXRCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0NBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzs7Q0FFL0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO0NBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7O0NBRTlCLEtBQUssSUFBSSxLQUFLLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDOztDQUVuQyxJQUFJLFFBQVEsR0FBRyxJQUFJc08sZ0JBQWMsRUFBRSxDQUFDO0NBQ3BDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLElBQUloQix3QkFBc0IsRUFBRTtFQUM5RCxFQUFFLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUNmLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUNmLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO0VBQ2pCLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7RUFDakIsRUFBRSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7RUFDakIsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVULElBQUksUUFBUSxHQUFHLElBQUkraEIsbUJBQWlCLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQzs7Q0FFdkQsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJaXdCLE1BQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQzs7Q0FFM0MsUUFBUSxHQUFHLElBQUloeEMsZ0JBQWMsRUFBRSxDQUFDO0NBQ2hDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLElBQUloQix3QkFBc0IsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFM0YsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJZ3lDLE1BQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQzs7Q0FFMUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUVkOztBQUVEcXZDLHdCQUFzQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFM3VGLFVBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUN2RTJ1Rix3QkFBc0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHQSx3QkFBc0IsQ0FBQzs7QUFFdEVBLHdCQUFzQixDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsWUFBWTs7Q0FFdEQsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNwQyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVwQyxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0NBQzlCLFVBQVUsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7Q0FDOUIsVUFBVSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztDQUM5QixVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDOztDQUU5QixDQUFDOztBQUVGQSx3QkFBc0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFlBQVk7O0NBRXJELElBQUksRUFBRSxHQUFHLElBQUlseEcsU0FBTyxFQUFFLENBQUM7Q0FDdkIsSUFBSSxFQUFFLEdBQUcsSUFBSUEsU0FBTyxFQUFFLENBQUM7Q0FDdkIsSUFBSSxFQUFFLEdBQUcsSUFBSUEsU0FBTyxFQUFFLENBQUM7O0NBRXZCLE9BQU8sU0FBUyxNQUFNLEdBQUc7O0VBRXhCLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0VBQ25ELEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztFQUMxRCxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7RUFFeEIsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUNwQyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUVwQyxVQUFVLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDO0VBQ3hCLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDOztFQUVuRCxVQUFVLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDO0VBQ3hCLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7RUFFakMsQ0FBQzs7Q0FFRixFQUFFLENBQUM7Ozs7Ozs7Ozs7OztBQVlKLFNBQVMyeEcsY0FBWSxFQUFFLE1BQU0sR0FBRzs7Q0FFL0IsSUFBSSxRQUFRLEdBQUcsSUFBSTlnRixnQkFBYyxFQUFFLENBQUM7Q0FDcEMsSUFBSSxRQUFRLEdBQUcsSUFBSStnQixtQkFBaUIsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFNCtDLFlBQVUsRUFBRSxFQUFFLENBQUM7O0NBRXRGLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztDQUNsQixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7O0NBRWhCLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQzs7OztDQUlsQixJQUFJLFlBQVksR0FBRyxJQUFJbDVFLE9BQUssRUFBRSxRQUFRLEVBQUUsQ0FBQztDQUN6QyxJQUFJLFNBQVMsR0FBRyxJQUFJQSxPQUFLLEVBQUUsUUFBUSxFQUFFLENBQUM7Q0FDdEMsSUFBSSxPQUFPLEdBQUcsSUFBSUEsT0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDO0NBQ3BDLElBQUksV0FBVyxHQUFHLElBQUlBLE9BQUssRUFBRSxRQUFRLEVBQUUsQ0FBQztDQUN4QyxJQUFJLFVBQVUsR0FBRyxJQUFJQSxPQUFLLEVBQUUsUUFBUSxFQUFFLENBQUM7Ozs7Q0FJdkMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDcEMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDcEMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDcEMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7Ozs7Q0FJcEMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDcEMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDcEMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDcEMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7Ozs7Q0FJcEMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDcEMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDcEMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDcEMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7Ozs7Q0FJcEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7Q0FDaEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7Q0FDaEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7Q0FDaEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7Ozs7Q0FJaEMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7Q0FDL0IsT0FBTyxF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aEMsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUNoQyxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQ2hDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOzs7O0VBSWhDLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDOUIsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDOUIsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDOUIsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOzs7O0VBSTlCLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDMUMsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQzFDLFFBQVEsRUFBRSxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7OztFQUkxQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUMvQixRQUFRLEVBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDL0IsUUFBUSxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsRUFBRSxD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RSxHQUFHLE9BQU87O0VBRTVCLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUM7RUFDbEIsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBa0JsQixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7RUFDakQsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQzs7RUFFM0IsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQzlELEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUM5RCxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDOUQsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQzlELEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFH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