whs.js/modules/StatsModule.js
2018-06-02 14:22:49 +03:00

8146 lines
5.3 MiB

/* Built for whs v2.2.0-beta.0 */
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global.StatsModule = factory());
}(this, (function () { 'use strict';
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 _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
/* 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<iterable.length){if(hasOwn.call(iterable,i)){next.value=iterable[i];next.done=false;return next;}}next.value=undefined;next.done=true;return next;};return next.next=next;}}// Return an iterator with no values.
return {next:doneResult};}runtime.values=values;function doneResult(){return {value:undefined,done:true};}Context.prototype={constructor:Context,reset:function(skipTempReset){this.prev=0;this.next=0;// Resetting context._sent for legacy support of Babel's
// function.sent implementation.
this.sent=this._sent=undefined;this.done=false;this.delegate=null;this.method="next";this.arg=undefined;this.tryEntries.forEach(resetTryEntry);if(!skipTempReset){for(var name in this){// Not sure about the optimal order of these conditions:
if(name.charAt(0)==="t"&&hasOwn.call(this,name)&&!isNaN(+name.slice(1))){this[name]=undefined;}}}},stop:function(){this.done=true;var rootEntry=this.tryEntries[0];var rootRecord=rootEntry.completion;if(rootRecord.type==="throw"){throw rootRecord.arg;}return this.rval;},dispatchException:function(exception){if(this.done){throw exception;}var context=this;function handle(loc,caught){record.type="throw";record.arg=exception;context.next=loc;if(caught){// If the dispatched exception was caught by a catch block,
// then let that catch block handle the exception normally.
context.method="next";context.arg=undefined;}return !!caught;}for(var i=this.tryEntries.length-1;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<entry.catchLoc){return handle(entry.catchLoc,true);}else if(this.prev<entry.finallyLoc){return handle(entry.finallyLoc);}}else if(hasCatch){if(this.prev<entry.catchLoc){return handle(entry.catchLoc,true);}}else if(hasFinally){if(this.prev<entry.finallyLoc){return handle(entry.finallyLoc);}}else{throw new Error("try statement without catch or finally");}}}},abrupt:function(type,arg){for(var i=this.tryEntries.length-1;i>=0;--i){var entry=this.tryEntries[i];if(entry.tryLoc<=this.prev&&hasOwn.call(entry,"finallyLoc")&&this.prev<entry.finallyLoc){var finallyEntry=entry;break;}}if(finallyEntry&&(type==="break"||type==="continue")&&finallyEntry.tryLoc<=arg&&arg<=finallyEntry.finallyLoc){// Ignore the finally entry if control is not jumping to a
// location outside the try/catch block.
finallyEntry=null;}var record=finallyEntry?finallyEntry.completion:{};record.type=type;record.arg=arg;if(finallyEntry){this.method="next";this.next=finallyEntry.finallyLoc;return ContinueSentinel;}return this.complete(record);},complete:function(record,afterLoc){if(record.type==="throw"){throw record.arg;}if(record.type==="break"||record.type==="continue"){this.next=record.arg;}else if(record.type==="return"){this.rval=this.arg=record.arg;this.method="return";this.next="end";}else if(record.type==="normal"&&afterLoc){this.next=afterLoc;}return ContinueSentinel;},finish:function(finallyLoc){for(var i=this.tryEntries.length-1;i>=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;i<DOMIterables.length;i++){var NAME=DOMIterables[i];var Collection=_global[NAME];var proto=Collection&&Collection.prototype;if(proto&&!proto[TO_STRING_TAG])_hide(proto,TO_STRING_TAG,NAME);_iterators[NAME]=_iterators.Array;}// getting tag from 19.1.3.6 Object.prototype.toString()
var TAG$1=_wks('toStringTag');// ES3 wrong here
var ARG=_cof(function(){return arguments;}())=='Arguments';// fallback for IE11 Script Access Denied error
var tryGet=function(it,key){try{return it[key];}catch(e){/* empty */}};var _classof=function(it){var O,T,B;return it===undefined?'Undefined':it===null?'Null'// @@toStringTag case
:typeof(T=tryGet(O=Object(it),TAG$1))=='string'?T// builtinTag case
:ARG?_cof(O)// ES3 arguments fallback
:(B=_cof(O))=='Object'&&typeof O.callee=='function'?'Arguments':B;};var _anInstance=function(it,Constructor,name,forbiddenField){if(!(it instanceof Constructor)||forbiddenField!==undefined&&forbiddenField in it){throw TypeError(name+': incorrect invocation!');}return it;};// call something on iterator step with safe closing on error
var _iterCall=function(iterator,fn,value,entries){try{return entries?fn(_anObject(value)[0],value[1]):fn(value);// 7.4.6 IteratorClose(iterator, completion)
}catch(e){var ret=iterator['return'];if(ret!==undefined)_anObject(ret.call(iterator));throw e;}};// check on default Array iterator
var ITERATOR$1=_wks('iterator');var ArrayProto=Array.prototype;var _isArrayIter=function(it){return it!==undefined&&(_iterators.Array===it||ArrayProto[ITERATOR$1]===it);};var ITERATOR$2=_wks('iterator');var core_getIteratorMethod=_core.getIteratorMethod=function(it){if(it!=undefined)return it[ITERATOR$2]||it['@@iterator']||_iterators[_classof(it)];};var _forOf=createCommonjsModule(function(module){var BREAK={};var RETURN={};var exports=module.exports=function(iterable,entries,fn,that,ITERATOR){var iterFn=ITERATOR?function(){return iterable;}:core_getIteratorMethod(iterable);var f=_ctx(fn,that,entries?2:1);var index=0;var length,step,iterator,result;if(typeof iterFn!='function')throw TypeError(iterable+' is not iterable!');// fast case for arrays with default iterator
if(_isArrayIter(iterFn))for(length=_toLength(iterable.length);length>index;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=_global.navigator;var _userAgent=navigator&&navigator.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;i<arguments.length;i++){var source=arguments[i]!=null?arguments[i]:{};var ownKeys=keys$1(source);if(typeof getOwnPropertySymbols$1==='function'){ownKeys=ownKeys.concat(getOwnPropertySymbols$1(source).filter(function(sym){return getOwnPropertyDescriptor$1(source,sym).enumerable;}));}ownKeys.forEach(function(key){defineProperty$3(target,key,source[key]);});}return target;}var objectSpread=_objectSpread$1;function _classCallCheck$1(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}var classCallCheck=_classCallCheck$1;// Works with __proto__ only. Old v8 can't work with null proto objects.
/* eslint-disable no-proto */var check=function(O,proto){_anObject(O);if(!_isObject(proto)&&proto!==null)throw TypeError(proto+": can't set as prototype!");};var _setProto={set:Object.setPrototypeOf||('__proto__'in{}?// eslint-disable-line
function(test,buggy,set){try{set=_ctx(Function.call,_objectGopd.f(Object.prototype,'__proto__').set,2);set(test,[]);buggy=!(test instanceof Array);}catch(e){buggy=true;}return function setPrototypeOf(O,proto){check(O,proto);if(buggy)O.__proto__=proto;else set(O,proto);return O;};}({},false):undefined),check:check};// 19.1.3.19 Object.setPrototypeOf(O, proto)
_export(_export.S,'Object',{setPrototypeOf:_setProto.set});var setPrototypeOf=_core.Object.setPrototypeOf;var setPrototypeOf$1=setPrototypeOf;var setPrototypeOf$2=createCommonjsModule(function(module){function _setPrototypeOf$$1(o,p){module.exports=_setPrototypeOf$$1=setPrototypeOf$1||function _setPrototypeOf$$1(o,p){o.__proto__=p;return o;};return _setPrototypeOf$$1(o,p);}module.exports=_setPrototypeOf$$1;});function _inherits$1(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function");}setPrototypeOf$2(subClass.prototype,superClass&&superClass.prototype);if(superClass)setPrototypeOf$2(subClass,superClass);}var inherits=_inherits$1;function _defineProperties$1(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;defineProperty$2(target,descriptor.key,descriptor);}}function _createClass$1(Constructor,protoProps,staticProps){if(protoProps)_defineProperties$1(Constructor.prototype,protoProps);if(staticProps)_defineProperties$1(Constructor,staticProps);return Constructor;}var createClass=_createClass$1;var iterator=_wksExt.f('iterator');var iterator$1=iterator;_wksDefine('asyncIterator');_wksDefine('observable');var symbol=_core.Symbol;var symbol$1=symbol;var _typeof_1=createCommonjsModule(function(module){function _typeof2(obj){if(typeof symbol$1==="function"&&typeof iterator$1==="symbol"){_typeof2=function _typeof2(obj){return typeof obj;};}else{_typeof2=function _typeof2(obj){return obj&&typeof symbol$1==="function"&&obj.constructor===symbol$1&&obj!==symbol$1.prototype?"symbol":typeof obj;};}return _typeof2(obj);}function _typeof$$1(obj){if(typeof symbol$1==="function"&&_typeof2(iterator$1)==="symbol"){module.exports=_typeof$$1=function _typeof$$1(obj){return _typeof2(obj);};}else{module.exports=_typeof$$1=function _typeof$$1(obj){return obj&&typeof symbol$1==="function"&&obj.constructor===symbol$1&&obj!==symbol$1.prototype?"symbol":_typeof2(obj);};}return _typeof$$1(obj);}module.exports=_typeof$$1;});function _assertThisInitialized$1(self){if(self===void 0){throw new ReferenceError("this hasn't been initialised - super() hasn't been called");}return self;}var assertThisInitialized=_assertThisInitialized$1;function _possibleConstructorReturn$1(self,call){if(call&&(_typeof_1(call)==="object"||typeof call==="function")){return call;}return assertThisInitialized(self);}var possibleConstructorReturn=_possibleConstructorReturn$1;// 19.1.2.9 Object.getPrototypeOf(O)
_objectSap('getPrototypeOf',function(){return function getPrototypeOf(it){return _objectGpo(_toObject(it));};});var getPrototypeOf=_core.Object.getPrototypeOf;var getPrototypeOf$1=getPrototypeOf;var getPrototypeOf$2=createCommonjsModule(function(module){function _getPrototypeOf$$1(o){module.exports=_getPrototypeOf$$1=getPrototypeOf$1||function _getPrototypeOf$$1(o){return o.__proto__;};return _getPrototypeOf$$1(o);}module.exports=_getPrototypeOf$$1;});var extend=function extend(object){for(var _len=arguments.length,extensions=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++){extensions[_key-1]=arguments[_key];}// $.extend alternative, ... is the spread operator.
for(var _i=0;_i<extensions.length;_i++){var extension=extensions[_i];// console.log(extension);
// console.log(typeof extension);
if(!extension)continue;// Ignore null and undefined objects and parameters.
var _iteratorNormalCompletion=true;var _didIteratorError=false;var _iteratorError=undefined;try{for(var _iterator=Object.getOwnPropertyNames(extension)[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true){var prop=_step.value;// Do not traverse the prototype chain.
if(object[prop]!==undefined&&extension[prop]&&object[prop].toString()==='[object Object]'&&extension[prop].toString()==='[object Object]'){// Goes deep only if object[prop] and extension[prop] are both objects !
if(object[prop].constructor===Object)extend(object[prop],extension[prop]);}else object[prop]=typeof object[prop]==='undefined'?extension[prop]:object[prop];if(typeof object[prop]==='undefined'&&Array.isArray(extension[prop]))object[prop]=extension[prop].slice();// Add values that do not already exist.
else if(typeof object[prop]==='undefined'&&Array.isArray(extension[prop]))object[prop]=extension[prop];}}catch(err){_didIteratorError=true;_iteratorError=err;}finally{try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return();}}finally{if(_didIteratorError){throw _iteratorError;}}}}return object;};var instruct=function instruct(array,instArray){var tempObject={};for(var i=0,max=instArray.length;i<max;i++){var guide=instArray[i];tempObject[guide]=array[i];}return tempObject;};var transformData=function transformData(object,instructions){for(var key in instructions){if(Array.isArray(object[key]))object[key]=instruct(object[key],instructions[key]);else if(object[key]instanceof Object&&!Array.isArray(instructions[key]))object[key]=transformData(object[key],instructions[key]);}return object;};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('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<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(){}Object.assign(EventDispatcher.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=listenerArray.slice(0);for(var i=0,l=array.length;i<l;i++){array[i].call(this,event);}}}});var REVISION='92';var MOUSE={LEFT:0,MIDDLE:1,RIGHT:2};var CullFaceNone=0;var CullFaceBack=1;var CullFaceFront=2;var PCFShadowMap=1;var PCFSoftShadowMap=2;var FrontSide=0;var BackSide=1;var DoubleSide=2;var FlatShading=1;var NoColors=0;var FaceColors=1;var VertexColors=2;var NoBlending=0;var NormalBlending=1;var AdditiveBlending=2;var SubtractiveBlending=3;var MultiplyBlending=4;var CustomBlending=5;var AddEquation=100;var SubtractEquation=101;var ReverseSubtractEquation=102;var MinEquation=103;var MaxEquation=104;var ZeroFactor=200;var OneFactor=201;var SrcColorFactor=202;var OneMinusSrcColorFactor=203;var SrcAlphaFactor=204;var OneMinusSrcAlphaFactor=205;var DstAlphaFactor=206;var OneMinusDstAlphaFactor=207;var DstColorFactor=208;var OneMinusDstColorFactor=209;var SrcAlphaSaturateFactor=210;var NeverDepth=0;var AlwaysDepth=1;var LessDepth=2;var LessEqualDepth=3;var EqualDepth=4;var GreaterEqualDepth=5;var GreaterDepth=6;var NotEqualDepth=7;var MultiplyOperation=0;var MixOperation=1;var AddOperation=2;var NoToneMapping=0;var LinearToneMapping=1;var ReinhardToneMapping=2;var Uncharted2ToneMapping=3;var CineonToneMapping=4;var UVMapping=300;var CubeReflectionMapping=301;var CubeRefractionMapping=302;var EquirectangularReflectionMapping=303;var EquirectangularRefractionMapping=304;var SphericalReflectionMapping=305;var CubeUVReflectionMapping=306;var CubeUVRefractionMapping=307;var RepeatWrapping=1000;var ClampToEdgeWrapping=1001;var MirroredRepeatWrapping=1002;var NearestFilter=1003;var NearestMipMapNearestFilter=1004;var NearestMipMapLinearFilter=1005;var LinearFilter=1006;var LinearMipMapNearestFilter=1007;var LinearMipMapLinearFilter=1008;var UnsignedByteType=1009;var ByteType=1010;var ShortType=1011;var UnsignedShortType=1012;var IntType=1013;var UnsignedIntType=1014;var FloatType=1015;var HalfFloatType=1016;var UnsignedShort4444Type=1017;var UnsignedShort5551Type=1018;var UnsignedShort565Type=1019;var UnsignedInt248Type=1020;var AlphaFormat=1021;var RGBFormat=1022;var RGBAFormat=1023;var LuminanceFormat=1024;var LuminanceAlphaFormat=1025;var DepthFormat=1026;var DepthStencilFormat=1027;var RGB_S3TC_DXT1_Format=33776;var RGBA_S3TC_DXT1_Format=33777;var RGBA_S3TC_DXT3_Format=33778;var RGBA_S3TC_DXT5_Format=33779;var RGB_PVRTC_4BPPV1_Format=35840;var RGB_PVRTC_2BPPV1_Format=35841;var RGBA_PVRTC_4BPPV1_Format=35842;var RGBA_PVRTC_2BPPV1_Format=35843;var RGB_ETC1_Format=36196;var RGBA_ASTC_4x4_Format=37808;var RGBA_ASTC_5x4_Format=37809;var RGBA_ASTC_5x5_Format=37810;var RGBA_ASTC_6x5_Format=37811;var RGBA_ASTC_6x6_Format=37812;var RGBA_ASTC_8x5_Format=37813;var RGBA_ASTC_8x6_Format=37814;var RGBA_ASTC_8x8_Format=37815;var RGBA_ASTC_10x5_Format=37816;var RGBA_ASTC_10x6_Format=37817;var RGBA_ASTC_10x8_Format=37818;var RGBA_ASTC_10x10_Format=37819;var RGBA_ASTC_12x10_Format=37820;var RGBA_ASTC_12x12_Format=37821;var LoopOnce=2200;var LoopRepeat=2201;var LoopPingPong=2202;var InterpolateDiscrete=2300;var InterpolateLinear=2301;var InterpolateSmooth=2302;var ZeroCurvatureEnding=2400;var ZeroSlopeEnding=2401;var WrapAroundEnding=2402;var TrianglesDrawMode=0;var TriangleStripDrawMode=1;var TriangleFanDrawMode=2;var LinearEncoding=3000;var sRGBEncoding=3001;var GammaEncoding=3007;var RGBEEncoding=3002;var RGBM7Encoding=3004;var RGBM16Encoding=3005;var RGBDEncoding=3006;var BasicDepthPacking=3200;var RGBADepthPacking=3201;/**
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
*/var _Math={DEG2RAD:Math.PI/180,RAD2DEG:180/Math.PI,generateUUID:function(){// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136
var lut=[];for(var i=0;i<256;i++){lut[i]=(i<16?'0':'')+i.toString(16);}return function generateUUID(){var d0=Math.random()*0xffffffff|0;var d1=Math.random()*0xffffffff|0;var d2=Math.random()*0xffffffff|0;var d3=Math.random()*0xffffffff|0;var uuid=lut[d0&0xff]+lut[d0>>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 <a1, a2> to range <b1, b2>
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 <low, high> interval
randInt:function(low,high){return low+Math.floor(Math.random()*(high-low+1));},// Random float from <low, high> 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<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();var matrix=new Matrix4();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 mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
* @author WestLangley / http://github.com/WestLangley
* @author bhouston / http://clara.io
*/function Quaternion(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,{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.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(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(){// 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;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;},setUvTransform:function(tx,ty,sx,sy,rotation,cx,cy){var c=Math.cos(rotation);var s=Math.sin(rotation);this.set(sx*c,sx*s,-sx*(c*cx+s*cy)+cx+tx,-sy*s,sy*c,-sy*(-s*cx+c*cy)+cy+ty,0,0,1);},scale:function(sx,sy){var te=this.elements;te[0]*=sx;te[3]*=sx;te[6]*=sx;te[1]*=sy;te[4]*=sy;te[7]*=sy;return this;},rotate:function(theta){var c=Math.cos(theta);var s=Math.sin(theta);var te=this.elements;var a11=te[0],a12=te[3],a13=te[6];var a21=te[1],a22=te[4],a23=te[7];te[0]=c*a11+s*a21;te[3]=c*a12+s*a22;te[6]=c*a13+s*a23;te[1]=-s*a11+c*a21;te[4]=-s*a12+c*a22;te[7]=-s*a13+c*a23;return this;},translate:function(tx,ty){var te=this.elements;te[0]+=tx*te[2];te[3]+=tx*te[5];te[6]+=tx*te[8];te[1]+=ty*te[2];te[4]+=ty*te[5];te[7]+=ty*te[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 mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
* @author szimek / https://github.com/szimek/
*/var textureId=0;function Texture(image,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy,encoding){Object.defineProperty(this,'id',{value:textureId++});this.uuid=_Math.generateUUID();this.name='';this.image=image!==undefined?image:Texture.DEFAULT_IMAGE;this.mipmaps=[];this.mapping=mapping!==undefined?mapping:Texture.DEFAULT_MAPPING;this.wrapS=wrapS!==undefined?wrapS:ClampToEdgeWrapping;this.wrapT=wrapT!==undefined?wrapT:ClampToEdgeWrapping;this.magFilter=magFilter!==undefined?magFilter:LinearFilter;this.minFilter=minFilter!==undefined?minFilter:LinearMipMapLinearFilter;this.anisotropy=anisotropy!==undefined?anisotropy:1;this.format=format!==undefined?format:RGBAFormat;this.type=type!==undefined?type:UnsignedByteType;this.offset=new Vector2(0,0);this.repeat=new Vector2(1,1);this.center=new Vector2(0,0);this.rotation=0;this.matrixAutoUpdate=true;this.matrix=new Matrix3();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;this.version=0;this.onUpdate=null;}Texture.DEFAULT_IMAGE=undefined;Texture.DEFAULT_MAPPING=UVMapping;Texture.prototype=Object.assign(Object.create(EventDispatcher.prototype),{constructor:Texture,isTexture:true,updateMatrix:function(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y);},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.center.copy(source.center);this.rotation=source.rotation;this.matrixAutoUpdate=source.matrixAutoUpdate;this.matrix.copy(source.matrix);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){var isRootObject=meta===undefined||typeof meta==='string';if(!isRootObject&&meta.textures[this.uuid]!==undefined){return meta.textures[this.uuid];}function getDataURL(image){var canvas;if(image instanceof HTMLCanvasElement){canvas=image;}else{canvas=document.createElementNS('http://www.w3.org/1999/xhtml','canvas');canvas.width=image.width;canvas.height=image.height;var context=canvas.getContext('2d');if(image instanceof ImageData){context.putImageData(image,0,0);}else{context.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],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)<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){// 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));this.w=Math.max(min.w,Math.min(max.w,this.w));return this;},clampScalar:function(){var min,max;return function clampScalar(minVal,maxVal){if(min===undefined){min=new Vector4();max=new Vector4();}min.set(minVal,minVal,minVal,minVal);max.set(maxVal,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);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);},manhattanLength: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()||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;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(width,height,options){this.width=width;this.height=height;this.scissor=new Vector4(0,0,width,height);this.scissorTest=false;this.viewport=new Vector4(0,0,width,height);options=options||{};if(options.minFilter===undefined)options.minFilter=LinearFilter;this.texture=new Texture(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;}WebGLRenderTarget.prototype=Object.assign(Object.create(EventDispatcher.prototype),{constructor:WebGLRenderTarget,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(width,height,options){WebGLRenderTarget.call(this,width,height,options);this.activeCubeFace=0;// PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5
this.activeMipMapLevel=0;}WebGLRenderTargetCube.prototype=Object.create(WebGLRenderTarget.prototype);WebGLRenderTargetCube.prototype.constructor=WebGLRenderTargetCube;WebGLRenderTargetCube.prototype.isWebGLRenderTargetCube=true;/**
* @author alteredq / http://alteredqualia.com/
*/function DataTexture(data,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={data:data,width:width,height:height};this.magFilter=magFilter!==undefined?magFilter:NearestFilter;this.minFilter=minFilter!==undefined?minFilter:NearestFilter;this.generateMipmaps=false;this.flipY=false;this.unpackAlignment=1;}DataTexture.prototype=Object.create(Texture.prototype);DataTexture.prototype.constructor=DataTexture;DataTexture.prototype.isDataTexture=true;/**
* @author bhouston / http://clara.io
* @author WestLangley / http://github.com/WestLangley
*/function Box3(min,max){this.min=min!==undefined?min:new Vector3(+Infinity,+Infinity,+Infinity);this.max=max!==undefined?max:new Vector3(-Infinity,-Infinity,-Infinity);}Object.assign(Box3.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();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(target){if(target===undefined){console.warn('THREE.Box3: .getCenter() target is now required');target=new Vector3();}return this.isEmpty()?target.set(0,0,0):target.addVectors(this.min,this.max).multiplyScalar(0.5);},getSize:function(target){if(target===undefined){console.warn('THREE.Box3: .getSize() target is now required');target=new Vector3();}return this.isEmpty()?target.set(0,0,0):target.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 scope,i,l;var v1=new Vector3();function traverse(node){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 function expandByObject(object){scope=this;object.updateMatrixWorld(true);object.traverse(traverse);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,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.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();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;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){return Math.abs(plane.distanceToPoint(this.center))<=this.radius;},clampPoint:function(point,target){var deltaLengthSq=this.center.distanceToSquared(point);if(target===undefined){console.warn('THREE.Sphere: .clampPoint() target is now required');target=new Vector3();}target.copy(point);if(deltaLengthSq>this.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(distance<negRadius){return false;}}return true;},intersectsBox:function(){var p1=new Vector3(),p2=new Vector3();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;}});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 <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}\n";var depth_frag="#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\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 <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n";var distanceRGBA_frag="#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\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 <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}\n";var equirect_frag="uniform sampler2D tEquirect;\nvarying vec3 vWorldPosition;\n#include <common>\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 <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n";var linedashed_frag="uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\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 <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n";var linedashed_vert="uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}\n";var meshbasic_frag="uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\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 <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n";var meshbasic_vert="#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\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 <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_pars_maps>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\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 <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include <lightmap_fragment>\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 <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n";var meshlambert_vert="#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_pars_maps>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n";var meshphong_frag="#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_pars_maps>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\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 <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n";var meshphong_vert="#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\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 <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <lights_pars_begin>\n#include <lights_pars_maps>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\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 <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n";var meshphysical_vert="#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\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 <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\nvoid main() {\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\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 <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\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 <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n";var points_vert="uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <project_vertex>\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 <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n";var shadow_frag="uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <fog_fragment>\n}\n";var shadow_vert="#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\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<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;}};/**
* @author mrdoob / http://mrdoob.com/
*/var ColorKeywords={'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,'rebeccapurple':0x663399,'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(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.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.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+(g<b?6:0);break;case g:hue=(b-r)/delta+2;break;case b:hue=(r-g)/delta+4;break;}hue/=6;}target.h=hue;target.s=saturation;target.l=lightness;return target;},getStyle:function(){return 'rgb('+(this.r*255|0)+','+(this.g*255|0)+','+(this.b*255|0)+')';},offsetHSL:function(){var hsl={};return function(h,s,l){this.getHSL(hsl);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={common:{diffuse:{value:new Color(0xeeeeee)},opacity:{value:1.0},map:{value:null},uvTransform:{value:new Matrix3()},alphaMap:{value:null}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1.0},refractionRatio:{value:0.98},maxMipLevel:{value:0}},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)}},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(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:{},shadowCameraNear:{},shadowCameraFar:{}}},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(0xeeeeee)},opacity:{value:1.0},size:{value:1.0},scale:{value:1.0},map:{value:null},uvTransform:{value:new Matrix3()}}};/**
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
* @author mikael emtinger / http://gomo.se/
*/var ShaderLib={basic:{uniforms:UniformsUtils.merge([UniformsLib.common,UniformsLib.specularmap,UniformsLib.envmap,UniformsLib.aomap,UniformsLib.lightmap,UniformsLib.fog]),vertexShader:ShaderChunk.meshbasic_vert,fragmentShader:ShaderChunk.meshbasic_frag},lambert:{uniforms:UniformsUtils.merge([UniformsLib.common,UniformsLib.specularmap,UniformsLib.envmap,UniformsLib.aomap,UniformsLib.lightmap,UniformsLib.emissivemap,UniformsLib.fog,UniformsLib.lights,{emissive:{value:new Color(0x000000)}}]),vertexShader:ShaderChunk.meshlambert_vert,fragmentShader:ShaderChunk.meshlambert_frag},phong:{uniforms:UniformsUtils.merge([UniformsLib.common,UniformsLib.specularmap,UniformsLib.envmap,UniformsLib.aomap,UniformsLib.lightmap,UniformsLib.emissivemap,UniformsLib.bumpmap,UniformsLib.normalmap,UniformsLib.displacementmap,UniformsLib.gradientmap,UniformsLib.fog,UniformsLib.lights,{emissive:{value:new Color(0x000000)},specular:{value:new Color(0x111111)},shininess:{value:30}}]),vertexShader:ShaderChunk.meshphong_vert,fragmentShader:ShaderChunk.meshphong_frag},standard:{uniforms:UniformsUtils.merge([UniformsLib.common,UniformsLib.envmap,UniformsLib.aomap,UniformsLib.lightmap,UniformsLib.emissivemap,UniformsLib.bumpmap,UniformsLib.normalmap,UniformsLib.displacementmap,UniformsLib.roughnessmap,UniformsLib.metalnessmap,UniformsLib.fog,UniformsLib.lights,{emissive:{value:new Color(0x000000)},roughness:{value:0.5},metalness:{value:0.5},envMapIntensity:{value:1// temporary
}}]),vertexShader:ShaderChunk.meshphysical_vert,fragmentShader:ShaderChunk.meshphysical_frag},points:{uniforms:UniformsUtils.merge([UniformsLib.points,UniformsLib.fog]),vertexShader:ShaderChunk.points_vert,fragmentShader:ShaderChunk.points_frag},dashed:{uniforms:UniformsUtils.merge([UniformsLib.common,UniformsLib.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:ShaderChunk.linedashed_vert,fragmentShader:ShaderChunk.linedashed_frag},depth:{uniforms:UniformsUtils.merge([UniformsLib.common,UniformsLib.displacementmap]),vertexShader:ShaderChunk.depth_vert,fragmentShader:ShaderChunk.depth_frag},normal:{uniforms:UniformsUtils.merge([UniformsLib.common,UniformsLib.bumpmap,UniformsLib.normalmap,UniformsLib.displacementmap,{opacity:{value:1.0}}]),vertexShader:ShaderChunk.normal_vert,fragmentShader:ShaderChunk.normal_frag},/* -------------------------------------------------------------------------
// Cube map shader
------------------------------------------------------------------------- */cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1.0}},vertexShader:ShaderChunk.cube_vert,fragmentShader:ShaderChunk.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:ShaderChunk.equirect_vert,fragmentShader:ShaderChunk.equirect_frag},distanceRGBA:{uniforms:UniformsUtils.merge([UniformsLib.common,UniformsLib.displacementmap,{referencePosition:{value:new Vector3()},nearDistance:{value:1},farDistance:{value:1000}}]),vertexShader:ShaderChunk.distanceRGBA_vert,fragmentShader:ShaderChunk.distanceRGBA_frag},shadow:{uniforms:UniformsUtils.merge([UniformsLib.lights,UniformsLib.fog,{color:{value:new Color(0x00000)},opacity:{value:1.0}}]),vertexShader:ShaderChunk.shadow_vert,fragmentShader:ShaderChunk.shadow_frag}};ShaderLib.physical={uniforms:UniformsUtils.merge([ShaderLib.standard.uniforms,{clearCoat:{value:0},clearCoatRoughness:{value:0}}]),vertexShader:ShaderChunk.meshphysical_vert,fragmentShader:ShaderChunk.meshphysical_frag};/**
* @author mrdoob / http://mrdoob.com/
*/function WebGLAttributes(gl){var buffers=new WeakMap();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('THREE.WebGLAttributes: 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=-1;// reset range
}}//
function get(attribute){if(attribute.isInterleavedBufferAttribute)attribute=attribute.data;return buffers.get(attribute);}function remove(attribute){if(attribute.isInterleavedBufferAttribute)attribute=attribute.data;var data=buffers.get(attribute);if(data){gl.deleteBuffer(data.buffer);buffers.delete(attribute);}}function update(attribute,bufferType){if(attribute.isInterleavedBufferAttribute)attribute=attribute.data;var data=buffers.get(attribute);if(data===undefined){buffers.set(attribute,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/
* @author WestLangley / http://github.com/WestLangley
* @author bhouston / http://clara.io
*/function Euler(x,y,z,order){this._x=x||0;this._y=y||0;this._z=z||0;this._order=order||Euler.DefaultOrder;}Euler.RotationOrders=['XYZ','YZX','ZXY','XZY','YXZ','ZYX'];Euler.DefaultOrder='XYZ';Object.defineProperties(Euler.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.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.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();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();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(this._x,this._y,this._z);}},onChange:function(callback){this.onChangeCallback=callback;return this;},onChangeCallback:function(){}});/**
* @author mrdoob / http://mrdoob.com/
*/function Layers(){this.mask=1|0;}Object.assign(Layers.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=0;function Object3D(){Object.defineProperty(this,'id',{value:object3DId++});this.uuid=_Math.generateUUID();this.name='';this.type='Object3D';this.parent=null;this.children=[];this.up=Object3D.DefaultUp.clone();var position=new Vector3();var rotation=new Euler();var quaternion=new Quaternion();var scale=new Vector3(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()},normalMatrix:{value:new Matrix3()}});this.matrix=new Matrix4();this.matrixWorld=new Matrix4();this.matrixAutoUpdate=Object3D.DefaultMatrixAutoUpdate;this.matrixWorldNeedsUpdate=false;this.layers=new Layers();this.visible=true;this.castShadow=false;this.receiveShadow=false;this.frustumCulled=true;this.renderOrder=0;this.userData={};}Object3D.DefaultUp=new Vector3(0,1,0);Object3D.DefaultMatrixAutoUpdate=true;Object3D.prototype=Object.assign(Object.create(EventDispatcher.prototype),{constructor:Object3D,isObject3D:true,onBeforeRender:function(){},onAfterRender:function(){},applyMatrix:function(matrix){this.matrix.multiplyMatrices(matrix,this.matrix);this.matrix.decompose(this.position,this.quaternion,this.scale);},applyQuaternion:function(q){this.quaternion.premultiply(q);return this;},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();return function rotateOnAxis(axis,angle){q1.setFromAxisAngle(axis,angle);this.quaternion.multiply(q1);return this;};}(),rotateOnWorldAxis:function(){// rotate object on axis in world space
// axis is assumed to be normalized
// method assumes no rotated parent
var q1=new Quaternion();return function rotateOnWorldAxis(axis,angle){q1.setFromAxisAngle(axis,angle);this.quaternion.premultiply(q1);return this;};}(),rotateX:function(){var v1=new Vector3(1,0,0);return function rotateX(angle){return this.rotateOnAxis(v1,angle);};}(),rotateY:function(){var v1=new Vector3(0,1,0);return function rotateY(angle){return this.rotateOnAxis(v1,angle);};}(),rotateZ:function(){var v1=new Vector3(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();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,0,0);return function translateX(distance){return this.translateOnAxis(v1,distance);};}(),translateY:function(){var v1=new Vector3(0,1,0);return function translateY(distance){return this.translateOnAxis(v1,distance);};}(),translateZ:function(){var v1=new Vector3(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();return function worldToLocal(vector){return vector.applyMatrix4(m1.getInverse(this.matrixWorld));};}(),lookAt:function(){// This method does not support objects with rotated and/or translated parent(s)
var m1=new Matrix4();var vector=new Vector3();return function lookAt(x,y,z){if(x.isVector3){vector.copy(x);}else{vector.set(x,y,z);}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]);}return this;}var index=this.children.indexOf(object);if(index!==-1){object.parent=null;object.dispatchEvent({type:'removed'});this.children.splice(index,1);}return this;},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(target){if(target===undefined){console.warn('THREE.Object3D: .getWorldPosition() target is now required');target=new Vector3();}this.updateMatrixWorld(true);return target.setFromMatrixPosition(this.matrixWorld);},getWorldQuaternion:function(){var position=new Vector3();var scale=new Vector3();return function getWorldQuaternion(target){if(target===undefined){console.warn('THREE.Object3D: .getWorldQuaternion() target is now required');target=new Quaternion();}this.updateMatrixWorld(true);this.matrixWorld.decompose(position,target,scale);return target;};}(),getWorldScale:function(){var position=new Vector3();var quaternion=new Quaternion();return function getWorldScale(target){if(target===undefined){console.warn('THREE.Object3D: .getWorldScale() target is now required');target=new Vector3();}this.updateMatrixWorld(true);this.matrixWorld.decompose(position,quaternion,target);return target;};}(),getWorldDirection:function(){var quaternion=new Quaternion();return function getWorldDirection(target){if(target===undefined){console.warn('THREE.Object3D: .getWorldDirection() target is now required');target=new Vector3();}this.getWorldQuaternion(quaternion);return target.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 a string when called from JSON.stringify
var isRootObject=meta===undefined||typeof meta==='string';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:{},shapes:{}};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(this.castShadow===true)object.castShadow=true;if(this.receiveShadow===true)object.receiveShadow=true;if(this.visible===false)object.visible=false;if(this.frustumCulled===false)object.frustumCulled=false;if(this.renderOrder!==0)object.renderOrder=this.renderOrder;if(JSON.stringify(this.userData)!=='{}')object.userData=this.userData;object.matrix=this.matrix.toArray();if(this.matrixAutoUpdate===false)object.matrixAutoUpdate=false;//
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);var parameters=this.geometry.parameters;if(parameters!==undefined&&parameters.shapes!==undefined){var shapes=parameters.shapes;if(Array.isArray(shapes)){for(var i=0,l=shapes.length;i<l;i++){var shape=shapes[i];serialize(meta.shapes,shape);}}else{serialize(meta.shapes,shapes);}}}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);var shapes=extractFromCache(meta.shapes);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;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;i<source.children.length;i++){var child=source.children[i];this.add(child.clone());}}return this;}});/**
* @author mrdoob / http://mrdoob.com/
* @author mikael emtinger / http://gomo.se/
* @author WestLangley / http://github.com/WestLangley
*/function Camera(){Object3D.call(this);this.type='Camera';this.matrixWorldInverse=new Matrix4();this.projectionMatrix=new Matrix4();}Camera.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:Camera,isCamera:true,copy:function(source,recursive){Object3D.prototype.copy.call(this,source,recursive);this.matrixWorldInverse.copy(source.matrixWorldInverse);this.projectionMatrix.copy(source.projectionMatrix);return this;},getWorldDirection:function(){var quaternion=new Quaternion();return function getWorldDirection(target){if(target===undefined){console.warn('THREE.Camera: .getWorldDirection() target is now required');target=new Vector3();}this.getWorldQuaternion(quaternion);return target.set(0,0,-1).applyQuaternion(quaternion);};}(),updateMatrixWorld:function(force){Object3D.prototype.updateMatrixWorld.call(this,force);this.matrixWorldInverse.getInverse(this.matrixWorld);},clone:function(){return new this.constructor().copy(this);}});/**
* @author alteredq / http://alteredqualia.com/
* @author arose / http://github.com/arose
*/function OrthographicCamera(left,right,top,bottom,near,far){Camera.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.prototype=Object.assign(Object.create(Camera.prototype),{constructor:OrthographicCamera,isOrthographicCamera:true,copy:function(source,recursive){Camera.prototype.copy.call(this,source,recursive);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){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 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&&this.view.enabled){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.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/
* @author alteredq / http://alteredqualia.com/
*/function Face3(a,b,c,normal,color,materialIndex){this.a=a;this.b=b;this.c=c;this.normal=normal&&normal.isVector3?normal:new Vector3();this.vertexNormals=Array.isArray(normal)?normal:[];this.color=color&&color.isColor?color:new Color();this.vertexColors=Array.isArray(color)?color:[];this.materialIndex=materialIndex!==undefined?materialIndex:0;}Object.assign(Face3.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 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 geometryId=0;// Geometry uses even numbers as Id
function Geometry(){Object.defineProperty(this,'id',{value:geometryId+=2});this.uuid=_Math.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;}Geometry.prototype=Object.assign(Object.create(EventDispatcher.prototype),{constructor:Geometry,isGeometry:true,applyMatrix:function(matrix){var normalMatrix=new Matrix3().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();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);};}(),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(positions[i],positions[i+1],positions[i+2]));if(normals!==undefined){tempNormals.push(new Vector3(normals[i],normals[i+1],normals[i+2]));}if(colors!==undefined){scope.colors.push(new Color(colors[i],colors[i+1],colors[i+2]));}if(uvs!==undefined){tempUVs.push(new Vector2(uvs[j],uvs[j+1]));}if(uvs2!==undefined){tempUVs2.push(new Vector2(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(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(){var offset=new Vector3();return function center(){this.computeBoundingBox();this.boundingBox.getCenter(offset).negate();this.translate(offset.x,offset.y,offset.z);return this;};}(),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();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(),ab=new Vector3();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();}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(),ab=new Vector3();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();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();vertexNormals={a:new Vector3(),b:new Vector3(),c:new Vector3()};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;}},computeBoundingBox:function(){if(this.boundingBox===null){this.boundingBox=new Box3();}this.boundingBox.setFromPoints(this.vertices);},computeBoundingSphere:function(){if(this.boundingSphere===null){this.boundingSphere=new Sphere();}this.boundingSphere.setFromPoints(this.vertices);},merge:function(geometry,matrix,materialIndexOffset){if(!(geometry&&geometry.isGeometry)){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().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(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)){console.error('THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.',mesh);return;}if(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;},setFromPoints:function(points){this.vertices=[];for(var i=0,l=points.length;i<l;i++){var point=points[i];this.vertices.push(new Vector3(point.x,point.y,point.z||0));}return this;},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().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 mrdoob / http://mrdoob.com/
*/function BufferAttribute(array,itemSize,normalized){if(Array.isArray(array)){throw new TypeError('THREE.BufferAttribute: array should be a Typed Array.');}this.name='';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.version=0;}Object.defineProperty(BufferAttribute.prototype,'needsUpdate',{set:function(value){if(value===true)this.version++;}});Object.assign(BufferAttribute.prototype,{isBufferAttribute: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.itemSize:0;this.array=array;return this;},setDynamic:function(value){this.dynamic=value;return this;},copy:function(source){this.name=source.name;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();}array[offset++]=color.r;array[offset++]=color.g;array[offset++]=color.b;}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();}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();}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();}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(array,itemSize,normalized){BufferAttribute.call(this,new Int8Array(array),itemSize,normalized);}Int8BufferAttribute.prototype=Object.create(BufferAttribute.prototype);Int8BufferAttribute.prototype.constructor=Int8BufferAttribute;function Uint8BufferAttribute(array,itemSize,normalized){BufferAttribute.call(this,new Uint8Array(array),itemSize,normalized);}Uint8BufferAttribute.prototype=Object.create(BufferAttribute.prototype);Uint8BufferAttribute.prototype.constructor=Uint8BufferAttribute;function Uint8ClampedBufferAttribute(array,itemSize,normalized){BufferAttribute.call(this,new Uint8ClampedArray(array),itemSize,normalized);}Uint8ClampedBufferAttribute.prototype=Object.create(BufferAttribute.prototype);Uint8ClampedBufferAttribute.prototype.constructor=Uint8ClampedBufferAttribute;function Int16BufferAttribute(array,itemSize,normalized){BufferAttribute.call(this,new Int16Array(array),itemSize,normalized);}Int16BufferAttribute.prototype=Object.create(BufferAttribute.prototype);Int16BufferAttribute.prototype.constructor=Int16BufferAttribute;function Uint16BufferAttribute(array,itemSize,normalized){BufferAttribute.call(this,new Uint16Array(array),itemSize,normalized);}Uint16BufferAttribute.prototype=Object.create(BufferAttribute.prototype);Uint16BufferAttribute.prototype.constructor=Uint16BufferAttribute;function Int32BufferAttribute(array,itemSize,normalized){BufferAttribute.call(this,new Int32Array(array),itemSize,normalized);}Int32BufferAttribute.prototype=Object.create(BufferAttribute.prototype);Int32BufferAttribute.prototype.constructor=Int32BufferAttribute;function Uint32BufferAttribute(array,itemSize,normalized){BufferAttribute.call(this,new Uint32Array(array),itemSize,normalized);}Uint32BufferAttribute.prototype=Object.create(BufferAttribute.prototype);Uint32BufferAttribute.prototype.constructor=Uint32BufferAttribute;function Float32BufferAttribute(array,itemSize,normalized){BufferAttribute.call(this,new Float32Array(array),itemSize,normalized);}Float32BufferAttribute.prototype=Object.create(BufferAttribute.prototype);Float32BufferAttribute.prototype.constructor=Float32BufferAttribute;function Float64BufferAttribute(array,itemSize,normalized){BufferAttribute.call(this,new Float64Array(array),itemSize,normalized);}Float64BufferAttribute.prototype=Object.create(BufferAttribute.prototype);Float64BufferAttribute.prototype.constructor=Float64BufferAttribute;/**
* @author mrdoob / http://mrdoob.com/
*/function DirectGeometry(){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.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(),new Vector2(),new Vector2());}}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(),new Vector2(),new Vector2());}}// 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;}});/**
* @author mrdoob / http://mrdoob.com/
*/function arrayMax(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 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;i<l;i++){var point=points[i];position.push(point.x,point.y,point.z||0);}this.addAttribute('position',new Float32BufferAttribute(position,3));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().fromGeometry(geometry);return this.fromDirectGeometry(geometry.__directGeometry);},fromDirectGeometry:function(geometry){var positions=new Float32Array(geometry.vertices.length*3);this.addAttribute('position',new BufferAttribute(positions,3).copyVector3sArray(geometry.vertices));if(geometry.normals.length>0){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;i<l;i++){var morphTarget=morphTargets[i];var attribute=new Float32BufferAttribute(morphTarget.length*3,3);array.push(attribute.copyVector3sArray(morphTarget));}this.morphAttributes[name]=array;}// skinning
if(geometry.skinIndices.length>0){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;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(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(),pB=new Vector3(),pC=new Vector3();var cb=new Vector3(),ab=new Vector3();// 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)){console.error('THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.',geometry);return;}if(offset===undefined){offset=0;console.warn('THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. '+'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.');}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 vector=new Vector3();return function normalizeNormals(){var normals=this.attributes.normal;for(var i=0,il=normals.count;i<il;i++){vector.x=normals.getX(i);vector.y=normals.getY(i);vector.z=normals.getZ(i);vector.normalize();normals.setXYZ(i,vector.x,vector.y,vector.z);}};}(),toNonIndexed:function(){if(this.index===null){console.warn('THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.');return this;}var geometry2=new BufferGeometry();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(array2,itemSize));}var groups=this.groups;for(var i=0,l=groups.length;i<l;i++){var group=groups[i];geometry2.addGroup(group.start,group.count,group.materialIndex);}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().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 Mugen87 / https://github.com/Mugen87
*/ // BoxGeometry
function BoxGeometry(width,height,depth,widthSegments,heightSegments,depthSegments){Geometry.call(this);this.type='BoxGeometry';this.parameters={width:width,height:height,depth:depth,widthSegments:widthSegments,heightSegments:heightSegments,depthSegments:depthSegments};this.fromBufferGeometry(new BoxBufferGeometry(width,height,depth,widthSegments,heightSegments,depthSegments));this.mergeVertices();}BoxGeometry.prototype=Object.create(Geometry.prototype);BoxGeometry.prototype.constructor=BoxGeometry;// BoxBufferGeometry
function BoxBufferGeometry(width,height,depth,widthSegments,heightSegments,depthSegments){BufferGeometry.call(this);this.type='BoxBufferGeometry';this.parameters={width:width,height:height,depth:depth,widthSegments:widthSegments,heightSegments:heightSegments,depthSegments:depthSegments};var scope=this;width=width||1;height=height||1;depth=depth||1;// 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(vertices,3));this.addAttribute('normal',new Float32BufferAttribute(normals,3));this.addAttribute('uv',new Float32BufferAttribute(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();// 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.prototype=Object.create(BufferGeometry.prototype);BoxBufferGeometry.prototype.constructor=BoxBufferGeometry;/**
* @author mrdoob / http://mrdoob.com/
* @author Mugen87 / https://github.com/Mugen87
*/ // PlaneGeometry
function PlaneGeometry(width,height,widthSegments,heightSegments){Geometry.call(this);this.type='PlaneGeometry';this.parameters={width:width,height:height,widthSegments:widthSegments,heightSegments:heightSegments};this.fromBufferGeometry(new PlaneBufferGeometry(width,height,widthSegments,heightSegments));this.mergeVertices();}PlaneGeometry.prototype=Object.create(Geometry.prototype);PlaneGeometry.prototype.constructor=PlaneGeometry;// PlaneBufferGeometry
function PlaneBufferGeometry(width,height,widthSegments,heightSegments){BufferGeometry.call(this);this.type='PlaneBufferGeometry';this.parameters={width:width,height:height,widthSegments:widthSegments,heightSegments:heightSegments};width=width||1;height=height||1;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(vertices,3));this.addAttribute('normal',new Float32BufferAttribute(normals,3));this.addAttribute('uv',new Float32BufferAttribute(uvs,2));}PlaneBufferGeometry.prototype=Object.create(BufferGeometry.prototype);PlaneBufferGeometry.prototype.constructor=PlaneBufferGeometry;/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*/var materialId=0;function Material(){Object.defineProperty(this,'id',{value:materialId++});this.uuid=_Math.generateUUID();this.name='';this.type='Material';this.fog=true;this.lights=true;this.blending=NormalBlending;this.side=FrontSide;this.flatShading=false;this.vertexColors=NoColors;// THREE.NoColors, THREE.VertexColors, THREE.FaceColors
this.opacity=1;this.transparent=false;this.blendSrc=SrcAlphaFactor;this.blendDst=OneMinusSrcAlphaFactor;this.blendEquation=AddEquation;this.blendSrcAlpha=null;this.blendDstAlpha=null;this.blendEquationAlpha=null;this.depthFunc=LessEqualDepth;this.depthTest=true;this.depthWrite=true;this.clippingPlanes=null;this.clipIntersection=false;this.clipShadows=false;this.shadowSide=null;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.userData={};this.needsUpdate=true;}Material.prototype=Object.assign(Object.create(EventDispatcher.prototype),{constructor:Material,isMaterial:true,onBeforeCompile:function(){},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;}// for backward compatability if shading is set in the constructor
if(key==='shading'){console.warn('THREE.'+this.type+': .shading has been removed. Use the boolean .flatShading instead.');this.flatShading=newValue===FlatShading?true:false;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||typeof meta==='string';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.emissiveIntensity!==1)data.emissiveIntensity=this.emissiveIntensity;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)data.blending=this.blending;if(this.flatShading===true)data.flatShading=this.flatShading;if(this.side!==FrontSide)data.side=this.side;if(this.vertexColors!==NoColors)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;// rotation (SpriteMaterial)
if(this.rotation!==0)data.rotation=this.rotation;if(this.linewidth!==1)data.linewidth=this.linewidth;if(this.dashSize!==undefined)data.dashSize=this.dashSize;if(this.gapSize!==undefined)data.gapSize=this.gapSize;if(this.scale!==undefined)data.scale=this.scale;if(this.dithering===true)data.dithering=true;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;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: <hex>,
* opacity: <float>,
* map: new THREE.Texture( <Image> ),
*
* lightMap: new THREE.Texture( <Image> ),
* lightMapIntensity: <float>
*
* aoMap: new THREE.Texture( <Image> ),
* aoMapIntensity: <float>
*
* specularMap: new THREE.Texture( <Image> ),
*
* alphaMap: new THREE.Texture( <Image> ),
*
* envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),
* combine: THREE.Multiply,
* reflectivity: <float>,
* refractionRatio: <float>,
*
* depthTest: <bool>,
* depthWrite: <bool>,
*
* wireframe: <boolean>,
* wireframeLinewidth: <float>,
*
* skinning: <bool>,
* morphTargets: <bool>
* }
*/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: <string>,
* vertexShader: <string>,
*
* wireframe: <boolean>,
* wireframeLinewidth: <float>,
*
* lights: <bool>,
*
* skinning: <bool>,
* morphTargets: <bool>,
* morphNormals: <bool>
* }
*/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<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,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;i<edgeList.length;i++){edgeList[i].closestPointToPoint(projectedPoint,true,closestPoint);var distance=projectedPoint.distanceToSquared(closestPoint);if(distance<minDistance){minDistance=distance;target.copy(closestPoint);}}}return target;};}(),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/
* @author mikael emtinger / http://gomo.se/
* @author jonobr1 / http://jonobr1.com/
*/function Mesh(geometry,material){Object3D.call(this);this.type='Mesh';this.geometry=geometry!==undefined?geometry:new BufferGeometry();this.material=material!==undefined?material:new MeshBasicMaterial({color:Math.random()*0xffffff});this.drawMode=TrianglesDrawMode;this.updateMorphTargets();}Mesh.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:Mesh,isMesh:true,setDrawMode:function(value){this.drawMode=value;},copy:function(source){Object3D.prototype.copy.call(this,source);this.drawMode=source.drawMode;if(source.morphTargetInfluences!==undefined){this.morphTargetInfluences=source.morphTargetInfluences.slice();}if(source.morphTargetDictionary!==undefined){this.morphTargetDictionary=Object.assign({},source.morphTargetDictionary);}return this;},updateMorphTargets:function(){var geometry=this.geometry;var m,ml,name;if(geometry.isBufferGeometry){var morphAttributes=geometry.morphAttributes;var keys=Object.keys(morphAttributes);if(keys.length>0){var morphAttribute=morphAttributes[keys[0]];if(morphAttribute!==undefined){this.morphTargetInfluences=[];this.morphTargetDictionary={};for(m=0,ml=morphAttribute.length;m<ml;m++){name=morphAttribute[m].name||String(m);this.morphTargetInfluences.push(0);this.morphTargetDictionary[name]=m;}}}}else{var morphTargets=geometry.morphTargets;if(morphTargets!==undefined&&morphTargets.length>0){this.morphTargetInfluences=[];this.morphTargetDictionary={};for(m=0,ml=morphTargets.length;m<ml;m++){name=morphTargets[m].name||String(m);this.morphTargetInfluences.push(0);this.morphTargetDictionary[name]=m;}}}},raycast:function(){var inverseMatrix=new Matrix4();var ray=new Ray();var sphere=new Sphere();var vA=new Vector3();var vB=new Vector3();var vC=new Vector3();var tempA=new Vector3();var tempB=new Vector3();var tempC=new Vector3();var uvA=new Vector2();var uvB=new Vector2();var uvC=new Vector2();var barycoord=new Vector3();var intersectionPoint=new Vector3();var intersectionPointWorld=new Vector3();function uvIntersection(point,p1,p2,p3,uv1,uv2,uv3){Triangle.getBarycoord(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,material,raycaster,ray,pA,pB,pC,point){var intersect;if(material.side===BackSide){intersect=ray.intersectTriangle(pC,pB,pA,true,point);}else{intersect=ray.intersectTriangle(pA,pB,pC,material.side!==DoubleSide,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,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;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 if(position!==undefined){// 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)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,faceMaterial,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/
*/function WebGLBackground(renderer,state,geometries,premultipliedAlpha){var clearColor=new Color(0x000000);var clearAlpha=0;var planeCamera,planeMesh;var boxMesh;function render(renderList,scene,camera,forceClear){var background=scene.background;if(background===null){setClear(clearColor,clearAlpha);}else if(background&&background.isColor){setClear(background,1);forceClear=true;}if(renderer.autoClear||forceClear){renderer.clear(renderer.autoClearColor,renderer.autoClearDepth,renderer.autoClearStencil);}if(background&&background.isCubeTexture){if(boxMesh===undefined){boxMesh=new Mesh(new BoxBufferGeometry(1,1,1),new ShaderMaterial({uniforms:ShaderLib.cube.uniforms,vertexShader:ShaderLib.cube.vertexShader,fragmentShader:ShaderLib.cube.fragmentShader,side:BackSide,depthTest:true,depthWrite:false,fog:false}));boxMesh.geometry.removeAttribute('normal');boxMesh.geometry.removeAttribute('uv');boxMesh.onBeforeRender=function(renderer,scene,camera){this.matrixWorld.copyPosition(camera.matrixWorld);};geometries.update(boxMesh.geometry);}boxMesh.material.uniforms.tCube.value=background;renderList.push(boxMesh,boxMesh.geometry,boxMesh.material,0,null);}else if(background&&background.isTexture){if(planeCamera===undefined){planeCamera=new OrthographicCamera(-1,1,1,-1,0,1);planeMesh=new Mesh(new PlaneBufferGeometry(2,2),new MeshBasicMaterial({depthTest:false,depthWrite:false,fog:false}));geometries.update(planeMesh.geometry);}planeMesh.material.map=background;// TODO Push this to renderList
renderer.renderBufferDirect(planeCamera,null,planeMesh.geometry,planeMesh.material,planeMesh,null);}}function setClear(color,alpha){state.buffers.color.setClear(color.r,color.g,color.b,alpha,premultipliedAlpha);}return {getClearColor:function(){return clearColor;},setClearColor:function(color,alpha){clearColor.set(color);clearAlpha=alpha!==undefined?alpha:1;setClear(clearColor,clearAlpha);},getClearAlpha:function(){return clearAlpha;},setClearAlpha:function(alpha){clearAlpha=alpha;setClear(clearColor,clearAlpha);},render:render};}/**
* @author mrdoob / http://mrdoob.com/
*/function WebGLBufferRenderer(gl,extensions,info){var mode;function setMode(value){mode=value;}function render(start,count){gl.drawArrays(mode,start,count);info.update(count,mode);}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);}info.update(count,mode,geometry.maxInstancedCount);}//
this.setMode=setMode;this.render=render;this.renderInstances=renderInstances;}/**
* @author mrdoob / http://mrdoob.com/
*/function WebGLCapabilities(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;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.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;}}/**
* @author mrdoob / http://mrdoob.com/
*/function WebGLExtensions(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;default:extension=gl.getExtension(name);}if(extension===null){console.warn('THREE.WebGLRenderer: '+name+' extension not supported.');}extensions[name]=extension;return extension;}};}/**
* @author mrdoob / http://mrdoob.com/
*/function WebGLGeometries(gl,attributes,info){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];}//
info.memory.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().setFromObject(object);}buffergeometry=geometry._bufferGeometry;}geometries[geometry.id]=buffergeometry;info.memory.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(indices)>65535?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;i<length;i++){influences[i]=[i,0];}influencesList[geometry.id]=influences;}var morphTargets=material.morphTargets&&geometry.morphAttributes.position;var morphNormals=material.morphNormals&&geometry.morphAttributes.normal;// Remove current morphAttributes
for(var i=0;i<length;i++){var influence=influences[i];if(influence[1]!==0){if(morphTargets)geometry.removeAttribute('morphTarget'+i);if(morphNormals)geometry.removeAttribute('morphNormal'+i);}}// Collect influences
for(var i=0;i<length;i++){var influence=influences[i];influence[0]=i;influence[1]=objectInfluences[i];}influences.sort(absNumericalSort);// Add morphAttributes
for(var i=0;i<8;i++){var influence=influences[i];if(influence){var index=influence[0];var value=influence[1];if(value){if(morphTargets)geometry.addAttribute('morphTarget'+i,morphTargets[index]);if(morphNormals)geometry.addAttribute('morphNormal'+i,morphNormals[index]);morphInfluences[i]=value;continue;}}morphInfluences[i]=0;}program.getUniforms().setValue(gl,'morphTargetInfluences',morphInfluences);}return {update:update};}/**
* @author mrdoob / http://mrdoob.com/
*/function WebGLObjects(geometries,info){var updateList={};function update(object){var frame=info.render.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 dispose(){updateList={};}return {update:update,dispose:dispose};}/**
* @author mrdoob / http://mrdoob.com/
*/function CubeTexture(images,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy,encoding){images=images!==undefined?images:[];mapping=mapping!==undefined?mapping:CubeReflectionMapping;Texture.call(this,images,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy,encoding);this.flipY=false;}CubeTexture.prototype=Object.create(Texture.prototype);CubeTexture.prototype.constructor=CubeTexture;CubeTexture.prototype.isCubeTexture=true;Object.defineProperty(CubeTexture.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=new Texture();var emptyCubeTexture=new CubeTexture();// --- Base for inner nodes (including the root) ---
function UniformContainer(){this.seq=[];this.map={};}// --- Utilities ---
// Array Caches (provide typed arrays for temporary by size)
var arrayCacheF32=[];var arrayCacheI32=[];// Float32Array caches used for uploading Matrix uniforms
var mat4array=new Float32Array(16);var mat3array=new Float32Array(9);// Flattening for arrays of vectors and matrices
function flatten(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[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<n;++i){var info=gl.getActiveUniform(program,i),addr=gl.getUniformLocation(program,info.name);parseUniform(info,addr,this);}}WebGLUniforms.prototype.setValue=function(gl,name,value){var u=this.map[name];if(u!==undefined)u.setValue(gl,value,this.renderer);};WebGLUniforms.prototype.setOptional=function(gl,object,name){var v=object[name];if(v!==undefined)this.setValue(gl,name,v);};// Static interface
WebGLUniforms.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.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/
*/function addLineNumbers(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(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(string));}// --enable-privileged-webgl-extension
// console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );
return shader;}/**
* @author mrdoob / http://mrdoob.com/
*/var programIdCount=0;function getEncodingComponents(encoding){switch(encoding){case LinearEncoding:return ['Linear','( value )'];case sRGBEncoding:return ['sRGB','( value )'];case RGBEEncoding:return ['RGBE','( value )'];case RGBM7Encoding:return ['RGBM','( value, 7.0 )'];case RGBM16Encoding:return ['RGBM','( value, 16.0 )'];case RGBDEncoding:return ['RGBD','( value, 256.0 )'];case GammaEncoding:return ['Gamma','( value, float( GAMMA_FACTOR ) )'];default:throw new Error('unsupported encoding: '+encoding);}}function getTexelDecodingFunction(functionName,encoding){var components=getEncodingComponents(encoding);return 'vec4 '+functionName+'( vec4 value ) { return '+components[0]+'ToLinear'+components[1]+'; }';}function getTexelEncodingFunction(functionName,encoding){var components=getEncodingComponents(encoding);return 'vec4 '+functionName+'( vec4 value ) { return LinearTo'+components[0]+components[1]+'; }';}function getToneMappingFunction(functionName,toneMapping){var toneMappingName;switch(toneMapping){case LinearToneMapping:toneMappingName='Linear';break;case ReinhardToneMapping:toneMappingName='Reinhard';break;case Uncharted2ToneMapping:toneMappingName='Uncharted2';break;case CineonToneMapping:toneMappingName='OptimizedCineon';break;default:throw new Error('unsupported toneMapping: '+toneMapping);}return 'vec3 '+functionName+'( vec3 color ) { return '+toneMappingName+'ToneMapping( color ); }';}function generateExtensions(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).join('\n');}function generateDefines(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(gl,program){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(string){return string!=='';}function replaceLightNums(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 replaceClippingPlaneNums(string,parameters){return string.replace(/NUM_CLIPPING_PLANES/g,parameters.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,parameters.numClippingPlanes-parameters.numClipIntersection);}function parseIncludes(string){var pattern=/^[ \t]*#include +<([\w\d.]+)>/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);i<parseInt(end);i++){unroll+=snippet.replace(/\[ i \]/g,'[ '+i+' ]');}return unroll;}return string.replace(pattern,replace);}function WebGLProgram(renderer,extensions,code,material,shader,parameters){var gl=renderer.context;var defines=material.defines;var vertexShader=shader.vertexShader;var fragmentShader=shader.fragmentShader;var shadowMapTypeDefine='SHADOWMAP_TYPE_BASIC';if(parameters.shadowMapType===PCFShadowMap){shadowMapTypeDefine='SHADOWMAP_TYPE_PCF';}else if(parameters.shadowMapType===PCFSoftShadowMap){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:case CubeRefractionMapping:envMapTypeDefine='ENVMAP_TYPE_CUBE';break;case CubeUVReflectionMapping:case CubeUVRefractionMapping:envMapTypeDefine='ENVMAP_TYPE_CUBE_UV';break;case EquirectangularReflectionMapping:case EquirectangularRefractionMapping:envMapTypeDefine='ENVMAP_TYPE_EQUIREC';break;case SphericalReflectionMapping:envMapTypeDefine='ENVMAP_TYPE_SPHERE';break;}switch(material.envMap.mapping){case CubeRefractionMapping:case EquirectangularRefractionMapping:envMapModeDefine='ENVMAP_MODE_REFRACTION';break;}switch(material.combine){case MultiplyOperation:envMapBlendingDefine='ENVMAP_BLENDING_MULTIPLY';break;case MixOperation:envMapBlendingDefine='ENVMAP_BLENDING_MIX';break;case AddOperation:envMapBlendingDefine='ENVMAP_BLENDING_ADD';break;}}var gammaFactorDefine=renderer.gammaFactor>0?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&&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':'',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&&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':'',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(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;}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&&gammaOverrideLinear){encoding=GammaEncoding;}return encoding;}this.getParameters=function(material,lights,shadows,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=capabilities.precision;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||material.envMap.mapping===CubeUVRefractionMapping),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.flatShading,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&&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;i<parameterNames.length;i++){array.push(parameters[parameterNames[i]]);}array.push(material.onBeforeCompile.toString());array.push(renderer.gammaOutput);return array.join();};this.acquireProgram=function(material,shader,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(renderer,extensions,code,material,shader,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 fordacious / fordacious.github.io
*/function WebGLProperties(){var properties=new WeakMap();function get(object){var map=properties.get(object);if(map===undefined){map={};properties.set(object,map);}return map;}function remove(object){properties.delete(object);}function update(object,key,value){properties.get(object)[key]=value;}function dispose(){properties=new WeakMap();}return {get:get,remove:remove,update:update,dispose:dispose};}/**
* @author mrdoob / http://mrdoob.com/
*/function painterSortStable(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(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(){var renderItems=[];var renderItemsIndex=0;var opaque=[];var transparent=[];function init(){renderItemsIndex=0;opaque.length=0;transparent.length=0;}function push(object,geometry,material,z,group){var renderItem=renderItems[renderItemsIndex];if(renderItem===undefined){renderItem={id:object.id,object:object,geometry:geometry,material:material,program:material.program,renderOrder:object.renderOrder,z:z,group:group};renderItems[renderItemsIndex]=renderItem;}else{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;}(material.transparent===true?transparent:opaque).push(renderItem);renderItemsIndex++;}function sort(){if(opaque.length>1)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<l;i++){var light=lights[i];var color=light.color;var intensity=light.intensity;var distance=light.distance;var 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=cache.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){var shadow=light.shadow;uniforms.shadowBias=shadow.bias;uniforms.shadowRadius=shadow.radius;uniforms.shadowMapSize=shadow.mapSize;}state.directionalShadowMap[directionalLength]=shadowMap;state.directionalShadowMatrix[directionalLength]=light.shadow.matrix;state.directional[directionalLength]=uniforms;directionalLength++;}else if(light.isSpotLight){var uniforms=cache.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){var shadow=light.shadow;uniforms.shadowBias=shadow.bias;uniforms.shadowRadius=shadow.radius;uniforms.shadowMapSize=shadow.mapSize;}state.spotShadowMap[spotLength]=shadowMap;state.spotShadowMatrix[spotLength]=light.shadow.matrix;state.spot[spotLength]=uniforms;spotLength++;}else if(light.isRectAreaLight){var uniforms=cache.get(light);// (a) intensity is the total visible light emitted
//uniforms.color.copy( color ).multiplyScalar( intensity / ( light.width * light.height * Math.PI ) );
// (b) intensity is the brightness of the light
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;
state.rectArea[rectAreaLength]=uniforms;rectAreaLength++;}else if(light.isPointLight){var uniforms=cache.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){var shadow=light.shadow;uniforms.shadowBias=shadow.bias;uniforms.shadowRadius=shadow.radius;uniforms.shadowMapSize=shadow.mapSize;uniforms.shadowCameraNear=shadow.camera.near;uniforms.shadowCameraFar=shadow.camera.far;}state.pointShadowMap[pointLength]=shadowMap;state.pointShadowMatrix[pointLength]=light.shadow.matrix;state.point[pointLength]=uniforms;pointLength++;}else if(light.isHemisphereLight){var uniforms=cache.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);state.hemi[hemiLength]=uniforms;hemiLength++;}}state.ambient[0]=r;state.ambient[1]=g;state.ambient[2]=b;state.directional.length=directionalLength;state.spot.length=spotLength;state.rectArea.length=rectAreaLength;state.point.length=pointLength;state.hemi.length=hemiLength;state.hash=state.id+','+directionalLength+','+pointLength+','+spotLength+','+rectAreaLength+','+hemiLength+','+shadows.length;}return {setup:setup,state:state};}/**
* @author Mugen87 / https://github.com/Mugen87
*/function WebGLRenderState(){var lights=new WebGLLights();var lightsArray=[];var shadowsArray=[];var spritesArray=[];function init(){lightsArray.length=0;shadowsArray.length=0;spritesArray.length=0;}function pushLight(light){lightsArray.push(light);}function pushShadow(shadowLight){shadowsArray.push(shadowLight);}function pushSprite(shadowLight){spritesArray.push(shadowLight);}function setupLights(camera){lights.setup(lightsArray,shadowsArray,camera);}var state={lightsArray:lightsArray,shadowsArray:shadowsArray,spritesArray:spritesArray,lights:lights};return {init:init,state:state,setupLights:setupLights,pushLight:pushLight,pushShadow:pushShadow,pushSprite:pushSprite};}function WebGLRenderStates(){var renderStates={};function get(scene,camera){var hash=scene.id+','+camera.id;var renderState=renderStates[hash];if(renderState===undefined){renderState=new WebGLRenderState();renderStates[hash]=renderState;}return renderState;}function dispose(){renderStates={};}return {get:get,dispose:dispose};}/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
* @author bhouston / https://clara.io
* @author WestLangley / http://github.com/WestLangley
*
* parameters = {
*
* opacity: <float>,
*
* map: new THREE.Texture( <Image> ),
*
* alphaMap: new THREE.Texture( <Image> ),
*
* displacementMap: new THREE.Texture( <Image> ),
* displacementScale: <float>,
* displacementBias: <float>,
*
* wireframe: <boolean>,
* wireframeLinewidth: <float>
* }
*/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: <float>,
* nearDistance: <float>,
* farDistance: <float>,
*
* skinning: <bool>,
* morphTargets: <bool>,
*
* map: new THREE.Texture( <Image> ),
*
* alphaMap: new THREE.Texture( <Image> ),
*
* displacementMap: new THREE.Texture( <Image> ),
* displacementScale: <float>,
* displacementBias: <float>
*
* }
*/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;i<il;i++){var light=lights[i];var shadow=light.shadow;var isPointLight=light&&light.isPointLight;if(shadow===undefined){console.warn('THREE.WebGLShadowMap:',light,'has no shadow.');continue;}var shadowCamera=shadow.camera;_shadowMapSize.copy(shadow.mapSize);_shadowMapSize.min(_maxShadowMapSize);if(isPointLight){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;}if(shadow.map===null){var pars={minFilter:NearestFilter,magFilter:NearestFilter,format:RGBAFormat};shadow.map=new WebGLRenderTarget(_shadowMapSize.x,_shadowMapSize.y,pars);shadow.map.texture.name=light.name+".shadowMap";shadowCamera.updateProjectionMatrix();}if(shadow.isSpotLightShadow){shadow.update(light);}var shadowMap=shadow.map;var shadowMatrix=shadow.matrix;_lightPositionWorld.setFromMatrixPosition(light.matrixWorld);shadowCamera.position.copy(_lightPositionWorld);if(isPointLight){faceCount=6;// 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;_lookTarget.setFromMatrixPosition(light.target.matrixWorld);shadowCamera.lookAt(_lookTarget);shadowCamera.updateMatrixWorld();// 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);}_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();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);}}scope.needsUpdate=false;};function getDepthMaterial(object,material,isPointLight,lightPositionWorld,shadowCameraNear,shadowCameraFar){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;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<kl;k++){var group=groups[k];var groupMaterial=material[group.materialIndex];if(groupMaterial&&groupMaterial.visible){var depthMaterial=getDepthMaterial(object,groupMaterial,isPointLight,_lightPositionWorld,shadowCamera.near,shadowCamera.far);_renderer.renderBufferDirect(shadowCamera,null,geometry,depthMaterial,object,group);}}}else if(material.visible){var depthMaterial=getDepthMaterial(object,material,isPointLight,_lightPositionWorld,shadowCamera.near,shadowCamera.far);_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 mrdoob / http://mrdoob.com/
*/function CanvasTexture(canvas,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy){Texture.call(this,canvas,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy);this.needsUpdate=true;}CanvasTexture.prototype=Object.create(Texture.prototype);CanvasTexture.prototype.constructor=CanvasTexture;/**
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
*/function WebGLSpriteRenderer(renderer,gl,state,textures,capabilities){var vertexBuffer,elementBuffer;var program,attributes,uniforms;var texture;// decompose matrixWorld
var spritePosition=new Vector3();var spriteRotation=new Quaternion();var spriteScale=new Vector3();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'),center:gl.getUniformLocation(program,'center'),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'),fogDepth:gl.getUniformLocation(program,'fogDepth'),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 CanvasTexture(canvas);}this.render=function(sprites,scene,camera){if(sprites.length===0)return;// setup gl
if(program===undefined){init();}state.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=[];var center=[];for(var i=0,l=sprites.length;i<l;i++){var sprite=sprites[i];var material=sprite.material;if(material.visible===false)continue;sprite.onBeforeRender(renderer,scene,camera,undefined,material,undefined);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;center[0]=sprite.center.x-0.5;center[1]=sprite.center.y-0.5;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.center,center);gl.uniform2fv(uniforms.scale,scale);state.setBlending(material.blending,material.blendEquation,material.blendSrc,material.blendDst,material.blendEquationAlpha,material.blendSrcAlpha,material.blendDstAlpha,material.premultipliedAlpha);state.buffers.depth.setTest(material.depthTest);state.buffers.depth.setMask(material.depthWrite);state.buffers.color.setMask(material.colorWrite);textures.setTexture2D(material.map||texture,0);gl.drawElements(gl.TRIANGLES,6,gl.UNSIGNED_SHORT,0);sprite.onAfterRender(renderer,scene,camera,undefined,material,undefined);}// restore gl
state.enable(gl.CULL_FACE);state.reset();};function createProgram(){var program=gl.createProgram();var vertexShader=gl.createShader(gl.VERTEX_SHADER);var fragmentShader=gl.createShader(gl.FRAGMENT_SHADER);gl.shaderSource(vertexShader,['precision '+capabilities.precision+' float;','#define SHADER_NAME '+'SpriteMaterial','uniform mat4 modelViewMatrix;','uniform mat4 projectionMatrix;','uniform float rotation;','uniform vec2 center;','uniform vec2 scale;','uniform vec2 uvOffset;','uniform vec2 uvScale;','attribute vec2 position;','attribute vec2 uv;','varying vec2 vUV;','varying float fogDepth;','void main() {',' vUV = uvOffset + uv * uvScale;',' vec2 alignedPosition = ( position - center ) * scale;',' vec2 rotatedPosition;',' rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;',' rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;',' vec4 mvPosition;',' mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );',' mvPosition.xy += rotatedPosition;',' gl_Position = projectionMatrix * mvPosition;',' fogDepth = - mvPosition.z;','}'].join('\n'));gl.shaderSource(fragmentShader,['precision '+capabilities.precision+' float;','#define SHADER_NAME '+'SpriteMaterial','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;','varying float fogDepth;','void main() {',' vec4 texture = texture2D( map, vUV );',' gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );',' if ( gl_FragColor.a < alphaTest ) discard;',' if ( fogType > 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;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);// init
colorBuffer.setClear(0,0,0,1);depthBuffer.setClear(1);stencilBuffer.setClear(0);enable(gl.DEPTH_TEST);depthBuffer.setFunc(LessEqualDepth);setFlipSided(false);setCullFace(CullFaceBack);enable(gl.CULL_FACE);enable(gl.BLEND);setBlending(NormalBlending);//
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')||extensions.get('WEBGL_compressed_texture_astc')){var formats=gl.getParameter(gl.COMPRESSED_TEXTURE_FORMATS);for(var i=0;i<formats.length;i++){compressedTextureFormats.push(formats[i]);}}}return compressedTextureFormats;}function useProgram(program){if(currentProgram!==program){gl.useProgram(program);currentProgram=program;return true;}return false;}function setBlending(blending,blendEquation,blendSrc,blendDst,blendEquationAlpha,blendSrcAlpha,blendDstAlpha,premultipliedAlpha){if(blending!==NoBlending){enable(gl.BLEND);}else{disable(gl.BLEND);}if(blending!==CustomBlending){if(blending!==currentBlending||premultipliedAlpha!==currentPremultipledAlpha){switch(blending){case AdditiveBlending: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);}break;case SubtractiveBlending: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);}break;case MultiplyBlending: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);}break;default: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);}}}currentBlendEquation=null;currentBlendSrc=null;currentBlendDst=null;currentBlendEquationAlpha=null;currentBlendSrcAlpha=null;currentBlendDstAlpha=null;}else{blendEquationAlpha=blendEquationAlpha||blendEquation;blendSrcAlpha=blendSrcAlpha||blendSrc;blendDstAlpha=blendDstAlpha||blendDst;if(blendEquation!==currentBlendEquation||blendEquationAlpha!==currentBlendEquationAlpha){gl.blendEquationSeparate(utils.convert(blendEquation),utils.convert(blendEquationAlpha));currentBlendEquation=blendEquation;currentBlendEquationAlpha=blendEquationAlpha;}if(blendSrc!==currentBlendSrc||blendDst!==currentBlendDst||blendSrcAlpha!==currentBlendSrcAlpha||blendDstAlpha!==currentBlendDstAlpha){gl.blendFuncSeparate(utils.convert(blendSrc),utils.convert(blendDst),utils.convert(blendSrcAlpha),utils.convert(blendDstAlpha));currentBlendSrc=blendSrc;currentBlendDst=blendDst;currentBlendSrcAlpha=blendSrcAlpha;currentBlendDstAlpha=blendDstAlpha;}}currentBlending=blending;currentPremultipledAlpha=premultipliedAlpha;}function setMaterial(material,frontFaceCW){material.side===DoubleSide?disable(gl.CULL_FACE):enable(gl.CULL_FACE);var flipSided=material.side===BackSide;if(frontFaceCW)flipSided=!flipSided;setFlipSided(flipSided);material.transparent===true?setBlending(material.blending,material.blendEquation,material.blendSrc,material.blendDst,material.blendEquationAlpha,material.blendSrcAlpha,material.blendDstAlpha,material.premultipliedAlpha):setBlending(NoBlending);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){enable(gl.CULL_FACE);if(cullFace!==currentCullFace){if(cullFace===CullFaceBack){gl.cullFace(gl.BACK);}else if(cullFace===CullFaceFront){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 setScissorTest(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('THREE.WebGLState:',error);}}function texImage2D(){try{gl.texImage2D.apply(gl,arguments);}catch(error){console.error('THREE.WebGLState:',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={};currentProgram=null;currentBlending=null;currentFlipSided=null;currentCullFace=null;colorBuffer.reset();depthBuffer.reset();stencilBuffer.reset();}return {buffers:{color:colorBuffer,depth:depthBuffer,stencil:stencilBuffer},initAttributes:initAttributes,enableAttribute:enableAttribute,enableAttributeAndDivisor:enableAttributeAndDivisor,disableUnusedAttributes:disableUnusedAttributes,enable:enable,disable:disable,getCompressedTextureFormats:getCompressedTextureFormats,useProgram:useProgram,setBlending:setBlending,setMaterial:setMaterial,setFlipSided:setFlipSided,setCullFace:setCullFace,setLineWidth:setLineWidth,setPolygonOffset:setPolygonOffset,setScissorTest:setScissorTest,activeTexture:activeTexture,bindTexture:bindTexture,compressedTexImage2D:compressedTexImage2D,texImage2D:texImage2D,scissor:scissor,viewport:viewport,reset:reset};}/**
* @author mrdoob / http://mrdoob.com/
*/function WebGLTextures(_gl,extensions,state,properties,capabilities,utils,info){var _isWebGL2=typeof WebGL2RenderingContext!=='undefined'&&_gl instanceof WebGL2RenderingContext;/* global WebGL2RenderingContext */var _videoTextures={};var _canvas;//
function clampToMaxSize(image,maxSize){if(image.width>maxSize||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<jl;j++){mipmap=mipmaps[j];if(texture.format!==RGBAFormat&&texture.format!==RGBFormat){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(!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<il;i++){mipmap=mipmaps[i];state.texImage2D(_gl.TEXTURE_2D,i,glFormat,mipmap.width,mipmap.height,0,glFormat,glType,mipmap.data);}texture.generateMipmaps=false;textureProperties.__maxMipLevel=mipmaps.length-1;}else{state.texImage2D(_gl.TEXTURE_2D,0,glFormat,image.width,image.height,0,glFormat,glType,image.data);textureProperties.__maxMipLevel=0;}}else if(texture.isCompressedTexture){for(var i=0,il=mipmaps.length;i<il;i++){mipmap=mipmaps[i];if(texture.format!==RGBAFormat&&texture.format!==RGBFormat){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);}}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<il;i++){mipmap=mipmaps[i];state.texImage2D(_gl.TEXTURE_2D,i,glFormat,glFormat,glType,mipmap);}texture.generateMipmaps=false;textureProperties.__maxMipLevel=mipmaps.length-1;}else{state.texImage2D(_gl.TEXTURE_2D,0,glFormat,glFormat,glType,image);textureProperties.__maxMipLevel=0;}}if(textureNeedsGenerateMipmaps(texture,isPowerOfTwoImage)){generateMipmap(_gl.TEXTURE_2D,texture,image.width,image.height);}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=utils.convert(renderTarget.texture.format);var glType=utils.convert(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){_gl.framebufferTexture2D(_gl.FRAMEBUFFER,_gl.DEPTH_ATTACHMENT,_gl.TEXTURE_2D,webglDepthTexture,0);}else if(renderTarget.depthTexture.format===DepthStencilFormat){_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();info.memory.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(textureNeedsGenerateMipmaps(renderTarget.texture,isTargetPowerOfTwo)){generateMipmap(_gl.TEXTURE_CUBE_MAP,renderTarget.texture,renderTarget.width,renderTarget.height);}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(textureNeedsGenerateMipmaps(renderTarget.texture,isTargetPowerOfTwo)){generateMipmap(_gl.TEXTURE_2D,renderTarget.texture,renderTarget.width,renderTarget.height);}state.bindTexture(_gl.TEXTURE_2D,null);}// Setup depth and stencil buffers
if(renderTarget.depthBuffer){setupDepthRenderbuffer(renderTarget);}}function updateRenderTargetMipmap(renderTarget){var texture=renderTarget.texture;var isTargetPowerOfTwo=isPowerOfTwo(renderTarget);if(textureNeedsGenerateMipmaps(texture,isTargetPowerOfTwo)){var target=renderTarget.isWebGLRenderTargetCube?_gl.TEXTURE_CUBE_MAP:_gl.TEXTURE_2D;var webglTexture=properties.get(texture).__webglTexture;state.bindTexture(target,webglTexture);generateMipmap(target,texture,renderTarget.width,renderTarget.height);state.bindTexture(target,null);}}function updateVideoTexture(texture){var id=texture.id;var frame=info.render.frame;// Check the last frame we updated the VideoTexture
if(_videoTextures[id]!==frame){_videoTextures[id]=frame;texture.update();}}this.setTexture2D=setTexture2D;this.setTextureCube=setTextureCube;this.setTextureCubeDynamic=setTextureCubeDynamic;this.setupRenderTarget=setupRenderTarget;this.updateRenderTargetMipmap=updateRenderTargetMipmap;}/**
* @author thespite / http://www.twitter.com/thespite
*/function WebGLUtils(gl,extensions){function convert(p){var extension;if(p===RepeatWrapping)return gl.REPEAT;if(p===ClampToEdgeWrapping)return gl.CLAMP_TO_EDGE;if(p===MirroredRepeatWrapping)return gl.MIRRORED_REPEAT;if(p===NearestFilter)return gl.NEAREST;if(p===NearestMipMapNearestFilter)return gl.NEAREST_MIPMAP_NEAREST;if(p===NearestMipMapLinearFilter)return gl.NEAREST_MIPMAP_LINEAR;if(p===LinearFilter)return gl.LINEAR;if(p===LinearMipMapNearestFilter)return gl.LINEAR_MIPMAP_NEAREST;if(p===LinearMipMapLinearFilter)return gl.LINEAR_MIPMAP_LINEAR;if(p===UnsignedByteType)return gl.UNSIGNED_BYTE;if(p===UnsignedShort4444Type)return gl.UNSIGNED_SHORT_4_4_4_4;if(p===UnsignedShort5551Type)return gl.UNSIGNED_SHORT_5_5_5_1;if(p===UnsignedShort565Type)return gl.UNSIGNED_SHORT_5_6_5;if(p===ByteType)return gl.BYTE;if(p===ShortType)return gl.SHORT;if(p===UnsignedShortType)return gl.UNSIGNED_SHORT;if(p===IntType)return gl.INT;if(p===UnsignedIntType)return gl.UNSIGNED_INT;if(p===FloatType)return gl.FLOAT;if(p===HalfFloatType){extension=extensions.get('OES_texture_half_float');if(extension!==null)return extension.HALF_FLOAT_OES;}if(p===AlphaFormat)return gl.ALPHA;if(p===RGBFormat)return gl.RGB;if(p===RGBAFormat)return gl.RGBA;if(p===LuminanceFormat)return gl.LUMINANCE;if(p===LuminanceAlphaFormat)return gl.LUMINANCE_ALPHA;if(p===DepthFormat)return gl.DEPTH_COMPONENT;if(p===DepthStencilFormat)return gl.DEPTH_STENCIL;if(p===AddEquation)return gl.FUNC_ADD;if(p===SubtractEquation)return gl.FUNC_SUBTRACT;if(p===ReverseSubtractEquation)return gl.FUNC_REVERSE_SUBTRACT;if(p===ZeroFactor)return gl.ZERO;if(p===OneFactor)return gl.ONE;if(p===SrcColorFactor)return gl.SRC_COLOR;if(p===OneMinusSrcColorFactor)return gl.ONE_MINUS_SRC_COLOR;if(p===SrcAlphaFactor)return gl.SRC_ALPHA;if(p===OneMinusSrcAlphaFactor)return gl.ONE_MINUS_SRC_ALPHA;if(p===DstAlphaFactor)return gl.DST_ALPHA;if(p===OneMinusDstAlphaFactor)return gl.ONE_MINUS_DST_ALPHA;if(p===DstColorFactor)return gl.DST_COLOR;if(p===OneMinusDstColorFactor)return gl.ONE_MINUS_DST_COLOR;if(p===SrcAlphaSaturateFactor)return gl.SRC_ALPHA_SATURATE;if(p===RGB_S3TC_DXT1_Format||p===RGBA_S3TC_DXT1_Format||p===RGBA_S3TC_DXT3_Format||p===RGBA_S3TC_DXT5_Format){extension=extensions.get('WEBGL_compressed_texture_s3tc');if(extension!==null){if(p===RGB_S3TC_DXT1_Format)return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;if(p===RGBA_S3TC_DXT1_Format)return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(p===RGBA_S3TC_DXT3_Format)return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(p===RGBA_S3TC_DXT5_Format)return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;}}if(p===RGB_PVRTC_4BPPV1_Format||p===RGB_PVRTC_2BPPV1_Format||p===RGBA_PVRTC_4BPPV1_Format||p===RGBA_PVRTC_2BPPV1_Format){extension=extensions.get('WEBGL_compressed_texture_pvrtc');if(extension!==null){if(p===RGB_PVRTC_4BPPV1_Format)return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(p===RGB_PVRTC_2BPPV1_Format)return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(p===RGBA_PVRTC_4BPPV1_Format)return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(p===RGBA_PVRTC_2BPPV1_Format)return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;}}if(p===RGB_ETC1_Format){extension=extensions.get('WEBGL_compressed_texture_etc1');if(extension!==null)return extension.COMPRESSED_RGB_ETC1_WEBGL;}if(p===RGBA_ASTC_4x4_Format||p===RGBA_ASTC_5x4_Format||p===RGBA_ASTC_5x5_Format||p===RGBA_ASTC_6x5_Format||p===RGBA_ASTC_6x6_Format||p===RGBA_ASTC_8x5_Format||p===RGBA_ASTC_8x6_Format||p===RGBA_ASTC_8x8_Format||p===RGBA_ASTC_10x5_Format||p===RGBA_ASTC_10x6_Format||p===RGBA_ASTC_10x8_Format||p===RGBA_ASTC_10x10_Format||p===RGBA_ASTC_12x10_Format||p===RGBA_ASTC_12x12_Format){extension=extensions.get('WEBGL_compressed_texture_astc');if(extension!==null){return p;}}if(p===MinEquation||p===MaxEquation){extension=extensions.get('EXT_blend_minmax');if(extension!==null){if(p===MinEquation)return extension.MIN_EXT;if(p===MaxEquation)return extension.MAX_EXT;}}if(p===UnsignedInt248Type){extension=extensions.get('WEBGL_depth_texture');if(extension!==null)return extension.UNSIGNED_INT_24_8_WEBGL;}return 0;}return {convert:convert};}/**
* @author mrdoob / http://mrdoob.com/
* @author greggman / http://games.greggman.com/
* @author zz85 / http://www.lab4games.net/zz85/blog
* @author tschw
*/function PerspectiveCamera(fov,aspect,near,far){Camera.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.prototype=Object.assign(Object.create(Camera.prototype),{constructor:PerspectiveCamera,isPerspectiveCamera:true,copy:function(source,recursive){Camera.prototype.copy.call(this,source,recursive);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.RAD2DEG*2*Math.atan(vExtentSlope);this.updateProjectionMatrix();},/**
* Calculates the focal length from the current .fov and .filmGauge.
*/getFocalLength:function(){var vExtentSlope=Math.tan(_Math.DEG2RAD*0.5*this.fov);return 0.5*this.getFilmHeight()/vExtentSlope;},getEffectiveFOV:function(){return _Math.RAD2DEG*2*Math.atan(Math.tan(_Math.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;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;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(programAttributes.uv,2,_gl.FLOAT,false,0,0);}if(object.hasColors&&material.vertexColors!==NoColors){_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;};this.renderBufferDirect=function(camera,fog,geometry,material,object,group){var frontFaceCW=object.isMesh&&object.matrixWorld.determinant()<0;state.setMaterial(material,frontFaceCW);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;}if(object.morphTargetInfluences){morphtargets.update(object,geometry,material,program);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 attribute;var renderer=bufferRenderer;if(index!==null){attribute=attributes.get(index);renderer=indexedBufferRenderer;renderer.setIndex(attribute);}if(updateBuffers){setupVertexAttributes(material,program,geometry);if(index!==null){_gl.bindBuffer(_gl.ELEMENT_ARRAY_BUFFER,attribute.buffer);}}//
var dataCount=Infinity;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:renderer.setMode(_gl.TRIANGLES);break;case TriangleStripDrawMode:renderer.setMode(_gl.TRIANGLE_STRIP);break;case TriangleFanDrawMode: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){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<object.material.length;i++){initMaterial(object.material[i],scene.fog,object);}}else{initMaterial(object.material,scene.fog,object);}}});};// Animation Loop
var isAnimating=false;var onAnimationFrame=null;function startAnimation(){if(isAnimating)return;requestAnimationLoopFrame();isAnimating=true;}function stopAnimation(){isAnimating=false;}function requestAnimationLoopFrame(){var device=vr.getDevice();if(device&&device.isPresenting){device.requestAnimationFrame(animationLoop);}else{window.requestAnimationFrame(animationLoop);}}function animationLoop(time){if(isAnimating===false)return;onAnimationFrame(time);requestAnimationLoopFrame();}this.animate=function(callback){onAnimationFrame=callback;onAnimationFrame!==null?startAnimation():stopAnimation();};// Rendering
this.render=function(scene,camera,renderTarget,forceClear){if(!(camera&&camera.isCamera)){console.error('THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.');return;}if(_isContextLost)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
if(camera.parent===null)camera.updateMatrixWorld();if(vr.enabled){camera=vr.getCamera(camera);}//
currentRenderState=renderStates.get(scene,camera);currentRenderState.init();scene.onBeforeRender(_this,scene,camera,renderTarget);_projScreenMatrix.multiplyMatrices(camera.projectionMatrix,camera.matrixWorldInverse);_frustum.setFromMatrix(_projScreenMatrix);_localClippingEnabled=this.localClippingEnabled;_clippingEnabled=_clipping.init(this.clippingPlanes,_localClippingEnabled,camera);currentRenderList=renderLists.get(scene,camera);currentRenderList.init();projectObject(scene,camera,_this.sortObjects);if(_this.sortObjects===true){currentRenderList.sort();}//
if(_clippingEnabled)_clipping.beginShadows();var shadowsArray=currentRenderState.state.shadowsArray;shadowMap.render(shadowsArray,scene,camera);currentRenderState.setupLights(camera);if(_clippingEnabled)_clipping.endShadows();//
if(this.info.autoReset)this.info.reset();if(renderTarget===undefined){renderTarget=null;}this.setRenderTarget(renderTarget);//
background.render(currentRenderList,scene,camera,forceClear);// render scene
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 renderers
var spritesArray=currentRenderState.state.spritesArray;spriteRenderer.render(spritesArray,scene,camera);// 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);state.setPolygonOffset(false);scene.onAfterRender(_this,scene,camera);if(vr.enabled){vr.submitFrame();}// _gl.finish();
currentRenderList=null;currentRenderState=null;};/*
// 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===false)return;var visible=object.layers.test(camera.layers);if(visible){if(object.isLight){currentRenderState.pushLight(object);if(object.castShadow){currentRenderState.pushShadow(object);}}else if(object.isSprite){if(!object.frustumCulled||_frustum.intersectsSprite(object)){currentRenderState.pushSprite(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;if(camera.isArrayCamera){_currentArrayCamera=camera;var cameras=camera.cameras;for(var j=0,jl=cameras.length;j<jl;j++){var camera2=cameras[j];if(object.layers.test(camera2.layers)){var bounds=camera2.bounds;var x=bounds.x*_width;var y=bounds.y*_height;var width=bounds.z*_width;var height=bounds.w*_height;state.viewport(_currentViewport.set(x,y,width,height).multiplyScalar(_pixelRatio));renderObject(object,scene,camera2,geometry,material,group);}}}else{_currentArrayCamera=null;renderObject(object,scene,camera,geometry,material,group);}}}function renderObject(object,scene,camera,geometry,material,group){object.onBeforeRender(_this,scene,camera,geometry,material,group);currentRenderState=renderStates.get(scene,_currentArrayCamera||camera);object.modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse,object.matrixWorld);object.normalMatrix.getNormalMatrix(object.modelViewMatrix);if(object.isImmediateRenderObject){var frontFaceCW=object.isMesh&&object.matrixWorld.determinant()<0;state.setMaterial(material,frontFaceCW);var program=setProgram(camera,scene.fog,material,object);_currentGeometryProgram='';renderObjectImmediate(object,program,material);}else{_this.renderBufferDirect(camera,scene.fog,geometry,material,object,group);}object.onAfterRender(_this,scene,camera,geometry,material,group);currentRenderState=renderStates.get(scene,_currentArrayCamera||camera);}function initMaterial(material,fog,object){var materialProperties=properties.get(material);var lights=currentRenderState.state.lights;var shadowsArray=currentRenderState.state.shadowsArray;var parameters=programCache.getParameters(material,lights.state,shadowsArray,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(materialProperties.lightsHash!==lights.state.hash){properties.update(material,'lightsHash',lights.state.hash);programChange=false;}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[parameters.shaderID];materialProperties.shader={name:material.type,uniforms:UniformsUtils.clone(shader.uniforms),vertexShader:shader.vertexShader,fragmentShader:shader.fragmentShader};}else{materialProperties.shader={name:material.type,uniforms:material.uniforms,vertexShader:material.vertexShader,fragmentShader:material.fragmentShader};}material.onBeforeCompile(materialProperties.shader,_this);program=programCache.acquireProgram(material,materialProperties.shader,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.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: <hex>,
* opacity: <float>,
* map: new THREE.Texture( <Image> ),
*
* 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(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);},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;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();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();var v2=new Vector3();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.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(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());}}}}Object.assign(Skeleton.prototype,{calculateInverses:function(){this.boneInverses=[];for(var i=0,il=this.bones.length;i<il;i++){var inverse=new Matrix4();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();var identityMatrix=new Matrix4();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(this.bones,this.boneInverses);},getBoneByName:function(name){for(var i=0,il=this.bones.length;i<il;i++){var bone=this.bones[i];if(bone.name===name){return bone;}}return undefined;}});/**
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
* @author ikerr / http://verold.com
*/function Bone(){Object3D.call(this);this.type='Bone';}Bone.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:Bone,isBone:true});/**
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
* @author ikerr / http://verold.com
*/function SkinnedMesh(geometry,material){Mesh.call(this,geometry,material);this.type='SkinnedMesh';this.bindMode='attached';this.bindMatrix=new Matrix4();this.bindMatrixInverse=new Matrix4();var bones=this.initBones();var skeleton=new Skeleton(bones);this.bind(skeleton,this.matrixWorld);this.normalizeSkinWeights();}SkinnedMesh.prototype=Object.assign(Object.create(Mesh.prototype),{constructor:SkinnedMesh,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();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.manhattanLength();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();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.manhattanLength();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.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: <hex>,
* opacity: <float>,
*
* linewidth: <float>,
* 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;i<l;i++){start.fromBufferAttribute(positionAttribute,i-1);end.fromBufferAttribute(positionAttribute,i);lineDistances[i]=lineDistances[i-1];lineDistances[i]+=start.distanceTo(end);}geometry.addAttribute('lineDistance',new Float32BufferAttribute(lineDistances,1));}else{console.warn('THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.');}}else if(geometry.isGeometry){var vertices=geometry.vertices;var lineDistances=geometry.lineDistances;lineDistances[0]=0;for(var i=1,l=vertices.length;i<l;i++){lineDistances[i]=lineDistances[i-1];lineDistances[i]+=vertices[i-1].distanceTo(vertices[i]);}}return this;};}(),raycast:function(){var inverseMatrix=new Matrix4();var ray=new Ray();var sphere=new Sphere();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();var vEnd=new Vector3();var interSegment=new Vector3();var interRay=new Vector3();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(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<l;i+=2){start.fromBufferAttribute(positionAttribute,i);end.fromBufferAttribute(positionAttribute,i+1);lineDistances[i]=i===0?0:lineDistances[i-1];lineDistances[i+1]=lineDistances[i]+start.distanceTo(end);}geometry.addAttribute('lineDistance',new Float32BufferAttribute(lineDistances,1));}else{console.warn('THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.');}}else if(geometry.isGeometry){var vertices=geometry.vertices;var lineDistances=geometry.lineDistances;for(var i=0,l=vertices.length;i<l;i+=2){start.copy(vertices[i]);end.copy(vertices[i+1]);lineDistances[i]=i===0?0:lineDistances[i-1];lineDistances[i+1]=lineDistances[i]+start.distanceTo(end);}}return this;};}()});/**
* @author mgreter / http://github.com/mgreter
*/function LineLoop(geometry,material){Line.call(this,geometry,material);this.type='LineLoop';}LineLoop.prototype=Object.assign(Object.create(Line.prototype),{constructor:LineLoop,isLineLoop:true});/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*
* parameters = {
* color: <hex>,
* opacity: <float>,
* map: new THREE.Texture( <Image> ),
*
* size: <float>,
* sizeAttenuation: <bool>
* }
*/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(rayPointDistanceSq<localThresholdSq){ray.closestPointToPoint(point,intersectPoint);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(){Object3D.call(this);this.type='Group';}Group.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:Group,isGroup:true});/**
* @author mrdoob / http://mrdoob.com/
*/function VideoTexture(video,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy){Texture.call(this,video,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy);this.generateMipmaps=false;}VideoTexture.prototype=Object.assign(Object.create(Texture.prototype),{constructor:VideoTexture,isVideoTexture:true,update:function(){var video=this.image;if(video.readyState>=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<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();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(vertices,3));}WireframeGeometry.prototype=Object.create(BufferGeometry.prototype);WireframeGeometry.prototype.constructor=WireframeGeometry;/**
* @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(func,slices,stacks){Geometry.call(this);this.type='ParametricGeometry';this.parameters={func:func,slices:slices,stacks:stacks};this.fromBufferGeometry(new ParametricBufferGeometry(func,slices,stacks));this.mergeVertices();}ParametricGeometry.prototype=Object.create(Geometry.prototype);ParametricGeometry.prototype.constructor=ParametricGeometry;// ParametricBufferGeometry
function ParametricBufferGeometry(func,slices,stacks){BufferGeometry.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();var p0=new Vector3(),p1=new Vector3();var pu=new Vector3(),pv=new Vector3();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
func(u,v,p0);vertices.push(p0.x,p0.y,p0.z);// normal
// approximate tangent vectors via finite differences
if(u-EPS>=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;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(vertices,3));this.addAttribute('normal',new Float32BufferAttribute(normals,3));this.addAttribute('uv',new Float32BufferAttribute(uvs,2));}ParametricBufferGeometry.prototype=Object.create(BufferGeometry.prototype);ParametricBufferGeometry.prototype.constructor=ParametricBufferGeometry;/**
* @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(vertices,indices,radius,detail){Geometry.call(this);this.type='PolyhedronGeometry';this.parameters={vertices:vertices,indices:indices,radius:radius,detail:detail};this.fromBufferGeometry(new PolyhedronBufferGeometry(vertices,indices,radius,detail));this.mergeVertices();}PolyhedronGeometry.prototype=Object.create(Geometry.prototype);PolyhedronGeometry.prototype.constructor=PolyhedronGeometry;// PolyhedronBufferGeometry
function PolyhedronBufferGeometry(vertices,indices,radius,detail){BufferGeometry.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(vertexBuffer,3));this.addAttribute('normal',new Float32BufferAttribute(vertexBuffer.slice(),3));this.addAttribute('uv',new Float32BufferAttribute(uvBuffer,2));if(detail===0){this.computeVertexNormals();// flat normals
}else{this.normalizeNormals();// smooth normals
}// helper functions
function subdivide(detail){var a=new Vector3();var b=new Vector3();var c=new Vector3();// 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();// 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();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();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;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.prototype=Object.create(BufferGeometry.prototype);PolyhedronBufferGeometry.prototype.constructor=PolyhedronBufferGeometry;/**
* @author timothypratley / https://github.com/timothypratley
* @author Mugen87 / https://github.com/Mugen87
*/ // TetrahedronGeometry
function TetrahedronGeometry(radius,detail){Geometry.call(this);this.type='TetrahedronGeometry';this.parameters={radius:radius,detail:detail};this.fromBufferGeometry(new TetrahedronBufferGeometry(radius,detail));this.mergeVertices();}TetrahedronGeometry.prototype=Object.create(Geometry.prototype);TetrahedronGeometry.prototype.constructor=TetrahedronGeometry;// TetrahedronBufferGeometry
function TetrahedronBufferGeometry(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.call(this,vertices,indices,radius,detail);this.type='TetrahedronBufferGeometry';this.parameters={radius:radius,detail:detail};}TetrahedronBufferGeometry.prototype=Object.create(PolyhedronBufferGeometry.prototype);TetrahedronBufferGeometry.prototype.constructor=TetrahedronBufferGeometry;/**
* @author timothypratley / https://github.com/timothypratley
* @author Mugen87 / https://github.com/Mugen87
*/ // OctahedronGeometry
function OctahedronGeometry(radius,detail){Geometry.call(this);this.type='OctahedronGeometry';this.parameters={radius:radius,detail:detail};this.fromBufferGeometry(new OctahedronBufferGeometry(radius,detail));this.mergeVertices();}OctahedronGeometry.prototype=Object.create(Geometry.prototype);OctahedronGeometry.prototype.constructor=OctahedronGeometry;// OctahedronBufferGeometry
function OctahedronBufferGeometry(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.call(this,vertices,indices,radius,detail);this.type='OctahedronBufferGeometry';this.parameters={radius:radius,detail:detail};}OctahedronBufferGeometry.prototype=Object.create(PolyhedronBufferGeometry.prototype);OctahedronBufferGeometry.prototype.constructor=OctahedronBufferGeometry;/**
* @author timothypratley / https://github.com/timothypratley
* @author Mugen87 / https://github.com/Mugen87
*/ // IcosahedronGeometry
function IcosahedronGeometry(radius,detail){Geometry.call(this);this.type='IcosahedronGeometry';this.parameters={radius:radius,detail:detail};this.fromBufferGeometry(new IcosahedronBufferGeometry(radius,detail));this.mergeVertices();}IcosahedronGeometry.prototype=Object.create(Geometry.prototype);IcosahedronGeometry.prototype.constructor=IcosahedronGeometry;// IcosahedronBufferGeometry
function IcosahedronBufferGeometry(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.call(this,vertices,indices,radius,detail);this.type='IcosahedronBufferGeometry';this.parameters={radius:radius,detail:detail};}IcosahedronBufferGeometry.prototype=Object.create(PolyhedronBufferGeometry.prototype);IcosahedronBufferGeometry.prototype.constructor=IcosahedronBufferGeometry;/**
* @author Abe Pazos / https://hamoid.com
* @author Mugen87 / https://github.com/Mugen87
*/ // DodecahedronGeometry
function DodecahedronGeometry(radius,detail){Geometry.call(this);this.type='DodecahedronGeometry';this.parameters={radius:radius,detail:detail};this.fromBufferGeometry(new DodecahedronBufferGeometry(radius,detail));this.mergeVertices();}DodecahedronGeometry.prototype=Object.create(Geometry.prototype);DodecahedronGeometry.prototype.constructor=DodecahedronGeometry;// DodecahedronBufferGeometry
function DodecahedronBufferGeometry(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.call(this,vertices,indices,radius,detail);this.type='DodecahedronBufferGeometry';this.parameters={radius:radius,detail:detail};}DodecahedronBufferGeometry.prototype=Object.create(PolyhedronBufferGeometry.prototype);DodecahedronBufferGeometry.prototype.constructor=DodecahedronBufferGeometry;/**
* @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(path,tubularSegments,radius,radialSegments,closed,taper){Geometry.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(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.prototype=Object.create(Geometry.prototype);TubeGeometry.prototype.constructor=TubeGeometry;// TubeBufferGeometry
function TubeBufferGeometry(path,tubularSegments,radius,radialSegments,closed){BufferGeometry.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();var normal=new Vector3();var uv=new Vector2();var P=new Vector3();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(vertices,3));this.addAttribute('normal',new Float32BufferAttribute(normals,3));this.addAttribute('uv',new Float32BufferAttribute(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
P=path.getPointAt(i/tubularSegments,P);// 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.prototype=Object.create(BufferGeometry.prototype);TubeBufferGeometry.prototype.constructor=TubeBufferGeometry;/**
* @author oosmoxiecode
* @author Mugen87 / https://github.com/Mugen87
*
* based on http://www.blackpawn.com/texts/pqtorus/
*/ // TorusKnotGeometry
function TorusKnotGeometry(radius,tube,tubularSegments,radialSegments,p,q,heightScale){Geometry.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(radius,tube,tubularSegments,radialSegments,p,q));this.mergeVertices();}TorusKnotGeometry.prototype=Object.create(Geometry.prototype);TorusKnotGeometry.prototype.constructor=TorusKnotGeometry;// TorusKnotBufferGeometry
function TorusKnotBufferGeometry(radius,tube,tubularSegments,radialSegments,p,q){BufferGeometry.call(this);this.type='TorusKnotBufferGeometry';this.parameters={radius:radius,tube:tube,tubularSegments:tubularSegments,radialSegments:radialSegments,p:p,q:q};radius=radius||1;tube=tube||0.4;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();var normal=new Vector3();var P1=new Vector3();var P2=new Vector3();var B=new Vector3();var T=new Vector3();var N=new Vector3();// 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(vertices,3));this.addAttribute('normal',new Float32BufferAttribute(normals,3));this.addAttribute('uv',new Float32BufferAttribute(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.prototype=Object.create(BufferGeometry.prototype);TorusKnotBufferGeometry.prototype.constructor=TorusKnotBufferGeometry;/**
* @author oosmoxiecode
* @author mrdoob / http://mrdoob.com/
* @author Mugen87 / https://github.com/Mugen87
*/ // TorusGeometry
function TorusGeometry(radius,tube,radialSegments,tubularSegments,arc){Geometry.call(this);this.type='TorusGeometry';this.parameters={radius:radius,tube:tube,radialSegments:radialSegments,tubularSegments:tubularSegments,arc:arc};this.fromBufferGeometry(new TorusBufferGeometry(radius,tube,radialSegments,tubularSegments,arc));this.mergeVertices();}TorusGeometry.prototype=Object.create(Geometry.prototype);TorusGeometry.prototype.constructor=TorusGeometry;// TorusBufferGeometry
function TorusBufferGeometry(radius,tube,radialSegments,tubularSegments,arc){BufferGeometry.call(this);this.type='TorusBufferGeometry';this.parameters={radius:radius,tube:tube,radialSegments:radialSegments,tubularSegments:tubularSegments,arc:arc};radius=radius||1;tube=tube||0.4;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();var vertex=new Vector3();var normal=new Vector3();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(vertices,3));this.addAttribute('normal',new Float32BufferAttribute(normals,3));this.addAttribute('uv',new Float32BufferAttribute(uvs,2));}TorusBufferGeometry.prototype=Object.create(BufferGeometry.prototype);TorusBufferGeometry.prototype.constructor=TorusBufferGeometry;/**
* @author Mugen87 / https://github.com/Mugen87
* Port from https://github.com/mapbox/earcut (v2.1.2)
*/var Earcut={triangulate:function(data,holeIndices,dim){dim=dim||2;var hasHoles=holeIndices&&holeIndices.length,outerLen=hasHoles?holeIndices[0]*dim:data.length,outerNode=linkedList(data,0,outerLen,dim,true),triangles=[];if(!outerNode)return triangles;var minX,minY,maxX,maxY,x,y,invSize;if(hasHoles)outerNode=eliminateHoles(data,holeIndices,outerNode,dim);// if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox
if(data.length>80*dim){minX=maxX=data[0];minY=maxY=data[1];for(var i=dim;i<outerLen;i+=dim){x=data[i];y=data[i+1];if(x<minX)minX=x;if(y<minY)minY=y;if(x>maxX)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<end;i+=dim)last=insertNode(i,data[i],data[i+1],last);}else{for(i=end-dim;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.x<b.x?a.x<c.x?a.x:c.x:b.x<c.x?b.x:c.x,minTY=a.y<b.y?a.y<c.y?a.y:c.y:b.y<c.y?b.y:c.y,maxTX=a.x>b.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<len;i++){start=holeIndices[i]*dim;end=i<len-1?holeIndices[i+1]*dim:data.length;list=linkedList(data,start,end,dim,false);if(list===list.next)list.steiner=true;queue.push(getLeftmost(list));}queue.sort(compareX);// process holes from left to right
for(i=0;i<queue.length;i++){eliminateHole(queue[i],outerNode);outerNode=filterPoints(outerNode,outerNode.next);}return outerNode;}function compareX(a,b){return a.x-b.x;}// find a bridge between vertices that connects hole with an outer ring and and link it
function eliminateHole(hole,outerNode){outerNode=findHoleBridge(hole,outerNode);if(outerNode){var b=splitPolygon(outerNode,hole);filterPoints(b,b.next);}}// David Eberly's algorithm for finding a bridge between hole and outer polygon
function findHoleBridge(hole,outerNode){var p=outerNode,hx=hole.x,hy=hole.y,qx=-Infinity,m;// find a segment intersected by a ray from the hole's leftmost point to the left;
// segment's endpoint with lesser x will be potential connection point
do{if(hy<=p.y&&hy>=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.next.x?p:p.next;}}p=p.next;}while(p!==outerNode);if(!m)return null;if(hx===qx)return m.prev;// hole touches outer segment; pick lower endpoint
// look for points inside the triangle of hole point, segment intersection and endpoint;
// if there are no points found, we have a valid connection;
// otherwise choose the point of the minimum angle with the ray as connection point
var stop=m,mx=m.x,my=m.y,tanMin=Infinity,tan;p=m.next;while(p!==stop){if(hx>=p.x&&p.x>=mx&&hx!==p.x&&pointInTriangle(hy<my?hx:qx,hy,mx,my,hy<my?qx:hx,hy,p.x,p.y)){tan=Math.abs(hy-p.y)/(hx-p.x);// tangential
if((tan<tanMin||tan===tanMin&&p.x>m.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;i<inSize;i++){pSize++;q=q.nextZ;if(!q)break;}qSize=inSize;while(pSize>0||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<leftmost.x)leftmost=p;p=p.next;}while(p!==start);return leftmost;}// check if a point lies within a convex triangle
function pointInTriangle(ax,ay,bx,by,cx,cy,px,py){return (cx-px)*(ay-py)-(ax-px)*(cy-py)>=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;i<end;i+=dim){sum+=(data[j]-data[i])*(data[i+1]+data[j+1]);j=i;}return sum;}/**
* @author zz85 / http://www.lab4games.net/zz85/blog
*/var ShapeUtils={// 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;},isClockWise:function(pts){return ShapeUtils.area(pts)<0;},triangulateShape:function(contour,holes){var vertices=[];// flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]
var holeIndices=[];// array of hole indices
var faces=[];// final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]
removeDupEndPts(contour);addContour(vertices,contour);//
var holeIndex=contour.length;holes.forEach(removeDupEndPts);for(var i=0;i<holes.length;i++){holeIndices.push(holeIndex);holeIndex+=holes[i].length;addContour(vertices,holes[i]);}//
var triangles=Earcut.triangulate(vertices,holeIndices);//
for(var i=0;i<triangles.length;i+=3){faces.push(triangles.slice(i,i+3));}return faces;}};function removeDupEndPts(points){var l=points.length;if(l>2&&points[l-1].equals(points[0])){points.pop();}}function addContour(vertices,contour){for(var i=0;i<contour.length;i++){vertices.push(contour[i].x);vertices.push(contour[i].y);}}/**
* @author zz85 / http://www.lab4games.net/zz85/blog
*
* Creates extruded geometry from a path shape.
*
* parameters = {
*
* curveSegments: <int>, // number of points on the curves
* steps: <int>, // number of points for z-side extrusions / used for subdividing segments of extrude spline too
* amount: <int>, // Depth to extrude the shape
*
* bevelEnabled: <bool>, // turn on bevel
* bevelThickness: <float>, // how deep into the original shape bevel goes
* bevelSize: <float>, // how far from shape outline is bevel
* bevelSegments: <int>, // number of bevel layers
*
* extrudePath: <THREE.Curve> // curve to extrude shape along
*
* UVGenerator: <Object> // 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;i<l;i++){var shape=shapes[i];addShape(shape,options);}// build geometry
this.addAttribute('position',new Float32BufferAttribute(verticesArray,3));this.addAttribute('uv',new Float32BufferAttribute(uvArray,2));this.computeVertexNormals();// functions
function addShape(shape){var placeholder=[];// options
var curveSegments=options.curveSegments!==undefined?options.curveSegments:12;var steps=options.steps!==undefined?options.steps:1;var amount=options.amount!==undefined?options.amount:100;var bevelEnabled=options.bevelEnabled!==undefined?options.bevelEnabled:true;var bevelThickness=options.bevelThickness!==undefined?options.bevelThickness:6;var bevelSize=options.bevelSize!==undefined?options.bevelSize:bevelThickness-2;var bevelSegments=options.bevelSegments!==undefined?options.bevelSegments:3;var extrudePath=options.extrudePath;var uvgen=options.UVGenerator!==undefined?options.UVGenerator:WorldUVGenerator;//
var extrudePts,extrudeByPath=false;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=extrudePath.computeFrenetFrames(steps,false);// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);
binormal=new Vector3();normal=new Vector3();position2=new Vector3();}// Safeguards if bevels are not enabled
if(!bevelEnabled){bevelSegments=0;bevelThickness=0;bevelSize=0;}// Variables initialization
var ahole,h,hl;// looping of holes
var shapePoints=shape.extractPoints(curveSegments);var vertices=shapePoints.shape;var holes=shapePoints.holes;var reverse=!ShapeUtils.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.isClockWise(ahole)){holes[h]=ahole.reverse();}}}var faces=ShapeUtils.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;// 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(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<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,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,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);}}}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){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){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);}}}ExtrudeBufferGeometry.prototype=Object.create(BufferGeometry.prototype);ExtrudeBufferGeometry.prototype.constructor=ExtrudeBufferGeometry;var 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(a_x,a_y),new Vector2(b_x,b_y),new Vector2(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(a_x,1-a_z),new Vector2(b_x,1-b_z),new Vector2(c_x,1-c_z),new Vector2(d_x,1-d_z)];}else{return [new Vector2(a_y,1-a_z),new Vector2(b_y,1-b_z),new Vector2(c_y,1-c_z),new Vector2(d_y,1-d_z)];}}};/**
* @author zz85 / http://www.lab4games.net/zz85/blog
* @author alteredq / http://alteredqualia.com/
*
* Text = 3D Text
*
* parameters = {
* font: <THREE.Font>, // font
*
* size: <float>, // size of the text
* height: <float>, // thickness to extrude text
* curveSegments: <int>, // number of points on the curves
*
* bevelEnabled: <bool>, // turn on bevel
* bevelThickness: <float>, // how deep into text bevel goes
* bevelSize: <float> // 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;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(vertices,3));this.addAttribute('normal',new Float32BufferAttribute(normals,3));this.addAttribute('uv',new Float32BufferAttribute(uvs,2));}SphereBufferGeometry.prototype=Object.create(BufferGeometry.prototype);SphereBufferGeometry.prototype.constructor=SphereBufferGeometry;/**
* @author Kaleb Murphy
* @author Mugen87 / https://github.com/Mugen87
*/ // RingGeometry
function RingGeometry(innerRadius,outerRadius,thetaSegments,phiSegments,thetaStart,thetaLength){Geometry.call(this);this.type='RingGeometry';this.parameters={innerRadius:innerRadius,outerRadius:outerRadius,thetaSegments:thetaSegments,phiSegments:phiSegments,thetaStart:thetaStart,thetaLength:thetaLength};this.fromBufferGeometry(new RingBufferGeometry(innerRadius,outerRadius,thetaSegments,phiSegments,thetaStart,thetaLength));this.mergeVertices();}RingGeometry.prototype=Object.create(Geometry.prototype);RingGeometry.prototype.constructor=RingGeometry;// RingBufferGeometry
function RingBufferGeometry(innerRadius,outerRadius,thetaSegments,phiSegments,thetaStart,thetaLength){BufferGeometry.call(this);this.type='RingBufferGeometry';this.parameters={innerRadius:innerRadius,outerRadius:outerRadius,thetaSegments:thetaSegments,phiSegments:phiSegments,thetaStart:thetaStart,thetaLength:thetaLength};innerRadius=innerRadius||0.5;outerRadius=outerRadius||1;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();var uv=new Vector2();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(vertices,3));this.addAttribute('normal',new Float32BufferAttribute(normals,3));this.addAttribute('uv',new Float32BufferAttribute(uvs,2));}RingBufferGeometry.prototype=Object.create(BufferGeometry.prototype);RingBufferGeometry.prototype.constructor=RingBufferGeometry;/**
* @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(points,segments,phiStart,phiLength){Geometry.call(this);this.type='LatheGeometry';this.parameters={points:points,segments:segments,phiStart:phiStart,phiLength:phiLength};this.fromBufferGeometry(new LatheBufferGeometry(points,segments,phiStart,phiLength));this.mergeVertices();}LatheGeometry.prototype=Object.create(Geometry.prototype);LatheGeometry.prototype.constructor=LatheGeometry;// LatheBufferGeometry
function LatheBufferGeometry(points,segments,phiStart,phiLength){BufferGeometry.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.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();var uv=new Vector2();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(vertices,3));this.addAttribute('uv',new Float32BufferAttribute(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();var n2=new Vector3();var n=new Vector3();// 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.prototype=Object.create(BufferGeometry.prototype);LatheBufferGeometry.prototype.constructor=LatheBufferGeometry;/**
* @author jonobr1 / http://jonobr1.com
* @author Mugen87 / https://github.com/Mugen87
*/ // ShapeGeometry
function ShapeGeometry(shapes,curveSegments){Geometry.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(shapes,curveSegments));this.mergeVertices();}ShapeGeometry.prototype=Object.create(Geometry.prototype);ShapeGeometry.prototype.constructor=ShapeGeometry;ShapeGeometry.prototype.toJSON=function(){var data=Geometry.prototype.toJSON.call(this);var shapes=this.parameters.shapes;return toJSON(shapes,data);};// ShapeBufferGeometry
function ShapeBufferGeometry(shapes,curveSegments){BufferGeometry.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(vertices,3));this.addAttribute('normal',new Float32BufferAttribute(normals,3));this.addAttribute('uv',new Float32BufferAttribute(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.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.isClockWise(shapeHole)===true){shapeHoles[i]=shapeHole.reverse();}}}var faces=ShapeUtils.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.prototype=Object.create(BufferGeometry.prototype);ShapeBufferGeometry.prototype.constructor=ShapeBufferGeometry;ShapeBufferGeometry.prototype.toJSON=function(){var data=BufferGeometry.prototype.toJSON.call(this);var shapes=this.parameters.shapes;return toJSON(shapes,data);};//
function toJSON(shapes,data){data.shapes=[];if(Array.isArray(shapes)){for(var i=0,l=shapes.length;i<l;i++){var shape=shapes[i];data.shapes.push(shape.uuid);}}else{data.shapes.push(shapes.uuid);}return data;}/**
* @author WestLangley / http://github.com/WestLangley
* @author Mugen87 / https://github.com/Mugen87
*/function EdgesGeometry(geometry,thresholdAngle){BufferGeometry.call(this);this.type='EdgesGeometry';this.parameters={thresholdAngle:thresholdAngle};thresholdAngle=thresholdAngle!==undefined?thresholdAngle:1;// buffer
var vertices=[];// helper variables
var thresholdDot=Math.cos(_Math.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();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(vertices,3));}EdgesGeometry.prototype=Object.create(BufferGeometry.prototype);EdgesGeometry.prototype.constructor=EdgesGeometry;/**
* @author mrdoob / http://mrdoob.com/
* @author Mugen87 / https://github.com/Mugen87
*/ // CylinderGeometry
function CylinderGeometry(radiusTop,radiusBottom,height,radialSegments,heightSegments,openEnded,thetaStart,thetaLength){Geometry.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(radiusTop,radiusBottom,height,radialSegments,heightSegments,openEnded,thetaStart,thetaLength));this.mergeVertices();}CylinderGeometry.prototype=Object.create(Geometry.prototype);CylinderGeometry.prototype.constructor=CylinderGeometry;// CylinderBufferGeometry
function CylinderBufferGeometry(radiusTop,radiusBottom,height,radialSegments,heightSegments,openEnded,thetaStart,thetaLength){BufferGeometry.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:1;radiusBottom=radiusBottom!==undefined?radiusBottom:1;height=height||1;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:Math.PI*2;// 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(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<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();var vertex=new Vector3();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.prototype=Object.create(BufferGeometry.prototype);CylinderBufferGeometry.prototype.constructor=CylinderBufferGeometry;/**
* @author abelnation / http://github.com/abelnation
*/ // ConeGeometry
function ConeGeometry(radius,height,radialSegments,heightSegments,openEnded,thetaStart,thetaLength){CylinderGeometry.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.prototype=Object.create(CylinderGeometry.prototype);ConeGeometry.prototype.constructor=ConeGeometry;// ConeBufferGeometry
function ConeBufferGeometry(radius,height,radialSegments,heightSegments,openEnded,thetaStart,thetaLength){CylinderBufferGeometry.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.prototype=Object.create(CylinderBufferGeometry.prototype);ConeBufferGeometry.prototype.constructor=ConeBufferGeometry;/**
* @author benaadams / https://twitter.com/ben_a_adams
* @author Mugen87 / https://github.com/Mugen87
* @author hughes
*/ // CircleGeometry
function CircleGeometry(radius,segments,thetaStart,thetaLength){Geometry.call(this);this.type='CircleGeometry';this.parameters={radius:radius,segments:segments,thetaStart:thetaStart,thetaLength:thetaLength};this.fromBufferGeometry(new CircleBufferGeometry(radius,segments,thetaStart,thetaLength));this.mergeVertices();}CircleGeometry.prototype=Object.create(Geometry.prototype);CircleGeometry.prototype.constructor=CircleGeometry;// CircleBufferGeometry
function CircleBufferGeometry(radius,segments,thetaStart,thetaLength){BufferGeometry.call(this);this.type='CircleBufferGeometry';this.parameters={radius:radius,segments:segments,thetaStart:thetaStart,thetaLength:thetaLength};radius=radius||1;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();var uv=new Vector2();// 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(vertices,3));this.addAttribute('normal',new Float32BufferAttribute(normals,3));this.addAttribute('uv',new Float32BufferAttribute(uvs,2));}CircleBufferGeometry.prototype=Object.create(BufferGeometry.prototype);CircleBufferGeometry.prototype.constructor=CircleBufferGeometry;var Geometries=Object.freeze({WireframeGeometry:WireframeGeometry,ParametricGeometry:ParametricGeometry,ParametricBufferGeometry:ParametricBufferGeometry,TetrahedronGeometry:TetrahedronGeometry,TetrahedronBufferGeometry:TetrahedronBufferGeometry,OctahedronGeometry:OctahedronGeometry,OctahedronBufferGeometry:OctahedronBufferGeometry,IcosahedronGeometry:IcosahedronGeometry,IcosahedronBufferGeometry:IcosahedronBufferGeometry,DodecahedronGeometry:DodecahedronGeometry,DodecahedronBufferGeometry:DodecahedronBufferGeometry,PolyhedronGeometry:PolyhedronGeometry,PolyhedronBufferGeometry:PolyhedronBufferGeometry,TubeGeometry:TubeGeometry,TubeBufferGeometry:TubeBufferGeometry,TorusKnotGeometry:TorusKnotGeometry,TorusKnotBufferGeometry:TorusKnotBufferGeometry,TorusGeometry:TorusGeometry,TorusBufferGeometry:TorusBufferGeometry,TextGeometry:TextGeometry,TextBufferGeometry:TextBufferGeometry,SphereGeometry:SphereGeometry,SphereBufferGeometry:SphereBufferGeometry,RingGeometry:RingGeometry,RingBufferGeometry:RingBufferGeometry,PlaneGeometry:PlaneGeometry,PlaneBufferGeometry:PlaneBufferGeometry,LatheGeometry:LatheGeometry,LatheBufferGeometry:LatheBufferGeometry,ShapeGeometry:ShapeGeometry,ShapeBufferGeometry:ShapeBufferGeometry,ExtrudeGeometry:ExtrudeGeometry,ExtrudeBufferGeometry:ExtrudeBufferGeometry,EdgesGeometry:EdgesGeometry,ConeGeometry:ConeGeometry,ConeBufferGeometry:ConeBufferGeometry,CylinderGeometry:CylinderGeometry,CylinderBufferGeometry:CylinderBufferGeometry,CircleGeometry:CircleGeometry,CircleBufferGeometry:CircleBufferGeometry,BoxGeometry:BoxGeometry,BoxBufferGeometry:BoxBufferGeometry});/**
* @author mrdoob / http://mrdoob.com/
*
* parameters = {
* color: <THREE.Color>
* }
*/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: <hex>,
* roughness: <float>,
* metalness: <float>,
* opacity: <float>,
*
* map: new THREE.Texture( <Image> ),
*
* lightMap: new THREE.Texture( <Image> ),
* lightMapIntensity: <float>
*
* aoMap: new THREE.Texture( <Image> ),
* aoMapIntensity: <float>
*
* emissive: <hex>,
* emissiveIntensity: <float>
* emissiveMap: new THREE.Texture( <Image> ),
*
* bumpMap: new THREE.Texture( <Image> ),
* bumpScale: <float>,
*
* normalMap: new THREE.Texture( <Image> ),
* normalScale: <Vector2>,
*
* displacementMap: new THREE.Texture( <Image> ),
* displacementScale: <float>,
* displacementBias: <float>,
*
* roughnessMap: new THREE.Texture( <Image> ),
*
* metalnessMap: new THREE.Texture( <Image> ),
*
* alphaMap: new THREE.Texture( <Image> ),
*
* envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),
* envMapIntensity: <float>
*
* refractionRatio: <float>,
*
* wireframe: <boolean>,
* wireframeLinewidth: <float>,
*
* skinning: <bool>,
* morphTargets: <bool>,
* morphNormals: <bool>
* }
*/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: <float>
* }
*/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: <hex>,
* specular: <hex>,
* shininess: <float>,
* opacity: <float>,
*
* map: new THREE.Texture( <Image> ),
*
* lightMap: new THREE.Texture( <Image> ),
* lightMapIntensity: <float>
*
* aoMap: new THREE.Texture( <Image> ),
* aoMapIntensity: <float>
*
* emissive: <hex>,
* emissiveIntensity: <float>
* emissiveMap: new THREE.Texture( <Image> ),
*
* bumpMap: new THREE.Texture( <Image> ),
* bumpScale: <float>,
*
* normalMap: new THREE.Texture( <Image> ),
* normalScale: <Vector2>,
*
* displacementMap: new THREE.Texture( <Image> ),
* displacementScale: <float>,
* displacementBias: <float>,
*
* specularMap: new THREE.Texture( <Image> ),
*
* alphaMap: new THREE.Texture( <Image> ),
*
* envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),
* combine: THREE.Multiply,
* reflectivity: <float>,
* refractionRatio: <float>,
*
* wireframe: <boolean>,
* wireframeLinewidth: <float>,
*
* skinning: <bool>,
* morphTargets: <bool>,
* morphNormals: <bool>
* }
*/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( <Image> )
* }
*/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: <float>,
*
* bumpMap: new THREE.Texture( <Image> ),
* bumpScale: <float>,
*
* normalMap: new THREE.Texture( <Image> ),
* normalScale: <Vector2>,
*
* displacementMap: new THREE.Texture( <Image> ),
* displacementScale: <float>,
* displacementBias: <float>,
*
* wireframe: <boolean>,
* wireframeLinewidth: <float>
*
* skinning: <bool>,
* morphTargets: <bool>,
* morphNormals: <bool>
* }
*/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: <hex>,
* opacity: <float>,
*
* map: new THREE.Texture( <Image> ),
*
* lightMap: new THREE.Texture( <Image> ),
* lightMapIntensity: <float>
*
* aoMap: new THREE.Texture( <Image> ),
* aoMapIntensity: <float>
*
* emissive: <hex>,
* emissiveIntensity: <float>
* emissiveMap: new THREE.Texture( <Image> ),
*
* specularMap: new THREE.Texture( <Image> ),
*
* alphaMap: new THREE.Texture( <Image> ),
*
* envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),
* combine: THREE.Multiply,
* reflectivity: <float>,
* refractionRatio: <float>,
*
* wireframe: <boolean>,
* wireframeLinewidth: <float>,
*
* skinning: <bool>,
* morphTargets: <bool>,
* morphNormals: <bool>
* }
*/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: <hex>,
* opacity: <float>,
*
* linewidth: <float>,
*
* scale: <float>,
* dashSize: <float>,
* gapSize: <float>
* }
*/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;i<data.length;i++){view[i]=data.charCodeAt(i);}if(responseType==='blob'){response=new Blob([view.buffer],{type:mimeType});}else{response=view.buffer;}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 like standard XMLHttpRequest event dispatching does
window.setTimeout(function(){if(onLoad)onLoad(response);scope.manager.itemEnd(url);},0);}catch(error){// Wait for next browser tick like standard XMLHttpRequest event dispatching does
window.setTimeout(function(){if(onError)onError(error);scope.manager.itemEnd(url);scope.manager.itemError(url);},0);}}else{// Initialise array for duplicate requests
loading[url]=[];loading[url].push({onLoad:onLoad,onProgress:onProgress,onError:onError});var request=new XMLHttpRequest();request.open('GET',url,true);request.addEventListener('load',function(event){var response=this.response;Cache.add(url,response);var callbacks=loading[url];delete loading[url];if(this.status===200){for(var i=0,il=callbacks.length;i<il;i++){var callback=callbacks[i];if(callback.onLoad)callback.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.');for(var i=0,il=callbacks.length;i<il;i++){var callback=callbacks[i];if(callback.onLoad)callback.onLoad(response);}scope.manager.itemEnd(url);}else{for(var i=0,il=callbacks.length;i<il;i++){var callback=callbacks[i];if(callback.onError)callback.onError(event);}scope.manager.itemEnd(url);scope.manager.itemError(url);}},false);request.addEventListener('progress',function(event){var callbacks=loading[url];for(var i=0,il=callbacks.length;i<il;i++){var callback=callbacks[i];if(callback.onProgress)callback.onProgress(event);}},false);request.addEventListener('error',function(event){var callbacks=loading[url];delete loading[url];for(var i=0,il=callbacks.length;i<il;i++){var callback=callbacks[i];if(callback.onError)callback.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(manager){this.manager=manager!==undefined?manager:DefaultLoadingManager;// override in sub classes
this._parser=null;}Object.assign(CompressedTextureLoader.prototype,{load:function(url,onLoad,onProgress,onError){var scope=this;var images=[];var texture=new CompressedTexture();texture.image=images;var loader=new FileLoader(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;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;}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(manager){this.manager=manager!==undefined?manager:DefaultLoadingManager;// override in sub classes
this._parser=null;}Object.assign(DataTextureLoader.prototype,{load:function(url,onLoad,onProgress,onError){var scope=this;var texture=new DataTexture();var loader=new FileLoader(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;texture.wrapT=undefined!==texData.wrapT?texData.wrapT:ClampToEdgeWrapping;texture.magFilter=undefined!==texData.magFilter?texData.magFilter:LinearFilter;texture.minFilter=undefined!==texData.minFilter?texData.minFilter:LinearMipMapLinearFilter;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;}texture.needsUpdate=true;if(onLoad)onLoad(texture,texData);},onProgress,onError);return texture;}});/**
* @author mrdoob / http://mrdoob.com/
*/function ImageLoader(manager){this.manager=manager!==undefined?manager:DefaultLoadingManager;}Object.assign(ImageLoader.prototype,{crossOrigin:'Anonymous',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;}var image=document.createElementNS('http://www.w3.org/1999/xhtml','img');image.addEventListener('load',function(){Cache.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(manager){this.manager=manager!==undefined?manager:DefaultLoadingManager;}Object.assign(CubeTextureLoader.prototype,{crossOrigin:'Anonymous',load:function(urls,onLoad,onProgress,onError){var texture=new CubeTexture();var loader=new ImageLoader(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(manager){this.manager=manager!==undefined?manager:DefaultLoadingManager;}Object.assign(TextureLoader.prototype,{crossOrigin:'Anonymous',load:function(url,onLoad,onProgress,onError){var texture=new Texture();var loader=new ImageLoader(this.manager);loader.setCrossOrigin(this.crossOrigin);loader.setPath(this.path);loader.load(url,function(image){texture.image=image;// 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: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)<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 point.set(x,y);};EllipseCurve.prototype.copy=function(source){Curve.prototype.copy.call(this,source);this.aX=source.aX;this.aY=source.aY;this.xRadius=source.xRadius;this.yRadius=source.yRadius;this.aStartAngle=source.aStartAngle;this.aEndAngle=source.aEndAngle;this.aClockwise=source.aClockwise;this.aRotation=source.aRotation;return this;};EllipseCurve.prototype.toJSON=function(){var data=Curve.prototype.toJSON.call(this);data.aX=this.aX;data.aY=this.aY;data.xRadius=this.xRadius;data.yRadius=this.yRadius;data.aStartAngle=this.aStartAngle;data.aEndAngle=this.aEndAngle;data.aClockwise=this.aClockwise;data.aRotation=this.aRotation;return data;};EllipseCurve.prototype.fromJSON=function(json){Curve.prototype.fromJSON.call(this,json);this.aX=json.aX;this.aY=json.aY;this.xRadius=json.xRadius;this.yRadius=json.yRadius;this.aStartAngle=json.aStartAngle;this.aEndAngle=json.aEndAngle;this.aClockwise=json.aClockwise;this.aRotation=json.aRotation;return this;};function ArcCurve(aX,aY,aRadius,aStartAngle,aEndAngle,aClockwise){EllipseCurve.call(this,aX,aY,aRadius,aRadius,aStartAngle,aEndAngle,aClockwise);this.type='ArcCurve';}ArcCurve.prototype=Object.create(EllipseCurve.prototype);ArcCurve.prototype.constructor=ArcCurve;ArcCurve.prototype.isArcCurve=true;/**
* @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(){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=new Vector3();var px$1=new CubicPoly();var py=new CubicPoly();var pz=new CubicPoly();function CatmullRomCurve3(points,closed,curveType,tension){Curve.call(this);this.type='CatmullRomCurve3';this.points=points||[];this.closed=closed||false;this.curveType=curveType||'centripetal';this.tension=tension||0.5;}CatmullRomCurve3.prototype=Object.create(Curve.prototype);CatmullRomCurve3.prototype.constructor=CatmullRomCurve3;CatmullRomCurve3.prototype.isCatmullRomCurve3=true;CatmullRomCurve3.prototype.getPoint=function(t,optionalTarget){var point=optionalTarget||new Vector3();var points=this.points;var l=points.length;var p=(l-(this.closed?0:1))*t;var intPoint=Math.floor(p);var weight=p-intPoint;if(this.closed){intPoint+=intPoint>0?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+2<l){p3=points[(intPoint+2)%l];}else{// extrapolate last point
tmp.subVectors(points[l-1],points[l-2]).add(points[l-1]);p3=tmp;}if(this.curveType==='centripetal'||this.curveType==='chordal'){// init Centripetal / Chordal Catmull-Rom
var pow=this.curveType==='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$1.initNonuniformCatmullRom(p0.x,p1.x,p2.x,p3.x,dt0,dt1,dt2);py.initNonuniformCatmullRom(p0.y,p1.y,p2.y,p3.y,dt0,dt1,dt2);pz.initNonuniformCatmullRom(p0.z,p1.z,p2.z,p3.z,dt0,dt1,dt2);}else if(this.curveType==='catmullrom'){px$1.initCatmullRom(p0.x,p1.x,p2.x,p3.x,this.tension);py.initCatmullRom(p0.y,p1.y,p2.y,p3.y,this.tension);pz.initCatmullRom(p0.z,p1.z,p2.z,p3.z,this.tension);}point.set(px$1.calc(weight),py.calc(weight),pz.calc(weight));return point;};CatmullRomCurve3.prototype.copy=function(source){Curve.prototype.copy.call(this,source);this.points=[];for(var i=0,l=source.points.length;i<l;i++){var point=source.points[i];this.points.push(point.clone());}this.closed=source.closed;this.curveType=source.curveType;this.tension=source.tension;return this;};CatmullRomCurve3.prototype.toJSON=function(){var data=Curve.prototype.toJSON.call(this);data.points=[];for(var i=0,l=this.points.length;i<l;i++){var point=this.points[i];data.points.push(point.toArray());}data.closed=this.closed;data.curveType=this.curveType;data.tension=this.tension;return data;};CatmullRomCurve3.prototype.fromJSON=function(json){Curve.prototype.fromJSON.call(this,json);this.points=[];for(var i=0,l=json.points.length;i<l;i++){var point=json.points[i];this.points.push(new Vector3().fromArray(point));}this.closed=json.closed;this.curveType=json.curveType;this.tension=json.tension;return this;};/**
* @author zz85 / http://www.lab4games.net/zz85/blog
*
* Bezier Curves formulas obtained from
* http://en.wikipedia.org/wiki/Bézier_curve
*/function CatmullRom(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(t,p){var k=1-t;return k*k*p;}function QuadraticBezierP1(t,p){return 2*(1-t)*t*p;}function QuadraticBezierP2(t,p){return t*t*p;}function QuadraticBezier(t,p0,p1,p2){return QuadraticBezierP0(t,p0)+QuadraticBezierP1(t,p1)+QuadraticBezierP2(t,p2);}//
function CubicBezierP0(t,p){var k=1-t;return k*k*k*p;}function CubicBezierP1(t,p){var k=1-t;return 3*k*k*t*p;}function CubicBezierP2(t,p){return 3*(1-t)*t*t*p;}function CubicBezierP3(t,p){return t*t*t*p;}function CubicBezier(t,p0,p1,p2,p3){return CubicBezierP0(t,p0)+CubicBezierP1(t,p1)+CubicBezierP2(t,p2)+CubicBezierP3(t,p3);}function CubicBezierCurve(v0,v1,v2,v3){Curve.call(this);this.type='CubicBezierCurve';this.v0=v0||new Vector2();this.v1=v1||new Vector2();this.v2=v2||new Vector2();this.v3=v3||new Vector2();}CubicBezierCurve.prototype=Object.create(Curve.prototype);CubicBezierCurve.prototype.constructor=CubicBezierCurve;CubicBezierCurve.prototype.isCubicBezierCurve=true;CubicBezierCurve.prototype.getPoint=function(t,optionalTarget){var point=optionalTarget||new Vector2();var v0=this.v0,v1=this.v1,v2=this.v2,v3=this.v3;point.set(CubicBezier(t,v0.x,v1.x,v2.x,v3.x),CubicBezier(t,v0.y,v1.y,v2.y,v3.y));return point;};CubicBezierCurve.prototype.copy=function(source){Curve.prototype.copy.call(this,source);this.v0.copy(source.v0);this.v1.copy(source.v1);this.v2.copy(source.v2);this.v3.copy(source.v3);return this;};CubicBezierCurve.prototype.toJSON=function(){var data=Curve.prototype.toJSON.call(this);data.v0=this.v0.toArray();data.v1=this.v1.toArray();data.v2=this.v2.toArray();data.v3=this.v3.toArray();return data;};CubicBezierCurve.prototype.fromJSON=function(json){Curve.prototype.fromJSON.call(this,json);this.v0.fromArray(json.v0);this.v1.fromArray(json.v1);this.v2.fromArray(json.v2);this.v3.fromArray(json.v3);return this;};function CubicBezierCurve3(v0,v1,v2,v3){Curve.call(this);this.type='CubicBezierCurve3';this.v0=v0||new Vector3();this.v1=v1||new Vector3();this.v2=v2||new Vector3();this.v3=v3||new Vector3();}CubicBezierCurve3.prototype=Object.create(Curve.prototype);CubicBezierCurve3.prototype.constructor=CubicBezierCurve3;CubicBezierCurve3.prototype.isCubicBezierCurve3=true;CubicBezierCurve3.prototype.getPoint=function(t,optionalTarget){var point=optionalTarget||new Vector3();var v0=this.v0,v1=this.v1,v2=this.v2,v3=this.v3;point.set(CubicBezier(t,v0.x,v1.x,v2.x,v3.x),CubicBezier(t,v0.y,v1.y,v2.y,v3.y),CubicBezier(t,v0.z,v1.z,v2.z,v3.z));return point;};CubicBezierCurve3.prototype.copy=function(source){Curve.prototype.copy.call(this,source);this.v0.copy(source.v0);this.v1.copy(source.v1);this.v2.copy(source.v2);this.v3.copy(source.v3);return this;};CubicBezierCurve3.prototype.toJSON=function(){var data=Curve.prototype.toJSON.call(this);data.v0=this.v0.toArray();data.v1=this.v1.toArray();data.v2=this.v2.toArray();data.v3=this.v3.toArray();return data;};CubicBezierCurve3.prototype.fromJSON=function(json){Curve.prototype.fromJSON.call(this,json);this.v0.fromArray(json.v0);this.v1.fromArray(json.v1);this.v2.fromArray(json.v2);this.v3.fromArray(json.v3);return this;};function LineCurve(v1,v2){Curve.call(this);this.type='LineCurve';this.v1=v1||new Vector2();this.v2=v2||new Vector2();}LineCurve.prototype=Object.create(Curve.prototype);LineCurve.prototype.constructor=LineCurve;LineCurve.prototype.isLineCurve=true;LineCurve.prototype.getPoint=function(t,optionalTarget){var point=optionalTarget||new Vector2();if(t===1){point.copy(this.v2);}else{point.copy(this.v2).sub(this.v1);point.multiplyScalar(t).add(this.v1);}return point;};// Line curve is linear, so we can overwrite default getPointAt
LineCurve.prototype.getPointAt=function(u,optionalTarget){return this.getPoint(u,optionalTarget);};LineCurve.prototype.getTangent=function()/* t */{var tangent=this.v2.clone().sub(this.v1);return tangent.normalize();};LineCurve.prototype.copy=function(source){Curve.prototype.copy.call(this,source);this.v1.copy(source.v1);this.v2.copy(source.v2);return this;};LineCurve.prototype.toJSON=function(){var data=Curve.prototype.toJSON.call(this);data.v1=this.v1.toArray();data.v2=this.v2.toArray();return data;};LineCurve.prototype.fromJSON=function(json){Curve.prototype.fromJSON.call(this,json);this.v1.fromArray(json.v1);this.v2.fromArray(json.v2);return this;};function LineCurve3(v1,v2){Curve.call(this);this.type='LineCurve3';this.v1=v1||new Vector3();this.v2=v2||new Vector3();}LineCurve3.prototype=Object.create(Curve.prototype);LineCurve3.prototype.constructor=LineCurve3;LineCurve3.prototype.isLineCurve3=true;LineCurve3.prototype.getPoint=function(t,optionalTarget){var point=optionalTarget||new Vector3();if(t===1){point.copy(this.v2);}else{point.copy(this.v2).sub(this.v1);point.multiplyScalar(t).add(this.v1);}return point;};// Line curve is linear, so we can overwrite default getPointAt
LineCurve3.prototype.getPointAt=function(u,optionalTarget){return this.getPoint(u,optionalTarget);};LineCurve3.prototype.copy=function(source){Curve.prototype.copy.call(this,source);this.v1.copy(source.v1);this.v2.copy(source.v2);return this;};LineCurve3.prototype.toJSON=function(){var data=Curve.prototype.toJSON.call(this);data.v1=this.v1.toArray();data.v2=this.v2.toArray();return data;};LineCurve3.prototype.fromJSON=function(json){Curve.prototype.fromJSON.call(this,json);this.v1.fromArray(json.v1);this.v2.fromArray(json.v2);return this;};function QuadraticBezierCurve(v0,v1,v2){Curve.call(this);this.type='QuadraticBezierCurve';this.v0=v0||new Vector2();this.v1=v1||new Vector2();this.v2=v2||new Vector2();}QuadraticBezierCurve.prototype=Object.create(Curve.prototype);QuadraticBezierCurve.prototype.constructor=QuadraticBezierCurve;QuadraticBezierCurve.prototype.isQuadraticBezierCurve=true;QuadraticBezierCurve.prototype.getPoint=function(t,optionalTarget){var point=optionalTarget||new Vector2();var v0=this.v0,v1=this.v1,v2=this.v2;point.set(QuadraticBezier(t,v0.x,v1.x,v2.x),QuadraticBezier(t,v0.y,v1.y,v2.y));return point;};QuadraticBezierCurve.prototype.copy=function(source){Curve.prototype.copy.call(this,source);this.v0.copy(source.v0);this.v1.copy(source.v1);this.v2.copy(source.v2);return this;};QuadraticBezierCurve.prototype.toJSON=function(){var data=Curve.prototype.toJSON.call(this);data.v0=this.v0.toArray();data.v1=this.v1.toArray();data.v2=this.v2.toArray();return data;};QuadraticBezierCurve.prototype.fromJSON=function(json){Curve.prototype.fromJSON.call(this,json);this.v0.fromArray(json.v0);this.v1.fromArray(json.v1);this.v2.fromArray(json.v2);return this;};function QuadraticBezierCurve3(v0,v1,v2){Curve.call(this);this.type='QuadraticBezierCurve3';this.v0=v0||new Vector3();this.v1=v1||new Vector3();this.v2=v2||new Vector3();}QuadraticBezierCurve3.prototype=Object.create(Curve.prototype);QuadraticBezierCurve3.prototype.constructor=QuadraticBezierCurve3;QuadraticBezierCurve3.prototype.isQuadraticBezierCurve3=true;QuadraticBezierCurve3.prototype.getPoint=function(t,optionalTarget){var point=optionalTarget||new Vector3();var v0=this.v0,v1=this.v1,v2=this.v2;point.set(QuadraticBezier(t,v0.x,v1.x,v2.x),QuadraticBezier(t,v0.y,v1.y,v2.y),QuadraticBezier(t,v0.z,v1.z,v2.z));return point;};QuadraticBezierCurve3.prototype.copy=function(source){Curve.prototype.copy.call(this,source);this.v0.copy(source.v0);this.v1.copy(source.v1);this.v2.copy(source.v2);return this;};QuadraticBezierCurve3.prototype.toJSON=function(){var data=Curve.prototype.toJSON.call(this);data.v0=this.v0.toArray();data.v1=this.v1.toArray();data.v2=this.v2.toArray();return data;};QuadraticBezierCurve3.prototype.fromJSON=function(json){Curve.prototype.fromJSON.call(this,json);this.v0.fromArray(json.v0);this.v1.fromArray(json.v1);this.v2.fromArray(json.v2);return this;};function SplineCurve(points/* array of Vector2 */){Curve.call(this);this.type='SplineCurve';this.points=points||[];}SplineCurve.prototype=Object.create(Curve.prototype);SplineCurve.prototype.constructor=SplineCurve;SplineCurve.prototype.isSplineCurve=true;SplineCurve.prototype.getPoint=function(t,optionalTarget){var point=optionalTarget||new Vector2();var points=this.points;var p=(points.length-1)*t;var intPoint=Math.floor(p);var weight=p-intPoint;var p0=points[intPoint===0?intPoint:intPoint-1];var p1=points[intPoint];var p2=points[intPoint>points.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<l;i++){var point=source.points[i];this.points.push(point.clone());}return this;};SplineCurve.prototype.toJSON=function(){var data=Curve.prototype.toJSON.call(this);data.points=[];for(var i=0,l=this.points.length;i<l;i++){var point=this.points[i];data.points.push(point.toArray());}return data;};SplineCurve.prototype.fromJSON=function(json){Curve.prototype.fromJSON.call(this,json);this.points=[];for(var i=0,l=json.points.length;i<l;i++){var point=json.points[i];this.points.push(new Vector2().fromArray(point));}return this;};var Curves=Object.freeze({ArcCurve:ArcCurve,CatmullRomCurve3:CatmullRomCurve3,CubicBezierCurve:CubicBezierCurve,CubicBezierCurve3:CubicBezierCurve3,EllipseCurve:EllipseCurve,LineCurve:LineCurve,LineCurve3:LineCurve3,QuadraticBezierCurve:QuadraticBezierCurve,QuadraticBezierCurve3:QuadraticBezierCurve3,SplineCurve:SplineCurve});/**
* @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(){Curve.call(this);this.type='CurvePath';this.curves=[];this.autoClose=false;// Automatically closes the path
}CurvePath.prototype=Object.assign(Object.create(Curve.prototype),{constructor:CurvePath,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(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 <d
},// We cannot use the default THREE.Curve getPoint() with getLength() because in
// THREE.Curve, getLength() depends on getPoint() but in THREE.CurvePath
// getPoint() depends on getLength
getLength:function(){var lens=this.getCurveLengths();return lens[lens.length-1];},// cacheLengths must be recalculated.
updateArcLengths:function(){this.needsUpdate=true;this.cacheLengths=null;this.getCurveLengths();},// Compute lengths and cache them
// We cannot overwrite getLengths() because UtoT mapping uses it.
getCurveLengths:function(){// We use cache values if curves and cache array are same length
if(this.cacheLengths&&this.cacheLengths.length===this.curves.length){return this.cacheLengths;}// Get length of sub-curve
// Push sums into cached array
var lengths=[],sums=0;for(var i=0,l=this.curves.length;i<l;i++){sums+=this.curves[i].getLength();lengths.push(sums);}this.cacheLengths=lengths;return lengths;},getSpacedPoints:function(divisions){if(divisions===undefined)divisions=40;var points=[];for(var i=0;i<=divisions;i++){points.push(this.getPoint(i/divisions));}if(this.autoClose){points.push(points[0]);}return points;},getPoints:function(divisions){divisions=divisions||12;var points=[],last;for(var i=0,curves=this.curves;i<curves.length;i++){var curve=curves[i];var resolution=curve&&curve.isEllipseCurve?divisions*2:curve&&curve.isLineCurve?1:curve&&curve.isSplineCurve?divisions*curve.points.length:divisions;var pts=curve.getPoints(resolution);for(var j=0;j<pts.length;j++){var point=pts[j];if(last&&last.equals(point))continue;// ensures no consecutive points are duplicates
points.push(point);last=point;}}if(this.autoClose&&points.length>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;i<l;i++){var curve=source.curves[i];this.curves.push(curve.clone());}this.autoClose=source.autoClose;return this;},toJSON:function(){var data=Curve.prototype.toJSON.call(this);data.autoClose=this.autoClose;data.curves=[];for(var i=0,l=this.curves.length;i<l;i++){var curve=this.curves[i];data.curves.push(curve.toJSON());}return data;},fromJSON:function(json){Curve.prototype.fromJSON.call(this,json);this.autoClose=json.autoClose;this.curves=[];for(var i=0,l=json.curves.length;i<l;i++){var curve=json.curves[i];this.curves.push(new Curves[curve.type]().fromJSON(curve));}return this;}});/**
* @author zz85 / http://www.lab4games.net/zz85/blog
* Creates free form 2d path using series of points, lines or curves.
**/function Path(points){CurvePath.call(this);this.type='Path';this.currentPoint=new Vector2();if(points){this.setFromPoints(points);}}Path.prototype=Object.assign(Object.create(CurvePath.prototype),{constructor:Path,setFromPoints:function(points){this.moveTo(points[0].x,points[0].y);for(var i=1,l=points.length;i<l;i++){this.lineTo(points[i].x,points[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(this.currentPoint.clone(),new Vector2(x,y));this.curves.push(curve);this.currentPoint.set(x,y);},quadraticCurveTo:function(aCPx,aCPy,aX,aY){var curve=new QuadraticBezierCurve(this.currentPoint.clone(),new Vector2(aCPx,aCPy),new Vector2(aX,aY));this.curves.push(curve);this.currentPoint.set(aX,aY);},bezierCurveTo:function(aCP1x,aCP1y,aCP2x,aCP2y,aX,aY){var curve=new CubicBezierCurve(this.currentPoint.clone(),new Vector2(aCP1x,aCP1y),new Vector2(aCP2x,aCP2y),new Vector2(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(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(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);},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<l;i++){holesPts[i]=this.holes[i].getPoints(divisions);}return holesPts;},// get points of shape and holes (keypoints based on segments parameter)
extractPoints:function(divisions){return {shape:this.getPoints(divisions),holes:this.getPointsHoles(divisions)};},copy:function(source){Path.prototype.copy.call(this,source);this.holes=[];for(var i=0,l=source.holes.length;i<l;i++){var hole=source.holes[i];this.holes.push(hole.clone());}return this;},toJSON:function(){var data=Path.prototype.toJSON.call(this);data.uuid=this.uuid;data.holes=[];for(var i=0,l=this.holes.length;i<l;i++){var hole=this.holes[i];data.holes.push(hole.toJSON());}return data;},fromJSON:function(json){Path.prototype.fromJSON.call(this,json);this.uuid=json.uuid;this.holes=[];for(var i=0,l=json.holes.length;i<l;i++){var hole=json.holes[i];this.holes.push(new Path().fromJSON(hole));}return this;}});/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*/function Light(color,intensity){Object3D.call(this);this.type='Light';this.color=new Color(color);this.intensity=intensity!==undefined?intensity:1;this.receiveShadow=undefined;}Light.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:Light,isLight:true,copy:function(source){Object3D.prototype.copy.call(this,source);this.color.copy(source.color);this.intensity=source.intensity;return this;},toJSON:function(meta){var data=Object3D.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(skyColor,groundColor,intensity){Light.call(this,skyColor,intensity);this.type='HemisphereLight';this.castShadow=undefined;this.position.copy(Object3D.DefaultUp);this.updateMatrix();this.groundColor=new Color(groundColor);}HemisphereLight.prototype=Object.assign(Object.create(Light.prototype),{constructor:HemisphereLight,isHemisphereLight:true,copy:function(source){Light.prototype.copy.call(this,source);this.groundColor.copy(source.groundColor);return this;}});/**
* @author mrdoob / http://mrdoob.com/
*/function LightShadow(camera){this.camera=camera;this.bias=0;this.radius=1;this.mapSize=new Vector2(512,512);this.map=null;this.matrix=new Matrix4();}Object.assign(LightShadow.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(){LightShadow.call(this,new PerspectiveCamera(50,1,0.5,500));}SpotLightShadow.prototype=Object.assign(Object.create(LightShadow.prototype),{constructor:SpotLightShadow,isSpotLightShadow:true,update:function(light){var camera=this.camera;var fov=_Math.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(color,intensity,distance,angle,penumbra,decay){Light.call(this,color,intensity);this.type='SpotLight';this.position.copy(Object3D.DefaultUp);this.updateMatrix();this.target=new Object3D();Object.defineProperty(this,'power',{get:function(){// intensity = power per solid angle.
// ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
return this.intensity*Math.PI;},set:function(power){// intensity = power per solid angle.
// ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.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();}SpotLight.prototype=Object.assign(Object.create(Light.prototype),{constructor:SpotLight,isSpotLight:true,copy:function(source){Light.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(color,intensity,distance,decay){Light.call(this,color,intensity);this.type='PointLight';Object.defineProperty(this,'power',{get:function(){// intensity = power per solid angle.
// ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
return this.intensity*4*Math.PI;},set:function(power){// intensity = power per solid angle.
// ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.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(new PerspectiveCamera(90,1,0.5,500));}PointLight.prototype=Object.assign(Object.create(Light.prototype),{constructor:PointLight,isPointLight:true,copy:function(source){Light.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(){LightShadow.call(this,new OrthographicCamera(-5,5,5,-5,0.5,500));}DirectionalLightShadow.prototype=Object.assign(Object.create(LightShadow.prototype),{constructor:DirectionalLightShadow});/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*/function DirectionalLight(color,intensity){Light.call(this,color,intensity);this.type='DirectionalLight';this.position.copy(Object3D.DefaultUp);this.updateMatrix();this.target=new Object3D();this.shadow=new DirectionalLightShadow();}DirectionalLight.prototype=Object.assign(Object.create(Light.prototype),{constructor:DirectionalLight,isDirectionalLight:true,copy:function(source){Light.prototype.copy.call(this,source);this.target=source.target.clone();this.shadow=source.shadow.clone();return this;}});/**
* @author mrdoob / http://mrdoob.com/
*/function AmbientLight(color,intensity){Light.call(this,color,intensity);this.type='AmbientLight';this.castShadow=undefined;}AmbientLight.prototype=Object.assign(Object.create(Light.prototype),{constructor:AmbientLight,isAmbientLight:true});/**
* @author abelnation / http://github.com/abelnation
*/function RectAreaLight(color,intensity,width,height){Light.call(this,color,intensity);this.type='RectAreaLight';this.width=width!==undefined?width:10;this.height=height!==undefined?height:10;}RectAreaLight.prototype=Object.assign(Object.create(Light.prototype),{constructor:RectAreaLight,isRectAreaLight:true,copy:function(source){Light.prototype.copy.call(this,source);this.width=source.width;this.height=source.height;return this;},toJSON:function(meta){var data=Light.prototype.toJSON.call(this,meta);data.object.width=this.width;data.object.height=this.height;return data;}});/**
*
* A Track that interpolates Strings
*
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/function StringKeyframeTrack(name,times,values,interpolation){KeyframeTrack.call(this,name,times,values,interpolation);}StringKeyframeTrack.prototype=Object.assign(Object.create(KeyframeTrack.prototype),{constructor:StringKeyframeTrack,ValueTypeName:'string',ValueBufferType:Array,DefaultInterpolation:InterpolateDiscrete,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(name,times,values){KeyframeTrack.call(this,name,times,values);}BooleanKeyframeTrack.prototype=Object.assign(Object.create(KeyframeTrack.prototype),{constructor:BooleanKeyframeTrack,ValueTypeName:'bool',ValueBufferType:Array,DefaultInterpolation:InterpolateDiscrete,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 )".
});/**
* 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(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.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.prototype,{//( 0, t, t0 ), returns this.resultBuffer
beforeStart_:Interpolant.prototype.copySampleValue_,//( N-1, tN-1, t ), returns this.resultBuffer
afterEnd_:Interpolant.prototype.copySampleValue_});/**
* Spherical linear unit quaternion interpolant.
*
* @author tschw
*/function QuaternionLinearInterpolant(parameterPositions,sampleValues,sampleSize,resultBuffer){Interpolant.call(this,parameterPositions,sampleValues,sampleSize,resultBuffer);}QuaternionLinearInterpolant.prototype=Object.assign(Object.create(Interpolant.prototype),{constructor:QuaternionLinearInterpolant,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.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(name,times,values,interpolation){KeyframeTrack.call(this,name,times,values,interpolation);}QuaternionKeyframeTrack.prototype=Object.assign(Object.create(KeyframeTrack.prototype),{constructor:QuaternionKeyframeTrack,ValueTypeName:'quaternion',// ValueBufferType is inherited
DefaultInterpolation:InterpolateLinear,InterpolantFactoryMethodLinear:function(result){return new QuaternionLinearInterpolant(this.times,this.values,this.getValueSize(),result);},InterpolantFactoryMethodSmooth:undefined// not yet implemented
});/**
*
* A Track of keyframe values that represent color.
*
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/function ColorKeyframeTrack(name,times,values,interpolation){KeyframeTrack.call(this,name,times,values,interpolation);}ColorKeyframeTrack.prototype=Object.assign(Object.create(KeyframeTrack.prototype),{constructor:ColorKeyframeTrack,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 Track of numeric keyframe values.
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/function NumberKeyframeTrack(name,times,values,interpolation){KeyframeTrack.call(this,name,times,values,interpolation);}NumberKeyframeTrack.prototype=Object.assign(Object.create(KeyframeTrack.prototype),{constructor:NumberKeyframeTrack,ValueTypeName:'number'// ValueBufferType is inherited
// DefaultInterpolation is inherited
});/**
* 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(parameterPositions,sampleValues,sampleSize,resultBuffer){Interpolant.call(this,parameterPositions,sampleValues,sampleSize,resultBuffer);this._weightPrev=-0;this._offsetPrev=-0;this._weightNext=-0;this._offsetNext=-0;}CubicInterpolant.prototype=Object.assign(Object.create(Interpolant.prototype),{constructor:CubicInterpolant,DefaultSettings_:{endingStart:ZeroCurvatureEnding,endingEnd:ZeroCurvatureEnding},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:// f'(t0) = 0
iPrev=i1;tPrev=2*t0-t1;break;case WrapAroundEnding:// 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:// f'(tN) = 0
iNext=i1;tNext=2*t1-t0;break;case WrapAroundEnding:// 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(parameterPositions,sampleValues,sampleSize,resultBuffer){Interpolant.call(this,parameterPositions,sampleValues,sampleSize,resultBuffer);}LinearInterpolant.prototype=Object.assign(Object.create(Interpolant.prototype),{constructor:LinearInterpolant,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(parameterPositions,sampleValues,sampleSize,resultBuffer){Interpolant.call(this,parameterPositions,sampleValues,sampleSize,resultBuffer);}DiscreteInterpolant.prototype=Object.assign(Object.create(Interpolant.prototype),{constructor:DiscreteInterpolant,interpolate_:function(i1/*, t0, t, t1 */){return this.copySampleValue_(i1-1);}});/**
* @author tschw
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
*/var AnimationUtils={// same as Array.prototype.slice, but also works on typed arrays
arraySlice:function(array,from,to){if(AnimationUtils.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);}}};/**
*
* 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(name,times,values,interpolation){if(name===undefined)throw new Error('THREE.KeyframeTrack: track name is undefined');if(times===undefined||times.length===0)throw new Error('THREE.KeyframeTrack: no keyframes in track named '+name);this.name=name;this.times=AnimationUtils.convertArray(times,this.TimeBufferType);this.values=AnimationUtils.convertArray(values,this.ValueBufferType);this.setInterpolation(interpolation||this.DefaultInterpolation);this.validate();this.optimize();}// Static methods:
Object.assign(KeyframeTrack,{// Serialization (in static context, because of constructor invocation
// and automatic invocation of .toJSON):
parse:function(json){if(json.type===undefined){throw new Error('THREE.KeyframeTrack: track type undefined, can not parse');}var trackType=KeyframeTrack._getTrackTypeForValueTypeName(json.type);if(json.times===undefined){var times=[],values=[];AnimationUtils.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 assume 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.convertArray(track.times,Array),'values':AnimationUtils.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;case'vector':case'vector2':case'vector3':case'vector4':return VectorKeyframeTrack;case'color':return ColorKeyframeTrack;case'quaternion':return QuaternionKeyframeTrack;case'bool':case'boolean':return BooleanKeyframeTrack;case'string':return StringKeyframeTrack;}throw new Error('THREE.KeyframeTrack: Unsupported typeName: '+typeName);}});Object.assign(KeyframeTrack.prototype,{constructor:KeyframeTrack,TimeBufferType:Float32Array,ValueBufferType:Float32Array,DefaultInterpolation:InterpolateLinear,InterpolantFactoryMethodDiscrete:function(result){return new DiscreteInterpolant(this.times,this.values,this.getValueSize(),result);},InterpolantFactoryMethodLinear:function(result){return new LinearInterpolant(this.times,this.values,this.getValueSize(),result);},InterpolantFactoryMethodSmooth:function(result){return new CubicInterpolant(this.times,this.values,this.getValueSize(),result);},setInterpolation:function(interpolation){var factoryMethod;switch(interpolation){case InterpolateDiscrete:factoryMethod=this.InterpolantFactoryMethodDiscrete;break;case InterpolateLinear:factoryMethod=this.InterpolantFactoryMethodLinear;break;case InterpolateSmooth: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('THREE.KeyframeTrack:',message);return;}this.createInterpolant=factoryMethod;},getInterpolation:function(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return InterpolateDiscrete;case this.InterpolantFactoryMethodLinear:return InterpolateLinear;case this.InterpolantFactoryMethodSmooth:return InterpolateSmooth;}},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.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;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.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;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.getKeyframeOrder(times);times=AnimationUtils.sortedArray(times,1,order);values=AnimationUtils.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('.morphTargetInfluences['+morphTargetSequence[i].name+']',times,values).scale(1.0/fps));}return new AnimationClip(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.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<hierarchyTracks.length;h++){var animationKeys=hierarchyTracks[h].keys;// skip empty tracks
if(!animationKeys||animationKeys.length===0)continue;// process morph targets
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('.morphTargetInfluence['+morphTargetName+']',times,values));}duration=morphTargetNames.length*(fps||1.0);}else{// ...assume skeletal animation
var boneName='.bones['+bones[h].name+']';addNonemptyTrack(VectorKeyframeTrack,boneName+'.position',animationKeys,'pos',tracks);addNonemptyTrack(QuaternionKeyframeTrack,boneName+'.quaternion',animationKeys,'rot',tracks);addNonemptyTrack(VectorKeyframeTrack,boneName+'.scale',animationKeys,'scl',tracks);}}if(tracks.length===0){return null;}var clip=new AnimationClip(clipName,duration,tracks);return clip;}});Object.assign(AnimationClip.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(manager){this.manager=manager!==undefined?manager:DefaultLoadingManager;this.textures={};}Object.assign(MaterialLoader.prototype,{load:function(url,onLoad,onProgress,onError){var scope=this;var loader=new FileLoader(scope.manager);loader.load(url,function(text){onLoad(scope.parse(JSON.parse(text)));},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[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.flatShading!==undefined)material.flatShading=json.flatShading;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.rotation!==undefined)material.rotation=json.rotation;if(json.linewidth!==1)material.linewidth=json.linewidth;if(json.dashSize!==undefined)material.dashSize=json.dashSize;if(json.gapSize!==undefined)material.gapSize=json.gapSize;if(json.scale!==undefined)material.scale=json.scale;if(json.polygonOffset!==undefined)material.polygonOffset=json.polygonOffset;if(json.polygonOffsetFactor!==undefined)material.polygonOffsetFactor=json.polygonOffsetFactor;if(json.polygonOffsetUnits!==undefined)material.polygonOffsetUnits=json.polygonOffsetUnits;if(json.skinning!==undefined)material.skinning=json.skinning;if(json.morphTargets!==undefined)material.morphTargets=json.morphTargets;if(json.dithering!==undefined)material.dithering=json.dithering;if(json.visible!==undefined)material.visible=json.visible;if(json.userData!==undefined)material.userData=json.userData;// Deprecated
if(json.shading!==undefined)material.flatShading=json.shading===1;// THREE.FlatShading
// 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().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(manager){this.manager=manager!==undefined?manager:DefaultLoadingManager;}Object.assign(BufferGeometryLoader.prototype,{load:function(url,onLoad,onProgress,onError){var scope=this;var loader=new FileLoader(scope.manager);loader.load(url,function(text){onLoad(scope.parse(JSON.parse(text)));},onProgress,onError);},parse:function(json){var geometry=new BufferGeometry();var index=json.data.index;if(index!==undefined){var typedArray=new TYPED_ARRAYS[index.type](index.array);geometry.setIndex(new BufferAttribute(typedArray,1));}var attributes=json.data.attributes;for(var key in attributes){var attribute=attributes[key];var typedArray=new TYPED_ARRAYS[attribute.type](attribute.array);geometry.addAttribute(key,new BufferAttribute(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();if(boundingSphere.center!==undefined){center.fromArray(boundingSphere.center);}geometry.boundingSphere=new Sphere(center,boundingSphere.radius);}return geometry;}});var TYPED_ARRAYS={Int8Array:Int8Array,Uint8Array:Uint8Array,// Workaround for IE11 pre KB2929437. See #11440
Uint8ClampedArray:typeof Uint8ClampedArray!=='undefined'?Uint8ClampedArray:Uint8Array,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};/**
* @author alteredq / http://alteredqualia.com/
*/function Loader(){}Loader.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.prototype,{crossOrigin:undefined,onLoadStart:function(){},onLoadProgress:function(){},onLoadComplete:function(){},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,NormalBlending:NormalBlending,AdditiveBlending:AdditiveBlending,SubtractiveBlending:SubtractiveBlending,MultiplyBlending:MultiplyBlending,CustomBlending:CustomBlending};var color=new Color();var textureLoader=new TextureLoader();var materialLoader=new MaterialLoader();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.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;if(repeat[1]!==1)texture.wrapT=RepeatWrapping;}if(offset!==undefined){texture.offset.fromArray(offset);}if(wrap!==undefined){if(wrap[0]==='repeat')texture.wrapS=RepeatWrapping;if(wrap[0]==='mirror')texture.wrapS=MirroredRepeatWrapping;if(wrap[1]==='repeat')texture.wrapT=RepeatWrapping;if(wrap[1]==='mirror')texture.wrapT=MirroredRepeatWrapping;}if(anisotropy!==undefined){texture.anisotropy=anisotropy;}var uuid=_Math.generateUUID();textures[uuid]=texture;return uuid;}//
var json={uuid:_Math.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;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;break;case'doubleSided':json.side=DoubleSide;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;if(value==='face')json.vertexColors=FaceColors;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 Don McCurdy / https://www.donmccurdy.com
*/var LoaderUtils={decodeText:function(array){if(typeof TextDecoder!=='undefined'){return new TextDecoder().decode(array);}// Avoid the String.fromCharCode.apply(null, array) shortcut, which
// throws a "maximum call stack size exceeded" error for large arrays.
var s='';for(var i=0,il=array.length;i<il;i++){// Implicitly assumes little-endian.
s+=String.fromCharCode(array[i]);}// Merges multi-byte utf-8 characters.
return decodeURIComponent(escape(s));},extractUrlBase:function(url){var index=url.lastIndexOf('/');if(index===-1)return './';return url.substr(0,index+1);}};/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*/function JSONLoader(manager){if(typeof manager==='boolean'){console.warn('THREE.JSONLoader: showStatus parameter has been removed from constructor.');manager=undefined;}this.manager=manager!==undefined?manager:DefaultLoadingManager;this.withCredentials=false;}Object.assign(JSONLoader.prototype,{load:function(url,onLoad,onProgress,onError){var scope=this;var texturePath=this.texturePath&&typeof this.texturePath==='string'?this.texturePath:LoaderUtils.extractUrlBase(url);var loader=new FileLoader(this.manager);loader.setWithCredentials(this.withCredentials);loader.load(url,function(text){var json=JSON.parse(text);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;}}}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();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();faceA.a=faces[offset];faceA.b=faces[offset+1];faceA.c=faces[offset+3];faceB=new Face3();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(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(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(hex));if(i!==0)faceB.vertexColors.push(new Color(hex));}}geometry.faces.push(faceA);geometry.faces.push(faceB);}else{face=new Face3();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(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(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(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(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(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();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.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.CreateClipsFromMorphTargetSequences(geometry.morphTargets,10);outputAnimations=outputAnimations.concat(morphAnimationClips);}if(outputAnimations.length>0)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;i<l;i++){var shape=new Shape().fromJSON(json[i]);shapes[shape.uuid]=shape;}}return shapes;},parseGeometries:function(json,shapes){var geometries={};if(json!==undefined){var geometryLoader=new JSONLoader();var bufferGeometryLoader=new BufferGeometryLoader();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[data.type](data.width,data.height,data.widthSegments,data.heightSegments);break;case'BoxGeometry':case'BoxBufferGeometry':case'CubeGeometry':// backwards compatible
geometry=new Geometries[data.type](data.width,data.height,data.depth,data.widthSegments,data.heightSegments,data.depthSegments);break;case'CircleGeometry':case'CircleBufferGeometry':geometry=new Geometries[data.type](data.radius,data.segments,data.thetaStart,data.thetaLength);break;case'CylinderGeometry':case'CylinderBufferGeometry':geometry=new Geometries[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[data.type](data.radius,data.height,data.radialSegments,data.heightSegments,data.openEnded,data.thetaStart,data.thetaLength);break;case'SphereGeometry':case'SphereBufferGeometry':geometry=new Geometries[data.type](data.radius,data.widthSegments,data.heightSegments,data.phiStart,data.phiLength,data.thetaStart,data.thetaLength);break;case'DodecahedronGeometry':case'DodecahedronBufferGeometry':case'IcosahedronGeometry':case'IcosahedronBufferGeometry':case'OctahedronGeometry':case'OctahedronBufferGeometry':case'TetrahedronGeometry':case'TetrahedronBufferGeometry':geometry=new Geometries[data.type](data.radius,data.detail);break;case'RingGeometry':case'RingBufferGeometry':geometry=new Geometries[data.type](data.innerRadius,data.outerRadius,data.thetaSegments,data.phiSegments,data.thetaStart,data.thetaLength);break;case'TorusGeometry':case'TorusBufferGeometry':geometry=new Geometries[data.type](data.radius,data.tube,data.radialSegments,data.tubularSegments,data.arc);break;case'TorusKnotGeometry':case'TorusKnotBufferGeometry':geometry=new Geometries[data.type](data.radius,data.tube,data.tubularSegments,data.radialSegments,data.p,data.q);break;case'LatheGeometry':case'LatheBufferGeometry':geometry=new Geometries[data.type](data.points,data.segments,data.phiStart,data.phiLength);break;case'PolyhedronGeometry':case'PolyhedronBufferGeometry':geometry=new Geometries[data.type](data.vertices,data.indices,data.radius,data.details);break;case'ShapeGeometry':case'ShapeBufferGeometry':var geometryShapes=[];for(var j=0,jl=data.shapes.length;j<jl;j++){var shape=shapes[data.shapes[j]];geometryShapes.push(shape);}geometry=new Geometries[data.type](geometryShapes,data.curveSegments);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();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.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(onLoad);var loader=new ImageLoader(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(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);if(data.offset!==undefined)texture.offset.fromArray(data.offset);if(data.repeat!==undefined)texture.repeat.fromArray(data.repeat);if(data.center!==undefined)texture.center.fromArray(data.center);if(data.rotation!==undefined)texture.rotation=data.rotation;if(data.wrap!==undefined){texture.wrapS=parseConstant(data.wrap[0],TEXTURE_WRAPPING);texture.wrapT=parseConstant(data.wrap[1],TEXTURE_WRAPPING);}if(data.format!==undefined)texture.format=data.format;if(data.minFilter!==undefined)texture.minFilter=parseConstant(data.minFilter,TEXTURE_FILTER);if(data.magFilter!==undefined)texture.magFilter=parseConstant(data.magFilter,TEXTURE_FILTER);if(data.anisotropy!==undefined)texture.anisotropy=data.anisotropy;if(data.flipY!==undefined)texture.flipY=data.flipY;textures[data.uuid]=texture;}}return textures;},parseObject:function(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();if(data.background!==undefined){if(Number.isInteger(data.background)){object.background=new Color(data.background);}}if(data.fog!==undefined){if(data.fog.type==='Fog'){object.fog=new Fog(data.fog.color,data.fog.near,data.fog.far);}else if(data.fog.type==='FogExp2'){object.fog=new FogExp2(data.fog.color,data.fog.density);}}break;case'PerspectiveCamera':object=new PerspectiveCamera(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(data.left,data.right,data.top,data.bottom,data.near,data.far);if(data.zoom!==undefined)object.zoom=data.zoom;if(data.view!==undefined)object.view=Object.assign({},data.view);break;case'AmbientLight':object=new AmbientLight(data.color,data.intensity);break;case'DirectionalLight':object=new DirectionalLight(data.color,data.intensity);break;case'PointLight':object=new PointLight(data.color,data.intensity,data.distance,data.decay);break;case'RectAreaLight':object=new RectAreaLight(data.color,data.intensity,data.width,data.height);break;case'SpotLight':object=new SpotLight(data.color,data.intensity,data.distance,data.angle,data.penumbra,data.decay);break;case'HemisphereLight':object=new HemisphereLight(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(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<children.length;i++){object.add(this.parseObject(children[i],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={UVMapping:UVMapping,CubeReflectionMapping:CubeReflectionMapping,CubeRefractionMapping:CubeRefractionMapping,EquirectangularReflectionMapping:EquirectangularReflectionMapping,EquirectangularRefractionMapping:EquirectangularRefractionMapping,SphericalReflectionMapping:SphericalReflectionMapping,CubeUVReflectionMapping:CubeUVReflectionMapping,CubeUVRefractionMapping:CubeUVRefractionMapping};var TEXTURE_WRAPPING={RepeatWrapping:RepeatWrapping,ClampToEdgeWrapping:ClampToEdgeWrapping,MirroredRepeatWrapping:MirroredRepeatWrapping};var TEXTURE_FILTER={NearestFilter:NearestFilter,NearestMipMapNearestFilter:NearestMipMapNearestFilter,NearestMipMapLinearFilter:NearestMipMapLinearFilter,LinearFilter:LinearFilter,LinearMipMapNearestFilter:LinearMipMapNearestFilter,LinearMipMapLinearFilter:LinearMipMapLinearFilter};/**
* @author zz85 / http://www.lab4games.net/zz85/blog
* minimal class for proxing functions to Path. Replaces old "extractSubpaths()"
**/function ShapePath(){this.type='ShapePath';this.color=new Color();this.subPaths=[];this.currentPath=null;}Object.assign(ShapePath.prototype,{moveTo:function(x,y){this.currentPath=new Path();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();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.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<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(),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(data){this.type='Font';this.data=data;}Object.assign(Font.prototype,{isFont:true,generateShapes:function(text,size,divisions){if(size===undefined)size=100;if(divisions===undefined)divisions=4;var shapes=[];var paths=createPaths(text,size,divisions,this.data);for(var p=0,pl=paths.length;p<pl;p++){Array.prototype.push.apply(shapes,paths[p].toShapes());}return shapes;}});function createPaths(text,size,divisions,data){var chars=String(text).split('');var scale=size/data.resolution;var line_height=(data.boundingBox.yMax-data.boundingBox.yMin+data.underlineThickness)*scale;var paths=[];var offsetX=0,offsetY=0;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,divisions,scale,offsetX,offsetY,data);offsetX+=ret.offsetX;paths.push(ret.path);}}return paths;}function createPath(char,divisions,scale,offsetX,offsetY,data){var glyph=data.glyphs[char]||data.glyphs['?'];if(!glyph)return;var path=new ShapePath();var x,y,cpx,cpy,cpx1,cpy1,cpx2,cpy2;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);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);break;}}}return {offsetX:glyph.ha*scale,path:path};}/**
* @author mrdoob / http://mrdoob.com/
*/function FontLoader(manager){this.manager=manager!==undefined?manager:DefaultLoadingManager;}Object.assign(FontLoader.prototype,{load:function(url,onLoad,onProgress,onError){var scope=this;var loader=new FileLoader(this.manager);loader.setPath(this.path);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(json);},setPath:function(value){this.path=value;return this;}});/**
* @author mrdoob / http://mrdoob.com/
*/var context;var AudioContext={getContext:function(){if(context===undefined){context=new(window.AudioContext||window.webkitAudioContext)();}return context;},setContext:function(value){context=value;}};/**
* @author Reece Aaron Lecrivain / http://reecenotes.com/
*/function AudioLoader(manager){this.manager=manager!==undefined?manager:DefaultLoadingManager;}Object.assign(AudioLoader.prototype,{load:function(url,onLoad,onProgress,onError){var loader=new FileLoader(this.manager);loader.setResponseType('arraybuffer');loader.load(url,function(buffer){var context=AudioContext.getContext();context.decodeAudioData(buffer,function(audioBuffer){onLoad(audioBuffer);});},onProgress,onError);}});/**
* @author mrdoob / http://mrdoob.com/
*/function StereoCamera(){this.type='StereoCamera';this.aspect=1;this.eyeSep=0.064;this.cameraL=new PerspectiveCamera();this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=false;this.cameraR=new PerspectiveCamera();this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate=false;}Object.assign(StereoCamera.prototype,{update:function(){var instance,focus,fov,aspect,near,far,zoom,eyeSep;var eyeRight=new Matrix4();var eyeLeft=new Matrix4();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.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(near,far,cubeResolution){Object3D.call(this);this.type='CubeCamera';var fov=90,aspect=1;var cameraPX=new PerspectiveCamera(fov,aspect,near,far);cameraPX.up.set(0,-1,0);cameraPX.lookAt(new Vector3(1,0,0));this.add(cameraPX);var cameraNX=new PerspectiveCamera(fov,aspect,near,far);cameraNX.up.set(0,-1,0);cameraNX.lookAt(new Vector3(-1,0,0));this.add(cameraNX);var cameraPY=new PerspectiveCamera(fov,aspect,near,far);cameraPY.up.set(0,0,1);cameraPY.lookAt(new Vector3(0,1,0));this.add(cameraPY);var cameraNY=new PerspectiveCamera(fov,aspect,near,far);cameraNY.up.set(0,0,-1);cameraNY.lookAt(new Vector3(0,-1,0));this.add(cameraNY);var cameraPZ=new PerspectiveCamera(fov,aspect,near,far);cameraPZ.up.set(0,-1,0);cameraPZ.lookAt(new Vector3(0,0,1));this.add(cameraPZ);var cameraNZ=new PerspectiveCamera(fov,aspect,near,far);cameraNZ.up.set(0,-1,0);cameraNZ.lookAt(new Vector3(0,0,-1));this.add(cameraNZ);var options={format:RGBFormat,magFilter:LinearFilter,minFilter:LinearFilter};this.renderTarget=new WebGLRenderTargetCube(cubeResolution,cubeResolution,options);this.renderTarget.texture.name="CubeCamera";this.update=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);};this.clear=function(renderer,color,depth,stencil){var renderTarget=this.renderTarget;for(var i=0;i<6;i++){renderTarget.activeCubeFace=i;renderer.setRenderTarget(renderTarget);renderer.clear(color,depth,stencil);}renderer.setRenderTarget(null);};}CubeCamera.prototype=Object.create(Object3D.prototype);CubeCamera.prototype.constructor=CubeCamera;/**
* @author mrdoob / http://mrdoob.com/
*/function AudioListener(){Object3D.call(this);this.type='AudioListener';this.context=AudioContext.getContext();this.gain=this.context.createGain();this.gain.connect(this.context.destination);this.filter=null;}AudioListener.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:AudioListener,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.setTargetAtTime(value,this.context.currentTime,0.01);},updateMatrixWorld:function(){var position=new Vector3();var quaternion=new Quaternion();var scale=new Vector3();var orientation=new Vector3();return function updateMatrixWorld(force){Object3D.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(listener){Object3D.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.offset=0;this.playbackRate=1;this.isPlaying=false;this.hasPlaybackControl=true;this.sourceType='empty';this.filters=[];}Audio.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:Audio,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);this.startTime=this.context.currentTime;source.start(this.startTime,this.offset);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;}if(this.isPlaying===true){this.source.stop();this.offset+=(this.context.currentTime-this.startTime)*this.playbackRate;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.offset=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.setTargetAtTime(value,this.context.currentTime,0.01);return this;}});/**
* @author mrdoob / http://mrdoob.com/
*/function PositionalAudio(listener){Audio.call(this,listener);this.panner=this.context.createPanner();this.panner.connect(this.gain);}PositionalAudio.prototype=Object.assign(Object.create(Audio.prototype),{constructor:PositionalAudio,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();return function updateMatrixWorld(force){Object3D.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(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.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(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.prototype,{// accumulate data in the 'incoming' region into 'accu<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<i>' 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<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.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.targetObject[this.propertyName]=buffer[offset];},function setValue_direct_setNeedsUpdate(buffer,offset){this.targetObject[this.propertyName]=buffer[offset];this.targetObject.needsUpdate=true;},function setValue_direct_setMatrixWorldNeedsUpdate(buffer,offset){this.targetObject[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.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('THREE.PropertyBinding: 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('THREE.PropertyBinding: Can not bind to material as node does not have a material.',this);return;}if(!targetObject.material.materials){console.error('THREE.PropertyBinding: 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('THREE.PropertyBinding: 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('THREE.PropertyBinding: Can not bind to objectName of node undefined.',this);return;}targetObject=targetObject[objectName];}if(objectIndex!==undefined){if(targetObject[objectIndex]===undefined){console.error('THREE.PropertyBinding: 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('THREE.PropertyBinding: 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('THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.',this);return;}if(targetObject.geometry.isBufferGeometry){if(!targetObject.geometry.morphAttributes){console.error('THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.',this);return;}for(var i=0;i<this.node.geometry.morphAttributes.position.length;i++){if(targetObject.geometry.morphAttributes.position[i].name===propertyIndex){propertyIndex=i;break;}}}else{if(!targetObject.geometry.morphTargets){console.error('THREE.PropertyBinding: Can not bind to morphTargetInfluences because 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.prototype,{// initial state of these methods that calls 'bind'
_getValue_unbound:PropertyBinding.prototype.getValue,_setValue_unbound:PropertyBinding.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(){this.uuid=_Math.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.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){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(object,paths[j],parsedPaths[j]);}bindingsForPath[firstActiveIndex]=binding;}}else if(objects[index]!==knownObject){console.error('THREE.AnimationObjectGroup: 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 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 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(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(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,endingEnd:ZeroCurvatureEnding};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;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.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<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;// 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;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(array,stride,meshPerAttribute){InterleavedBuffer.call(this,array,stride);this.meshPerAttribute=meshPerAttribute||1;}InstancedInterleavedBuffer.prototype=Object.assign(Object.create(InterleavedBuffer.prototype),{constructor:InstancedInterleavedBuffer,isInstancedInterleavedBuffer:true,copy:function(source){InterleavedBuffer.prototype.copy.call(this,source);this.meshPerAttribute=source.meshPerAttribute;return this;}});/**
* @author benaadams / https://twitter.com/ben_a_adams
*/function InstancedBufferAttribute(array,itemSize,meshPerAttribute){BufferAttribute.call(this,array,itemSize);this.meshPerAttribute=meshPerAttribute||1;}InstancedBufferAttribute.prototype=Object.assign(Object.create(BufferAttribute.prototype),{constructor:InstancedBufferAttribute,isInstancedBufferAttribute:true,copy:function(source){BufferAttribute.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(origin,direction,near,far){this.ray=new Ray(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(a,b){return a.distance-b.distance;}function intersectObject(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(children[i],raycaster,intersects,true);}}}Object.assign(Raycaster.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,optionalTarget){var intersects=optionalTarget||[];intersectObject(object,this,intersects,recursive);intersects.sort(ascSort);return intersects;},intersectObjects:function(objects,recursive,optionalTarget){var intersects=optionalTarget||[];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(objects[i],this,intersects,recursive);}intersects.sort(ascSort);return intersects;}});/**
* @author alteredq / http://alteredqualia.com/
*/function Clock(autoStart){this.autoStart=autoStart!==undefined?autoStart:true;this.startTime=0;this.oldTime=0;this.elapsedTime=0;this.running=false;}Object.assign(Clock.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;this.autoStart=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(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.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.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(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.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 bhouston / http://clara.io
*/function Box2(min,max){this.min=min!==undefined?min:new Vector2(+Infinity,+Infinity);this.max=max!==undefined?max:new Vector2(-Infinity,-Infinity);}Object.assign(Box2.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();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(target){if(target===undefined){console.warn('THREE.Box2: .getCenter() target is now required');target=new Vector2();}return this.isEmpty()?target.set(0,0):target.addVectors(this.min,this.max).multiplyScalar(0.5);},getSize:function(target){if(target===undefined){console.warn('THREE.Box2: .getSize() target is now required');target=new Vector2();}return this.isEmpty()?target.set(0,0):target.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,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.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,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;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(light,color){Object3D.call(this);this.light=light;this.light.updateMatrixWorld();this.matrix=light.matrixWorld;this.matrixAutoUpdate=false;this.color=color;var geometry=new BufferGeometry();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(positions,3));var material=new LineBasicMaterial({fog:false});this.cone=new LineSegments(geometry,material);this.add(this.cone);this.update();}SpotLightHelper.prototype=Object.create(Object3D.prototype);SpotLightHelper.prototype.constructor=SpotLightHelper;SpotLightHelper.prototype.dispose=function(){this.cone.geometry.dispose();this.cone.material.dispose();};SpotLightHelper.prototype.update=function(){var vector=new Vector3();var vector2=new Vector3();return function update(){this.light.updateMatrixWorld();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));if(this.color!==undefined){this.cone.material.color.set(this.color);}else{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 getBoneList(object){var boneList=[];if(object&&object.isBone){boneList.push(object);}for(var i=0;i<object.children.length;i++){boneList.push.apply(boneList,getBoneList(object.children[i]));}return boneList;}function SkeletonHelper(object){var bones=getBoneList(object);var geometry=new BufferGeometry();var vertices=[];var colors=[];var color1=new Color(0,0,1);var color2=new Color(0,1,0);for(var i=0;i<bones.length;i++){var bone=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(vertices,3));geometry.addAttribute('color',new Float32BufferAttribute(colors,3));var material=new LineBasicMaterial({vertexColors:VertexColors,depthTest:false,depthWrite:false,transparent:true});LineSegments.call(this,geometry,material);this.root=object;this.bones=bones;this.matrix=object.matrixWorld;this.matrixAutoUpdate=false;}SkeletonHelper.prototype=Object.create(LineSegments.prototype);SkeletonHelper.prototype.constructor=SkeletonHelper;SkeletonHelper.prototype.updateMatrixWorld=function(){var vector=new Vector3();var boneMatrix=new Matrix4();var matrixWorldInv=new Matrix4();return function updateMatrixWorld(force){var bones=this.bones;var geometry=this.geometry;var position=geometry.getAttribute('position');matrixWorldInv.getInverse(this.root.matrixWorld);for(var i=0,j=0;i<bones.length;i++){var bone=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;Object3D.prototype.updateMatrixWorld.call(this,force);};}();/**
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
*/function PointLightHelper(light,sphereSize,color){this.light=light;this.light.updateMatrixWorld();this.color=color;var geometry=new SphereBufferGeometry(sphereSize,4,2);var material=new MeshBasicMaterial({wireframe:true,fog:false});Mesh.call(this,geometry,material);this.matrix=this.light.matrixWorld;this.matrixAutoUpdate=false;this.update();/*
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.prototype=Object.create(Mesh.prototype);PointLightHelper.prototype.constructor=PointLightHelper;PointLightHelper.prototype.dispose=function(){this.geometry.dispose();this.material.dispose();};PointLightHelper.prototype.update=function(){if(this.color!==undefined){this.material.color.set(this.color);}else{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(light,color){Object3D.call(this);this.light=light;this.light.updateMatrixWorld();this.matrix=light.matrixWorld;this.matrixAutoUpdate=false;this.color=color;var material=new LineBasicMaterial({fog:false});var geometry=new BufferGeometry();geometry.addAttribute('position',new BufferAttribute(new Float32Array(5*3),3));this.line=new Line(geometry,material);this.add(this.line);this.update();}RectAreaLightHelper.prototype=Object.create(Object3D.prototype);RectAreaLightHelper.prototype.constructor=RectAreaLightHelper;RectAreaLightHelper.prototype.dispose=function(){this.children[0].geometry.dispose();this.children[0].material.dispose();};RectAreaLightHelper.prototype.update=function(){// calculate new dimensions of the helper
var hx=this.light.width*0.5;var hy=this.light.height*0.5;var position=this.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;if(this.color!==undefined){this.line.material.color.set(this.color);}else{this.line.material.color.copy(this.light.color);}};/**
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
* @author Mugen87 / https://github.com/Mugen87
*/function HemisphereLightHelper(light,size,color){Object3D.call(this);this.light=light;this.light.updateMatrixWorld();this.matrix=light.matrixWorld;this.matrixAutoUpdate=false;this.color=color;var geometry=new OctahedronBufferGeometry(size);geometry.rotateY(Math.PI*0.5);this.material=new MeshBasicMaterial({wireframe:true,fog:false});if(this.color===undefined)this.material.vertexColors=VertexColors;var position=geometry.getAttribute('position');var colors=new Float32Array(position.count*3);geometry.addAttribute('color',new BufferAttribute(colors,3));this.add(new Mesh(geometry,this.material));this.update();}HemisphereLightHelper.prototype=Object.create(Object3D.prototype);HemisphereLightHelper.prototype.constructor=HemisphereLightHelper;HemisphereLightHelper.prototype.dispose=function(){this.children[0].geometry.dispose();this.children[0].material.dispose();};HemisphereLightHelper.prototype.update=function(){var vector=new Vector3();var color1=new Color();var color2=new Color();return function update(){var mesh=this.children[0];if(this.color!==undefined){this.material.color.set(this.color);}else{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);}colors.needsUpdate=true;}mesh.lookAt(vector.setFromMatrixPosition(this.light.matrixWorld).negate());};}();/**
* @author mrdoob / http://mrdoob.com/
*/function GridHelper(size,divisions,color1,color2){size=size||10;divisions=divisions||10;color1=new Color(color1!==undefined?color1:0x444444);color2=new Color(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();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);}GridHelper.prototype=Object.create(LineSegments.prototype);GridHelper.prototype.constructor=GridHelper;/**
* @author mrdoob / http://mrdoob.com/
* @author Mugen87 / http://github.com/Mugen87
* @author Hectate / http://www.github.com/Hectate
*/function PolarGridHelper(radius,radials,circles,divisions,color1,color2){radius=radius||10;radials=radials||16;circles=circles||8;divisions=divisions||64;color1=new Color(color1!==undefined?color1:0x444444);color2=new Color(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();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);}PolarGridHelper.prototype=Object.create(LineSegments.prototype);PolarGridHelper.prototype.constructor=PolarGridHelper;/**
* @author mrdoob / http://mrdoob.com/
* @author WestLangley / http://github.com/WestLangley
*/function FaceNormalsHelper(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();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();}FaceNormalsHelper.prototype=Object.create(LineSegments.prototype);FaceNormalsHelper.prototype.constructor=FaceNormalsHelper;FaceNormalsHelper.prototype.update=function(){var v1=new Vector3();var v2=new Vector3();var normalMatrix=new Matrix3();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(light,size,color){Object3D.call(this);this.light=light;this.light.updateMatrixWorld();this.matrix=light.matrixWorld;this.matrixAutoUpdate=false;this.color=color;if(size===undefined)size=1;var geometry=new BufferGeometry();geometry.addAttribute('position',new Float32BufferAttribute([-size,size,0,size,size,0,size,-size,0,-size,-size,0,-size,size,0],3));var material=new LineBasicMaterial({fog:false});this.lightPlane=new Line(geometry,material);this.add(this.lightPlane);geometry=new BufferGeometry();geometry.addAttribute('position',new Float32BufferAttribute([0,0,0,0,0,1],3));this.targetLine=new Line(geometry,material);this.add(this.targetLine);this.update();}DirectionalLightHelper.prototype=Object.create(Object3D.prototype);DirectionalLightHelper.prototype.constructor=DirectionalLightHelper;DirectionalLightHelper.prototype.dispose=function(){this.lightPlane.geometry.dispose();this.lightPlane.material.dispose();this.targetLine.geometry.dispose();this.targetLine.material.dispose();};DirectionalLightHelper.prototype.update=function(){var v1=new Vector3();var v2=new Vector3();var v3=new Vector3();return function update(){v1.setFromMatrixPosition(this.light.matrixWorld);v2.setFromMatrixPosition(this.light.target.matrixWorld);v3.subVectors(v2,v1);this.lightPlane.lookAt(v3);if(this.color!==undefined){this.lightPlane.material.color.set(this.color);this.targetLine.material.color.set(this.color);}else{this.lightPlane.material.color.copy(this.light.color);this.targetLine.material.color.copy(this.light.color);}this.targetLine.lookAt(v3);this.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(camera){var geometry=new BufferGeometry();var material=new LineBasicMaterial({color:0xffffff,vertexColors:FaceColors});var vertices=[];var colors=[];var pointMap={};// colors
var colorFrustum=new Color(0xffaa00);var colorCone=new Color(0xff0000);var colorUp=new Color(0x00aaff);var colorTarget=new Color(0xffffff);var colorCross=new Color(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(vertices,3));geometry.addAttribute('color',new Float32BufferAttribute(colors,3));LineSegments.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.prototype=Object.create(LineSegments.prototype);CameraHelper.prototype.constructor=CameraHelper;CameraHelper.prototype.update=function(){var geometry,pointMap;var vector=new Vector3();var camera=new Camera();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(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();geometry.setIndex(new BufferAttribute(indices,1));geometry.addAttribute('position',new BufferAttribute(positions,3));LineSegments.call(this,geometry,new LineBasicMaterial({color:color}));this.matrixAutoUpdate=false;this.update();}BoxHelper.prototype=Object.create(LineSegments.prototype);BoxHelper.prototype.constructor=BoxHelper;BoxHelper.prototype.update=function(){var box=new Box3();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.prototype.setFromObject=function(object){this.object=object;this.update();return this;};/**
* @author WestLangley / http://github.com/WestLangley
*/function Box3Helper(box,hex){this.type='Box3Helper';this.box=box;var color=hex!==undefined?hex: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=[1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1];var geometry=new BufferGeometry();geometry.setIndex(new BufferAttribute(indices,1));geometry.addAttribute('position',new Float32BufferAttribute(positions,3));LineSegments.call(this,geometry,new LineBasicMaterial({color:color}));this.geometry.computeBoundingSphere();}Box3Helper.prototype=Object.create(LineSegments.prototype);Box3Helper.prototype.constructor=Box3Helper;Box3Helper.prototype.updateMatrixWorld=function(force){var box=this.box;if(box.isEmpty())return;box.getCenter(this.position);box.getSize(this.scale);this.scale.multiplyScalar(0.5);Object3D.prototype.updateMatrixWorld.call(this,force);};/**
* @author WestLangley / http://github.com/WestLangley
*/function PlaneHelper(plane,size,hex){this.type='PlaneHelper';this.plane=plane;this.size=size===undefined?1:size;var color=hex!==undefined?hex:0xffff00;var positions=[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,0,1,0,0,0];var geometry=new BufferGeometry();geometry.addAttribute('position',new Float32BufferAttribute(positions,3));geometry.computeBoundingSphere();Line.call(this,geometry,new LineBasicMaterial({color:color}));//
var positions2=[1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1];var geometry2=new BufferGeometry();geometry2.addAttribute('position',new Float32BufferAttribute(positions2,3));geometry2.computeBoundingSphere();this.add(new Mesh(geometry2,new MeshBasicMaterial({color:color,opacity:0.2,transparent:true,depthWrite:false})));}PlaneHelper.prototype=Object.create(Line.prototype);PlaneHelper.prototype.constructor=PlaneHelper;PlaneHelper.prototype.updateMatrixWorld=function(force){var scale=-this.plane.constant;if(Math.abs(scale)<1e-8)scale=1e-8;// sign does not matter
this.scale.set(0.5*this.size,0.5*this.size,scale);this.lookAt(this.plane.normal);Object3D.prototype.updateMatrixWorld.call(this,force);};/**
* @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;var coneGeometry;function ArrowHelper(dir,origin,length,color,headLength,headWidth){// dir is assumed to be normalized
Object3D.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===undefined){lineGeometry=new BufferGeometry();lineGeometry.addAttribute('position',new Float32BufferAttribute([0,0,0,0,1,0],3));coneGeometry=new CylinderBufferGeometry(0,0.5,1,5,1);coneGeometry.translate(0,-0.5,0);}this.position.copy(origin);this.line=new Line(lineGeometry,new LineBasicMaterial({color:color}));this.line.matrixAutoUpdate=false;this.add(this.line);this.cone=new Mesh(coneGeometry,new MeshBasicMaterial({color:color}));this.cone.matrixAutoUpdate=false;this.add(this.cone);this.setDirection(dir);this.setLength(length,headLength,headWidth);}ArrowHelper.prototype=Object.create(Object3D.prototype);ArrowHelper.prototype.constructor=ArrowHelper;ArrowHelper.prototype.setDirection=function(){var axis=new Vector3();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.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;i<l;i++){var point=points[i];geometry.vertices.push(new Vector3(point.x,point.y,point.z||0));}return geometry;}});//
Object.assign(Path.prototype,{fromPoints:function(points){console.warn('THREE.Path: .fromPoints() has been renamed to .setFromPoints().');this.setFromPoints(points);}});//
function Spline(points){console.warn('THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.');CatmullRomCurve3.call(this,points);this.type='catmullrom';}Spline.prototype=Object.create(CatmullRomCurve3.prototype);Object.assign(Spline.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.prototype.setColors=function(){console.error('THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.');};SkeletonHelper.prototype.update=function(){console.error('THREE.SkeletonHelper: update() no longer needs to be called.');};//
Object.assign(Loader.prototype,{extractUrlBase:function(url){console.warn('THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.');return LoaderUtils.extractUrlBase(url);}});//
Object.assign(Box2.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.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.prototype.center=function(optionalTarget){console.warn('THREE.Line3: .center() has been renamed to .getCenter().');return this.getCenter(optionalTarget);};Object.assign(_Math,{random16:function(){console.warn('THREE.Math: .random16() has been deprecated. Use Math.random() instead.');return Math.random();},nearestPowerOfTwo:function(value){console.warn('THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().');return _Math.floorPowerOfTwo(value);},nextPowerOfTwo:function(value){console.warn('THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().');return _Math.ceilPowerOfTwo(value);}});Object.assign(Matrix3.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.error('THREE.Matrix3: .multiplyVector3Array() has been removed.');},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.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();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.error('THREE.Matrix4: .multiplyVector3Array() has been removed.');},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.prototype.isIntersectionLine=function(line){console.warn('THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().');return this.intersectsLine(line);};Quaternion.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.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(Triangle.prototype,{area:function(){console.warn('THREE.Triangle: .area() has been renamed to .getArea().');return this.getArea();},barycoordFromPoint:function(point,target){console.warn('THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().');return this.getBarycoord(point,target);},midpoint:function(target){console.warn('THREE.Triangle: .midpoint() has been renamed to .getMidpoint().');return this.getMidpoint(target);},normal:function(target){console.warn('THREE.Triangle: .normal() has been renamed to .getNormal().');return this.getNormal(target);},plane:function(target){console.warn('THREE.Triangle: .plane() has been renamed to .getPlane().');return this.getPlane(target);}});Object.assign(Triangle,{barycoordFromPoint:function(point,a,b,c,target){console.warn('THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().');return Triangle.getBarycoord(point,a,b,c,target);},normal:function(a,b,c,target){console.warn('THREE.Triangle: .normal() has been renamed to .getNormal().');return Triangle.getNormal(a,b,c,target);}});Object.assign(Shape.prototype,{extractAllPoints:function(divisions){console.warn('THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.');return this.extractPoints(divisions);},extrude:function(options){console.warn('THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.');return new ExtrudeGeometry(this,options);},makeGeometry:function(options){console.warn('THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.');return new ShapeGeometry(this,options);}});Object.assign(Vector2.prototype,{fromAttribute:function(attribute,index,offset){console.warn('THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().');return this.fromBufferAttribute(attribute,index,offset);},distanceToManhattan:function(v){console.warn('THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().');return this.manhattanDistanceTo(v);},lengthManhattan:function(){console.warn('THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().');return this.manhattanLength();}});Object.assign(Vector3.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.warn('THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().');return this.fromBufferAttribute(attribute,index,offset);},distanceToManhattan:function(v){console.warn('THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().');return this.manhattanDistanceTo(v);},lengthManhattan:function(){console.warn('THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().');return this.manhattanLength();}});Object.assign(Vector4.prototype,{fromAttribute:function(attribute,index,offset){console.warn('THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().');return this.fromBufferAttribute(attribute,index,offset);},lengthManhattan:function(){console.warn('THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().');return this.manhattanLength();}});//
Object.assign(Geometry.prototype,{computeTangents:function(){console.error('THREE.Geometry: .computeTangents() has been removed.');},computeLineDistances:function(){console.error('THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.');}});Object.assign(Object3D.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);},getWorldRotation:function(){console.error('THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.');}});Object.defineProperties(Object3D.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.prototype,{objects:{get:function(){console.warn('THREE.LOD: .objects has been renamed to .levels.');return this.levels;}}});Object.defineProperty(Skeleton.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.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.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.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.prototype,{length:{get:function(){console.warn('THREE.BufferAttribute: .length has been deprecated. Use .count instead.');return this.array.length;}},copyIndicesArray:function()/* indices */{console.error('THREE.BufferAttribute: .copyIndicesArray() has been removed.');}});Object.assign(BufferGeometry.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.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.assign(ExtrudeBufferGeometry.prototype,{getArrays:function(){console.error('THREE.ExtrudeBufferGeometry: .getArrays() has been removed.');},addShapeList:function(){console.error('THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.');},addShape:function(){console.error('THREE.ExtrudeBufferGeometry: .addShape() has been removed.');}});//
Object.defineProperties(Uniform.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.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();}},shading:{get:function(){console.error('THREE.'+this.type+': .shading has been removed. Use the boolean .flatShading instead.');},set:function(value){console.warn('THREE.'+this.type+': .shading has been removed. Use the boolean .flatShading instead.');this.flatShading=value===FlatShading;}}});Object.defineProperties(MeshPhongMaterial.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.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.prototype,{getCurrentRenderTarget:function(){console.warn('THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().');return this.getRenderTarget();},getMaxAnisotropy:function(){console.warn('THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().');return this.capabilities.getMaxAnisotropy();},getPrecision:function(){console.warn('THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.');return this.capabilities.precision;},resetGLState:function(){console.warn('THREE.WebGLRenderer: .resetGLState() is now .state.reset().');return this.state.reset();},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.');},setFaceCulling:function(){console.warn('THREE.WebGLRenderer: .setFaceCulling() has been removed.');}});Object.defineProperties(WebGLRenderer.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(){console.warn('THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.');return undefined;},set:function()/* value */{console.warn('THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.');}}});Object.defineProperties(WebGLShadowMap.prototype,{cullFace:{get:function(){console.warn('THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.');return undefined;},set:function()/* cullFace */{console.warn('THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.');}},renderReverseSided:{get:function(){console.warn('THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.');return undefined;},set:function(){console.warn('THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.');}},renderSingleSided:{get:function(){console.warn('THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.');return undefined;},set:function(){console.warn('THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.');}}});//
Object.defineProperties(WebGLRenderTarget.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;}}});//
Object.defineProperties(WebVRManager.prototype,{standing:{set:function()/* value */{console.warn('THREE.WebVRManager: .standing has been removed.');}}});//
Audio.prototype.load=function(file){console.warn('THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.');var scope=this;var audioLoader=new AudioLoader();audioLoader.load(file,function(buffer){scope.setBuffer(buffer);});return this;};AudioAnalyser.prototype.getData=function(){console.warn('THREE.AudioAnalyser: .getData() is now .getFrequencyData().');return this.getFrequencyData();};//
CubeCamera.prototype.updateCubeMap=function(renderer,scene){console.warn('THREE.CubeCamera: .updateCubeMap() is now .update().');return this.update(renderer,scene);};var minivents_commonjs=function Events(target){var events={},empty=[];target=target||this;/**
* On: listen to events
*/target.on=function(type,func,ctx){(events[type]=events[type]||[]).push([func,ctx]);return target;};/**
* Off: stop listening to event / specific callback
*/target.off=function(type,func){type||(events={});var list=events[type]||empty,i=list.length=func?list.length:0;while(i--)func==list[i][0]&&list.splice(i,1);return target;};/**
* Emit: send event, callbacks will be triggered
*/target.emit=function(type){var e=events[type]||empty,list=e.length>0?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;i<len;i++)n[i]='a['+i+']';// eslint-disable-next-line no-new-func
factories[len]=Function('F,a','return new F('+n.join(',')+')');}return factories[len](F,args);};var _bind=Function.bind||function bind(that/* , ...args */){var fn=_aFunction(this);var partArgs=arraySlice.call(arguments,1);var bound=function()/* args... */{var args=partArgs.concat(arraySlice.call(arguments));return this instanceof bound?construct(fn,args.length,args):_invoke(fn,args,that);};if(_isObject(fn.prototype))bound.prototype=fn.prototype;return bound;};// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])
var rConstruct=(_global.Reflect||{}).construct;// MS Edge supports only 2 arguments and argumentsList argument is optional
// FF Nightly sets third argument as `new.target`, but does not create `this` from it
var NEW_TARGET_BUG=_fails(function(){function F(){/* empty */}return !(rConstruct(function(){/* empty */},[],F)instanceof F);});var ARGS_BUG=!_fails(function(){rConstruct(function(){/* empty */});});_export(_export.S+_export.F*(NEW_TARGET_BUG||ARGS_BUG),'Reflect',{construct:function construct(Target,args/* , newTarget */){_aFunction(Target);_anObject(args);var newTarget=arguments.length<3?Target:_aFunction(arguments[2]);if(ARGS_BUG&&!NEW_TARGET_BUG)return rConstruct(Target,args,newTarget);if(Target==newTarget){// w/o altered newTarget, optimization for 0-4 arguments
switch(args.length){case 0:return new Target();case 1:return new Target(args[0]);case 2:return new Target(args[0],args[1]);case 3:return new Target(args[0],args[1],args[2]);case 4:return new Target(args[0],args[1],args[2],args[3]);}// w/o altered newTarget, lot of arguments case
var $args=[null];$args.push.apply($args,args);return new(_bind.apply(Target,$args))();}// with altered newTarget, not support built-in constructors
var proto=newTarget.prototype;var instance=_objectCreate(_isObject(proto)?proto:Object.prototype);var result=Function.apply.call(Target,instance,args);return _isObject(result)?result:instance;}});var construct$1=_core.Reflect.construct;var construct$2=construct$1;var construct$3=createCommonjsModule(function(module){function _construct$$1(Parent,args,Class){if(typeof Reflect!=="undefined"&&construct$2){module.exports=_construct$$1=construct$2;}else{module.exports=_construct$$1=function _construct$$1(Parent,args,Class){var a=[null];a.push.apply(a,args);var Constructor=Parent.bind.apply(Parent,a);var instance=new Constructor();if(Class)setPrototypeOf$2(instance,Class.prototype);return instance;};}return _construct$$1.apply(null,arguments);}module.exports=_construct$$1;});var wrapNativeSuper=createCommonjsModule(function(module){function _wrapNativeSuper$$1(Class){var _cache=typeof map$1==="function"?new map$1():undefined;module.exports=_wrapNativeSuper$$1=function _wrapNativeSuper$$1(Class){if(typeof Class!=="function"){throw new TypeError("Super expression must either be null or a function");}if(typeof _cache!=="undefined"){if(_cache.has(Class))return _cache.get(Class);_cache.set(Class,Wrapper);}function Wrapper(){}Wrapper.prototype=create$1(Class.prototype,{constructor:{value:Wrapper,enumerable:false,writable:true,configurable:true}});return setPrototypeOf$2(Wrapper,setPrototypeOf$2(function Super(){return construct$3(Class,arguments,getPrototypeOf$2(this).constructor);},Class));};return _wrapNativeSuper$$1(Class);}module.exports=_wrapNativeSuper$$1;});var CompositionError$1=/*#__PURE__*/function(_Error){function CompositionError(classInstance,message,component){var _this;classCallCheck(this,CompositionError);_this=possibleConstructorReturn(this,getPrototypeOf$2(CompositionError).call(this,"@".concat(classInstance,": ").concat(message)));var stackArray=_this.stack.split('\n');stackArray.splice(1,2);_this.stack=stackArray.join('\n');if(console)console.error('Component:',component);_this.name='CompositionError';return _this;}inherits(CompositionError,_Error);return CompositionError;}(wrapNativeSuper(Error));var DependencyError=/*#__PURE__*/function(_Error2){function DependencyError(classInstance,message,activeModule){var _this2;var dependencyModule=arguments.length>3&&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.<br/>
* This class includes basic event system with those supported methods:
* <pre>.on()</pre><pre>.off()</pre><pre>.emit()</pre>
* @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;i<max;i++){this.applyModule(this.modules[i],false);}}if(source)this.applyBridge({onCopy:source});}// APPLYING MODULE (...and a "bridge" for module)
/**
* @method applyBridge
* @instance
* @description Makes component-specific API to work with modules.
* @param {Object} bridgeMap
* @return {Object} Returns object with modified values.
* @memberof module:core.ModuleSystem
*/},{key:"applyBridge",value:function applyBridge(){var bridgeMap=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var modules=this.modules;if(!modules)return bridgeMap;for(var i=0,max=modules.length;i<max;i++){for(var key in bridgeMap){if(bridgeMap[key]){var module=modules[i];if(module&&module.bridge&&module.bridge[key])bridgeMap[key]=module.bridge[key].apply(this,[bridgeMap[key],module]);}}}return bridgeMap;}/**
* @method applyCommand
* @instance
* @description .applyCommand runs a method called `name` on all modules.
* @param {String} name the method name.
* @param {Function} [cb=(func, moduleScope) => 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;i<max;i++){var module=modules[i];if(name in module)cb(module[name],module);}}/**
* @method applyModule
* @instance
* @description .applyModule is also used in .integrateModules() function.
* It does exactly what its name says (applies module to component or app).
* @param {Object} module the module to apply
* @param {Boolean} [push=true]
* @return {Object} Returns module that was applied.
* @throws {ManagerError}
* @memberof module:core.ModuleSystem
*/},{key:"applyModule",value:function applyModule(module){var push=arguments.length>1&&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 <caption>Piped modules</caption>
* 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;i<listeners.length;i++){var listener=listeners[i];listener();}return action;}/**
* Replaces the reducer currently used by the store to calculate the state.
*
* You might need this if your app implements code splitting and you want to
* load some of the reducers dynamically. You might also need this if you
* implement a hot reloading mechanism for Redux.
*
* @param {Function} nextReducer The reducer for the store to use instead.
* @returns {void}
*/function replaceReducer(nextReducer){if(typeof nextReducer!=='function'){throw new Error('Expected the nextReducer to be a function.');}currentReducer=nextReducer;dispatch({type:ActionTypes.REPLACE});}/**
* Interoperability point for observable/reactive libraries.
* @returns {observable} A minimal observable of state changes.
* For more information, see the observable proposal:
* https://github.com/tc39/proposal-observable
*/function observable(){var _ref;var outerSubscribe=subscribe;return _ref={/**
* The minimal observable subscription method.
* @param {Object} observer Any object that can be used as an observer.
* The observer object should have a `next` method.
* @returns {subscription} An object with an `unsubscribe` method that can
* be used to unsubscribe the observable from the store, and prevent further
* emission of values from the observable.
*/subscribe:function subscribe(observer){if((typeof observer==='undefined'?'undefined':_typeof$1(observer))!=='object'||observer===null){throw new TypeError('Expected the observer to be an object.');}function observeState(){if(observer.next){observer.next(getState());}}observeState();var unsubscribe=outerSubscribe(observeState);return {unsubscribe:unsubscribe};}},_ref[result]=function(){return this;},_ref;}// When a store is created, an "INIT" action is dispatched so that every
// reducer returns their initial state. This effectively populates
// the initial state tree.
dispatch({type:ActionTypes.INIT});return _ref2={dispatch:dispatch,subscribe:subscribe,getState:getState,replaceReducer:replaceReducer},_ref2[result]=observable,_ref2;}/**
* @class ModuleManager
* @category core
* @param {Object} object handler
* @description Solves modules dependencies
* @memberof module:core
*/var ModuleManager=/*#__PURE__*/function(){function ModuleManager(object){classCallCheck(this,ModuleManager);this.handler=object;this.currentModule=null;this.store=createStore(function(){var state=arguments.length>0&&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() <br/><br/>
* Use this method if you know that you will overwrite existing dependency.<br/>
* 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 <caption>Get the 'hello' dependency</caption>
* 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 <caption>Check whether the store has the 'hello' dependency</caption>
* 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;i<mappers.length;i++){var mapper=mappers[i];for(var k=0;k<mapper.map.length;k++){var attribute=mapper.map[k];Object.defineProperty(target.prototype,attribute,{get:mapper.getter(attribute),set:mapper.setter(attribute),configurable:mapper.configurable,enumerable:mapper.enumerable});}}};}function copy(){for(var _len2=arguments.length,map=new Array(_len2),_key2=0;_key2<_len2;_key2++){map[_key2]=arguments[_key2];}return {map:map,getter:function getter(name){return function(){return this.native[name];};},setter:function setter(name){return function(value){this.native[name].copy(value);};},configurable:true,enumerable:true};}function mirror(){for(var _len3=arguments.length,map=new Array(_len3),_key3=0;_key3<_len3;_key3++){map[_key3]=arguments[_key3];}return {map:map,getter:function getter(name){return function(){return this.native[name];};},setter:function setter(name){return function(value){this.native[name]=value;};},configurable:true,enumerable:true};}var _dec,_class;var/**
* @class MeshComponent
* @category core
* @param {Object} [params] - The parameters object.
* @param {Object} [instructions] - The instructions object.
* @extends module:core.Component
* @memberof module:core
*/MeshComponent=(_dec=attributes(copy('position','rotation','quaternion','scale'),mirror('material','geometry')),_dec(_class=/*#__PURE__*/function(_Component){createClass(MeshComponent,null,[{key:"custom",/**
* Default values for parameters
* @member {Object} module:core.MeshComponent#defaults
* @static
* @default
* {
* 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}
* }
*/ /**
* Static instructions
* @member {Object} module:core.MeshComponent#instructions
* @static
* @default
* {
* position: ['x', 'y', 'z'],
* rotation: ['x', 'y', 'z'],
* scale: ['x', 'y', 'z']
* }
*/ // CUSTOM GEOMETRY HANDLING
value:function custom(geom){var constructor=arguments.length>1&&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;i<ll;i++){var e=loops[i];if(e.enabled)e.execute(e.clock);}}this.enabled=true;process();}/**
* @method stop
* @description Stops rendering loops
* @memberof module:core.App
*/},{key:"stop",value:function stop(){this.enabled=false;}/**
* @method addLoop
* @description Adds loop to this app.
* @param {Object} loop - the loop to add
* @return {Promise} Promise that is resolved when promises completed.
* @memberof module:core.App
* @example <caption>Adding a loop to an app</caption>
* 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 <caption>Creating an AmbientLight </caption>
* 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.<br/><br/>
* This light will behave as though it is infinitely far away and the rays produced from it are all parallel. <br/><br/>
* 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.<br/><br/>
* 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 <caption>Creating a DirectionalLight to fall down from vec3(10, 20, 10) to vec3(0, 0, 0)</caption>
* 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.<br/>
* It also doesn't need position and target properties.
* @classDesc
* <iframe src="https://threejs.org/examples/webgl_lights_hemisphere.html"></iframe>
* @param {Object} [params={light: {skyColor: 0xffffff, groundColor: 0xffffff, intensity: 1}}] - The params.
* @extends module:core.LightComponent
* @memberof module:components/lights
* @example <caption>Creating a HemisphereLight</caption>
* 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.)<br/><br/>
* It has the same options as AmbientLight in light paramater, but it also supports position, distance and decay.<br/>
* @param {Object} [params={light: {color: 0xffffff, intensity: 1, distance: 100, decay: 1}}] - The params.
* @extends LightComponent
* @memberof module:components/lights
* @example <caption>Creating a PointLight</caption>
* 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. <br/><br/>
* It has the same parameters as AmbientLight in light, but it also supports pos and target. <br/><br/>
* SpotLight affects meshes with lambert and phong material.
* @classDesc
* <iframe src="https://threejs.org/examples/webgl_lights_spotlight.html"></iframe>
* @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 <caption>Creating a SpotLight that falls down from vec3(10, 20, 10) to vec3(0, 0, 0)</caption>
* 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 <caption>Creates a CubeCamera and set it as app's camera</caption>
* 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 <pre>
* {
* camera: {
* near: 1,
* far: 1000,
* cubeResolution: 128
* }
* }</pre>
*/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 <caption>Create an OrthographicCamera and set it as app's camera</caption>
* 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 <pre>
* {
* near: 1,
* far: 1000,
* left: system.window.innerWidth / -2,
* right: system.window.innerWidth / 2,
* top: system.window.innerHeight / 2,
* bottom: system.window.innerHeight / -2
* }</pre>
*/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 <caption>Create an PerspectiveCamera and set it as app's camera</caption>
* 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 <pre>
* {
* near: 1,
* far: 1000,
* fov: 75,
* aspect: system.window.innerWidth / system.window.innerHeight
* }</pre>
*/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
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#BoxGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Box, and adding to app</caption>
* 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 <pre>
* {
* geometry: {
* width: 1,
* height: 1,
* depth: 1,
* widthSegments: 1,
* heightSegments: 1,
* depthSegments: 1
* }
* }</pre>
*/ /**
* 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
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#CircleGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Circle, and adding to app</caption>
* 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 <pre>
* {
* geometry: {
* radius: 50,
* segments: 8,
* thetaStart: 0,
* thetaLength: Math.PI * 2
* }
* }</pre>
*/ /**
* 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. <br/><br/>
* The solid enclosed by this surface and by two planes perpendicular to the axis is also called a cylinder.<br/>
* The surface area and the volume of a cylinder have been known since deep antiquity.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#ConeGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Cone, and adding to app</caption>
* 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 <pre>
* {
* geometry: {
* radius: 20,
* height: 100,
* radiusSegments: 32,
* heightSegments: 1,
* openEnded: false,
* thetaStart: 0,
* thetaLength: Math.PI * 2
* }
* }</pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Cone#instructions
* @static
* @default <pre>
* geometry: [
* 'radius',
* 'height',
* 'radiusSegments',
* 'heightSegments',
* 'openEnded',
* 'thetaStart',
* 'thetaLength'
* ]
* </pre>
*/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. <br/><br/>
* The solid enclosed by this surface and by two planes perpendicular to the axis is also called a cylinder.<br/>
* The surface area and the volume of a cylinder have been known since deep antiquity.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#CylinderGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Cylinder, and adding to app</caption>
* 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 <pre>
* {
* geometry: {
* radiusTop: 20,
* radiusBottom: 20,
* height: 100,
* radiusSegments: 32,
* heightSegments: 1,
* openEnded: false,
* thetaStart: 0,
* thetaLength: Math.PI * 2
* }
* }</pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Cylinder#instructions
* @static
* @default <pre>
* geometry: [
* 'radiusTop',
* 'radiusBottom',
* 'height',
* 'radiusSegments',
* 'heightSegments',
* 'openEnded',
* 'thetaStart',
* 'thetaLength'
* ]
* </pre>
*/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. <br/><br/>
* The most familiar dodecahedron is the regular dodecahedron, which is a Platonic solid. <br/>
* There are also three regular star dodecahedra, which are constructed as stellations of the convex form. <br/>
* All of these have icosahedral symmetry, order 120.
* Dodecahedron creates Dodecahedron object by it's radius and detail.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#DodecahedronGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Dodecahedron, and adding to app</caption>
* 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 <pre>
* geometry: {
* radius: 1,
* detail: 0
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Dodecahedron#instructions
* @static
* @default <pre>
* geometry: ['radius', 'detail']
* </pre>
*/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 <a href='https://threejs.org/docs/#api/math/Vector2'>THREE.Vector2.</a> <br/>
* Such implementation will help you to make volumed shapes that have their own depth and can be seen from all angels.<br/><br/>
* You can also find some interesting examples made using <a href='threejs.org'>three.js</a> which is a core of whs.js, such as:
* - <a href='http://threejs.org/examples/webgl_geometry_extrude_shapes.html'>Webgl geometry extrude</a>
* - <a href='http://threejs.org/examples/webgl_geometry_extrude_shapes2.html'>Extrude shapes from geodata</a>
* - <a href='http://threejs.org/examples/webgl_geometry_extrude_splines.html'>Extrude splines</a>
*
* Such examples can be easily implemented using whitestorm.js or it's plugins. Use `Extrude` class with <a href='https://threejs.org/docs/#api/extras/core/Shape'>THREE.Shape</a> to get extrude effect of shape defined by 2D vectors.
* This class is similar to <a href='https://threejs.org/docs/#api/geometries/ExtrudeGeometry'>THREE.ExtrudeGeometry</a>,
* but it also contains all properties, applied by `Shape`, such as material, mass and vectors like position (pos) and rotation (rot).
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#ExtrudeGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a shape, then an Extrude from it</caption>
* 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 <pre>
* {
* geometry: {
* shapes: [],
* options: {}
* }
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Extrude#instructions
* @static
* @default <pre>
* {
* geometry: ['shapes', 'options']
* }
* </pre>
*/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.<br/>
* There are many kinds of icosahedra, with some being more symmetrical than others. The most well known is the Platonic, convex regular icosahedron.<br/>
* `Icosahedron` creates an Icosahedron object by its radius and detail.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#IcosahedronGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Icosahedron, and adding to app</caption>
* 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 <pre>
* {
* geometry: {
* radius: 1,
* detail: 0
* }
* }</pre>
*/ /**
* 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.<br/><br/>
* 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. <br/><br/>
* The <a href='http://threejs.org/docs/scenes/geometry-browser.html#LatheGeometry'>following example</a> shows a geometry which can be generated using `Lathe` class.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#LatheGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Lath, and adding to app</caption>
* 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 <pre>
* {
* geometry: {
* points: []
* }
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Lathe#instructions
* @static
* @default <pre>{
* geometry: ['points']
* }
* </pre>
*/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 <caption>Creating a Line, and adding to app</caption>
* 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 <pre>
* {
* curve: new LineCurve3(new Vector3(0, 0, 0), new Vector3(10, 0, 0)),
* points: 50
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Line#instructions
* @static
* @default <pre>{
* geometry: ['curve', 'points']
* }
* </pre>
*/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;i<max;i++){var i3=i*3;verts[i3]=pp[i].x;verts[i3+1]=pp[i].y;verts[i3+2]=pp[i].z;}geometry.addAttribute('position',new BufferAttribute(verts,3));}else geometry.vertices=params.curve.getPoints(params.points);return geometry;}}]);inherits(Line$$1,_MeshComponent);return Line$$1;}(MeshComponent);defineProperty$3(defineProperty$3(Line$1,"defaults",objectSpread({},MeshComponent.defaults,{curve:null,points:50})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['curve','points']}));/**
* @class Importer
* @category components/meshes
* @description Importer is a loader for meshes and any other data to your scene
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Importer, and adding to app</caption>
* 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 <pre>
* {
* url: '',
* loader: new JSONLoader(),
*
* onLoad() {},
* onProgress() {},
* onError() {},
*
* texturePath: null,
* useCustomMaterial: false,
*
* parser(geometry, materials) {
* return new Mesh(geometry, materials);
* }
* }</pre>
*/ /**
* @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 <caption>Removing unnecessary lights from children</caption>
* 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.
* <br/><br/>
* `Octahedron` creates an Octahedron object by its `radius` and `detail`.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#OctahedronGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating an Octahedron, and adding to app</caption>
* 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 <pre>
* {
* geometry: {
* radius: 1,
* detail: 0
* }
* }
* </pre>
*/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 <a href='https://en.wikipedia.org/wiki/Parametric_surface'>Parametric surface</a>
* <br/><br/>
* It is usually used to develop different kinds of highfields or visualize a <a href='https://stemkoski.github.io/Three.js/Graphulus-Function.html'>math function</a>.
* <br/>
* - <a href='http://math.hws.edu/graphicsbook/source/threejs/curves-and-surfaces.html'>Parametric surface</a>
* - <a href='https://stemkoski.github.io/Three.js/Graphulus-Surface.html'>"Graphulus"</a>
* <br/><br/>
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#ParametricGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>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`.</caption>
* 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 <pre>
* {
* geometry: {
* func: (u, v) => new Vector3(u, v, 0),
* slices: 10,
* tacks: 10
* }
* }
* </pre>
*/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
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#PlaneGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Plane, and adding to app</caption>
* 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 <pre>
* {
* geometry: {
* width: 10,
* height: 10,
* wSegments: 1,
* hSegments: 1
* }
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Plane#instructions
* @static
* @default <pre>
* {
* geometry: ['width', 'height', 'wSegments', 'hSegments']
* }
* </pre>
*/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.
* <br/><br/>
* `Polyhedron` creates a Polyhedron by its `radius` and `detail`.
* <br/><br/>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating an Polyhedron, and adding to app</caption>
* 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 <pre>
* {
* 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
* }
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Polyhedron#instructions
* @static
* @default <pre>
* {
* geometry: ['verticesOfCube', 'indicesOfFaces', 'radius', 'detail']
* }
* </pre>
*/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
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#RingGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Ring, and adding to app</caption>
* 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 <pre>
* {
* geometry: {
* innerRadius: 0,
* outerRadius: 50,
* thetaSegments: 8,
* phiSegments: 8,
* thetaStart: 0,
* thetaLength: Math.PI * 2
* }
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Ring#instructions
* @static
* @default <pre>
* {
* geometry: [
* 'innerRadius',
* 'outerRadius',
* 'thetaSegments',
* 'phiSegments',
* 'thetaStart',
* 'thetaLength'
* ]
* }
* </pre>
*/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.<br/>
* Unfortunately, not all of them support physics, an alternative is to make a similar 3D object and scale its width down to near zero.
* <br/><br/>
* `Shape` consists of shapes that are in its shapes parameter.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#ShapeGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a plane looking Shape from a THREE.Shape, and adding it to app</caption>
* 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 <pre>
* {
* geometry: {
* shapes: []
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Shape#instructions
* @static
* @default <pre>
* {
* geometry: ['shapes']
* }
* </pre>
*/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.
* <br/><br/>
* 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).
* <br/><br/>
* 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
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#SphereGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Sphere, and adding it to app</caption>
* 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 <pre>
* {
* geometry: {
* radius: 1,
* widthSegments: 8,
* heightSegments: 6
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Sphere#instructions
* @static
* @default <pre>
* {
* geometry: ['radius', 'widthSegments', 'heightSegments']
* }
* </pre>
*/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.
* <br/><br/>
* `Tetrahedron` creates a Tetrahedron object by its `radius` and `detail`
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#TetrahedronGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Tetrahedron, and adding it to app</caption>
* 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 <pre>
* {
* geometry: {
* radius: 1,
* detail: 0
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Tetrahedron#instructions
* @static
* @default <pre>
* {
* geometry: ['radius', 'detail']
* }
* </pre>
*/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
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#TextGeometry"></iframe>
* <br/><br/>
* 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 <caption>Creating a Text, and adding it to app</caption>
* 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 <pre>
* {
* text: 'Hello World!',
* font: null,
*
* geometry: {
* size: 12,
* height: 50,
* curveSegments: 12,
* font: new Font(),
* bevelEnabled: false,
* bevelThickness: 10,
* bevelSize: 8
* }
* }
* </pre>
*/ /**
* 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
* <iframe src="https://threejs.org/docs/index.html#api/geometries/TorusGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Torus, and adding it to app</caption>
* 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 <pre>
* {
* geometry: {
* radius: 100,
* tube: 40,
* radialSegments: 8,
* tubularSegments: 6,
* arc: Math.PI * 2
* }
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Torus#instructions
* @static
* @default <pre>
* {
* geometry: [
* 'radius',
* 'tube',
* 'radialSegments',
* 'tubularSegments',
* 'arc'
* ]
* }
* </pre>
*/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
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#TorusKnotGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Torusknot, and adding it to app</caption>
* 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 <pre>
* {
* geometry: {
* radius: 100,
* tube: 40,
* radialSegments: 64,
* tubularSegments: 8,
* p: 2,
* q: 3
* }
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Torusknot#instructions
* @static
* @default <pre>
* {
* geometry: [
* 'radius',
* 'tube',
* 'radialSegments',
* 'tubularSegments',
* 'p',
* 'q'
* ]
* }
* </pre>
*/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
* <iframe src="https://threejs.org/docs/index.html#api/geometries/TubeGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Tube from a three.js Curve, and adding it to app</caption>
* 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 <pre>
* {
* geometry: {
* path: new THREE.LineCurve3(new Vector3(0, 0, 0), new Vector3(0, 0, 1)),
* segments: 20,
* radius: 2,
* radiusSegments: 8,
* closed: false
* }
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Tube#instructions
* @static
* @default <pre>
* {
* geometry: [
* 'path',
* 'segments',
* 'radius',
* 'radiusSegments',
* 'closed'
* ]
* }
* </pre>
*/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).<br/>
* In Three.js you make it using `THREE.Object3D` and it's children. <br/><br/>
* In whs.js we have `Group`
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Approach 2 - Adding objects to an empty group</caption>
* const sphere = new Sphere();
* const box = new Box();
* const group = new Group();
*
* sphere.addTo(group);
* box.addTo(group);
* @example <caption>Approach 2 - Making a group from objects</caption>
* 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;i<arguments.length;i++){var obj=i<0||arguments.length<=i?undefined:arguments[i];if(obj instanceof Component)obj.addTo(assertThisInitialized(assertThisInitialized(_this)));else if(obj instanceof Object3D)_this.native.add(obj);}return _this;}createClass(Group$$1,[{key:"build",value:function build(){return new Object3D();}}]);inherits(Group$$1,_MeshComponent);return Group$$1;}(MeshComponent);/** @module components/meshes */ /**
* @class ElementModule
* @category modules/app
* @param {Object} [container=document.body] container is the DOM object to which application's canvas will be added to.
* @memberof module:modules/app
* @example <caption>Creating an element module, passing it to the App</caption>
* 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 <caption> Creating a rendering module and passing it to App's modules</caption>
* 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 <packing>\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 <common>\r\n#include <dithering_pars_fragment>\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 <dithering_fragment>\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 <packing>\r\n#include <clipping_planes_pars_fragment>\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 <clipping_planes_fragment>\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 <common>\r\n#include <morphtarget_pars_vertex>\r\n#include <skinning_pars_vertex>\r\n#include <clipping_planes_pars_vertex>\r\n\r\nvarying float vViewZ;\r\nvarying vec4 vProjTexCoord;\r\n\r\nvoid main() {\r\n\r\n\t#include <skinbase_vertex>\r\n\r\n\t#include <begin_vertex>\r\n\t#include <morphtarget_vertex>\r\n\t#include <skinning_vertex>\r\n\t#include <project_vertex>\r\n\r\n\tvViewZ = mvPosition.z;\r\n\tvProjTexCoord = gl_Position;\r\n\r\n\t#include <clipping_planes_vertex>\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 <common>\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 <common>\r\n#include <dithering_pars_fragment>\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 <dithering_fragment>\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 <common>\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 <common>\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 <packing>\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 <common>\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 <common>\r\n#include <dithering_pars_fragment>\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 <dithering_fragment>\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;i<l;++i){// Alternate between targets.
destRT=i%2===0?renderTargetX:renderTargetY;uniforms.kernel.value=kernel[i];uniforms.tDiffuse.value=lastRT.texture;renderer.render(scene,camera,destRT);lastRT=destRT;}if(this.dithering){material=this.ditheredConvolutionMaterial;uniforms=material.uniforms;this.material=material;}uniforms.kernel.value=kernel[i];uniforms.tDiffuse.value=lastRT.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){width=Math.max(1,Math.floor(width*this.resolutionScale));height=Math.max(1,Math.floor(height*this.resolutionScale));this.renderTargetX.setSize(width,height);this.renderTargetY.setSize(width,height);this.convolutionMaterial.setTexelSize(1.0/width,1.0/height);this.ditheredConvolutionMaterial.setTexelSize(1.0/width,1.0/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.renderTargetX.texture.format=RGBFormat;this.renderTargetY.texture.format=RGBFormat;}}},{key:"width",get:function get(){return this.renderTargetX.width;}/**
* The absolute height of the internal render targets.
*
* @type {Number}
*/},{key:"height",get:function get(){return this.renderTargetX.height;}/**
* The kernel size.
*
* @type {KernelSize}
*/},{key:"kernelSize",get:function get(){return this.convolutionMaterial.kernelSize;}/**
* @type {KernelSize}
*/,set:function set(){var value=arguments.length>0&&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;i<pixels;++i){x=Math.random();data[i*3]=x;data[i*3+1]=x;data[i*3+2]=x;}if(dt!==null){dt.dispose();}dt=new DataTexture(data,size,size,RGBFormat,FloatType);dt.needsUpdate=true;this.perturbMap=dt;return dt;}/**
* 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 mode=this.mode;var counter=this.counter;var breakPoint=this.breakPoint;var uniforms=this.material.uniforms;uniforms.tDiffuse.value=inputBuffer.texture;uniforms.seed.value=Math.random();uniforms.active.value=true;if(counter%breakPoint===0||mode===GlitchMode.CONSTANT_WILD){uniforms.amount.value=Math.random()/30.0;uniforms.angle.value=randomFloat(-Math.PI,Math.PI);uniforms.seedX.value=randomFloat(-1.0,1.0);uniforms.seedY.value=randomFloat(-1.0,1.0);uniforms.distortionX.value=randomFloat(0.0,1.0);uniforms.distortionY.value=randomFloat(0.0,1.0);this.breakPoint=randomInt(120,240);this.counter=0;}else{if(counter%breakPoint<breakPoint/5||mode===GlitchMode.CONSTANT_MILD){uniforms.amount.value=Math.random()/90.0;uniforms.angle.value=randomFloat(-Math.PI,Math.PI);uniforms.distortionX.value=randomFloat(0.0,1.0);uniforms.distortionY.value=randomFloat(0.0,1.0);uniforms.seedX.value=randomFloat(-0.3,0.3);uniforms.seedY.value=randomFloat(-0.3,0.3);}else{// Sporadic.
uniforms.active.value=false;}}++this.counter;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}},{key:"perturbMap",get:function get(){return this.texture;}/**
* Assigning a new perturbation map does not destroy the current one!
*
* @type {Texture}
*/,set:function set(value){this.texture=value;this.material.uniforms.tPerturb.value=value;}}]);inherits(GlitchPass,_Pass);return GlitchPass;}(Pass);/**
* A glitch mode enumeration.
*
* @type {Object}
* @property {Number} SPORADIC - Sporadic glitches.
* @property {Number} CONSTANT_MILD - Constant mild glitches.
* @property {Number} CONSTANT_WILD - Constant wild glitches.
*/var GlitchMode={SPORADIC:0,CONSTANT_MILD:1,CONSTANT_WILD:2};/**
* A pass that renders a given scene directly on screen or into the read buffer
* for further processing.
*/var RenderPass=/*#__PURE__*/function(_Pass){/**
* Constructs a new render pass.
*
* @param {Scene} scene - The scene to render.
* @param {Camera} camera - The camera to use to render the scene.
* @param {Object} [options] - Additional options.
* @param {Material} [options.overrideMaterial=null] - An override material for the scene.
* @param {Color} [options.clearColor=null] - An override clear color.
* @param {Number} [options.clearAlpha=1.0] - An override clear alpha.
* @param {Boolean} [options.clearDepth=false] - Whether depth should be cleared explicitly.
* @param {Boolean} [options.clear=true] - Whether all buffers should be cleared.
*/function RenderPass(scene,camera){var _this;var options=arguments.length>2&&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<l;++i){selection[i].layers.enable(selectionLayer);}this.selection=selection;return this;}/**
* Clears the list of selected objects.
*
* @return {OutlinePass} This pass.
*/},{key:"clearSelection",value:function clearSelection(){var selection=this.selection;var selectionLayer=this.selectionLayer;var i,l;for(i=0,l=selection.length;i<l;++i){selection[i].layers.disable(selectionLayer);}this.selection=[];this.time=0.0;return this;}/**
* Selects an object.
*
* @param {Object3D} object - The object that should be outlined.
* @return {OutlinePass} This pass.
*/},{key:"selectObject",value:function selectObject(object){object.layers.enable(this.selectionLayer);this.selection.push(object);return this;}/**
* Deselects an object.
*
* @param {Object3D} object - The object that should no longer be outlined.
* @return {OutlinePass} This pass.
*/},{key:"deselectObject",value:function deselectObject(object){var selection=this.selection;var index=selection.indexOf(object);if(index>=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;i<l;++i){if(visible){selection[i].layers.enable(0);}else{selection[i].layers.disable(0);}}}/**
* 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 mainScene=this.mainScene;var mainCamera=this.mainCamera;var pulse=this.outlineBlendMaterial.uniforms.pulse;var background,mask;if(this.selection.length>0){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<<this.selectionLayer;this.renderPassMask.render(renderer,this.renderTargetMask);// Restore the camera layer mask and the scene background.
mainCamera.layers.mask=mask;mainScene.background=background;// Detect the outline.
this.material=this.outlineEdgesMaterial;renderer.render(this.scene,this.camera,this.renderTargetEdges);if(this.blurPass.enabled){// Blur the edges.
this.blurPass.render(renderer,this.renderTargetEdges,this.renderTargetBlurredEdges);}if(this.blend){// Draw the final overlay onto the scene colours.
this.material=this.outlineBlendMaterial;this.outlineBlendMaterial.uniforms.tDiffuse.value=inputBuffer.texture;renderer.render(this.scene,this.camera,this.renderToScreen?null:this.outputBuffer);}}else if(this.renderToScreen){// Draw the read buffer to screen.
this.copyPass.render(renderer,inputBuffer);}}/**
* Updates the size of this pass.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/},{key:"setSize",value:function setSize(width,height){this.renderTargetDepth.setSize(width,height);this.renderTargetMask.setSize(width,height);this.renderPassDepth.setSize(width,height);this.renderPassMask.setSize(width,height);this.blurPass.setSize(width,height);width=this.blurPass.width;height=this.blurPass.height;this.renderTargetEdges.setSize(width,height);this.renderTargetBlurredEdges.setSize(width,height);this.outlineBlendMaterial.uniforms.aspect.value=width/height;this.outlineEdgesMaterial.setTexelSize(1.0/width,1.0/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.renderPassDepth.initialize(renderer,alpha);this.renderPassMask.initialize(renderer,alpha);this.blurPass.initialize(renderer,alpha);}},{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.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;i<l;++i){pass=passes[i];if(pass.enabled){pass.render(renderer,inputBuffer,outputBuffer,delta,stencilTest);if(pass.needsSwap){if(stencilTest){copyPass.renderToScreen=pass.renderToScreen;context=renderer.context;state=renderer.state;// Preserve the unaffected pixels.
state.buffers.stencil.setFunc(context.NOTEQUAL,1,0xffffffff);copyPass.render(renderer,inputBuffer,outputBuffer,delta,stencilTest);state.buffers.stencil.setFunc(context.EQUAL,1,0xffffffff);}buffer=inputBuffer;inputBuffer=outputBuffer;outputBuffer=buffer;}if(pass instanceof MaskPass){stencilTest=true;}else if(pass instanceof ClearMaskPass){stencilTest=false;}}}}/**
* Sets the size of the buffers and the renderer's output canvas.
*
* Every pass will be informed of the new size. It's up to each pass how that
* information is used.
*
* If no width or height is specified, the render targets and passes will be
* updated with the current size of the renderer.
*
* @param {Number} [width] - The width.
* @param {Number} [height] - The height.
*/},{key:"setSize",value:function setSize(width,height){var passes=this.passes;var renderer=this.renderer;var size,drawingBufferSize;var i,l;if(width===undefined||height===undefined){size=renderer.getSize();width=size.width;height=size.height;}// Update the logical render size.
renderer.setSize(width,height);// The drawing buffer size takes the device pixel ratio into account.
drawingBufferSize=renderer.getDrawingBufferSize();this.inputBuffer.setSize(drawingBufferSize.width,drawingBufferSize.height);this.outputBuffer.setSize(drawingBufferSize.width,drawingBufferSize.height);for(i=0,l=passes.length;i<l;++i){passes[i].setSize(drawingBufferSize.width,drawingBufferSize.height);}}/**
* Resets this composer by deleting all passes and creating new buffers.
*/},{key:"reset",value:function reset(){var renderTarget=this.createBuffer(this.inputBuffer.depthBuffer,this.inputBuffer.stencilBuffer,this.inputBuffer.depthTexture!==null);this.dispose();// Reanimate.
this.inputBuffer=renderTarget;this.outputBuffer=renderTarget.clone();this.copyPass=new ShaderPass(new CopyMaterial());}/**
* Destroys this composer and all passes.
*
* This method deallocates all disposable objects created by the passes. It
* also deletes the main frame buffers of this composer.
*/},{key:"dispose",value:function dispose(){var passes=this.passes;var i,l;for(i=0,l=passes.length;i<l;++i){passes[i].dispose();}this.passes=[];if(this.inputBuffer!==null){this.inputBuffer.dispose();this.inputBuffer=null;}if(this.outputBuffer!==null){this.outputBuffer.dispose();this.outputBuffer=null;}this.copyPass.dispose();}},{key:"depthTexture",get:function get(){return this.inputBuffer.depthTexture;}/**
* The input and output buffers share a single depth texture. Depth will be
* written to this texture when something is rendered into one of the buffers
* and the involved materials have depth write enabled.
*
* You may enable this mechanism during the instantiation of the composer or
* by assigning a DepthTexture instance later on. You may also disable it by
* assigning null.
*
* @type {DepthTexture}
*/,set:function set(x){this.inputBuffer.depthTexture=x;this.outputBuffer.depthTexture=x;}}]);return EffectComposer;}();var polyfill=function polyfill(object,method){var showWarn=arguments.length>2&&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 <caption> Creating a rendering module and passing it to App's modules</caption>
* 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 <caption> Creating a rendering module and passing it to App's modules</caption>
* 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 <caption>How to create and apply a FogModule</caption>
* 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 <caption> Creating a state module</caption>
* 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 <caption> Adding `green` configuration</caption>
* 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 <caption> Update callback for `sphereColor`</caption>
* 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 <caption> Changes configuration to `green`</caption>
* 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 <caption> Creating a rendering module and passing it to App's modules</caption>
* 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 <caption>Creating an instance. url takes a path, or a data object.</caption>
* var woodTexture = new TextureModule({
* url: `${process.assetsPath}/textures/wood.jpg`
* });
* @example <caption>More comprehensive example, wood texture applied to a Box.</caption>
* 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 <a href='https://threejs.org/docs/#manual/introduction/Animation-system'>three.js animation system</a>
* @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 <caption>Create animation module and play a given clip of an imported model</caption>
* 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 <caption> Creating a DefineModule with PerspectiveCamera as camera module and passing it to App's modules</caption>
* 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;}();
var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
function createCommonjsModule$1(fn, module) {
return module = { exports: {} }, fn(module, module.exports), module.exports;
}
var stats_min = createCommonjsModule$1(function (module, exports) {
// stats.js - http://github.com/mrdoob/stats.js
(function(f,e){module.exports=e();})(commonjsGlobal,function(){var f=function(){function e(a){c.appendChild(a.dom);return a}function u(a){for(var d=0;d<c.children.length;d++)c.children[d].style.display=d===a?"block":"none";l=a;}var l=0,c=document.createElement("div");c.style.cssText="position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000";c.addEventListener("click",function(a){a.preventDefault();
u(++l%c.children.length);},!1);var k=(performance||Date).now(),g=k,a=0,r=e(new f.Panel("FPS","#0ff","#002")),h=e(new f.Panel("MS","#0f0","#020"));if(self.performance&&self.performance.memory)var t=e(new f.Panel("MB","#f08","#201"));u(0);return {REVISION:16,dom:c,addPanel:e,showPanel:u,begin:function(){k=(performance||Date).now();},end:function(){a++;var c=(performance||Date).now();h.update(c-k,200);if(c>g+1E3&&(r.update(1E3*a/(c-g),100),g=c,a=0,t)){var d=performance.memory;t.update(d.usedJSHeapSize/
1048576,d.jsHeapSizeLimit/1048576);}return c},update:function(){k=this.end();},domElement:c,setMode:u}};f.Panel=function(e,f,l){var c=Infinity,k=0,g=Math.round,a=g(window.devicePixelRatio||1),r=80*a,h=48*a,t=3*a,v=2*a,d=3*a,m=15*a,n=74*a,p=30*a,q=document.createElement("canvas");q.width=r;q.height=h;q.style.cssText="width:80px;height:48px";var b=q.getContext("2d");b.font="bold "+9*a+"px Helvetica,Arial,sans-serif";b.textBaseline="top";b.fillStyle=l;b.fillRect(0,0,r,h);b.fillStyle=f;b.fillText(e,t,v);
b.fillRect(d,m,n,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d,m,n,p);return {dom:q,update:function(h,w){c=Math.min(c,h);k=Math.max(k,h);b.fillStyle=l;b.globalAlpha=1;b.fillRect(0,0,r,m);b.fillStyle=f;b.fillText(g(h)+" "+e+" ("+g(c)+"-"+g(k)+")",t,v);b.drawImage(q,d+a,m,n-a,p,d,m,n-a,p);b.fillRect(d+n-a,m,a,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d+n-a,m,a,g((1-h/w)*p));}}};return f});
});
var StatsModule =
/*#__PURE__*/
function () {
function StatsModule() {
var code = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
_classCallCheck(this, StatsModule);
this.stats = new stats_min();
this.stats.showPanel(code);
}
_createClass(StatsModule, [{
key: "manager",
value: function manager(_manager) {
_manager.get('container').appendChild(this.stats.dom);
_manager.add('stats', this.stats, {
alias: '$stats'
});
}
}, {
key: "integrate",
value: function integrate(self) {
var stats = self.stats;
var preProcess = new Loop(function () {
return stats.begin();
});
var postProcess = new Loop(function () {
return stats.end();
});
this.loops.unshift(preProcess);
this.loops.push(postProcess); // Patch method
self.addLoop = function (loop) {
var _this = this;
return new Promise(function (resolve) {
if (_this.loops[_this.loops.length - 1] === postProcess) _this.loops.pop();
_this.loops.push(loop);
_this.loops.push(postProcess);
resolve(loop);
});
};
preProcess.start();
postProcess.start();
}
}]);
return StatsModule;
}();
_defineProperty(StatsModule, "codes", {
fps: 0,
ms: 1,
mb: 2,
custom: 3
});
return StatsModule;
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhdHNNb2R1bGUuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9tb2R1bGVzL2V4dHJhL3JvbGx1cFBsdWdpbkJhYmVsSGVscGVycyIsIi4uLy4uL25vZGVfbW9kdWxlcy93aHMvYnVpbGQvd2hzLm1vZHVsZS5qcyIsIi4uL3NyYy9tb2R1bGVzL2V4dHJhL25vZGVfbW9kdWxlcy9zdGF0cy5qcy9idWlsZC9zdGF0cy5taW4uanMiLCIuLi9zcmMvbW9kdWxlcy9leHRyYS9TdGF0c01vZHVsZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBfdHlwZW9mIGFzIHR5cGVvZiwgX2pzeCBhcyBqc3gsIF9hc3luY0l0ZXJhdG9yIGFzIGFzeW5jSXRlcmF0b3IsIF9Bd2FpdFZhbHVlIGFzIEF3YWl0VmFsdWUsIF9Bc3luY0dlbmVyYXRvciBhcyBBc3luY0dlbmVyYXRvciwgX3dyYXBBc3luY0dlbmVyYXRvciBhcyB3cmFwQXN5bmNHZW5lcmF0b3IsIF9hd2FpdEFzeW5jR2VuZXJhdG9yIGFzIGF3YWl0QXN5bmNHZW5lcmF0b3IsIF9hc3luY0dlbmVyYXRvckRlbGVnYXRlIGFzIGFzeW5jR2VuZXJhdG9yRGVsZWdhdGUsIF9hc3luY1RvR2VuZXJhdG9yIGFzIGFzeW5jVG9HZW5lcmF0b3IsIF9jbGFzc0NhbGxDaGVjayBhcyBjbGFzc0NhbGxDaGVjaywgX2NyZWF0ZUNsYXNzIGFzIGNyZWF0ZUNsYXNzLCBfZGVmaW5lRW51bWVyYWJsZVByb3BlcnRpZXMgYXMgZGVmaW5lRW51bWVyYWJsZVByb3BlcnRpZXMsIF9kZWZhdWx0cyBhcyBkZWZhdWx0cywgX2RlZmluZVByb3BlcnR5IGFzIGRlZmluZVByb3BlcnR5LCBfZXh0ZW5kcyBhcyBleHRlbmRzLCBfb2JqZWN0U3ByZWFkIGFzIG9iamVjdFNwcmVhZCwgX2luaGVyaXRzIGFzIGluaGVyaXRzLCBfaW5oZXJpdHNMb29zZSBhcyBpbmhlcml0c0xvb3NlLCBfZ2V0UHJvdG90eXBlT2YgYXMgZ2V0UHJvdG90eXBlT2YsIF9zZXRQcm90b3R5cGVPZiBhcyBzZXRQcm90b3R5cGVPZiwgX2NvbnN0cnVjdCBhcyBjb25zdHJ1Y3QsIF93cmFwTmF0aXZlU3VwZXIgYXMgd3JhcE5hdGl2ZVN1cGVyLCBfaW5zdGFuY2VvZiBhcyBpbnN0YW5jZW9mLCBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IGFzIGludGVyb3BSZXF1aXJlRGVmYXVsdCwgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgYXMgaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCwgX25ld0Fycm93Q2hlY2sgYXMgbmV3QXJyb3dDaGVjaywgX29iamVjdERlc3RydWN0dXJpbmdFbXB0eSBhcyBvYmplY3REZXN0cnVjdHVyaW5nRW1wdHksIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBhcyBvYmplY3RXaXRob3V0UHJvcGVydGllcywgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBhcyBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGFzIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4sIF9zdXBlclByb3BCYXNlIGFzIHN1cGVyUHJvcEJhc2UsIF9nZXQgYXMgZ2V0LCBfc2V0IGFzIHNldCwgX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbCBhcyB0YWdnZWRUZW1wbGF0ZUxpdGVyYWwsIF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZSBhcyB0YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZSwgX3RlbXBvcmFsUmVmIGFzIHRlbXBvcmFsUmVmLCBfcmVhZE9ubHlFcnJvciBhcyByZWFkT25seUVycm9yLCBfY2xhc3NOYW1lVERaRXJyb3IgYXMgY2xhc3NOYW1lVERaRXJyb3IsIF90ZW1wb3JhbFVuZGVmaW5lZCBhcyB0ZW1wb3JhbFVuZGVmaW5lZCwgX3NsaWNlZFRvQXJyYXkgYXMgc2xpY2VkVG9BcnJheSwgX3NsaWNlZFRvQXJyYXlMb29zZSBhcyBzbGljZWRUb0FycmF5TG9vc2UsIF90b0FycmF5IGFzIHRvQXJyYXksIF90b0NvbnN1bWFibGVBcnJheSBhcyB0b0NvbnN1bWFibGVBcnJheSwgX2FycmF5V2l0aG91dEhvbGVzIGFzIGFycmF5V2l0aG91dEhvbGVzLCBfYXJyYXlXaXRoSG9sZXMgYXMgYXJyYXlXaXRoSG9sZXMsIF9pdGVyYWJsZVRvQXJyYXkgYXMgaXRlcmFibGVUb0FycmF5LCBfaXRlcmFibGVUb0FycmF5TGltaXQgYXMgaXRlcmFibGVUb0FycmF5TGltaXQsIF9pdGVyYWJsZVRvQXJyYXlMaW1pdExvb3NlIGFzIGl0ZXJhYmxlVG9BcnJheUxpbWl0TG9vc2UsIF9ub25JdGVyYWJsZVNwcmVhZCBhcyBub25JdGVyYWJsZVNwcmVhZCwgX25vbkl0ZXJhYmxlUmVzdCBhcyBub25JdGVyYWJsZVJlc3QsIF9za2lwRmlyc3RHZW5lcmF0b3JOZXh0IGFzIHNraXBGaXJzdEdlbmVyYXRvck5leHQsIF90b1Byb3BlcnR5S2V5IGFzIHRvUHJvcGVydHlLZXksIF9pbml0aWFsaXplcldhcm5pbmdIZWxwZXIgYXMgaW5pdGlhbGl6ZXJXYXJuaW5nSGVscGVyLCBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSBhcyBpbml0aWFsaXplckRlZmluZVByb3BlcnR5LCBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yIGFzIGFwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciwgX2NsYXNzUHJpdmF0ZUZpZWxkTG9vc2VLZXkgYXMgY2xhc3NQcml2YXRlRmllbGRMb29zZUtleSwgX2NsYXNzUHJpdmF0ZUZpZWxkTG9vc2VCYXNlIGFzIGNsYXNzUHJpdmF0ZUZpZWxkTG9vc2VCYXNlLCBfY2xhc3NQcml2YXRlRmllbGRHZXQgYXMgY2xhc3NQcml2YXRlRmllbGRHZXQsIF9jbGFzc1ByaXZhdGVGaWVsZFNldCBhcyBjbGFzc1ByaXZhdGVGaWVsZFNldCB9O1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfdHlwZW9mKG9iaik7XG59XG5cbnZhciBSRUFDVF9FTEVNRU5UX1RZUEU7XG5cbmZ1bmN0aW9uIF9qc3godHlwZSwgcHJvcHMsIGtleSwgY2hpbGRyZW4pIHtcbiAgaWYgKCFSRUFDVF9FTEVNRU5UX1RZUEUpIHtcbiAgICBSRUFDVF9FTEVNRU5UX1RZUEUgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLmZvciAmJiBTeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKSB8fCAweGVhYzc7XG4gIH1cblxuICB2YXIgZGVmYXVsdFByb3BzID0gdHlwZSAmJiB0eXBlLmRlZmF1bHRQcm9wcztcbiAgdmFyIGNoaWxkcmVuTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCAtIDM7XG5cbiAgaWYgKCFwcm9wcyAmJiBjaGlsZHJlbkxlbmd0aCAhPT0gMCkge1xuICAgIHByb3BzID0ge1xuICAgICAgY2hpbGRyZW46IHZvaWQgMFxuICAgIH07XG4gIH1cblxuICBpZiAocHJvcHMgJiYgZGVmYXVsdFByb3BzKSB7XG4gICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gZGVmYXVsdFByb3BzKSB7XG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSB2b2lkIDApIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoIXByb3BzKSB7XG4gICAgcHJvcHMgPSBkZWZhdWx0UHJvcHMgfHwge307XG4gIH1cblxuICBpZiAoY2hpbGRyZW5MZW5ndGggPT09IDEpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkge1xuICAgIHZhciBjaGlsZEFycmF5ID0gbmV3IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGRBcnJheVtpXSA9IGFyZ3VtZW50c1tpICsgM107XG4gICAgfVxuXG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZEFycmF5O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuICAgIHR5cGU6IHR5cGUsXG4gICAga2V5OiBrZXkgPT09IHVuZGVmaW5lZCA/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+XG4gKiBuZXcgQXBwKFtcbiAqICAgLy8gLi4uXG4gKiAgIG5ldyBEZWZpbmVNb2R1bGUoJ2NhbWVyYScsIG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpKVxuICogXSk7XG4gKi9cbnZhciBEZWZpbmVNb2R1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBEZWZpbmVNb2R1bGUobmFtZSwgZGF0YSkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIERlZmluZU1vZHVsZSk7XG5cbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhEZWZpbmVNb2R1bGUsIFt7XG4gICAga2V5OiBcIm1hbmFnZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFuYWdlcihfbWFuYWdlcikge1xuICAgICAgX21hbmFnZXIuc2V0KHRoaXMubmFtZSwgdGhpcy5kYXRhKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRGVmaW5lTW9kdWxlO1xufSgpO1xuXG4vKiogQG1vZHVsZSBtb2R1bGVzICovXG5cbnZhciBNb2RlbCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0ltcG9ydGVyKSB7XG4gIGZ1bmN0aW9uIE1vZGVsKHBhcmFtcykge1xuICAgIHZhciBfZ2V0UHJvdG90eXBlT2YyO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgTW9kZWwpO1xuXG4gICAgY29uc29sZS53YXJuKCdNb2RlbCBpcyBkZXByZWNhdGVkLiBVc2UgSW1wb3J0ZXIgaW5zdGVhZC4nKTtcblxuICAgIGlmIChwYXJhbXMuZ2VvbWV0cnkpIHtcbiAgICAgIHBhcmFtcy51cmwgPSBwYXJhbXMuZ2VvbWV0cnkucGF0aDtcbiAgICAgIHBhcmFtcy5sb2FkZXIgPSBwYXJhbXMuZ2VvbWV0cnkubG9hZGVyO1xuICAgIH1cblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhZGRpdGlvbmFsID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFkZGl0aW9uYWxbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChfZ2V0UHJvdG90eXBlT2YyID0gZ2V0UHJvdG90eXBlT2YkMihNb2RlbCkpLmNhbGwuYXBwbHkoX2dldFByb3RvdHlwZU9mMiwgW3RoaXMsIHBhcmFtc10uY29uY2F0KGFkZGl0aW9uYWwpKSk7XG4gIH1cblxuICBpbmhlcml0cyhNb2RlbCwgX0ltcG9ydGVyKTtcblxuICByZXR1cm4gTW9kZWw7XG59KEltcG9ydGVyKTtcbnZhciBDYW1lcmFNb2R1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDYW1lcmFNb2R1bGUoKSB7XG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDYW1lcmFNb2R1bGUpO1xuXG4gICAgY29uc29sZS53YXJuKCdDYW1lcmFNb2R1bGUgaXMgZGVwcmVjYXRlZC4gVXNlIERlZmluZU1vZHVsZSBpbnN0ZWFkLicpO1xuICAgIHRoaXMuY2FtZXJhID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhJDEocGFyYW1zKTtcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKENhbWVyYU1vZHVsZSwgW3tcbiAgICBrZXk6IFwiaW50ZWdyYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludGVncmF0ZShzZWxmKSB7XG4gICAgICB0aGlzLmFkZChzZWxmLmNhbWVyYSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm1hbmFnZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFuYWdlcihfbWFuYWdlcikge1xuICAgICAgX21hbmFnZXIuc2V0KCdjYW1lcmEnLCB0aGlzLmNhbWVyYSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIENhbWVyYU1vZHVsZTtcbn0oKTtcblxuLyoqXG4gKiBOYW1lc3BhY2UgY29udGFpbmluZyBhbGwgY2xhc3NlcyBmcm9tIGFsbCBtb2R1bGVzLiBVc2VkIGFzIGdsb2JhbCBpbiBVTUQgcGF0dGVybi5cbiAqIEBuYW1lc3BhY2UgV0hTXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5UaGUgdXNlIG9mIFdIUyBuYW1lc3BhY2UuPC9jYXB0aW9uPlxuICogbmV3IFdIUy5BcHAoKSAvLyBjb3JlXG4gKiBuZXcgV0hTLlBlcnNwZWN0aXZlQ2FtZXJhKCkgLy8gY29tcG9uZW50c1xuICogbmV3IFdIUy5SZXNpemVNb2R1bGUoKSAvLyBtb2R1bGVzXG4gKiBXSFMuZXh0ZW5kKCkgLy8gdXRpbHNcbiAqL1xuXG5leHBvcnQgeyBDb21wb25lbnQsIE1lc2hDb21wb25lbnQsIExpZ2h0Q29tcG9uZW50LCBDYW1lcmFDb21wb25lbnQsIEFwcCwgTG9vcCwgTW9kdWxlTWFuYWdlciwgQW1iaWVudExpZ2h0JDEgYXMgQW1iaWVudExpZ2h0LCBEaXJlY3Rpb25hbExpZ2h0JDEgYXMgRGlyZWN0aW9uYWxMaWdodCwgSGVtaXNwaGVyZUxpZ2h0JDEgYXMgSGVtaXNwaGVyZUxpZ2h0LCBQb2ludExpZ2h0JDEgYXMgUG9pbnRMaWdodCwgU3BvdExpZ2h0JDEgYXMgU3BvdExpZ2h0LCBBcmVhTGlnaHQsIEN1YmVDYW1lcmEkMSBhcyBDdWJlQ2FtZXJhLCBPcnRob2dyYXBoaWNDYW1lcmEkMSBhcyBPcnRob2dyYXBoaWNDYW1lcmEsIFBlcnNwZWN0aXZlQ2FtZXJhJDEgYXMgUGVyc3BlY3RpdmVDYW1lcmEsIEJveCwgQ2lyY2xlLCBDb25lLCBDeWxpbmRlciwgRG9kZWNhaGVkcm9uLCBFeHRydWRlLCBJY29zYWhlZHJvbiwgTGF0aGUsIExpbmUkMSBhcyBMaW5lLCBJbXBvcnRlciwgT2N0YWhlZHJvbiwgUGFyYW1ldHJpYywgUGxhbmUkMSBhcyBQbGFuZSwgUG9seWhlZHJvbiwgUmluZywgU2hhcGUkMSBhcyBTaGFwZSwgU3BoZXJlJDEgYXMgU3BoZXJlLCBUZXRyYWhlZHJvbiwgVGV4dCwgVG9ydXMsIFRvcnVza25vdCwgVHViZSwgR3JvdXAkMSBhcyBHcm91cCwgZXh0ZW5kLCBpbnN0cnVjdCwgdHJhbnNmb3JtRGF0YSwgdG9BcnJheSwgRWxlbWVudE1vZHVsZSwgUmVuZGVyaW5nTW9kdWxlLCBTY2VuZU1vZHVsZSwgUmVzaXplTW9kdWxlLCBQb3N0UHJvY2Vzc29yTW9kdWxlLCBWaXJ0dWFsTW91c2VNb2R1bGUsIEV2ZW50c1BhdGNoTW9kdWxlLCBDb250cm9sc01vZHVsZSwgRm9nTW9kdWxlLCBTdGF0ZU1vZHVsZSwgT3JiaXRDb250cm9sc01vZHVsZSwgRHluYW1pY0dlb21ldHJ5TW9kdWxlLCBUZXh0dXJlTW9kdWxlLCBBbmltYXRpb25Nb2R1bGUsIERlZmluZU1vZHVsZSwgTW9kZWwsIENhbWVyYU1vZHVsZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2hzLm1vZHVsZS5qcy5tYXBcbiIsIi8vIHN0YXRzLmpzIC0gaHR0cDovL2dpdGh1Yi5jb20vbXJkb29iL3N0YXRzLmpzXG4oZnVuY3Rpb24oZixlKXtcIm9iamVjdFwiPT09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPWUoKTpcImZ1bmN0aW9uXCI9PT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShlKTpmLlN0YXRzPWUoKX0pKHRoaXMsZnVuY3Rpb24oKXt2YXIgZj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoYSl7Yy5hcHBlbmRDaGlsZChhLmRvbSk7cmV0dXJuIGF9ZnVuY3Rpb24gdShhKXtmb3IodmFyIGQ9MDtkPGMuY2hpbGRyZW4ubGVuZ3RoO2QrKyljLmNoaWxkcmVuW2RdLnN0eWxlLmRpc3BsYXk9ZD09PWE/XCJibG9ja1wiOlwibm9uZVwiO2w9YX12YXIgbD0wLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtjLnN0eWxlLmNzc1RleHQ9XCJwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7Y3Vyc29yOnBvaW50ZXI7b3BhY2l0eTowLjk7ei1pbmRleDoxMDAwMFwiO2MuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpO1xudSgrK2wlYy5jaGlsZHJlbi5sZW5ndGgpfSwhMSk7dmFyIGs9KHBlcmZvcm1hbmNlfHxEYXRlKS5ub3coKSxnPWssYT0wLHI9ZShuZXcgZi5QYW5lbChcIkZQU1wiLFwiIzBmZlwiLFwiIzAwMlwiKSksaD1lKG5ldyBmLlBhbmVsKFwiTVNcIixcIiMwZjBcIixcIiMwMjBcIikpO2lmKHNlbGYucGVyZm9ybWFuY2UmJnNlbGYucGVyZm9ybWFuY2UubWVtb3J5KXZhciB0PWUobmV3IGYuUGFuZWwoXCJNQlwiLFwiI2YwOFwiLFwiIzIwMVwiKSk7dSgwKTtyZXR1cm57UkVWSVNJT046MTYsZG9tOmMsYWRkUGFuZWw6ZSxzaG93UGFuZWw6dSxiZWdpbjpmdW5jdGlvbigpe2s9KHBlcmZvcm1hbmNlfHxEYXRlKS5ub3coKX0sZW5kOmZ1bmN0aW9uKCl7YSsrO3ZhciBjPShwZXJmb3JtYW5jZXx8RGF0ZSkubm93KCk7aC51cGRhdGUoYy1rLDIwMCk7aWYoYz5nKzFFMyYmKHIudXBkYXRlKDFFMyphLyhjLWcpLDEwMCksZz1jLGE9MCx0KSl7dmFyIGQ9cGVyZm9ybWFuY2UubWVtb3J5O3QudXBkYXRlKGQudXNlZEpTSGVhcFNpemUvXG4xMDQ4NTc2LGQuanNIZWFwU2l6ZUxpbWl0LzEwNDg1NzYpfXJldHVybiBjfSx1cGRhdGU6ZnVuY3Rpb24oKXtrPXRoaXMuZW5kKCl9LGRvbUVsZW1lbnQ6YyxzZXRNb2RlOnV9fTtmLlBhbmVsPWZ1bmN0aW9uKGUsZixsKXt2YXIgYz1JbmZpbml0eSxrPTAsZz1NYXRoLnJvdW5kLGE9Zyh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8MSkscj04MCphLGg9NDgqYSx0PTMqYSx2PTIqYSxkPTMqYSxtPTE1KmEsbj03NCphLHA9MzAqYSxxPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7cS53aWR0aD1yO3EuaGVpZ2h0PWg7cS5zdHlsZS5jc3NUZXh0PVwid2lkdGg6ODBweDtoZWlnaHQ6NDhweFwiO3ZhciBiPXEuZ2V0Q29udGV4dChcIjJkXCIpO2IuZm9udD1cImJvbGQgXCIrOSphK1wicHggSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWZcIjtiLnRleHRCYXNlbGluZT1cInRvcFwiO2IuZmlsbFN0eWxlPWw7Yi5maWxsUmVjdCgwLDAscixoKTtiLmZpbGxTdHlsZT1mO2IuZmlsbFRleHQoZSx0LHYpO1xuYi5maWxsUmVjdChkLG0sbixwKTtiLmZpbGxTdHlsZT1sO2IuZ2xvYmFsQWxwaGE9Ljk7Yi5maWxsUmVjdChkLG0sbixwKTtyZXR1cm57ZG9tOnEsdXBkYXRlOmZ1bmN0aW9uKGgsdyl7Yz1NYXRoLm1pbihjLGgpO2s9TWF0aC5tYXgoayxoKTtiLmZpbGxTdHlsZT1sO2IuZ2xvYmFsQWxwaGE9MTtiLmZpbGxSZWN0KDAsMCxyLG0pO2IuZmlsbFN0eWxlPWY7Yi5maWxsVGV4dChnKGgpK1wiIFwiK2UrXCIgKFwiK2coYykrXCItXCIrZyhrKStcIilcIix0LHYpO2IuZHJhd0ltYWdlKHEsZCthLG0sbi1hLHAsZCxtLG4tYSxwKTtiLmZpbGxSZWN0KGQrbi1hLG0sYSxwKTtiLmZpbGxTdHlsZT1sO2IuZ2xvYmFsQWxwaGE9Ljk7Yi5maWxsUmVjdChkK24tYSxtLGEsZygoMS1oL3cpKnApKX19fTtyZXR1cm4gZn0pO1xuIiwiaW1wb3J0IHtMb29wfSBmcm9tICd3aHMnO1xuaW1wb3J0IFN0YXRzIGZyb20gJ3N0YXRzLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdHNNb2R1bGUge1xuICBzdGF0aWMgY29kZXMgPSB7XG4gICAgZnBzOiAwLFxuICAgIG1zOiAxLFxuICAgIG1iOiAyLFxuICAgIGN1c3RvbTogM1xuICB9XG5cbiAgY29uc3RydWN0b3IoY29kZSA9IDApIHtcbiAgICB0aGlzLnN0YXRzID0gbmV3IFN0YXRzKCk7XG4gICAgdGhpcy5zdGF0cy5zaG93UGFuZWwoY29kZSk7XG4gIH1cblxuICBtYW5hZ2VyKG1hbmFnZXIpIHtcbiAgICBtYW5hZ2VyLmdldCgnY29udGFpbmVyJykuYXBwZW5kQ2hpbGQodGhpcy5zdGF0cy5kb20pO1xuICAgIG1hbmFnZXIuYWRkKCdzdGF0cycsIHRoaXMuc3RhdHMsIHthbGlhczogJyRzdGF0cyd9KTtcbiAgfVxuXG4gIGludGVncmF0ZShzZWxmKSB7XG4gICAgY29uc3Qgc3RhdHMgPSBzZWxmLnN0YXRzO1xuXG4gICAgY29uc3QgcHJlUHJvY2VzcyA9IG5ldyBMb29wKCgpID0+IHN0YXRzLmJlZ2luKCkpO1xuICAgIGNvbnN0IHBvc3RQcm9jZXNzID0gbmV3IExvb3AoKCkgPT4gc3RhdHMuZW5kKCkpO1xuXG4gICAgdGhpcy5sb29wcy51bnNoaWZ0KHByZVByb2Nlc3MpO1xuICAgIHRoaXMubG9vcHMucHVzaChwb3N0UHJvY2Vzcyk7XG5cbiAgICAvLyBQYXRjaCBtZXRob2RcbiAgICBzZWxmLmFkZExvb3AgPSBmdW5jdGlvbiAobG9vcCkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICBpZiAodGhpcy5sb29wc1t0aGlzLmxvb3BzLmxlbmd0aCAtIDFdID09PSBwb3N0UHJvY2VzcykgdGhpcy5sb29wcy5wb3AoKTtcbiAgICAgICAgdGhpcy5sb29wcy5wdXNoKGxvb3ApO1xuICAgICAgICB0aGlzLmxvb3BzLnB1c2gocG9zdFByb2Nlc3MpO1xuICAgICAgICByZXNvbHZlKGxvb3ApO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHByZVByb2Nlc3Muc3RhcnQoKTtcbiAgICBwb3N0UHJvY2Vzcy5zdGFydCgpO1xuICB9XG59XG4iXSwibmFtZXMiOlsiZm4iLCJtb2R1bGUiLCJleHBvcnRzIiwiY3JlYXRlQ29tbW9uanNNb2R1bGUiLCJnbG9iYWwiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJPcCIsImhhc093blByb3BlcnR5IiwiU3ltYm9sIiwiJFN5bWJvbCIsIml0ZXJhdG9yIiwiYXN5bmNJdGVyYXRvciIsInRvU3RyaW5nVGFnIiwicmVnZW5lcmF0b3JSdW50aW1lIiwicnVudGltZSIsImluTW9kdWxlIiwiaW5uZXJGbiIsIm91dGVyRm4iLCJzZWxmIiwidHJ5TG9jc0xpc3QiLCJHZW5lcmF0b3IiLCJjcmVhdGUiLCJwcm90b0dlbmVyYXRvciIsImdlbmVyYXRvciIsIl9pbnZva2UiLCJtYWtlSW52b2tlTWV0aG9kIiwiY29udGV4dCIsIndyYXAiLCJvYmoiLCJhcmciLCJ0eXBlIiwiY2FsbCIsImVyciIsIkl0ZXJhdG9yUHJvdG90eXBlIiwiaXRlcmF0b3JTeW1ib2wiLCJnZXRQcm90b3R5cGVPZiIsImdldFByb3RvIiwidmFsdWVzIiwiTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUiLCJoYXNPd24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR3AiLCJjb25zdHJ1Y3RvciIsInRvU3RyaW5nVGFnU3ltYm9sIiwiZGlzcGxheU5hbWUiLCJmb3JFYWNoIiwibWV0aG9kIiwiaXNHZW5lcmF0b3JGdW5jdGlvbiIsImdlbkZ1biIsImN0b3IiLCJuYW1lIiwibWFyayIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiYXdyYXAiLCJfX2F3YWl0IiwicmVzb2x2ZSIsInJlamVjdCIsInRyeUNhdGNoIiwicmVjb3JkIiwicmVzdWx0IiwidmFsdWUiLCJ0aGVuIiwiaW52b2tlIiwidW53cmFwcGVkIiwicHJldmlvdXNQcm9taXNlIiwiY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmciLCJlbnF1ZXVlIiwiZGVmaW5lSXRlcmF0b3JNZXRob2RzIiwiQXN5bmNJdGVyYXRvciIsImFzeW5jSXRlcmF0b3JTeW1ib2wiLCJhc3luYyIsIml0ZXIiLCJuZXh0IiwiZG9uZSIsIkdlblN0YXRlU3VzcGVuZGVkU3RhcnQiLCJzdGF0ZSIsIkdlblN0YXRlRXhlY3V0aW5nIiwiR2VuU3RhdGVDb21wbGV0ZWQiLCJkZWxlZ2F0ZSIsIm1heWJlSW52b2tlRGVsZWdhdGUiLCJkZWxlZ2F0ZVJlc3VsdCIsIkNvbnRpbnVlU2VudGluZWwiLCJzZW50IiwiX3NlbnQiLCJkaXNwYXRjaEV4Y2VwdGlvbiIsImFicnVwdCIsIkdlblN0YXRlU3VzcGVuZGVkWWllbGQiLCJ1bmRlZmluZWQiLCJyZXR1cm4iLCJpbmZvIiwicmVzdWx0TmFtZSIsIm5leHRMb2MiLCJ0b1N0cmluZyIsImxvY3MiLCJ0cnlMb2MiLCJlbnRyeSIsImNhdGNoTG9jIiwiZmluYWxseUxvYyIsImFmdGVyTG9jIiwidHJ5RW50cmllcyIsInB1c2giLCJjb21wbGV0aW9uIiwicHVzaFRyeUVudHJ5IiwicmVzZXQiLCJrZXlzIiwib2JqZWN0Iiwia2V5IiwicmV2ZXJzZSIsImxlbmd0aCIsInBvcCIsIml0ZXJhYmxlIiwiaXRlcmF0b3JNZXRob2QiLCJpc05hTiIsImkiLCJkb25lUmVzdWx0IiwiQ29udGV4dCIsInNraXBUZW1wUmVzZXQiLCJwcmV2IiwicmVzZXRUcnlFbnRyeSIsImNoYXJBdCIsInNsaWNlIiwic3RvcCIsInJvb3RFbnRyeSIsInJvb3RSZWNvcmQiLCJydmFsIiwiZXhjZXB0aW9uIiwibG9jIiwiY2F1Z2h0IiwiaGFzQ2F0Y2giLCJoYXNGaW5hbGx5IiwiZmluYWxseUVudHJ5IiwiY29tcGxldGUiLCJmaW5pc2giLCJkZWxlZ2F0ZVlpZWxkIiwiRnVuY3Rpb24iLCJnIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImluZGV4T2YiLCJoYWRSdW50aW1lIiwib2xkUnVudGltZSIsImUiLCJydW50aW1lTW9kdWxlIiwiTWF0aCIsImNlaWwiLCJmbG9vciIsIml0IiwiVE9fU1RSSU5HIiwidGhhdCIsInBvcyIsIlN0cmluZyIsIl9kZWZpbmVkIiwiX3RvSW50ZWdlciIsInMiLCJiIiwibCIsImEiLCJjaGFyQ29kZUF0Iiwid2luZG93IiwiX19nIiwidmVyc2lvbiIsIl9fZSIsImNvcmUiLCJfY29yZSIsIl9hRnVuY3Rpb24iLCJjIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfaXNPYmplY3QiLCJleGVjIiwiX2ZhaWxzIiwiZGVmaW5lUHJvcGVydHkiLCJnZXQiLCJfZ2xvYmFsIiwiZG9jdW1lbnQiLCJkb2N1bWVudCQxIiwiY3JlYXRlRWxlbWVudCIsIl9kZXNjcmlwdG9ycyIsIl9kb21DcmVhdGUiLCJTIiwidmFsIiwidmFsdWVPZiIsIk8iLCJQIiwiQXR0cmlidXRlcyIsIl9hbk9iamVjdCIsIl90b1ByaW1pdGl2ZSIsIl9pZThEb21EZWZpbmUiLCJmIiwiYml0bWFwIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiX3Byb3BlcnR5RGVzYyIsInNvdXJjZSIsIiRleHBvcnQiLCJGIiwiRyIsIkIiLCJXIiwiSVNfR0xPQkFMIiwiUFJPVE9UWVBFIiwiSVNfU1RBVElDIiwib3duIiwib3V0IiwiSVNfRk9SQ0VEIiwidGFyZ2V0IiwiX2hhcyIsIklTX0JJTkQiLCJfY3R4IiwiSVNfV1JBUCIsIkMiLCJJU19QUk9UTyIsInZpcnR1YWwiLCJSIiwiZXhwUHJvdG8iLCJfaGlkZSIsIlUiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInNwbGl0IiwibWluIiwibWF4IiwiaW5kZXgiLCJtaW4kMSIsIklTX0lOQ0xVREVTIiwiJHRoaXMiLCJlbCIsImZyb21JbmRleCIsIl90b0lvYmplY3QiLCJfdG9MZW5ndGgiLCJfdG9BYnNvbHV0ZUluZGV4IiwiU0hBUkVEIiwic3RvcmUiLCJtb2RlIiwiX2xpYnJhcnkiLCJjb3B5cmlnaHQiLCJyYW5kb20iLCJjb25jYXQiLCJpZCIsInB4IiwiX3NoYXJlZCIsInNoYXJlZCIsIl91aWQiLCJfYXJyYXlJbmNsdWRlcyIsIl9zaGFyZWRLZXkiLCJuYW1lcyIsIklFX1BST1RPIiwiYXJyYXlJbmRleE9mIiwiX2VudW1CdWdLZXlzIiwiZGVmaW5lUHJvcGVydGllcyIsIlByb3BlcnRpZXMiLCJfb2JqZWN0S2V5cyIsIl9vYmplY3REcCIsImRvY3VtZW50JDIiLCJkb2N1bWVudEVsZW1lbnQiLCJpZnJhbWUiLCJzdHlsZSIsImRpc3BsYXkiLCJfaHRtbCIsImFwcGVuZENoaWxkIiwic3JjIiwiaWZyYW1lRG9jdW1lbnQiLCJjb250ZW50V2luZG93Iiwib3BlbiIsIndyaXRlIiwibHQiLCJndCIsImNsb3NlIiwiY3JlYXRlRGljdCIsIlBST1RPVFlQRSQxIiwiRW1wdHkiLCJJRV9QUk9UTyQxIiwiX29iamVjdERwcyIsIlVTRV9TWU1CT0wiLCIkZXhwb3J0cyIsIl93a3MiLCJ0YWciLCJzdGF0IiwiVEFHIiwiZGVmIiwiQ29uc3RydWN0b3IiLCJOQU1FIiwiX29iamVjdENyZWF0ZSIsIl9zZXRUb1N0cmluZ1RhZyIsIl90b09iamVjdCIsIklFX1BST1RPJDIiLCJPYmplY3RQcm90byIsIkJhc2UiLCJERUZBVUxUIiwiSVNfU0VUIiwiRk9SQ0VEIiwiX2l0ZXJDcmVhdGUiLCJraW5kIiwiQlVHR1kiLCJWQUxVRVMiLCJwcm90byIsIklURVJBVE9SIiwiRkZfSVRFUkFUT1IiLCIkbmF0aXZlIiwiZ2V0TWV0aG9kIiwiREVGX1ZBTFVFUyIsIiRkZWZhdWx0IiwiZW50cmllcyIsIiRhbnlOYXRpdmUiLCJfb2JqZWN0R3BvIiwiVkFMVUVTX0JVRyIsIl9pdGVyYXRvcnMiLCJyZXR1cm5UaGlzIiwibWV0aG9kcyIsIktFWVMiLCIkZW50cmllcyIsIl9yZWRlZmluZSIsIl9leHBvcnQiLCJfc3RyaW5nQXQiLCJfaXRlckRlZmluZSIsIml0ZXJhdGVkIiwiX3QiLCJfaSIsInBvaW50IiwiJGF0IiwiQXJyYXkiLCJfayIsIkFyZ3VtZW50cyIsIkRPTUl0ZXJhYmxlcyIsIkNvbGxlY3Rpb24iLCJUT19TVFJJTkdfVEFHIiwiX2NvZiIsIlQiLCJ0cnlHZXQiLCJUQUckMSIsIkFSRyIsImNhbGxlZSIsImZvcmJpZGRlbkZpZWxkIiwicmV0IiwiQXJyYXlQcm90byIsIklURVJBVE9SJDEiLCJnZXRJdGVyYXRvck1ldGhvZCIsIklURVJBVE9SJDIiLCJfY2xhc3NvZiIsImNvcmVfZ2V0SXRlcmF0b3JNZXRob2QiLCJzdGVwIiwiX2lzQXJyYXlJdGVyIiwiaXRlckZuIiwiQlJFQUsiLCJSRVRVUk4iLCJfaXRlckNhbGwiLCJEIiwiU1BFQ0lFUyIsImFyZ3MiLCJwcm9jZXNzIiwic2V0SW1tZWRpYXRlIiwiY2xlYXJJbW1lZGlhdGUiLCJNZXNzYWdlQ2hhbm5lbCIsIkRpc3BhdGNoIiwiY2hhbm5lbCIsInBvcnQiLCJxdWV1ZSIsImV2ZW50IiwicnVuIiwiZGF0YSIsInNldFRhc2siLCJjbGVhclRhc2siLCJjb3VudGVyIiwiZGVmZXIiLCJuZXh0VGljayIsIm5vdyIsInBvcnQyIiwicG9ydDEiLCJvbm1lc3NhZ2UiLCJsaXN0ZW5lciIsInBvc3RNZXNzYWdlIiwiYWRkRXZlbnRMaXN0ZW5lciIsImltcG9ydFNjcmlwdHMiLCJPTlJFQURZU1RBVEVDSEFOR0UiLCJyZW1vdmVDaGlsZCIsInNldFRpbWVvdXQiLCJzZXQiLCJjbGVhciIsIl90YXNrIiwiTXV0YXRpb25PYnNlcnZlciIsIldlYktpdE11dGF0aW9uT2JzZXJ2ZXIiLCJQcm9taXNlIiwicHJvY2VzcyQxIiwibGFzdCIsIm5vdGlmeSIsImlzTm9kZSIsInBhcmVudCIsImRvbWFpbiIsImV4aXQiLCJoZWFkIiwiZW50ZXIiLCJmbHVzaCIsIk9ic2VydmVyIiwibmF2aWdhdG9yIiwic3RhbmRhbG9uZSIsImNyZWF0ZVRleHROb2RlIiwib2JzZXJ2ZSIsIm5vZGUiLCJjaGFyYWN0ZXJEYXRhIiwidG9nZ2xlIiwiUHJvbWlzZSQxIiwicHJvbWlzZSIsIm1hY3JvdGFzayIsInRhc2siLCIkJHJlc29sdmUiLCIkJHJlamVjdCIsImYkMSIsInYiLCJ1c2VyQWdlbnQiLCJ4IiwiX25ld1Byb21pc2VDYXBhYmlsaXR5IiwicHJvbWlzZUNhcGFiaWxpdHkiLCJzYWZlIiwiS0VZIiwiU1BFQ0lFUyQxIiwiSVRFUkFUT1IkMyIsInJpdGVyIiwiU0FGRV9DTE9TSU5HIiwic2tpcENsb3NpbmciLCJhcnIiLCJfbWljcm90YXNrIiwiVHlwZUVycm9yIiwicHJvY2VzcyQyIiwidmVyc2lvbnMiLCJ2OCIsIlBST01JU0UiLCJuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkiLCJPd25Qcm9taXNlQ2FwYWJpbGl0eSIsIldyYXBwZXIiLCIkUHJvbWlzZSIsImVtcHR5IiwiaXNOb2RlJDEiLCJfdXNlckFnZW50IiwiaXNSZWplY3QiLCJfbiIsIl9jIiwibWljcm90YXNrIiwiX3YiLCJfcyIsInJlYWN0aW9uIiwib2siLCJmYWlsIiwiZXhpdGVkIiwiaGFuZGxlciIsIl9oIiwib25IYW5kbGVVbmhhbmRsZWQiLCJUeXBlRXJyb3IkMSIsImlzVGhlbmFibGUiLCJjaGFpbiIsIm9uVW5oYW5kbGVkIiwiaXNVbmhhbmRsZWQiLCJjb25zb2xlIiwidW5oYW5kbGVkIiwiX3BlcmZvcm0iLCJlbWl0Iiwib251bmhhbmRsZWRyZWplY3Rpb24iLCJyZWFzb24iLCJlcnJvciIsIl9hIiwib25yZWplY3Rpb25oYW5kbGVkIiwiX2QiLCJfdyIsIiRyZXNvbHZlIiwid3JhcHBlciIsIiRyZWplY3QiLCJVU0VfTkFUSVZFIiwiZXhlY3V0b3IiLCJfYW5JbnN0YW5jZSIsIkludGVybmFsIiwiX3JlZGVmaW5lQWxsIiwib25GdWxmaWxsZWQiLCJvblJlamVjdGVkIiwibmV3UHJvbWlzZUNhcGFiaWxpdHkiLCJfc3BlY2llc0NvbnN0cnVjdG9yIiwiX3NldFNwZWNpZXMiLCJyIiwiY2FwYWJpbGl0eSIsIl9pdGVyRGV0ZWN0IiwiYWxsIiwiX2Zvck9mIiwicmVtYWluaW5nIiwiYWxyZWFkeUNhbGxlZCIsIiRpbmRleCIsInJhY2UiLCJvbkZpbmFsbHkiLCJpc0Z1bmN0aW9uIiwiY2FsbGJhY2tmbiIsImdlbiIsInByb21pc2UkMSIsIl9uZXh0IiwiX3Rocm93IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJmJDIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJnT1BEIiwiX29iamVjdFBpZSIsImYkMyIsImV4cCIsIl9vYmplY3RHb3BkIiwiX29iamVjdFNhcCIsImlzRXh0ZW5zaWJsZSIsInByZXZlbnRFeHRlbnNpb25zIiwic2V0RGVzYyIsIk1FVEEiLCJ3Iiwic2V0TWV0YSIsIkZSRUVaRSIsIm1ldGEiLCJORUVEIiwiZmFzdEtleSIsImdldFdlYWsiLCJvbkZyZWV6ZSIsIl9tZXRhIiwiZiQ0IiwiX3drc0V4dCIsImdldE93blByb3BlcnR5U3ltYm9scyIsImYkNSIsIl9vYmplY3RHb3BzIiwiZ2V0U3ltYm9scyIsInN5bWJvbHMiLCJpc0VudW0iLCJpc0FycmF5IiwiaGlkZGVuS2V5cyIsImYkNiIsIl9vYmplY3RHb3BuIiwidG9TdHJpbmckMSIsImdldFdpbmRvd05hbWVzIiwiZ09QTiIsImYkNyIsIl9vYmplY3RHb3BuRXh0IiwiSlNPTiIsIiRKU09OIiwic3RyaW5naWZ5IiwiUFJPVE9UWVBFJDIiLCJRT2JqZWN0IiwiZmluZENoaWxkIiwiZFAkMSIsImdPUEQkMSIsIk9iamVjdFByb3RvJDEiLCJwcm90b0Rlc2MiLCJBbGxTeW1ib2xzIiwic3ltIiwiVVNFX05BVElWRSQxIiwiJGRlZmluZVByb3BlcnR5IiwiT1BTeW1ib2xzIiwiSElEREVOIiwiX2VudW1LZXlzIiwiJGRlZmluZVByb3BlcnRpZXMiLCJFIiwiZ09QTiQxIiwiSVNfT1AiLCIkc2V0Iiwic2V0U3ltYm9sRGVzYyIsInNldHRlciIsIiRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IkMSIsIiRnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiJHByb3BlcnR5SXNFbnVtZXJhYmxlIiwiJGdldE93blByb3BlcnR5U3ltYm9scyIsImoiLCJlczZTeW1ib2xzIiwiayIsIndlbGxLbm93blN5bWJvbHMiLCJfd2tzRGVmaW5lIiwiU3ltYm9sUmVnaXN0cnkiLCJrZXlGb3IiLCJpc1N5bWJvbCIsInVzZVNldHRlciIsInVzZVNpbXBsZSIsIiRjcmVhdGUiLCJfc3RyaW5naWZ5IiwiJHJlcGxhY2VyIiwicmVwbGFjZXIiLCJfaXNBcnJheSIsIlRPX1BSSU1JVElWRSIsImRlc2MiLCJkZWZpbmVQcm9wZXJ0eSQxIiwiZGVmaW5lUHJvcGVydHkkMiIsIl9kZWZpbmVQcm9wZXJ0eSIsImtleXMkMSIsIm93bktleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMkMSIsImZpbHRlciIsImRlZmluZVByb3BlcnR5JDMiLCJfb2JqZWN0U3ByZWFkIiwiaW5zdGFuY2UiLCJfY2xhc3NDYWxsQ2hlY2siLCJ0ZXN0IiwiYnVnZ3kiLCJjaGVjayIsIl9zZXRQcm90byIsIm8iLCJwIiwiX3NldFByb3RvdHlwZU9mIiwic2V0UHJvdG90eXBlT2YkMSIsInN1YkNsYXNzIiwic3VwZXJDbGFzcyIsInNldFByb3RvdHlwZU9mJDIiLCJfaW5oZXJpdHMiLCJwcm9wcyIsImRlc2NyaXB0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJfZGVmaW5lUHJvcGVydGllcyIsIl9jcmVhdGVDbGFzcyIsInN5bWJvbCIsIl90eXBlb2YyIiwic3ltYm9sJDEiLCJpdGVyYXRvciQxIiwiX3R5cGVvZiIsIl9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQiLCJfdHlwZW9mXzEiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiIsIl9nZXRQcm90b3R5cGVPZiIsImdldFByb3RvdHlwZU9mJDEiLCJleHRlbnNpb25zIiwiX2xlbiIsIl9rZXkiLCJleHRlbnNpb24iLCJfc3RlcCIsIl9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24iLCJfaXRlcmF0b3IiLCJwcm9wIiwiZXh0ZW5kIiwiX2RpZEl0ZXJhdG9yRXJyb3IiLCJfaXRlcmF0b3JFcnJvciIsImFycmF5IiwiaW5zdEFycmF5IiwidGVtcE9iamVjdCIsImd1aWRlIiwiaW5zdHJ1Y3Rpb25zIiwiaW5zdHJ1Y3QiLCJ0cmFuc2Zvcm1EYXRhIiwiTnVtYmVyIiwiRVBTSUxPTiIsInBvdyIsImlzSW50ZWdlciIsImlzRmluaXRlIiwic2lnbiIsIm1hdGNoIiwiYXNzaWduIiwibmV4dEtleSIsIm91dHB1dCIsIkV2ZW50RGlzcGF0Y2hlciIsIl9saXN0ZW5lcnMiLCJsaXN0ZW5lcnMiLCJoYXNFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImxpc3RlbmVyQXJyYXkiLCJzcGxpY2UiLCJkaXNwYXRjaEV2ZW50IiwiTEVGVCIsIk1JRERMRSIsIlJJR0hUIiwiREVHMlJBRCIsIlBJIiwiUkFEMkRFRyIsImdlbmVyYXRlVVVJRCIsImx1dCIsImQwIiwiZDEiLCJkMiIsImQzIiwidG9VcHBlckNhc2UiLCJjbGFtcCIsImV1Y2xpZGVhbk1vZHVsbyIsIm4iLCJtIiwibWFwTGluZWFyIiwiYTEiLCJhMiIsImIxIiwiYjIiLCJsZXJwIiwieSIsInQiLCJzbW9vdGhzdGVwIiwic21vb3RoZXJzdGVwIiwicmFuZEludCIsImxvdyIsImhpZ2giLCJyYW5kRmxvYXQiLCJyYW5kRmxvYXRTcHJlYWQiLCJyYW5nZSIsImRlZ1RvUmFkIiwiZGVncmVlcyIsIl9NYXRoIiwicmFkVG9EZWciLCJyYWRpYW5zIiwiaXNQb3dlck9mVHdvIiwiY2VpbFBvd2VyT2ZUd28iLCJsb2ciLCJMTjIiLCJmbG9vclBvd2VyT2ZUd28iLCJWZWN0b3IyIiwiaXNWZWN0b3IyIiwic2V0U2NhbGFyIiwic2NhbGFyIiwic2V0WCIsInNldFkiLCJzZXRDb21wb25lbnQiLCJnZXRDb21wb25lbnQiLCJjbG9uZSIsImNvcHkiLCJhZGQiLCJ3YXJuIiwiYWRkVmVjdG9ycyIsImFkZFNjYWxhciIsImFkZFNjYWxlZFZlY3RvciIsInN1YiIsInN1YlZlY3RvcnMiLCJzdWJTY2FsYXIiLCJtdWx0aXBseSIsIm11bHRpcGx5U2NhbGFyIiwiZGl2aWRlIiwiZGl2aWRlU2NhbGFyIiwiYXBwbHlNYXRyaXgzIiwiZWxlbWVudHMiLCJjbGFtcFNjYWxhciIsIm1pblZhbCIsIm1heFZhbCIsImNsYW1wTGVuZ3RoIiwicm91bmQiLCJyb3VuZFRvWmVybyIsIm5lZ2F0ZSIsImRvdCIsImxlbmd0aFNxIiwic3FydCIsIm1hbmhhdHRhbkxlbmd0aCIsImFicyIsIm5vcm1hbGl6ZSIsImFuZ2xlIiwiYXRhbjIiLCJkaXN0YW5jZVRvIiwiZGlzdGFuY2VUb1NxdWFyZWQiLCJkeSIsImR4IiwibWFuaGF0dGFuRGlzdGFuY2VUbyIsInNldExlbmd0aCIsImFscGhhIiwibGVycFZlY3RvcnMiLCJ2MSIsInYyIiwiZXF1YWxzIiwiZnJvbUFycmF5Iiwib2Zmc2V0IiwidG9BcnJheSIsImZyb21CdWZmZXJBdHRyaWJ1dGUiLCJhdHRyaWJ1dGUiLCJnZXRYIiwiZ2V0WSIsInJvdGF0ZUFyb3VuZCIsImNlbnRlciIsImNvcyIsInNpbiIsIk1hdHJpeDQiLCJpc01hdHJpeDQiLCJuMTEiLCJuMTIiLCJuMTMiLCJuMTQiLCJuMjEiLCJuMjIiLCJuMjMiLCJuMjQiLCJuMzEiLCJuMzIiLCJuMzMiLCJuMzQiLCJuNDEiLCJuNDIiLCJuNDMiLCJuNDQiLCJ0ZSIsImlkZW50aXR5IiwibWUiLCJjb3B5UG9zaXRpb24iLCJleHRyYWN0QmFzaXMiLCJ4QXhpcyIsInlBeGlzIiwiekF4aXMiLCJzZXRGcm9tTWF0cml4Q29sdW1uIiwibWFrZUJhc2lzIiwieiIsImV4dHJhY3RSb3RhdGlvbiIsInNjYWxlWCIsInNjYWxlWSIsInNjYWxlWiIsIm1ha2VSb3RhdGlvbkZyb21FdWxlciIsImV1bGVyIiwiaXNFdWxlciIsImQiLCJvcmRlciIsImFmIiwiYmUiLCJiZiIsImFlIiwiY2YiLCJkZSIsImRmIiwiY2UiLCJhZCIsImJjIiwiYmQiLCJhYyIsIm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uIiwicSIsIl94IiwiX3kiLCJfeiIsInkyIiwiejIiLCJ4MiIsInh5IiwieHoiLCJ5eiIsInp6Iiwid3kiLCJ3eiIsInl5IiwieHgiLCJ3eCIsImxvb2tBdCIsImV5ZSIsInVwIiwiY3Jvc3NWZWN0b3JzIiwibXVsdGlwbHlNYXRyaWNlcyIsInByZW11bHRpcGx5IiwiYTEyIiwiYTEzIiwiYTE0IiwiYTIyIiwiYTIzIiwiYTI0IiwiYTMyIiwiYTMzIiwiYTM0IiwiYTQyIiwiYTQzIiwiYTQ0IiwiYjEyIiwiYjEzIiwiYjE0IiwiYjIyIiwiYjIzIiwiYjI0IiwiYjMyIiwiYjMzIiwiYjM0IiwiYjQyIiwiYjQzIiwiYjQ0IiwiYTExIiwiYjExIiwiYjIxIiwiYjMxIiwiYjQxIiwiYTIxIiwiYTMxIiwiYTQxIiwiYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSIsImNvdW50IiwiZ2V0WiIsImFwcGx5TWF0cml4NCIsInNldFhZWiIsImRldGVybWluYW50IiwidHJhbnNwb3NlIiwidG1wIiwic2V0UG9zaXRpb24iLCJnZXRJbnZlcnNlIiwidGhyb3dPbkRlZ2VuZXJhdGUiLCJ0MTEiLCJ0MTIiLCJ0MTMiLCJ0MTQiLCJkZXQiLCJtc2ciLCJkZXRJbnYiLCJzY2FsZSIsImdldE1heFNjYWxlT25BeGlzIiwic2NhbGVYU3EiLCJzY2FsZVlTcSIsInNjYWxlWlNxIiwibWFrZVRyYW5zbGF0aW9uIiwibWFrZVJvdGF0aW9uWCIsInRoZXRhIiwibWFrZVJvdGF0aW9uWSIsIm1ha2VSb3RhdGlvbloiLCJtYWtlUm90YXRpb25BeGlzIiwiYXhpcyIsInR5IiwidHgiLCJtYWtlU2NhbGUiLCJtYWtlU2hlYXIiLCJjb21wb3NlIiwicG9zaXRpb24iLCJxdWF0ZXJuaW9uIiwiZGVjb21wb3NlIiwidmVjdG9yIiwic3giLCJtYXRyaXgiLCJzeSIsInN6IiwiaW52U1giLCJpbnZTWSIsImludlNaIiwic2V0RnJvbVJvdGF0aW9uTWF0cml4IiwibWFrZVBlcnNwZWN0aXZlIiwibGVmdCIsInJpZ2h0IiwidG9wIiwiYm90dG9tIiwibmVhciIsImZhciIsIm1ha2VPcnRob2dyYXBoaWMiLCJoIiwiUXVhdGVybmlvbiIsInNsZXJwIiwicWEiLCJxYiIsInFtIiwic2xlcnBGbGF0IiwiZHN0IiwiZHN0T2Zmc2V0Iiwic3JjMCIsInNyY09mZnNldDAiLCJzcmMxIiwic3JjT2Zmc2V0MSIsInkwIiwiejAiLCJ3MCIsIngxIiwieTEiLCJ6MSIsIncxIiwieDAiLCJkaXIiLCJzcXJTaW4iLCJsZW4iLCJ0RGlyIiwib25DaGFuZ2VDYWxsYmFjayIsInNldEZyb21FdWxlciIsInVwZGF0ZSIsInMxIiwiYzIiLCJjMyIsImMxIiwiczIiLCJzMyIsInNldEZyb21BeGlzQW5nbGUiLCJoYWxmQW5nbGUiLCJtMTEiLCJtMTIiLCJtMTMiLCJtMjEiLCJtMjIiLCJtMjMiLCJtMzEiLCJtMzIiLCJtMzMiLCJ0cmFjZSIsInNldEZyb21Vbml0VmVjdG9ycyIsInZGcm9tIiwidlRvIiwiRVBTIiwiaW52ZXJzZSIsImNvbmp1Z2F0ZSIsIm11bHRpcGx5UXVhdGVybmlvbnMiLCJxYXkiLCJxYXoiLCJxYXciLCJxYnkiLCJxYnoiLCJxYnciLCJxYXgiLCJxYngiLCJjb3NIYWxmVGhldGEiLCJzaW5IYWxmVGhldGEiLCJoYWxmVGhldGEiLCJyYXRpb0IiLCJyYXRpb0EiLCJvbkNoYW5nZSIsImNhbGxiYWNrIiwiVmVjdG9yMyIsImlzVmVjdG9yMyIsInNldFoiLCJtdWx0aXBseVZlY3RvcnMiLCJhcHBseUV1bGVyIiwiYXBwbHlRdWF0ZXJuaW9uIiwiYXBwbHlBeGlzQW5nbGUiLCJxeSIsInF6IiwicXciLCJxeCIsIml4IiwiaXciLCJpeSIsIml6IiwicHJvamVjdCIsImNhbWVyYSIsInByb2plY3Rpb25NYXRyaXgiLCJtYXRyaXhXb3JsZCIsInVucHJvamVjdCIsInRyYW5zZm9ybURpcmVjdGlvbiIsImNyb3NzIiwiYXkiLCJheiIsImJ5IiwiYnoiLCJieCIsImF4IiwicHJvamVjdE9uVmVjdG9yIiwicHJvamVjdE9uUGxhbmUiLCJwbGFuZU5vcm1hbCIsInJlZmxlY3QiLCJub3JtYWwiLCJhbmdsZVRvIiwiYWNvcyIsImR6Iiwic2V0RnJvbVNwaGVyaWNhbCIsInBoaSIsInJhZGl1cyIsInNpblBoaVJhZGl1cyIsInNldEZyb21DeWxpbmRyaWNhbCIsInNldEZyb21NYXRyaXhQb3NpdGlvbiIsInNldEZyb21NYXRyaXhTY2FsZSIsIk1hdHJpeDMiLCJpc01hdHJpeDMiLCJzZXRGcm9tTWF0cml4NCIsImdldE5vcm1hbE1hdHJpeCIsIm1hdHJpeDQiLCJ0cmFuc3Bvc2VJbnRvQXJyYXkiLCJzZXRVdlRyYW5zZm9ybSIsInJvdGF0aW9uIiwiY3giLCJjeSIsInJvdGF0ZSIsInRyYW5zbGF0ZSIsImltYWdlIiwibWFwcGluZyIsIndyYXBTIiwid3JhcFQiLCJtYWdGaWx0ZXIiLCJtaW5GaWx0ZXIiLCJmb3JtYXQiLCJhbmlzb3Ryb3B5IiwiZW5jb2RpbmciLCJ0ZXh0dXJlSWQiLCJ1dWlkIiwiVGV4dHVyZSIsIkRFRkFVTFRfSU1BR0UiLCJtaXBtYXBzIiwiREVGQVVMVF9NQVBQSU5HIiwiQ2xhbXBUb0VkZ2VXcmFwcGluZyIsIkxpbmVhckZpbHRlciIsIkxpbmVhck1pcE1hcExpbmVhckZpbHRlciIsIlJHQkFGb3JtYXQiLCJVbnNpZ25lZEJ5dGVUeXBlIiwicmVwZWF0IiwibWF0cml4QXV0b1VwZGF0ZSIsImdlbmVyYXRlTWlwbWFwcyIsInByZW11bHRpcGx5QWxwaGEiLCJmbGlwWSIsInVucGFja0FsaWdubWVudCIsIkxpbmVhckVuY29kaW5nIiwib25VcGRhdGUiLCJVVk1hcHBpbmciLCJpc1RleHR1cmUiLCJ1cGRhdGVNYXRyaXgiLCJ0b0pTT04iLCJpc1Jvb3RPYmplY3QiLCJ0ZXh0dXJlcyIsImNhbnZhcyIsImNyZWF0ZUVsZW1lbnROUyIsIndpZHRoIiwiaGVpZ2h0IiwiZ2V0Q29udGV4dCIsInB1dEltYWdlRGF0YSIsImRyYXdJbWFnZSIsInRvRGF0YVVSTCIsIm1ldGFkYXRhIiwiaW1hZ2VzIiwidXJsIiwiZ2V0RGF0YVVSTCIsImRpc3Bvc2UiLCJ0cmFuc2Zvcm1VdiIsInV2IiwiVmVjdG9yNCIsImlzVmVjdG9yNCIsInNldFciLCJzZXRBeGlzQW5nbGVGcm9tUXVhdGVybmlvbiIsInNldEF4aXNBbmdsZUZyb21Sb3RhdGlvbk1hdHJpeCIsImVwc2lsb24iLCJlcHNpbG9uMiIsImdldFciLCJvcHRpb25zIiwic2Npc3NvciIsInNjaXNzb3JUZXN0Iiwidmlld3BvcnQiLCJ0ZXh0dXJlIiwiZGVwdGhCdWZmZXIiLCJzdGVuY2lsQnVmZmVyIiwiZGVwdGhUZXh0dXJlIiwiV2ViR0xSZW5kZXJUYXJnZXQiLCJpc1dlYkdMUmVuZGVyVGFyZ2V0Iiwic2V0U2l6ZSIsImFjdGl2ZUN1YmVGYWNlIiwiYWN0aXZlTWlwTWFwTGV2ZWwiLCJXZWJHTFJlbmRlclRhcmdldEN1YmUiLCJpc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSIsIk5lYXJlc3RGaWx0ZXIiLCJEYXRhVGV4dHVyZSIsImlzRGF0YVRleHR1cmUiLCJJbmZpbml0eSIsIkJveDMiLCJpc0JveDMiLCJzZXRGcm9tQXJyYXkiLCJtaW5YIiwibWluWSIsIm1pbloiLCJtYXhYIiwibWF4WSIsIm1heFoiLCJzZXRGcm9tQnVmZmVyQXR0cmlidXRlIiwic2V0RnJvbVBvaW50cyIsInBvaW50cyIsIm1ha2VFbXB0eSIsImlsIiwiZXhwYW5kQnlQb2ludCIsInNldEZyb21DZW50ZXJBbmRTaXplIiwic2l6ZSIsImhhbGZTaXplIiwic2V0RnJvbU9iamVjdCIsImV4cGFuZEJ5T2JqZWN0IiwiYm94IiwiaXNFbXB0eSIsImdldENlbnRlciIsImdldFNpemUiLCJleHBhbmRCeVZlY3RvciIsImV4cGFuZEJ5U2NhbGFyIiwiZ2VvbWV0cnkiLCJpc0dlb21ldHJ5IiwidmVydGljZXMiLCJzY29wZSIsImlzQnVmZmVyR2VvbWV0cnkiLCJhdHRyaWJ1dGVzIiwidXBkYXRlTWF0cml4V29ybGQiLCJ0cmF2ZXJzZSIsImNvbnRhaW5zUG9pbnQiLCJjb250YWluc0JveCIsImdldFBhcmFtZXRlciIsImludGVyc2VjdHNCb3giLCJpbnRlcnNlY3RzU3BoZXJlIiwic3BoZXJlIiwiY2xhbXBQb2ludCIsImNsb3Nlc3RQb2ludCIsImludGVyc2VjdHNQbGFuZSIsInBsYW5lIiwiY29uc3RhbnQiLCJpbnRlcnNlY3RzVHJpYW5nbGUiLCJheGVzIiwidGVzdEF4aXMiLCJleHRlbnRzIiwidjAiLCJwMCIsInAxIiwicDIiLCJ0cmlhbmdsZSIsImYwIiwiZjEiLCJmMiIsInNhdEZvckF4ZXMiLCJ0cmlhbmdsZU5vcm1hbCIsImRpc3RhbmNlVG9Qb2ludCIsImdldEJvdW5kaW5nU3BoZXJlIiwiaW50ZXJzZWN0IiwidW5pb24iLCJTcGhlcmUiLCJvcHRpb25hbENlbnRlciIsIm1heFJhZGl1c1NxIiwicmFkaXVzU3VtIiwiZGVsdGFMZW5ndGhTcSIsImdldEJvdW5kaW5nQm94IiwiUGxhbmUiLCJzZXRDb21wb25lbnRzIiwic2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQiLCJzZXRGcm9tQ29wbGFuYXJQb2ludHMiLCJpbnZlcnNlTm9ybWFsTGVuZ3RoIiwiZGlzdGFuY2VUb1NwaGVyZSIsInByb2plY3RQb2ludCIsImludGVyc2VjdExpbmUiLCJsaW5lIiwiZGVsdGEiLCJkaXJlY3Rpb24iLCJkZW5vbWluYXRvciIsInN0YXJ0IiwiaW50ZXJzZWN0c0xpbmUiLCJlbmQiLCJlbmRTaWduIiwic3RhcnRTaWduIiwiY29wbGFuYXJQb2ludCIsIm9wdGlvbmFsTm9ybWFsTWF0cml4IiwibTEiLCJub3JtYWxNYXRyaXgiLCJyZWZlcmVuY2VQb2ludCIsInAzIiwicDQiLCJwNSIsInBsYW5lcyIsIkZydXN0dW0iLCJmcnVzdHVtIiwic2V0RnJvbU1hdHJpeCIsIm1lMSIsIm1lMiIsIm1lMyIsIm1lNSIsIm1lNiIsIm1lNyIsIm1lOSIsIm1lMTAiLCJtZTExIiwibWUxMyIsIm1lMTQiLCJtZTE1IiwibWUwIiwibWU0IiwibWU4IiwibWUxMiIsImludGVyc2VjdHNPYmplY3QiLCJib3VuZGluZ1NwaGVyZSIsImNvbXB1dGVCb3VuZGluZ1NwaGVyZSIsImludGVyc2VjdHNTcHJpdGUiLCJzcHJpdGUiLCJkaXN0YW5jZSIsIm5lZ1JhZGl1cyIsImFscGhhbWFwX2ZyYWdtZW50IiwiYWxwaGFtYXBfcGFyc19mcmFnbWVudCIsImFscGhhdGVzdF9mcmFnbWVudCIsImFvbWFwX2ZyYWdtZW50IiwiYW9tYXBfcGFyc19mcmFnbWVudCIsImJlZ2luX3ZlcnRleCIsImJlZ2lubm9ybWFsX3ZlcnRleCIsImJzZGZzIiwiYnVtcG1hcF9wYXJzX2ZyYWdtZW50IiwiY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50IiwiY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQiLCJjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXgiLCJjbGlwcGluZ19wbGFuZXNfdmVydGV4IiwiY29sb3JfZnJhZ21lbnQiLCJjb2xvcl9wYXJzX2ZyYWdtZW50IiwiY29sb3JfcGFyc192ZXJ0ZXgiLCJjb2xvcl92ZXJ0ZXgiLCJjb21tb24iLCJjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQiLCJkZWZhdWx0bm9ybWFsX3ZlcnRleCIsImRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleCIsImRpc3BsYWNlbWVudG1hcF92ZXJ0ZXgiLCJlbWlzc2l2ZW1hcF9mcmFnbWVudCIsImVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQiLCJlbmNvZGluZ3NfZnJhZ21lbnQiLCJlbmNvZGluZ3NfcGFyc19mcmFnbWVudCIsImVudm1hcF9mcmFnbWVudCIsImVudm1hcF9wYXJzX2ZyYWdtZW50IiwiZW52bWFwX3BhcnNfdmVydGV4IiwiZW52bWFwX3ZlcnRleCIsImZvZ192ZXJ0ZXgiLCJmb2dfcGFyc192ZXJ0ZXgiLCJmb2dfZnJhZ21lbnQiLCJmb2dfcGFyc19mcmFnbWVudCIsImdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQiLCJsaWdodG1hcF9mcmFnbWVudCIsImxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQiLCJsaWdodHNfbGFtYmVydF92ZXJ0ZXgiLCJsaWdodHNfcGFyc19iZWdpbiIsImxpZ2h0c19wYXJzX21hcHMiLCJsaWdodHNfcGhvbmdfZnJhZ21lbnQiLCJsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudCIsImxpZ2h0c19waHlzaWNhbF9mcmFnbWVudCIsImxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50IiwibGlnaHRzX2ZyYWdtZW50X2JlZ2luIiwibGlnaHRzX2ZyYWdtZW50X21hcHMiLCJsaWdodHNfZnJhZ21lbnRfZW5kIiwibG9nZGVwdGhidWZfZnJhZ21lbnQiLCJsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50IiwibG9nZGVwdGhidWZfcGFyc192ZXJ0ZXgiLCJsb2dkZXB0aGJ1Zl92ZXJ0ZXgiLCJtYXBfZnJhZ21lbnQiLCJtYXBfcGFyc19mcmFnbWVudCIsIm1hcF9wYXJ0aWNsZV9mcmFnbWVudCIsIm1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50IiwibWV0YWxuZXNzbWFwX2ZyYWdtZW50IiwibWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQiLCJtb3JwaG5vcm1hbF92ZXJ0ZXgiLCJtb3JwaHRhcmdldF9wYXJzX3ZlcnRleCIsIm1vcnBodGFyZ2V0X3ZlcnRleCIsIm5vcm1hbF9mcmFnbWVudF9iZWdpbiIsIm5vcm1hbF9mcmFnbWVudF9tYXBzIiwibm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQiLCJwYWNraW5nIiwicHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudCIsInByb2plY3RfdmVydGV4IiwiZGl0aGVyaW5nX2ZyYWdtZW50IiwiZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQiLCJyb3VnaG5lc3NtYXBfZnJhZ21lbnQiLCJyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudCIsInNoYWRvd21hcF9wYXJzX2ZyYWdtZW50Iiwic2hhZG93bWFwX3BhcnNfdmVydGV4Iiwic2hhZG93bWFwX3ZlcnRleCIsInNoYWRvd21hc2tfcGFyc19mcmFnbWVudCIsInNraW5iYXNlX3ZlcnRleCIsInNraW5uaW5nX3BhcnNfdmVydGV4Iiwic2tpbm5pbmdfdmVydGV4Iiwic2tpbm5vcm1hbF92ZXJ0ZXgiLCJzcGVjdWxhcm1hcF9mcmFnbWVudCIsInNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQiLCJ0b25lbWFwcGluZ19mcmFnbWVudCIsInRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQiLCJ1dl9wYXJzX2ZyYWdtZW50IiwidXZfcGFyc192ZXJ0ZXgiLCJ1dl92ZXJ0ZXgiLCJ1djJfcGFyc19mcmFnbWVudCIsInV2Ml9wYXJzX3ZlcnRleCIsInV2Ml92ZXJ0ZXgiLCJ3b3JsZHBvc192ZXJ0ZXgiLCJjdWJlX2ZyYWciLCJjdWJlX3ZlcnQiLCJkZXB0aF9mcmFnIiwiZGVwdGhfdmVydCIsImRpc3RhbmNlUkdCQV9mcmFnIiwiZGlzdGFuY2VSR0JBX3ZlcnQiLCJlcXVpcmVjdF9mcmFnIiwiZXF1aXJlY3RfdmVydCIsImxpbmVkYXNoZWRfZnJhZyIsImxpbmVkYXNoZWRfdmVydCIsIm1lc2hiYXNpY19mcmFnIiwibWVzaGJhc2ljX3ZlcnQiLCJtZXNobGFtYmVydF9mcmFnIiwibWVzaGxhbWJlcnRfdmVydCIsIm1lc2hwaG9uZ19mcmFnIiwibWVzaHBob25nX3ZlcnQiLCJtZXNocGh5c2ljYWxfZnJhZyIsIm1lc2hwaHlzaWNhbF92ZXJ0Iiwibm9ybWFsX2ZyYWciLCJub3JtYWxfdmVydCIsInBvaW50c19mcmFnIiwicG9pbnRzX3ZlcnQiLCJzaGFkb3dfZnJhZyIsInNoYWRvd192ZXJ0IiwibWVyZ2UiLCJ1bmlmb3JtcyIsInUiLCJtZXJnZWQiLCJ1bmlmb3Jtc19zcmMiLCJ1bmlmb3Jtc19kc3QiLCJwYXJhbWV0ZXJfc3JjIiwiaXNDb2xvciIsInNldFJHQiIsIkNvbG9yIiwic2V0SGV4Iiwic2V0U3R5bGUiLCJoZXgiLCJzZXRIU0wiLCJodWUycmdiIiwic3RyaW5nIiwicGFyc2VGbG9hdCIsImNvbG9yIiwiY29tcG9uZW50cyIsInBhcnNlSW50IiwiaGFuZGxlQWxwaGEiLCJDb2xvcktleXdvcmRzIiwiY29weUdhbW1hVG9MaW5lYXIiLCJnYW1tYUZhY3RvciIsImNvcHlMaW5lYXJUb0dhbW1hIiwic2FmZUludmVyc2UiLCJjb252ZXJ0R2FtbWFUb0xpbmVhciIsImNvbnZlcnRMaW5lYXJUb0dhbW1hIiwiZ2V0SGV4IiwiZ2V0SGV4U3RyaW5nIiwiZ2V0SFNMIiwic2F0dXJhdGlvbiIsImh1ZSIsImxpZ2h0bmVzcyIsImdldFN0eWxlIiwib2Zmc2V0SFNMIiwiaHNsIiwiYWRkQ29sb3JzIiwiY29sb3IxIiwiY29sb3IyIiwiZGlmZnVzZSIsIm9wYWNpdHkiLCJtYXAiLCJ1dlRyYW5zZm9ybSIsImFscGhhTWFwIiwic3BlY3VsYXJtYXAiLCJzcGVjdWxhck1hcCIsImVudm1hcCIsImVudk1hcCIsImZsaXBFbnZNYXAiLCJyZWZsZWN0aXZpdHkiLCJyZWZyYWN0aW9uUmF0aW8iLCJtYXhNaXBMZXZlbCIsImFvbWFwIiwiYW9NYXAiLCJhb01hcEludGVuc2l0eSIsImxpZ2h0bWFwIiwibGlnaHRNYXAiLCJsaWdodE1hcEludGVuc2l0eSIsImVtaXNzaXZlbWFwIiwiZW1pc3NpdmVNYXAiLCJidW1wbWFwIiwiYnVtcE1hcCIsImJ1bXBTY2FsZSIsIm5vcm1hbG1hcCIsIm5vcm1hbE1hcCIsIm5vcm1hbFNjYWxlIiwiZGlzcGxhY2VtZW50bWFwIiwiZGlzcGxhY2VtZW50TWFwIiwiZGlzcGxhY2VtZW50U2NhbGUiLCJkaXNwbGFjZW1lbnRCaWFzIiwicm91Z2huZXNzbWFwIiwicm91Z2huZXNzTWFwIiwibWV0YWxuZXNzbWFwIiwibWV0YWxuZXNzTWFwIiwiZ3JhZGllbnRtYXAiLCJncmFkaWVudE1hcCIsImZvZyIsImZvZ0RlbnNpdHkiLCJmb2dOZWFyIiwiZm9nRmFyIiwiZm9nQ29sb3IiLCJsaWdodHMiLCJhbWJpZW50TGlnaHRDb2xvciIsImRpcmVjdGlvbmFsTGlnaHRzIiwicHJvcGVydGllcyIsInNoYWRvdyIsInNoYWRvd0JpYXMiLCJzaGFkb3dSYWRpdXMiLCJzaGFkb3dNYXBTaXplIiwiZGlyZWN0aW9uYWxTaGFkb3dNYXAiLCJkaXJlY3Rpb25hbFNoYWRvd01hdHJpeCIsInNwb3RMaWdodHMiLCJjb25lQ29zIiwicGVudW1icmFDb3MiLCJkZWNheSIsInNwb3RTaGFkb3dNYXAiLCJzcG90U2hhZG93TWF0cml4IiwicG9pbnRMaWdodHMiLCJzaGFkb3dDYW1lcmFOZWFyIiwic2hhZG93Q2FtZXJhRmFyIiwicG9pbnRTaGFkb3dNYXAiLCJwb2ludFNoYWRvd01hdHJpeCIsImhlbWlzcGhlcmVMaWdodHMiLCJza3lDb2xvciIsImdyb3VuZENvbG9yIiwicmVjdEFyZWFMaWdodHMiLCJiYXNpYyIsIlVuaWZvcm1zVXRpbHMiLCJVbmlmb3Jtc0xpYiIsInZlcnRleFNoYWRlciIsIlNoYWRlckNodW5rIiwiZnJhZ21lbnRTaGFkZXIiLCJsYW1iZXJ0IiwiZW1pc3NpdmUiLCJwaG9uZyIsInNwZWN1bGFyIiwic2hpbmluZXNzIiwic3RhbmRhcmQiLCJyb3VnaG5lc3MiLCJtZXRhbG5lc3MiLCJlbnZNYXBJbnRlbnNpdHkiLCJkYXNoZWQiLCJkYXNoU2l6ZSIsInRvdGFsU2l6ZSIsImRlcHRoIiwiY3ViZSIsInRDdWJlIiwidEZsaXAiLCJlcXVpcmVjdCIsInRFcXVpcmVjdCIsImRpc3RhbmNlUkdCQSIsInJlZmVyZW5jZVBvc2l0aW9uIiwibmVhckRpc3RhbmNlIiwiZmFyRGlzdGFuY2UiLCJTaGFkZXJMaWIiLCJwaHlzaWNhbCIsImNsZWFyQ29hdCIsImNsZWFyQ29hdFJvdWdobmVzcyIsImdsIiwiYnVmZmVyVHlwZSIsImR5bmFtaWMiLCJEWU5BTUlDX0RSQVciLCJTVEFUSUNfRFJBVyIsImNyZWF0ZUJ1ZmZlciIsImJpbmRCdWZmZXIiLCJidWZmZXIiLCJidWZmZXJEYXRhIiwidXNhZ2UiLCJvblVwbG9hZENhbGxiYWNrIiwiRkxPQVQiLCJVTlNJR05FRF9TSE9SVCIsIlNIT1JUIiwiVU5TSUdORURfSU5UIiwiSU5UIiwiQllURSIsIlVOU0lHTkVEX0JZVEUiLCJieXRlc1BlckVsZW1lbnQiLCJCWVRFU19QRVJfRUxFTUVOVCIsInVwZGF0ZVJhbmdlIiwiYnVmZmVyU3ViRGF0YSIsInN1YmFycmF5IiwiaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSIsImJ1ZmZlcnMiLCJkZWxldGVCdWZmZXIiLCJkZWxldGUiLCJ1cGRhdGVCdWZmZXIiLCJyZW1vdmUiLCJfb3JkZXIiLCJFdWxlciIsIkRlZmF1bHRPcmRlciIsIlJvdGF0aW9uT3JkZXJzIiwiYXNpbiIsInNldEZyb21RdWF0ZXJuaW9uIiwic2V0RnJvbVZlY3RvcjMiLCJyZW9yZGVyIiwibmV3T3JkZXIiLCJ0b1ZlY3RvcjMiLCJvcHRpb25hbFJlc3VsdCIsIm1hc2siLCJMYXllcnMiLCJlbmFibGUiLCJkaXNhYmxlIiwibGF5ZXJzIiwib2JqZWN0M0RJZCIsImNoaWxkcmVuIiwiT2JqZWN0M0QiLCJEZWZhdWx0VXAiLCJvblJvdGF0aW9uQ2hhbmdlIiwib25RdWF0ZXJuaW9uQ2hhbmdlIiwibW9kZWxWaWV3TWF0cml4IiwiRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGUiLCJtYXRyaXhXb3JsZE5lZWRzVXBkYXRlIiwidmlzaWJsZSIsImNhc3RTaGFkb3ciLCJyZWNlaXZlU2hhZG93IiwiZnJ1c3R1bUN1bGxlZCIsInJlbmRlck9yZGVyIiwidXNlckRhdGEiLCJpc09iamVjdDNEIiwib25CZWZvcmVSZW5kZXIiLCJvbkFmdGVyUmVuZGVyIiwiYXBwbHlNYXRyaXgiLCJzZXRSb3RhdGlvbkZyb21BeGlzQW5nbGUiLCJzZXRSb3RhdGlvbkZyb21FdWxlciIsInNldFJvdGF0aW9uRnJvbU1hdHJpeCIsInNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24iLCJyb3RhdGVPbkF4aXMiLCJxMSIsInJvdGF0ZU9uV29ybGRBeGlzIiwicm90YXRlWCIsInJvdGF0ZVkiLCJyb3RhdGVaIiwidHJhbnNsYXRlT25BeGlzIiwidHJhbnNsYXRlWCIsInRyYW5zbGF0ZVkiLCJ0cmFuc2xhdGVaIiwibG9jYWxUb1dvcmxkIiwid29ybGRUb0xvY2FsIiwiaXNDYW1lcmEiLCJnZXRPYmplY3RCeUlkIiwiZ2V0T2JqZWN0QnlQcm9wZXJ0eSIsImdldE9iamVjdEJ5TmFtZSIsImNoaWxkIiwiZ2V0V29ybGRQb3NpdGlvbiIsImdldFdvcmxkUXVhdGVybmlvbiIsImdldFdvcmxkU2NhbGUiLCJnZXRXb3JsZERpcmVjdGlvbiIsInJheWNhc3QiLCJ0cmF2ZXJzZVZpc2libGUiLCJ0cmF2ZXJzZUFuY2VzdG9ycyIsImZvcmNlIiwiZ2VvbWV0cmllcyIsIm1hdGVyaWFscyIsInNoYXBlcyIsImxpYnJhcnkiLCJlbGVtZW50Iiwic2VyaWFsaXplIiwicGFyYW1ldGVycyIsInNoYXBlIiwibWF0ZXJpYWwiLCJ1dWlkcyIsImV4dHJhY3RGcm9tQ2FjaGUiLCJjYWNoZSIsInJlY3Vyc2l2ZSIsInBhcnNlIiwibWF0cml4V29ybGRJbnZlcnNlIiwiQ2FtZXJhIiwiem9vbSIsInZpZXciLCJ1cGRhdGVQcm9qZWN0aW9uTWF0cml4IiwiT3J0aG9ncmFwaGljQ2FtZXJhIiwiaXNPcnRob2dyYXBoaWNDYW1lcmEiLCJzZXRWaWV3T2Zmc2V0IiwiZnVsbFdpZHRoIiwiZnVsbEhlaWdodCIsImVuYWJsZWQiLCJvZmZzZXRYIiwib2Zmc2V0WSIsImNsZWFyVmlld09mZnNldCIsInNjYWxlVyIsInpvb21XIiwic2NhbGVIIiwiem9vbUgiLCJtYXRlcmlhbEluZGV4IiwidmVydGV4Tm9ybWFscyIsInZlcnRleENvbG9ycyIsIkZhY2UzIiwiZ2VvbWV0cnlJZCIsImNvbG9ycyIsImZhY2VzIiwiZmFjZVZlcnRleFV2cyIsIm1vcnBoVGFyZ2V0cyIsIm1vcnBoTm9ybWFscyIsInNraW5XZWlnaHRzIiwic2tpbkluZGljZXMiLCJsaW5lRGlzdGFuY2VzIiwiYm91bmRpbmdCb3giLCJlbGVtZW50c05lZWRVcGRhdGUiLCJ2ZXJ0aWNlc05lZWRVcGRhdGUiLCJ1dnNOZWVkVXBkYXRlIiwibm9ybWFsc05lZWRVcGRhdGUiLCJjb2xvcnNOZWVkVXBkYXRlIiwibGluZURpc3RhbmNlc05lZWRVcGRhdGUiLCJncm91cHNOZWVkVXBkYXRlIiwiR2VvbWV0cnkiLCJ2ZXJ0ZXgiLCJmYWNlIiwiamwiLCJjb21wdXRlQm91bmRpbmdCb3giLCJmcm9tQnVmZmVyR2VvbWV0cnkiLCJ1djIiLCJ1dnMyIiwicG9zaXRpb25zIiwibm9ybWFscyIsInRlbXBOb3JtYWxzIiwidXZzIiwidGVtcFVWcyIsInRlbXBVVnMyIiwiZ3JvdXBzIiwiZ3JvdXAiLCJpbmRpY2VzIiwiYWRkRmFjZSIsImNvbXB1dGVGYWNlTm9ybWFscyIsImFiIiwiZmwiLCJjYiIsInZDIiwidkIiLCJ2QSIsImNvbXB1dGVWZXJ0ZXhOb3JtYWxzIiwiYXJlYVdlaWdodGVkIiwidmwiLCJjb21wdXRlRmxhdFZlcnRleE5vcm1hbHMiLCJjb21wdXRlTW9ycGhOb3JtYWxzIiwiX19vcmlnaW5hbEZhY2VOb3JtYWwiLCJfX29yaWdpbmFsVmVydGV4Tm9ybWFscyIsInRtcEdlbyIsImZhY2VOb3JtYWxzIiwiZmFjZU5vcm1hbCIsImRzdE5vcm1hbHNGYWNlIiwiZHN0Tm9ybWFsc1ZlcnRleCIsIm1hdGVyaWFsSW5kZXhPZmZzZXQiLCJ2ZXJ0ZXhPZmZzZXQiLCJ2ZXJ0aWNlczEiLCJ2ZXJ0aWNlczIiLCJmYWNlczEiLCJmYWNlczIiLCJ1dnMxIiwiY29sb3JzMSIsImNvbG9yczIiLCJ2ZXJ0ZXhDb3B5IiwiZmFjZUNvcHkiLCJmYWNlVmVydGV4Tm9ybWFscyIsImZhY2VWZXJ0ZXhDb2xvcnMiLCJ1dkNvcHkiLCJtZXJnZU1lc2giLCJtZXNoIiwiaXNNZXNoIiwibWVyZ2VWZXJ0aWNlcyIsImNoYW5nZXMiLCJwcmVjaXNpb25Qb2ludHMiLCJwcmVjaXNpb24iLCJ2ZXJ0aWNlc01hcCIsInVuaXF1ZSIsImZhY2VJbmRpY2VzVG9SZW1vdmUiLCJpZHgiLCJzb3J0RmFjZXNCeU1hdGVyaWFsSW5kZXgiLCJfaWQiLCJzb3J0IiwibWF0ZXJpYWxJbmRleFNvcnQiLCJuZXdVdnMyIiwibmV3VXZzMSIsImZhY2VUeXBlIiwic2V0Qml0IiwiaGFzTWF0ZXJpYWwiLCJoYXNGYWNlVXYiLCJoYXNGYWNlVmVydGV4VXYiLCJoYXNGYWNlTm9ybWFsIiwiaGFzRmFjZVZlcnRleE5vcm1hbCIsImhhc0ZhY2VDb2xvciIsImhhc0ZhY2VWZXJ0ZXhDb2xvciIsImdldFV2SW5kZXgiLCJnZXROb3JtYWxJbmRleCIsImdldENvbG9ySW5kZXgiLCJub3JtYWxzSGFzaCIsImhhc2giLCJjb2xvcnNIYXNoIiwidXZzSGFzaCIsImtsIiwidXZzQ29weSIsIm1vcnBoVGFyZ2V0IiwibW9ycGhOb3JtYWwiLCJkZXN0VmVydGV4Tm9ybWFsIiwic3JjVmVydGV4Tm9ybWFsIiwiaXRlbVNpemUiLCJub3JtYWxpemVkIiwiQnVmZmVyQXR0cmlidXRlIiwiaXNCdWZmZXJBdHRyaWJ1dGUiLCJzZXRBcnJheSIsInNldER5bmFtaWMiLCJjb3B5QXQiLCJpbmRleDEiLCJpbmRleDIiLCJjb3B5QXJyYXkiLCJjb3B5Q29sb3JzQXJyYXkiLCJjb3B5VmVjdG9yMnNBcnJheSIsInZlY3RvcnMiLCJjb3B5VmVjdG9yM3NBcnJheSIsImNvcHlWZWN0b3I0c0FycmF5Iiwic2V0WFkiLCJzZXRYWVpXIiwib25VcGxvYWQiLCJJbnQ4QnVmZmVyQXR0cmlidXRlIiwiVWludDhCdWZmZXJBdHRyaWJ1dGUiLCJVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUiLCJJbnQxNkJ1ZmZlckF0dHJpYnV0ZSIsIlVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSIsIkludDMyQnVmZmVyQXR0cmlidXRlIiwiVWludDMyQnVmZmVyQXR0cmlidXRlIiwiRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSIsIkZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUiLCJEaXJlY3RHZW9tZXRyeSIsImNvbXB1dGVHcm91cHMiLCJmcm9tR2VvbWV0cnkiLCJtb3JwaFRhcmdldHNMZW5ndGgiLCJtb3JwaFRhcmdldHNQb3NpdGlvbiIsIm1vcnBoTm9ybWFsc0xlbmd0aCIsIm1vcnBoVGFyZ2V0c05vcm1hbCIsInZlcnRleFV2cyIsImhhc0ZhY2VWZXJ0ZXhVdjIiLCJoYXNTa2luSW5kaWNlcyIsImhhc1NraW5XZWlnaHRzIiwiYnVmZmVyR2VvbWV0cnlJZCIsIm1vcnBoQXR0cmlidXRlcyIsImRyYXdSYW5nZSIsIkJ1ZmZlckdlb21ldHJ5IiwiZ2V0SW5kZXgiLCJzZXRJbmRleCIsImFycmF5TWF4IiwiYWRkQXR0cmlidXRlIiwiZ2V0QXR0cmlidXRlIiwicmVtb3ZlQXR0cmlidXRlIiwiYWRkR3JvdXAiLCJjbGVhckdyb3VwcyIsInNldERyYXdSYW5nZSIsIm5lZWRzVXBkYXRlIiwiaXNQb2ludHMiLCJpc0xpbmUiLCJ1cGRhdGVGcm9tT2JqZWN0IiwiX19kaXJlY3RHZW9tZXRyeSIsImRpcmVjdCIsImxpbmVEaXN0YW5jZSIsImZyb21EaXJlY3RHZW9tZXRyeSIsInBCIiwicEMiLCJwQSIsIm5vcm1hbGl6ZU5vcm1hbHMiLCJhdHRyaWJ1dGUxIiwiYXR0cmlidXRlMiIsImF0dHJpYnV0ZVNpemUiLCJhdHRyaWJ1dGVBcnJheTIiLCJhdHRyaWJ1dGVBcnJheTEiLCJ0b05vbkluZGV4ZWQiLCJhcnJheTIiLCJnZW9tZXRyeTIiLCJtb3JwaEF0dHJpYnV0ZSIsIndpZHRoU2VnbWVudHMiLCJoZWlnaHRTZWdtZW50cyIsImRlcHRoU2VnbWVudHMiLCJCb3hHZW9tZXRyeSIsImJ1aWxkUGxhbmUiLCJ1ZGlyIiwidmRpciIsImdyaWRYIiwiZ3JpZFkiLCJncmlkWTEiLCJzZWdtZW50SGVpZ2h0IiwiaGVpZ2h0SGFsZiIsImdyaWRYMSIsInNlZ21lbnRXaWR0aCIsIndpZHRoSGFsZiIsImRlcHRoSGFsZiIsInZlcnRleENvdW50ZXIiLCJudW1iZXJPZlZlcnRpY2VzIiwiZ3JvdXBDb3VudCIsImdyb3VwU3RhcnQiLCJCb3hCdWZmZXJHZW9tZXRyeSIsIlBsYW5lR2VvbWV0cnkiLCJzZWdtZW50X2hlaWdodCIsImhlaWdodF9oYWxmIiwic2VnbWVudF93aWR0aCIsIndpZHRoX2hhbGYiLCJQbGFuZUJ1ZmZlckdlb21ldHJ5IiwibWF0ZXJpYWxJZCIsImJsZW5kaW5nIiwiTm9ybWFsQmxlbmRpbmciLCJzaWRlIiwiRnJvbnRTaWRlIiwiZmxhdFNoYWRpbmciLCJOb0NvbG9ycyIsInRyYW5zcGFyZW50IiwiYmxlbmRTcmMiLCJTcmNBbHBoYUZhY3RvciIsImJsZW5kRHN0IiwiT25lTWludXNTcmNBbHBoYUZhY3RvciIsImJsZW5kRXF1YXRpb24iLCJBZGRFcXVhdGlvbiIsImJsZW5kU3JjQWxwaGEiLCJibGVuZERzdEFscGhhIiwiYmxlbmRFcXVhdGlvbkFscGhhIiwiZGVwdGhGdW5jIiwiTGVzc0VxdWFsRGVwdGgiLCJkZXB0aFRlc3QiLCJkZXB0aFdyaXRlIiwiY2xpcHBpbmdQbGFuZXMiLCJjbGlwSW50ZXJzZWN0aW9uIiwiY2xpcFNoYWRvd3MiLCJzaGFkb3dTaWRlIiwiY29sb3JXcml0ZSIsInBvbHlnb25PZmZzZXQiLCJwb2x5Z29uT2Zmc2V0RmFjdG9yIiwicG9seWdvbk9mZnNldFVuaXRzIiwiZGl0aGVyaW5nIiwiYWxwaGFUZXN0IiwicHJlbXVsdGlwbGllZEFscGhhIiwib3ZlcmRyYXciLCJNYXRlcmlhbCIsImlzTWF0ZXJpYWwiLCJvbkJlZm9yZUNvbXBpbGUiLCJzZXRWYWx1ZXMiLCJuZXdWYWx1ZSIsIkZsYXRTaGFkaW5nIiwiY3VycmVudFZhbHVlIiwiaXNSb290IiwiZW1pc3NpdmVJbnRlbnNpdHkiLCJzaXplQXR0ZW51YXRpb24iLCJsaW5ld2lkdGgiLCJnYXBTaXplIiwid2lyZWZyYW1lIiwid2lyZWZyYW1lTGluZXdpZHRoIiwid2lyZWZyYW1lTGluZWNhcCIsIndpcmVmcmFtZUxpbmVqb2luIiwic2tpbm5pbmciLCJkc3RQbGFuZXMiLCJzcmNQbGFuZXMiLCJjb21iaW5lIiwiTXVsdGlwbHlPcGVyYXRpb24iLCJNZXNoQmFzaWNNYXRlcmlhbCIsImlzTWVzaEJhc2ljTWF0ZXJpYWwiLCJkZWZpbmVzIiwiY2xpcHBpbmciLCJkZXJpdmF0aXZlcyIsImZyYWdEZXB0aCIsImRyYXdCdWZmZXJzIiwic2hhZGVyVGV4dHVyZUxPRCIsImRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXMiLCJpbmRleDBBdHRyaWJ1dGVOYW1lIiwidW5pZm9ybXNOZWVkVXBkYXRlIiwiU2hhZGVyTWF0ZXJpYWwiLCJpc1NoYWRlck1hdGVyaWFsIiwib3JpZ2luIiwiUmF5IiwicmF5IiwiYXQiLCJyZWNhc3QiLCJjbG9zZXN0UG9pbnRUb1BvaW50IiwiZGlyZWN0aW9uRGlzdGFuY2UiLCJkaXN0YW5jZVNxVG9Qb2ludCIsImRpc3RhbmNlU3FUb1NlZ21lbnQiLCJvcHRpb25hbFBvaW50T25SYXkiLCJvcHRpb25hbFBvaW50T25TZWdtZW50Iiwic2VnQ2VudGVyIiwic2VnRGlyIiwiZGlmZiIsImEwMSIsInNxckRpc3QiLCJleHREZXQiLCJzMCIsImIwIiwic2VnRXh0ZW50IiwiaW52RGV0IiwiaW50ZXJzZWN0U3BoZXJlIiwidGNhIiwicmFkaXVzMiIsInRoYyIsInQwIiwidDEiLCJkaXN0YW5jZVRvUGxhbmUiLCJpbnRlcnNlY3RQbGFuZSIsImRpc3RUb1BvaW50IiwiaW50ZXJzZWN0Qm94IiwidG1heCIsInR5bWluIiwidHltYXgiLCJ0em1pbiIsInR6bWF4IiwiaW52ZGlyeSIsImludmRpcnoiLCJpbnZkaXJ4IiwidG1pbiIsImludGVyc2VjdFRyaWFuZ2xlIiwiYmFja2ZhY2VDdWxsaW5nIiwiZWRnZTEiLCJlZGdlMiIsIkRkTiIsIkRkUXhFMiIsIkRkRTF4USIsIlFkTiIsIkxpbmUzIiwiZGlzdGFuY2VTcSIsImNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIiLCJjbGFtcFRvTGluZSIsInN0YXJ0UCIsInN0YXJ0RW5kIiwic3RhcnRFbmRfc3RhcnRQIiwic3RhcnRFbmQyIiwiVHJpYW5nbGUiLCJnZXROb3JtYWwiLCJ0YXJnZXRMZW5ndGhTcSIsImdldEJhcnljb29yZCIsImRvdDAwIiwiZG90MTEiLCJkb3QwMSIsImRlbm9tIiwiZG90MDIiLCJkb3QxMiIsImludkRlbm9tIiwic2V0RnJvbVBvaW50c0FuZEluZGljZXMiLCJpMCIsImkxIiwiaTIiLCJnZXRBcmVhIiwiZ2V0TWlkcG9pbnQiLCJnZXRQbGFuZSIsInByb2plY3RlZFBvaW50IiwiZWRnZUxpc3QiLCJtaW5EaXN0YW5jZSIsImRyYXdNb2RlIiwiVHJpYW5nbGVzRHJhd01vZGUiLCJ1cGRhdGVNb3JwaFRhcmdldHMiLCJNZXNoIiwic2V0RHJhd01vZGUiLCJtb3JwaFRhcmdldEluZmx1ZW5jZXMiLCJtb3JwaFRhcmdldERpY3Rpb25hcnkiLCJtbCIsInV2MSIsInV2MyIsImJhcnljb29yZCIsInJheWNhc3RlciIsIkJhY2tTaWRlIiwiRG91YmxlU2lkZSIsImludGVyc2VjdGlvblBvaW50V29ybGQiLCJjaGVja0ludGVyc2VjdGlvbiIsImludGVyc2VjdGlvblBvaW50IiwiaW50ZXJzZWN0aW9uIiwidXZBIiwidXZCIiwidXZDIiwidXZJbnRlcnNlY3Rpb24iLCJmYWNlSW5kZXgiLCJpbnRlcnNlY3RzIiwiaW52ZXJzZU1hdHJpeCIsImNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNlY3Rpb24iLCJmdkIiLCJmdkMiLCJpc011bHRpTWF0ZXJpYWwiLCJmYWNlTWF0ZXJpYWwiLCJmdkEiLCJ0bCIsIm1vcnBoSW5mbHVlbmNlcyIsImluZmx1ZW5jZSIsInRlbXBBIiwidGFyZ2V0cyIsInRlbXBCIiwidGVtcEMiLCJ1dnNfZiIsInJlbmRlcmVyIiwicGxhbmVNZXNoIiwicmVuZGVyTGlzdCIsInNjZW5lIiwiZm9yY2VDbGVhciIsImJhY2tncm91bmQiLCJzZXRDbGVhciIsImNsZWFyQ29sb3IiLCJjbGVhckFscGhhIiwiYXV0b0NsZWFyIiwiYXV0b0NsZWFyQ29sb3IiLCJhdXRvQ2xlYXJEZXB0aCIsImF1dG9DbGVhclN0ZW5jaWwiLCJpc0N1YmVUZXh0dXJlIiwiYm94TWVzaCIsInBsYW5lQ2FtZXJhIiwicmVuZGVyQnVmZmVyRGlyZWN0IiwiZ2V0Q2xlYXJDb2xvciIsInNldENsZWFyQ29sb3IiLCJnZXRDbGVhckFscGhhIiwic2V0Q2xlYXJBbHBoYSIsInJlbmRlciIsImRyYXdBcnJheXMiLCJkcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUiLCJtYXhJbnN0YW5jZWRDb3VudCIsInNldE1vZGUiLCJyZW5kZXJJbnN0YW5jZXMiLCJtYXhBbmlzb3Ryb3B5IiwiTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUIiwiZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0IiwiVkVSVEVYX1NIQURFUiIsIkhJR0hfRkxPQVQiLCJGUkFHTUVOVF9TSEFERVIiLCJNRURJVU1fRkxPQVQiLCJnZXRNYXhQcmVjaXNpb24iLCJtYXhQcmVjaXNpb24iLCJsb2dhcml0aG1pY0RlcHRoQnVmZmVyIiwiTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMiLCJNQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMiLCJNQVhfVEVYVFVSRV9TSVpFIiwiTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSIsIk1BWF9WRVJURVhfQVRUUklCUyIsIk1BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTIiwiTUFYX1ZBUllJTkdfVkVDVE9SUyIsIk1BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlMiLCJtYXhWZXJ0ZXhUZXh0dXJlcyIsInZlcnRleFRleHR1cmVzIiwiZmxvYXRGcmFnbWVudFRleHR1cmVzIiwiZ2V0TWF4QW5pc290cm9weSIsIm1heFRleHR1cmVzIiwibWF4VGV4dHVyZVNpemUiLCJtYXhDdWJlbWFwU2l6ZSIsIm1heEF0dHJpYnV0ZXMiLCJtYXhWZXJ0ZXhVbmlmb3JtcyIsIm1heFZhcnlpbmdzIiwibWF4RnJhZ21lbnRVbmlmb3JtcyIsImZsb2F0VmVydGV4VGV4dHVyZXMiLCJnbG9iYWxTdGF0ZSIsIm51bUdsb2JhbFBsYW5lcyIsImxvY2FsQ2xpcHBpbmdFbmFibGVkIiwicmVuZGVyaW5nU2hhZG93cyIsInZpZXdOb3JtYWxNYXRyaXgiLCJ1bmlmb3JtIiwibnVtUGxhbmVzIiwibnVtSW50ZXJzZWN0aW9uIiwiaW5pdCIsImVuYWJsZUxvY2FsQ2xpcHBpbmciLCJwcm9qZWN0UGxhbmVzIiwiYmVnaW5TaGFkb3dzIiwiZW5kU2hhZG93cyIsInJlc2V0R2xvYmFsU3RhdGUiLCJzZXRTdGF0ZSIsImZyb21DYWNoZSIsImxHbG9iYWwiLCJuR2xvYmFsIiwiZHN0QXJyYXkiLCJjbGlwcGluZ1N0YXRlIiwic2tpcFRyYW5zZm9ybSIsIm5QbGFuZXMiLCJ2aWV3TWF0cml4IiwiZmxhdFNpemUiLCJpNCIsImdldEV4dGVuc2lvbiIsImJ1ZmZlcmdlb21ldHJ5Iiwib25HZW9tZXRyeURpc3Bvc2UiLCJ3aXJlZnJhbWVBdHRyaWJ1dGVzIiwibWVtb3J5IiwiX2J1ZmZlckdlb21ldHJ5IiwiRUxFTUVOVF9BUlJBWV9CVUZGRVIiLCJnZW9tZXRyeUF0dHJpYnV0ZXMiLCJBUlJBWV9CVUZGRVIiLCJnZW9tZXRyeUluZGV4IiwiZ2V0V2lyZWZyYW1lQXR0cmlidXRlIiwiZHJhd0VsZW1lbnRzIiwiZHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUiLCJmcmFtZSIsImNhbGxzIiwidHJpYW5nbGVzIiwibGluZXMiLCJpbnN0YW5jZUNvdW50IiwiVFJJQU5HTEVTIiwiVFJJQU5HTEVfU1RSSVAiLCJUUklBTkdMRV9GQU4iLCJMSU5FUyIsIkxJTkVfU1RSSVAiLCJMSU5FX0xPT1AiLCJQT0lOVFMiLCJwcm9ncmFtcyIsImF1dG9SZXNldCIsInByb2dyYW0iLCJvYmplY3RJbmZsdWVuY2VzIiwiaW5mbHVlbmNlc0xpc3QiLCJpbmZsdWVuY2VzIiwiYWJzTnVtZXJpY2FsU29ydCIsImdldFVuaWZvcm1zIiwic2V0VmFsdWUiLCJ1cGRhdGVMaXN0IiwiQ3ViZVJlZmxlY3Rpb25NYXBwaW5nIiwiQ3ViZVRleHR1cmUiLCJzZXEiLCJuQmxvY2tzIiwiYmxvY2tTaXplIiwiZmlyc3RFbGVtIiwiYXJyYXlDYWNoZUYzMiIsImFycmF5Q2FjaGVJMzIiLCJhbGxvY1RleHR1cmVVbml0IiwidW5pZm9ybTFmIiwiYWRkciIsInVuaWZvcm0xaSIsInVuaWZvcm0yZnYiLCJ1bmlmb3JtMmYiLCJ1bmlmb3JtM2YiLCJ1bmlmb3JtM2Z2IiwidW5pZm9ybTRmdiIsInVuaWZvcm00ZiIsInVuaWZvcm1NYXRyaXgyZnYiLCJ1bmlmb3JtTWF0cml4M2Z2IiwibWF0M2FycmF5IiwidW5pZm9ybU1hdHJpeDRmdiIsIm1hdDRhcnJheSIsInVuaXQiLCJzZXRUZXh0dXJlMkQiLCJlbXB0eVRleHR1cmUiLCJzZXRUZXh0dXJlQ3ViZSIsImVtcHR5Q3ViZVRleHR1cmUiLCJ1bmlmb3JtMml2IiwidW5pZm9ybTNpdiIsInVuaWZvcm00aXYiLCJ1bmlmb3JtMWZ2IiwidW5pZm9ybTFpdiIsImZsYXR0ZW4iLCJ1bml0cyIsImFsbG9jVGV4VW5pdHMiLCJhY3RpdmVJbmZvIiwiZ2V0U2luZ3VsYXJTZXR0ZXIiLCJnZXRQdXJlQXJyYXlTZXR0ZXIiLCJVbmlmb3JtQ29udGFpbmVyIiwiU3RydWN0dXJlZFVuaWZvcm0iLCJjb250YWluZXIiLCJ1bmlmb3JtT2JqZWN0IiwicGF0aExlbmd0aCIsInBhdGgiLCJSZVBhdGhQYXJ0IiwibGFzdEluZGV4IiwibWF0Y2hFbmQiLCJpZElzSW5kZXgiLCJzdWJzY3JpcHQiLCJhZGRVbmlmb3JtIiwiZ2V0UHJvZ3JhbVBhcmFtZXRlciIsIkFDVElWRV9VTklGT1JNUyIsImdldEFjdGl2ZVVuaWZvcm0iLCJnZXRVbmlmb3JtTG9jYXRpb24iLCJwYXJzZVVuaWZvcm0iLCJXZWJHTFVuaWZvcm1zIiwic2V0T3B0aW9uYWwiLCJ1cGxvYWQiLCJzZXFXaXRoVmFsdWUiLCJqb2luIiwiY3JlYXRlU2hhZGVyIiwic2hhZGVyU291cmNlIiwic2hhZGVyIiwiY29tcGlsZVNoYWRlciIsImdldFNoYWRlclBhcmFtZXRlciIsIkNPTVBJTEVfU1RBVFVTIiwiZ2V0U2hhZGVySW5mb0xvZyIsImFkZExpbmVOdW1iZXJzIiwiZnVuY3Rpb25OYW1lIiwiZ2V0RW5jb2RpbmdDb21wb25lbnRzIiwidG9uZU1hcHBpbmciLCJ0b25lTWFwcGluZ05hbWUiLCJyZW5kZXJlckV4dGVuc2lvbnMiLCJlbnZNYXBDdWJlVVYiLCJmaWx0ZXJFbXB0eUxpbmUiLCJjaHVua3MiLCJBQ1RJVkVfQVRUUklCVVRFUyIsImdldEFjdGl2ZUF0dHJpYiIsImdldEF0dHJpYkxvY2F0aW9uIiwicmVwbGFjZSIsIm51bURpckxpZ2h0cyIsIm51bVNwb3RMaWdodHMiLCJudW1SZWN0QXJlYUxpZ2h0cyIsIm51bVBvaW50TGlnaHRzIiwibnVtSGVtaUxpZ2h0cyIsIm51bUNsaXBwaW5nUGxhbmVzIiwibnVtQ2xpcEludGVyc2VjdGlvbiIsImluY2x1ZGUiLCJwYXR0ZXJuIiwic25pcHBldCIsInVucm9sbCIsImNvZGUiLCJzaGFkb3dNYXBUeXBlIiwiUENGU2hhZG93TWFwIiwic2hhZG93TWFwVHlwZURlZmluZSIsIlBDRlNvZnRTaGFkb3dNYXAiLCJlbnZNYXBUeXBlRGVmaW5lIiwiZW52TWFwTW9kZURlZmluZSIsImVudk1hcEJsZW5kaW5nRGVmaW5lIiwiZ2VuZXJhdGVFeHRlbnNpb25zIiwiZ2VuZXJhdGVEZWZpbmVzIiwiY3JlYXRlUHJvZ3JhbSIsInByZWZpeEZyYWdtZW50IiwiaXNSYXdTaGFkZXJNYXRlcmlhbCIsInByZWZpeFZlcnRleCIsImN1c3RvbURlZmluZXMiLCJjdXN0b21FeHRlbnNpb25zIiwic3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyIsImdhbW1hRmFjdG9yRGVmaW5lIiwibWF4Qm9uZXMiLCJ1c2VGb2ciLCJmb2dFeHAiLCJ1c2VWZXJ0ZXhUZXh0dXJlIiwiZG91YmxlU2lkZWQiLCJmbGlwU2lkZWQiLCJzaGFkb3dNYXBFbmFibGVkIiwicGh5c2ljYWxseUNvcnJlY3RMaWdodHMiLCJOb1RvbmVNYXBwaW5nIiwiZ2V0VG9uZU1hcHBpbmdGdW5jdGlvbiIsIm91dHB1dEVuY29kaW5nIiwibWFwRW5jb2RpbmciLCJlbnZNYXBFbmNvZGluZyIsImVtaXNzaXZlTWFwRW5jb2RpbmciLCJnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24iLCJnZXRUZXhlbEVuY29kaW5nRnVuY3Rpb24iLCJkZXB0aFBhY2tpbmciLCJwYXJzZUluY2x1ZGVzIiwicmVwbGFjZUxpZ2h0TnVtcyIsInJlcGxhY2VDbGlwcGluZ1BsYW5lTnVtcyIsInVucm9sbExvb3BzIiwiV2ViR0xTaGFkZXIiLCJ2ZXJ0ZXhHbHNsIiwiZnJhZ21lbnRHbHNsIiwiYXR0YWNoU2hhZGVyIiwiZ2xWZXJ0ZXhTaGFkZXIiLCJnbEZyYWdtZW50U2hhZGVyIiwiYmluZEF0dHJpYkxvY2F0aW9uIiwibGlua1Byb2dyYW0iLCJnZXRQcm9ncmFtSW5mb0xvZyIsInRyaW0iLCJMSU5LX1NUQVRVUyIsInJ1bm5hYmxlIiwiZ2V0RXJyb3IiLCJWQUxJREFURV9TVEFUVVMiLCJwcm9ncmFtTG9nIiwidmVydGV4TG9nIiwiZnJhZ21lbnRMb2ciLCJoYXZlRGlhZ25vc3RpY3MiLCJkaWFnbm9zdGljcyIsInByZWZpeCIsImRlbGV0ZVNoYWRlciIsImNhY2hlZFVuaWZvcm1zIiwiZ2V0QXR0cmlidXRlcyIsImNhY2hlZEF0dHJpYnV0ZXMiLCJmZXRjaEF0dHJpYnV0ZUxvY2F0aW9ucyIsImRlc3Ryb3kiLCJkZWxldGVQcm9ncmFtIiwicHJvZ3JhbUlkQ291bnQiLCJ1c2VkVGltZXMiLCJjYXBhYmlsaXRpZXMiLCJNZXNoRGVwdGhNYXRlcmlhbCIsIk1lc2hEaXN0YW5jZU1hdGVyaWFsIiwiTWVzaE5vcm1hbE1hdGVyaWFsIiwiTWVzaExhbWJlcnRNYXRlcmlhbCIsIk1lc2hQaG9uZ01hdGVyaWFsIiwiTWVzaFRvb25NYXRlcmlhbCIsIk1lc2hTdGFuZGFyZE1hdGVyaWFsIiwiTWVzaFBoeXNpY2FsTWF0ZXJpYWwiLCJMaW5lQmFzaWNNYXRlcmlhbCIsIkxpbmVEYXNoZWRNYXRlcmlhbCIsIlBvaW50c01hdGVyaWFsIiwiU2hhZG93TWF0ZXJpYWwiLCJza2VsZXRvbiIsImJvbmVzIiwiblZlcnRleFVuaWZvcm1zIiwiblZlcnRleE1hdHJpY2VzIiwiZ2FtbWFPdmVycmlkZUxpbmVhciIsIkdhbW1hRW5jb2RpbmciLCJnZXRQYXJhbWV0ZXJzIiwic2hhZG93cyIsIm5DbGlwUGxhbmVzIiwibkNsaXBJbnRlcnNlY3Rpb24iLCJzaGFkZXJJRHMiLCJpc1NraW5uZWRNZXNoIiwiYWxsb2NhdGVCb25lcyIsImdldFJlbmRlclRhcmdldCIsInNoYWRlcklEIiwiZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCIsImN1cnJlbnRSZW5kZXJUYXJnZXQiLCJnYW1tYU91dHB1dCIsImdhbW1hSW5wdXQiLCJlbnZNYXBNb2RlIiwiQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmciLCJDdWJlVVZSZWZyYWN0aW9uTWFwcGluZyIsImlzRm9nRXhwMiIsIm1heE1vcnBoVGFyZ2V0cyIsIm1heE1vcnBoTm9ybWFscyIsImRpcmVjdGlvbmFsIiwic3BvdCIsInJlY3RBcmVhIiwiaGVtaSIsInNoYWRvd01hcCIsImdldFByb2dyYW1Db2RlIiwicGFyYW1ldGVyTmFtZXMiLCJhY3F1aXJlUHJvZ3JhbSIsInBsIiwicHJvZ3JhbUluZm8iLCJyZWxlYXNlUHJvZ3JhbSIsInJlbmRlckl0ZW1zSW5kZXgiLCJvcGFxdWUiLCJyZW5kZXJJdGVtcyIsInJlbmRlckl0ZW0iLCJwYWludGVyU29ydFN0YWJsZSIsInJldmVyc2VQYWludGVyU29ydFN0YWJsZSIsImxpc3RzIiwibGlzdCIsImxpZ2h0IiwiaGFsZldpZHRoIiwiaGFsZkhlaWdodCIsImFtYmllbnQiLCJpbnRlbnNpdHkiLCJpc0FtYmllbnRMaWdodCIsImlzRGlyZWN0aW9uYWxMaWdodCIsInZlY3RvcjMiLCJiaWFzIiwibWFwU2l6ZSIsImRpcmVjdGlvbmFsTGVuZ3RoIiwiaXNTcG90TGlnaHQiLCJwZW51bWJyYSIsInNwb3RMZW5ndGgiLCJpc1JlY3RBcmVhTGlnaHQiLCJtYXRyaXg0MiIsInJlY3RBcmVhTGVuZ3RoIiwiaXNQb2ludExpZ2h0IiwicG9pbnRMZW5ndGgiLCJpc0hlbWlzcGhlcmVMaWdodCIsImhlbWlMZW5ndGgiLCJzZXR1cCIsImxpZ2h0c0FycmF5Iiwic2hhZG93c0FycmF5Iiwic3ByaXRlc0FycmF5Iiwic2hhZG93TGlnaHQiLCJzZXR1cExpZ2h0cyIsInB1c2hMaWdodCIsInB1c2hTaGFkb3ciLCJwdXNoU3ByaXRlIiwicmVuZGVyU3RhdGVzIiwicmVuZGVyU3RhdGUiLCJCYXNpY0RlcHRoUGFja2luZyIsImlzTWVzaERlcHRoTWF0ZXJpYWwiLCJpc01lc2hEaXN0YW5jZU1hdGVyaWFsIiwiX3JlbmRlcmVyIiwiX29iamVjdHMiLCJfcHJvalNjcmVlbk1hdHJpeCIsIl9zaGFkb3dNYXBTaXplIiwiX21heFNoYWRvd01hcFNpemUiLCJfbG9va1RhcmdldCIsIl9saWdodFBvc2l0aW9uV29ybGQiLCJfTW9ycGhpbmdGbGFnIiwiX1NraW5uaW5nRmxhZyIsIl9OdW1iZXJPZk1hdGVyaWFsVmFyaWFudHMiLCJfZGVwdGhNYXRlcmlhbHMiLCJfZGlzdGFuY2VNYXRlcmlhbHMiLCJfbWF0ZXJpYWxDYWNoZSIsIlJHQkFEZXB0aFBhY2tpbmciLCJ1c2VNb3JwaGluZyIsInVzZVNraW5uaW5nIiwiZGVwdGhNYXRlcmlhbCIsImRpc3RhbmNlTWF0ZXJpYWwiLCJhdXRvVXBkYXRlIiwiX3N0YXRlIiwiX2dsIiwiQkxFTkQiLCJzZXRUZXN0Iiwic2V0U2Npc3NvclRlc3QiLCJjdWJlMkRWaWV3UG9ydHMiLCJ2cFdpZHRoIiwidnBIZWlnaHQiLCJwYXJzIiwic2hhZG93Q2FtZXJhIiwiaXNTcG90TGlnaHRTaGFkb3ciLCJmYWNlQ291bnQiLCJzaGFkb3dNYXRyaXgiLCJzZXRSZW5kZXJUYXJnZXQiLCJjdWJlRGlyZWN0aW9ucyIsImN1YmVVcHMiLCJ2cERpbWVuc2lvbnMiLCJfZnJ1c3R1bSIsInJlbmRlck9iamVjdCIsImxpZ2h0UG9zaXRpb25Xb3JsZCIsImN1c3RvbURlcHRoTWF0ZXJpYWwiLCJtYXRlcmlhbFZhcmlhbnRzIiwiY3VzdG9tTWF0ZXJpYWwiLCJjdXN0b21EaXN0YW5jZU1hdGVyaWFsIiwidmFyaWFudEluZGV4Iiwia2V5QiIsImtleUEiLCJtYXRlcmlhbHNGb3JWYXJpYW50IiwiY2FjaGVkTWF0ZXJpYWwiLCJncm91cE1hdGVyaWFsIiwiZ2V0RGVwdGhNYXRlcmlhbCIsIkNhbnZhc1RleHR1cmUiLCJlbGVtZW50QnVmZmVyIiwidmVydGV4QnVmZmVyIiwidXZPZmZzZXQiLCJ1dlNjYWxlIiwiZm9nVHlwZSIsImZvZ0RlcHRoIiwiZmlsbFN0eWxlIiwiZmlsbFJlY3QiLCJzcHJpdGVzIiwidXNlUHJvZ3JhbSIsImluaXRBdHRyaWJ1dGVzIiwiZW5hYmxlQXR0cmlidXRlIiwiZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMiLCJDVUxMX0ZBQ0UiLCJ2ZXJ0ZXhBdHRyaWJQb2ludGVyIiwiYWN0aXZlVGV4dHVyZSIsIlRFWFRVUkUwIiwiaXNGb2ciLCJvbGRGb2dUeXBlIiwic2NlbmVGb2dUeXBlIiwiZGVuc2l0eSIsInNwcml0ZVBvc2l0aW9uIiwic3ByaXRlUm90YXRpb24iLCJzcHJpdGVTY2FsZSIsInNldEJsZW5kaW5nIiwic2V0TWFzayIsInV0aWxzIiwiY29sb3JNYXNrIiwiY3VycmVudENvbG9yTWFzayIsImxvY2tlZCIsInNldExvY2tlZCIsImxvY2siLCJjdXJyZW50Q29sb3JDbGVhciIsIkRFUFRIX1RFU1QiLCJkZXB0aE1hc2siLCJjdXJyZW50RGVwdGhNYXNrIiwic2V0RnVuYyIsImN1cnJlbnREZXB0aEZ1bmMiLCJORVZFUiIsIkFMV0FZUyIsIkxFU1MiLCJMRVFVQUwiLCJFUVVBTCIsIkdFUVVBTCIsIkdSRUFURVIiLCJOT1RFUVVBTCIsImN1cnJlbnREZXB0aENsZWFyIiwiY2xlYXJEZXB0aCIsInN0ZW5jaWxUZXN0IiwiU1RFTkNJTF9URVNUIiwic3RlbmNpbE1hc2siLCJjdXJyZW50U3RlbmNpbE1hc2siLCJzdGVuY2lsRnVuYyIsInN0ZW5jaWxSZWYiLCJjdXJyZW50U3RlbmNpbEZ1bmMiLCJjdXJyZW50U3RlbmNpbFJlZiIsImN1cnJlbnRTdGVuY2lsRnVuY01hc2siLCJzZXRPcCIsInN0ZW5jaWxGYWlsIiwic3RlbmNpbFpGYWlsIiwic3RlbmNpbFpQYXNzIiwiY3VycmVudFN0ZW5jaWxGYWlsIiwiY3VycmVudFN0ZW5jaWxaRmFpbCIsImN1cnJlbnRTdGVuY2lsWlBhc3MiLCJzdGVuY2lsT3AiLCJzdGVuY2lsIiwiY3VycmVudFN0ZW5jaWxDbGVhciIsImNsZWFyU3RlbmNpbCIsIm1heFZlcnRleEF0dHJpYnV0ZXMiLCJNQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUyIsIlZFUlNJT04iLCJnbFZlcnNpb24iLCJsaW5lV2lkdGhBdmFpbGFibGUiLCJjcmVhdGVUZXh0dXJlIiwiYmluZFRleHR1cmUiLCJ0ZXhQYXJhbWV0ZXJpIiwiVEVYVFVSRV9NSU5fRklMVEVSIiwiTkVBUkVTVCIsIlRFWFRVUkVfTUFHX0ZJTFRFUiIsInRleEltYWdlMkQiLCJSR0JBIiwiZW1wdHlUZXh0dXJlcyIsIlRFWFRVUkVfMkQiLCJURVhUVVJFX0NVQkVfTUFQIiwiVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YIiwiY29sb3JCdWZmZXIiLCJzZXRGbGlwU2lkZWQiLCJzZXRDdWxsRmFjZSIsIkN1bGxGYWNlQmFjayIsIm5ld0F0dHJpYnV0ZXMiLCJlbmFibGVkQXR0cmlidXRlcyIsImVuYWJsZVZlcnRleEF0dHJpYkFycmF5IiwiYXR0cmlidXRlRGl2aXNvcnMiLCJ2ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUiLCJtZXNoUGVyQXR0cmlidXRlIiwiZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5IiwiY29tcHJlc3NlZFRleHR1cmVGb3JtYXRzIiwiQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMiLCJmb3JtYXRzIiwiY3VycmVudFByb2dyYW0iLCJOb0JsZW5kaW5nIiwiQ3VzdG9tQmxlbmRpbmciLCJjdXJyZW50QmxlbmRpbmciLCJjdXJyZW50UHJlbXVsdGlwbGVkQWxwaGEiLCJibGVuZEVxdWF0aW9uU2VwYXJhdGUiLCJGVU5DX0FERCIsImJsZW5kRnVuY1NlcGFyYXRlIiwiT05FIiwiYmxlbmRGdW5jIiwiU1JDX0FMUEhBIiwiWkVSTyIsIk9ORV9NSU5VU19TUkNfQ09MT1IiLCJPTkVfTUlOVVNfU1JDX0FMUEhBIiwiU1JDX0NPTE9SIiwiY3VycmVudEJsZW5kRXF1YXRpb24iLCJjdXJyZW50QmxlbmRTcmMiLCJjdXJyZW50QmxlbmREc3QiLCJjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhIiwiY3VycmVudEJsZW5kU3JjQWxwaGEiLCJjdXJyZW50QmxlbmREc3RBbHBoYSIsImNvbnZlcnQiLCJmcm9udEZhY2VDVyIsInNldFBvbHlnb25PZmZzZXQiLCJjdXJyZW50RmxpcFNpZGVkIiwiZnJvbnRGYWNlIiwiQ1ciLCJDQ1ciLCJjdWxsRmFjZSIsIkN1bGxGYWNlTm9uZSIsImN1cnJlbnRDdWxsRmFjZSIsIkJBQ0siLCJDdWxsRmFjZUZyb250IiwiRlJPTlQiLCJGUk9OVF9BTkRfQkFDSyIsImN1cnJlbnRMaW5lV2lkdGgiLCJsaW5lV2lkdGgiLCJmYWN0b3IiLCJQT0xZR09OX09GRlNFVF9GSUxMIiwiY3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IiLCJjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzIiwiU0NJU1NPUl9URVNUIiwid2ViZ2xTbG90IiwiY3VycmVudFRleHR1cmVTbG90Iiwid2ViZ2xUeXBlIiwid2ViZ2xUZXh0dXJlIiwiY3VycmVudEJvdW5kVGV4dHVyZXMiLCJib3VuZFRleHR1cmUiLCJjb21wcmVzc2VkVGV4SW1hZ2UyRCIsImN1cnJlbnRTY2lzc29yIiwiY3VycmVudFZpZXdwb3J0IiwiZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciIsImdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyIsInNldE1hdGVyaWFsIiwic2V0TGluZVdpZHRoIiwibWF4U2l6ZSIsIl9jYW52YXMiLCJnZW5lcmF0ZU1pcG1hcCIsInRleHR1cmVQcm9wZXJ0aWVzIiwiX19tYXhNaXBMZXZlbCIsIkxPRzJFIiwiTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIiLCJOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyIiwiTElORUFSIiwib25UZXh0dXJlRGlzcG9zZSIsImRlYWxsb2NhdGVUZXh0dXJlIiwiaXNWaWRlb1RleHR1cmUiLCJyZW5kZXJUYXJnZXQiLCJvblJlbmRlclRhcmdldERpc3Bvc2UiLCJkZWFsbG9jYXRlUmVuZGVyVGFyZ2V0IiwiX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSIsImRlbGV0ZVRleHR1cmUiLCJfX3dlYmdsSW5pdCIsIl9fd2ViZ2xUZXh0dXJlIiwiZGVsZXRlRnJhbWVidWZmZXIiLCJyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzIiwiX193ZWJnbEZyYW1lYnVmZmVyIiwiX193ZWJnbERlcHRoYnVmZmVyIiwiZGVsZXRlUmVuZGVyYnVmZmVyIiwic2xvdCIsInVwZGF0ZVZpZGVvVGV4dHVyZSIsIl9fdmVyc2lvbiIsInVwbG9hZFRleHR1cmUiLCJwaXhlbFN0b3JlaSIsIlVOUEFDS19GTElQX1lfV0VCR0wiLCJpc0NvbXByZXNzZWRUZXh0dXJlIiwiaXNDb21wcmVzc2VkIiwiY3ViZUltYWdlIiwiY2xhbXBUb01heFNpemUiLCJpc1Bvd2VyT2ZUd29JbWFnZSIsImdsRm9ybWF0IiwiZ2xUeXBlIiwic2V0VGV4dHVyZVBhcmFtZXRlcnMiLCJtaXBtYXAiLCJSR0JGb3JtYXQiLCJ0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMiLCJ0ZXh0dXJlVHlwZSIsIlRFWFRVUkVfV1JBUF9TIiwiVEVYVFVSRV9XUkFQX1QiLCJDTEFNUF9UT19FREdFIiwiZmlsdGVyRmFsbGJhY2siLCJGbG9hdFR5cGUiLCJIYWxmRmxvYXRUeXBlIiwiX19jdXJyZW50QW5pc290cm9weSIsInRleFBhcmFtZXRlcmYiLCJURVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCIsIlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCIsIlVOUEFDS19BTElHTk1FTlQiLCJ0ZXh0dXJlTmVlZHNQb3dlck9mVHdvIiwibWFrZVBvd2VyT2ZUd28iLCJpc0RlcHRoVGV4dHVyZSIsIkRFUFRIX0NPTVBPTkVOVCIsIl9pc1dlYkdMMiIsImludGVybmFsRm9ybWF0IiwiREVQVEhfQ09NUE9ORU5UMzJGIiwiREVQVEhfQ09NUE9ORU5UMTYiLCJEZXB0aEZvcm1hdCIsIlVuc2lnbmVkU2hvcnRUeXBlIiwiVW5zaWduZWRJbnRUeXBlIiwiRGVwdGhTdGVuY2lsRm9ybWF0IiwiREVQVEhfU1RFTkNJTCIsIlVuc2lnbmVkSW50MjQ4VHlwZSIsImZyYW1lYnVmZmVyIiwiYXR0YWNobWVudCIsInRleHR1cmVUYXJnZXQiLCJiaW5kRnJhbWVidWZmZXIiLCJGUkFNRUJVRkZFUiIsImZyYW1lYnVmZmVyVGV4dHVyZTJEIiwicmVuZGVyYnVmZmVyIiwiYmluZFJlbmRlcmJ1ZmZlciIsIlJFTkRFUkJVRkZFUiIsInJlbmRlcmJ1ZmZlclN0b3JhZ2UiLCJmcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciIsIkRFUFRIX0FUVEFDSE1FTlQiLCJERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQiLCJSR0JBNCIsImlzQ3ViZSIsIndlYmdsRGVwdGhUZXh0dXJlIiwic2V0dXBEZXB0aFRleHR1cmUiLCJjcmVhdGVSZW5kZXJidWZmZXIiLCJzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UiLCJjcmVhdGVGcmFtZWJ1ZmZlciIsImlzVGFyZ2V0UG93ZXJPZlR3byIsInNldHVwRnJhbWVCdWZmZXJUZXh0dXJlIiwiQ09MT1JfQVRUQUNITUVOVDAiLCJzZXR1cERlcHRoUmVuZGVyYnVmZmVyIiwiX3ZpZGVvVGV4dHVyZXMiLCJzZXRUZXh0dXJlQ3ViZUR5bmFtaWMiLCJzZXR1cFJlbmRlclRhcmdldCIsInVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCIsIlJlcGVhdFdyYXBwaW5nIiwiUkVQRUFUIiwiTWlycm9yZWRSZXBlYXRXcmFwcGluZyIsIk1JUlJPUkVEX1JFUEVBVCIsIk5FQVJFU1RfTUlQTUFQX05FQVJFU1QiLCJORUFSRVNUX01JUE1BUF9MSU5FQVIiLCJMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyIiwiTElORUFSX01JUE1BUF9ORUFSRVNUIiwiTElORUFSX01JUE1BUF9MSU5FQVIiLCJVbnNpZ25lZFNob3J0NDQ0NFR5cGUiLCJVTlNJR05FRF9TSE9SVF80XzRfNF80IiwiVW5zaWduZWRTaG9ydDU1NTFUeXBlIiwiVU5TSUdORURfU0hPUlRfNV81XzVfMSIsIlVuc2lnbmVkU2hvcnQ1NjVUeXBlIiwiVU5TSUdORURfU0hPUlRfNV82XzUiLCJCeXRlVHlwZSIsIlNob3J0VHlwZSIsIkludFR5cGUiLCJIQUxGX0ZMT0FUX09FUyIsIkFscGhhRm9ybWF0IiwiQUxQSEEiLCJSR0IiLCJMdW1pbmFuY2VGb3JtYXQiLCJMVU1JTkFOQ0UiLCJMdW1pbmFuY2VBbHBoYUZvcm1hdCIsIkxVTUlOQU5DRV9BTFBIQSIsIlN1YnRyYWN0RXF1YXRpb24iLCJGVU5DX1NVQlRSQUNUIiwiUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24iLCJGVU5DX1JFVkVSU0VfU1VCVFJBQ1QiLCJaZXJvRmFjdG9yIiwiT25lRmFjdG9yIiwiU3JjQ29sb3JGYWN0b3IiLCJPbmVNaW51c1NyY0NvbG9yRmFjdG9yIiwiRHN0QWxwaGFGYWN0b3IiLCJEU1RfQUxQSEEiLCJPbmVNaW51c0RzdEFscGhhRmFjdG9yIiwiT05FX01JTlVTX0RTVF9BTFBIQSIsIkRzdENvbG9yRmFjdG9yIiwiRFNUX0NPTE9SIiwiT25lTWludXNEc3RDb2xvckZhY3RvciIsIk9ORV9NSU5VU19EU1RfQ09MT1IiLCJTcmNBbHBoYVNhdHVyYXRlRmFjdG9yIiwiU1JDX0FMUEhBX1NBVFVSQVRFIiwiUkdCX1MzVENfRFhUMV9Gb3JtYXQiLCJSR0JBX1MzVENfRFhUMV9Gb3JtYXQiLCJSR0JBX1MzVENfRFhUM19Gb3JtYXQiLCJSR0JBX1MzVENfRFhUNV9Gb3JtYXQiLCJDT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUIiwiQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQiLCJDT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVCIsIkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUIiwiUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQiLCJSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCIsIlJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdCIsIlJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCIsIkNPTVBSRVNTRURfUkdCX1BWUlRDXzRCUFBWMV9JTUciLCJDT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HIiwiQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzRCUFBWMV9JTUciLCJDT01QUkVTU0VEX1JHQkFfUFZSVENfMkJQUFYxX0lNRyIsIlJHQl9FVEMxX0Zvcm1hdCIsIkNPTVBSRVNTRURfUkdCX0VUQzFfV0VCR0wiLCJSR0JBX0FTVENfNHg0X0Zvcm1hdCIsIlJHQkFfQVNUQ181eDRfRm9ybWF0IiwiUkdCQV9BU1RDXzV4NV9Gb3JtYXQiLCJSR0JBX0FTVENfNng1X0Zvcm1hdCIsIlJHQkFfQVNUQ182eDZfRm9ybWF0IiwiUkdCQV9BU1RDXzh4NV9Gb3JtYXQiLCJSR0JBX0FTVENfOHg2X0Zvcm1hdCIsIlJHQkFfQVNUQ184eDhfRm9ybWF0IiwiUkdCQV9BU1RDXzEweDVfRm9ybWF0IiwiUkdCQV9BU1RDXzEweDZfRm9ybWF0IiwiUkdCQV9BU1RDXzEweDhfRm9ybWF0IiwiUkdCQV9BU1RDXzEweDEwX0Zvcm1hdCIsIlJHQkFfQVNUQ18xMngxMF9Gb3JtYXQiLCJSR0JBX0FTVENfMTJ4MTJfRm9ybWF0IiwiTWluRXF1YXRpb24iLCJNYXhFcXVhdGlvbiIsIk1JTl9FWFQiLCJNQVhfRVhUIiwiVU5TSUdORURfSU5UXzI0XzhfV0VCR0wiLCJmb3YiLCJhc3BlY3QiLCJmb2N1cyIsImZpbG1HYXVnZSIsImZpbG1PZmZzZXQiLCJQZXJzcGVjdGl2ZUNhbWVyYSIsImlzUGVyc3BlY3RpdmVDYW1lcmEiLCJzZXRGb2NhbExlbmd0aCIsImZvY2FsTGVuZ3RoIiwiZ2V0RmlsbUhlaWdodCIsImF0YW4iLCJ2RXh0ZW50U2xvcGUiLCJnZXRGb2NhbExlbmd0aCIsInRhbiIsImdldEVmZmVjdGl2ZUZPViIsImdldEZpbG1XaWR0aCIsInNrZXciLCJjYW1lcmFzIiwiQXJyYXlDYW1lcmEiLCJpc0FycmF5Q2FtZXJhIiwiZnJhbWVEYXRhIiwiVlJGcmFtZURhdGEiLCJvblZSRGlzcGxheVByZXNlbnRDaGFuZ2UiLCJjYW1lcmFMIiwiYm91bmRzIiwiY2FtZXJhUiIsImNhbWVyYVZSIiwiZGV2aWNlIiwiaXNQcmVzZW50aW5nIiwiY3VycmVudFBpeGVsUmF0aW8iLCJnZXRFeWVQYXJhbWV0ZXJzIiwiZXllUGFyYW1ldGVycyIsInJlbmRlcldpZHRoIiwicmVuZGVySGVpZ2h0IiwiZ2V0UGl4ZWxSYXRpbyIsImN1cnJlbnRTaXplIiwic2V0RHJhd2luZ0J1ZmZlclNpemUiLCJ1c2VySGVpZ2h0IiwiZ2V0RGV2aWNlIiwic2V0RGV2aWNlIiwic2V0UG9zZVRhcmdldCIsInBvc2VUYXJnZXQiLCJnZXRDYW1lcmEiLCJkZXB0aE5lYXIiLCJkZXB0aEZhciIsImdldEZyYW1lRGF0YSIsInN0YWdlUGFyYW1ldGVycyIsInN0YW5kaW5nTWF0cml4Iiwic2l0dGluZ1RvU3RhbmRpbmdUcmFuc2Zvcm0iLCJwb3NlIiwicG9zZU9iamVjdCIsIm9yaWVudGF0aW9uIiwidGVtcFF1YXRlcm5pb24iLCJ0ZW1wUG9zaXRpb24iLCJsZWZ0Vmlld01hdHJpeCIsInJpZ2h0Vmlld01hdHJpeCIsInN0YW5kaW5nTWF0cml4SW52ZXJzZSIsImxlZnRQcm9qZWN0aW9uTWF0cml4IiwicmlnaHRQcm9qZWN0aW9uTWF0cml4IiwiZ2V0TGF5ZXJzIiwibGF5ZXIiLCJsZWZ0Qm91bmRzIiwicmlnaHRCb3VuZHMiLCJnZXRTdGFuZGluZ01hdHJpeCIsInN1Ym1pdEZyYW1lIiwiUkVWSVNJT04iLCJfY29udGV4dCIsIl9hbHBoYSIsIl9kZXB0aCIsIl9zdGVuY2lsIiwiX2FudGlhbGlhcyIsImFudGlhbGlhcyIsIl9wcmVtdWx0aXBsaWVkQWxwaGEiLCJfcHJlc2VydmVEcmF3aW5nQnVmZmVyIiwicHJlc2VydmVEcmF3aW5nQnVmZmVyIiwiX3Bvd2VyUHJlZmVyZW5jZSIsInBvd2VyUHJlZmVyZW5jZSIsImRvbUVsZW1lbnQiLCJzb3J0T2JqZWN0cyIsIkxpbmVhclRvbmVNYXBwaW5nIiwidG9uZU1hcHBpbmdFeHBvc3VyZSIsInRvbmVNYXBwaW5nV2hpdGVQb2ludCIsIl9pc0NvbnRleHRMb3N0IiwiX2N1cnJlbnRSZW5kZXJUYXJnZXQiLCJfY3VycmVudEZyYW1lYnVmZmVyIiwiX2N1cnJlbnRNYXRlcmlhbElkIiwiX2N1cnJlbnRHZW9tZXRyeVByb2dyYW0iLCJfY3VycmVudENhbWVyYSIsIl9jdXJyZW50QXJyYXlDYW1lcmEiLCJfY3VycmVudFZpZXdwb3J0IiwiX2N1cnJlbnRTY2lzc29yIiwiX2N1cnJlbnRTY2lzc29yVGVzdCIsIl91c2VkVGV4dHVyZVVuaXRzIiwiX3dpZHRoIiwiX2hlaWdodCIsIl9waXhlbFJhdGlvIiwiX3ZpZXdwb3J0IiwiX3NjaXNzb3IiLCJfc2Npc3NvclRlc3QiLCJfY2xpcHBpbmciLCJfY2xpcHBpbmdFbmFibGVkIiwiX2xvY2FsQ2xpcHBpbmdFbmFibGVkIiwiX3ZlY3RvcjMiLCJvbkNvbnRleHRMb3N0Iiwib25Db250ZXh0UmVzdG9yZSIsImNvbnRleHRBdHRyaWJ1dGVzIiwibWVzc2FnZSIsIm9iamVjdHMiLCJyZW5kZXJMaXN0cyIsIm1vcnBodGFyZ2V0cyIsImJ1ZmZlclJlbmRlcmVyIiwiaW5kZXhlZEJ1ZmZlclJlbmRlcmVyIiwicHJvZ3JhbUNhY2hlIiwiX3RoaXMiLCJzcHJpdGVSZW5kZXJlciIsImluaXRHTENvbnRleHQiLCJ2ciIsImdldENvbnRleHRBdHRyaWJ1dGVzIiwiZm9yY2VDb250ZXh0TG9zcyIsImxvc2VDb250ZXh0IiwiZm9yY2VDb250ZXh0UmVzdG9yZSIsInJlc3RvcmVDb250ZXh0Iiwic2V0UGl4ZWxSYXRpbyIsInVwZGF0ZVN0eWxlIiwic2V0Vmlld3BvcnQiLCJnZXREcmF3aW5nQnVmZmVyU2l6ZSIsInBpeGVsUmF0aW8iLCJnZXRDdXJyZW50Vmlld3BvcnQiLCJzZXRTY2lzc29yIiwiYm9vbGVhbiIsImJpdHMiLCJDT0xPUl9CVUZGRVJfQklUIiwiREVQVEhfQlVGRkVSX0JJVCIsIlNURU5DSUxfQlVGRkVSX0JJVCIsImNsZWFyVGFyZ2V0Iiwic3RvcEFuaW1hdGlvbiIsInByZXZlbnREZWZhdWx0Iiwib25NYXRlcmlhbERpc3Bvc2UiLCJkZWFsbG9jYXRlTWF0ZXJpYWwiLCJyZWxlYXNlTWF0ZXJpYWxQcm9ncmFtUmVmZXJlbmNlIiwicmVuZGVyQnVmZmVySW1tZWRpYXRlIiwiaGFzUG9zaXRpb25zIiwiaGFzTm9ybWFscyIsImhhc1V2cyIsImhhc0NvbG9ycyIsInBvc2l0aW9uQXJyYXkiLCJwcm9ncmFtQXR0cmlidXRlcyIsImlzTWVzaFBob25nTWF0ZXJpYWwiLCJpc01lc2hTdGFuZGFyZE1hdGVyaWFsIiwiaXNNZXNoTm9ybWFsTWF0ZXJpYWwiLCJub3JtYWxBcnJheSIsIm54IiwibnkiLCJueiIsInV2QXJyYXkiLCJjb2xvckFycmF5Iiwic2V0UHJvZ3JhbSIsImdlb21ldHJ5UHJvZ3JhbSIsInVwZGF0ZUJ1ZmZlcnMiLCJyYW5nZUZhY3RvciIsInNldHVwVmVydGV4QXR0cmlidXRlcyIsImRhdGFDb3VudCIsInJhbmdlU3RhcnQiLCJyYW5nZUNvdW50IiwiZHJhd0VuZCIsImRyYXdTdGFydCIsImRyYXdDb3VudCIsImdldFRhcmdldFBpeGVsUmF0aW8iLCJpc0xpbmVTZWdtZW50cyIsImlzTGluZUxvb3AiLCJpc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IiwicHJvZ3JhbUF0dHJpYnV0ZSIsImdlb21ldHJ5QXR0cmlidXRlIiwic3RyaWRlIiwiaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciIsImlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlIiwibWF0ZXJpYWxEZWZhdWx0QXR0cmlidXRlVmFsdWVzIiwidmVydGV4QXR0cmliMmZ2IiwidmVydGV4QXR0cmliM2Z2IiwidmVydGV4QXR0cmliNGZ2IiwidmVydGV4QXR0cmliMWZ2IiwiY29tcGlsZSIsImN1cnJlbnRSZW5kZXJTdGF0ZSIsImlzTGlnaHQiLCJpbml0TWF0ZXJpYWwiLCJpc0FuaW1hdGluZyIsInJlcXVlc3RBbmltYXRpb25Mb29wRnJhbWUiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJhbmltYXRpb25Mb29wIiwidGltZSIsIm9uQW5pbWF0aW9uRnJhbWUiLCJhbmltYXRlIiwic3RhcnRBbmltYXRpb24iLCJjdXJyZW50UmVuZGVyTGlzdCIsInByb2plY3RPYmplY3QiLCJvdmVycmlkZU1hdGVyaWFsIiwib3BhcXVlT2JqZWN0cyIsInJlbmRlck9iamVjdHMiLCJ0cmFuc3BhcmVudE9iamVjdHMiLCJpc1Nwcml0ZSIsImlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0IiwiY2FtZXJhMiIsInJlbmRlck9iamVjdEltbWVkaWF0ZSIsIm1hdGVyaWFsUHJvcGVydGllcyIsImxpZ2h0c0hhc2giLCJwcm9ncmFtQ2hhbmdlIiwibnVtU3VwcG9ydGVkTW9ycGhUYXJnZXRzIiwibnVtU3VwcG9ydGVkTW9ycGhOb3JtYWxzIiwidW5pZm9ybXNMaXN0IiwicHJvZ1VuaWZvcm1zIiwidXNlQ2FjaGUiLCJwX3VuaWZvcm1zIiwibV91bmlmb3JtcyIsInJlZnJlc2hQcm9ncmFtIiwicmVmcmVzaE1hdGVyaWFsIiwicmVmcmVzaExpZ2h0cyIsImNhbWVyYVBvc2l0aW9uIiwidUNhbVBvcyIsImlzTWVzaExhbWJlcnRNYXRlcmlhbCIsImJvbmVUZXh0dXJlIiwiYm9uZU1hdHJpY2VzIiwiYm9uZVRleHR1cmVTaXplIiwibWFya1VuaWZvcm1zTGlnaHRzTmVlZHNVcGRhdGUiLCJyZWZyZXNoVW5pZm9ybXNGb2ciLCJyZWZyZXNoVW5pZm9ybXNDb21tb24iLCJyZWZyZXNoVW5pZm9ybXNMYW1iZXJ0IiwiaXNNZXNoVG9vbk1hdGVyaWFsIiwicmVmcmVzaFVuaWZvcm1zVG9vbiIsInJlZnJlc2hVbmlmb3Jtc1Bob25nIiwiaXNNZXNoUGh5c2ljYWxNYXRlcmlhbCIsInJlZnJlc2hVbmlmb3Jtc1BoeXNpY2FsIiwicmVmcmVzaFVuaWZvcm1zU3RhbmRhcmQiLCJyZWZyZXNoVW5pZm9ybXNEZXB0aCIsInJlZnJlc2hVbmlmb3Jtc0Rpc3RhbmNlIiwicmVmcmVzaFVuaWZvcm1zTm9ybWFsIiwiaXNMaW5lQmFzaWNNYXRlcmlhbCIsInJlZnJlc2hVbmlmb3Jtc0xpbmUiLCJpc0xpbmVEYXNoZWRNYXRlcmlhbCIsInJlZnJlc2hVbmlmb3Jtc0Rhc2giLCJpc1BvaW50c01hdGVyaWFsIiwicmVmcmVzaFVuaWZvcm1zUG9pbnRzIiwiaXNTaGFkb3dNYXRlcmlhbCIsImx0Y18xIiwiTFRDXzEiLCJsdGNfMiIsIkxUQ18yIiwidXZTY2FsZU1hcCIsInRleHR1cmVVbml0Iiwid2FybmVkIiwic2V0VGV4dHVyZSIsInJlYWRSZW5kZXJUYXJnZXRQaXhlbHMiLCJyZXN0b3JlIiwidGV4dHVyZUZvcm1hdCIsIklNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUIiwiSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFIiwiY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyIsIkZSQU1FQlVGRkVSX0NPTVBMRVRFIiwicmVhZFBpeGVscyIsImNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZSIsImxldmVsIiwiY29weVRleEltYWdlMkQiLCJjb3B5VGV4dHVyZVRvVGV4dHVyZSIsInNyY1RleHR1cmUiLCJkc3RUZXh0dXJlIiwidGV4U3ViSW1hZ2UyRCIsInBpeGVscyIsIkZvZ0V4cDIiLCJGb2ciLCJTY2VuZSIsIlNwcml0ZU1hdGVyaWFsIiwiaXNTcHJpdGVNYXRlcmlhbCIsIlNwcml0ZSIsIndvcmxkUG9zaXRpb24iLCJpbnRlcnNlY3RQb2ludCIsIndvcmxkU2NhbGUiLCJndWVzc1NpemVTcSIsImxldmVscyIsIkxPRCIsImFkZExldmVsIiwiZ2V0T2JqZWN0Rm9yRGlzdGFuY2UiLCJtYXRyaXhQb3NpdGlvbiIsImJvbmVJbnZlcnNlcyIsImNhbGN1bGF0ZUludmVyc2VzIiwiU2tlbGV0b24iLCJib25lIiwiaXNCb25lIiwiaWRlbnRpdHlNYXRyaXgiLCJvZmZzZXRNYXRyaXgiLCJnZXRCb25lQnlOYW1lIiwiQm9uZSIsImJpbmRNb2RlIiwiYmluZE1hdHJpeCIsImJpbmRNYXRyaXhJbnZlcnNlIiwiaW5pdEJvbmVzIiwiYmluZCIsIm5vcm1hbGl6ZVNraW5XZWlnaHRzIiwiU2tpbm5lZE1lc2giLCJnYm9uZSIsInJvdHEiLCJzY2wiLCJzdyIsInNraW5XZWlnaHQiLCJ2ZWMiLCJsaW5lY2FwIiwibGluZWpvaW4iLCJMaW5lIiwiY29tcHV0ZUxpbmVEaXN0YW5jZXMiLCJwb3NpdGlvbkF0dHJpYnV0ZSIsImxpbmVQcmVjaXNpb24iLCJ2U3RhcnQiLCJ2RW5kIiwiaW50ZXJSYXkiLCJpbnRlclNlZ21lbnQiLCJkaXN0U3EiLCJwcmVjaXNpb25TcSIsIm5iVmVydGljZXMiLCJMaW5lU2VnbWVudHMiLCJMaW5lTG9vcCIsIlBvaW50cyIsInBhcmFtcyIsInRocmVzaG9sZCIsImxvY2FsVGhyZXNob2xkIiwicmF5UG9pbnREaXN0YW5jZVNxIiwibG9jYWxUaHJlc2hvbGRTcSIsImRpc3RhbmNlVG9SYXkiLCJ0ZXN0UG9pbnQiLCJHcm91cCIsImlzR3JvdXAiLCJ2aWRlbyIsIlZpZGVvVGV4dHVyZSIsInJlYWR5U3RhdGUiLCJIQVZFX0NVUlJFTlRfREFUQSIsIkNvbXByZXNzZWRUZXh0dXJlIiwiRGVwdGhUZXh0dXJlIiwib2wiLCJlZGdlcyIsImVkZ2UiLCJXaXJlZnJhbWVHZW9tZXRyeSIsImZ1bmMiLCJzbGljZXMiLCJzdGFja3MiLCJQYXJhbWV0cmljR2VvbWV0cnkiLCJwdiIsInB1Iiwic2xpY2VDb3VudCIsIlBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSIsImRldGFpbCIsIlBvbHloZWRyb25HZW9tZXRyeSIsInN1YmRpdmlkZSIsImFwcHBseVJhZGl1cyIsImdlbmVyYXRlVVZzIiwidXZCdWZmZXIiLCJnZXRWZXJ0ZXhCeUluZGV4Iiwic3ViZGl2aWRlRmFjZSIsImNvbHMiLCJyb3dzIiwiYWoiLCJiaiIsInB1c2hWZXJ0ZXgiLCJhemltdXRoIiwiaW5jbGluYXRpb24iLCJjb3JyZWN0VVZzIiwiY29ycmVjdFNlYW0iLCJjZW50cm9pZCIsImNvcnJlY3RVViIsImF6aSIsIlBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSIsIlRldHJhaGVkcm9uR2VvbWV0cnkiLCJUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IiwiT2N0YWhlZHJvbkdlb21ldHJ5IiwiT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5IiwiSWNvc2FoZWRyb25HZW9tZXRyeSIsIkljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkiLCJEb2RlY2FoZWRyb25HZW9tZXRyeSIsIkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IiwidHVidWxhclNlZ21lbnRzIiwicmFkaWFsU2VnbWVudHMiLCJjbG9zZWQiLCJ0YXBlciIsInRhbmdlbnRzIiwiYnVmZmVyR2VvbWV0cnkiLCJiaW5vcm1hbHMiLCJUdWJlR2VvbWV0cnkiLCJjb21wdXRlRnJlbmV0RnJhbWVzIiwiZnJhbWVzIiwiZ2VuZXJhdGVCdWZmZXJEYXRhIiwiZ2VuZXJhdGVTZWdtZW50IiwiZ2VuZXJhdGVJbmRpY2VzIiwiZ2V0UG9pbnRBdCIsIk4iLCJUdWJlQnVmZmVyR2VvbWV0cnkiLCJ0dWJlIiwiaGVpZ2h0U2NhbGUiLCJUb3J1c0tub3RHZW9tZXRyeSIsImNhbGN1bGF0ZVBvc2l0aW9uT25DdXJ2ZSIsIlAxIiwiUDIiLCJxdU92ZXJQIiwiY3MiLCJjdSIsInN1IiwiVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkiLCJhcmMiLCJUb3J1c0dlb21ldHJ5IiwiVG9ydXNCdWZmZXJHZW9tZXRyeSIsInRyaWFuZ3VsYXRlIiwiaG9sZUluZGljZXMiLCJkaW0iLCJvdXRlckxlbiIsImhhc0hvbGVzIiwib3V0ZXJOb2RlIiwibGlua2VkTGlzdCIsImludlNpemUiLCJlbGltaW5hdGVIb2xlcyIsImVhcmN1dExpbmtlZCIsImNsb2Nrd2lzZSIsInNpZ25lZEFyZWEiLCJpbnNlcnROb2RlIiwicmVtb3ZlTm9kZSIsImFnYWluIiwic3RlaW5lciIsImFyZWEiLCJlYXIiLCJwYXNzIiwiaW5kZXhDdXJ2ZSIsImlzRWFySGFzaGVkIiwiaXNFYXIiLCJmaWx0ZXJQb2ludHMiLCJjdXJlTG9jYWxJbnRlcnNlY3Rpb25zIiwic3BsaXRFYXJjdXQiLCJwb2ludEluVHJpYW5nbGUiLCJtaW5UWSIsIm1heFRYIiwibWF4VFkiLCJ6T3JkZXIiLCJtaW5UWCIsIm5leHRaIiwicHJldloiLCJsb2NhbGx5SW5zaWRlIiwiaXNWYWxpZERpYWdvbmFsIiwic3BsaXRQb2x5Z29uIiwiZ2V0TGVmdG1vc3QiLCJjb21wYXJlWCIsImVsaW1pbmF0ZUhvbGUiLCJob2xlIiwiZmluZEhvbGVCcmlkZ2UiLCJoeCIsImh5IiwibXgiLCJteSIsInRhbk1pbiIsInNvcnRMaW5rZWQiLCJ0YWlsIiwibnVtTWVyZ2VzIiwicFNpemUiLCJxU2l6ZSIsImluU2l6ZSIsImxlZnRtb3N0IiwicHkiLCJpbnRlcnNlY3RzUG9seWdvbiIsIm1pZGRsZUluc2lkZSIsInEyIiwiaW5zaWRlIiwiYW4iLCJicCIsInN1bSIsImNvbnRvdXIiLCJpc0Nsb2NrV2lzZSIsInB0cyIsInRyaWFuZ3VsYXRlU2hhcGUiLCJob2xlcyIsInJlbW92ZUR1cEVuZFB0cyIsImFkZENvbnRvdXIiLCJob2xlSW5kZXgiLCJFYXJjdXQiLCJFeHRydWRlR2VvbWV0cnkiLCJhZGRTaGFwZSIsInZlcnRpY2VzQXJyYXkiLCJjdXJ2ZVNlZ21lbnRzIiwic3RlcHMiLCJhbW91bnQiLCJiZXZlbEVuYWJsZWQiLCJiZXZlbFRoaWNrbmVzcyIsImJldmVsU2l6ZSIsImJldmVsU2VnbWVudHMiLCJleHRydWRlUGF0aCIsIlVWR2VuZXJhdG9yIiwiV29ybGRVVkdlbmVyYXRvciIsImV4dHJ1ZGVCeVBhdGgiLCJiaW5vcm1hbCIsInBvc2l0aW9uMiIsImV4dHJ1ZGVQdHMiLCJnZXRTcGFjZWRQb2ludHMiLCJzcGxpbmVUdWJlIiwiaGwiLCJleHRyYWN0UG9pbnRzIiwic2hhcGVQb2ludHMiLCJTaGFwZVV0aWxzIiwiYWhvbGUiLCJwdCIsImJzIiwidmVydCIsInZsZW4iLCJmbGVuIiwiaW5QdCIsImluUHJldiIsImluTmV4dCIsInZfdHJhbnNfeSIsInNocmlua19ieSIsInZfcHJldl95Iiwidl9uZXh0X3kiLCJ2X3ByZXZfeCIsInZfbmV4dF94IiwiY29sbGluZWFyMCIsInZfcHJldl9sZW5zcSIsInZfcHJldl9sZW4iLCJ2X25leHRfbGVuIiwicHROZXh0U2hpZnRfeCIsInB0UHJldlNoaWZ0X3giLCJwdE5leHRTaGlmdF95IiwicHRQcmV2U2hpZnRfeSIsInZfdHJhbnNfeCIsInNmIiwidl90cmFuc19sZW5zcSIsImRpcmVjdGlvbl9lcSIsImNvbnRvdXJNb3ZlbWVudHMiLCJnZXRCZXZlbFZlYyIsIm9uZUhvbGVNb3ZlbWVudHMiLCJ2ZXJ0aWNlc01vdmVtZW50cyIsImhvbGVzTW92ZW1lbnRzIiwic2NhbGVQdDIiLCJidWlsZExpZEZhY2VzIiwiYnVpbGRTaWRlRmFjZXMiLCJmMyIsInNpZGV3YWxscyIsImxheWVyb2Zmc2V0Iiwic2wiLCJzbGVuMSIsInNsZW4yIiwiZjQiLCJwbGFjZWhvbGRlciIsImFkZFZlcnRleCIsInV2Z2VuIiwiZ2VuZXJhdGVUb3BVViIsIm5leHRJbmRleCIsImFkZFVWIiwiZ2VuZXJhdGVTaWRlV2FsbFVWIiwidmVjdG9yMiIsIkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSIsImluZGV4QSIsImluZGV4QiIsImluZGV4QyIsImFfeCIsImFfeSIsImJfeCIsImJfeSIsImNfeCIsImNfeSIsImluZGV4RCIsImFfeiIsImJfeiIsImNfeiIsImRfeCIsImRfeiIsImRfeSIsInRleHQiLCJUZXh0R2VvbWV0cnkiLCJmb250IiwiaXNGb250IiwiZ2VuZXJhdGVTaGFwZXMiLCJUZXh0QnVmZmVyR2VvbWV0cnkiLCJwaGlTdGFydCIsInBoaUxlbmd0aCIsInRoZXRhU3RhcnQiLCJ0aGV0YUxlbmd0aCIsIlNwaGVyZUdlb21ldHJ5IiwidmVydGljZXNSb3ciLCJncmlkIiwidGhldGFFbmQiLCJTcGhlcmVCdWZmZXJHZW9tZXRyeSIsImlubmVyUmFkaXVzIiwib3V0ZXJSYWRpdXMiLCJ0aGV0YVNlZ21lbnRzIiwicGhpU2VnbWVudHMiLCJSaW5nR2VvbWV0cnkiLCJzZWdtZW50IiwicmFkaXVzU3RlcCIsInRoZXRhU2VnbWVudExldmVsIiwiUmluZ0J1ZmZlckdlb21ldHJ5Iiwic2VnbWVudHMiLCJMYXRoZUdlb21ldHJ5IiwiaW52ZXJzZVNlZ21lbnRzIiwiYmFzZSIsIm4xIiwibjIiLCJMYXRoZUJ1ZmZlckdlb21ldHJ5IiwiU2hhcGVHZW9tZXRyeSIsInNoYXBlSG9sZSIsInNoYXBlVmVydGljZXMiLCJzaGFwZUhvbGVzIiwiaW5kZXhPZmZzZXQiLCJTaGFwZUJ1ZmZlckdlb21ldHJ5IiwidGhyZXNob2xkQW5nbGUiLCJmYWNlMSIsImZhY2UyIiwidGhyZXNob2xkRG90Iiwic291cmNlVmVydGljZXMiLCJFZGdlc0dlb21ldHJ5IiwicmFkaXVzVG9wIiwicmFkaXVzQm90dG9tIiwib3BlbkVuZGVkIiwiQ3lsaW5kZXJHZW9tZXRyeSIsImdlbmVyYXRlVG9yc28iLCJnZW5lcmF0ZUNhcCIsInNpblRoZXRhIiwiY29zVGhldGEiLCJzbG9wZSIsImluZGV4Um93IiwiaW5kZXhBcnJheSIsImNlbnRlckluZGV4U3RhcnQiLCJjZW50ZXJJbmRleEVuZCIsIkN5bGluZGVyQnVmZmVyR2VvbWV0cnkiLCJDb25lR2VvbWV0cnkiLCJDb25lQnVmZmVyR2VvbWV0cnkiLCJDaXJjbGVHZW9tZXRyeSIsIkNpcmNsZUJ1ZmZlckdlb21ldHJ5IiwiZnJlZXplIiwiUmF3U2hhZGVyTWF0ZXJpYWwiLCJmaWxlcyIsImZpbGUiLCJvbkxvYWQiLCJvblByb2dyZXNzIiwib25FcnJvciIsIm9uU3RhcnQiLCJpdGVtU3RhcnQiLCJpdGVtc1RvdGFsIiwiaXNMb2FkaW5nIiwiaXRlbXNMb2FkZWQiLCJpdGVtRW5kIiwiaXRlbUVycm9yIiwicmVzb2x2ZVVSTCIsInVybE1vZGlmaWVyIiwic2V0VVJMTW9kaWZpZXIiLCJ0cmFuc2Zvcm0iLCJtYW5hZ2VyIiwiRGVmYXVsdExvYWRpbmdNYW5hZ2VyIiwiRmlsZUxvYWRlciIsImxvYWQiLCJDYWNoZSIsImNhY2hlZCIsImxvYWRpbmciLCJkYXRhVXJpUmVnZXgiLCJkYXRhVXJpUmVnZXhSZXN1bHQiLCJkZWNvZGVVUklDb21wb25lbnQiLCJpc0Jhc2U2NCIsImF0b2IiLCJyZXNwb25zZVR5cGUiLCJ0b0xvd2VyQ2FzZSIsInJlc3BvbnNlIiwibWltZVR5cGUiLCJwYXJzZXIiLCJwYXJzZUZyb21TdHJpbmciLCJyZXF1ZXN0Iiwic3RhdHVzIiwiY2FsbGJhY2tzIiwid2l0aENyZWRlbnRpYWxzIiwib3ZlcnJpZGVNaW1lVHlwZSIsInJlcXVlc3RIZWFkZXIiLCJzZXRSZXF1ZXN0SGVhZGVyIiwiaGVhZGVyIiwic2VuZCIsInNldFBhdGgiLCJzZXRSZXNwb25zZVR5cGUiLCJzZXRXaXRoQ3JlZGVudGlhbHMiLCJzZXRNaW1lVHlwZSIsIl9wYXJzZXIiLCJDb21wcmVzc2VkVGV4dHVyZUxvYWRlciIsImxvYWRlciIsInRleERhdGFzIiwibG9hZGVkIiwibWlwbWFwQ291bnQiLCJsb2FkVGV4dHVyZSIsImlzQ3ViZW1hcCIsIkRhdGFUZXh0dXJlTG9hZGVyIiwidGV4RGF0YSIsIkltYWdlTG9hZGVyIiwiY3Jvc3NPcmlnaW4iLCJzdWJzdHIiLCJzZXRDcm9zc09yaWdpbiIsIkN1YmVUZXh0dXJlTG9hZGVyIiwidXJscyIsIlRleHR1cmVMb2FkZXIiLCJzZWFyY2giLCJpc0pQRUciLCJhcmNMZW5ndGhEaXZpc2lvbnMiLCJDdXJ2ZSIsImdldFBvaW50Iiwib3B0aW9uYWxUYXJnZXQiLCJnZXRVdG9UbWFwcGluZyIsImdldFBvaW50cyIsImRpdmlzaW9ucyIsImdldExlbmd0aCIsImdldExlbmd0aHMiLCJsZW5ndGhzIiwiY2FjaGVBcmNMZW5ndGhzIiwiY3VycmVudCIsInVwZGF0ZUFyY0xlbmd0aHMiLCJhcmNMZW5ndGhzIiwidGFyZ2V0QXJjTGVuZ3RoIiwiY29tcGFyaXNvbiIsImxlbmd0aEFmdGVyIiwibGVuZ3RoQmVmb3JlIiwic2VnbWVudExlbmd0aCIsInNlZ21lbnRGcmFjdGlvbiIsImdldFRhbmdlbnQiLCJ0MiIsInB0MiIsInB0MSIsImdldFRhbmdlbnRBdCIsIk1BWF9WQUxVRSIsInR6IiwibWF0IiwiZnJvbUpTT04iLCJqc29uIiwiYVgiLCJhWSIsInhSYWRpdXMiLCJ5UmFkaXVzIiwiYVN0YXJ0QW5nbGUiLCJhRW5kQW5nbGUiLCJhQ2xvY2t3aXNlIiwiYVJvdGF0aW9uIiwiRWxsaXBzZUN1cnZlIiwiaXNFbGxpcHNlQ3VydmUiLCJkZWx0YUFuZ2xlIiwidHdvUGkiLCJzYW1lUG9pbnRzIiwiYVJhZGl1cyIsIkFyY0N1cnZlIiwiaXNBcmNDdXJ2ZSIsImMwIiwiaW5pdENhdG11bGxSb20iLCJ4MyIsInRlbnNpb24iLCJpbml0Tm9udW5pZm9ybUNhdG11bGxSb20iLCJkdDAiLCJkdDEiLCJkdDIiLCJjYWxjIiwidDMiLCJjdXJ2ZVR5cGUiLCJDYXRtdWxsUm9tQ3VydmUzIiwiaXNDYXRtdWxsUm9tQ3VydmUzIiwiaW50UG9pbnQiLCJ3ZWlnaHQiLCJweCQxIiwicHoiLCJRdWFkcmF0aWNCZXppZXJQMSIsIlF1YWRyYXRpY0JlemllclAyIiwiQ3ViaWNCZXppZXJQMSIsIkN1YmljQmV6aWVyUDIiLCJDdWJpY0JlemllclAzIiwidjMiLCJDdWJpY0JlemllckN1cnZlIiwiaXNDdWJpY0JlemllckN1cnZlIiwiQ3ViaWNCZXppZXIiLCJDdWJpY0JlemllckN1cnZlMyIsImlzQ3ViaWNCZXppZXJDdXJ2ZTMiLCJMaW5lQ3VydmUiLCJpc0xpbmVDdXJ2ZSIsIkxpbmVDdXJ2ZTMiLCJpc0xpbmVDdXJ2ZTMiLCJRdWFkcmF0aWNCZXppZXJDdXJ2ZSIsImlzUXVhZHJhdGljQmV6aWVyQ3VydmUiLCJRdWFkcmF0aWNCZXppZXIiLCJRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiLCJpc1F1YWRyYXRpY0JlemllckN1cnZlMyIsIlNwbGluZUN1cnZlIiwiaXNTcGxpbmVDdXJ2ZSIsIkNhdG11bGxSb20iLCJjdXJ2ZXMiLCJhdXRvQ2xvc2UiLCJDdXJ2ZVBhdGgiLCJjdXJ2ZSIsImNsb3NlUGF0aCIsInN0YXJ0UG9pbnQiLCJlbmRQb2ludCIsImdldEN1cnZlTGVuZ3RocyIsImN1cnZlTGVuZ3RocyIsImxlbnMiLCJjYWNoZUxlbmd0aHMiLCJzdW1zIiwicmVzb2x1dGlvbiIsImN1cnJlbnRQb2ludCIsIlBhdGgiLCJtb3ZlVG8iLCJsaW5lVG8iLCJxdWFkcmF0aWNDdXJ2ZVRvIiwiYUNQeCIsImFDUHkiLCJiZXppZXJDdXJ2ZVRvIiwiYUNQMXgiLCJhQ1AxeSIsImFDUDJ4IiwiYUNQMnkiLCJzcGxpbmVUaHJ1IiwibnB0cyIsImFic2FyYyIsImFic2VsbGlwc2UiLCJlbGxpcHNlIiwiZmlyc3RQb2ludCIsImxhc3RQb2ludCIsIlNoYXBlIiwiZ2V0UG9pbnRzSG9sZXMiLCJob2xlc1B0cyIsIkxpZ2h0IiwiSGVtaXNwaGVyZUxpZ2h0IiwiTGlnaHRTaGFkb3ciLCJTcG90TGlnaHRTaGFkb3ciLCJwb3dlciIsIlNwb3RMaWdodCIsIlBvaW50TGlnaHQiLCJEaXJlY3Rpb25hbExpZ2h0U2hhZG93IiwiRGlyZWN0aW9uYWxMaWdodCIsIkFtYmllbnRMaWdodCIsIlJlY3RBcmVhTGlnaHQiLCJ0aW1lcyIsImludGVycG9sYXRpb24iLCJLZXlmcmFtZVRyYWNrIiwiU3RyaW5nS2V5ZnJhbWVUcmFjayIsIlZhbHVlVHlwZU5hbWUiLCJWYWx1ZUJ1ZmZlclR5cGUiLCJEZWZhdWx0SW50ZXJwb2xhdGlvbiIsIkludGVycG9sYXRlRGlzY3JldGUiLCJJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXIiLCJJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGgiLCJCb29sZWFuS2V5ZnJhbWVUcmFjayIsInBhcmFtZXRlclBvc2l0aW9ucyIsInNhbXBsZVZhbHVlcyIsInNhbXBsZVNpemUiLCJyZXN1bHRCdWZmZXIiLCJfY2FjaGVkSW5kZXgiLCJ2YWx1ZVNpemUiLCJJbnRlcnBvbGFudCIsImV2YWx1YXRlIiwicHAiLCJ2YWxpZGF0ZV9pbnRlcnZhbCIsInNlZWsiLCJsaW5lYXJfc2NhbiIsImZvcndhcmRfc2NhbiIsImFmdGVyRW5kXyIsImdpdmVVcEF0IiwidDFnbG9iYWwiLCJiZWZvcmVTdGFydF8iLCJtaWQiLCJpbnRlcnZhbENoYW5nZWRfIiwiaW50ZXJwb2xhdGVfIiwic2V0dGluZ3MiLCJEZWZhdWx0U2V0dGluZ3NfIiwiZ2V0U2V0dGluZ3NfIiwiY29weVNhbXBsZVZhbHVlXyIsIlF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCIsIlF1YXRlcm5pb25LZXlmcmFtZVRyYWNrIiwiSW50ZXJwb2xhdGVMaW5lYXIiLCJnZXRWYWx1ZVNpemUiLCJDb2xvcktleWZyYW1lVHJhY2siLCJOdW1iZXJLZXlmcmFtZVRyYWNrIiwiX3dlaWdodFByZXYiLCJfb2Zmc2V0UHJldiIsIl93ZWlnaHROZXh0IiwiX29mZnNldE5leHQiLCJDdWJpY0ludGVycG9sYW50IiwiZW5kaW5nU3RhcnQiLCJaZXJvQ3VydmF0dXJlRW5kaW5nIiwiZW5kaW5nRW5kIiwiaVByZXYiLCJpTmV4dCIsInRQcmV2IiwidE5leHQiLCJoYWxmRHQiLCJvMSIsIm8wIiwib1AiLCJvTiIsIndQIiwid04iLCJwcHAiLCJzUCIsInNOIiwiTGluZWFySW50ZXJwb2xhbnQiLCJvZmZzZXQxIiwib2Zmc2V0MCIsIndlaWdodDEiLCJ3ZWlnaHQwIiwiRGlzY3JldGVJbnRlcnBvbGFudCIsImFycmF5U2xpY2UiLCJmcm9tIiwidG8iLCJBbmltYXRpb25VdGlscyIsImlzVHlwZWRBcnJheSIsImNvbnZlcnRBcnJheSIsImZvcmNlQ2xvbmUiLCJpc1ZpZXciLCJnZXRLZXlmcmFtZU9yZGVyIiwiY29tcGFyZVRpbWUiLCJzb3J0ZWRBcnJheSIsIm5WYWx1ZXMiLCJzcmNPZmZzZXQiLCJmbGF0dGVuSlNPTiIsImpzb25LZXlzIiwidmFsdWVQcm9wZXJ0eU5hbWUiLCJUaW1lQnVmZmVyVHlwZSIsInNldEludGVycG9sYXRpb24iLCJ2YWxpZGF0ZSIsIm9wdGltaXplIiwiX2dldFRyYWNrVHlwZUZvclZhbHVlVHlwZU5hbWUiLCJ0cmFja1R5cGUiLCJ0cmFjayIsImdldEludGVycG9sYXRpb24iLCJ0eXBlTmFtZSIsIkZsb2F0MzJBcnJheSIsIkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlIiwiZmFjdG9yeU1ldGhvZCIsImNyZWF0ZUludGVycG9sYW50Iiwic2hpZnQiLCJ0aW1lT2Zmc2V0IiwidGltZVNjYWxlIiwic3RhcnRUaW1lIiwiZW5kVGltZSIsIm5LZXlzIiwidmFsaWQiLCJjdXJyVGltZSIsInByZXZUaW1lIiwic21vb3RoSW50ZXJwb2xhdGlvbiIsIkludGVycG9sYXRlU21vb3RoIiwid3JpdGVJbmRleCIsInRpbWVOZXh0Iiwib2Zmc2V0UCIsIm9mZnNldE4iLCJrZWVwIiwid3JpdGVPZmZzZXQiLCJyZWFkT2Zmc2V0IiwiVmVjdG9yS2V5ZnJhbWVUcmFjayIsImR1cmF0aW9uIiwidHJhY2tzIiwicmVzZXREdXJhdGlvbiIsIkFuaW1hdGlvbkNsaXAiLCJqc29uVHJhY2tzIiwiZnJhbWVUaW1lIiwiZnBzIiwiY2xpcCIsImNsaXBUcmFja3MiLCJDcmVhdGVGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZSIsIm1vcnBoVGFyZ2V0U2VxdWVuY2UiLCJub0xvb3AiLCJudW1Nb3JwaFRhcmdldHMiLCJmaW5kQnlOYW1lIiwib2JqZWN0T3JDbGlwQXJyYXkiLCJjbGlwQXJyYXkiLCJhbmltYXRpb25zIiwiQ3JlYXRlQ2xpcHNGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZXMiLCJwYXJ0cyIsImFuaW1hdGlvblRvTW9ycGhUYXJnZXRzIiwiYW5pbWF0aW9uTW9ycGhUYXJnZXRzIiwiY2xpcHMiLCJwYXJzZUFuaW1hdGlvbiIsImFuaW1hdGlvbiIsInRyYWNrTmFtZSIsImFuaW1hdGlvbktleXMiLCJwcm9wZXJ0eU5hbWUiLCJkZXN0VHJhY2tzIiwiaGllcmFyY2h5IiwiaGllcmFyY2h5VHJhY2tzIiwibW9ycGhUYXJnZXROYW1lcyIsImFuaW1hdGlvbktleSIsIm1vcnBoVGFyZ2V0TmFtZSIsImFkZE5vbmVtcHR5VHJhY2siLCJib25lTmFtZSIsImNsaXBOYW1lIiwiTWF0ZXJpYWxMb2FkZXIiLCJzZXRUZXh0dXJlcyIsInNoYWRpbmciLCJnZXRUZXh0dXJlIiwiQnVmZmVyR2VvbWV0cnlMb2FkZXIiLCJ0eXBlZEFycmF5IiwiZHJhd2NhbGxzIiwib2Zmc2V0cyIsIkludDhBcnJheSIsIlVpbnQ4QXJyYXkiLCJVaW50OENsYW1wZWRBcnJheSIsIkludDE2QXJyYXkiLCJVaW50MTZBcnJheSIsIkludDMyQXJyYXkiLCJVaW50MzJBcnJheSIsIkZsb2F0NjRBcnJheSIsIkxvYWRlciIsIkhhbmRsZXJzIiwiaGFuZGxlcnMiLCJyZWdleCIsIm9uTG9hZFN0YXJ0Iiwib25Mb2FkUHJvZ3Jlc3MiLCJvbkxvYWRDb21wbGV0ZSIsImluaXRNYXRlcmlhbHMiLCJ0ZXh0dXJlUGF0aCIsImNyZWF0ZU1hdGVyaWFsIiwiQWRkaXRpdmVCbGVuZGluZyIsIlN1YnRyYWN0aXZlQmxlbmRpbmciLCJNdWx0aXBseUJsZW5kaW5nIiwiZnVsbFBhdGgiLCJ0ZXh0dXJlTG9hZGVyIiwiQmxlbmRpbmdNb2RlIiwibWFwRGlmZnVzZVJlcGVhdCIsIm1hcERpZmZ1c2VPZmZzZXQiLCJtYXBEaWZmdXNlV3JhcCIsIm1hcERpZmZ1c2VBbmlzb3Ryb3B5IiwibWFwRW1pc3NpdmVSZXBlYXQiLCJtYXBFbWlzc2l2ZU9mZnNldCIsIm1hcEVtaXNzaXZlV3JhcCIsIm1hcEVtaXNzaXZlQW5pc290cm9weSIsIm1hcExpZ2h0UmVwZWF0IiwibWFwTGlnaHRPZmZzZXQiLCJtYXBMaWdodFdyYXAiLCJtYXBMaWdodEFuaXNvdHJvcHkiLCJtYXBBT1JlcGVhdCIsIm1hcEFPT2Zmc2V0IiwibWFwQU9XcmFwIiwibWFwQU9Bbmlzb3Ryb3B5IiwibWFwQnVtcFJlcGVhdCIsIm1hcEJ1bXBPZmZzZXQiLCJtYXBCdW1wV3JhcCIsIm1hcEJ1bXBBbmlzb3Ryb3B5IiwibWFwTm9ybWFsUmVwZWF0IiwibWFwTm9ybWFsT2Zmc2V0IiwibWFwTm9ybWFsV3JhcCIsIm1hcE5vcm1hbEFuaXNvdHJvcHkiLCJtYXBTcGVjdWxhclJlcGVhdCIsIm1hcFNwZWN1bGFyT2Zmc2V0IiwibWFwU3BlY3VsYXJXcmFwIiwibWFwU3BlY3VsYXJBbmlzb3Ryb3B5IiwibWFwTWV0YWxuZXNzUmVwZWF0IiwibWFwTWV0YWxuZXNzT2Zmc2V0IiwibWFwTWV0YWxuZXNzV3JhcCIsIm1hcE1ldGFsbmVzc0FuaXNvdHJvcHkiLCJtYXBSb3VnaG5lc3NSZXBlYXQiLCJtYXBSb3VnaG5lc3NPZmZzZXQiLCJtYXBSb3VnaG5lc3NXcmFwIiwibWFwUm91Z2huZXNzQW5pc290cm9weSIsIm1hcEFscGhhUmVwZWF0IiwibWFwQWxwaGFPZmZzZXQiLCJtYXBBbHBoYVdyYXAiLCJtYXBBbHBoYUFuaXNvdHJvcHkiLCJWZXJ0ZXhDb2xvcnMiLCJGYWNlQ29sb3JzIiwibWF0ZXJpYWxMb2FkZXIiLCJkZWNvZGVUZXh0IiwiZGVjb2RlIiwiZnJvbUNoYXJDb2RlIiwiZXNjYXBlIiwiZXh0cmFjdFVybEJhc2UiLCJsYXN0SW5kZXhPZiIsIkpTT05Mb2FkZXIiLCJMb2FkZXJVdGlscyIsInNldFRleHR1cmVQYXRoIiwiZmkiLCJ6TGVuZ3RoIiwiY29sb3JJbmRleCIsIm5vcm1hbEluZGV4IiwidXZJbmRleCIsImlzUXVhZCIsImZhY2VBIiwiZmFjZUIiLCJ1dkxheWVyIiwiblV2TGF5ZXJzIiwiaXNCaXRTZXQiLCJpbmZsdWVuY2VzUGVyVmVydGV4Iiwic3JjVmVydGljZXMiLCJkc3RWZXJ0aWNlcyIsIm1vcnBoQ29sb3JzIiwib3V0cHV0QW5pbWF0aW9ucyIsIm1vcnBoQW5pbWF0aW9uQ2xpcHMiLCJwYXJzZU1vZGVsIiwicGFyc2VTa2luIiwicGFyc2VNb3JwaGluZyIsInBhcnNlQW5pbWF0aW9ucyIsIk9iamVjdExvYWRlciIsInN1YnN0cmluZyIsInBhcnNlU2hhcGUiLCJwYXJzZUdlb21ldHJpZXMiLCJwYXJzZUltYWdlcyIsInBhcnNlVGV4dHVyZXMiLCJwYXJzZU1hdGVyaWFscyIsInBhcnNlT2JqZWN0IiwiZGV0YWlscyIsImdlb21ldHJ5U2hhcGVzIiwiYnVmZmVyR2VvbWV0cnlMb2FkZXIiLCJnZW9tZXRyeUxvYWRlciIsImxvYWRJbWFnZSIsInBhcnNlQ29uc3RhbnQiLCJURVhUVVJFX01BUFBJTkciLCJURVhUVVJFX1dSQVBQSU5HIiwiVEVYVFVSRV9GSUxURVIiLCJnZXRHZW9tZXRyeSIsImdldE1hdGVyaWFsIiwiQ3ViZVJlZnJhY3Rpb25NYXBwaW5nIiwiRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmciLCJFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyIsIlNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nIiwic3ViUGF0aHMiLCJjdXJyZW50UGF0aCIsIlNoYXBlUGF0aCIsInRvU2hhcGVzIiwiaXNDQ1ciLCJub0hvbGVzIiwiaW5TdWJwYXRocyIsInRtcFNoYXBlIiwidG1wUGF0aCIsImluUG9seWdvbiIsInBvbHlMZW4iLCJlZGdlSGlnaFB0IiwiZWRnZUxvd1B0IiwiZWRnZUR5IiwiZWRnZUR4IiwicGVycEVkZ2UiLCJob2xlc0ZpcnN0IiwibmV3U2hhcGVzIiwibWFpbklkeCIsIm5ld1NoYXBlSG9sZXMiLCJ0bXBQb2ludHMiLCJzb2xpZCIsInNMZW4iLCJzSWR4IiwiYmV0dGVyU2hhcGVIb2xlcyIsImhJZHgiLCJzaG8iLCJzMklkeCIsImlzUG9pbnRJbnNpZGVQb2x5Z29uIiwiaG8iLCJ0b0NoYW5nZSIsImZyb21zIiwidG9zIiwiaG9sZV91bmFzc2lnbmVkIiwiYW1iaWd1b3VzIiwidG1wSG9sZXMiLCJGb250IiwiY3JlYXRlUGF0aHMiLCJwYXRocyIsInlNYXgiLCJ5TWluIiwidW5kZXJsaW5lVGhpY2tuZXNzIiwiY2hhcnMiLCJjaGFyIiwibGluZV9oZWlnaHQiLCJjcmVhdGVQYXRoIiwiZ2x5cGhzIiwiZ2x5cGgiLCJjcHgiLCJjcHkiLCJjcHgxIiwiY3B5MSIsImNweDIiLCJjcHkyIiwiX2NhY2hlZE91dGxpbmUiLCJvdXRsaW5lIiwiYWN0aW9uIiwiaGEiLCJGb250TG9hZGVyIiwiQXVkaW9Db250ZXh0Iiwid2Via2l0QXVkaW9Db250ZXh0Iiwic2V0Q29udGV4dCIsIkF1ZGlvTG9hZGVyIiwiZGVjb2RlQXVkaW9EYXRhIiwiYXVkaW9CdWZmZXIiLCJleWVTZXAiLCJTdGVyZW9DYW1lcmEiLCJ4bWF4IiwiZXllTGVmdCIsImV5ZVJpZ2h0IiwieG1pbiIsInltYXgiLCJleWVTZXBPblByb2plY3Rpb24iLCJjdWJlUmVzb2x1dGlvbiIsImNhbWVyYVBYIiwiY2FtZXJhTlgiLCJjYW1lcmFQWSIsImNhbWVyYU5ZIiwiY2FtZXJhUFoiLCJjYW1lcmFOWiIsIkN1YmVDYW1lcmEiLCJnYWluIiwiY3JlYXRlR2FpbiIsImNvbm5lY3QiLCJkZXN0aW5hdGlvbiIsIkF1ZGlvTGlzdGVuZXIiLCJnZXRJbnB1dCIsInJlbW92ZUZpbHRlciIsImRpc2Nvbm5lY3QiLCJnZXRGaWx0ZXIiLCJzZXRGaWx0ZXIiLCJnZXRNYXN0ZXJWb2x1bWUiLCJzZXRNYXN0ZXJWb2x1bWUiLCJzZXRUYXJnZXRBdFRpbWUiLCJjdXJyZW50VGltZSIsInBvc2l0aW9uWCIsInNldFZhbHVlQXRUaW1lIiwicG9zaXRpb25ZIiwicG9zaXRpb25aIiwiZm9yd2FyZFgiLCJmb3J3YXJkWSIsImZvcndhcmRaIiwidXBYIiwidXBZIiwidXBaIiwic2V0T3JpZW50YXRpb24iLCJhdXRvcGxheSIsImxvb3AiLCJwbGF5YmFja1JhdGUiLCJpc1BsYXlpbmciLCJoYXNQbGF5YmFja0NvbnRyb2wiLCJzb3VyY2VUeXBlIiwiZmlsdGVycyIsIkF1ZGlvIiwiZ2V0T3V0cHV0Iiwic2V0Tm9kZVNvdXJjZSIsImF1ZGlvTm9kZSIsInNldEJ1ZmZlciIsInBsYXkiLCJjcmVhdGVCdWZmZXJTb3VyY2UiLCJvbmVuZGVkIiwib25FbmRlZCIsInBhdXNlIiwiZ2V0RmlsdGVycyIsInNldEZpbHRlcnMiLCJzZXRQbGF5YmFja1JhdGUiLCJnZXRQbGF5YmFja1JhdGUiLCJnZXRMb29wIiwic2V0TG9vcCIsImdldFZvbHVtZSIsInNldFZvbHVtZSIsInBhbm5lciIsImNyZWF0ZVBhbm5lciIsIlBvc2l0aW9uYWxBdWRpbyIsImdldFJlZkRpc3RhbmNlIiwicmVmRGlzdGFuY2UiLCJzZXRSZWZEaXN0YW5jZSIsImdldFJvbGxvZmZGYWN0b3IiLCJyb2xsb2ZmRmFjdG9yIiwic2V0Um9sbG9mZkZhY3RvciIsImdldERpc3RhbmNlTW9kZWwiLCJkaXN0YW5jZU1vZGVsIiwic2V0RGlzdGFuY2VNb2RlbCIsImdldE1heERpc3RhbmNlIiwibWF4RGlzdGFuY2UiLCJzZXRNYXhEaXN0YW5jZSIsImF1ZGlvIiwiZmZ0U2l6ZSIsImFuYWx5c2VyIiwiY3JlYXRlQW5hbHlzZXIiLCJmcmVxdWVuY3lCaW5Db3VudCIsIkF1ZGlvQW5hbHlzZXIiLCJnZXRGcmVxdWVuY3lEYXRhIiwiZ2V0Qnl0ZUZyZXF1ZW5jeURhdGEiLCJnZXRBdmVyYWdlRnJlcXVlbmN5IiwiYmluZGluZyIsIm1peEZ1bmN0aW9uIiwiX3NsZXJwIiwiX3NlbGVjdCIsIl9sZXJwIiwiX21peEJ1ZmZlclJlZ2lvbiIsImN1bXVsYXRpdmVXZWlnaHQiLCJ1c2VDb3VudCIsInJlZmVyZW5jZUNvdW50IiwiUHJvcGVydHlNaXhlciIsImFjY3VtdWxhdGUiLCJhY2N1SW5kZXgiLCJjdXJyZW50V2VpZ2h0IiwibWl4Iiwib3JpZ2luYWxWYWx1ZU9mZnNldCIsInNhdmVPcmlnaW5hbFN0YXRlIiwiZ2V0VmFsdWUiLCJyZXN0b3JlT3JpZ2luYWxTdGF0ZSIsInRhcmdldEdyb3VwIiwib3B0aW9uYWxQYXJzZWRQYXRoIiwiUHJvcGVydHlCaW5kaW5nIiwicGFyc2VUcmFja05hbWUiLCJfdGFyZ2V0R3JvdXAiLCJfYmluZGluZ3MiLCJzdWJzY3JpYmVfIiwicGFyc2VkUGF0aCIsIkNvbXBvc2l0ZSIsIm5DYWNoZWRPYmplY3RzXyIsImZpcnN0VmFsaWRJbmRleCIsImJpbmRpbmdzIiwidW5iaW5kIiwicm9vdE5vZGUiLCJmaW5kTm9kZSIsIm5vZGVOYW1lIiwicm9vdCIsImlzQW5pbWF0aW9uT2JqZWN0R3JvdXAiLCJzYW5pdGl6ZU5vZGVOYW1lIiwiUkVTRVJWRURfQ0hBUlNfUkUiLCJyZXNlcnZlZFJlIiwid29yZENoYXIiLCJ3b3JkQ2hhck9yRG90IiwiZGlyZWN0b3J5UmUiLCJub2RlUmUiLCJvYmplY3RSZSIsInByb3BlcnR5UmUiLCJ0cmFja1JlIiwibWF0Y2hlcyIsIm9iamVjdE5hbWUiLCJvYmplY3RJbmRleCIsInByb3BlcnR5SW5kZXgiLCJyZXN1bHRzIiwibGFzdERvdCIsInN1cHBvcnRlZE9iamVjdE5hbWVzIiwiY2hpbGROb2RlIiwic2VhcmNoTm9kZVN1YnRyZWUiLCJzdWJUcmVlTm9kZSIsIl9nZXRWYWx1ZV91bmF2YWlsYWJsZSIsIl9zZXRWYWx1ZV91bmF2YWlsYWJsZSIsIkJpbmRpbmdUeXBlIiwiRGlyZWN0IiwiRW50aXJlQXJyYXkiLCJBcnJheUVsZW1lbnQiLCJIYXNGcm9tVG9BcnJheSIsIlZlcnNpb25pbmciLCJOb25lIiwiTmVlZHNVcGRhdGUiLCJNYXRyaXhXb3JsZE5lZWRzVXBkYXRlIiwiR2V0dGVyQnlCaW5kaW5nVHlwZSIsInJlc29sdmVkUHJvcGVydHkiLCJTZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZyIsInRhcmdldE9iamVjdCIsImRlc3QiLCJ0YXJnZXRBcnJheSIsInNvdXJjZUFycmF5Iiwibm9kZVByb3BlcnR5IiwidmVyc2lvbmluZyIsImJpbmRpbmdUeXBlIiwiX2dldFZhbHVlX3VuYm91bmQiLCJfc2V0VmFsdWVfdW5ib3VuZCIsIl9pbmRpY2VzQnlVVUlEIiwiX3BhdGhzIiwiX3BhcnNlZFBhdGhzIiwiX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCIsInN0YXRzIiwidG90YWwiLCJBbmltYXRpb25PYmplY3RHcm91cCIsIm5PYmplY3RzIiwibkNhY2hlZE9iamVjdHMiLCJpbmRpY2VzQnlVVUlEIiwicGFyc2VkUGF0aHMiLCJuQmluZGluZ3MiLCJrbm93bk9iamVjdCIsImxhc3RDYWNoZWRPYmplY3QiLCJmaXJzdEFjdGl2ZUluZGV4IiwibGFzdENhY2hlZCIsImJpbmRpbmdzRm9yUGF0aCIsImZpcnN0QWN0aXZlT2JqZWN0IiwibGFzdENhY2hlZEluZGV4IiwiZmlyc3RBY3RpdmUiLCJ1bmNhY2hlIiwibGFzdE9iamVjdCIsImluZGljZXNCeVBhdGgiLCJ1bnN1YnNjcmliZV8iLCJsYXN0QmluZGluZ3NJbmRleCIsImxhc3RCaW5kaW5ncyIsImxhc3RCaW5kaW5nc1BhdGgiLCJtaXhlciIsImxvY2FsUm9vdCIsIl9taXhlciIsIl9jbGlwIiwiX2xvY2FsUm9vdCIsIm5UcmFja3MiLCJpbnRlcnBvbGFudHMiLCJpbnRlcnBvbGFudCIsImludGVycG9sYW50U2V0dGluZ3MiLCJfaW50ZXJwb2xhbnRTZXR0aW5ncyIsIl9pbnRlcnBvbGFudHMiLCJfcHJvcGVydHlCaW5kaW5ncyIsIl9jYWNoZUluZGV4IiwiX2J5Q2xpcENhY2hlSW5kZXgiLCJfdGltZVNjYWxlSW50ZXJwb2xhbnQiLCJfd2VpZ2h0SW50ZXJwb2xhbnQiLCJMb29wUmVwZWF0IiwiX2xvb3BDb3VudCIsIl9zdGFydFRpbWUiLCJfZWZmZWN0aXZlVGltZVNjYWxlIiwiX2VmZmVjdGl2ZVdlaWdodCIsInJlcGV0aXRpb25zIiwicGF1c2VkIiwiY2xhbXBXaGVuRmluaXNoZWQiLCJ6ZXJvU2xvcGVBdFN0YXJ0IiwiemVyb1Nsb3BlQXRFbmQiLCJBbmltYXRpb25BY3Rpb24iLCJfYWN0aXZhdGVBY3Rpb24iLCJfZGVhY3RpdmF0ZUFjdGlvbiIsInN0b3BGYWRpbmciLCJzdG9wV2FycGluZyIsImlzUnVubmluZyIsIl9pc0FjdGl2ZUFjdGlvbiIsImlzU2NoZWR1bGVkIiwic3RhcnRBdCIsInNldEVmZmVjdGl2ZVdlaWdodCIsImdldEVmZmVjdGl2ZVdlaWdodCIsImZhZGVJbiIsIl9zY2hlZHVsZUZhZGluZyIsImZhZGVPdXQiLCJjcm9zc0ZhZGVGcm9tIiwiZmFkZU91dEFjdGlvbiIsIndhcnAiLCJmYWRlT3V0RHVyYXRpb24iLCJzdGFydEVuZFJhdGlvIiwiZmFkZUluRHVyYXRpb24iLCJlbmRTdGFydFJhdGlvIiwiY3Jvc3NGYWRlVG8iLCJmYWRlSW5BY3Rpb24iLCJ3ZWlnaHRJbnRlcnBvbGFudCIsIl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCIsInNldEVmZmVjdGl2ZVRpbWVTY2FsZSIsImdldEVmZmVjdGl2ZVRpbWVTY2FsZSIsInNldER1cmF0aW9uIiwic3luY1dpdGgiLCJoYWx0Iiwic3RhcnRUaW1lU2NhbGUiLCJlbmRUaW1lU2NhbGUiLCJfbGVuZENvbnRyb2xJbnRlcnBvbGFudCIsInRpbWVTY2FsZUludGVycG9sYW50IiwiZ2V0TWl4ZXIiLCJnZXRDbGlwIiwiZ2V0Um9vdCIsIl9yb290IiwiX3VwZGF0ZSIsImRlbHRhVGltZSIsInRpbWVEaXJlY3Rpb24iLCJfdXBkYXRlV2VpZ2h0IiwidGltZVJ1bm5pbmciLCJfdXBkYXRlVGltZVNjYWxlIiwiX3VwZGF0ZVRpbWUiLCJjbGlwVGltZSIsInByb3BlcnR5TWl4ZXJzIiwiaW50ZXJwb2xhbnRWYWx1ZSIsImxvb3BDb3VudCIsIkxvb3BPbmNlIiwiX3NldEVuZGluZ3MiLCJoYW5kbGVfc3RvcCIsIkxvb3BQaW5nUG9uZyIsInBpbmdQb25nIiwibG9vcERlbHRhIiwicGVuZGluZyIsImF0U3RhcnQiLCJhdEVuZCIsIlplcm9TbG9wZUVuZGluZyIsIldyYXBBcm91bmRFbmRpbmciLCJ3ZWlnaHROb3ciLCJ3ZWlnaHRUaGVuIiwiX2luaXRNZW1vcnlNYW5hZ2VyIiwiX2FjY3VJbmRleCIsIkFuaW1hdGlvbk1peGVyIiwiX2JpbmRBY3Rpb24iLCJwcm90b3R5cGVBY3Rpb24iLCJyb290VXVpZCIsImJpbmRpbmdzQnlSb290IiwiX2JpbmRpbmdzQnlSb290QW5kTmFtZSIsImJpbmRpbmdzQnlOYW1lIiwiX2FkZEluYWN0aXZlQmluZGluZyIsImNsaXBVdWlkIiwiYWN0aW9uc0ZvckNsaXAiLCJfYWN0aW9uc0J5Q2xpcCIsImtub3duQWN0aW9ucyIsIl9hZGRJbmFjdGl2ZUFjdGlvbiIsIl9sZW5kQmluZGluZyIsIl9sZW5kQWN0aW9uIiwiX3Rha2VCYWNrQmluZGluZyIsIl90YWtlQmFja0FjdGlvbiIsIl9hY3Rpb25zIiwiX25BY3RpdmVBY3Rpb25zIiwiX25BY3RpdmVCaW5kaW5ncyIsIl9jb250cm9sSW50ZXJwb2xhbnRzIiwiX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzIiwiYWN0aW9ucyIsImNvbnRyb2xJbnRlcnBvbGFudHMiLCJhY3Rpb25zQnlDbGlwIiwiYWN0aW9uQnlSb290IiwiX3JlbW92ZUluYWN0aXZlQWN0aW9uIiwibGFzdEluYWN0aXZlQWN0aW9uIiwiY2FjaGVJbmRleCIsImtub3duQWN0aW9uc0ZvckNsaXAiLCJsYXN0S25vd25BY3Rpb24iLCJieUNsaXBDYWNoZUluZGV4IiwiX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24iLCJfcmVtb3ZlSW5hY3RpdmVCaW5kaW5nIiwicHJldkluZGV4IiwibGFzdEFjdGl2ZUluZGV4IiwiZmlyc3RJbmFjdGl2ZUFjdGlvbiIsImZpcnN0SW5hY3RpdmVJbmRleCIsImxhc3RBY3RpdmVBY3Rpb24iLCJiaW5kaW5nQnlOYW1lIiwicHJvcEJpbmRpbmciLCJsYXN0SW5hY3RpdmVCaW5kaW5nIiwicmVtb3ZlX2VtcHR5X21hcCIsImZpcnN0SW5hY3RpdmVCaW5kaW5nIiwibGFzdEFjdGl2ZUJpbmRpbmciLCJfY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlciIsIl9fY2FjaGVJbmRleCIsImxhc3RBY3RpdmVJbnRlcnBvbGFudCIsImNsaXBBY3Rpb24iLCJvcHRpb25hbFJvb3QiLCJjbGlwT2JqZWN0IiwiZXhpc3RpbmdBY3Rpb24iLCJuZXdBY3Rpb24iLCJzdG9wQWxsQWN0aW9uIiwibkFjdGlvbnMiLCJ1bmNhY2hlQ2xpcCIsImFjdGlvbnNUb1JlbW92ZSIsInVuY2FjaGVSb290IiwidW5jYWNoZUFjdGlvbiIsIlVuaWZvcm0iLCJJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSIsImludGVybGVhdmVkQnVmZmVyIiwiSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUiLCJJbnRlcmxlYXZlZEJ1ZmZlciIsImlzSW50ZXJsZWF2ZWRCdWZmZXIiLCJJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciIsIkluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSIsIlBvaW50Q2xvdWQiLCJpbnRlcnNlY3RPYmplY3QiLCJSYXljYXN0ZXIiLCJzZXRGcm9tQ2FtZXJhIiwiY29vcmRzIiwiYXNjU29ydCIsImludGVyc2VjdE9iamVjdHMiLCJhdXRvU3RhcnQiLCJvbGRUaW1lIiwiZWxhcHNlZFRpbWUiLCJydW5uaW5nIiwiQ2xvY2siLCJEYXRlIiwicGVyZm9ybWFuY2UiLCJnZXRFbGFwc2VkVGltZSIsImdldERlbHRhIiwibmV3VGltZSIsIlNwaGVyaWNhbCIsIm90aGVyIiwibWFrZVNhZmUiLCJ2ZWMzIiwiQ3lsaW5kcmljYWwiLCJCb3gyIiwiSW1tZWRpYXRlUmVuZGVyT2JqZWN0Iiwib2JqR2VvbWV0cnkiLCJuTm9ybWFscyIsIlZlcnRleE5vcm1hbHNIZWxwZXIiLCJvYmpQb3MiLCJvYmpOb3JtIiwiY29uZSIsIlNwb3RMaWdodEhlbHBlciIsImNvbmVMZW5ndGgiLCJjb25lV2lkdGgiLCJib25lTGlzdCIsImdldEJvbmVMaXN0IiwiU2tlbGV0b25IZWxwZXIiLCJtYXRyaXhXb3JsZEludiIsImJvbmVNYXRyaXgiLCJzcGhlcmVTaXplIiwiUG9pbnRMaWdodEhlbHBlciIsIlJlY3RBcmVhTGlnaHRIZWxwZXIiLCJIZW1pc3BoZXJlTGlnaHRIZWxwZXIiLCJHcmlkSGVscGVyIiwicmFkaWFscyIsImNpcmNsZXMiLCJQb2xhckdyaWRIZWxwZXIiLCJGYWNlTm9ybWFsc0hlbHBlciIsImxpZ2h0UGxhbmUiLCJ0YXJnZXRMaW5lIiwiRGlyZWN0aW9uYWxMaWdodEhlbHBlciIsImFkZExpbmUiLCJjb2xvckZydXN0dW0iLCJjb2xvckNvbmUiLCJjb2xvclVwIiwiY29sb3JUYXJnZXQiLCJjb2xvckNyb3NzIiwiYWRkUG9pbnQiLCJwb2ludE1hcCIsIkNhbWVyYUhlbHBlciIsInNldFBvaW50IiwiQm94SGVscGVyIiwiQm94M0hlbHBlciIsInBvc2l0aW9uczIiLCJQbGFuZUhlbHBlciIsImhlYWRMZW5ndGgiLCJoZWFkV2lkdGgiLCJsaW5lR2VvbWV0cnkiLCJjb25lR2VvbWV0cnkiLCJzZXREaXJlY3Rpb24iLCJBcnJvd0hlbHBlciIsInNldENvbG9yIiwiQXhlc0hlbHBlciIsImNvbnN0cnVjdCIsImNyZWF0ZVBvaW50c0dlb21ldHJ5IiwiY3JlYXRlR2VvbWV0cnkiLCJjcmVhdGVTcGFjZWRQb2ludHNHZW9tZXRyeSIsImZyb21Qb2ludHMiLCJTcGxpbmUiLCJpbml0RnJvbUFycmF5IiwiZ2V0Q29udHJvbFBvaW50c0FycmF5IiwicmVwYXJhbWV0cml6ZUJ5QXJjTGVuZ3RoIiwic2V0Q29sb3JzIiwiaXNJbnRlcnNlY3Rpb25Cb3giLCJpc0ludGVyc2VjdGlvblNwaGVyZSIsInJhbmRvbTE2IiwibmVhcmVzdFBvd2VyT2ZUd28iLCJuZXh0UG93ZXJPZlR3byIsImZsYXR0ZW5Ub0FycmF5T2Zmc2V0IiwibXVsdGlwbHlWZWN0b3IzIiwibXVsdGlwbHlWZWN0b3IzQXJyYXkiLCJhcHBseVRvQnVmZmVyIiwiYXBwbHlUb1ZlY3RvcjNBcnJheSIsImV4dHJhY3RQb3NpdGlvbiIsImdldFBvc2l0aW9uIiwibXVsdGlwbHlUb0FycmF5IiwibXVsdGlwbHlWZWN0b3I0Iiwicm90YXRlQXhpcyIsImNyb3NzVmVjdG9yIiwicm90YXRlQnlBeGlzIiwibWFrZUZydXN0dW0iLCJpc0ludGVyc2VjdGlvbkxpbmUiLCJpc0ludGVyc2VjdGlvblBsYW5lIiwiYmFyeWNvb3JkRnJvbVBvaW50IiwibWlkcG9pbnQiLCJleHRyYWN0QWxsUG9pbnRzIiwiZXh0cnVkZSIsIm1ha2VHZW9tZXRyeSIsImZyb21BdHRyaWJ1dGUiLCJkaXN0YW5jZVRvTWFuaGF0dGFuIiwibGVuZ3RoTWFuaGF0dGFuIiwic2V0RXVsZXJGcm9tUm90YXRpb25NYXRyaXgiLCJzZXRFdWxlckZyb21RdWF0ZXJuaW9uIiwiZ2V0UG9zaXRpb25Gcm9tTWF0cml4IiwiZ2V0U2NhbGVGcm9tTWF0cml4IiwiZ2V0Q29sdW1uRnJvbU1hdHJpeCIsImFwcGx5UHJvamVjdGlvbiIsImNvbXB1dGVUYW5nZW50cyIsImdldENoaWxkQnlOYW1lIiwicmVuZGVyRGVwdGgiLCJnZXRXb3JsZFJvdGF0aW9uIiwiZXVsZXJPcmRlciIsInVzZVF1YXRlcm5pb24iLCJzZXRMZW5zIiwib25seVNoYWRvdyIsInNoYWRvd0NhbWVyYUZvdiIsInNoYWRvd0NhbWVyYUxlZnQiLCJzaGFkb3dDYW1lcmFSaWdodCIsInNoYWRvd0NhbWVyYVRvcCIsInNoYWRvd0NhbWVyYUJvdHRvbSIsInNoYWRvd0NhbWVyYVZpc2libGUiLCJzaGFkb3dEYXJrbmVzcyIsInNoYWRvd01hcFdpZHRoIiwic2hhZG93TWFwSGVpZ2h0IiwiY29weUluZGljZXNBcnJheSIsImFkZEluZGV4IiwiYWRkRHJhd0NhbGwiLCJjbGVhckRyYXdDYWxscyIsImNvbXB1dGVPZmZzZXRzIiwiZ2V0QXJyYXlzIiwiYWRkU2hhcGVMaXN0Iiwid3JhcEFyb3VuZCIsIndyYXBSR0IiLCJtZXRhbCIsIldlYkdMUmVuZGVyZXIiLCJnZXRDdXJyZW50UmVuZGVyVGFyZ2V0IiwiZ2V0UHJlY2lzaW9uIiwicmVzZXRHTFN0YXRlIiwic3VwcG9ydHNGbG9hdFRleHR1cmVzIiwic3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlcyIsInN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlcyIsInN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDIiwic3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDIiwic3VwcG9ydHNCbGVuZE1pbk1heCIsInN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzIiwiZW5hYmxlU2Npc3NvclRlc3QiLCJhZGRQcmVQbHVnaW4iLCJhZGRQb3N0UGx1Z2luIiwidXBkYXRlU2hhZG93TWFwIiwic2V0RmFjZUN1bGxpbmciLCJzaGFkb3dNYXBDdWxsRmFjZSIsIldlYkdMU2hhZG93TWFwIiwicmVuZGVyUmV2ZXJzZVNpZGVkIiwicmVuZGVyU2luZ2xlU2lkZWQiLCJXZWJWUk1hbmFnZXIiLCJzdGFuZGluZyIsImF1ZGlvTG9hZGVyIiwiZ2V0RGF0YSIsInVwZGF0ZUN1YmVNYXAiLCJvbiIsImN0eCIsImV2ZW50cyIsIm9mZiIsIlRZUEUiLCJfZiIsImdldENvbnN0cnVjdG9yIiwiSVNfTUFQIiwiQURERVIiLCJfbCIsIlNJWkUiLCJfdmFsaWRhdGVDb2xsZWN0aW9uIiwiZ2V0RW50cnkiLCJoYXMiLCJkUCQyIiwic2V0U3Ryb25nIiwib3JpZ2luYWwiLCJTUEVDSUVTJDIiLCJfYXJyYXlTcGVjaWVzQ29uc3RydWN0b3IiLCJJU19GSU5EX0lOREVYIiwiX2FycmF5U3BlY2llc0NyZWF0ZSIsIl9pb2JqZWN0IiwiSVNfRklMVEVSIiwicmVzIiwiTk9fSE9MRVMiLCJJU19FVkVSWSIsIklTX1NPTUUiLCJfYXJyYXlNZXRob2RzIiwiSVNfV0VBSyIsImVhY2giLCJJU19BRERFUiIsImRQJDMiLCJfY29sbGVjdGlvbiIsIk1BUCIsIl9jb2xsZWN0aW9uU3Ryb25nIiwiX2NvbGxlY3Rpb25Ub0pzb24iLCJDT0xMRUNUSU9OIiwib2YiLCJBIiwiX3NldENvbGxlY3Rpb25PZiIsIm1hcEZuIiwibmV4dEl0ZW0iLCJfc2V0Q29sbGVjdGlvbkZyb20iLCJNYXAiLCJmYWN0b3JpZXMiLCJwYXJ0QXJncyIsImJvdW5kIiwiUmVmbGVjdCIsInJDb25zdHJ1Y3QiLCJORVdfVEFSR0VUX0JVRyIsIkFSR1NfQlVHIiwiVGFyZ2V0IiwibmV3VGFyZ2V0IiwiJGFyZ3MiLCJfYmluZCIsImNvbnN0cnVjdCQxIiwiUGFyZW50IiwiQ2xhc3MiLCJjb25zdHJ1Y3QkMiIsIl9jb25zdHJ1Y3QiLCJfd3JhcE5hdGl2ZVN1cGVyIiwiX2NhY2hlIiwiY3JlYXRlJDEiLCJnZXRQcm90b3R5cGVPZiQyIiwiX0Vycm9yIiwiY2xhc3NJbnN0YW5jZSIsImNvbXBvbmVudCIsImNsYXNzQ2FsbENoZWNrIiwiQ29tcG9zaXRpb25FcnJvciIsInBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJzdGFjayIsInN0YWNrQXJyYXkiLCJpbmhlcml0cyIsIndyYXBOYXRpdmVTdXBlciIsIkVycm9yIiwiX0Vycm9yMiIsImFjdGl2ZU1vZHVsZSIsIkRlcGVuZGVuY3lFcnJvciIsIl90aGlzMiIsImRlcGVuZGVuY3lNb2R1bGUiLCJfRXJyb3IzIiwiTWFuYWdlckVycm9yIiwiX3RoaXMzIiwid2FybkRlcHMiLCJfRXZlbnRzIiwiTW9kdWxlU3lzdGVtIiwiY3JlYXRlQ2xhc3MiLCJtb2R1bGVzIiwiYXBwbHlNb2R1bGUiLCJhcHBseUJyaWRnZSIsIm9uQ29weSIsImJyaWRnZU1hcCIsImJyaWRnZSIsIm1vZHVsZVNjb3BlIiwiYWN0aXZlIiwiaW50ZWdyYXRlIiwiZGlzcG9zZU1vZHVsZSIsIl9tb2R1bGUiLCJtaW5pdmVudHNfY29tbW9uanMiLCJfYXJyYXlXaXRoSG9sZXMiLCJnZXRJdGVyYXRvciIsImNvcmVfZ2V0SXRlcmF0b3IiLCJnZXRJdGVyYXRvciQxIiwiX2FyciIsIl9lIiwiX2l0ZXJhYmxlVG9BcnJheUxpbWl0IiwiX25vbkl0ZXJhYmxlUmVzdCIsIml0ZXJhYmxlVG9BcnJheUxpbWl0Iiwibm9uSXRlcmFibGVSZXN0IiwiX3NsaWNlZFRvQXJyYXkiLCJvYnNlcnZhYmxlIiwic3ltYm9sT2JzZXJ2YWJsZVBvbnlmaWxsIiwiSU5JVCIsIlJFUExBQ0UiLCJyZWR1Y2VyIiwicHJlbG9hZGVkU3RhdGUiLCJlbmhhbmNlciIsImNyZWF0ZVN0b3JlIiwiY3VycmVudExpc3RlbmVycyIsIm5leHRMaXN0ZW5lcnMiLCJpc0Rpc3BhdGNoaW5nIiwiZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycyIsImlzU3Vic2NyaWJlZCIsImlzUGxhaW5PYmplY3QiLCJjdXJyZW50U3RhdGUiLCJjdXJyZW50UmVkdWNlciIsIm5leHRSZWR1Y2VyIiwiZGlzcGF0Y2giLCJBY3Rpb25UeXBlcyIsInN1YnNjcmliZSIsIm9ic2VydmVyIiwiZ2V0U3RhdGUiLCJvYnNlcnZlU3RhdGUiLCJvdXRlclN1YnNjcmliZSIsInVuc3Vic2NyaWJlIiwiX3JlZiIsInJlcGxhY2VSZWR1Y2VyIiwiX3JlZjIiLCJNb2R1bGVNYW5hZ2VyIiwiY3VycmVudE1vZHVsZSIsIl90aGlzJHN0b3JlJGdldFN0YXRlMiIsInNsaWNlZFRvQXJyYXkiLCJfdGhpcyRzdG9yZSRnZXRTdGF0ZSIsImNoYW5nZWRLZXkiLCJkZXBzTWFwIiwibW9kdWxlRXhlY3V0b3IiLCJ1c2UiLCJfTW9kdWxlU3lzdGVtIiwiQ29tcG9uZW50IiwiZGVmYXVsdHMiLCJhc3NlcnRUaGlzSW5pdGlhbGl6ZWQiLCJpbnRlZ3JhdGVNb2R1bGVzIiwiX3dhaXQiLCJpc0RlZmZlcmVkIiwid2FpdCIsImN1c3RvbWl6ZSIsIm9iamVjdFNwcmVhZCIsIm5hdGl2ZSIsImFzeW5jVG9HZW5lcmF0b3IiLCJyZWdlbmVyYXRvciIsIm9uQWRkIiwiX2NhbGxlZSIsIl9jb250ZXh0MiIsIl9jYWxsZWUyIiwiX3gyIiwiX21hbmFnZXIiLCJfbmF0aXZlIiwicHJvcGVydHlLZXkiLCJyZWNlaXZlciIsImdldCQxIiwicHJvcGVydHkiLCJfc3VwZXJQcm9wQmFzZSIsImdldCQyIiwiX2dldCIsInN1cGVyUHJvcEJhc2UiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IkMSIsIm1hcHBlcnMiLCJtYXBwZXIiLCJnZXR0ZXIiLCJfbGVuMiIsIl9rZXkyIiwiX2xlbjMiLCJfa2V5MyIsIl9jbGFzcyIsIk1lc2hDb21wb25lbnQiLCJfZGVjIiwibWlycm9yIiwiX0NvbXBvbmVudCIsImdlb20iLCJfTWVzaENvbXBvbmVudCIsIl9jbGFzczIiLCJfdGhpcyRhcHBseUJyaWRnZSIsImN1c3RvbSIsImJ1aWxkIiwiYXBwbHlDb21tYW5kIiwiX3RoaXMyJHBhcmFtcyIsImNhc3QiLCJyZWNlaXZlIiwib25XcmFwIiwiX2NsYXNzJDEiLCJMaWdodENvbXBvbmVudCIsIl9kZWMkMSIsIndyYXBTaGFkb3ciLCJfY2xhc3MkMiIsIkNhbWVyYUNvbXBvbmVudCIsIl9kZWMkMiIsIkFwcCIsInN5c3RlbSIsIndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSIsIm1velJlcXVlc3RBbmltYXRpb25GcmFtZSIsImxvb3BzIiwicmVxdWVzdEFuaW1GcmFtZSIsImxsIiwiZXhlY3V0ZSIsImNsb2NrIiwiTG9vcCIsInVzZUNsb2NrIiwid29ybGQiLCJhZGRMb29wIiwicmVtb3ZlTG9vcCIsIl9MaWdodENvbXBvbmVudCIsIkFtYmllbnRMaWdodCQkMSIsIkFtYmllbnRMaWdodCQxIiwiRGlyZWN0aW9uYWxMaWdodCQkMSIsIkRpcmVjdGlvbmFsTGlnaHQkMSIsIkhlbWlzcGhlcmVMaWdodCQkMSIsIkhlbWlzcGhlcmVMaWdodCQxIiwiUG9pbnRMaWdodCQkMSIsIlBvaW50TGlnaHQkMSIsIlNwb3RMaWdodCQkMSIsImV4cG9uZW50IiwiU3BvdExpZ2h0JDEiLCJBcmVhTGlnaHQiLCJfQ2FtZXJhQ29tcG9uZW50IiwiQ3ViZUNhbWVyYSQkMSIsIkN1YmVDYW1lcmEkMSIsIk9ydGhvZ3JhcGhpY0NhbWVyYSQkMSIsIk9ydGhvZ3JhcGhpY0NhbWVyYSQxIiwiaW5uZXJXaWR0aCIsImlubmVySGVpZ2h0IiwiUGVyc3BlY3RpdmVDYW1lcmEkJDEiLCJQZXJzcGVjdGl2ZUNhbWVyYSQxIiwiQm94IiwiYnVpbGRHZW9tZXRyeSIsIkNpcmNsZSIsIkNvbmUiLCJnZXQkMyIsInJhZGl1c1NlZ21lbnRzIiwiQ3lsaW5kZXIiLCJEb2RlY2FoZWRyb24iLCJFeHRydWRlIiwiSWNvc2FoZWRyb24iLCJMYXRoZSIsIkxpbmUkJDEiLCJ2ZXJ0cyIsImkzIiwiTGluZSQxIiwiSW1wb3J0ZXIiLCJfZmlsdGVyIiwicHJvY2Vzc0ZpbHRlciIsInVzZUN1c3RvbU1hdGVyaWFsIiwiT2N0YWhlZHJvbiIsIlBhcmFtZXRyaWMiLCJQbGFuZSQkMSIsIndTZWdtZW50cyIsImhTZWdtZW50cyIsIlBsYW5lJDEiLCJpbmRpY2VzT2ZGYWNlcyIsIlBvbHloZWRyb24iLCJ2ZXJ0aWNlc09mQ3ViZSIsIlJpbmciLCJTaGFwZSQkMSIsIlNoYXBlJDEiLCJTcGhlcmUkJDEiLCJTcGhlcmUkMSIsIlRldHJhaGVkcm9uIiwiVGV4dCIsIlRvcnVzIiwiVG9ydXNrbm90IiwiVHViZSIsIkdyb3VwJCQxIiwiYWRkVG8iLCJib2R5IiwiRWxlbWVudE1vZHVsZSIsImNsYXNzTmFtZSIsIlJlbmRlcmluZ01vZHVsZSIsImRldmljZVBpeGVsUmF0aW8iLCJiZ0NvbG9yIiwiYmdPcGFjaXR5IiwiZml4IiwiX3RoaXMkcGFyYW1zIiwiZWZmZWN0cyIsInRvRml4ZWQiLCJhZGRpdGlvbmFsIiwiYXBwbHlBZGRpdGlvbmFsIiwiYXR0YWNoVG9DYW52YXMiLCJfZWZmZWN0IiwicmVuZGVyTG9vcCIsImVmZmVjdExvb3AiLCJhcHAiLCJkZWZpbmUiLCJpbnRlZ3JhdGVSZW5kZXJlciIsIl9lbGVtZW50IiwiX3NjZW5lIiwiX2NhbWVyYSIsIl90aGlzNCIsIlNjZW5lTW9kdWxlIiwid2lsbFNjZW5lQmVSZXBsYWNlZCIsIl9zZXRTY2VuZSIsIlNZTUJPTF9DSElMRFJFTl9GT1JfU0NFTkUiLCJzZXRTY2VuZSIsImdldFNjZW5lIiwiUmVzaXplTW9kdWxlIiwiYXV0byIsInJlbmRlcmluZyIsIm9mZnNldFdpZHRoIiwiX3RoaXMkY29udGFpbmVyIiwib2Zmc2V0SGVpZ2h0IiwiZ2V0Q29udGFpbmVyIiwiZ2V0UmVzb2x1dGlvbiIsInRyaWdnZXIiLCJfY29udGFpbmVyIiwiYWRkQXV0b3Jlc2l6ZSIsIl9TaGFkZXJNYXRlcmlhbCIsIkFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsIiwiTUlQX0xFVkVMXzFYMSIsInRQcmV2aW91c0x1bSIsInRDdXJyZW50THVtIiwibWluTHVtaW5hbmNlIiwidGF1IiwiZnJhZ21lbnQiLCJCb2tlaE1hdGVyaWFsIiwiZG9mIiwiYXBlcnR1cmUiLCJtYXhCbHVyIiwiY2FtZXJhTmVhciIsImNhbWVyYUZhciIsInREaWZmdXNlIiwidERlcHRoIiwiZnJhZ21lbnQkMSIsInZlcnRleCQxIiwiYWRvcHRDYW1lcmFTZXR0aW5ncyIsIkNvbG9yRWRnZXNNYXRlcmlhbCIsIkVER0VfVEhSRVNIT0xEIiwidGV4ZWxTaXplIiwiZnJhZ21lbnQkMiIsInZlcnRleCQyIiwiQ29tYmluZU1hdGVyaWFsIiwidGV4dHVyZTEiLCJ0ZXh0dXJlMiIsIm9wYWNpdHkxIiwib3BhY2l0eTIiLCJmcmFnbWVudCQzIiwidmVydGV4JDMiLCJzZXRTY3JlZW5Nb2RlRW5hYmxlZCIsInNjcmVlbk1vZGUiLCJTQ1JFRU5fTU9ERSIsIkNvbnZvbHV0aW9uTWF0ZXJpYWwiLCJoYWxmVGV4ZWxTaXplIiwia2VybmVsIiwiZnJhZ21lbnQkNCIsInZlcnRleCQ0Iiwic2V0VGV4ZWxTaXplIiwia2VybmVsU2l6ZSIsIktlcm5lbFNpemUiLCJMQVJHRSIsIlZFUllfU01BTEwiLCJTTUFMTCIsIk1FRElVTSIsIlZFUllfTEFSR0UiLCJIVUdFIiwiQ29weU1hdGVyaWFsIiwiZnJhZ21lbnQkNSIsInZlcnRleCQ1IiwiRGVwdGhDb21wYXJpc29uTWF0ZXJpYWwiLCJmcmFnbWVudCQ2IiwidmVydGV4JDYiLCJQRVJTUEVDVElWRV9DQU1FUkEiLCJEb3RTY3JlZW5NYXRlcmlhbCIsImF2ZXJhZ2UiLCJvZmZzZXRSZXBlYXQiLCJmcmFnbWVudCQ3IiwidmVydGV4JDciLCJzZXRBdmVyYWdlRW5hYmxlZCIsIkFWRVJBR0UiLCJGaWxtTWF0ZXJpYWwiLCJub2lzZSIsInNjYW5saW5lcyIsImdyZXlzY2FsZSIsInNlcGlhIiwidmlnbmV0dGUiLCJlc2tpbCIsIm5vaXNlSW50ZW5zaXR5Iiwic2NhbmxpbmVJbnRlbnNpdHkiLCJncmlkSW50ZW5zaXR5IiwiZ3JleXNjYWxlSW50ZW5zaXR5Iiwic2VwaWFJbnRlbnNpdHkiLCJ2aWduZXR0ZU9mZnNldCIsInZpZ25ldHRlRGFya25lc3MiLCJzY2FubGluZUNvdW50IiwiZ3JpZFNjYWxlIiwiZ3JpZExpbmVXaWR0aCIsImZyYWdtZW50JDgiLCJ2ZXJ0ZXgkOCIsInNldE5vaXNlRW5hYmxlZCIsInNldFNjYW5saW5lc0VuYWJsZWQiLCJzZXRHcmlkRW5hYmxlZCIsInNldEdyZXlzY2FsZUVuYWJsZWQiLCJzZXRTZXBpYUVuYWJsZWQiLCJzZXRWaWduZXR0ZUVuYWJsZWQiLCJzZXRFc2tpbEVuYWJsZWQiLCJOT0lTRSIsIlNDQU5MSU5FUyIsIkdSSUQiLCJHUkVZU0NBTEUiLCJTRVBJQSIsIlZJR05FVFRFIiwiRVNLSUwiLCJHbGl0Y2hNYXRlcmlhbCIsInRQZXJ0dXJiIiwic2VlZCIsInNlZWRYIiwic2VlZFkiLCJkaXN0b3J0aW9uWCIsImRpc3RvcnRpb25ZIiwiY29sUyIsImZyYWdtZW50JDkiLCJ2ZXJ0ZXgkOSIsIkdvZFJheXNNYXRlcmlhbCIsImV4cG9zdXJlIiwiY2xhbXBNYXgiLCJOVU1fU0FNUExFU19GTE9BVCIsIk5VTV9TQU1QTEVTX0lOVCIsImxpZ2h0UG9zaXRpb24iLCJmcmFnbWVudCQxMCIsInZlcnRleCQxMCIsIkx1bWlub3NpdHlNYXRlcmlhbCIsImx1bWluYW5jZVJhbmdlIiwiZGlzdGluY3Rpb24iLCJtYXNrTHVtaW5hbmNlIiwiZnJhZ21lbnQkMTEiLCJ2ZXJ0ZXgkMTEiLCJzZXRDb2xvck91dHB1dEVuYWJsZWQiLCJjb2xvck91dHB1dCIsInNldEx1bWluYW5jZVJhbmdlRW5hYmxlZCIsIkNPTE9SIiwiUkFOR0UiLCJPdXRsaW5lQmxlbmRNYXRlcmlhbCIsImVkZ2VTdHJlbmd0aCIsInBhdHRlcm5TY2FsZSIsInZpc2libGVFZGdlQ29sb3IiLCJoaWRkZW5FZGdlQ29sb3IiLCJhbHBoYUJsZW5kaW5nIiwieFJheSIsInB1bHNlIiwidE1hc2siLCJ0RWRnZXMiLCJ0UGF0dGVybiIsImZyYWdtZW50JDEyIiwidmVydGV4JDEyIiwic2V0QWxwaGFCbGVuZGluZ0VuYWJsZWQiLCJzZXRYUmF5RW5hYmxlZCIsIkFMUEhBX0JMRU5ESU5HIiwiWF9SQVkiLCJVU0VfUEFUVEVSTiIsIk91dGxpbmVFZGdlc01hdGVyaWFsIiwiZnJhZ21lbnQkMTMiLCJ2ZXJ0ZXgkMTMiLCJQaXhlbGF0aW9uTWF0ZXJpYWwiLCJncmFudWxhcml0eSIsImZyYWdtZW50JDE0IiwidmVydGV4JDE0IiwiUmVhbGlzdGljQm9rZWhNYXRlcmlhbCIsInJpbmdzIiwic2FtcGxlcyIsInNob3dGb2N1cyIsIm1hbnVhbERvRiIsInBlbnRhZ29uIiwic2hhZGVyRm9jdXMiLCJsdW1pbmFuY2VUaHJlc2hvbGQiLCJsdW1pbmFuY2VHYWluIiwiZnJpbmdlIiwiZGl0aGVyU3RyZW5ndGgiLCJSSU5HU19JTlQiLCJSSU5HU19GTE9BVCIsIlNBTVBMRVNfSU5UIiwiU0FNUExFU19GTE9BVCIsImZvY2FsU3RvcCIsImZvY3VzQ29vcmRzIiwiZm9jYWxEZXB0aCIsImZyYWdtZW50JDE1IiwidmVydGV4JDE1Iiwic2V0U2hvd0ZvY3VzRW5hYmxlZCIsInNldE1hbnVhbERlcHRoT2ZGaWVsZEVuYWJsZWQiLCJzZXRQZW50YWdvbkVuYWJsZWQiLCJzZXRTaGFkZXJGb2N1c0VuYWJsZWQiLCJTSE9XX0ZPQ1VTIiwiTUFOVUFMX0RPRiIsIlBFTlRBR09OIiwiU0hBREVSX0ZPQ1VTIiwiU2hvY2tXYXZlTWF0ZXJpYWwiLCJtYXhSYWRpdXMiLCJ3YXZlU2l6ZSIsImFtcGxpdHVkZSIsImNhbWVyYURpc3RhbmNlIiwiZnJhZ21lbnQkMTYiLCJ2ZXJ0ZXgkMTYiLCJTTUFBQmxlbmRNYXRlcmlhbCIsInRXZWlnaHRzIiwiZnJhZ21lbnQkMTciLCJ2ZXJ0ZXgkMTciLCJTTUFBV2VpZ2h0c01hdGVyaWFsIiwiTUFYX1NFQVJDSF9TVEVQU19JTlQiLCJNQVhfU0VBUkNIX1NURVBTX0ZMT0FUIiwiQVJFQVRFWF9NQVhfRElTVEFOQ0UiLCJBUkVBVEVYX1BJWEVMX1NJWkUiLCJBUkVBVEVYX1NVQlRFWF9TSVpFIiwiU0VBUkNIVEVYX1NJWkUiLCJTRUFSQ0hURVhfUEFDS0VEX1NJWkUiLCJ0QXJlYSIsInRTZWFyY2giLCJmcmFnbWVudCQxOCIsInZlcnRleCQxOCIsIlRvbmVNYXBwaW5nTWF0ZXJpYWwiLCJsdW1pbmFuY2VNYXAiLCJhdmVyYWdlTHVtaW5hbmNlIiwibWF4THVtaW5hbmNlIiwibWlkZGxlR3JleSIsImZyYWdtZW50JDE5IiwidmVydGV4JDE5IiwiUGFzcyIsInF1YWQiLCJyZW5kZXJUb1NjcmVlbiIsIm5lZWRzU3dhcCIsImlucHV0QnVmZmVyIiwib3V0cHV0QnVmZmVyIiwiX1Bhc3MiLCJCbHVyUGFzcyIsInJlbmRlclRhcmdldFgiLCJyZW5kZXJUYXJnZXRZIiwicmVzb2x1dGlvblNjYWxlIiwiY29udm9sdXRpb25NYXRlcmlhbCIsImRpdGhlcmVkQ29udm9sdXRpb25NYXRlcmlhbCIsImdldEtlcm5lbCIsImRlc3RSVCIsImxhc3RSVCIsIkJsb29tUGFzcyIsImJsdXJQYXNzIiwiY29tYmluZU1hdGVyaWFsIiwibHVtaW5vc2l0eU1hdGVyaWFsIiwiYmxlbmQiLCJpbml0aWFsaXplIiwiQm9rZWhQYXNzIiwiQ2xlYXJNYXNrUGFzcyIsIkNsZWFyUGFzcyIsIkRvdFNjcmVlblBhc3MiLCJGaWxtUGFzcyIsInNjYW5saW5lRGVuc2l0eSIsIkdsaXRjaFBhc3MiLCJwZXJ0dXJiTWFwIiwiZ2VuZXJhdGVQZXJ0dXJiTWFwIiwiZHRTaXplIiwiR2xpdGNoTW9kZSIsIlNQT1JBRElDIiwiYnJlYWtQb2ludCIsInJhbmRvbUludCIsImR0IiwiQ09OU1RBTlRfV0lMRCIsInJhbmRvbUZsb2F0IiwiQ09OU1RBTlRfTUlMRCIsIlJlbmRlclBhc3MiLCJjbGVhclBhc3MiLCJsaWdodFNvdXJjZSIsIkdvZFJheXNQYXNzIiwibGlnaHRTY2VuZSIsIm1haW5TY2VuZSIsIm1haW5DYW1lcmEiLCJyZW5kZXJUYXJnZXRNYXNrIiwicmVuZGVyUGFzc0xpZ2h0IiwicmVuZGVyUGFzc01hc2siLCJzY3JlZW5Qb3NpdGlvbiIsImdvZFJheXNNYXRlcmlhbCIsIk1hc2tQYXNzIiwid3JpdGVWYWx1ZSIsImNsZWFyVmFsdWUiLCJLRUVQIiwiU2hhZGVyUGFzcyIsInRleHR1cmVJRCIsIk91dGxpbmVQYXNzIiwicmVuZGVyVGFyZ2V0RGVwdGgiLCJyZW5kZXJUYXJnZXRFZGdlcyIsInJlbmRlclRhcmdldEJsdXJyZWRFZGdlcyIsInJlbmRlclBhc3NEZXB0aCIsImNvcHlQYXNzIiwib3V0bGluZUVkZ2VzTWF0ZXJpYWwiLCJvdXRsaW5lQmxlbmRNYXRlcmlhbCIsImJsdXIiLCJzZWxlY3Rpb24iLCJwdWxzZVNwZWVkIiwic2VsZWN0aW9uTGF5ZXIiLCJzZXRQYXR0ZXJuVGV4dHVyZSIsImNsZWFyU2VsZWN0aW9uIiwic2V0U2VsZWN0aW9uVmlzaWJsZSIsIlBpeGVsYXRpb25QYXNzIiwic2V0UmVzb2x1dGlvbiIsIlJlYWxpc3RpY0Jva2VoUGFzcyIsIlNhdmVQYXNzIiwicmVzaXplIiwiU2hvY2tXYXZlUGFzcyIsImVwaWNlbnRlciIsInNwZWVkIiwic2hvY2tXYXZlTWF0ZXJpYWwiLCJjb3B5TWF0ZXJpYWwiLCJIQUxGX1BJIiwic2VhcmNoSW1hZ2UiLCJhcmVhSW1hZ2UiLCJTTUFBUGFzcyIsInJlbmRlclRhcmdldENvbG9yRWRnZXMiLCJyZW5kZXJUYXJnZXRXZWlnaHRzIiwiY29sb3JFZGdlc01hdGVyaWFsIiwid2VpZ2h0c01hdGVyaWFsIiwic2VhcmNoVGV4dHVyZSIsImFyZWFUZXh0dXJlIiwiYmxlbmRNYXRlcmlhbCIsIlRleHR1cmVQYXNzIiwib3BhY2l0eVNvdXJjZSIsIlRvbmVNYXBwaW5nUGFzcyIsInJlbmRlclRhcmdldEx1bWlub3NpdHkiLCJyZW5kZXJUYXJnZXRBZGFwdGVkIiwicmVuZGVyVGFyZ2V0UHJldmlvdXMiLCJhZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbCIsInRvbmVNYXBwaW5nTWF0ZXJpYWwiLCJhZGFwdGl2ZSIsImxvZzIiLCJBREFQVEVEX0xVTUlOQU5DRSIsIkVmZmVjdENvbXBvc2VyIiwicGFzc2VzIiwib2xkU2l6ZSIsIm5ld1NpemUiLCJvbGRSZW5kZXJlciIsInBhcmVudE5vZGUiLCJkcmF3aW5nQnVmZmVyU2l6ZSIsInNob3dXYXJuIiwiUG9zdFByb2Nlc3Nvck1vZHVsZSIsImRlYnVnIiwiY29tcG9zZXIiLCJyZXBsYWNlUmVuZGVyZXIiLCJhZGRQYXNzIiwiY3VycmVudFBhc3MiLCJfcGFzcyIsInBvbHlmaWxsIiwiX3RoaXM1IiwiX3RoaXM2IiwiYm9vbCIsIkV2ZW50c1BhdGNoTW9kdWxlIiwib3JpZ2luT2JqZWN0IiwicGF0Y2hFdmVudHMiLCJWaXJ0dWFsTW91c2VNb2R1bGUiLCJnbG9iYWxNb3ZlbWVudCIsImN1c3RvbVgiLCJjdXN0b21ZIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiY2xpZW50WCIsImNsaWVudFkiLCJtb3VzZSIsInJlY3QiLCJwcm9qZWN0aW9uUGxhbmUiLCJyZXF1aXJlIiwiZXYiLCJnbG9iYWxYIiwiZ2xvYmFsWSIsInBvaW50ZXJMb2NrRWxlbWVudCIsIm1vdmVtZW50WCIsIm1vdmVtZW50WSIsImhvdmVycyIsIm5lc3RlZCIsImlzSG92ZXJlZCIsIkNvbnRyb2xzTW9kdWxlIiwiY29udHJvbHMiLCJ1cGRhdGVMb29wIiwiRm9nTW9kdWxlIiwiU3RhdGVNb2R1bGUiLCJpc0VxdWFsIiwiaXNFcXVhbERlZmF1bHQiLCJhY3Rpb25HZW5lcmF0ZSIsImVxdWFsQ2hlY2siLCJjb25maWd1cmF0aW9uIiwiY3VycmVudENvbmZpZyIsInByZXZDb25maWciLCJjb25maWciLCJkZWZhdWx0IiwiY29uZmlncyIsInVwZGF0ZXMiLCJjb25maWdOYW1lIiwidHJ1ZVZhbCIsImZhbHNlVmFsIiwiX0V2ZW50RGlzcGF0Y2hlciIsImV2ZW50SGFuZGxlciIsIlRocmVlT3JiaXRDb250cm9scyIsIm1pblpvb20iLCJtYXhab29tIiwibWluUG9sYXJBbmdsZSIsIm1heFBvbGFyQW5nbGUiLCJtaW5BemltdXRoQW5nbGUiLCJtYXhBemltdXRoQW5nbGUiLCJlbmFibGVEYW1waW5nIiwiZGFtcGluZ0ZhY3RvciIsImVuYWJsZVpvb20iLCJ6b29tU3BlZWQiLCJlbmFibGVSb3RhdGUiLCJyb3RhdGVTcGVlZCIsImVuYWJsZVBhbiIsImtleVBhblNwZWVkIiwiYXV0b1JvdGF0ZSIsImF1dG9Sb3RhdGVTcGVlZCIsImVuYWJsZUtleXMiLCJVUCIsIkJPVFRPTSIsIm1vdXNlQnV0dG9ucyIsIk9SQklUIiwiTU9VU0UiLCJaT09NIiwiUEFOIiwidGFyZ2V0MCIsInBvc2l0aW9uMCIsInpvb20wIiwiZ2V0UG9sYXJBbmdsZSIsImdldEF6aW11dGhhbEFuZ2xlIiwiY2hhbmdlRXZlbnQiLCJTVEFURSIsIk5PTkUiLCJxdWF0Iiwic3BoZXJpY2FsIiwicm90YXRlTGVmdCIsImdldEF1dG9Sb3RhdGlvbkFuZ2xlIiwic3BoZXJpY2FsRGVsdGEiLCJwYW5PZmZzZXQiLCJxdWF0SW52ZXJzZSIsInpvb21DaGFuZ2VkIiwibGFzdFBvc2l0aW9uIiwibGFzdFF1YXRlcm5pb24iLCJvbkNvbnRleHRNZW51Iiwib25Nb3VzZURvd24iLCJvbk1vdXNlV2hlZWwiLCJvblRvdWNoU3RhcnQiLCJvblRvdWNoRW5kIiwib25Ub3VjaE1vdmUiLCJvbk1vdXNlTW92ZSIsIm9uTW91c2VVcCIsIm9uS2V5RG93biIsIlJPVEFURSIsIkRPTExZIiwiVE9VQ0hfUk9UQVRFIiwiVE9VQ0hfRE9MTFkiLCJUT1VDSF9QQU4iLCJvYmplY3RNYXRyaXgiLCJkZWx0YVgiLCJkZWx0YVkiLCJ0YXJnZXREaXN0YW5jZSIsInBhbkxlZnQiLCJjbGllbnRIZWlnaHQiLCJwYW5VcCIsImNsaWVudFdpZHRoIiwiZG9sbHlTY2FsZSIsInJvdGF0ZVN0YXJ0IiwiZG9sbHlTdGFydCIsInBhblN0YXJ0Iiwicm90YXRlRW5kIiwicm90YXRlRGVsdGEiLCJyb3RhdGVVcCIsImRvbGx5RW5kIiwiZG9sbHlEZWx0YSIsImRvbGx5SW4iLCJnZXRab29tU2NhbGUiLCJkb2xseU91dCIsInBhbkVuZCIsInBhbkRlbHRhIiwicGFuIiwia2V5Q29kZSIsInRvdWNoZXMiLCJwYWdlWCIsInBhZ2VZIiwiYnV0dG9uIiwiaGFuZGxlTW91c2VEb3duUm90YXRlIiwiaGFuZGxlTW91c2VEb3duRG9sbHkiLCJoYW5kbGVNb3VzZURvd25QYW4iLCJzdGFydEV2ZW50IiwiaGFuZGxlTW91c2VNb3ZlUm90YXRlIiwiaGFuZGxlTW91c2VNb3ZlRG9sbHkiLCJoYW5kbGVNb3VzZU1vdmVQYW4iLCJlbmRFdmVudCIsInN0b3BQcm9wYWdhdGlvbiIsImhhbmRsZU1vdXNlV2hlZWwiLCJoYW5kbGVLZXlEb3duIiwiaGFuZGxlVG91Y2hTdGFydFJvdGF0ZSIsImhhbmRsZVRvdWNoU3RhcnREb2xseSIsImhhbmRsZVRvdWNoU3RhcnRQYW4iLCJoYW5kbGVUb3VjaE1vdmVSb3RhdGUiLCJoYW5kbGVUb3VjaE1vdmVEb2xseSIsImhhbmRsZVRvdWNoTW92ZVBhbiIsIl9Db250cm9sc01vZHVsZSIsIk9yYml0Q29udHJvbHNNb2R1bGUiLCJmb2xsb3ciLCJzZXRDb250cm9scyIsInNldFVwZGF0ZSIsInVwZGF0ZVByb2Nlc3NvciIsIkR5bmFtaWNHZW9tZXRyeU1vZHVsZSIsImdfIiwidXBkYXRlUGFyYW1zIiwiX2xvb3AiLCJUZXh0dXJlTW9kdWxlIiwiX21hdGVyaWFsIiwiX3JlZiR0eXBlIiwiX3JlZiRvZmZzZXQiLCJfcmVmJHJlcGVhdCIsIl9yZWYkd3JhcCIsIl9yZWYkbWFwcGluZyIsIl9yZWYkZml4IiwidGV4IiwiaXNEZWZlcnJlZCIsIkFuaW1hdGlvbk1vZHVsZSIsIl9tZXNoIiwiRGVmaW5lTW9kdWxlIiwiX0ltcG9ydGVyIiwiTW9kZWwiLCJfZ2V0UHJvdG90eXBlT2YyIiwiQ2FtZXJhTW9kdWxlIiwidGhpcyIsIlN0YXRzTW9kdWxlIiwiU3RhdHMiLCJzaG93UGFuZWwiLCJkb20iLCJhbGlhcyIsInByZVByb2Nlc3MiLCJiZWdpbiIsInBvc3RQcm9jZXNzIiwidW5zaGlmdCIsIm1zIiwibWIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7RUF5UkEsU0FBUyxlQUFlLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRTtFQUNoRCxFQUFFLElBQUksRUFBRSxRQUFRLFlBQVksV0FBVyxDQUFDLEVBQUU7RUFDMUMsSUFBSSxNQUFNLElBQUksU0FBUyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7RUFDN0QsR0FBRztFQUNILENBQUM7O0VBRUQsU0FBUyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFO0VBQzFDLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7RUFDekMsSUFBSSxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDOUIsSUFBSSxVQUFVLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDO0VBQzNELElBQUksVUFBVSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7RUFDbkMsSUFBSSxJQUFJLE9BQU8sSUFBSSxVQUFVLEVBQUUsVUFBVSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7RUFDMUQsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0VBQzlELEdBQUc7RUFDSCxDQUFDOztFQUVELFNBQVMsWUFBWSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVB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Q0FBVUMsRUFBVixDQUFlRixHQUFLSSxFQUFMLENBQVVDLEVBQW5DLENBRUEsQ0FQRCxRQU9ZNUosUUFBVSxLQUFmLENBQXVCLENBRTdCLEtBQUtlLEVBQUwsQ0FBVXdJLEdBQUtDLEVBQUwsQ0FBVUMsRUFBVixDQUFlQyxHQUFLQyxFQUFMLENBQVVDLEVBQW5DLENBQ0EsS0FBSzVJLEVBQUwsQ0FBVTBJLEdBQUtDLEVBQUwsQ0FBVUYsRUFBVixDQUFlRixHQUFLQyxFQUFMLENBQVVJLEVBQW5DLENBQ0EsS0FBSzNJLEVBQUwsQ0FBVXlJLEdBQUtGLEVBQUwsQ0FBVUksRUFBVixDQUFlTCxHQUFLSSxFQUFMLENBQVVGLEVBQW5DLENBQ0EsS0FBS25lLEVBQUwsQ0FBVW9lLEdBQUtGLEVBQUwsQ0FBVUMsRUFBVixDQUFlRixHQUFLSSxFQUFMLENBQVVDLEVBQW5DLENBRUEsQ0FQTSxRQU9LNUosUUFBVSxLQUFmLENBQXVCLENBRTdCLEtBQUtlLEVBQUwsQ0FBVXdJLEdBQUtDLEVBQUwsQ0FBVUMsRUFBVixDQUFlQyxHQUFLQyxFQUFMLENBQVVDLEVBQW5DLENBQ0EsS0FBSzVJLEVBQUwsQ0FBVTBJLEdBQUtDLEVBQUwsQ0FBVUYsRUFBVixDQUFlRixHQUFLQyxFQUFMLENBQVVJLEVBQW5DLENBQ0EsS0FBSzNJLEVBQUwsQ0FBVXlJLEdBQUtGLEVBQUwsQ0FBVUksRUFBVixDQUFlTCxHQUFLSSxFQUFMLENBQVVGLEVBQW5DLENBQ0EsS0FBS25lLEVBQUwsQ0FBVW9lLEdBQUtGLEVBQUwsQ0FBVUMsRUFBVixDQUFlRixHQUFLSSxFQUFMLENBQVVDLEVBQW5DLENBRUEsQ0FQTSxRQU9LNUosUUFBVSxLQUFmLENBQXVCLENBRTdCLEtBQUtlLEVBQUwsQ0FBVXdJLEdBQUtDLEVBQUwsQ0FBVUMsRUFBVixDQUFlQyxHQUFLQyxFQUFMLENBQVVDLEVBQW5DLENBQ0EsS0FBSzVJLEVBQUwsQ0FBVTBJLEdBQUtDLEVBQUwsQ0FBVUYsRUFBVixDQUFlRixHQUFLQyxFQUFMLENBQVVJLEVBQW5DLENBQ0EsS0FBSzNJ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UyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7RUFDcmdCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsY0FBYztFQUNwZixPQUFPLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLCtCQUErQixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3ZmLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FB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