{"version":3,"sources":["main.js"],"names":["e","t","n","r","s","o","u","a","require","i","f","Error","code","l","exports","call","length","1","module","_interopRequireDefault","obj","__esModule","default","_appCharityEventsBoard","_appCharityEventsBoard2","widgetName","./app/CharityEventsBoard","2","create","hb","_create","compile","input","options","_Compiler$compile$precompile","precompile","AST","_AST2","Compiler","JavaScriptCompiler","_JavaScriptCompiler2","Parser","_Parser$parse","parser","parse","_interopRequireWildcard","_runtime","_runtime2","_AST","_JavaScriptCompiler","_Visitor","_Visitor2","_noConflict","_noConflict2","inst","Visitor","./handlebars.runtime","./handlebars/compiler/ast","./handlebars/compiler/base","./handlebars/compiler/compiler","./handlebars/compiler/javascript-compiler","./handlebars/compiler/visitor","./handlebars/no-conflict","3","base","HandlebarsEnvironment","Utils","extend","SafeString","_SafeString2","Exception","_Exception2","escapeExpression","VM","runtime","template","spec","_import","_SafeString","_Exception","_import2","_import3","./handlebars/base","./handlebars/exception","./handlebars/runtime","./handlebars/safe-string","./handlebars/utils","4","helpers","partials","this","registerDefaultHelpers","instance","registerHelper","arguments","name","context","inverse","fn","isArray","ids","each","data","createFrame","contextPath","appendContextPath","execIteration","field","index","last","key","first","ret","blockParams","undefined","isFunction","j","priorKey","hasOwnProperty","conditional","hash","includeZero","isEmpty","message","level","parseInt","log","object","frame","_parent","VERSION","COMPILER_REVISION","REVISION_CHANGES","5","6","toString","objectType","prototype","constructor","logger","unregisterHelper","registerPartial","partial","unregisterPartial","methodMap","0","DEBUG","INFO","WARN","ERROR","console","method","./exception","./utils","Program","statements","strip","locInfo","loc","type","body","MustacheStatement","path","params","escaped","BlockStatement","program","openStrip","inverseStrip","closeStrip","PartialStatement","indent","ContentStatement","string","original","value","CommentStatement","comment","SubExpression","PathExpression","depth","parts","StringLiteral","NumberLiteral","number","Number","BooleanLiteral","bool","UndefinedLiteral","NullLiteral","Hash","pairs","HashPair","helperExpression","node","scopedId","test","simpleId","_parser2","yy","SourceLocation","srcName","_WhitespaceControl2","accept","_parser","_WhitespaceControl","Helpers","_extend","../utils","./ast","./helpers","./parser","./whitespace-control","7","castChunk","chunk","codeGen","_isArray","len","push","wrap","CodeGen","srcFile","source","SourceNode","define","amd","SourceMap","err","line","column","chunks","src","add","join","prepend","toStringWithSourceMap","unshift","merge","empty","iter","currentLocation","start","functionCall","generateList","quotedString","str","replace","objectLiteral","entries","generateArray","source-map","8","env","compat","useDepths","ast","environment","_x","compileInput","templateSpec","execOptions","compiled","_setup","setupOptions","_child","depths","argEquals","b","_isArray$indexOf","transformLiteralToPath","sexpr","literal","slice","compiler","equals","other","opcodes","opcode","otherOpcode","args","children","guid","sourceNode","stringParams","trackIds","knownHelpers","helperMissing","blockHelperMissing","if","unless","with","lookup","_name","compileProgram","childCompiler","result","usePartial","shift","bodyLength","isSimple","block","classifySexpr","helperSexpr","simpleSexpr","ambiguousSexpr","partialName","isDynamic","setupFullMustacheParams","preventIndent","mustache","noEscape","content","isBlock","knownHelpersOnly","falsy","addDepth","scoped","blockParamId","blockParamIndex","pushParam","isBlockParam","isHelper","isEligible","_name2","pushParams","val","blockParamChild","omitEmpty","param","indexOf","../exception","9","first_line","first_column","end","last_line","last_column","id","token","substr","stripFlags","open","close","charAt","stripComment","preparePath","dig","depthString","part","isLiteral","separator","prepareMustache","escapeFlag","prepareRawBlock","openRawBlock","errorNode","prepareBlock","openBlock","inverseAndProgram","inverted","chain","10","Literal","strictLookup","requireTerminal","stack","popStack","nameLookup","aliasable","_COMPILER_REVISION$REVISION_CHANGES","_CodeGen","_CodeGen2","parent","isValidJavaScriptVariableName","depthedLookup","compilerInfo","revision","versions","appendToBuffer","location","explicit","initializeBuffer","asObject","isChild","programs","environments","preamble","stackSlot","stackVars","aliases","registers","list","hashes","compileStack","inlineStack","compileChildren","useBlockParams","firstLoc","apply","pushSource","createFunctionContext","main","useData","compilerOptions","JSON","stringify","file","destName","map","lastContext","varDeclarations","locals","concat","aliasCount","alias","referenceCount","mergeSource","Function","appendOnly","forceBuffer","appendFirst","sourceSeen","bufferStart","bufferEnd","substring","blockValue","contextName","setupHelperArgs","blockName","splice","ambiguousBlockValue","flushInline","current","topStack","lastHelper","appendContent","pendingContent","pendingLocation","append","isInline","replaceStack","local","appendEscaped","getContext","pushContext","pushStackLiteral","lookupOnContext","resolvePath","lookupBlockParam","lookupData","_this","strict","assumeObjects","resolvePossibleLambda","pushStringParam","pushString","emptyHash","pushHash","values","types","contexts","popHash","pop","pushLiteral","pushProgram","programExpression","invokeHelper","paramSize","nonHelper","helper","setupHelper","simple","callParams","invokeKnownHelper","invokeAmbiguous","helperCall","useRegister","helperName","paramsInit","invokePartial","setupParams","assignToHash","pushId","child","matchExistingProgram","programParams","expr","item","callback","prefix","createdStack","usedLiteral","top","incrStack","topStackName","entry","wrapped","inline","blockHelper","foundHelper","hashIds","hashTypes","hashContexts","reservedWords","split","compilerWords","RESERVED_WORDS","../base","./code-gen","11","handlebars","trace","symbols_","error","root","EOF","program_repetition0","statement","rawBlock","COMMENT","CONTENT","END_RAW_BLOCK","OPEN_RAW_BLOCK","openRawBlock_repetition0","openRawBlock_option0","CLOSE_RAW_BLOCK","block_option0","closeBlock","openInverse","block_option1","OPEN_BLOCK","openBlock_repetition0","openBlock_option0","openBlock_option1","CLOSE","OPEN_INVERSE","openInverse_repetition0","openInverse_option0","openInverse_option1","openInverseChain","OPEN_INVERSE_CHAIN","openInverseChain_repetition0","openInverseChain_option0","openInverseChain_option1","INVERSE","inverseChain","inverseChain_option0","OPEN_ENDBLOCK","OPEN","mustache_repetition0","mustache_option0","OPEN_UNESCAPED","mustache_repetition1","mustache_option1","CLOSE_UNESCAPED","OPEN_PARTIAL","partial_repetition0","partial_option0","OPEN_SEXPR","sexpr_repetition0","sexpr_option0","CLOSE_SEXPR","hash_repetition_plus0","hashSegment","ID","EQUALS","OPEN_BLOCK_PARAMS","blockParams_repetition_plus0","CLOSE_BLOCK_PARAMS","dataName","STRING","NUMBER","BOOLEAN","UNDEFINED","NULL","DATA","pathSegments","SEP","$accept","$end","terminals_","13","14","16","17","21","27","31","32","37","42","45","46","49","52","53","59","62","66","67","69","71","74","75","76","77","78","79","81","productions_","performAction","yytext","yyleng","yylineno","yystate","$$","_$","$0","$","chained","table","12","15","22","25","18","72","73","80","54","58","47","50","23","36","41","43","26","55","28","33","19","48","57","63","64","65","51","24","56","60","29","34","20","44","38","61","30","68","35","39","70","40","defaultActions","82","92","99","100","105","107","110","111","123","124","parseError","lex","self","lexer","vstack","lstack","recovering","setInput","yylloc","yyloc","ranges","symbol","preErrorSymbol","state","action","p","newState","expected","yyval","errStr","showPosition","text","match","Array","range","_input","_more","_less","done","matched","conditionStack","offset","ch","lines","unput","oldLines","more","less","pastInput","past","upcomingInput","next","pre","c","tempMatch","rules","_currentRules","flex","matches","begin","condition","popState","conditions","topState","pushState","yy_","$avoiding_name_collisions","YY_START","mu","inclusive","emu","com","raw","INITIAL","print","PrintVisitor","padding","pad","out","paramStrings","joinedPairs","pair","./visitor","parents","mutating","acceptKey","acceptRequired","acceptArray","array","WhitespaceControl","isPrevWhitespace","isRoot","prev","sibling","isNextWhitespace","omitRight","multiple","rightStripped","omitLeft","leftStripped","isRootSeen","_isPrevWhitespace","_isNextWhitespace","openStandalone","closeStandalone","inlineStandalone","exec","firstInverse","lastInverse","tmp","idx","errorProps","captureStackTrace","lineNumber","global","Handlebars","window","$Handlebars","noConflict","checkRevision","compilerRevision","currentRevision","_COMPILER_REVISION$REVISION_CHANGES$createFrame","runtimeVersions","compilerVersions","invokePartialWrapper","resolvePartial","initData","container","lambda","declaredBlockParams","programWrapper","wrapProgram","common","noop","isTop","prog","./base","toHTML","escapeChar","chr","escape","Object","possible","badChars","&","<",">","\"","'","`","extension","filename","fs","templateString","readFileSync","printer","extensions","../dist/cjs/handlebars","../dist/cjs/handlebars/compiler/printer","process","__filename","amdefine","requireFn","trimDots","ary","normalize","baseName","baseParts","makeNormalize","relName","makeLoad","load","loaderCache","fromText","runFactory","deps","factory","m","uri","makeRequire","alreadyCalled","depName","defineCache","stringRequire","systemRequire","relId","amdRequire","nextTick","toUrl","filePath","dirname","plugin","originalId","_process","drainQueue","draining","currentQueue","queue","fun","setTimeout","title","browser","argv","version","on","addListener","once","off","removeListener","removeAllListeners","emit","binding","cwd","chdir","dir","umask","lib$es6$promise$utils$$objectOrFunction","x","lib$es6$promise$utils$$isFunction","lib$es6$promise$utils$$isMaybeThenable","lib$es6$promise$asap$$setScheduler","scheduleFn","lib$es6$promise$asap$$customSchedulerFn","lib$es6$promise$asap$$setAsap","asapFn","lib$es6$promise$asap$$asap","lib$es6$promise$asap$$useNextTick","setImmediate","lib$es6$promise$asap$$flush","lib$es6$promise$asap$$useVertxTimer","lib$es6$promise$asap$$vertxNext","lib$es6$promise$asap$$useMutationObserver","iterations","observer","lib$es6$promise$asap$$BrowserMutationObserver","document","createTextNode","observe","characterData","lib$es6$promise$asap$$useMessageChannel","channel","MessageChannel","port1","onmessage","port2","postMessage","lib$es6$promise$asap$$useSetTimeout","lib$es6$promise$asap$$len","lib$es6$promise$asap$$queue","arg","lib$es6$promise$asap$$attemptVertex","vertx","runOnLoop","runOnContext","lib$es6$promise$$internal$$noop","lib$es6$promise$$internal$$selfFullfillment","TypeError","lib$es6$promise$$internal$$cannotReturnOwn","lib$es6$promise$$internal$$getThen","promise","then","lib$es6$promise$$internal$$GET_THEN_ERROR","lib$es6$promise$$internal$$tryThen","fulfillmentHandler","rejectionHandler","lib$es6$promise$$internal$$handleForeignThenable","thenable","sealed","lib$es6$promise$$internal$$resolve","lib$es6$promise$$internal$$fulfill","reason","lib$es6$promise$$internal$$reject","_label","lib$es6$promise$$internal$$handleOwnThenable","_state","lib$es6$promise$$internal$$FULFILLED","_result","lib$es6$promise$$internal$$REJECTED","lib$es6$promise$$internal$$subscribe","lib$es6$promise$$internal$$handleMaybeThenable","maybeThenable","lib$es6$promise$$internal$$publishRejection","_onerror","lib$es6$promise$$internal$$publish","lib$es6$promise$$internal$$PENDING","_subscribers","onFulfillment","onRejection","subscribers","settled","detail","lib$es6$promise$$internal$$invokeCallback","lib$es6$promise$$internal$$ErrorObject","lib$es6$promise$$internal$$tryCatch","lib$es6$promise$$internal$$TRY_CATCH_ERROR","succeeded","failed","hasCallback","lib$es6$promise$$internal$$initializePromise","resolver","lib$es6$promise$enumerator$$Enumerator","Constructor","enumerator","_instanceConstructor","_validateInput","_remaining","_init","_enumerate","_validationError","lib$es6$promise$promise$all$$all","lib$es6$promise$enumerator$$default","lib$es6$promise$promise$race$$race","lib$es6$promise$utils$$isArray","resolve","lib$es6$promise$promise$resolve$$resolve","lib$es6$promise$promise$reject$$reject","lib$es6$promise$promise$$needsResolver","lib$es6$promise$promise$$needsNew","lib$es6$promise$promise$$Promise","_id","lib$es6$promise$promise$$counter","lib$es6$promise$polyfill$$polyfill","P","Promise","cast","lib$es6$promise$promise$$default","lib$es6$promise$utils$$_isArray","lib$es6$promise$asap$$scheduleFlush","lib$es6$promise$asap$$browserWindow","lib$es6$promise$asap$$browserGlobal","MutationObserver","WebKitMutationObserver","lib$es6$promise$asap$$isNode","lib$es6$promise$asap$$isWorker","Uint8ClampedArray","importScripts","_eachEntry","_settledAt","_willSettleAt","lib$es6$promise$promise$all$$default","lib$es6$promise$promise$race$$default","lib$es6$promise$promise$resolve$$default","lib$es6$promise$promise$reject$$default","all","race","reject","_setScheduler","_setAsap","_asap","catch","lib$es6$promise$polyfill$$default","lib$es6$promise$umd$$ES6Promise","polyfill","forEach","iterator","forEachArray","forEachString","forEachObject","k","is-function","win","exportName","setTimeoutContext","timeout","bindFn","invokeArrayArg","deprecate","deprecationMessage","warn","inherit","properties","childP","baseP","_super","assign","boolOrFn","TYPE_FUNCTION","ifUndefined","val1","val2","addEventListeners","target","handler","splitStr","addEventListener","removeEventListeners","removeEventListener","hasParent","parentNode","inStr","find","trim","inArray","findByKey","toArray","uniqueArray","sort","results","prefixed","property","prop","camelProp","toUpperCase","VENDOR_PREFIXES","uniqueId","_uniqueId","getWindowForElement","element","doc","ownerDocument","defaultView","parentWindow","Input","manager","inputTarget","domHandler","ev","enable","init","createInputInstance","Type","inputClass","SUPPORT_POINTER_EVENTS","PointerEventInput","SUPPORT_ONLY_TOUCH","TouchInput","SUPPORT_TOUCH","TouchMouseInput","MouseInput","inputHandler","eventType","pointersLen","pointers","changedPointersLen","changedPointers","isFirst","INPUT_START","isFinal","INPUT_END","INPUT_CANCEL","session","computeInputData","recognize","prevInput","pointersLength","firstInput","simpleCloneInputData","firstMultiple","offsetCenter","center","getCenter","timeStamp","now","deltaTime","angle","getAngle","distance","getDistance","computeDeltaXY","offsetDirection","getDirection","deltaX","deltaY","overallVelocity","getVelocity","overallVelocityX","overallVelocityY","y","abs","scale","getScale","rotation","getRotation","maxPointers","computeIntervalInputData","srcEvent","offsetDelta","prevDelta","velocity","velocityX","velocityY","direction","lastInterval","COMPUTE_INTERVAL","v","clientX","round","clientY","DIRECTION_NONE","DIRECTION_LEFT","DIRECTION_RIGHT","DIRECTION_UP","DIRECTION_DOWN","p1","p2","props","PROPS_XY","Math","sqrt","atan2","PI","PROPS_CLIENT_XY","evEl","MOUSE_ELEMENT_EVENTS","evWin","MOUSE_WINDOW_EVENTS","pressed","POINTER_ELEMENT_EVENTS","POINTER_WINDOW_EVENTS","store","pointerEvents","SingleTouchInput","evTarget","SINGLE_TOUCH_TARGET_EVENTS","SINGLE_TOUCH_WINDOW_EVENTS","started","normalizeSingleTouches","touches","changed","changedTouches","TOUCH_TARGET_EVENTS","targetIds","getTouches","allTouches","INPUT_MOVE","identifier","targetTouches","changedTargetTouches","filter","touch","mouse","primaryTouch","lastTouches","recordTouches","eventData","setLastTouch","lastTouch","lts","removeLastTouch","DEDUP_TIMEOUT","isSyntheticEvent","dx","dy","DEDUP_DISTANCE","TouchAction","set","cleanTouchActions","actions","TOUCH_ACTION_NONE","hasPanX","TOUCH_ACTION_PAN_X","hasPanY","TOUCH_ACTION_PAN_Y","TOUCH_ACTION_MANIPULATION","TOUCH_ACTION_AUTO","getTouchActionProps","NATIVE_TOUCH_ACTION","touchMap","cssSupports","CSS","supports","Recognizer","defaults","STATE_POSSIBLE","simultaneous","requireFail","stateStr","STATE_CANCELLED","STATE_ENDED","STATE_CHANGED","STATE_BEGAN","directionStr","getRecognizerByNameIfManager","otherRecognizer","recognizer","get","AttrRecognizer","PanRecognizer","pX","pY","PinchRecognizer","PressRecognizer","_timer","RotateRecognizer","SwipeRecognizer","TapRecognizer","pTime","pCenter","count","Hammer","recognizers","preset","Manager","handlers","oldCssProps","touchAction","toggleCssProps","recognizeWith","requireFailure","style","cssProps","triggerDomEvent","event","gestureEvent","createEvent","initEvent","gesture","dispatchEvent","TEST_ELEMENT","createElement","Date","output","nextKey","dest","keys","MOBILE_REGEX","navigator","userAgent","INPUT_TYPE_TOUCH","INPUT_TYPE_PEN","INPUT_TYPE_MOUSE","INPUT_TYPE_KINECT","DIRECTION_HORIZONTAL","DIRECTION_VERTICAL","DIRECTION_ALL","destroy","MOUSE_INPUT_MAP","mousedown","mousemove","mouseup","button","which","pointerType","POINTER_INPUT_MAP","pointerdown","pointermove","pointerup","pointercancel","pointerout","IE10_POINTER_TYPE_ENUM","MSPointerEvent","PointerEvent","removePointer","eventTypeNormalized","toLowerCase","isTouch","storeIndex","pointerId","SINGLE_TOUCH_INPUT_MAP","touchstart","touchmove","touchend","touchcancel","TOUCH_INPUT_MAP","inputEvent","inputData","isMouse","sourceCapabilities","firesTouchEvents","PREFIXED_TOUCH_ACTION","TOUCH_ACTION_COMPUTE","TOUCH_ACTION_MAP","compute","update","getTouchAction","preventDefaults","prevented","preventDefault","hasNone","isTapPointer","isTapMovement","isTapTouchTime","preventSrc","STATE_RECOGNIZED","STATE_FAILED","dropRecognizeWith","dropRequireFailure","hasRequireFailures","canRecognizeWith","additionalEvent","tryEmit","canEmit","inputDataClone","reset","attrTest","optionPointers","isRecognized","isValid","threshold","directionTest","hasMoved","inOut","time","validPointers","validMovement","validTime","clearTimeout","taps","interval","posThreshold","validTouchTime","failTimeout","validInterval","validMultiTap","tapCount","domEvents","userSelect","touchSelect","touchCallout","contentZooming","userDrag","tapHighlightColor","STOP","FORCED_STOP","stop","force","stopped","curRecognizer","existing","remove","events","Tap","Pan","Swipe","Pinch","Rotate","Press","freeGlobal","alert","confirm","prompt","headers","row","for-each","normalizeArray","allowAboveRoot","up","xs","res","splitPathRe","splitPath","resolvedPath","resolvedAbsolute","isAbsolute","trailingSlash","paths","relative","from","to","arr","fromParts","toParts","min","samePartsLength","outputParts","sep","delimiter","basename","ext","extname","SourceMapGenerator","SourceMapConsumer","./source-map/source-map-consumer","./source-map/source-map-generator","./source-map/source-node","ArraySet","_array","_set","util","fromArray","aArray","aAllowDuplicates","aStr","isDuplicate","has","toSetString","at","aIdx","./util","toVLQSigned","aValue","fromVLQSigned","isNegative","shifted","base64","VLQ_BASE_SHIFT","VLQ_BASE","VLQ_BASE_MASK","VLQ_CONTINUATION_BIT","encode","digit","encoded","vlq","decode","aOutParam","continuation","strLen","rest","./base64","charToIntMap","intToCharMap","aNumber","aChar","recursiveSearch","aLow","aHigh","aNeedle","aHaystack","aCompare","mid","floor","cmp","search","generatedPositionAfter","mappingA","mappingB","lineA","generatedLine","lineB","columnA","generatedColumn","columnB","compareByGeneratedPositions","MappingList","_sorted","_last","unsortedForEach","aCallback","aThisArg","aMapping","aSourceMap","sourceMap","getArg","sources","names","sourceRoot","sourcesContent","mappings","_version","_names","_sources","_mappings","binarySearch","base64VLQ","fromSourceMap","smc","_sourceRoot","_generateSourcesContent","_file","__generatedMappings","__originalMappings","compareByOriginalPositions","defineProperty","_parseMappings","_nextCharIsMappingSeparator","aSourceRoot","mapping","previousGeneratedColumn","previousOriginalLine","previousOriginalColumn","previousSource","previousName","temp","originalLine","originalColumn","_findMapping","aMappings","aLineName","aColumnName","aComparator","computeColumnSpans","_generatedMappings","nextMapping","lastGeneratedColumn","Infinity","originalPositionFor","aArgs","needle","sourceContentFor","aSource","url","urlParse","fileUriAbsPath","scheme","generatedPositionFor","_originalMappings","lastColumn","allGeneratedPositionsFor","reverse","GENERATED_ORDER","ORIGINAL_ORDER","eachMapping","aContext","aOrder","order","./array-set","./base64-vlq","./binary-search","_skipValidation","_sourcesContents","aSourceMapConsumer","generator","newMapping","generated","addMapping","sourceFile","setSourceContent","_validateMapping","aSourceFile","aSourceContent","applySourceMap","aSourceMapPath","newSources","newNames","aGenerated","aOriginal","aName","_serializeMappings","previousGeneratedLine","aSources","toJSON","./mapping-list","aLine","aColumn","aChunks","sourceContents","isSourceNode","REGEX_NEWLINE","NEWLINE_CODE","fromStringWithSourceMap","aGeneratedCode","aRelativePath","addMappingWithCode","remainingLines","shiftNextLine","lineContents","newLine","lastGeneratedLine","lastMapping","nextLine","aChunk","walk","aFn","aSep","newChildren","replaceRight","aPattern","aReplacement","lastChild","walkSourceContents","fromSetString","sourceMappingActive","lastOriginalSource","lastOriginalLine","lastOriginalColumn","lastOriginalName","charCodeAt","sourceContent","./source-map-generator","aDefaultValue","aUrl","urlRegexp","auth","host","port","urlGenerate","aParsedUrl","aPath","aRoot","aPathUrl","aRootUrl","dataUrlRegexp","joined","strcmp","aStr1","aStr2","s1","s2","onlyCompareOriginal","onlyCompareGenerated","left","right","initParams","xtend","createXHR","_createXHR","readystatechange","xhr","readyState","loadFunc","getBody","response","responseText","getXml","isJson","errorFunc","evt","timeoutTimer","statusCode","failureResponse","aborted","status","useXDR","rawRequest","getAllResponseHeaders","parseHeaders","called","cors","XDomainRequest","XMLHttpRequest","sync","json","onreadystatechange","onload","onerror","onprogress","onabort","ontimeout","username","password","withCredentials","abort","setRequestHeader","responseType","beforeSend","send","responseXML","firefoxBugTakenEffect","documentElement","nodeName","global/window","parse-headers","_helpers","_partials_list","_partials_list2","ifEquals","./partials/_list","v1","v2","_list","_classCallCheck","_createClass","defineProperties","descriptor","enumerable","configurable","writable","protoProps","staticProps","_jsDOMGetVendorProperty","_jsDOMGetVendorProperty2","Carousel","_ref","view","widget","pageSize","isInfinite","nextPageBuffer","el","swipe","querySelector","carousel","aperture","btnNext","btnPrev","currentPage","lastPage","getLastPage","translate3d","_jgwidget","features","csstransforms3d","getMaxPage","setAperture","setControlState","bindListeners","setCardState","isBuffer","loadMoreCards","card","apertureSize","offsetHeight","getComputedStyle","marginBottom","marginTop","height","cardCount","querySelectorAll","maxPage","model","$model","pagination","totalResults","isMaxLoaded","showNextPage","showPrevPage","hammer","setAttribute","classList","removeAttribute","transition","setMaxLoaded","analytics","cardImpressions","firstCard","lastCard","_this2","appendNextPage","cardsInit","../js/DOM/getVendorProperty","hammerjs","getVendorProperty","transform","vendorProps","Analytics","configHash","callbacks","widgetEl","getAttribute","charityId","frpId","pushConfig","widgetInit","sendData","analyticsData","page_type","activity_type","charity_id","page_id","widgetClick","clickData","subtype","event_value","cards","activityId","cardRank","cardFrpId","cardUrl","card_id","card_rank","activity_id","card_url","stopPropagation","cardClick","_this3","impressionData","card_count","cb","_utilsQueryString","Model","isPaginated","apiPageSize","collectionPath","setParams","lastReturnedPage","collection","currentApiPage","pageNum","fetchData","getModel","qs","queryStringStringify","referrer","getNextPage","../utils/queryString","es6-promise","_HandlebarsHandlebars","_HandlebarsHandlebars2","View","pollInterval","pollTrigger","innerHTML","config","pollAtInterval","registerPollTrigger","img","Image","resetHeight","refresh","render","setInterval","_this4","_this5","frag","docFrag","createDocumentFragment","appendChild","../../Handlebars/handlebars","_utilsDebounce","_utilsDebounce2","_Analytics","_Analytics2","Widget","widgetContainer","responsive","userConfig","appId","makeResponsive","getUserConfig","_kmq","_window$_kmq","queryStringParse","postContentHeight","max","scrollHeight","../utils/debounce","./Analytics","debounce","func","wait","immediate","later","callNow","reduce","decodeURIComponent","encodeURIComponent","writeUtmCode","utmParams","utm","includes","../../utils/queryString","extractTimestamp","re","getPrettyDay","date","abbr","day","getDay","days","getPrettyMonth","month","getMonth","months","getDateTime","toISOString","getPrettyDate","_date","getDate","getPrettyDateUTC","getUTCDate","getPrettyYear","year","getFullYear","getPrettyYearUTC","getUTCFullYear","writeEventUrl","keyName","eventId","_inherits","subClass","superClass","setPrototypeOf","__proto__","_get","_x2","_x3","_again","receiver","desc","getOwnPropertyDescriptor","getter","getPrototypeOf","_justgivingWidgetFrameworkComponentsLibJsFrameworkWidget","_justgivingWidgetFrameworkComponentsLibJsFrameworkWidget2","_justgivingWidgetFrameworkComponentsLibCarouselCarousel","_justgivingWidgetFrameworkComponentsLibCarouselCarousel2","_justgivingWidgetFrameworkComponentsLibJsFrameworkModel","_justgivingWidgetFrameworkComponentsLibJsFrameworkModel2","_justgivingWidgetFrameworkComponentsLibJsFrameworkView","_justgivingWidgetFrameworkComponentsLibJsFrameworkView2","_ModelEvents","_ModelEvents2","CharityEventsBoard","_Widget","eventsModel","charityModel","bootstrap","charityView","charityName","eventsView","viewName","hasCarousel","eventsListView","footerView","profilePageUrl","initAnalytics","./ModelEvents","justgiving-widget-framework/components/lib/carousel/Carousel","justgiving-widget-framework/components/lib/js/framework/Model","justgiving-widget-framework/components/lib/js/framework/View","justgiving-widget-framework/components/lib/js/framework/Widget","_justgivingWidgetFrameworkComponentsLibJsWidgetModelPrettyDate","_justgivingWidgetFrameworkComponentsLibJsWidgetModelWriteUrl","_justgivingWidgetFrameworkComponentsLibJsWidgetAnalyticsWriteUtmCode","_justgivingWidgetFrameworkComponentsLibJsWidgetAnalyticsWriteUtmCode2","ModelEvents","_Model","prettyStartDate","startDate","prettyStartMonth","prettyStartYear","dateTime","eventUrl","utm_name","utm_content","justgiving-widget-framework/components/lib/js/widget/analytics/writeUtmCode","justgiving-widget-framework/components/lib/js/widget/model/prettyDate","justgiving-widget-framework/components/lib/js/widget/model/writeUrl"],"mappings":"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AK,EAAG,IAAKE,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,MAAStB,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKO,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,MAAStB,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKO,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,MAAStB,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKO,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,MAAStB,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKO,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,MAAStB,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKO,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKE,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAAKC,IAAK,EAAG,IAA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","file":"main.js","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o= 2.0.0-beta.1'\n};\n\nexports.REVISION_CHANGES = REVISION_CHANGES;\nvar isArray = Utils.isArray,\n isFunction = Utils.isFunction,\n toString = Utils.toString,\n objectType = '[object Object]';\n\nfunction HandlebarsEnvironment(helpers, partials) {\n this.helpers = helpers || {};\n this.partials = partials || {};\n\n registerDefaultHelpers(this);\n}\n\nHandlebarsEnvironment.prototype = {\n constructor: HandlebarsEnvironment,\n\n logger: logger,\n log: log,\n\n registerHelper: function registerHelper(name, fn) {\n if (toString.call(name) === objectType) {\n if (fn) {\n throw new _Exception2['default']('Arg not supported with multiple helpers');\n }\n Utils.extend(this.helpers, name);\n } else {\n this.helpers[name] = fn;\n }\n },\n unregisterHelper: function unregisterHelper(name) {\n delete this.helpers[name];\n },\n\n registerPartial: function registerPartial(name, partial) {\n if (toString.call(name) === objectType) {\n Utils.extend(this.partials, name);\n } else {\n if (typeof partial === 'undefined') {\n throw new _Exception2['default']('Attempting to register a partial as undefined');\n }\n this.partials[name] = partial;\n }\n },\n unregisterPartial: function unregisterPartial(name) {\n delete this.partials[name];\n }\n};\n\nfunction registerDefaultHelpers(instance) {\n instance.registerHelper('helperMissing', function () {\n if (arguments.length === 1) {\n // A missing field in a {{foo}} constuct.\n return undefined;\n } else {\n // Someone is actually trying to call something, blow up.\n throw new _Exception2['default']('Missing helper: \"' + arguments[arguments.length - 1].name + '\"');\n }\n });\n\n instance.registerHelper('blockHelperMissing', function (context, options) {\n var inverse = options.inverse,\n fn = options.fn;\n\n if (context === true) {\n return fn(this);\n } else if (context === false || context == null) {\n return inverse(this);\n } else if (isArray(context)) {\n if (context.length > 0) {\n if (options.ids) {\n options.ids = [options.name];\n }\n\n return instance.helpers.each(context, options);\n } else {\n return inverse(this);\n }\n } else {\n if (options.data && options.ids) {\n var data = createFrame(options.data);\n data.contextPath = Utils.appendContextPath(options.data.contextPath, options.name);\n options = { data: data };\n }\n\n return fn(context, options);\n }\n });\n\n instance.registerHelper('each', function (context, options) {\n if (!options) {\n throw new _Exception2['default']('Must pass iterator to #each');\n }\n\n var fn = options.fn,\n inverse = options.inverse,\n i = 0,\n ret = '',\n data = undefined,\n contextPath = undefined;\n\n if (options.data && options.ids) {\n contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.';\n }\n\n if (isFunction(context)) {\n context = context.call(this);\n }\n\n if (options.data) {\n data = createFrame(options.data);\n }\n\n function execIteration(field, index, last) {\n if (data) {\n data.key = field;\n data.index = index;\n data.first = index === 0;\n data.last = !!last;\n\n if (contextPath) {\n data.contextPath = contextPath + field;\n }\n }\n\n ret = ret + fn(context[field], {\n data: data,\n blockParams: Utils.blockParams([context[field], field], [contextPath + field, null])\n });\n }\n\n if (context && typeof context === 'object') {\n if (isArray(context)) {\n for (var j = context.length; i < j; i++) {\n execIteration(i, i, i === context.length - 1);\n }\n } else {\n var priorKey = undefined;\n\n for (var key in context) {\n if (context.hasOwnProperty(key)) {\n // We're running the iterations one step out of sync so we can detect\n // the last iteration without have to scan the object twice and create\n // an itermediate keys array.\n if (priorKey) {\n execIteration(priorKey, i - 1);\n }\n priorKey = key;\n i++;\n }\n }\n if (priorKey) {\n execIteration(priorKey, i - 1, true);\n }\n }\n }\n\n if (i === 0) {\n ret = inverse(this);\n }\n\n return ret;\n });\n\n instance.registerHelper('if', function (conditional, options) {\n if (isFunction(conditional)) {\n conditional = conditional.call(this);\n }\n\n // Default behavior is to render the positive path if the value is truthy and not empty.\n // The `includeZero` option may be set to treat the condtional as purely not empty based on the\n // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.\n if (!options.hash.includeZero && !conditional || Utils.isEmpty(conditional)) {\n return options.inverse(this);\n } else {\n return options.fn(this);\n }\n });\n\n instance.registerHelper('unless', function (conditional, options) {\n return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash });\n });\n\n instance.registerHelper('with', function (context, options) {\n if (isFunction(context)) {\n context = context.call(this);\n }\n\n var fn = options.fn;\n\n if (!Utils.isEmpty(context)) {\n if (options.data && options.ids) {\n var data = createFrame(options.data);\n data.contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]);\n options = { data: data };\n }\n\n return fn(context, options);\n } else {\n return options.inverse(this);\n }\n });\n\n instance.registerHelper('log', function (message, options) {\n var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1;\n instance.log(level, message);\n });\n\n instance.registerHelper('lookup', function (obj, field) {\n return obj && obj[field];\n });\n}\n\nvar logger = {\n methodMap: { 0: 'debug', 1: 'info', 2: 'warn', 3: 'error' },\n\n // State enum\n DEBUG: 0,\n INFO: 1,\n WARN: 2,\n ERROR: 3,\n level: 1,\n\n // Can be overridden in the host environment\n log: function log(level, message) {\n if (typeof console !== 'undefined' && logger.level <= level) {\n var method = logger.methodMap[level];\n (console[method] || console.log).call(console, message); // eslint-disable-line no-console\n }\n }\n};\n\nexports.logger = logger;\nvar log = logger.log;\n\nexports.log = log;\n\nfunction createFrame(object) {\n var frame = Utils.extend({}, object);\n frame._parent = object;\n return frame;\n}\n\n/* [args, ]options */\n},{\"./exception\":15,\"./utils\":19}],5:[function(require,module,exports){\n'use strict';\n\nexports.__esModule = true;\nvar AST = {\n Program: function Program(statements, blockParams, strip, locInfo) {\n this.loc = locInfo;\n this.type = 'Program';\n this.body = statements;\n\n this.blockParams = blockParams;\n this.strip = strip;\n },\n\n MustacheStatement: function MustacheStatement(path, params, hash, escaped, strip, locInfo) {\n this.loc = locInfo;\n this.type = 'MustacheStatement';\n\n this.path = path;\n this.params = params || [];\n this.hash = hash;\n this.escaped = escaped;\n\n this.strip = strip;\n },\n\n BlockStatement: function BlockStatement(path, params, hash, program, inverse, openStrip, inverseStrip, closeStrip, locInfo) {\n this.loc = locInfo;\n this.type = 'BlockStatement';\n\n this.path = path;\n this.params = params || [];\n this.hash = hash;\n this.program = program;\n this.inverse = inverse;\n\n this.openStrip = openStrip;\n this.inverseStrip = inverseStrip;\n this.closeStrip = closeStrip;\n },\n\n PartialStatement: function PartialStatement(name, params, hash, strip, locInfo) {\n this.loc = locInfo;\n this.type = 'PartialStatement';\n\n this.name = name;\n this.params = params || [];\n this.hash = hash;\n\n this.indent = '';\n this.strip = strip;\n },\n\n ContentStatement: function ContentStatement(string, locInfo) {\n this.loc = locInfo;\n this.type = 'ContentStatement';\n this.original = this.value = string;\n },\n\n CommentStatement: function CommentStatement(comment, strip, locInfo) {\n this.loc = locInfo;\n this.type = 'CommentStatement';\n this.value = comment;\n\n this.strip = strip;\n },\n\n SubExpression: function SubExpression(path, params, hash, locInfo) {\n this.loc = locInfo;\n\n this.type = 'SubExpression';\n this.path = path;\n this.params = params || [];\n this.hash = hash;\n },\n\n PathExpression: function PathExpression(data, depth, parts, original, locInfo) {\n this.loc = locInfo;\n this.type = 'PathExpression';\n\n this.data = data;\n this.original = original;\n this.parts = parts;\n this.depth = depth;\n },\n\n StringLiteral: function StringLiteral(string, locInfo) {\n this.loc = locInfo;\n this.type = 'StringLiteral';\n this.original = this.value = string;\n },\n\n NumberLiteral: function NumberLiteral(number, locInfo) {\n this.loc = locInfo;\n this.type = 'NumberLiteral';\n this.original = this.value = Number(number);\n },\n\n BooleanLiteral: function BooleanLiteral(bool, locInfo) {\n this.loc = locInfo;\n this.type = 'BooleanLiteral';\n this.original = this.value = bool === 'true';\n },\n\n UndefinedLiteral: function UndefinedLiteral(locInfo) {\n this.loc = locInfo;\n this.type = 'UndefinedLiteral';\n this.original = this.value = undefined;\n },\n\n NullLiteral: function NullLiteral(locInfo) {\n this.loc = locInfo;\n this.type = 'NullLiteral';\n this.original = this.value = null;\n },\n\n Hash: function Hash(pairs, locInfo) {\n this.loc = locInfo;\n this.type = 'Hash';\n this.pairs = pairs;\n },\n HashPair: function HashPair(key, value, locInfo) {\n this.loc = locInfo;\n this.type = 'HashPair';\n this.key = key;\n this.value = value;\n },\n\n // Public API used to evaluate derived attributes regarding AST nodes\n helpers: {\n // a mustache is definitely a helper if:\n // * it is an eligible helper, and\n // * it has at least one parameter or hash segment\n helperExpression: function helperExpression(node) {\n return !!(node.type === 'SubExpression' || node.params.length || node.hash);\n },\n\n scopedId: function scopedId(path) {\n return /^\\.|this\\b/.test(path.original);\n },\n\n // an ID is simple if it only has one part, and that part is not\n // `..` or `this`.\n simpleId: function simpleId(path) {\n return path.parts.length === 1 && !AST.helpers.scopedId(path) && !path.depth;\n }\n }\n};\n\n// Must be exported as an object rather than the root of the module as the jison lexer\n// must modify the object to operate properly.\nexports['default'] = AST;\nmodule.exports = exports['default'];\n},{}],6:[function(require,module,exports){\n'use strict';\n\nvar _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; };\n\nexports.__esModule = true;\nexports.parse = parse;\n\nvar _parser = require('./parser');\n\nvar _parser2 = _interopRequireWildcard(_parser);\n\nvar _AST = require('./ast');\n\nvar _AST2 = _interopRequireWildcard(_AST);\n\nvar _WhitespaceControl = require('./whitespace-control');\n\nvar _WhitespaceControl2 = _interopRequireWildcard(_WhitespaceControl);\n\nvar _import = require('./helpers');\n\nvar Helpers = _interopRequireWildcard(_import);\n\nvar _extend = require('../utils');\n\nexports.parser = _parser2['default'];\n\nvar yy = {};\n_extend.extend(yy, Helpers, _AST2['default']);\n\nfunction parse(input, options) {\n // Just return if an already-compiled AST was passed in.\n if (input.type === 'Program') {\n return input;\n }\n\n _parser2['default'].yy = yy;\n\n // Altering the shared object here, but this is ok as parser is a sync operation\n yy.locInfo = function (locInfo) {\n return new yy.SourceLocation(options && options.srcName, locInfo);\n };\n\n var strip = new _WhitespaceControl2['default']();\n return strip.accept(_parser2['default'].parse(input));\n}\n},{\"../utils\":19,\"./ast\":5,\"./helpers\":9,\"./parser\":11,\"./whitespace-control\":14}],7:[function(require,module,exports){\n'use strict';\n\nexports.__esModule = true;\n/*global define */\n\nvar _isArray = require('../utils');\n\nvar SourceNode = undefined;\n\ntry {\n /* istanbul ignore next */\n if (typeof define !== 'function' || !define.amd) {\n // We don't support this in AMD environments. For these environments, we asusme that\n // they are running on the browser and thus have no need for the source-map library.\n var SourceMap = require('source-map');\n SourceNode = SourceMap.SourceNode;\n }\n} catch (err) {}\n\n/* istanbul ignore if: tested but not covered in istanbul due to dist build */\nif (!SourceNode) {\n SourceNode = function (line, column, srcFile, chunks) {\n this.src = '';\n if (chunks) {\n this.add(chunks);\n }\n };\n /* istanbul ignore next */\n SourceNode.prototype = {\n add: function add(chunks) {\n if (_isArray.isArray(chunks)) {\n chunks = chunks.join('');\n }\n this.src += chunks;\n },\n prepend: function prepend(chunks) {\n if (_isArray.isArray(chunks)) {\n chunks = chunks.join('');\n }\n this.src = chunks + this.src;\n },\n toStringWithSourceMap: function toStringWithSourceMap() {\n return { code: this.toString() };\n },\n toString: function toString() {\n return this.src;\n }\n };\n}\n\nfunction castChunk(chunk, codeGen, loc) {\n if (_isArray.isArray(chunk)) {\n var ret = [];\n\n for (var i = 0, len = chunk.length; i < len; i++) {\n ret.push(codeGen.wrap(chunk[i], loc));\n }\n return ret;\n } else if (typeof chunk === 'boolean' || typeof chunk === 'number') {\n // Handle primitives that the SourceNode will throw up on\n return chunk + '';\n }\n return chunk;\n}\n\nfunction CodeGen(srcFile) {\n this.srcFile = srcFile;\n this.source = [];\n}\n\nCodeGen.prototype = {\n prepend: function prepend(source, loc) {\n this.source.unshift(this.wrap(source, loc));\n },\n push: function push(source, loc) {\n this.source.push(this.wrap(source, loc));\n },\n\n merge: function merge() {\n var source = this.empty();\n this.each(function (line) {\n source.add([' ', line, '\\n']);\n });\n return source;\n },\n\n each: function each(iter) {\n for (var i = 0, len = this.source.length; i < len; i++) {\n iter(this.source[i]);\n }\n },\n\n empty: function empty() {\n var loc = arguments[0] === undefined ? this.currentLocation || { start: {} } : arguments[0];\n\n return new SourceNode(loc.start.line, loc.start.column, this.srcFile);\n },\n wrap: function wrap(chunk) {\n var loc = arguments[1] === undefined ? this.currentLocation || { start: {} } : arguments[1];\n\n if (chunk instanceof SourceNode) {\n return chunk;\n }\n\n chunk = castChunk(chunk, this, loc);\n\n return new SourceNode(loc.start.line, loc.start.column, this.srcFile, chunk);\n },\n\n functionCall: function functionCall(fn, type, params) {\n params = this.generateList(params);\n return this.wrap([fn, type ? '.' + type + '(' : '(', params, ')']);\n },\n\n quotedString: function quotedString(str) {\n return '\"' + (str + '').replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r').replace(/\\u2028/g, '\\\\u2028') // Per Ecma-262 7.3 + 7.8.4\n .replace(/\\u2029/g, '\\\\u2029') + '\"';\n },\n\n objectLiteral: function objectLiteral(obj) {\n var pairs = [];\n\n for (var key in obj) {\n if (obj.hasOwnProperty(key)) {\n var value = castChunk(obj[key], this);\n if (value !== 'undefined') {\n pairs.push([this.quotedString(key), ':', value]);\n }\n }\n }\n\n var ret = this.generateList(pairs);\n ret.prepend('{');\n ret.add('}');\n return ret;\n },\n\n generateList: function generateList(entries, loc) {\n var ret = this.empty(loc);\n\n for (var i = 0, len = entries.length; i < len; i++) {\n if (i) {\n ret.add(',');\n }\n\n ret.add(castChunk(entries[i], this, loc));\n }\n\n return ret;\n },\n\n generateArray: function generateArray(entries, loc) {\n var ret = this.generateList(entries, loc);\n ret.prepend('[');\n ret.add(']');\n\n return ret;\n }\n};\n\nexports['default'] = CodeGen;\nmodule.exports = exports['default'];\n\n/* NOP */\n},{\"../utils\":19,\"source-map\":31}],8:[function(require,module,exports){\n'use strict';\n\nvar _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; };\n\nexports.__esModule = true;\nexports.Compiler = Compiler;\nexports.precompile = precompile;\nexports.compile = compile;\n\nvar _Exception = require('../exception');\n\nvar _Exception2 = _interopRequireWildcard(_Exception);\n\nvar _isArray$indexOf = require('../utils');\n\nvar _AST = require('./ast');\n\nvar _AST2 = _interopRequireWildcard(_AST);\n\nvar slice = [].slice;\n\nfunction Compiler() {}\n\n// the foundHelper register will disambiguate helper lookup from finding a\n// function in a context. This is necessary for mustache compatibility, which\n// requires that context functions in blocks are evaluated by blockHelperMissing,\n// and then proceed as if the resulting value was provided to blockHelperMissing.\n\nCompiler.prototype = {\n compiler: Compiler,\n\n equals: function equals(other) {\n var len = this.opcodes.length;\n if (other.opcodes.length !== len) {\n return false;\n }\n\n for (var i = 0; i < len; i++) {\n var opcode = this.opcodes[i],\n otherOpcode = other.opcodes[i];\n if (opcode.opcode !== otherOpcode.opcode || !argEquals(opcode.args, otherOpcode.args)) {\n return false;\n }\n }\n\n // We know that length is the same between the two arrays because they are directly tied\n // to the opcode behavior above.\n len = this.children.length;\n for (var i = 0; i < len; i++) {\n if (!this.children[i].equals(other.children[i])) {\n return false;\n }\n }\n\n return true;\n },\n\n guid: 0,\n\n compile: function compile(program, options) {\n this.sourceNode = [];\n this.opcodes = [];\n this.children = [];\n this.options = options;\n this.stringParams = options.stringParams;\n this.trackIds = options.trackIds;\n\n options.blockParams = options.blockParams || [];\n\n // These changes will propagate to the other compiler components\n var knownHelpers = options.knownHelpers;\n options.knownHelpers = {\n helperMissing: true,\n blockHelperMissing: true,\n each: true,\n 'if': true,\n unless: true,\n 'with': true,\n log: true,\n lookup: true\n };\n if (knownHelpers) {\n for (var _name in knownHelpers) {\n if (_name in knownHelpers) {\n options.knownHelpers[_name] = knownHelpers[_name];\n }\n }\n }\n\n return this.accept(program);\n },\n\n compileProgram: function compileProgram(program) {\n var childCompiler = new this.compiler(),\n // eslint-disable-line new-cap\n result = childCompiler.compile(program, this.options),\n guid = this.guid++;\n\n this.usePartial = this.usePartial || result.usePartial;\n\n this.children[guid] = result;\n this.useDepths = this.useDepths || result.useDepths;\n\n return guid;\n },\n\n accept: function accept(node) {\n this.sourceNode.unshift(node);\n var ret = this[node.type](node);\n this.sourceNode.shift();\n return ret;\n },\n\n Program: function Program(program) {\n this.options.blockParams.unshift(program.blockParams);\n\n var body = program.body,\n bodyLength = body.length;\n for (var i = 0; i < bodyLength; i++) {\n this.accept(body[i]);\n }\n\n this.options.blockParams.shift();\n\n this.isSimple = bodyLength === 1;\n this.blockParams = program.blockParams ? program.blockParams.length : 0;\n\n return this;\n },\n\n BlockStatement: function BlockStatement(block) {\n transformLiteralToPath(block);\n\n var program = block.program,\n inverse = block.inverse;\n\n program = program && this.compileProgram(program);\n inverse = inverse && this.compileProgram(inverse);\n\n var type = this.classifySexpr(block);\n\n if (type === 'helper') {\n this.helperSexpr(block, program, inverse);\n } else if (type === 'simple') {\n this.simpleSexpr(block);\n\n // now that the simple mustache is resolved, we need to\n // evaluate it by executing `blockHelperMissing`\n this.opcode('pushProgram', program);\n this.opcode('pushProgram', inverse);\n this.opcode('emptyHash');\n this.opcode('blockValue', block.path.original);\n } else {\n this.ambiguousSexpr(block, program, inverse);\n\n // now that the simple mustache is resolved, we need to\n // evaluate it by executing `blockHelperMissing`\n this.opcode('pushProgram', program);\n this.opcode('pushProgram', inverse);\n this.opcode('emptyHash');\n this.opcode('ambiguousBlockValue');\n }\n\n this.opcode('append');\n },\n\n PartialStatement: function PartialStatement(partial) {\n this.usePartial = true;\n\n var params = partial.params;\n if (params.length > 1) {\n throw new _Exception2['default']('Unsupported number of partial arguments: ' + params.length, partial);\n } else if (!params.length) {\n params.push({ type: 'PathExpression', parts: [], depth: 0 });\n }\n\n var partialName = partial.name.original,\n isDynamic = partial.name.type === 'SubExpression';\n if (isDynamic) {\n this.accept(partial.name);\n }\n\n this.setupFullMustacheParams(partial, undefined, undefined, true);\n\n var indent = partial.indent || '';\n if (this.options.preventIndent && indent) {\n this.opcode('appendContent', indent);\n indent = '';\n }\n\n this.opcode('invokePartial', isDynamic, partialName, indent);\n this.opcode('append');\n },\n\n MustacheStatement: function MustacheStatement(mustache) {\n this.SubExpression(mustache); // eslint-disable-line new-cap\n\n if (mustache.escaped && !this.options.noEscape) {\n this.opcode('appendEscaped');\n } else {\n this.opcode('append');\n }\n },\n\n ContentStatement: function ContentStatement(content) {\n if (content.value) {\n this.opcode('appendContent', content.value);\n }\n },\n\n CommentStatement: function CommentStatement() {},\n\n SubExpression: function SubExpression(sexpr) {\n transformLiteralToPath(sexpr);\n var type = this.classifySexpr(sexpr);\n\n if (type === 'simple') {\n this.simpleSexpr(sexpr);\n } else if (type === 'helper') {\n this.helperSexpr(sexpr);\n } else {\n this.ambiguousSexpr(sexpr);\n }\n },\n ambiguousSexpr: function ambiguousSexpr(sexpr, program, inverse) {\n var path = sexpr.path,\n name = path.parts[0],\n isBlock = program != null || inverse != null;\n\n this.opcode('getContext', path.depth);\n\n this.opcode('pushProgram', program);\n this.opcode('pushProgram', inverse);\n\n this.accept(path);\n\n this.opcode('invokeAmbiguous', name, isBlock);\n },\n\n simpleSexpr: function simpleSexpr(sexpr) {\n this.accept(sexpr.path);\n this.opcode('resolvePossibleLambda');\n },\n\n helperSexpr: function helperSexpr(sexpr, program, inverse) {\n var params = this.setupFullMustacheParams(sexpr, program, inverse),\n path = sexpr.path,\n name = path.parts[0];\n\n if (this.options.knownHelpers[name]) {\n this.opcode('invokeKnownHelper', params.length, name);\n } else if (this.options.knownHelpersOnly) {\n throw new _Exception2['default']('You specified knownHelpersOnly, but used the unknown helper ' + name, sexpr);\n } else {\n path.falsy = true;\n\n this.accept(path);\n this.opcode('invokeHelper', params.length, path.original, _AST2['default'].helpers.simpleId(path));\n }\n },\n\n PathExpression: function PathExpression(path) {\n this.addDepth(path.depth);\n this.opcode('getContext', path.depth);\n\n var name = path.parts[0],\n scoped = _AST2['default'].helpers.scopedId(path),\n blockParamId = !path.depth && !scoped && this.blockParamIndex(name);\n\n if (blockParamId) {\n this.opcode('lookupBlockParam', blockParamId, path.parts);\n } else if (!name) {\n // Context reference, i.e. `{{foo .}}` or `{{foo ..}}`\n this.opcode('pushContext');\n } else if (path.data) {\n this.options.data = true;\n this.opcode('lookupData', path.depth, path.parts);\n } else {\n this.opcode('lookupOnContext', path.parts, path.falsy, scoped);\n }\n },\n\n StringLiteral: function StringLiteral(string) {\n this.opcode('pushString', string.value);\n },\n\n NumberLiteral: function NumberLiteral(number) {\n this.opcode('pushLiteral', number.value);\n },\n\n BooleanLiteral: function BooleanLiteral(bool) {\n this.opcode('pushLiteral', bool.value);\n },\n\n UndefinedLiteral: function UndefinedLiteral() {\n this.opcode('pushLiteral', 'undefined');\n },\n\n NullLiteral: function NullLiteral() {\n this.opcode('pushLiteral', 'null');\n },\n\n Hash: function Hash(hash) {\n var pairs = hash.pairs,\n i = 0,\n l = pairs.length;\n\n this.opcode('pushHash');\n\n for (; i < l; i++) {\n this.pushParam(pairs[i].value);\n }\n while (i--) {\n this.opcode('assignToHash', pairs[i].key);\n }\n this.opcode('popHash');\n },\n\n // HELPERS\n opcode: function opcode(name) {\n this.opcodes.push({ opcode: name, args: slice.call(arguments, 1), loc: this.sourceNode[0].loc });\n },\n\n addDepth: function addDepth(depth) {\n if (!depth) {\n return;\n }\n\n this.useDepths = true;\n },\n\n classifySexpr: function classifySexpr(sexpr) {\n var isSimple = _AST2['default'].helpers.simpleId(sexpr.path);\n\n var isBlockParam = isSimple && !!this.blockParamIndex(sexpr.path.parts[0]);\n\n // a mustache is an eligible helper if:\n // * its id is simple (a single part, not `this` or `..`)\n var isHelper = !isBlockParam && _AST2['default'].helpers.helperExpression(sexpr);\n\n // if a mustache is an eligible helper but not a definite\n // helper, it is ambiguous, and will be resolved in a later\n // pass or at runtime.\n var isEligible = !isBlockParam && (isHelper || isSimple);\n\n // if ambiguous, we can possibly resolve the ambiguity now\n // An eligible helper is one that does not have a complex path, i.e. `this.foo`, `../foo` etc.\n if (isEligible && !isHelper) {\n var _name2 = sexpr.path.parts[0],\n options = this.options;\n\n if (options.knownHelpers[_name2]) {\n isHelper = true;\n } else if (options.knownHelpersOnly) {\n isEligible = false;\n }\n }\n\n if (isHelper) {\n return 'helper';\n } else if (isEligible) {\n return 'ambiguous';\n } else {\n return 'simple';\n }\n },\n\n pushParams: function pushParams(params) {\n for (var i = 0, l = params.length; i < l; i++) {\n this.pushParam(params[i]);\n }\n },\n\n pushParam: function pushParam(val) {\n var value = val.value != null ? val.value : val.original || '';\n\n if (this.stringParams) {\n if (value.replace) {\n value = value.replace(/^(\\.?\\.\\/)*/g, '').replace(/\\//g, '.');\n }\n\n if (val.depth) {\n this.addDepth(val.depth);\n }\n this.opcode('getContext', val.depth || 0);\n this.opcode('pushStringParam', value, val.type);\n\n if (val.type === 'SubExpression') {\n // SubExpressions get evaluated and passed in\n // in string params mode.\n this.accept(val);\n }\n } else {\n if (this.trackIds) {\n var blockParamIndex = undefined;\n if (val.parts && !_AST2['default'].helpers.scopedId(val) && !val.depth) {\n blockParamIndex = this.blockParamIndex(val.parts[0]);\n }\n if (blockParamIndex) {\n var blockParamChild = val.parts.slice(1).join('.');\n this.opcode('pushId', 'BlockParam', blockParamIndex, blockParamChild);\n } else {\n value = val.original || value;\n if (value.replace) {\n value = value.replace(/^\\.\\//g, '').replace(/^\\.$/g, '');\n }\n\n this.opcode('pushId', val.type, value);\n }\n }\n this.accept(val);\n }\n },\n\n setupFullMustacheParams: function setupFullMustacheParams(sexpr, program, inverse, omitEmpty) {\n var params = sexpr.params;\n this.pushParams(params);\n\n this.opcode('pushProgram', program);\n this.opcode('pushProgram', inverse);\n\n if (sexpr.hash) {\n this.accept(sexpr.hash);\n } else {\n this.opcode('emptyHash', omitEmpty);\n }\n\n return params;\n },\n\n blockParamIndex: function blockParamIndex(name) {\n for (var depth = 0, len = this.options.blockParams.length; depth < len; depth++) {\n var blockParams = this.options.blockParams[depth],\n param = blockParams && _isArray$indexOf.indexOf(blockParams, name);\n if (blockParams && param >= 0) {\n return [depth, param];\n }\n }\n }\n};\n\nfunction precompile(input, options, env) {\n if (input == null || typeof input !== 'string' && input.type !== 'Program') {\n throw new _Exception2['default']('You must pass a string or Handlebars AST to Handlebars.precompile. You passed ' + input);\n }\n\n options = options || {};\n if (!('data' in options)) {\n options.data = true;\n }\n if (options.compat) {\n options.useDepths = true;\n }\n\n var ast = env.parse(input, options),\n environment = new env.Compiler().compile(ast, options);\n return new env.JavaScriptCompiler().compile(environment, options);\n}\n\nfunction compile(input, _x, env) {\n var options = arguments[1] === undefined ? {} : arguments[1];\n\n if (input == null || typeof input !== 'string' && input.type !== 'Program') {\n throw new _Exception2['default']('You must pass a string or Handlebars AST to Handlebars.compile. You passed ' + input);\n }\n\n if (!('data' in options)) {\n options.data = true;\n }\n if (options.compat) {\n options.useDepths = true;\n }\n\n var compiled = undefined;\n\n function compileInput() {\n var ast = env.parse(input, options),\n environment = new env.Compiler().compile(ast, options),\n templateSpec = new env.JavaScriptCompiler().compile(environment, options, undefined, true);\n return env.template(templateSpec);\n }\n\n // Template is only compiled on first use and cached after that point.\n function ret(context, execOptions) {\n if (!compiled) {\n compiled = compileInput();\n }\n return compiled.call(this, context, execOptions);\n }\n ret._setup = function (setupOptions) {\n if (!compiled) {\n compiled = compileInput();\n }\n return compiled._setup(setupOptions);\n };\n ret._child = function (i, data, blockParams, depths) {\n if (!compiled) {\n compiled = compileInput();\n }\n return compiled._child(i, data, blockParams, depths);\n };\n return ret;\n}\n\nfunction argEquals(a, b) {\n if (a === b) {\n return true;\n }\n\n if (_isArray$indexOf.isArray(a) && _isArray$indexOf.isArray(b) && a.length === b.length) {\n for (var i = 0; i < a.length; i++) {\n if (!argEquals(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n}\n\nfunction transformLiteralToPath(sexpr) {\n if (!sexpr.path.parts) {\n var literal = sexpr.path;\n // Casting to string here to make false and 0 literal values play nicely with the rest\n // of the system.\n sexpr.path = new _AST2['default'].PathExpression(false, 0, [literal.original + ''], literal.original + '', literal.loc);\n }\n}\n},{\"../exception\":15,\"../utils\":19,\"./ast\":5}],9:[function(require,module,exports){\n'use strict';\n\nvar _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; };\n\nexports.__esModule = true;\nexports.SourceLocation = SourceLocation;\nexports.id = id;\nexports.stripFlags = stripFlags;\nexports.stripComment = stripComment;\nexports.preparePath = preparePath;\nexports.prepareMustache = prepareMustache;\nexports.prepareRawBlock = prepareRawBlock;\nexports.prepareBlock = prepareBlock;\n\nvar _Exception = require('../exception');\n\nvar _Exception2 = _interopRequireWildcard(_Exception);\n\nfunction SourceLocation(source, locInfo) {\n this.source = source;\n this.start = {\n line: locInfo.first_line,\n column: locInfo.first_column\n };\n this.end = {\n line: locInfo.last_line,\n column: locInfo.last_column\n };\n}\n\nfunction id(token) {\n if (/^\\[.*\\]$/.test(token)) {\n return token.substr(1, token.length - 2);\n } else {\n return token;\n }\n}\n\nfunction stripFlags(open, close) {\n return {\n open: open.charAt(2) === '~',\n close: close.charAt(close.length - 3) === '~'\n };\n}\n\nfunction stripComment(comment) {\n return comment.replace(/^\\{\\{~?\\!-?-?/, '').replace(/-?-?~?\\}\\}$/, '');\n}\n\nfunction preparePath(data, parts, locInfo) {\n locInfo = this.locInfo(locInfo);\n\n var original = data ? '@' : '',\n dig = [],\n depth = 0,\n depthString = '';\n\n for (var i = 0, l = parts.length; i < l; i++) {\n var part = parts[i].part,\n\n // If we have [] syntax then we do not treat path references as operators,\n // i.e. foo.[this] resolves to approximately context.foo['this']\n isLiteral = parts[i].original !== part;\n original += (parts[i].separator || '') + part;\n\n if (!isLiteral && (part === '..' || part === '.' || part === 'this')) {\n if (dig.length > 0) {\n throw new _Exception2['default']('Invalid path: ' + original, { loc: locInfo });\n } else if (part === '..') {\n depth++;\n depthString += '../';\n }\n } else {\n dig.push(part);\n }\n }\n\n return new this.PathExpression(data, depth, dig, original, locInfo);\n}\n\nfunction prepareMustache(path, params, hash, open, strip, locInfo) {\n // Must use charAt to support IE pre-10\n var escapeFlag = open.charAt(3) || open.charAt(2),\n escaped = escapeFlag !== '{' && escapeFlag !== '&';\n\n return new this.MustacheStatement(path, params, hash, escaped, strip, this.locInfo(locInfo));\n}\n\nfunction prepareRawBlock(openRawBlock, content, close, locInfo) {\n if (openRawBlock.path.original !== close) {\n var errorNode = { loc: openRawBlock.path.loc };\n\n throw new _Exception2['default'](openRawBlock.path.original + ' doesn\\'t match ' + close, errorNode);\n }\n\n locInfo = this.locInfo(locInfo);\n var program = new this.Program([content], null, {}, locInfo);\n\n return new this.BlockStatement(openRawBlock.path, openRawBlock.params, openRawBlock.hash, program, undefined, {}, {}, {}, locInfo);\n}\n\nfunction prepareBlock(openBlock, program, inverseAndProgram, close, inverted, locInfo) {\n // When we are chaining inverse calls, we will not have a close path\n if (close && close.path && openBlock.path.original !== close.path.original) {\n var errorNode = { loc: openBlock.path.loc };\n\n throw new _Exception2['default'](openBlock.path.original + ' doesn\\'t match ' + close.path.original, errorNode);\n }\n\n program.blockParams = openBlock.blockParams;\n\n var inverse = undefined,\n inverseStrip = undefined;\n\n if (inverseAndProgram) {\n if (inverseAndProgram.chain) {\n inverseAndProgram.program.body[0].closeStrip = close.strip;\n }\n\n inverseStrip = inverseAndProgram.strip;\n inverse = inverseAndProgram.program;\n }\n\n if (inverted) {\n inverted = inverse;\n inverse = program;\n program = inverted;\n }\n\n return new this.BlockStatement(openBlock.path, openBlock.params, openBlock.hash, program, inverse, openBlock.strip, inverseStrip, close && close.strip, this.locInfo(locInfo));\n}\n},{\"../exception\":15}],10:[function(require,module,exports){\n'use strict';\n\nvar _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; };\n\nexports.__esModule = true;\n\nvar _COMPILER_REVISION$REVISION_CHANGES = require('../base');\n\nvar _Exception = require('../exception');\n\nvar _Exception2 = _interopRequireWildcard(_Exception);\n\nvar _isArray = require('../utils');\n\nvar _CodeGen = require('./code-gen');\n\nvar _CodeGen2 = _interopRequireWildcard(_CodeGen);\n\nfunction Literal(value) {\n this.value = value;\n}\n\nfunction JavaScriptCompiler() {}\n\nJavaScriptCompiler.prototype = {\n // PUBLIC API: You can override these methods in a subclass to provide\n // alternative compiled forms for name lookup and buffering semantics\n nameLookup: function nameLookup(parent, name /* , type*/) {\n if (JavaScriptCompiler.isValidJavaScriptVariableName(name)) {\n return [parent, '.', name];\n } else {\n return [parent, '[\\'', name, '\\']'];\n }\n },\n depthedLookup: function depthedLookup(name) {\n return [this.aliasable('this.lookup'), '(depths, \"', name, '\")'];\n },\n\n compilerInfo: function compilerInfo() {\n var revision = _COMPILER_REVISION$REVISION_CHANGES.COMPILER_REVISION,\n versions = _COMPILER_REVISION$REVISION_CHANGES.REVISION_CHANGES[revision];\n return [revision, versions];\n },\n\n appendToBuffer: function appendToBuffer(source, location, explicit) {\n // Force a source as this simplifies the merge logic.\n if (!_isArray.isArray(source)) {\n source = [source];\n }\n source = this.source.wrap(source, location);\n\n if (this.environment.isSimple) {\n return ['return ', source, ';'];\n } else if (explicit) {\n // This is a case where the buffer operation occurs as a child of another\n // construct, generally braces. We have to explicitly output these buffer\n // operations to ensure that the emitted code goes in the correct location.\n return ['buffer += ', source, ';'];\n } else {\n source.appendToBuffer = true;\n return source;\n }\n },\n\n initializeBuffer: function initializeBuffer() {\n return this.quotedString('');\n },\n // END PUBLIC API\n\n compile: function compile(environment, options, context, asObject) {\n this.environment = environment;\n this.options = options;\n this.stringParams = this.options.stringParams;\n this.trackIds = this.options.trackIds;\n this.precompile = !asObject;\n\n this.name = this.environment.name;\n this.isChild = !!context;\n this.context = context || {\n programs: [],\n environments: []\n };\n\n this.preamble();\n\n this.stackSlot = 0;\n this.stackVars = [];\n this.aliases = {};\n this.registers = { list: [] };\n this.hashes = [];\n this.compileStack = [];\n this.inlineStack = [];\n this.blockParams = [];\n\n this.compileChildren(environment, options);\n\n this.useDepths = this.useDepths || environment.useDepths || this.options.compat;\n this.useBlockParams = this.useBlockParams || environment.useBlockParams;\n\n var opcodes = environment.opcodes,\n opcode = undefined,\n firstLoc = undefined,\n i = undefined,\n l = undefined;\n\n for (i = 0, l = opcodes.length; i < l; i++) {\n opcode = opcodes[i];\n\n this.source.currentLocation = opcode.loc;\n firstLoc = firstLoc || opcode.loc;\n this[opcode.opcode].apply(this, opcode.args);\n }\n\n // Flush any trailing content that might be pending.\n this.source.currentLocation = firstLoc;\n this.pushSource('');\n\n /* istanbul ignore next */\n if (this.stackSlot || this.inlineStack.length || this.compileStack.length) {\n throw new _Exception2['default']('Compile completed with content left on stack');\n }\n\n var fn = this.createFunctionContext(asObject);\n if (!this.isChild) {\n var ret = {\n compiler: this.compilerInfo(),\n main: fn\n };\n var programs = this.context.programs;\n for (i = 0, l = programs.length; i < l; i++) {\n if (programs[i]) {\n ret[i] = programs[i];\n }\n }\n\n if (this.environment.usePartial) {\n ret.usePartial = true;\n }\n if (this.options.data) {\n ret.useData = true;\n }\n if (this.useDepths) {\n ret.useDepths = true;\n }\n if (this.useBlockParams) {\n ret.useBlockParams = true;\n }\n if (this.options.compat) {\n ret.compat = true;\n }\n\n if (!asObject) {\n ret.compiler = JSON.stringify(ret.compiler);\n\n this.source.currentLocation = { start: { line: 1, column: 0 } };\n ret = this.objectLiteral(ret);\n\n if (options.srcName) {\n ret = ret.toStringWithSourceMap({ file: options.destName });\n ret.map = ret.map && ret.map.toString();\n } else {\n ret = ret.toString();\n }\n } else {\n ret.compilerOptions = this.options;\n }\n\n return ret;\n } else {\n return fn;\n }\n },\n\n preamble: function preamble() {\n // track the last context pushed into place to allow skipping the\n // getContext opcode when it would be a noop\n this.lastContext = 0;\n this.source = new _CodeGen2['default'](this.options.srcName);\n },\n\n createFunctionContext: function createFunctionContext(asObject) {\n var varDeclarations = '';\n\n var locals = this.stackVars.concat(this.registers.list);\n if (locals.length > 0) {\n varDeclarations += ', ' + locals.join(', ');\n }\n\n // Generate minimizer alias mappings\n //\n // When using true SourceNodes, this will update all references to the given alias\n // as the source nodes are reused in situ. For the non-source node compilation mode,\n // aliases will not be used, but this case is already being run on the client and\n // we aren't concern about minimizing the template size.\n var aliasCount = 0;\n for (var alias in this.aliases) {\n // eslint-disable-line guard-for-in\n var node = this.aliases[alias];\n\n if (this.aliases.hasOwnProperty(alias) && node.children && node.referenceCount > 1) {\n varDeclarations += ', alias' + ++aliasCount + '=' + alias;\n node.children[0] = 'alias' + aliasCount;\n }\n }\n\n var params = ['depth0', 'helpers', 'partials', 'data'];\n\n if (this.useBlockParams || this.useDepths) {\n params.push('blockParams');\n }\n if (this.useDepths) {\n params.push('depths');\n }\n\n // Perform a second pass over the output to merge content when possible\n var source = this.mergeSource(varDeclarations);\n\n if (asObject) {\n params.push(source);\n\n return Function.apply(this, params);\n } else {\n return this.source.wrap(['function(', params.join(','), ') {\\n ', source, '}']);\n }\n },\n mergeSource: function mergeSource(varDeclarations) {\n var isSimple = this.environment.isSimple,\n appendOnly = !this.forceBuffer,\n appendFirst = undefined,\n sourceSeen = undefined,\n bufferStart = undefined,\n bufferEnd = undefined;\n this.source.each(function (line) {\n if (line.appendToBuffer) {\n if (bufferStart) {\n line.prepend(' + ');\n } else {\n bufferStart = line;\n }\n bufferEnd = line;\n } else {\n if (bufferStart) {\n if (!sourceSeen) {\n appendFirst = true;\n } else {\n bufferStart.prepend('buffer += ');\n }\n bufferEnd.add(';');\n bufferStart = bufferEnd = undefined;\n }\n\n sourceSeen = true;\n if (!isSimple) {\n appendOnly = false;\n }\n }\n });\n\n if (appendOnly) {\n if (bufferStart) {\n bufferStart.prepend('return ');\n bufferEnd.add(';');\n } else if (!sourceSeen) {\n this.source.push('return \"\";');\n }\n } else {\n varDeclarations += ', buffer = ' + (appendFirst ? '' : this.initializeBuffer());\n\n if (bufferStart) {\n bufferStart.prepend('return buffer + ');\n bufferEnd.add(';');\n } else {\n this.source.push('return buffer;');\n }\n }\n\n if (varDeclarations) {\n this.source.prepend('var ' + varDeclarations.substring(2) + (appendFirst ? '' : ';\\n'));\n }\n\n return this.source.merge();\n },\n\n // [blockValue]\n //\n // On stack, before: hash, inverse, program, value\n // On stack, after: return value of blockHelperMissing\n //\n // The purpose of this opcode is to take a block of the form\n // `{{#this.foo}}...{{/this.foo}}`, resolve the value of `foo`, and\n // replace it on the stack with the result of properly\n // invoking blockHelperMissing.\n blockValue: function blockValue(name) {\n var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'),\n params = [this.contextName(0)];\n this.setupHelperArgs(name, 0, params);\n\n var blockName = this.popStack();\n params.splice(1, 0, blockName);\n\n this.push(this.source.functionCall(blockHelperMissing, 'call', params));\n },\n\n // [ambiguousBlockValue]\n //\n // On stack, before: hash, inverse, program, value\n // Compiler value, before: lastHelper=value of last found helper, if any\n // On stack, after, if no lastHelper: same as [blockValue]\n // On stack, after, if lastHelper: value\n ambiguousBlockValue: function ambiguousBlockValue() {\n // We're being a bit cheeky and reusing the options value from the prior exec\n var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'),\n params = [this.contextName(0)];\n this.setupHelperArgs('', 0, params, true);\n\n this.flushInline();\n\n var current = this.topStack();\n params.splice(1, 0, current);\n\n this.pushSource(['if (!', this.lastHelper, ') { ', current, ' = ', this.source.functionCall(blockHelperMissing, 'call', params), '}']);\n },\n\n // [appendContent]\n //\n // On stack, before: ...\n // On stack, after: ...\n //\n // Appends the string value of `content` to the current buffer\n appendContent: function appendContent(content) {\n if (this.pendingContent) {\n content = this.pendingContent + content;\n } else {\n this.pendingLocation = this.source.currentLocation;\n }\n\n this.pendingContent = content;\n },\n\n // [append]\n //\n // On stack, before: value, ...\n // On stack, after: ...\n //\n // Coerces `value` to a String and appends it to the current buffer.\n //\n // If `value` is truthy, or 0, it is coerced into a string and appended\n // Otherwise, the empty string is appended\n append: function append() {\n if (this.isInline()) {\n this.replaceStack(function (current) {\n return [' != null ? ', current, ' : \"\"'];\n });\n\n this.pushSource(this.appendToBuffer(this.popStack()));\n } else {\n var local = this.popStack();\n this.pushSource(['if (', local, ' != null) { ', this.appendToBuffer(local, undefined, true), ' }']);\n if (this.environment.isSimple) {\n this.pushSource(['else { ', this.appendToBuffer('\\'\\'', undefined, true), ' }']);\n }\n }\n },\n\n // [appendEscaped]\n //\n // On stack, before: value, ...\n // On stack, after: ...\n //\n // Escape `value` and append it to the buffer\n appendEscaped: function appendEscaped() {\n this.pushSource(this.appendToBuffer([this.aliasable('this.escapeExpression'), '(', this.popStack(), ')']));\n },\n\n // [getContext]\n //\n // On stack, before: ...\n // On stack, after: ...\n // Compiler value, after: lastContext=depth\n //\n // Set the value of the `lastContext` compiler value to the depth\n getContext: function getContext(depth) {\n this.lastContext = depth;\n },\n\n // [pushContext]\n //\n // On stack, before: ...\n // On stack, after: currentContext, ...\n //\n // Pushes the value of the current context onto the stack.\n pushContext: function pushContext() {\n this.pushStackLiteral(this.contextName(this.lastContext));\n },\n\n // [lookupOnContext]\n //\n // On stack, before: ...\n // On stack, after: currentContext[name], ...\n //\n // Looks up the value of `name` on the current context and pushes\n // it onto the stack.\n lookupOnContext: function lookupOnContext(parts, falsy, scoped) {\n var i = 0;\n\n if (!scoped && this.options.compat && !this.lastContext) {\n // The depthed query is expected to handle the undefined logic for the root level that\n // is implemented below, so we evaluate that directly in compat mode\n this.push(this.depthedLookup(parts[i++]));\n } else {\n this.pushContext();\n }\n\n this.resolvePath('context', parts, i, falsy);\n },\n\n // [lookupBlockParam]\n //\n // On stack, before: ...\n // On stack, after: blockParam[name], ...\n //\n // Looks up the value of `parts` on the given block param and pushes\n // it onto the stack.\n lookupBlockParam: function lookupBlockParam(blockParamId, parts) {\n this.useBlockParams = true;\n\n this.push(['blockParams[', blockParamId[0], '][', blockParamId[1], ']']);\n this.resolvePath('context', parts, 1);\n },\n\n // [lookupData]\n //\n // On stack, before: ...\n // On stack, after: data, ...\n //\n // Push the data lookup operator\n lookupData: function lookupData(depth, parts) {\n if (!depth) {\n this.pushStackLiteral('data');\n } else {\n this.pushStackLiteral('this.data(data, ' + depth + ')');\n }\n\n this.resolvePath('data', parts, 0, true);\n },\n\n resolvePath: function resolvePath(type, parts, i, falsy) {\n var _this = this;\n\n if (this.options.strict || this.options.assumeObjects) {\n this.push(strictLookup(this.options.strict, this, parts, type));\n return;\n }\n\n var len = parts.length;\n for (; i < len; i++) {\n /*eslint-disable no-loop-func */\n this.replaceStack(function (current) {\n var lookup = _this.nameLookup(current, parts[i], type);\n // We want to ensure that zero and false are handled properly if the context (falsy flag)\n // needs to have the special handling for these values.\n if (!falsy) {\n return [' != null ? ', lookup, ' : ', current];\n } else {\n // Otherwise we can use generic falsy handling\n return [' && ', lookup];\n }\n });\n /*eslint-enable no-loop-func */\n }\n },\n\n // [resolvePossibleLambda]\n //\n // On stack, before: value, ...\n // On stack, after: resolved value, ...\n //\n // If the `value` is a lambda, replace it on the stack by\n // the return value of the lambda\n resolvePossibleLambda: function resolvePossibleLambda() {\n this.push([this.aliasable('this.lambda'), '(', this.popStack(), ', ', this.contextName(0), ')']);\n },\n\n // [pushStringParam]\n //\n // On stack, before: ...\n // On stack, after: string, currentContext, ...\n //\n // This opcode is designed for use in string mode, which\n // provides the string value of a parameter along with its\n // depth rather than resolving it immediately.\n pushStringParam: function pushStringParam(string, type) {\n this.pushContext();\n this.pushString(type);\n\n // If it's a subexpression, the string result\n // will be pushed after this opcode.\n if (type !== 'SubExpression') {\n if (typeof string === 'string') {\n this.pushString(string);\n } else {\n this.pushStackLiteral(string);\n }\n }\n },\n\n emptyHash: function emptyHash(omitEmpty) {\n if (this.trackIds) {\n this.push('{}'); // hashIds\n }\n if (this.stringParams) {\n this.push('{}'); // hashContexts\n this.push('{}'); // hashTypes\n }\n this.pushStackLiteral(omitEmpty ? 'undefined' : '{}');\n },\n pushHash: function pushHash() {\n if (this.hash) {\n this.hashes.push(this.hash);\n }\n this.hash = { values: [], types: [], contexts: [], ids: [] };\n },\n popHash: function popHash() {\n var hash = this.hash;\n this.hash = this.hashes.pop();\n\n if (this.trackIds) {\n this.push(this.objectLiteral(hash.ids));\n }\n if (this.stringParams) {\n this.push(this.objectLiteral(hash.contexts));\n this.push(this.objectLiteral(hash.types));\n }\n\n this.push(this.objectLiteral(hash.values));\n },\n\n // [pushString]\n //\n // On stack, before: ...\n // On stack, after: quotedString(string), ...\n //\n // Push a quoted version of `string` onto the stack\n pushString: function pushString(string) {\n this.pushStackLiteral(this.quotedString(string));\n },\n\n // [pushLiteral]\n //\n // On stack, before: ...\n // On stack, after: value, ...\n //\n // Pushes a value onto the stack. This operation prevents\n // the compiler from creating a temporary variable to hold\n // it.\n pushLiteral: function pushLiteral(value) {\n this.pushStackLiteral(value);\n },\n\n // [pushProgram]\n //\n // On stack, before: ...\n // On stack, after: program(guid), ...\n //\n // Push a program expression onto the stack. This takes\n // a compile-time guid and converts it into a runtime-accessible\n // expression.\n pushProgram: function pushProgram(guid) {\n if (guid != null) {\n this.pushStackLiteral(this.programExpression(guid));\n } else {\n this.pushStackLiteral(null);\n }\n },\n\n // [invokeHelper]\n //\n // On stack, before: hash, inverse, program, params..., ...\n // On stack, after: result of helper invocation\n //\n // Pops off the helper's parameters, invokes the helper,\n // and pushes the helper's return value onto the stack.\n //\n // If the helper is not found, `helperMissing` is called.\n invokeHelper: function invokeHelper(paramSize, name, isSimple) {\n var nonHelper = this.popStack(),\n helper = this.setupHelper(paramSize, name),\n simple = isSimple ? [helper.name, ' || '] : '';\n\n var lookup = ['('].concat(simple, nonHelper);\n if (!this.options.strict) {\n lookup.push(' || ', this.aliasable('helpers.helperMissing'));\n }\n lookup.push(')');\n\n this.push(this.source.functionCall(lookup, 'call', helper.callParams));\n },\n\n // [invokeKnownHelper]\n //\n // On stack, before: hash, inverse, program, params..., ...\n // On stack, after: result of helper invocation\n //\n // This operation is used when the helper is known to exist,\n // so a `helperMissing` fallback is not required.\n invokeKnownHelper: function invokeKnownHelper(paramSize, name) {\n var helper = this.setupHelper(paramSize, name);\n this.push(this.source.functionCall(helper.name, 'call', helper.callParams));\n },\n\n // [invokeAmbiguous]\n //\n // On stack, before: hash, inverse, program, params..., ...\n // On stack, after: result of disambiguation\n //\n // This operation is used when an expression like `{{foo}}`\n // is provided, but we don't know at compile-time whether it\n // is a helper or a path.\n //\n // This operation emits more code than the other options,\n // and can be avoided by passing the `knownHelpers` and\n // `knownHelpersOnly` flags at compile-time.\n invokeAmbiguous: function invokeAmbiguous(name, helperCall) {\n this.useRegister('helper');\n\n var nonHelper = this.popStack();\n\n this.emptyHash();\n var helper = this.setupHelper(0, name, helperCall);\n\n var helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper');\n\n var lookup = ['(', '(helper = ', helperName, ' || ', nonHelper, ')'];\n if (!this.options.strict) {\n lookup[0] = '(helper = ';\n lookup.push(' != null ? helper : ', this.aliasable('helpers.helperMissing'));\n }\n\n this.push(['(', lookup, helper.paramsInit ? ['),(', helper.paramsInit] : [], '),', '(typeof helper === ', this.aliasable('\"function\"'), ' ? ', this.source.functionCall('helper', 'call', helper.callParams), ' : helper))']);\n },\n\n // [invokePartial]\n //\n // On stack, before: context, ...\n // On stack after: result of partial invocation\n //\n // This operation pops off a context, invokes a partial with that context,\n // and pushes the result of the invocation back.\n invokePartial: function invokePartial(isDynamic, name, indent) {\n var params = [],\n options = this.setupParams(name, 1, params, false);\n\n if (isDynamic) {\n name = this.popStack();\n delete options.name;\n }\n\n if (indent) {\n options.indent = JSON.stringify(indent);\n }\n options.helpers = 'helpers';\n options.partials = 'partials';\n\n if (!isDynamic) {\n params.unshift(this.nameLookup('partials', name, 'partial'));\n } else {\n params.unshift(name);\n }\n\n if (this.options.compat) {\n options.depths = 'depths';\n }\n options = this.objectLiteral(options);\n params.push(options);\n\n this.push(this.source.functionCall('this.invokePartial', '', params));\n },\n\n // [assignToHash]\n //\n // On stack, before: value, ..., hash, ...\n // On stack, after: ..., hash, ...\n //\n // Pops a value off the stack and assigns it to the current hash\n assignToHash: function assignToHash(key) {\n var value = this.popStack(),\n context = undefined,\n type = undefined,\n id = undefined;\n\n if (this.trackIds) {\n id = this.popStack();\n }\n if (this.stringParams) {\n type = this.popStack();\n context = this.popStack();\n }\n\n var hash = this.hash;\n if (context) {\n hash.contexts[key] = context;\n }\n if (type) {\n hash.types[key] = type;\n }\n if (id) {\n hash.ids[key] = id;\n }\n hash.values[key] = value;\n },\n\n pushId: function pushId(type, name, child) {\n if (type === 'BlockParam') {\n this.pushStackLiteral('blockParams[' + name[0] + '].path[' + name[1] + ']' + (child ? ' + ' + JSON.stringify('.' + child) : ''));\n } else if (type === 'PathExpression') {\n this.pushString(name);\n } else if (type === 'SubExpression') {\n this.pushStackLiteral('true');\n } else {\n this.pushStackLiteral('null');\n }\n },\n\n // HELPERS\n\n compiler: JavaScriptCompiler,\n\n compileChildren: function compileChildren(environment, options) {\n var children = environment.children,\n child = undefined,\n compiler = undefined;\n\n for (var i = 0, l = children.length; i < l; i++) {\n child = children[i];\n compiler = new this.compiler(); // eslint-disable-line new-cap\n\n var index = this.matchExistingProgram(child);\n\n if (index == null) {\n this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children\n index = this.context.programs.length;\n child.index = index;\n child.name = 'program' + index;\n this.context.programs[index] = compiler.compile(child, options, this.context, !this.precompile);\n this.context.environments[index] = child;\n\n this.useDepths = this.useDepths || compiler.useDepths;\n this.useBlockParams = this.useBlockParams || compiler.useBlockParams;\n } else {\n child.index = index;\n child.name = 'program' + index;\n\n this.useDepths = this.useDepths || child.useDepths;\n this.useBlockParams = this.useBlockParams || child.useBlockParams;\n }\n }\n },\n matchExistingProgram: function matchExistingProgram(child) {\n for (var i = 0, len = this.context.environments.length; i < len; i++) {\n var environment = this.context.environments[i];\n if (environment && environment.equals(child)) {\n return i;\n }\n }\n },\n\n programExpression: function programExpression(guid) {\n var child = this.environment.children[guid],\n programParams = [child.index, 'data', child.blockParams];\n\n if (this.useBlockParams || this.useDepths) {\n programParams.push('blockParams');\n }\n if (this.useDepths) {\n programParams.push('depths');\n }\n\n return 'this.program(' + programParams.join(', ') + ')';\n },\n\n useRegister: function useRegister(name) {\n if (!this.registers[name]) {\n this.registers[name] = true;\n this.registers.list.push(name);\n }\n },\n\n push: function push(expr) {\n if (!(expr instanceof Literal)) {\n expr = this.source.wrap(expr);\n }\n\n this.inlineStack.push(expr);\n return expr;\n },\n\n pushStackLiteral: function pushStackLiteral(item) {\n this.push(new Literal(item));\n },\n\n pushSource: function pushSource(source) {\n if (this.pendingContent) {\n this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation));\n this.pendingContent = undefined;\n }\n\n if (source) {\n this.source.push(source);\n }\n },\n\n replaceStack: function replaceStack(callback) {\n var prefix = ['('],\n stack = undefined,\n createdStack = undefined,\n usedLiteral = undefined;\n\n /* istanbul ignore next */\n if (!this.isInline()) {\n throw new _Exception2['default']('replaceStack on non-inline');\n }\n\n // We want to merge the inline statement into the replacement statement via ','\n var top = this.popStack(true);\n\n if (top instanceof Literal) {\n // Literals do not need to be inlined\n stack = [top.value];\n prefix = ['(', stack];\n usedLiteral = true;\n } else {\n // Get or create the current stack name for use by the inline\n createdStack = true;\n var _name = this.incrStack();\n\n prefix = ['((', this.push(_name), ' = ', top, ')'];\n stack = this.topStack();\n }\n\n var item = callback.call(this, stack);\n\n if (!usedLiteral) {\n this.popStack();\n }\n if (createdStack) {\n this.stackSlot--;\n }\n this.push(prefix.concat(item, ')'));\n },\n\n incrStack: function incrStack() {\n this.stackSlot++;\n if (this.stackSlot > this.stackVars.length) {\n this.stackVars.push('stack' + this.stackSlot);\n }\n return this.topStackName();\n },\n topStackName: function topStackName() {\n return 'stack' + this.stackSlot;\n },\n flushInline: function flushInline() {\n var inlineStack = this.inlineStack;\n this.inlineStack = [];\n for (var i = 0, len = inlineStack.length; i < len; i++) {\n var entry = inlineStack[i];\n /* istanbul ignore if */\n if (entry instanceof Literal) {\n this.compileStack.push(entry);\n } else {\n var stack = this.incrStack();\n this.pushSource([stack, ' = ', entry, ';']);\n this.compileStack.push(stack);\n }\n }\n },\n isInline: function isInline() {\n return this.inlineStack.length;\n },\n\n popStack: function popStack(wrapped) {\n var inline = this.isInline(),\n item = (inline ? this.inlineStack : this.compileStack).pop();\n\n if (!wrapped && item instanceof Literal) {\n return item.value;\n } else {\n if (!inline) {\n /* istanbul ignore next */\n if (!this.stackSlot) {\n throw new _Exception2['default']('Invalid stack pop');\n }\n this.stackSlot--;\n }\n return item;\n }\n },\n\n topStack: function topStack() {\n var stack = this.isInline() ? this.inlineStack : this.compileStack,\n item = stack[stack.length - 1];\n\n /* istanbul ignore if */\n if (item instanceof Literal) {\n return item.value;\n } else {\n return item;\n }\n },\n\n contextName: function contextName(context) {\n if (this.useDepths && context) {\n return 'depths[' + context + ']';\n } else {\n return 'depth' + context;\n }\n },\n\n quotedString: function quotedString(str) {\n return this.source.quotedString(str);\n },\n\n objectLiteral: function objectLiteral(obj) {\n return this.source.objectLiteral(obj);\n },\n\n aliasable: function aliasable(name) {\n var ret = this.aliases[name];\n if (ret) {\n ret.referenceCount++;\n return ret;\n }\n\n ret = this.aliases[name] = this.source.wrap(name);\n ret.aliasable = true;\n ret.referenceCount = 1;\n\n return ret;\n },\n\n setupHelper: function setupHelper(paramSize, name, blockHelper) {\n var params = [],\n paramsInit = this.setupHelperArgs(name, paramSize, params, blockHelper);\n var foundHelper = this.nameLookup('helpers', name, 'helper');\n\n return {\n params: params,\n paramsInit: paramsInit,\n name: foundHelper,\n callParams: [this.contextName(0)].concat(params)\n };\n },\n\n setupParams: function setupParams(helper, paramSize, params) {\n var options = {},\n contexts = [],\n types = [],\n ids = [],\n param = undefined;\n\n options.name = this.quotedString(helper);\n options.hash = this.popStack();\n\n if (this.trackIds) {\n options.hashIds = this.popStack();\n }\n if (this.stringParams) {\n options.hashTypes = this.popStack();\n options.hashContexts = this.popStack();\n }\n\n var inverse = this.popStack(),\n program = this.popStack();\n\n // Avoid setting fn and inverse if neither are set. This allows\n // helpers to do a check for `if (options.fn)`\n if (program || inverse) {\n options.fn = program || 'this.noop';\n options.inverse = inverse || 'this.noop';\n }\n\n // The parameters go on to the stack in order (making sure that they are evaluated in order)\n // so we need to pop them off the stack in reverse order\n var i = paramSize;\n while (i--) {\n param = this.popStack();\n params[i] = param;\n\n if (this.trackIds) {\n ids[i] = this.popStack();\n }\n if (this.stringParams) {\n types[i] = this.popStack();\n contexts[i] = this.popStack();\n }\n }\n\n if (this.trackIds) {\n options.ids = this.source.generateArray(ids);\n }\n if (this.stringParams) {\n options.types = this.source.generateArray(types);\n options.contexts = this.source.generateArray(contexts);\n }\n\n if (this.options.data) {\n options.data = 'data';\n }\n if (this.useBlockParams) {\n options.blockParams = 'blockParams';\n }\n return options;\n },\n\n setupHelperArgs: function setupHelperArgs(helper, paramSize, params, useRegister) {\n var options = this.setupParams(helper, paramSize, params, true);\n options = this.objectLiteral(options);\n if (useRegister) {\n this.useRegister('options');\n params.push('options');\n return ['options=', options];\n } else {\n params.push(options);\n return '';\n }\n }\n};\n\n(function () {\n var reservedWords = ('break else new var' + ' case finally return void' + ' catch for switch while' + ' continue function this with' + ' default if throw' + ' delete in try' + ' do instanceof typeof' + ' abstract enum int short' + ' boolean export interface static' + ' byte extends long super' + ' char final native synchronized' + ' class float package throws' + ' const goto private transient' + ' debugger implements protected volatile' + ' double import public let yield await' + ' null true false').split(' ');\n\n var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {};\n\n for (var i = 0, l = reservedWords.length; i < l; i++) {\n compilerWords[reservedWords[i]] = true;\n }\n})();\n\nJavaScriptCompiler.isValidJavaScriptVariableName = function (name) {\n return !JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name);\n};\n\nfunction strictLookup(requireTerminal, compiler, parts, type) {\n var stack = compiler.popStack(),\n i = 0,\n len = parts.length;\n if (requireTerminal) {\n len--;\n }\n\n for (; i < len; i++) {\n stack = compiler.nameLookup(stack, parts[i], type);\n }\n\n if (requireTerminal) {\n return [compiler.aliasable('this.strict'), '(', stack, ', ', compiler.quotedString(parts[i]), ')'];\n } else {\n return stack;\n }\n}\n\nexports['default'] = JavaScriptCompiler;\nmodule.exports = exports['default'];\n},{\"../base\":4,\"../exception\":15,\"../utils\":19,\"./code-gen\":7}],11:[function(require,module,exports){\n\"use strict\";\n\nexports.__esModule = true;\n/* istanbul ignore next */\n/* Jison generated parser */\nvar handlebars = (function () {\n var parser = { trace: function trace() {},\n yy: {},\n symbols_: { error: 2, root: 3, program: 4, EOF: 5, program_repetition0: 6, statement: 7, mustache: 8, block: 9, rawBlock: 10, partial: 11, content: 12, COMMENT: 13, CONTENT: 14, openRawBlock: 15, END_RAW_BLOCK: 16, OPEN_RAW_BLOCK: 17, helperName: 18, openRawBlock_repetition0: 19, openRawBlock_option0: 20, CLOSE_RAW_BLOCK: 21, openBlock: 22, block_option0: 23, closeBlock: 24, openInverse: 25, block_option1: 26, OPEN_BLOCK: 27, openBlock_repetition0: 28, openBlock_option0: 29, openBlock_option1: 30, CLOSE: 31, OPEN_INVERSE: 32, openInverse_repetition0: 33, openInverse_option0: 34, openInverse_option1: 35, openInverseChain: 36, OPEN_INVERSE_CHAIN: 37, openInverseChain_repetition0: 38, openInverseChain_option0: 39, openInverseChain_option1: 40, inverseAndProgram: 41, INVERSE: 42, inverseChain: 43, inverseChain_option0: 44, OPEN_ENDBLOCK: 45, OPEN: 46, mustache_repetition0: 47, mustache_option0: 48, OPEN_UNESCAPED: 49, mustache_repetition1: 50, mustache_option1: 51, CLOSE_UNESCAPED: 52, OPEN_PARTIAL: 53, partialName: 54, partial_repetition0: 55, partial_option0: 56, param: 57, sexpr: 58, OPEN_SEXPR: 59, sexpr_repetition0: 60, sexpr_option0: 61, CLOSE_SEXPR: 62, hash: 63, hash_repetition_plus0: 64, hashSegment: 65, ID: 66, EQUALS: 67, blockParams: 68, OPEN_BLOCK_PARAMS: 69, blockParams_repetition_plus0: 70, CLOSE_BLOCK_PARAMS: 71, path: 72, dataName: 73, STRING: 74, NUMBER: 75, BOOLEAN: 76, UNDEFINED: 77, NULL: 78, DATA: 79, pathSegments: 80, SEP: 81, $accept: 0, $end: 1 },\n terminals_: { 2: \"error\", 5: \"EOF\", 13: \"COMMENT\", 14: \"CONTENT\", 16: \"END_RAW_BLOCK\", 17: \"OPEN_RAW_BLOCK\", 21: \"CLOSE_RAW_BLOCK\", 27: \"OPEN_BLOCK\", 31: \"CLOSE\", 32: \"OPEN_INVERSE\", 37: \"OPEN_INVERSE_CHAIN\", 42: \"INVERSE\", 45: \"OPEN_ENDBLOCK\", 46: \"OPEN\", 49: \"OPEN_UNESCAPED\", 52: \"CLOSE_UNESCAPED\", 53: \"OPEN_PARTIAL\", 59: \"OPEN_SEXPR\", 62: \"CLOSE_SEXPR\", 66: \"ID\", 67: \"EQUALS\", 69: \"OPEN_BLOCK_PARAMS\", 71: \"CLOSE_BLOCK_PARAMS\", 74: \"STRING\", 75: \"NUMBER\", 76: \"BOOLEAN\", 77: \"UNDEFINED\", 78: \"NULL\", 79: \"DATA\", 81: \"SEP\" },\n productions_: [0, [3, 2], [4, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [12, 1], [10, 3], [15, 5], [9, 4], [9, 4], [22, 6], [25, 6], [36, 6], [41, 2], [43, 3], [43, 1], [24, 3], [8, 5], [8, 5], [11, 5], [57, 1], [57, 1], [58, 5], [63, 1], [65, 3], [68, 3], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [54, 1], [54, 1], [73, 2], [72, 1], [80, 3], [80, 1], [6, 0], [6, 2], [19, 0], [19, 2], [20, 0], [20, 1], [23, 0], [23, 1], [26, 0], [26, 1], [28, 0], [28, 2], [29, 0], [29, 1], [30, 0], [30, 1], [33, 0], [33, 2], [34, 0], [34, 1], [35, 0], [35, 1], [38, 0], [38, 2], [39, 0], [39, 1], [40, 0], [40, 1], [44, 0], [44, 1], [47, 0], [47, 2], [48, 0], [48, 1], [50, 0], [50, 2], [51, 0], [51, 1], [55, 0], [55, 2], [56, 0], [56, 1], [60, 0], [60, 2], [61, 0], [61, 1], [64, 1], [64, 2], [70, 1], [70, 2]],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) {\n\n var $0 = $$.length - 1;\n switch (yystate) {\n case 1:\n return $$[$0 - 1];\n break;\n case 2:\n this.$ = new yy.Program($$[$0], null, {}, yy.locInfo(this._$));\n break;\n case 3:\n this.$ = $$[$0];\n break;\n case 4:\n this.$ = $$[$0];\n break;\n case 5:\n this.$ = $$[$0];\n break;\n case 6:\n this.$ = $$[$0];\n break;\n case 7:\n this.$ = $$[$0];\n break;\n case 8:\n this.$ = new yy.CommentStatement(yy.stripComment($$[$0]), yy.stripFlags($$[$0], $$[$0]), yy.locInfo(this._$));\n break;\n case 9:\n this.$ = new yy.ContentStatement($$[$0], yy.locInfo(this._$));\n break;\n case 10:\n this.$ = yy.prepareRawBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$);\n break;\n case 11:\n this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1] };\n break;\n case 12:\n this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], false, this._$);\n break;\n case 13:\n this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], true, this._$);\n break;\n case 14:\n this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) };\n break;\n case 15:\n this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) };\n break;\n case 16:\n this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) };\n break;\n case 17:\n this.$ = { strip: yy.stripFlags($$[$0 - 1], $$[$0 - 1]), program: $$[$0] };\n break;\n case 18:\n var inverse = yy.prepareBlock($$[$0 - 2], $$[$0 - 1], $$[$0], $$[$0], false, this._$),\n program = new yy.Program([inverse], null, {}, yy.locInfo(this._$));\n program.chained = true;\n\n this.$ = { strip: $$[$0 - 2].strip, program: program, chain: true };\n\n break;\n case 19:\n this.$ = $$[$0];\n break;\n case 20:\n this.$ = { path: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 2], $$[$0]) };\n break;\n case 21:\n this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$);\n break;\n case 22:\n this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$);\n break;\n case 23:\n this.$ = new yy.PartialStatement($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], yy.stripFlags($$[$0 - 4], $$[$0]), yy.locInfo(this._$));\n break;\n case 24:\n this.$ = $$[$0];\n break;\n case 25:\n this.$ = $$[$0];\n break;\n case 26:\n this.$ = new yy.SubExpression($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], yy.locInfo(this._$));\n break;\n case 27:\n this.$ = new yy.Hash($$[$0], yy.locInfo(this._$));\n break;\n case 28:\n this.$ = new yy.HashPair(yy.id($$[$0 - 2]), $$[$0], yy.locInfo(this._$));\n break;\n case 29:\n this.$ = yy.id($$[$0 - 1]);\n break;\n case 30:\n this.$ = $$[$0];\n break;\n case 31:\n this.$ = $$[$0];\n break;\n case 32:\n this.$ = new yy.StringLiteral($$[$0], yy.locInfo(this._$));\n break;\n case 33:\n this.$ = new yy.NumberLiteral($$[$0], yy.locInfo(this._$));\n break;\n case 34:\n this.$ = new yy.BooleanLiteral($$[$0], yy.locInfo(this._$));\n break;\n case 35:\n this.$ = new yy.UndefinedLiteral(yy.locInfo(this._$));\n break;\n case 36:\n this.$ = new yy.NullLiteral(yy.locInfo(this._$));\n break;\n case 37:\n this.$ = $$[$0];\n break;\n case 38:\n this.$ = $$[$0];\n break;\n case 39:\n this.$ = yy.preparePath(true, $$[$0], this._$);\n break;\n case 40:\n this.$ = yy.preparePath(false, $$[$0], this._$);\n break;\n case 41:\n $$[$0 - 2].push({ part: yy.id($$[$0]), original: $$[$0], separator: $$[$0 - 1] });this.$ = $$[$0 - 2];\n break;\n case 42:\n this.$ = [{ part: yy.id($$[$0]), original: $$[$0] }];\n break;\n case 43:\n this.$ = [];\n break;\n case 44:\n $$[$0 - 1].push($$[$0]);\n break;\n case 45:\n this.$ = [];\n break;\n case 46:\n $$[$0 - 1].push($$[$0]);\n break;\n case 53:\n this.$ = [];\n break;\n case 54:\n $$[$0 - 1].push($$[$0]);\n break;\n case 59:\n this.$ = [];\n break;\n case 60:\n $$[$0 - 1].push($$[$0]);\n break;\n case 65:\n this.$ = [];\n break;\n case 66:\n $$[$0 - 1].push($$[$0]);\n break;\n case 73:\n this.$ = [];\n break;\n case 74:\n $$[$0 - 1].push($$[$0]);\n break;\n case 77:\n this.$ = [];\n break;\n case 78:\n $$[$0 - 1].push($$[$0]);\n break;\n case 81:\n this.$ = [];\n break;\n case 82:\n $$[$0 - 1].push($$[$0]);\n break;\n case 85:\n this.$ = [];\n break;\n case 86:\n $$[$0 - 1].push($$[$0]);\n break;\n case 89:\n this.$ = [$$[$0]];\n break;\n case 90:\n $$[$0 - 1].push($$[$0]);\n break;\n case 91:\n this.$ = [$$[$0]];\n break;\n case 92:\n $$[$0 - 1].push($$[$0]);\n break;\n }\n },\n table: [{ 3: 1, 4: 2, 5: [2, 43], 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 1: [3] }, { 5: [1, 4] }, { 5: [2, 2], 7: 5, 8: 6, 9: 7, 10: 8, 11: 9, 12: 10, 13: [1, 11], 14: [1, 18], 15: 16, 17: [1, 21], 22: 14, 25: 15, 27: [1, 19], 32: [1, 20], 37: [2, 2], 42: [2, 2], 45: [2, 2], 46: [1, 12], 49: [1, 13], 53: [1, 17] }, { 1: [2, 1] }, { 5: [2, 44], 13: [2, 44], 14: [2, 44], 17: [2, 44], 27: [2, 44], 32: [2, 44], 37: [2, 44], 42: [2, 44], 45: [2, 44], 46: [2, 44], 49: [2, 44], 53: [2, 44] }, { 5: [2, 3], 13: [2, 3], 14: [2, 3], 17: [2, 3], 27: [2, 3], 32: [2, 3], 37: [2, 3], 42: [2, 3], 45: [2, 3], 46: [2, 3], 49: [2, 3], 53: [2, 3] }, { 5: [2, 4], 13: [2, 4], 14: [2, 4], 17: [2, 4], 27: [2, 4], 32: [2, 4], 37: [2, 4], 42: [2, 4], 45: [2, 4], 46: [2, 4], 49: [2, 4], 53: [2, 4] }, { 5: [2, 5], 13: [2, 5], 14: [2, 5], 17: [2, 5], 27: [2, 5], 32: [2, 5], 37: [2, 5], 42: [2, 5], 45: [2, 5], 46: [2, 5], 49: [2, 5], 53: [2, 5] }, { 5: [2, 6], 13: [2, 6], 14: [2, 6], 17: [2, 6], 27: [2, 6], 32: [2, 6], 37: [2, 6], 42: [2, 6], 45: [2, 6], 46: [2, 6], 49: [2, 6], 53: [2, 6] }, { 5: [2, 7], 13: [2, 7], 14: [2, 7], 17: [2, 7], 27: [2, 7], 32: [2, 7], 37: [2, 7], 42: [2, 7], 45: [2, 7], 46: [2, 7], 49: [2, 7], 53: [2, 7] }, { 5: [2, 8], 13: [2, 8], 14: [2, 8], 17: [2, 8], 27: [2, 8], 32: [2, 8], 37: [2, 8], 42: [2, 8], 45: [2, 8], 46: [2, 8], 49: [2, 8], 53: [2, 8] }, { 18: 22, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 33, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 4: 34, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 37: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 4: 35, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 12: 36, 14: [1, 18] }, { 18: 38, 54: 37, 58: 39, 59: [1, 40], 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 9], 13: [2, 9], 14: [2, 9], 16: [2, 9], 17: [2, 9], 27: [2, 9], 32: [2, 9], 37: [2, 9], 42: [2, 9], 45: [2, 9], 46: [2, 9], 49: [2, 9], 53: [2, 9] }, { 18: 41, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 42, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 43, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 31: [2, 73], 47: 44, 59: [2, 73], 66: [2, 73], 74: [2, 73], 75: [2, 73], 76: [2, 73], 77: [2, 73], 78: [2, 73], 79: [2, 73] }, { 21: [2, 30], 31: [2, 30], 52: [2, 30], 59: [2, 30], 62: [2, 30], 66: [2, 30], 69: [2, 30], 74: [2, 30], 75: [2, 30], 76: [2, 30], 77: [2, 30], 78: [2, 30], 79: [2, 30] }, { 21: [2, 31], 31: [2, 31], 52: [2, 31], 59: [2, 31], 62: [2, 31], 66: [2, 31], 69: [2, 31], 74: [2, 31], 75: [2, 31], 76: [2, 31], 77: [2, 31], 78: [2, 31], 79: [2, 31] }, { 21: [2, 32], 31: [2, 32], 52: [2, 32], 59: [2, 32], 62: [2, 32], 66: [2, 32], 69: [2, 32], 74: [2, 32], 75: [2, 32], 76: [2, 32], 77: [2, 32], 78: [2, 32], 79: [2, 32] }, { 21: [2, 33], 31: [2, 33], 52: [2, 33], 59: [2, 33], 62: [2, 33], 66: [2, 33], 69: [2, 33], 74: [2, 33], 75: [2, 33], 76: [2, 33], 77: [2, 33], 78: [2, 33], 79: [2, 33] }, { 21: [2, 34], 31: [2, 34], 52: [2, 34], 59: [2, 34], 62: [2, 34], 66: [2, 34], 69: [2, 34], 74: [2, 34], 75: [2, 34], 76: [2, 34], 77: [2, 34], 78: [2, 34], 79: [2, 34] }, { 21: [2, 35], 31: [2, 35], 52: [2, 35], 59: [2, 35], 62: [2, 35], 66: [2, 35], 69: [2, 35], 74: [2, 35], 75: [2, 35], 76: [2, 35], 77: [2, 35], 78: [2, 35], 79: [2, 35] }, { 21: [2, 36], 31: [2, 36], 52: [2, 36], 59: [2, 36], 62: [2, 36], 66: [2, 36], 69: [2, 36], 74: [2, 36], 75: [2, 36], 76: [2, 36], 77: [2, 36], 78: [2, 36], 79: [2, 36] }, { 21: [2, 40], 31: [2, 40], 52: [2, 40], 59: [2, 40], 62: [2, 40], 66: [2, 40], 69: [2, 40], 74: [2, 40], 75: [2, 40], 76: [2, 40], 77: [2, 40], 78: [2, 40], 79: [2, 40], 81: [1, 45] }, { 66: [1, 32], 80: 46 }, { 21: [2, 42], 31: [2, 42], 52: [2, 42], 59: [2, 42], 62: [2, 42], 66: [2, 42], 69: [2, 42], 74: [2, 42], 75: [2, 42], 76: [2, 42], 77: [2, 42], 78: [2, 42], 79: [2, 42], 81: [2, 42] }, { 50: 47, 52: [2, 77], 59: [2, 77], 66: [2, 77], 74: [2, 77], 75: [2, 77], 76: [2, 77], 77: [2, 77], 78: [2, 77], 79: [2, 77] }, { 23: 48, 36: 50, 37: [1, 52], 41: 51, 42: [1, 53], 43: 49, 45: [2, 49] }, { 26: 54, 41: 55, 42: [1, 53], 45: [2, 51] }, { 16: [1, 56] }, { 31: [2, 81], 55: 57, 59: [2, 81], 66: [2, 81], 74: [2, 81], 75: [2, 81], 76: [2, 81], 77: [2, 81], 78: [2, 81], 79: [2, 81] }, { 31: [2, 37], 59: [2, 37], 66: [2, 37], 74: [2, 37], 75: [2, 37], 76: [2, 37], 77: [2, 37], 78: [2, 37], 79: [2, 37] }, { 31: [2, 38], 59: [2, 38], 66: [2, 38], 74: [2, 38], 75: [2, 38], 76: [2, 38], 77: [2, 38], 78: [2, 38], 79: [2, 38] }, { 18: 58, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 28: 59, 31: [2, 53], 59: [2, 53], 66: [2, 53], 69: [2, 53], 74: [2, 53], 75: [2, 53], 76: [2, 53], 77: [2, 53], 78: [2, 53], 79: [2, 53] }, { 31: [2, 59], 33: 60, 59: [2, 59], 66: [2, 59], 69: [2, 59], 74: [2, 59], 75: [2, 59], 76: [2, 59], 77: [2, 59], 78: [2, 59], 79: [2, 59] }, { 19: 61, 21: [2, 45], 59: [2, 45], 66: [2, 45], 74: [2, 45], 75: [2, 45], 76: [2, 45], 77: [2, 45], 78: [2, 45], 79: [2, 45] }, { 18: 65, 31: [2, 75], 48: 62, 57: 63, 58: 66, 59: [1, 40], 63: 64, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 66: [1, 70] }, { 21: [2, 39], 31: [2, 39], 52: [2, 39], 59: [2, 39], 62: [2, 39], 66: [2, 39], 69: [2, 39], 74: [2, 39], 75: [2, 39], 76: [2, 39], 77: [2, 39], 78: [2, 39], 79: [2, 39], 81: [1, 45] }, { 18: 65, 51: 71, 52: [2, 79], 57: 72, 58: 66, 59: [1, 40], 63: 73, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 24: 74, 45: [1, 75] }, { 45: [2, 50] }, { 4: 76, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 37: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 45: [2, 19] }, { 18: 77, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 4: 78, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 24: 79, 45: [1, 75] }, { 45: [2, 52] }, { 5: [2, 10], 13: [2, 10], 14: [2, 10], 17: [2, 10], 27: [2, 10], 32: [2, 10], 37: [2, 10], 42: [2, 10], 45: [2, 10], 46: [2, 10], 49: [2, 10], 53: [2, 10] }, { 18: 65, 31: [2, 83], 56: 80, 57: 81, 58: 66, 59: [1, 40], 63: 82, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 59: [2, 85], 60: 83, 62: [2, 85], 66: [2, 85], 74: [2, 85], 75: [2, 85], 76: [2, 85], 77: [2, 85], 78: [2, 85], 79: [2, 85] }, { 18: 65, 29: 84, 31: [2, 55], 57: 85, 58: 66, 59: [1, 40], 63: 86, 64: 67, 65: 68, 66: [1, 69], 69: [2, 55], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 65, 31: [2, 61], 34: 87, 57: 88, 58: 66, 59: [1, 40], 63: 89, 64: 67, 65: 68, 66: [1, 69], 69: [2, 61], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 65, 20: 90, 21: [2, 47], 57: 91, 58: 66, 59: [1, 40], 63: 92, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 31: [1, 93] }, { 31: [2, 74], 59: [2, 74], 66: [2, 74], 74: [2, 74], 75: [2, 74], 76: [2, 74], 77: [2, 74], 78: [2, 74], 79: [2, 74] }, { 31: [2, 76] }, { 21: [2, 24], 31: [2, 24], 52: [2, 24], 59: [2, 24], 62: [2, 24], 66: [2, 24], 69: [2, 24], 74: [2, 24], 75: [2, 24], 76: [2, 24], 77: [2, 24], 78: [2, 24], 79: [2, 24] }, { 21: [2, 25], 31: [2, 25], 52: [2, 25], 59: [2, 25], 62: [2, 25], 66: [2, 25], 69: [2, 25], 74: [2, 25], 75: [2, 25], 76: [2, 25], 77: [2, 25], 78: [2, 25], 79: [2, 25] }, { 21: [2, 27], 31: [2, 27], 52: [2, 27], 62: [2, 27], 65: 94, 66: [1, 95], 69: [2, 27] }, { 21: [2, 89], 31: [2, 89], 52: [2, 89], 62: [2, 89], 66: [2, 89], 69: [2, 89] }, { 21: [2, 42], 31: [2, 42], 52: [2, 42], 59: [2, 42], 62: [2, 42], 66: [2, 42], 67: [1, 96], 69: [2, 42], 74: [2, 42], 75: [2, 42], 76: [2, 42], 77: [2, 42], 78: [2, 42], 79: [2, 42], 81: [2, 42] }, { 21: [2, 41], 31: [2, 41], 52: [2, 41], 59: [2, 41], 62: [2, 41], 66: [2, 41], 69: [2, 41], 74: [2, 41], 75: [2, 41], 76: [2, 41], 77: [2, 41], 78: [2, 41], 79: [2, 41], 81: [2, 41] }, { 52: [1, 97] }, { 52: [2, 78], 59: [2, 78], 66: [2, 78], 74: [2, 78], 75: [2, 78], 76: [2, 78], 77: [2, 78], 78: [2, 78], 79: [2, 78] }, { 52: [2, 80] }, { 5: [2, 12], 13: [2, 12], 14: [2, 12], 17: [2, 12], 27: [2, 12], 32: [2, 12], 37: [2, 12], 42: [2, 12], 45: [2, 12], 46: [2, 12], 49: [2, 12], 53: [2, 12] }, { 18: 98, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 36: 50, 37: [1, 52], 41: 51, 42: [1, 53], 43: 100, 44: 99, 45: [2, 71] }, { 31: [2, 65], 38: 101, 59: [2, 65], 66: [2, 65], 69: [2, 65], 74: [2, 65], 75: [2, 65], 76: [2, 65], 77: [2, 65], 78: [2, 65], 79: [2, 65] }, { 45: [2, 17] }, { 5: [2, 13], 13: [2, 13], 14: [2, 13], 17: [2, 13], 27: [2, 13], 32: [2, 13], 37: [2, 13], 42: [2, 13], 45: [2, 13], 46: [2, 13], 49: [2, 13], 53: [2, 13] }, { 31: [1, 102] }, { 31: [2, 82], 59: [2, 82], 66: [2, 82], 74: [2, 82], 75: [2, 82], 76: [2, 82], 77: [2, 82], 78: [2, 82], 79: [2, 82] }, { 31: [2, 84] }, { 18: 65, 57: 104, 58: 66, 59: [1, 40], 61: 103, 62: [2, 87], 63: 105, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 30: 106, 31: [2, 57], 68: 107, 69: [1, 108] }, { 31: [2, 54], 59: [2, 54], 66: [2, 54], 69: [2, 54], 74: [2, 54], 75: [2, 54], 76: [2, 54], 77: [2, 54], 78: [2, 54], 79: [2, 54] }, { 31: [2, 56], 69: [2, 56] }, { 31: [2, 63], 35: 109, 68: 110, 69: [1, 108] }, { 31: [2, 60], 59: [2, 60], 66: [2, 60], 69: [2, 60], 74: [2, 60], 75: [2, 60], 76: [2, 60], 77: [2, 60], 78: [2, 60], 79: [2, 60] }, { 31: [2, 62], 69: [2, 62] }, { 21: [1, 111] }, { 21: [2, 46], 59: [2, 46], 66: [2, 46], 74: [2, 46], 75: [2, 46], 76: [2, 46], 77: [2, 46], 78: [2, 46], 79: [2, 46] }, { 21: [2, 48] }, { 5: [2, 21], 13: [2, 21], 14: [2, 21], 17: [2, 21], 27: [2, 21], 32: [2, 21], 37: [2, 21], 42: [2, 21], 45: [2, 21], 46: [2, 21], 49: [2, 21], 53: [2, 21] }, { 21: [2, 90], 31: [2, 90], 52: [2, 90], 62: [2, 90], 66: [2, 90], 69: [2, 90] }, { 67: [1, 96] }, { 18: 65, 57: 112, 58: 66, 59: [1, 40], 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 22], 13: [2, 22], 14: [2, 22], 17: [2, 22], 27: [2, 22], 32: [2, 22], 37: [2, 22], 42: [2, 22], 45: [2, 22], 46: [2, 22], 49: [2, 22], 53: [2, 22] }, { 31: [1, 113] }, { 45: [2, 18] }, { 45: [2, 72] }, { 18: 65, 31: [2, 67], 39: 114, 57: 115, 58: 66, 59: [1, 40], 63: 116, 64: 67, 65: 68, 66: [1, 69], 69: [2, 67], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 23], 13: [2, 23], 14: [2, 23], 17: [2, 23], 27: [2, 23], 32: [2, 23], 37: [2, 23], 42: [2, 23], 45: [2, 23], 46: [2, 23], 49: [2, 23], 53: [2, 23] }, { 62: [1, 117] }, { 59: [2, 86], 62: [2, 86], 66: [2, 86], 74: [2, 86], 75: [2, 86], 76: [2, 86], 77: [2, 86], 78: [2, 86], 79: [2, 86] }, { 62: [2, 88] }, { 31: [1, 118] }, { 31: [2, 58] }, { 66: [1, 120], 70: 119 }, { 31: [1, 121] }, { 31: [2, 64] }, { 14: [2, 11] }, { 21: [2, 28], 31: [2, 28], 52: [2, 28], 62: [2, 28], 66: [2, 28], 69: [2, 28] }, { 5: [2, 20], 13: [2, 20], 14: [2, 20], 17: [2, 20], 27: [2, 20], 32: [2, 20], 37: [2, 20], 42: [2, 20], 45: [2, 20], 46: [2, 20], 49: [2, 20], 53: [2, 20] }, { 31: [2, 69], 40: 122, 68: 123, 69: [1, 108] }, { 31: [2, 66], 59: [2, 66], 66: [2, 66], 69: [2, 66], 74: [2, 66], 75: [2, 66], 76: [2, 66], 77: [2, 66], 78: [2, 66], 79: [2, 66] }, { 31: [2, 68], 69: [2, 68] }, { 21: [2, 26], 31: [2, 26], 52: [2, 26], 59: [2, 26], 62: [2, 26], 66: [2, 26], 69: [2, 26], 74: [2, 26], 75: [2, 26], 76: [2, 26], 77: [2, 26], 78: [2, 26], 79: [2, 26] }, { 13: [2, 14], 14: [2, 14], 17: [2, 14], 27: [2, 14], 32: [2, 14], 37: [2, 14], 42: [2, 14], 45: [2, 14], 46: [2, 14], 49: [2, 14], 53: [2, 14] }, { 66: [1, 125], 71: [1, 124] }, { 66: [2, 91], 71: [2, 91] }, { 13: [2, 15], 14: [2, 15], 17: [2, 15], 27: [2, 15], 32: [2, 15], 42: [2, 15], 45: [2, 15], 46: [2, 15], 49: [2, 15], 53: [2, 15] }, { 31: [1, 126] }, { 31: [2, 70] }, { 31: [2, 29] }, { 66: [2, 92], 71: [2, 92] }, { 13: [2, 16], 14: [2, 16], 17: [2, 16], 27: [2, 16], 32: [2, 16], 37: [2, 16], 42: [2, 16], 45: [2, 16], 46: [2, 16], 49: [2, 16], 53: [2, 16] }],\n defaultActions: { 4: [2, 1], 49: [2, 50], 51: [2, 19], 55: [2, 52], 64: [2, 76], 73: [2, 80], 78: [2, 17], 82: [2, 84], 92: [2, 48], 99: [2, 18], 100: [2, 72], 105: [2, 88], 107: [2, 58], 110: [2, 64], 111: [2, 11], 123: [2, 70], 124: [2, 29] },\n parseError: function parseError(str, hash) {\n throw new Error(str);\n },\n parse: function parse(input) {\n var self = this,\n stack = [0],\n vstack = [null],\n lstack = [],\n table = this.table,\n yytext = \"\",\n yylineno = 0,\n yyleng = 0,\n recovering = 0,\n TERROR = 2,\n EOF = 1;\n this.lexer.setInput(input);\n this.lexer.yy = this.yy;\n this.yy.lexer = this.lexer;\n this.yy.parser = this;\n if (typeof this.lexer.yylloc == \"undefined\") this.lexer.yylloc = {};\n var yyloc = this.lexer.yylloc;\n lstack.push(yyloc);\n var ranges = this.lexer.options && this.lexer.options.ranges;\n if (typeof this.yy.parseError === \"function\") this.parseError = this.yy.parseError;\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n function lex() {\n var token;\n token = self.lexer.lex() || 1;\n if (typeof token !== \"number\") {\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol,\n preErrorSymbol,\n state,\n action,\n a,\n r,\n yyval = {},\n p,\n len,\n newState,\n expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == \"undefined\") {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === \"undefined\" || !action.length || !action[0]) {\n var errStr = \"\";\n if (!recovering) {\n expected = [];\n for (p in table[state]) if (this.terminals_[p] && p > 2) {\n expected.push(\"'\" + this.terminals_[p] + \"'\");\n }\n if (this.lexer.showPosition) {\n errStr = \"Parse error on line \" + (yylineno + 1) + \":\\n\" + this.lexer.showPosition() + \"\\nExpecting \" + expected.join(\", \") + \", got '\" + (this.terminals_[symbol] || symbol) + \"'\";\n } else {\n errStr = \"Parse error on line \" + (yylineno + 1) + \": Unexpected \" + (symbol == 1 ? \"end of input\" : \"'\" + (this.terminals_[symbol] || symbol) + \"'\");\n }\n this.parseError(errStr, { text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected });\n }\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error(\"Parse Error: multiple actions possible at state: \" + state + \", token: \" + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(this.lexer.yytext);\n lstack.push(this.lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = this.lexer.yyleng;\n yytext = this.lexer.yytext;\n yylineno = this.lexer.yylineno;\n yyloc = this.lexer.yylloc;\n if (recovering > 0) recovering--;\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = { first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column };\n if (ranges) {\n yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]];\n }\n r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);\n if (typeof r !== \"undefined\") {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n }\n };\n /* Jison generated lexer */\n var lexer = (function () {\n var lexer = { EOF: 1,\n parseError: function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n setInput: function setInput(input) {\n this._input = input;\n this._more = this._less = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = \"\";\n this.conditionStack = [\"INITIAL\"];\n this.yylloc = { first_line: 1, first_column: 0, last_line: 1, last_column: 0 };\n if (this.options.ranges) this.yylloc.range = [0, 0];\n this.offset = 0;\n return this;\n },\n input: function input() {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) this.yylloc.range[1]++;\n\n this._input = this._input.slice(1);\n return ch;\n },\n unput: function unput(ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len - 1);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) this.yylineno -= lines.length - 1;\n var r = this.yylloc.range;\n\n this.yylloc = { first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n return this;\n },\n more: function more() {\n this._more = true;\n return this;\n },\n less: function less(n) {\n this.unput(this.match.slice(n));\n },\n pastInput: function pastInput() {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? \"...\" : \"\") + past.substr(-20).replace(/\\n/g, \"\");\n },\n upcomingInput: function upcomingInput() {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20 - next.length);\n }\n return (next.substr(0, 20) + (next.length > 20 ? \"...\" : \"\")).replace(/\\n/g, \"\");\n },\n showPosition: function showPosition() {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n next: function next() {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) this.done = true;\n\n var token, match, tempMatch, index, col, lines;\n if (!this._more) {\n this.yytext = \"\";\n this.match = \"\";\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (!this.options.flex) break;\n }\n }\n if (match) {\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) this.yylineno += lines.length;\n this.yylloc = { first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length : this.yylloc.last_column + match[0].length };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, rules[index], this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) this.done = false;\n if (token) {\n return token;\n } else {\n return;\n }\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError(\"Lexical error on line \" + (this.yylineno + 1) + \". Unrecognized text.\\n\" + this.showPosition(), { text: \"\", token: null, line: this.yylineno });\n }\n },\n lex: function lex() {\n var r = this.next();\n if (typeof r !== \"undefined\") {\n return r;\n } else {\n return this.lex();\n }\n },\n begin: function begin(condition) {\n this.conditionStack.push(condition);\n },\n popState: function popState() {\n return this.conditionStack.pop();\n },\n _currentRules: function _currentRules() {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n },\n topState: function topState() {\n return this.conditionStack[this.conditionStack.length - 2];\n },\n pushState: function begin(condition) {\n this.begin(condition);\n } };\n lexer.options = {};\n lexer.performAction = function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) {\n\n function strip(start, end) {\n return yy_.yytext = yy_.yytext.substr(start, yy_.yyleng - end);\n }\n\n var YYSTATE = YY_START;\n switch ($avoiding_name_collisions) {\n case 0:\n if (yy_.yytext.slice(-2) === \"\\\\\\\\\") {\n strip(0, 1);\n this.begin(\"mu\");\n } else if (yy_.yytext.slice(-1) === \"\\\\\") {\n strip(0, 1);\n this.begin(\"emu\");\n } else {\n this.begin(\"mu\");\n }\n if (yy_.yytext) {\n return 14;\n }break;\n case 1:\n return 14;\n break;\n case 2:\n this.popState();\n return 14;\n\n break;\n case 3:\n yy_.yytext = yy_.yytext.substr(5, yy_.yyleng - 9);\n this.popState();\n return 16;\n\n break;\n case 4:\n return 14;\n break;\n case 5:\n this.popState();\n return 13;\n\n break;\n case 6:\n return 59;\n break;\n case 7:\n return 62;\n break;\n case 8:\n return 17;\n break;\n case 9:\n this.popState();\n this.begin(\"raw\");\n return 21;\n\n break;\n case 10:\n return 53;\n break;\n case 11:\n return 27;\n break;\n case 12:\n return 45;\n break;\n case 13:\n this.popState();return 42;\n break;\n case 14:\n this.popState();return 42;\n break;\n case 15:\n return 32;\n break;\n case 16:\n return 37;\n break;\n case 17:\n return 49;\n break;\n case 18:\n return 46;\n break;\n case 19:\n this.unput(yy_.yytext);\n this.popState();\n this.begin(\"com\");\n\n break;\n case 20:\n this.popState();\n return 13;\n\n break;\n case 21:\n return 46;\n break;\n case 22:\n return 67;\n break;\n case 23:\n return 66;\n break;\n case 24:\n return 66;\n break;\n case 25:\n return 81;\n break;\n case 26:\n // ignore whitespace\n break;\n case 27:\n this.popState();return 52;\n break;\n case 28:\n this.popState();return 31;\n break;\n case 29:\n yy_.yytext = strip(1, 2).replace(/\\\\\"/g, \"\\\"\");return 74;\n break;\n case 30:\n yy_.yytext = strip(1, 2).replace(/\\\\'/g, \"'\");return 74;\n break;\n case 31:\n return 79;\n break;\n case 32:\n return 76;\n break;\n case 33:\n return 76;\n break;\n case 34:\n return 77;\n break;\n case 35:\n return 78;\n break;\n case 36:\n return 75;\n break;\n case 37:\n return 69;\n break;\n case 38:\n return 71;\n break;\n case 39:\n return 66;\n break;\n case 40:\n return 66;\n break;\n case 41:\n return \"INVALID\";\n break;\n case 42:\n return 5;\n break;\n }\n };\n lexer.rules = [/^(?:[^\\x00]*?(?=(\\{\\{)))/, /^(?:[^\\x00]+)/, /^(?:[^\\x00]{2,}?(?=(\\{\\{|\\\\\\{\\{|\\\\\\\\\\{\\{|$)))/, /^(?:\\{\\{\\{\\{\\/[^\\s!\"#%-,\\.\\/;->@\\[-\\^`\\{-~]+(?=[=}\\s\\/.])\\}\\}\\}\\})/, /^(?:[^\\x00]*?(?=(\\{\\{\\{\\{\\/)))/, /^(?:[\\s\\S]*?--(~)?\\}\\})/, /^(?:\\()/, /^(?:\\))/, /^(?:\\{\\{\\{\\{)/, /^(?:\\}\\}\\}\\})/, /^(?:\\{\\{(~)?>)/, /^(?:\\{\\{(~)?#)/, /^(?:\\{\\{(~)?\\/)/, /^(?:\\{\\{(~)?\\^\\s*(~)?\\}\\})/, /^(?:\\{\\{(~)?\\s*else\\s*(~)?\\}\\})/, /^(?:\\{\\{(~)?\\^)/, /^(?:\\{\\{(~)?\\s*else\\b)/, /^(?:\\{\\{(~)?\\{)/, /^(?:\\{\\{(~)?&)/, /^(?:\\{\\{(~)?!--)/, /^(?:\\{\\{(~)?![\\s\\S]*?\\}\\})/, /^(?:\\{\\{(~)?)/, /^(?:=)/, /^(?:\\.\\.)/, /^(?:\\.(?=([=~}\\s\\/.)|])))/, /^(?:[\\/.])/, /^(?:\\s+)/, /^(?:\\}(~)?\\}\\})/, /^(?:(~)?\\}\\})/, /^(?:\"(\\\\[\"]|[^\"])*\")/, /^(?:'(\\\\[']|[^'])*')/, /^(?:@)/, /^(?:true(?=([~}\\s)])))/, /^(?:false(?=([~}\\s)])))/, /^(?:undefined(?=([~}\\s)])))/, /^(?:null(?=([~}\\s)])))/, /^(?:-?[0-9]+(?:\\.[0-9]+)?(?=([~}\\s)])))/, /^(?:as\\s+\\|)/, /^(?:\\|)/, /^(?:([^\\s!\"#%-,\\.\\/;->@\\[-\\^`\\{-~]+(?=([=~}\\s\\/.)|]))))/, /^(?:\\[[^\\]]*\\])/, /^(?:.)/, /^(?:$)/];\n lexer.conditions = { mu: { rules: [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], inclusive: false }, emu: { rules: [2], inclusive: false }, com: { rules: [5], inclusive: false }, raw: { rules: [3, 4], inclusive: false }, INITIAL: { rules: [0, 1, 42], inclusive: true } };\n return lexer;\n })();\n parser.lexer = lexer;\n function Parser() {\n this.yy = {};\n }Parser.prototype = parser;parser.Parser = Parser;\n return new Parser();\n})();exports[\"default\"] = handlebars;\nmodule.exports = exports[\"default\"];\n},{}],12:[function(require,module,exports){\n'use strict';\n\nvar _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; };\n\nexports.__esModule = true;\nexports.print = print;\nexports.PrintVisitor = PrintVisitor;\n/*eslint-disable new-cap */\n\nvar _Visitor = require('./visitor');\n\nvar _Visitor2 = _interopRequireWildcard(_Visitor);\n\nfunction print(ast) {\n return new PrintVisitor().accept(ast);\n}\n\nfunction PrintVisitor() {\n this.padding = 0;\n}\n\nPrintVisitor.prototype = new _Visitor2['default']();\n\nPrintVisitor.prototype.pad = function (string) {\n var out = '';\n\n for (var i = 0, l = this.padding; i < l; i++) {\n out = out + ' ';\n }\n\n out = out + string + '\\n';\n return out;\n};\n\nPrintVisitor.prototype.Program = function (program) {\n var out = '',\n body = program.body,\n i = undefined,\n l = undefined;\n\n if (program.blockParams) {\n var blockParams = 'BLOCK PARAMS: [';\n for (i = 0, l = program.blockParams.length; i < l; i++) {\n blockParams += ' ' + program.blockParams[i];\n }\n blockParams += ' ]';\n out += this.pad(blockParams);\n }\n\n for (i = 0, l = body.length; i < l; i++) {\n out = out + this.accept(body[i]);\n }\n\n this.padding--;\n\n return out;\n};\n\nPrintVisitor.prototype.MustacheStatement = function (mustache) {\n return this.pad('{{ ' + this.SubExpression(mustache) + ' }}');\n};\n\nPrintVisitor.prototype.BlockStatement = function (block) {\n var out = '';\n\n out = out + this.pad('BLOCK:');\n this.padding++;\n out = out + this.pad(this.SubExpression(block));\n if (block.program) {\n out = out + this.pad('PROGRAM:');\n this.padding++;\n out = out + this.accept(block.program);\n this.padding--;\n }\n if (block.inverse) {\n if (block.program) {\n this.padding++;\n }\n out = out + this.pad('{{^}}');\n this.padding++;\n out = out + this.accept(block.inverse);\n this.padding--;\n if (block.program) {\n this.padding--;\n }\n }\n this.padding--;\n\n return out;\n};\n\nPrintVisitor.prototype.PartialStatement = function (partial) {\n var content = 'PARTIAL:' + partial.name.original;\n if (partial.params[0]) {\n content += ' ' + this.accept(partial.params[0]);\n }\n if (partial.hash) {\n content += ' ' + this.accept(partial.hash);\n }\n return this.pad('{{> ' + content + ' }}');\n};\n\nPrintVisitor.prototype.ContentStatement = function (content) {\n return this.pad('CONTENT[ \\'' + content.value + '\\' ]');\n};\n\nPrintVisitor.prototype.CommentStatement = function (comment) {\n return this.pad('{{! \\'' + comment.value + '\\' }}');\n};\n\nPrintVisitor.prototype.SubExpression = function (sexpr) {\n var params = sexpr.params,\n paramStrings = [],\n hash = undefined;\n\n for (var i = 0, l = params.length; i < l; i++) {\n paramStrings.push(this.accept(params[i]));\n }\n\n params = '[' + paramStrings.join(', ') + ']';\n\n hash = sexpr.hash ? ' ' + this.accept(sexpr.hash) : '';\n\n return this.accept(sexpr.path) + ' ' + params + hash;\n};\n\nPrintVisitor.prototype.PathExpression = function (id) {\n var path = id.parts.join('/');\n return (id.data ? '@' : '') + 'PATH:' + path;\n};\n\nPrintVisitor.prototype.StringLiteral = function (string) {\n return '\"' + string.value + '\"';\n};\n\nPrintVisitor.prototype.NumberLiteral = function (number) {\n return 'NUMBER{' + number.value + '}';\n};\n\nPrintVisitor.prototype.BooleanLiteral = function (bool) {\n return 'BOOLEAN{' + bool.value + '}';\n};\n\nPrintVisitor.prototype.UndefinedLiteral = function () {\n return 'UNDEFINED';\n};\n\nPrintVisitor.prototype.NullLiteral = function () {\n return 'NULL';\n};\n\nPrintVisitor.prototype.Hash = function (hash) {\n var pairs = hash.pairs,\n joinedPairs = [];\n\n for (var i = 0, l = pairs.length; i < l; i++) {\n joinedPairs.push(this.accept(pairs[i]));\n }\n\n return 'HASH{' + joinedPairs.join(', ') + '}';\n};\nPrintVisitor.prototype.HashPair = function (pair) {\n return pair.key + '=' + this.accept(pair.value);\n};\n/*eslint-enable new-cap */\n},{\"./visitor\":13}],13:[function(require,module,exports){\n'use strict';\n\nvar _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; };\n\nexports.__esModule = true;\n\nvar _Exception = require('../exception');\n\nvar _Exception2 = _interopRequireWildcard(_Exception);\n\nvar _AST = require('./ast');\n\nvar _AST2 = _interopRequireWildcard(_AST);\n\nfunction Visitor() {\n this.parents = [];\n}\n\nVisitor.prototype = {\n constructor: Visitor,\n mutating: false,\n\n // Visits a given value. If mutating, will replace the value if necessary.\n acceptKey: function acceptKey(node, name) {\n var value = this.accept(node[name]);\n if (this.mutating) {\n // Hacky sanity check:\n if (value && (!value.type || !_AST2['default'][value.type])) {\n throw new _Exception2['default']('Unexpected node type \"' + value.type + '\" found when accepting ' + name + ' on ' + node.type);\n }\n node[name] = value;\n }\n },\n\n // Performs an accept operation with added sanity check to ensure\n // required keys are not removed.\n acceptRequired: function acceptRequired(node, name) {\n this.acceptKey(node, name);\n\n if (!node[name]) {\n throw new _Exception2['default'](node.type + ' requires ' + name);\n }\n },\n\n // Traverses a given array. If mutating, empty respnses will be removed\n // for child elements.\n acceptArray: function acceptArray(array) {\n for (var i = 0, l = array.length; i < l; i++) {\n this.acceptKey(array, i);\n\n if (!array[i]) {\n array.splice(i, 1);\n i--;\n l--;\n }\n }\n },\n\n accept: function accept(object) {\n if (!object) {\n return;\n }\n\n if (this.current) {\n this.parents.unshift(this.current);\n }\n this.current = object;\n\n var ret = this[object.type](object);\n\n this.current = this.parents.shift();\n\n if (!this.mutating || ret) {\n return ret;\n } else if (ret !== false) {\n return object;\n }\n },\n\n Program: function Program(program) {\n this.acceptArray(program.body);\n },\n\n MustacheStatement: function MustacheStatement(mustache) {\n this.acceptRequired(mustache, 'path');\n this.acceptArray(mustache.params);\n this.acceptKey(mustache, 'hash');\n },\n\n BlockStatement: function BlockStatement(block) {\n this.acceptRequired(block, 'path');\n this.acceptArray(block.params);\n this.acceptKey(block, 'hash');\n\n this.acceptKey(block, 'program');\n this.acceptKey(block, 'inverse');\n },\n\n PartialStatement: function PartialStatement(partial) {\n this.acceptRequired(partial, 'name');\n this.acceptArray(partial.params);\n this.acceptKey(partial, 'hash');\n },\n\n ContentStatement: function ContentStatement() {},\n CommentStatement: function CommentStatement() {},\n\n SubExpression: function SubExpression(sexpr) {\n this.acceptRequired(sexpr, 'path');\n this.acceptArray(sexpr.params);\n this.acceptKey(sexpr, 'hash');\n },\n\n PathExpression: function PathExpression() {},\n\n StringLiteral: function StringLiteral() {},\n NumberLiteral: function NumberLiteral() {},\n BooleanLiteral: function BooleanLiteral() {},\n UndefinedLiteral: function UndefinedLiteral() {},\n NullLiteral: function NullLiteral() {},\n\n Hash: function Hash(hash) {\n this.acceptArray(hash.pairs);\n },\n HashPair: function HashPair(pair) {\n this.acceptRequired(pair, 'value');\n }\n};\n\nexports['default'] = Visitor;\nmodule.exports = exports['default'];\n/* content */ /* comment */ /* path */ /* string */ /* number */ /* bool */ /* literal */ /* literal */\n},{\"../exception\":15,\"./ast\":5}],14:[function(require,module,exports){\n'use strict';\n\nvar _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; };\n\nexports.__esModule = true;\n\nvar _Visitor = require('./visitor');\n\nvar _Visitor2 = _interopRequireWildcard(_Visitor);\n\nfunction WhitespaceControl() {}\nWhitespaceControl.prototype = new _Visitor2['default']();\n\nWhitespaceControl.prototype.Program = function (program) {\n var isRoot = !this.isRootSeen;\n this.isRootSeen = true;\n\n var body = program.body;\n for (var i = 0, l = body.length; i < l; i++) {\n var current = body[i],\n strip = this.accept(current);\n\n if (!strip) {\n continue;\n }\n\n var _isPrevWhitespace = isPrevWhitespace(body, i, isRoot),\n _isNextWhitespace = isNextWhitespace(body, i, isRoot),\n openStandalone = strip.openStandalone && _isPrevWhitespace,\n closeStandalone = strip.closeStandalone && _isNextWhitespace,\n inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace;\n\n if (strip.close) {\n omitRight(body, i, true);\n }\n if (strip.open) {\n omitLeft(body, i, true);\n }\n\n if (inlineStandalone) {\n omitRight(body, i);\n\n if (omitLeft(body, i)) {\n // If we are on a standalone node, save the indent info for partials\n if (current.type === 'PartialStatement') {\n // Pull out the whitespace from the final line\n current.indent = /([ \\t]+$)/.exec(body[i - 1].original)[1];\n }\n }\n }\n if (openStandalone) {\n omitRight((current.program || current.inverse).body);\n\n // Strip out the previous content node if it's whitespace only\n omitLeft(body, i);\n }\n if (closeStandalone) {\n // Always strip the next node\n omitRight(body, i);\n\n omitLeft((current.inverse || current.program).body);\n }\n }\n\n return program;\n};\nWhitespaceControl.prototype.BlockStatement = function (block) {\n this.accept(block.program);\n this.accept(block.inverse);\n\n // Find the inverse program that is involed with whitespace stripping.\n var program = block.program || block.inverse,\n inverse = block.program && block.inverse,\n firstInverse = inverse,\n lastInverse = inverse;\n\n if (inverse && inverse.chained) {\n firstInverse = inverse.body[0].program;\n\n // Walk the inverse chain to find the last inverse that is actually in the chain.\n while (lastInverse.chained) {\n lastInverse = lastInverse.body[lastInverse.body.length - 1].program;\n }\n }\n\n var strip = {\n open: block.openStrip.open,\n close: block.closeStrip.close,\n\n // Determine the standalone candiacy. Basically flag our content as being possibly standalone\n // so our parent can determine if we actually are standalone\n openStandalone: isNextWhitespace(program.body),\n closeStandalone: isPrevWhitespace((firstInverse || program).body)\n };\n\n if (block.openStrip.close) {\n omitRight(program.body, null, true);\n }\n\n if (inverse) {\n var inverseStrip = block.inverseStrip;\n\n if (inverseStrip.open) {\n omitLeft(program.body, null, true);\n }\n\n if (inverseStrip.close) {\n omitRight(firstInverse.body, null, true);\n }\n if (block.closeStrip.open) {\n omitLeft(lastInverse.body, null, true);\n }\n\n // Find standalone else statments\n if (isPrevWhitespace(program.body) && isNextWhitespace(firstInverse.body)) {\n omitLeft(program.body);\n omitRight(firstInverse.body);\n }\n } else if (block.closeStrip.open) {\n omitLeft(program.body, null, true);\n }\n\n return strip;\n};\n\nWhitespaceControl.prototype.MustacheStatement = function (mustache) {\n return mustache.strip;\n};\n\nWhitespaceControl.prototype.PartialStatement = WhitespaceControl.prototype.CommentStatement = function (node) {\n /* istanbul ignore next */\n var strip = node.strip || {};\n return {\n inlineStandalone: true,\n open: strip.open,\n close: strip.close\n };\n};\n\nfunction isPrevWhitespace(body, i, isRoot) {\n if (i === undefined) {\n i = body.length;\n }\n\n // Nodes that end with newlines are considered whitespace (but are special\n // cased for strip operations)\n var prev = body[i - 1],\n sibling = body[i - 2];\n if (!prev) {\n return isRoot;\n }\n\n if (prev.type === 'ContentStatement') {\n return (sibling || !isRoot ? /\\r?\\n\\s*?$/ : /(^|\\r?\\n)\\s*?$/).test(prev.original);\n }\n}\nfunction isNextWhitespace(body, i, isRoot) {\n if (i === undefined) {\n i = -1;\n }\n\n var next = body[i + 1],\n sibling = body[i + 2];\n if (!next) {\n return isRoot;\n }\n\n if (next.type === 'ContentStatement') {\n return (sibling || !isRoot ? /^\\s*?\\r?\\n/ : /^\\s*?(\\r?\\n|$)/).test(next.original);\n }\n}\n\n// Marks the node to the right of the position as omitted.\n// I.e. {{foo}}' ' will mark the ' ' node as omitted.\n//\n// If i is undefined, then the first child will be marked as such.\n//\n// If mulitple is truthy then all whitespace will be stripped out until non-whitespace\n// content is met.\nfunction omitRight(body, i, multiple) {\n var current = body[i == null ? 0 : i + 1];\n if (!current || current.type !== 'ContentStatement' || !multiple && current.rightStripped) {\n return;\n }\n\n var original = current.value;\n current.value = current.value.replace(multiple ? /^\\s+/ : /^[ \\t]*\\r?\\n?/, '');\n current.rightStripped = current.value !== original;\n}\n\n// Marks the node to the left of the position as omitted.\n// I.e. ' '{{foo}} will mark the ' ' node as omitted.\n//\n// If i is undefined then the last child will be marked as such.\n//\n// If mulitple is truthy then all whitespace will be stripped out until non-whitespace\n// content is met.\nfunction omitLeft(body, i, multiple) {\n var current = body[i == null ? body.length - 1 : i - 1];\n if (!current || current.type !== 'ContentStatement' || !multiple && current.leftStripped) {\n return;\n }\n\n // We omit the last node if it's whitespace only and not preceeded by a non-content node.\n var original = current.value;\n current.value = current.value.replace(multiple ? /\\s+$/ : /[ \\t]+$/, '');\n current.leftStripped = current.value !== original;\n return current.leftStripped;\n}\n\nexports['default'] = WhitespaceControl;\nmodule.exports = exports['default'];\n},{\"./visitor\":13}],15:[function(require,module,exports){\n'use strict';\n\nexports.__esModule = true;\n\nvar errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];\n\nfunction Exception(message, node) {\n var loc = node && node.loc,\n line = undefined,\n column = undefined;\n if (loc) {\n line = loc.start.line;\n column = loc.start.column;\n\n message += ' - ' + line + ':' + column;\n }\n\n var tmp = Error.prototype.constructor.call(this, message);\n\n // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.\n for (var idx = 0; idx < errorProps.length; idx++) {\n this[errorProps[idx]] = tmp[errorProps[idx]];\n }\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, Exception);\n }\n\n if (loc) {\n this.lineNumber = line;\n this.column = column;\n }\n}\n\nException.prototype = new Error();\n\nexports['default'] = Exception;\nmodule.exports = exports['default'];\n},{}],16:[function(require,module,exports){\n(function (global){\n'use strict';\n\nexports.__esModule = true;\n/*global window */\n\nexports['default'] = function (Handlebars) {\n /* istanbul ignore next */\n var root = typeof global !== 'undefined' ? global : window,\n $Handlebars = root.Handlebars;\n /* istanbul ignore next */\n Handlebars.noConflict = function () {\n if (root.Handlebars === Handlebars) {\n root.Handlebars = $Handlebars;\n }\n };\n};\n\nmodule.exports = exports['default'];\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvbm8tY29uZmxpY3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuLypnbG9iYWwgd2luZG93ICovXG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChIYW5kbGViYXJzKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHZhciByb290ID0gdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB3aW5kb3csXG4gICAgICAkSGFuZGxlYmFycyA9IHJvb3QuSGFuZGxlYmFycztcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgSGFuZGxlYmFycy5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChyb290LkhhbmRsZWJhcnMgPT09IEhhbmRsZWJhcnMpIHtcbiAgICAgIHJvb3QuSGFuZGxlYmFycyA9ICRIYW5kbGViYXJzO1xuICAgIH1cbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyJdfQ==\n},{}],17:[function(require,module,exports){\n'use strict';\n\nvar _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; };\n\nexports.__esModule = true;\nexports.checkRevision = checkRevision;\n\n// TODO: Remove this line and break up compilePartial\n\nexports.template = template;\nexports.wrapProgram = wrapProgram;\nexports.resolvePartial = resolvePartial;\nexports.invokePartial = invokePartial;\nexports.noop = noop;\n\nvar _import = require('./utils');\n\nvar Utils = _interopRequireWildcard(_import);\n\nvar _Exception = require('./exception');\n\nvar _Exception2 = _interopRequireWildcard(_Exception);\n\nvar _COMPILER_REVISION$REVISION_CHANGES$createFrame = require('./base');\n\nfunction checkRevision(compilerInfo) {\n var compilerRevision = compilerInfo && compilerInfo[0] || 1,\n currentRevision = _COMPILER_REVISION$REVISION_CHANGES$createFrame.COMPILER_REVISION;\n\n if (compilerRevision !== currentRevision) {\n if (compilerRevision < currentRevision) {\n var runtimeVersions = _COMPILER_REVISION$REVISION_CHANGES$createFrame.REVISION_CHANGES[currentRevision],\n compilerVersions = _COMPILER_REVISION$REVISION_CHANGES$createFrame.REVISION_CHANGES[compilerRevision];\n throw new _Exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').');\n } else {\n // Use the embedded version info since the runtime doesn't know about this revision yet\n throw new _Exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').');\n }\n }\n}\n\nfunction template(templateSpec, env) {\n /* istanbul ignore next */\n if (!env) {\n throw new _Exception2['default']('No environment passed to template');\n }\n if (!templateSpec || !templateSpec.main) {\n throw new _Exception2['default']('Unknown template object: ' + typeof templateSpec);\n }\n\n // Note: Using env.VM references rather than local var references throughout this section to allow\n // for external users to override these as psuedo-supported APIs.\n env.VM.checkRevision(templateSpec.compiler);\n\n function invokePartialWrapper(partial, context, options) {\n if (options.hash) {\n context = Utils.extend({}, context, options.hash);\n }\n\n partial = env.VM.resolvePartial.call(this, partial, context, options);\n var result = env.VM.invokePartial.call(this, partial, context, options);\n\n if (result == null && env.compile) {\n options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env);\n result = options.partials[options.name](context, options);\n }\n if (result != null) {\n if (options.indent) {\n var lines = result.split('\\n');\n for (var i = 0, l = lines.length; i < l; i++) {\n if (!lines[i] && i + 1 === l) {\n break;\n }\n\n lines[i] = options.indent + lines[i];\n }\n result = lines.join('\\n');\n }\n return result;\n } else {\n throw new _Exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode');\n }\n }\n\n // Just add water\n var container = {\n strict: function strict(obj, name) {\n if (!(name in obj)) {\n throw new _Exception2['default']('\"' + name + '\" not defined in ' + obj);\n }\n return obj[name];\n },\n lookup: function lookup(depths, name) {\n var len = depths.length;\n for (var i = 0; i < len; i++) {\n if (depths[i] && depths[i][name] != null) {\n return depths[i][name];\n }\n }\n },\n lambda: function lambda(current, context) {\n return typeof current === 'function' ? current.call(context) : current;\n },\n\n escapeExpression: Utils.escapeExpression,\n invokePartial: invokePartialWrapper,\n\n fn: function fn(i) {\n return templateSpec[i];\n },\n\n programs: [],\n program: function program(i, data, declaredBlockParams, blockParams, depths) {\n var programWrapper = this.programs[i],\n fn = this.fn(i);\n if (data || depths || blockParams || declaredBlockParams) {\n programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths);\n } else if (!programWrapper) {\n programWrapper = this.programs[i] = wrapProgram(this, i, fn);\n }\n return programWrapper;\n },\n\n data: function data(value, depth) {\n while (value && depth--) {\n value = value._parent;\n }\n return value;\n },\n merge: function merge(param, common) {\n var obj = param || common;\n\n if (param && common && param !== common) {\n obj = Utils.extend({}, common, param);\n }\n\n return obj;\n },\n\n noop: env.VM.noop,\n compilerInfo: templateSpec.compiler\n };\n\n function ret(context) {\n var options = arguments[1] === undefined ? {} : arguments[1];\n\n var data = options.data;\n\n ret._setup(options);\n if (!options.partial && templateSpec.useData) {\n data = initData(context, data);\n }\n var depths = undefined,\n blockParams = templateSpec.useBlockParams ? [] : undefined;\n if (templateSpec.useDepths) {\n depths = options.depths ? [context].concat(options.depths) : [context];\n }\n\n return templateSpec.main.call(container, context, container.helpers, container.partials, data, blockParams, depths);\n }\n ret.isTop = true;\n\n ret._setup = function (options) {\n if (!options.partial) {\n container.helpers = container.merge(options.helpers, env.helpers);\n\n if (templateSpec.usePartial) {\n container.partials = container.merge(options.partials, env.partials);\n }\n } else {\n container.helpers = options.helpers;\n container.partials = options.partials;\n }\n };\n\n ret._child = function (i, data, blockParams, depths) {\n if (templateSpec.useBlockParams && !blockParams) {\n throw new _Exception2['default']('must pass block params');\n }\n if (templateSpec.useDepths && !depths) {\n throw new _Exception2['default']('must pass parent depths');\n }\n\n return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths);\n };\n return ret;\n}\n\nfunction wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) {\n function prog(context) {\n var options = arguments[1] === undefined ? {} : arguments[1];\n\n return fn.call(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), depths && [context].concat(depths));\n }\n prog.program = i;\n prog.depth = depths ? depths.length : 0;\n prog.blockParams = declaredBlockParams || 0;\n return prog;\n}\n\nfunction resolvePartial(partial, context, options) {\n if (!partial) {\n partial = options.partials[options.name];\n } else if (!partial.call && !options.name) {\n // This is a dynamic partial that returned a string\n options.name = partial;\n partial = options.partials[partial];\n }\n return partial;\n}\n\nfunction invokePartial(partial, context, options) {\n options.partial = true;\n\n if (partial === undefined) {\n throw new _Exception2['default']('The partial ' + options.name + ' could not be found');\n } else if (partial instanceof Function) {\n return partial(context, options);\n }\n}\n\nfunction noop() {\n return '';\n}\n\nfunction initData(context, data) {\n if (!data || !('root' in data)) {\n data = data ? _COMPILER_REVISION$REVISION_CHANGES$createFrame.createFrame(data) : {};\n data.root = context;\n }\n return data;\n}\n},{\"./base\":4,\"./exception\":15,\"./utils\":19}],18:[function(require,module,exports){\n'use strict';\n\nexports.__esModule = true;\n// Build out our basic SafeString type\nfunction SafeString(string) {\n this.string = string;\n}\n\nSafeString.prototype.toString = SafeString.prototype.toHTML = function () {\n return '' + this.string;\n};\n\nexports['default'] = SafeString;\nmodule.exports = exports['default'];\n},{}],19:[function(require,module,exports){\n'use strict';\n\nexports.__esModule = true;\nexports.extend = extend;\n\n// Older IE versions do not directly support indexOf so we must implement our own, sadly.\nexports.indexOf = indexOf;\nexports.escapeExpression = escapeExpression;\nexports.isEmpty = isEmpty;\nexports.blockParams = blockParams;\nexports.appendContextPath = appendContextPath;\nvar escape = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n '\\'': ''',\n '`': '`'\n};\n\nvar badChars = /[&<>\"'`]/g,\n possible = /[&<>\"'`]/;\n\nfunction escapeChar(chr) {\n return escape[chr];\n}\n\nfunction extend(obj /* , ...source */) {\n for (var i = 1; i < arguments.length; i++) {\n for (var key in arguments[i]) {\n if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {\n obj[key] = arguments[i][key];\n }\n }\n }\n\n return obj;\n}\n\nvar toString = Object.prototype.toString;\n\nexports.toString = toString;\n// Sourced from lodash\n// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt\n/*eslint-disable func-style, no-var */\nvar isFunction = function isFunction(value) {\n return typeof value === 'function';\n};\n// fallback for older versions of Chrome and Safari\n/* istanbul ignore next */\nif (isFunction(/x/)) {\n exports.isFunction = isFunction = function (value) {\n return typeof value === 'function' && toString.call(value) === '[object Function]';\n };\n}\nvar isFunction;\nexports.isFunction = isFunction;\n/*eslint-enable func-style, no-var */\n\n/* istanbul ignore next */\nvar isArray = Array.isArray || function (value) {\n return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false;\n};exports.isArray = isArray;\n\nfunction indexOf(array, value) {\n for (var i = 0, len = array.length; i < len; i++) {\n if (array[i] === value) {\n return i;\n }\n }\n return -1;\n}\n\nfunction escapeExpression(string) {\n if (typeof string !== 'string') {\n // don't escape SafeStrings, since they're already safe\n if (string && string.toHTML) {\n return string.toHTML();\n } else if (string == null) {\n return '';\n } else if (!string) {\n return string + '';\n }\n\n // Force a string conversion as this will be done by the append regardless and\n // the regex test will do this transparently behind the scenes, causing issues if\n // an object's to string has escaped characters in it.\n string = '' + string;\n }\n\n if (!possible.test(string)) {\n return string;\n }\n return string.replace(badChars, escapeChar);\n}\n\nfunction isEmpty(value) {\n if (!value && value !== 0) {\n return true;\n } else if (isArray(value) && value.length === 0) {\n return true;\n } else {\n return false;\n }\n}\n\nfunction blockParams(params, ids) {\n params.path = ids;\n return params;\n}\n\nfunction appendContextPath(contextPath, id) {\n return (contextPath ? contextPath + '.' : '') + id;\n}\n},{}],20:[function(require,module,exports){\n// USAGE:\n// var handlebars = require('handlebars');\n/* eslint-disable no-var */\n\n// var local = handlebars.create();\n\nvar handlebars = require('../dist/cjs/handlebars')['default'];\n\nvar printer = require('../dist/cjs/handlebars/compiler/printer');\nhandlebars.PrintVisitor = printer.PrintVisitor;\nhandlebars.print = printer.print;\n\nmodule.exports = handlebars;\n\n// Publish a Node.js require() handler for .handlebars and .hbs files\nfunction extension(module, filename) {\n var fs = require('fs');\n var templateString = fs.readFileSync(filename, 'utf8');\n module.exports = handlebars.compile(templateString);\n}\n/* istanbul ignore else */\nif (typeof require !== 'undefined' && require.extensions) {\n require.extensions['.handlebars'] = extension;\n require.extensions['.hbs'] = extension;\n}\n\n},{\"../dist/cjs/handlebars\":2,\"../dist/cjs/handlebars/compiler/printer\":12,\"fs\":22}],21:[function(require,module,exports){\n(function (process,__filename){\n/** vim: et:ts=4:sw=4:sts=4\n * @license amdefine 1.0.1 Copyright (c) 2011-2016, The Dojo Foundation All Rights Reserved.\n * Available via the MIT or new BSD license.\n * see: http://github.com/jrburke/amdefine for details\n */\n\n/*jslint node: true */\n/*global module, process */\n'use strict';\n\n/**\n * Creates a define for node.\n * @param {Object} module the \"module\" object that is defined by Node for the\n * current module.\n * @param {Function} [requireFn]. Node's require function for the current module.\n * It only needs to be passed in Node versions before 0.5, when module.require\n * did not exist.\n * @returns {Function} a define function that is usable for the current node\n * module.\n */\nfunction amdefine(module, requireFn) {\n 'use strict';\n var defineCache = {},\n loaderCache = {},\n alreadyCalled = false,\n path = require('path'),\n makeRequire, stringRequire;\n\n /**\n * Trims the . and .. from an array of path segments.\n * It will keep a leading path segment if a .. will become\n * the first path segment, to help with module name lookups,\n * which act like paths, but can be remapped. But the end result,\n * all paths that use this function should look normalized.\n * NOTE: this method MODIFIES the input array.\n * @param {Array} ary the array of path segments.\n */\n function trimDots(ary) {\n var i, part;\n for (i = 0; ary[i]; i+= 1) {\n part = ary[i];\n if (part === '.') {\n ary.splice(i, 1);\n i -= 1;\n } else if (part === '..') {\n if (i === 1 && (ary[2] === '..' || ary[0] === '..')) {\n //End of the line. Keep at least one non-dot\n //path segment at the front so it can be mapped\n //correctly to disk. Otherwise, there is likely\n //no path mapping for a path starting with '..'.\n //This can still fail, but catches the most reasonable\n //uses of ..\n break;\n } else if (i > 0) {\n ary.splice(i - 1, 2);\n i -= 2;\n }\n }\n }\n }\n\n function normalize(name, baseName) {\n var baseParts;\n\n //Adjust any relative paths.\n if (name && name.charAt(0) === '.') {\n //If have a base name, try to normalize against it,\n //otherwise, assume it is a top-level require that will\n //be relative to baseUrl in the end.\n if (baseName) {\n baseParts = baseName.split('/');\n baseParts = baseParts.slice(0, baseParts.length - 1);\n baseParts = baseParts.concat(name.split('/'));\n trimDots(baseParts);\n name = baseParts.join('/');\n }\n }\n\n return name;\n }\n\n /**\n * Create the normalize() function passed to a loader plugin's\n * normalize method.\n */\n function makeNormalize(relName) {\n return function (name) {\n return normalize(name, relName);\n };\n }\n\n function makeLoad(id) {\n function load(value) {\n loaderCache[id] = value;\n }\n\n load.fromText = function (id, text) {\n //This one is difficult because the text can/probably uses\n //define, and any relative paths and requires should be relative\n //to that id was it would be found on disk. But this would require\n //bootstrapping a module/require fairly deeply from node core.\n //Not sure how best to go about that yet.\n throw new Error('amdefine does not implement load.fromText');\n };\n\n return load;\n }\n\n makeRequire = function (systemRequire, exports, module, relId) {\n function amdRequire(deps, callback) {\n if (typeof deps === 'string') {\n //Synchronous, single module require('')\n return stringRequire(systemRequire, exports, module, deps, relId);\n } else {\n //Array of dependencies with a callback.\n\n //Convert the dependencies to modules.\n deps = deps.map(function (depName) {\n return stringRequire(systemRequire, exports, module, depName, relId);\n });\n\n //Wait for next tick to call back the require call.\n if (callback) {\n process.nextTick(function () {\n callback.apply(null, deps);\n });\n }\n }\n }\n\n amdRequire.toUrl = function (filePath) {\n if (filePath.indexOf('.') === 0) {\n return normalize(filePath, path.dirname(module.filename));\n } else {\n return filePath;\n }\n };\n\n return amdRequire;\n };\n\n //Favor explicit value, passed in if the module wants to support Node 0.4.\n requireFn = requireFn || function req() {\n return module.require.apply(module, arguments);\n };\n\n function runFactory(id, deps, factory) {\n var r, e, m, result;\n\n if (id) {\n e = loaderCache[id] = {};\n m = {\n id: id,\n uri: __filename,\n exports: e\n };\n r = makeRequire(requireFn, e, m, id);\n } else {\n //Only support one define call per file\n if (alreadyCalled) {\n throw new Error('amdefine with no module ID cannot be called more than once per file.');\n }\n alreadyCalled = true;\n\n //Use the real variables from node\n //Use module.exports for exports, since\n //the exports in here is amdefine exports.\n e = module.exports;\n m = module;\n r = makeRequire(requireFn, e, m, module.id);\n }\n\n //If there are dependencies, they are strings, so need\n //to convert them to dependency values.\n if (deps) {\n deps = deps.map(function (depName) {\n return r(depName);\n });\n }\n\n //Call the factory with the right dependencies.\n if (typeof factory === 'function') {\n result = factory.apply(m.exports, deps);\n } else {\n result = factory;\n }\n\n if (result !== undefined) {\n m.exports = result;\n if (id) {\n loaderCache[id] = m.exports;\n }\n }\n }\n\n stringRequire = function (systemRequire, exports, module, id, relId) {\n //Split the ID by a ! so that\n var index = id.indexOf('!'),\n originalId = id,\n prefix, plugin;\n\n if (index === -1) {\n id = normalize(id, relId);\n\n //Straight module lookup. If it is one of the special dependencies,\n //deal with it, otherwise, delegate to node.\n if (id === 'require') {\n return makeRequire(systemRequire, exports, module, relId);\n } else if (id === 'exports') {\n return exports;\n } else if (id === 'module') {\n return module;\n } else if (loaderCache.hasOwnProperty(id)) {\n return loaderCache[id];\n } else if (defineCache[id]) {\n runFactory.apply(null, defineCache[id]);\n return loaderCache[id];\n } else {\n if(systemRequire) {\n return systemRequire(originalId);\n } else {\n throw new Error('No module with ID: ' + id);\n }\n }\n } else {\n //There is a plugin in play.\n prefix = id.substring(0, index);\n id = id.substring(index + 1, id.length);\n\n plugin = stringRequire(systemRequire, exports, module, prefix, relId);\n\n if (plugin.normalize) {\n id = plugin.normalize(id, makeNormalize(relId));\n } else {\n //Normalize the ID normally.\n id = normalize(id, relId);\n }\n\n if (loaderCache[id]) {\n return loaderCache[id];\n } else {\n plugin.load(id, makeRequire(systemRequire, exports, module, relId), makeLoad(id), {});\n\n return loaderCache[id];\n }\n }\n };\n\n //Create a define function specific to the module asking for amdefine.\n function define(id, deps, factory) {\n if (Array.isArray(id)) {\n factory = deps;\n deps = id;\n id = undefined;\n } else if (typeof id !== 'string') {\n factory = id;\n id = deps = undefined;\n }\n\n if (deps && !Array.isArray(deps)) {\n factory = deps;\n deps = undefined;\n }\n\n if (!deps) {\n deps = ['require', 'exports', 'module'];\n }\n\n //Set up properties for this module. If an ID, then use\n //internal cache. If no ID, then use the external variables\n //for this node module.\n if (id) {\n //Put the module in deep freeze until there is a\n //require call for it.\n defineCache[id] = [id, deps, factory];\n } else {\n runFactory(id, deps, factory);\n }\n }\n\n //define.require, which has access to all the values in the\n //cache. Useful for AMD modules that all have IDs in the file,\n //but need to finally export a value to node based on one of those\n //IDs.\n define.require = function (id) {\n if (loaderCache[id]) {\n return loaderCache[id];\n }\n\n if (defineCache[id]) {\n runFactory.apply(null, defineCache[id]);\n return loaderCache[id];\n }\n };\n\n define.amd = {};\n\n return define;\n}\n\nmodule.exports = amdefine;\n\n}).call(this,require('_process'),\"/..\\\\..\\\\node_modules\\\\amdefine\\\\amdefine.js\")\n//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9hbWRlZmluZS9hbWRlZmluZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIHZpbTogZXQ6dHM9NDpzdz00OnN0cz00XG4gKiBAbGljZW5zZSBhbWRlZmluZSAxLjAuMSBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNiwgVGhlIERvam8gRm91bmRhdGlvbiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogQXZhaWxhYmxlIHZpYSB0aGUgTUlUIG9yIG5ldyBCU0QgbGljZW5zZS5cbiAqIHNlZTogaHR0cDovL2dpdGh1Yi5jb20vanJidXJrZS9hbWRlZmluZSBmb3IgZGV0YWlsc1xuICovXG5cbi8qanNsaW50IG5vZGU6IHRydWUgKi9cbi8qZ2xvYmFsIG1vZHVsZSwgcHJvY2VzcyAqL1xuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBkZWZpbmUgZm9yIG5vZGUuXG4gKiBAcGFyYW0ge09iamVjdH0gbW9kdWxlIHRoZSBcIm1vZHVsZVwiIG9iamVjdCB0aGF0IGlzIGRlZmluZWQgYnkgTm9kZSBmb3IgdGhlXG4gKiBjdXJyZW50IG1vZHVsZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZXF1aXJlRm5dLiBOb2RlJ3MgcmVxdWlyZSBmdW5jdGlvbiBmb3IgdGhlIGN1cnJlbnQgbW9kdWxlLlxuICogSXQgb25seSBuZWVkcyB0byBiZSBwYXNzZWQgaW4gTm9kZSB2ZXJzaW9ucyBiZWZvcmUgMC41LCB3aGVuIG1vZHVsZS5yZXF1aXJlXG4gKiBkaWQgbm90IGV4aXN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBhIGRlZmluZSBmdW5jdGlvbiB0aGF0IGlzIHVzYWJsZSBmb3IgdGhlIGN1cnJlbnQgbm9kZVxuICogbW9kdWxlLlxuICovXG5mdW5jdGlvbiBhbWRlZmluZShtb2R1bGUsIHJlcXVpcmVGbikge1xuICAgICd1c2Ugc3RyaWN0JztcbiAgICB2YXIgZGVmaW5lQ2FjaGUgPSB7fSxcbiAgICAgICAgbG9hZGVyQ2FjaGUgPSB7fSxcbiAgICAgICAgYWxyZWFkeUNhbGxlZCA9IGZhbHNlLFxuICAgICAgICBwYXRoID0gcmVxdWlyZSgncGF0aCcpLFxuICAgICAgICBtYWtlUmVxdWlyZSwgc3RyaW5nUmVxdWlyZTtcblxuICAgIC8qKlxuICAgICAqIFRyaW1zIHRoZSAuIGFuZCAuLiBmcm9tIGFuIGFycmF5IG9mIHBhdGggc2VnbWVudHMuXG4gICAgICogSXQgd2lsbCBrZWVwIGEgbGVhZGluZyBwYXRoIHNlZ21lbnQgaWYgYSAuLiB3aWxsIGJlY29tZVxuICAgICAqIHRoZSBmaXJzdCBwYXRoIHNlZ21lbnQsIHRvIGhlbHAgd2l0aCBtb2R1bGUgbmFtZSBsb29rdXBzLFxuICAgICAqIHdoaWNoIGFjdCBsaWtlIHBhdGhzLCBidXQgY2FuIGJlIHJlbWFwcGVkLiBCdXQgdGhlIGVuZCByZXN1bHQsXG4gICAgICogYWxsIHBhdGhzIHRoYXQgdXNlIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGxvb2sgbm9ybWFsaXplZC5cbiAgICAgKiBOT1RFOiB0aGlzIG1ldGhvZCBNT0RJRklFUyB0aGUgaW5wdXQgYXJyYXkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJ5IHRoZSBhcnJheSBvZiBwYXRoIHNlZ21lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyaW1Eb3RzKGFyeSkge1xuICAgICAgICB2YXIgaSwgcGFydDtcbiAgICAgICAgZm9yIChpID0gMDsgYXJ5W2ldOyBpKz0gMSkge1xuICAgICAgICAgICAgcGFydCA9IGFyeVtpXTtcbiAgICAgICAgICAgIGlmIChwYXJ0ID09PSAnLicpIHtcbiAgICAgICAgICAgICAgICBhcnkuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIGkgLT0gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykge1xuICAgICAgICAgICAgICAgIGlmIChpID09PSAxICYmIChhcnlbMl0gPT09ICcuLicgfHwgYXJ5WzBdID09PSAnLi4nKSkge1xuICAgICAgICAgICAgICAgICAgICAvL0VuZCBvZiB0aGUgbGluZS4gS2VlcCBhdCBsZWFzdCBvbmUgbm9uLWRvdFxuICAgICAgICAgICAgICAgICAgICAvL3BhdGggc2VnbWVudCBhdCB0aGUgZnJvbnQgc28gaXQgY2FuIGJlIG1hcHBlZFxuICAgICAgICAgICAgICAgICAgICAvL2NvcnJlY3RseSB0byBkaXNrLiBPdGhlcndpc2UsIHRoZXJlIGlzIGxpa2VseVxuICAgICAgICAgICAgICAgICAgICAvL25vIHBhdGggbWFwcGluZyBmb3IgYSBwYXRoIHN0YXJ0aW5nIHdpdGggJy4uJy5cbiAgICAgICAgICAgICAgICAgICAgLy9UaGlzIGNhbiBzdGlsbCBmYWlsLCBidXQgY2F0Y2hlcyB0aGUgbW9zdCByZWFzb25hYmxlXG4gICAgICAgICAgICAgICAgICAgIC8vdXNlcyBvZiAuLlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyeS5zcGxpY2UoaSAtIDEsIDIpO1xuICAgICAgICAgICAgICAgICAgICBpIC09IDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplKG5hbWUsIGJhc2VOYW1lKSB7XG4gICAgICAgIHZhciBiYXNlUGFydHM7XG5cbiAgICAgICAgLy9BZGp1c3QgYW55IHJlbGF0aXZlIHBhdGhzLlxuICAgICAgICBpZiAobmFtZSAmJiBuYW1lLmNoYXJBdCgwKSA9PT0gJy4nKSB7XG4gICAgICAgICAgICAvL0lmIGhhdmUgYSBiYXNlIG5hbWUsIHRyeSB0byBub3JtYWxpemUgYWdhaW5zdCBpdCxcbiAgICAgICAgICAgIC8vb3RoZXJ3aXNlLCBhc3N1bWUgaXQgaXMgYSB0b3AtbGV2ZWwgcmVxdWlyZSB0aGF0IHdpbGxcbiAgICAgICAgICAgIC8vYmUgcmVsYXRpdmUgdG8gYmFzZVVybCBpbiB0aGUgZW5kLlxuICAgICAgICAgICAgaWYgKGJhc2VOYW1lKSB7XG4gICAgICAgICAgICAgICAgYmFzZVBhcnRzID0gYmFzZU5hbWUuc3BsaXQoJy8nKTtcbiAgICAgICAgICAgICAgICBiYXNlUGFydHMgPSBiYXNlUGFydHMuc2xpY2UoMCwgYmFzZVBhcnRzLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIGJhc2VQYXJ0cyA9IGJhc2VQYXJ0cy5jb25jYXQobmFtZS5zcGxpdCgnLycpKTtcbiAgICAgICAgICAgICAgICB0cmltRG90cyhiYXNlUGFydHMpO1xuICAgICAgICAgICAgICAgIG5hbWUgPSBiYXNlUGFydHMuam9pbignLycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHRoZSBub3JtYWxpemUoKSBmdW5jdGlvbiBwYXNzZWQgdG8gYSBsb2FkZXIgcGx1Z2luJ3NcbiAgICAgKiBub3JtYWxpemUgbWV0aG9kLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1ha2VOb3JtYWxpemUocmVsTmFtZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBub3JtYWxpemUobmFtZSwgcmVsTmFtZSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUxvYWQoaWQpIHtcbiAgICAgICAgZnVuY3Rpb24gbG9hZCh2YWx1ZSkge1xuICAgICAgICAgICAgbG9hZGVyQ2FjaGVbaWRdID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBsb2FkLmZyb21UZXh0ID0gZnVuY3Rpb24gKGlkLCB0ZXh0KSB7XG4gICAgICAgICAgICAvL1RoaXMgb25lIGlzIGRpZmZpY3VsdCBiZWNhdXNlIHRoZSB0ZXh0IGNhbi9wcm9iYWJseSB1c2VzXG4gICAgICAgICAgICAvL2RlZmluZSwgYW5kIGFueSByZWxhdGl2ZSBwYXRocyBhbmQgcmVxdWlyZXMgc2hvdWxkIGJlIHJlbGF0aXZlXG4gICAgICAgICAgICAvL3RvIHRoYXQgaWQgd2FzIGl0IHdvdWxkIGJlIGZvdW5kIG9uIGRpc2suIEJ1dCB0aGlzIHdvdWxkIHJlcXVpcmVcbiAgICAgICAgICAgIC8vYm9vdHN0cmFwcGluZyBhIG1vZHVsZS9yZXF1aXJlIGZhaXJseSBkZWVwbHkgZnJvbSBub2RlIGNvcmUuXG4gICAgICAgICAgICAvL05vdCBzdXJlIGhvdyBiZXN0IHRvIGdvIGFib3V0IHRoYXQgeWV0LlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhbWRlZmluZSBkb2VzIG5vdCBpbXBsZW1lbnQgbG9hZC5mcm9tVGV4dCcpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBsb2FkO1xuICAgIH1cblxuICAgIG1ha2VSZXF1aXJlID0gZnVuY3Rpb24gKHN5c3RlbVJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSwgcmVsSWQpIHtcbiAgICAgICAgZnVuY3Rpb24gYW1kUmVxdWlyZShkZXBzLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXBzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIC8vU3luY2hyb25vdXMsIHNpbmdsZSBtb2R1bGUgcmVxdWlyZSgnJylcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nUmVxdWlyZShzeXN0ZW1SZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUsIGRlcHMsIHJlbElkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9BcnJheSBvZiBkZXBlbmRlbmNpZXMgd2l0aCBhIGNhbGxiYWNrLlxuXG4gICAgICAgICAgICAgICAgLy9Db252ZXJ0IHRoZSBkZXBlbmRlbmNpZXMgdG8gbW9kdWxlcy5cbiAgICAgICAgICAgICAgICBkZXBzID0gZGVwcy5tYXAoZnVuY3Rpb24gKGRlcE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1JlcXVpcmUoc3lzdGVtUmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlLCBkZXBOYW1lLCByZWxJZCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvL1dhaXQgZm9yIG5leHQgdGljayB0byBjYWxsIGJhY2sgdGhlIHJlcXVpcmUgY2FsbC5cbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBkZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYW1kUmVxdWlyZS50b1VybCA9IGZ1bmN0aW9uIChmaWxlUGF0aCkge1xuICAgICAgICAgICAgaWYgKGZpbGVQYXRoLmluZGV4T2YoJy4nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub3JtYWxpemUoZmlsZVBhdGgsIHBhdGguZGlybmFtZShtb2R1bGUuZmlsZW5hbWUpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVQYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBhbWRSZXF1aXJlO1xuICAgIH07XG5cbiAgICAvL0Zhdm9yIGV4cGxpY2l0IHZhbHVlLCBwYXNzZWQgaW4gaWYgdGhlIG1vZHVsZSB3YW50cyB0byBzdXBwb3J0IE5vZGUgMC40LlxuICAgIHJlcXVpcmVGbiA9IHJlcXVpcmVGbiB8fCBmdW5jdGlvbiByZXEoKSB7XG4gICAgICAgIHJldHVybiBtb2R1bGUucmVxdWlyZS5hcHBseShtb2R1bGUsIGFyZ3VtZW50cyk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHJ1bkZhY3RvcnkoaWQsIGRlcHMsIGZhY3RvcnkpIHtcbiAgICAgICAgdmFyIHIsIGUsIG0sIHJlc3VsdDtcblxuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIGUgPSBsb2FkZXJDYWNoZVtpZF0gPSB7fTtcbiAgICAgICAgICAgIG0gPSB7XG4gICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgIHVyaTogX19maWxlbmFtZSxcbiAgICAgICAgICAgICAgICBleHBvcnRzOiBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgciA9IG1ha2VSZXF1aXJlKHJlcXVpcmVGbiwgZSwgbSwgaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9Pbmx5IHN1cHBvcnQgb25lIGRlZmluZSBjYWxsIHBlciBmaWxlXG4gICAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYW1kZWZpbmUgd2l0aCBubyBtb2R1bGUgSUQgY2Fubm90IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBwZXIgZmlsZS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAvL1VzZSB0aGUgcmVhbCB2YXJpYWJsZXMgZnJvbSBub2RlXG4gICAgICAgICAgICAvL1VzZSBtb2R1bGUuZXhwb3J0cyBmb3IgZXhwb3J0cywgc2luY2VcbiAgICAgICAgICAgIC8vdGhlIGV4cG9ydHMgaW4gaGVyZSBpcyBhbWRlZmluZSBleHBvcnRzLlxuICAgICAgICAgICAgZSA9IG1vZHVsZS5leHBvcnRzO1xuICAgICAgICAgICAgbSA9IG1vZHVsZTtcbiAgICAgICAgICAgIHIgPSBtYWtlUmVxdWlyZShyZXF1aXJlRm4sIGUsIG0sIG1vZHVsZS5pZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvL0lmIHRoZXJlIGFyZSBkZXBlbmRlbmNpZXMsIHRoZXkgYXJlIHN0cmluZ3MsIHNvIG5lZWRcbiAgICAgICAgLy90byBjb252ZXJ0IHRoZW0gdG8gZGVwZW5kZW5jeSB2YWx1ZXMuXG4gICAgICAgIGlmIChkZXBzKSB7XG4gICAgICAgICAgICBkZXBzID0gZGVwcy5tYXAoZnVuY3Rpb24gKGRlcE5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcihkZXBOYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9DYWxsIHRoZSBmYWN0b3J5IHdpdGggdGhlIHJpZ2h0IGRlcGVuZGVuY2llcy5cbiAgICAgICAgaWYgKHR5cGVvZiBmYWN0b3J5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmYWN0b3J5LmFwcGx5KG0uZXhwb3J0cywgZGVwcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmYWN0b3J5O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBtLmV4cG9ydHMgPSByZXN1bHQ7XG4gICAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgICAgICBsb2FkZXJDYWNoZVtpZF0gPSBtLmV4cG9ydHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdHJpbmdSZXF1aXJlID0gZnVuY3Rpb24gKHN5c3RlbVJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSwgaWQsIHJlbElkKSB7XG4gICAgICAgIC8vU3BsaXQgdGhlIElEIGJ5IGEgISBzbyB0aGF0XG4gICAgICAgIHZhciBpbmRleCA9IGlkLmluZGV4T2YoJyEnKSxcbiAgICAgICAgICAgIG9yaWdpbmFsSWQgPSBpZCxcbiAgICAgICAgICAgIHByZWZpeCwgcGx1Z2luO1xuXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGlkID0gbm9ybWFsaXplKGlkLCByZWxJZCk7XG5cbiAgICAgICAgICAgIC8vU3RyYWlnaHQgbW9kdWxlIGxvb2t1cC4gSWYgaXQgaXMgb25lIG9mIHRoZSBzcGVjaWFsIGRlcGVuZGVuY2llcyxcbiAgICAgICAgICAgIC8vZGVhbCB3aXRoIGl0LCBvdGhlcndpc2UsIGRlbGVnYXRlIHRvIG5vZGUuXG4gICAgICAgICAgICBpZiAoaWQgPT09ICdyZXF1aXJlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBtYWtlUmVxdWlyZShzeXN0ZW1SZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUsIHJlbElkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQgPT09ICdleHBvcnRzJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBleHBvcnRzO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpZCA9PT0gJ21vZHVsZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsb2FkZXJDYWNoZS5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9hZGVyQ2FjaGVbaWRdO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkZWZpbmVDYWNoZVtpZF0pIHtcbiAgICAgICAgICAgICAgICBydW5GYWN0b3J5LmFwcGx5KG51bGwsIGRlZmluZUNhY2hlW2lkXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRlckNhY2hlW2lkXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYoc3lzdGVtUmVxdWlyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3lzdGVtUmVxdWlyZShvcmlnaW5hbElkKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIG1vZHVsZSB3aXRoIElEOiAnICsgaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vVGhlcmUgaXMgYSBwbHVnaW4gaW4gcGxheS5cbiAgICAgICAgICAgIHByZWZpeCA9IGlkLnN1YnN0cmluZygwLCBpbmRleCk7XG4gICAgICAgICAgICBpZCA9IGlkLnN1YnN0cmluZyhpbmRleCArIDEsIGlkLmxlbmd0aCk7XG5cbiAgICAgICAgICAgIHBsdWdpbiA9IHN0cmluZ1JlcXVpcmUoc3lzdGVtUmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlLCBwcmVmaXgsIHJlbElkKTtcblxuICAgICAgICAgICAgaWYgKHBsdWdpbi5ub3JtYWxpemUpIHtcbiAgICAgICAgICAgICAgICBpZCA9IHBsdWdpbi5ub3JtYWxpemUoaWQsIG1ha2VOb3JtYWxpemUocmVsSWQpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9Ob3JtYWxpemUgdGhlIElEIG5vcm1hbGx5LlxuICAgICAgICAgICAgICAgIGlkID0gbm9ybWFsaXplKGlkLCByZWxJZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsb2FkZXJDYWNoZVtpZF0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9hZGVyQ2FjaGVbaWRdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwbHVnaW4ubG9hZChpZCwgbWFrZVJlcXVpcmUoc3lzdGVtUmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlLCByZWxJZCksIG1ha2VMb2FkKGlkKSwge30pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRlckNhY2hlW2lkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvL0NyZWF0ZSBhIGRlZmluZSBmdW5jdGlvbiBzcGVjaWZpYyB0byB0aGUgbW9kdWxlIGFza2luZyBmb3IgYW1kZWZpbmUuXG4gICAgZnVuY3Rpb24gZGVmaW5lKGlkLCBkZXBzLCBmYWN0b3J5KSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGlkKSkge1xuICAgICAgICAgICAgZmFjdG9yeSA9IGRlcHM7XG4gICAgICAgICAgICBkZXBzID0gaWQ7XG4gICAgICAgICAgICBpZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBmYWN0b3J5ID0gaWQ7XG4gICAgICAgICAgICBpZCA9IGRlcHMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVwcyAmJiAhQXJyYXkuaXNBcnJheShkZXBzKSkge1xuICAgICAgICAgICAgZmFjdG9yeSA9IGRlcHM7XG4gICAgICAgICAgICBkZXBzID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkZXBzKSB7XG4gICAgICAgICAgICBkZXBzID0gWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJ107XG4gICAgICAgIH1cblxuICAgICAgICAvL1NldCB1cCBwcm9wZXJ0aWVzIGZvciB0aGlzIG1vZHVsZS4gSWYgYW4gSUQsIHRoZW4gdXNlXG4gICAgICAgIC8vaW50ZXJuYWwgY2FjaGUuIElmIG5vIElELCB0aGVuIHVzZSB0aGUgZXh0ZXJuYWwgdmFyaWFibGVzXG4gICAgICAgIC8vZm9yIHRoaXMgbm9kZSBtb2R1bGUuXG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgLy9QdXQgdGhlIG1vZHVsZSBpbiBkZWVwIGZyZWV6ZSB1bnRpbCB0aGVyZSBpcyBhXG4gICAgICAgICAgICAvL3JlcXVpcmUgY2FsbCBmb3IgaXQuXG4gICAgICAgICAgICBkZWZpbmVDYWNoZVtpZF0gPSBbaWQsIGRlcHMsIGZhY3RvcnldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcnVuRmFjdG9yeShpZCwgZGVwcywgZmFjdG9yeSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvL2RlZmluZS5yZXF1aXJlLCB3aGljaCBoYXMgYWNjZXNzIHRvIGFsbCB0aGUgdmFsdWVzIGluIHRoZVxuICAgIC8vY2FjaGUuIFVzZWZ1bCBmb3IgQU1EIG1vZHVsZXMgdGhhdCBhbGwgaGF2ZSBJRHMgaW4gdGhlIGZpbGUsXG4gICAgLy9idXQgbmVlZCB0byBmaW5hbGx5IGV4cG9ydCBhIHZhbHVlIHRvIG5vZGUgYmFzZWQgb24gb25lIG9mIHRob3NlXG4gICAgLy9JRHMuXG4gICAgZGVmaW5lLnJlcXVpcmUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgaWYgKGxvYWRlckNhY2hlW2lkXSkge1xuICAgICAgICAgICAgcmV0dXJuIGxvYWRlckNhY2hlW2lkXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWZpbmVDYWNoZVtpZF0pIHtcbiAgICAgICAgICAgIHJ1bkZhY3RvcnkuYXBwbHkobnVsbCwgZGVmaW5lQ2FjaGVbaWRdKTtcbiAgICAgICAgICAgIHJldHVybiBsb2FkZXJDYWNoZVtpZF07XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgZGVmaW5lLmFtZCA9IHt9O1xuXG4gICAgcmV0dXJuIGRlZmluZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhbWRlZmluZTtcbiJdfQ==\n},{\"_process\":23,\"path\":30}],22:[function(require,module,exports){\n\n},{}],23:[function(require,module,exports){\n// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n draining = true;\n var currentQueue;\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n var i = -1;\n while (++i < len) {\n currentQueue[i]();\n }\n len = queue.length;\n }\n draining = false;\n}\nprocess.nextTick = function (fun) {\n queue.push(fun);\n if (!draining) {\n setTimeout(drainQueue, 0);\n }\n};\n\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\n// TODO(shtylman)\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n},{}],24:[function(require,module,exports){\n(function (process,global){\n/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/jakearchibald/es6-promise/master/LICENSE\n * @version 2.3.0\n */\n\n(function() {\n \"use strict\";\n function lib$es6$promise$utils$$objectOrFunction(x) {\n return typeof x === 'function' || (typeof x === 'object' && x !== null);\n }\n\n function lib$es6$promise$utils$$isFunction(x) {\n return typeof x === 'function';\n }\n\n function lib$es6$promise$utils$$isMaybeThenable(x) {\n return typeof x === 'object' && x !== null;\n }\n\n var lib$es6$promise$utils$$_isArray;\n if (!Array.isArray) {\n lib$es6$promise$utils$$_isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n } else {\n lib$es6$promise$utils$$_isArray = Array.isArray;\n }\n\n var lib$es6$promise$utils$$isArray = lib$es6$promise$utils$$_isArray;\n var lib$es6$promise$asap$$len = 0;\n var lib$es6$promise$asap$$toString = {}.toString;\n var lib$es6$promise$asap$$vertxNext;\n var lib$es6$promise$asap$$customSchedulerFn;\n\n var lib$es6$promise$asap$$asap = function asap(callback, arg) {\n lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len] = callback;\n lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len + 1] = arg;\n lib$es6$promise$asap$$len += 2;\n if (lib$es6$promise$asap$$len === 2) {\n // If len is 2, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n if (lib$es6$promise$asap$$customSchedulerFn) {\n lib$es6$promise$asap$$customSchedulerFn(lib$es6$promise$asap$$flush);\n } else {\n lib$es6$promise$asap$$scheduleFlush();\n }\n }\n }\n\n function lib$es6$promise$asap$$setScheduler(scheduleFn) {\n lib$es6$promise$asap$$customSchedulerFn = scheduleFn;\n }\n\n function lib$es6$promise$asap$$setAsap(asapFn) {\n lib$es6$promise$asap$$asap = asapFn;\n }\n\n var lib$es6$promise$asap$$browserWindow = (typeof window !== 'undefined') ? window : undefined;\n var lib$es6$promise$asap$$browserGlobal = lib$es6$promise$asap$$browserWindow || {};\n var lib$es6$promise$asap$$BrowserMutationObserver = lib$es6$promise$asap$$browserGlobal.MutationObserver || lib$es6$promise$asap$$browserGlobal.WebKitMutationObserver;\n var lib$es6$promise$asap$$isNode = typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n // test for web worker but not in IE10\n var lib$es6$promise$asap$$isWorker = typeof Uint8ClampedArray !== 'undefined' &&\n typeof importScripts !== 'undefined' &&\n typeof MessageChannel !== 'undefined';\n\n // node\n function lib$es6$promise$asap$$useNextTick() {\n var nextTick = process.nextTick;\n // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n // setImmediate should be used instead instead\n var version = process.versions.node.match(/^(?:(\\d+)\\.)?(?:(\\d+)\\.)?(\\*|\\d+)$/);\n if (Array.isArray(version) && version[1] === '0' && version[2] === '10') {\n nextTick = setImmediate;\n }\n return function() {\n nextTick(lib$es6$promise$asap$$flush);\n };\n }\n\n // vertx\n function lib$es6$promise$asap$$useVertxTimer() {\n return function() {\n lib$es6$promise$asap$$vertxNext(lib$es6$promise$asap$$flush);\n };\n }\n\n function lib$es6$promise$asap$$useMutationObserver() {\n var iterations = 0;\n var observer = new lib$es6$promise$asap$$BrowserMutationObserver(lib$es6$promise$asap$$flush);\n var node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return function() {\n node.data = (iterations = ++iterations % 2);\n };\n }\n\n // web worker\n function lib$es6$promise$asap$$useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = lib$es6$promise$asap$$flush;\n return function () {\n channel.port2.postMessage(0);\n };\n }\n\n function lib$es6$promise$asap$$useSetTimeout() {\n return function() {\n setTimeout(lib$es6$promise$asap$$flush, 1);\n };\n }\n\n var lib$es6$promise$asap$$queue = new Array(1000);\n function lib$es6$promise$asap$$flush() {\n for (var i = 0; i < lib$es6$promise$asap$$len; i+=2) {\n var callback = lib$es6$promise$asap$$queue[i];\n var arg = lib$es6$promise$asap$$queue[i+1];\n\n callback(arg);\n\n lib$es6$promise$asap$$queue[i] = undefined;\n lib$es6$promise$asap$$queue[i+1] = undefined;\n }\n\n lib$es6$promise$asap$$len = 0;\n }\n\n function lib$es6$promise$asap$$attemptVertex() {\n try {\n var r = require;\n var vertx = r('vertx');\n lib$es6$promise$asap$$vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return lib$es6$promise$asap$$useVertxTimer();\n } catch(e) {\n return lib$es6$promise$asap$$useSetTimeout();\n }\n }\n\n var lib$es6$promise$asap$$scheduleFlush;\n // Decide what async method to use to triggering processing of queued callbacks:\n if (lib$es6$promise$asap$$isNode) {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useNextTick();\n } else if (lib$es6$promise$asap$$BrowserMutationObserver) {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMutationObserver();\n } else if (lib$es6$promise$asap$$isWorker) {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMessageChannel();\n } else if (lib$es6$promise$asap$$browserWindow === undefined && typeof require === 'function') {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$attemptVertex();\n } else {\n lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useSetTimeout();\n }\n\n function lib$es6$promise$$internal$$noop() {}\n\n var lib$es6$promise$$internal$$PENDING = void 0;\n var lib$es6$promise$$internal$$FULFILLED = 1;\n var lib$es6$promise$$internal$$REJECTED = 2;\n\n var lib$es6$promise$$internal$$GET_THEN_ERROR = new lib$es6$promise$$internal$$ErrorObject();\n\n function lib$es6$promise$$internal$$selfFullfillment() {\n return new TypeError(\"You cannot resolve a promise with itself\");\n }\n\n function lib$es6$promise$$internal$$cannotReturnOwn() {\n return new TypeError('A promises callback cannot return that same promise.');\n }\n\n function lib$es6$promise$$internal$$getThen(promise) {\n try {\n return promise.then;\n } catch(error) {\n lib$es6$promise$$internal$$GET_THEN_ERROR.error = error;\n return lib$es6$promise$$internal$$GET_THEN_ERROR;\n }\n }\n\n function lib$es6$promise$$internal$$tryThen(then, value, fulfillmentHandler, rejectionHandler) {\n try {\n then.call(value, fulfillmentHandler, rejectionHandler);\n } catch(e) {\n return e;\n }\n }\n\n function lib$es6$promise$$internal$$handleForeignThenable(promise, thenable, then) {\n lib$es6$promise$asap$$asap(function(promise) {\n var sealed = false;\n var error = lib$es6$promise$$internal$$tryThen(then, thenable, function(value) {\n if (sealed) { return; }\n sealed = true;\n if (thenable !== value) {\n lib$es6$promise$$internal$$resolve(promise, value);\n } else {\n lib$es6$promise$$internal$$fulfill(promise, value);\n }\n }, function(reason) {\n if (sealed) { return; }\n sealed = true;\n\n lib$es6$promise$$internal$$reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n lib$es6$promise$$internal$$reject(promise, error);\n }\n }, promise);\n }\n\n function lib$es6$promise$$internal$$handleOwnThenable(promise, thenable) {\n if (thenable._state === lib$es6$promise$$internal$$FULFILLED) {\n lib$es6$promise$$internal$$fulfill(promise, thenable._result);\n } else if (thenable._state === lib$es6$promise$$internal$$REJECTED) {\n lib$es6$promise$$internal$$reject(promise, thenable._result);\n } else {\n lib$es6$promise$$internal$$subscribe(thenable, undefined, function(value) {\n lib$es6$promise$$internal$$resolve(promise, value);\n }, function(reason) {\n lib$es6$promise$$internal$$reject(promise, reason);\n });\n }\n }\n\n function lib$es6$promise$$internal$$handleMaybeThenable(promise, maybeThenable) {\n if (maybeThenable.constructor === promise.constructor) {\n lib$es6$promise$$internal$$handleOwnThenable(promise, maybeThenable);\n } else {\n var then = lib$es6$promise$$internal$$getThen(maybeThenable);\n\n if (then === lib$es6$promise$$internal$$GET_THEN_ERROR) {\n lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$GET_THEN_ERROR.error);\n } else if (then === undefined) {\n lib$es6$promise$$internal$$fulfill(promise, maybeThenable);\n } else if (lib$es6$promise$utils$$isFunction(then)) {\n lib$es6$promise$$internal$$handleForeignThenable(promise, maybeThenable, then);\n } else {\n lib$es6$promise$$internal$$fulfill(promise, maybeThenable);\n }\n }\n }\n\n function lib$es6$promise$$internal$$resolve(promise, value) {\n if (promise === value) {\n lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$selfFullfillment());\n } else if (lib$es6$promise$utils$$objectOrFunction(value)) {\n lib$es6$promise$$internal$$handleMaybeThenable(promise, value);\n } else {\n lib$es6$promise$$internal$$fulfill(promise, value);\n }\n }\n\n function lib$es6$promise$$internal$$publishRejection(promise) {\n if (promise._onerror) {\n promise._onerror(promise._result);\n }\n\n lib$es6$promise$$internal$$publish(promise);\n }\n\n function lib$es6$promise$$internal$$fulfill(promise, value) {\n if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; }\n\n promise._result = value;\n promise._state = lib$es6$promise$$internal$$FULFILLED;\n\n if (promise._subscribers.length !== 0) {\n lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publish, promise);\n }\n }\n\n function lib$es6$promise$$internal$$reject(promise, reason) {\n if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; }\n promise._state = lib$es6$promise$$internal$$REJECTED;\n promise._result = reason;\n\n lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publishRejection, promise);\n }\n\n function lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection) {\n var subscribers = parent._subscribers;\n var length = subscribers.length;\n\n parent._onerror = null;\n\n subscribers[length] = child;\n subscribers[length + lib$es6$promise$$internal$$FULFILLED] = onFulfillment;\n subscribers[length + lib$es6$promise$$internal$$REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publish, parent);\n }\n }\n\n function lib$es6$promise$$internal$$publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\n\n if (subscribers.length === 0) { return; }\n\n var child, callback, detail = promise._result;\n\n for (var i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n if (child) {\n lib$es6$promise$$internal$$invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n }\n\n function lib$es6$promise$$internal$$ErrorObject() {\n this.error = null;\n }\n\n var lib$es6$promise$$internal$$TRY_CATCH_ERROR = new lib$es6$promise$$internal$$ErrorObject();\n\n function lib$es6$promise$$internal$$tryCatch(callback, detail) {\n try {\n return callback(detail);\n } catch(e) {\n lib$es6$promise$$internal$$TRY_CATCH_ERROR.error = e;\n return lib$es6$promise$$internal$$TRY_CATCH_ERROR;\n }\n }\n\n function lib$es6$promise$$internal$$invokeCallback(settled, promise, callback, detail) {\n var hasCallback = lib$es6$promise$utils$$isFunction(callback),\n value, error, succeeded, failed;\n\n if (hasCallback) {\n value = lib$es6$promise$$internal$$tryCatch(callback, detail);\n\n if (value === lib$es6$promise$$internal$$TRY_CATCH_ERROR) {\n failed = true;\n error = value.error;\n value = null;\n } else {\n succeeded = true;\n }\n\n if (promise === value) {\n lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$cannotReturnOwn());\n return;\n }\n\n } else {\n value = detail;\n succeeded = true;\n }\n\n if (promise._state !== lib$es6$promise$$internal$$PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n lib$es6$promise$$internal$$resolve(promise, value);\n } else if (failed) {\n lib$es6$promise$$internal$$reject(promise, error);\n } else if (settled === lib$es6$promise$$internal$$FULFILLED) {\n lib$es6$promise$$internal$$fulfill(promise, value);\n } else if (settled === lib$es6$promise$$internal$$REJECTED) {\n lib$es6$promise$$internal$$reject(promise, value);\n }\n }\n\n function lib$es6$promise$$internal$$initializePromise(promise, resolver) {\n try {\n resolver(function resolvePromise(value){\n lib$es6$promise$$internal$$resolve(promise, value);\n }, function rejectPromise(reason) {\n lib$es6$promise$$internal$$reject(promise, reason);\n });\n } catch(e) {\n lib$es6$promise$$internal$$reject(promise, e);\n }\n }\n\n function lib$es6$promise$enumerator$$Enumerator(Constructor, input) {\n var enumerator = this;\n\n enumerator._instanceConstructor = Constructor;\n enumerator.promise = new Constructor(lib$es6$promise$$internal$$noop);\n\n if (enumerator._validateInput(input)) {\n enumerator._input = input;\n enumerator.length = input.length;\n enumerator._remaining = input.length;\n\n enumerator._init();\n\n if (enumerator.length === 0) {\n lib$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result);\n } else {\n enumerator.length = enumerator.length || 0;\n enumerator._enumerate();\n if (enumerator._remaining === 0) {\n lib$es6$promise$$internal$$fulfill(enumerator.promise, enumerator._result);\n }\n }\n } else {\n lib$es6$promise$$internal$$reject(enumerator.promise, enumerator._validationError());\n }\n }\n\n lib$es6$promise$enumerator$$Enumerator.prototype._validateInput = function(input) {\n return lib$es6$promise$utils$$isArray(input);\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._validationError = function() {\n return new Error('Array Methods must be provided an Array');\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._init = function() {\n this._result = new Array(this.length);\n };\n\n var lib$es6$promise$enumerator$$default = lib$es6$promise$enumerator$$Enumerator;\n\n lib$es6$promise$enumerator$$Enumerator.prototype._enumerate = function() {\n var enumerator = this;\n\n var length = enumerator.length;\n var promise = enumerator.promise;\n var input = enumerator._input;\n\n for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {\n enumerator._eachEntry(input[i], i);\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._eachEntry = function(entry, i) {\n var enumerator = this;\n var c = enumerator._instanceConstructor;\n\n if (lib$es6$promise$utils$$isMaybeThenable(entry)) {\n if (entry.constructor === c && entry._state !== lib$es6$promise$$internal$$PENDING) {\n entry._onerror = null;\n enumerator._settledAt(entry._state, i, entry._result);\n } else {\n enumerator._willSettleAt(c.resolve(entry), i);\n }\n } else {\n enumerator._remaining--;\n enumerator._result[i] = entry;\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._settledAt = function(state, i, value) {\n var enumerator = this;\n var promise = enumerator.promise;\n\n if (promise._state === lib$es6$promise$$internal$$PENDING) {\n enumerator._remaining--;\n\n if (state === lib$es6$promise$$internal$$REJECTED) {\n lib$es6$promise$$internal$$reject(promise, value);\n } else {\n enumerator._result[i] = value;\n }\n }\n\n if (enumerator._remaining === 0) {\n lib$es6$promise$$internal$$fulfill(promise, enumerator._result);\n }\n };\n\n lib$es6$promise$enumerator$$Enumerator.prototype._willSettleAt = function(promise, i) {\n var enumerator = this;\n\n lib$es6$promise$$internal$$subscribe(promise, undefined, function(value) {\n enumerator._settledAt(lib$es6$promise$$internal$$FULFILLED, i, value);\n }, function(reason) {\n enumerator._settledAt(lib$es6$promise$$internal$$REJECTED, i, reason);\n });\n };\n function lib$es6$promise$promise$all$$all(entries) {\n return new lib$es6$promise$enumerator$$default(this, entries).promise;\n }\n var lib$es6$promise$promise$all$$default = lib$es6$promise$promise$all$$all;\n function lib$es6$promise$promise$race$$race(entries) {\n /*jshint validthis:true */\n var Constructor = this;\n\n var promise = new Constructor(lib$es6$promise$$internal$$noop);\n\n if (!lib$es6$promise$utils$$isArray(entries)) {\n lib$es6$promise$$internal$$reject(promise, new TypeError('You must pass an array to race.'));\n return promise;\n }\n\n var length = entries.length;\n\n function onFulfillment(value) {\n lib$es6$promise$$internal$$resolve(promise, value);\n }\n\n function onRejection(reason) {\n lib$es6$promise$$internal$$reject(promise, reason);\n }\n\n for (var i = 0; promise._state === lib$es6$promise$$internal$$PENDING && i < length; i++) {\n lib$es6$promise$$internal$$subscribe(Constructor.resolve(entries[i]), undefined, onFulfillment, onRejection);\n }\n\n return promise;\n }\n var lib$es6$promise$promise$race$$default = lib$es6$promise$promise$race$$race;\n function lib$es6$promise$promise$resolve$$resolve(object) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (object && typeof object === 'object' && object.constructor === Constructor) {\n return object;\n }\n\n var promise = new Constructor(lib$es6$promise$$internal$$noop);\n lib$es6$promise$$internal$$resolve(promise, object);\n return promise;\n }\n var lib$es6$promise$promise$resolve$$default = lib$es6$promise$promise$resolve$$resolve;\n function lib$es6$promise$promise$reject$$reject(reason) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(lib$es6$promise$$internal$$noop);\n lib$es6$promise$$internal$$reject(promise, reason);\n return promise;\n }\n var lib$es6$promise$promise$reject$$default = lib$es6$promise$promise$reject$$reject;\n\n var lib$es6$promise$promise$$counter = 0;\n\n function lib$es6$promise$promise$$needsResolver() {\n throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n }\n\n function lib$es6$promise$promise$$needsNew() {\n throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n }\n\n var lib$es6$promise$promise$$default = lib$es6$promise$promise$$Promise;\n /**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise's eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n var promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n var xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {function} resolver\n Useful for tooling.\n @constructor\n */\n function lib$es6$promise$promise$$Promise(resolver) {\n this._id = lib$es6$promise$promise$$counter++;\n this._state = undefined;\n this._result = undefined;\n this._subscribers = [];\n\n if (lib$es6$promise$$internal$$noop !== resolver) {\n if (!lib$es6$promise$utils$$isFunction(resolver)) {\n lib$es6$promise$promise$$needsResolver();\n }\n\n if (!(this instanceof lib$es6$promise$promise$$Promise)) {\n lib$es6$promise$promise$$needsNew();\n }\n\n lib$es6$promise$$internal$$initializePromise(this, resolver);\n }\n }\n\n lib$es6$promise$promise$$Promise.all = lib$es6$promise$promise$all$$default;\n lib$es6$promise$promise$$Promise.race = lib$es6$promise$promise$race$$default;\n lib$es6$promise$promise$$Promise.resolve = lib$es6$promise$promise$resolve$$default;\n lib$es6$promise$promise$$Promise.reject = lib$es6$promise$promise$reject$$default;\n lib$es6$promise$promise$$Promise._setScheduler = lib$es6$promise$asap$$setScheduler;\n lib$es6$promise$promise$$Promise._setAsap = lib$es6$promise$asap$$setAsap;\n lib$es6$promise$promise$$Promise._asap = lib$es6$promise$asap$$asap;\n\n lib$es6$promise$promise$$Promise.prototype = {\n constructor: lib$es6$promise$promise$$Promise,\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n\n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n\n Chaining\n --------\n\n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n\n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n\n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we're unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n\n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n\n Assimilation\n ------------\n\n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n\n If the assimliated promise rejects, then the downstream promise will also reject.\n\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n\n Simple Example\n --------------\n\n Synchronous Example\n\n ```javascript\n var result;\n\n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n\n Errback Example\n\n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n\n Promise Example;\n\n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n\n Advanced Example\n --------------\n\n Synchronous Example\n\n ```javascript\n var author, books;\n\n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n\n Errback Example\n\n ```js\n\n function foundBooks(books) {\n\n }\n\n function failure(reason) {\n\n }\n\n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n\n Promise Example;\n\n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n\n @method then\n @param {Function} onFulfilled\n @param {Function} onRejected\n Useful for tooling.\n @return {Promise}\n */\n then: function(onFulfillment, onRejection) {\n var parent = this;\n var state = parent._state;\n\n if (state === lib$es6$promise$$internal$$FULFILLED && !onFulfillment || state === lib$es6$promise$$internal$$REJECTED && !onRejection) {\n return this;\n }\n\n var child = new this.constructor(lib$es6$promise$$internal$$noop);\n var result = parent._result;\n\n if (state) {\n var callback = arguments[state - 1];\n lib$es6$promise$asap$$asap(function(){\n lib$es6$promise$$internal$$invokeCallback(state, child, callback, result);\n });\n } else {\n lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection);\n }\n\n return child;\n },\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n\n ```js\n function findAuthor(){\n throw new Error('couldn't find that author');\n }\n\n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n\n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n\n @method catch\n @param {Function} onRejection\n Useful for tooling.\n @return {Promise}\n */\n 'catch': function(onRejection) {\n return this.then(null, onRejection);\n }\n };\n function lib$es6$promise$polyfill$$polyfill() {\n var local;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P && Object.prototype.toString.call(P.resolve()) === '[object Promise]' && !P.cast) {\n return;\n }\n\n local.Promise = lib$es6$promise$promise$$default;\n }\n var lib$es6$promise$polyfill$$default = lib$es6$promise$polyfill$$polyfill;\n\n var lib$es6$promise$umd$$ES6Promise = {\n 'Promise': lib$es6$promise$promise$$default,\n 'polyfill': lib$es6$promise$polyfill$$default\n };\n\n /* global define:true module:true window: true */\n if (typeof define === 'function' && define['amd']) {\n define(function() { return lib$es6$promise$umd$$ES6Promise; });\n } else if (typeof module !== 'undefined' && module['exports']) {\n module['exports'] = lib$es6$promise$umd$$ES6Promise;\n } else if (typeof this !== 'undefined') {\n this['ES6Promise'] = lib$es6$promise$umd$$ES6Promise;\n }\n\n lib$es6$promise$polyfill$$default();\n}).call(this);\n\n\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9lczYtcHJvbWlzZS9kaXN0L2VzNi1wcm9taXNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBAb3ZlcnZpZXcgZXM2LXByb21pc2UgLSBhIHRpbnkgaW1wbGVtZW50YXRpb24gb2YgUHJvbWlzZXMvQSsuXG4gKiBAY29weXJpZ2h0IENvcHlyaWdodCAoYykgMjAxNCBZZWh1ZGEgS2F0eiwgVG9tIERhbGUsIFN0ZWZhbiBQZW5uZXIgYW5kIGNvbnRyaWJ1dG9ycyAoQ29udmVyc2lvbiB0byBFUzYgQVBJIGJ5IEpha2UgQXJjaGliYWxkKVxuICogQGxpY2Vuc2UgICBMaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZVxuICogICAgICAgICAgICBTZWUgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2pha2VhcmNoaWJhbGQvZXM2LXByb21pc2UvbWFzdGVyL0xJQ0VOU0VcbiAqIEB2ZXJzaW9uICAgMi4zLjBcbiAqL1xuXG4oZnVuY3Rpb24oKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHV0aWxzJCRvYmplY3RPckZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJyB8fCAodHlwZW9mIHggPT09ICdvYmplY3QnICYmIHggIT09IG51bGwpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNGdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHggPT09ICdmdW5jdGlvbic7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc01heWJlVGhlbmFibGUoeCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiB4ICE9PSBudWxsO1xuICAgIH1cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkdXRpbHMkJF9pc0FycmF5O1xuICAgIGlmICghQXJyYXkuaXNBcnJheSkge1xuICAgICAgbGliJGVzNiRwcm9taXNlJHV0aWxzJCRfaXNBcnJheSA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkdXRpbHMkJF9pc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbiAgICB9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc0FycmF5ID0gbGliJGVzNiRwcm9taXNlJHV0aWxzJCRfaXNBcnJheTtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJGxlbiA9IDA7XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkdmVydHhOZXh0O1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkY3VzdG9tU2NoZWR1bGVyRm47XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAgPSBmdW5jdGlvbiBhc2FwKGNhbGxiYWNrLCBhcmcpIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRxdWV1ZVtsaWIkZXM2JHByb21pc2UkYXNhcCQkbGVuXSA9IGNhbGxiYWNrO1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHF1ZXVlW2xpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW4gKyAxXSA9IGFyZztcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW4gKz0gMjtcbiAgICAgIGlmIChsaWIkZXM2JHByb21pc2UkYXNhcCQkbGVuID09PSAyKSB7XG4gICAgICAgIC8vIElmIGxlbiBpcyAyLCB0aGF0IG1lYW5zIHRoYXQgd2UgbmVlZCB0byBzY2hlZHVsZSBhbiBhc3luYyBmbHVzaC5cbiAgICAgICAgLy8gSWYgYWRkaXRpb25hbCBjYWxsYmFja3MgYXJlIHF1ZXVlZCBiZWZvcmUgdGhlIHF1ZXVlIGlzIGZsdXNoZWQsIHRoZXlcbiAgICAgICAgLy8gd2lsbCBiZSBwcm9jZXNzZWQgYnkgdGhpcyBmbHVzaCB0aGF0IHdlIGFyZSBzY2hlZHVsaW5nLlxuICAgICAgICBpZiAobGliJGVzNiRwcm9taXNlJGFzYXAkJGN1c3RvbVNjaGVkdWxlckZuKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGN1c3RvbVNjaGVkdWxlckZuKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRmbHVzaCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHNjaGVkdWxlRmx1c2goKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzZXRTY2hlZHVsZXIoc2NoZWR1bGVGbikge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGN1c3RvbVNjaGVkdWxlckZuID0gc2NoZWR1bGVGbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2V0QXNhcChhc2FwRm4pIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhc2FwID0gYXNhcEZuO1xuICAgIH1cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkYnJvd3NlcldpbmRvdyA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgPyB3aW5kb3cgOiB1bmRlZmluZWQ7XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRicm93c2VyR2xvYmFsID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJGJyb3dzZXJXaW5kb3cgfHwge307XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRCcm93c2VyTXV0YXRpb25PYnNlcnZlciA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRicm93c2VyR2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgbGliJGVzNiRwcm9taXNlJGFzYXAkJGJyb3dzZXJHbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJGlzTm9kZSA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiB7fS50b1N0cmluZy5jYWxsKHByb2Nlc3MpID09PSAnW29iamVjdCBwcm9jZXNzXSc7XG5cbiAgICAvLyB0ZXN0IGZvciB3ZWIgd29ya2VyIGJ1dCBub3QgaW4gSUUxMFxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkaXNXb3JrZXIgPSB0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICB0eXBlb2YgaW1wb3J0U2NyaXB0cyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIHR5cGVvZiBNZXNzYWdlQ2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCc7XG5cbiAgICAvLyBub2RlXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZU5leHRUaWNrKCkge1xuICAgICAgdmFyIG5leHRUaWNrID0gcHJvY2Vzcy5uZXh0VGljaztcbiAgICAgIC8vIG5vZGUgdmVyc2lvbiAwLjEwLnggZGlzcGxheXMgYSBkZXByZWNhdGlvbiB3YXJuaW5nIHdoZW4gbmV4dFRpY2sgaXMgdXNlZCByZWN1cnNpdmVseVxuICAgICAgLy8gc2V0SW1tZWRpYXRlIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgaW5zdGVhZFxuICAgICAgdmFyIHZlcnNpb24gPSBwcm9jZXNzLnZlcnNpb25zLm5vZGUubWF0Y2goL14oPzooXFxkKylcXC4pPyg/OihcXGQrKVxcLik/KFxcKnxcXGQrKSQvKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZlcnNpb24pICYmIHZlcnNpb25bMV0gPT09ICcwJyAmJiB2ZXJzaW9uWzJdID09PSAnMTAnKSB7XG4gICAgICAgIG5leHRUaWNrID0gc2V0SW1tZWRpYXRlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBuZXh0VGljayhsaWIkZXM2JHByb21pc2UkYXNhcCQkZmx1c2gpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyB2ZXJ0eFxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VWZXJ0eFRpbWVyKCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkdmVydHhOZXh0KGxpYiRlczYkcHJvbWlzZSRhc2FwJCRmbHVzaCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VNdXRhdGlvbk9ic2VydmVyKCkge1xuICAgICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgICAgdmFyIG9ic2VydmVyID0gbmV3IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRCcm93c2VyTXV0YXRpb25PYnNlcnZlcihsaWIkZXM2JHByb21pc2UkYXNhcCQkZmx1c2gpO1xuICAgICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgICBvYnNlcnZlci5vYnNlcnZlKG5vZGUsIHsgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBub2RlLmRhdGEgPSAoaXRlcmF0aW9ucyA9ICsraXRlcmF0aW9ucyAlIDIpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyB3ZWIgd29ya2VyXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZU1lc3NhZ2VDaGFubmVsKCkge1xuICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJGZsdXNoO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSgwKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZVNldFRpbWVvdXQoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHNldFRpbWVvdXQobGliJGVzNiRwcm9taXNlJGFzYXAkJGZsdXNoLCAxKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRxdWV1ZSA9IG5ldyBBcnJheSgxMDAwKTtcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkZmx1c2goKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW47IGkrPTIpIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHF1ZXVlW2ldO1xuICAgICAgICB2YXIgYXJnID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHF1ZXVlW2krMV07XG5cbiAgICAgICAgY2FsbGJhY2soYXJnKTtcblxuICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkcXVldWVbaV0gPSB1bmRlZmluZWQ7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRxdWV1ZVtpKzFdID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkbGVuID0gMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXR0ZW1wdFZlcnRleCgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciByID0gcmVxdWlyZTtcbiAgICAgICAgdmFyIHZlcnR4ID0gcigndmVydHgnKTtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHZlcnR4TmV4dCA9IHZlcnR4LnJ1bk9uTG9vcCB8fCB2ZXJ0eC5ydW5PbkNvbnRleHQ7XG4gICAgICAgIHJldHVybiBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlVmVydHhUaW1lcigpO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIHJldHVybiBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlU2V0VGltZW91dCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2NoZWR1bGVGbHVzaDtcbiAgICAvLyBEZWNpZGUgd2hhdCBhc3luYyBtZXRob2QgdG8gdXNlIHRvIHRyaWdnZXJpbmcgcHJvY2Vzc2luZyBvZiBxdWV1ZWQgY2FsbGJhY2tzOlxuICAgIGlmIChsaWIkZXM2JHByb21pc2UkYXNhcCQkaXNOb2RlKSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2NoZWR1bGVGbHVzaCA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VOZXh0VGljaygpO1xuICAgIH0gZWxzZSBpZiAobGliJGVzNiRwcm9taXNlJGFzYXAkJEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyKSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2NoZWR1bGVGbHVzaCA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VNdXRhdGlvbk9ic2VydmVyKCk7XG4gICAgfSBlbHNlIGlmIChsaWIkZXM2JHByb21pc2UkYXNhcCQkaXNXb3JrZXIpIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzY2hlZHVsZUZsdXNoID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZU1lc3NhZ2VDaGFubmVsKCk7XG4gICAgfSBlbHNlIGlmIChsaWIkZXM2JHByb21pc2UkYXNhcCQkYnJvd3NlcldpbmRvdyA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2NoZWR1bGVGbHVzaCA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhdHRlbXB0VmVydGV4KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzY2hlZHVsZUZsdXNoID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZVNldFRpbWVvdXQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRub29wKCkge31cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQRU5ESU5HICAgPSB2b2lkIDA7XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEZVTEZJTExFRCA9IDE7XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFJFSkVDVEVEICA9IDI7XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkR0VUX1RIRU5fRVJST1IgPSBuZXcgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRXJyb3JPYmplY3QoKTtcblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHNlbGZGdWxsZmlsbG1lbnQoKSB7XG4gICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihcIllvdSBjYW5ub3QgcmVzb2x2ZSBhIHByb21pc2Ugd2l0aCBpdHNlbGZcIik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkY2Fubm90UmV0dXJuT3duKCkge1xuICAgICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoJ0EgcHJvbWlzZXMgY2FsbGJhY2sgY2Fubm90IHJldHVybiB0aGF0IHNhbWUgcHJvbWlzZS4nKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRnZXRUaGVuKHByb21pc2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlLnRoZW47XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEdFVF9USEVOX0VSUk9SLmVycm9yID0gZXJyb3I7XG4gICAgICAgIHJldHVybiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRHRVRfVEhFTl9FUlJPUjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCR0cnlUaGVuKHRoZW4sIHZhbHVlLCBmdWxmaWxsbWVudEhhbmRsZXIsIHJlamVjdGlvbkhhbmRsZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgZnVsZmlsbG1lbnRIYW5kbGVyLCByZWplY3Rpb25IYW5kbGVyKTtcbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRoYW5kbGVGb3JlaWduVGhlbmFibGUocHJvbWlzZSwgdGhlbmFibGUsIHRoZW4pIHtcbiAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXNhcChmdW5jdGlvbihwcm9taXNlKSB7XG4gICAgICAgIHZhciBzZWFsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIGVycm9yID0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkdHJ5VGhlbih0aGVuLCB0aGVuYWJsZSwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICBpZiAoc2VhbGVkKSB7IHJldHVybjsgfVxuICAgICAgICAgIHNlYWxlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKHRoZW5hYmxlICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgICAgaWYgKHNlYWxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgICBzZWFsZWQgPSB0cnVlO1xuXG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgICAgIH0sICdTZXR0bGU6ICcgKyAocHJvbWlzZS5fbGFiZWwgfHwgJyB1bmtub3duIHByb21pc2UnKSk7XG5cbiAgICAgICAgaWYgKCFzZWFsZWQgJiYgZXJyb3IpIHtcbiAgICAgICAgICBzZWFsZWQgPSB0cnVlO1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sIHByb21pc2UpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGhhbmRsZU93blRoZW5hYmxlKHByb21pc2UsIHRoZW5hYmxlKSB7XG4gICAgICBpZiAodGhlbmFibGUuX3N0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRUQpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCB0aGVuYWJsZS5fcmVzdWx0KTtcbiAgICAgIH0gZWxzZSBpZiAodGhlbmFibGUuX3N0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgdGhlbmFibGUuX3Jlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRzdWJzY3JpYmUodGhlbmFibGUsIHVuZGVmaW5lZCwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKTtcbiAgICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGhhbmRsZU1heWJlVGhlbmFibGUocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSkge1xuICAgICAgaWYgKG1heWJlVGhlbmFibGUuY29uc3RydWN0b3IgPT09IHByb21pc2UuY29uc3RydWN0b3IpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaGFuZGxlT3duVGhlbmFibGUocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgdGhlbiA9IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGdldFRoZW4obWF5YmVUaGVuYWJsZSk7XG5cbiAgICAgICAgaWYgKHRoZW4gPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEdFVF9USEVOX0VSUk9SKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEdFVF9USEVOX0VSUk9SLmVycm9yKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIG1heWJlVGhlbmFibGUpO1xuICAgICAgICB9IGVsc2UgaWYgKGxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNGdW5jdGlvbih0aGVuKSkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGhhbmRsZUZvcmVpZ25UaGVuYWJsZShwcm9taXNlLCBtYXliZVRoZW5hYmxlLCB0aGVuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIG1heWJlVGhlbmFibGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSkge1xuICAgICAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRzZWxmRnVsbGZpbGxtZW50KCkpO1xuICAgICAgfSBlbHNlIGlmIChsaWIkZXM2JHByb21pc2UkdXRpbHMkJG9iamVjdE9yRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGhhbmRsZU1heWJlVGhlbmFibGUocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcHVibGlzaFJlamVjdGlvbihwcm9taXNlKSB7XG4gICAgICBpZiAocHJvbWlzZS5fb25lcnJvcikge1xuICAgICAgICBwcm9taXNlLl9vbmVycm9yKHByb21pc2UuX3Jlc3VsdCk7XG4gICAgICB9XG5cbiAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHB1Ymxpc2gocHJvbWlzZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCB2YWx1ZSkge1xuICAgICAgaWYgKHByb21pc2UuX3N0YXRlICE9PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQRU5ESU5HKSB7IHJldHVybjsgfVxuXG4gICAgICBwcm9taXNlLl9yZXN1bHQgPSB2YWx1ZTtcbiAgICAgIHByb21pc2UuX3N0YXRlID0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVEO1xuXG4gICAgICBpZiAocHJvbWlzZS5fc3Vic2NyaWJlcnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhc2FwKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHB1Ymxpc2gsIHByb21pc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCByZWFzb24pIHtcbiAgICAgIGlmIChwcm9taXNlLl9zdGF0ZSAhPT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUEVORElORykgeyByZXR1cm47IH1cbiAgICAgIHByb21pc2UuX3N0YXRlID0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUkVKRUNURUQ7XG4gICAgICBwcm9taXNlLl9yZXN1bHQgPSByZWFzb247XG5cbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhc2FwKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHB1Ymxpc2hSZWplY3Rpb24sIHByb21pc2UpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHN1YnNjcmliZShwYXJlbnQsIGNoaWxkLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbikge1xuICAgICAgdmFyIHN1YnNjcmliZXJzID0gcGFyZW50Ll9zdWJzY3JpYmVycztcbiAgICAgIHZhciBsZW5ndGggPSBzdWJzY3JpYmVycy5sZW5ndGg7XG5cbiAgICAgIHBhcmVudC5fb25lcnJvciA9IG51bGw7XG5cbiAgICAgIHN1YnNjcmliZXJzW2xlbmd0aF0gPSBjaGlsZDtcbiAgICAgIHN1YnNjcmliZXJzW2xlbmd0aCArIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEZVTEZJTExFRF0gPSBvbkZ1bGZpbGxtZW50O1xuICAgICAgc3Vic2NyaWJlcnNbbGVuZ3RoICsgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUkVKRUNURURdICA9IG9uUmVqZWN0aW9uO1xuXG4gICAgICBpZiAobGVuZ3RoID09PSAwICYmIHBhcmVudC5fc3RhdGUpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcHVibGlzaCwgcGFyZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRwdWJsaXNoKHByb21pc2UpIHtcbiAgICAgIHZhciBzdWJzY3JpYmVycyA9IHByb21pc2UuX3N1YnNjcmliZXJzO1xuICAgICAgdmFyIHNldHRsZWQgPSBwcm9taXNlLl9zdGF0ZTtcblxuICAgICAgaWYgKHN1YnNjcmliZXJzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm47IH1cblxuICAgICAgdmFyIGNoaWxkLCBjYWxsYmFjaywgZGV0YWlsID0gcHJvbWlzZS5fcmVzdWx0O1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN1YnNjcmliZXJzLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIGNoaWxkID0gc3Vic2NyaWJlcnNbaV07XG4gICAgICAgIGNhbGxiYWNrID0gc3Vic2NyaWJlcnNbaSArIHNldHRsZWRdO1xuXG4gICAgICAgIGlmIChjaGlsZCkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGludm9rZUNhbGxiYWNrKHNldHRsZWQsIGNoaWxkLCBjYWxsYmFjaywgZGV0YWlsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWxsYmFjayhkZXRhaWwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByb21pc2UuX3N1YnNjcmliZXJzLmxlbmd0aCA9IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRXJyb3JPYmplY3QoKSB7XG4gICAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkVFJZX0NBVENIX0VSUk9SID0gbmV3IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEVycm9yT2JqZWN0KCk7XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCR0cnlDYXRjaChjYWxsYmFjaywgZGV0YWlsKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZGV0YWlsKTtcbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRUUllfQ0FUQ0hfRVJST1IuZXJyb3IgPSBlO1xuICAgICAgICByZXR1cm4gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkVFJZX0NBVENIX0VSUk9SO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGludm9rZUNhbGxiYWNrKHNldHRsZWQsIHByb21pc2UsIGNhbGxiYWNrLCBkZXRhaWwpIHtcbiAgICAgIHZhciBoYXNDYWxsYmFjayA9IGxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNGdW5jdGlvbihjYWxsYmFjayksXG4gICAgICAgICAgdmFsdWUsIGVycm9yLCBzdWNjZWVkZWQsIGZhaWxlZDtcblxuICAgICAgaWYgKGhhc0NhbGxiYWNrKSB7XG4gICAgICAgIHZhbHVlID0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkdHJ5Q2F0Y2goY2FsbGJhY2ssIGRldGFpbCk7XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRUUllfQ0FUQ0hfRVJST1IpIHtcbiAgICAgICAgICBmYWlsZWQgPSB0cnVlO1xuICAgICAgICAgIGVycm9yID0gdmFsdWUuZXJyb3I7XG4gICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1Y2NlZWRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkY2Fubm90UmV0dXJuT3duKCkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IGRldGFpbDtcbiAgICAgICAgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb21pc2UuX3N0YXRlICE9PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQRU5ESU5HKSB7XG4gICAgICAgIC8vIG5vb3BcbiAgICAgIH0gZWxzZSBpZiAoaGFzQ2FsbGJhY2sgJiYgc3VjY2VlZGVkKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChmYWlsZWQpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIGVycm9yKTtcbiAgICAgIH0gZWxzZSBpZiAoc2V0dGxlZCA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVEKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChzZXR0bGVkID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGluaXRpYWxpemVQcm9taXNlKHByb21pc2UsIHJlc29sdmVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXNvbHZlcihmdW5jdGlvbiByZXNvbHZlUHJvbWlzZSh2YWx1ZSl7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIHJlamVjdFByb21pc2UocmVhc29uKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvcihDb25zdHJ1Y3RvciwgaW5wdXQpIHtcbiAgICAgIHZhciBlbnVtZXJhdG9yID0gdGhpcztcblxuICAgICAgZW51bWVyYXRvci5faW5zdGFuY2VDb25zdHJ1Y3RvciA9IENvbnN0cnVjdG9yO1xuICAgICAgZW51bWVyYXRvci5wcm9taXNlID0gbmV3IENvbnN0cnVjdG9yKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3ApO1xuXG4gICAgICBpZiAoZW51bWVyYXRvci5fdmFsaWRhdGVJbnB1dChpbnB1dCkpIHtcbiAgICAgICAgZW51bWVyYXRvci5faW5wdXQgICAgID0gaW5wdXQ7XG4gICAgICAgIGVudW1lcmF0b3IubGVuZ3RoICAgICA9IGlucHV0Lmxlbmd0aDtcbiAgICAgICAgZW51bWVyYXRvci5fcmVtYWluaW5nID0gaW5wdXQubGVuZ3RoO1xuXG4gICAgICAgIGVudW1lcmF0b3IuX2luaXQoKTtcblxuICAgICAgICBpZiAoZW51bWVyYXRvci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKGVudW1lcmF0b3IucHJvbWlzZSwgZW51bWVyYXRvci5fcmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbnVtZXJhdG9yLmxlbmd0aCA9IGVudW1lcmF0b3IubGVuZ3RoIHx8IDA7XG4gICAgICAgICAgZW51bWVyYXRvci5fZW51bWVyYXRlKCk7XG4gICAgICAgICAgaWYgKGVudW1lcmF0b3IuX3JlbWFpbmluZyA9PT0gMCkge1xuICAgICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChlbnVtZXJhdG9yLnByb21pc2UsIGVudW1lcmF0b3IuX3Jlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QoZW51bWVyYXRvci5wcm9taXNlLCBlbnVtZXJhdG9yLl92YWxpZGF0aW9uRXJyb3IoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl92YWxpZGF0ZUlucHV0ID0gZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgIHJldHVybiBsaWIkZXM2JHByb21pc2UkdXRpbHMkJGlzQXJyYXkoaW5wdXQpO1xuICAgIH07XG5cbiAgICBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX3ZhbGlkYXRpb25FcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIG5ldyBFcnJvcignQXJyYXkgTWV0aG9kcyBtdXN0IGJlIHByb3ZpZGVkIGFuIEFycmF5Jyk7XG4gICAgfTtcblxuICAgIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5fcmVzdWx0ID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTtcbiAgICB9O1xuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRkZWZhdWx0ID0gbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3I7XG5cbiAgICBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX2VudW1lcmF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGVudW1lcmF0b3IgPSB0aGlzO1xuXG4gICAgICB2YXIgbGVuZ3RoICA9IGVudW1lcmF0b3IubGVuZ3RoO1xuICAgICAgdmFyIHByb21pc2UgPSBlbnVtZXJhdG9yLnByb21pc2U7XG4gICAgICB2YXIgaW5wdXQgICA9IGVudW1lcmF0b3IuX2lucHV0O1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgcHJvbWlzZS5fc3RhdGUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcgJiYgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGVudW1lcmF0b3IuX2VhY2hFbnRyeShpbnB1dFtpXSwgaSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5fZWFjaEVudHJ5ID0gZnVuY3Rpb24oZW50cnksIGkpIHtcbiAgICAgIHZhciBlbnVtZXJhdG9yID0gdGhpcztcbiAgICAgIHZhciBjID0gZW51bWVyYXRvci5faW5zdGFuY2VDb25zdHJ1Y3RvcjtcblxuICAgICAgaWYgKGxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNNYXliZVRoZW5hYmxlKGVudHJ5KSkge1xuICAgICAgICBpZiAoZW50cnkuY29uc3RydWN0b3IgPT09IGMgJiYgZW50cnkuX3N0YXRlICE9PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQRU5ESU5HKSB7XG4gICAgICAgICAgZW50cnkuX29uZXJyb3IgPSBudWxsO1xuICAgICAgICAgIGVudW1lcmF0b3IuX3NldHRsZWRBdChlbnRyeS5fc3RhdGUsIGksIGVudHJ5Ll9yZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVudW1lcmF0b3IuX3dpbGxTZXR0bGVBdChjLnJlc29sdmUoZW50cnkpLCBpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW51bWVyYXRvci5fcmVtYWluaW5nLS07XG4gICAgICAgIGVudW1lcmF0b3IuX3Jlc3VsdFtpXSA9IGVudHJ5O1xuICAgICAgfVxuICAgIH07XG5cbiAgICBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX3NldHRsZWRBdCA9IGZ1bmN0aW9uKHN0YXRlLCBpLCB2YWx1ZSkge1xuICAgICAgdmFyIGVudW1lcmF0b3IgPSB0aGlzO1xuICAgICAgdmFyIHByb21pc2UgPSBlbnVtZXJhdG9yLnByb21pc2U7XG5cbiAgICAgIGlmIChwcm9taXNlLl9zdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUEVORElORykge1xuICAgICAgICBlbnVtZXJhdG9yLl9yZW1haW5pbmctLTtcblxuICAgICAgICBpZiAoc3RhdGUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFJFSkVDVEVEKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbnVtZXJhdG9yLl9yZXN1bHRbaV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZW51bWVyYXRvci5fcmVtYWluaW5nID09PSAwKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgZW51bWVyYXRvci5fcmVzdWx0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl93aWxsU2V0dGxlQXQgPSBmdW5jdGlvbihwcm9taXNlLCBpKSB7XG4gICAgICB2YXIgZW51bWVyYXRvciA9IHRoaXM7XG5cbiAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHN1YnNjcmliZShwcm9taXNlLCB1bmRlZmluZWQsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIGVudW1lcmF0b3IuX3NldHRsZWRBdChsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRUQsIGksIHZhbHVlKTtcbiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICBlbnVtZXJhdG9yLl9zZXR0bGVkQXQobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUkVKRUNURUQsIGksIHJlYXNvbik7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJGFsbCQkYWxsKGVudHJpZXMpIHtcbiAgICAgIHJldHVybiBuZXcgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJGRlZmF1bHQodGhpcywgZW50cmllcykucHJvbWlzZTtcbiAgICB9XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJGFsbCQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJGFsbCQkYWxsO1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJhY2UkJHJhY2UoZW50cmllcykge1xuICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICAgIHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7XG5cbiAgICAgIHZhciBwcm9taXNlID0gbmV3IENvbnN0cnVjdG9yKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3ApO1xuXG4gICAgICBpZiAoIWxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNBcnJheShlbnRyaWVzKSkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhbiBhcnJheSB0byByYWNlLicpKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBsZW5ndGggPSBlbnRyaWVzLmxlbmd0aDtcblxuICAgICAgZnVuY3Rpb24gb25GdWxmaWxsbWVudCh2YWx1ZSkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gb25SZWplY3Rpb24ocmVhc29uKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgcHJvbWlzZS5fc3RhdGUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcgJiYgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHN1YnNjcmliZShDb25zdHJ1Y3Rvci5yZXNvbHZlKGVudHJpZXNbaV0pLCB1bmRlZmluZWQsIG9uRnVsZmlsbG1lbnQsIG9uUmVqZWN0aW9uKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyYWNlJCRkZWZhdWx0ID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmFjZSQkcmFjZTtcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZXNvbHZlJCRyZXNvbHZlKG9iamVjdCkge1xuICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICAgIHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7XG5cbiAgICAgIGlmIChvYmplY3QgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0LmNvbnN0cnVjdG9yID09PSBDb25zdHJ1Y3Rvcikge1xuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBDb25zdHJ1Y3RvcihsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRub29wKTtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlc29sdmUocHJvbWlzZSwgb2JqZWN0KTtcbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVzb2x2ZSQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlc29sdmUkJHJlc29sdmU7XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVqZWN0JCRyZWplY3QocmVhc29uKSB7XG4gICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gdGhpcztcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IENvbnN0cnVjdG9yKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3ApO1xuICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlamVjdCQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlamVjdCQkcmVqZWN0O1xuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRjb3VudGVyID0gMDtcblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRuZWVkc1Jlc29sdmVyKCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhIHJlc29sdmVyIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgcHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRuZWVkc05ldygpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGYWlsZWQgdG8gY29uc3RydWN0ICdQcm9taXNlJzogUGxlYXNlIHVzZSB0aGUgJ25ldycgb3BlcmF0b3IsIHRoaXMgb2JqZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi5cIik7XG4gICAgfVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRkZWZhdWx0ID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2U7XG4gICAgLyoqXG4gICAgICBQcm9taXNlIG9iamVjdHMgcmVwcmVzZW50IHRoZSBldmVudHVhbCByZXN1bHQgb2YgYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbi4gVGhlXG4gICAgICBwcmltYXJ5IHdheSBvZiBpbnRlcmFjdGluZyB3aXRoIGEgcHJvbWlzZSBpcyB0aHJvdWdoIGl0cyBgdGhlbmAgbWV0aG9kLCB3aGljaFxuICAgICAgcmVnaXN0ZXJzIGNhbGxiYWNrcyB0byByZWNlaXZlIGVpdGhlciBhIHByb21pc2UncyBldmVudHVhbCB2YWx1ZSBvciB0aGUgcmVhc29uXG4gICAgICB3aHkgdGhlIHByb21pc2UgY2Fubm90IGJlIGZ1bGZpbGxlZC5cblxuICAgICAgVGVybWlub2xvZ3lcbiAgICAgIC0tLS0tLS0tLS0tXG5cbiAgICAgIC0gYHByb21pc2VgIGlzIGFuIG9iamVjdCBvciBmdW5jdGlvbiB3aXRoIGEgYHRoZW5gIG1ldGhvZCB3aG9zZSBiZWhhdmlvciBjb25mb3JtcyB0byB0aGlzIHNwZWNpZmljYXRpb24uXG4gICAgICAtIGB0aGVuYWJsZWAgaXMgYW4gb2JqZWN0IG9yIGZ1bmN0aW9uIHRoYXQgZGVmaW5lcyBhIGB0aGVuYCBtZXRob2QuXG4gICAgICAtIGB2YWx1ZWAgaXMgYW55IGxlZ2FsIEphdmFTY3JpcHQgdmFsdWUgKGluY2x1ZGluZyB1bmRlZmluZWQsIGEgdGhlbmFibGUsIG9yIGEgcHJvbWlzZSkuXG4gICAgICAtIGBleGNlcHRpb25gIGlzIGEgdmFsdWUgdGhhdCBpcyB0aHJvd24gdXNpbmcgdGhlIHRocm93IHN0YXRlbWVudC5cbiAgICAgIC0gYHJlYXNvbmAgaXMgYSB2YWx1ZSB0aGF0IGluZGljYXRlcyB3aHkgYSBwcm9taXNlIHdhcyByZWplY3RlZC5cbiAgICAgIC0gYHNldHRsZWRgIHRoZSBmaW5hbCByZXN0aW5nIHN0YXRlIG9mIGEgcHJvbWlzZSwgZnVsZmlsbGVkIG9yIHJlamVjdGVkLlxuXG4gICAgICBBIHByb21pc2UgY2FuIGJlIGluIG9uZSBvZiB0aHJlZSBzdGF0ZXM6IHBlbmRpbmcsIGZ1bGZpbGxlZCwgb3IgcmVqZWN0ZWQuXG5cbiAgICAgIFByb21pc2VzIHRoYXQgYXJlIGZ1bGZpbGxlZCBoYXZlIGEgZnVsZmlsbG1lbnQgdmFsdWUgYW5kIGFyZSBpbiB0aGUgZnVsZmlsbGVkXG4gICAgICBzdGF0ZS4gIFByb21pc2VzIHRoYXQgYXJlIHJlamVjdGVkIGhhdmUgYSByZWplY3Rpb24gcmVhc29uIGFuZCBhcmUgaW4gdGhlXG4gICAgICByZWplY3RlZCBzdGF0ZS4gIEEgZnVsZmlsbG1lbnQgdmFsdWUgaXMgbmV2ZXIgYSB0aGVuYWJsZS5cblxuICAgICAgUHJvbWlzZXMgY2FuIGFsc28gYmUgc2FpZCB0byAqcmVzb2x2ZSogYSB2YWx1ZS4gIElmIHRoaXMgdmFsdWUgaXMgYWxzbyBhXG4gICAgICBwcm9taXNlLCB0aGVuIHRoZSBvcmlnaW5hbCBwcm9taXNlJ3Mgc2V0dGxlZCBzdGF0ZSB3aWxsIG1hdGNoIHRoZSB2YWx1ZSdzXG4gICAgICBzZXR0bGVkIHN0YXRlLiAgU28gYSBwcm9taXNlIHRoYXQgKnJlc29sdmVzKiBhIHByb21pc2UgdGhhdCByZWplY3RzIHdpbGxcbiAgICAgIGl0c2VsZiByZWplY3QsIGFuZCBhIHByb21pc2UgdGhhdCAqcmVzb2x2ZXMqIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIHdpbGxcbiAgICAgIGl0c2VsZiBmdWxmaWxsLlxuXG5cbiAgICAgIEJhc2ljIFVzYWdlOlxuICAgICAgLS0tLS0tLS0tLS0tXG5cbiAgICAgIGBgYGpzXG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAvLyBvbiBzdWNjZXNzXG4gICAgICAgIHJlc29sdmUodmFsdWUpO1xuXG4gICAgICAgIC8vIG9uIGZhaWx1cmVcbiAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICB9KTtcblxuICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIC8vIG9uIGZ1bGZpbGxtZW50XG4gICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgLy8gb24gcmVqZWN0aW9uXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBBZHZhbmNlZCBVc2FnZTpcbiAgICAgIC0tLS0tLS0tLS0tLS0tLVxuXG4gICAgICBQcm9taXNlcyBzaGluZSB3aGVuIGFic3RyYWN0aW5nIGF3YXkgYXN5bmNocm9ub3VzIGludGVyYWN0aW9ucyBzdWNoIGFzXG4gICAgICBgWE1MSHR0cFJlcXVlc3Rgcy5cblxuICAgICAgYGBganNcbiAgICAgIGZ1bmN0aW9uIGdldEpTT04odXJsKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qpe1xuICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgICAgICAgIHhoci5vcGVuKCdHRVQnLCB1cmwpO1xuICAgICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBoYW5kbGVyO1xuICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnanNvbic7XG4gICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICAgICAgeGhyLnNlbmQoKTtcblxuICAgICAgICAgIGZ1bmN0aW9uIGhhbmRsZXIoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSB0aGlzLkRPTkUpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMucmVzcG9uc2UpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ2dldEpTT046IGAnICsgdXJsICsgJ2AgZmFpbGVkIHdpdGggc3RhdHVzOiBbJyArIHRoaXMuc3RhdHVzICsgJ10nKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZ2V0SlNPTignL3Bvc3RzLmpzb24nKS50aGVuKGZ1bmN0aW9uKGpzb24pIHtcbiAgICAgICAgLy8gb24gZnVsZmlsbG1lbnRcbiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAvLyBvbiByZWplY3Rpb25cbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIFVubGlrZSBjYWxsYmFja3MsIHByb21pc2VzIGFyZSBncmVhdCBjb21wb3NhYmxlIHByaW1pdGl2ZXMuXG5cbiAgICAgIGBgYGpzXG4gICAgICBQcm9taXNlLmFsbChbXG4gICAgICAgIGdldEpTT04oJy9wb3N0cycpLFxuICAgICAgICBnZXRKU09OKCcvY29tbWVudHMnKVxuICAgICAgXSkudGhlbihmdW5jdGlvbih2YWx1ZXMpe1xuICAgICAgICB2YWx1ZXNbMF0gLy8gPT4gcG9zdHNKU09OXG4gICAgICAgIHZhbHVlc1sxXSAvLyA9PiBjb21tZW50c0pTT05cblxuICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQGNsYXNzIFByb21pc2VcbiAgICAgIEBwYXJhbSB7ZnVuY3Rpb259IHJlc29sdmVyXG4gICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuXG4gICAgICBAY29uc3RydWN0b3JcbiAgICAqL1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlKHJlc29sdmVyKSB7XG4gICAgICB0aGlzLl9pZCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRjb3VudGVyKys7XG4gICAgICB0aGlzLl9zdGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3Jlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3N1YnNjcmliZXJzID0gW107XG5cbiAgICAgIGlmIChsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRub29wICE9PSByZXNvbHZlcikge1xuICAgICAgICBpZiAoIWxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNGdW5jdGlvbihyZXNvbHZlcikpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkbmVlZHNSZXNvbHZlcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlKSkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRuZWVkc05ldygpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaW5pdGlhbGl6ZVByb21pc2UodGhpcywgcmVzb2x2ZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLmFsbCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJGFsbCQkZGVmYXVsdDtcbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5yYWNlID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmFjZSQkZGVmYXVsdDtcbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5yZXNvbHZlID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVzb2x2ZSQkZGVmYXVsdDtcbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5yZWplY3QgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZWplY3QkJGRlZmF1bHQ7XG4gICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UuX3NldFNjaGVkdWxlciA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzZXRTY2hlZHVsZXI7XG4gICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UuX3NldEFzYXAgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2V0QXNhcDtcbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5fYXNhcCA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhc2FwO1xuXG4gICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UucHJvdG90eXBlID0ge1xuICAgICAgY29uc3RydWN0b3I6IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLFxuXG4gICAgLyoqXG4gICAgICBUaGUgcHJpbWFyeSB3YXkgb2YgaW50ZXJhY3Rpbmcgd2l0aCBhIHByb21pc2UgaXMgdGhyb3VnaCBpdHMgYHRoZW5gIG1ldGhvZCxcbiAgICAgIHdoaWNoIHJlZ2lzdGVycyBjYWxsYmFja3MgdG8gcmVjZWl2ZSBlaXRoZXIgYSBwcm9taXNlJ3MgZXZlbnR1YWwgdmFsdWUgb3IgdGhlXG4gICAgICByZWFzb24gd2h5IHRoZSBwcm9taXNlIGNhbm5vdCBiZSBmdWxmaWxsZWQuXG5cbiAgICAgIGBgYGpzXG4gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24odXNlcil7XG4gICAgICAgIC8vIHVzZXIgaXMgYXZhaWxhYmxlXG4gICAgICB9LCBmdW5jdGlvbihyZWFzb24pe1xuICAgICAgICAvLyB1c2VyIGlzIHVuYXZhaWxhYmxlLCBhbmQgeW91IGFyZSBnaXZlbiB0aGUgcmVhc29uIHdoeVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQ2hhaW5pbmdcbiAgICAgIC0tLS0tLS0tXG5cbiAgICAgIFRoZSByZXR1cm4gdmFsdWUgb2YgYHRoZW5gIGlzIGl0c2VsZiBhIHByb21pc2UuICBUaGlzIHNlY29uZCwgJ2Rvd25zdHJlYW0nXG4gICAgICBwcm9taXNlIGlzIHJlc29sdmVkIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZmlyc3QgcHJvbWlzZSdzIGZ1bGZpbGxtZW50XG4gICAgICBvciByZWplY3Rpb24gaGFuZGxlciwgb3IgcmVqZWN0ZWQgaWYgdGhlIGhhbmRsZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cblxuICAgICAgYGBganNcbiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgICByZXR1cm4gdXNlci5uYW1lO1xuICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICByZXR1cm4gJ2RlZmF1bHQgbmFtZSc7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICh1c2VyTmFtZSkge1xuICAgICAgICAvLyBJZiBgZmluZFVzZXJgIGZ1bGZpbGxlZCwgYHVzZXJOYW1lYCB3aWxsIGJlIHRoZSB1c2VyJ3MgbmFtZSwgb3RoZXJ3aXNlIGl0XG4gICAgICAgIC8vIHdpbGwgYmUgYCdkZWZhdWx0IG5hbWUnYFxuICAgICAgfSk7XG5cbiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIHVzZXIsIGJ1dCBzdGlsbCB1bmhhcHB5Jyk7XG4gICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYGZpbmRVc2VyYCByZWplY3RlZCBhbmQgd2UncmUgdW5oYXBweScpO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgLy8gbmV2ZXIgcmVhY2hlZFxuICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAvLyBpZiBgZmluZFVzZXJgIGZ1bGZpbGxlZCwgYHJlYXNvbmAgd2lsbCBiZSAnRm91bmQgdXNlciwgYnV0IHN0aWxsIHVuaGFwcHknLlxuICAgICAgICAvLyBJZiBgZmluZFVzZXJgIHJlamVjdGVkLCBgcmVhc29uYCB3aWxsIGJlICdgZmluZFVzZXJgIHJlamVjdGVkIGFuZCB3ZSdyZSB1bmhhcHB5Jy5cbiAgICAgIH0pO1xuICAgICAgYGBgXG4gICAgICBJZiB0aGUgZG93bnN0cmVhbSBwcm9taXNlIGRvZXMgbm90IHNwZWNpZnkgYSByZWplY3Rpb24gaGFuZGxlciwgcmVqZWN0aW9uIHJlYXNvbnMgd2lsbCBiZSBwcm9wYWdhdGVkIGZ1cnRoZXIgZG93bnN0cmVhbS5cblxuICAgICAgYGBganNcbiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgICB0aHJvdyBuZXcgUGVkYWdvZ2ljYWxFeGNlcHRpb24oJ1Vwc3RyZWFtIGVycm9yJyk7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAvLyBuZXZlciByZWFjaGVkXG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAvLyBuZXZlciByZWFjaGVkXG4gICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIC8vIFRoZSBgUGVkZ2Fnb2NpYWxFeGNlcHRpb25gIGlzIHByb3BhZ2F0ZWQgYWxsIHRoZSB3YXkgZG93biB0byBoZXJlXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBBc3NpbWlsYXRpb25cbiAgICAgIC0tLS0tLS0tLS0tLVxuXG4gICAgICBTb21ldGltZXMgdGhlIHZhbHVlIHlvdSB3YW50IHRvIHByb3BhZ2F0ZSB0byBhIGRvd25zdHJlYW0gcHJvbWlzZSBjYW4gb25seSBiZVxuICAgICAgcmV0cmlldmVkIGFzeW5jaHJvbm91c2x5LiBUaGlzIGNhbiBiZSBhY2hpZXZlZCBieSByZXR1cm5pbmcgYSBwcm9taXNlIGluIHRoZVxuICAgICAgZnVsZmlsbG1lbnQgb3IgcmVqZWN0aW9uIGhhbmRsZXIuIFRoZSBkb3duc3RyZWFtIHByb21pc2Ugd2lsbCB0aGVuIGJlIHBlbmRpbmdcbiAgICAgIHVudGlsIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzIHNldHRsZWQuIFRoaXMgaXMgY2FsbGVkICphc3NpbWlsYXRpb24qLlxuXG4gICAgICBgYGBqc1xuICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIHJldHVybiBmaW5kQ29tbWVudHNCeUF1dGhvcih1c2VyKTtcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGNvbW1lbnRzKSB7XG4gICAgICAgIC8vIFRoZSB1c2VyJ3MgY29tbWVudHMgYXJlIG5vdyBhdmFpbGFibGVcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIElmIHRoZSBhc3NpbWxpYXRlZCBwcm9taXNlIHJlamVjdHMsIHRoZW4gdGhlIGRvd25zdHJlYW0gcHJvbWlzZSB3aWxsIGFsc28gcmVqZWN0LlxuXG4gICAgICBgYGBqc1xuICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIHJldHVybiBmaW5kQ29tbWVudHNCeUF1dGhvcih1c2VyKTtcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGNvbW1lbnRzKSB7XG4gICAgICAgIC8vIElmIGBmaW5kQ29tbWVudHNCeUF1dGhvcmAgZnVsZmlsbHMsIHdlJ2xsIGhhdmUgdGhlIHZhbHVlIGhlcmVcbiAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgLy8gSWYgYGZpbmRDb21tZW50c0J5QXV0aG9yYCByZWplY3RzLCB3ZSdsbCBoYXZlIHRoZSByZWFzb24gaGVyZVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgU2ltcGxlIEV4YW1wbGVcbiAgICAgIC0tLS0tLS0tLS0tLS0tXG5cbiAgICAgIFN5bmNocm9ub3VzIEV4YW1wbGVcblxuICAgICAgYGBgamF2YXNjcmlwdFxuICAgICAgdmFyIHJlc3VsdDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gZmluZFJlc3VsdCgpO1xuICAgICAgICAvLyBzdWNjZXNzXG4gICAgICB9IGNhdGNoKHJlYXNvbikge1xuICAgICAgICAvLyBmYWlsdXJlXG4gICAgICB9XG4gICAgICBgYGBcblxuICAgICAgRXJyYmFjayBFeGFtcGxlXG5cbiAgICAgIGBgYGpzXG4gICAgICBmaW5kUmVzdWx0KGZ1bmN0aW9uKHJlc3VsdCwgZXJyKXtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIC8vIGZhaWx1cmVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBzdWNjZXNzXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIFByb21pc2UgRXhhbXBsZTtcblxuICAgICAgYGBgamF2YXNjcmlwdFxuICAgICAgZmluZFJlc3VsdCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KXtcbiAgICAgICAgLy8gc3VjY2Vzc1xuICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgICAgLy8gZmFpbHVyZVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQWR2YW5jZWQgRXhhbXBsZVxuICAgICAgLS0tLS0tLS0tLS0tLS1cblxuICAgICAgU3luY2hyb25vdXMgRXhhbXBsZVxuXG4gICAgICBgYGBqYXZhc2NyaXB0XG4gICAgICB2YXIgYXV0aG9yLCBib29rcztcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXV0aG9yID0gZmluZEF1dGhvcigpO1xuICAgICAgICBib29rcyAgPSBmaW5kQm9va3NCeUF1dGhvcihhdXRob3IpO1xuICAgICAgICAvLyBzdWNjZXNzXG4gICAgICB9IGNhdGNoKHJlYXNvbikge1xuICAgICAgICAvLyBmYWlsdXJlXG4gICAgICB9XG4gICAgICBgYGBcblxuICAgICAgRXJyYmFjayBFeGFtcGxlXG5cbiAgICAgIGBgYGpzXG5cbiAgICAgIGZ1bmN0aW9uIGZvdW5kQm9va3MoYm9va3MpIHtcblxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBmYWlsdXJlKHJlYXNvbikge1xuXG4gICAgICB9XG5cbiAgICAgIGZpbmRBdXRob3IoZnVuY3Rpb24oYXV0aG9yLCBlcnIpe1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgZmFpbHVyZShlcnIpO1xuICAgICAgICAgIC8vIGZhaWx1cmVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZmluZEJvb29rc0J5QXV0aG9yKGF1dGhvciwgZnVuY3Rpb24oYm9va3MsIGVycikge1xuICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZmFpbHVyZShlcnIpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBmb3VuZEJvb2tzKGJvb2tzKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoKHJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgZmFpbHVyZShyZWFzb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICAgICAgZmFpbHVyZShlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBzdWNjZXNzXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIFByb21pc2UgRXhhbXBsZTtcblxuICAgICAgYGBgamF2YXNjcmlwdFxuICAgICAgZmluZEF1dGhvcigpLlxuICAgICAgICB0aGVuKGZpbmRCb29rc0J5QXV0aG9yKS5cbiAgICAgICAgdGhlbihmdW5jdGlvbihib29rcyl7XG4gICAgICAgICAgLy8gZm91bmQgYm9va3NcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBAbWV0aG9kIHRoZW5cbiAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uRnVsZmlsbGVkXG4gICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBvblJlamVjdGVkXG4gICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuXG4gICAgICBAcmV0dXJuIHtQcm9taXNlfVxuICAgICovXG4gICAgICB0aGVuOiBmdW5jdGlvbihvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbikge1xuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcztcbiAgICAgICAgdmFyIHN0YXRlID0gcGFyZW50Ll9zdGF0ZTtcblxuICAgICAgICBpZiAoc3RhdGUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEZVTEZJTExFRCAmJiAhb25GdWxmaWxsbWVudCB8fCBzdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUkVKRUNURUQgJiYgIW9uUmVqZWN0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2hpbGQgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcihsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRub29wKTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHBhcmVudC5fcmVzdWx0O1xuXG4gICAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50c1tzdGF0ZSAtIDFdO1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhc2FwKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRpbnZva2VDYWxsYmFjayhzdGF0ZSwgY2hpbGQsIGNhbGxiYWNrLCByZXN1bHQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHN1YnNjcmliZShwYXJlbnQsIGNoaWxkLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9LFxuXG4gICAgLyoqXG4gICAgICBgY2F0Y2hgIGlzIHNpbXBseSBzdWdhciBmb3IgYHRoZW4odW5kZWZpbmVkLCBvblJlamVjdGlvbilgIHdoaWNoIG1ha2VzIGl0IHRoZSBzYW1lXG4gICAgICBhcyB0aGUgY2F0Y2ggYmxvY2sgb2YgYSB0cnkvY2F0Y2ggc3RhdGVtZW50LlxuXG4gICAgICBgYGBqc1xuICAgICAgZnVuY3Rpb24gZmluZEF1dGhvcigpe1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkbid0IGZpbmQgdGhhdCBhdXRob3InKTtcbiAgICAgIH1cblxuICAgICAgLy8gc3luY2hyb25vdXNcbiAgICAgIHRyeSB7XG4gICAgICAgIGZpbmRBdXRob3IoKTtcbiAgICAgIH0gY2F0Y2gocmVhc29uKSB7XG4gICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgICB9XG5cbiAgICAgIC8vIGFzeW5jIHdpdGggcHJvbWlzZXNcbiAgICAgIGZpbmRBdXRob3IoKS5jYXRjaChmdW5jdGlvbihyZWFzb24pe1xuICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQG1ldGhvZCBjYXRjaFxuICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gb25SZWplY3Rpb25cbiAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy5cbiAgICAgIEByZXR1cm4ge1Byb21pc2V9XG4gICAgKi9cbiAgICAgICdjYXRjaCc6IGZ1bmN0aW9uKG9uUmVqZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZW4obnVsbCwgb25SZWplY3Rpb24pO1xuICAgICAgfVxuICAgIH07XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHBvbHlmaWxsJCRwb2x5ZmlsbCgpIHtcbiAgICAgIHZhciBsb2NhbDtcblxuICAgICAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgbG9jYWwgPSBnbG9iYWw7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGxvY2FsID0gc2VsZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgbG9jYWwgPSBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwb2x5ZmlsbCBmYWlsZWQgYmVjYXVzZSBnbG9iYWwgb2JqZWN0IGlzIHVuYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQnKTtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBQID0gbG9jYWwuUHJvbWlzZTtcblxuICAgICAgaWYgKFAgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFAucmVzb2x2ZSgpKSA9PT0gJ1tvYmplY3QgUHJvbWlzZV0nICYmICFQLmNhc3QpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsb2NhbC5Qcm9taXNlID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkJGRlZmF1bHQ7XG4gICAgfVxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkcG9seWZpbGwkJGRlZmF1bHQgPSBsaWIkZXM2JHByb21pc2UkcG9seWZpbGwkJHBvbHlmaWxsO1xuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSR1bWQkJEVTNlByb21pc2UgPSB7XG4gICAgICAnUHJvbWlzZSc6IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRkZWZhdWx0LFxuICAgICAgJ3BvbHlmaWxsJzogbGliJGVzNiRwcm9taXNlJHBvbHlmaWxsJCRkZWZhdWx0XG4gICAgfTtcblxuICAgIC8qIGdsb2JhbCBkZWZpbmU6dHJ1ZSBtb2R1bGU6dHJ1ZSB3aW5kb3c6IHRydWUgKi9cbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmVbJ2FtZCddKSB7XG4gICAgICBkZWZpbmUoZnVuY3Rpb24oKSB7IHJldHVybiBsaWIkZXM2JHByb21pc2UkdW1kJCRFUzZQcm9taXNlOyB9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZVsnZXhwb3J0cyddKSB7XG4gICAgICBtb2R1bGVbJ2V4cG9ydHMnXSA9IGxpYiRlczYkcHJvbWlzZSR1bWQkJEVTNlByb21pc2U7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXNbJ0VTNlByb21pc2UnXSA9IGxpYiRlczYkcHJvbWlzZSR1bWQkJEVTNlByb21pc2U7XG4gICAgfVxuXG4gICAgbGliJGVzNiRwcm9taXNlJHBvbHlmaWxsJCRkZWZhdWx0KCk7XG59KS5jYWxsKHRoaXMpO1xuXG4iXX0=\n},{\"_process\":23}],25:[function(require,module,exports){\nvar isFunction = require('is-function')\n\nmodule.exports = forEach\n\nvar toString = Object.prototype.toString\nvar hasOwnProperty = Object.prototype.hasOwnProperty\n\nfunction forEach(list, iterator, context) {\n if (!isFunction(iterator)) {\n throw new TypeError('iterator must be a function')\n }\n\n if (arguments.length < 3) {\n context = this\n }\n \n if (toString.call(list) === '[object Array]')\n forEachArray(list, iterator, context)\n else if (typeof list === 'string')\n forEachString(list, iterator, context)\n else\n forEachObject(list, iterator, context)\n}\n\nfunction forEachArray(array, iterator, context) {\n for (var i = 0, len = array.length; i < len; i++) {\n if (hasOwnProperty.call(array, i)) {\n iterator.call(context, array[i], i, array)\n }\n }\n}\n\nfunction forEachString(string, iterator, context) {\n for (var i = 0, len = string.length; i < len; i++) {\n // no such thing as a sparse string.\n iterator.call(context, string.charAt(i), i, string)\n }\n}\n\nfunction forEachObject(object, iterator, context) {\n for (var k in object) {\n if (hasOwnProperty.call(object, k)) {\n iterator.call(context, object[k], k, object)\n }\n }\n}\n\n},{\"is-function\":28}],26:[function(require,module,exports){\n(function (global){\nvar win;\n\nif (typeof window !== \"undefined\") {\n win = window;\n} else if (typeof global !== \"undefined\") {\n win = global;\n} else if (typeof self !== \"undefined\"){\n win = self;\n} else {\n win = {};\n}\n\nmodule.exports = win;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9nbG9iYWwvd2luZG93LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgd2luO1xuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHdpbiA9IHdpbmRvdztcbn0gZWxzZSBpZiAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHdpbiA9IGdsb2JhbDtcbn0gZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIpe1xuICAgIHdpbiA9IHNlbGY7XG59IGVsc2Uge1xuICAgIHdpbiA9IHt9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHdpbjtcbiJdfQ==\n},{}],27:[function(require,module,exports){\n/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function(window, document, exportName, undefined) {\n 'use strict';\n\nvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\nvar TEST_ELEMENT = document.createElement('div');\n\nvar TYPE_FUNCTION = 'function';\n\nvar round = Math.round;\nvar abs = Math.abs;\nvar now = Date.now;\n\n/**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\nfunction setTimeoutContext(fn, timeout, context) {\n return setTimeout(bindFn(fn, context), timeout);\n}\n\n/**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\nfunction invokeArrayArg(arg, fn, context) {\n if (Array.isArray(arg)) {\n each(arg, context[fn], context);\n return true;\n }\n return false;\n}\n\n/**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\nfunction each(obj, iterator, context) {\n var i;\n\n if (!obj) {\n return;\n }\n\n if (obj.forEach) {\n obj.forEach(iterator, context);\n } else if (obj.length !== undefined) {\n i = 0;\n while (i < obj.length) {\n iterator.call(context, obj[i], i, obj);\n i++;\n }\n } else {\n for (i in obj) {\n obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n }\n }\n}\n\n/**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\nfunction deprecate(method, name, message) {\n var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n return function() {\n var e = new Error('get-stack-trace');\n var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n .replace(/^\\s+at\\s+/gm, '')\n .replace(/^Object.\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\n var log = window.console && (window.console.warn || window.console.log);\n if (log) {\n log.call(window.console, deprecationMessage, stack);\n }\n return method.apply(this, arguments);\n };\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\nvar assign;\nif (typeof Object.assign !== 'function') {\n assign = function assign(target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n var output = Object(target);\n for (var index = 1; index < arguments.length; index++) {\n var source = arguments[index];\n if (source !== undefined && source !== null) {\n for (var nextKey in source) {\n if (source.hasOwnProperty(nextKey)) {\n output[nextKey] = source[nextKey];\n }\n }\n }\n }\n return output;\n };\n} else {\n assign = Object.assign;\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\nvar extend = deprecate(function extend(dest, src, merge) {\n var keys = Object.keys(src);\n var i = 0;\n while (i < keys.length) {\n if (!merge || (merge && dest[keys[i]] === undefined)) {\n dest[keys[i]] = src[keys[i]];\n }\n i++;\n }\n return dest;\n}, 'extend', 'Use `assign`.');\n\n/**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\nvar merge = deprecate(function merge(dest, src) {\n return extend(dest, src, true);\n}, 'merge', 'Use `assign`.');\n\n/**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\nfunction inherit(child, base, properties) {\n var baseP = base.prototype,\n childP;\n\n childP = child.prototype = Object.create(baseP);\n childP.constructor = child;\n childP._super = baseP;\n\n if (properties) {\n assign(childP, properties);\n }\n}\n\n/**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\nfunction bindFn(fn, context) {\n return function boundFn() {\n return fn.apply(context, arguments);\n };\n}\n\n/**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\nfunction boolOrFn(val, args) {\n if (typeof val == TYPE_FUNCTION) {\n return val.apply(args ? args[0] || undefined : undefined, args);\n }\n return val;\n}\n\n/**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\nfunction ifUndefined(val1, val2) {\n return (val1 === undefined) ? val2 : val1;\n}\n\n/**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction addEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.addEventListener(type, handler, false);\n });\n}\n\n/**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction removeEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.removeEventListener(type, handler, false);\n });\n}\n\n/**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\nfunction hasParent(node, parent) {\n while (node) {\n if (node == parent) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n}\n\n/**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\nfunction inStr(str, find) {\n return str.indexOf(find) > -1;\n}\n\n/**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\nfunction splitStr(str) {\n return str.trim().split(/\\s+/g);\n}\n\n/**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\nfunction inArray(src, find, findByKey) {\n if (src.indexOf && !findByKey) {\n return src.indexOf(find);\n } else {\n var i = 0;\n while (i < src.length) {\n if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n return i;\n }\n i++;\n }\n return -1;\n }\n}\n\n/**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\nfunction toArray(obj) {\n return Array.prototype.slice.call(obj, 0);\n}\n\n/**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\nfunction uniqueArray(src, key, sort) {\n var results = [];\n var values = [];\n var i = 0;\n\n while (i < src.length) {\n var val = key ? src[i][key] : src[i];\n if (inArray(values, val) < 0) {\n results.push(src[i]);\n }\n values[i] = val;\n i++;\n }\n\n if (sort) {\n if (!key) {\n results = results.sort();\n } else {\n results = results.sort(function sortUniqueArray(a, b) {\n return a[key] > b[key];\n });\n }\n }\n\n return results;\n}\n\n/**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\nfunction prefixed(obj, property) {\n var prefix, prop;\n var camelProp = property[0].toUpperCase() + property.slice(1);\n\n var i = 0;\n while (i < VENDOR_PREFIXES.length) {\n prefix = VENDOR_PREFIXES[i];\n prop = (prefix) ? prefix + camelProp : property;\n\n if (prop in obj) {\n return prop;\n }\n i++;\n }\n return undefined;\n}\n\n/**\n * get a unique id\n * @returns {number} uniqueId\n */\nvar _uniqueId = 1;\nfunction uniqueId() {\n return _uniqueId++;\n}\n\n/**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\nfunction getWindowForElement(element) {\n var doc = element.ownerDocument || element;\n return (doc.defaultView || doc.parentWindow || window);\n}\n\nvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\nvar SUPPORT_TOUCH = ('ontouchstart' in window);\nvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\nvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\nvar INPUT_TYPE_TOUCH = 'touch';\nvar INPUT_TYPE_PEN = 'pen';\nvar INPUT_TYPE_MOUSE = 'mouse';\nvar INPUT_TYPE_KINECT = 'kinect';\n\nvar COMPUTE_INTERVAL = 25;\n\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar INPUT_CANCEL = 8;\n\nvar DIRECTION_NONE = 1;\nvar DIRECTION_LEFT = 2;\nvar DIRECTION_RIGHT = 4;\nvar DIRECTION_UP = 8;\nvar DIRECTION_DOWN = 16;\n\nvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\nvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\nvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\nvar PROPS_XY = ['x', 'y'];\nvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n/**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\nfunction Input(manager, callback) {\n var self = this;\n this.manager = manager;\n this.callback = callback;\n this.element = manager.element;\n this.target = manager.options.inputTarget;\n\n // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n // so when disabled the input events are completely bypassed.\n this.domHandler = function(ev) {\n if (boolOrFn(manager.options.enable, [manager])) {\n self.handler(ev);\n }\n };\n\n this.init();\n\n}\n\nInput.prototype = {\n /**\n * should handle the inputEvent data and trigger the callback\n * @virtual\n */\n handler: function() { },\n\n /**\n * bind the events\n */\n init: function() {\n this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n },\n\n /**\n * unbind the events\n */\n destroy: function() {\n this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n }\n};\n\n/**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\nfunction createInputInstance(manager) {\n var Type;\n var inputClass = manager.options.inputClass;\n\n if (inputClass) {\n Type = inputClass;\n } else if (SUPPORT_POINTER_EVENTS) {\n Type = PointerEventInput;\n } else if (SUPPORT_ONLY_TOUCH) {\n Type = TouchInput;\n } else if (!SUPPORT_TOUCH) {\n Type = MouseInput;\n } else {\n Type = TouchMouseInput;\n }\n return new (Type)(manager, inputHandler);\n}\n\n/**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\nfunction inputHandler(manager, eventType, input) {\n var pointersLen = input.pointers.length;\n var changedPointersLen = input.changedPointers.length;\n var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n input.isFirst = !!isFirst;\n input.isFinal = !!isFinal;\n\n if (isFirst) {\n manager.session = {};\n }\n\n // source event is the normalized value of the domEvents\n // like 'touchstart, mouseup, pointerdown'\n input.eventType = eventType;\n\n // compute scale, rotation etc\n computeInputData(manager, input);\n\n // emit secret event\n manager.emit('hammer.input', input);\n\n manager.recognize(input);\n manager.session.prevInput = input;\n}\n\n/**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\nfunction computeInputData(manager, input) {\n var session = manager.session;\n var pointers = input.pointers;\n var pointersLength = pointers.length;\n\n // store the first input to calculate the distance and direction\n if (!session.firstInput) {\n session.firstInput = simpleCloneInputData(input);\n }\n\n // to compute scale and rotation we need to store the multiple touches\n if (pointersLength > 1 && !session.firstMultiple) {\n session.firstMultiple = simpleCloneInputData(input);\n } else if (pointersLength === 1) {\n session.firstMultiple = false;\n }\n\n var firstInput = session.firstInput;\n var firstMultiple = session.firstMultiple;\n var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n var center = input.center = getCenter(pointers);\n input.timeStamp = now();\n input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n input.angle = getAngle(offsetCenter, center);\n input.distance = getDistance(offsetCenter, center);\n\n computeDeltaXY(session, input);\n input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n input.overallVelocityX = overallVelocity.x;\n input.overallVelocityY = overallVelocity.y;\n input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\n input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\n computeIntervalInputData(session, input);\n\n // find the correct target\n var target = manager.element;\n if (hasParent(input.srcEvent.target, target)) {\n target = input.srcEvent.target;\n }\n input.target = target;\n}\n\nfunction computeDeltaXY(session, input) {\n var center = input.center;\n var offset = session.offsetDelta || {};\n var prevDelta = session.prevDelta || {};\n var prevInput = session.prevInput || {};\n\n if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n prevDelta = session.prevDelta = {\n x: prevInput.deltaX || 0,\n y: prevInput.deltaY || 0\n };\n\n offset = session.offsetDelta = {\n x: center.x,\n y: center.y\n };\n }\n\n input.deltaX = prevDelta.x + (center.x - offset.x);\n input.deltaY = prevDelta.y + (center.y - offset.y);\n}\n\n/**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\nfunction computeIntervalInputData(session, input) {\n var last = session.lastInterval || input,\n deltaTime = input.timeStamp - last.timeStamp,\n velocity, velocityX, velocityY, direction;\n\n if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n var deltaX = input.deltaX - last.deltaX;\n var deltaY = input.deltaY - last.deltaY;\n\n var v = getVelocity(deltaTime, deltaX, deltaY);\n velocityX = v.x;\n velocityY = v.y;\n velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n direction = getDirection(deltaX, deltaY);\n\n session.lastInterval = input;\n } else {\n // use latest velocity info if it doesn't overtake a minimum period\n velocity = last.velocity;\n velocityX = last.velocityX;\n velocityY = last.velocityY;\n direction = last.direction;\n }\n\n input.velocity = velocity;\n input.velocityX = velocityX;\n input.velocityY = velocityY;\n input.direction = direction;\n}\n\n/**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\nfunction simpleCloneInputData(input) {\n // make a simple copy of the pointers because we will get a reference if we don't\n // we only need clientXY for the calculations\n var pointers = [];\n var i = 0;\n while (i < input.pointers.length) {\n pointers[i] = {\n clientX: round(input.pointers[i].clientX),\n clientY: round(input.pointers[i].clientY)\n };\n i++;\n }\n\n return {\n timeStamp: now(),\n pointers: pointers,\n center: getCenter(pointers),\n deltaX: input.deltaX,\n deltaY: input.deltaY\n };\n}\n\n/**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\nfunction getCenter(pointers) {\n var pointersLength = pointers.length;\n\n // no need to loop when only one touch\n if (pointersLength === 1) {\n return {\n x: round(pointers[0].clientX),\n y: round(pointers[0].clientY)\n };\n }\n\n var x = 0, y = 0, i = 0;\n while (i < pointersLength) {\n x += pointers[i].clientX;\n y += pointers[i].clientY;\n i++;\n }\n\n return {\n x: round(x / pointersLength),\n y: round(y / pointersLength)\n };\n}\n\n/**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\nfunction getVelocity(deltaTime, x, y) {\n return {\n x: x / deltaTime || 0,\n y: y / deltaTime || 0\n };\n}\n\n/**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\nfunction getDirection(x, y) {\n if (x === y) {\n return DIRECTION_NONE;\n }\n\n if (abs(x) >= abs(y)) {\n return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n}\n\n/**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\nfunction getDistance(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n\n return Math.sqrt((x * x) + (y * y));\n}\n\n/**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\nfunction getAngle(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n return Math.atan2(y, x) * 180 / Math.PI;\n}\n\n/**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\nfunction getRotation(start, end) {\n return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n}\n\n/**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\nfunction getScale(start, end) {\n return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n}\n\nvar MOUSE_INPUT_MAP = {\n mousedown: INPUT_START,\n mousemove: INPUT_MOVE,\n mouseup: INPUT_END\n};\n\nvar MOUSE_ELEMENT_EVENTS = 'mousedown';\nvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n/**\n * Mouse events input\n * @constructor\n * @extends Input\n */\nfunction MouseInput() {\n this.evEl = MOUSE_ELEMENT_EVENTS;\n this.evWin = MOUSE_WINDOW_EVENTS;\n\n this.pressed = false; // mousedown state\n\n Input.apply(this, arguments);\n}\n\ninherit(MouseInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function MEhandler(ev) {\n var eventType = MOUSE_INPUT_MAP[ev.type];\n\n // on start we want to have the left mouse button down\n if (eventType & INPUT_START && ev.button === 0) {\n this.pressed = true;\n }\n\n if (eventType & INPUT_MOVE && ev.which !== 1) {\n eventType = INPUT_END;\n }\n\n // mouse must be down\n if (!this.pressed) {\n return;\n }\n\n if (eventType & INPUT_END) {\n this.pressed = false;\n }\n\n this.callback(this.manager, eventType, {\n pointers: [ev],\n changedPointers: [ev],\n pointerType: INPUT_TYPE_MOUSE,\n srcEvent: ev\n });\n }\n});\n\nvar POINTER_INPUT_MAP = {\n pointerdown: INPUT_START,\n pointermove: INPUT_MOVE,\n pointerup: INPUT_END,\n pointercancel: INPUT_CANCEL,\n pointerout: INPUT_CANCEL\n};\n\n// in IE10 the pointer types is defined as an enum\nvar IE10_POINTER_TYPE_ENUM = {\n 2: INPUT_TYPE_TOUCH,\n 3: INPUT_TYPE_PEN,\n 4: INPUT_TYPE_MOUSE,\n 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n};\n\nvar POINTER_ELEMENT_EVENTS = 'pointerdown';\nvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n// IE10 has prefixed support, and case-sensitive\nif (window.MSPointerEvent && !window.PointerEvent) {\n POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n}\n\n/**\n * Pointer events input\n * @constructor\n * @extends Input\n */\nfunction PointerEventInput() {\n this.evEl = POINTER_ELEMENT_EVENTS;\n this.evWin = POINTER_WINDOW_EVENTS;\n\n Input.apply(this, arguments);\n\n this.store = (this.manager.session.pointerEvents = []);\n}\n\ninherit(PointerEventInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function PEhandler(ev) {\n var store = this.store;\n var removePointer = false;\n\n var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n // get index of the event in the store\n var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n // start and mouse must be down\n if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n if (storeIndex < 0) {\n store.push(ev);\n storeIndex = store.length - 1;\n }\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n removePointer = true;\n }\n\n // it not found, so the pointer hasn't been down (so it's probably a hover)\n if (storeIndex < 0) {\n return;\n }\n\n // update the event in the store\n store[storeIndex] = ev;\n\n this.callback(this.manager, eventType, {\n pointers: store,\n changedPointers: [ev],\n pointerType: pointerType,\n srcEvent: ev\n });\n\n if (removePointer) {\n // remove from the store\n store.splice(storeIndex, 1);\n }\n }\n});\n\nvar SINGLE_TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\nvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Touch events input\n * @constructor\n * @extends Input\n */\nfunction SingleTouchInput() {\n this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n this.started = false;\n\n Input.apply(this, arguments);\n}\n\ninherit(SingleTouchInput, Input, {\n handler: function TEhandler(ev) {\n var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n // should we handle the touch events?\n if (type === INPUT_START) {\n this.started = true;\n }\n\n if (!this.started) {\n return;\n }\n\n var touches = normalizeSingleTouches.call(this, ev, type);\n\n // when done, reset the started state\n if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n this.started = false;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction normalizeSingleTouches(ev, type) {\n var all = toArray(ev.touches);\n var changed = toArray(ev.changedTouches);\n\n if (type & (INPUT_END | INPUT_CANCEL)) {\n all = uniqueArray(all.concat(changed), 'identifier', true);\n }\n\n return [all, changed];\n}\n\nvar TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\nfunction TouchInput() {\n this.evTarget = TOUCH_TARGET_EVENTS;\n this.targetIds = {};\n\n Input.apply(this, arguments);\n}\n\ninherit(TouchInput, Input, {\n handler: function MTEhandler(ev) {\n var type = TOUCH_INPUT_MAP[ev.type];\n var touches = getTouches.call(this, ev, type);\n if (!touches) {\n return;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction getTouches(ev, type) {\n var allTouches = toArray(ev.touches);\n var targetIds = this.targetIds;\n\n // when there is only one touch, the process can be simplified\n if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n targetIds[allTouches[0].identifier] = true;\n return [allTouches, allTouches];\n }\n\n var i,\n targetTouches,\n changedTouches = toArray(ev.changedTouches),\n changedTargetTouches = [],\n target = this.target;\n\n // get target touches from touches\n targetTouches = allTouches.filter(function(touch) {\n return hasParent(touch.target, target);\n });\n\n // collect touches\n if (type === INPUT_START) {\n i = 0;\n while (i < targetTouches.length) {\n targetIds[targetTouches[i].identifier] = true;\n i++;\n }\n }\n\n // filter changed touches to only contain touches that exist in the collected target ids\n i = 0;\n while (i < changedTouches.length) {\n if (targetIds[changedTouches[i].identifier]) {\n changedTargetTouches.push(changedTouches[i]);\n }\n\n // cleanup removed touches\n if (type & (INPUT_END | INPUT_CANCEL)) {\n delete targetIds[changedTouches[i].identifier];\n }\n i++;\n }\n\n if (!changedTargetTouches.length) {\n return;\n }\n\n return [\n // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n changedTargetTouches\n ];\n}\n\n/**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\nvar DEDUP_TIMEOUT = 2500;\nvar DEDUP_DISTANCE = 25;\n\nfunction TouchMouseInput() {\n Input.apply(this, arguments);\n\n var handler = bindFn(this.handler, this);\n this.touch = new TouchInput(this.manager, handler);\n this.mouse = new MouseInput(this.manager, handler);\n\n this.primaryTouch = null;\n this.lastTouches = [];\n}\n\ninherit(TouchMouseInput, Input, {\n /**\n * handle mouse and touch events\n * @param {Hammer} manager\n * @param {String} inputEvent\n * @param {Object} inputData\n */\n handler: function TMEhandler(manager, inputEvent, inputData) {\n var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n return;\n }\n\n // when we're in a touch event, record touches to de-dupe synthetic mouse event\n if (isTouch) {\n recordTouches.call(this, inputEvent, inputData);\n } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n return;\n }\n\n this.callback(manager, inputEvent, inputData);\n },\n\n /**\n * remove the event listeners\n */\n destroy: function destroy() {\n this.touch.destroy();\n this.mouse.destroy();\n }\n});\n\nfunction recordTouches(eventType, eventData) {\n if (eventType & INPUT_START) {\n this.primaryTouch = eventData.changedPointers[0].identifier;\n setLastTouch.call(this, eventData);\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n setLastTouch.call(this, eventData);\n }\n}\n\nfunction setLastTouch(eventData) {\n var touch = eventData.changedPointers[0];\n\n if (touch.identifier === this.primaryTouch) {\n var lastTouch = {x: touch.clientX, y: touch.clientY};\n this.lastTouches.push(lastTouch);\n var lts = this.lastTouches;\n var removeLastTouch = function() {\n var i = lts.indexOf(lastTouch);\n if (i > -1) {\n lts.splice(i, 1);\n }\n };\n setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n }\n}\n\nfunction isSyntheticEvent(eventData) {\n var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n for (var i = 0; i < this.lastTouches.length; i++) {\n var t = this.lastTouches[i];\n var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n return true;\n }\n }\n return false;\n}\n\nvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\nvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n\n// magical touchAction value\nvar TOUCH_ACTION_COMPUTE = 'compute';\nvar TOUCH_ACTION_AUTO = 'auto';\nvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\nvar TOUCH_ACTION_NONE = 'none';\nvar TOUCH_ACTION_PAN_X = 'pan-x';\nvar TOUCH_ACTION_PAN_Y = 'pan-y';\nvar TOUCH_ACTION_MAP = getTouchActionProps();\n\n/**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\nfunction TouchAction(manager, value) {\n this.manager = manager;\n this.set(value);\n}\n\nTouchAction.prototype = {\n /**\n * set the touchAction value on the element or enable the polyfill\n * @param {String} value\n */\n set: function(value) {\n // find out the touch-action by the event handlers\n if (value == TOUCH_ACTION_COMPUTE) {\n value = this.compute();\n }\n\n if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n }\n this.actions = value.toLowerCase().trim();\n },\n\n /**\n * just re-set the touchAction value\n */\n update: function() {\n this.set(this.manager.options.touchAction);\n },\n\n /**\n * compute the value for the touchAction property based on the recognizer's settings\n * @returns {String} value\n */\n compute: function() {\n var actions = [];\n each(this.manager.recognizers, function(recognizer) {\n if (boolOrFn(recognizer.options.enable, [recognizer])) {\n actions = actions.concat(recognizer.getTouchAction());\n }\n });\n return cleanTouchActions(actions.join(' '));\n },\n\n /**\n * this method is called on each input cycle and provides the preventing of the browser behavior\n * @param {Object} input\n */\n preventDefaults: function(input) {\n var srcEvent = input.srcEvent;\n var direction = input.offsetDirection;\n\n // if the touch action did prevented once this session\n if (this.manager.session.prevented) {\n srcEvent.preventDefault();\n return;\n }\n\n var actions = this.actions;\n var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n if (hasNone) {\n //do not prevent defaults if this is a tap gesture\n\n var isTapPointer = input.pointers.length === 1;\n var isTapMovement = input.distance < 2;\n var isTapTouchTime = input.deltaTime < 250;\n\n if (isTapPointer && isTapMovement && isTapTouchTime) {\n return;\n }\n }\n\n if (hasPanX && hasPanY) {\n // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n return;\n }\n\n if (hasNone ||\n (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n (hasPanX && direction & DIRECTION_VERTICAL)) {\n return this.preventSrc(srcEvent);\n }\n },\n\n /**\n * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n * @param {Object} srcEvent\n */\n preventSrc: function(srcEvent) {\n this.manager.session.prevented = true;\n srcEvent.preventDefault();\n }\n};\n\n/**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\nfunction cleanTouchActions(actions) {\n // none\n if (inStr(actions, TOUCH_ACTION_NONE)) {\n return TOUCH_ACTION_NONE;\n }\n\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n // if both pan-x and pan-y are set (different recognizers\n // for different directions, e.g. horizontal pan but vertical swipe?)\n // we need none (as otherwise with pan-x pan-y combined none of these\n // recognizers will work, since the browser would handle all panning\n if (hasPanX && hasPanY) {\n return TOUCH_ACTION_NONE;\n }\n\n // pan-x OR pan-y\n if (hasPanX || hasPanY) {\n return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n }\n\n // manipulation\n if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n return TOUCH_ACTION_MANIPULATION;\n }\n\n return TOUCH_ACTION_AUTO;\n}\n\nfunction getTouchActionProps() {\n if (!NATIVE_TOUCH_ACTION) {\n return false;\n }\n var touchMap = {};\n var cssSupports = window.CSS && window.CSS.supports;\n ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {\n\n // If css.supports is not supported but there is native touch-action assume it supports\n // all values. This is the case for IE 10 and 11.\n touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n });\n return touchMap;\n}\n\n/**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n * Possible\n * |\n * +-----+---------------+\n * | |\n * +-----+-----+ |\n * | | |\n * Failed Cancelled |\n * +-------+------+\n * | |\n * Recognized Began\n * |\n * Changed\n * |\n * Ended/Recognized\n */\nvar STATE_POSSIBLE = 1;\nvar STATE_BEGAN = 2;\nvar STATE_CHANGED = 4;\nvar STATE_ENDED = 8;\nvar STATE_RECOGNIZED = STATE_ENDED;\nvar STATE_CANCELLED = 16;\nvar STATE_FAILED = 32;\n\n/**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\nfunction Recognizer(options) {\n this.options = assign({}, this.defaults, options || {});\n\n this.id = uniqueId();\n\n this.manager = null;\n\n // default is enable true\n this.options.enable = ifUndefined(this.options.enable, true);\n\n this.state = STATE_POSSIBLE;\n\n this.simultaneous = {};\n this.requireFail = [];\n}\n\nRecognizer.prototype = {\n /**\n * @virtual\n * @type {Object}\n */\n defaults: {},\n\n /**\n * set options\n * @param {Object} options\n * @return {Recognizer}\n */\n set: function(options) {\n assign(this.options, options);\n\n // also update the touchAction, in case something changed about the directions/enabled state\n this.manager && this.manager.touchAction.update();\n return this;\n },\n\n /**\n * recognize simultaneous with an other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n recognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n return this;\n }\n\n var simultaneous = this.simultaneous;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (!simultaneous[otherRecognizer.id]) {\n simultaneous[otherRecognizer.id] = otherRecognizer;\n otherRecognizer.recognizeWith(this);\n }\n return this;\n },\n\n /**\n * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRecognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n delete this.simultaneous[otherRecognizer.id];\n return this;\n },\n\n /**\n * recognizer can only run when an other is failing\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n requireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n return this;\n }\n\n var requireFail = this.requireFail;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (inArray(requireFail, otherRecognizer) === -1) {\n requireFail.push(otherRecognizer);\n otherRecognizer.requireFailure(this);\n }\n return this;\n },\n\n /**\n * drop the requireFailure link. it does not remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRequireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n var index = inArray(this.requireFail, otherRecognizer);\n if (index > -1) {\n this.requireFail.splice(index, 1);\n }\n return this;\n },\n\n /**\n * has require failures boolean\n * @returns {boolean}\n */\n hasRequireFailures: function() {\n return this.requireFail.length > 0;\n },\n\n /**\n * if the recognizer can recognize simultaneous with an other recognizer\n * @param {Recognizer} otherRecognizer\n * @returns {Boolean}\n */\n canRecognizeWith: function(otherRecognizer) {\n return !!this.simultaneous[otherRecognizer.id];\n },\n\n /**\n * You should use `tryEmit` instead of `emit` directly to check\n * that all the needed recognizers has failed before emitting.\n * @param {Object} input\n */\n emit: function(input) {\n var self = this;\n var state = this.state;\n\n function emit(event) {\n self.manager.emit(event, input);\n }\n\n // 'panstart' and 'panmove'\n if (state < STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n\n emit(self.options.event); // simple 'eventName' events\n\n if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n emit(input.additionalEvent);\n }\n\n // panend and pancancel\n if (state >= STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n },\n\n /**\n * Check that all the require failure recognizers has failed,\n * if true, it emits a gesture event,\n * otherwise, setup the state to FAILED.\n * @param {Object} input\n */\n tryEmit: function(input) {\n if (this.canEmit()) {\n return this.emit(input);\n }\n // it's failing anyway\n this.state = STATE_FAILED;\n },\n\n /**\n * can we emit?\n * @returns {boolean}\n */\n canEmit: function() {\n var i = 0;\n while (i < this.requireFail.length) {\n if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n return false;\n }\n i++;\n }\n return true;\n },\n\n /**\n * update the recognizer\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n // make a new copy of the inputData\n // so we can change the inputData without messing up the other recognizers\n var inputDataClone = assign({}, inputData);\n\n // is is enabled and allow recognizing?\n if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n this.reset();\n this.state = STATE_FAILED;\n return;\n }\n\n // reset when we've reached the end\n if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n this.state = STATE_POSSIBLE;\n }\n\n this.state = this.process(inputDataClone);\n\n // the recognizer has recognized a gesture\n // so trigger an event\n if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n this.tryEmit(inputDataClone);\n }\n },\n\n /**\n * return the state of the recognizer\n * the actual recognizing happens in this method\n * @virtual\n * @param {Object} inputData\n * @returns {Const} STATE\n */\n process: function(inputData) { }, // jshint ignore:line\n\n /**\n * return the preferred touch-action\n * @virtual\n * @returns {Array}\n */\n getTouchAction: function() { },\n\n /**\n * called when the gesture isn't allowed to recognize\n * like when another is being recognized or it is disabled\n * @virtual\n */\n reset: function() { }\n};\n\n/**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\nfunction stateStr(state) {\n if (state & STATE_CANCELLED) {\n return 'cancel';\n } else if (state & STATE_ENDED) {\n return 'end';\n } else if (state & STATE_CHANGED) {\n return 'move';\n } else if (state & STATE_BEGAN) {\n return 'start';\n }\n return '';\n}\n\n/**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\nfunction directionStr(direction) {\n if (direction == DIRECTION_DOWN) {\n return 'down';\n } else if (direction == DIRECTION_UP) {\n return 'up';\n } else if (direction == DIRECTION_LEFT) {\n return 'left';\n } else if (direction == DIRECTION_RIGHT) {\n return 'right';\n }\n return '';\n}\n\n/**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\nfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n var manager = recognizer.manager;\n if (manager) {\n return manager.get(otherRecognizer);\n }\n return otherRecognizer;\n}\n\n/**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\nfunction AttrRecognizer() {\n Recognizer.apply(this, arguments);\n}\n\ninherit(AttrRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof AttrRecognizer\n */\n defaults: {\n /**\n * @type {Number}\n * @default 1\n */\n pointers: 1\n },\n\n /**\n * Used to check if it the recognizer receives valid input, like input.distance > 10.\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {Boolean} recognized\n */\n attrTest: function(input) {\n var optionPointers = this.options.pointers;\n return optionPointers === 0 || input.pointers.length === optionPointers;\n },\n\n /**\n * Process the input and return the state for the recognizer\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {*} State\n */\n process: function(input) {\n var state = this.state;\n var eventType = input.eventType;\n\n var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n var isValid = this.attrTest(input);\n\n // on cancel input and we've recognized before, return STATE_CANCELLED\n if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n return state | STATE_CANCELLED;\n } else if (isRecognized || isValid) {\n if (eventType & INPUT_END) {\n return state | STATE_ENDED;\n } else if (!(state & STATE_BEGAN)) {\n return STATE_BEGAN;\n }\n return state | STATE_CHANGED;\n }\n return STATE_FAILED;\n }\n});\n\n/**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PanRecognizer() {\n AttrRecognizer.apply(this, arguments);\n\n this.pX = null;\n this.pY = null;\n}\n\ninherit(PanRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PanRecognizer\n */\n defaults: {\n event: 'pan',\n threshold: 10,\n pointers: 1,\n direction: DIRECTION_ALL\n },\n\n getTouchAction: function() {\n var direction = this.options.direction;\n var actions = [];\n if (direction & DIRECTION_HORIZONTAL) {\n actions.push(TOUCH_ACTION_PAN_Y);\n }\n if (direction & DIRECTION_VERTICAL) {\n actions.push(TOUCH_ACTION_PAN_X);\n }\n return actions;\n },\n\n directionTest: function(input) {\n var options = this.options;\n var hasMoved = true;\n var distance = input.distance;\n var direction = input.direction;\n var x = input.deltaX;\n var y = input.deltaY;\n\n // lock to axis?\n if (!(direction & options.direction)) {\n if (options.direction & DIRECTION_HORIZONTAL) {\n direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n hasMoved = x != this.pX;\n distance = Math.abs(input.deltaX);\n } else {\n direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n hasMoved = y != this.pY;\n distance = Math.abs(input.deltaY);\n }\n }\n input.direction = direction;\n return hasMoved && distance > options.threshold && direction & options.direction;\n },\n\n attrTest: function(input) {\n return AttrRecognizer.prototype.attrTest.call(this, input) &&\n (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n },\n\n emit: function(input) {\n\n this.pX = input.deltaX;\n this.pY = input.deltaY;\n\n var direction = directionStr(input.direction);\n\n if (direction) {\n input.additionalEvent = this.options.event + direction;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PinchRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(PinchRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'pinch',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n },\n\n emit: function(input) {\n if (input.scale !== 1) {\n var inOut = input.scale < 1 ? 'in' : 'out';\n input.additionalEvent = this.options.event + inOut;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\nfunction PressRecognizer() {\n Recognizer.apply(this, arguments);\n\n this._timer = null;\n this._input = null;\n}\n\ninherit(PressRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PressRecognizer\n */\n defaults: {\n event: 'press',\n pointers: 1,\n time: 251, // minimal time of the pointer to be pressed\n threshold: 9 // a minimal movement is ok, but keep it low\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_AUTO];\n },\n\n process: function(input) {\n var options = this.options;\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTime = input.deltaTime > options.time;\n\n this._input = input;\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n this.reset();\n } else if (input.eventType & INPUT_START) {\n this.reset();\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.time, this);\n } else if (input.eventType & INPUT_END) {\n return STATE_RECOGNIZED;\n }\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function(input) {\n if (this.state !== STATE_RECOGNIZED) {\n return;\n }\n\n if (input && (input.eventType & INPUT_END)) {\n this.manager.emit(this.options.event + 'up', input);\n } else {\n this._input.timeStamp = now();\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction RotateRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(RotateRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof RotateRecognizer\n */\n defaults: {\n event: 'rotate',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n }\n});\n\n/**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction SwipeRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(SwipeRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof SwipeRecognizer\n */\n defaults: {\n event: 'swipe',\n threshold: 10,\n velocity: 0.3,\n direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n pointers: 1\n },\n\n getTouchAction: function() {\n return PanRecognizer.prototype.getTouchAction.call(this);\n },\n\n attrTest: function(input) {\n var direction = this.options.direction;\n var velocity;\n\n if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n velocity = input.overallVelocity;\n } else if (direction & DIRECTION_HORIZONTAL) {\n velocity = input.overallVelocityX;\n } else if (direction & DIRECTION_VERTICAL) {\n velocity = input.overallVelocityY;\n }\n\n return this._super.attrTest.call(this, input) &&\n direction & input.offsetDirection &&\n input.distance > this.options.threshold &&\n input.maxPointers == this.options.pointers &&\n abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n },\n\n emit: function(input) {\n var direction = directionStr(input.offsetDirection);\n if (direction) {\n this.manager.emit(this.options.event + direction, input);\n }\n\n this.manager.emit(this.options.event, input);\n }\n});\n\n/**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\nfunction TapRecognizer() {\n Recognizer.apply(this, arguments);\n\n // previous time and center,\n // used for tap counting\n this.pTime = false;\n this.pCenter = false;\n\n this._timer = null;\n this._input = null;\n this.count = 0;\n}\n\ninherit(TapRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'tap',\n pointers: 1,\n taps: 1,\n interval: 300, // max time between the multi-tap taps\n time: 250, // max time of the pointer to be down (like finger on the screen)\n threshold: 9, // a minimal movement is ok, but keep it low\n posThreshold: 10 // a multi-tap can be a bit off the initial position\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_MANIPULATION];\n },\n\n process: function(input) {\n var options = this.options;\n\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTouchTime = input.deltaTime < options.time;\n\n this.reset();\n\n if ((input.eventType & INPUT_START) && (this.count === 0)) {\n return this.failTimeout();\n }\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (validMovement && validTouchTime && validPointers) {\n if (input.eventType != INPUT_END) {\n return this.failTimeout();\n }\n\n var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n this.pTime = input.timeStamp;\n this.pCenter = input.center;\n\n if (!validMultiTap || !validInterval) {\n this.count = 1;\n } else {\n this.count += 1;\n }\n\n this._input = input;\n\n // if tap count matches we have recognized it,\n // else it has began recognizing...\n var tapCount = this.count % options.taps;\n if (tapCount === 0) {\n // no failing requirements, immediately trigger the tap event\n // or wait as long as the multitap interval to trigger\n if (!this.hasRequireFailures()) {\n return STATE_RECOGNIZED;\n } else {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.interval, this);\n return STATE_BEGAN;\n }\n }\n }\n return STATE_FAILED;\n },\n\n failTimeout: function() {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_FAILED;\n }, this.options.interval, this);\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function() {\n if (this.state == STATE_RECOGNIZED) {\n this._input.tapCount = this.count;\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Hammer(element, options) {\n options = options || {};\n options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n return new Manager(element, options);\n}\n\n/**\n * @const {string}\n */\nHammer.VERSION = '2.0.7';\n\n/**\n * default settings\n * @namespace\n */\nHammer.defaults = {\n /**\n * set if DOM events are being triggered.\n * But this is slower and unused by simple implementations, so disabled by default.\n * @type {Boolean}\n * @default false\n */\n domEvents: false,\n\n /**\n * The value for the touchAction property/fallback.\n * When set to `compute` it will magically set the correct value based on the added recognizers.\n * @type {String}\n * @default compute\n */\n touchAction: TOUCH_ACTION_COMPUTE,\n\n /**\n * @type {Boolean}\n * @default true\n */\n enable: true,\n\n /**\n * EXPERIMENTAL FEATURE -- can be removed/changed\n * Change the parent input target element.\n * If Null, then it is being set the to main element.\n * @type {Null|EventTarget}\n * @default null\n */\n inputTarget: null,\n\n /**\n * force an input class\n * @type {Null|Function}\n * @default null\n */\n inputClass: null,\n\n /**\n * Default recognizer setup when calling `Hammer()`\n * When creating a new Manager these will be skipped.\n * @type {Array}\n */\n preset: [\n // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n [RotateRecognizer, {enable: false}],\n [PinchRecognizer, {enable: false}, ['rotate']],\n [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n [TapRecognizer],\n [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n [PressRecognizer]\n ],\n\n /**\n * Some CSS properties can be used to improve the working of Hammer.\n * Add them to this method and they will be set when creating a new Manager.\n * @namespace\n */\n cssProps: {\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userSelect: 'none',\n\n /**\n * Disable the Windows Phone grippers when pressing an element.\n * @type {String}\n * @default 'none'\n */\n touchSelect: 'none',\n\n /**\n * Disables the default callout shown when you touch and hold a touch target.\n * On iOS, when you touch and hold a touch target such as a link, Safari displays\n * a callout containing information about the link. This property allows you to disable that callout.\n * @type {String}\n * @default 'none'\n */\n touchCallout: 'none',\n\n /**\n * Specifies whether zooming is enabled. Used by IE10>\n * @type {String}\n * @default 'none'\n */\n contentZooming: 'none',\n\n /**\n * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userDrag: 'none',\n\n /**\n * Overrides the highlight color shown when the user taps a link or a JavaScript\n * clickable element in iOS. This property obeys the alpha value, if specified.\n * @type {String}\n * @default 'rgba(0,0,0,0)'\n */\n tapHighlightColor: 'rgba(0,0,0,0)'\n }\n};\n\nvar STOP = 1;\nvar FORCED_STOP = 2;\n\n/**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Manager(element, options) {\n this.options = assign({}, Hammer.defaults, options || {});\n\n this.options.inputTarget = this.options.inputTarget || element;\n\n this.handlers = {};\n this.session = {};\n this.recognizers = [];\n this.oldCssProps = {};\n\n this.element = element;\n this.input = createInputInstance(this);\n this.touchAction = new TouchAction(this, this.options.touchAction);\n\n toggleCssProps(this, true);\n\n each(this.options.recognizers, function(item) {\n var recognizer = this.add(new (item[0])(item[1]));\n item[2] && recognizer.recognizeWith(item[2]);\n item[3] && recognizer.requireFailure(item[3]);\n }, this);\n}\n\nManager.prototype = {\n /**\n * set options\n * @param {Object} options\n * @returns {Manager}\n */\n set: function(options) {\n assign(this.options, options);\n\n // Options that need a little more setup\n if (options.touchAction) {\n this.touchAction.update();\n }\n if (options.inputTarget) {\n // Clean up existing event listeners and reinitialize\n this.input.destroy();\n this.input.target = options.inputTarget;\n this.input.init();\n }\n return this;\n },\n\n /**\n * stop recognizing for this session.\n * This session will be discarded, when a new [input]start event is fired.\n * When forced, the recognizer cycle is stopped immediately.\n * @param {Boolean} [force]\n */\n stop: function(force) {\n this.session.stopped = force ? FORCED_STOP : STOP;\n },\n\n /**\n * run the recognizers!\n * called by the inputHandler function on every movement of the pointers (touches)\n * it walks through all the recognizers and tries to detect the gesture that is being made\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n var session = this.session;\n if (session.stopped) {\n return;\n }\n\n // run the touch-action polyfill\n this.touchAction.preventDefaults(inputData);\n\n var recognizer;\n var recognizers = this.recognizers;\n\n // this holds the recognizer that is being recognized.\n // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n // if no recognizer is detecting a thing, it is set to `null`\n var curRecognizer = session.curRecognizer;\n\n // reset when the last recognizer is recognized\n // or when we're in a new session\n if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n curRecognizer = session.curRecognizer = null;\n }\n\n var i = 0;\n while (i < recognizers.length) {\n recognizer = recognizers[i];\n\n // find out if we are allowed try to recognize the input for this one.\n // 1. allow if the session is NOT forced stopped (see the .stop() method)\n // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n // that is being recognized.\n // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n // this can be setup with the `recognizeWith()` method on the recognizer.\n if (session.stopped !== FORCED_STOP && ( // 1\n !curRecognizer || recognizer == curRecognizer || // 2\n recognizer.canRecognizeWith(curRecognizer))) { // 3\n recognizer.recognize(inputData);\n } else {\n recognizer.reset();\n }\n\n // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n // current active recognizer. but only if we don't already have an active recognizer\n if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n curRecognizer = session.curRecognizer = recognizer;\n }\n i++;\n }\n },\n\n /**\n * get a recognizer by its event name.\n * @param {Recognizer|String} recognizer\n * @returns {Recognizer|Null}\n */\n get: function(recognizer) {\n if (recognizer instanceof Recognizer) {\n return recognizer;\n }\n\n var recognizers = this.recognizers;\n for (var i = 0; i < recognizers.length; i++) {\n if (recognizers[i].options.event == recognizer) {\n return recognizers[i];\n }\n }\n return null;\n },\n\n /**\n * add a recognizer to the manager\n * existing recognizers with the same event name will be removed\n * @param {Recognizer} recognizer\n * @returns {Recognizer|Manager}\n */\n add: function(recognizer) {\n if (invokeArrayArg(recognizer, 'add', this)) {\n return this;\n }\n\n // remove existing\n var existing = this.get(recognizer.options.event);\n if (existing) {\n this.remove(existing);\n }\n\n this.recognizers.push(recognizer);\n recognizer.manager = this;\n\n this.touchAction.update();\n return recognizer;\n },\n\n /**\n * remove a recognizer by name or instance\n * @param {Recognizer|String} recognizer\n * @returns {Manager}\n */\n remove: function(recognizer) {\n if (invokeArrayArg(recognizer, 'remove', this)) {\n return this;\n }\n\n recognizer = this.get(recognizer);\n\n // let's make sure this recognizer exists\n if (recognizer) {\n var recognizers = this.recognizers;\n var index = inArray(recognizers, recognizer);\n\n if (index !== -1) {\n recognizers.splice(index, 1);\n this.touchAction.update();\n }\n }\n\n return this;\n },\n\n /**\n * bind event\n * @param {String} events\n * @param {Function} handler\n * @returns {EventEmitter} this\n */\n on: function(events, handler) {\n if (events === undefined) {\n return;\n }\n if (handler === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n handlers[event] = handlers[event] || [];\n handlers[event].push(handler);\n });\n return this;\n },\n\n /**\n * unbind event, leave emit blank to remove all handlers\n * @param {String} events\n * @param {Function} [handler]\n * @returns {EventEmitter} this\n */\n off: function(events, handler) {\n if (events === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n if (!handler) {\n delete handlers[event];\n } else {\n handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n }\n });\n return this;\n },\n\n /**\n * emit event to the listeners\n * @param {String} event\n * @param {Object} data\n */\n emit: function(event, data) {\n // we also want to trigger dom events\n if (this.options.domEvents) {\n triggerDomEvent(event, data);\n }\n\n // no handlers, so skip it all\n var handlers = this.handlers[event] && this.handlers[event].slice();\n if (!handlers || !handlers.length) {\n return;\n }\n\n data.type = event;\n data.preventDefault = function() {\n data.srcEvent.preventDefault();\n };\n\n var i = 0;\n while (i < handlers.length) {\n handlers[i](data);\n i++;\n }\n },\n\n /**\n * destroy the manager and unbinds all events\n * it doesn't unbind dom events, that is the user own responsibility\n */\n destroy: function() {\n this.element && toggleCssProps(this, false);\n\n this.handlers = {};\n this.session = {};\n this.input.destroy();\n this.element = null;\n }\n};\n\n/**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\nfunction toggleCssProps(manager, add) {\n var element = manager.element;\n if (!element.style) {\n return;\n }\n var prop;\n each(manager.options.cssProps, function(value, name) {\n prop = prefixed(element.style, name);\n if (add) {\n manager.oldCssProps[prop] = element.style[prop];\n element.style[prop] = value;\n } else {\n element.style[prop] = manager.oldCssProps[prop] || '';\n }\n });\n if (!add) {\n manager.oldCssProps = {};\n }\n}\n\n/**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\nfunction triggerDomEvent(event, data) {\n var gestureEvent = document.createEvent('Event');\n gestureEvent.initEvent(event, true, true);\n gestureEvent.gesture = data;\n data.target.dispatchEvent(gestureEvent);\n}\n\nassign(Hammer, {\n INPUT_START: INPUT_START,\n INPUT_MOVE: INPUT_MOVE,\n INPUT_END: INPUT_END,\n INPUT_CANCEL: INPUT_CANCEL,\n\n STATE_POSSIBLE: STATE_POSSIBLE,\n STATE_BEGAN: STATE_BEGAN,\n STATE_CHANGED: STATE_CHANGED,\n STATE_ENDED: STATE_ENDED,\n STATE_RECOGNIZED: STATE_RECOGNIZED,\n STATE_CANCELLED: STATE_CANCELLED,\n STATE_FAILED: STATE_FAILED,\n\n DIRECTION_NONE: DIRECTION_NONE,\n DIRECTION_LEFT: DIRECTION_LEFT,\n DIRECTION_RIGHT: DIRECTION_RIGHT,\n DIRECTION_UP: DIRECTION_UP,\n DIRECTION_DOWN: DIRECTION_DOWN,\n DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n DIRECTION_ALL: DIRECTION_ALL,\n\n Manager: Manager,\n Input: Input,\n TouchAction: TouchAction,\n\n TouchInput: TouchInput,\n MouseInput: MouseInput,\n PointerEventInput: PointerEventInput,\n TouchMouseInput: TouchMouseInput,\n SingleTouchInput: SingleTouchInput,\n\n Recognizer: Recognizer,\n AttrRecognizer: AttrRecognizer,\n Tap: TapRecognizer,\n Pan: PanRecognizer,\n Swipe: SwipeRecognizer,\n Pinch: PinchRecognizer,\n Rotate: RotateRecognizer,\n Press: PressRecognizer,\n\n on: addEventListeners,\n off: removeEventListeners,\n each: each,\n merge: merge,\n extend: extend,\n assign: assign,\n inherit: inherit,\n bindFn: bindFn,\n prefixed: prefixed\n});\n\n// this prevents errors when Hammer is loaded in the presence of an AMD\n// style loader but by script tag, not by the loader.\nvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\nfreeGlobal.Hammer = Hammer;\n\nif (typeof define === 'function' && define.amd) {\n define(function() {\n return Hammer;\n });\n} else if (typeof module != 'undefined' && module.exports) {\n module.exports = Hammer;\n} else {\n window[exportName] = Hammer;\n}\n\n})(window, document, 'Hammer');\n\n},{}],28:[function(require,module,exports){\nmodule.exports = isFunction\n\nvar toString = Object.prototype.toString\n\nfunction isFunction (fn) {\n var string = toString.call(fn)\n return string === '[object Function]' ||\n (typeof fn === 'function' && string !== '[object RegExp]') ||\n (typeof window !== 'undefined' &&\n // IE8 and below\n (fn === window.setTimeout ||\n fn === window.alert ||\n fn === window.confirm ||\n fn === window.prompt))\n};\n\n},{}],29:[function(require,module,exports){\nvar trim = require('trim')\n , forEach = require('for-each')\n , isArray = function(arg) {\n return Object.prototype.toString.call(arg) === '[object Array]';\n }\n\nmodule.exports = function (headers) {\n if (!headers)\n return {}\n\n var result = {}\n\n forEach(\n trim(headers).split('\\n')\n , function (row) {\n var index = row.indexOf(':')\n , key = trim(row.slice(0, index)).toLowerCase()\n , value = trim(row.slice(index + 1))\n\n if (typeof(result[key]) === 'undefined') {\n result[key] = value\n } else if (isArray(result[key])) {\n result[key].push(value)\n } else {\n result[key] = [ result[key], value ]\n }\n }\n )\n\n return result\n}\n},{\"for-each\":25,\"trim\":41}],30:[function(require,module,exports){\n(function (process){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// resolves . and .. elements in a path array with directory names there\n// must be no slashes, empty elements, or device names (c:\\) in the array\n// (so also no leading and trailing slashes - it does not distinguish\n// relative and absolute paths)\nfunction normalizeArray(parts, allowAboveRoot) {\n // if the path tries to go above the root, `up` ends up > 0\n var up = 0;\n for (var i = parts.length - 1; i >= 0; i--) {\n var last = parts[i];\n if (last === '.') {\n parts.splice(i, 1);\n } else if (last === '..') {\n parts.splice(i, 1);\n up++;\n } else if (up) {\n parts.splice(i, 1);\n up--;\n }\n }\n\n // if the path is allowed to go above the root, restore leading ..s\n if (allowAboveRoot) {\n for (; up--; up) {\n parts.unshift('..');\n }\n }\n\n return parts;\n}\n\n// Split a filename into [root, dir, basename, ext], unix version\n// 'root' is just a slash, or nothing.\nvar splitPathRe =\n /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\nvar splitPath = function(filename) {\n return splitPathRe.exec(filename).slice(1);\n};\n\n// path.resolve([from ...], to)\n// posix version\nexports.resolve = function() {\n var resolvedPath = '',\n resolvedAbsolute = false;\n\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path = (i >= 0) ? arguments[i] : process.cwd();\n\n // Skip empty and invalid entries\n if (typeof path !== 'string') {\n throw new TypeError('Arguments to path.resolve must be strings');\n } else if (!path) {\n continue;\n }\n\n resolvedPath = path + '/' + resolvedPath;\n resolvedAbsolute = path.charAt(0) === '/';\n }\n\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n\n // Normalize the path\n resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {\n return !!p;\n }), !resolvedAbsolute).join('/');\n\n return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n};\n\n// path.normalize(path)\n// posix version\nexports.normalize = function(path) {\n var isAbsolute = exports.isAbsolute(path),\n trailingSlash = substr(path, -1) === '/';\n\n // Normalize the path\n path = normalizeArray(filter(path.split('/'), function(p) {\n return !!p;\n }), !isAbsolute).join('/');\n\n if (!path && !isAbsolute) {\n path = '.';\n }\n if (path && trailingSlash) {\n path += '/';\n }\n\n return (isAbsolute ? '/' : '') + path;\n};\n\n// posix version\nexports.isAbsolute = function(path) {\n return path.charAt(0) === '/';\n};\n\n// posix version\nexports.join = function() {\n var paths = Array.prototype.slice.call(arguments, 0);\n return exports.normalize(filter(paths, function(p, index) {\n if (typeof p !== 'string') {\n throw new TypeError('Arguments to path.join must be strings');\n }\n return p;\n }).join('/'));\n};\n\n\n// path.relative(from, to)\n// posix version\nexports.relative = function(from, to) {\n from = exports.resolve(from).substr(1);\n to = exports.resolve(to).substr(1);\n\n function trim(arr) {\n var start = 0;\n for (; start < arr.length; start++) {\n if (arr[start] !== '') break;\n }\n\n var end = arr.length - 1;\n for (; end >= 0; end--) {\n if (arr[end] !== '') break;\n }\n\n if (start > end) return [];\n return arr.slice(start, end - start + 1);\n }\n\n var fromParts = trim(from.split('/'));\n var toParts = trim(to.split('/'));\n\n var length = Math.min(fromParts.length, toParts.length);\n var samePartsLength = length;\n for (var i = 0; i < length; i++) {\n if (fromParts[i] !== toParts[i]) {\n samePartsLength = i;\n break;\n }\n }\n\n var outputParts = [];\n for (var i = samePartsLength; i < fromParts.length; i++) {\n outputParts.push('..');\n }\n\n outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n return outputParts.join('/');\n};\n\nexports.sep = '/';\nexports.delimiter = ':';\n\nexports.dirname = function(path) {\n var result = splitPath(path),\n root = result[0],\n dir = result[1];\n\n if (!root && !dir) {\n // No dirname whatsoever\n return '.';\n }\n\n if (dir) {\n // It has a dirname, strip trailing slash\n dir = dir.substr(0, dir.length - 1);\n }\n\n return root + dir;\n};\n\n\nexports.basename = function(path, ext) {\n var f = splitPath(path)[2];\n // TODO: make this comparison case-insensitive on windows?\n if (ext && f.substr(-1 * ext.length) === ext) {\n f = f.substr(0, f.length - ext.length);\n }\n return f;\n};\n\n\nexports.extname = function(path) {\n return splitPath(path)[3];\n};\n\nfunction filter (xs, f) {\n if (xs.filter) return xs.filter(f);\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n if (f(xs[i], i, xs)) res.push(xs[i]);\n }\n return res;\n}\n\n// String.prototype.substr - negative index don't work in IE8\nvar substr = 'ab'.substr(-1) === 'b'\n ? function (str, start, len) { return str.substr(start, len) }\n : function (str, start, len) {\n if (start < 0) start = str.length + start;\n return str.substr(start, len);\n }\n;\n\n}).call(this,require('_process'))\n//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9wYXRoLWJyb3dzZXJpZnkvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIHJlc29sdmVzIC4gYW5kIC4uIGVsZW1lbnRzIGluIGEgcGF0aCBhcnJheSB3aXRoIGRpcmVjdG9yeSBuYW1lcyB0aGVyZVxuLy8gbXVzdCBiZSBubyBzbGFzaGVzLCBlbXB0eSBlbGVtZW50cywgb3IgZGV2aWNlIG5hbWVzIChjOlxcKSBpbiB0aGUgYXJyYXlcbi8vIChzbyBhbHNvIG5vIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNsYXNoZXMgLSBpdCBkb2VzIG5vdCBkaXN0aW5ndWlzaFxuLy8gcmVsYXRpdmUgYW5kIGFic29sdXRlIHBhdGhzKVxuZnVuY3Rpb24gbm9ybWFsaXplQXJyYXkocGFydHMsIGFsbG93QWJvdmVSb290KSB7XG4gIC8vIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlIHRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gIHZhciB1cCA9IDA7XG4gIGZvciAodmFyIGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciBsYXN0ID0gcGFydHNbaV07XG4gICAgaWYgKGxhc3QgPT09ICcuJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAobGFzdCA9PT0gJy4uJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICB1cC0tO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBwYXRoIGlzIGFsbG93ZWQgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIHJlc3RvcmUgbGVhZGluZyAuLnNcbiAgaWYgKGFsbG93QWJvdmVSb290KSB7XG4gICAgZm9yICg7IHVwLS07IHVwKSB7XG4gICAgICBwYXJ0cy51bnNoaWZ0KCcuLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJ0cztcbn1cblxuLy8gU3BsaXQgYSBmaWxlbmFtZSBpbnRvIFtyb290LCBkaXIsIGJhc2VuYW1lLCBleHRdLCB1bml4IHZlcnNpb25cbi8vICdyb290JyBpcyBqdXN0IGEgc2xhc2gsIG9yIG5vdGhpbmcuXG52YXIgc3BsaXRQYXRoUmUgPVxuICAgIC9eKFxcLz98KShbXFxzXFxTXSo/KSgoPzpcXC57MSwyfXxbXlxcL10rP3wpKFxcLlteLlxcL10qfCkpKD86W1xcL10qKSQvO1xudmFyIHNwbGl0UGF0aCA9IGZ1bmN0aW9uKGZpbGVuYW1lKSB7XG4gIHJldHVybiBzcGxpdFBhdGhSZS5leGVjKGZpbGVuYW1lKS5zbGljZSgxKTtcbn07XG5cbi8vIHBhdGgucmVzb2x2ZShbZnJvbSAuLi5dLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVzb2x2ZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVzb2x2ZWRQYXRoID0gJycsXG4gICAgICByZXNvbHZlZEFic29sdXRlID0gZmFsc2U7XG5cbiAgZm9yICh2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpLS0pIHtcbiAgICB2YXIgcGF0aCA9IChpID49IDApID8gYXJndW1lbnRzW2ldIDogcHJvY2Vzcy5jd2QoKTtcblxuICAgIC8vIFNraXAgZW1wdHkgYW5kIGludmFsaWQgZW50cmllc1xuICAgIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLnJlc29sdmUgbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfSBlbHNlIGlmICghcGF0aCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmVzb2x2ZWRQYXRoID0gcGF0aCArICcvJyArIHJlc29sdmVkUGF0aDtcbiAgICByZXNvbHZlZEFic29sdXRlID0gcGF0aC5jaGFyQXQoMCkgPT09ICcvJztcbiAgfVxuXG4gIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBhdGggc2hvdWxkIGJlIHJlc29sdmVkIHRvIGEgZnVsbCBhYnNvbHV0ZSBwYXRoLCBidXRcbiAgLy8gaGFuZGxlIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHNhZmUgKG1pZ2h0IGhhcHBlbiB3aGVuIHByb2Nlc3MuY3dkKCkgZmFpbHMpXG5cbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gIHJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUFycmF5KGZpbHRlcihyZXNvbHZlZFBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhcmVzb2x2ZWRBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIHJldHVybiAoKHJlc29sdmVkQWJzb2x1dGUgPyAnLycgOiAnJykgKyByZXNvbHZlZFBhdGgpIHx8ICcuJztcbn07XG5cbi8vIHBhdGgubm9ybWFsaXplKHBhdGgpXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIGlzQWJzb2x1dGUgPSBleHBvcnRzLmlzQWJzb2x1dGUocGF0aCksXG4gICAgICB0cmFpbGluZ1NsYXNoID0gc3Vic3RyKHBhdGgsIC0xKSA9PT0gJy8nO1xuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICBwYXRoID0gbm9ybWFsaXplQXJyYXkoZmlsdGVyKHBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhaXNBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIGlmICghcGF0aCAmJiAhaXNBYnNvbHV0ZSkge1xuICAgIHBhdGggPSAnLic7XG4gIH1cbiAgaWYgKHBhdGggJiYgdHJhaWxpbmdTbGFzaCkge1xuICAgIHBhdGggKz0gJy8nO1xuICB9XG5cbiAgcmV0dXJuIChpc0Fic29sdXRlID8gJy8nIDogJycpICsgcGF0aDtcbn07XG5cbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnLyc7XG59O1xuXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLmpvaW4gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHBhdGhzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgcmV0dXJuIGV4cG9ydHMubm9ybWFsaXplKGZpbHRlcihwYXRocywgZnVuY3Rpb24ocCwgaW5kZXgpIHtcbiAgICBpZiAodHlwZW9mIHAgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5qb2luIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfSkuam9pbignLycpKTtcbn07XG5cblxuLy8gcGF0aC5yZWxhdGl2ZShmcm9tLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVsYXRpdmUgPSBmdW5jdGlvbihmcm9tLCB0bykge1xuICBmcm9tID0gZXhwb3J0cy5yZXNvbHZlKGZyb20pLnN1YnN0cigxKTtcbiAgdG8gPSBleHBvcnRzLnJlc29sdmUodG8pLnN1YnN0cigxKTtcblxuICBmdW5jdGlvbiB0cmltKGFycikge1xuICAgIHZhciBzdGFydCA9IDA7XG4gICAgZm9yICg7IHN0YXJ0IDwgYXJyLmxlbmd0aDsgc3RhcnQrKykge1xuICAgICAgaWYgKGFycltzdGFydF0gIT09ICcnKSBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgZW5kID0gYXJyLmxlbmd0aCAtIDE7XG4gICAgZm9yICg7IGVuZCA+PSAwOyBlbmQtLSkge1xuICAgICAgaWYgKGFycltlbmRdICE9PSAnJykgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0ID4gZW5kKSByZXR1cm4gW107XG4gICAgcmV0dXJuIGFyci5zbGljZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTtcbiAgfVxuXG4gIHZhciBmcm9tUGFydHMgPSB0cmltKGZyb20uc3BsaXQoJy8nKSk7XG4gIHZhciB0b1BhcnRzID0gdHJpbSh0by5zcGxpdCgnLycpKTtcblxuICB2YXIgbGVuZ3RoID0gTWF0aC5taW4oZnJvbVBhcnRzLmxlbmd0aCwgdG9QYXJ0cy5sZW5ndGgpO1xuICB2YXIgc2FtZVBhcnRzTGVuZ3RoID0gbGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZyb21QYXJ0c1tpXSAhPT0gdG9QYXJ0c1tpXSkge1xuICAgICAgc2FtZVBhcnRzTGVuZ3RoID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBvdXRwdXRQYXJ0cyA9IFtdO1xuICBmb3IgKHZhciBpID0gc2FtZVBhcnRzTGVuZ3RoOyBpIDwgZnJvbVBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3V0cHV0UGFydHMucHVzaCgnLi4nKTtcbiAgfVxuXG4gIG91dHB1dFBhcnRzID0gb3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7XG5cbiAgcmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oJy8nKTtcbn07XG5cbmV4cG9ydHMuc2VwID0gJy8nO1xuZXhwb3J0cy5kZWxpbWl0ZXIgPSAnOic7XG5cbmV4cG9ydHMuZGlybmFtZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIHJlc3VsdCA9IHNwbGl0UGF0aChwYXRoKSxcbiAgICAgIHJvb3QgPSByZXN1bHRbMF0sXG4gICAgICBkaXIgPSByZXN1bHRbMV07XG5cbiAgaWYgKCFyb290ICYmICFkaXIpIHtcbiAgICAvLyBObyBkaXJuYW1lIHdoYXRzb2V2ZXJcbiAgICByZXR1cm4gJy4nO1xuICB9XG5cbiAgaWYgKGRpcikge1xuICAgIC8vIEl0IGhhcyBhIGRpcm5hbWUsIHN0cmlwIHRyYWlsaW5nIHNsYXNoXG4gICAgZGlyID0gZGlyLnN1YnN0cigwLCBkaXIubGVuZ3RoIC0gMSk7XG4gIH1cblxuICByZXR1cm4gcm9vdCArIGRpcjtcbn07XG5cblxuZXhwb3J0cy5iYXNlbmFtZSA9IGZ1bmN0aW9uKHBhdGgsIGV4dCkge1xuICB2YXIgZiA9IHNwbGl0UGF0aChwYXRoKVsyXTtcbiAgLy8gVE9ETzogbWFrZSB0aGlzIGNvbXBhcmlzb24gY2FzZS1pbnNlbnNpdGl2ZSBvbiB3aW5kb3dzP1xuICBpZiAoZXh0ICYmIGYuc3Vic3RyKC0xICogZXh0Lmxlbmd0aCkgPT09IGV4dCkge1xuICAgIGYgPSBmLnN1YnN0cigwLCBmLmxlbmd0aCAtIGV4dC5sZW5ndGgpO1xuICB9XG4gIHJldHVybiBmO1xufTtcblxuXG5leHBvcnRzLmV4dG5hbWUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHJldHVybiBzcGxpdFBhdGgocGF0aClbM107XG59O1xuXG5mdW5jdGlvbiBmaWx0ZXIgKHhzLCBmKSB7XG4gICAgaWYgKHhzLmZpbHRlcikgcmV0dXJuIHhzLmZpbHRlcihmKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZih4c1tpXSwgaSwgeHMpKSByZXMucHVzaCh4c1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbi8vIFN0cmluZy5wcm90b3R5cGUuc3Vic3RyIC0gbmVnYXRpdmUgaW5kZXggZG9uJ3Qgd29yayBpbiBJRThcbnZhciBzdWJzdHIgPSAnYWInLnN1YnN0cigtMSkgPT09ICdiJ1xuICAgID8gZnVuY3Rpb24gKHN0ciwgc3RhcnQsIGxlbikgeyByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKSB9XG4gICAgOiBmdW5jdGlvbiAoc3RyLCBzdGFydCwgbGVuKSB7XG4gICAgICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gc3RyLmxlbmd0aCArIHN0YXJ0O1xuICAgICAgICByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKTtcbiAgICB9XG47XG4iXX0=\n},{\"_process\":23}],31:[function(require,module,exports){\n/*\n * Copyright 2009-2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE.txt or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nexports.SourceMapGenerator = require('./source-map/source-map-generator').SourceMapGenerator;\nexports.SourceMapConsumer = require('./source-map/source-map-consumer').SourceMapConsumer;\nexports.SourceNode = require('./source-map/source-node').SourceNode;\n\n},{\"./source-map/source-map-consumer\":37,\"./source-map/source-map-generator\":38,\"./source-map/source-node\":39}],32:[function(require,module,exports){\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nif (typeof define !== 'function') {\n var define = require('amdefine')(module, require);\n}\ndefine(function (require, exports, module) {\n\n var util = require('./util');\n\n /**\n * A data structure which is a combination of an array and a set. Adding a new\n * member is O(1), testing for membership is O(1), and finding the index of an\n * element is O(1). Removing elements from the set is not supported. Only\n * strings are supported for membership.\n */\n function ArraySet() {\n this._array = [];\n this._set = {};\n }\n\n /**\n * Static method for creating ArraySet instances from an existing array.\n */\n ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n var set = new ArraySet();\n for (var i = 0, len = aArray.length; i < len; i++) {\n set.add(aArray[i], aAllowDuplicates);\n }\n return set;\n };\n\n /**\n * Add the given string to this set.\n *\n * @param String aStr\n */\n ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n var isDuplicate = this.has(aStr);\n var idx = this._array.length;\n if (!isDuplicate || aAllowDuplicates) {\n this._array.push(aStr);\n }\n if (!isDuplicate) {\n this._set[util.toSetString(aStr)] = idx;\n }\n };\n\n /**\n * Is the given string a member of this set?\n *\n * @param String aStr\n */\n ArraySet.prototype.has = function ArraySet_has(aStr) {\n return Object.prototype.hasOwnProperty.call(this._set,\n util.toSetString(aStr));\n };\n\n /**\n * What is the index of the given string in the array?\n *\n * @param String aStr\n */\n ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n if (this.has(aStr)) {\n return this._set[util.toSetString(aStr)];\n }\n throw new Error('\"' + aStr + '\" is not in the set.');\n };\n\n /**\n * What is the element at the given index?\n *\n * @param Number aIdx\n */\n ArraySet.prototype.at = function ArraySet_at(aIdx) {\n if (aIdx >= 0 && aIdx < this._array.length) {\n return this._array[aIdx];\n }\n throw new Error('No element indexed by ' + aIdx);\n };\n\n /**\n * Returns the array representation of this set (which has the proper indices\n * indicated by indexOf). Note that this is a copy of the internal array used\n * for storing the members so that no one can mess with internal state.\n */\n ArraySet.prototype.toArray = function ArraySet_toArray() {\n return this._array.slice();\n };\n\n exports.ArraySet = ArraySet;\n\n});\n\n},{\"./util\":40,\"amdefine\":21}],33:[function(require,module,exports){\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n *\n * Based on the Base 64 VLQ implementation in Closure Compiler:\n * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n *\n * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following\n * disclaimer in the documentation and/or other materials provided\n * with the distribution.\n * * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived\n * from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nif (typeof define !== 'function') {\n var define = require('amdefine')(module, require);\n}\ndefine(function (require, exports, module) {\n\n var base64 = require('./base64');\n\n // A single base 64 digit can contain 6 bits of data. For the base 64 variable\n // length quantities we use in the source map spec, the first bit is the sign,\n // the next four bits are the actual value, and the 6th bit is the\n // continuation bit. The continuation bit tells us whether there are more\n // digits in this value following this digit.\n //\n // Continuation\n // | Sign\n // | |\n // V V\n // 101011\n\n var VLQ_BASE_SHIFT = 5;\n\n // binary: 100000\n var VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\n // binary: 011111\n var VLQ_BASE_MASK = VLQ_BASE - 1;\n\n // binary: 100000\n var VLQ_CONTINUATION_BIT = VLQ_BASE;\n\n /**\n * Converts from a two-complement value to a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n */\n function toVLQSigned(aValue) {\n return aValue < 0\n ? ((-aValue) << 1) + 1\n : (aValue << 1) + 0;\n }\n\n /**\n * Converts to a two-complement value from a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n */\n function fromVLQSigned(aValue) {\n var isNegative = (aValue & 1) === 1;\n var shifted = aValue >> 1;\n return isNegative\n ? -shifted\n : shifted;\n }\n\n /**\n * Returns the base 64 VLQ encoded value.\n */\n exports.encode = function base64VLQ_encode(aValue) {\n var encoded = \"\";\n var digit;\n\n var vlq = toVLQSigned(aValue);\n\n do {\n digit = vlq & VLQ_BASE_MASK;\n vlq >>>= VLQ_BASE_SHIFT;\n if (vlq > 0) {\n // There are still more digits in this value, so we must make sure the\n // continuation bit is marked.\n digit |= VLQ_CONTINUATION_BIT;\n }\n encoded += base64.encode(digit);\n } while (vlq > 0);\n\n return encoded;\n };\n\n /**\n * Decodes the next base 64 VLQ value from the given string and returns the\n * value and the rest of the string via the out parameter.\n */\n exports.decode = function base64VLQ_decode(aStr, aOutParam) {\n var i = 0;\n var strLen = aStr.length;\n var result = 0;\n var shift = 0;\n var continuation, digit;\n\n do {\n if (i >= strLen) {\n throw new Error(\"Expected more digits in base 64 VLQ value.\");\n }\n digit = base64.decode(aStr.charAt(i++));\n continuation = !!(digit & VLQ_CONTINUATION_BIT);\n digit &= VLQ_BASE_MASK;\n result = result + (digit << shift);\n shift += VLQ_BASE_SHIFT;\n } while (continuation);\n\n aOutParam.value = fromVLQSigned(result);\n aOutParam.rest = aStr.slice(i);\n };\n\n});\n\n},{\"./base64\":34,\"amdefine\":21}],34:[function(require,module,exports){\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nif (typeof define !== 'function') {\n var define = require('amdefine')(module, require);\n}\ndefine(function (require, exports, module) {\n\n var charToIntMap = {};\n var intToCharMap = {};\n\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n .split('')\n .forEach(function (ch, index) {\n charToIntMap[ch] = index;\n intToCharMap[index] = ch;\n });\n\n /**\n * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n */\n exports.encode = function base64_encode(aNumber) {\n if (aNumber in intToCharMap) {\n return intToCharMap[aNumber];\n }\n throw new TypeError(\"Must be between 0 and 63: \" + aNumber);\n };\n\n /**\n * Decode a single base 64 digit to an integer.\n */\n exports.decode = function base64_decode(aChar) {\n if (aChar in charToIntMap) {\n return charToIntMap[aChar];\n }\n throw new TypeError(\"Not a valid base 64 digit: \" + aChar);\n };\n\n});\n\n},{\"amdefine\":21}],35:[function(require,module,exports){\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nif (typeof define !== 'function') {\n var define = require('amdefine')(module, require);\n}\ndefine(function (require, exports, module) {\n\n /**\n * Recursive implementation of binary search.\n *\n * @param aLow Indices here and lower do not contain the needle.\n * @param aHigh Indices here and higher do not contain the needle.\n * @param aNeedle The element being searched for.\n * @param aHaystack The non-empty array being searched.\n * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n */\n function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare) {\n // This function terminates when one of the following is true:\n //\n // 1. We find the exact element we are looking for.\n //\n // 2. We did not find the exact element, but we can return the index of\n // the next closest element that is less than that element.\n //\n // 3. We did not find the exact element, and there is no next-closest\n // element which is less than the one we are searching for, so we\n // return -1.\n var mid = Math.floor((aHigh - aLow) / 2) + aLow;\n var cmp = aCompare(aNeedle, aHaystack[mid], true);\n if (cmp === 0) {\n // Found the element we are looking for.\n return mid;\n }\n else if (cmp > 0) {\n // aHaystack[mid] is greater than our needle.\n if (aHigh - mid > 1) {\n // The element is in the upper half.\n return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare);\n }\n // We did not find an exact match, return the next closest one\n // (termination case 2).\n return mid;\n }\n else {\n // aHaystack[mid] is less than our needle.\n if (mid - aLow > 1) {\n // The element is in the lower half.\n return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare);\n }\n // The exact needle element was not found in this haystack. Determine if\n // we are in termination case (2) or (3) and return the appropriate thing.\n return aLow < 0 ? -1 : aLow;\n }\n }\n\n /**\n * This is an implementation of binary search which will always try and return\n * the index of next lowest value checked if there is no exact hit. This is\n * because mappings between original and generated line/col pairs are single\n * points, and there is an implicit region between each of them, so a miss\n * just means that you aren't on the very start of a region.\n *\n * @param aNeedle The element you are looking for.\n * @param aHaystack The array that is being searched.\n * @param aCompare A function which takes the needle and an element in the\n * array and returns -1, 0, or 1 depending on whether the needle is less\n * than, equal to, or greater than the element, respectively.\n */\n exports.search = function search(aNeedle, aHaystack, aCompare) {\n if (aHaystack.length === 0) {\n return -1;\n }\n return recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, aCompare)\n };\n\n});\n\n},{\"amdefine\":21}],36:[function(require,module,exports){\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2014 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nif (typeof define !== 'function') {\n var define = require('amdefine')(module, require);\n}\ndefine(function (require, exports, module) {\n\n var util = require('./util');\n\n /**\n * Determine whether mappingB is after mappingA with respect to generated\n * position.\n */\n function generatedPositionAfter(mappingA, mappingB) {\n // Optimized for most common case\n var lineA = mappingA.generatedLine;\n var lineB = mappingB.generatedLine;\n var columnA = mappingA.generatedColumn;\n var columnB = mappingB.generatedColumn;\n return lineB > lineA || lineB == lineA && columnB >= columnA ||\n util.compareByGeneratedPositions(mappingA, mappingB) <= 0;\n }\n\n /**\n * A data structure to provide a sorted view of accumulated mappings in a\n * performance conscious manner. It trades a neglibable overhead in general\n * case for a large speedup in case of mappings being added in order.\n */\n function MappingList() {\n this._array = [];\n this._sorted = true;\n // Serves as infimum\n this._last = {generatedLine: -1, generatedColumn: 0};\n }\n\n /**\n * Iterate through internal items. This method takes the same arguments that\n * `Array.prototype.forEach` takes.\n *\n * NOTE: The order of the mappings is NOT guaranteed.\n */\n MappingList.prototype.unsortedForEach =\n function MappingList_forEach(aCallback, aThisArg) {\n this._array.forEach(aCallback, aThisArg);\n };\n\n /**\n * Add the given source mapping.\n *\n * @param Object aMapping\n */\n MappingList.prototype.add = function MappingList_add(aMapping) {\n var mapping;\n if (generatedPositionAfter(this._last, aMapping)) {\n this._last = aMapping;\n this._array.push(aMapping);\n } else {\n this._sorted = false;\n this._array.push(aMapping);\n }\n };\n\n /**\n * Returns the flat, sorted array of mappings. The mappings are sorted by\n * generated position.\n *\n * WARNING: This method returns internal data without copying, for\n * performance. The return value must NOT be mutated, and should be treated as\n * an immutable borrow. If you want to take ownership, you must make your own\n * copy.\n */\n MappingList.prototype.toArray = function MappingList_toArray() {\n if (!this._sorted) {\n this._array.sort(util.compareByGeneratedPositions);\n this._sorted = true;\n }\n return this._array;\n };\n\n exports.MappingList = MappingList;\n\n});\n\n},{\"./util\":40,\"amdefine\":21}],37:[function(require,module,exports){\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nif (typeof define !== 'function') {\n var define = require('amdefine')(module, require);\n}\ndefine(function (require, exports, module) {\n\n var util = require('./util');\n var binarySearch = require('./binary-search');\n var ArraySet = require('./array-set').ArraySet;\n var base64VLQ = require('./base64-vlq');\n\n /**\n * A SourceMapConsumer instance represents a parsed source map which we can\n * query for information about the original file positions by giving it a file\n * position in the generated source.\n *\n * The only parameter is the raw source map (either as a JSON string, or\n * already parsed to an object). According to the spec, source maps have the\n * following attributes:\n *\n * - version: Which version of the source map spec this map is following.\n * - sources: An array of URLs to the original source files.\n * - names: An array of identifiers which can be referrenced by individual mappings.\n * - sourceRoot: Optional. The URL root from which all sources are relative.\n * - sourcesContent: Optional. An array of contents of the original source files.\n * - mappings: A string of base64 VLQs which contain the actual mappings.\n * - file: Optional. The generated file this source map is associated with.\n *\n * Here is an example source map, taken from the source map spec[0]:\n *\n * {\n * version : 3,\n * file: \"out.js\",\n * sourceRoot : \"\",\n * sources: [\"foo.js\", \"bar.js\"],\n * names: [\"src\", \"maps\", \"are\", \"fun\"],\n * mappings: \"AA,AB;;ABCDE;\"\n * }\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n */\n function SourceMapConsumer(aSourceMap) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n }\n\n var version = util.getArg(sourceMap, 'version');\n var sources = util.getArg(sourceMap, 'sources');\n // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n // requires the array) to play nice here.\n var names = util.getArg(sourceMap, 'names', []);\n var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\n var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\n var mappings = util.getArg(sourceMap, 'mappings');\n var file = util.getArg(sourceMap, 'file', null);\n\n // Once again, Sass deviates from the spec and supplies the version as a\n // string rather than a number, so we use loose equality checking here.\n if (version != this._version) {\n throw new Error('Unsupported version: ' + version);\n }\n\n // Some source maps produce relative source paths like \"./foo.js\" instead of\n // \"foo.js\". Normalize these first so that future comparisons will succeed.\n // See bugzil.la/1090768.\n sources = sources.map(util.normalize);\n\n // Pass `true` below to allow duplicate names and sources. While source maps\n // are intended to be compressed and deduplicated, the TypeScript compiler\n // sometimes generates source maps with duplicates in them. See Github issue\n // #72 and bugzil.la/889492.\n this._names = ArraySet.fromArray(names, true);\n this._sources = ArraySet.fromArray(sources, true);\n\n this.sourceRoot = sourceRoot;\n this.sourcesContent = sourcesContent;\n this._mappings = mappings;\n this.file = file;\n }\n\n /**\n * Create a SourceMapConsumer from a SourceMapGenerator.\n *\n * @param SourceMapGenerator aSourceMap\n * The source map that will be consumed.\n * @returns SourceMapConsumer\n */\n SourceMapConsumer.fromSourceMap =\n function SourceMapConsumer_fromSourceMap(aSourceMap) {\n var smc = Object.create(SourceMapConsumer.prototype);\n\n smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\n smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\n smc.sourceRoot = aSourceMap._sourceRoot;\n smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\n smc.sourceRoot);\n smc.file = aSourceMap._file;\n\n smc.__generatedMappings = aSourceMap._mappings.toArray().slice();\n smc.__originalMappings = aSourceMap._mappings.toArray().slice()\n .sort(util.compareByOriginalPositions);\n\n return smc;\n };\n\n /**\n * The version of the source mapping spec that we are consuming.\n */\n SourceMapConsumer.prototype._version = 3;\n\n /**\n * The list of original sources.\n */\n Object.defineProperty(SourceMapConsumer.prototype, 'sources', {\n get: function () {\n return this._sources.toArray().map(function (s) {\n return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s;\n }, this);\n }\n });\n\n // `__generatedMappings` and `__originalMappings` are arrays that hold the\n // parsed mapping coordinates from the source map's \"mappings\" attribute. They\n // are lazily instantiated, accessed via the `_generatedMappings` and\n // `_originalMappings` getters respectively, and we only parse the mappings\n // and create these arrays once queried for a source location. We jump through\n // these hoops because there can be many thousands of mappings, and parsing\n // them is expensive, so we only want to do it if we must.\n //\n // Each object in the arrays is of the form:\n //\n // {\n // generatedLine: The line number in the generated code,\n // generatedColumn: The column number in the generated code,\n // source: The path to the original source file that generated this\n // chunk of code,\n // originalLine: The line number in the original source that\n // corresponds to this chunk of generated code,\n // originalColumn: The column number in the original source that\n // corresponds to this chunk of generated code,\n // name: The name of the original symbol which generated this chunk of\n // code.\n // }\n //\n // All properties except for `generatedLine` and `generatedColumn` can be\n // `null`.\n //\n // `_generatedMappings` is ordered by the generated positions.\n //\n // `_originalMappings` is ordered by the original positions.\n\n SourceMapConsumer.prototype.__generatedMappings = null;\n Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\n get: function () {\n if (!this.__generatedMappings) {\n this.__generatedMappings = [];\n this.__originalMappings = [];\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__generatedMappings;\n }\n });\n\n SourceMapConsumer.prototype.__originalMappings = null;\n Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\n get: function () {\n if (!this.__originalMappings) {\n this.__generatedMappings = [];\n this.__originalMappings = [];\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__originalMappings;\n }\n });\n\n SourceMapConsumer.prototype._nextCharIsMappingSeparator =\n function SourceMapConsumer_nextCharIsMappingSeparator(aStr) {\n var c = aStr.charAt(0);\n return c === \";\" || c === \",\";\n };\n\n /**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\n SourceMapConsumer.prototype._parseMappings =\n function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n var generatedLine = 1;\n var previousGeneratedColumn = 0;\n var previousOriginalLine = 0;\n var previousOriginalColumn = 0;\n var previousSource = 0;\n var previousName = 0;\n var str = aStr;\n var temp = {};\n var mapping;\n\n while (str.length > 0) {\n if (str.charAt(0) === ';') {\n generatedLine++;\n str = str.slice(1);\n previousGeneratedColumn = 0;\n }\n else if (str.charAt(0) === ',') {\n str = str.slice(1);\n }\n else {\n mapping = {};\n mapping.generatedLine = generatedLine;\n\n // Generated column.\n base64VLQ.decode(str, temp);\n mapping.generatedColumn = previousGeneratedColumn + temp.value;\n previousGeneratedColumn = mapping.generatedColumn;\n str = temp.rest;\n\n if (str.length > 0 && !this._nextCharIsMappingSeparator(str)) {\n // Original source.\n base64VLQ.decode(str, temp);\n mapping.source = this._sources.at(previousSource + temp.value);\n previousSource += temp.value;\n str = temp.rest;\n if (str.length === 0 || this._nextCharIsMappingSeparator(str)) {\n throw new Error('Found a source, but no line and column');\n }\n\n // Original line.\n base64VLQ.decode(str, temp);\n mapping.originalLine = previousOriginalLine + temp.value;\n previousOriginalLine = mapping.originalLine;\n // Lines are stored 0-based\n mapping.originalLine += 1;\n str = temp.rest;\n if (str.length === 0 || this._nextCharIsMappingSeparator(str)) {\n throw new Error('Found a source and line, but no column');\n }\n\n // Original column.\n base64VLQ.decode(str, temp);\n mapping.originalColumn = previousOriginalColumn + temp.value;\n previousOriginalColumn = mapping.originalColumn;\n str = temp.rest;\n\n if (str.length > 0 && !this._nextCharIsMappingSeparator(str)) {\n // Original name.\n base64VLQ.decode(str, temp);\n mapping.name = this._names.at(previousName + temp.value);\n previousName += temp.value;\n str = temp.rest;\n }\n }\n\n this.__generatedMappings.push(mapping);\n if (typeof mapping.originalLine === 'number') {\n this.__originalMappings.push(mapping);\n }\n }\n }\n\n this.__generatedMappings.sort(util.compareByGeneratedPositions);\n this.__originalMappings.sort(util.compareByOriginalPositions);\n };\n\n /**\n * Find the mapping that best matches the hypothetical \"needle\" mapping that\n * we are searching for in the given \"haystack\" of mappings.\n */\n SourceMapConsumer.prototype._findMapping =\n function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\n aColumnName, aComparator) {\n // To return the position we are searching for, we must first find the\n // mapping for the given position and then return the opposite position it\n // points to. Because the mappings are sorted, we can use binary search to\n // find the best mapping.\n\n if (aNeedle[aLineName] <= 0) {\n throw new TypeError('Line must be greater than or equal to 1, got '\n + aNeedle[aLineName]);\n }\n if (aNeedle[aColumnName] < 0) {\n throw new TypeError('Column must be greater than or equal to 0, got '\n + aNeedle[aColumnName]);\n }\n\n return binarySearch.search(aNeedle, aMappings, aComparator);\n };\n\n /**\n * Compute the last column for each generated mapping. The last column is\n * inclusive.\n */\n SourceMapConsumer.prototype.computeColumnSpans =\n function SourceMapConsumer_computeColumnSpans() {\n for (var index = 0; index < this._generatedMappings.length; ++index) {\n var mapping = this._generatedMappings[index];\n\n // Mappings do not contain a field for the last generated columnt. We\n // can come up with an optimistic estimate, however, by assuming that\n // mappings are contiguous (i.e. given two consecutive mappings, the\n // first mapping ends where the second one starts).\n if (index + 1 < this._generatedMappings.length) {\n var nextMapping = this._generatedMappings[index + 1];\n\n if (mapping.generatedLine === nextMapping.generatedLine) {\n mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\n continue;\n }\n }\n\n // The last mapping for each line spans the entire line.\n mapping.lastGeneratedColumn = Infinity;\n }\n };\n\n /**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n * - line: The line number in the generated source.\n * - column: The column number in the generated source.\n *\n * and an object is returned with the following properties:\n *\n * - source: The original source file, or null.\n * - line: The line number in the original source, or null.\n * - column: The column number in the original source, or null.\n * - name: The original identifier, or null.\n */\n SourceMapConsumer.prototype.originalPositionFor =\n function SourceMapConsumer_originalPositionFor(aArgs) {\n var needle = {\n generatedLine: util.getArg(aArgs, 'line'),\n generatedColumn: util.getArg(aArgs, 'column')\n };\n\n var index = this._findMapping(needle,\n this._generatedMappings,\n \"generatedLine\",\n \"generatedColumn\",\n util.compareByGeneratedPositions);\n\n if (index >= 0) {\n var mapping = this._generatedMappings[index];\n\n if (mapping.generatedLine === needle.generatedLine) {\n var source = util.getArg(mapping, 'source', null);\n if (source != null && this.sourceRoot != null) {\n source = util.join(this.sourceRoot, source);\n }\n return {\n source: source,\n line: util.getArg(mapping, 'originalLine', null),\n column: util.getArg(mapping, 'originalColumn', null),\n name: util.getArg(mapping, 'name', null)\n };\n }\n }\n\n return {\n source: null,\n line: null,\n column: null,\n name: null\n };\n };\n\n /**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * availible.\n */\n SourceMapConsumer.prototype.sourceContentFor =\n function SourceMapConsumer_sourceContentFor(aSource) {\n if (!this.sourcesContent) {\n return null;\n }\n\n if (this.sourceRoot != null) {\n aSource = util.relative(this.sourceRoot, aSource);\n }\n\n if (this._sources.has(aSource)) {\n return this.sourcesContent[this._sources.indexOf(aSource)];\n }\n\n var url;\n if (this.sourceRoot != null\n && (url = util.urlParse(this.sourceRoot))) {\n // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n // many users. We can help them out when they expect file:// URIs to\n // behave like it would if they were running a local HTTP server. See\n // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n var fileUriAbsPath = aSource.replace(/^file:\\/\\//, \"\");\n if (url.scheme == \"file\"\n && this._sources.has(fileUriAbsPath)) {\n return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\n }\n\n if ((!url.path || url.path == \"/\")\n && this._sources.has(\"/\" + aSource)) {\n return this.sourcesContent[this._sources.indexOf(\"/\" + aSource)];\n }\n }\n\n throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n };\n\n /**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source.\n * - column: The column number in the original source.\n *\n * and an object is returned with the following properties:\n *\n * - line: The line number in the generated source, or null.\n * - column: The column number in the generated source, or null.\n */\n SourceMapConsumer.prototype.generatedPositionFor =\n function SourceMapConsumer_generatedPositionFor(aArgs) {\n var needle = {\n source: util.getArg(aArgs, 'source'),\n originalLine: util.getArg(aArgs, 'line'),\n originalColumn: util.getArg(aArgs, 'column')\n };\n\n if (this.sourceRoot != null) {\n needle.source = util.relative(this.sourceRoot, needle.source);\n }\n\n var index = this._findMapping(needle,\n this._originalMappings,\n \"originalLine\",\n \"originalColumn\",\n util.compareByOriginalPositions);\n\n if (index >= 0) {\n var mapping = this._originalMappings[index];\n\n return {\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n };\n }\n\n return {\n line: null,\n column: null,\n lastColumn: null\n };\n };\n\n /**\n * Returns all generated line and column information for the original source\n * and line provided. The only argument is an object with the following\n * properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source.\n *\n * and an array of objects is returned, each with the following properties:\n *\n * - line: The line number in the generated source, or null.\n * - column: The column number in the generated source, or null.\n */\n SourceMapConsumer.prototype.allGeneratedPositionsFor =\n function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\n // When there is no exact match, SourceMapConsumer.prototype._findMapping\n // returns the index of the closest mapping less than the needle. By\n // setting needle.originalColumn to Infinity, we thus find the last\n // mapping for the given line, provided such a mapping exists.\n var needle = {\n source: util.getArg(aArgs, 'source'),\n originalLine: util.getArg(aArgs, 'line'),\n originalColumn: Infinity\n };\n\n if (this.sourceRoot != null) {\n needle.source = util.relative(this.sourceRoot, needle.source);\n }\n\n var mappings = [];\n\n var index = this._findMapping(needle,\n this._originalMappings,\n \"originalLine\",\n \"originalColumn\",\n util.compareByOriginalPositions);\n if (index >= 0) {\n var mapping = this._originalMappings[index];\n\n while (mapping && mapping.originalLine === needle.originalLine) {\n mappings.push({\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n });\n\n mapping = this._originalMappings[--index];\n }\n }\n\n return mappings.reverse();\n };\n\n SourceMapConsumer.GENERATED_ORDER = 1;\n SourceMapConsumer.ORIGINAL_ORDER = 2;\n\n /**\n * Iterate over each mapping between an original source/line/column and a\n * generated line/column in this source map.\n *\n * @param Function aCallback\n * The function that is called with each mapping.\n * @param Object aContext\n * Optional. If specified, this object will be the value of `this` every\n * time that `aCallback` is called.\n * @param aOrder\n * Either `SourceMapConsumer.GENERATED_ORDER` or\n * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n * iterate over the mappings sorted by the generated file's line/column\n * order or the original's source/line/column order, respectively. Defaults to\n * `SourceMapConsumer.GENERATED_ORDER`.\n */\n SourceMapConsumer.prototype.eachMapping =\n function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\n var context = aContext || null;\n var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\n var mappings;\n switch (order) {\n case SourceMapConsumer.GENERATED_ORDER:\n mappings = this._generatedMappings;\n break;\n case SourceMapConsumer.ORIGINAL_ORDER:\n mappings = this._originalMappings;\n break;\n default:\n throw new Error(\"Unknown order of iteration.\");\n }\n\n var sourceRoot = this.sourceRoot;\n mappings.map(function (mapping) {\n var source = mapping.source;\n if (source != null && sourceRoot != null) {\n source = util.join(sourceRoot, source);\n }\n return {\n source: source,\n generatedLine: mapping.generatedLine,\n generatedColumn: mapping.generatedColumn,\n originalLine: mapping.originalLine,\n originalColumn: mapping.originalColumn,\n name: mapping.name\n };\n }).forEach(aCallback, context);\n };\n\n exports.SourceMapConsumer = SourceMapConsumer;\n\n});\n\n},{\"./array-set\":32,\"./base64-vlq\":33,\"./binary-search\":35,\"./util\":40,\"amdefine\":21}],38:[function(require,module,exports){\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nif (typeof define !== 'function') {\n var define = require('amdefine')(module, require);\n}\ndefine(function (require, exports, module) {\n\n var base64VLQ = require('./base64-vlq');\n var util = require('./util');\n var ArraySet = require('./array-set').ArraySet;\n var MappingList = require('./mapping-list').MappingList;\n\n /**\n * An instance of the SourceMapGenerator represents a source map which is\n * being built incrementally. You may pass an object with the following\n * properties:\n *\n * - file: The filename of the generated source.\n * - sourceRoot: A root for all relative URLs in this source map.\n */\n function SourceMapGenerator(aArgs) {\n if (!aArgs) {\n aArgs = {};\n }\n this._file = util.getArg(aArgs, 'file', null);\n this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);\n this._skipValidation = util.getArg(aArgs, 'skipValidation', false);\n this._sources = new ArraySet();\n this._names = new ArraySet();\n this._mappings = new MappingList();\n this._sourcesContents = null;\n }\n\n SourceMapGenerator.prototype._version = 3;\n\n /**\n * Creates a new SourceMapGenerator based on a SourceMapConsumer\n *\n * @param aSourceMapConsumer The SourceMap.\n */\n SourceMapGenerator.fromSourceMap =\n function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {\n var sourceRoot = aSourceMapConsumer.sourceRoot;\n var generator = new SourceMapGenerator({\n file: aSourceMapConsumer.file,\n sourceRoot: sourceRoot\n });\n aSourceMapConsumer.eachMapping(function (mapping) {\n var newMapping = {\n generated: {\n line: mapping.generatedLine,\n column: mapping.generatedColumn\n }\n };\n\n if (mapping.source != null) {\n newMapping.source = mapping.source;\n if (sourceRoot != null) {\n newMapping.source = util.relative(sourceRoot, newMapping.source);\n }\n\n newMapping.original = {\n line: mapping.originalLine,\n column: mapping.originalColumn\n };\n\n if (mapping.name != null) {\n newMapping.name = mapping.name;\n }\n }\n\n generator.addMapping(newMapping);\n });\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n generator.setSourceContent(sourceFile, content);\n }\n });\n return generator;\n };\n\n /**\n * Add a single mapping from original source line and column to the generated\n * source's line and column for this source map being created. The mapping\n * object should have the following properties:\n *\n * - generated: An object with the generated line and column positions.\n * - original: An object with the original line and column positions.\n * - source: The original source file (relative to the sourceRoot).\n * - name: An optional original token name for this mapping.\n */\n SourceMapGenerator.prototype.addMapping =\n function SourceMapGenerator_addMapping(aArgs) {\n var generated = util.getArg(aArgs, 'generated');\n var original = util.getArg(aArgs, 'original', null);\n var source = util.getArg(aArgs, 'source', null);\n var name = util.getArg(aArgs, 'name', null);\n\n if (!this._skipValidation) {\n this._validateMapping(generated, original, source, name);\n }\n\n if (source != null && !this._sources.has(source)) {\n this._sources.add(source);\n }\n\n if (name != null && !this._names.has(name)) {\n this._names.add(name);\n }\n\n this._mappings.add({\n generatedLine: generated.line,\n generatedColumn: generated.column,\n originalLine: original != null && original.line,\n originalColumn: original != null && original.column,\n source: source,\n name: name\n });\n };\n\n /**\n * Set the source content for a source file.\n */\n SourceMapGenerator.prototype.setSourceContent =\n function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {\n var source = aSourceFile;\n if (this._sourceRoot != null) {\n source = util.relative(this._sourceRoot, source);\n }\n\n if (aSourceContent != null) {\n // Add the source content to the _sourcesContents map.\n // Create a new _sourcesContents map if the property is null.\n if (!this._sourcesContents) {\n this._sourcesContents = {};\n }\n this._sourcesContents[util.toSetString(source)] = aSourceContent;\n } else if (this._sourcesContents) {\n // Remove the source file from the _sourcesContents map.\n // If the _sourcesContents map is empty, set the property to null.\n delete this._sourcesContents[util.toSetString(source)];\n if (Object.keys(this._sourcesContents).length === 0) {\n this._sourcesContents = null;\n }\n }\n };\n\n /**\n * Applies the mappings of a sub-source-map for a specific source file to the\n * source map being generated. Each mapping to the supplied source file is\n * rewritten using the supplied source map. Note: The resolution for the\n * resulting mappings is the minimium of this map and the supplied map.\n *\n * @param aSourceMapConsumer The source map to be applied.\n * @param aSourceFile Optional. The filename of the source file.\n * If omitted, SourceMapConsumer's file property will be used.\n * @param aSourceMapPath Optional. The dirname of the path to the source map\n * to be applied. If relative, it is relative to the SourceMapConsumer.\n * This parameter is needed when the two source maps aren't in the same\n * directory, and the source map to be applied contains relative source\n * paths. If so, those relative source paths need to be rewritten\n * relative to the SourceMapGenerator.\n */\n SourceMapGenerator.prototype.applySourceMap =\n function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {\n var sourceFile = aSourceFile;\n // If aSourceFile is omitted, we will use the file property of the SourceMap\n if (aSourceFile == null) {\n if (aSourceMapConsumer.file == null) {\n throw new Error(\n 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +\n 'or the source map\\'s \"file\" property. Both were omitted.'\n );\n }\n sourceFile = aSourceMapConsumer.file;\n }\n var sourceRoot = this._sourceRoot;\n // Make \"sourceFile\" relative if an absolute Url is passed.\n if (sourceRoot != null) {\n sourceFile = util.relative(sourceRoot, sourceFile);\n }\n // Applying the SourceMap can add and remove items from the sources and\n // the names array.\n var newSources = new ArraySet();\n var newNames = new ArraySet();\n\n // Find mappings for the \"sourceFile\"\n this._mappings.unsortedForEach(function (mapping) {\n if (mapping.source === sourceFile && mapping.originalLine != null) {\n // Check if it can be mapped by the source map, then update the mapping.\n var original = aSourceMapConsumer.originalPositionFor({\n line: mapping.originalLine,\n column: mapping.originalColumn\n });\n if (original.source != null) {\n // Copy mapping\n mapping.source = original.source;\n if (aSourceMapPath != null) {\n mapping.source = util.join(aSourceMapPath, mapping.source)\n }\n if (sourceRoot != null) {\n mapping.source = util.relative(sourceRoot, mapping.source);\n }\n mapping.originalLine = original.line;\n mapping.originalColumn = original.column;\n if (original.name != null) {\n mapping.name = original.name;\n }\n }\n }\n\n var source = mapping.source;\n if (source != null && !newSources.has(source)) {\n newSources.add(source);\n }\n\n var name = mapping.name;\n if (name != null && !newNames.has(name)) {\n newNames.add(name);\n }\n\n }, this);\n this._sources = newSources;\n this._names = newNames;\n\n // Copy sourcesContents of applied map.\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n if (aSourceMapPath != null) {\n sourceFile = util.join(aSourceMapPath, sourceFile);\n }\n if (sourceRoot != null) {\n sourceFile = util.relative(sourceRoot, sourceFile);\n }\n this.setSourceContent(sourceFile, content);\n }\n }, this);\n };\n\n /**\n * A mapping can have one of the three levels of data:\n *\n * 1. Just the generated position.\n * 2. The Generated position, original position, and original source.\n * 3. Generated and original position, original source, as well as a name\n * token.\n *\n * To maintain consistency, we validate that any new mapping being added falls\n * in to one of these categories.\n */\n SourceMapGenerator.prototype._validateMapping =\n function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,\n aName) {\n if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n && aGenerated.line > 0 && aGenerated.column >= 0\n && !aOriginal && !aSource && !aName) {\n // Case 1.\n return;\n }\n else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n && aGenerated.line > 0 && aGenerated.column >= 0\n && aOriginal.line > 0 && aOriginal.column >= 0\n && aSource) {\n // Cases 2 and 3.\n return;\n }\n else {\n throw new Error('Invalid mapping: ' + JSON.stringify({\n generated: aGenerated,\n source: aSource,\n original: aOriginal,\n name: aName\n }));\n }\n };\n\n /**\n * Serialize the accumulated mappings in to the stream of base 64 VLQs\n * specified by the source map format.\n */\n SourceMapGenerator.prototype._serializeMappings =\n function SourceMapGenerator_serializeMappings() {\n var previousGeneratedColumn = 0;\n var previousGeneratedLine = 1;\n var previousOriginalColumn = 0;\n var previousOriginalLine = 0;\n var previousName = 0;\n var previousSource = 0;\n var result = '';\n var mapping;\n\n var mappings = this._mappings.toArray();\n\n for (var i = 0, len = mappings.length; i < len; i++) {\n mapping = mappings[i];\n\n if (mapping.generatedLine !== previousGeneratedLine) {\n previousGeneratedColumn = 0;\n while (mapping.generatedLine !== previousGeneratedLine) {\n result += ';';\n previousGeneratedLine++;\n }\n }\n else {\n if (i > 0) {\n if (!util.compareByGeneratedPositions(mapping, mappings[i - 1])) {\n continue;\n }\n result += ',';\n }\n }\n\n result += base64VLQ.encode(mapping.generatedColumn\n - previousGeneratedColumn);\n previousGeneratedColumn = mapping.generatedColumn;\n\n if (mapping.source != null) {\n result += base64VLQ.encode(this._sources.indexOf(mapping.source)\n - previousSource);\n previousSource = this._sources.indexOf(mapping.source);\n\n // lines are stored 0-based in SourceMap spec version 3\n result += base64VLQ.encode(mapping.originalLine - 1\n - previousOriginalLine);\n previousOriginalLine = mapping.originalLine - 1;\n\n result += base64VLQ.encode(mapping.originalColumn\n - previousOriginalColumn);\n previousOriginalColumn = mapping.originalColumn;\n\n if (mapping.name != null) {\n result += base64VLQ.encode(this._names.indexOf(mapping.name)\n - previousName);\n previousName = this._names.indexOf(mapping.name);\n }\n }\n }\n\n return result;\n };\n\n SourceMapGenerator.prototype._generateSourcesContent =\n function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n return aSources.map(function (source) {\n if (!this._sourcesContents) {\n return null;\n }\n if (aSourceRoot != null) {\n source = util.relative(aSourceRoot, source);\n }\n var key = util.toSetString(source);\n return Object.prototype.hasOwnProperty.call(this._sourcesContents,\n key)\n ? this._sourcesContents[key]\n : null;\n }, this);\n };\n\n /**\n * Externalize the source map.\n */\n SourceMapGenerator.prototype.toJSON =\n function SourceMapGenerator_toJSON() {\n var map = {\n version: this._version,\n sources: this._sources.toArray(),\n names: this._names.toArray(),\n mappings: this._serializeMappings()\n };\n if (this._file != null) {\n map.file = this._file;\n }\n if (this._sourceRoot != null) {\n map.sourceRoot = this._sourceRoot;\n }\n if (this._sourcesContents) {\n map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n }\n\n return map;\n };\n\n /**\n * Render the source map being generated to a string.\n */\n SourceMapGenerator.prototype.toString =\n function SourceMapGenerator_toString() {\n return JSON.stringify(this);\n };\n\n exports.SourceMapGenerator = SourceMapGenerator;\n\n});\n\n},{\"./array-set\":32,\"./base64-vlq\":33,\"./mapping-list\":36,\"./util\":40,\"amdefine\":21}],39:[function(require,module,exports){\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nif (typeof define !== 'function') {\n var define = require('amdefine')(module, require);\n}\ndefine(function (require, exports, module) {\n\n var SourceMapGenerator = require('./source-map-generator').SourceMapGenerator;\n var util = require('./util');\n\n // Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n // operating systems these days (capturing the result).\n var REGEX_NEWLINE = /(\\r?\\n)/;\n\n // Newline character code for charCodeAt() comparisons\n var NEWLINE_CODE = 10;\n\n // Private symbol for identifying `SourceNode`s when multiple versions of\n // the source-map library are loaded. This MUST NOT CHANGE across\n // versions!\n var isSourceNode = \"$$$isSourceNode$$$\";\n\n /**\n * SourceNodes provide a way to abstract over interpolating/concatenating\n * snippets of generated JavaScript source code while maintaining the line and\n * column information associated with the original source code.\n *\n * @param aLine The original line number.\n * @param aColumn The original column number.\n * @param aSource The original source's filename.\n * @param aChunks Optional. An array of strings which are snippets of\n * generated JS, or other SourceNodes.\n * @param aName The original identifier.\n */\n function SourceNode(aLine, aColumn, aSource, aChunks, aName) {\n this.children = [];\n this.sourceContents = {};\n this.line = aLine == null ? null : aLine;\n this.column = aColumn == null ? null : aColumn;\n this.source = aSource == null ? null : aSource;\n this.name = aName == null ? null : aName;\n this[isSourceNode] = true;\n if (aChunks != null) this.add(aChunks);\n }\n\n /**\n * Creates a SourceNode from generated code and a SourceMapConsumer.\n *\n * @param aGeneratedCode The generated code\n * @param aSourceMapConsumer The SourceMap for the generated code\n * @param aRelativePath Optional. The path that relative sources in the\n * SourceMapConsumer should be relative to.\n */\n SourceNode.fromStringWithSourceMap =\n function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n // The SourceNode we want to fill with the generated code\n // and the SourceMap\n var node = new SourceNode();\n\n // All even indices of this array are one line of the generated code,\n // while all odd indices are the newlines between two adjacent lines\n // (since `REGEX_NEWLINE` captures its match).\n // Processed fragments are removed from this array, by calling `shiftNextLine`.\n var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n var shiftNextLine = function() {\n var lineContents = remainingLines.shift();\n // The last line of a file might not have a newline.\n var newLine = remainingLines.shift() || \"\";\n return lineContents + newLine;\n };\n\n // We need to remember the position of \"remainingLines\"\n var lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\n // The generate SourceNodes we need a code range.\n // To extract it current and last mapping is used.\n // Here we store the last mapping.\n var lastMapping = null;\n\n aSourceMapConsumer.eachMapping(function (mapping) {\n if (lastMapping !== null) {\n // We add the code from \"lastMapping\" to \"mapping\":\n // First check if there is a new line in between.\n if (lastGeneratedLine < mapping.generatedLine) {\n var code = \"\";\n // Associate first line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n lastGeneratedLine++;\n lastGeneratedColumn = 0;\n // The remaining code is added without mapping\n } else {\n // There is no new line in between.\n // Associate the code between \"lastGeneratedColumn\" and\n // \"mapping.generatedColumn\" with \"lastMapping\"\n var nextLine = remainingLines[0];\n var code = nextLine.substr(0, mapping.generatedColumn -\n lastGeneratedColumn);\n remainingLines[0] = nextLine.substr(mapping.generatedColumn -\n lastGeneratedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n addMappingWithCode(lastMapping, code);\n // No more remaining code, continue\n lastMapping = mapping;\n return;\n }\n }\n // We add the generated code until the first mapping\n // to the SourceNode without any mapping.\n // Each line is added as separate string.\n while (lastGeneratedLine < mapping.generatedLine) {\n node.add(shiftNextLine());\n lastGeneratedLine++;\n }\n if (lastGeneratedColumn < mapping.generatedColumn) {\n var nextLine = remainingLines[0];\n node.add(nextLine.substr(0, mapping.generatedColumn));\n remainingLines[0] = nextLine.substr(mapping.generatedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n }\n lastMapping = mapping;\n }, this);\n // We have processed all mappings.\n if (remainingLines.length > 0) {\n if (lastMapping) {\n // Associate the remaining code in the current line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n }\n // and add the remaining lines without any mapping\n node.add(remainingLines.join(\"\"));\n }\n\n // Copy sourcesContent into SourceNode\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n if (aRelativePath != null) {\n sourceFile = util.join(aRelativePath, sourceFile);\n }\n node.setSourceContent(sourceFile, content);\n }\n });\n\n return node;\n\n function addMappingWithCode(mapping, code) {\n if (mapping === null || mapping.source === undefined) {\n node.add(code);\n } else {\n var source = aRelativePath\n ? util.join(aRelativePath, mapping.source)\n : mapping.source;\n node.add(new SourceNode(mapping.originalLine,\n mapping.originalColumn,\n source,\n code,\n mapping.name));\n }\n }\n };\n\n /**\n * Add a chunk of generated JS to this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\n SourceNode.prototype.add = function SourceNode_add(aChunk) {\n if (Array.isArray(aChunk)) {\n aChunk.forEach(function (chunk) {\n this.add(chunk);\n }, this);\n }\n else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n if (aChunk) {\n this.children.push(aChunk);\n }\n }\n else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n };\n\n /**\n * Add a chunk of generated JS to the beginning of this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\n SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\n if (Array.isArray(aChunk)) {\n for (var i = aChunk.length-1; i >= 0; i--) {\n this.prepend(aChunk[i]);\n }\n }\n else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n this.children.unshift(aChunk);\n }\n else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n };\n\n /**\n * Walk over the tree of JS snippets in this node and its children. The\n * walking function is called once for each snippet of JS and is passed that\n * snippet and the its original associated source's line/column location.\n *\n * @param aFn The traversal function.\n */\n SourceNode.prototype.walk = function SourceNode_walk(aFn) {\n var chunk;\n for (var i = 0, len = this.children.length; i < len; i++) {\n chunk = this.children[i];\n if (chunk[isSourceNode]) {\n chunk.walk(aFn);\n }\n else {\n if (chunk !== '') {\n aFn(chunk, { source: this.source,\n line: this.line,\n column: this.column,\n name: this.name });\n }\n }\n }\n };\n\n /**\n * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n * each of `this.children`.\n *\n * @param aSep The separator.\n */\n SourceNode.prototype.join = function SourceNode_join(aSep) {\n var newChildren;\n var i;\n var len = this.children.length;\n if (len > 0) {\n newChildren = [];\n for (i = 0; i < len-1; i++) {\n newChildren.push(this.children[i]);\n newChildren.push(aSep);\n }\n newChildren.push(this.children[i]);\n this.children = newChildren;\n }\n return this;\n };\n\n /**\n * Call String.prototype.replace on the very right-most source snippet. Useful\n * for trimming whitespace from the end of a source node, etc.\n *\n * @param aPattern The pattern to replace.\n * @param aReplacement The thing to replace the pattern with.\n */\n SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\n var lastChild = this.children[this.children.length - 1];\n if (lastChild[isSourceNode]) {\n lastChild.replaceRight(aPattern, aReplacement);\n }\n else if (typeof lastChild === 'string') {\n this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n }\n else {\n this.children.push(''.replace(aPattern, aReplacement));\n }\n return this;\n };\n\n /**\n * Set the source content for a source file. This will be added to the SourceMapGenerator\n * in the sourcesContent field.\n *\n * @param aSourceFile The filename of the source file\n * @param aSourceContent The content of the source file\n */\n SourceNode.prototype.setSourceContent =\n function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\n this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n };\n\n /**\n * Walk over the tree of SourceNodes. The walking function is called for each\n * source file content and is passed the filename and source content.\n *\n * @param aFn The traversal function.\n */\n SourceNode.prototype.walkSourceContents =\n function SourceNode_walkSourceContents(aFn) {\n for (var i = 0, len = this.children.length; i < len; i++) {\n if (this.children[i][isSourceNode]) {\n this.children[i].walkSourceContents(aFn);\n }\n }\n\n var sources = Object.keys(this.sourceContents);\n for (var i = 0, len = sources.length; i < len; i++) {\n aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n }\n };\n\n /**\n * Return the string representation of this source node. Walks over the tree\n * and concatenates all the various snippets together to one string.\n */\n SourceNode.prototype.toString = function SourceNode_toString() {\n var str = \"\";\n this.walk(function (chunk) {\n str += chunk;\n });\n return str;\n };\n\n /**\n * Returns the string representation of this source node along with a source\n * map.\n */\n SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\n var generated = {\n code: \"\",\n line: 1,\n column: 0\n };\n var map = new SourceMapGenerator(aArgs);\n var sourceMappingActive = false;\n var lastOriginalSource = null;\n var lastOriginalLine = null;\n var lastOriginalColumn = null;\n var lastOriginalName = null;\n this.walk(function (chunk, original) {\n generated.code += chunk;\n if (original.source !== null\n && original.line !== null\n && original.column !== null) {\n if(lastOriginalSource !== original.source\n || lastOriginalLine !== original.line\n || lastOriginalColumn !== original.column\n || lastOriginalName !== original.name) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n lastOriginalSource = original.source;\n lastOriginalLine = original.line;\n lastOriginalColumn = original.column;\n lastOriginalName = original.name;\n sourceMappingActive = true;\n } else if (sourceMappingActive) {\n map.addMapping({\n generated: {\n line: generated.line,\n column: generated.column\n }\n });\n lastOriginalSource = null;\n sourceMappingActive = false;\n }\n for (var idx = 0, length = chunk.length; idx < length; idx++) {\n if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n generated.line++;\n generated.column = 0;\n // Mappings end at eol\n if (idx + 1 === length) {\n lastOriginalSource = null;\n sourceMappingActive = false;\n } else if (sourceMappingActive) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n } else {\n generated.column++;\n }\n }\n });\n this.walkSourceContents(function (sourceFile, sourceContent) {\n map.setSourceContent(sourceFile, sourceContent);\n });\n\n return { code: generated.code, map: map };\n };\n\n exports.SourceNode = SourceNode;\n\n});\n\n},{\"./source-map-generator\":38,\"./util\":40,\"amdefine\":21}],40:[function(require,module,exports){\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nif (typeof define !== 'function') {\n var define = require('amdefine')(module, require);\n}\ndefine(function (require, exports, module) {\n\n /**\n * This is a helper function for getting values from parameter/options\n * objects.\n *\n * @param args The object we are extracting values from\n * @param name The name of the property we are getting.\n * @param defaultValue An optional value to return if the property is missing\n * from the object. If this is not specified and the property is missing, an\n * error will be thrown.\n */\n function getArg(aArgs, aName, aDefaultValue) {\n if (aName in aArgs) {\n return aArgs[aName];\n } else if (arguments.length === 3) {\n return aDefaultValue;\n } else {\n throw new Error('\"' + aName + '\" is a required argument.');\n }\n }\n exports.getArg = getArg;\n\n var urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.]*)(?::(\\d+))?(\\S*)$/;\n var dataUrlRegexp = /^data:.+\\,.+$/;\n\n function urlParse(aUrl) {\n var match = aUrl.match(urlRegexp);\n if (!match) {\n return null;\n }\n return {\n scheme: match[1],\n auth: match[2],\n host: match[3],\n port: match[4],\n path: match[5]\n };\n }\n exports.urlParse = urlParse;\n\n function urlGenerate(aParsedUrl) {\n var url = '';\n if (aParsedUrl.scheme) {\n url += aParsedUrl.scheme + ':';\n }\n url += '//';\n if (aParsedUrl.auth) {\n url += aParsedUrl.auth + '@';\n }\n if (aParsedUrl.host) {\n url += aParsedUrl.host;\n }\n if (aParsedUrl.port) {\n url += \":\" + aParsedUrl.port\n }\n if (aParsedUrl.path) {\n url += aParsedUrl.path;\n }\n return url;\n }\n exports.urlGenerate = urlGenerate;\n\n /**\n * Normalizes a path, or the path portion of a URL:\n *\n * - Replaces consequtive slashes with one slash.\n * - Removes unnecessary '.' parts.\n * - Removes unnecessary '/..' parts.\n *\n * Based on code in the Node.js 'path' core module.\n *\n * @param aPath The path or url to normalize.\n */\n function normalize(aPath) {\n var path = aPath;\n var url = urlParse(aPath);\n if (url) {\n if (!url.path) {\n return aPath;\n }\n path = url.path;\n }\n var isAbsolute = (path.charAt(0) === '/');\n\n var parts = path.split(/\\/+/);\n for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n part = parts[i];\n if (part === '.') {\n parts.splice(i, 1);\n } else if (part === '..') {\n up++;\n } else if (up > 0) {\n if (part === '') {\n // The first part is blank if the path is absolute. Trying to go\n // above the root is a no-op. Therefore we can remove all '..' parts\n // directly after the root.\n parts.splice(i + 1, up);\n up = 0;\n } else {\n parts.splice(i, 2);\n up--;\n }\n }\n }\n path = parts.join('/');\n\n if (path === '') {\n path = isAbsolute ? '/' : '.';\n }\n\n if (url) {\n url.path = path;\n return urlGenerate(url);\n }\n return path;\n }\n exports.normalize = normalize;\n\n /**\n * Joins two paths/URLs.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be joined with the root.\n *\n * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n * scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n * first.\n * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n * is updated with the result and aRoot is returned. Otherwise the result\n * is returned.\n * - If aPath is absolute, the result is aPath.\n * - Otherwise the two paths are joined with a slash.\n * - Joining for example 'http://' and 'www.example.com' is also supported.\n */\n function join(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n if (aPath === \"\") {\n aPath = \".\";\n }\n var aPathUrl = urlParse(aPath);\n var aRootUrl = urlParse(aRoot);\n if (aRootUrl) {\n aRoot = aRootUrl.path || '/';\n }\n\n // `join(foo, '//www.example.org')`\n if (aPathUrl && !aPathUrl.scheme) {\n if (aRootUrl) {\n aPathUrl.scheme = aRootUrl.scheme;\n }\n return urlGenerate(aPathUrl);\n }\n\n if (aPathUrl || aPath.match(dataUrlRegexp)) {\n return aPath;\n }\n\n // `join('http://', 'www.example.com')`\n if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n aRootUrl.host = aPath;\n return urlGenerate(aRootUrl);\n }\n\n var joined = aPath.charAt(0) === '/'\n ? aPath\n : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\n if (aRootUrl) {\n aRootUrl.path = joined;\n return urlGenerate(aRootUrl);\n }\n return joined;\n }\n exports.join = join;\n\n /**\n * Make a path relative to a URL or another path.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be made relative to aRoot.\n */\n function relative(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n\n aRoot = aRoot.replace(/\\/$/, '');\n\n // XXX: It is possible to remove this block, and the tests still pass!\n var url = urlParse(aRoot);\n if (aPath.charAt(0) == \"/\" && url && url.path == \"/\") {\n return aPath.slice(1);\n }\n\n return aPath.indexOf(aRoot + '/') === 0\n ? aPath.substr(aRoot.length + 1)\n : aPath;\n }\n exports.relative = relative;\n\n /**\n * Because behavior goes wacky when you set `__proto__` on objects, we\n * have to prefix all the strings in our set with an arbitrary character.\n *\n * See https://github.com/mozilla/source-map/pull/31 and\n * https://github.com/mozilla/source-map/issues/30\n *\n * @param String aStr\n */\n function toSetString(aStr) {\n return '$' + aStr;\n }\n exports.toSetString = toSetString;\n\n function fromSetString(aStr) {\n return aStr.substr(1);\n }\n exports.fromSetString = fromSetString;\n\n function strcmp(aStr1, aStr2) {\n var s1 = aStr1 || \"\";\n var s2 = aStr2 || \"\";\n return (s1 > s2) - (s1 < s2);\n }\n\n /**\n * Comparator between two mappings where the original positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same original source/line/column, but different generated\n * line and column the same. Useful when searching for a mapping with a\n * stubbed out mapping.\n */\n function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n var cmp;\n\n cmp = strcmp(mappingA.source, mappingB.source);\n if (cmp) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp || onlyCompareOriginal) {\n return cmp;\n }\n\n cmp = strcmp(mappingA.name, mappingB.name);\n if (cmp) {\n return cmp;\n }\n\n cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp) {\n return cmp;\n }\n\n return mappingA.generatedColumn - mappingB.generatedColumn;\n };\n exports.compareByOriginalPositions = compareByOriginalPositions;\n\n /**\n * Comparator between two mappings where the generated positions are\n * compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same generated line and column, but different\n * source/name/original line and column the same. Useful when searching for a\n * mapping with a stubbed out mapping.\n */\n function compareByGeneratedPositions(mappingA, mappingB, onlyCompareGenerated) {\n var cmp;\n\n cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp || onlyCompareGenerated) {\n return cmp;\n }\n\n cmp = strcmp(mappingA.source, mappingB.source);\n if (cmp) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp) {\n return cmp;\n }\n\n return strcmp(mappingA.name, mappingB.name);\n };\n exports.compareByGeneratedPositions = compareByGeneratedPositions;\n\n});\n\n},{\"amdefine\":21}],41:[function(require,module,exports){\n\nexports = module.exports = trim;\n\nfunction trim(str){\n return str.replace(/^\\s*|\\s*$/g, '');\n}\n\nexports.left = function(str){\n return str.replace(/^\\s*/, '');\n};\n\nexports.right = function(str){\n return str.replace(/\\s*$/, '');\n};\n\n},{}],42:[function(require,module,exports){\n\"use strict\";\nvar window = require(\"global/window\")\nvar isFunction = require(\"is-function\")\nvar parseHeaders = require(\"parse-headers\")\nvar xtend = require(\"xtend\")\n\nmodule.exports = createXHR\ncreateXHR.XMLHttpRequest = window.XMLHttpRequest || noop\ncreateXHR.XDomainRequest = \"withCredentials\" in (new createXHR.XMLHttpRequest()) ? createXHR.XMLHttpRequest : window.XDomainRequest\n\nforEachArray([\"get\", \"put\", \"post\", \"patch\", \"head\", \"delete\"], function(method) {\n createXHR[method === \"delete\" ? \"del\" : method] = function(uri, options, callback) {\n options = initParams(uri, options, callback)\n options.method = method.toUpperCase()\n return _createXHR(options)\n }\n})\n\nfunction forEachArray(array, iterator) {\n for (var i = 0; i < array.length; i++) {\n iterator(array[i])\n }\n}\n\nfunction isEmpty(obj){\n for(var i in obj){\n if(obj.hasOwnProperty(i)) return false\n }\n return true\n}\n\nfunction initParams(uri, options, callback) {\n var params = uri\n\n if (isFunction(options)) {\n callback = options\n if (typeof uri === \"string\") {\n params = {uri:uri}\n }\n } else {\n params = xtend(options, {uri: uri})\n }\n\n params.callback = callback\n return params\n}\n\nfunction createXHR(uri, options, callback) {\n options = initParams(uri, options, callback)\n return _createXHR(options)\n}\n\nfunction _createXHR(options) {\n if(typeof options.callback === \"undefined\"){\n throw new Error(\"callback argument missing\")\n }\n\n var called = false\n var callback = function cbOnce(err, response, body){\n if(!called){\n called = true\n options.callback(err, response, body)\n }\n }\n\n function readystatechange() {\n if (xhr.readyState === 4) {\n setTimeout(loadFunc, 0)\n }\n }\n\n function getBody() {\n // Chrome with requestType=blob throws errors arround when even testing access to responseText\n var body = undefined\n\n if (xhr.response) {\n body = xhr.response\n } else {\n body = xhr.responseText || getXml(xhr)\n }\n\n if (isJson) {\n try {\n body = JSON.parse(body)\n } catch (e) {}\n }\n\n return body\n }\n\n function errorFunc(evt) {\n clearTimeout(timeoutTimer)\n if(!(evt instanceof Error)){\n evt = new Error(\"\" + (evt || \"Unknown XMLHttpRequest Error\") )\n }\n evt.statusCode = 0\n return callback(evt, failureResponse)\n }\n\n // will load the data & process the response in a special response object\n function loadFunc() {\n if (aborted) return\n var status\n clearTimeout(timeoutTimer)\n if(options.useXDR && xhr.status===undefined) {\n //IE8 CORS GET successful response doesn't have a status field, but body is fine\n status = 200\n } else {\n status = (xhr.status === 1223 ? 204 : xhr.status)\n }\n var response = failureResponse\n var err = null\n\n if (status !== 0){\n response = {\n body: getBody(),\n statusCode: status,\n method: method,\n headers: {},\n url: uri,\n rawRequest: xhr\n }\n if(xhr.getAllResponseHeaders){ //remember xhr can in fact be XDR for CORS in IE\n response.headers = parseHeaders(xhr.getAllResponseHeaders())\n }\n } else {\n err = new Error(\"Internal XMLHttpRequest Error\")\n }\n return callback(err, response, response.body)\n }\n\n var xhr = options.xhr || null\n\n if (!xhr) {\n if (options.cors || options.useXDR) {\n xhr = new createXHR.XDomainRequest()\n }else{\n xhr = new createXHR.XMLHttpRequest()\n }\n }\n\n var key\n var aborted\n var uri = xhr.url = options.uri || options.url\n var method = xhr.method = options.method || \"GET\"\n var body = options.body || options.data\n var headers = xhr.headers = options.headers || {}\n var sync = !!options.sync\n var isJson = false\n var timeoutTimer\n var failureResponse = {\n body: undefined,\n headers: {},\n statusCode: 0,\n method: method,\n url: uri,\n rawRequest: xhr\n }\n\n if (\"json\" in options && options.json !== false) {\n isJson = true\n headers[\"accept\"] || headers[\"Accept\"] || (headers[\"Accept\"] = \"application/json\") //Don't override existing accept header declared by user\n if (method !== \"GET\" && method !== \"HEAD\") {\n headers[\"content-type\"] || headers[\"Content-Type\"] || (headers[\"Content-Type\"] = \"application/json\") //Don't override existing accept header declared by user\n body = JSON.stringify(options.json === true ? body : options.json)\n }\n }\n\n xhr.onreadystatechange = readystatechange\n xhr.onload = loadFunc\n xhr.onerror = errorFunc\n // IE9 must have onprogress be set to a unique function.\n xhr.onprogress = function () {\n // IE must die\n }\n xhr.onabort = function(){\n aborted = true;\n }\n xhr.ontimeout = errorFunc\n xhr.open(method, uri, !sync, options.username, options.password)\n //has to be after open\n if(!sync) {\n xhr.withCredentials = !!options.withCredentials\n }\n // Cannot set timeout with sync request\n // not setting timeout on the xhr object, because of old webkits etc. not handling that correctly\n // both npm's request and jquery 1.x use this kind of timeout, so this is being consistent\n if (!sync && options.timeout > 0 ) {\n timeoutTimer = setTimeout(function(){\n if (aborted) return\n aborted = true//IE9 may still call readystatechange\n xhr.abort(\"timeout\")\n var e = new Error(\"XMLHttpRequest timeout\")\n e.code = \"ETIMEDOUT\"\n errorFunc(e)\n }, options.timeout )\n }\n\n if (xhr.setRequestHeader) {\n for(key in headers){\n if(headers.hasOwnProperty(key)){\n xhr.setRequestHeader(key, headers[key])\n }\n }\n } else if (options.headers && !isEmpty(options.headers)) {\n throw new Error(\"Headers cannot be set on an XDomainRequest object\")\n }\n\n if (\"responseType\" in options) {\n xhr.responseType = options.responseType\n }\n\n if (\"beforeSend\" in options &&\n typeof options.beforeSend === \"function\"\n ) {\n options.beforeSend(xhr)\n }\n\n // Microsoft Edge browser sends \"undefined\" when send is called with undefined value.\n // XMLHttpRequest spec says to pass null as body to indicate no body\n // See https://github.com/naugtur/xhr/issues/100.\n xhr.send(body || null)\n\n return xhr\n\n\n}\n\nfunction getXml(xhr) {\n // xhr.responseXML will throw Exception \"InvalidStateError\" or \"DOMException\"\n // See https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseXML.\n try {\n if (xhr.responseType === \"document\") {\n return xhr.responseXML\n }\n var firefoxBugTakenEffect = xhr.responseXML && xhr.responseXML.documentElement.nodeName === \"parsererror\"\n if (xhr.responseType === \"\" && !firefoxBugTakenEffect) {\n return xhr.responseXML\n }\n } catch (e) {}\n\n return null\n}\n\nfunction noop() {}\n\n},{\"global/window\":26,\"is-function\":28,\"parse-headers\":29,\"xtend\":43}],43:[function(require,module,exports){\nmodule.exports = extend\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction extend() {\n var target = {}\n\n for (var i = 0; i < arguments.length; i++) {\n var source = arguments[i]\n\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n target[key] = source[key]\n }\n }\n }\n\n return target\n}\n\n},{}],44:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n//Import helpers\n\nvar _helpers = require('./helpers');\n\n//Import partials\n\nvar _partials_list = require('./partials/_list');\n\nvar _partials_list2 = _interopRequireDefault(_partials_list);\n\nvar Handlebars = require('Handlebars');\n(0, _helpers.ifEquals)();\n(0, _partials_list2['default'])();\n\nexports['default'] = Handlebars;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2NoYXJpdHktZXZlbnRzLWJvYXJkL2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL0hhbmRsZWJhcnMvaGFuZGxlYmFycy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7Ozs7Ozs7Ozs7dUJBS1ksV0FBVzs7Ozs2QkFJbEIsa0JBQWtCOzs7O0FBUHBDLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUl2Qyx3QkFBVSxDQUFDO0FBSVgsaUNBQU8sQ0FBQzs7cUJBRU8sVUFBVSIsImZpbGUiOiJDOi90ZW1wL0dHLkZyb250RW5kLldpZGdldHMvd2lkZ2V0cy9jaGFyaXR5LWV2ZW50cy1ib2FyZC9ib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9IYW5kbGViYXJzL2hhbmRsZWJhcnMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XHJcblxyXG5sZXQgSGFuZGxlYmFycyA9IHJlcXVpcmUoJ0hhbmRsZWJhcnMnKTtcclxuXHJcbi8vSW1wb3J0IGhlbHBlcnNcclxuaW1wb3J0IHsgaWZFcXVhbHMgfSBmcm9tICcuL2hlbHBlcnMnO1xyXG5pZkVxdWFscygpO1xyXG5cclxuLy9JbXBvcnQgcGFydGlhbHNcclxuaW1wb3J0IF9saXN0IGZyb20gJy4vcGFydGlhbHMvX2xpc3QnO1xyXG5fbGlzdCgpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgSGFuZGxlYmFyczsiXX0=\n},{\"./helpers\":45,\"./partials/_list\":46,\"Handlebars\":20}],45:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n\tvalue: true\n});\nexports.ifEquals = ifEquals;\nvar Handlebars = require('Handlebars');\n\n/**\r\n * Strict comparison helper for use in Handlebars templates\r\n * @param {String} First condition to compare\r\n * @param {String} Second condition to compare\r\n * @return {Boolean} Whether conditions are equal\r\n */\n\nfunction ifEquals() {\n\tHandlebars.registerHelper('ifEquals', function (v1, v2, options) {\n\t\tif (v1 === v2) {\n\t\t\treturn options.fn(this);\n\t\t}\n\t\treturn options.inverse(this);\n\t});\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2NoYXJpdHktZXZlbnRzLWJvYXJkL2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL0hhbmRsZWJhcnMvaGVscGVycy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7Ozs7OztBQUViLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQzs7Ozs7Ozs7O0FBUWhDLFNBQVMsUUFBUSxHQUFJO0FBQzNCLFdBQVUsQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUc7QUFDaEUsTUFBSSxFQUFFLEtBQUssRUFBRSxFQUFHO0FBQ2QsVUFBTyxPQUFPLENBQUMsRUFBRSxDQUFFLElBQUksQ0FBRSxDQUFDO0dBQzNCO0FBQ0QsU0FBTyxPQUFPLENBQUMsT0FBTyxDQUFFLElBQUksQ0FBRSxDQUFDO0VBQ2hDLENBQUMsQ0FBQztDQUNIIiwiZmlsZSI6IkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2NoYXJpdHktZXZlbnRzLWJvYXJkL2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL0hhbmRsZWJhcnMvaGVscGVycy5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcclxuXHJcbmxldCBIYW5kbGViYXJzID0gcmVxdWlyZSgnSGFuZGxlYmFycycpO1xyXG5cclxuLyoqXHJcbiAqIFN0cmljdCBjb21wYXJpc29uIGhlbHBlciBmb3IgdXNlIGluIEhhbmRsZWJhcnMgdGVtcGxhdGVzXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBGaXJzdCBjb25kaXRpb24gdG8gY29tcGFyZVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gU2Vjb25kIGNvbmRpdGlvbiB0byBjb21wYXJlXHJcbiAqIEByZXR1cm4ge0Jvb2xlYW59IFdoZXRoZXIgY29uZGl0aW9ucyBhcmUgZXF1YWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpZkVxdWFscyAoKSB7XHJcblx0SGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignaWZFcXVhbHMnLCBmdW5jdGlvbiggdjEsIHYyLCBvcHRpb25zICkge1xyXG5cdCAgaWYoIHYxID09PSB2MiApIHtcclxuXHQgICAgcmV0dXJuIG9wdGlvbnMuZm4oIHRoaXMgKTtcclxuXHQgIH1cclxuXHQgIHJldHVybiBvcHRpb25zLmludmVyc2UoIHRoaXMgKTtcclxuXHR9KTtcdFxyXG59IFxyXG4iXX0=\n},{\"Handlebars\":20}],46:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n\tvalue: true\n});\nexports['default'] = _list;\nvar Handlebars = require('Handlebars');\n\nfunction _list() {\n\tHandlebars.registerPartial('list', '{{#ifEquals hasCarousel \\'true\\'}}\\t\\n \\t\\t
\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t
\\n\\t\\t\\t\\t\\t
    \\n\\t\\t\\t\\t
    \\n\\t\\t\\t\\t\\n\\t\\t\\t
    \\n\\t\\t{{/ifEquals}}\\n\\t\\t
      ');\n}\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2NoYXJpdHktZXZlbnRzLWJvYXJkL2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL0hhbmRsZWJhcnMvcGFydGlhbHMvX2xpc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOzs7OztxQkFJVyxLQUFLO0FBRjdCLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQzs7QUFFeEIsU0FBUyxLQUFLLEdBQUk7QUFDaEMsV0FBVSxDQUFDLGVBQWUsQ0FBQyxNQUFNLGttQ0FxQmhDLENBQUM7Q0FDRiIsImZpbGUiOiJDOi90ZW1wL0dHLkZyb250RW5kLldpZGdldHMvd2lkZ2V0cy9jaGFyaXR5LWV2ZW50cy1ib2FyZC9ib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9IYW5kbGViYXJzL3BhcnRpYWxzL19saXN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xyXG5cclxubGV0IEhhbmRsZWJhcnMgPSByZXF1aXJlKCdIYW5kbGViYXJzJyk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfbGlzdCAoKSB7XHJcblx0SGFuZGxlYmFycy5yZWdpc3RlclBhcnRpYWwoJ2xpc3QnLFxyXG4gICAgXHRge3sjaWZFcXVhbHMgaGFzQ2Fyb3VzZWwgJ3RydWUnfX1cdFxyXG4gICAgXHRcdDxkaXYgY2xhc3M9XCJjYXJvdXNlbC1zdGFja2VkXCIgZGF0YS1jYXJvdXNlbD1cInt7dmlld05hbWV9fVwiPlxyXG5cdFx0XHRcdDxidXR0b24gY2xhc3M9XCJidG4taWNvbi1sIGNvbnRyb2wtcHJldlwiIGRhdGEtY29udHJvbC1wcmV2IGRhdGEtYW5hbHl0aWNzLWV2ZW50PVwiR2V0IHByZXZpb3VzIHBhZ2VcIiBkYXRhLWFuYWx5dGljcy1zdWJ0eXBlPVwiYnV0dG9uXCI+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImhpZGVWaXN1YWxseVwiPlByZXZpb3VzIHBhZ2U8L3NwYW4+XHJcblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImJ0bi1pY29uLWNvbnRlbnRcIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJzcHJpdGUtY2hldnJvbi11cC1sXCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdDwvYnV0dG9uPlxyXG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjYXJvdXNlbC1hcGVydHVyZVwiIGRhdGEtY2Fyb3VzZWwtYXBlcnR1cmU+XHJcblx0XHRcdFx0XHQ8dWwgY2xhc3M9XCJsaXN0LXN0YWNrZWQtZGl2aWRlclwiIGRhdGEtY2Fyb3VzZWwtbGlzdCBkYXRhLXZpZXcte3t2aWV3TmFtZX19LWxpc3Q+PC91bD5cclxuXHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHQ8YnV0dG9uIGNsYXNzPVwiYnRuLXRlcnRpYXJ5IGJ0bi10ZXh0LW0gY29udHJvbC1uZXh0XCIgZGF0YS1jb250cm9sLW5leHQgZGF0YS1hbmFseXRpY3MtZXZlbnQ9XCJHZXQgbmV4dCBwYWdlXCIgZGF0YS1hbmFseXRpY3Mtc3VidHlwZT1cImJ1dHRvblwiPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJidG4tdGV4dC1jb250ZW50XCI+U2hvdyBtb3JlPC9zcGFuPlxyXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJwcm9ncmVzcy1zcGlubmVyXCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaGlkZVZpc3VhbGx5XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+UGxlYXNlIHdhaXQgYSBtb21lbnQsIGRhdGEgaXMgbG9hZGluZzwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHQ8L2J1dHRvbj5cclxuXHRcdFx0PC9kaXY+XHJcblx0XHR7ey9pZkVxdWFsc319XHJcblx0XHQ8dWwgY2xhc3M9XCJsaXN0LXN0YWNrZWQtZGl2aWRlclwiIGRhdGEtdmlldy17e3ZpZXdOYW1lfX0tbGlzdD48L3VsPmBcclxuXHQpO1xyXG59Il19\n},{\"Handlebars\":20}],47:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n\tvalue: true\n});\n\nvar _createClass = (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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _jsDOMGetVendorProperty = require('../js/DOM/getVendorProperty');\n\nvar _jsDOMGetVendorProperty2 = _interopRequireDefault(_jsDOMGetVendorProperty);\n\n/**\r\n * Add a carousel to a list view\r\n * @classdesc Add a carousel for pagination of card list views\r\n * @param {Object} options\r\n * @param {Object} options.view. The view that the carousel paginates [required]\r\n * @param {Object} options.widget. The widget instance [required]\r\n * @param {Number} options.pageSize. The number of list items to show in each carousel page\r\n * @param {Boolean} options.isInfinite. Whether the collection displayed is paginated on the REST API\r\n * @param {Number} options.nextPageBuffer. Number of carousel pages before the last at which to fetch next API page.\r\n * @param {String} options.el. The carousel parent element\r\n * @class Set carousel instance properties; cache aperture, control and list elements; set current page; \r\n */\nvar Hammer = require('hammerjs');\n\nvar Carousel = (function () {\n\tfunction Carousel() {\n\t\tvar _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n\t\tvar view = _ref.view;\n\t\tvar widget = _ref.widget;\n\t\tvar pageSize = _ref.pageSize;\n\t\tvar isInfinite = _ref.isInfinite;\n\t\tvar nextPageBuffer = _ref.nextPageBuffer;\n\t\tvar el = _ref.el;\n\t\tvar swipe = _ref.swipe;\n\n\t\t_classCallCheck(this, Carousel);\n\n\t\tthis.view = view;\n\t\tthis.widget = widget;\n\t\tthis.pageSize = pageSize || 3;\n\t\tthis.isInfinite = isInfinite;\n\t\tthis.swipe = swipe;\n\t\tthis.nextPageBuffer = nextPageBuffer || 2;\n\t\tthis.el = document.querySelector(el);\n\t\tif (!this.el || !this.widget || !this.view) {\n\t\t\treturn;\n\t\t}\n\t\tthis.view.carousel = this;\n\t\tthis.aperture = this.el.querySelector('[data-carousel-aperture]');\n\t\tthis.btnNext = this.el.querySelector('[data-control-next]');\n\t\tthis.btnPrev = this.el.querySelector('[data-control-prev]');\n\t\tthis.strip = this.el.querySelector('[data-carousel-list]');\n\t\tthis.currentPage = 1;\n\t\tthis.init();\n\t}\n\n\t/**\r\n * Initialise the carousel\r\n */\n\n\t_createClass(Carousel, [{\n\t\tkey: 'init',\n\t\tvalue: function init() {\n\t\t\tthis.lastPage = this.getLastPage();\n\t\t\tthis.translate3d = window._jgwidget.features.csstransforms3d;\n\t\t\tthis.isInfinite && this.getMaxPage();\n\t\t\tthis.setAperture();\n\t\t\tthis.setControlState();\n\t\t\tthis.bindListeners();\n\t\t\tthis.setCardState();\n\t\t\tthis.isBuffer() && this.loadMoreCards();\n\t\t}\n\n\t\t/**\r\n * Set the aperture of the carousel\r\n * @description Set the size of the aperture based on specified page size. Assumes all cards have the same height.\r\n */\n\t}, {\n\t\tkey: 'setAperture',\n\t\tvalue: function setAperture() {\n\t\t\tvar card = this.aperture.querySelector('[data-card]');\n\t\t\tthis.apertureSize = (card.offsetHeight + parseInt(getComputedStyle(card).marginBottom, 10) + parseInt(getComputedStyle(card).marginTop, 10)) * this.pageSize;\n\t\t\tthis.aperture.style.height = this.apertureSize + 'px';\n\t\t}\n\n\t\t/**\r\n * Get the [current] last page of the carousel\r\n * @description Finds the last page number of the carousel. Subject to update if the carousel is infinite\r\n * @returns {Number} Integer representing the index of the current last carousel page.\r\n */\n\t}, {\n\t\tkey: 'getLastPage',\n\t\tvalue: function getLastPage() {\n\t\t\tvar cardCount = this.aperture.querySelectorAll('[data-card]').length;\n\t\t\treturn parseInt(cardCount / this.pageSize, 10) + (cardCount % this.pageSize > 0 ? 1 : 0);\n\t\t}\n\n\t\t/**\r\n * Get the maximum page of the carousel\r\n * @description For infinite carousels, finds the maximum possible page number of the carousel\r\n */\n\t}, {\n\t\tkey: 'getMaxPage',\n\t\tvalue: function getMaxPage() {\n\t\t\tthis.maxPage = parseInt(parseInt(this.view.model.$model.pagination.totalResults, 10) / this.pageSize, 10) + (this.view.model.$model.pagination.totalResults % this.pageSize > 0 ? 1 : 0);\n\t\t}\n\n\t\t/**\r\n * Set a flag when all possible data has been fetched\r\n * @description For infinite carousels, sets a flag when the last API page has been fetched and added to the model's collection\r\n */\n\t}, {\n\t\tkey: 'setMaxLoaded',\n\t\tvalue: function setMaxLoaded() {\n\t\t\tif (this.isMaxLoaded) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.isMaxLoaded = this.currentPage === this.maxPage;\n\t\t}\n\n\t\t/**\r\n * Bind event listeners\r\n * @description Bind event listeners to DOM nodes for carousel user interaction\r\n */\n\t}, {\n\t\tkey: 'bindListeners',\n\t\tvalue: function bindListeners() {\n\t\t\tvar _this = this;\n\n\t\t\tthis.btnNext.addEventListener('click', function () {\n\t\t\t\treturn _this.showNextPage();\n\t\t\t});\n\t\t\tthis.btnPrev.addEventListener('click', function () {\n\t\t\t\treturn _this.showPrevPage();\n\t\t\t});\n\n\t\t\t//Swipe with Hammer\n\t\t\tif (this.swipe) {\n\t\t\t\tvar hammer = new Hammer(this.strip, {\n\t\t\t\t\tvelocity: 0.15\n\t\t\t\t});\n\t\t\t\tif (this.swipe === 'vertical') {\n\t\t\t\t\thammer.get('swipe').set({ direction: Hammer.DIRECTION_VERTICAL });\n\t\t\t\t\thammer.on('swipe', function (e) {\n\t\t\t\t\t\te.direction === 8 && _this.showNextPage();\n\t\t\t\t\t\te.direction === 16 && _this.showPrevPage();\n\t\t\t\t\t});\n\t\t\t\t} else if (this.swipe === 'horizontal') {\n\t\t\t\t\thammer.on('swipeleft', function () {\n\t\t\t\t\t\treturn _this.showNextPage();\n\t\t\t\t\t});\n\t\t\t\t\thammer.on('swiperight', function () {\n\t\t\t\t\t\treturn _this.showPrevPage();\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\r\n * Set state of carousel controls\r\n * @description Set the state of carousel controls [enabled, disabled] based on current carousel page\r\n */\n\t}, {\n\t\tkey: 'setControlState',\n\t\tvalue: function setControlState() {\n\t\t\tif (this.currentPage === 1) {\n\t\t\t\tthis.btnPrev.setAttribute('disabled', 'disabled');\n\t\t\t\tthis.btnPrev.setAttribute('aria-disabled', 'true');\n\t\t\t\tthis.btnPrev.classList.add('is-disabled');\n\t\t\t} else {\n\t\t\t\tthis.btnPrev.removeAttribute('disabled');\n\t\t\t\tthis.btnPrev.removeAttribute('aria-disabled');\n\t\t\t\tthis.btnPrev.classList.remove('is-disabled');\n\t\t\t}\n\t\t\tif (this.currentPage === this.lastPage) {\n\t\t\t\tthis.btnNext.setAttribute('disabled', 'disabled');\n\t\t\t\tthis.btnNext.setAttribute('aria-disabled', 'true');\n\t\t\t\tthis.btnNext.classList.add('is-disabled');\n\t\t\t} else {\n\t\t\t\tthis.btnNext.removeAttribute('disabled');\n\t\t\t\tthis.btnNext.removeAttribute('aria-disabled');\n\t\t\t\tthis.btnNext.classList.remove('is-disabled');\n\t\t\t}\n\t\t}\n\n\t\t/**\r\n * Show the next page of the carousel\r\n * @description Transition the list to show the next page; fetch more cards if we are on the buffer page [infinite carousels]; \r\n * set max loaded flag; set controller state; set cards state and fire analytics impressions for newly visible cards\r\n */\n\t}, {\n\t\tkey: 'showNextPage',\n\t\tvalue: function showNextPage() {\n\t\t\tif (this.currentPage + 1 > this.lastPage) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.transition(this.apertureSize * this.currentPage);\n\t\t\tthis.currentPage += 1;\n\n\t\t\tif (this.isBuffer()) {\n\t\t\t\tthis.loadMoreCards();\n\t\t\t} else {\n\t\t\t\tthis.setControlState();\n\t\t\t}\n\t\t\tthis.setMaxLoaded();\n\t\t\tthis.setCardState();\n\t\t\tthis.widget.analytics.cardImpressions();\n\t\t}\n\n\t\t/**\r\n * Show the previous page of the carousel\r\n * @description Transition the list to show the previous page; set controller state;\r\n * set cards state and fire analytics impressions for newly visible cards\r\n */\n\t}, {\n\t\tkey: 'showPrevPage',\n\t\tvalue: function showPrevPage() {\n\t\t\tif (this.currentPage - 1 < 1) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.currentPage -= 1;\n\t\t\tthis.transition(this.apertureSize * this.currentPage - this.apertureSize);\n\t\t\tthis.setControlState();\n\t\t\tthis.setCardState();\n\t\t\tthis.widget.analytics.cardImpressions();\n\t\t}\n\n\t\t/**\r\n * Transition the list\r\n * @description Transition the list to show new cards, using either 'transform translate3d' if supported or 'top' otherwise.\r\n * Assumes the list has a transition CSS property registered against 'all' or 'top' and 'transform'\r\n */\n\t}, {\n\t\tkey: 'transition',\n\t\tvalue: function transition(top) {\n\t\t\tif (this.translate3d) {\n\t\t\t\tthis.strip.style[(0, _jsDOMGetVendorProperty2['default'])('transform')] = 'translate3d(0, -' + top + 'px, 0)';\n\t\t\t} else {\n\t\t\t\tthis.strip.style.top = '-' + top + 'px';\n\t\t\t}\n\t\t}\n\n\t\t/**\r\n * Set the current state flags of the cards\r\n * @description Reset all cards to hidden [aria-, data-]; set visible cards to 'visible' [aria-, data-]\r\n */\n\t}, {\n\t\tkey: 'setCardState',\n\t\tvalue: function setCardState() {\n\t\t\tthis.firstCard = this.currentPage * this.pageSize - this.pageSize;\n\t\t\tthis.lastCard = this.firstCard + (this.pageSize - 1);\n\n\t\t\t[].slice.call(this.el.querySelectorAll('[data-card]')).forEach(function (card) {\n\t\t\t\tcard.setAttribute('aria-hidden', 'true');\n\t\t\t\tcard.setAttribute('data-hidden', 'true');\n\t\t\t});\n\n\t\t\tfor (var i = this.firstCard; i < this.lastCard + 1; i++) {\n\t\t\t\tvar card = this.el.querySelectorAll('[data-card]')[i];\n\t\t\t\tif (!card) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tcard.setAttribute('aria-hidden', 'false');\n\t\t\t\tcard.removeAttribute('data-hidden');\n\t\t\t}\n\t\t}\n\n\t\t/**\r\n * Check if we are on buffer page\r\n * @description Check if we are on the carousel page set as nextPageBuffer\r\n */\n\t}, {\n\t\tkey: 'isBuffer',\n\t\tvalue: function isBuffer() {\n\t\t\treturn this.isInfinite && this.currentPage === this.lastPage - this.nextPageBuffer && !this.isMaxLoaded;\n\t\t}\n\n\t\t/**\r\n * Load more cards fetched from the server [infinite carousels]\r\n * @description Trigger the view to fetch and append the next API page of results [cards]; set controls state whilst data is\r\n * being loaded; once loaded trigger new analytics cards initialise; update carousel and card state variables; revert\r\n * controls states\r\n */\n\t}, {\n\t\tkey: 'loadMoreCards',\n\t\tvalue: function loadMoreCards() {\n\t\t\tvar _this2 = this;\n\n\t\t\tthis.btnNext.classList.add('is-loading', 'is-disabled');\n\t\t\tthis.btnNext.setAttribute('disabled', 'disabled');\n\t\t\tthis.view.appendNextPage().then(function () {\n\t\t\t\t_this2.widget.analytics.cardsInit();\n\t\t\t\t_this2.lastPage = _this2.getLastPage();\n\t\t\t\t_this2.setCardState();\n\t\t\t\t_this2.setControlState();\n\t\t\t\t_this2.btnNext.classList.remove('is-loading', 'is-disabled');\n\t\t\t});\n\t\t}\n\n\t\t/**\r\n * Reset the carousel to first page\r\n * @description Reset the carousel to show the first page; reset all carousel state variables and set controls state;\r\n * check if we are on buffer page and if true load more cards\r\n */\n\t}, {\n\t\tkey: 'reset',\n\t\tvalue: function reset() {\n\t\t\tthis.transition(0);\n\t\t\tthis.currentPage = 1;\n\t\t\tthis.lastPage = this.getLastPage();\n\t\t\tthis.isMaxLoaded = false;\n\t\t\tthis.setControlState();\n\t\t\tthis.setCardState();\n\t\t\tthis.isBuffer() && this.loadMoreCards();\n\t\t}\n\n\t\t/**\r\n * Refresh the carousel\r\n * @description Update carousel state variables last page\r\n */\n\t}, {\n\t\tkey: 'refresh',\n\t\tvalue: function refresh() {\n\t\t\tthis.lastPage = this.getLastPage();\n\t\t}\n\t}]);\n\n\treturn Carousel;\n})();\n\nexports['default'] = Carousel;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2NoYXJpdHktZXZlbnRzLWJvYXJkL2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2Nhcm91c2VsL0Nhcm91c2VsLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7Ozs7Ozs7Ozs7O3NDQUdpQiw2QkFBNkI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFEM0QsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDOztJQWUzQixRQUFRO0FBQ0QsVUFEUCxRQUFRLEdBQzBFO21FQUFMLEVBQUU7O01BQXBFLElBQUksUUFBSixJQUFJO01BQUUsTUFBTSxRQUFOLE1BQU07TUFBRSxRQUFRLFFBQVIsUUFBUTtNQUFFLFVBQVUsUUFBVixVQUFVO01BQUUsY0FBYyxRQUFkLGNBQWM7TUFBRSxFQUFFLFFBQUYsRUFBRTtNQUFFLEtBQUssUUFBTCxLQUFLOzt3QkFEeEUsUUFBUTs7QUFFWixNQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNqQixNQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUNyQixNQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsSUFBSSxDQUFDLENBQUM7QUFDOUIsTUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7QUFDN0IsTUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDbkIsTUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLElBQUksQ0FBQyxDQUFDO0FBQzFDLE1BQUksQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBRSxFQUFFLENBQUUsQ0FBQztBQUN2QyxNQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFHO0FBQzdDLFVBQU87R0FDUDtBQUNELE1BQUksQ0FB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QUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDeEQsT0FBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ2xELE9BQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxDQUFFLFlBQU07QUFDdEMsV0FBSyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ2xDLFdBQUssUUFBUSxHQUFHLE9BQUssV0FBVyxFQUFFLENBQUM7QUFDbkMsV0FBSyxZQUFZLEVBQUUsQ0FBQztBQUNwQixXQUFLLGVBQWUsRUFBRSxDQUFDO0FBQ3ZCLFdBQUssT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQzNELENBQUMsQ0FBQztHQUNIOzs7Ozs7Ozs7U0FNSyxpQkFBRztBQUNSLE9BQUksQ0FBQyxVQUFVLENBQUUsQ0FBQyxDQUFFLENBQUM7QUFDckIsT0FBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFDckIsT0FBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDbkMsT0FBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7QUFDekIsT0FBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0FBQ3ZCLE9BQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztBQUNwQixPQUFJLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0dBQ3hDOzs7Ozs7OztTQUtPLG1CQUFHO0FBQ1YsT0FBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7R0FDbkM7OztRQTNPSSxRQUFROzs7cUJBOE9DLFFBQVEiLCJmaWxlIjoiQzovdGVtcC9HRy5Gcm9udEVuZC5XaWRnZXRzL3dpZGdldHMvY2hhcml0eS1ldmVudHMtYm9hcmQvYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvY2Fyb3VzZWwvQ2Fyb3VzZWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XHJcblxyXG5sZXQgSGFtbWVyID0gcmVxdWlyZSgnaGFtbWVyanMnKTtcclxuaW1wb3J0IGdldFZlbmRvclByb3BlcnR5IGZyb20gJy4uL2pzL0RPTS9nZXRWZW5kb3JQcm9wZXJ0eSc7XHJcblxyXG4vKipcclxuICogQWRkIGEgY2Fyb3VzZWwgdG8gYSBsaXN0IHZpZXdcclxuICogQGNsYXNzZGVzYyBBZGQgYSBjYXJvdXNlbCBmb3IgcGFnaW5hdGlvbiBvZiBjYXJkIGxpc3Qgdmlld3NcclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMudmlldy4gVGhlIHZpZXcgdGhhdCB0aGUgY2Fyb3VzZWwgcGFnaW5hdGVzIFtyZXF1aXJlZF1cclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMud2lkZ2V0LiBUaGUgd2lkZ2V0IGluc3RhbmNlIFtyZXF1aXJlZF1cclxuICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMucGFnZVNpemUuIFRoZSBudW1iZXIgb2YgbGlzdCBpdGVtcyB0byBzaG93IGluIGVhY2ggY2Fyb3VzZWwgcGFnZVxyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9wdGlvbnMuaXNJbmZpbml0ZS4gV2hldGhlciB0aGUgY29sbGVjdGlvbiBkaXNwbGF5ZWQgaXMgcGFnaW5hdGVkIG9uIHRoZSBSRVNUIEFQSVxyXG4gKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5uZXh0UGFnZUJ1ZmZlci4gTnVtYmVyIG9mIGNhcm91c2VsIHBhZ2VzIGJlZm9yZSB0aGUgbGFzdCBhdCB3aGljaCB0byBmZXRjaCBuZXh0IEFQSSBwYWdlLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5lbC4gVGhlIGNhcm91c2VsIHBhcmVudCBlbGVtZW50XHJcbiAqIEBjbGFzcyBTZXQgY2Fyb3VzZWwgaW5zdGFuY2UgcHJvcGVydGllczsgY2FjaGUgYXBlcnR1cmUsIGNvbnRyb2wgYW5kIGxpc3QgZWxlbWVudHM7IHNldCBjdXJyZW50IHBhZ2U7IFxyXG4gKi9cclxuY2xhc3MgQ2Fyb3VzZWwge1xyXG5cdGNvbnN0cnVjdG9yICggeyB2aWV3LCB3aWRnZXQsIHBhZ2VTaXplLCBpc0luZmluaXRlLCBuZXh0UGFnZUJ1ZmZlciwgZWwsIHN3aXBlIH0gPSB7fSApIHtcclxuXHRcdHRoaXMudmlldyA9IHZpZXc7XHJcblx0XHR0aGlzLndpZGdldCA9IHdpZGdldDtcclxuXHRcdHRoaXMucGFnZVNpemUgPSBwYWdlU2l6ZSB8fCAzO1xyXG5cdFx0dGhpcy5pc0luZmluaXRlID0gaXNJbmZpbml0ZTtcclxuXHRcdHRoaXMuc3dpcGUgPSBzd2lwZTtcclxuXHRcdHRoaXMubmV4dFBhZ2VCdWZmZXIgPSBuZXh0UGFnZUJ1ZmZlciB8fCAyO1xyXG5cdFx0dGhpcy5lbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIGVsICk7XHJcblx0XHRpZiAoICF0aGlzLmVsIHx8ICF0aGlzLndpZGdldCB8fCAhdGhpcy52aWV3ICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHR0aGlzLnZpZXcuY2Fyb3VzZWwgPSB0aGlzO1xyXG5cdFx0dGhpcy5hcGVydHVyZSA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtY2Fyb3VzZWwtYXBlcnR1cmVdJyk7XHJcblx0XHR0aGlzLmJ0bk5leHQgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNvbnRyb2wtbmV4dF0nKTtcclxuXHRcdHRoaXMuYnRuUHJldiA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtY29udHJvbC1wcmV2XScpO1xyXG5cdFx0dGhpcy5zdHJpcCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtY2Fyb3VzZWwtbGlzdF0nKTtcclxuXHRcdHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG5cdFx0dGhpcy5pbml0KCk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIEluaXRpYWxpc2UgdGhlIGNhcm91c2VsXHJcblx0ICovXHJcblx0aW5pdCAoKSB7XHJcblx0XHR0aGlzLmxhc3RQYWdlID0gdGhpcy5nZXRMYXN0UGFnZSgpO1xyXG5cdFx0dGhpcy50cmFuc2xhdGUzZCA9IHdpbmRvdy5famd3aWRnZXQuZmVhdHVyZXMuY3NzdHJhbnNmb3JtczNkO1xyXG5cdFx0dGhpcy5pc0luZmluaXRlICYmIHRoaXMuZ2V0TWF4UGFnZSgpO1xyXG5cdFx0dGhpcy5zZXRBcGVydHVyZSgpO1xyXG5cdFx0dGhpcy5zZXRDb250cm9sU3RhdGUoKTtcclxuXHRcdHRoaXMuYmluZExpc3RlbmVycygpO1xyXG5cdFx0dGhpcy5zZXRDYXJkU3RhdGUoKTtcclxuXHRcdHRoaXMuaXNCdWZmZXIoKSAmJiB0aGlzLmxvYWRNb3JlQ2FyZHMoKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogU2V0IHRoZSBhcGVydHVyZSBvZiB0aGUgY2Fyb3VzZWxcclxuXHQgKiBAZGVzY3JpcHRpb24gU2V0IHRoZSBzaXplIG9mIHRoZSBhcGVydHVyZSBiYXNlZCBvbiBzcGVjaWZpZWQgcGFnZSBzaXplLiBBc3N1bWVzIGFsbCBjYXJkcyBoYXZlIHRoZSBzYW1lIGhlaWdodC5cclxuXHQgKi9cclxuXHRzZXRBcGVydHVyZSAoKSB7XHJcblx0XHRsZXQgY2FyZCA9IHRoaXMuYXBlcnR1cmUucXVlcnlTZWxlY3RvcignW2RhdGEtY2FyZF0nKTtcclxuXHRcdHRoaXMuYXBlcnR1cmVTaXplID0gKGNhcmQub2Zmc2V0SGVpZ2h0ICsgXHJcblx0XHRcdHBhcnNlSW50KCBnZXRDb21wdXRlZFN0eWxlKGNhcmQpLm1hcmdpbkJvdHRvbSwgMTAgKSArIFxyXG5cdFx0XHRwYXJzZUludCggZ2V0Q29tcHV0ZWRTdHlsZShjYXJkKS5tYXJnaW5Ub3AsIDEwKSkgKiBcclxuXHRcdFx0dGhpcy5wYWdlU2l6ZTtcclxuXHRcdHRoaXMuYXBlcnR1cmUuc3R5bGUuaGVpZ2h0ID0gYCR7dGhpcy5hcGVydHVyZVNpemV9cHhgO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBHZXQgdGhlIFtjdXJyZW50XSBsYXN0IHBhZ2Ugb2YgdGhlIGNhcm91c2VsXHJcblx0ICogQGRlc2NyaXB0aW9uIEZpbmRzIHRoZSBsYXN0IHBhZ2UgbnVtYmVyIG9mIHRoZSBjYXJvdXNlbC4gU3ViamVjdCB0byB1cGRhdGUgaWYgdGhlIGNhcm91c2VsIGlzIGluZmluaXRlXHJcblx0ICogQHJldHVybnMge051bWJlcn0gSW50ZWdlciByZXByZXNlbnRpbmcgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGxhc3QgY2Fyb3VzZWwgcGFnZS5cclxuXHQgKi9cclxuXHRnZXRMYXN0UGFnZSAoKSB7XHJcblx0XHRsZXQgY2FyZENvdW50ID0gdGhpcy5hcGVydHVyZS5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jYXJkXScpLmxlbmd0aDtcclxuXHRcdHJldHVybiBwYXJzZUludCggY2FyZENvdW50IC8gdGhpcy5wYWdlU2l6ZSwgMTAgKSArICggY2FyZENvdW50ICUgdGhpcy5wYWdlU2l6ZSA+IDAgPyAxIDogMCApO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBHZXQgdGhlIG1heGltdW0gcGFnZSBvZiB0aGUgY2Fyb3VzZWxcclxuXHQgKiBAZGVzY3JpcHRpb24gRm9yIGluZmluaXRlIGNhcm91c2VscywgZmluZHMgdGhlIG1heGltdW0gcG9zc2libGUgcGFnZSBudW1iZXIgb2YgdGhlIGNhcm91c2VsXHJcblx0ICovXHJcblx0Z2V0TWF4UGFnZSAoKSB7XHJcblx0XHR0aGlzLm1heFBhZ2UgPSBwYXJzZUludCggcGFyc2VJbnQoIHRoaXMudmlldy5tb2RlbC4kbW9kZWwucGFnaW5hdGlvbi50b3RhbFJlc3VsdHMsIDEwICkgLyB0aGlzLnBhZ2VTaXplLCAxMCApICsgXHJcblx0XHRcdCh0aGlzLnZpZXcubW9kZWwuJG1vZGVsLnBhZ2luYXRpb24udG90YWxSZXN1bHRzICUgdGhpcy5wYWdlU2l6ZSA+IDAgPyAxIDogMCk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFNldCBhIGZsYWcgd2hlbiBhbGwgcG9zc2libGUgZGF0YSBoYXMgYmVlbiBmZXRjaGVkXHJcblx0ICogQGRlc2NyaXB0aW9uIEZvciBpbmZpbml0ZSBjYXJvdXNlbHMsIHNldHMgYSBmbGFnIHdoZW4gdGhlIGxhc3QgQVBJIHBhZ2UgaGFzIGJlZW4gZmV0Y2hlZCBhbmQgYWRkZWQgdG8gdGhlIG1vZGVsJ3MgY29sbGVjdGlvblxyXG5cdCAqL1xyXG5cdHNldE1heExvYWRlZCAoKSB7XHJcblx0XHRpZiAoIHRoaXMuaXNNYXhMb2FkZWQgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdHRoaXMuaXNNYXhMb2FkZWQgPSB0aGlzLmN1cnJlbnRQYWdlID09PSB0aGlzLm1heFBhZ2U7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIEJpbmQgZXZlbnQgbGlzdGVuZXJzXHJcblx0ICogQGRlc2NyaXB0aW9uIEJpbmQgZXZlbnQgbGlzdGVuZXJzIHRvIERPTSBub2RlcyBmb3IgY2Fyb3VzZWwgdXNlciBpbnRlcmFjdGlvblxyXG5cdCAqL1xyXG5cdGJpbmRMaXN0ZW5lcnMgKCkge1xyXG5cdFx0dGhpcy5idG5OZXh0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5zaG93TmV4dFBhZ2UoKSApO1xyXG5cdFx0dGhpcy5idG5QcmV2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5zaG93UHJldlBhZ2UoKSApO1xyXG5cdFx0XHJcblx0XHQvL1N3aXBlIHdpdGggSGFtbWVyXHJcblx0XHRpZiAoIHRoaXMuc3dpcGUgKSB7XHJcblx0XHRcdGxldCBoYW1tZXIgPSBuZXcgSGFtbWVyKHRoaXMuc3RyaXAsIHtcclxuXHRcdFx0XHR2ZWxvY2l0eTogMC4xNVxyXG5cdFx0XHR9KTtcclxuXHRcdFx0aWYgKCB0aGlzLnN3aXBlID09PSAndmVydGljYWwnICkge1xyXG5cdFx0XHRcdGhhbW1lci5nZXQoJ3N3aXBlJykuc2V0KHsgZGlyZWN0aW9uOiBIYW1tZXIuRElSRUNUSU9OX1ZFUlRJQ0FMIH0pO1xyXG5cdFx0XHRcdGhhbW1lci5vbignc3dpcGUnLCAoZSkgPT4ge1xyXG5cdFx0XHRcdFx0ZS5kaXJlY3Rpb24gPT09IDggJiYgdGhpcy5zaG93TmV4dFBhZ2UoKTtcclxuXHRcdFx0XHRcdGUuZGlyZWN0aW9uID09PSAxNiAmJiB0aGlzLnNob3dQcmV2UGFnZSgpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9IGVsc2UgaWYgKCB0aGlzLnN3aXBlID09PSAnaG9yaXpvbnRhbCcgKSB7XHJcblx0XHRcdFx0aGFtbWVyLm9uKCdzd2lwZWxlZnQnLCAoKSA9PiB0aGlzLnNob3dOZXh0UGFnZSgpICk7XHJcblx0XHRcdFx0aGFtbWVyLm9uKCdzd2lwZXJpZ2h0JywgKCkgPT4gdGhpcy5zaG93UHJldlBhZ2UoKSApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFNldCBzdGF0ZSBvZiBjYXJvdXNlbCBjb250cm9sc1xyXG5cdCAqIEBkZXNjcmlwdGlvbiBTZXQgdGhlIHN0YXRlIG9mIGNhcm91c2VsIGNvbnRyb2xzIFtlbmFibGVkLCBkaXNhYmxlZF0gYmFzZWQgb24gY3VycmVudCBjYXJvdXNlbCBwYWdlXHJcblx0ICovXHJcblx0c2V0Q29udHJvbFN0YXRlICgpIHtcclxuXHRcdGlmICh0aGlzLmN1cnJlbnRQYWdlID09PSAxKSB7XHJcblx0XHRcdHRoaXMuYnRuUHJldi5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XHJcblx0XHRcdHRoaXMuYnRuUHJldi5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnLCAndHJ1ZScpO1xyXG5cdFx0XHR0aGlzLmJ0blByZXYuY2xhc3NMaXN0LmFkZCgnaXMtZGlzYWJsZWQnKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuYnRuUHJldi5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XHJcblx0XHRcdHRoaXMuYnRuUHJldi5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnKTtcclxuXHRcdFx0dGhpcy5idG5QcmV2LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWRpc2FibGVkJyk7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5jdXJyZW50UGFnZSA9PT0gdGhpcy5sYXN0UGFnZSkge1xyXG5cdFx0XHR0aGlzLmJ0bk5leHQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xyXG5cdFx0XHR0aGlzLmJ0bk5leHQuc2V0QXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJywgJ3RydWUnKTtcclxuXHRcdFx0dGhpcy5idG5OZXh0LmNsYXNzTGlzdC5hZGQoJ2lzLWRpc2FibGVkJyk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLmJ0bk5leHQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xyXG5cdFx0XHR0aGlzLmJ0bk5leHQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJyk7XHJcblx0XHRcdHRoaXMuYnRuTmV4dC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1kaXNhYmxlZCcpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHQvKipcclxuXHQgKiBTaG93IHRoZSBuZXh0IHBhZ2Ugb2YgdGhlIGNhcm91c2VsXHJcblx0ICogQGRlc2NyaXB0aW9uIFRyYW5zaXRpb24gdGhlIGxpc3QgdG8gc2hvdyB0aGUgbmV4dCBwYWdlOyBmZXRjaCBtb3JlIGNhcmRzIGlmIHdlIGFyZSBvbiB0aGUgYnVmZmVyIHBhZ2UgW2luZmluaXRlIGNhcm91c2Vsc107IFxyXG5cdCAqIHNldCBtYXggbG9hZGVkIGZsYWc7IHNldCBjb250cm9sbGVyIHN0YXRlOyBzZXQgY2FyZHMgc3RhdGUgYW5kIGZpcmUgYW5hbHl0aWNzIGltcHJlc3Npb25zIGZvciBuZXdseSB2aXNpYmxlIGNhcmRzXHJcblx0ICovXHJcblx0c2hvd05leHRQYWdlICgpIHtcclxuXHRcdGlmICggdGhpcy5jdXJyZW50UGFnZSArIDEgPiB0aGlzLmxhc3RQYWdlKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH0gXHJcblx0XHR0aGlzLnRyYW5zaXRpb24oIHRoaXMuYXBlcnR1cmVTaXplICogdGhpcy5jdXJyZW50UGFnZSApO1xyXG5cdFx0dGhpcy5jdXJyZW50UGFnZSArPSAxO1xyXG5cclxuXHRcdGlmICggdGhpcy5pc0J1ZmZlcigpICkge1xyXG5cdFx0XHR0aGlzLmxvYWRNb3JlQ2FyZHMoKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuc2V0Q29udHJvbFN0YXRlKCk7XHJcblx0XHR9XHJcblx0XHR0aGlzLnNldE1heExvYWRlZCgpO1xyXG5cdFx0dGhpcy5zZXRDYXJkU3RhdGUoKTtcclxuXHRcdHRoaXMud2lkZ2V0LmFuYWx5dGljcy5jYXJkSW1wcmVzc2lvbnMoKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogU2hvdyB0aGUgcHJldmlvdXMgcGFnZSBvZiB0aGUgY2Fyb3VzZWxcclxuXHQgKiBAZGVzY3JpcHRpb24gVHJhbnNpdGlvbiB0aGUgbGlzdCB0byBzaG93IHRoZSBwcmV2aW91cyBwYWdlOyBzZXQgY29udHJvbGxlciBzdGF0ZTtcclxuXHQgKiBzZXQgY2FyZHMgc3RhdGUgYW5kIGZpcmUgYW5hbHl0aWNzIGltcHJlc3Npb25zIGZvciBuZXdseSB2aXNpYmxlIGNhcmRzXHJcblx0ICovXHJcblx0c2hvd1ByZXZQYWdlICgpIHtcclxuXHRcdGlmICggdGhpcy5jdXJyZW50UGFnZSAtIDEgPCAxKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdHRoaXMuY3VycmVudFBhZ2UgLT0gMTtcclxuXHRcdHRoaXMudHJhbnNpdGlvbiggKHRoaXMuYXBlcnR1cmVTaXplICogdGhpcy5jdXJyZW50UGFnZSkgLSB0aGlzLmFwZXJ0dXJlU2l6ZSApO1xyXG5cdFx0dGhpcy5zZXRDb250cm9sU3RhdGUoKTtcclxuXHRcdHRoaXMuc2V0Q2FyZFN0YXRlKCk7XHJcblx0XHR0aGlzLndpZGdldC5hbmFseXRpY3MuY2FyZEltcHJlc3Npb25zKCk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zaXRpb24gdGhlIGxpc3RcclxuXHQgKiBAZGVzY3JpcHRpb24gVHJhbnNpdGlvbiB0aGUgbGlzdCB0byBzaG93IG5ldyBjYXJkcywgdXNpbmcgZWl0aGVyICd0cmFuc2Zvcm0gdHJhbnNsYXRlM2QnIGlmIHN1cHBvcnRlZCBvciAndG9wJyBvdGhlcndpc2UuXHJcblx0ICogQXNzdW1lcyB0aGUgbGlzdCBoYXMgYSB0cmFuc2l0aW9uIENTUyBwcm9wZXJ0eSByZWdpc3RlcmVkIGFnYWluc3QgJ2FsbCcgb3IgJ3RvcCcgYW5kICd0cmFuc2Zvcm0nXHJcblx0ICovXHJcblx0dHJhbnNpdGlvbiAoIHRvcCApIHtcclxuXHRcdGlmICggdGhpcy50cmFuc2xhdGUzZCApIHtcclxuXHRcdFx0dGhpcy5zdHJpcC5zdHlsZVtnZXRWZW5kb3JQcm9wZXJ0eSgndHJhbnNmb3JtJyldID0gYHRyYW5zbGF0ZTNkKDAsIC0ke3RvcH1weCwgMClgO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5zdHJpcC5zdHlsZS50b3AgPSBgLSR7dG9wfXB4YDtcclxuXHRcdH1cclxuXHR9XHJcblx0LyoqXHJcblx0ICogU2V0IHRoZSBjdXJyZW50IHN0YXRlIGZsYWdzIG9mIHRoZSBjYXJkc1xyXG5cdCAqIEBkZXNjcmlwdGlvbiBSZXNldCBhbGwgY2FyZHMgdG8gaGlkZGVuIFthcmlhLSwgZGF0YS1dOyBzZXQgdmlzaWJsZSBjYXJkcyB0byAndmlzaWJsZScgW2FyaWEtLCBkYXRhLV1cclxuXHQgKi9cclxuXHRzZXRDYXJkU3RhdGUgKCkge1xyXG5cdFx0dGhpcy5maXJzdENhcmQgPSAoIHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplICkgLSB0aGlzLnBhZ2VTaXplO1xyXG5cdFx0dGhpcy5sYXN0Q2FyZCA9IHRoaXMuZmlyc3RDYXJkICsgKCB0aGlzLnBhZ2VTaXplIC0gMSApO1xyXG5cdFx0XHJcblx0XHRbXS5zbGljZS5jYWxsKCB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWNhcmRdJykgKS5mb3JFYWNoKCggY2FyZCApID0+IHtcclxuXHRcdFx0Y2FyZC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcclxuXHRcdFx0Y2FyZC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaGlkZGVuJywgJ3RydWUnKTtcclxuXHRcdH0pO1xyXG5cdFx0XHJcblx0XHRmb3IgKCBsZXQgaSA9IHRoaXMuZmlyc3RDYXJkOyBpIDwgdGhpcy5sYXN0Q2FyZCArIDE7IGkrKyApIHtcclxuXHRcdFx0bGV0IGNhcmQgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWNhcmRdJylbaV07XHJcblx0XHRcdGlmICghY2FyZCkge1xyXG5cdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHR9IFxyXG5cdFx0XHRjYXJkLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAnZmFsc2UnKTtcclxuXHRcdFx0Y2FyZC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaGlkZGVuJyk7XHJcblx0XHR9XHRcdFx0XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIENoZWNrIGlmIHdlIGFyZSBvbiBidWZmZXIgcGFnZVxyXG5cdCAqIEBkZXNjcmlwdGlvbiBDaGVjayBpZiB3ZSBhcmUgb24gdGhlIGNhcm91c2VsIHBhZ2Ugc2V0IGFzIG5leHRQYWdlQnVmZmVyXHJcblx0ICovXHJcblx0aXNCdWZmZXIgKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuaXNJbmZpbml0ZSAmJiB0aGlzLmN1cnJlbnRQYWdlID09PSAodGhpcy5sYXN0UGFnZSAtIHRoaXMubmV4dFBhZ2VCdWZmZXIpICYmICF0aGlzLmlzTWF4TG9hZGVkO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBMb2FkIG1vcmUgY2FyZHMgZmV0Y2hlZCBmcm9tIHRoZSBzZXJ2ZXIgW2luZmluaXRlIGNhcm91c2Vsc11cclxuXHQgKiBAZGVzY3JpcHRpb24gVHJpZ2dlciB0aGUgdmlldyB0byBmZXRjaCBhbmQgYXBwZW5kIHRoZSBuZXh0IEFQSSBwYWdlIG9mIHJlc3VsdHMgW2NhcmRzXTsgc2V0IGNvbnRyb2xzIHN0YXRlIHdoaWxzdCBkYXRhIGlzXHJcblx0ICogYmVpbmcgbG9hZGVkOyBvbmNlIGxvYWRlZCB0cmlnZ2VyIG5ldyBhbmFseXRpY3MgY2FyZHMgaW5pdGlhbGlzZTsgdXBkYXRlIGNhcm91c2VsIGFuZCBjYXJkIHN0YXRlIHZhcmlhYmxlczsgcmV2ZXJ0XHJcblx0ICogY29udHJvbHMgc3RhdGVzXHJcblx0ICovXHJcblx0bG9hZE1vcmVDYXJkcyAoKSB7XHJcblx0XHR0aGlzLmJ0bk5leHQuY2xhc3NMaXN0LmFkZCgnaXMtbG9hZGluZycsICdpcy1kaXNhYmxlZCcpO1xyXG5cdFx0dGhpcy5idG5OZXh0LnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcclxuXHRcdHRoaXMudmlldy5hcHBlbmROZXh0UGFnZSgpLnRoZW4oICgpID0+IHtcclxuXHRcdFx0dGhpcy53aWRnZXQuYW5hbHl0aWNzLmNhcmRzSW5pdCgpO1xyXG5cdFx0XHR0aGlzLmxhc3RQYWdlID0gdGhpcy5nZXRMYXN0UGFnZSgpO1x0XHJcblx0XHRcdHRoaXMuc2V0Q2FyZFN0YXRlKCk7XHJcblx0XHRcdHRoaXMuc2V0Q29udHJvbFN0YXRlKCk7XHJcblx0XHRcdHRoaXMuYnRuTmV4dC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1sb2FkaW5nJywgJ2lzLWRpc2FibGVkJyk7XHJcblx0XHR9KTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogUmVzZXQgdGhlIGNhcm91c2VsIHRvIGZpcnN0IHBhZ2VcclxuXHQgKiBAZGVzY3JpcHRpb24gUmVzZXQgdGhlIGNhcm91c2VsIHRvIHNob3cgdGhlIGZpcnN0IHBhZ2U7IHJlc2V0IGFsbCBjYXJvdXNlbCBzdGF0ZSB2YXJpYWJsZXMgYW5kIHNldCBjb250cm9scyBzdGF0ZTtcclxuXHQgKiBjaGVjayBpZiB3ZSBhcmUgb24gYnVmZmVyIHBhZ2UgYW5kIGlmIHRydWUgbG9hZCBtb3JlIGNhcmRzXHJcblx0ICovXHJcblx0cmVzZXQgKCkge1xyXG5cdFx0dGhpcy50cmFuc2l0aW9uKCAwICk7XHJcblx0XHR0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuXHRcdHRoaXMubGFzdFBhZ2UgPSB0aGlzLmdldExhc3RQYWdlKCk7XHJcblx0XHR0aGlzLmlzTWF4TG9hZGVkID0gZmFsc2U7XHJcblx0XHR0aGlzLnNldENvbnRyb2xTdGF0ZSgpO1xyXG5cdFx0dGhpcy5zZXRDYXJkU3RhdGUoKTtcclxuXHRcdHRoaXMuaXNCdWZmZXIoKSAmJiB0aGlzLmxvYWRNb3JlQ2FyZHMoKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogUmVmcmVzaCB0aGUgY2Fyb3VzZWxcclxuXHQgKiBAZGVzY3JpcHRpb24gVXBkYXRlIGNhcm91c2VsIHN0YXRlIHZhcmlhYmxlcyBsYXN0IHBhZ2VcclxuXHQgKi9cclxuXHRyZWZyZXNoICgpIHtcclxuXHRcdHRoaXMubGFzdFBhZ2UgPSB0aGlzLmdldExhc3RQYWdlKCk7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDYXJvdXNlbDsiXX0=\n},{\"../js/DOM/getVendorProperty\":48,\"hammerjs\":27}],48:[function(require,module,exports){\n'use strict';\n\n/**\r\n * Return the correct vendor-prefixed property name for a given style property\r\n * @param {String} The required property name\r\n * @returns {String} The vendor-prefixed property name\r\n */\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\nfunction getVendorProperty(property) {\n var props = {\n transform: ['transform', 'msTransform', 'webkitTransform', 'mozTransform', 'oTransform']\n };\n var vendorProps = props[property].filter(function (prop) {\n if (typeof document.body.style[prop] !== 'undefined') {\n return prop;\n }\n });\n return vendorProps.length ? vendorProps[0] : undefined;\n}\n\nexports['default'] = getVendorProperty;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2NoYXJpdHktZXZlbnRzLWJvYXJkL2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL0RPTS9nZXRWZW5kb3JQcm9wZXJ0eS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7Ozs7Ozs7Ozs7QUFPYixTQUFTLGlCQUFpQixDQUFFLFFBQVEsRUFBRztBQUN0QyxNQUFJLEtBQUssR0FBRztBQUNYLGFBQVMsRUFBRSxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLFlBQVksQ0FBQztHQUN4RixDQUFDO0FBQ0MsTUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFDLElBQUksRUFBSztBQUNsRCxRQUFJLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssV0FBVyxFQUFFO0FBQy9DLGFBQU8sSUFBSSxDQUFDO0tBQ2Y7R0FDSixDQUFDLENBQUM7QUFDSCxTQUFPLFdBQVcsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztDQUMxRDs7cUJBRWMsaUJBQWlCIiwiZmlsZSI6IkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2NoYXJpdHktZXZlbnRzLWJvYXJkL2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL0RPTS9nZXRWZW5kb3JQcm9wZXJ0eS5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gdGhlIGNvcnJlY3QgdmVuZG9yLXByZWZpeGVkIHByb3BlcnR5IG5hbWUgZm9yIGEgZ2l2ZW4gc3R5bGUgcHJvcGVydHlcclxuICogQHBhcmFtIHtTdHJpbmd9IFRoZSByZXF1aXJlZCBwcm9wZXJ0eSBuYW1lXHJcbiAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSB2ZW5kb3ItcHJlZml4ZWQgcHJvcGVydHkgbmFtZVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0VmVuZG9yUHJvcGVydHkoIHByb3BlcnR5ICkge1xyXG5cdGxldCBwcm9wcyA9IHtcclxuXHRcdHRyYW5zZm9ybTogWyd0cmFuc2Zvcm0nLCAnbXNUcmFuc2Zvcm0nLCAnd2Via2l0VHJhbnNmb3JtJywgJ21velRyYW5zZm9ybScsICdvVHJhbnNmb3JtJ11cclxuXHR9O1xyXG4gICAgbGV0IHZlbmRvclByb3BzID0gcHJvcHNbcHJvcGVydHldLmZpbHRlcigocHJvcCkgPT4ge1xyXG4gICAgXHRpZiAodHlwZW9mIGRvY3VtZW50LmJvZHkuc3R5bGVbcHJvcF0gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcm9wO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHZlbmRvclByb3BzLmxlbmd0aCA/IHZlbmRvclByb3BzWzBdIDogdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBnZXRWZW5kb3JQcm9wZXJ0eTtcclxuIl19\n},{}],49:[function(require,module,exports){\n'use strict';\n\n/**\r\n * Add analytics tracking to a widget\r\n * @classdesc Add analytics listeners and events for [kissmetrics] analytics framework\r\n * @param {Object} options\r\n * @param {Object} options.config. Hash of widget config options\r\n * @param {Object} options.widget. The widget instance [required]\r\n * @class Set analytics instance properties; initialise analytics\r\n */\nObject.defineProperty(exports, '__esModule', {\n\tvalue: true\n});\n\nvar _createClass = (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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar Analytics = (function () {\n\tfunction Analytics() {\n\t\tvar _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n\t\tvar widget = _ref.widget;\n\t\tvar configHash = _ref.configHash;\n\t\tvar callbacks = _ref.callbacks;\n\n\t\t_classCallCheck(this, Analytics);\n\n\t\tthis.widget = widget;\n\t\tif (!this.widget) {\n\t\t\treturn;\n\t\t}\n\t\tthis.configHash = configHash || {};\n\t\tthis.callbacks = callbacks || [];\n\t\tthis.init();\n\t}\n\n\t/**\r\n \t* Initialise analytics\r\n \t* @description Cache the widget element; fetch analytics values on the widget element; trigger analytics methods\r\n \t*/\n\n\t_createClass(Analytics, [{\n\t\tkey: 'init',\n\t\tvalue: function init() {\n\t\t\tthis.widgetEl = document.querySelector('[data-analytics-widget]');\n\t\t\tif (this.widgetEl) {\n\t\t\t\tthis.widgetName = this.widgetEl.getAttribute('data-analytics-widget');\n\t\t\t\tthis.charityId = document.querySelector('[data-charity-id]') ? document.querySelector('[data-charity-id]').getAttribute('data-charity-id') : '';\n\t\t\t\tthis.frpId = document.querySelector('[data-charity-frpId]') ? document.querySelector('[data-charity-frpId]').getAttribute('data-charity-frpId') : '';\n\n\t\t\t\tthis.pushConfig();\n\t\t\t\tthis.widgetInit();\n\t\t\t\tthis.cardsInit();\n\t\t\t\tthis.cardImpressions();\n\t\t\t}\n\t\t}\n\n\t\t/**\r\n \t* Push user config hash [including parent page's referrer] to kissmetrics as property\r\n \t*/\n\t}, {\n\t\tkey: 'pushConfig',\n\t\tvalue: function pushConfig() {\n\t\t\tthis.sendData(['set', this.configHash]);\n\t\t}\n\n\t\t/**\r\n \t* Initialise widget analytics data hash\r\n \t* @description Create a hash of widget-level analytics values; store it on the widget element;\r\n \t* register click listener on widget element\r\n \t*/\n\t}, {\n\t\tkey: 'widgetInit',\n\t\tvalue: function widgetInit() {\n\t\t\tvar _this = this;\n\n\t\t\tvar analyticsData = {\n\t\t\t\tpage_type: 'widget', // jshint ignore:line\n\t\t\t\t'event': 'page click',\n\t\t\t\tactivity_type: this.widgetName, // jshint ignore:line\n\t\t\t\tcharity_id: this.charityId, // jshint ignore:line\n\t\t\t\tpage_id: this.frpId // jshint ignore:line\n\t\t\t};\n\t\t\tthis.widgetEl.analytics = analyticsData;\n\n\t\t\tthis.widgetEl.addEventListener('click', function (e) {\n\t\t\t\t_this.widgetClick(e);\n\t\t\t});\n\t\t}\n\n\t\t/**\r\n \t* Push kissmetrics NON-card click events\r\n \t* @description Handle non-card click events on the widget using event delegation. Create click values hash for target elements\r\n \t* and fire kissmetrics page click event\r\n \t*/\n\t}, {\n\t\tkey: 'widgetClick',\n\t\tvalue: function widgetClick(e) {\n\t\t\tvar evt = e.target.getAttribute('data-analytics-event');\n\t\t\tif (evt) {\n\t\t\t\tvar clickData = Object.assign({}, this.widgetEl.analytics);\n\t\t\t\tclickData.subtype = e.target.getAttribute('data-analytics-subtype');\n\t\t\t\tclickData.event_value = evt; // jshint ignore:line\n\t\t\t\tthis.sendData(['record', 'page click', clickData]);\n\t\t\t}\n\t\t}\n\n\t\t/**\r\n \t* Initialise card analytics data hash\r\n \t* @description For each card in the DOM create a card analytics hash and store it on the card [if none already present];\r\n \t* and add click listner\r\n \t*/\n\t}, {\n\t\tkey: 'cardsInit',\n\t\tvalue: function cardsInit() {\n\t\t\tvar _this2 = this;\n\n\t\t\tvar cards = document.querySelectorAll('[data-analytics-card]');\n\t\t\tvar self = this;\n\n\t\t\t[].slice.call(cards).forEach(function (card, index) {\n\t\t\t\tcard.setAttribute('data-card-rank', index);\n\t\t\t\tif (!card.analytics) {\n\t\t\t\t\tvar analyticsData = {};\n\t\t\t\t\tvar charityId = card.getAttribute('data-charity-id') || '';\n\t\t\t\t\tvar activityId = card.getAttribute('data-activity-id') || '';\n\t\t\t\t\tvar cardRank = card.getAttribute('data-card-rank');\n\t\t\t\t\tvar cardFrpId = card.getAttribute('data-frp-id') || '';\n\t\t\t\t\tvar cardUrl = card.getAttribute('data-card-url') || '';\n\n\t\t\t\t\tanalyticsData.page_type = 'widget'; // jshint ignore:line\n\t\t\t\t\tanalyticsData.card_id = _this2.widgetName + '-' + charityId + '-' + activityId; // jshint ignore:line\n\t\t\t\t\tanalyticsData.card_rank = cardRank; // jshint ignore:line\n\t\t\t\t\tanalyticsData.activity_id = activityId; // jshint ignore:line\n\t\t\t\t\tanalyticsData.activity_type = _this2.widgetName; // jshint ignore:line\n\t\t\t\t\tanalyticsData.charity_id = charityId; // jshint ignore:line\n\t\t\t\t\tanalyticsData.page_id = cardFrpId; // jshint ignore:line\n\t\t\t\t\tanalyticsData.card_url = cardUrl; // jshint ignore:line\n\n\t\t\t\t\tcard.analytics = analyticsData;\n\n\t\t\t\t\tcard.addEventListener('click', function (e) {\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\tself.cardClick(e, this);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t/**\r\n \t* Push kissmetrics card impressions\r\n \t* @description For all visible cards, create a card impression analytics hash and fire a kissmetrics card impression event\r\n \t*/\n\t}, {\n\t\tkey: 'cardImpressions',\n\t\tvalue: function cardImpressions() {\n\t\t\tvar _this3 = this;\n\n\t\t\tvar cards = document.querySelectorAll('[data-analytics-card]:not([data-hidden])');\n\t\t\t[].slice.call(cards).forEach(function (card) {\n\t\t\t\tvar impressionData = Object.assign({}, card.analytics);\n\t\t\t\timpressionData.event = 'impression';\n\t\t\t\timpressionData.card_count = cards.length; // jshint ignore:line\n\t\t\t\t_this3.sendData(['record', 'impression', impressionData]);\n\t\t\t});\n\t\t}\n\n\t\t/**\r\n \t* Push kissmetrics card click events\r\n \t* @description Handle card click events on the widget using event delegation. Create a card click values hash for taregt card\r\n \t* and fire a kissmetrics card click event\r\n \t*/\n\t}, {\n\t\tkey: 'cardClick',\n\t\tvalue: function cardClick(e, card) {\n\t\t\tvar evt = e.target.getAttribute('data-analytics-event');\n\t\t\tif (evt) {\n\t\t\t\tvar clickData = Object.assign({}, card.analytics);\n\t\t\t\tclickData.event = 'card click';\n\t\t\t\tclickData.subtype = e.target.getAttribute('data-analytics-subtype');\n\t\t\t\tclickData.event_value = evt; // jshint ignore:line\n\t\t\t\tclickData.card_count = document.querySelectorAll('[data-analytics-card]:not([data-hidden])').length; // jshint ignore:line\n\t\t\t\tthis.sendData(['record', 'card click', clickData]);\n\t\t\t}\n\t\t}\n\n\t\t/**\r\n * Push data to trackers\r\n */\n\t}, {\n\t\tkey: 'sendData',\n\t\tvalue: function sendData(data) {\n\t\t\tthis.callbacks.forEach(function (cb) {\n\t\t\t\treturn cb(data);\n\t\t\t});\n\t\t}\n\t}]);\n\n\treturn Analytics;\n})();\n\nexports['default'] = Analytics;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2NoYXJpdHktZXZlbnRzLWJvYXJkL2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9BbmFseXRpY3MuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFVUCxTQUFTO0FBQ0YsVUFEUCxTQUFTLEdBQ3lDO21FQUFMLEVBQUU7O01BQXBDLE1BQU0sUUFBTixNQUFNO01BQUUsVUFBVSxRQUFWLFVBQVU7TUFBRSxTQUFTLFFBQVQsU0FBUzs7d0JBRHhDLFNBQVM7O0FBRWIsTUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDckIsTUFBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUc7QUFDbkIsVUFBTztHQUNQO0FBQ0QsTUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLElBQUksRUFBRSxDQUFDO0FBQ25DLE1BQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxJQUFJLEVBQUUsQ0FBQztBQUNqQyxNQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7RUFDWjs7Ozs7OztjQVRJLFNBQVM7O1NBY1QsZ0JBQUc7QUFDUCxPQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMseUJBQXlCLENBQUMsQ0FBQztBQUNsRSxPQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7QUFDbEIsUUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0FBQ3RFLFFBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxHQUMzRCxRQUFRLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xGLFFBQUks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Ozs7OztTQU1TLG1CQUFFLENBQUMsRUFBRSxJQUFJLEVBQUc7QUFDckIsT0FBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUN4RCxPQUFJLEdBQUcsRUFBRTtBQUNSLFFBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNsRCxhQUFTLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQztBQUMvQixhQUFTLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLHdCQUF3QixDQUFDLENBQUM7QUFDcEUsYUFBUyxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7QUFDNUIsYUFBUyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsMENBQTBDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDcEcsUUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNuRDtHQUNEOzs7Ozs7O1NBS08sa0JBQUMsSUFBSSxFQUFFO0FBQ2QsT0FBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBQSxFQUFFO1dBQUksRUFBRSxDQUFDLElBQUksQ0FBQztJQUFBLENBQUMsQ0FBQztHQUN2Qzs7O1FBNUlJLFNBQVM7OztxQkErSUEsU0FBUyIsImZpbGUiOiJDOi90ZW1wL0dHLkZyb250RW5kLldpZGdldHMvd2lkZ2V0cy9jaGFyaXR5LWV2ZW50cy1ib2FyZC9ib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy9mcmFtZXdvcmsvQW5hbHl0aWNzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xyXG5cclxuLyoqXHJcbiAqIEFkZCBhbmFseXRpY3MgdHJhY2tpbmcgdG8gYSB3aWRnZXRcclxuICogQGNsYXNzZGVzYyBBZGQgYW5hbHl0aWNzIGxpc3RlbmVycyBhbmQgZXZlbnRzIGZvciBba2lzc21ldHJpY3NdIGFuYWx5dGljcyBmcmFtZXdvcmtcclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMuY29uZmlnLiBIYXNoIG9mIHdpZGdldCBjb25maWcgb3B0aW9uc1xyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy53aWRnZXQuIFRoZSB3aWRnZXQgaW5zdGFuY2UgW3JlcXVpcmVkXVxyXG4gKiBAY2xhc3MgU2V0IGFuYWx5dGljcyBpbnN0YW5jZSBwcm9wZXJ0aWVzOyBpbml0aWFsaXNlIGFuYWx5dGljc1xyXG4gKi9cclxuY2xhc3MgQW5hbHl0aWNzIHtcclxuXHRjb25zdHJ1Y3RvciAoIHsgd2lkZ2V0LCBjb25maWdIYXNoLCBjYWxsYmFja3MgfSA9IHt9ICkge1xyXG5cdFx0dGhpcy53aWRnZXQgPSB3aWRnZXQ7XHJcblx0XHRpZiAoICF0aGlzLndpZGdldCApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5jb25maWdIYXNoID0gY29uZmlnSGFzaCB8fCB7fTtcclxuXHRcdHRoaXMuY2FsbGJhY2tzID0gY2FsbGJhY2tzIHx8IFtdO1xyXG5cdFx0dGhpcy5pbml0KCk7XHJcblx0fVxyXG5cdC8qKlxyXG4gXHQqIEluaXRpYWxpc2UgYW5hbHl0aWNzXHJcbiBcdCogQGRlc2NyaXB0aW9uIENhY2hlIHRoZSB3aWRnZXQgZWxlbWVudDsgZmV0Y2ggYW5hbHl0aWNzIHZhbHVlcyBvbiB0aGUgd2lkZ2V0IGVsZW1lbnQ7IHRyaWdnZXIgYW5hbHl0aWNzIG1ldGhvZHNcclxuIFx0Ki9cclxuXHRpbml0ICgpIHtcclxuXHRcdHRoaXMud2lkZ2V0RWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1hbmFseXRpY3Mtd2lkZ2V0XScpO1xyXG5cdFx0aWYgKHRoaXMud2lkZ2V0RWwpIHtcclxuXHRcdFx0dGhpcy53aWRnZXROYW1lID0gdGhpcy53aWRnZXRFbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYW5hbHl0aWNzLXdpZGdldCcpO1xyXG5cdFx0XHR0aGlzLmNoYXJpdHlJZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNoYXJpdHktaWRdJykgP1xyXG5cdFx0XHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNoYXJpdHktaWRdJykuZ2V0QXR0cmlidXRlKCdkYXRhLWNoYXJpdHktaWQnKSA6ICcnO1xyXG5cdFx0XHR0aGlzLmZycElkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY2hhcml0eS1mcnBJZF0nKSA/XHJcblx0XHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY2hhcml0eS1mcnBJZF0nKS5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2hhcml0eS1mcnBJZCcpIDogJyc7XHJcblxyXG5cdFx0XHR0aGlzLnB1c2hDb25maWcoKTtcclxuXHRcdFx0dGhpcy53aWRnZXRJbml0KCk7XHJcblx0XHRcdHRoaXMuY2FyZHNJbml0KCk7XHJcblx0XHRcdHRoaXMuY2FyZEltcHJlc3Npb25zKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cdC8qKlxyXG4gXHQqIFB1c2ggdXNlciBjb25maWcgaGFzaCBbaW5jbHVkaW5nIHBhcmVudCBwYWdlJ3MgcmVmZXJyZXJdIHRvIGtpc3NtZXRyaWNzIGFzIHByb3BlcnR5XHJcbiBcdCovXHJcblx0cHVzaENvbmZpZyAoKSB7XHJcblx0XHR0aGlzLnNlbmREYXRhKFsnc2V0JywgdGhpcy5jb25maWdIYXNoXSk7XHJcblx0fVxyXG5cdC8qKlxyXG4gXHQqIEluaXRpYWxpc2Ugd2lkZ2V0IGFuYWx5dGljcyBkYXRhIGhhc2hcclxuIFx0KiBAZGVzY3JpcHRpb24gQ3JlYXRlIGEgaGFzaCBvZiB3aWRnZXQtbGV2ZWwgYW5hbHl0aWNzIHZhbHVlczsgc3RvcmUgaXQgb24gdGhlIHdpZGdldCBlbGVtZW50O1xyXG4gXHQqIHJlZ2lzdGVyIGNsaWNrIGxpc3RlbmVyIG9uIHdpZGdldCBlbGVtZW50XHJcbiBcdCovXHJcblx0d2lkZ2V0SW5pdCAoKSB7XHJcblx0XHRsZXQgYW5hbHl0aWNzRGF0YSA9IHtcclxuXHRcdFx0cGFnZV90eXBlOiAnd2lkZ2V0JywgLy8ganNoaW50IGlnbm9yZTpsaW5lXHJcblx0XHRcdCdldmVudCc6ICdwYWdlIGNsaWNrJyxcclxuXHRcdFx0YWN0aXZpdHlfdHlwZTogdGhpcy53aWRnZXROYW1lLCAvLyBqc2hpbnQgaWdub3JlOmxpbmVcclxuXHRcdFx0Y2hhcml0eV9pZDogdGhpcy5jaGFyaXR5SWQsIC8vIGpzaGludCBpZ25vcmU6bGluZVxyXG5cdFx0XHRwYWdlX2lkOiB0aGlzLmZycElkIC8vIGpzaGludCBpZ25vcmU6bGluZVxyXG5cdFx0fTtcclxuXHRcdHRoaXMud2lkZ2V0RWwuYW5hbHl0aWNzID0gYW5hbHl0aWNzRGF0YTtcclxuXHJcblx0XHR0aGlzLndpZGdldEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCBlICkgPT4ge1xyXG5cdFx0XHR0aGlzLndpZGdldENsaWNrKCBlICk7XHJcblx0XHR9KTtcclxuXHR9XHJcblx0LyoqXHJcbiBcdCogUHVzaCBraXNzbWV0cmljcyBOT04tY2FyZCBjbGljayBldmVudHNcclxuIFx0KiBAZGVzY3JpcHRpb24gSGFuZGxlIG5vbi1jYXJkIGNsaWNrIGV2ZW50cyBvbiB0aGUgd2lkZ2V0IHVzaW5nIGV2ZW50IGRlbGVnYXRpb24uIENyZWF0ZSBjbGljayB2YWx1ZXMgaGFzaCBmb3IgdGFyZ2V0IGVsZW1lbnRzXHJcbiBcdCogYW5kIGZpcmUga2lzc21ldHJpY3MgcGFnZSBjbGljayBldmVudFxyXG4gXHQqL1xyXG4gXHR3aWRnZXRDbGljayAoIGUgKSB7XHJcblx0XHRsZXQgZXZ0ID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWFuYWx5dGljcy1ldmVudCcpO1xyXG5cdFx0aWYgKGV2dCkge1xyXG5cdFx0XHRsZXQgY2xpY2tEYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy53aWRnZXRFbC5hbmFseXRpY3MgKTtcclxuXHRcdFx0Y2xpY2tEYXRhLnN1YnR5cGUgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYW5hbHl0aWNzLXN1YnR5cGUnKTtcclxuXHRcdFx0Y2xpY2tEYXRhLmV2ZW50X3ZhbHVlID0gZXZ0OyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcclxuXHRcdFx0dGhpcy5zZW5kRGF0YShbJ3JlY29yZCcsICdwYWdlIGNsaWNrJywgY2xpY2tEYXRhXSk7XHJcblx0XHR9XHJcblx0fVxyXG5cdC8qKlxyXG4gXHQqIEluaXRpYWxpc2UgY2FyZCBhbmFseXRpY3MgZGF0YSBoYXNoXHJcbiBcdCogQGRlc2NyaXB0aW9uIEZvciBlYWNoIGNhcmQgaW4gdGhlIERPTSBjcmVhdGUgYSBjYXJkIGFuYWx5dGljcyBoYXNoIGFuZCBzdG9yZSBpdCBvbiB0aGUgY2FyZCBbaWYgbm9uZSBhbHJlYWR5IHByZXNlbnRdO1xyXG4gXHQqIGFuZCBhZGQgY2xpY2sgbGlzdG5lclxyXG4gXHQqL1xyXG4gXHRjYXJkc0luaXQgKCkge1xyXG5cdFx0bGV0IGNhcmRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYW5hbHl0aWNzLWNhcmRdJyk7XHJcblx0XHRsZXQgc2VsZiA9IHRoaXM7XHJcblxyXG5cdFx0W10uc2xpY2UuY2FsbCggY2FyZHMgKS5mb3JFYWNoKCggY2FyZCwgaW5kZXggKSA9PiB7XHJcblx0XHRcdGNhcmQuc2V0QXR0cmlidXRlKCdkYXRhLWNhcmQtcmFuaycsIGluZGV4KTtcclxuXHRcdFx0aWYgKCAhY2FyZC5hbmFseXRpY3MgKSB7XHJcblx0XHRcdFx0bGV0IGFuYWx5dGljc0RhdGEgPSB7fTtcclxuXHRcdFx0XHRsZXQgY2hhcml0eUlkID0gY2FyZC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2hhcml0eS1pZCcpIHx8ICcnO1xyXG5cdFx0XHRcdGxldCBhY3Rpdml0eUlkID0gY2FyZC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYWN0aXZpdHktaWQnKSB8fCAnJztcclxuXHRcdFx0XHRsZXQgY2FyZFJhbmsgPSBjYXJkLmdldEF0dHJpYnV0ZSgnZGF0YS1jYXJkLXJhbmsnKTtcclxuXHRcdFx0XHRsZXQgY2FyZEZycElkID0gY2FyZC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZnJwLWlkJykgfHwgJyc7XHJcblx0XHRcdFx0bGV0IGNhcmRVcmwgPSBjYXJkLmdldEF0dHJpYnV0ZSgnZGF0YS1jYXJkLXVybCcpIHx8ICcnO1xyXG5cclxuXHRcdFx0XHRhbmFseXRpY3NEYXRhLnBhZ2VfdHlwZSA9ICd3aWRnZXQnOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcclxuXHRcdFx0XHRhbmFseXRpY3NEYXRhLmNhcmRfaWQgPSBgJHt0aGlzLndpZGdldE5hbWV9LSR7Y2hhcml0eUlkfS0ke2FjdGl2aXR5SWR9YDsgLy8ganNoaW50IGlnbm9yZTpsaW5lXHJcblx0XHRcdFx0YW5hbHl0aWNzRGF0YS5jYXJkX3JhbmsgPSBjYXJkUmFuazsgLy8ganNoaW50IGlnbm9yZTpsaW5lXHJcblx0XHRcdFx0YW5hbHl0aWNzRGF0YS5hY3Rpdml0eV9pZCA9IGFjdGl2aXR5SWQ7IC8vIGpzaGludCBpZ25vcmU6bGluZVxyXG5cdFx0XHRcdGFuYWx5dGljc0RhdGEuYWN0aXZpdHlfdHlwZSA9IHRoaXMud2lkZ2V0TmFtZTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXHJcblx0XHRcdFx0YW5hbHl0aWNzRGF0YS5jaGFyaXR5X2lkID0gY2hhcml0eUlkOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcclxuXHRcdFx0XHRhbmFseXRpY3NEYXRhLnBhZ2VfaWQgPSBjYXJkRnJwSWQ7IC8vIGpzaGludCBpZ25vcmU6bGluZVxyXG5cdFx0XHRcdGFuYWx5dGljc0RhdGEuY2FyZF91cmwgPSBjYXJkVXJsOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcclxuXHJcblx0XHRcdFx0Y2FyZC5hbmFseXRpY3MgPSBhbmFseXRpY3NEYXRhO1xyXG5cclxuXHRcdFx0XHRjYXJkLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCBlICkge1xyXG5cdFx0XHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0XHRcdHNlbGYuY2FyZENsaWNrKCBlLCB0aGlzICk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHQvKipcclxuIFx0KiBQdXNoIGtpc3NtZXRyaWNzIGNhcmQgaW1wcmVzc2lvbnNcclxuIFx0KiBAZGVzY3JpcHRpb24gRm9yIGFsbCB2aXNpYmxlIGNhcmRzLCBjcmVhdGUgYSBjYXJkIGltcHJlc3Npb24gYW5hbHl0aWNzIGhhc2ggYW5kIGZpcmUgYSBraXNzbWV0cmljcyBjYXJkIGltcHJlc3Npb24gZXZlbnRcclxuIFx0Ki9cclxuXHRjYXJkSW1wcmVzc2lvbnMgKCkge1xyXG5cdFx0bGV0IGNhcmRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYW5hbHl0aWNzLWNhcmRdOm5vdChbZGF0YS1oaWRkZW5dKScpO1xyXG5cdFx0W10uc2xpY2UuY2FsbCggY2FyZHMgKS5mb3JFYWNoKCggY2FyZCApID0+IHtcclxuXHRcdFx0bGV0IGltcHJlc3Npb25EYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgY2FyZC5hbmFseXRpY3MgKTtcclxuXHRcdFx0aW1wcmVzc2lvbkRhdGEuZXZlbnQgPSAnaW1wcmVzc2lvbic7XHJcblx0XHRcdGltcHJlc3Npb25EYXRhLmNhcmRfY291bnQgPSBjYXJkcy5sZW5ndGg7IC8vIGpzaGludCBpZ25vcmU6bGluZVxyXG5cdFx0XHR0aGlzLnNlbmREYXRhKFsncmVjb3JkJywgJ2ltcHJlc3Npb24nLCBpbXByZXNzaW9uRGF0YV0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cdC8qKlxyXG4gXHQqIFB1c2gga2lzc21ldHJpY3MgY2FyZCBjbGljayBldmVudHNcclxuIFx0KiBAZGVzY3JpcHRpb24gSGFuZGxlIGNhcmQgY2xpY2sgZXZlbnRzIG9uIHRoZSB3aWRnZXQgdXNpbmcgZXZlbnQgZGVsZWdhdGlvbi4gQ3JlYXRlIGEgY2FyZCBjbGljayB2YWx1ZXMgaGFzaCBmb3IgdGFyZWd0IGNhcmRcclxuIFx0KiBhbmQgZmlyZSBhIGtpc3NtZXRyaWNzIGNhcmQgY2xpY2sgZXZlbnRcclxuIFx0Ki9cclxuXHRjYXJkQ2xpY2sgKCBlLCBjYXJkICkge1xyXG5cdFx0bGV0IGV2dCA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1hbmFseXRpY3MtZXZlbnQnKTtcclxuXHRcdGlmIChldnQpIHtcclxuXHRcdFx0bGV0IGNsaWNrRGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGNhcmQuYW5hbHl0aWNzKTtcclxuXHRcdFx0Y2xpY2tEYXRhLmV2ZW50ID0gJ2NhcmQgY2xpY2snO1xyXG5cdFx0XHRjbGlja0RhdGEuc3VidHlwZSA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1hbmFseXRpY3Mtc3VidHlwZScpO1xyXG5cdFx0XHRjbGlja0RhdGEuZXZlbnRfdmFsdWUgPSBldnQ7IC8vIGpzaGludCBpZ25vcmU6bGluZVxyXG5cdFx0XHRjbGlja0RhdGEuY2FyZF9jb3VudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWFuYWx5dGljcy1jYXJkXTpub3QoW2RhdGEtaGlkZGVuXSknKS5sZW5ndGg7IC8vIGpzaGludCBpZ25vcmU6bGluZVxyXG5cdFx0XHR0aGlzLnNlbmREYXRhKFsncmVjb3JkJywgJ2NhcmQgY2xpY2snLCBjbGlja0RhdGFdKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFB1c2ggZGF0YSB0byB0cmFja2Vyc1xyXG5cdCAqL1xyXG5cdHNlbmREYXRhKGRhdGEpIHtcclxuXHRcdHRoaXMuY2FsbGJhY2tzLmZvckVhY2goY2IgPT4gY2IoZGF0YSkpO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQW5hbHl0aWNzO1xyXG4iXX0=\n},{}],50:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n\tvalue: true\n});\n\nvar _createClass = (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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _utilsQueryString = require('../utils/queryString');\n\n/**\r\n * Create a widget model\r\n * @classdesc Create a model object \r\n * @param {Object} options.widget. The widget instance [required]\r\n * @param {Boolean} options.isPaginated. Whether the model consumes a paginated REST API\r\n * @class Stores the returned model data as this.$model. Stores model URL parameters as this.params. For paginated models\r\n * stores the collection as this.collection, stores the last fetched API page as this.lastReturnedPage; sets apiPage size to default 12\r\n * sets pageNum and pageSize params on the model API [initialises to page 1]\r\n */\nvar Promise = require('es6-promise').Promise;\nvar xhr = require('xhr');\n\nvar Model = (function () {\n\tfunction Model() {\n\t\tvar _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n\t\tvar widget = _ref.widget;\n\t\tvar url = _ref.url;\n\t\tvar params = _ref.params;\n\t\tvar isPaginated = _ref.isPaginated;\n\t\tvar apiPageSize = _ref.apiPageSize;\n\t\tvar collectionPath = _ref.collectionPath;\n\n\t\t_classCallCheck(this, Model);\n\n\t\tthis.widget = widget;\n\t\tthis.url = url;\n\t\tif (!this.widget || !this.url) {\n\t\t\treturn;\n\t\t}\n\t\tthis.$model = {};\n\t\tthis.params = this.params || {};\n\t\tthis.setParams(params);\n\n\t\tthis.isPaginated = isPaginated === undefined ? false : isPaginated;\n\t\tif (this.isPaginated) {\n\t\t\tthis.collectionPath = collectionPath;\n\t\t\tthis.lastReturnedPage = [];\n\t\t\tthis.collection = [];\n\t\t\tthis.apiPageSize = apiPageSize || 12;\n\t\t\tthis.currentApiPage = 1;\n\t\t\tthis.lastPage = undefined;\n\t\t\tthis.setParams({\n\t\t\t\tpageNum: this.currentApiPage,\n\t\t\t\tpageSize: this.apiPageSize\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\r\n * Get the model data from the REST API [NON-paginated REST API only]\r\n * @description Fetch the data from the REST API and store as this.$model\r\n */\n\n\t_createClass(Model, [{\n\t\tkey: 'getModel',\n\t\tvalue: function getModel() {\n\t\t\tvar _this = this;\n\n\t\t\treturn new Promise(function (resolve) {\n\t\t\t\t_this.fetchData(_this.url).then(function (data) {\n\t\t\t\t\t_this.$model = data;\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t/**\r\n * Get the next API page from the REST API [paginated REST API only]\r\n * @description Fetch the next API page from the server, based on the last page fetched. Store the returned data\r\n * as this.$model; add the returned paginated data as to the end of this.collection\r\n * @returns {Object} Promise object\r\n */\n\t}, {\n\t\tkey: 'getNextPage',\n\t\tvalue: function getNextPage(reset) {\n\t\t\tvar _this2 = this;\n\n\t\t\treturn new Promise(function (resolve) {\n\t\t\t\t_this2.params.pageNum = _this2.currentApiPage++;\n\t\t\t\t_this2.getModel().then(function () {\n\t\t\t\t\tif (_this2.$model[_this2.collectionPath].length === 0) {\n\t\t\t\t\t\t_this2.lastPage = _this2.currentApiPage;\n\t\t\t\t\t}\n\t\t\t\t\tif (reset) {\n\t\t\t\t\t\t_this2.collection = [];\n\t\t\t\t\t}\n\t\t\t\t\t_this2.lastReturnedPage = _this2.$model[_this2.collectionPath];\n\t\t\t\t\t_this2.collection = _this2.collection.concat(_this2.lastReturnedPage);\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t/**\r\n * Add supplied parameters to the model URL\r\n * @description Convert hash of parameters to query string and append to model url\r\n */\n\t}, {\n\t\tkey: 'setParams',\n\t\tvalue: function setParams(obj) {\n\t\t\tthis.params = Object.assign(this.params, obj);\n\t\t}\n\n\t\t/**\r\n * Fetch data from the server\r\n * @description Make a get request for the REST API data\r\n * @returns {Object} Promise object\r\n */\n\t}, {\n\t\tkey: 'fetchData',\n\t\tvalue: function fetchData(url) {\n\t\t\tvar qs = (0, _utilsQueryString.queryStringStringify)(this.params);\n\t\t\t//TODO: remove & if no qs\n\t\t\turl += '?format=json&' + qs;\n\t\t\treturn new Promise(function (resolve, reject) {\n\t\t\t\txhr({\n\t\t\t\t\turi: url,\n\t\t\t\t\tuseXDR: true\n\t\t\t\t}, function (error, response, body) {\n\t\t\t\t\tif (response.statusCode === 200 && body !== undefined) {\n\t\t\t\t\t\tresolve(JSON.parse(body));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tparent.postMessage('error=widgetfetchdatafailed', document.referrer);\n\n\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\treject(Error(error));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treject();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t/**\r\n * Refresh the local model and collection\r\n * @description Re-fetch and overwrite the local model and collection with [latest] server data\r\n * @returns {Object} Promise object\r\n */\n\t}, {\n\t\tkey: 'refresh',\n\t\tvalue: function refresh() {\n\t\t\tvar _this3 = this;\n\n\t\t\treturn new Promise(function (resolve) {\n\t\t\t\tif (_this3.isPaginated) {\n\t\t\t\t\t_this3.collection = [];\n\t\t\t\t\t_this3.currentApiPage = 1;\n\t\t\t\t\t_this3.getNextPage(true).then(function () {\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t_this3.getModel().then(function () {\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}]);\n\n\treturn Model;\n})();\n\nexports['default'] = Model;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2NoYXJpdHktZXZlbnRzLWJvYXJkL2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9Nb2RlbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7Ozs7Ozs7Ozs7Z0NBSXdCLHNCQUFzQjs7Ozs7Ozs7Ozs7QUFGM0QsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUM3QyxJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7O0lBWW5CLEtBQUs7QUFDRSxVQURQLEtBQUssR0FDNkU7bUVBQUwsRUFBRTs7TUFBcEUsTUFBTSxRQUFOLE1BQU07TUFBRSxHQUFHLFFBQUgsR0FBRztNQUFFLE1BQU0sUUFBTixNQUFNO01BQUUsV0FBVyxRQUFYLFdBQVc7TUFBRSxXQUFXLFFBQVgsV0FBVztNQUFFLGNBQWMsUUFBZCxjQUFjOzt3QkFEeEUsS0FBSzs7QUFFVCxNQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUNyQixNQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNmLE1BQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRztBQUNoQyxVQUFPO0dBQ1A7QUFDRCxNQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNqQixNQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO0FBQ2hDLE1BQUksQ0FBQyxTQUFTLENBQUUsTUFBTSxDQUFFLENBQUM7O0FBRXpCLE1BQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxLQUFLLFNBQVMsR0FBRyxLQUFLLEdBQUcsV0FBVyxDQUFDO0FBQ25FLE1BQUssSUFBSSxDQUFDLFdBQVcsRUFBRztBQUN2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LG1CQUFHOzs7QUFDVixVQUFPLElBQUksT0FBTyxDQUFFLFVBQUUsT0FBTyxFQUFNO0FBQ2xDLFFBQUssT0FBSyxXQUFXLEVBQUc7QUFDdkIsWUFBSyxVQUFVLEdBQUcsRUFBRSxDQUFDO0FBQ3JCLFlBQUssY0FBYyxHQUFHLENBQUMsQ0FBQztBQUN4QixZQUFLLFdBQVcsQ0FBRSxJQUFJLENBQUUsQ0FBQyxJQUFJLENBQUUsWUFBTTtBQUNwQyxhQUFPLEVBQUUsQ0FBQztNQUNWLENBQUMsQ0FBQztLQUNILE1BQU07QUFDTixZQUFLLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBRSxZQUFNO0FBQzNCLGFBQU8sRUFBRSxDQUFDO01BQ1YsQ0FBQyxDQUFDO0tBQ0g7SUFDRCxDQUFDLENBQUM7R0FDSDs7O1FBakhJLEtBQUs7OztxQkFvSEksS0FBSyIsImZpbGUiOiJDOi90ZW1wL0dHLkZyb250RW5kLldpZGdldHMvd2lkZ2V0cy9jaGFyaXR5LWV2ZW50cy1ib2FyZC9ib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy9mcmFtZXdvcmsvTW9kZWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XHJcblxyXG5sZXQgUHJvbWlzZSA9IHJlcXVpcmUoJ2VzNi1wcm9taXNlJykuUHJvbWlzZTtcclxubGV0IHhociA9IHJlcXVpcmUoJ3hocicpO1xyXG5pbXBvcnQgeyBxdWVyeVN0cmluZ1N0cmluZ2lmeSB9IGZyb20gJy4uL3V0aWxzL3F1ZXJ5U3RyaW5nJztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYSB3aWRnZXQgbW9kZWxcclxuICogQGNsYXNzZGVzYyBDcmVhdGUgYSBtb2RlbCBvYmplY3QgXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLndpZGdldC4gVGhlIHdpZGdldCBpbnN0YW5jZSBbcmVxdWlyZWRdXHJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb3B0aW9ucy5pc1BhZ2luYXRlZC4gV2hldGhlciB0aGUgbW9kZWwgY29uc3VtZXMgYSBwYWdpbmF0ZWQgUkVTVCBBUElcclxuICogQGNsYXNzIFN0b3JlcyB0aGUgcmV0dXJuZWQgbW9kZWwgZGF0YSBhcyB0aGlzLiRtb2RlbC4gU3RvcmVzIG1vZGVsIFVSTCBwYXJhbWV0ZXJzIGFzIHRoaXMucGFyYW1zLiBGb3IgcGFnaW5hdGVkIG1vZGVsc1xyXG4gKiBzdG9yZXMgdGhlIGNvbGxlY3Rpb24gYXMgdGhpcy5jb2xsZWN0aW9uLCBzdG9yZXMgdGhlIGxhc3QgZmV0Y2hlZCBBUEkgcGFnZSBhcyB0aGlzLmxhc3RSZXR1cm5lZFBhZ2U7IHNldHMgYXBpUGFnZSBzaXplIHRvIGRlZmF1bHQgMTJcclxuICogc2V0cyBwYWdlTnVtIGFuZCBwYWdlU2l6ZSBwYXJhbXMgb24gdGhlIG1vZGVsIEFQSSBbaW5pdGlhbGlzZXMgdG8gcGFnZSAxXVxyXG4gKi9cclxuY2xhc3MgTW9kZWwge1xyXG5cdGNvbnN0cnVjdG9yICggeyB3aWRnZXQsIHVybCwgcGFyYW1zLCBpc1BhZ2luYXRlZCwgYXBpUGFnZVNpemUsIGNvbGxlY3Rpb25QYXRoIH0gPSB7fSApIHtcclxuXHRcdHRoaXMud2lkZ2V0ID0gd2lkZ2V0O1xyXG5cdFx0dGhpcy51cmwgPSB1cmw7XHJcblx0XHRpZiAoICF0aGlzLndpZGdldCB8fCAhdGhpcy51cmwgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdHRoaXMuJG1vZGVsID0ge307XHJcblx0XHR0aGlzLnBhcmFtcyA9IHRoaXMucGFyYW1zIHx8IHt9O1xyXG5cdFx0dGhpcy5zZXRQYXJhbXMoIHBhcmFtcyApO1xyXG5cclxuXHRcdHRoaXMuaXNQYWdpbmF0ZWQgPSBpc1BhZ2luYXRlZCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBpc1BhZ2luYXRlZDtcclxuXHRcdGlmICggdGhpcy5pc1BhZ2luYXRlZCApIHtcclxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uUGF0aCA9IGNvbGxlY3Rpb25QYXRoO1xyXG5cdFx0XHR0aGlzLmxhc3RSZXR1cm5lZFBhZ2UgPSBbXTtcclxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uID0gW107XHJcblx0XHRcdHRoaXMuYXBpUGFnZVNpemUgPSBhcGlQYWdlU2l6ZSB8fCAxMjtcclxuXHRcdFx0dGhpcy5jdXJyZW50QXBpUGFnZSA9IDE7XHJcblx0XHRcdHRoaXMubGFzdFBhZ2UgPSB1bmRlZmluZWQ7XHJcblx0XHRcdHRoaXMuc2V0UGFyYW1zKHtcclxuXHRcdFx0XHRwYWdlTnVtOiB0aGlzLmN1cnJlbnRBcGlQYWdlLFxyXG5cdFx0XHRcdHBhZ2VTaXplOiB0aGlzLmFwaVBhZ2VTaXplIFxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHR9XHJcblx0LyoqXHJcblx0ICogR2V0IHRoZSBtb2RlbCBkYXRhIGZyb20gdGhlIFJFU1QgQVBJIFtOT04tcGFnaW5hdGVkIFJFU1QgQVBJIG9ubHldXHJcblx0ICogQGRlc2NyaXB0aW9uIEZldGNoIHRoZSBkYXRhIGZyb20gdGhlIFJFU1QgQVBJIGFuZCBzdG9yZSBhcyB0aGlzLiRtb2RlbFxyXG5cdCAqL1xyXG5cdGdldE1vZGVsICgpIHtcclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSggKCByZXNvbHZlICkgPT4ge1xyXG5cdFx0XHR0aGlzLmZldGNoRGF0YSggdGhpcy51cmwgKS50aGVuKCAoIGRhdGEgKSA9PiB7XHJcblx0XHRcdFx0dGhpcy4kbW9kZWwgPSBkYXRhO1xyXG5cdFx0XHRcdHJlc29sdmUoKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogR2V0IHRoZSBuZXh0IEFQSSBwYWdlIGZyb20gdGhlIFJFU1QgQVBJIFtwYWdpbmF0ZWQgUkVTVCBBUEkgb25seV1cclxuXHQgKiBAZGVzY3JpcHRpb24gRmV0Y2ggdGhlIG5leHQgQVBJIHBhZ2UgZnJvbSB0aGUgc2VydmVyLCBiYXNlZCBvbiB0aGUgbGFzdCBwYWdlIGZldGNoZWQuIFN0b3JlIHRoZSByZXR1cm5lZCBkYXRhXHJcblx0ICogYXMgdGhpcy4kbW9kZWw7IGFkZCB0aGUgcmV0dXJuZWQgcGFnaW5hdGVkIGRhdGEgYXMgdG8gdGhlIGVuZCBvZiB0aGlzLmNvbGxlY3Rpb25cclxuXHQgKiBAcmV0dXJucyB7T2JqZWN0fSBQcm9taXNlIG9iamVjdFxyXG5cdCAqL1xyXG5cdGdldE5leHRQYWdlICggcmVzZXQgKSB7XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoICggcmVzb2x2ZSApID0+IHtcclxuXHRcdFx0dGhpcy5wYXJhbXMucGFnZU51bSA9IHRoaXMuY3VycmVudEFwaVBhZ2UrKztcclxuXHRcdFx0dGhpcy5nZXRNb2RlbCgpLnRoZW4oICgpID0+IHtcclxuXHRcdFx0XHRpZiAoIHRoaXMuJG1vZGVsW3RoaXMuY29sbGVjdGlvblBhdGhdLmxlbmd0aCA9PT0gMCApIHtcclxuXHRcdFx0XHRcdHRoaXMubGFzdFBhZ2UgPSB0aGlzLmN1cnJlbnRBcGlQYWdlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoIHJlc2V0ICkge1xyXG5cdFx0XHRcdFx0dGhpcy5jb2xsZWN0aW9uID0gW107XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHRoaXMubGFzdFJldHVybmVkUGFnZSA9IHRoaXMuJG1vZGVsW3RoaXMuY29sbGVjdGlvblBhdGhdO1xyXG5cdFx0XHRcdHRoaXMuY29sbGVjdGlvbiA9IHRoaXMuY29sbGVjdGlvbi5jb25jYXQoIHRoaXMubGFzdFJldHVybmVkUGFnZSApO1xyXG5cdFx0XHRcdHJlc29sdmUoKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcdFxyXG5cdH1cclxuXHQvKipcclxuXHQgKiBBZGQgc3VwcGxpZWQgcGFyYW1ldGVycyB0byB0aGUgbW9kZWwgVVJMXHJcblx0ICogQGRlc2NyaXB0aW9uIENvbnZlcnQgaGFzaCBvZiBwYXJhbWV0ZXJzIHRvIHF1ZXJ5IHN0cmluZyBhbmQgYXBwZW5kIHRvIG1vZGVsIHVybFxyXG5cdCAqL1xyXG5cdHNldFBhcmFtcyAoIG9iaiApIHtcclxuXHRcdHRoaXMucGFyYW1zID0gT2JqZWN0LmFzc2lnbiggdGhpcy5wYXJhbXMsIG9iaiApO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBGZXRjaCBkYXRhIGZyb20gdGhlIHNlcnZlclxyXG5cdCAqIEBkZXNjcmlwdGlvbiBNYWtlIGEgZ2V0IHJlcXVlc3QgZm9yIHRoZSBSRVNUIEFQSSBkYXRhXHJcblx0ICogQHJldHVybnMge09iamVjdH0gUHJvbWlzZSBvYmplY3RcclxuXHQgKi9cclxuXHRmZXRjaERhdGEgKCB1cmwgKSB7XHJcblx0XHRsZXQgcXMgPSBxdWVyeVN0cmluZ1N0cmluZ2lmeSggdGhpcy5wYXJhbXMgKTtcclxuXHRcdC8vVE9ETzogcmVtb3ZlICYgaWYgbm8gcXNcclxuXHRcdHVybCArPSBgP2Zvcm1hdD1qc29uJiR7cXN9YDtcclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiggcmVzb2x2ZSwgcmVqZWN0ICkge1xyXG5cdFx0XHR4aHIoe1xyXG5cdFx0XHRcdHVyaTogdXJsLFxyXG5cdFx0XHRcdHVzZVhEUjogdHJ1ZSxcclxuXHRcdFx0fSwgZnVuY3Rpb24gKCBlcnJvciwgcmVzcG9uc2UsIGJvZHkgKSB7XHJcblx0XHRcdFx0aWYgKCByZXNwb25zZS5zdGF0dXNDb2RlID09PSAyMDAgJiYgYm9keSAhPT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHRcdFx0cmVzb2x2ZSggSlNPTi5wYXJzZShib2R5KSApO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRwYXJlbnQucG9zdE1lc3NhZ2UoJ2Vycm9yPXdpZGdldGZldGNoZGF0YWZhaWxlZCcsIGRvY3VtZW50LnJlZmVycmVyKTtcclxuXHJcblx0XHRcdFx0XHRpZihlcnJvcikge1xyXG5cdFx0XHRcdFx0XHRyZWplY3QoIEVycm9yKCBlcnJvciApICk7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRyZWplY3QoKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFJlZnJlc2ggdGhlIGxvY2FsIG1vZGVsIGFuZCBjb2xsZWN0aW9uXHJcblx0ICogQGRlc2NyaXB0aW9uIFJlLWZldGNoIGFuZCBvdmVyd3JpdGUgdGhlIGxvY2FsIG1vZGVsIGFuZCBjb2xsZWN0aW9uIHdpdGggW2xhdGVzdF0gc2VydmVyIGRhdGFcclxuXHQgKiBAcmV0dXJucyB7T2JqZWN0fSBQcm9taXNlIG9iamVjdFxyXG5cdCAqL1xyXG5cdHJlZnJlc2ggKCkge1xyXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKCAoIHJlc29sdmUgKSA9PiB7IFxyXG5cdFx0XHRpZiAoIHRoaXMuaXNQYWdpbmF0ZWQgKSB7XHJcblx0XHRcdFx0dGhpcy5jb2xsZWN0aW9uID0gW107XHJcblx0XHRcdFx0dGhpcy5jdXJyZW50QXBpUGFnZSA9IDE7XHJcblx0XHRcdFx0dGhpcy5nZXROZXh0UGFnZSggdHJ1ZSApLnRoZW4oICgpID0+IHtcclxuXHRcdFx0XHRcdHJlc29sdmUoKTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLmdldE1vZGVsKCkudGhlbiggKCkgPT4ge1xyXG5cdFx0XHRcdFx0cmVzb2x2ZSgpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE1vZGVsOyJdfQ==\n},{\"../utils/queryString\":54,\"es6-promise\":24,\"xhr\":42}],51:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n\tvalue: true\n});\n\nvar _createClass = (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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _HandlebarsHandlebars = require('../../Handlebars/handlebars');\n\nvar _HandlebarsHandlebars2 = _interopRequireDefault(_HandlebarsHandlebars);\n\n/**\r\n * Create a widget view\r\n * @classdesc Create a view object \r\n * @param {Object} options.widget. The widget instance [required]\r\n * @param {Number} options.pollInterval. Interval in millseconds to auto-refresh the view's data\r\n * @param {String} options.pollTrigger. CSS selector for element to click-trigger a refresh of the view's data\r\n * @class Set view instance properties and initialise view\r\n */\n\nvar View = (function () {\n\tfunction View() {\n\t\tvar _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n\t\tvar widget = _ref.widget;\n\t\tvar el = _ref.el;\n\t\tvar template = _ref.template;\n\t\tvar model = _ref.model;\n\t\tvar pollInterval = _ref.pollInterval;\n\t\tvar pollTrigger = _ref.pollTrigger;\n\n\t\t_classCallCheck(this, View);\n\n\t\tthis.widget = widget;\n\t\tthis.el = document.querySelector(el);\n\t\tthis.template = document.querySelector(template).innerHTML;\n\t\tthis.model = model;\n\t\tif (!this.widget || !this.el || !this.template) {\n\t\t\treturn;\n\t\t}\n\t\tthis.config = this.widget.config;\n\t\tthis.pollInterval = pollInterval;\n\t\tthis.pollTrigger = pollTrigger ? document.querySelector(pollTrigger) : undefined;\n\n\t\tthis.init();\n\t}\n\n\t/**\r\n \t* Initialise view\r\n \t* @description Start view model update poller; register view model update trigger\r\n \t*/\n\n\t_createClass(View, [{\n\t\tkey: 'init',\n\t\tvalue: function init() {\n\t\t\tif (this.pollInterval) {\n\t\t\t\tthis.pollAtInterval();\n\t\t\t}\n\t\t\tif (this.pollTrigger) {\n\t\t\t\tthis.registerPollTrigger();\n\t\t\t}\n\t\t}\n\n\t\t/**\r\n \t* Render the view\r\n \t* @description Render the template with supplied data and append to view's element\r\n \t*/\n\t}, {\n\t\tkey: 'render',\n\t\tvalue: function render() {\n\t\t\tvar data = arguments.length <= 0 || arguments[0] === undefined ? this.data : arguments[0];\n\n\t\t\tthis.data = data;\n\t\t\tvar template = _HandlebarsHandlebars2['default'].compile(this.template);\n\t\t\tthis.el.innerHTML = template(data);\n\t\t}\n\n\t\t/**\r\n \t* Pre-load images and reset the widget height\r\n \t* @description When some images load, the height of the widget may change and a widget.resetHeight() \r\n \t* may need to be fired. Use this function to manage the loading of these images that generate a widget \r\n \t* dimension change to ensure the widget height is adapted once the image has loaded\r\n \t* @param {String} Path to the image to load\r\n \t* @param {String} Unique css3 selector targetting the element to load the path into\r\n \t*/\n\t}, {\n\t\tkey: 'loadImage',\n\t\tvalue: function loadImage(path, el) {\n\t\t\tvar _this = this;\n\n\t\t\tvar img = new Image();\n\t\t\timg.addEventListener('load', function () {\n\t\t\t\tdocument.querySelector(el).src = path;\n\t\t\t\t_this.widget.resetHeight();\n\t\t\t});\n\t\t\timg.src = path;\n\t\t}\n\n\t\t/**\r\n \t* Refresh view with latest server data\r\n \t* @description Set control 'loading' CSS state on poll trigger; trigger a model refresh; then re-render thr view, \r\n \t* reset poll trigger CSS state, reset widget height, reset the view's carousel, initialise analytics on new cards,\r\n \t* fire new analytics card impressions\r\n \t*/\n\t}, {\n\t\tkey: 'refresh',\n\t\tvalue: function refresh() {\n\t\t\tvar _this2 = this;\n\n\t\t\tthis.pollTrigger && this.pollTrigger.classList.add('is-loading', 'is-disabled');\n\t\t\tthis.model.refresh().then(function () {\n\t\t\t\t_this2.render();\n\t\t\t\t_this2.pollTrigger && _this2.pollTrigger.classList.remove('is-loading', 'is-disabled');\n\t\t\t\t_this2.widget.resetHeight();\n\t\t\t\t_this2.carousel && _this2.carousel.reset();\n\t\t\t\t_this2.widget.analytics.cardsInit();\n\t\t\t\t_this2.widget.analytics.cardImpressions();\n\t\t\t});\n\t\t}\n\n\t\t/**\r\n \t* Refresh view with latest server data at specified interval\r\n \t*/\n\t}, {\n\t\tkey: 'pollAtInterval',\n\t\tvalue: function pollAtInterval() {\n\t\t\tvar _this3 = this;\n\n\t\t\twindow.setInterval(function () {\n\t\t\t\t_this3.refresh();\n\t\t\t}, this.pollInterval);\n\t\t}\n\n\t\t/**\r\n \t* Register a click listener on specified DOM element to refresh view with latest server data\r\n \t*/\n\t}, {\n\t\tkey: 'registerPollTrigger',\n\t\tvalue: function registerPollTrigger() {\n\t\t\tvar _this4 = this;\n\n\t\t\tthis.pollTrigger.addEventListener('click', function () {\n\t\t\t\t_this4.refresh();\n\t\t\t});\n\t\t}\n\n\t\t/**\r\n \t* Append the next set of cards to the view [for paginated models only]\r\n \t* @description Get the view's model's next API page, render the view template with new data and append nodes to view element\r\n \t*/\n\t}, {\n\t\tkey: 'appendNextPage',\n\t\tvalue: function appendNextPage() {\n\t\t\tvar _this5 = this;\n\n\t\t\tif (!this.model.isPaginated) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn new Promise(function (resolve) {\n\t\t\t\t_this5.model.getNextPage().then(function () {\n\t\t\t\t\tvar template = _HandlebarsHandlebars2['default'].compile(_this5.template);\n\t\t\t\t\tvar frag = document.createElement('div');\n\t\t\t\t\tvar docFrag = document.createDocumentFragment();\n\t\t\t\t\tfrag.innerHTML = template({\n\t\t\t\t\t\tevents: _this5.model.lastReturnedPage\n\t\t\t\t\t});\n\t\t\t\t\t[].slice.call(frag.children).forEach(function (el) {\n\t\t\t\t\t\tdocFrag.appendChild(el);\n\t\t\t\t\t});\n\t\t\t\t\t_this5.el.appendChild(docFrag);\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}]);\n\n\treturn View;\n})();\n\nexports['default'] = View;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2NoYXJpdHktZXZlbnRzLWJvYXJkL2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9WaWV3LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7Ozs7Ozs7Ozs7O29DQUVVLDZCQUE2Qjs7Ozs7Ozs7Ozs7OztJQVU5QyxJQUFJO0FBQ0csVUFEUCxJQUFJLEdBQ3VFO21FQUFMLEVBQUU7O01BQTdELE1BQU0sUUFBTixNQUFNO01BQUUsRUFBRSxRQUFGLEVBQUU7TUFBRSxRQUFRLFFBQVIsUUFBUTtNQUFFLEtBQUssUUFBTCxLQUFLO01BQUUsWUFBWSxRQUFaLFlBQVk7TUFBRSxXQUFXLFFBQVgsV0FBVzs7d0JBRGpFLElBQUk7O0FBRVIsTUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDckIsTUFBSSxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFFLEVBQUUsQ0FBRSxDQUFDO0FBQ3ZDLE1BQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBRSxRQUFRLENBQUUsQ0FBQyxTQUFTLENBQUM7QUFDN0QsTUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDbkIsTUFBSyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRztBQUNqRCxVQUFPO0dBQ1A7QUFDRCxNQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQ2pDLE1BQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0FBQ2pDLE1BQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUUsV0FBVyxDQUFFLEdBQUcsU0FBUyxDQUFDOztBQUVu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LEtBQUssQ0FBQyxnQkFBZ0I7TUFDbkMsQ0FBQyxDQUFDO0FBQ0gsT0FBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBRSxDQUFDLE9BQU8sQ0FBQyxVQUFFLEVBQUUsRUFBTTtBQUNoRCxhQUFPLENBQUMsV0FBVyxDQUFFLEVBQUUsQ0FBRSxDQUFDO01BQzFCLENBQUMsQ0FBQztBQUNILFlBQUssRUFBRSxDQUFDLFdBQVcsQ0FBRSxPQUFPLENBQUUsQ0FBQztBQUMvQixZQUFPLEVBQUUsQ0FBQztLQUNWLENBQUMsQ0FBQztJQUNILENBQUMsQ0FBQztHQUNIOzs7UUE1R0ksSUFBSTs7O3FCQStHSyxJQUFJIiwiZmlsZSI6IkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2NoYXJpdHktZXZlbnRzLWJvYXJkL2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9WaWV3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xyXG5cclxuaW1wb3J0IEhhbmRsZWJhcnMgZnJvbSAnLi4vLi4vSGFuZGxlYmFycy9oYW5kbGViYXJzJztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYSB3aWRnZXQgdmlld1xyXG4gKiBAY2xhc3NkZXNjIENyZWF0ZSBhIHZpZXcgb2JqZWN0IFxyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy53aWRnZXQuIFRoZSB3aWRnZXQgaW5zdGFuY2UgW3JlcXVpcmVkXVxyXG4gKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5wb2xsSW50ZXJ2YWwuIEludGVydmFsIGluIG1pbGxzZWNvbmRzIHRvIGF1dG8tcmVmcmVzaCB0aGUgdmlldydzIGRhdGFcclxuICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMucG9sbFRyaWdnZXIuIENTUyBzZWxlY3RvciBmb3IgZWxlbWVudCB0byBjbGljay10cmlnZ2VyIGEgcmVmcmVzaCBvZiB0aGUgdmlldydzIGRhdGFcclxuICogQGNsYXNzIFNldCB2aWV3IGluc3RhbmNlIHByb3BlcnRpZXMgYW5kIGluaXRpYWxpc2Ugdmlld1xyXG4gKi9cclxuY2xhc3MgVmlldyB7XHJcblx0Y29uc3RydWN0b3IgKCB7IHdpZGdldCwgZWwsIHRlbXBsYXRlLCBtb2RlbCwgcG9sbEludGVydmFsLCBwb2xsVHJpZ2dlciB9ID0ge30gKSB7XHJcblx0XHR0aGlzLndpZGdldCA9IHdpZGdldDtcclxuXHRcdHRoaXMuZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCBlbCApO1xyXG5cdFx0dGhpcy50ZW1wbGF0ZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIHRlbXBsYXRlICkuaW5uZXJIVE1MO1xyXG5cdFx0dGhpcy5tb2RlbCA9IG1vZGVsO1xyXG5cdFx0aWYgKCAhdGhpcy53aWRnZXQgfHwgIXRoaXMuZWwgfHwgIXRoaXMudGVtcGxhdGUgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdHRoaXMuY29uZmlnID0gdGhpcy53aWRnZXQuY29uZmlnO1xyXG5cdFx0dGhpcy5wb2xsSW50ZXJ2YWwgPSBwb2xsSW50ZXJ2YWw7XHJcblx0XHR0aGlzLnBvbGxUcmlnZ2VyID0gcG9sbFRyaWdnZXIgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCBwb2xsVHJpZ2dlciApIDogdW5kZWZpbmVkO1xyXG5cdFx0XHJcblx0XHR0aGlzLmluaXQoKTtcclxuXHR9XHJcblx0LyoqXHJcbiBcdCogSW5pdGlhbGlzZSB2aWV3XHJcbiBcdCogQGRlc2NyaXB0aW9uIFN0YXJ0IHZpZXcgbW9kZWwgdXBkYXRlIHBvbGxlcjsgcmVnaXN0ZXIgdmlldyBtb2RlbCB1cGRhdGUgdHJpZ2dlclxyXG4gXHQqL1xyXG4gXHRpbml0ICgpIHtcclxuXHRcdGlmICggdGhpcy5wb2xsSW50ZXJ2YWwgKSB7XHJcblx0XHRcdHRoaXMucG9sbEF0SW50ZXJ2YWwoKTtcclxuXHRcdH1cclxuXHRcdGlmICggdGhpcy5wb2xsVHJpZ2dlciApIHtcclxuXHRcdFx0dGhpcy5yZWdpc3RlclBvbGxUcmlnZ2VyKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cdC8qKlxyXG4gXHQqIFJlbmRlciB0aGUgdmlld1xyXG4gXHQqIEBkZXNjcmlwdGlvbiBSZW5kZXIgdGhlIHRlbXBsYXRlIHdpdGggc3VwcGxpZWQgZGF0YSBhbmQgYXBwZW5kIHRvIHZpZXcncyBlbGVtZW50XHJcbiBcdCovXHJcblx0cmVuZGVyICggZGF0YT10aGlzLmRhdGEgKSB7XHJcblx0XHR0aGlzLmRhdGEgPSBkYXRhO1xyXG5cdFx0bGV0IHRlbXBsYXRlID0gSGFuZGxlYmFycy5jb21waWxlKCB0aGlzLnRlbXBsYXRlICk7XHJcblx0XHR0aGlzLmVsLmlubmVySFRNTCA9IHRlbXBsYXRlKCBkYXRhICk7XHJcblx0fVxyXG5cdC8qKlxyXG4gXHQqIFByZS1sb2FkIGltYWdlcyBhbmQgcmVzZXQgdGhlIHdpZGdldCBoZWlnaHRcclxuIFx0KiBAZGVzY3JpcHRpb24gV2hlbiBzb21lIGltYWdlcyBsb2FkLCB0aGUgaGVpZ2h0IG9mIHRoZSB3aWRnZXQgbWF5IGNoYW5nZSBhbmQgYSB3aWRnZXQucmVzZXRIZWlnaHQoKSBcclxuIFx0KiBtYXkgbmVlZCB0byBiZSBmaXJlZC4gVXNlIHRoaXMgZnVuY3Rpb24gdG8gbWFuYWdlIHRoZSBsb2FkaW5nIG9mIHRoZXNlIGltYWdlcyB0aGF0IGdlbmVyYXRlIGEgd2lkZ2V0IFxyXG4gXHQqIGRpbWVuc2lvbiBjaGFuZ2UgdG8gZW5zdXJlIHRoZSB3aWRnZXQgaGVpZ2h0IGlzIGFkYXB0ZWQgb25jZSB0aGUgaW1hZ2UgaGFzIGxvYWRlZFxyXG4gXHQqIEBwYXJhbSB7U3RyaW5nfSBQYXRoIHRvIHRoZSBpbWFnZSB0byBsb2FkXHJcbiBcdCogQHBhcmFtIHtTdHJpbmd9IFVuaXF1ZSBjc3MzIHNlbGVjdG9yIHRhcmdldHRpbmcgdGhlIDxpbWcgLz4gZWxlbWVudCB0byBsb2FkIHRoZSBwYXRoIGludG9cclxuIFx0Ki9cclxuXHRsb2FkSW1hZ2UgKCBwYXRoLCBlbCApIHtcclxuXHRcdGxldCBpbWcgPSBuZXcgSW1hZ2UoKTtcclxuXHRcdGltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4gIHsgXHJcblx0XHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIGVsICkuc3JjID0gcGF0aDtcclxuXHRcdFx0dGhpcy53aWRnZXQucmVzZXRIZWlnaHQoKTtcclxuXHRcdH0pO1xyXG5cdFx0aW1nLnNyYyA9IHBhdGg7XHJcblx0fVxyXG5cdC8qKlxyXG4gXHQqIFJlZnJlc2ggdmlldyB3aXRoIGxhdGVzdCBzZXJ2ZXIgZGF0YVxyXG4gXHQqIEBkZXNjcmlwdGlvbiBTZXQgY29udHJvbCAnbG9hZGluZycgQ1NTIHN0YXRlIG9uIHBvbGwgdHJpZ2dlcjsgdHJpZ2dlciBhIG1vZGVsIHJlZnJlc2g7IHRoZW4gcmUtcmVuZGVyIHRociB2aWV3LCBcclxuIFx0KiByZXNldCBwb2xsIHRyaWdnZXIgQ1NTIHN0YXRlLCByZXNldCB3aWRnZXQgaGVpZ2h0LCByZXNldCB0aGUgdmlldydzIGNhcm91c2VsLCBpbml0aWFsaXNlIGFuYWx5dGljcyBvbiBuZXcgY2FyZHMsXHJcbiBcdCogZmlyZSBuZXcgYW5hbHl0aWNzIGNhcmQgaW1wcmVzc2lvbnNcclxuIFx0Ki9cclxuXHRyZWZyZXNoICgpIHtcclxuXHRcdHRoaXMucG9sbFRyaWdnZXIgJiYgdGhpcy5wb2xsVHJpZ2dlci5jbGFzc0xpc3QuYWRkKCdpcy1sb2FkaW5nJywgJ2lzLWRpc2FibGVkJyk7IFxyXG5cdFx0dGhpcy5tb2RlbC5yZWZyZXNoKCkudGhlbiggKCkgPT4ge1xyXG5cdFx0XHR0aGlzLnJlbmRlcigpO1xyXG5cdFx0XHR0aGlzLnBvbGxUcmlnZ2VyICYmIHRoaXMucG9sbFRyaWdnZXIuY2xhc3NMaXN0LnJlbW92ZSgnaXMtbG9hZGluZycsICdpcy1kaXNhYmxlZCcpO1xyXG5cdFx0XHR0aGlzLndpZGdldC5yZXNldEhlaWdodCgpO1xyXG5cdFx0XHR0aGlzLmNhcm91c2VsICYmIHRoaXMuY2Fyb3VzZWwucmVzZXQoKTtcclxuXHRcdFx0dGhpcy53aWRnZXQuYW5hbHl0aWNzLmNhcmRzSW5pdCgpO1xyXG5cdFx0XHR0aGlzLndpZGdldC5hbmFseXRpY3MuY2FyZEltcHJlc3Npb25zKCk7XHRcclxuXHRcdH0pO1x0XHJcblx0fVxyXG5cdC8qKlxyXG4gXHQqIFJlZnJlc2ggdmlldyB3aXRoIGxhdGVzdCBzZXJ2ZXIgZGF0YSBhdCBzcGVjaWZpZWQgaW50ZXJ2YWxcclxuIFx0Ki9cclxuXHRwb2xsQXRJbnRlcnZhbCAoKSB7XHJcblx0XHR3aW5kb3cuc2V0SW50ZXJ2YWwoICgpID0+IHtcclxuXHRcdFx0dGhpcy5yZWZyZXNoKCk7XHJcblx0XHR9LCB0aGlzLnBvbGxJbnRlcnZhbCApO1xyXG5cdH1cclxuXHQvKipcclxuIFx0KiBSZWdpc3RlciBhIGNsaWNrIGxpc3RlbmVyIG9uIHNwZWNpZmllZCBET00gZWxlbWVudCB0byByZWZyZXNoIHZpZXcgd2l0aCBsYXRlc3Qgc2VydmVyIGRhdGFcclxuIFx0Ki9cclxuXHRyZWdpc3RlclBvbGxUcmlnZ2VyICgpIHtcclxuXHRcdHRoaXMucG9sbFRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XHJcblx0XHRcdHRoaXMucmVmcmVzaCgpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cdC8qKlxyXG4gXHQqIEFwcGVuZCB0aGUgbmV4dCBzZXQgb2YgY2FyZHMgdG8gdGhlIHZpZXcgW2ZvciBwYWdpbmF0ZWQgbW9kZWxzIG9ubHldXHJcbiBcdCogQGRlc2NyaXB0aW9uIEdldCB0aGUgdmlldydzIG1vZGVsJ3MgbmV4dCBBUEkgcGFnZSwgcmVuZGVyIHRoZSB2aWV3IHRlbXBsYXRlIHdpdGggbmV3IGRhdGEgYW5kIGFwcGVuZCBub2RlcyB0byB2aWV3IGVsZW1lbnRcclxuIFx0Ki9cclxuXHRhcHBlbmROZXh0UGFnZSAoKSB7XHJcblx0XHRpZiAoICF0aGlzLm1vZGVsLmlzUGFnaW5hdGVkICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKCByZXNvbHZlICkgPT4ge1xyXG5cdFx0XHR0aGlzLm1vZGVsLmdldE5leHRQYWdlKCkudGhlbiggKCkgPT4ge1xyXG5cdFx0XHRcdGxldCB0ZW1wbGF0ZSA9IEhhbmRsZWJhcnMuY29tcGlsZSggdGhpcy50ZW1wbGF0ZSApO1xyXG5cdFx0XHRcdGxldCBmcmFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicgKTtcclxuXHRcdFx0XHRsZXQgZG9jRnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuXHRcdFx0XHRmcmFnLmlubmVySFRNTCA9IHRlbXBsYXRlKHtcclxuXHRcdFx0XHRcdGV2ZW50czogdGhpcy5tb2RlbC5sYXN0UmV0dXJuZWRQYWdlXHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0W10uc2xpY2UuY2FsbCggZnJhZy5jaGlsZHJlbiApLmZvckVhY2goKCBlbCApID0+IHtcclxuXHRcdFx0XHRcdGRvY0ZyYWcuYXBwZW5kQ2hpbGQoIGVsICk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0dGhpcy5lbC5hcHBlbmRDaGlsZCggZG9jRnJhZyApO1xyXG5cdFx0XHRcdHJlc29sdmUoKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFZpZXc7Il19\n},{\"../../Handlebars/handlebars\":44}],52:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n\tvalue: true\n});\n\nvar _createClass = (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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _utilsQueryString = require('../utils/queryString');\n\nvar _utilsDebounce = require('../utils/debounce');\n\nvar _utilsDebounce2 = _interopRequireDefault(_utilsDebounce);\n\nvar _Analytics = require('./Analytics');\n\nvar _Analytics2 = _interopRequireDefault(_Analytics);\n\n/**\r\n * Create a widget\r\n * @classdesc Create a widget object\r\n * @param {Boolean} options.widgetContainer. The widget container element\r\n * @param {Boolean} options.responsive. Whether the widget is responsive\r\n * @param {Boolean} options.userConfig. Whether the widget has user configurable settings\r\n * @class Set widget instance properties and initialise widget\r\n */\n\nvar Widget = (function () {\n\tfunction Widget() {\n\t\tvar _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n\t\tvar widgetContainer = _ref.widgetContainer;\n\t\tvar responsive = _ref.responsive;\n\t\tvar userConfig = _ref.userConfig;\n\t\tvar widgetName = _ref.widgetName;\n\n\t\t_classCallCheck(this, Widget);\n\n\t\tthis.widgetContainer = widgetContainer || document.querySelector('[data-widget-container]');\n\t\tthis.responsive = responsive === undefined ? true : responsive;\n\t\tthis.userConfig = userConfig === undefined ? true : userConfig;\n\t\tthis.widgetName = widgetName || '';\n\t\tthis.appId = '437bca42';\n\t\tif (!this.widgetName) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\t/**\r\n \t* Initialise the widget\r\n \t* @description Make the widget responsive; fetch and cache on the widget instance the user config hash\r\n \t*/\n\n\t_createClass(Widget, [{\n\t\tkey: 'init',\n\t\tvalue: function init() {\n\t\t\tthis.responsive && this.makeResponsive(this.widgetContainer);\n\t\t\tthis.config = this.userConfig ? this.getUserConfig() : undefined;\n\t\t}\n\n\t\t/**\r\n \t* Initialise widget analytics\r\n \t* @description Create a new instance of Analytics class for caching on the widget instance\r\n \t* @returns {Object} Analytics instance\r\n \t*/\n\t}, {\n\t\tkey: 'initAnalytics',\n\t\tvalue: function initAnalytics() {\n\t\t\tvar callbacks = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];\n\n\t\t\tif (window._kmq && window._kmq.push) {\n\t\t\t\tcallbacks.push(function () {\n\t\t\t\t\tvar _window$_kmq;\n\n\t\t\t\t\treturn (_window$_kmq = window._kmq).push.apply(_window$_kmq, arguments);\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn new _Analytics2['default']({\n\t\t\t\tconfigHash: this.config,\n\t\t\t\twidget: this,\n\t\t\t\tcallbacks: callbacks\n\t\t\t});\n\t\t}\n\n\t\t/**\r\n \t* Create a hash map of user config from widget query string\r\n \t* @returns {Object} hash map of user config\r\n \t*/\n\t}, {\n\t\tkey: 'getUserConfig',\n\t\tvalue: function getUserConfig() {\n\t\t\treturn (0, _utilsQueryString.queryStringParse)(location.search);\n\t\t}\n\n\t\t/**\r\n \t* Make widget responsive to its current content on win resize\r\n \t* @param {Element} The widget container\r\n \t*/\n\t}, {\n\t\tkey: 'makeResponsive',\n\t\tvalue: function makeResponsive(widgetContainer) {\n\t\t\tvar _this = this;\n\n\t\t\twindow.addEventListener('resize', (0, _utilsDebounce2['default'])(function () {\n\t\t\t\treturn _this.postContentHeight(widgetContainer);\n\t\t\t}, 250));\n\t\t}\n\n\t\t/**\r\n \t* Post the current scroll height value of an element to the parent window\r\n \t* @param {Element} The elemnt whose height to send\r\n \t* @param {String} URL of parent to post message to; defaults to document.referrer\r\n \t*/\n\t}, {\n\t\tkey: 'postContentHeight',\n\t\tvalue: function postContentHeight(el) {\n\t\t\tvar url = arguments.length <= 1 || arguments[1] === undefined ? document.referrer : arguments[1];\n\n\t\t\t//Don't post to self\n\t\t\tif (window === window.top || window.location === window.top.location) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tparent.postMessage('widgetName=' + this.widgetName + '&contentHeight=' + Math.max(el.scrollHeight, el.offsetHeight), url);\n\t\t}\n\n\t\t/**\r\n \t* Reset the height of the widget\r\n \t*/\n\t}, {\n\t\tkey: 'resetHeight',\n\t\tvalue: function resetHeight() {\n\t\t\tthis.postContentHeight(this.widgetContainer);\n\t\t}\n\t}]);\n\n\treturn Widget;\n})();\n\nexports['default'] = Widget;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2NoYXJpdHktZXZlbnRzLWJvYXJkL2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9XaWRnZXQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOzs7Ozs7Ozs7Ozs7Z0NBRW9CLHNCQUFzQjs7NkJBQ2xDLG1CQUFtQjs7Ozt5QkFDbEIsYUFBYTs7Ozs7Ozs7Ozs7OztJQVU3QixNQUFNO0FBQ0EsVUFETixNQUFNLEdBQ2lFO21FQUFMLEVBQUU7O01BQTFELGVBQWUsUUFBZixlQUFlO01BQUUsVUFBVSxRQUFWLFVBQVU7TUFBRSxVQUFVLFFBQVYsVUFBVTtNQUFFLFVBQVUsUUFBVixVQUFVOzt3QkFEN0QsTUFBTTs7QUFFVixNQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsSUFBSSxRQUFRLENBQUMsYUFBYSxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDNUYsTUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLEtBQUssU0FBUyxHQUFHLElBQUksR0FBRyxVQUFVLENBQUM7QUFDL0QsTUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLEtBQUssU0FBUyxHQUFHLElBQUksR0FBRyxVQUFVLENBQUM7QUFDL0QsTUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLElBQUksRUFBRSxDQUFDO0FBQ25DLE1BQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDO0FBQ3hCLE1BQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFHO0FBQ3ZCLFVBQU87R0FDUDtFQUNEOzs7Ozs7O2NBVkksTUFBTTs7U0FlTixnQkFBRztBQUNQLE9BQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBRSxJQUFJLENBQUMsZUFBZSxDQUFFLENBQUM7QUFDL0QsT0FBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsR0FBRyxTQUFTLENBQUM7R0FDakU7Ozs7Ozs7OztTQU1hLHlCQUFpQjtPQUFoQixTQUFTLHlEQUFHLEVBQUU7O0FBQzVCLE9BQUksTUFBTSxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtBQUNwQyxhQUFTLENBQUMsSUFBSSxDQUFDOzs7WUFBYSxnQkFBQSxNQUFNLENBQUMsSUFBSSxFQUFDLElBQUksTUFBQSx5QkFBUztLQUFBLENBQUMsQ0FBQztJQUN2RDtBQUNELFVBQU8sMkJBQWM7QUFDcEIsY0FBVSxFQUFFLElBQUksQ0FBQyxNQUFNO0FBQ3ZCLFVBQU0sRUFBRSxJQUFJO0FBQ1osYUFBUyxFQUFFLFNBQVM7SUFDcEIsQ0FBQyxDQUFDO0dBQ0g7Ozs7Ozs7O1NBS2EseUJBQUc7QUFDaEIsVUFBTyx3Q0FBa0IsUUFBUSxDQUFDLE1BQU0sQ0FBRSxDQUFDO0dBQzNDOzs7Ozs7OztTQUtjLHdCQUFFLGVBQWUsRUFBRzs7O0FBQ2xDLFNBQU0sQ0FBQyxnQkFBZ0IsQ0FBRSxRQUFRLEVBQUUsZ0NBQVU7V0FBTSxNQUFLLGlCQUFpQixDQUFDLGVBQWUsQ0FBQztJQUFBLEVBQUUsR0FBRyxDQUFDLENBQUUsQ0FBQztHQUNuRzs7Ozs7Ozs7O1NBTWlCLDJCQUFFLEVBQUUsRUFBMEI7T0FBeEIsR0FBRyx5REFBQyxRQUFRLENBQUMsUUFBUTs7O0FBRTVDLE9BQUssTUFBTSxLQUFLLE1BQU0sQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRztBQUN2RSxXQUFPO0lBQ1A7QUFDRCxTQUFNLENBQUMsV0FBVyxpQkFBZ0IsSUFBSSxDQUFDLFVBQVUsdUJBQWtCLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUksR0FBRyxDQUFFLENBQUM7R0FDdkg7Ozs7Ozs7U0FJVyx1QkFBRztBQUNkLE9BQUksQ0FBQyxpQkFBaUIsQ0FBRSxJQUFJLENBQUMsZUFBZSxDQUFFLENBQUM7R0FDL0M7OztRQWpFSSxNQUFNOzs7cUJBb0VHLE1BQU0iLCJmaWxlIjoiQzovdGVtcC9HRy5Gcm9udEVuZC5XaWRnZXRzL3dpZGdldHMvY2hhcml0eS1ldmVudHMtYm9hcmQvYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvZnJhbWV3b3JrL1dpZGdldC5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcclxuXHJcbmltcG9ydCB7IHF1ZXJ5U3RyaW5nUGFyc2UgfSBmcm9tICcuLi91dGlscy9xdWVyeVN0cmluZyc7XHJcbmltcG9ydCBkZWJvdW5jZSBmcm9tICcuLi91dGlscy9kZWJvdW5jZSc7XHJcbmltcG9ydCBBbmFseXRpY3MgZnJvbSAnLi9BbmFseXRpY3MnO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhIHdpZGdldFxyXG4gKiBAY2xhc3NkZXNjIENyZWF0ZSBhIHdpZGdldCBvYmplY3RcclxuICogQHBhcmFtIHtCb29sZWFufSBvcHRpb25zLndpZGdldENvbnRhaW5lci4gVGhlIHdpZGdldCBjb250YWluZXIgZWxlbWVudFxyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9wdGlvbnMucmVzcG9uc2l2ZS4gV2hldGhlciB0aGUgd2lkZ2V0IGlzIHJlc3BvbnNpdmVcclxuICogQHBhcmFtIHtCb29sZWFufSBvcHRpb25zLnVzZXJDb25maWcuIFdoZXRoZXIgdGhlIHdpZGdldCBoYXMgdXNlciBjb25maWd1cmFibGUgc2V0dGluZ3NcclxuICogQGNsYXNzIFNldCB3aWRnZXQgaW5zdGFuY2UgcHJvcGVydGllcyBhbmQgaW5pdGlhbGlzZSB3aWRnZXRcclxuICovXHJcbmNsYXNzIFdpZGdldCB7XHJcblx0Y29uc3RydWN0b3IoIHsgd2lkZ2V0Q29udGFpbmVyLCByZXNwb25zaXZlLCB1c2VyQ29uZmlnLCB3aWRnZXROYW1lIH0gPSB7fSApIHtcclxuXHRcdHRoaXMud2lkZ2V0Q29udGFpbmVyID0gd2lkZ2V0Q29udGFpbmVyIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXdpZGdldC1jb250YWluZXJdJyk7XHJcblx0XHR0aGlzLnJlc3BvbnNpdmUgPSByZXNwb25zaXZlID09PSB1bmRlZmluZWQgPyB0cnVlIDogcmVzcG9uc2l2ZTtcclxuXHRcdHRoaXMudXNlckNvbmZpZyA9IHVzZXJDb25maWcgPT09IHVuZGVmaW5lZCA/IHRydWUgOiB1c2VyQ29uZmlnO1xyXG5cdFx0dGhpcy53aWRnZXROYW1lID0gd2lkZ2V0TmFtZSB8fCAnJztcclxuXHRcdHRoaXMuYXBwSWQgPSAnNDM3YmNhNDInO1xyXG5cdFx0aWYgKCAhdGhpcy53aWRnZXROYW1lICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0fVxyXG5cdC8qKlxyXG4gXHQqIEluaXRpYWxpc2UgdGhlIHdpZGdldFxyXG4gXHQqIEBkZXNjcmlwdGlvbiBNYWtlIHRoZSB3aWRnZXQgcmVzcG9uc2l2ZTsgZmV0Y2ggYW5kIGNhY2hlIG9uIHRoZSB3aWRnZXQgaW5zdGFuY2UgdGhlIHVzZXIgY29uZmlnIGhhc2hcclxuIFx0Ki9cclxuXHRpbml0ICgpIHtcclxuXHRcdHRoaXMucmVzcG9uc2l2ZSAmJiB0aGlzLm1ha2VSZXNwb25zaXZlKCB0aGlzLndpZGdldENvbnRhaW5lciApO1xyXG5cdFx0dGhpcy5jb25maWcgPSB0aGlzLnVzZXJDb25maWcgPyB0aGlzLmdldFVzZXJDb25maWcoKSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblx0LyoqXHJcbiBcdCogSW5pdGlhbGlzZSB3aWRnZXQgYW5hbHl0aWNzXHJcbiBcdCogQGRlc2NyaXB0aW9uIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBBbmFseXRpY3MgY2xhc3MgZm9yIGNhY2hpbmcgb24gdGhlIHdpZGdldCBpbnN0YW5jZVxyXG4gXHQqIEByZXR1cm5zIHtPYmplY3R9IEFuYWx5dGljcyBpbnN0YW5jZVxyXG4gXHQqL1xyXG5cdGluaXRBbmFseXRpY3MgKGNhbGxiYWNrcyA9IFtdKSB7XHJcblx0XHRpZiAod2luZG93Ll9rbXEgJiYgd2luZG93Ll9rbXEucHVzaCkge1xyXG5cdFx0XHRjYWxsYmFja3MucHVzaCgoLi4uZGF0YSkgPT4gd2luZG93Ll9rbXEucHVzaCguLi5kYXRhKSk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbmV3IEFuYWx5dGljcyh7XHJcblx0XHRcdGNvbmZpZ0hhc2g6IHRoaXMuY29uZmlnLFxyXG5cdFx0XHR3aWRnZXQ6IHRoaXMsXHJcblx0XHRcdGNhbGxiYWNrczogY2FsbGJhY2tzXHJcblx0XHR9KTtcclxuXHR9XHJcblx0LyoqXHJcbiBcdCogQ3JlYXRlIGEgaGFzaCBtYXAgb2YgdXNlciBjb25maWcgZnJvbSB3aWRnZXQgcXVlcnkgc3RyaW5nXHJcbiBcdCogQHJldHVybnMge09iamVjdH0gaGFzaCBtYXAgb2YgdXNlciBjb25maWdcclxuIFx0Ki9cclxuXHRnZXRVc2VyQ29uZmlnICgpIHtcclxuXHRcdHJldHVybiBxdWVyeVN0cmluZ1BhcnNlKCBsb2NhdGlvbi5zZWFyY2ggKTtcclxuXHR9XHJcblx0LyoqXHJcbiBcdCogTWFrZSB3aWRnZXQgcmVzcG9uc2l2ZSB0byBpdHMgY3VycmVudCBjb250ZW50IG9uIHdpbiByZXNpemVcclxuIFx0KiBAcGFyYW0ge0VsZW1lbnR9IFRoZSB3aWRnZXQgY29udGFpbmVyXHJcbiBcdCovXHJcblx0bWFrZVJlc3BvbnNpdmUgKCB3aWRnZXRDb250YWluZXIgKSB7XHJcblx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ3Jlc2l6ZScsIGRlYm91bmNlKCAoKSA9PiB0aGlzLnBvc3RDb250ZW50SGVpZ2h0KHdpZGdldENvbnRhaW5lciksIDI1MCkgKTtcclxuXHR9XHJcblx0LyoqXHJcbiBcdCogUG9zdCB0aGUgY3VycmVudCBzY3JvbGwgaGVpZ2h0IHZhbHVlIG9mIGFuIGVsZW1lbnQgdG8gdGhlIHBhcmVudCB3aW5kb3dcclxuIFx0KiBAcGFyYW0ge0VsZW1lbnR9IFRoZSBlbGVtbnQgd2hvc2UgaGVpZ2h0IHRvIHNlbmRcclxuIFx0KiBAcGFyYW0ge1N0cmluZ30gVVJMIG9mIHBhcmVudCB0byBwb3N0IG1lc3NhZ2UgdG87IGRlZmF1bHRzIHRvIGRvY3VtZW50LnJlZmVycmVyXHJcbiBcdCovXHJcblx0cG9zdENvbnRlbnRIZWlnaHQgKCBlbCwgdXJsPWRvY3VtZW50LnJlZmVycmVyICkge1xyXG5cdFx0Ly9Eb24ndCBwb3N0IHRvIHNlbGZcclxuXHRcdGlmICggd2luZG93ID09PSB3aW5kb3cudG9wIHx8IHdpbmRvdy5sb2NhdGlvbiA9PT0gd2luZG93LnRvcC5sb2NhdGlvbiApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0cGFyZW50LnBvc3RNZXNzYWdlKCBgd2lkZ2V0TmFtZT0ke3RoaXMud2lkZ2V0TmFtZX0mY29udGVudEhlaWdodD0ke01hdGgubWF4KGVsLnNjcm9sbEhlaWdodCwgZWwub2Zmc2V0SGVpZ2h0KX1gLCB1cmwgKTtcclxuXHR9XHJcblx0LyoqXHJcbiBcdCogUmVzZXQgdGhlIGhlaWdodCBvZiB0aGUgd2lkZ2V0XHJcbiBcdCovXHJcblx0cmVzZXRIZWlnaHQgKCkge1xyXG5cdFx0dGhpcy5wb3N0Q29udGVudEhlaWdodCggdGhpcy53aWRnZXRDb250YWluZXIgKTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFdpZGdldDtcclxuIl19\n},{\"../utils/debounce\":53,\"../utils/queryString\":54,\"./Analytics\":49}],53:[function(require,module,exports){\n'use strict';\n/**\r\n * Debounces a function call\r\n * @param {function} The function to debounce\r\n * @param {number} Duration of debounce\r\n * @param {boolean} If true, trigger function on leading edge\r\n * @return {function} The debouncer function\r\n */\nObject.defineProperty(exports, '__esModule', {\n\tvalue: true\n});\nfunction debounce(func, wait, immediate) {\n\tvar timeout = undefined;\n\treturn function () {\n\t\tvar context = this,\n\t\t args = arguments;\n\t\tvar later = function later() {\n\t\t\ttimeout = null;\n\t\t\tif (!immediate) {\n\t\t\t\tfunc.apply(context, args);\n\t\t\t}\n\t\t};\n\t\tvar callNow = immediate && !timeout;\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(later, wait);\n\t\tif (callNow) {\n\t\t\tfunc.apply(context, args);\n\t\t}\n\t};\n}\n\nexports['default'] = debounce;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2NoYXJpdHktZXZlbnRzLWJvYXJkL2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL3V0aWxzL2RlYm91bmNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7Ozs7Ozs7Ozs7QUFRYixTQUFTLFFBQVEsQ0FBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRztBQUMxQyxLQUFJLE9BQU8sWUFBQSxDQUFDO0FBQ1osUUFBTyxZQUFXO0FBQ2pCLE1BQUksT0FBTyxHQUFHLElBQUk7TUFBRSxJQUFJLEdBQUcsU0FBUyxDQUFDO0FBQ3JDLE1BQUksS0FBSyxHQUFHLFNBQVIsS0FBSyxHQUFjO0FBQ3RCLFVBQU8sR0FBRyxJQUFJLENBQUM7QUFDZixPQUFLLENBQUMsU0FBUyxFQUFHO0FBQ2pCLFFBQUksQ0FBQyxLQUFLLENBQUUsT0FBTyxFQUFFLElBQUksQ0FBRSxDQUFDO0lBQzVCO0dBQ0QsQ0FBQztBQUNGLE1BQUksT0FBTyxHQUFHLFNBQVMsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUNwQyxjQUFZLENBQUUsT0FBTyxDQUFFLENBQUM7QUFDeEIsU0FBTyxHQUFHLFVBQVUsQ0FBRSxLQUFLLEVBQUUsSUFBSSxDQUFFLENBQUM7QUFDcEMsTUFBSyxPQUFPLEVBQUc7QUFDZCxPQUFJLENBQUMsS0FBSyxDQUFFLE9BQU8sRUFBRSxJQUFJLENBQUUsQ0FBQztHQUM1QjtFQUNELENBQUM7Q0FDRjs7cUJBRWMsUUFBUSIsImZpbGUiOiJDOi90ZW1wL0dHLkZyb250RW5kLldpZGdldHMvd2lkZ2V0cy9jaGFyaXR5LWV2ZW50cy1ib2FyZC9ib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy91dGlscy9kZWJvdW5jZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcclxuLyoqXHJcbiAqIERlYm91bmNlcyBhIGZ1bmN0aW9uIGNhbGxcclxuICogQHBhcmFtIHtmdW5jdGlvbn0gVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBEdXJhdGlvbiBvZiBkZWJvdW5jZVxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IElmIHRydWUsIHRyaWdnZXIgZnVuY3Rpb24gb24gbGVhZGluZyBlZGdlXHJcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufSBUaGUgZGVib3VuY2VyIGZ1bmN0aW9uXHJcbiAqL1xyXG5mdW5jdGlvbiBkZWJvdW5jZSggZnVuYywgd2FpdCwgaW1tZWRpYXRlICkge1xyXG5cdGxldCB0aW1lb3V0O1xyXG5cdHJldHVybiBmdW5jdGlvbigpIHtcclxuXHRcdGxldCBjb250ZXh0ID0gdGhpcywgYXJncyA9IGFyZ3VtZW50cztcclxuXHRcdGxldCBsYXRlciA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR0aW1lb3V0ID0gbnVsbDtcclxuXHRcdFx0aWYgKCAhaW1tZWRpYXRlICkgeyBcclxuXHRcdFx0XHRmdW5jLmFwcGx5KCBjb250ZXh0LCBhcmdzICk7XHJcblx0XHRcdH1cdFxyXG5cdFx0fTtcclxuXHRcdGxldCBjYWxsTm93ID0gaW1tZWRpYXRlICYmICF0aW1lb3V0O1xyXG5cdFx0Y2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7XHJcblx0XHR0aW1lb3V0ID0gc2V0VGltZW91dCggbGF0ZXIsIHdhaXQgKTtcclxuXHRcdGlmICggY2FsbE5vdyApIHsgXHJcblx0XHRcdGZ1bmMuYXBwbHkoIGNvbnRleHQsIGFyZ3MgKTtcclxuXHRcdH1cclxuXHR9O1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBkZWJvdW5jZTsiXX0=\n},{}],54:[function(require,module,exports){\n'use strict';\n/**\r\n * Create a hash map of query string key-value pairs.\r\n * @param {string} location.search string to hash\r\n * @returns {object} hash map of query string key-value pairs\r\n * @author by Sindre Sorhus\r\n * @license MIT License\r\n * @see https://github.com/sindresorhus/query-string\r\n */\nObject.defineProperty(exports, '__esModule', {\n\tvalue: true\n});\nexports.queryStringParse = queryStringParse;\nexports.queryStringStringify = queryStringStringify;\n\nfunction queryStringParse(str) {\n\tif (typeof str !== 'string') {\n\t\treturn {};\n\t}\n\n\tstr = str.trim().replace(/^(\\?|#)/, '');\n\n\tif (!str) {\n\t\treturn {};\n\t}\n\n\treturn str.trim().split('&').reduce(function (ret, param) {\n\t\tvar parts = param.replace(/\\+/g, ' ').split('=');\n\t\tvar key = parts[0];\n\t\tvar val = parts[1];\n\n\t\tkey = decodeURIComponent(key);\n\t\t// missing `=` should be `null`:\n\t\t// http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters\n\t\tval = val === undefined ? null : decodeURIComponent(val);\n\n\t\tif (!ret.hasOwnProperty(key)) {\n\t\t\tret[key] = val;\n\t\t} else if (Array.isArray(ret[key])) {\n\t\t\tret[key].push(val);\n\t\t} else {\n\t\t\tret[key] = [ret[key], val];\n\t\t}\n\n\t\treturn ret;\n\t}, {});\n}\n\n/**\r\n * Create query string of key-value pairs from a hash map.\r\n * @param {obj} hashmap source\r\n * @returns {string} queryString\r\n * @author by Sindre Sorhus\r\n * @license MIT License\r\n * @see https://github.com/sindresorhus/query-string\r\n */\n\nfunction queryStringStringify(obj) {\n\treturn obj ? Object.keys(obj).sort().map(function (key) {\n\t\tvar val = obj[key];\n\n\t\tif (Array.isArray(val)) {\n\t\t\treturn val.sort().map(function (val2) {\n\t\t\t\treturn encodeURIComponent(key) + '=' + encodeURIComponent(val2);\n\t\t\t}).join('&');\n\t\t}\n\n\t\treturn encodeURIComponent(key) + '=' + encodeURIComponent(val);\n\t}).join('&') : '';\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2NoYXJpdHktZXZlbnRzLWJvYXJkL2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL3V0aWxzL3F1ZXJ5U3RyaW5nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBU04sU0FBUyxnQkFBZ0IsQ0FBRyxHQUFHLEVBQUc7QUFDeEMsS0FBSyxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUc7QUFDOUIsU0FBTyxFQUFFLENBQUM7RUFDVjs7QUFFRCxJQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7O0FBRXhDLEtBQUssQ0FBQyxHQUFHLEVBQUc7QUFDWCxTQUFPLEVBQUUsQ0FBQztFQUNWOztBQUVELFFBQU8sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBRSxHQUFHLENBQUUsQ0FBQyxNQUFNLENBQUUsVUFBVyxHQUFHLEVBQUUsS0FBSyxFQUFHO0FBQzlELE1BQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBRSxHQUFHLENBQUUsQ0FBQztBQUNuRCxNQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkIsTUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUVuQixLQUFHLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7OztBQUc5QixLQUFHLEdBQUcsR0FBRyxLQUFLLFNBQVMsR0FBRyxJQUFJLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7O0FBRXpELE1BQUssQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFHO0FBQy9CLE1BQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7R0FDZixNQUFNLElBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRztBQUNyQyxNQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFFLEdBQUcsQ0FBRSxDQUFDO0dBQ3JCLE1BQU07QUFDTixNQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7R0FDM0I7O0FBRUQsU0FBTyxHQUFHLENBQUM7RUFDWCxFQUFFLEVBQUUsQ0FBRSxDQUFDO0NBQ1I7Ozs7Ozs7Ozs7O0FBVU0sU0FBUyxvQkFBb0IsQ0FBRyxHQUFHLEVBQUc7QUFDNUMsUUFBTyxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBRSxHQUFHLENBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUUsVUFBVSxHQUFHLEVBQUc7QUFDM0QsTUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztBQUVuQixNQUFLLEtBQUssQ0FBQyxPQUFPLENBQUUsR0FBRyxDQUFFLEVBQUc7QUFDM0IsVUFBTyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFFLFVBQVcsSUFBSSxFQUFHO0FBQ3hDLFdBQU8sa0JBQWtCLENBQUUsR0FBRyxDQUFFLEdBQUcsR0FBRyxHQUFHLGtCQUFrQixDQUFFLElBQUksQ0FBRSxDQUFDO0lBQ3BFLENBQUMsQ0FBQyxJQUFJLENBQUUsR0FBRyxDQUFFLENBQUM7R0FDZjs7QUFFRCxTQUFPLGtCQUFrQixDQUFFLEdBQUcsQ0FBRSxHQUFHLEdBQUcsR0FBRyxrQkFBa0IsQ0FBRSxHQUFHLENBQUUsQ0FBQztFQUNuRSxDQUFDLENBQUMsSUFBSSxDQUFFLEdBQUcsQ0FBRSxHQUFHLEVBQUUsQ0FBQztDQUNwQiIsImZpbGUiOiJDOi90ZW1wL0dHLkZyb250RW5kLldpZGdldHMvd2lkZ2V0cy9jaGFyaXR5LWV2ZW50cy1ib2FyZC9ib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy91dGlscy9xdWVyeVN0cmluZy5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcclxuLyoqXHJcbiAqIENyZWF0ZSBhIGhhc2ggbWFwIG9mIHF1ZXJ5IHN0cmluZyBrZXktdmFsdWUgcGFpcnMuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbi5zZWFyY2ggc3RyaW5nIHRvIGhhc2hcclxuICogQHJldHVybnMge29iamVjdH0gaGFzaCBtYXAgb2YgcXVlcnkgc3RyaW5nIGtleS12YWx1ZSBwYWlyc1xyXG4gKiBAYXV0aG9yIGJ5IFNpbmRyZSBTb3JodXNcclxuICogQGxpY2Vuc2UgTUlUIExpY2Vuc2VcclxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3F1ZXJ5LXN0cmluZ1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5U3RyaW5nUGFyc2UgKCBzdHIgKSB7XHJcblx0aWYgKCB0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJyApIHtcclxuXHRcdHJldHVybiB7fTtcclxuXHR9XHJcblxyXG5cdHN0ciA9IHN0ci50cmltKCkucmVwbGFjZSgvXihcXD98IykvLCAnJyk7XHJcblxyXG5cdGlmICggIXN0ciApIHtcclxuXHRcdHJldHVybiB7fTtcclxuXHR9XHJcblxyXG5cdHJldHVybiBzdHIudHJpbSgpLnNwbGl0KCAnJicgKS5yZWR1Y2UoIGZ1bmN0aW9uICggcmV0LCBwYXJhbSApIHtcclxuXHRcdGxldCBwYXJ0cyA9IHBhcmFtLnJlcGxhY2UoL1xcKy9nLCAnICcpLnNwbGl0KCAnPScgKTtcclxuXHRcdGxldCBrZXkgPSBwYXJ0c1swXTtcclxuXHRcdGxldCB2YWwgPSBwYXJ0c1sxXTtcclxuXHJcblx0XHRrZXkgPSBkZWNvZGVVUklDb21wb25lbnQoa2V5KTtcclxuXHRcdC8vIG1pc3NpbmcgYD1gIHNob3VsZCBiZSBgbnVsbGA6XHJcblx0XHQvLyBodHRwOi8vdzMub3JnL1RSLzIwMTIvV0QtdXJsLTIwMTIwNTI0LyNjb2xsZWN0LXVybC1wYXJhbWV0ZXJzXHJcblx0XHR2YWwgPSB2YWwgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZWNvZGVVUklDb21wb25lbnQodmFsKTtcclxuXHJcblx0XHRpZiAoICFyZXQuaGFzT3duUHJvcGVydHkoa2V5KSApIHtcclxuXHRcdFx0cmV0W2tleV0gPSB2YWw7XHJcblx0XHR9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KHJldFtrZXldKSApIHtcclxuXHRcdFx0cmV0W2tleV0ucHVzaCggdmFsICk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRyZXRba2V5XSA9IFtyZXRba2V5XSwgdmFsXTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmV0O1xyXG5cdH0sIHt9ICk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgcXVlcnkgc3RyaW5nIG9mIGtleS12YWx1ZSBwYWlycyBmcm9tIGEgaGFzaCBtYXAuXHJcbiAqIEBwYXJhbSB7b2JqfSBoYXNobWFwIHNvdXJjZVxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBxdWVyeVN0cmluZ1xyXG4gKiBAYXV0aG9yIGJ5IFNpbmRyZSBTb3JodXNcclxuICogQGxpY2Vuc2UgTUlUIExpY2Vuc2VcclxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3F1ZXJ5LXN0cmluZ1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5U3RyaW5nU3RyaW5naWZ5ICggb2JqICkge1xyXG5cdHJldHVybiBvYmogPyBPYmplY3Qua2V5cyggb2JqICkuc29ydCgpLm1hcCggZnVuY3Rpb24oIGtleSApIHtcclxuXHRcdGxldCB2YWwgPSBvYmpba2V5XTtcclxuXHJcblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbCApICkge1xyXG5cdFx0XHRyZXR1cm4gdmFsLnNvcnQoKS5tYXAgKGZ1bmN0aW9uICggdmFsMiApIHtcclxuXHRcdFx0XHRyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCggdmFsMiApO1xyXG5cdFx0XHR9KS5qb2luKCAnJicgKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCggdmFsICk7XHJcblx0fSkuam9pbiggJyYnICkgOiAnJztcclxufSJdfQ==\n},{}],55:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nvar _utilsQueryString = require('../../utils/queryString');\n\n/**\r\n * Write a UTM code string for appending to domain URLs\r\n * @param {String} url to append utm code to\r\n * @param {object} Hash of utm key-value pairs\r\n */\nfunction writeUtmCode(url, utmParams) {\n var utm = url.includes('?') ? '' : '?';\n utm += '&utm_source=website&utm_medium=jg-widget';\n utm += '&' + (0, _utilsQueryString.queryStringStringify)(utmParams);\n return utm;\n}\n\nexports['default'] = writeUtmCode;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2NoYXJpdHktZXZlbnRzLWJvYXJkL2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL3dpZGdldC9hbmFseXRpY3Mvd3JpdGVVdG1Db2RlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7Ozs7O2dDQUV3Qix5QkFBeUI7Ozs7Ozs7QUFPOUQsU0FBUyxZQUFZLENBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRztBQUN2QyxNQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFFLEdBQUcsQ0FBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDekMsS0FBRyw4Q0FBOEMsQ0FBQztBQUNsRCxLQUFHLFVBQVMsNENBQXNCLFNBQVMsQ0FBRSxBQUFHLENBQUM7QUFDakQsU0FBTyxHQUFHLENBQUM7Q0FDWDs7cUJBRWMsWUFBWSIsImZpbGUiOiJDOi90ZW1wL0dHLkZyb250RW5kLldpZGdldHMvd2lkZ2V0cy9jaGFyaXR5LWV2ZW50cy1ib2FyZC9ib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy93aWRnZXQvYW5hbHl0aWNzL3dyaXRlVXRtQ29kZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcclxuXHJcbmltcG9ydCB7IHF1ZXJ5U3RyaW5nU3RyaW5naWZ5IH0gZnJvbSAnLi4vLi4vdXRpbHMvcXVlcnlTdHJpbmcnO1xyXG5cclxuLyoqXHJcbiAqIFdyaXRlIGEgVVRNIGNvZGUgc3RyaW5nIGZvciBhcHBlbmRpbmcgdG8gZG9tYWluIFVSTHNcclxuICogQHBhcmFtIHtTdHJpbmd9IHVybCB0byBhcHBlbmQgdXRtIGNvZGUgdG9cclxuICogQHBhcmFtIHtvYmplY3R9IEhhc2ggb2YgdXRtIGtleS12YWx1ZSBwYWlyc1xyXG4gKi9cclxuZnVuY3Rpb24gd3JpdGVVdG1Db2RlKCB1cmwsIHV0bVBhcmFtcyApIHtcclxuXHRsZXQgdXRtID0gdXJsLmluY2x1ZGVzKCAnPycgKSA/ICcnIDogJz8nO1xyXG5cdHV0bSArPSBgJnV0bV9zb3VyY2U9d2Vic2l0ZSZ1dG1fbWVkaXVtPWpnLXdpZGdldGA7XHJcblx0dXRtICs9IGAmJHsgcXVlcnlTdHJpbmdTdHJpbmdpZnkoIHV0bVBhcmFtcyApIH1gO1xyXG5cdHJldHVybiB1dG07XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHdyaXRlVXRtQ29kZTtcclxuXHJcbiJdfQ==\n},{\"../../utils/queryString\":54}],56:[function(require,module,exports){\n'use strict';\n\n/**\r\n * Extract a UNIX timestamp from inside a string\r\n * @param {string} String from which to extract timestamp\r\n * @returns {number} Extracted timestamp, typed as integer\r\n */\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\nexports.getPrettyDay = getPrettyDay;\nexports.getPrettyMonth = getPrettyMonth;\nexports.getDateTime = getDateTime;\nexports.getPrettyDate = getPrettyDate;\nexports.getPrettyDateUTC = getPrettyDateUTC;\nexports.getPrettyYear = getPrettyYear;\nexports.getPrettyYearUTC = getPrettyYearUTC;\nfunction extractTimestamp(str) {\n var re = /\\d+/;\n return parseInt(str.match(re)[0], 10);\n}\n\n/**\r\n * Get a weekday name from a numerical weekday\r\n * @param {String} JG REST API Date string\r\n * @returns {String} Weekday name\r\n */\n\nfunction getPrettyDay(date) {\n var abbr = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1];\n\n var day = new Date(extractTimestamp(date)).getDay();\n var days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n return abbr ? days[day].substring(0, 3) : days[day];\n}\n\n/**\r\n * Get a month name from a numerical month\r\n * @param {String} JG REST API Date string\r\n * @param {Boolean} Whether to abbreviate [to first three letters]\r\n * @returns {String} Month name\r\n */\n\nfunction getPrettyMonth(date) {\n var abbr = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1];\n\n var month = new Date(extractTimestamp(date)).getMonth();\n var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n return abbr ? months[month].substring(0, 3) : months[month];\n}\n\n/**\r\n * Get a machine-readable date/time string\r\n * @param {String} JG REST API Date string\r\n * @returns {String} datetime\r\n */\n\nfunction getDateTime(date) {\n return new Date(extractTimestamp(date)).toISOString();\n}\n\n/**\r\n * Get a 2-digit date number\r\n * @param {String} JG REST API Date string\r\n * @returns {String} Date as a 2-digit string\r\n */\n\nfunction getPrettyDate(date) {\n var _date = new Date(extractTimestamp(date)).getDate() + '';\n return _date.length > 1 ? _date : '0' + _date;\n}\n\n/**\r\n * Get a 2-digit date number (UTC)\r\n * @param {String} JG REST API Date string\r\n * @returns {String} Date as a 2-digit string \r\n */\n\nfunction getPrettyDateUTC(date) {\n var _date = new Date(extractTimestamp(date)).getUTCDate() + '';\n return _date.length > 1 ? _date : '0' + _date;\n}\n\n/**\r\n * Get a year\r\n * @param {String} JG REST API Date string\r\n * @returns {Number} Year as 2- or 4-digits\r\n */\n\nfunction getPrettyYear(date) {\n var abbr = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1];\n\n var year = new Date(extractTimestamp(date)).getFullYear();\n return abbr ? year.substring(2, 4) : year;\n}\n\n/**\r\n * Get a year (UTC)\r\n * @param {String} JG REST API Date string \r\n * @param {Boolean} Abbreviate to 2-digits\r\n * @returns {Number} Year as 2- or 4-digits \r\n */\n\nfunction getPrettyYearUTC(date) {\n var abbr = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1];\n\n var year = new Date(extractTimestamp(date)).getUTCFullYear();\n return abbr ? year.substring(2, 4) : year;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2NoYXJpdHktZXZlbnRzLWJvYXJkL2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL3dpZGdldC9tb2RlbC9wcmV0dHlEYXRlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPYixTQUFTLGdCQUFnQixDQUFHLEdBQUcsRUFBRztBQUNqQyxNQUFJLEVBQUUsR0FBRyxLQUFLLENBQUM7QUFDZixTQUFPLFFBQVEsQ0FBRSxHQUFHLENBQUMsS0FBSyxDQUFFLEVBQUUsQ0FBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBRSxDQUFDO0NBQzFDOzs7Ozs7OztBQU9NLFNBQVMsWUFBWSxDQUFHLElBQUksRUFBYztNQUFaLElBQUkseURBQUMsSUFBSTs7QUFDN0MsTUFBSSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUN0RCxNQUFJLElBQUksR0FBRyxDQUNWLFFBQVEsRUFDUixRQUFRLEVBQ1IsU0FBUyxFQUNULFdBQVcsRUFDWCxVQUFVLEVBQ1YsUUFBUSxFQUNSLFVBQVUsQ0FDVixDQUFDO0FBQ0YsU0FBTyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ3BEOzs7Ozs7Ozs7QUFRTSxTQUFTLGNBQWMsQ0FBRyxJQUFJLEVBQWM7TUFBWixJQUFJLHlEQUFDLElBQUk7O0FBQy9DLE1BQUksS0FBSyxHQUFHLElBQUksSUFBSSxDQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDMUQsTUFBSSxNQUFNLEdBQUcsQ0FDUCxTQUFTLEVBQ1QsVUFBVSxFQUNWLE9BQU8sRUFDUCxPQUFPLEVBQ1AsS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sUUFBUSxFQUNSLFdBQVcsRUFDWCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsQ0FDWixDQUFDO0FBQ0wsU0FBTyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0NBQzVEOzs7Ozs7OztBQU9NLFNBQVMsV0FBVyxDQUFHLElBQUksRUFBRztBQUNwQyxTQUFPLElBQUksSUFBSSxDQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDeEQ7Ozs7Ozs7O0FBT00sU0FBUyxhQUFhLENBQUcsSUFBSSxFQUFHO0FBQ3RDLE1BQUksS0FBSyxHQUFHLElBQUksSUFBSSxDQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzlELFNBQU8sS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsS0FBSyxTQUFPLEtBQUssQUFBRSxDQUFDO0NBQzlDOzs7Ozs7OztBQU9NLFNBQVMsZ0JBQWdCLENBQUUsSUFBSSxFQUFHO0FBQ3hDLE1BQUksS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQy9ELFNBQU8sS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsS0FBSyxTQUFPLEtBQUssQUFBRSxDQUFDO0NBQzlDOzs7Ozs7OztBQU9NLFNBQVMsYUFBYSxDQUFHLElBQUksRUFBZTtNQUFiLElBQUkseURBQUMsS0FBSzs7QUFDL0MsTUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUM1RCxTQUFPLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7Q0FDMUM7Ozs7Ozs7OztBQVFNLFNBQVMsZ0JBQWdCLENBQUMsSUFBSSxFQUFjO01BQVosSUFBSSx5REFBQyxLQUFLOztBQUNoRCxNQUFJLElBQUksR0FBRyxJQUFJLElBQUksQ0FBRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBRSxDQUFDLGNBQWMsRUFBRSxDQUFDO0FBQy9ELFNBQU8sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztDQUMxQyIsImZpbGUiOiJDOi90ZW1wL0dHLkZyb250RW5kLldpZGdldHMvd2lkZ2V0cy9jaGFyaXR5LWV2ZW50cy1ib2FyZC9ib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy93aWRnZXQvbW9kZWwvcHJldHR5RGF0ZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcclxuXHJcbi8qKlxyXG4gKiBFeHRyYWN0IGEgVU5JWCB0aW1lc3RhbXAgZnJvbSBpbnNpZGUgYSBzdHJpbmdcclxuICogQHBhcmFtIHtzdHJpbmd9IFN0cmluZyBmcm9tIHdoaWNoIHRvIGV4dHJhY3QgdGltZXN0YW1wXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IEV4dHJhY3RlZCB0aW1lc3RhbXAsIHR5cGVkIGFzIGludGVnZXJcclxuICovXHJcbmZ1bmN0aW9uIGV4dHJhY3RUaW1lc3RhbXAgKCBzdHIgKSB7XHJcblx0bGV0IHJlID0gL1xcZCsvO1xyXG5cdHJldHVybiBwYXJzZUludCggc3RyLm1hdGNoKCByZSApWzBdLCAxMCApO1x0XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgYSB3ZWVrZGF5IG5hbWUgZnJvbSBhIG51bWVyaWNhbCB3ZWVrZGF5XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBKRyBSRVNUIEFQSSBEYXRlIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBXZWVrZGF5IG5hbWVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRQcmV0dHlEYXkgKCBkYXRlLCBhYmJyPXRydWUgKSB7XHJcblx0bGV0IGRheSA9IG5ldyBEYXRlKCBleHRyYWN0VGltZXN0YW1wKGRhdGUpICkuZ2V0RGF5KCk7XHJcblx0bGV0IGRheXMgPSBbXHJcblx0XHQnU3VuZGF5JyxcclxuXHRcdCdNb25kYXknLFxyXG5cdFx0J1R1ZXNkYXknLFxyXG5cdFx0J1dlZG5lc2RheScsXHJcblx0XHQnVGh1cnNkYXknLFxyXG5cdFx0J0ZyaWRheScsXHJcblx0XHQnU2F0dXJkYXknXHJcblx0XTtcclxuXHRyZXR1cm4gYWJiciA/IGRheXNbZGF5XS5zdWJzdHJpbmcoMCwgMykgOiBkYXlzW2RheV07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgYSBtb250aCBuYW1lIGZyb20gYSBudW1lcmljYWwgbW9udGhcclxuICogQHBhcmFtIHtTdHJpbmd9IEpHIFJFU1QgQVBJIERhdGUgc3RyaW5nXHJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gV2hldGhlciB0byBhYmJyZXZpYXRlIFt0byBmaXJzdCB0aHJlZSBsZXR0ZXJzXVxyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBNb250aCBuYW1lXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJldHR5TW9udGggKCBkYXRlLCBhYmJyPXRydWUgKSB7XHJcblx0bGV0IG1vbnRoID0gbmV3IERhdGUoIGV4dHJhY3RUaW1lc3RhbXAoZGF0ZSkgKS5nZXRNb250aCgpO1xyXG5cdGxldCBtb250aHMgPSBbXHJcbiAgICAgICAnSmFudWFyeScsIFxyXG4gICAgICAgJ0ZlYnJ1YXJ5JyxcclxuICAgICAgICdNYXJjaCcsXHJcbiAgICAgICAnQXByaWwnLFxyXG4gICAgICAgJ01heScsXHJcbiAgICAgICAnSnVuZScsXHJcbiAgICAgICAnSnVseScsXHJcbiAgICAgICAnQXVndXN0JyxcclxuICAgICAgICdTZXB0ZW1iZXInLFxyXG4gICAgICAgJ09jdG9iZXInLFxyXG4gICAgICAgJ05vdmVtYmVyJyxcclxuICAgICAgICdEZWNlbWJlcidcclxuICAgXHRdO1xyXG5cdHJldHVybiBhYmJyID8gbW9udGhzW21vbnRoXS5zdWJzdHJpbmcoMCwgMykgOiBtb250aHNbbW9udGhdO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0IGEgbWFjaGluZS1yZWFkYWJsZSBkYXRlL3RpbWUgc3RyaW5nXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBKRyBSRVNUIEFQSSBEYXRlIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBkYXRldGltZVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGVUaW1lICggZGF0ZSApIHtcclxuXHRyZXR1cm4gbmV3IERhdGUoIGV4dHJhY3RUaW1lc3RhbXAoZGF0ZSkgKS50b0lTT1N0cmluZygpO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0IGEgMi1kaWdpdCBkYXRlIG51bWJlclxyXG4gKiBAcGFyYW0ge1N0cmluZ30gSkcgUkVTVCBBUEkgRGF0ZSBzdHJpbmdcclxuICogQHJldHVybnMge1N0cmluZ30gRGF0ZSBhcyBhIDItZGlnaXQgc3RyaW5nXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJldHR5RGF0ZSAoIGRhdGUgKSB7XHJcblx0bGV0IF9kYXRlID0gbmV3IERhdGUoIGV4dHJhY3RUaW1lc3RhbXAoZGF0ZSkgKS5nZXREYXRlKCkgKyAnJztcclxuXHRyZXR1cm4gX2RhdGUubGVuZ3RoID4gMSA/IF9kYXRlIDogYDAke19kYXRlfWA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgYSAyLWRpZ2l0IGRhdGUgbnVtYmVyIChVVEMpXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBKRyBSRVNUIEFQSSBEYXRlIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBEYXRlIGFzIGEgMi1kaWdpdCBzdHJpbmcgXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJldHR5RGF0ZVVUQyggZGF0ZSApIHtcclxuXHRsZXQgX2RhdGUgPSBuZXcgRGF0ZShleHRyYWN0VGltZXN0YW1wKGRhdGUpKS5nZXRVVENEYXRlKCkgKyAnJztcclxuXHRyZXR1cm4gX2RhdGUubGVuZ3RoID4gMSA/IF9kYXRlIDogYDAke19kYXRlfWA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgYSB5ZWFyXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBKRyBSRVNUIEFQSSBEYXRlIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBZZWFyIGFzIDItIG9yIDQtZGlnaXRzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJldHR5WWVhciAoIGRhdGUsIGFiYnI9ZmFsc2UgKSB7XHJcblx0bGV0IHllYXIgPSBuZXcgRGF0ZSggZXh0cmFjdFRpbWVzdGFtcChkYXRlKSApLmdldEZ1bGxZZWFyKCk7XHJcblx0cmV0dXJuIGFiYnIgPyB5ZWFyLnN1YnN0cmluZygyLCA0KSA6IHllYXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgYSB5ZWFyIChVVEMpXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBKRyBSRVNUIEFQSSBEYXRlIHN0cmluZyBcclxuICogQHBhcmFtIHtCb29sZWFufSBBYmJyZXZpYXRlIHRvIDItZGlnaXRzXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFllYXIgYXMgMi0gb3IgNC1kaWdpdHMgXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJldHR5WWVhclVUQyhkYXRlLCBhYmJyPWZhbHNlKSB7XHJcblx0bGV0IHllYXIgPSBuZXcgRGF0ZSggZXh0cmFjdFRpbWVzdGFtcChkYXRlKSApLmdldFVUQ0Z1bGxZZWFyKCk7XHJcblx0cmV0dXJuIGFiYnIgPyB5ZWFyLnN1YnN0cmluZygyLCA0KSA6IHllYXI7XHJcbn0iXX0=\n},{}],57:[function(require,module,exports){\n'use strict';\n\n/**\r\n * Write a JG events url \r\n * @param {object} Either an object or array of objects to augment\r\n * @param {string} key name of the url\r\n * @param {string} Id of the charity event\r\n */\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\nexports.writeEventUrl = writeEventUrl;\n\nfunction writeEventUrl(obj, keyName, charityId) {\n var eventId = obj.id;\n if (keyName && charityId) {\n obj[keyName] = 'https://www.justgiving.com/fundraising-page/creation/?cid=' + charityId + '&eid=' + eventId;\n }\n return obj;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2NoYXJpdHktZXZlbnRzLWJvYXJkL2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL3dpZGdldC9tb2RlbC93cml0ZVVybC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFRTCxTQUFTLGFBQWEsQ0FBRyxHQUFHLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRztBQUMxRCxNQUFJLE9BQU8sR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDO0FBQ3JCLE1BQUssT0FBTyxJQUFJLFNBQVMsRUFBRztBQUMzQixPQUFHLENBQUMsT0FBTyxDQUFDLGtFQUFxRSxTQUFTLGFBQVEsT0FBTyxBQUFFLENBQUM7R0FDNUc7QUFDRCxTQUFPLEdBQUcsQ0FBQztDQUNYIiwiZmlsZSI6IkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2NoYXJpdHktZXZlbnRzLWJvYXJkL2Jvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL3dpZGdldC9tb2RlbC93cml0ZVVybC5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcclxuXHJcbi8qKlxyXG4gKiBXcml0ZSBhIEpHIGV2ZW50cyB1cmwgXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBFaXRoZXIgYW4gb2JqZWN0IG9yIGFycmF5IG9mIG9iamVjdHMgdG8gYXVnbWVudFxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IG5hbWUgb2YgdGhlIHVybFxyXG4gKiBAcGFyYW0ge3N0cmluZ30gSWQgb2YgdGhlIGNoYXJpdHkgZXZlbnRcclxuICovXHJcbiBleHBvcnQgZnVuY3Rpb24gd3JpdGVFdmVudFVybCAoIG9iaiwga2V5TmFtZSwgY2hhcml0eUlkICkge1xyXG5cdGxldCBldmVudElkID0gb2JqLmlkO1xyXG5cdGlmICgga2V5TmFtZSAmJiBjaGFyaXR5SWQgKSB7XHJcblx0XHRvYmpba2V5TmFtZV0gPSBgaHR0cHM6XFwvXFwvd3d3Lmp1c3RnaXZpbmcuY29tXFwvZnVuZHJhaXNpbmctcGFnZVxcL2NyZWF0aW9uXFwvP2NpZD0ke2NoYXJpdHlJZH0mZWlkPSR7ZXZlbnRJZH1gO1xyXG5cdH1cclxuXHRyZXR1cm4gb2JqO1xyXG59XHJcbiJdfQ==\n},{}],58:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n\tvalue: true\n});\n\nvar _createClass = (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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _justgivingWidgetFrameworkComponentsLibJsFrameworkWidget = require('justgiving-widget-framework/components/lib/js/framework/Widget');\n\nvar _justgivingWidgetFrameworkComponentsLibJsFrameworkWidget2 = _interopRequireDefault(_justgivingWidgetFrameworkComponentsLibJsFrameworkWidget);\n\nvar _justgivingWidgetFrameworkComponentsLibCarouselCarousel = require('justgiving-widget-framework/components/lib/carousel/Carousel');\n\nvar _justgivingWidgetFrameworkComponentsLibCarouselCarousel2 = _interopRequireDefault(_justgivingWidgetFrameworkComponentsLibCarouselCarousel);\n\nvar _justgivingWidgetFrameworkComponentsLibJsFrameworkModel = require('justgiving-widget-framework/components/lib/js/framework/Model');\n\nvar _justgivingWidgetFrameworkComponentsLibJsFrameworkModel2 = _interopRequireDefault(_justgivingWidgetFrameworkComponentsLibJsFrameworkModel);\n\nvar _justgivingWidgetFrameworkComponentsLibJsFrameworkView = require('justgiving-widget-framework/components/lib/js/framework/View');\n\nvar _justgivingWidgetFrameworkComponentsLibJsFrameworkView2 = _interopRequireDefault(_justgivingWidgetFrameworkComponentsLibJsFrameworkView);\n\nvar _ModelEvents = require('./ModelEvents');\n\nvar _ModelEvents2 = _interopRequireDefault(_ModelEvents);\n\n/**\r\n * Create a charity events board widget\r\n */\nvar Promise = require('es6-promise').Promise;\n\nvar CharityEventsBoard = (function (_Widget) {\n\t_inherits(CharityEventsBoard, _Widget);\n\n\tfunction CharityEventsBoard(options) {\n\t\t_classCallCheck(this, CharityEventsBoard);\n\n\t\t_get(Object.getPrototypeOf(CharityEventsBoard.prototype), 'constructor', this).call(this, options);\n\t\tthis.init();\n\t}\n\n\t/**\r\n * Initialise the events board\r\n * @description Create and cache new events model and charity model; bootstrap the widget\r\n */\n\n\t_createClass(CharityEventsBoard, [{\n\t\tkey: 'init',\n\t\tvalue: function init() {\n\t\t\t_get(Object.getPrototypeOf(CharityEventsBoard.prototype), 'init', this).call(this);\n\t\t\tthis.eventsModel = new _ModelEvents2['default']({\n\t\t\t\twidget: this,\n\t\t\t\turl: 'https://api.justgiving.com/' + this.appId + '/v1/charity/' + this.config.id + '/events',\n\t\t\t\tisPaginated: true,\n\t\t\t\tcollectionPath: 'events'\n\t\t\t});\n\t\t\tthis.charityModel = new _justgivingWidgetFrameworkComponentsLibJsFrameworkModel2['default']({\n\t\t\t\twidget: this,\n\t\t\t\turl: 'https://api.justgiving.com/' + this.appId + '/v1/charity/' + this.config.id\n\t\t\t});\n\t\t\tthis.bootstrap();\n\t\t}\n\n\t\t/**\r\n * Bootstrap the widget\r\n * @description Fetch all server data for events and charity model; then create and render new charity and events views;\r\n * reset the widget height and create new carousel on the events view; finally initialise a new analytics instance on the widget\r\n */\n\t}, {\n\t\tkey: 'bootstrap',\n\t\tvalue: function bootstrap() {\n\t\t\tvar _this = this;\n\n\t\t\tPromise.all([this.eventsModel.getNextPage(), this.charityModel.getModel()]).then(function () {\n\t\t\t\t// Charity View\n\t\t\t\t_this.charityView = new _justgivingWidgetFrameworkComponentsLibJsFrameworkView2['default']({\n\t\t\t\t\twidget: _this,\n\t\t\t\t\tel: '[data-view-charity]',\n\t\t\t\t\ttemplate: '[data-tmpl-charity]',\n\t\t\t\t\tmodel: _this.charityModel\n\t\t\t\t});\n\t\t\t\t_this.charityView.render({\n\t\t\t\t\tcharityId: _this.charityView.model.$model.id,\n\t\t\t\t\tcharityName: _this.charityView.model.$model.name\n\t\t\t\t});\n\t\t\t\tif (_this.eventsModel.collection.length > 0) {\n\t\t\t\t\t// Events view\n\t\t\t\t\t_this.eventsView = new _justgivingWidgetFrameworkComponentsLibJsFrameworkView2['default']({\n\t\t\t\t\t\twidget: _this,\n\t\t\t\t\t\tel: '[data-view-events]',\n\t\t\t\t\t\ttemplate: '[data-tmpl-events]'\n\t\t\t\t\t});\n\t\t\t\t\t_this.eventsView.render({\n\t\t\t\t\t\tviewName: 'events',\n\t\t\t\t\t\thasCarousel: 'true'\n\t\t\t\t\t});\n\t\t\t\t\t// Events list view\n\t\t\t\t\t_this.eventsListView = new _justgivingWidgetFrameworkComponentsLibJsFrameworkView2['default']({\n\t\t\t\t\t\twidget: _this,\n\t\t\t\t\t\tel: '[data-view-events-list]',\n\t\t\t\t\t\ttemplate: '[data-tmpl-events-list]',\n\t\t\t\t\t\tmodel: _this.eventsModel\n\t\t\t\t\t});\n\t\t\t\t\t_this.eventsListView.render({\n\t\t\t\t\t\tevents: _this.eventsListView.model.collection\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t//No events to show\n\t\t\t\t\t_this.eventsView = new _justgivingWidgetFrameworkComponentsLibJsFrameworkView2['default']({\n\t\t\t\t\t\twidget: _this,\n\t\t\t\t\t\tel: '[data-view-events]',\n\t\t\t\t\t\ttemplate: '[data-tmpl-no-events]',\n\t\t\t\t\t\tmodel: _this.charityModel\n\t\t\t\t\t});\n\t\t\t\t\t_this.eventsView.render({\n\t\t\t\t\t\tcharityName: _this.charityView.model.$model.name\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t// Footer View\n\t\t\t\t_this.footerView = new _justgivingWidgetFrameworkComponentsLibJsFrameworkView2['default']({\n\t\t\t\t\twidget: _this,\n\t\t\t\t\tel: '[data-view-footer]',\n\t\t\t\t\ttemplate: '[data-tmpl-footer]',\n\t\t\t\t\tmodel: _this.charityModel\n\t\t\t\t});\n\t\t\t\t_this.footerView.render({\n\t\t\t\t\tprofilePageUrl: _this.charityView.model.$model.profilePageUrl\n\t\t\t\t});\n\t\t\t}).then(function () {\n\t\t\t\t_this.resetHeight();\n\t\t\t\tif (_this.eventsModel.collection.length > 0) {\n\t\t\t\t\t_this.carousel = new _justgivingWidgetFrameworkComponentsLibCarouselCarousel2['default']({\n\t\t\t\t\t\tel: '[data-carousel=\"events\"]',\n\t\t\t\t\t\tisInfinite: true,\n\t\t\t\t\t\twidget: _this,\n\t\t\t\t\t\tview: _this.eventsListView\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t_this.analytics = _this.initAnalytics();\n\t\t\t});\n\t\t}\n\t}]);\n\n\treturn CharityEventsBoard;\n})(_justgivingWidgetFrameworkComponentsLibJsFrameworkWidget2['default']);\n\nexports['default'] = CharityEventsBoard;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2NoYXJpdHktZXZlbnRzLWJvYXJkL3NyYy9zY3JpcHRzL2FwcC9DaGFyaXR5RXZlbnRzQm9hcmQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O3VFQUdNLGdFQUFnRTs7OztzRUFDOUQsOERBQThEOzs7O3NFQUNqRSwrREFBK0Q7Ozs7cUVBQ2hFLDhEQUE4RDs7OzsyQkFDdkQsZUFBZTs7Ozs7OztBQUx2QyxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDOztJQVV2QyxrQkFBa0I7V0FBbEIsa0JBQWtCOztBQUNYLFVBRFAsa0JBQWtCLENBQ1QsT0FBTyxFQUFHO3dCQURuQixrQkFBa0I7O0FBRXRCLDZCQUZJLGtCQUFrQiw2Q0FFZixPQUFPLEVBQUc7QUFDakIsTUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0VBQ1o7Ozs7Ozs7Y0FKSSxrQkFBa0I7O1NBU2xCLGdCQUFHO0FBQ1AsOEJBVkksa0JBQWtCLHNDQVVUO0FBQ2IsT0FBSSxDQUFDLFdBQVcsR0FBRyw2QkFBZ0I7QUFDbEMsVUFBTSxFQUFFLElBQUk7QUFDWixPQUFHLGtDQUFtQyxJQUFJLENBQUMsS0FBSyxvQkFBa0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFlBQVU7QUFDMUYsZUFBVyxFQUFFLElBQUk7QUFDakIsa0JBQWMsRUFBRSxRQUFRO0lBQ3hCLENBQUMsQ0FBQztBQUNILE9BQUksQ0FBQyxZQUFZLEdBQUcsd0VBQVU7QUFDN0IsVUFBTSxFQUFFLElBQUk7QUFDWixPQUFHLGtDQUFtQyxJQUFJLENBQUMsS0FBSyxvQkFBa0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEFBQUU7SUFDbEYsQ0FBQyxDQUFDO0FBQ0gsT0FBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0dBQ2pCOzs7Ozs7Ozs7U0FNUyxxQkFBRzs7O0FBQ1osVUFBTyxDQUFDLEdBQUcsQ0FBQyxDQUNYLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLEVBQzlCLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQzVCLENBQUMsQ0FBQyxJQUFJLENBQUUsWUFBTTs7QUFFZCxVQUFLLFdBQVcsR0FBRyx1RUFBUztBQUMzQixXQUFNLE9BQU07QUFDWixPQUFFLEVBQUUscUJBQXFCO0FBQ3pCLGFBQVEsRUFBRSxxQkFBcUI7QUFDL0IsVUFBSyxFQUFFLE1BQUssWUFBWTtLQUN4QixDQUFDLENBQUM7QUFDSCxVQUFLLFdBQVcsQ0FBQyxNQUFNLENBQUM7QUFDdkIsY0FBUyxFQUFFLE1BQUssV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUMzQyxnQkFBVyxFQUFFLE1BQUssV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSTtLQUMvQyxDQUFDLENBQUM7QUFDSCxRQUFLLE1BQUssV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFHOztBQUU3QyxXQUFLLFVBQVUsR0FBRyx1RUFBUztBQUMxQixZQUFNLE9BQU07QUFDWixRQUFFLEVBQUUsb0JBQW9CO0FBQ3hCLGNBQVEsRUFBRSxvQkFBb0I7TUFDOUIsQ0FBQyxDQUFDO0FBQ0gsV0FBSyxVQUFVLENBQUMsTUFBTSxDQUFDO0FBQ3RCLGNBQVEsRUFBRSxRQUFRO0FBQ2xCLGlCQUFXLEVBQUUsTUFBTTtNQUNuQixDQUFDLENBQUM7O0FBRUgsV0FBSyxjQUFjLEdBQUcsdUVBQVM7QUFDOUIsWUFBTSxPQUFNO0FBQ1osUUFBRSxFQUFFLHlCQUF5QjtBQUM3QixjQUFRLEVBQUUseUJBQXlCO0FBQ25DLFdBQUssRUFBRSxNQUFLLFdBQVc7TUFDdkIsQ0FBQyxDQUFDO0FBQ0gsV0FBSyxjQUFjLENBQUMsTUFBTSxDQUFDO0FBQzFCLFlBQU0sRUFBRSxNQUFLLGNBQWMsQ0FBQyxLQUFLLENBQUMsVUFBVTtNQUM1QyxDQUFDLENBQUM7S0FDSCxNQUFNOztBQUVOLFdBQUssVUFBVSxHQUFHLHVFQUFTO0FBQzFCLFlBQU0sT0FBTTtBQUNaLFFBQUUsRUFBRSxvQkFBb0I7QUFDeEIsY0FBUSxFQUFFLHVCQUF1QjtBQUNqQyxXQUFLLEVBQUUsTUFBSyxZQUFZO01BQ3hCLENBQUMsQ0FBQztBQUNILFdBQUssVUFBVSxDQUFDLE1BQU0sQ0FBQztBQUN0QixpQkFBVyxFQUFFLE1BQUssV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSTtNQUMvQyxDQUFDLENBQUM7S0FDSDs7QUFFRCxVQUFLLFVBQVUsR0FBRyx1RUFBUztBQUMxQixXQUFNLE9BQU07QUFDWixPQUFFLEVBQUUsb0JBQW9CO0FBQ3hCLGFBQVEsRUFBRSxvQkFBb0I7QUFDOUIsVUFBSyxFQUFFLE1BQUssWUFBWTtLQUN4QixDQUFDLENBQUM7QUFDSCxVQUFLLFVBQVUsQ0FBQyxNQUFNLENBQUM7QUFDdEIsbUJBQWMsRUFBRSxNQUFLLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWM7S0FDNUQsQ0FBQyxDQUFDO0lBQ0gsQ0FBQyxDQUFDLElBQUksQ0FBRSxZQUFNO0FBQ2QsVUFBSyxXQUFXLEVBQUUsQ0FBQztBQUNuQixRQUFLLE1BQUssV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFHO0FBQzdDLFdBQUssUUFBUSxHQUFHLHdFQUFhO0FBQzVCLFFBQUUsRUFBRSwwQkFBMEI7QUFDOUIsZ0JBQVUsRUFBRSxJQUFJO0FBQ2hCLFlBQU0sT0FBTTtBQUNaLFVBQUksRUFBRSxNQUFLLGNBQWM7TUFDekIsQ0FBQyxDQUFDO0tBQ0g7QUFDRCxVQUFLLFNBQVMsR0FBRyxNQUFLLGFBQWEsRUFBRSxDQUFDO0lBQ3RDLENBQUMsQ0FBQztHQUNIOzs7UUFuR0ksa0JBQWtCOzs7cUJBc0dULGtCQUFrQiIsImZpbGUiOiJDOi90ZW1wL0dHLkZyb250RW5kLldpZGdldHMvd2lkZ2V0cy9jaGFyaXR5LWV2ZW50cy1ib2FyZC9zcmMvc2NyaXB0cy9hcHAvQ2hhcml0eUV2ZW50c0JvYXJkLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xyXG5cclxubGV0IFByb21pc2UgPSByZXF1aXJlKCdlczYtcHJvbWlzZScpLlByb21pc2U7XHJcbmltcG9ydCBXaWRnZXQgZnJvbSAnanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9XaWRnZXQnO1xyXG5pbXBvcnQgQ2Fyb3VzZWwgZnJvbSAnanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2Nhcm91c2VsL0Nhcm91c2VsJztcclxuaW1wb3J0IE1vZGVsIGZyb20gJ2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy9mcmFtZXdvcmsvTW9kZWwnO1xyXG5pbXBvcnQgVmlldyBmcm9tICdqdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvZnJhbWV3b3JrL1ZpZXcnO1xyXG5pbXBvcnQgTW9kZWxFdmVudHMgZnJvbSAnLi9Nb2RlbEV2ZW50cyc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGEgY2hhcml0eSBldmVudHMgYm9hcmQgd2lkZ2V0XHJcbiAqL1xyXG5jbGFzcyBDaGFyaXR5RXZlbnRzQm9hcmQgZXh0ZW5kcyBXaWRnZXQge1xyXG5cdGNvbnN0cnVjdG9yICggb3B0aW9ucyApIHtcclxuXHRcdHN1cGVyKCBvcHRpb25zICk7XHJcblx0XHR0aGlzLmluaXQoKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogSW5pdGlhbGlzZSB0aGUgZXZlbnRzIGJvYXJkXHJcblx0ICogQGRlc2NyaXB0aW9uIENyZWF0ZSBhbmQgY2FjaGUgbmV3IGV2ZW50cyBtb2RlbCBhbmQgY2hhcml0eSBtb2RlbDsgYm9vdHN0cmFwIHRoZSB3aWRnZXRcclxuXHQgKi9cclxuXHRpbml0ICgpIHtcclxuXHRcdHN1cGVyLmluaXQoKTtcclxuXHRcdHRoaXMuZXZlbnRzTW9kZWwgPSBuZXcgTW9kZWxFdmVudHMoeyBcclxuXHRcdFx0d2lkZ2V0OiB0aGlzLFxyXG5cdFx0XHR1cmw6IGBodHRwczpcXC9cXC9hcGkuanVzdGdpdmluZy5jb21cXC8ke3RoaXMuYXBwSWR9XFwvdjFcXC9jaGFyaXR5XFwvJHt0aGlzLmNvbmZpZy5pZH1cXC9ldmVudHNgLFxyXG5cdFx0XHRpc1BhZ2luYXRlZDogdHJ1ZSxcclxuXHRcdFx0Y29sbGVjdGlvblBhdGg6ICdldmVudHMnXHJcblx0XHR9KTtcclxuXHRcdHRoaXMuY2hhcml0eU1vZGVsID0gbmV3IE1vZGVsKHsgXHJcblx0XHRcdHdpZGdldDogdGhpcyxcclxuXHRcdFx0dXJsOiBgaHR0cHM6XFwvXFwvYXBpLmp1c3RnaXZpbmcuY29tXFwvJHt0aGlzLmFwcElkfVxcL3YxXFwvY2hhcml0eVxcLyR7dGhpcy5jb25maWcuaWR9YFxyXG5cdFx0fSk7XHJcblx0XHR0aGlzLmJvb3RzdHJhcCgpO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBCb290c3RyYXAgdGhlIHdpZGdldFxyXG5cdCAqIEBkZXNjcmlwdGlvbiBGZXRjaCBhbGwgc2VydmVyIGRhdGEgZm9yIGV2ZW50cyBhbmQgY2hhcml0eSBtb2RlbDsgdGhlbiBjcmVhdGUgYW5kIHJlbmRlciBuZXcgY2hhcml0eSBhbmQgZXZlbnRzIHZpZXdzO1xyXG5cdCAqIHJlc2V0IHRoZSB3aWRnZXQgaGVpZ2h0IGFuZCBjcmVhdGUgbmV3IGNhcm91c2VsIG9uIHRoZSBldmVudHMgdmlldzsgZmluYWxseSBpbml0aWFsaXNlIGEgbmV3IGFuYWx5dGljcyBpbnN0YW5jZSBvbiB0aGUgd2lkZ2V0XHJcblx0ICovXHJcblx0Ym9vdHN0cmFwICgpIHtcclxuXHRcdFByb21pc2UuYWxsKFtcclxuXHRcdFx0dGhpcy5ldmVudHNNb2RlbC5nZXROZXh0UGFnZSgpLFxyXG5cdFx0XHR0aGlzLmNoYXJpdHlNb2RlbC5nZXRNb2RlbCgpXHJcblx0XHRdKS50aGVuKCAoKSA9PiB7XHJcblx0XHRcdC8vIENoYXJpdHkgVmlld1xyXG5cdFx0XHR0aGlzLmNoYXJpdHlWaWV3ID0gbmV3IFZpZXcoeyBcclxuXHRcdFx0XHR3aWRnZXQ6IHRoaXMsIFxyXG5cdFx0XHRcdGVsOiAnW2RhdGEtdmlldy1jaGFyaXR5XScsXHJcblx0XHRcdFx0dGVtcGxhdGU6ICdbZGF0YS10bXBsLWNoYXJpdHldJyxcclxuXHRcdFx0XHRtb2RlbDogdGhpcy5jaGFyaXR5TW9kZWxcclxuXHRcdFx0fSk7XHJcblx0XHRcdHRoaXMuY2hhcml0eVZpZXcucmVuZGVyKHtcclxuXHRcdFx0XHRjaGFyaXR5SWQ6IHRoaXMuY2hhcml0eVZpZXcubW9kZWwuJG1vZGVsLmlkLFxyXG5cdFx0XHRcdGNoYXJpdHlOYW1lOiB0aGlzLmNoYXJpdHlWaWV3Lm1vZGVsLiRtb2RlbC5uYW1lXHJcblx0XHRcdH0pO1xyXG5cdFx0XHRpZiAoIHRoaXMuZXZlbnRzTW9kZWwuY29sbGVjdGlvbi5sZW5ndGggPiAwICkge1x0XHJcblx0XHRcdFx0Ly8gRXZlbnRzIHZpZXdcclxuXHRcdFx0XHR0aGlzLmV2ZW50c1ZpZXcgPSBuZXcgVmlldyh7IFxyXG5cdFx0XHRcdFx0d2lkZ2V0OiB0aGlzLCBcclxuXHRcdFx0XHRcdGVsOiAnW2RhdGEtdmlldy1ldmVudHNdJyxcclxuXHRcdFx0XHRcdHRlbXBsYXRlOiAnW2RhdGEtdG1wbC1ldmVudHNdJ1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdHRoaXMuZXZlbnRzVmlldy5yZW5kZXIoe1xyXG5cdFx0XHRcdFx0dmlld05hbWU6ICdldmVudHMnLFxyXG5cdFx0XHRcdFx0aGFzQ2Fyb3VzZWw6ICd0cnVlJ1xyXG5cdFx0XHRcdH0pO1x0XHJcblx0XHRcdFx0Ly8gRXZlbnRzIGxpc3Qgdmlld1xyXG5cdFx0XHRcdHRoaXMuZXZlbnRzTGlzdFZpZXcgPSBuZXcgVmlldyh7IFxyXG5cdFx0XHRcdFx0d2lkZ2V0OiB0aGlzLFxyXG5cdFx0XHRcdFx0ZWw6ICdbZGF0YS12aWV3LWV2ZW50cy1saXN0XScsXHJcblx0XHRcdFx0XHR0ZW1wbGF0ZTogJ1tkYXRhLXRtcGwtZXZlbnRzLWxpc3RdJyxcclxuXHRcdFx0XHRcdG1vZGVsOiB0aGlzLmV2ZW50c01vZGVsLFxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdHRoaXMuZXZlbnRzTGlzdFZpZXcucmVuZGVyKHtcclxuXHRcdFx0XHRcdGV2ZW50czogdGhpcy5ldmVudHNMaXN0Vmlldy5tb2RlbC5jb2xsZWN0aW9uXHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Ly9ObyBldmVudHMgdG8gc2hvd1xyXG5cdFx0XHRcdHRoaXMuZXZlbnRzVmlldyA9IG5ldyBWaWV3KHsgXHJcblx0XHRcdFx0XHR3aWRnZXQ6IHRoaXMsIFxyXG5cdFx0XHRcdFx0ZWw6ICdbZGF0YS12aWV3LWV2ZW50c10nLFxyXG5cdFx0XHRcdFx0dGVtcGxhdGU6ICdbZGF0YS10bXBsLW5vLWV2ZW50c10nLFxyXG5cdFx0XHRcdFx0bW9kZWw6IHRoaXMuY2hhcml0eU1vZGVsXHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0dGhpcy5ldmVudHNWaWV3LnJlbmRlcih7XHJcblx0XHRcdFx0XHRjaGFyaXR5TmFtZTogdGhpcy5jaGFyaXR5Vmlldy5tb2RlbC4kbW9kZWwubmFtZVxyXG5cdFx0XHRcdH0pO1x0XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gRm9vdGVyIFZpZXdcclxuXHRcdFx0dGhpcy5mb290ZXJWaWV3ID0gbmV3IFZpZXcoe1xyXG5cdFx0XHRcdHdpZGdldDogdGhpcyxcclxuXHRcdFx0XHRlbDogJ1tkYXRhLXZpZXctZm9vdGVyXScsXHJcblx0XHRcdFx0dGVtcGxhdGU6ICdbZGF0YS10bXBsLWZvb3Rlcl0nLFxyXG5cdFx0XHRcdG1vZGVsOiB0aGlzLmNoYXJpdHlNb2RlbFxyXG5cdFx0XHR9KTtcclxuXHRcdFx0dGhpcy5mb290ZXJWaWV3LnJlbmRlcih7XHJcblx0XHRcdFx0cHJvZmlsZVBhZ2VVcmw6IHRoaXMuY2hhcml0eVZpZXcubW9kZWwuJG1vZGVsLnByb2ZpbGVQYWdlVXJsXHJcblx0XHRcdH0pO1xyXG5cdFx0fSkudGhlbiggKCkgPT4ge1xyXG5cdFx0XHR0aGlzLnJlc2V0SGVpZ2h0KCk7XHRcclxuXHRcdFx0aWYgKCB0aGlzLmV2ZW50c01vZGVsLmNvbGxlY3Rpb24ubGVuZ3RoID4gMCApIHtcdFxyXG5cdFx0XHRcdHRoaXMuY2Fyb3VzZWwgPSBuZXcgQ2Fyb3VzZWwoe1xyXG5cdFx0XHRcdFx0ZWw6ICdbZGF0YS1jYXJvdXNlbD1cImV2ZW50c1wiXScsXHJcblx0XHRcdFx0XHRpc0luZmluaXRlOiB0cnVlLFxyXG5cdFx0XHRcdFx0d2lkZ2V0OiB0aGlzLFxyXG5cdFx0XHRcdFx0dmlldzogdGhpcy5ldmVudHNMaXN0Vmlld1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMuYW5hbHl0aWNzID0gdGhpcy5pbml0QW5hbHl0aWNzKCk7XHJcblx0XHR9KTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IENoYXJpdHlFdmVudHNCb2FyZDsiXX0=\n},{\"./ModelEvents\":59,\"es6-promise\":24,\"justgiving-widget-framework/components/lib/carousel/Carousel\":47,\"justgiving-widget-framework/components/lib/js/framework/Model\":50,\"justgiving-widget-framework/components/lib/js/framework/View\":51,\"justgiving-widget-framework/components/lib/js/framework/Widget\":52}],59:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n\tvalue: true\n});\n\nvar _createClass = (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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _justgivingWidgetFrameworkComponentsLibJsWidgetModelPrettyDate = require('justgiving-widget-framework/components/lib/js/widget/model/prettyDate');\n\nvar _justgivingWidgetFrameworkComponentsLibJsFrameworkModel = require('justgiving-widget-framework/components/lib/js/framework/Model');\n\nvar _justgivingWidgetFrameworkComponentsLibJsFrameworkModel2 = _interopRequireDefault(_justgivingWidgetFrameworkComponentsLibJsFrameworkModel);\n\nvar _justgivingWidgetFrameworkComponentsLibJsWidgetModelWriteUrl = require('justgiving-widget-framework/components/lib/js/widget/model/writeUrl');\n\nvar _justgivingWidgetFrameworkComponentsLibJsWidgetAnalyticsWriteUtmCode = require('justgiving-widget-framework/components/lib/js/widget/analytics/writeUtmCode');\n\nvar _justgivingWidgetFrameworkComponentsLibJsWidgetAnalyticsWriteUtmCode2 = _interopRequireDefault(_justgivingWidgetFrameworkComponentsLibJsWidgetAnalyticsWriteUtmCode);\n\n/**\r\n * Create an events model \r\n * @classdesc Set the url of the events model; specify API data property name of events data\r\n */\nvar Promise = require('es6-promise').Promise;\n\nvar ModelEvents = (function (_Model) {\n\t_inherits(ModelEvents, _Model);\n\n\tfunction ModelEvents(options) {\n\t\t_classCallCheck(this, ModelEvents);\n\n\t\t_get(Object.getPrototypeOf(ModelEvents.prototype), 'constructor', this).call(this, options);\n\t}\n\n\t/**\r\n * Extend model's get next page method\r\n * @description Extend model's get next page method to include data augmentation of returned collection data\r\n */\n\n\t_createClass(ModelEvents, [{\n\t\tkey: 'getNextPage',\n\t\tvalue: function getNextPage(reset) {\n\t\t\tvar _this = this;\n\n\t\t\treturn new Promise(function (resolve) {\n\t\t\t\t_get(Object.getPrototypeOf(ModelEvents.prototype), 'getNextPage', _this).call(_this, reset).then(function () {\n\t\t\t\t\t_this.collection.forEach(function (evt) {\n\t\t\t\t\t\tvar charityId = _this.$model.id;\n\t\t\t\t\t\tevt.charityId = charityId;\n\t\t\t\t\t\tevt.prettyStartDate = (0, _justgivingWidgetFrameworkComponentsLibJsWidgetModelPrettyDate.getPrettyDateUTC)(evt.startDate);\n\t\t\t\t\t\tevt.prettyStartMonth = (0, _justgivingWidgetFrameworkComponentsLibJsWidgetModelPrettyDate.getPrettyMonth)(evt.startDate);\n\t\t\t\t\t\tevt.prettyStartYear = (0, _justgivingWidgetFrameworkComponentsLibJsWidgetModelPrettyDate.getPrettyYearUTC)(evt.startDate);\n\t\t\t\t\t\tevt.dateTime = (0, _justgivingWidgetFrameworkComponentsLibJsWidgetModelPrettyDate.getDateTime)(evt.startDate);\n\n\t\t\t\t\t\t(0, _justgivingWidgetFrameworkComponentsLibJsWidgetModelWriteUrl.writeEventUrl)(evt, 'eventUrl', charityId);\n\t\t\t\t\t\tevt.eventUrl += (0, _justgivingWidgetFrameworkComponentsLibJsWidgetAnalyticsWriteUtmCode2['default'])(evt.eventUrl, {\n\t\t\t\t\t\t\tutm_name: 'CharityEventsBoard', // jshint ignore:line\n\t\t\t\t\t\t\tutm_content: charityId // jshint ignore:line\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}]);\n\n\treturn ModelEvents;\n})(_justgivingWidgetFrameworkComponentsLibJsFrameworkModel2['default']);\n\nexports['default'] = ModelEvents;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3RlbXAvR0cuRnJvbnRFbmQuV2lkZ2V0cy93aWRnZXRzL2NoYXJpdHktZXZlbnRzLWJvYXJkL3NyYy9zY3JpcHRzL2FwcC9Nb2RlbEV2ZW50cy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7NkVBSW1FLHVFQUF1RTs7c0VBRXJJLCtEQUErRDs7OzsyRUFDbkQscUVBQXFFOzttRkFDMUUsNkVBQTZFOzs7Ozs7OztBQU50RyxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDOztJQVl2QyxXQUFXO1dBQVgsV0FBVzs7QUFDTCxVQUROLFdBQVcsQ0FDSCxPQUFPLEVBQUc7d0JBRGxCLFdBQVc7O0FBRWYsNkJBRkksV0FBVyw2Q0FFUixPQUFPLEVBQUc7RUFDakI7Ozs7Ozs7Y0FISSxXQUFXOztTQVFMLHFCQUFFLEtBQUssRUFBRzs7O0FBQ3BCLFVBQU8sSUFBSSxPQUFPLENBQUUsVUFBRSxPQUFPLEVBQU07QUFDbEMsK0JBVkcsV0FBVywrQ0FVSyxLQUFLLEVBQUcsSUFBSSxDQUFFLFlBQU07QUFDdEMsV0FBSyxVQUFVLENBQUMsT0FBTyxDQUFFLFVBQUMsR0FBRyxFQUFLO0FBQ2pDLFVBQUksU0FBUyxHQUFHLE1BQUssTUFBTSxDQUFDLEVBQUUsQ0FBQztBQUMvQixTQUFHLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztBQUMxQixTQUFHLENBQUMsZUFBZSxHQUFHLHFGQUFpQixHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDdEQsU0FBRyxDQUFDLGdCQUFnQixHQUFHLG1GQUFlLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNyRCxTQUFHLENBQUMsZUFBZSxHQUFHLHFGQUFpQixHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDdEQsU0FBRyxDQUFDLFFBQVEsR0FBRyxnRkFBWSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7O0FBRTFDLHNGQUFjLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDMUMsU0FBRyxDQUFDLFFBQVEsSUFBSSxzRkFBYSxHQUFHLENBQUMsUUFBUSxFQUFFO0FBQzFDLGVBQVEsRUFBRSxvQkFBb0I7QUFDOUIsa0JBQVcsRUFBRSxTQUFTO09BQ3RCLENBQUMsQ0FBQztNQUNILENBQUMsQ0FBQztBQUNILFlBQU8sRUFBRSxDQUFDO0tBQ1YsQ0FBQyxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0dBQ0g7OztRQTVCSSxXQUFXOzs7cUJBK0JGLFdBQVciLCJmaWxlIjoiQzovdGVtcC9HRy5Gcm9udEVuZC5XaWRnZXRzL3dpZGdldHMvY2hhcml0eS1ldmVudHMtYm9hcmQvc3JjL3NjcmlwdHMvYXBwL01vZGVsRXZlbnRzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xyXG5cclxubGV0IFByb21pc2UgPSByZXF1aXJlKCdlczYtcHJvbWlzZScpLlByb21pc2U7XHJcblxyXG5pbXBvcnQgeyBnZXREYXRlVGltZSwgZ2V0UHJldHR5RGF0ZVVUQywgZ2V0UHJldHR5TW9udGgsIGdldFByZXR0eVllYXJVVEMgfSBmcm9tICdqdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvd2lkZ2V0L21vZGVsL3ByZXR0eURhdGUnO1xyXG5cclxuaW1wb3J0IE1vZGVsIGZyb20gJ2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy9mcmFtZXdvcmsvTW9kZWwnO1xyXG5pbXBvcnQgeyB3cml0ZUV2ZW50VXJsIH0gZnJvbSAnanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL3dpZGdldC9tb2RlbC93cml0ZVVybCc7XHJcbmltcG9ydCB3cml0ZVV0bUNvZGUgZnJvbSAnanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL3dpZGdldC9hbmFseXRpY3Mvd3JpdGVVdG1Db2RlJztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYW4gZXZlbnRzIG1vZGVsIFxyXG4gKiBAY2xhc3NkZXNjIFNldCB0aGUgdXJsIG9mIHRoZSBldmVudHMgbW9kZWw7IHNwZWNpZnkgQVBJIGRhdGEgcHJvcGVydHkgbmFtZSBvZiBldmVudHMgZGF0YVxyXG4gKi9cclxuY2xhc3MgTW9kZWxFdmVudHMgZXh0ZW5kcyBNb2RlbCB7XHJcblx0Y29uc3RydWN0b3IoIG9wdGlvbnMgKSB7XHJcblx0XHRzdXBlciggb3B0aW9ucyApO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBFeHRlbmQgbW9kZWwncyBnZXQgbmV4dCBwYWdlIG1ldGhvZFxyXG5cdCAqIEBkZXNjcmlwdGlvbiBFeHRlbmQgbW9kZWwncyBnZXQgbmV4dCBwYWdlIG1ldGhvZCB0byBpbmNsdWRlIGRhdGEgYXVnbWVudGF0aW9uIG9mIHJldHVybmVkIGNvbGxlY3Rpb24gZGF0YVxyXG5cdCAqL1xyXG5cdGdldE5leHRQYWdlKCByZXNldCApIHtcclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSggKCByZXNvbHZlICkgPT4geyBcclxuXHRcdFx0c3VwZXIuZ2V0TmV4dFBhZ2UoIHJlc2V0ICkudGhlbiggKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMuY29sbGVjdGlvbi5mb3JFYWNoKCAoZXZ0KSA9PiB7XHJcblx0XHRcdFx0XHRsZXQgY2hhcml0eUlkID0gdGhpcy4kbW9kZWwuaWQ7XHJcblx0XHRcdFx0XHRldnQuY2hhcml0eUlkID0gY2hhcml0eUlkO1xyXG5cdFx0XHRcdFx0ZXZ0LnByZXR0eVN0YXJ0RGF0ZSA9IGdldFByZXR0eURhdGVVVEMoZXZ0LnN0YXJ0RGF0ZSk7XHJcblx0XHRcdFx0XHRldnQucHJldHR5U3RhcnRNb250aCA9IGdldFByZXR0eU1vbnRoKGV2dC5zdGFydERhdGUpO1xyXG5cdFx0XHRcdFx0ZXZ0LnByZXR0eVN0YXJ0WWVhciA9IGdldFByZXR0eVllYXJVVEMoZXZ0LnN0YXJ0RGF0ZSk7XHJcblx0XHRcdFx0XHRldnQuZGF0ZVRpbWUgPSBnZXREYXRlVGltZShldnQuc3RhcnREYXRlKTtcclxuXHJcblx0XHRcdFx0XHR3cml0ZUV2ZW50VXJsKGV2dCwgJ2V2ZW50VXJsJywgY2hhcml0eUlkKTtcclxuXHRcdFx0XHRcdGV2dC5ldmVudFVybCArPSB3cml0ZVV0bUNvZGUoZXZ0LmV2ZW50VXJsLCB7XHJcblx0XHRcdFx0XHRcdHV0bV9uYW1lOiAnQ2hhcml0eUV2ZW50c0JvYXJkJywgLy8ganNoaW50IGlnbm9yZTpsaW5lXHJcblx0XHRcdFx0XHRcdHV0bV9jb250ZW50OiBjaGFyaXR5SWQgLy8ganNoaW50IGlnbm9yZTpsaW5lXHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHRyZXNvbHZlKCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBNb2RlbEV2ZW50czsiXX0=\n},{\"es6-promise\":24,\"justgiving-widget-framework/components/lib/js/framework/Model\":50,\"justgiving-widget-framework/components/lib/js/widget/analytics/writeUtmCode\":55,\"justgiving-widget-framework/components/lib/js/widget/model/prettyDate\":56,\"justgiving-widget-framework/components/lib/js/widget/model/writeUrl\":57}]},{},[1])\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvc2NyaXB0cy9tYWluLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMucnVudGltZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvYmFzZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvY29tcGlsZXIvYXN0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9jb21waWxlci9iYXNlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9jb21waWxlci9jb2RlLWdlbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvY29tcGlsZXIvY29tcGlsZXIuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvSGFuZGxlYmFycy9kaXN0L2Nqcy9oYW5kbGViYXJzL2NvbXBpbGVyL2hlbHBlcnMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvSGFuZGxlYmFycy9kaXN0L2Nqcy9oYW5kbGViYXJzL2NvbXBpbGVyL2phdmFzY3JpcHQtY29tcGlsZXIuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvSGFuZGxlYmFycy9kaXN0L2Nqcy9oYW5kbGViYXJzL2NvbXBpbGVyL3BhcnNlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvY29tcGlsZXIvcHJpbnRlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvY29tcGlsZXIvdmlzaXRvci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvY29tcGlsZXIvd2hpdGVzcGFjZS1jb250cm9sLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9leGNlcHRpb24uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvSGFuZGxlYmFycy9kaXN0L2Nqcy9oYW5kbGViYXJzL25vLWNvbmZsaWN0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9ydW50aW1lLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9zYWZlLXN0cmluZy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9IYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvdXRpbHMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvSGFuZGxlYmFycy9saWIvaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvYW1kZWZpbmUvYW1kZWZpbmUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9saWIvX2VtcHR5LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9lczYtcHJvbWlzZS9kaXN0L2VzNi1wcm9taXNlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2Zvci1lYWNoL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2dsb2JhbC93aW5kb3cuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvaGFtbWVyanMvaGFtbWVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2lzLWZ1bmN0aW9uL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3BhcnNlLWhlYWRlcnMvcGFyc2UtaGVhZGVycy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9wYXRoLWJyb3dzZXJpZnkvaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW1hcC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2UtbWFwL2FycmF5LXNldC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2UtbWFwL2Jhc2U2NC12bHEuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW1hcC9iYXNlNjQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW1hcC9iaW5hcnktc2VhcmNoLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL3NvdXJjZS1tYXAvbWFwcGluZy1saXN0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL3NvdXJjZS1tYXAvc291cmNlLW1hcC1jb25zdW1lci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2UtbWFwL3NvdXJjZS1tYXAtZ2VuZXJhdG9yLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL3NvdXJjZS1tYXAvc291cmNlLW5vZGUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW1hcC91dGlsLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3RyaW0vaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMveGhyL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3h0ZW5kL2ltbXV0YWJsZS5qcyIsImJvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL0hhbmRsZWJhcnMvaGFuZGxlYmFycy5qcyIsImJvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL0hhbmRsZWJhcnMvaGVscGVycy5qcyIsImJvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL0hhbmRsZWJhcnMvcGFydGlhbHMvX2xpc3QuanMiLCJib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9jYXJvdXNlbC9DYXJvdXNlbC5qcyIsImJvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL0RPTS9nZXRWZW5kb3JQcm9wZXJ0eS5qcyIsImJvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9BbmFseXRpY3MuanMiLCJib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy9mcmFtZXdvcmsvTW9kZWwuanMiLCJib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy9mcmFtZXdvcmsvVmlldy5qcyIsImJvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9XaWRnZXQuanMiLCJib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy91dGlscy9kZWJvdW5jZS5qcyIsImJvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL3V0aWxzL3F1ZXJ5U3RyaW5nLmpzIiwiYm93ZXJfY29tcG9uZW50cy9qdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvd2lkZ2V0L2FuYWx5dGljcy93cml0ZVV0bUNvZGUuanMiLCJib3dlcl9jb21wb25lbnRzL2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy93aWRnZXQvbW9kZWwvcHJldHR5RGF0ZS5qcyIsImJvd2VyX2NvbXBvbmVudHMvanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL3dpZGdldC9tb2RlbC93cml0ZVVybC5qcyIsInNyYy9zY3JpcHRzL2FwcC9DaGFyaXR5RXZlbnRzQm9hcmQuanMiLCJzcmMvc2NyaXB0cy9hcHAvTW9kZWxFdmVudHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Z0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyaUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNycUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25JQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25OQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoVEE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDLzhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNubEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbk9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaFpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9UQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25WQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBfYXBwQ2hhcml0eUV2ZW50c0JvYXJkID0gcmVxdWlyZSgnLi9hcHAvQ2hhcml0eUV2ZW50c0JvYXJkJyk7XG5cbnZhciBfYXBwQ2hhcml0eUV2ZW50c0JvYXJkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FwcENoYXJpdHlFdmVudHNCb2FyZCk7XG5cbm5ldyBfYXBwQ2hhcml0eUV2ZW50c0JvYXJkMlsnZGVmYXVsdCddKHsgd2lkZ2V0TmFtZTogJ2NoYXJpdHktZXZlbnRzLWJvYXJkJyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklrTTZMM1JsYlhBdlIwY3VSbkp2Ym5SRmJtUXVWMmxrWjJWMGN5OTNhV1JuWlhSekwyTm9ZWEpwZEhrdFpYWmxiblJ6TFdKdllYSmtMM055WXk5elkzSnBjSFJ6TDIxaGFXNHVhbk1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJa0ZCUVVFc1dVRkJXU3hEUVVGRE96czdPM0ZEUVVWclFpd3dRa0ZCTUVJN096czdRVUZGZWtRc2RVTkJRWFZDTEVWQlFVVXNWVUZCVlN4RlFVRkZMSE5DUVVGelFpeEZRVUZGTEVOQlFVTXNRMEZCUXlJc0ltWnBiR1VpT2lKRE9pOTBaVzF3TDBkSExrWnliMjUwUlc1a0xsZHBaR2RsZEhNdmQybGtaMlYwY3k5amFHRnlhWFI1TFdWMlpXNTBjeTFpYjJGeVpDOXpjbU12YzJOeWFYQjBjeTl0WVdsdUxtcHpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpSjNWelpTQnpkSEpwWTNRbk8xeHlYRzVjY2x4dWFXMXdiM0owSUVOb1lYSnBkSGxGZG1WdWRITkNiMkZ5WkNCbWNtOXRJQ2N1TDJGd2NDOURhR0Z5YVhSNVJYWmxiblJ6UW05aGNtUW5PMXh5WEc1Y2NseHVibVYzSUVOb1lYSnBkSGxGZG1WdWRITkNiMkZ5WkNoN0lIZHBaR2RsZEU1aGJXVTZJQ2RqYUdGeWFYUjVMV1YyWlc1MGN5MWliMkZ5WkNjZ2ZTazdYSEpjYmx4eVhHNGlYWDA9IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH07XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfcnVudGltZSA9IHJlcXVpcmUoJy4vaGFuZGxlYmFycy5ydW50aW1lJyk7XG5cbnZhciBfcnVudGltZTIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfcnVudGltZSk7XG5cbi8vIENvbXBpbGVyIGltcG9ydHNcblxudmFyIF9BU1QgPSByZXF1aXJlKCcuL2hhbmRsZWJhcnMvY29tcGlsZXIvYXN0Jyk7XG5cbnZhciBfQVNUMiA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9BU1QpO1xuXG52YXIgX1BhcnNlciRwYXJzZSA9IHJlcXVpcmUoJy4vaGFuZGxlYmFycy9jb21waWxlci9iYXNlJyk7XG5cbnZhciBfQ29tcGlsZXIkY29tcGlsZSRwcmVjb21waWxlID0gcmVxdWlyZSgnLi9oYW5kbGViYXJzL2NvbXBpbGVyL2NvbXBpbGVyJyk7XG5cbnZhciBfSmF2YVNjcmlwdENvbXBpbGVyID0gcmVxdWlyZSgnLi9oYW5kbGViYXJzL2NvbXBpbGVyL2phdmFzY3JpcHQtY29tcGlsZXInKTtcblxudmFyIF9KYXZhU2NyaXB0Q29tcGlsZXIyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX0phdmFTY3JpcHRDb21waWxlcik7XG5cbnZhciBfVmlzaXRvciA9IHJlcXVpcmUoJy4vaGFuZGxlYmFycy9jb21waWxlci92aXNpdG9yJyk7XG5cbnZhciBfVmlzaXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfVmlzaXRvcik7XG5cbnZhciBfbm9Db25mbGljdCA9IHJlcXVpcmUoJy4vaGFuZGxlYmFycy9uby1jb25mbGljdCcpO1xuXG52YXIgX25vQ29uZmxpY3QyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX25vQ29uZmxpY3QpO1xuXG52YXIgX2NyZWF0ZSA9IF9ydW50aW1lMlsnZGVmYXVsdCddLmNyZWF0ZTtcbmZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIGhiID0gX2NyZWF0ZSgpO1xuXG4gIGhiLmNvbXBpbGUgPSBmdW5jdGlvbiAoaW5wdXQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gX0NvbXBpbGVyJGNvbXBpbGUkcHJlY29tcGlsZS5jb21waWxlKGlucHV0LCBvcHRpb25zLCBoYik7XG4gIH07XG4gIGhiLnByZWNvbXBpbGUgPSBmdW5jdGlvbiAoaW5wdXQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gX0NvbXBpbGVyJGNvbXBpbGUkcHJlY29tcGlsZS5wcmVjb21waWxlKGlucHV0LCBvcHRpb25zLCBoYik7XG4gIH07XG5cbiAgaGIuQVNUID0gX0FTVDJbJ2RlZmF1bHQnXTtcbiAgaGIuQ29tcGlsZXIgPSBfQ29tcGlsZXIkY29tcGlsZSRwcmVjb21waWxlLkNvbXBpbGVyO1xuICBoYi5KYXZhU2NyaXB0Q29tcGlsZXIgPSBfSmF2YVNjcmlwdENvbXBpbGVyMlsnZGVmYXVsdCddO1xuICBoYi5QYXJzZXIgPSBfUGFyc2VyJHBhcnNlLnBhcnNlcjtcbiAgaGIucGFyc2UgPSBfUGFyc2VyJHBhcnNlLnBhcnNlO1xuXG4gIHJldHVybiBoYjtcbn1cblxudmFyIGluc3QgPSBjcmVhdGUoKTtcbmluc3QuY3JlYXRlID0gY3JlYXRlO1xuXG5fbm9Db25mbGljdDJbJ2RlZmF1bHQnXShpbnN0KTtcblxuaW5zdC5WaXNpdG9yID0gX1Zpc2l0b3IyWydkZWZhdWx0J107XG5cbmluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGluc3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9pbXBvcnQgPSByZXF1aXJlKCcuL2hhbmRsZWJhcnMvYmFzZScpO1xuXG52YXIgYmFzZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9pbXBvcnQpO1xuXG4vLyBFYWNoIG9mIHRoZXNlIGF1Z21lbnQgdGhlIEhhbmRsZWJhcnMgb2JqZWN0LiBObyBuZWVkIHRvIHNldHVwIGhlcmUuXG4vLyAoVGhpcyBpcyBkb25lIHRvIGVhc2lseSBzaGFyZSBjb2RlIGJldHdlZW4gY29tbW9uanMgYW5kIGJyb3dzZSBlbnZzKVxuXG52YXIgX1NhZmVTdHJpbmcgPSByZXF1aXJlKCcuL2hhbmRsZWJhcnMvc2FmZS1zdHJpbmcnKTtcblxudmFyIF9TYWZlU3RyaW5nMiA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9TYWZlU3RyaW5nKTtcblxudmFyIF9FeGNlcHRpb24gPSByZXF1aXJlKCcuL2hhbmRsZWJhcnMvZXhjZXB0aW9uJyk7XG5cbnZhciBfRXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9FeGNlcHRpb24pO1xuXG52YXIgX2ltcG9ydDIgPSByZXF1aXJlKCcuL2hhbmRsZWJhcnMvdXRpbHMnKTtcblxudmFyIFV0aWxzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX2ltcG9ydDIpO1xuXG52YXIgX2ltcG9ydDMgPSByZXF1aXJlKCcuL2hhbmRsZWJhcnMvcnVudGltZScpO1xuXG52YXIgcnVudGltZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9pbXBvcnQzKTtcblxudmFyIF9ub0NvbmZsaWN0ID0gcmVxdWlyZSgnLi9oYW5kbGViYXJzL25vLWNvbmZsaWN0Jyk7XG5cbnZhciBfbm9Db25mbGljdDIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfbm9Db25mbGljdCk7XG5cbi8vIEZvciBjb21wYXRpYmlsaXR5IGFuZCB1c2FnZSBvdXRzaWRlIG9mIG1vZHVsZSBzeXN0ZW1zLCBtYWtlIHRoZSBIYW5kbGViYXJzIG9iamVjdCBhIG5hbWVzcGFjZVxuZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgaGIgPSBuZXcgYmFzZS5IYW5kbGViYXJzRW52aXJvbm1lbnQoKTtcblxuICBVdGlscy5leHRlbmQoaGIsIGJhc2UpO1xuICBoYi5TYWZlU3RyaW5nID0gX1NhZmVTdHJpbmcyWydkZWZhdWx0J107XG4gIGhiLkV4Y2VwdGlvbiA9IF9FeGNlcHRpb24yWydkZWZhdWx0J107XG4gIGhiLlV0aWxzID0gVXRpbHM7XG4gIGhiLmVzY2FwZUV4cHJlc3Npb24gPSBVdGlscy5lc2NhcGVFeHByZXNzaW9uO1xuXG4gIGhiLlZNID0gcnVudGltZTtcbiAgaGIudGVtcGxhdGUgPSBmdW5jdGlvbiAoc3BlYykge1xuICAgIHJldHVybiBydW50aW1lLnRlbXBsYXRlKHNwZWMsIGhiKTtcbiAgfTtcblxuICByZXR1cm4gaGI7XG59XG5cbnZhciBpbnN0ID0gY3JlYXRlKCk7XG5pbnN0LmNyZWF0ZSA9IGNyZWF0ZTtcblxuX25vQ29uZmxpY3QyWydkZWZhdWx0J10oaW5zdCk7XG5cbmluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGluc3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuSGFuZGxlYmFyc0Vudmlyb25tZW50ID0gSGFuZGxlYmFyc0Vudmlyb25tZW50O1xuZXhwb3J0cy5jcmVhdGVGcmFtZSA9IGNyZWF0ZUZyYW1lO1xuXG52YXIgX2ltcG9ydCA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxudmFyIFV0aWxzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX2ltcG9ydCk7XG5cbnZhciBfRXhjZXB0aW9uID0gcmVxdWlyZSgnLi9leGNlcHRpb24nKTtcblxudmFyIF9FeGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX0V4Y2VwdGlvbik7XG5cbnZhciBWRVJTSU9OID0gJzMuMC4xJztcbmV4cG9ydHMuVkVSU0lPTiA9IFZFUlNJT047XG52YXIgQ09NUElMRVJfUkVWSVNJT04gPSA2O1xuXG5leHBvcnRzLkNPTVBJTEVSX1JFVklTSU9OID0gQ09NUElMRVJfUkVWSVNJT047XG52YXIgUkVWSVNJT05fQ0hBTkdFUyA9IHtcbiAgMTogJzw9IDEuMC5yYy4yJywgLy8gMS4wLnJjLjIgaXMgYWN0dWFsbHkgcmV2MiBidXQgZG9lc24ndCByZXBvcnQgaXRcbiAgMjogJz09IDEuMC4wLXJjLjMnLFxuICAzOiAnPT0gMS4wLjAtcmMuNCcsXG4gIDQ6ICc9PSAxLngueCcsXG4gIDU6ICc9PSAyLjAuMC1hbHBoYS54JyxcbiAgNjogJz49IDIuMC4wLWJldGEuMSdcbn07XG5cbmV4cG9ydHMuUkVWSVNJT05fQ0hBTkdFUyA9IFJFVklTSU9OX0NIQU5HRVM7XG52YXIgaXNBcnJheSA9IFV0aWxzLmlzQXJyYXksXG4gICAgaXNGdW5jdGlvbiA9IFV0aWxzLmlzRnVuY3Rpb24sXG4gICAgdG9TdHJpbmcgPSBVdGlscy50b1N0cmluZyxcbiAgICBvYmplY3RUeXBlID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbmZ1bmN0aW9uIEhhbmRsZWJhcnNFbnZpcm9ubWVudChoZWxwZXJzLCBwYXJ0aWFscykge1xuICB0aGlzLmhlbHBlcnMgPSBoZWxwZXJzIHx8IHt9O1xuICB0aGlzLnBhcnRpYWxzID0gcGFydGlhbHMgfHwge307XG5cbiAgcmVnaXN0ZXJEZWZhdWx0SGVscGVycyh0aGlzKTtcbn1cblxuSGFuZGxlYmFyc0Vudmlyb25tZW50LnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEhhbmRsZWJhcnNFbnZpcm9ubWVudCxcblxuICBsb2dnZXI6IGxvZ2dlcixcbiAgbG9nOiBsb2csXG5cbiAgcmVnaXN0ZXJIZWxwZXI6IGZ1bmN0aW9uIHJlZ2lzdGVySGVscGVyKG5hbWUsIGZuKSB7XG4gICAgaWYgKHRvU3RyaW5nLmNhbGwobmFtZSkgPT09IG9iamVjdFR5cGUpIHtcbiAgICAgIGlmIChmbikge1xuICAgICAgICB0aHJvdyBuZXcgX0V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnQXJnIG5vdCBzdXBwb3J0ZWQgd2l0aCBtdWx0aXBsZSBoZWxwZXJzJyk7XG4gICAgICB9XG4gICAgICBVdGlscy5leHRlbmQodGhpcy5oZWxwZXJzLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWxwZXJzW25hbWVdID0gZm47XG4gICAgfVxuICB9LFxuICB1bnJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiB1bnJlZ2lzdGVySGVscGVyKG5hbWUpIHtcbiAgICBkZWxldGUgdGhpcy5oZWxwZXJzW25hbWVdO1xuICB9LFxuXG4gIHJlZ2lzdGVyUGFydGlhbDogZnVuY3Rpb24gcmVnaXN0ZXJQYXJ0aWFsKG5hbWUsIHBhcnRpYWwpIHtcbiAgICBpZiAodG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkge1xuICAgICAgVXRpbHMuZXh0ZW5kKHRoaXMucGFydGlhbHMsIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHBhcnRpYWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKCdBdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIGEgcGFydGlhbCBhcyB1bmRlZmluZWQnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGFydGlhbHNbbmFtZV0gPSBwYXJ0aWFsO1xuICAgIH1cbiAgfSxcbiAgdW5yZWdpc3RlclBhcnRpYWw6IGZ1bmN0aW9uIHVucmVnaXN0ZXJQYXJ0aWFsKG5hbWUpIHtcbiAgICBkZWxldGUgdGhpcy5wYXJ0aWFsc1tuYW1lXTtcbiAgfVxufTtcblxuZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0SGVscGVycyhpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignaGVscGVyTWlzc2luZycsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgLy8gQSBtaXNzaW5nIGZpZWxkIGluIGEge3tmb299fSBjb25zdHVjdC5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNvbWVvbmUgaXMgYWN0dWFsbHkgdHJ5aW5nIHRvIGNhbGwgc29tZXRoaW5nLCBibG93IHVwLlxuICAgICAgdGhyb3cgbmV3IF9FeGNlcHRpb24yWydkZWZhdWx0J10oJ01pc3NpbmcgaGVscGVyOiBcIicgKyBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdLm5hbWUgKyAnXCInKTtcbiAgICB9XG4gIH0pO1xuXG4gIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdibG9ja0hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykge1xuICAgIHZhciBpbnZlcnNlID0gb3B0aW9ucy5pbnZlcnNlLFxuICAgICAgICBmbiA9IG9wdGlvbnMuZm47XG5cbiAgICBpZiAoY29udGV4dCA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGZuKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoY29udGV4dCA9PT0gZmFsc2UgfHwgY29udGV4dCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gaW52ZXJzZSh0aGlzKTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkoY29udGV4dCkpIHtcbiAgICAgIGlmIChjb250ZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuaWRzKSB7XG4gICAgICAgICAgb3B0aW9ucy5pZHMgPSBbb3B0aW9ucy5uYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbnN0YW5jZS5oZWxwZXJzLmVhY2goY29udGV4dCwgb3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaW52ZXJzZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykge1xuICAgICAgICB2YXIgZGF0YSA9IGNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7XG4gICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBVdGlscy5hcHBlbmRDb250ZXh0UGF0aChvcHRpb25zLmRhdGEuY29udGV4dFBhdGgsIG9wdGlvbnMubmFtZSk7XG4gICAgICAgIG9wdGlvbnMgPSB7IGRhdGE6IGRhdGEgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIG9wdGlvbnMpO1xuICAgIH1cbiAgfSk7XG5cbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2VhY2gnLCBmdW5jdGlvbiAoY29udGV4dCwgb3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgdGhyb3cgbmV3IF9FeGNlcHRpb24yWydkZWZhdWx0J10oJ011c3QgcGFzcyBpdGVyYXRvciB0byAjZWFjaCcpO1xuICAgIH1cblxuICAgIHZhciBmbiA9IG9wdGlvbnMuZm4sXG4gICAgICAgIGludmVyc2UgPSBvcHRpb25zLmludmVyc2UsXG4gICAgICAgIGkgPSAwLFxuICAgICAgICByZXQgPSAnJyxcbiAgICAgICAgZGF0YSA9IHVuZGVmaW5lZCxcbiAgICAgICAgY29udGV4dFBhdGggPSB1bmRlZmluZWQ7XG5cbiAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICBjb250ZXh0UGF0aCA9IFV0aWxzLmFwcGVuZENvbnRleHRQYXRoKG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCwgb3B0aW9ucy5pZHNbMF0pICsgJy4nO1xuICAgIH1cblxuICAgIGlmIChpc0Z1bmN0aW9uKGNvbnRleHQpKSB7XG4gICAgICBjb250ZXh0ID0gY29udGV4dC5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmRhdGEpIHtcbiAgICAgIGRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4ZWNJdGVyYXRpb24oZmllbGQsIGluZGV4LCBsYXN0KSB7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBkYXRhLmtleSA9IGZpZWxkO1xuICAgICAgICBkYXRhLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIGRhdGEuZmlyc3QgPSBpbmRleCA9PT0gMDtcbiAgICAgICAgZGF0YS5sYXN0ID0gISFsYXN0O1xuXG4gICAgICAgIGlmIChjb250ZXh0UGF0aCkge1xuICAgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aCArIGZpZWxkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldCA9IHJldCArIGZuKGNvbnRleHRbZmllbGRdLCB7XG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGJsb2NrUGFyYW1zOiBVdGlscy5ibG9ja1BhcmFtcyhbY29udGV4dFtmaWVsZF0sIGZpZWxkXSwgW2NvbnRleHRQYXRoICsgZmllbGQsIG51bGxdKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoaXNBcnJheShjb250ZXh0KSkge1xuICAgICAgICBmb3IgKHZhciBqID0gY29udGV4dC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICBleGVjSXRlcmF0aW9uKGksIGksIGkgPT09IGNvbnRleHQubGVuZ3RoIC0gMSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBwcmlvcktleSA9IHVuZGVmaW5lZDtcblxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29udGV4dCkge1xuICAgICAgICAgIGlmIChjb250ZXh0Lmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgIC8vIFdlJ3JlIHJ1bm5pbmcgdGhlIGl0ZXJhdGlvbnMgb25lIHN0ZXAgb3V0IG9mIHN5bmMgc28gd2UgY2FuIGRldGVjdFxuICAgICAgICAgICAgLy8gdGhlIGxhc3QgaXRlcmF0aW9uIHdpdGhvdXQgaGF2ZSB0byBzY2FuIHRoZSBvYmplY3QgdHdpY2UgYW5kIGNyZWF0ZVxuICAgICAgICAgICAgLy8gYW4gaXRlcm1lZGlhdGUga2V5cyBhcnJheS5cbiAgICAgICAgICAgIGlmIChwcmlvcktleSkge1xuICAgICAgICAgICAgICBleGVjSXRlcmF0aW9uKHByaW9yS2V5LCBpIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmlvcktleSA9IGtleTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByaW9yS2V5KSB7XG4gICAgICAgICAgZXhlY0l0ZXJhdGlvbihwcmlvcktleSwgaSAtIDEsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIHJldCA9IGludmVyc2UodGhpcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfSk7XG5cbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2lmJywgZnVuY3Rpb24gKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oY29uZGl0aW9uYWwpKSB7XG4gICAgICBjb25kaXRpb25hbCA9IGNvbmRpdGlvbmFsLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBiZWhhdmlvciBpcyB0byByZW5kZXIgdGhlIHBvc2l0aXZlIHBhdGggaWYgdGhlIHZhbHVlIGlzIHRydXRoeSBhbmQgbm90IGVtcHR5LlxuICAgIC8vIFRoZSBgaW5jbHVkZVplcm9gIG9wdGlvbiBtYXkgYmUgc2V0IHRvIHRyZWF0IHRoZSBjb25kdGlvbmFsIGFzIHB1cmVseSBub3QgZW1wdHkgYmFzZWQgb24gdGhlXG4gICAgLy8gYmVoYXZpb3Igb2YgaXNFbXB0eS4gRWZmZWN0aXZlbHkgdGhpcyBkZXRlcm1pbmVzIGlmIDAgaXMgaGFuZGxlZCBieSB0aGUgcG9zaXRpdmUgcGF0aCBvciBuZWdhdGl2ZS5cbiAgICBpZiAoIW9wdGlvbnMuaGFzaC5pbmNsdWRlWmVybyAmJiAhY29uZGl0aW9uYWwgfHwgVXRpbHMuaXNFbXB0eShjb25kaXRpb25hbCkpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpO1xuICAgIH1cbiAgfSk7XG5cbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3VubGVzcycsIGZ1bmN0aW9uIChjb25kaXRpb25hbCwgb3B0aW9ucykge1xuICAgIHJldHVybiBpbnN0YW5jZS5oZWxwZXJzWydpZiddLmNhbGwodGhpcywgY29uZGl0aW9uYWwsIHsgZm46IG9wdGlvbnMuaW52ZXJzZSwgaW52ZXJzZTogb3B0aW9ucy5mbiwgaGFzaDogb3B0aW9ucy5oYXNoIH0pO1xuICB9KTtcblxuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignd2l0aCcsIGZ1bmN0aW9uIChjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oY29udGV4dCkpIHtcbiAgICAgIGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgdmFyIGZuID0gb3B0aW9ucy5mbjtcblxuICAgIGlmICghVXRpbHMuaXNFbXB0eShjb250ZXh0KSkge1xuICAgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykge1xuICAgICAgICB2YXIgZGF0YSA9IGNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7XG4gICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBVdGlscy5hcHBlbmRDb250ZXh0UGF0aChvcHRpb25zLmRhdGEuY29udGV4dFBhdGgsIG9wdGlvbnMuaWRzWzBdKTtcbiAgICAgICAgb3B0aW9ucyA9IHsgZGF0YTogZGF0YSB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm4oY29udGV4dCwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgfVxuICB9KTtcblxuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignbG9nJywgZnVuY3Rpb24gKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICB2YXIgbGV2ZWwgPSBvcHRpb25zLmRhdGEgJiYgb3B0aW9ucy5kYXRhLmxldmVsICE9IG51bGwgPyBwYXJzZUludChvcHRpb25zLmRhdGEubGV2ZWwsIDEwKSA6IDE7XG4gICAgaW5zdGFuY2UubG9nKGxldmVsLCBtZXNzYWdlKTtcbiAgfSk7XG5cbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvb2t1cCcsIGZ1bmN0aW9uIChvYmosIGZpZWxkKSB7XG4gICAgcmV0dXJuIG9iaiAmJiBvYmpbZmllbGRdO1xuICB9KTtcbn1cblxudmFyIGxvZ2dlciA9IHtcbiAgbWV0aG9kTWFwOiB7IDA6ICdkZWJ1ZycsIDE6ICdpbmZvJywgMjogJ3dhcm4nLCAzOiAnZXJyb3InIH0sXG5cbiAgLy8gU3RhdGUgZW51bVxuICBERUJVRzogMCxcbiAgSU5GTzogMSxcbiAgV0FSTjogMixcbiAgRVJST1I6IDMsXG4gIGxldmVsOiAxLFxuXG4gIC8vIENhbiBiZSBvdmVycmlkZGVuIGluIHRoZSBob3N0IGVudmlyb25tZW50XG4gIGxvZzogZnVuY3Rpb24gbG9nKGxldmVsLCBtZXNzYWdlKSB7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiBsb2dnZXIubGV2ZWwgPD0gbGV2ZWwpIHtcbiAgICAgIHZhciBtZXRob2QgPSBsb2dnZXIubWV0aG9kTWFwW2xldmVsXTtcbiAgICAgIChjb25zb2xlW21ldGhvZF0gfHwgY29uc29sZS5sb2cpLmNhbGwoY29uc29sZSwgbWVzc2FnZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0cy5sb2dnZXIgPSBsb2dnZXI7XG52YXIgbG9nID0gbG9nZ2VyLmxvZztcblxuZXhwb3J0cy5sb2cgPSBsb2c7XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyYW1lKG9iamVjdCkge1xuICB2YXIgZnJhbWUgPSBVdGlscy5leHRlbmQoe30sIG9iamVjdCk7XG4gIGZyYW1lLl9wYXJlbnQgPSBvYmplY3Q7XG4gIHJldHVybiBmcmFtZTtcbn1cblxuLyogW2FyZ3MsIF1vcHRpb25zICovIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIEFTVCA9IHtcbiAgUHJvZ3JhbTogZnVuY3Rpb24gUHJvZ3JhbShzdGF0ZW1lbnRzLCBibG9ja1BhcmFtcywgc3RyaXAsIGxvY0luZm8pIHtcbiAgICB0aGlzLmxvYyA9IGxvY0luZm87XG4gICAgdGhpcy50eXBlID0gJ1Byb2dyYW0nO1xuICAgIHRoaXMuYm9keSA9IHN0YXRlbWVudHM7XG5cbiAgICB0aGlzLmJsb2NrUGFyYW1zID0gYmxvY2tQYXJhbXM7XG4gICAgdGhpcy5zdHJpcCA9IHN0cmlwO1xuICB9LFxuXG4gIE11c3RhY2hlU3RhdGVtZW50OiBmdW5jdGlvbiBNdXN0YWNoZVN0YXRlbWVudChwYXRoLCBwYXJhbXMsIGhhc2gsIGVzY2FwZWQsIHN0cmlwLCBsb2NJbmZvKSB7XG4gICAgdGhpcy5sb2MgPSBsb2NJbmZvO1xuICAgIHRoaXMudHlwZSA9ICdNdXN0YWNoZVN0YXRlbWVudCc7XG5cbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zIHx8IFtdO1xuICAgIHRoaXMuaGFzaCA9IGhhc2g7XG4gICAgdGhpcy5lc2NhcGVkID0gZXNjYXBlZDtcblxuICAgIHRoaXMuc3RyaXAgPSBzdHJpcDtcbiAgfSxcblxuICBCbG9ja1N0YXRlbWVudDogZnVuY3Rpb24gQmxvY2tTdGF0ZW1lbnQocGF0aCwgcGFyYW1zLCBoYXNoLCBwcm9ncmFtLCBpbnZlcnNlLCBvcGVuU3RyaXAsIGludmVyc2VTdHJpcCwgY2xvc2VTdHJpcCwgbG9jSW5mbykge1xuICAgIHRoaXMubG9jID0gbG9jSW5mbztcbiAgICB0aGlzLnR5cGUgPSAnQmxvY2tTdGF0ZW1lbnQnO1xuXG4gICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcyB8fCBbXTtcbiAgICB0aGlzLmhhc2ggPSBoYXNoO1xuICAgIHRoaXMucHJvZ3JhbSA9IHByb2dyYW07XG4gICAgdGhpcy5pbnZlcnNlID0gaW52ZXJzZTtcblxuICAgIHRoaXMub3BlblN0cmlwID0gb3BlblN0cmlwO1xuICAgIHRoaXMuaW52ZXJzZVN0cmlwID0gaW52ZXJzZVN0cmlwO1xuICAgIHRoaXMuY2xvc2VTdHJpcCA9IGNsb3NlU3RyaXA7XG4gIH0sXG5cbiAgUGFydGlhbFN0YXRlbWVudDogZnVuY3Rpb24gUGFydGlhbFN0YXRlbWVudChuYW1lLCBwYXJhbXMsIGhhc2gsIHN0cmlwLCBsb2NJbmZvKSB7XG4gICAgdGhpcy5sb2MgPSBsb2NJbmZvO1xuICAgIHRoaXMudHlwZSA9ICdQYXJ0aWFsU3RhdGVtZW50JztcblxuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXMgfHwgW107XG4gICAgdGhpcy5oYXNoID0gaGFzaDtcblxuICAgIHRoaXMuaW5kZW50ID0gJyc7XG4gICAgdGhpcy5zdHJpcCA9IHN0cmlwO1xuICB9LFxuXG4gIENvbnRlbnRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIENvbnRlbnRTdGF0ZW1lbnQoc3RyaW5nLCBsb2NJbmZvKSB7XG4gICAgdGhpcy5sb2MgPSBsb2NJbmZvO1xuICAgIHRoaXMudHlwZSA9ICdDb250ZW50U3RhdGVtZW50JztcbiAgICB0aGlzLm9yaWdpbmFsID0gdGhpcy52YWx1ZSA9IHN0cmluZztcbiAgfSxcblxuICBDb21tZW50U3RhdGVtZW50OiBmdW5jdGlvbiBDb21tZW50U3RhdGVtZW50KGNvbW1lbnQsIHN0cmlwLCBsb2NJbmZvKSB7XG4gICAgdGhpcy5sb2MgPSBsb2NJbmZvO1xuICAgIHRoaXMudHlwZSA9ICdDb21tZW50U3RhdGVtZW50JztcbiAgICB0aGlzLnZhbHVlID0gY29tbWVudDtcblxuICAgIHRoaXMuc3RyaXAgPSBzdHJpcDtcbiAgfSxcblxuICBTdWJFeHByZXNzaW9uOiBmdW5jdGlvbiBTdWJFeHByZXNzaW9uKHBhdGgsIHBhcmFtcywgaGFzaCwgbG9jSW5mbykge1xuICAgIHRoaXMubG9jID0gbG9jSW5mbztcblxuICAgIHRoaXMudHlwZSA9ICdTdWJFeHByZXNzaW9uJztcbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zIHx8IFtdO1xuICAgIHRoaXMuaGFzaCA9IGhhc2g7XG4gIH0sXG5cbiAgUGF0aEV4cHJlc3Npb246IGZ1bmN0aW9uIFBhdGhFeHByZXNzaW9uKGRhdGEsIGRlcHRoLCBwYXJ0cywgb3JpZ2luYWwsIGxvY0luZm8pIHtcbiAgICB0aGlzLmxvYyA9IGxvY0luZm87XG4gICAgdGhpcy50eXBlID0gJ1BhdGhFeHByZXNzaW9uJztcblxuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5vcmlnaW5hbCA9IG9yaWdpbmFsO1xuICAgIHRoaXMucGFydHMgPSBwYXJ0cztcbiAgICB0aGlzLmRlcHRoID0gZGVwdGg7XG4gIH0sXG5cbiAgU3RyaW5nTGl0ZXJhbDogZnVuY3Rpb24gU3RyaW5nTGl0ZXJhbChzdHJpbmcsIGxvY0luZm8pIHtcbiAgICB0aGlzLmxvYyA9IGxvY0luZm87XG4gICAgdGhpcy50eXBlID0gJ1N0cmluZ0xpdGVyYWwnO1xuICAgIHRoaXMub3JpZ2luYWwgPSB0aGlzLnZhbHVlID0gc3RyaW5nO1xuICB9LFxuXG4gIE51bWJlckxpdGVyYWw6IGZ1bmN0aW9uIE51bWJlckxpdGVyYWwobnVtYmVyLCBsb2NJbmZvKSB7XG4gICAgdGhpcy5sb2MgPSBsb2NJbmZvO1xuICAgIHRoaXMudHlwZSA9ICdOdW1iZXJMaXRlcmFsJztcbiAgICB0aGlzLm9yaWdpbmFsID0gdGhpcy52YWx1ZSA9IE51bWJlcihudW1iZXIpO1xuICB9LFxuXG4gIEJvb2xlYW5MaXRlcmFsOiBmdW5jdGlvbiBCb29sZWFuTGl0ZXJhbChib29sLCBsb2NJbmZvKSB7XG4gICAgdGhpcy5sb2MgPSBsb2NJbmZvO1xuICAgIHRoaXMudHlwZSA9ICdCb29sZWFuTGl0ZXJhbCc7XG4gICAgdGhpcy5vcmlnaW5hbCA9IHRoaXMudmFsdWUgPSBib29sID09PSAndHJ1ZSc7XG4gIH0sXG5cbiAgVW5kZWZpbmVkTGl0ZXJhbDogZnVuY3Rpb24gVW5kZWZpbmVkTGl0ZXJhbChsb2NJbmZvKSB7XG4gICAgdGhpcy5sb2MgPSBsb2NJbmZvO1xuICAgIHRoaXMudHlwZSA9ICdVbmRlZmluZWRMaXRlcmFsJztcbiAgICB0aGlzLm9yaWdpbmFsID0gdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgfSxcblxuICBOdWxsTGl0ZXJhbDogZnVuY3Rpb24gTnVsbExpdGVyYWwobG9jSW5mbykge1xuICAgIHRoaXMubG9jID0gbG9jSW5mbztcbiAgICB0aGlzLnR5cGUgPSAnTnVsbExpdGVyYWwnO1xuICAgIHRoaXMub3JpZ2luYWwgPSB0aGlzLnZhbHVlID0gbnVsbDtcbiAgfSxcblxuICBIYXNoOiBmdW5jdGlvbiBIYXNoKHBhaXJzLCBsb2NJbmZvKSB7XG4gICAgdGhpcy5sb2MgPSBsb2NJbmZvO1xuICAgIHRoaXMudHlwZSA9ICdIYXNoJztcbiAgICB0aGlzLnBhaXJzID0gcGFpcnM7XG4gIH0sXG4gIEhhc2hQYWlyOiBmdW5jdGlvbiBIYXNoUGFpcihrZXksIHZhbHVlLCBsb2NJbmZvKSB7XG4gICAgdGhpcy5sb2MgPSBsb2NJbmZvO1xuICAgIHRoaXMudHlwZSA9ICdIYXNoUGFpcic7XG4gICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9LFxuXG4gIC8vIFB1YmxpYyBBUEkgdXNlZCB0byBldmFsdWF0ZSBkZXJpdmVkIGF0dHJpYnV0ZXMgcmVnYXJkaW5nIEFTVCBub2Rlc1xuICBoZWxwZXJzOiB7XG4gICAgLy8gYSBtdXN0YWNoZSBpcyBkZWZpbml0ZWx5IGEgaGVscGVyIGlmOlxuICAgIC8vICogaXQgaXMgYW4gZWxpZ2libGUgaGVscGVyLCBhbmRcbiAgICAvLyAqIGl0IGhhcyBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIG9yIGhhc2ggc2VnbWVudFxuICAgIGhlbHBlckV4cHJlc3Npb246IGZ1bmN0aW9uIGhlbHBlckV4cHJlc3Npb24obm9kZSkge1xuICAgICAgcmV0dXJuICEhKG5vZGUudHlwZSA9PT0gJ1N1YkV4cHJlc3Npb24nIHx8IG5vZGUucGFyYW1zLmxlbmd0aCB8fCBub2RlLmhhc2gpO1xuICAgIH0sXG5cbiAgICBzY29wZWRJZDogZnVuY3Rpb24gc2NvcGVkSWQocGF0aCkge1xuICAgICAgcmV0dXJuIC9eXFwufHRoaXNcXGIvLnRlc3QocGF0aC5vcmlnaW5hbCk7XG4gICAgfSxcblxuICAgIC8vIGFuIElEIGlzIHNpbXBsZSBpZiBpdCBvbmx5IGhhcyBvbmUgcGFydCwgYW5kIHRoYXQgcGFydCBpcyBub3RcbiAgICAvLyBgLi5gIG9yIGB0aGlzYC5cbiAgICBzaW1wbGVJZDogZnVuY3Rpb24gc2ltcGxlSWQocGF0aCkge1xuICAgICAgcmV0dXJuIHBhdGgucGFydHMubGVuZ3RoID09PSAxICYmICFBU1QuaGVscGVycy5zY29wZWRJZChwYXRoKSAmJiAhcGF0aC5kZXB0aDtcbiAgICB9XG4gIH1cbn07XG5cbi8vIE11c3QgYmUgZXhwb3J0ZWQgYXMgYW4gb2JqZWN0IHJhdGhlciB0aGFuIHRoZSByb290IG9mIHRoZSBtb2R1bGUgYXMgdGhlIGppc29uIGxleGVyXG4vLyBtdXN0IG1vZGlmeSB0aGUgb2JqZWN0IHRvIG9wZXJhdGUgcHJvcGVybHkuXG5leHBvcnRzWydkZWZhdWx0J10gPSBBU1Q7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMucGFyc2UgPSBwYXJzZTtcblxudmFyIF9wYXJzZXIgPSByZXF1aXJlKCcuL3BhcnNlcicpO1xuXG52YXIgX3BhcnNlcjIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfcGFyc2VyKTtcblxudmFyIF9BU1QgPSByZXF1aXJlKCcuL2FzdCcpO1xuXG52YXIgX0FTVDIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfQVNUKTtcblxudmFyIF9XaGl0ZXNwYWNlQ29udHJvbCA9IHJlcXVpcmUoJy4vd2hpdGVzcGFjZS1jb250cm9sJyk7XG5cbnZhciBfV2hpdGVzcGFjZUNvbnRyb2wyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX1doaXRlc3BhY2VDb250cm9sKTtcblxudmFyIF9pbXBvcnQgPSByZXF1aXJlKCcuL2hlbHBlcnMnKTtcblxudmFyIEhlbHBlcnMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfaW1wb3J0KTtcblxudmFyIF9leHRlbmQgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG5leHBvcnRzLnBhcnNlciA9IF9wYXJzZXIyWydkZWZhdWx0J107XG5cbnZhciB5eSA9IHt9O1xuX2V4dGVuZC5leHRlbmQoeXksIEhlbHBlcnMsIF9BU1QyWydkZWZhdWx0J10pO1xuXG5mdW5jdGlvbiBwYXJzZShpbnB1dCwgb3B0aW9ucykge1xuICAvLyBKdXN0IHJldHVybiBpZiBhbiBhbHJlYWR5LWNvbXBpbGVkIEFTVCB3YXMgcGFzc2VkIGluLlxuICBpZiAoaW5wdXQudHlwZSA9PT0gJ1Byb2dyYW0nKSB7XG4gICAgcmV0dXJuIGlucHV0O1xuICB9XG5cbiAgX3BhcnNlcjJbJ2RlZmF1bHQnXS55eSA9IHl5O1xuXG4gIC8vIEFsdGVyaW5nIHRoZSBzaGFyZWQgb2JqZWN0IGhlcmUsIGJ1dCB0aGlzIGlzIG9rIGFzIHBhcnNlciBpcyBhIHN5bmMgb3BlcmF0aW9uXG4gIHl5LmxvY0luZm8gPSBmdW5jdGlvbiAobG9jSW5mbykge1xuICAgIHJldHVybiBuZXcgeXkuU291cmNlTG9jYXRpb24ob3B0aW9ucyAmJiBvcHRpb25zLnNyY05hbWUsIGxvY0luZm8pO1xuICB9O1xuXG4gIHZhciBzdHJpcCA9IG5ldyBfV2hpdGVzcGFjZUNvbnRyb2wyWydkZWZhdWx0J10oKTtcbiAgcmV0dXJuIHN0cmlwLmFjY2VwdChfcGFyc2VyMlsnZGVmYXVsdCddLnBhcnNlKGlucHV0KSk7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuLypnbG9iYWwgZGVmaW5lICovXG5cbnZhciBfaXNBcnJheSA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbnZhciBTb3VyY2VOb2RlID0gdW5kZWZpbmVkO1xuXG50cnkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAodHlwZW9mIGRlZmluZSAhPT0gJ2Z1bmN0aW9uJyB8fCAhZGVmaW5lLmFtZCkge1xuICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgdGhpcyBpbiBBTUQgZW52aXJvbm1lbnRzLiBGb3IgdGhlc2UgZW52aXJvbm1lbnRzLCB3ZSBhc3VzbWUgdGhhdFxuICAgIC8vIHRoZXkgYXJlIHJ1bm5pbmcgb24gdGhlIGJyb3dzZXIgYW5kIHRodXMgaGF2ZSBubyBuZWVkIGZvciB0aGUgc291cmNlLW1hcCBsaWJyYXJ5LlxuICAgIHZhciBTb3VyY2VNYXAgPSByZXF1aXJlKCdzb3VyY2UtbWFwJyk7XG4gICAgU291cmNlTm9kZSA9IFNvdXJjZU1hcC5Tb3VyY2VOb2RlO1xuICB9XG59IGNhdGNoIChlcnIpIHt9XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBpZjogdGVzdGVkIGJ1dCBub3QgY292ZXJlZCBpbiBpc3RhbmJ1bCBkdWUgdG8gZGlzdCBidWlsZCAgKi9cbmlmICghU291cmNlTm9kZSkge1xuICBTb3VyY2VOb2RlID0gZnVuY3Rpb24gKGxpbmUsIGNvbHVtbiwgc3JjRmlsZSwgY2h1bmtzKSB7XG4gICAgdGhpcy5zcmMgPSAnJztcbiAgICBpZiAoY2h1bmtzKSB7XG4gICAgICB0aGlzLmFkZChjaHVua3MpO1xuICAgIH1cbiAgfTtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgU291cmNlTm9kZS5wcm90b3R5cGUgPSB7XG4gICAgYWRkOiBmdW5jdGlvbiBhZGQoY2h1bmtzKSB7XG4gICAgICBpZiAoX2lzQXJyYXkuaXNBcnJheShjaHVua3MpKSB7XG4gICAgICAgIGNodW5rcyA9IGNodW5rcy5qb2luKCcnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3JjICs9IGNodW5rcztcbiAgICB9LFxuICAgIHByZXBlbmQ6IGZ1bmN0aW9uIHByZXBlbmQoY2h1bmtzKSB7XG4gICAgICBpZiAoX2lzQXJyYXkuaXNBcnJheShjaHVua3MpKSB7XG4gICAgICAgIGNodW5rcyA9IGNodW5rcy5qb2luKCcnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3JjID0gY2h1bmtzICsgdGhpcy5zcmM7XG4gICAgfSxcbiAgICB0b1N0cmluZ1dpdGhTb3VyY2VNYXA6IGZ1bmN0aW9uIHRvU3RyaW5nV2l0aFNvdXJjZU1hcCgpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IHRoaXMudG9TdHJpbmcoKSB9O1xuICAgIH0sXG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3JjO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY2FzdENodW5rKGNodW5rLCBjb2RlR2VuLCBsb2MpIHtcbiAgaWYgKF9pc0FycmF5LmlzQXJyYXkoY2h1bmspKSB7XG4gICAgdmFyIHJldCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNodW5rLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICByZXQucHVzaChjb2RlR2VuLndyYXAoY2h1bmtbaV0sIGxvYykpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9IGVsc2UgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiBjaHVuayA9PT0gJ251bWJlcicpIHtcbiAgICAvLyBIYW5kbGUgcHJpbWl0aXZlcyB0aGF0IHRoZSBTb3VyY2VOb2RlIHdpbGwgdGhyb3cgdXAgb25cbiAgICByZXR1cm4gY2h1bmsgKyAnJztcbiAgfVxuICByZXR1cm4gY2h1bms7XG59XG5cbmZ1bmN0aW9uIENvZGVHZW4oc3JjRmlsZSkge1xuICB0aGlzLnNyY0ZpbGUgPSBzcmNGaWxlO1xuICB0aGlzLnNvdXJjZSA9IFtdO1xufVxuXG5Db2RlR2VuLnByb3RvdHlwZSA9IHtcbiAgcHJlcGVuZDogZnVuY3Rpb24gcHJlcGVuZChzb3VyY2UsIGxvYykge1xuICAgIHRoaXMuc291cmNlLnVuc2hpZnQodGhpcy53cmFwKHNvdXJjZSwgbG9jKSk7XG4gIH0sXG4gIHB1c2g6IGZ1bmN0aW9uIHB1c2goc291cmNlLCBsb2MpIHtcbiAgICB0aGlzLnNvdXJjZS5wdXNoKHRoaXMud3JhcChzb3VyY2UsIGxvYykpO1xuICB9LFxuXG4gIG1lcmdlOiBmdW5jdGlvbiBtZXJnZSgpIHtcbiAgICB2YXIgc291cmNlID0gdGhpcy5lbXB0eSgpO1xuICAgIHRoaXMuZWFjaChmdW5jdGlvbiAobGluZSkge1xuICAgICAgc291cmNlLmFkZChbJyAgJywgbGluZSwgJ1xcbiddKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc291cmNlO1xuICB9LFxuXG4gIGVhY2g6IGZ1bmN0aW9uIGVhY2goaXRlcikge1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB0aGlzLnNvdXJjZS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgaXRlcih0aGlzLnNvdXJjZVtpXSk7XG4gICAgfVxuICB9LFxuXG4gIGVtcHR5OiBmdW5jdGlvbiBlbXB0eSgpIHtcbiAgICB2YXIgbG9jID0gYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB0aGlzLmN1cnJlbnRMb2NhdGlvbiB8fCB7IHN0YXJ0OiB7fSB9IDogYXJndW1lbnRzWzBdO1xuXG4gICAgcmV0dXJuIG5ldyBTb3VyY2VOb2RlKGxvYy5zdGFydC5saW5lLCBsb2Muc3RhcnQuY29sdW1uLCB0aGlzLnNyY0ZpbGUpO1xuICB9LFxuICB3cmFwOiBmdW5jdGlvbiB3cmFwKGNodW5rKSB7XG4gICAgdmFyIGxvYyA9IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gdGhpcy5jdXJyZW50TG9jYXRpb24gfHwgeyBzdGFydDoge30gfSA6IGFyZ3VtZW50c1sxXTtcblxuICAgIGlmIChjaHVuayBpbnN0YW5jZW9mIFNvdXJjZU5vZGUpIHtcbiAgICAgIHJldHVybiBjaHVuaztcbiAgICB9XG5cbiAgICBjaHVuayA9IGNhc3RDaHVuayhjaHVuaywgdGhpcywgbG9jKTtcblxuICAgIHJldHVybiBuZXcgU291cmNlTm9kZShsb2Muc3RhcnQubGluZSwgbG9jLnN0YXJ0LmNvbHVtbiwgdGhpcy5zcmNGaWxlLCBjaHVuayk7XG4gIH0sXG5cbiAgZnVuY3Rpb25DYWxsOiBmdW5jdGlvbiBmdW5jdGlvbkNhbGwoZm4sIHR5cGUsIHBhcmFtcykge1xuICAgIHBhcmFtcyA9IHRoaXMuZ2VuZXJhdGVMaXN0KHBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXMud3JhcChbZm4sIHR5cGUgPyAnLicgKyB0eXBlICsgJygnIDogJygnLCBwYXJhbXMsICcpJ10pO1xuICB9LFxuXG4gIHF1b3RlZFN0cmluZzogZnVuY3Rpb24gcXVvdGVkU3RyaW5nKHN0cikge1xuICAgIHJldHVybiAnXCInICsgKHN0ciArICcnKS5yZXBsYWNlKC9cXFxcL2csICdcXFxcXFxcXCcpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXG4vZywgJ1xcXFxuJykucmVwbGFjZSgvXFxyL2csICdcXFxccicpLnJlcGxhY2UoL1xcdTIwMjgvZywgJ1xcXFx1MjAyOCcpIC8vIFBlciBFY21hLTI2MiA3LjMgKyA3LjguNFxuICAgIC5yZXBsYWNlKC9cXHUyMDI5L2csICdcXFxcdTIwMjknKSArICdcIic7XG4gIH0sXG5cbiAgb2JqZWN0TGl0ZXJhbDogZnVuY3Rpb24gb2JqZWN0TGl0ZXJhbChvYmopIHtcbiAgICB2YXIgcGFpcnMgPSBbXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBjYXN0Q2h1bmsob2JqW2tleV0sIHRoaXMpO1xuICAgICAgICBpZiAodmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgcGFpcnMucHVzaChbdGhpcy5xdW90ZWRTdHJpbmcoa2V5KSwgJzonLCB2YWx1ZV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJldCA9IHRoaXMuZ2VuZXJhdGVMaXN0KHBhaXJzKTtcbiAgICByZXQucHJlcGVuZCgneycpO1xuICAgIHJldC5hZGQoJ30nKTtcbiAgICByZXR1cm4gcmV0O1xuICB9LFxuXG4gIGdlbmVyYXRlTGlzdDogZnVuY3Rpb24gZ2VuZXJhdGVMaXN0KGVudHJpZXMsIGxvYykge1xuICAgIHZhciByZXQgPSB0aGlzLmVtcHR5KGxvYyk7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZW50cmllcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgaWYgKGkpIHtcbiAgICAgICAgcmV0LmFkZCgnLCcpO1xuICAgICAgfVxuXG4gICAgICByZXQuYWRkKGNhc3RDaHVuayhlbnRyaWVzW2ldLCB0aGlzLCBsb2MpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9LFxuXG4gIGdlbmVyYXRlQXJyYXk6IGZ1bmN0aW9uIGdlbmVyYXRlQXJyYXkoZW50cmllcywgbG9jKSB7XG4gICAgdmFyIHJldCA9IHRoaXMuZ2VuZXJhdGVMaXN0KGVudHJpZXMsIGxvYyk7XG4gICAgcmV0LnByZXBlbmQoJ1snKTtcbiAgICByZXQuYWRkKCddJyk7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG59O1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBDb2RlR2VuO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qIE5PUCAqLyIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9O1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5Db21waWxlciA9IENvbXBpbGVyO1xuZXhwb3J0cy5wcmVjb21waWxlID0gcHJlY29tcGlsZTtcbmV4cG9ydHMuY29tcGlsZSA9IGNvbXBpbGU7XG5cbnZhciBfRXhjZXB0aW9uID0gcmVxdWlyZSgnLi4vZXhjZXB0aW9uJyk7XG5cbnZhciBfRXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9FeGNlcHRpb24pO1xuXG52YXIgX2lzQXJyYXkkaW5kZXhPZiA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbnZhciBfQVNUID0gcmVxdWlyZSgnLi9hc3QnKTtcblxudmFyIF9BU1QyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX0FTVCk7XG5cbnZhciBzbGljZSA9IFtdLnNsaWNlO1xuXG5mdW5jdGlvbiBDb21waWxlcigpIHt9XG5cbi8vIHRoZSBmb3VuZEhlbHBlciByZWdpc3RlciB3aWxsIGRpc2FtYmlndWF0ZSBoZWxwZXIgbG9va3VwIGZyb20gZmluZGluZyBhXG4vLyBmdW5jdGlvbiBpbiBhIGNvbnRleHQuIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBtdXN0YWNoZSBjb21wYXRpYmlsaXR5LCB3aGljaFxuLy8gcmVxdWlyZXMgdGhhdCBjb250ZXh0IGZ1bmN0aW9ucyBpbiBibG9ja3MgYXJlIGV2YWx1YXRlZCBieSBibG9ja0hlbHBlck1pc3NpbmcsXG4vLyBhbmQgdGhlbiBwcm9jZWVkIGFzIGlmIHRoZSByZXN1bHRpbmcgdmFsdWUgd2FzIHByb3ZpZGVkIHRvIGJsb2NrSGVscGVyTWlzc2luZy5cblxuQ29tcGlsZXIucHJvdG90eXBlID0ge1xuICBjb21waWxlcjogQ29tcGlsZXIsXG5cbiAgZXF1YWxzOiBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICB2YXIgbGVuID0gdGhpcy5vcGNvZGVzLmxlbmd0aDtcbiAgICBpZiAob3RoZXIub3Bjb2Rlcy5sZW5ndGggIT09IGxlbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHZhciBvcGNvZGUgPSB0aGlzLm9wY29kZXNbaV0sXG4gICAgICAgICAgb3RoZXJPcGNvZGUgPSBvdGhlci5vcGNvZGVzW2ldO1xuICAgICAgaWYgKG9wY29kZS5vcGNvZGUgIT09IG90aGVyT3Bjb2RlLm9wY29kZSB8fCAhYXJnRXF1YWxzKG9wY29kZS5hcmdzLCBvdGhlck9wY29kZS5hcmdzKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2Uga25vdyB0aGF0IGxlbmd0aCBpcyB0aGUgc2FtZSBiZXR3ZWVuIHRoZSB0d28gYXJyYXlzIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgdGllZFxuICAgIC8vIHRvIHRoZSBvcGNvZGUgYmVoYXZpb3IgYWJvdmUuXG4gICAgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuW2ldLmVxdWFscyhvdGhlci5jaGlsZHJlbltpXSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuXG4gIGd1aWQ6IDAsXG5cbiAgY29tcGlsZTogZnVuY3Rpb24gY29tcGlsZShwcm9ncmFtLCBvcHRpb25zKSB7XG4gICAgdGhpcy5zb3VyY2VOb2RlID0gW107XG4gICAgdGhpcy5vcGNvZGVzID0gW107XG4gICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5zdHJpbmdQYXJhbXMgPSBvcHRpb25zLnN0cmluZ1BhcmFtcztcbiAgICB0aGlzLnRyYWNrSWRzID0gb3B0aW9ucy50cmFja0lkcztcblxuICAgIG9wdGlvbnMuYmxvY2tQYXJhbXMgPSBvcHRpb25zLmJsb2NrUGFyYW1zIHx8IFtdO1xuXG4gICAgLy8gVGhlc2UgY2hhbmdlcyB3aWxsIHByb3BhZ2F0ZSB0byB0aGUgb3RoZXIgY29tcGlsZXIgY29tcG9uZW50c1xuICAgIHZhciBrbm93bkhlbHBlcnMgPSBvcHRpb25zLmtub3duSGVscGVycztcbiAgICBvcHRpb25zLmtub3duSGVscGVycyA9IHtcbiAgICAgIGhlbHBlck1pc3Npbmc6IHRydWUsXG4gICAgICBibG9ja0hlbHBlck1pc3Npbmc6IHRydWUsXG4gICAgICBlYWNoOiB0cnVlLFxuICAgICAgJ2lmJzogdHJ1ZSxcbiAgICAgIHVubGVzczogdHJ1ZSxcbiAgICAgICd3aXRoJzogdHJ1ZSxcbiAgICAgIGxvZzogdHJ1ZSxcbiAgICAgIGxvb2t1cDogdHJ1ZVxuICAgIH07XG4gICAgaWYgKGtub3duSGVscGVycykge1xuICAgICAgZm9yICh2YXIgX25hbWUgaW4ga25vd25IZWxwZXJzKSB7XG4gICAgICAgIGlmIChfbmFtZSBpbiBrbm93bkhlbHBlcnMpIHtcbiAgICAgICAgICBvcHRpb25zLmtub3duSGVscGVyc1tfbmFtZV0gPSBrbm93bkhlbHBlcnNbX25hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYWNjZXB0KHByb2dyYW0pO1xuICB9LFxuXG4gIGNvbXBpbGVQcm9ncmFtOiBmdW5jdGlvbiBjb21waWxlUHJvZ3JhbShwcm9ncmFtKSB7XG4gICAgdmFyIGNoaWxkQ29tcGlsZXIgPSBuZXcgdGhpcy5jb21waWxlcigpLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXBcbiAgICByZXN1bHQgPSBjaGlsZENvbXBpbGVyLmNvbXBpbGUocHJvZ3JhbSwgdGhpcy5vcHRpb25zKSxcbiAgICAgICAgZ3VpZCA9IHRoaXMuZ3VpZCsrO1xuXG4gICAgdGhpcy51c2VQYXJ0aWFsID0gdGhpcy51c2VQYXJ0aWFsIHx8IHJlc3VsdC51c2VQYXJ0aWFsO1xuXG4gICAgdGhpcy5jaGlsZHJlbltndWlkXSA9IHJlc3VsdDtcbiAgICB0aGlzLnVzZURlcHRocyA9IHRoaXMudXNlRGVwdGhzIHx8IHJlc3VsdC51c2VEZXB0aHM7XG5cbiAgICByZXR1cm4gZ3VpZDtcbiAgfSxcblxuICBhY2NlcHQ6IGZ1bmN0aW9uIGFjY2VwdChub2RlKSB7XG4gICAgdGhpcy5zb3VyY2VOb2RlLnVuc2hpZnQobm9kZSk7XG4gICAgdmFyIHJldCA9IHRoaXNbbm9kZS50eXBlXShub2RlKTtcbiAgICB0aGlzLnNvdXJjZU5vZGUuc2hpZnQoKTtcbiAgICByZXR1cm4gcmV0O1xuICB9LFxuXG4gIFByb2dyYW06IGZ1bmN0aW9uIFByb2dyYW0ocHJvZ3JhbSkge1xuICAgIHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy51bnNoaWZ0KHByb2dyYW0uYmxvY2tQYXJhbXMpO1xuXG4gICAgdmFyIGJvZHkgPSBwcm9ncmFtLmJvZHksXG4gICAgICAgIGJvZHlMZW5ndGggPSBib2R5Lmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvZHlMZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5hY2NlcHQoYm9keVtpXSk7XG4gICAgfVxuXG4gICAgdGhpcy5vcHRpb25zLmJsb2NrUGFyYW1zLnNoaWZ0KCk7XG5cbiAgICB0aGlzLmlzU2ltcGxlID0gYm9keUxlbmd0aCA9PT0gMTtcbiAgICB0aGlzLmJsb2NrUGFyYW1zID0gcHJvZ3JhbS5ibG9ja1BhcmFtcyA/IHByb2dyYW0uYmxvY2tQYXJhbXMubGVuZ3RoIDogMDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIEJsb2NrU3RhdGVtZW50OiBmdW5jdGlvbiBCbG9ja1N0YXRlbWVudChibG9jaykge1xuICAgIHRyYW5zZm9ybUxpdGVyYWxUb1BhdGgoYmxvY2spO1xuXG4gICAgdmFyIHByb2dyYW0gPSBibG9jay5wcm9ncmFtLFxuICAgICAgICBpbnZlcnNlID0gYmxvY2suaW52ZXJzZTtcblxuICAgIHByb2dyYW0gPSBwcm9ncmFtICYmIHRoaXMuY29tcGlsZVByb2dyYW0ocHJvZ3JhbSk7XG4gICAgaW52ZXJzZSA9IGludmVyc2UgJiYgdGhpcy5jb21waWxlUHJvZ3JhbShpbnZlcnNlKTtcblxuICAgIHZhciB0eXBlID0gdGhpcy5jbGFzc2lmeVNleHByKGJsb2NrKTtcblxuICAgIGlmICh0eXBlID09PSAnaGVscGVyJykge1xuICAgICAgdGhpcy5oZWxwZXJTZXhwcihibG9jaywgcHJvZ3JhbSwgaW52ZXJzZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnc2ltcGxlJykge1xuICAgICAgdGhpcy5zaW1wbGVTZXhwcihibG9jayk7XG5cbiAgICAgIC8vIG5vdyB0aGF0IHRoZSBzaW1wbGUgbXVzdGFjaGUgaXMgcmVzb2x2ZWQsIHdlIG5lZWQgdG9cbiAgICAgIC8vIGV2YWx1YXRlIGl0IGJ5IGV4ZWN1dGluZyBgYmxvY2tIZWxwZXJNaXNzaW5nYFxuICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgcHJvZ3JhbSk7XG4gICAgICB0aGlzLm9wY29kZSgncHVzaFByb2dyYW0nLCBpbnZlcnNlKTtcbiAgICAgIHRoaXMub3Bjb2RlKCdlbXB0eUhhc2gnKTtcbiAgICAgIHRoaXMub3Bjb2RlKCdibG9ja1ZhbHVlJywgYmxvY2sucGF0aC5vcmlnaW5hbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYW1iaWd1b3VzU2V4cHIoYmxvY2ssIHByb2dyYW0sIGludmVyc2UpO1xuXG4gICAgICAvLyBub3cgdGhhdCB0aGUgc2ltcGxlIG11c3RhY2hlIGlzIHJlc29sdmVkLCB3ZSBuZWVkIHRvXG4gICAgICAvLyBldmFsdWF0ZSBpdCBieSBleGVjdXRpbmcgYGJsb2NrSGVscGVyTWlzc2luZ2BcbiAgICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIHByb2dyYW0pO1xuICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hQcm9ncmFtJywgaW52ZXJzZSk7XG4gICAgICB0aGlzLm9wY29kZSgnZW1wdHlIYXNoJyk7XG4gICAgICB0aGlzLm9wY29kZSgnYW1iaWd1b3VzQmxvY2tWYWx1ZScpO1xuICAgIH1cblxuICAgIHRoaXMub3Bjb2RlKCdhcHBlbmQnKTtcbiAgfSxcblxuICBQYXJ0aWFsU3RhdGVtZW50OiBmdW5jdGlvbiBQYXJ0aWFsU3RhdGVtZW50KHBhcnRpYWwpIHtcbiAgICB0aGlzLnVzZVBhcnRpYWwgPSB0cnVlO1xuXG4gICAgdmFyIHBhcmFtcyA9IHBhcnRpYWwucGFyYW1zO1xuICAgIGlmIChwYXJhbXMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IF9FeGNlcHRpb24yWydkZWZhdWx0J10oJ1Vuc3VwcG9ydGVkIG51bWJlciBvZiBwYXJ0aWFsIGFyZ3VtZW50czogJyArIHBhcmFtcy5sZW5ndGgsIHBhcnRpYWwpO1xuICAgIH0gZWxzZSBpZiAoIXBhcmFtcy5sZW5ndGgpIHtcbiAgICAgIHBhcmFtcy5wdXNoKHsgdHlwZTogJ1BhdGhFeHByZXNzaW9uJywgcGFydHM6IFtdLCBkZXB0aDogMCB9KTtcbiAgICB9XG5cbiAgICB2YXIgcGFydGlhbE5hbWUgPSBwYXJ0aWFsLm5hbWUub3JpZ2luYWwsXG4gICAgICAgIGlzRHluYW1pYyA9IHBhcnRpYWwubmFtZS50eXBlID09PSAnU3ViRXhwcmVzc2lvbic7XG4gICAgaWYgKGlzRHluYW1pYykge1xuICAgICAgdGhpcy5hY2NlcHQocGFydGlhbC5uYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldHVwRnVsbE11c3RhY2hlUGFyYW1zKHBhcnRpYWwsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0cnVlKTtcblxuICAgIHZhciBpbmRlbnQgPSBwYXJ0aWFsLmluZGVudCB8fCAnJztcbiAgICBpZiAodGhpcy5vcHRpb25zLnByZXZlbnRJbmRlbnQgJiYgaW5kZW50KSB7XG4gICAgICB0aGlzLm9wY29kZSgnYXBwZW5kQ29udGVudCcsIGluZGVudCk7XG4gICAgICBpbmRlbnQgPSAnJztcbiAgICB9XG5cbiAgICB0aGlzLm9wY29kZSgnaW52b2tlUGFydGlhbCcsIGlzRHluYW1pYywgcGFydGlhbE5hbWUsIGluZGVudCk7XG4gICAgdGhpcy5vcGNvZGUoJ2FwcGVuZCcpO1xuICB9LFxuXG4gIE11c3RhY2hlU3RhdGVtZW50OiBmdW5jdGlvbiBNdXN0YWNoZVN0YXRlbWVudChtdXN0YWNoZSkge1xuICAgIHRoaXMuU3ViRXhwcmVzc2lvbihtdXN0YWNoZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcFxuXG4gICAgaWYgKG11c3RhY2hlLmVzY2FwZWQgJiYgIXRoaXMub3B0aW9ucy5ub0VzY2FwZSkge1xuICAgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZEVzY2FwZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZCcpO1xuICAgIH1cbiAgfSxcblxuICBDb250ZW50U3RhdGVtZW50OiBmdW5jdGlvbiBDb250ZW50U3RhdGVtZW50KGNvbnRlbnQpIHtcbiAgICBpZiAoY29udGVudC52YWx1ZSkge1xuICAgICAgdGhpcy5vcGNvZGUoJ2FwcGVuZENvbnRlbnQnLCBjb250ZW50LnZhbHVlKTtcbiAgICB9XG4gIH0sXG5cbiAgQ29tbWVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29tbWVudFN0YXRlbWVudCgpIHt9LFxuXG4gIFN1YkV4cHJlc3Npb246IGZ1bmN0aW9uIFN1YkV4cHJlc3Npb24oc2V4cHIpIHtcbiAgICB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKHNleHByKTtcbiAgICB2YXIgdHlwZSA9IHRoaXMuY2xhc3NpZnlTZXhwcihzZXhwcik7XG5cbiAgICBpZiAodHlwZSA9PT0gJ3NpbXBsZScpIHtcbiAgICAgIHRoaXMuc2ltcGxlU2V4cHIoc2V4cHIpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2hlbHBlcicpIHtcbiAgICAgIHRoaXMuaGVscGVyU2V4cHIoc2V4cHIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFtYmlndW91c1NleHByKHNleHByKTtcbiAgICB9XG4gIH0sXG4gIGFtYmlndW91c1NleHByOiBmdW5jdGlvbiBhbWJpZ3VvdXNTZXhwcihzZXhwciwgcHJvZ3JhbSwgaW52ZXJzZSkge1xuICAgIHZhciBwYXRoID0gc2V4cHIucGF0aCxcbiAgICAgICAgbmFtZSA9IHBhdGgucGFydHNbMF0sXG4gICAgICAgIGlzQmxvY2sgPSBwcm9ncmFtICE9IG51bGwgfHwgaW52ZXJzZSAhPSBudWxsO1xuXG4gICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCBwYXRoLmRlcHRoKTtcblxuICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIHByb2dyYW0pO1xuICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpO1xuXG4gICAgdGhpcy5hY2NlcHQocGF0aCk7XG5cbiAgICB0aGlzLm9wY29kZSgnaW52b2tlQW1iaWd1b3VzJywgbmFtZSwgaXNCbG9jayk7XG4gIH0sXG5cbiAgc2ltcGxlU2V4cHI6IGZ1bmN0aW9uIHNpbXBsZVNleHByKHNleHByKSB7XG4gICAgdGhpcy5hY2NlcHQoc2V4cHIucGF0aCk7XG4gICAgdGhpcy5vcGNvZGUoJ3Jlc29sdmVQb3NzaWJsZUxhbWJkYScpO1xuICB9LFxuXG4gIGhlbHBlclNleHByOiBmdW5jdGlvbiBoZWxwZXJTZXhwcihzZXhwciwgcHJvZ3JhbSwgaW52ZXJzZSkge1xuICAgIHZhciBwYXJhbXMgPSB0aGlzLnNldHVwRnVsbE11c3RhY2hlUGFyYW1zKHNleHByLCBwcm9ncmFtLCBpbnZlcnNlKSxcbiAgICAgICAgcGF0aCA9IHNleHByLnBhdGgsXG4gICAgICAgIG5hbWUgPSBwYXRoLnBhcnRzWzBdO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5rbm93bkhlbHBlcnNbbmFtZV0pIHtcbiAgICAgIHRoaXMub3Bjb2RlKCdpbnZva2VLbm93bkhlbHBlcicsIHBhcmFtcy5sZW5ndGgsIG5hbWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmtub3duSGVscGVyc09ubHkpIHtcbiAgICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKCdZb3Ugc3BlY2lmaWVkIGtub3duSGVscGVyc09ubHksIGJ1dCB1c2VkIHRoZSB1bmtub3duIGhlbHBlciAnICsgbmFtZSwgc2V4cHIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXRoLmZhbHN5ID0gdHJ1ZTtcblxuICAgICAgdGhpcy5hY2NlcHQocGF0aCk7XG4gICAgICB0aGlzLm9wY29kZSgnaW52b2tlSGVscGVyJywgcGFyYW1zLmxlbmd0aCwgcGF0aC5vcmlnaW5hbCwgX0FTVDJbJ2RlZmF1bHQnXS5oZWxwZXJzLnNpbXBsZUlkKHBhdGgpKTtcbiAgICB9XG4gIH0sXG5cbiAgUGF0aEV4cHJlc3Npb246IGZ1bmN0aW9uIFBhdGhFeHByZXNzaW9uKHBhdGgpIHtcbiAgICB0aGlzLmFkZERlcHRoKHBhdGguZGVwdGgpO1xuICAgIHRoaXMub3Bjb2RlKCdnZXRDb250ZXh0JywgcGF0aC5kZXB0aCk7XG5cbiAgICB2YXIgbmFtZSA9IHBhdGgucGFydHNbMF0sXG4gICAgICAgIHNjb3BlZCA9IF9BU1QyWydkZWZhdWx0J10uaGVscGVycy5zY29wZWRJZChwYXRoKSxcbiAgICAgICAgYmxvY2tQYXJhbUlkID0gIXBhdGguZGVwdGggJiYgIXNjb3BlZCAmJiB0aGlzLmJsb2NrUGFyYW1JbmRleChuYW1lKTtcblxuICAgIGlmIChibG9ja1BhcmFtSWQpIHtcbiAgICAgIHRoaXMub3Bjb2RlKCdsb29rdXBCbG9ja1BhcmFtJywgYmxvY2tQYXJhbUlkLCBwYXRoLnBhcnRzKTtcbiAgICB9IGVsc2UgaWYgKCFuYW1lKSB7XG4gICAgICAvLyBDb250ZXh0IHJlZmVyZW5jZSwgaS5lLiBge3tmb28gLn19YCBvciBge3tmb28gLi59fWBcbiAgICAgIHRoaXMub3Bjb2RlKCdwdXNoQ29udGV4dCcpO1xuICAgIH0gZWxzZSBpZiAocGF0aC5kYXRhKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuZGF0YSA9IHRydWU7XG4gICAgICB0aGlzLm9wY29kZSgnbG9va3VwRGF0YScsIHBhdGguZGVwdGgsIHBhdGgucGFydHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wY29kZSgnbG9va3VwT25Db250ZXh0JywgcGF0aC5wYXJ0cywgcGF0aC5mYWxzeSwgc2NvcGVkKTtcbiAgICB9XG4gIH0sXG5cbiAgU3RyaW5nTGl0ZXJhbDogZnVuY3Rpb24gU3RyaW5nTGl0ZXJhbChzdHJpbmcpIHtcbiAgICB0aGlzLm9wY29kZSgncHVzaFN0cmluZycsIHN0cmluZy52YWx1ZSk7XG4gIH0sXG5cbiAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbChudW1iZXIpIHtcbiAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCBudW1iZXIudmFsdWUpO1xuICB9LFxuXG4gIEJvb2xlYW5MaXRlcmFsOiBmdW5jdGlvbiBCb29sZWFuTGl0ZXJhbChib29sKSB7XG4gICAgdGhpcy5vcGNvZGUoJ3B1c2hMaXRlcmFsJywgYm9vbC52YWx1ZSk7XG4gIH0sXG5cbiAgVW5kZWZpbmVkTGl0ZXJhbDogZnVuY3Rpb24gVW5kZWZpbmVkTGl0ZXJhbCgpIHtcbiAgICB0aGlzLm9wY29kZSgncHVzaExpdGVyYWwnLCAndW5kZWZpbmVkJyk7XG4gIH0sXG5cbiAgTnVsbExpdGVyYWw6IGZ1bmN0aW9uIE51bGxMaXRlcmFsKCkge1xuICAgIHRoaXMub3Bjb2RlKCdwdXNoTGl0ZXJhbCcsICdudWxsJyk7XG4gIH0sXG5cbiAgSGFzaDogZnVuY3Rpb24gSGFzaChoYXNoKSB7XG4gICAgdmFyIHBhaXJzID0gaGFzaC5wYWlycyxcbiAgICAgICAgaSA9IDAsXG4gICAgICAgIGwgPSBwYWlycy5sZW5ndGg7XG5cbiAgICB0aGlzLm9wY29kZSgncHVzaEhhc2gnKTtcblxuICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB0aGlzLnB1c2hQYXJhbShwYWlyc1tpXS52YWx1ZSk7XG4gICAgfVxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHRoaXMub3Bjb2RlKCdhc3NpZ25Ub0hhc2gnLCBwYWlyc1tpXS5rZXkpO1xuICAgIH1cbiAgICB0aGlzLm9wY29kZSgncG9wSGFzaCcpO1xuICB9LFxuXG4gIC8vIEhFTFBFUlNcbiAgb3Bjb2RlOiBmdW5jdGlvbiBvcGNvZGUobmFtZSkge1xuICAgIHRoaXMub3Bjb2Rlcy5wdXNoKHsgb3Bjb2RlOiBuYW1lLCBhcmdzOiBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSksIGxvYzogdGhpcy5zb3VyY2VOb2RlWzBdLmxvYyB9KTtcbiAgfSxcblxuICBhZGREZXB0aDogZnVuY3Rpb24gYWRkRGVwdGgoZGVwdGgpIHtcbiAgICBpZiAoIWRlcHRoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51c2VEZXB0aHMgPSB0cnVlO1xuICB9LFxuXG4gIGNsYXNzaWZ5U2V4cHI6IGZ1bmN0aW9uIGNsYXNzaWZ5U2V4cHIoc2V4cHIpIHtcbiAgICB2YXIgaXNTaW1wbGUgPSBfQVNUMlsnZGVmYXVsdCddLmhlbHBlcnMuc2ltcGxlSWQoc2V4cHIucGF0aCk7XG5cbiAgICB2YXIgaXNCbG9ja1BhcmFtID0gaXNTaW1wbGUgJiYgISF0aGlzLmJsb2NrUGFyYW1JbmRleChzZXhwci5wYXRoLnBhcnRzWzBdKTtcblxuICAgIC8vIGEgbXVzdGFjaGUgaXMgYW4gZWxpZ2libGUgaGVscGVyIGlmOlxuICAgIC8vICogaXRzIGlkIGlzIHNpbXBsZSAoYSBzaW5nbGUgcGFydCwgbm90IGB0aGlzYCBvciBgLi5gKVxuICAgIHZhciBpc0hlbHBlciA9ICFpc0Jsb2NrUGFyYW0gJiYgX0FTVDJbJ2RlZmF1bHQnXS5oZWxwZXJzLmhlbHBlckV4cHJlc3Npb24oc2V4cHIpO1xuXG4gICAgLy8gaWYgYSBtdXN0YWNoZSBpcyBhbiBlbGlnaWJsZSBoZWxwZXIgYnV0IG5vdCBhIGRlZmluaXRlXG4gICAgLy8gaGVscGVyLCBpdCBpcyBhbWJpZ3VvdXMsIGFuZCB3aWxsIGJlIHJlc29sdmVkIGluIGEgbGF0ZXJcbiAgICAvLyBwYXNzIG9yIGF0IHJ1bnRpbWUuXG4gICAgdmFyIGlzRWxpZ2libGUgPSAhaXNCbG9ja1BhcmFtICYmIChpc0hlbHBlciB8fCBpc1NpbXBsZSk7XG5cbiAgICAvLyBpZiBhbWJpZ3VvdXMsIHdlIGNhbiBwb3NzaWJseSByZXNvbHZlIHRoZSBhbWJpZ3VpdHkgbm93XG4gICAgLy8gQW4gZWxpZ2libGUgaGVscGVyIGlzIG9uZSB0aGF0IGRvZXMgbm90IGhhdmUgYSBjb21wbGV4IHBhdGgsIGkuZS4gYHRoaXMuZm9vYCwgYC4uL2Zvb2AgZXRjLlxuICAgIGlmIChpc0VsaWdpYmxlICYmICFpc0hlbHBlcikge1xuICAgICAgdmFyIF9uYW1lMiA9IHNleHByLnBhdGgucGFydHNbMF0sXG4gICAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuICAgICAgaWYgKG9wdGlvbnMua25vd25IZWxwZXJzW19uYW1lMl0pIHtcbiAgICAgICAgaXNIZWxwZXIgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmtub3duSGVscGVyc09ubHkpIHtcbiAgICAgICAgaXNFbGlnaWJsZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0hlbHBlcikge1xuICAgICAgcmV0dXJuICdoZWxwZXInO1xuICAgIH0gZWxzZSBpZiAoaXNFbGlnaWJsZSkge1xuICAgICAgcmV0dXJuICdhbWJpZ3VvdXMnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ3NpbXBsZSc7XG4gICAgfVxuICB9LFxuXG4gIHB1c2hQYXJhbXM6IGZ1bmN0aW9uIHB1c2hQYXJhbXMocGFyYW1zKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwYXJhbXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB0aGlzLnB1c2hQYXJhbShwYXJhbXNbaV0pO1xuICAgIH1cbiAgfSxcblxuICBwdXNoUGFyYW06IGZ1bmN0aW9uIHB1c2hQYXJhbSh2YWwpIHtcbiAgICB2YXIgdmFsdWUgPSB2YWwudmFsdWUgIT0gbnVsbCA/IHZhbC52YWx1ZSA6IHZhbC5vcmlnaW5hbCB8fCAnJztcblxuICAgIGlmICh0aGlzLnN0cmluZ1BhcmFtcykge1xuICAgICAgaWYgKHZhbHVlLnJlcGxhY2UpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eKFxcLj9cXC5cXC8pKi9nLCAnJykucmVwbGFjZSgvXFwvL2csICcuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWwuZGVwdGgpIHtcbiAgICAgICAgdGhpcy5hZGREZXB0aCh2YWwuZGVwdGgpO1xuICAgICAgfVxuICAgICAgdGhpcy5vcGNvZGUoJ2dldENvbnRleHQnLCB2YWwuZGVwdGggfHwgMCk7XG4gICAgICB0aGlzLm9wY29kZSgncHVzaFN0cmluZ1BhcmFtJywgdmFsdWUsIHZhbC50eXBlKTtcblxuICAgICAgaWYgKHZhbC50eXBlID09PSAnU3ViRXhwcmVzc2lvbicpIHtcbiAgICAgICAgLy8gU3ViRXhwcmVzc2lvbnMgZ2V0IGV2YWx1YXRlZCBhbmQgcGFzc2VkIGluXG4gICAgICAgIC8vIGluIHN0cmluZyBwYXJhbXMgbW9kZS5cbiAgICAgICAgdGhpcy5hY2NlcHQodmFsKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMudHJhY2tJZHMpIHtcbiAgICAgICAgdmFyIGJsb2NrUGFyYW1JbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHZhbC5wYXJ0cyAmJiAhX0FTVDJbJ2RlZmF1bHQnXS5oZWxwZXJzLnNjb3BlZElkKHZhbCkgJiYgIXZhbC5kZXB0aCkge1xuICAgICAgICAgIGJsb2NrUGFyYW1JbmRleCA9IHRoaXMuYmxvY2tQYXJhbUluZGV4KHZhbC5wYXJ0c1swXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJsb2NrUGFyYW1JbmRleCkge1xuICAgICAgICAgIHZhciBibG9ja1BhcmFtQ2hpbGQgPSB2YWwucGFydHMuc2xpY2UoMSkuam9pbignLicpO1xuICAgICAgICAgIHRoaXMub3Bjb2RlKCdwdXNoSWQnLCAnQmxvY2tQYXJhbScsIGJsb2NrUGFyYW1JbmRleCwgYmxvY2tQYXJhbUNoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbC5vcmlnaW5hbCB8fCB2YWx1ZTtcbiAgICAgICAgICBpZiAodmFsdWUucmVwbGFjZSkge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eXFwuXFwvL2csICcnKS5yZXBsYWNlKC9eXFwuJC9nLCAnJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5vcGNvZGUoJ3B1c2hJZCcsIHZhbC50eXBlLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuYWNjZXB0KHZhbCk7XG4gICAgfVxuICB9LFxuXG4gIHNldHVwRnVsbE11c3RhY2hlUGFyYW1zOiBmdW5jdGlvbiBzZXR1cEZ1bGxNdXN0YWNoZVBhcmFtcyhzZXhwciwgcHJvZ3JhbSwgaW52ZXJzZSwgb21pdEVtcHR5KSB7XG4gICAgdmFyIHBhcmFtcyA9IHNleHByLnBhcmFtcztcbiAgICB0aGlzLnB1c2hQYXJhbXMocGFyYW1zKTtcblxuICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIHByb2dyYW0pO1xuICAgIHRoaXMub3Bjb2RlKCdwdXNoUHJvZ3JhbScsIGludmVyc2UpO1xuXG4gICAgaWYgKHNleHByLmhhc2gpIHtcbiAgICAgIHRoaXMuYWNjZXB0KHNleHByLmhhc2gpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wY29kZSgnZW1wdHlIYXNoJywgb21pdEVtcHR5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9LFxuXG4gIGJsb2NrUGFyYW1JbmRleDogZnVuY3Rpb24gYmxvY2tQYXJhbUluZGV4KG5hbWUpIHtcbiAgICBmb3IgKHZhciBkZXB0aCA9IDAsIGxlbiA9IHRoaXMub3B0aW9ucy5ibG9ja1BhcmFtcy5sZW5ndGg7IGRlcHRoIDwgbGVuOyBkZXB0aCsrKSB7XG4gICAgICB2YXIgYmxvY2tQYXJhbXMgPSB0aGlzLm9wdGlvbnMuYmxvY2tQYXJhbXNbZGVwdGhdLFxuICAgICAgICAgIHBhcmFtID0gYmxvY2tQYXJhbXMgJiYgX2lzQXJyYXkkaW5kZXhPZi5pbmRleE9mKGJsb2NrUGFyYW1zLCBuYW1lKTtcbiAgICAgIGlmIChibG9ja1BhcmFtcyAmJiBwYXJhbSA+PSAwKSB7XG4gICAgICAgIHJldHVybiBbZGVwdGgsIHBhcmFtXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHByZWNvbXBpbGUoaW5wdXQsIG9wdGlvbnMsIGVudikge1xuICBpZiAoaW5wdXQgPT0gbnVsbCB8fCB0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnICYmIGlucHV0LnR5cGUgIT09ICdQcm9ncmFtJykge1xuICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKCdZb3UgbXVzdCBwYXNzIGEgc3RyaW5nIG9yIEhhbmRsZWJhcnMgQVNUIHRvIEhhbmRsZWJhcnMucHJlY29tcGlsZS4gWW91IHBhc3NlZCAnICsgaW5wdXQpO1xuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGlmICghKCdkYXRhJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMuZGF0YSA9IHRydWU7XG4gIH1cbiAgaWYgKG9wdGlvbnMuY29tcGF0KSB7XG4gICAgb3B0aW9ucy51c2VEZXB0aHMgPSB0cnVlO1xuICB9XG5cbiAgdmFyIGFzdCA9IGVudi5wYXJzZShpbnB1dCwgb3B0aW9ucyksXG4gICAgICBlbnZpcm9ubWVudCA9IG5ldyBlbnYuQ29tcGlsZXIoKS5jb21waWxlKGFzdCwgb3B0aW9ucyk7XG4gIHJldHVybiBuZXcgZW52LkphdmFTY3JpcHRDb21waWxlcigpLmNvbXBpbGUoZW52aXJvbm1lbnQsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBjb21waWxlKGlucHV0LCBfeCwgZW52KSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sxXTtcblxuICBpZiAoaW5wdXQgPT0gbnVsbCB8fCB0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnICYmIGlucHV0LnR5cGUgIT09ICdQcm9ncmFtJykge1xuICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKCdZb3UgbXVzdCBwYXNzIGEgc3RyaW5nIG9yIEhhbmRsZWJhcnMgQVNUIHRvIEhhbmRsZWJhcnMuY29tcGlsZS4gWW91IHBhc3NlZCAnICsgaW5wdXQpO1xuICB9XG5cbiAgaWYgKCEoJ2RhdGEnIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5kYXRhID0gdHJ1ZTtcbiAgfVxuICBpZiAob3B0aW9ucy5jb21wYXQpIHtcbiAgICBvcHRpb25zLnVzZURlcHRocyA9IHRydWU7XG4gIH1cblxuICB2YXIgY29tcGlsZWQgPSB1bmRlZmluZWQ7XG5cbiAgZnVuY3Rpb24gY29tcGlsZUlucHV0KCkge1xuICAgIHZhciBhc3QgPSBlbnYucGFyc2UoaW5wdXQsIG9wdGlvbnMpLFxuICAgICAgICBlbnZpcm9ubWVudCA9IG5ldyBlbnYuQ29tcGlsZXIoKS5jb21waWxlKGFzdCwgb3B0aW9ucyksXG4gICAgICAgIHRlbXBsYXRlU3BlYyA9IG5ldyBlbnYuSmF2YVNjcmlwdENvbXBpbGVyKCkuY29tcGlsZShlbnZpcm9ubWVudCwgb3B0aW9ucywgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICByZXR1cm4gZW52LnRlbXBsYXRlKHRlbXBsYXRlU3BlYyk7XG4gIH1cblxuICAvLyBUZW1wbGF0ZSBpcyBvbmx5IGNvbXBpbGVkIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGVkIGFmdGVyIHRoYXQgcG9pbnQuXG4gIGZ1bmN0aW9uIHJldChjb250ZXh0LCBleGVjT3B0aW9ucykge1xuICAgIGlmICghY29tcGlsZWQpIHtcbiAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7XG4gICAgfVxuICAgIHJldHVybiBjb21waWxlZC5jYWxsKHRoaXMsIGNvbnRleHQsIGV4ZWNPcHRpb25zKTtcbiAgfVxuICByZXQuX3NldHVwID0gZnVuY3Rpb24gKHNldHVwT3B0aW9ucykge1xuICAgIGlmICghY29tcGlsZWQpIHtcbiAgICAgIGNvbXBpbGVkID0gY29tcGlsZUlucHV0KCk7XG4gICAgfVxuICAgIHJldHVybiBjb21waWxlZC5fc2V0dXAoc2V0dXBPcHRpb25zKTtcbiAgfTtcbiAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uIChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4gICAgaWYgKCFjb21waWxlZCkge1xuICAgICAgY29tcGlsZWQgPSBjb21waWxlSW5wdXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBpbGVkLl9jaGlsZChpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKTtcbiAgfTtcbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gYXJnRXF1YWxzKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChfaXNBcnJheSRpbmRleE9mLmlzQXJyYXkoYSkgJiYgX2lzQXJyYXkkaW5kZXhPZi5pc0FycmF5KGIpICYmIGEubGVuZ3RoID09PSBiLmxlbmd0aCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFhcmdFcXVhbHMoYVtpXSwgYltpXSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1MaXRlcmFsVG9QYXRoKHNleHByKSB7XG4gIGlmICghc2V4cHIucGF0aC5wYXJ0cykge1xuICAgIHZhciBsaXRlcmFsID0gc2V4cHIucGF0aDtcbiAgICAvLyBDYXN0aW5nIHRvIHN0cmluZyBoZXJlIHRvIG1ha2UgZmFsc2UgYW5kIDAgbGl0ZXJhbCB2YWx1ZXMgcGxheSBuaWNlbHkgd2l0aCB0aGUgcmVzdFxuICAgIC8vIG9mIHRoZSBzeXN0ZW0uXG4gICAgc2V4cHIucGF0aCA9IG5ldyBfQVNUMlsnZGVmYXVsdCddLlBhdGhFeHByZXNzaW9uKGZhbHNlLCAwLCBbbGl0ZXJhbC5vcmlnaW5hbCArICcnXSwgbGl0ZXJhbC5vcmlnaW5hbCArICcnLCBsaXRlcmFsLmxvYyk7XG4gIH1cbn0iLCIndXNlIHN0cmljdCc7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuU291cmNlTG9jYXRpb24gPSBTb3VyY2VMb2NhdGlvbjtcbmV4cG9ydHMuaWQgPSBpZDtcbmV4cG9ydHMuc3RyaXBGbGFncyA9IHN0cmlwRmxhZ3M7XG5leHBvcnRzLnN0cmlwQ29tbWVudCA9IHN0cmlwQ29tbWVudDtcbmV4cG9ydHMucHJlcGFyZVBhdGggPSBwcmVwYXJlUGF0aDtcbmV4cG9ydHMucHJlcGFyZU11c3RhY2hlID0gcHJlcGFyZU11c3RhY2hlO1xuZXhwb3J0cy5wcmVwYXJlUmF3QmxvY2sgPSBwcmVwYXJlUmF3QmxvY2s7XG5leHBvcnRzLnByZXBhcmVCbG9jayA9IHByZXBhcmVCbG9jaztcblxudmFyIF9FeGNlcHRpb24gPSByZXF1aXJlKCcuLi9leGNlcHRpb24nKTtcblxudmFyIF9FeGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX0V4Y2VwdGlvbik7XG5cbmZ1bmN0aW9uIFNvdXJjZUxvY2F0aW9uKHNvdXJjZSwgbG9jSW5mbykge1xuICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgdGhpcy5zdGFydCA9IHtcbiAgICBsaW5lOiBsb2NJbmZvLmZpcnN0X2xpbmUsXG4gICAgY29sdW1uOiBsb2NJbmZvLmZpcnN0X2NvbHVtblxuICB9O1xuICB0aGlzLmVuZCA9IHtcbiAgICBsaW5lOiBsb2NJbmZvLmxhc3RfbGluZSxcbiAgICBjb2x1bW46IGxvY0luZm8ubGFzdF9jb2x1bW5cbiAgfTtcbn1cblxuZnVuY3Rpb24gaWQodG9rZW4pIHtcbiAgaWYgKC9eXFxbLipcXF0kLy50ZXN0KHRva2VuKSkge1xuICAgIHJldHVybiB0b2tlbi5zdWJzdHIoMSwgdG9rZW4ubGVuZ3RoIC0gMik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRva2VuO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0cmlwRmxhZ3Mob3BlbiwgY2xvc2UpIHtcbiAgcmV0dXJuIHtcbiAgICBvcGVuOiBvcGVuLmNoYXJBdCgyKSA9PT0gJ34nLFxuICAgIGNsb3NlOiBjbG9zZS5jaGFyQXQoY2xvc2UubGVuZ3RoIC0gMykgPT09ICd+J1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHJpcENvbW1lbnQoY29tbWVudCkge1xuICByZXR1cm4gY29tbWVudC5yZXBsYWNlKC9eXFx7XFx7fj9cXCEtPy0/LywgJycpLnJlcGxhY2UoLy0/LT9+P1xcfVxcfSQvLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVQYXRoKGRhdGEsIHBhcnRzLCBsb2NJbmZvKSB7XG4gIGxvY0luZm8gPSB0aGlzLmxvY0luZm8obG9jSW5mbyk7XG5cbiAgdmFyIG9yaWdpbmFsID0gZGF0YSA/ICdAJyA6ICcnLFxuICAgICAgZGlnID0gW10sXG4gICAgICBkZXB0aCA9IDAsXG4gICAgICBkZXB0aFN0cmluZyA9ICcnO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gcGFydHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIHBhcnQgPSBwYXJ0c1tpXS5wYXJ0LFxuXG4gICAgLy8gSWYgd2UgaGF2ZSBbXSBzeW50YXggdGhlbiB3ZSBkbyBub3QgdHJlYXQgcGF0aCByZWZlcmVuY2VzIGFzIG9wZXJhdG9ycyxcbiAgICAvLyBpLmUuIGZvby5bdGhpc10gcmVzb2x2ZXMgdG8gYXBwcm94aW1hdGVseSBjb250ZXh0LmZvb1sndGhpcyddXG4gICAgaXNMaXRlcmFsID0gcGFydHNbaV0ub3JpZ2luYWwgIT09IHBhcnQ7XG4gICAgb3JpZ2luYWwgKz0gKHBhcnRzW2ldLnNlcGFyYXRvciB8fCAnJykgKyBwYXJ0O1xuXG4gICAgaWYgKCFpc0xpdGVyYWwgJiYgKHBhcnQgPT09ICcuLicgfHwgcGFydCA9PT0gJy4nIHx8IHBhcnQgPT09ICd0aGlzJykpIHtcbiAgICAgIGlmIChkaWcubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgX0V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnSW52YWxpZCBwYXRoOiAnICsgb3JpZ2luYWwsIHsgbG9jOiBsb2NJbmZvIH0pO1xuICAgICAgfSBlbHNlIGlmIChwYXJ0ID09PSAnLi4nKSB7XG4gICAgICAgIGRlcHRoKys7XG4gICAgICAgIGRlcHRoU3RyaW5nICs9ICcuLi8nO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkaWcucHVzaChwYXJ0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IHRoaXMuUGF0aEV4cHJlc3Npb24oZGF0YSwgZGVwdGgsIGRpZywgb3JpZ2luYWwsIGxvY0luZm8pO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlTXVzdGFjaGUocGF0aCwgcGFyYW1zLCBoYXNoLCBvcGVuLCBzdHJpcCwgbG9jSW5mbykge1xuICAvLyBNdXN0IHVzZSBjaGFyQXQgdG8gc3VwcG9ydCBJRSBwcmUtMTBcbiAgdmFyIGVzY2FwZUZsYWcgPSBvcGVuLmNoYXJBdCgzKSB8fCBvcGVuLmNoYXJBdCgyKSxcbiAgICAgIGVzY2FwZWQgPSBlc2NhcGVGbGFnICE9PSAneycgJiYgZXNjYXBlRmxhZyAhPT0gJyYnO1xuXG4gIHJldHVybiBuZXcgdGhpcy5NdXN0YWNoZVN0YXRlbWVudChwYXRoLCBwYXJhbXMsIGhhc2gsIGVzY2FwZWQsIHN0cmlwLCB0aGlzLmxvY0luZm8obG9jSW5mbykpO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlUmF3QmxvY2sob3BlblJhd0Jsb2NrLCBjb250ZW50LCBjbG9zZSwgbG9jSW5mbykge1xuICBpZiAob3BlblJhd0Jsb2NrLnBhdGgub3JpZ2luYWwgIT09IGNsb3NlKSB7XG4gICAgdmFyIGVycm9yTm9kZSA9IHsgbG9jOiBvcGVuUmF3QmxvY2sucGF0aC5sb2MgfTtcblxuICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKG9wZW5SYXdCbG9jay5wYXRoLm9yaWdpbmFsICsgJyBkb2VzblxcJ3QgbWF0Y2ggJyArIGNsb3NlLCBlcnJvck5vZGUpO1xuICB9XG5cbiAgbG9jSW5mbyA9IHRoaXMubG9jSW5mbyhsb2NJbmZvKTtcbiAgdmFyIHByb2dyYW0gPSBuZXcgdGhpcy5Qcm9ncmFtKFtjb250ZW50XSwgbnVsbCwge30sIGxvY0luZm8pO1xuXG4gIHJldHVybiBuZXcgdGhpcy5CbG9ja1N0YXRlbWVudChvcGVuUmF3QmxvY2sucGF0aCwgb3BlblJhd0Jsb2NrLnBhcmFtcywgb3BlblJhd0Jsb2NrLmhhc2gsIHByb2dyYW0sIHVuZGVmaW5lZCwge30sIHt9LCB7fSwgbG9jSW5mbyk7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVCbG9jayhvcGVuQmxvY2ssIHByb2dyYW0sIGludmVyc2VBbmRQcm9ncmFtLCBjbG9zZSwgaW52ZXJ0ZWQsIGxvY0luZm8pIHtcbiAgLy8gV2hlbiB3ZSBhcmUgY2hhaW5pbmcgaW52ZXJzZSBjYWxscywgd2Ugd2lsbCBub3QgaGF2ZSBhIGNsb3NlIHBhdGhcbiAgaWYgKGNsb3NlICYmIGNsb3NlLnBhdGggJiYgb3BlbkJsb2NrLnBhdGgub3JpZ2luYWwgIT09IGNsb3NlLnBhdGgub3JpZ2luYWwpIHtcbiAgICB2YXIgZXJyb3JOb2RlID0geyBsb2M6IG9wZW5CbG9jay5wYXRoLmxvYyB9O1xuXG4gICAgdGhyb3cgbmV3IF9FeGNlcHRpb24yWydkZWZhdWx0J10ob3BlbkJsb2NrLnBhdGgub3JpZ2luYWwgKyAnIGRvZXNuXFwndCBtYXRjaCAnICsgY2xvc2UucGF0aC5vcmlnaW5hbCwgZXJyb3JOb2RlKTtcbiAgfVxuXG4gIHByb2dyYW0uYmxvY2tQYXJhbXMgPSBvcGVuQmxvY2suYmxvY2tQYXJhbXM7XG5cbiAgdmFyIGludmVyc2UgPSB1bmRlZmluZWQsXG4gICAgICBpbnZlcnNlU3RyaXAgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKGludmVyc2VBbmRQcm9ncmFtKSB7XG4gICAgaWYgKGludmVyc2VBbmRQcm9ncmFtLmNoYWluKSB7XG4gICAgICBpbnZlcnNlQW5kUHJvZ3JhbS5wcm9ncmFtLmJvZHlbMF0uY2xvc2VTdHJpcCA9IGNsb3NlLnN0cmlwO1xuICAgIH1cblxuICAgIGludmVyc2VTdHJpcCA9IGludmVyc2VBbmRQcm9ncmFtLnN0cmlwO1xuICAgIGludmVyc2UgPSBpbnZlcnNlQW5kUHJvZ3JhbS5wcm9ncmFtO1xuICB9XG5cbiAgaWYgKGludmVydGVkKSB7XG4gICAgaW52ZXJ0ZWQgPSBpbnZlcnNlO1xuICAgIGludmVyc2UgPSBwcm9ncmFtO1xuICAgIHByb2dyYW0gPSBpbnZlcnRlZDtcbiAgfVxuXG4gIHJldHVybiBuZXcgdGhpcy5CbG9ja1N0YXRlbWVudChvcGVuQmxvY2sucGF0aCwgb3BlbkJsb2NrLnBhcmFtcywgb3BlbkJsb2NrLmhhc2gsIHByb2dyYW0sIGludmVyc2UsIG9wZW5CbG9jay5zdHJpcCwgaW52ZXJzZVN0cmlwLCBjbG9zZSAmJiBjbG9zZS5zdHJpcCwgdGhpcy5sb2NJbmZvKGxvY0luZm8pKTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9DT01QSUxFUl9SRVZJU0lPTiRSRVZJU0lPTl9DSEFOR0VTID0gcmVxdWlyZSgnLi4vYmFzZScpO1xuXG52YXIgX0V4Y2VwdGlvbiA9IHJlcXVpcmUoJy4uL2V4Y2VwdGlvbicpO1xuXG52YXIgX0V4Y2VwdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfRXhjZXB0aW9uKTtcblxudmFyIF9pc0FycmF5ID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxudmFyIF9Db2RlR2VuID0gcmVxdWlyZSgnLi9jb2RlLWdlbicpO1xuXG52YXIgX0NvZGVHZW4yID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX0NvZGVHZW4pO1xuXG5mdW5jdGlvbiBMaXRlcmFsKHZhbHVlKSB7XG4gIHRoaXMudmFsdWUgPSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gSmF2YVNjcmlwdENvbXBpbGVyKCkge31cblxuSmF2YVNjcmlwdENvbXBpbGVyLnByb3RvdHlwZSA9IHtcbiAgLy8gUFVCTElDIEFQSTogWW91IGNhbiBvdmVycmlkZSB0aGVzZSBtZXRob2RzIGluIGEgc3ViY2xhc3MgdG8gcHJvdmlkZVxuICAvLyBhbHRlcm5hdGl2ZSBjb21waWxlZCBmb3JtcyBmb3IgbmFtZSBsb29rdXAgYW5kIGJ1ZmZlcmluZyBzZW1hbnRpY3NcbiAgbmFtZUxvb2t1cDogZnVuY3Rpb24gbmFtZUxvb2t1cChwYXJlbnQsIG5hbWUgLyogLCB0eXBlKi8pIHtcbiAgICBpZiAoSmF2YVNjcmlwdENvbXBpbGVyLmlzVmFsaWRKYXZhU2NyaXB0VmFyaWFibGVOYW1lKG5hbWUpKSB7XG4gICAgICByZXR1cm4gW3BhcmVudCwgJy4nLCBuYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtwYXJlbnQsICdbXFwnJywgbmFtZSwgJ1xcJ10nXTtcbiAgICB9XG4gIH0sXG4gIGRlcHRoZWRMb29rdXA6IGZ1bmN0aW9uIGRlcHRoZWRMb29rdXAobmFtZSkge1xuICAgIHJldHVybiBbdGhpcy5hbGlhc2FibGUoJ3RoaXMubG9va3VwJyksICcoZGVwdGhzLCBcIicsIG5hbWUsICdcIiknXTtcbiAgfSxcblxuICBjb21waWxlckluZm86IGZ1bmN0aW9uIGNvbXBpbGVySW5mbygpIHtcbiAgICB2YXIgcmV2aXNpb24gPSBfQ09NUElMRVJfUkVWSVNJT04kUkVWSVNJT05fQ0hBTkdFUy5DT01QSUxFUl9SRVZJU0lPTixcbiAgICAgICAgdmVyc2lvbnMgPSBfQ09NUElMRVJfUkVWSVNJT04kUkVWSVNJT05fQ0hBTkdFUy5SRVZJU0lPTl9DSEFOR0VTW3JldmlzaW9uXTtcbiAgICByZXR1cm4gW3JldmlzaW9uLCB2ZXJzaW9uc107XG4gIH0sXG5cbiAgYXBwZW5kVG9CdWZmZXI6IGZ1bmN0aW9uIGFwcGVuZFRvQnVmZmVyKHNvdXJjZSwgbG9jYXRpb24sIGV4cGxpY2l0KSB7XG4gICAgLy8gRm9yY2UgYSBzb3VyY2UgYXMgdGhpcyBzaW1wbGlmaWVzIHRoZSBtZXJnZSBsb2dpYy5cbiAgICBpZiAoIV9pc0FycmF5LmlzQXJyYXkoc291cmNlKSkge1xuICAgICAgc291cmNlID0gW3NvdXJjZV07XG4gICAgfVxuICAgIHNvdXJjZSA9IHRoaXMuc291cmNlLndyYXAoc291cmNlLCBsb2NhdGlvbik7XG5cbiAgICBpZiAodGhpcy5lbnZpcm9ubWVudC5pc1NpbXBsZSkge1xuICAgICAgcmV0dXJuIFsncmV0dXJuICcsIHNvdXJjZSwgJzsnXTtcbiAgICB9IGVsc2UgaWYgKGV4cGxpY2l0KSB7XG4gICAgICAvLyBUaGlzIGlzIGEgY2FzZSB3aGVyZSB0aGUgYnVmZmVyIG9wZXJhdGlvbiBvY2N1cnMgYXMgYSBjaGlsZCBvZiBhbm90aGVyXG4gICAgICAvLyBjb25zdHJ1Y3QsIGdlbmVyYWxseSBicmFjZXMuIFdlIGhhdmUgdG8gZXhwbGljaXRseSBvdXRwdXQgdGhlc2UgYnVmZmVyXG4gICAgICAvLyBvcGVyYXRpb25zIHRvIGVuc3VyZSB0aGF0IHRoZSBlbWl0dGVkIGNvZGUgZ29lcyBpbiB0aGUgY29ycmVjdCBsb2NhdGlvbi5cbiAgICAgIHJldHVybiBbJ2J1ZmZlciArPSAnLCBzb3VyY2UsICc7J107XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvdXJjZS5hcHBlbmRUb0J1ZmZlciA9IHRydWU7XG4gICAgICByZXR1cm4gc291cmNlO1xuICAgIH1cbiAgfSxcblxuICBpbml0aWFsaXplQnVmZmVyOiBmdW5jdGlvbiBpbml0aWFsaXplQnVmZmVyKCkge1xuICAgIHJldHVybiB0aGlzLnF1b3RlZFN0cmluZygnJyk7XG4gIH0sXG4gIC8vIEVORCBQVUJMSUMgQVBJXG5cbiAgY29tcGlsZTogZnVuY3Rpb24gY29tcGlsZShlbnZpcm9ubWVudCwgb3B0aW9ucywgY29udGV4dCwgYXNPYmplY3QpIHtcbiAgICB0aGlzLmVudmlyb25tZW50ID0gZW52aXJvbm1lbnQ7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnN0cmluZ1BhcmFtcyA9IHRoaXMub3B0aW9ucy5zdHJpbmdQYXJhbXM7XG4gICAgdGhpcy50cmFja0lkcyA9IHRoaXMub3B0aW9ucy50cmFja0lkcztcbiAgICB0aGlzLnByZWNvbXBpbGUgPSAhYXNPYmplY3Q7XG5cbiAgICB0aGlzLm5hbWUgPSB0aGlzLmVudmlyb25tZW50Lm5hbWU7XG4gICAgdGhpcy5pc0NoaWxkID0gISFjb250ZXh0O1xuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQgfHwge1xuICAgICAgcHJvZ3JhbXM6IFtdLFxuICAgICAgZW52aXJvbm1lbnRzOiBbXVxuICAgIH07XG5cbiAgICB0aGlzLnByZWFtYmxlKCk7XG5cbiAgICB0aGlzLnN0YWNrU2xvdCA9IDA7XG4gICAgdGhpcy5zdGFja1ZhcnMgPSBbXTtcbiAgICB0aGlzLmFsaWFzZXMgPSB7fTtcbiAgICB0aGlzLnJlZ2lzdGVycyA9IHsgbGlzdDogW10gfTtcbiAgICB0aGlzLmhhc2hlcyA9IFtdO1xuICAgIHRoaXMuY29tcGlsZVN0YWNrID0gW107XG4gICAgdGhpcy5pbmxpbmVTdGFjayA9IFtdO1xuICAgIHRoaXMuYmxvY2tQYXJhbXMgPSBbXTtcblxuICAgIHRoaXMuY29tcGlsZUNoaWxkcmVuKGVudmlyb25tZW50LCBvcHRpb25zKTtcblxuICAgIHRoaXMudXNlRGVwdGhzID0gdGhpcy51c2VEZXB0aHMgfHwgZW52aXJvbm1lbnQudXNlRGVwdGhzIHx8IHRoaXMub3B0aW9ucy5jb21wYXQ7XG4gICAgdGhpcy51c2VCbG9ja1BhcmFtcyA9IHRoaXMudXNlQmxvY2tQYXJhbXMgfHwgZW52aXJvbm1lbnQudXNlQmxvY2tQYXJhbXM7XG5cbiAgICB2YXIgb3Bjb2RlcyA9IGVudmlyb25tZW50Lm9wY29kZXMsXG4gICAgICAgIG9wY29kZSA9IHVuZGVmaW5lZCxcbiAgICAgICAgZmlyc3RMb2MgPSB1bmRlZmluZWQsXG4gICAgICAgIGkgPSB1bmRlZmluZWQsXG4gICAgICAgIGwgPSB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGkgPSAwLCBsID0gb3Bjb2Rlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIG9wY29kZSA9IG9wY29kZXNbaV07XG5cbiAgICAgIHRoaXMuc291cmNlLmN1cnJlbnRMb2NhdGlvbiA9IG9wY29kZS5sb2M7XG4gICAgICBmaXJzdExvYyA9IGZpcnN0TG9jIHx8IG9wY29kZS5sb2M7XG4gICAgICB0aGlzW29wY29kZS5vcGNvZGVdLmFwcGx5KHRoaXMsIG9wY29kZS5hcmdzKTtcbiAgICB9XG5cbiAgICAvLyBGbHVzaCBhbnkgdHJhaWxpbmcgY29udGVudCB0aGF0IG1pZ2h0IGJlIHBlbmRpbmcuXG4gICAgdGhpcy5zb3VyY2UuY3VycmVudExvY2F0aW9uID0gZmlyc3RMb2M7XG4gICAgdGhpcy5wdXNoU291cmNlKCcnKTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHRoaXMuc3RhY2tTbG90IHx8IHRoaXMuaW5saW5lU3RhY2subGVuZ3RoIHx8IHRoaXMuY29tcGlsZVN0YWNrLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IF9FeGNlcHRpb24yWydkZWZhdWx0J10oJ0NvbXBpbGUgY29tcGxldGVkIHdpdGggY29udGVudCBsZWZ0IG9uIHN0YWNrJyk7XG4gICAgfVxuXG4gICAgdmFyIGZuID0gdGhpcy5jcmVhdGVGdW5jdGlvbkNvbnRleHQoYXNPYmplY3QpO1xuICAgIGlmICghdGhpcy5pc0NoaWxkKSB7XG4gICAgICB2YXIgcmV0ID0ge1xuICAgICAgICBjb21waWxlcjogdGhpcy5jb21waWxlckluZm8oKSxcbiAgICAgICAgbWFpbjogZm5cbiAgICAgIH07XG4gICAgICB2YXIgcHJvZ3JhbXMgPSB0aGlzLmNvbnRleHQucHJvZ3JhbXM7XG4gICAgICBmb3IgKGkgPSAwLCBsID0gcHJvZ3JhbXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChwcm9ncmFtc1tpXSkge1xuICAgICAgICAgIHJldFtpXSA9IHByb2dyYW1zW2ldO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmVudmlyb25tZW50LnVzZVBhcnRpYWwpIHtcbiAgICAgICAgcmV0LnVzZVBhcnRpYWwgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5kYXRhKSB7XG4gICAgICAgIHJldC51c2VEYXRhID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnVzZURlcHRocykge1xuICAgICAgICByZXQudXNlRGVwdGhzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnVzZUJsb2NrUGFyYW1zKSB7XG4gICAgICAgIHJldC51c2VCbG9ja1BhcmFtcyA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmNvbXBhdCkge1xuICAgICAgICByZXQuY29tcGF0ID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhc09iamVjdCkge1xuICAgICAgICByZXQuY29tcGlsZXIgPSBKU09OLnN0cmluZ2lmeShyZXQuY29tcGlsZXIpO1xuXG4gICAgICAgIHRoaXMuc291cmNlLmN1cnJlbnRMb2NhdGlvbiA9IHsgc3RhcnQ6IHsgbGluZTogMSwgY29sdW1uOiAwIH0gfTtcbiAgICAgICAgcmV0ID0gdGhpcy5vYmplY3RMaXRlcmFsKHJldCk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuc3JjTmFtZSkge1xuICAgICAgICAgIHJldCA9IHJldC50b1N0cmluZ1dpdGhTb3VyY2VNYXAoeyBmaWxlOiBvcHRpb25zLmRlc3ROYW1lIH0pO1xuICAgICAgICAgIHJldC5tYXAgPSByZXQubWFwICYmIHJldC5tYXAudG9TdHJpbmcoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXQgPSByZXQudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0LmNvbXBpbGVyT3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZuO1xuICAgIH1cbiAgfSxcblxuICBwcmVhbWJsZTogZnVuY3Rpb24gcHJlYW1ibGUoKSB7XG4gICAgLy8gdHJhY2sgdGhlIGxhc3QgY29udGV4dCBwdXNoZWQgaW50byBwbGFjZSB0byBhbGxvdyBza2lwcGluZyB0aGVcbiAgICAvLyBnZXRDb250ZXh0IG9wY29kZSB3aGVuIGl0IHdvdWxkIGJlIGEgbm9vcFxuICAgIHRoaXMubGFzdENvbnRleHQgPSAwO1xuICAgIHRoaXMuc291cmNlID0gbmV3IF9Db2RlR2VuMlsnZGVmYXVsdCddKHRoaXMub3B0aW9ucy5zcmNOYW1lKTtcbiAgfSxcblxuICBjcmVhdGVGdW5jdGlvbkNvbnRleHQ6IGZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uQ29udGV4dChhc09iamVjdCkge1xuICAgIHZhciB2YXJEZWNsYXJhdGlvbnMgPSAnJztcblxuICAgIHZhciBsb2NhbHMgPSB0aGlzLnN0YWNrVmFycy5jb25jYXQodGhpcy5yZWdpc3RlcnMubGlzdCk7XG4gICAgaWYgKGxvY2Fscy5sZW5ndGggPiAwKSB7XG4gICAgICB2YXJEZWNsYXJhdGlvbnMgKz0gJywgJyArIGxvY2Fscy5qb2luKCcsICcpO1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlIG1pbmltaXplciBhbGlhcyBtYXBwaW5nc1xuICAgIC8vXG4gICAgLy8gV2hlbiB1c2luZyB0cnVlIFNvdXJjZU5vZGVzLCB0aGlzIHdpbGwgdXBkYXRlIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBnaXZlbiBhbGlhc1xuICAgIC8vIGFzIHRoZSBzb3VyY2Ugbm9kZXMgYXJlIHJldXNlZCBpbiBzaXR1LiBGb3IgdGhlIG5vbi1zb3VyY2Ugbm9kZSBjb21waWxhdGlvbiBtb2RlLFxuICAgIC8vIGFsaWFzZXMgd2lsbCBub3QgYmUgdXNlZCwgYnV0IHRoaXMgY2FzZSBpcyBhbHJlYWR5IGJlaW5nIHJ1biBvbiB0aGUgY2xpZW50IGFuZFxuICAgIC8vIHdlIGFyZW4ndCBjb25jZXJuIGFib3V0IG1pbmltaXppbmcgdGhlIHRlbXBsYXRlIHNpemUuXG4gICAgdmFyIGFsaWFzQ291bnQgPSAwO1xuICAgIGZvciAodmFyIGFsaWFzIGluIHRoaXMuYWxpYXNlcykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBndWFyZC1mb3ItaW5cbiAgICAgIHZhciBub2RlID0gdGhpcy5hbGlhc2VzW2FsaWFzXTtcblxuICAgICAgaWYgKHRoaXMuYWxpYXNlcy5oYXNPd25Qcm9wZXJ0eShhbGlhcykgJiYgbm9kZS5jaGlsZHJlbiAmJiBub2RlLnJlZmVyZW5jZUNvdW50ID4gMSkge1xuICAgICAgICB2YXJEZWNsYXJhdGlvbnMgKz0gJywgYWxpYXMnICsgKythbGlhc0NvdW50ICsgJz0nICsgYWxpYXM7XG4gICAgICAgIG5vZGUuY2hpbGRyZW5bMF0gPSAnYWxpYXMnICsgYWxpYXNDb3VudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcGFyYW1zID0gWydkZXB0aDAnLCAnaGVscGVycycsICdwYXJ0aWFscycsICdkYXRhJ107XG5cbiAgICBpZiAodGhpcy51c2VCbG9ja1BhcmFtcyB8fCB0aGlzLnVzZURlcHRocykge1xuICAgICAgcGFyYW1zLnB1c2goJ2Jsb2NrUGFyYW1zJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnVzZURlcHRocykge1xuICAgICAgcGFyYW1zLnB1c2goJ2RlcHRocycpO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm0gYSBzZWNvbmQgcGFzcyBvdmVyIHRoZSBvdXRwdXQgdG8gbWVyZ2UgY29udGVudCB3aGVuIHBvc3NpYmxlXG4gICAgdmFyIHNvdXJjZSA9IHRoaXMubWVyZ2VTb3VyY2UodmFyRGVjbGFyYXRpb25zKTtcblxuICAgIGlmIChhc09iamVjdCkge1xuICAgICAgcGFyYW1zLnB1c2goc291cmNlKTtcblxuICAgICAgcmV0dXJuIEZ1bmN0aW9uLmFwcGx5KHRoaXMsIHBhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnNvdXJjZS53cmFwKFsnZnVuY3Rpb24oJywgcGFyYW1zLmpvaW4oJywnKSwgJykge1xcbiAgJywgc291cmNlLCAnfSddKTtcbiAgICB9XG4gIH0sXG4gIG1lcmdlU291cmNlOiBmdW5jdGlvbiBtZXJnZVNvdXJjZSh2YXJEZWNsYXJhdGlvbnMpIHtcbiAgICB2YXIgaXNTaW1wbGUgPSB0aGlzLmVudmlyb25tZW50LmlzU2ltcGxlLFxuICAgICAgICBhcHBlbmRPbmx5ID0gIXRoaXMuZm9yY2VCdWZmZXIsXG4gICAgICAgIGFwcGVuZEZpcnN0ID0gdW5kZWZpbmVkLFxuICAgICAgICBzb3VyY2VTZWVuID0gdW5kZWZpbmVkLFxuICAgICAgICBidWZmZXJTdGFydCA9IHVuZGVmaW5lZCxcbiAgICAgICAgYnVmZmVyRW5kID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc291cmNlLmVhY2goZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgIGlmIChsaW5lLmFwcGVuZFRvQnVmZmVyKSB7XG4gICAgICAgIGlmIChidWZmZXJTdGFydCkge1xuICAgICAgICAgIGxpbmUucHJlcGVuZCgnICArICcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1ZmZlclN0YXJ0ID0gbGluZTtcbiAgICAgICAgfVxuICAgICAgICBidWZmZXJFbmQgPSBsaW5lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGJ1ZmZlclN0YXJ0KSB7XG4gICAgICAgICAgaWYgKCFzb3VyY2VTZWVuKSB7XG4gICAgICAgICAgICBhcHBlbmRGaXJzdCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJ1ZmZlclN0YXJ0LnByZXBlbmQoJ2J1ZmZlciArPSAnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnVmZmVyRW5kLmFkZCgnOycpO1xuICAgICAgICAgIGJ1ZmZlclN0YXJ0ID0gYnVmZmVyRW5kID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgc291cmNlU2VlbiA9IHRydWU7XG4gICAgICAgIGlmICghaXNTaW1wbGUpIHtcbiAgICAgICAgICBhcHBlbmRPbmx5ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChhcHBlbmRPbmx5KSB7XG4gICAgICBpZiAoYnVmZmVyU3RhcnQpIHtcbiAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuICcpO1xuICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7XG4gICAgICB9IGVsc2UgaWYgKCFzb3VyY2VTZWVuKSB7XG4gICAgICAgIHRoaXMuc291cmNlLnB1c2goJ3JldHVybiBcIlwiOycpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXJEZWNsYXJhdGlvbnMgKz0gJywgYnVmZmVyID0gJyArIChhcHBlbmRGaXJzdCA/ICcnIDogdGhpcy5pbml0aWFsaXplQnVmZmVyKCkpO1xuXG4gICAgICBpZiAoYnVmZmVyU3RhcnQpIHtcbiAgICAgICAgYnVmZmVyU3RhcnQucHJlcGVuZCgncmV0dXJuIGJ1ZmZlciArICcpO1xuICAgICAgICBidWZmZXJFbmQuYWRkKCc7Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNvdXJjZS5wdXNoKCdyZXR1cm4gYnVmZmVyOycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YXJEZWNsYXJhdGlvbnMpIHtcbiAgICAgIHRoaXMuc291cmNlLnByZXBlbmQoJ3ZhciAnICsgdmFyRGVjbGFyYXRpb25zLnN1YnN0cmluZygyKSArIChhcHBlbmRGaXJzdCA/ICcnIDogJztcXG4nKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc291cmNlLm1lcmdlKCk7XG4gIH0sXG5cbiAgLy8gW2Jsb2NrVmFsdWVdXG4gIC8vXG4gIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHZhbHVlXG4gIC8vIE9uIHN0YWNrLCBhZnRlcjogcmV0dXJuIHZhbHVlIG9mIGJsb2NrSGVscGVyTWlzc2luZ1xuICAvL1xuICAvLyBUaGUgcHVycG9zZSBvZiB0aGlzIG9wY29kZSBpcyB0byB0YWtlIGEgYmxvY2sgb2YgdGhlIGZvcm1cbiAgLy8gYHt7I3RoaXMuZm9vfX0uLi57ey90aGlzLmZvb319YCwgcmVzb2x2ZSB0aGUgdmFsdWUgb2YgYGZvb2AsIGFuZFxuICAvLyByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayB3aXRoIHRoZSByZXN1bHQgb2YgcHJvcGVybHlcbiAgLy8gaW52b2tpbmcgYmxvY2tIZWxwZXJNaXNzaW5nLlxuICBibG9ja1ZhbHVlOiBmdW5jdGlvbiBibG9ja1ZhbHVlKG5hbWUpIHtcbiAgICB2YXIgYmxvY2tIZWxwZXJNaXNzaW5nID0gdGhpcy5hbGlhc2FibGUoJ2hlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nJyksXG4gICAgICAgIHBhcmFtcyA9IFt0aGlzLmNvbnRleHROYW1lKDApXTtcbiAgICB0aGlzLnNldHVwSGVscGVyQXJncyhuYW1lLCAwLCBwYXJhbXMpO1xuXG4gICAgdmFyIGJsb2NrTmFtZSA9IHRoaXMucG9wU3RhY2soKTtcbiAgICBwYXJhbXMuc3BsaWNlKDEsIDAsIGJsb2NrTmFtZSk7XG5cbiAgICB0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGJsb2NrSGVscGVyTWlzc2luZywgJ2NhbGwnLCBwYXJhbXMpKTtcbiAgfSxcblxuICAvLyBbYW1iaWd1b3VzQmxvY2tWYWx1ZV1cbiAgLy9cbiAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgdmFsdWVcbiAgLy8gQ29tcGlsZXIgdmFsdWUsIGJlZm9yZTogbGFzdEhlbHBlcj12YWx1ZSBvZiBsYXN0IGZvdW5kIGhlbHBlciwgaWYgYW55XG4gIC8vIE9uIHN0YWNrLCBhZnRlciwgaWYgbm8gbGFzdEhlbHBlcjogc2FtZSBhcyBbYmxvY2tWYWx1ZV1cbiAgLy8gT24gc3RhY2ssIGFmdGVyLCBpZiBsYXN0SGVscGVyOiB2YWx1ZVxuICBhbWJpZ3VvdXNCbG9ja1ZhbHVlOiBmdW5jdGlvbiBhbWJpZ3VvdXNCbG9ja1ZhbHVlKCkge1xuICAgIC8vIFdlJ3JlIGJlaW5nIGEgYml0IGNoZWVreSBhbmQgcmV1c2luZyB0aGUgb3B0aW9ucyB2YWx1ZSBmcm9tIHRoZSBwcmlvciBleGVjXG4gICAgdmFyIGJsb2NrSGVscGVyTWlzc2luZyA9IHRoaXMuYWxpYXNhYmxlKCdoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZycpLFxuICAgICAgICBwYXJhbXMgPSBbdGhpcy5jb250ZXh0TmFtZSgwKV07XG4gICAgdGhpcy5zZXR1cEhlbHBlckFyZ3MoJycsIDAsIHBhcmFtcywgdHJ1ZSk7XG5cbiAgICB0aGlzLmZsdXNoSW5saW5lKCk7XG5cbiAgICB2YXIgY3VycmVudCA9IHRoaXMudG9wU3RhY2soKTtcbiAgICBwYXJhbXMuc3BsaWNlKDEsIDAsIGN1cnJlbnQpO1xuXG4gICAgdGhpcy5wdXNoU291cmNlKFsnaWYgKCEnLCB0aGlzLmxhc3RIZWxwZXIsICcpIHsgJywgY3VycmVudCwgJyA9ICcsIHRoaXMuc291cmNlLmZ1bmN0aW9uQ2FsbChibG9ja0hlbHBlck1pc3NpbmcsICdjYWxsJywgcGFyYW1zKSwgJ30nXSk7XG4gIH0sXG5cbiAgLy8gW2FwcGVuZENvbnRlbnRdXG4gIC8vXG4gIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLlxuICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLlxuICAvL1xuICAvLyBBcHBlbmRzIHRoZSBzdHJpbmcgdmFsdWUgb2YgYGNvbnRlbnRgIHRvIHRoZSBjdXJyZW50IGJ1ZmZlclxuICBhcHBlbmRDb250ZW50OiBmdW5jdGlvbiBhcHBlbmRDb250ZW50KGNvbnRlbnQpIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nQ29udGVudCkge1xuICAgICAgY29udGVudCA9IHRoaXMucGVuZGluZ0NvbnRlbnQgKyBjb250ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBlbmRpbmdMb2NhdGlvbiA9IHRoaXMuc291cmNlLmN1cnJlbnRMb2NhdGlvbjtcbiAgICB9XG5cbiAgICB0aGlzLnBlbmRpbmdDb250ZW50ID0gY29udGVudDtcbiAgfSxcblxuICAvLyBbYXBwZW5kXVxuICAvL1xuICAvLyBPbiBzdGFjaywgYmVmb3JlOiB2YWx1ZSwgLi4uXG4gIC8vIE9uIHN0YWNrLCBhZnRlcjogLi4uXG4gIC8vXG4gIC8vIENvZXJjZXMgYHZhbHVlYCB0byBhIFN0cmluZyBhbmQgYXBwZW5kcyBpdCB0byB0aGUgY3VycmVudCBidWZmZXIuXG4gIC8vXG4gIC8vIElmIGB2YWx1ZWAgaXMgdHJ1dGh5LCBvciAwLCBpdCBpcyBjb2VyY2VkIGludG8gYSBzdHJpbmcgYW5kIGFwcGVuZGVkXG4gIC8vIE90aGVyd2lzZSwgdGhlIGVtcHR5IHN0cmluZyBpcyBhcHBlbmRlZFxuICBhcHBlbmQ6IGZ1bmN0aW9uIGFwcGVuZCgpIHtcbiAgICBpZiAodGhpcy5pc0lubGluZSgpKSB7XG4gICAgICB0aGlzLnJlcGxhY2VTdGFjayhmdW5jdGlvbiAoY3VycmVudCkge1xuICAgICAgICByZXR1cm4gWycgIT0gbnVsbCA/ICcsIGN1cnJlbnQsICcgOiBcIlwiJ107XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5wdXNoU291cmNlKHRoaXMuYXBwZW5kVG9CdWZmZXIodGhpcy5wb3BTdGFjaygpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBsb2NhbCA9IHRoaXMucG9wU3RhY2soKTtcbiAgICAgIHRoaXMucHVzaFNvdXJjZShbJ2lmICgnLCBsb2NhbCwgJyAhPSBudWxsKSB7ICcsIHRoaXMuYXBwZW5kVG9CdWZmZXIobG9jYWwsIHVuZGVmaW5lZCwgdHJ1ZSksICcgfSddKTtcbiAgICAgIGlmICh0aGlzLmVudmlyb25tZW50LmlzU2ltcGxlKSB7XG4gICAgICAgIHRoaXMucHVzaFNvdXJjZShbJ2Vsc2UgeyAnLCB0aGlzLmFwcGVuZFRvQnVmZmVyKCdcXCdcXCcnLCB1bmRlZmluZWQsIHRydWUpLCAnIH0nXSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8vIFthcHBlbmRFc2NhcGVkXVxuICAvL1xuICAvLyBPbiBzdGFjaywgYmVmb3JlOiB2YWx1ZSwgLi4uXG4gIC8vIE9uIHN0YWNrLCBhZnRlcjogLi4uXG4gIC8vXG4gIC8vIEVzY2FwZSBgdmFsdWVgIGFuZCBhcHBlbmQgaXQgdG8gdGhlIGJ1ZmZlclxuICBhcHBlbmRFc2NhcGVkOiBmdW5jdGlvbiBhcHBlbmRFc2NhcGVkKCkge1xuICAgIHRoaXMucHVzaFNvdXJjZSh0aGlzLmFwcGVuZFRvQnVmZmVyKFt0aGlzLmFsaWFzYWJsZSgndGhpcy5lc2NhcGVFeHByZXNzaW9uJyksICcoJywgdGhpcy5wb3BTdGFjaygpLCAnKSddKSk7XG4gIH0sXG5cbiAgLy8gW2dldENvbnRleHRdXG4gIC8vXG4gIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLlxuICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLlxuICAvLyBDb21waWxlciB2YWx1ZSwgYWZ0ZXI6IGxhc3RDb250ZXh0PWRlcHRoXG4gIC8vXG4gIC8vIFNldCB0aGUgdmFsdWUgb2YgdGhlIGBsYXN0Q29udGV4dGAgY29tcGlsZXIgdmFsdWUgdG8gdGhlIGRlcHRoXG4gIGdldENvbnRleHQ6IGZ1bmN0aW9uIGdldENvbnRleHQoZGVwdGgpIHtcbiAgICB0aGlzLmxhc3RDb250ZXh0ID0gZGVwdGg7XG4gIH0sXG5cbiAgLy8gW3B1c2hDb250ZXh0XVxuICAvL1xuICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi5cbiAgLy8gT24gc3RhY2ssIGFmdGVyOiBjdXJyZW50Q29udGV4dCwgLi4uXG4gIC8vXG4gIC8vIFB1c2hlcyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgY29udGV4dCBvbnRvIHRoZSBzdGFjay5cbiAgcHVzaENvbnRleHQ6IGZ1bmN0aW9uIHB1c2hDb250ZXh0KCkge1xuICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCh0aGlzLmNvbnRleHROYW1lKHRoaXMubGFzdENvbnRleHQpKTtcbiAgfSxcblxuICAvLyBbbG9va3VwT25Db250ZXh0XVxuICAvL1xuICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi5cbiAgLy8gT24gc3RhY2ssIGFmdGVyOiBjdXJyZW50Q29udGV4dFtuYW1lXSwgLi4uXG4gIC8vXG4gIC8vIExvb2tzIHVwIHRoZSB2YWx1ZSBvZiBgbmFtZWAgb24gdGhlIGN1cnJlbnQgY29udGV4dCBhbmQgcHVzaGVzXG4gIC8vIGl0IG9udG8gdGhlIHN0YWNrLlxuICBsb29rdXBPbkNvbnRleHQ6IGZ1bmN0aW9uIGxvb2t1cE9uQ29udGV4dChwYXJ0cywgZmFsc3ksIHNjb3BlZCkge1xuICAgIHZhciBpID0gMDtcblxuICAgIGlmICghc2NvcGVkICYmIHRoaXMub3B0aW9ucy5jb21wYXQgJiYgIXRoaXMubGFzdENvbnRleHQpIHtcbiAgICAgIC8vIFRoZSBkZXB0aGVkIHF1ZXJ5IGlzIGV4cGVjdGVkIHRvIGhhbmRsZSB0aGUgdW5kZWZpbmVkIGxvZ2ljIGZvciB0aGUgcm9vdCBsZXZlbCB0aGF0XG4gICAgICAvLyBpcyBpbXBsZW1lbnRlZCBiZWxvdywgc28gd2UgZXZhbHVhdGUgdGhhdCBkaXJlY3RseSBpbiBjb21wYXQgbW9kZVxuICAgICAgdGhpcy5wdXNoKHRoaXMuZGVwdGhlZExvb2t1cChwYXJ0c1tpKytdKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHVzaENvbnRleHQoKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlc29sdmVQYXRoKCdjb250ZXh0JywgcGFydHMsIGksIGZhbHN5KTtcbiAgfSxcblxuICAvLyBbbG9va3VwQmxvY2tQYXJhbV1cbiAgLy9cbiAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uXG4gIC8vIE9uIHN0YWNrLCBhZnRlcjogYmxvY2tQYXJhbVtuYW1lXSwgLi4uXG4gIC8vXG4gIC8vIExvb2tzIHVwIHRoZSB2YWx1ZSBvZiBgcGFydHNgIG9uIHRoZSBnaXZlbiBibG9jayBwYXJhbSBhbmQgcHVzaGVzXG4gIC8vIGl0IG9udG8gdGhlIHN0YWNrLlxuICBsb29rdXBCbG9ja1BhcmFtOiBmdW5jdGlvbiBsb29rdXBCbG9ja1BhcmFtKGJsb2NrUGFyYW1JZCwgcGFydHMpIHtcbiAgICB0aGlzLnVzZUJsb2NrUGFyYW1zID0gdHJ1ZTtcblxuICAgIHRoaXMucHVzaChbJ2Jsb2NrUGFyYW1zWycsIGJsb2NrUGFyYW1JZFswXSwgJ11bJywgYmxvY2tQYXJhbUlkWzFdLCAnXSddKTtcbiAgICB0aGlzLnJlc29sdmVQYXRoKCdjb250ZXh0JywgcGFydHMsIDEpO1xuICB9LFxuXG4gIC8vIFtsb29rdXBEYXRhXVxuICAvL1xuICAvLyBPbiBzdGFjaywgYmVmb3JlOiAuLi5cbiAgLy8gT24gc3RhY2ssIGFmdGVyOiBkYXRhLCAuLi5cbiAgLy9cbiAgLy8gUHVzaCB0aGUgZGF0YSBsb29rdXAgb3BlcmF0b3JcbiAgbG9va3VwRGF0YTogZnVuY3Rpb24gbG9va3VwRGF0YShkZXB0aCwgcGFydHMpIHtcbiAgICBpZiAoIWRlcHRoKSB7XG4gICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2RhdGEnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCd0aGlzLmRhdGEoZGF0YSwgJyArIGRlcHRoICsgJyknKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlc29sdmVQYXRoKCdkYXRhJywgcGFydHMsIDAsIHRydWUpO1xuICB9LFxuXG4gIHJlc29sdmVQYXRoOiBmdW5jdGlvbiByZXNvbHZlUGF0aCh0eXBlLCBwYXJ0cywgaSwgZmFsc3kpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zdHJpY3QgfHwgdGhpcy5vcHRpb25zLmFzc3VtZU9iamVjdHMpIHtcbiAgICAgIHRoaXMucHVzaChzdHJpY3RMb29rdXAodGhpcy5vcHRpb25zLnN0cmljdCwgdGhpcywgcGFydHMsIHR5cGUpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbGVuID0gcGFydHMubGVuZ3RoO1xuICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIC8qZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovXG4gICAgICB0aGlzLnJlcGxhY2VTdGFjayhmdW5jdGlvbiAoY3VycmVudCkge1xuICAgICAgICB2YXIgbG9va3VwID0gX3RoaXMubmFtZUxvb2t1cChjdXJyZW50LCBwYXJ0c1tpXSwgdHlwZSk7XG4gICAgICAgIC8vIFdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgemVybyBhbmQgZmFsc2UgYXJlIGhhbmRsZWQgcHJvcGVybHkgaWYgdGhlIGNvbnRleHQgKGZhbHN5IGZsYWcpXG4gICAgICAgIC8vIG5lZWRzIHRvIGhhdmUgdGhlIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHRoZXNlIHZhbHVlcy5cbiAgICAgICAgaWYgKCFmYWxzeSkge1xuICAgICAgICAgIHJldHVybiBbJyAhPSBudWxsID8gJywgbG9va3VwLCAnIDogJywgY3VycmVudF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIGNhbiB1c2UgZ2VuZXJpYyBmYWxzeSBoYW5kbGluZ1xuICAgICAgICAgIHJldHVybiBbJyAmJiAnLCBsb29rdXBdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8qZXNsaW50LWVuYWJsZSBuby1sb29wLWZ1bmMgKi9cbiAgICB9XG4gIH0sXG5cbiAgLy8gW3Jlc29sdmVQb3NzaWJsZUxhbWJkYV1cbiAgLy9cbiAgLy8gT24gc3RhY2ssIGJlZm9yZTogdmFsdWUsIC4uLlxuICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHJlc29sdmVkIHZhbHVlLCAuLi5cbiAgLy9cbiAgLy8gSWYgdGhlIGB2YWx1ZWAgaXMgYSBsYW1iZGEsIHJlcGxhY2UgaXQgb24gdGhlIHN0YWNrIGJ5XG4gIC8vIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGxhbWJkYVxuICByZXNvbHZlUG9zc2libGVMYW1iZGE6IGZ1bmN0aW9uIHJlc29sdmVQb3NzaWJsZUxhbWJkYSgpIHtcbiAgICB0aGlzLnB1c2goW3RoaXMuYWxpYXNhYmxlKCd0aGlzLmxhbWJkYScpLCAnKCcsIHRoaXMucG9wU3RhY2soKSwgJywgJywgdGhpcy5jb250ZXh0TmFtZSgwKSwgJyknXSk7XG4gIH0sXG5cbiAgLy8gW3B1c2hTdHJpbmdQYXJhbV1cbiAgLy9cbiAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uXG4gIC8vIE9uIHN0YWNrLCBhZnRlcjogc3RyaW5nLCBjdXJyZW50Q29udGV4dCwgLi4uXG4gIC8vXG4gIC8vIFRoaXMgb3Bjb2RlIGlzIGRlc2lnbmVkIGZvciB1c2UgaW4gc3RyaW5nIG1vZGUsIHdoaWNoXG4gIC8vIHByb3ZpZGVzIHRoZSBzdHJpbmcgdmFsdWUgb2YgYSBwYXJhbWV0ZXIgYWxvbmcgd2l0aCBpdHNcbiAgLy8gZGVwdGggcmF0aGVyIHRoYW4gcmVzb2x2aW5nIGl0IGltbWVkaWF0ZWx5LlxuICBwdXNoU3RyaW5nUGFyYW06IGZ1bmN0aW9uIHB1c2hTdHJpbmdQYXJhbShzdHJpbmcsIHR5cGUpIHtcbiAgICB0aGlzLnB1c2hDb250ZXh0KCk7XG4gICAgdGhpcy5wdXNoU3RyaW5nKHR5cGUpO1xuXG4gICAgLy8gSWYgaXQncyBhIHN1YmV4cHJlc3Npb24sIHRoZSBzdHJpbmcgcmVzdWx0XG4gICAgLy8gd2lsbCBiZSBwdXNoZWQgYWZ0ZXIgdGhpcyBvcGNvZGUuXG4gICAgaWYgKHR5cGUgIT09ICdTdWJFeHByZXNzaW9uJykge1xuICAgICAgaWYgKHR5cGVvZiBzdHJpbmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMucHVzaFN0cmluZyhzdHJpbmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHN0cmluZyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGVtcHR5SGFzaDogZnVuY3Rpb24gZW1wdHlIYXNoKG9taXRFbXB0eSkge1xuICAgIGlmICh0aGlzLnRyYWNrSWRzKSB7XG4gICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hJZHNcbiAgICB9XG4gICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7XG4gICAgICB0aGlzLnB1c2goJ3t9Jyk7IC8vIGhhc2hDb250ZXh0c1xuICAgICAgdGhpcy5wdXNoKCd7fScpOyAvLyBoYXNoVHlwZXNcbiAgICB9XG4gICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKG9taXRFbXB0eSA/ICd1bmRlZmluZWQnIDogJ3t9Jyk7XG4gIH0sXG4gIHB1c2hIYXNoOiBmdW5jdGlvbiBwdXNoSGFzaCgpIHtcbiAgICBpZiAodGhpcy5oYXNoKSB7XG4gICAgICB0aGlzLmhhc2hlcy5wdXNoKHRoaXMuaGFzaCk7XG4gICAgfVxuICAgIHRoaXMuaGFzaCA9IHsgdmFsdWVzOiBbXSwgdHlwZXM6IFtdLCBjb250ZXh0czogW10sIGlkczogW10gfTtcbiAgfSxcbiAgcG9wSGFzaDogZnVuY3Rpb24gcG9wSGFzaCgpIHtcbiAgICB2YXIgaGFzaCA9IHRoaXMuaGFzaDtcbiAgICB0aGlzLmhhc2ggPSB0aGlzLmhhc2hlcy5wb3AoKTtcblxuICAgIGlmICh0aGlzLnRyYWNrSWRzKSB7XG4gICAgICB0aGlzLnB1c2godGhpcy5vYmplY3RMaXRlcmFsKGhhc2guaWRzKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0cmluZ1BhcmFtcykge1xuICAgICAgdGhpcy5wdXNoKHRoaXMub2JqZWN0TGl0ZXJhbChoYXNoLmNvbnRleHRzKSk7XG4gICAgICB0aGlzLnB1c2godGhpcy5vYmplY3RMaXRlcmFsKGhhc2gudHlwZXMpKTtcbiAgICB9XG5cbiAgICB0aGlzLnB1c2godGhpcy5vYmplY3RMaXRlcmFsKGhhc2gudmFsdWVzKSk7XG4gIH0sXG5cbiAgLy8gW3B1c2hTdHJpbmddXG4gIC8vXG4gIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLlxuICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHF1b3RlZFN0cmluZyhzdHJpbmcpLCAuLi5cbiAgLy9cbiAgLy8gUHVzaCBhIHF1b3RlZCB2ZXJzaW9uIG9mIGBzdHJpbmdgIG9udG8gdGhlIHN0YWNrXG4gIHB1c2hTdHJpbmc6IGZ1bmN0aW9uIHB1c2hTdHJpbmcoc3RyaW5nKSB7XG4gICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMucXVvdGVkU3RyaW5nKHN0cmluZykpO1xuICB9LFxuXG4gIC8vIFtwdXNoTGl0ZXJhbF1cbiAgLy9cbiAgLy8gT24gc3RhY2ssIGJlZm9yZTogLi4uXG4gIC8vIE9uIHN0YWNrLCBhZnRlcjogdmFsdWUsIC4uLlxuICAvL1xuICAvLyBQdXNoZXMgYSB2YWx1ZSBvbnRvIHRoZSBzdGFjay4gVGhpcyBvcGVyYXRpb24gcHJldmVudHNcbiAgLy8gdGhlIGNvbXBpbGVyIGZyb20gY3JlYXRpbmcgYSB0ZW1wb3JhcnkgdmFyaWFibGUgdG8gaG9sZFxuICAvLyBpdC5cbiAgcHVzaExpdGVyYWw6IGZ1bmN0aW9uIHB1c2hMaXRlcmFsKHZhbHVlKSB7XG4gICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKHZhbHVlKTtcbiAgfSxcblxuICAvLyBbcHVzaFByb2dyYW1dXG4gIC8vXG4gIC8vIE9uIHN0YWNrLCBiZWZvcmU6IC4uLlxuICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHByb2dyYW0oZ3VpZCksIC4uLlxuICAvL1xuICAvLyBQdXNoIGEgcHJvZ3JhbSBleHByZXNzaW9uIG9udG8gdGhlIHN0YWNrLiBUaGlzIHRha2VzXG4gIC8vIGEgY29tcGlsZS10aW1lIGd1aWQgYW5kIGNvbnZlcnRzIGl0IGludG8gYSBydW50aW1lLWFjY2Vzc2libGVcbiAgLy8gZXhwcmVzc2lvbi5cbiAgcHVzaFByb2dyYW06IGZ1bmN0aW9uIHB1c2hQcm9ncmFtKGd1aWQpIHtcbiAgICBpZiAoZ3VpZCAhPSBudWxsKSB7XG4gICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwodGhpcy5wcm9ncmFtRXhwcmVzc2lvbihndWlkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbChudWxsKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gW2ludm9rZUhlbHBlcl1cbiAgLy9cbiAgLy8gT24gc3RhY2ssIGJlZm9yZTogaGFzaCwgaW52ZXJzZSwgcHJvZ3JhbSwgcGFyYW1zLi4uLCAuLi5cbiAgLy8gT24gc3RhY2ssIGFmdGVyOiByZXN1bHQgb2YgaGVscGVyIGludm9jYXRpb25cbiAgLy9cbiAgLy8gUG9wcyBvZmYgdGhlIGhlbHBlcidzIHBhcmFtZXRlcnMsIGludm9rZXMgdGhlIGhlbHBlcixcbiAgLy8gYW5kIHB1c2hlcyB0aGUgaGVscGVyJ3MgcmV0dXJuIHZhbHVlIG9udG8gdGhlIHN0YWNrLlxuICAvL1xuICAvLyBJZiB0aGUgaGVscGVyIGlzIG5vdCBmb3VuZCwgYGhlbHBlck1pc3NpbmdgIGlzIGNhbGxlZC5cbiAgaW52b2tlSGVscGVyOiBmdW5jdGlvbiBpbnZva2VIZWxwZXIocGFyYW1TaXplLCBuYW1lLCBpc1NpbXBsZSkge1xuICAgIHZhciBub25IZWxwZXIgPSB0aGlzLnBvcFN0YWNrKCksXG4gICAgICAgIGhlbHBlciA9IHRoaXMuc2V0dXBIZWxwZXIocGFyYW1TaXplLCBuYW1lKSxcbiAgICAgICAgc2ltcGxlID0gaXNTaW1wbGUgPyBbaGVscGVyLm5hbWUsICcgfHwgJ10gOiAnJztcblxuICAgIHZhciBsb29rdXAgPSBbJygnXS5jb25jYXQoc2ltcGxlLCBub25IZWxwZXIpO1xuICAgIGlmICghdGhpcy5vcHRpb25zLnN0cmljdCkge1xuICAgICAgbG9va3VwLnB1c2goJyB8fCAnLCB0aGlzLmFsaWFzYWJsZSgnaGVscGVycy5oZWxwZXJNaXNzaW5nJykpO1xuICAgIH1cbiAgICBsb29rdXAucHVzaCgnKScpO1xuXG4gICAgdGhpcy5wdXNoKHRoaXMuc291cmNlLmZ1bmN0aW9uQ2FsbChsb29rdXAsICdjYWxsJywgaGVscGVyLmNhbGxQYXJhbXMpKTtcbiAgfSxcblxuICAvLyBbaW52b2tlS25vd25IZWxwZXJdXG4gIC8vXG4gIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGhhc2gsIGludmVyc2UsIHByb2dyYW0sIHBhcmFtcy4uLiwgLi4uXG4gIC8vIE9uIHN0YWNrLCBhZnRlcjogcmVzdWx0IG9mIGhlbHBlciBpbnZvY2F0aW9uXG4gIC8vXG4gIC8vIFRoaXMgb3BlcmF0aW9uIGlzIHVzZWQgd2hlbiB0aGUgaGVscGVyIGlzIGtub3duIHRvIGV4aXN0LFxuICAvLyBzbyBhIGBoZWxwZXJNaXNzaW5nYCBmYWxsYmFjayBpcyBub3QgcmVxdWlyZWQuXG4gIGludm9rZUtub3duSGVscGVyOiBmdW5jdGlvbiBpbnZva2VLbm93bkhlbHBlcihwYXJhbVNpemUsIG5hbWUpIHtcbiAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcihwYXJhbVNpemUsIG5hbWUpO1xuICAgIHRoaXMucHVzaCh0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwoaGVscGVyLm5hbWUsICdjYWxsJywgaGVscGVyLmNhbGxQYXJhbXMpKTtcbiAgfSxcblxuICAvLyBbaW52b2tlQW1iaWd1b3VzXVxuICAvL1xuICAvLyBPbiBzdGFjaywgYmVmb3JlOiBoYXNoLCBpbnZlcnNlLCBwcm9ncmFtLCBwYXJhbXMuLi4sIC4uLlxuICAvLyBPbiBzdGFjaywgYWZ0ZXI6IHJlc3VsdCBvZiBkaXNhbWJpZ3VhdGlvblxuICAvL1xuICAvLyBUaGlzIG9wZXJhdGlvbiBpcyB1c2VkIHdoZW4gYW4gZXhwcmVzc2lvbiBsaWtlIGB7e2Zvb319YFxuICAvLyBpcyBwcm92aWRlZCwgYnV0IHdlIGRvbid0IGtub3cgYXQgY29tcGlsZS10aW1lIHdoZXRoZXIgaXRcbiAgLy8gaXMgYSBoZWxwZXIgb3IgYSBwYXRoLlxuICAvL1xuICAvLyBUaGlzIG9wZXJhdGlvbiBlbWl0cyBtb3JlIGNvZGUgdGhhbiB0aGUgb3RoZXIgb3B0aW9ucyxcbiAgLy8gYW5kIGNhbiBiZSBhdm9pZGVkIGJ5IHBhc3NpbmcgdGhlIGBrbm93bkhlbHBlcnNgIGFuZFxuICAvLyBga25vd25IZWxwZXJzT25seWAgZmxhZ3MgYXQgY29tcGlsZS10aW1lLlxuICBpbnZva2VBbWJpZ3VvdXM6IGZ1bmN0aW9uIGludm9rZUFtYmlndW91cyhuYW1lLCBoZWxwZXJDYWxsKSB7XG4gICAgdGhpcy51c2VSZWdpc3RlcignaGVscGVyJyk7XG5cbiAgICB2YXIgbm9uSGVscGVyID0gdGhpcy5wb3BTdGFjaygpO1xuXG4gICAgdGhpcy5lbXB0eUhhc2goKTtcbiAgICB2YXIgaGVscGVyID0gdGhpcy5zZXR1cEhlbHBlcigwLCBuYW1lLCBoZWxwZXJDYWxsKTtcblxuICAgIHZhciBoZWxwZXJOYW1lID0gdGhpcy5sYXN0SGVscGVyID0gdGhpcy5uYW1lTG9va3VwKCdoZWxwZXJzJywgbmFtZSwgJ2hlbHBlcicpO1xuXG4gICAgdmFyIGxvb2t1cCA9IFsnKCcsICcoaGVscGVyID0gJywgaGVscGVyTmFtZSwgJyB8fCAnLCBub25IZWxwZXIsICcpJ107XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuc3RyaWN0KSB7XG4gICAgICBsb29rdXBbMF0gPSAnKGhlbHBlciA9ICc7XG4gICAgICBsb29rdXAucHVzaCgnICE9IG51bGwgPyBoZWxwZXIgOiAnLCB0aGlzLmFsaWFzYWJsZSgnaGVscGVycy5oZWxwZXJNaXNzaW5nJykpO1xuICAgIH1cblxuICAgIHRoaXMucHVzaChbJygnLCBsb29rdXAsIGhlbHBlci5wYXJhbXNJbml0ID8gWycpLCgnLCBoZWxwZXIucGFyYW1zSW5pdF0gOiBbXSwgJyksJywgJyh0eXBlb2YgaGVscGVyID09PSAnLCB0aGlzLmFsaWFzYWJsZSgnXCJmdW5jdGlvblwiJyksICcgPyAnLCB0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwoJ2hlbHBlcicsICdjYWxsJywgaGVscGVyLmNhbGxQYXJhbXMpLCAnIDogaGVscGVyKSknXSk7XG4gIH0sXG5cbiAgLy8gW2ludm9rZVBhcnRpYWxdXG4gIC8vXG4gIC8vIE9uIHN0YWNrLCBiZWZvcmU6IGNvbnRleHQsIC4uLlxuICAvLyBPbiBzdGFjayBhZnRlcjogcmVzdWx0IG9mIHBhcnRpYWwgaW52b2NhdGlvblxuICAvL1xuICAvLyBUaGlzIG9wZXJhdGlvbiBwb3BzIG9mZiBhIGNvbnRleHQsIGludm9rZXMgYSBwYXJ0aWFsIHdpdGggdGhhdCBjb250ZXh0LFxuICAvLyBhbmQgcHVzaGVzIHRoZSByZXN1bHQgb2YgdGhlIGludm9jYXRpb24gYmFjay5cbiAgaW52b2tlUGFydGlhbDogZnVuY3Rpb24gaW52b2tlUGFydGlhbChpc0R5bmFtaWMsIG5hbWUsIGluZGVudCkge1xuICAgIHZhciBwYXJhbXMgPSBbXSxcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMuc2V0dXBQYXJhbXMobmFtZSwgMSwgcGFyYW1zLCBmYWxzZSk7XG5cbiAgICBpZiAoaXNEeW5hbWljKSB7XG4gICAgICBuYW1lID0gdGhpcy5wb3BTdGFjaygpO1xuICAgICAgZGVsZXRlIG9wdGlvbnMubmFtZTtcbiAgICB9XG5cbiAgICBpZiAoaW5kZW50KSB7XG4gICAgICBvcHRpb25zLmluZGVudCA9IEpTT04uc3RyaW5naWZ5KGluZGVudCk7XG4gICAgfVxuICAgIG9wdGlvbnMuaGVscGVycyA9ICdoZWxwZXJzJztcbiAgICBvcHRpb25zLnBhcnRpYWxzID0gJ3BhcnRpYWxzJztcblxuICAgIGlmICghaXNEeW5hbWljKSB7XG4gICAgICBwYXJhbXMudW5zaGlmdCh0aGlzLm5hbWVMb29rdXAoJ3BhcnRpYWxzJywgbmFtZSwgJ3BhcnRpYWwnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmFtcy51bnNoaWZ0KG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0KSB7XG4gICAgICBvcHRpb25zLmRlcHRocyA9ICdkZXB0aHMnO1xuICAgIH1cbiAgICBvcHRpb25zID0gdGhpcy5vYmplY3RMaXRlcmFsKG9wdGlvbnMpO1xuICAgIHBhcmFtcy5wdXNoKG9wdGlvbnMpO1xuXG4gICAgdGhpcy5wdXNoKHRoaXMuc291cmNlLmZ1bmN0aW9uQ2FsbCgndGhpcy5pbnZva2VQYXJ0aWFsJywgJycsIHBhcmFtcykpO1xuICB9LFxuXG4gIC8vIFthc3NpZ25Ub0hhc2hdXG4gIC8vXG4gIC8vIE9uIHN0YWNrLCBiZWZvcmU6IHZhbHVlLCAuLi4sIGhhc2gsIC4uLlxuICAvLyBPbiBzdGFjaywgYWZ0ZXI6IC4uLiwgaGFzaCwgLi4uXG4gIC8vXG4gIC8vIFBvcHMgYSB2YWx1ZSBvZmYgdGhlIHN0YWNrIGFuZCBhc3NpZ25zIGl0IHRvIHRoZSBjdXJyZW50IGhhc2hcbiAgYXNzaWduVG9IYXNoOiBmdW5jdGlvbiBhc3NpZ25Ub0hhc2goa2V5KSB7XG4gICAgdmFyIHZhbHVlID0gdGhpcy5wb3BTdGFjaygpLFxuICAgICAgICBjb250ZXh0ID0gdW5kZWZpbmVkLFxuICAgICAgICB0eXBlID0gdW5kZWZpbmVkLFxuICAgICAgICBpZCA9IHVuZGVmaW5lZDtcblxuICAgIGlmICh0aGlzLnRyYWNrSWRzKSB7XG4gICAgICBpZCA9IHRoaXMucG9wU3RhY2soKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7XG4gICAgICB0eXBlID0gdGhpcy5wb3BTdGFjaygpO1xuICAgICAgY29udGV4dCA9IHRoaXMucG9wU3RhY2soKTtcbiAgICB9XG5cbiAgICB2YXIgaGFzaCA9IHRoaXMuaGFzaDtcbiAgICBpZiAoY29udGV4dCkge1xuICAgICAgaGFzaC5jb250ZXh0c1trZXldID0gY29udGV4dDtcbiAgICB9XG4gICAgaWYgKHR5cGUpIHtcbiAgICAgIGhhc2gudHlwZXNba2V5XSA9IHR5cGU7XG4gICAgfVxuICAgIGlmIChpZCkge1xuICAgICAgaGFzaC5pZHNba2V5XSA9IGlkO1xuICAgIH1cbiAgICBoYXNoLnZhbHVlc1trZXldID0gdmFsdWU7XG4gIH0sXG5cbiAgcHVzaElkOiBmdW5jdGlvbiBwdXNoSWQodHlwZSwgbmFtZSwgY2hpbGQpIHtcbiAgICBpZiAodHlwZSA9PT0gJ0Jsb2NrUGFyYW0nKSB7XG4gICAgICB0aGlzLnB1c2hTdGFja0xpdGVyYWwoJ2Jsb2NrUGFyYW1zWycgKyBuYW1lWzBdICsgJ10ucGF0aFsnICsgbmFtZVsxXSArICddJyArIChjaGlsZCA/ICcgKyAnICsgSlNPTi5zdHJpbmdpZnkoJy4nICsgY2hpbGQpIDogJycpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQYXRoRXhwcmVzc2lvbicpIHtcbiAgICAgIHRoaXMucHVzaFN0cmluZyhuYW1lKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdTdWJFeHByZXNzaW9uJykge1xuICAgICAgdGhpcy5wdXNoU3RhY2tMaXRlcmFsKCd0cnVlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHVzaFN0YWNrTGl0ZXJhbCgnbnVsbCcpO1xuICAgIH1cbiAgfSxcblxuICAvLyBIRUxQRVJTXG5cbiAgY29tcGlsZXI6IEphdmFTY3JpcHRDb21waWxlcixcblxuICBjb21waWxlQ2hpbGRyZW46IGZ1bmN0aW9uIGNvbXBpbGVDaGlsZHJlbihlbnZpcm9ubWVudCwgb3B0aW9ucykge1xuICAgIHZhciBjaGlsZHJlbiA9IGVudmlyb25tZW50LmNoaWxkcmVuLFxuICAgICAgICBjaGlsZCA9IHVuZGVmaW5lZCxcbiAgICAgICAgY29tcGlsZXIgPSB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIGNvbXBpbGVyID0gbmV3IHRoaXMuY29tcGlsZXIoKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuZXctY2FwXG5cbiAgICAgIHZhciBpbmRleCA9IHRoaXMubWF0Y2hFeGlzdGluZ1Byb2dyYW0oY2hpbGQpO1xuXG4gICAgICBpZiAoaW5kZXggPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmNvbnRleHQucHJvZ3JhbXMucHVzaCgnJyk7IC8vIFBsYWNlaG9sZGVyIHRvIHByZXZlbnQgbmFtZSBjb25mbGljdHMgZm9yIG5lc3RlZCBjaGlsZHJlblxuICAgICAgICBpbmRleCA9IHRoaXMuY29udGV4dC5wcm9ncmFtcy5sZW5ndGg7XG4gICAgICAgIGNoaWxkLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIGNoaWxkLm5hbWUgPSAncHJvZ3JhbScgKyBpbmRleDtcbiAgICAgICAgdGhpcy5jb250ZXh0LnByb2dyYW1zW2luZGV4XSA9IGNvbXBpbGVyLmNvbXBpbGUoY2hpbGQsIG9wdGlvbnMsIHRoaXMuY29udGV4dCwgIXRoaXMucHJlY29tcGlsZSk7XG4gICAgICAgIHRoaXMuY29udGV4dC5lbnZpcm9ubWVudHNbaW5kZXhdID0gY2hpbGQ7XG5cbiAgICAgICAgdGhpcy51c2VEZXB0aHMgPSB0aGlzLnVzZURlcHRocyB8fCBjb21waWxlci51c2VEZXB0aHM7XG4gICAgICAgIHRoaXMudXNlQmxvY2tQYXJhbXMgPSB0aGlzLnVzZUJsb2NrUGFyYW1zIHx8IGNvbXBpbGVyLnVzZUJsb2NrUGFyYW1zO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hpbGQuaW5kZXggPSBpbmRleDtcbiAgICAgICAgY2hpbGQubmFtZSA9ICdwcm9ncmFtJyArIGluZGV4O1xuXG4gICAgICAgIHRoaXMudXNlRGVwdGhzID0gdGhpcy51c2VEZXB0aHMgfHwgY2hpbGQudXNlRGVwdGhzO1xuICAgICAgICB0aGlzLnVzZUJsb2NrUGFyYW1zID0gdGhpcy51c2VCbG9ja1BhcmFtcyB8fCBjaGlsZC51c2VCbG9ja1BhcmFtcztcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIG1hdGNoRXhpc3RpbmdQcm9ncmFtOiBmdW5jdGlvbiBtYXRjaEV4aXN0aW5nUHJvZ3JhbShjaGlsZCkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB0aGlzLmNvbnRleHQuZW52aXJvbm1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgZW52aXJvbm1lbnQgPSB0aGlzLmNvbnRleHQuZW52aXJvbm1lbnRzW2ldO1xuICAgICAgaWYgKGVudmlyb25tZW50ICYmIGVudmlyb25tZW50LmVxdWFscyhjaGlsZCkpIHtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHByb2dyYW1FeHByZXNzaW9uOiBmdW5jdGlvbiBwcm9ncmFtRXhwcmVzc2lvbihndWlkKSB7XG4gICAgdmFyIGNoaWxkID0gdGhpcy5lbnZpcm9ubWVudC5jaGlsZHJlbltndWlkXSxcbiAgICAgICAgcHJvZ3JhbVBhcmFtcyA9IFtjaGlsZC5pbmRleCwgJ2RhdGEnLCBjaGlsZC5ibG9ja1BhcmFtc107XG5cbiAgICBpZiAodGhpcy51c2VCbG9ja1BhcmFtcyB8fCB0aGlzLnVzZURlcHRocykge1xuICAgICAgcHJvZ3JhbVBhcmFtcy5wdXNoKCdibG9ja1BhcmFtcycpO1xuICAgIH1cbiAgICBpZiAodGhpcy51c2VEZXB0aHMpIHtcbiAgICAgIHByb2dyYW1QYXJhbXMucHVzaCgnZGVwdGhzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuICd0aGlzLnByb2dyYW0oJyArIHByb2dyYW1QYXJhbXMuam9pbignLCAnKSArICcpJztcbiAgfSxcblxuICB1c2VSZWdpc3RlcjogZnVuY3Rpb24gdXNlUmVnaXN0ZXIobmFtZSkge1xuICAgIGlmICghdGhpcy5yZWdpc3RlcnNbbmFtZV0pIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJzW25hbWVdID0gdHJ1ZTtcbiAgICAgIHRoaXMucmVnaXN0ZXJzLmxpc3QucHVzaChuYW1lKTtcbiAgICB9XG4gIH0sXG5cbiAgcHVzaDogZnVuY3Rpb24gcHVzaChleHByKSB7XG4gICAgaWYgKCEoZXhwciBpbnN0YW5jZW9mIExpdGVyYWwpKSB7XG4gICAgICBleHByID0gdGhpcy5zb3VyY2Uud3JhcChleHByKTtcbiAgICB9XG5cbiAgICB0aGlzLmlubGluZVN0YWNrLnB1c2goZXhwcik7XG4gICAgcmV0dXJuIGV4cHI7XG4gIH0sXG5cbiAgcHVzaFN0YWNrTGl0ZXJhbDogZnVuY3Rpb24gcHVzaFN0YWNrTGl0ZXJhbChpdGVtKSB7XG4gICAgdGhpcy5wdXNoKG5ldyBMaXRlcmFsKGl0ZW0pKTtcbiAgfSxcblxuICBwdXNoU291cmNlOiBmdW5jdGlvbiBwdXNoU291cmNlKHNvdXJjZSkge1xuICAgIGlmICh0aGlzLnBlbmRpbmdDb250ZW50KSB7XG4gICAgICB0aGlzLnNvdXJjZS5wdXNoKHRoaXMuYXBwZW5kVG9CdWZmZXIodGhpcy5zb3VyY2UucXVvdGVkU3RyaW5nKHRoaXMucGVuZGluZ0NvbnRlbnQpLCB0aGlzLnBlbmRpbmdMb2NhdGlvbikpO1xuICAgICAgdGhpcy5wZW5kaW5nQ29udGVudCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlKSB7XG4gICAgICB0aGlzLnNvdXJjZS5wdXNoKHNvdXJjZSk7XG4gICAgfVxuICB9LFxuXG4gIHJlcGxhY2VTdGFjazogZnVuY3Rpb24gcmVwbGFjZVN0YWNrKGNhbGxiYWNrKSB7XG4gICAgdmFyIHByZWZpeCA9IFsnKCddLFxuICAgICAgICBzdGFjayA9IHVuZGVmaW5lZCxcbiAgICAgICAgY3JlYXRlZFN0YWNrID0gdW5kZWZpbmVkLFxuICAgICAgICB1c2VkTGl0ZXJhbCA9IHVuZGVmaW5lZDtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKCF0aGlzLmlzSW5saW5lKCkpIHtcbiAgICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKCdyZXBsYWNlU3RhY2sgb24gbm9uLWlubGluZScpO1xuICAgIH1cblxuICAgIC8vIFdlIHdhbnQgdG8gbWVyZ2UgdGhlIGlubGluZSBzdGF0ZW1lbnQgaW50byB0aGUgcmVwbGFjZW1lbnQgc3RhdGVtZW50IHZpYSAnLCdcbiAgICB2YXIgdG9wID0gdGhpcy5wb3BTdGFjayh0cnVlKTtcblxuICAgIGlmICh0b3AgaW5zdGFuY2VvZiBMaXRlcmFsKSB7XG4gICAgICAvLyBMaXRlcmFscyBkbyBub3QgbmVlZCB0byBiZSBpbmxpbmVkXG4gICAgICBzdGFjayA9IFt0b3AudmFsdWVdO1xuICAgICAgcHJlZml4ID0gWycoJywgc3RhY2tdO1xuICAgICAgdXNlZExpdGVyYWwgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBHZXQgb3IgY3JlYXRlIHRoZSBjdXJyZW50IHN0YWNrIG5hbWUgZm9yIHVzZSBieSB0aGUgaW5saW5lXG4gICAgICBjcmVhdGVkU3RhY2sgPSB0cnVlO1xuICAgICAgdmFyIF9uYW1lID0gdGhpcy5pbmNyU3RhY2soKTtcblxuICAgICAgcHJlZml4ID0gWycoKCcsIHRoaXMucHVzaChfbmFtZSksICcgPSAnLCB0b3AsICcpJ107XG4gICAgICBzdGFjayA9IHRoaXMudG9wU3RhY2soKTtcbiAgICB9XG5cbiAgICB2YXIgaXRlbSA9IGNhbGxiYWNrLmNhbGwodGhpcywgc3RhY2spO1xuXG4gICAgaWYgKCF1c2VkTGl0ZXJhbCkge1xuICAgICAgdGhpcy5wb3BTdGFjaygpO1xuICAgIH1cbiAgICBpZiAoY3JlYXRlZFN0YWNrKSB7XG4gICAgICB0aGlzLnN0YWNrU2xvdC0tO1xuICAgIH1cbiAgICB0aGlzLnB1c2gocHJlZml4LmNvbmNhdChpdGVtLCAnKScpKTtcbiAgfSxcblxuICBpbmNyU3RhY2s6IGZ1bmN0aW9uIGluY3JTdGFjaygpIHtcbiAgICB0aGlzLnN0YWNrU2xvdCsrO1xuICAgIGlmICh0aGlzLnN0YWNrU2xvdCA+IHRoaXMuc3RhY2tWYXJzLmxlbmd0aCkge1xuICAgICAgdGhpcy5zdGFja1ZhcnMucHVzaCgnc3RhY2snICsgdGhpcy5zdGFja1Nsb3QpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50b3BTdGFja05hbWUoKTtcbiAgfSxcbiAgdG9wU3RhY2tOYW1lOiBmdW5jdGlvbiB0b3BTdGFja05hbWUoKSB7XG4gICAgcmV0dXJuICdzdGFjaycgKyB0aGlzLnN0YWNrU2xvdDtcbiAgfSxcbiAgZmx1c2hJbmxpbmU6IGZ1bmN0aW9uIGZsdXNoSW5saW5lKCkge1xuICAgIHZhciBpbmxpbmVTdGFjayA9IHRoaXMuaW5saW5lU3RhY2s7XG4gICAgdGhpcy5pbmxpbmVTdGFjayA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBpbmxpbmVTdGFjay5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgdmFyIGVudHJ5ID0gaW5saW5lU3RhY2tbaV07XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChlbnRyeSBpbnN0YW5jZW9mIExpdGVyYWwpIHtcbiAgICAgICAgdGhpcy5jb21waWxlU3RhY2sucHVzaChlbnRyeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgc3RhY2sgPSB0aGlzLmluY3JTdGFjaygpO1xuICAgICAgICB0aGlzLnB1c2hTb3VyY2UoW3N0YWNrLCAnID0gJywgZW50cnksICc7J10pO1xuICAgICAgICB0aGlzLmNvbXBpbGVTdGFjay5wdXNoKHN0YWNrKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGlzSW5saW5lOiBmdW5jdGlvbiBpc0lubGluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pbmxpbmVTdGFjay5sZW5ndGg7XG4gIH0sXG5cbiAgcG9wU3RhY2s6IGZ1bmN0aW9uIHBvcFN0YWNrKHdyYXBwZWQpIHtcbiAgICB2YXIgaW5saW5lID0gdGhpcy5pc0lubGluZSgpLFxuICAgICAgICBpdGVtID0gKGlubGluZSA/IHRoaXMuaW5saW5lU3RhY2sgOiB0aGlzLmNvbXBpbGVTdGFjaykucG9wKCk7XG5cbiAgICBpZiAoIXdyYXBwZWQgJiYgaXRlbSBpbnN0YW5jZW9mIExpdGVyYWwpIHtcbiAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWlubGluZSkge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBpZiAoIXRoaXMuc3RhY2tTbG90KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IF9FeGNlcHRpb24yWydkZWZhdWx0J10oJ0ludmFsaWQgc3RhY2sgcG9wJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGFja1Nsb3QtLTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH1cbiAgfSxcblxuICB0b3BTdGFjazogZnVuY3Rpb24gdG9wU3RhY2soKSB7XG4gICAgdmFyIHN0YWNrID0gdGhpcy5pc0lubGluZSgpID8gdGhpcy5pbmxpbmVTdGFjayA6IHRoaXMuY29tcGlsZVN0YWNrLFxuICAgICAgICBpdGVtID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIExpdGVyYWwpIHtcbiAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG4gIH0sXG5cbiAgY29udGV4dE5hbWU6IGZ1bmN0aW9uIGNvbnRleHROYW1lKGNvbnRleHQpIHtcbiAgICBpZiAodGhpcy51c2VEZXB0aHMgJiYgY29udGV4dCkge1xuICAgICAgcmV0dXJuICdkZXB0aHNbJyArIGNvbnRleHQgKyAnXSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnZGVwdGgnICsgY29udGV4dDtcbiAgICB9XG4gIH0sXG5cbiAgcXVvdGVkU3RyaW5nOiBmdW5jdGlvbiBxdW90ZWRTdHJpbmcoc3RyKSB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlLnF1b3RlZFN0cmluZyhzdHIpO1xuICB9LFxuXG4gIG9iamVjdExpdGVyYWw6IGZ1bmN0aW9uIG9iamVjdExpdGVyYWwob2JqKSB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlLm9iamVjdExpdGVyYWwob2JqKTtcbiAgfSxcblxuICBhbGlhc2FibGU6IGZ1bmN0aW9uIGFsaWFzYWJsZShuYW1lKSB7XG4gICAgdmFyIHJldCA9IHRoaXMuYWxpYXNlc1tuYW1lXTtcbiAgICBpZiAocmV0KSB7XG4gICAgICByZXQucmVmZXJlbmNlQ291bnQrKztcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgcmV0ID0gdGhpcy5hbGlhc2VzW25hbWVdID0gdGhpcy5zb3VyY2Uud3JhcChuYW1lKTtcbiAgICByZXQuYWxpYXNhYmxlID0gdHJ1ZTtcbiAgICByZXQucmVmZXJlbmNlQ291bnQgPSAxO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfSxcblxuICBzZXR1cEhlbHBlcjogZnVuY3Rpb24gc2V0dXBIZWxwZXIocGFyYW1TaXplLCBuYW1lLCBibG9ja0hlbHBlcikge1xuICAgIHZhciBwYXJhbXMgPSBbXSxcbiAgICAgICAgcGFyYW1zSW5pdCA9IHRoaXMuc2V0dXBIZWxwZXJBcmdzKG5hbWUsIHBhcmFtU2l6ZSwgcGFyYW1zLCBibG9ja0hlbHBlcik7XG4gICAgdmFyIGZvdW5kSGVscGVyID0gdGhpcy5uYW1lTG9va3VwKCdoZWxwZXJzJywgbmFtZSwgJ2hlbHBlcicpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgcGFyYW1zSW5pdDogcGFyYW1zSW5pdCxcbiAgICAgIG5hbWU6IGZvdW5kSGVscGVyLFxuICAgICAgY2FsbFBhcmFtczogW3RoaXMuY29udGV4dE5hbWUoMCldLmNvbmNhdChwYXJhbXMpXG4gICAgfTtcbiAgfSxcblxuICBzZXR1cFBhcmFtczogZnVuY3Rpb24gc2V0dXBQYXJhbXMoaGVscGVyLCBwYXJhbVNpemUsIHBhcmFtcykge1xuICAgIHZhciBvcHRpb25zID0ge30sXG4gICAgICAgIGNvbnRleHRzID0gW10sXG4gICAgICAgIHR5cGVzID0gW10sXG4gICAgICAgIGlkcyA9IFtdLFxuICAgICAgICBwYXJhbSA9IHVuZGVmaW5lZDtcblxuICAgIG9wdGlvbnMubmFtZSA9IHRoaXMucXVvdGVkU3RyaW5nKGhlbHBlcik7XG4gICAgb3B0aW9ucy5oYXNoID0gdGhpcy5wb3BTdGFjaygpO1xuXG4gICAgaWYgKHRoaXMudHJhY2tJZHMpIHtcbiAgICAgIG9wdGlvbnMuaGFzaElkcyA9IHRoaXMucG9wU3RhY2soKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7XG4gICAgICBvcHRpb25zLmhhc2hUeXBlcyA9IHRoaXMucG9wU3RhY2soKTtcbiAgICAgIG9wdGlvbnMuaGFzaENvbnRleHRzID0gdGhpcy5wb3BTdGFjaygpO1xuICAgIH1cblxuICAgIHZhciBpbnZlcnNlID0gdGhpcy5wb3BTdGFjaygpLFxuICAgICAgICBwcm9ncmFtID0gdGhpcy5wb3BTdGFjaygpO1xuXG4gICAgLy8gQXZvaWQgc2V0dGluZyBmbiBhbmQgaW52ZXJzZSBpZiBuZWl0aGVyIGFyZSBzZXQuIFRoaXMgYWxsb3dzXG4gICAgLy8gaGVscGVycyB0byBkbyBhIGNoZWNrIGZvciBgaWYgKG9wdGlvbnMuZm4pYFxuICAgIGlmIChwcm9ncmFtIHx8IGludmVyc2UpIHtcbiAgICAgIG9wdGlvbnMuZm4gPSBwcm9ncmFtIHx8ICd0aGlzLm5vb3AnO1xuICAgICAgb3B0aW9ucy5pbnZlcnNlID0gaW52ZXJzZSB8fCAndGhpcy5ub29wJztcbiAgICB9XG5cbiAgICAvLyBUaGUgcGFyYW1ldGVycyBnbyBvbiB0byB0aGUgc3RhY2sgaW4gb3JkZXIgKG1ha2luZyBzdXJlIHRoYXQgdGhleSBhcmUgZXZhbHVhdGVkIGluIG9yZGVyKVxuICAgIC8vIHNvIHdlIG5lZWQgdG8gcG9wIHRoZW0gb2ZmIHRoZSBzdGFjayBpbiByZXZlcnNlIG9yZGVyXG4gICAgdmFyIGkgPSBwYXJhbVNpemU7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgcGFyYW0gPSB0aGlzLnBvcFN0YWNrKCk7XG4gICAgICBwYXJhbXNbaV0gPSBwYXJhbTtcblxuICAgICAgaWYgKHRoaXMudHJhY2tJZHMpIHtcbiAgICAgICAgaWRzW2ldID0gdGhpcy5wb3BTdGFjaygpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc3RyaW5nUGFyYW1zKSB7XG4gICAgICAgIHR5cGVzW2ldID0gdGhpcy5wb3BTdGFjaygpO1xuICAgICAgICBjb250ZXh0c1tpXSA9IHRoaXMucG9wU3RhY2soKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmFja0lkcykge1xuICAgICAgb3B0aW9ucy5pZHMgPSB0aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KGlkcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0cmluZ1BhcmFtcykge1xuICAgICAgb3B0aW9ucy50eXBlcyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkodHlwZXMpO1xuICAgICAgb3B0aW9ucy5jb250ZXh0cyA9IHRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkoY29udGV4dHMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZGF0YSkge1xuICAgICAgb3B0aW9ucy5kYXRhID0gJ2RhdGEnO1xuICAgIH1cbiAgICBpZiAodGhpcy51c2VCbG9ja1BhcmFtcykge1xuICAgICAgb3B0aW9ucy5ibG9ja1BhcmFtcyA9ICdibG9ja1BhcmFtcyc7XG4gICAgfVxuICAgIHJldHVybiBvcHRpb25zO1xuICB9LFxuXG4gIHNldHVwSGVscGVyQXJnczogZnVuY3Rpb24gc2V0dXBIZWxwZXJBcmdzKGhlbHBlciwgcGFyYW1TaXplLCBwYXJhbXMsIHVzZVJlZ2lzdGVyKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLnNldHVwUGFyYW1zKGhlbHBlciwgcGFyYW1TaXplLCBwYXJhbXMsIHRydWUpO1xuICAgIG9wdGlvbnMgPSB0aGlzLm9iamVjdExpdGVyYWwob3B0aW9ucyk7XG4gICAgaWYgKHVzZVJlZ2lzdGVyKSB7XG4gICAgICB0aGlzLnVzZVJlZ2lzdGVyKCdvcHRpb25zJyk7XG4gICAgICBwYXJhbXMucHVzaCgnb3B0aW9ucycpO1xuICAgICAgcmV0dXJuIFsnb3B0aW9ucz0nLCBvcHRpb25zXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyYW1zLnB1c2gob3B0aW9ucyk7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG59O1xuXG4oZnVuY3Rpb24gKCkge1xuICB2YXIgcmVzZXJ2ZWRXb3JkcyA9ICgnYnJlYWsgZWxzZSBuZXcgdmFyJyArICcgY2FzZSBmaW5hbGx5IHJldHVybiB2b2lkJyArICcgY2F0Y2ggZm9yIHN3aXRjaCB3aGlsZScgKyAnIGNvbnRpbnVlIGZ1bmN0aW9uIHRoaXMgd2l0aCcgKyAnIGRlZmF1bHQgaWYgdGhyb3cnICsgJyBkZWxldGUgaW4gdHJ5JyArICcgZG8gaW5zdGFuY2VvZiB0eXBlb2YnICsgJyBhYnN0cmFjdCBlbnVtIGludCBzaG9ydCcgKyAnIGJvb2xlYW4gZXhwb3J0IGludGVyZmFjZSBzdGF0aWMnICsgJyBieXRlIGV4dGVuZHMgbG9uZyBzdXBlcicgKyAnIGNoYXIgZmluYWwgbmF0aXZlIHN5bmNocm9uaXplZCcgKyAnIGNsYXNzIGZsb2F0IHBhY2thZ2UgdGhyb3dzJyArICcgY29uc3QgZ290byBwcml2YXRlIHRyYW5zaWVudCcgKyAnIGRlYnVnZ2VyIGltcGxlbWVudHMgcHJvdGVjdGVkIHZvbGF0aWxlJyArICcgZG91YmxlIGltcG9ydCBwdWJsaWMgbGV0IHlpZWxkIGF3YWl0JyArICcgbnVsbCB0cnVlIGZhbHNlJykuc3BsaXQoJyAnKTtcblxuICB2YXIgY29tcGlsZXJXb3JkcyA9IEphdmFTY3JpcHRDb21waWxlci5SRVNFUlZFRF9XT1JEUyA9IHt9O1xuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gcmVzZXJ2ZWRXb3Jkcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBjb21waWxlcldvcmRzW3Jlc2VydmVkV29yZHNbaV1dID0gdHJ1ZTtcbiAgfVxufSkoKTtcblxuSmF2YVNjcmlwdENvbXBpbGVyLmlzVmFsaWRKYXZhU2NyaXB0VmFyaWFibGVOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuICFKYXZhU2NyaXB0Q29tcGlsZXIuUkVTRVJWRURfV09SRFNbbmFtZV0gJiYgL15bYS16QS1aXyRdWzAtOWEtekEtWl8kXSokLy50ZXN0KG5hbWUpO1xufTtcblxuZnVuY3Rpb24gc3RyaWN0TG9va3VwKHJlcXVpcmVUZXJtaW5hbCwgY29tcGlsZXIsIHBhcnRzLCB0eXBlKSB7XG4gIHZhciBzdGFjayA9IGNvbXBpbGVyLnBvcFN0YWNrKCksXG4gICAgICBpID0gMCxcbiAgICAgIGxlbiA9IHBhcnRzLmxlbmd0aDtcbiAgaWYgKHJlcXVpcmVUZXJtaW5hbCkge1xuICAgIGxlbi0tO1xuICB9XG5cbiAgZm9yICg7IGkgPCBsZW47IGkrKykge1xuICAgIHN0YWNrID0gY29tcGlsZXIubmFtZUxvb2t1cChzdGFjaywgcGFydHNbaV0sIHR5cGUpO1xuICB9XG5cbiAgaWYgKHJlcXVpcmVUZXJtaW5hbCkge1xuICAgIHJldHVybiBbY29tcGlsZXIuYWxpYXNhYmxlKCd0aGlzLnN0cmljdCcpLCAnKCcsIHN0YWNrLCAnLCAnLCBjb21waWxlci5xdW90ZWRTdHJpbmcocGFydHNbaV0pLCAnKSddO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdGFjaztcbiAgfVxufVxuXG5leHBvcnRzWydkZWZhdWx0J10gPSBKYXZhU2NyaXB0Q29tcGlsZXI7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4vKiBKaXNvbiBnZW5lcmF0ZWQgcGFyc2VyICovXG52YXIgaGFuZGxlYmFycyA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBhcnNlciA9IHsgdHJhY2U6IGZ1bmN0aW9uIHRyYWNlKCkge30sXG4gICAgICAgIHl5OiB7fSxcbiAgICAgICAgc3ltYm9sc186IHsgZXJyb3I6IDIsIHJvb3Q6IDMsIHByb2dyYW06IDQsIEVPRjogNSwgcHJvZ3JhbV9yZXBldGl0aW9uMDogNiwgc3RhdGVtZW50OiA3LCBtdXN0YWNoZTogOCwgYmxvY2s6IDksIHJhd0Jsb2NrOiAxMCwgcGFydGlhbDogMTEsIGNvbnRlbnQ6IDEyLCBDT01NRU5UOiAxMywgQ09OVEVOVDogMTQsIG9wZW5SYXdCbG9jazogMTUsIEVORF9SQVdfQkxPQ0s6IDE2LCBPUEVOX1JBV19CTE9DSzogMTcsIGhlbHBlck5hbWU6IDE4LCBvcGVuUmF3QmxvY2tfcmVwZXRpdGlvbjA6IDE5LCBvcGVuUmF3QmxvY2tfb3B0aW9uMDogMjAsIENMT1NFX1JBV19CTE9DSzogMjEsIG9wZW5CbG9jazogMjIsIGJsb2NrX29wdGlvbjA6IDIzLCBjbG9zZUJsb2NrOiAyNCwgb3BlbkludmVyc2U6IDI1LCBibG9ja19vcHRpb24xOiAyNiwgT1BFTl9CTE9DSzogMjcsIG9wZW5CbG9ja19yZXBldGl0aW9uMDogMjgsIG9wZW5CbG9ja19vcHRpb24wOiAyOSwgb3BlbkJsb2NrX29wdGlvbjE6IDMwLCBDTE9TRTogMzEsIE9QRU5fSU5WRVJTRTogMzIsIG9wZW5JbnZlcnNlX3JlcGV0aXRpb24wOiAzMywgb3BlbkludmVyc2Vfb3B0aW9uMDogMzQsIG9wZW5JbnZlcnNlX29wdGlvbjE6IDM1LCBvcGVuSW52ZXJzZUNoYWluOiAzNiwgT1BFTl9JTlZFUlNFX0NIQUlOOiAzNywgb3BlbkludmVyc2VDaGFpbl9yZXBldGl0aW9uMDogMzgsIG9wZW5JbnZlcnNlQ2hhaW5fb3B0aW9uMDogMzksIG9wZW5JbnZlcnNlQ2hhaW5fb3B0aW9uMTogNDAsIGludmVyc2VBbmRQcm9ncmFtOiA0MSwgSU5WRVJTRTogNDIsIGludmVyc2VDaGFpbjogNDMsIGludmVyc2VDaGFpbl9vcHRpb24wOiA0NCwgT1BFTl9FTkRCTE9DSzogNDUsIE9QRU46IDQ2LCBtdXN0YWNoZV9yZXBldGl0aW9uMDogNDcsIG11c3RhY2hlX29wdGlvbjA6IDQ4LCBPUEVOX1VORVNDQVBFRDogNDksIG11c3RhY2hlX3JlcGV0aXRpb24xOiA1MCwgbXVzdGFjaGVfb3B0aW9uMTogNTEsIENMT1NFX1VORVNDQVBFRDogNTIsIE9QRU5fUEFSVElBTDogNTMsIHBhcnRpYWxOYW1lOiA1NCwgcGFydGlhbF9yZXBldGl0aW9uMDogNTUsIHBhcnRpYWxfb3B0aW9uMDogNTYsIHBhcmFtOiA1Nywgc2V4cHI6IDU4LCBPUEVOX1NFWFBSOiA1OSwgc2V4cHJfcmVwZXRpdGlvbjA6IDYwLCBzZXhwcl9vcHRpb24wOiA2MSwgQ0xPU0VfU0VYUFI6IDYyLCBoYXNoOiA2MywgaGFzaF9yZXBldGl0aW9uX3BsdXMwOiA2NCwgaGFzaFNlZ21lbnQ6IDY1LCBJRDogNjYsIEVRVUFMUzogNjcsIGJsb2NrUGFyYW1zOiA2OCwgT1BFTl9CTE9DS19QQVJBTVM6IDY5LCBibG9ja1BhcmFtc19yZXBldGl0aW9uX3BsdXMwOiA3MCwgQ0xPU0VfQkxPQ0tfUEFSQU1TOiA3MSwgcGF0aDogNzIsIGRhdGFOYW1lOiA3MywgU1RSSU5HOiA3NCwgTlVNQkVSOiA3NSwgQk9PTEVBTjogNzYsIFVOREVGSU5FRDogNzcsIE5VTEw6IDc4LCBEQVRBOiA3OSwgcGF0aFNlZ21lbnRzOiA4MCwgU0VQOiA4MSwgJGFjY2VwdDogMCwgJGVuZDogMSB9LFxuICAgICAgICB0ZXJtaW5hbHNfOiB7IDI6IFwiZXJyb3JcIiwgNTogXCJFT0ZcIiwgMTM6IFwiQ09NTUVOVFwiLCAxNDogXCJDT05URU5UXCIsIDE2OiBcIkVORF9SQVdfQkxPQ0tcIiwgMTc6IFwiT1BFTl9SQVdfQkxPQ0tcIiwgMjE6IFwiQ0xPU0VfUkFXX0JMT0NLXCIsIDI3OiBcIk9QRU5fQkxPQ0tcIiwgMzE6IFwiQ0xPU0VcIiwgMzI6IFwiT1BFTl9JTlZFUlNFXCIsIDM3OiBcIk9QRU5fSU5WRVJTRV9DSEFJTlwiLCA0MjogXCJJTlZFUlNFXCIsIDQ1OiBcIk9QRU5fRU5EQkxPQ0tcIiwgNDY6IFwiT1BFTlwiLCA0OTogXCJPUEVOX1VORVNDQVBFRFwiLCA1MjogXCJDTE9TRV9VTkVTQ0FQRURcIiwgNTM6IFwiT1BFTl9QQVJUSUFMXCIsIDU5OiBcIk9QRU5fU0VYUFJcIiwgNjI6IFwiQ0xPU0VfU0VYUFJcIiwgNjY6IFwiSURcIiwgNjc6IFwiRVFVQUxTXCIsIDY5OiBcIk9QRU5fQkxPQ0tfUEFSQU1TXCIsIDcxOiBcIkNMT1NFX0JMT0NLX1BBUkFNU1wiLCA3NDogXCJTVFJJTkdcIiwgNzU6IFwiTlVNQkVSXCIsIDc2OiBcIkJPT0xFQU5cIiwgNzc6IFwiVU5ERUZJTkVEXCIsIDc4OiBcIk5VTExcIiwgNzk6IFwiREFUQVwiLCA4MTogXCJTRVBcIiB9LFxuICAgICAgICBwcm9kdWN0aW9uc186IFswLCBbMywgMl0sIFs0LCAxXSwgWzcsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzcsIDFdLCBbNywgMV0sIFs3LCAxXSwgWzEyLCAxXSwgWzEwLCAzXSwgWzE1LCA1XSwgWzksIDRdLCBbOSwgNF0sIFsyMiwgNl0sIFsyNSwgNl0sIFszNiwgNl0sIFs0MSwgMl0sIFs0MywgM10sIFs0MywgMV0sIFsyNCwgM10sIFs4LCA1XSwgWzgsIDVdLCBbMTEsIDVdLCBbNTcsIDFdLCBbNTcsIDFdLCBbNTgsIDVdLCBbNjMsIDFdLCBbNjUsIDNdLCBbNjgsIDNdLCBbMTgsIDFdLCBbMTgsIDFdLCBbMTgsIDFdLCBbMTgsIDFdLCBbMTgsIDFdLCBbMTgsIDFdLCBbMTgsIDFdLCBbNTQsIDFdLCBbNTQsIDFdLCBbNzMsIDJdLCBbNzIsIDFdLCBbODAsIDNdLCBbODAsIDFdLCBbNiwgMF0sIFs2LCAyXSwgWzE5LCAwXSwgWzE5LCAyXSwgWzIwLCAwXSwgWzIwLCAxXSwgWzIzLCAwXSwgWzIzLCAxXSwgWzI2LCAwXSwgWzI2LCAxXSwgWzI4LCAwXSwgWzI4LCAyXSwgWzI5LCAwXSwgWzI5LCAxXSwgWzMwLCAwXSwgWzMwLCAxXSwgWzMzLCAwXSwgWzMzLCAyXSwgWzM0LCAwXSwgWzM0LCAxXSwgWzM1LCAwXSwgWzM1LCAxXSwgWzM4LCAwXSwgWzM4LCAyXSwgWzM5LCAwXSwgWzM5LCAxXSwgWzQwLCAwXSwgWzQwLCAxXSwgWzQ0LCAwXSwgWzQ0LCAxXSwgWzQ3LCAwXSwgWzQ3LCAyXSwgWzQ4LCAwXSwgWzQ4LCAxXSwgWzUwLCAwXSwgWzUwLCAyXSwgWzUxLCAwXSwgWzUxLCAxXSwgWzU1LCAwXSwgWzU1LCAyXSwgWzU2LCAwXSwgWzU2LCAxXSwgWzYwLCAwXSwgWzYwLCAyXSwgWzYxLCAwXSwgWzYxLCAxXSwgWzY0LCAxXSwgWzY0LCAyXSwgWzcwLCAxXSwgWzcwLCAyXV0sXG4gICAgICAgIHBlcmZvcm1BY3Rpb246IGZ1bmN0aW9uIGFub255bW91cyh5eXRleHQsIHl5bGVuZywgeXlsaW5lbm8sIHl5LCB5eXN0YXRlLCAkJCwgXyQpIHtcblxuICAgICAgICAgICAgdmFyICQwID0gJCQubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIHN3aXRjaCAoeXlzdGF0ZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQkWyQwIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gbmV3IHl5LlByb2dyYW0oJCRbJDBdLCBudWxsLCB7fSwgeXkubG9jSW5mbyh0aGlzLl8kKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBuZXcgeXkuQ29tbWVudFN0YXRlbWVudCh5eS5zdHJpcENvbW1lbnQoJCRbJDBdKSwgeXkuc3RyaXBGbGFncygkJFskMF0sICQkWyQwXSksIHl5LmxvY0luZm8odGhpcy5fJCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IG5ldyB5eS5Db250ZW50U3RhdGVtZW50KCQkWyQwXSwgeXkubG9jSW5mbyh0aGlzLl8kKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVSYXdCbG9jaygkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRoaXMuXyQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHBhdGg6ICQkWyQwIC0gM10sIHBhcmFtczogJCRbJDAgLSAyXSwgaGFzaDogJCRbJDAgLSAxXSB9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCBmYWxzZSwgdGhpcy5fJCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVCbG9jaygkJFskMCAtIDNdLCAkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMF0sIHRydWUsIHRoaXMuXyQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHBhdGg6ICQkWyQwIC0gNF0sIHBhcmFtczogJCRbJDAgLSAzXSwgaGFzaDogJCRbJDAgLSAyXSwgYmxvY2tQYXJhbXM6ICQkWyQwIC0gMV0sIHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNV0sICQkWyQwXSkgfTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDRdLCBwYXJhbXM6ICQkWyQwIC0gM10sIGhhc2g6ICQkWyQwIC0gMl0sIGJsb2NrUGFyYW1zOiAkJFskMCAtIDFdLCBzdHJpcDogeXkuc3RyaXBGbGFncygkJFskMCAtIDVdLCAkJFskMF0pIH07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHsgcGF0aDogJCRbJDAgLSA0XSwgcGFyYW1zOiAkJFskMCAtIDNdLCBoYXNoOiAkJFskMCAtIDJdLCBibG9ja1BhcmFtczogJCRbJDAgLSAxXSwgc3RyaXA6IHl5LnN0cmlwRmxhZ3MoJCRbJDAgLSA1XSwgJCRbJDBdKSB9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHN0cmlwOiB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gMV0sICQkWyQwIC0gMV0pLCBwcm9ncmFtOiAkJFskMF0gfTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgICAgICAgICAgdmFyIGludmVyc2UgPSB5eS5wcmVwYXJlQmxvY2soJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDBdLCAkJFskMF0sIGZhbHNlLCB0aGlzLl8kKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0gPSBuZXcgeXkuUHJvZ3JhbShbaW52ZXJzZV0sIG51bGwsIHt9LCB5eS5sb2NJbmZvKHRoaXMuXyQpKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbS5jaGFpbmVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB7IHN0cmlwOiAkJFskMCAtIDJdLnN0cmlwLCBwcm9ncmFtOiBwcm9ncmFtLCBjaGFpbjogdHJ1ZSB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0geyBwYXRoOiAkJFskMCAtIDFdLCBzdHJpcDogeXkuc3RyaXBGbGFncygkJFskMCAtIDJdLCAkJFskMF0pIH07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LnByZXBhcmVNdXN0YWNoZSgkJFskMCAtIDNdLCAkJFskMCAtIDJdLCAkJFskMCAtIDFdLCAkJFskMCAtIDRdLCB5eS5zdHJpcEZsYWdzKCQkWyQwIC0gNF0sICQkWyQwXSksIHRoaXMuXyQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlTXVzdGFjaGUoJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgJCRbJDAgLSA0XSwgeXkuc3RyaXBGbGFncygkJFskMCAtIDRdLCAkJFskMF0pLCB0aGlzLl8kKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyMzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gbmV3IHl5LlBhcnRpYWxTdGF0ZW1lbnQoJCRbJDAgLSAzXSwgJCRbJDAgLSAyXSwgJCRbJDAgLSAxXSwgeXkuc3RyaXBGbGFncygkJFskMCAtIDRdLCAkJFskMF0pLCB5eS5sb2NJbmZvKHRoaXMuXyQpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI1OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjY6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IG5ldyB5eS5TdWJFeHByZXNzaW9uKCQkWyQwIC0gM10sICQkWyQwIC0gMl0sICQkWyQwIC0gMV0sIHl5LmxvY0luZm8odGhpcy5fJCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBuZXcgeXkuSGFzaCgkJFskMF0sIHl5LmxvY0luZm8odGhpcy5fJCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI4OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBuZXcgeXkuSGFzaFBhaXIoeXkuaWQoJCRbJDAgLSAyXSksICQkWyQwXSwgeXkubG9jSW5mbyh0aGlzLl8kKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjk6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IHl5LmlkKCQkWyQwIC0gMV0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDMwOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSAkJFskMF07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzE6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gbmV3IHl5LlN0cmluZ0xpdGVyYWwoJCRbJDBdLCB5eS5sb2NJbmZvKHRoaXMuXyQpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzMzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gbmV3IHl5Lk51bWJlckxpdGVyYWwoJCRbJDBdLCB5eS5sb2NJbmZvKHRoaXMuXyQpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzNDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gbmV3IHl5LkJvb2xlYW5MaXRlcmFsKCQkWyQwXSwgeXkubG9jSW5mbyh0aGlzLl8kKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IG5ldyB5eS5VbmRlZmluZWRMaXRlcmFsKHl5LmxvY0luZm8odGhpcy5fJCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM2OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBuZXcgeXkuTnVsbExpdGVyYWwoeXkubG9jSW5mbyh0aGlzLl8kKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9ICQkWyQwXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzODpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gJCRbJDBdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM5OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aCh0cnVlLCAkJFskMF0sIHRoaXMuXyQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQwOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSB5eS5wcmVwYXJlUGF0aChmYWxzZSwgJCRbJDBdLCB0aGlzLl8kKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0MTpcbiAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAyXS5wdXNoKHsgcGFydDogeXkuaWQoJCRbJDBdKSwgb3JpZ2luYWw6ICQkWyQwXSwgc2VwYXJhdG9yOiAkJFskMCAtIDFdIH0pO3RoaXMuJCA9ICQkWyQwIC0gMl07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFt7IHBhcnQ6IHl5LmlkKCQkWyQwXSksIG9yaWdpbmFsOiAkJFskMF0gfV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDM6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ0OlxuICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0NTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDY6XG4gICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDUzOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1NDpcbiAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTk6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDYwOlxuICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2NTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjY6XG4gICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDczOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA3NDpcbiAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNzc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc4OlxuICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4MTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gW107XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgODI6XG4gICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDg1OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4NjpcbiAgICAgICAgICAgICAgICAgICAgJCRbJDAgLSAxXS5wdXNoKCQkWyQwXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgODk6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCA9IFskJFskMF1dO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDkwOlxuICAgICAgICAgICAgICAgICAgICAkJFskMCAtIDFdLnB1c2goJCRbJDBdKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA5MTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kID0gWyQkWyQwXV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgOTI6XG4gICAgICAgICAgICAgICAgICAgICQkWyQwIC0gMV0ucHVzaCgkJFskMF0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdGFibGU6IFt7IDM6IDEsIDQ6IDIsIDU6IFsyLCA0M10sIDY6IDMsIDEzOiBbMiwgNDNdLCAxNDogWzIsIDQzXSwgMTc6IFsyLCA0M10sIDI3OiBbMiwgNDNdLCAzMjogWzIsIDQzXSwgNDY6IFsyLCA0M10sIDQ5OiBbMiwgNDNdLCA1MzogWzIsIDQzXSB9LCB7IDE6IFszXSB9LCB7IDU6IFsxLCA0XSB9LCB7IDU6IFsyLCAyXSwgNzogNSwgODogNiwgOTogNywgMTA6IDgsIDExOiA5LCAxMjogMTAsIDEzOiBbMSwgMTFdLCAxNDogWzEsIDE4XSwgMTU6IDE2LCAxNzogWzEsIDIxXSwgMjI6IDE0LCAyNTogMTUsIDI3OiBbMSwgMTldLCAzMjogWzEsIDIwXSwgMzc6IFsyLCAyXSwgNDI6IFsyLCAyXSwgNDU6IFsyLCAyXSwgNDY6IFsxLCAxMl0sIDQ5OiBbMSwgMTNdLCA1MzogWzEsIDE3XSB9LCB7IDE6IFsyLCAxXSB9LCB7IDU6IFsyLCA0NF0sIDEzOiBbMiwgNDRdLCAxNDogWzIsIDQ0XSwgMTc6IFsyLCA0NF0sIDI3OiBbMiwgNDRdLCAzMjogWzIsIDQ0XSwgMzc6IFsyLCA0NF0sIDQyOiBbMiwgNDRdLCA0NTogWzIsIDQ0XSwgNDY6IFsyLCA0NF0sIDQ5OiBbMiwgNDRdLCA1MzogWzIsIDQ0XSB9LCB7IDU6IFsyLCAzXSwgMTM6IFsyLCAzXSwgMTQ6IFsyLCAzXSwgMTc6IFsyLCAzXSwgMjc6IFsyLCAzXSwgMzI6IFsyLCAzXSwgMzc6IFsyLCAzXSwgNDI6IFsyLCAzXSwgNDU6IFsyLCAzXSwgNDY6IFsyLCAzXSwgNDk6IFsyLCAzXSwgNTM6IFsyLCAzXSB9LCB7IDU6IFsyLCA0XSwgMTM6IFsyLCA0XSwgMTQ6IFsyLCA0XSwgMTc6IFsyLCA0XSwgMjc6IFsyLCA0XSwgMzI6IFsyLCA0XSwgMzc6IFsyLCA0XSwgNDI6IFsyLCA0XSwgNDU6IFsyLCA0XSwgNDY6IFsyLCA0XSwgNDk6IFsyLCA0XSwgNTM6IFsyLCA0XSB9LCB7IDU6IFsyLCA1XSwgMTM6IFsyLCA1XSwgMTQ6IFsyLCA1XSwgMTc6IFsyLCA1XSwgMjc6IFsyLCA1XSwgMzI6IFsyLCA1XSwgMzc6IFsyLCA1XSwgNDI6IFsyLCA1XSwgNDU6IFsyLCA1XSwgNDY6IFsyLCA1XSwgNDk6IFsyLCA1XSwgNTM6IFsyLCA1XSB9LCB7IDU6IFsyLCA2XSwgMTM6IFsyLCA2XSwgMTQ6IFsyLCA2XSwgMTc6IFsyLCA2XSwgMjc6IFsyLCA2XSwgMzI6IFsyLCA2XSwgMzc6IFsyLCA2XSwgNDI6IFsyLCA2XSwgNDU6IFsyLCA2XSwgNDY6IFsyLCA2XSwgNDk6IFsyLCA2XSwgNTM6IFsyLCA2XSB9LCB7IDU6IFsyLCA3XSwgMTM6IFsyLCA3XSwgMTQ6IFsyLCA3XSwgMTc6IFsyLCA3XSwgMjc6IFsyLCA3XSwgMzI6IFsyLCA3XSwgMzc6IFsyLCA3XSwgNDI6IFsyLCA3XSwgNDU6IFsyLCA3XSwgNDY6IFsyLCA3XSwgNDk6IFsyLCA3XSwgNTM6IFsyLCA3XSB9LCB7IDU6IFsyLCA4XSwgMTM6IFsyLCA4XSwgMTQ6IFsyLCA4XSwgMTc6IFsyLCA4XSwgMjc6IFsyLCA4XSwgMzI6IFsyLCA4XSwgMzc6IFsyLCA4XSwgNDI6IFsyLCA4XSwgNDU6IFsyLCA4XSwgNDY6IFsyLCA4XSwgNDk6IFsyLCA4XSwgNTM6IFsyLCA4XSB9LCB7IDE4OiAyMiwgNjY6IFsxLCAzMl0sIDcyOiAyMywgNzM6IDI0LCA3NDogWzEsIDI1XSwgNzU6IFsxLCAyNl0sIDc2OiBbMSwgMjddLCA3NzogWzEsIDI4XSwgNzg6IFsxLCAyOV0sIDc5OiBbMSwgMzFdLCA4MDogMzAgfSwgeyAxODogMzMsIDY2OiBbMSwgMzJdLCA3MjogMjMsIDczOiAyNCwgNzQ6IFsxLCAyNV0sIDc1OiBbMSwgMjZdLCA3NjogWzEsIDI3XSwgNzc6IFsxLCAyOF0sIDc4OiBbMSwgMjldLCA3OTogWzEsIDMxXSwgODA6IDMwIH0sIHsgNDogMzQsIDY6IDMsIDEzOiBbMiwgNDNdLCAxNDogWzIsIDQzXSwgMTc6IFsyLCA0M10sIDI3OiBbMiwgNDNdLCAzMjogWzIsIDQzXSwgMzc6IFsyLCA0M10sIDQyOiBbMiwgNDNdLCA0NTogWzIsIDQzXSwgNDY6IFsyLCA0M10sIDQ5OiBbMiwgNDNdLCA1MzogWzIsIDQzXSB9LCB7IDQ6IDM1LCA2OiAzLCAxMzogWzIsIDQzXSwgMTQ6IFsyLCA0M10sIDE3OiBbMiwgNDNdLCAyNzogWzIsIDQzXSwgMzI6IFsyLCA0M10sIDQyOiBbMiwgNDNdLCA0NTogWzIsIDQzXSwgNDY6IFsyLCA0M10sIDQ5OiBbMiwgNDNdLCA1MzogWzIsIDQzXSB9LCB7IDEyOiAzNiwgMTQ6IFsxLCAxOF0gfSwgeyAxODogMzgsIDU0OiAzNywgNTg6IDM5LCA1OTogWzEsIDQwXSwgNjY6IFsxLCAzMl0sIDcyOiAyMywgNzM6IDI0LCA3NDogWzEsIDI1XSwgNzU6IFsxLCAyNl0sIDc2OiBbMSwgMjddLCA3NzogWzEsIDI4XSwgNzg6IFsxLCAyOV0sIDc5OiBbMSwgMzFdLCA4MDogMzAgfSwgeyA1OiBbMiwgOV0sIDEzOiBbMiwgOV0sIDE0OiBbMiwgOV0sIDE2OiBbMiwgOV0sIDE3OiBbMiwgOV0sIDI3OiBbMiwgOV0sIDMyOiBbMiwgOV0sIDM3OiBbMiwgOV0sIDQyOiBbMiwgOV0sIDQ1OiBbMiwgOV0sIDQ2OiBbMiwgOV0sIDQ5OiBbMiwgOV0sIDUzOiBbMiwgOV0gfSwgeyAxODogNDEsIDY2OiBbMSwgMzJdLCA3MjogMjMsIDczOiAyNCwgNzQ6IFsxLCAyNV0sIDc1OiBbMSwgMjZdLCA3NjogWzEsIDI3XSwgNzc6IFsxLCAyOF0sIDc4OiBbMSwgMjldLCA3OTogWzEsIDMxXSwgODA6IDMwIH0sIHsgMTg6IDQyLCA2NjogWzEsIDMyXSwgNzI6IDIzLCA3MzogMjQsIDc0OiBbMSwgMjVdLCA3NTogWzEsIDI2XSwgNzY6IFsxLCAyN10sIDc3OiBbMSwgMjhdLCA3ODogWzEsIDI5XSwgNzk6IFsxLCAzMV0sIDgwOiAzMCB9LCB7IDE4OiA0MywgNjY6IFsxLCAzMl0sIDcyOiAyMywgNzM6IDI0LCA3NDogWzEsIDI1XSwgNzU6IFsxLCAyNl0sIDc2OiBbMSwgMjddLCA3NzogWzEsIDI4XSwgNzg6IFsxLCAyOV0sIDc5OiBbMSwgMzFdLCA4MDogMzAgfSwgeyAzMTogWzIsIDczXSwgNDc6IDQ0LCA1OTogWzIsIDczXSwgNjY6IFsyLCA3M10sIDc0OiBbMiwgNzNdLCA3NTogWzIsIDczXSwgNzY6IFsyLCA3M10sIDc3OiBbMiwgNzNdLCA3ODogWzIsIDczXSwgNzk6IFsyLCA3M10gfSwgeyAyMTogWzIsIDMwXSwgMzE6IFsyLCAzMF0sIDUyOiBbMiwgMzBdLCA1OTogWzIsIDMwXSwgNjI6IFsyLCAzMF0sIDY2OiBbMiwgMzBdLCA2OTogWzIsIDMwXSwgNzQ6IFsyLCAzMF0sIDc1OiBbMiwgMzBdLCA3NjogWzIsIDMwXSwgNzc6IFsyLCAzMF0sIDc4OiBbMiwgMzBdLCA3OTogWzIsIDMwXSB9LCB7IDIxOiBbMiwgMzFdLCAzMTogWzIsIDMxXSwgNTI6IFsyLCAzMV0sIDU5OiBbMiwgMzFdLCA2MjogWzIsIDMxXSwgNjY6IFsyLCAzMV0sIDY5OiBbMiwgMzFdLCA3NDogWzIsIDMxXSwgNzU6IFsyLCAzMV0sIDc2OiBbMiwgMzFdLCA3NzogWzIsIDMxXSwgNzg6IFsyLCAzMV0sIDc5OiBbMiwgMzFdIH0sIHsgMjE6IFsyLCAzMl0sIDMxOiBbMiwgMzJdLCA1MjogWzIsIDMyXSwgNTk6IFsyLCAzMl0sIDYyOiBbMiwgMzJdLCA2NjogWzIsIDMyXSwgNjk6IFsyLCAzMl0sIDc0OiBbMiwgMzJdLCA3NTogWzIsIDMyXSwgNzY6IFsyLCAzMl0sIDc3OiBbMiwgMzJdLCA3ODogWzIsIDMyXSwgNzk6IFsyLCAzMl0gfSwgeyAyMTogWzIsIDMzXSwgMzE6IFsyLCAzM10sIDUyOiBbMiwgMzNdLCA1OTogWzIsIDMzXSwgNjI6IFsyLCAzM10sIDY2OiBbMiwgMzNdLCA2OTogWzIsIDMzXSwgNzQ6IFsyLCAzM10sIDc1OiBbMiwgMzNdLCA3NjogWzIsIDMzXSwgNzc6IFsyLCAzM10sIDc4OiBbMiwgMzNdLCA3OTogWzIsIDMzXSB9LCB7IDIxOiBbMiwgMzRdLCAzMTogWzIsIDM0XSwgNTI6IFsyLCAzNF0sIDU5OiBbMiwgMzRdLCA2MjogWzIsIDM0XSwgNjY6IFsyLCAzNF0sIDY5OiBbMiwgMzRdLCA3NDogWzIsIDM0XSwgNzU6IFsyLCAzNF0sIDc2OiBbMiwgMzRdLCA3NzogWzIsIDM0XSwgNzg6IFsyLCAzNF0sIDc5OiBbMiwgMzRdIH0sIHsgMjE6IFsyLCAzNV0sIDMxOiBbMiwgMzVdLCA1MjogWzIsIDM1XSwgNTk6IFsyLCAzNV0sIDYyOiBbMiwgMzVdLCA2NjogWzIsIDM1XSwgNjk6IFsyLCAzNV0sIDc0OiBbMiwgMzVdLCA3NTogWzIsIDM1XSwgNzY6IFsyLCAzNV0sIDc3OiBbMiwgMzVdLCA3ODogWzIsIDM1XSwgNzk6IFsyLCAzNV0gfSwgeyAyMTogWzIsIDM2XSwgMzE6IFsyLCAzNl0sIDUyOiBbMiwgMzZdLCA1OTogWzIsIDM2XSwgNjI6IFsyLCAzNl0sIDY2OiBbMiwgMzZdLCA2OTogWzIsIDM2XSwgNzQ6IFsyLCAzNl0sIDc1OiBbMiwgMzZdLCA3NjogWzIsIDM2XSwgNzc6IFsyLCAzNl0sIDc4OiBbMiwgMzZdLCA3OTogWzIsIDM2XSB9LCB7IDIxOiBbMiwgNDBdLCAzMTogWzIsIDQwXSwgNTI6IFsyLCA0MF0sIDU5OiBbMiwgNDBdLCA2MjogWzIsIDQwXSwgNjY6IFsyLCA0MF0sIDY5OiBbMiwgNDBdLCA3NDogWzIsIDQwXSwgNzU6IFsyLCA0MF0sIDc2OiBbMiwgNDBdLCA3NzogWzIsIDQwXSwgNzg6IFsyLCA0MF0sIDc5OiBbMiwgNDBdLCA4MTogWzEsIDQ1XSB9LCB7IDY2OiBbMSwgMzJdLCA4MDogNDYgfSwgeyAyMTogWzIsIDQyXSwgMzE6IFsyLCA0Ml0sIDUyOiBbMiwgNDJdLCA1OTogWzIsIDQyXSwgNjI6IFsyLCA0Ml0sIDY2OiBbMiwgNDJdLCA2OTogWzIsIDQyXSwgNzQ6IFsyLCA0Ml0sIDc1OiBbMiwgNDJdLCA3NjogWzIsIDQyXSwgNzc6IFsyLCA0Ml0sIDc4OiBbMiwgNDJdLCA3OTogWzIsIDQyXSwgODE6IFsyLCA0Ml0gfSwgeyA1MDogNDcsIDUyOiBbMiwgNzddLCA1OTogWzIsIDc3XSwgNjY6IFsyLCA3N10sIDc0OiBbMiwgNzddLCA3NTogWzIsIDc3XSwgNzY6IFsyLCA3N10sIDc3OiBbMiwgNzddLCA3ODogWzIsIDc3XSwgNzk6IFsyLCA3N10gfSwgeyAyMzogNDgsIDM2OiA1MCwgMzc6IFsxLCA1Ml0sIDQxOiA1MSwgNDI6IFsxLCA1M10sIDQzOiA0OSwgNDU6IFsyLCA0OV0gfSwgeyAyNjogNTQsIDQxOiA1NSwgNDI6IFsxLCA1M10sIDQ1OiBbMiwgNTFdIH0sIHsgMTY6IFsxLCA1Nl0gfSwgeyAzMTogWzIsIDgxXSwgNTU6IDU3LCA1OTogWzIsIDgxXSwgNjY6IFsyLCA4MV0sIDc0OiBbMiwgODFdLCA3NTogWzIsIDgxXSwgNzY6IFsyLCA4MV0sIDc3OiBbMiwgODFdLCA3ODogWzIsIDgxXSwgNzk6IFsyLCA4MV0gfSwgeyAzMTogWzIsIDM3XSwgNTk6IFsyLCAzN10sIDY2OiBbMiwgMzddLCA3NDogWzIsIDM3XSwgNzU6IFsyLCAzN10sIDc2OiBbMiwgMzddLCA3NzogWzIsIDM3XSwgNzg6IFsyLCAzN10sIDc5OiBbMiwgMzddIH0sIHsgMzE6IFsyLCAzOF0sIDU5OiBbMiwgMzhdLCA2NjogWzIsIDM4XSwgNzQ6IFsyLCAzOF0sIDc1OiBbMiwgMzhdLCA3NjogWzIsIDM4XSwgNzc6IFsyLCAzOF0sIDc4OiBbMiwgMzhdLCA3OTogWzIsIDM4XSB9LCB7IDE4OiA1OCwgNjY6IFsxLCAzMl0sIDcyOiAyMywgNzM6IDI0LCA3NDogWzEsIDI1XSwgNzU6IFsxLCAyNl0sIDc2OiBbMSwgMjddLCA3NzogWzEsIDI4XSwgNzg6IFsxLCAyOV0sIDc5OiBbMSwgMzFdLCA4MDogMzAgfSwgeyAyODogNTksIDMxOiBbMiwgNTNdLCA1OTogWzIsIDUzXSwgNjY6IFsyLCA1M10sIDY5OiBbMiwgNTNdLCA3NDogWzIsIDUzXSwgNzU6IFsyLCA1M10sIDc2OiBbMiwgNTNdLCA3NzogWzIsIDUzXSwgNzg6IFsyLCA1M10sIDc5OiBbMiwgNTNdIH0sIHsgMzE6IFsyLCA1OV0sIDMzOiA2MCwgNTk6IFsyLCA1OV0sIDY2OiBbMiwgNTldLCA2OTogWzIsIDU5XSwgNzQ6IFsyLCA1OV0sIDc1OiBbMiwgNTldLCA3NjogWzIsIDU5XSwgNzc6IFsyLCA1OV0sIDc4OiBbMiwgNTldLCA3OTogWzIsIDU5XSB9LCB7IDE5OiA2MSwgMjE6IFsyLCA0NV0sIDU5OiBbMiwgNDVdLCA2NjogWzIsIDQ1XSwgNzQ6IFsyLCA0NV0sIDc1OiBbMiwgNDVdLCA3NjogWzIsIDQ1XSwgNzc6IFsyLCA0NV0sIDc4OiBbMiwgNDVdLCA3OTogWzIsIDQ1XSB9LCB7IDE4OiA2NSwgMzE6IFsyLCA3NV0sIDQ4OiA2MiwgNTc6IDYzLCA1ODogNjYsIDU5OiBbMSwgNDBdLCA2MzogNjQsIDY0OiA2NywgNjU6IDY4LCA2NjogWzEsIDY5XSwgNzI6IDIzLCA3MzogMjQsIDc0OiBbMSwgMjVdLCA3NTogWzEsIDI2XSwgNzY6IFsxLCAyN10sIDc3OiBbMSwgMjhdLCA3ODogWzEsIDI5XSwgNzk6IFsxLCAzMV0sIDgwOiAzMCB9LCB7IDY2OiBbMSwgNzBdIH0sIHsgMjE6IFsyLCAzOV0sIDMxOiBbMiwgMzldLCA1MjogWzIsIDM5XSwgNTk6IFsyLCAzOV0sIDYyOiBbMiwgMzldLCA2NjogWzIsIDM5XSwgNjk6IFsyLCAzOV0sIDc0OiBbMiwgMzldLCA3NTogWzIsIDM5XSwgNzY6IFsyLCAzOV0sIDc3OiBbMiwgMzldLCA3ODogWzIsIDM5XSwgNzk6IFsyLCAzOV0sIDgxOiBbMSwgNDVdIH0sIHsgMTg6IDY1LCA1MTogNzEsIDUyOiBbMiwgNzldLCA1NzogNzIsIDU4OiA2NiwgNTk6IFsxLCA0MF0sIDYzOiA3MywgNjQ6IDY3LCA2NTogNjgsIDY2OiBbMSwgNjldLCA3MjogMjMsIDczOiAyNCwgNzQ6IFsxLCAyNV0sIDc1OiBbMSwgMjZdLCA3NjogWzEsIDI3XSwgNzc6IFsxLCAyOF0sIDc4OiBbMSwgMjldLCA3OTogWzEsIDMxXSwgODA6IDMwIH0sIHsgMjQ6IDc0LCA0NTogWzEsIDc1XSB9LCB7IDQ1OiBbMiwgNTBdIH0sIHsgNDogNzYsIDY6IDMsIDEzOiBbMiwgNDNdLCAxNDogWzIsIDQzXSwgMTc6IFsyLCA0M10sIDI3OiBbMiwgNDNdLCAzMjogWzIsIDQzXSwgMzc6IFsyLCA0M10sIDQyOiBbMiwgNDNdLCA0NTogWzIsIDQzXSwgNDY6IFsyLCA0M10sIDQ5OiBbMiwgNDNdLCA1MzogWzIsIDQzXSB9LCB7IDQ1OiBbMiwgMTldIH0sIHsgMTg6IDc3LCA2NjogWzEsIDMyXSwgNzI6IDIzLCA3MzogMjQsIDc0OiBbMSwgMjVdLCA3NTogWzEsIDI2XSwgNzY6IFsxLCAyN10sIDc3OiBbMSwgMjhdLCA3ODogWzEsIDI5XSwgNzk6IFsxLCAzMV0sIDgwOiAzMCB9LCB7IDQ6IDc4LCA2OiAzLCAxMzogWzIsIDQzXSwgMTQ6IFsyLCA0M10sIDE3OiBbMiwgNDNdLCAyNzogWzIsIDQzXSwgMzI6IFsyLCA0M10sIDQ1OiBbMiwgNDNdLCA0NjogWzIsIDQzXSwgNDk6IFsyLCA0M10sIDUzOiBbMiwgNDNdIH0sIHsgMjQ6IDc5LCA0NTogWzEsIDc1XSB9LCB7IDQ1OiBbMiwgNTJdIH0sIHsgNTogWzIsIDEwXSwgMTM6IFsyLCAxMF0sIDE0OiBbMiwgMTBdLCAxNzogWzIsIDEwXSwgMjc6IFsyLCAxMF0sIDMyOiBbMiwgMTBdLCAzNzogWzIsIDEwXSwgNDI6IFsyLCAxMF0sIDQ1OiBbMiwgMTBdLCA0NjogWzIsIDEwXSwgNDk6IFsyLCAxMF0sIDUzOiBbMiwgMTBdIH0sIHsgMTg6IDY1LCAzMTogWzIsIDgzXSwgNTY6IDgwLCA1NzogODEsIDU4OiA2NiwgNTk6IFsxLCA0MF0sIDYzOiA4MiwgNjQ6IDY3LCA2NTogNjgsIDY2OiBbMSwgNjldLCA3MjogMjMsIDczOiAyNCwgNzQ6IFsxLCAyNV0sIDc1OiBbMSwgMjZdLCA3NjogWzEsIDI3XSwgNzc6IFsxLCAyOF0sIDc4OiBbMSwgMjldLCA3OTogWzEsIDMxXSwgODA6IDMwIH0sIHsgNTk6IFsyLCA4NV0sIDYwOiA4MywgNjI6IFsyLCA4NV0sIDY2OiBbMiwgODVdLCA3NDogWzIsIDg1XSwgNzU6IFsyLCA4NV0sIDc2OiBbMiwgODVdLCA3NzogWzIsIDg1XSwgNzg6IFsyLCA4NV0sIDc5OiBbMiwgODVdIH0sIHsgMTg6IDY1LCAyOTogODQsIDMxOiBbMiwgNTVdLCA1NzogODUsIDU4OiA2NiwgNTk6IFsxLCA0MF0sIDYzOiA4NiwgNjQ6IDY3LCA2NTogNjgsIDY2OiBbMSwgNjldLCA2OTogWzIsIDU1XSwgNzI6IDIzLCA3MzogMjQsIDc0OiBbMSwgMjVdLCA3NTogWzEsIDI2XSwgNzY6IFsxLCAyN10sIDc3OiBbMSwgMjhdLCA3ODogWzEsIDI5XSwgNzk6IFsxLCAzMV0sIDgwOiAzMCB9LCB7IDE4OiA2NSwgMzE6IFsyLCA2MV0sIDM0OiA4NywgNTc6IDg4LCA1ODogNjYsIDU5OiBbMSwgNDBdLCA2MzogODksIDY0OiA2NywgNjU6IDY4LCA2NjogWzEsIDY5XSwgNjk6IFsyLCA2MV0sIDcyOiAyMywgNzM6IDI0LCA3NDogWzEsIDI1XSwgNzU6IFsxLCAyNl0sIDc2OiBbMSwgMjddLCA3NzogWzEsIDI4XSwgNzg6IFsxLCAyOV0sIDc5OiBbMSwgMzFdLCA4MDogMzAgfSwgeyAxODogNjUsIDIwOiA5MCwgMjE6IFsyLCA0N10sIDU3OiA5MSwgNTg6IDY2LCA1OTogWzEsIDQwXSwgNjM6IDkyLCA2NDogNjcsIDY1OiA2OCwgNjY6IFsxLCA2OV0sIDcyOiAyMywgNzM6IDI0LCA3NDogWzEsIDI1XSwgNzU6IFsxLCAyNl0sIDc2OiBbMSwgMjddLCA3NzogWzEsIDI4XSwgNzg6IFsxLCAyOV0sIDc5OiBbMSwgMzFdLCA4MDogMzAgfSwgeyAzMTogWzEsIDkzXSB9LCB7IDMxOiBbMiwgNzRdLCA1OTogWzIsIDc0XSwgNjY6IFsyLCA3NF0sIDc0OiBbMiwgNzRdLCA3NTogWzIsIDc0XSwgNzY6IFsyLCA3NF0sIDc3OiBbMiwgNzRdLCA3ODogWzIsIDc0XSwgNzk6IFsyLCA3NF0gfSwgeyAzMTogWzIsIDc2XSB9LCB7IDIxOiBbMiwgMjRdLCAzMTogWzIsIDI0XSwgNTI6IFsyLCAyNF0sIDU5OiBbMiwgMjRdLCA2MjogWzIsIDI0XSwgNjY6IFsyLCAyNF0sIDY5OiBbMiwgMjRdLCA3NDogWzIsIDI0XSwgNzU6IFsyLCAyNF0sIDc2OiBbMiwgMjRdLCA3NzogWzIsIDI0XSwgNzg6IFsyLCAyNF0sIDc5OiBbMiwgMjRdIH0sIHsgMjE6IFsyLCAyNV0sIDMxOiBbMiwgMjVdLCA1MjogWzIsIDI1XSwgNTk6IFsyLCAyNV0sIDYyOiBbMiwgMjVdLCA2NjogWzIsIDI1XSwgNjk6IFsyLCAyNV0sIDc0OiBbMiwgMjVdLCA3NTogWzIsIDI1XSwgNzY6IFsyLCAyNV0sIDc3OiBbMiwgMjVdLCA3ODogWzIsIDI1XSwgNzk6IFsyLCAyNV0gfSwgeyAyMTogWzIsIDI3XSwgMzE6IFsyLCAyN10sIDUyOiBbMiwgMjddLCA2MjogWzIsIDI3XSwgNjU6IDk0LCA2NjogWzEsIDk1XSwgNjk6IFsyLCAyN10gfSwgeyAyMTogWzIsIDg5XSwgMzE6IFsyLCA4OV0sIDUyOiBbMiwgODldLCA2MjogWzIsIDg5XSwgNjY6IFsyLCA4OV0sIDY5OiBbMiwgODldIH0sIHsgMjE6IFsyLCA0Ml0sIDMxOiBbMiwgNDJdLCA1MjogWzIsIDQyXSwgNTk6IFsyLCA0Ml0sIDYyOiBbMiwgNDJdLCA2NjogWzIsIDQyXSwgNjc6IFsxLCA5Nl0sIDY5OiBbMiwgNDJdLCA3NDogWzIsIDQyXSwgNzU6IFsyLCA0Ml0sIDc2OiBbMiwgNDJdLCA3NzogWzIsIDQyXSwgNzg6IFsyLCA0Ml0sIDc5OiBbMiwgNDJdLCA4MTogWzIsIDQyXSB9LCB7IDIxOiBbMiwgNDFdLCAzMTogWzIsIDQxXSwgNTI6IFsyLCA0MV0sIDU5OiBbMiwgNDFdLCA2MjogWzIsIDQxXSwgNjY6IFsyLCA0MV0sIDY5OiBbMiwgNDFdLCA3NDogWzIsIDQxXSwgNzU6IFsyLCA0MV0sIDc2OiBbMiwgNDFdLCA3NzogWzIsIDQxXSwgNzg6IFsyLCA0MV0sIDc5OiBbMiwgNDFdLCA4MTogWzIsIDQxXSB9LCB7IDUyOiBbMSwgOTddIH0sIHsgNTI6IFsyLCA3OF0sIDU5OiBbMiwgNzhdLCA2NjogWzIsIDc4XSwgNzQ6IFsyLCA3OF0sIDc1OiBbMiwgNzhdLCA3NjogWzIsIDc4XSwgNzc6IFsyLCA3OF0sIDc4OiBbMiwgNzhdLCA3OTogWzIsIDc4XSB9LCB7IDUyOiBbMiwgODBdIH0sIHsgNTogWzIsIDEyXSwgMTM6IFsyLCAxMl0sIDE0OiBbMiwgMTJdLCAxNzogWzIsIDEyXSwgMjc6IFsyLCAxMl0sIDMyOiBbMiwgMTJdLCAzNzogWzIsIDEyXSwgNDI6IFsyLCAxMl0sIDQ1OiBbMiwgMTJdLCA0NjogWzIsIDEyXSwgNDk6IFsyLCAxMl0sIDUzOiBbMiwgMTJdIH0sIHsgMTg6IDk4LCA2NjogWzEsIDMyXSwgNzI6IDIzLCA3MzogMjQsIDc0OiBbMSwgMjVdLCA3NTogWzEsIDI2XSwgNzY6IFsxLCAyN10sIDc3OiBbMSwgMjhdLCA3ODogWzEsIDI5XSwgNzk6IFsxLCAzMV0sIDgwOiAzMCB9LCB7IDM2OiA1MCwgMzc6IFsxLCA1Ml0sIDQxOiA1MSwgNDI6IFsxLCA1M10sIDQzOiAxMDAsIDQ0OiA5OSwgNDU6IFsyLCA3MV0gfSwgeyAzMTogWzIsIDY1XSwgMzg6IDEwMSwgNTk6IFsyLCA2NV0sIDY2OiBbMiwgNjVdLCA2OTogWzIsIDY1XSwgNzQ6IFsyLCA2NV0sIDc1OiBbMiwgNjVdLCA3NjogWzIsIDY1XSwgNzc6IFsyLCA2NV0sIDc4OiBbMiwgNjVdLCA3OTogWzIsIDY1XSB9LCB7IDQ1OiBbMiwgMTddIH0sIHsgNTogWzIsIDEzXSwgMTM6IFsyLCAxM10sIDE0OiBbMiwgMTNdLCAxNzogWzIsIDEzXSwgMjc6IFsyLCAxM10sIDMyOiBbMiwgMTNdLCAzNzogWzIsIDEzXSwgNDI6IFsyLCAxM10sIDQ1OiBbMiwgMTNdLCA0NjogWzIsIDEzXSwgNDk6IFsyLCAxM10sIDUzOiBbMiwgMTNdIH0sIHsgMzE6IFsxLCAxMDJdIH0sIHsgMzE6IFsyLCA4Ml0sIDU5OiBbMiwgODJdLCA2NjogWzIsIDgyXSwgNzQ6IFsyLCA4Ml0sIDc1OiBbMiwgODJdLCA3NjogWzIsIDgyXSwgNzc6IFsyLCA4Ml0sIDc4OiBbMiwgODJdLCA3OTogWzIsIDgyXSB9LCB7IDMxOiBbMiwgODRdIH0sIHsgMTg6IDY1LCA1NzogMTA0LCA1ODogNjYsIDU5OiBbMSwgNDBdLCA2MTogMTAzLCA2MjogWzIsIDg3XSwgNjM6IDEwNSwgNjQ6IDY3LCA2NTogNjgsIDY2OiBbMSwgNjldLCA3MjogMjMsIDczOiAyNCwgNzQ6IFsxLCAyNV0sIDc1OiBbMSwgMjZdLCA3NjogWzEsIDI3XSwgNzc6IFsxLCAyOF0sIDc4OiBbMSwgMjldLCA3OTogWzEsIDMxXSwgODA6IDMwIH0sIHsgMzA6IDEwNiwgMzE6IFsyLCA1N10sIDY4OiAxMDcsIDY5OiBbMSwgMTA4XSB9LCB7IDMxOiBbMiwgNTRdLCA1OTogWzIsIDU0XSwgNjY6IFsyLCA1NF0sIDY5OiBbMiwgNTRdLCA3NDogWzIsIDU0XSwgNzU6IFsyLCA1NF0sIDc2OiBbMiwgNTRdLCA3NzogWzIsIDU0XSwgNzg6IFsyLCA1NF0sIDc5OiBbMiwgNTRdIH0sIHsgMzE6IFsyLCA1Nl0sIDY5OiBbMiwgNTZdIH0sIHsgMzE6IFsyLCA2M10sIDM1OiAxMDksIDY4OiAxMTAsIDY5OiBbMSwgMTA4XSB9LCB7IDMxOiBbMiwgNjBdLCA1OTogWzIsIDYwXSwgNjY6IFsyLCA2MF0sIDY5OiBbMiwgNjBdLCA3NDogWzIsIDYwXSwgNzU6IFsyLCA2MF0sIDc2OiBbMiwgNjBdLCA3NzogWzIsIDYwXSwgNzg6IFsyLCA2MF0sIDc5OiBbMiwgNjBdIH0sIHsgMzE6IFsyLCA2Ml0sIDY5OiBbMiwgNjJdIH0sIHsgMjE6IFsxLCAxMTFdIH0sIHsgMjE6IFsyLCA0Nl0sIDU5OiBbMiwgNDZdLCA2NjogWzIsIDQ2XSwgNzQ6IFsyLCA0Nl0sIDc1OiBbMiwgNDZdLCA3NjogWzIsIDQ2XSwgNzc6IFsyLCA0Nl0sIDc4OiBbMiwgNDZdLCA3OTogWzIsIDQ2XSB9LCB7IDIxOiBbMiwgNDhdIH0sIHsgNTogWzIsIDIxXSwgMTM6IFsyLCAyMV0sIDE0OiBbMiwgMjFdLCAxNzogWzIsIDIxXSwgMjc6IFsyLCAyMV0sIDMyOiBbMiwgMjFdLCAzNzogWzIsIDIxXSwgNDI6IFsyLCAyMV0sIDQ1OiBbMiwgMjFdLCA0NjogWzIsIDIxXSwgNDk6IFsyLCAyMV0sIDUzOiBbMiwgMjFdIH0sIHsgMjE6IFsyLCA5MF0sIDMxOiBbMiwgOTBdLCA1MjogWzIsIDkwXSwgNjI6IFsyLCA5MF0sIDY2OiBbMiwgOTBdLCA2OTogWzIsIDkwXSB9LCB7IDY3OiBbMSwgOTZdIH0sIHsgMTg6IDY1LCA1NzogMTEyLCA1ODogNjYsIDU5OiBbMSwgNDBdLCA2NjogWzEsIDMyXSwgNzI6IDIzLCA3MzogMjQsIDc0OiBbMSwgMjVdLCA3NTogWzEsIDI2XSwgNzY6IFsxLCAyN10sIDc3OiBbMSwgMjhdLCA3ODogWzEsIDI5XSwgNzk6IFsxLCAzMV0sIDgwOiAzMCB9LCB7IDU6IFsyLCAyMl0sIDEzOiBbMiwgMjJdLCAxNDogWzIsIDIyXSwgMTc6IFsyLCAyMl0sIDI3OiBbMiwgMjJdLCAzMjogWzIsIDIyXSwgMzc6IFsyLCAyMl0sIDQyOiBbMiwgMjJdLCA0NTogWzIsIDIyXSwgNDY6IFsyLCAyMl0sIDQ5OiBbMiwgMjJdLCA1MzogWzIsIDIyXSB9LCB7IDMxOiBbMSwgMTEzXSB9LCB7IDQ1OiBbMiwgMThdIH0sIHsgNDU6IFsyLCA3Ml0gfSwgeyAxODogNjUsIDMxOiBbMiwgNjddLCAzOTogMTE0LCA1NzogMTE1LCA1ODogNjYsIDU5OiBbMSwgNDBdLCA2MzogMTE2LCA2NDogNjcsIDY1OiA2OCwgNjY6IFsxLCA2OV0sIDY5OiBbMiwgNjddLCA3MjogMjMsIDczOiAyNCwgNzQ6IFsxLCAyNV0sIDc1OiBbMSwgMjZdLCA3NjogWzEsIDI3XSwgNzc6IFsxLCAyOF0sIDc4OiBbMSwgMjldLCA3OTogWzEsIDMxXSwgODA6IDMwIH0sIHsgNTogWzIsIDIzXSwgMTM6IFsyLCAyM10sIDE0OiBbMiwgMjNdLCAxNzogWzIsIDIzXSwgMjc6IFsyLCAyM10sIDMyOiBbMiwgMjNdLCAzNzogWzIsIDIzXSwgNDI6IFsyLCAyM10sIDQ1OiBbMiwgMjNdLCA0NjogWzIsIDIzXSwgNDk6IFsyLCAyM10sIDUzOiBbMiwgMjNdIH0sIHsgNjI6IFsxLCAxMTddIH0sIHsgNTk6IFsyLCA4Nl0sIDYyOiBbMiwgODZdLCA2NjogWzIsIDg2XSwgNzQ6IFsyLCA4Nl0sIDc1OiBbMiwgODZdLCA3NjogWzIsIDg2XSwgNzc6IFsyLCA4Nl0sIDc4OiBbMiwgODZdLCA3OTogWzIsIDg2XSB9LCB7IDYyOiBbMiwgODhdIH0sIHsgMzE6IFsxLCAxMThdIH0sIHsgMzE6IFsyLCA1OF0gfSwgeyA2NjogWzEsIDEyMF0sIDcwOiAxMTkgfSwgeyAzMTogWzEsIDEyMV0gfSwgeyAzMTogWzIsIDY0XSB9LCB7IDE0OiBbMiwgMTFdIH0sIHsgMjE6IFsyLCAyOF0sIDMxOiBbMiwgMjhdLCA1MjogWzIsIDI4XSwgNjI6IFsyLCAyOF0sIDY2OiBbMiwgMjhdLCA2OTogWzIsIDI4XSB9LCB7IDU6IFsyLCAyMF0sIDEzOiBbMiwgMjBdLCAxNDogWzIsIDIwXSwgMTc6IFsyLCAyMF0sIDI3OiBbMiwgMjBdLCAzMjogWzIsIDIwXSwgMzc6IFsyLCAyMF0sIDQyOiBbMiwgMjBdLCA0NTogWzIsIDIwXSwgNDY6IFsyLCAyMF0sIDQ5OiBbMiwgMjBdLCA1MzogWzIsIDIwXSB9LCB7IDMxOiBbMiwgNjldLCA0MDogMTIyLCA2ODogMTIzLCA2OTogWzEsIDEwOF0gfSwgeyAzMTogWzIsIDY2XSwgNTk6IFsyLCA2Nl0sIDY2OiBbMiwgNjZdLCA2OTogWzIsIDY2XSwgNzQ6IFsyLCA2Nl0sIDc1OiBbMiwgNjZdLCA3NjogWzIsIDY2XSwgNzc6IFsyLCA2Nl0sIDc4OiBbMiwgNjZdLCA3OTogWzIsIDY2XSB9LCB7IDMxOiBbMiwgNjhdLCA2OTogWzIsIDY4XSB9LCB7IDIxOiBbMiwgMjZdLCAzMTogWzIsIDI2XSwgNTI6IFsyLCAyNl0sIDU5OiBbMiwgMjZdLCA2MjogWzIsIDI2XSwgNjY6IFsyLCAyNl0sIDY5OiBbMiwgMjZdLCA3NDogWzIsIDI2XSwgNzU6IFsyLCAyNl0sIDc2OiBbMiwgMjZdLCA3NzogWzIsIDI2XSwgNzg6IFsyLCAyNl0sIDc5OiBbMiwgMjZdIH0sIHsgMTM6IFsyLCAxNF0sIDE0OiBbMiwgMTRdLCAxNzogWzIsIDE0XSwgMjc6IFsyLCAxNF0sIDMyOiBbMiwgMTRdLCAzNzogWzIsIDE0XSwgNDI6IFsyLCAxNF0sIDQ1OiBbMiwgMTRdLCA0NjogWzIsIDE0XSwgNDk6IFsyLCAxNF0sIDUzOiBbMiwgMTRdIH0sIHsgNjY6IFsxLCAxMjVdLCA3MTogWzEsIDEyNF0gfSwgeyA2NjogWzIsIDkxXSwgNzE6IFsyLCA5MV0gfSwgeyAxMzogWzIsIDE1XSwgMTQ6IFsyLCAxNV0sIDE3OiBbMiwgMTVdLCAyNzogWzIsIDE1XSwgMzI6IFsyLCAxNV0sIDQyOiBbMiwgMTVdLCA0NTogWzIsIDE1XSwgNDY6IFsyLCAxNV0sIDQ5OiBbMiwgMTVdLCA1MzogWzIsIDE1XSB9LCB7IDMxOiBbMSwgMTI2XSB9LCB7IDMxOiBbMiwgNzBdIH0sIHsgMzE6IFsyLCAyOV0gfSwgeyA2NjogWzIsIDkyXSwgNzE6IFsyLCA5Ml0gfSwgeyAxMzogWzIsIDE2XSwgMTQ6IFsyLCAxNl0sIDE3OiBbMiwgMTZdLCAyNzogWzIsIDE2XSwgMzI6IFsyLCAxNl0sIDM3OiBbMiwgMTZdLCA0MjogWzIsIDE2XSwgNDU6IFsyLCAxNl0sIDQ2OiBbMiwgMTZdLCA0OTogWzIsIDE2XSwgNTM6IFsyLCAxNl0gfV0sXG4gICAgICAgIGRlZmF1bHRBY3Rpb25zOiB7IDQ6IFsyLCAxXSwgNDk6IFsyLCA1MF0sIDUxOiBbMiwgMTldLCA1NTogWzIsIDUyXSwgNjQ6IFsyLCA3Nl0sIDczOiBbMiwgODBdLCA3ODogWzIsIDE3XSwgODI6IFsyLCA4NF0sIDkyOiBbMiwgNDhdLCA5OTogWzIsIDE4XSwgMTAwOiBbMiwgNzJdLCAxMDU6IFsyLCA4OF0sIDEwNzogWzIsIDU4XSwgMTEwOiBbMiwgNjRdLCAxMTE6IFsyLCAxMV0sIDEyMzogWzIsIDcwXSwgMTI0OiBbMiwgMjldIH0sXG4gICAgICAgIHBhcnNlRXJyb3I6IGZ1bmN0aW9uIHBhcnNlRXJyb3Ioc3RyLCBoYXNoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc3RyKTtcbiAgICAgICAgfSxcbiAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKGlucHV0KSB7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgICAgICAgICAgc3RhY2sgPSBbMF0sXG4gICAgICAgICAgICAgICAgdnN0YWNrID0gW251bGxdLFxuICAgICAgICAgICAgICAgIGxzdGFjayA9IFtdLFxuICAgICAgICAgICAgICAgIHRhYmxlID0gdGhpcy50YWJsZSxcbiAgICAgICAgICAgICAgICB5eXRleHQgPSBcIlwiLFxuICAgICAgICAgICAgICAgIHl5bGluZW5vID0gMCxcbiAgICAgICAgICAgICAgICB5eWxlbmcgPSAwLFxuICAgICAgICAgICAgICAgIHJlY292ZXJpbmcgPSAwLFxuICAgICAgICAgICAgICAgIFRFUlJPUiA9IDIsXG4gICAgICAgICAgICAgICAgRU9GID0gMTtcbiAgICAgICAgICAgIHRoaXMubGV4ZXIuc2V0SW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgdGhpcy5sZXhlci55eSA9IHRoaXMueXk7XG4gICAgICAgICAgICB0aGlzLnl5LmxleGVyID0gdGhpcy5sZXhlcjtcbiAgICAgICAgICAgIHRoaXMueXkucGFyc2VyID0gdGhpcztcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5sZXhlci55eWxsb2MgPT0gXCJ1bmRlZmluZWRcIikgdGhpcy5sZXhlci55eWxsb2MgPSB7fTtcbiAgICAgICAgICAgIHZhciB5eWxvYyA9IHRoaXMubGV4ZXIueXlsbG9jO1xuICAgICAgICAgICAgbHN0YWNrLnB1c2goeXlsb2MpO1xuICAgICAgICAgICAgdmFyIHJhbmdlcyA9IHRoaXMubGV4ZXIub3B0aW9ucyAmJiB0aGlzLmxleGVyLm9wdGlvbnMucmFuZ2VzO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnl5LnBhcnNlRXJyb3IgPT09IFwiZnVuY3Rpb25cIikgdGhpcy5wYXJzZUVycm9yID0gdGhpcy55eS5wYXJzZUVycm9yO1xuICAgICAgICAgICAgZnVuY3Rpb24gcG9wU3RhY2sobikge1xuICAgICAgICAgICAgICAgIHN0YWNrLmxlbmd0aCA9IHN0YWNrLmxlbmd0aCAtIDIgKiBuO1xuICAgICAgICAgICAgICAgIHZzdGFjay5sZW5ndGggPSB2c3RhY2subGVuZ3RoIC0gbjtcbiAgICAgICAgICAgICAgICBsc3RhY2subGVuZ3RoID0gbHN0YWNrLmxlbmd0aCAtIG47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBsZXgoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRva2VuO1xuICAgICAgICAgICAgICAgIHRva2VuID0gc2VsZi5sZXhlci5sZXgoKSB8fCAxO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdG9rZW4gIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnN5bWJvbHNfW3Rva2VuXSB8fCB0b2tlbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHN5bWJvbCxcbiAgICAgICAgICAgICAgICBwcmVFcnJvclN5bWJvbCxcbiAgICAgICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgICAgYSxcbiAgICAgICAgICAgICAgICByLFxuICAgICAgICAgICAgICAgIHl5dmFsID0ge30sXG4gICAgICAgICAgICAgICAgcCxcbiAgICAgICAgICAgICAgICBsZW4sXG4gICAgICAgICAgICAgICAgbmV3U3RhdGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHRoaXMuZGVmYXVsdEFjdGlvbnNbc3RhdGVdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2wgPT09IG51bGwgfHwgdHlwZW9mIHN5bWJvbCA9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSBsZXgoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSB0YWJsZVtzdGF0ZV0gJiYgdGFibGVbc3RhdGVdW3N5bWJvbF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYWN0aW9uID09PSBcInVuZGVmaW5lZFwiIHx8ICFhY3Rpb24ubGVuZ3RoIHx8ICFhY3Rpb25bMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVyclN0ciA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVjb3ZlcmluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocCBpbiB0YWJsZVtzdGF0ZV0pIGlmICh0aGlzLnRlcm1pbmFsc19bcF0gJiYgcCA+IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5wdXNoKFwiJ1wiICsgdGhpcy50ZXJtaW5hbHNfW3BdICsgXCInXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGV4ZXIuc2hvd1Bvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gXCJQYXJzZSBlcnJvciBvbiBsaW5lIFwiICsgKHl5bGluZW5vICsgMSkgKyBcIjpcXG5cIiArIHRoaXMubGV4ZXIuc2hvd1Bvc2l0aW9uKCkgKyBcIlxcbkV4cGVjdGluZyBcIiArIGV4cGVjdGVkLmpvaW4oXCIsIFwiKSArIFwiLCBnb3QgJ1wiICsgKHRoaXMudGVybWluYWxzX1tzeW1ib2xdIHx8IHN5bWJvbCkgKyBcIidcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyU3RyID0gXCJQYXJzZSBlcnJvciBvbiBsaW5lIFwiICsgKHl5bGluZW5vICsgMSkgKyBcIjogVW5leHBlY3RlZCBcIiArIChzeW1ib2wgPT0gMSA/IFwiZW5kIG9mIGlucHV0XCIgOiBcIidcIiArICh0aGlzLnRlcm1pbmFsc19bc3ltYm9sXSB8fCBzeW1ib2wpICsgXCInXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZUVycm9yKGVyclN0ciwgeyB0ZXh0OiB0aGlzLmxleGVyLm1hdGNoLCB0b2tlbjogdGhpcy50ZXJtaW5hbHNfW3N5bWJvbF0gfHwgc3ltYm9sLCBsaW5lOiB0aGlzLmxleGVyLnl5bGluZW5vLCBsb2M6IHl5bG9jLCBleHBlY3RlZDogZXhwZWN0ZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvblswXSBpbnN0YW5jZW9mIEFycmF5ICYmIGFjdGlvbi5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhcnNlIEVycm9yOiBtdWx0aXBsZSBhY3Rpb25zIHBvc3NpYmxlIGF0IHN0YXRlOiBcIiArIHN0YXRlICsgXCIsIHRva2VuOiBcIiArIHN5bWJvbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goc3ltYm9sKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZzdGFjay5wdXNoKHRoaXMubGV4ZXIueXl0ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxzdGFjay5wdXNoKHRoaXMubGV4ZXIueXlsbG9jKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYWN0aW9uWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByZUVycm9yU3ltYm9sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlsZW5nID0gdGhpcy5sZXhlci55eWxlbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeXl0ZXh0ID0gdGhpcy5sZXhlci55eXRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlsaW5lbm8gPSB0aGlzLmxleGVyLnl5bGluZW5vO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5bG9jID0gdGhpcy5sZXhlci55eWxsb2M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlY292ZXJpbmcgPiAwKSByZWNvdmVyaW5nLS07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCA9IHByZUVycm9yU3ltYm9sO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZUVycm9yU3ltYm9sID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSB0aGlzLnByb2R1Y3Rpb25zX1thY3Rpb25bMV1dWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgeXl2YWwuJCA9IHZzdGFja1t2c3RhY2subGVuZ3RoIC0gbGVuXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHl5dmFsLl8kID0geyBmaXJzdF9saW5lOiBsc3RhY2tbbHN0YWNrLmxlbmd0aCAtIChsZW4gfHwgMSldLmZpcnN0X2xpbmUsIGxhc3RfbGluZTogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAxXS5sYXN0X2xpbmUsIGZpcnN0X2NvbHVtbjogbHN0YWNrW2xzdGFjay5sZW5ndGggLSAobGVuIHx8IDEpXS5maXJzdF9jb2x1bW4sIGxhc3RfY29sdW1uOiBsc3RhY2tbbHN0YWNrLmxlbmd0aCAtIDFdLmxhc3RfY29sdW1uIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeXl2YWwuXyQucmFuZ2UgPSBbbHN0YWNrW2xzdGFjay5sZW5ndGggLSAobGVuIHx8IDEpXS5yYW5nZVswXSwgbHN0YWNrW2xzdGFjay5sZW5ndGggLSAxXS5yYW5nZVsxXV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByID0gdGhpcy5wZXJmb3JtQWN0aW9uLmNhbGwoeXl2YWwsIHl5dGV4dCwgeXlsZW5nLCB5eWxpbmVubywgdGhpcy55eSwgYWN0aW9uWzFdLCB2c3RhY2ssIGxzdGFjayk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjayA9IHN0YWNrLnNsaWNlKDAsIC0xICogbGVuICogMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdnN0YWNrID0gdnN0YWNrLnNsaWNlKDAsIC0xICogbGVuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsc3RhY2sgPSBsc3RhY2suc2xpY2UoMCwgLTEgKiBsZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCh0aGlzLnByb2R1Y3Rpb25zX1thY3Rpb25bMV1dWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZzdGFjay5wdXNoKHl5dmFsLiQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbHN0YWNrLnB1c2goeXl2YWwuXyQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPSB0YWJsZVtzdGFja1tzdGFjay5sZW5ndGggLSAyXV1bc3RhY2tbc3RhY2subGVuZ3RoIC0gMV1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChuZXdTdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qIEppc29uIGdlbmVyYXRlZCBsZXhlciAqL1xuICAgIHZhciBsZXhlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBsZXhlciA9IHsgRU9GOiAxLFxuICAgICAgICAgICAgcGFyc2VFcnJvcjogZnVuY3Rpb24gcGFyc2VFcnJvcihzdHIsIGhhc2gpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy55eS5wYXJzZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy55eS5wYXJzZXIucGFyc2VFcnJvcihzdHIsIGhhc2gpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzdHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXRJbnB1dDogZnVuY3Rpb24gc2V0SW5wdXQoaW5wdXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dCA9IGlucHV0O1xuICAgICAgICAgICAgICAgIHRoaXMuX21vcmUgPSB0aGlzLl9sZXNzID0gdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy55eWxpbmVubyA9IHRoaXMueXlsZW5nID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLnl5dGV4dCA9IHRoaXMubWF0Y2hlZCA9IHRoaXMubWF0Y2ggPSBcIlwiO1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sgPSBbXCJJTklUSUFMXCJdO1xuICAgICAgICAgICAgICAgIHRoaXMueXlsbG9jID0geyBmaXJzdF9saW5lOiAxLCBmaXJzdF9jb2x1bW46IDAsIGxhc3RfbGluZTogMSwgbGFzdF9jb2x1bW46IDAgfTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykgdGhpcy55eWxsb2MucmFuZ2UgPSBbMCwgMF07XG4gICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSAwO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlucHV0OiBmdW5jdGlvbiBpbnB1dCgpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2ggPSB0aGlzLl9pbnB1dFswXTtcbiAgICAgICAgICAgICAgICB0aGlzLnl5dGV4dCArPSBjaDtcbiAgICAgICAgICAgICAgICB0aGlzLnl5bGVuZysrO1xuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaCArPSBjaDtcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoZWQgKz0gY2g7XG4gICAgICAgICAgICAgICAgdmFyIGxpbmVzID0gY2gubWF0Y2goLyg/Olxcclxcbj98XFxuKS4qL2cpO1xuICAgICAgICAgICAgICAgIGlmIChsaW5lcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGluZW5vKys7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMueXlsbG9jLmxhc3RfbGluZSsrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMueXlsbG9jLmxhc3RfY29sdW1uKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmFuZ2VzKSB0aGlzLnl5bGxvYy5yYW5nZVsxXSsrO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5faW5wdXQgPSB0aGlzLl9pbnB1dC5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2g7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdW5wdXQ6IGZ1bmN0aW9uIHVucHV0KGNoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxlbiA9IGNoLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB2YXIgbGluZXMgPSBjaC5zcGxpdCgvKD86XFxyXFxuP3xcXG4pL2cpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5faW5wdXQgPSBjaCArIHRoaXMuX2lucHV0O1xuICAgICAgICAgICAgICAgIHRoaXMueXl0ZXh0ID0gdGhpcy55eXRleHQuc3Vic3RyKDAsIHRoaXMueXl0ZXh0Lmxlbmd0aCAtIGxlbiAtIDEpO1xuICAgICAgICAgICAgICAgIC8vdGhpcy55eWxlbmcgLT0gbGVuO1xuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0IC09IGxlbjtcbiAgICAgICAgICAgICAgICB2YXIgb2xkTGluZXMgPSB0aGlzLm1hdGNoLnNwbGl0KC8oPzpcXHJcXG4/fFxcbikvZyk7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaCA9IHRoaXMubWF0Y2guc3Vic3RyKDAsIHRoaXMubWF0Y2gubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVkID0gdGhpcy5tYXRjaGVkLnN1YnN0cigwLCB0aGlzLm1hdGNoZWQubGVuZ3RoIC0gMSk7XG5cbiAgICAgICAgICAgICAgICBpZiAobGluZXMubGVuZ3RoIC0gMSkgdGhpcy55eWxpbmVubyAtPSBsaW5lcy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy55eWxsb2MucmFuZ2U7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MuZmlyc3RfbGluZSxcbiAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSxcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RfY29sdW1uOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgIGxhc3RfY29sdW1uOiBsaW5lcyA/IChsaW5lcy5sZW5ndGggPT09IG9sZExpbmVzLmxlbmd0aCA/IHRoaXMueXlsbG9jLmZpcnN0X2NvbHVtbiA6IDApICsgb2xkTGluZXNbb2xkTGluZXMubGVuZ3RoIC0gbGluZXMubGVuZ3RoXS5sZW5ndGggLSBsaW5lc1swXS5sZW5ndGggOiB0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4gLSBsZW5cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yYW5nZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy55eWxsb2MucmFuZ2UgPSBbclswXSwgclswXSArIHRoaXMueXlsZW5nIC0gbGVuXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW9yZTogZnVuY3Rpb24gbW9yZSgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb3JlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZXNzOiBmdW5jdGlvbiBsZXNzKG4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVucHV0KHRoaXMubWF0Y2guc2xpY2UobikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhc3RJbnB1dDogZnVuY3Rpb24gcGFzdElucHV0KCkge1xuICAgICAgICAgICAgICAgIHZhciBwYXN0ID0gdGhpcy5tYXRjaGVkLnN1YnN0cigwLCB0aGlzLm1hdGNoZWQubGVuZ3RoIC0gdGhpcy5tYXRjaC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIHJldHVybiAocGFzdC5sZW5ndGggPiAyMCA/IFwiLi4uXCIgOiBcIlwiKSArIHBhc3Quc3Vic3RyKC0yMCkucmVwbGFjZSgvXFxuL2csIFwiXCIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVwY29taW5nSW5wdXQ6IGZ1bmN0aW9uIHVwY29taW5nSW5wdXQoKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5leHQgPSB0aGlzLm1hdGNoO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0Lmxlbmd0aCA8IDIwKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHQgKz0gdGhpcy5faW5wdXQuc3Vic3RyKDAsIDIwIC0gbmV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gKG5leHQuc3Vic3RyKDAsIDIwKSArIChuZXh0Lmxlbmd0aCA+IDIwID8gXCIuLi5cIiA6IFwiXCIpKS5yZXBsYWNlKC9cXG4vZywgXCJcIik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2hvd1Bvc2l0aW9uOiBmdW5jdGlvbiBzaG93UG9zaXRpb24oKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByZSA9IHRoaXMucGFzdElucHV0KCk7XG4gICAgICAgICAgICAgICAgdmFyIGMgPSBuZXcgQXJyYXkocHJlLmxlbmd0aCArIDEpLmpvaW4oXCItXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmUgKyB0aGlzLnVwY29taW5nSW5wdXQoKSArIFwiXFxuXCIgKyBjICsgXCJeXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkVPRjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9pbnB1dCkgdGhpcy5kb25lID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIHZhciB0b2tlbiwgbWF0Y2gsIHRlbXBNYXRjaCwgaW5kZXgsIGNvbCwgbGluZXM7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9tb3JlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMueXl0ZXh0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBydWxlcyA9IHRoaXMuX2N1cnJlbnRSdWxlcygpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGVtcE1hdGNoID0gdGhpcy5faW5wdXQubWF0Y2godGhpcy5ydWxlc1tydWxlc1tpXV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGVtcE1hdGNoICYmICghbWF0Y2ggfHwgdGVtcE1hdGNoWzBdLmxlbmd0aCA+IG1hdGNoWzBdLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdGVtcE1hdGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZmxleCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVzID0gbWF0Y2hbMF0ubWF0Y2goLyg/Olxcclxcbj98XFxuKS4qL2cpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGluZXMpIHRoaXMueXlsaW5lbm8gKz0gbGluZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnl5bGxvYyA9IHsgZmlyc3RfbGluZTogdGhpcy55eWxsb2MubGFzdF9saW5lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9saW5lOiB0aGlzLnl5bGluZW5vICsgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2NvbHVtbjogdGhpcy55eWxsb2MubGFzdF9jb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2NvbHVtbjogbGluZXMgPyBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5sZW5ndGggLSBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5tYXRjaCgvXFxyP1xcbj8vKVswXS5sZW5ndGggOiB0aGlzLnl5bGxvYy5sYXN0X2NvbHVtbiArIG1hdGNoWzBdLmxlbmd0aCB9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnl5dGV4dCArPSBtYXRjaFswXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaCArPSBtYXRjaFswXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVzID0gbWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMueXlsZW5nID0gdGhpcy55eXRleHQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJhbmdlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy55eWxsb2MucmFuZ2UgPSBbdGhpcy5vZmZzZXQsIHRoaXMub2Zmc2V0ICs9IHRoaXMueXlsZW5nXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3JlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0ID0gdGhpcy5faW5wdXQuc2xpY2UobWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVkICs9IG1hdGNoWzBdO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMucGVyZm9ybUFjdGlvbi5jYWxsKHRoaXMsIHRoaXMueXksIHRoaXMsIHJ1bGVzW2luZGV4XSwgdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZG9uZSAmJiB0aGlzLl9pbnB1dCkgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pbnB1dCA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5FT0Y7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VFcnJvcihcIkxleGljYWwgZXJyb3Igb24gbGluZSBcIiArICh0aGlzLnl5bGluZW5vICsgMSkgKyBcIi4gVW5yZWNvZ25pemVkIHRleHQuXFxuXCIgKyB0aGlzLnNob3dQb3NpdGlvbigpLCB7IHRleHQ6IFwiXCIsIHRva2VuOiBudWxsLCBsaW5lOiB0aGlzLnl5bGluZW5vIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZXg6IGZ1bmN0aW9uIGxleCgpIHtcbiAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMubmV4dCgpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZXgoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmVnaW46IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uU3RhY2sucHVzaChjb25kaXRpb24pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBvcFN0YXRlOiBmdW5jdGlvbiBwb3BTdGF0ZSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25TdGFjay5wb3AoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBfY3VycmVudFJ1bGVzOiBmdW5jdGlvbiBfY3VycmVudFJ1bGVzKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnNbdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aCAtIDFdXS5ydWxlcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0b3BTdGF0ZTogZnVuY3Rpb24gdG9wU3RhdGUoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGggLSAyXTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwdXNoU3RhdGU6IGZ1bmN0aW9uIGJlZ2luKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oY29uZGl0aW9uKTtcbiAgICAgICAgICAgIH0gfTtcbiAgICAgICAgbGV4ZXIub3B0aW9ucyA9IHt9O1xuICAgICAgICBsZXhlci5wZXJmb3JtQWN0aW9uID0gZnVuY3Rpb24gYW5vbnltb3VzKHl5LCB5eV8sICRhdm9pZGluZ19uYW1lX2NvbGxpc2lvbnMsIFlZX1NUQVJUKSB7XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIHN0cmlwKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geXlfLnl5dGV4dCA9IHl5Xy55eXRleHQuc3Vic3RyKHN0YXJ0LCB5eV8ueXlsZW5nIC0gZW5kKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIFlZU1RBVEUgPSBZWV9TVEFSVDtcbiAgICAgICAgICAgIHN3aXRjaCAoJGF2b2lkaW5nX25hbWVfY29sbGlzaW9ucykge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHl5Xy55eXRleHQuc2xpY2UoLTIpID09PSBcIlxcXFxcXFxcXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwKDAsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbihcIm11XCIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHl5Xy55eXRleHQuc2xpY2UoLTEpID09PSBcIlxcXFxcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXAoMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKFwiZW11XCIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbihcIm11XCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh5eV8ueXl0ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTQ7XG4gICAgICAgICAgICAgICAgICAgIH1icmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxNDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxNDtcblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIHl5Xy55eXRleHQgPSB5eV8ueXl0ZXh0LnN1YnN0cig1LCB5eV8ueXlsZW5nIC0gOSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE2O1xuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE0O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEzO1xuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU5O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA2MjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luKFwicmF3XCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjE7XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDUzO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA0NTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpO3JldHVybiA0MjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpO3JldHVybiA0MjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA0OTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ2O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE5OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVucHV0KHl5Xy55eXRleHQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmVnaW4oXCJjb21cIik7XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTdGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTM7XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ2O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjM6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA2NjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY2O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI1OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gODE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjY6XG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB3aGl0ZXNwYWNlXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTtyZXR1cm4gNTI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjg6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9wU3RhdGUoKTtyZXR1cm4gMzE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjk6XG4gICAgICAgICAgICAgICAgICAgIHl5Xy55eXRleHQgPSBzdHJpcCgxLCAyKS5yZXBsYWNlKC9cXFxcXCIvZywgXCJcXFwiXCIpO3JldHVybiA3NDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzMDpcbiAgICAgICAgICAgICAgICAgICAgeXlfLnl5dGV4dCA9IHN0cmlwKDEsIDIpLnJlcGxhY2UoL1xcXFwnL2csIFwiJ1wiKTtyZXR1cm4gNzQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzE6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA3OTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDc2O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDMzOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzY7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA3NztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzNTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDc4O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM2OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA2OTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzODpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDcxO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM5OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjY7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDA6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA2NjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0MTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiSU5WQUxJRFwiO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQyOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gNTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGxleGVyLnJ1bGVzID0gWy9eKD86W15cXHgwMF0qPyg/PShcXHtcXHspKSkvLCAvXig/OlteXFx4MDBdKykvLCAvXig/OlteXFx4MDBdezIsfT8oPz0oXFx7XFx7fFxcXFxcXHtcXHt8XFxcXFxcXFxcXHtcXHt8JCkpKS8sIC9eKD86XFx7XFx7XFx7XFx7XFwvW15cXHMhXCIjJS0sXFwuXFwvOy0+QFxcWy1cXF5gXFx7LX5dKyg/PVs9fVxcc1xcLy5dKVxcfVxcfVxcfVxcfSkvLCAvXig/OlteXFx4MDBdKj8oPz0oXFx7XFx7XFx7XFx7XFwvKSkpLywgL14oPzpbXFxzXFxTXSo/LS0ofik/XFx9XFx9KS8sIC9eKD86XFwoKS8sIC9eKD86XFwpKS8sIC9eKD86XFx7XFx7XFx7XFx7KS8sIC9eKD86XFx9XFx9XFx9XFx9KS8sIC9eKD86XFx7XFx7KH4pPz4pLywgL14oPzpcXHtcXHsofik/IykvLCAvXig/Olxce1xceyh+KT9cXC8pLywgL14oPzpcXHtcXHsofik/XFxeXFxzKih+KT9cXH1cXH0pLywgL14oPzpcXHtcXHsofik/XFxzKmVsc2VcXHMqKH4pP1xcfVxcfSkvLCAvXig/Olxce1xceyh+KT9cXF4pLywgL14oPzpcXHtcXHsofik/XFxzKmVsc2VcXGIpLywgL14oPzpcXHtcXHsofik/XFx7KS8sIC9eKD86XFx7XFx7KH4pPyYpLywgL14oPzpcXHtcXHsofik/IS0tKS8sIC9eKD86XFx7XFx7KH4pPyFbXFxzXFxTXSo/XFx9XFx9KS8sIC9eKD86XFx7XFx7KH4pPykvLCAvXig/Oj0pLywgL14oPzpcXC5cXC4pLywgL14oPzpcXC4oPz0oWz1+fVxcc1xcLy4pfF0pKSkvLCAvXig/OltcXC8uXSkvLCAvXig/OlxccyspLywgL14oPzpcXH0ofik/XFx9XFx9KS8sIC9eKD86KH4pP1xcfVxcfSkvLCAvXig/OlwiKFxcXFxbXCJdfFteXCJdKSpcIikvLCAvXig/OicoXFxcXFsnXXxbXiddKSonKS8sIC9eKD86QCkvLCAvXig/OnRydWUoPz0oW359XFxzKV0pKSkvLCAvXig/OmZhbHNlKD89KFt+fVxccyldKSkpLywgL14oPzp1bmRlZmluZWQoPz0oW359XFxzKV0pKSkvLCAvXig/Om51bGwoPz0oW359XFxzKV0pKSkvLCAvXig/Oi0/WzAtOV0rKD86XFwuWzAtOV0rKT8oPz0oW359XFxzKV0pKSkvLCAvXig/OmFzXFxzK1xcfCkvLCAvXig/OlxcfCkvLCAvXig/OihbXlxccyFcIiMlLSxcXC5cXC87LT5AXFxbLVxcXmBcXHstfl0rKD89KFs9fn1cXHNcXC8uKXxdKSkpKS8sIC9eKD86XFxbW15cXF1dKlxcXSkvLCAvXig/Oi4pLywgL14oPzokKS9dO1xuICAgICAgICBsZXhlci5jb25kaXRpb25zID0geyBtdTogeyBydWxlczogWzYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDJdLCBpbmNsdXNpdmU6IGZhbHNlIH0sIGVtdTogeyBydWxlczogWzJdLCBpbmNsdXNpdmU6IGZhbHNlIH0sIGNvbTogeyBydWxlczogWzVdLCBpbmNsdXNpdmU6IGZhbHNlIH0sIHJhdzogeyBydWxlczogWzMsIDRdLCBpbmNsdXNpdmU6IGZhbHNlIH0sIElOSVRJQUw6IHsgcnVsZXM6IFswLCAxLCA0Ml0sIGluY2x1c2l2ZTogdHJ1ZSB9IH07XG4gICAgICAgIHJldHVybiBsZXhlcjtcbiAgICB9KSgpO1xuICAgIHBhcnNlci5sZXhlciA9IGxleGVyO1xuICAgIGZ1bmN0aW9uIFBhcnNlcigpIHtcbiAgICAgICAgdGhpcy55eSA9IHt9O1xuICAgIH1QYXJzZXIucHJvdG90eXBlID0gcGFyc2VyO3BhcnNlci5QYXJzZXIgPSBQYXJzZXI7XG4gICAgcmV0dXJuIG5ldyBQYXJzZXIoKTtcbn0pKCk7ZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBoYW5kbGViYXJzO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMucHJpbnQgPSBwcmludDtcbmV4cG9ydHMuUHJpbnRWaXNpdG9yID0gUHJpbnRWaXNpdG9yO1xuLyplc2xpbnQtZGlzYWJsZSBuZXctY2FwICovXG5cbnZhciBfVmlzaXRvciA9IHJlcXVpcmUoJy4vdmlzaXRvcicpO1xuXG52YXIgX1Zpc2l0b3IyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX1Zpc2l0b3IpO1xuXG5mdW5jdGlvbiBwcmludChhc3QpIHtcbiAgcmV0dXJuIG5ldyBQcmludFZpc2l0b3IoKS5hY2NlcHQoYXN0KTtcbn1cblxuZnVuY3Rpb24gUHJpbnRWaXNpdG9yKCkge1xuICB0aGlzLnBhZGRpbmcgPSAwO1xufVxuXG5QcmludFZpc2l0b3IucHJvdG90eXBlID0gbmV3IF9WaXNpdG9yMlsnZGVmYXVsdCddKCk7XG5cblByaW50VmlzaXRvci5wcm90b3R5cGUucGFkID0gZnVuY3Rpb24gKHN0cmluZykge1xuICB2YXIgb3V0ID0gJyc7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLnBhZGRpbmc7IGkgPCBsOyBpKyspIHtcbiAgICBvdXQgPSBvdXQgKyAnICAnO1xuICB9XG5cbiAgb3V0ID0gb3V0ICsgc3RyaW5nICsgJ1xcbic7XG4gIHJldHVybiBvdXQ7XG59O1xuXG5QcmludFZpc2l0b3IucHJvdG90eXBlLlByb2dyYW0gPSBmdW5jdGlvbiAocHJvZ3JhbSkge1xuICB2YXIgb3V0ID0gJycsXG4gICAgICBib2R5ID0gcHJvZ3JhbS5ib2R5LFxuICAgICAgaSA9IHVuZGVmaW5lZCxcbiAgICAgIGwgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKHByb2dyYW0uYmxvY2tQYXJhbXMpIHtcbiAgICB2YXIgYmxvY2tQYXJhbXMgPSAnQkxPQ0sgUEFSQU1TOiBbJztcbiAgICBmb3IgKGkgPSAwLCBsID0gcHJvZ3JhbS5ibG9ja1BhcmFtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGJsb2NrUGFyYW1zICs9ICcgJyArIHByb2dyYW0uYmxvY2tQYXJhbXNbaV07XG4gICAgfVxuICAgIGJsb2NrUGFyYW1zICs9ICcgXSc7XG4gICAgb3V0ICs9IHRoaXMucGFkKGJsb2NrUGFyYW1zKTtcbiAgfVxuXG4gIGZvciAoaSA9IDAsIGwgPSBib2R5Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIG91dCA9IG91dCArIHRoaXMuYWNjZXB0KGJvZHlbaV0pO1xuICB9XG5cbiAgdGhpcy5wYWRkaW5nLS07XG5cbiAgcmV0dXJuIG91dDtcbn07XG5cblByaW50VmlzaXRvci5wcm90b3R5cGUuTXVzdGFjaGVTdGF0ZW1lbnQgPSBmdW5jdGlvbiAobXVzdGFjaGUpIHtcbiAgcmV0dXJuIHRoaXMucGFkKCd7eyAnICsgdGhpcy5TdWJFeHByZXNzaW9uKG11c3RhY2hlKSArICcgfX0nKTtcbn07XG5cblByaW50VmlzaXRvci5wcm90b3R5cGUuQmxvY2tTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoYmxvY2spIHtcbiAgdmFyIG91dCA9ICcnO1xuXG4gIG91dCA9IG91dCArIHRoaXMucGFkKCdCTE9DSzonKTtcbiAgdGhpcy5wYWRkaW5nKys7XG4gIG91dCA9IG91dCArIHRoaXMucGFkKHRoaXMuU3ViRXhwcmVzc2lvbihibG9jaykpO1xuICBpZiAoYmxvY2sucHJvZ3JhbSkge1xuICAgIG91dCA9IG91dCArIHRoaXMucGFkKCdQUk9HUkFNOicpO1xuICAgIHRoaXMucGFkZGluZysrO1xuICAgIG91dCA9IG91dCArIHRoaXMuYWNjZXB0KGJsb2NrLnByb2dyYW0pO1xuICAgIHRoaXMucGFkZGluZy0tO1xuICB9XG4gIGlmIChibG9jay5pbnZlcnNlKSB7XG4gICAgaWYgKGJsb2NrLnByb2dyYW0pIHtcbiAgICAgIHRoaXMucGFkZGluZysrO1xuICAgIH1cbiAgICBvdXQgPSBvdXQgKyB0aGlzLnBhZCgne3tefX0nKTtcbiAgICB0aGlzLnBhZGRpbmcrKztcbiAgICBvdXQgPSBvdXQgKyB0aGlzLmFjY2VwdChibG9jay5pbnZlcnNlKTtcbiAgICB0aGlzLnBhZGRpbmctLTtcbiAgICBpZiAoYmxvY2sucHJvZ3JhbSkge1xuICAgICAgdGhpcy5wYWRkaW5nLS07XG4gICAgfVxuICB9XG4gIHRoaXMucGFkZGluZy0tO1xuXG4gIHJldHVybiBvdXQ7XG59O1xuXG5QcmludFZpc2l0b3IucHJvdG90eXBlLlBhcnRpYWxTdGF0ZW1lbnQgPSBmdW5jdGlvbiAocGFydGlhbCkge1xuICB2YXIgY29udGVudCA9ICdQQVJUSUFMOicgKyBwYXJ0aWFsLm5hbWUub3JpZ2luYWw7XG4gIGlmIChwYXJ0aWFsLnBhcmFtc1swXSkge1xuICAgIGNvbnRlbnQgKz0gJyAnICsgdGhpcy5hY2NlcHQocGFydGlhbC5wYXJhbXNbMF0pO1xuICB9XG4gIGlmIChwYXJ0aWFsLmhhc2gpIHtcbiAgICBjb250ZW50ICs9ICcgJyArIHRoaXMuYWNjZXB0KHBhcnRpYWwuaGFzaCk7XG4gIH1cbiAgcmV0dXJuIHRoaXMucGFkKCd7ez4gJyArIGNvbnRlbnQgKyAnIH19Jyk7XG59O1xuXG5QcmludFZpc2l0b3IucHJvdG90eXBlLkNvbnRlbnRTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoY29udGVudCkge1xuICByZXR1cm4gdGhpcy5wYWQoJ0NPTlRFTlRbIFxcJycgKyBjb250ZW50LnZhbHVlICsgJ1xcJyBdJyk7XG59O1xuXG5QcmludFZpc2l0b3IucHJvdG90eXBlLkNvbW1lbnRTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoY29tbWVudCkge1xuICByZXR1cm4gdGhpcy5wYWQoJ3t7ISBcXCcnICsgY29tbWVudC52YWx1ZSArICdcXCcgfX0nKTtcbn07XG5cblByaW50VmlzaXRvci5wcm90b3R5cGUuU3ViRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChzZXhwcikge1xuICB2YXIgcGFyYW1zID0gc2V4cHIucGFyYW1zLFxuICAgICAgcGFyYW1TdHJpbmdzID0gW10sXG4gICAgICBoYXNoID0gdW5kZWZpbmVkO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gcGFyYW1zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHBhcmFtU3RyaW5ncy5wdXNoKHRoaXMuYWNjZXB0KHBhcmFtc1tpXSkpO1xuICB9XG5cbiAgcGFyYW1zID0gJ1snICsgcGFyYW1TdHJpbmdzLmpvaW4oJywgJykgKyAnXSc7XG5cbiAgaGFzaCA9IHNleHByLmhhc2ggPyAnICcgKyB0aGlzLmFjY2VwdChzZXhwci5oYXNoKSA6ICcnO1xuXG4gIHJldHVybiB0aGlzLmFjY2VwdChzZXhwci5wYXRoKSArICcgJyArIHBhcmFtcyArIGhhc2g7XG59O1xuXG5QcmludFZpc2l0b3IucHJvdG90eXBlLlBhdGhFeHByZXNzaW9uID0gZnVuY3Rpb24gKGlkKSB7XG4gIHZhciBwYXRoID0gaWQucGFydHMuam9pbignLycpO1xuICByZXR1cm4gKGlkLmRhdGEgPyAnQCcgOiAnJykgKyAnUEFUSDonICsgcGF0aDtcbn07XG5cblByaW50VmlzaXRvci5wcm90b3R5cGUuU3RyaW5nTGl0ZXJhbCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgcmV0dXJuICdcIicgKyBzdHJpbmcudmFsdWUgKyAnXCInO1xufTtcblxuUHJpbnRWaXNpdG9yLnByb3RvdHlwZS5OdW1iZXJMaXRlcmFsID0gZnVuY3Rpb24gKG51bWJlcikge1xuICByZXR1cm4gJ05VTUJFUnsnICsgbnVtYmVyLnZhbHVlICsgJ30nO1xufTtcblxuUHJpbnRWaXNpdG9yLnByb3RvdHlwZS5Cb29sZWFuTGl0ZXJhbCA9IGZ1bmN0aW9uIChib29sKSB7XG4gIHJldHVybiAnQk9PTEVBTnsnICsgYm9vbC52YWx1ZSArICd9Jztcbn07XG5cblByaW50VmlzaXRvci5wcm90b3R5cGUuVW5kZWZpbmVkTGl0ZXJhbCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICdVTkRFRklORUQnO1xufTtcblxuUHJpbnRWaXNpdG9yLnByb3RvdHlwZS5OdWxsTGl0ZXJhbCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICdOVUxMJztcbn07XG5cblByaW50VmlzaXRvci5wcm90b3R5cGUuSGFzaCA9IGZ1bmN0aW9uIChoYXNoKSB7XG4gIHZhciBwYWlycyA9IGhhc2gucGFpcnMsXG4gICAgICBqb2luZWRQYWlycyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gcGFpcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgam9pbmVkUGFpcnMucHVzaCh0aGlzLmFjY2VwdChwYWlyc1tpXSkpO1xuICB9XG5cbiAgcmV0dXJuICdIQVNIeycgKyBqb2luZWRQYWlycy5qb2luKCcsICcpICsgJ30nO1xufTtcblByaW50VmlzaXRvci5wcm90b3R5cGUuSGFzaFBhaXIgPSBmdW5jdGlvbiAocGFpcikge1xuICByZXR1cm4gcGFpci5rZXkgKyAnPScgKyB0aGlzLmFjY2VwdChwYWlyLnZhbHVlKTtcbn07XG4vKmVzbGludC1lbmFibGUgbmV3LWNhcCAqLyIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9O1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX0V4Y2VwdGlvbiA9IHJlcXVpcmUoJy4uL2V4Y2VwdGlvbicpO1xuXG52YXIgX0V4Y2VwdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfRXhjZXB0aW9uKTtcblxudmFyIF9BU1QgPSByZXF1aXJlKCcuL2FzdCcpO1xuXG52YXIgX0FTVDIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfQVNUKTtcblxuZnVuY3Rpb24gVmlzaXRvcigpIHtcbiAgdGhpcy5wYXJlbnRzID0gW107XG59XG5cblZpc2l0b3IucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVmlzaXRvcixcbiAgbXV0YXRpbmc6IGZhbHNlLFxuXG4gIC8vIFZpc2l0cyBhIGdpdmVuIHZhbHVlLiBJZiBtdXRhdGluZywgd2lsbCByZXBsYWNlIHRoZSB2YWx1ZSBpZiBuZWNlc3NhcnkuXG4gIGFjY2VwdEtleTogZnVuY3Rpb24gYWNjZXB0S2V5KG5vZGUsIG5hbWUpIHtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLmFjY2VwdChub2RlW25hbWVdKTtcbiAgICBpZiAodGhpcy5tdXRhdGluZykge1xuICAgICAgLy8gSGFja3kgc2FuaXR5IGNoZWNrOlxuICAgICAgaWYgKHZhbHVlICYmICghdmFsdWUudHlwZSB8fCAhX0FTVDJbJ2RlZmF1bHQnXVt2YWx1ZS50eXBlXSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IF9FeGNlcHRpb24yWydkZWZhdWx0J10oJ1VuZXhwZWN0ZWQgbm9kZSB0eXBlIFwiJyArIHZhbHVlLnR5cGUgKyAnXCIgZm91bmQgd2hlbiBhY2NlcHRpbmcgJyArIG5hbWUgKyAnIG9uICcgKyBub2RlLnR5cGUpO1xuICAgICAgfVxuICAgICAgbm9kZVtuYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgfSxcblxuICAvLyBQZXJmb3JtcyBhbiBhY2NlcHQgb3BlcmF0aW9uIHdpdGggYWRkZWQgc2FuaXR5IGNoZWNrIHRvIGVuc3VyZVxuICAvLyByZXF1aXJlZCBrZXlzIGFyZSBub3QgcmVtb3ZlZC5cbiAgYWNjZXB0UmVxdWlyZWQ6IGZ1bmN0aW9uIGFjY2VwdFJlcXVpcmVkKG5vZGUsIG5hbWUpIHtcbiAgICB0aGlzLmFjY2VwdEtleShub2RlLCBuYW1lKTtcblxuICAgIGlmICghbm9kZVtuYW1lXSkge1xuICAgICAgdGhyb3cgbmV3IF9FeGNlcHRpb24yWydkZWZhdWx0J10obm9kZS50eXBlICsgJyByZXF1aXJlcyAnICsgbmFtZSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIFRyYXZlcnNlcyBhIGdpdmVuIGFycmF5LiBJZiBtdXRhdGluZywgZW1wdHkgcmVzcG5zZXMgd2lsbCBiZSByZW1vdmVkXG4gIC8vIGZvciBjaGlsZCBlbGVtZW50cy5cbiAgYWNjZXB0QXJyYXk6IGZ1bmN0aW9uIGFjY2VwdEFycmF5KGFycmF5KSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHRoaXMuYWNjZXB0S2V5KGFycmF5LCBpKTtcblxuICAgICAgaWYgKCFhcnJheVtpXSkge1xuICAgICAgICBhcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGktLTtcbiAgICAgICAgbC0tO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBhY2NlcHQ6IGZ1bmN0aW9uIGFjY2VwdChvYmplY3QpIHtcbiAgICBpZiAoIW9iamVjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmN1cnJlbnQpIHtcbiAgICAgIHRoaXMucGFyZW50cy51bnNoaWZ0KHRoaXMuY3VycmVudCk7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudCA9IG9iamVjdDtcblxuICAgIHZhciByZXQgPSB0aGlzW29iamVjdC50eXBlXShvYmplY3QpO1xuXG4gICAgdGhpcy5jdXJyZW50ID0gdGhpcy5wYXJlbnRzLnNoaWZ0KCk7XG5cbiAgICBpZiAoIXRoaXMubXV0YXRpbmcgfHwgcmV0KSB7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH0gZWxzZSBpZiAocmV0ICE9PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG4gIH0sXG5cbiAgUHJvZ3JhbTogZnVuY3Rpb24gUHJvZ3JhbShwcm9ncmFtKSB7XG4gICAgdGhpcy5hY2NlcHRBcnJheShwcm9ncmFtLmJvZHkpO1xuICB9LFxuXG4gIE11c3RhY2hlU3RhdGVtZW50OiBmdW5jdGlvbiBNdXN0YWNoZVN0YXRlbWVudChtdXN0YWNoZSkge1xuICAgIHRoaXMuYWNjZXB0UmVxdWlyZWQobXVzdGFjaGUsICdwYXRoJyk7XG4gICAgdGhpcy5hY2NlcHRBcnJheShtdXN0YWNoZS5wYXJhbXMpO1xuICAgIHRoaXMuYWNjZXB0S2V5KG11c3RhY2hlLCAnaGFzaCcpO1xuICB9LFxuXG4gIEJsb2NrU3RhdGVtZW50OiBmdW5jdGlvbiBCbG9ja1N0YXRlbWVudChibG9jaykge1xuICAgIHRoaXMuYWNjZXB0UmVxdWlyZWQoYmxvY2ssICdwYXRoJyk7XG4gICAgdGhpcy5hY2NlcHRBcnJheShibG9jay5wYXJhbXMpO1xuICAgIHRoaXMuYWNjZXB0S2V5KGJsb2NrLCAnaGFzaCcpO1xuXG4gICAgdGhpcy5hY2NlcHRLZXkoYmxvY2ssICdwcm9ncmFtJyk7XG4gICAgdGhpcy5hY2NlcHRLZXkoYmxvY2ssICdpbnZlcnNlJyk7XG4gIH0sXG5cbiAgUGFydGlhbFN0YXRlbWVudDogZnVuY3Rpb24gUGFydGlhbFN0YXRlbWVudChwYXJ0aWFsKSB7XG4gICAgdGhpcy5hY2NlcHRSZXF1aXJlZChwYXJ0aWFsLCAnbmFtZScpO1xuICAgIHRoaXMuYWNjZXB0QXJyYXkocGFydGlhbC5wYXJhbXMpO1xuICAgIHRoaXMuYWNjZXB0S2V5KHBhcnRpYWwsICdoYXNoJyk7XG4gIH0sXG5cbiAgQ29udGVudFN0YXRlbWVudDogZnVuY3Rpb24gQ29udGVudFN0YXRlbWVudCgpIHt9LFxuICBDb21tZW50U3RhdGVtZW50OiBmdW5jdGlvbiBDb21tZW50U3RhdGVtZW50KCkge30sXG5cbiAgU3ViRXhwcmVzc2lvbjogZnVuY3Rpb24gU3ViRXhwcmVzc2lvbihzZXhwcikge1xuICAgIHRoaXMuYWNjZXB0UmVxdWlyZWQoc2V4cHIsICdwYXRoJyk7XG4gICAgdGhpcy5hY2NlcHRBcnJheShzZXhwci5wYXJhbXMpO1xuICAgIHRoaXMuYWNjZXB0S2V5KHNleHByLCAnaGFzaCcpO1xuICB9LFxuXG4gIFBhdGhFeHByZXNzaW9uOiBmdW5jdGlvbiBQYXRoRXhwcmVzc2lvbigpIHt9LFxuXG4gIFN0cmluZ0xpdGVyYWw6IGZ1bmN0aW9uIFN0cmluZ0xpdGVyYWwoKSB7fSxcbiAgTnVtYmVyTGl0ZXJhbDogZnVuY3Rpb24gTnVtYmVyTGl0ZXJhbCgpIHt9LFxuICBCb29sZWFuTGl0ZXJhbDogZnVuY3Rpb24gQm9vbGVhbkxpdGVyYWwoKSB7fSxcbiAgVW5kZWZpbmVkTGl0ZXJhbDogZnVuY3Rpb24gVW5kZWZpbmVkTGl0ZXJhbCgpIHt9LFxuICBOdWxsTGl0ZXJhbDogZnVuY3Rpb24gTnVsbExpdGVyYWwoKSB7fSxcblxuICBIYXNoOiBmdW5jdGlvbiBIYXNoKGhhc2gpIHtcbiAgICB0aGlzLmFjY2VwdEFycmF5KGhhc2gucGFpcnMpO1xuICB9LFxuICBIYXNoUGFpcjogZnVuY3Rpb24gSGFzaFBhaXIocGFpcikge1xuICAgIHRoaXMuYWNjZXB0UmVxdWlyZWQocGFpciwgJ3ZhbHVlJyk7XG4gIH1cbn07XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IFZpc2l0b3I7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcbi8qIGNvbnRlbnQgKi8gLyogY29tbWVudCAqLyAvKiBwYXRoICovIC8qIHN0cmluZyAqLyAvKiBudW1iZXIgKi8gLyogYm9vbCAqLyAvKiBsaXRlcmFsICovIC8qIGxpdGVyYWwgKi8iLCIndXNlIHN0cmljdCc7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9WaXNpdG9yID0gcmVxdWlyZSgnLi92aXNpdG9yJyk7XG5cbnZhciBfVmlzaXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfVmlzaXRvcik7XG5cbmZ1bmN0aW9uIFdoaXRlc3BhY2VDb250cm9sKCkge31cbldoaXRlc3BhY2VDb250cm9sLnByb3RvdHlwZSA9IG5ldyBfVmlzaXRvcjJbJ2RlZmF1bHQnXSgpO1xuXG5XaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuUHJvZ3JhbSA9IGZ1bmN0aW9uIChwcm9ncmFtKSB7XG4gIHZhciBpc1Jvb3QgPSAhdGhpcy5pc1Jvb3RTZWVuO1xuICB0aGlzLmlzUm9vdFNlZW4gPSB0cnVlO1xuXG4gIHZhciBib2R5ID0gcHJvZ3JhbS5ib2R5O1xuICBmb3IgKHZhciBpID0gMCwgbCA9IGJvZHkubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBib2R5W2ldLFxuICAgICAgICBzdHJpcCA9IHRoaXMuYWNjZXB0KGN1cnJlbnQpO1xuXG4gICAgaWYgKCFzdHJpcCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIF9pc1ByZXZXaGl0ZXNwYWNlID0gaXNQcmV2V2hpdGVzcGFjZShib2R5LCBpLCBpc1Jvb3QpLFxuICAgICAgICBfaXNOZXh0V2hpdGVzcGFjZSA9IGlzTmV4dFdoaXRlc3BhY2UoYm9keSwgaSwgaXNSb290KSxcbiAgICAgICAgb3BlblN0YW5kYWxvbmUgPSBzdHJpcC5vcGVuU3RhbmRhbG9uZSAmJiBfaXNQcmV2V2hpdGVzcGFjZSxcbiAgICAgICAgY2xvc2VTdGFuZGFsb25lID0gc3RyaXAuY2xvc2VTdGFuZGFsb25lICYmIF9pc05leHRXaGl0ZXNwYWNlLFxuICAgICAgICBpbmxpbmVTdGFuZGFsb25lID0gc3RyaXAuaW5saW5lU3RhbmRhbG9uZSAmJiBfaXNQcmV2V2hpdGVzcGFjZSAmJiBfaXNOZXh0V2hpdGVzcGFjZTtcblxuICAgIGlmIChzdHJpcC5jbG9zZSkge1xuICAgICAgb21pdFJpZ2h0KGJvZHksIGksIHRydWUpO1xuICAgIH1cbiAgICBpZiAoc3RyaXAub3Blbikge1xuICAgICAgb21pdExlZnQoYm9keSwgaSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGlubGluZVN0YW5kYWxvbmUpIHtcbiAgICAgIG9taXRSaWdodChib2R5LCBpKTtcblxuICAgICAgaWYgKG9taXRMZWZ0KGJvZHksIGkpKSB7XG4gICAgICAgIC8vIElmIHdlIGFyZSBvbiBhIHN0YW5kYWxvbmUgbm9kZSwgc2F2ZSB0aGUgaW5kZW50IGluZm8gZm9yIHBhcnRpYWxzXG4gICAgICAgIGlmIChjdXJyZW50LnR5cGUgPT09ICdQYXJ0aWFsU3RhdGVtZW50Jykge1xuICAgICAgICAgIC8vIFB1bGwgb3V0IHRoZSB3aGl0ZXNwYWNlIGZyb20gdGhlIGZpbmFsIGxpbmVcbiAgICAgICAgICBjdXJyZW50LmluZGVudCA9IC8oWyBcXHRdKyQpLy5leGVjKGJvZHlbaSAtIDFdLm9yaWdpbmFsKVsxXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3BlblN0YW5kYWxvbmUpIHtcbiAgICAgIG9taXRSaWdodCgoY3VycmVudC5wcm9ncmFtIHx8IGN1cnJlbnQuaW52ZXJzZSkuYm9keSk7XG5cbiAgICAgIC8vIFN0cmlwIG91dCB0aGUgcHJldmlvdXMgY29udGVudCBub2RlIGlmIGl0J3Mgd2hpdGVzcGFjZSBvbmx5XG4gICAgICBvbWl0TGVmdChib2R5LCBpKTtcbiAgICB9XG4gICAgaWYgKGNsb3NlU3RhbmRhbG9uZSkge1xuICAgICAgLy8gQWx3YXlzIHN0cmlwIHRoZSBuZXh0IG5vZGVcbiAgICAgIG9taXRSaWdodChib2R5LCBpKTtcblxuICAgICAgb21pdExlZnQoKGN1cnJlbnQuaW52ZXJzZSB8fCBjdXJyZW50LnByb2dyYW0pLmJvZHkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcm9ncmFtO1xufTtcbldoaXRlc3BhY2VDb250cm9sLnByb3RvdHlwZS5CbG9ja1N0YXRlbWVudCA9IGZ1bmN0aW9uIChibG9jaykge1xuICB0aGlzLmFjY2VwdChibG9jay5wcm9ncmFtKTtcbiAgdGhpcy5hY2NlcHQoYmxvY2suaW52ZXJzZSk7XG5cbiAgLy8gRmluZCB0aGUgaW52ZXJzZSBwcm9ncmFtIHRoYXQgaXMgaW52b2xlZCB3aXRoIHdoaXRlc3BhY2Ugc3RyaXBwaW5nLlxuICB2YXIgcHJvZ3JhbSA9IGJsb2NrLnByb2dyYW0gfHwgYmxvY2suaW52ZXJzZSxcbiAgICAgIGludmVyc2UgPSBibG9jay5wcm9ncmFtICYmIGJsb2NrLmludmVyc2UsXG4gICAgICBmaXJzdEludmVyc2UgPSBpbnZlcnNlLFxuICAgICAgbGFzdEludmVyc2UgPSBpbnZlcnNlO1xuXG4gIGlmIChpbnZlcnNlICYmIGludmVyc2UuY2hhaW5lZCkge1xuICAgIGZpcnN0SW52ZXJzZSA9IGludmVyc2UuYm9keVswXS5wcm9ncmFtO1xuXG4gICAgLy8gV2FsayB0aGUgaW52ZXJzZSBjaGFpbiB0byBmaW5kIHRoZSBsYXN0IGludmVyc2UgdGhhdCBpcyBhY3R1YWxseSBpbiB0aGUgY2hhaW4uXG4gICAgd2hpbGUgKGxhc3RJbnZlcnNlLmNoYWluZWQpIHtcbiAgICAgIGxhc3RJbnZlcnNlID0gbGFzdEludmVyc2UuYm9keVtsYXN0SW52ZXJzZS5ib2R5Lmxlbmd0aCAtIDFdLnByb2dyYW07XG4gICAgfVxuICB9XG5cbiAgdmFyIHN0cmlwID0ge1xuICAgIG9wZW46IGJsb2NrLm9wZW5TdHJpcC5vcGVuLFxuICAgIGNsb3NlOiBibG9jay5jbG9zZVN0cmlwLmNsb3NlLFxuXG4gICAgLy8gRGV0ZXJtaW5lIHRoZSBzdGFuZGFsb25lIGNhbmRpYWN5LiBCYXNpY2FsbHkgZmxhZyBvdXIgY29udGVudCBhcyBiZWluZyBwb3NzaWJseSBzdGFuZGFsb25lXG4gICAgLy8gc28gb3VyIHBhcmVudCBjYW4gZGV0ZXJtaW5lIGlmIHdlIGFjdHVhbGx5IGFyZSBzdGFuZGFsb25lXG4gICAgb3BlblN0YW5kYWxvbmU6IGlzTmV4dFdoaXRlc3BhY2UocHJvZ3JhbS5ib2R5KSxcbiAgICBjbG9zZVN0YW5kYWxvbmU6IGlzUHJldldoaXRlc3BhY2UoKGZpcnN0SW52ZXJzZSB8fCBwcm9ncmFtKS5ib2R5KVxuICB9O1xuXG4gIGlmIChibG9jay5vcGVuU3RyaXAuY2xvc2UpIHtcbiAgICBvbWl0UmlnaHQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTtcbiAgfVxuXG4gIGlmIChpbnZlcnNlKSB7XG4gICAgdmFyIGludmVyc2VTdHJpcCA9IGJsb2NrLmludmVyc2VTdHJpcDtcblxuICAgIGlmIChpbnZlcnNlU3RyaXAub3Blbikge1xuICAgICAgb21pdExlZnQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAoaW52ZXJzZVN0cmlwLmNsb3NlKSB7XG4gICAgICBvbWl0UmlnaHQoZmlyc3RJbnZlcnNlLmJvZHksIG51bGwsIHRydWUpO1xuICAgIH1cbiAgICBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7XG4gICAgICBvbWl0TGVmdChsYXN0SW52ZXJzZS5ib2R5LCBudWxsLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHN0YW5kYWxvbmUgZWxzZSBzdGF0bWVudHNcbiAgICBpZiAoaXNQcmV2V2hpdGVzcGFjZShwcm9ncmFtLmJvZHkpICYmIGlzTmV4dFdoaXRlc3BhY2UoZmlyc3RJbnZlcnNlLmJvZHkpKSB7XG4gICAgICBvbWl0TGVmdChwcm9ncmFtLmJvZHkpO1xuICAgICAgb21pdFJpZ2h0KGZpcnN0SW52ZXJzZS5ib2R5KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoYmxvY2suY2xvc2VTdHJpcC5vcGVuKSB7XG4gICAgb21pdExlZnQocHJvZ3JhbS5ib2R5LCBudWxsLCB0cnVlKTtcbiAgfVxuXG4gIHJldHVybiBzdHJpcDtcbn07XG5cbldoaXRlc3BhY2VDb250cm9sLnByb3RvdHlwZS5NdXN0YWNoZVN0YXRlbWVudCA9IGZ1bmN0aW9uIChtdXN0YWNoZSkge1xuICByZXR1cm4gbXVzdGFjaGUuc3RyaXA7XG59O1xuXG5XaGl0ZXNwYWNlQ29udHJvbC5wcm90b3R5cGUuUGFydGlhbFN0YXRlbWVudCA9IFdoaXRlc3BhY2VDb250cm9sLnByb3RvdHlwZS5Db21tZW50U3RhdGVtZW50ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgdmFyIHN0cmlwID0gbm9kZS5zdHJpcCB8fCB7fTtcbiAgcmV0dXJuIHtcbiAgICBpbmxpbmVTdGFuZGFsb25lOiB0cnVlLFxuICAgIG9wZW46IHN0cmlwLm9wZW4sXG4gICAgY2xvc2U6IHN0cmlwLmNsb3NlXG4gIH07XG59O1xuXG5mdW5jdGlvbiBpc1ByZXZXaGl0ZXNwYWNlKGJvZHksIGksIGlzUm9vdCkge1xuICBpZiAoaSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaSA9IGJvZHkubGVuZ3RoO1xuICB9XG5cbiAgLy8gTm9kZXMgdGhhdCBlbmQgd2l0aCBuZXdsaW5lcyBhcmUgY29uc2lkZXJlZCB3aGl0ZXNwYWNlIChidXQgYXJlIHNwZWNpYWxcbiAgLy8gY2FzZWQgZm9yIHN0cmlwIG9wZXJhdGlvbnMpXG4gIHZhciBwcmV2ID0gYm9keVtpIC0gMV0sXG4gICAgICBzaWJsaW5nID0gYm9keVtpIC0gMl07XG4gIGlmICghcHJldikge1xuICAgIHJldHVybiBpc1Jvb3Q7XG4gIH1cblxuICBpZiAocHJldi50eXBlID09PSAnQ29udGVudFN0YXRlbWVudCcpIHtcbiAgICByZXR1cm4gKHNpYmxpbmcgfHwgIWlzUm9vdCA/IC9cXHI/XFxuXFxzKj8kLyA6IC8oXnxcXHI/XFxuKVxccyo/JC8pLnRlc3QocHJldi5vcmlnaW5hbCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzTmV4dFdoaXRlc3BhY2UoYm9keSwgaSwgaXNSb290KSB7XG4gIGlmIChpID09PSB1bmRlZmluZWQpIHtcbiAgICBpID0gLTE7XG4gIH1cblxuICB2YXIgbmV4dCA9IGJvZHlbaSArIDFdLFxuICAgICAgc2libGluZyA9IGJvZHlbaSArIDJdO1xuICBpZiAoIW5leHQpIHtcbiAgICByZXR1cm4gaXNSb290O1xuICB9XG5cbiAgaWYgKG5leHQudHlwZSA9PT0gJ0NvbnRlbnRTdGF0ZW1lbnQnKSB7XG4gICAgcmV0dXJuIChzaWJsaW5nIHx8ICFpc1Jvb3QgPyAvXlxccyo/XFxyP1xcbi8gOiAvXlxccyo/KFxccj9cXG58JCkvKS50ZXN0KG5leHQub3JpZ2luYWwpO1xuICB9XG59XG5cbi8vIE1hcmtzIHRoZSBub2RlIHRvIHRoZSByaWdodCBvZiB0aGUgcG9zaXRpb24gYXMgb21pdHRlZC5cbi8vIEkuZS4ge3tmb299fScgJyB3aWxsIG1hcmsgdGhlICcgJyBub2RlIGFzIG9taXR0ZWQuXG4vL1xuLy8gSWYgaSBpcyB1bmRlZmluZWQsIHRoZW4gdGhlIGZpcnN0IGNoaWxkIHdpbGwgYmUgbWFya2VkIGFzIHN1Y2guXG4vL1xuLy8gSWYgbXVsaXRwbGUgaXMgdHJ1dGh5IHRoZW4gYWxsIHdoaXRlc3BhY2Ugd2lsbCBiZSBzdHJpcHBlZCBvdXQgdW50aWwgbm9uLXdoaXRlc3BhY2Vcbi8vIGNvbnRlbnQgaXMgbWV0LlxuZnVuY3Rpb24gb21pdFJpZ2h0KGJvZHksIGksIG11bHRpcGxlKSB7XG4gIHZhciBjdXJyZW50ID0gYm9keVtpID09IG51bGwgPyAwIDogaSArIDFdO1xuICBpZiAoIWN1cnJlbnQgfHwgY3VycmVudC50eXBlICE9PSAnQ29udGVudFN0YXRlbWVudCcgfHwgIW11bHRpcGxlICYmIGN1cnJlbnQucmlnaHRTdHJpcHBlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBvcmlnaW5hbCA9IGN1cnJlbnQudmFsdWU7XG4gIGN1cnJlbnQudmFsdWUgPSBjdXJyZW50LnZhbHVlLnJlcGxhY2UobXVsdGlwbGUgPyAvXlxccysvIDogL15bIFxcdF0qXFxyP1xcbj8vLCAnJyk7XG4gIGN1cnJlbnQucmlnaHRTdHJpcHBlZCA9IGN1cnJlbnQudmFsdWUgIT09IG9yaWdpbmFsO1xufVxuXG4vLyBNYXJrcyB0aGUgbm9kZSB0byB0aGUgbGVmdCBvZiB0aGUgcG9zaXRpb24gYXMgb21pdHRlZC5cbi8vIEkuZS4gJyAne3tmb299fSB3aWxsIG1hcmsgdGhlICcgJyBub2RlIGFzIG9taXR0ZWQuXG4vL1xuLy8gSWYgaSBpcyB1bmRlZmluZWQgdGhlbiB0aGUgbGFzdCBjaGlsZCB3aWxsIGJlIG1hcmtlZCBhcyBzdWNoLlxuLy9cbi8vIElmIG11bGl0cGxlIGlzIHRydXRoeSB0aGVuIGFsbCB3aGl0ZXNwYWNlIHdpbGwgYmUgc3RyaXBwZWQgb3V0IHVudGlsIG5vbi13aGl0ZXNwYWNlXG4vLyBjb250ZW50IGlzIG1ldC5cbmZ1bmN0aW9uIG9taXRMZWZ0KGJvZHksIGksIG11bHRpcGxlKSB7XG4gIHZhciBjdXJyZW50ID0gYm9keVtpID09IG51bGwgPyBib2R5Lmxlbmd0aCAtIDEgOiBpIC0gMV07XG4gIGlmICghY3VycmVudCB8fCBjdXJyZW50LnR5cGUgIT09ICdDb250ZW50U3RhdGVtZW50JyB8fCAhbXVsdGlwbGUgJiYgY3VycmVudC5sZWZ0U3RyaXBwZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBXZSBvbWl0IHRoZSBsYXN0IG5vZGUgaWYgaXQncyB3aGl0ZXNwYWNlIG9ubHkgYW5kIG5vdCBwcmVjZWVkZWQgYnkgYSBub24tY29udGVudCBub2RlLlxuICB2YXIgb3JpZ2luYWwgPSBjdXJyZW50LnZhbHVlO1xuICBjdXJyZW50LnZhbHVlID0gY3VycmVudC52YWx1ZS5yZXBsYWNlKG11bHRpcGxlID8gL1xccyskLyA6IC9bIFxcdF0rJC8sICcnKTtcbiAgY3VycmVudC5sZWZ0U3RyaXBwZWQgPSBjdXJyZW50LnZhbHVlICE9PSBvcmlnaW5hbDtcbiAgcmV0dXJuIGN1cnJlbnQubGVmdFN0cmlwcGVkO1xufVxuXG5leHBvcnRzWydkZWZhdWx0J10gPSBXaGl0ZXNwYWNlQ29udHJvbDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIGVycm9yUHJvcHMgPSBbJ2Rlc2NyaXB0aW9uJywgJ2ZpbGVOYW1lJywgJ2xpbmVOdW1iZXInLCAnbWVzc2FnZScsICduYW1lJywgJ251bWJlcicsICdzdGFjayddO1xuXG5mdW5jdGlvbiBFeGNlcHRpb24obWVzc2FnZSwgbm9kZSkge1xuICB2YXIgbG9jID0gbm9kZSAmJiBub2RlLmxvYyxcbiAgICAgIGxpbmUgPSB1bmRlZmluZWQsXG4gICAgICBjb2x1bW4gPSB1bmRlZmluZWQ7XG4gIGlmIChsb2MpIHtcbiAgICBsaW5lID0gbG9jLnN0YXJ0LmxpbmU7XG4gICAgY29sdW1uID0gbG9jLnN0YXJ0LmNvbHVtbjtcblxuICAgIG1lc3NhZ2UgKz0gJyAtICcgKyBsaW5lICsgJzonICsgY29sdW1uO1xuICB9XG5cbiAgdmFyIHRtcCA9IEVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG1lc3NhZ2UpO1xuXG4gIC8vIFVuZm9ydHVuYXRlbHkgZXJyb3JzIGFyZSBub3QgZW51bWVyYWJsZSBpbiBDaHJvbWUgKGF0IGxlYXN0KSwgc28gYGZvciBwcm9wIGluIHRtcGAgZG9lc24ndCB3b3JrLlxuICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBlcnJvclByb3BzLmxlbmd0aDsgaWR4KyspIHtcbiAgICB0aGlzW2Vycm9yUHJvcHNbaWR4XV0gPSB0bXBbZXJyb3JQcm9wc1tpZHhdXTtcbiAgfVxuXG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEV4Y2VwdGlvbik7XG4gIH1cblxuICBpZiAobG9jKSB7XG4gICAgdGhpcy5saW5lTnVtYmVyID0gbGluZTtcbiAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjtcbiAgfVxufVxuXG5FeGNlcHRpb24ucHJvdG90eXBlID0gbmV3IEVycm9yKCk7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IEV4Y2VwdGlvbjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIihmdW5jdGlvbiAoZ2xvYmFsKXtcbid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbi8qZ2xvYmFsIHdpbmRvdyAqL1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoSGFuZGxlYmFycykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICB2YXIgcm9vdCA9IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogd2luZG93LFxuICAgICAgJEhhbmRsZWJhcnMgPSByb290LkhhbmRsZWJhcnM7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIEhhbmRsZWJhcnMubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocm9vdC5IYW5kbGViYXJzID09PSBIYW5kbGViYXJzKSB7XG4gICAgICByb290LkhhbmRsZWJhcnMgPSAkSGFuZGxlYmFycztcbiAgICB9XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcbn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMMjV2WkdWZmJXOWtkV3hsY3k5SVlXNWtiR1ZpWVhKekwyUnBjM1F2WTJwekwyaGhibVJzWldKaGNuTXZibTh0WTI5dVpteHBZM1F1YW5NaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWp0QlFVRkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVNJc0ltWnBiR1VpT2lKblpXNWxjbUYwWldRdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lKM1Z6WlNCemRISnBZM1FuTzF4dVhHNWxlSEJ2Y25SekxsOWZaWE5OYjJSMWJHVWdQU0IwY25WbE8xeHVMeXBuYkc5aVlXd2dkMmx1Wkc5M0lDb3ZYRzVjYm1WNGNHOXlkSE5iSjJSbFptRjFiSFFuWFNBOUlHWjFibU4wYVc5dUlDaElZVzVrYkdWaVlYSnpLU0I3WEc0Z0lDOHFJR2x6ZEdGdVluVnNJR2xuYm05eVpTQnVaWGgwSUNvdlhHNGdJSFpoY2lCeWIyOTBJRDBnZEhsd1pXOW1JR2RzYjJKaGJDQWhQVDBnSjNWdVpHVm1hVzVsWkNjZ1B5Qm5iRzlpWVd3Z09pQjNhVzVrYjNjc1hHNGdJQ0FnSUNBa1NHRnVaR3hsWW1GeWN5QTlJSEp2YjNRdVNHRnVaR3hsWW1GeWN6dGNiaUFnTHlvZ2FYTjBZVzVpZFd3Z2FXZHViM0psSUc1bGVIUWdLaTljYmlBZ1NHRnVaR3hsWW1GeWN5NXViME52Ym1ac2FXTjBJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUdsbUlDaHliMjkwTGtoaGJtUnNaV0poY25NZ1BUMDlJRWhoYm1Sc1pXSmhjbk1wSUh0Y2JpQWdJQ0FnSUhKdmIzUXVTR0Z1Wkd4bFltRnljeUE5SUNSSVlXNWtiR1ZpWVhKek8xeHVJQ0FnSUgxY2JpQWdmVHRjYm4wN1hHNWNibTF2WkhWc1pTNWxlSEJ2Y25SeklEMGdaWGh3YjNKMGMxc25aR1ZtWVhWc2RDZGRPeUpkZlE9PSIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9O1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5jaGVja1JldmlzaW9uID0gY2hlY2tSZXZpc2lvbjtcblxuLy8gVE9ETzogUmVtb3ZlIHRoaXMgbGluZSBhbmQgYnJlYWsgdXAgY29tcGlsZVBhcnRpYWxcblxuZXhwb3J0cy50ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuZXhwb3J0cy53cmFwUHJvZ3JhbSA9IHdyYXBQcm9ncmFtO1xuZXhwb3J0cy5yZXNvbHZlUGFydGlhbCA9IHJlc29sdmVQYXJ0aWFsO1xuZXhwb3J0cy5pbnZva2VQYXJ0aWFsID0gaW52b2tlUGFydGlhbDtcbmV4cG9ydHMubm9vcCA9IG5vb3A7XG5cbnZhciBfaW1wb3J0ID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG52YXIgVXRpbHMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfaW1wb3J0KTtcblxudmFyIF9FeGNlcHRpb24gPSByZXF1aXJlKCcuL2V4Y2VwdGlvbicpO1xuXG52YXIgX0V4Y2VwdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfRXhjZXB0aW9uKTtcblxudmFyIF9DT01QSUxFUl9SRVZJU0lPTiRSRVZJU0lPTl9DSEFOR0VTJGNyZWF0ZUZyYW1lID0gcmVxdWlyZSgnLi9iYXNlJyk7XG5cbmZ1bmN0aW9uIGNoZWNrUmV2aXNpb24oY29tcGlsZXJJbmZvKSB7XG4gIHZhciBjb21waWxlclJldmlzaW9uID0gY29tcGlsZXJJbmZvICYmIGNvbXBpbGVySW5mb1swXSB8fCAxLFxuICAgICAgY3VycmVudFJldmlzaW9uID0gX0NPTVBJTEVSX1JFVklTSU9OJFJFVklTSU9OX0NIQU5HRVMkY3JlYXRlRnJhbWUuQ09NUElMRVJfUkVWSVNJT047XG5cbiAgaWYgKGNvbXBpbGVyUmV2aXNpb24gIT09IGN1cnJlbnRSZXZpc2lvbikge1xuICAgIGlmIChjb21waWxlclJldmlzaW9uIDwgY3VycmVudFJldmlzaW9uKSB7XG4gICAgICB2YXIgcnVudGltZVZlcnNpb25zID0gX0NPTVBJTEVSX1JFVklTSU9OJFJFVklTSU9OX0NIQU5HRVMkY3JlYXRlRnJhbWUuUkVWSVNJT05fQ0hBTkdFU1tjdXJyZW50UmV2aXNpb25dLFxuICAgICAgICAgIGNvbXBpbGVyVmVyc2lvbnMgPSBfQ09NUElMRVJfUkVWSVNJT04kUkVWSVNJT05fQ0hBTkdFUyRjcmVhdGVGcmFtZS5SRVZJU0lPTl9DSEFOR0VTW2NvbXBpbGVyUmV2aXNpb25dO1xuICAgICAgdGhyb3cgbmV3IF9FeGNlcHRpb24yWydkZWZhdWx0J10oJ1RlbXBsYXRlIHdhcyBwcmVjb21waWxlZCB3aXRoIGFuIG9sZGVyIHZlcnNpb24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuICcgKyAnUGxlYXNlIHVwZGF0ZSB5b3VyIHByZWNvbXBpbGVyIHRvIGEgbmV3ZXIgdmVyc2lvbiAoJyArIHJ1bnRpbWVWZXJzaW9ucyArICcpIG9yIGRvd25ncmFkZSB5b3VyIHJ1bnRpbWUgdG8gYW4gb2xkZXIgdmVyc2lvbiAoJyArIGNvbXBpbGVyVmVyc2lvbnMgKyAnKS4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXNlIHRoZSBlbWJlZGRlZCB2ZXJzaW9uIGluZm8gc2luY2UgdGhlIHJ1bnRpbWUgZG9lc24ndCBrbm93IGFib3V0IHRoaXMgcmV2aXNpb24geWV0XG4gICAgICB0aHJvdyBuZXcgX0V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIEhhbmRsZWJhcnMgdGhhbiB0aGUgY3VycmVudCBydW50aW1lLiAnICsgJ1BsZWFzZSB1cGRhdGUgeW91ciBydW50aW1lIHRvIGEgbmV3ZXIgdmVyc2lvbiAoJyArIGNvbXBpbGVySW5mb1sxXSArICcpLicpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0ZW1wbGF0ZSh0ZW1wbGF0ZVNwZWMsIGVudikge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAoIWVudikge1xuICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKCdObyBlbnZpcm9ubWVudCBwYXNzZWQgdG8gdGVtcGxhdGUnKTtcbiAgfVxuICBpZiAoIXRlbXBsYXRlU3BlYyB8fCAhdGVtcGxhdGVTcGVjLm1haW4pIHtcbiAgICB0aHJvdyBuZXcgX0V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVW5rbm93biB0ZW1wbGF0ZSBvYmplY3Q6ICcgKyB0eXBlb2YgdGVtcGxhdGVTcGVjKTtcbiAgfVxuXG4gIC8vIE5vdGU6IFVzaW5nIGVudi5WTSByZWZlcmVuY2VzIHJhdGhlciB0aGFuIGxvY2FsIHZhciByZWZlcmVuY2VzIHRocm91Z2hvdXQgdGhpcyBzZWN0aW9uIHRvIGFsbG93XG4gIC8vIGZvciBleHRlcm5hbCB1c2VycyB0byBvdmVycmlkZSB0aGVzZSBhcyBwc3VlZG8tc3VwcG9ydGVkIEFQSXMuXG4gIGVudi5WTS5jaGVja1JldmlzaW9uKHRlbXBsYXRlU3BlYy5jb21waWxlcik7XG5cbiAgZnVuY3Rpb24gaW52b2tlUGFydGlhbFdyYXBwZXIocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmhhc2gpIHtcbiAgICAgIGNvbnRleHQgPSBVdGlscy5leHRlbmQoe30sIGNvbnRleHQsIG9wdGlvbnMuaGFzaCk7XG4gICAgfVxuXG4gICAgcGFydGlhbCA9IGVudi5WTS5yZXNvbHZlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpO1xuICAgIHZhciByZXN1bHQgPSBlbnYuVk0uaW52b2tlUGFydGlhbC5jYWxsKHRoaXMsIHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHJlc3VsdCA9PSBudWxsICYmIGVudi5jb21waWxlKSB7XG4gICAgICBvcHRpb25zLnBhcnRpYWxzW29wdGlvbnMubmFtZV0gPSBlbnYuY29tcGlsZShwYXJ0aWFsLCB0ZW1wbGF0ZVNwZWMuY29tcGlsZXJPcHRpb25zLCBlbnYpO1xuICAgICAgcmVzdWx0ID0gb3B0aW9ucy5wYXJ0aWFsc1tvcHRpb25zLm5hbWVdKGNvbnRleHQsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHtcbiAgICAgIGlmIChvcHRpb25zLmluZGVudCkge1xuICAgICAgICB2YXIgbGluZXMgPSByZXN1bHQuc3BsaXQoJ1xcbicpO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpbmVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIGlmICghbGluZXNbaV0gJiYgaSArIDEgPT09IGwpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxpbmVzW2ldID0gb3B0aW9ucy5pbmRlbnQgKyBsaW5lc1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgPSBsaW5lcy5qb2luKCdcXG4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKCdUaGUgcGFydGlhbCAnICsgb3B0aW9ucy5uYW1lICsgJyBjb3VsZCBub3QgYmUgY29tcGlsZWQgd2hlbiBydW5uaW5nIGluIHJ1bnRpbWUtb25seSBtb2RlJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gSnVzdCBhZGQgd2F0ZXJcbiAgdmFyIGNvbnRhaW5lciA9IHtcbiAgICBzdHJpY3Q6IGZ1bmN0aW9uIHN0cmljdChvYmosIG5hbWUpIHtcbiAgICAgIGlmICghKG5hbWUgaW4gb2JqKSkge1xuICAgICAgICB0aHJvdyBuZXcgX0V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnXCInICsgbmFtZSArICdcIiBub3QgZGVmaW5lZCBpbiAnICsgb2JqKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmpbbmFtZV07XG4gICAgfSxcbiAgICBsb29rdXA6IGZ1bmN0aW9uIGxvb2t1cChkZXB0aHMsIG5hbWUpIHtcbiAgICAgIHZhciBsZW4gPSBkZXB0aHMubGVuZ3RoO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoZGVwdGhzW2ldICYmIGRlcHRoc1tpXVtuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGRlcHRoc1tpXVtuYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgbGFtYmRhOiBmdW5jdGlvbiBsYW1iZGEoY3VycmVudCwgY29udGV4dCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBjdXJyZW50ID09PSAnZnVuY3Rpb24nID8gY3VycmVudC5jYWxsKGNvbnRleHQpIDogY3VycmVudDtcbiAgICB9LFxuXG4gICAgZXNjYXBlRXhwcmVzc2lvbjogVXRpbHMuZXNjYXBlRXhwcmVzc2lvbixcbiAgICBpbnZva2VQYXJ0aWFsOiBpbnZva2VQYXJ0aWFsV3JhcHBlcixcblxuICAgIGZuOiBmdW5jdGlvbiBmbihpKSB7XG4gICAgICByZXR1cm4gdGVtcGxhdGVTcGVjW2ldO1xuICAgIH0sXG5cbiAgICBwcm9ncmFtczogW10sXG4gICAgcHJvZ3JhbTogZnVuY3Rpb24gcHJvZ3JhbShpLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4gICAgICB2YXIgcHJvZ3JhbVdyYXBwZXIgPSB0aGlzLnByb2dyYW1zW2ldLFxuICAgICAgICAgIGZuID0gdGhpcy5mbihpKTtcbiAgICAgIGlmIChkYXRhIHx8IGRlcHRocyB8fCBibG9ja1BhcmFtcyB8fCBkZWNsYXJlZEJsb2NrUGFyYW1zKSB7XG4gICAgICAgIHByb2dyYW1XcmFwcGVyID0gd3JhcFByb2dyYW0odGhpcywgaSwgZm4sIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICAgICAgfSBlbHNlIGlmICghcHJvZ3JhbVdyYXBwZXIpIHtcbiAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB0aGlzLnByb2dyYW1zW2ldID0gd3JhcFByb2dyYW0odGhpcywgaSwgZm4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb2dyYW1XcmFwcGVyO1xuICAgIH0sXG5cbiAgICBkYXRhOiBmdW5jdGlvbiBkYXRhKHZhbHVlLCBkZXB0aCkge1xuICAgICAgd2hpbGUgKHZhbHVlICYmIGRlcHRoLS0pIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5fcGFyZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gICAgbWVyZ2U6IGZ1bmN0aW9uIG1lcmdlKHBhcmFtLCBjb21tb24pIHtcbiAgICAgIHZhciBvYmogPSBwYXJhbSB8fCBjb21tb247XG5cbiAgICAgIGlmIChwYXJhbSAmJiBjb21tb24gJiYgcGFyYW0gIT09IGNvbW1vbikge1xuICAgICAgICBvYmogPSBVdGlscy5leHRlbmQoe30sIGNvbW1vbiwgcGFyYW0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0sXG5cbiAgICBub29wOiBlbnYuVk0ubm9vcCxcbiAgICBjb21waWxlckluZm86IHRlbXBsYXRlU3BlYy5jb21waWxlclxuICB9O1xuXG4gIGZ1bmN0aW9uIHJldChjb250ZXh0KSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzFdO1xuXG4gICAgdmFyIGRhdGEgPSBvcHRpb25zLmRhdGE7XG5cbiAgICByZXQuX3NldHVwKG9wdGlvbnMpO1xuICAgIGlmICghb3B0aW9ucy5wYXJ0aWFsICYmIHRlbXBsYXRlU3BlYy51c2VEYXRhKSB7XG4gICAgICBkYXRhID0gaW5pdERhdGEoY29udGV4dCwgZGF0YSk7XG4gICAgfVxuICAgIHZhciBkZXB0aHMgPSB1bmRlZmluZWQsXG4gICAgICAgIGJsb2NrUGFyYW1zID0gdGVtcGxhdGVTcGVjLnVzZUJsb2NrUGFyYW1zID8gW10gOiB1bmRlZmluZWQ7XG4gICAgaWYgKHRlbXBsYXRlU3BlYy51c2VEZXB0aHMpIHtcbiAgICAgIGRlcHRocyA9IG9wdGlvbnMuZGVwdGhzID8gW2NvbnRleHRdLmNvbmNhdChvcHRpb25zLmRlcHRocykgOiBbY29udGV4dF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRlbXBsYXRlU3BlYy5tYWluLmNhbGwoY29udGFpbmVyLCBjb250ZXh0LCBjb250YWluZXIuaGVscGVycywgY29udGFpbmVyLnBhcnRpYWxzLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKTtcbiAgfVxuICByZXQuaXNUb3AgPSB0cnVlO1xuXG4gIHJldC5fc2V0dXAgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucy5wYXJ0aWFsKSB7XG4gICAgICBjb250YWluZXIuaGVscGVycyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLmhlbHBlcnMsIGVudi5oZWxwZXJzKTtcblxuICAgICAgaWYgKHRlbXBsYXRlU3BlYy51c2VQYXJ0aWFsKSB7XG4gICAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLnBhcnRpYWxzLCBlbnYucGFydGlhbHMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluZXIuaGVscGVycyA9IG9wdGlvbnMuaGVscGVycztcbiAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IG9wdGlvbnMucGFydGlhbHM7XG4gICAgfVxuICB9O1xuXG4gIHJldC5fY2hpbGQgPSBmdW5jdGlvbiAoaSwgZGF0YSwgYmxvY2tQYXJhbXMsIGRlcHRocykge1xuICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgJiYgIWJsb2NrUGFyYW1zKSB7XG4gICAgICB0aHJvdyBuZXcgX0V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnbXVzdCBwYXNzIGJsb2NrIHBhcmFtcycpO1xuICAgIH1cbiAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocyAmJiAhZGVwdGhzKSB7XG4gICAgICB0aHJvdyBuZXcgX0V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnbXVzdCBwYXNzIHBhcmVudCBkZXB0aHMnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd3JhcFByb2dyYW0oY29udGFpbmVyLCBpLCB0ZW1wbGF0ZVNwZWNbaV0sIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICB9O1xuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIGZuLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4gIGZ1bmN0aW9uIHByb2coY29udGV4dCkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sxXTtcblxuICAgIHJldHVybiBmbi5jYWxsKGNvbnRhaW5lciwgY29udGV4dCwgY29udGFpbmVyLmhlbHBlcnMsIGNvbnRhaW5lci5wYXJ0aWFscywgb3B0aW9ucy5kYXRhIHx8IGRhdGEsIGJsb2NrUGFyYW1zICYmIFtvcHRpb25zLmJsb2NrUGFyYW1zXS5jb25jYXQoYmxvY2tQYXJhbXMpLCBkZXB0aHMgJiYgW2NvbnRleHRdLmNvbmNhdChkZXB0aHMpKTtcbiAgfVxuICBwcm9nLnByb2dyYW0gPSBpO1xuICBwcm9nLmRlcHRoID0gZGVwdGhzID8gZGVwdGhzLmxlbmd0aCA6IDA7XG4gIHByb2cuYmxvY2tQYXJhbXMgPSBkZWNsYXJlZEJsb2NrUGFyYW1zIHx8IDA7XG4gIHJldHVybiBwcm9nO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7XG4gIGlmICghcGFydGlhbCkge1xuICAgIHBhcnRpYWwgPSBvcHRpb25zLnBhcnRpYWxzW29wdGlvbnMubmFtZV07XG4gIH0gZWxzZSBpZiAoIXBhcnRpYWwuY2FsbCAmJiAhb3B0aW9ucy5uYW1lKSB7XG4gICAgLy8gVGhpcyBpcyBhIGR5bmFtaWMgcGFydGlhbCB0aGF0IHJldHVybmVkIGEgc3RyaW5nXG4gICAgb3B0aW9ucy5uYW1lID0gcGFydGlhbDtcbiAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1twYXJ0aWFsXTtcbiAgfVxuICByZXR1cm4gcGFydGlhbDtcbn1cblxuZnVuY3Rpb24gaW52b2tlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMucGFydGlhbCA9IHRydWU7XG5cbiAgaWYgKHBhcnRpYWwgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBfRXhjZXB0aW9uMlsnZGVmYXVsdCddKCdUaGUgcGFydGlhbCAnICsgb3B0aW9ucy5uYW1lICsgJyBjb3VsZCBub3QgYmUgZm91bmQnKTtcbiAgfSBlbHNlIGlmIChwYXJ0aWFsIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gcGFydGlhbChjb250ZXh0LCBvcHRpb25zKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub29wKCkge1xuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGluaXREYXRhKGNvbnRleHQsIGRhdGEpIHtcbiAgaWYgKCFkYXRhIHx8ICEoJ3Jvb3QnIGluIGRhdGEpKSB7XG4gICAgZGF0YSA9IGRhdGEgPyBfQ09NUElMRVJfUkVWSVNJT04kUkVWSVNJT05fQ0hBTkdFUyRjcmVhdGVGcmFtZS5jcmVhdGVGcmFtZShkYXRhKSA6IHt9O1xuICAgIGRhdGEucm9vdCA9IGNvbnRleHQ7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuLy8gQnVpbGQgb3V0IG91ciBiYXNpYyBTYWZlU3RyaW5nIHR5cGVcbmZ1bmN0aW9uIFNhZmVTdHJpbmcoc3RyaW5nKSB7XG4gIHRoaXMuc3RyaW5nID0gc3RyaW5nO1xufVxuXG5TYWZlU3RyaW5nLnByb3RvdHlwZS50b1N0cmluZyA9IFNhZmVTdHJpbmcucHJvdG90eXBlLnRvSFRNTCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICcnICsgdGhpcy5zdHJpbmc7XG59O1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBTYWZlU3RyaW5nO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5leHRlbmQgPSBleHRlbmQ7XG5cbi8vIE9sZGVyIElFIHZlcnNpb25zIGRvIG5vdCBkaXJlY3RseSBzdXBwb3J0IGluZGV4T2Ygc28gd2UgbXVzdCBpbXBsZW1lbnQgb3VyIG93biwgc2FkbHkuXG5leHBvcnRzLmluZGV4T2YgPSBpbmRleE9mO1xuZXhwb3J0cy5lc2NhcGVFeHByZXNzaW9uID0gZXNjYXBlRXhwcmVzc2lvbjtcbmV4cG9ydHMuaXNFbXB0eSA9IGlzRW1wdHk7XG5leHBvcnRzLmJsb2NrUGFyYW1zID0gYmxvY2tQYXJhbXM7XG5leHBvcnRzLmFwcGVuZENvbnRleHRQYXRoID0gYXBwZW5kQ29udGV4dFBhdGg7XG52YXIgZXNjYXBlID0ge1xuICAnJic6ICcmYW1wOycsXG4gICc8JzogJyZsdDsnLFxuICAnPic6ICcmZ3Q7JyxcbiAgJ1wiJzogJyZxdW90OycsXG4gICdcXCcnOiAnJiN4Mjc7JyxcbiAgJ2AnOiAnJiN4NjA7J1xufTtcblxudmFyIGJhZENoYXJzID0gL1smPD5cIidgXS9nLFxuICAgIHBvc3NpYmxlID0gL1smPD5cIidgXS87XG5cbmZ1bmN0aW9uIGVzY2FwZUNoYXIoY2hyKSB7XG4gIHJldHVybiBlc2NhcGVbY2hyXTtcbn1cblxuZnVuY3Rpb24gZXh0ZW5kKG9iaiAvKiAsIC4uLnNvdXJjZSAqLykge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGZvciAodmFyIGtleSBpbiBhcmd1bWVudHNbaV0pIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXJndW1lbnRzW2ldLCBrZXkpKSB7XG4gICAgICAgIG9ialtrZXldID0gYXJndW1lbnRzW2ldW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuZXhwb3J0cy50b1N0cmluZyA9IHRvU3RyaW5nO1xuLy8gU291cmNlZCBmcm9tIGxvZGFzaFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Jlc3RpZWpzL2xvZGFzaC9ibG9iL21hc3Rlci9MSUNFTlNFLnR4dFxuLyplc2xpbnQtZGlzYWJsZSBmdW5jLXN0eWxlLCBuby12YXIgKi9cbnZhciBpc0Z1bmN0aW9uID0gZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufTtcbi8vIGZhbGxiYWNrIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBDaHJvbWUgYW5kIFNhZmFyaVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmlmIChpc0Z1bmN0aW9uKC94LykpIHtcbiAgZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgJiYgdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG4gIH07XG59XG52YXIgaXNGdW5jdGlvbjtcbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG4vKmVzbGludC1lbmFibGUgZnVuYy1zdHlsZSwgbm8tdmFyICovXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEFycmF5XScgOiBmYWxzZTtcbn07ZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgdmFsdWUpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGFycmF5W2ldID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHtcbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2FmZVxuICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLnRvSFRNTCkge1xuICAgICAgcmV0dXJuIHN0cmluZy50b0hUTUwoKTtcbiAgICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSBlbHNlIGlmICghc3RyaW5nKSB7XG4gICAgICByZXR1cm4gc3RyaW5nICsgJyc7XG4gICAgfVxuXG4gICAgLy8gRm9yY2UgYSBzdHJpbmcgY29udmVyc2lvbiBhcyB0aGlzIHdpbGwgYmUgZG9uZSBieSB0aGUgYXBwZW5kIHJlZ2FyZGxlc3MgYW5kXG4gICAgLy8gdGhlIHJlZ2V4IHRlc3Qgd2lsbCBkbyB0aGlzIHRyYW5zcGFyZW50bHkgYmVoaW5kIHRoZSBzY2VuZXMsIGNhdXNpbmcgaXNzdWVzIGlmXG4gICAgLy8gYW4gb2JqZWN0J3MgdG8gc3RyaW5nIGhhcyBlc2NhcGVkIGNoYXJhY3RlcnMgaW4gaXQuXG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmc7XG4gIH1cblxuICBpZiAoIXBvc3NpYmxlLnRlc3Qoc3RyaW5nKSkge1xuICAgIHJldHVybiBzdHJpbmc7XG4gIH1cbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKGJhZENoYXJzLCBlc2NhcGVDaGFyKTtcbn1cblxuZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJsb2NrUGFyYW1zKHBhcmFtcywgaWRzKSB7XG4gIHBhcmFtcy5wYXRoID0gaWRzO1xuICByZXR1cm4gcGFyYW1zO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRDb250ZXh0UGF0aChjb250ZXh0UGF0aCwgaWQpIHtcbiAgcmV0dXJuIChjb250ZXh0UGF0aCA/IGNvbnRleHRQYXRoICsgJy4nIDogJycpICsgaWQ7XG59IiwiLy8gVVNBR0U6XG4vLyB2YXIgaGFuZGxlYmFycyA9IHJlcXVpcmUoJ2hhbmRsZWJhcnMnKTtcbi8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuXG4vLyB2YXIgbG9jYWwgPSBoYW5kbGViYXJzLmNyZWF0ZSgpO1xuXG52YXIgaGFuZGxlYmFycyA9IHJlcXVpcmUoJy4uL2Rpc3QvY2pzL2hhbmRsZWJhcnMnKVsnZGVmYXVsdCddO1xuXG52YXIgcHJpbnRlciA9IHJlcXVpcmUoJy4uL2Rpc3QvY2pzL2hhbmRsZWJhcnMvY29tcGlsZXIvcHJpbnRlcicpO1xuaGFuZGxlYmFycy5QcmludFZpc2l0b3IgPSBwcmludGVyLlByaW50VmlzaXRvcjtcbmhhbmRsZWJhcnMucHJpbnQgPSBwcmludGVyLnByaW50O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGhhbmRsZWJhcnM7XG5cbi8vIFB1Ymxpc2ggYSBOb2RlLmpzIHJlcXVpcmUoKSBoYW5kbGVyIGZvciAuaGFuZGxlYmFycyBhbmQgLmhicyBmaWxlc1xuZnVuY3Rpb24gZXh0ZW5zaW9uKG1vZHVsZSwgZmlsZW5hbWUpIHtcbiAgdmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcbiAgdmFyIHRlbXBsYXRlU3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGZpbGVuYW1lLCAndXRmOCcpO1xuICBtb2R1bGUuZXhwb3J0cyA9IGhhbmRsZWJhcnMuY29tcGlsZSh0ZW1wbGF0ZVN0cmluZyk7XG59XG4vKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuaWYgKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJyAmJiByZXF1aXJlLmV4dGVuc2lvbnMpIHtcbiAgcmVxdWlyZS5leHRlbnNpb25zWycuaGFuZGxlYmFycyddID0gZXh0ZW5zaW9uO1xuICByZXF1aXJlLmV4dGVuc2lvbnNbJy5oYnMnXSA9IGV4dGVuc2lvbjtcbn1cbiIsIihmdW5jdGlvbiAocHJvY2VzcyxfX2ZpbGVuYW1lKXtcbi8qKiB2aW06IGV0OnRzPTQ6c3c9NDpzdHM9NFxuICogQGxpY2Vuc2UgYW1kZWZpbmUgMS4wLjEgQ29weXJpZ2h0IChjKSAyMDExLTIwMTYsIFRoZSBEb2pvIEZvdW5kYXRpb24gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIEF2YWlsYWJsZSB2aWEgdGhlIE1JVCBvciBuZXcgQlNEIGxpY2Vuc2UuXG4gKiBzZWU6IGh0dHA6Ly9naXRodWIuY29tL2pyYnVya2UvYW1kZWZpbmUgZm9yIGRldGFpbHNcbiAqL1xuXG4vKmpzbGludCBub2RlOiB0cnVlICovXG4vKmdsb2JhbCBtb2R1bGUsIHByb2Nlc3MgKi9cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVmaW5lIGZvciBub2RlLlxuICogQHBhcmFtIHtPYmplY3R9IG1vZHVsZSB0aGUgXCJtb2R1bGVcIiBvYmplY3QgdGhhdCBpcyBkZWZpbmVkIGJ5IE5vZGUgZm9yIHRoZVxuICogY3VycmVudCBtb2R1bGUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmVxdWlyZUZuXS4gTm9kZSdzIHJlcXVpcmUgZnVuY3Rpb24gZm9yIHRoZSBjdXJyZW50IG1vZHVsZS5cbiAqIEl0IG9ubHkgbmVlZHMgdG8gYmUgcGFzc2VkIGluIE5vZGUgdmVyc2lvbnMgYmVmb3JlIDAuNSwgd2hlbiBtb2R1bGUucmVxdWlyZVxuICogZGlkIG5vdCBleGlzdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gYSBkZWZpbmUgZnVuY3Rpb24gdGhhdCBpcyB1c2FibGUgZm9yIHRoZSBjdXJyZW50IG5vZGVcbiAqIG1vZHVsZS5cbiAqL1xuZnVuY3Rpb24gYW1kZWZpbmUobW9kdWxlLCByZXF1aXJlRm4pIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgdmFyIGRlZmluZUNhY2hlID0ge30sXG4gICAgICAgIGxvYWRlckNhY2hlID0ge30sXG4gICAgICAgIGFscmVhZHlDYWxsZWQgPSBmYWxzZSxcbiAgICAgICAgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKSxcbiAgICAgICAgbWFrZVJlcXVpcmUsIHN0cmluZ1JlcXVpcmU7XG5cbiAgICAvKipcbiAgICAgKiBUcmltcyB0aGUgLiBhbmQgLi4gZnJvbSBhbiBhcnJheSBvZiBwYXRoIHNlZ21lbnRzLlxuICAgICAqIEl0IHdpbGwga2VlcCBhIGxlYWRpbmcgcGF0aCBzZWdtZW50IGlmIGEgLi4gd2lsbCBiZWNvbWVcbiAgICAgKiB0aGUgZmlyc3QgcGF0aCBzZWdtZW50LCB0byBoZWxwIHdpdGggbW9kdWxlIG5hbWUgbG9va3VwcyxcbiAgICAgKiB3aGljaCBhY3QgbGlrZSBwYXRocywgYnV0IGNhbiBiZSByZW1hcHBlZC4gQnV0IHRoZSBlbmQgcmVzdWx0LFxuICAgICAqIGFsbCBwYXRocyB0aGF0IHVzZSB0aGlzIGZ1bmN0aW9uIHNob3VsZCBsb29rIG5vcm1hbGl6ZWQuXG4gICAgICogTk9URTogdGhpcyBtZXRob2QgTU9ESUZJRVMgdGhlIGlucHV0IGFycmF5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyeSB0aGUgYXJyYXkgb2YgcGF0aCBzZWdtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmltRG90cyhhcnkpIHtcbiAgICAgICAgdmFyIGksIHBhcnQ7XG4gICAgICAgIGZvciAoaSA9IDA7IGFyeVtpXTsgaSs9IDEpIHtcbiAgICAgICAgICAgIHBhcnQgPSBhcnlbaV07XG4gICAgICAgICAgICBpZiAocGFydCA9PT0gJy4nKSB7XG4gICAgICAgICAgICAgICAgYXJ5LnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICBpIC09IDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQgPT09ICcuLicpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMSAmJiAoYXJ5WzJdID09PSAnLi4nIHx8IGFyeVswXSA9PT0gJy4uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9FbmQgb2YgdGhlIGxpbmUuIEtlZXAgYXQgbGVhc3Qgb25lIG5vbi1kb3RcbiAgICAgICAgICAgICAgICAgICAgLy9wYXRoIHNlZ21lbnQgYXQgdGhlIGZyb250IHNvIGl0IGNhbiBiZSBtYXBwZWRcbiAgICAgICAgICAgICAgICAgICAgLy9jb3JyZWN0bHkgdG8gZGlzay4gT3RoZXJ3aXNlLCB0aGVyZSBpcyBsaWtlbHlcbiAgICAgICAgICAgICAgICAgICAgLy9ubyBwYXRoIG1hcHBpbmcgZm9yIGEgcGF0aCBzdGFydGluZyB3aXRoICcuLicuXG4gICAgICAgICAgICAgICAgICAgIC8vVGhpcyBjYW4gc3RpbGwgZmFpbCwgYnV0IGNhdGNoZXMgdGhlIG1vc3QgcmVhc29uYWJsZVxuICAgICAgICAgICAgICAgICAgICAvL3VzZXMgb2YgLi5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBhcnkuc3BsaWNlKGkgLSAxLCAyKTtcbiAgICAgICAgICAgICAgICAgICAgaSAtPSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZShuYW1lLCBiYXNlTmFtZSkge1xuICAgICAgICB2YXIgYmFzZVBhcnRzO1xuXG4gICAgICAgIC8vQWRqdXN0IGFueSByZWxhdGl2ZSBwYXRocy5cbiAgICAgICAgaWYgKG5hbWUgJiYgbmFtZS5jaGFyQXQoMCkgPT09ICcuJykge1xuICAgICAgICAgICAgLy9JZiBoYXZlIGEgYmFzZSBuYW1lLCB0cnkgdG8gbm9ybWFsaXplIGFnYWluc3QgaXQsXG4gICAgICAgICAgICAvL290aGVyd2lzZSwgYXNzdW1lIGl0IGlzIGEgdG9wLWxldmVsIHJlcXVpcmUgdGhhdCB3aWxsXG4gICAgICAgICAgICAvL2JlIHJlbGF0aXZlIHRvIGJhc2VVcmwgaW4gdGhlIGVuZC5cbiAgICAgICAgICAgIGlmIChiYXNlTmFtZSkge1xuICAgICAgICAgICAgICAgIGJhc2VQYXJ0cyA9IGJhc2VOYW1lLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICAgICAgYmFzZVBhcnRzID0gYmFzZVBhcnRzLnNsaWNlKDAsIGJhc2VQYXJ0cy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICBiYXNlUGFydHMgPSBiYXNlUGFydHMuY29uY2F0KG5hbWUuc3BsaXQoJy8nKSk7XG4gICAgICAgICAgICAgICAgdHJpbURvdHMoYmFzZVBhcnRzKTtcbiAgICAgICAgICAgICAgICBuYW1lID0gYmFzZVBhcnRzLmpvaW4oJy8nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSB0aGUgbm9ybWFsaXplKCkgZnVuY3Rpb24gcGFzc2VkIHRvIGEgbG9hZGVyIHBsdWdpbidzXG4gICAgICogbm9ybWFsaXplIG1ldGhvZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYWtlTm9ybWFsaXplKHJlbE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplKG5hbWUsIHJlbE5hbWUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VMb2FkKGlkKSB7XG4gICAgICAgIGZ1bmN0aW9uIGxvYWQodmFsdWUpIHtcbiAgICAgICAgICAgIGxvYWRlckNhY2hlW2lkXSA9IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9hZC5mcm9tVGV4dCA9IGZ1bmN0aW9uIChpZCwgdGV4dCkge1xuICAgICAgICAgICAgLy9UaGlzIG9uZSBpcyBkaWZmaWN1bHQgYmVjYXVzZSB0aGUgdGV4dCBjYW4vcHJvYmFibHkgdXNlc1xuICAgICAgICAgICAgLy9kZWZpbmUsIGFuZCBhbnkgcmVsYXRpdmUgcGF0aHMgYW5kIHJlcXVpcmVzIHNob3VsZCBiZSByZWxhdGl2ZVxuICAgICAgICAgICAgLy90byB0aGF0IGlkIHdhcyBpdCB3b3VsZCBiZSBmb3VuZCBvbiBkaXNrLiBCdXQgdGhpcyB3b3VsZCByZXF1aXJlXG4gICAgICAgICAgICAvL2Jvb3RzdHJhcHBpbmcgYSBtb2R1bGUvcmVxdWlyZSBmYWlybHkgZGVlcGx5IGZyb20gbm9kZSBjb3JlLlxuICAgICAgICAgICAgLy9Ob3Qgc3VyZSBob3cgYmVzdCB0byBnbyBhYm91dCB0aGF0IHlldC5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYW1kZWZpbmUgZG9lcyBub3QgaW1wbGVtZW50IGxvYWQuZnJvbVRleHQnKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbG9hZDtcbiAgICB9XG5cbiAgICBtYWtlUmVxdWlyZSA9IGZ1bmN0aW9uIChzeXN0ZW1SZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUsIHJlbElkKSB7XG4gICAgICAgIGZ1bmN0aW9uIGFtZFJlcXVpcmUoZGVwcywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZGVwcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAvL1N5bmNocm9ub3VzLCBzaW5nbGUgbW9kdWxlIHJlcXVpcmUoJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1JlcXVpcmUoc3lzdGVtUmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlLCBkZXBzLCByZWxJZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vQXJyYXkgb2YgZGVwZW5kZW5jaWVzIHdpdGggYSBjYWxsYmFjay5cblxuICAgICAgICAgICAgICAgIC8vQ29udmVydCB0aGUgZGVwZW5kZW5jaWVzIHRvIG1vZHVsZXMuXG4gICAgICAgICAgICAgICAgZGVwcyA9IGRlcHMubWFwKGZ1bmN0aW9uIChkZXBOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmdSZXF1aXJlKHN5c3RlbVJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSwgZGVwTmFtZSwgcmVsSWQpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy9XYWl0IGZvciBuZXh0IHRpY2sgdG8gY2FsbCBiYWNrIHRoZSByZXF1aXJlIGNhbGwuXG4gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgZGVwcyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGFtZFJlcXVpcmUudG9VcmwgPSBmdW5jdGlvbiAoZmlsZVBhdGgpIHtcbiAgICAgICAgICAgIGlmIChmaWxlUGF0aC5pbmRleE9mKCcuJykgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplKGZpbGVQYXRoLCBwYXRoLmRpcm5hbWUobW9kdWxlLmZpbGVuYW1lKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmaWxlUGF0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gYW1kUmVxdWlyZTtcbiAgICB9O1xuXG4gICAgLy9GYXZvciBleHBsaWNpdCB2YWx1ZSwgcGFzc2VkIGluIGlmIHRoZSBtb2R1bGUgd2FudHMgdG8gc3VwcG9ydCBOb2RlIDAuNC5cbiAgICByZXF1aXJlRm4gPSByZXF1aXJlRm4gfHwgZnVuY3Rpb24gcmVxKCkge1xuICAgICAgICByZXR1cm4gbW9kdWxlLnJlcXVpcmUuYXBwbHkobW9kdWxlLCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBydW5GYWN0b3J5KGlkLCBkZXBzLCBmYWN0b3J5KSB7XG4gICAgICAgIHZhciByLCBlLCBtLCByZXN1bHQ7XG5cbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICBlID0gbG9hZGVyQ2FjaGVbaWRdID0ge307XG4gICAgICAgICAgICBtID0ge1xuICAgICAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgICAgICB1cmk6IF9fZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgZXhwb3J0czogZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHIgPSBtYWtlUmVxdWlyZShyZXF1aXJlRm4sIGUsIG0sIGlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vT25seSBzdXBwb3J0IG9uZSBkZWZpbmUgY2FsbCBwZXIgZmlsZVxuICAgICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FtZGVmaW5lIHdpdGggbm8gbW9kdWxlIElEIGNhbm5vdCBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UgcGVyIGZpbGUuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy9Vc2UgdGhlIHJlYWwgdmFyaWFibGVzIGZyb20gbm9kZVxuICAgICAgICAgICAgLy9Vc2UgbW9kdWxlLmV4cG9ydHMgZm9yIGV4cG9ydHMsIHNpbmNlXG4gICAgICAgICAgICAvL3RoZSBleHBvcnRzIGluIGhlcmUgaXMgYW1kZWZpbmUgZXhwb3J0cy5cbiAgICAgICAgICAgIGUgPSBtb2R1bGUuZXhwb3J0cztcbiAgICAgICAgICAgIG0gPSBtb2R1bGU7XG4gICAgICAgICAgICByID0gbWFrZVJlcXVpcmUocmVxdWlyZUZuLCBlLCBtLCBtb2R1bGUuaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9JZiB0aGVyZSBhcmUgZGVwZW5kZW5jaWVzLCB0aGV5IGFyZSBzdHJpbmdzLCBzbyBuZWVkXG4gICAgICAgIC8vdG8gY29udmVydCB0aGVtIHRvIGRlcGVuZGVuY3kgdmFsdWVzLlxuICAgICAgICBpZiAoZGVwcykge1xuICAgICAgICAgICAgZGVwcyA9IGRlcHMubWFwKGZ1bmN0aW9uIChkZXBOYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHIoZGVwTmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vQ2FsbCB0aGUgZmFjdG9yeSB3aXRoIHRoZSByaWdodCBkZXBlbmRlbmNpZXMuXG4gICAgICAgIGlmICh0eXBlb2YgZmFjdG9yeSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmVzdWx0ID0gZmFjdG9yeS5hcHBseShtLmV4cG9ydHMsIGRlcHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gZmFjdG9yeTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbS5leHBvcnRzID0gcmVzdWx0O1xuICAgICAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICAgICAgbG9hZGVyQ2FjaGVbaWRdID0gbS5leHBvcnRzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RyaW5nUmVxdWlyZSA9IGZ1bmN0aW9uIChzeXN0ZW1SZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUsIGlkLCByZWxJZCkge1xuICAgICAgICAvL1NwbGl0IHRoZSBJRCBieSBhICEgc28gdGhhdFxuICAgICAgICB2YXIgaW5kZXggPSBpZC5pbmRleE9mKCchJyksXG4gICAgICAgICAgICBvcmlnaW5hbElkID0gaWQsXG4gICAgICAgICAgICBwcmVmaXgsIHBsdWdpbjtcblxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICBpZCA9IG5vcm1hbGl6ZShpZCwgcmVsSWQpO1xuXG4gICAgICAgICAgICAvL1N0cmFpZ2h0IG1vZHVsZSBsb29rdXAuIElmIGl0IGlzIG9uZSBvZiB0aGUgc3BlY2lhbCBkZXBlbmRlbmNpZXMsXG4gICAgICAgICAgICAvL2RlYWwgd2l0aCBpdCwgb3RoZXJ3aXNlLCBkZWxlZ2F0ZSB0byBub2RlLlxuICAgICAgICAgICAgaWYgKGlkID09PSAncmVxdWlyZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFrZVJlcXVpcmUoc3lzdGVtUmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlLCByZWxJZCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlkID09PSAnZXhwb3J0cycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwb3J0cztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQgPT09ICdtb2R1bGUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobG9hZGVyQ2FjaGUuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRlckNhY2hlW2lkXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVmaW5lQ2FjaGVbaWRdKSB7XG4gICAgICAgICAgICAgICAgcnVuRmFjdG9yeS5hcHBseShudWxsLCBkZWZpbmVDYWNoZVtpZF0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBsb2FkZXJDYWNoZVtpZF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmKHN5c3RlbVJlcXVpcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN5c3RlbVJlcXVpcmUob3JpZ2luYWxJZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBtb2R1bGUgd2l0aCBJRDogJyArIGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL1RoZXJlIGlzIGEgcGx1Z2luIGluIHBsYXkuXG4gICAgICAgICAgICBwcmVmaXggPSBpZC5zdWJzdHJpbmcoMCwgaW5kZXgpO1xuICAgICAgICAgICAgaWQgPSBpZC5zdWJzdHJpbmcoaW5kZXggKyAxLCBpZC5sZW5ndGgpO1xuXG4gICAgICAgICAgICBwbHVnaW4gPSBzdHJpbmdSZXF1aXJlKHN5c3RlbVJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSwgcHJlZml4LCByZWxJZCk7XG5cbiAgICAgICAgICAgIGlmIChwbHVnaW4ubm9ybWFsaXplKSB7XG4gICAgICAgICAgICAgICAgaWQgPSBwbHVnaW4ubm9ybWFsaXplKGlkLCBtYWtlTm9ybWFsaXplKHJlbElkKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplIHRoZSBJRCBub3JtYWxseS5cbiAgICAgICAgICAgICAgICBpZCA9IG5vcm1hbGl6ZShpZCwgcmVsSWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobG9hZGVyQ2FjaGVbaWRdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRlckNhY2hlW2lkXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGx1Z2luLmxvYWQoaWQsIG1ha2VSZXF1aXJlKHN5c3RlbVJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSwgcmVsSWQpLCBtYWtlTG9hZChpZCksIHt9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBsb2FkZXJDYWNoZVtpZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy9DcmVhdGUgYSBkZWZpbmUgZnVuY3Rpb24gc3BlY2lmaWMgdG8gdGhlIG1vZHVsZSBhc2tpbmcgZm9yIGFtZGVmaW5lLlxuICAgIGZ1bmN0aW9uIGRlZmluZShpZCwgZGVwcywgZmFjdG9yeSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpZCkpIHtcbiAgICAgICAgICAgIGZhY3RvcnkgPSBkZXBzO1xuICAgICAgICAgICAgZGVwcyA9IGlkO1xuICAgICAgICAgICAgaWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZmFjdG9yeSA9IGlkO1xuICAgICAgICAgICAgaWQgPSBkZXBzID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlcHMgJiYgIUFycmF5LmlzQXJyYXkoZGVwcykpIHtcbiAgICAgICAgICAgIGZhY3RvcnkgPSBkZXBzO1xuICAgICAgICAgICAgZGVwcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGVwcykge1xuICAgICAgICAgICAgZGVwcyA9IFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZSddO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9TZXQgdXAgcHJvcGVydGllcyBmb3IgdGhpcyBtb2R1bGUuIElmIGFuIElELCB0aGVuIHVzZVxuICAgICAgICAvL2ludGVybmFsIGNhY2hlLiBJZiBubyBJRCwgdGhlbiB1c2UgdGhlIGV4dGVybmFsIHZhcmlhYmxlc1xuICAgICAgICAvL2ZvciB0aGlzIG5vZGUgbW9kdWxlLlxuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIC8vUHV0IHRoZSBtb2R1bGUgaW4gZGVlcCBmcmVlemUgdW50aWwgdGhlcmUgaXMgYVxuICAgICAgICAgICAgLy9yZXF1aXJlIGNhbGwgZm9yIGl0LlxuICAgICAgICAgICAgZGVmaW5lQ2FjaGVbaWRdID0gW2lkLCBkZXBzLCBmYWN0b3J5XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJ1bkZhY3RvcnkoaWQsIGRlcHMsIGZhY3RvcnkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy9kZWZpbmUucmVxdWlyZSwgd2hpY2ggaGFzIGFjY2VzcyB0byBhbGwgdGhlIHZhbHVlcyBpbiB0aGVcbiAgICAvL2NhY2hlLiBVc2VmdWwgZm9yIEFNRCBtb2R1bGVzIHRoYXQgYWxsIGhhdmUgSURzIGluIHRoZSBmaWxlLFxuICAgIC8vYnV0IG5lZWQgdG8gZmluYWxseSBleHBvcnQgYSB2YWx1ZSB0byBub2RlIGJhc2VkIG9uIG9uZSBvZiB0aG9zZVxuICAgIC8vSURzLlxuICAgIGRlZmluZS5yZXF1aXJlID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIGlmIChsb2FkZXJDYWNoZVtpZF0pIHtcbiAgICAgICAgICAgIHJldHVybiBsb2FkZXJDYWNoZVtpZF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVmaW5lQ2FjaGVbaWRdKSB7XG4gICAgICAgICAgICBydW5GYWN0b3J5LmFwcGx5KG51bGwsIGRlZmluZUNhY2hlW2lkXSk7XG4gICAgICAgICAgICByZXR1cm4gbG9hZGVyQ2FjaGVbaWRdO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGRlZmluZS5hbWQgPSB7fTtcblxuICAgIHJldHVybiBkZWZpbmU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYW1kZWZpbmU7XG5cbn0pLmNhbGwodGhpcyxyZXF1aXJlKCdfcHJvY2VzcycpLFwiLy4uXFxcXC4uXFxcXG5vZGVfbW9kdWxlc1xcXFxhbWRlZmluZVxcXFxhbWRlZmluZS5qc1wiKVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMMjV2WkdWZmJXOWtkV3hsY3k5aGJXUmxabWx1WlM5aGJXUmxabWx1WlM1cWN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaU8wRkJRVUU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVNJc0ltWnBiR1VpT2lKblpXNWxjbUYwWldRdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lMeW9xSUhacGJUb2daWFE2ZEhNOU5EcHpkejAwT25OMGN6MDBYRzRnS2lCQWJHbGpaVzV6WlNCaGJXUmxabWx1WlNBeExqQXVNU0JEYjNCNWNtbG5hSFFnS0dNcElESXdNVEV0TWpBeE5pd2dWR2hsSUVSdmFtOGdSbTkxYm1SaGRHbHZiaUJCYkd3Z1VtbG5hSFJ6SUZKbGMyVnlkbVZrTGx4dUlDb2dRWFpoYVd4aFlteGxJSFpwWVNCMGFHVWdUVWxVSUc5eUlHNWxkeUJDVTBRZ2JHbGpaVzV6WlM1Y2JpQXFJSE5sWlRvZ2FIUjBjRG92TDJkcGRHaDFZaTVqYjIwdmFuSmlkWEpyWlM5aGJXUmxabWx1WlNCbWIzSWdaR1YwWVdsc2MxeHVJQ292WEc1Y2JpOHFhbk5zYVc1MElHNXZaR1U2SUhSeWRXVWdLaTljYmk4cVoyeHZZbUZzSUcxdlpIVnNaU3dnY0hKdlkyVnpjeUFxTDF4dUozVnpaU0J6ZEhKcFkzUW5PMXh1WEc0dktpcGNiaUFxSUVOeVpXRjBaWE1nWVNCa1pXWnBibVVnWm05eUlHNXZaR1V1WEc0Z0tpQkFjR0Z5WVcwZ2UwOWlhbVZqZEgwZ2JXOWtkV3hsSUhSb1pTQmNJbTF2WkhWc1pWd2lJRzlpYW1WamRDQjBhR0YwSUdseklHUmxabWx1WldRZ1lua2dUbTlrWlNCbWIzSWdkR2hsWEc0Z0tpQmpkWEp5Wlc1MElHMXZaSFZzWlM1Y2JpQXFJRUJ3WVhKaGJTQjdSblZ1WTNScGIyNTlJRnR5WlhGMWFYSmxSbTVkTGlCT2IyUmxKM01nY21WeGRXbHlaU0JtZFc1amRHbHZiaUJtYjNJZ2RHaGxJR04xY25KbGJuUWdiVzlrZFd4bExseHVJQ29nU1hRZ2IyNXNlU0J1WldWa2N5QjBieUJpWlNCd1lYTnpaV1FnYVc0Z1RtOWtaU0IyWlhKemFXOXVjeUJpWldadmNtVWdNQzQxTENCM2FHVnVJRzF2WkhWc1pTNXlaWEYxYVhKbFhHNGdLaUJrYVdRZ2JtOTBJR1Y0YVhOMExseHVJQ29nUUhKbGRIVnlibk1nZTBaMWJtTjBhVzl1ZlNCaElHUmxabWx1WlNCbWRXNWpkR2x2YmlCMGFHRjBJR2x6SUhWellXSnNaU0JtYjNJZ2RHaGxJR04xY25KbGJuUWdibTlrWlZ4dUlDb2diVzlrZFd4bExseHVJQ292WEc1bWRXNWpkR2x2YmlCaGJXUmxabWx1WlNodGIyUjFiR1VzSUhKbGNYVnBjbVZHYmlrZ2UxeHVJQ0FnSUNkMWMyVWdjM1J5YVdOMEp6dGNiaUFnSUNCMllYSWdaR1ZtYVc1bFEyRmphR1VnUFNCN2ZTeGNiaUFnSUNBZ0lDQWdiRzloWkdWeVEyRmphR1VnUFNCN2ZTeGNiaUFnSUNBZ0lDQWdZV3h5WldGa2VVTmhiR3hsWkNBOUlHWmhiSE5sTEZ4dUlDQWdJQ0FnSUNCd1lYUm9JRDBnY21WeGRXbHlaU2duY0dGMGFDY3BMRnh1SUNBZ0lDQWdJQ0J0WVd0bFVtVnhkV2x5WlN3Z2MzUnlhVzVuVW1WeGRXbHlaVHRjYmx4dUlDQWdJQzhxS2x4dUlDQWdJQ0FxSUZSeWFXMXpJSFJvWlNBdUlHRnVaQ0F1TGlCbWNtOXRJR0Z1SUdGeWNtRjVJRzltSUhCaGRHZ2djMlZuYldWdWRITXVYRzRnSUNBZ0lDb2dTWFFnZDJsc2JDQnJaV1Z3SUdFZ2JHVmhaR2x1WnlCd1lYUm9JSE5sWjIxbGJuUWdhV1lnWVNBdUxpQjNhV3hzSUdKbFkyOXRaVnh1SUNBZ0lDQXFJSFJvWlNCbWFYSnpkQ0J3WVhSb0lITmxaMjFsYm5Rc0lIUnZJR2hsYkhBZ2QybDBhQ0J0YjJSMWJHVWdibUZ0WlNCc2IyOXJkWEJ6TEZ4dUlDQWdJQ0FxSUhkb2FXTm9JR0ZqZENCc2FXdGxJSEJoZEdoekxDQmlkWFFnWTJGdUlHSmxJSEpsYldGd2NHVmtMaUJDZFhRZ2RHaGxJR1Z1WkNCeVpYTjFiSFFzWEc0Z0lDQWdJQ29nWVd4c0lIQmhkR2h6SUhSb1lYUWdkWE5sSUhSb2FYTWdablZ1WTNScGIyNGdjMmh2ZFd4a0lHeHZiMnNnYm05eWJXRnNhWHBsWkM1Y2JpQWdJQ0FnS2lCT1QxUkZPaUIwYUdseklHMWxkR2h2WkNCTlQwUkpSa2xGVXlCMGFHVWdhVzV3ZFhRZ1lYSnlZWGt1WEc0Z0lDQWdJQ29nUUhCaGNtRnRJSHRCY25KaGVYMGdZWEo1SUhSb1pTQmhjbkpoZVNCdlppQndZWFJvSUhObFoyMWxiblJ6TGx4dUlDQWdJQ0FxTDF4dUlDQWdJR1oxYm1OMGFXOXVJSFJ5YVcxRWIzUnpLR0Z5ZVNrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnYVN3Z2NHRnlkRHRjYmlBZ0lDQWdJQ0FnWm05eUlDaHBJRDBnTURzZ1lYSjVXMmxkT3lCcEt6MGdNU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjR0Z5ZENBOUlHRnllVnRwWFR0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNod1lYSjBJRDA5UFNBbkxpY3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoY25rdWMzQnNhV05sS0drc0lERXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2tnTFQwZ01UdGNiaUFnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb2NHRnlkQ0E5UFQwZ0p5NHVKeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaHBJRDA5UFNBeElDWW1JQ2hoY25sYk1sMGdQVDA5SUNjdUxpY2dmSHdnWVhKNVd6QmRJRDA5UFNBbkxpNG5LU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMMFZ1WkNCdlppQjBhR1VnYkdsdVpTNGdTMlZsY0NCaGRDQnNaV0Z6ZENCdmJtVWdibTl1TFdSdmRGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2TDNCaGRHZ2djMlZuYldWdWRDQmhkQ0IwYUdVZ1puSnZiblFnYzI4Z2FYUWdZMkZ1SUdKbElHMWhjSEJsWkZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMMk52Y25KbFkzUnNlU0IwYnlCa2FYTnJMaUJQZEdobGNuZHBjMlVzSUhSb1pYSmxJR2x6SUd4cGEyVnNlVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkwyNXZJSEJoZEdnZ2JXRndjR2x1WnlCbWIzSWdZU0J3WVhSb0lITjBZWEowYVc1bklIZHBkR2dnSnk0dUp5NWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk5VWFHbHpJR05oYmlCemRHbHNiQ0JtWVdsc0xDQmlkWFFnWTJGMFkyaGxjeUIwYUdVZ2JXOXpkQ0J5WldGemIyNWhZbXhsWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZkWE5sY3lCdlppQXVMbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaWNtVmhhenRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0drZ1BpQXdLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHRnllUzV6Y0d4cFkyVW9hU0F0SURFc0lESXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCcElDMDlJREk3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdmVnh1WEc0Z0lDQWdablZ1WTNScGIyNGdibTl5YldGc2FYcGxLRzVoYldVc0lHSmhjMlZPWVcxbEtTQjdYRzRnSUNBZ0lDQWdJSFpoY2lCaVlYTmxVR0Z5ZEhNN1hHNWNiaUFnSUNBZ0lDQWdMeTlCWkdwMWMzUWdZVzU1SUhKbGJHRjBhWFpsSUhCaGRHaHpMbHh1SUNBZ0lDQWdJQ0JwWmlBb2JtRnRaU0FtSmlCdVlXMWxMbU5vWVhKQmRDZ3dLU0E5UFQwZ0p5NG5LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMMGxtSUdoaGRtVWdZU0JpWVhObElHNWhiV1VzSUhSeWVTQjBieUJ1YjNKdFlXeHBlbVVnWVdkaGFXNXpkQ0JwZEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQzh2YjNSb1pYSjNhWE5sTENCaGMzTjFiV1VnYVhRZ2FYTWdZU0IwYjNBdGJHVjJaV3dnY21WeGRXbHlaU0IwYUdGMElIZHBiR3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZZbVVnY21Wc1lYUnBkbVVnZEc4Z1ltRnpaVlZ5YkNCcGJpQjBhR1VnWlc1a0xseHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHSmhjMlZPWVcxbEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZbUZ6WlZCaGNuUnpJRDBnWW1GelpVNWhiV1V1YzNCc2FYUW9KeThuS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlYTmxVR0Z5ZEhNZ1BTQmlZWE5sVUdGeWRITXVjMnhwWTJVb01Dd2dZbUZ6WlZCaGNuUnpMbXhsYm1kMGFDQXRJREVwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKaGMyVlFZWEowY3lBOUlHSmhjMlZRWVhKMGN5NWpiMjVqWVhRb2JtRnRaUzV6Y0d4cGRDZ25MeWNwS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGNtbHRSRzkwY3loaVlYTmxVR0Z5ZEhNcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNWhiV1VnUFNCaVlYTmxVR0Z5ZEhNdWFtOXBiaWduTHljcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHNWhiV1U3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdMeW9xWEc0Z0lDQWdJQ29nUTNKbFlYUmxJSFJvWlNCdWIzSnRZV3hwZW1Vb0tTQm1kVzVqZEdsdmJpQndZWE56WldRZ2RHOGdZU0JzYjJGa1pYSWdjR3gxWjJsdUozTmNiaUFnSUNBZ0tpQnViM0p0WVd4cGVtVWdiV1YwYUc5a0xseHVJQ0FnSUNBcUwxeHVJQ0FnSUdaMWJtTjBhVzl1SUcxaGEyVk9iM0p0WVd4cGVtVW9jbVZzVG1GdFpTa2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdablZ1WTNScGIyNGdLRzVoYldVcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJ1YjNKdFlXeHBlbVVvYm1GdFpTd2djbVZzVG1GdFpTazdYRzRnSUNBZ0lDQWdJSDA3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdablZ1WTNScGIyNGdiV0ZyWlV4dllXUW9hV1FwSUh0Y2JpQWdJQ0FnSUNBZ1puVnVZM1JwYjI0Z2JHOWhaQ2gyWVd4MVpTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2JHOWhaR1Z5UTJGamFHVmJhV1JkSUQwZ2RtRnNkV1U3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQnNiMkZrTG1aeWIyMVVaWGgwSUQwZ1puVnVZM1JwYjI0Z0tHbGtMQ0IwWlhoMEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBdkwxUm9hWE1nYjI1bElHbHpJR1JwWm1acFkzVnNkQ0JpWldOaGRYTmxJSFJvWlNCMFpYaDBJR05oYmk5d2NtOWlZV0pzZVNCMWMyVnpYRzRnSUNBZ0lDQWdJQ0FnSUNBdkwyUmxabWx1WlN3Z1lXNWtJR0Z1ZVNCeVpXeGhkR2wyWlNCd1lYUm9jeUJoYm1RZ2NtVnhkV2x5WlhNZ2MyaHZkV3hrSUdKbElISmxiR0YwYVhabFhHNGdJQ0FnSUNBZ0lDQWdJQ0F2TDNSdklIUm9ZWFFnYVdRZ2QyRnpJR2wwSUhkdmRXeGtJR0psSUdadmRXNWtJRzl1SUdScGMyc3VJRUoxZENCMGFHbHpJSGR2ZFd4a0lISmxjWFZwY21WY2JpQWdJQ0FnSUNBZ0lDQWdJQzh2WW05dmRITjBjbUZ3Y0dsdVp5QmhJRzF2WkhWc1pTOXlaWEYxYVhKbElHWmhhWEpzZVNCa1pXVndiSGtnWm5KdmJTQnViMlJsSUdOdmNtVXVYRzRnSUNBZ0lDQWdJQ0FnSUNBdkwwNXZkQ0J6ZFhKbElHaHZkeUJpWlhOMElIUnZJR2R2SUdGaWIzVjBJSFJvWVhRZ2VXVjBMbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHliM2NnYm1WM0lFVnljbTl5S0NkaGJXUmxabWx1WlNCa2IyVnpJRzV2ZENCcGJYQnNaVzFsYm5RZ2JHOWhaQzVtY205dFZHVjRkQ2NwTzF4dUlDQWdJQ0FnSUNCOU8xeHVYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnNiMkZrTzF4dUlDQWdJSDFjYmx4dUlDQWdJRzFoYTJWU1pYRjFhWEpsSUQwZ1puVnVZM1JwYjI0Z0tITjVjM1JsYlZKbGNYVnBjbVVzSUdWNGNHOXlkSE1zSUcxdlpIVnNaU3dnY21Wc1NXUXBJSHRjYmlBZ0lDQWdJQ0FnWm5WdVkzUnBiMjRnWVcxa1VtVnhkV2x5WlNoa1pYQnpMQ0JqWVd4c1ltRmpheWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0hSNWNHVnZaaUJrWlhCeklEMDlQU0FuYzNSeWFXNW5KeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dlUzbHVZMmh5YjI1dmRYTXNJSE5wYm1kc1pTQnRiMlIxYkdVZ2NtVnhkV2x5WlNnbkp5bGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2MzUnlhVzVuVW1WeGRXbHlaU2h6ZVhOMFpXMVNaWEYxYVhKbExDQmxlSEJ2Y25SekxDQnRiMlIxYkdVc0lHUmxjSE1zSUhKbGJFbGtLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OUJjbkpoZVNCdlppQmtaWEJsYm1SbGJtTnBaWE1nZDJsMGFDQmhJR05oYkd4aVlXTnJMbHh1WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk5RGIyNTJaWEowSUhSb1pTQmtaWEJsYm1SbGJtTnBaWE1nZEc4Z2JXOWtkV3hsY3k1Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCa1pYQnpJRDBnWkdWd2N5NXRZWEFvWm5WdVkzUnBiMjRnS0dSbGNFNWhiV1VwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlITjBjbWx1WjFKbGNYVnBjbVVvYzNsemRHVnRVbVZ4ZFdseVpTd2daWGh3YjNKMGN5d2diVzlrZFd4bExDQmtaWEJPWVcxbExDQnlaV3hKWkNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZTazdYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2TDFkaGFYUWdabTl5SUc1bGVIUWdkR2xqYXlCMGJ5QmpZV3hzSUdKaFkyc2dkR2hsSUhKbGNYVnBjbVVnWTJGc2JDNWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBaaUFvWTJGc2JHSmhZMnNwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjSEp2WTJWemN5NXVaWGgwVkdsamF5aG1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqWVd4c1ltRmpheTVoY0hCc2VTaHVkV3hzTENCa1pYQnpLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnWVcxa1VtVnhkV2x5WlM1MGIxVnliQ0E5SUdaMWJtTjBhVzl1SUNobWFXeGxVR0YwYUNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHWnBiR1ZRWVhSb0xtbHVaR1Y0VDJZb0p5NG5LU0E5UFQwZ01Da2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQnViM0p0WVd4cGVtVW9abWxzWlZCaGRHZ3NJSEJoZEdndVpHbHlibUZ0WlNodGIyUjFiR1V1Wm1sc1pXNWhiV1VwS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHWnBiR1ZRWVhSb08xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCOU8xeHVYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQmhiV1JTWlhGMWFYSmxPMXh1SUNBZ0lIMDdYRzVjYmlBZ0lDQXZMMFpoZG05eUlHVjRjR3hwWTJsMElIWmhiSFZsTENCd1lYTnpaV1FnYVc0Z2FXWWdkR2hsSUcxdlpIVnNaU0IzWVc1MGN5QjBieUJ6ZFhCd2IzSjBJRTV2WkdVZ01DNDBMbHh1SUNBZ0lISmxjWFZwY21WR2JpQTlJSEpsY1hWcGNtVkdiaUI4ZkNCbWRXNWpkR2x2YmlCeVpYRW9LU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJ0YjJSMWJHVXVjbVZ4ZFdseVpTNWhjSEJzZVNodGIyUjFiR1VzSUdGeVozVnRaVzUwY3lrN1hHNGdJQ0FnZlR0Y2JseHVJQ0FnSUdaMWJtTjBhVzl1SUhKMWJrWmhZM1J2Y25rb2FXUXNJR1JsY0hNc0lHWmhZM1J2Y25rcElIdGNiaUFnSUNBZ0lDQWdkbUZ5SUhJc0lHVXNJRzBzSUhKbGMzVnNkRHRjYmx4dUlDQWdJQ0FnSUNCcFppQW9hV1FwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR1VnUFNCc2IyRmtaWEpEWVdOb1pWdHBaRjBnUFNCN2ZUdGNiaUFnSUNBZ0lDQWdJQ0FnSUcwZ1BTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1E2SUdsa0xGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIVnlhVG9nWDE5bWFXeGxibUZ0WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbGVIQnZjblJ6T2lCbFhHNGdJQ0FnSUNBZ0lDQWdJQ0I5TzF4dUlDQWdJQ0FnSUNBZ0lDQWdjaUE5SUcxaGEyVlNaWEYxYVhKbEtISmxjWFZwY21WR2Jpd2daU3dnYlN3Z2FXUXBPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OVBibXg1SUhOMWNIQnZjblFnYjI1bElHUmxabWx1WlNCallXeHNJSEJsY2lCbWFXeGxYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9ZV3h5WldGa2VVTmhiR3hsWkNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2lnbllXMWtaV1pwYm1VZ2QybDBhQ0J1YnlCdGIyUjFiR1VnU1VRZ1kyRnVibTkwSUdKbElHTmhiR3hsWkNCdGIzSmxJSFJvWVc0Z2IyNWpaU0J3WlhJZ1ptbHNaUzRuS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lHRnNjbVZoWkhsRFlXeHNaV1FnUFNCMGNuVmxPMXh1WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMMVZ6WlNCMGFHVWdjbVZoYkNCMllYSnBZV0pzWlhNZ1puSnZiU0J1YjJSbFhHNGdJQ0FnSUNBZ0lDQWdJQ0F2TDFWelpTQnRiMlIxYkdVdVpYaHdiM0owY3lCbWIzSWdaWGh3YjNKMGN5d2djMmx1WTJWY2JpQWdJQ0FnSUNBZ0lDQWdJQzh2ZEdobElHVjRjRzl5ZEhNZ2FXNGdhR1Z5WlNCcGN5QmhiV1JsWm1sdVpTQmxlSEJ2Y25SekxseHVJQ0FnSUNBZ0lDQWdJQ0FnWlNBOUlHMXZaSFZzWlM1bGVIQnZjblJ6TzF4dUlDQWdJQ0FnSUNBZ0lDQWdiU0E5SUcxdlpIVnNaVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISWdQU0J0WVd0bFVtVnhkV2x5WlNoeVpYRjFhWEpsUm00c0lHVXNJRzBzSUcxdlpIVnNaUzVwWkNrN1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0F2TDBsbUlIUm9aWEpsSUdGeVpTQmtaWEJsYm1SbGJtTnBaWE1zSUhSb1pYa2dZWEpsSUhOMGNtbHVaM01zSUhOdklHNWxaV1JjYmlBZ0lDQWdJQ0FnTHk5MGJ5QmpiMjUyWlhKMElIUm9aVzBnZEc4Z1pHVndaVzVrWlc1amVTQjJZV3gxWlhNdVhHNGdJQ0FnSUNBZ0lHbG1JQ2hrWlhCektTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCa1pYQnpJRDBnWkdWd2N5NXRZWEFvWm5WdVkzUnBiMjRnS0dSbGNFNWhiV1VwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnY2loa1pYQk9ZVzFsS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdMeTlEWVd4c0lIUm9aU0JtWVdOMGIzSjVJSGRwZEdnZ2RHaGxJSEpwWjJoMElHUmxjR1Z1WkdWdVkybGxjeTVjYmlBZ0lDQWdJQ0FnYVdZZ0tIUjVjR1Z2WmlCbVlXTjBiM0o1SUQwOVBTQW5ablZ1WTNScGIyNG5LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQm1ZV04wYjNKNUxtRndjR3g1S0cwdVpYaHdiM0owY3l3Z1pHVndjeWs3WEc0Z0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQm1ZV04wYjNKNU8xeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnYVdZZ0tISmxjM1ZzZENBaFBUMGdkVzVrWldacGJtVmtLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnRMbVY0Y0c5eWRITWdQU0J5WlhOMWJIUTdYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9hV1FwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc2IyRmtaWEpEWVdOb1pWdHBaRjBnUFNCdExtVjRjRzl5ZEhNN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0J6ZEhKcGJtZFNaWEYxYVhKbElEMGdablZ1WTNScGIyNGdLSE41YzNSbGJWSmxjWFZwY21Vc0lHVjRjRzl5ZEhNc0lHMXZaSFZzWlN3Z2FXUXNJSEpsYkVsa0tTQjdYRzRnSUNBZ0lDQWdJQzh2VTNCc2FYUWdkR2hsSUVsRUlHSjVJR0VnSVNCemJ5QjBhR0YwWEc0Z0lDQWdJQ0FnSUhaaGNpQnBibVJsZUNBOUlHbGtMbWx1WkdWNFQyWW9KeUVuS1N4Y2JpQWdJQ0FnSUNBZ0lDQWdJRzl5YVdkcGJtRnNTV1FnUFNCcFpDeGNiaUFnSUNBZ0lDQWdJQ0FnSUhCeVpXWnBlQ3dnY0d4MVoybHVPMXh1WEc0Z0lDQWdJQ0FnSUdsbUlDaHBibVJsZUNBOVBUMGdMVEVwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xrSUQwZ2JtOXliV0ZzYVhwbEtHbGtMQ0J5Wld4SlpDazdYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZVM1J5WVdsbmFIUWdiVzlrZFd4bElHeHZiMnQxY0M0Z1NXWWdhWFFnYVhNZ2IyNWxJRzltSUhSb1pTQnpjR1ZqYVdGc0lHUmxjR1Z1WkdWdVkybGxjeXhjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZaR1ZoYkNCM2FYUm9JR2wwTENCdmRHaGxjbmRwYzJVc0lHUmxiR1ZuWVhSbElIUnZJRzV2WkdVdVhHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2FXUWdQVDA5SUNkeVpYRjFhWEpsSnlrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCdFlXdGxVbVZ4ZFdseVpTaHplWE4wWlcxU1pYRjFhWEpsTENCbGVIQnZjblJ6TENCdGIyUjFiR1VzSUhKbGJFbGtLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCcFppQW9hV1FnUFQwOUlDZGxlSEJ2Y25Sekp5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQmxlSEJ2Y25Sek8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJR2xtSUNocFpDQTlQVDBnSjIxdlpIVnNaU2NwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnYlc5a2RXeGxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaHNiMkZrWlhKRFlXTm9aUzVvWVhOUGQyNVFjbTl3WlhKMGVTaHBaQ2twSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnYkc5aFpHVnlRMkZqYUdWYmFXUmRPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaGtaV1pwYm1WRFlXTm9aVnRwWkYwcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlkVzVHWVdOMGIzSjVMbUZ3Y0d4NUtHNTFiR3dzSUdSbFptbHVaVU5oWTJobFcybGtYU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR3h2WVdSbGNrTmhZMmhsVzJsa1hUdGNiaUFnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZb2MzbHpkR1Z0VW1WeGRXbHlaU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2MzbHpkR1Z0VW1WeGRXbHlaU2h2Y21sbmFXNWhiRWxrS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSWEp5YjNJb0owNXZJRzF2WkhWc1pTQjNhWFJvSUVsRU9pQW5JQ3NnYVdRcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQzh2VkdobGNtVWdhWE1nWVNCd2JIVm5hVzRnYVc0Z2NHeGhlUzVjYmlBZ0lDQWdJQ0FnSUNBZ0lIQnlaV1pwZUNBOUlHbGtMbk4xWW5OMGNtbHVaeWd3TENCcGJtUmxlQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaQ0E5SUdsa0xuTjFZbk4wY21sdVp5aHBibVJsZUNBcklERXNJR2xrTG14bGJtZDBhQ2s3WEc1Y2JpQWdJQ0FnSUNBZ0lDQWdJSEJzZFdkcGJpQTlJSE4wY21sdVoxSmxjWFZwY21Vb2MzbHpkR1Z0VW1WeGRXbHlaU3dnWlhod2IzSjBjeXdnYlc5a2RXeGxMQ0J3Y21WbWFYZ3NJSEpsYkVsa0tUdGNibHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSEJzZFdkcGJpNXViM0p0WVd4cGVtVXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JwWkNBOUlIQnNkV2RwYmk1dWIzSnRZV3hwZW1Vb2FXUXNJRzFoYTJWT2IzSnRZV3hwZW1Vb2NtVnNTV1FwS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeTlPYjNKdFlXeHBlbVVnZEdobElFbEVJRzV2Y20xaGJHeDVMbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xrSUQwZ2JtOXliV0ZzYVhwbEtHbGtMQ0J5Wld4SlpDazdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaHNiMkZrWlhKRFlXTm9aVnRwWkYwcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2JHOWhaR1Z5UTJGamFHVmJhV1JkTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQndiSFZuYVc0dWJHOWhaQ2hwWkN3Z2JXRnJaVkpsY1hWcGNtVW9jM2x6ZEdWdFVtVnhkV2x5WlN3Z1pYaHdiM0owY3l3Z2JXOWtkV3hsTENCeVpXeEpaQ2tzSUcxaGEyVk1iMkZrS0dsa0tTd2dlMzBwTzF4dVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUd4dllXUmxja05oWTJobFcybGtYVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lIMDdYRzVjYmlBZ0lDQXZMME55WldGMFpTQmhJR1JsWm1sdVpTQm1kVzVqZEdsdmJpQnpjR1ZqYVdacFl5QjBieUIwYUdVZ2JXOWtkV3hsSUdGemEybHVaeUJtYjNJZ1lXMWtaV1pwYm1VdVhHNGdJQ0FnWm5WdVkzUnBiMjRnWkdWbWFXNWxLR2xrTENCa1pYQnpMQ0JtWVdOMGIzSjVLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaEJjbkpoZVM1cGMwRnljbUY1S0dsa0tTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ1ptRmpkRzl5ZVNBOUlHUmxjSE03WEc0Z0lDQWdJQ0FnSUNBZ0lDQmtaWEJ6SUQwZ2FXUTdYRzRnSUNBZ0lDQWdJQ0FnSUNCcFpDQTlJSFZ1WkdWbWFXNWxaRHRjYmlBZ0lDQWdJQ0FnZlNCbGJITmxJR2xtSUNoMGVYQmxiMllnYVdRZ0lUMDlJQ2R6ZEhKcGJtY25LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQm1ZV04wYjNKNUlEMGdhV1E3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaQ0E5SUdSbGNITWdQU0IxYm1SbFptbHVaV1E3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQnBaaUFvWkdWd2N5QW1KaUFoUVhKeVlYa3VhWE5CY25KaGVTaGtaWEJ6S1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnWm1GamRHOXllU0E5SUdSbGNITTdYRzRnSUNBZ0lDQWdJQ0FnSUNCa1pYQnpJRDBnZFc1a1pXWnBibVZrTzF4dUlDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdhV1lnS0NGa1pYQnpLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmtaWEJ6SUQwZ1d5ZHlaWEYxYVhKbEp5d2dKMlY0Y0c5eWRITW5MQ0FuYlc5a2RXeGxKMTA3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQXZMMU5sZENCMWNDQndjbTl3WlhKMGFXVnpJR1p2Y2lCMGFHbHpJRzF2WkhWc1pTNGdTV1lnWVc0Z1NVUXNJSFJvWlc0Z2RYTmxYRzRnSUNBZ0lDQWdJQzh2YVc1MFpYSnVZV3dnWTJGamFHVXVJRWxtSUc1dklFbEVMQ0IwYUdWdUlIVnpaU0IwYUdVZ1pYaDBaWEp1WVd3Z2RtRnlhV0ZpYkdWelhHNGdJQ0FnSUNBZ0lDOHZabTl5SUhSb2FYTWdibTlrWlNCdGIyUjFiR1V1WEc0Z0lDQWdJQ0FnSUdsbUlDaHBaQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdMeTlRZFhRZ2RHaGxJRzF2WkhWc1pTQnBiaUJrWldWd0lHWnlaV1Y2WlNCMWJuUnBiQ0IwYUdWeVpTQnBjeUJoWEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMM0psY1hWcGNtVWdZMkZzYkNCbWIzSWdhWFF1WEc0Z0lDQWdJQ0FnSUNBZ0lDQmtaV1pwYm1WRFlXTm9aVnRwWkYwZ1BTQmJhV1FzSUdSbGNITXNJR1poWTNSdmNubGRPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NuVnVSbUZqZEc5eWVTaHBaQ3dnWkdWd2N5d2dabUZqZEc5eWVTazdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQjlYRzVjYmlBZ0lDQXZMMlJsWm1sdVpTNXlaWEYxYVhKbExDQjNhR2xqYUNCb1lYTWdZV05qWlhOeklIUnZJR0ZzYkNCMGFHVWdkbUZzZFdWeklHbHVJSFJvWlZ4dUlDQWdJQzh2WTJGamFHVXVJRlZ6WldaMWJDQm1iM0lnUVUxRUlHMXZaSFZzWlhNZ2RHaGhkQ0JoYkd3Z2FHRjJaU0JKUkhNZ2FXNGdkR2hsSUdacGJHVXNYRzRnSUNBZ0x5OWlkWFFnYm1WbFpDQjBieUJtYVc1aGJHeDVJR1Y0Y0c5eWRDQmhJSFpoYkhWbElIUnZJRzV2WkdVZ1ltRnpaV1FnYjI0Z2IyNWxJRzltSUhSb2IzTmxYRzRnSUNBZ0x5OUpSSE11WEc0Z0lDQWdaR1ZtYVc1bExuSmxjWFZwY21VZ1BTQm1kVzVqZEdsdmJpQW9hV1FwSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLR3h2WVdSbGNrTmhZMmhsVzJsa1hTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUd4dllXUmxja05oWTJobFcybGtYVHRjYmlBZ0lDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNBZ0lHbG1JQ2hrWldacGJtVkRZV05vWlZ0cFpGMHBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISjFia1poWTNSdmNua3VZWEJ3Ykhrb2JuVnNiQ3dnWkdWbWFXNWxRMkZqYUdWYmFXUmRLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCc2IyRmtaWEpEWVdOb1pWdHBaRjA3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0I5TzF4dVhHNGdJQ0FnWkdWbWFXNWxMbUZ0WkNBOUlIdDlPMXh1WEc0Z0lDQWdjbVYwZFhKdUlHUmxabWx1WlR0Y2JuMWNibHh1Ylc5a2RXeGxMbVY0Y0c5eWRITWdQU0JoYldSbFptbHVaVHRjYmlKZGZRPT0iLG51bGwsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gdHJ1ZTtcbiAgICB2YXIgY3VycmVudFF1ZXVlO1xuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB2YXIgaSA9IC0xO1xuICAgICAgICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgICAgICAgICBjdXJyZW50UXVldWVbaV0oKTtcbiAgICAgICAgfVxuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG59XG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHF1ZXVlLnB1c2goZnVuKTtcbiAgICBpZiAoIWRyYWluaW5nKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZHJhaW5RdWV1ZSwgMCk7XG4gICAgfVxufTtcblxucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbi8vIFRPRE8oc2h0eWxtYW4pXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCIoZnVuY3Rpb24gKHByb2Nlc3MsZ2xvYmFsKXtcbi8qIVxuICogQG92ZXJ2aWV3IGVzNi1wcm9taXNlIC0gYSB0aW55IGltcGxlbWVudGF0aW9uIG9mIFByb21pc2VzL0ErLlxuICogQGNvcHlyaWdodCBDb3B5cmlnaHQgKGMpIDIwMTQgWWVodWRhIEthdHosIFRvbSBEYWxlLCBTdGVmYW4gUGVubmVyIGFuZCBjb250cmlidXRvcnMgKENvbnZlcnNpb24gdG8gRVM2IEFQSSBieSBKYWtlIEFyY2hpYmFsZClcbiAqIEBsaWNlbnNlICAgTGljZW5zZWQgdW5kZXIgTUlUIGxpY2Vuc2VcbiAqICAgICAgICAgICAgU2VlIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9qYWtlYXJjaGliYWxkL2VzNi1wcm9taXNlL21hc3Rlci9MSUNFTlNFXG4gKiBAdmVyc2lvbiAgIDIuMy4wXG4gKi9cblxuKGZ1bmN0aW9uKCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkb2JqZWN0T3JGdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHggPT09ICdmdW5jdGlvbicgfHwgKHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiB4ICE9PSBudWxsKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkdXRpbHMkJGlzRnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNNYXliZVRoZW5hYmxlKHgpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgeCAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHV0aWxzJCRfaXNBcnJheTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkpIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkX2lzQXJyYXkgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBBcnJheV0nO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGliJGVzNiRwcm9taXNlJHV0aWxzJCRfaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG4gICAgfVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNBcnJheSA9IGxpYiRlczYkcHJvbWlzZSR1dGlscyQkX2lzQXJyYXk7XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW4gPSAwO1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkdG9TdHJpbmcgPSB7fS50b1N0cmluZztcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJHZlcnR4TmV4dDtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJGN1c3RvbVNjaGVkdWxlckZuO1xuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhc2FwID0gZnVuY3Rpb24gYXNhcChjYWxsYmFjaywgYXJnKSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkcXVldWVbbGliJGVzNiRwcm9taXNlJGFzYXAkJGxlbl0gPSBjYWxsYmFjaztcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRxdWV1ZVtsaWIkZXM2JHByb21pc2UkYXNhcCQkbGVuICsgMV0gPSBhcmc7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkbGVuICs9IDI7XG4gICAgICBpZiAobGliJGVzNiRwcm9taXNlJGFzYXAkJGxlbiA9PT0gMikge1xuICAgICAgICAvLyBJZiBsZW4gaXMgMiwgdGhhdCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gc2NoZWR1bGUgYW4gYXN5bmMgZmx1c2guXG4gICAgICAgIC8vIElmIGFkZGl0aW9uYWwgY2FsbGJhY2tzIGFyZSBxdWV1ZWQgYmVmb3JlIHRoZSBxdWV1ZSBpcyBmbHVzaGVkLCB0aGV5XG4gICAgICAgIC8vIHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IHRoaXMgZmx1c2ggdGhhdCB3ZSBhcmUgc2NoZWR1bGluZy5cbiAgICAgICAgaWYgKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRjdXN0b21TY2hlZHVsZXJGbikge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRjdXN0b21TY2hlZHVsZXJGbihsaWIkZXM2JHByb21pc2UkYXNhcCQkZmx1c2gpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzY2hlZHVsZUZsdXNoKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2V0U2NoZWR1bGVyKHNjaGVkdWxlRm4pIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRjdXN0b21TY2hlZHVsZXJGbiA9IHNjaGVkdWxlRm47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJHNldEFzYXAoYXNhcEZuKSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXNhcCA9IGFzYXBGbjtcbiAgICB9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJGJyb3dzZXJXaW5kb3cgPSAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpID8gd2luZG93IDogdW5kZWZpbmVkO1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkYnJvd3Nlckdsb2JhbCA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRicm93c2VyV2luZG93IHx8IHt9O1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkYnJvd3Nlckdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRicm93c2VyR2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRpc05vZGUgPSB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYge30udG9TdHJpbmcuY2FsbChwcm9jZXNzKSA9PT0gJ1tvYmplY3QgcHJvY2Vzc10nO1xuXG4gICAgLy8gdGVzdCBmb3Igd2ViIHdvcmtlciBidXQgbm90IGluIElFMTBcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJGlzV29ya2VyID0gdHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgdHlwZW9mIGltcG9ydFNjcmlwdHMgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICB0eXBlb2YgTWVzc2FnZUNoYW5uZWwgIT09ICd1bmRlZmluZWQnO1xuXG4gICAgLy8gbm9kZVxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VOZXh0VGljaygpIHtcbiAgICAgIHZhciBuZXh0VGljayA9IHByb2Nlc3MubmV4dFRpY2s7XG4gICAgICAvLyBub2RlIHZlcnNpb24gMC4xMC54IGRpc3BsYXlzIGEgZGVwcmVjYXRpb24gd2FybmluZyB3aGVuIG5leHRUaWNrIGlzIHVzZWQgcmVjdXJzaXZlbHlcbiAgICAgIC8vIHNldEltbWVkaWF0ZSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIGluc3RlYWRcbiAgICAgIHZhciB2ZXJzaW9uID0gcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLm1hdGNoKC9eKD86KFxcZCspXFwuKT8oPzooXFxkKylcXC4pPyhcXCp8XFxkKykkLyk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2ZXJzaW9uKSAmJiB2ZXJzaW9uWzFdID09PSAnMCcgJiYgdmVyc2lvblsyXSA9PT0gJzEwJykge1xuICAgICAgICBuZXh0VGljayA9IHNldEltbWVkaWF0ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgbmV4dFRpY2sobGliJGVzNiRwcm9taXNlJGFzYXAkJGZsdXNoKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gdmVydHhcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlVmVydHhUaW1lcigpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHZlcnR4TmV4dChsaWIkZXM2JHByb21pc2UkYXNhcCQkZmx1c2gpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlTXV0YXRpb25PYnNlcnZlcigpIHtcbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIHZhciBvYnNlcnZlciA9IG5ldyBsaWIkZXM2JHByb21pc2UkYXNhcCQkQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIobGliJGVzNiRwcm9taXNlJGFzYXAkJGZsdXNoKTtcbiAgICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgbm9kZS5kYXRhID0gKGl0ZXJhdGlvbnMgPSArK2l0ZXJhdGlvbnMgJSAyKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gd2ViIHdvcmtlclxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VNZXNzYWdlQ2hhbm5lbCgpIHtcbiAgICAgIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRmbHVzaDtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoMCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VTZXRUaW1lb3V0KCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZXRUaW1lb3V0KGxpYiRlczYkcHJvbWlzZSRhc2FwJCRmbHVzaCwgMSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkcXVldWUgPSBuZXcgQXJyYXkoMTAwMCk7XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJGZsdXNoKCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaWIkZXM2JHByb21pc2UkYXNhcCQkbGVuOyBpKz0yKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRxdWV1ZVtpXTtcbiAgICAgICAgdmFyIGFyZyA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRxdWV1ZVtpKzFdO1xuXG4gICAgICAgIGNhbGxiYWNrKGFyZyk7XG5cbiAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHF1ZXVlW2ldID0gdW5kZWZpbmVkO1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkcXVldWVbaSsxXSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGxlbiA9IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJGF0dGVtcHRWZXJ0ZXgoKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgciA9IHJlcXVpcmU7XG4gICAgICAgIHZhciB2ZXJ0eCA9IHIoJ3ZlcnR4Jyk7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR2ZXJ0eE5leHQgPSB2ZXJ0eC5ydW5Pbkxvb3AgfHwgdmVydHgucnVuT25Db250ZXh0O1xuICAgICAgICByZXR1cm4gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZVZlcnR4VGltZXIoKTtcbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICByZXR1cm4gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZVNldFRpbWVvdXQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJHNjaGVkdWxlRmx1c2g7XG4gICAgLy8gRGVjaWRlIHdoYXQgYXN5bmMgbWV0aG9kIHRvIHVzZSB0byB0cmlnZ2VyaW5nIHByb2Nlc3Npbmcgb2YgcXVldWVkIGNhbGxiYWNrczpcbiAgICBpZiAobGliJGVzNiRwcm9taXNlJGFzYXAkJGlzTm9kZSkge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHNjaGVkdWxlRmx1c2ggPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlTmV4dFRpY2soKTtcbiAgICB9IGVsc2UgaWYgKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRCcm93c2VyTXV0YXRpb25PYnNlcnZlcikge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHNjaGVkdWxlRmx1c2ggPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlTXV0YXRpb25PYnNlcnZlcigpO1xuICAgIH0gZWxzZSBpZiAobGliJGVzNiRwcm9taXNlJGFzYXAkJGlzV29ya2VyKSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2NoZWR1bGVGbHVzaCA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIH0gZWxzZSBpZiAobGliJGVzNiRwcm9taXNlJGFzYXAkJGJyb3dzZXJXaW5kb3cgPT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHNjaGVkdWxlRmx1c2ggPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXR0ZW1wdFZlcnRleCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2NoZWR1bGVGbHVzaCA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VTZXRUaW1lb3V0KCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbm9vcCgpIHt9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUEVORElORyAgID0gdm9pZCAwO1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRUQgPSAxO1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRCAgPSAyO1xuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEdFVF9USEVOX0VSUk9SID0gbmV3IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEVycm9yT2JqZWN0KCk7XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRzZWxmRnVsbGZpbGxtZW50KCkge1xuICAgICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoXCJZb3UgY2Fubm90IHJlc29sdmUgYSBwcm9taXNlIHdpdGggaXRzZWxmXCIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGNhbm5vdFJldHVybk93bigpIHtcbiAgICAgIHJldHVybiBuZXcgVHlwZUVycm9yKCdBIHByb21pc2VzIGNhbGxiYWNrIGNhbm5vdCByZXR1cm4gdGhhdCBzYW1lIHByb21pc2UuJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZ2V0VGhlbihwcm9taXNlKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRHRVRfVEhFTl9FUlJPUi5lcnJvciA9IGVycm9yO1xuICAgICAgICByZXR1cm4gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkR0VUX1RIRU5fRVJST1I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkdHJ5VGhlbih0aGVuLCB2YWx1ZSwgZnVsZmlsbG1lbnRIYW5kbGVyLCByZWplY3Rpb25IYW5kbGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGVuLmNhbGwodmFsdWUsIGZ1bGZpbGxtZW50SGFuZGxlciwgcmVqZWN0aW9uSGFuZGxlcik7XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaGFuZGxlRm9yZWlnblRoZW5hYmxlKHByb21pc2UsIHRoZW5hYmxlLCB0aGVuKSB7XG4gICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAoZnVuY3Rpb24ocHJvbWlzZSkge1xuICAgICAgICB2YXIgc2VhbGVkID0gZmFsc2U7XG4gICAgICAgIHZhciBlcnJvciA9IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHRyeVRoZW4odGhlbiwgdGhlbmFibGUsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKHNlYWxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgICBzZWFsZWQgPSB0cnVlO1xuICAgICAgICAgIGlmICh0aGVuYWJsZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAgIGlmIChzZWFsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgc2VhbGVkID0gdHJ1ZTtcblxuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICAgICAgICB9LCAnU2V0dGxlOiAnICsgKHByb21pc2UuX2xhYmVsIHx8ICcgdW5rbm93biBwcm9taXNlJykpO1xuXG4gICAgICAgIGlmICghc2VhbGVkICYmIGVycm9yKSB7XG4gICAgICAgICAgc2VhbGVkID0gdHJ1ZTtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LCBwcm9taXNlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRoYW5kbGVPd25UaGVuYWJsZShwcm9taXNlLCB0aGVuYWJsZSkge1xuICAgICAgaWYgKHRoZW5hYmxlLl9zdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVEKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgdGhlbmFibGUuX3Jlc3VsdCk7XG4gICAgICB9IGVsc2UgaWYgKHRoZW5hYmxlLl9zdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUkVKRUNURUQpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHRoZW5hYmxlLl9yZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkc3Vic2NyaWJlKHRoZW5hYmxlLCB1bmRlZmluZWQsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRoYW5kbGVNYXliZVRoZW5hYmxlKHByb21pc2UsIG1heWJlVGhlbmFibGUpIHtcbiAgICAgIGlmIChtYXliZVRoZW5hYmxlLmNvbnN0cnVjdG9yID09PSBwcm9taXNlLmNvbnN0cnVjdG9yKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGhhbmRsZU93blRoZW5hYmxlKHByb21pc2UsIG1heWJlVGhlbmFibGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHRoZW4gPSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRnZXRUaGVuKG1heWJlVGhlbmFibGUpO1xuXG4gICAgICAgIGlmICh0aGVuID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRHRVRfVEhFTl9FUlJPUikge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRHRVRfVEhFTl9FUlJPUi5lcnJvcik7XG4gICAgICAgIH0gZWxzZSBpZiAodGhlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCBtYXliZVRoZW5hYmxlKTtcbiAgICAgICAgfSBlbHNlIGlmIChsaWIkZXM2JHByb21pc2UkdXRpbHMkJGlzRnVuY3Rpb24odGhlbikpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRoYW5kbGVGb3JlaWduVGhlbmFibGUocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSwgdGhlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCBtYXliZVRoZW5hYmxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlc29sdmUocHJvbWlzZSwgdmFsdWUpIHtcbiAgICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkc2VsZkZ1bGxmaWxsbWVudCgpKTtcbiAgICAgIH0gZWxzZSBpZiAobGliJGVzNiRwcm9taXNlJHV0aWxzJCRvYmplY3RPckZ1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRoYW5kbGVNYXliZVRoZW5hYmxlKHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHB1Ymxpc2hSZWplY3Rpb24ocHJvbWlzZSkge1xuICAgICAgaWYgKHByb21pc2UuX29uZXJyb3IpIHtcbiAgICAgICAgcHJvbWlzZS5fb25lcnJvcihwcm9taXNlLl9yZXN1bHQpO1xuICAgICAgfVxuXG4gICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRwdWJsaXNoKHByb21pc2UpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUpIHtcbiAgICAgIGlmIChwcm9taXNlLl9zdGF0ZSAhPT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUEVORElORykgeyByZXR1cm47IH1cblxuICAgICAgcHJvbWlzZS5fcmVzdWx0ID0gdmFsdWU7XG4gICAgICBwcm9taXNlLl9zdGF0ZSA9IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEZVTEZJTExFRDtcblxuICAgICAgaWYgKHByb21pc2UuX3N1YnNjcmliZXJzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXNhcChsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRwdWJsaXNoLCBwcm9taXNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgcmVhc29uKSB7XG4gICAgICBpZiAocHJvbWlzZS5fc3RhdGUgIT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcpIHsgcmV0dXJuOyB9XG4gICAgICBwcm9taXNlLl9zdGF0ZSA9IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFJFSkVDVEVEO1xuICAgICAgcHJvbWlzZS5fcmVzdWx0ID0gcmVhc29uO1xuXG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXNhcChsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRwdWJsaXNoUmVqZWN0aW9uLCBwcm9taXNlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRzdWJzY3JpYmUocGFyZW50LCBjaGlsZCwgb25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24pIHtcbiAgICAgIHZhciBzdWJzY3JpYmVycyA9IHBhcmVudC5fc3Vic2NyaWJlcnM7XG4gICAgICB2YXIgbGVuZ3RoID0gc3Vic2NyaWJlcnMubGVuZ3RoO1xuXG4gICAgICBwYXJlbnQuX29uZXJyb3IgPSBudWxsO1xuXG4gICAgICBzdWJzY3JpYmVyc1tsZW5ndGhdID0gY2hpbGQ7XG4gICAgICBzdWJzY3JpYmVyc1tsZW5ndGggKyBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRURdID0gb25GdWxmaWxsbWVudDtcbiAgICAgIHN1YnNjcmliZXJzW2xlbmd0aCArIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFJFSkVDVEVEXSAgPSBvblJlamVjdGlvbjtcblxuICAgICAgaWYgKGxlbmd0aCA9PT0gMCAmJiBwYXJlbnQuX3N0YXRlKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhc2FwKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHB1Ymxpc2gsIHBhcmVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcHVibGlzaChwcm9taXNlKSB7XG4gICAgICB2YXIgc3Vic2NyaWJlcnMgPSBwcm9taXNlLl9zdWJzY3JpYmVycztcbiAgICAgIHZhciBzZXR0bGVkID0gcHJvbWlzZS5fc3RhdGU7XG5cbiAgICAgIGlmIChzdWJzY3JpYmVycy5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgICAgIHZhciBjaGlsZCwgY2FsbGJhY2ssIGRldGFpbCA9IHByb21pc2UuX3Jlc3VsdDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdWJzY3JpYmVycy5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICBjaGlsZCA9IHN1YnNjcmliZXJzW2ldO1xuICAgICAgICBjYWxsYmFjayA9IHN1YnNjcmliZXJzW2kgKyBzZXR0bGVkXTtcblxuICAgICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRpbnZva2VDYWxsYmFjayhzZXR0bGVkLCBjaGlsZCwgY2FsbGJhY2ssIGRldGFpbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbGJhY2soZGV0YWlsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwcm9taXNlLl9zdWJzY3JpYmVycy5sZW5ndGggPSAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEVycm9yT2JqZWN0KCkge1xuICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFRSWV9DQVRDSF9FUlJPUiA9IG5ldyBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRFcnJvck9iamVjdCgpO1xuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkdHJ5Q2F0Y2goY2FsbGJhY2ssIGRldGFpbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGRldGFpbCk7XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkVFJZX0NBVENIX0VSUk9SLmVycm9yID0gZTtcbiAgICAgICAgcmV0dXJuIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFRSWV9DQVRDSF9FUlJPUjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRpbnZva2VDYWxsYmFjayhzZXR0bGVkLCBwcm9taXNlLCBjYWxsYmFjaywgZGV0YWlsKSB7XG4gICAgICB2YXIgaGFzQ2FsbGJhY2sgPSBsaWIkZXM2JHByb21pc2UkdXRpbHMkJGlzRnVuY3Rpb24oY2FsbGJhY2spLFxuICAgICAgICAgIHZhbHVlLCBlcnJvciwgc3VjY2VlZGVkLCBmYWlsZWQ7XG5cbiAgICAgIGlmIChoYXNDYWxsYmFjaykge1xuICAgICAgICB2YWx1ZSA9IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHRyeUNhdGNoKGNhbGxiYWNrLCBkZXRhaWwpO1xuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkVFJZX0NBVENIX0VSUk9SKSB7XG4gICAgICAgICAgZmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgICBlcnJvciA9IHZhbHVlLmVycm9yO1xuICAgICAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdWNjZWVkZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGNhbm5vdFJldHVybk93bigpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBkZXRhaWw7XG4gICAgICAgIHN1Y2NlZWRlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9taXNlLl9zdGF0ZSAhPT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUEVORElORykge1xuICAgICAgICAvLyBub29wXG4gICAgICB9IGVsc2UgaWYgKGhhc0NhbGxiYWNrICYmIHN1Y2NlZWRlZCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoZmFpbGVkKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCBlcnJvcik7XG4gICAgICB9IGVsc2UgaWYgKHNldHRsZWQgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEZVTEZJTExFRCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoc2V0dGxlZCA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUkVKRUNURUQpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRpbml0aWFsaXplUHJvbWlzZShwcm9taXNlLCByZXNvbHZlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzb2x2ZXIoZnVuY3Rpb24gcmVzb2x2ZVByb21pc2UodmFsdWUpe1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgICB9LCBmdW5jdGlvbiByZWplY3RQcm9taXNlKHJlYXNvbikge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3IoQ29uc3RydWN0b3IsIGlucHV0KSB7XG4gICAgICB2YXIgZW51bWVyYXRvciA9IHRoaXM7XG5cbiAgICAgIGVudW1lcmF0b3IuX2luc3RhbmNlQ29uc3RydWN0b3IgPSBDb25zdHJ1Y3RvcjtcbiAgICAgIGVudW1lcmF0b3IucHJvbWlzZSA9IG5ldyBDb25zdHJ1Y3RvcihsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRub29wKTtcblxuICAgICAgaWYgKGVudW1lcmF0b3IuX3ZhbGlkYXRlSW5wdXQoaW5wdXQpKSB7XG4gICAgICAgIGVudW1lcmF0b3IuX2lucHV0ICAgICA9IGlucHV0O1xuICAgICAgICBlbnVtZXJhdG9yLmxlbmd0aCAgICAgPSBpbnB1dC5sZW5ndGg7XG4gICAgICAgIGVudW1lcmF0b3IuX3JlbWFpbmluZyA9IGlucHV0Lmxlbmd0aDtcblxuICAgICAgICBlbnVtZXJhdG9yLl9pbml0KCk7XG5cbiAgICAgICAgaWYgKGVudW1lcmF0b3IubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChlbnVtZXJhdG9yLnByb21pc2UsIGVudW1lcmF0b3IuX3Jlc3VsdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW51bWVyYXRvci5sZW5ndGggPSBlbnVtZXJhdG9yLmxlbmd0aCB8fCAwO1xuICAgICAgICAgIGVudW1lcmF0b3IuX2VudW1lcmF0ZSgpO1xuICAgICAgICAgIGlmIChlbnVtZXJhdG9yLl9yZW1haW5pbmcgPT09IDApIHtcbiAgICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwoZW51bWVyYXRvci5wcm9taXNlLCBlbnVtZXJhdG9yLl9yZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KGVudW1lcmF0b3IucHJvbWlzZSwgZW51bWVyYXRvci5fdmFsaWRhdGlvbkVycm9yKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5fdmFsaWRhdGVJbnB1dCA9IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICByZXR1cm4gbGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc0FycmF5KGlucHV0KTtcbiAgICB9O1xuXG4gICAgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl92YWxpZGF0aW9uRXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBuZXcgRXJyb3IoJ0FycmF5IE1ldGhvZHMgbXVzdCBiZSBwcm92aWRlZCBhbiBBcnJheScpO1xuICAgIH07XG5cbiAgICBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuX3Jlc3VsdCA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7XG4gICAgfTtcblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yO1xuXG4gICAgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl9lbnVtZXJhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlbnVtZXJhdG9yID0gdGhpcztcblxuICAgICAgdmFyIGxlbmd0aCAgPSBlbnVtZXJhdG9yLmxlbmd0aDtcbiAgICAgIHZhciBwcm9taXNlID0gZW51bWVyYXRvci5wcm9taXNlO1xuICAgICAgdmFyIGlucHV0ICAgPSBlbnVtZXJhdG9yLl9pbnB1dDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IHByb21pc2UuX3N0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQRU5ESU5HICYmIGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBlbnVtZXJhdG9yLl9lYWNoRW50cnkoaW5wdXRbaV0sIGkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX2VhY2hFbnRyeSA9IGZ1bmN0aW9uKGVudHJ5LCBpKSB7XG4gICAgICB2YXIgZW51bWVyYXRvciA9IHRoaXM7XG4gICAgICB2YXIgYyA9IGVudW1lcmF0b3IuX2luc3RhbmNlQ29uc3RydWN0b3I7XG5cbiAgICAgIGlmIChsaWIkZXM2JHByb21pc2UkdXRpbHMkJGlzTWF5YmVUaGVuYWJsZShlbnRyeSkpIHtcbiAgICAgICAgaWYgKGVudHJ5LmNvbnN0cnVjdG9yID09PSBjICYmIGVudHJ5Ll9zdGF0ZSAhPT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUEVORElORykge1xuICAgICAgICAgIGVudHJ5Ll9vbmVycm9yID0gbnVsbDtcbiAgICAgICAgICBlbnVtZXJhdG9yLl9zZXR0bGVkQXQoZW50cnkuX3N0YXRlLCBpLCBlbnRyeS5fcmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbnVtZXJhdG9yLl93aWxsU2V0dGxlQXQoYy5yZXNvbHZlKGVudHJ5KSwgaSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudW1lcmF0b3IuX3JlbWFpbmluZy0tO1xuICAgICAgICBlbnVtZXJhdG9yLl9yZXN1bHRbaV0gPSBlbnRyeTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl9zZXR0bGVkQXQgPSBmdW5jdGlvbihzdGF0ZSwgaSwgdmFsdWUpIHtcbiAgICAgIHZhciBlbnVtZXJhdG9yID0gdGhpcztcbiAgICAgIHZhciBwcm9taXNlID0gZW51bWVyYXRvci5wcm9taXNlO1xuXG4gICAgICBpZiAocHJvbWlzZS5fc3RhdGUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcpIHtcbiAgICAgICAgZW51bWVyYXRvci5fcmVtYWluaW5nLS07XG5cbiAgICAgICAgaWYgKHN0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRCkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW51bWVyYXRvci5fcmVzdWx0W2ldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGVudW1lcmF0b3IuX3JlbWFpbmluZyA9PT0gMCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIGVudW1lcmF0b3IuX3Jlc3VsdCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5fd2lsbFNldHRsZUF0ID0gZnVuY3Rpb24ocHJvbWlzZSwgaSkge1xuICAgICAgdmFyIGVudW1lcmF0b3IgPSB0aGlzO1xuXG4gICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRzdWJzY3JpYmUocHJvbWlzZSwgdW5kZWZpbmVkLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICBlbnVtZXJhdG9yLl9zZXR0bGVkQXQobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVELCBpLCB2YWx1ZSk7XG4gICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgZW51bWVyYXRvci5fc2V0dGxlZEF0KGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFJFSkVDVEVELCBpLCByZWFzb24pO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRhbGwkJGFsbChlbnRyaWVzKSB7XG4gICAgICByZXR1cm4gbmV3IGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRkZWZhdWx0KHRoaXMsIGVudHJpZXMpLnByb21pc2U7XG4gICAgfVxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRhbGwkJGRlZmF1bHQgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRhbGwkJGFsbDtcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyYWNlJCRyYWNlKGVudHJpZXMpIHtcbiAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gICAgICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzO1xuXG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBDb25zdHJ1Y3RvcihsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRub29wKTtcblxuICAgICAgaWYgKCFsaWIkZXM2JHByb21pc2UkdXRpbHMkJGlzQXJyYXkoZW50cmllcykpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYW4gYXJyYXkgdG8gcmFjZS4nKSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgfVxuXG4gICAgICB2YXIgbGVuZ3RoID0gZW50cmllcy5sZW5ndGg7XG5cbiAgICAgIGZ1bmN0aW9uIG9uRnVsZmlsbG1lbnQodmFsdWUpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG9uUmVqZWN0aW9uKHJlYXNvbikge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IHByb21pc2UuX3N0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQRU5ESU5HICYmIGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRzdWJzY3JpYmUoQ29uc3RydWN0b3IucmVzb2x2ZShlbnRyaWVzW2ldKSwgdW5kZWZpbmVkLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmFjZSQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJhY2UkJHJhY2U7XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVzb2x2ZSQkcmVzb2x2ZShvYmplY3QpIHtcbiAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gICAgICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzO1xuXG4gICAgICBpZiAob2JqZWN0ICYmIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdC5jb25zdHJ1Y3RvciA9PT0gQ29uc3RydWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgIH1cblxuICAgICAgdmFyIHByb21pc2UgPSBuZXcgQ29uc3RydWN0b3IobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbm9vcCk7XG4gICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIG9iamVjdCk7XG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlc29sdmUkJGRlZmF1bHQgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZXNvbHZlJCRyZXNvbHZlO1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlamVjdCQkcmVqZWN0KHJlYXNvbikge1xuICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICAgIHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7XG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBDb25zdHJ1Y3RvcihsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRub29wKTtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZWplY3QkJGRlZmF1bHQgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZWplY3QkJHJlamVjdDtcblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkY291bnRlciA9IDA7XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkbmVlZHNSZXNvbHZlcigpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYSByZXNvbHZlciBmdW5jdGlvbiBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIHByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkbmVlZHNOZXcoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRmFpbGVkIHRvIGNvbnN0cnVjdCAnUHJvbWlzZSc6IFBsZWFzZSB1c2UgdGhlICduZXcnIG9wZXJhdG9yLCB0aGlzIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uXCIpO1xuICAgIH1cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlO1xuICAgIC8qKlxuICAgICAgUHJvbWlzZSBvYmplY3RzIHJlcHJlc2VudCB0aGUgZXZlbnR1YWwgcmVzdWx0IG9mIGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uIFRoZVxuICAgICAgcHJpbWFyeSB3YXkgb2YgaW50ZXJhY3Rpbmcgd2l0aCBhIHByb21pc2UgaXMgdGhyb3VnaCBpdHMgYHRoZW5gIG1ldGhvZCwgd2hpY2hcbiAgICAgIHJlZ2lzdGVycyBjYWxsYmFja3MgdG8gcmVjZWl2ZSBlaXRoZXIgYSBwcm9taXNlJ3MgZXZlbnR1YWwgdmFsdWUgb3IgdGhlIHJlYXNvblxuICAgICAgd2h5IHRoZSBwcm9taXNlIGNhbm5vdCBiZSBmdWxmaWxsZWQuXG5cbiAgICAgIFRlcm1pbm9sb2d5XG4gICAgICAtLS0tLS0tLS0tLVxuXG4gICAgICAtIGBwcm9taXNlYCBpcyBhbiBvYmplY3Qgb3IgZnVuY3Rpb24gd2l0aCBhIGB0aGVuYCBtZXRob2Qgd2hvc2UgYmVoYXZpb3IgY29uZm9ybXMgdG8gdGhpcyBzcGVjaWZpY2F0aW9uLlxuICAgICAgLSBgdGhlbmFibGVgIGlzIGFuIG9iamVjdCBvciBmdW5jdGlvbiB0aGF0IGRlZmluZXMgYSBgdGhlbmAgbWV0aG9kLlxuICAgICAgLSBgdmFsdWVgIGlzIGFueSBsZWdhbCBKYXZhU2NyaXB0IHZhbHVlIChpbmNsdWRpbmcgdW5kZWZpbmVkLCBhIHRoZW5hYmxlLCBvciBhIHByb21pc2UpLlxuICAgICAgLSBgZXhjZXB0aW9uYCBpcyBhIHZhbHVlIHRoYXQgaXMgdGhyb3duIHVzaW5nIHRoZSB0aHJvdyBzdGF0ZW1lbnQuXG4gICAgICAtIGByZWFzb25gIGlzIGEgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgd2h5IGEgcHJvbWlzZSB3YXMgcmVqZWN0ZWQuXG4gICAgICAtIGBzZXR0bGVkYCB0aGUgZmluYWwgcmVzdGluZyBzdGF0ZSBvZiBhIHByb21pc2UsIGZ1bGZpbGxlZCBvciByZWplY3RlZC5cblxuICAgICAgQSBwcm9taXNlIGNhbiBiZSBpbiBvbmUgb2YgdGhyZWUgc3RhdGVzOiBwZW5kaW5nLCBmdWxmaWxsZWQsIG9yIHJlamVjdGVkLlxuXG4gICAgICBQcm9taXNlcyB0aGF0IGFyZSBmdWxmaWxsZWQgaGF2ZSBhIGZ1bGZpbGxtZW50IHZhbHVlIGFuZCBhcmUgaW4gdGhlIGZ1bGZpbGxlZFxuICAgICAgc3RhdGUuICBQcm9taXNlcyB0aGF0IGFyZSByZWplY3RlZCBoYXZlIGEgcmVqZWN0aW9uIHJlYXNvbiBhbmQgYXJlIGluIHRoZVxuICAgICAgcmVqZWN0ZWQgc3RhdGUuICBBIGZ1bGZpbGxtZW50IHZhbHVlIGlzIG5ldmVyIGEgdGhlbmFibGUuXG5cbiAgICAgIFByb21pc2VzIGNhbiBhbHNvIGJlIHNhaWQgdG8gKnJlc29sdmUqIGEgdmFsdWUuICBJZiB0aGlzIHZhbHVlIGlzIGFsc28gYVxuICAgICAgcHJvbWlzZSwgdGhlbiB0aGUgb3JpZ2luYWwgcHJvbWlzZSdzIHNldHRsZWQgc3RhdGUgd2lsbCBtYXRjaCB0aGUgdmFsdWUnc1xuICAgICAgc2V0dGxlZCBzdGF0ZS4gIFNvIGEgcHJvbWlzZSB0aGF0ICpyZXNvbHZlcyogYSBwcm9taXNlIHRoYXQgcmVqZWN0cyB3aWxsXG4gICAgICBpdHNlbGYgcmVqZWN0LCBhbmQgYSBwcm9taXNlIHRoYXQgKnJlc29sdmVzKiBhIHByb21pc2UgdGhhdCBmdWxmaWxscyB3aWxsXG4gICAgICBpdHNlbGYgZnVsZmlsbC5cblxuXG4gICAgICBCYXNpYyBVc2FnZTpcbiAgICAgIC0tLS0tLS0tLS0tLVxuXG4gICAgICBgYGBqc1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgLy8gb24gc3VjY2Vzc1xuICAgICAgICByZXNvbHZlKHZhbHVlKTtcblxuICAgICAgICAvLyBvbiBmYWlsdXJlXG4gICAgICAgIHJlamVjdChyZWFzb24pO1xuICAgICAgfSk7XG5cbiAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAvLyBvbiBmdWxmaWxsbWVudFxuICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgIC8vIG9uIHJlamVjdGlvblxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQWR2YW5jZWQgVXNhZ2U6XG4gICAgICAtLS0tLS0tLS0tLS0tLS1cblxuICAgICAgUHJvbWlzZXMgc2hpbmUgd2hlbiBhYnN0cmFjdGluZyBhd2F5IGFzeW5jaHJvbm91cyBpbnRlcmFjdGlvbnMgc3VjaCBhc1xuICAgICAgYFhNTEh0dHBSZXF1ZXN0YHMuXG5cbiAgICAgIGBgYGpzXG4gICAgICBmdW5jdGlvbiBnZXRKU09OKHVybCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXtcbiAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICAgICAgICB4aHIub3BlbignR0VUJywgdXJsKTtcbiAgICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gaGFuZGxlcjtcbiAgICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2pzb24nO1xuICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgICAgICAgIHhoci5zZW5kKCk7XG5cbiAgICAgICAgICBmdW5jdGlvbiBoYW5kbGVyKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gdGhpcy5ET05FKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdnZXRKU09OOiBgJyArIHVybCArICdgIGZhaWxlZCB3aXRoIHN0YXR1czogWycgKyB0aGlzLnN0YXR1cyArICddJykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGdldEpTT04oJy9wb3N0cy5qc29uJykudGhlbihmdW5jdGlvbihqc29uKSB7XG4gICAgICAgIC8vIG9uIGZ1bGZpbGxtZW50XG4gICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgLy8gb24gcmVqZWN0aW9uXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBVbmxpa2UgY2FsbGJhY2tzLCBwcm9taXNlcyBhcmUgZ3JlYXQgY29tcG9zYWJsZSBwcmltaXRpdmVzLlxuXG4gICAgICBgYGBqc1xuICAgICAgUHJvbWlzZS5hbGwoW1xuICAgICAgICBnZXRKU09OKCcvcG9zdHMnKSxcbiAgICAgICAgZ2V0SlNPTignL2NvbW1lbnRzJylcbiAgICAgIF0pLnRoZW4oZnVuY3Rpb24odmFsdWVzKXtcbiAgICAgICAgdmFsdWVzWzBdIC8vID0+IHBvc3RzSlNPTlxuICAgICAgICB2YWx1ZXNbMV0gLy8gPT4gY29tbWVudHNKU09OXG5cbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIEBjbGFzcyBQcm9taXNlXG4gICAgICBAcGFyYW0ge2Z1bmN0aW9ufSByZXNvbHZlclxuICAgICAgVXNlZnVsIGZvciB0b29saW5nLlxuICAgICAgQGNvbnN0cnVjdG9yXG4gICAgKi9cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZShyZXNvbHZlcikge1xuICAgICAgdGhpcy5faWQgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkY291bnRlcisrO1xuICAgICAgdGhpcy5fc3RhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9yZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zdWJzY3JpYmVycyA9IFtdO1xuXG4gICAgICBpZiAobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbm9vcCAhPT0gcmVzb2x2ZXIpIHtcbiAgICAgICAgaWYgKCFsaWIkZXM2JHByb21pc2UkdXRpbHMkJGlzRnVuY3Rpb24ocmVzb2x2ZXIpKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJG5lZWRzUmVzb2x2ZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZSkpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkbmVlZHNOZXcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGluaXRpYWxpemVQcm9taXNlKHRoaXMsIHJlc29sdmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5hbGwgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRhbGwkJGRlZmF1bHQ7XG4gICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UucmFjZSA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJhY2UkJGRlZmF1bHQ7XG4gICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UucmVzb2x2ZSA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlc29sdmUkJGRlZmF1bHQ7XG4gICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UucmVqZWN0ID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVqZWN0JCRkZWZhdWx0O1xuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLl9zZXRTY2hlZHVsZXIgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2V0U2NoZWR1bGVyO1xuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLl9zZXRBc2FwID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHNldEFzYXA7XG4gICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UuX2FzYXAgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXNhcDtcblxuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLnByb3RvdHlwZSA9IHtcbiAgICAgIGNvbnN0cnVjdG9yOiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZSxcblxuICAgIC8qKlxuICAgICAgVGhlIHByaW1hcnkgd2F5IG9mIGludGVyYWN0aW5nIHdpdGggYSBwcm9taXNlIGlzIHRocm91Z2ggaXRzIGB0aGVuYCBtZXRob2QsXG4gICAgICB3aGljaCByZWdpc3RlcnMgY2FsbGJhY2tzIHRvIHJlY2VpdmUgZWl0aGVyIGEgcHJvbWlzZSdzIGV2ZW50dWFsIHZhbHVlIG9yIHRoZVxuICAgICAgcmVhc29uIHdoeSB0aGUgcHJvbWlzZSBjYW5ub3QgYmUgZnVsZmlsbGVkLlxuXG4gICAgICBgYGBqc1xuICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uKHVzZXIpe1xuICAgICAgICAvLyB1c2VyIGlzIGF2YWlsYWJsZVxuICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgICAgLy8gdXNlciBpcyB1bmF2YWlsYWJsZSwgYW5kIHlvdSBhcmUgZ2l2ZW4gdGhlIHJlYXNvbiB3aHlcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIENoYWluaW5nXG4gICAgICAtLS0tLS0tLVxuXG4gICAgICBUaGUgcmV0dXJuIHZhbHVlIG9mIGB0aGVuYCBpcyBpdHNlbGYgYSBwcm9taXNlLiAgVGhpcyBzZWNvbmQsICdkb3duc3RyZWFtJ1xuICAgICAgcHJvbWlzZSBpcyByZXNvbHZlZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZpcnN0IHByb21pc2UncyBmdWxmaWxsbWVudFxuICAgICAgb3IgcmVqZWN0aW9uIGhhbmRsZXIsIG9yIHJlamVjdGVkIGlmIHRoZSBoYW5kbGVyIHRocm93cyBhbiBleGNlcHRpb24uXG5cbiAgICAgIGBgYGpzXG4gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgcmV0dXJuIHVzZXIubmFtZTtcbiAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgcmV0dXJuICdkZWZhdWx0IG5hbWUnO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAodXNlck5hbWUpIHtcbiAgICAgICAgLy8gSWYgYGZpbmRVc2VyYCBmdWxmaWxsZWQsIGB1c2VyTmFtZWAgd2lsbCBiZSB0aGUgdXNlcidzIG5hbWUsIG90aGVyd2lzZSBpdFxuICAgICAgICAvLyB3aWxsIGJlIGAnZGVmYXVsdCBuYW1lJ2BcbiAgICAgIH0pO1xuXG4gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCB1c2VyLCBidXQgc3RpbGwgdW5oYXBweScpO1xuICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2BmaW5kVXNlcmAgcmVqZWN0ZWQgYW5kIHdlJ3JlIHVuaGFwcHknKTtcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIC8vIG5ldmVyIHJlYWNoZWRcbiAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgLy8gaWYgYGZpbmRVc2VyYCBmdWxmaWxsZWQsIGByZWFzb25gIHdpbGwgYmUgJ0ZvdW5kIHVzZXIsIGJ1dCBzdGlsbCB1bmhhcHB5Jy5cbiAgICAgICAgLy8gSWYgYGZpbmRVc2VyYCByZWplY3RlZCwgYHJlYXNvbmAgd2lsbCBiZSAnYGZpbmRVc2VyYCByZWplY3RlZCBhbmQgd2UncmUgdW5oYXBweScuXG4gICAgICB9KTtcbiAgICAgIGBgYFxuICAgICAgSWYgdGhlIGRvd25zdHJlYW0gcHJvbWlzZSBkb2VzIG5vdCBzcGVjaWZ5IGEgcmVqZWN0aW9uIGhhbmRsZXIsIHJlamVjdGlvbiByZWFzb25zIHdpbGwgYmUgcHJvcGFnYXRlZCBmdXJ0aGVyIGRvd25zdHJlYW0uXG5cbiAgICAgIGBgYGpzXG4gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBlZGFnb2dpY2FsRXhjZXB0aW9uKCdVcHN0cmVhbSBlcnJvcicpO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgLy8gbmV2ZXIgcmVhY2hlZFxuICAgICAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgLy8gbmV2ZXIgcmVhY2hlZFxuICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAvLyBUaGUgYFBlZGdhZ29jaWFsRXhjZXB0aW9uYCBpcyBwcm9wYWdhdGVkIGFsbCB0aGUgd2F5IGRvd24gdG8gaGVyZVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQXNzaW1pbGF0aW9uXG4gICAgICAtLS0tLS0tLS0tLS1cblxuICAgICAgU29tZXRpbWVzIHRoZSB2YWx1ZSB5b3Ugd2FudCB0byBwcm9wYWdhdGUgdG8gYSBkb3duc3RyZWFtIHByb21pc2UgY2FuIG9ubHkgYmVcbiAgICAgIHJldHJpZXZlZCBhc3luY2hyb25vdXNseS4gVGhpcyBjYW4gYmUgYWNoaWV2ZWQgYnkgcmV0dXJuaW5nIGEgcHJvbWlzZSBpbiB0aGVcbiAgICAgIGZ1bGZpbGxtZW50IG9yIHJlamVjdGlvbiBoYW5kbGVyLiBUaGUgZG93bnN0cmVhbSBwcm9taXNlIHdpbGwgdGhlbiBiZSBwZW5kaW5nXG4gICAgICB1bnRpbCB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBzZXR0bGVkLiBUaGlzIGlzIGNhbGxlZCAqYXNzaW1pbGF0aW9uKi5cblxuICAgICAgYGBganNcbiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgICByZXR1cm4gZmluZENvbW1lbnRzQnlBdXRob3IodXNlcik7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChjb21tZW50cykge1xuICAgICAgICAvLyBUaGUgdXNlcidzIGNvbW1lbnRzIGFyZSBub3cgYXZhaWxhYmxlXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBJZiB0aGUgYXNzaW1saWF0ZWQgcHJvbWlzZSByZWplY3RzLCB0aGVuIHRoZSBkb3duc3RyZWFtIHByb21pc2Ugd2lsbCBhbHNvIHJlamVjdC5cblxuICAgICAgYGBganNcbiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgICByZXR1cm4gZmluZENvbW1lbnRzQnlBdXRob3IodXNlcik7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChjb21tZW50cykge1xuICAgICAgICAvLyBJZiBgZmluZENvbW1lbnRzQnlBdXRob3JgIGZ1bGZpbGxzLCB3ZSdsbCBoYXZlIHRoZSB2YWx1ZSBoZXJlXG4gICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIC8vIElmIGBmaW5kQ29tbWVudHNCeUF1dGhvcmAgcmVqZWN0cywgd2UnbGwgaGF2ZSB0aGUgcmVhc29uIGhlcmVcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIFNpbXBsZSBFeGFtcGxlXG4gICAgICAtLS0tLS0tLS0tLS0tLVxuXG4gICAgICBTeW5jaHJvbm91cyBFeGFtcGxlXG5cbiAgICAgIGBgYGphdmFzY3JpcHRcbiAgICAgIHZhciByZXN1bHQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGZpbmRSZXN1bHQoKTtcbiAgICAgICAgLy8gc3VjY2Vzc1xuICAgICAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAgICAgLy8gZmFpbHVyZVxuICAgICAgfVxuICAgICAgYGBgXG5cbiAgICAgIEVycmJhY2sgRXhhbXBsZVxuXG4gICAgICBgYGBqc1xuICAgICAgZmluZFJlc3VsdChmdW5jdGlvbihyZXN1bHQsIGVycil7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAvLyBmYWlsdXJlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gc3VjY2Vzc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBQcm9taXNlIEV4YW1wbGU7XG5cbiAgICAgIGBgYGphdmFzY3JpcHRcbiAgICAgIGZpbmRSZXN1bHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCl7XG4gICAgICAgIC8vIHN1Y2Nlc3NcbiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgICAgIC8vIGZhaWx1cmVcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIEFkdmFuY2VkIEV4YW1wbGVcbiAgICAgIC0tLS0tLS0tLS0tLS0tXG5cbiAgICAgIFN5bmNocm9ub3VzIEV4YW1wbGVcblxuICAgICAgYGBgamF2YXNjcmlwdFxuICAgICAgdmFyIGF1dGhvciwgYm9va3M7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF1dGhvciA9IGZpbmRBdXRob3IoKTtcbiAgICAgICAgYm9va3MgID0gZmluZEJvb2tzQnlBdXRob3IoYXV0aG9yKTtcbiAgICAgICAgLy8gc3VjY2Vzc1xuICAgICAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAgICAgLy8gZmFpbHVyZVxuICAgICAgfVxuICAgICAgYGBgXG5cbiAgICAgIEVycmJhY2sgRXhhbXBsZVxuXG4gICAgICBgYGBqc1xuXG4gICAgICBmdW5jdGlvbiBmb3VuZEJvb2tzKGJvb2tzKSB7XG5cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZmFpbHVyZShyZWFzb24pIHtcblxuICAgICAgfVxuXG4gICAgICBmaW5kQXV0aG9yKGZ1bmN0aW9uKGF1dGhvciwgZXJyKXtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIGZhaWx1cmUoZXJyKTtcbiAgICAgICAgICAvLyBmYWlsdXJlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZpbmRCb29va3NCeUF1dGhvcihhdXRob3IsIGZ1bmN0aW9uKGJvb2tzLCBlcnIpIHtcbiAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIGZhaWx1cmUoZXJyKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgZm91bmRCb29rcyhib29rcyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAgICAgICAgICAgICAgIGZhaWx1cmUocmVhc29uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIGZhaWx1cmUoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gc3VjY2Vzc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBQcm9taXNlIEV4YW1wbGU7XG5cbiAgICAgIGBgYGphdmFzY3JpcHRcbiAgICAgIGZpbmRBdXRob3IoKS5cbiAgICAgICAgdGhlbihmaW5kQm9va3NCeUF1dGhvcikuXG4gICAgICAgIHRoZW4oZnVuY3Rpb24oYm9va3Mpe1xuICAgICAgICAgIC8vIGZvdW5kIGJvb2tzXG4gICAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFzb24pe1xuICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQG1ldGhvZCB0aGVuXG4gICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBvbkZ1bGZpbGxlZFxuICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gb25SZWplY3RlZFxuICAgICAgVXNlZnVsIGZvciB0b29saW5nLlxuICAgICAgQHJldHVybiB7UHJvbWlzZX1cbiAgICAqL1xuICAgICAgdGhlbjogZnVuY3Rpb24ob25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24pIHtcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXM7XG4gICAgICAgIHZhciBzdGF0ZSA9IHBhcmVudC5fc3RhdGU7XG5cbiAgICAgICAgaWYgKHN0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRUQgJiYgIW9uRnVsZmlsbG1lbnQgfHwgc3RhdGUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFJFSkVDVEVEICYmICFvblJlamVjdGlvbikge1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNoaWxkID0gbmV3IHRoaXMuY29uc3RydWN0b3IobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbm9vcCk7XG4gICAgICAgIHZhciByZXN1bHQgPSBwYXJlbnQuX3Jlc3VsdDtcblxuICAgICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbc3RhdGUgLSAxXTtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXNhcChmdW5jdGlvbigpe1xuICAgICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaW52b2tlQ2FsbGJhY2soc3RhdGUsIGNoaWxkLCBjYWxsYmFjaywgcmVzdWx0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRzdWJzY3JpYmUocGFyZW50LCBjaGlsZCwgb25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfSxcblxuICAgIC8qKlxuICAgICAgYGNhdGNoYCBpcyBzaW1wbHkgc3VnYXIgZm9yIGB0aGVuKHVuZGVmaW5lZCwgb25SZWplY3Rpb24pYCB3aGljaCBtYWtlcyBpdCB0aGUgc2FtZVxuICAgICAgYXMgdGhlIGNhdGNoIGJsb2NrIG9mIGEgdHJ5L2NhdGNoIHN0YXRlbWVudC5cblxuICAgICAgYGBganNcbiAgICAgIGZ1bmN0aW9uIGZpbmRBdXRob3IoKXtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZG4ndCBmaW5kIHRoYXQgYXV0aG9yJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIHN5bmNocm9ub3VzXG4gICAgICB0cnkge1xuICAgICAgICBmaW5kQXV0aG9yKCk7XG4gICAgICB9IGNhdGNoKHJlYXNvbikge1xuICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgICAgfVxuXG4gICAgICAvLyBhc3luYyB3aXRoIHByb21pc2VzXG4gICAgICBmaW5kQXV0aG9yKCkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIEBtZXRob2QgY2F0Y2hcbiAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uUmVqZWN0aW9uXG4gICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuXG4gICAgICBAcmV0dXJuIHtQcm9taXNlfVxuICAgICovXG4gICAgICAnY2F0Y2gnOiBmdW5jdGlvbihvblJlamVjdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVuKG51bGwsIG9uUmVqZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRwb2x5ZmlsbCQkcG9seWZpbGwoKSB7XG4gICAgICB2YXIgbG9jYWw7XG5cbiAgICAgIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGxvY2FsID0gZ2xvYmFsO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBsb2NhbCA9IHNlbGY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGxvY2FsID0gRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncG9seWZpbGwgZmFpbGVkIGJlY2F1c2UgZ2xvYmFsIG9iamVjdCBpcyB1bmF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50Jyk7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgUCA9IGxvY2FsLlByb21pc2U7XG5cbiAgICAgIGlmIChQICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChQLnJlc29sdmUoKSkgPT09ICdbb2JqZWN0IFByb21pc2VdJyAmJiAhUC5jYXN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbG9jYWwuUHJvbWlzZSA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRkZWZhdWx0O1xuICAgIH1cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHBvbHlmaWxsJCRkZWZhdWx0ID0gbGliJGVzNiRwcm9taXNlJHBvbHlmaWxsJCRwb2x5ZmlsbDtcblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkdW1kJCRFUzZQcm9taXNlID0ge1xuICAgICAgJ1Byb21pc2UnOiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkZGVmYXVsdCxcbiAgICAgICdwb2x5ZmlsbCc6IGxpYiRlczYkcHJvbWlzZSRwb2x5ZmlsbCQkZGVmYXVsdFxuICAgIH07XG5cbiAgICAvKiBnbG9iYWwgZGVmaW5lOnRydWUgbW9kdWxlOnRydWUgd2luZG93OiB0cnVlICovXG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lWydhbWQnXSkge1xuICAgICAgZGVmaW5lKGZ1bmN0aW9uKCkgeyByZXR1cm4gbGliJGVzNiRwcm9taXNlJHVtZCQkRVM2UHJvbWlzZTsgfSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGVbJ2V4cG9ydHMnXSkge1xuICAgICAgbW9kdWxlWydleHBvcnRzJ10gPSBsaWIkZXM2JHByb21pc2UkdW1kJCRFUzZQcm9taXNlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzWydFUzZQcm9taXNlJ10gPSBsaWIkZXM2JHByb21pc2UkdW1kJCRFUzZQcm9taXNlO1xuICAgIH1cblxuICAgIGxpYiRlczYkcHJvbWlzZSRwb2x5ZmlsbCQkZGVmYXVsdCgpO1xufSkuY2FsbCh0aGlzKTtcblxuXG59KS5jYWxsKHRoaXMscmVxdWlyZSgnX3Byb2Nlc3MnKSx0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMMjV2WkdWZmJXOWtkV3hsY3k5bGN6WXRjSEp2YldselpTOWthWE4wTDJWek5pMXdjbTl0YVhObExtcHpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSTdRVUZCUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVNJc0ltWnBiR1VpT2lKblpXNWxjbUYwWldRdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lMeW9oWEc0Z0tpQkFiM1psY25acFpYY2daWE0yTFhCeWIyMXBjMlVnTFNCaElIUnBibmtnYVcxd2JHVnRaVzUwWVhScGIyNGdiMllnVUhKdmJXbHpaWE12UVNzdVhHNGdLaUJBWTI5d2VYSnBaMmgwSUVOdmNIbHlhV2RvZENBb1l5a2dNakF4TkNCWlpXaDFaR0VnUzJGMGVpd2dWRzl0SUVSaGJHVXNJRk4wWldaaGJpQlFaVzV1WlhJZ1lXNWtJR052Ym5SeWFXSjFkRzl5Y3lBb1EyOXVkbVZ5YzJsdmJpQjBieUJGVXpZZ1FWQkpJR0o1SUVwaGEyVWdRWEpqYUdsaVlXeGtLVnh1SUNvZ1FHeHBZMlZ1YzJVZ0lDQk1hV05sYm5ObFpDQjFibVJsY2lCTlNWUWdiR2xqWlc1elpWeHVJQ29nSUNBZ0lDQWdJQ0FnSUNCVFpXVWdhSFIwY0hNNkx5OXlZWGN1WjJsMGFIVmlkWE5sY21OdmJuUmxiblF1WTI5dEwycGhhMlZoY21Ob2FXSmhiR1F2WlhNMkxYQnliMjFwYzJVdmJXRnpkR1Z5TDB4SlEwVk9VMFZjYmlBcUlFQjJaWEp6YVc5dUlDQWdNaTR6TGpCY2JpQXFMMXh1WEc0b1puVnVZM1JwYjI0b0tTQjdYRzRnSUNBZ1hDSjFjMlVnYzNSeWFXTjBYQ0k3WEc0Z0lDQWdablZ1WTNScGIyNGdiR2xpSkdWek5pUndjbTl0YVhObEpIVjBhV3h6SkNSdlltcGxZM1JQY2taMWJtTjBhVzl1S0hncElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCMGVYQmxiMllnZUNBOVBUMGdKMloxYm1OMGFXOXVKeUI4ZkNBb2RIbHdaVzltSUhnZ1BUMDlJQ2R2WW1wbFkzUW5JQ1ltSUhnZ0lUMDlJRzUxYkd3cE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdaMWJtTjBhVzl1SUd4cFlpUmxjellrY0hKdmJXbHpaU1IxZEdsc2N5UWthWE5HZFc1amRHbHZiaWg0S1NCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnZEhsd1pXOW1JSGdnUFQwOUlDZG1kVzVqZEdsdmJpYzdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ1puVnVZM1JwYjI0Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhWMGFXeHpKQ1JwYzAxaGVXSmxWR2hsYm1GaWJHVW9lQ2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVJSFI1Y0dWdlppQjRJRDA5UFNBbmIySnFaV04wSnlBbUppQjRJQ0U5UFNCdWRXeHNPMXh1SUNBZ0lIMWNibHh1SUNBZ0lIWmhjaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtkWFJwYkhNa0pGOXBjMEZ5Y21GNU8xeHVJQ0FnSUdsbUlDZ2hRWEp5WVhrdWFYTkJjbkpoZVNrZ2UxeHVJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhWMGFXeHpKQ1JmYVhOQmNuSmhlU0E5SUdaMWJtTjBhVzl1SUNoNEtTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQlBZbXBsWTNRdWNISnZkRzkwZVhCbExuUnZVM1J5YVc1bkxtTmhiR3dvZUNrZ1BUMDlJQ2RiYjJKcVpXTjBJRUZ5Y21GNVhTYzdYRzRnSUNBZ0lDQjlPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrZFhScGJITWtKRjlwYzBGeWNtRjVJRDBnUVhKeVlYa3VhWE5CY25KaGVUdGNiaUFnSUNCOVhHNWNiaUFnSUNCMllYSWdiR2xpSkdWek5pUndjbTl0YVhObEpIVjBhV3h6SkNScGMwRnljbUY1SUQwZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhWMGFXeHpKQ1JmYVhOQmNuSmhlVHRjYmlBZ0lDQjJZWElnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pHeGxiaUE5SURBN1hHNGdJQ0FnZG1GeUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1IwYjFOMGNtbHVaeUE5SUh0OUxuUnZVM1J5YVc1bk8xeHVJQ0FnSUhaaGNpQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrZG1WeWRIaE9aWGgwTzF4dUlDQWdJSFpoY2lCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtZM1Z6ZEc5dFUyTm9aV1IxYkdWeVJtNDdYRzVjYmlBZ0lDQjJZWElnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pHRnpZWEFnUFNCbWRXNWpkR2x2YmlCaGMyRndLR05oYkd4aVlXTnJMQ0JoY21jcElIdGNiaUFnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1J4ZFdWMVpWdHNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrYkdWdVhTQTlJR05oYkd4aVlXTnJPMXh1SUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkhGMVpYVmxXMnhwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSc1pXNGdLeUF4WFNBOUlHRnlaenRjYmlBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSc1pXNGdLejBnTWp0Y2JpQWdJQ0FnSUdsbUlDaHNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrYkdWdUlEMDlQU0F5S1NCN1hHNGdJQ0FnSUNBZ0lDOHZJRWxtSUd4bGJpQnBjeUF5TENCMGFHRjBJRzFsWVc1eklIUm9ZWFFnZDJVZ2JtVmxaQ0IwYnlCelkyaGxaSFZzWlNCaGJpQmhjM2x1WXlCbWJIVnphQzVjYmlBZ0lDQWdJQ0FnTHk4Z1NXWWdZV1JrYVhScGIyNWhiQ0JqWVd4c1ltRmphM01nWVhKbElIRjFaWFZsWkNCaVpXWnZjbVVnZEdobElIRjFaWFZsSUdseklHWnNkWE5vWldRc0lIUm9aWGxjYmlBZ0lDQWdJQ0FnTHk4Z2QybHNiQ0JpWlNCd2NtOWpaWE56WldRZ1lua2dkR2hwY3lCbWJIVnphQ0IwYUdGMElIZGxJR0Z5WlNCelkyaGxaSFZzYVc1bkxseHVJQ0FnSUNBZ0lDQnBaaUFvYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pHTjFjM1J2YlZOamFHVmtkV3hsY2tadUtTQjdYRzRnSUNBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pHTjFjM1J2YlZOamFHVmtkV3hsY2tadUtHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1JtYkhWemFDazdYRzRnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pITmphR1ZrZFd4bFJteDFjMmdvS1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JseHVJQ0FnSUdaMWJtTjBhVzl1SUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUnpaWFJUWTJobFpIVnNaWElvYzJOb1pXUjFiR1ZHYmlrZ2UxeHVJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKR04xYzNSdmJWTmphR1ZrZFd4bGNrWnVJRDBnYzJOb1pXUjFiR1ZHYmp0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JtZFc1amRHbHZiaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtZWE5oY0NRa2MyVjBRWE5oY0NoaGMyRndSbTRwSUh0Y2JpQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUmhjMkZ3SUQwZ1lYTmhjRVp1TzF4dUlDQWdJSDFjYmx4dUlDQWdJSFpoY2lCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtZbkp2ZDNObGNsZHBibVJ2ZHlBOUlDaDBlWEJsYjJZZ2QybHVaRzkzSUNFOVBTQW5kVzVrWldacGJtVmtKeWtnUHlCM2FXNWtiM2NnT2lCMWJtUmxabWx1WldRN1hHNGdJQ0FnZG1GeUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1JpY205M2MyVnlSMnh2WW1Gc0lEMGdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkdKeWIzZHpaWEpYYVc1a2IzY2dmSHdnZTMwN1hHNGdJQ0FnZG1GeUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1JDY205M2MyVnlUWFYwWVhScGIyNVBZbk5sY25abGNpQTlJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSaWNtOTNjMlZ5UjJ4dlltRnNMazExZEdGMGFXOXVUMkp6WlhKMlpYSWdmSHdnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pHSnliM2R6WlhKSGJHOWlZV3d1VjJWaVMybDBUWFYwWVhScGIyNVBZbk5sY25abGNqdGNiaUFnSUNCMllYSWdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkdselRtOWtaU0E5SUhSNWNHVnZaaUJ3Y205alpYTnpJQ0U5UFNBbmRXNWtaV1pwYm1Wa0p5QW1KaUI3ZlM1MGIxTjBjbWx1Wnk1allXeHNLSEJ5YjJObGMzTXBJRDA5UFNBblcyOWlhbVZqZENCd2NtOWpaWE56WFNjN1hHNWNiaUFnSUNBdkx5QjBaWE4wSUdadmNpQjNaV0lnZDI5eWEyVnlJR0oxZENCdWIzUWdhVzRnU1VVeE1GeHVJQ0FnSUhaaGNpQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrYVhOWGIzSnJaWElnUFNCMGVYQmxiMllnVldsdWREaERiR0Z0Y0dWa1FYSnlZWGtnSVQwOUlDZDFibVJsWm1sdVpXUW5JQ1ltWEc0Z0lDQWdJQ0IwZVhCbGIyWWdhVzF3YjNKMFUyTnlhWEIwY3lBaFBUMGdKM1Z1WkdWbWFXNWxaQ2NnSmlaY2JpQWdJQ0FnSUhSNWNHVnZaaUJOWlhOellXZGxRMmhoYm01bGJDQWhQVDBnSjNWdVpHVm1hVzVsWkNjN1hHNWNiaUFnSUNBdkx5QnViMlJsWEc0Z0lDQWdablZ1WTNScGIyNGdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkhWelpVNWxlSFJVYVdOcktDa2dlMXh1SUNBZ0lDQWdkbUZ5SUc1bGVIUlVhV05ySUQwZ2NISnZZMlZ6Y3k1dVpYaDBWR2xqYXp0Y2JpQWdJQ0FnSUM4dklHNXZaR1VnZG1WeWMybHZiaUF3TGpFd0xuZ2daR2x6Y0d4aGVYTWdZU0JrWlhCeVpXTmhkR2x2YmlCM1lYSnVhVzVuSUhkb1pXNGdibVY0ZEZScFkyc2dhWE1nZFhObFpDQnlaV04xY25OcGRtVnNlVnh1SUNBZ0lDQWdMeThnYzJWMFNXMXRaV1JwWVhSbElITm9iM1ZzWkNCaVpTQjFjMlZrSUdsdWMzUmxZV1FnYVc1emRHVmhaRnh1SUNBZ0lDQWdkbUZ5SUhabGNuTnBiMjRnUFNCd2NtOWpaWE56TG5abGNuTnBiMjV6TG01dlpHVXViV0YwWTJnb0wxNG9Qem9vWEZ4a0t5bGNYQzRwUHlnL09paGNYR1FyS1Z4Y0xpay9LRnhjS254Y1hHUXJLU1F2S1R0Y2JpQWdJQ0FnSUdsbUlDaEJjbkpoZVM1cGMwRnljbUY1S0habGNuTnBiMjRwSUNZbUlIWmxjbk5wYjI1Yk1WMGdQVDA5SUNjd0p5QW1KaUIyWlhKemFXOXVXekpkSUQwOVBTQW5NVEFuS1NCN1hHNGdJQ0FnSUNBZ0lHNWxlSFJVYVdOcklEMGdjMlYwU1cxdFpXUnBZWFJsTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJQ0FnY21WMGRYSnVJR1oxYm1OMGFXOXVLQ2tnZTF4dUlDQWdJQ0FnSUNCdVpYaDBWR2xqYXloc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtabXgxYzJncE8xeHVJQ0FnSUNBZ2ZUdGNiaUFnSUNCOVhHNWNiaUFnSUNBdkx5QjJaWEowZUZ4dUlDQWdJR1oxYm1OMGFXOXVJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSMWMyVldaWEowZUZScGJXVnlLQ2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVJR1oxYm1OMGFXOXVLQ2tnZTF4dUlDQWdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtkbVZ5ZEhoT1pYaDBLR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSbWJIVnphQ2s3WEc0Z0lDQWdJQ0I5TzF4dUlDQWdJSDFjYmx4dUlDQWdJR1oxYm1OMGFXOXVJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSMWMyVk5kWFJoZEdsdmJrOWljMlZ5ZG1WeUtDa2dlMXh1SUNBZ0lDQWdkbUZ5SUdsMFpYSmhkR2x2Ym5NZ1BTQXdPMXh1SUNBZ0lDQWdkbUZ5SUc5aWMyVnlkbVZ5SUQwZ2JtVjNJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSQ2NtOTNjMlZ5VFhWMFlYUnBiMjVQWW5ObGNuWmxjaWhzYVdJa1pYTTJKSEJ5YjIxcGMyVWtZWE5oY0NRa1pteDFjMmdwTzF4dUlDQWdJQ0FnZG1GeUlHNXZaR1VnUFNCa2IyTjFiV1Z1ZEM1amNtVmhkR1ZVWlhoMFRtOWtaU2duSnlrN1hHNGdJQ0FnSUNCdlluTmxjblpsY2k1dlluTmxjblpsS0c1dlpHVXNJSHNnWTJoaGNtRmpkR1Z5UkdGMFlUb2dkSEoxWlNCOUtUdGNibHh1SUNBZ0lDQWdjbVYwZFhKdUlHWjFibU4wYVc5dUtDa2dlMXh1SUNBZ0lDQWdJQ0J1YjJSbExtUmhkR0VnUFNBb2FYUmxjbUYwYVc5dWN5QTlJQ3NyYVhSbGNtRjBhVzl1Y3lBbElESXBPMXh1SUNBZ0lDQWdmVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQXZMeUIzWldJZ2QyOXlhMlZ5WEc0Z0lDQWdablZ1WTNScGIyNGdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkhWelpVMWxjM05oWjJWRGFHRnVibVZzS0NrZ2UxeHVJQ0FnSUNBZ2RtRnlJR05vWVc1dVpXd2dQU0J1WlhjZ1RXVnpjMkZuWlVOb1lXNXVaV3dvS1R0Y2JpQWdJQ0FnSUdOb1lXNXVaV3d1Y0c5eWRERXViMjV0WlhOellXZGxJRDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pHWnNkWE5vTzF4dUlDQWdJQ0FnY21WMGRYSnVJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ1kyaGhibTVsYkM1d2IzSjBNaTV3YjNOMFRXVnpjMkZuWlNnd0tUdGNiaUFnSUNBZ0lIMDdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ1puVnVZM1JwYjI0Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKSFZ6WlZObGRGUnBiV1Z2ZFhRb0tTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z1puVnVZM1JwYjI0b0tTQjdYRzRnSUNBZ0lDQWdJSE5sZEZScGJXVnZkWFFvYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pHWnNkWE5vTENBeEtUdGNiaUFnSUNBZ0lIMDdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2RtRnlJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSeGRXVjFaU0E5SUc1bGR5QkJjbkpoZVNneE1EQXdLVHRjYmlBZ0lDQm1kVzVqZEdsdmJpQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrWm14MWMyZ29LU0I3WEc0Z0lDQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Ec2dhU0E4SUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUnNaVzQ3SUdrclBUSXBJSHRjYmlBZ0lDQWdJQ0FnZG1GeUlHTmhiR3hpWVdOcklEMGdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkhGMVpYVmxXMmxkTzF4dUlDQWdJQ0FnSUNCMllYSWdZWEpuSUQwZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKSEYxWlhWbFcya3JNVjA3WEc1Y2JpQWdJQ0FnSUNBZ1kyRnNiR0poWTJzb1lYSm5LVHRjYmx4dUlDQWdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtjWFZsZFdWYmFWMGdQU0IxYm1SbFptbHVaV1E3WEc0Z0lDQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUnhkV1YxWlZ0cEt6RmRJRDBnZFc1a1pXWnBibVZrTzF4dUlDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtiR1Z1SUQwZ01EdGNiaUFnSUNCOVhHNWNiaUFnSUNCbWRXNWpkR2x2YmlCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtZWFIwWlcxd2RGWmxjblJsZUNncElIdGNiaUFnSUNBZ0lIUnllU0I3WEc0Z0lDQWdJQ0FnSUhaaGNpQnlJRDBnY21WeGRXbHlaVHRjYmlBZ0lDQWdJQ0FnZG1GeUlIWmxjblI0SUQwZ2NpZ25kbVZ5ZEhnbktUdGNiaUFnSUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpHRnpZWEFrSkhabGNuUjRUbVY0ZENBOUlIWmxjblI0TG5KMWJrOXVURzl2Y0NCOGZDQjJaWEowZUM1eWRXNVBia052Ym5SbGVIUTdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrZFhObFZtVnlkSGhVYVcxbGNpZ3BPMXh1SUNBZ0lDQWdmU0JqWVhSamFDaGxLU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtZWE5oY0NRa2RYTmxVMlYwVkdsdFpXOTFkQ2dwTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmx4dUlDQWdJSFpoY2lCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtjMk5vWldSMWJHVkdiSFZ6YUR0Y2JpQWdJQ0F2THlCRVpXTnBaR1VnZDJoaGRDQmhjM2x1WXlCdFpYUm9iMlFnZEc4Z2RYTmxJSFJ2SUhSeWFXZG5aWEpwYm1jZ2NISnZZMlZ6YzJsdVp5QnZaaUJ4ZFdWMVpXUWdZMkZzYkdKaFkydHpPbHh1SUNBZ0lHbG1JQ2hzYVdJa1pYTTJKSEJ5YjIxcGMyVWtZWE5oY0NRa2FYTk9iMlJsS1NCN1hHNGdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtjMk5vWldSMWJHVkdiSFZ6YUNBOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1IxYzJWT1pYaDBWR2xqYXlncE8xeHVJQ0FnSUgwZ1pXeHpaU0JwWmlBb2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKRUp5YjNkelpYSk5kWFJoZEdsdmJrOWljMlZ5ZG1WeUtTQjdYRzRnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrYzJOb1pXUjFiR1ZHYkhWemFDQTlJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSMWMyVk5kWFJoZEdsdmJrOWljMlZ5ZG1WeUtDazdYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDaHNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrYVhOWGIzSnJaWElwSUh0Y2JpQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUnpZMmhsWkhWc1pVWnNkWE5vSUQwZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKSFZ6WlUxbGMzTmhaMlZEYUdGdWJtVnNLQ2s3WEc0Z0lDQWdmU0JsYkhObElHbG1JQ2hzYVdJa1pYTTJKSEJ5YjIxcGMyVWtZWE5oY0NRa1luSnZkM05sY2xkcGJtUnZkeUE5UFQwZ2RXNWtaV1pwYm1Wa0lDWW1JSFI1Y0dWdlppQnlaWEYxYVhKbElEMDlQU0FuWm5WdVkzUnBiMjRuS1NCN1hHNGdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtjMk5vWldSMWJHVkdiSFZ6YUNBOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1JoZEhSbGJYQjBWbVZ5ZEdWNEtDazdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUnpZMmhsWkhWc1pVWnNkWE5vSUQwZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdGellYQWtKSFZ6WlZObGRGUnBiV1Z2ZFhRb0tUdGNiaUFnSUNCOVhHNWNiaUFnSUNCbWRXNWpkR2x2YmlCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSdWIyOXdLQ2tnZTMxY2JseHVJQ0FnSUhaaGNpQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUlFSVTVFU1U1SElDQWdQU0IyYjJsa0lEQTdYRzRnSUNBZ2RtRnlJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKRVpWVEVaSlRFeEZSQ0E5SURFN1hHNGdJQ0FnZG1GeUlHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pGSkZTa1ZEVkVWRUlDQTlJREk3WEc1Y2JpQWdJQ0IyWVhJZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa1IwVlVYMVJJUlU1ZlJWSlNUMUlnUFNCdVpYY2diR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtSWEp5YjNKUFltcGxZM1FvS1R0Y2JseHVJQ0FnSUdaMWJtTjBhVzl1SUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkhObGJHWkdkV3hzWm1sc2JHMWxiblFvS1NCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnYm1WM0lGUjVjR1ZGY25KdmNpaGNJbGx2ZFNCallXNXViM1FnY21WemIyeDJaU0JoSUhCeWIyMXBjMlVnZDJsMGFDQnBkSE5sYkdaY0lpazdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ1puVnVZM1JwYjI0Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa1kyRnVibTkwVW1WMGRYSnVUM2R1S0NrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUc1bGR5QlVlWEJsUlhKeWIzSW9KMEVnY0hKdmJXbHpaWE1nWTJGc2JHSmhZMnNnWTJGdWJtOTBJSEpsZEhWeWJpQjBhR0YwSUhOaGJXVWdjSEp2YldselpTNG5LVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQm1kVzVqZEdsdmJpQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUm5aWFJVYUdWdUtIQnliMjFwYzJVcElIdGNiaUFnSUNBZ0lIUnllU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJ3Y205dGFYTmxMblJvWlc0N1hHNGdJQ0FnSUNCOUlHTmhkR05vS0dWeWNtOXlLU0I3WEc0Z0lDQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkVkRlZGOVVTRVZPWDBWU1VrOVNMbVZ5Y205eUlEMGdaWEp5YjNJN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSSFJWUmZWRWhGVGw5RlVsSlBVanRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzVjYmlBZ0lDQm1kVzVqZEdsdmJpQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUjBjbmxVYUdWdUtIUm9aVzRzSUhaaGJIVmxMQ0JtZFd4bWFXeHNiV1Z1ZEVoaGJtUnNaWElzSUhKbGFtVmpkR2x2YmtoaGJtUnNaWElwSUh0Y2JpQWdJQ0FnSUhSeWVTQjdYRzRnSUNBZ0lDQWdJSFJvWlc0dVkyRnNiQ2gyWVd4MVpTd2dablZzWm1sc2JHMWxiblJJWVc1a2JHVnlMQ0J5WldwbFkzUnBiMjVJWVc1a2JHVnlLVHRjYmlBZ0lDQWdJSDBnWTJGMFkyZ29aU2tnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnWlR0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0JtZFc1amRHbHZiaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JvWVc1a2JHVkdiM0psYVdkdVZHaGxibUZpYkdVb2NISnZiV2x6WlN3Z2RHaGxibUZpYkdVc0lIUm9aVzRwSUh0Y2JpQWdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWVhOaGNDUWtZWE5oY0NobWRXNWpkR2x2Ymlod2NtOXRhWE5sS1NCN1hHNGdJQ0FnSUNBZ0lIWmhjaUJ6WldGc1pXUWdQU0JtWVd4elpUdGNiaUFnSUNBZ0lDQWdkbUZ5SUdWeWNtOXlJRDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrZEhKNVZHaGxiaWgwYUdWdUxDQjBhR1Z1WVdKc1pTd2dablZ1WTNScGIyNG9kbUZzZFdVcElIdGNiaUFnSUNBZ0lDQWdJQ0JwWmlBb2MyVmhiR1ZrS1NCN0lISmxkSFZ5YmpzZ2ZWeHVJQ0FnSUNBZ0lDQWdJSE5sWVd4bFpDQTlJSFJ5ZFdVN1hHNGdJQ0FnSUNBZ0lDQWdhV1lnS0hSb1pXNWhZbXhsSUNFOVBTQjJZV3gxWlNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrY21WemIyeDJaU2h3Y205dGFYTmxMQ0IyWVd4MVpTazdYRzRnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pHWjFiR1pwYkd3b2NISnZiV2x6WlN3Z2RtRnNkV1VwTzF4dUlDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdmU3dnWm5WdVkzUnBiMjRvY21WaGMyOXVLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2FXWWdLSE5sWVd4bFpDa2dleUJ5WlhSMWNtNDdJSDFjYmlBZ0lDQWdJQ0FnSUNCelpXRnNaV1FnUFNCMGNuVmxPMXh1WEc0Z0lDQWdJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa2NtVnFaV04wS0hCeWIyMXBjMlVzSUhKbFlYTnZiaWs3WEc0Z0lDQWdJQ0FnSUgwc0lDZFRaWFIwYkdVNklDY2dLeUFvY0hKdmJXbHpaUzVmYkdGaVpXd2dmSHdnSnlCMWJtdHViM2R1SUhCeWIyMXBjMlVuS1NrN1hHNWNiaUFnSUNBZ0lDQWdhV1lnS0NGelpXRnNaV1FnSmlZZ1pYSnliM0lwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnpaV0ZzWldRZ1BTQjBjblZsTzF4dUlDQWdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pISmxhbVZqZENod2NtOXRhWE5sTENCbGNuSnZjaWs3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUgwc0lIQnliMjFwYzJVcE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdaMWJtTjBhVzl1SUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkdoaGJtUnNaVTkzYmxSb1pXNWhZbXhsS0hCeWIyMXBjMlVzSUhSb1pXNWhZbXhsS1NCN1hHNGdJQ0FnSUNCcFppQW9kR2hsYm1GaWJHVXVYM04wWVhSbElEMDlQU0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JHVlV4R1NVeE1SVVFwSUh0Y2JpQWdJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa1puVnNabWxzYkNod2NtOXRhWE5sTENCMGFHVnVZV0pzWlM1ZmNtVnpkV3gwS1R0Y2JpQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb2RHaGxibUZpYkdVdVgzTjBZWFJsSUQwOVBTQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUlNSVXBGUTFSRlJDa2dlMXh1SUNBZ0lDQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1J5WldwbFkzUW9jSEp2YldselpTd2dkR2hsYm1GaWJHVXVYM0psYzNWc2RDazdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUnpkV0p6WTNKcFltVW9kR2hsYm1GaWJHVXNJSFZ1WkdWbWFXNWxaQ3dnWm5WdVkzUnBiMjRvZG1Gc2RXVXBJSHRjYmlBZ0lDQWdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSeVpYTnZiSFpsS0hCeWIyMXBjMlVzSUhaaGJIVmxLVHRjYmlBZ0lDQWdJQ0FnZlN3Z1puVnVZM1JwYjI0b2NtVmhjMjl1S1NCN1hHNGdJQ0FnSUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtjbVZxWldOMEtIQnliMjFwYzJVc0lISmxZWE52YmlrN1hHNGdJQ0FnSUNBZ0lIMHBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNibHh1SUNBZ0lHWjFibU4wYVc5dUlHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pHaGhibVJzWlUxaGVXSmxWR2hsYm1GaWJHVW9jSEp2YldselpTd2diV0Y1WW1WVWFHVnVZV0pzWlNrZ2UxeHVJQ0FnSUNBZ2FXWWdLRzFoZVdKbFZHaGxibUZpYkdVdVkyOXVjM1J5ZFdOMGIzSWdQVDA5SUhCeWIyMXBjMlV1WTI5dWMzUnlkV04wYjNJcElIdGNiaUFnSUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWthR0Z1Wkd4bFQzZHVWR2hsYm1GaWJHVW9jSEp2YldselpTd2diV0Y1WW1WVWFHVnVZV0pzWlNrN1hHNGdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNCMllYSWdkR2hsYmlBOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pHZGxkRlJvWlc0b2JXRjVZbVZVYUdWdVlXSnNaU2s3WEc1Y2JpQWdJQ0FnSUNBZ2FXWWdLSFJvWlc0Z1BUMDlJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKRWRGVkY5VVNFVk9YMFZTVWs5U0tTQjdYRzRnSUNBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrY21WcVpXTjBLSEJ5YjIxcGMyVXNJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKRWRGVkY5VVNFVk9YMFZTVWs5U0xtVnljbTl5S1R0Y2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaDBhR1Z1SUQwOVBTQjFibVJsWm1sdVpXUXBJSHRjYmlBZ0lDQWdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSbWRXeG1hV3hzS0hCeWIyMXBjMlVzSUcxaGVXSmxWR2hsYm1GaWJHVXBPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0d4cFlpUmxjellrY0hKdmJXbHpaU1IxZEdsc2N5UWthWE5HZFc1amRHbHZiaWgwYUdWdUtTa2dlMXh1SUNBZ0lDQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkdoaGJtUnNaVVp2Y21WcFoyNVVhR1Z1WVdKc1pTaHdjbTl0YVhObExDQnRZWGxpWlZSb1pXNWhZbXhsTENCMGFHVnVLVHRjYmlBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSbWRXeG1hV3hzS0hCeWIyMXBjMlVzSUcxaGVXSmxWR2hsYm1GaWJHVXBPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1WEc0Z0lDQWdablZ1WTNScGIyNGdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtjbVZ6YjJ4MlpTaHdjbTl0YVhObExDQjJZV3gxWlNrZ2UxeHVJQ0FnSUNBZ2FXWWdLSEJ5YjIxcGMyVWdQVDA5SUhaaGJIVmxLU0I3WEc0Z0lDQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkhKbGFtVmpkQ2h3Y205dGFYTmxMQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1J6Wld4bVJuVnNiR1pwYkd4dFpXNTBLQ2twTzF4dUlDQWdJQ0FnZlNCbGJITmxJR2xtSUNoc2FXSWtaWE0ySkhCeWIyMXBjMlVrZFhScGJITWtKRzlpYW1WamRFOXlSblZ1WTNScGIyNG9kbUZzZFdVcEtTQjdYRzRnSUNBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKR2hoYm1Sc1pVMWhlV0psVkdobGJtRmliR1VvY0hKdmJXbHpaU3dnZG1Gc2RXVXBPMXh1SUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtablZzWm1sc2JDaHdjbTl0YVhObExDQjJZV3gxWlNrN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dVhHNGdJQ0FnWm5WdVkzUnBiMjRnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrY0hWaWJHbHphRkpsYW1WamRHbHZiaWh3Y205dGFYTmxLU0I3WEc0Z0lDQWdJQ0JwWmlBb2NISnZiV2x6WlM1ZmIyNWxjbkp2Y2lrZ2UxeHVJQ0FnSUNBZ0lDQndjbTl0YVhObExsOXZibVZ5Y205eUtIQnliMjFwYzJVdVgzSmxjM1ZzZENrN1hHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pIQjFZbXhwYzJnb2NISnZiV2x6WlNrN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnWm5WdVkzUnBiMjRnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrWm5Wc1ptbHNiQ2h3Y205dGFYTmxMQ0IyWVd4MVpTa2dlMXh1SUNBZ0lDQWdhV1lnS0hCeWIyMXBjMlV1WDNOMFlYUmxJQ0U5UFNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSUVJVNUVTVTVIS1NCN0lISmxkSFZ5YmpzZ2ZWeHVYRzRnSUNBZ0lDQndjbTl0YVhObExsOXlaWE4xYkhRZ1BTQjJZV3gxWlR0Y2JpQWdJQ0FnSUhCeWIyMXBjMlV1WDNOMFlYUmxJRDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrUmxWTVJrbE1URVZFTzF4dVhHNGdJQ0FnSUNCcFppQW9jSEp2YldselpTNWZjM1ZpYzJOeWFXSmxjbk11YkdWdVozUm9JQ0U5UFNBd0tTQjdYRzRnSUNBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUmhjMkZ3SkNSaGMyRndLR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKSEIxWW14cGMyZ3NJSEJ5YjIxcGMyVXBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNibHh1SUNBZ0lHWjFibU4wYVc5dUlHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pISmxhbVZqZENod2NtOXRhWE5sTENCeVpXRnpiMjRwSUh0Y2JpQWdJQ0FnSUdsbUlDaHdjbTl0YVhObExsOXpkR0YwWlNBaFBUMGdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtVRVZPUkVsT1J5a2dleUJ5WlhSMWNtNDdJSDFjYmlBZ0lDQWdJSEJ5YjIxcGMyVXVYM04wWVhSbElEMGdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtVa1ZLUlVOVVJVUTdYRzRnSUNBZ0lDQndjbTl0YVhObExsOXlaWE4xYkhRZ1BTQnlaV0Z6YjI0N1hHNWNiaUFnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNSaGMyRndKQ1JoYzJGd0tHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pIQjFZbXhwYzJoU1pXcGxZM1JwYjI0c0lIQnliMjFwYzJVcE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdaMWJtTjBhVzl1SUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkhOMVluTmpjbWxpWlNod1lYSmxiblFzSUdOb2FXeGtMQ0J2YmtaMWJHWnBiR3h0Wlc1MExDQnZibEpsYW1WamRHbHZiaWtnZTF4dUlDQWdJQ0FnZG1GeUlITjFZbk5qY21saVpYSnpJRDBnY0dGeVpXNTBMbDl6ZFdKelkzSnBZbVZ5Y3p0Y2JpQWdJQ0FnSUhaaGNpQnNaVzVuZEdnZ1BTQnpkV0p6WTNKcFltVnljeTVzWlc1bmRHZzdYRzVjYmlBZ0lDQWdJSEJoY21WdWRDNWZiMjVsY25KdmNpQTlJRzUxYkd3N1hHNWNiaUFnSUNBZ0lITjFZbk5qY21saVpYSnpXMnhsYm1kMGFGMGdQU0JqYUdsc1pEdGNiaUFnSUNBZ0lITjFZbk5qY21saVpYSnpXMnhsYm1kMGFDQXJJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKRVpWVEVaSlRFeEZSRjBnUFNCdmJrWjFiR1pwYkd4dFpXNTBPMXh1SUNBZ0lDQWdjM1ZpYzJOeWFXSmxjbk5iYkdWdVozUm9JQ3NnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrVWtWS1JVTlVSVVJkSUNBOUlHOXVVbVZxWldOMGFXOXVPMXh1WEc0Z0lDQWdJQ0JwWmlBb2JHVnVaM1JvSUQwOVBTQXdJQ1ltSUhCaGNtVnVkQzVmYzNSaGRHVXBJSHRjYmlBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR0Z6WVhBa0pHRnpZWEFvYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrY0hWaWJHbHphQ3dnY0dGeVpXNTBLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzVjYmlBZ0lDQm1kVzVqZEdsdmJpQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUndkV0pzYVhOb0tIQnliMjFwYzJVcElIdGNiaUFnSUNBZ0lIWmhjaUJ6ZFdKelkzSnBZbVZ5Y3lBOUlIQnliMjFwYzJVdVgzTjFZbk5qY21saVpYSnpPMXh1SUNBZ0lDQWdkbUZ5SUhObGRIUnNaV1FnUFNCd2NtOXRhWE5sTGw5emRHRjBaVHRjYmx4dUlDQWdJQ0FnYVdZZ0tITjFZbk5qY21saVpYSnpMbXhsYm1kMGFDQTlQVDBnTUNrZ2V5QnlaWFIxY200N0lIMWNibHh1SUNBZ0lDQWdkbUZ5SUdOb2FXeGtMQ0JqWVd4c1ltRmpheXdnWkdWMFlXbHNJRDBnY0hKdmJXbHpaUzVmY21WemRXeDBPMXh1WEc0Z0lDQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Ec2dhU0E4SUhOMVluTmpjbWxpWlhKekxteGxibWQwYURzZ2FTQXJQU0F6S1NCN1hHNGdJQ0FnSUNBZ0lHTm9hV3hrSUQwZ2MzVmljMk55YVdKbGNuTmJhVjA3WEc0Z0lDQWdJQ0FnSUdOaGJHeGlZV05ySUQwZ2MzVmljMk55YVdKbGNuTmJhU0FySUhObGRIUnNaV1JkTzF4dVhHNGdJQ0FnSUNBZ0lHbG1JQ2hqYUdsc1pDa2dlMXh1SUNBZ0lDQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkdsdWRtOXJaVU5oYkd4aVlXTnJLSE5sZEhSc1pXUXNJR05vYVd4a0xDQmpZV3hzWW1GamF5d2daR1YwWVdsc0tUdGNiaUFnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0JqWVd4c1ltRmpheWhrWlhSaGFXd3BPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUhCeWIyMXBjMlV1WDNOMVluTmpjbWxpWlhKekxteGxibWQwYUNBOUlEQTdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ1puVnVZM1JwYjI0Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa1JYSnliM0pQWW1wbFkzUW9LU0I3WEc0Z0lDQWdJQ0IwYUdsekxtVnljbTl5SUQwZ2JuVnNiRHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQjJZWElnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrVkZKWlgwTkJWRU5JWDBWU1VrOVNJRDBnYm1WM0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pFVnljbTl5VDJKcVpXTjBLQ2s3WEc1Y2JpQWdJQ0JtZFc1amRHbHZiaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1IwY25sRFlYUmphQ2hqWVd4c1ltRmpheXdnWkdWMFlXbHNLU0I3WEc0Z0lDQWdJQ0IwY25rZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1kyRnNiR0poWTJzb1pHVjBZV2xzS1R0Y2JpQWdJQ0FnSUgwZ1kyRjBZMmdvWlNrZ2UxeHVJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUlVVbGxmUTBGVVEwaGZSVkpTVDFJdVpYSnliM0lnUFNCbE8xeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa1ZGSlpYME5CVkVOSVgwVlNVazlTTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmx4dUlDQWdJR1oxYm1OMGFXOXVJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKR2x1ZG05clpVTmhiR3hpWVdOcktITmxkSFJzWldRc0lIQnliMjFwYzJVc0lHTmhiR3hpWVdOckxDQmtaWFJoYVd3cElIdGNiaUFnSUNBZ0lIWmhjaUJvWVhORFlXeHNZbUZqYXlBOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSMWRHbHNjeVFrYVhOR2RXNWpkR2x2YmloallXeHNZbUZqYXlrc1hHNGdJQ0FnSUNBZ0lDQWdkbUZzZFdVc0lHVnljbTl5TENCemRXTmpaV1ZrWldRc0lHWmhhV3hsWkR0Y2JseHVJQ0FnSUNBZ2FXWWdLR2hoYzBOaGJHeGlZV05yS1NCN1hHNGdJQ0FnSUNBZ0lIWmhiSFZsSUQwZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa2RISjVRMkYwWTJnb1kyRnNiR0poWTJzc0lHUmxkR0ZwYkNrN1hHNWNiaUFnSUNBZ0lDQWdhV1lnS0haaGJIVmxJRDA5UFNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSVVVsbGZRMEZVUTBoZlJWSlNUMUlwSUh0Y2JpQWdJQ0FnSUNBZ0lDQm1ZV2xzWldRZ1BTQjBjblZsTzF4dUlDQWdJQ0FnSUNBZ0lHVnljbTl5SUQwZ2RtRnNkV1V1WlhKeWIzSTdYRzRnSUNBZ0lDQWdJQ0FnZG1Gc2RXVWdQU0J1ZFd4c08xeHVJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJSE4xWTJObFpXUmxaQ0E5SUhSeWRXVTdYRzRnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNCcFppQW9jSEp2YldselpTQTlQVDBnZG1Gc2RXVXBJSHRjYmlBZ0lDQWdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSeVpXcGxZM1FvY0hKdmJXbHpaU3dnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrWTJGdWJtOTBVbVYwZFhKdVQzZHVLQ2twTzF4dUlDQWdJQ0FnSUNBZ0lISmxkSFZ5Ymp0Y2JpQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQjJZV3gxWlNBOUlHUmxkR0ZwYkR0Y2JpQWdJQ0FnSUNBZ2MzVmpZMlZsWkdWa0lEMGdkSEoxWlR0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ2FXWWdLSEJ5YjIxcGMyVXVYM04wWVhSbElDRTlQU0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JRUlU1RVNVNUhLU0I3WEc0Z0lDQWdJQ0FnSUM4dklHNXZiM0JjYmlBZ0lDQWdJSDBnWld4elpTQnBaaUFvYUdGelEyRnNiR0poWTJzZ0ppWWdjM1ZqWTJWbFpHVmtLU0I3WEc0Z0lDQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkhKbGMyOXNkbVVvY0hKdmJXbHpaU3dnZG1Gc2RXVXBPMXh1SUNBZ0lDQWdmU0JsYkhObElHbG1JQ2htWVdsc1pXUXBJSHRjYmlBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrY21WcVpXTjBLSEJ5YjIxcGMyVXNJR1Z5Y205eUtUdGNiaUFnSUNBZ0lIMGdaV3h6WlNCcFppQW9jMlYwZEd4bFpDQTlQVDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrUmxWTVJrbE1URVZFS1NCN1hHNGdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pHWjFiR1pwYkd3b2NISnZiV2x6WlN3Z2RtRnNkV1VwTzF4dUlDQWdJQ0FnZlNCbGJITmxJR2xtSUNoelpYUjBiR1ZrSUQwOVBTQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUlNSVXBGUTFSRlJDa2dlMXh1SUNBZ0lDQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1J5WldwbFkzUW9jSEp2YldselpTd2dkbUZzZFdVcE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JseHVJQ0FnSUdaMWJtTjBhVzl1SUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkdsdWFYUnBZV3hwZW1WUWNtOXRhWE5sS0hCeWIyMXBjMlVzSUhKbGMyOXNkbVZ5S1NCN1hHNGdJQ0FnSUNCMGNua2dlMXh1SUNBZ0lDQWdJQ0J5WlhOdmJIWmxjaWhtZFc1amRHbHZiaUJ5WlhOdmJIWmxVSEp2YldselpTaDJZV3gxWlNsN1hHNGdJQ0FnSUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtjbVZ6YjJ4MlpTaHdjbTl0YVhObExDQjJZV3gxWlNrN1hHNGdJQ0FnSUNBZ0lIMHNJR1oxYm1OMGFXOXVJSEpsYW1WamRGQnliMjFwYzJVb2NtVmhjMjl1S1NCN1hHNGdJQ0FnSUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtjbVZxWldOMEtIQnliMjFwYzJVc0lISmxZWE52YmlrN1hHNGdJQ0FnSUNBZ0lIMHBPMXh1SUNBZ0lDQWdmU0JqWVhSamFDaGxLU0I3WEc0Z0lDQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkhKbGFtVmpkQ2h3Y205dGFYTmxMQ0JsS1R0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0JtZFc1amRHbHZiaUJzYVdJa1pYTTJKSEJ5YjIxcGMyVWtaVzUxYldWeVlYUnZjaVFrUlc1MWJXVnlZWFJ2Y2loRGIyNXpkSEoxWTNSdmNpd2dhVzV3ZFhRcElIdGNiaUFnSUNBZ0lIWmhjaUJsYm5WdFpYSmhkRzl5SUQwZ2RHaHBjenRjYmx4dUlDQWdJQ0FnWlc1MWJXVnlZWFJ2Y2k1ZmFXNXpkR0Z1WTJWRGIyNXpkSEoxWTNSdmNpQTlJRU52Ym5OMGNuVmpkRzl5TzF4dUlDQWdJQ0FnWlc1MWJXVnlZWFJ2Y2k1d2NtOXRhWE5sSUQwZ2JtVjNJRU52Ym5OMGNuVmpkRzl5S0d4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkc1dmIzQXBPMXh1WEc0Z0lDQWdJQ0JwWmlBb1pXNTFiV1Z5WVhSdmNpNWZkbUZzYVdSaGRHVkpibkIxZENocGJuQjFkQ2twSUh0Y2JpQWdJQ0FnSUNBZ1pXNTFiV1Z5WVhSdmNpNWZhVzV3ZFhRZ0lDQWdJRDBnYVc1d2RYUTdYRzRnSUNBZ0lDQWdJR1Z1ZFcxbGNtRjBiM0l1YkdWdVozUm9JQ0FnSUNBOUlHbHVjSFYwTG14bGJtZDBhRHRjYmlBZ0lDQWdJQ0FnWlc1MWJXVnlZWFJ2Y2k1ZmNtVnRZV2x1YVc1bklEMGdhVzV3ZFhRdWJHVnVaM1JvTzF4dVhHNGdJQ0FnSUNBZ0lHVnVkVzFsY21GMGIzSXVYMmx1YVhRb0tUdGNibHh1SUNBZ0lDQWdJQ0JwWmlBb1pXNTFiV1Z5WVhSdmNpNXNaVzVuZEdnZ1BUMDlJREFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUm1kV3htYVd4c0tHVnVkVzFsY21GMGIzSXVjSEp2YldselpTd2daVzUxYldWeVlYUnZjaTVmY21WemRXeDBLVHRjYmlBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNCbGJuVnRaWEpoZEc5eUxteGxibWQwYUNBOUlHVnVkVzFsY21GMGIzSXViR1Z1WjNSb0lIeDhJREE3WEc0Z0lDQWdJQ0FnSUNBZ1pXNTFiV1Z5WVhSdmNpNWZaVzUxYldWeVlYUmxLQ2s3WEc0Z0lDQWdJQ0FnSUNBZ2FXWWdLR1Z1ZFcxbGNtRjBiM0l1WDNKbGJXRnBibWx1WnlBOVBUMGdNQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtablZzWm1sc2JDaGxiblZ0WlhKaGRHOXlMbkJ5YjIxcGMyVXNJR1Z1ZFcxbGNtRjBiM0l1WDNKbGMzVnNkQ2s3WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUnlaV3BsWTNRb1pXNTFiV1Z5WVhSdmNpNXdjbTl0YVhObExDQmxiblZ0WlhKaGRHOXlMbDkyWVd4cFpHRjBhVzl1UlhKeWIzSW9LU2s3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1WEc0Z0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpHVnVkVzFsY21GMGIzSWtKRVZ1ZFcxbGNtRjBiM0l1Y0hKdmRHOTBlWEJsTGw5MllXeHBaR0YwWlVsdWNIVjBJRDBnWm5WdVkzUnBiMjRvYVc1d2RYUXBJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQnNhV0lrWlhNMkpIQnliMjFwYzJVa2RYUnBiSE1rSkdselFYSnlZWGtvYVc1d2RYUXBPMXh1SUNBZ0lIMDdYRzVjYmlBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa1pXNTFiV1Z5WVhSdmNpUWtSVzUxYldWeVlYUnZjaTV3Y205MGIzUjVjR1V1WDNaaGJHbGtZWFJwYjI1RmNuSnZjaUE5SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUc1bGR5QkZjbkp2Y2lnblFYSnlZWGtnVFdWMGFHOWtjeUJ0ZFhOMElHSmxJSEJ5YjNacFpHVmtJR0Z1SUVGeWNtRjVKeWs3WEc0Z0lDQWdmVHRjYmx4dUlDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUmxiblZ0WlhKaGRHOXlKQ1JGYm5WdFpYSmhkRzl5TG5CeWIzUnZkSGx3WlM1ZmFXNXBkQ0E5SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUNBZ2RHaHBjeTVmY21WemRXeDBJRDBnYm1WM0lFRnljbUY1S0hSb2FYTXViR1Z1WjNSb0tUdGNiaUFnSUNCOU8xeHVYRzRnSUNBZ2RtRnlJR3hwWWlSbGN6WWtjSEp2YldselpTUmxiblZ0WlhKaGRHOXlKQ1JrWldaaGRXeDBJRDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKR1Z1ZFcxbGNtRjBiM0lrSkVWdWRXMWxjbUYwYjNJN1hHNWNiaUFnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWlc1MWJXVnlZWFJ2Y2lRa1JXNTFiV1Z5WVhSdmNpNXdjbTkwYjNSNWNHVXVYMlZ1ZFcxbGNtRjBaU0E5SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUNBZ2RtRnlJR1Z1ZFcxbGNtRjBiM0lnUFNCMGFHbHpPMXh1WEc0Z0lDQWdJQ0IyWVhJZ2JHVnVaM1JvSUNBOUlHVnVkVzFsY21GMGIzSXViR1Z1WjNSb08xeHVJQ0FnSUNBZ2RtRnlJSEJ5YjIxcGMyVWdQU0JsYm5WdFpYSmhkRzl5TG5CeWIyMXBjMlU3WEc0Z0lDQWdJQ0IyWVhJZ2FXNXdkWFFnSUNBOUlHVnVkVzFsY21GMGIzSXVYMmx1Y0hWME8xeHVYRzRnSUNBZ0lDQm1iM0lnS0haaGNpQnBJRDBnTURzZ2NISnZiV2x6WlM1ZmMzUmhkR1VnUFQwOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pGQkZUa1JKVGtjZ0ppWWdhU0E4SUd4bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ0lDQWdJR1Z1ZFcxbGNtRjBiM0l1WDJWaFkyaEZiblJ5ZVNocGJuQjFkRnRwWFN3Z2FTazdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZUdGNibHh1SUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNSbGJuVnRaWEpoZEc5eUpDUkZiblZ0WlhKaGRHOXlMbkJ5YjNSdmRIbHdaUzVmWldGamFFVnVkSEo1SUQwZ1puVnVZM1JwYjI0b1pXNTBjbmtzSUdrcElIdGNiaUFnSUNBZ0lIWmhjaUJsYm5WdFpYSmhkRzl5SUQwZ2RHaHBjenRjYmlBZ0lDQWdJSFpoY2lCaklEMGdaVzUxYldWeVlYUnZjaTVmYVc1emRHRnVZMlZEYjI1emRISjFZM1J2Y2p0Y2JseHVJQ0FnSUNBZ2FXWWdLR3hwWWlSbGN6WWtjSEp2YldselpTUjFkR2xzY3lRa2FYTk5ZWGxpWlZSb1pXNWhZbXhsS0dWdWRISjVLU2tnZTF4dUlDQWdJQ0FnSUNCcFppQW9aVzUwY25rdVkyOXVjM1J5ZFdOMGIzSWdQVDA5SUdNZ0ppWWdaVzUwY25rdVgzTjBZWFJsSUNFOVBTQnNhV0lrWlhNMkpIQnliMjFwYzJVa0pHbHVkR1Z5Ym1Gc0pDUlFSVTVFU1U1SEtTQjdYRzRnSUNBZ0lDQWdJQ0FnWlc1MGNua3VYMjl1WlhKeWIzSWdQU0J1ZFd4c08xeHVJQ0FnSUNBZ0lDQWdJR1Z1ZFcxbGNtRjBiM0l1WDNObGRIUnNaV1JCZENobGJuUnllUzVmYzNSaGRHVXNJR2tzSUdWdWRISjVMbDl5WlhOMWJIUXBPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUdWdWRXMWxjbUYwYjNJdVgzZHBiR3hUWlhSMGJHVkJkQ2hqTG5KbGMyOXNkbVVvWlc1MGNua3BMQ0JwS1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ1pXNTFiV1Z5WVhSdmNpNWZjbVZ0WVdsdWFXNW5MUzA3WEc0Z0lDQWdJQ0FnSUdWdWRXMWxjbUYwYjNJdVgzSmxjM1ZzZEZ0cFhTQTlJR1Z1ZEhKNU8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgwN1hHNWNiaUFnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrWlc1MWJXVnlZWFJ2Y2lRa1JXNTFiV1Z5WVhSdmNpNXdjbTkwYjNSNWNHVXVYM05sZEhSc1pXUkJkQ0E5SUdaMWJtTjBhVzl1S0hOMFlYUmxMQ0JwTENCMllXeDFaU2tnZTF4dUlDQWdJQ0FnZG1GeUlHVnVkVzFsY21GMGIzSWdQU0IwYUdsek8xeHVJQ0FnSUNBZ2RtRnlJSEJ5YjIxcGMyVWdQU0JsYm5WdFpYSmhkRzl5TG5CeWIyMXBjMlU3WEc1Y2JpQWdJQ0FnSUdsbUlDaHdjbTl0YVhObExsOXpkR0YwWlNBOVBUMGdiR2xpSkdWek5pUndjbTl0YVhObEpDUnBiblJsY201aGJDUWtVRVZPUkVsT1J5a2dlMXh1SUNBZ0lDQWdJQ0JsYm5WdFpYSmhkRzl5TGw5eVpXMWhhVzVwYm1jdExUdGNibHh1SUNBZ0lDQWdJQ0JwWmlBb2MzUmhkR1VnUFQwOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pGSkZTa1ZEVkVWRUtTQjdYRzRnSUNBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrY21WcVpXTjBLSEJ5YjIxcGMyVXNJSFpoYkhWbEtUdGNiaUFnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0JsYm5WdFpYSmhkRzl5TGw5eVpYTjFiSFJiYVYwZ1BTQjJZV3gxWlR0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQnBaaUFvWlc1MWJXVnlZWFJ2Y2k1ZmNtVnRZV2x1YVc1bklEMDlQU0F3S1NCN1hHNGdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pHWjFiR1pwYkd3b2NISnZiV2x6WlN3Z1pXNTFiV1Z5WVhSdmNpNWZjbVZ6ZFd4MEtUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOU8xeHVYRzRnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdWdWRXMWxjbUYwYjNJa0pFVnVkVzFsY21GMGIzSXVjSEp2ZEc5MGVYQmxMbDkzYVd4c1UyVjBkR3hsUVhRZ1BTQm1kVzVqZEdsdmJpaHdjbTl0YVhObExDQnBLU0I3WEc0Z0lDQWdJQ0IyWVhJZ1pXNTFiV1Z5WVhSdmNpQTlJSFJvYVhNN1hHNWNiaUFnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pITjFZbk5qY21saVpTaHdjbTl0YVhObExDQjFibVJsWm1sdVpXUXNJR1oxYm1OMGFXOXVLSFpoYkhWbEtTQjdYRzRnSUNBZ0lDQWdJR1Z1ZFcxbGNtRjBiM0l1WDNObGRIUnNaV1JCZENoc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSR1ZVeEdTVXhNUlVRc0lHa3NJSFpoYkhWbEtUdGNiaUFnSUNBZ0lIMHNJR1oxYm1OMGFXOXVLSEpsWVhOdmJpa2dlMXh1SUNBZ0lDQWdJQ0JsYm5WdFpYSmhkRzl5TGw5elpYUjBiR1ZrUVhRb2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa1VrVktSVU5VUlVRc0lHa3NJSEpsWVhOdmJpazdYRzRnSUNBZ0lDQjlLVHRjYmlBZ0lDQjlPMXh1SUNBZ0lHWjFibU4wYVc5dUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSd2NtOXRhWE5sSkdGc2JDUWtZV3hzS0dWdWRISnBaWE1wSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUJ1WlhjZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkdWdWRXMWxjbUYwYjNJa0pHUmxabUYxYkhRb2RHaHBjeXdnWlc1MGNtbGxjeWt1Y0hKdmJXbHpaVHRjYmlBZ0lDQjlYRzRnSUNBZ2RtRnlJR3hwWWlSbGN6WWtjSEp2YldselpTUndjbTl0YVhObEpHRnNiQ1FrWkdWbVlYVnNkQ0E5SUd4cFlpUmxjellrY0hKdmJXbHpaU1J3Y205dGFYTmxKR0ZzYkNRa1lXeHNPMXh1SUNBZ0lHWjFibU4wYVc5dUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSd2NtOXRhWE5sSkhKaFkyVWtKSEpoWTJVb1pXNTBjbWxsY3lrZ2UxeHVJQ0FnSUNBZ0x5cHFjMmhwYm5RZ2RtRnNhV1IwYUdsek9uUnlkV1VnS2k5Y2JpQWdJQ0FnSUhaaGNpQkRiMjV6ZEhKMVkzUnZjaUE5SUhSb2FYTTdYRzVjYmlBZ0lDQWdJSFpoY2lCd2NtOXRhWE5sSUQwZ2JtVjNJRU52Ym5OMGNuVmpkRzl5S0d4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkc1dmIzQXBPMXh1WEc0Z0lDQWdJQ0JwWmlBb0lXeHBZaVJsY3pZa2NISnZiV2x6WlNSMWRHbHNjeVFrYVhOQmNuSmhlU2hsYm5SeWFXVnpLU2tnZTF4dUlDQWdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSeVpXcGxZM1FvY0hKdmJXbHpaU3dnYm1WM0lGUjVjR1ZGY25KdmNpZ25XVzkxSUcxMWMzUWdjR0Z6Y3lCaGJpQmhjbkpoZVNCMGJ5QnlZV05sTGljcEtUdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIQnliMjFwYzJVN1hHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lIWmhjaUJzWlc1bmRHZ2dQU0JsYm5SeWFXVnpMbXhsYm1kMGFEdGNibHh1SUNBZ0lDQWdablZ1WTNScGIyNGdiMjVHZFd4bWFXeHNiV1Z1ZENoMllXeDFaU2tnZTF4dUlDQWdJQ0FnSUNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSeVpYTnZiSFpsS0hCeWIyMXBjMlVzSUhaaGJIVmxLVHRjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnWm5WdVkzUnBiMjRnYjI1U1pXcGxZM1JwYjI0b2NtVmhjMjl1S1NCN1hHNGdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pISmxhbVZqZENod2NtOXRhWE5sTENCeVpXRnpiMjRwTzF4dUlDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNCbWIzSWdLSFpoY2lCcElEMGdNRHNnY0hKdmJXbHpaUzVmYzNSaGRHVWdQVDA5SUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkZCRlRrUkpUa2NnSmlZZ2FTQThJR3hsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pITjFZbk5qY21saVpTaERiMjV6ZEhKMVkzUnZjaTV5WlhOdmJIWmxLR1Z1ZEhKcFpYTmJhVjBwTENCMWJtUmxabWx1WldRc0lHOXVSblZzWm1sc2JHMWxiblFzSUc5dVVtVnFaV04wYVc5dUtUdGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdjbVYwZFhKdUlIQnliMjFwYzJVN1hHNGdJQ0FnZlZ4dUlDQWdJSFpoY2lCc2FXSWtaWE0ySkhCeWIyMXBjMlVrY0hKdmJXbHpaU1J5WVdObEpDUmtaV1poZFd4MElEMGdiR2xpSkdWek5pUndjbTl0YVhObEpIQnliMjFwYzJVa2NtRmpaU1FrY21GalpUdGNiaUFnSUNCbWRXNWpkR2x2YmlCc2FXSWtaWE0ySkhCeWIyMXBjMlVrY0hKdmJXbHpaU1J5WlhOdmJIWmxKQ1J5WlhOdmJIWmxLRzlpYW1WamRDa2dlMXh1SUNBZ0lDQWdMeXBxYzJocGJuUWdkbUZzYVdSMGFHbHpPblJ5ZFdVZ0tpOWNiaUFnSUNBZ0lIWmhjaUJEYjI1emRISjFZM1J2Y2lBOUlIUm9hWE03WEc1Y2JpQWdJQ0FnSUdsbUlDaHZZbXBsWTNRZ0ppWWdkSGx3Wlc5bUlHOWlhbVZqZENBOVBUMGdKMjlpYW1WamRDY2dKaVlnYjJKcVpXTjBMbU52Ym5OMGNuVmpkRzl5SUQwOVBTQkRiMjV6ZEhKMVkzUnZjaWtnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnYjJKcVpXTjBPMXh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0IyWVhJZ2NISnZiV2x6WlNBOUlHNWxkeUJEYjI1emRISjFZM1J2Y2loc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSdWIyOXdLVHRjYmlBZ0lDQWdJR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKSEpsYzI5c2RtVW9jSEp2YldselpTd2diMkpxWldOMEtUdGNiaUFnSUNBZ0lISmxkSFZ5YmlCd2NtOXRhWE5sTzF4dUlDQWdJSDFjYmlBZ0lDQjJZWElnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSEJ5YjIxcGMyVWtjbVZ6YjJ4MlpTUWtaR1ZtWVhWc2RDQTlJR3hwWWlSbGN6WWtjSEp2YldselpTUndjbTl0YVhObEpISmxjMjlzZG1Va0pISmxjMjlzZG1VN1hHNGdJQ0FnWm5WdVkzUnBiMjRnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSEJ5YjIxcGMyVWtjbVZxWldOMEpDUnlaV3BsWTNRb2NtVmhjMjl1S1NCN1hHNGdJQ0FnSUNBdkttcHphR2x1ZENCMllXeHBaSFJvYVhNNmRISjFaU0FxTDF4dUlDQWdJQ0FnZG1GeUlFTnZibk4wY25WamRHOXlJRDBnZEdocGN6dGNiaUFnSUNBZ0lIWmhjaUJ3Y205dGFYTmxJRDBnYm1WM0lFTnZibk4wY25WamRHOXlLR3hwWWlSbGN6WWtjSEp2YldselpTUWthVzUwWlhKdVlXd2tKRzV2YjNBcE8xeHVJQ0FnSUNBZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkNScGJuUmxjbTVoYkNRa2NtVnFaV04wS0hCeWIyMXBjMlVzSUhKbFlYTnZiaWs3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdjSEp2YldselpUdGNiaUFnSUNCOVhHNGdJQ0FnZG1GeUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSd2NtOXRhWE5sSkhKbGFtVmpkQ1FrWkdWbVlYVnNkQ0E5SUd4cFlpUmxjellrY0hKdmJXbHpaU1J3Y205dGFYTmxKSEpsYW1WamRDUWtjbVZxWldOME8xeHVYRzRnSUNBZ2RtRnlJR3hwWWlSbGN6WWtjSEp2YldselpTUndjbTl0YVhObEpDUmpiM1Z1ZEdWeUlEMGdNRHRjYmx4dUlDQWdJR1oxYm1OMGFXOXVJR3hwWWlSbGN6WWtjSEp2YldselpTUndjbTl0YVhObEpDUnVaV1ZrYzFKbGMyOXNkbVZ5S0NrZ2UxeHVJQ0FnSUNBZ2RHaHliM2NnYm1WM0lGUjVjR1ZGY25KdmNpZ25XVzkxSUcxMWMzUWdjR0Z6Y3lCaElISmxjMjlzZG1WeUlHWjFibU4wYVc5dUlHRnpJSFJvWlNCbWFYSnpkQ0JoY21kMWJXVnVkQ0IwYnlCMGFHVWdjSEp2YldselpTQmpiMjV6ZEhKMVkzUnZjaWNwTzF4dUlDQWdJSDFjYmx4dUlDQWdJR1oxYm1OMGFXOXVJR3hwWWlSbGN6WWtjSEp2YldselpTUndjbTl0YVhObEpDUnVaV1ZrYzA1bGR5Z3BJSHRjYmlBZ0lDQWdJSFJvY205M0lHNWxkeUJVZVhCbFJYSnliM0lvWENKR1lXbHNaV1FnZEc4Z1kyOXVjM1J5ZFdOMElDZFFjbTl0YVhObEp6b2dVR3hsWVhObElIVnpaU0IwYUdVZ0oyNWxkeWNnYjNCbGNtRjBiM0lzSUhSb2FYTWdiMkpxWldOMElHTnZibk4wY25WamRHOXlJR05oYm01dmRDQmlaU0JqWVd4c1pXUWdZWE1nWVNCbWRXNWpkR2x2Ymk1Y0lpazdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2RtRnlJR3hwWWlSbGN6WWtjSEp2YldselpTUndjbTl0YVhObEpDUmtaV1poZFd4MElEMGdiR2xpSkdWek5pUndjbTl0YVhObEpIQnliMjFwYzJVa0pGQnliMjFwYzJVN1hHNGdJQ0FnTHlvcVhHNGdJQ0FnSUNCUWNtOXRhWE5sSUc5aWFtVmpkSE1nY21Wd2NtVnpaVzUwSUhSb1pTQmxkbVZ1ZEhWaGJDQnlaWE4xYkhRZ2IyWWdZVzRnWVhONWJtTm9jbTl1YjNWeklHOXdaWEpoZEdsdmJpNGdWR2hsWEc0Z0lDQWdJQ0J3Y21sdFlYSjVJSGRoZVNCdlppQnBiblJsY21GamRHbHVaeUIzYVhSb0lHRWdjSEp2YldselpTQnBjeUIwYUhKdmRXZG9JR2wwY3lCZ2RHaGxibUFnYldWMGFHOWtMQ0IzYUdsamFGeHVJQ0FnSUNBZ2NtVm5hWE4wWlhKeklHTmhiR3hpWVdOcmN5QjBieUJ5WldObGFYWmxJR1ZwZEdobGNpQmhJSEJ5YjIxcGMyVW5jeUJsZG1WdWRIVmhiQ0IyWVd4MVpTQnZjaUIwYUdVZ2NtVmhjMjl1WEc0Z0lDQWdJQ0IzYUhrZ2RHaGxJSEJ5YjIxcGMyVWdZMkZ1Ym05MElHSmxJR1oxYkdacGJHeGxaQzVjYmx4dUlDQWdJQ0FnVkdWeWJXbHViMnh2WjNsY2JpQWdJQ0FnSUMwdExTMHRMUzB0TFMwdFhHNWNiaUFnSUNBZ0lDMGdZSEJ5YjIxcGMyVmdJR2x6SUdGdUlHOWlhbVZqZENCdmNpQm1kVzVqZEdsdmJpQjNhWFJvSUdFZ1lIUm9aVzVnSUcxbGRHaHZaQ0IzYUc5elpTQmlaV2hoZG1sdmNpQmpiMjVtYjNKdGN5QjBieUIwYUdseklITndaV05wWm1sallYUnBiMjR1WEc0Z0lDQWdJQ0F0SUdCMGFHVnVZV0pzWldBZ2FYTWdZVzRnYjJKcVpXTjBJRzl5SUdaMWJtTjBhVzl1SUhSb1lYUWdaR1ZtYVc1bGN5QmhJR0IwYUdWdVlDQnRaWFJvYjJRdVhHNGdJQ0FnSUNBdElHQjJZV3gxWldBZ2FYTWdZVzU1SUd4bFoyRnNJRXBoZG1GVFkzSnBjSFFnZG1Gc2RXVWdLR2x1WTJ4MVpHbHVaeUIxYm1SbFptbHVaV1FzSUdFZ2RHaGxibUZpYkdVc0lHOXlJR0VnY0hKdmJXbHpaU2t1WEc0Z0lDQWdJQ0F0SUdCbGVHTmxjSFJwYjI1Z0lHbHpJR0VnZG1Gc2RXVWdkR2hoZENCcGN5QjBhSEp2ZDI0Z2RYTnBibWNnZEdobElIUm9jbTkzSUhOMFlYUmxiV1Z1ZEM1Y2JpQWdJQ0FnSUMwZ1lISmxZWE52Ym1BZ2FYTWdZU0IyWVd4MVpTQjBhR0YwSUdsdVpHbGpZWFJsY3lCM2FIa2dZU0J3Y205dGFYTmxJSGRoY3lCeVpXcGxZM1JsWkM1Y2JpQWdJQ0FnSUMwZ1lITmxkSFJzWldSZ0lIUm9aU0JtYVc1aGJDQnlaWE4wYVc1bklITjBZWFJsSUc5bUlHRWdjSEp2YldselpTd2dablZzWm1sc2JHVmtJRzl5SUhKbGFtVmpkR1ZrTGx4dVhHNGdJQ0FnSUNCQklIQnliMjFwYzJVZ1kyRnVJR0psSUdsdUlHOXVaU0J2WmlCMGFISmxaU0J6ZEdGMFpYTTZJSEJsYm1ScGJtY3NJR1oxYkdacGJHeGxaQ3dnYjNJZ2NtVnFaV04wWldRdVhHNWNiaUFnSUNBZ0lGQnliMjFwYzJWeklIUm9ZWFFnWVhKbElHWjFiR1pwYkd4bFpDQm9ZWFpsSUdFZ1puVnNabWxzYkcxbGJuUWdkbUZzZFdVZ1lXNWtJR0Z5WlNCcGJpQjBhR1VnWm5Wc1ptbHNiR1ZrWEc0Z0lDQWdJQ0J6ZEdGMFpTNGdJRkJ5YjIxcGMyVnpJSFJvWVhRZ1lYSmxJSEpsYW1WamRHVmtJR2hoZG1VZ1lTQnlaV3BsWTNScGIyNGdjbVZoYzI5dUlHRnVaQ0JoY21VZ2FXNGdkR2hsWEc0Z0lDQWdJQ0J5WldwbFkzUmxaQ0J6ZEdGMFpTNGdJRUVnWm5Wc1ptbHNiRzFsYm5RZ2RtRnNkV1VnYVhNZ2JtVjJaWElnWVNCMGFHVnVZV0pzWlM1Y2JseHVJQ0FnSUNBZ1VISnZiV2x6WlhNZ1kyRnVJR0ZzYzI4Z1ltVWdjMkZwWkNCMGJ5QXFjbVZ6YjJ4MlpTb2dZU0IyWVd4MVpTNGdJRWxtSUhSb2FYTWdkbUZzZFdVZ2FYTWdZV3h6YnlCaFhHNGdJQ0FnSUNCd2NtOXRhWE5sTENCMGFHVnVJSFJvWlNCdmNtbG5hVzVoYkNCd2NtOXRhWE5sSjNNZ2MyVjBkR3hsWkNCemRHRjBaU0IzYVd4c0lHMWhkR05vSUhSb1pTQjJZV3gxWlNkelhHNGdJQ0FnSUNCelpYUjBiR1ZrSUhOMFlYUmxMaUFnVTI4Z1lTQndjbTl0YVhObElIUm9ZWFFnS25KbGMyOXNkbVZ6S2lCaElIQnliMjFwYzJVZ2RHaGhkQ0J5WldwbFkzUnpJSGRwYkd4Y2JpQWdJQ0FnSUdsMGMyVnNaaUJ5WldwbFkzUXNJR0Z1WkNCaElIQnliMjFwYzJVZ2RHaGhkQ0FxY21WemIyeDJaWE1xSUdFZ2NISnZiV2x6WlNCMGFHRjBJR1oxYkdacGJHeHpJSGRwYkd4Y2JpQWdJQ0FnSUdsMGMyVnNaaUJtZFd4bWFXeHNMbHh1WEc1Y2JpQWdJQ0FnSUVKaGMybGpJRlZ6WVdkbE9seHVJQ0FnSUNBZ0xTMHRMUzB0TFMwdExTMHRYRzVjYmlBZ0lDQWdJR0JnWUdwelhHNGdJQ0FnSUNCMllYSWdjSEp2YldselpTQTlJRzVsZHlCUWNtOXRhWE5sS0daMWJtTjBhVzl1S0hKbGMyOXNkbVVzSUhKbGFtVmpkQ2tnZTF4dUlDQWdJQ0FnSUNBdkx5QnZiaUJ6ZFdOalpYTnpYRzRnSUNBZ0lDQWdJSEpsYzI5c2RtVW9kbUZzZFdVcE8xeHVYRzRnSUNBZ0lDQWdJQzh2SUc5dUlHWmhhV3gxY21WY2JpQWdJQ0FnSUNBZ2NtVnFaV04wS0hKbFlYTnZiaWs3WEc0Z0lDQWdJQ0I5S1R0Y2JseHVJQ0FnSUNBZ2NISnZiV2x6WlM1MGFHVnVLR1oxYm1OMGFXOXVLSFpoYkhWbEtTQjdYRzRnSUNBZ0lDQWdJQzh2SUc5dUlHWjFiR1pwYkd4dFpXNTBYRzRnSUNBZ0lDQjlMQ0JtZFc1amRHbHZiaWh5WldGemIyNHBJSHRjYmlBZ0lDQWdJQ0FnTHk4Z2IyNGdjbVZxWldOMGFXOXVYRzRnSUNBZ0lDQjlLVHRjYmlBZ0lDQWdJR0JnWUZ4dVhHNGdJQ0FnSUNCQlpIWmhibU5sWkNCVmMyRm5aVHBjYmlBZ0lDQWdJQzB0TFMwdExTMHRMUzB0TFMwdExWeHVYRzRnSUNBZ0lDQlFjbTl0YVhObGN5QnphR2x1WlNCM2FHVnVJR0ZpYzNSeVlXTjBhVzVuSUdGM1lYa2dZWE41Ym1Ob2NtOXViM1Z6SUdsdWRHVnlZV04wYVc5dWN5QnpkV05vSUdGelhHNGdJQ0FnSUNCZ1dFMU1TSFIwY0ZKbGNYVmxjM1JnY3k1Y2JseHVJQ0FnSUNBZ1lHQmdhbk5jYmlBZ0lDQWdJR1oxYm1OMGFXOXVJR2RsZEVwVFQwNG9kWEpzS1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCdVpYY2dVSEp2YldselpTaG1kVzVqZEdsdmJpaHlaWE52YkhabExDQnlaV3BsWTNRcGUxeHVJQ0FnSUNBZ0lDQWdJSFpoY2lCNGFISWdQU0J1WlhjZ1dFMU1TSFIwY0ZKbGNYVmxjM1FvS1R0Y2JseHVJQ0FnSUNBZ0lDQWdJSGhvY2k1dmNHVnVLQ2RIUlZRbkxDQjFjbXdwTzF4dUlDQWdJQ0FnSUNBZ0lIaG9jaTV2Ym5KbFlXUjVjM1JoZEdWamFHRnVaMlVnUFNCb1lXNWtiR1Z5TzF4dUlDQWdJQ0FnSUNBZ0lIaG9jaTV5WlhOd2IyNXpaVlI1Y0dVZ1BTQW5hbk52YmljN1hHNGdJQ0FnSUNBZ0lDQWdlR2h5TG5ObGRGSmxjWFZsYzNSSVpXRmtaWElvSjBGalkyVndkQ2NzSUNkaGNIQnNhV05oZEdsdmJpOXFjMjl1SnlrN1hHNGdJQ0FnSUNBZ0lDQWdlR2h5TG5ObGJtUW9LVHRjYmx4dUlDQWdJQ0FnSUNBZ0lHWjFibU4wYVc5dUlHaGhibVJzWlhJb0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9kR2hwY3k1eVpXRmtlVk4wWVhSbElEMDlQU0IwYUdsekxrUlBUa1VwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11YzNSaGRIVnpJRDA5UFNBeU1EQXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhOdmJIWmxLSFJvYVhNdWNtVnpjRzl1YzJVcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGFtVmpkQ2h1WlhjZ1JYSnliM0lvSjJkbGRFcFRUMDQ2SUdBbklDc2dkWEpzSUNzZ0oyQWdabUZwYkdWa0lIZHBkR2dnYzNSaGRIVnpPaUJiSnlBcklIUm9hWE11YzNSaGRIVnpJQ3NnSjEwbktTazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQjlPMXh1SUNBZ0lDQWdJQ0I5S1R0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ1oyVjBTbE5QVGlnbkwzQnZjM1J6TG1wemIyNG5LUzUwYUdWdUtHWjFibU4wYVc5dUtHcHpiMjRwSUh0Y2JpQWdJQ0FnSUNBZ0x5OGdiMjRnWm5Wc1ptbHNiRzFsYm5SY2JpQWdJQ0FnSUgwc0lHWjFibU4wYVc5dUtISmxZWE52YmlrZ2UxeHVJQ0FnSUNBZ0lDQXZMeUJ2YmlCeVpXcGxZM1JwYjI1Y2JpQWdJQ0FnSUgwcE8xeHVJQ0FnSUNBZ1lHQmdYRzVjYmlBZ0lDQWdJRlZ1YkdsclpTQmpZV3hzWW1GamEzTXNJSEJ5YjIxcGMyVnpJR0Z5WlNCbmNtVmhkQ0JqYjIxd2IzTmhZbXhsSUhCeWFXMXBkR2wyWlhNdVhHNWNiaUFnSUNBZ0lHQmdZR3B6WEc0Z0lDQWdJQ0JRY205dGFYTmxMbUZzYkNoYlhHNGdJQ0FnSUNBZ0lHZGxkRXBUVDA0b0p5OXdiM04wY3ljcExGeHVJQ0FnSUNBZ0lDQm5aWFJLVTA5T0tDY3ZZMjl0YldWdWRITW5LVnh1SUNBZ0lDQWdYU2t1ZEdobGJpaG1kVzVqZEdsdmJpaDJZV3gxWlhNcGUxeHVJQ0FnSUNBZ0lDQjJZV3gxWlhOYk1GMGdMeThnUFQ0Z2NHOXpkSE5LVTA5T1hHNGdJQ0FnSUNBZ0lIWmhiSFZsYzFzeFhTQXZMeUE5UGlCamIyMXRaVzUwYzBwVFQwNWNibHh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdkbUZzZFdWek8xeHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQmdZR0JjYmx4dUlDQWdJQ0FnUUdOc1lYTnpJRkJ5YjIxcGMyVmNiaUFnSUNBZ0lFQndZWEpoYlNCN1puVnVZM1JwYjI1OUlISmxjMjlzZG1WeVhHNGdJQ0FnSUNCVmMyVm1kV3dnWm05eUlIUnZiMnhwYm1jdVhHNGdJQ0FnSUNCQVkyOXVjM1J5ZFdOMGIzSmNiaUFnSUNBcUwxeHVJQ0FnSUdaMWJtTjBhVzl1SUd4cFlpUmxjellrY0hKdmJXbHpaU1J3Y205dGFYTmxKQ1JRY205dGFYTmxLSEpsYzI5c2RtVnlLU0I3WEc0Z0lDQWdJQ0IwYUdsekxsOXBaQ0E5SUd4cFlpUmxjellrY0hKdmJXbHpaU1J3Y205dGFYTmxKQ1JqYjNWdWRHVnlLeXM3WEc0Z0lDQWdJQ0IwYUdsekxsOXpkR0YwWlNBOUlIVnVaR1ZtYVc1bFpEdGNiaUFnSUNBZ0lIUm9hWE11WDNKbGMzVnNkQ0E5SUhWdVpHVm1hVzVsWkR0Y2JpQWdJQ0FnSUhSb2FYTXVYM04xWW5OamNtbGlaWEp6SUQwZ1cxMDdYRzVjYmlBZ0lDQWdJR2xtSUNoc2FXSWtaWE0ySkhCeWIyMXBjMlVrSkdsdWRHVnlibUZzSkNSdWIyOXdJQ0U5UFNCeVpYTnZiSFpsY2lrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvSVd4cFlpUmxjellrY0hKdmJXbHpaU1IxZEdsc2N5UWthWE5HZFc1amRHbHZiaWh5WlhOdmJIWmxjaWtwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa2NISnZiV2x6WlNRa2JtVmxaSE5TWlhOdmJIWmxjaWdwTzF4dUlDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdhV1lnS0NFb2RHaHBjeUJwYm5OMFlXNWpaVzltSUd4cFlpUmxjellrY0hKdmJXbHpaU1J3Y205dGFYTmxKQ1JRY205dGFYTmxLU2tnZTF4dUlDQWdJQ0FnSUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNSd2NtOXRhWE5sSkNSdVpXVmtjMDVsZHlncE8xeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrYVc1cGRHbGhiR2w2WlZCeWIyMXBjMlVvZEdocGN5d2djbVZ6YjJ4MlpYSXBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNibHh1SUNBZ0lHeHBZaVJsY3pZa2NISnZiV2x6WlNSd2NtOXRhWE5sSkNSUWNtOXRhWE5sTG1Gc2JDQTlJR3hwWWlSbGN6WWtjSEp2YldselpTUndjbTl0YVhObEpHRnNiQ1FrWkdWbVlYVnNkRHRjYmlBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa2NISnZiV2x6WlNRa1VISnZiV2x6WlM1eVlXTmxJRDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSEJ5YjIxcGMyVWtjbUZqWlNRa1pHVm1ZWFZzZER0Y2JpQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtjSEp2YldselpTUWtVSEp2YldselpTNXlaWE52YkhabElEMGdiR2xpSkdWek5pUndjbTl0YVhObEpIQnliMjFwYzJVa2NtVnpiMngyWlNRa1pHVm1ZWFZzZER0Y2JpQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtjSEp2YldselpTUWtVSEp2YldselpTNXlaV3BsWTNRZ1BTQnNhV0lrWlhNMkpIQnliMjFwYzJVa2NISnZiV2x6WlNSeVpXcGxZM1FrSkdSbFptRjFiSFE3WEc0Z0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpIQnliMjFwYzJVa0pGQnliMjFwYzJVdVgzTmxkRk5qYUdWa2RXeGxjaUE5SUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUnpaWFJUWTJobFpIVnNaWEk3WEc0Z0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpIQnliMjFwYzJVa0pGQnliMjFwYzJVdVgzTmxkRUZ6WVhBZ1BTQnNhV0lrWlhNMkpIQnliMjFwYzJVa1lYTmhjQ1FrYzJWMFFYTmhjRHRjYmlBZ0lDQnNhV0lrWlhNMkpIQnliMjFwYzJVa2NISnZiV2x6WlNRa1VISnZiV2x6WlM1ZllYTmhjQ0E5SUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUmhjMkZ3TzF4dVhHNGdJQ0FnYkdsaUpHVnpOaVJ3Y205dGFYTmxKSEJ5YjIxcGMyVWtKRkJ5YjIxcGMyVXVjSEp2ZEc5MGVYQmxJRDBnZTF4dUlDQWdJQ0FnWTI5dWMzUnlkV04wYjNJNklHeHBZaVJsY3pZa2NISnZiV2x6WlNSd2NtOXRhWE5sSkNSUWNtOXRhWE5sTEZ4dVhHNGdJQ0FnTHlvcVhHNGdJQ0FnSUNCVWFHVWdjSEpwYldGeWVTQjNZWGtnYjJZZ2FXNTBaWEpoWTNScGJtY2dkMmwwYUNCaElIQnliMjFwYzJVZ2FYTWdkR2h5YjNWbmFDQnBkSE1nWUhSb1pXNWdJRzFsZEdodlpDeGNiaUFnSUNBZ0lIZG9hV05vSUhKbFoybHpkR1Z5Y3lCallXeHNZbUZqYTNNZ2RHOGdjbVZqWldsMlpTQmxhWFJvWlhJZ1lTQndjbTl0YVhObEozTWdaWFpsYm5SMVlXd2dkbUZzZFdVZ2IzSWdkR2hsWEc0Z0lDQWdJQ0J5WldGemIyNGdkMmg1SUhSb1pTQndjbTl0YVhObElHTmhibTV2ZENCaVpTQm1kV3htYVd4c1pXUXVYRzVjYmlBZ0lDQWdJR0JnWUdwelhHNGdJQ0FnSUNCbWFXNWtWWE5sY2lncExuUm9aVzRvWm5WdVkzUnBiMjRvZFhObGNpbDdYRzRnSUNBZ0lDQWdJQzh2SUhWelpYSWdhWE1nWVhaaGFXeGhZbXhsWEc0Z0lDQWdJQ0I5TENCbWRXNWpkR2x2YmloeVpXRnpiMjRwZTF4dUlDQWdJQ0FnSUNBdkx5QjFjMlZ5SUdseklIVnVZWFpoYVd4aFlteGxMQ0JoYm1RZ2VXOTFJR0Z5WlNCbmFYWmxiaUIwYUdVZ2NtVmhjMjl1SUhkb2VWeHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQmdZR0JjYmx4dUlDQWdJQ0FnUTJoaGFXNXBibWRjYmlBZ0lDQWdJQzB0TFMwdExTMHRYRzVjYmlBZ0lDQWdJRlJvWlNCeVpYUjFjbTRnZG1Gc2RXVWdiMllnWUhSb1pXNWdJR2x6SUdsMGMyVnNaaUJoSUhCeWIyMXBjMlV1SUNCVWFHbHpJSE5sWTI5dVpDd2dKMlJ2ZDI1emRISmxZVzBuWEc0Z0lDQWdJQ0J3Y205dGFYTmxJR2x6SUhKbGMyOXNkbVZrSUhkcGRHZ2dkR2hsSUhKbGRIVnliaUIyWVd4MVpTQnZaaUIwYUdVZ1ptbHljM1FnY0hKdmJXbHpaU2R6SUdaMWJHWnBiR3h0Wlc1MFhHNGdJQ0FnSUNCdmNpQnlaV3BsWTNScGIyNGdhR0Z1Wkd4bGNpd2diM0lnY21WcVpXTjBaV1FnYVdZZ2RHaGxJR2hoYm1Sc1pYSWdkR2h5YjNkeklHRnVJR1Y0WTJWd2RHbHZiaTVjYmx4dUlDQWdJQ0FnWUdCZ2FuTmNiaUFnSUNBZ0lHWnBibVJWYzJWeUtDa3VkR2hsYmlobWRXNWpkR2x2YmlBb2RYTmxjaWtnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnZFhObGNpNXVZVzFsTzF4dUlDQWdJQ0FnZlN3Z1puVnVZM1JwYjI0Z0tISmxZWE52YmlrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z0oyUmxabUYxYkhRZ2JtRnRaU2M3WEc0Z0lDQWdJQ0I5S1M1MGFHVnVLR1oxYm1OMGFXOXVJQ2gxYzJWeVRtRnRaU2tnZTF4dUlDQWdJQ0FnSUNBdkx5QkpaaUJnWm1sdVpGVnpaWEpnSUdaMWJHWnBiR3hsWkN3Z1lIVnpaWEpPWVcxbFlDQjNhV3hzSUdKbElIUm9aU0IxYzJWeUozTWdibUZ0WlN3Z2IzUm9aWEozYVhObElHbDBYRzRnSUNBZ0lDQWdJQzh2SUhkcGJHd2dZbVVnWUNka1pXWmhkV3gwSUc1aGJXVW5ZRnh1SUNBZ0lDQWdmU2s3WEc1Y2JpQWdJQ0FnSUdacGJtUlZjMlZ5S0NrdWRHaGxiaWhtZFc1amRHbHZiaUFvZFhObGNpa2dlMXh1SUNBZ0lDQWdJQ0IwYUhKdmR5QnVaWGNnUlhKeWIzSW9KMFp2ZFc1a0lIVnpaWElzSUdKMWRDQnpkR2xzYkNCMWJtaGhjSEI1SnlrN1hHNGdJQ0FnSUNCOUxDQm1kVzVqZEdsdmJpQW9jbVZoYzI5dUtTQjdYRzRnSUNBZ0lDQWdJSFJvY205M0lHNWxkeUJGY25KdmNpZ25ZR1pwYm1SVmMyVnlZQ0J5WldwbFkzUmxaQ0JoYm1RZ2QyVW5jbVVnZFc1b1lYQndlU2NwTzF4dUlDQWdJQ0FnZlNrdWRHaGxiaWhtZFc1amRHbHZiaUFvZG1Gc2RXVXBJSHRjYmlBZ0lDQWdJQ0FnTHk4Z2JtVjJaWElnY21WaFkyaGxaRnh1SUNBZ0lDQWdmU3dnWm5WdVkzUnBiMjRnS0hKbFlYTnZiaWtnZTF4dUlDQWdJQ0FnSUNBdkx5QnBaaUJnWm1sdVpGVnpaWEpnSUdaMWJHWnBiR3hsWkN3Z1lISmxZWE52Ym1BZ2QybHNiQ0JpWlNBblJtOTFibVFnZFhObGNpd2dZblYwSUhOMGFXeHNJSFZ1YUdGd2NIa25MbHh1SUNBZ0lDQWdJQ0F2THlCSlppQmdabWx1WkZWelpYSmdJSEpsYW1WamRHVmtMQ0JnY21WaGMyOXVZQ0IzYVd4c0lHSmxJQ2RnWm1sdVpGVnpaWEpnSUhKbGFtVmpkR1ZrSUdGdVpDQjNaU2R5WlNCMWJtaGhjSEI1Snk1Y2JpQWdJQ0FnSUgwcE8xeHVJQ0FnSUNBZ1lHQmdYRzRnSUNBZ0lDQkpaaUIwYUdVZ1pHOTNibk4wY21WaGJTQndjbTl0YVhObElHUnZaWE1nYm05MElITndaV05wWm5rZ1lTQnlaV3BsWTNScGIyNGdhR0Z1Wkd4bGNpd2djbVZxWldOMGFXOXVJSEpsWVhOdmJuTWdkMmxzYkNCaVpTQndjbTl3WVdkaGRHVmtJR1oxY25Sb1pYSWdaRzkzYm5OMGNtVmhiUzVjYmx4dUlDQWdJQ0FnWUdCZ2FuTmNiaUFnSUNBZ0lHWnBibVJWYzJWeUtDa3VkR2hsYmlobWRXNWpkR2x2YmlBb2RYTmxjaWtnZTF4dUlDQWdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1VHVmtZV2R2WjJsallXeEZlR05sY0hScGIyNG9KMVZ3YzNSeVpXRnRJR1Z5Y205eUp5azdYRzRnSUNBZ0lDQjlLUzUwYUdWdUtHWjFibU4wYVc5dUlDaDJZV3gxWlNrZ2UxeHVJQ0FnSUNBZ0lDQXZMeUJ1WlhabGNpQnlaV0ZqYUdWa1hHNGdJQ0FnSUNCOUtTNTBhR1Z1S0daMWJtTjBhVzl1SUNoMllXeDFaU2tnZTF4dUlDQWdJQ0FnSUNBdkx5QnVaWFpsY2lCeVpXRmphR1ZrWEc0Z0lDQWdJQ0I5TENCbWRXNWpkR2x2YmlBb2NtVmhjMjl1S1NCN1hHNGdJQ0FnSUNBZ0lDOHZJRlJvWlNCZ1VHVmtaMkZuYjJOcFlXeEZlR05sY0hScGIyNWdJR2x6SUhCeWIzQmhaMkYwWldRZ1lXeHNJSFJvWlNCM1lYa2daRzkzYmlCMGJ5Qm9aWEpsWEc0Z0lDQWdJQ0I5S1R0Y2JpQWdJQ0FnSUdCZ1lGeHVYRzRnSUNBZ0lDQkJjM05wYldsc1lYUnBiMjVjYmlBZ0lDQWdJQzB0TFMwdExTMHRMUzB0TFZ4dVhHNGdJQ0FnSUNCVGIyMWxkR2x0WlhNZ2RHaGxJSFpoYkhWbElIbHZkU0IzWVc1MElIUnZJSEJ5YjNCaFoyRjBaU0IwYnlCaElHUnZkMjV6ZEhKbFlXMGdjSEp2YldselpTQmpZVzRnYjI1c2VTQmlaVnh1SUNBZ0lDQWdjbVYwY21sbGRtVmtJR0Z6ZVc1amFISnZibTkxYzJ4NUxpQlVhR2x6SUdOaGJpQmlaU0JoWTJocFpYWmxaQ0JpZVNCeVpYUjFjbTVwYm1jZ1lTQndjbTl0YVhObElHbHVJSFJvWlZ4dUlDQWdJQ0FnWm5Wc1ptbHNiRzFsYm5RZ2IzSWdjbVZxWldOMGFXOXVJR2hoYm1Sc1pYSXVJRlJvWlNCa2IzZHVjM1J5WldGdElIQnliMjFwYzJVZ2QybHNiQ0IwYUdWdUlHSmxJSEJsYm1ScGJtZGNiaUFnSUNBZ0lIVnVkR2xzSUhSb1pTQnlaWFIxY201bFpDQndjbTl0YVhObElHbHpJSE5sZEhSc1pXUXVJRlJvYVhNZ2FYTWdZMkZzYkdWa0lDcGhjM05wYldsc1lYUnBiMjRxTGx4dVhHNGdJQ0FnSUNCZ1lHQnFjMXh1SUNBZ0lDQWdabWx1WkZWelpYSW9LUzUwYUdWdUtHWjFibU4wYVc5dUlDaDFjMlZ5S1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCbWFXNWtRMjl0YldWdWRITkNlVUYxZEdodmNpaDFjMlZ5S1R0Y2JpQWdJQ0FnSUgwcExuUm9aVzRvWm5WdVkzUnBiMjRnS0dOdmJXMWxiblJ6S1NCN1hHNGdJQ0FnSUNBZ0lDOHZJRlJvWlNCMWMyVnlKM01nWTI5dGJXVnVkSE1nWVhKbElHNXZkeUJoZG1GcGJHRmliR1ZjYmlBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnWUdCZ1hHNWNiaUFnSUNBZ0lFbG1JSFJvWlNCaGMzTnBiV3hwWVhSbFpDQndjbTl0YVhObElISmxhbVZqZEhNc0lIUm9aVzRnZEdobElHUnZkMjV6ZEhKbFlXMGdjSEp2YldselpTQjNhV3hzSUdGc2MyOGdjbVZxWldOMExseHVYRzRnSUNBZ0lDQmdZR0JxYzF4dUlDQWdJQ0FnWm1sdVpGVnpaWElvS1M1MGFHVnVLR1oxYm1OMGFXOXVJQ2gxYzJWeUtTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQm1hVzVrUTI5dGJXVnVkSE5DZVVGMWRHaHZjaWgxYzJWeUtUdGNiaUFnSUNBZ0lIMHBMblJvWlc0b1puVnVZM1JwYjI0Z0tHTnZiVzFsYm5SektTQjdYRzRnSUNBZ0lDQWdJQzh2SUVsbUlHQm1hVzVrUTI5dGJXVnVkSE5DZVVGMWRHaHZjbUFnWm5Wc1ptbHNiSE1zSUhkbEoyeHNJR2hoZG1VZ2RHaGxJSFpoYkhWbElHaGxjbVZjYmlBZ0lDQWdJSDBzSUdaMWJtTjBhVzl1SUNoeVpXRnpiMjRwSUh0Y2JpQWdJQ0FnSUNBZ0x5OGdTV1lnWUdacGJtUkRiMjF0Wlc1MGMwSjVRWFYwYUc5eVlDQnlaV3BsWTNSekxDQjNaU2RzYkNCb1lYWmxJSFJvWlNCeVpXRnpiMjRnYUdWeVpWeHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQmdZR0JjYmx4dUlDQWdJQ0FnVTJsdGNHeGxJRVY0WVcxd2JHVmNiaUFnSUNBZ0lDMHRMUzB0TFMwdExTMHRMUzB0WEc1Y2JpQWdJQ0FnSUZONWJtTm9jbTl1YjNWeklFVjRZVzF3YkdWY2JseHVJQ0FnSUNBZ1lHQmdhbUYyWVhOamNtbHdkRnh1SUNBZ0lDQWdkbUZ5SUhKbGMzVnNkRHRjYmx4dUlDQWdJQ0FnZEhKNUlIdGNiaUFnSUNBZ0lDQWdjbVZ6ZFd4MElEMGdabWx1WkZKbGMzVnNkQ2dwTzF4dUlDQWdJQ0FnSUNBdkx5QnpkV05qWlhOelhHNGdJQ0FnSUNCOUlHTmhkR05vS0hKbFlYTnZiaWtnZTF4dUlDQWdJQ0FnSUNBdkx5Qm1ZV2xzZFhKbFhHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCZ1lHQmNibHh1SUNBZ0lDQWdSWEp5WW1GamF5QkZlR0Z0Y0d4bFhHNWNiaUFnSUNBZ0lHQmdZR3B6WEc0Z0lDQWdJQ0JtYVc1a1VtVnpkV3gwS0daMWJtTjBhVzl1S0hKbGMzVnNkQ3dnWlhKeUtYdGNiaUFnSUNBZ0lDQWdhV1lnS0dWeWNpa2dlMXh1SUNBZ0lDQWdJQ0FnSUM4dklHWmhhV3gxY21WY2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQXZMeUJ6ZFdOalpYTnpYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnWUdCZ1hHNWNiaUFnSUNBZ0lGQnliMjFwYzJVZ1JYaGhiWEJzWlR0Y2JseHVJQ0FnSUNBZ1lHQmdhbUYyWVhOamNtbHdkRnh1SUNBZ0lDQWdabWx1WkZKbGMzVnNkQ2dwTG5Sb1pXNG9ablZ1WTNScGIyNG9jbVZ6ZFd4MEtYdGNiaUFnSUNBZ0lDQWdMeThnYzNWalkyVnpjMXh1SUNBZ0lDQWdmU3dnWm5WdVkzUnBiMjRvY21WaGMyOXVLWHRjYmlBZ0lDQWdJQ0FnTHk4Z1ptRnBiSFZ5WlZ4dUlDQWdJQ0FnZlNrN1hHNGdJQ0FnSUNCZ1lHQmNibHh1SUNBZ0lDQWdRV1IyWVc1alpXUWdSWGhoYlhCc1pWeHVJQ0FnSUNBZ0xTMHRMUzB0TFMwdExTMHRMUzFjYmx4dUlDQWdJQ0FnVTNsdVkyaHliMjV2ZFhNZ1JYaGhiWEJzWlZ4dVhHNGdJQ0FnSUNCZ1lHQnFZWFpoYzJOeWFYQjBYRzRnSUNBZ0lDQjJZWElnWVhWMGFHOXlMQ0JpYjI5cmN6dGNibHh1SUNBZ0lDQWdkSEo1SUh0Y2JpQWdJQ0FnSUNBZ1lYVjBhRzl5SUQwZ1ptbHVaRUYxZEdodmNpZ3BPMXh1SUNBZ0lDQWdJQ0JpYjI5cmN5QWdQU0JtYVc1a1FtOXZhM05DZVVGMWRHaHZjaWhoZFhSb2IzSXBPMXh1SUNBZ0lDQWdJQ0F2THlCemRXTmpaWE56WEc0Z0lDQWdJQ0I5SUdOaGRHTm9LSEpsWVhOdmJpa2dlMXh1SUNBZ0lDQWdJQ0F2THlCbVlXbHNkWEpsWEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0JnWUdCY2JseHVJQ0FnSUNBZ1JYSnlZbUZqYXlCRmVHRnRjR3hsWEc1Y2JpQWdJQ0FnSUdCZ1lHcHpYRzVjYmlBZ0lDQWdJR1oxYm1OMGFXOXVJR1p2ZFc1a1FtOXZhM01vWW05dmEzTXBJSHRjYmx4dUlDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNCbWRXNWpkR2x2YmlCbVlXbHNkWEpsS0hKbFlYTnZiaWtnZTF4dVhHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lHWnBibVJCZFhSb2IzSW9ablZ1WTNScGIyNG9ZWFYwYUc5eUxDQmxjbklwZTF4dUlDQWdJQ0FnSUNCcFppQW9aWEp5S1NCN1hHNGdJQ0FnSUNBZ0lDQWdabUZwYkhWeVpTaGxjbklwTzF4dUlDQWdJQ0FnSUNBZ0lDOHZJR1poYVd4MWNtVmNiaUFnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0IwY25rZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnWm1sdVpFSnZiMjlyYzBKNVFYVjBhRzl5S0dGMWRHaHZjaXdnWm5WdVkzUnBiMjRvWW05dmEzTXNJR1Z5Y2lrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9aWEp5S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ptRnBiSFZ5WlNobGNuSXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUnllU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCbWIzVnVaRUp2YjJ0ektHSnZiMnR6S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUlHTmhkR05vS0hKbFlYTnZiaWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ptRnBiSFZ5WlNoeVpXRnpiMjRwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdmU2s3WEc0Z0lDQWdJQ0FnSUNBZ2ZTQmpZWFJqYUNobGNuSnZjaWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdabUZwYkhWeVpTaGxjbklwTzF4dUlDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0F2THlCemRXTmpaWE56WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUgwcE8xeHVJQ0FnSUNBZ1lHQmdYRzVjYmlBZ0lDQWdJRkJ5YjIxcGMyVWdSWGhoYlhCc1pUdGNibHh1SUNBZ0lDQWdZR0JnYW1GMllYTmpjbWx3ZEZ4dUlDQWdJQ0FnWm1sdVpFRjFkR2h2Y2lncExseHVJQ0FnSUNBZ0lDQjBhR1Z1S0dacGJtUkNiMjlyYzBKNVFYVjBhRzl5S1M1Y2JpQWdJQ0FnSUNBZ2RHaGxiaWhtZFc1amRHbHZiaWhpYjI5cmN5bDdYRzRnSUNBZ0lDQWdJQ0FnTHk4Z1ptOTFibVFnWW05dmEzTmNiaUFnSUNBZ0lIMHBMbU5oZEdOb0tHWjFibU4wYVc5dUtISmxZWE52YmlsN1hHNGdJQ0FnSUNBZ0lDOHZJSE52YldWMGFHbHVaeUIzWlc1MElIZHliMjVuWEc0Z0lDQWdJQ0I5S1R0Y2JpQWdJQ0FnSUdCZ1lGeHVYRzRnSUNBZ0lDQkFiV1YwYUc5a0lIUm9aVzVjYmlBZ0lDQWdJRUJ3WVhKaGJTQjdSblZ1WTNScGIyNTlJRzl1Um5Wc1ptbHNiR1ZrWEc0Z0lDQWdJQ0JBY0dGeVlXMGdlMFoxYm1OMGFXOXVmU0J2YmxKbGFtVmpkR1ZrWEc0Z0lDQWdJQ0JWYzJWbWRXd2dabTl5SUhSdmIyeHBibWN1WEc0Z0lDQWdJQ0JBY21WMGRYSnVJSHRRY205dGFYTmxmVnh1SUNBZ0lDb3ZYRzRnSUNBZ0lDQjBhR1Z1T2lCbWRXNWpkR2x2YmlodmJrWjFiR1pwYkd4dFpXNTBMQ0J2YmxKbGFtVmpkR2x2YmlrZ2UxeHVJQ0FnSUNBZ0lDQjJZWElnY0dGeVpXNTBJRDBnZEdocGN6dGNiaUFnSUNBZ0lDQWdkbUZ5SUhOMFlYUmxJRDBnY0dGeVpXNTBMbDl6ZEdGMFpUdGNibHh1SUNBZ0lDQWdJQ0JwWmlBb2MzUmhkR1VnUFQwOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNRa2FXNTBaWEp1WVd3a0pFWlZURVpKVEV4RlJDQW1KaUFoYjI1R2RXeG1hV3hzYldWdWRDQjhmQ0J6ZEdGMFpTQTlQVDBnYkdsaUpHVnpOaVJ3Y205dGFYTmxKQ1JwYm5SbGNtNWhiQ1FrVWtWS1JVTlVSVVFnSmlZZ0lXOXVVbVZxWldOMGFXOXVLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTTdYRzRnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNCMllYSWdZMmhwYkdRZ1BTQnVaWGNnZEdocGN5NWpiMjV6ZEhKMVkzUnZjaWhzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1J1YjI5d0tUdGNiaUFnSUNBZ0lDQWdkbUZ5SUhKbGMzVnNkQ0E5SUhCaGNtVnVkQzVmY21WemRXeDBPMXh1WEc0Z0lDQWdJQ0FnSUdsbUlDaHpkR0YwWlNrZ2UxeHVJQ0FnSUNBZ0lDQWdJSFpoY2lCallXeHNZbUZqYXlBOUlHRnlaM1Z0Wlc1MGMxdHpkR0YwWlNBdElERmRPMXh1SUNBZ0lDQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1JoYzJGd0pDUmhjMkZ3S0daMWJtTjBhVzl1S0NsN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JzYVdJa1pYTTJKSEJ5YjIxcGMyVWtKR2x1ZEdWeWJtRnNKQ1JwYm5admEyVkRZV3hzWW1GamF5aHpkR0YwWlN3Z1kyaHBiR1FzSUdOaGJHeGlZV05yTENCeVpYTjFiSFFwTzF4dUlDQWdJQ0FnSUNBZ0lIMHBPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUd4cFlpUmxjellrY0hKdmJXbHpaU1FrYVc1MFpYSnVZV3drSkhOMVluTmpjbWxpWlNod1lYSmxiblFzSUdOb2FXeGtMQ0J2YmtaMWJHWnBiR3h0Wlc1MExDQnZibEpsYW1WamRHbHZiaWs3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1kyaHBiR1E3WEc0Z0lDQWdJQ0I5TEZ4dVhHNGdJQ0FnTHlvcVhHNGdJQ0FnSUNCZ1kyRjBZMmhnSUdseklITnBiWEJzZVNCemRXZGhjaUJtYjNJZ1lIUm9aVzRvZFc1a1pXWnBibVZrTENCdmJsSmxhbVZqZEdsdmJpbGdJSGRvYVdOb0lHMWhhMlZ6SUdsMElIUm9aU0J6WVcxbFhHNGdJQ0FnSUNCaGN5QjBhR1VnWTJGMFkyZ2dZbXh2WTJzZ2IyWWdZU0IwY25rdlkyRjBZMmdnYzNSaGRHVnRaVzUwTGx4dVhHNGdJQ0FnSUNCZ1lHQnFjMXh1SUNBZ0lDQWdablZ1WTNScGIyNGdabWx1WkVGMWRHaHZjaWdwZTF4dUlDQWdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvSjJOdmRXeGtiaWQwSUdacGJtUWdkR2hoZENCaGRYUm9iM0luS1R0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0x5OGdjM2x1WTJoeWIyNXZkWE5jYmlBZ0lDQWdJSFJ5ZVNCN1hHNGdJQ0FnSUNBZ0lHWnBibVJCZFhSb2IzSW9LVHRjYmlBZ0lDQWdJSDBnWTJGMFkyZ29jbVZoYzI5dUtTQjdYRzRnSUNBZ0lDQWdJQzh2SUhOdmJXVjBhR2x1WnlCM1pXNTBJSGR5YjI1blhHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDOHZJR0Z6ZVc1aklIZHBkR2dnY0hKdmJXbHpaWE5jYmlBZ0lDQWdJR1pwYm1SQmRYUm9iM0lvS1M1allYUmphQ2htZFc1amRHbHZiaWh5WldGemIyNHBlMXh1SUNBZ0lDQWdJQ0F2THlCemIyMWxkR2hwYm1jZ2QyVnVkQ0IzY205dVoxeHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQmdZR0JjYmx4dUlDQWdJQ0FnUUcxbGRHaHZaQ0JqWVhSamFGeHVJQ0FnSUNBZ1FIQmhjbUZ0SUh0R2RXNWpkR2x2Ym4wZ2IyNVNaV3BsWTNScGIyNWNiaUFnSUNBZ0lGVnpaV1oxYkNCbWIzSWdkRzl2YkdsdVp5NWNiaUFnSUNBZ0lFQnlaWFIxY200Z2UxQnliMjFwYzJWOVhHNGdJQ0FnS2k5Y2JpQWdJQ0FnSUNkallYUmphQ2M2SUdaMWJtTjBhVzl1S0c5dVVtVnFaV04wYVc5dUtTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TG5Sb1pXNG9iblZzYkN3Z2IyNVNaV3BsWTNScGIyNHBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMDdYRzRnSUNBZ1puVnVZM1JwYjI0Z2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhCdmJIbG1hV3hzSkNSd2IyeDVabWxzYkNncElIdGNiaUFnSUNBZ0lIWmhjaUJzYjJOaGJEdGNibHh1SUNBZ0lDQWdhV1lnS0hSNWNHVnZaaUJuYkc5aVlXd2dJVDA5SUNkMWJtUmxabWx1WldRbktTQjdYRzRnSUNBZ0lDQWdJQ0FnYkc5allXd2dQU0JuYkc5aVlXdzdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLSFI1Y0dWdlppQnpaV3htSUNFOVBTQW5kVzVrWldacGJtVmtKeWtnZTF4dUlDQWdJQ0FnSUNBZ0lHeHZZMkZzSUQwZ2MyVnNaanRjYmlBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnZEhKNUlIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2JHOWpZV3dnUFNCR2RXNWpkR2x2YmlnbmNtVjBkWEp1SUhSb2FYTW5LU2dwTzF4dUlDQWdJQ0FnSUNBZ0lIMGdZMkYwWTJnZ0tHVXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtDZHdiMng1Wm1sc2JDQm1ZV2xzWldRZ1ltVmpZWFZ6WlNCbmJHOWlZV3dnYjJKcVpXTjBJR2x6SUhWdVlYWmhhV3hoWW14bElHbHVJSFJvYVhNZ1pXNTJhWEp2Ym0xbGJuUW5LVHRjYmlBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lIWmhjaUJRSUQwZ2JHOWpZV3d1VUhKdmJXbHpaVHRjYmx4dUlDQWdJQ0FnYVdZZ0tGQWdKaVlnVDJKcVpXTjBMbkJ5YjNSdmRIbHdaUzUwYjFOMGNtbHVaeTVqWVd4c0tGQXVjbVZ6YjJ4MlpTZ3BLU0E5UFQwZ0oxdHZZbXBsWTNRZ1VISnZiV2x6WlYwbklDWW1JQ0ZRTG1OaGMzUXBJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVPMXh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0JzYjJOaGJDNVFjbTl0YVhObElEMGdiR2xpSkdWek5pUndjbTl0YVhObEpIQnliMjFwYzJVa0pHUmxabUYxYkhRN1hHNGdJQ0FnZlZ4dUlDQWdJSFpoY2lCc2FXSWtaWE0ySkhCeWIyMXBjMlVrY0c5c2VXWnBiR3drSkdSbFptRjFiSFFnUFNCc2FXSWtaWE0ySkhCeWIyMXBjMlVrY0c5c2VXWnBiR3drSkhCdmJIbG1hV3hzTzF4dVhHNGdJQ0FnZG1GeUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSMWJXUWtKRVZUTmxCeWIyMXBjMlVnUFNCN1hHNGdJQ0FnSUNBblVISnZiV2x6WlNjNklHeHBZaVJsY3pZa2NISnZiV2x6WlNSd2NtOXRhWE5sSkNSa1pXWmhkV3gwTEZ4dUlDQWdJQ0FnSjNCdmJIbG1hV3hzSnpvZ2JHbGlKR1Z6TmlSd2NtOXRhWE5sSkhCdmJIbG1hV3hzSkNSa1pXWmhkV3gwWEc0Z0lDQWdmVHRjYmx4dUlDQWdJQzhxSUdkc2IySmhiQ0JrWldacGJtVTZkSEoxWlNCdGIyUjFiR1U2ZEhKMVpTQjNhVzVrYjNjNklIUnlkV1VnS2k5Y2JpQWdJQ0JwWmlBb2RIbHdaVzltSUdSbFptbHVaU0E5UFQwZ0oyWjFibU4wYVc5dUp5QW1KaUJrWldacGJtVmJKMkZ0WkNkZEtTQjdYRzRnSUNBZ0lDQmtaV1pwYm1Vb1puVnVZM1JwYjI0b0tTQjdJSEpsZEhWeWJpQnNhV0lrWlhNMkpIQnliMjFwYzJVa2RXMWtKQ1JGVXpaUWNtOXRhWE5sT3lCOUtUdGNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tIUjVjR1Z2WmlCdGIyUjFiR1VnSVQwOUlDZDFibVJsWm1sdVpXUW5JQ1ltSUcxdlpIVnNaVnNuWlhod2IzSjBjeWRkS1NCN1hHNGdJQ0FnSUNCdGIyUjFiR1ZiSjJWNGNHOXlkSE1uWFNBOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSMWJXUWtKRVZUTmxCeWIyMXBjMlU3WEc0Z0lDQWdmU0JsYkhObElHbG1JQ2gwZVhCbGIyWWdkR2hwY3lBaFBUMGdKM1Z1WkdWbWFXNWxaQ2NwSUh0Y2JpQWdJQ0FnSUhSb2FYTmJKMFZUTmxCeWIyMXBjMlVuWFNBOUlHeHBZaVJsY3pZa2NISnZiV2x6WlNSMWJXUWtKRVZUTmxCeWIyMXBjMlU3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdiR2xpSkdWek5pUndjbTl0YVhObEpIQnZiSGxtYVd4c0pDUmtaV1poZFd4MEtDazdYRzU5S1M1allXeHNLSFJvYVhNcE8xeHVYRzRpWFgwPSIsInZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnaXMtZnVuY3Rpb24nKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZvckVhY2hcblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eVxuXG5mdW5jdGlvbiBmb3JFYWNoKGxpc3QsIGl0ZXJhdG9yLCBjb250ZXh0KSB7XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGl0ZXJhdG9yKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpdGVyYXRvciBtdXN0IGJlIGEgZnVuY3Rpb24nKVxuICAgIH1cblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykge1xuICAgICAgICBjb250ZXh0ID0gdGhpc1xuICAgIH1cbiAgICBcbiAgICBpZiAodG9TdHJpbmcuY2FsbChsaXN0KSA9PT0gJ1tvYmplY3QgQXJyYXldJylcbiAgICAgICAgZm9yRWFjaEFycmF5KGxpc3QsIGl0ZXJhdG9yLCBjb250ZXh0KVxuICAgIGVsc2UgaWYgKHR5cGVvZiBsaXN0ID09PSAnc3RyaW5nJylcbiAgICAgICAgZm9yRWFjaFN0cmluZyhsaXN0LCBpdGVyYXRvciwgY29udGV4dClcbiAgICBlbHNlXG4gICAgICAgIGZvckVhY2hPYmplY3QobGlzdCwgaXRlcmF0b3IsIGNvbnRleHQpXG59XG5cbmZ1bmN0aW9uIGZvckVhY2hBcnJheShhcnJheSwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoYXJyYXksIGkpKSB7XG4gICAgICAgICAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIGFycmF5W2ldLCBpLCBhcnJheSlcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaFN0cmluZyhzdHJpbmcsIGl0ZXJhdG9yLCBjb250ZXh0KSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHN0cmluZy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAvLyBubyBzdWNoIHRoaW5nIGFzIGEgc3BhcnNlIHN0cmluZy5cbiAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBzdHJpbmcuY2hhckF0KGkpLCBpLCBzdHJpbmcpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoT2JqZWN0KG9iamVjdCwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICBmb3IgKHZhciBrIGluIG9iamVjdCkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGspKSB7XG4gICAgICAgICAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9iamVjdFtrXSwgaywgb2JqZWN0KVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiKGZ1bmN0aW9uIChnbG9iYWwpe1xudmFyIHdpbjtcblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB3aW4gPSB3aW5kb3c7XG59IGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB3aW4gPSBnbG9iYWw7XG59IGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiKXtcbiAgICB3aW4gPSBzZWxmO1xufSBlbHNlIHtcbiAgICB3aW4gPSB7fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB3aW47XG5cbn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMMjV2WkdWZmJXOWtkV3hsY3k5bmJHOWlZV3d2ZDJsdVpHOTNMbXB6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUk3UVVGQlFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJJaXdpWm1sc1pTSTZJbWRsYm1WeVlYUmxaQzVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUlpTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKMllYSWdkMmx1TzF4dVhHNXBaaUFvZEhsd1pXOW1JSGRwYm1SdmR5QWhQVDBnWENKMWJtUmxabWx1WldSY0lpa2dlMXh1SUNBZ0lIZHBiaUE5SUhkcGJtUnZkenRjYm4wZ1pXeHpaU0JwWmlBb2RIbHdaVzltSUdkc2IySmhiQ0FoUFQwZ1hDSjFibVJsWm1sdVpXUmNJaWtnZTF4dUlDQWdJSGRwYmlBOUlHZHNiMkpoYkR0Y2JuMGdaV3h6WlNCcFppQW9kSGx3Wlc5bUlITmxiR1lnSVQwOUlGd2lkVzVrWldacGJtVmtYQ0lwZTF4dUlDQWdJSGRwYmlBOUlITmxiR1k3WEc1OUlHVnNjMlVnZTF4dUlDQWdJSGRwYmlBOUlIdDlPMXh1ZlZ4dVhHNXRiMlIxYkdVdVpYaHdiM0owY3lBOUlIZHBianRjYmlKZGZRPT0iLCIvKiEgSGFtbWVyLkpTIC0gdjIuMC43IC0gMjAxNi0wNC0yMlxuICogaHR0cDovL2hhbW1lcmpzLmdpdGh1Yi5pby9cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgSm9yaWsgVGFuZ2VsZGVyO1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlICovXG4oZnVuY3Rpb24od2luZG93LCBkb2N1bWVudCwgZXhwb3J0TmFtZSwgdW5kZWZpbmVkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxudmFyIFZFTkRPUl9QUkVGSVhFUyA9IFsnJywgJ3dlYmtpdCcsICdNb3onLCAnTVMnLCAnbXMnLCAnbyddO1xudmFyIFRFU1RfRUxFTUVOVCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG52YXIgVFlQRV9GVU5DVElPTiA9ICdmdW5jdGlvbic7XG5cbnZhciByb3VuZCA9IE1hdGgucm91bmQ7XG52YXIgYWJzID0gTWF0aC5hYnM7XG52YXIgbm93ID0gRGF0ZS5ub3c7XG5cbi8qKlxuICogc2V0IGEgdGltZW91dCB3aXRoIGEgZ2l2ZW4gc2NvcGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge051bWJlcn0gdGltZW91dFxuICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHRcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIHNldFRpbWVvdXRDb250ZXh0KGZuLCB0aW1lb3V0LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQoYmluZEZuKGZuLCBjb250ZXh0KSwgdGltZW91dCk7XG59XG5cbi8qKlxuICogaWYgdGhlIGFyZ3VtZW50IGlzIGFuIGFycmF5LCB3ZSB3YW50IHRvIGV4ZWN1dGUgdGhlIGZuIG9uIGVhY2ggZW50cnlcbiAqIGlmIGl0IGFpbnQgYW4gYXJyYXkgd2UgZG9uJ3Qgd2FudCB0byBkbyBhIHRoaW5nLlxuICogdGhpcyBpcyB1c2VkIGJ5IGFsbCB0aGUgbWV0aG9kcyB0aGF0IGFjY2VwdCBhIHNpbmdsZSBhbmQgYXJyYXkgYXJndW1lbnQuXG4gKiBAcGFyYW0geyp8QXJyYXl9IGFyZ1xuICogQHBhcmFtIHtTdHJpbmd9IGZuXG4gKiBAcGFyYW0ge09iamVjdH0gW2NvbnRleHRdXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaW52b2tlQXJyYXlBcmcoYXJnLCBmbiwgY29udGV4dCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcbiAgICAgICAgZWFjaChhcmcsIGNvbnRleHRbZm5dLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiB3YWxrIG9iamVjdHMgYW5kIGFycmF5c1xuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0b3JcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0XG4gKi9cbmZ1bmN0aW9uIGVhY2gob2JqLCBpdGVyYXRvciwgY29udGV4dCkge1xuICAgIHZhciBpO1xuXG4gICAgaWYgKCFvYmopIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChvYmouZm9yRWFjaCkge1xuICAgICAgICBvYmouZm9yRWFjaChpdGVyYXRvciwgY29udGV4dCk7XG4gICAgfSBlbHNlIGlmIChvYmoubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaSA9IDA7XG4gICAgICAgIHdoaWxlIChpIDwgb2JqLmxlbmd0aCkge1xuICAgICAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpbaV0sIGksIG9iaik7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGkgaW4gb2JqKSB7XG4gICAgICAgICAgICBvYmouaGFzT3duUHJvcGVydHkoaSkgJiYgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpbaV0sIGksIG9iaik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogd3JhcCBhIG1ldGhvZCB3aXRoIGEgZGVwcmVjYXRpb24gd2FybmluZyBhbmQgc3RhY2sgdHJhY2VcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG1ldGhvZFxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgbmV3IGZ1bmN0aW9uIHdyYXBwaW5nIHRoZSBzdXBwbGllZCBtZXRob2QuXG4gKi9cbmZ1bmN0aW9uIGRlcHJlY2F0ZShtZXRob2QsIG5hbWUsIG1lc3NhZ2UpIHtcbiAgICB2YXIgZGVwcmVjYXRpb25NZXNzYWdlID0gJ0RFUFJFQ0FURUQgTUVUSE9EOiAnICsgbmFtZSArICdcXG4nICsgbWVzc2FnZSArICcgQVQgXFxuJztcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlID0gbmV3IEVycm9yKCdnZXQtc3RhY2stdHJhY2UnKTtcbiAgICAgICAgdmFyIHN0YWNrID0gZSAmJiBlLnN0YWNrID8gZS5zdGFjay5yZXBsYWNlKC9eW15cXChdKz9bXFxuJF0vZ20sICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL15cXHMrYXRcXHMrL2dtLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9eT2JqZWN0Ljxhbm9ueW1vdXM+XFxzKlxcKC9nbSwgJ3thbm9ueW1vdXN9KClAJykgOiAnVW5rbm93biBTdGFjayBUcmFjZSc7XG5cbiAgICAgICAgdmFyIGxvZyA9IHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS53YXJuIHx8IHdpbmRvdy5jb25zb2xlLmxvZyk7XG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICAgIGxvZy5jYWxsKHdpbmRvdy5jb25zb2xlLCBkZXByZWNhdGlvbk1lc3NhZ2UsIHN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBleHRlbmQgb2JqZWN0LlxuICogbWVhbnMgdGhhdCBwcm9wZXJ0aWVzIGluIGRlc3Qgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgb25lcyBpbiBzcmMuXG4gKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XG4gKiBAcGFyYW0gey4uLk9iamVjdH0gb2JqZWN0c190b19hc3NpZ25cbiAqIEByZXR1cm5zIHtPYmplY3R9IHRhcmdldFxuICovXG52YXIgYXNzaWduO1xuaWYgKHR5cGVvZiBPYmplY3QuYXNzaWduICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgYXNzaWduID0gZnVuY3Rpb24gYXNzaWduKHRhcmdldCkge1xuICAgICAgICBpZiAodGFyZ2V0ID09PSB1bmRlZmluZWQgfHwgdGFyZ2V0ID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvdXRwdXQgPSBPYmplY3QodGFyZ2V0KTtcbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAxOyBpbmRleCA8IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKHNvdXJjZSAhPT0gdW5kZWZpbmVkICYmIHNvdXJjZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG5leHRLZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkobmV4dEtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtuZXh0S2V5XSA9IHNvdXJjZVtuZXh0S2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH07XG59IGVsc2Uge1xuICAgIGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG59XG5cbi8qKlxuICogZXh0ZW5kIG9iamVjdC5cbiAqIG1lYW5zIHRoYXQgcHJvcGVydGllcyBpbiBkZXN0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIG9uZXMgaW4gc3JjLlxuICogQHBhcmFtIHtPYmplY3R9IGRlc3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBzcmNcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW21lcmdlPWZhbHNlXVxuICogQHJldHVybnMge09iamVjdH0gZGVzdFxuICovXG52YXIgZXh0ZW5kID0gZGVwcmVjYXRlKGZ1bmN0aW9uIGV4dGVuZChkZXN0LCBzcmMsIG1lcmdlKSB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhzcmMpO1xuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGtleXMubGVuZ3RoKSB7XG4gICAgICAgIGlmICghbWVyZ2UgfHwgKG1lcmdlICYmIGRlc3Rba2V5c1tpXV0gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIGRlc3Rba2V5c1tpXV0gPSBzcmNba2V5c1tpXV07XG4gICAgICAgIH1cbiAgICAgICAgaSsrO1xuICAgIH1cbiAgICByZXR1cm4gZGVzdDtcbn0sICdleHRlbmQnLCAnVXNlIGBhc3NpZ25gLicpO1xuXG4vKipcbiAqIG1lcmdlIHRoZSB2YWx1ZXMgZnJvbSBzcmMgaW4gdGhlIGRlc3QuXG4gKiBtZWFucyB0aGF0IHByb3BlcnRpZXMgdGhhdCBleGlzdCBpbiBkZXN0IHdpbGwgbm90IGJlIG92ZXJ3cml0dGVuIGJ5IHNyY1xuICogQHBhcmFtIHtPYmplY3R9IGRlc3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBzcmNcbiAqIEByZXR1cm5zIHtPYmplY3R9IGRlc3RcbiAqL1xudmFyIG1lcmdlID0gZGVwcmVjYXRlKGZ1bmN0aW9uIG1lcmdlKGRlc3QsIHNyYykge1xuICAgIHJldHVybiBleHRlbmQoZGVzdCwgc3JjLCB0cnVlKTtcbn0sICdtZXJnZScsICdVc2UgYGFzc2lnbmAuJyk7XG5cbi8qKlxuICogc2ltcGxlIGNsYXNzIGluaGVyaXRhbmNlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjaGlsZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gYmFzZVxuICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzXVxuICovXG5mdW5jdGlvbiBpbmhlcml0KGNoaWxkLCBiYXNlLCBwcm9wZXJ0aWVzKSB7XG4gICAgdmFyIGJhc2VQID0gYmFzZS5wcm90b3R5cGUsXG4gICAgICAgIGNoaWxkUDtcblxuICAgIGNoaWxkUCA9IGNoaWxkLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoYmFzZVApO1xuICAgIGNoaWxkUC5jb25zdHJ1Y3RvciA9IGNoaWxkO1xuICAgIGNoaWxkUC5fc3VwZXIgPSBiYXNlUDtcblxuICAgIGlmIChwcm9wZXJ0aWVzKSB7XG4gICAgICAgIGFzc2lnbihjaGlsZFAsIHByb3BlcnRpZXMpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBzaW1wbGUgZnVuY3Rpb24gYmluZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0XG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGJpbmRGbihmbiwgY29udGV4dCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBib3VuZEZuKCkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkoY29udGV4dCwgYXJndW1lbnRzKTtcbiAgICB9O1xufVxuXG4vKipcbiAqIGxldCBhIGJvb2xlYW4gdmFsdWUgYWxzbyBiZSBhIGZ1bmN0aW9uIHRoYXQgbXVzdCByZXR1cm4gYSBib29sZWFuXG4gKiB0aGlzIGZpcnN0IGl0ZW0gaW4gYXJncyB3aWxsIGJlIHVzZWQgYXMgdGhlIGNvbnRleHRcbiAqIEBwYXJhbSB7Qm9vbGVhbnxGdW5jdGlvbn0gdmFsXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJnc11cbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBib29sT3JGbih2YWwsIGFyZ3MpIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PSBUWVBFX0ZVTkNUSU9OKSB7XG4gICAgICAgIHJldHVybiB2YWwuYXBwbHkoYXJncyA/IGFyZ3NbMF0gfHwgdW5kZWZpbmVkIDogdW5kZWZpbmVkLCBhcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbn1cblxuLyoqXG4gKiB1c2UgdGhlIHZhbDIgd2hlbiB2YWwxIGlzIHVuZGVmaW5lZFxuICogQHBhcmFtIHsqfSB2YWwxXG4gKiBAcGFyYW0geyp9IHZhbDJcbiAqIEByZXR1cm5zIHsqfVxuICovXG5mdW5jdGlvbiBpZlVuZGVmaW5lZCh2YWwxLCB2YWwyKSB7XG4gICAgcmV0dXJuICh2YWwxID09PSB1bmRlZmluZWQpID8gdmFsMiA6IHZhbDE7XG59XG5cbi8qKlxuICogYWRkRXZlbnRMaXN0ZW5lciB3aXRoIG11bHRpcGxlIGV2ZW50cyBhdCBvbmNlXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICovXG5mdW5jdGlvbiBhZGRFdmVudExpc3RlbmVycyh0YXJnZXQsIHR5cGVzLCBoYW5kbGVyKSB7XG4gICAgZWFjaChzcGxpdFN0cih0eXBlcyksIGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlciwgZmFsc2UpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIHJlbW92ZUV2ZW50TGlzdGVuZXIgd2l0aCBtdWx0aXBsZSBldmVudHMgYXQgb25jZVxuICogQHBhcmFtIHtFdmVudFRhcmdldH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZXNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcnModGFyZ2V0LCB0eXBlcywgaGFuZGxlcikge1xuICAgIGVhY2goc3BsaXRTdHIodHlwZXMpLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBmaW5kIGlmIGEgbm9kZSBpcyBpbiB0aGUgZ2l2ZW4gcGFyZW50XG4gKiBAbWV0aG9kIGhhc1BhcmVudFxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcGFyZW50XG4gKiBAcmV0dXJuIHtCb29sZWFufSBmb3VuZFxuICovXG5mdW5jdGlvbiBoYXNQYXJlbnQobm9kZSwgcGFyZW50KSB7XG4gICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gcGFyZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogc21hbGwgaW5kZXhPZiB3cmFwcGVyXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge1N0cmluZ30gZmluZFxuICogQHJldHVybnMge0Jvb2xlYW59IGZvdW5kXG4gKi9cbmZ1bmN0aW9uIGluU3RyKHN0ciwgZmluZCkge1xuICAgIHJldHVybiBzdHIuaW5kZXhPZihmaW5kKSA+IC0xO1xufVxuXG4vKipcbiAqIHNwbGl0IHN0cmluZyBvbiB3aGl0ZXNwYWNlXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7QXJyYXl9IHdvcmRzXG4gKi9cbmZ1bmN0aW9uIHNwbGl0U3RyKHN0cikge1xuICAgIHJldHVybiBzdHIudHJpbSgpLnNwbGl0KC9cXHMrL2cpO1xufVxuXG4vKipcbiAqIGZpbmQgaWYgYSBhcnJheSBjb250YWlucyB0aGUgb2JqZWN0IHVzaW5nIGluZGV4T2Ygb3IgYSBzaW1wbGUgcG9seUZpbGxcbiAqIEBwYXJhbSB7QXJyYXl9IHNyY1xuICogQHBhcmFtIHtTdHJpbmd9IGZpbmRcbiAqIEBwYXJhbSB7U3RyaW5nfSBbZmluZEJ5S2V5XVxuICogQHJldHVybiB7Qm9vbGVhbnxOdW1iZXJ9IGZhbHNlIHdoZW4gbm90IGZvdW5kLCBvciB0aGUgaW5kZXhcbiAqL1xuZnVuY3Rpb24gaW5BcnJheShzcmMsIGZpbmQsIGZpbmRCeUtleSkge1xuICAgIGlmIChzcmMuaW5kZXhPZiAmJiAhZmluZEJ5S2V5KSB7XG4gICAgICAgIHJldHVybiBzcmMuaW5kZXhPZihmaW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIHdoaWxlIChpIDwgc3JjLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKChmaW5kQnlLZXkgJiYgc3JjW2ldW2ZpbmRCeUtleV0gPT0gZmluZCkgfHwgKCFmaW5kQnlLZXkgJiYgc3JjW2ldID09PSBmaW5kKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG59XG5cbi8qKlxuICogY29udmVydCBhcnJheS1saWtlIG9iamVjdHMgdG8gcmVhbCBhcnJheXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gdG9BcnJheShvYmopIHtcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwob2JqLCAwKTtcbn1cblxuLyoqXG4gKiB1bmlxdWUgYXJyYXkgd2l0aCBvYmplY3RzIGJhc2VkIG9uIGEga2V5IChsaWtlICdpZCcpIG9yIGp1c3QgYnkgdGhlIGFycmF5J3MgdmFsdWVcbiAqIEBwYXJhbSB7QXJyYXl9IHNyYyBbe2lkOjF9LHtpZDoyfSx7aWQ6MX1dXG4gKiBAcGFyYW0ge1N0cmluZ30gW2tleV1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW3NvcnQ9RmFsc2VdXG4gKiBAcmV0dXJucyB7QXJyYXl9IFt7aWQ6MX0se2lkOjJ9XVxuICovXG5mdW5jdGlvbiB1bmlxdWVBcnJheShzcmMsIGtleSwgc29ydCkge1xuICAgIHZhciByZXN1bHRzID0gW107XG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgIHZhciBpID0gMDtcblxuICAgIHdoaWxlIChpIDwgc3JjLmxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsID0ga2V5ID8gc3JjW2ldW2tleV0gOiBzcmNbaV07XG4gICAgICAgIGlmIChpbkFycmF5KHZhbHVlcywgdmFsKSA8IDApIHtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChzcmNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlc1tpXSA9IHZhbDtcbiAgICAgICAgaSsrO1xuICAgIH1cblxuICAgIGlmIChzb3J0KSB7XG4gICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5zb3J0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5zb3J0KGZ1bmN0aW9uIHNvcnRVbmlxdWVBcnJheShhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFba2V5XSA+IGJba2V5XTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbi8qKlxuICogZ2V0IHRoZSBwcmVmaXhlZCBwcm9wZXJ0eVxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5XG4gKiBAcmV0dXJucyB7U3RyaW5nfFVuZGVmaW5lZH0gcHJlZml4ZWRcbiAqL1xuZnVuY3Rpb24gcHJlZml4ZWQob2JqLCBwcm9wZXJ0eSkge1xuICAgIHZhciBwcmVmaXgsIHByb3A7XG4gICAgdmFyIGNhbWVsUHJvcCA9IHByb3BlcnR5WzBdLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zbGljZSgxKTtcblxuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAoaSA8IFZFTkRPUl9QUkVGSVhFUy5sZW5ndGgpIHtcbiAgICAgICAgcHJlZml4ID0gVkVORE9SX1BSRUZJWEVTW2ldO1xuICAgICAgICBwcm9wID0gKHByZWZpeCkgPyBwcmVmaXggKyBjYW1lbFByb3AgOiBwcm9wZXJ0eTtcblxuICAgICAgICBpZiAocHJvcCBpbiBvYmopIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9wO1xuICAgICAgICB9XG4gICAgICAgIGkrKztcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBnZXQgYSB1bmlxdWUgaWRcbiAqIEByZXR1cm5zIHtudW1iZXJ9IHVuaXF1ZUlkXG4gKi9cbnZhciBfdW5pcXVlSWQgPSAxO1xuZnVuY3Rpb24gdW5pcXVlSWQoKSB7XG4gICAgcmV0dXJuIF91bmlxdWVJZCsrO1xufVxuXG4vKipcbiAqIGdldCB0aGUgd2luZG93IG9iamVjdCBvZiBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJucyB7RG9jdW1lbnRWaWV3fFdpbmRvd31cbiAqL1xuZnVuY3Rpb24gZ2V0V2luZG93Rm9yRWxlbWVudChlbGVtZW50KSB7XG4gICAgdmFyIGRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudCB8fCBlbGVtZW50O1xuICAgIHJldHVybiAoZG9jLmRlZmF1bHRWaWV3IHx8IGRvYy5wYXJlbnRXaW5kb3cgfHwgd2luZG93KTtcbn1cblxudmFyIE1PQklMRV9SRUdFWCA9IC9tb2JpbGV8dGFibGV0fGlwKGFkfGhvbmV8b2QpfGFuZHJvaWQvaTtcblxudmFyIFNVUFBPUlRfVE9VQ0ggPSAoJ29udG91Y2hzdGFydCcgaW4gd2luZG93KTtcbnZhciBTVVBQT1JUX1BPSU5URVJfRVZFTlRTID0gcHJlZml4ZWQod2luZG93LCAnUG9pbnRlckV2ZW50JykgIT09IHVuZGVmaW5lZDtcbnZhciBTVVBQT1JUX09OTFlfVE9VQ0ggPSBTVVBQT1JUX1RPVUNIICYmIE1PQklMRV9SRUdFWC50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuXG52YXIgSU5QVVRfVFlQRV9UT1VDSCA9ICd0b3VjaCc7XG52YXIgSU5QVVRfVFlQRV9QRU4gPSAncGVuJztcbnZhciBJTlBVVF9UWVBFX01PVVNFID0gJ21vdXNlJztcbnZhciBJTlBVVF9UWVBFX0tJTkVDVCA9ICdraW5lY3QnO1xuXG52YXIgQ09NUFVURV9JTlRFUlZBTCA9IDI1O1xuXG52YXIgSU5QVVRfU1RBUlQgPSAxO1xudmFyIElOUFVUX01PVkUgPSAyO1xudmFyIElOUFVUX0VORCA9IDQ7XG52YXIgSU5QVVRfQ0FOQ0VMID0gODtcblxudmFyIERJUkVDVElPTl9OT05FID0gMTtcbnZhciBESVJFQ1RJT05fTEVGVCA9IDI7XG52YXIgRElSRUNUSU9OX1JJR0hUID0gNDtcbnZhciBESVJFQ1RJT05fVVAgPSA4O1xudmFyIERJUkVDVElPTl9ET1dOID0gMTY7XG5cbnZhciBESVJFQ1RJT05fSE9SSVpPTlRBTCA9IERJUkVDVElPTl9MRUZUIHwgRElSRUNUSU9OX1JJR0hUO1xudmFyIERJUkVDVElPTl9WRVJUSUNBTCA9IERJUkVDVElPTl9VUCB8IERJUkVDVElPTl9ET1dOO1xudmFyIERJUkVDVElPTl9BTEwgPSBESVJFQ1RJT05fSE9SSVpPTlRBTCB8IERJUkVDVElPTl9WRVJUSUNBTDtcblxudmFyIFBST1BTX1hZID0gWyd4JywgJ3knXTtcbnZhciBQUk9QU19DTElFTlRfWFkgPSBbJ2NsaWVudFgnLCAnY2xpZW50WSddO1xuXG4vKipcbiAqIGNyZWF0ZSBuZXcgaW5wdXQgdHlwZSBtYW5hZ2VyXG4gKiBAcGFyYW0ge01hbmFnZXJ9IG1hbmFnZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7SW5wdXR9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gSW5wdXQobWFuYWdlciwgY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgdGhpcy5lbGVtZW50ID0gbWFuYWdlci5lbGVtZW50O1xuICAgIHRoaXMudGFyZ2V0ID0gbWFuYWdlci5vcHRpb25zLmlucHV0VGFyZ2V0O1xuXG4gICAgLy8gc21hbGxlciB3cmFwcGVyIGFyb3VuZCB0aGUgaGFuZGxlciwgZm9yIHRoZSBzY29wZSBhbmQgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIG1hbmFnZXIsXG4gICAgLy8gc28gd2hlbiBkaXNhYmxlZCB0aGUgaW5wdXQgZXZlbnRzIGFyZSBjb21wbGV0ZWx5IGJ5cGFzc2VkLlxuICAgIHRoaXMuZG9tSGFuZGxlciA9IGZ1bmN0aW9uKGV2KSB7XG4gICAgICAgIGlmIChib29sT3JGbihtYW5hZ2VyLm9wdGlvbnMuZW5hYmxlLCBbbWFuYWdlcl0pKSB7XG4gICAgICAgICAgICBzZWxmLmhhbmRsZXIoZXYpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuaW5pdCgpO1xuXG59XG5cbklucHV0LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBzaG91bGQgaGFuZGxlIHRoZSBpbnB1dEV2ZW50IGRhdGEgYW5kIHRyaWdnZXIgdGhlIGNhbGxiYWNrXG4gICAgICogQHZpcnR1YWxcbiAgICAgKi9cbiAgICBoYW5kbGVyOiBmdW5jdGlvbigpIHsgfSxcblxuICAgIC8qKlxuICAgICAqIGJpbmQgdGhlIGV2ZW50c1xuICAgICAqL1xuICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmV2RWwgJiYgYWRkRXZlbnRMaXN0ZW5lcnModGhpcy5lbGVtZW50LCB0aGlzLmV2RWwsIHRoaXMuZG9tSGFuZGxlcik7XG4gICAgICAgIHRoaXMuZXZUYXJnZXQgJiYgYWRkRXZlbnRMaXN0ZW5lcnModGhpcy50YXJnZXQsIHRoaXMuZXZUYXJnZXQsIHRoaXMuZG9tSGFuZGxlcik7XG4gICAgICAgIHRoaXMuZXZXaW4gJiYgYWRkRXZlbnRMaXN0ZW5lcnMoZ2V0V2luZG93Rm9yRWxlbWVudCh0aGlzLmVsZW1lbnQpLCB0aGlzLmV2V2luLCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiB1bmJpbmQgdGhlIGV2ZW50c1xuICAgICAqL1xuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmV2RWwgJiYgcmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy5lbGVtZW50LCB0aGlzLmV2RWwsIHRoaXMuZG9tSGFuZGxlcik7XG4gICAgICAgIHRoaXMuZXZUYXJnZXQgJiYgcmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy50YXJnZXQsIHRoaXMuZXZUYXJnZXQsIHRoaXMuZG9tSGFuZGxlcik7XG4gICAgICAgIHRoaXMuZXZXaW4gJiYgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoZ2V0V2luZG93Rm9yRWxlbWVudCh0aGlzLmVsZW1lbnQpLCB0aGlzLmV2V2luLCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgIH1cbn07XG5cbi8qKlxuICogY3JlYXRlIG5ldyBpbnB1dCB0eXBlIG1hbmFnZXJcbiAqIGNhbGxlZCBieSB0aGUgTWFuYWdlciBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtIYW1tZXJ9IG1hbmFnZXJcbiAqIEByZXR1cm5zIHtJbnB1dH1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5wdXRJbnN0YW5jZShtYW5hZ2VyKSB7XG4gICAgdmFyIFR5cGU7XG4gICAgdmFyIGlucHV0Q2xhc3MgPSBtYW5hZ2VyLm9wdGlvbnMuaW5wdXRDbGFzcztcblxuICAgIGlmIChpbnB1dENsYXNzKSB7XG4gICAgICAgIFR5cGUgPSBpbnB1dENsYXNzO1xuICAgIH0gZWxzZSBpZiAoU1VQUE9SVF9QT0lOVEVSX0VWRU5UUykge1xuICAgICAgICBUeXBlID0gUG9pbnRlckV2ZW50SW5wdXQ7XG4gICAgfSBlbHNlIGlmIChTVVBQT1JUX09OTFlfVE9VQ0gpIHtcbiAgICAgICAgVHlwZSA9IFRvdWNoSW5wdXQ7XG4gICAgfSBlbHNlIGlmICghU1VQUE9SVF9UT1VDSCkge1xuICAgICAgICBUeXBlID0gTW91c2VJbnB1dDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBUeXBlID0gVG91Y2hNb3VzZUlucHV0O1xuICAgIH1cbiAgICByZXR1cm4gbmV3IChUeXBlKShtYW5hZ2VyLCBpbnB1dEhhbmRsZXIpO1xufVxuXG4vKipcbiAqIGhhbmRsZSBpbnB1dCBldmVudHNcbiAqIEBwYXJhbSB7TWFuYWdlcn0gbWFuYWdlclxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50VHlwZVxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gKi9cbmZ1bmN0aW9uIGlucHV0SGFuZGxlcihtYW5hZ2VyLCBldmVudFR5cGUsIGlucHV0KSB7XG4gICAgdmFyIHBvaW50ZXJzTGVuID0gaW5wdXQucG9pbnRlcnMubGVuZ3RoO1xuICAgIHZhciBjaGFuZ2VkUG9pbnRlcnNMZW4gPSBpbnB1dC5jaGFuZ2VkUG9pbnRlcnMubGVuZ3RoO1xuICAgIHZhciBpc0ZpcnN0ID0gKGV2ZW50VHlwZSAmIElOUFVUX1NUQVJUICYmIChwb2ludGVyc0xlbiAtIGNoYW5nZWRQb2ludGVyc0xlbiA9PT0gMCkpO1xuICAgIHZhciBpc0ZpbmFsID0gKGV2ZW50VHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpICYmIChwb2ludGVyc0xlbiAtIGNoYW5nZWRQb2ludGVyc0xlbiA9PT0gMCkpO1xuXG4gICAgaW5wdXQuaXNGaXJzdCA9ICEhaXNGaXJzdDtcbiAgICBpbnB1dC5pc0ZpbmFsID0gISFpc0ZpbmFsO1xuXG4gICAgaWYgKGlzRmlyc3QpIHtcbiAgICAgICAgbWFuYWdlci5zZXNzaW9uID0ge307XG4gICAgfVxuXG4gICAgLy8gc291cmNlIGV2ZW50IGlzIHRoZSBub3JtYWxpemVkIHZhbHVlIG9mIHRoZSBkb21FdmVudHNcbiAgICAvLyBsaWtlICd0b3VjaHN0YXJ0LCBtb3VzZXVwLCBwb2ludGVyZG93bidcbiAgICBpbnB1dC5ldmVudFR5cGUgPSBldmVudFR5cGU7XG5cbiAgICAvLyBjb21wdXRlIHNjYWxlLCByb3RhdGlvbiBldGNcbiAgICBjb21wdXRlSW5wdXREYXRhKG1hbmFnZXIsIGlucHV0KTtcblxuICAgIC8vIGVtaXQgc2VjcmV0IGV2ZW50XG4gICAgbWFuYWdlci5lbWl0KCdoYW1tZXIuaW5wdXQnLCBpbnB1dCk7XG5cbiAgICBtYW5hZ2VyLnJlY29nbml6ZShpbnB1dCk7XG4gICAgbWFuYWdlci5zZXNzaW9uLnByZXZJbnB1dCA9IGlucHV0O1xufVxuXG4vKipcbiAqIGV4dGVuZCB0aGUgZGF0YSB3aXRoIHNvbWUgdXNhYmxlIHByb3BlcnRpZXMgbGlrZSBzY2FsZSwgcm90YXRlLCB2ZWxvY2l0eSBldGNcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYW5hZ2VyXG4gKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUlucHV0RGF0YShtYW5hZ2VyLCBpbnB1dCkge1xuICAgIHZhciBzZXNzaW9uID0gbWFuYWdlci5zZXNzaW9uO1xuICAgIHZhciBwb2ludGVycyA9IGlucHV0LnBvaW50ZXJzO1xuICAgIHZhciBwb2ludGVyc0xlbmd0aCA9IHBvaW50ZXJzLmxlbmd0aDtcblxuICAgIC8vIHN0b3JlIHRoZSBmaXJzdCBpbnB1dCB0byBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlIGFuZCBkaXJlY3Rpb25cbiAgICBpZiAoIXNlc3Npb24uZmlyc3RJbnB1dCkge1xuICAgICAgICBzZXNzaW9uLmZpcnN0SW5wdXQgPSBzaW1wbGVDbG9uZUlucHV0RGF0YShpbnB1dCk7XG4gICAgfVxuXG4gICAgLy8gdG8gY29tcHV0ZSBzY2FsZSBhbmQgcm90YXRpb24gd2UgbmVlZCB0byBzdG9yZSB0aGUgbXVsdGlwbGUgdG91Y2hlc1xuICAgIGlmIChwb2ludGVyc0xlbmd0aCA+IDEgJiYgIXNlc3Npb24uZmlyc3RNdWx0aXBsZSkge1xuICAgICAgICBzZXNzaW9uLmZpcnN0TXVsdGlwbGUgPSBzaW1wbGVDbG9uZUlucHV0RGF0YShpbnB1dCk7XG4gICAgfSBlbHNlIGlmIChwb2ludGVyc0xlbmd0aCA9PT0gMSkge1xuICAgICAgICBzZXNzaW9uLmZpcnN0TXVsdGlwbGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgZmlyc3RJbnB1dCA9IHNlc3Npb24uZmlyc3RJbnB1dDtcbiAgICB2YXIgZmlyc3RNdWx0aXBsZSA9IHNlc3Npb24uZmlyc3RNdWx0aXBsZTtcbiAgICB2YXIgb2Zmc2V0Q2VudGVyID0gZmlyc3RNdWx0aXBsZSA/IGZpcnN0TXVsdGlwbGUuY2VudGVyIDogZmlyc3RJbnB1dC5jZW50ZXI7XG5cbiAgICB2YXIgY2VudGVyID0gaW5wdXQuY2VudGVyID0gZ2V0Q2VudGVyKHBvaW50ZXJzKTtcbiAgICBpbnB1dC50aW1lU3RhbXAgPSBub3coKTtcbiAgICBpbnB1dC5kZWx0YVRpbWUgPSBpbnB1dC50aW1lU3RhbXAgLSBmaXJzdElucHV0LnRpbWVTdGFtcDtcblxuICAgIGlucHV0LmFuZ2xlID0gZ2V0QW5nbGUob2Zmc2V0Q2VudGVyLCBjZW50ZXIpO1xuICAgIGlucHV0LmRpc3RhbmNlID0gZ2V0RGlzdGFuY2Uob2Zmc2V0Q2VudGVyLCBjZW50ZXIpO1xuXG4gICAgY29tcHV0ZURlbHRhWFkoc2Vzc2lvbiwgaW5wdXQpO1xuICAgIGlucHV0Lm9mZnNldERpcmVjdGlvbiA9IGdldERpcmVjdGlvbihpbnB1dC5kZWx0YVgsIGlucHV0LmRlbHRhWSk7XG5cbiAgICB2YXIgb3ZlcmFsbFZlbG9jaXR5ID0gZ2V0VmVsb2NpdHkoaW5wdXQuZGVsdGFUaW1lLCBpbnB1dC5kZWx0YVgsIGlucHV0LmRlbHRhWSk7XG4gICAgaW5wdXQub3ZlcmFsbFZlbG9jaXR5WCA9IG92ZXJhbGxWZWxvY2l0eS54O1xuICAgIGlucHV0Lm92ZXJhbGxWZWxvY2l0eVkgPSBvdmVyYWxsVmVsb2NpdHkueTtcbiAgICBpbnB1dC5vdmVyYWxsVmVsb2NpdHkgPSAoYWJzKG92ZXJhbGxWZWxvY2l0eS54KSA+IGFicyhvdmVyYWxsVmVsb2NpdHkueSkpID8gb3ZlcmFsbFZlbG9jaXR5LnggOiBvdmVyYWxsVmVsb2NpdHkueTtcblxuICAgIGlucHV0LnNjYWxlID0gZmlyc3RNdWx0aXBsZSA/IGdldFNjYWxlKGZpcnN0TXVsdGlwbGUucG9pbnRlcnMsIHBvaW50ZXJzKSA6IDE7XG4gICAgaW5wdXQucm90YXRpb24gPSBmaXJzdE11bHRpcGxlID8gZ2V0Um90YXRpb24oZmlyc3RNdWx0aXBsZS5wb2ludGVycywgcG9pbnRlcnMpIDogMDtcblxuICAgIGlucHV0Lm1heFBvaW50ZXJzID0gIXNlc3Npb24ucHJldklucHV0ID8gaW5wdXQucG9pbnRlcnMubGVuZ3RoIDogKChpbnB1dC5wb2ludGVycy5sZW5ndGggPlxuICAgICAgICBzZXNzaW9uLnByZXZJbnB1dC5tYXhQb2ludGVycykgPyBpbnB1dC5wb2ludGVycy5sZW5ndGggOiBzZXNzaW9uLnByZXZJbnB1dC5tYXhQb2ludGVycyk7XG5cbiAgICBjb21wdXRlSW50ZXJ2YWxJbnB1dERhdGEoc2Vzc2lvbiwgaW5wdXQpO1xuXG4gICAgLy8gZmluZCB0aGUgY29ycmVjdCB0YXJnZXRcbiAgICB2YXIgdGFyZ2V0ID0gbWFuYWdlci5lbGVtZW50O1xuICAgIGlmIChoYXNQYXJlbnQoaW5wdXQuc3JjRXZlbnQudGFyZ2V0LCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IGlucHV0LnNyY0V2ZW50LnRhcmdldDtcbiAgICB9XG4gICAgaW5wdXQudGFyZ2V0ID0gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlRGVsdGFYWShzZXNzaW9uLCBpbnB1dCkge1xuICAgIHZhciBjZW50ZXIgPSBpbnB1dC5jZW50ZXI7XG4gICAgdmFyIG9mZnNldCA9IHNlc3Npb24ub2Zmc2V0RGVsdGEgfHwge307XG4gICAgdmFyIHByZXZEZWx0YSA9IHNlc3Npb24ucHJldkRlbHRhIHx8IHt9O1xuICAgIHZhciBwcmV2SW5wdXQgPSBzZXNzaW9uLnByZXZJbnB1dCB8fCB7fTtcblxuICAgIGlmIChpbnB1dC5ldmVudFR5cGUgPT09IElOUFVUX1NUQVJUIHx8IHByZXZJbnB1dC5ldmVudFR5cGUgPT09IElOUFVUX0VORCkge1xuICAgICAgICBwcmV2RGVsdGEgPSBzZXNzaW9uLnByZXZEZWx0YSA9IHtcbiAgICAgICAgICAgIHg6IHByZXZJbnB1dC5kZWx0YVggfHwgMCxcbiAgICAgICAgICAgIHk6IHByZXZJbnB1dC5kZWx0YVkgfHwgMFxuICAgICAgICB9O1xuXG4gICAgICAgIG9mZnNldCA9IHNlc3Npb24ub2Zmc2V0RGVsdGEgPSB7XG4gICAgICAgICAgICB4OiBjZW50ZXIueCxcbiAgICAgICAgICAgIHk6IGNlbnRlci55XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaW5wdXQuZGVsdGFYID0gcHJldkRlbHRhLnggKyAoY2VudGVyLnggLSBvZmZzZXQueCk7XG4gICAgaW5wdXQuZGVsdGFZID0gcHJldkRlbHRhLnkgKyAoY2VudGVyLnkgLSBvZmZzZXQueSk7XG59XG5cbi8qKlxuICogdmVsb2NpdHkgaXMgY2FsY3VsYXRlZCBldmVyeSB4IG1zXG4gKiBAcGFyYW0ge09iamVjdH0gc2Vzc2lvblxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVJbnRlcnZhbElucHV0RGF0YShzZXNzaW9uLCBpbnB1dCkge1xuICAgIHZhciBsYXN0ID0gc2Vzc2lvbi5sYXN0SW50ZXJ2YWwgfHwgaW5wdXQsXG4gICAgICAgIGRlbHRhVGltZSA9IGlucHV0LnRpbWVTdGFtcCAtIGxhc3QudGltZVN0YW1wLFxuICAgICAgICB2ZWxvY2l0eSwgdmVsb2NpdHlYLCB2ZWxvY2l0eVksIGRpcmVjdGlvbjtcblxuICAgIGlmIChpbnB1dC5ldmVudFR5cGUgIT0gSU5QVVRfQ0FOQ0VMICYmIChkZWx0YVRpbWUgPiBDT01QVVRFX0lOVEVSVkFMIHx8IGxhc3QudmVsb2NpdHkgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgdmFyIGRlbHRhWCA9IGlucHV0LmRlbHRhWCAtIGxhc3QuZGVsdGFYO1xuICAgICAgICB2YXIgZGVsdGFZID0gaW5wdXQuZGVsdGFZIC0gbGFzdC5kZWx0YVk7XG5cbiAgICAgICAgdmFyIHYgPSBnZXRWZWxvY2l0eShkZWx0YVRpbWUsIGRlbHRhWCwgZGVsdGFZKTtcbiAgICAgICAgdmVsb2NpdHlYID0gdi54O1xuICAgICAgICB2ZWxvY2l0eVkgPSB2Lnk7XG4gICAgICAgIHZlbG9jaXR5ID0gKGFicyh2LngpID4gYWJzKHYueSkpID8gdi54IDogdi55O1xuICAgICAgICBkaXJlY3Rpb24gPSBnZXREaXJlY3Rpb24oZGVsdGFYLCBkZWx0YVkpO1xuXG4gICAgICAgIHNlc3Npb24ubGFzdEludGVydmFsID0gaW5wdXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdXNlIGxhdGVzdCB2ZWxvY2l0eSBpbmZvIGlmIGl0IGRvZXNuJ3Qgb3ZlcnRha2UgYSBtaW5pbXVtIHBlcmlvZFxuICAgICAgICB2ZWxvY2l0eSA9IGxhc3QudmVsb2NpdHk7XG4gICAgICAgIHZlbG9jaXR5WCA9IGxhc3QudmVsb2NpdHlYO1xuICAgICAgICB2ZWxvY2l0eVkgPSBsYXN0LnZlbG9jaXR5WTtcbiAgICAgICAgZGlyZWN0aW9uID0gbGFzdC5kaXJlY3Rpb247XG4gICAgfVxuXG4gICAgaW5wdXQudmVsb2NpdHkgPSB2ZWxvY2l0eTtcbiAgICBpbnB1dC52ZWxvY2l0eVggPSB2ZWxvY2l0eVg7XG4gICAgaW5wdXQudmVsb2NpdHlZID0gdmVsb2NpdHlZO1xuICAgIGlucHV0LmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbn1cblxuLyoqXG4gKiBjcmVhdGUgYSBzaW1wbGUgY2xvbmUgZnJvbSB0aGUgaW5wdXQgdXNlZCBmb3Igc3RvcmFnZSBvZiBmaXJzdElucHV0IGFuZCBmaXJzdE11bHRpcGxlXG4gKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAqIEByZXR1cm5zIHtPYmplY3R9IGNsb25lZElucHV0RGF0YVxuICovXG5mdW5jdGlvbiBzaW1wbGVDbG9uZUlucHV0RGF0YShpbnB1dCkge1xuICAgIC8vIG1ha2UgYSBzaW1wbGUgY29weSBvZiB0aGUgcG9pbnRlcnMgYmVjYXVzZSB3ZSB3aWxsIGdldCBhIHJlZmVyZW5jZSBpZiB3ZSBkb24ndFxuICAgIC8vIHdlIG9ubHkgbmVlZCBjbGllbnRYWSBmb3IgdGhlIGNhbGN1bGF0aW9uc1xuICAgIHZhciBwb2ludGVycyA9IFtdO1xuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGlucHV0LnBvaW50ZXJzLmxlbmd0aCkge1xuICAgICAgICBwb2ludGVyc1tpXSA9IHtcbiAgICAgICAgICAgIGNsaWVudFg6IHJvdW5kKGlucHV0LnBvaW50ZXJzW2ldLmNsaWVudFgpLFxuICAgICAgICAgICAgY2xpZW50WTogcm91bmQoaW5wdXQucG9pbnRlcnNbaV0uY2xpZW50WSlcbiAgICAgICAgfTtcbiAgICAgICAgaSsrO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHRpbWVTdGFtcDogbm93KCksXG4gICAgICAgIHBvaW50ZXJzOiBwb2ludGVycyxcbiAgICAgICAgY2VudGVyOiBnZXRDZW50ZXIocG9pbnRlcnMpLFxuICAgICAgICBkZWx0YVg6IGlucHV0LmRlbHRhWCxcbiAgICAgICAgZGVsdGFZOiBpbnB1dC5kZWx0YVlcbiAgICB9O1xufVxuXG4vKipcbiAqIGdldCB0aGUgY2VudGVyIG9mIGFsbCB0aGUgcG9pbnRlcnNcbiAqIEBwYXJhbSB7QXJyYXl9IHBvaW50ZXJzXG4gKiBAcmV0dXJuIHtPYmplY3R9IGNlbnRlciBjb250YWlucyBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIGdldENlbnRlcihwb2ludGVycykge1xuICAgIHZhciBwb2ludGVyc0xlbmd0aCA9IHBvaW50ZXJzLmxlbmd0aDtcblxuICAgIC8vIG5vIG5lZWQgdG8gbG9vcCB3aGVuIG9ubHkgb25lIHRvdWNoXG4gICAgaWYgKHBvaW50ZXJzTGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiByb3VuZChwb2ludGVyc1swXS5jbGllbnRYKSxcbiAgICAgICAgICAgIHk6IHJvdW5kKHBvaW50ZXJzWzBdLmNsaWVudFkpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIHggPSAwLCB5ID0gMCwgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBwb2ludGVyc0xlbmd0aCkge1xuICAgICAgICB4ICs9IHBvaW50ZXJzW2ldLmNsaWVudFg7XG4gICAgICAgIHkgKz0gcG9pbnRlcnNbaV0uY2xpZW50WTtcbiAgICAgICAgaSsrO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHg6IHJvdW5kKHggLyBwb2ludGVyc0xlbmd0aCksXG4gICAgICAgIHk6IHJvdW5kKHkgLyBwb2ludGVyc0xlbmd0aClcbiAgICB9O1xufVxuXG4vKipcbiAqIGNhbGN1bGF0ZSB0aGUgdmVsb2NpdHkgYmV0d2VlbiB0d28gcG9pbnRzLiB1bml0IGlzIGluIHB4IHBlciBtcy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBkZWx0YVRpbWVcbiAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gKiBAcGFyYW0ge051bWJlcn0geVxuICogQHJldHVybiB7T2JqZWN0fSB2ZWxvY2l0eSBgeGAgYW5kIGB5YFxuICovXG5mdW5jdGlvbiBnZXRWZWxvY2l0eShkZWx0YVRpbWUsIHgsIHkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiB4IC8gZGVsdGFUaW1lIHx8IDAsXG4gICAgICAgIHk6IHkgLyBkZWx0YVRpbWUgfHwgMFxuICAgIH07XG59XG5cbi8qKlxuICogZ2V0IHRoZSBkaXJlY3Rpb24gYmV0d2VlbiB0d28gcG9pbnRzXG4gKiBAcGFyYW0ge051bWJlcn0geFxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqIEByZXR1cm4ge051bWJlcn0gZGlyZWN0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldERpcmVjdGlvbih4LCB5KSB7XG4gICAgaWYgKHggPT09IHkpIHtcbiAgICAgICAgcmV0dXJuIERJUkVDVElPTl9OT05FO1xuICAgIH1cblxuICAgIGlmIChhYnMoeCkgPj0gYWJzKHkpKSB7XG4gICAgICAgIHJldHVybiB4IDwgMCA/IERJUkVDVElPTl9MRUZUIDogRElSRUNUSU9OX1JJR0hUO1xuICAgIH1cbiAgICByZXR1cm4geSA8IDAgPyBESVJFQ1RJT05fVVAgOiBESVJFQ1RJT05fRE9XTjtcbn1cblxuLyoqXG4gKiBjYWxjdWxhdGUgdGhlIGFic29sdXRlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50c1xuICogQHBhcmFtIHtPYmplY3R9IHAxIHt4LCB5fVxuICogQHBhcmFtIHtPYmplY3R9IHAyIHt4LCB5fVxuICogQHBhcmFtIHtBcnJheX0gW3Byb3BzXSBjb250YWluaW5nIHggYW5kIHkga2V5c1xuICogQHJldHVybiB7TnVtYmVyfSBkaXN0YW5jZVxuICovXG5mdW5jdGlvbiBnZXREaXN0YW5jZShwMSwgcDIsIHByb3BzKSB7XG4gICAgaWYgKCFwcm9wcykge1xuICAgICAgICBwcm9wcyA9IFBST1BTX1hZO1xuICAgIH1cbiAgICB2YXIgeCA9IHAyW3Byb3BzWzBdXSAtIHAxW3Byb3BzWzBdXSxcbiAgICAgICAgeSA9IHAyW3Byb3BzWzFdXSAtIHAxW3Byb3BzWzFdXTtcblxuICAgIHJldHVybiBNYXRoLnNxcnQoKHggKiB4KSArICh5ICogeSkpO1xufVxuXG4vKipcbiAqIGNhbGN1bGF0ZSB0aGUgYW5nbGUgYmV0d2VlbiB0d28gY29vcmRpbmF0ZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBwMVxuICogQHBhcmFtIHtPYmplY3R9IHAyXG4gKiBAcGFyYW0ge0FycmF5fSBbcHJvcHNdIGNvbnRhaW5pbmcgeCBhbmQgeSBrZXlzXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IGFuZ2xlXG4gKi9cbmZ1bmN0aW9uIGdldEFuZ2xlKHAxLCBwMiwgcHJvcHMpIHtcbiAgICBpZiAoIXByb3BzKSB7XG4gICAgICAgIHByb3BzID0gUFJPUFNfWFk7XG4gICAgfVxuICAgIHZhciB4ID0gcDJbcHJvcHNbMF1dIC0gcDFbcHJvcHNbMF1dLFxuICAgICAgICB5ID0gcDJbcHJvcHNbMV1dIC0gcDFbcHJvcHNbMV1dO1xuICAgIHJldHVybiBNYXRoLmF0YW4yKHksIHgpICogMTgwIC8gTWF0aC5QSTtcbn1cblxuLyoqXG4gKiBjYWxjdWxhdGUgdGhlIHJvdGF0aW9uIGRlZ3JlZXMgYmV0d2VlbiB0d28gcG9pbnRlcnNldHNcbiAqIEBwYXJhbSB7QXJyYXl9IHN0YXJ0IGFycmF5IG9mIHBvaW50ZXJzXG4gKiBAcGFyYW0ge0FycmF5fSBlbmQgYXJyYXkgb2YgcG9pbnRlcnNcbiAqIEByZXR1cm4ge051bWJlcn0gcm90YXRpb25cbiAqL1xuZnVuY3Rpb24gZ2V0Um90YXRpb24oc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiBnZXRBbmdsZShlbmRbMV0sIGVuZFswXSwgUFJPUFNfQ0xJRU5UX1hZKSArIGdldEFuZ2xlKHN0YXJ0WzFdLCBzdGFydFswXSwgUFJPUFNfQ0xJRU5UX1hZKTtcbn1cblxuLyoqXG4gKiBjYWxjdWxhdGUgdGhlIHNjYWxlIGZhY3RvciBiZXR3ZWVuIHR3byBwb2ludGVyc2V0c1xuICogbm8gc2NhbGUgaXMgMSwgYW5kIGdvZXMgZG93biB0byAwIHdoZW4gcGluY2hlZCB0b2dldGhlciwgYW5kIGJpZ2dlciB3aGVuIHBpbmNoZWQgb3V0XG4gKiBAcGFyYW0ge0FycmF5fSBzdGFydCBhcnJheSBvZiBwb2ludGVyc1xuICogQHBhcmFtIHtBcnJheX0gZW5kIGFycmF5IG9mIHBvaW50ZXJzXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHNjYWxlXG4gKi9cbmZ1bmN0aW9uIGdldFNjYWxlKHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4gZ2V0RGlzdGFuY2UoZW5kWzBdLCBlbmRbMV0sIFBST1BTX0NMSUVOVF9YWSkgLyBnZXREaXN0YW5jZShzdGFydFswXSwgc3RhcnRbMV0sIFBST1BTX0NMSUVOVF9YWSk7XG59XG5cbnZhciBNT1VTRV9JTlBVVF9NQVAgPSB7XG4gICAgbW91c2Vkb3duOiBJTlBVVF9TVEFSVCxcbiAgICBtb3VzZW1vdmU6IElOUFVUX01PVkUsXG4gICAgbW91c2V1cDogSU5QVVRfRU5EXG59O1xuXG52YXIgTU9VU0VfRUxFTUVOVF9FVkVOVFMgPSAnbW91c2Vkb3duJztcbnZhciBNT1VTRV9XSU5ET1dfRVZFTlRTID0gJ21vdXNlbW92ZSBtb3VzZXVwJztcblxuLyoqXG4gKiBNb3VzZSBldmVudHMgaW5wdXRcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgSW5wdXRcbiAqL1xuZnVuY3Rpb24gTW91c2VJbnB1dCgpIHtcbiAgICB0aGlzLmV2RWwgPSBNT1VTRV9FTEVNRU5UX0VWRU5UUztcbiAgICB0aGlzLmV2V2luID0gTU9VU0VfV0lORE9XX0VWRU5UUztcblxuICAgIHRoaXMucHJlc3NlZCA9IGZhbHNlOyAvLyBtb3VzZWRvd24gc3RhdGVcblxuICAgIElucHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmluaGVyaXQoTW91c2VJbnB1dCwgSW5wdXQsIHtcbiAgICAvKipcbiAgICAgKiBoYW5kbGUgbW91c2UgZXZlbnRzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAgICovXG4gICAgaGFuZGxlcjogZnVuY3Rpb24gTUVoYW5kbGVyKGV2KSB7XG4gICAgICAgIHZhciBldmVudFR5cGUgPSBNT1VTRV9JTlBVVF9NQVBbZXYudHlwZV07XG5cbiAgICAgICAgLy8gb24gc3RhcnQgd2Ugd2FudCB0byBoYXZlIHRoZSBsZWZ0IG1vdXNlIGJ1dHRvbiBkb3duXG4gICAgICAgIGlmIChldmVudFR5cGUgJiBJTlBVVF9TVEFSVCAmJiBldi5idXR0b24gPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMucHJlc3NlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfTU9WRSAmJiBldi53aGljaCAhPT0gMSkge1xuICAgICAgICAgICAgZXZlbnRUeXBlID0gSU5QVVRfRU5EO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbW91c2UgbXVzdCBiZSBkb3duXG4gICAgICAgIGlmICghdGhpcy5wcmVzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfRU5EKSB7XG4gICAgICAgICAgICB0aGlzLnByZXNzZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLCBldmVudFR5cGUsIHtcbiAgICAgICAgICAgIHBvaW50ZXJzOiBbZXZdLFxuICAgICAgICAgICAgY2hhbmdlZFBvaW50ZXJzOiBbZXZdLFxuICAgICAgICAgICAgcG9pbnRlclR5cGU6IElOUFVUX1RZUEVfTU9VU0UsXG4gICAgICAgICAgICBzcmNFdmVudDogZXZcbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG5cbnZhciBQT0lOVEVSX0lOUFVUX01BUCA9IHtcbiAgICBwb2ludGVyZG93bjogSU5QVVRfU1RBUlQsXG4gICAgcG9pbnRlcm1vdmU6IElOUFVUX01PVkUsXG4gICAgcG9pbnRlcnVwOiBJTlBVVF9FTkQsXG4gICAgcG9pbnRlcmNhbmNlbDogSU5QVVRfQ0FOQ0VMLFxuICAgIHBvaW50ZXJvdXQ6IElOUFVUX0NBTkNFTFxufTtcblxuLy8gaW4gSUUxMCB0aGUgcG9pbnRlciB0eXBlcyBpcyBkZWZpbmVkIGFzIGFuIGVudW1cbnZhciBJRTEwX1BPSU5URVJfVFlQRV9FTlVNID0ge1xuICAgIDI6IElOUFVUX1RZUEVfVE9VQ0gsXG4gICAgMzogSU5QVVRfVFlQRV9QRU4sXG4gICAgNDogSU5QVVRfVFlQRV9NT1VTRSxcbiAgICA1OiBJTlBVVF9UWVBFX0tJTkVDVCAvLyBzZWUgaHR0cHM6Ly90d2l0dGVyLmNvbS9qYWNvYnJvc3NpL3N0YXR1cy80ODA1OTY0Mzg0ODk4OTA4MTZcbn07XG5cbnZhciBQT0lOVEVSX0VMRU1FTlRfRVZFTlRTID0gJ3BvaW50ZXJkb3duJztcbnZhciBQT0lOVEVSX1dJTkRPV19FVkVOVFMgPSAncG9pbnRlcm1vdmUgcG9pbnRlcnVwIHBvaW50ZXJjYW5jZWwnO1xuXG4vLyBJRTEwIGhhcyBwcmVmaXhlZCBzdXBwb3J0LCBhbmQgY2FzZS1zZW5zaXRpdmVcbmlmICh3aW5kb3cuTVNQb2ludGVyRXZlbnQgJiYgIXdpbmRvdy5Qb2ludGVyRXZlbnQpIHtcbiAgICBQT0lOVEVSX0VMRU1FTlRfRVZFTlRTID0gJ01TUG9pbnRlckRvd24nO1xuICAgIFBPSU5URVJfV0lORE9XX0VWRU5UUyA9ICdNU1BvaW50ZXJNb3ZlIE1TUG9pbnRlclVwIE1TUG9pbnRlckNhbmNlbCc7XG59XG5cbi8qKlxuICogUG9pbnRlciBldmVudHMgaW5wdXRcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgSW5wdXRcbiAqL1xuZnVuY3Rpb24gUG9pbnRlckV2ZW50SW5wdXQoKSB7XG4gICAgdGhpcy5ldkVsID0gUE9JTlRFUl9FTEVNRU5UX0VWRU5UUztcbiAgICB0aGlzLmV2V2luID0gUE9JTlRFUl9XSU5ET1dfRVZFTlRTO1xuXG4gICAgSW5wdXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIHRoaXMuc3RvcmUgPSAodGhpcy5tYW5hZ2VyLnNlc3Npb24ucG9pbnRlckV2ZW50cyA9IFtdKTtcbn1cblxuaW5oZXJpdChQb2ludGVyRXZlbnRJbnB1dCwgSW5wdXQsIHtcbiAgICAvKipcbiAgICAgKiBoYW5kbGUgbW91c2UgZXZlbnRzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAgICovXG4gICAgaGFuZGxlcjogZnVuY3Rpb24gUEVoYW5kbGVyKGV2KSB7XG4gICAgICAgIHZhciBzdG9yZSA9IHRoaXMuc3RvcmU7XG4gICAgICAgIHZhciByZW1vdmVQb2ludGVyID0gZmFsc2U7XG5cbiAgICAgICAgdmFyIGV2ZW50VHlwZU5vcm1hbGl6ZWQgPSBldi50eXBlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnbXMnLCAnJyk7XG4gICAgICAgIHZhciBldmVudFR5cGUgPSBQT0lOVEVSX0lOUFVUX01BUFtldmVudFR5cGVOb3JtYWxpemVkXTtcbiAgICAgICAgdmFyIHBvaW50ZXJUeXBlID0gSUUxMF9QT0lOVEVSX1RZUEVfRU5VTVtldi5wb2ludGVyVHlwZV0gfHwgZXYucG9pbnRlclR5cGU7XG5cbiAgICAgICAgdmFyIGlzVG91Y2ggPSAocG9pbnRlclR5cGUgPT0gSU5QVVRfVFlQRV9UT1VDSCk7XG5cbiAgICAgICAgLy8gZ2V0IGluZGV4IG9mIHRoZSBldmVudCBpbiB0aGUgc3RvcmVcbiAgICAgICAgdmFyIHN0b3JlSW5kZXggPSBpbkFycmF5KHN0b3JlLCBldi5wb2ludGVySWQsICdwb2ludGVySWQnKTtcblxuICAgICAgICAvLyBzdGFydCBhbmQgbW91c2UgbXVzdCBiZSBkb3duXG4gICAgICAgIGlmIChldmVudFR5cGUgJiBJTlBVVF9TVEFSVCAmJiAoZXYuYnV0dG9uID09PSAwIHx8IGlzVG91Y2gpKSB7XG4gICAgICAgICAgICBpZiAoc3RvcmVJbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgICBzdG9yZS5wdXNoKGV2KTtcbiAgICAgICAgICAgICAgICBzdG9yZUluZGV4ID0gc3RvcmUubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSkge1xuICAgICAgICAgICAgcmVtb3ZlUG9pbnRlciA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpdCBub3QgZm91bmQsIHNvIHRoZSBwb2ludGVyIGhhc24ndCBiZWVuIGRvd24gKHNvIGl0J3MgcHJvYmFibHkgYSBob3ZlcilcbiAgICAgICAgaWYgKHN0b3JlSW5kZXggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1cGRhdGUgdGhlIGV2ZW50IGluIHRoZSBzdG9yZVxuICAgICAgICBzdG9yZVtzdG9yZUluZGV4XSA9IGV2O1xuXG4gICAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLCBldmVudFR5cGUsIHtcbiAgICAgICAgICAgIHBvaW50ZXJzOiBzdG9yZSxcbiAgICAgICAgICAgIGNoYW5nZWRQb2ludGVyczogW2V2XSxcbiAgICAgICAgICAgIHBvaW50ZXJUeXBlOiBwb2ludGVyVHlwZSxcbiAgICAgICAgICAgIHNyY0V2ZW50OiBldlxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVtb3ZlUG9pbnRlcikge1xuICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gdGhlIHN0b3JlXG4gICAgICAgICAgICBzdG9yZS5zcGxpY2Uoc3RvcmVJbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxudmFyIFNJTkdMRV9UT1VDSF9JTlBVVF9NQVAgPSB7XG4gICAgdG91Y2hzdGFydDogSU5QVVRfU1RBUlQsXG4gICAgdG91Y2htb3ZlOiBJTlBVVF9NT1ZFLFxuICAgIHRvdWNoZW5kOiBJTlBVVF9FTkQsXG4gICAgdG91Y2hjYW5jZWw6IElOUFVUX0NBTkNFTFxufTtcblxudmFyIFNJTkdMRV9UT1VDSF9UQVJHRVRfRVZFTlRTID0gJ3RvdWNoc3RhcnQnO1xudmFyIFNJTkdMRV9UT1VDSF9XSU5ET1dfRVZFTlRTID0gJ3RvdWNoc3RhcnQgdG91Y2htb3ZlIHRvdWNoZW5kIHRvdWNoY2FuY2VsJztcblxuLyoqXG4gKiBUb3VjaCBldmVudHMgaW5wdXRcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgSW5wdXRcbiAqL1xuZnVuY3Rpb24gU2luZ2xlVG91Y2hJbnB1dCgpIHtcbiAgICB0aGlzLmV2VGFyZ2V0ID0gU0lOR0xFX1RPVUNIX1RBUkdFVF9FVkVOVFM7XG4gICAgdGhpcy5ldldpbiA9IFNJTkdMRV9UT1VDSF9XSU5ET1dfRVZFTlRTO1xuICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuXG4gICAgSW5wdXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuaW5oZXJpdChTaW5nbGVUb3VjaElucHV0LCBJbnB1dCwge1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIFRFaGFuZGxlcihldikge1xuICAgICAgICB2YXIgdHlwZSA9IFNJTkdMRV9UT1VDSF9JTlBVVF9NQVBbZXYudHlwZV07XG5cbiAgICAgICAgLy8gc2hvdWxkIHdlIGhhbmRsZSB0aGUgdG91Y2ggZXZlbnRzP1xuICAgICAgICBpZiAodHlwZSA9PT0gSU5QVVRfU1RBUlQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuc3RhcnRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRvdWNoZXMgPSBub3JtYWxpemVTaW5nbGVUb3VjaGVzLmNhbGwodGhpcywgZXYsIHR5cGUpO1xuXG4gICAgICAgIC8vIHdoZW4gZG9uZSwgcmVzZXQgdGhlIHN0YXJ0ZWQgc3RhdGVcbiAgICAgICAgaWYgKHR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSAmJiB0b3VjaGVzWzBdLmxlbmd0aCAtIHRvdWNoZXNbMV0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLCB0eXBlLCB7XG4gICAgICAgICAgICBwb2ludGVyczogdG91Y2hlc1swXSxcbiAgICAgICAgICAgIGNoYW5nZWRQb2ludGVyczogdG91Y2hlc1sxXSxcbiAgICAgICAgICAgIHBvaW50ZXJUeXBlOiBJTlBVVF9UWVBFX1RPVUNILFxuICAgICAgICAgICAgc3JjRXZlbnQ6IGV2XG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqIEB0aGlzIHtUb3VjaElucHV0fVxuICogQHBhcmFtIHtPYmplY3R9IGV2XG4gKiBAcGFyYW0ge051bWJlcn0gdHlwZSBmbGFnXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfEFycmF5fSBbYWxsLCBjaGFuZ2VkXVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTaW5nbGVUb3VjaGVzKGV2LCB0eXBlKSB7XG4gICAgdmFyIGFsbCA9IHRvQXJyYXkoZXYudG91Y2hlcyk7XG4gICAgdmFyIGNoYW5nZWQgPSB0b0FycmF5KGV2LmNoYW5nZWRUb3VjaGVzKTtcblxuICAgIGlmICh0eXBlICYgKElOUFVUX0VORCB8IElOUFVUX0NBTkNFTCkpIHtcbiAgICAgICAgYWxsID0gdW5pcXVlQXJyYXkoYWxsLmNvbmNhdChjaGFuZ2VkKSwgJ2lkZW50aWZpZXInLCB0cnVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gW2FsbCwgY2hhbmdlZF07XG59XG5cbnZhciBUT1VDSF9JTlBVVF9NQVAgPSB7XG4gICAgdG91Y2hzdGFydDogSU5QVVRfU1RBUlQsXG4gICAgdG91Y2htb3ZlOiBJTlBVVF9NT1ZFLFxuICAgIHRvdWNoZW5kOiBJTlBVVF9FTkQsXG4gICAgdG91Y2hjYW5jZWw6IElOUFVUX0NBTkNFTFxufTtcblxudmFyIFRPVUNIX1RBUkdFVF9FVkVOVFMgPSAndG91Y2hzdGFydCB0b3VjaG1vdmUgdG91Y2hlbmQgdG91Y2hjYW5jZWwnO1xuXG4vKipcbiAqIE11bHRpLXVzZXIgdG91Y2ggZXZlbnRzIGlucHV0XG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIElucHV0XG4gKi9cbmZ1bmN0aW9uIFRvdWNoSW5wdXQoKSB7XG4gICAgdGhpcy5ldlRhcmdldCA9IFRPVUNIX1RBUkdFVF9FVkVOVFM7XG4gICAgdGhpcy50YXJnZXRJZHMgPSB7fTtcblxuICAgIElucHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmluaGVyaXQoVG91Y2hJbnB1dCwgSW5wdXQsIHtcbiAgICBoYW5kbGVyOiBmdW5jdGlvbiBNVEVoYW5kbGVyKGV2KSB7XG4gICAgICAgIHZhciB0eXBlID0gVE9VQ0hfSU5QVVRfTUFQW2V2LnR5cGVdO1xuICAgICAgICB2YXIgdG91Y2hlcyA9IGdldFRvdWNoZXMuY2FsbCh0aGlzLCBldiwgdHlwZSk7XG4gICAgICAgIGlmICghdG91Y2hlcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsIHR5cGUsIHtcbiAgICAgICAgICAgIHBvaW50ZXJzOiB0b3VjaGVzWzBdLFxuICAgICAgICAgICAgY2hhbmdlZFBvaW50ZXJzOiB0b3VjaGVzWzFdLFxuICAgICAgICAgICAgcG9pbnRlclR5cGU6IElOUFVUX1RZUEVfVE9VQ0gsXG4gICAgICAgICAgICBzcmNFdmVudDogZXZcbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG5cbi8qKlxuICogQHRoaXMge1RvdWNoSW5wdXR9XG4gKiBAcGFyYW0ge09iamVjdH0gZXZcbiAqIEBwYXJhbSB7TnVtYmVyfSB0eXBlIGZsYWdcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR8QXJyYXl9IFthbGwsIGNoYW5nZWRdXG4gKi9cbmZ1bmN0aW9uIGdldFRvdWNoZXMoZXYsIHR5cGUpIHtcbiAgICB2YXIgYWxsVG91Y2hlcyA9IHRvQXJyYXkoZXYudG91Y2hlcyk7XG4gICAgdmFyIHRhcmdldElkcyA9IHRoaXMudGFyZ2V0SWRzO1xuXG4gICAgLy8gd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSB0b3VjaCwgdGhlIHByb2Nlc3MgY2FuIGJlIHNpbXBsaWZpZWRcbiAgICBpZiAodHlwZSAmIChJTlBVVF9TVEFSVCB8IElOUFVUX01PVkUpICYmIGFsbFRvdWNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHRhcmdldElkc1thbGxUb3VjaGVzWzBdLmlkZW50aWZpZXJdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIFthbGxUb3VjaGVzLCBhbGxUb3VjaGVzXTtcbiAgICB9XG5cbiAgICB2YXIgaSxcbiAgICAgICAgdGFyZ2V0VG91Y2hlcyxcbiAgICAgICAgY2hhbmdlZFRvdWNoZXMgPSB0b0FycmF5KGV2LmNoYW5nZWRUb3VjaGVzKSxcbiAgICAgICAgY2hhbmdlZFRhcmdldFRvdWNoZXMgPSBbXSxcbiAgICAgICAgdGFyZ2V0ID0gdGhpcy50YXJnZXQ7XG5cbiAgICAvLyBnZXQgdGFyZ2V0IHRvdWNoZXMgZnJvbSB0b3VjaGVzXG4gICAgdGFyZ2V0VG91Y2hlcyA9IGFsbFRvdWNoZXMuZmlsdGVyKGZ1bmN0aW9uKHRvdWNoKSB7XG4gICAgICAgIHJldHVybiBoYXNQYXJlbnQodG91Y2gudGFyZ2V0LCB0YXJnZXQpO1xuICAgIH0pO1xuXG4gICAgLy8gY29sbGVjdCB0b3VjaGVzXG4gICAgaWYgKHR5cGUgPT09IElOUFVUX1NUQVJUKSB7XG4gICAgICAgIGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSA8IHRhcmdldFRvdWNoZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0YXJnZXRJZHNbdGFyZ2V0VG91Y2hlc1tpXS5pZGVudGlmaWVyXSA9IHRydWU7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmaWx0ZXIgY2hhbmdlZCB0b3VjaGVzIHRvIG9ubHkgY29udGFpbiB0b3VjaGVzIHRoYXQgZXhpc3QgaW4gdGhlIGNvbGxlY3RlZCB0YXJnZXQgaWRzXG4gICAgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBjaGFuZ2VkVG91Y2hlcy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHRhcmdldElkc1tjaGFuZ2VkVG91Y2hlc1tpXS5pZGVudGlmaWVyXSkge1xuICAgICAgICAgICAgY2hhbmdlZFRhcmdldFRvdWNoZXMucHVzaChjaGFuZ2VkVG91Y2hlc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjbGVhbnVwIHJlbW92ZWQgdG91Y2hlc1xuICAgICAgICBpZiAodHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpKSB7XG4gICAgICAgICAgICBkZWxldGUgdGFyZ2V0SWRzW2NoYW5nZWRUb3VjaGVzW2ldLmlkZW50aWZpZXJdO1xuICAgICAgICB9XG4gICAgICAgIGkrKztcbiAgICB9XG5cbiAgICBpZiAoIWNoYW5nZWRUYXJnZXRUb3VjaGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIFtcbiAgICAgICAgLy8gbWVyZ2UgdGFyZ2V0VG91Y2hlcyB3aXRoIGNoYW5nZWRUYXJnZXRUb3VjaGVzIHNvIGl0IGNvbnRhaW5zIEFMTCB0b3VjaGVzLCBpbmNsdWRpbmcgJ2VuZCcgYW5kICdjYW5jZWwnXG4gICAgICAgIHVuaXF1ZUFycmF5KHRhcmdldFRvdWNoZXMuY29uY2F0KGNoYW5nZWRUYXJnZXRUb3VjaGVzKSwgJ2lkZW50aWZpZXInLCB0cnVlKSxcbiAgICAgICAgY2hhbmdlZFRhcmdldFRvdWNoZXNcbiAgICBdO1xufVxuXG4vKipcbiAqIENvbWJpbmVkIHRvdWNoIGFuZCBtb3VzZSBpbnB1dFxuICpcbiAqIFRvdWNoIGhhcyBhIGhpZ2hlciBwcmlvcml0eSB0aGVuIG1vdXNlLCBhbmQgd2hpbGUgdG91Y2hpbmcgbm8gbW91c2UgZXZlbnRzIGFyZSBhbGxvd2VkLlxuICogVGhpcyBiZWNhdXNlIHRvdWNoIGRldmljZXMgYWxzbyBlbWl0IG1vdXNlIGV2ZW50cyB3aGlsZSBkb2luZyBhIHRvdWNoLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgSW5wdXRcbiAqL1xuXG52YXIgREVEVVBfVElNRU9VVCA9IDI1MDA7XG52YXIgREVEVVBfRElTVEFOQ0UgPSAyNTtcblxuZnVuY3Rpb24gVG91Y2hNb3VzZUlucHV0KCkge1xuICAgIElucHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB2YXIgaGFuZGxlciA9IGJpbmRGbih0aGlzLmhhbmRsZXIsIHRoaXMpO1xuICAgIHRoaXMudG91Y2ggPSBuZXcgVG91Y2hJbnB1dCh0aGlzLm1hbmFnZXIsIGhhbmRsZXIpO1xuICAgIHRoaXMubW91c2UgPSBuZXcgTW91c2VJbnB1dCh0aGlzLm1hbmFnZXIsIGhhbmRsZXIpO1xuXG4gICAgdGhpcy5wcmltYXJ5VG91Y2ggPSBudWxsO1xuICAgIHRoaXMubGFzdFRvdWNoZXMgPSBbXTtcbn1cblxuaW5oZXJpdChUb3VjaE1vdXNlSW5wdXQsIElucHV0LCB7XG4gICAgLyoqXG4gICAgICogaGFuZGxlIG1vdXNlIGFuZCB0b3VjaCBldmVudHNcbiAgICAgKiBAcGFyYW0ge0hhbW1lcn0gbWFuYWdlclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dEV2ZW50XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0RGF0YVxuICAgICAqL1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIFRNRWhhbmRsZXIobWFuYWdlciwgaW5wdXRFdmVudCwgaW5wdXREYXRhKSB7XG4gICAgICAgIHZhciBpc1RvdWNoID0gKGlucHV0RGF0YS5wb2ludGVyVHlwZSA9PSBJTlBVVF9UWVBFX1RPVUNIKSxcbiAgICAgICAgICAgIGlzTW91c2UgPSAoaW5wdXREYXRhLnBvaW50ZXJUeXBlID09IElOUFVUX1RZUEVfTU9VU0UpO1xuXG4gICAgICAgIGlmIChpc01vdXNlICYmIGlucHV0RGF0YS5zb3VyY2VDYXBhYmlsaXRpZXMgJiYgaW5wdXREYXRhLnNvdXJjZUNhcGFiaWxpdGllcy5maXJlc1RvdWNoRXZlbnRzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3aGVuIHdlJ3JlIGluIGEgdG91Y2ggZXZlbnQsIHJlY29yZCB0b3VjaGVzIHRvICBkZS1kdXBlIHN5bnRoZXRpYyBtb3VzZSBldmVudFxuICAgICAgICBpZiAoaXNUb3VjaCkge1xuICAgICAgICAgICAgcmVjb3JkVG91Y2hlcy5jYWxsKHRoaXMsIGlucHV0RXZlbnQsIGlucHV0RGF0YSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNNb3VzZSAmJiBpc1N5bnRoZXRpY0V2ZW50LmNhbGwodGhpcywgaW5wdXREYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxsYmFjayhtYW5hZ2VyLCBpbnB1dEV2ZW50LCBpbnB1dERhdGEpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiByZW1vdmUgdGhlIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqL1xuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMudG91Y2guZGVzdHJveSgpO1xuICAgICAgICB0aGlzLm1vdXNlLmRlc3Ryb3koKTtcbiAgICB9XG59KTtcblxuZnVuY3Rpb24gcmVjb3JkVG91Y2hlcyhldmVudFR5cGUsIGV2ZW50RGF0YSkge1xuICAgIGlmIChldmVudFR5cGUgJiBJTlBVVF9TVEFSVCkge1xuICAgICAgICB0aGlzLnByaW1hcnlUb3VjaCA9IGV2ZW50RGF0YS5jaGFuZ2VkUG9pbnRlcnNbMF0uaWRlbnRpZmllcjtcbiAgICAgICAgc2V0TGFzdFRvdWNoLmNhbGwodGhpcywgZXZlbnREYXRhKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpKSB7XG4gICAgICAgIHNldExhc3RUb3VjaC5jYWxsKHRoaXMsIGV2ZW50RGF0YSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzZXRMYXN0VG91Y2goZXZlbnREYXRhKSB7XG4gICAgdmFyIHRvdWNoID0gZXZlbnREYXRhLmNoYW5nZWRQb2ludGVyc1swXTtcblxuICAgIGlmICh0b3VjaC5pZGVudGlmaWVyID09PSB0aGlzLnByaW1hcnlUb3VjaCkge1xuICAgICAgICB2YXIgbGFzdFRvdWNoID0ge3g6IHRvdWNoLmNsaWVudFgsIHk6IHRvdWNoLmNsaWVudFl9O1xuICAgICAgICB0aGlzLmxhc3RUb3VjaGVzLnB1c2gobGFzdFRvdWNoKTtcbiAgICAgICAgdmFyIGx0cyA9IHRoaXMubGFzdFRvdWNoZXM7XG4gICAgICAgIHZhciByZW1vdmVMYXN0VG91Y2ggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBpID0gbHRzLmluZGV4T2YobGFzdFRvdWNoKTtcbiAgICAgICAgICAgIGlmIChpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBsdHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzZXRUaW1lb3V0KHJlbW92ZUxhc3RUb3VjaCwgREVEVVBfVElNRU9VVCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc1N5bnRoZXRpY0V2ZW50KGV2ZW50RGF0YSkge1xuICAgIHZhciB4ID0gZXZlbnREYXRhLnNyY0V2ZW50LmNsaWVudFgsIHkgPSBldmVudERhdGEuc3JjRXZlbnQuY2xpZW50WTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGFzdFRvdWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHQgPSB0aGlzLmxhc3RUb3VjaGVzW2ldO1xuICAgICAgICB2YXIgZHggPSBNYXRoLmFicyh4IC0gdC54KSwgZHkgPSBNYXRoLmFicyh5IC0gdC55KTtcbiAgICAgICAgaWYgKGR4IDw9IERFRFVQX0RJU1RBTkNFICYmIGR5IDw9IERFRFVQX0RJU1RBTkNFKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbnZhciBQUkVGSVhFRF9UT1VDSF9BQ1RJT04gPSBwcmVmaXhlZChURVNUX0VMRU1FTlQuc3R5bGUsICd0b3VjaEFjdGlvbicpO1xudmFyIE5BVElWRV9UT1VDSF9BQ1RJT04gPSBQUkVGSVhFRF9UT1VDSF9BQ1RJT04gIT09IHVuZGVmaW5lZDtcblxuLy8gbWFnaWNhbCB0b3VjaEFjdGlvbiB2YWx1ZVxudmFyIFRPVUNIX0FDVElPTl9DT01QVVRFID0gJ2NvbXB1dGUnO1xudmFyIFRPVUNIX0FDVElPTl9BVVRPID0gJ2F1dG8nO1xudmFyIFRPVUNIX0FDVElPTl9NQU5JUFVMQVRJT04gPSAnbWFuaXB1bGF0aW9uJzsgLy8gbm90IGltcGxlbWVudGVkXG52YXIgVE9VQ0hfQUNUSU9OX05PTkUgPSAnbm9uZSc7XG52YXIgVE9VQ0hfQUNUSU9OX1BBTl9YID0gJ3Bhbi14JztcbnZhciBUT1VDSF9BQ1RJT05fUEFOX1kgPSAncGFuLXknO1xudmFyIFRPVUNIX0FDVElPTl9NQVAgPSBnZXRUb3VjaEFjdGlvblByb3BzKCk7XG5cbi8qKlxuICogVG91Y2ggQWN0aW9uXG4gKiBzZXRzIHRoZSB0b3VjaEFjdGlvbiBwcm9wZXJ0eSBvciB1c2VzIHRoZSBqcyBhbHRlcm5hdGl2ZVxuICogQHBhcmFtIHtNYW5hZ2VyfSBtYW5hZ2VyXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBUb3VjaEFjdGlvbihtYW5hZ2VyLCB2YWx1ZSkge1xuICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7XG4gICAgdGhpcy5zZXQodmFsdWUpO1xufVxuXG5Ub3VjaEFjdGlvbi5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogc2V0IHRoZSB0b3VjaEFjdGlvbiB2YWx1ZSBvbiB0aGUgZWxlbWVudCBvciBlbmFibGUgdGhlIHBvbHlmaWxsXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gICAgICovXG4gICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAvLyBmaW5kIG91dCB0aGUgdG91Y2gtYWN0aW9uIGJ5IHRoZSBldmVudCBoYW5kbGVyc1xuICAgICAgICBpZiAodmFsdWUgPT0gVE9VQ0hfQUNUSU9OX0NPTVBVVEUpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5jb21wdXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoTkFUSVZFX1RPVUNIX0FDVElPTiAmJiB0aGlzLm1hbmFnZXIuZWxlbWVudC5zdHlsZSAmJiBUT1VDSF9BQ1RJT05fTUFQW3ZhbHVlXSkge1xuICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLmVsZW1lbnQuc3R5bGVbUFJFRklYRURfVE9VQ0hfQUNUSU9OXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWN0aW9ucyA9IHZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBqdXN0IHJlLXNldCB0aGUgdG91Y2hBY3Rpb24gdmFsdWVcbiAgICAgKi9cbiAgICB1cGRhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnNldCh0aGlzLm1hbmFnZXIub3B0aW9ucy50b3VjaEFjdGlvbik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGNvbXB1dGUgdGhlIHZhbHVlIGZvciB0aGUgdG91Y2hBY3Rpb24gcHJvcGVydHkgYmFzZWQgb24gdGhlIHJlY29nbml6ZXIncyBzZXR0aW5nc1xuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHZhbHVlXG4gICAgICovXG4gICAgY29tcHV0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhY3Rpb25zID0gW107XG4gICAgICAgIGVhY2godGhpcy5tYW5hZ2VyLnJlY29nbml6ZXJzLCBmdW5jdGlvbihyZWNvZ25pemVyKSB7XG4gICAgICAgICAgICBpZiAoYm9vbE9yRm4ocmVjb2duaXplci5vcHRpb25zLmVuYWJsZSwgW3JlY29nbml6ZXJdKSkge1xuICAgICAgICAgICAgICAgIGFjdGlvbnMgPSBhY3Rpb25zLmNvbmNhdChyZWNvZ25pemVyLmdldFRvdWNoQWN0aW9uKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNsZWFuVG91Y2hBY3Rpb25zKGFjdGlvbnMuam9pbignICcpKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGVhY2ggaW5wdXQgY3ljbGUgYW5kIHByb3ZpZGVzIHRoZSBwcmV2ZW50aW5nIG9mIHRoZSBicm93c2VyIGJlaGF2aW9yXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICovXG4gICAgcHJldmVudERlZmF1bHRzOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICB2YXIgc3JjRXZlbnQgPSBpbnB1dC5zcmNFdmVudDtcbiAgICAgICAgdmFyIGRpcmVjdGlvbiA9IGlucHV0Lm9mZnNldERpcmVjdGlvbjtcblxuICAgICAgICAvLyBpZiB0aGUgdG91Y2ggYWN0aW9uIGRpZCBwcmV2ZW50ZWQgb25jZSB0aGlzIHNlc3Npb25cbiAgICAgICAgaWYgKHRoaXMubWFuYWdlci5zZXNzaW9uLnByZXZlbnRlZCkge1xuICAgICAgICAgICAgc3JjRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhY3Rpb25zID0gdGhpcy5hY3Rpb25zO1xuICAgICAgICB2YXIgaGFzTm9uZSA9IGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9OT05FKSAmJiAhVE9VQ0hfQUNUSU9OX01BUFtUT1VDSF9BQ1RJT05fTk9ORV07XG4gICAgICAgIHZhciBoYXNQYW5ZID0gaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX1BBTl9ZKSAmJiAhVE9VQ0hfQUNUSU9OX01BUFtUT1VDSF9BQ1RJT05fUEFOX1ldO1xuICAgICAgICB2YXIgaGFzUGFuWCA9IGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9QQU5fWCkgJiYgIVRPVUNIX0FDVElPTl9NQVBbVE9VQ0hfQUNUSU9OX1BBTl9YXTtcblxuICAgICAgICBpZiAoaGFzTm9uZSkge1xuICAgICAgICAgICAgLy9kbyBub3QgcHJldmVudCBkZWZhdWx0cyBpZiB0aGlzIGlzIGEgdGFwIGdlc3R1cmVcblxuICAgICAgICAgICAgdmFyIGlzVGFwUG9pbnRlciA9IGlucHV0LnBvaW50ZXJzLmxlbmd0aCA9PT0gMTtcbiAgICAgICAgICAgIHZhciBpc1RhcE1vdmVtZW50ID0gaW5wdXQuZGlzdGFuY2UgPCAyO1xuICAgICAgICAgICAgdmFyIGlzVGFwVG91Y2hUaW1lID0gaW5wdXQuZGVsdGFUaW1lIDwgMjUwO1xuXG4gICAgICAgICAgICBpZiAoaXNUYXBQb2ludGVyICYmIGlzVGFwTW92ZW1lbnQgJiYgaXNUYXBUb3VjaFRpbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzUGFuWCAmJiBoYXNQYW5ZKSB7XG4gICAgICAgICAgICAvLyBgcGFuLXggcGFuLXlgIG1lYW5zIGJyb3dzZXIgaGFuZGxlcyBhbGwgc2Nyb2xsaW5nL3Bhbm5pbmcsIGRvIG5vdCBwcmV2ZW50XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzTm9uZSB8fFxuICAgICAgICAgICAgKGhhc1BhblkgJiYgZGlyZWN0aW9uICYgRElSRUNUSU9OX0hPUklaT05UQUwpIHx8XG4gICAgICAgICAgICAoaGFzUGFuWCAmJiBkaXJlY3Rpb24gJiBESVJFQ1RJT05fVkVSVElDQUwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmV2ZW50U3JjKHNyY0V2ZW50KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBjYWxsIHByZXZlbnREZWZhdWx0IHRvIHByZXZlbnQgdGhlIGJyb3dzZXIncyBkZWZhdWx0IGJlaGF2aW9yIChzY3JvbGxpbmcgaW4gbW9zdCBjYXNlcylcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3JjRXZlbnRcbiAgICAgKi9cbiAgICBwcmV2ZW50U3JjOiBmdW5jdGlvbihzcmNFdmVudCkge1xuICAgICAgICB0aGlzLm1hbmFnZXIuc2Vzc2lvbi5wcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICBzcmNFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbn07XG5cbi8qKlxuICogd2hlbiB0aGUgdG91Y2hBY3Rpb25zIGFyZSBjb2xsZWN0ZWQgdGhleSBhcmUgbm90IGEgdmFsaWQgdmFsdWUsIHNvIHdlIG5lZWQgdG8gY2xlYW4gdGhpbmdzIHVwLiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYWN0aW9uc1xuICogQHJldHVybnMgeyp9XG4gKi9cbmZ1bmN0aW9uIGNsZWFuVG91Y2hBY3Rpb25zKGFjdGlvbnMpIHtcbiAgICAvLyBub25lXG4gICAgaWYgKGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9OT05FKSkge1xuICAgICAgICByZXR1cm4gVE9VQ0hfQUNUSU9OX05PTkU7XG4gICAgfVxuXG4gICAgdmFyIGhhc1BhblggPSBpblN0cihhY3Rpb25zLCBUT1VDSF9BQ1RJT05fUEFOX1gpO1xuICAgIHZhciBoYXNQYW5ZID0gaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX1BBTl9ZKTtcblxuICAgIC8vIGlmIGJvdGggcGFuLXggYW5kIHBhbi15IGFyZSBzZXQgKGRpZmZlcmVudCByZWNvZ25pemVyc1xuICAgIC8vIGZvciBkaWZmZXJlbnQgZGlyZWN0aW9ucywgZS5nLiBob3Jpem9udGFsIHBhbiBidXQgdmVydGljYWwgc3dpcGU/KVxuICAgIC8vIHdlIG5lZWQgbm9uZSAoYXMgb3RoZXJ3aXNlIHdpdGggcGFuLXggcGFuLXkgY29tYmluZWQgbm9uZSBvZiB0aGVzZVxuICAgIC8vIHJlY29nbml6ZXJzIHdpbGwgd29yaywgc2luY2UgdGhlIGJyb3dzZXIgd291bGQgaGFuZGxlIGFsbCBwYW5uaW5nXG4gICAgaWYgKGhhc1BhblggJiYgaGFzUGFuWSkge1xuICAgICAgICByZXR1cm4gVE9VQ0hfQUNUSU9OX05PTkU7XG4gICAgfVxuXG4gICAgLy8gcGFuLXggT1IgcGFuLXlcbiAgICBpZiAoaGFzUGFuWCB8fCBoYXNQYW5ZKSB7XG4gICAgICAgIHJldHVybiBoYXNQYW5YID8gVE9VQ0hfQUNUSU9OX1BBTl9YIDogVE9VQ0hfQUNUSU9OX1BBTl9ZO1xuICAgIH1cblxuICAgIC8vIG1hbmlwdWxhdGlvblxuICAgIGlmIChpblN0cihhY3Rpb25zLCBUT1VDSF9BQ1RJT05fTUFOSVBVTEFUSU9OKSkge1xuICAgICAgICByZXR1cm4gVE9VQ0hfQUNUSU9OX01BTklQVUxBVElPTjtcbiAgICB9XG5cbiAgICByZXR1cm4gVE9VQ0hfQUNUSU9OX0FVVE87XG59XG5cbmZ1bmN0aW9uIGdldFRvdWNoQWN0aW9uUHJvcHMoKSB7XG4gICAgaWYgKCFOQVRJVkVfVE9VQ0hfQUNUSU9OKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHRvdWNoTWFwID0ge307XG4gICAgdmFyIGNzc1N1cHBvcnRzID0gd2luZG93LkNTUyAmJiB3aW5kb3cuQ1NTLnN1cHBvcnRzO1xuICAgIFsnYXV0bycsICdtYW5pcHVsYXRpb24nLCAncGFuLXknLCAncGFuLXgnLCAncGFuLXggcGFuLXknLCAnbm9uZSddLmZvckVhY2goZnVuY3Rpb24odmFsKSB7XG5cbiAgICAgICAgLy8gSWYgY3NzLnN1cHBvcnRzIGlzIG5vdCBzdXBwb3J0ZWQgYnV0IHRoZXJlIGlzIG5hdGl2ZSB0b3VjaC1hY3Rpb24gYXNzdW1lIGl0IHN1cHBvcnRzXG4gICAgICAgIC8vIGFsbCB2YWx1ZXMuIFRoaXMgaXMgdGhlIGNhc2UgZm9yIElFIDEwIGFuZCAxMS5cbiAgICAgICAgdG91Y2hNYXBbdmFsXSA9IGNzc1N1cHBvcnRzID8gd2luZG93LkNTUy5zdXBwb3J0cygndG91Y2gtYWN0aW9uJywgdmFsKSA6IHRydWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvdWNoTWFwO1xufVxuXG4vKipcbiAqIFJlY29nbml6ZXIgZmxvdyBleHBsYWluZWQ7ICpcbiAqIEFsbCByZWNvZ25pemVycyBoYXZlIHRoZSBpbml0aWFsIHN0YXRlIG9mIFBPU1NJQkxFIHdoZW4gYSBpbnB1dCBzZXNzaW9uIHN0YXJ0cy5cbiAqIFRoZSBkZWZpbml0aW9uIG9mIGEgaW5wdXQgc2Vzc2lvbiBpcyBmcm9tIHRoZSBmaXJzdCBpbnB1dCB1bnRpbCB0aGUgbGFzdCBpbnB1dCwgd2l0aCBhbGwgaXQncyBtb3ZlbWVudCBpbiBpdC4gKlxuICogRXhhbXBsZSBzZXNzaW9uIGZvciBtb3VzZS1pbnB1dDogbW91c2Vkb3duIC0+IG1vdXNlbW92ZSAtPiBtb3VzZXVwXG4gKlxuICogT24gZWFjaCByZWNvZ25pemluZyBjeWNsZSAoc2VlIE1hbmFnZXIucmVjb2duaXplKSB0aGUgLnJlY29nbml6ZSgpIG1ldGhvZCBpcyBleGVjdXRlZFxuICogd2hpY2ggZGV0ZXJtaW5lcyB3aXRoIHN0YXRlIGl0IHNob3VsZCBiZS5cbiAqXG4gKiBJZiB0aGUgcmVjb2duaXplciBoYXMgdGhlIHN0YXRlIEZBSUxFRCwgQ0FOQ0VMTEVEIG9yIFJFQ09HTklaRUQgKGVxdWFscyBFTkRFRCksIGl0IGlzIHJlc2V0IHRvXG4gKiBQT1NTSUJMRSB0byBnaXZlIGl0IGFub3RoZXIgY2hhbmdlIG9uIHRoZSBuZXh0IGN5Y2xlLlxuICpcbiAqICAgICAgICAgICAgICAgUG9zc2libGVcbiAqICAgICAgICAgICAgICAgICAgfFxuICogICAgICAgICAgICArLS0tLS0rLS0tLS0tLS0tLS0tLS0tK1xuICogICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgfFxuICogICAgICArLS0tLS0rLS0tLS0rICAgICAgICAgICAgICAgfFxuICogICAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgfFxuICogICBGYWlsZWQgICAgICBDYW5jZWxsZWQgICAgICAgICAgfFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKy0tLS0tLStcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8XG4gKiAgICAgICAgICAgICAgICAgICAgICBSZWNvZ25pemVkICAgICAgIEJlZ2FuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRlZC9SZWNvZ25pemVkXG4gKi9cbnZhciBTVEFURV9QT1NTSUJMRSA9IDE7XG52YXIgU1RBVEVfQkVHQU4gPSAyO1xudmFyIFNUQVRFX0NIQU5HRUQgPSA0O1xudmFyIFNUQVRFX0VOREVEID0gODtcbnZhciBTVEFURV9SRUNPR05JWkVEID0gU1RBVEVfRU5ERUQ7XG52YXIgU1RBVEVfQ0FOQ0VMTEVEID0gMTY7XG52YXIgU1RBVEVfRkFJTEVEID0gMzI7XG5cbi8qKlxuICogUmVjb2duaXplclxuICogRXZlcnkgcmVjb2duaXplciBuZWVkcyB0byBleHRlbmQgZnJvbSB0aGlzIGNsYXNzLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICovXG5mdW5jdGlvbiBSZWNvZ25pemVyKG9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBhc3NpZ24oe30sIHRoaXMuZGVmYXVsdHMsIG9wdGlvbnMgfHwge30pO1xuXG4gICAgdGhpcy5pZCA9IHVuaXF1ZUlkKCk7XG5cbiAgICB0aGlzLm1hbmFnZXIgPSBudWxsO1xuXG4gICAgLy8gZGVmYXVsdCBpcyBlbmFibGUgdHJ1ZVxuICAgIHRoaXMub3B0aW9ucy5lbmFibGUgPSBpZlVuZGVmaW5lZCh0aGlzLm9wdGlvbnMuZW5hYmxlLCB0cnVlKTtcblxuICAgIHRoaXMuc3RhdGUgPSBTVEFURV9QT1NTSUJMRTtcblxuICAgIHRoaXMuc2ltdWx0YW5lb3VzID0ge307XG4gICAgdGhpcy5yZXF1aXJlRmFpbCA9IFtdO1xufVxuXG5SZWNvZ25pemVyLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBAdmlydHVhbFxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICovXG4gICAgZGVmYXVsdHM6IHt9LFxuXG4gICAgLyoqXG4gICAgICogc2V0IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEByZXR1cm4ge1JlY29nbml6ZXJ9XG4gICAgICovXG4gICAgc2V0OiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgIGFzc2lnbih0aGlzLm9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIGFsc28gdXBkYXRlIHRoZSB0b3VjaEFjdGlvbiwgaW4gY2FzZSBzb21ldGhpbmcgY2hhbmdlZCBhYm91dCB0aGUgZGlyZWN0aW9ucy9lbmFibGVkIHN0YXRlXG4gICAgICAgIHRoaXMubWFuYWdlciAmJiB0aGlzLm1hbmFnZXIudG91Y2hBY3Rpb24udXBkYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiByZWNvZ25pemUgc2ltdWx0YW5lb3VzIHdpdGggYW4gb3RoZXIgcmVjb2duaXplci5cbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ9IG90aGVyUmVjb2duaXplclxuICAgICAqIEByZXR1cm5zIHtSZWNvZ25pemVyfSB0aGlzXG4gICAgICovXG4gICAgcmVjb2duaXplV2l0aDogZnVuY3Rpb24ob3RoZXJSZWNvZ25pemVyKSB7XG4gICAgICAgIGlmIChpbnZva2VBcnJheUFyZyhvdGhlclJlY29nbml6ZXIsICdyZWNvZ25pemVXaXRoJywgdGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNpbXVsdGFuZW91cyA9IHRoaXMuc2ltdWx0YW5lb3VzO1xuICAgICAgICBvdGhlclJlY29nbml6ZXIgPSBnZXRSZWNvZ25pemVyQnlOYW1lSWZNYW5hZ2VyKG90aGVyUmVjb2duaXplciwgdGhpcyk7XG4gICAgICAgIGlmICghc2ltdWx0YW5lb3VzW290aGVyUmVjb2duaXplci5pZF0pIHtcbiAgICAgICAgICAgIHNpbXVsdGFuZW91c1tvdGhlclJlY29nbml6ZXIuaWRdID0gb3RoZXJSZWNvZ25pemVyO1xuICAgICAgICAgICAgb3RoZXJSZWNvZ25pemVyLnJlY29nbml6ZVdpdGgodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGRyb3AgdGhlIHNpbXVsdGFuZW91cyBsaW5rLiBpdCBkb2VzbnQgcmVtb3ZlIHRoZSBsaW5rIG9uIHRoZSBvdGhlciByZWNvZ25pemVyLlxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcn0gb3RoZXJSZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge1JlY29nbml6ZXJ9IHRoaXNcbiAgICAgKi9cbiAgICBkcm9wUmVjb2duaXplV2l0aDogZnVuY3Rpb24ob3RoZXJSZWNvZ25pemVyKSB7XG4gICAgICAgIGlmIChpbnZva2VBcnJheUFyZyhvdGhlclJlY29nbml6ZXIsICdkcm9wUmVjb2duaXplV2l0aCcsIHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIG90aGVyUmVjb2duaXplciA9IGdldFJlY29nbml6ZXJCeU5hbWVJZk1hbmFnZXIob3RoZXJSZWNvZ25pemVyLCB0aGlzKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuc2ltdWx0YW5lb3VzW290aGVyUmVjb2duaXplci5pZF07XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiByZWNvZ25pemVyIGNhbiBvbmx5IHJ1biB3aGVuIGFuIG90aGVyIGlzIGZhaWxpbmdcbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ9IG90aGVyUmVjb2duaXplclxuICAgICAqIEByZXR1cm5zIHtSZWNvZ25pemVyfSB0aGlzXG4gICAgICovXG4gICAgcmVxdWlyZUZhaWx1cmU6IGZ1bmN0aW9uKG90aGVyUmVjb2duaXplcikge1xuICAgICAgICBpZiAoaW52b2tlQXJyYXlBcmcob3RoZXJSZWNvZ25pemVyLCAncmVxdWlyZUZhaWx1cmUnLCB0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcmVxdWlyZUZhaWwgPSB0aGlzLnJlcXVpcmVGYWlsO1xuICAgICAgICBvdGhlclJlY29nbml6ZXIgPSBnZXRSZWNvZ25pemVyQnlOYW1lSWZNYW5hZ2VyKG90aGVyUmVjb2duaXplciwgdGhpcyk7XG4gICAgICAgIGlmIChpbkFycmF5KHJlcXVpcmVGYWlsLCBvdGhlclJlY29nbml6ZXIpID09PSAtMSkge1xuICAgICAgICAgICAgcmVxdWlyZUZhaWwucHVzaChvdGhlclJlY29nbml6ZXIpO1xuICAgICAgICAgICAgb3RoZXJSZWNvZ25pemVyLnJlcXVpcmVGYWlsdXJlKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBkcm9wIHRoZSByZXF1aXJlRmFpbHVyZSBsaW5rLiBpdCBkb2VzIG5vdCByZW1vdmUgdGhlIGxpbmsgb24gdGhlIG90aGVyIHJlY29nbml6ZXIuXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfSBvdGhlclJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7UmVjb2duaXplcn0gdGhpc1xuICAgICAqL1xuICAgIGRyb3BSZXF1aXJlRmFpbHVyZTogZnVuY3Rpb24ob3RoZXJSZWNvZ25pemVyKSB7XG4gICAgICAgIGlmIChpbnZva2VBcnJheUFyZyhvdGhlclJlY29nbml6ZXIsICdkcm9wUmVxdWlyZUZhaWx1cmUnLCB0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBvdGhlclJlY29nbml6ZXIgPSBnZXRSZWNvZ25pemVyQnlOYW1lSWZNYW5hZ2VyKG90aGVyUmVjb2duaXplciwgdGhpcyk7XG4gICAgICAgIHZhciBpbmRleCA9IGluQXJyYXkodGhpcy5yZXF1aXJlRmFpbCwgb3RoZXJSZWNvZ25pemVyKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWlyZUZhaWwuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogaGFzIHJlcXVpcmUgZmFpbHVyZXMgYm9vbGVhblxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGhhc1JlcXVpcmVGYWlsdXJlczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVpcmVGYWlsLmxlbmd0aCA+IDA7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGlmIHRoZSByZWNvZ25pemVyIGNhbiByZWNvZ25pemUgc2ltdWx0YW5lb3VzIHdpdGggYW4gb3RoZXIgcmVjb2duaXplclxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcn0gb3RoZXJSZWNvZ25pemVyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAgICovXG4gICAgY2FuUmVjb2duaXplV2l0aDogZnVuY3Rpb24ob3RoZXJSZWNvZ25pemVyKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuc2ltdWx0YW5lb3VzW290aGVyUmVjb2duaXplci5pZF07XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFlvdSBzaG91bGQgdXNlIGB0cnlFbWl0YCBpbnN0ZWFkIG9mIGBlbWl0YCBkaXJlY3RseSB0byBjaGVja1xuICAgICAqIHRoYXQgYWxsIHRoZSBuZWVkZWQgcmVjb2duaXplcnMgaGFzIGZhaWxlZCBiZWZvcmUgZW1pdHRpbmcuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAgICovXG4gICAgZW1pdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLnN0YXRlO1xuXG4gICAgICAgIGZ1bmN0aW9uIGVtaXQoZXZlbnQpIHtcbiAgICAgICAgICAgIHNlbGYubWFuYWdlci5lbWl0KGV2ZW50LCBpbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAncGFuc3RhcnQnIGFuZCAncGFubW92ZSdcbiAgICAgICAgaWYgKHN0YXRlIDwgU1RBVEVfRU5ERUQpIHtcbiAgICAgICAgICAgIGVtaXQoc2VsZi5vcHRpb25zLmV2ZW50ICsgc3RhdGVTdHIoc3RhdGUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVtaXQoc2VsZi5vcHRpb25zLmV2ZW50KTsgLy8gc2ltcGxlICdldmVudE5hbWUnIGV2ZW50c1xuXG4gICAgICAgIGlmIChpbnB1dC5hZGRpdGlvbmFsRXZlbnQpIHsgLy8gYWRkaXRpb25hbCBldmVudChwYW5sZWZ0LCBwYW5yaWdodCwgcGluY2hpbiwgcGluY2hvdXQuLi4pXG4gICAgICAgICAgICBlbWl0KGlucHV0LmFkZGl0aW9uYWxFdmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwYW5lbmQgYW5kIHBhbmNhbmNlbFxuICAgICAgICBpZiAoc3RhdGUgPj0gU1RBVEVfRU5ERUQpIHtcbiAgICAgICAgICAgIGVtaXQoc2VsZi5vcHRpb25zLmV2ZW50ICsgc3RhdGVTdHIoc3RhdGUpKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayB0aGF0IGFsbCB0aGUgcmVxdWlyZSBmYWlsdXJlIHJlY29nbml6ZXJzIGhhcyBmYWlsZWQsXG4gICAgICogaWYgdHJ1ZSwgaXQgZW1pdHMgYSBnZXN0dXJlIGV2ZW50LFxuICAgICAqIG90aGVyd2lzZSwgc2V0dXAgdGhlIHN0YXRlIHRvIEZBSUxFRC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAgICAgKi9cbiAgICB0cnlFbWl0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5jYW5FbWl0KCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoaW5wdXQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGl0J3MgZmFpbGluZyBhbnl3YXlcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX0ZBSUxFRDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogY2FuIHdlIGVtaXQ/XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgY2FuRW1pdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgd2hpbGUgKGkgPCB0aGlzLnJlcXVpcmVGYWlsLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKCEodGhpcy5yZXF1aXJlRmFpbFtpXS5zdGF0ZSAmIChTVEFURV9GQUlMRUQgfCBTVEFURV9QT1NTSUJMRSkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiB1cGRhdGUgdGhlIHJlY29nbml6ZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXREYXRhXG4gICAgICovXG4gICAgcmVjb2duaXplOiBmdW5jdGlvbihpbnB1dERhdGEpIHtcbiAgICAgICAgLy8gbWFrZSBhIG5ldyBjb3B5IG9mIHRoZSBpbnB1dERhdGFcbiAgICAgICAgLy8gc28gd2UgY2FuIGNoYW5nZSB0aGUgaW5wdXREYXRhIHdpdGhvdXQgbWVzc2luZyB1cCB0aGUgb3RoZXIgcmVjb2duaXplcnNcbiAgICAgICAgdmFyIGlucHV0RGF0YUNsb25lID0gYXNzaWduKHt9LCBpbnB1dERhdGEpO1xuXG4gICAgICAgIC8vIGlzIGlzIGVuYWJsZWQgYW5kIGFsbG93IHJlY29nbml6aW5nP1xuICAgICAgICBpZiAoIWJvb2xPckZuKHRoaXMub3B0aW9ucy5lbmFibGUsIFt0aGlzLCBpbnB1dERhdGFDbG9uZV0pKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfRkFJTEVEO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVzZXQgd2hlbiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmRcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgJiAoU1RBVEVfUkVDT0dOSVpFRCB8IFNUQVRFX0NBTkNFTExFRCB8IFNUQVRFX0ZBSUxFRCkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9QT1NTSUJMRTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLnByb2Nlc3MoaW5wdXREYXRhQ2xvbmUpO1xuXG4gICAgICAgIC8vIHRoZSByZWNvZ25pemVyIGhhcyByZWNvZ25pemVkIGEgZ2VzdHVyZVxuICAgICAgICAvLyBzbyB0cmlnZ2VyIGFuIGV2ZW50XG4gICAgICAgIGlmICh0aGlzLnN0YXRlICYgKFNUQVRFX0JFR0FOIHwgU1RBVEVfQ0hBTkdFRCB8IFNUQVRFX0VOREVEIHwgU1RBVEVfQ0FOQ0VMTEVEKSkge1xuICAgICAgICAgICAgdGhpcy50cnlFbWl0KGlucHV0RGF0YUNsb25lKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSByZWNvZ25pemVyXG4gICAgICogdGhlIGFjdHVhbCByZWNvZ25pemluZyBoYXBwZW5zIGluIHRoaXMgbWV0aG9kXG4gICAgICogQHZpcnR1YWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXREYXRhXG4gICAgICogQHJldHVybnMge0NvbnN0fSBTVEFURVxuICAgICAqL1xuICAgIHByb2Nlc3M6IGZ1bmN0aW9uKGlucHV0RGF0YSkgeyB9LCAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgcHJlZmVycmVkIHRvdWNoLWFjdGlvblxuICAgICAqIEB2aXJ0dWFsXG4gICAgICogQHJldHVybnMge0FycmF5fVxuICAgICAqL1xuICAgIGdldFRvdWNoQWN0aW9uOiBmdW5jdGlvbigpIHsgfSxcblxuICAgIC8qKlxuICAgICAqIGNhbGxlZCB3aGVuIHRoZSBnZXN0dXJlIGlzbid0IGFsbG93ZWQgdG8gcmVjb2duaXplXG4gICAgICogbGlrZSB3aGVuIGFub3RoZXIgaXMgYmVpbmcgcmVjb2duaXplZCBvciBpdCBpcyBkaXNhYmxlZFxuICAgICAqIEB2aXJ0dWFsXG4gICAgICovXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKCkgeyB9XG59O1xuXG4vKipcbiAqIGdldCBhIHVzYWJsZSBzdHJpbmcsIHVzZWQgYXMgZXZlbnQgcG9zdGZpeFxuICogQHBhcmFtIHtDb25zdH0gc3RhdGVcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0YXRlXG4gKi9cbmZ1bmN0aW9uIHN0YXRlU3RyKHN0YXRlKSB7XG4gICAgaWYgKHN0YXRlICYgU1RBVEVfQ0FOQ0VMTEVEKSB7XG4gICAgICAgIHJldHVybiAnY2FuY2VsJztcbiAgICB9IGVsc2UgaWYgKHN0YXRlICYgU1RBVEVfRU5ERUQpIHtcbiAgICAgICAgcmV0dXJuICdlbmQnO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUgJiBTVEFURV9DSEFOR0VEKSB7XG4gICAgICAgIHJldHVybiAnbW92ZSc7XG4gICAgfSBlbHNlIGlmIChzdGF0ZSAmIFNUQVRFX0JFR0FOKSB7XG4gICAgICAgIHJldHVybiAnc3RhcnQnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogZGlyZWN0aW9uIGNvbnMgdG8gc3RyaW5nXG4gKiBAcGFyYW0ge0NvbnN0fSBkaXJlY3Rpb25cbiAqIEByZXR1cm5zIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGRpcmVjdGlvblN0cihkaXJlY3Rpb24pIHtcbiAgICBpZiAoZGlyZWN0aW9uID09IERJUkVDVElPTl9ET1dOKSB7XG4gICAgICAgIHJldHVybiAnZG93bic7XG4gICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRElSRUNUSU9OX1VQKSB7XG4gICAgICAgIHJldHVybiAndXAnO1xuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERJUkVDVElPTl9MRUZUKSB7XG4gICAgICAgIHJldHVybiAnbGVmdCc7XG4gICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRElSRUNUSU9OX1JJR0hUKSB7XG4gICAgICAgIHJldHVybiAncmlnaHQnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogZ2V0IGEgcmVjb2duaXplciBieSBuYW1lIGlmIGl0IGlzIGJvdW5kIHRvIGEgbWFuYWdlclxuICogQHBhcmFtIHtSZWNvZ25pemVyfFN0cmluZ30gb3RoZXJSZWNvZ25pemVyXG4gKiBAcGFyYW0ge1JlY29nbml6ZXJ9IHJlY29nbml6ZXJcbiAqIEByZXR1cm5zIHtSZWNvZ25pemVyfVxuICovXG5mdW5jdGlvbiBnZXRSZWNvZ25pemVyQnlOYW1lSWZNYW5hZ2VyKG90aGVyUmVjb2duaXplciwgcmVjb2duaXplcikge1xuICAgIHZhciBtYW5hZ2VyID0gcmVjb2duaXplci5tYW5hZ2VyO1xuICAgIGlmIChtYW5hZ2VyKSB7XG4gICAgICAgIHJldHVybiBtYW5hZ2VyLmdldChvdGhlclJlY29nbml6ZXIpO1xuICAgIH1cbiAgICByZXR1cm4gb3RoZXJSZWNvZ25pemVyO1xufVxuXG4vKipcbiAqIFRoaXMgcmVjb2duaXplciBpcyBqdXN0IHVzZWQgYXMgYSBiYXNlIGZvciB0aGUgc2ltcGxlIGF0dHJpYnV0ZSByZWNvZ25pemVycy5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgUmVjb2duaXplclxuICovXG5mdW5jdGlvbiBBdHRyUmVjb2duaXplcigpIHtcbiAgICBSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmluaGVyaXQoQXR0clJlY29nbml6ZXIsIFJlY29nbml6ZXIsIHtcbiAgICAvKipcbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICogQG1lbWJlcm9mIEF0dHJSZWNvZ25pemVyXG4gICAgICovXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDFcbiAgICAgICAgICovXG4gICAgICAgIHBvaW50ZXJzOiAxXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gY2hlY2sgaWYgaXQgdGhlIHJlY29nbml6ZXIgcmVjZWl2ZXMgdmFsaWQgaW5wdXQsIGxpa2UgaW5wdXQuZGlzdGFuY2UgPiAxMC5cbiAgICAgKiBAbWVtYmVyb2YgQXR0clJlY29nbml6ZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gcmVjb2duaXplZFxuICAgICAqL1xuICAgIGF0dHJUZXN0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICB2YXIgb3B0aW9uUG9pbnRlcnMgPSB0aGlzLm9wdGlvbnMucG9pbnRlcnM7XG4gICAgICAgIHJldHVybiBvcHRpb25Qb2ludGVycyA9PT0gMCB8fCBpbnB1dC5wb2ludGVycy5sZW5ndGggPT09IG9wdGlvblBvaW50ZXJzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIHRoZSBpbnB1dCBhbmQgcmV0dXJuIHRoZSBzdGF0ZSBmb3IgdGhlIHJlY29nbml6ZXJcbiAgICAgKiBAbWVtYmVyb2YgQXR0clJlY29nbml6ZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAgICAgKiBAcmV0dXJucyB7Kn0gU3RhdGVcbiAgICAgKi9cbiAgICBwcm9jZXNzOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLnN0YXRlO1xuICAgICAgICB2YXIgZXZlbnRUeXBlID0gaW5wdXQuZXZlbnRUeXBlO1xuXG4gICAgICAgIHZhciBpc1JlY29nbml6ZWQgPSBzdGF0ZSAmIChTVEFURV9CRUdBTiB8IFNUQVRFX0NIQU5HRUQpO1xuICAgICAgICB2YXIgaXNWYWxpZCA9IHRoaXMuYXR0clRlc3QoaW5wdXQpO1xuXG4gICAgICAgIC8vIG9uIGNhbmNlbCBpbnB1dCBhbmQgd2UndmUgcmVjb2duaXplZCBiZWZvcmUsIHJldHVybiBTVEFURV9DQU5DRUxMRURcbiAgICAgICAgaWYgKGlzUmVjb2duaXplZCAmJiAoZXZlbnRUeXBlICYgSU5QVVRfQ0FOQ0VMIHx8ICFpc1ZhbGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlIHwgU1RBVEVfQ0FOQ0VMTEVEO1xuICAgICAgICB9IGVsc2UgaWYgKGlzUmVjb2duaXplZCB8fCBpc1ZhbGlkKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfRU5EKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlIHwgU1RBVEVfRU5ERUQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCEoc3RhdGUgJiBTVEFURV9CRUdBTikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU1RBVEVfQkVHQU47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUgfCBTVEFURV9DSEFOR0VEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTVEFURV9GQUlMRUQ7XG4gICAgfVxufSk7XG5cbi8qKlxuICogUGFuXG4gKiBSZWNvZ25pemVkIHdoZW4gdGhlIHBvaW50ZXIgaXMgZG93biBhbmQgbW92ZWQgaW4gdGhlIGFsbG93ZWQgZGlyZWN0aW9uLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBBdHRyUmVjb2duaXplclxuICovXG5mdW5jdGlvbiBQYW5SZWNvZ25pemVyKCkge1xuICAgIEF0dHJSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB0aGlzLnBYID0gbnVsbDtcbiAgICB0aGlzLnBZID0gbnVsbDtcbn1cblxuaW5oZXJpdChQYW5SZWNvZ25pemVyLCBBdHRyUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgUGFuUmVjb2duaXplclxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIGV2ZW50OiAncGFuJyxcbiAgICAgICAgdGhyZXNob2xkOiAxMCxcbiAgICAgICAgcG9pbnRlcnM6IDEsXG4gICAgICAgIGRpcmVjdGlvbjogRElSRUNUSU9OX0FMTFxuICAgIH0sXG5cbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uO1xuICAgICAgICB2YXIgYWN0aW9ucyA9IFtdO1xuICAgICAgICBpZiAoZGlyZWN0aW9uICYgRElSRUNUSU9OX0hPUklaT05UQUwpIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaChUT1VDSF9BQ1RJT05fUEFOX1kpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXJlY3Rpb24gJiBESVJFQ1RJT05fVkVSVElDQUwpIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaChUT1VDSF9BQ1RJT05fUEFOX1gpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY3Rpb25zO1xuICAgIH0sXG5cbiAgICBkaXJlY3Rpb25UZXN0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgdmFyIGhhc01vdmVkID0gdHJ1ZTtcbiAgICAgICAgdmFyIGRpc3RhbmNlID0gaW5wdXQuZGlzdGFuY2U7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSBpbnB1dC5kaXJlY3Rpb247XG4gICAgICAgIHZhciB4ID0gaW5wdXQuZGVsdGFYO1xuICAgICAgICB2YXIgeSA9IGlucHV0LmRlbHRhWTtcblxuICAgICAgICAvLyBsb2NrIHRvIGF4aXM/XG4gICAgICAgIGlmICghKGRpcmVjdGlvbiAmIG9wdGlvbnMuZGlyZWN0aW9uKSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGlyZWN0aW9uICYgRElSRUNUSU9OX0hPUklaT05UQUwpIHtcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAoeCA9PT0gMCkgPyBESVJFQ1RJT05fTk9ORSA6ICh4IDwgMCkgPyBESVJFQ1RJT05fTEVGVCA6IERJUkVDVElPTl9SSUdIVDtcbiAgICAgICAgICAgICAgICBoYXNNb3ZlZCA9IHggIT0gdGhpcy5wWDtcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IE1hdGguYWJzKGlucHV0LmRlbHRhWCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICh5ID09PSAwKSA/IERJUkVDVElPTl9OT05FIDogKHkgPCAwKSA/IERJUkVDVElPTl9VUCA6IERJUkVDVElPTl9ET1dOO1xuICAgICAgICAgICAgICAgIGhhc01vdmVkID0geSAhPSB0aGlzLnBZO1xuICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gTWF0aC5hYnMoaW5wdXQuZGVsdGFZKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbnB1dC5kaXJlY3Rpb24gPSBkaXJlY3Rpb247XG4gICAgICAgIHJldHVybiBoYXNNb3ZlZCAmJiBkaXN0YW5jZSA+IG9wdGlvbnMudGhyZXNob2xkICYmIGRpcmVjdGlvbiAmIG9wdGlvbnMuZGlyZWN0aW9uO1xuICAgIH0sXG5cbiAgICBhdHRyVGVzdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIEF0dHJSZWNvZ25pemVyLnByb3RvdHlwZS5hdHRyVGVzdC5jYWxsKHRoaXMsIGlucHV0KSAmJlxuICAgICAgICAgICAgKHRoaXMuc3RhdGUgJiBTVEFURV9CRUdBTiB8fCAoISh0aGlzLnN0YXRlICYgU1RBVEVfQkVHQU4pICYmIHRoaXMuZGlyZWN0aW9uVGVzdChpbnB1dCkpKTtcbiAgICB9LFxuXG4gICAgZW1pdDogZnVuY3Rpb24oaW5wdXQpIHtcblxuICAgICAgICB0aGlzLnBYID0gaW5wdXQuZGVsdGFYO1xuICAgICAgICB0aGlzLnBZID0gaW5wdXQuZGVsdGFZO1xuXG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSBkaXJlY3Rpb25TdHIoaW5wdXQuZGlyZWN0aW9uKTtcblxuICAgICAgICBpZiAoZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICBpbnB1dC5hZGRpdGlvbmFsRXZlbnQgPSB0aGlzLm9wdGlvbnMuZXZlbnQgKyBkaXJlY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3VwZXIuZW1pdC5jYWxsKHRoaXMsIGlucHV0KTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBQaW5jaFxuICogUmVjb2duaXplZCB3aGVuIHR3byBvciBtb3JlIHBvaW50ZXJzIGFyZSBtb3ZpbmcgdG93YXJkICh6b29tLWluKSBvciBhd2F5IGZyb20gZWFjaCBvdGhlciAoem9vbS1vdXQpLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBBdHRyUmVjb2duaXplclxuICovXG5mdW5jdGlvbiBQaW5jaFJlY29nbml6ZXIoKSB7XG4gICAgQXR0clJlY29nbml6ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuaW5oZXJpdChQaW5jaFJlY29nbml6ZXIsIEF0dHJSZWNvZ25pemVyLCB7XG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqIEBtZW1iZXJvZiBQaW5jaFJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBldmVudDogJ3BpbmNoJyxcbiAgICAgICAgdGhyZXNob2xkOiAwLFxuICAgICAgICBwb2ludGVyczogMlxuICAgIH0sXG5cbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBbVE9VQ0hfQUNUSU9OX05PTkVdO1xuICAgIH0sXG5cbiAgICBhdHRyVGVzdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1cGVyLmF0dHJUZXN0LmNhbGwodGhpcywgaW5wdXQpICYmXG4gICAgICAgICAgICAoTWF0aC5hYnMoaW5wdXQuc2NhbGUgLSAxKSA+IHRoaXMub3B0aW9ucy50aHJlc2hvbGQgfHwgdGhpcy5zdGF0ZSAmIFNUQVRFX0JFR0FOKTtcbiAgICB9LFxuXG4gICAgZW1pdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgaWYgKGlucHV0LnNjYWxlICE9PSAxKSB7XG4gICAgICAgICAgICB2YXIgaW5PdXQgPSBpbnB1dC5zY2FsZSA8IDEgPyAnaW4nIDogJ291dCc7XG4gICAgICAgICAgICBpbnB1dC5hZGRpdGlvbmFsRXZlbnQgPSB0aGlzLm9wdGlvbnMuZXZlbnQgKyBpbk91dDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdXBlci5lbWl0LmNhbGwodGhpcywgaW5wdXQpO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqIFByZXNzXG4gKiBSZWNvZ25pemVkIHdoZW4gdGhlIHBvaW50ZXIgaXMgZG93biBmb3IgeCBtcyB3aXRob3V0IGFueSBtb3ZlbWVudC5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgUmVjb2duaXplclxuICovXG5mdW5jdGlvbiBQcmVzc1JlY29nbml6ZXIoKSB7XG4gICAgUmVjb2duaXplci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgdGhpcy5fdGltZXIgPSBudWxsO1xuICAgIHRoaXMuX2lucHV0ID0gbnVsbDtcbn1cblxuaW5oZXJpdChQcmVzc1JlY29nbml6ZXIsIFJlY29nbml6ZXIsIHtcbiAgICAvKipcbiAgICAgKiBAbmFtZXNwYWNlXG4gICAgICogQG1lbWJlcm9mIFByZXNzUmVjb2duaXplclxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIGV2ZW50OiAncHJlc3MnLFxuICAgICAgICBwb2ludGVyczogMSxcbiAgICAgICAgdGltZTogMjUxLCAvLyBtaW5pbWFsIHRpbWUgb2YgdGhlIHBvaW50ZXIgdG8gYmUgcHJlc3NlZFxuICAgICAgICB0aHJlc2hvbGQ6IDkgLy8gYSBtaW5pbWFsIG1vdmVtZW50IGlzIG9rLCBidXQga2VlcCBpdCBsb3dcbiAgICB9LFxuXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gW1RPVUNIX0FDVElPTl9BVVRPXTtcbiAgICB9LFxuXG4gICAgcHJvY2VzczogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIHZhciB2YWxpZFBvaW50ZXJzID0gaW5wdXQucG9pbnRlcnMubGVuZ3RoID09PSBvcHRpb25zLnBvaW50ZXJzO1xuICAgICAgICB2YXIgdmFsaWRNb3ZlbWVudCA9IGlucHV0LmRpc3RhbmNlIDwgb3B0aW9ucy50aHJlc2hvbGQ7XG4gICAgICAgIHZhciB2YWxpZFRpbWUgPSBpbnB1dC5kZWx0YVRpbWUgPiBvcHRpb25zLnRpbWU7XG5cbiAgICAgICAgdGhpcy5faW5wdXQgPSBpbnB1dDtcblxuICAgICAgICAvLyB3ZSBvbmx5IGFsbG93IGxpdHRsZSBtb3ZlbWVudFxuICAgICAgICAvLyBhbmQgd2UndmUgcmVhY2hlZCBhbiBlbmQgZXZlbnQsIHNvIGEgdGFwIGlzIHBvc3NpYmxlXG4gICAgICAgIGlmICghdmFsaWRNb3ZlbWVudCB8fCAhdmFsaWRQb2ludGVycyB8fCAoaW5wdXQuZXZlbnRUeXBlICYgKElOUFVUX0VORCB8IElOUFVUX0NBTkNFTCkgJiYgIXZhbGlkVGltZSkpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5ldmVudFR5cGUgJiBJTlBVVF9TVEFSVCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgICAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0Q29udGV4dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfUkVDT0dOSVpFRDtcbiAgICAgICAgICAgICAgICB0aGlzLnRyeUVtaXQoKTtcbiAgICAgICAgICAgIH0sIG9wdGlvbnMudGltZSwgdGhpcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQuZXZlbnRUeXBlICYgSU5QVVRfRU5EKSB7XG4gICAgICAgICAgICByZXR1cm4gU1RBVEVfUkVDT0dOSVpFRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU1RBVEVfRkFJTEVEO1xuICAgIH0sXG5cbiAgICByZXNldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcik7XG4gICAgfSxcblxuICAgIGVtaXQ6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBTVEFURV9SRUNPR05JWkVEKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5wdXQgJiYgKGlucHV0LmV2ZW50VHlwZSAmIElOUFVUX0VORCkpIHtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCArICd1cCcsIGlucHV0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2lucHV0LnRpbWVTdGFtcCA9IG5vdygpO1xuICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LCB0aGlzLl9pbnB1dCk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxuLyoqXG4gKiBSb3RhdGVcbiAqIFJlY29nbml6ZWQgd2hlbiB0d28gb3IgbW9yZSBwb2ludGVyIGFyZSBtb3ZpbmcgaW4gYSBjaXJjdWxhciBtb3Rpb24uXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIEF0dHJSZWNvZ25pemVyXG4gKi9cbmZ1bmN0aW9uIFJvdGF0ZVJlY29nbml6ZXIoKSB7XG4gICAgQXR0clJlY29nbml6ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuaW5oZXJpdChSb3RhdGVSZWNvZ25pemVyLCBBdHRyUmVjb2duaXplciwge1xuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKiBAbWVtYmVyb2YgUm90YXRlUmVjb2duaXplclxuICAgICAqL1xuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIGV2ZW50OiAncm90YXRlJyxcbiAgICAgICAgdGhyZXNob2xkOiAwLFxuICAgICAgICBwb2ludGVyczogMlxuICAgIH0sXG5cbiAgICBnZXRUb3VjaEFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBbVE9VQ0hfQUNUSU9OX05PTkVdO1xuICAgIH0sXG5cbiAgICBhdHRyVGVzdDogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1cGVyLmF0dHJUZXN0LmNhbGwodGhpcywgaW5wdXQpICYmXG4gICAgICAgICAgICAoTWF0aC5hYnMoaW5wdXQucm90YXRpb24pID4gdGhpcy5vcHRpb25zLnRocmVzaG9sZCB8fCB0aGlzLnN0YXRlICYgU1RBVEVfQkVHQU4pO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqIFN3aXBlXG4gKiBSZWNvZ25pemVkIHdoZW4gdGhlIHBvaW50ZXIgaXMgbW92aW5nIGZhc3QgKHZlbG9jaXR5KSwgd2l0aCBlbm91Z2ggZGlzdGFuY2UgaW4gdGhlIGFsbG93ZWQgZGlyZWN0aW9uLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBBdHRyUmVjb2duaXplclxuICovXG5mdW5jdGlvbiBTd2lwZVJlY29nbml6ZXIoKSB7XG4gICAgQXR0clJlY29nbml6ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuaW5oZXJpdChTd2lwZVJlY29nbml6ZXIsIEF0dHJSZWNvZ25pemVyLCB7XG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqIEBtZW1iZXJvZiBTd2lwZVJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBldmVudDogJ3N3aXBlJyxcbiAgICAgICAgdGhyZXNob2xkOiAxMCxcbiAgICAgICAgdmVsb2NpdHk6IDAuMyxcbiAgICAgICAgZGlyZWN0aW9uOiBESVJFQ1RJT05fSE9SSVpPTlRBTCB8IERJUkVDVElPTl9WRVJUSUNBTCxcbiAgICAgICAgcG9pbnRlcnM6IDFcbiAgICB9LFxuXG4gICAgZ2V0VG91Y2hBY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gUGFuUmVjb2duaXplci5wcm90b3R5cGUuZ2V0VG91Y2hBY3Rpb24uY2FsbCh0aGlzKTtcbiAgICB9LFxuXG4gICAgYXR0clRlc3Q6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uO1xuICAgICAgICB2YXIgdmVsb2NpdHk7XG5cbiAgICAgICAgaWYgKGRpcmVjdGlvbiAmIChESVJFQ1RJT05fSE9SSVpPTlRBTCB8IERJUkVDVElPTl9WRVJUSUNBTCkpIHtcbiAgICAgICAgICAgIHZlbG9jaXR5ID0gaW5wdXQub3ZlcmFsbFZlbG9jaXR5O1xuICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiAmIERJUkVDVElPTl9IT1JJWk9OVEFMKSB7XG4gICAgICAgICAgICB2ZWxvY2l0eSA9IGlucHV0Lm92ZXJhbGxWZWxvY2l0eVg7XG4gICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uICYgRElSRUNUSU9OX1ZFUlRJQ0FMKSB7XG4gICAgICAgICAgICB2ZWxvY2l0eSA9IGlucHV0Lm92ZXJhbGxWZWxvY2l0eVk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fc3VwZXIuYXR0clRlc3QuY2FsbCh0aGlzLCBpbnB1dCkgJiZcbiAgICAgICAgICAgIGRpcmVjdGlvbiAmIGlucHV0Lm9mZnNldERpcmVjdGlvbiAmJlxuICAgICAgICAgICAgaW5wdXQuZGlzdGFuY2UgPiB0aGlzLm9wdGlvbnMudGhyZXNob2xkICYmXG4gICAgICAgICAgICBpbnB1dC5tYXhQb2ludGVycyA9PSB0aGlzLm9wdGlvbnMucG9pbnRlcnMgJiZcbiAgICAgICAgICAgIGFicyh2ZWxvY2l0eSkgPiB0aGlzLm9wdGlvbnMudmVsb2NpdHkgJiYgaW5wdXQuZXZlbnRUeXBlICYgSU5QVVRfRU5EO1xuICAgIH0sXG5cbiAgICBlbWl0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICB2YXIgZGlyZWN0aW9uID0gZGlyZWN0aW9uU3RyKGlucHV0Lm9mZnNldERpcmVjdGlvbik7XG4gICAgICAgIGlmIChkaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCArIGRpcmVjdGlvbiwgaW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LCBpbnB1dCk7XG4gICAgfVxufSk7XG5cbi8qKlxuICogQSB0YXAgaXMgZWNvZ25pemVkIHdoZW4gdGhlIHBvaW50ZXIgaXMgZG9pbmcgYSBzbWFsbCB0YXAvY2xpY2suIE11bHRpcGxlIHRhcHMgYXJlIHJlY29nbml6ZWQgaWYgdGhleSBvY2N1clxuICogYmV0d2VlbiB0aGUgZ2l2ZW4gaW50ZXJ2YWwgYW5kIHBvc2l0aW9uLiBUaGUgZGVsYXkgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHJlY29nbml6ZSBtdWx0aS10YXBzIHdpdGhvdXQgZmlyaW5nXG4gKiBhIHNpbmdsZSB0YXAuXG4gKlxuICogVGhlIGV2ZW50RGF0YSBmcm9tIHRoZSBlbWl0dGVkIGV2ZW50IGNvbnRhaW5zIHRoZSBwcm9wZXJ0eSBgdGFwQ291bnRgLCB3aGljaCBjb250YWlucyB0aGUgYW1vdW50IG9mXG4gKiBtdWx0aS10YXBzIGJlaW5nIHJlY29nbml6ZWQuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIFJlY29nbml6ZXJcbiAqL1xuZnVuY3Rpb24gVGFwUmVjb2duaXplcigpIHtcbiAgICBSZWNvZ25pemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAvLyBwcmV2aW91cyB0aW1lIGFuZCBjZW50ZXIsXG4gICAgLy8gdXNlZCBmb3IgdGFwIGNvdW50aW5nXG4gICAgdGhpcy5wVGltZSA9IGZhbHNlO1xuICAgIHRoaXMucENlbnRlciA9IGZhbHNlO1xuXG4gICAgdGhpcy5fdGltZXIgPSBudWxsO1xuICAgIHRoaXMuX2lucHV0ID0gbnVsbDtcbiAgICB0aGlzLmNvdW50ID0gMDtcbn1cblxuaW5oZXJpdChUYXBSZWNvZ25pemVyLCBSZWNvZ25pemVyLCB7XG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqIEBtZW1iZXJvZiBQaW5jaFJlY29nbml6ZXJcbiAgICAgKi9cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBldmVudDogJ3RhcCcsXG4gICAgICAgIHBvaW50ZXJzOiAxLFxuICAgICAgICB0YXBzOiAxLFxuICAgICAgICBpbnRlcnZhbDogMzAwLCAvLyBtYXggdGltZSBiZXR3ZWVuIHRoZSBtdWx0aS10YXAgdGFwc1xuICAgICAgICB0aW1lOiAyNTAsIC8vIG1heCB0aW1lIG9mIHRoZSBwb2ludGVyIHRvIGJlIGRvd24gKGxpa2UgZmluZ2VyIG9uIHRoZSBzY3JlZW4pXG4gICAgICAgIHRocmVzaG9sZDogOSwgLy8gYSBtaW5pbWFsIG1vdmVtZW50IGlzIG9rLCBidXQga2VlcCBpdCBsb3dcbiAgICAgICAgcG9zVGhyZXNob2xkOiAxMCAvLyBhIG11bHRpLXRhcCBjYW4gYmUgYSBiaXQgb2ZmIHRoZSBpbml0aWFsIHBvc2l0aW9uXG4gICAgfSxcblxuICAgIGdldFRvdWNoQWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFtUT1VDSF9BQ1RJT05fTUFOSVBVTEFUSU9OXTtcbiAgICB9LFxuXG4gICAgcHJvY2VzczogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgICAgdmFyIHZhbGlkUG9pbnRlcnMgPSBpbnB1dC5wb2ludGVycy5sZW5ndGggPT09IG9wdGlvbnMucG9pbnRlcnM7XG4gICAgICAgIHZhciB2YWxpZE1vdmVtZW50ID0gaW5wdXQuZGlzdGFuY2UgPCBvcHRpb25zLnRocmVzaG9sZDtcbiAgICAgICAgdmFyIHZhbGlkVG91Y2hUaW1lID0gaW5wdXQuZGVsdGFUaW1lIDwgb3B0aW9ucy50aW1lO1xuXG4gICAgICAgIHRoaXMucmVzZXQoKTtcblxuICAgICAgICBpZiAoKGlucHV0LmV2ZW50VHlwZSAmIElOUFVUX1NUQVJUKSAmJiAodGhpcy5jb3VudCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZhaWxUaW1lb3V0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3ZSBvbmx5IGFsbG93IGxpdHRsZSBtb3ZlbWVudFxuICAgICAgICAvLyBhbmQgd2UndmUgcmVhY2hlZCBhbiBlbmQgZXZlbnQsIHNvIGEgdGFwIGlzIHBvc3NpYmxlXG4gICAgICAgIGlmICh2YWxpZE1vdmVtZW50ICYmIHZhbGlkVG91Y2hUaW1lICYmIHZhbGlkUG9pbnRlcnMpIHtcbiAgICAgICAgICAgIGlmIChpbnB1dC5ldmVudFR5cGUgIT0gSU5QVVRfRU5EKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHZhbGlkSW50ZXJ2YWwgPSB0aGlzLnBUaW1lID8gKGlucHV0LnRpbWVTdGFtcCAtIHRoaXMucFRpbWUgPCBvcHRpb25zLmludGVydmFsKSA6IHRydWU7XG4gICAgICAgICAgICB2YXIgdmFsaWRNdWx0aVRhcCA9ICF0aGlzLnBDZW50ZXIgfHwgZ2V0RGlzdGFuY2UodGhpcy5wQ2VudGVyLCBpbnB1dC5jZW50ZXIpIDwgb3B0aW9ucy5wb3NUaHJlc2hvbGQ7XG5cbiAgICAgICAgICAgIHRoaXMucFRpbWUgPSBpbnB1dC50aW1lU3RhbXA7XG4gICAgICAgICAgICB0aGlzLnBDZW50ZXIgPSBpbnB1dC5jZW50ZXI7XG5cbiAgICAgICAgICAgIGlmICghdmFsaWRNdWx0aVRhcCB8fCAhdmFsaWRJbnRlcnZhbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY291bnQgPSAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50ICs9IDE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7XG5cbiAgICAgICAgICAgIC8vIGlmIHRhcCBjb3VudCBtYXRjaGVzIHdlIGhhdmUgcmVjb2duaXplZCBpdCxcbiAgICAgICAgICAgIC8vIGVsc2UgaXQgaGFzIGJlZ2FuIHJlY29nbml6aW5nLi4uXG4gICAgICAgICAgICB2YXIgdGFwQ291bnQgPSB0aGlzLmNvdW50ICUgb3B0aW9ucy50YXBzO1xuICAgICAgICAgICAgaWYgKHRhcENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gbm8gZmFpbGluZyByZXF1aXJlbWVudHMsIGltbWVkaWF0ZWx5IHRyaWdnZXIgdGhlIHRhcCBldmVudFxuICAgICAgICAgICAgICAgIC8vIG9yIHdhaXQgYXMgbG9uZyBhcyB0aGUgbXVsdGl0YXAgaW50ZXJ2YWwgdG8gdHJpZ2dlclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5oYXNSZXF1aXJlRmFpbHVyZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVEVfUkVDT0dOSVpFRDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90aW1lciA9IHNldFRpbWVvdXRDb250ZXh0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX1JFQ09HTklaRUQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUVtaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgb3B0aW9ucy5pbnRlcnZhbCwgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFURV9CRUdBTjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFNUQVRFX0ZBSUxFRDtcbiAgICB9LFxuXG4gICAgZmFpbFRpbWVvdXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl90aW1lciA9IHNldFRpbWVvdXRDb250ZXh0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX0ZBSUxFRDtcbiAgICAgICAgfSwgdGhpcy5vcHRpb25zLmludGVydmFsLCB0aGlzKTtcbiAgICAgICAgcmV0dXJuIFNUQVRFX0ZBSUxFRDtcbiAgICB9LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICAgIH0sXG5cbiAgICBlbWl0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT0gU1RBVEVfUkVDT0dOSVpFRCkge1xuICAgICAgICAgICAgdGhpcy5faW5wdXQudGFwQ291bnQgPSB0aGlzLmNvdW50O1xuICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LCB0aGlzLl9pbnB1dCk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxuLyoqXG4gKiBTaW1wbGUgd2F5IHRvIGNyZWF0ZSBhIG1hbmFnZXIgd2l0aCBhIGRlZmF1bHQgc2V0IG9mIHJlY29nbml6ZXJzLlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIEhhbW1lcihlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy5yZWNvZ25pemVycyA9IGlmVW5kZWZpbmVkKG9wdGlvbnMucmVjb2duaXplcnMsIEhhbW1lci5kZWZhdWx0cy5wcmVzZXQpO1xuICAgIHJldHVybiBuZXcgTWFuYWdlcihlbGVtZW50LCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBAY29uc3Qge3N0cmluZ31cbiAqL1xuSGFtbWVyLlZFUlNJT04gPSAnMi4wLjcnO1xuXG4vKipcbiAqIGRlZmF1bHQgc2V0dGluZ3NcbiAqIEBuYW1lc3BhY2VcbiAqL1xuSGFtbWVyLmRlZmF1bHRzID0ge1xuICAgIC8qKlxuICAgICAqIHNldCBpZiBET00gZXZlbnRzIGFyZSBiZWluZyB0cmlnZ2VyZWQuXG4gICAgICogQnV0IHRoaXMgaXMgc2xvd2VyIGFuZCB1bnVzZWQgYnkgc2ltcGxlIGltcGxlbWVudGF0aW9ucywgc28gZGlzYWJsZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIGRvbUV2ZW50czogZmFsc2UsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgZm9yIHRoZSB0b3VjaEFjdGlvbiBwcm9wZXJ0eS9mYWxsYmFjay5cbiAgICAgKiBXaGVuIHNldCB0byBgY29tcHV0ZWAgaXQgd2lsbCBtYWdpY2FsbHkgc2V0IHRoZSBjb3JyZWN0IHZhbHVlIGJhc2VkIG9uIHRoZSBhZGRlZCByZWNvZ25pemVycy5cbiAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAqIEBkZWZhdWx0IGNvbXB1dGVcbiAgICAgKi9cbiAgICB0b3VjaEFjdGlvbjogVE9VQ0hfQUNUSU9OX0NPTVBVVEUsXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgZW5hYmxlOiB0cnVlLFxuXG4gICAgLyoqXG4gICAgICogRVhQRVJJTUVOVEFMIEZFQVRVUkUgLS0gY2FuIGJlIHJlbW92ZWQvY2hhbmdlZFxuICAgICAqIENoYW5nZSB0aGUgcGFyZW50IGlucHV0IHRhcmdldCBlbGVtZW50LlxuICAgICAqIElmIE51bGwsIHRoZW4gaXQgaXMgYmVpbmcgc2V0IHRoZSB0byBtYWluIGVsZW1lbnQuXG4gICAgICogQHR5cGUge051bGx8RXZlbnRUYXJnZXR9XG4gICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAqL1xuICAgIGlucHV0VGFyZ2V0OiBudWxsLFxuXG4gICAgLyoqXG4gICAgICogZm9yY2UgYW4gaW5wdXQgY2xhc3NcbiAgICAgKiBAdHlwZSB7TnVsbHxGdW5jdGlvbn1cbiAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICovXG4gICAgaW5wdXRDbGFzczogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgcmVjb2duaXplciBzZXR1cCB3aGVuIGNhbGxpbmcgYEhhbW1lcigpYFxuICAgICAqIFdoZW4gY3JlYXRpbmcgYSBuZXcgTWFuYWdlciB0aGVzZSB3aWxsIGJlIHNraXBwZWQuXG4gICAgICogQHR5cGUge0FycmF5fVxuICAgICAqL1xuICAgIHByZXNldDogW1xuICAgICAgICAvLyBSZWNvZ25pemVyQ2xhc3MsIG9wdGlvbnMsIFtyZWNvZ25pemVXaXRoLCAuLi5dLCBbcmVxdWlyZUZhaWx1cmUsIC4uLl1cbiAgICAgICAgW1JvdGF0ZVJlY29nbml6ZXIsIHtlbmFibGU6IGZhbHNlfV0sXG4gICAgICAgIFtQaW5jaFJlY29nbml6ZXIsIHtlbmFibGU6IGZhbHNlfSwgWydyb3RhdGUnXV0sXG4gICAgICAgIFtTd2lwZVJlY29nbml6ZXIsIHtkaXJlY3Rpb246IERJUkVDVElPTl9IT1JJWk9OVEFMfV0sXG4gICAgICAgIFtQYW5SZWNvZ25pemVyLCB7ZGlyZWN0aW9uOiBESVJFQ1RJT05fSE9SSVpPTlRBTH0sIFsnc3dpcGUnXV0sXG4gICAgICAgIFtUYXBSZWNvZ25pemVyXSxcbiAgICAgICAgW1RhcFJlY29nbml6ZXIsIHtldmVudDogJ2RvdWJsZXRhcCcsIHRhcHM6IDJ9LCBbJ3RhcCddXSxcbiAgICAgICAgW1ByZXNzUmVjb2duaXplcl1cbiAgICBdLFxuXG4gICAgLyoqXG4gICAgICogU29tZSBDU1MgcHJvcGVydGllcyBjYW4gYmUgdXNlZCB0byBpbXByb3ZlIHRoZSB3b3JraW5nIG9mIEhhbW1lci5cbiAgICAgKiBBZGQgdGhlbSB0byB0aGlzIG1ldGhvZCBhbmQgdGhleSB3aWxsIGJlIHNldCB3aGVuIGNyZWF0aW5nIGEgbmV3IE1hbmFnZXIuXG4gICAgICogQG5hbWVzcGFjZVxuICAgICAqL1xuICAgIGNzc1Byb3BzOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEaXNhYmxlcyB0ZXh0IHNlbGVjdGlvbiB0byBpbXByb3ZlIHRoZSBkcmFnZ2luZyBnZXN0dXJlLiBNYWlubHkgZm9yIGRlc2t0b3AgYnJvd3NlcnMuXG4gICAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgICAqIEBkZWZhdWx0ICdub25lJ1xuICAgICAgICAgKi9cbiAgICAgICAgdXNlclNlbGVjdDogJ25vbmUnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEaXNhYmxlIHRoZSBXaW5kb3dzIFBob25lIGdyaXBwZXJzIHdoZW4gcHJlc3NpbmcgYW4gZWxlbWVudC5cbiAgICAgICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgICAgICogQGRlZmF1bHQgJ25vbmUnXG4gICAgICAgICAqL1xuICAgICAgICB0b3VjaFNlbGVjdDogJ25vbmUnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEaXNhYmxlcyB0aGUgZGVmYXVsdCBjYWxsb3V0IHNob3duIHdoZW4geW91IHRvdWNoIGFuZCBob2xkIGEgdG91Y2ggdGFyZ2V0LlxuICAgICAgICAgKiBPbiBpT1MsIHdoZW4geW91IHRvdWNoIGFuZCBob2xkIGEgdG91Y2ggdGFyZ2V0IHN1Y2ggYXMgYSBsaW5rLCBTYWZhcmkgZGlzcGxheXNcbiAgICAgICAgICogYSBjYWxsb3V0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxpbmsuIFRoaXMgcHJvcGVydHkgYWxsb3dzIHlvdSB0byBkaXNhYmxlIHRoYXQgY2FsbG91dC5cbiAgICAgICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgICAgICogQGRlZmF1bHQgJ25vbmUnXG4gICAgICAgICAqL1xuICAgICAgICB0b3VjaENhbGxvdXQ6ICdub25lJyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIHdoZXRoZXIgem9vbWluZyBpcyBlbmFibGVkLiBVc2VkIGJ5IElFMTA+XG4gICAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgICAqIEBkZWZhdWx0ICdub25lJ1xuICAgICAgICAgKi9cbiAgICAgICAgY29udGVudFpvb21pbmc6ICdub25lJyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIHRoYXQgYW4gZW50aXJlIGVsZW1lbnQgc2hvdWxkIGJlIGRyYWdnYWJsZSBpbnN0ZWFkIG9mIGl0cyBjb250ZW50cy4gTWFpbmx5IGZvciBkZXNrdG9wIGJyb3dzZXJzLlxuICAgICAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAgICAgKiBAZGVmYXVsdCAnbm9uZSdcbiAgICAgICAgICovXG4gICAgICAgIHVzZXJEcmFnOiAnbm9uZScsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE92ZXJyaWRlcyB0aGUgaGlnaGxpZ2h0IGNvbG9yIHNob3duIHdoZW4gdGhlIHVzZXIgdGFwcyBhIGxpbmsgb3IgYSBKYXZhU2NyaXB0XG4gICAgICAgICAqIGNsaWNrYWJsZSBlbGVtZW50IGluIGlPUy4gVGhpcyBwcm9wZXJ0eSBvYmV5cyB0aGUgYWxwaGEgdmFsdWUsIGlmIHNwZWNpZmllZC5cbiAgICAgICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgICAgICogQGRlZmF1bHQgJ3JnYmEoMCwwLDAsMCknXG4gICAgICAgICAqL1xuICAgICAgICB0YXBIaWdobGlnaHRDb2xvcjogJ3JnYmEoMCwwLDAsMCknXG4gICAgfVxufTtcblxudmFyIFNUT1AgPSAxO1xudmFyIEZPUkNFRF9TVE9QID0gMjtcblxuLyoqXG4gKiBNYW5hZ2VyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gTWFuYWdlcihlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0gYXNzaWduKHt9LCBIYW1tZXIuZGVmYXVsdHMsIG9wdGlvbnMgfHwge30pO1xuXG4gICAgdGhpcy5vcHRpb25zLmlucHV0VGFyZ2V0ID0gdGhpcy5vcHRpb25zLmlucHV0VGFyZ2V0IHx8IGVsZW1lbnQ7XG5cbiAgICB0aGlzLmhhbmRsZXJzID0ge307XG4gICAgdGhpcy5zZXNzaW9uID0ge307XG4gICAgdGhpcy5yZWNvZ25pemVycyA9IFtdO1xuICAgIHRoaXMub2xkQ3NzUHJvcHMgPSB7fTtcblxuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5pbnB1dCA9IGNyZWF0ZUlucHV0SW5zdGFuY2UodGhpcyk7XG4gICAgdGhpcy50b3VjaEFjdGlvbiA9IG5ldyBUb3VjaEFjdGlvbih0aGlzLCB0aGlzLm9wdGlvbnMudG91Y2hBY3Rpb24pO1xuXG4gICAgdG9nZ2xlQ3NzUHJvcHModGhpcywgdHJ1ZSk7XG5cbiAgICBlYWNoKHRoaXMub3B0aW9ucy5yZWNvZ25pemVycywgZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICB2YXIgcmVjb2duaXplciA9IHRoaXMuYWRkKG5ldyAoaXRlbVswXSkoaXRlbVsxXSkpO1xuICAgICAgICBpdGVtWzJdICYmIHJlY29nbml6ZXIucmVjb2duaXplV2l0aChpdGVtWzJdKTtcbiAgICAgICAgaXRlbVszXSAmJiByZWNvZ25pemVyLnJlcXVpcmVGYWlsdXJlKGl0ZW1bM10pO1xuICAgIH0sIHRoaXMpO1xufVxuXG5NYW5hZ2VyLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBzZXQgb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHJldHVybnMge01hbmFnZXJ9XG4gICAgICovXG4gICAgc2V0OiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgIGFzc2lnbih0aGlzLm9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIE9wdGlvbnMgdGhhdCBuZWVkIGEgbGl0dGxlIG1vcmUgc2V0dXBcbiAgICAgICAgaWYgKG9wdGlvbnMudG91Y2hBY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMudG91Y2hBY3Rpb24udXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5wdXRUYXJnZXQpIHtcbiAgICAgICAgICAgIC8vIENsZWFuIHVwIGV4aXN0aW5nIGV2ZW50IGxpc3RlbmVycyBhbmQgcmVpbml0aWFsaXplXG4gICAgICAgICAgICB0aGlzLmlucHV0LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXQudGFyZ2V0ID0gb3B0aW9ucy5pbnB1dFRhcmdldDtcbiAgICAgICAgICAgIHRoaXMuaW5wdXQuaW5pdCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBzdG9wIHJlY29nbml6aW5nIGZvciB0aGlzIHNlc3Npb24uXG4gICAgICogVGhpcyBzZXNzaW9uIHdpbGwgYmUgZGlzY2FyZGVkLCB3aGVuIGEgbmV3IFtpbnB1dF1zdGFydCBldmVudCBpcyBmaXJlZC5cbiAgICAgKiBXaGVuIGZvcmNlZCwgdGhlIHJlY29nbml6ZXIgY3ljbGUgaXMgc3RvcHBlZCBpbW1lZGlhdGVseS5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtmb3JjZV1cbiAgICAgKi9cbiAgICBzdG9wOiBmdW5jdGlvbihmb3JjZSkge1xuICAgICAgICB0aGlzLnNlc3Npb24uc3RvcHBlZCA9IGZvcmNlID8gRk9SQ0VEX1NUT1AgOiBTVE9QO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBydW4gdGhlIHJlY29nbml6ZXJzIVxuICAgICAqIGNhbGxlZCBieSB0aGUgaW5wdXRIYW5kbGVyIGZ1bmN0aW9uIG9uIGV2ZXJ5IG1vdmVtZW50IG9mIHRoZSBwb2ludGVycyAodG91Y2hlcylcbiAgICAgKiBpdCB3YWxrcyB0aHJvdWdoIGFsbCB0aGUgcmVjb2duaXplcnMgYW5kIHRyaWVzIHRvIGRldGVjdCB0aGUgZ2VzdHVyZSB0aGF0IGlzIGJlaW5nIG1hZGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXREYXRhXG4gICAgICovXG4gICAgcmVjb2duaXplOiBmdW5jdGlvbihpbnB1dERhdGEpIHtcbiAgICAgICAgdmFyIHNlc3Npb24gPSB0aGlzLnNlc3Npb247XG4gICAgICAgIGlmIChzZXNzaW9uLnN0b3BwZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJ1biB0aGUgdG91Y2gtYWN0aW9uIHBvbHlmaWxsXG4gICAgICAgIHRoaXMudG91Y2hBY3Rpb24ucHJldmVudERlZmF1bHRzKGlucHV0RGF0YSk7XG5cbiAgICAgICAgdmFyIHJlY29nbml6ZXI7XG4gICAgICAgIHZhciByZWNvZ25pemVycyA9IHRoaXMucmVjb2duaXplcnM7XG5cbiAgICAgICAgLy8gdGhpcyBob2xkcyB0aGUgcmVjb2duaXplciB0aGF0IGlzIGJlaW5nIHJlY29nbml6ZWQuXG4gICAgICAgIC8vIHNvIHRoZSByZWNvZ25pemVyJ3Mgc3RhdGUgbmVlZHMgdG8gYmUgQkVHQU4sIENIQU5HRUQsIEVOREVEIG9yIFJFQ09HTklaRURcbiAgICAgICAgLy8gaWYgbm8gcmVjb2duaXplciBpcyBkZXRlY3RpbmcgYSB0aGluZywgaXQgaXMgc2V0IHRvIGBudWxsYFxuICAgICAgICB2YXIgY3VyUmVjb2duaXplciA9IHNlc3Npb24uY3VyUmVjb2duaXplcjtcblxuICAgICAgICAvLyByZXNldCB3aGVuIHRoZSBsYXN0IHJlY29nbml6ZXIgaXMgcmVjb2duaXplZFxuICAgICAgICAvLyBvciB3aGVuIHdlJ3JlIGluIGEgbmV3IHNlc3Npb25cbiAgICAgICAgaWYgKCFjdXJSZWNvZ25pemVyIHx8IChjdXJSZWNvZ25pemVyICYmIGN1clJlY29nbml6ZXIuc3RhdGUgJiBTVEFURV9SRUNPR05JWkVEKSkge1xuICAgICAgICAgICAgY3VyUmVjb2duaXplciA9IHNlc3Npb24uY3VyUmVjb2duaXplciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIHdoaWxlIChpIDwgcmVjb2duaXplcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZWNvZ25pemVyID0gcmVjb2duaXplcnNbaV07XG5cbiAgICAgICAgICAgIC8vIGZpbmQgb3V0IGlmIHdlIGFyZSBhbGxvd2VkIHRyeSB0byByZWNvZ25pemUgdGhlIGlucHV0IGZvciB0aGlzIG9uZS5cbiAgICAgICAgICAgIC8vIDEuICAgYWxsb3cgaWYgdGhlIHNlc3Npb24gaXMgTk9UIGZvcmNlZCBzdG9wcGVkIChzZWUgdGhlIC5zdG9wKCkgbWV0aG9kKVxuICAgICAgICAgICAgLy8gMi4gICBhbGxvdyBpZiB3ZSBzdGlsbCBoYXZlbid0IHJlY29nbml6ZWQgYSBnZXN0dXJlIGluIHRoaXMgc2Vzc2lvbiwgb3IgdGhlIHRoaXMgcmVjb2duaXplciBpcyB0aGUgb25lXG4gICAgICAgICAgICAvLyAgICAgIHRoYXQgaXMgYmVpbmcgcmVjb2duaXplZC5cbiAgICAgICAgICAgIC8vIDMuICAgYWxsb3cgaWYgdGhlIHJlY29nbml6ZXIgaXMgYWxsb3dlZCB0byBydW4gc2ltdWx0YW5lb3VzIHdpdGggdGhlIGN1cnJlbnQgcmVjb2duaXplZCByZWNvZ25pemVyLlxuICAgICAgICAgICAgLy8gICAgICB0aGlzIGNhbiBiZSBzZXR1cCB3aXRoIHRoZSBgcmVjb2duaXplV2l0aCgpYCBtZXRob2Qgb24gdGhlIHJlY29nbml6ZXIuXG4gICAgICAgICAgICBpZiAoc2Vzc2lvbi5zdG9wcGVkICE9PSBGT1JDRURfU1RPUCAmJiAoIC8vIDFcbiAgICAgICAgICAgICAgICAgICAgIWN1clJlY29nbml6ZXIgfHwgcmVjb2duaXplciA9PSBjdXJSZWNvZ25pemVyIHx8IC8vIDJcbiAgICAgICAgICAgICAgICAgICAgcmVjb2duaXplci5jYW5SZWNvZ25pemVXaXRoKGN1clJlY29nbml6ZXIpKSkgeyAvLyAzXG4gICAgICAgICAgICAgICAgcmVjb2duaXplci5yZWNvZ25pemUoaW5wdXREYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVjb2duaXplci5yZXNldCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiB0aGUgcmVjb2duaXplciBoYXMgYmVlbiByZWNvZ25pemluZyB0aGUgaW5wdXQgYXMgYSB2YWxpZCBnZXN0dXJlLCB3ZSB3YW50IHRvIHN0b3JlIHRoaXMgb25lIGFzIHRoZVxuICAgICAgICAgICAgLy8gY3VycmVudCBhY3RpdmUgcmVjb2duaXplci4gYnV0IG9ubHkgaWYgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIGFuIGFjdGl2ZSByZWNvZ25pemVyXG4gICAgICAgICAgICBpZiAoIWN1clJlY29nbml6ZXIgJiYgcmVjb2duaXplci5zdGF0ZSAmIChTVEFURV9CRUdBTiB8IFNUQVRFX0NIQU5HRUQgfCBTVEFURV9FTkRFRCkpIHtcbiAgICAgICAgICAgICAgICBjdXJSZWNvZ25pemVyID0gc2Vzc2lvbi5jdXJSZWNvZ25pemVyID0gcmVjb2duaXplcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBnZXQgYSByZWNvZ25pemVyIGJ5IGl0cyBldmVudCBuYW1lLlxuICAgICAqIEBwYXJhbSB7UmVjb2duaXplcnxTdHJpbmd9IHJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7UmVjb2duaXplcnxOdWxsfVxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24ocmVjb2duaXplcikge1xuICAgICAgICBpZiAocmVjb2duaXplciBpbnN0YW5jZW9mIFJlY29nbml6ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiByZWNvZ25pemVyO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlY29nbml6ZXJzID0gdGhpcy5yZWNvZ25pemVycztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWNvZ25pemVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHJlY29nbml6ZXJzW2ldLm9wdGlvbnMuZXZlbnQgPT0gcmVjb2duaXplcikge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWNvZ25pemVyc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogYWRkIGEgcmVjb2duaXplciB0byB0aGUgbWFuYWdlclxuICAgICAqIGV4aXN0aW5nIHJlY29nbml6ZXJzIHdpdGggdGhlIHNhbWUgZXZlbnQgbmFtZSB3aWxsIGJlIHJlbW92ZWRcbiAgICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ9IHJlY29nbml6ZXJcbiAgICAgKiBAcmV0dXJucyB7UmVjb2duaXplcnxNYW5hZ2VyfVxuICAgICAqL1xuICAgIGFkZDogZnVuY3Rpb24ocmVjb2duaXplcikge1xuICAgICAgICBpZiAoaW52b2tlQXJyYXlBcmcocmVjb2duaXplciwgJ2FkZCcsIHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlbW92ZSBleGlzdGluZ1xuICAgICAgICB2YXIgZXhpc3RpbmcgPSB0aGlzLmdldChyZWNvZ25pemVyLm9wdGlvbnMuZXZlbnQpO1xuICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlKGV4aXN0aW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVjb2duaXplcnMucHVzaChyZWNvZ25pemVyKTtcbiAgICAgICAgcmVjb2duaXplci5tYW5hZ2VyID0gdGhpcztcblxuICAgICAgICB0aGlzLnRvdWNoQWN0aW9uLnVwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gcmVjb2duaXplcjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogcmVtb3ZlIGEgcmVjb2duaXplciBieSBuYW1lIG9yIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtSZWNvZ25pemVyfFN0cmluZ30gcmVjb2duaXplclxuICAgICAqIEByZXR1cm5zIHtNYW5hZ2VyfVxuICAgICAqL1xuICAgIHJlbW92ZTogZnVuY3Rpb24ocmVjb2duaXplcikge1xuICAgICAgICBpZiAoaW52b2tlQXJyYXlBcmcocmVjb2duaXplciwgJ3JlbW92ZScsIHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJlY29nbml6ZXIgPSB0aGlzLmdldChyZWNvZ25pemVyKTtcblxuICAgICAgICAvLyBsZXQncyBtYWtlIHN1cmUgdGhpcyByZWNvZ25pemVyIGV4aXN0c1xuICAgICAgICBpZiAocmVjb2duaXplcikge1xuICAgICAgICAgICAgdmFyIHJlY29nbml6ZXJzID0gdGhpcy5yZWNvZ25pemVycztcbiAgICAgICAgICAgIHZhciBpbmRleCA9IGluQXJyYXkocmVjb2duaXplcnMsIHJlY29nbml6ZXIpO1xuXG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmVjb2duaXplcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvdWNoQWN0aW9uLnVwZGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGJpbmQgZXZlbnRcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRzXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgICAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IHRoaXNcbiAgICAgKi9cbiAgICBvbjogZnVuY3Rpb24oZXZlbnRzLCBoYW5kbGVyKSB7XG4gICAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYW5kbGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnM7XG4gICAgICAgIGVhY2goc3BsaXRTdHIoZXZlbnRzKSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGhhbmRsZXJzW2V2ZW50XSA9IGhhbmRsZXJzW2V2ZW50XSB8fCBbXTtcbiAgICAgICAgICAgIGhhbmRsZXJzW2V2ZW50XS5wdXNoKGhhbmRsZXIpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHVuYmluZCBldmVudCwgbGVhdmUgZW1pdCBibGFuayB0byByZW1vdmUgYWxsIGhhbmRsZXJzXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50c1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtoYW5kbGVyXVxuICAgICAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IHRoaXNcbiAgICAgKi9cbiAgICBvZmY6IGZ1bmN0aW9uKGV2ZW50cywgaGFuZGxlcikge1xuICAgICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnM7XG4gICAgICAgIGVhY2goc3BsaXRTdHIoZXZlbnRzKSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBoYW5kbGVyc1tldmVudF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzW2V2ZW50XSAmJiBoYW5kbGVyc1tldmVudF0uc3BsaWNlKGluQXJyYXkoaGFuZGxlcnNbZXZlbnRdLCBoYW5kbGVyKSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogZW1pdCBldmVudCB0byB0aGUgbGlzdGVuZXJzXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICAgKi9cbiAgICBlbWl0OiBmdW5jdGlvbihldmVudCwgZGF0YSkge1xuICAgICAgICAvLyB3ZSBhbHNvIHdhbnQgdG8gdHJpZ2dlciBkb20gZXZlbnRzXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZG9tRXZlbnRzKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRG9tRXZlbnQoZXZlbnQsIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbm8gaGFuZGxlcnMsIHNvIHNraXAgaXQgYWxsXG4gICAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnNbZXZlbnRdICYmIHRoaXMuaGFuZGxlcnNbZXZlbnRdLnNsaWNlKCk7XG4gICAgICAgIGlmICghaGFuZGxlcnMgfHwgIWhhbmRsZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YS50eXBlID0gZXZlbnQ7XG4gICAgICAgIGRhdGEucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGRhdGEuc3JjRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIHdoaWxlIChpIDwgaGFuZGxlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBoYW5kbGVyc1tpXShkYXRhKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBkZXN0cm95IHRoZSBtYW5hZ2VyIGFuZCB1bmJpbmRzIGFsbCBldmVudHNcbiAgICAgKiBpdCBkb2Vzbid0IHVuYmluZCBkb20gZXZlbnRzLCB0aGF0IGlzIHRoZSB1c2VyIG93biByZXNwb25zaWJpbGl0eVxuICAgICAqL1xuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQgJiYgdG9nZ2xlQ3NzUHJvcHModGhpcywgZmFsc2UpO1xuXG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5zZXNzaW9uID0ge307XG4gICAgICAgIHRoaXMuaW5wdXQuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBudWxsO1xuICAgIH1cbn07XG5cbi8qKlxuICogYWRkL3JlbW92ZSB0aGUgY3NzIHByb3BlcnRpZXMgYXMgZGVmaW5lZCBpbiBtYW5hZ2VyLm9wdGlvbnMuY3NzUHJvcHNcbiAqIEBwYXJhbSB7TWFuYWdlcn0gbWFuYWdlclxuICogQHBhcmFtIHtCb29sZWFufSBhZGRcbiAqL1xuZnVuY3Rpb24gdG9nZ2xlQ3NzUHJvcHMobWFuYWdlciwgYWRkKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBtYW5hZ2VyLmVsZW1lbnQ7XG4gICAgaWYgKCFlbGVtZW50LnN0eWxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHByb3A7XG4gICAgZWFjaChtYW5hZ2VyLm9wdGlvbnMuY3NzUHJvcHMsIGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIHByb3AgPSBwcmVmaXhlZChlbGVtZW50LnN0eWxlLCBuYW1lKTtcbiAgICAgICAgaWYgKGFkZCkge1xuICAgICAgICAgICAgbWFuYWdlci5vbGRDc3NQcm9wc1twcm9wXSA9IGVsZW1lbnQuc3R5bGVbcHJvcF07XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlW3Byb3BdID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlW3Byb3BdID0gbWFuYWdlci5vbGRDc3NQcm9wc1twcm9wXSB8fCAnJztcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghYWRkKSB7XG4gICAgICAgIG1hbmFnZXIub2xkQ3NzUHJvcHMgPSB7fTtcbiAgICB9XG59XG5cbi8qKlxuICogdHJpZ2dlciBkb20gZXZlbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAqL1xuZnVuY3Rpb24gdHJpZ2dlckRvbUV2ZW50KGV2ZW50LCBkYXRhKSB7XG4gICAgdmFyIGdlc3R1cmVFdmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgIGdlc3R1cmVFdmVudC5pbml0RXZlbnQoZXZlbnQsIHRydWUsIHRydWUpO1xuICAgIGdlc3R1cmVFdmVudC5nZXN0dXJlID0gZGF0YTtcbiAgICBkYXRhLnRhcmdldC5kaXNwYXRjaEV2ZW50KGdlc3R1cmVFdmVudCk7XG59XG5cbmFzc2lnbihIYW1tZXIsIHtcbiAgICBJTlBVVF9TVEFSVDogSU5QVVRfU1RBUlQsXG4gICAgSU5QVVRfTU9WRTogSU5QVVRfTU9WRSxcbiAgICBJTlBVVF9FTkQ6IElOUFVUX0VORCxcbiAgICBJTlBVVF9DQU5DRUw6IElOUFVUX0NBTkNFTCxcblxuICAgIFNUQVRFX1BPU1NJQkxFOiBTVEFURV9QT1NTSUJMRSxcbiAgICBTVEFURV9CRUdBTjogU1RBVEVfQkVHQU4sXG4gICAgU1RBVEVfQ0hBTkdFRDogU1RBVEVfQ0hBTkdFRCxcbiAgICBTVEFURV9FTkRFRDogU1RBVEVfRU5ERUQsXG4gICAgU1RBVEVfUkVDT0dOSVpFRDogU1RBVEVfUkVDT0dOSVpFRCxcbiAgICBTVEFURV9DQU5DRUxMRUQ6IFNUQVRFX0NBTkNFTExFRCxcbiAgICBTVEFURV9GQUlMRUQ6IFNUQVRFX0ZBSUxFRCxcblxuICAgIERJUkVDVElPTl9OT05FOiBESVJFQ1RJT05fTk9ORSxcbiAgICBESVJFQ1RJT05fTEVGVDogRElSRUNUSU9OX0xFRlQsXG4gICAgRElSRUNUSU9OX1JJR0hUOiBESVJFQ1RJT05fUklHSFQsXG4gICAgRElSRUNUSU9OX1VQOiBESVJFQ1RJT05fVVAsXG4gICAgRElSRUNUSU9OX0RPV046IERJUkVDVElPTl9ET1dOLFxuICAgIERJUkVDVElPTl9IT1JJWk9OVEFMOiBESVJFQ1RJT05fSE9SSVpPTlRBTCxcbiAgICBESVJFQ1RJT05fVkVSVElDQUw6IERJUkVDVElPTl9WRVJUSUNBTCxcbiAgICBESVJFQ1RJT05fQUxMOiBESVJFQ1RJT05fQUxMLFxuXG4gICAgTWFuYWdlcjogTWFuYWdlcixcbiAgICBJbnB1dDogSW5wdXQsXG4gICAgVG91Y2hBY3Rpb246IFRvdWNoQWN0aW9uLFxuXG4gICAgVG91Y2hJbnB1dDogVG91Y2hJbnB1dCxcbiAgICBNb3VzZUlucHV0OiBNb3VzZUlucHV0LFxuICAgIFBvaW50ZXJFdmVudElucHV0OiBQb2ludGVyRXZlbnRJbnB1dCxcbiAgICBUb3VjaE1vdXNlSW5wdXQ6IFRvdWNoTW91c2VJbnB1dCxcbiAgICBTaW5nbGVUb3VjaElucHV0OiBTaW5nbGVUb3VjaElucHV0LFxuXG4gICAgUmVjb2duaXplcjogUmVjb2duaXplcixcbiAgICBBdHRyUmVjb2duaXplcjogQXR0clJlY29nbml6ZXIsXG4gICAgVGFwOiBUYXBSZWNvZ25pemVyLFxuICAgIFBhbjogUGFuUmVjb2duaXplcixcbiAgICBTd2lwZTogU3dpcGVSZWNvZ25pemVyLFxuICAgIFBpbmNoOiBQaW5jaFJlY29nbml6ZXIsXG4gICAgUm90YXRlOiBSb3RhdGVSZWNvZ25pemVyLFxuICAgIFByZXNzOiBQcmVzc1JlY29nbml6ZXIsXG5cbiAgICBvbjogYWRkRXZlbnRMaXN0ZW5lcnMsXG4gICAgb2ZmOiByZW1vdmVFdmVudExpc3RlbmVycyxcbiAgICBlYWNoOiBlYWNoLFxuICAgIG1lcmdlOiBtZXJnZSxcbiAgICBleHRlbmQ6IGV4dGVuZCxcbiAgICBhc3NpZ246IGFzc2lnbixcbiAgICBpbmhlcml0OiBpbmhlcml0LFxuICAgIGJpbmRGbjogYmluZEZuLFxuICAgIHByZWZpeGVkOiBwcmVmaXhlZFxufSk7XG5cbi8vIHRoaXMgcHJldmVudHMgZXJyb3JzIHdoZW4gSGFtbWVyIGlzIGxvYWRlZCBpbiB0aGUgcHJlc2VuY2Ugb2YgYW4gQU1EXG4vLyAgc3R5bGUgbG9hZGVyIGJ1dCBieSBzY3JpcHQgdGFnLCBub3QgYnkgdGhlIGxvYWRlci5cbnZhciBmcmVlR2xvYmFsID0gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fSkpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmZyZWVHbG9iYWwuSGFtbWVyID0gSGFtbWVyO1xuXG5pZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgZGVmaW5lKGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gSGFtbWVyO1xuICAgIH0pO1xufSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlICE9ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBIYW1tZXI7XG59IGVsc2Uge1xuICAgIHdpbmRvd1tleHBvcnROYW1lXSA9IEhhbW1lcjtcbn1cblxufSkod2luZG93LCBkb2N1bWVudCwgJ0hhbW1lcicpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBpc0Z1bmN0aW9uXG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdcblxuZnVuY3Rpb24gaXNGdW5jdGlvbiAoZm4pIHtcbiAgdmFyIHN0cmluZyA9IHRvU3RyaW5nLmNhbGwoZm4pXG4gIHJldHVybiBzdHJpbmcgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXScgfHxcbiAgICAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nICYmIHN0cmluZyAhPT0gJ1tvYmplY3QgUmVnRXhwXScpIHx8XG4gICAgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgIC8vIElFOCBhbmQgYmVsb3dcbiAgICAgKGZuID09PSB3aW5kb3cuc2V0VGltZW91dCB8fFxuICAgICAgZm4gPT09IHdpbmRvdy5hbGVydCB8fFxuICAgICAgZm4gPT09IHdpbmRvdy5jb25maXJtIHx8XG4gICAgICBmbiA9PT0gd2luZG93LnByb21wdCkpXG59O1xuIiwidmFyIHRyaW0gPSByZXF1aXJlKCd0cmltJylcbiAgLCBmb3JFYWNoID0gcmVxdWlyZSgnZm9yLWVhY2gnKVxuICAsIGlzQXJyYXkgPSBmdW5jdGlvbihhcmcpIHtcbiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJnKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgICB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGhlYWRlcnMpIHtcbiAgaWYgKCFoZWFkZXJzKVxuICAgIHJldHVybiB7fVxuXG4gIHZhciByZXN1bHQgPSB7fVxuXG4gIGZvckVhY2goXG4gICAgICB0cmltKGhlYWRlcnMpLnNwbGl0KCdcXG4nKVxuICAgICwgZnVuY3Rpb24gKHJvdykge1xuICAgICAgICB2YXIgaW5kZXggPSByb3cuaW5kZXhPZignOicpXG4gICAgICAgICAgLCBrZXkgPSB0cmltKHJvdy5zbGljZSgwLCBpbmRleCkpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAsIHZhbHVlID0gdHJpbShyb3cuc2xpY2UoaW5kZXggKyAxKSlcblxuICAgICAgICBpZiAodHlwZW9mKHJlc3VsdFtrZXldKSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlXG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShyZXN1bHRba2V5XSkpIHtcbiAgICAgICAgICByZXN1bHRba2V5XS5wdXNoKHZhbHVlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gWyByZXN1bHRba2V5XSwgdmFsdWUgXVxuICAgICAgICB9XG4gICAgICB9XG4gIClcblxuICByZXR1cm4gcmVzdWx0XG59IiwiKGZ1bmN0aW9uIChwcm9jZXNzKXtcbi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyByZXNvbHZlcyAuIGFuZCAuLiBlbGVtZW50cyBpbiBhIHBhdGggYXJyYXkgd2l0aCBkaXJlY3RvcnkgbmFtZXMgdGhlcmVcbi8vIG11c3QgYmUgbm8gc2xhc2hlcywgZW1wdHkgZWxlbWVudHMsIG9yIGRldmljZSBuYW1lcyAoYzpcXCkgaW4gdGhlIGFycmF5XG4vLyAoc28gYWxzbyBubyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzIC0gaXQgZG9lcyBub3QgZGlzdGluZ3Vpc2hcbi8vIHJlbGF0aXZlIGFuZCBhYnNvbHV0ZSBwYXRocylcbmZ1bmN0aW9uIG5vcm1hbGl6ZUFycmF5KHBhcnRzLCBhbGxvd0Fib3ZlUm9vdCkge1xuICAvLyBpZiB0aGUgcGF0aCB0cmllcyB0byBnbyBhYm92ZSB0aGUgcm9vdCwgYHVwYCBlbmRzIHVwID4gMFxuICB2YXIgdXAgPSAwO1xuICBmb3IgKHZhciBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgbGFzdCA9IHBhcnRzW2ldO1xuICAgIGlmIChsYXN0ID09PSAnLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKGxhc3QgPT09ICcuLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgIHVwKys7XG4gICAgfSBlbHNlIGlmICh1cCkge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgdXAtLTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgcGF0aCBpcyBhbGxvd2VkIHRvIGdvIGFib3ZlIHRoZSByb290LCByZXN0b3JlIGxlYWRpbmcgLi5zXG4gIGlmIChhbGxvd0Fib3ZlUm9vdCkge1xuICAgIGZvciAoOyB1cC0tOyB1cCkge1xuICAgICAgcGFydHMudW5zaGlmdCgnLi4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFydHM7XG59XG5cbi8vIFNwbGl0IGEgZmlsZW5hbWUgaW50byBbcm9vdCwgZGlyLCBiYXNlbmFtZSwgZXh0XSwgdW5peCB2ZXJzaW9uXG4vLyAncm9vdCcgaXMganVzdCBhIHNsYXNoLCBvciBub3RoaW5nLlxudmFyIHNwbGl0UGF0aFJlID1cbiAgICAvXihcXC8/fCkoW1xcc1xcU10qPykoKD86XFwuezEsMn18W15cXC9dKz98KShcXC5bXi5cXC9dKnwpKSg/OltcXC9dKikkLztcbnZhciBzcGxpdFBhdGggPSBmdW5jdGlvbihmaWxlbmFtZSkge1xuICByZXR1cm4gc3BsaXRQYXRoUmUuZXhlYyhmaWxlbmFtZSkuc2xpY2UoMSk7XG59O1xuXG4vLyBwYXRoLnJlc29sdmUoW2Zyb20gLi4uXSwgdG8pXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLnJlc29sdmUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHJlc29sdmVkUGF0aCA9ICcnLFxuICAgICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IGZhbHNlO1xuXG4gIGZvciAodmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsgaSA+PSAtMSAmJiAhcmVzb2x2ZWRBYnNvbHV0ZTsgaS0tKSB7XG4gICAgdmFyIHBhdGggPSAoaSA+PSAwKSA/IGFyZ3VtZW50c1tpXSA6IHByb2Nlc3MuY3dkKCk7XG5cbiAgICAvLyBTa2lwIGVtcHR5IGFuZCBpbnZhbGlkIGVudHJpZXNcbiAgICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5yZXNvbHZlIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH0gZWxzZSBpZiAoIXBhdGgpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJlc29sdmVkUGF0aCA9IHBhdGggKyAnLycgKyByZXNvbHZlZFBhdGg7XG4gICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IHBhdGguY2hhckF0KDApID09PSAnLyc7XG4gIH1cblxuICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwYXRoIHNob3VsZCBiZSByZXNvbHZlZCB0byBhIGZ1bGwgYWJzb2x1dGUgcGF0aCwgYnV0XG4gIC8vIGhhbmRsZSByZWxhdGl2ZSBwYXRocyB0byBiZSBzYWZlIChtaWdodCBoYXBwZW4gd2hlbiBwcm9jZXNzLmN3ZCgpIGZhaWxzKVxuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICByZXNvbHZlZFBhdGggPSBub3JtYWxpemVBcnJheShmaWx0ZXIocmVzb2x2ZWRQYXRoLnNwbGl0KCcvJyksIGZ1bmN0aW9uKHApIHtcbiAgICByZXR1cm4gISFwO1xuICB9KSwgIXJlc29sdmVkQWJzb2x1dGUpLmpvaW4oJy8nKTtcblxuICByZXR1cm4gKChyZXNvbHZlZEFic29sdXRlID8gJy8nIDogJycpICsgcmVzb2x2ZWRQYXRoKSB8fCAnLic7XG59O1xuXG4vLyBwYXRoLm5vcm1hbGl6ZShwYXRoKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5ub3JtYWxpemUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHZhciBpc0Fic29sdXRlID0gZXhwb3J0cy5pc0Fic29sdXRlKHBhdGgpLFxuICAgICAgdHJhaWxpbmdTbGFzaCA9IHN1YnN0cihwYXRoLCAtMSkgPT09ICcvJztcblxuICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcbiAgcGF0aCA9IG5vcm1hbGl6ZUFycmF5KGZpbHRlcihwYXRoLnNwbGl0KCcvJyksIGZ1bmN0aW9uKHApIHtcbiAgICByZXR1cm4gISFwO1xuICB9KSwgIWlzQWJzb2x1dGUpLmpvaW4oJy8nKTtcblxuICBpZiAoIXBhdGggJiYgIWlzQWJzb2x1dGUpIHtcbiAgICBwYXRoID0gJy4nO1xuICB9XG4gIGlmIChwYXRoICYmIHRyYWlsaW5nU2xhc2gpIHtcbiAgICBwYXRoICs9ICcvJztcbiAgfVxuXG4gIHJldHVybiAoaXNBYnNvbHV0ZSA/ICcvJyA6ICcnKSArIHBhdGg7XG59O1xuXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLmlzQWJzb2x1dGUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHJldHVybiBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nO1xufTtcblxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5qb2luID0gZnVuY3Rpb24oKSB7XG4gIHZhciBwYXRocyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG4gIHJldHVybiBleHBvcnRzLm5vcm1hbGl6ZShmaWx0ZXIocGF0aHMsIGZ1bmN0aW9uKHAsIGluZGV4KSB7XG4gICAgaWYgKHR5cGVvZiBwICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIHRvIHBhdGguam9pbiBtdXN0IGJlIHN0cmluZ3MnKTtcbiAgICB9XG4gICAgcmV0dXJuIHA7XG4gIH0pLmpvaW4oJy8nKSk7XG59O1xuXG5cbi8vIHBhdGgucmVsYXRpdmUoZnJvbSwgdG8pXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLnJlbGF0aXZlID0gZnVuY3Rpb24oZnJvbSwgdG8pIHtcbiAgZnJvbSA9IGV4cG9ydHMucmVzb2x2ZShmcm9tKS5zdWJzdHIoMSk7XG4gIHRvID0gZXhwb3J0cy5yZXNvbHZlKHRvKS5zdWJzdHIoMSk7XG5cbiAgZnVuY3Rpb24gdHJpbShhcnIpIHtcbiAgICB2YXIgc3RhcnQgPSAwO1xuICAgIGZvciAoOyBzdGFydCA8IGFyci5sZW5ndGg7IHN0YXJ0KyspIHtcbiAgICAgIGlmIChhcnJbc3RhcnRdICE9PSAnJykgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGVuZCA9IGFyci5sZW5ndGggLSAxO1xuICAgIGZvciAoOyBlbmQgPj0gMDsgZW5kLS0pIHtcbiAgICAgIGlmIChhcnJbZW5kXSAhPT0gJycpIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA+IGVuZCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBhcnIuc2xpY2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7XG4gIH1cblxuICB2YXIgZnJvbVBhcnRzID0gdHJpbShmcm9tLnNwbGl0KCcvJykpO1xuICB2YXIgdG9QYXJ0cyA9IHRyaW0odG8uc3BsaXQoJy8nKSk7XG5cbiAgdmFyIGxlbmd0aCA9IE1hdGgubWluKGZyb21QYXJ0cy5sZW5ndGgsIHRvUGFydHMubGVuZ3RoKTtcbiAgdmFyIHNhbWVQYXJ0c0xlbmd0aCA9IGxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmIChmcm9tUGFydHNbaV0gIT09IHRvUGFydHNbaV0pIHtcbiAgICAgIHNhbWVQYXJ0c0xlbmd0aCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgb3V0cHV0UGFydHMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IHNhbWVQYXJ0c0xlbmd0aDsgaSA8IGZyb21QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgIG91dHB1dFBhcnRzLnB1c2goJy4uJyk7XG4gIH1cblxuICBvdXRwdXRQYXJ0cyA9IG91dHB1dFBhcnRzLmNvbmNhdCh0b1BhcnRzLnNsaWNlKHNhbWVQYXJ0c0xlbmd0aCkpO1xuXG4gIHJldHVybiBvdXRwdXRQYXJ0cy5qb2luKCcvJyk7XG59O1xuXG5leHBvcnRzLnNlcCA9ICcvJztcbmV4cG9ydHMuZGVsaW1pdGVyID0gJzonO1xuXG5leHBvcnRzLmRpcm5hbWUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHZhciByZXN1bHQgPSBzcGxpdFBhdGgocGF0aCksXG4gICAgICByb290ID0gcmVzdWx0WzBdLFxuICAgICAgZGlyID0gcmVzdWx0WzFdO1xuXG4gIGlmICghcm9vdCAmJiAhZGlyKSB7XG4gICAgLy8gTm8gZGlybmFtZSB3aGF0c29ldmVyXG4gICAgcmV0dXJuICcuJztcbiAgfVxuXG4gIGlmIChkaXIpIHtcbiAgICAvLyBJdCBoYXMgYSBkaXJuYW1lLCBzdHJpcCB0cmFpbGluZyBzbGFzaFxuICAgIGRpciA9IGRpci5zdWJzdHIoMCwgZGlyLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgcmV0dXJuIHJvb3QgKyBkaXI7XG59O1xuXG5cbmV4cG9ydHMuYmFzZW5hbWUgPSBmdW5jdGlvbihwYXRoLCBleHQpIHtcbiAgdmFyIGYgPSBzcGxpdFBhdGgocGF0aClbMl07XG4gIC8vIFRPRE86IG1ha2UgdGhpcyBjb21wYXJpc29uIGNhc2UtaW5zZW5zaXRpdmUgb24gd2luZG93cz9cbiAgaWYgKGV4dCAmJiBmLnN1YnN0cigtMSAqIGV4dC5sZW5ndGgpID09PSBleHQpIHtcbiAgICBmID0gZi5zdWJzdHIoMCwgZi5sZW5ndGggLSBleHQubGVuZ3RoKTtcbiAgfVxuICByZXR1cm4gZjtcbn07XG5cblxuZXhwb3J0cy5leHRuYW1lID0gZnVuY3Rpb24ocGF0aCkge1xuICByZXR1cm4gc3BsaXRQYXRoKHBhdGgpWzNdO1xufTtcblxuZnVuY3Rpb24gZmlsdGVyICh4cywgZikge1xuICAgIGlmICh4cy5maWx0ZXIpIHJldHVybiB4cy5maWx0ZXIoZik7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGYoeHNbaV0sIGksIHhzKSkgcmVzLnB1c2goeHNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuXG4vLyBTdHJpbmcucHJvdG90eXBlLnN1YnN0ciAtIG5lZ2F0aXZlIGluZGV4IGRvbid0IHdvcmsgaW4gSUU4XG52YXIgc3Vic3RyID0gJ2FiJy5zdWJzdHIoLTEpID09PSAnYidcbiAgICA/IGZ1bmN0aW9uIChzdHIsIHN0YXJ0LCBsZW4pIHsgcmV0dXJuIHN0ci5zdWJzdHIoc3RhcnQsIGxlbikgfVxuICAgIDogZnVuY3Rpb24gKHN0ciwgc3RhcnQsIGxlbikge1xuICAgICAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IHN0ci5sZW5ndGggKyBzdGFydDtcbiAgICAgICAgcmV0dXJuIHN0ci5zdWJzdHIoc3RhcnQsIGxlbik7XG4gICAgfVxuO1xuXG59KS5jYWxsKHRoaXMscmVxdWlyZSgnX3Byb2Nlc3MnKSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDI1dlpHVmZiVzlrZFd4bGN5OXdZWFJvTFdKeWIzZHpaWEpwWm5rdmFXNWtaWGd1YW5NaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWp0QlFVRkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVNJc0ltWnBiR1VpT2lKblpXNWxjbUYwWldRdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lMeThnUTI5d2VYSnBaMmgwSUVwdmVXVnVkQ3dnU1c1akxpQmhibVFnYjNSb1pYSWdUbTlrWlNCamIyNTBjbWxpZFhSdmNuTXVYRzR2TDF4dUx5OGdVR1Z5YldsemMybHZiaUJwY3lCb1pYSmxZbmtnWjNKaGJuUmxaQ3dnWm5KbFpTQnZaaUJqYUdGeVoyVXNJSFJ2SUdGdWVTQndaWEp6YjI0Z2IySjBZV2x1YVc1bklHRmNiaTh2SUdOdmNIa2diMllnZEdocGN5QnpiMlowZDJGeVpTQmhibVFnWVhOemIyTnBZWFJsWkNCa2IyTjFiV1Z1ZEdGMGFXOXVJR1pwYkdWeklDaDBhR1ZjYmk4dklGd2lVMjltZEhkaGNtVmNJaWtzSUhSdklHUmxZV3dnYVc0Z2RHaGxJRk52Wm5SM1lYSmxJSGRwZEdodmRYUWdjbVZ6ZEhKcFkzUnBiMjRzSUdsdVkyeDFaR2x1WjF4dUx5OGdkMmwwYUc5MWRDQnNhVzFwZEdGMGFXOXVJSFJvWlNCeWFXZG9kSE1nZEc4Z2RYTmxMQ0JqYjNCNUxDQnRiMlJwWm5rc0lHMWxjbWRsTENCd2RXSnNhWE5vTEZ4dUx5OGdaR2x6ZEhKcFluVjBaU3dnYzNWaWJHbGpaVzV6WlN3Z1lXNWtMMjl5SUhObGJHd2dZMjl3YVdWeklHOW1JSFJvWlNCVGIyWjBkMkZ5WlN3Z1lXNWtJSFJ2SUhCbGNtMXBkRnh1THk4Z2NHVnljMjl1Y3lCMGJ5QjNhRzl0SUhSb1pTQlRiMlowZDJGeVpTQnBjeUJtZFhKdWFYTm9aV1FnZEc4Z1pHOGdjMjhzSUhOMVltcGxZM1FnZEc4Z2RHaGxYRzR2THlCbWIyeHNiM2RwYm1jZ1kyOXVaR2wwYVc5dWN6cGNiaTh2WEc0dkx5QlVhR1VnWVdKdmRtVWdZMjl3ZVhKcFoyaDBJRzV2ZEdsalpTQmhibVFnZEdocGN5QndaWEp0YVhOemFXOXVJRzV2ZEdsalpTQnphR0ZzYkNCaVpTQnBibU5zZFdSbFpGeHVMeThnYVc0Z1lXeHNJR052Y0dsbGN5QnZjaUJ6ZFdKemRHRnVkR2xoYkNCd2IzSjBhVzl1Y3lCdlppQjBhR1VnVTI5bWRIZGhjbVV1WEc0dkwxeHVMeThnVkVoRklGTlBSbFJYUVZKRklFbFRJRkJTVDFaSlJFVkVJRndpUVZNZ1NWTmNJaXdnVjBsVVNFOVZWQ0JYUVZKU1FVNVVXU0JQUmlCQlRsa2dTMGxPUkN3Z1JWaFFVa1ZUVTF4dUx5OGdUMUlnU1UxUVRFbEZSQ3dnU1U1RFRGVkVTVTVISUVKVlZDQk9UMVFnVEVsTlNWUkZSQ0JVVHlCVVNFVWdWMEZTVWtGT1ZFbEZVeUJQUmx4dUx5OGdUVVZTUTBoQlRsUkJRa2xNU1ZSWkxDQkdTVlJPUlZOVElFWlBVaUJCSUZCQlVsUkpRMVZNUVZJZ1VGVlNVRTlUUlNCQlRrUWdUazlPU1U1R1VrbE9SMFZOUlU1VUxpQkpUbHh1THk4Z1RrOGdSVlpGVGxRZ1UwaEJURXdnVkVoRklFRlZWRWhQVWxNZ1QxSWdRMDlRV1ZKSlIwaFVJRWhQVEVSRlVsTWdRa1VnVEVsQlFreEZJRVpQVWlCQlRsa2dRMHhCU1Uwc1hHNHZMeUJFUVUxQlIwVlRJRTlTSUU5VVNFVlNJRXhKUVVKSlRFbFVXU3dnVjBoRlZFaEZVaUJKVGlCQlRpQkJRMVJKVDA0Z1QwWWdRMDlPVkZKQlExUXNJRlJQVWxRZ1QxSmNiaTh2SUU5VVNFVlNWMGxUUlN3Z1FWSkpVMGxPUnlCR1VrOU5MQ0JQVlZRZ1QwWWdUMUlnU1U0Z1EwOU9Ua1ZEVkVsUFRpQlhTVlJJSUZSSVJTQlRUMFpVVjBGU1JTQlBVaUJVU0VWY2JpOHZJRlZUUlNCUFVpQlBWRWhGVWlCRVJVRk1TVTVIVXlCSlRpQlVTRVVnVTA5R1ZGZEJVa1V1WEc1Y2JpOHZJSEpsYzI5c2RtVnpJQzRnWVc1a0lDNHVJR1ZzWlcxbGJuUnpJR2x1SUdFZ2NHRjBhQ0JoY25KaGVTQjNhWFJvSUdScGNtVmpkRzl5ZVNCdVlXMWxjeUIwYUdWeVpWeHVMeThnYlhWemRDQmlaU0J1YnlCemJHRnphR1Z6TENCbGJYQjBlU0JsYkdWdFpXNTBjeXdnYjNJZ1pHVjJhV05sSUc1aGJXVnpJQ2hqT2x4Y0tTQnBiaUIwYUdVZ1lYSnlZWGxjYmk4dklDaHpieUJoYkhOdklHNXZJR3hsWVdScGJtY2dZVzVrSUhSeVlXbHNhVzVuSUhOc1lYTm9aWE1nTFNCcGRDQmtiMlZ6SUc1dmRDQmthWE4wYVc1bmRXbHphRnh1THk4Z2NtVnNZWFJwZG1VZ1lXNWtJR0ZpYzI5c2RYUmxJSEJoZEdoektWeHVablZ1WTNScGIyNGdibTl5YldGc2FYcGxRWEp5WVhrb2NHRnlkSE1zSUdGc2JHOTNRV0p2ZG1WU2IyOTBLU0I3WEc0Z0lDOHZJR2xtSUhSb1pTQndZWFJvSUhSeWFXVnpJSFJ2SUdkdklHRmliM1psSUhSb1pTQnliMjkwTENCZ2RYQmdJR1Z1WkhNZ2RYQWdQaUF3WEc0Z0lIWmhjaUIxY0NBOUlEQTdYRzRnSUdadmNpQW9kbUZ5SUdrZ1BTQndZWEowY3k1c1pXNW5kR2dnTFNBeE95QnBJRDQ5SURBN0lHa3RMU2tnZTF4dUlDQWdJSFpoY2lCc1lYTjBJRDBnY0dGeWRITmJhVjA3WEc0Z0lDQWdhV1lnS0d4aGMzUWdQVDA5SUNjdUp5a2dlMXh1SUNBZ0lDQWdjR0Z5ZEhNdWMzQnNhV05sS0drc0lERXBPMXh1SUNBZ0lIMGdaV3h6WlNCcFppQW9iR0Z6ZENBOVBUMGdKeTR1SnlrZ2UxeHVJQ0FnSUNBZ2NHRnlkSE11YzNCc2FXTmxLR2tzSURFcE8xeHVJQ0FnSUNBZ2RYQXJLenRjYmlBZ0lDQjlJR1ZzYzJVZ2FXWWdLSFZ3S1NCN1hHNGdJQ0FnSUNCd1lYSjBjeTV6Y0d4cFkyVW9hU3dnTVNrN1hHNGdJQ0FnSUNCMWNDMHRPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJQzh2SUdsbUlIUm9aU0J3WVhSb0lHbHpJR0ZzYkc5M1pXUWdkRzhnWjI4Z1lXSnZkbVVnZEdobElISnZiM1FzSUhKbGMzUnZjbVVnYkdWaFpHbHVaeUF1TG5OY2JpQWdhV1lnS0dGc2JHOTNRV0p2ZG1WU2IyOTBLU0I3WEc0Z0lDQWdabTl5SUNnN0lIVndMUzA3SUhWd0tTQjdYRzRnSUNBZ0lDQndZWEowY3k1MWJuTm9hV1owS0NjdUxpY3BPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJSEpsZEhWeWJpQndZWEowY3p0Y2JuMWNibHh1THk4Z1UzQnNhWFFnWVNCbWFXeGxibUZ0WlNCcGJuUnZJRnR5YjI5MExDQmthWElzSUdKaGMyVnVZVzFsTENCbGVIUmRMQ0IxYm1sNElIWmxjbk5wYjI1Y2JpOHZJQ2R5YjI5MEp5QnBjeUJxZFhOMElHRWdjMnhoYzJnc0lHOXlJRzV2ZEdocGJtY3VYRzUyWVhJZ2MzQnNhWFJRWVhSb1VtVWdQVnh1SUNBZ0lDOWVLRnhjTHo5OEtTaGJYRnh6WEZ4VFhTby9LU2dvUHpwY1hDNTdNU3d5Zlh4YlhseGNMMTByUDN3cEtGeGNMbHRlTGx4Y0wxMHFmQ2twS0Q4NlcxeGNMMTBxS1NRdk8xeHVkbUZ5SUhOd2JHbDBVR0YwYUNBOUlHWjFibU4wYVc5dUtHWnBiR1Z1WVcxbEtTQjdYRzRnSUhKbGRIVnliaUJ6Y0d4cGRGQmhkR2hTWlM1bGVHVmpLR1pwYkdWdVlXMWxLUzV6YkdsalpTZ3hLVHRjYm4wN1hHNWNiaTh2SUhCaGRHZ3VjbVZ6YjJ4MlpTaGJabkp2YlNBdUxpNWRMQ0IwYnlsY2JpOHZJSEJ2YzJsNElIWmxjbk5wYjI1Y2JtVjRjRzl5ZEhNdWNtVnpiMngyWlNBOUlHWjFibU4wYVc5dUtDa2dlMXh1SUNCMllYSWdjbVZ6YjJ4MlpXUlFZWFJvSUQwZ0p5Y3NYRzRnSUNBZ0lDQnlaWE52YkhabFpFRmljMjlzZFhSbElEMGdabUZzYzJVN1hHNWNiaUFnWm05eUlDaDJZWElnYVNBOUlHRnlaM1Z0Wlc1MGN5NXNaVzVuZEdnZ0xTQXhPeUJwSUQ0OUlDMHhJQ1ltSUNGeVpYTnZiSFpsWkVGaWMyOXNkWFJsT3lCcExTMHBJSHRjYmlBZ0lDQjJZWElnY0dGMGFDQTlJQ2hwSUQ0OUlEQXBJRDhnWVhKbmRXMWxiblJ6VzJsZElEb2djSEp2WTJWemN5NWpkMlFvS1R0Y2JseHVJQ0FnSUM4dklGTnJhWEFnWlcxd2RIa2dZVzVrSUdsdWRtRnNhV1FnWlc1MGNtbGxjMXh1SUNBZ0lHbG1JQ2gwZVhCbGIyWWdjR0YwYUNBaFBUMGdKM04wY21sdVp5Y3BJSHRjYmlBZ0lDQWdJSFJvY205M0lHNWxkeUJVZVhCbFJYSnliM0lvSjBGeVozVnRaVzUwY3lCMGJ5QndZWFJvTG5KbGMyOXNkbVVnYlhWemRDQmlaU0J6ZEhKcGJtZHpKeWs3WEc0Z0lDQWdmU0JsYkhObElHbG1JQ2doY0dGMGFDa2dlMXh1SUNBZ0lDQWdZMjl1ZEdsdWRXVTdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2NtVnpiMngyWldSUVlYUm9JRDBnY0dGMGFDQXJJQ2N2SnlBcklISmxjMjlzZG1Wa1VHRjBhRHRjYmlBZ0lDQnlaWE52YkhabFpFRmljMjlzZFhSbElEMGdjR0YwYUM1amFHRnlRWFFvTUNrZ1BUMDlJQ2N2Snp0Y2JpQWdmVnh1WEc0Z0lDOHZJRUYwSUhSb2FYTWdjRzlwYm5RZ2RHaGxJSEJoZEdnZ2MyaHZkV3hrSUdKbElISmxjMjlzZG1Wa0lIUnZJR0VnWm5Wc2JDQmhZbk52YkhWMFpTQndZWFJvTENCaWRYUmNiaUFnTHk4Z2FHRnVaR3hsSUhKbGJHRjBhWFpsSUhCaGRHaHpJSFJ2SUdKbElITmhabVVnS0cxcFoyaDBJR2hoY0hCbGJpQjNhR1Z1SUhCeWIyTmxjM011WTNka0tDa2dabUZwYkhNcFhHNWNiaUFnTHk4Z1RtOXliV0ZzYVhwbElIUm9aU0J3WVhSb1hHNGdJSEpsYzI5c2RtVmtVR0YwYUNBOUlHNXZjbTFoYkdsNlpVRnljbUY1S0dacGJIUmxjaWh5WlhOdmJIWmxaRkJoZEdndWMzQnNhWFFvSnk4bktTd2dablZ1WTNScGIyNG9jQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQWhJWEE3WEc0Z0lIMHBMQ0FoY21WemIyeDJaV1JCWW5OdmJIVjBaU2t1YW05cGJpZ25MeWNwTzF4dVhHNGdJSEpsZEhWeWJpQW9LSEpsYzI5c2RtVmtRV0p6YjJ4MWRHVWdQeUFuTHljZ09pQW5KeWtnS3lCeVpYTnZiSFpsWkZCaGRHZ3BJSHg4SUNjdUp6dGNibjA3WEc1Y2JpOHZJSEJoZEdndWJtOXliV0ZzYVhwbEtIQmhkR2dwWEc0dkx5QndiM05wZUNCMlpYSnphVzl1WEc1bGVIQnZjblJ6TG01dmNtMWhiR2w2WlNBOUlHWjFibU4wYVc5dUtIQmhkR2dwSUh0Y2JpQWdkbUZ5SUdselFXSnpiMngxZEdVZ1BTQmxlSEJ2Y25SekxtbHpRV0p6YjJ4MWRHVW9jR0YwYUNrc1hHNGdJQ0FnSUNCMGNtRnBiR2x1WjFOc1lYTm9JRDBnYzNWaWMzUnlLSEJoZEdnc0lDMHhLU0E5UFQwZ0p5OG5PMXh1WEc0Z0lDOHZJRTV2Y20xaGJHbDZaU0IwYUdVZ2NHRjBhRnh1SUNCd1lYUm9JRDBnYm05eWJXRnNhWHBsUVhKeVlYa29abWxzZEdWeUtIQmhkR2d1YzNCc2FYUW9KeThuS1N3Z1puVnVZM1JwYjI0b2NDa2dlMXh1SUNBZ0lISmxkSFZ5YmlBaElYQTdYRzRnSUgwcExDQWhhWE5CWW5OdmJIVjBaU2t1YW05cGJpZ25MeWNwTzF4dVhHNGdJR2xtSUNnaGNHRjBhQ0FtSmlBaGFYTkJZbk52YkhWMFpTa2dlMXh1SUNBZ0lIQmhkR2dnUFNBbkxpYzdYRzRnSUgxY2JpQWdhV1lnS0hCaGRHZ2dKaVlnZEhKaGFXeHBibWRUYkdGemFDa2dlMXh1SUNBZ0lIQmhkR2dnS3owZ0p5OG5PMXh1SUNCOVhHNWNiaUFnY21WMGRYSnVJQ2hwYzBGaWMyOXNkWFJsSUQ4Z0p5OG5JRG9nSnljcElDc2djR0YwYUR0Y2JuMDdYRzVjYmk4dklIQnZjMmw0SUhabGNuTnBiMjVjYm1WNGNHOXlkSE11YVhOQlluTnZiSFYwWlNBOUlHWjFibU4wYVc5dUtIQmhkR2dwSUh0Y2JpQWdjbVYwZFhKdUlIQmhkR2d1WTJoaGNrRjBLREFwSUQwOVBTQW5MeWM3WEc1OU8xeHVYRzR2THlCd2IzTnBlQ0IyWlhKemFXOXVYRzVsZUhCdmNuUnpMbXB2YVc0Z1BTQm1kVzVqZEdsdmJpZ3BJSHRjYmlBZ2RtRnlJSEJoZEdoeklEMGdRWEp5WVhrdWNISnZkRzkwZVhCbExuTnNhV05sTG1OaGJHd29ZWEpuZFcxbGJuUnpMQ0F3S1R0Y2JpQWdjbVYwZFhKdUlHVjRjRzl5ZEhNdWJtOXliV0ZzYVhwbEtHWnBiSFJsY2lod1lYUm9jeXdnWm5WdVkzUnBiMjRvY0N3Z2FXNWtaWGdwSUh0Y2JpQWdJQ0JwWmlBb2RIbHdaVzltSUhBZ0lUMDlJQ2R6ZEhKcGJtY25LU0I3WEc0Z0lDQWdJQ0IwYUhKdmR5QnVaWGNnVkhsd1pVVnljbTl5S0NkQmNtZDFiV1Z1ZEhNZ2RHOGdjR0YwYUM1cWIybHVJRzExYzNRZ1ltVWdjM1J5YVc1bmN5Y3BPMXh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnY0R0Y2JpQWdmU2t1YW05cGJpZ25MeWNwS1R0Y2JuMDdYRzVjYmx4dUx5OGdjR0YwYUM1eVpXeGhkR2wyWlNobWNtOXRMQ0IwYnlsY2JpOHZJSEJ2YzJsNElIWmxjbk5wYjI1Y2JtVjRjRzl5ZEhNdWNtVnNZWFJwZG1VZ1BTQm1kVzVqZEdsdmJpaG1jbTl0TENCMGJ5a2dlMXh1SUNCbWNtOXRJRDBnWlhod2IzSjBjeTV5WlhOdmJIWmxLR1p5YjIwcExuTjFZbk4wY2lneEtUdGNiaUFnZEc4Z1BTQmxlSEJ2Y25SekxuSmxjMjlzZG1Vb2RHOHBMbk4xWW5OMGNpZ3hLVHRjYmx4dUlDQm1kVzVqZEdsdmJpQjBjbWx0S0dGeWNpa2dlMXh1SUNBZ0lIWmhjaUJ6ZEdGeWRDQTlJREE3WEc0Z0lDQWdabTl5SUNnN0lITjBZWEowSUR3Z1lYSnlMbXhsYm1kMGFEc2djM1JoY25Rckt5a2dlMXh1SUNBZ0lDQWdhV1lnS0dGeWNsdHpkR0Z5ZEYwZ0lUMDlJQ2NuS1NCaWNtVmhhenRjYmlBZ0lDQjlYRzVjYmlBZ0lDQjJZWElnWlc1a0lEMGdZWEp5TG14bGJtZDBhQ0F0SURFN1hHNGdJQ0FnWm05eUlDZzdJR1Z1WkNBK1BTQXdPeUJsYm1RdExTa2dlMXh1SUNBZ0lDQWdhV1lnS0dGeWNsdGxibVJkSUNFOVBTQW5KeWtnWW5KbFlXczdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2FXWWdLSE4wWVhKMElENGdaVzVrS1NCeVpYUjFjbTRnVzEwN1hHNGdJQ0FnY21WMGRYSnVJR0Z5Y2k1emJHbGpaU2h6ZEdGeWRDd2daVzVrSUMwZ2MzUmhjblFnS3lBeEtUdGNiaUFnZlZ4dVhHNGdJSFpoY2lCbWNtOXRVR0Z5ZEhNZ1BTQjBjbWx0S0daeWIyMHVjM0JzYVhRb0p5OG5LU2s3WEc0Z0lIWmhjaUIwYjFCaGNuUnpJRDBnZEhKcGJTaDBieTV6Y0d4cGRDZ25MeWNwS1R0Y2JseHVJQ0IyWVhJZ2JHVnVaM1JvSUQwZ1RXRjBhQzV0YVc0b1puSnZiVkJoY25SekxteGxibWQwYUN3Z2RHOVFZWEowY3k1c1pXNW5kR2dwTzF4dUlDQjJZWElnYzJGdFpWQmhjblJ6VEdWdVozUm9JRDBnYkdWdVozUm9PMXh1SUNCbWIzSWdLSFpoY2lCcElEMGdNRHNnYVNBOElHeGxibWQwYURzZ2FTc3JLU0I3WEc0Z0lDQWdhV1lnS0daeWIyMVFZWEowYzF0cFhTQWhQVDBnZEc5UVlYSjBjMXRwWFNrZ2UxeHVJQ0FnSUNBZ2MyRnRaVkJoY25SelRHVnVaM1JvSUQwZ2FUdGNiaUFnSUNBZ0lHSnlaV0ZyTzF4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUhaaGNpQnZkWFJ3ZFhSUVlYSjBjeUE5SUZ0ZE8xeHVJQ0JtYjNJZ0tIWmhjaUJwSUQwZ2MyRnRaVkJoY25SelRHVnVaM1JvT3lCcElEd2dabkp2YlZCaGNuUnpMbXhsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnYjNWMGNIVjBVR0Z5ZEhNdWNIVnphQ2duTGk0bktUdGNiaUFnZlZ4dVhHNGdJRzkxZEhCMWRGQmhjblJ6SUQwZ2IzVjBjSFYwVUdGeWRITXVZMjl1WTJGMEtIUnZVR0Z5ZEhNdWMyeHBZMlVvYzJGdFpWQmhjblJ6VEdWdVozUm9LU2s3WEc1Y2JpQWdjbVYwZFhKdUlHOTFkSEIxZEZCaGNuUnpMbXB2YVc0b0p5OG5LVHRjYm4wN1hHNWNibVY0Y0c5eWRITXVjMlZ3SUQwZ0p5OG5PMXh1Wlhod2IzSjBjeTVrWld4cGJXbDBaWElnUFNBbk9pYzdYRzVjYm1WNGNHOXlkSE11WkdseWJtRnRaU0E5SUdaMWJtTjBhVzl1S0hCaGRHZ3BJSHRjYmlBZ2RtRnlJSEpsYzNWc2RDQTlJSE53YkdsMFVHRjBhQ2h3WVhSb0tTeGNiaUFnSUNBZ0lISnZiM1FnUFNCeVpYTjFiSFJiTUYwc1hHNGdJQ0FnSUNCa2FYSWdQU0J5WlhOMWJIUmJNVjA3WEc1Y2JpQWdhV1lnS0NGeWIyOTBJQ1ltSUNGa2FYSXBJSHRjYmlBZ0lDQXZMeUJPYnlCa2FYSnVZVzFsSUhkb1lYUnpiMlYyWlhKY2JpQWdJQ0J5WlhSMWNtNGdKeTRuTzF4dUlDQjlYRzVjYmlBZ2FXWWdLR1JwY2lrZ2UxeHVJQ0FnSUM4dklFbDBJR2hoY3lCaElHUnBjbTVoYldVc0lITjBjbWx3SUhSeVlXbHNhVzVuSUhOc1lYTm9YRzRnSUNBZ1pHbHlJRDBnWkdseUxuTjFZbk4wY2lnd0xDQmthWEl1YkdWdVozUm9JQzBnTVNrN1hHNGdJSDFjYmx4dUlDQnlaWFIxY200Z2NtOXZkQ0FySUdScGNqdGNibjA3WEc1Y2JseHVaWGh3YjNKMGN5NWlZWE5sYm1GdFpTQTlJR1oxYm1OMGFXOXVLSEJoZEdnc0lHVjRkQ2tnZTF4dUlDQjJZWElnWmlBOUlITndiR2wwVUdGMGFDaHdZWFJvS1ZzeVhUdGNiaUFnTHk4Z1ZFOUVUem9nYldGclpTQjBhR2x6SUdOdmJYQmhjbWx6YjI0Z1kyRnpaUzFwYm5ObGJuTnBkR2wyWlNCdmJpQjNhVzVrYjNkelAxeHVJQ0JwWmlBb1pYaDBJQ1ltSUdZdWMzVmljM1J5S0MweElDb2daWGgwTG14bGJtZDBhQ2tnUFQwOUlHVjRkQ2tnZTF4dUlDQWdJR1lnUFNCbUxuTjFZbk4wY2lnd0xDQm1MbXhsYm1kMGFDQXRJR1Y0ZEM1c1pXNW5kR2dwTzF4dUlDQjlYRzRnSUhKbGRIVnliaUJtTzF4dWZUdGNibHh1WEc1bGVIQnZjblJ6TG1WNGRHNWhiV1VnUFNCbWRXNWpkR2x2Ymlod1lYUm9LU0I3WEc0Z0lISmxkSFZ5YmlCemNHeHBkRkJoZEdnb2NHRjBhQ2xiTTEwN1hHNTlPMXh1WEc1bWRXNWpkR2x2YmlCbWFXeDBaWElnS0hoekxDQm1LU0I3WEc0Z0lDQWdhV1lnS0hoekxtWnBiSFJsY2lrZ2NtVjBkWEp1SUhoekxtWnBiSFJsY2lobUtUdGNiaUFnSUNCMllYSWdjbVZ6SUQwZ1cxMDdYRzRnSUNBZ1ptOXlJQ2gyWVhJZ2FTQTlJREE3SUdrZ1BDQjRjeTVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvWmloNGMxdHBYU3dnYVN3Z2VITXBLU0J5WlhNdWNIVnphQ2g0YzF0cFhTazdYRzRnSUNBZ2ZWeHVJQ0FnSUhKbGRIVnliaUJ5WlhNN1hHNTlYRzVjYmk4dklGTjBjbWx1Wnk1d2NtOTBiM1I1Y0dVdWMzVmljM1J5SUMwZ2JtVm5ZWFJwZG1VZ2FXNWtaWGdnWkc5dUozUWdkMjl5YXlCcGJpQkpSVGhjYm5aaGNpQnpkV0p6ZEhJZ1BTQW5ZV0luTG5OMVluTjBjaWd0TVNrZ1BUMDlJQ2RpSjF4dUlDQWdJRDhnWm5WdVkzUnBiMjRnS0hOMGNpd2djM1JoY25Rc0lHeGxiaWtnZXlCeVpYUjFjbTRnYzNSeUxuTjFZbk4wY2loemRHRnlkQ3dnYkdWdUtTQjlYRzRnSUNBZ09pQm1kVzVqZEdsdmJpQW9jM1J5TENCemRHRnlkQ3dnYkdWdUtTQjdYRzRnSUNBZ0lDQWdJR2xtSUNoemRHRnlkQ0E4SURBcElITjBZWEowSUQwZ2MzUnlMbXhsYm1kMGFDQXJJSE4wWVhKME8xeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2MzUnlMbk4xWW5OMGNpaHpkR0Z5ZEN3Z2JHVnVLVHRjYmlBZ0lDQjlYRzQ3WEc0aVhYMD0iLCIvKlxuICogQ29weXJpZ2h0IDIwMDktMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0UudHh0IG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5leHBvcnRzLlNvdXJjZU1hcEdlbmVyYXRvciA9IHJlcXVpcmUoJy4vc291cmNlLW1hcC9zb3VyY2UtbWFwLWdlbmVyYXRvcicpLlNvdXJjZU1hcEdlbmVyYXRvcjtcbmV4cG9ydHMuU291cmNlTWFwQ29uc3VtZXIgPSByZXF1aXJlKCcuL3NvdXJjZS1tYXAvc291cmNlLW1hcC1jb25zdW1lcicpLlNvdXJjZU1hcENvbnN1bWVyO1xuZXhwb3J0cy5Tb3VyY2VOb2RlID0gcmVxdWlyZSgnLi9zb3VyY2UtbWFwL3NvdXJjZS1ub2RlJykuU291cmNlTm9kZTtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbmlmICh0eXBlb2YgZGVmaW5lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGRlZmluZSA9IHJlcXVpcmUoJ2FtZGVmaW5lJykobW9kdWxlLCByZXF1aXJlKTtcbn1cbmRlZmluZShmdW5jdGlvbiAocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7XG5cbiAgdmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuICAvKipcbiAgICogQSBkYXRhIHN0cnVjdHVyZSB3aGljaCBpcyBhIGNvbWJpbmF0aW9uIG9mIGFuIGFycmF5IGFuZCBhIHNldC4gQWRkaW5nIGEgbmV3XG4gICAqIG1lbWJlciBpcyBPKDEpLCB0ZXN0aW5nIGZvciBtZW1iZXJzaGlwIGlzIE8oMSksIGFuZCBmaW5kaW5nIHRoZSBpbmRleCBvZiBhblxuICAgKiBlbGVtZW50IGlzIE8oMSkuIFJlbW92aW5nIGVsZW1lbnRzIGZyb20gdGhlIHNldCBpcyBub3Qgc3VwcG9ydGVkLiBPbmx5XG4gICAqIHN0cmluZ3MgYXJlIHN1cHBvcnRlZCBmb3IgbWVtYmVyc2hpcC5cbiAgICovXG4gIGZ1bmN0aW9uIEFycmF5U2V0KCkge1xuICAgIHRoaXMuX2FycmF5ID0gW107XG4gICAgdGhpcy5fc2V0ID0ge307XG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIG1ldGhvZCBmb3IgY3JlYXRpbmcgQXJyYXlTZXQgaW5zdGFuY2VzIGZyb20gYW4gZXhpc3RpbmcgYXJyYXkuXG4gICAqL1xuICBBcnJheVNldC5mcm9tQXJyYXkgPSBmdW5jdGlvbiBBcnJheVNldF9mcm9tQXJyYXkoYUFycmF5LCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gICAgdmFyIHNldCA9IG5ldyBBcnJheVNldCgpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhQXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHNldC5hZGQoYUFycmF5W2ldLCBhQWxsb3dEdXBsaWNhdGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHNldDtcbiAgfTtcblxuICAvKipcbiAgICogQWRkIHRoZSBnaXZlbiBzdHJpbmcgdG8gdGhpcyBzZXQuXG4gICAqXG4gICAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICAgKi9cbiAgQXJyYXlTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIEFycmF5U2V0X2FkZChhU3RyLCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gICAgdmFyIGlzRHVwbGljYXRlID0gdGhpcy5oYXMoYVN0cik7XG4gICAgdmFyIGlkeCA9IHRoaXMuX2FycmF5Lmxlbmd0aDtcbiAgICBpZiAoIWlzRHVwbGljYXRlIHx8IGFBbGxvd0R1cGxpY2F0ZXMpIHtcbiAgICAgIHRoaXMuX2FycmF5LnB1c2goYVN0cik7XG4gICAgfVxuICAgIGlmICghaXNEdXBsaWNhdGUpIHtcbiAgICAgIHRoaXMuX3NldFt1dGlsLnRvU2V0U3RyaW5nKGFTdHIpXSA9IGlkeDtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIElzIHRoZSBnaXZlbiBzdHJpbmcgYSBtZW1iZXIgb2YgdGhpcyBzZXQ/XG4gICAqXG4gICAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICAgKi9cbiAgQXJyYXlTZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIEFycmF5U2V0X2hhcyhhU3RyKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLl9zZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnRvU2V0U3RyaW5nKGFTdHIpKTtcbiAgfTtcblxuICAvKipcbiAgICogV2hhdCBpcyB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIHN0cmluZyBpbiB0aGUgYXJyYXk/XG4gICAqXG4gICAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICAgKi9cbiAgQXJyYXlTZXQucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBBcnJheVNldF9pbmRleE9mKGFTdHIpIHtcbiAgICBpZiAodGhpcy5oYXMoYVN0cikpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXRbdXRpbC50b1NldFN0cmluZyhhU3RyKV07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignXCInICsgYVN0ciArICdcIiBpcyBub3QgaW4gdGhlIHNldC4nKTtcbiAgfTtcblxuICAvKipcbiAgICogV2hhdCBpcyB0aGUgZWxlbWVudCBhdCB0aGUgZ2l2ZW4gaW5kZXg/XG4gICAqXG4gICAqIEBwYXJhbSBOdW1iZXIgYUlkeFxuICAgKi9cbiAgQXJyYXlTZXQucHJvdG90eXBlLmF0ID0gZnVuY3Rpb24gQXJyYXlTZXRfYXQoYUlkeCkge1xuICAgIGlmIChhSWR4ID49IDAgJiYgYUlkeCA8IHRoaXMuX2FycmF5Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2FycmF5W2FJZHhdO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVsZW1lbnQgaW5kZXhlZCBieSAnICsgYUlkeCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2V0ICh3aGljaCBoYXMgdGhlIHByb3BlciBpbmRpY2VzXG4gICAqIGluZGljYXRlZCBieSBpbmRleE9mKS4gTm90ZSB0aGF0IHRoaXMgaXMgYSBjb3B5IG9mIHRoZSBpbnRlcm5hbCBhcnJheSB1c2VkXG4gICAqIGZvciBzdG9yaW5nIHRoZSBtZW1iZXJzIHNvIHRoYXQgbm8gb25lIGNhbiBtZXNzIHdpdGggaW50ZXJuYWwgc3RhdGUuXG4gICAqL1xuICBBcnJheVNldC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uIEFycmF5U2V0X3RvQXJyYXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FycmF5LnNsaWNlKCk7XG4gIH07XG5cbiAgZXhwb3J0cy5BcnJheVNldCA9IEFycmF5U2V0O1xuXG59KTtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKlxuICogQmFzZWQgb24gdGhlIEJhc2UgNjQgVkxRIGltcGxlbWVudGF0aW9uIGluIENsb3N1cmUgQ29tcGlsZXI6XG4gKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nsb3N1cmUtY29tcGlsZXIvc291cmNlL2Jyb3dzZS90cnVuay9zcmMvY29tL2dvb2dsZS9kZWJ1Z2dpbmcvc291cmNlbWFwL0Jhc2U2NFZMUS5qYXZhXG4gKlxuICogQ29weXJpZ2h0IDIwMTEgVGhlIENsb3N1cmUgQ29tcGlsZXIgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZVxuICogbWV0OlxuICpcbiAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlXG4gKiAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuICogICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkXG4gKiAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4gKiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1JcbiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLFxuICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXG4gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcbiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cbmlmICh0eXBlb2YgZGVmaW5lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGRlZmluZSA9IHJlcXVpcmUoJ2FtZGVmaW5lJykobW9kdWxlLCByZXF1aXJlKTtcbn1cbmRlZmluZShmdW5jdGlvbiAocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7XG5cbiAgdmFyIGJhc2U2NCA9IHJlcXVpcmUoJy4vYmFzZTY0Jyk7XG5cbiAgLy8gQSBzaW5nbGUgYmFzZSA2NCBkaWdpdCBjYW4gY29udGFpbiA2IGJpdHMgb2YgZGF0YS4gRm9yIHRoZSBiYXNlIDY0IHZhcmlhYmxlXG4gIC8vIGxlbmd0aCBxdWFudGl0aWVzIHdlIHVzZSBpbiB0aGUgc291cmNlIG1hcCBzcGVjLCB0aGUgZmlyc3QgYml0IGlzIHRoZSBzaWduLFxuICAvLyB0aGUgbmV4dCBmb3VyIGJpdHMgYXJlIHRoZSBhY3R1YWwgdmFsdWUsIGFuZCB0aGUgNnRoIGJpdCBpcyB0aGVcbiAgLy8gY29udGludWF0aW9uIGJpdC4gVGhlIGNvbnRpbnVhdGlvbiBiaXQgdGVsbHMgdXMgd2hldGhlciB0aGVyZSBhcmUgbW9yZVxuICAvLyBkaWdpdHMgaW4gdGhpcyB2YWx1ZSBmb2xsb3dpbmcgdGhpcyBkaWdpdC5cbiAgLy9cbiAgLy8gICBDb250aW51YXRpb25cbiAgLy8gICB8ICAgIFNpZ25cbiAgLy8gICB8ICAgIHxcbiAgLy8gICBWICAgIFZcbiAgLy8gICAxMDEwMTFcblxuICB2YXIgVkxRX0JBU0VfU0hJRlQgPSA1O1xuXG4gIC8vIGJpbmFyeTogMTAwMDAwXG4gIHZhciBWTFFfQkFTRSA9IDEgPDwgVkxRX0JBU0VfU0hJRlQ7XG5cbiAgLy8gYmluYXJ5OiAwMTExMTFcbiAgdmFyIFZMUV9CQVNFX01BU0sgPSBWTFFfQkFTRSAtIDE7XG5cbiAgLy8gYmluYXJ5OiAxMDAwMDBcbiAgdmFyIFZMUV9DT05USU5VQVRJT05fQklUID0gVkxRX0JBU0U7XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGZyb20gYSB0d28tY29tcGxlbWVudCB2YWx1ZSB0byBhIHZhbHVlIHdoZXJlIHRoZSBzaWduIGJpdCBpc1xuICAgKiBwbGFjZWQgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4gIEZvciBleGFtcGxlLCBhcyBkZWNpbWFsczpcbiAgICogICAxIGJlY29tZXMgMiAoMTAgYmluYXJ5KSwgLTEgYmVjb21lcyAzICgxMSBiaW5hcnkpXG4gICAqICAgMiBiZWNvbWVzIDQgKDEwMCBiaW5hcnkpLCAtMiBiZWNvbWVzIDUgKDEwMSBiaW5hcnkpXG4gICAqL1xuICBmdW5jdGlvbiB0b1ZMUVNpZ25lZChhVmFsdWUpIHtcbiAgICByZXR1cm4gYVZhbHVlIDwgMFxuICAgICAgPyAoKC1hVmFsdWUpIDw8IDEpICsgMVxuICAgICAgOiAoYVZhbHVlIDw8IDEpICsgMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0byBhIHR3by1jb21wbGVtZW50IHZhbHVlIGZyb20gYSB2YWx1ZSB3aGVyZSB0aGUgc2lnbiBiaXQgaXNcbiAgICogcGxhY2VkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICBGb3IgZXhhbXBsZSwgYXMgZGVjaW1hbHM6XG4gICAqICAgMiAoMTAgYmluYXJ5KSBiZWNvbWVzIDEsIDMgKDExIGJpbmFyeSkgYmVjb21lcyAtMVxuICAgKiAgIDQgKDEwMCBiaW5hcnkpIGJlY29tZXMgMiwgNSAoMTAxIGJpbmFyeSkgYmVjb21lcyAtMlxuICAgKi9cbiAgZnVuY3Rpb24gZnJvbVZMUVNpZ25lZChhVmFsdWUpIHtcbiAgICB2YXIgaXNOZWdhdGl2ZSA9IChhVmFsdWUgJiAxKSA9PT0gMTtcbiAgICB2YXIgc2hpZnRlZCA9IGFWYWx1ZSA+PiAxO1xuICAgIHJldHVybiBpc05lZ2F0aXZlXG4gICAgICA/IC1zaGlmdGVkXG4gICAgICA6IHNoaWZ0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYmFzZSA2NCBWTFEgZW5jb2RlZCB2YWx1ZS5cbiAgICovXG4gIGV4cG9ydHMuZW5jb2RlID0gZnVuY3Rpb24gYmFzZTY0VkxRX2VuY29kZShhVmFsdWUpIHtcbiAgICB2YXIgZW5jb2RlZCA9IFwiXCI7XG4gICAgdmFyIGRpZ2l0O1xuXG4gICAgdmFyIHZscSA9IHRvVkxRU2lnbmVkKGFWYWx1ZSk7XG5cbiAgICBkbyB7XG4gICAgICBkaWdpdCA9IHZscSAmIFZMUV9CQVNFX01BU0s7XG4gICAgICB2bHEgPj4+PSBWTFFfQkFTRV9TSElGVDtcbiAgICAgIGlmICh2bHEgPiAwKSB7XG4gICAgICAgIC8vIFRoZXJlIGFyZSBzdGlsbCBtb3JlIGRpZ2l0cyBpbiB0aGlzIHZhbHVlLCBzbyB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGVcbiAgICAgICAgLy8gY29udGludWF0aW9uIGJpdCBpcyBtYXJrZWQuXG4gICAgICAgIGRpZ2l0IHw9IFZMUV9DT05USU5VQVRJT05fQklUO1xuICAgICAgfVxuICAgICAgZW5jb2RlZCArPSBiYXNlNjQuZW5jb2RlKGRpZ2l0KTtcbiAgICB9IHdoaWxlICh2bHEgPiAwKTtcblxuICAgIHJldHVybiBlbmNvZGVkO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEZWNvZGVzIHRoZSBuZXh0IGJhc2UgNjQgVkxRIHZhbHVlIGZyb20gdGhlIGdpdmVuIHN0cmluZyBhbmQgcmV0dXJucyB0aGVcbiAgICogdmFsdWUgYW5kIHRoZSByZXN0IG9mIHRoZSBzdHJpbmcgdmlhIHRoZSBvdXQgcGFyYW1ldGVyLlxuICAgKi9cbiAgZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbiBiYXNlNjRWTFFfZGVjb2RlKGFTdHIsIGFPdXRQYXJhbSkge1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgc3RyTGVuID0gYVN0ci5sZW5ndGg7XG4gICAgdmFyIHJlc3VsdCA9IDA7XG4gICAgdmFyIHNoaWZ0ID0gMDtcbiAgICB2YXIgY29udGludWF0aW9uLCBkaWdpdDtcblxuICAgIGRvIHtcbiAgICAgIGlmIChpID49IHN0ckxlbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBtb3JlIGRpZ2l0cyBpbiBiYXNlIDY0IFZMUSB2YWx1ZS5cIik7XG4gICAgICB9XG4gICAgICBkaWdpdCA9IGJhc2U2NC5kZWNvZGUoYVN0ci5jaGFyQXQoaSsrKSk7XG4gICAgICBjb250aW51YXRpb24gPSAhIShkaWdpdCAmIFZMUV9DT05USU5VQVRJT05fQklUKTtcbiAgICAgIGRpZ2l0ICY9IFZMUV9CQVNFX01BU0s7XG4gICAgICByZXN1bHQgPSByZXN1bHQgKyAoZGlnaXQgPDwgc2hpZnQpO1xuICAgICAgc2hpZnQgKz0gVkxRX0JBU0VfU0hJRlQ7XG4gICAgfSB3aGlsZSAoY29udGludWF0aW9uKTtcblxuICAgIGFPdXRQYXJhbS52YWx1ZSA9IGZyb21WTFFTaWduZWQocmVzdWx0KTtcbiAgICBhT3V0UGFyYW0ucmVzdCA9IGFTdHIuc2xpY2UoaSk7XG4gIH07XG5cbn0pO1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuaWYgKHR5cGVvZiBkZWZpbmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZGVmaW5lID0gcmVxdWlyZSgnYW1kZWZpbmUnKShtb2R1bGUsIHJlcXVpcmUpO1xufVxuZGVmaW5lKGZ1bmN0aW9uIChyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHtcblxuICB2YXIgY2hhclRvSW50TWFwID0ge307XG4gIHZhciBpbnRUb0NoYXJNYXAgPSB7fTtcblxuICAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbiAgICAuc3BsaXQoJycpXG4gICAgLmZvckVhY2goZnVuY3Rpb24gKGNoLCBpbmRleCkge1xuICAgICAgY2hhclRvSW50TWFwW2NoXSA9IGluZGV4O1xuICAgICAgaW50VG9DaGFyTWFwW2luZGV4XSA9IGNoO1xuICAgIH0pO1xuXG4gIC8qKlxuICAgKiBFbmNvZGUgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2Ugb2YgMCB0byA2MyB0byBhIHNpbmdsZSBiYXNlIDY0IGRpZ2l0LlxuICAgKi9cbiAgZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbiBiYXNlNjRfZW5jb2RlKGFOdW1iZXIpIHtcbiAgICBpZiAoYU51bWJlciBpbiBpbnRUb0NoYXJNYXApIHtcbiAgICAgIHJldHVybiBpbnRUb0NoYXJNYXBbYU51bWJlcl07XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNdXN0IGJlIGJldHdlZW4gMCBhbmQgNjM6IFwiICsgYU51bWJlcik7XG4gIH07XG5cbiAgLyoqXG4gICAqIERlY29kZSBhIHNpbmdsZSBiYXNlIDY0IGRpZ2l0IHRvIGFuIGludGVnZXIuXG4gICAqL1xuICBleHBvcnRzLmRlY29kZSA9IGZ1bmN0aW9uIGJhc2U2NF9kZWNvZGUoYUNoYXIpIHtcbiAgICBpZiAoYUNoYXIgaW4gY2hhclRvSW50TWFwKSB7XG4gICAgICByZXR1cm4gY2hhclRvSW50TWFwW2FDaGFyXTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk5vdCBhIHZhbGlkIGJhc2UgNjQgZGlnaXQ6IFwiICsgYUNoYXIpO1xuICB9O1xuXG59KTtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbmlmICh0eXBlb2YgZGVmaW5lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGRlZmluZSA9IHJlcXVpcmUoJ2FtZGVmaW5lJykobW9kdWxlLCByZXF1aXJlKTtcbn1cbmRlZmluZShmdW5jdGlvbiAocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZSBpbXBsZW1lbnRhdGlvbiBvZiBiaW5hcnkgc2VhcmNoLlxuICAgKlxuICAgKiBAcGFyYW0gYUxvdyBJbmRpY2VzIGhlcmUgYW5kIGxvd2VyIGRvIG5vdCBjb250YWluIHRoZSBuZWVkbGUuXG4gICAqIEBwYXJhbSBhSGlnaCBJbmRpY2VzIGhlcmUgYW5kIGhpZ2hlciBkbyBub3QgY29udGFpbiB0aGUgbmVlZGxlLlxuICAgKiBAcGFyYW0gYU5lZWRsZSBUaGUgZWxlbWVudCBiZWluZyBzZWFyY2hlZCBmb3IuXG4gICAqIEBwYXJhbSBhSGF5c3RhY2sgVGhlIG5vbi1lbXB0eSBhcnJheSBiZWluZyBzZWFyY2hlZC5cbiAgICogQHBhcmFtIGFDb21wYXJlIEZ1bmN0aW9uIHdoaWNoIHRha2VzIHR3byBlbGVtZW50cyBhbmQgcmV0dXJucyAtMSwgMCwgb3IgMS5cbiAgICovXG4gIGZ1bmN0aW9uIHJlY3Vyc2l2ZVNlYXJjaChhTG93LCBhSGlnaCwgYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSkge1xuICAgIC8vIFRoaXMgZnVuY3Rpb24gdGVybWluYXRlcyB3aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6XG4gICAgLy9cbiAgICAvLyAgIDEuIFdlIGZpbmQgdGhlIGV4YWN0IGVsZW1lbnQgd2UgYXJlIGxvb2tpbmcgZm9yLlxuICAgIC8vXG4gICAgLy8gICAyLiBXZSBkaWQgbm90IGZpbmQgdGhlIGV4YWN0IGVsZW1lbnQsIGJ1dCB3ZSBjYW4gcmV0dXJuIHRoZSBpbmRleCBvZlxuICAgIC8vICAgICAgdGhlIG5leHQgY2xvc2VzdCBlbGVtZW50IHRoYXQgaXMgbGVzcyB0aGFuIHRoYXQgZWxlbWVudC5cbiAgICAvL1xuICAgIC8vICAgMy4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBhbmQgdGhlcmUgaXMgbm8gbmV4dC1jbG9zZXN0XG4gICAgLy8gICAgICBlbGVtZW50IHdoaWNoIGlzIGxlc3MgdGhhbiB0aGUgb25lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLCBzbyB3ZVxuICAgIC8vICAgICAgcmV0dXJuIC0xLlxuICAgIHZhciBtaWQgPSBNYXRoLmZsb29yKChhSGlnaCAtIGFMb3cpIC8gMikgKyBhTG93O1xuICAgIHZhciBjbXAgPSBhQ29tcGFyZShhTmVlZGxlLCBhSGF5c3RhY2tbbWlkXSwgdHJ1ZSk7XG4gICAgaWYgKGNtcCA9PT0gMCkge1xuICAgICAgLy8gRm91bmQgdGhlIGVsZW1lbnQgd2UgYXJlIGxvb2tpbmcgZm9yLlxuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9XG4gICAgZWxzZSBpZiAoY21wID4gMCkge1xuICAgICAgLy8gYUhheXN0YWNrW21pZF0gaXMgZ3JlYXRlciB0aGFuIG91ciBuZWVkbGUuXG4gICAgICBpZiAoYUhpZ2ggLSBtaWQgPiAxKSB7XG4gICAgICAgIC8vIFRoZSBlbGVtZW50IGlzIGluIHRoZSB1cHBlciBoYWxmLlxuICAgICAgICByZXR1cm4gcmVjdXJzaXZlU2VhcmNoKG1pZCwgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUpO1xuICAgICAgfVxuICAgICAgLy8gV2UgZGlkIG5vdCBmaW5kIGFuIGV4YWN0IG1hdGNoLCByZXR1cm4gdGhlIG5leHQgY2xvc2VzdCBvbmVcbiAgICAgIC8vICh0ZXJtaW5hdGlvbiBjYXNlIDIpLlxuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAvLyBhSGF5c3RhY2tbbWlkXSBpcyBsZXNzIHRoYW4gb3VyIG5lZWRsZS5cbiAgICAgIGlmIChtaWQgLSBhTG93ID4gMSkge1xuICAgICAgICAvLyBUaGUgZWxlbWVudCBpcyBpbiB0aGUgbG93ZXIgaGFsZi5cbiAgICAgICAgcmV0dXJuIHJlY3Vyc2l2ZVNlYXJjaChhTG93LCBtaWQsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUpO1xuICAgICAgfVxuICAgICAgLy8gVGhlIGV4YWN0IG5lZWRsZSBlbGVtZW50IHdhcyBub3QgZm91bmQgaW4gdGhpcyBoYXlzdGFjay4gRGV0ZXJtaW5lIGlmXG4gICAgICAvLyB3ZSBhcmUgaW4gdGVybWluYXRpb24gY2FzZSAoMikgb3IgKDMpIGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHRoaW5nLlxuICAgICAgcmV0dXJuIGFMb3cgPCAwID8gLTEgOiBhTG93O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBzZWFyY2ggd2hpY2ggd2lsbCBhbHdheXMgdHJ5IGFuZCByZXR1cm5cbiAgICogdGhlIGluZGV4IG9mIG5leHQgbG93ZXN0IHZhbHVlIGNoZWNrZWQgaWYgdGhlcmUgaXMgbm8gZXhhY3QgaGl0LiBUaGlzIGlzXG4gICAqIGJlY2F1c2UgbWFwcGluZ3MgYmV0d2VlbiBvcmlnaW5hbCBhbmQgZ2VuZXJhdGVkIGxpbmUvY29sIHBhaXJzIGFyZSBzaW5nbGVcbiAgICogcG9pbnRzLCBhbmQgdGhlcmUgaXMgYW4gaW1wbGljaXQgcmVnaW9uIGJldHdlZW4gZWFjaCBvZiB0aGVtLCBzbyBhIG1pc3NcbiAgICoganVzdCBtZWFucyB0aGF0IHlvdSBhcmVuJ3Qgb24gdGhlIHZlcnkgc3RhcnQgb2YgYSByZWdpb24uXG4gICAqXG4gICAqIEBwYXJhbSBhTmVlZGxlIFRoZSBlbGVtZW50IHlvdSBhcmUgbG9va2luZyBmb3IuXG4gICAqIEBwYXJhbSBhSGF5c3RhY2sgVGhlIGFycmF5IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQuXG4gICAqIEBwYXJhbSBhQ29tcGFyZSBBIGZ1bmN0aW9uIHdoaWNoIHRha2VzIHRoZSBuZWVkbGUgYW5kIGFuIGVsZW1lbnQgaW4gdGhlXG4gICAqICAgICBhcnJheSBhbmQgcmV0dXJucyAtMSwgMCwgb3IgMSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgbmVlZGxlIGlzIGxlc3NcbiAgICogICAgIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIGVsZW1lbnQsIHJlc3BlY3RpdmVseS5cbiAgICovXG4gIGV4cG9ydHMuc2VhcmNoID0gZnVuY3Rpb24gc2VhcmNoKGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUpIHtcbiAgICBpZiAoYUhheXN0YWNrLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICByZXR1cm4gcmVjdXJzaXZlU2VhcmNoKC0xLCBhSGF5c3RhY2subGVuZ3RoLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlKVxuICB9O1xuXG59KTtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxNCBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbmlmICh0eXBlb2YgZGVmaW5lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGRlZmluZSA9IHJlcXVpcmUoJ2FtZGVmaW5lJykobW9kdWxlLCByZXF1aXJlKTtcbn1cbmRlZmluZShmdW5jdGlvbiAocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7XG5cbiAgdmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lIHdoZXRoZXIgbWFwcGluZ0IgaXMgYWZ0ZXIgbWFwcGluZ0Egd2l0aCByZXNwZWN0IHRvIGdlbmVyYXRlZFxuICAgKiBwb3NpdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIGdlbmVyYXRlZFBvc2l0aW9uQWZ0ZXIobWFwcGluZ0EsIG1hcHBpbmdCKSB7XG4gICAgLy8gT3B0aW1pemVkIGZvciBtb3N0IGNvbW1vbiBjYXNlXG4gICAgdmFyIGxpbmVBID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZTtcbiAgICB2YXIgbGluZUIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICAgIHZhciBjb2x1bW5BID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uO1xuICAgIHZhciBjb2x1bW5CID0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICAgIHJldHVybiBsaW5lQiA+IGxpbmVBIHx8IGxpbmVCID09IGxpbmVBICYmIGNvbHVtbkIgPj0gY29sdW1uQSB8fFxuICAgICAgICAgICB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9ucyhtYXBwaW5nQSwgbWFwcGluZ0IpIDw9IDA7XG4gIH1cblxuICAvKipcbiAgICogQSBkYXRhIHN0cnVjdHVyZSB0byBwcm92aWRlIGEgc29ydGVkIHZpZXcgb2YgYWNjdW11bGF0ZWQgbWFwcGluZ3MgaW4gYVxuICAgKiBwZXJmb3JtYW5jZSBjb25zY2lvdXMgbWFubmVyLiBJdCB0cmFkZXMgYSBuZWdsaWJhYmxlIG92ZXJoZWFkIGluIGdlbmVyYWxcbiAgICogY2FzZSBmb3IgYSBsYXJnZSBzcGVlZHVwIGluIGNhc2Ugb2YgbWFwcGluZ3MgYmVpbmcgYWRkZWQgaW4gb3JkZXIuXG4gICAqL1xuICBmdW5jdGlvbiBNYXBwaW5nTGlzdCgpIHtcbiAgICB0aGlzLl9hcnJheSA9IFtdO1xuICAgIHRoaXMuX3NvcnRlZCA9IHRydWU7XG4gICAgLy8gU2VydmVzIGFzIGluZmltdW1cbiAgICB0aGlzLl9sYXN0ID0ge2dlbmVyYXRlZExpbmU6IC0xLCBnZW5lcmF0ZWRDb2x1bW46IDB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGUgdGhyb3VnaCBpbnRlcm5hbCBpdGVtcy4gVGhpcyBtZXRob2QgdGFrZXMgdGhlIHNhbWUgYXJndW1lbnRzIHRoYXRcbiAgICogYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCB0YWtlcy5cbiAgICpcbiAgICogTk9URTogVGhlIG9yZGVyIG9mIHRoZSBtYXBwaW5ncyBpcyBOT1QgZ3VhcmFudGVlZC5cbiAgICovXG4gIE1hcHBpbmdMaXN0LnByb3RvdHlwZS51bnNvcnRlZEZvckVhY2ggPVxuICAgIGZ1bmN0aW9uIE1hcHBpbmdMaXN0X2ZvckVhY2goYUNhbGxiYWNrLCBhVGhpc0FyZykge1xuICAgICAgdGhpcy5fYXJyYXkuZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKTtcbiAgICB9O1xuXG4gIC8qKlxuICAgKiBBZGQgdGhlIGdpdmVuIHNvdXJjZSBtYXBwaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gT2JqZWN0IGFNYXBwaW5nXG4gICAqL1xuICBNYXBwaW5nTGlzdC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gTWFwcGluZ0xpc3RfYWRkKGFNYXBwaW5nKSB7XG4gICAgdmFyIG1hcHBpbmc7XG4gICAgaWYgKGdlbmVyYXRlZFBvc2l0aW9uQWZ0ZXIodGhpcy5fbGFzdCwgYU1hcHBpbmcpKSB7XG4gICAgICB0aGlzLl9sYXN0ID0gYU1hcHBpbmc7XG4gICAgICB0aGlzLl9hcnJheS5wdXNoKGFNYXBwaW5nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc29ydGVkID0gZmFsc2U7XG4gICAgICB0aGlzLl9hcnJheS5wdXNoKGFNYXBwaW5nKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZsYXQsIHNvcnRlZCBhcnJheSBvZiBtYXBwaW5ncy4gVGhlIG1hcHBpbmdzIGFyZSBzb3J0ZWQgYnlcbiAgICogZ2VuZXJhdGVkIHBvc2l0aW9uLlxuICAgKlxuICAgKiBXQVJOSU5HOiBUaGlzIG1ldGhvZCByZXR1cm5zIGludGVybmFsIGRhdGEgd2l0aG91dCBjb3B5aW5nLCBmb3JcbiAgICogcGVyZm9ybWFuY2UuIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBOT1QgYmUgbXV0YXRlZCwgYW5kIHNob3VsZCBiZSB0cmVhdGVkIGFzXG4gICAqIGFuIGltbXV0YWJsZSBib3Jyb3cuIElmIHlvdSB3YW50IHRvIHRha2Ugb3duZXJzaGlwLCB5b3UgbXVzdCBtYWtlIHlvdXIgb3duXG4gICAqIGNvcHkuXG4gICAqL1xuICBNYXBwaW5nTGlzdC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uIE1hcHBpbmdMaXN0X3RvQXJyYXkoKSB7XG4gICAgaWYgKCF0aGlzLl9zb3J0ZWQpIHtcbiAgICAgIHRoaXMuX2FycmF5LnNvcnQodXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnMpO1xuICAgICAgdGhpcy5fc29ydGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FycmF5O1xuICB9O1xuXG4gIGV4cG9ydHMuTWFwcGluZ0xpc3QgPSBNYXBwaW5nTGlzdDtcblxufSk7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5pZiAodHlwZW9mIGRlZmluZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBkZWZpbmUgPSByZXF1aXJlKCdhbWRlZmluZScpKG1vZHVsZSwgcmVxdWlyZSk7XG59XG5kZWZpbmUoZnVuY3Rpb24gKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkge1xuXG4gIHZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG4gIHZhciBiaW5hcnlTZWFyY2ggPSByZXF1aXJlKCcuL2JpbmFyeS1zZWFyY2gnKTtcbiAgdmFyIEFycmF5U2V0ID0gcmVxdWlyZSgnLi9hcnJheS1zZXQnKS5BcnJheVNldDtcbiAgdmFyIGJhc2U2NFZMUSA9IHJlcXVpcmUoJy4vYmFzZTY0LXZscScpO1xuXG4gIC8qKlxuICAgKiBBIFNvdXJjZU1hcENvbnN1bWVyIGluc3RhbmNlIHJlcHJlc2VudHMgYSBwYXJzZWQgc291cmNlIG1hcCB3aGljaCB3ZSBjYW5cbiAgICogcXVlcnkgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBmaWxlIHBvc2l0aW9ucyBieSBnaXZpbmcgaXQgYSBmaWxlXG4gICAqIHBvc2l0aW9uIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLlxuICAgKlxuICAgKiBUaGUgb25seSBwYXJhbWV0ZXIgaXMgdGhlIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3JcbiAgICogYWxyZWFkeSBwYXJzZWQgdG8gYW4gb2JqZWN0KS4gQWNjb3JkaW5nIHRvIHRoZSBzcGVjLCBzb3VyY2UgbWFwcyBoYXZlIHRoZVxuICAgKiBmb2xsb3dpbmcgYXR0cmlidXRlczpcbiAgICpcbiAgICogICAtIHZlcnNpb246IFdoaWNoIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXAgc3BlYyB0aGlzIG1hcCBpcyBmb2xsb3dpbmcuXG4gICAqICAgLSBzb3VyY2VzOiBBbiBhcnJheSBvZiBVUkxzIHRvIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMuXG4gICAqICAgLSBuYW1lczogQW4gYXJyYXkgb2YgaWRlbnRpZmllcnMgd2hpY2ggY2FuIGJlIHJlZmVycmVuY2VkIGJ5IGluZGl2aWR1YWwgbWFwcGluZ3MuXG4gICAqICAgLSBzb3VyY2VSb290OiBPcHRpb25hbC4gVGhlIFVSTCByb290IGZyb20gd2hpY2ggYWxsIHNvdXJjZXMgYXJlIHJlbGF0aXZlLlxuICAgKiAgIC0gc291cmNlc0NvbnRlbnQ6IE9wdGlvbmFsLiBBbiBhcnJheSBvZiBjb250ZW50cyBvZiB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGVzLlxuICAgKiAgIC0gbWFwcGluZ3M6IEEgc3RyaW5nIG9mIGJhc2U2NCBWTFFzIHdoaWNoIGNvbnRhaW4gdGhlIGFjdHVhbCBtYXBwaW5ncy5cbiAgICogICAtIGZpbGU6IE9wdGlvbmFsLiBUaGUgZ2VuZXJhdGVkIGZpbGUgdGhpcyBzb3VyY2UgbWFwIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICpcbiAgICogSGVyZSBpcyBhbiBleGFtcGxlIHNvdXJjZSBtYXAsIHRha2VuIGZyb20gdGhlIHNvdXJjZSBtYXAgc3BlY1swXTpcbiAgICpcbiAgICogICAgIHtcbiAgICogICAgICAgdmVyc2lvbiA6IDMsXG4gICAqICAgICAgIGZpbGU6IFwib3V0LmpzXCIsXG4gICAqICAgICAgIHNvdXJjZVJvb3QgOiBcIlwiLFxuICAgKiAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gICAqICAgICAgIG5hbWVzOiBbXCJzcmNcIiwgXCJtYXBzXCIsIFwiYXJlXCIsIFwiZnVuXCJdLFxuICAgKiAgICAgICBtYXBwaW5nczogXCJBQSxBQjs7QUJDREU7XCJcbiAgICogICAgIH1cbiAgICpcbiAgICogWzBdOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFVMVJHQWVoUXdSeXBVVG92RjFLUmxwaU9GemUwYi1fMmdjNmZBSDBLWTBrL2VkaXQ/cGxpPTEjXG4gICAqL1xuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcihhU291cmNlTWFwKSB7XG4gICAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gICAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAnc3RyaW5nJykge1xuICAgICAgc291cmNlTWFwID0gSlNPTi5wYXJzZShhU291cmNlTWFwLnJlcGxhY2UoL15cXClcXF1cXH0nLywgJycpKTtcbiAgICB9XG5cbiAgICB2YXIgdmVyc2lvbiA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3ZlcnNpb24nKTtcbiAgICB2YXIgc291cmNlcyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZXMnKTtcbiAgICAvLyBTYXNzIDMuMyBsZWF2ZXMgb3V0IHRoZSAnbmFtZXMnIGFycmF5LCBzbyB3ZSBkZXZpYXRlIGZyb20gdGhlIHNwZWMgKHdoaWNoXG4gICAgLy8gcmVxdWlyZXMgdGhlIGFycmF5KSB0byBwbGF5IG5pY2UgaGVyZS5cbiAgICB2YXIgbmFtZXMgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICduYW1lcycsIFtdKTtcbiAgICB2YXIgc291cmNlUm9vdCA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZVJvb3QnLCBudWxsKTtcbiAgICB2YXIgc291cmNlc0NvbnRlbnQgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VzQ29udGVudCcsIG51bGwpO1xuICAgIHZhciBtYXBwaW5ncyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ21hcHBpbmdzJyk7XG4gICAgdmFyIGZpbGUgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdmaWxlJywgbnVsbCk7XG5cbiAgICAvLyBPbmNlIGFnYWluLCBTYXNzIGRldmlhdGVzIGZyb20gdGhlIHNwZWMgYW5kIHN1cHBsaWVzIHRoZSB2ZXJzaW9uIGFzIGFcbiAgICAvLyBzdHJpbmcgcmF0aGVyIHRoYW4gYSBudW1iZXIsIHNvIHdlIHVzZSBsb29zZSBlcXVhbGl0eSBjaGVja2luZyBoZXJlLlxuICAgIGlmICh2ZXJzaW9uICE9IHRoaXMuX3ZlcnNpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgdmVyc2lvbjogJyArIHZlcnNpb24pO1xuICAgIH1cblxuICAgIC8vIFNvbWUgc291cmNlIG1hcHMgcHJvZHVjZSByZWxhdGl2ZSBzb3VyY2UgcGF0aHMgbGlrZSBcIi4vZm9vLmpzXCIgaW5zdGVhZCBvZlxuICAgIC8vIFwiZm9vLmpzXCIuICBOb3JtYWxpemUgdGhlc2UgZmlyc3Qgc28gdGhhdCBmdXR1cmUgY29tcGFyaXNvbnMgd2lsbCBzdWNjZWVkLlxuICAgIC8vIFNlZSBidWd6aWwubGEvMTA5MDc2OC5cbiAgICBzb3VyY2VzID0gc291cmNlcy5tYXAodXRpbC5ub3JtYWxpemUpO1xuXG4gICAgLy8gUGFzcyBgdHJ1ZWAgYmVsb3cgdG8gYWxsb3cgZHVwbGljYXRlIG5hbWVzIGFuZCBzb3VyY2VzLiBXaGlsZSBzb3VyY2UgbWFwc1xuICAgIC8vIGFyZSBpbnRlbmRlZCB0byBiZSBjb21wcmVzc2VkIGFuZCBkZWR1cGxpY2F0ZWQsIHRoZSBUeXBlU2NyaXB0IGNvbXBpbGVyXG4gICAgLy8gc29tZXRpbWVzIGdlbmVyYXRlcyBzb3VyY2UgbWFwcyB3aXRoIGR1cGxpY2F0ZXMgaW4gdGhlbS4gU2VlIEdpdGh1YiBpc3N1ZVxuICAgIC8vICM3MiBhbmQgYnVnemlsLmxhLzg4OTQ5Mi5cbiAgICB0aGlzLl9uYW1lcyA9IEFycmF5U2V0LmZyb21BcnJheShuYW1lcywgdHJ1ZSk7XG4gICAgdGhpcy5fc291cmNlcyA9IEFycmF5U2V0LmZyb21BcnJheShzb3VyY2VzLCB0cnVlKTtcblxuICAgIHRoaXMuc291cmNlUm9vdCA9IHNvdXJjZVJvb3Q7XG4gICAgdGhpcy5zb3VyY2VzQ29udGVudCA9IHNvdXJjZXNDb250ZW50O1xuICAgIHRoaXMuX21hcHBpbmdzID0gbWFwcGluZ3M7XG4gICAgdGhpcy5maWxlID0gZmlsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBTb3VyY2VNYXBDb25zdW1lciBmcm9tIGEgU291cmNlTWFwR2VuZXJhdG9yLlxuICAgKlxuICAgKiBAcGFyYW0gU291cmNlTWFwR2VuZXJhdG9yIGFTb3VyY2VNYXBcbiAgICogICAgICAgIFRoZSBzb3VyY2UgbWFwIHRoYXQgd2lsbCBiZSBjb25zdW1lZC5cbiAgICogQHJldHVybnMgU291cmNlTWFwQ29uc3VtZXJcbiAgICovXG4gIFNvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2Zyb21Tb3VyY2VNYXAoYVNvdXJjZU1hcCkge1xuICAgICAgdmFyIHNtYyA9IE9iamVjdC5jcmVhdGUoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlKTtcblxuICAgICAgc21jLl9uYW1lcyA9IEFycmF5U2V0LmZyb21BcnJheShhU291cmNlTWFwLl9uYW1lcy50b0FycmF5KCksIHRydWUpO1xuICAgICAgc21jLl9zb3VyY2VzID0gQXJyYXlTZXQuZnJvbUFycmF5KGFTb3VyY2VNYXAuX3NvdXJjZXMudG9BcnJheSgpLCB0cnVlKTtcbiAgICAgIHNtYy5zb3VyY2VSb290ID0gYVNvdXJjZU1hcC5fc291cmNlUm9vdDtcbiAgICAgIHNtYy5zb3VyY2VzQ29udGVudCA9IGFTb3VyY2VNYXAuX2dlbmVyYXRlU291cmNlc0NvbnRlbnQoc21jLl9zb3VyY2VzLnRvQXJyYXkoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jLnNvdXJjZVJvb3QpO1xuICAgICAgc21jLmZpbGUgPSBhU291cmNlTWFwLl9maWxlO1xuXG4gICAgICBzbWMuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IGFTb3VyY2VNYXAuX21hcHBpbmdzLnRvQXJyYXkoKS5zbGljZSgpO1xuICAgICAgc21jLl9fb3JpZ2luYWxNYXBwaW5ncyA9IGFTb3VyY2VNYXAuX21hcHBpbmdzLnRvQXJyYXkoKS5zbGljZSgpXG4gICAgICAgIC5zb3J0KHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMpO1xuXG4gICAgICByZXR1cm4gc21jO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwcGluZyBzcGVjIHRoYXQgd2UgYXJlIGNvbnN1bWluZy5cbiAgICovXG4gIFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIG9yaWdpbmFsIHNvdXJjZXMuXG4gICAqL1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnc291cmNlcycsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zb3VyY2VzLnRvQXJyYXkoKS5tYXAoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlUm9vdCAhPSBudWxsID8gdXRpbC5qb2luKHRoaXMuc291cmNlUm9vdCwgcykgOiBzO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBgX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kIGBfX29yaWdpbmFsTWFwcGluZ3NgIGFyZSBhcnJheXMgdGhhdCBob2xkIHRoZVxuICAvLyBwYXJzZWQgbWFwcGluZyBjb29yZGluYXRlcyBmcm9tIHRoZSBzb3VyY2UgbWFwJ3MgXCJtYXBwaW5nc1wiIGF0dHJpYnV0ZS4gVGhleVxuICAvLyBhcmUgbGF6aWx5IGluc3RhbnRpYXRlZCwgYWNjZXNzZWQgdmlhIHRoZSBgX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmRcbiAgLy8gYF9vcmlnaW5hbE1hcHBpbmdzYCBnZXR0ZXJzIHJlc3BlY3RpdmVseSwgYW5kIHdlIG9ubHkgcGFyc2UgdGhlIG1hcHBpbmdzXG4gIC8vIGFuZCBjcmVhdGUgdGhlc2UgYXJyYXlzIG9uY2UgcXVlcmllZCBmb3IgYSBzb3VyY2UgbG9jYXRpb24uIFdlIGp1bXAgdGhyb3VnaFxuICAvLyB0aGVzZSBob29wcyBiZWNhdXNlIHRoZXJlIGNhbiBiZSBtYW55IHRob3VzYW5kcyBvZiBtYXBwaW5ncywgYW5kIHBhcnNpbmdcbiAgLy8gdGhlbSBpcyBleHBlbnNpdmUsIHNvIHdlIG9ubHkgd2FudCB0byBkbyBpdCBpZiB3ZSBtdXN0LlxuICAvL1xuICAvLyBFYWNoIG9iamVjdCBpbiB0aGUgYXJyYXlzIGlzIG9mIHRoZSBmb3JtOlxuICAvL1xuICAvLyAgICAge1xuICAvLyAgICAgICBnZW5lcmF0ZWRMaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLFxuICAvLyAgICAgICBnZW5lcmF0ZWRDb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSxcbiAgLy8gICAgICAgc291cmNlOiBUaGUgcGF0aCB0byB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUgdGhhdCBnZW5lcmF0ZWQgdGhpc1xuICAvLyAgICAgICAgICAgICAgIGNodW5rIG9mIGNvZGUsXG4gIC8vICAgICAgIG9yaWdpbmFsTGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgdGhhdFxuICAvLyAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoaXMgY2h1bmsgb2YgZ2VuZXJhdGVkIGNvZGUsXG4gIC8vICAgICAgIG9yaWdpbmFsQ29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlIHRoYXRcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoaXMgY2h1bmsgb2YgZ2VuZXJhdGVkIGNvZGUsXG4gIC8vICAgICAgIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBvcmlnaW5hbCBzeW1ib2wgd2hpY2ggZ2VuZXJhdGVkIHRoaXMgY2h1bmsgb2ZcbiAgLy8gICAgICAgICAgICAgY29kZS5cbiAgLy8gICAgIH1cbiAgLy9cbiAgLy8gQWxsIHByb3BlcnRpZXMgZXhjZXB0IGZvciBgZ2VuZXJhdGVkTGluZWAgYW5kIGBnZW5lcmF0ZWRDb2x1bW5gIGNhbiBiZVxuICAvLyBgbnVsbGAuXG4gIC8vXG4gIC8vIGBfZ2VuZXJhdGVkTWFwcGluZ3NgIGlzIG9yZGVyZWQgYnkgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbnMuXG4gIC8vXG4gIC8vIGBfb3JpZ2luYWxNYXBwaW5nc2AgaXMgb3JkZXJlZCBieSB0aGUgb3JpZ2luYWwgcG9zaXRpb25zLlxuXG4gIFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fX2dlbmVyYXRlZE1hcHBpbmdzID0gbnVsbDtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSwgJ19nZW5lcmF0ZWRNYXBwaW5ncycsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzKSB7XG4gICAgICAgIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IFtdO1xuICAgICAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncyA9IFtdO1xuICAgICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzO1xuICAgIH1cbiAgfSk7XG5cbiAgU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9fb3JpZ2luYWxNYXBwaW5ncyA9IG51bGw7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdfb3JpZ2luYWxNYXBwaW5ncycsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghdGhpcy5fX29yaWdpbmFsTWFwcGluZ3MpIHtcbiAgICAgICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG4gICAgICAgIHRoaXMuX3BhcnNlTWFwcGluZ3ModGhpcy5fbWFwcGluZ3MsIHRoaXMuc291cmNlUm9vdCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncztcbiAgICB9XG4gIH0pO1xuXG4gIFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fbmV4dENoYXJJc01hcHBpbmdTZXBhcmF0b3IgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX25leHRDaGFySXNNYXBwaW5nU2VwYXJhdG9yKGFTdHIpIHtcbiAgICAgIHZhciBjID0gYVN0ci5jaGFyQXQoMCk7XG4gICAgICByZXR1cm4gYyA9PT0gXCI7XCIgfHwgYyA9PT0gXCIsXCI7XG4gICAgfTtcblxuICAvKipcbiAgICogUGFyc2UgdGhlIG1hcHBpbmdzIGluIGEgc3RyaW5nIGluIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggd2UgY2FuIGVhc2lseVxuICAgKiBxdWVyeSAodGhlIG9yZGVyZWQgYXJyYXlzIGluIHRoZSBgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmRcbiAgICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAgICovXG4gIFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fcGFyc2VNYXBwaW5ncyA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfcGFyc2VNYXBwaW5ncyhhU3RyLCBhU291cmNlUm9vdCkge1xuICAgICAgdmFyIGdlbmVyYXRlZExpbmUgPSAxO1xuICAgICAgdmFyIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICAgIHZhciBwcmV2aW91c09yaWdpbmFsTGluZSA9IDA7XG4gICAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgICB2YXIgcHJldmlvdXNTb3VyY2UgPSAwO1xuICAgICAgdmFyIHByZXZpb3VzTmFtZSA9IDA7XG4gICAgICB2YXIgc3RyID0gYVN0cjtcbiAgICAgIHZhciB0ZW1wID0ge307XG4gICAgICB2YXIgbWFwcGluZztcblxuICAgICAgd2hpbGUgKHN0ci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChzdHIuY2hhckF0KDApID09PSAnOycpIHtcbiAgICAgICAgICBnZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgICAgc3RyID0gc3RyLnNsaWNlKDEpO1xuICAgICAgICAgIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdHIuY2hhckF0KDApID09PSAnLCcpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc2xpY2UoMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgbWFwcGluZyA9IHt9O1xuICAgICAgICAgIG1hcHBpbmcuZ2VuZXJhdGVkTGluZSA9IGdlbmVyYXRlZExpbmU7XG5cbiAgICAgICAgICAvLyBHZW5lcmF0ZWQgY29sdW1uLlxuICAgICAgICAgIGJhc2U2NFZMUS5kZWNvZGUoc3RyLCB0ZW1wKTtcbiAgICAgICAgICBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiA9IHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uICsgdGVtcC52YWx1ZTtcbiAgICAgICAgICBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uO1xuICAgICAgICAgIHN0ciA9IHRlbXAucmVzdDtcblxuICAgICAgICAgIGlmIChzdHIubGVuZ3RoID4gMCAmJiAhdGhpcy5fbmV4dENoYXJJc01hcHBpbmdTZXBhcmF0b3Ioc3RyKSkge1xuICAgICAgICAgICAgLy8gT3JpZ2luYWwgc291cmNlLlxuICAgICAgICAgICAgYmFzZTY0VkxRLmRlY29kZShzdHIsIHRlbXApO1xuICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSB0aGlzLl9zb3VyY2VzLmF0KHByZXZpb3VzU291cmNlICsgdGVtcC52YWx1ZSk7XG4gICAgICAgICAgICBwcmV2aW91c1NvdXJjZSArPSB0ZW1wLnZhbHVlO1xuICAgICAgICAgICAgc3RyID0gdGVtcC5yZXN0O1xuICAgICAgICAgICAgaWYgKHN0ci5sZW5ndGggPT09IDAgfHwgdGhpcy5fbmV4dENoYXJJc01hcHBpbmdTZXBhcmF0b3Ioc3RyKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlLCBidXQgbm8gbGluZSBhbmQgY29sdW1uJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE9yaWdpbmFsIGxpbmUuXG4gICAgICAgICAgICBiYXNlNjRWTFEuZGVjb2RlKHN0ciwgdGVtcCk7XG4gICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsTGluZSA9IHByZXZpb3VzT3JpZ2luYWxMaW5lICsgdGVtcC52YWx1ZTtcbiAgICAgICAgICAgIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmU7XG4gICAgICAgICAgICAvLyBMaW5lcyBhcmUgc3RvcmVkIDAtYmFzZWRcbiAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lICs9IDE7XG4gICAgICAgICAgICBzdHIgPSB0ZW1wLnJlc3Q7XG4gICAgICAgICAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMCB8fCB0aGlzLl9uZXh0Q2hhcklzTWFwcGluZ1NlcGFyYXRvcihzdHIpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRm91bmQgYSBzb3VyY2UgYW5kIGxpbmUsIGJ1dCBubyBjb2x1bW4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gT3JpZ2luYWwgY29sdW1uLlxuICAgICAgICAgICAgYmFzZTY0VkxRLmRlY29kZShzdHIsIHRlbXApO1xuICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IHByZXZpb3VzT3JpZ2luYWxDb2x1bW4gKyB0ZW1wLnZhbHVlO1xuICAgICAgICAgICAgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IG1hcHBpbmcub3JpZ2luYWxDb2x1bW47XG4gICAgICAgICAgICBzdHIgPSB0ZW1wLnJlc3Q7XG5cbiAgICAgICAgICAgIGlmIChzdHIubGVuZ3RoID4gMCAmJiAhdGhpcy5fbmV4dENoYXJJc01hcHBpbmdTZXBhcmF0b3Ioc3RyKSkge1xuICAgICAgICAgICAgICAvLyBPcmlnaW5hbCBuYW1lLlxuICAgICAgICAgICAgICBiYXNlNjRWTFEuZGVjb2RlKHN0ciwgdGVtcCk7XG4gICAgICAgICAgICAgIG1hcHBpbmcubmFtZSA9IHRoaXMuX25hbWVzLmF0KHByZXZpb3VzTmFtZSArIHRlbXAudmFsdWUpO1xuICAgICAgICAgICAgICBwcmV2aW91c05hbWUgKz0gdGVtcC52YWx1ZTtcbiAgICAgICAgICAgICAgc3RyID0gdGVtcC5yZXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncy5wdXNoKG1hcHBpbmcpO1xuICAgICAgICAgIGlmICh0eXBlb2YgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncy5wdXNoKG1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3Muc29ydCh1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9ucyk7XG4gICAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncy5zb3J0KHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMpO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIG1hcHBpbmcgdGhhdCBiZXN0IG1hdGNoZXMgdGhlIGh5cG90aGV0aWNhbCBcIm5lZWRsZVwiIG1hcHBpbmcgdGhhdFxuICAgKiB3ZSBhcmUgc2VhcmNoaW5nIGZvciBpbiB0aGUgZ2l2ZW4gXCJoYXlzdGFja1wiIG9mIG1hcHBpbmdzLlxuICAgKi9cbiAgU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9maW5kTWFwcGluZyA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZmluZE1hcHBpbmcoYU5lZWRsZSwgYU1hcHBpbmdzLCBhTGluZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUNvbHVtbk5hbWUsIGFDb21wYXJhdG9yKSB7XG4gICAgICAvLyBUbyByZXR1cm4gdGhlIHBvc2l0aW9uIHdlIGFyZSBzZWFyY2hpbmcgZm9yLCB3ZSBtdXN0IGZpcnN0IGZpbmQgdGhlXG4gICAgICAvLyBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHRoZW4gcmV0dXJuIHRoZSBvcHBvc2l0ZSBwb3NpdGlvbiBpdFxuICAgICAgLy8gcG9pbnRzIHRvLiBCZWNhdXNlIHRoZSBtYXBwaW5ncyBhcmUgc29ydGVkLCB3ZSBjYW4gdXNlIGJpbmFyeSBzZWFyY2ggdG9cbiAgICAgIC8vIGZpbmQgdGhlIGJlc3QgbWFwcGluZy5cblxuICAgICAgaWYgKGFOZWVkbGVbYUxpbmVOYW1lXSA8PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0xpbmUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMSwgZ290ICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFOZWVkbGVbYUxpbmVOYW1lXSk7XG4gICAgICB9XG4gICAgICBpZiAoYU5lZWRsZVthQ29sdW1uTmFtZV0gPCAwKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NvbHVtbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwLCBnb3QgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthQ29sdW1uTmFtZV0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYmluYXJ5U2VhcmNoLnNlYXJjaChhTmVlZGxlLCBhTWFwcGluZ3MsIGFDb21wYXJhdG9yKTtcbiAgICB9O1xuXG4gIC8qKlxuICAgKiBDb21wdXRlIHRoZSBsYXN0IGNvbHVtbiBmb3IgZWFjaCBnZW5lcmF0ZWQgbWFwcGluZy4gVGhlIGxhc3QgY29sdW1uIGlzXG4gICAqIGluY2x1c2l2ZS5cbiAgICovXG4gIFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb21wdXRlQ29sdW1uU3BhbnMgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NvbXB1dGVDb2x1bW5TcGFucygpIHtcbiAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncy5sZW5ndGg7ICsraW5kZXgpIHtcbiAgICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgICAgLy8gTWFwcGluZ3MgZG8gbm90IGNvbnRhaW4gYSBmaWVsZCBmb3IgdGhlIGxhc3QgZ2VuZXJhdGVkIGNvbHVtbnQuIFdlXG4gICAgICAgIC8vIGNhbiBjb21lIHVwIHdpdGggYW4gb3B0aW1pc3RpYyBlc3RpbWF0ZSwgaG93ZXZlciwgYnkgYXNzdW1pbmcgdGhhdFxuICAgICAgICAvLyBtYXBwaW5ncyBhcmUgY29udGlndW91cyAoaS5lLiBnaXZlbiB0d28gY29uc2VjdXRpdmUgbWFwcGluZ3MsIHRoZVxuICAgICAgICAvLyBmaXJzdCBtYXBwaW5nIGVuZHMgd2hlcmUgdGhlIHNlY29uZCBvbmUgc3RhcnRzKS5cbiAgICAgICAgaWYgKGluZGV4ICsgMSA8IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzLmxlbmd0aCkge1xuICAgICAgICAgIHZhciBuZXh0TWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4ICsgMV07XG5cbiAgICAgICAgICBpZiAobWFwcGluZy5nZW5lcmF0ZWRMaW5lID09PSBuZXh0TWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgICBtYXBwaW5nLmxhc3RHZW5lcmF0ZWRDb2x1bW4gPSBuZXh0TWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gLSAxO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIGxhc3QgbWFwcGluZyBmb3IgZWFjaCBsaW5lIHNwYW5zIHRoZSBlbnRpcmUgbGluZS5cbiAgICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gSW5maW5pdHk7XG4gICAgICB9XG4gICAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlLCBsaW5lLCBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgZ2VuZXJhdGVkXG4gICAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdFxuICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICpcbiAgICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS5cbiAgICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gICAqXG4gICAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAqXG4gICAqICAgLSBzb3VyY2U6IFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSwgb3IgbnVsbC5cbiAgICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLlxuICAgKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLlxuICAgKiAgIC0gbmFtZTogVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIsIG9yIG51bGwuXG4gICAqL1xuICBTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUub3JpZ2luYWxQb3NpdGlvbkZvciA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfb3JpZ2luYWxQb3NpdGlvbkZvcihhQXJncykge1xuICAgICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgICAgZ2VuZXJhdGVkTGluZTogdXRpbC5nZXRBcmcoYUFyZ3MsICdsaW5lJyksXG4gICAgICAgIGdlbmVyYXRlZENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nKVxuICAgICAgfTtcblxuICAgICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZE1hcHBpbmcobmVlZGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImdlbmVyYXRlZExpbmVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZ2VuZXJhdGVkQ29sdW1uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9ucyk7XG5cbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIHZhciBtYXBwaW5nID0gdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3NbaW5kZXhdO1xuXG4gICAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgPT09IG5lZWRsZS5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdzb3VyY2UnLCBudWxsKTtcbiAgICAgICAgICBpZiAoc291cmNlICE9IG51bGwgJiYgdGhpcy5zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNvdXJjZSA9IHV0aWwuam9pbih0aGlzLnNvdXJjZVJvb3QsIHNvdXJjZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdvcmlnaW5hbExpbmUnLCBudWxsKSxcbiAgICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ29yaWdpbmFsQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgICBuYW1lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbmFtZScsIG51bGwpXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzb3VyY2U6IG51bGwsXG4gICAgICAgIGxpbmU6IG51bGwsXG4gICAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgICAgbmFtZTogbnVsbFxuICAgICAgfTtcbiAgICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29udGVudC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgdGhlIHVybCBvZiB0aGVcbiAgICogb3JpZ2luYWwgc291cmNlIGZpbGUuIFJldHVybnMgbnVsbCBpZiBubyBvcmlnaW5hbCBzb3VyY2UgY29udGVudCBpc1xuICAgKiBhdmFpbGlibGUuXG4gICAqL1xuICBTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuc291cmNlQ29udGVudEZvciA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfc291cmNlQ29udGVudEZvcihhU291cmNlKSB7XG4gICAgICBpZiAoIXRoaXMuc291cmNlc0NvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICBhU291cmNlID0gdXRpbC5yZWxhdGl2ZSh0aGlzLnNvdXJjZVJvb3QsIGFTb3VyY2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fc291cmNlcy5oYXMoYVNvdXJjZSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnRbdGhpcy5fc291cmNlcy5pbmRleE9mKGFTb3VyY2UpXTtcbiAgICAgIH1cblxuICAgICAgdmFyIHVybDtcbiAgICAgIGlmICh0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbFxuICAgICAgICAgICYmICh1cmwgPSB1dGlsLnVybFBhcnNlKHRoaXMuc291cmNlUm9vdCkpKSB7XG4gICAgICAgIC8vIFhYWDogZmlsZTovLyBVUklzIGFuZCBhYnNvbHV0ZSBwYXRocyBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3IgZm9yXG4gICAgICAgIC8vIG1hbnkgdXNlcnMuIFdlIGNhbiBoZWxwIHRoZW0gb3V0IHdoZW4gdGhleSBleHBlY3QgZmlsZTovLyBVUklzIHRvXG4gICAgICAgIC8vIGJlaGF2ZSBsaWtlIGl0IHdvdWxkIGlmIHRoZXkgd2VyZSBydW5uaW5nIGEgbG9jYWwgSFRUUCBzZXJ2ZXIuIFNlZVxuICAgICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD04ODU1OTcuXG4gICAgICAgIHZhciBmaWxlVXJpQWJzUGF0aCA9IGFTb3VyY2UucmVwbGFjZSgvXmZpbGU6XFwvXFwvLywgXCJcIik7XG4gICAgICAgIGlmICh1cmwuc2NoZW1lID09IFwiZmlsZVwiXG4gICAgICAgICAgICAmJiB0aGlzLl9zb3VyY2VzLmhhcyhmaWxlVXJpQWJzUGF0aCkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VzQ29udGVudFt0aGlzLl9zb3VyY2VzLmluZGV4T2YoZmlsZVVyaUFic1BhdGgpXVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCghdXJsLnBhdGggfHwgdXJsLnBhdGggPT0gXCIvXCIpXG4gICAgICAgICAgICAmJiB0aGlzLl9zb3VyY2VzLmhhcyhcIi9cIiArIGFTb3VyY2UpKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnRbdGhpcy5fc291cmNlcy5pbmRleE9mKFwiL1wiICsgYVNvdXJjZSldO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcignXCInICsgYVNvdXJjZSArICdcIiBpcyBub3QgaW4gdGhlIFNvdXJjZU1hcC4nKTtcbiAgICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgc291cmNlLFxuICAgKiBsaW5lLCBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcbiAgICogdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgKlxuICAgKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAgICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICAgKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICAgKlxuICAgKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgKlxuICAgKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICAgKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAgICovXG4gIFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZ2VuZXJhdGVkUG9zaXRpb25Gb3IoYUFyZ3MpIHtcbiAgICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICAgIHNvdXJjZTogdXRpbC5nZXRBcmcoYUFyZ3MsICdzb3VyY2UnKSxcbiAgICAgICAgb3JpZ2luYWxMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgICAgb3JpZ2luYWxDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJylcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICBuZWVkbGUuc291cmNlID0gdXRpbC5yZWxhdGl2ZSh0aGlzLnNvdXJjZVJvb3QsIG5lZWRsZS5zb3VyY2UpO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kTWFwcGluZyhuZWVkbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcmlnaW5hbExpbmVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3JpZ2luYWxDb2x1bW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMpO1xuXG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3NbaW5kZXhdO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGluZTogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZExpbmUnLCBudWxsKSxcbiAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRDb2x1bW4nLCBudWxsKSxcbiAgICAgICAgICBsYXN0Q29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbGFzdEdlbmVyYXRlZENvbHVtbicsIG51bGwpXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpbmU6IG51bGwsXG4gICAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgICAgbGFzdENvbHVtbjogbnVsbFxuICAgICAgfTtcbiAgICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgc291cmNlXG4gICAqIGFuZCBsaW5lIHByb3ZpZGVkLiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nXG4gICAqIHByb3BlcnRpZXM6XG4gICAqXG4gICAqICAgLSBzb3VyY2U6IFRoZSBmaWxlbmFtZSBvZiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICAgKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gICAqXG4gICAqIGFuZCBhbiBhcnJheSBvZiBvYmplY3RzIGlzIHJldHVybmVkLCBlYWNoIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgKlxuICAgKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICAgKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAgICovXG4gIFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5hbGxHZW5lcmF0ZWRQb3NpdGlvbnNGb3IgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2FsbEdlbmVyYXRlZFBvc2l0aW9uc0ZvcihhQXJncykge1xuICAgICAgLy8gV2hlbiB0aGVyZSBpcyBubyBleGFjdCBtYXRjaCwgU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9maW5kTWFwcGluZ1xuICAgICAgLy8gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGNsb3Nlc3QgbWFwcGluZyBsZXNzIHRoYW4gdGhlIG5lZWRsZS4gQnlcbiAgICAgIC8vIHNldHRpbmcgbmVlZGxlLm9yaWdpbmFsQ29sdW1uIHRvIEluZmluaXR5LCB3ZSB0aHVzIGZpbmQgdGhlIGxhc3RcbiAgICAgIC8vIG1hcHBpbmcgZm9yIHRoZSBnaXZlbiBsaW5lLCBwcm92aWRlZCBzdWNoIGEgbWFwcGluZyBleGlzdHMuXG4gICAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgICBzb3VyY2U6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJyksXG4gICAgICAgIG9yaWdpbmFsTGluZTogdXRpbC5nZXRBcmcoYUFyZ3MsICdsaW5lJyksXG4gICAgICAgIG9yaWdpbmFsQ29sdW1uOiBJbmZpbml0eVxuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgIG5lZWRsZS5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuc291cmNlUm9vdCwgbmVlZGxlLnNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBtYXBwaW5ncyA9IFtdO1xuXG4gICAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kTWFwcGluZyhuZWVkbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcmlnaW5hbExpbmVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3JpZ2luYWxDb2x1bW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgICB3aGlsZSAobWFwcGluZyAmJiBtYXBwaW5nLm9yaWdpbmFsTGluZSA9PT0gbmVlZGxlLm9yaWdpbmFsTGluZSkge1xuICAgICAgICAgIG1hcHBpbmdzLnB1c2goe1xuICAgICAgICAgICAgbGluZTogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZExpbmUnLCBudWxsKSxcbiAgICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZENvbHVtbicsIG51bGwpLFxuICAgICAgICAgICAgbGFzdENvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2xhc3RHZW5lcmF0ZWRDb2x1bW4nLCBudWxsKVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgbWFwcGluZyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3NbLS1pbmRleF07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1hcHBpbmdzLnJldmVyc2UoKTtcbiAgICB9O1xuXG4gIFNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUiA9IDE7XG4gIFNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSID0gMjtcblxuICAvKipcbiAgICogSXRlcmF0ZSBvdmVyIGVhY2ggbWFwcGluZyBiZXR3ZWVuIGFuIG9yaWdpbmFsIHNvdXJjZS9saW5lL2NvbHVtbiBhbmQgYVxuICAgKiBnZW5lcmF0ZWQgbGluZS9jb2x1bW4gaW4gdGhpcyBzb3VyY2UgbWFwLlxuICAgKlxuICAgKiBAcGFyYW0gRnVuY3Rpb24gYUNhbGxiYWNrXG4gICAqICAgICAgICBUaGUgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2l0aCBlYWNoIG1hcHBpbmcuXG4gICAqIEBwYXJhbSBPYmplY3QgYUNvbnRleHRcbiAgICogICAgICAgIE9wdGlvbmFsLiBJZiBzcGVjaWZpZWQsIHRoaXMgb2JqZWN0IHdpbGwgYmUgdGhlIHZhbHVlIG9mIGB0aGlzYCBldmVyeVxuICAgKiAgICAgICAgdGltZSB0aGF0IGBhQ2FsbGJhY2tgIGlzIGNhbGxlZC5cbiAgICogQHBhcmFtIGFPcmRlclxuICAgKiAgICAgICAgRWl0aGVyIGBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVJgIG9yXG4gICAqICAgICAgICBgU291cmNlTWFwQ29uc3VtZXIuT1JJR0lOQUxfT1JERVJgLiBTcGVjaWZpZXMgd2hldGhlciB5b3Ugd2FudCB0b1xuICAgKiAgICAgICAgaXRlcmF0ZSBvdmVyIHRoZSBtYXBwaW5ncyBzb3J0ZWQgYnkgdGhlIGdlbmVyYXRlZCBmaWxlJ3MgbGluZS9jb2x1bW5cbiAgICogICAgICAgIG9yZGVyIG9yIHRoZSBvcmlnaW5hbCdzIHNvdXJjZS9saW5lL2NvbHVtbiBvcmRlciwgcmVzcGVjdGl2ZWx5LiBEZWZhdWx0cyB0b1xuICAgKiAgICAgICAgYFNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUmAuXG4gICAqL1xuICBTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuZWFjaE1hcHBpbmcgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2VhY2hNYXBwaW5nKGFDYWxsYmFjaywgYUNvbnRleHQsIGFPcmRlcikge1xuICAgICAgdmFyIGNvbnRleHQgPSBhQ29udGV4dCB8fCBudWxsO1xuICAgICAgdmFyIG9yZGVyID0gYU9yZGVyIHx8IFNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUjtcblxuICAgICAgdmFyIG1hcHBpbmdzO1xuICAgICAgc3dpdGNoIChvcmRlcikge1xuICAgICAgY2FzZSBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVI6XG4gICAgICAgIG1hcHBpbmdzID0gdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3M7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTb3VyY2VNYXBDb25zdW1lci5PUklHSU5BTF9PUkRFUjpcbiAgICAgICAgbWFwcGluZ3MgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gb3JkZXIgb2YgaXRlcmF0aW9uLlwiKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHNvdXJjZVJvb3QgPSB0aGlzLnNvdXJjZVJvb3Q7XG4gICAgICBtYXBwaW5ncy5tYXAoZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgc291cmNlID0gdXRpbC5qb2luKHNvdXJjZVJvb3QsIHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICBnZW5lcmF0ZWRMaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbixcbiAgICAgICAgICBvcmlnaW5hbExpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICAgIG9yaWdpbmFsQ29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLFxuICAgICAgICAgIG5hbWU6IG1hcHBpbmcubmFtZVxuICAgICAgICB9O1xuICAgICAgfSkuZm9yRWFjaChhQ2FsbGJhY2ssIGNvbnRleHQpO1xuICAgIH07XG5cbiAgZXhwb3J0cy5Tb3VyY2VNYXBDb25zdW1lciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG59KTtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbmlmICh0eXBlb2YgZGVmaW5lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGRlZmluZSA9IHJlcXVpcmUoJ2FtZGVmaW5lJykobW9kdWxlLCByZXF1aXJlKTtcbn1cbmRlZmluZShmdW5jdGlvbiAocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7XG5cbiAgdmFyIGJhc2U2NFZMUSA9IHJlcXVpcmUoJy4vYmFzZTY0LXZscScpO1xuICB2YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuICB2YXIgQXJyYXlTZXQgPSByZXF1aXJlKCcuL2FycmF5LXNldCcpLkFycmF5U2V0O1xuICB2YXIgTWFwcGluZ0xpc3QgPSByZXF1aXJlKCcuL21hcHBpbmctbGlzdCcpLk1hcHBpbmdMaXN0O1xuXG4gIC8qKlxuICAgKiBBbiBpbnN0YW5jZSBvZiB0aGUgU291cmNlTWFwR2VuZXJhdG9yIHJlcHJlc2VudHMgYSBzb3VyY2UgbWFwIHdoaWNoIGlzXG4gICAqIGJlaW5nIGJ1aWx0IGluY3JlbWVudGFsbHkuIFlvdSBtYXkgcGFzcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nXG4gICAqIHByb3BlcnRpZXM6XG4gICAqXG4gICAqICAgLSBmaWxlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gICAqICAgLSBzb3VyY2VSb290OiBBIHJvb3QgZm9yIGFsbCByZWxhdGl2ZSBVUkxzIGluIHRoaXMgc291cmNlIG1hcC5cbiAgICovXG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcihhQXJncykge1xuICAgIGlmICghYUFyZ3MpIHtcbiAgICAgIGFBcmdzID0ge307XG4gICAgfVxuICAgIHRoaXMuX2ZpbGUgPSB1dGlsLmdldEFyZyhhQXJncywgJ2ZpbGUnLCBudWxsKTtcbiAgICB0aGlzLl9zb3VyY2VSb290ID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdzb3VyY2VSb290JywgbnVsbCk7XG4gICAgdGhpcy5fc2tpcFZhbGlkYXRpb24gPSB1dGlsLmdldEFyZyhhQXJncywgJ3NraXBWYWxpZGF0aW9uJywgZmFsc2UpO1xuICAgIHRoaXMuX3NvdXJjZXMgPSBuZXcgQXJyYXlTZXQoKTtcbiAgICB0aGlzLl9uYW1lcyA9IG5ldyBBcnJheVNldCgpO1xuICAgIHRoaXMuX21hcHBpbmdzID0gbmV3IE1hcHBpbmdMaXN0KCk7XG4gICAgdGhpcy5fc291cmNlc0NvbnRlbnRzID0gbnVsbDtcbiAgfVxuXG4gIFNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFNvdXJjZU1hcEdlbmVyYXRvciBiYXNlZCBvbiBhIFNvdXJjZU1hcENvbnN1bWVyXG4gICAqXG4gICAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIFNvdXJjZU1hcC5cbiAgICovXG4gIFNvdXJjZU1hcEdlbmVyYXRvci5mcm9tU291cmNlTWFwID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfZnJvbVNvdXJjZU1hcChhU291cmNlTWFwQ29uc3VtZXIpIHtcbiAgICAgIHZhciBzb3VyY2VSb290ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZVJvb3Q7XG4gICAgICB2YXIgZ2VuZXJhdG9yID0gbmV3IFNvdXJjZU1hcEdlbmVyYXRvcih7XG4gICAgICAgIGZpbGU6IGFTb3VyY2VNYXBDb25zdW1lci5maWxlLFxuICAgICAgICBzb3VyY2VSb290OiBzb3VyY2VSb290XG4gICAgICB9KTtcbiAgICAgIGFTb3VyY2VNYXBDb25zdW1lci5lYWNoTWFwcGluZyhmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgICB2YXIgbmV3TWFwcGluZyA9IHtcbiAgICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICAgIGxpbmU6IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSxcbiAgICAgICAgICAgIGNvbHVtbjogbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW5cbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG1hcHBpbmcuc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgICBuZXdNYXBwaW5nLnNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICAgIG5ld01hcHBpbmcuc291cmNlID0gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBuZXdNYXBwaW5nLnNvdXJjZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV3TWFwcGluZy5vcmlnaW5hbCA9IHtcbiAgICAgICAgICAgIGxpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICAgICAgY29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChtYXBwaW5nLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgbmV3TWFwcGluZy5uYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdlbmVyYXRvci5hZGRNYXBwaW5nKG5ld01hcHBpbmcpO1xuICAgICAgfSk7XG4gICAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICAgIGlmIChjb250ZW50ICE9IG51bGwpIHtcbiAgICAgICAgICBnZW5lcmF0b3Iuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIEFkZCBhIHNpbmdsZSBtYXBwaW5nIGZyb20gb3JpZ2luYWwgc291cmNlIGxpbmUgYW5kIGNvbHVtbiB0byB0aGUgZ2VuZXJhdGVkXG4gICAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBmb3IgdGhpcyBzb3VyY2UgbWFwIGJlaW5nIGNyZWF0ZWQuIFRoZSBtYXBwaW5nXG4gICAqIG9iamVjdCBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAqXG4gICAqICAgLSBnZW5lcmF0ZWQ6IEFuIG9iamVjdCB3aXRoIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucy5cbiAgICogICAtIG9yaWdpbmFsOiBBbiBvYmplY3Qgd2l0aCB0aGUgb3JpZ2luYWwgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucy5cbiAgICogICAtIHNvdXJjZTogVGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIChyZWxhdGl2ZSB0byB0aGUgc291cmNlUm9vdCkuXG4gICAqICAgLSBuYW1lOiBBbiBvcHRpb25hbCBvcmlnaW5hbCB0b2tlbiBuYW1lIGZvciB0aGlzIG1hcHBpbmcuXG4gICAqL1xuICBTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLmFkZE1hcHBpbmcgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9hZGRNYXBwaW5nKGFBcmdzKSB7XG4gICAgICB2YXIgZ2VuZXJhdGVkID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdnZW5lcmF0ZWQnKTtcbiAgICAgIHZhciBvcmlnaW5hbCA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnb3JpZ2luYWwnLCBudWxsKTtcbiAgICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScsIG51bGwpO1xuICAgICAgdmFyIG5hbWUgPSB1dGlsLmdldEFyZyhhQXJncywgJ25hbWUnLCBudWxsKTtcblxuICAgICAgaWYgKCF0aGlzLl9za2lwVmFsaWRhdGlvbikge1xuICAgICAgICB0aGlzLl92YWxpZGF0ZU1hcHBpbmcoZ2VuZXJhdGVkLCBvcmlnaW5hbCwgc291cmNlLCBuYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNvdXJjZSAhPSBudWxsICYmICF0aGlzLl9zb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgIXRoaXMuX25hbWVzLmhhcyhuYW1lKSkge1xuICAgICAgICB0aGlzLl9uYW1lcy5hZGQobmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX21hcHBpbmdzLmFkZCh7XG4gICAgICAgIGdlbmVyYXRlZExpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IGdlbmVyYXRlZC5jb2x1bW4sXG4gICAgICAgIG9yaWdpbmFsTGluZTogb3JpZ2luYWwgIT0gbnVsbCAmJiBvcmlnaW5hbC5saW5lLFxuICAgICAgICBvcmlnaW5hbENvbHVtbjogb3JpZ2luYWwgIT0gbnVsbCAmJiBvcmlnaW5hbC5jb2x1bW4sXG4gICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICBuYW1lOiBuYW1lXG4gICAgICB9KTtcbiAgICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHNvdXJjZSBjb250ZW50IGZvciBhIHNvdXJjZSBmaWxlLlxuICAgKi9cbiAgU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5zZXRTb3VyY2VDb250ZW50ID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3Jfc2V0U291cmNlQ29udGVudChhU291cmNlRmlsZSwgYVNvdXJjZUNvbnRlbnQpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhU291cmNlRmlsZTtcbiAgICAgIGlmICh0aGlzLl9zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlID0gdXRpbC5yZWxhdGl2ZSh0aGlzLl9zb3VyY2VSb290LCBzb3VyY2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYVNvdXJjZUNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICAvLyBBZGQgdGhlIHNvdXJjZSBjb250ZW50IHRvIHRoZSBfc291cmNlc0NvbnRlbnRzIG1hcC5cbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IF9zb3VyY2VzQ29udGVudHMgbWFwIGlmIHRoZSBwcm9wZXJ0eSBpcyBudWxsLlxuICAgICAgICBpZiAoIXRoaXMuX3NvdXJjZXNDb250ZW50cykge1xuICAgICAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX3NvdXJjZXNDb250ZW50cykge1xuICAgICAgICAvLyBSZW1vdmUgdGhlIHNvdXJjZSBmaWxlIGZyb20gdGhlIF9zb3VyY2VzQ29udGVudHMgbWFwLlxuICAgICAgICAvLyBJZiB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAgaXMgZW1wdHksIHNldCB0aGUgcHJvcGVydHkgdG8gbnVsbC5cbiAgICAgICAgZGVsZXRlIHRoaXMuX3NvdXJjZXNDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSldO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fc291cmNlc0NvbnRlbnRzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLl9zb3VyY2VzQ29udGVudHMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAvKipcbiAgICogQXBwbGllcyB0aGUgbWFwcGluZ3Mgb2YgYSBzdWItc291cmNlLW1hcCBmb3IgYSBzcGVjaWZpYyBzb3VyY2UgZmlsZSB0byB0aGVcbiAgICogc291cmNlIG1hcCBiZWluZyBnZW5lcmF0ZWQuIEVhY2ggbWFwcGluZyB0byB0aGUgc3VwcGxpZWQgc291cmNlIGZpbGUgaXNcbiAgICogcmV3cml0dGVuIHVzaW5nIHRoZSBzdXBwbGllZCBzb3VyY2UgbWFwLiBOb3RlOiBUaGUgcmVzb2x1dGlvbiBmb3IgdGhlXG4gICAqIHJlc3VsdGluZyBtYXBwaW5ncyBpcyB0aGUgbWluaW1pdW0gb2YgdGhpcyBtYXAgYW5kIHRoZSBzdXBwbGllZCBtYXAuXG4gICAqXG4gICAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIHNvdXJjZSBtYXAgdG8gYmUgYXBwbGllZC5cbiAgICogQHBhcmFtIGFTb3VyY2VGaWxlIE9wdGlvbmFsLiBUaGUgZmlsZW5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlLlxuICAgKiAgICAgICAgSWYgb21pdHRlZCwgU291cmNlTWFwQ29uc3VtZXIncyBmaWxlIHByb3BlcnR5IHdpbGwgYmUgdXNlZC5cbiAgICogQHBhcmFtIGFTb3VyY2VNYXBQYXRoIE9wdGlvbmFsLiBUaGUgZGlybmFtZSBvZiB0aGUgcGF0aCB0byB0aGUgc291cmNlIG1hcFxuICAgKiAgICAgICAgdG8gYmUgYXBwbGllZC4gSWYgcmVsYXRpdmUsIGl0IGlzIHJlbGF0aXZlIHRvIHRoZSBTb3VyY2VNYXBDb25zdW1lci5cbiAgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIG5lZWRlZCB3aGVuIHRoZSB0d28gc291cmNlIG1hcHMgYXJlbid0IGluIHRoZSBzYW1lXG4gICAqICAgICAgICBkaXJlY3RvcnksIGFuZCB0aGUgc291cmNlIG1hcCB0byBiZSBhcHBsaWVkIGNvbnRhaW5zIHJlbGF0aXZlIHNvdXJjZVxuICAgKiAgICAgICAgcGF0aHMuIElmIHNvLCB0aG9zZSByZWxhdGl2ZSBzb3VyY2UgcGF0aHMgbmVlZCB0byBiZSByZXdyaXR0ZW5cbiAgICogICAgICAgIHJlbGF0aXZlIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gICAqL1xuICBTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLmFwcGx5U291cmNlTWFwID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfYXBwbHlTb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyLCBhU291cmNlRmlsZSwgYVNvdXJjZU1hcFBhdGgpIHtcbiAgICAgIHZhciBzb3VyY2VGaWxlID0gYVNvdXJjZUZpbGU7XG4gICAgICAvLyBJZiBhU291cmNlRmlsZSBpcyBvbWl0dGVkLCB3ZSB3aWxsIHVzZSB0aGUgZmlsZSBwcm9wZXJ0eSBvZiB0aGUgU291cmNlTWFwXG4gICAgICBpZiAoYVNvdXJjZUZpbGUgPT0gbnVsbCkge1xuICAgICAgICBpZiAoYVNvdXJjZU1hcENvbnN1bWVyLmZpbGUgPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLmFwcGx5U291cmNlTWFwIHJlcXVpcmVzIGVpdGhlciBhbiBleHBsaWNpdCBzb3VyY2UgZmlsZSwgJyArXG4gICAgICAgICAgICAnb3IgdGhlIHNvdXJjZSBtYXBcXCdzIFwiZmlsZVwiIHByb3BlcnR5LiBCb3RoIHdlcmUgb21pdHRlZC4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2VGaWxlID0gYVNvdXJjZU1hcENvbnN1bWVyLmZpbGU7XG4gICAgICB9XG4gICAgICB2YXIgc291cmNlUm9vdCA9IHRoaXMuX3NvdXJjZVJvb3Q7XG4gICAgICAvLyBNYWtlIFwic291cmNlRmlsZVwiIHJlbGF0aXZlIGlmIGFuIGFic29sdXRlIFVybCBpcyBwYXNzZWQuXG4gICAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZUZpbGUpO1xuICAgICAgfVxuICAgICAgLy8gQXBwbHlpbmcgdGhlIFNvdXJjZU1hcCBjYW4gYWRkIGFuZCByZW1vdmUgaXRlbXMgZnJvbSB0aGUgc291cmNlcyBhbmRcbiAgICAgIC8vIHRoZSBuYW1lcyBhcnJheS5cbiAgICAgIHZhciBuZXdTb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gICAgICB2YXIgbmV3TmFtZXMgPSBuZXcgQXJyYXlTZXQoKTtcblxuICAgICAgLy8gRmluZCBtYXBwaW5ncyBmb3IgdGhlIFwic291cmNlRmlsZVwiXG4gICAgICB0aGlzLl9tYXBwaW5ncy51bnNvcnRlZEZvckVhY2goZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgICAgaWYgKG1hcHBpbmcuc291cmNlID09PSBzb3VyY2VGaWxlICYmIG1hcHBpbmcub3JpZ2luYWxMaW5lICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiBpdCBjYW4gYmUgbWFwcGVkIGJ5IHRoZSBzb3VyY2UgbWFwLCB0aGVuIHVwZGF0ZSB0aGUgbWFwcGluZy5cbiAgICAgICAgICB2YXIgb3JpZ2luYWwgPSBhU291cmNlTWFwQ29uc3VtZXIub3JpZ2luYWxQb3NpdGlvbkZvcih7XG4gICAgICAgICAgICBsaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICAgIGNvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChvcmlnaW5hbC5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQ29weSBtYXBwaW5nXG4gICAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IG9yaWdpbmFsLnNvdXJjZTtcbiAgICAgICAgICAgIGlmIChhU291cmNlTWFwUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gdXRpbC5qb2luKGFTb3VyY2VNYXBQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID0gb3JpZ2luYWwubGluZTtcbiAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPSBvcmlnaW5hbC5jb2x1bW47XG4gICAgICAgICAgICBpZiAob3JpZ2luYWwubmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIG1hcHBpbmcubmFtZSA9IG9yaWdpbmFsLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBpZiAoc291cmNlICE9IG51bGwgJiYgIW5ld1NvdXJjZXMuaGFzKHNvdXJjZSkpIHtcbiAgICAgICAgICBuZXdTb3VyY2VzLmFkZChzb3VyY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG5hbWUgPSBtYXBwaW5nLm5hbWU7XG4gICAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgIW5ld05hbWVzLmhhcyhuYW1lKSkge1xuICAgICAgICAgIG5ld05hbWVzLmFkZChuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICB9LCB0aGlzKTtcbiAgICAgIHRoaXMuX3NvdXJjZXMgPSBuZXdTb3VyY2VzO1xuICAgICAgdGhpcy5fbmFtZXMgPSBuZXdOYW1lcztcblxuICAgICAgLy8gQ29weSBzb3VyY2VzQ29udGVudHMgb2YgYXBwbGllZCBtYXAuXG4gICAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICAgIGlmIChjb250ZW50ICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAoYVNvdXJjZU1hcFBhdGggIT0gbnVsbCkge1xuICAgICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwuam9pbihhU291cmNlTWFwUGF0aCwgc291cmNlRmlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZUZpbGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMpO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIEEgbWFwcGluZyBjYW4gaGF2ZSBvbmUgb2YgdGhlIHRocmVlIGxldmVscyBvZiBkYXRhOlxuICAgKlxuICAgKiAgIDEuIEp1c3QgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbi5cbiAgICogICAyLiBUaGUgR2VuZXJhdGVkIHBvc2l0aW9uLCBvcmlnaW5hbCBwb3NpdGlvbiwgYW5kIG9yaWdpbmFsIHNvdXJjZS5cbiAgICogICAzLiBHZW5lcmF0ZWQgYW5kIG9yaWdpbmFsIHBvc2l0aW9uLCBvcmlnaW5hbCBzb3VyY2UsIGFzIHdlbGwgYXMgYSBuYW1lXG4gICAqICAgICAgdG9rZW4uXG4gICAqXG4gICAqIFRvIG1haW50YWluIGNvbnNpc3RlbmN5LCB3ZSB2YWxpZGF0ZSB0aGF0IGFueSBuZXcgbWFwcGluZyBiZWluZyBhZGRlZCBmYWxsc1xuICAgKiBpbiB0byBvbmUgb2YgdGhlc2UgY2F0ZWdvcmllcy5cbiAgICovXG4gIFNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZhbGlkYXRlTWFwcGluZyA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3ZhbGlkYXRlTWFwcGluZyhhR2VuZXJhdGVkLCBhT3JpZ2luYWwsIGFTb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhTmFtZSkge1xuICAgICAgaWYgKGFHZW5lcmF0ZWQgJiYgJ2xpbmUnIGluIGFHZW5lcmF0ZWQgJiYgJ2NvbHVtbicgaW4gYUdlbmVyYXRlZFxuICAgICAgICAgICYmIGFHZW5lcmF0ZWQubGluZSA+IDAgJiYgYUdlbmVyYXRlZC5jb2x1bW4gPj0gMFxuICAgICAgICAgICYmICFhT3JpZ2luYWwgJiYgIWFTb3VyY2UgJiYgIWFOYW1lKSB7XG4gICAgICAgIC8vIENhc2UgMS5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoYUdlbmVyYXRlZCAmJiAnbGluZScgaW4gYUdlbmVyYXRlZCAmJiAnY29sdW1uJyBpbiBhR2VuZXJhdGVkXG4gICAgICAgICAgICAgICAmJiBhT3JpZ2luYWwgJiYgJ2xpbmUnIGluIGFPcmlnaW5hbCAmJiAnY29sdW1uJyBpbiBhT3JpZ2luYWxcbiAgICAgICAgICAgICAgICYmIGFHZW5lcmF0ZWQubGluZSA+IDAgJiYgYUdlbmVyYXRlZC5jb2x1bW4gPj0gMFxuICAgICAgICAgICAgICAgJiYgYU9yaWdpbmFsLmxpbmUgPiAwICYmIGFPcmlnaW5hbC5jb2x1bW4gPj0gMFxuICAgICAgICAgICAgICAgJiYgYVNvdXJjZSkge1xuICAgICAgICAvLyBDYXNlcyAyIGFuZCAzLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG1hcHBpbmc6ICcgKyBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgZ2VuZXJhdGVkOiBhR2VuZXJhdGVkLFxuICAgICAgICAgIHNvdXJjZTogYVNvdXJjZSxcbiAgICAgICAgICBvcmlnaW5hbDogYU9yaWdpbmFsLFxuICAgICAgICAgIG5hbWU6IGFOYW1lXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgdGhlIGFjY3VtdWxhdGVkIG1hcHBpbmdzIGluIHRvIHRoZSBzdHJlYW0gb2YgYmFzZSA2NCBWTFFzXG4gICAqIHNwZWNpZmllZCBieSB0aGUgc291cmNlIG1hcCBmb3JtYXQuXG4gICAqL1xuICBTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLl9zZXJpYWxpemVNYXBwaW5ncyA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3NlcmlhbGl6ZU1hcHBpbmdzKCkge1xuICAgICAgdmFyIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICAgIHZhciBwcmV2aW91c0dlbmVyYXRlZExpbmUgPSAxO1xuICAgICAgdmFyIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4gPSAwO1xuICAgICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICAgIHZhciBwcmV2aW91c05hbWUgPSAwO1xuICAgICAgdmFyIHByZXZpb3VzU291cmNlID0gMDtcbiAgICAgIHZhciByZXN1bHQgPSAnJztcbiAgICAgIHZhciBtYXBwaW5nO1xuXG4gICAgICB2YXIgbWFwcGluZ3MgPSB0aGlzLl9tYXBwaW5ncy50b0FycmF5KCk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBtYXBwaW5ncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBtYXBwaW5nID0gbWFwcGluZ3NbaV07XG5cbiAgICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSAhPT0gcHJldmlvdXNHZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgICAgIHdoaWxlIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgICAgcmVzdWx0ICs9ICc7JztcbiAgICAgICAgICAgIHByZXZpb3VzR2VuZXJhdGVkTGluZSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgIGlmICghdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnMobWFwcGluZywgbWFwcGluZ3NbaSAtIDFdKSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCArPSAnLCc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwcmV2aW91c0dlbmVyYXRlZENvbHVtbik7XG4gICAgICAgIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG5cbiAgICAgICAgaWYgKG1hcHBpbmcuc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgICByZXN1bHQgKz0gYmFzZTY0VkxRLmVuY29kZSh0aGlzLl9zb3VyY2VzLmluZGV4T2YobWFwcGluZy5zb3VyY2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwcmV2aW91c1NvdXJjZSk7XG4gICAgICAgICAgcHJldmlvdXNTb3VyY2UgPSB0aGlzLl9zb3VyY2VzLmluZGV4T2YobWFwcGluZy5zb3VyY2UpO1xuXG4gICAgICAgICAgLy8gbGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkIGluIFNvdXJjZU1hcCBzcGVjIHZlcnNpb24gM1xuICAgICAgICAgIHJlc3VsdCArPSBiYXNlNjRWTFEuZW5jb2RlKG1hcHBpbmcub3JpZ2luYWxMaW5lIC0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNPcmlnaW5hbExpbmUpO1xuICAgICAgICAgIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmUgLSAxO1xuXG4gICAgICAgICAgcmVzdWx0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNPcmlnaW5hbENvbHVtbik7XG4gICAgICAgICAgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IG1hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgICBpZiAobWFwcGluZy5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBiYXNlNjRWTFEuZW5jb2RlKHRoaXMuX25hbWVzLmluZGV4T2YobWFwcGluZy5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwcmV2aW91c05hbWUpO1xuICAgICAgICAgICAgcHJldmlvdXNOYW1lID0gdGhpcy5fbmFtZXMuaW5kZXhPZihtYXBwaW5nLm5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fZ2VuZXJhdGVTb3VyY2VzQ29udGVudCA9XG4gICAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2dlbmVyYXRlU291cmNlc0NvbnRlbnQoYVNvdXJjZXMsIGFTb3VyY2VSb290KSB7XG4gICAgICByZXR1cm4gYVNvdXJjZXMubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYVNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZSA9IHV0aWwucmVsYXRpdmUoYVNvdXJjZVJvb3QsIHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGtleSA9IHV0aWwudG9TZXRTdHJpbmcoc291cmNlKTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLl9zb3VyY2VzQ29udGVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5KVxuICAgICAgICAgID8gdGhpcy5fc291cmNlc0NvbnRlbnRzW2tleV1cbiAgICAgICAgICA6IG51bGw7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9O1xuXG4gIC8qKlxuICAgKiBFeHRlcm5hbGl6ZSB0aGUgc291cmNlIG1hcC5cbiAgICovXG4gIFNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUudG9KU09OID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfdG9KU09OKCkge1xuICAgICAgdmFyIG1hcCA9IHtcbiAgICAgICAgdmVyc2lvbjogdGhpcy5fdmVyc2lvbixcbiAgICAgICAgc291cmNlczogdGhpcy5fc291cmNlcy50b0FycmF5KCksXG4gICAgICAgIG5hbWVzOiB0aGlzLl9uYW1lcy50b0FycmF5KCksXG4gICAgICAgIG1hcHBpbmdzOiB0aGlzLl9zZXJpYWxpemVNYXBwaW5ncygpXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMuX2ZpbGUgIT0gbnVsbCkge1xuICAgICAgICBtYXAuZmlsZSA9IHRoaXMuX2ZpbGU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgIG1hcC5zb3VyY2VSb290ID0gdGhpcy5fc291cmNlUm9vdDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgICAgbWFwLnNvdXJjZXNDb250ZW50ID0gdGhpcy5fZ2VuZXJhdGVTb3VyY2VzQ29udGVudChtYXAuc291cmNlcywgbWFwLnNvdXJjZVJvb3QpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWFwO1xuICAgIH07XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgc291cmNlIG1hcCBiZWluZyBnZW5lcmF0ZWQgdG8gYSBzdHJpbmcuXG4gICAqL1xuICBTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLnRvU3RyaW5nID1cbiAgICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfdG9TdHJpbmcoKSB7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyk7XG4gICAgfTtcblxuICBleHBvcnRzLlNvdXJjZU1hcEdlbmVyYXRvciA9IFNvdXJjZU1hcEdlbmVyYXRvcjtcblxufSk7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5pZiAodHlwZW9mIGRlZmluZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBkZWZpbmUgPSByZXF1aXJlKCdhbWRlZmluZScpKG1vZHVsZSwgcmVxdWlyZSk7XG59XG5kZWZpbmUoZnVuY3Rpb24gKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkge1xuXG4gIHZhciBTb3VyY2VNYXBHZW5lcmF0b3IgPSByZXF1aXJlKCcuL3NvdXJjZS1tYXAtZ2VuZXJhdG9yJykuU291cmNlTWFwR2VuZXJhdG9yO1xuICB2YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG4gIC8vIE1hdGNoZXMgYSBXaW5kb3dzLXN0eWxlIGBcXHJcXG5gIG5ld2xpbmUgb3IgYSBgXFxuYCBuZXdsaW5lIHVzZWQgYnkgYWxsIG90aGVyXG4gIC8vIG9wZXJhdGluZyBzeXN0ZW1zIHRoZXNlIGRheXMgKGNhcHR1cmluZyB0aGUgcmVzdWx0KS5cbiAgdmFyIFJFR0VYX05FV0xJTkUgPSAvKFxccj9cXG4pLztcblxuICAvLyBOZXdsaW5lIGNoYXJhY3RlciBjb2RlIGZvciBjaGFyQ29kZUF0KCkgY29tcGFyaXNvbnNcbiAgdmFyIE5FV0xJTkVfQ09ERSA9IDEwO1xuXG4gIC8vIFByaXZhdGUgc3ltYm9sIGZvciBpZGVudGlmeWluZyBgU291cmNlTm9kZWBzIHdoZW4gbXVsdGlwbGUgdmVyc2lvbnMgb2ZcbiAgLy8gdGhlIHNvdXJjZS1tYXAgbGlicmFyeSBhcmUgbG9hZGVkLiBUaGlzIE1VU1QgTk9UIENIQU5HRSBhY3Jvc3NcbiAgLy8gdmVyc2lvbnMhXG4gIHZhciBpc1NvdXJjZU5vZGUgPSBcIiQkJGlzU291cmNlTm9kZSQkJFwiO1xuXG4gIC8qKlxuICAgKiBTb3VyY2VOb2RlcyBwcm92aWRlIGEgd2F5IHRvIGFic3RyYWN0IG92ZXIgaW50ZXJwb2xhdGluZy9jb25jYXRlbmF0aW5nXG4gICAqIHNuaXBwZXRzIG9mIGdlbmVyYXRlZCBKYXZhU2NyaXB0IHNvdXJjZSBjb2RlIHdoaWxlIG1haW50YWluaW5nIHRoZSBsaW5lIGFuZFxuICAgKiBjb2x1bW4gaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29kZS5cbiAgICpcbiAgICogQHBhcmFtIGFMaW5lIFRoZSBvcmlnaW5hbCBsaW5lIG51bWJlci5cbiAgICogQHBhcmFtIGFDb2x1bW4gVGhlIG9yaWdpbmFsIGNvbHVtbiBudW1iZXIuXG4gICAqIEBwYXJhbSBhU291cmNlIFRoZSBvcmlnaW5hbCBzb3VyY2UncyBmaWxlbmFtZS5cbiAgICogQHBhcmFtIGFDaHVua3MgT3B0aW9uYWwuIEFuIGFycmF5IG9mIHN0cmluZ3Mgd2hpY2ggYXJlIHNuaXBwZXRzIG9mXG4gICAqICAgICAgICBnZW5lcmF0ZWQgSlMsIG9yIG90aGVyIFNvdXJjZU5vZGVzLlxuICAgKiBAcGFyYW0gYU5hbWUgVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIuXG4gICAqL1xuICBmdW5jdGlvbiBTb3VyY2VOb2RlKGFMaW5lLCBhQ29sdW1uLCBhU291cmNlLCBhQ2h1bmtzLCBhTmFtZSkge1xuICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICB0aGlzLnNvdXJjZUNvbnRlbnRzID0ge307XG4gICAgdGhpcy5saW5lID0gYUxpbmUgPT0gbnVsbCA/IG51bGwgOiBhTGluZTtcbiAgICB0aGlzLmNvbHVtbiA9IGFDb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBhQ29sdW1uO1xuICAgIHRoaXMuc291cmNlID0gYVNvdXJjZSA9PSBudWxsID8gbnVsbCA6IGFTb3VyY2U7XG4gICAgdGhpcy5uYW1lID0gYU5hbWUgPT0gbnVsbCA/IG51bGwgOiBhTmFtZTtcbiAgICB0aGlzW2lzU291cmNlTm9kZV0gPSB0cnVlO1xuICAgIGlmIChhQ2h1bmtzICE9IG51bGwpIHRoaXMuYWRkKGFDaHVua3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBTb3VyY2VOb2RlIGZyb20gZ2VuZXJhdGVkIGNvZGUgYW5kIGEgU291cmNlTWFwQ29uc3VtZXIuXG4gICAqXG4gICAqIEBwYXJhbSBhR2VuZXJhdGVkQ29kZSBUaGUgZ2VuZXJhdGVkIGNvZGVcbiAgICogQHBhcmFtIGFTb3VyY2VNYXBDb25zdW1lciBUaGUgU291cmNlTWFwIGZvciB0aGUgZ2VuZXJhdGVkIGNvZGVcbiAgICogQHBhcmFtIGFSZWxhdGl2ZVBhdGggT3B0aW9uYWwuIFRoZSBwYXRoIHRoYXQgcmVsYXRpdmUgc291cmNlcyBpbiB0aGVcbiAgICogICAgICAgIFNvdXJjZU1hcENvbnN1bWVyIHNob3VsZCBiZSByZWxhdGl2ZSB0by5cbiAgICovXG4gIFNvdXJjZU5vZGUuZnJvbVN0cmluZ1dpdGhTb3VyY2VNYXAgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU5vZGVfZnJvbVN0cmluZ1dpdGhTb3VyY2VNYXAoYUdlbmVyYXRlZENvZGUsIGFTb3VyY2VNYXBDb25zdW1lciwgYVJlbGF0aXZlUGF0aCkge1xuICAgICAgLy8gVGhlIFNvdXJjZU5vZGUgd2Ugd2FudCB0byBmaWxsIHdpdGggdGhlIGdlbmVyYXRlZCBjb2RlXG4gICAgICAvLyBhbmQgdGhlIFNvdXJjZU1hcFxuICAgICAgdmFyIG5vZGUgPSBuZXcgU291cmNlTm9kZSgpO1xuXG4gICAgICAvLyBBbGwgZXZlbiBpbmRpY2VzIG9mIHRoaXMgYXJyYXkgYXJlIG9uZSBsaW5lIG9mIHRoZSBnZW5lcmF0ZWQgY29kZSxcbiAgICAgIC8vIHdoaWxlIGFsbCBvZGQgaW5kaWNlcyBhcmUgdGhlIG5ld2xpbmVzIGJldHdlZW4gdHdvIGFkamFjZW50IGxpbmVzXG4gICAgICAvLyAoc2luY2UgYFJFR0VYX05FV0xJTkVgIGNhcHR1cmVzIGl0cyBtYXRjaCkuXG4gICAgICAvLyBQcm9jZXNzZWQgZnJhZ21lbnRzIGFyZSByZW1vdmVkIGZyb20gdGhpcyBhcnJheSwgYnkgY2FsbGluZyBgc2hpZnROZXh0TGluZWAuXG4gICAgICB2YXIgcmVtYWluaW5nTGluZXMgPSBhR2VuZXJhdGVkQ29kZS5zcGxpdChSRUdFWF9ORVdMSU5FKTtcbiAgICAgIHZhciBzaGlmdE5leHRMaW5lID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBsaW5lQ29udGVudHMgPSByZW1haW5pbmdMaW5lcy5zaGlmdCgpO1xuICAgICAgICAvLyBUaGUgbGFzdCBsaW5lIG9mIGEgZmlsZSBtaWdodCBub3QgaGF2ZSBhIG5ld2xpbmUuXG4gICAgICAgIHZhciBuZXdMaW5lID0gcmVtYWluaW5nTGluZXMuc2hpZnQoKSB8fCBcIlwiO1xuICAgICAgICByZXR1cm4gbGluZUNvbnRlbnRzICsgbmV3TGluZTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIHBvc2l0aW9uIG9mIFwicmVtYWluaW5nTGluZXNcIlxuICAgICAgdmFyIGxhc3RHZW5lcmF0ZWRMaW5lID0gMSwgbGFzdEdlbmVyYXRlZENvbHVtbiA9IDA7XG5cbiAgICAgIC8vIFRoZSBnZW5lcmF0ZSBTb3VyY2VOb2RlcyB3ZSBuZWVkIGEgY29kZSByYW5nZS5cbiAgICAgIC8vIFRvIGV4dHJhY3QgaXQgY3VycmVudCBhbmQgbGFzdCBtYXBwaW5nIGlzIHVzZWQuXG4gICAgICAvLyBIZXJlIHdlIHN0b3JlIHRoZSBsYXN0IG1hcHBpbmcuXG4gICAgICB2YXIgbGFzdE1hcHBpbmcgPSBudWxsO1xuXG4gICAgICBhU291cmNlTWFwQ29uc3VtZXIuZWFjaE1hcHBpbmcoZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgICAgaWYgKGxhc3RNYXBwaW5nICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UgYWRkIHRoZSBjb2RlIGZyb20gXCJsYXN0TWFwcGluZ1wiIHRvIFwibWFwcGluZ1wiOlxuICAgICAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIHRoZXJlIGlzIGEgbmV3IGxpbmUgaW4gYmV0d2Vlbi5cbiAgICAgICAgICBpZiAobGFzdEdlbmVyYXRlZExpbmUgPCBtYXBwaW5nLmdlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgICAgIHZhciBjb2RlID0gXCJcIjtcbiAgICAgICAgICAgIC8vIEFzc29jaWF0ZSBmaXJzdCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgICBhZGRNYXBwaW5nV2l0aENvZGUobGFzdE1hcHBpbmcsIHNoaWZ0TmV4dExpbmUoKSk7XG4gICAgICAgICAgICBsYXN0R2VuZXJhdGVkTGluZSsrO1xuICAgICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgICAgICAvLyBUaGUgcmVtYWluaW5nIGNvZGUgaXMgYWRkZWQgd2l0aG91dCBtYXBwaW5nXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgICAgICAvLyBBc3NvY2lhdGUgdGhlIGNvZGUgYmV0d2VlbiBcImxhc3RHZW5lcmF0ZWRDb2x1bW5cIiBhbmRcbiAgICAgICAgICAgIC8vIFwibWFwcGluZy5nZW5lcmF0ZWRDb2x1bW5cIiB3aXRoIFwibGFzdE1hcHBpbmdcIlxuICAgICAgICAgICAgdmFyIG5leHRMaW5lID0gcmVtYWluaW5nTGluZXNbMF07XG4gICAgICAgICAgICB2YXIgY29kZSA9IG5leHRMaW5lLnN1YnN0cigwLCBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgICAgICAgIHJlbWFpbmluZ0xpbmVzWzBdID0gbmV4dExpbmUuc3Vic3RyKG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uO1xuICAgICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBjb2RlKTtcbiAgICAgICAgICAgIC8vIE5vIG1vcmUgcmVtYWluaW5nIGNvZGUsIGNvbnRpbnVlXG4gICAgICAgICAgICBsYXN0TWFwcGluZyA9IG1hcHBpbmc7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGFkZCB0aGUgZ2VuZXJhdGVkIGNvZGUgdW50aWwgdGhlIGZpcnN0IG1hcHBpbmdcbiAgICAgICAgLy8gdG8gdGhlIFNvdXJjZU5vZGUgd2l0aG91dCBhbnkgbWFwcGluZy5cbiAgICAgICAgLy8gRWFjaCBsaW5lIGlzIGFkZGVkIGFzIHNlcGFyYXRlIHN0cmluZy5cbiAgICAgICAgd2hpbGUgKGxhc3RHZW5lcmF0ZWRMaW5lIDwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgbm9kZS5hZGQoc2hpZnROZXh0TGluZSgpKTtcbiAgICAgICAgICBsYXN0R2VuZXJhdGVkTGluZSsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXN0R2VuZXJhdGVkQ29sdW1uIDwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pIHtcbiAgICAgICAgICB2YXIgbmV4dExpbmUgPSByZW1haW5pbmdMaW5lc1swXTtcbiAgICAgICAgICBub2RlLmFkZChuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pKTtcbiAgICAgICAgICByZW1haW5pbmdMaW5lc1swXSA9IG5leHRMaW5lLnN1YnN0cihtYXBwaW5nLmdlbmVyYXRlZENvbHVtbik7XG4gICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RNYXBwaW5nID0gbWFwcGluZztcbiAgICAgIH0sIHRoaXMpO1xuICAgICAgLy8gV2UgaGF2ZSBwcm9jZXNzZWQgYWxsIG1hcHBpbmdzLlxuICAgICAgaWYgKHJlbWFpbmluZ0xpbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKGxhc3RNYXBwaW5nKSB7XG4gICAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSByZW1haW5pbmcgY29kZSBpbiB0aGUgY3VycmVudCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBzaGlmdE5leHRMaW5lKCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFuZCBhZGQgdGhlIHJlbWFpbmluZyBsaW5lcyB3aXRob3V0IGFueSBtYXBwaW5nXG4gICAgICAgIG5vZGUuYWRkKHJlbWFpbmluZ0xpbmVzLmpvaW4oXCJcIikpO1xuICAgICAgfVxuXG4gICAgICAvLyBDb3B5IHNvdXJjZXNDb250ZW50IGludG8gU291cmNlTm9kZVxuICAgICAgYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlRmlsZSkge1xuICAgICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKGFSZWxhdGl2ZVBhdGggIT0gbnVsbCkge1xuICAgICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZS5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG5vZGU7XG5cbiAgICAgIGZ1bmN0aW9uIGFkZE1hcHBpbmdXaXRoQ29kZShtYXBwaW5nLCBjb2RlKSB7XG4gICAgICAgIGlmIChtYXBwaW5nID09PSBudWxsIHx8IG1hcHBpbmcuc291cmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBub2RlLmFkZChjb2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc291cmNlID0gYVJlbGF0aXZlUGF0aFxuICAgICAgICAgICAgPyB1dGlsLmpvaW4oYVJlbGF0aXZlUGF0aCwgbWFwcGluZy5zb3VyY2UpXG4gICAgICAgICAgICA6IG1hcHBpbmcuc291cmNlO1xuICAgICAgICAgIG5vZGUuYWRkKG5ldyBTb3VyY2VOb2RlKG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZy5uYW1lKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBjaHVuayBvZiBnZW5lcmF0ZWQgSlMgdG8gdGhpcyBzb3VyY2Ugbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIGFDaHVuayBBIHN0cmluZyBzbmlwcGV0IG9mIGdlbmVyYXRlZCBKUyBjb2RlLCBhbm90aGVyIGluc3RhbmNlIG9mXG4gICAqICAgICAgICBTb3VyY2VOb2RlLCBvciBhbiBhcnJheSB3aGVyZSBlYWNoIG1lbWJlciBpcyBvbmUgb2YgdGhvc2UgdGhpbmdzLlxuICAgKi9cbiAgU291cmNlTm9kZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gU291cmNlTm9kZV9hZGQoYUNodW5rKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYUNodW5rKSkge1xuICAgICAgYUNodW5rLmZvckVhY2goZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgIHRoaXMuYWRkKGNodW5rKTtcbiAgICAgIH0sIHRoaXMpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAoYUNodW5rKSB7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChhQ2h1bmspO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIFwiRXhwZWN0ZWQgYSBTb3VyY2VOb2RlLCBzdHJpbmcsIG9yIGFuIGFycmF5IG9mIFNvdXJjZU5vZGVzIGFuZCBzdHJpbmdzLiBHb3QgXCIgKyBhQ2h1bmtcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBjaHVuayBvZiBnZW5lcmF0ZWQgSlMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGlzIHNvdXJjZSBub2RlLlxuICAgKlxuICAgKiBAcGFyYW0gYUNodW5rIEEgc3RyaW5nIHNuaXBwZXQgb2YgZ2VuZXJhdGVkIEpTIGNvZGUsIGFub3RoZXIgaW5zdGFuY2Ugb2ZcbiAgICogICAgICAgIFNvdXJjZU5vZGUsIG9yIGFuIGFycmF5IHdoZXJlIGVhY2ggbWVtYmVyIGlzIG9uZSBvZiB0aG9zZSB0aGluZ3MuXG4gICAqL1xuICBTb3VyY2VOb2RlLnByb3RvdHlwZS5wcmVwZW5kID0gZnVuY3Rpb24gU291cmNlTm9kZV9wcmVwZW5kKGFDaHVuaykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFDaHVuaykpIHtcbiAgICAgIGZvciAodmFyIGkgPSBhQ2h1bmsubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHRoaXMucHJlcGVuZChhQ2h1bmtbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aGlzLmNoaWxkcmVuLnVuc2hpZnQoYUNodW5rKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBcIkV4cGVjdGVkIGEgU291cmNlTm9kZSwgc3RyaW5nLCBvciBhbiBhcnJheSBvZiBTb3VyY2VOb2RlcyBhbmQgc3RyaW5ncy4gR290IFwiICsgYUNodW5rXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogV2FsayBvdmVyIHRoZSB0cmVlIG9mIEpTIHNuaXBwZXRzIGluIHRoaXMgbm9kZSBhbmQgaXRzIGNoaWxkcmVuLiBUaGVcbiAgICogd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBzbmlwcGV0IG9mIEpTIGFuZCBpcyBwYXNzZWQgdGhhdFxuICAgKiBzbmlwcGV0IGFuZCB0aGUgaXRzIG9yaWdpbmFsIGFzc29jaWF0ZWQgc291cmNlJ3MgbGluZS9jb2x1bW4gbG9jYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAgICovXG4gIFNvdXJjZU5vZGUucHJvdG90eXBlLndhbGsgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3dhbGsoYUZuKSB7XG4gICAgdmFyIGNodW5rO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjaHVuayA9IHRoaXMuY2hpbGRyZW5baV07XG4gICAgICBpZiAoY2h1bmtbaXNTb3VyY2VOb2RlXSkge1xuICAgICAgICBjaHVuay53YWxrKGFGbik7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGNodW5rICE9PSAnJykge1xuICAgICAgICAgIGFGbihjaHVuaywgeyBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogTGlrZSBgU3RyaW5nLnByb3RvdHlwZS5qb2luYCBleGNlcHQgZm9yIFNvdXJjZU5vZGVzLiBJbnNlcnRzIGBhU3RyYCBiZXR3ZWVuXG4gICAqIGVhY2ggb2YgYHRoaXMuY2hpbGRyZW5gLlxuICAgKlxuICAgKiBAcGFyYW0gYVNlcCBUaGUgc2VwYXJhdG9yLlxuICAgKi9cbiAgU291cmNlTm9kZS5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfam9pbihhU2VwKSB7XG4gICAgdmFyIG5ld0NoaWxkcmVuO1xuICAgIHZhciBpO1xuICAgIHZhciBsZW4gPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDtcbiAgICBpZiAobGVuID4gMCkge1xuICAgICAgbmV3Q2hpbGRyZW4gPSBbXTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW4tMTsgaSsrKSB7XG4gICAgICAgIG5ld0NoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlbltpXSk7XG4gICAgICAgIG5ld0NoaWxkcmVuLnB1c2goYVNlcCk7XG4gICAgICB9XG4gICAgICBuZXdDaGlsZHJlbi5wdXNoKHRoaXMuY2hpbGRyZW5baV0pO1xuICAgICAgdGhpcy5jaGlsZHJlbiA9IG5ld0NoaWxkcmVuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogQ2FsbCBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2Ugb24gdGhlIHZlcnkgcmlnaHQtbW9zdCBzb3VyY2Ugc25pcHBldC4gVXNlZnVsXG4gICAqIGZvciB0cmltbWluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIGVuZCBvZiBhIHNvdXJjZSBub2RlLCBldGMuXG4gICAqXG4gICAqIEBwYXJhbSBhUGF0dGVybiBUaGUgcGF0dGVybiB0byByZXBsYWNlLlxuICAgKiBAcGFyYW0gYVJlcGxhY2VtZW50IFRoZSB0aGluZyB0byByZXBsYWNlIHRoZSBwYXR0ZXJuIHdpdGguXG4gICAqL1xuICBTb3VyY2VOb2RlLnByb3RvdHlwZS5yZXBsYWNlUmlnaHQgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3JlcGxhY2VSaWdodChhUGF0dGVybiwgYVJlcGxhY2VtZW50KSB7XG4gICAgdmFyIGxhc3RDaGlsZCA9IHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgICBpZiAobGFzdENoaWxkW2lzU291cmNlTm9kZV0pIHtcbiAgICAgIGxhc3RDaGlsZC5yZXBsYWNlUmlnaHQoYVBhdHRlcm4sIGFSZXBsYWNlbWVudCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBsYXN0Q2hpbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMV0gPSBsYXN0Q2hpbGQucmVwbGFjZShhUGF0dGVybiwgYVJlcGxhY2VtZW50KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmNoaWxkcmVuLnB1c2goJycucmVwbGFjZShhUGF0dGVybiwgYVJlcGxhY2VtZW50KSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHNvdXJjZSBjb250ZW50IGZvciBhIHNvdXJjZSBmaWxlLiBUaGlzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIFNvdXJjZU1hcEdlbmVyYXRvclxuICAgKiBpbiB0aGUgc291cmNlc0NvbnRlbnQgZmllbGQuXG4gICAqXG4gICAqIEBwYXJhbSBhU291cmNlRmlsZSBUaGUgZmlsZW5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlXG4gICAqIEBwYXJhbSBhU291cmNlQ29udGVudCBUaGUgY29udGVudCBvZiB0aGUgc291cmNlIGZpbGVcbiAgICovXG4gIFNvdXJjZU5vZGUucHJvdG90eXBlLnNldFNvdXJjZUNvbnRlbnQgPVxuICAgIGZ1bmN0aW9uIFNvdXJjZU5vZGVfc2V0U291cmNlQ29udGVudChhU291cmNlRmlsZSwgYVNvdXJjZUNvbnRlbnQpIHtcbiAgICAgIHRoaXMuc291cmNlQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhhU291cmNlRmlsZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gICAgfTtcblxuICAvKipcbiAgICogV2FsayBvdmVyIHRoZSB0cmVlIG9mIFNvdXJjZU5vZGVzLiBUaGUgd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2hcbiAgICogc291cmNlIGZpbGUgY29udGVudCBhbmQgaXMgcGFzc2VkIHRoZSBmaWxlbmFtZSBhbmQgc291cmNlIGNvbnRlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAgICovXG4gIFNvdXJjZU5vZGUucHJvdG90eXBlLndhbGtTb3VyY2VDb250ZW50cyA9XG4gICAgZnVuY3Rpb24gU291cmNlTm9kZV93YWxrU291cmNlQ29udGVudHMoYUZuKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbltpXVtpc1NvdXJjZU5vZGVdKSB7XG4gICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS53YWxrU291cmNlQ29udGVudHMoYUZuKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgc291cmNlcyA9IE9iamVjdC5rZXlzKHRoaXMuc291cmNlQ29udGVudHMpO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHNvdXJjZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgYUZuKHV0aWwuZnJvbVNldFN0cmluZyhzb3VyY2VzW2ldKSwgdGhpcy5zb3VyY2VDb250ZW50c1tzb3VyY2VzW2ldXSk7XG4gICAgICB9XG4gICAgfTtcblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzb3VyY2Ugbm9kZS4gV2Fsa3Mgb3ZlciB0aGUgdHJlZVxuICAgKiBhbmQgY29uY2F0ZW5hdGVzIGFsbCB0aGUgdmFyaW91cyBzbmlwcGV0cyB0b2dldGhlciB0byBvbmUgc3RyaW5nLlxuICAgKi9cbiAgU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3RvU3RyaW5nKCkge1xuICAgIHZhciBzdHIgPSBcIlwiO1xuICAgIHRoaXMud2FsayhmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgIHN0ciArPSBjaHVuaztcbiAgICB9KTtcbiAgICByZXR1cm4gc3RyO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzb3VyY2Ugbm9kZSBhbG9uZyB3aXRoIGEgc291cmNlXG4gICAqIG1hcC5cbiAgICovXG4gIFNvdXJjZU5vZGUucHJvdG90eXBlLnRvU3RyaW5nV2l0aFNvdXJjZU1hcCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfdG9TdHJpbmdXaXRoU291cmNlTWFwKGFBcmdzKSB7XG4gICAgdmFyIGdlbmVyYXRlZCA9IHtcbiAgICAgIGNvZGU6IFwiXCIsXG4gICAgICBsaW5lOiAxLFxuICAgICAgY29sdW1uOiAwXG4gICAgfTtcbiAgICB2YXIgbWFwID0gbmV3IFNvdXJjZU1hcEdlbmVyYXRvcihhQXJncyk7XG4gICAgdmFyIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICB2YXIgbGFzdE9yaWdpbmFsU291cmNlID0gbnVsbDtcbiAgICB2YXIgbGFzdE9yaWdpbmFsTGluZSA9IG51bGw7XG4gICAgdmFyIGxhc3RPcmlnaW5hbENvbHVtbiA9IG51bGw7XG4gICAgdmFyIGxhc3RPcmlnaW5hbE5hbWUgPSBudWxsO1xuICAgIHRoaXMud2FsayhmdW5jdGlvbiAoY2h1bmssIG9yaWdpbmFsKSB7XG4gICAgICBnZW5lcmF0ZWQuY29kZSArPSBjaHVuaztcbiAgICAgIGlmIChvcmlnaW5hbC5zb3VyY2UgIT09IG51bGxcbiAgICAgICAgICAmJiBvcmlnaW5hbC5saW5lICE9PSBudWxsXG4gICAgICAgICAgJiYgb3JpZ2luYWwuY29sdW1uICE9PSBudWxsKSB7XG4gICAgICAgIGlmKGxhc3RPcmlnaW5hbFNvdXJjZSAhPT0gb3JpZ2luYWwuc291cmNlXG4gICAgICAgICAgIHx8IGxhc3RPcmlnaW5hbExpbmUgIT09IG9yaWdpbmFsLmxpbmVcbiAgICAgICAgICAgfHwgbGFzdE9yaWdpbmFsQ29sdW1uICE9PSBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgICAgfHwgbGFzdE9yaWdpbmFsTmFtZSAhPT0gb3JpZ2luYWwubmFtZSkge1xuICAgICAgICAgIG1hcC5hZGRNYXBwaW5nKHtcbiAgICAgICAgICAgIHNvdXJjZTogb3JpZ2luYWwuc291cmNlLFxuICAgICAgICAgICAgb3JpZ2luYWw6IHtcbiAgICAgICAgICAgICAgbGluZTogb3JpZ2luYWwubGluZSxcbiAgICAgICAgICAgICAgY29sdW1uOiBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICAgICAgbGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkLmNvbHVtblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5hbWU6IG9yaWdpbmFsLm5hbWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICAgIGxhc3RPcmlnaW5hbExpbmUgPSBvcmlnaW5hbC5saW5lO1xuICAgICAgICBsYXN0T3JpZ2luYWxDb2x1bW4gPSBvcmlnaW5hbC5jb2x1bW47XG4gICAgICAgIGxhc3RPcmlnaW5hbE5hbWUgPSBvcmlnaW5hbC5uYW1lO1xuICAgICAgICBzb3VyY2VNYXBwaW5nQWN0aXZlID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoc291cmNlTWFwcGluZ0FjdGl2ZSkge1xuICAgICAgICBtYXAuYWRkTWFwcGluZyh7XG4gICAgICAgICAgZ2VuZXJhdGVkOiB7XG4gICAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkLmNvbHVtblxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gICAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbmd0aCA9IGNodW5rLmxlbmd0aDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykge1xuICAgICAgICBpZiAoY2h1bmsuY2hhckNvZGVBdChpZHgpID09PSBORVdMSU5FX0NPREUpIHtcbiAgICAgICAgICBnZW5lcmF0ZWQubGluZSsrO1xuICAgICAgICAgIGdlbmVyYXRlZC5jb2x1bW4gPSAwO1xuICAgICAgICAgIC8vIE1hcHBpbmdzIGVuZCBhdCBlb2xcbiAgICAgICAgICBpZiAoaWR4ICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBudWxsO1xuICAgICAgICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlTWFwcGluZ0FjdGl2ZSkge1xuICAgICAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgICAgICBzb3VyY2U6IG9yaWdpbmFsLnNvdXJjZSxcbiAgICAgICAgICAgICAgb3JpZ2luYWw6IHtcbiAgICAgICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgICAgIGNvbHVtbjogb3JpZ2luYWwuY29sdW1uXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkLmNvbHVtblxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBuYW1lOiBvcmlnaW5hbC5uYW1lXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ2VuZXJhdGVkLmNvbHVtbisrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy53YWxrU291cmNlQ29udGVudHMoZnVuY3Rpb24gKHNvdXJjZUZpbGUsIHNvdXJjZUNvbnRlbnQpIHtcbiAgICAgIG1hcC5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIHNvdXJjZUNvbnRlbnQpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgY29kZTogZ2VuZXJhdGVkLmNvZGUsIG1hcDogbWFwIH07XG4gIH07XG5cbiAgZXhwb3J0cy5Tb3VyY2VOb2RlID0gU291cmNlTm9kZTtcblxufSk7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5pZiAodHlwZW9mIGRlZmluZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBkZWZpbmUgPSByZXF1aXJlKCdhbWRlZmluZScpKG1vZHVsZSwgcmVxdWlyZSk7XG59XG5kZWZpbmUoZnVuY3Rpb24gKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSkge1xuXG4gIC8qKlxuICAgKiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHZhbHVlcyBmcm9tIHBhcmFtZXRlci9vcHRpb25zXG4gICAqIG9iamVjdHMuXG4gICAqXG4gICAqIEBwYXJhbSBhcmdzIFRoZSBvYmplY3Qgd2UgYXJlIGV4dHJhY3RpbmcgdmFsdWVzIGZyb21cbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHdlIGFyZSBnZXR0aW5nLlxuICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIEFuIG9wdGlvbmFsIHZhbHVlIHRvIHJldHVybiBpZiB0aGUgcHJvcGVydHkgaXMgbWlzc2luZ1xuICAgKiBmcm9tIHRoZSBvYmplY3QuIElmIHRoaXMgaXMgbm90IHNwZWNpZmllZCBhbmQgdGhlIHByb3BlcnR5IGlzIG1pc3NpbmcsIGFuXG4gICAqIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXJnKGFBcmdzLCBhTmFtZSwgYURlZmF1bHRWYWx1ZSkge1xuICAgIGlmIChhTmFtZSBpbiBhQXJncykge1xuICAgICAgcmV0dXJuIGFBcmdzW2FOYW1lXTtcbiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICAgIHJldHVybiBhRGVmYXVsdFZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFOYW1lICsgJ1wiIGlzIGEgcmVxdWlyZWQgYXJndW1lbnQuJyk7XG4gICAgfVxuICB9XG4gIGV4cG9ydHMuZ2V0QXJnID0gZ2V0QXJnO1xuXG4gIHZhciB1cmxSZWdleHAgPSAvXig/OihbXFx3K1xcLS5dKyk6KT9cXC9cXC8oPzooXFx3KzpcXHcrKUApPyhbXFx3Ll0qKSg/OjooXFxkKykpPyhcXFMqKSQvO1xuICB2YXIgZGF0YVVybFJlZ2V4cCA9IC9eZGF0YTouK1xcLC4rJC87XG5cbiAgZnVuY3Rpb24gdXJsUGFyc2UoYVVybCkge1xuICAgIHZhciBtYXRjaCA9IGFVcmwubWF0Y2godXJsUmVnZXhwKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjaGVtZTogbWF0Y2hbMV0sXG4gICAgICBhdXRoOiBtYXRjaFsyXSxcbiAgICAgIGhvc3Q6IG1hdGNoWzNdLFxuICAgICAgcG9ydDogbWF0Y2hbNF0sXG4gICAgICBwYXRoOiBtYXRjaFs1XVxuICAgIH07XG4gIH1cbiAgZXhwb3J0cy51cmxQYXJzZSA9IHVybFBhcnNlO1xuXG4gIGZ1bmN0aW9uIHVybEdlbmVyYXRlKGFQYXJzZWRVcmwpIHtcbiAgICB2YXIgdXJsID0gJyc7XG4gICAgaWYgKGFQYXJzZWRVcmwuc2NoZW1lKSB7XG4gICAgICB1cmwgKz0gYVBhcnNlZFVybC5zY2hlbWUgKyAnOic7XG4gICAgfVxuICAgIHVybCArPSAnLy8nO1xuICAgIGlmIChhUGFyc2VkVXJsLmF1dGgpIHtcbiAgICAgIHVybCArPSBhUGFyc2VkVXJsLmF1dGggKyAnQCc7XG4gICAgfVxuICAgIGlmIChhUGFyc2VkVXJsLmhvc3QpIHtcbiAgICAgIHVybCArPSBhUGFyc2VkVXJsLmhvc3Q7XG4gICAgfVxuICAgIGlmIChhUGFyc2VkVXJsLnBvcnQpIHtcbiAgICAgIHVybCArPSBcIjpcIiArIGFQYXJzZWRVcmwucG9ydFxuICAgIH1cbiAgICBpZiAoYVBhcnNlZFVybC5wYXRoKSB7XG4gICAgICB1cmwgKz0gYVBhcnNlZFVybC5wYXRoO1xuICAgIH1cbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIGV4cG9ydHMudXJsR2VuZXJhdGUgPSB1cmxHZW5lcmF0ZTtcblxuICAvKipcbiAgICogTm9ybWFsaXplcyBhIHBhdGgsIG9yIHRoZSBwYXRoIHBvcnRpb24gb2YgYSBVUkw6XG4gICAqXG4gICAqIC0gUmVwbGFjZXMgY29uc2VxdXRpdmUgc2xhc2hlcyB3aXRoIG9uZSBzbGFzaC5cbiAgICogLSBSZW1vdmVzIHVubmVjZXNzYXJ5ICcuJyBwYXJ0cy5cbiAgICogLSBSZW1vdmVzIHVubmVjZXNzYXJ5ICc8ZGlyPi8uLicgcGFydHMuXG4gICAqXG4gICAqIEJhc2VkIG9uIGNvZGUgaW4gdGhlIE5vZGUuanMgJ3BhdGgnIGNvcmUgbW9kdWxlLlxuICAgKlxuICAgKiBAcGFyYW0gYVBhdGggVGhlIHBhdGggb3IgdXJsIHRvIG5vcm1hbGl6ZS5cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZShhUGF0aCkge1xuICAgIHZhciBwYXRoID0gYVBhdGg7XG4gICAgdmFyIHVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgICBpZiAodXJsKSB7XG4gICAgICBpZiAoIXVybC5wYXRoKSB7XG4gICAgICAgIHJldHVybiBhUGF0aDtcbiAgICAgIH1cbiAgICAgIHBhdGggPSB1cmwucGF0aDtcbiAgICB9XG4gICAgdmFyIGlzQWJzb2x1dGUgPSAocGF0aC5jaGFyQXQoMCkgPT09ICcvJyk7XG5cbiAgICB2YXIgcGFydHMgPSBwYXRoLnNwbGl0KC9cXC8rLyk7XG4gICAgZm9yICh2YXIgcGFydCwgdXAgPSAwLCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHBhcnQgPSBwYXJ0c1tpXTtcbiAgICAgIGlmIChwYXJ0ID09PSAnLicpIHtcbiAgICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgfSBlbHNlIGlmIChwYXJ0ID09PSAnLi4nKSB7XG4gICAgICAgIHVwKys7XG4gICAgICB9IGVsc2UgaWYgKHVwID4gMCkge1xuICAgICAgICBpZiAocGFydCA9PT0gJycpIHtcbiAgICAgICAgICAvLyBUaGUgZmlyc3QgcGFydCBpcyBibGFuayBpZiB0aGUgcGF0aCBpcyBhYnNvbHV0ZS4gVHJ5aW5nIHRvIGdvXG4gICAgICAgICAgLy8gYWJvdmUgdGhlIHJvb3QgaXMgYSBuby1vcC4gVGhlcmVmb3JlIHdlIGNhbiByZW1vdmUgYWxsICcuLicgcGFydHNcbiAgICAgICAgICAvLyBkaXJlY3RseSBhZnRlciB0aGUgcm9vdC5cbiAgICAgICAgICBwYXJ0cy5zcGxpY2UoaSArIDEsIHVwKTtcbiAgICAgICAgICB1cCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFydHMuc3BsaWNlKGksIDIpO1xuICAgICAgICAgIHVwLS07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcGF0aCA9IHBhcnRzLmpvaW4oJy8nKTtcblxuICAgIGlmIChwYXRoID09PSAnJykge1xuICAgICAgcGF0aCA9IGlzQWJzb2x1dGUgPyAnLycgOiAnLic7XG4gICAgfVxuXG4gICAgaWYgKHVybCkge1xuICAgICAgdXJsLnBhdGggPSBwYXRoO1xuICAgICAgcmV0dXJuIHVybEdlbmVyYXRlKHVybCk7XG4gICAgfVxuICAgIHJldHVybiBwYXRoO1xuICB9XG4gIGV4cG9ydHMubm9ybWFsaXplID0gbm9ybWFsaXplO1xuXG4gIC8qKlxuICAgKiBKb2lucyB0d28gcGF0aHMvVVJMcy5cbiAgICpcbiAgICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICAgKiBAcGFyYW0gYVBhdGggVGhlIHBhdGggb3IgVVJMIHRvIGJlIGpvaW5lZCB3aXRoIHRoZSByb290LlxuICAgKlxuICAgKiAtIElmIGFQYXRoIGlzIGEgVVJMIG9yIGEgZGF0YSBVUkksIGFQYXRoIGlzIHJldHVybmVkLCB1bmxlc3MgYVBhdGggaXMgYVxuICAgKiAgIHNjaGVtZS1yZWxhdGl2ZSBVUkw6IFRoZW4gdGhlIHNjaGVtZSBvZiBhUm9vdCwgaWYgYW55LCBpcyBwcmVwZW5kZWRcbiAgICogICBmaXJzdC5cbiAgICogLSBPdGhlcndpc2UgYVBhdGggaXMgYSBwYXRoLiBJZiBhUm9vdCBpcyBhIFVSTCwgdGhlbiBpdHMgcGF0aCBwb3J0aW9uXG4gICAqICAgaXMgdXBkYXRlZCB3aXRoIHRoZSByZXN1bHQgYW5kIGFSb290IGlzIHJldHVybmVkLiBPdGhlcndpc2UgdGhlIHJlc3VsdFxuICAgKiAgIGlzIHJldHVybmVkLlxuICAgKiAgIC0gSWYgYVBhdGggaXMgYWJzb2x1dGUsIHRoZSByZXN1bHQgaXMgYVBhdGguXG4gICAqICAgLSBPdGhlcndpc2UgdGhlIHR3byBwYXRocyBhcmUgam9pbmVkIHdpdGggYSBzbGFzaC5cbiAgICogLSBKb2luaW5nIGZvciBleGFtcGxlICdodHRwOi8vJyBhbmQgJ3d3dy5leGFtcGxlLmNvbScgaXMgYWxzbyBzdXBwb3J0ZWQuXG4gICAqL1xuICBmdW5jdGlvbiBqb2luKGFSb290LCBhUGF0aCkge1xuICAgIGlmIChhUm9vdCA9PT0gXCJcIikge1xuICAgICAgYVJvb3QgPSBcIi5cIjtcbiAgICB9XG4gICAgaWYgKGFQYXRoID09PSBcIlwiKSB7XG4gICAgICBhUGF0aCA9IFwiLlwiO1xuICAgIH1cbiAgICB2YXIgYVBhdGhVcmwgPSB1cmxQYXJzZShhUGF0aCk7XG4gICAgdmFyIGFSb290VXJsID0gdXJsUGFyc2UoYVJvb3QpO1xuICAgIGlmIChhUm9vdFVybCkge1xuICAgICAgYVJvb3QgPSBhUm9vdFVybC5wYXRoIHx8ICcvJztcbiAgICB9XG5cbiAgICAvLyBgam9pbihmb28sICcvL3d3dy5leGFtcGxlLm9yZycpYFxuICAgIGlmIChhUGF0aFVybCAmJiAhYVBhdGhVcmwuc2NoZW1lKSB7XG4gICAgICBpZiAoYVJvb3RVcmwpIHtcbiAgICAgICAgYVBhdGhVcmwuc2NoZW1lID0gYVJvb3RVcmwuc2NoZW1lO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVybEdlbmVyYXRlKGFQYXRoVXJsKTtcbiAgICB9XG5cbiAgICBpZiAoYVBhdGhVcmwgfHwgYVBhdGgubWF0Y2goZGF0YVVybFJlZ2V4cCkpIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG5cbiAgICAvLyBgam9pbignaHR0cDovLycsICd3d3cuZXhhbXBsZS5jb20nKWBcbiAgICBpZiAoYVJvb3RVcmwgJiYgIWFSb290VXJsLmhvc3QgJiYgIWFSb290VXJsLnBhdGgpIHtcbiAgICAgIGFSb290VXJsLmhvc3QgPSBhUGF0aDtcbiAgICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUm9vdFVybCk7XG4gICAgfVxuXG4gICAgdmFyIGpvaW5lZCA9IGFQYXRoLmNoYXJBdCgwKSA9PT0gJy8nXG4gICAgICA/IGFQYXRoXG4gICAgICA6IG5vcm1hbGl6ZShhUm9vdC5yZXBsYWNlKC9cXC8rJC8sICcnKSArICcvJyArIGFQYXRoKTtcblxuICAgIGlmIChhUm9vdFVybCkge1xuICAgICAgYVJvb3RVcmwucGF0aCA9IGpvaW5lZDtcbiAgICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUm9vdFVybCk7XG4gICAgfVxuICAgIHJldHVybiBqb2luZWQ7XG4gIH1cbiAgZXhwb3J0cy5qb2luID0gam9pbjtcblxuICAvKipcbiAgICogTWFrZSBhIHBhdGggcmVsYXRpdmUgdG8gYSBVUkwgb3IgYW5vdGhlciBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gYVJvb3QgVGhlIHJvb3QgcGF0aCBvciBVUkwuXG4gICAqIEBwYXJhbSBhUGF0aCBUaGUgcGF0aCBvciBVUkwgdG8gYmUgbWFkZSByZWxhdGl2ZSB0byBhUm9vdC5cbiAgICovXG4gIGZ1bmN0aW9uIHJlbGF0aXZlKGFSb290LCBhUGF0aCkge1xuICAgIGlmIChhUm9vdCA9PT0gXCJcIikge1xuICAgICAgYVJvb3QgPSBcIi5cIjtcbiAgICB9XG5cbiAgICBhUm9vdCA9IGFSb290LnJlcGxhY2UoL1xcLyQvLCAnJyk7XG5cbiAgICAvLyBYWFg6IEl0IGlzIHBvc3NpYmxlIHRvIHJlbW92ZSB0aGlzIGJsb2NrLCBhbmQgdGhlIHRlc3RzIHN0aWxsIHBhc3MhXG4gICAgdmFyIHVybCA9IHVybFBhcnNlKGFSb290KTtcbiAgICBpZiAoYVBhdGguY2hhckF0KDApID09IFwiL1wiICYmIHVybCAmJiB1cmwucGF0aCA9PSBcIi9cIikge1xuICAgICAgcmV0dXJuIGFQYXRoLnNsaWNlKDEpO1xuICAgIH1cblxuICAgIHJldHVybiBhUGF0aC5pbmRleE9mKGFSb290ICsgJy8nKSA9PT0gMFxuICAgICAgPyBhUGF0aC5zdWJzdHIoYVJvb3QubGVuZ3RoICsgMSlcbiAgICAgIDogYVBhdGg7XG4gIH1cbiAgZXhwb3J0cy5yZWxhdGl2ZSA9IHJlbGF0aXZlO1xuXG4gIC8qKlxuICAgKiBCZWNhdXNlIGJlaGF2aW9yIGdvZXMgd2Fja3kgd2hlbiB5b3Ugc2V0IGBfX3Byb3RvX19gIG9uIG9iamVjdHMsIHdlXG4gICAqIGhhdmUgdG8gcHJlZml4IGFsbCB0aGUgc3RyaW5ncyBpbiBvdXIgc2V0IHdpdGggYW4gYXJiaXRyYXJ5IGNoYXJhY3Rlci5cbiAgICpcbiAgICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3NvdXJjZS1tYXAvcHVsbC8zMSBhbmRcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvc291cmNlLW1hcC9pc3N1ZXMvMzBcbiAgICpcbiAgICogQHBhcmFtIFN0cmluZyBhU3RyXG4gICAqL1xuICBmdW5jdGlvbiB0b1NldFN0cmluZyhhU3RyKSB7XG4gICAgcmV0dXJuICckJyArIGFTdHI7XG4gIH1cbiAgZXhwb3J0cy50b1NldFN0cmluZyA9IHRvU2V0U3RyaW5nO1xuXG4gIGZ1bmN0aW9uIGZyb21TZXRTdHJpbmcoYVN0cikge1xuICAgIHJldHVybiBhU3RyLnN1YnN0cigxKTtcbiAgfVxuICBleHBvcnRzLmZyb21TZXRTdHJpbmcgPSBmcm9tU2V0U3RyaW5nO1xuXG4gIGZ1bmN0aW9uIHN0cmNtcChhU3RyMSwgYVN0cjIpIHtcbiAgICB2YXIgczEgPSBhU3RyMSB8fCBcIlwiO1xuICAgIHZhciBzMiA9IGFTdHIyIHx8IFwiXCI7XG4gICAgcmV0dXJuIChzMSA+IHMyKSAtIChzMSA8IHMyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJhdG9yIGJldHdlZW4gdHdvIG1hcHBpbmdzIHdoZXJlIHRoZSBvcmlnaW5hbCBwb3NpdGlvbnMgYXJlIGNvbXBhcmVkLlxuICAgKlxuICAgKiBPcHRpb25hbGx5IHBhc3MgaW4gYHRydWVgIGFzIGBvbmx5Q29tcGFyZUdlbmVyYXRlZGAgdG8gY29uc2lkZXIgdHdvXG4gICAqIG1hcHBpbmdzIHdpdGggdGhlIHNhbWUgb3JpZ2luYWwgc291cmNlL2xpbmUvY29sdW1uLCBidXQgZGlmZmVyZW50IGdlbmVyYXRlZFxuICAgKiBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYSBtYXBwaW5nIHdpdGggYVxuICAgKiBzdHViYmVkIG91dCBtYXBwaW5nLlxuICAgKi9cbiAgZnVuY3Rpb24gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZU9yaWdpbmFsKSB7XG4gICAgdmFyIGNtcDtcblxuICAgIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gICAgaWYgKGNtcCkge1xuICAgICAgcmV0dXJuIGNtcDtcbiAgICB9XG5cbiAgICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbExpbmUgLSBtYXBwaW5nQi5vcmlnaW5hbExpbmU7XG4gICAgaWYgKGNtcCkge1xuICAgICAgcmV0dXJuIGNtcDtcbiAgICB9XG5cbiAgICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbENvbHVtbiAtIG1hcHBpbmdCLm9yaWdpbmFsQ29sdW1uO1xuICAgIGlmIChjbXAgfHwgb25seUNvbXBhcmVPcmlnaW5hbCkge1xuICAgICAgcmV0dXJuIGNtcDtcbiAgICB9XG5cbiAgICBjbXAgPSBzdHJjbXAobWFwcGluZ0EubmFtZSwgbWFwcGluZ0IubmFtZSk7XG4gICAgaWYgKGNtcCkge1xuICAgICAgcmV0dXJuIGNtcDtcbiAgICB9XG5cbiAgICBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lIC0gbWFwcGluZ0IuZ2VuZXJhdGVkTGluZTtcbiAgICBpZiAoY21wKSB7XG4gICAgICByZXR1cm4gY21wO1xuICAgIH1cblxuICAgIHJldHVybiBtYXBwaW5nQS5nZW5lcmF0ZWRDb2x1bW4gLSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gIH07XG4gIGV4cG9ydHMuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMgPSBjb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucztcblxuICAvKipcbiAgICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aGVyZSB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucyBhcmVcbiAgICogY29tcGFyZWQuXG4gICAqXG4gICAqIE9wdGlvbmFsbHkgcGFzcyBpbiBgdHJ1ZWAgYXMgYG9ubHlDb21wYXJlR2VuZXJhdGVkYCB0byBjb25zaWRlciB0d29cbiAgICogbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uLCBidXQgZGlmZmVyZW50XG4gICAqIHNvdXJjZS9uYW1lL29yaWdpbmFsIGxpbmUgYW5kIGNvbHVtbiB0aGUgc2FtZS4gVXNlZnVsIHdoZW4gc2VhcmNoaW5nIGZvciBhXG4gICAqIG1hcHBpbmcgd2l0aCBhIHN0dWJiZWQgb3V0IG1hcHBpbmcuXG4gICAqL1xuICBmdW5jdGlvbiBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnMobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZUdlbmVyYXRlZCkge1xuICAgIHZhciBjbXA7XG5cbiAgICBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lIC0gbWFwcGluZ0IuZ2VuZXJhdGVkTGluZTtcbiAgICBpZiAoY21wKSB7XG4gICAgICByZXR1cm4gY21wO1xuICAgIH1cblxuICAgIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbiAtIG1hcHBpbmdCLmdlbmVyYXRlZENvbHVtbjtcbiAgICBpZiAoY21wIHx8IG9ubHlDb21wYXJlR2VuZXJhdGVkKSB7XG4gICAgICByZXR1cm4gY21wO1xuICAgIH1cblxuICAgIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gICAgaWYgKGNtcCkge1xuICAgICAgcmV0dXJuIGNtcDtcbiAgICB9XG5cbiAgICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbExpbmUgLSBtYXBwaW5nQi5vcmlnaW5hbExpbmU7XG4gICAgaWYgKGNtcCkge1xuICAgICAgcmV0dXJuIGNtcDtcbiAgICB9XG5cbiAgICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbENvbHVtbiAtIG1hcHBpbmdCLm9yaWdpbmFsQ29sdW1uO1xuICAgIGlmIChjbXApIHtcbiAgICAgIHJldHVybiBjbXA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbiAgfTtcbiAgZXhwb3J0cy5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnMgPSBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnM7XG5cbn0pO1xuIiwiXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSB0cmltO1xuXG5mdW5jdGlvbiB0cmltKHN0cil7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyp8XFxzKiQvZywgJycpO1xufVxuXG5leHBvcnRzLmxlZnQgPSBmdW5jdGlvbihzdHIpe1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMqLywgJycpO1xufTtcblxuZXhwb3J0cy5yaWdodCA9IGZ1bmN0aW9uKHN0cil7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXFxzKiQvLCAnJyk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgd2luZG93ID0gcmVxdWlyZShcImdsb2JhbC93aW5kb3dcIilcbnZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZShcImlzLWZ1bmN0aW9uXCIpXG52YXIgcGFyc2VIZWFkZXJzID0gcmVxdWlyZShcInBhcnNlLWhlYWRlcnNcIilcbnZhciB4dGVuZCA9IHJlcXVpcmUoXCJ4dGVuZFwiKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVhIUlxuY3JlYXRlWEhSLlhNTEh0dHBSZXF1ZXN0ID0gd2luZG93LlhNTEh0dHBSZXF1ZXN0IHx8IG5vb3BcbmNyZWF0ZVhIUi5YRG9tYWluUmVxdWVzdCA9IFwid2l0aENyZWRlbnRpYWxzXCIgaW4gKG5ldyBjcmVhdGVYSFIuWE1MSHR0cFJlcXVlc3QoKSkgPyBjcmVhdGVYSFIuWE1MSHR0cFJlcXVlc3QgOiB3aW5kb3cuWERvbWFpblJlcXVlc3RcblxuZm9yRWFjaEFycmF5KFtcImdldFwiLCBcInB1dFwiLCBcInBvc3RcIiwgXCJwYXRjaFwiLCBcImhlYWRcIiwgXCJkZWxldGVcIl0sIGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgIGNyZWF0ZVhIUlttZXRob2QgPT09IFwiZGVsZXRlXCIgPyBcImRlbFwiIDogbWV0aG9kXSA9IGZ1bmN0aW9uKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICAgICAgb3B0aW9ucyA9IGluaXRQYXJhbXModXJpLCBvcHRpb25zLCBjYWxsYmFjaylcbiAgICAgICAgb3B0aW9ucy5tZXRob2QgPSBtZXRob2QudG9VcHBlckNhc2UoKVxuICAgICAgICByZXR1cm4gX2NyZWF0ZVhIUihvcHRpb25zKVxuICAgIH1cbn0pXG5cbmZ1bmN0aW9uIGZvckVhY2hBcnJheShhcnJheSwgaXRlcmF0b3IpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGl0ZXJhdG9yKGFycmF5W2ldKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNFbXB0eShvYmope1xuICAgIGZvcih2YXIgaSBpbiBvYmope1xuICAgICAgICBpZihvYmouaGFzT3duUHJvcGVydHkoaSkpIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBpbml0UGFyYW1zKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICB2YXIgcGFyYW1zID0gdXJpXG5cbiAgICBpZiAoaXNGdW5jdGlvbihvcHRpb25zKSkge1xuICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnNcbiAgICAgICAgaWYgKHR5cGVvZiB1cmkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IHt1cmk6dXJpfVxuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcGFyYW1zID0geHRlbmQob3B0aW9ucywge3VyaTogdXJpfSlcbiAgICB9XG5cbiAgICBwYXJhbXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHJldHVybiBwYXJhbXNcbn1cblxuZnVuY3Rpb24gY3JlYXRlWEhSKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBvcHRpb25zID0gaW5pdFBhcmFtcyh1cmksIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAgIHJldHVybiBfY3JlYXRlWEhSKG9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVYSFIob3B0aW9ucykge1xuICAgIGlmKHR5cGVvZiBvcHRpb25zLmNhbGxiYWNrID09PSBcInVuZGVmaW5lZFwiKXtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2FsbGJhY2sgYXJndW1lbnQgbWlzc2luZ1wiKVxuICAgIH1cblxuICAgIHZhciBjYWxsZWQgPSBmYWxzZVxuICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uIGNiT25jZShlcnIsIHJlc3BvbnNlLCBib2R5KXtcbiAgICAgICAgaWYoIWNhbGxlZCl7XG4gICAgICAgICAgICBjYWxsZWQgPSB0cnVlXG4gICAgICAgICAgICBvcHRpb25zLmNhbGxiYWNrKGVyciwgcmVzcG9uc2UsIGJvZHkpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWFkeXN0YXRlY2hhbmdlKCkge1xuICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQobG9hZEZ1bmMsIDApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRCb2R5KCkge1xuICAgICAgICAvLyBDaHJvbWUgd2l0aCByZXF1ZXN0VHlwZT1ibG9iIHRocm93cyBlcnJvcnMgYXJyb3VuZCB3aGVuIGV2ZW4gdGVzdGluZyBhY2Nlc3MgdG8gcmVzcG9uc2VUZXh0XG4gICAgICAgIHZhciBib2R5ID0gdW5kZWZpbmVkXG5cbiAgICAgICAgaWYgKHhoci5yZXNwb25zZSkge1xuICAgICAgICAgICAgYm9keSA9IHhoci5yZXNwb25zZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYm9keSA9IHhoci5yZXNwb25zZVRleHQgfHwgZ2V0WG1sKHhocilcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0pzb24pIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYm9keSA9IEpTT04ucGFyc2UoYm9keSlcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYm9keVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVycm9yRnVuYyhldnQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRUaW1lcilcbiAgICAgICAgaWYoIShldnQgaW5zdGFuY2VvZiBFcnJvcikpe1xuICAgICAgICAgICAgZXZ0ID0gbmV3IEVycm9yKFwiXCIgKyAoZXZ0IHx8IFwiVW5rbm93biBYTUxIdHRwUmVxdWVzdCBFcnJvclwiKSApXG4gICAgICAgIH1cbiAgICAgICAgZXZ0LnN0YXR1c0NvZGUgPSAwXG4gICAgICAgIHJldHVybiBjYWxsYmFjayhldnQsIGZhaWx1cmVSZXNwb25zZSlcbiAgICB9XG5cbiAgICAvLyB3aWxsIGxvYWQgdGhlIGRhdGEgJiBwcm9jZXNzIHRoZSByZXNwb25zZSBpbiBhIHNwZWNpYWwgcmVzcG9uc2Ugb2JqZWN0XG4gICAgZnVuY3Rpb24gbG9hZEZ1bmMoKSB7XG4gICAgICAgIGlmIChhYm9ydGVkKSByZXR1cm5cbiAgICAgICAgdmFyIHN0YXR1c1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dFRpbWVyKVxuICAgICAgICBpZihvcHRpb25zLnVzZVhEUiAmJiB4aHIuc3RhdHVzPT09dW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvL0lFOCBDT1JTIEdFVCBzdWNjZXNzZnVsIHJlc3BvbnNlIGRvZXNuJ3QgaGF2ZSBhIHN0YXR1cyBmaWVsZCwgYnV0IGJvZHkgaXMgZmluZVxuICAgICAgICAgICAgc3RhdHVzID0gMjAwXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0dXMgPSAoeGhyLnN0YXR1cyA9PT0gMTIyMyA/IDIwNCA6IHhoci5zdGF0dXMpXG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3BvbnNlID0gZmFpbHVyZVJlc3BvbnNlXG4gICAgICAgIHZhciBlcnIgPSBudWxsXG5cbiAgICAgICAgaWYgKHN0YXR1cyAhPT0gMCl7XG4gICAgICAgICAgICByZXNwb25zZSA9IHtcbiAgICAgICAgICAgICAgICBib2R5OiBnZXRCb2R5KCksXG4gICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogc3RhdHVzLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICAgICAgICAgIHVybDogdXJpLFxuICAgICAgICAgICAgICAgIHJhd1JlcXVlc3Q6IHhoclxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycyl7IC8vcmVtZW1iZXIgeGhyIGNhbiBpbiBmYWN0IGJlIFhEUiBmb3IgQ09SUyBpbiBJRVxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMgPSBwYXJzZUhlYWRlcnMoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyID0gbmV3IEVycm9yKFwiSW50ZXJuYWwgWE1MSHR0cFJlcXVlc3QgRXJyb3JcIilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyLCByZXNwb25zZSwgcmVzcG9uc2UuYm9keSlcbiAgICB9XG5cbiAgICB2YXIgeGhyID0gb3B0aW9ucy54aHIgfHwgbnVsbFxuXG4gICAgaWYgKCF4aHIpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuY29ycyB8fCBvcHRpb25zLnVzZVhEUikge1xuICAgICAgICAgICAgeGhyID0gbmV3IGNyZWF0ZVhIUi5YRG9tYWluUmVxdWVzdCgpXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgeGhyID0gbmV3IGNyZWF0ZVhIUi5YTUxIdHRwUmVxdWVzdCgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIga2V5XG4gICAgdmFyIGFib3J0ZWRcbiAgICB2YXIgdXJpID0geGhyLnVybCA9IG9wdGlvbnMudXJpIHx8IG9wdGlvbnMudXJsXG4gICAgdmFyIG1ldGhvZCA9IHhoci5tZXRob2QgPSBvcHRpb25zLm1ldGhvZCB8fCBcIkdFVFwiXG4gICAgdmFyIGJvZHkgPSBvcHRpb25zLmJvZHkgfHwgb3B0aW9ucy5kYXRhXG4gICAgdmFyIGhlYWRlcnMgPSB4aHIuaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycyB8fCB7fVxuICAgIHZhciBzeW5jID0gISFvcHRpb25zLnN5bmNcbiAgICB2YXIgaXNKc29uID0gZmFsc2VcbiAgICB2YXIgdGltZW91dFRpbWVyXG4gICAgdmFyIGZhaWx1cmVSZXNwb25zZSA9IHtcbiAgICAgICAgYm9keTogdW5kZWZpbmVkLFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgc3RhdHVzQ29kZTogMCxcbiAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgIHVybDogdXJpLFxuICAgICAgICByYXdSZXF1ZXN0OiB4aHJcbiAgICB9XG5cbiAgICBpZiAoXCJqc29uXCIgaW4gb3B0aW9ucyAmJiBvcHRpb25zLmpzb24gIT09IGZhbHNlKSB7XG4gICAgICAgIGlzSnNvbiA9IHRydWVcbiAgICAgICAgaGVhZGVyc1tcImFjY2VwdFwiXSB8fCBoZWFkZXJzW1wiQWNjZXB0XCJdIHx8IChoZWFkZXJzW1wiQWNjZXB0XCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCIpIC8vRG9uJ3Qgb3ZlcnJpZGUgZXhpc3RpbmcgYWNjZXB0IGhlYWRlciBkZWNsYXJlZCBieSB1c2VyXG4gICAgICAgIGlmIChtZXRob2QgIT09IFwiR0VUXCIgJiYgbWV0aG9kICE9PSBcIkhFQURcIikge1xuICAgICAgICAgICAgaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXSB8fCBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdIHx8IChoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCIpIC8vRG9uJ3Qgb3ZlcnJpZGUgZXhpc3RpbmcgYWNjZXB0IGhlYWRlciBkZWNsYXJlZCBieSB1c2VyXG4gICAgICAgICAgICBib2R5ID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5qc29uID09PSB0cnVlID8gYm9keSA6IG9wdGlvbnMuanNvbilcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSByZWFkeXN0YXRlY2hhbmdlXG4gICAgeGhyLm9ubG9hZCA9IGxvYWRGdW5jXG4gICAgeGhyLm9uZXJyb3IgPSBlcnJvckZ1bmNcbiAgICAvLyBJRTkgbXVzdCBoYXZlIG9ucHJvZ3Jlc3MgYmUgc2V0IHRvIGEgdW5pcXVlIGZ1bmN0aW9uLlxuICAgIHhoci5vbnByb2dyZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBJRSBtdXN0IGRpZVxuICAgIH1cbiAgICB4aHIub25hYm9ydCA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIGFib3J0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICB4aHIub250aW1lb3V0ID0gZXJyb3JGdW5jXG4gICAgeGhyLm9wZW4obWV0aG9kLCB1cmksICFzeW5jLCBvcHRpb25zLnVzZXJuYW1lLCBvcHRpb25zLnBhc3N3b3JkKVxuICAgIC8vaGFzIHRvIGJlIGFmdGVyIG9wZW5cbiAgICBpZighc3luYykge1xuICAgICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gISFvcHRpb25zLndpdGhDcmVkZW50aWFsc1xuICAgIH1cbiAgICAvLyBDYW5ub3Qgc2V0IHRpbWVvdXQgd2l0aCBzeW5jIHJlcXVlc3RcbiAgICAvLyBub3Qgc2V0dGluZyB0aW1lb3V0IG9uIHRoZSB4aHIgb2JqZWN0LCBiZWNhdXNlIG9mIG9sZCB3ZWJraXRzIGV0Yy4gbm90IGhhbmRsaW5nIHRoYXQgY29ycmVjdGx5XG4gICAgLy8gYm90aCBucG0ncyByZXF1ZXN0IGFuZCBqcXVlcnkgMS54IHVzZSB0aGlzIGtpbmQgb2YgdGltZW91dCwgc28gdGhpcyBpcyBiZWluZyBjb25zaXN0ZW50XG4gICAgaWYgKCFzeW5jICYmIG9wdGlvbnMudGltZW91dCA+IDAgKSB7XG4gICAgICAgIHRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGlmIChhYm9ydGVkKSByZXR1cm5cbiAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlLy9JRTkgbWF5IHN0aWxsIGNhbGwgcmVhZHlzdGF0ZWNoYW5nZVxuICAgICAgICAgICAgeGhyLmFib3J0KFwidGltZW91dFwiKVxuICAgICAgICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoXCJYTUxIdHRwUmVxdWVzdCB0aW1lb3V0XCIpXG4gICAgICAgICAgICBlLmNvZGUgPSBcIkVUSU1FRE9VVFwiXG4gICAgICAgICAgICBlcnJvckZ1bmMoZSlcbiAgICAgICAgfSwgb3B0aW9ucy50aW1lb3V0IClcbiAgICB9XG5cbiAgICBpZiAoeGhyLnNldFJlcXVlc3RIZWFkZXIpIHtcbiAgICAgICAgZm9yKGtleSBpbiBoZWFkZXJzKXtcbiAgICAgICAgICAgIGlmKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoa2V5KSl7XG4gICAgICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoa2V5LCBoZWFkZXJzW2tleV0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaGVhZGVycyAmJiAhaXNFbXB0eShvcHRpb25zLmhlYWRlcnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkhlYWRlcnMgY2Fubm90IGJlIHNldCBvbiBhbiBYRG9tYWluUmVxdWVzdCBvYmplY3RcIilcbiAgICB9XG5cbiAgICBpZiAoXCJyZXNwb25zZVR5cGVcIiBpbiBvcHRpb25zKSB7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSBvcHRpb25zLnJlc3BvbnNlVHlwZVxuICAgIH1cblxuICAgIGlmIChcImJlZm9yZVNlbmRcIiBpbiBvcHRpb25zICYmXG4gICAgICAgIHR5cGVvZiBvcHRpb25zLmJlZm9yZVNlbmQgPT09IFwiZnVuY3Rpb25cIlxuICAgICkge1xuICAgICAgICBvcHRpb25zLmJlZm9yZVNlbmQoeGhyKVxuICAgIH1cblxuICAgIC8vIE1pY3Jvc29mdCBFZGdlIGJyb3dzZXIgc2VuZHMgXCJ1bmRlZmluZWRcIiB3aGVuIHNlbmQgaXMgY2FsbGVkIHdpdGggdW5kZWZpbmVkIHZhbHVlLlxuICAgIC8vIFhNTEh0dHBSZXF1ZXN0IHNwZWMgc2F5cyB0byBwYXNzIG51bGwgYXMgYm9keSB0byBpbmRpY2F0ZSBubyBib2R5XG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9uYXVndHVyL3hoci9pc3N1ZXMvMTAwLlxuICAgIHhoci5zZW5kKGJvZHkgfHwgbnVsbClcblxuICAgIHJldHVybiB4aHJcblxuXG59XG5cbmZ1bmN0aW9uIGdldFhtbCh4aHIpIHtcbiAgICAvLyB4aHIucmVzcG9uc2VYTUwgd2lsbCB0aHJvdyBFeGNlcHRpb24gXCJJbnZhbGlkU3RhdGVFcnJvclwiIG9yIFwiRE9NRXhjZXB0aW9uXCJcbiAgICAvLyBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1hNTEh0dHBSZXF1ZXN0L3Jlc3BvbnNlWE1MLlxuICAgIHRyeSB7XG4gICAgICAgIGlmICh4aHIucmVzcG9uc2VUeXBlID09PSBcImRvY3VtZW50XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB4aHIucmVzcG9uc2VYTUxcbiAgICAgICAgfVxuICAgICAgICB2YXIgZmlyZWZveEJ1Z1Rha2VuRWZmZWN0ID0geGhyLnJlc3BvbnNlWE1MICYmIHhoci5yZXNwb25zZVhNTC5kb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgPT09IFwicGFyc2VyZXJyb3JcIlxuICAgICAgICBpZiAoeGhyLnJlc3BvbnNlVHlwZSA9PT0gXCJcIiAmJiAhZmlyZWZveEJ1Z1Rha2VuRWZmZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4geGhyLnJlc3BvbnNlWE1MXG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGV4dGVuZFxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiBleHRlbmQoKSB7XG4gICAgdmFyIHRhcmdldCA9IHt9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldXG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldFxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG4vL0ltcG9ydCBoZWxwZXJzXG5cbnZhciBfaGVscGVycyA9IHJlcXVpcmUoJy4vaGVscGVycycpO1xuXG4vL0ltcG9ydCBwYXJ0aWFsc1xuXG52YXIgX3BhcnRpYWxzX2xpc3QgPSByZXF1aXJlKCcuL3BhcnRpYWxzL19saXN0Jyk7XG5cbnZhciBfcGFydGlhbHNfbGlzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wYXJ0aWFsc19saXN0KTtcblxudmFyIEhhbmRsZWJhcnMgPSByZXF1aXJlKCdIYW5kbGViYXJzJyk7XG4oMCwgX2hlbHBlcnMuaWZFcXVhbHMpKCk7XG4oMCwgX3BhcnRpYWxzX2xpc3QyWydkZWZhdWx0J10pKCk7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IEhhbmRsZWJhcnM7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklrTTZMM1JsYlhBdlIwY3VSbkp2Ym5SRmJtUXVWMmxrWjJWMGN5OTNhV1JuWlhSekwyTm9ZWEpwZEhrdFpYWmxiblJ6TFdKdllYSmtMMkp2ZDJWeVgyTnZiWEJ2Ym1WdWRITXZhblZ6ZEdkcGRtbHVaeTEzYVdSblpYUXRabkpoYldWM2IzSnJMMk52YlhCdmJtVnVkSE12YkdsaUwwaGhibVJzWldKaGNuTXZhR0Z1Wkd4bFltRnljeTVxY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pUVVGQlFTeFpRVUZaTEVOQlFVTTdPenM3T3pzN096czdkVUpCUzFrc1YwRkJWenM3T3pzMlFrRkpiRUlzYTBKQlFXdENPenM3TzBGQlVIQkRMRWxCUVVrc1ZVRkJWU3hIUVVGSExFOUJRVThzUTBGQlF5eFpRVUZaTEVOQlFVTXNRMEZCUXp0QlFVbDJReXgzUWtGQlZTeERRVUZETzBGQlNWZ3NhVU5CUVU4c1EwRkJRenM3Y1VKQlJVOHNWVUZCVlNJc0ltWnBiR1VpT2lKRE9pOTBaVzF3TDBkSExrWnliMjUwUlc1a0xsZHBaR2RsZEhNdmQybGtaMlYwY3k5amFHRnlhWFI1TFdWMlpXNTBjeTFpYjJGeVpDOWliM2RsY2w5amIyMXdiMjVsYm5SekwycDFjM1JuYVhacGJtY3RkMmxrWjJWMExXWnlZVzFsZDI5eWF5OWpiMjF3YjI1bGJuUnpMMnhwWWk5SVlXNWtiR1ZpWVhKekwyaGhibVJzWldKaGNuTXVhbk1pTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lJbmRYTmxJSE4wY21samRDYzdYSEpjYmx4eVhHNXNaWFFnU0dGdVpHeGxZbUZ5Y3lBOUlISmxjWFZwY21Vb0owaGhibVJzWldKaGNuTW5LVHRjY2x4dVhISmNiaTh2U1cxd2IzSjBJR2hsYkhCbGNuTmNjbHh1YVcxd2IzSjBJSHNnYVdaRmNYVmhiSE1nZlNCbWNtOXRJQ2N1TDJobGJIQmxjbk1uTzF4eVhHNXBaa1Z4ZFdGc2N5Z3BPMXh5WEc1Y2NseHVMeTlKYlhCdmNuUWdjR0Z5ZEdsaGJITmNjbHh1YVcxd2IzSjBJRjlzYVhOMElHWnliMjBnSnk0dmNHRnlkR2xoYkhNdlgyeHBjM1FuTzF4eVhHNWZiR2x6ZENncE8xeHlYRzVjY2x4dVpYaHdiM0owSUdSbFptRjFiSFFnU0dGdVpHeGxZbUZ5Y3pzaVhYMD0iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcblx0dmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5pZkVxdWFscyA9IGlmRXF1YWxzO1xudmFyIEhhbmRsZWJhcnMgPSByZXF1aXJlKCdIYW5kbGViYXJzJyk7XG5cbi8qKlxyXG4gKiBTdHJpY3QgY29tcGFyaXNvbiBoZWxwZXIgZm9yIHVzZSBpbiBIYW5kbGViYXJzIHRlbXBsYXRlc1xyXG4gKiBAcGFyYW0ge1N0cmluZ30gRmlyc3QgY29uZGl0aW9uIHRvIGNvbXBhcmVcclxuICogQHBhcmFtIHtTdHJpbmd9IFNlY29uZCBjb25kaXRpb24gdG8gY29tcGFyZVxyXG4gKiBAcmV0dXJuIHtCb29sZWFufSBXaGV0aGVyIGNvbmRpdGlvbnMgYXJlIGVxdWFsXHJcbiAqL1xuXG5mdW5jdGlvbiBpZkVxdWFscygpIHtcblx0SGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignaWZFcXVhbHMnLCBmdW5jdGlvbiAodjEsIHYyLCBvcHRpb25zKSB7XG5cdFx0aWYgKHYxID09PSB2Mikge1xuXHRcdFx0cmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7XG5cdFx0fVxuXHRcdHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG5cdH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWtNNkwzUmxiWEF2UjBjdVJuSnZiblJGYm1RdVYybGtaMlYwY3k5M2FXUm5aWFJ6TDJOb1lYSnBkSGt0WlhabGJuUnpMV0p2WVhKa0wySnZkMlZ5WDJOdmJYQnZibVZ1ZEhNdmFuVnpkR2RwZG1sdVp5MTNhV1JuWlhRdFpuSmhiV1YzYjNKckwyTnZiWEJ2Ym1WdWRITXZiR2xpTDBoaGJtUnNaV0poY25NdmFHVnNjR1Z5Y3k1cWN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaVFVRkJRU3haUVVGWkxFTkJRVU03T3pzN096dEJRVVZpTEVsQlFVa3NWVUZCVlN4SFFVRkhMRTlCUVU4c1EwRkJReXhaUVVGWkxFTkJRVU1zUTBGQlF6czdPenM3T3pzN08wRkJVV2hETEZOQlFWTXNVVUZCVVN4SFFVRkpPMEZCUXpOQ0xGZEJRVlVzUTBGQlF5eGpRVUZqTEVOQlFVTXNWVUZCVlN4RlFVRkZMRlZCUVZVc1JVRkJSU3hGUVVGRkxFVkJRVVVzUlVGQlJTeFBRVUZQTEVWQlFVYzdRVUZEYUVVc1RVRkJTU3hGUVVGRkxFdEJRVXNzUlVGQlJTeEZRVUZITzBGQlEyUXNWVUZCVHl4UFFVRlBMRU5CUVVNc1JVRkJSU3hEUVVGRkxFbEJRVWtzUTBGQlJTeERRVUZETzBkQlF6TkNPMEZCUTBRc1UwRkJUeXhQUVVGUExFTkJRVU1zVDBGQlR5eERRVUZGTEVsQlFVa3NRMEZCUlN4RFFVRkRPMFZCUTJoRExFTkJRVU1zUTBGQlF6dERRVU5JSWl3aVptbHNaU0k2SWtNNkwzUmxiWEF2UjBjdVJuSnZiblJGYm1RdVYybGtaMlYwY3k5M2FXUm5aWFJ6TDJOb1lYSnBkSGt0WlhabGJuUnpMV0p2WVhKa0wySnZkMlZ5WDJOdmJYQnZibVZ1ZEhNdmFuVnpkR2RwZG1sdVp5MTNhV1JuWlhRdFpuSmhiV1YzYjNKckwyTnZiWEJ2Ym1WdWRITXZiR2xpTDBoaGJtUnNaV0poY25NdmFHVnNjR1Z5Y3k1cWN5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJaWQxYzJVZ2MzUnlhV04wSnp0Y2NseHVYSEpjYm14bGRDQklZVzVrYkdWaVlYSnpJRDBnY21WeGRXbHlaU2duU0dGdVpHeGxZbUZ5Y3ljcE8xeHlYRzVjY2x4dUx5b3FYSEpjYmlBcUlGTjBjbWxqZENCamIyMXdZWEpwYzI5dUlHaGxiSEJsY2lCbWIzSWdkWE5sSUdsdUlFaGhibVJzWldKaGNuTWdkR1Z0Y0d4aGRHVnpYSEpjYmlBcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCR2FYSnpkQ0JqYjI1a2FYUnBiMjRnZEc4Z1kyOXRjR0Z5WlZ4eVhHNGdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdVMlZqYjI1a0lHTnZibVJwZEdsdmJpQjBieUJqYjIxd1lYSmxYSEpjYmlBcUlFQnlaWFIxY200Z2UwSnZiMnhsWVc1OUlGZG9aWFJvWlhJZ1kyOXVaR2wwYVc5dWN5QmhjbVVnWlhGMVlXeGNjbHh1SUNvdlhISmNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQnBaa1Z4ZFdGc2N5QW9LU0I3WEhKY2JseDBTR0Z1Wkd4bFltRnljeTV5WldkcGMzUmxja2hsYkhCbGNpZ25hV1pGY1hWaGJITW5MQ0JtZFc1amRHbHZiaWdnZGpFc0lIWXlMQ0J2Y0hScGIyNXpJQ2tnZTF4eVhHNWNkQ0FnYVdZb0lIWXhJRDA5UFNCMk1pQXBJSHRjY2x4dVhIUWdJQ0FnY21WMGRYSnVJRzl3ZEdsdmJuTXVabTRvSUhSb2FYTWdLVHRjY2x4dVhIUWdJSDFjY2x4dVhIUWdJSEpsZEhWeWJpQnZjSFJwYjI1ekxtbHVkbVZ5YzJVb0lIUm9hWE1nS1R0Y2NseHVYSFI5S1R0Y2RGeHlYRzU5SUZ4eVhHNGlYWDA9IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG5cdHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IF9saXN0O1xudmFyIEhhbmRsZWJhcnMgPSByZXF1aXJlKCdIYW5kbGViYXJzJyk7XG5cbmZ1bmN0aW9uIF9saXN0KCkge1xuXHRIYW5kbGViYXJzLnJlZ2lzdGVyUGFydGlhbCgnbGlzdCcsICd7eyNpZkVxdWFscyBoYXNDYXJvdXNlbCBcXCd0cnVlXFwnfX1cXHRcXG4gICAgXFx0XFx0PGRpdiBjbGFzcz1cImNhcm91c2VsLXN0YWNrZWRcIiBkYXRhLWNhcm91c2VsPVwie3t2aWV3TmFtZX19XCI+XFxuXFx0XFx0XFx0XFx0PGJ1dHRvbiBjbGFzcz1cImJ0bi1pY29uLWwgY29udHJvbC1wcmV2XCIgZGF0YS1jb250cm9sLXByZXYgZGF0YS1hbmFseXRpY3MtZXZlbnQ9XCJHZXQgcHJldmlvdXMgcGFnZVwiIGRhdGEtYW5hbHl0aWNzLXN1YnR5cGU9XCJidXR0b25cIj5cXG5cXHRcXHRcXHRcXHRcXHQ8c3BhbiBjbGFzcz1cImhpZGVWaXN1YWxseVwiPlByZXZpb3VzIHBhZ2U8L3NwYW4+XFxuXFx0XFx0XFx0XFx0XFx0PHNwYW4gY2xhc3M9XCJidG4taWNvbi1jb250ZW50XCI+XFxuXFx0XFx0XFx0XFx0XFx0XFx0PHNwYW4gY2xhc3M9XCJzcHJpdGUtY2hldnJvbi11cC1sXCI+PC9zcGFuPlxcblxcdFxcdFxcdFxcdFxcdDwvc3Bhbj5cXG5cXHRcXHRcXHRcXHQ8L2J1dHRvbj5cXG5cXHRcXHRcXHRcXHQ8ZGl2IGNsYXNzPVwiY2Fyb3VzZWwtYXBlcnR1cmVcIiBkYXRhLWNhcm91c2VsLWFwZXJ0dXJlPlxcblxcdFxcdFxcdFxcdFxcdDx1bCBjbGFzcz1cImxpc3Qtc3RhY2tlZC1kaXZpZGVyXCIgZGF0YS1jYXJvdXNlbC1saXN0IGRhdGEtdmlldy17e3ZpZXdOYW1lfX0tbGlzdD48L3VsPlxcblxcdFxcdFxcdFxcdDwvZGl2PlxcblxcdFxcdFxcdFxcdDxidXR0b24gY2xhc3M9XCJidG4tdGVydGlhcnkgYnRuLXRleHQtbSBjb250cm9sLW5leHRcIiBkYXRhLWNvbnRyb2wtbmV4dCBkYXRhLWFuYWx5dGljcy1ldmVudD1cIkdldCBuZXh0IHBhZ2VcIiBkYXRhLWFuYWx5dGljcy1zdWJ0eXBlPVwiYnV0dG9uXCI+XFxuXFx0XFx0XFx0XFx0XFx0PHNwYW4gY2xhc3M9XCJidG4tdGV4dC1jb250ZW50XCI+U2hvdyBtb3JlPC9zcGFuPlxcblxcdFxcdFxcdFxcdFxcdDxzcGFuIGNsYXNzPVwicHJvZ3Jlc3Mtc3Bpbm5lclwiPlxcblxcdFxcdFxcdFxcdFxcdFxcdDxzcGFuIGNsYXNzPVwiaGlkZVZpc3VhbGx5XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+UGxlYXNlIHdhaXQgYSBtb21lbnQsIGRhdGEgaXMgbG9hZGluZzwvc3Bhbj5cXG5cXHRcXHRcXHRcXHRcXHQ8L3NwYW4+XFxuXFx0XFx0XFx0XFx0PC9idXR0b24+XFxuXFx0XFx0XFx0PC9kaXY+XFxuXFx0XFx0e3svaWZFcXVhbHN9fVxcblxcdFxcdDx1bCBjbGFzcz1cImxpc3Qtc3RhY2tlZC1kaXZpZGVyXCIgZGF0YS12aWV3LXt7dmlld05hbWV9fS1saXN0PjwvdWw+Jyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWtNNkwzUmxiWEF2UjBjdVJuSnZiblJGYm1RdVYybGtaMlYwY3k5M2FXUm5aWFJ6TDJOb1lYSnBkSGt0WlhabGJuUnpMV0p2WVhKa0wySnZkMlZ5WDJOdmJYQnZibVZ1ZEhNdmFuVnpkR2RwZG1sdVp5MTNhV1JuWlhRdFpuSmhiV1YzYjNKckwyTnZiWEJ2Ym1WdWRITXZiR2xpTDBoaGJtUnNaV0poY25NdmNHRnlkR2xoYkhNdlgyeHBjM1F1YW5NaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWtGQlFVRXNXVUZCV1N4RFFVRkRPenM3T3p0eFFrRkpWeXhMUVVGTE8wRkJSamRDTEVsQlFVa3NWVUZCVlN4SFFVRkhMRTlCUVU4c1EwRkJReXhaUVVGWkxFTkJRVU1zUTBGQlF6czdRVUZGZUVJc1UwRkJVeXhMUVVGTExFZEJRVWs3UVVGRGFFTXNWMEZCVlN4RFFVRkRMR1ZCUVdVc1EwRkJReXhOUVVGTkxHdHRRMEZ4UW1oRExFTkJRVU03UTBGRFJpSXNJbVpwYkdVaU9pSkRPaTkwWlcxd0wwZEhMa1p5YjI1MFJXNWtMbGRwWkdkbGRITXZkMmxrWjJWMGN5OWphR0Z5YVhSNUxXVjJaVzUwY3kxaWIyRnlaQzlpYjNkbGNsOWpiMjF3YjI1bGJuUnpMMnAxYzNSbmFYWnBibWN0ZDJsa1oyVjBMV1p5WVcxbGQyOXlheTlqYjIxd2IyNWxiblJ6TDJ4cFlpOUlZVzVrYkdWaVlYSnpMM0JoY25ScFlXeHpMMTlzYVhOMExtcHpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpSjNWelpTQnpkSEpwWTNRbk8xeHlYRzVjY2x4dWJHVjBJRWhoYm1Sc1pXSmhjbk1nUFNCeVpYRjFhWEpsS0NkSVlXNWtiR1ZpWVhKekp5azdYSEpjYmx4eVhHNWxlSEJ2Y25RZ1pHVm1ZWFZzZENCbWRXNWpkR2x2YmlCZmJHbHpkQ0FvS1NCN1hISmNibHgwU0dGdVpHeGxZbUZ5Y3k1eVpXZHBjM1JsY2xCaGNuUnBZV3dvSjJ4cGMzUW5MRnh5WEc0Z0lDQWdYSFJnZTNzamFXWkZjWFZoYkhNZ2FHRnpRMkZ5YjNWelpXd2dKM1J5ZFdVbmZYMWNkRnh5WEc0Z0lDQWdYSFJjZER4a2FYWWdZMnhoYzNNOVhDSmpZWEp2ZFhObGJDMXpkR0ZqYTJWa1hDSWdaR0YwWVMxallYSnZkWE5sYkQxY0ludDdkbWxsZDA1aGJXVjlmVndpUGx4eVhHNWNkRngwWEhSY2REeGlkWFIwYjI0Z1kyeGhjM005WENKaWRHNHRhV052Ymkxc0lHTnZiblJ5YjJ3dGNISmxkbHdpSUdSaGRHRXRZMjl1ZEhKdmJDMXdjbVYySUdSaGRHRXRZVzVoYkhsMGFXTnpMV1YyWlc1MFBWd2lSMlYwSUhCeVpYWnBiM1Z6SUhCaFoyVmNJaUJrWVhSaExXRnVZV3g1ZEdsamN5MXpkV0owZVhCbFBWd2lZblYwZEc5dVhDSStYSEpjYmx4MFhIUmNkRngwWEhROGMzQmhiaUJqYkdGemN6MWNJbWhwWkdWV2FYTjFZV3hzZVZ3aVBsQnlaWFpwYjNWeklIQmhaMlU4TDNOd1lXNCtYSEpjYmx4MFhIUmNkRngwWEhROGMzQmhiaUJqYkdGemN6MWNJbUowYmkxcFkyOXVMV052Ym5SbGJuUmNJajVjY2x4dVhIUmNkRngwWEhSY2RGeDBQSE53WVc0Z1kyeGhjM005WENKemNISnBkR1V0WTJobGRuSnZiaTExY0Mxc1hDSStQQzl6Y0dGdVBseHlYRzVjZEZ4MFhIUmNkRngwUEM5emNHRnVQbHh5WEc1Y2RGeDBYSFJjZER3dlluVjBkRzl1UGx4eVhHNWNkRngwWEhSY2REeGthWFlnWTJ4aGMzTTlYQ0pqWVhKdmRYTmxiQzFoY0dWeWRIVnlaVndpSUdSaGRHRXRZMkZ5YjNWelpXd3RZWEJsY25SMWNtVStYSEpjYmx4MFhIUmNkRngwWEhROGRXd2dZMnhoYzNNOVhDSnNhWE4wTFhOMFlXTnJaV1F0WkdsMmFXUmxjbHdpSUdSaGRHRXRZMkZ5YjNWelpXd3RiR2x6ZENCa1lYUmhMWFpwWlhjdGUzdDJhV1YzVG1GdFpYMTlMV3hwYzNRK1BDOTFiRDVjY2x4dVhIUmNkRngwWEhROEwyUnBkajVjY2x4dVhIUmNkRngwWEhROFluVjBkRzl1SUdOc1lYTnpQVndpWW5SdUxYUmxjblJwWVhKNUlHSjBiaTEwWlhoMExXMGdZMjl1ZEhKdmJDMXVaWGgwWENJZ1pHRjBZUzFqYjI1MGNtOXNMVzVsZUhRZ1pHRjBZUzFoYm1Gc2VYUnBZM010WlhabGJuUTlYQ0pIWlhRZ2JtVjRkQ0J3WVdkbFhDSWdaR0YwWVMxaGJtRnNlWFJwWTNNdGMzVmlkSGx3WlQxY0ltSjFkSFJ2Ymx3aVBseHlYRzVjZEZ4MFhIUmNkRngwUEhOd1lXNGdZMnhoYzNNOVhDSmlkRzR0ZEdWNGRDMWpiMjUwWlc1MFhDSStVMmh2ZHlCdGIzSmxQQzl6Y0dGdVBseHlYRzVjZEZ4MFhIUmNkRngwUEhOd1lXNGdZMnhoYzNNOVhDSndjbTluY21WemN5MXpjR2x1Ym1WeVhDSStYSEpjYmx4MFhIUmNkRngwWEhSY2REeHpjR0Z1SUdOc1lYTnpQVndpYUdsa1pWWnBjM1ZoYkd4NVhDSWdZWEpwWVMxb2FXUmtaVzQ5WENKMGNuVmxYQ0krVUd4bFlYTmxJSGRoYVhRZ1lTQnRiMjFsYm5Rc0lHUmhkR0VnYVhNZ2JHOWhaR2x1Wnp3dmMzQmhiajVjY2x4dVhIUmNkRngwWEhSY2REd3ZjM0JoYmo1Y2NseHVYSFJjZEZ4MFhIUThMMkoxZEhSdmJqNWNjbHh1WEhSY2RGeDBQQzlrYVhZK1hISmNibHgwWEhSN2V5OXBaa1Z4ZFdGc2MzMTlYSEpjYmx4MFhIUThkV3dnWTJ4aGMzTTlYQ0pzYVhOMExYTjBZV05yWldRdFpHbDJhV1JsY2x3aUlHUmhkR0V0ZG1sbGR5MTdlM1pwWlhkT1lXMWxmWDB0YkdsemRENDhMM1ZzUG1CY2NseHVYSFFwTzF4eVhHNTlJbDE5IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG5cdHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOyB9IH1cblxudmFyIF9qc0RPTUdldFZlbmRvclByb3BlcnR5ID0gcmVxdWlyZSgnLi4vanMvRE9NL2dldFZlbmRvclByb3BlcnR5Jyk7XG5cbnZhciBfanNET01HZXRWZW5kb3JQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9qc0RPTUdldFZlbmRvclByb3BlcnR5KTtcblxuLyoqXHJcbiAqIEFkZCBhIGNhcm91c2VsIHRvIGEgbGlzdCB2aWV3XHJcbiAqIEBjbGFzc2Rlc2MgQWRkIGEgY2Fyb3VzZWwgZm9yIHBhZ2luYXRpb24gb2YgY2FyZCBsaXN0IHZpZXdzXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLnZpZXcuIFRoZSB2aWV3IHRoYXQgdGhlIGNhcm91c2VsIHBhZ2luYXRlcyBbcmVxdWlyZWRdXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLndpZGdldC4gVGhlIHdpZGdldCBpbnN0YW5jZSBbcmVxdWlyZWRdXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLnBhZ2VTaXplLiBUaGUgbnVtYmVyIG9mIGxpc3QgaXRlbXMgdG8gc2hvdyBpbiBlYWNoIGNhcm91c2VsIHBhZ2VcclxuICogQHBhcmFtIHtCb29sZWFufSBvcHRpb25zLmlzSW5maW5pdGUuIFdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gZGlzcGxheWVkIGlzIHBhZ2luYXRlZCBvbiB0aGUgUkVTVCBBUElcclxuICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMubmV4dFBhZ2VCdWZmZXIuIE51bWJlciBvZiBjYXJvdXNlbCBwYWdlcyBiZWZvcmUgdGhlIGxhc3QgYXQgd2hpY2ggdG8gZmV0Y2ggbmV4dCBBUEkgcGFnZS5cclxuICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMuZWwuIFRoZSBjYXJvdXNlbCBwYXJlbnQgZWxlbWVudFxyXG4gKiBAY2xhc3MgU2V0IGNhcm91c2VsIGluc3RhbmNlIHByb3BlcnRpZXM7IGNhY2hlIGFwZXJ0dXJlLCBjb250cm9sIGFuZCBsaXN0IGVsZW1lbnRzOyBzZXQgY3VycmVudCBwYWdlOyBcclxuICovXG52YXIgSGFtbWVyID0gcmVxdWlyZSgnaGFtbWVyanMnKTtcblxudmFyIENhcm91c2VsID0gKGZ1bmN0aW9uICgpIHtcblx0ZnVuY3Rpb24gQ2Fyb3VzZWwoKSB7XG5cdFx0dmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1swXTtcblxuXHRcdHZhciB2aWV3ID0gX3JlZi52aWV3O1xuXHRcdHZhciB3aWRnZXQgPSBfcmVmLndpZGdldDtcblx0XHR2YXIgcGFnZVNpemUgPSBfcmVmLnBhZ2VTaXplO1xuXHRcdHZhciBpc0luZmluaXRlID0gX3JlZi5pc0luZmluaXRlO1xuXHRcdHZhciBuZXh0UGFnZUJ1ZmZlciA9IF9yZWYubmV4dFBhZ2VCdWZmZXI7XG5cdFx0dmFyIGVsID0gX3JlZi5lbDtcblx0XHR2YXIgc3dpcGUgPSBfcmVmLnN3aXBlO1xuXG5cdFx0X2NsYXNzQ2FsbENoZWNrKHRoaXMsIENhcm91c2VsKTtcblxuXHRcdHRoaXMudmlldyA9IHZpZXc7XG5cdFx0dGhpcy53aWRnZXQgPSB3aWRnZXQ7XG5cdFx0dGhpcy5wYWdlU2l6ZSA9IHBhZ2VTaXplIHx8IDM7XG5cdFx0dGhpcy5pc0luZmluaXRlID0gaXNJbmZpbml0ZTtcblx0XHR0aGlzLnN3aXBlID0gc3dpcGU7XG5cdFx0dGhpcy5uZXh0UGFnZUJ1ZmZlciA9IG5leHRQYWdlQnVmZmVyIHx8IDI7XG5cdFx0dGhpcy5lbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWwpO1xuXHRcdGlmICghdGhpcy5lbCB8fCAhdGhpcy53aWRnZXQgfHwgIXRoaXMudmlldykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLnZpZXcuY2Fyb3VzZWwgPSB0aGlzO1xuXHRcdHRoaXMuYXBlcnR1cmUgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNhcm91c2VsLWFwZXJ0dXJlXScpO1xuXHRcdHRoaXMuYnRuTmV4dCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtY29udHJvbC1uZXh0XScpO1xuXHRcdHRoaXMuYnRuUHJldiA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtY29udHJvbC1wcmV2XScpO1xuXHRcdHRoaXMuc3RyaXAgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNhcm91c2VsLWxpc3RdJyk7XG5cdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XG5cdFx0dGhpcy5pbml0KCk7XG5cdH1cblxuXHQvKipcclxuICAqIEluaXRpYWxpc2UgdGhlIGNhcm91c2VsXHJcbiAgKi9cblxuXHRfY3JlYXRlQ2xhc3MoQ2Fyb3VzZWwsIFt7XG5cdFx0a2V5OiAnaW5pdCcsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGluaXQoKSB7XG5cdFx0XHR0aGlzLmxhc3RQYWdlID0gdGhpcy5nZXRMYXN0UGFnZSgpO1xuXHRcdFx0dGhpcy50cmFuc2xhdGUzZCA9IHdpbmRvdy5famd3aWRnZXQuZmVhdHVyZXMuY3NzdHJhbnNmb3JtczNkO1xuXHRcdFx0dGhpcy5pc0luZmluaXRlICYmIHRoaXMuZ2V0TWF4UGFnZSgpO1xuXHRcdFx0dGhpcy5zZXRBcGVydHVyZSgpO1xuXHRcdFx0dGhpcy5zZXRDb250cm9sU3RhdGUoKTtcblx0XHRcdHRoaXMuYmluZExpc3RlbmVycygpO1xuXHRcdFx0dGhpcy5zZXRDYXJkU3RhdGUoKTtcblx0XHRcdHRoaXMuaXNCdWZmZXIoKSAmJiB0aGlzLmxvYWRNb3JlQ2FyZHMoKTtcblx0XHR9XG5cblx0XHQvKipcclxuICAgKiBTZXQgdGhlIGFwZXJ0dXJlIG9mIHRoZSBjYXJvdXNlbFxyXG4gICAqIEBkZXNjcmlwdGlvbiBTZXQgdGhlIHNpemUgb2YgdGhlIGFwZXJ0dXJlIGJhc2VkIG9uIHNwZWNpZmllZCBwYWdlIHNpemUuIEFzc3VtZXMgYWxsIGNhcmRzIGhhdmUgdGhlIHNhbWUgaGVpZ2h0LlxyXG4gICAqL1xuXHR9LCB7XG5cdFx0a2V5OiAnc2V0QXBlcnR1cmUnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBzZXRBcGVydHVyZSgpIHtcblx0XHRcdHZhciBjYXJkID0gdGhpcy5hcGVydHVyZS5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jYXJkXScpO1xuXHRcdFx0dGhpcy5hcGVydHVyZVNpemUgPSAoY2FyZC5vZmZzZXRIZWlnaHQgKyBwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKGNhcmQpLm1hcmdpbkJvdHRvbSwgMTApICsgcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShjYXJkKS5tYXJnaW5Ub3AsIDEwKSkgKiB0aGlzLnBhZ2VTaXplO1xuXHRcdFx0dGhpcy5hcGVydHVyZS5zdHlsZS5oZWlnaHQgPSB0aGlzLmFwZXJ0dXJlU2l6ZSArICdweCc7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgICogR2V0IHRoZSBbY3VycmVudF0gbGFzdCBwYWdlIG9mIHRoZSBjYXJvdXNlbFxyXG4gICAqIEBkZXNjcmlwdGlvbiBGaW5kcyB0aGUgbGFzdCBwYWdlIG51bWJlciBvZiB0aGUgY2Fyb3VzZWwuIFN1YmplY3QgdG8gdXBkYXRlIGlmIHRoZSBjYXJvdXNlbCBpcyBpbmZpbml0ZVxyXG4gICAqIEByZXR1cm5zIHtOdW1iZXJ9IEludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBsYXN0IGNhcm91c2VsIHBhZ2UuXHJcbiAgICovXG5cdH0sIHtcblx0XHRrZXk6ICdnZXRMYXN0UGFnZScsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGdldExhc3RQYWdlKCkge1xuXHRcdFx0dmFyIGNhcmRDb3VudCA9IHRoaXMuYXBlcnR1cmUucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtY2FyZF0nKS5sZW5ndGg7XG5cdFx0XHRyZXR1cm4gcGFyc2VJbnQoY2FyZENvdW50IC8gdGhpcy5wYWdlU2l6ZSwgMTApICsgKGNhcmRDb3VudCAlIHRoaXMucGFnZVNpemUgPiAwID8gMSA6IDApO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gICAqIEdldCB0aGUgbWF4aW11bSBwYWdlIG9mIHRoZSBjYXJvdXNlbFxyXG4gICAqIEBkZXNjcmlwdGlvbiBGb3IgaW5maW5pdGUgY2Fyb3VzZWxzLCBmaW5kcyB0aGUgbWF4aW11bSBwb3NzaWJsZSBwYWdlIG51bWJlciBvZiB0aGUgY2Fyb3VzZWxcclxuICAgKi9cblx0fSwge1xuXHRcdGtleTogJ2dldE1heFBhZ2UnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBnZXRNYXhQYWdlKCkge1xuXHRcdFx0dGhpcy5tYXhQYWdlID0gcGFyc2VJbnQocGFyc2VJbnQodGhpcy52aWV3Lm1vZGVsLiRtb2RlbC5wYWdpbmF0aW9uLnRvdGFsUmVzdWx0cywgMTApIC8gdGhpcy5wYWdlU2l6ZSwgMTApICsgKHRoaXMudmlldy5tb2RlbC4kbW9kZWwucGFnaW5hdGlvbi50b3RhbFJlc3VsdHMgJSB0aGlzLnBhZ2VTaXplID4gMCA/IDEgOiAwKTtcblx0XHR9XG5cblx0XHQvKipcclxuICAgKiBTZXQgYSBmbGFnIHdoZW4gYWxsIHBvc3NpYmxlIGRhdGEgaGFzIGJlZW4gZmV0Y2hlZFxyXG4gICAqIEBkZXNjcmlwdGlvbiBGb3IgaW5maW5pdGUgY2Fyb3VzZWxzLCBzZXRzIGEgZmxhZyB3aGVuIHRoZSBsYXN0IEFQSSBwYWdlIGhhcyBiZWVuIGZldGNoZWQgYW5kIGFkZGVkIHRvIHRoZSBtb2RlbCdzIGNvbGxlY3Rpb25cclxuICAgKi9cblx0fSwge1xuXHRcdGtleTogJ3NldE1heExvYWRlZCcsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIHNldE1heExvYWRlZCgpIHtcblx0XHRcdGlmICh0aGlzLmlzTWF4TG9hZGVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHRoaXMuaXNNYXhMb2FkZWQgPSB0aGlzLmN1cnJlbnRQYWdlID09PSB0aGlzLm1heFBhZ2U7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgICogQmluZCBldmVudCBsaXN0ZW5lcnNcclxuICAgKiBAZGVzY3JpcHRpb24gQmluZCBldmVudCBsaXN0ZW5lcnMgdG8gRE9NIG5vZGVzIGZvciBjYXJvdXNlbCB1c2VyIGludGVyYWN0aW9uXHJcbiAgICovXG5cdH0sIHtcblx0XHRrZXk6ICdiaW5kTGlzdGVuZXJzJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gYmluZExpc3RlbmVycygpIHtcblx0XHRcdHZhciBfdGhpcyA9IHRoaXM7XG5cblx0XHRcdHRoaXMuYnRuTmV4dC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIF90aGlzLnNob3dOZXh0UGFnZSgpO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLmJ0blByZXYuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBfdGhpcy5zaG93UHJldlBhZ2UoKTtcblx0XHRcdH0pO1xuXG5cdFx0XHQvL1N3aXBlIHdpdGggSGFtbWVyXG5cdFx0XHRpZiAodGhpcy5zd2lwZSkge1xuXHRcdFx0XHR2YXIgaGFtbWVyID0gbmV3IEhhbW1lcih0aGlzLnN0cmlwLCB7XG5cdFx0XHRcdFx0dmVsb2NpdHk6IDAuMTVcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmICh0aGlzLnN3aXBlID09PSAndmVydGljYWwnKSB7XG5cdFx0XHRcdFx0aGFtbWVyLmdldCgnc3dpcGUnKS5zZXQoeyBkaXJlY3Rpb246IEhhbW1lci5ESVJFQ1RJT05fVkVSVElDQUwgfSk7XG5cdFx0XHRcdFx0aGFtbWVyLm9uKCdzd2lwZScsIGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0XHRlLmRpcmVjdGlvbiA9PT0gOCAmJiBfdGhpcy5zaG93TmV4dFBhZ2UoKTtcblx0XHRcdFx0XHRcdGUuZGlyZWN0aW9uID09PSAxNiAmJiBfdGhpcy5zaG93UHJldlBhZ2UoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLnN3aXBlID09PSAnaG9yaXpvbnRhbCcpIHtcblx0XHRcdFx0XHRoYW1tZXIub24oJ3N3aXBlbGVmdCcsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBfdGhpcy5zaG93TmV4dFBhZ2UoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRoYW1tZXIub24oJ3N3aXBlcmlnaHQnLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gX3RoaXMuc2hvd1ByZXZQYWdlKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvKipcclxuICAgKiBTZXQgc3RhdGUgb2YgY2Fyb3VzZWwgY29udHJvbHNcclxuICAgKiBAZGVzY3JpcHRpb24gU2V0IHRoZSBzdGF0ZSBvZiBjYXJvdXNlbCBjb250cm9scyBbZW5hYmxlZCwgZGlzYWJsZWRdIGJhc2VkIG9uIGN1cnJlbnQgY2Fyb3VzZWwgcGFnZVxyXG4gICAqL1xuXHR9LCB7XG5cdFx0a2V5OiAnc2V0Q29udHJvbFN0YXRlJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gc2V0Q29udHJvbFN0YXRlKCkge1xuXHRcdFx0aWYgKHRoaXMuY3VycmVudFBhZ2UgPT09IDEpIHtcblx0XHRcdFx0dGhpcy5idG5QcmV2LnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcblx0XHRcdFx0dGhpcy5idG5QcmV2LnNldEF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcsICd0cnVlJyk7XG5cdFx0XHRcdHRoaXMuYnRuUHJldi5jbGFzc0xpc3QuYWRkKCdpcy1kaXNhYmxlZCcpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5idG5QcmV2LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcblx0XHRcdFx0dGhpcy5idG5QcmV2LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcpO1xuXHRcdFx0XHR0aGlzLmJ0blByZXYuY2xhc3NMaXN0LnJlbW92ZSgnaXMtZGlzYWJsZWQnKTtcblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLmN1cnJlbnRQYWdlID09PSB0aGlzLmxhc3RQYWdlKSB7XG5cdFx0XHRcdHRoaXMuYnRuTmV4dC5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG5cdFx0XHRcdHRoaXMuYnRuTmV4dC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnLCAndHJ1ZScpO1xuXHRcdFx0XHR0aGlzLmJ0bk5leHQuY2xhc3NMaXN0LmFkZCgnaXMtZGlzYWJsZWQnKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuYnRuTmV4dC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG5cdFx0XHRcdHRoaXMuYnRuTmV4dC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnKTtcblx0XHRcdFx0dGhpcy5idG5OZXh0LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWRpc2FibGVkJyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgICogU2hvdyB0aGUgbmV4dCBwYWdlIG9mIHRoZSBjYXJvdXNlbFxyXG4gICAqIEBkZXNjcmlwdGlvbiBUcmFuc2l0aW9uIHRoZSBsaXN0IHRvIHNob3cgdGhlIG5leHQgcGFnZTsgZmV0Y2ggbW9yZSBjYXJkcyBpZiB3ZSBhcmUgb24gdGhlIGJ1ZmZlciBwYWdlIFtpbmZpbml0ZSBjYXJvdXNlbHNdOyBcclxuICAgKiBzZXQgbWF4IGxvYWRlZCBmbGFnOyBzZXQgY29udHJvbGxlciBzdGF0ZTsgc2V0IGNhcmRzIHN0YXRlIGFuZCBmaXJlIGFuYWx5dGljcyBpbXByZXNzaW9ucyBmb3IgbmV3bHkgdmlzaWJsZSBjYXJkc1xyXG4gICAqL1xuXHR9LCB7XG5cdFx0a2V5OiAnc2hvd05leHRQYWdlJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gc2hvd05leHRQYWdlKCkge1xuXHRcdFx0aWYgKHRoaXMuY3VycmVudFBhZ2UgKyAxID4gdGhpcy5sYXN0UGFnZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnRyYW5zaXRpb24odGhpcy5hcGVydHVyZVNpemUgKiB0aGlzLmN1cnJlbnRQYWdlKTtcblx0XHRcdHRoaXMuY3VycmVudFBhZ2UgKz0gMTtcblxuXHRcdFx0aWYgKHRoaXMuaXNCdWZmZXIoKSkge1xuXHRcdFx0XHR0aGlzLmxvYWRNb3JlQ2FyZHMoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuc2V0Q29udHJvbFN0YXRlKCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnNldE1heExvYWRlZCgpO1xuXHRcdFx0dGhpcy5zZXRDYXJkU3RhdGUoKTtcblx0XHRcdHRoaXMud2lkZ2V0LmFuYWx5dGljcy5jYXJkSW1wcmVzc2lvbnMoKTtcblx0XHR9XG5cblx0XHQvKipcclxuICAgKiBTaG93IHRoZSBwcmV2aW91cyBwYWdlIG9mIHRoZSBjYXJvdXNlbFxyXG4gICAqIEBkZXNjcmlwdGlvbiBUcmFuc2l0aW9uIHRoZSBsaXN0IHRvIHNob3cgdGhlIHByZXZpb3VzIHBhZ2U7IHNldCBjb250cm9sbGVyIHN0YXRlO1xyXG4gICAqIHNldCBjYXJkcyBzdGF0ZSBhbmQgZmlyZSBhbmFseXRpY3MgaW1wcmVzc2lvbnMgZm9yIG5ld2x5IHZpc2libGUgY2FyZHNcclxuICAgKi9cblx0fSwge1xuXHRcdGtleTogJ3Nob3dQcmV2UGFnZScsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIHNob3dQcmV2UGFnZSgpIHtcblx0XHRcdGlmICh0aGlzLmN1cnJlbnRQYWdlIC0gMSA8IDEpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5jdXJyZW50UGFnZSAtPSAxO1xuXHRcdFx0dGhpcy50cmFuc2l0aW9uKHRoaXMuYXBlcnR1cmVTaXplICogdGhpcy5jdXJyZW50UGFnZSAtIHRoaXMuYXBlcnR1cmVTaXplKTtcblx0XHRcdHRoaXMuc2V0Q29udHJvbFN0YXRlKCk7XG5cdFx0XHR0aGlzLnNldENhcmRTdGF0ZSgpO1xuXHRcdFx0dGhpcy53aWRnZXQuYW5hbHl0aWNzLmNhcmRJbXByZXNzaW9ucygpO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gICAqIFRyYW5zaXRpb24gdGhlIGxpc3RcclxuICAgKiBAZGVzY3JpcHRpb24gVHJhbnNpdGlvbiB0aGUgbGlzdCB0byBzaG93IG5ldyBjYXJkcywgdXNpbmcgZWl0aGVyICd0cmFuc2Zvcm0gdHJhbnNsYXRlM2QnIGlmIHN1cHBvcnRlZCBvciAndG9wJyBvdGhlcndpc2UuXHJcbiAgICogQXNzdW1lcyB0aGUgbGlzdCBoYXMgYSB0cmFuc2l0aW9uIENTUyBwcm9wZXJ0eSByZWdpc3RlcmVkIGFnYWluc3QgJ2FsbCcgb3IgJ3RvcCcgYW5kICd0cmFuc2Zvcm0nXHJcbiAgICovXG5cdH0sIHtcblx0XHRrZXk6ICd0cmFuc2l0aW9uJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gdHJhbnNpdGlvbih0b3ApIHtcblx0XHRcdGlmICh0aGlzLnRyYW5zbGF0ZTNkKSB7XG5cdFx0XHRcdHRoaXMuc3RyaXAuc3R5bGVbKDAsIF9qc0RPTUdldFZlbmRvclByb3BlcnR5MlsnZGVmYXVsdCddKSgndHJhbnNmb3JtJyldID0gJ3RyYW5zbGF0ZTNkKDAsIC0nICsgdG9wICsgJ3B4LCAwKSc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLnN0cmlwLnN0eWxlLnRvcCA9ICctJyArIHRvcCArICdweCc7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgICogU2V0IHRoZSBjdXJyZW50IHN0YXRlIGZsYWdzIG9mIHRoZSBjYXJkc1xyXG4gICAqIEBkZXNjcmlwdGlvbiBSZXNldCBhbGwgY2FyZHMgdG8gaGlkZGVuIFthcmlhLSwgZGF0YS1dOyBzZXQgdmlzaWJsZSBjYXJkcyB0byAndmlzaWJsZScgW2FyaWEtLCBkYXRhLV1cclxuICAgKi9cblx0fSwge1xuXHRcdGtleTogJ3NldENhcmRTdGF0ZScsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIHNldENhcmRTdGF0ZSgpIHtcblx0XHRcdHRoaXMuZmlyc3RDYXJkID0gdGhpcy5jdXJyZW50UGFnZSAqIHRoaXMucGFnZVNpemUgLSB0aGlzLnBhZ2VTaXplO1xuXHRcdFx0dGhpcy5sYXN0Q2FyZCA9IHRoaXMuZmlyc3RDYXJkICsgKHRoaXMucGFnZVNpemUgLSAxKTtcblxuXHRcdFx0W10uc2xpY2UuY2FsbCh0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWNhcmRdJykpLmZvckVhY2goZnVuY3Rpb24gKGNhcmQpIHtcblx0XHRcdFx0Y2FyZC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcblx0XHRcdFx0Y2FyZC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaGlkZGVuJywgJ3RydWUnKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRmb3IgKHZhciBpID0gdGhpcy5maXJzdENhcmQ7IGkgPCB0aGlzLmxhc3RDYXJkICsgMTsgaSsrKSB7XG5cdFx0XHRcdHZhciBjYXJkID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jYXJkXScpW2ldO1xuXHRcdFx0XHRpZiAoIWNhcmQpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjYXJkLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAnZmFsc2UnKTtcblx0XHRcdFx0Y2FyZC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaGlkZGVuJyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgICogQ2hlY2sgaWYgd2UgYXJlIG9uIGJ1ZmZlciBwYWdlXHJcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrIGlmIHdlIGFyZSBvbiB0aGUgY2Fyb3VzZWwgcGFnZSBzZXQgYXMgbmV4dFBhZ2VCdWZmZXJcclxuICAgKi9cblx0fSwge1xuXHRcdGtleTogJ2lzQnVmZmVyJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gaXNCdWZmZXIoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5pc0luZmluaXRlICYmIHRoaXMuY3VycmVudFBhZ2UgPT09IHRoaXMubGFzdFBhZ2UgLSB0aGlzLm5leHRQYWdlQnVmZmVyICYmICF0aGlzLmlzTWF4TG9hZGVkO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gICAqIExvYWQgbW9yZSBjYXJkcyBmZXRjaGVkIGZyb20gdGhlIHNlcnZlciBbaW5maW5pdGUgY2Fyb3VzZWxzXVxyXG4gICAqIEBkZXNjcmlwdGlvbiBUcmlnZ2VyIHRoZSB2aWV3IHRvIGZldGNoIGFuZCBhcHBlbmQgdGhlIG5leHQgQVBJIHBhZ2Ugb2YgcmVzdWx0cyBbY2FyZHNdOyBzZXQgY29udHJvbHMgc3RhdGUgd2hpbHN0IGRhdGEgaXNcclxuICAgKiBiZWluZyBsb2FkZWQ7IG9uY2UgbG9hZGVkIHRyaWdnZXIgbmV3IGFuYWx5dGljcyBjYXJkcyBpbml0aWFsaXNlOyB1cGRhdGUgY2Fyb3VzZWwgYW5kIGNhcmQgc3RhdGUgdmFyaWFibGVzOyByZXZlcnRcclxuICAgKiBjb250cm9scyBzdGF0ZXNcclxuICAgKi9cblx0fSwge1xuXHRcdGtleTogJ2xvYWRNb3JlQ2FyZHMnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBsb2FkTW9yZUNhcmRzKCkge1xuXHRcdFx0dmFyIF90aGlzMiA9IHRoaXM7XG5cblx0XHRcdHRoaXMuYnRuTmV4dC5jbGFzc0xpc3QuYWRkKCdpcy1sb2FkaW5nJywgJ2lzLWRpc2FibGVkJyk7XG5cdFx0XHR0aGlzLmJ0bk5leHQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xuXHRcdFx0dGhpcy52aWV3LmFwcGVuZE5leHRQYWdlKCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdF90aGlzMi53aWRnZXQuYW5hbHl0aWNzLmNhcmRzSW5pdCgpO1xuXHRcdFx0XHRfdGhpczIubGFzdFBhZ2UgPSBfdGhpczIuZ2V0TGFzdFBhZ2UoKTtcblx0XHRcdFx0X3RoaXMyLnNldENhcmRTdGF0ZSgpO1xuXHRcdFx0XHRfdGhpczIuc2V0Q29udHJvbFN0YXRlKCk7XG5cdFx0XHRcdF90aGlzMi5idG5OZXh0LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWxvYWRpbmcnLCAnaXMtZGlzYWJsZWQnKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gICAqIFJlc2V0IHRoZSBjYXJvdXNlbCB0byBmaXJzdCBwYWdlXHJcbiAgICogQGRlc2NyaXB0aW9uIFJlc2V0IHRoZSBjYXJvdXNlbCB0byBzaG93IHRoZSBmaXJzdCBwYWdlOyByZXNldCBhbGwgY2Fyb3VzZWwgc3RhdGUgdmFyaWFibGVzIGFuZCBzZXQgY29udHJvbHMgc3RhdGU7XHJcbiAgICogY2hlY2sgaWYgd2UgYXJlIG9uIGJ1ZmZlciBwYWdlIGFuZCBpZiB0cnVlIGxvYWQgbW9yZSBjYXJkc1xyXG4gICAqL1xuXHR9LCB7XG5cdFx0a2V5OiAncmVzZXQnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiByZXNldCgpIHtcblx0XHRcdHRoaXMudHJhbnNpdGlvbigwKTtcblx0XHRcdHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuXHRcdFx0dGhpcy5sYXN0UGFnZSA9IHRoaXMuZ2V0TGFzdFBhZ2UoKTtcblx0XHRcdHRoaXMuaXNNYXhMb2FkZWQgPSBmYWxzZTtcblx0XHRcdHRoaXMuc2V0Q29udHJvbFN0YXRlKCk7XG5cdFx0XHR0aGlzLnNldENhcmRTdGF0ZSgpO1xuXHRcdFx0dGhpcy5pc0J1ZmZlcigpICYmIHRoaXMubG9hZE1vcmVDYXJkcygpO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gICAqIFJlZnJlc2ggdGhlIGNhcm91c2VsXHJcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZSBjYXJvdXNlbCBzdGF0ZSB2YXJpYWJsZXMgbGFzdCBwYWdlXHJcbiAgICovXG5cdH0sIHtcblx0XHRrZXk6ICdyZWZyZXNoJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gcmVmcmVzaCgpIHtcblx0XHRcdHRoaXMubGFzdFBhZ2UgPSB0aGlzLmdldExhc3RQYWdlKCk7XG5cdFx0fVxuXHR9XSk7XG5cblx0cmV0dXJuIENhcm91c2VsO1xufSkoKTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gQ2Fyb3VzZWw7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklrTTZMM1JsYlhBdlIwY3VSbkp2Ym5SRmJtUXVWMmxrWjJWMGN5OTNhV1JuWlhSekwyTm9ZWEpwZEhrdFpYWmxiblJ6TFdKdllYSmtMMkp2ZDJWeVgyTnZiWEJ2Ym1WdWRITXZhblZ6ZEdkcGRtbHVaeTEzYVdSblpYUXRabkpoYldWM2IzSnJMMk52YlhCdmJtVnVkSE12YkdsaUwyTmhjbTkxYzJWc0wwTmhjbTkxYzJWc0xtcHpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSkJRVUZCTEZsQlFWa3NRMEZCUXpzN096czdPenM3T3pzN08zTkRRVWRwUWl3MlFrRkJOa0k3T3pzN096czdPenM3T3pzN096czdRVUZFTTBRc1NVRkJTU3hOUVVGTkxFZEJRVWNzVDBGQlR5eERRVUZETEZWQlFWVXNRMEZCUXl4RFFVRkRPenRKUVdVelFpeFJRVUZSTzBGQlEwUXNWVUZFVUN4UlFVRlJMRWRCUXpCRk8yMUZRVUZNTEVWQlFVVTdPMDFCUVhCRkxFbEJRVWtzVVVGQlNpeEpRVUZKTzAxQlFVVXNUVUZCVFN4UlFVRk9MRTFCUVUwN1RVRkJSU3hSUVVGUkxGRkJRVklzVVVGQlVUdE5RVUZGTEZWQlFWVXNVVUZCVml4VlFVRlZPMDFCUVVVc1kwRkJZeXhSUVVGa0xHTkJRV003VFVGQlJTeEZRVUZGTEZGQlFVWXNSVUZCUlR0TlFVRkZMRXRCUVVzc1VVRkJUQ3hMUVVGTE96dDNRa0ZFZUVVc1VVRkJVVHM3UVVGRldpeE5RVUZKTEVOQlFVTXNTVUZCU1N4SFFVRkhMRWxCUVVrc1EwRkJRenRCUVVOcVFpeE5RVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkhMRTFCUVUwc1EwRkJRenRCUVVOeVFpeE5RVUZKTEVOQlFVTXNVVUZCVVN4SFFVRkhMRkZCUVZFc1NVRkJTU3hEUVVGRExFTkJRVU03UVVGRE9VSXNUVUZCU1N4RFFVRkRMRlZCUVZVc1IwRkJSeXhWUVVGVkxFTkJRVU03UVVGRE4wSXNUVUZCU1N4RFFVRkRMRXRCUVVzc1IwRkJSeXhMUVVGTExFTkJRVU03UVVGRGJrSXNUVUZCU1N4RFFVRkRMR05CUVdNc1IwRkJSeXhqUVVGakxFbEJRVWtzUTBGQlF5eERRVUZETzBGQlF6RkRMRTFCUVVrc1EwRkJReXhGUVVGRkxFZEJRVWNzVVVGQlVTeERRVUZETEdGQlFXRXNRMEZCUlN4RlFVRkZMRU5CUVVVc1EwRkJRenRCUVVOMlF5eE5RVUZMTEVOQlFVTXNTVUZCU1N4RFFVRkRMRVZCUVVVc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1NVRkJTU3hGUVVGSE8wRkJRemRETEZWQlFVODdSMEZEVUR0QlFVTkVMRTFCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zVVVGQlVTeEhRVUZITEVsQlFVa3NRMEZCUXp0QlFVTXhRaXhOUVVGSkxFTkJRVU1zVVVGQlVTeEhRVUZITEVsQlFVa3NRMEZCUXl4RlFVRkZMRU5CUVVNc1lVRkJZU3hEUVVGRExEQkNRVUV3UWl4RFFVRkRMRU5CUVVNN1FVRkRiRVVzVFVGQlNTeERRVUZETEU5QlFVOHNSMEZCUnl4SlFVRkpMRU5CUVVNc1JVRkJSU3hEUVVGRExHRkJRV0VzUTBGQlF5eHhRa0ZCY1VJc1EwRkJReXhEUVVGRE8wRkJRelZFTEUxQlFVa3NRMEZCUXl4UFFVRlBMRWRCUVVjc1NVRkJTU3hEUVVGRExFVkJRVVVzUTBGQlF5eGhRVUZoTEVOQlFVTXNjVUpCUVhGQ0xFTkJRVU1zUTBGQlF6dEJRVU0xUkN4TlFVRkpMRU5CUVVNc1MwRkJTeXhIUVVGSExFbEJRVWtzUTBGQlF5eEZRVUZGTEVOQlFVTXNZVUZCWVN4RFFVRkRMSE5DUVVGelFpeERRVUZETEVOQlFVTTdRVUZETTBRc1RVRkJTU3hEUVVGRExGZEJRVmNzUjBGQlJ5eERRVUZETEVOQlFVTTdRVUZEY2tJc1RVRkJTU3hEUVVGRExFbEJRVWtzUlVGQlJTeERRVUZETzBWQlExbzdPenM3T3p0alFXNUNTU3hSUVVGUk96dFRRWFZDVWl4blFrRkJSenRCUVVOUUxFOUJRVWtzUTBGQlF5eFJRVUZSTEVkQlFVY3NTVUZCU1N4RFFVRkRMRmRCUVZjc1JVRkJSU3hEUVVGRE8wRkJRMjVETEU5QlFVa3NRMEZCUXl4WFFVRlhMRWRCUVVjc1RVRkJUU3hEUVVGRExGTkJRVk1zUTBGQlF5eFJRVUZSTEVOQlFVTXNaVUZCWlN4RFFVRkRPMEZCUXpkRUxFOUJRVWtzUTBGQlF5eFZRVUZWTEVsQlFVa3NTVUZCU1N4RFFVRkRMRlZCUVZVc1JVRkJSU3hEUVVGRE8wRkJRM0pETEU5QlFVa3NRMEZCUXl4WFFVRlhMRVZCUVVVc1EwRkJRenRCUVVOdVFpeFBRVUZKTEVOQlFVTXNaVUZCWlN4RlFVRkZMRU5CUVVNN1FVRkRka0lzVDBGQlNTeERRVUZETEdGQlFXRXNSVUZCUlN4RFFVRkRPMEZCUTNKQ0xFOUJRVWtzUTBGQlF5eFpRVUZaTEVWQlFVVXNRMEZCUXp0QlFVTndRaXhQUVVGSkxFTkJRVU1zVVVGQlVTeEZRVUZGTEVsQlFVa3NTVUZCU1N4RFFVRkRMR0ZCUVdFc1JVRkJSU3hEUVVGRE8wZEJRM2hET3pzN096czdPenRUUVV0WExIVkNRVUZITzBGQlEyUXNUMEZCU1N4SlFVRkpMRWRCUVVjc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eGhRVUZoTEVOQlFVTXNZVUZCWVN4RFFVRkRMRU5CUVVNN1FVRkRkRVFzVDBGQlNTeERRVUZETEZsQlFWa3NSMEZCUnl4RFFVRkRMRWxCUVVrc1EwRkJReXhaUVVGWkxFZEJRM0pETEZGQlFWRXNRMEZCUlN4blFrRkJaMElzUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXl4WlFVRlpMRVZCUVVVc1JVRkJSU3hEUVVGRkxFZEJRMjVFTEZGQlFWRXNRMEZCUlN4blFrRkJaMElzUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXl4VFFVRlRMRVZCUVVVc1JVRkJSU3hEUVVGRExFTkJRVUVzUjBGREwwTXNTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJRenRCUVVObUxFOUJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNTMEZCU3l4RFFVRkRMRTFCUVUwc1IwRkJUU3hKUVVGSkxFTkJRVU1zV1VGQldTeFBRVUZKTEVOQlFVTTdSMEZEZEVRN096czdPenM3T3p0VFFVMVhMSFZDUVVGSE8wRkJRMlFzVDBGQlNTeFRRVUZUTEVkQlFVY3NTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhuUWtGQlowSXNRMEZCUXl4aFFVRmhMRU5CUVVNc1EwRkJReXhOUVVGTkxFTkJRVU03UVVGRGNrVXNWVUZCVHl4UlFVRlJMRU5CUVVVc1UwRkJVeXhIUVVGSExFbEJRVWtzUTBGQlF5eFJRVUZSTEVWQlFVVXNSVUZCUlN4RFFVRkZMRWxCUVVzc1UwRkJVeXhIUVVGSExFbEJRVWtzUTBGQlF5eFJRVUZSTEVkQlFVY3NRMEZCUXl4SFFVRkhMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVUVzUVVGQlJTeERRVUZETzBkQlF6ZEdPenM3T3pzN096dFRRVXRWTEhOQ1FVRkhPMEZCUTJJc1QwRkJTU3hEUVVGRExFOUJRVThzUjBGQlJ5eFJRVUZSTEVOQlFVVXNVVUZCVVN4RFFVRkZMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEUxQlFVMHNRMEZCUXl4VlFVRlZMRU5CUVVNc1dVRkJXU3hGUVVGRkxFVkJRVVVzUTBGQlJTeEhRVUZITEVsQlFVa3NRMEZCUXl4UlFVRlJMRVZCUVVVc1JVRkJSU3hEUVVGRkxFbEJRek5ITEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFMUJRVTBzUTBGQlF5eFZRVUZWTEVOQlFVTXNXVUZCV1N4SFFVRkhMRWxCUVVrc1EwRkJReXhSUVVGUkxFZEJRVWNzUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVFc1FVRkJReXhEUVVGRE8wZEJRemxGT3pzN096czdPenRUUVV0WkxIZENRVUZITzBGQlEyWXNUMEZCU3l4SlFVRkpMRU5CUVVNc1YwRkJWeXhGUVVGSE8wRkJRM1pDTEZkQlFVODdTVUZEVUR0QlFVTkVMRTlCUVVrc1EwRkJReXhYUVVGWExFZEJRVWNzU1VGQlNTeERRVUZETEZkQlFWY3NTMEZCU3l4SlFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRE8wZEJRM0pFT3pzN096czdPenRUUVV0aExIbENRVUZIT3pzN1FVRkRhRUlzVDBGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4blFrRkJaMElzUTBGQlF5eFBRVUZQTEVWQlFVVTdWMEZCVFN4TlFVRkxMRmxCUVZrc1JVRkJSVHRKUVVGQkxFTkJRVVVzUTBGQlF6dEJRVU51UlN4UFFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExHZENRVUZuUWl4RFFVRkRMRTlCUVU4c1JVRkJSVHRYUVVGTkxFMUJRVXNzV1VGQldTeEZRVUZGTzBsQlFVRXNRMEZCUlN4RFFVRkRPenM3UVVGSGJrVXNUMEZCU3l4SlFVRkpMRU5CUVVNc1MwRkJTeXhGUVVGSE8wRkJRMnBDTEZGQlFVa3NUVUZCVFN4SFFVRkhMRWxCUVVrc1RVRkJUU3hEUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVWQlFVVTdRVUZEYmtNc1lVRkJVU3hGUVVGRkxFbEJRVWs3UzBGRFpDeERRVUZETEVOQlFVTTdRVUZEU0N4UlFVRkxMRWxCUVVrc1EwRkJReXhMUVVGTExFdEJRVXNzVlVGQlZTeEZRVUZITzBGQlEyaERMRmRCUVUwc1EwRkJReXhIUVVGSExFTkJRVU1zVDBGQlR5eERRVUZETEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1UwRkJVeXhGUVVGRkxFMUJRVTBzUTBGQlF5eHJRa0ZCYTBJc1JVRkJSU3hEUVVGRExFTkJRVU03UVVGRGJFVXNWMEZCVFN4RFFVRkRMRVZCUVVVc1EwRkJReXhQUVVGUExFVkJRVVVzVlVGQlF5eERRVUZETEVWQlFVczdRVUZEZWtJc1QwRkJReXhEUVVGRExGTkJRVk1zUzBGQlN5eERRVUZETEVsQlFVa3NUVUZCU3l4WlFVRlpMRVZCUVVVc1EwRkJRenRCUVVONlF5eFBRVUZETEVOQlFVTXNVMEZCVXl4TFFVRkxMRVZCUVVVc1NVRkJTU3hOUVVGTExGbEJRVmtzUlVGQlJTeERRVUZETzAxQlF6RkRMRU5CUVVNc1EwRkJRenRMUVVOSUxFMUJRVTBzU1VGQlN5eEpRVUZKTEVOQlFVTXNTMEZCU3l4TFFVRkxMRmxCUVZrc1JVRkJSenRCUVVONlF5eFhRVUZOTEVOQlFVTXNSVUZCUlN4RFFVRkRMRmRCUVZjc1JVRkJSVHRoUVVGTkxFMUJRVXNzV1VGQldTeEZRVUZGTzAxQlFVRXNRMEZCUlN4RFFVRkRPMEZCUTI1RUxGZEJRVTBzUTBGQlF5eEZRVUZGTEVOQlFVTXNXVUZCV1N4RlFVRkZPMkZCUVUwc1RVRkJTeXhaUVVGWkxFVkJRVVU3VFVGQlFTeERRVUZGTEVOQlFVTTdTMEZEY0VRN1NVRkRSRHRIUVVORU96czdPenM3T3p0VFFVdGxMREpDUVVGSE8wRkJRMnhDTEU5QlFVa3NTVUZCU1N4RFFVRkRMRmRCUVZjc1MwRkJTeXhEUVVGRExFVkJRVVU3UVVGRE0wSXNVVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhaUVVGWkxFTkJRVU1zVlVGQlZTeEZRVUZGTEZWQlFWVXNRMEZCUXl4RFFVRkRPMEZCUTJ4RUxGRkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNXVUZCV1N4RFFVRkRMR1ZCUVdVc1JVRkJSU3hOUVVGTkxFTkJRVU1zUTBGQlF6dEJRVU51UkN4UlFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExGTkJRVk1zUTBGQlF5eEhRVUZITEVOQlFVTXNZVUZCWVN4RFFVRkRMRU5CUVVNN1NVRkRNVU1zVFVGQlRUdEJRVU5PTEZGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1pVRkJaU3hEUVVGRExGVkJRVlVzUTBGQlF5eERRVUZETzBGQlEzcERMRkZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zWlVGQlpTeERRVUZETEdWQlFXVXNRMEZCUXl4RFFVRkRPMEZCUXpsRExGRkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNVMEZCVXl4RFFVRkRMRTFCUVUwc1EwRkJReXhoUVVGaExFTkJRVU1zUTBGQlF6dEpRVU0zUXp0QlFVTkVMRTlCUVVrc1NVRkJTU3hEUVVGRExGZEJRVmNzUzBGQlN5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RlFVRkZPMEZCUTNaRExGRkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNXVUZCV1N4RFFVRkRMRlZCUVZVc1JVRkJSU3hWUVVGVkxFTkJRVU1zUTBGQlF6dEJRVU5zUkN4UlFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExGbEJRVmtzUTBGQlF5eGxRVUZsTEVWQlFVVXNUVUZCVFN4RFFVRkRMRU5CUVVNN1FVRkRia1FzVVVGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4VFFVRlRMRU5CUVVNc1IwRkJSeXhEUVVGRExHRkJRV0VzUTBGQlF5eERRVUZETzBsQlF6RkRMRTFCUVUwN1FVRkRUaXhSUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEdWQlFXVXNRMEZCUXl4VlFVRlZMRU5CUVVNc1EwRkJRenRCUVVONlF5eFJRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMR1ZCUVdVc1EwRkJReXhsUVVGbExFTkJRVU1zUTBGQlF6dEJRVU01UXl4UlFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExGTkJRVk1zUTBGQlF5eE5RVUZOTEVOQlFVTXNZVUZCWVN4RFFVRkRMRU5CUVVNN1NVRkROME03UjBGRFJEczdPenM3T3pzN08xTkJUVmtzZDBKQlFVYzdRVUZEWml4UFFVRkxMRWxCUVVrc1EwRkJReXhYUVVGWExFZEJRVWNzUTBGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4UlFVRlJMRVZCUVVVN1FVRkRNVU1zVjBGQlR6dEpRVU5RTzBGQlEwUXNUMEZCU1N4RFFVRkRMRlZCUVZVc1EwRkJSU3hKUVVGSkxFTkJRVU1zV1VGQldTeEhRVUZITEVsQlFVa3NRMEZCUXl4WFFVRlhMRU5CUVVVc1EwRkJRenRCUVVONFJDeFBRVUZKTEVOQlFVTXNWMEZCVnl4SlFVRkpMRU5CUVVNc1EwRkJRenM3UVVGRmRFSXNUMEZCU3l4SlFVRkpMRU5CUVVNc1VVRkJVU3hGUVVGRkxFVkJRVWM3UVVGRGRFSXNVVUZCU1N4RFFVRkRMR0ZCUVdFc1JVRkJSU3hEUVVGRE8wbEJRM0pDTEUxQlFVMDdRVUZEVGl4UlFVRkpMRU5CUVVNc1pVRkJaU3hGUVVGRkxFTkJRVU03U1VGRGRrSTdRVUZEUkN4UFFVRkpMRU5CUVVNc1dVRkJXU3hGUVVGRkxFTkJRVU03UVVGRGNFSXNUMEZCU1N4RFFVRkRMRmxCUVZrc1JVRkJSU3hEUVVGRE8wRkJRM0JDTEU5QlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1UwRkJVeXhEUVVGRExHVkJRV1VzUlVGQlJTeERRVUZETzBkQlEzaERPenM3T3pzN096czdVMEZOV1N4M1FrRkJSenRCUVVObUxFOUJRVXNzU1VGQlNTeERRVUZETEZkQlFWY3NSMEZCUnl4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGRk8wRkJRemxDTEZkQlFVODdTVUZEVUR0QlFVTkVMRTlCUVVrc1EwRkJReXhYUVVGWExFbEJRVWtzUTBGQlF5eERRVUZETzBGQlEzUkNMRTlCUVVrc1EwRkJReXhWUVVGVkxFTkJRVVVzUVVGQlF5eEpRVUZKTEVOQlFVTXNXVUZCV1N4SFFVRkhMRWxCUVVrc1EwRkJReXhYUVVGWExFZEJRVWtzU1VGQlNTeERRVUZETEZsQlFWa3NRMEZCUlN4RFFVRkRPMEZCUXpsRkxFOUJRVWtzUTBGQlF5eGxRVUZsTEVWQlFVVXNRMEZCUXp0QlFVTjJRaXhQUVVGSkxFTkJRVU1zV1VGQldTeEZRVUZGTEVOQlFVTTdRVUZEY0VJc1QwRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eFRRVUZUTEVOQlFVTXNaVUZCWlN4RlFVRkZMRU5CUVVNN1IwRkRlRU03T3pzN096czdPenRUUVUxVkxHOUNRVUZGTEVkQlFVY3NSVUZCUnp0QlFVTnNRaXhQUVVGTExFbEJRVWtzUTBGQlF5eFhRVUZYTEVWQlFVYzdRVUZEZGtJc1VVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eExRVUZMTEVOQlFVTXNlVU5CUVd0Q0xGZEJRVmNzUTBGQlF5eERRVUZETEhkQ1FVRnpRaXhIUVVGSExGZEJRVkVzUTBGQlF6dEpRVU5zUml4TlFVRk5PMEZCUTA0c1VVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eExRVUZMTEVOQlFVTXNSMEZCUnl4VFFVRlBMRWRCUVVjc1QwRkJTU3hEUVVGRE8wbEJRMjVETzBkQlEwUTdPenM3T3pzN08xTkJTMWtzZDBKQlFVYzdRVUZEWml4UFFVRkpMRU5CUVVNc1UwRkJVeXhIUVVGSExFRkJRVVVzU1VGQlNTeERRVUZETEZkQlFWY3NSMEZCUnl4SlFVRkpMRU5CUVVNc1VVRkJVU3hIUVVGTExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTTdRVUZEZEVVc1QwRkJTU3hEUVVGRExGRkJRVkVzUjBGQlJ5eEpRVUZKTEVOQlFVTXNVMEZCVXl4SlFVRkxMRWxCUVVrc1EwRkJReXhSUVVGUkxFZEJRVWNzUTBGQlF5eERRVUZCTEVGQlFVVXNRMEZCUXpzN1FVRkZka1FzUzBGQlJTeERRVUZETEV0QlFVc3NRMEZCUXl4SlFVRkpMRU5CUVVVc1NVRkJTU3hEUVVGRExFVkJRVVVzUTBGQlF5eG5Ra0ZCWjBJc1EwRkJReXhoUVVGaExFTkJRVU1zUTBGQlJTeERRVUZETEU5QlFVOHNRMEZCUXl4VlFVRkZMRWxCUVVrc1JVRkJUVHRCUVVNMVJTeFJRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMR0ZCUVdFc1JVRkJSU3hOUVVGTkxFTkJRVU1zUTBGQlF6dEJRVU42UXl4UlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExHRkJRV0VzUlVGQlJTeE5RVUZOTEVOQlFVTXNRMEZCUXp0SlFVTjZReXhEUVVGRExFTkJRVU03TzBGQlJVZ3NVVUZCVFN4SlFVRkpMRU5CUVVNc1IwRkJSeXhKUVVGSkxFTkJRVU1zVTBGQlV5eEZRVUZGTEVOQlFVTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1VVRkJVU3hIUVVGSExFTkJRVU1zUlVGQlJTeERRVUZETEVWQlFVVXNSVUZCUnp0QlFVTXhSQ3hSUVVGSkxFbEJRVWtzUjBGQlJ5eEpRVUZKTEVOQlFVTXNSVUZCUlN4RFFVRkRMR2RDUVVGblFpeERRVUZETEdGQlFXRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8wRkJRM1JFTEZGQlFVa3NRMEZCUXl4SlFVRkpMRVZCUVVVN1FVRkRWaXhqUVVGVE8wdEJRMVE3UVVGRFJDeFJRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMR0ZCUVdFc1JVRkJSU3hQUVVGUExFTkJRVU1zUTBGQlF6dEJRVU14UXl4UlFVRkpMRU5CUVVNc1pVRkJaU3hEUVVGRExHRkJRV0VzUTBGQlF5eERRVUZETzBsQlEzQkRPMGRCUTBRN096czdPenM3TzFOQlMxRXNiMEpCUVVjN1FVRkRXQ3hWUVVGUExFbEJRVWtzUTBGQlF5eFZRVUZWTEVsQlFVa3NTVUZCU1N4RFFVRkRMRmRCUVZjc1MwRkJUU3hKUVVGSkxFTkJRVU1zVVVGQlVTeEhRVUZITEVsQlFVa3NRMEZCUXl4alFVRmpMRUZCUVVNc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFhRVUZYTEVOQlFVTTdSMEZETVVjN096czdPenM3T3pzN1UwRlBZU3g1UWtGQlJ6czdPMEZCUTJoQ0xFOUJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNVMEZCVXl4RFFVRkRMRWRCUVVjc1EwRkJReXhaUVVGWkxFVkJRVVVzWVVGQllTeERRVUZETEVOQlFVTTdRVUZEZUVRc1QwRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFpRVUZaTEVOQlFVTXNWVUZCVlN4RlFVRkZMRlZCUVZVc1EwRkJReXhEUVVGRE8wRkJRMnhFTEU5QlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1kwRkJZeXhGUVVGRkxFTkJRVU1zU1VGQlNTeERRVUZGTEZsQlFVMDdRVUZEZEVNc1YwRkJTeXhOUVVGTkxFTkJRVU1zVTBGQlV5eERRVUZETEZOQlFWTXNSVUZCUlN4RFFVRkRPMEZCUTJ4RExGZEJRVXNzVVVGQlVTeEhRVUZITEU5QlFVc3NWMEZCVnl4RlFVRkZMRU5CUVVNN1FVRkRia01zVjBGQlN5eFpRVUZaTEVWQlFVVXNRMEZCUXp0QlFVTndRaXhYUVVGTExHVkJRV1VzUlVGQlJTeERRVUZETzBGQlEzWkNMRmRCUVVzc1QwRkJUeXhEUVVGRExGTkJRVk1zUTBGQlF5eE5RVUZOTEVOQlFVTXNXVUZCV1N4RlFVRkZMR0ZCUVdFc1EwRkJReXhEUVVGRE8wbEJRek5FTEVOQlFVTXNRMEZCUXp0SFFVTklPenM3T3pzN096czdVMEZOU3l4cFFrRkJSenRCUVVOU0xFOUJRVWtzUTBGQlF5eFZRVUZWTEVOQlFVVXNRMEZCUXl4RFFVRkZMRU5CUVVNN1FVRkRja0lzVDBGQlNTeERRVUZETEZkQlFWY3NSMEZCUnl4RFFVRkRMRU5CUVVNN1FVRkRja0lzVDBGQlNTeERRVUZETEZGQlFWRXNSMEZCUnl4SlFVRkpMRU5CUVVNc1YwRkJWeXhGUVVGRkxFTkJRVU03UVVGRGJrTXNUMEZCU1N4RFFVRkRMRmRCUVZjc1IwRkJSeXhMUVVGTExFTkJRVU03UVVGRGVrSXNUMEZCU1N4RFFVRkRMR1ZCUVdVc1JVRkJSU3hEUVVGRE8wRkJRM1pDTEU5QlFVa3NRMEZCUXl4WlFVRlpMRVZCUVVVc1EwRkJRenRCUVVOd1FpeFBRVUZKTEVOQlFVTXNVVUZCVVN4RlFVRkZMRWxCUVVrc1NVRkJTU3hEUVVGRExHRkJRV0VzUlVGQlJTeERRVUZETzBkQlEzaERPenM3T3pzN096dFRRVXRQTEcxQ1FVRkhPMEZCUTFZc1QwRkJTU3hEUVVGRExGRkJRVkVzUjBGQlJ5eEpRVUZKTEVOQlFVTXNWMEZCVnl4RlFVRkZMRU5CUVVNN1IwRkRia003T3p0UlFUTlBTU3hSUVVGUk96czdjVUpCT0U5RExGRkJRVkVpTENKbWFXeGxJam9pUXpvdmRHVnRjQzlIUnk1R2NtOXVkRVZ1WkM1WGFXUm5aWFJ6TDNkcFpHZGxkSE12WTJoaGNtbDBlUzFsZG1WdWRITXRZbTloY21RdlltOTNaWEpmWTI5dGNHOXVaVzUwY3k5cWRYTjBaMmwyYVc1bkxYZHBaR2RsZEMxbWNtRnRaWGR2Y21zdlkyOXRjRzl1Wlc1MGN5OXNhV0l2WTJGeWIzVnpaV3d2UTJGeWIzVnpaV3d1YW5NaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SW5kWE5sSUhOMGNtbGpkQ2M3WEhKY2JseHlYRzVzWlhRZ1NHRnRiV1Z5SUQwZ2NtVnhkV2x5WlNnbmFHRnRiV1Z5YW5NbktUdGNjbHh1YVcxd2IzSjBJR2RsZEZabGJtUnZjbEJ5YjNCbGNuUjVJR1p5YjIwZ0p5NHVMMnB6TDBSUFRTOW5aWFJXWlc1a2IzSlFjbTl3WlhKMGVTYzdYSEpjYmx4eVhHNHZLaXBjY2x4dUlDb2dRV1JrSUdFZ1kyRnliM1Z6Wld3Z2RHOGdZU0JzYVhOMElIWnBaWGRjY2x4dUlDb2dRR05zWVhOelpHVnpZeUJCWkdRZ1lTQmpZWEp2ZFhObGJDQm1iM0lnY0dGbmFXNWhkR2x2YmlCdlppQmpZWEprSUd4cGMzUWdkbWxsZDNOY2NseHVJQ29nUUhCaGNtRnRJSHRQWW1wbFkzUjlJRzl3ZEdsdmJuTmNjbHh1SUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUc5d2RHbHZibk11ZG1sbGR5NGdWR2hsSUhacFpYY2dkR2hoZENCMGFHVWdZMkZ5YjNWelpXd2djR0ZuYVc1aGRHVnpJRnR5WlhGMWFYSmxaRjFjY2x4dUlDb2dRSEJoY21GdElIdFBZbXBsWTNSOUlHOXdkR2x2Ym5NdWQybGtaMlYwTGlCVWFHVWdkMmxrWjJWMElHbHVjM1JoYm1ObElGdHlaWEYxYVhKbFpGMWNjbHh1SUNvZ1FIQmhjbUZ0SUh0T2RXMWlaWEo5SUc5d2RHbHZibk11Y0dGblpWTnBlbVV1SUZSb1pTQnVkVzFpWlhJZ2IyWWdiR2x6ZENCcGRHVnRjeUIwYnlCemFHOTNJR2x1SUdWaFkyZ2dZMkZ5YjNWelpXd2djR0ZuWlZ4eVhHNGdLaUJBY0dGeVlXMGdlMEp2YjJ4bFlXNTlJRzl3ZEdsdmJuTXVhWE5KYm1acGJtbDBaUzRnVjJobGRHaGxjaUIwYUdVZ1kyOXNiR1ZqZEdsdmJpQmthWE53YkdGNVpXUWdhWE1nY0dGbmFXNWhkR1ZrSUc5dUlIUm9aU0JTUlZOVUlFRlFTVnh5WEc0Z0tpQkFjR0Z5WVcwZ2UwNTFiV0psY24wZ2IzQjBhVzl1Y3k1dVpYaDBVR0ZuWlVKMVptWmxjaTRnVG5WdFltVnlJRzltSUdOaGNtOTFjMlZzSUhCaFoyVnpJR0psWm05eVpTQjBhR1VnYkdGemRDQmhkQ0IzYUdsamFDQjBieUJtWlhSamFDQnVaWGgwSUVGUVNTQndZV2RsTGx4eVhHNGdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdiM0IwYVc5dWN5NWxiQzRnVkdobElHTmhjbTkxYzJWc0lIQmhjbVZ1ZENCbGJHVnRaVzUwWEhKY2JpQXFJRUJqYkdGemN5QlRaWFFnWTJGeWIzVnpaV3dnYVc1emRHRnVZMlVnY0hKdmNHVnlkR2xsY3pzZ1kyRmphR1VnWVhCbGNuUjFjbVVzSUdOdmJuUnliMndnWVc1a0lHeHBjM1FnWld4bGJXVnVkSE03SUhObGRDQmpkWEp5Wlc1MElIQmhaMlU3SUZ4eVhHNGdLaTljY2x4dVkyeGhjM01nUTJGeWIzVnpaV3dnZTF4eVhHNWNkR052Ym5OMGNuVmpkRzl5SUNnZ2V5QjJhV1YzTENCM2FXUm5aWFFzSUhCaFoyVlRhWHBsTENCcGMwbHVabWx1YVhSbExDQnVaWGgwVUdGblpVSjFabVpsY2l3Z1pXd3NJSE4zYVhCbElIMGdQU0I3ZlNBcElIdGNjbHh1WEhSY2RIUm9hWE11ZG1sbGR5QTlJSFpwWlhjN1hISmNibHgwWEhSMGFHbHpMbmRwWkdkbGRDQTlJSGRwWkdkbGREdGNjbHh1WEhSY2RIUm9hWE11Y0dGblpWTnBlbVVnUFNCd1lXZGxVMmw2WlNCOGZDQXpPMXh5WEc1Y2RGeDBkR2hwY3k1cGMwbHVabWx1YVhSbElEMGdhWE5KYm1acGJtbDBaVHRjY2x4dVhIUmNkSFJvYVhNdWMzZHBjR1VnUFNCemQybHdaVHRjY2x4dVhIUmNkSFJvYVhNdWJtVjRkRkJoWjJWQ2RXWm1aWElnUFNCdVpYaDBVR0ZuWlVKMVptWmxjaUI4ZkNBeU8xeHlYRzVjZEZ4MGRHaHBjeTVsYkNBOUlHUnZZM1Z0Wlc1MExuRjFaWEo1VTJWc1pXTjBiM0lvSUdWc0lDazdYSEpjYmx4MFhIUnBaaUFvSUNGMGFHbHpMbVZzSUh4OElDRjBhR2x6TG5kcFpHZGxkQ0I4ZkNBaGRHaHBjeTUyYVdWM0lDa2dlMXh5WEc1Y2RGeDBYSFJ5WlhSMWNtNDdYSEpjYmx4MFhIUjlYSEpjYmx4MFhIUjBhR2x6TG5acFpYY3VZMkZ5YjNWelpXd2dQU0IwYUdsek8xeHlYRzVjZEZ4MGRHaHBjeTVoY0dWeWRIVnlaU0E5SUhSb2FYTXVaV3d1Y1hWbGNubFRaV3hsWTNSdmNpZ25XMlJoZEdFdFkyRnliM1Z6Wld3dFlYQmxjblIxY21WZEp5azdYSEpjYmx4MFhIUjBhR2x6TG1KMGJrNWxlSFFnUFNCMGFHbHpMbVZzTG5GMVpYSjVVMlZzWldOMGIzSW9KMXRrWVhSaExXTnZiblJ5YjJ3dGJtVjRkRjBuS1R0Y2NseHVYSFJjZEhSb2FYTXVZblJ1VUhKbGRpQTlJSFJvYVhNdVpXd3VjWFZsY25sVFpXeGxZM1J2Y2lnblcyUmhkR0V0WTI5dWRISnZiQzF3Y21WMlhTY3BPMXh5WEc1Y2RGeDBkR2hwY3k1emRISnBjQ0E5SUhSb2FYTXVaV3d1Y1hWbGNubFRaV3hsWTNSdmNpZ25XMlJoZEdFdFkyRnliM1Z6Wld3dGJHbHpkRjBuS1R0Y2NseHVYSFJjZEhSb2FYTXVZM1Z5Y21WdWRGQmhaMlVnUFNBeE8xeHlYRzVjZEZ4MGRHaHBjeTVwYm1sMEtDazdYSEpjYmx4MGZWeHlYRzVjZEM4cUtseHlYRzVjZENBcUlFbHVhWFJwWVd4cGMyVWdkR2hsSUdOaGNtOTFjMlZzWEhKY2JseDBJQ292WEhKY2JseDBhVzVwZENBb0tTQjdYSEpjYmx4MFhIUjBhR2x6TG14aGMzUlFZV2RsSUQwZ2RHaHBjeTVuWlhSTVlYTjBVR0ZuWlNncE8xeHlYRzVjZEZ4MGRHaHBjeTUwY21GdWMyeGhkR1V6WkNBOUlIZHBibVJ2ZHk1ZmFtZDNhV1JuWlhRdVptVmhkSFZ5WlhNdVkzTnpkSEpoYm5ObWIzSnRjek5rTzF4eVhHNWNkRngwZEdocGN5NXBjMGx1Wm1sdWFYUmxJQ1ltSUhSb2FYTXVaMlYwVFdGNFVHRm5aU2dwTzF4eVhHNWNkRngwZEdocGN5NXpaWFJCY0dWeWRIVnlaU2dwTzF4eVhHNWNkRngwZEdocGN5NXpaWFJEYjI1MGNtOXNVM1JoZEdVb0tUdGNjbHh1WEhSY2RIUm9hWE11WW1sdVpFeHBjM1JsYm1WeWN5Z3BPMXh5WEc1Y2RGeDBkR2hwY3k1elpYUkRZWEprVTNSaGRHVW9LVHRjY2x4dVhIUmNkSFJvYVhNdWFYTkNkV1ptWlhJb0tTQW1KaUIwYUdsekxteHZZV1JOYjNKbFEyRnlaSE1vS1R0Y2NseHVYSFI5WEhKY2JseDBMeW9xWEhKY2JseDBJQ29nVTJWMElIUm9aU0JoY0dWeWRIVnlaU0J2WmlCMGFHVWdZMkZ5YjNWelpXeGNjbHh1WEhRZ0tpQkFaR1Z6WTNKcGNIUnBiMjRnVTJWMElIUm9aU0J6YVhwbElHOW1JSFJvWlNCaGNHVnlkSFZ5WlNCaVlYTmxaQ0J2YmlCemNHVmphV1pwWldRZ2NHRm5aU0J6YVhwbExpQkJjM04xYldWeklHRnNiQ0JqWVhKa2N5Qm9ZWFpsSUhSb1pTQnpZVzFsSUdobGFXZG9kQzVjY2x4dVhIUWdLaTljY2x4dVhIUnpaWFJCY0dWeWRIVnlaU0FvS1NCN1hISmNibHgwWEhSc1pYUWdZMkZ5WkNBOUlIUm9hWE11WVhCbGNuUjFjbVV1Y1hWbGNubFRaV3hsWTNSdmNpZ25XMlJoZEdFdFkyRnlaRjBuS1R0Y2NseHVYSFJjZEhSb2FYTXVZWEJsY25SMWNtVlRhWHBsSUQwZ0tHTmhjbVF1YjJabWMyVjBTR1ZwWjJoMElDc2dYSEpjYmx4MFhIUmNkSEJoY25ObFNXNTBLQ0JuWlhSRGIyMXdkWFJsWkZOMGVXeGxLR05oY21RcExtMWhjbWRwYmtKdmRIUnZiU3dnTVRBZ0tTQXJJRnh5WEc1Y2RGeDBYSFJ3WVhKelpVbHVkQ2dnWjJWMFEyOXRjSFYwWldSVGRIbHNaU2hqWVhKa0tTNXRZWEpuYVc1VWIzQXNJREV3S1NrZ0tpQmNjbHh1WEhSY2RGeDBkR2hwY3k1d1lXZGxVMmw2WlR0Y2NseHVYSFJjZEhSb2FYTXVZWEJsY25SMWNtVXVjM1I1YkdVdWFHVnBaMmgwSUQwZ1lDUjdkR2hwY3k1aGNHVnlkSFZ5WlZOcGVtVjljSGhnTzF4eVhHNWNkSDFjY2x4dVhIUXZLaXBjY2x4dVhIUWdLaUJIWlhRZ2RHaGxJRnRqZFhKeVpXNTBYU0JzWVhOMElIQmhaMlVnYjJZZ2RHaGxJR05oY205MWMyVnNYSEpjYmx4MElDb2dRR1JsYzJOeWFYQjBhVzl1SUVacGJtUnpJSFJvWlNCc1lYTjBJSEJoWjJVZ2JuVnRZbVZ5SUc5bUlIUm9aU0JqWVhKdmRYTmxiQzRnVTNWaWFtVmpkQ0IwYnlCMWNHUmhkR1VnYVdZZ2RHaGxJR05oY205MWMyVnNJR2x6SUdsdVptbHVhWFJsWEhKY2JseDBJQ29nUUhKbGRIVnlibk1nZTA1MWJXSmxjbjBnU1c1MFpXZGxjaUJ5WlhCeVpYTmxiblJwYm1jZ2RHaGxJR2x1WkdWNElHOW1JSFJvWlNCamRYSnlaVzUwSUd4aGMzUWdZMkZ5YjNWelpXd2djR0ZuWlM1Y2NseHVYSFFnS2k5Y2NseHVYSFJuWlhSTVlYTjBVR0ZuWlNBb0tTQjdYSEpjYmx4MFhIUnNaWFFnWTJGeVpFTnZkVzUwSUQwZ2RHaHBjeTVoY0dWeWRIVnlaUzV4ZFdWeWVWTmxiR1ZqZEc5eVFXeHNLQ2RiWkdGMFlTMWpZWEprWFNjcExteGxibWQwYUR0Y2NseHVYSFJjZEhKbGRIVnliaUJ3WVhKelpVbHVkQ2dnWTJGeVpFTnZkVzUwSUM4Z2RHaHBjeTV3WVdkbFUybDZaU3dnTVRBZ0tTQXJJQ2dnWTJGeVpFTnZkVzUwSUNVZ2RHaHBjeTV3WVdkbFUybDZaU0ErSURBZ1B5QXhJRG9nTUNBcE8xeHlYRzVjZEgxY2NseHVYSFF2S2lwY2NseHVYSFFnS2lCSFpYUWdkR2hsSUcxaGVHbHRkVzBnY0dGblpTQnZaaUIwYUdVZ1kyRnliM1Z6Wld4Y2NseHVYSFFnS2lCQVpHVnpZM0pwY0hScGIyNGdSbTl5SUdsdVptbHVhWFJsSUdOaGNtOTFjMlZzY3l3Z1ptbHVaSE1nZEdobElHMWhlR2x0ZFcwZ2NHOXpjMmxpYkdVZ2NHRm5aU0J1ZFcxaVpYSWdiMllnZEdobElHTmhjbTkxYzJWc1hISmNibHgwSUNvdlhISmNibHgwWjJWMFRXRjRVR0ZuWlNBb0tTQjdYSEpjYmx4MFhIUjBhR2x6TG0xaGVGQmhaMlVnUFNCd1lYSnpaVWx1ZENnZ2NHRnljMlZKYm5Rb0lIUm9hWE11ZG1sbGR5NXRiMlJsYkM0a2JXOWtaV3d1Y0dGbmFXNWhkR2x2Ymk1MGIzUmhiRkpsYzNWc2RITXNJREV3SUNrZ0x5QjBhR2x6TG5CaFoyVlRhWHBsTENBeE1DQXBJQ3NnWEhKY2JseDBYSFJjZENoMGFHbHpMblpwWlhjdWJXOWtaV3d1SkcxdlpHVnNMbkJoWjJsdVlYUnBiMjR1ZEc5MFlXeFNaWE4xYkhSeklDVWdkR2hwY3k1d1lXZGxVMmw2WlNBK0lEQWdQeUF4SURvZ01DazdYSEpjYmx4MGZWeHlYRzVjZEM4cUtseHlYRzVjZENBcUlGTmxkQ0JoSUdac1lXY2dkMmhsYmlCaGJHd2djRzl6YzJsaWJHVWdaR0YwWVNCb1lYTWdZbVZsYmlCbVpYUmphR1ZrWEhKY2JseDBJQ29nUUdSbGMyTnlhWEIwYVc5dUlFWnZjaUJwYm1acGJtbDBaU0JqWVhKdmRYTmxiSE1zSUhObGRITWdZU0JtYkdGbklIZG9aVzRnZEdobElHeGhjM1FnUVZCSklIQmhaMlVnYUdGeklHSmxaVzRnWm1WMFkyaGxaQ0JoYm1RZ1lXUmtaV1FnZEc4Z2RHaGxJRzF2WkdWc0ozTWdZMjlzYkdWamRHbHZibHh5WEc1Y2RDQXFMMXh5WEc1Y2RITmxkRTFoZUV4dllXUmxaQ0FvS1NCN1hISmNibHgwWEhScFppQW9JSFJvYVhNdWFYTk5ZWGhNYjJGa1pXUWdLU0I3WEhKY2JseDBYSFJjZEhKbGRIVnlianRjY2x4dVhIUmNkSDFjY2x4dVhIUmNkSFJvYVhNdWFYTk5ZWGhNYjJGa1pXUWdQU0IwYUdsekxtTjFjbkpsYm5SUVlXZGxJRDA5UFNCMGFHbHpMbTFoZUZCaFoyVTdYSEpjYmx4MGZWeHlYRzVjZEM4cUtseHlYRzVjZENBcUlFSnBibVFnWlhabGJuUWdiR2x6ZEdWdVpYSnpYSEpjYmx4MElDb2dRR1JsYzJOeWFYQjBhVzl1SUVKcGJtUWdaWFpsYm5RZ2JHbHpkR1Z1WlhKeklIUnZJRVJQVFNCdWIyUmxjeUJtYjNJZ1kyRnliM1Z6Wld3Z2RYTmxjaUJwYm5SbGNtRmpkR2x2Ymx4eVhHNWNkQ0FxTDF4eVhHNWNkR0pwYm1STWFYTjBaVzVsY25NZ0tDa2dlMXh5WEc1Y2RGeDBkR2hwY3k1aWRHNU9aWGgwTG1Ga1pFVjJaVzUwVEdsemRHVnVaWElvSjJOc2FXTnJKeXdnS0NrZ1BUNGdkR2hwY3k1emFHOTNUbVY0ZEZCaFoyVW9LU0FwTzF4eVhHNWNkRngwZEdocGN5NWlkRzVRY21WMkxtRmtaRVYyWlc1MFRHbHpkR1Z1WlhJb0oyTnNhV05ySnl3Z0tDa2dQVDRnZEdocGN5NXphRzkzVUhKbGRsQmhaMlVvS1NBcE8xeHlYRzVjZEZ4MFhISmNibHgwWEhRdkwxTjNhWEJsSUhkcGRHZ2dTR0Z0YldWeVhISmNibHgwWEhScFppQW9JSFJvYVhNdWMzZHBjR1VnS1NCN1hISmNibHgwWEhSY2RHeGxkQ0JvWVcxdFpYSWdQU0J1WlhjZ1NHRnRiV1Z5S0hSb2FYTXVjM1J5YVhBc0lIdGNjbHh1WEhSY2RGeDBYSFIyWld4dlkybDBlVG9nTUM0eE5WeHlYRzVjZEZ4MFhIUjlLVHRjY2x4dVhIUmNkRngwYVdZZ0tDQjBhR2x6TG5OM2FYQmxJRDA5UFNBbmRtVnlkR2xqWVd3bklDa2dlMXh5WEc1Y2RGeDBYSFJjZEdoaGJXMWxjaTVuWlhRb0ozTjNhWEJsSnlrdWMyVjBLSHNnWkdseVpXTjBhVzl1T2lCSVlXMXRaWEl1UkVsU1JVTlVTVTlPWDFaRlVsUkpRMEZNSUgwcE8xeHlYRzVjZEZ4MFhIUmNkR2hoYlcxbGNpNXZiaWduYzNkcGNHVW5MQ0FvWlNrZ1BUNGdlMXh5WEc1Y2RGeDBYSFJjZEZ4MFpTNWthWEpsWTNScGIyNGdQVDA5SURnZ0ppWWdkR2hwY3k1emFHOTNUbVY0ZEZCaFoyVW9LVHRjY2x4dVhIUmNkRngwWEhSY2RHVXVaR2x5WldOMGFXOXVJRDA5UFNBeE5pQW1KaUIwYUdsekxuTm9iM2RRY21WMlVHRm5aU2dwTzF4eVhHNWNkRngwWEhSY2RIMHBPMXh5WEc1Y2RGeDBYSFI5SUdWc2MyVWdhV1lnS0NCMGFHbHpMbk4zYVhCbElEMDlQU0FuYUc5eWFYcHZiblJoYkNjZ0tTQjdYSEpjYmx4MFhIUmNkRngwYUdGdGJXVnlMbTl1S0NkemQybHdaV3hsWm5RbkxDQW9LU0E5UGlCMGFHbHpMbk5vYjNkT1pYaDBVR0ZuWlNncElDazdYSEpjYmx4MFhIUmNkRngwYUdGdGJXVnlMbTl1S0NkemQybHdaWEpwWjJoMEp5d2dLQ2tnUFQ0Z2RHaHBjeTV6YUc5M1VISmxkbEJoWjJVb0tTQXBPMXh5WEc1Y2RGeDBYSFI5WEhKY2JseDBYSFI5WEhKY2JseDBmVnh5WEc1Y2RDOHFLbHh5WEc1Y2RDQXFJRk5sZENCemRHRjBaU0J2WmlCallYSnZkWE5sYkNCamIyNTBjbTlzYzF4eVhHNWNkQ0FxSUVCa1pYTmpjbWx3ZEdsdmJpQlRaWFFnZEdobElITjBZWFJsSUc5bUlHTmhjbTkxYzJWc0lHTnZiblJ5YjJ4eklGdGxibUZpYkdWa0xDQmthWE5oWW14bFpGMGdZbUZ6WldRZ2IyNGdZM1Z5Y21WdWRDQmpZWEp2ZFhObGJDQndZV2RsWEhKY2JseDBJQ292WEhKY2JseDBjMlYwUTI5dWRISnZiRk4wWVhSbElDZ3BJSHRjY2x4dVhIUmNkR2xtSUNoMGFHbHpMbU4xY25KbGJuUlFZV2RsSUQwOVBTQXhLU0I3WEhKY2JseDBYSFJjZEhSb2FYTXVZblJ1VUhKbGRpNXpaWFJCZEhSeWFXSjFkR1VvSjJScGMyRmliR1ZrSnl3Z0oyUnBjMkZpYkdWa0p5azdYSEpjYmx4MFhIUmNkSFJvYVhNdVluUnVVSEpsZGk1elpYUkJkSFJ5YVdKMWRHVW9KMkZ5YVdFdFpHbHpZV0pzWldRbkxDQW5kSEoxWlNjcE8xeHlYRzVjZEZ4MFhIUjBhR2x6TG1KMGJsQnlaWFl1WTJ4aGMzTk1hWE4wTG1Ga1pDZ25hWE10WkdsellXSnNaV1FuS1R0Y2NseHVYSFJjZEgwZ1pXeHpaU0I3WEhKY2JseDBYSFJjZEhSb2FYTXVZblJ1VUhKbGRpNXlaVzF2ZG1WQmRIUnlhV0oxZEdVb0oyUnBjMkZpYkdWa0p5azdYSEpjYmx4MFhIUmNkSFJvYVhNdVluUnVVSEpsZGk1eVpXMXZkbVZCZEhSeWFXSjFkR1VvSjJGeWFXRXRaR2x6WVdKc1pXUW5LVHRjY2x4dVhIUmNkRngwZEdocGN5NWlkRzVRY21WMkxtTnNZWE56VEdsemRDNXlaVzF2ZG1Vb0oybHpMV1JwYzJGaWJHVmtKeWs3WEhKY2JseDBYSFI5WEhKY2JseDBYSFJwWmlBb2RHaHBjeTVqZFhKeVpXNTBVR0ZuWlNBOVBUMGdkR2hwY3k1c1lYTjBVR0ZuWlNrZ2UxeHlYRzVjZEZ4MFhIUjBhR2x6TG1KMGJrNWxlSFF1YzJWMFFYUjBjbWxpZFhSbEtDZGthWE5oWW14bFpDY3NJQ2RrYVhOaFlteGxaQ2NwTzF4eVhHNWNkRngwWEhSMGFHbHpMbUowYms1bGVIUXVjMlYwUVhSMGNtbGlkWFJsS0NkaGNtbGhMV1JwYzJGaWJHVmtKeXdnSjNSeWRXVW5LVHRjY2x4dVhIUmNkRngwZEdocGN5NWlkRzVPWlhoMExtTnNZWE56VEdsemRDNWhaR1FvSjJsekxXUnBjMkZpYkdWa0p5azdYSEpjYmx4MFhIUjlJR1ZzYzJVZ2UxeHlYRzVjZEZ4MFhIUjBhR2x6TG1KMGJrNWxlSFF1Y21WdGIzWmxRWFIwY21saWRYUmxLQ2RrYVhOaFlteGxaQ2NwTzF4eVhHNWNkRngwWEhSMGFHbHpMbUowYms1bGVIUXVjbVZ0YjNabFFYUjBjbWxpZFhSbEtDZGhjbWxoTFdScGMyRmliR1ZrSnlrN1hISmNibHgwWEhSY2RIUm9hWE11WW5SdVRtVjRkQzVqYkdGemMweHBjM1F1Y21WdGIzWmxLQ2RwY3kxa2FYTmhZbXhsWkNjcE8xeHlYRzVjZEZ4MGZWeHlYRzVjZEgxY2NseHVYSFF2S2lwY2NseHVYSFFnS2lCVGFHOTNJSFJvWlNCdVpYaDBJSEJoWjJVZ2IyWWdkR2hsSUdOaGNtOTFjMlZzWEhKY2JseDBJQ29nUUdSbGMyTnlhWEIwYVc5dUlGUnlZVzV6YVhScGIyNGdkR2hsSUd4cGMzUWdkRzhnYzJodmR5QjBhR1VnYm1WNGRDQndZV2RsT3lCbVpYUmphQ0J0YjNKbElHTmhjbVJ6SUdsbUlIZGxJR0Z5WlNCdmJpQjBhR1VnWW5WbVptVnlJSEJoWjJVZ1cybHVabWx1YVhSbElHTmhjbTkxYzJWc2MxMDdJRnh5WEc1Y2RDQXFJSE5sZENCdFlYZ2diRzloWkdWa0lHWnNZV2M3SUhObGRDQmpiMjUwY205c2JHVnlJSE4wWVhSbE95QnpaWFFnWTJGeVpITWdjM1JoZEdVZ1lXNWtJR1pwY21VZ1lXNWhiSGwwYVdOeklHbHRjSEpsYzNOcGIyNXpJR1p2Y2lCdVpYZHNlU0IyYVhOcFlteGxJR05oY21SelhISmNibHgwSUNvdlhISmNibHgwYzJodmQwNWxlSFJRWVdkbElDZ3BJSHRjY2x4dVhIUmNkR2xtSUNnZ2RHaHBjeTVqZFhKeVpXNTBVR0ZuWlNBcklERWdQaUIwYUdsekxteGhjM1JRWVdkbEtTQjdYSEpjYmx4MFhIUmNkSEpsZEhWeWJqdGNjbHh1WEhSY2RIMGdYSEpjYmx4MFhIUjBhR2x6TG5SeVlXNXphWFJwYjI0b0lIUm9hWE11WVhCbGNuUjFjbVZUYVhwbElDb2dkR2hwY3k1amRYSnlaVzUwVUdGblpTQXBPMXh5WEc1Y2RGeDBkR2hwY3k1amRYSnlaVzUwVUdGblpTQXJQU0F4TzF4eVhHNWNjbHh1WEhSY2RHbG1JQ2dnZEdocGN5NXBjMEoxWm1abGNpZ3BJQ2tnZTF4eVhHNWNkRngwWEhSMGFHbHpMbXh2WVdSTmIzSmxRMkZ5WkhNb0tUdGNjbHh1WEhSY2RIMGdaV3h6WlNCN1hISmNibHgwWEhSY2RIUm9hWE11YzJWMFEyOXVkSEp2YkZOMFlYUmxLQ2s3WEhKY2JseDBYSFI5WEhKY2JseDBYSFIwYUdsekxuTmxkRTFoZUV4dllXUmxaQ2dwTzF4eVhHNWNkRngwZEdocGN5NXpaWFJEWVhKa1UzUmhkR1VvS1R0Y2NseHVYSFJjZEhSb2FYTXVkMmxrWjJWMExtRnVZV3g1ZEdsamN5NWpZWEprU1cxd2NtVnpjMmx2Ym5Nb0tUdGNjbHh1WEhSOVhISmNibHgwTHlvcVhISmNibHgwSUNvZ1UyaHZkeUIwYUdVZ2NISmxkbWx2ZFhNZ2NHRm5aU0J2WmlCMGFHVWdZMkZ5YjNWelpXeGNjbHh1WEhRZ0tpQkFaR1Z6WTNKcGNIUnBiMjRnVkhKaGJuTnBkR2x2YmlCMGFHVWdiR2x6ZENCMGJ5QnphRzkzSUhSb1pTQndjbVYyYVc5MWN5QndZV2RsT3lCelpYUWdZMjl1ZEhKdmJHeGxjaUJ6ZEdGMFpUdGNjbHh1WEhRZ0tpQnpaWFFnWTJGeVpITWdjM1JoZEdVZ1lXNWtJR1pwY21VZ1lXNWhiSGwwYVdOeklHbHRjSEpsYzNOcGIyNXpJR1p2Y2lCdVpYZHNlU0IyYVhOcFlteGxJR05oY21SelhISmNibHgwSUNvdlhISmNibHgwYzJodmQxQnlaWFpRWVdkbElDZ3BJSHRjY2x4dVhIUmNkR2xtSUNnZ2RHaHBjeTVqZFhKeVpXNTBVR0ZuWlNBdElERWdQQ0F4S1NCN1hISmNibHgwWEhSY2RISmxkSFZ5Ymp0Y2NseHVYSFJjZEgxY2NseHVYSFJjZEhSb2FYTXVZM1Z5Y21WdWRGQmhaMlVnTFQwZ01UdGNjbHh1WEhSY2RIUm9hWE11ZEhKaGJuTnBkR2x2YmlnZ0tIUm9hWE11WVhCbGNuUjFjbVZUYVhwbElDb2dkR2hwY3k1amRYSnlaVzUwVUdGblpTa2dMU0IwYUdsekxtRndaWEowZFhKbFUybDZaU0FwTzF4eVhHNWNkRngwZEdocGN5NXpaWFJEYjI1MGNtOXNVM1JoZEdVb0tUdGNjbHh1WEhSY2RIUm9hWE11YzJWMFEyRnlaRk4wWVhSbEtDazdYSEpjYmx4MFhIUjBhR2x6TG5kcFpHZGxkQzVoYm1Gc2VYUnBZM011WTJGeVpFbHRjSEpsYzNOcGIyNXpLQ2s3WEhKY2JseDBmVnh5WEc1Y2RDOHFLbHh5WEc1Y2RDQXFJRlJ5WVc1emFYUnBiMjRnZEdobElHeHBjM1JjY2x4dVhIUWdLaUJBWkdWelkzSnBjSFJwYjI0Z1ZISmhibk5wZEdsdmJpQjBhR1VnYkdsemRDQjBieUJ6YUc5M0lHNWxkeUJqWVhKa2N5d2dkWE5wYm1jZ1pXbDBhR1Z5SUNkMGNtRnVjMlp2Y20wZ2RISmhibk5zWVhSbE0yUW5JR2xtSUhOMWNIQnZjblJsWkNCdmNpQW5kRzl3SnlCdmRHaGxjbmRwYzJVdVhISmNibHgwSUNvZ1FYTnpkVzFsY3lCMGFHVWdiR2x6ZENCb1lYTWdZU0IwY21GdWMybDBhVzl1SUVOVFV5QndjbTl3WlhKMGVTQnlaV2RwYzNSbGNtVmtJR0ZuWVdsdWMzUWdKMkZzYkNjZ2IzSWdKM1J2Y0NjZ1lXNWtJQ2QwY21GdWMyWnZjbTBuWEhKY2JseDBJQ292WEhKY2JseDBkSEpoYm5OcGRHbHZiaUFvSUhSdmNDQXBJSHRjY2x4dVhIUmNkR2xtSUNnZ2RHaHBjeTUwY21GdWMyeGhkR1V6WkNBcElIdGNjbHh1WEhSY2RGeDBkR2hwY3k1emRISnBjQzV6ZEhsc1pWdG5aWFJXWlc1a2IzSlFjbTl3WlhKMGVTZ25kSEpoYm5ObWIzSnRKeWxkSUQwZ1lIUnlZVzV6YkdGMFpUTmtLREFzSUMwa2UzUnZjSDF3ZUN3Z01DbGdPMXh5WEc1Y2RGeDBmU0JsYkhObElIdGNjbHh1WEhSY2RGeDBkR2hwY3k1emRISnBjQzV6ZEhsc1pTNTBiM0FnUFNCZ0xTUjdkRzl3ZlhCNFlEdGNjbHh1WEhSY2RIMWNjbHh1WEhSOVhISmNibHgwTHlvcVhISmNibHgwSUNvZ1UyVjBJSFJvWlNCamRYSnlaVzUwSUhOMFlYUmxJR1pzWVdkeklHOW1JSFJvWlNCallYSmtjMXh5WEc1Y2RDQXFJRUJrWlhOamNtbHdkR2x2YmlCU1pYTmxkQ0JoYkd3Z1kyRnlaSE1nZEc4Z2FHbGtaR1Z1SUZ0aGNtbGhMU3dnWkdGMFlTMWRPeUJ6WlhRZ2RtbHphV0pzWlNCallYSmtjeUIwYnlBbmRtbHphV0pzWlNjZ1cyRnlhV0V0TENCa1lYUmhMVjFjY2x4dVhIUWdLaTljY2x4dVhIUnpaWFJEWVhKa1UzUmhkR1VnS0NrZ2UxeHlYRzVjZEZ4MGRHaHBjeTVtYVhKemRFTmhjbVFnUFNBb0lIUm9hWE11WTNWeWNtVnVkRkJoWjJVZ0tpQjBhR2x6TG5CaFoyVlRhWHBsSUNrZ0xTQjBhR2x6TG5CaFoyVlRhWHBsTzF4eVhHNWNkRngwZEdocGN5NXNZWE4wUTJGeVpDQTlJSFJvYVhNdVptbHljM1JEWVhKa0lDc2dLQ0IwYUdsekxuQmhaMlZUYVhwbElDMGdNU0FwTzF4eVhHNWNkRngwWEhKY2JseDBYSFJiWFM1emJHbGpaUzVqWVd4c0tDQjBhR2x6TG1Wc0xuRjFaWEo1VTJWc1pXTjBiM0pCYkd3b0oxdGtZWFJoTFdOaGNtUmRKeWtnS1M1bWIzSkZZV05vS0NnZ1kyRnlaQ0FwSUQwK0lIdGNjbHh1WEhSY2RGeDBZMkZ5WkM1elpYUkJkSFJ5YVdKMWRHVW9KMkZ5YVdFdGFHbGtaR1Z1Snl3Z0ozUnlkV1VuS1R0Y2NseHVYSFJjZEZ4MFkyRnlaQzV6WlhSQmRIUnlhV0oxZEdVb0oyUmhkR0V0YUdsa1pHVnVKeXdnSjNSeWRXVW5LVHRjY2x4dVhIUmNkSDBwTzF4eVhHNWNkRngwWEhKY2JseDBYSFJtYjNJZ0tDQnNaWFFnYVNBOUlIUm9hWE11Wm1seWMzUkRZWEprT3lCcElEd2dkR2hwY3k1c1lYTjBRMkZ5WkNBcklERTdJR2tyS3lBcElIdGNjbHh1WEhSY2RGeDBiR1YwSUdOaGNtUWdQU0IwYUdsekxtVnNMbkYxWlhKNVUyVnNaV04wYjNKQmJHd29KMXRrWVhSaExXTmhjbVJkSnlsYmFWMDdYSEpjYmx4MFhIUmNkR2xtSUNnaFkyRnlaQ2tnZTF4eVhHNWNkRngwWEhSY2RHTnZiblJwYm5WbE8xeHlYRzVjZEZ4MFhIUjlJRnh5WEc1Y2RGeDBYSFJqWVhKa0xuTmxkRUYwZEhKcFluVjBaU2duWVhKcFlTMW9hV1JrWlc0bkxDQW5abUZzYzJVbktUdGNjbHh1WEhSY2RGeDBZMkZ5WkM1eVpXMXZkbVZCZEhSeWFXSjFkR1VvSjJSaGRHRXRhR2xrWkdWdUp5azdYSEpjYmx4MFhIUjlYSFJjZEZ4MFhISmNibHgwZlZ4eVhHNWNkQzhxS2x4eVhHNWNkQ0FxSUVOb1pXTnJJR2xtSUhkbElHRnlaU0J2YmlCaWRXWm1aWElnY0dGblpWeHlYRzVjZENBcUlFQmtaWE5qY21sd2RHbHZiaUJEYUdWamF5QnBaaUIzWlNCaGNtVWdiMjRnZEdobElHTmhjbTkxYzJWc0lIQmhaMlVnYzJWMElHRnpJRzVsZUhSUVlXZGxRblZtWm1WeVhISmNibHgwSUNvdlhISmNibHgwYVhOQ2RXWm1aWElnS0NrZ2UxeHlYRzVjZEZ4MGNtVjBkWEp1SUhSb2FYTXVhWE5KYm1acGJtbDBaU0FtSmlCMGFHbHpMbU4xY25KbGJuUlFZV2RsSUQwOVBTQW9kR2hwY3k1c1lYTjBVR0ZuWlNBdElIUm9hWE11Ym1WNGRGQmhaMlZDZFdabVpYSXBJQ1ltSUNGMGFHbHpMbWx6VFdGNFRHOWhaR1ZrTzF4eVhHNWNkSDFjY2x4dVhIUXZLaXBjY2x4dVhIUWdLaUJNYjJGa0lHMXZjbVVnWTJGeVpITWdabVYwWTJobFpDQm1jbTl0SUhSb1pTQnpaWEoyWlhJZ1cybHVabWx1YVhSbElHTmhjbTkxYzJWc2MxMWNjbHh1WEhRZ0tpQkFaR1Z6WTNKcGNIUnBiMjRnVkhKcFoyZGxjaUIwYUdVZ2RtbGxkeUIwYnlCbVpYUmphQ0JoYm1RZ1lYQndaVzVrSUhSb1pTQnVaWGgwSUVGUVNTQndZV2RsSUc5bUlISmxjM1ZzZEhNZ1cyTmhjbVJ6WFRzZ2MyVjBJR052Ym5SeWIyeHpJSE4wWVhSbElIZG9hV3h6ZENCa1lYUmhJR2x6WEhKY2JseDBJQ29nWW1WcGJtY2diRzloWkdWa095QnZibU5sSUd4dllXUmxaQ0IwY21sbloyVnlJRzVsZHlCaGJtRnNlWFJwWTNNZ1kyRnlaSE1nYVc1cGRHbGhiR2x6WlRzZ2RYQmtZWFJsSUdOaGNtOTFjMlZzSUdGdVpDQmpZWEprSUhOMFlYUmxJSFpoY21saFlteGxjenNnY21WMlpYSjBYSEpjYmx4MElDb2dZMjl1ZEhKdmJITWdjM1JoZEdWelhISmNibHgwSUNvdlhISmNibHgwYkc5aFpFMXZjbVZEWVhKa2N5QW9LU0I3WEhKY2JseDBYSFIwYUdsekxtSjBiazVsZUhRdVkyeGhjM05NYVhOMExtRmtaQ2duYVhNdGJHOWhaR2x1Wnljc0lDZHBjeTFrYVhOaFlteGxaQ2NwTzF4eVhHNWNkRngwZEdocGN5NWlkRzVPWlhoMExuTmxkRUYwZEhKcFluVjBaU2duWkdsellXSnNaV1FuTENBblpHbHpZV0pzWldRbktUdGNjbHh1WEhSY2RIUm9hWE11ZG1sbGR5NWhjSEJsYm1ST1pYaDBVR0ZuWlNncExuUm9aVzRvSUNncElEMCtJSHRjY2x4dVhIUmNkRngwZEdocGN5NTNhV1JuWlhRdVlXNWhiSGwwYVdOekxtTmhjbVJ6U1c1cGRDZ3BPMXh5WEc1Y2RGeDBYSFIwYUdsekxteGhjM1JRWVdkbElEMGdkR2hwY3k1blpYUk1ZWE4wVUdGblpTZ3BPMXgwWEhKY2JseDBYSFJjZEhSb2FYTXVjMlYwUTJGeVpGTjBZWFJsS0NrN1hISmNibHgwWEhSY2RIUm9hWE11YzJWMFEyOXVkSEp2YkZOMFlYUmxLQ2s3WEhKY2JseDBYSFJjZEhSb2FYTXVZblJ1VG1WNGRDNWpiR0Z6YzB4cGMzUXVjbVZ0YjNabEtDZHBjeTFzYjJGa2FXNW5KeXdnSjJsekxXUnBjMkZpYkdWa0p5azdYSEpjYmx4MFhIUjlLVHRjY2x4dVhIUjlYSEpjYmx4MEx5b3FYSEpjYmx4MElDb2dVbVZ6WlhRZ2RHaGxJR05oY205MWMyVnNJSFJ2SUdacGNuTjBJSEJoWjJWY2NseHVYSFFnS2lCQVpHVnpZM0pwY0hScGIyNGdVbVZ6WlhRZ2RHaGxJR05oY205MWMyVnNJSFJ2SUhOb2IzY2dkR2hsSUdacGNuTjBJSEJoWjJVN0lISmxjMlYwSUdGc2JDQmpZWEp2ZFhObGJDQnpkR0YwWlNCMllYSnBZV0pzWlhNZ1lXNWtJSE5sZENCamIyNTBjbTlzY3lCemRHRjBaVHRjY2x4dVhIUWdLaUJqYUdWamF5QnBaaUIzWlNCaGNtVWdiMjRnWW5WbVptVnlJSEJoWjJVZ1lXNWtJR2xtSUhSeWRXVWdiRzloWkNCdGIzSmxJR05oY21SelhISmNibHgwSUNvdlhISmNibHgwY21WelpYUWdLQ2tnZTF4eVhHNWNkRngwZEdocGN5NTBjbUZ1YzJsMGFXOXVLQ0F3SUNrN1hISmNibHgwWEhSMGFHbHpMbU4xY25KbGJuUlFZV2RsSUQwZ01UdGNjbHh1WEhSY2RIUm9hWE11YkdGemRGQmhaMlVnUFNCMGFHbHpMbWRsZEV4aGMzUlFZV2RsS0NrN1hISmNibHgwWEhSMGFHbHpMbWx6VFdGNFRHOWhaR1ZrSUQwZ1ptRnNjMlU3WEhKY2JseDBYSFIwYUdsekxuTmxkRU52Ym5SeWIyeFRkR0YwWlNncE8xeHlYRzVjZEZ4MGRHaHBjeTV6WlhSRFlYSmtVM1JoZEdVb0tUdGNjbHh1WEhSY2RIUm9hWE11YVhOQ2RXWm1aWElvS1NBbUppQjBhR2x6TG14dllXUk5iM0psUTJGeVpITW9LVHRjY2x4dVhIUjlYSEpjYmx4MEx5b3FYSEpjYmx4MElDb2dVbVZtY21WemFDQjBhR1VnWTJGeWIzVnpaV3hjY2x4dVhIUWdLaUJBWkdWelkzSnBjSFJwYjI0Z1ZYQmtZWFJsSUdOaGNtOTFjMlZzSUhOMFlYUmxJSFpoY21saFlteGxjeUJzWVhOMElIQmhaMlZjY2x4dVhIUWdLaTljY2x4dVhIUnlaV1p5WlhOb0lDZ3BJSHRjY2x4dVhIUmNkSFJvYVhNdWJHRnpkRkJoWjJVZ1BTQjBhR2x6TG1kbGRFeGhjM1JRWVdkbEtDazdYSEpjYmx4MGZWeHlYRzU5WEhKY2JseHlYRzVsZUhCdmNuUWdaR1ZtWVhWc2RDQkRZWEp2ZFhObGJEc2lYWDA9IiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcclxuICogUmV0dXJuIHRoZSBjb3JyZWN0IHZlbmRvci1wcmVmaXhlZCBwcm9wZXJ0eSBuYW1lIGZvciBhIGdpdmVuIHN0eWxlIHByb3BlcnR5XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBUaGUgcmVxdWlyZWQgcHJvcGVydHkgbmFtZVxyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgdmVuZG9yLXByZWZpeGVkIHByb3BlcnR5IG5hbWVcclxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmZ1bmN0aW9uIGdldFZlbmRvclByb3BlcnR5KHByb3BlcnR5KSB7XG4gIHZhciBwcm9wcyA9IHtcbiAgICB0cmFuc2Zvcm06IFsndHJhbnNmb3JtJywgJ21zVHJhbnNmb3JtJywgJ3dlYmtpdFRyYW5zZm9ybScsICdtb3pUcmFuc2Zvcm0nLCAnb1RyYW5zZm9ybSddXG4gIH07XG4gIHZhciB2ZW5kb3JQcm9wcyA9IHByb3BzW3Byb3BlcnR5XS5maWx0ZXIoZnVuY3Rpb24gKHByb3ApIHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50LmJvZHkuc3R5bGVbcHJvcF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gcHJvcDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdmVuZG9yUHJvcHMubGVuZ3RoID8gdmVuZG9yUHJvcHNbMF0gOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGdldFZlbmRvclByb3BlcnR5O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJa002TDNSbGJYQXZSMGN1Um5KdmJuUkZibVF1VjJsa1oyVjBjeTkzYVdSblpYUnpMMk5vWVhKcGRIa3RaWFpsYm5SekxXSnZZWEprTDJKdmQyVnlYMk52YlhCdmJtVnVkSE12YW5WemRHZHBkbWx1WnkxM2FXUm5aWFF0Wm5KaGJXVjNiM0pyTDJOdmJYQnZibVZ1ZEhNdmJHbGlMMnB6TDBSUFRTOW5aWFJXWlc1a2IzSlFjbTl3WlhKMGVTNXFjeUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lRVUZCUVN4WlFVRlpMRU5CUVVNN096czdPenM3T3pzN1FVRlBZaXhUUVVGVExHbENRVUZwUWl4RFFVRkZMRkZCUVZFc1JVRkJSenRCUVVOMFF5eE5RVUZKTEV0QlFVc3NSMEZCUnp0QlFVTllMR0ZCUVZNc1JVRkJSU3hEUVVGRExGZEJRVmNzUlVGQlJTeGhRVUZoTEVWQlFVVXNhVUpCUVdsQ0xFVkJRVVVzWTBGQll5eEZRVUZGTEZsQlFWa3NRMEZCUXp0SFFVTjRSaXhEUVVGRE8wRkJRME1zVFVGQlNTeFhRVUZYTEVkQlFVY3NTMEZCU3l4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRExFMUJRVTBzUTBGQlF5eFZRVUZETEVsQlFVa3NSVUZCU3p0QlFVTnNSQ3hSUVVGSkxFOUJRVThzVVVGQlVTeERRVUZETEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzVjBGQlZ5eEZRVUZGTzBGQlF5OURMR0ZCUVU4c1NVRkJTU3hEUVVGRE8wdEJRMlk3UjBGRFNpeERRVUZETEVOQlFVTTdRVUZEU0N4VFFVRlBMRmRCUVZjc1EwRkJReXhOUVVGTkxFZEJRVWNzVjBGQlZ5eERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkhMRk5CUVZNc1EwRkJRenREUVVNeFJEczdjVUpCUldNc2FVSkJRV2xDSWl3aVptbHNaU0k2SWtNNkwzUmxiWEF2UjBjdVJuSnZiblJGYm1RdVYybGtaMlYwY3k5M2FXUm5aWFJ6TDJOb1lYSnBkSGt0WlhabGJuUnpMV0p2WVhKa0wySnZkMlZ5WDJOdmJYQnZibVZ1ZEhNdmFuVnpkR2RwZG1sdVp5MTNhV1JuWlhRdFpuSmhiV1YzYjNKckwyTnZiWEJ2Ym1WdWRITXZiR2xpTDJwekwwUlBUUzluWlhSV1pXNWtiM0pRY205d1pYSjBlUzVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYklpZDFjMlVnYzNSeWFXTjBKenRjY2x4dVhISmNiaThxS2x4eVhHNGdLaUJTWlhSMWNtNGdkR2hsSUdOdmNuSmxZM1FnZG1WdVpHOXlMWEJ5WldacGVHVmtJSEJ5YjNCbGNuUjVJRzVoYldVZ1ptOXlJR0VnWjJsMlpXNGdjM1I1YkdVZ2NISnZjR1Z5ZEhsY2NseHVJQ29nUUhCaGNtRnRJSHRUZEhKcGJtZDlJRlJvWlNCeVpYRjFhWEpsWkNCd2NtOXdaWEowZVNCdVlXMWxYSEpjYmlBcUlFQnlaWFIxY201eklIdFRkSEpwYm1kOUlGUm9aU0IyWlc1a2IzSXRjSEpsWm1sNFpXUWdjSEp2Y0dWeWRIa2dibUZ0WlZ4eVhHNGdLaTljY2x4dVpuVnVZM1JwYjI0Z1oyVjBWbVZ1Wkc5eVVISnZjR1Z5ZEhrb0lIQnliM0JsY25SNUlDa2dlMXh5WEc1Y2RHeGxkQ0J3Y205d2N5QTlJSHRjY2x4dVhIUmNkSFJ5WVc1elptOXliVG9nV3lkMGNtRnVjMlp2Y20wbkxDQW5iWE5VY21GdWMyWnZjbTBuTENBbmQyVmlhMmwwVkhKaGJuTm1iM0p0Snl3Z0oyMXZlbFJ5WVc1elptOXliU2NzSUNkdlZISmhibk5tYjNKdEoxMWNjbHh1WEhSOU8xeHlYRzRnSUNBZ2JHVjBJSFpsYm1SdmNsQnliM0J6SUQwZ2NISnZjSE5iY0hKdmNHVnlkSGxkTG1acGJIUmxjaWdvY0hKdmNDa2dQVDRnZTF4eVhHNGdJQ0FnWEhScFppQW9kSGx3Wlc5bUlHUnZZM1Z0Wlc1MExtSnZaSGt1YzNSNWJHVmJjSEp2Y0YwZ0lUMDlJQ2QxYm1SbFptbHVaV1FuS1NCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJ3Y205d08xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJSDBwTzF4eVhHNGdJQ0FnY21WMGRYSnVJSFpsYm1SdmNsQnliM0J6TG14bGJtZDBhQ0EvSUhabGJtUnZjbEJ5YjNCeld6QmRJRG9nZFc1a1pXWnBibVZrTzF4eVhHNTlYSEpjYmx4eVhHNWxlSEJ2Y25RZ1pHVm1ZWFZzZENCblpYUldaVzVrYjNKUWNtOXdaWEowZVR0Y2NseHVJbDE5IiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcclxuICogQWRkIGFuYWx5dGljcyB0cmFja2luZyB0byBhIHdpZGdldFxyXG4gKiBAY2xhc3NkZXNjIEFkZCBhbmFseXRpY3MgbGlzdGVuZXJzIGFuZCBldmVudHMgZm9yIFtraXNzbWV0cmljc10gYW5hbHl0aWNzIGZyYW1ld29ya1xyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy5jb25maWcuIEhhc2ggb2Ygd2lkZ2V0IGNvbmZpZyBvcHRpb25zXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLndpZGdldC4gVGhlIHdpZGdldCBpbnN0YW5jZSBbcmVxdWlyZWRdXHJcbiAqIEBjbGFzcyBTZXQgYW5hbHl0aWNzIGluc3RhbmNlIHByb3BlcnRpZXM7IGluaXRpYWxpc2UgYW5hbHl0aWNzXHJcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuXHR2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXG52YXIgQW5hbHl0aWNzID0gKGZ1bmN0aW9uICgpIHtcblx0ZnVuY3Rpb24gQW5hbHl0aWNzKCkge1xuXHRcdHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07XG5cblx0XHR2YXIgd2lkZ2V0ID0gX3JlZi53aWRnZXQ7XG5cdFx0dmFyIGNvbmZpZ0hhc2ggPSBfcmVmLmNvbmZpZ0hhc2g7XG5cdFx0dmFyIGNhbGxiYWNrcyA9IF9yZWYuY2FsbGJhY2tzO1xuXG5cdFx0X2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFuYWx5dGljcyk7XG5cblx0XHR0aGlzLndpZGdldCA9IHdpZGdldDtcblx0XHRpZiAoIXRoaXMud2lkZ2V0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuY29uZmlnSGFzaCA9IGNvbmZpZ0hhc2ggfHwge307XG5cdFx0dGhpcy5jYWxsYmFja3MgPSBjYWxsYmFja3MgfHwgW107XG5cdFx0dGhpcy5pbml0KCk7XG5cdH1cblxuXHQvKipcclxuIFx0KiBJbml0aWFsaXNlIGFuYWx5dGljc1xyXG4gXHQqIEBkZXNjcmlwdGlvbiBDYWNoZSB0aGUgd2lkZ2V0IGVsZW1lbnQ7IGZldGNoIGFuYWx5dGljcyB2YWx1ZXMgb24gdGhlIHdpZGdldCBlbGVtZW50OyB0cmlnZ2VyIGFuYWx5dGljcyBtZXRob2RzXHJcbiBcdCovXG5cblx0X2NyZWF0ZUNsYXNzKEFuYWx5dGljcywgW3tcblx0XHRrZXk6ICdpbml0Jyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gaW5pdCgpIHtcblx0XHRcdHRoaXMud2lkZ2V0RWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1hbmFseXRpY3Mtd2lkZ2V0XScpO1xuXHRcdFx0aWYgKHRoaXMud2lkZ2V0RWwpIHtcblx0XHRcdFx0dGhpcy53aWRnZXROYW1lID0gdGhpcy53aWRnZXRFbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYW5hbHl0aWNzLXdpZGdldCcpO1xuXHRcdFx0XHR0aGlzLmNoYXJpdHlJZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNoYXJpdHktaWRdJykgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jaGFyaXR5LWlkXScpLmdldEF0dHJpYnV0ZSgnZGF0YS1jaGFyaXR5LWlkJykgOiAnJztcblx0XHRcdFx0dGhpcy5mcnBJZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNoYXJpdHktZnJwSWRdJykgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jaGFyaXR5LWZycElkXScpLmdldEF0dHJpYnV0ZSgnZGF0YS1jaGFyaXR5LWZycElkJykgOiAnJztcblxuXHRcdFx0XHR0aGlzLnB1c2hDb25maWcoKTtcblx0XHRcdFx0dGhpcy53aWRnZXRJbml0KCk7XG5cdFx0XHRcdHRoaXMuY2FyZHNJbml0KCk7XG5cdFx0XHRcdHRoaXMuY2FyZEltcHJlc3Npb25zKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgXHQqIFB1c2ggdXNlciBjb25maWcgaGFzaCBbaW5jbHVkaW5nIHBhcmVudCBwYWdlJ3MgcmVmZXJyZXJdIHRvIGtpc3NtZXRyaWNzIGFzIHByb3BlcnR5XHJcbiAgXHQqL1xuXHR9LCB7XG5cdFx0a2V5OiAncHVzaENvbmZpZycsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIHB1c2hDb25maWcoKSB7XG5cdFx0XHR0aGlzLnNlbmREYXRhKFsnc2V0JywgdGhpcy5jb25maWdIYXNoXSk7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgXHQqIEluaXRpYWxpc2Ugd2lkZ2V0IGFuYWx5dGljcyBkYXRhIGhhc2hcclxuICBcdCogQGRlc2NyaXB0aW9uIENyZWF0ZSBhIGhhc2ggb2Ygd2lkZ2V0LWxldmVsIGFuYWx5dGljcyB2YWx1ZXM7IHN0b3JlIGl0IG9uIHRoZSB3aWRnZXQgZWxlbWVudDtcclxuICBcdCogcmVnaXN0ZXIgY2xpY2sgbGlzdGVuZXIgb24gd2lkZ2V0IGVsZW1lbnRcclxuICBcdCovXG5cdH0sIHtcblx0XHRrZXk6ICd3aWRnZXRJbml0Jyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gd2lkZ2V0SW5pdCgpIHtcblx0XHRcdHZhciBfdGhpcyA9IHRoaXM7XG5cblx0XHRcdHZhciBhbmFseXRpY3NEYXRhID0ge1xuXHRcdFx0XHRwYWdlX3R5cGU6ICd3aWRnZXQnLCAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblx0XHRcdFx0J2V2ZW50JzogJ3BhZ2UgY2xpY2snLFxuXHRcdFx0XHRhY3Rpdml0eV90eXBlOiB0aGlzLndpZGdldE5hbWUsIC8vIGpzaGludCBpZ25vcmU6bGluZVxuXHRcdFx0XHRjaGFyaXR5X2lkOiB0aGlzLmNoYXJpdHlJZCwgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cdFx0XHRcdHBhZ2VfaWQ6IHRoaXMuZnJwSWQgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cdFx0XHR9O1xuXHRcdFx0dGhpcy53aWRnZXRFbC5hbmFseXRpY3MgPSBhbmFseXRpY3NEYXRhO1xuXG5cdFx0XHR0aGlzLndpZGdldEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0X3RoaXMud2lkZ2V0Q2xpY2soZSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvKipcclxuICBcdCogUHVzaCBraXNzbWV0cmljcyBOT04tY2FyZCBjbGljayBldmVudHNcclxuICBcdCogQGRlc2NyaXB0aW9uIEhhbmRsZSBub24tY2FyZCBjbGljayBldmVudHMgb24gdGhlIHdpZGdldCB1c2luZyBldmVudCBkZWxlZ2F0aW9uLiBDcmVhdGUgY2xpY2sgdmFsdWVzIGhhc2ggZm9yIHRhcmdldCBlbGVtZW50c1xyXG4gIFx0KiBhbmQgZmlyZSBraXNzbWV0cmljcyBwYWdlIGNsaWNrIGV2ZW50XHJcbiAgXHQqL1xuXHR9LCB7XG5cdFx0a2V5OiAnd2lkZ2V0Q2xpY2snLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiB3aWRnZXRDbGljayhlKSB7XG5cdFx0XHR2YXIgZXZ0ID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWFuYWx5dGljcy1ldmVudCcpO1xuXHRcdFx0aWYgKGV2dCkge1xuXHRcdFx0XHR2YXIgY2xpY2tEYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy53aWRnZXRFbC5hbmFseXRpY3MpO1xuXHRcdFx0XHRjbGlja0RhdGEuc3VidHlwZSA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1hbmFseXRpY3Mtc3VidHlwZScpO1xuXHRcdFx0XHRjbGlja0RhdGEuZXZlbnRfdmFsdWUgPSBldnQ7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXHRcdFx0XHR0aGlzLnNlbmREYXRhKFsncmVjb3JkJywgJ3BhZ2UgY2xpY2snLCBjbGlja0RhdGFdKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvKipcclxuICBcdCogSW5pdGlhbGlzZSBjYXJkIGFuYWx5dGljcyBkYXRhIGhhc2hcclxuICBcdCogQGRlc2NyaXB0aW9uIEZvciBlYWNoIGNhcmQgaW4gdGhlIERPTSBjcmVhdGUgYSBjYXJkIGFuYWx5dGljcyBoYXNoIGFuZCBzdG9yZSBpdCBvbiB0aGUgY2FyZCBbaWYgbm9uZSBhbHJlYWR5IHByZXNlbnRdO1xyXG4gIFx0KiBhbmQgYWRkIGNsaWNrIGxpc3RuZXJcclxuICBcdCovXG5cdH0sIHtcblx0XHRrZXk6ICdjYXJkc0luaXQnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBjYXJkc0luaXQoKSB7XG5cdFx0XHR2YXIgX3RoaXMyID0gdGhpcztcblxuXHRcdFx0dmFyIGNhcmRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYW5hbHl0aWNzLWNhcmRdJyk7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cblx0XHRcdFtdLnNsaWNlLmNhbGwoY2FyZHMpLmZvckVhY2goZnVuY3Rpb24gKGNhcmQsIGluZGV4KSB7XG5cdFx0XHRcdGNhcmQuc2V0QXR0cmlidXRlKCdkYXRhLWNhcmQtcmFuaycsIGluZGV4KTtcblx0XHRcdFx0aWYgKCFjYXJkLmFuYWx5dGljcykge1xuXHRcdFx0XHRcdHZhciBhbmFseXRpY3NEYXRhID0ge307XG5cdFx0XHRcdFx0dmFyIGNoYXJpdHlJZCA9IGNhcmQuZ2V0QXR0cmlidXRlKCdkYXRhLWNoYXJpdHktaWQnKSB8fCAnJztcblx0XHRcdFx0XHR2YXIgYWN0aXZpdHlJZCA9IGNhcmQuZ2V0QXR0cmlidXRlKCdkYXRhLWFjdGl2aXR5LWlkJykgfHwgJyc7XG5cdFx0XHRcdFx0dmFyIGNhcmRSYW5rID0gY2FyZC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2FyZC1yYW5rJyk7XG5cdFx0XHRcdFx0dmFyIGNhcmRGcnBJZCA9IGNhcmQuZ2V0QXR0cmlidXRlKCdkYXRhLWZycC1pZCcpIHx8ICcnO1xuXHRcdFx0XHRcdHZhciBjYXJkVXJsID0gY2FyZC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2FyZC11cmwnKSB8fCAnJztcblxuXHRcdFx0XHRcdGFuYWx5dGljc0RhdGEucGFnZV90eXBlID0gJ3dpZGdldCc7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXHRcdFx0XHRcdGFuYWx5dGljc0RhdGEuY2FyZF9pZCA9IF90aGlzMi53aWRnZXROYW1lICsgJy0nICsgY2hhcml0eUlkICsgJy0nICsgYWN0aXZpdHlJZDsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cdFx0XHRcdFx0YW5hbHl0aWNzRGF0YS5jYXJkX3JhbmsgPSBjYXJkUmFuazsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cdFx0XHRcdFx0YW5hbHl0aWNzRGF0YS5hY3Rpdml0eV9pZCA9IGFjdGl2aXR5SWQ7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXHRcdFx0XHRcdGFuYWx5dGljc0RhdGEuYWN0aXZpdHlfdHlwZSA9IF90aGlzMi53aWRnZXROYW1lOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblx0XHRcdFx0XHRhbmFseXRpY3NEYXRhLmNoYXJpdHlfaWQgPSBjaGFyaXR5SWQ7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXHRcdFx0XHRcdGFuYWx5dGljc0RhdGEucGFnZV9pZCA9IGNhcmRGcnBJZDsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cdFx0XHRcdFx0YW5hbHl0aWNzRGF0YS5jYXJkX3VybCA9IGNhcmRVcmw7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXG5cdFx0XHRcdFx0Y2FyZC5hbmFseXRpY3MgPSBhbmFseXRpY3NEYXRhO1xuXG5cdFx0XHRcdFx0Y2FyZC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdFx0c2VsZi5jYXJkQ2xpY2soZSwgdGhpcyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gIFx0KiBQdXNoIGtpc3NtZXRyaWNzIGNhcmQgaW1wcmVzc2lvbnNcclxuICBcdCogQGRlc2NyaXB0aW9uIEZvciBhbGwgdmlzaWJsZSBjYXJkcywgY3JlYXRlIGEgY2FyZCBpbXByZXNzaW9uIGFuYWx5dGljcyBoYXNoIGFuZCBmaXJlIGEga2lzc21ldHJpY3MgY2FyZCBpbXByZXNzaW9uIGV2ZW50XHJcbiAgXHQqL1xuXHR9LCB7XG5cdFx0a2V5OiAnY2FyZEltcHJlc3Npb25zJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gY2FyZEltcHJlc3Npb25zKCkge1xuXHRcdFx0dmFyIF90aGlzMyA9IHRoaXM7XG5cblx0XHRcdHZhciBjYXJkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWFuYWx5dGljcy1jYXJkXTpub3QoW2RhdGEtaGlkZGVuXSknKTtcblx0XHRcdFtdLnNsaWNlLmNhbGwoY2FyZHMpLmZvckVhY2goZnVuY3Rpb24gKGNhcmQpIHtcblx0XHRcdFx0dmFyIGltcHJlc3Npb25EYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgY2FyZC5hbmFseXRpY3MpO1xuXHRcdFx0XHRpbXByZXNzaW9uRGF0YS5ldmVudCA9ICdpbXByZXNzaW9uJztcblx0XHRcdFx0aW1wcmVzc2lvbkRhdGEuY2FyZF9jb3VudCA9IGNhcmRzLmxlbmd0aDsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cdFx0XHRcdF90aGlzMy5zZW5kRGF0YShbJ3JlY29yZCcsICdpbXByZXNzaW9uJywgaW1wcmVzc2lvbkRhdGFdKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gIFx0KiBQdXNoIGtpc3NtZXRyaWNzIGNhcmQgY2xpY2sgZXZlbnRzXHJcbiAgXHQqIEBkZXNjcmlwdGlvbiBIYW5kbGUgY2FyZCBjbGljayBldmVudHMgb24gdGhlIHdpZGdldCB1c2luZyBldmVudCBkZWxlZ2F0aW9uLiBDcmVhdGUgYSBjYXJkIGNsaWNrIHZhbHVlcyBoYXNoIGZvciB0YXJlZ3QgY2FyZFxyXG4gIFx0KiBhbmQgZmlyZSBhIGtpc3NtZXRyaWNzIGNhcmQgY2xpY2sgZXZlbnRcclxuICBcdCovXG5cdH0sIHtcblx0XHRrZXk6ICdjYXJkQ2xpY2snLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBjYXJkQ2xpY2soZSwgY2FyZCkge1xuXHRcdFx0dmFyIGV2dCA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1hbmFseXRpY3MtZXZlbnQnKTtcblx0XHRcdGlmIChldnQpIHtcblx0XHRcdFx0dmFyIGNsaWNrRGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGNhcmQuYW5hbHl0aWNzKTtcblx0XHRcdFx0Y2xpY2tEYXRhLmV2ZW50ID0gJ2NhcmQgY2xpY2snO1xuXHRcdFx0XHRjbGlja0RhdGEuc3VidHlwZSA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1hbmFseXRpY3Mtc3VidHlwZScpO1xuXHRcdFx0XHRjbGlja0RhdGEuZXZlbnRfdmFsdWUgPSBldnQ7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXHRcdFx0XHRjbGlja0RhdGEuY2FyZF9jb3VudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWFuYWx5dGljcy1jYXJkXTpub3QoW2RhdGEtaGlkZGVuXSknKS5sZW5ndGg7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXHRcdFx0XHR0aGlzLnNlbmREYXRhKFsncmVjb3JkJywgJ2NhcmQgY2xpY2snLCBjbGlja0RhdGFdKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvKipcclxuICAgKiBQdXNoIGRhdGEgdG8gdHJhY2tlcnNcclxuICAgKi9cblx0fSwge1xuXHRcdGtleTogJ3NlbmREYXRhJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gc2VuZERhdGEoZGF0YSkge1xuXHRcdFx0dGhpcy5jYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbiAoY2IpIHtcblx0XHRcdFx0cmV0dXJuIGNiKGRhdGEpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XSk7XG5cblx0cmV0dXJuIEFuYWx5dGljcztcbn0pKCk7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IEFuYWx5dGljcztcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWtNNkwzUmxiWEF2UjBjdVJuSnZiblJGYm1RdVYybGtaMlYwY3k5M2FXUm5aWFJ6TDJOb1lYSnBkSGt0WlhabGJuUnpMV0p2WVhKa0wySnZkMlZ5WDJOdmJYQnZibVZ1ZEhNdmFuVnpkR2RwZG1sdVp5MTNhV1JuWlhRdFpuSmhiV1YzYjNKckwyTnZiWEJ2Ym1WdWRITXZiR2xpTDJwekwyWnlZVzFsZDI5eWF5OUJibUZzZVhScFkzTXVhbk1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJa0ZCUVVFc1dVRkJXU3hEUVVGRE96czdPenM3T3pzN096czdPenM3T3pzN1NVRlZVQ3hUUVVGVE8wRkJRMFlzVlVGRVVDeFRRVUZUTEVkQlEzbERPMjFGUVVGTUxFVkJRVVU3TzAxQlFYQkRMRTFCUVUwc1VVRkJUaXhOUVVGTk8wMUJRVVVzVlVGQlZTeFJRVUZXTEZWQlFWVTdUVUZCUlN4VFFVRlRMRkZCUVZRc1UwRkJVenM3ZDBKQlJIaERMRk5CUVZNN08wRkJSV0lzVFVGQlNTeERRVUZETEUxQlFVMHNSMEZCUnl4TlFVRk5MRU5CUVVNN1FVRkRja0lzVFVGQlN5eERRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRVZCUVVjN1FVRkRia0lzVlVGQlR6dEhRVU5RTzBGQlEwUXNUVUZCU1N4RFFVRkRMRlZCUVZVc1IwRkJSeXhWUVVGVkxFbEJRVWtzUlVGQlJTeERRVUZETzBGQlEyNURMRTFCUVVrc1EwRkJReXhUUVVGVExFZEJRVWNzVTBGQlV5eEpRVUZKTEVWQlFVVXNRMEZCUXp0QlFVTnFReXhOUVVGSkxFTkJRVU1zU1VGQlNTeEZRVUZGTEVOQlFVTTdSVUZEV2pzN096czdPenRqUVZSSkxGTkJRVk03TzFOQlkxUXNaMEpCUVVjN1FVRkRVQ3hQUVVGSkxFTkJRVU1zVVVGQlVTeEhRVUZITEZGQlFWRXNRMEZCUXl4aFFVRmhMRU5CUVVNc2VVSkJRWGxDTEVOQlFVTXNRMEZCUXp0QlFVTnNSU3hQUVVGSkxFbEJRVWtzUTBGQlF5eFJRVUZSTEVWQlFVVTdRVUZEYkVJc1VVRkJTU3hEUVVGRExGVkJRVlVzUjBGQlJ5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRmxCUVZrc1EwRkJReXgxUWtGQmRVSXNRMEZCUXl4RFFVRkRPMEZCUTNSRkxGRkJRVWtzUTBGQlF5eFRRVUZUTEVkQlFVY3NVVUZCVVN4RFFVRkRMR0ZCUVdFc1EwRkJReXh0UWtGQmJVSXNRMEZCUXl4SFFVTXpSQ3hSUVVGUkxFTkJRVU1zWVVGQllTeERRVUZETEcxQ1FVRnRRaXhEUVVGRExFTkJRVU1zV1VGQldTeERRVUZETEdsQ1FVRnBRaXhEUVVGRExFZEJRVWNzUlVGQlJTeERRVUZETzBGQlEyeEdMRkZCUVVrc1EwRkJReXhMUVVGTExFZEJRVWNzVVVGQlVTeERRVUZETEdGQlFXRXNRMEZCUXl4elFrRkJjMElzUTBGQlF5eEhRVU14UkN4UlFVRlJMRU5CUVVNc1lVRkJZU3hEUVVGRExITkNRVUZ6UWl4RFFVRkRMRU5CUVVNc1dVRkJXU3hEUVVGRExHOUNRVUZ2UWl4RFFVRkRMRWRCUVVjc1JVRkJSU3hEUVVGRE96dEJRVVY0Uml4UlFVRkpMRU5CUVVNc1ZVRkJWU3hGUVVGRkxFTkJRVU03UVVGRGJFSXNVVUZCU1N4RFFVRkRMRlZCUVZVc1JVRkJSU3hEUVVGRE8wRkJRMnhDTEZGQlFVa3NRMEZCUXl4VFFVRlRMRVZCUVVVc1EwRkJRenRCUVVOcVFpeFJRVUZKTEVOQlFVTXNaVUZCWlN4RlFVRkZMRU5CUVVNN1NVRkRka0k3UjBGRFJEczdPenM3T3p0VFFVbFZMSE5DUVVGSE8wRkJRMklzVDBGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRMRXRCUVVzc1JVRkJSU3hKUVVGSkxFTkJRVU1zVlVGQlZTeERRVUZETEVOQlFVTXNRMEZCUXp0SFFVTjRRenM3T3pzN096czdPMU5CVFZVc2MwSkJRVWM3T3p0QlFVTmlMRTlCUVVrc1lVRkJZU3hIUVVGSE8wRkJRMjVDTEdGQlFWTXNSVUZCUlN4UlFVRlJPMEZCUTI1Q0xGZEJRVThzUlVGQlJTeFpRVUZaTzBGQlEzSkNMR2xDUVVGaExFVkJRVVVzU1VGQlNTeERRVUZETEZWQlFWVTdRVUZET1VJc1kwRkJWU3hGUVVGRkxFbEJRVWtzUTBGQlF5eFRRVUZUTzBGQlF6RkNMRmRCUVU4c1JVRkJSU3hKUVVGSkxFTkJRVU1zUzBGQlN6dEpRVU51UWl4RFFVRkRPMEZCUTBZc1QwRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eFRRVUZUTEVkQlFVY3NZVUZCWVN4RFFVRkRPenRCUVVWNFF5eFBRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMR2RDUVVGblFpeERRVUZETEU5QlFVOHNSVUZCUlN4VlFVRkZMRU5CUVVNc1JVRkJUVHRCUVVOb1JDeFZRVUZMTEZkQlFWY3NRMEZCUlN4RFFVRkRMRU5CUVVVc1EwRkJRenRKUVVOMFFpeERRVUZETEVOQlFVTTdSMEZEU0RzN096czdPenM3TzFOQlRWa3NjVUpCUVVVc1EwRkJReXhGUVVGSE8wRkJRMnhDTEU5QlFVa3NSMEZCUnl4SFFVRkhMRU5CUVVNc1EwRkJReXhOUVVGTkxFTkJRVU1zV1VGQldTeERRVUZETEhOQ1FVRnpRaXhEUVVGRExFTkJRVU03UVVGRGVFUXNUMEZCU1N4SFFVRkhMRVZCUVVVN1FVRkRVaXhSUVVGSkxGTkJRVk1zUjBGQlJ5eE5RVUZOTEVOQlFVTXNUVUZCVFN4RFFVRkRMRVZCUVVVc1JVRkJSU3hKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEZOQlFWTXNRMEZCUlN4RFFVRkRPMEZCUXpWRUxHRkJRVk1zUTBGQlF5eFBRVUZQTEVkQlFVY3NRMEZCUXl4RFFVRkRMRTFCUVUwc1EwRkJReXhaUVVGWkxFTkJRVU1zZDBKQlFYZENMRU5CUVVNc1EwRkJRenRCUVVOd1JTeGhRVUZUTEVOQlFVTXNWMEZCVnl4SFFVRkhMRWRCUVVjc1EwRkJRenRCUVVNMVFpeFJRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRU5CUVVNc1VVRkJVU3hGUVVGRkxGbEJRVmtzUlVGQlJTeFRRVUZUTEVOQlFVTXNRMEZCUXl4RFFVRkRPMGxCUTI1RU8wZEJRMFE3T3pzN096czdPenRUUVUxVkxIRkNRVUZIT3pzN1FVRkRZaXhQUVVGSkxFdEJRVXNzUjBGQlJ5eFJRVUZSTEVOQlFVTXNaMEpCUVdkQ0xFTkJRVU1zZFVKQlFYVkNMRU5CUVVNc1EwRkJRenRCUVVNdlJDeFBRVUZKTEVsQlFVa3NSMEZCUnl4SlFVRkpMRU5CUVVNN08wRkJSV2hDTEV0QlFVVXNRMEZCUXl4TFFVRkxMRU5CUVVNc1NVRkJTU3hEUVVGRkxFdEJRVXNzUTBGQlJTeERRVUZETEU5QlFVOHNRMEZCUXl4VlFVRkZMRWxCUVVrc1JVRkJSU3hMUVVGTExFVkJRVTA3UVVGRGFrUXNVVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhuUWtGQlowSXNSVUZCUlN4TFFVRkxMRU5CUVVNc1EwRkJRenRCUVVNelF5eFJRVUZMTEVOQlFVTXNTVUZCU1N4RFFVRkRMRk5CUVZNc1JVRkJSenRCUVVOMFFpeFRRVUZKTEdGQlFXRXNSMEZCUnl4RlFVRkZMRU5CUVVNN1FVRkRka0lzVTBGQlNTeFRRVUZUTEVkQlFVY3NTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhwUWtGQmFVSXNRMEZCUXl4SlFVRkpMRVZCUVVVc1EwRkJRenRCUVVNelJDeFRRVUZKTEZWQlFWVXNSMEZCUnl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExHdENRVUZyUWl4RFFVRkRMRWxCUVVrc1JVRkJSU3hEUVVGRE8wRkJRemRFTEZOQlFVa3NVVUZCVVN4SFFVRkhMRWxCUVVrc1EwRkJReXhaUVVGWkxFTkJRVU1zWjBKQlFXZENMRU5CUVVNc1EwRkJRenRCUVVOdVJDeFRRVUZKTEZOQlFWTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExHRkJRV0VzUTBGQlF5eEpRVUZKTEVWQlFVVXNRMEZCUXp0QlFVTjJSQ3hUUVVGSkxFOUJRVThzUjBGQlJ5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMR1ZCUVdVc1EwRkJReXhKUVVGSkxFVkJRVVVzUTBGQlF6czdRVUZGZGtRc2EwSkJRV0VzUTBGQlF5eFRRVUZUTEVkQlFVY3NVVUZCVVN4RFFVRkRPMEZCUTI1RExHdENRVUZoTEVOQlFVTXNUMEZCVHl4SFFVRk5MRTlCUVVzc1ZVRkJWU3hUUVVGSkxGTkJRVk1zVTBGQlNTeFZRVUZWTEVGQlFVVXNRMEZCUXp0QlFVTjRSU3hyUWtGQllTeERRVUZETEZOQlFWTXNSMEZCUnl4UlFVRlJMRU5CUVVNN1FVRkRia01zYTBKQlFXRXNRMEZCUXl4WFFVRlhMRWRCUVVjc1ZVRkJWU3hEUVVGRE8wRkJRM1pETEd0Q1FVRmhMRU5CUVVNc1lVRkJZU3hIUVVGSExFOUJRVXNzVlVGQlZTeERRVUZETzBGQlF6bERMR3RDUVVGaExFTkJRVU1zVlVGQlZTeEhRVUZITEZOQlFWTXNRMEZCUXp0QlFVTnlReXhyUWtGQllTeERRVUZETEU5QlFVOHNSMEZCUnl4VFFVRlRMRU5CUVVNN1FVRkRiRU1zYTBKQlFXRXNRMEZCUXl4UlFVRlJMRWRCUVVjc1QwRkJUeXhEUVVGRE96dEJRVVZxUXl4VFFVRkpMRU5CUVVNc1UwRkJVeXhIUVVGSExHRkJRV0VzUTBGQlF6czdRVUZGTDBJc1UwRkJTU3hEUVVGRExHZENRVUZuUWl4RFFVRkRMRTlCUVU4c1JVRkJSU3hWUVVGWExFTkJRVU1zUlVGQlJ6dEJRVU0zUXl4UFFVRkRMRU5CUVVNc1pVRkJaU3hGUVVGRkxFTkJRVU03UVVGRGNFSXNWVUZCU1N4RFFVRkRMRk5CUVZNc1EwRkJSU3hEUVVGRExFVkJRVVVzU1VGQlNTeERRVUZGTEVOQlFVTTdUVUZETVVJc1EwRkJReXhEUVVGRE8wdEJRMGc3U1VGRFJDeERRVUZETEVOQlFVTTdSMEZEU0RzN096czdPenM3VTBGTFpTd3lRa0ZCUnpzN08wRkJRMnhDTEU5QlFVa3NTMEZCU3l4SFFVRkhMRkZCUVZFc1EwRkJReXhuUWtGQlowSXNRMEZCUXl3d1EwRkJNRU1zUTBGQlF5eERRVUZETzBGQlEyeEdMRXRCUVVVc1EwRkJReXhMUVVGTExFTkJRVU1zU1VGQlNTeERRVUZGTEV0QlFVc3NRMEZCUlN4RFFVRkRMRTlCUVU4c1EwRkJReXhWUVVGRkxFbEJRVWtzUlVGQlRUdEJRVU14UXl4UlFVRkpMR05CUVdNc1IwRkJSeXhOUVVGTkxFTkJRVU1zVFVGQlRTeERRVUZETEVWQlFVVXNSVUZCUlN4SlFVRkpMRU5CUVVNc1UwRkJVeXhEUVVGRkxFTkJRVU03UVVGRGVFUXNhMEpCUVdNc1EwRkJReXhMUVVGTExFZEJRVWNzV1VGQldTeERRVUZETzBGQlEzQkRMR3RDUVVGakxFTkJRVU1zVlVGQlZTeEhRVUZITEV0QlFVc3NRMEZCUXl4TlFVRk5MRU5CUVVNN1FVRkRla01zVjBGQlN5eFJRVUZSTEVOQlFVTXNRMEZCUXl4UlFVRlJMRVZCUVVVc1dVRkJXU3hGUVVGRkxHTkJRV01zUTBGQlF5eERRVUZETEVOQlFVTTdTVUZEZUVRc1EwRkJReXhEUVVGRE8wZEJRMGc3T3pzN096czdPenRUUVUxVExHMUNRVUZGTEVOQlFVTXNSVUZCUlN4SlFVRkpMRVZCUVVjN1FVRkRja0lzVDBGQlNTeEhRVUZITEVkQlFVY3NRMEZCUXl4RFFVRkRMRTFCUVUwc1EwRkJReXhaUVVGWkxFTkJRVU1zYzBKQlFYTkNMRU5CUVVNc1EwRkJRenRCUVVONFJDeFBRVUZKTEVkQlFVY3NSVUZCUlR0QlFVTlNMRkZCUVVrc1UwRkJVeXhIUVVGSExFMUJRVTBzUTBGQlF5eE5RVUZOTEVOQlFVTXNSVUZCUlN4RlFVRkZMRWxCUVVrc1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF6dEJRVU5zUkN4aFFVRlRMRU5CUVVNc1MwRkJTeXhIUVVGSExGbEJRVmtzUTBGQlF6dEJRVU12UWl4aFFVRlRMRU5CUVVNc1QwRkJUeXhIUVVGSExFTkJRVU1zUTBGQlF5eE5RVUZOTEVOQlFVTXNXVUZCV1N4RFFVRkRMSGRDUVVGM1FpeERRVUZETEVOQlFVTTdRVUZEY0VVc1lVRkJVeXhEUVVGRExGZEJRVmNzUjBGQlJ5eEhRVUZITEVOQlFVTTdRVUZETlVJc1lVRkJVeXhEUVVGRExGVkJRVlVzUjBGQlJ5eFJRVUZSTEVOQlFVTXNaMEpCUVdkQ0xFTkJRVU1zTUVOQlFUQkRMRU5CUVVNc1EwRkJReXhOUVVGTkxFTkJRVU03UVVGRGNFY3NVVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRExGRkJRVkVzUlVGQlJTeFpRVUZaTEVWQlFVVXNVMEZCVXl4RFFVRkRMRU5CUVVNc1EwRkJRenRKUVVOdVJEdEhRVU5FT3pzN096czdPMU5CUzA4c2EwSkJRVU1zU1VGQlNTeEZRVUZGTzBGQlEyUXNUMEZCU1N4RFFVRkRMRk5CUVZNc1EwRkJReXhQUVVGUExFTkJRVU1zVlVGQlFTeEZRVUZGTzFkQlFVa3NSVUZCUlN4RFFVRkRMRWxCUVVrc1EwRkJRenRKUVVGQkxFTkJRVU1zUTBGQlF6dEhRVU4yUXpzN08xRkJOVWxKTEZOQlFWTTdPenR4UWtFclNVRXNVMEZCVXlJc0ltWnBiR1VpT2lKRE9pOTBaVzF3TDBkSExrWnliMjUwUlc1a0xsZHBaR2RsZEhNdmQybGtaMlYwY3k5amFHRnlhWFI1TFdWMlpXNTBjeTFpYjJGeVpDOWliM2RsY2w5amIyMXdiMjVsYm5SekwycDFjM1JuYVhacGJtY3RkMmxrWjJWMExXWnlZVzFsZDI5eWF5OWpiMjF3YjI1bGJuUnpMMnhwWWk5cWN5OW1jbUZ0WlhkdmNtc3ZRVzVoYkhsMGFXTnpMbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaUozVnpaU0J6ZEhKcFkzUW5PMXh5WEc1Y2NseHVMeW9xWEhKY2JpQXFJRUZrWkNCaGJtRnNlWFJwWTNNZ2RISmhZMnRwYm1jZ2RHOGdZU0IzYVdSblpYUmNjbHh1SUNvZ1FHTnNZWE56WkdWell5QkJaR1FnWVc1aGJIbDBhV056SUd4cGMzUmxibVZ5Y3lCaGJtUWdaWFpsYm5SeklHWnZjaUJiYTJsemMyMWxkSEpwWTNOZElHRnVZV3g1ZEdsamN5Qm1jbUZ0WlhkdmNtdGNjbHh1SUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUc5d2RHbHZibk5jY2x4dUlDb2dRSEJoY21GdElIdFBZbXBsWTNSOUlHOXdkR2x2Ym5NdVkyOXVabWxuTGlCSVlYTm9JRzltSUhkcFpHZGxkQ0JqYjI1bWFXY2diM0IwYVc5dWMxeHlYRzRnS2lCQWNHRnlZVzBnZTA5aWFtVmpkSDBnYjNCMGFXOXVjeTUzYVdSblpYUXVJRlJvWlNCM2FXUm5aWFFnYVc1emRHRnVZMlVnVzNKbGNYVnBjbVZrWFZ4eVhHNGdLaUJBWTJ4aGMzTWdVMlYwSUdGdVlXeDVkR2xqY3lCcGJuTjBZVzVqWlNCd2NtOXdaWEowYVdWek95QnBibWwwYVdGc2FYTmxJR0Z1WVd4NWRHbGpjMXh5WEc0Z0tpOWNjbHh1WTJ4aGMzTWdRVzVoYkhsMGFXTnpJSHRjY2x4dVhIUmpiMjV6ZEhKMVkzUnZjaUFvSUhzZ2QybGtaMlYwTENCamIyNW1hV2RJWVhOb0xDQmpZV3hzWW1GamEzTWdmU0E5SUh0OUlDa2dlMXh5WEc1Y2RGeDBkR2hwY3k1M2FXUm5aWFFnUFNCM2FXUm5aWFE3WEhKY2JseDBYSFJwWmlBb0lDRjBhR2x6TG5kcFpHZGxkQ0FwSUh0Y2NseHVYSFJjZEZ4MGNtVjBkWEp1TzF4eVhHNWNkRngwZlZ4eVhHNWNkRngwZEdocGN5NWpiMjVtYVdkSVlYTm9JRDBnWTI5dVptbG5TR0Z6YUNCOGZDQjdmVHRjY2x4dVhIUmNkSFJvYVhNdVkyRnNiR0poWTJ0eklEMGdZMkZzYkdKaFkydHpJSHg4SUZ0ZE8xeHlYRzVjZEZ4MGRHaHBjeTVwYm1sMEtDazdYSEpjYmx4MGZWeHlYRzVjZEM4cUtseHlYRzRnWEhRcUlFbHVhWFJwWVd4cGMyVWdZVzVoYkhsMGFXTnpYSEpjYmlCY2RDb2dRR1JsYzJOeWFYQjBhVzl1SUVOaFkyaGxJSFJvWlNCM2FXUm5aWFFnWld4bGJXVnVkRHNnWm1WMFkyZ2dZVzVoYkhsMGFXTnpJSFpoYkhWbGN5QnZiaUIwYUdVZ2QybGtaMlYwSUdWc1pXMWxiblE3SUhSeWFXZG5aWElnWVc1aGJIbDBhV056SUcxbGRHaHZaSE5jY2x4dUlGeDBLaTljY2x4dVhIUnBibWwwSUNncElIdGNjbHh1WEhSY2RIUm9hWE11ZDJsa1oyVjBSV3dnUFNCa2IyTjFiV1Z1ZEM1eGRXVnllVk5sYkdWamRHOXlLQ2RiWkdGMFlTMWhibUZzZVhScFkzTXRkMmxrWjJWMFhTY3BPMXh5WEc1Y2RGeDBhV1lnS0hSb2FYTXVkMmxrWjJWMFJXd3BJSHRjY2x4dVhIUmNkRngwZEdocGN5NTNhV1JuWlhST1lXMWxJRDBnZEdocGN5NTNhV1JuWlhSRmJDNW5aWFJCZEhSeWFXSjFkR1VvSjJSaGRHRXRZVzVoYkhsMGFXTnpMWGRwWkdkbGRDY3BPMXh5WEc1Y2RGeDBYSFIwYUdsekxtTm9ZWEpwZEhsSlpDQTlJR1J2WTNWdFpXNTBMbkYxWlhKNVUyVnNaV04wYjNJb0oxdGtZWFJoTFdOb1lYSnBkSGt0YVdSZEp5a2dQMXh5WEc1Y2RGeDBYSFJjZEdSdlkzVnRaVzUwTG5GMVpYSjVVMlZzWldOMGIzSW9KMXRrWVhSaExXTm9ZWEpwZEhrdGFXUmRKeWt1WjJWMFFYUjBjbWxpZFhSbEtDZGtZWFJoTFdOb1lYSnBkSGt0YVdRbktTQTZJQ2NuTzF4eVhHNWNkRngwWEhSMGFHbHpMbVp5Y0Vsa0lEMGdaRzlqZFcxbGJuUXVjWFZsY25sVFpXeGxZM1J2Y2lnblcyUmhkR0V0WTJoaGNtbDBlUzFtY25CSlpGMG5LU0EvWEhKY2JseDBYSFJjZEZ4MFpHOWpkVzFsYm5RdWNYVmxjbmxUWld4bFkzUnZjaWduVzJSaGRHRXRZMmhoY21sMGVTMW1jbkJKWkYwbktTNW5aWFJCZEhSeWFXSjFkR1VvSjJSaGRHRXRZMmhoY21sMGVTMW1jbkJKWkNjcElEb2dKeWM3WEhKY2JseHlYRzVjZEZ4MFhIUjBhR2x6TG5CMWMyaERiMjVtYVdjb0tUdGNjbHh1WEhSY2RGeDBkR2hwY3k1M2FXUm5aWFJKYm1sMEtDazdYSEpjYmx4MFhIUmNkSFJvYVhNdVkyRnlaSE5KYm1sMEtDazdYSEpjYmx4MFhIUmNkSFJvYVhNdVkyRnlaRWx0Y0hKbGMzTnBiMjV6S0NrN1hISmNibHgwWEhSOVhISmNibHgwZlZ4eVhHNWNkQzhxS2x4eVhHNGdYSFFxSUZCMWMyZ2dkWE5sY2lCamIyNW1hV2NnYUdGemFDQmJhVzVqYkhWa2FXNW5JSEJoY21WdWRDQndZV2RsSjNNZ2NtVm1aWEp5WlhKZElIUnZJR3RwYzNOdFpYUnlhV056SUdGeklIQnliM0JsY25SNVhISmNiaUJjZENvdlhISmNibHgwY0hWemFFTnZibVpwWnlBb0tTQjdYSEpjYmx4MFhIUjBhR2x6TG5ObGJtUkVZWFJoS0ZzbmMyVjBKeXdnZEdocGN5NWpiMjVtYVdkSVlYTm9YU2s3WEhKY2JseDBmVnh5WEc1Y2RDOHFLbHh5WEc0Z1hIUXFJRWx1YVhScFlXeHBjMlVnZDJsa1oyVjBJR0Z1WVd4NWRHbGpjeUJrWVhSaElHaGhjMmhjY2x4dUlGeDBLaUJBWkdWelkzSnBjSFJwYjI0Z1EzSmxZWFJsSUdFZ2FHRnphQ0J2WmlCM2FXUm5aWFF0YkdWMlpXd2dZVzVoYkhsMGFXTnpJSFpoYkhWbGN6c2djM1J2Y21VZ2FYUWdiMjRnZEdobElIZHBaR2RsZENCbGJHVnRaVzUwTzF4eVhHNGdYSFFxSUhKbFoybHpkR1Z5SUdOc2FXTnJJR3hwYzNSbGJtVnlJRzl1SUhkcFpHZGxkQ0JsYkdWdFpXNTBYSEpjYmlCY2RDb3ZYSEpjYmx4MGQybGtaMlYwU1c1cGRDQW9LU0I3WEhKY2JseDBYSFJzWlhRZ1lXNWhiSGwwYVdOelJHRjBZU0E5SUh0Y2NseHVYSFJjZEZ4MGNHRm5aVjkwZVhCbE9pQW5kMmxrWjJWMEp5d2dMeThnYW5Ob2FXNTBJR2xuYm05eVpUcHNhVzVsWEhKY2JseDBYSFJjZENkbGRtVnVkQ2M2SUNkd1lXZGxJR05zYVdOckp5eGNjbHh1WEhSY2RGeDBZV04wYVhacGRIbGZkSGx3WlRvZ2RHaHBjeTUzYVdSblpYUk9ZVzFsTENBdkx5QnFjMmhwYm5RZ2FXZHViM0psT214cGJtVmNjbHh1WEhSY2RGeDBZMmhoY21sMGVWOXBaRG9nZEdocGN5NWphR0Z5YVhSNVNXUXNJQzh2SUdwemFHbHVkQ0JwWjI1dmNtVTZiR2x1WlZ4eVhHNWNkRngwWEhSd1lXZGxYMmxrT2lCMGFHbHpMbVp5Y0Vsa0lDOHZJR3B6YUdsdWRDQnBaMjV2Y21VNmJHbHVaVnh5WEc1Y2RGeDBmVHRjY2x4dVhIUmNkSFJvYVhNdWQybGtaMlYwUld3dVlXNWhiSGwwYVdOeklEMGdZVzVoYkhsMGFXTnpSR0YwWVR0Y2NseHVYSEpjYmx4MFhIUjBhR2x6TG5kcFpHZGxkRVZzTG1Ga1pFVjJaVzUwVEdsemRHVnVaWElvSjJOc2FXTnJKeXdnS0NCbElDa2dQVDRnZTF4eVhHNWNkRngwWEhSMGFHbHpMbmRwWkdkbGRFTnNhV05yS0NCbElDazdYSEpjYmx4MFhIUjlLVHRjY2x4dVhIUjlYSEpjYmx4MEx5b3FYSEpjYmlCY2RDb2dVSFZ6YUNCcmFYTnpiV1YwY21samN5Qk9UMDR0WTJGeVpDQmpiR2xqYXlCbGRtVnVkSE5jY2x4dUlGeDBLaUJBWkdWelkzSnBjSFJwYjI0Z1NHRnVaR3hsSUc1dmJpMWpZWEprSUdOc2FXTnJJR1YyWlc1MGN5QnZiaUIwYUdVZ2QybGtaMlYwSUhWemFXNW5JR1YyWlc1MElHUmxiR1ZuWVhScGIyNHVJRU55WldGMFpTQmpiR2xqYXlCMllXeDFaWE1nYUdGemFDQm1iM0lnZEdGeVoyVjBJR1ZzWlcxbGJuUnpYSEpjYmlCY2RDb2dZVzVrSUdacGNtVWdhMmx6YzIxbGRISnBZM01nY0dGblpTQmpiR2xqYXlCbGRtVnVkRnh5WEc0Z1hIUXFMMXh5WEc0Z1hIUjNhV1JuWlhSRGJHbGpheUFvSUdVZ0tTQjdYSEpjYmx4MFhIUnNaWFFnWlhaMElEMGdaUzUwWVhKblpYUXVaMlYwUVhSMGNtbGlkWFJsS0Nka1lYUmhMV0Z1WVd4NWRHbGpjeTFsZG1WdWRDY3BPMXh5WEc1Y2RGeDBhV1lnS0dWMmRDa2dlMXh5WEc1Y2RGeDBYSFJzWlhRZ1kyeHBZMnRFWVhSaElEMGdUMkpxWldOMExtRnpjMmxuYmloN2ZTd2dkR2hwY3k1M2FXUm5aWFJGYkM1aGJtRnNlWFJwWTNNZ0tUdGNjbHh1WEhSY2RGeDBZMnhwWTJ0RVlYUmhMbk4xWW5SNWNHVWdQU0JsTG5SaGNtZGxkQzVuWlhSQmRIUnlhV0oxZEdVb0oyUmhkR0V0WVc1aGJIbDBhV056TFhOMVluUjVjR1VuS1R0Y2NseHVYSFJjZEZ4MFkyeHBZMnRFWVhSaExtVjJaVzUwWDNaaGJIVmxJRDBnWlhaME95QXZMeUJxYzJocGJuUWdhV2R1YjNKbE9teHBibVZjY2x4dVhIUmNkRngwZEdocGN5NXpaVzVrUkdGMFlTaGJKM0psWTI5eVpDY3NJQ2R3WVdkbElHTnNhV05ySnl3Z1kyeHBZMnRFWVhSaFhTazdYSEpjYmx4MFhIUjlYSEpjYmx4MGZWeHlYRzVjZEM4cUtseHlYRzRnWEhRcUlFbHVhWFJwWVd4cGMyVWdZMkZ5WkNCaGJtRnNlWFJwWTNNZ1pHRjBZU0JvWVhOb1hISmNiaUJjZENvZ1FHUmxjMk55YVhCMGFXOXVJRVp2Y2lCbFlXTm9JR05oY21RZ2FXNGdkR2hsSUVSUFRTQmpjbVZoZEdVZ1lTQmpZWEprSUdGdVlXeDVkR2xqY3lCb1lYTm9JR0Z1WkNCemRHOXlaU0JwZENCdmJpQjBhR1VnWTJGeVpDQmJhV1lnYm05dVpTQmhiSEpsWVdSNUlIQnlaWE5sYm5SZE8xeHlYRzRnWEhRcUlHRnVaQ0JoWkdRZ1kyeHBZMnNnYkdsemRHNWxjbHh5WEc0Z1hIUXFMMXh5WEc0Z1hIUmpZWEprYzBsdWFYUWdLQ2tnZTF4eVhHNWNkRngwYkdWMElHTmhjbVJ6SUQwZ1pHOWpkVzFsYm5RdWNYVmxjbmxUWld4bFkzUnZja0ZzYkNnblcyUmhkR0V0WVc1aGJIbDBhV056TFdOaGNtUmRKeWs3WEhKY2JseDBYSFJzWlhRZ2MyVnNaaUE5SUhSb2FYTTdYSEpjYmx4eVhHNWNkRngwVzEwdWMyeHBZMlV1WTJGc2JDZ2dZMkZ5WkhNZ0tTNW1iM0pGWVdOb0tDZ2dZMkZ5WkN3Z2FXNWtaWGdnS1NBOVBpQjdYSEpjYmx4MFhIUmNkR05oY21RdWMyVjBRWFIwY21saWRYUmxLQ2RrWVhSaExXTmhjbVF0Y21GdWF5Y3NJR2x1WkdWNEtUdGNjbHh1WEhSY2RGeDBhV1lnS0NBaFkyRnlaQzVoYm1Gc2VYUnBZM01nS1NCN1hISmNibHgwWEhSY2RGeDBiR1YwSUdGdVlXeDVkR2xqYzBSaGRHRWdQU0I3ZlR0Y2NseHVYSFJjZEZ4MFhIUnNaWFFnWTJoaGNtbDBlVWxrSUQwZ1kyRnlaQzVuWlhSQmRIUnlhV0oxZEdVb0oyUmhkR0V0WTJoaGNtbDBlUzFwWkNjcElIeDhJQ2NuTzF4eVhHNWNkRngwWEhSY2RHeGxkQ0JoWTNScGRtbDBlVWxrSUQwZ1kyRnlaQzVuWlhSQmRIUnlhV0oxZEdVb0oyUmhkR0V0WVdOMGFYWnBkSGt0YVdRbktTQjhmQ0FuSnp0Y2NseHVYSFJjZEZ4MFhIUnNaWFFnWTJGeVpGSmhibXNnUFNCallYSmtMbWRsZEVGMGRISnBZblYwWlNnblpHRjBZUzFqWVhKa0xYSmhibXNuS1R0Y2NseHVYSFJjZEZ4MFhIUnNaWFFnWTJGeVpFWnljRWxrSUQwZ1kyRnlaQzVuWlhSQmRIUnlhV0oxZEdVb0oyUmhkR0V0Wm5Kd0xXbGtKeWtnZkh3Z0p5YzdYSEpjYmx4MFhIUmNkRngwYkdWMElHTmhjbVJWY213Z1BTQmpZWEprTG1kbGRFRjBkSEpwWW5WMFpTZ25aR0YwWVMxallYSmtMWFZ5YkNjcElIeDhJQ2NuTzF4eVhHNWNjbHh1WEhSY2RGeDBYSFJoYm1Gc2VYUnBZM05FWVhSaExuQmhaMlZmZEhsd1pTQTlJQ2QzYVdSblpYUW5PeUF2THlCcWMyaHBiblFnYVdkdWIzSmxPbXhwYm1WY2NseHVYSFJjZEZ4MFhIUmhibUZzZVhScFkzTkVZWFJoTG1OaGNtUmZhV1FnUFNCZ0pIdDBhR2x6TG5kcFpHZGxkRTVoYldWOUxTUjdZMmhoY21sMGVVbGtmUzBrZTJGamRHbDJhWFI1U1dSOVlEc2dMeThnYW5Ob2FXNTBJR2xuYm05eVpUcHNhVzVsWEhKY2JseDBYSFJjZEZ4MFlXNWhiSGwwYVdOelJHRjBZUzVqWVhKa1gzSmhibXNnUFNCallYSmtVbUZ1YXpzZ0x5OGdhbk5vYVc1MElHbG5ibTl5WlRwc2FXNWxYSEpjYmx4MFhIUmNkRngwWVc1aGJIbDBhV056UkdGMFlTNWhZM1JwZG1sMGVWOXBaQ0E5SUdGamRHbDJhWFI1U1dRN0lDOHZJR3B6YUdsdWRDQnBaMjV2Y21VNmJHbHVaVnh5WEc1Y2RGeDBYSFJjZEdGdVlXeDVkR2xqYzBSaGRHRXVZV04wYVhacGRIbGZkSGx3WlNBOUlIUm9hWE11ZDJsa1oyVjBUbUZ0WlRzZ0x5OGdhbk5vYVc1MElHbG5ibTl5WlRwc2FXNWxYSEpjYmx4MFhIUmNkRngwWVc1aGJIbDBhV056UkdGMFlTNWphR0Z5YVhSNVgybGtJRDBnWTJoaGNtbDBlVWxrT3lBdkx5QnFjMmhwYm5RZ2FXZHViM0psT214cGJtVmNjbHh1WEhSY2RGeDBYSFJoYm1Gc2VYUnBZM05FWVhSaExuQmhaMlZmYVdRZ1BTQmpZWEprUm5Kd1NXUTdJQzh2SUdwemFHbHVkQ0JwWjI1dmNtVTZiR2x1WlZ4eVhHNWNkRngwWEhSY2RHRnVZV3g1ZEdsamMwUmhkR0V1WTJGeVpGOTFjbXdnUFNCallYSmtWWEpzT3lBdkx5QnFjMmhwYm5RZ2FXZHViM0psT214cGJtVmNjbHh1WEhKY2JseDBYSFJjZEZ4MFkyRnlaQzVoYm1Gc2VYUnBZM01nUFNCaGJtRnNlWFJwWTNORVlYUmhPMXh5WEc1Y2NseHVYSFJjZEZ4MFhIUmpZWEprTG1Ga1pFVjJaVzUwVEdsemRHVnVaWElvSjJOc2FXTnJKeXdnWm5WdVkzUnBiMjRnS0NCbElDa2dlMXh5WEc1Y2RGeDBYSFJjZEZ4MFpTNXpkRzl3VUhKdmNHRm5ZWFJwYjI0b0tUdGNjbHh1WEhSY2RGeDBYSFJjZEhObGJHWXVZMkZ5WkVOc2FXTnJLQ0JsTENCMGFHbHpJQ2s3WEhKY2JseDBYSFJjZEZ4MGZTazdYSEpjYmx4MFhIUmNkSDFjY2x4dVhIUmNkSDBwTzF4eVhHNWNkSDFjY2x4dVhIUXZLaXBjY2x4dUlGeDBLaUJRZFhOb0lHdHBjM050WlhSeWFXTnpJR05oY21RZ2FXMXdjbVZ6YzJsdmJuTmNjbHh1SUZ4MEtpQkFaR1Z6WTNKcGNIUnBiMjRnUm05eUlHRnNiQ0IyYVhOcFlteGxJR05oY21SekxDQmpjbVZoZEdVZ1lTQmpZWEprSUdsdGNISmxjM05wYjI0Z1lXNWhiSGwwYVdOeklHaGhjMmdnWVc1a0lHWnBjbVVnWVNCcmFYTnpiV1YwY21samN5QmpZWEprSUdsdGNISmxjM05wYjI0Z1pYWmxiblJjY2x4dUlGeDBLaTljY2x4dVhIUmpZWEprU1cxd2NtVnpjMmx2Ym5NZ0tDa2dlMXh5WEc1Y2RGeDBiR1YwSUdOaGNtUnpJRDBnWkc5amRXMWxiblF1Y1hWbGNubFRaV3hsWTNSdmNrRnNiQ2duVzJSaGRHRXRZVzVoYkhsMGFXTnpMV05oY21SZE9tNXZkQ2hiWkdGMFlTMW9hV1JrWlc1ZEtTY3BPMXh5WEc1Y2RGeDBXMTB1YzJ4cFkyVXVZMkZzYkNnZ1kyRnlaSE1nS1M1bWIzSkZZV05vS0NnZ1kyRnlaQ0FwSUQwK0lIdGNjbHh1WEhSY2RGeDBiR1YwSUdsdGNISmxjM05wYjI1RVlYUmhJRDBnVDJKcVpXTjBMbUZ6YzJsbmJpaDdmU3dnWTJGeVpDNWhibUZzZVhScFkzTWdLVHRjY2x4dVhIUmNkRngwYVcxd2NtVnpjMmx2YmtSaGRHRXVaWFpsYm5RZ1BTQW5hVzF3Y21WemMybHZiaWM3WEhKY2JseDBYSFJjZEdsdGNISmxjM05wYjI1RVlYUmhMbU5oY21SZlkyOTFiblFnUFNCallYSmtjeTVzWlc1bmRHZzdJQzh2SUdwemFHbHVkQ0JwWjI1dmNtVTZiR2x1WlZ4eVhHNWNkRngwWEhSMGFHbHpMbk5sYm1SRVlYUmhLRnNuY21WamIzSmtKeXdnSjJsdGNISmxjM05wYjI0bkxDQnBiWEJ5WlhOemFXOXVSR0YwWVYwcE8xeHlYRzVjZEZ4MGZTazdYSEpjYmx4MGZWeHlYRzVjZEM4cUtseHlYRzRnWEhRcUlGQjFjMmdnYTJsemMyMWxkSEpwWTNNZ1kyRnlaQ0JqYkdsamF5QmxkbVZ1ZEhOY2NseHVJRngwS2lCQVpHVnpZM0pwY0hScGIyNGdTR0Z1Wkd4bElHTmhjbVFnWTJ4cFkyc2daWFpsYm5SeklHOXVJSFJvWlNCM2FXUm5aWFFnZFhOcGJtY2daWFpsYm5RZ1pHVnNaV2RoZEdsdmJpNGdRM0psWVhSbElHRWdZMkZ5WkNCamJHbGpheUIyWVd4MVpYTWdhR0Z6YUNCbWIzSWdkR0Z5WldkMElHTmhjbVJjY2x4dUlGeDBLaUJoYm1RZ1ptbHlaU0JoSUd0cGMzTnRaWFJ5YVdOeklHTmhjbVFnWTJ4cFkyc2daWFpsYm5SY2NseHVJRngwS2k5Y2NseHVYSFJqWVhKa1EyeHBZMnNnS0NCbExDQmpZWEprSUNrZ2UxeHlYRzVjZEZ4MGJHVjBJR1YyZENBOUlHVXVkR0Z5WjJWMExtZGxkRUYwZEhKcFluVjBaU2duWkdGMFlTMWhibUZzZVhScFkzTXRaWFpsYm5RbktUdGNjbHh1WEhSY2RHbG1JQ2hsZG5RcElIdGNjbHh1WEhSY2RGeDBiR1YwSUdOc2FXTnJSR0YwWVNBOUlFOWlhbVZqZEM1aGMzTnBaMjRvZTMwc0lHTmhjbVF1WVc1aGJIbDBhV056S1R0Y2NseHVYSFJjZEZ4MFkyeHBZMnRFWVhSaExtVjJaVzUwSUQwZ0oyTmhjbVFnWTJ4cFkyc25PMXh5WEc1Y2RGeDBYSFJqYkdsamEwUmhkR0V1YzNWaWRIbHdaU0E5SUdVdWRHRnlaMlYwTG1kbGRFRjBkSEpwWW5WMFpTZ25aR0YwWVMxaGJtRnNlWFJwWTNNdGMzVmlkSGx3WlNjcE8xeHlYRzVjZEZ4MFhIUmpiR2xqYTBSaGRHRXVaWFpsYm5SZmRtRnNkV1VnUFNCbGRuUTdJQzh2SUdwemFHbHVkQ0JwWjI1dmNtVTZiR2x1WlZ4eVhHNWNkRngwWEhSamJHbGphMFJoZEdFdVkyRnlaRjlqYjNWdWRDQTlJR1J2WTNWdFpXNTBMbkYxWlhKNVUyVnNaV04wYjNKQmJHd29KMXRrWVhSaExXRnVZV3g1ZEdsamN5MWpZWEprWFRwdWIzUW9XMlJoZEdFdGFHbGtaR1Z1WFNrbktTNXNaVzVuZEdnN0lDOHZJR3B6YUdsdWRDQnBaMjV2Y21VNmJHbHVaVnh5WEc1Y2RGeDBYSFIwYUdsekxuTmxibVJFWVhSaEtGc25jbVZqYjNKa0p5d2dKMk5oY21RZ1kyeHBZMnNuTENCamJHbGphMFJoZEdGZEtUdGNjbHh1WEhSY2RIMWNjbHh1WEhSOVhISmNibHh5WEc1Y2RDOHFLbHh5WEc1Y2RDQXFJRkIxYzJnZ1pHRjBZU0IwYnlCMGNtRmphMlZ5YzF4eVhHNWNkQ0FxTDF4eVhHNWNkSE5sYm1SRVlYUmhLR1JoZEdFcElIdGNjbHh1WEhSY2RIUm9hWE11WTJGc2JHSmhZMnR6TG1admNrVmhZMmdvWTJJZ1BUNGdZMklvWkdGMFlTa3BPMXh5WEc1Y2RIMWNjbHh1ZlZ4eVhHNWNjbHh1Wlhod2IzSjBJR1JsWm1GMWJIUWdRVzVoYkhsMGFXTnpPMXh5WEc0aVhYMD0iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcblx0dmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgndmFsdWUnIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOyB9IH1cblxudmFyIF91dGlsc1F1ZXJ5U3RyaW5nID0gcmVxdWlyZSgnLi4vdXRpbHMvcXVlcnlTdHJpbmcnKTtcblxuLyoqXHJcbiAqIENyZWF0ZSBhIHdpZGdldCBtb2RlbFxyXG4gKiBAY2xhc3NkZXNjIENyZWF0ZSBhIG1vZGVsIG9iamVjdCBcclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMud2lkZ2V0LiBUaGUgd2lkZ2V0IGluc3RhbmNlIFtyZXF1aXJlZF1cclxuICogQHBhcmFtIHtCb29sZWFufSBvcHRpb25zLmlzUGFnaW5hdGVkLiBXaGV0aGVyIHRoZSBtb2RlbCBjb25zdW1lcyBhIHBhZ2luYXRlZCBSRVNUIEFQSVxyXG4gKiBAY2xhc3MgU3RvcmVzIHRoZSByZXR1cm5lZCBtb2RlbCBkYXRhIGFzIHRoaXMuJG1vZGVsLiBTdG9yZXMgbW9kZWwgVVJMIHBhcmFtZXRlcnMgYXMgdGhpcy5wYXJhbXMuIEZvciBwYWdpbmF0ZWQgbW9kZWxzXHJcbiAqIHN0b3JlcyB0aGUgY29sbGVjdGlvbiBhcyB0aGlzLmNvbGxlY3Rpb24sIHN0b3JlcyB0aGUgbGFzdCBmZXRjaGVkIEFQSSBwYWdlIGFzIHRoaXMubGFzdFJldHVybmVkUGFnZTsgc2V0cyBhcGlQYWdlIHNpemUgdG8gZGVmYXVsdCAxMlxyXG4gKiBzZXRzIHBhZ2VOdW0gYW5kIHBhZ2VTaXplIHBhcmFtcyBvbiB0aGUgbW9kZWwgQVBJIFtpbml0aWFsaXNlcyB0byBwYWdlIDFdXHJcbiAqL1xudmFyIFByb21pc2UgPSByZXF1aXJlKCdlczYtcHJvbWlzZScpLlByb21pc2U7XG52YXIgeGhyID0gcmVxdWlyZSgneGhyJyk7XG5cbnZhciBNb2RlbCA9IChmdW5jdGlvbiAoKSB7XG5cdGZ1bmN0aW9uIE1vZGVsKCkge1xuXHRcdHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07XG5cblx0XHR2YXIgd2lkZ2V0ID0gX3JlZi53aWRnZXQ7XG5cdFx0dmFyIHVybCA9IF9yZWYudXJsO1xuXHRcdHZhciBwYXJhbXMgPSBfcmVmLnBhcmFtcztcblx0XHR2YXIgaXNQYWdpbmF0ZWQgPSBfcmVmLmlzUGFnaW5hdGVkO1xuXHRcdHZhciBhcGlQYWdlU2l6ZSA9IF9yZWYuYXBpUGFnZVNpemU7XG5cdFx0dmFyIGNvbGxlY3Rpb25QYXRoID0gX3JlZi5jb2xsZWN0aW9uUGF0aDtcblxuXHRcdF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNb2RlbCk7XG5cblx0XHR0aGlzLndpZGdldCA9IHdpZGdldDtcblx0XHR0aGlzLnVybCA9IHVybDtcblx0XHRpZiAoIXRoaXMud2lkZ2V0IHx8ICF0aGlzLnVybCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLiRtb2RlbCA9IHt9O1xuXHRcdHRoaXMucGFyYW1zID0gdGhpcy5wYXJhbXMgfHwge307XG5cdFx0dGhpcy5zZXRQYXJhbXMocGFyYW1zKTtcblxuXHRcdHRoaXMuaXNQYWdpbmF0ZWQgPSBpc1BhZ2luYXRlZCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBpc1BhZ2luYXRlZDtcblx0XHRpZiAodGhpcy5pc1BhZ2luYXRlZCkge1xuXHRcdFx0dGhpcy5jb2xsZWN0aW9uUGF0aCA9IGNvbGxlY3Rpb25QYXRoO1xuXHRcdFx0dGhpcy5sYXN0UmV0dXJuZWRQYWdlID0gW107XG5cdFx0XHR0aGlzLmNvbGxlY3Rpb24gPSBbXTtcblx0XHRcdHRoaXMuYXBpUGFnZVNpemUgPSBhcGlQYWdlU2l6ZSB8fCAxMjtcblx0XHRcdHRoaXMuY3VycmVudEFwaVBhZ2UgPSAxO1xuXHRcdFx0dGhpcy5sYXN0UGFnZSA9IHVuZGVmaW5lZDtcblx0XHRcdHRoaXMuc2V0UGFyYW1zKHtcblx0XHRcdFx0cGFnZU51bTogdGhpcy5jdXJyZW50QXBpUGFnZSxcblx0XHRcdFx0cGFnZVNpemU6IHRoaXMuYXBpUGFnZVNpemVcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxyXG4gICogR2V0IHRoZSBtb2RlbCBkYXRhIGZyb20gdGhlIFJFU1QgQVBJIFtOT04tcGFnaW5hdGVkIFJFU1QgQVBJIG9ubHldXHJcbiAgKiBAZGVzY3JpcHRpb24gRmV0Y2ggdGhlIGRhdGEgZnJvbSB0aGUgUkVTVCBBUEkgYW5kIHN0b3JlIGFzIHRoaXMuJG1vZGVsXHJcbiAgKi9cblxuXHRfY3JlYXRlQ2xhc3MoTW9kZWwsIFt7XG5cdFx0a2V5OiAnZ2V0TW9kZWwnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBnZXRNb2RlbCgpIHtcblx0XHRcdHZhciBfdGhpcyA9IHRoaXM7XG5cblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuXHRcdFx0XHRfdGhpcy5mZXRjaERhdGEoX3RoaXMudXJsKS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG5cdFx0XHRcdFx0X3RoaXMuJG1vZGVsID0gZGF0YTtcblx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgICogR2V0IHRoZSBuZXh0IEFQSSBwYWdlIGZyb20gdGhlIFJFU1QgQVBJIFtwYWdpbmF0ZWQgUkVTVCBBUEkgb25seV1cclxuICAgKiBAZGVzY3JpcHRpb24gRmV0Y2ggdGhlIG5leHQgQVBJIHBhZ2UgZnJvbSB0aGUgc2VydmVyLCBiYXNlZCBvbiB0aGUgbGFzdCBwYWdlIGZldGNoZWQuIFN0b3JlIHRoZSByZXR1cm5lZCBkYXRhXHJcbiAgICogYXMgdGhpcy4kbW9kZWw7IGFkZCB0aGUgcmV0dXJuZWQgcGFnaW5hdGVkIGRhdGEgYXMgdG8gdGhlIGVuZCBvZiB0aGlzLmNvbGxlY3Rpb25cclxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBQcm9taXNlIG9iamVjdFxyXG4gICAqL1xuXHR9LCB7XG5cdFx0a2V5OiAnZ2V0TmV4dFBhZ2UnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBnZXROZXh0UGFnZShyZXNldCkge1xuXHRcdFx0dmFyIF90aGlzMiA9IHRoaXM7XG5cblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuXHRcdFx0XHRfdGhpczIucGFyYW1zLnBhZ2VOdW0gPSBfdGhpczIuY3VycmVudEFwaVBhZ2UrKztcblx0XHRcdFx0X3RoaXMyLmdldE1vZGVsKCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0aWYgKF90aGlzMi4kbW9kZWxbX3RoaXMyLmNvbGxlY3Rpb25QYXRoXS5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRcdF90aGlzMi5sYXN0UGFnZSA9IF90aGlzMi5jdXJyZW50QXBpUGFnZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHJlc2V0KSB7XG5cdFx0XHRcdFx0XHRfdGhpczIuY29sbGVjdGlvbiA9IFtdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRfdGhpczIubGFzdFJldHVybmVkUGFnZSA9IF90aGlzMi4kbW9kZWxbX3RoaXMyLmNvbGxlY3Rpb25QYXRoXTtcblx0XHRcdFx0XHRfdGhpczIuY29sbGVjdGlvbiA9IF90aGlzMi5jb2xsZWN0aW9uLmNvbmNhdChfdGhpczIubGFzdFJldHVybmVkUGFnZSk7XG5cdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gICAqIEFkZCBzdXBwbGllZCBwYXJhbWV0ZXJzIHRvIHRoZSBtb2RlbCBVUkxcclxuICAgKiBAZGVzY3JpcHRpb24gQ29udmVydCBoYXNoIG9mIHBhcmFtZXRlcnMgdG8gcXVlcnkgc3RyaW5nIGFuZCBhcHBlbmQgdG8gbW9kZWwgdXJsXHJcbiAgICovXG5cdH0sIHtcblx0XHRrZXk6ICdzZXRQYXJhbXMnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBzZXRQYXJhbXMob2JqKSB7XG5cdFx0XHR0aGlzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24odGhpcy5wYXJhbXMsIG9iaik7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgICogRmV0Y2ggZGF0YSBmcm9tIHRoZSBzZXJ2ZXJcclxuICAgKiBAZGVzY3JpcHRpb24gTWFrZSBhIGdldCByZXF1ZXN0IGZvciB0aGUgUkVTVCBBUEkgZGF0YVxyXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFByb21pc2Ugb2JqZWN0XHJcbiAgICovXG5cdH0sIHtcblx0XHRrZXk6ICdmZXRjaERhdGEnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBmZXRjaERhdGEodXJsKSB7XG5cdFx0XHR2YXIgcXMgPSAoMCwgX3V0aWxzUXVlcnlTdHJpbmcucXVlcnlTdHJpbmdTdHJpbmdpZnkpKHRoaXMucGFyYW1zKTtcblx0XHRcdC8vVE9ETzogcmVtb3ZlICYgaWYgbm8gcXNcblx0XHRcdHVybCArPSAnP2Zvcm1hdD1qc29uJicgKyBxcztcblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdFx0XHRcdHhocih7XG5cdFx0XHRcdFx0dXJpOiB1cmwsXG5cdFx0XHRcdFx0dXNlWERSOiB0cnVlXG5cdFx0XHRcdH0sIGZ1bmN0aW9uIChlcnJvciwgcmVzcG9uc2UsIGJvZHkpIHtcblx0XHRcdFx0XHRpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gMjAwICYmIGJvZHkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShKU09OLnBhcnNlKGJvZHkpKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cGFyZW50LnBvc3RNZXNzYWdlKCdlcnJvcj13aWRnZXRmZXRjaGRhdGFmYWlsZWQnLCBkb2N1bWVudC5yZWZlcnJlcik7XG5cblx0XHRcdFx0XHRcdGlmIChlcnJvcikge1xuXHRcdFx0XHRcdFx0XHRyZWplY3QoRXJyb3IoZXJyb3IpKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvKipcclxuICAgKiBSZWZyZXNoIHRoZSBsb2NhbCBtb2RlbCBhbmQgY29sbGVjdGlvblxyXG4gICAqIEBkZXNjcmlwdGlvbiBSZS1mZXRjaCBhbmQgb3ZlcndyaXRlIHRoZSBsb2NhbCBtb2RlbCBhbmQgY29sbGVjdGlvbiB3aXRoIFtsYXRlc3RdIHNlcnZlciBkYXRhXHJcbiAgICogQHJldHVybnMge09iamVjdH0gUHJvbWlzZSBvYmplY3RcclxuICAgKi9cblx0fSwge1xuXHRcdGtleTogJ3JlZnJlc2gnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiByZWZyZXNoKCkge1xuXHRcdFx0dmFyIF90aGlzMyA9IHRoaXM7XG5cblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuXHRcdFx0XHRpZiAoX3RoaXMzLmlzUGFnaW5hdGVkKSB7XG5cdFx0XHRcdFx0X3RoaXMzLmNvbGxlY3Rpb24gPSBbXTtcblx0XHRcdFx0XHRfdGhpczMuY3VycmVudEFwaVBhZ2UgPSAxO1xuXHRcdFx0XHRcdF90aGlzMy5nZXROZXh0UGFnZSh0cnVlKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRfdGhpczMuZ2V0TW9kZWwoKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XSk7XG5cblx0cmV0dXJuIE1vZGVsO1xufSkoKTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gTW9kZWw7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklrTTZMM1JsYlhBdlIwY3VSbkp2Ym5SRmJtUXVWMmxrWjJWMGN5OTNhV1JuWlhSekwyTm9ZWEpwZEhrdFpYWmxiblJ6TFdKdllYSmtMMkp2ZDJWeVgyTnZiWEJ2Ym1WdWRITXZhblZ6ZEdkcGRtbHVaeTEzYVdSblpYUXRabkpoYldWM2IzSnJMMk52YlhCdmJtVnVkSE12YkdsaUwycHpMMlp5WVcxbGQyOXlheTlOYjJSbGJDNXFjeUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lRVUZCUVN4WlFVRlpMRU5CUVVNN096czdPenM3T3pzN1owTkJTWGRDTEhOQ1FVRnpRanM3T3pzN096czdPenM3UVVGR00wUXNTVUZCU1N4UFFVRlBMRWRCUVVjc1QwRkJUeXhEUVVGRExHRkJRV0VzUTBGQlF5eERRVUZETEU5QlFVOHNRMEZCUXp0QlFVTTNReXhKUVVGSkxFZEJRVWNzUjBGQlJ5eFBRVUZQTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN08wbEJXVzVDTEV0QlFVczdRVUZEUlN4VlFVUlFMRXRCUVVzc1IwRkROa1U3YlVWQlFVd3NSVUZCUlRzN1RVRkJjRVVzVFVGQlRTeFJRVUZPTEUxQlFVMDdUVUZCUlN4SFFVRkhMRkZCUVVnc1IwRkJSenROUVVGRkxFMUJRVTBzVVVGQlRpeE5RVUZOTzAxQlFVVXNWMEZCVnl4UlFVRllMRmRCUVZjN1RVRkJSU3hYUVVGWExGRkJRVmdzVjBGQlZ6dE5RVUZGTEdOQlFXTXNVVUZCWkN4alFVRmpPenQzUWtGRWVFVXNTMEZCU3pzN1FVRkZWQ3hOUVVGSkxFTkJRVU1zVFVGQlRTeEhRVUZITEUxQlFVMHNRMEZCUXp0QlFVTnlRaXhOUVVGSkxFTkJRVU1zUjBGQlJ5eEhRVUZITEVkQlFVY3NRMEZCUXp0QlFVTm1MRTFCUVVzc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRWRCUVVjc1JVRkJSenRCUVVOb1F5eFZRVUZQTzBkQlExQTdRVUZEUkN4TlFVRkpMRU5CUVVNc1RVRkJUU3hIUVVGSExFVkJRVVVzUTBGQlF6dEJRVU5xUWl4TlFVRkpMRU5CUVVNc1RVRkJUU3hIUVVGSExFbEJRVWtzUTBGQlF5eE5RVUZOTEVsQlFVa3NSVUZCUlN4RFFVRkRPMEZCUTJoRExFMUJRVWtzUTBGQlF5eFRRVUZUTEVOQlFVVXNUVUZCVFN4RFFVRkZMRU5CUVVNN08wRkJSWHBDTEUxQlFVa3NRMEZCUXl4WFFVRlhMRWRCUVVjc1YwRkJWeXhMUVVGTExGTkJRVk1zUjBGQlJ5eExRVUZMTEVkQlFVY3NWMEZCVnl4RFFVRkRPMEZCUTI1RkxFMUJRVXNzU1VGQlNTeERRVUZETEZkQlFWY3NSVUZCUnp0QlFVTjJRaXhQUVVGSkxFTkJRVU1zWTBGQll5eEhRVUZITEdOQlFXTXNRMEZCUXp0QlFVTnlReXhQUVVGSkxFTkJRVU1zWjBKQlFXZENMRWRCUVVjc1JVRkJSU3hEUVVGRE8wRkJRek5DTEU5QlFVa3NRMEZCUXl4VlFVRlZMRWRCUVVjc1JVRkJSU3hEUVVGRE8wRkJRM0pDTEU5QlFVa3NRMEZCUXl4WFFVRlhMRWRCUVVjc1YwRkJWeXhKUVVGSkxFVkJRVVVzUTBGQlF6dEJRVU55UXl4UFFVRkpMRU5CUVVNc1kwRkJZeXhIUVVGSExFTkJRVU1zUTBGQlF6dEJRVU40UWl4UFFVRkpMRU5CUVVNc1VVRkJVU3hIUVVGSExGTkJRVk1zUTBGQlF6dEJRVU14UWl4UFFVRkpMRU5CUVVNc1UwRkJVeXhEUVVGRE8wRkJRMlFzVjBGQlR5eEZRVUZGTEVsQlFVa3NRMEZCUXl4alFVRmpPMEZCUXpWQ0xGbEJRVkVzUlVGQlJTeEpRVUZKTEVOQlFVTXNWMEZCVnp0SlFVTXhRaXhEUVVGRExFTkJRVU03UjBGRFNEdEZRVU5FT3pzN096czdPMk5CZUVKSkxFdEJRVXM3TzFOQk5rSkVMRzlDUVVGSE96czdRVUZEV0N4VlFVRlBMRWxCUVVrc1QwRkJUeXhEUVVGRkxGVkJRVVVzVDBGQlR5eEZRVUZOTzBGQlEyeERMRlZCUVVzc1UwRkJVeXhEUVVGRkxFMUJRVXNzUjBGQlJ5eERRVUZGTEVOQlFVTXNTVUZCU1N4RFFVRkZMRlZCUVVVc1NVRkJTU3hGUVVGTk8wRkJRelZETEZkQlFVc3NUVUZCVFN4SFFVRkhMRWxCUVVrc1EwRkJRenRCUVVOdVFpeFpRVUZQTEVWQlFVVXNRMEZCUXp0TFFVTldMRU5CUVVNc1EwRkJRenRKUVVOSUxFTkJRVU1zUTBGQlF6dEhRVU5JT3pzN096czdPenM3TzFOQlQxY3NjVUpCUVVVc1MwRkJTeXhGUVVGSE96czdRVUZEY2tJc1ZVRkJUeXhKUVVGSkxFOUJRVThzUTBGQlJTeFZRVUZGTEU5QlFVOHNSVUZCVFR0QlFVTnNReXhYUVVGTExFMUJRVTBzUTBGQlF5eFBRVUZQTEVkQlFVY3NUMEZCU3l4alFVRmpMRVZCUVVVc1EwRkJRenRCUVVNMVF5eFhRVUZMTEZGQlFWRXNSVUZCUlN4RFFVRkRMRWxCUVVrc1EwRkJSU3haUVVGTk8wRkJRek5DTEZOQlFVc3NUMEZCU3l4TlFVRk5MRU5CUVVNc1QwRkJTeXhqUVVGakxFTkJRVU1zUTBGQlF5eE5RVUZOTEV0QlFVc3NRMEZCUXl4RlFVRkhPMEZCUTNCRUxHRkJRVXNzVVVGQlVTeEhRVUZITEU5QlFVc3NZMEZCWXl4RFFVRkRPMDFCUTNCRE8wRkJRMFFzVTBGQlN5eExRVUZMTEVWQlFVYzdRVUZEV2l4aFFVRkxMRlZCUVZVc1IwRkJSeXhGUVVGRkxFTkJRVU03VFVGRGNrSTdRVUZEUkN4WlFVRkxMR2RDUVVGblFpeEhRVUZITEU5QlFVc3NUVUZCVFN4RFFVRkRMRTlCUVVzc1kwRkJZeXhEUVVGRExFTkJRVU03UVVGRGVrUXNXVUZCU3l4VlFVRlZMRWRCUVVjc1QwRkJTeXhWUVVGVkxFTkJRVU1zVFVGQlRTeERRVUZGTEU5QlFVc3NaMEpCUVdkQ0xFTkJRVVVzUTBGQlF6dEJRVU5zUlN4WlFVRlBMRVZCUVVVc1EwRkJRenRMUVVOV0xFTkJRVU1zUTBGQlF6dEpRVU5JTEVOQlFVTXNRMEZCUXp0SFFVTklPenM3T3pzN096dFRRVXRUTEcxQ1FVRkZMRWRCUVVjc1JVRkJSenRCUVVOcVFpeFBRVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkhMRTFCUVUwc1EwRkJReXhOUVVGTkxFTkJRVVVzU1VGQlNTeERRVUZETEUxQlFVMHNSVUZCUlN4SFFVRkhMRU5CUVVVc1EwRkJRenRIUVVOb1JEczdPenM3T3pzN08xTkJUVk1zYlVKQlFVVXNSMEZCUnl4RlFVRkhPMEZCUTJwQ0xFOUJRVWtzUlVGQlJTeEhRVUZITERSRFFVRnpRaXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZGTEVOQlFVTTdPMEZCUlRkRExFMUJRVWNzYzBKQlFXOUNMRVZCUVVVc1FVRkJSU3hEUVVGRE8wRkJRelZDTEZWQlFVOHNTVUZCU1N4UFFVRlBMRU5CUVVNc1ZVRkJWU3hQUVVGUExFVkJRVVVzVFVGQlRTeEZRVUZITzBGQlF6bERMRTlCUVVjc1EwRkJRenRCUVVOSUxGRkJRVWNzUlVGQlJTeEhRVUZITzBGQlExSXNWMEZCVFN4RlFVRkZMRWxCUVVrN1MwRkRXaXhGUVVGRkxGVkJRVmNzUzBGQlN5eEZRVUZGTEZGQlFWRXNSVUZCUlN4SlFVRkpMRVZCUVVjN1FVRkRja01zVTBGQlN5eFJRVUZSTEVOQlFVTXNWVUZCVlN4TFFVRkxMRWRCUVVjc1NVRkJTU3hKUVVGSkxFdEJRVXNzVTBGQlV5eEZRVUZITzBGQlEzaEVMR0ZCUVU4c1EwRkJSU3hKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkZMRU5CUVVNN1RVRkROVUlzVFVGQlRUdEJRVU5PTEZsQlFVMHNRMEZCUXl4WFFVRlhMRU5CUVVNc05rSkJRVFpDTEVWQlFVVXNVVUZCVVN4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRE96dEJRVVZ5UlN4VlFVRkhMRXRCUVVzc1JVRkJSVHRCUVVOVUxHRkJRVTBzUTBGQlJTeExRVUZMTEVOQlFVVXNTMEZCU3l4RFFVRkZMRU5CUVVVc1EwRkJRenRQUVVONlFpeE5RVUZOTzBGQlEwNHNZVUZCVFN4RlFVRkZMRU5CUVVNN1QwRkRWRHROUVVORU8wdEJRMFFzUTBGQlF5eERRVUZETzBsQlEwZ3NRMEZCUXl4RFFVRkRPMGRCUTBnN096czdPenM3T3p0VFFVMVBMRzFDUVVGSE96czdRVUZEVml4VlFVRlBMRWxCUVVrc1QwRkJUeXhEUVVGRkxGVkJRVVVzVDBGQlR5eEZRVUZOTzBGQlEyeERMRkZCUVVzc1QwRkJTeXhYUVVGWExFVkJRVWM3UVVGRGRrSXNXVUZCU3l4VlFVRlZMRWRCUVVjc1JVRkJSU3hEUVVGRE8wRkJRM0pDTEZsQlFVc3NZMEZCWXl4SFFVRkhMRU5CUVVNc1EwRkJRenRCUVVONFFpeFpRVUZMTEZkQlFWY3NRMEZCUlN4SlFVRkpMRU5CUVVVc1EwRkJReXhKUVVGSkxFTkJRVVVzV1VGQlRUdEJRVU53UXl4aFFVRlBMRVZCUVVVc1EwRkJRenROUVVOV0xFTkJRVU1zUTBGQlF6dExRVU5JTEUxQlFVMDdRVUZEVGl4WlFVRkxMRkZCUVZFc1JVRkJSU3hEUVVGRExFbEJRVWtzUTBGQlJTeFpRVUZOTzBGQlF6TkNMR0ZCUVU4c1JVRkJSU3hEUVVGRE8wMUJRMVlzUTBGQlF5eERRVUZETzB0QlEwZzdTVUZEUkN4RFFVRkRMRU5CUVVNN1IwRkRTRHM3TzFGQmFraEpMRXRCUVVzN096dHhRa0Z2U0Vrc1MwRkJTeUlzSW1acGJHVWlPaUpET2k5MFpXMXdMMGRITGtaeWIyNTBSVzVrTGxkcFpHZGxkSE12ZDJsa1oyVjBjeTlqYUdGeWFYUjVMV1YyWlc1MGN5MWliMkZ5WkM5aWIzZGxjbDlqYjIxd2IyNWxiblJ6TDJwMWMzUm5hWFpwYm1jdGQybGtaMlYwTFdaeVlXMWxkMjl5YXk5amIyMXdiMjVsYm5SekwyeHBZaTlxY3k5bWNtRnRaWGR2Y21zdlRXOWtaV3d1YW5NaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SW5kWE5sSUhOMGNtbGpkQ2M3WEhKY2JseHlYRzVzWlhRZ1VISnZiV2x6WlNBOUlISmxjWFZwY21Vb0oyVnpOaTF3Y205dGFYTmxKeWt1VUhKdmJXbHpaVHRjY2x4dWJHVjBJSGhvY2lBOUlISmxjWFZwY21Vb0ozaG9jaWNwTzF4eVhHNXBiWEJ2Y25RZ2V5QnhkV1Z5ZVZOMGNtbHVaMU4wY21sdVoybG1lU0I5SUdaeWIyMGdKeTR1TDNWMGFXeHpMM0YxWlhKNVUzUnlhVzVuSnp0Y2NseHVYSEpjYmk4cUtseHlYRzRnS2lCRGNtVmhkR1VnWVNCM2FXUm5aWFFnYlc5a1pXeGNjbHh1SUNvZ1FHTnNZWE56WkdWell5QkRjbVZoZEdVZ1lTQnRiMlJsYkNCdlltcGxZM1FnWEhKY2JpQXFJRUJ3WVhKaGJTQjdUMkpxWldOMGZTQnZjSFJwYjI1ekxuZHBaR2RsZEM0Z1ZHaGxJSGRwWkdkbGRDQnBibk4wWVc1alpTQmJjbVZ4ZFdseVpXUmRYSEpjYmlBcUlFQndZWEpoYlNCN1FtOXZiR1ZoYm4wZ2IzQjBhVzl1Y3k1cGMxQmhaMmx1WVhSbFpDNGdWMmhsZEdobGNpQjBhR1VnYlc5a1pXd2dZMjl1YzNWdFpYTWdZU0J3WVdkcGJtRjBaV1FnVWtWVFZDQkJVRWxjY2x4dUlDb2dRR05zWVhOeklGTjBiM0psY3lCMGFHVWdjbVYwZFhKdVpXUWdiVzlrWld3Z1pHRjBZU0JoY3lCMGFHbHpMaVJ0YjJSbGJDNGdVM1J2Y21WeklHMXZaR1ZzSUZWU1RDQndZWEpoYldWMFpYSnpJR0Z6SUhSb2FYTXVjR0Z5WVcxekxpQkdiM0lnY0dGbmFXNWhkR1ZrSUcxdlpHVnNjMXh5WEc0Z0tpQnpkRzl5WlhNZ2RHaGxJR052Ykd4bFkzUnBiMjRnWVhNZ2RHaHBjeTVqYjJ4c1pXTjBhVzl1TENCemRHOXlaWE1nZEdobElHeGhjM1FnWm1WMFkyaGxaQ0JCVUVrZ2NHRm5aU0JoY3lCMGFHbHpMbXhoYzNSU1pYUjFjbTVsWkZCaFoyVTdJSE5sZEhNZ1lYQnBVR0ZuWlNCemFYcGxJSFJ2SUdSbFptRjFiSFFnTVRKY2NseHVJQ29nYzJWMGN5QndZV2RsVG5WdElHRnVaQ0J3WVdkbFUybDZaU0J3WVhKaGJYTWdiMjRnZEdobElHMXZaR1ZzSUVGUVNTQmJhVzVwZEdsaGJHbHpaWE1nZEc4Z2NHRm5aU0F4WFZ4eVhHNGdLaTljY2x4dVkyeGhjM01nVFc5a1pXd2dlMXh5WEc1Y2RHTnZibk4wY25WamRHOXlJQ2dnZXlCM2FXUm5aWFFzSUhWeWJDd2djR0Z5WVcxekxDQnBjMUJoWjJsdVlYUmxaQ3dnWVhCcFVHRm5aVk5wZW1Vc0lHTnZiR3hsWTNScGIyNVFZWFJvSUgwZ1BTQjdmU0FwSUh0Y2NseHVYSFJjZEhSb2FYTXVkMmxrWjJWMElEMGdkMmxrWjJWME8xeHlYRzVjZEZ4MGRHaHBjeTUxY213Z1BTQjFjbXc3WEhKY2JseDBYSFJwWmlBb0lDRjBhR2x6TG5kcFpHZGxkQ0I4ZkNBaGRHaHBjeTUxY213Z0tTQjdYSEpjYmx4MFhIUmNkSEpsZEhWeWJqdGNjbHh1WEhSY2RIMWNjbHh1WEhSY2RIUm9hWE11SkcxdlpHVnNJRDBnZTMwN1hISmNibHgwWEhSMGFHbHpMbkJoY21GdGN5QTlJSFJvYVhNdWNHRnlZVzF6SUh4OElIdDlPMXh5WEc1Y2RGeDBkR2hwY3k1elpYUlFZWEpoYlhNb0lIQmhjbUZ0Y3lBcE8xeHlYRzVjY2x4dVhIUmNkSFJvYVhNdWFYTlFZV2RwYm1GMFpXUWdQU0JwYzFCaFoybHVZWFJsWkNBOVBUMGdkVzVrWldacGJtVmtJRDhnWm1Gc2MyVWdPaUJwYzFCaFoybHVZWFJsWkR0Y2NseHVYSFJjZEdsbUlDZ2dkR2hwY3k1cGMxQmhaMmx1WVhSbFpDQXBJSHRjY2x4dVhIUmNkRngwZEdocGN5NWpiMnhzWldOMGFXOXVVR0YwYUNBOUlHTnZiR3hsWTNScGIyNVFZWFJvTzF4eVhHNWNkRngwWEhSMGFHbHpMbXhoYzNSU1pYUjFjbTVsWkZCaFoyVWdQU0JiWFR0Y2NseHVYSFJjZEZ4MGRHaHBjeTVqYjJ4c1pXTjBhVzl1SUQwZ1cxMDdYSEpjYmx4MFhIUmNkSFJvYVhNdVlYQnBVR0ZuWlZOcGVtVWdQU0JoY0dsUVlXZGxVMmw2WlNCOGZDQXhNanRjY2x4dVhIUmNkRngwZEdocGN5NWpkWEp5Wlc1MFFYQnBVR0ZuWlNBOUlERTdYSEpjYmx4MFhIUmNkSFJvYVhNdWJHRnpkRkJoWjJVZ1BTQjFibVJsWm1sdVpXUTdYSEpjYmx4MFhIUmNkSFJvYVhNdWMyVjBVR0Z5WVcxektIdGNjbHh1WEhSY2RGeDBYSFJ3WVdkbFRuVnRPaUIwYUdsekxtTjFjbkpsYm5SQmNHbFFZV2RsTEZ4eVhHNWNkRngwWEhSY2RIQmhaMlZUYVhwbE9pQjBhR2x6TG1Gd2FWQmhaMlZUYVhwbElGeHlYRzVjZEZ4MFhIUjlLVHRjY2x4dVhIUmNkSDFjY2x4dVhIUjlYSEpjYmx4MEx5b3FYSEpjYmx4MElDb2dSMlYwSUhSb1pTQnRiMlJsYkNCa1lYUmhJR1p5YjIwZ2RHaGxJRkpGVTFRZ1FWQkpJRnRPVDA0dGNHRm5hVzVoZEdWa0lGSkZVMVFnUVZCSklHOXViSGxkWEhKY2JseDBJQ29nUUdSbGMyTnlhWEIwYVc5dUlFWmxkR05vSUhSb1pTQmtZWFJoSUdaeWIyMGdkR2hsSUZKRlUxUWdRVkJKSUdGdVpDQnpkRzl5WlNCaGN5QjBhR2x6TGlSdGIyUmxiRnh5WEc1Y2RDQXFMMXh5WEc1Y2RHZGxkRTF2WkdWc0lDZ3BJSHRjY2x4dVhIUmNkSEpsZEhWeWJpQnVaWGNnVUhKdmJXbHpaU2dnS0NCeVpYTnZiSFpsSUNrZ1BUNGdlMXh5WEc1Y2RGeDBYSFIwYUdsekxtWmxkR05vUkdGMFlTZ2dkR2hwY3k1MWNtd2dLUzUwYUdWdUtDQW9JR1JoZEdFZ0tTQTlQaUI3WEhKY2JseDBYSFJjZEZ4MGRHaHBjeTRrYlc5a1pXd2dQU0JrWVhSaE8xeHlYRzVjZEZ4MFhIUmNkSEpsYzI5c2RtVW9LVHRjY2x4dVhIUmNkRngwZlNrN1hISmNibHgwWEhSOUtUdGNjbHh1WEhSOVhISmNibHgwTHlvcVhISmNibHgwSUNvZ1IyVjBJSFJvWlNCdVpYaDBJRUZRU1NCd1lXZGxJR1p5YjIwZ2RHaGxJRkpGVTFRZ1FWQkpJRnR3WVdkcGJtRjBaV1FnVWtWVFZDQkJVRWtnYjI1c2VWMWNjbHh1WEhRZ0tpQkFaR1Z6WTNKcGNIUnBiMjRnUm1WMFkyZ2dkR2hsSUc1bGVIUWdRVkJKSUhCaFoyVWdabkp2YlNCMGFHVWdjMlZ5ZG1WeUxDQmlZWE5sWkNCdmJpQjBhR1VnYkdGemRDQndZV2RsSUdabGRHTm9aV1F1SUZOMGIzSmxJSFJvWlNCeVpYUjFjbTVsWkNCa1lYUmhYSEpjYmx4MElDb2dZWE1nZEdocGN5NGtiVzlrWld3N0lHRmtaQ0IwYUdVZ2NtVjBkWEp1WldRZ2NHRm5hVzVoZEdWa0lHUmhkR0VnWVhNZ2RHOGdkR2hsSUdWdVpDQnZaaUIwYUdsekxtTnZiR3hsWTNScGIyNWNjbHh1WEhRZ0tpQkFjbVYwZFhKdWN5QjdUMkpxWldOMGZTQlFjbTl0YVhObElHOWlhbVZqZEZ4eVhHNWNkQ0FxTDF4eVhHNWNkR2RsZEU1bGVIUlFZV2RsSUNnZ2NtVnpaWFFnS1NCN1hISmNibHgwWEhSeVpYUjFjbTRnYm1WM0lGQnliMjFwYzJVb0lDZ2djbVZ6YjJ4MlpTQXBJRDArSUh0Y2NseHVYSFJjZEZ4MGRHaHBjeTV3WVhKaGJYTXVjR0ZuWlU1MWJTQTlJSFJvYVhNdVkzVnljbVZ1ZEVGd2FWQmhaMlVyS3p0Y2NseHVYSFJjZEZ4MGRHaHBjeTVuWlhSTmIyUmxiQ2dwTG5Sb1pXNG9JQ2dwSUQwK0lIdGNjbHh1WEhSY2RGeDBYSFJwWmlBb0lIUm9hWE11SkcxdlpHVnNXM1JvYVhNdVkyOXNiR1ZqZEdsdmJsQmhkR2hkTG14bGJtZDBhQ0E5UFQwZ01DQXBJSHRjY2x4dVhIUmNkRngwWEhSY2RIUm9hWE11YkdGemRGQmhaMlVnUFNCMGFHbHpMbU4xY25KbGJuUkJjR2xRWVdkbE8xeHlYRzVjZEZ4MFhIUmNkSDFjY2x4dVhIUmNkRngwWEhScFppQW9JSEpsYzJWMElDa2dlMXh5WEc1Y2RGeDBYSFJjZEZ4MGRHaHBjeTVqYjJ4c1pXTjBhVzl1SUQwZ1cxMDdYSEpjYmx4MFhIUmNkRngwZlZ4eVhHNWNkRngwWEhSY2RIUm9hWE11YkdGemRGSmxkSFZ5Ym1Wa1VHRm5aU0E5SUhSb2FYTXVKRzF2WkdWc1czUm9hWE11WTI5c2JHVmpkR2x2YmxCaGRHaGRPMXh5WEc1Y2RGeDBYSFJjZEhSb2FYTXVZMjlzYkdWamRHbHZiaUE5SUhSb2FYTXVZMjlzYkdWamRHbHZiaTVqYjI1allYUW9JSFJvYVhNdWJHRnpkRkpsZEhWeWJtVmtVR0ZuWlNBcE8xeHlYRzVjZEZ4MFhIUmNkSEpsYzI5c2RtVW9LVHRjY2x4dVhIUmNkRngwZlNrN1hISmNibHgwWEhSOUtUdGNkRnh5WEc1Y2RIMWNjbHh1WEhRdktpcGNjbHh1WEhRZ0tpQkJaR1FnYzNWd2NHeHBaV1FnY0dGeVlXMWxkR1Z5Y3lCMGJ5QjBhR1VnYlc5a1pXd2dWVkpNWEhKY2JseDBJQ29nUUdSbGMyTnlhWEIwYVc5dUlFTnZiblpsY25RZ2FHRnphQ0J2WmlCd1lYSmhiV1YwWlhKeklIUnZJSEYxWlhKNUlITjBjbWx1WnlCaGJtUWdZWEJ3Wlc1a0lIUnZJRzF2WkdWc0lIVnliRnh5WEc1Y2RDQXFMMXh5WEc1Y2RITmxkRkJoY21GdGN5QW9JRzlpYWlBcElIdGNjbHh1WEhSY2RIUm9hWE11Y0dGeVlXMXpJRDBnVDJKcVpXTjBMbUZ6YzJsbmJpZ2dkR2hwY3k1d1lYSmhiWE1zSUc5aWFpQXBPMXh5WEc1Y2RIMWNjbHh1WEhRdktpcGNjbHh1WEhRZ0tpQkdaWFJqYUNCa1lYUmhJR1p5YjIwZ2RHaGxJSE5sY25abGNseHlYRzVjZENBcUlFQmtaWE5qY21sd2RHbHZiaUJOWVd0bElHRWdaMlYwSUhKbGNYVmxjM1FnWm05eUlIUm9aU0JTUlZOVUlFRlFTU0JrWVhSaFhISmNibHgwSUNvZ1FISmxkSFZ5Ym5NZ2UwOWlhbVZqZEgwZ1VISnZiV2x6WlNCdlltcGxZM1JjY2x4dVhIUWdLaTljY2x4dVhIUm1aWFJqYUVSaGRHRWdLQ0IxY213Z0tTQjdYSEpjYmx4MFhIUnNaWFFnY1hNZ1BTQnhkV1Z5ZVZOMGNtbHVaMU4wY21sdVoybG1lU2dnZEdocGN5NXdZWEpoYlhNZ0tUdGNjbHh1WEhSY2RDOHZWRTlFVHpvZ2NtVnRiM1psSUNZZ2FXWWdibThnY1hOY2NseHVYSFJjZEhWeWJDQXJQU0JnUDJadmNtMWhkRDFxYzI5dUppUjdjWE45WUR0Y2NseHVYSFJjZEhKbGRIVnliaUJ1WlhjZ1VISnZiV2x6WlNobWRXNWpkR2x2YmlnZ2NtVnpiMngyWlN3Z2NtVnFaV04wSUNrZ2UxeHlYRzVjZEZ4MFhIUjRhSElvZTF4eVhHNWNkRngwWEhSY2RIVnlhVG9nZFhKc0xGeHlYRzVjZEZ4MFhIUmNkSFZ6WlZoRVVqb2dkSEoxWlN4Y2NseHVYSFJjZEZ4MGZTd2dablZ1WTNScGIyNGdLQ0JsY25KdmNpd2djbVZ6Y0c5dWMyVXNJR0p2WkhrZ0tTQjdYSEpjYmx4MFhIUmNkRngwYVdZZ0tDQnlaWE53YjI1elpTNXpkR0YwZFhORGIyUmxJRDA5UFNBeU1EQWdKaVlnWW05a2VTQWhQVDBnZFc1a1pXWnBibVZrSUNrZ2UxeHlYRzVjZEZ4MFhIUmNkRngwY21WemIyeDJaU2dnU2xOUFRpNXdZWEp6WlNoaWIyUjVLU0FwTzF4eVhHNWNkRngwWEhSY2RIMGdaV3h6WlNCN1hISmNibHgwWEhSY2RGeDBYSFJ3WVhKbGJuUXVjRzl6ZEUxbGMzTmhaMlVvSjJWeWNtOXlQWGRwWkdkbGRHWmxkR05vWkdGMFlXWmhhV3hsWkNjc0lHUnZZM1Z0Wlc1MExuSmxabVZ5Y21WeUtUdGNjbHh1WEhKY2JseDBYSFJjZEZ4MFhIUnBaaWhsY25KdmNpa2dlMXh5WEc1Y2RGeDBYSFJjZEZ4MFhIUnlaV3BsWTNRb0lFVnljbTl5S0NCbGNuSnZjaUFwSUNrN1hISmNibHgwWEhSY2RGeDBYSFI5SUdWc2MyVWdlMXh5WEc1Y2RGeDBYSFJjZEZ4MFhIUnlaV3BsWTNRb0tUdGNjbHh1WEhSY2RGeDBYSFJjZEgxY2NseHVYSFJjZEZ4MFhIUjlYSEpjYmx4MFhIUmNkSDBwTzF4eVhHNWNkRngwZlNrN1hISmNibHgwZlZ4eVhHNWNkQzhxS2x4eVhHNWNkQ0FxSUZKbFpuSmxjMmdnZEdobElHeHZZMkZzSUcxdlpHVnNJR0Z1WkNCamIyeHNaV04wYVc5dVhISmNibHgwSUNvZ1FHUmxjMk55YVhCMGFXOXVJRkpsTFdabGRHTm9JR0Z1WkNCdmRtVnlkM0pwZEdVZ2RHaGxJR3h2WTJGc0lHMXZaR1ZzSUdGdVpDQmpiMnhzWldOMGFXOXVJSGRwZEdnZ1cyeGhkR1Z6ZEYwZ2MyVnlkbVZ5SUdSaGRHRmNjbHh1WEhRZ0tpQkFjbVYwZFhKdWN5QjdUMkpxWldOMGZTQlFjbTl0YVhObElHOWlhbVZqZEZ4eVhHNWNkQ0FxTDF4eVhHNWNkSEpsWm5KbGMyZ2dLQ2tnZTF4eVhHNWNkRngwY21WMGRYSnVJRzVsZHlCUWNtOXRhWE5sS0NBb0lISmxjMjlzZG1VZ0tTQTlQaUI3SUZ4eVhHNWNkRngwWEhScFppQW9JSFJvYVhNdWFYTlFZV2RwYm1GMFpXUWdLU0I3WEhKY2JseDBYSFJjZEZ4MGRHaHBjeTVqYjJ4c1pXTjBhVzl1SUQwZ1cxMDdYSEpjYmx4MFhIUmNkRngwZEdocGN5NWpkWEp5Wlc1MFFYQnBVR0ZuWlNBOUlERTdYSEpjYmx4MFhIUmNkRngwZEdocGN5NW5aWFJPWlhoMFVHRm5aU2dnZEhKMVpTQXBMblJvWlc0b0lDZ3BJRDArSUh0Y2NseHVYSFJjZEZ4MFhIUmNkSEpsYzI5c2RtVW9LVHRjY2x4dVhIUmNkRngwWEhSOUtUdGNjbHh1WEhSY2RGeDBmU0JsYkhObElIdGNjbHh1WEhSY2RGeDBYSFIwYUdsekxtZGxkRTF2WkdWc0tDa3VkR2hsYmlnZ0tDa2dQVDRnZTF4eVhHNWNkRngwWEhSY2RGeDBjbVZ6YjJ4MlpTZ3BPMXh5WEc1Y2RGeDBYSFJjZEgwcE8xeHlYRzVjZEZ4MFhIUjlYSEpjYmx4MFhIUjlLVHRjY2x4dVhIUjlYSEpjYm4xY2NseHVYSEpjYm1WNGNHOXlkQ0JrWldaaGRXeDBJRTF2WkdWc095SmRmUT09IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG5cdHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOyB9IH1cblxudmFyIF9IYW5kbGViYXJzSGFuZGxlYmFycyA9IHJlcXVpcmUoJy4uLy4uL0hhbmRsZWJhcnMvaGFuZGxlYmFycycpO1xuXG52YXIgX0hhbmRsZWJhcnNIYW5kbGViYXJzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0hhbmRsZWJhcnNIYW5kbGViYXJzKTtcblxuLyoqXHJcbiAqIENyZWF0ZSBhIHdpZGdldCB2aWV3XHJcbiAqIEBjbGFzc2Rlc2MgQ3JlYXRlIGEgdmlldyBvYmplY3QgXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLndpZGdldC4gVGhlIHdpZGdldCBpbnN0YW5jZSBbcmVxdWlyZWRdXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLnBvbGxJbnRlcnZhbC4gSW50ZXJ2YWwgaW4gbWlsbHNlY29uZHMgdG8gYXV0by1yZWZyZXNoIHRoZSB2aWV3J3MgZGF0YVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5wb2xsVHJpZ2dlci4gQ1NTIHNlbGVjdG9yIGZvciBlbGVtZW50IHRvIGNsaWNrLXRyaWdnZXIgYSByZWZyZXNoIG9mIHRoZSB2aWV3J3MgZGF0YVxyXG4gKiBAY2xhc3MgU2V0IHZpZXcgaW5zdGFuY2UgcHJvcGVydGllcyBhbmQgaW5pdGlhbGlzZSB2aWV3XHJcbiAqL1xuXG52YXIgVmlldyA9IChmdW5jdGlvbiAoKSB7XG5cdGZ1bmN0aW9uIFZpZXcoKSB7XG5cdFx0dmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1swXTtcblxuXHRcdHZhciB3aWRnZXQgPSBfcmVmLndpZGdldDtcblx0XHR2YXIgZWwgPSBfcmVmLmVsO1xuXHRcdHZhciB0ZW1wbGF0ZSA9IF9yZWYudGVtcGxhdGU7XG5cdFx0dmFyIG1vZGVsID0gX3JlZi5tb2RlbDtcblx0XHR2YXIgcG9sbEludGVydmFsID0gX3JlZi5wb2xsSW50ZXJ2YWw7XG5cdFx0dmFyIHBvbGxUcmlnZ2VyID0gX3JlZi5wb2xsVHJpZ2dlcjtcblxuXHRcdF9jbGFzc0NhbGxDaGVjayh0aGlzLCBWaWV3KTtcblxuXHRcdHRoaXMud2lkZ2V0ID0gd2lkZ2V0O1xuXHRcdHRoaXMuZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsKTtcblx0XHR0aGlzLnRlbXBsYXRlID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0ZW1wbGF0ZSkuaW5uZXJIVE1MO1xuXHRcdHRoaXMubW9kZWwgPSBtb2RlbDtcblx0XHRpZiAoIXRoaXMud2lkZ2V0IHx8ICF0aGlzLmVsIHx8ICF0aGlzLnRlbXBsYXRlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuY29uZmlnID0gdGhpcy53aWRnZXQuY29uZmlnO1xuXHRcdHRoaXMucG9sbEludGVydmFsID0gcG9sbEludGVydmFsO1xuXHRcdHRoaXMucG9sbFRyaWdnZXIgPSBwb2xsVHJpZ2dlciA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocG9sbFRyaWdnZXIpIDogdW5kZWZpbmVkO1xuXG5cdFx0dGhpcy5pbml0KCk7XG5cdH1cblxuXHQvKipcclxuIFx0KiBJbml0aWFsaXNlIHZpZXdcclxuIFx0KiBAZGVzY3JpcHRpb24gU3RhcnQgdmlldyBtb2RlbCB1cGRhdGUgcG9sbGVyOyByZWdpc3RlciB2aWV3IG1vZGVsIHVwZGF0ZSB0cmlnZ2VyXHJcbiBcdCovXG5cblx0X2NyZWF0ZUNsYXNzKFZpZXcsIFt7XG5cdFx0a2V5OiAnaW5pdCcsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGluaXQoKSB7XG5cdFx0XHRpZiAodGhpcy5wb2xsSW50ZXJ2YWwpIHtcblx0XHRcdFx0dGhpcy5wb2xsQXRJbnRlcnZhbCgpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMucG9sbFRyaWdnZXIpIHtcblx0XHRcdFx0dGhpcy5yZWdpc3RlclBvbGxUcmlnZ2VyKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgXHQqIFJlbmRlciB0aGUgdmlld1xyXG4gIFx0KiBAZGVzY3JpcHRpb24gUmVuZGVyIHRoZSB0ZW1wbGF0ZSB3aXRoIHN1cHBsaWVkIGRhdGEgYW5kIGFwcGVuZCB0byB2aWV3J3MgZWxlbWVudFxyXG4gIFx0Ki9cblx0fSwge1xuXHRcdGtleTogJ3JlbmRlcicsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcblx0XHRcdHZhciBkYXRhID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gdGhpcy5kYXRhIDogYXJndW1lbnRzWzBdO1xuXG5cdFx0XHR0aGlzLmRhdGEgPSBkYXRhO1xuXHRcdFx0dmFyIHRlbXBsYXRlID0gX0hhbmRsZWJhcnNIYW5kbGViYXJzMlsnZGVmYXVsdCddLmNvbXBpbGUodGhpcy50ZW1wbGF0ZSk7XG5cdFx0XHR0aGlzLmVsLmlubmVySFRNTCA9IHRlbXBsYXRlKGRhdGEpO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gIFx0KiBQcmUtbG9hZCBpbWFnZXMgYW5kIHJlc2V0IHRoZSB3aWRnZXQgaGVpZ2h0XHJcbiAgXHQqIEBkZXNjcmlwdGlvbiBXaGVuIHNvbWUgaW1hZ2VzIGxvYWQsIHRoZSBoZWlnaHQgb2YgdGhlIHdpZGdldCBtYXkgY2hhbmdlIGFuZCBhIHdpZGdldC5yZXNldEhlaWdodCgpIFxyXG4gIFx0KiBtYXkgbmVlZCB0byBiZSBmaXJlZC4gVXNlIHRoaXMgZnVuY3Rpb24gdG8gbWFuYWdlIHRoZSBsb2FkaW5nIG9mIHRoZXNlIGltYWdlcyB0aGF0IGdlbmVyYXRlIGEgd2lkZ2V0IFxyXG4gIFx0KiBkaW1lbnNpb24gY2hhbmdlIHRvIGVuc3VyZSB0aGUgd2lkZ2V0IGhlaWdodCBpcyBhZGFwdGVkIG9uY2UgdGhlIGltYWdlIGhhcyBsb2FkZWRcclxuICBcdCogQHBhcmFtIHtTdHJpbmd9IFBhdGggdG8gdGhlIGltYWdlIHRvIGxvYWRcclxuICBcdCogQHBhcmFtIHtTdHJpbmd9IFVuaXF1ZSBjc3MzIHNlbGVjdG9yIHRhcmdldHRpbmcgdGhlIDxpbWcgLz4gZWxlbWVudCB0byBsb2FkIHRoZSBwYXRoIGludG9cclxuICBcdCovXG5cdH0sIHtcblx0XHRrZXk6ICdsb2FkSW1hZ2UnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBsb2FkSW1hZ2UocGF0aCwgZWwpIHtcblx0XHRcdHZhciBfdGhpcyA9IHRoaXM7XG5cblx0XHRcdHZhciBpbWcgPSBuZXcgSW1hZ2UoKTtcblx0XHRcdGltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsKS5zcmMgPSBwYXRoO1xuXHRcdFx0XHRfdGhpcy53aWRnZXQucmVzZXRIZWlnaHQoKTtcblx0XHRcdH0pO1xuXHRcdFx0aW1nLnNyYyA9IHBhdGg7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgXHQqIFJlZnJlc2ggdmlldyB3aXRoIGxhdGVzdCBzZXJ2ZXIgZGF0YVxyXG4gIFx0KiBAZGVzY3JpcHRpb24gU2V0IGNvbnRyb2wgJ2xvYWRpbmcnIENTUyBzdGF0ZSBvbiBwb2xsIHRyaWdnZXI7IHRyaWdnZXIgYSBtb2RlbCByZWZyZXNoOyB0aGVuIHJlLXJlbmRlciB0aHIgdmlldywgXHJcbiAgXHQqIHJlc2V0IHBvbGwgdHJpZ2dlciBDU1Mgc3RhdGUsIHJlc2V0IHdpZGdldCBoZWlnaHQsIHJlc2V0IHRoZSB2aWV3J3MgY2Fyb3VzZWwsIGluaXRpYWxpc2UgYW5hbHl0aWNzIG9uIG5ldyBjYXJkcyxcclxuICBcdCogZmlyZSBuZXcgYW5hbHl0aWNzIGNhcmQgaW1wcmVzc2lvbnNcclxuICBcdCovXG5cdH0sIHtcblx0XHRrZXk6ICdyZWZyZXNoJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gcmVmcmVzaCgpIHtcblx0XHRcdHZhciBfdGhpczIgPSB0aGlzO1xuXG5cdFx0XHR0aGlzLnBvbGxUcmlnZ2VyICYmIHRoaXMucG9sbFRyaWdnZXIuY2xhc3NMaXN0LmFkZCgnaXMtbG9hZGluZycsICdpcy1kaXNhYmxlZCcpO1xuXHRcdFx0dGhpcy5tb2RlbC5yZWZyZXNoKCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdF90aGlzMi5yZW5kZXIoKTtcblx0XHRcdFx0X3RoaXMyLnBvbGxUcmlnZ2VyICYmIF90aGlzMi5wb2xsVHJpZ2dlci5jbGFzc0xpc3QucmVtb3ZlKCdpcy1sb2FkaW5nJywgJ2lzLWRpc2FibGVkJyk7XG5cdFx0XHRcdF90aGlzMi53aWRnZXQucmVzZXRIZWlnaHQoKTtcblx0XHRcdFx0X3RoaXMyLmNhcm91c2VsICYmIF90aGlzMi5jYXJvdXNlbC5yZXNldCgpO1xuXHRcdFx0XHRfdGhpczIud2lkZ2V0LmFuYWx5dGljcy5jYXJkc0luaXQoKTtcblx0XHRcdFx0X3RoaXMyLndpZGdldC5hbmFseXRpY3MuY2FyZEltcHJlc3Npb25zKCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvKipcclxuICBcdCogUmVmcmVzaCB2aWV3IHdpdGggbGF0ZXN0IHNlcnZlciBkYXRhIGF0IHNwZWNpZmllZCBpbnRlcnZhbFxyXG4gIFx0Ki9cblx0fSwge1xuXHRcdGtleTogJ3BvbGxBdEludGVydmFsJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gcG9sbEF0SW50ZXJ2YWwoKSB7XG5cdFx0XHR2YXIgX3RoaXMzID0gdGhpcztcblxuXHRcdFx0d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0X3RoaXMzLnJlZnJlc2goKTtcblx0XHRcdH0sIHRoaXMucG9sbEludGVydmFsKTtcblx0XHR9XG5cblx0XHQvKipcclxuICBcdCogUmVnaXN0ZXIgYSBjbGljayBsaXN0ZW5lciBvbiBzcGVjaWZpZWQgRE9NIGVsZW1lbnQgdG8gcmVmcmVzaCB2aWV3IHdpdGggbGF0ZXN0IHNlcnZlciBkYXRhXHJcbiAgXHQqL1xuXHR9LCB7XG5cdFx0a2V5OiAncmVnaXN0ZXJQb2xsVHJpZ2dlcicsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIHJlZ2lzdGVyUG9sbFRyaWdnZXIoKSB7XG5cdFx0XHR2YXIgX3RoaXM0ID0gdGhpcztcblxuXHRcdFx0dGhpcy5wb2xsVHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0X3RoaXM0LnJlZnJlc2goKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gIFx0KiBBcHBlbmQgdGhlIG5leHQgc2V0IG9mIGNhcmRzIHRvIHRoZSB2aWV3IFtmb3IgcGFnaW5hdGVkIG1vZGVscyBvbmx5XVxyXG4gIFx0KiBAZGVzY3JpcHRpb24gR2V0IHRoZSB2aWV3J3MgbW9kZWwncyBuZXh0IEFQSSBwYWdlLCByZW5kZXIgdGhlIHZpZXcgdGVtcGxhdGUgd2l0aCBuZXcgZGF0YSBhbmQgYXBwZW5kIG5vZGVzIHRvIHZpZXcgZWxlbWVudFxyXG4gIFx0Ki9cblx0fSwge1xuXHRcdGtleTogJ2FwcGVuZE5leHRQYWdlJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gYXBwZW5kTmV4dFBhZ2UoKSB7XG5cdFx0XHR2YXIgX3RoaXM1ID0gdGhpcztcblxuXHRcdFx0aWYgKCF0aGlzLm1vZGVsLmlzUGFnaW5hdGVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuXHRcdFx0XHRfdGhpczUubW9kZWwuZ2V0TmV4dFBhZ2UoKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHR2YXIgdGVtcGxhdGUgPSBfSGFuZGxlYmFyc0hhbmRsZWJhcnMyWydkZWZhdWx0J10uY29tcGlsZShfdGhpczUudGVtcGxhdGUpO1xuXHRcdFx0XHRcdHZhciBmcmFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0XHRcdFx0dmFyIGRvY0ZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cdFx0XHRcdFx0ZnJhZy5pbm5lckhUTUwgPSB0ZW1wbGF0ZSh7XG5cdFx0XHRcdFx0XHRldmVudHM6IF90aGlzNS5tb2RlbC5sYXN0UmV0dXJuZWRQYWdlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0W10uc2xpY2UuY2FsbChmcmFnLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uIChlbCkge1xuXHRcdFx0XHRcdFx0ZG9jRnJhZy5hcHBlbmRDaGlsZChlbCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0X3RoaXM1LmVsLmFwcGVuZENoaWxkKGRvY0ZyYWcpO1xuXHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1dKTtcblxuXHRyZXR1cm4gVmlldztcbn0pKCk7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IFZpZXc7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklrTTZMM1JsYlhBdlIwY3VSbkp2Ym5SRmJtUXVWMmxrWjJWMGN5OTNhV1JuWlhSekwyTm9ZWEpwZEhrdFpYWmxiblJ6TFdKdllYSmtMMkp2ZDJWeVgyTnZiWEJ2Ym1WdWRITXZhblZ6ZEdkcGRtbHVaeTEzYVdSblpYUXRabkpoYldWM2IzSnJMMk52YlhCdmJtVnVkSE12YkdsaUwycHpMMlp5WVcxbGQyOXlheTlXYVdWM0xtcHpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSkJRVUZCTEZsQlFWa3NRMEZCUXpzN096czdPenM3T3pzN08yOURRVVZWTERaQ1FVRTJRanM3T3pzN096czdPenM3T3p0SlFWVTVReXhKUVVGSk8wRkJRMGNzVlVGRVVDeEpRVUZKTEVkQlEzVkZPMjFGUVVGTUxFVkJRVVU3TzAxQlFUZEVMRTFCUVUwc1VVRkJUaXhOUVVGTk8wMUJRVVVzUlVGQlJTeFJRVUZHTEVWQlFVVTdUVUZCUlN4UlFVRlJMRkZCUVZJc1VVRkJVVHROUVVGRkxFdEJRVXNzVVVGQlRDeExRVUZMTzAxQlFVVXNXVUZCV1N4UlFVRmFMRmxCUVZrN1RVRkJSU3hYUVVGWExGRkJRVmdzVjBGQlZ6czdkMEpCUkdwRkxFbEJRVWs3TzBGQlJWSXNUVUZCU1N4RFFVRkRMRTFCUVUwc1IwRkJSeXhOUVVGTkxFTkJRVU03UVVGRGNrSXNUVUZCU1N4RFFVRkRMRVZCUVVVc1IwRkJSeXhSUVVGUkxFTkJRVU1zWVVGQllTeERRVUZGTEVWQlFVVXNRMEZCUlN4RFFVRkRPMEZCUTNaRExFMUJRVWtzUTBGQlF5eFJRVUZSTEVkQlFVY3NVVUZCVVN4RFFVRkRMR0ZCUVdFc1EwRkJSU3hSUVVGUkxFTkJRVVVzUTBGQlF5eFRRVUZUTEVOQlFVTTdRVUZETjBRc1RVRkJTU3hEUVVGRExFdEJRVXNzUjBGQlJ5eExRVUZMTEVOQlFVTTdRVUZEYmtJc1RVRkJTeXhEUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1JVRkJSU3hKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNSVUZCUnp0QlFVTnFSQ3hWUVVGUE8wZEJRMUE3UVVGRFJDeE5RVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkhMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVFVGQlRTeERRVUZETzBGQlEycERMRTFCUVVrc1EwRkJReXhaUVVGWkxFZEJRVWNzV1VGQldTeERRVUZETzBGQlEycERMRTFCUVVrc1EwRkJReXhYUVVGWExFZEJRVWNzVjBGQlZ5eEhRVUZITEZGQlFWRXNRMEZCUXl4aFFVRmhMRU5CUVVVc1YwRkJWeXhEUVVGRkxFZEJRVWNzVTBGQlV5eERRVUZET3p0QlFVVnVSaXhOUVVGSkxFTkJRVU1zU1VGQlNTeEZRVUZGTEVOQlFVTTdSVUZEV2pzN096czdPenRqUVdSSkxFbEJRVWs3TzFOQmJVSklMR2RDUVVGSE8wRkJRMUlzVDBGQlN5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RlFVRkhPMEZCUTNoQ0xGRkJRVWtzUTBGQlF5eGpRVUZqTEVWQlFVVXNRMEZCUXp0SlFVTjBRanRCUVVORUxFOUJRVXNzU1VGQlNTeERRVUZETEZkQlFWY3NSVUZCUnp0QlFVTjJRaXhSUVVGSkxFTkJRVU1zYlVKQlFXMUNMRVZCUVVVc1EwRkJRenRKUVVNelFqdEhRVU5FT3pzN096czdPenRUUVV0TkxHdENRVUZ0UWp0UFFVRnFRaXhKUVVGSkxIbEVRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpPenRCUVVOMFFpeFBRVUZKTEVOQlFVTXNTVUZCU1N4SFFVRkhMRWxCUVVrc1EwRkJRenRCUVVOcVFpeFBRVUZKTEZGQlFWRXNSMEZCUnl4clEwRkJWeXhQUVVGUExFTkJRVVVzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUlN4RFFVRkRPMEZCUTI1RUxFOUJRVWtzUTBGQlF5eEZRVUZGTEVOQlFVTXNVMEZCVXl4SFFVRkhMRkZCUVZFc1EwRkJSU3hKUVVGSkxFTkJRVVVzUTBGQlF6dEhRVU55UXpzN096czdPenM3T3pzN08xTkJVMU1zYlVKQlFVVXNTVUZCU1N4RlFVRkZMRVZCUVVVc1JVRkJSenM3TzBGQlEzUkNMRTlCUVVrc1IwRkJSeXhIUVVGSExFbEJRVWtzUzBGQlN5eEZRVUZGTEVOQlFVTTdRVUZEZEVJc1RVRkJSeXhEUVVGRExHZENRVUZuUWl4RFFVRkRMRTFCUVUwc1JVRkJSU3haUVVGUE8wRkJRMjVETEZsQlFWRXNRMEZCUXl4aFFVRmhMRU5CUVVVc1JVRkJSU3hEUVVGRkxFTkJRVU1zUjBGQlJ5eEhRVUZITEVsQlFVa3NRMEZCUXp0QlFVTjRReXhWUVVGTExFMUJRVTBzUTBGQlF5eFhRVUZYTEVWQlFVVXNRMEZCUXp0SlFVTXhRaXhEUVVGRExFTkJRVU03UVVGRFNDeE5RVUZITEVOQlFVTXNSMEZCUnl4SFFVRkhMRWxCUVVrc1EwRkJRenRIUVVObU96czdPenM3T3pzN08xTkJUMDhzYlVKQlFVYzdPenRCUVVOV0xFOUJRVWtzUTBGQlF5eFhRVUZYTEVsQlFVa3NTVUZCU1N4RFFVRkRMRmRCUVZjc1EwRkJReXhUUVVGVExFTkJRVU1zUjBGQlJ5eERRVUZETEZsQlFWa3NSVUZCUlN4aFFVRmhMRU5CUVVNc1EwRkJRenRCUVVOb1JpeFBRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRTlCUVU4c1JVRkJSU3hEUVVGRExFbEJRVWtzUTBGQlJTeFpRVUZOTzBGQlEyaERMRmRCUVVzc1RVRkJUU3hGUVVGRkxFTkJRVU03UVVGRFpDeFhRVUZMTEZkQlFWY3NTVUZCU1N4UFFVRkxMRmRCUVZjc1EwRkJReXhUUVVGVExFTkJRVU1zVFVGQlRTeERRVUZETEZsQlFWa3NSVUZCUlN4aFFVRmhMRU5CUVVNc1EwRkJRenRCUVVOdVJpeFhRVUZMTEUxQlFVMHNRMEZCUXl4WFFVRlhMRVZCUVVVc1EwRkJRenRCUVVNeFFpeFhRVUZMTEZGQlFWRXNTVUZCU1N4UFFVRkxMRkZCUVZFc1EwRkJReXhMUVVGTExFVkJRVVVzUTBGQlF6dEJRVU4yUXl4WFFVRkxMRTFCUVUwc1EwRkJReXhUUVVGVExFTkJRVU1zVTBGQlV5eEZRVUZGTEVOQlFVTTdRVUZEYkVNc1YwRkJTeXhOUVVGTkxFTkJRVU1zVTBGQlV5eERRVUZETEdWQlFXVXNSVUZCUlN4RFFVRkRPMGxCUTNoRExFTkJRVU1zUTBGQlF6dEhRVU5JT3pzN096czdPMU5CU1dNc01FSkJRVWM3T3p0QlFVTnFRaXhUUVVGTkxFTkJRVU1zVjBGQlZ5eERRVUZGTEZsQlFVMDdRVUZEZWtJc1YwRkJTeXhQUVVGUExFVkJRVVVzUTBGQlF6dEpRVU5tTEVWQlFVVXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJSU3hEUVVGRE8wZEJRM1pDT3pzN096czdPMU5CU1cxQ0xDdENRVUZIT3pzN1FVRkRkRUlzVDBGQlNTeERRVUZETEZkQlFWY3NRMEZCUXl4blFrRkJaMElzUTBGQlF5eFBRVUZQTEVWQlFVVXNXVUZCVFR0QlFVTm9SQ3hYUVVGTExFOUJRVThzUlVGQlJTeERRVUZETzBsQlEyWXNRMEZCUXl4RFFVRkRPMGRCUTBnN096czdPenM3TzFOQlMyTXNNRUpCUVVjN096dEJRVU5xUWl4UFFVRkxMRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eFhRVUZYTEVWQlFVYzdRVUZET1VJc1YwRkJUenRKUVVOUU8wRkJRMFFzVlVGQlR5eEpRVUZKTEU5QlFVOHNRMEZCUXl4VlFVRkZMRTlCUVU4c1JVRkJUVHRCUVVOcVF5eFhRVUZMTEV0QlFVc3NRMEZCUXl4WFFVRlhMRVZCUVVVc1EwRkJReXhKUVVGSkxFTkJRVVVzV1VGQlRUdEJRVU53UXl4VFFVRkpMRkZCUVZFc1IwRkJSeXhyUTBGQlZ5eFBRVUZQTEVOQlFVVXNUMEZCU3l4UlFVRlJMRU5CUVVVc1EwRkJRenRCUVVOdVJDeFRRVUZKTEVsQlFVa3NSMEZCUnl4UlFVRlJMRU5CUVVNc1lVRkJZU3hEUVVGRkxFdEJRVXNzUTBGQlJTeERRVUZETzBGQlF6TkRMRk5CUVVrc1QwRkJUeXhIUVVGSExGRkJRVkVzUTBGQlF5eHpRa0ZCYzBJc1JVRkJSU3hEUVVGRE8wRkJRMmhFTEZOQlFVa3NRMEZCUXl4VFFVRlRMRWRCUVVjc1VVRkJVU3hEUVVGRE8wRkJRM3BDTEZsQlFVMHNSVUZCUlN4UFFVRkxMRXRCUVVzc1EwRkJReXhuUWtGQlowSTdUVUZEYmtNc1EwRkJReXhEUVVGRE8wRkJRMGdzVDBGQlJTeERRVUZETEV0QlFVc3NRMEZCUXl4SlFVRkpMRU5CUVVVc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlJTeERRVUZETEU5QlFVOHNRMEZCUXl4VlFVRkZMRVZCUVVVc1JVRkJUVHRCUVVOb1JDeGhRVUZQTEVOQlFVTXNWMEZCVnl4RFFVRkZMRVZCUVVVc1EwRkJSU3hEUVVGRE8wMUJRekZDTEVOQlFVTXNRMEZCUXp0QlFVTklMRmxCUVVzc1JVRkJSU3hEUVVGRExGZEJRVmNzUTBGQlJTeFBRVUZQTEVOQlFVVXNRMEZCUXp0QlFVTXZRaXhaUVVGUExFVkJRVVVzUTBGQlF6dExRVU5XTEVOQlFVTXNRMEZCUXp0SlFVTklMRU5CUVVNc1EwRkJRenRIUVVOSU96czdVVUUxUjBrc1NVRkJTVHM3TzNGQ1FTdEhTeXhKUVVGSklpd2labWxzWlNJNklrTTZMM1JsYlhBdlIwY3VSbkp2Ym5SRmJtUXVWMmxrWjJWMGN5OTNhV1JuWlhSekwyTm9ZWEpwZEhrdFpYWmxiblJ6TFdKdllYSmtMMkp2ZDJWeVgyTnZiWEJ2Ym1WdWRITXZhblZ6ZEdkcGRtbHVaeTEzYVdSblpYUXRabkpoYldWM2IzSnJMMk52YlhCdmJtVnVkSE12YkdsaUwycHpMMlp5WVcxbGQyOXlheTlXYVdWM0xtcHpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpSjNWelpTQnpkSEpwWTNRbk8xeHlYRzVjY2x4dWFXMXdiM0owSUVoaGJtUnNaV0poY25NZ1puSnZiU0FuTGk0dkxpNHZTR0Z1Wkd4bFltRnljeTlvWVc1a2JHVmlZWEp6Snp0Y2NseHVYSEpjYmk4cUtseHlYRzRnS2lCRGNtVmhkR1VnWVNCM2FXUm5aWFFnZG1sbGQxeHlYRzRnS2lCQVkyeGhjM05rWlhOaklFTnlaV0YwWlNCaElIWnBaWGNnYjJKcVpXTjBJRnh5WEc0Z0tpQkFjR0Z5WVcwZ2UwOWlhbVZqZEgwZ2IzQjBhVzl1Y3k1M2FXUm5aWFF1SUZSb1pTQjNhV1JuWlhRZ2FXNXpkR0Z1WTJVZ1czSmxjWFZwY21Wa1hWeHlYRzRnS2lCQWNHRnlZVzBnZTA1MWJXSmxjbjBnYjNCMGFXOXVjeTV3YjJ4c1NXNTBaWEoyWVd3dUlFbHVkR1Z5ZG1Gc0lHbHVJRzFwYkd4elpXTnZibVJ6SUhSdklHRjFkRzh0Y21WbWNtVnphQ0IwYUdVZ2RtbGxkeWR6SUdSaGRHRmNjbHh1SUNvZ1FIQmhjbUZ0SUh0VGRISnBibWQ5SUc5d2RHbHZibk11Y0c5c2JGUnlhV2RuWlhJdUlFTlRVeUJ6Wld4bFkzUnZjaUJtYjNJZ1pXeGxiV1Z1ZENCMGJ5QmpiR2xqYXkxMGNtbG5aMlZ5SUdFZ2NtVm1jbVZ6YUNCdlppQjBhR1VnZG1sbGR5ZHpJR1JoZEdGY2NseHVJQ29nUUdOc1lYTnpJRk5sZENCMmFXVjNJR2x1YzNSaGJtTmxJSEJ5YjNCbGNuUnBaWE1nWVc1a0lHbHVhWFJwWVd4cGMyVWdkbWxsZDF4eVhHNGdLaTljY2x4dVkyeGhjM01nVm1sbGR5QjdYSEpjYmx4MFkyOXVjM1J5ZFdOMGIzSWdLQ0I3SUhkcFpHZGxkQ3dnWld3c0lIUmxiWEJzWVhSbExDQnRiMlJsYkN3Z2NHOXNiRWx1ZEdWeWRtRnNMQ0J3YjJ4c1ZISnBaMmRsY2lCOUlEMGdlMzBnS1NCN1hISmNibHgwWEhSMGFHbHpMbmRwWkdkbGRDQTlJSGRwWkdkbGREdGNjbHh1WEhSY2RIUm9hWE11Wld3Z1BTQmtiMk4xYldWdWRDNXhkV1Z5ZVZObGJHVmpkRzl5S0NCbGJDQXBPMXh5WEc1Y2RGeDBkR2hwY3k1MFpXMXdiR0YwWlNBOUlHUnZZM1Z0Wlc1MExuRjFaWEo1VTJWc1pXTjBiM0lvSUhSbGJYQnNZWFJsSUNrdWFXNXVaWEpJVkUxTU8xeHlYRzVjZEZ4MGRHaHBjeTV0YjJSbGJDQTlJRzF2WkdWc08xeHlYRzVjZEZ4MGFXWWdLQ0FoZEdocGN5NTNhV1JuWlhRZ2ZId2dJWFJvYVhNdVpXd2dmSHdnSVhSb2FYTXVkR1Z0Y0d4aGRHVWdLU0I3WEhKY2JseDBYSFJjZEhKbGRIVnlianRjY2x4dVhIUmNkSDFjY2x4dVhIUmNkSFJvYVhNdVkyOXVabWxuSUQwZ2RHaHBjeTUzYVdSblpYUXVZMjl1Wm1sbk8xeHlYRzVjZEZ4MGRHaHBjeTV3YjJ4c1NXNTBaWEoyWVd3Z1BTQndiMnhzU1c1MFpYSjJZV3c3WEhKY2JseDBYSFIwYUdsekxuQnZiR3hVY21sbloyVnlJRDBnY0c5c2JGUnlhV2RuWlhJZ1B5QmtiMk4xYldWdWRDNXhkV1Z5ZVZObGJHVmpkRzl5S0NCd2IyeHNWSEpwWjJkbGNpQXBJRG9nZFc1a1pXWnBibVZrTzF4eVhHNWNkRngwWEhKY2JseDBYSFIwYUdsekxtbHVhWFFvS1R0Y2NseHVYSFI5WEhKY2JseDBMeW9xWEhKY2JpQmNkQ29nU1c1cGRHbGhiR2x6WlNCMmFXVjNYSEpjYmlCY2RDb2dRR1JsYzJOeWFYQjBhVzl1SUZOMFlYSjBJSFpwWlhjZ2JXOWtaV3dnZFhCa1lYUmxJSEJ2Ykd4bGNqc2djbVZuYVhOMFpYSWdkbWxsZHlCdGIyUmxiQ0IxY0dSaGRHVWdkSEpwWjJkbGNseHlYRzRnWEhRcUwxeHlYRzRnWEhScGJtbDBJQ2dwSUh0Y2NseHVYSFJjZEdsbUlDZ2dkR2hwY3k1d2IyeHNTVzUwWlhKMllXd2dLU0I3WEhKY2JseDBYSFJjZEhSb2FYTXVjRzlzYkVGMFNXNTBaWEoyWVd3b0tUdGNjbHh1WEhSY2RIMWNjbHh1WEhSY2RHbG1JQ2dnZEdocGN5NXdiMnhzVkhKcFoyZGxjaUFwSUh0Y2NseHVYSFJjZEZ4MGRHaHBjeTV5WldkcGMzUmxjbEJ2Ykd4VWNtbG5aMlZ5S0NrN1hISmNibHgwWEhSOVhISmNibHgwZlZ4eVhHNWNkQzhxS2x4eVhHNGdYSFFxSUZKbGJtUmxjaUIwYUdVZ2RtbGxkMXh5WEc0Z1hIUXFJRUJrWlhOamNtbHdkR2x2YmlCU1pXNWtaWElnZEdobElIUmxiWEJzWVhSbElIZHBkR2dnYzNWd2NHeHBaV1FnWkdGMFlTQmhibVFnWVhCd1pXNWtJSFJ2SUhacFpYY25jeUJsYkdWdFpXNTBYSEpjYmlCY2RDb3ZYSEpjYmx4MGNtVnVaR1Z5SUNnZ1pHRjBZVDEwYUdsekxtUmhkR0VnS1NCN1hISmNibHgwWEhSMGFHbHpMbVJoZEdFZ1BTQmtZWFJoTzF4eVhHNWNkRngwYkdWMElIUmxiWEJzWVhSbElEMGdTR0Z1Wkd4bFltRnljeTVqYjIxd2FXeGxLQ0IwYUdsekxuUmxiWEJzWVhSbElDazdYSEpjYmx4MFhIUjBhR2x6TG1Wc0xtbHVibVZ5U0ZSTlRDQTlJSFJsYlhCc1lYUmxLQ0JrWVhSaElDazdYSEpjYmx4MGZWeHlYRzVjZEM4cUtseHlYRzRnWEhRcUlGQnlaUzFzYjJGa0lHbHRZV2RsY3lCaGJtUWdjbVZ6WlhRZ2RHaGxJSGRwWkdkbGRDQm9aV2xuYUhSY2NseHVJRngwS2lCQVpHVnpZM0pwY0hScGIyNGdWMmhsYmlCemIyMWxJR2x0WVdkbGN5QnNiMkZrTENCMGFHVWdhR1ZwWjJoMElHOW1JSFJvWlNCM2FXUm5aWFFnYldGNUlHTm9ZVzVuWlNCaGJtUWdZU0IzYVdSblpYUXVjbVZ6WlhSSVpXbG5hSFFvS1NCY2NseHVJRngwS2lCdFlYa2dibVZsWkNCMGJ5QmlaU0JtYVhKbFpDNGdWWE5sSUhSb2FYTWdablZ1WTNScGIyNGdkRzhnYldGdVlXZGxJSFJvWlNCc2IyRmthVzVuSUc5bUlIUm9aWE5sSUdsdFlXZGxjeUIwYUdGMElHZGxibVZ5WVhSbElHRWdkMmxrWjJWMElGeHlYRzRnWEhRcUlHUnBiV1Z1YzJsdmJpQmphR0Z1WjJVZ2RHOGdaVzV6ZFhKbElIUm9aU0IzYVdSblpYUWdhR1ZwWjJoMElHbHpJR0ZrWVhCMFpXUWdiMjVqWlNCMGFHVWdhVzFoWjJVZ2FHRnpJR3h2WVdSbFpGeHlYRzRnWEhRcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCUVlYUm9JSFJ2SUhSb1pTQnBiV0ZuWlNCMGJ5QnNiMkZrWEhKY2JpQmNkQ29nUUhCaGNtRnRJSHRUZEhKcGJtZDlJRlZ1YVhGMVpTQmpjM016SUhObGJHVmpkRzl5SUhSaGNtZGxkSFJwYm1jZ2RHaGxJRHhwYldjZ0x6NGdaV3hsYldWdWRDQjBieUJzYjJGa0lIUm9aU0J3WVhSb0lHbHVkRzljY2x4dUlGeDBLaTljY2x4dVhIUnNiMkZrU1cxaFoyVWdLQ0J3WVhSb0xDQmxiQ0FwSUh0Y2NseHVYSFJjZEd4bGRDQnBiV2NnUFNCdVpYY2dTVzFoWjJVb0tUdGNjbHh1WEhSY2RHbHRaeTVoWkdSRmRtVnVkRXhwYzNSbGJtVnlLQ2RzYjJGa0p5d2dLQ2tnUFQ0Z0lIc2dYSEpjYmx4MFhIUmNkR1J2WTNWdFpXNTBMbkYxWlhKNVUyVnNaV04wYjNJb0lHVnNJQ2t1YzNKaklEMGdjR0YwYUR0Y2NseHVYSFJjZEZ4MGRHaHBjeTUzYVdSblpYUXVjbVZ6WlhSSVpXbG5hSFFvS1R0Y2NseHVYSFJjZEgwcE8xeHlYRzVjZEZ4MGFXMW5Mbk55WXlBOUlIQmhkR2c3WEhKY2JseDBmVnh5WEc1Y2RDOHFLbHh5WEc0Z1hIUXFJRkpsWm5KbGMyZ2dkbWxsZHlCM2FYUm9JR3hoZEdWemRDQnpaWEoyWlhJZ1pHRjBZVnh5WEc0Z1hIUXFJRUJrWlhOamNtbHdkR2x2YmlCVFpYUWdZMjl1ZEhKdmJDQW5iRzloWkdsdVp5Y2dRMU5USUhOMFlYUmxJRzl1SUhCdmJHd2dkSEpwWjJkbGNqc2dkSEpwWjJkbGNpQmhJRzF2WkdWc0lISmxabkpsYzJnN0lIUm9aVzRnY21VdGNtVnVaR1Z5SUhSb2NpQjJhV1YzTENCY2NseHVJRngwS2lCeVpYTmxkQ0J3YjJ4c0lIUnlhV2RuWlhJZ1ExTlRJSE4wWVhSbExDQnlaWE5sZENCM2FXUm5aWFFnYUdWcFoyaDBMQ0J5WlhObGRDQjBhR1VnZG1sbGR5ZHpJR05oY205MWMyVnNMQ0JwYm1sMGFXRnNhWE5sSUdGdVlXeDVkR2xqY3lCdmJpQnVaWGNnWTJGeVpITXNYSEpjYmlCY2RDb2dabWx5WlNCdVpYY2dZVzVoYkhsMGFXTnpJR05oY21RZ2FXMXdjbVZ6YzJsdmJuTmNjbHh1SUZ4MEtpOWNjbHh1WEhSeVpXWnlaWE5vSUNncElIdGNjbHh1WEhSY2RIUm9hWE11Y0c5c2JGUnlhV2RuWlhJZ0ppWWdkR2hwY3k1d2IyeHNWSEpwWjJkbGNpNWpiR0Z6YzB4cGMzUXVZV1JrS0NkcGN5MXNiMkZrYVc1bkp5d2dKMmx6TFdScGMyRmliR1ZrSnlrN0lGeHlYRzVjZEZ4MGRHaHBjeTV0YjJSbGJDNXlaV1p5WlhOb0tDa3VkR2hsYmlnZ0tDa2dQVDRnZTF4eVhHNWNkRngwWEhSMGFHbHpMbkpsYm1SbGNpZ3BPMXh5WEc1Y2RGeDBYSFIwYUdsekxuQnZiR3hVY21sbloyVnlJQ1ltSUhSb2FYTXVjRzlzYkZSeWFXZG5aWEl1WTJ4aGMzTk1hWE4wTG5KbGJXOTJaU2duYVhNdGJHOWhaR2x1Wnljc0lDZHBjeTFrYVhOaFlteGxaQ2NwTzF4eVhHNWNkRngwWEhSMGFHbHpMbmRwWkdkbGRDNXlaWE5sZEVobGFXZG9kQ2dwTzF4eVhHNWNkRngwWEhSMGFHbHpMbU5oY205MWMyVnNJQ1ltSUhSb2FYTXVZMkZ5YjNWelpXd3VjbVZ6WlhRb0tUdGNjbHh1WEhSY2RGeDBkR2hwY3k1M2FXUm5aWFF1WVc1aGJIbDBhV056TG1OaGNtUnpTVzVwZENncE8xeHlYRzVjZEZ4MFhIUjBhR2x6TG5kcFpHZGxkQzVoYm1Gc2VYUnBZM011WTJGeVpFbHRjSEpsYzNOcGIyNXpLQ2s3WEhSY2NseHVYSFJjZEgwcE8xeDBYSEpjYmx4MGZWeHlYRzVjZEM4cUtseHlYRzRnWEhRcUlGSmxabkpsYzJnZ2RtbGxkeUIzYVhSb0lHeGhkR1Z6ZENCelpYSjJaWElnWkdGMFlTQmhkQ0J6Y0dWamFXWnBaV1FnYVc1MFpYSjJZV3hjY2x4dUlGeDBLaTljY2x4dVhIUndiMnhzUVhSSmJuUmxjblpoYkNBb0tTQjdYSEpjYmx4MFhIUjNhVzVrYjNjdWMyVjBTVzUwWlhKMllXd29JQ2dwSUQwK0lIdGNjbHh1WEhSY2RGeDBkR2hwY3k1eVpXWnlaWE5vS0NrN1hISmNibHgwWEhSOUxDQjBhR2x6TG5CdmJHeEpiblJsY25aaGJDQXBPMXh5WEc1Y2RIMWNjbHh1WEhRdktpcGNjbHh1SUZ4MEtpQlNaV2RwYzNSbGNpQmhJR05zYVdOcklHeHBjM1JsYm1WeUlHOXVJSE53WldOcFptbGxaQ0JFVDAwZ1pXeGxiV1Z1ZENCMGJ5QnlaV1p5WlhOb0lIWnBaWGNnZDJsMGFDQnNZWFJsYzNRZ2MyVnlkbVZ5SUdSaGRHRmNjbHh1SUZ4MEtpOWNjbHh1WEhSeVpXZHBjM1JsY2xCdmJHeFVjbWxuWjJWeUlDZ3BJSHRjY2x4dVhIUmNkSFJvYVhNdWNHOXNiRlJ5YVdkblpYSXVZV1JrUlhabGJuUk1hWE4wWlc1bGNpZ25ZMnhwWTJzbkxDQW9LU0E5UGlCN1hISmNibHgwWEhSY2RIUm9hWE11Y21WbWNtVnphQ2dwTzF4eVhHNWNkRngwZlNrN1hISmNibHgwZlZ4eVhHNWNkQzhxS2x4eVhHNGdYSFFxSUVGd2NHVnVaQ0IwYUdVZ2JtVjRkQ0J6WlhRZ2IyWWdZMkZ5WkhNZ2RHOGdkR2hsSUhacFpYY2dXMlp2Y2lCd1lXZHBibUYwWldRZ2JXOWtaV3h6SUc5dWJIbGRYSEpjYmlCY2RDb2dRR1JsYzJOeWFYQjBhVzl1SUVkbGRDQjBhR1VnZG1sbGR5ZHpJRzF2WkdWc0ozTWdibVY0ZENCQlVFa2djR0ZuWlN3Z2NtVnVaR1Z5SUhSb1pTQjJhV1YzSUhSbGJYQnNZWFJsSUhkcGRHZ2dibVYzSUdSaGRHRWdZVzVrSUdGd2NHVnVaQ0J1YjJSbGN5QjBieUIyYVdWM0lHVnNaVzFsYm5SY2NseHVJRngwS2k5Y2NseHVYSFJoY0hCbGJtUk9aWGgwVUdGblpTQW9LU0I3WEhKY2JseDBYSFJwWmlBb0lDRjBhR2x6TG0xdlpHVnNMbWx6VUdGbmFXNWhkR1ZrSUNrZ2UxeHlYRzVjZEZ4MFhIUnlaWFIxY200N1hISmNibHgwWEhSOVhISmNibHgwWEhSeVpYUjFjbTRnYm1WM0lGQnliMjFwYzJVb0tDQnlaWE52YkhabElDa2dQVDRnZTF4eVhHNWNkRngwWEhSMGFHbHpMbTF2WkdWc0xtZGxkRTVsZUhSUVlXZGxLQ2t1ZEdobGJpZ2dLQ2tnUFQ0Z2UxeHlYRzVjZEZ4MFhIUmNkR3hsZENCMFpXMXdiR0YwWlNBOUlFaGhibVJzWldKaGNuTXVZMjl0Y0dsc1pTZ2dkR2hwY3k1MFpXMXdiR0YwWlNBcE8xeHlYRzVjZEZ4MFhIUmNkR3hsZENCbWNtRm5JRDBnWkc5amRXMWxiblF1WTNKbFlYUmxSV3hsYldWdWRDZ2dKMlJwZGljZ0tUdGNjbHh1WEhSY2RGeDBYSFJzWlhRZ1pHOWpSbkpoWnlBOUlHUnZZM1Z0Wlc1MExtTnlaV0YwWlVSdlkzVnRaVzUwUm5KaFoyMWxiblFvS1R0Y2NseHVYSFJjZEZ4MFhIUm1jbUZuTG1sdWJtVnlTRlJOVENBOUlIUmxiWEJzWVhSbEtIdGNjbHh1WEhSY2RGeDBYSFJjZEdWMlpXNTBjem9nZEdocGN5NXRiMlJsYkM1c1lYTjBVbVYwZFhKdVpXUlFZV2RsWEhKY2JseDBYSFJjZEZ4MGZTazdYSEpjYmx4MFhIUmNkRngwVzEwdWMyeHBZMlV1WTJGc2JDZ2dabkpoWnk1amFHbHNaSEpsYmlBcExtWnZja1ZoWTJnb0tDQmxiQ0FwSUQwK0lIdGNjbHh1WEhSY2RGeDBYSFJjZEdSdlkwWnlZV2N1WVhCd1pXNWtRMmhwYkdRb0lHVnNJQ2s3WEhKY2JseDBYSFJjZEZ4MGZTazdYSEpjYmx4MFhIUmNkRngwZEdocGN5NWxiQzVoY0hCbGJtUkRhR2xzWkNnZ1pHOWpSbkpoWnlBcE8xeHlYRzVjZEZ4MFhIUmNkSEpsYzI5c2RtVW9LVHRjY2x4dVhIUmNkRngwZlNrN1hISmNibHgwWEhSOUtUdGNjbHh1WEhSOVhISmNibjFjY2x4dVhISmNibVY0Y0c5eWRDQmtaV1poZFd4MElGWnBaWGM3SWwxOSIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuXHR2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsgfSB9XG5cbnZhciBfdXRpbHNRdWVyeVN0cmluZyA9IHJlcXVpcmUoJy4uL3V0aWxzL3F1ZXJ5U3RyaW5nJyk7XG5cbnZhciBfdXRpbHNEZWJvdW5jZSA9IHJlcXVpcmUoJy4uL3V0aWxzL2RlYm91bmNlJyk7XG5cbnZhciBfdXRpbHNEZWJvdW5jZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91dGlsc0RlYm91bmNlKTtcblxudmFyIF9BbmFseXRpY3MgPSByZXF1aXJlKCcuL0FuYWx5dGljcycpO1xuXG52YXIgX0FuYWx5dGljczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9BbmFseXRpY3MpO1xuXG4vKipcclxuICogQ3JlYXRlIGEgd2lkZ2V0XHJcbiAqIEBjbGFzc2Rlc2MgQ3JlYXRlIGEgd2lkZ2V0IG9iamVjdFxyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9wdGlvbnMud2lkZ2V0Q29udGFpbmVyLiBUaGUgd2lkZ2V0IGNvbnRhaW5lciBlbGVtZW50XHJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb3B0aW9ucy5yZXNwb25zaXZlLiBXaGV0aGVyIHRoZSB3aWRnZXQgaXMgcmVzcG9uc2l2ZVxyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9wdGlvbnMudXNlckNvbmZpZy4gV2hldGhlciB0aGUgd2lkZ2V0IGhhcyB1c2VyIGNvbmZpZ3VyYWJsZSBzZXR0aW5nc1xyXG4gKiBAY2xhc3MgU2V0IHdpZGdldCBpbnN0YW5jZSBwcm9wZXJ0aWVzIGFuZCBpbml0aWFsaXNlIHdpZGdldFxyXG4gKi9cblxudmFyIFdpZGdldCA9IChmdW5jdGlvbiAoKSB7XG5cdGZ1bmN0aW9uIFdpZGdldCgpIHtcblx0XHR2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzBdO1xuXG5cdFx0dmFyIHdpZGdldENvbnRhaW5lciA9IF9yZWYud2lkZ2V0Q29udGFpbmVyO1xuXHRcdHZhciByZXNwb25zaXZlID0gX3JlZi5yZXNwb25zaXZlO1xuXHRcdHZhciB1c2VyQ29uZmlnID0gX3JlZi51c2VyQ29uZmlnO1xuXHRcdHZhciB3aWRnZXROYW1lID0gX3JlZi53aWRnZXROYW1lO1xuXG5cdFx0X2NsYXNzQ2FsbENoZWNrKHRoaXMsIFdpZGdldCk7XG5cblx0XHR0aGlzLndpZGdldENvbnRhaW5lciA9IHdpZGdldENvbnRhaW5lciB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS13aWRnZXQtY29udGFpbmVyXScpO1xuXHRcdHRoaXMucmVzcG9uc2l2ZSA9IHJlc3BvbnNpdmUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiByZXNwb25zaXZlO1xuXHRcdHRoaXMudXNlckNvbmZpZyA9IHVzZXJDb25maWcgPT09IHVuZGVmaW5lZCA/IHRydWUgOiB1c2VyQ29uZmlnO1xuXHRcdHRoaXMud2lkZ2V0TmFtZSA9IHdpZGdldE5hbWUgfHwgJyc7XG5cdFx0dGhpcy5hcHBJZCA9ICc0MzdiY2E0Mic7XG5cdFx0aWYgKCF0aGlzLndpZGdldE5hbWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdH1cblxuXHQvKipcclxuIFx0KiBJbml0aWFsaXNlIHRoZSB3aWRnZXRcclxuIFx0KiBAZGVzY3JpcHRpb24gTWFrZSB0aGUgd2lkZ2V0IHJlc3BvbnNpdmU7IGZldGNoIGFuZCBjYWNoZSBvbiB0aGUgd2lkZ2V0IGluc3RhbmNlIHRoZSB1c2VyIGNvbmZpZyBoYXNoXHJcbiBcdCovXG5cblx0X2NyZWF0ZUNsYXNzKFdpZGdldCwgW3tcblx0XHRrZXk6ICdpbml0Jyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gaW5pdCgpIHtcblx0XHRcdHRoaXMucmVzcG9uc2l2ZSAmJiB0aGlzLm1ha2VSZXNwb25zaXZlKHRoaXMud2lkZ2V0Q29udGFpbmVyKTtcblx0XHRcdHRoaXMuY29uZmlnID0gdGhpcy51c2VyQ29uZmlnID8gdGhpcy5nZXRVc2VyQ29uZmlnKCkgOiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgXHQqIEluaXRpYWxpc2Ugd2lkZ2V0IGFuYWx5dGljc1xyXG4gIFx0KiBAZGVzY3JpcHRpb24gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEFuYWx5dGljcyBjbGFzcyBmb3IgY2FjaGluZyBvbiB0aGUgd2lkZ2V0IGluc3RhbmNlXHJcbiAgXHQqIEByZXR1cm5zIHtPYmplY3R9IEFuYWx5dGljcyBpbnN0YW5jZVxyXG4gIFx0Ki9cblx0fSwge1xuXHRcdGtleTogJ2luaXRBbmFseXRpY3MnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBpbml0QW5hbHl0aWNzKCkge1xuXHRcdFx0dmFyIGNhbGxiYWNrcyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IFtdIDogYXJndW1lbnRzWzBdO1xuXG5cdFx0XHRpZiAod2luZG93Ll9rbXEgJiYgd2luZG93Ll9rbXEucHVzaCkge1xuXHRcdFx0XHRjYWxsYmFja3MucHVzaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0dmFyIF93aW5kb3ckX2ttcTtcblxuXHRcdFx0XHRcdHJldHVybiAoX3dpbmRvdyRfa21xID0gd2luZG93Ll9rbXEpLnB1c2guYXBwbHkoX3dpbmRvdyRfa21xLCBhcmd1bWVudHMpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBuZXcgX0FuYWx5dGljczJbJ2RlZmF1bHQnXSh7XG5cdFx0XHRcdGNvbmZpZ0hhc2g6IHRoaXMuY29uZmlnLFxuXHRcdFx0XHR3aWRnZXQ6IHRoaXMsXG5cdFx0XHRcdGNhbGxiYWNrczogY2FsbGJhY2tzXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvKipcclxuICBcdCogQ3JlYXRlIGEgaGFzaCBtYXAgb2YgdXNlciBjb25maWcgZnJvbSB3aWRnZXQgcXVlcnkgc3RyaW5nXHJcbiAgXHQqIEByZXR1cm5zIHtPYmplY3R9IGhhc2ggbWFwIG9mIHVzZXIgY29uZmlnXHJcbiAgXHQqL1xuXHR9LCB7XG5cdFx0a2V5OiAnZ2V0VXNlckNvbmZpZycsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGdldFVzZXJDb25maWcoKSB7XG5cdFx0XHRyZXR1cm4gKDAsIF91dGlsc1F1ZXJ5U3RyaW5nLnF1ZXJ5U3RyaW5nUGFyc2UpKGxvY2F0aW9uLnNlYXJjaCk7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgXHQqIE1ha2Ugd2lkZ2V0IHJlc3BvbnNpdmUgdG8gaXRzIGN1cnJlbnQgY29udGVudCBvbiB3aW4gcmVzaXplXHJcbiAgXHQqIEBwYXJhbSB7RWxlbWVudH0gVGhlIHdpZGdldCBjb250YWluZXJcclxuICBcdCovXG5cdH0sIHtcblx0XHRrZXk6ICdtYWtlUmVzcG9uc2l2ZScsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIG1ha2VSZXNwb25zaXZlKHdpZGdldENvbnRhaW5lcikge1xuXHRcdFx0dmFyIF90aGlzID0gdGhpcztcblxuXHRcdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgwLCBfdXRpbHNEZWJvdW5jZTJbJ2RlZmF1bHQnXSkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gX3RoaXMucG9zdENvbnRlbnRIZWlnaHQod2lkZ2V0Q29udGFpbmVyKTtcblx0XHRcdH0sIDI1MCkpO1xuXHRcdH1cblxuXHRcdC8qKlxyXG4gIFx0KiBQb3N0IHRoZSBjdXJyZW50IHNjcm9sbCBoZWlnaHQgdmFsdWUgb2YgYW4gZWxlbWVudCB0byB0aGUgcGFyZW50IHdpbmRvd1xyXG4gIFx0KiBAcGFyYW0ge0VsZW1lbnR9IFRoZSBlbGVtbnQgd2hvc2UgaGVpZ2h0IHRvIHNlbmRcclxuICBcdCogQHBhcmFtIHtTdHJpbmd9IFVSTCBvZiBwYXJlbnQgdG8gcG9zdCBtZXNzYWdlIHRvOyBkZWZhdWx0cyB0byBkb2N1bWVudC5yZWZlcnJlclxyXG4gIFx0Ki9cblx0fSwge1xuXHRcdGtleTogJ3Bvc3RDb250ZW50SGVpZ2h0Jyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gcG9zdENvbnRlbnRIZWlnaHQoZWwpIHtcblx0XHRcdHZhciB1cmwgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyBkb2N1bWVudC5yZWZlcnJlciA6IGFyZ3VtZW50c1sxXTtcblxuXHRcdFx0Ly9Eb24ndCBwb3N0IHRvIHNlbGZcblx0XHRcdGlmICh3aW5kb3cgPT09IHdpbmRvdy50b3AgfHwgd2luZG93LmxvY2F0aW9uID09PSB3aW5kb3cudG9wLmxvY2F0aW9uKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHBhcmVudC5wb3N0TWVzc2FnZSgnd2lkZ2V0TmFtZT0nICsgdGhpcy53aWRnZXROYW1lICsgJyZjb250ZW50SGVpZ2h0PScgKyBNYXRoLm1heChlbC5zY3JvbGxIZWlnaHQsIGVsLm9mZnNldEhlaWdodCksIHVybCk7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgXHQqIFJlc2V0IHRoZSBoZWlnaHQgb2YgdGhlIHdpZGdldFxyXG4gIFx0Ki9cblx0fSwge1xuXHRcdGtleTogJ3Jlc2V0SGVpZ2h0Jyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gcmVzZXRIZWlnaHQoKSB7XG5cdFx0XHR0aGlzLnBvc3RDb250ZW50SGVpZ2h0KHRoaXMud2lkZ2V0Q29udGFpbmVyKTtcblx0XHR9XG5cdH1dKTtcblxuXHRyZXR1cm4gV2lkZ2V0O1xufSkoKTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gV2lkZ2V0O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJa002TDNSbGJYQXZSMGN1Um5KdmJuUkZibVF1VjJsa1oyVjBjeTkzYVdSblpYUnpMMk5vWVhKcGRIa3RaWFpsYm5SekxXSnZZWEprTDJKdmQyVnlYMk52YlhCdmJtVnVkSE12YW5WemRHZHBkbWx1WnkxM2FXUm5aWFF0Wm5KaGJXVjNiM0pyTDJOdmJYQnZibVZ1ZEhNdmJHbGlMMnB6TDJaeVlXMWxkMjl5YXk5WGFXUm5aWFF1YW5NaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWtGQlFVRXNXVUZCV1N4RFFVRkRPenM3T3pzN096czdPenM3WjBOQlJXOUNMSE5DUVVGelFqczdOa0pCUTJ4RExHMUNRVUZ0UWpzN096dDVRa0ZEYkVJc1lVRkJZVHM3T3pzN096czdPenM3T3p0SlFWVTNRaXhOUVVGTk8wRkJRMEVzVlVGRVRpeE5RVUZOTEVkQlEybEZPMjFGUVVGTUxFVkJRVVU3TzAxQlFURkVMR1ZCUVdVc1VVRkJaaXhsUVVGbE8wMUJRVVVzVlVGQlZTeFJRVUZXTEZWQlFWVTdUVUZCUlN4VlFVRlZMRkZCUVZZc1ZVRkJWVHROUVVGRkxGVkJRVlVzVVVGQlZpeFZRVUZWT3p0M1FrRkVOMFFzVFVGQlRUczdRVUZGVml4TlFVRkpMRU5CUVVNc1pVRkJaU3hIUVVGSExHVkJRV1VzU1VGQlNTeFJRVUZSTEVOQlFVTXNZVUZCWVN4RFFVRkRMSGxDUVVGNVFpeERRVUZETEVOQlFVTTdRVUZETlVZc1RVRkJTU3hEUVVGRExGVkJRVlVzUjBGQlJ5eFZRVUZWTEV0QlFVc3NVMEZCVXl4SFFVRkhMRWxCUVVrc1IwRkJSeXhWUVVGVkxFTkJRVU03UVVGREwwUXNUVUZCU1N4RFFVRkRMRlZCUVZVc1IwRkJSeXhWUVVGVkxFdEJRVXNzVTBGQlV5eEhRVUZITEVsQlFVa3NSMEZCUnl4VlFVRlZMRU5CUVVNN1FVRkRMMFFzVFVGQlNTeERRVUZETEZWQlFWVXNSMEZCUnl4VlFVRlZMRWxCUVVrc1JVRkJSU3hEUVVGRE8wRkJRMjVETEUxQlFVa3NRMEZCUXl4TFFVRkxMRWRCUVVjc1ZVRkJWU3hEUVVGRE8wRkJRM2hDTEUxQlFVc3NRMEZCUXl4SlFVRkpMRU5CUVVNc1ZVRkJWU3hGUVVGSE8wRkJRM1pDTEZWQlFVODdSMEZEVUR0RlFVTkVPenM3T3pzN08yTkJWa2tzVFVGQlRUczdVMEZsVGl4blFrRkJSenRCUVVOUUxFOUJRVWtzUTBGQlF5eFZRVUZWTEVsQlFVa3NTVUZCU1N4RFFVRkRMR05CUVdNc1EwRkJSU3hKUVVGSkxFTkJRVU1zWlVGQlpTeERRVUZGTEVOQlFVTTdRVUZETDBRc1QwRkJTU3hEUVVGRExFMUJRVTBzUjBGQlJ5eEpRVUZKTEVOQlFVTXNWVUZCVlN4SFFVRkhMRWxCUVVrc1EwRkJReXhoUVVGaExFVkJRVVVzUjBGQlJ5eFRRVUZUTEVOQlFVTTdSMEZEYWtVN096czdPenM3T3p0VFFVMWhMSGxDUVVGcFFqdFBRVUZvUWl4VFFVRlRMSGxFUVVGSExFVkJRVVU3TzBGQlF6VkNMRTlCUVVrc1RVRkJUU3hEUVVGRExFbEJRVWtzU1VGQlNTeE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkRMRWxCUVVrc1JVRkJSVHRCUVVOd1F5eGhRVUZUTEVOQlFVTXNTVUZCU1N4RFFVRkRPenM3V1VGQllTeG5Ra0ZCUVN4TlFVRk5MRU5CUVVNc1NVRkJTU3hGUVVGRExFbEJRVWtzVFVGQlFTeDVRa0ZCVXp0TFFVRkJMRU5CUVVNc1EwRkJRenRKUVVOMlJEdEJRVU5FTEZWQlFVOHNNa0pCUVdNN1FVRkRjRUlzWTBGQlZTeEZRVUZGTEVsQlFVa3NRMEZCUXl4TlFVRk5PMEZCUTNaQ0xGVkJRVTBzUlVGQlJTeEpRVUZKTzBGQlExb3NZVUZCVXl4RlFVRkZMRk5CUVZNN1NVRkRjRUlzUTBGQlF5eERRVUZETzBkQlEwZzdPenM3T3pzN08xTkJTMkVzZVVKQlFVYzdRVUZEYUVJc1ZVRkJUeXgzUTBGQmEwSXNVVUZCVVN4RFFVRkRMRTFCUVUwc1EwRkJSU3hEUVVGRE8wZEJRek5ET3pzN096czdPenRUUVV0akxIZENRVUZGTEdWQlFXVXNSVUZCUnpzN08wRkJRMnhETEZOQlFVMHNRMEZCUXl4blFrRkJaMElzUTBGQlJTeFJRVUZSTEVWQlFVVXNaME5CUVZVN1YwRkJUU3hOUVVGTExHbENRVUZwUWl4RFFVRkRMR1ZCUVdVc1EwRkJRenRKUVVGQkxFVkJRVVVzUjBGQlJ5eERRVUZETEVOQlFVVXNRMEZCUXp0SFFVTnVSenM3T3pzN096czdPMU5CVFdsQ0xESkNRVUZGTEVWQlFVVXNSVUZCTUVJN1QwRkJlRUlzUjBGQlJ5eDVSRUZCUXl4UlFVRlJMRU5CUVVNc1VVRkJVVHM3TzBGQlJUVkRMRTlCUVVzc1RVRkJUU3hMUVVGTExFMUJRVTBzUTBGQlF5eEhRVUZITEVsQlFVa3NUVUZCVFN4RFFVRkRMRkZCUVZFc1MwRkJTeXhOUVVGTkxFTkJRVU1zUjBGQlJ5eERRVUZETEZGQlFWRXNSVUZCUnp0QlFVTjJSU3hYUVVGUE8wbEJRMUE3UVVGRFJDeFRRVUZOTEVOQlFVTXNWMEZCVnl4cFFrRkJaMElzU1VGQlNTeERRVUZETEZWQlFWVXNkVUpCUVd0Q0xFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUlN4RFFVRkRMRmxCUVZrc1JVRkJSU3hGUVVGRkxFTkJRVU1zV1VGQldTeERRVUZETEVWQlFVa3NSMEZCUnl4RFFVRkZMRU5CUVVNN1IwRkRka2c3T3pzN096czdVMEZKVnl4MVFrRkJSenRCUVVOa0xFOUJRVWtzUTBGQlF5eHBRa0ZCYVVJc1EwRkJSU3hKUVVGSkxFTkJRVU1zWlVGQlpTeERRVUZGTEVOQlFVTTdSMEZETDBNN096dFJRV3BGU1N4TlFVRk5PenM3Y1VKQmIwVkhMRTFCUVUwaUxDSm1hV3hsSWpvaVF6b3ZkR1Z0Y0M5SFJ5NUdjbTl1ZEVWdVpDNVhhV1JuWlhSekwzZHBaR2RsZEhNdlkyaGhjbWwwZVMxbGRtVnVkSE10WW05aGNtUXZZbTkzWlhKZlkyOXRjRzl1Wlc1MGN5OXFkWE4wWjJsMmFXNW5MWGRwWkdkbGRDMW1jbUZ0WlhkdmNtc3ZZMjl0Y0c5dVpXNTBjeTlzYVdJdmFuTXZabkpoYldWM2IzSnJMMWRwWkdkbGRDNXFjeUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSWlkMWMyVWdjM1J5YVdOMEp6dGNjbHh1WEhKY2JtbHRjRzl5ZENCN0lIRjFaWEo1VTNSeWFXNW5VR0Z5YzJVZ2ZTQm1jbTl0SUNjdUxpOTFkR2xzY3k5eGRXVnllVk4wY21sdVp5YzdYSEpjYm1sdGNHOXlkQ0JrWldKdmRXNWpaU0JtY205dElDY3VMaTkxZEdsc2N5OWtaV0p2ZFc1alpTYzdYSEpjYm1sdGNHOXlkQ0JCYm1Gc2VYUnBZM01nWm5KdmJTQW5MaTlCYm1Gc2VYUnBZM01uTzF4eVhHNWNjbHh1THlvcVhISmNiaUFxSUVOeVpXRjBaU0JoSUhkcFpHZGxkRnh5WEc0Z0tpQkFZMnhoYzNOa1pYTmpJRU55WldGMFpTQmhJSGRwWkdkbGRDQnZZbXBsWTNSY2NseHVJQ29nUUhCaGNtRnRJSHRDYjI5c1pXRnVmU0J2Y0hScGIyNXpMbmRwWkdkbGRFTnZiblJoYVc1bGNpNGdWR2hsSUhkcFpHZGxkQ0JqYjI1MFlXbHVaWElnWld4bGJXVnVkRnh5WEc0Z0tpQkFjR0Z5WVcwZ2UwSnZiMnhsWVc1OUlHOXdkR2x2Ym5NdWNtVnpjRzl1YzJsMlpTNGdWMmhsZEdobGNpQjBhR1VnZDJsa1oyVjBJR2x6SUhKbGMzQnZibk5wZG1WY2NseHVJQ29nUUhCaGNtRnRJSHRDYjI5c1pXRnVmU0J2Y0hScGIyNXpMblZ6WlhKRGIyNW1hV2N1SUZkb1pYUm9aWElnZEdobElIZHBaR2RsZENCb1lYTWdkWE5sY2lCamIyNW1hV2QxY21GaWJHVWdjMlYwZEdsdVozTmNjbHh1SUNvZ1FHTnNZWE56SUZObGRDQjNhV1JuWlhRZ2FXNXpkR0Z1WTJVZ2NISnZjR1Z5ZEdsbGN5QmhibVFnYVc1cGRHbGhiR2x6WlNCM2FXUm5aWFJjY2x4dUlDb3ZYSEpjYm1Oc1lYTnpJRmRwWkdkbGRDQjdYSEpjYmx4MFkyOXVjM1J5ZFdOMGIzSW9JSHNnZDJsa1oyVjBRMjl1ZEdGcGJtVnlMQ0J5WlhOd2IyNXphWFpsTENCMWMyVnlRMjl1Wm1sbkxDQjNhV1JuWlhST1lXMWxJSDBnUFNCN2ZTQXBJSHRjY2x4dVhIUmNkSFJvYVhNdWQybGtaMlYwUTI5dWRHRnBibVZ5SUQwZ2QybGtaMlYwUTI5dWRHRnBibVZ5SUh4OElHUnZZM1Z0Wlc1MExuRjFaWEo1VTJWc1pXTjBiM0lvSjF0a1lYUmhMWGRwWkdkbGRDMWpiMjUwWVdsdVpYSmRKeWs3WEhKY2JseDBYSFIwYUdsekxuSmxjM0J2Ym5OcGRtVWdQU0J5WlhOd2IyNXphWFpsSUQwOVBTQjFibVJsWm1sdVpXUWdQeUIwY25WbElEb2djbVZ6Y0c5dWMybDJaVHRjY2x4dVhIUmNkSFJvYVhNdWRYTmxja052Ym1acFp5QTlJSFZ6WlhKRGIyNW1hV2NnUFQwOUlIVnVaR1ZtYVc1bFpDQS9JSFJ5ZFdVZ09pQjFjMlZ5UTI5dVptbG5PMXh5WEc1Y2RGeDBkR2hwY3k1M2FXUm5aWFJPWVcxbElEMGdkMmxrWjJWMFRtRnRaU0I4ZkNBbkp6dGNjbHh1WEhSY2RIUm9hWE11WVhCd1NXUWdQU0FuTkRNM1ltTmhOREluTzF4eVhHNWNkRngwYVdZZ0tDQWhkR2hwY3k1M2FXUm5aWFJPWVcxbElDa2dlMXh5WEc1Y2RGeDBYSFJ5WlhSMWNtNDdYSEpjYmx4MFhIUjlYSEpjYmx4MGZWeHlYRzVjZEM4cUtseHlYRzRnWEhRcUlFbHVhWFJwWVd4cGMyVWdkR2hsSUhkcFpHZGxkRnh5WEc0Z1hIUXFJRUJrWlhOamNtbHdkR2x2YmlCTllXdGxJSFJvWlNCM2FXUm5aWFFnY21WemNHOXVjMmwyWlRzZ1ptVjBZMmdnWVc1a0lHTmhZMmhsSUc5dUlIUm9aU0IzYVdSblpYUWdhVzV6ZEdGdVkyVWdkR2hsSUhWelpYSWdZMjl1Wm1sbklHaGhjMmhjY2x4dUlGeDBLaTljY2x4dVhIUnBibWwwSUNncElIdGNjbHh1WEhSY2RIUm9hWE11Y21WemNHOXVjMmwyWlNBbUppQjBhR2x6TG0xaGEyVlNaWE53YjI1emFYWmxLQ0IwYUdsekxuZHBaR2RsZEVOdmJuUmhhVzVsY2lBcE8xeHlYRzVjZEZ4MGRHaHBjeTVqYjI1bWFXY2dQU0IwYUdsekxuVnpaWEpEYjI1bWFXY2dQeUIwYUdsekxtZGxkRlZ6WlhKRGIyNW1hV2NvS1NBNklIVnVaR1ZtYVc1bFpEdGNjbHh1WEhSOVhISmNibHgwTHlvcVhISmNiaUJjZENvZ1NXNXBkR2xoYkdselpTQjNhV1JuWlhRZ1lXNWhiSGwwYVdOelhISmNiaUJjZENvZ1FHUmxjMk55YVhCMGFXOXVJRU55WldGMFpTQmhJRzVsZHlCcGJuTjBZVzVqWlNCdlppQkJibUZzZVhScFkzTWdZMnhoYzNNZ1ptOXlJR05oWTJocGJtY2diMjRnZEdobElIZHBaR2RsZENCcGJuTjBZVzVqWlZ4eVhHNGdYSFFxSUVCeVpYUjFjbTV6SUh0UFltcGxZM1I5SUVGdVlXeDVkR2xqY3lCcGJuTjBZVzVqWlZ4eVhHNGdYSFFxTDF4eVhHNWNkR2x1YVhSQmJtRnNlWFJwWTNNZ0tHTmhiR3hpWVdOcmN5QTlJRnRkS1NCN1hISmNibHgwWEhScFppQW9kMmx1Wkc5M0xsOXJiWEVnSmlZZ2QybHVaRzkzTGw5cmJYRXVjSFZ6YUNrZ2UxeHlYRzVjZEZ4MFhIUmpZV3hzWW1GamEzTXVjSFZ6YUNnb0xpNHVaR0YwWVNrZ1BUNGdkMmx1Wkc5M0xsOXJiWEV1Y0hWemFDZ3VMaTVrWVhSaEtTazdYSEpjYmx4MFhIUjlYSEpjYmx4MFhIUnlaWFIxY200Z2JtVjNJRUZ1WVd4NWRHbGpjeWg3WEhKY2JseDBYSFJjZEdOdmJtWnBaMGhoYzJnNklIUm9hWE11WTI5dVptbG5MRnh5WEc1Y2RGeDBYSFIzYVdSblpYUTZJSFJvYVhNc1hISmNibHgwWEhSY2RHTmhiR3hpWVdOcmN6b2dZMkZzYkdKaFkydHpYSEpjYmx4MFhIUjlLVHRjY2x4dVhIUjlYSEpjYmx4MEx5b3FYSEpjYmlCY2RDb2dRM0psWVhSbElHRWdhR0Z6YUNCdFlYQWdiMllnZFhObGNpQmpiMjVtYVdjZ1puSnZiU0IzYVdSblpYUWdjWFZsY25rZ2MzUnlhVzVuWEhKY2JpQmNkQ29nUUhKbGRIVnlibk1nZTA5aWFtVmpkSDBnYUdGemFDQnRZWEFnYjJZZ2RYTmxjaUJqYjI1bWFXZGNjbHh1SUZ4MEtpOWNjbHh1WEhSblpYUlZjMlZ5UTI5dVptbG5JQ2dwSUh0Y2NseHVYSFJjZEhKbGRIVnliaUJ4ZFdWeWVWTjBjbWx1WjFCaGNuTmxLQ0JzYjJOaGRHbHZiaTV6WldGeVkyZ2dLVHRjY2x4dVhIUjlYSEpjYmx4MEx5b3FYSEpjYmlCY2RDb2dUV0ZyWlNCM2FXUm5aWFFnY21WemNHOXVjMmwyWlNCMGJ5QnBkSE1nWTNWeWNtVnVkQ0JqYjI1MFpXNTBJRzl1SUhkcGJpQnlaWE5wZW1WY2NseHVJRngwS2lCQWNHRnlZVzBnZTBWc1pXMWxiblI5SUZSb1pTQjNhV1JuWlhRZ1kyOXVkR0ZwYm1WeVhISmNiaUJjZENvdlhISmNibHgwYldGclpWSmxjM0J2Ym5OcGRtVWdLQ0IzYVdSblpYUkRiMjUwWVdsdVpYSWdLU0I3WEhKY2JseDBYSFIzYVc1a2IzY3VZV1JrUlhabGJuUk1hWE4wWlc1bGNpZ2dKM0psYzJsNlpTY3NJR1JsWW05MWJtTmxLQ0FvS1NBOVBpQjBhR2x6TG5CdmMzUkRiMjUwWlc1MFNHVnBaMmgwS0hkcFpHZGxkRU52Ym5SaGFXNWxjaWtzSURJMU1Da2dLVHRjY2x4dVhIUjlYSEpjYmx4MEx5b3FYSEpjYmlCY2RDb2dVRzl6ZENCMGFHVWdZM1Z5Y21WdWRDQnpZM0p2Ykd3Z2FHVnBaMmgwSUhaaGJIVmxJRzltSUdGdUlHVnNaVzFsYm5RZ2RHOGdkR2hsSUhCaGNtVnVkQ0IzYVc1a2IzZGNjbHh1SUZ4MEtpQkFjR0Z5WVcwZ2UwVnNaVzFsYm5SOUlGUm9aU0JsYkdWdGJuUWdkMmh2YzJVZ2FHVnBaMmgwSUhSdklITmxibVJjY2x4dUlGeDBLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdWVkpNSUc5bUlIQmhjbVZ1ZENCMGJ5QndiM04wSUcxbGMzTmhaMlVnZEc4N0lHUmxabUYxYkhSeklIUnZJR1J2WTNWdFpXNTBMbkpsWm1WeWNtVnlYSEpjYmlCY2RDb3ZYSEpjYmx4MGNHOXpkRU52Ym5SbGJuUklaV2xuYUhRZ0tDQmxiQ3dnZFhKc1BXUnZZM1Z0Wlc1MExuSmxabVZ5Y21WeUlDa2dlMXh5WEc1Y2RGeDBMeTlFYjI0bmRDQndiM04wSUhSdklITmxiR1pjY2x4dVhIUmNkR2xtSUNnZ2QybHVaRzkzSUQwOVBTQjNhVzVrYjNjdWRHOXdJSHg4SUhkcGJtUnZkeTVzYjJOaGRHbHZiaUE5UFQwZ2QybHVaRzkzTG5SdmNDNXNiMk5oZEdsdmJpQXBJSHRjY2x4dVhIUmNkRngwY21WMGRYSnVPMXh5WEc1Y2RGeDBmVnh5WEc1Y2RGeDBjR0Z5Wlc1MExuQnZjM1JOWlhOellXZGxLQ0JnZDJsa1oyVjBUbUZ0WlQwa2UzUm9hWE11ZDJsa1oyVjBUbUZ0WlgwbVkyOXVkR1Z1ZEVobGFXZG9kRDBrZTAxaGRHZ3ViV0Y0S0dWc0xuTmpjbTlzYkVobGFXZG9kQ3dnWld3dWIyWm1jMlYwU0dWcFoyaDBLWDFnTENCMWNtd2dLVHRjY2x4dVhIUjlYSEpjYmx4MEx5b3FYSEpjYmlCY2RDb2dVbVZ6WlhRZ2RHaGxJR2hsYVdkb2RDQnZaaUIwYUdVZ2QybGtaMlYwWEhKY2JpQmNkQ292WEhKY2JseDBjbVZ6WlhSSVpXbG5hSFFnS0NrZ2UxeHlYRzVjZEZ4MGRHaHBjeTV3YjNOMFEyOXVkR1Z1ZEVobGFXZG9kQ2dnZEdocGN5NTNhV1JuWlhSRGIyNTBZV2x1WlhJZ0tUdGNjbHh1WEhSOVhISmNibjFjY2x4dVhISmNibVY0Y0c5eWRDQmtaV1poZFd4MElGZHBaR2RsZER0Y2NseHVJbDE5IiwiJ3VzZSBzdHJpY3QnO1xuLyoqXHJcbiAqIERlYm91bmNlcyBhIGZ1bmN0aW9uIGNhbGxcclxuICogQHBhcmFtIHtmdW5jdGlvbn0gVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBEdXJhdGlvbiBvZiBkZWJvdW5jZVxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IElmIHRydWUsIHRyaWdnZXIgZnVuY3Rpb24gb24gbGVhZGluZyBlZGdlXHJcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufSBUaGUgZGVib3VuY2VyIGZ1bmN0aW9uXHJcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuXHR2YWx1ZTogdHJ1ZVxufSk7XG5mdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBpbW1lZGlhdGUpIHtcblx0dmFyIHRpbWVvdXQgPSB1bmRlZmluZWQ7XG5cdHJldHVybiBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIGNvbnRleHQgPSB0aGlzLFxuXHRcdCAgICBhcmdzID0gYXJndW1lbnRzO1xuXHRcdHZhciBsYXRlciA9IGZ1bmN0aW9uIGxhdGVyKCkge1xuXHRcdFx0dGltZW91dCA9IG51bGw7XG5cdFx0XHRpZiAoIWltbWVkaWF0ZSkge1xuXHRcdFx0XHRmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0dmFyIGNhbGxOb3cgPSBpbW1lZGlhdGUgJiYgIXRpbWVvdXQ7XG5cdFx0Y2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXHRcdHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCB3YWl0KTtcblx0XHRpZiAoY2FsbE5vdykge1xuXHRcdFx0ZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcblx0XHR9XG5cdH07XG59XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGRlYm91bmNlO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJa002TDNSbGJYQXZSMGN1Um5KdmJuUkZibVF1VjJsa1oyVjBjeTkzYVdSblpYUnpMMk5vWVhKcGRIa3RaWFpsYm5SekxXSnZZWEprTDJKdmQyVnlYMk52YlhCdmJtVnVkSE12YW5WemRHZHBkbWx1WnkxM2FXUm5aWFF0Wm5KaGJXVjNiM0pyTDJOdmJYQnZibVZ1ZEhNdmJHbGlMMnB6TDNWMGFXeHpMMlJsWW05MWJtTmxMbXB6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUpCUVVGQkxGbEJRVmtzUTBGQlF6czdPenM3T3pzN096czdRVUZSWWl4VFFVRlRMRkZCUVZFc1EwRkJSU3hKUVVGSkxFVkJRVVVzU1VGQlNTeEZRVUZGTEZOQlFWTXNSVUZCUnp0QlFVTXhReXhMUVVGSkxFOUJRVThzV1VGQlFTeERRVUZETzBGQlExb3NVVUZCVHl4WlFVRlhPMEZCUTJwQ0xFMUJRVWtzVDBGQlR5eEhRVUZITEVsQlFVazdUVUZCUlN4SlFVRkpMRWRCUVVjc1UwRkJVeXhEUVVGRE8wRkJRM0pETEUxQlFVa3NTMEZCU3l4SFFVRkhMRk5CUVZJc1MwRkJTeXhIUVVGak8wRkJRM1JDTEZWQlFVOHNSMEZCUnl4SlFVRkpMRU5CUVVNN1FVRkRaaXhQUVVGTExFTkJRVU1zVTBGQlV5eEZRVUZITzBGQlEycENMRkZCUVVrc1EwRkJReXhMUVVGTExFTkJRVVVzVDBGQlR5eEZRVUZGTEVsQlFVa3NRMEZCUlN4RFFVRkRPMGxCUXpWQ08wZEJRMFFzUTBGQlF6dEJRVU5HTEUxQlFVa3NUMEZCVHl4SFFVRkhMRk5CUVZNc1NVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF6dEJRVU53UXl4alFVRlpMRU5CUVVVc1QwRkJUeXhEUVVGRkxFTkJRVU03UVVGRGVFSXNVMEZCVHl4SFFVRkhMRlZCUVZVc1EwRkJSU3hMUVVGTExFVkJRVVVzU1VGQlNTeERRVUZGTEVOQlFVTTdRVUZEY0VNc1RVRkJTeXhQUVVGUExFVkJRVWM3UVVGRFpDeFBRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkZMRTlCUVU4c1JVRkJSU3hKUVVGSkxFTkJRVVVzUTBGQlF6dEhRVU0xUWp0RlFVTkVMRU5CUVVNN1EwRkRSanM3Y1VKQlJXTXNVVUZCVVNJc0ltWnBiR1VpT2lKRE9pOTBaVzF3TDBkSExrWnliMjUwUlc1a0xsZHBaR2RsZEhNdmQybGtaMlYwY3k5amFHRnlhWFI1TFdWMlpXNTBjeTFpYjJGeVpDOWliM2RsY2w5amIyMXdiMjVsYm5SekwycDFjM1JuYVhacGJtY3RkMmxrWjJWMExXWnlZVzFsZDI5eWF5OWpiMjF3YjI1bGJuUnpMMnhwWWk5cWN5OTFkR2xzY3k5a1pXSnZkVzVqWlM1cWN5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJaWQxYzJVZ2MzUnlhV04wSnp0Y2NseHVMeW9xWEhKY2JpQXFJRVJsWW05MWJtTmxjeUJoSUdaMWJtTjBhVzl1SUdOaGJHeGNjbHh1SUNvZ1FIQmhjbUZ0SUh0bWRXNWpkR2x2Ym4wZ1ZHaGxJR1oxYm1OMGFXOXVJSFJ2SUdSbFltOTFibU5sWEhKY2JpQXFJRUJ3WVhKaGJTQjdiblZ0WW1WeWZTQkVkWEpoZEdsdmJpQnZaaUJrWldKdmRXNWpaVnh5WEc0Z0tpQkFjR0Z5WVcwZ2UySnZiMnhsWVc1OUlFbG1JSFJ5ZFdVc0lIUnlhV2RuWlhJZ1puVnVZM1JwYjI0Z2IyNGdiR1ZoWkdsdVp5QmxaR2RsWEhKY2JpQXFJRUJ5WlhSMWNtNGdlMloxYm1OMGFXOXVmU0JVYUdVZ1pHVmliM1Z1WTJWeUlHWjFibU4wYVc5dVhISmNiaUFxTDF4eVhHNW1kVzVqZEdsdmJpQmtaV0p2ZFc1alpTZ2dablZ1WXl3Z2QyRnBkQ3dnYVcxdFpXUnBZWFJsSUNrZ2UxeHlYRzVjZEd4bGRDQjBhVzFsYjNWME8xeHlYRzVjZEhKbGRIVnliaUJtZFc1amRHbHZiaWdwSUh0Y2NseHVYSFJjZEd4bGRDQmpiMjUwWlhoMElEMGdkR2hwY3l3Z1lYSm5jeUE5SUdGeVozVnRaVzUwY3p0Y2NseHVYSFJjZEd4bGRDQnNZWFJsY2lBOUlHWjFibU4wYVc5dUtDa2dlMXh5WEc1Y2RGeDBYSFIwYVcxbGIzVjBJRDBnYm5Wc2JEdGNjbHh1WEhSY2RGeDBhV1lnS0NBaGFXMXRaV1JwWVhSbElDa2dleUJjY2x4dVhIUmNkRngwWEhSbWRXNWpMbUZ3Y0d4NUtDQmpiMjUwWlhoMExDQmhjbWR6SUNrN1hISmNibHgwWEhSY2RIMWNkRnh5WEc1Y2RGeDBmVHRjY2x4dVhIUmNkR3hsZENCallXeHNUbTkzSUQwZ2FXMXRaV1JwWVhSbElDWW1JQ0YwYVcxbGIzVjBPMXh5WEc1Y2RGeDBZMnhsWVhKVWFXMWxiM1YwS0NCMGFXMWxiM1YwSUNrN1hISmNibHgwWEhSMGFXMWxiM1YwSUQwZ2MyVjBWR2x0Wlc5MWRDZ2diR0YwWlhJc0lIZGhhWFFnS1R0Y2NseHVYSFJjZEdsbUlDZ2dZMkZzYkU1dmR5QXBJSHNnWEhKY2JseDBYSFJjZEdaMWJtTXVZWEJ3Ykhrb0lHTnZiblJsZUhRc0lHRnlaM01nS1R0Y2NseHVYSFJjZEgxY2NseHVYSFI5TzF4eVhHNTlYSEpjYmx4eVhHNWxlSEJ2Y25RZ1pHVm1ZWFZzZENCa1pXSnZkVzVqWlRzaVhYMD0iLCIndXNlIHN0cmljdCc7XG4vKipcclxuICogQ3JlYXRlIGEgaGFzaCBtYXAgb2YgcXVlcnkgc3RyaW5nIGtleS12YWx1ZSBwYWlycy5cclxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uLnNlYXJjaCBzdHJpbmcgdG8gaGFzaFxyXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBoYXNoIG1hcCBvZiBxdWVyeSBzdHJpbmcga2V5LXZhbHVlIHBhaXJzXHJcbiAqIEBhdXRob3IgYnkgU2luZHJlIFNvcmh1c1xyXG4gKiBAbGljZW5zZSBNSVQgTGljZW5zZVxyXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvcXVlcnktc3RyaW5nXHJcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuXHR2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnF1ZXJ5U3RyaW5nUGFyc2UgPSBxdWVyeVN0cmluZ1BhcnNlO1xuZXhwb3J0cy5xdWVyeVN0cmluZ1N0cmluZ2lmeSA9IHF1ZXJ5U3RyaW5nU3RyaW5naWZ5O1xuXG5mdW5jdGlvbiBxdWVyeVN0cmluZ1BhcnNlKHN0cikge1xuXHRpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcblx0XHRyZXR1cm4ge307XG5cdH1cblxuXHRzdHIgPSBzdHIudHJpbSgpLnJlcGxhY2UoL14oXFw/fCMpLywgJycpO1xuXG5cdGlmICghc3RyKSB7XG5cdFx0cmV0dXJuIHt9O1xuXHR9XG5cblx0cmV0dXJuIHN0ci50cmltKCkuc3BsaXQoJyYnKS5yZWR1Y2UoZnVuY3Rpb24gKHJldCwgcGFyYW0pIHtcblx0XHR2YXIgcGFydHMgPSBwYXJhbS5yZXBsYWNlKC9cXCsvZywgJyAnKS5zcGxpdCgnPScpO1xuXHRcdHZhciBrZXkgPSBwYXJ0c1swXTtcblx0XHR2YXIgdmFsID0gcGFydHNbMV07XG5cblx0XHRrZXkgPSBkZWNvZGVVUklDb21wb25lbnQoa2V5KTtcblx0XHQvLyBtaXNzaW5nIGA9YCBzaG91bGQgYmUgYG51bGxgOlxuXHRcdC8vIGh0dHA6Ly93My5vcmcvVFIvMjAxMi9XRC11cmwtMjAxMjA1MjQvI2NvbGxlY3QtdXJsLXBhcmFtZXRlcnNcblx0XHR2YWwgPSB2YWwgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZWNvZGVVUklDb21wb25lbnQodmFsKTtcblxuXHRcdGlmICghcmV0Lmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRcdHJldFtrZXldID0gdmFsO1xuXHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXRba2V5XSkpIHtcblx0XHRcdHJldFtrZXldLnB1c2godmFsKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0W2tleV0gPSBbcmV0W2tleV0sIHZhbF07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJldDtcblx0fSwge30pO1xufVxuXG4vKipcclxuICogQ3JlYXRlIHF1ZXJ5IHN0cmluZyBvZiBrZXktdmFsdWUgcGFpcnMgZnJvbSBhIGhhc2ggbWFwLlxyXG4gKiBAcGFyYW0ge29ian0gaGFzaG1hcCBzb3VyY2VcclxuICogQHJldHVybnMge3N0cmluZ30gcXVlcnlTdHJpbmdcclxuICogQGF1dGhvciBieSBTaW5kcmUgU29yaHVzXHJcbiAqIEBsaWNlbnNlIE1JVCBMaWNlbnNlXHJcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9xdWVyeS1zdHJpbmdcclxuICovXG5cbmZ1bmN0aW9uIHF1ZXJ5U3RyaW5nU3RyaW5naWZ5KG9iaikge1xuXHRyZXR1cm4gb2JqID8gT2JqZWN0LmtleXMob2JqKS5zb3J0KCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcblx0XHR2YXIgdmFsID0gb2JqW2tleV07XG5cblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG5cdFx0XHRyZXR1cm4gdmFsLnNvcnQoKS5tYXAoZnVuY3Rpb24gKHZhbDIpIHtcblx0XHRcdFx0cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbDIpO1xuXHRcdFx0fSkuam9pbignJicpO1xuXHRcdH1cblxuXHRcdHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoa2V5KSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpO1xuXHR9KS5qb2luKCcmJykgOiAnJztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklrTTZMM1JsYlhBdlIwY3VSbkp2Ym5SRmJtUXVWMmxrWjJWMGN5OTNhV1JuWlhSekwyTm9ZWEpwZEhrdFpYWmxiblJ6TFdKdllYSmtMMkp2ZDJWeVgyTnZiWEJ2Ym1WdWRITXZhblZ6ZEdkcGRtbHVaeTEzYVdSblpYUXRabkpoYldWM2IzSnJMMk52YlhCdmJtVnVkSE12YkdsaUwycHpMM1YwYVd4ekwzRjFaWEo1VTNSeWFXNW5MbXB6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUpCUVVGQkxGbEJRVmtzUTBGQlF6czdPenM3T3pzN096czdPenM3TzBGQlUwNHNVMEZCVXl4blFrRkJaMElzUTBGQlJ5eEhRVUZITEVWQlFVYzdRVUZEZUVNc1MwRkJTeXhQUVVGUExFZEJRVWNzUzBGQlN5eFJRVUZSTEVWQlFVYzdRVUZET1VJc1UwRkJUeXhGUVVGRkxFTkJRVU03UlVGRFZqczdRVUZGUkN4SlFVRkhMRWRCUVVjc1IwRkJSeXhEUVVGRExFbEJRVWtzUlVGQlJTeERRVUZETEU5QlFVOHNRMEZCUXl4VFFVRlRMRVZCUVVVc1JVRkJSU3hEUVVGRExFTkJRVU03TzBGQlJYaERMRXRCUVVzc1EwRkJReXhIUVVGSExFVkJRVWM3UVVGRFdDeFRRVUZQTEVWQlFVVXNRMEZCUXp0RlFVTldPenRCUVVWRUxGRkJRVThzUjBGQlJ5eERRVUZETEVsQlFVa3NSVUZCUlN4RFFVRkRMRXRCUVVzc1EwRkJSU3hIUVVGSExFTkJRVVVzUTBGQlF5eE5RVUZOTEVOQlFVVXNWVUZCVnl4SFFVRkhMRVZCUVVVc1MwRkJTeXhGUVVGSE8wRkJRemxFTEUxQlFVa3NTMEZCU3l4SFFVRkhMRXRCUVVzc1EwRkJReXhQUVVGUExFTkJRVU1zUzBGQlN5eEZRVUZGTEVkQlFVY3NRMEZCUXl4RFFVRkRMRXRCUVVzc1EwRkJSU3hIUVVGSExFTkJRVVVzUTBGQlF6dEJRVU51UkN4TlFVRkpMRWRCUVVjc1IwRkJSeXhMUVVGTExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdRVUZEYmtJc1RVRkJTU3hIUVVGSExFZEJRVWNzUzBGQlN5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPenRCUVVWdVFpeExRVUZITEVkQlFVY3NhMEpCUVd0Q0xFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTTdPenRCUVVjNVFpeExRVUZITEVkQlFVY3NSMEZCUnl4TFFVRkxMRk5CUVZNc1IwRkJSeXhKUVVGSkxFZEJRVWNzYTBKQlFXdENMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU03TzBGQlJYcEVMRTFCUVVzc1EwRkJReXhIUVVGSExFTkJRVU1zWTBGQll5eERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkhPMEZCUXk5Q0xFMUJRVWNzUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4SFFVRkhMRU5CUVVNN1IwRkRaaXhOUVVGTkxFbEJRVXNzUzBGQlN5eERRVUZETEU5QlFVOHNRMEZCUXl4SFFVRkhMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU1zUlVGQlJ6dEJRVU55UXl4TlFVRkhMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU1zU1VGQlNTeERRVUZGTEVkQlFVY3NRMEZCUlN4RFFVRkRPMGRCUTNKQ0xFMUJRVTA3UVVGRFRpeE5RVUZITEVOQlFVTXNSMEZCUnl4RFFVRkRMRWRCUVVjc1EwRkJReXhIUVVGSExFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNSMEZCUnl4RFFVRkRMRU5CUVVNN1IwRkRNMEk3TzBGQlJVUXNVMEZCVHl4SFFVRkhMRU5CUVVNN1JVRkRXQ3hGUVVGRkxFVkJRVVVzUTBGQlJTeERRVUZETzBOQlExSTdPenM3T3pzN096czdPMEZCVlUwc1UwRkJVeXh2UWtGQmIwSXNRMEZCUnl4SFFVRkhMRVZCUVVjN1FVRkROVU1zVVVGQlR5eEhRVUZITEVkQlFVY3NUVUZCVFN4RFFVRkRMRWxCUVVrc1EwRkJSU3hIUVVGSExFTkJRVVVzUTBGQlF5eEpRVUZKTEVWQlFVVXNRMEZCUXl4SFFVRkhMRU5CUVVVc1ZVRkJWU3hIUVVGSExFVkJRVWM3UVVGRE0wUXNUVUZCU1N4SFFVRkhMRWRCUVVjc1IwRkJSeXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZET3p0QlFVVnVRaXhOUVVGTExFdEJRVXNzUTBGQlF5eFBRVUZQTEVOQlFVVXNSMEZCUnl4RFFVRkZMRVZCUVVjN1FVRkRNMElzVlVGQlR5eEhRVUZITEVOQlFVTXNTVUZCU1N4RlFVRkZMRU5CUVVNc1IwRkJSeXhEUVVGRkxGVkJRVmNzU1VGQlNTeEZRVUZITzBGQlEzaERMRmRCUVU4c2EwSkJRV3RDTEVOQlFVVXNSMEZCUnl4RFFVRkZMRWRCUVVjc1IwRkJSeXhIUVVGSExHdENRVUZyUWl4RFFVRkZMRWxCUVVrc1EwRkJSU3hEUVVGRE8wbEJRM0JGTEVOQlFVTXNRMEZCUXl4SlFVRkpMRU5CUVVVc1IwRkJSeXhEUVVGRkxFTkJRVU03UjBGRFpqczdRVUZGUkN4VFFVRlBMR3RDUVVGclFpeERRVUZGTEVkQlFVY3NRMEZCUlN4SFFVRkhMRWRCUVVjc1IwRkJSeXhyUWtGQmEwSXNRMEZCUlN4SFFVRkhMRU5CUVVVc1EwRkJRenRGUVVOdVJTeERRVUZETEVOQlFVTXNTVUZCU1N4RFFVRkZMRWRCUVVjc1EwRkJSU3hIUVVGSExFVkJRVVVzUTBGQlF6dERRVU53UWlJc0ltWnBiR1VpT2lKRE9pOTBaVzF3TDBkSExrWnliMjUwUlc1a0xsZHBaR2RsZEhNdmQybGtaMlYwY3k5amFHRnlhWFI1TFdWMlpXNTBjeTFpYjJGeVpDOWliM2RsY2w5amIyMXdiMjVsYm5SekwycDFjM1JuYVhacGJtY3RkMmxrWjJWMExXWnlZVzFsZDI5eWF5OWpiMjF3YjI1bGJuUnpMMnhwWWk5cWN5OTFkR2xzY3k5eGRXVnllVk4wY21sdVp5NXFjeUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSWlkMWMyVWdjM1J5YVdOMEp6dGNjbHh1THlvcVhISmNiaUFxSUVOeVpXRjBaU0JoSUdoaGMyZ2diV0Z3SUc5bUlIRjFaWEo1SUhOMGNtbHVaeUJyWlhrdGRtRnNkV1VnY0dGcGNuTXVYSEpjYmlBcUlFQndZWEpoYlNCN2MzUnlhVzVuZlNCc2IyTmhkR2x2Ymk1elpXRnlZMmdnYzNSeWFXNW5JSFJ2SUdoaGMyaGNjbHh1SUNvZ1FISmxkSFZ5Ym5NZ2UyOWlhbVZqZEgwZ2FHRnphQ0J0WVhBZ2IyWWdjWFZsY25rZ2MzUnlhVzVuSUd0bGVTMTJZV3gxWlNCd1lXbHljMXh5WEc0Z0tpQkFZWFYwYUc5eUlHSjVJRk5wYm1SeVpTQlRiM0pvZFhOY2NseHVJQ29nUUd4cFkyVnVjMlVnVFVsVUlFeHBZMlZ1YzJWY2NseHVJQ29nUUhObFpTQm9kSFJ3Y3pvdkwyZHBkR2gxWWk1amIyMHZjMmx1WkhKbGMyOXlhSFZ6TDNGMVpYSjVMWE4wY21sdVoxeHlYRzRnS2k5Y2NseHVaWGh3YjNKMElHWjFibU4wYVc5dUlIRjFaWEo1VTNSeWFXNW5VR0Z5YzJVZ0tDQnpkSElnS1NCN1hISmNibHgwYVdZZ0tDQjBlWEJsYjJZZ2MzUnlJQ0U5UFNBbmMzUnlhVzVuSnlBcElIdGNjbHh1WEhSY2RISmxkSFZ5YmlCN2ZUdGNjbHh1WEhSOVhISmNibHh5WEc1Y2RITjBjaUE5SUhOMGNpNTBjbWx0S0NrdWNtVndiR0ZqWlNndlhpaGNYRDk4SXlrdkxDQW5KeWs3WEhKY2JseHlYRzVjZEdsbUlDZ2dJWE4wY2lBcElIdGNjbHh1WEhSY2RISmxkSFZ5YmlCN2ZUdGNjbHh1WEhSOVhISmNibHh5WEc1Y2RISmxkSFZ5YmlCemRISXVkSEpwYlNncExuTndiR2wwS0NBbkppY2dLUzV5WldSMVkyVW9JR1oxYm1OMGFXOXVJQ2dnY21WMExDQndZWEpoYlNBcElIdGNjbHh1WEhSY2RHeGxkQ0J3WVhKMGN5QTlJSEJoY21GdExuSmxjR3hoWTJVb0wxeGNLeTluTENBbklDY3BMbk53YkdsMEtDQW5QU2NnS1R0Y2NseHVYSFJjZEd4bGRDQnJaWGtnUFNCd1lYSjBjMXN3WFR0Y2NseHVYSFJjZEd4bGRDQjJZV3dnUFNCd1lYSjBjMXN4WFR0Y2NseHVYSEpjYmx4MFhIUnJaWGtnUFNCa1pXTnZaR1ZWVWtsRGIyMXdiMjVsYm5Rb2EyVjVLVHRjY2x4dVhIUmNkQzh2SUcxcGMzTnBibWNnWUQxZ0lITm9iM1ZzWkNCaVpTQmdiblZzYkdBNlhISmNibHgwWEhRdkx5Qm9kSFJ3T2k4dmR6TXViM0puTDFSU0x6SXdNVEl2VjBRdGRYSnNMVEl3TVRJd05USTBMeU5qYjJ4c1pXTjBMWFZ5YkMxd1lYSmhiV1YwWlhKelhISmNibHgwWEhSMllXd2dQU0IyWVd3Z1BUMDlJSFZ1WkdWbWFXNWxaQ0EvSUc1MWJHd2dPaUJrWldOdlpHVlZVa2xEYjIxd2IyNWxiblFvZG1Gc0tUdGNjbHh1WEhKY2JseDBYSFJwWmlBb0lDRnlaWFF1YUdGelQzZHVVSEp2Y0dWeWRIa29hMlY1S1NBcElIdGNjbHh1WEhSY2RGeDBjbVYwVzJ0bGVWMGdQU0IyWVd3N1hISmNibHgwWEhSOUlHVnNjMlVnYVdZZ0tDQkJjbkpoZVM1cGMwRnljbUY1S0hKbGRGdHJaWGxkS1NBcElIdGNjbHh1WEhSY2RGeDBjbVYwVzJ0bGVWMHVjSFZ6YUNnZ2RtRnNJQ2s3WEhKY2JseDBYSFI5SUdWc2MyVWdlMXh5WEc1Y2RGeDBYSFJ5WlhSYmEyVjVYU0E5SUZ0eVpYUmJhMlY1WFN3Z2RtRnNYVHRjY2x4dVhIUmNkSDFjY2x4dVhISmNibHgwWEhSeVpYUjFjbTRnY21WME8xeHlYRzVjZEgwc0lIdDlJQ2s3WEhKY2JuMWNjbHh1WEhKY2JpOHFLbHh5WEc0Z0tpQkRjbVZoZEdVZ2NYVmxjbmtnYzNSeWFXNW5JRzltSUd0bGVTMTJZV3gxWlNCd1lXbHljeUJtY205dElHRWdhR0Z6YUNCdFlYQXVYSEpjYmlBcUlFQndZWEpoYlNCN2IySnFmU0JvWVhOb2JXRndJSE52ZFhKalpWeHlYRzRnS2lCQWNtVjBkWEp1Y3lCN2MzUnlhVzVuZlNCeGRXVnllVk4wY21sdVoxeHlYRzRnS2lCQVlYVjBhRzl5SUdKNUlGTnBibVJ5WlNCVGIzSm9kWE5jY2x4dUlDb2dRR3hwWTJWdWMyVWdUVWxVSUV4cFkyVnVjMlZjY2x4dUlDb2dRSE5sWlNCb2RIUndjem92TDJkcGRHaDFZaTVqYjIwdmMybHVaSEpsYzI5eWFIVnpMM0YxWlhKNUxYTjBjbWx1WjF4eVhHNGdLaTljY2x4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUhGMVpYSjVVM1J5YVc1blUzUnlhVzVuYVdaNUlDZ2diMkpxSUNrZ2UxeHlYRzVjZEhKbGRIVnliaUJ2WW1vZ1B5QlBZbXBsWTNRdWEyVjVjeWdnYjJKcUlDa3VjMjl5ZENncExtMWhjQ2dnWm5WdVkzUnBiMjRvSUd0bGVTQXBJSHRjY2x4dVhIUmNkR3hsZENCMllXd2dQU0J2WW1wYmEyVjVYVHRjY2x4dVhISmNibHgwWEhScFppQW9JRUZ5Y21GNUxtbHpRWEp5WVhrb0lIWmhiQ0FwSUNrZ2UxeHlYRzVjZEZ4MFhIUnlaWFIxY200Z2RtRnNMbk52Y25Rb0tTNXRZWEFnS0daMWJtTjBhVzl1SUNnZ2RtRnNNaUFwSUh0Y2NseHVYSFJjZEZ4MFhIUnlaWFIxY200Z1pXNWpiMlJsVlZKSlEyOXRjRzl1Wlc1MEtDQnJaWGtnS1NBcklDYzlKeUFySUdWdVkyOWtaVlZTU1VOdmJYQnZibVZ1ZENnZ2RtRnNNaUFwTzF4eVhHNWNkRngwWEhSOUtTNXFiMmx1S0NBbkppY2dLVHRjY2x4dVhIUmNkSDFjY2x4dVhISmNibHgwWEhSeVpYUjFjbTRnWlc1amIyUmxWVkpKUTI5dGNHOXVaVzUwS0NCclpYa2dLU0FySUNjOUp5QXJJR1Z1WTI5a1pWVlNTVU52YlhCdmJtVnVkQ2dnZG1Gc0lDazdYSEpjYmx4MGZTa3VhbTlwYmlnZ0p5WW5JQ2tnT2lBbkp6dGNjbHh1ZlNKZGZRPT0iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3V0aWxzUXVlcnlTdHJpbmcgPSByZXF1aXJlKCcuLi8uLi91dGlscy9xdWVyeVN0cmluZycpO1xuXG4vKipcclxuICogV3JpdGUgYSBVVE0gY29kZSBzdHJpbmcgZm9yIGFwcGVuZGluZyB0byBkb21haW4gVVJMc1xyXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsIHRvIGFwcGVuZCB1dG0gY29kZSB0b1xyXG4gKiBAcGFyYW0ge29iamVjdH0gSGFzaCBvZiB1dG0ga2V5LXZhbHVlIHBhaXJzXHJcbiAqL1xuZnVuY3Rpb24gd3JpdGVVdG1Db2RlKHVybCwgdXRtUGFyYW1zKSB7XG4gIHZhciB1dG0gPSB1cmwuaW5jbHVkZXMoJz8nKSA/ICcnIDogJz8nO1xuICB1dG0gKz0gJyZ1dG1fc291cmNlPXdlYnNpdGUmdXRtX21lZGl1bT1qZy13aWRnZXQnO1xuICB1dG0gKz0gJyYnICsgKDAsIF91dGlsc1F1ZXJ5U3RyaW5nLnF1ZXJ5U3RyaW5nU3RyaW5naWZ5KSh1dG1QYXJhbXMpO1xuICByZXR1cm4gdXRtO1xufVxuXG5leHBvcnRzWydkZWZhdWx0J10gPSB3cml0ZVV0bUNvZGU7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklrTTZMM1JsYlhBdlIwY3VSbkp2Ym5SRmJtUXVWMmxrWjJWMGN5OTNhV1JuWlhSekwyTm9ZWEpwZEhrdFpYWmxiblJ6TFdKdllYSmtMMkp2ZDJWeVgyTnZiWEJ2Ym1WdWRITXZhblZ6ZEdkcGRtbHVaeTEzYVdSblpYUXRabkpoYldWM2IzSnJMMk52YlhCdmJtVnVkSE12YkdsaUwycHpMM2RwWkdkbGRDOWhibUZzZVhScFkzTXZkM0pwZEdWVmRHMURiMlJsTG1weklsMHNJbTVoYldWeklqcGJYU3dpYldGd2NHbHVaM01pT2lKQlFVRkJMRmxCUVZrc1EwRkJRenM3T3pzN08yZERRVVYzUWl4NVFrRkJlVUk3T3pzN096czdRVUZQT1VRc1UwRkJVeXhaUVVGWkxFTkJRVVVzUjBGQlJ5eEZRVUZGTEZOQlFWTXNSVUZCUnp0QlFVTjJReXhOUVVGSkxFZEJRVWNzUjBGQlJ5eEhRVUZITEVOQlFVTXNVVUZCVVN4RFFVRkZMRWRCUVVjc1EwRkJSU3hIUVVGSExFVkJRVVVzUjBGQlJ5eEhRVUZITEVOQlFVTTdRVUZEZWtNc1MwRkJSeXc0UTBGQk9FTXNRMEZCUXp0QlFVTnNSQ3hMUVVGSExGVkJRVk1zTkVOQlFYTkNMRk5CUVZNc1EwRkJSU3hCUVVGSExFTkJRVU03UVVGRGFrUXNVMEZCVHl4SFFVRkhMRU5CUVVNN1EwRkRXRHM3Y1VKQlJXTXNXVUZCV1NJc0ltWnBiR1VpT2lKRE9pOTBaVzF3TDBkSExrWnliMjUwUlc1a0xsZHBaR2RsZEhNdmQybGtaMlYwY3k5amFHRnlhWFI1TFdWMlpXNTBjeTFpYjJGeVpDOWliM2RsY2w5amIyMXdiMjVsYm5SekwycDFjM1JuYVhacGJtY3RkMmxrWjJWMExXWnlZVzFsZDI5eWF5OWpiMjF3YjI1bGJuUnpMMnhwWWk5cWN5OTNhV1JuWlhRdllXNWhiSGwwYVdOekwzZHlhWFJsVlhSdFEyOWtaUzVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYklpZDFjMlVnYzNSeWFXTjBKenRjY2x4dVhISmNibWx0Y0c5eWRDQjdJSEYxWlhKNVUzUnlhVzVuVTNSeWFXNW5hV1o1SUgwZ1puSnZiU0FuTGk0dkxpNHZkWFJwYkhNdmNYVmxjbmxUZEhKcGJtY25PMXh5WEc1Y2NseHVMeW9xWEhKY2JpQXFJRmR5YVhSbElHRWdWVlJOSUdOdlpHVWdjM1J5YVc1bklHWnZjaUJoY0hCbGJtUnBibWNnZEc4Z1pHOXRZV2x1SUZWU1RITmNjbHh1SUNvZ1FIQmhjbUZ0SUh0VGRISnBibWQ5SUhWeWJDQjBieUJoY0hCbGJtUWdkWFJ0SUdOdlpHVWdkRzljY2x4dUlDb2dRSEJoY21GdElIdHZZbXBsWTNSOUlFaGhjMmdnYjJZZ2RYUnRJR3RsZVMxMllXeDFaU0J3WVdseWMxeHlYRzRnS2k5Y2NseHVablZ1WTNScGIyNGdkM0pwZEdWVmRHMURiMlJsS0NCMWNtd3NJSFYwYlZCaGNtRnRjeUFwSUh0Y2NseHVYSFJzWlhRZ2RYUnRJRDBnZFhKc0xtbHVZMngxWkdWektDQW5QeWNnS1NBL0lDY25JRG9nSno4bk8xeHlYRzVjZEhWMGJTQXJQU0JnSm5WMGJWOXpiM1Z5WTJVOWQyVmljMmwwWlNaMWRHMWZiV1ZrYVhWdFBXcG5MWGRwWkdkbGRHQTdYSEpjYmx4MGRYUnRJQ3M5SUdBbUpIc2djWFZsY25sVGRISnBibWRUZEhKcGJtZHBabmtvSUhWMGJWQmhjbUZ0Y3lBcElIMWdPMXh5WEc1Y2RISmxkSFZ5YmlCMWRHMDdYSEpjYm4xY2NseHVYSEpjYm1WNGNHOXlkQ0JrWldaaGRXeDBJSGR5YVhSbFZYUnRRMjlrWlR0Y2NseHVYSEpjYmlKZGZRPT0iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxyXG4gKiBFeHRyYWN0IGEgVU5JWCB0aW1lc3RhbXAgZnJvbSBpbnNpZGUgYSBzdHJpbmdcclxuICogQHBhcmFtIHtzdHJpbmd9IFN0cmluZyBmcm9tIHdoaWNoIHRvIGV4dHJhY3QgdGltZXN0YW1wXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IEV4dHJhY3RlZCB0aW1lc3RhbXAsIHR5cGVkIGFzIGludGVnZXJcclxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZ2V0UHJldHR5RGF5ID0gZ2V0UHJldHR5RGF5O1xuZXhwb3J0cy5nZXRQcmV0dHlNb250aCA9IGdldFByZXR0eU1vbnRoO1xuZXhwb3J0cy5nZXREYXRlVGltZSA9IGdldERhdGVUaW1lO1xuZXhwb3J0cy5nZXRQcmV0dHlEYXRlID0gZ2V0UHJldHR5RGF0ZTtcbmV4cG9ydHMuZ2V0UHJldHR5RGF0ZVVUQyA9IGdldFByZXR0eURhdGVVVEM7XG5leHBvcnRzLmdldFByZXR0eVllYXIgPSBnZXRQcmV0dHlZZWFyO1xuZXhwb3J0cy5nZXRQcmV0dHlZZWFyVVRDID0gZ2V0UHJldHR5WWVhclVUQztcbmZ1bmN0aW9uIGV4dHJhY3RUaW1lc3RhbXAoc3RyKSB7XG4gIHZhciByZSA9IC9cXGQrLztcbiAgcmV0dXJuIHBhcnNlSW50KHN0ci5tYXRjaChyZSlbMF0sIDEwKTtcbn1cblxuLyoqXHJcbiAqIEdldCBhIHdlZWtkYXkgbmFtZSBmcm9tIGEgbnVtZXJpY2FsIHdlZWtkYXlcclxuICogQHBhcmFtIHtTdHJpbmd9IEpHIFJFU1QgQVBJIERhdGUgc3RyaW5nXHJcbiAqIEByZXR1cm5zIHtTdHJpbmd9IFdlZWtkYXkgbmFtZVxyXG4gKi9cblxuZnVuY3Rpb24gZ2V0UHJldHR5RGF5KGRhdGUpIHtcbiAgdmFyIGFiYnIgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB0cnVlIDogYXJndW1lbnRzWzFdO1xuXG4gIHZhciBkYXkgPSBuZXcgRGF0ZShleHRyYWN0VGltZXN0YW1wKGRhdGUpKS5nZXREYXkoKTtcbiAgdmFyIGRheXMgPSBbJ1N1bmRheScsICdNb25kYXknLCAnVHVlc2RheScsICdXZWRuZXNkYXknLCAnVGh1cnNkYXknLCAnRnJpZGF5JywgJ1NhdHVyZGF5J107XG4gIHJldHVybiBhYmJyID8gZGF5c1tkYXldLnN1YnN0cmluZygwLCAzKSA6IGRheXNbZGF5XTtcbn1cblxuLyoqXHJcbiAqIEdldCBhIG1vbnRoIG5hbWUgZnJvbSBhIG51bWVyaWNhbCBtb250aFxyXG4gKiBAcGFyYW0ge1N0cmluZ30gSkcgUkVTVCBBUEkgRGF0ZSBzdHJpbmdcclxuICogQHBhcmFtIHtCb29sZWFufSBXaGV0aGVyIHRvIGFiYnJldmlhdGUgW3RvIGZpcnN0IHRocmVlIGxldHRlcnNdXHJcbiAqIEByZXR1cm5zIHtTdHJpbmd9IE1vbnRoIG5hbWVcclxuICovXG5cbmZ1bmN0aW9uIGdldFByZXR0eU1vbnRoKGRhdGUpIHtcbiAgdmFyIGFiYnIgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB0cnVlIDogYXJndW1lbnRzWzFdO1xuXG4gIHZhciBtb250aCA9IG5ldyBEYXRlKGV4dHJhY3RUaW1lc3RhbXAoZGF0ZSkpLmdldE1vbnRoKCk7XG4gIHZhciBtb250aHMgPSBbJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInXTtcbiAgcmV0dXJuIGFiYnIgPyBtb250aHNbbW9udGhdLnN1YnN0cmluZygwLCAzKSA6IG1vbnRoc1ttb250aF07XG59XG5cbi8qKlxyXG4gKiBHZXQgYSBtYWNoaW5lLXJlYWRhYmxlIGRhdGUvdGltZSBzdHJpbmdcclxuICogQHBhcmFtIHtTdHJpbmd9IEpHIFJFU1QgQVBJIERhdGUgc3RyaW5nXHJcbiAqIEByZXR1cm5zIHtTdHJpbmd9IGRhdGV0aW1lXHJcbiAqL1xuXG5mdW5jdGlvbiBnZXREYXRlVGltZShkYXRlKSB7XG4gIHJldHVybiBuZXcgRGF0ZShleHRyYWN0VGltZXN0YW1wKGRhdGUpKS50b0lTT1N0cmluZygpO1xufVxuXG4vKipcclxuICogR2V0IGEgMi1kaWdpdCBkYXRlIG51bWJlclxyXG4gKiBAcGFyYW0ge1N0cmluZ30gSkcgUkVTVCBBUEkgRGF0ZSBzdHJpbmdcclxuICogQHJldHVybnMge1N0cmluZ30gRGF0ZSBhcyBhIDItZGlnaXQgc3RyaW5nXHJcbiAqL1xuXG5mdW5jdGlvbiBnZXRQcmV0dHlEYXRlKGRhdGUpIHtcbiAgdmFyIF9kYXRlID0gbmV3IERhdGUoZXh0cmFjdFRpbWVzdGFtcChkYXRlKSkuZ2V0RGF0ZSgpICsgJyc7XG4gIHJldHVybiBfZGF0ZS5sZW5ndGggPiAxID8gX2RhdGUgOiAnMCcgKyBfZGF0ZTtcbn1cblxuLyoqXHJcbiAqIEdldCBhIDItZGlnaXQgZGF0ZSBudW1iZXIgKFVUQylcclxuICogQHBhcmFtIHtTdHJpbmd9IEpHIFJFU1QgQVBJIERhdGUgc3RyaW5nXHJcbiAqIEByZXR1cm5zIHtTdHJpbmd9IERhdGUgYXMgYSAyLWRpZ2l0IHN0cmluZyBcclxuICovXG5cbmZ1bmN0aW9uIGdldFByZXR0eURhdGVVVEMoZGF0ZSkge1xuICB2YXIgX2RhdGUgPSBuZXcgRGF0ZShleHRyYWN0VGltZXN0YW1wKGRhdGUpKS5nZXRVVENEYXRlKCkgKyAnJztcbiAgcmV0dXJuIF9kYXRlLmxlbmd0aCA+IDEgPyBfZGF0ZSA6ICcwJyArIF9kYXRlO1xufVxuXG4vKipcclxuICogR2V0IGEgeWVhclxyXG4gKiBAcGFyYW0ge1N0cmluZ30gSkcgUkVTVCBBUEkgRGF0ZSBzdHJpbmdcclxuICogQHJldHVybnMge051bWJlcn0gWWVhciBhcyAyLSBvciA0LWRpZ2l0c1xyXG4gKi9cblxuZnVuY3Rpb24gZ2V0UHJldHR5WWVhcihkYXRlKSB7XG4gIHZhciBhYmJyID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBhcmd1bWVudHNbMV07XG5cbiAgdmFyIHllYXIgPSBuZXcgRGF0ZShleHRyYWN0VGltZXN0YW1wKGRhdGUpKS5nZXRGdWxsWWVhcigpO1xuICByZXR1cm4gYWJiciA/IHllYXIuc3Vic3RyaW5nKDIsIDQpIDogeWVhcjtcbn1cblxuLyoqXHJcbiAqIEdldCBhIHllYXIgKFVUQylcclxuICogQHBhcmFtIHtTdHJpbmd9IEpHIFJFU1QgQVBJIERhdGUgc3RyaW5nIFxyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IEFiYnJldmlhdGUgdG8gMi1kaWdpdHNcclxuICogQHJldHVybnMge051bWJlcn0gWWVhciBhcyAyLSBvciA0LWRpZ2l0cyBcclxuICovXG5cbmZ1bmN0aW9uIGdldFByZXR0eVllYXJVVEMoZGF0ZSkge1xuICB2YXIgYWJiciA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogYXJndW1lbnRzWzFdO1xuXG4gIHZhciB5ZWFyID0gbmV3IERhdGUoZXh0cmFjdFRpbWVzdGFtcChkYXRlKSkuZ2V0VVRDRnVsbFllYXIoKTtcbiAgcmV0dXJuIGFiYnIgPyB5ZWFyLnN1YnN0cmluZygyLCA0KSA6IHllYXI7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJa002TDNSbGJYQXZSMGN1Um5KdmJuUkZibVF1VjJsa1oyVjBjeTkzYVdSblpYUnpMMk5vWVhKcGRIa3RaWFpsYm5SekxXSnZZWEprTDJKdmQyVnlYMk52YlhCdmJtVnVkSE12YW5WemRHZHBkbWx1WnkxM2FXUm5aWFF0Wm5KaGJXVjNiM0pyTDJOdmJYQnZibVZ1ZEhNdmJHbGlMMnB6TDNkcFpHZGxkQzl0YjJSbGJDOXdjbVYwZEhsRVlYUmxMbXB6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUpCUVVGQkxGbEJRVmtzUTBGQlF6czdPenM3T3pzN096czdPenM3T3pzN1FVRlBZaXhUUVVGVExHZENRVUZuUWl4RFFVRkhMRWRCUVVjc1JVRkJSenRCUVVOcVF5eE5RVUZKTEVWQlFVVXNSMEZCUnl4TFFVRkxMRU5CUVVNN1FVRkRaaXhUUVVGUExGRkJRVkVzUTBGQlJTeEhRVUZITEVOQlFVTXNTMEZCU3l4RFFVRkZMRVZCUVVVc1EwRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEVWQlFVVXNRMEZCUlN4RFFVRkRPME5CUXpGRE96czdPenM3T3p0QlFVOU5MRk5CUVZNc1dVRkJXU3hEUVVGSExFbEJRVWtzUlVGQll6dE5RVUZhTEVsQlFVa3NlVVJCUVVNc1NVRkJTVHM3UVVGRE4wTXNUVUZCU1N4SFFVRkhMRWRCUVVjc1NVRkJTU3hKUVVGSkxFTkJRVVVzWjBKQlFXZENMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVVVzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXp0QlFVTjBSQ3hOUVVGSkxFbEJRVWtzUjBGQlJ5eERRVU5XTEZGQlFWRXNSVUZEVWl4UlFVRlJMRVZCUTFJc1UwRkJVeXhGUVVOVUxGZEJRVmNzUlVGRFdDeFZRVUZWTEVWQlExWXNVVUZCVVN4RlFVTlNMRlZCUVZVc1EwRkRWaXhEUVVGRE8wRkJRMFlzVTBGQlR5eEpRVUZKTEVkQlFVY3NTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRExGTkJRVk1zUTBGQlF5eERRVUZETEVWQlFVVXNRMEZCUXl4RFFVRkRMRWRCUVVjc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETzBOQlEzQkVPenM3T3pzN096czdRVUZSVFN4VFFVRlRMR05CUVdNc1EwRkJSeXhKUVVGSkxFVkJRV003VFVGQldpeEpRVUZKTEhsRVFVRkRMRWxCUVVrN08wRkJReTlETEUxQlFVa3NTMEZCU3l4SFFVRkhMRWxCUVVrc1NVRkJTU3hEUVVGRkxHZENRVUZuUWl4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRkxFTkJRVU1zVVVGQlVTeEZRVUZGTEVOQlFVTTdRVUZETVVRc1RVRkJTU3hOUVVGTkxFZEJRVWNzUTBGRFVDeFRRVUZUTEVWQlExUXNWVUZCVlN4RlFVTldMRTlCUVU4c1JVRkRVQ3hQUVVGUExFVkJRMUFzUzBGQlN5eEZRVU5NTEUxQlFVMHNSVUZEVGl4TlFVRk5MRVZCUTA0c1VVRkJVU3hGUVVOU0xGZEJRVmNzUlVGRFdDeFRRVUZUTEVWQlExUXNWVUZCVlN4RlFVTldMRlZCUVZVc1EwRkRXaXhEUVVGRE8wRkJRMHdzVTBGQlR5eEpRVUZKTEVkQlFVY3NUVUZCVFN4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExGTkJRVk1zUTBGQlF5eERRVUZETEVWQlFVVXNRMEZCUXl4RFFVRkRMRWRCUVVjc1RVRkJUU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzBOQlF6VkVPenM3T3pzN096dEJRVTlOTEZOQlFWTXNWMEZCVnl4RFFVRkhMRWxCUVVrc1JVRkJSenRCUVVOd1F5eFRRVUZQTEVsQlFVa3NTVUZCU1N4RFFVRkZMR2RDUVVGblFpeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkZMRU5CUVVNc1YwRkJWeXhGUVVGRkxFTkJRVU03UTBGRGVFUTdPenM3T3pzN08wRkJUMDBzVTBGQlV5eGhRVUZoTEVOQlFVY3NTVUZCU1N4RlFVRkhPMEZCUTNSRExFMUJRVWtzUzBGQlN5eEhRVUZITEVsQlFVa3NTVUZCU1N4RFFVRkZMR2RDUVVGblFpeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkZMRU5CUVVNc1QwRkJUeXhGUVVGRkxFZEJRVWNzUlVGQlJTeERRVUZETzBGQlF6bEVMRk5CUVU4c1MwRkJTeXhEUVVGRExFMUJRVTBzUjBGQlJ5eERRVUZETEVkQlFVY3NTMEZCU3l4VFFVRlBMRXRCUVVzc1FVRkJSU3hEUVVGRE8wTkJRemxET3pzN096czdPenRCUVU5TkxGTkJRVk1zWjBKQlFXZENMRU5CUVVVc1NVRkJTU3hGUVVGSE8wRkJRM2hETEUxQlFVa3NTMEZCU3l4SFFVRkhMRWxCUVVrc1NVRkJTU3hEUVVGRExHZENRVUZuUWl4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFTkJRVU1zVlVGQlZTeEZRVUZGTEVkQlFVY3NSVUZCUlN4RFFVRkRPMEZCUXk5RUxGTkJRVThzUzBGQlN5eERRVUZETEUxQlFVMHNSMEZCUnl4RFFVRkRMRWRCUVVjc1MwRkJTeXhUUVVGUExFdEJRVXNzUVVGQlJTeERRVUZETzBOQlF6bERPenM3T3pzN096dEJRVTlOTEZOQlFWTXNZVUZCWVN4RFFVRkhMRWxCUVVrc1JVRkJaVHROUVVGaUxFbEJRVWtzZVVSQlFVTXNTMEZCU3pzN1FVRkRMME1zVFVGQlNTeEpRVUZKTEVkQlFVY3NTVUZCU1N4SlFVRkpMRU5CUVVVc1owSkJRV2RDTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVVc1EwRkJReXhYUVVGWExFVkJRVVVzUTBGQlF6dEJRVU0xUkN4VFFVRlBMRWxCUVVrc1IwRkJSeXhKUVVGSkxFTkJRVU1zVTBGQlV5eERRVUZETEVOQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNc1IwRkJSeXhKUVVGSkxFTkJRVU03UTBGRE1VTTdPenM3T3pzN096dEJRVkZOTEZOQlFWTXNaMEpCUVdkQ0xFTkJRVU1zU1VGQlNTeEZRVUZqTzAxQlFWb3NTVUZCU1N4NVJFRkJReXhMUVVGTE96dEJRVU5vUkN4TlFVRkpMRWxCUVVrc1IwRkJSeXhKUVVGSkxFbEJRVWtzUTBGQlJTeG5Ra0ZCWjBJc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlJTeERRVUZETEdOQlFXTXNSVUZCUlN4RFFVRkRPMEZCUXk5RUxGTkJRVThzU1VGQlNTeEhRVUZITEVsQlFVa3NRMEZCUXl4VFFVRlRMRU5CUVVNc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXp0RFFVTXhReUlzSW1acGJHVWlPaUpET2k5MFpXMXdMMGRITGtaeWIyNTBSVzVrTGxkcFpHZGxkSE12ZDJsa1oyVjBjeTlqYUdGeWFYUjVMV1YyWlc1MGN5MWliMkZ5WkM5aWIzZGxjbDlqYjIxd2IyNWxiblJ6TDJwMWMzUm5hWFpwYm1jdGQybGtaMlYwTFdaeVlXMWxkMjl5YXk5amIyMXdiMjVsYm5SekwyeHBZaTlxY3k5M2FXUm5aWFF2Ylc5a1pXd3ZjSEpsZEhSNVJHRjBaUzVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYklpZDFjMlVnYzNSeWFXTjBKenRjY2x4dVhISmNiaThxS2x4eVhHNGdLaUJGZUhSeVlXTjBJR0VnVlU1SldDQjBhVzFsYzNSaGJYQWdabkp2YlNCcGJuTnBaR1VnWVNCemRISnBibWRjY2x4dUlDb2dRSEJoY21GdElIdHpkSEpwYm1kOUlGTjBjbWx1WnlCbWNtOXRJSGRvYVdOb0lIUnZJR1Y0ZEhKaFkzUWdkR2x0WlhOMFlXMXdYSEpjYmlBcUlFQnlaWFIxY201eklIdHVkVzFpWlhKOUlFVjRkSEpoWTNSbFpDQjBhVzFsYzNSaGJYQXNJSFI1Y0dWa0lHRnpJR2x1ZEdWblpYSmNjbHh1SUNvdlhISmNibVoxYm1OMGFXOXVJR1Y0ZEhKaFkzUlVhVzFsYzNSaGJYQWdLQ0J6ZEhJZ0tTQjdYSEpjYmx4MGJHVjBJSEpsSUQwZ0wxeGNaQ3N2TzF4eVhHNWNkSEpsZEhWeWJpQndZWEp6WlVsdWRDZ2djM1J5TG0xaGRHTm9LQ0J5WlNBcFd6QmRMQ0F4TUNBcE8xeDBYSEpjYm4xY2NseHVYSEpjYmk4cUtseHlYRzRnS2lCSFpYUWdZU0IzWldWclpHRjVJRzVoYldVZ1puSnZiU0JoSUc1MWJXVnlhV05oYkNCM1pXVnJaR0Y1WEhKY2JpQXFJRUJ3WVhKaGJTQjdVM1J5YVc1bmZTQktSeUJTUlZOVUlFRlFTU0JFWVhSbElITjBjbWx1WjF4eVhHNGdLaUJBY21WMGRYSnVjeUI3VTNSeWFXNW5mU0JYWldWclpHRjVJRzVoYldWY2NseHVJQ292WEhKY2JtVjRjRzl5ZENCbWRXNWpkR2x2YmlCblpYUlFjbVYwZEhsRVlYa2dLQ0JrWVhSbExDQmhZbUp5UFhSeWRXVWdLU0I3WEhKY2JseDBiR1YwSUdSaGVTQTlJRzVsZHlCRVlYUmxLQ0JsZUhSeVlXTjBWR2x0WlhOMFlXMXdLR1JoZEdVcElDa3VaMlYwUkdGNUtDazdYSEpjYmx4MGJHVjBJR1JoZVhNZ1BTQmJYSEpjYmx4MFhIUW5VM1Z1WkdGNUp5eGNjbHh1WEhSY2RDZE5iMjVrWVhrbkxGeHlYRzVjZEZ4MEoxUjFaWE5rWVhrbkxGeHlYRzVjZEZ4MEoxZGxaRzVsYzJSaGVTY3NYSEpjYmx4MFhIUW5WR2gxY25Oa1lYa25MRnh5WEc1Y2RGeDBKMFp5YVdSaGVTY3NYSEpjYmx4MFhIUW5VMkYwZFhKa1lYa25YSEpjYmx4MFhUdGNjbHh1WEhSeVpYUjFjbTRnWVdKaWNpQS9JR1JoZVhOYlpHRjVYUzV6ZFdKemRISnBibWNvTUN3Z015a2dPaUJrWVhselcyUmhlVjA3WEhKY2JuMWNjbHh1WEhKY2JpOHFLbHh5WEc0Z0tpQkhaWFFnWVNCdGIyNTBhQ0J1WVcxbElHWnliMjBnWVNCdWRXMWxjbWxqWVd3Z2JXOXVkR2hjY2x4dUlDb2dRSEJoY21GdElIdFRkSEpwYm1kOUlFcEhJRkpGVTFRZ1FWQkpJRVJoZEdVZ2MzUnlhVzVuWEhKY2JpQXFJRUJ3WVhKaGJTQjdRbTl2YkdWaGJuMGdWMmhsZEdobGNpQjBieUJoWW1KeVpYWnBZWFJsSUZ0MGJ5Qm1hWEp6ZENCMGFISmxaU0JzWlhSMFpYSnpYVnh5WEc0Z0tpQkFjbVYwZFhKdWN5QjdVM1J5YVc1bmZTQk5iMjUwYUNCdVlXMWxYSEpjYmlBcUwxeHlYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdaMlYwVUhKbGRIUjVUVzl1ZEdnZ0tDQmtZWFJsTENCaFltSnlQWFJ5ZFdVZ0tTQjdYSEpjYmx4MGJHVjBJRzF2Ym5Sb0lEMGdibVYzSUVSaGRHVW9JR1Y0ZEhKaFkzUlVhVzFsYzNSaGJYQW9aR0YwWlNrZ0tTNW5aWFJOYjI1MGFDZ3BPMXh5WEc1Y2RHeGxkQ0J0YjI1MGFITWdQU0JiWEhKY2JpQWdJQ0FnSUNBblNtRnVkV0Z5ZVNjc0lGeHlYRzRnSUNBZ0lDQWdKMFpsWW5KMVlYSjVKeXhjY2x4dUlDQWdJQ0FnSUNkTllYSmphQ2NzWEhKY2JpQWdJQ0FnSUNBblFYQnlhV3duTEZ4eVhHNGdJQ0FnSUNBZ0owMWhlU2NzWEhKY2JpQWdJQ0FnSUNBblNuVnVaU2NzWEhKY2JpQWdJQ0FnSUNBblNuVnNlU2NzWEhKY2JpQWdJQ0FnSUNBblFYVm5kWE4wSnl4Y2NseHVJQ0FnSUNBZ0lDZFRaWEIwWlcxaVpYSW5MRnh5WEc0Z0lDQWdJQ0FnSjA5amRHOWlaWEluTEZ4eVhHNGdJQ0FnSUNBZ0owNXZkbVZ0WW1WeUp5eGNjbHh1SUNBZ0lDQWdJQ2RFWldObGJXSmxjaWRjY2x4dUlDQWdYSFJkTzF4eVhHNWNkSEpsZEhWeWJpQmhZbUp5SUQ4Z2JXOXVkR2h6VzIxdmJuUm9YUzV6ZFdKemRISnBibWNvTUN3Z015a2dPaUJ0YjI1MGFITmJiVzl1ZEdoZE8xeHlYRzU5WEhKY2JseHlYRzR2S2lwY2NseHVJQ29nUjJWMElHRWdiV0ZqYUdsdVpTMXlaV0ZrWVdKc1pTQmtZWFJsTDNScGJXVWdjM1J5YVc1blhISmNiaUFxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0JLUnlCU1JWTlVJRUZRU1NCRVlYUmxJSE4wY21sdVoxeHlYRzRnS2lCQWNtVjBkWEp1Y3lCN1UzUnlhVzVuZlNCa1lYUmxkR2x0WlZ4eVhHNGdLaTljY2x4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUdkbGRFUmhkR1ZVYVcxbElDZ2daR0YwWlNBcElIdGNjbHh1WEhSeVpYUjFjbTRnYm1WM0lFUmhkR1VvSUdWNGRISmhZM1JVYVcxbGMzUmhiWEFvWkdGMFpTa2dLUzUwYjBsVFQxTjBjbWx1WnlncE8xeHlYRzU5WEhKY2JseHlYRzR2S2lwY2NseHVJQ29nUjJWMElHRWdNaTFrYVdkcGRDQmtZWFJsSUc1MWJXSmxjbHh5WEc0Z0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ1NrY2dVa1ZUVkNCQlVFa2dSR0YwWlNCemRISnBibWRjY2x4dUlDb2dRSEpsZEhWeWJuTWdlMU4wY21sdVozMGdSR0YwWlNCaGN5QmhJREl0WkdsbmFYUWdjM1J5YVc1blhISmNiaUFxTDF4eVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1oyVjBVSEpsZEhSNVJHRjBaU0FvSUdSaGRHVWdLU0I3WEhKY2JseDBiR1YwSUY5a1lYUmxJRDBnYm1WM0lFUmhkR1VvSUdWNGRISmhZM1JVYVcxbGMzUmhiWEFvWkdGMFpTa2dLUzVuWlhSRVlYUmxLQ2tnS3lBbkp6dGNjbHh1WEhSeVpYUjFjbTRnWDJSaGRHVXViR1Z1WjNSb0lENGdNU0EvSUY5a1lYUmxJRG9nWURBa2UxOWtZWFJsZldBN1hISmNibjFjY2x4dVhISmNiaThxS2x4eVhHNGdLaUJIWlhRZ1lTQXlMV1JwWjJsMElHUmhkR1VnYm5WdFltVnlJQ2hWVkVNcFhISmNiaUFxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0JLUnlCU1JWTlVJRUZRU1NCRVlYUmxJSE4wY21sdVoxeHlYRzRnS2lCQWNtVjBkWEp1Y3lCN1UzUnlhVzVuZlNCRVlYUmxJR0Z6SUdFZ01pMWthV2RwZENCemRISnBibWNnWEhKY2JpQXFMMXh5WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWjJWMFVISmxkSFI1UkdGMFpWVlVReWdnWkdGMFpTQXBJSHRjY2x4dVhIUnNaWFFnWDJSaGRHVWdQU0J1WlhjZ1JHRjBaU2hsZUhSeVlXTjBWR2x0WlhOMFlXMXdLR1JoZEdVcEtTNW5aWFJWVkVORVlYUmxLQ2tnS3lBbkp6dGNjbHh1WEhSeVpYUjFjbTRnWDJSaGRHVXViR1Z1WjNSb0lENGdNU0EvSUY5a1lYUmxJRG9nWURBa2UxOWtZWFJsZldBN1hISmNibjFjY2x4dVhISmNiaThxS2x4eVhHNGdLaUJIWlhRZ1lTQjVaV0Z5WEhKY2JpQXFJRUJ3WVhKaGJTQjdVM1J5YVc1bmZTQktSeUJTUlZOVUlFRlFTU0JFWVhSbElITjBjbWx1WjF4eVhHNGdLaUJBY21WMGRYSnVjeUI3VG5WdFltVnlmU0JaWldGeUlHRnpJREl0SUc5eUlEUXRaR2xuYVhSelhISmNiaUFxTDF4eVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1oyVjBVSEpsZEhSNVdXVmhjaUFvSUdSaGRHVXNJR0ZpWW5JOVptRnNjMlVnS1NCN1hISmNibHgwYkdWMElIbGxZWElnUFNCdVpYY2dSR0YwWlNnZ1pYaDBjbUZqZEZScGJXVnpkR0Z0Y0Noa1lYUmxLU0FwTG1kbGRFWjFiR3haWldGeUtDazdYSEpjYmx4MGNtVjBkWEp1SUdGaVluSWdQeUI1WldGeUxuTjFZbk4wY21sdVp5Z3lMQ0EwS1NBNklIbGxZWEk3WEhKY2JuMWNjbHh1WEhKY2JpOHFLbHh5WEc0Z0tpQkhaWFFnWVNCNVpXRnlJQ2hWVkVNcFhISmNiaUFxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0JLUnlCU1JWTlVJRUZRU1NCRVlYUmxJSE4wY21sdVp5QmNjbHh1SUNvZ1FIQmhjbUZ0SUh0Q2IyOXNaV0Z1ZlNCQlltSnlaWFpwWVhSbElIUnZJREl0WkdsbmFYUnpYSEpjYmlBcUlFQnlaWFIxY201eklIdE9kVzFpWlhKOUlGbGxZWElnWVhNZ01pMGdiM0lnTkMxa2FXZHBkSE1nWEhKY2JpQXFMMXh5WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWjJWMFVISmxkSFI1V1dWaGNsVlVReWhrWVhSbExDQmhZbUp5UFdaaGJITmxLU0I3WEhKY2JseDBiR1YwSUhsbFlYSWdQU0J1WlhjZ1JHRjBaU2dnWlhoMGNtRmpkRlJwYldWemRHRnRjQ2hrWVhSbEtTQXBMbWRsZEZWVVEwWjFiR3haWldGeUtDazdYSEpjYmx4MGNtVjBkWEp1SUdGaVluSWdQeUI1WldGeUxuTjFZbk4wY21sdVp5Z3lMQ0EwS1NBNklIbGxZWEk3WEhKY2JuMGlYWDA9IiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcclxuICogV3JpdGUgYSBKRyBldmVudHMgdXJsIFxyXG4gKiBAcGFyYW0ge29iamVjdH0gRWl0aGVyIGFuIG9iamVjdCBvciBhcnJheSBvZiBvYmplY3RzIHRvIGF1Z21lbnRcclxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBuYW1lIG9mIHRoZSB1cmxcclxuICogQHBhcmFtIHtzdHJpbmd9IElkIG9mIHRoZSBjaGFyaXR5IGV2ZW50XHJcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLndyaXRlRXZlbnRVcmwgPSB3cml0ZUV2ZW50VXJsO1xuXG5mdW5jdGlvbiB3cml0ZUV2ZW50VXJsKG9iaiwga2V5TmFtZSwgY2hhcml0eUlkKSB7XG4gIHZhciBldmVudElkID0gb2JqLmlkO1xuICBpZiAoa2V5TmFtZSAmJiBjaGFyaXR5SWQpIHtcbiAgICBvYmpba2V5TmFtZV0gPSAnaHR0cHM6Ly93d3cuanVzdGdpdmluZy5jb20vZnVuZHJhaXNpbmctcGFnZS9jcmVhdGlvbi8/Y2lkPScgKyBjaGFyaXR5SWQgKyAnJmVpZD0nICsgZXZlbnRJZDtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWtNNkwzUmxiWEF2UjBjdVJuSnZiblJGYm1RdVYybGtaMlYwY3k5M2FXUm5aWFJ6TDJOb1lYSnBkSGt0WlhabGJuUnpMV0p2WVhKa0wySnZkMlZ5WDJOdmJYQnZibVZ1ZEhNdmFuVnpkR2RwZG1sdVp5MTNhV1JuWlhRdFpuSmhiV1YzYjNKckwyTnZiWEJ2Ym1WdWRITXZiR2xpTDJwekwzZHBaR2RsZEM5dGIyUmxiQzkzY21sMFpWVnliQzVxY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pUVVGQlFTeFpRVUZaTEVOQlFVTTdPenM3T3pzN096czdPenM3UVVGUlRDeFRRVUZUTEdGQlFXRXNRMEZCUnl4SFFVRkhMRVZCUVVVc1QwRkJUeXhGUVVGRkxGTkJRVk1zUlVGQlJ6dEJRVU14UkN4TlFVRkpMRTlCUVU4c1IwRkJSeXhIUVVGSExFTkJRVU1zUlVGQlJTeERRVUZETzBGQlEzSkNMRTFCUVVzc1QwRkJUeXhKUVVGSkxGTkJRVk1zUlVGQlJ6dEJRVU16UWl4UFFVRkhMRU5CUVVNc1QwRkJUeXhEUVVGRExHdEZRVUZ4UlN4VFFVRlRMR0ZCUVZFc1QwRkJUeXhCUVVGRkxFTkJRVU03UjBGRE5VYzdRVUZEUkN4VFFVRlBMRWRCUVVjc1EwRkJRenREUVVOWUlpd2labWxzWlNJNklrTTZMM1JsYlhBdlIwY3VSbkp2Ym5SRmJtUXVWMmxrWjJWMGN5OTNhV1JuWlhSekwyTm9ZWEpwZEhrdFpYWmxiblJ6TFdKdllYSmtMMkp2ZDJWeVgyTnZiWEJ2Ym1WdWRITXZhblZ6ZEdkcGRtbHVaeTEzYVdSblpYUXRabkpoYldWM2IzSnJMMk52YlhCdmJtVnVkSE12YkdsaUwycHpMM2RwWkdkbGRDOXRiMlJsYkM5M2NtbDBaVlZ5YkM1cWN5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJaWQxYzJVZ2MzUnlhV04wSnp0Y2NseHVYSEpjYmk4cUtseHlYRzRnS2lCWGNtbDBaU0JoSUVwSElHVjJaVzUwY3lCMWNtd2dYSEpjYmlBcUlFQndZWEpoYlNCN2IySnFaV04wZlNCRmFYUm9aWElnWVc0Z2IySnFaV04wSUc5eUlHRnljbUY1SUc5bUlHOWlhbVZqZEhNZ2RHOGdZWFZuYldWdWRGeHlYRzRnS2lCQWNHRnlZVzBnZTNOMGNtbHVaMzBnYTJWNUlHNWhiV1VnYjJZZ2RHaGxJSFZ5YkZ4eVhHNGdLaUJBY0dGeVlXMGdlM04wY21sdVozMGdTV1FnYjJZZ2RHaGxJR05vWVhKcGRIa2daWFpsYm5SY2NseHVJQ292WEhKY2JpQmxlSEJ2Y25RZ1puVnVZM1JwYjI0Z2QzSnBkR1ZGZG1WdWRGVnliQ0FvSUc5aWFpd2dhMlY1VG1GdFpTd2dZMmhoY21sMGVVbGtJQ2tnZTF4eVhHNWNkR3hsZENCbGRtVnVkRWxrSUQwZ2IySnFMbWxrTzF4eVhHNWNkR2xtSUNnZ2EyVjVUbUZ0WlNBbUppQmphR0Z5YVhSNVNXUWdLU0I3WEhKY2JseDBYSFJ2WW1wYmEyVjVUbUZ0WlYwZ1BTQmdhSFIwY0hNNlhGd3ZYRnd2ZDNkM0xtcDFjM1JuYVhacGJtY3VZMjl0WEZ3dlpuVnVaSEpoYVhOcGJtY3RjR0ZuWlZ4Y0wyTnlaV0YwYVc5dVhGd3ZQMk5wWkQwa2UyTm9ZWEpwZEhsSlpIMG1aV2xrUFNSN1pYWmxiblJKWkgxZ08xeHlYRzVjZEgxY2NseHVYSFJ5WlhSMWNtNGdiMkpxTzF4eVhHNTlYSEpjYmlKZGZRPT0iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcblx0dmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgndmFsdWUnIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG52YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeCwgX3gyLCBfeDMpIHsgdmFyIF9hZ2FpbiA9IHRydWU7IF9mdW5jdGlvbjogd2hpbGUgKF9hZ2FpbikgeyB2YXIgb2JqZWN0ID0gX3gsIHByb3BlcnR5ID0gX3gyLCByZWNlaXZlciA9IF94MzsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeCA9IHBhcmVudDsgX3gyID0gcHJvcGVydHk7IF94MyA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBkZXNjID0gcGFyZW50ID0gdW5kZWZpbmVkOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmICgndmFsdWUnIGluIGRlc2MpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9IH07XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsgfSB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICdmdW5jdGlvbicgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICcgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBfanVzdGdpdmluZ1dpZGdldEZyYW1ld29ya0NvbXBvbmVudHNMaWJKc0ZyYW1ld29ya1dpZGdldCA9IHJlcXVpcmUoJ2p1c3RnaXZpbmctd2lkZ2V0LWZyYW1ld29yay9jb21wb25lbnRzL2xpYi9qcy9mcmFtZXdvcmsvV2lkZ2V0Jyk7XG5cbnZhciBfanVzdGdpdmluZ1dpZGdldEZyYW1ld29ya0NvbXBvbmVudHNMaWJKc0ZyYW1ld29ya1dpZGdldDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzRnJhbWV3b3JrV2lkZ2V0KTtcblxudmFyIF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkNhcm91c2VsQ2Fyb3VzZWwgPSByZXF1aXJlKCdqdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvY2Fyb3VzZWwvQ2Fyb3VzZWwnKTtcblxudmFyIF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkNhcm91c2VsQ2Fyb3VzZWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfanVzdGdpdmluZ1dpZGdldEZyYW1ld29ya0NvbXBvbmVudHNMaWJDYXJvdXNlbENhcm91c2VsKTtcblxudmFyIF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzRnJhbWV3b3JrTW9kZWwgPSByZXF1aXJlKCdqdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvZnJhbWV3b3JrL01vZGVsJyk7XG5cbnZhciBfanVzdGdpdmluZ1dpZGdldEZyYW1ld29ya0NvbXBvbmVudHNMaWJKc0ZyYW1ld29ya01vZGVsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNGcmFtZXdvcmtNb2RlbCk7XG5cbnZhciBfanVzdGdpdmluZ1dpZGdldEZyYW1ld29ya0NvbXBvbmVudHNMaWJKc0ZyYW1ld29ya1ZpZXcgPSByZXF1aXJlKCdqdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvZnJhbWV3b3JrL1ZpZXcnKTtcblxudmFyIF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzRnJhbWV3b3JrVmlldzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzRnJhbWV3b3JrVmlldyk7XG5cbnZhciBfTW9kZWxFdmVudHMgPSByZXF1aXJlKCcuL01vZGVsRXZlbnRzJyk7XG5cbnZhciBfTW9kZWxFdmVudHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTW9kZWxFdmVudHMpO1xuXG4vKipcclxuICogQ3JlYXRlIGEgY2hhcml0eSBldmVudHMgYm9hcmQgd2lkZ2V0XHJcbiAqL1xudmFyIFByb21pc2UgPSByZXF1aXJlKCdlczYtcHJvbWlzZScpLlByb21pc2U7XG5cbnZhciBDaGFyaXR5RXZlbnRzQm9hcmQgPSAoZnVuY3Rpb24gKF9XaWRnZXQpIHtcblx0X2luaGVyaXRzKENoYXJpdHlFdmVudHNCb2FyZCwgX1dpZGdldCk7XG5cblx0ZnVuY3Rpb24gQ2hhcml0eUV2ZW50c0JvYXJkKG9wdGlvbnMpIHtcblx0XHRfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2hhcml0eUV2ZW50c0JvYXJkKTtcblxuXHRcdF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKENoYXJpdHlFdmVudHNCb2FyZC5wcm90b3R5cGUpLCAnY29uc3RydWN0b3InLCB0aGlzKS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXHRcdHRoaXMuaW5pdCgpO1xuXHR9XG5cblx0LyoqXHJcbiAgKiBJbml0aWFsaXNlIHRoZSBldmVudHMgYm9hcmRcclxuICAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgYW5kIGNhY2hlIG5ldyBldmVudHMgbW9kZWwgYW5kIGNoYXJpdHkgbW9kZWw7IGJvb3RzdHJhcCB0aGUgd2lkZ2V0XHJcbiAgKi9cblxuXHRfY3JlYXRlQ2xhc3MoQ2hhcml0eUV2ZW50c0JvYXJkLCBbe1xuXHRcdGtleTogJ2luaXQnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBpbml0KCkge1xuXHRcdFx0X2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ2hhcml0eUV2ZW50c0JvYXJkLnByb3RvdHlwZSksICdpbml0JywgdGhpcykuY2FsbCh0aGlzKTtcblx0XHRcdHRoaXMuZXZlbnRzTW9kZWwgPSBuZXcgX01vZGVsRXZlbnRzMlsnZGVmYXVsdCddKHtcblx0XHRcdFx0d2lkZ2V0OiB0aGlzLFxuXHRcdFx0XHR1cmw6ICdodHRwczovL2FwaS5qdXN0Z2l2aW5nLmNvbS8nICsgdGhpcy5hcHBJZCArICcvdjEvY2hhcml0eS8nICsgdGhpcy5jb25maWcuaWQgKyAnL2V2ZW50cycsXG5cdFx0XHRcdGlzUGFnaW5hdGVkOiB0cnVlLFxuXHRcdFx0XHRjb2xsZWN0aW9uUGF0aDogJ2V2ZW50cydcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5jaGFyaXR5TW9kZWwgPSBuZXcgX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNGcmFtZXdvcmtNb2RlbDJbJ2RlZmF1bHQnXSh7XG5cdFx0XHRcdHdpZGdldDogdGhpcyxcblx0XHRcdFx0dXJsOiAnaHR0cHM6Ly9hcGkuanVzdGdpdmluZy5jb20vJyArIHRoaXMuYXBwSWQgKyAnL3YxL2NoYXJpdHkvJyArIHRoaXMuY29uZmlnLmlkXG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuYm9vdHN0cmFwKCk7XG5cdFx0fVxuXG5cdFx0LyoqXHJcbiAgICogQm9vdHN0cmFwIHRoZSB3aWRnZXRcclxuICAgKiBAZGVzY3JpcHRpb24gRmV0Y2ggYWxsIHNlcnZlciBkYXRhIGZvciBldmVudHMgYW5kIGNoYXJpdHkgbW9kZWw7IHRoZW4gY3JlYXRlIGFuZCByZW5kZXIgbmV3IGNoYXJpdHkgYW5kIGV2ZW50cyB2aWV3cztcclxuICAgKiByZXNldCB0aGUgd2lkZ2V0IGhlaWdodCBhbmQgY3JlYXRlIG5ldyBjYXJvdXNlbCBvbiB0aGUgZXZlbnRzIHZpZXc7IGZpbmFsbHkgaW5pdGlhbGlzZSBhIG5ldyBhbmFseXRpY3MgaW5zdGFuY2Ugb24gdGhlIHdpZGdldFxyXG4gICAqL1xuXHR9LCB7XG5cdFx0a2V5OiAnYm9vdHN0cmFwJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gYm9vdHN0cmFwKCkge1xuXHRcdFx0dmFyIF90aGlzID0gdGhpcztcblxuXHRcdFx0UHJvbWlzZS5hbGwoW3RoaXMuZXZlbnRzTW9kZWwuZ2V0TmV4dFBhZ2UoKSwgdGhpcy5jaGFyaXR5TW9kZWwuZ2V0TW9kZWwoKV0pLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHQvLyBDaGFyaXR5IFZpZXdcblx0XHRcdFx0X3RoaXMuY2hhcml0eVZpZXcgPSBuZXcgX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNGcmFtZXdvcmtWaWV3MlsnZGVmYXVsdCddKHtcblx0XHRcdFx0XHR3aWRnZXQ6IF90aGlzLFxuXHRcdFx0XHRcdGVsOiAnW2RhdGEtdmlldy1jaGFyaXR5XScsXG5cdFx0XHRcdFx0dGVtcGxhdGU6ICdbZGF0YS10bXBsLWNoYXJpdHldJyxcblx0XHRcdFx0XHRtb2RlbDogX3RoaXMuY2hhcml0eU1vZGVsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRfdGhpcy5jaGFyaXR5Vmlldy5yZW5kZXIoe1xuXHRcdFx0XHRcdGNoYXJpdHlJZDogX3RoaXMuY2hhcml0eVZpZXcubW9kZWwuJG1vZGVsLmlkLFxuXHRcdFx0XHRcdGNoYXJpdHlOYW1lOiBfdGhpcy5jaGFyaXR5Vmlldy5tb2RlbC4kbW9kZWwubmFtZVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKF90aGlzLmV2ZW50c01vZGVsLmNvbGxlY3Rpb24ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdC8vIEV2ZW50cyB2aWV3XG5cdFx0XHRcdFx0X3RoaXMuZXZlbnRzVmlldyA9IG5ldyBfanVzdGdpdmluZ1dpZGdldEZyYW1ld29ya0NvbXBvbmVudHNMaWJKc0ZyYW1ld29ya1ZpZXcyWydkZWZhdWx0J10oe1xuXHRcdFx0XHRcdFx0d2lkZ2V0OiBfdGhpcyxcblx0XHRcdFx0XHRcdGVsOiAnW2RhdGEtdmlldy1ldmVudHNdJyxcblx0XHRcdFx0XHRcdHRlbXBsYXRlOiAnW2RhdGEtdG1wbC1ldmVudHNdJ1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdF90aGlzLmV2ZW50c1ZpZXcucmVuZGVyKHtcblx0XHRcdFx0XHRcdHZpZXdOYW1lOiAnZXZlbnRzJyxcblx0XHRcdFx0XHRcdGhhc0Nhcm91c2VsOiAndHJ1ZSdcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHQvLyBFdmVudHMgbGlzdCB2aWV3XG5cdFx0XHRcdFx0X3RoaXMuZXZlbnRzTGlzdFZpZXcgPSBuZXcgX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNGcmFtZXdvcmtWaWV3MlsnZGVmYXVsdCddKHtcblx0XHRcdFx0XHRcdHdpZGdldDogX3RoaXMsXG5cdFx0XHRcdFx0XHRlbDogJ1tkYXRhLXZpZXctZXZlbnRzLWxpc3RdJyxcblx0XHRcdFx0XHRcdHRlbXBsYXRlOiAnW2RhdGEtdG1wbC1ldmVudHMtbGlzdF0nLFxuXHRcdFx0XHRcdFx0bW9kZWw6IF90aGlzLmV2ZW50c01vZGVsXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0X3RoaXMuZXZlbnRzTGlzdFZpZXcucmVuZGVyKHtcblx0XHRcdFx0XHRcdGV2ZW50czogX3RoaXMuZXZlbnRzTGlzdFZpZXcubW9kZWwuY29sbGVjdGlvblxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vTm8gZXZlbnRzIHRvIHNob3dcblx0XHRcdFx0XHRfdGhpcy5ldmVudHNWaWV3ID0gbmV3IF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzRnJhbWV3b3JrVmlldzJbJ2RlZmF1bHQnXSh7XG5cdFx0XHRcdFx0XHR3aWRnZXQ6IF90aGlzLFxuXHRcdFx0XHRcdFx0ZWw6ICdbZGF0YS12aWV3LWV2ZW50c10nLFxuXHRcdFx0XHRcdFx0dGVtcGxhdGU6ICdbZGF0YS10bXBsLW5vLWV2ZW50c10nLFxuXHRcdFx0XHRcdFx0bW9kZWw6IF90aGlzLmNoYXJpdHlNb2RlbFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdF90aGlzLmV2ZW50c1ZpZXcucmVuZGVyKHtcblx0XHRcdFx0XHRcdGNoYXJpdHlOYW1lOiBfdGhpcy5jaGFyaXR5Vmlldy5tb2RlbC4kbW9kZWwubmFtZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIEZvb3RlciBWaWV3XG5cdFx0XHRcdF90aGlzLmZvb3RlclZpZXcgPSBuZXcgX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNGcmFtZXdvcmtWaWV3MlsnZGVmYXVsdCddKHtcblx0XHRcdFx0XHR3aWRnZXQ6IF90aGlzLFxuXHRcdFx0XHRcdGVsOiAnW2RhdGEtdmlldy1mb290ZXJdJyxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogJ1tkYXRhLXRtcGwtZm9vdGVyXScsXG5cdFx0XHRcdFx0bW9kZWw6IF90aGlzLmNoYXJpdHlNb2RlbFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0X3RoaXMuZm9vdGVyVmlldy5yZW5kZXIoe1xuXHRcdFx0XHRcdHByb2ZpbGVQYWdlVXJsOiBfdGhpcy5jaGFyaXR5Vmlldy5tb2RlbC4kbW9kZWwucHJvZmlsZVBhZ2VVcmxcblx0XHRcdFx0fSk7XG5cdFx0XHR9KS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0X3RoaXMucmVzZXRIZWlnaHQoKTtcblx0XHRcdFx0aWYgKF90aGlzLmV2ZW50c01vZGVsLmNvbGxlY3Rpb24ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdF90aGlzLmNhcm91c2VsID0gbmV3IF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkNhcm91c2VsQ2Fyb3VzZWwyWydkZWZhdWx0J10oe1xuXHRcdFx0XHRcdFx0ZWw6ICdbZGF0YS1jYXJvdXNlbD1cImV2ZW50c1wiXScsXG5cdFx0XHRcdFx0XHRpc0luZmluaXRlOiB0cnVlLFxuXHRcdFx0XHRcdFx0d2lkZ2V0OiBfdGhpcyxcblx0XHRcdFx0XHRcdHZpZXc6IF90aGlzLmV2ZW50c0xpc3RWaWV3XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0X3RoaXMuYW5hbHl0aWNzID0gX3RoaXMuaW5pdEFuYWx5dGljcygpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XSk7XG5cblx0cmV0dXJuIENoYXJpdHlFdmVudHNCb2FyZDtcbn0pKF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzRnJhbWV3b3JrV2lkZ2V0MlsnZGVmYXVsdCddKTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gQ2hhcml0eUV2ZW50c0JvYXJkO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJa002TDNSbGJYQXZSMGN1Um5KdmJuUkZibVF1VjJsa1oyVjBjeTkzYVdSblpYUnpMMk5vWVhKcGRIa3RaWFpsYm5SekxXSnZZWEprTDNOeVl5OXpZM0pwY0hSekwyRndjQzlEYUdGeWFYUjVSWFpsYm5SelFtOWhjbVF1YW5NaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWtGQlFVRXNXVUZCV1N4RFFVRkRPenM3T3pzN096czdPenM3T3pzN08zVkZRVWROTEdkRlFVRm5SVHM3T3p0elJVRkRPVVFzT0VSQlFUaEVPenM3TzNORlFVTnFSU3dyUkVGQkswUTdPenM3Y1VWQlEyaEZMRGhFUVVFNFJEczdPenN5UWtGRGRrUXNaVUZCWlRzN096czdPenRCUVV4MlF5eEpRVUZKTEU5QlFVOHNSMEZCUnl4UFFVRlBMRU5CUVVNc1lVRkJZU3hEUVVGRExFTkJRVU1zVDBGQlR5eERRVUZET3p0SlFWVjJReXhyUWtGQmEwSTdWMEZCYkVJc2EwSkJRV3RDT3p0QlFVTllMRlZCUkZBc2EwSkJRV3RDTEVOQlExUXNUMEZCVHl4RlFVRkhPM2RDUVVSdVFpeHJRa0ZCYTBJN08wRkJSWFJDTERaQ1FVWkpMR3RDUVVGclFpdzJRMEZGWml4UFFVRlBMRVZCUVVjN1FVRkRha0lzVFVGQlNTeERRVUZETEVsQlFVa3NSVUZCUlN4RFFVRkRPMFZCUTFvN096czdPenM3WTBGS1NTeHJRa0ZCYTBJN08xTkJVMnhDTEdkQ1FVRkhPMEZCUTFBc09FSkJWa2tzYTBKQlFXdENMSE5EUVZWVU8wRkJRMklzVDBGQlNTeERRVUZETEZkQlFWY3NSMEZCUnl3MlFrRkJaMEk3UVVGRGJFTXNWVUZCVFN4RlFVRkZMRWxCUVVrN1FVRkRXaXhQUVVGSExHdERRVUZ0UXl4SlFVRkpMRU5CUVVNc1MwRkJTeXh2UWtGQmEwSXNTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhGUVVGRkxGbEJRVlU3UVVGRE1VWXNaVUZCVnl4RlFVRkZMRWxCUVVrN1FVRkRha0lzYTBKQlFXTXNSVUZCUlN4UlFVRlJPMGxCUTNoQ0xFTkJRVU1zUTBGQlF6dEJRVU5JTEU5QlFVa3NRMEZCUXl4WlFVRlpMRWRCUVVjc2QwVkJRVlU3UVVGRE4wSXNWVUZCVFN4RlFVRkZMRWxCUVVrN1FVRkRXaXhQUVVGSExHdERRVUZ0UXl4SlFVRkpMRU5CUVVNc1MwRkJTeXh2UWtGQmEwSXNTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhGUVVGRkxFRkJRVVU3U1VGRGJFWXNRMEZCUXl4RFFVRkRPMEZCUTBnc1QwRkJTU3hEUVVGRExGTkJRVk1zUlVGQlJTeERRVUZETzBkQlEycENPenM3T3pzN096czdVMEZOVXl4eFFrRkJSenM3TzBGQlExb3NWVUZCVHl4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVOWUxFbEJRVWtzUTBGQlF5eFhRVUZYTEVOQlFVTXNWMEZCVnl4RlFVRkZMRVZCUXpsQ0xFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNVVUZCVVN4RlFVRkZMRU5CUXpWQ0xFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVVXNXVUZCVFRzN1FVRkZaQ3hWUVVGTExGZEJRVmNzUjBGQlJ5eDFSVUZCVXp0QlFVTXpRaXhYUVVGTkxFOUJRVTA3UVVGRFdpeFBRVUZGTEVWQlFVVXNjVUpCUVhGQ08wRkJRM3BDTEdGQlFWRXNSVUZCUlN4eFFrRkJjVUk3UVVGREwwSXNWVUZCU3l4RlFVRkZMRTFCUVVzc1dVRkJXVHRMUVVONFFpeERRVUZETEVOQlFVTTdRVUZEU0N4VlFVRkxMRmRCUVZjc1EwRkJReXhOUVVGTkxFTkJRVU03UVVGRGRrSXNZMEZCVXl4RlFVRkZMRTFCUVVzc1YwRkJWeXhEUVVGRExFdEJRVXNzUTBGQlF5eE5RVUZOTEVOQlFVTXNSVUZCUlR0QlFVTXpReXhuUWtGQlZ5eEZRVUZGTEUxQlFVc3NWMEZCVnl4RFFVRkRMRXRCUVVzc1EwRkJReXhOUVVGTkxFTkJRVU1zU1VGQlNUdExRVU12UXl4RFFVRkRMRU5CUVVNN1FVRkRTQ3hSUVVGTExFMUJRVXNzVjBGQlZ5eERRVUZETEZWQlFWVXNRMEZCUXl4TlFVRk5MRWRCUVVjc1EwRkJReXhGUVVGSE96dEJRVVUzUXl4WFFVRkxMRlZCUVZVc1IwRkJSeXgxUlVGQlV6dEJRVU14UWl4WlFVRk5MRTlCUVUwN1FVRkRXaXhSUVVGRkxFVkJRVVVzYjBKQlFXOUNPMEZCUTNoQ0xHTkJRVkVzUlVGQlJTeHZRa0ZCYjBJN1RVRkRPVUlzUTBGQlF5eERRVUZETzBGQlEwZ3NWMEZCU3l4VlFVRlZMRU5CUVVNc1RVRkJUU3hEUVVGRE8wRkJRM1JDTEdOQlFWRXNSVUZCUlN4UlFVRlJPMEZCUTJ4Q0xHbENRVUZYTEVWQlFVVXNUVUZCVFR0TlFVTnVRaXhEUVVGRExFTkJRVU03TzBGQlJVZ3NWMEZCU3l4alFVRmpMRWRCUVVjc2RVVkJRVk03UVVGRE9VSXNXVUZCVFN4UFFVRk5PMEZCUTFvc1VVRkJSU3hGUVVGRkxIbENRVUY1UWp0QlFVTTNRaXhqUVVGUkxFVkJRVVVzZVVKQlFYbENPMEZCUTI1RExGZEJRVXNzUlVGQlJTeE5RVUZMTEZkQlFWYzdUVUZEZGtJc1EwRkJReXhEUVVGRE8wRkJRMGdzVjBGQlN5eGpRVUZqTEVOQlFVTXNUVUZCVFN4RFFVRkRPMEZCUXpGQ0xGbEJRVTBzUlVGQlJTeE5RVUZMTEdOQlFXTXNRMEZCUXl4TFFVRkxMRU5CUVVNc1ZVRkJWVHROUVVNMVF5eERRVUZETEVOQlFVTTdTMEZEU0N4TlFVRk5PenRCUVVWT0xGZEJRVXNzVlVGQlZTeEhRVUZITEhWRlFVRlRPMEZCUXpGQ0xGbEJRVTBzVDBGQlRUdEJRVU5hTEZGQlFVVXNSVUZCUlN4dlFrRkJiMEk3UVVGRGVFSXNZMEZCVVN4RlFVRkZMSFZDUVVGMVFqdEJRVU5xUXl4WFFVRkxMRVZCUVVVc1RVRkJTeXhaUVVGWk8wMUJRM2hDTEVOQlFVTXNRMEZCUXp0QlFVTklMRmRCUVVzc1ZVRkJWU3hEUVVGRExFMUJRVTBzUTBGQlF6dEJRVU4wUWl4cFFrRkJWeXhGUVVGRkxFMUJRVXNzVjBGQlZ5eERRVUZETEV0QlFVc3NRMEZCUXl4TlFVRk5MRU5CUVVNc1NVRkJTVHROUVVNdlF5eERRVUZETEVOQlFVTTdTMEZEU0RzN1FVRkZSQ3hWUVVGTExGVkJRVlVzUjBGQlJ5eDFSVUZCVXp0QlFVTXhRaXhYUVVGTkxFOUJRVTA3UVVGRFdpeFBRVUZGTEVWQlFVVXNiMEpCUVc5Q08wRkJRM2hDTEdGQlFWRXNSVUZCUlN4dlFrRkJiMEk3UVVGRE9VSXNWVUZCU3l4RlFVRkZMRTFCUVVzc1dVRkJXVHRMUVVONFFpeERRVUZETEVOQlFVTTdRVUZEU0N4VlFVRkxMRlZCUVZVc1EwRkJReXhOUVVGTkxFTkJRVU03UVVGRGRFSXNiVUpCUVdNc1JVRkJSU3hOUVVGTExGZEJRVmNzUTBGQlF5eExRVUZMTEVOQlFVTXNUVUZCVFN4RFFVRkRMR05CUVdNN1MwRkROVVFzUTBGQlF5eERRVUZETzBsQlEwZ3NRMEZCUXl4RFFVRkRMRWxCUVVrc1EwRkJSU3haUVVGTk8wRkJRMlFzVlVGQlN5eFhRVUZYTEVWQlFVVXNRMEZCUXp0QlFVTnVRaXhSUVVGTExFMUJRVXNzVjBGQlZ5eERRVUZETEZWQlFWVXNRMEZCUXl4TlFVRk5MRWRCUVVjc1EwRkJReXhGUVVGSE8wRkJRemRETEZkQlFVc3NVVUZCVVN4SFFVRkhMSGRGUVVGaE8wRkJRelZDTEZGQlFVVXNSVUZCUlN3d1FrRkJNRUk3UVVGRE9VSXNaMEpCUVZVc1JVRkJSU3hKUVVGSk8wRkJRMmhDTEZsQlFVMHNUMEZCVFR0QlFVTmFMRlZCUVVrc1JVRkJSU3hOUVVGTExHTkJRV003VFVGRGVrSXNRMEZCUXl4RFFVRkRPMHRCUTBnN1FVRkRSQ3hWUVVGTExGTkJRVk1zUjBGQlJ5eE5RVUZMTEdGQlFXRXNSVUZCUlN4RFFVRkRPMGxCUTNSRExFTkJRVU1zUTBGQlF6dEhRVU5JT3pzN1VVRnVSMGtzYTBKQlFXdENPenM3Y1VKQmMwZFVMR3RDUVVGclFpSXNJbVpwYkdVaU9pSkRPaTkwWlcxd0wwZEhMa1p5YjI1MFJXNWtMbGRwWkdkbGRITXZkMmxrWjJWMGN5OWphR0Z5YVhSNUxXVjJaVzUwY3kxaWIyRnlaQzl6Y21NdmMyTnlhWEIwY3k5aGNIQXZRMmhoY21sMGVVVjJaVzUwYzBKdllYSmtMbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaUozVnpaU0J6ZEhKcFkzUW5PMXh5WEc1Y2NseHViR1YwSUZCeWIyMXBjMlVnUFNCeVpYRjFhWEpsS0NkbGN6WXRjSEp2YldselpTY3BMbEJ5YjIxcGMyVTdYSEpjYm1sdGNHOXlkQ0JYYVdSblpYUWdabkp2YlNBbmFuVnpkR2RwZG1sdVp5MTNhV1JuWlhRdFpuSmhiV1YzYjNKckwyTnZiWEJ2Ym1WdWRITXZiR2xpTDJwekwyWnlZVzFsZDI5eWF5OVhhV1JuWlhRbk8xeHlYRzVwYlhCdmNuUWdRMkZ5YjNWelpXd2dabkp2YlNBbmFuVnpkR2RwZG1sdVp5MTNhV1JuWlhRdFpuSmhiV1YzYjNKckwyTnZiWEJ2Ym1WdWRITXZiR2xpTDJOaGNtOTFjMlZzTDBOaGNtOTFjMlZzSnp0Y2NseHVhVzF3YjNKMElFMXZaR1ZzSUdaeWIyMGdKMnAxYzNSbmFYWnBibWN0ZDJsa1oyVjBMV1p5WVcxbGQyOXlheTlqYjIxd2IyNWxiblJ6TDJ4cFlpOXFjeTltY21GdFpYZHZjbXN2VFc5a1pXd25PMXh5WEc1cGJYQnZjblFnVm1sbGR5Qm1jbTl0SUNkcWRYTjBaMmwyYVc1bkxYZHBaR2RsZEMxbWNtRnRaWGR2Y21zdlkyOXRjRzl1Wlc1MGN5OXNhV0l2YW5NdlpuSmhiV1YzYjNKckwxWnBaWGNuTzF4eVhHNXBiWEJ2Y25RZ1RXOWtaV3hGZG1WdWRITWdabkp2YlNBbkxpOU5iMlJsYkVWMlpXNTBjeWM3WEhKY2JseHlYRzR2S2lwY2NseHVJQ29nUTNKbFlYUmxJR0VnWTJoaGNtbDBlU0JsZG1WdWRITWdZbTloY21RZ2QybGtaMlYwWEhKY2JpQXFMMXh5WEc1amJHRnpjeUJEYUdGeWFYUjVSWFpsYm5SelFtOWhjbVFnWlhoMFpXNWtjeUJYYVdSblpYUWdlMXh5WEc1Y2RHTnZibk4wY25WamRHOXlJQ2dnYjNCMGFXOXVjeUFwSUh0Y2NseHVYSFJjZEhOMWNHVnlLQ0J2Y0hScGIyNXpJQ2s3WEhKY2JseDBYSFIwYUdsekxtbHVhWFFvS1R0Y2NseHVYSFI5WEhKY2JseDBMeW9xWEhKY2JseDBJQ29nU1c1cGRHbGhiR2x6WlNCMGFHVWdaWFpsYm5SeklHSnZZWEprWEhKY2JseDBJQ29nUUdSbGMyTnlhWEIwYVc5dUlFTnlaV0YwWlNCaGJtUWdZMkZqYUdVZ2JtVjNJR1YyWlc1MGN5QnRiMlJsYkNCaGJtUWdZMmhoY21sMGVTQnRiMlJsYkRzZ1ltOXZkSE4wY21Gd0lIUm9aU0IzYVdSblpYUmNjbHh1WEhRZ0tpOWNjbHh1WEhScGJtbDBJQ2dwSUh0Y2NseHVYSFJjZEhOMWNHVnlMbWx1YVhRb0tUdGNjbHh1WEhSY2RIUm9hWE11WlhabGJuUnpUVzlrWld3Z1BTQnVaWGNnVFc5a1pXeEZkbVZ1ZEhNb2V5QmNjbHh1WEhSY2RGeDBkMmxrWjJWME9pQjBhR2x6TEZ4eVhHNWNkRngwWEhSMWNtdzZJR0JvZEhSd2N6cGNYQzljWEM5aGNHa3VhblZ6ZEdkcGRtbHVaeTVqYjIxY1hDOGtlM1JvYVhNdVlYQndTV1I5WEZ3dmRqRmNYQzlqYUdGeWFYUjVYRnd2Skh0MGFHbHpMbU52Ym1acFp5NXBaSDFjWEM5bGRtVnVkSE5nTEZ4eVhHNWNkRngwWEhScGMxQmhaMmx1WVhSbFpEb2dkSEoxWlN4Y2NseHVYSFJjZEZ4MFkyOXNiR1ZqZEdsdmJsQmhkR2c2SUNkbGRtVnVkSE1uWEhKY2JseDBYSFI5S1R0Y2NseHVYSFJjZEhSb2FYTXVZMmhoY21sMGVVMXZaR1ZzSUQwZ2JtVjNJRTF2WkdWc0tIc2dYSEpjYmx4MFhIUmNkSGRwWkdkbGREb2dkR2hwY3l4Y2NseHVYSFJjZEZ4MGRYSnNPaUJnYUhSMGNITTZYRnd2WEZ3dllYQnBMbXAxYzNSbmFYWnBibWN1WTI5dFhGd3ZKSHQwYUdsekxtRndjRWxrZlZ4Y0wzWXhYRnd2WTJoaGNtbDBlVnhjTHlSN2RHaHBjeTVqYjI1bWFXY3VhV1I5WUZ4eVhHNWNkRngwZlNrN1hISmNibHgwWEhSMGFHbHpMbUp2YjNSemRISmhjQ2dwTzF4eVhHNWNkSDFjY2x4dVhIUXZLaXBjY2x4dVhIUWdLaUJDYjI5MGMzUnlZWEFnZEdobElIZHBaR2RsZEZ4eVhHNWNkQ0FxSUVCa1pYTmpjbWx3ZEdsdmJpQkdaWFJqYUNCaGJHd2djMlZ5ZG1WeUlHUmhkR0VnWm05eUlHVjJaVzUwY3lCaGJtUWdZMmhoY21sMGVTQnRiMlJsYkRzZ2RHaGxiaUJqY21WaGRHVWdZVzVrSUhKbGJtUmxjaUJ1WlhjZ1kyaGhjbWwwZVNCaGJtUWdaWFpsYm5SeklIWnBaWGR6TzF4eVhHNWNkQ0FxSUhKbGMyVjBJSFJvWlNCM2FXUm5aWFFnYUdWcFoyaDBJR0Z1WkNCamNtVmhkR1VnYm1WM0lHTmhjbTkxYzJWc0lHOXVJSFJvWlNCbGRtVnVkSE1nZG1sbGR6c2dabWx1WVd4c2VTQnBibWwwYVdGc2FYTmxJR0VnYm1WM0lHRnVZV3g1ZEdsamN5QnBibk4wWVc1alpTQnZiaUIwYUdVZ2QybGtaMlYwWEhKY2JseDBJQ292WEhKY2JseDBZbTl2ZEhOMGNtRndJQ2dwSUh0Y2NseHVYSFJjZEZCeWIyMXBjMlV1WVd4c0tGdGNjbHh1WEhSY2RGeDBkR2hwY3k1bGRtVnVkSE5OYjJSbGJDNW5aWFJPWlhoMFVHRm5aU2dwTEZ4eVhHNWNkRngwWEhSMGFHbHpMbU5vWVhKcGRIbE5iMlJsYkM1blpYUk5iMlJsYkNncFhISmNibHgwWEhSZEtTNTBhR1Z1S0NBb0tTQTlQaUI3WEhKY2JseDBYSFJjZEM4dklFTm9ZWEpwZEhrZ1ZtbGxkMXh5WEc1Y2RGeDBYSFIwYUdsekxtTm9ZWEpwZEhsV2FXVjNJRDBnYm1WM0lGWnBaWGNvZXlCY2NseHVYSFJjZEZ4MFhIUjNhV1JuWlhRNklIUm9hWE1zSUZ4eVhHNWNkRngwWEhSY2RHVnNPaUFuVzJSaGRHRXRkbWxsZHkxamFHRnlhWFI1WFNjc1hISmNibHgwWEhSY2RGeDBkR1Z0Y0d4aGRHVTZJQ2RiWkdGMFlTMTBiWEJzTFdOb1lYSnBkSGxkSnl4Y2NseHVYSFJjZEZ4MFhIUnRiMlJsYkRvZ2RHaHBjeTVqYUdGeWFYUjVUVzlrWld4Y2NseHVYSFJjZEZ4MGZTazdYSEpjYmx4MFhIUmNkSFJvYVhNdVkyaGhjbWwwZVZacFpYY3VjbVZ1WkdWeUtIdGNjbHh1WEhSY2RGeDBYSFJqYUdGeWFYUjVTV1E2SUhSb2FYTXVZMmhoY21sMGVWWnBaWGN1Ylc5a1pXd3VKRzF2WkdWc0xtbGtMRnh5WEc1Y2RGeDBYSFJjZEdOb1lYSnBkSGxPWVcxbE9pQjBhR2x6TG1Ob1lYSnBkSGxXYVdWM0xtMXZaR1ZzTGlSdGIyUmxiQzV1WVcxbFhISmNibHgwWEhSY2RIMHBPMXh5WEc1Y2RGeDBYSFJwWmlBb0lIUm9hWE11WlhabGJuUnpUVzlrWld3dVkyOXNiR1ZqZEdsdmJpNXNaVzVuZEdnZ1BpQXdJQ2tnZTF4MFhISmNibHgwWEhSY2RGeDBMeThnUlhabGJuUnpJSFpwWlhkY2NseHVYSFJjZEZ4MFhIUjBhR2x6TG1WMlpXNTBjMVpwWlhjZ1BTQnVaWGNnVm1sbGR5aDdJRnh5WEc1Y2RGeDBYSFJjZEZ4MGQybGtaMlYwT2lCMGFHbHpMQ0JjY2x4dVhIUmNkRngwWEhSY2RHVnNPaUFuVzJSaGRHRXRkbWxsZHkxbGRtVnVkSE5kSnl4Y2NseHVYSFJjZEZ4MFhIUmNkSFJsYlhCc1lYUmxPaUFuVzJSaGRHRXRkRzF3YkMxbGRtVnVkSE5kSjF4eVhHNWNkRngwWEhSY2RIMHBPMXh5WEc1Y2RGeDBYSFJjZEhSb2FYTXVaWFpsYm5SelZtbGxkeTV5Wlc1a1pYSW9lMXh5WEc1Y2RGeDBYSFJjZEZ4MGRtbGxkMDVoYldVNklDZGxkbVZ1ZEhNbkxGeHlYRzVjZEZ4MFhIUmNkRngwYUdGelEyRnliM1Z6Wld3NklDZDBjblZsSjF4eVhHNWNkRngwWEhSY2RIMHBPMXgwWEhKY2JseDBYSFJjZEZ4MEx5OGdSWFpsYm5SeklHeHBjM1FnZG1sbGQxeHlYRzVjZEZ4MFhIUmNkSFJvYVhNdVpYWmxiblJ6VEdsemRGWnBaWGNnUFNCdVpYY2dWbWxsZHloN0lGeHlYRzVjZEZ4MFhIUmNkRngwZDJsa1oyVjBPaUIwYUdsekxGeHlYRzVjZEZ4MFhIUmNkRngwWld3NklDZGJaR0YwWVMxMmFXVjNMV1YyWlc1MGN5MXNhWE4wWFNjc1hISmNibHgwWEhSY2RGeDBYSFIwWlcxd2JHRjBaVG9nSjF0a1lYUmhMWFJ0Y0d3dFpYWmxiblJ6TFd4cGMzUmRKeXhjY2x4dVhIUmNkRngwWEhSY2RHMXZaR1ZzT2lCMGFHbHpMbVYyWlc1MGMwMXZaR1ZzTEZ4eVhHNWNkRngwWEhSY2RIMHBPMXh5WEc1Y2RGeDBYSFJjZEhSb2FYTXVaWFpsYm5SelRHbHpkRlpwWlhjdWNtVnVaR1Z5S0h0Y2NseHVYSFJjZEZ4MFhIUmNkR1YyWlc1MGN6b2dkR2hwY3k1bGRtVnVkSE5NYVhOMFZtbGxkeTV0YjJSbGJDNWpiMnhzWldOMGFXOXVYSEpjYmx4MFhIUmNkRngwZlNrN1hISmNibHgwWEhSY2RIMGdaV3h6WlNCN1hISmNibHgwWEhSY2RGeDBMeTlPYnlCbGRtVnVkSE1nZEc4Z2MyaHZkMXh5WEc1Y2RGeDBYSFJjZEhSb2FYTXVaWFpsYm5SelZtbGxkeUE5SUc1bGR5QldhV1YzS0hzZ1hISmNibHgwWEhSY2RGeDBYSFIzYVdSblpYUTZJSFJvYVhNc0lGeHlYRzVjZEZ4MFhIUmNkRngwWld3NklDZGJaR0YwWVMxMmFXVjNMV1YyWlc1MGMxMG5MRnh5WEc1Y2RGeDBYSFJjZEZ4MGRHVnRjR3hoZEdVNklDZGJaR0YwWVMxMGJYQnNMVzV2TFdWMlpXNTBjMTBuTEZ4eVhHNWNkRngwWEhSY2RGeDBiVzlrWld3NklIUm9hWE11WTJoaGNtbDBlVTF2WkdWc1hISmNibHgwWEhSY2RGeDBmU2s3WEhKY2JseDBYSFJjZEZ4MGRHaHBjeTVsZG1WdWRITldhV1YzTG5KbGJtUmxjaWg3WEhKY2JseDBYSFJjZEZ4MFhIUmphR0Z5YVhSNVRtRnRaVG9nZEdocGN5NWphR0Z5YVhSNVZtbGxkeTV0YjJSbGJDNGtiVzlrWld3dWJtRnRaVnh5WEc1Y2RGeDBYSFJjZEgwcE8xeDBYSEpjYmx4MFhIUmNkSDFjY2x4dVhIUmNkRngwTHk4Z1JtOXZkR1Z5SUZacFpYZGNjbHh1WEhSY2RGeDBkR2hwY3k1bWIyOTBaWEpXYVdWM0lEMGdibVYzSUZacFpYY29lMXh5WEc1Y2RGeDBYSFJjZEhkcFpHZGxkRG9nZEdocGN5eGNjbHh1WEhSY2RGeDBYSFJsYkRvZ0oxdGtZWFJoTFhacFpYY3RabTl2ZEdWeVhTY3NYSEpjYmx4MFhIUmNkRngwZEdWdGNHeGhkR1U2SUNkYlpHRjBZUzEwYlhCc0xXWnZiM1JsY2wwbkxGeHlYRzVjZEZ4MFhIUmNkRzF2WkdWc09pQjBhR2x6TG1Ob1lYSnBkSGxOYjJSbGJGeHlYRzVjZEZ4MFhIUjlLVHRjY2x4dVhIUmNkRngwZEdocGN5NW1iMjkwWlhKV2FXVjNMbkpsYm1SbGNpaDdYSEpjYmx4MFhIUmNkRngwY0hKdlptbHNaVkJoWjJWVmNtdzZJSFJvYVhNdVkyaGhjbWwwZVZacFpYY3ViVzlrWld3dUpHMXZaR1ZzTG5CeWIyWnBiR1ZRWVdkbFZYSnNYSEpjYmx4MFhIUmNkSDBwTzF4eVhHNWNkRngwZlNrdWRHaGxiaWdnS0NrZ1BUNGdlMXh5WEc1Y2RGeDBYSFIwYUdsekxuSmxjMlYwU0dWcFoyaDBLQ2s3WEhSY2NseHVYSFJjZEZ4MGFXWWdLQ0IwYUdsekxtVjJaVzUwYzAxdlpHVnNMbU52Ykd4bFkzUnBiMjR1YkdWdVozUm9JRDRnTUNBcElIdGNkRnh5WEc1Y2RGeDBYSFJjZEhSb2FYTXVZMkZ5YjNWelpXd2dQU0J1WlhjZ1EyRnliM1Z6Wld3b2UxeHlYRzVjZEZ4MFhIUmNkRngwWld3NklDZGJaR0YwWVMxallYSnZkWE5sYkQxY0ltVjJaVzUwYzF3aVhTY3NYSEpjYmx4MFhIUmNkRngwWEhScGMwbHVabWx1YVhSbE9pQjBjblZsTEZ4eVhHNWNkRngwWEhSY2RGeDBkMmxrWjJWME9pQjBhR2x6TEZ4eVhHNWNkRngwWEhSY2RGeDBkbWxsZHpvZ2RHaHBjeTVsZG1WdWRITk1hWE4wVm1sbGQxeHlYRzVjZEZ4MFhIUmNkSDBwTzF4eVhHNWNkRngwWEhSOVhISmNibHgwWEhSY2RIUm9hWE11WVc1aGJIbDBhV056SUQwZ2RHaHBjeTVwYm1sMFFXNWhiSGwwYVdOektDazdYSEpjYmx4MFhIUjlLVHRjY2x4dVhIUjlYSEpjYm4xY2NseHVYSEpjYm1WNGNHOXlkQ0JrWldaaGRXeDBJRU5vWVhKcGRIbEZkbVZ1ZEhOQ2IyRnlaRHNpWFgwPSIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuXHR2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbnZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KF94LCBfeDIsIF94MykgeyB2YXIgX2FnYWluID0gdHJ1ZTsgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7IHZhciBvYmplY3QgPSBfeCwgcHJvcGVydHkgPSBfeDIsIHJlY2VpdmVyID0gX3gzOyBfYWdhaW4gPSBmYWxzZTsgaWYgKG9iamVjdCA9PT0gbnVsbCkgb2JqZWN0ID0gRnVuY3Rpb24ucHJvdG90eXBlOyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IF94ID0gcGFyZW50OyBfeDIgPSBwcm9wZXJ0eTsgX3gzID0gcmVjZWl2ZXI7IF9hZ2FpbiA9IHRydWU7IGRlc2MgPSBwYXJlbnQgPSB1bmRlZmluZWQ7IGNvbnRpbnVlIF9mdW5jdGlvbjsgfSB9IGVsc2UgaWYgKCd2YWx1ZScgaW4gZGVzYykgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH0gfTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOyB9IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gJ2Z1bmN0aW9uJyAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ1N1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgJyArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzV2lkZ2V0TW9kZWxQcmV0dHlEYXRlID0gcmVxdWlyZSgnanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL3dpZGdldC9tb2RlbC9wcmV0dHlEYXRlJyk7XG5cbnZhciBfanVzdGdpdmluZ1dpZGdldEZyYW1ld29ya0NvbXBvbmVudHNMaWJKc0ZyYW1ld29ya01vZGVsID0gcmVxdWlyZSgnanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL2ZyYW1ld29yay9Nb2RlbCcpO1xuXG52YXIgX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNGcmFtZXdvcmtNb2RlbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzRnJhbWV3b3JrTW9kZWwpO1xuXG52YXIgX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNXaWRnZXRNb2RlbFdyaXRlVXJsID0gcmVxdWlyZSgnanVzdGdpdmluZy13aWRnZXQtZnJhbWV3b3JrL2NvbXBvbmVudHMvbGliL2pzL3dpZGdldC9tb2RlbC93cml0ZVVybCcpO1xuXG52YXIgX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNXaWRnZXRBbmFseXRpY3NXcml0ZVV0bUNvZGUgPSByZXF1aXJlKCdqdXN0Z2l2aW5nLXdpZGdldC1mcmFtZXdvcmsvY29tcG9uZW50cy9saWIvanMvd2lkZ2V0L2FuYWx5dGljcy93cml0ZVV0bUNvZGUnKTtcblxudmFyIF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzV2lkZ2V0QW5hbHl0aWNzV3JpdGVVdG1Db2RlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNXaWRnZXRBbmFseXRpY3NXcml0ZVV0bUNvZGUpO1xuXG4vKipcclxuICogQ3JlYXRlIGFuIGV2ZW50cyBtb2RlbCBcclxuICogQGNsYXNzZGVzYyBTZXQgdGhlIHVybCBvZiB0aGUgZXZlbnRzIG1vZGVsOyBzcGVjaWZ5IEFQSSBkYXRhIHByb3BlcnR5IG5hbWUgb2YgZXZlbnRzIGRhdGFcclxuICovXG52YXIgUHJvbWlzZSA9IHJlcXVpcmUoJ2VzNi1wcm9taXNlJykuUHJvbWlzZTtcblxudmFyIE1vZGVsRXZlbnRzID0gKGZ1bmN0aW9uIChfTW9kZWwpIHtcblx0X2luaGVyaXRzKE1vZGVsRXZlbnRzLCBfTW9kZWwpO1xuXG5cdGZ1bmN0aW9uIE1vZGVsRXZlbnRzKG9wdGlvbnMpIHtcblx0XHRfY2xhc3NDYWxsQ2hlY2sodGhpcywgTW9kZWxFdmVudHMpO1xuXG5cdFx0X2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoTW9kZWxFdmVudHMucHJvdG90eXBlKSwgJ2NvbnN0cnVjdG9yJywgdGhpcykuY2FsbCh0aGlzLCBvcHRpb25zKTtcblx0fVxuXG5cdC8qKlxyXG4gICogRXh0ZW5kIG1vZGVsJ3MgZ2V0IG5leHQgcGFnZSBtZXRob2RcclxuICAqIEBkZXNjcmlwdGlvbiBFeHRlbmQgbW9kZWwncyBnZXQgbmV4dCBwYWdlIG1ldGhvZCB0byBpbmNsdWRlIGRhdGEgYXVnbWVudGF0aW9uIG9mIHJldHVybmVkIGNvbGxlY3Rpb24gZGF0YVxyXG4gICovXG5cblx0X2NyZWF0ZUNsYXNzKE1vZGVsRXZlbnRzLCBbe1xuXHRcdGtleTogJ2dldE5leHRQYWdlJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gZ2V0TmV4dFBhZ2UocmVzZXQpIHtcblx0XHRcdHZhciBfdGhpcyA9IHRoaXM7XG5cblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuXHRcdFx0XHRfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihNb2RlbEV2ZW50cy5wcm90b3R5cGUpLCAnZ2V0TmV4dFBhZ2UnLCBfdGhpcykuY2FsbChfdGhpcywgcmVzZXQpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdF90aGlzLmNvbGxlY3Rpb24uZm9yRWFjaChmdW5jdGlvbiAoZXZ0KSB7XG5cdFx0XHRcdFx0XHR2YXIgY2hhcml0eUlkID0gX3RoaXMuJG1vZGVsLmlkO1xuXHRcdFx0XHRcdFx0ZXZ0LmNoYXJpdHlJZCA9IGNoYXJpdHlJZDtcblx0XHRcdFx0XHRcdGV2dC5wcmV0dHlTdGFydERhdGUgPSAoMCwgX2p1c3RnaXZpbmdXaWRnZXRGcmFtZXdvcmtDb21wb25lbnRzTGliSnNXaWRnZXRNb2RlbFByZXR0eURhdGUuZ2V0UHJldHR5RGF0ZVVUQykoZXZ0LnN0YXJ0RGF0ZSk7XG5cdFx0XHRcdFx0XHRldnQucHJldHR5U3RhcnRNb250aCA9ICgwLCBfanVzdGdpdmluZ1dpZGdldEZyYW1ld29ya0NvbXBvbmVudHNMaWJKc1dpZGdldE1vZGVsUHJldHR5RGF0ZS5nZXRQcmV0dHlNb250aCkoZXZ0LnN0YXJ0RGF0ZSk7XG5cdFx0XHRcdFx0XHRldnQucHJldHR5U3RhcnRZZWFyID0gKDAsIF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzV2lkZ2V0TW9kZWxQcmV0dHlEYXRlLmdldFByZXR0eVllYXJVVEMpKGV2dC5zdGFydERhdGUpO1xuXHRcdFx0XHRcdFx0ZXZ0LmRhdGVUaW1lID0gKDAsIF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzV2lkZ2V0TW9kZWxQcmV0dHlEYXRlLmdldERhdGVUaW1lKShldnQuc3RhcnREYXRlKTtcblxuXHRcdFx0XHRcdFx0KDAsIF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzV2lkZ2V0TW9kZWxXcml0ZVVybC53cml0ZUV2ZW50VXJsKShldnQsICdldmVudFVybCcsIGNoYXJpdHlJZCk7XG5cdFx0XHRcdFx0XHRldnQuZXZlbnRVcmwgKz0gKDAsIF9qdXN0Z2l2aW5nV2lkZ2V0RnJhbWV3b3JrQ29tcG9uZW50c0xpYkpzV2lkZ2V0QW5hbHl0aWNzV3JpdGVVdG1Db2RlMlsnZGVmYXVsdCddKShldnQuZXZlbnRVcmwsIHtcblx0XHRcdFx0XHRcdFx0dXRtX25hbWU6ICdDaGFyaXR5RXZlbnRzQm9hcmQnLCAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblx0XHRcdFx0XHRcdFx0dXRtX2NvbnRlbnQ6IGNoYXJpdHlJZCAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1dKTtcblxuXHRyZXR1cm4gTW9kZWxFdmVudHM7XG59KShfanVzdGdpdmluZ1dpZGdldEZyYW1ld29ya0NvbXBvbmVudHNMaWJKc0ZyYW1ld29ya01vZGVsMlsnZGVmYXVsdCddKTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gTW9kZWxFdmVudHM7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklrTTZMM1JsYlhBdlIwY3VSbkp2Ym5SRmJtUXVWMmxrWjJWMGN5OTNhV1JuWlhSekwyTm9ZWEpwZEhrdFpYWmxiblJ6TFdKdllYSmtMM055WXk5elkzSnBjSFJ6TDJGd2NDOU5iMlJsYkVWMlpXNTBjeTVxY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pUVVGQlFTeFpRVUZaTEVOQlFVTTdPenM3T3pzN096czdPenM3T3pzN05rVkJTVzFGTEhWRlFVRjFSVHM3YzBWQlJYSkpMQ3RFUVVFclJEczdPenN5UlVGRGJrUXNjVVZCUVhGRk96dHRSa0ZETVVVc05rVkJRVFpGT3pzN096czdPenRCUVU1MFJ5eEpRVUZKTEU5QlFVOHNSMEZCUnl4UFFVRlBMRU5CUVVNc1lVRkJZU3hEUVVGRExFTkJRVU1zVDBGQlR5eERRVUZET3p0SlFWbDJReXhYUVVGWE8xZEJRVmdzVjBGQlZ6czdRVUZEVEN4VlFVUk9MRmRCUVZjc1EwRkRTQ3hQUVVGUExFVkJRVWM3ZDBKQlJHeENMRmRCUVZjN08wRkJSV1lzTmtKQlJra3NWMEZCVnl3MlEwRkZVaXhQUVVGUExFVkJRVWM3UlVGRGFrSTdPenM3T3pzN1kwRklTU3hYUVVGWE96dFRRVkZNTEhGQ1FVRkZMRXRCUVVzc1JVRkJSenM3TzBGQlEzQkNMRlZCUVU4c1NVRkJTU3hQUVVGUExFTkJRVVVzVlVGQlJTeFBRVUZQTEVWQlFVMDdRVUZEYkVNc0swSkJWa2NzVjBGQlZ5d3JRMEZWU3l4TFFVRkxMRVZCUVVjc1NVRkJTU3hEUVVGRkxGbEJRVTA3UVVGRGRFTXNWMEZCU3l4VlFVRlZMRU5CUVVNc1QwRkJUeXhEUVVGRkxGVkJRVU1zUjBGQlJ5eEZRVUZMTzBGQlEycERMRlZCUVVrc1UwRkJVeXhIUVVGSExFMUJRVXNzVFVGQlRTeERRVUZETEVWQlFVVXNRMEZCUXp0QlFVTXZRaXhUUVVGSExFTkJRVU1zVTBGQlV5eEhRVUZITEZOQlFWTXNRMEZCUXp0QlFVTXhRaXhUUVVGSExFTkJRVU1zWlVGQlpTeEhRVUZITEhGR1FVRnBRaXhIUVVGSExFTkJRVU1zVTBGQlV5eERRVUZETEVOQlFVTTdRVUZEZEVRc1UwRkJSeXhEUVVGRExHZENRVUZuUWl4SFFVRkhMRzFHUVVGbExFZEJRVWNzUTBGQlF5eFRRVUZUTEVOQlFVTXNRMEZCUXp0QlFVTnlSQ3hUUVVGSExFTkJRVU1zWlVGQlpTeEhRVUZITEhGR1FVRnBRaXhIUVVGSExFTkJRVU1zVTBGQlV5eERRVUZETEVOQlFVTTdRVUZEZEVRc1UwRkJSeXhEUVVGRExGRkJRVkVzUjBGQlJ5eG5Sa0ZCV1N4SFFVRkhMRU5CUVVNc1UwRkJVeXhEUVVGRExFTkJRVU03TzBGQlJURkRMSE5HUVVGakxFZEJRVWNzUlVGQlJTeFZRVUZWTEVWQlFVVXNVMEZCVXl4RFFVRkRMRU5CUVVNN1FVRkRNVU1zVTBGQlJ5eERRVUZETEZGQlFWRXNTVUZCU1N4elJrRkJZU3hIUVVGSExFTkJRVU1zVVVGQlVTeEZRVUZGTzBGQlF6RkRMR1ZCUVZFc1JVRkJSU3h2UWtGQmIwSTdRVUZET1VJc2EwSkJRVmNzUlVGQlJTeFRRVUZUTzA5QlEzUkNMRU5CUVVNc1EwRkJRenROUVVOSUxFTkJRVU1zUTBGQlF6dEJRVU5JTEZsQlFVOHNSVUZCUlN4RFFVRkRPMHRCUTFZc1EwRkJReXhEUVVGRE8wbEJRMGdzUTBGQlF5eERRVUZETzBkQlEwZzdPenRSUVRWQ1NTeFhRVUZYT3pzN2NVSkJLMEpHTEZkQlFWY2lMQ0ptYVd4bElqb2lRem92ZEdWdGNDOUhSeTVHY205dWRFVnVaQzVYYVdSblpYUnpMM2RwWkdkbGRITXZZMmhoY21sMGVTMWxkbVZ1ZEhNdFltOWhjbVF2YzNKakwzTmpjbWx3ZEhNdllYQndMMDF2WkdWc1JYWmxiblJ6TG1weklpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lKM1Z6WlNCemRISnBZM1FuTzF4eVhHNWNjbHh1YkdWMElGQnliMjFwYzJVZ1BTQnlaWEYxYVhKbEtDZGxjell0Y0hKdmJXbHpaU2NwTGxCeWIyMXBjMlU3WEhKY2JseHlYRzVwYlhCdmNuUWdleUJuWlhSRVlYUmxWR2x0WlN3Z1oyVjBVSEpsZEhSNVJHRjBaVlZVUXl3Z1oyVjBVSEpsZEhSNVRXOXVkR2dzSUdkbGRGQnlaWFIwZVZsbFlYSlZWRU1nZlNCbWNtOXRJQ2RxZFhOMFoybDJhVzVuTFhkcFpHZGxkQzFtY21GdFpYZHZjbXN2WTI5dGNHOXVaVzUwY3k5c2FXSXZhbk12ZDJsa1oyVjBMMjF2WkdWc0wzQnlaWFIwZVVSaGRHVW5PMXh5WEc1Y2NseHVhVzF3YjNKMElFMXZaR1ZzSUdaeWIyMGdKMnAxYzNSbmFYWnBibWN0ZDJsa1oyVjBMV1p5WVcxbGQyOXlheTlqYjIxd2IyNWxiblJ6TDJ4cFlpOXFjeTltY21GdFpYZHZjbXN2VFc5a1pXd25PMXh5WEc1cGJYQnZjblFnZXlCM2NtbDBaVVYyWlc1MFZYSnNJSDBnWm5KdmJTQW5hblZ6ZEdkcGRtbHVaeTEzYVdSblpYUXRabkpoYldWM2IzSnJMMk52YlhCdmJtVnVkSE12YkdsaUwycHpMM2RwWkdkbGRDOXRiMlJsYkM5M2NtbDBaVlZ5YkNjN1hISmNibWx0Y0c5eWRDQjNjbWwwWlZWMGJVTnZaR1VnWm5KdmJTQW5hblZ6ZEdkcGRtbHVaeTEzYVdSblpYUXRabkpoYldWM2IzSnJMMk52YlhCdmJtVnVkSE12YkdsaUwycHpMM2RwWkdkbGRDOWhibUZzZVhScFkzTXZkM0pwZEdWVmRHMURiMlJsSnp0Y2NseHVYSEpjYmk4cUtseHlYRzRnS2lCRGNtVmhkR1VnWVc0Z1pYWmxiblJ6SUcxdlpHVnNJRnh5WEc0Z0tpQkFZMnhoYzNOa1pYTmpJRk5sZENCMGFHVWdkWEpzSUc5bUlIUm9aU0JsZG1WdWRITWdiVzlrWld3N0lITndaV05wWm5rZ1FWQkpJR1JoZEdFZ2NISnZjR1Z5ZEhrZ2JtRnRaU0J2WmlCbGRtVnVkSE1nWkdGMFlWeHlYRzRnS2k5Y2NseHVZMnhoYzNNZ1RXOWtaV3hGZG1WdWRITWdaWGgwWlc1a2N5Qk5iMlJsYkNCN1hISmNibHgwWTI5dWMzUnlkV04wYjNJb0lHOXdkR2x2Ym5NZ0tTQjdYSEpjYmx4MFhIUnpkWEJsY2lnZ2IzQjBhVzl1Y3lBcE8xeHlYRzVjZEgxY2NseHVYSFF2S2lwY2NseHVYSFFnS2lCRmVIUmxibVFnYlc5a1pXd25jeUJuWlhRZ2JtVjRkQ0J3WVdkbElHMWxkR2h2WkZ4eVhHNWNkQ0FxSUVCa1pYTmpjbWx3ZEdsdmJpQkZlSFJsYm1RZ2JXOWtaV3duY3lCblpYUWdibVY0ZENCd1lXZGxJRzFsZEdodlpDQjBieUJwYm1Oc2RXUmxJR1JoZEdFZ1lYVm5iV1Z1ZEdGMGFXOXVJRzltSUhKbGRIVnlibVZrSUdOdmJHeGxZM1JwYjI0Z1pHRjBZVnh5WEc1Y2RDQXFMMXh5WEc1Y2RHZGxkRTVsZUhSUVlXZGxLQ0J5WlhObGRDQXBJSHRjY2x4dVhIUmNkSEpsZEhWeWJpQnVaWGNnVUhKdmJXbHpaU2dnS0NCeVpYTnZiSFpsSUNrZ1BUNGdleUJjY2x4dVhIUmNkRngwYzNWd1pYSXVaMlYwVG1WNGRGQmhaMlVvSUhKbGMyVjBJQ2t1ZEdobGJpZ2dLQ2tnUFQ0Z2UxeHlYRzVjZEZ4MFhIUmNkSFJvYVhNdVkyOXNiR1ZqZEdsdmJpNW1iM0pGWVdOb0tDQW9aWFowS1NBOVBpQjdYSEpjYmx4MFhIUmNkRngwWEhSc1pYUWdZMmhoY21sMGVVbGtJRDBnZEdocGN5NGtiVzlrWld3dWFXUTdYSEpjYmx4MFhIUmNkRngwWEhSbGRuUXVZMmhoY21sMGVVbGtJRDBnWTJoaGNtbDBlVWxrTzF4eVhHNWNkRngwWEhSY2RGeDBaWFowTG5CeVpYUjBlVk4wWVhKMFJHRjBaU0E5SUdkbGRGQnlaWFIwZVVSaGRHVlZWRU1vWlhaMExuTjBZWEowUkdGMFpTazdYSEpjYmx4MFhIUmNkRngwWEhSbGRuUXVjSEpsZEhSNVUzUmhjblJOYjI1MGFDQTlJR2RsZEZCeVpYUjBlVTF2Ym5Sb0tHVjJkQzV6ZEdGeWRFUmhkR1VwTzF4eVhHNWNkRngwWEhSY2RGeDBaWFowTG5CeVpYUjBlVk4wWVhKMFdXVmhjaUE5SUdkbGRGQnlaWFIwZVZsbFlYSlZWRU1vWlhaMExuTjBZWEowUkdGMFpTazdYSEpjYmx4MFhIUmNkRngwWEhSbGRuUXVaR0YwWlZScGJXVWdQU0JuWlhSRVlYUmxWR2x0WlNobGRuUXVjM1JoY25SRVlYUmxLVHRjY2x4dVhISmNibHgwWEhSY2RGeDBYSFIzY21sMFpVVjJaVzUwVlhKc0tHVjJkQ3dnSjJWMlpXNTBWWEpzSnl3Z1kyaGhjbWwwZVVsa0tUdGNjbHh1WEhSY2RGeDBYSFJjZEdWMmRDNWxkbVZ1ZEZWeWJDQXJQU0IzY21sMFpWVjBiVU52WkdVb1pYWjBMbVYyWlc1MFZYSnNMQ0I3WEhKY2JseDBYSFJjZEZ4MFhIUmNkSFYwYlY5dVlXMWxPaUFuUTJoaGNtbDBlVVYyWlc1MGMwSnZZWEprSnl3Z0x5OGdhbk5vYVc1MElHbG5ibTl5WlRwc2FXNWxYSEpjYmx4MFhIUmNkRngwWEhSY2RIVjBiVjlqYjI1MFpXNTBPaUJqYUdGeWFYUjVTV1FnTHk4Z2FuTm9hVzUwSUdsbmJtOXlaVHBzYVc1bFhISmNibHgwWEhSY2RGeDBYSFI5S1R0Y2NseHVYSFJjZEZ4MFhIUjlLVHRjY2x4dVhIUmNkRngwWEhSeVpYTnZiSFpsS0NrN1hISmNibHgwWEhSY2RIMHBPMXh5WEc1Y2RGeDBmU2s3WEhKY2JseDBmVnh5WEc1OVhISmNibHh5WEc1bGVIQnZjblFnWkdWbVlYVnNkQ0JOYjJSbGJFVjJaVzUwY3pzaVhYMD0iXX0=\n"]}